@gmod/bam 1.1.5 → 1.1.9

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 (74) hide show
  1. package/CHANGELOG.md +28 -2
  2. package/README.md +3 -3
  3. package/dist/bai.d.ts +2 -0
  4. package/dist/bai.js +300 -548
  5. package/dist/bai.js.map +1 -0
  6. package/dist/bamFile.d.ts +6 -13
  7. package/dist/bamFile.js +675 -1197
  8. package/dist/bamFile.js.map +1 -0
  9. package/dist/chunk.js +34 -69
  10. package/dist/chunk.js.map +1 -0
  11. package/dist/constants.js +27 -35
  12. package/dist/constants.js.map +1 -0
  13. package/dist/csi.js +317 -515
  14. package/dist/csi.js.map +1 -0
  15. package/dist/errors.js +64 -120
  16. package/dist/errors.js.map +1 -0
  17. package/dist/htsget.js +275 -396
  18. package/dist/htsget.js.map +1 -0
  19. package/dist/index.js +16 -54
  20. package/dist/index.js.map +1 -0
  21. package/dist/indexFile.d.ts +1 -2
  22. package/dist/indexFile.js +77 -163
  23. package/dist/indexFile.js.map +1 -0
  24. package/dist/record.d.ts +2 -0
  25. package/dist/record.js +496 -701
  26. package/dist/record.js.map +1 -0
  27. package/dist/sam.js +16 -49
  28. package/dist/sam.js.map +1 -0
  29. package/dist/util.d.ts +0 -1
  30. package/dist/util.js +115 -126
  31. package/dist/util.js.map +1 -0
  32. package/dist/virtualOffset.js +44 -77
  33. package/dist/virtualOffset.js.map +1 -0
  34. package/esm/bai.d.ts +26 -0
  35. package/esm/bai.js +191 -0
  36. package/esm/bai.js.map +1 -0
  37. package/esm/bamFile.d.ts +77 -0
  38. package/esm/bamFile.js +388 -0
  39. package/esm/bamFile.js.map +1 -0
  40. package/esm/chunk.d.ts +18 -0
  41. package/esm/chunk.js +33 -0
  42. package/esm/chunk.js.map +1 -0
  43. package/esm/constants.d.ts +15 -0
  44. package/esm/constants.js +27 -0
  45. package/esm/constants.js.map +1 -0
  46. package/esm/csi.d.ts +35 -0
  47. package/esm/csi.js +209 -0
  48. package/esm/csi.js.map +1 -0
  49. package/esm/errors.d.ts +23 -0
  50. package/esm/errors.js +24 -0
  51. package/esm/errors.js.map +1 -0
  52. package/esm/htsget.d.ts +33 -0
  53. package/esm/htsget.js +100 -0
  54. package/esm/htsget.js.map +1 -0
  55. package/esm/index.d.ts +6 -0
  56. package/esm/index.js +7 -0
  57. package/esm/index.js.map +1 -0
  58. package/esm/indexFile.d.ts +27 -0
  59. package/esm/indexFile.js +27 -0
  60. package/esm/indexFile.js.map +1 -0
  61. package/esm/record.d.ts +88 -0
  62. package/esm/record.js +534 -0
  63. package/esm/record.js.map +1 -0
  64. package/esm/sam.d.ts +7 -0
  65. package/esm/sam.js +16 -0
  66. package/esm/sam.js.map +1 -0
  67. package/esm/util.d.ts +35 -0
  68. package/esm/util.js +92 -0
  69. package/esm/util.js.map +1 -0
  70. package/esm/virtualOffset.d.ts +10 -0
  71. package/esm/virtualOffset.js +37 -0
  72. package/esm/virtualOffset.js.map +1 -0
  73. package/package.json +22 -30
  74. package/dist/declare.d.js +0 -2
package/dist/bamFile.js CHANGED
@@ -1,1217 +1,695 @@
1
1
  "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
4
-
5
- var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
6
-
7
- _Object$defineProperty(exports, "__esModule", {
8
- value: true
9
- });
10
-
11
- exports.default = exports.BAM_MAGIC = void 0;
12
-
13
- var _sort = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/sort"));
14
-
15
- var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));
16
-
17
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));
18
-
19
- var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));
20
-
21
- var _promise = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/promise"));
22
-
23
- var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));
24
-
25
- var _reduce = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/reduce"));
26
-
27
- var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
28
-
29
- var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs3/regenerator"));
30
-
31
- var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));
32
-
33
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator"));
34
-
35
- var _bind = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/bind"));
36
-
37
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));
38
-
39
- var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));
40
-
41
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
42
-
43
- var _wrapAsyncGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/wrapAsyncGenerator"));
44
-
45
- var _awaitAsyncGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/awaitAsyncGenerator"));
46
-
47
- var _asyncGeneratorDelegate2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncGeneratorDelegate"));
48
-
49
- var _asyncIterator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncIterator"));
50
-
51
- var _abortablePromiseCache = _interopRequireDefault(require("abortable-promise-cache"));
52
-
53
- var _bai = _interopRequireDefault(require("./bai"));
54
-
55
- var _csi = _interopRequireDefault(require("./csi"));
56
-
57
- var _bufferCrc = _interopRequireDefault(require("buffer-crc32"));
58
-
59
- var _bgzfFilehandle = require("@gmod/bgzf-filehandle");
60
-
61
- var _object = _interopRequireDefault(require("object.entries-ponyfill"));
62
-
63
- var _quickLru = _interopRequireDefault(require("quick-lru"));
64
-
65
- var _genericFilehandle = require("generic-filehandle");
66
-
67
- var _record = _interopRequireDefault(require("./record"));
68
-
69
- var _sam = require("./sam");
70
-
71
- var _util = require("./util");
72
-
73
- var BAM_MAGIC = 21840194;
74
- exports.BAM_MAGIC = BAM_MAGIC;
75
- var blockLen = 1 << 16;
76
-
77
- var BamFile = /*#__PURE__*/function () {
78
- /**
79
- * @param {object} args
80
- * @param {string} [args.bamPath]
81
- * @param {FileHandle} [args.bamFilehandle]
82
- * @param {string} [args.baiPath]
83
- * @param {FileHandle} [args.baiFilehandle]
84
- */
85
- function BamFile(_ref) {
86
- var _context;
87
-
88
- var bamFilehandle = _ref.bamFilehandle,
89
- bamPath = _ref.bamPath,
90
- bamUrl = _ref.bamUrl,
91
- baiPath = _ref.baiPath,
92
- baiFilehandle = _ref.baiFilehandle,
93
- baiUrl = _ref.baiUrl,
94
- csiPath = _ref.csiPath,
95
- csiFilehandle = _ref.csiFilehandle,
96
- csiUrl = _ref.csiUrl,
97
- cacheSize = _ref.cacheSize,
98
- fetchSizeLimit = _ref.fetchSizeLimit,
99
- chunkSizeLimit = _ref.chunkSizeLimit,
100
- _ref$renameRefSeqs = _ref.renameRefSeqs,
101
- renameRefSeqs = _ref$renameRefSeqs === void 0 ? function (n) {
102
- return n;
103
- } : _ref$renameRefSeqs;
104
- (0, _classCallCheck2.default)(this, BamFile);
105
- (0, _defineProperty2.default)(this, "renameRefSeq", void 0);
106
- (0, _defineProperty2.default)(this, "bam", void 0);
107
- (0, _defineProperty2.default)(this, "index", void 0);
108
- (0, _defineProperty2.default)(this, "chunkSizeLimit", void 0);
109
- (0, _defineProperty2.default)(this, "fetchSizeLimit", void 0);
110
- (0, _defineProperty2.default)(this, "header", void 0);
111
- (0, _defineProperty2.default)(this, "featureCache", void 0);
112
- (0, _defineProperty2.default)(this, "chrToIndex", void 0);
113
- (0, _defineProperty2.default)(this, "indexToChr", void 0);
114
- this.renameRefSeq = renameRefSeqs;
115
-
116
- if (bamFilehandle) {
117
- this.bam = bamFilehandle;
118
- } else if (bamPath) {
119
- this.bam = new _genericFilehandle.LocalFile(bamPath);
120
- } else if (bamUrl) {
121
- this.bam = new _genericFilehandle.RemoteFile(bamUrl);
122
- } else {
123
- throw new Error('unable to initialize bam');
124
- }
125
-
126
- if (csiFilehandle) {
127
- this.index = new _csi.default({
128
- filehandle: csiFilehandle
129
- });
130
- } else if (csiPath) {
131
- this.index = new _csi.default({
132
- filehandle: new _genericFilehandle.LocalFile(csiPath)
133
- });
134
- } else if (csiUrl) {
135
- this.index = new _csi.default({
136
- filehandle: new _genericFilehandle.RemoteFile(csiUrl)
137
- });
138
- } else if (baiFilehandle) {
139
- this.index = new _bai.default({
140
- filehandle: baiFilehandle
141
- });
142
- } else if (baiPath) {
143
- this.index = new _bai.default({
144
- filehandle: new _genericFilehandle.LocalFile(baiPath)
145
- });
146
- } else if (baiUrl) {
147
- this.index = new _bai.default({
148
- filehandle: new _genericFilehandle.RemoteFile(baiUrl)
149
- });
150
- } else if (bamPath) {
151
- this.index = new _bai.default({
152
- filehandle: new _genericFilehandle.LocalFile("".concat(bamPath, ".bai"))
153
- });
154
- } else if (bamUrl) {
155
- this.index = new _bai.default({
156
- filehandle: new _genericFilehandle.RemoteFile("".concat(bamUrl, ".bai"))
157
- });
158
- } else {
159
- throw new Error('unable to infer index format');
160
- }
161
-
162
- this.featureCache = new _abortablePromiseCache.default({
163
- cache: new _quickLru.default({
164
- maxSize: cacheSize !== undefined ? cacheSize : 50
165
- }),
166
- fill: (0, _bind.default)(_context = this._readChunk).call(_context, this)
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
167
9
  });
168
- this.fetchSizeLimit = fetchSizeLimit || 500000000; // 500MB
169
-
170
- this.chunkSizeLimit = chunkSizeLimit || 300000000; // 300MB
171
- }
172
-
173
- (0, _createClass2.default)(BamFile, [{
174
- key: "getHeader",
175
- value: function () {
176
- var _getHeader = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
177
- var origOpts,
178
- opts,
179
- indexData,
180
- ret,
181
- buffer,
182
- res,
183
- bytesRead,
184
- uncba,
185
- headLen,
186
- _yield$this$_readRefS,
187
- chrToIndex,
188
- indexToChr,
189
- _args = arguments;
190
-
191
- return _regenerator.default.wrap(function _callee$(_context2) {
192
- while (1) {
193
- switch (_context2.prev = _context2.next) {
194
- case 0:
195
- origOpts = _args.length > 0 && _args[0] !== undefined ? _args[0] : {};
196
- opts = (0, _util.makeOpts)(origOpts);
197
- _context2.next = 4;
198
- return this.index.parse(opts);
199
-
200
- case 4:
201
- indexData = _context2.sent;
202
- ret = indexData.firstDataLine ? indexData.firstDataLine.blockPosition + 65535 : undefined;
203
-
204
- if (!ret) {
205
- _context2.next = 17;
206
- break;
207
- }
208
-
209
- _context2.next = 9;
210
- return this.bam.read(Buffer.alloc(ret + blockLen), 0, ret + blockLen, 0, opts);
211
-
212
- case 9:
213
- res = _context2.sent;
214
- bytesRead = res.bytesRead;
215
- buffer = res.buffer;
216
-
217
- if (bytesRead) {
218
- _context2.next = 14;
219
- break;
220
- }
221
-
222
- throw new Error('Error reading header');
223
-
224
- case 14:
225
- if (bytesRead < ret) {
226
- buffer = (0, _slice.default)(buffer).call(buffer, 0, bytesRead);
227
- } else {
228
- buffer = (0, _slice.default)(buffer).call(buffer, 0, ret);
229
- }
230
-
231
- _context2.next = 20;
232
- break;
233
-
234
- case 17:
235
- _context2.next = 19;
236
- return this.bam.readFile(opts);
237
-
238
- case 19:
239
- buffer = _context2.sent;
240
-
241
- case 20:
242
- _context2.next = 22;
243
- return (0, _bgzfFilehandle.unzip)(buffer);
244
-
245
- case 22:
246
- uncba = _context2.sent;
247
-
248
- if (!(uncba.readInt32LE(0) !== BAM_MAGIC)) {
249
- _context2.next = 25;
250
- break;
251
- }
252
-
253
- throw new Error('Not a BAM file');
254
-
255
- case 25:
256
- headLen = uncba.readInt32LE(4);
257
- this.header = uncba.toString('utf8', 8, 8 + headLen);
258
- _context2.next = 29;
259
- return this._readRefSeqs(headLen + 8, 65535, opts);
260
-
261
- case 29:
262
- _yield$this$_readRefS = _context2.sent;
263
- chrToIndex = _yield$this$_readRefS.chrToIndex;
264
- indexToChr = _yield$this$_readRefS.indexToChr;
265
- this.chrToIndex = chrToIndex;
266
- this.indexToChr = indexToChr;
267
- return _context2.abrupt("return", (0, _sam.parseHeaderText)(this.header));
268
-
269
- case 35:
270
- case "end":
271
- return _context2.stop();
272
- }
273
- }
274
- }, _callee, this);
275
- }));
276
-
277
- function getHeader() {
278
- return _getHeader.apply(this, arguments);
279
- }
280
-
281
- return getHeader;
282
- }()
283
- }, {
284
- key: "getHeaderText",
285
- value: function () {
286
- var _getHeaderText = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
287
- var opts,
288
- _args2 = arguments;
289
- return _regenerator.default.wrap(function _callee2$(_context3) {
290
- while (1) {
291
- switch (_context3.prev = _context3.next) {
292
- case 0:
293
- opts = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : {};
294
- _context3.next = 3;
295
- return this.getHeader(opts);
296
-
297
- case 3:
298
- return _context3.abrupt("return", this.header);
299
-
300
- case 4:
301
- case "end":
302
- return _context3.stop();
303
- }
304
- }
305
- }, _callee2, this);
306
- }));
307
-
308
- function getHeaderText() {
309
- return _getHeaderText.apply(this, arguments);
310
- }
311
-
312
- return getHeaderText;
313
- }() // the full length of the refseq block is not given in advance so this grabs a chunk and
314
- // doubles it if all refseqs haven't been processed
315
-
316
- }, {
317
- key: "_readRefSeqs",
318
- value: function () {
319
- var _readRefSeqs2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(start, refSeqBytes) {
320
- var opts,
321
- res,
322
- bytesRead,
323
- buffer,
324
- uncba,
325
- nRef,
326
- p,
327
- chrToIndex,
328
- indexToChr,
329
- i,
330
- lName,
331
- refName,
332
- lRef,
333
- _args3 = arguments;
334
- return _regenerator.default.wrap(function _callee3$(_context4) {
335
- while (1) {
336
- switch (_context4.prev = _context4.next) {
337
- case 0:
338
- opts = _args3.length > 2 && _args3[2] !== undefined ? _args3[2] : {};
339
-
340
- if (!(start > refSeqBytes)) {
341
- _context4.next = 3;
342
- break;
343
- }
344
-
345
- return _context4.abrupt("return", this._readRefSeqs(start, refSeqBytes * 2, opts));
346
-
347
- case 3:
348
- _context4.next = 5;
349
- return this.bam.read(Buffer.alloc(refSeqBytes + blockLen), 0, refSeqBytes, 0, opts);
350
-
351
- case 5:
352
- res = _context4.sent;
353
- bytesRead = res.bytesRead;
354
- buffer = res.buffer;
355
-
356
- if (bytesRead) {
357
- _context4.next = 10;
358
- break;
359
- }
360
-
361
- throw new Error('Error reading refseqs from header');
362
-
363
- case 10:
364
- if (bytesRead < refSeqBytes) {
365
- buffer = (0, _slice.default)(buffer).call(buffer, 0, bytesRead);
366
- } else {
367
- buffer = (0, _slice.default)(buffer).call(buffer, 0, refSeqBytes);
368
- }
369
-
370
- _context4.next = 13;
371
- return (0, _bgzfFilehandle.unzip)(buffer);
372
-
373
- case 13:
374
- uncba = _context4.sent;
375
- nRef = uncba.readInt32LE(start);
376
- p = start + 4;
377
- chrToIndex = {};
378
- indexToChr = [];
379
- i = 0;
380
-
381
- case 19:
382
- if (!(i < nRef)) {
383
- _context4.next = 35;
384
- break;
385
- }
386
-
387
- _context4.next = 22;
388
- return (0, _util.abortBreakPoint)(opts.signal);
389
-
390
- case 22:
391
- lName = uncba.readInt32LE(p);
392
- refName = uncba.toString('utf8', p + 4, p + 4 + lName - 1);
393
- refName = this.renameRefSeq(refName);
394
- lRef = uncba.readInt32LE(p + lName + 4);
395
- chrToIndex[refName] = i;
396
- indexToChr.push({
397
- refName: refName,
398
- length: lRef
399
- });
400
- p = p + 8 + lName;
401
-
402
- if (!(p > uncba.length)) {
403
- _context4.next = 32;
404
- break;
405
- }
406
-
407
- console.warn("BAM header is very big. Re-fetching ".concat(refSeqBytes, " bytes."));
408
- return _context4.abrupt("return", this._readRefSeqs(start, refSeqBytes * 2, opts));
409
-
410
- case 32:
411
- i += 1;
412
- _context4.next = 19;
413
- break;
414
-
415
- case 35:
416
- return _context4.abrupt("return", {
417
- chrToIndex: chrToIndex,
418
- indexToChr: indexToChr
419
- });
420
-
421
- case 36:
422
- case "end":
423
- return _context4.stop();
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
424
32
  }
425
- }
426
- }, _callee3, this);
427
- }));
428
-
429
- function _readRefSeqs(_x, _x2) {
430
- return _readRefSeqs2.apply(this, arguments);
431
- }
432
-
433
- return _readRefSeqs;
434
- }()
435
- }, {
436
- key: "getRecordsForRange",
437
- value: function () {
438
- var _getRecordsForRange = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(chr, min, max) {
439
- var opts,
440
- records,
441
- _iteratorNormalCompletion,
442
- _didIteratorError,
443
- _iteratorError,
444
- _iterator,
445
- _step,
446
- _value,
447
- chunk,
448
- _args4 = arguments;
449
-
450
- return _regenerator.default.wrap(function _callee4$(_context5) {
451
- while (1) {
452
- switch (_context5.prev = _context5.next) {
453
- case 0:
454
- opts = _args4.length > 3 && _args4[3] !== undefined ? _args4[3] : {
455
- viewAsPairs: false,
456
- pairAcrossChr: false,
457
- maxInsertSize: 200000
458
- };
459
- records = [];
460
- _iteratorNormalCompletion = true;
461
- _didIteratorError = false;
462
- _context5.prev = 4;
463
- _iterator = (0, _asyncIterator2.default)(this.streamRecordsForRange(chr, min, max, opts));
464
-
465
- case 6:
466
- _context5.next = 8;
467
- return _iterator.next();
468
-
469
- case 8:
470
- _step = _context5.sent;
471
- _iteratorNormalCompletion = _step.done;
472
- _context5.next = 12;
473
- return _step.value;
474
-
475
- case 12:
476
- _value = _context5.sent;
477
-
478
- if (_iteratorNormalCompletion) {
479
- _context5.next = 19;
480
- break;
481
- }
482
-
483
- chunk = _value;
484
- records = (0, _concat.default)(records).call(records, chunk);
485
-
486
- case 16:
487
- _iteratorNormalCompletion = true;
488
- _context5.next = 6;
489
- break;
490
-
491
- case 19:
492
- _context5.next = 25;
493
- break;
494
-
495
- case 21:
496
- _context5.prev = 21;
497
- _context5.t0 = _context5["catch"](4);
498
- _didIteratorError = true;
499
- _iteratorError = _context5.t0;
500
-
501
- case 25:
502
- _context5.prev = 25;
503
- _context5.prev = 26;
504
-
505
- if (!(!_iteratorNormalCompletion && _iterator.return != null)) {
506
- _context5.next = 30;
507
- break;
508
- }
509
-
510
- _context5.next = 30;
511
- return _iterator.return();
512
-
513
- case 30:
514
- _context5.prev = 30;
515
-
516
- if (!_didIteratorError) {
517
- _context5.next = 33;
518
- break;
519
- }
520
-
521
- throw _iteratorError;
522
-
523
- case 33:
524
- return _context5.finish(30);
525
-
526
- case 34:
527
- return _context5.finish(25);
528
-
529
- case 35:
530
- return _context5.abrupt("return", records);
531
-
532
- case 36:
533
- case "end":
534
- return _context5.stop();
535
- }
536
- }
537
- }, _callee4, this, [[4, 21, 25, 35], [26,, 30, 34]]);
538
- }));
539
-
540
- function getRecordsForRange(_x3, _x4, _x5) {
541
- return _getRecordsForRange.apply(this, arguments);
542
- }
543
-
544
- return getRecordsForRange;
545
- }()
546
- }, {
547
- key: "streamRecordsForRange",
548
- value: function streamRecordsForRange(chr, min, max) {
549
- var _this = this;
550
-
551
- var opts = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {
552
- viewAsPairs: false,
553
- pairAcrossChr: false,
554
- maxInsertSize: 200000
555
- };
556
- return (0, _wrapAsyncGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5() {
557
- var _context7;
558
-
559
- var chrId, chunks, i, size, _context6, totalSize, _context8;
560
-
561
- return _regenerator.default.wrap(function _callee5$(_context9) {
562
- while (1) {
563
- switch (_context9.prev = _context9.next) {
564
- case 0:
565
- // todo regularize refseq names
566
- opts.viewAsPairs = opts.viewAsPairs || false;
567
- opts.pairAcrossChr = opts.pairAcrossChr || false;
568
- opts.maxInsertSize = opts.maxInsertSize !== undefined ? opts.maxInsertSize : 200000;
569
- chrId = _this.chrToIndex && _this.chrToIndex[chr];
570
-
571
- if (chrId >= 0) {
572
- _context9.next = 8;
573
- break;
574
- }
575
-
576
- chunks = [];
577
- _context9.next = 13;
578
- break;
579
-
580
- case 8:
581
- _context9.next = 10;
582
- return (0, _awaitAsyncGenerator2.default)(_this.index.blocksForRange(chrId, min - 1, max, opts));
583
-
584
- case 10:
585
- chunks = _context9.sent;
586
-
587
- if (chunks) {
588
- _context9.next = 13;
589
- break;
590
- }
591
-
592
- throw new Error('Error in index fetch');
593
-
594
- case 13:
595
- i = 0;
596
-
597
- case 14:
598
- if (!(i < chunks.length)) {
599
- _context9.next = 23;
600
- break;
601
- }
602
-
603
- _context9.next = 17;
604
- return (0, _awaitAsyncGenerator2.default)((0, _util.abortBreakPoint)(opts.signal));
605
-
606
- case 17:
607
- size = chunks[i].fetchedSize();
608
-
609
- if (!(size > _this.chunkSizeLimit)) {
610
- _context9.next = 20;
611
- break;
612
- }
613
-
614
- throw new Error((0, _concat.default)(_context6 = "Too many BAM features. BAM chunk size ".concat(size, " bytes exceeds chunkSizeLimit of ")).call(_context6, _this.chunkSizeLimit));
615
-
616
- case 20:
617
- i += 1;
618
- _context9.next = 14;
619
- break;
620
-
621
- case 23:
622
- totalSize = (0, _reduce.default)(_context7 = (0, _map.default)(chunks).call(chunks, function (s) {
623
- return s.fetchedSize();
624
- })).call(_context7, function (a, b) {
625
- return a + b;
626
- }, 0);
627
-
628
- if (!(totalSize > _this.fetchSizeLimit)) {
629
- _context9.next = 26;
630
- break;
631
- }
632
-
633
- throw new Error((0, _concat.default)(_context8 = "data size of ".concat(totalSize.toLocaleString(), " bytes exceeded fetch size limit of ")).call(_context8, _this.fetchSizeLimit.toLocaleString(), " bytes"));
634
-
635
- case 26:
636
- return _context9.delegateYield((0, _asyncGeneratorDelegate2.default)((0, _asyncIterator2.default)(_this._fetchChunkFeatures(chunks, chrId, min, max, opts)), _awaitAsyncGenerator2.default), "t0", 27);
637
-
638
- case 27:
639
- case "end":
640
- return _context9.stop();
641
- }
642
- }
643
- }, _callee5);
644
- }))();
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __asyncValues = (this && this.__asyncValues) || function (o) {
39
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
40
+ var m = o[Symbol.asyncIterator], i;
41
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
42
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
43
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
44
+ };
45
+ var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
46
+ var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
47
+ var i, p;
48
+ return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
49
+ function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
50
+ };
51
+ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
52
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
53
+ var g = generator.apply(thisArg, _arguments || []), i, q = [];
54
+ return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
55
+ function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
56
+ function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
57
+ function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
58
+ function fulfill(value) { resume("next", value); }
59
+ function reject(value) { resume("throw", value); }
60
+ function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
61
+ };
62
+ var __values = (this && this.__values) || function(o) {
63
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
64
+ if (m) return m.call(o);
65
+ if (o && typeof o.length === "number") return {
66
+ next: function () {
67
+ if (o && i >= o.length) o = void 0;
68
+ return { value: o && o[i++], done: !o };
69
+ }
70
+ };
71
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
72
+ };
73
+ var __importDefault = (this && this.__importDefault) || function (mod) {
74
+ return (mod && mod.__esModule) ? mod : { "default": mod };
75
+ };
76
+ Object.defineProperty(exports, "__esModule", { value: true });
77
+ exports.BAM_MAGIC = void 0;
78
+ var bai_1 = __importDefault(require("./bai"));
79
+ var csi_1 = __importDefault(require("./csi"));
80
+ var buffer_crc32_1 = __importDefault(require("buffer-crc32"));
81
+ var bgzf_filehandle_1 = require("@gmod/bgzf-filehandle");
82
+ var object_entries_ponyfill_1 = __importDefault(require("object.entries-ponyfill"));
83
+ var generic_filehandle_1 = require("generic-filehandle");
84
+ var record_1 = __importDefault(require("./record"));
85
+ var sam_1 = require("./sam");
86
+ var util_1 = require("./util");
87
+ exports.BAM_MAGIC = 21840194;
88
+ var blockLen = 1 << 16;
89
+ var BamFile = /** @class */ (function () {
90
+ /**
91
+ * @param {object} args
92
+ * @param {string} [args.bamPath]
93
+ * @param {FileHandle} [args.bamFilehandle]
94
+ * @param {string} [args.baiPath]
95
+ * @param {FileHandle} [args.baiFilehandle]
96
+ */
97
+ function BamFile(_a) {
98
+ var bamFilehandle = _a.bamFilehandle, bamPath = _a.bamPath, bamUrl = _a.bamUrl, baiPath = _a.baiPath, baiFilehandle = _a.baiFilehandle, baiUrl = _a.baiUrl, csiPath = _a.csiPath, csiFilehandle = _a.csiFilehandle, csiUrl = _a.csiUrl, fetchSizeLimit = _a.fetchSizeLimit, chunkSizeLimit = _a.chunkSizeLimit, _b = _a.yieldThreadTime, yieldThreadTime = _b === void 0 ? 100 : _b, _c = _a.renameRefSeqs, renameRefSeqs = _c === void 0 ? function (n) { return n; } : _c;
99
+ this.renameRefSeq = renameRefSeqs;
100
+ if (bamFilehandle) {
101
+ this.bam = bamFilehandle;
102
+ }
103
+ else if (bamPath) {
104
+ this.bam = new generic_filehandle_1.LocalFile(bamPath);
105
+ }
106
+ else if (bamUrl) {
107
+ this.bam = new generic_filehandle_1.RemoteFile(bamUrl);
108
+ }
109
+ else {
110
+ throw new Error('unable to initialize bam');
111
+ }
112
+ if (csiFilehandle) {
113
+ this.index = new csi_1.default({ filehandle: csiFilehandle });
114
+ }
115
+ else if (csiPath) {
116
+ this.index = new csi_1.default({ filehandle: new generic_filehandle_1.LocalFile(csiPath) });
117
+ }
118
+ else if (csiUrl) {
119
+ this.index = new csi_1.default({ filehandle: new generic_filehandle_1.RemoteFile(csiUrl) });
120
+ }
121
+ else if (baiFilehandle) {
122
+ this.index = new bai_1.default({ filehandle: baiFilehandle });
123
+ }
124
+ else if (baiPath) {
125
+ this.index = new bai_1.default({ filehandle: new generic_filehandle_1.LocalFile(baiPath) });
126
+ }
127
+ else if (baiUrl) {
128
+ this.index = new bai_1.default({ filehandle: new generic_filehandle_1.RemoteFile(baiUrl) });
129
+ }
130
+ else if (bamPath) {
131
+ this.index = new bai_1.default({ filehandle: new generic_filehandle_1.LocalFile("".concat(bamPath, ".bai")) });
132
+ }
133
+ else if (bamUrl) {
134
+ this.index = new bai_1.default({ filehandle: new generic_filehandle_1.RemoteFile("".concat(bamUrl, ".bai")) });
135
+ }
136
+ else {
137
+ throw new Error('unable to infer index format');
138
+ }
139
+ this.fetchSizeLimit = fetchSizeLimit || 500000000; // 500MB
140
+ this.chunkSizeLimit = chunkSizeLimit || 300000000; // 300MB
141
+ this.yieldThreadTime = yieldThreadTime;
645
142
  }
646
- }, {
647
- key: "_fetchChunkFeatures",
648
- value: function _fetchChunkFeatures(chunks, chrId, min, max, opts) {
649
- var _this2 = this;
650
-
651
- return (0, _wrapAsyncGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee6() {
652
- var featPromises, done, i, c, _yield$_awaitAsyncGen, data, cpositions, dpositions, chunk, promise, _i2;
653
-
654
- return _regenerator.default.wrap(function _callee6$(_context10) {
655
- while (1) {
656
- switch (_context10.prev = _context10.next) {
657
- case 0:
658
- featPromises = [];
659
- done = false;
660
- i = 0;
661
-
662
- case 3:
663
- if (!(i < chunks.length)) {
664
- _context10.next = 21;
665
- break;
143
+ BamFile.prototype.getHeader = function (origOpts) {
144
+ if (origOpts === void 0) { origOpts = {}; }
145
+ return __awaiter(this, void 0, void 0, function () {
146
+ var opts, indexData, ret, buffer, res, bytesRead, uncba, headLen, _a, chrToIndex, indexToChr;
147
+ return __generator(this, function (_b) {
148
+ switch (_b.label) {
149
+ case 0:
150
+ opts = (0, util_1.makeOpts)(origOpts);
151
+ return [4 /*yield*/, this.index.parse(opts)];
152
+ case 1:
153
+ indexData = _b.sent();
154
+ ret = indexData.firstDataLine
155
+ ? indexData.firstDataLine.blockPosition + 65535
156
+ : undefined;
157
+ if (!ret) return [3 /*break*/, 3];
158
+ return [4 /*yield*/, this.bam.read(Buffer.alloc(ret + blockLen), 0, ret + blockLen, 0, opts)];
159
+ case 2:
160
+ res = _b.sent();
161
+ bytesRead = res.bytesRead;
162
+ (buffer = res.buffer);
163
+ if (!bytesRead) {
164
+ throw new Error('Error reading header');
165
+ }
166
+ if (bytesRead < ret) {
167
+ buffer = buffer.slice(0, bytesRead);
168
+ }
169
+ else {
170
+ buffer = buffer.slice(0, ret);
171
+ }
172
+ return [3 /*break*/, 5];
173
+ case 3: return [4 /*yield*/, this.bam.readFile(opts)];
174
+ case 4:
175
+ buffer = (_b.sent());
176
+ _b.label = 5;
177
+ case 5: return [4 /*yield*/, (0, bgzf_filehandle_1.unzip)(buffer)];
178
+ case 6:
179
+ uncba = _b.sent();
180
+ if (uncba.readInt32LE(0) !== exports.BAM_MAGIC) {
181
+ throw new Error('Not a BAM file');
182
+ }
183
+ headLen = uncba.readInt32LE(4);
184
+ this.header = uncba.toString('utf8', 8, 8 + headLen);
185
+ return [4 /*yield*/, this._readRefSeqs(headLen + 8, 65535, opts)];
186
+ case 7:
187
+ _a = _b.sent(), chrToIndex = _a.chrToIndex, indexToChr = _a.indexToChr;
188
+ this.chrToIndex = chrToIndex;
189
+ this.indexToChr = indexToChr;
190
+ return [2 /*return*/, (0, sam_1.parseHeaderText)(this.header)];
666
191
  }
667
-
668
- c = chunks[i];
669
- _context10.next = 7;
670
- return (0, _awaitAsyncGenerator2.default)(_this2.featureCache.get(c.toString(), {
671
- chunk: c,
672
- opts: opts
673
- }, opts.signal));
674
-
675
- case 7:
676
- _yield$_awaitAsyncGen = _context10.sent;
677
- data = _yield$_awaitAsyncGen.data;
678
- cpositions = _yield$_awaitAsyncGen.cpositions;
679
- dpositions = _yield$_awaitAsyncGen.dpositions;
680
- chunk = _yield$_awaitAsyncGen.chunk;
681
- promise = _this2.readBamFeatures(data, cpositions, dpositions, chunk).then(function (records) {
682
- var recs = [];
683
-
684
- for (var _i = 0; _i < records.length; _i += 1) {
685
- var feature = records[_i];
686
-
687
- if (feature.seq_id() === chrId) {
688
- if (feature.get('start') >= max) {
689
- // past end of range, can stop iterating
690
- done = true;
691
- break;
692
- } else if (feature.get('end') >= min) {
693
- // must be in range
694
- recs.push(feature);
695
- }
696
- }
697
- }
698
-
699
- return recs;
700
- });
701
- featPromises.push(promise);
702
- _context10.next = 16;
703
- return (0, _awaitAsyncGenerator2.default)(promise);
704
-
705
- case 16:
706
- if (!done) {
707
- _context10.next = 18;
708
- break;
192
+ });
193
+ });
194
+ };
195
+ BamFile.prototype.getHeaderText = function (opts) {
196
+ if (opts === void 0) { opts = {}; }
197
+ return __awaiter(this, void 0, void 0, function () {
198
+ return __generator(this, function (_a) {
199
+ switch (_a.label) {
200
+ case 0: return [4 /*yield*/, this.getHeader(opts)];
201
+ case 1:
202
+ _a.sent();
203
+ return [2 /*return*/, this.header];
709
204
  }
710
-
711
- return _context10.abrupt("break", 21);
712
-
713
- case 18:
714
- i++;
715
- _context10.next = 3;
716
- break;
717
-
718
- case 21:
719
- (0, _util.checkAbortSignal)(opts.signal);
720
- _i2 = 0;
721
-
722
- case 23:
723
- if (!(_i2 < featPromises.length)) {
724
- _context10.next = 29;
725
- break;
205
+ });
206
+ });
207
+ };
208
+ // the full length of the refseq block is not given in advance so this grabs a chunk and
209
+ // doubles it if all refseqs haven't been processed
210
+ BamFile.prototype._readRefSeqs = function (start, refSeqBytes, opts) {
211
+ if (opts === void 0) { opts = {}; }
212
+ return __awaiter(this, void 0, void 0, function () {
213
+ var res, bytesRead, buffer, uncba, nRef, p, chrToIndex, indexToChr, i, lName, refName, lRef;
214
+ return __generator(this, function (_a) {
215
+ switch (_a.label) {
216
+ case 0:
217
+ if (start > refSeqBytes) {
218
+ return [2 /*return*/, this._readRefSeqs(start, refSeqBytes * 2, opts)];
219
+ }
220
+ return [4 /*yield*/, this.bam.read(Buffer.alloc(refSeqBytes + blockLen), 0, refSeqBytes, 0, opts)];
221
+ case 1:
222
+ res = _a.sent();
223
+ bytesRead = res.bytesRead;
224
+ buffer = res.buffer;
225
+ if (!bytesRead) {
226
+ throw new Error('Error reading refseqs from header');
227
+ }
228
+ if (bytesRead < refSeqBytes) {
229
+ buffer = buffer.slice(0, bytesRead);
230
+ }
231
+ else {
232
+ buffer = buffer.slice(0, refSeqBytes);
233
+ }
234
+ return [4 /*yield*/, (0, bgzf_filehandle_1.unzip)(buffer)];
235
+ case 2:
236
+ uncba = _a.sent();
237
+ nRef = uncba.readInt32LE(start);
238
+ p = start + 4;
239
+ chrToIndex = {};
240
+ indexToChr = [];
241
+ i = 0;
242
+ _a.label = 3;
243
+ case 3:
244
+ if (!(i < nRef)) return [3 /*break*/, 6];
245
+ return [4 /*yield*/, (0, util_1.abortBreakPoint)(opts.signal)];
246
+ case 4:
247
+ _a.sent();
248
+ lName = uncba.readInt32LE(p);
249
+ refName = this.renameRefSeq(uncba.toString('utf8', p + 4, p + 4 + lName - 1));
250
+ lRef = uncba.readInt32LE(p + lName + 4);
251
+ chrToIndex[refName] = i;
252
+ indexToChr.push({ refName: refName, length: lRef });
253
+ p = p + 8 + lName;
254
+ if (p > uncba.length) {
255
+ console.warn("BAM header is very big. Re-fetching ".concat(refSeqBytes, " bytes."));
256
+ return [2 /*return*/, this._readRefSeqs(start, refSeqBytes * 2, opts)];
257
+ }
258
+ _a.label = 5;
259
+ case 5:
260
+ i += 1;
261
+ return [3 /*break*/, 3];
262
+ case 6: return [2 /*return*/, { chrToIndex: chrToIndex, indexToChr: indexToChr }];
726
263
  }
727
-
728
- _context10.next = 26;
729
- return featPromises[_i2];
730
-
731
- case 26:
732
- _i2++;
733
- _context10.next = 23;
734
- break;
735
-
736
- case 29:
737
- (0, _util.checkAbortSignal)(opts.signal);
738
-
739
- if (!opts.viewAsPairs) {
740
- _context10.next = 33;
741
- break;
264
+ });
265
+ });
266
+ };
267
+ BamFile.prototype.getRecordsForRange = function (chr, min, max, opts) {
268
+ var e_1, _a;
269
+ if (opts === void 0) { opts = {
270
+ viewAsPairs: false,
271
+ pairAcrossChr: false,
272
+ maxInsertSize: 200000,
273
+ }; }
274
+ return __awaiter(this, void 0, void 0, function () {
275
+ var records, _b, _c, chunk, e_1_1;
276
+ return __generator(this, function (_d) {
277
+ switch (_d.label) {
278
+ case 0:
279
+ records = [];
280
+ _d.label = 1;
281
+ case 1:
282
+ _d.trys.push([1, 6, 7, 12]);
283
+ _b = __asyncValues(this.streamRecordsForRange(chr, min, max, opts));
284
+ _d.label = 2;
285
+ case 2: return [4 /*yield*/, _b.next()];
286
+ case 3:
287
+ if (!(_c = _d.sent(), !_c.done)) return [3 /*break*/, 5];
288
+ chunk = _c.value;
289
+ records = records.concat(chunk);
290
+ _d.label = 4;
291
+ case 4: return [3 /*break*/, 2];
292
+ case 5: return [3 /*break*/, 12];
293
+ case 6:
294
+ e_1_1 = _d.sent();
295
+ e_1 = { error: e_1_1 };
296
+ return [3 /*break*/, 12];
297
+ case 7:
298
+ _d.trys.push([7, , 10, 11]);
299
+ if (!(_c && !_c.done && (_a = _b.return))) return [3 /*break*/, 9];
300
+ return [4 /*yield*/, _a.call(_b)];
301
+ case 8:
302
+ _d.sent();
303
+ _d.label = 9;
304
+ case 9: return [3 /*break*/, 11];
305
+ case 10:
306
+ if (e_1) throw e_1.error;
307
+ return [7 /*endfinally*/];
308
+ case 11: return [7 /*endfinally*/];
309
+ case 12: return [2 /*return*/, records];
742
310
  }
743
-
744
- _context10.next = 33;
745
- return _this2.fetchPairs(chrId, featPromises, opts);
746
-
747
- case 33:
748
- case "end":
749
- return _context10.stop();
750
- }
751
- }
752
- }, _callee6);
753
- }))();
754
- }
755
- }, {
756
- key: "fetchPairs",
757
- value: function () {
758
- var _fetchPairs = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee10(chrId, featPromises, opts) {
759
- var _this3 = this,
760
- _context14,
761
- _context15;
762
-
763
- var unmatedPairs, readIds, matePromises, mateBlocks, mateChunks, i, mateTotalSize, _context16, mateFeatPromises, newMateFeats, featuresRet, newMates;
764
-
765
- return _regenerator.default.wrap(function _callee10$(_context18) {
766
- while (1) {
767
- switch (_context18.prev = _context18.next) {
768
- case 0:
769
- unmatedPairs = {};
770
- readIds = {};
771
- _context18.next = 4;
772
- return _promise.default.all((0, _map.default)(featPromises).call(featPromises, /*#__PURE__*/function () {
773
- var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee7(f) {
774
- var _context11;
775
-
776
- var ret, readNames, i, name, id;
777
- return _regenerator.default.wrap(function _callee7$(_context12) {
778
- while (1) {
779
- switch (_context12.prev = _context12.next) {
780
- case 0:
781
- _context12.next = 2;
782
- return f;
783
-
784
- case 2:
785
- ret = _context12.sent;
786
- readNames = {};
787
-
788
- for (i = 0; i < ret.length; i++) {
789
- name = ret[i].name();
790
- id = ret[i].id();
791
-
792
- if (!readNames[name]) {
793
- readNames[name] = 0;
794
- }
795
-
796
- readNames[name]++;
797
- readIds[id] = 1;
798
- }
799
-
800
- (0, _forEach.default)(_context11 = (0, _object.default)(readNames)).call(_context11, function (_ref3) {
801
- var _ref4 = (0, _slicedToArray2.default)(_ref3, 2),
802
- k = _ref4[0],
803
- v = _ref4[1];
804
-
805
- if (v === 1) {
806
- unmatedPairs[k] = true;
807
- }
808
- });
809
-
810
- case 6:
811
- case "end":
812
- return _context12.stop();
311
+ });
312
+ });
313
+ };
314
+ BamFile.prototype.streamRecordsForRange = function (chr, min, max, opts) {
315
+ if (opts === void 0) { opts = {
316
+ viewAsPairs: false,
317
+ pairAcrossChr: false,
318
+ maxInsertSize: 200000,
319
+ }; }
320
+ return __asyncGenerator(this, arguments, function streamRecordsForRange_1() {
321
+ var chrId, chunks, i, size, totalSize;
322
+ return __generator(this, function (_a) {
323
+ switch (_a.label) {
324
+ case 0:
325
+ // todo regularize refseq names
326
+ opts.viewAsPairs = opts.viewAsPairs || false;
327
+ opts.pairAcrossChr = opts.pairAcrossChr || false;
328
+ opts.maxInsertSize =
329
+ opts.maxInsertSize !== undefined ? opts.maxInsertSize : 200000;
330
+ chrId = this.chrToIndex && this.chrToIndex[chr];
331
+ if (!!(chrId >= 0)) return [3 /*break*/, 1];
332
+ chunks = [];
333
+ return [3 /*break*/, 3];
334
+ case 1: return [4 /*yield*/, __await(this.index.blocksForRange(chrId, min - 1, max, opts))];
335
+ case 2:
336
+ chunks = _a.sent();
337
+ if (!chunks) {
338
+ throw new Error('Error in index fetch');
813
339
  }
814
- }
815
- }, _callee7);
816
- }));
817
-
818
- return function (_x9) {
819
- return _ref2.apply(this, arguments);
820
- };
821
- }()));
822
-
823
- case 4:
824
- matePromises = [];
825
- _context18.next = 7;
826
- return _promise.default.all((0, _map.default)(featPromises).call(featPromises, /*#__PURE__*/function () {
827
- var _ref5 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee8(f) {
828
- var ret, i, name;
829
- return _regenerator.default.wrap(function _callee8$(_context13) {
830
- while (1) {
831
- switch (_context13.prev = _context13.next) {
832
- case 0:
833
- _context13.next = 2;
834
- return f;
835
-
836
- case 2:
837
- ret = _context13.sent;
838
-
839
- for (i = 0; i < ret.length; i++) {
840
- name = ret[i].name();
841
-
842
- if (unmatedPairs[name] && (opts.pairAcrossChr || ret[i]._next_refid() === chrId && Math.abs(ret[i].get('start') - ret[i]._next_pos()) < (opts.maxInsertSize || 200000))) {
843
- matePromises.push(_this3.index.blocksForRange(ret[i]._next_refid(), ret[i]._next_pos(), ret[i]._next_pos() + 1, opts));
844
- }
845
- }
846
-
847
- case 4:
848
- case "end":
849
- return _context13.stop();
340
+ _a.label = 3;
341
+ case 3:
342
+ i = 0;
343
+ _a.label = 4;
344
+ case 4:
345
+ if (!(i < chunks.length)) return [3 /*break*/, 7];
346
+ return [4 /*yield*/, __await((0, util_1.abortBreakPoint)(opts.signal))];
347
+ case 5:
348
+ _a.sent();
349
+ size = chunks[i].fetchedSize();
350
+ if (size > this.chunkSizeLimit) {
351
+ throw new Error("Too many BAM features. BAM chunk size ".concat(size, " bytes exceeds chunkSizeLimit of ").concat(this.chunkSizeLimit));
850
352
  }
851
- }
852
- }, _callee8);
853
- }));
854
-
855
- return function (_x10) {
856
- return _ref5.apply(this, arguments);
857
- };
858
- }()));
859
-
860
- case 7:
861
- _context18.next = 9;
862
- return _promise.default.all(matePromises);
863
-
864
- case 9:
865
- mateBlocks = _context18.sent;
866
- mateChunks = [];
867
-
868
- for (i = 0; i < mateBlocks.length; i++) {
869
- mateChunks = (0, _concat.default)(mateChunks).call(mateChunks, mateBlocks[i]);
870
- } // filter out duplicate chunks (the blocks are lists of chunks, blocks are concatenated, then filter dup chunks)
871
-
872
-
873
- mateChunks = (0, _filter.default)(_context14 = (0, _sort.default)(mateChunks).call(mateChunks)).call(_context14, function (item, pos, ary) {
874
- return !pos || item.toString() !== ary[pos - 1].toString();
875
- });
876
- mateTotalSize = (0, _reduce.default)(_context15 = (0, _map.default)(mateChunks).call(mateChunks, function (s) {
877
- return s.fetchedSize();
878
- })).call(_context15, function (a, b) {
879
- return a + b;
880
- }, 0);
881
-
882
- if (!(mateTotalSize > this.fetchSizeLimit)) {
883
- _context18.next = 16;
884
- break;
353
+ _a.label = 6;
354
+ case 6:
355
+ i += 1;
356
+ return [3 /*break*/, 4];
357
+ case 7:
358
+ totalSize = chunks
359
+ .map(function (s) { return s.fetchedSize(); })
360
+ .reduce(function (a, b) { return a + b; }, 0);
361
+ if (totalSize > this.fetchSizeLimit) {
362
+ throw new Error("data size of ".concat(totalSize.toLocaleString(), " bytes exceeded fetch size limit of ").concat(this.fetchSizeLimit.toLocaleString(), " bytes"));
363
+ }
364
+ return [5 /*yield**/, __values(__asyncDelegator(__asyncValues(this._fetchChunkFeatures(chunks, chrId, min, max, opts))))];
365
+ case 8: return [4 /*yield*/, __await.apply(void 0, [_a.sent()])];
366
+ case 9:
367
+ _a.sent();
368
+ return [2 /*return*/];
885
369
  }
886
-
887
- throw new Error((0, _concat.default)(_context16 = "data size of ".concat(mateTotalSize.toLocaleString(), " bytes exceeded fetch size limit of ")).call(_context16, this.fetchSizeLimit.toLocaleString(), " bytes"));
888
-
889
- case 16:
890
- mateFeatPromises = (0, _map.default)(mateChunks).call(mateChunks, /*#__PURE__*/function () {
891
- var _ref6 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee9(c) {
892
- var _yield$_this3$feature, data, cpositions, dpositions, chunk, feats, mateRecs, _i3, feature;
893
-
894
- return _regenerator.default.wrap(function _callee9$(_context17) {
895
- while (1) {
896
- switch (_context17.prev = _context17.next) {
897
- case 0:
898
- _context17.next = 2;
899
- return _this3.featureCache.get(c.toString(), {
900
- chunk: c,
901
- opts: opts
902
- }, opts.signal);
903
-
904
- case 2:
905
- _yield$_this3$feature = _context17.sent;
906
- data = _yield$_this3$feature.data;
907
- cpositions = _yield$_this3$feature.cpositions;
908
- dpositions = _yield$_this3$feature.dpositions;
909
- chunk = _yield$_this3$feature.chunk;
910
- _context17.next = 9;
911
- return _this3.readBamFeatures(data, cpositions, dpositions, chunk);
912
-
913
- case 9:
914
- feats = _context17.sent;
915
- mateRecs = [];
916
-
917
- for (_i3 = 0; _i3 < feats.length; _i3 += 1) {
918
- feature = feats[_i3];
919
-
920
- if (unmatedPairs[feature.get('name')] && !readIds[feature.id()]) {
921
- mateRecs.push(feature);
922
- }
370
+ });
371
+ });
372
+ };
373
+ BamFile.prototype._fetchChunkFeatures = function (chunks, chrId, min, max, opts) {
374
+ return __asyncGenerator(this, arguments, function _fetchChunkFeatures_1() {
375
+ var featPromises, done, i, _a, data, cpositions, dpositions, chunk, promise, i;
376
+ return __generator(this, function (_b) {
377
+ switch (_b.label) {
378
+ case 0:
379
+ featPromises = [];
380
+ done = false;
381
+ i = 0;
382
+ _b.label = 1;
383
+ case 1:
384
+ if (!(i < chunks.length)) return [3 /*break*/, 5];
385
+ return [4 /*yield*/, __await(this._readChunk({
386
+ chunk: chunks[i],
387
+ opts: opts,
388
+ }))];
389
+ case 2:
390
+ _a = _b.sent(), data = _a.data, cpositions = _a.cpositions, dpositions = _a.dpositions, chunk = _a.chunk;
391
+ promise = this.readBamFeatures(data, cpositions, dpositions, chunk).then(function (records) {
392
+ var recs = [];
393
+ for (var i_1 = 0; i_1 < records.length; i_1 += 1) {
394
+ var feature = records[i_1];
395
+ if (feature.seq_id() === chrId) {
396
+ if (feature.get('start') >= max) {
397
+ // past end of range, can stop iterating
398
+ done = true;
399
+ break;
400
+ }
401
+ else if (feature.get('end') >= min) {
402
+ // must be in range
403
+ recs.push(feature);
404
+ }
405
+ }
923
406
  }
924
-
925
- return _context17.abrupt("return", mateRecs);
926
-
927
- case 13:
928
- case "end":
929
- return _context17.stop();
407
+ return recs;
408
+ });
409
+ featPromises.push(promise);
410
+ return [4 /*yield*/, __await(promise)];
411
+ case 3:
412
+ _b.sent();
413
+ if (done) {
414
+ return [3 /*break*/, 5];
930
415
  }
931
- }
932
- }, _callee9);
933
- }));
934
-
935
- return function (_x11) {
936
- return _ref6.apply(this, arguments);
937
- };
938
- }());
939
- _context18.next = 19;
940
- return _promise.default.all(mateFeatPromises);
941
-
942
- case 19:
943
- newMateFeats = _context18.sent;
944
- featuresRet = [];
945
-
946
- if (newMateFeats.length) {
947
- newMates = (0, _reduce.default)(newMateFeats).call(newMateFeats, function (result, current) {
948
- return (0, _concat.default)(result).call(result, current);
949
- });
950
- featuresRet = (0, _concat.default)(featuresRet).call(featuresRet, newMates);
951
- }
952
-
953
- return _context18.abrupt("return", featuresRet);
954
-
955
- case 23:
956
- case "end":
957
- return _context18.stop();
958
- }
959
- }
960
- }, _callee10, this);
961
- }));
962
-
963
- function fetchPairs(_x6, _x7, _x8) {
964
- return _fetchPairs.apply(this, arguments);
965
- }
966
-
967
- return fetchPairs;
968
- }()
969
- }, {
970
- key: "_readChunk",
971
- value: function () {
972
- var _readChunk2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee11(_ref7, abortSignal) {
973
- var chunk, opts, c, bufsize, res, bytesRead, buffer, _yield$unzipChunkSlic, data, cpositions, dpositions;
974
-
975
- return _regenerator.default.wrap(function _callee11$(_context19) {
976
- while (1) {
977
- switch (_context19.prev = _context19.next) {
978
- case 0:
979
- chunk = _ref7.chunk, opts = _ref7.opts;
980
- c = chunk;
981
- bufsize = c.fetchedSize();
982
- _context19.next = 5;
983
- return this.bam.read(Buffer.alloc(bufsize), 0, bufsize, c.minv.blockPosition, opts);
984
-
985
- case 5:
986
- res = _context19.sent;
987
- bytesRead = res.bytesRead;
988
- buffer = res.buffer;
989
- (0, _util.checkAbortSignal)(abortSignal);
990
-
991
- if (bytesRead) {
992
- _context19.next = 11;
993
- break;
416
+ _b.label = 4;
417
+ case 4:
418
+ i++;
419
+ return [3 /*break*/, 1];
420
+ case 5:
421
+ (0, util_1.checkAbortSignal)(opts.signal);
422
+ i = 0;
423
+ _b.label = 6;
424
+ case 6:
425
+ if (!(i < featPromises.length)) return [3 /*break*/, 10];
426
+ return [4 /*yield*/, __await(featPromises[i])];
427
+ case 7: return [4 /*yield*/, _b.sent()];
428
+ case 8:
429
+ _b.sent();
430
+ _b.label = 9;
431
+ case 9:
432
+ i++;
433
+ return [3 /*break*/, 6];
434
+ case 10:
435
+ (0, util_1.checkAbortSignal)(opts.signal);
436
+ if (!opts.viewAsPairs) return [3 /*break*/, 13];
437
+ return [4 /*yield*/, __await(this.fetchPairs(chrId, featPromises, opts))];
438
+ case 11: return [4 /*yield*/, _b.sent()];
439
+ case 12:
440
+ _b.sent();
441
+ _b.label = 13;
442
+ case 13: return [2 /*return*/];
994
443
  }
995
-
996
- return _context19.abrupt("return", []);
997
-
998
- case 11:
999
- if (bytesRead < bufsize) {
1000
- buffer = (0, _slice.default)(buffer).call(buffer, 0, bytesRead);
1001
- } else {
1002
- buffer = (0, _slice.default)(buffer).call(buffer, 0, bufsize);
1003
- }
1004
-
1005
- _context19.next = 14;
1006
- return (0, _bgzfFilehandle.unzipChunkSlice)(buffer, chunk);
1007
-
1008
- case 14:
1009
- _yield$unzipChunkSlic = _context19.sent;
1010
- data = _yield$unzipChunkSlic.buffer;
1011
- cpositions = _yield$unzipChunkSlic.cpositions;
1012
- dpositions = _yield$unzipChunkSlic.dpositions;
1013
- (0, _util.checkAbortSignal)(abortSignal);
1014
- return _context19.abrupt("return", {
1015
- data: data,
1016
- cpositions: cpositions,
1017
- dpositions: dpositions,
1018
- chunk: chunk
1019
- });
1020
-
1021
- case 20:
1022
- case "end":
1023
- return _context19.stop();
1024
- }
1025
- }
1026
- }, _callee11, this);
1027
- }));
1028
-
1029
- function _readChunk(_x12, _x13) {
1030
- return _readChunk2.apply(this, arguments);
1031
- }
1032
-
1033
- return _readChunk;
1034
- }()
1035
- }, {
1036
- key: "readBamFeatures",
1037
- value: function () {
1038
- var _readBamFeatures = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee12(ba, cpositions, dpositions, chunk) {
1039
- var blockStart, sink, pos, featsSinceLastTimeout, blockSize, blockEnd, feature;
1040
- return _regenerator.default.wrap(function _callee12$(_context20) {
1041
- while (1) {
1042
- switch (_context20.prev = _context20.next) {
1043
- case 0:
1044
- blockStart = 0;
1045
- sink = [];
1046
- pos = 0;
1047
- featsSinceLastTimeout = 0;
1048
-
1049
- case 4:
1050
- if (!(blockStart + 4 < ba.length)) {
1051
- _context20.next = 19;
1052
- break;
444
+ });
445
+ });
446
+ };
447
+ BamFile.prototype.fetchPairs = function (chrId, featPromises, opts) {
448
+ return __awaiter(this, void 0, void 0, function () {
449
+ var unmatedPairs, readIds, matePromises, mateBlocks, mateChunks, i, mateTotalSize, mateFeatPromises, newMateFeats, featuresRet, newMates;
450
+ var _this = this;
451
+ return __generator(this, function (_a) {
452
+ switch (_a.label) {
453
+ case 0:
454
+ unmatedPairs = {};
455
+ readIds = {};
456
+ return [4 /*yield*/, Promise.all(featPromises.map(function (f) { return __awaiter(_this, void 0, void 0, function () {
457
+ var ret, readNames, i, name_1, id;
458
+ return __generator(this, function (_a) {
459
+ switch (_a.label) {
460
+ case 0: return [4 /*yield*/, f];
461
+ case 1:
462
+ ret = _a.sent();
463
+ readNames = {};
464
+ for (i = 0; i < ret.length; i++) {
465
+ name_1 = ret[i].name();
466
+ id = ret[i].id();
467
+ if (!readNames[name_1]) {
468
+ readNames[name_1] = 0;
469
+ }
470
+ readNames[name_1]++;
471
+ readIds[id] = 1;
472
+ }
473
+ (0, object_entries_ponyfill_1.default)(readNames).forEach(function (_a) {
474
+ var k = _a[0], v = _a[1];
475
+ if (v === 1) {
476
+ unmatedPairs[k] = true;
477
+ }
478
+ });
479
+ return [2 /*return*/];
480
+ }
481
+ });
482
+ }); }))];
483
+ case 1:
484
+ _a.sent();
485
+ matePromises = [];
486
+ return [4 /*yield*/, Promise.all(featPromises.map(function (f) { return __awaiter(_this, void 0, void 0, function () {
487
+ var ret, i, name_2;
488
+ return __generator(this, function (_a) {
489
+ switch (_a.label) {
490
+ case 0: return [4 /*yield*/, f];
491
+ case 1:
492
+ ret = _a.sent();
493
+ for (i = 0; i < ret.length; i++) {
494
+ name_2 = ret[i].name();
495
+ if (unmatedPairs[name_2] &&
496
+ (opts.pairAcrossChr ||
497
+ (ret[i]._next_refid() === chrId &&
498
+ Math.abs(ret[i].get('start') - ret[i]._next_pos()) <
499
+ (opts.maxInsertSize || 200000)))) {
500
+ matePromises.push(this.index.blocksForRange(ret[i]._next_refid(), ret[i]._next_pos(), ret[i]._next_pos() + 1, opts));
501
+ }
502
+ }
503
+ return [2 /*return*/];
504
+ }
505
+ });
506
+ }); }))];
507
+ case 2:
508
+ _a.sent();
509
+ return [4 /*yield*/, Promise.all(matePromises)];
510
+ case 3:
511
+ mateBlocks = _a.sent();
512
+ mateChunks = [];
513
+ for (i = 0; i < mateBlocks.length; i++) {
514
+ mateChunks = mateChunks.concat(mateBlocks[i]);
515
+ }
516
+ // filter out duplicate chunks (the blocks are lists of chunks, blocks are concatenated, then filter dup chunks)
517
+ mateChunks = mateChunks
518
+ .sort()
519
+ .filter(function (item, pos, ary) { return !pos || item.toString() !== ary[pos - 1].toString(); });
520
+ mateTotalSize = mateChunks
521
+ .map(function (s) { return s.fetchedSize(); })
522
+ .reduce(function (a, b) { return a + b; }, 0);
523
+ if (mateTotalSize > this.fetchSizeLimit) {
524
+ throw new Error("data size of ".concat(mateTotalSize.toLocaleString(), " bytes exceeded fetch size limit of ").concat(this.fetchSizeLimit.toLocaleString(), " bytes"));
525
+ }
526
+ mateFeatPromises = mateChunks.map(function (c) { return __awaiter(_this, void 0, void 0, function () {
527
+ var _a, data, cpositions, dpositions, chunk, feats, mateRecs, i, feature;
528
+ return __generator(this, function (_b) {
529
+ switch (_b.label) {
530
+ case 0: return [4 /*yield*/, this._readChunk({
531
+ chunk: c,
532
+ opts: opts,
533
+ })];
534
+ case 1:
535
+ _a = _b.sent(), data = _a.data, cpositions = _a.cpositions, dpositions = _a.dpositions, chunk = _a.chunk;
536
+ return [4 /*yield*/, this.readBamFeatures(data, cpositions, dpositions, chunk)];
537
+ case 2:
538
+ feats = _b.sent();
539
+ mateRecs = [];
540
+ for (i = 0; i < feats.length; i += 1) {
541
+ feature = feats[i];
542
+ if (unmatedPairs[feature.get('name')] && !readIds[feature.id()]) {
543
+ mateRecs.push(feature);
544
+ }
545
+ }
546
+ return [2 /*return*/, mateRecs];
547
+ }
548
+ });
549
+ }); });
550
+ return [4 /*yield*/, Promise.all(mateFeatPromises)];
551
+ case 4:
552
+ newMateFeats = _a.sent();
553
+ featuresRet = [];
554
+ if (newMateFeats.length) {
555
+ newMates = newMateFeats.reduce(function (result, current) {
556
+ return result.concat(current);
557
+ });
558
+ featuresRet = featuresRet.concat(newMates);
559
+ }
560
+ return [2 /*return*/, featuresRet];
1053
561
  }
1054
-
1055
- blockSize = ba.readInt32LE(blockStart);
1056
- blockEnd = blockStart + 4 + blockSize - 1; // increment position to the current decompressed status
1057
-
1058
- if (dpositions) {
1059
- while (blockStart + chunk.minv.dataPosition >= dpositions[pos++]) {}
1060
-
1061
- pos--;
1062
- } // only try to read the feature if we have all the bytes for it
1063
-
1064
-
1065
- if (!(blockEnd < ba.length)) {
1066
- _context20.next = 16;
1067
- break;
562
+ });
563
+ });
564
+ };
565
+ BamFile.prototype._readChunk = function (_a) {
566
+ var chunk = _a.chunk, opts = _a.opts;
567
+ return __awaiter(this, void 0, void 0, function () {
568
+ var signal, bufsize, res, bytesRead, buffer, _b, data, cpositions, dpositions;
569
+ return __generator(this, function (_c) {
570
+ switch (_c.label) {
571
+ case 0:
572
+ signal = opts.signal;
573
+ bufsize = chunk.fetchedSize();
574
+ return [4 /*yield*/, this.bam.read(Buffer.alloc(bufsize), 0, bufsize, chunk.minv.blockPosition, opts)];
575
+ case 1:
576
+ res = _c.sent();
577
+ bytesRead = res.bytesRead;
578
+ buffer = res.buffer;
579
+ (0, util_1.checkAbortSignal)(signal);
580
+ if (bytesRead < bufsize) {
581
+ buffer = buffer.slice(0, bytesRead);
582
+ }
583
+ else {
584
+ buffer = buffer.slice(0, bufsize);
585
+ }
586
+ return [4 /*yield*/, (0, bgzf_filehandle_1.unzipChunkSlice)(buffer, chunk)];
587
+ case 2:
588
+ _b = _c.sent(), data = _b.buffer, cpositions = _b.cpositions, dpositions = _b.dpositions;
589
+ (0, util_1.checkAbortSignal)(signal);
590
+ return [2 /*return*/, { data: data, cpositions: cpositions, dpositions: dpositions, chunk: chunk }];
1068
591
  }
1069
-
1070
- feature = new _record.default({
1071
- bytes: {
1072
- byteArray: ba,
1073
- start: blockStart,
1074
- end: blockEnd
1075
- },
1076
- // the below results in an automatically calculated file-offset based ID
1077
- // if the info for that is available, otherwise crc32 of the features
1078
- //
1079
- // cpositions[pos] refers to actual file offset of a bgzip block boundaries
1080
- //
1081
- // we multiply by (1 <<8) in order to make sure each block has a "unique"
1082
- // address space so that data in that block could never overlap
1083
- //
1084
- // then the blockStart-dpositions is an uncompressed file offset from
1085
- // that bgzip block boundary, and since the cpositions are multiplied by
1086
- // (1 << 8) these uncompressed offsets get a unique space
1087
- //
1088
- // this has an extra chunk.minv.dataPosition added on because it blockStart
1089
- // starts at 0 instead of chunk.minv.dataPosition
1090
- //
1091
- // the +1 is just to avoid any possible uniqueId 0 but this does not realistically happen
1092
- fileOffset: cpositions ? cpositions[pos] * (1 << 8) + (blockStart - dpositions[pos]) + chunk.minv.dataPosition + 1 : _bufferCrc.default.signed((0, _slice.default)(ba).call(ba, blockStart, blockEnd))
1093
- });
1094
- sink.push(feature);
1095
- featsSinceLastTimeout++;
1096
-
1097
- if (!(featsSinceLastTimeout > 500)) {
1098
- _context20.next = 16;
1099
- break;
592
+ });
593
+ });
594
+ };
595
+ BamFile.prototype.readBamFeatures = function (ba, cpositions, dpositions, chunk) {
596
+ return __awaiter(this, void 0, void 0, function () {
597
+ var blockStart, sink, pos, last, blockSize, blockEnd, feature;
598
+ return __generator(this, function (_a) {
599
+ switch (_a.label) {
600
+ case 0:
601
+ blockStart = 0;
602
+ sink = [];
603
+ pos = 0;
604
+ last = +Date.now();
605
+ _a.label = 1;
606
+ case 1:
607
+ if (!(blockStart + 4 < ba.length)) return [3 /*break*/, 4];
608
+ blockSize = ba.readInt32LE(blockStart);
609
+ blockEnd = blockStart + 4 + blockSize - 1;
610
+ // increment position to the current decompressed status
611
+ if (dpositions) {
612
+ while (blockStart + chunk.minv.dataPosition >= dpositions[pos++]) { }
613
+ pos--;
614
+ }
615
+ if (!(blockEnd < ba.length)) return [3 /*break*/, 3];
616
+ feature = new record_1.default({
617
+ bytes: {
618
+ byteArray: ba,
619
+ start: blockStart,
620
+ end: blockEnd,
621
+ },
622
+ // the below results in an automatically calculated file-offset based ID
623
+ // if the info for that is available, otherwise crc32 of the features
624
+ //
625
+ // cpositions[pos] refers to actual file offset of a bgzip block boundaries
626
+ //
627
+ // we multiply by (1 <<8) in order to make sure each block has a "unique"
628
+ // address space so that data in that block could never overlap
629
+ //
630
+ // then the blockStart-dpositions is an uncompressed file offset from
631
+ // that bgzip block boundary, and since the cpositions are multiplied by
632
+ // (1 << 8) these uncompressed offsets get a unique space
633
+ //
634
+ // this has an extra chunk.minv.dataPosition added on because it blockStart
635
+ // starts at 0 instead of chunk.minv.dataPosition
636
+ //
637
+ // the +1 is just to avoid any possible uniqueId 0 but this does not realistically happen
638
+ fileOffset: cpositions
639
+ ? cpositions[pos] * (1 << 8) +
640
+ (blockStart - dpositions[pos]) +
641
+ chunk.minv.dataPosition +
642
+ 1
643
+ : buffer_crc32_1.default.signed(ba.slice(blockStart, blockEnd)),
644
+ });
645
+ sink.push(feature);
646
+ if (!(this.yieldThreadTime && +Date.now() - last > this.yieldThreadTime)) return [3 /*break*/, 3];
647
+ return [4 /*yield*/, (0, util_1.timeout)(1)];
648
+ case 2:
649
+ _a.sent();
650
+ last = +Date.now();
651
+ _a.label = 3;
652
+ case 3:
653
+ blockStart = blockEnd + 1;
654
+ return [3 /*break*/, 1];
655
+ case 4: return [2 /*return*/, sink];
1100
656
  }
1101
-
1102
- _context20.next = 15;
1103
- return (0, _util.timeout)(1);
1104
-
1105
- case 15:
1106
- featsSinceLastTimeout = 0;
1107
-
1108
- case 16:
1109
- blockStart = blockEnd + 1;
1110
- _context20.next = 4;
1111
- break;
1112
-
1113
- case 19:
1114
- return _context20.abrupt("return", sink);
1115
-
1116
- case 20:
1117
- case "end":
1118
- return _context20.stop();
1119
- }
1120
- }
1121
- }, _callee12);
1122
- }));
1123
-
1124
- function readBamFeatures(_x14, _x15, _x16, _x17) {
1125
- return _readBamFeatures.apply(this, arguments);
1126
- }
1127
-
1128
- return readBamFeatures;
1129
- }()
1130
- }, {
1131
- key: "hasRefSeq",
1132
- value: function () {
1133
- var _hasRefSeq = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee13(seqName) {
1134
- var refId;
1135
- return _regenerator.default.wrap(function _callee13$(_context21) {
1136
- while (1) {
1137
- switch (_context21.prev = _context21.next) {
1138
- case 0:
657
+ });
658
+ });
659
+ };
660
+ BamFile.prototype.hasRefSeq = function (seqName) {
661
+ return __awaiter(this, void 0, void 0, function () {
662
+ var refId;
663
+ return __generator(this, function (_a) {
1139
664
  refId = this.chrToIndex && this.chrToIndex[seqName];
1140
- return _context21.abrupt("return", this.index.hasRefSeq(refId));
1141
-
1142
- case 2:
1143
- case "end":
1144
- return _context21.stop();
1145
- }
1146
- }
1147
- }, _callee13, this);
1148
- }));
1149
-
1150
- function hasRefSeq(_x18) {
1151
- return _hasRefSeq.apply(this, arguments);
1152
- }
1153
-
1154
- return hasRefSeq;
1155
- }()
1156
- }, {
1157
- key: "lineCount",
1158
- value: function () {
1159
- var _lineCount = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee14(seqName) {
1160
- var refId;
1161
- return _regenerator.default.wrap(function _callee14$(_context22) {
1162
- while (1) {
1163
- switch (_context22.prev = _context22.next) {
1164
- case 0:
665
+ return [2 /*return*/, this.index.hasRefSeq(refId)];
666
+ });
667
+ });
668
+ };
669
+ BamFile.prototype.lineCount = function (seqName) {
670
+ return __awaiter(this, void 0, void 0, function () {
671
+ var refId;
672
+ return __generator(this, function (_a) {
1165
673
  refId = this.chrToIndex && this.chrToIndex[seqName];
1166
- return _context22.abrupt("return", this.index.lineCount(refId));
1167
-
1168
- case 2:
1169
- case "end":
1170
- return _context22.stop();
1171
- }
1172
- }
1173
- }, _callee14, this);
1174
- }));
1175
-
1176
- function lineCount(_x19) {
1177
- return _lineCount.apply(this, arguments);
1178
- }
1179
-
1180
- return lineCount;
1181
- }()
1182
- }, {
1183
- key: "indexCov",
1184
- value: function () {
1185
- var _indexCov = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee15(seqName, start, end) {
1186
- var seqId;
1187
- return _regenerator.default.wrap(function _callee15$(_context23) {
1188
- while (1) {
1189
- switch (_context23.prev = _context23.next) {
1190
- case 0:
1191
- _context23.next = 2;
1192
- return this.index.parse();
1193
-
1194
- case 2:
1195
- seqId = this.chrToIndex && this.chrToIndex[seqName];
1196
- return _context23.abrupt("return", this.index.indexCov(seqId, start, end));
1197
-
1198
- case 4:
1199
- case "end":
1200
- return _context23.stop();
1201
- }
1202
- }
1203
- }, _callee15, this);
1204
- }));
1205
-
1206
- function indexCov(_x20, _x21, _x22) {
1207
- return _indexCov.apply(this, arguments);
1208
- }
1209
-
1210
- return indexCov;
1211
- }()
1212
- }]);
1213
- return BamFile;
1214
- }();
1215
-
674
+ return [2 /*return*/, this.index.lineCount(refId)];
675
+ });
676
+ });
677
+ };
678
+ BamFile.prototype.indexCov = function (seqName, start, end) {
679
+ return __awaiter(this, void 0, void 0, function () {
680
+ var seqId;
681
+ return __generator(this, function (_a) {
682
+ switch (_a.label) {
683
+ case 0: return [4 /*yield*/, this.index.parse()];
684
+ case 1:
685
+ _a.sent();
686
+ seqId = this.chrToIndex && this.chrToIndex[seqName];
687
+ return [2 /*return*/, this.index.indexCov(seqId, start, end)];
688
+ }
689
+ });
690
+ });
691
+ };
692
+ return BamFile;
693
+ }());
1216
694
  exports.default = BamFile;
1217
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9iYW1GaWxlLnRzIl0sIm5hbWVzIjpbIkJBTV9NQUdJQyIsImJsb2NrTGVuIiwiQmFtRmlsZSIsImJhbUZpbGVoYW5kbGUiLCJiYW1QYXRoIiwiYmFtVXJsIiwiYmFpUGF0aCIsImJhaUZpbGVoYW5kbGUiLCJiYWlVcmwiLCJjc2lQYXRoIiwiY3NpRmlsZWhhbmRsZSIsImNzaVVybCIsImNhY2hlU2l6ZSIsImZldGNoU2l6ZUxpbWl0IiwiY2h1bmtTaXplTGltaXQiLCJyZW5hbWVSZWZTZXFzIiwibiIsInJlbmFtZVJlZlNlcSIsImJhbSIsIkxvY2FsRmlsZSIsIlJlbW90ZUZpbGUiLCJFcnJvciIsImluZGV4IiwiQ1NJIiwiZmlsZWhhbmRsZSIsIkJBSSIsImZlYXR1cmVDYWNoZSIsIkFib3J0YWJsZVByb21pc2VDYWNoZSIsImNhY2hlIiwiTFJVIiwibWF4U2l6ZSIsInVuZGVmaW5lZCIsImZpbGwiLCJfcmVhZENodW5rIiwib3JpZ09wdHMiLCJvcHRzIiwicGFyc2UiLCJpbmRleERhdGEiLCJyZXQiLCJmaXJzdERhdGFMaW5lIiwiYmxvY2tQb3NpdGlvbiIsInJlYWQiLCJCdWZmZXIiLCJhbGxvYyIsInJlcyIsImJ5dGVzUmVhZCIsImJ1ZmZlciIsInJlYWRGaWxlIiwidW5jYmEiLCJyZWFkSW50MzJMRSIsImhlYWRMZW4iLCJoZWFkZXIiLCJ0b1N0cmluZyIsIl9yZWFkUmVmU2VxcyIsImNoclRvSW5kZXgiLCJpbmRleFRvQ2hyIiwiZ2V0SGVhZGVyIiwic3RhcnQiLCJyZWZTZXFCeXRlcyIsIm5SZWYiLCJwIiwiaSIsInNpZ25hbCIsImxOYW1lIiwicmVmTmFtZSIsImxSZWYiLCJwdXNoIiwibGVuZ3RoIiwiY29uc29sZSIsIndhcm4iLCJjaHIiLCJtaW4iLCJtYXgiLCJ2aWV3QXNQYWlycyIsInBhaXJBY3Jvc3NDaHIiLCJtYXhJbnNlcnRTaXplIiwicmVjb3JkcyIsInN0cmVhbVJlY29yZHNGb3JSYW5nZSIsImNodW5rIiwiY2hySWQiLCJjaHVua3MiLCJibG9ja3NGb3JSYW5nZSIsInNpemUiLCJmZXRjaGVkU2l6ZSIsInRvdGFsU2l6ZSIsInMiLCJhIiwiYiIsInRvTG9jYWxlU3RyaW5nIiwiX2ZldGNoQ2h1bmtGZWF0dXJlcyIsImZlYXRQcm9taXNlcyIsImRvbmUiLCJjIiwiZ2V0IiwiZGF0YSIsImNwb3NpdGlvbnMiLCJkcG9zaXRpb25zIiwicHJvbWlzZSIsInJlYWRCYW1GZWF0dXJlcyIsInRoZW4iLCJyZWNzIiwiZmVhdHVyZSIsInNlcV9pZCIsImZldGNoUGFpcnMiLCJ1bm1hdGVkUGFpcnMiLCJyZWFkSWRzIiwiYWxsIiwiZiIsInJlYWROYW1lcyIsIm5hbWUiLCJpZCIsImsiLCJ2IiwibWF0ZVByb21pc2VzIiwiX25leHRfcmVmaWQiLCJNYXRoIiwiYWJzIiwiX25leHRfcG9zIiwibWF0ZUJsb2NrcyIsIm1hdGVDaHVua3MiLCJpdGVtIiwicG9zIiwiYXJ5IiwibWF0ZVRvdGFsU2l6ZSIsIm1hdGVGZWF0UHJvbWlzZXMiLCJmZWF0cyIsIm1hdGVSZWNzIiwibmV3TWF0ZUZlYXRzIiwiZmVhdHVyZXNSZXQiLCJuZXdNYXRlcyIsInJlc3VsdCIsImN1cnJlbnQiLCJhYm9ydFNpZ25hbCIsImJ1ZnNpemUiLCJtaW52IiwiYmEiLCJibG9ja1N0YXJ0Iiwic2luayIsImZlYXRzU2luY2VMYXN0VGltZW91dCIsImJsb2NrU2l6ZSIsImJsb2NrRW5kIiwiZGF0YVBvc2l0aW9uIiwiQkFNRmVhdHVyZSIsImJ5dGVzIiwiYnl0ZUFycmF5IiwiZW5kIiwiZmlsZU9mZnNldCIsImNyYzMyIiwic2lnbmVkIiwic2VxTmFtZSIsInJlZklkIiwiaGFzUmVmU2VxIiwibGluZUNvdW50Iiwic2VxSWQiLCJpbmRleENvdiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFFTyxJQUFNQSxTQUFTLEdBQUcsUUFBbEI7O0FBRVAsSUFBTUMsUUFBUSxHQUFHLEtBQUssRUFBdEI7O0lBRXFCQyxPO0FBV25COzs7Ozs7O0FBT0EseUJBNEJHO0FBQUE7O0FBQUEsUUEzQkRDLGFBMkJDLFFBM0JEQSxhQTJCQztBQUFBLFFBMUJEQyxPQTBCQyxRQTFCREEsT0EwQkM7QUFBQSxRQXpCREMsTUF5QkMsUUF6QkRBLE1BeUJDO0FBQUEsUUF4QkRDLE9Bd0JDLFFBeEJEQSxPQXdCQztBQUFBLFFBdkJEQyxhQXVCQyxRQXZCREEsYUF1QkM7QUFBQSxRQXRCREMsTUFzQkMsUUF0QkRBLE1Bc0JDO0FBQUEsUUFyQkRDLE9BcUJDLFFBckJEQSxPQXFCQztBQUFBLFFBcEJEQyxhQW9CQyxRQXBCREEsYUFvQkM7QUFBQSxRQW5CREMsTUFtQkMsUUFuQkRBLE1BbUJDO0FBQUEsUUFsQkRDLFNBa0JDLFFBbEJEQSxTQWtCQztBQUFBLFFBakJEQyxjQWlCQyxRQWpCREEsY0FpQkM7QUFBQSxRQWhCREMsY0FnQkMsUUFoQkRBLGNBZ0JDO0FBQUEsa0NBZkRDLGFBZUM7QUFBQSxRQWZEQSxhQWVDLG1DQWZlLFVBQUFDLENBQUM7QUFBQSxhQUFJQSxDQUFKO0FBQUEsS0FlaEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNELFNBQUtDLFlBQUwsR0FBb0JGLGFBQXBCOztBQUVBLFFBQUlaLGFBQUosRUFBbUI7QUFDakIsV0FBS2UsR0FBTCxHQUFXZixhQUFYO0FBQ0QsS0FGRCxNQUVPLElBQUlDLE9BQUosRUFBYTtBQUNsQixXQUFLYyxHQUFMLEdBQVcsSUFBSUMsNEJBQUosQ0FBY2YsT0FBZCxDQUFYO0FBQ0QsS0FGTSxNQUVBLElBQUlDLE1BQUosRUFBWTtBQUNqQixXQUFLYSxHQUFMLEdBQVcsSUFBSUUsNkJBQUosQ0FBZWYsTUFBZixDQUFYO0FBQ0QsS0FGTSxNQUVBO0FBQ0wsWUFBTSxJQUFJZ0IsS0FBSixDQUFVLDBCQUFWLENBQU47QUFDRDs7QUFDRCxRQUFJWCxhQUFKLEVBQW1CO0FBQ2pCLFdBQUtZLEtBQUwsR0FBYSxJQUFJQyxZQUFKLENBQVE7QUFBRUMsUUFBQUEsVUFBVSxFQUFFZDtBQUFkLE9BQVIsQ0FBYjtBQUNELEtBRkQsTUFFTyxJQUFJRCxPQUFKLEVBQWE7QUFDbEIsV0FBS2EsS0FBTCxHQUFhLElBQUlDLFlBQUosQ0FBUTtBQUFFQyxRQUFBQSxVQUFVLEVBQUUsSUFBSUwsNEJBQUosQ0FBY1YsT0FBZDtBQUFkLE9BQVIsQ0FBYjtBQUNELEtBRk0sTUFFQSxJQUFJRSxNQUFKLEVBQVk7QUFDakIsV0FBS1csS0FBTCxHQUFhLElBQUlDLFlBQUosQ0FBUTtBQUFFQyxRQUFBQSxVQUFVLEVBQUUsSUFBSUosNkJBQUosQ0FBZVQsTUFBZjtBQUFkLE9BQVIsQ0FBYjtBQUNELEtBRk0sTUFFQSxJQUFJSixhQUFKLEVBQW1CO0FBQ3hCLFdBQUtlLEtBQUwsR0FBYSxJQUFJRyxZQUFKLENBQVE7QUFBRUQsUUFBQUEsVUFBVSxFQUFFakI7QUFBZCxPQUFSLENBQWI7QUFDRCxLQUZNLE1BRUEsSUFBSUQsT0FBSixFQUFhO0FBQ2xCLFdBQUtnQixLQUFMLEdBQWEsSUFBSUcsWUFBSixDQUFRO0FBQUVELFFBQUFBLFVBQVUsRUFBRSxJQUFJTCw0QkFBSixDQUFjYixPQUFkO0FBQWQsT0FBUixDQUFiO0FBQ0QsS0FGTSxNQUVBLElBQUlFLE1BQUosRUFBWTtBQUNqQixXQUFLYyxLQUFMLEdBQWEsSUFBSUcsWUFBSixDQUFRO0FBQUVELFFBQUFBLFVBQVUsRUFBRSxJQUFJSiw2QkFBSixDQUFlWixNQUFmO0FBQWQsT0FBUixDQUFiO0FBQ0QsS0FGTSxNQUVBLElBQUlKLE9BQUosRUFBYTtBQUNsQixXQUFLa0IsS0FBTCxHQUFhLElBQUlHLFlBQUosQ0FBUTtBQUFFRCxRQUFBQSxVQUFVLEVBQUUsSUFBSUwsNEJBQUosV0FBaUJmLE9BQWpCO0FBQWQsT0FBUixDQUFiO0FBQ0QsS0FGTSxNQUVBLElBQUlDLE1BQUosRUFBWTtBQUNqQixXQUFLaUIsS0FBTCxHQUFhLElBQUlHLFlBQUosQ0FBUTtBQUFFRCxRQUFBQSxVQUFVLEVBQUUsSUFBSUosNkJBQUosV0FBa0JmLE1BQWxCO0FBQWQsT0FBUixDQUFiO0FBQ0QsS0FGTSxNQUVBO0FBQ0wsWUFBTSxJQUFJZ0IsS0FBSixDQUFVLDhCQUFWLENBQU47QUFDRDs7QUFDRCxTQUFLSyxZQUFMLEdBQW9CLElBQUlDLDhCQUFKLENBQTBCO0FBQzVDQyxNQUFBQSxLQUFLLEVBQUUsSUFBSUMsaUJBQUosQ0FBUTtBQUNiQyxRQUFBQSxPQUFPLEVBQUVsQixTQUFTLEtBQUttQixTQUFkLEdBQTBCbkIsU0FBMUIsR0FBc0M7QUFEbEMsT0FBUixDQURxQztBQUk1Q29CLE1BQUFBLElBQUksRUFBRSxtQ0FBS0MsVUFBTCxpQkFBcUIsSUFBckI7QUFKc0MsS0FBMUIsQ0FBcEI7QUFNQSxTQUFLcEIsY0FBTCxHQUFzQkEsY0FBYyxJQUFJLFNBQXhDLENBckNDLENBcUNpRDs7QUFDbEQsU0FBS0MsY0FBTCxHQUFzQkEsY0FBYyxJQUFJLFNBQXhDLENBdENDLENBc0NpRDtBQUNuRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRWVvQixnQkFBQUEsUSwyREFBbUMsRTtBQUMzQ0MsZ0JBQUFBLEksR0FBTyxvQkFBU0QsUUFBVCxDOzt1QkFDVyxLQUFLWixLQUFMLENBQVdjLEtBQVgsQ0FBaUJELElBQWpCLEM7OztBQUFsQkUsZ0JBQUFBLFM7QUFDQUMsZ0JBQUFBLEcsR0FBTUQsU0FBUyxDQUFDRSxhQUFWLEdBQTBCRixTQUFTLENBQUNFLGFBQVYsQ0FBd0JDLGFBQXhCLEdBQXdDLEtBQWxFLEdBQTBFVCxTOztxQkFFbEZPLEc7Ozs7Ozt1QkFDZ0IsS0FBS3BCLEdBQUwsQ0FBU3VCLElBQVQsQ0FBY0MsTUFBTSxDQUFDQyxLQUFQLENBQWFMLEdBQUcsR0FBR3JDLFFBQW5CLENBQWQsRUFBNEMsQ0FBNUMsRUFBK0NxQyxHQUFHLEdBQUdyQyxRQUFyRCxFQUErRCxDQUEvRCxFQUFrRWtDLElBQWxFLEM7OztBQUFaUyxnQkFBQUEsRztBQUVFQyxnQkFBQUEsUyxHQUFjRCxHLENBQWRDLFM7QUFDSkMsZ0JBQUFBLE0sR0FBV0YsRyxDQUFYRSxNOztvQkFDQ0QsUzs7Ozs7c0JBQ0csSUFBSXhCLEtBQUosQ0FBVSxzQkFBVixDOzs7QUFFUixvQkFBSXdCLFNBQVMsR0FBR1AsR0FBaEIsRUFBcUI7QUFDbkJRLGtCQUFBQSxNQUFNLEdBQUcsb0JBQUFBLE1BQU0sTUFBTixDQUFBQSxNQUFNLEVBQU8sQ0FBUCxFQUFVRCxTQUFWLENBQWY7QUFDRCxpQkFGRCxNQUVPO0FBQ0xDLGtCQUFBQSxNQUFNLEdBQUcsb0JBQUFBLE1BQU0sTUFBTixDQUFBQSxNQUFNLEVBQU8sQ0FBUCxFQUFVUixHQUFWLENBQWY7QUFDRDs7Ozs7Ozt1QkFFZSxLQUFLcEIsR0FBTCxDQUFTNkIsUUFBVCxDQUFrQlosSUFBbEIsQzs7O0FBQWhCVyxnQkFBQUEsTTs7Ozt1QkFHa0IsMkJBQU1BLE1BQU4sQzs7O0FBQWRFLGdCQUFBQSxLOztzQkFFRkEsS0FBSyxDQUFDQyxXQUFOLENBQWtCLENBQWxCLE1BQXlCakQsUzs7Ozs7c0JBQ3JCLElBQUlxQixLQUFKLENBQVUsZ0JBQVYsQzs7O0FBRUY2QixnQkFBQUEsTyxHQUFVRixLQUFLLENBQUNDLFdBQU4sQ0FBa0IsQ0FBbEIsQztBQUVoQixxQkFBS0UsTUFBTCxHQUFjSCxLQUFLLENBQUNJLFFBQU4sQ0FBZSxNQUFmLEVBQXVCLENBQXZCLEVBQTBCLElBQUlGLE9BQTlCLENBQWQ7O3VCQUN5QyxLQUFLRyxZQUFMLENBQWtCSCxPQUFPLEdBQUcsQ0FBNUIsRUFBK0IsS0FBL0IsRUFBc0NmLElBQXRDLEM7Ozs7QUFBakNtQixnQkFBQUEsVSx5QkFBQUEsVTtBQUFZQyxnQkFBQUEsVSx5QkFBQUEsVTtBQUNwQixxQkFBS0QsVUFBTCxHQUFrQkEsVUFBbEI7QUFDQSxxQkFBS0MsVUFBTCxHQUFrQkEsVUFBbEI7a0RBRU8sMEJBQWdCLEtBQUtKLE1BQXJCLEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR1doQixnQkFBQUEsSSw4REFBaUIsRTs7dUJBQzdCLEtBQUtxQixTQUFMLENBQWVyQixJQUFmLEM7OztrREFDQyxLQUFLZ0IsTTs7Ozs7Ozs7Ozs7Ozs7O1FBR2Q7QUFDQTs7Ozs7b0hBRUVNLEssRUFDQUMsVzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBdkIsZ0JBQUFBLEksOERBQWlCLEU7O3NCQUtic0IsS0FBSyxHQUFHQyxXOzs7OztrREFDSCxLQUFLTCxZQUFMLENBQWtCSSxLQUFsQixFQUF5QkMsV0FBVyxHQUFHLENBQXZDLEVBQTBDdkIsSUFBMUMsQzs7Ozt1QkFFUyxLQUFLakIsR0FBTCxDQUFTdUIsSUFBVCxDQUFjQyxNQUFNLENBQUNDLEtBQVAsQ0FBYWUsV0FBVyxHQUFHekQsUUFBM0IsQ0FBZCxFQUFvRCxDQUFwRCxFQUF1RHlELFdBQXZELEVBQW9FLENBQXBFLEVBQXVFdkIsSUFBdkUsQzs7O0FBQVpTLGdCQUFBQSxHO0FBQ0VDLGdCQUFBQSxTLEdBQWNELEcsQ0FBZEMsUztBQUNGQyxnQkFBQUEsTSxHQUFXRixHLENBQVhFLE07O29CQUNERCxTOzs7OztzQkFDRyxJQUFJeEIsS0FBSixDQUFVLG1DQUFWLEM7OztBQUVSLG9CQUFJd0IsU0FBUyxHQUFHYSxXQUFoQixFQUE2QjtBQUMzQlosa0JBQUFBLE1BQU0sR0FBRyxvQkFBQUEsTUFBTSxNQUFOLENBQUFBLE1BQU0sRUFBTyxDQUFQLEVBQVVELFNBQVYsQ0FBZjtBQUNELGlCQUZELE1BRU87QUFDTEMsa0JBQUFBLE1BQU0sR0FBRyxvQkFBQUEsTUFBTSxNQUFOLENBQUFBLE1BQU0sRUFBTyxDQUFQLEVBQVVZLFdBQVYsQ0FBZjtBQUNEOzs7dUJBQ21CLDJCQUFNWixNQUFOLEM7OztBQUFkRSxnQkFBQUEsSztBQUNBVyxnQkFBQUEsSSxHQUFPWCxLQUFLLENBQUNDLFdBQU4sQ0FBa0JRLEtBQWxCLEM7QUFDVEcsZ0JBQUFBLEMsR0FBSUgsS0FBSyxHQUFHLEM7QUFDVkgsZ0JBQUFBLFUsR0FBd0MsRTtBQUN4Q0MsZ0JBQUFBLFUsR0FBb0QsRTtBQUNqRE0sZ0JBQUFBLEMsR0FBSSxDOzs7c0JBQUdBLENBQUMsR0FBR0YsSTs7Ozs7O3VCQUNaLDJCQUFnQnhCLElBQUksQ0FBQzJCLE1BQXJCLEM7OztBQUNBQyxnQkFBQUEsSyxHQUFRZixLQUFLLENBQUNDLFdBQU4sQ0FBa0JXLENBQWxCLEM7QUFDVkksZ0JBQUFBLE8sR0FBVWhCLEtBQUssQ0FBQ0ksUUFBTixDQUFlLE1BQWYsRUFBdUJRLENBQUMsR0FBRyxDQUEzQixFQUE4QkEsQ0FBQyxHQUFHLENBQUosR0FBUUcsS0FBUixHQUFnQixDQUE5QyxDO0FBQ2RDLGdCQUFBQSxPQUFPLEdBQUcsS0FBSy9DLFlBQUwsQ0FBa0IrQyxPQUFsQixDQUFWO0FBQ01DLGdCQUFBQSxJLEdBQU9qQixLQUFLLENBQUNDLFdBQU4sQ0FBa0JXLENBQUMsR0FBR0csS0FBSixHQUFZLENBQTlCLEM7QUFFYlQsZ0JBQUFBLFVBQVUsQ0FBQ1UsT0FBRCxDQUFWLEdBQXNCSCxDQUF0QjtBQUNBTixnQkFBQUEsVUFBVSxDQUFDVyxJQUFYLENBQWdCO0FBQUVGLGtCQUFBQSxPQUFPLEVBQVBBLE9BQUY7QUFBV0csa0JBQUFBLE1BQU0sRUFBRUY7QUFBbkIsaUJBQWhCO0FBRUFMLGdCQUFBQSxDQUFDLEdBQUdBLENBQUMsR0FBRyxDQUFKLEdBQVFHLEtBQVo7O3NCQUNJSCxDQUFDLEdBQUdaLEtBQUssQ0FBQ21CLE07Ozs7O0FBQ1pDLGdCQUFBQSxPQUFPLENBQUNDLElBQVIsZ0RBQXFEWCxXQUFyRDtrREFDTyxLQUFLTCxZQUFMLENBQWtCSSxLQUFsQixFQUF5QkMsV0FBVyxHQUFHLENBQXZDLEVBQTBDdkIsSUFBMUMsQzs7O0FBYmUwQixnQkFBQUEsQ0FBQyxJQUFJLEM7Ozs7O2tEQWdCeEI7QUFBRVAsa0JBQUFBLFVBQVUsRUFBVkEsVUFBRjtBQUFjQyxrQkFBQUEsVUFBVSxFQUFWQTtBQUFkLGlCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBIQUlQZSxHLEVBQ0FDLEcsRUFDQUMsRzs7Ozs7Ozs7Ozs7Ozs7OztBQUNBckMsZ0JBQUFBLEksOERBQWdCO0FBQUVzQyxrQkFBQUEsV0FBVyxFQUFFLEtBQWY7QUFBc0JDLGtCQUFBQSxhQUFhLEVBQUUsS0FBckM7QUFBNENDLGtCQUFBQSxhQUFhLEVBQUU7QUFBM0QsaUI7QUFFWkMsZ0JBQUFBLE8sR0FBd0IsRTs7Ozt5REFDRixLQUFLQyxxQkFBTCxDQUEyQlAsR0FBM0IsRUFBZ0NDLEdBQWhDLEVBQXFDQyxHQUFyQyxFQUEwQ3JDLElBQTFDLEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQVQyQyxnQkFBQUEsSztBQUNmRixnQkFBQUEsT0FBTyxHQUFHLHFCQUFBQSxPQUFPLE1BQVAsQ0FBQUEsT0FBTyxFQUFRRSxLQUFSLENBQWpCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tEQUVLRixPOzs7Ozs7Ozs7Ozs7Ozs7Ozs7MENBSVBOLEcsRUFDQUMsRyxFQUNBQyxHLEVBRUE7QUFBQTs7QUFBQSxVQURBckMsSUFDQSx1RUFEZ0I7QUFBRXNDLFFBQUFBLFdBQVcsRUFBRSxLQUFmO0FBQXNCQyxRQUFBQSxhQUFhLEVBQUUsS0FBckM7QUFBNENDLFFBQUFBLGFBQWEsRUFBRTtBQUEzRCxPQUNoQjtBQUFBO0FBQUE7O0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBeEMsZ0JBQUFBLElBQUksQ0FBQ3NDLFdBQUwsR0FBbUJ0QyxJQUFJLENBQUNzQyxXQUFMLElBQW9CLEtBQXZDO0FBQ0F0QyxnQkFBQUEsSUFBSSxDQUFDdUMsYUFBTCxHQUFxQnZDLElBQUksQ0FBQ3VDLGFBQUwsSUFBc0IsS0FBM0M7QUFDQXZDLGdCQUFBQSxJQUFJLENBQUN3QyxhQUFMLEdBQXFCeEMsSUFBSSxDQUFDd0MsYUFBTCxLQUF1QjVDLFNBQXZCLEdBQW1DSSxJQUFJLENBQUN3QyxhQUF4QyxHQUF3RCxNQUE3RTtBQUNNSSxnQkFBQUEsS0FMTixHQUtjLEtBQUksQ0FBQ3pCLFVBQUwsSUFBbUIsS0FBSSxDQUFDQSxVQUFMLENBQWdCZ0IsR0FBaEIsQ0FMakM7O0FBQUEsb0JBT01TLEtBQUssSUFBSSxDQVBmO0FBQUE7QUFBQTtBQUFBOztBQVFFQyxnQkFBQUEsTUFBTSxHQUFHLEVBQVQ7QUFSRjtBQUFBOztBQUFBO0FBQUE7QUFBQSwwREFVaUIsS0FBSSxDQUFDMUQsS0FBTCxDQUFXMkQsY0FBWCxDQUEwQkYsS0FBMUIsRUFBaUNSLEdBQUcsR0FBRyxDQUF2QyxFQUEwQ0MsR0FBMUMsRUFBK0NyQyxJQUEvQyxDQVZqQjs7QUFBQTtBQVVFNkMsZ0JBQUFBLE1BVkY7O0FBQUEsb0JBWU9BLE1BWlA7QUFBQTtBQUFBO0FBQUE7O0FBQUEsc0JBYVUsSUFBSTNELEtBQUosQ0FBVSxzQkFBVixDQWJWOztBQUFBO0FBaUJTd0MsZ0JBQUFBLENBakJULEdBaUJhLENBakJiOztBQUFBO0FBQUEsc0JBaUJnQkEsQ0FBQyxHQUFHbUIsTUFBTSxDQUFDYixNQWpCM0I7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQSwwREFrQlEsMkJBQWdCaEMsSUFBSSxDQUFDMkIsTUFBckIsQ0FsQlI7O0FBQUE7QUFtQlFvQixnQkFBQUEsSUFuQlIsR0FtQmVGLE1BQU0sQ0FBQ25CLENBQUQsQ0FBTixDQUFVc0IsV0FBVixFQW5CZjs7QUFBQSxzQkFvQk1ELElBQUksR0FBRyxLQUFJLENBQUNwRSxjQXBCbEI7QUFBQTtBQUFBO0FBQUE7O0FBQUEsc0JBcUJVLElBQUlPLEtBQUosa0ZBQ3FDNkQsSUFEckMsd0RBQzZFLEtBQUksQ0FBQ3BFLGNBRGxGLEVBckJWOztBQUFBO0FBaUJtQytDLGdCQUFBQSxDQUFDLElBQUksQ0FqQnhDO0FBQUE7QUFBQTs7QUFBQTtBQTJCTXVCLGdCQUFBQSxTQTNCTixHQTJCa0IsbURBQUFKLE1BQU0sTUFBTixDQUFBQSxNQUFNLEVBQ2pCLFVBQUNLLENBQUQ7QUFBQSx5QkFBY0EsQ0FBQyxDQUFDRixXQUFGLEVBQWQ7QUFBQSxpQkFEaUIsQ0FBTixrQkFFUixVQUFDRyxDQUFELEVBQVlDLENBQVo7QUFBQSx5QkFBMEJELENBQUMsR0FBR0MsQ0FBOUI7QUFBQSxpQkFGUSxFQUV5QixDQUZ6QixDQTNCbEI7O0FBQUEsc0JBOEJJSCxTQUFTLEdBQUcsS0FBSSxDQUFDdkUsY0E5QnJCO0FBQUE7QUFBQTtBQUFBOztBQUFBLHNCQStCUSxJQUFJUSxLQUFKLHlEQUNZK0QsU0FBUyxDQUFDSSxjQUFWLEVBRFosMkRBQzZFLEtBQUksQ0FBQzNFLGNBQUwsQ0FBb0IyRSxjQUFwQixFQUQ3RSxZQS9CUjs7QUFBQTtBQW1DQSxrSEFBTyxLQUFJLENBQUNDLG1CQUFMLENBQXlCVCxNQUF6QixFQUFpQ0QsS0FBakMsRUFBd0NSLEdBQXhDLEVBQTZDQyxHQUE3QyxFQUFrRHJDLElBQWxELENBQVA7O0FBbkNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBb0NEOzs7d0NBR0M2QyxNLEVBQ0FELEssRUFDQVIsRyxFQUNBQyxHLEVBQ0FyQyxJLEVBQ0E7QUFBQTs7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ011RCxnQkFBQUEsWUFETixHQUNxQixFQURyQjtBQUVJQyxnQkFBQUEsSUFGSixHQUVXLEtBRlg7QUFJUzlCLGdCQUFBQSxDQUpULEdBSWEsQ0FKYjs7QUFBQTtBQUFBLHNCQUlnQkEsQ0FBQyxHQUFHbUIsTUFBTSxDQUFDYixNQUozQjtBQUFBO0FBQUE7QUFBQTs7QUFLUXlCLGdCQUFBQSxDQUxSLEdBS1laLE1BQU0sQ0FBQ25CLENBQUQsQ0FMbEI7QUFBQTtBQUFBLDBEQU13RCxNQUFJLENBQUNuQyxZQUFMLENBQWtCbUUsR0FBbEIsQ0FDcERELENBQUMsQ0FBQ3hDLFFBQUYsRUFEb0QsRUFFcEQ7QUFBRTBCLGtCQUFBQSxLQUFLLEVBQUVjLENBQVQ7QUFBWXpELGtCQUFBQSxJQUFJLEVBQUpBO0FBQVosaUJBRm9ELEVBR3BEQSxJQUFJLENBQUMyQixNQUgrQyxDQU54RDs7QUFBQTtBQUFBO0FBTVVnQyxnQkFBQUEsSUFOVix5QkFNVUEsSUFOVjtBQU1nQkMsZ0JBQUFBLFVBTmhCLHlCQU1nQkEsVUFOaEI7QUFNNEJDLGdCQUFBQSxVQU41Qix5QkFNNEJBLFVBTjVCO0FBTXdDbEIsZ0JBQUFBLEtBTnhDLHlCQU13Q0EsS0FOeEM7QUFXUW1CLGdCQUFBQSxPQVhSLEdBV2tCLE1BQUksQ0FBQ0MsZUFBTCxDQUFxQkosSUFBckIsRUFBMkJDLFVBQTNCLEVBQXVDQyxVQUF2QyxFQUFtRGxCLEtBQW5ELEVBQTBEcUIsSUFBMUQsQ0FBK0QsVUFBQXZCLE9BQU8sRUFBSTtBQUN4RixzQkFBTXdCLElBQUksR0FBRyxFQUFiOztBQUNBLHVCQUFLLElBQUl2QyxFQUFDLEdBQUcsQ0FBYixFQUFnQkEsRUFBQyxHQUFHZSxPQUFPLENBQUNULE1BQTVCLEVBQW9DTixFQUFDLElBQUksQ0FBekMsRUFBNEM7QUFDMUMsd0JBQU13QyxPQUFPLEdBQUd6QixPQUFPLENBQUNmLEVBQUQsQ0FBdkI7O0FBQ0Esd0JBQUl3QyxPQUFPLENBQUNDLE1BQVIsT0FBcUJ2QixLQUF6QixFQUFnQztBQUM5QiwwQkFBSXNCLE9BQU8sQ0FBQ1IsR0FBUixDQUFZLE9BQVosS0FBd0JyQixHQUE1QixFQUFpQztBQUMvQjtBQUNBbUIsd0JBQUFBLElBQUksR0FBRyxJQUFQO0FBQ0E7QUFDRCx1QkFKRCxNQUlPLElBQUlVLE9BQU8sQ0FBQ1IsR0FBUixDQUFZLEtBQVosS0FBc0J0QixHQUExQixFQUErQjtBQUNwQztBQUNBNkIsd0JBQUFBLElBQUksQ0FBQ2xDLElBQUwsQ0FBVW1DLE9BQVY7QUFDRDtBQUNGO0FBQ0Y7O0FBQ0QseUJBQU9ELElBQVA7QUFDRCxpQkFoQmUsQ0FYbEI7QUE0QkVWLGdCQUFBQSxZQUFZLENBQUN4QixJQUFiLENBQWtCK0IsT0FBbEI7QUE1QkY7QUFBQSwwREE2QlFBLE9BN0JSOztBQUFBO0FBQUEscUJBOEJNTixJQTlCTjtBQUFBO0FBQUE7QUFBQTs7QUFBQTs7QUFBQTtBQUltQzlCLGdCQUFBQSxDQUFDLEVBSnBDO0FBQUE7QUFBQTs7QUFBQTtBQW1DQSw0Q0FBaUIxQixJQUFJLENBQUMyQixNQUF0QjtBQUVTRCxnQkFBQUEsR0FyQ1QsR0FxQ2EsQ0FyQ2I7O0FBQUE7QUFBQSxzQkFxQ2dCQSxHQUFDLEdBQUc2QixZQUFZLENBQUN2QixNQXJDakM7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFzQ0UsdUJBQU11QixZQUFZLENBQUM3QixHQUFELENBQWxCOztBQXRDRjtBQXFDeUNBLGdCQUFBQSxHQUFDLEVBckMxQztBQUFBO0FBQUE7O0FBQUE7QUF3Q0EsNENBQWlCMUIsSUFBSSxDQUFDMkIsTUFBdEI7O0FBeENBLHFCQXlDSTNCLElBQUksQ0FBQ3NDLFdBekNUO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBMENFLHVCQUFNLE1BQUksQ0FBQzhCLFVBQUwsQ0FBZ0J4QixLQUFoQixFQUF1QlcsWUFBdkIsRUFBcUN2RCxJQUFyQyxDQUFOOztBQTFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTRDRDs7OzttSEFFZ0I0QyxLLEVBQWVXLFksRUFBdUN2RCxJOzs7Ozs7Ozs7OztBQUMvRHFFLGdCQUFBQSxZLEdBQTJDLEU7QUFDM0NDLGdCQUFBQSxPLEdBQXFDLEU7O3VCQUNyQyxpQkFBUUMsR0FBUixDQUNKLGtCQUFBaEIsWUFBWSxNQUFaLENBQUFBLFlBQVk7QUFBQSxzR0FBSyxrQkFBTWlCLENBQU47QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQ0FDR0EsQ0FESDs7QUFBQTtBQUNUckUsNEJBQUFBLEdBRFM7QUFFVHNFLDRCQUFBQSxTQUZTLEdBRThCLEVBRjlCOztBQUdmLGlDQUFTL0MsQ0FBVCxHQUFhLENBQWIsRUFBZ0JBLENBQUMsR0FBR3ZCLEdBQUcsQ0FBQzZCLE1BQXhCLEVBQWdDTixDQUFDLEVBQWpDLEVBQXFDO0FBQzdCZ0QsOEJBQUFBLElBRDZCLEdBQ3RCdkUsR0FBRyxDQUFDdUIsQ0FBRCxDQUFILENBQU9nRCxJQUFQLEVBRHNCO0FBRTdCQyw4QkFBQUEsRUFGNkIsR0FFeEJ4RSxHQUFHLENBQUN1QixDQUFELENBQUgsQ0FBT2lELEVBQVAsRUFGd0I7O0FBR25DLGtDQUFJLENBQUNGLFNBQVMsQ0FBQ0MsSUFBRCxDQUFkLEVBQXNCO0FBQ3BCRCxnQ0FBQUEsU0FBUyxDQUFDQyxJQUFELENBQVQsR0FBa0IsQ0FBbEI7QUFDRDs7QUFDREQsOEJBQUFBLFNBQVMsQ0FBQ0MsSUFBRCxDQUFUO0FBQ0FKLDhCQUFBQSxPQUFPLENBQUNLLEVBQUQsQ0FBUCxHQUFjLENBQWQ7QUFDRDs7QUFDRCxvRkFBUUYsU0FBUixvQkFBMkIsaUJBQThCO0FBQUE7QUFBQSxrQ0FBNUJHLENBQTRCO0FBQUEsa0NBQXpCQyxDQUF5Qjs7QUFDdkQsa0NBQUlBLENBQUMsS0FBSyxDQUFWLEVBQWE7QUFDWFIsZ0NBQUFBLFlBQVksQ0FBQ08sQ0FBRCxDQUFaLEdBQWtCLElBQWxCO0FBQ0Q7QUFDRiw2QkFKRDs7QUFaZTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFBTDs7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkFEUixDOzs7QUFxQkFFLGdCQUFBQSxZLEdBQW1DLEU7O3VCQUNuQyxpQkFBUVAsR0FBUixDQUNKLGtCQUFBaEIsWUFBWSxNQUFaLENBQUFBLFlBQVk7QUFBQSxzR0FBSyxrQkFBTWlCLENBQU47QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQ0FDR0EsQ0FESDs7QUFBQTtBQUNUckUsNEJBQUFBLEdBRFM7O0FBRWYsaUNBQVN1QixDQUFULEdBQWEsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHdkIsR0FBRyxDQUFDNkIsTUFBeEIsRUFBZ0NOLENBQUMsRUFBakMsRUFBcUM7QUFDN0JnRCw4QkFBQUEsSUFENkIsR0FDdEJ2RSxHQUFHLENBQUN1QixDQUFELENBQUgsQ0FBT2dELElBQVAsRUFEc0I7O0FBRW5DLGtDQUNFTCxZQUFZLENBQUNLLElBQUQsQ0FBWixLQUNDMUUsSUFBSSxDQUFDdUMsYUFBTCxJQUNFcEMsR0FBRyxDQUFDdUIsQ0FBRCxDQUFILENBQU9xRCxXQUFQLE9BQXlCbkMsS0FBekIsSUFDQ29DLElBQUksQ0FBQ0MsR0FBTCxDQUFTOUUsR0FBRyxDQUFDdUIsQ0FBRCxDQUFILENBQU9nQyxHQUFQLENBQVcsT0FBWCxJQUFzQnZELEdBQUcsQ0FBQ3VCLENBQUQsQ0FBSCxDQUFPd0QsU0FBUCxFQUEvQixLQUNHbEYsSUFBSSxDQUFDd0MsYUFBTCxJQUFzQixNQUR6QixDQUhKLENBREYsRUFNRTtBQUNBc0MsZ0NBQUFBLFlBQVksQ0FBQy9DLElBQWIsQ0FDRSxNQUFJLENBQUM1QyxLQUFMLENBQVcyRCxjQUFYLENBQ0UzQyxHQUFHLENBQUN1QixDQUFELENBQUgsQ0FBT3FELFdBQVAsRUFERixFQUVFNUUsR0FBRyxDQUFDdUIsQ0FBRCxDQUFILENBQU93RCxTQUFQLEVBRkYsRUFHRS9FLEdBQUcsQ0FBQ3VCLENBQUQsQ0FBSCxDQUFPd0QsU0FBUCxLQUFxQixDQUh2QixFQUlFbEYsSUFKRixDQURGO0FBUUQ7QUFDRjs7QUFwQmM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBQUw7O0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBRFIsQzs7Ozt1QkF5Qm1CLGlCQUFRdUUsR0FBUixDQUFZTyxZQUFaLEM7OztBQUFuQkssZ0JBQUFBLFU7QUFDRkMsZ0JBQUFBLFUsR0FBc0IsRTs7QUFDMUIscUJBQVMxRCxDQUFULEdBQWEsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHeUQsVUFBVSxDQUFDbkQsTUFBL0IsRUFBdUNOLENBQUMsRUFBeEMsRUFBNEM7QUFDMUMwRCxrQkFBQUEsVUFBVSxHQUFHLHFCQUFBQSxVQUFVLE1BQVYsQ0FBQUEsVUFBVSxFQUFRRCxVQUFVLENBQUN6RCxDQUFELENBQWxCLENBQXZCO0FBQ0QsaUIsQ0FDRDs7O0FBQ0EwRCxnQkFBQUEsVUFBVSxHQUFHLHFEQUFBQSxVQUFVLE1BQVYsQ0FBQUEsVUFBVSxPQUFWLGFBRUgsVUFBQ0MsSUFBRCxFQUFPQyxHQUFQLEVBQVlDLEdBQVo7QUFBQSx5QkFBb0IsQ0FBQ0QsR0FBRCxJQUFRRCxJQUFJLENBQUNwRSxRQUFMLE9BQW9Cc0UsR0FBRyxDQUFDRCxHQUFHLEdBQUcsQ0FBUCxDQUFILENBQWFyRSxRQUFiLEVBQWhEO0FBQUEsaUJBRkcsQ0FBYjtBQUlNdUUsZ0JBQUFBLGEsR0FBZ0Isb0RBQUFKLFVBQVUsTUFBVixDQUFBQSxVQUFVLEVBQUssVUFBQWxDLENBQUM7QUFBQSx5QkFBSUEsQ0FBQyxDQUFDRixXQUFGLEVBQUo7QUFBQSxpQkFBTixDQUFWLG1CQUE0QyxVQUFDRyxDQUFELEVBQUlDLENBQUo7QUFBQSx5QkFBVUQsQ0FBQyxHQUFHQyxDQUFkO0FBQUEsaUJBQTVDLEVBQTZELENBQTdELEM7O3NCQUNsQm9DLGFBQWEsR0FBRyxLQUFLOUcsYzs7Ozs7c0JBQ2pCLElBQUlRLEtBQUosMERBQ1lzRyxhQUFhLENBQUNuQyxjQUFkLEVBRFosNERBQ2lGLEtBQUszRSxjQUFMLENBQW9CMkUsY0FBcEIsRUFEakYsWTs7O0FBSUZvQyxnQkFBQUEsZ0IsR0FBbUIsa0JBQUFMLFVBQVUsTUFBVixDQUFBQSxVQUFVO0FBQUEsc0dBQUssa0JBQU0zQixDQUFOO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1DQUNnQixNQUFJLENBQUNsRSxZQUFMLENBQWtCbUUsR0FBbEIsQ0FDcERELENBQUMsQ0FBQ3hDLFFBQUYsRUFEb0QsRUFFcEQ7QUFBRTBCLDhCQUFBQSxLQUFLLEVBQUVjLENBQVQ7QUFBWXpELDhCQUFBQSxJQUFJLEVBQUpBO0FBQVosNkJBRm9ELEVBR3BEQSxJQUFJLENBQUMyQixNQUgrQyxDQURoQjs7QUFBQTtBQUFBO0FBQzlCZ0MsNEJBQUFBLElBRDhCLHlCQUM5QkEsSUFEOEI7QUFDeEJDLDRCQUFBQSxVQUR3Qix5QkFDeEJBLFVBRHdCO0FBQ1pDLDRCQUFBQSxVQURZLHlCQUNaQSxVQURZO0FBQ0FsQiw0QkFBQUEsS0FEQSx5QkFDQUEsS0FEQTtBQUFBO0FBQUEsbUNBTWxCLE1BQUksQ0FBQ29CLGVBQUwsQ0FBcUJKLElBQXJCLEVBQTJCQyxVQUEzQixFQUF1Q0MsVUFBdkMsRUFBbURsQixLQUFuRCxDQU5rQjs7QUFBQTtBQU1oQytDLDRCQUFBQSxLQU5nQztBQU9oQ0MsNEJBQUFBLFFBUGdDLEdBT3JCLEVBUHFCOztBQVF0QyxpQ0FBU2pFLEdBQVQsR0FBYSxDQUFiLEVBQWdCQSxHQUFDLEdBQUdnRSxLQUFLLENBQUMxRCxNQUExQixFQUFrQ04sR0FBQyxJQUFJLENBQXZDLEVBQTBDO0FBQ2xDd0MsOEJBQUFBLE9BRGtDLEdBQ3hCd0IsS0FBSyxDQUFDaEUsR0FBRCxDQURtQjs7QUFFeEMsa0NBQUkyQyxZQUFZLENBQUNILE9BQU8sQ0FBQ1IsR0FBUixDQUFZLE1BQVosQ0FBRCxDQUFaLElBQXFDLENBQUNZLE9BQU8sQ0FBQ0osT0FBTyxDQUFDUyxFQUFSLEVBQUQsQ0FBakQsRUFBaUU7QUFDL0RnQixnQ0FBQUEsUUFBUSxDQUFDNUQsSUFBVCxDQUFjbUMsT0FBZDtBQUNEO0FBQ0Y7O0FBYnFDLCtEQWMvQnlCLFFBZCtCOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUFMOztBQUFBO0FBQUE7QUFBQTtBQUFBLG9COzt1QkFnQlIsaUJBQVFwQixHQUFSLENBQVlrQixnQkFBWixDOzs7QUFBckJHLGdCQUFBQSxZO0FBQ0ZDLGdCQUFBQSxXLEdBQTRCLEU7O0FBQ2hDLG9CQUFJRCxZQUFZLENBQUM1RCxNQUFqQixFQUF5QjtBQUNqQjhELGtCQUFBQSxRQURpQixHQUNOLHFCQUFBRixZQUFZLE1BQVosQ0FBQUEsWUFBWSxFQUFRLFVBQUNHLE1BQUQsRUFBU0MsT0FBVDtBQUFBLDJCQUFxQixxQkFBQUQsTUFBTSxNQUFOLENBQUFBLE1BQU0sRUFBUUMsT0FBUixDQUEzQjtBQUFBLG1CQUFSLENBRE47QUFFdkJILGtCQUFBQSxXQUFXLEdBQUcscUJBQUFBLFdBQVcsTUFBWCxDQUFBQSxXQUFXLEVBQVFDLFFBQVIsQ0FBekI7QUFDRDs7bURBQ01ELFc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MEhBRzZESSxXOzs7Ozs7O0FBQW5EdEQsZ0JBQUFBLEssU0FBQUEsSyxFQUFPM0MsSSxTQUFBQSxJO0FBQ2xCeUQsZ0JBQUFBLEMsR0FBSWQsSztBQUNKdUQsZ0JBQUFBLE8sR0FBVXpDLENBQUMsQ0FBQ1QsV0FBRixFOzt1QkFDRSxLQUFLakUsR0FBTCxDQUFTdUIsSUFBVCxDQUFjQyxNQUFNLENBQUNDLEtBQVAsQ0FBYTBGLE9BQWIsQ0FBZCxFQUFxQyxDQUFyQyxFQUF3Q0EsT0FBeEMsRUFBaUR6QyxDQUFDLENBQUMwQyxJQUFGLENBQU85RixhQUF4RCxFQUF1RUwsSUFBdkUsQzs7O0FBQVpTLGdCQUFBQSxHO0FBQ0VDLGdCQUFBQSxTLEdBQWNELEcsQ0FBZEMsUztBQUNGQyxnQkFBQUEsTSxHQUFXRixHLENBQVhFLE07QUFDTiw0Q0FBaUJzRixXQUFqQjs7b0JBQ0t2RixTOzs7OzttREFDSSxFOzs7QUFFVCxvQkFBSUEsU0FBUyxHQUFHd0YsT0FBaEIsRUFBeUI7QUFDdkJ2RixrQkFBQUEsTUFBTSxHQUFHLG9CQUFBQSxNQUFNLE1BQU4sQ0FBQUEsTUFBTSxFQUFPLENBQVAsRUFBVUQsU0FBVixDQUFmO0FBQ0QsaUJBRkQsTUFFTztBQUNMQyxrQkFBQUEsTUFBTSxHQUFHLG9CQUFBQSxNQUFNLE1BQU4sQ0FBQUEsTUFBTSxFQUFPLENBQVAsRUFBVXVGLE9BQVYsQ0FBZjtBQUNEOzs7dUJBRXNELHFDQUFnQnZGLE1BQWhCLEVBQXdCZ0MsS0FBeEIsQzs7OztBQUF2Q2dCLGdCQUFBQSxJLHlCQUFSaEQsTTtBQUFjaUQsZ0JBQUFBLFUseUJBQUFBLFU7QUFBWUMsZ0JBQUFBLFUseUJBQUFBLFU7QUFDbEMsNENBQWlCb0MsV0FBakI7bURBQ087QUFBRXRDLGtCQUFBQSxJQUFJLEVBQUpBLElBQUY7QUFBUUMsa0JBQUFBLFVBQVUsRUFBVkEsVUFBUjtBQUFvQkMsa0JBQUFBLFVBQVUsRUFBVkEsVUFBcEI7QUFBZ0NsQixrQkFBQUEsS0FBSyxFQUFMQTtBQUFoQyxpQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozt3SEFHYXlELEUsRUFBWXhDLFUsRUFBc0JDLFUsRUFBc0JsQixLOzs7Ozs7QUFDeEUwRCxnQkFBQUEsVSxHQUFhLEM7QUFDWEMsZ0JBQUFBLEksR0FBTyxFO0FBQ1RoQixnQkFBQUEsRyxHQUFNLEM7QUFDTmlCLGdCQUFBQSxxQixHQUF3QixDOzs7c0JBRXJCRixVQUFVLEdBQUcsQ0FBYixHQUFpQkQsRUFBRSxDQUFDcEUsTTs7Ozs7QUFDbkJ3RSxnQkFBQUEsUyxHQUFZSixFQUFFLENBQUN0RixXQUFILENBQWV1RixVQUFmLEM7QUFDWkksZ0JBQUFBLFEsR0FBV0osVUFBVSxHQUFHLENBQWIsR0FBaUJHLFNBQWpCLEdBQTZCLEMsRUFFOUM7O0FBQ0Esb0JBQUkzQyxVQUFKLEVBQWdCO0FBQ2QseUJBQU93QyxVQUFVLEdBQUcxRCxLQUFLLENBQUN3RCxJQUFOLENBQVdPLFlBQXhCLElBQXdDN0MsVUFBVSxDQUFDeUIsR0FBRyxFQUFKLENBQXpELEVBQWtFLENBQUU7O0FBQ3BFQSxrQkFBQUEsR0FBRztBQUNKLGlCLENBRUQ7OztzQkFDSW1CLFFBQVEsR0FBR0wsRUFBRSxDQUFDcEUsTTs7Ozs7QUFDVmtDLGdCQUFBQSxPLEdBQVUsSUFBSXlDLGVBQUosQ0FBZTtBQUM3QkMsa0JBQUFBLEtBQUssRUFBRTtBQUNMQyxvQkFBQUEsU0FBUyxFQUFFVCxFQUROO0FBRUw5RSxvQkFBQUEsS0FBSyxFQUFFK0UsVUFGRjtBQUdMUyxvQkFBQUEsR0FBRyxFQUFFTDtBQUhBLG1CQURzQjtBQU03QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBTSxrQkFBQUEsVUFBVSxFQUFFbkQsVUFBVSxHQUNsQkEsVUFBVSxDQUFDMEIsR0FBRCxDQUFWLElBQW1CLEtBQUssQ0FBeEIsS0FDQ2UsVUFBVSxHQUFHeEMsVUFBVSxDQUFDeUIsR0FBRCxDQUR4QixJQUVBM0MsS0FBSyxDQUFDd0QsSUFBTixDQUFXTyxZQUZYLEdBR0EsQ0FKa0IsR0FLbEJNLG1CQUFNQyxNQUFOLENBQWEsb0JBQUFiLEVBQUUsTUFBRixDQUFBQSxFQUFFLEVBQU9DLFVBQVAsRUFBbUJJLFFBQW5CLENBQWY7QUEzQnlCLGlCQUFmLEM7QUE4QmhCSCxnQkFBQUEsSUFBSSxDQUFDdkUsSUFBTCxDQUFVbUMsT0FBVjtBQUNBcUMsZ0JBQUFBLHFCQUFxQjs7c0JBQ2pCQSxxQkFBcUIsR0FBRyxHOzs7Ozs7dUJBQ3BCLG1CQUFRLENBQVIsQzs7O0FBQ05BLGdCQUFBQSxxQkFBcUIsR0FBRyxDQUF4Qjs7O0FBSUpGLGdCQUFBQSxVQUFVLEdBQUdJLFFBQVEsR0FBRyxDQUF4Qjs7Ozs7bURBRUtILEk7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7a0hBR09ZLE87Ozs7OztBQUNSQyxnQkFBQUEsSyxHQUFRLEtBQUtoRyxVQUFMLElBQW1CLEtBQUtBLFVBQUwsQ0FBZ0IrRixPQUFoQixDO21EQUMxQixLQUFLL0gsS0FBTCxDQUFXaUksU0FBWCxDQUFxQkQsS0FBckIsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztrSEFHT0QsTzs7Ozs7O0FBQ1JDLGdCQUFBQSxLLEdBQVEsS0FBS2hHLFVBQUwsSUFBbUIsS0FBS0EsVUFBTCxDQUFnQitGLE9BQWhCLEM7bURBQzFCLEtBQUsvSCxLQUFMLENBQVdrSSxTQUFYLENBQXFCRixLQUFyQixDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O2lIQUdNRCxPLEVBQWlCNUYsSyxFQUFnQndGLEc7Ozs7Ozs7dUJBQ3hDLEtBQUszSCxLQUFMLENBQVdjLEtBQVgsRTs7O0FBQ0FxSCxnQkFBQUEsSyxHQUFRLEtBQUtuRyxVQUFMLElBQW1CLEtBQUtBLFVBQUwsQ0FBZ0IrRixPQUFoQixDO21EQUMxQixLQUFLL0gsS0FBTCxDQUFXb0ksUUFBWCxDQUFvQkQsS0FBcEIsRUFBMkJoRyxLQUEzQixFQUFrQ3dGLEdBQWxDLEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQWJvcnRhYmxlUHJvbWlzZUNhY2hlIGZyb20gJ2Fib3J0YWJsZS1wcm9taXNlLWNhY2hlJ1xuaW1wb3J0IEJBSSBmcm9tICcuL2JhaSdcbmltcG9ydCBDU0kgZnJvbSAnLi9jc2knXG5pbXBvcnQgQ2h1bmsgZnJvbSAnLi9jaHVuaydcbmltcG9ydCBjcmMzMiBmcm9tICdidWZmZXItY3JjMzInXG5cbmltcG9ydCB7IHVuemlwLCB1bnppcENodW5rU2xpY2UgfSBmcm9tICdAZ21vZC9iZ3pmLWZpbGVoYW5kbGUnXG5cbmltcG9ydCBlbnRyaWVzIGZyb20gJ29iamVjdC5lbnRyaWVzLXBvbnlmaWxsJ1xuaW1wb3J0IExSVSBmcm9tICdxdWljay1scnUnXG5pbXBvcnQgeyBMb2NhbEZpbGUsIFJlbW90ZUZpbGUsIEdlbmVyaWNGaWxlaGFuZGxlIH0gZnJvbSAnZ2VuZXJpYy1maWxlaGFuZGxlJ1xuaW1wb3J0IEJBTUZlYXR1cmUgZnJvbSAnLi9yZWNvcmQnXG5pbXBvcnQgSW5kZXhGaWxlIGZyb20gJy4vaW5kZXhGaWxlJ1xuaW1wb3J0IHsgcGFyc2VIZWFkZXJUZXh0IH0gZnJvbSAnLi9zYW0nXG5pbXBvcnQgeyBhYm9ydEJyZWFrUG9pbnQsIGNoZWNrQWJvcnRTaWduYWwsIHRpbWVvdXQsIG1ha2VPcHRzLCBCYW1PcHRzLCBCYXNlT3B0cyB9IGZyb20gJy4vdXRpbCdcblxuZXhwb3J0IGNvbnN0IEJBTV9NQUdJQyA9IDIxODQwMTk0XG5cbmNvbnN0IGJsb2NrTGVuID0gMSA8PCAxNlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYW1GaWxlIHtcbiAgcHJpdmF0ZSByZW5hbWVSZWZTZXE6IChhOiBzdHJpbmcpID0+IHN0cmluZ1xuICBwcml2YXRlIGJhbTogR2VuZXJpY0ZpbGVoYW5kbGVcbiAgcHJpdmF0ZSBpbmRleDogSW5kZXhGaWxlXG4gIHByaXZhdGUgY2h1bmtTaXplTGltaXQ6IG51bWJlclxuICBwcml2YXRlIGZldGNoU2l6ZUxpbWl0OiBudW1iZXJcbiAgcHJpdmF0ZSBoZWFkZXI6IGFueVxuICBwcm90ZWN0ZWQgZmVhdHVyZUNhY2hlOiBhbnlcbiAgcHJvdGVjdGVkIGNoclRvSW5kZXg6IGFueVxuICBwcm90ZWN0ZWQgaW5kZXhUb0NocjogYW55XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5iYW1QYXRoXVxuICAgKiBAcGFyYW0ge0ZpbGVIYW5kbGV9IFthcmdzLmJhbUZpbGVoYW5kbGVdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5iYWlQYXRoXVxuICAgKiBAcGFyYW0ge0ZpbGVIYW5kbGV9IFthcmdzLmJhaUZpbGVoYW5kbGVdXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgYmFtRmlsZWhhbmRsZSxcbiAgICBiYW1QYXRoLFxuICAgIGJhbVVybCxcbiAgICBiYWlQYXRoLFxuICAgIGJhaUZpbGVoYW5kbGUsXG4gICAgYmFpVXJsLFxuICAgIGNzaVBhdGgsXG4gICAgY3NpRmlsZWhhbmRsZSxcbiAgICBjc2lVcmwsXG4gICAgY2FjaGVTaXplLFxuICAgIGZldGNoU2l6ZUxpbWl0LFxuICAgIGNodW5rU2l6ZUxpbWl0LFxuICAgIHJlbmFtZVJlZlNlcXMgPSBuID0+IG4sXG4gIH06IHtcbiAgICBiYW1GaWxlaGFuZGxlPzogR2VuZXJpY0ZpbGVoYW5kbGVcbiAgICBiYW1QYXRoPzogc3RyaW5nXG4gICAgYmFtVXJsPzogc3RyaW5nXG4gICAgYmFpUGF0aD86IHN0cmluZ1xuICAgIGJhaUZpbGVoYW5kbGU/OiBHZW5lcmljRmlsZWhhbmRsZVxuICAgIGJhaVVybD86IHN0cmluZ1xuICAgIGNzaVBhdGg/OiBzdHJpbmdcbiAgICBjc2lGaWxlaGFuZGxlPzogR2VuZXJpY0ZpbGVoYW5kbGVcbiAgICBjc2lVcmw/OiBzdHJpbmdcbiAgICBjYWNoZVNpemU/OiBudW1iZXJcbiAgICBmZXRjaFNpemVMaW1pdD86IG51bWJlclxuICAgIGNodW5rU2l6ZUxpbWl0PzogbnVtYmVyXG4gICAgcmVuYW1lUmVmU2Vxcz86IChhOiBzdHJpbmcpID0+IHN0cmluZ1xuICB9KSB7XG4gICAgdGhpcy5yZW5hbWVSZWZTZXEgPSByZW5hbWVSZWZTZXFzXG5cbiAgICBpZiAoYmFtRmlsZWhhbmRsZSkge1xuICAgICAgdGhpcy5iYW0gPSBiYW1GaWxlaGFuZGxlXG4gICAgfSBlbHNlIGlmIChiYW1QYXRoKSB7XG4gICAgICB0aGlzLmJhbSA9IG5ldyBMb2NhbEZpbGUoYmFtUGF0aClcbiAgICB9IGVsc2UgaWYgKGJhbVVybCkge1xuICAgICAgdGhpcy5iYW0gPSBuZXcgUmVtb3RlRmlsZShiYW1VcmwpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5hYmxlIHRvIGluaXRpYWxpemUgYmFtJylcbiAgICB9XG4gICAgaWYgKGNzaUZpbGVoYW5kbGUpIHtcbiAgICAgIHRoaXMuaW5kZXggPSBuZXcgQ1NJKHsgZmlsZWhhbmRsZTogY3NpRmlsZWhhbmRsZSB9KVxuICAgIH0gZWxzZSBpZiAoY3NpUGF0aCkge1xuICAgICAgdGhpcy5pbmRleCA9IG5ldyBDU0koeyBmaWxlaGFuZGxlOiBuZXcgTG9jYWxGaWxlKGNzaVBhdGgpIH0pXG4gICAgfSBlbHNlIGlmIChjc2lVcmwpIHtcbiAgICAgIHRoaXMuaW5kZXggPSBuZXcgQ1NJKHsgZmlsZWhhbmRsZTogbmV3IFJlbW90ZUZpbGUoY3NpVXJsKSB9KVxuICAgIH0gZWxzZSBpZiAoYmFpRmlsZWhhbmRsZSkge1xuICAgICAgdGhpcy5pbmRleCA9IG5ldyBCQUkoeyBmaWxlaGFuZGxlOiBiYWlGaWxlaGFuZGxlIH0pXG4gICAgfSBlbHNlIGlmIChiYWlQYXRoKSB7XG4gICAgICB0aGlzLmluZGV4ID0gbmV3IEJBSSh7IGZpbGVoYW5kbGU6IG5ldyBMb2NhbEZpbGUoYmFpUGF0aCkgfSlcbiAgICB9IGVsc2UgaWYgKGJhaVVybCkge1xuICAgICAgdGhpcy5pbmRleCA9IG5ldyBCQUkoeyBmaWxlaGFuZGxlOiBuZXcgUmVtb3RlRmlsZShiYWlVcmwpIH0pXG4gICAgfSBlbHNlIGlmIChiYW1QYXRoKSB7XG4gICAgICB0aGlzLmluZGV4ID0gbmV3IEJBSSh7IGZpbGVoYW5kbGU6IG5ldyBMb2NhbEZpbGUoYCR7YmFtUGF0aH0uYmFpYCkgfSlcbiAgICB9IGVsc2UgaWYgKGJhbVVybCkge1xuICAgICAgdGhpcy5pbmRleCA9IG5ldyBCQUkoeyBmaWxlaGFuZGxlOiBuZXcgUmVtb3RlRmlsZShgJHtiYW1Vcmx9LmJhaWApIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5hYmxlIHRvIGluZmVyIGluZGV4IGZvcm1hdCcpXG4gICAgfVxuICAgIHRoaXMuZmVhdHVyZUNhY2hlID0gbmV3IEFib3J0YWJsZVByb21pc2VDYWNoZSh7XG4gICAgICBjYWNoZTogbmV3IExSVSh7XG4gICAgICAgIG1heFNpemU6IGNhY2hlU2l6ZSAhPT0gdW5kZWZpbmVkID8gY2FjaGVTaXplIDogNTAsXG4gICAgICB9KSxcbiAgICAgIGZpbGw6IHRoaXMuX3JlYWRDaHVuay5iaW5kKHRoaXMpLFxuICAgIH0pXG4gICAgdGhpcy5mZXRjaFNpemVMaW1pdCA9IGZldGNoU2l6ZUxpbWl0IHx8IDUwMDAwMDAwMCAvLyA1MDBNQlxuICAgIHRoaXMuY2h1bmtTaXplTGltaXQgPSBjaHVua1NpemVMaW1pdCB8fCAzMDAwMDAwMDAgLy8gMzAwTUJcbiAgfVxuXG4gIGFzeW5jIGdldEhlYWRlcihvcmlnT3B0czogQWJvcnRTaWduYWwgfCBCYXNlT3B0cyA9IHt9KSB7XG4gICAgY29uc3Qgb3B0cyA9IG1ha2VPcHRzKG9yaWdPcHRzKVxuICAgIGNvbnN0IGluZGV4RGF0YSA9IGF3YWl0IHRoaXMuaW5kZXgucGFyc2Uob3B0cylcbiAgICBjb25zdCByZXQgPSBpbmRleERhdGEuZmlyc3REYXRhTGluZSA/IGluZGV4RGF0YS5maXJzdERhdGFMaW5lLmJsb2NrUG9zaXRpb24gKyA2NTUzNSA6IHVuZGVmaW5lZFxuICAgIGxldCBidWZmZXJcbiAgICBpZiAocmV0KSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmJhbS5yZWFkKEJ1ZmZlci5hbGxvYyhyZXQgKyBibG9ja0xlbiksIDAsIHJldCArIGJsb2NrTGVuLCAwLCBvcHRzKVxuXG4gICAgICBjb25zdCB7IGJ5dGVzUmVhZCB9ID0gcmVzXG4gICAgICA7KHsgYnVmZmVyIH0gPSByZXMpXG4gICAgICBpZiAoIWJ5dGVzUmVhZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yIHJlYWRpbmcgaGVhZGVyJylcbiAgICAgIH1cbiAgICAgIGlmIChieXRlc1JlYWQgPCByZXQpIHtcbiAgICAgICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKDAsIGJ5dGVzUmVhZClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZSgwLCByZXQpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1ZmZlciA9IChhd2FpdCB0aGlzLmJhbS5yZWFkRmlsZShvcHRzKSkgYXMgQnVmZmVyXG4gICAgfVxuXG4gICAgY29uc3QgdW5jYmEgPSBhd2FpdCB1bnppcChidWZmZXIpXG5cbiAgICBpZiAodW5jYmEucmVhZEludDMyTEUoMCkgIT09IEJBTV9NQUdJQykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgYSBCQU0gZmlsZScpXG4gICAgfVxuICAgIGNvbnN0IGhlYWRMZW4gPSB1bmNiYS5yZWFkSW50MzJMRSg0KVxuXG4gICAgdGhpcy5oZWFkZXIgPSB1bmNiYS50b1N0cmluZygndXRmOCcsIDgsIDggKyBoZWFkTGVuKVxuICAgIGNvbnN0IHsgY2hyVG9JbmRleCwgaW5kZXhUb0NociB9ID0gYXdhaXQgdGhpcy5fcmVhZFJlZlNlcXMoaGVhZExlbiArIDgsIDY1NTM1LCBvcHRzKVxuICAgIHRoaXMuY2hyVG9JbmRleCA9IGNoclRvSW5kZXhcbiAgICB0aGlzLmluZGV4VG9DaHIgPSBpbmRleFRvQ2hyXG5cbiAgICByZXR1cm4gcGFyc2VIZWFkZXJUZXh0KHRoaXMuaGVhZGVyKVxuICB9XG5cbiAgYXN5bmMgZ2V0SGVhZGVyVGV4dChvcHRzOiBCYXNlT3B0cyA9IHt9KSB7XG4gICAgYXdhaXQgdGhpcy5nZXRIZWFkZXIob3B0cylcbiAgICByZXR1cm4gdGhpcy5oZWFkZXJcbiAgfVxuXG4gIC8vIHRoZSBmdWxsIGxlbmd0aCBvZiB0aGUgcmVmc2VxIGJsb2NrIGlzIG5vdCBnaXZlbiBpbiBhZHZhbmNlIHNvIHRoaXMgZ3JhYnMgYSBjaHVuayBhbmRcbiAgLy8gZG91YmxlcyBpdCBpZiBhbGwgcmVmc2VxcyBoYXZlbid0IGJlZW4gcHJvY2Vzc2VkXG4gIGFzeW5jIF9yZWFkUmVmU2VxcyhcbiAgICBzdGFydDogbnVtYmVyLFxuICAgIHJlZlNlcUJ5dGVzOiBudW1iZXIsXG4gICAgb3B0czogQmFzZU9wdHMgPSB7fSxcbiAgKTogUHJvbWlzZTx7XG4gICAgY2hyVG9JbmRleDogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfVxuICAgIGluZGV4VG9DaHI6IHsgcmVmTmFtZTogc3RyaW5nOyBsZW5ndGg6IG51bWJlciB9W11cbiAgfT4ge1xuICAgIGlmIChzdGFydCA+IHJlZlNlcUJ5dGVzKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZFJlZlNlcXMoc3RhcnQsIHJlZlNlcUJ5dGVzICogMiwgb3B0cylcbiAgICB9XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5iYW0ucmVhZChCdWZmZXIuYWxsb2MocmVmU2VxQnl0ZXMgKyBibG9ja0xlbiksIDAsIHJlZlNlcUJ5dGVzLCAwLCBvcHRzKVxuICAgIGNvbnN0IHsgYnl0ZXNSZWFkIH0gPSByZXNcbiAgICBsZXQgeyBidWZmZXIgfSA9IHJlc1xuICAgIGlmICghYnl0ZXNSZWFkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yIHJlYWRpbmcgcmVmc2VxcyBmcm9tIGhlYWRlcicpXG4gICAgfVxuICAgIGlmIChieXRlc1JlYWQgPCByZWZTZXFCeXRlcykge1xuICAgICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKDAsIGJ5dGVzUmVhZClcbiAgICB9IGVsc2Uge1xuICAgICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKDAsIHJlZlNlcUJ5dGVzKVxuICAgIH1cbiAgICBjb25zdCB1bmNiYSA9IGF3YWl0IHVuemlwKGJ1ZmZlcilcbiAgICBjb25zdCBuUmVmID0gdW5jYmEucmVhZEludDMyTEUoc3RhcnQpXG4gICAgbGV0IHAgPSBzdGFydCArIDRcbiAgICBjb25zdCBjaHJUb0luZGV4OiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge31cbiAgICBjb25zdCBpbmRleFRvQ2hyOiB7IHJlZk5hbWU6IHN0cmluZzsgbGVuZ3RoOiBudW1iZXIgfVtdID0gW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5SZWY7IGkgKz0gMSkge1xuICAgICAgYXdhaXQgYWJvcnRCcmVha1BvaW50KG9wdHMuc2lnbmFsKVxuICAgICAgY29uc3QgbE5hbWUgPSB1bmNiYS5yZWFkSW50MzJMRShwKVxuICAgICAgbGV0IHJlZk5hbWUgPSB1bmNiYS50b1N0cmluZygndXRmOCcsIHAgKyA0LCBwICsgNCArIGxOYW1lIC0gMSlcbiAgICAgIHJlZk5hbWUgPSB0aGlzLnJlbmFtZVJlZlNlcShyZWZOYW1lKVxuICAgICAgY29uc3QgbFJlZiA9IHVuY2JhLnJlYWRJbnQzMkxFKHAgKyBsTmFtZSArIDQpXG5cbiAgICAgIGNoclRvSW5kZXhbcmVmTmFtZV0gPSBpXG4gICAgICBpbmRleFRvQ2hyLnB1c2goeyByZWZOYW1lLCBsZW5ndGg6IGxSZWYgfSlcblxuICAgICAgcCA9IHAgKyA4ICsgbE5hbWVcbiAgICAgIGlmIChwID4gdW5jYmEubGVuZ3RoKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgQkFNIGhlYWRlciBpcyB2ZXJ5IGJpZy4gIFJlLWZldGNoaW5nICR7cmVmU2VxQnl0ZXN9IGJ5dGVzLmApXG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkUmVmU2VxcyhzdGFydCwgcmVmU2VxQnl0ZXMgKiAyLCBvcHRzKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBjaHJUb0luZGV4LCBpbmRleFRvQ2hyIH1cbiAgfVxuXG4gIGFzeW5jIGdldFJlY29yZHNGb3JSYW5nZShcbiAgICBjaHI6IHN0cmluZyxcbiAgICBtaW46IG51bWJlcixcbiAgICBtYXg6IG51bWJlcixcbiAgICBvcHRzOiBCYW1PcHRzID0geyB2aWV3QXNQYWlyczogZmFsc2UsIHBhaXJBY3Jvc3NDaHI6IGZhbHNlLCBtYXhJbnNlcnRTaXplOiAyMDAwMDAgfSxcbiAgKSB7XG4gICAgbGV0IHJlY29yZHM6IEJBTUZlYXR1cmVbXSA9IFtdXG4gICAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiB0aGlzLnN0cmVhbVJlY29yZHNGb3JSYW5nZShjaHIsIG1pbiwgbWF4LCBvcHRzKSkge1xuICAgICAgcmVjb3JkcyA9IHJlY29yZHMuY29uY2F0KGNodW5rKVxuICAgIH1cbiAgICByZXR1cm4gcmVjb3Jkc1xuICB9XG5cbiAgYXN5bmMgKnN0cmVhbVJlY29yZHNGb3JSYW5nZShcbiAgICBjaHI6IHN0cmluZyxcbiAgICBtaW46IG51bWJlcixcbiAgICBtYXg6IG51bWJlcixcbiAgICBvcHRzOiBCYW1PcHRzID0geyB2aWV3QXNQYWlyczogZmFsc2UsIHBhaXJBY3Jvc3NDaHI6IGZhbHNlLCBtYXhJbnNlcnRTaXplOiAyMDAwMDAgfSxcbiAgKSB7XG4gICAgLy8gdG9kbyByZWd1bGFyaXplIHJlZnNlcSBuYW1lc1xuICAgIG9wdHMudmlld0FzUGFpcnMgPSBvcHRzLnZpZXdBc1BhaXJzIHx8IGZhbHNlXG4gICAgb3B0cy5wYWlyQWNyb3NzQ2hyID0gb3B0cy5wYWlyQWNyb3NzQ2hyIHx8IGZhbHNlXG4gICAgb3B0cy5tYXhJbnNlcnRTaXplID0gb3B0cy5tYXhJbnNlcnRTaXplICE9PSB1bmRlZmluZWQgPyBvcHRzLm1heEluc2VydFNpemUgOiAyMDAwMDBcbiAgICBjb25zdCBjaHJJZCA9IHRoaXMuY2hyVG9JbmRleCAmJiB0aGlzLmNoclRvSW5kZXhbY2hyXVxuICAgIGxldCBjaHVua3M6IENodW5rW11cbiAgICBpZiAoIShjaHJJZCA+PSAwKSkge1xuICAgICAgY2h1bmtzID0gW11cbiAgICB9IGVsc2Uge1xuICAgICAgY2h1bmtzID0gYXdhaXQgdGhpcy5pbmRleC5ibG9ja3NGb3JSYW5nZShjaHJJZCwgbWluIC0gMSwgbWF4LCBvcHRzKVxuXG4gICAgICBpZiAoIWNodW5rcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yIGluIGluZGV4IGZldGNoJylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNodW5rcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgYXdhaXQgYWJvcnRCcmVha1BvaW50KG9wdHMuc2lnbmFsKVxuICAgICAgY29uc3Qgc2l6ZSA9IGNodW5rc1tpXS5mZXRjaGVkU2l6ZSgpXG4gICAgICBpZiAoc2l6ZSA+IHRoaXMuY2h1bmtTaXplTGltaXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUb28gbWFueSBCQU0gZmVhdHVyZXMuIEJBTSBjaHVuayBzaXplICR7c2l6ZX0gYnl0ZXMgZXhjZWVkcyBjaHVua1NpemVMaW1pdCBvZiAke3RoaXMuY2h1bmtTaXplTGltaXR9YCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRvdGFsU2l6ZSA9IGNodW5rc1xuICAgICAgLm1hcCgoczogQ2h1bmspID0+IHMuZmV0Y2hlZFNpemUoKSlcbiAgICAgIC5yZWR1Y2UoKGE6IG51bWJlciwgYjogbnVtYmVyKSA9PiBhICsgYiwgMClcbiAgICBpZiAodG90YWxTaXplID4gdGhpcy5mZXRjaFNpemVMaW1pdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgZGF0YSBzaXplIG9mICR7dG90YWxTaXplLnRvTG9jYWxlU3RyaW5nKCl9IGJ5dGVzIGV4Y2VlZGVkIGZldGNoIHNpemUgbGltaXQgb2YgJHt0aGlzLmZldGNoU2l6ZUxpbWl0LnRvTG9jYWxlU3RyaW5nKCl9IGJ5dGVzYCxcbiAgICAgIClcbiAgICB9XG4gICAgeWllbGQqIHRoaXMuX2ZldGNoQ2h1bmtGZWF0dXJlcyhjaHVua3MsIGNocklkLCBtaW4sIG1heCwgb3B0cylcbiAgfVxuXG4gIGFzeW5jICpfZmV0Y2hDaHVua0ZlYXR1cmVzKFxuICAgIGNodW5rczogQ2h1bmtbXSxcbiAgICBjaHJJZDogbnVtYmVyLFxuICAgIG1pbjogbnVtYmVyLFxuICAgIG1heDogbnVtYmVyLFxuICAgIG9wdHM6IEJhbU9wdHMsXG4gICkge1xuICAgIGNvbnN0IGZlYXRQcm9taXNlcyA9IFtdXG4gICAgbGV0IGRvbmUgPSBmYWxzZVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaHVua3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGMgPSBjaHVua3NbaV1cbiAgICAgIGNvbnN0IHsgZGF0YSwgY3Bvc2l0aW9ucywgZHBvc2l0aW9ucywgY2h1bmsgfSA9IGF3YWl0IHRoaXMuZmVhdHVyZUNhY2hlLmdldChcbiAgICAgICAgYy50b1N0cmluZygpLFxuICAgICAgICB7IGNodW5rOiBjLCBvcHRzIH0sXG4gICAgICAgIG9wdHMuc2lnbmFsLFxuICAgICAgKVxuICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMucmVhZEJhbUZlYXR1cmVzKGRhdGEsIGNwb3NpdGlvbnMsIGRwb3NpdGlvbnMsIGNodW5rKS50aGVuKHJlY29yZHMgPT4ge1xuICAgICAgICBjb25zdCByZWNzID0gW11cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWNvcmRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgY29uc3QgZmVhdHVyZSA9IHJlY29yZHNbaV1cbiAgICAgICAgICBpZiAoZmVhdHVyZS5zZXFfaWQoKSA9PT0gY2hySWQpIHtcbiAgICAgICAgICAgIGlmIChmZWF0dXJlLmdldCgnc3RhcnQnKSA+PSBtYXgpIHtcbiAgICAgICAgICAgICAgLy8gcGFzdCBlbmQgb2YgcmFuZ2UsIGNhbiBzdG9wIGl0ZXJhdGluZ1xuICAgICAgICAgICAgICBkb25lID0gdHJ1ZVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmZWF0dXJlLmdldCgnZW5kJykgPj0gbWluKSB7XG4gICAgICAgICAgICAgIC8vIG11c3QgYmUgaW4gcmFuZ2VcbiAgICAgICAgICAgICAgcmVjcy5wdXNoKGZlYXR1cmUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWNzXG4gICAgICB9KVxuICAgICAgZmVhdFByb21pc2VzLnB1c2gocHJvbWlzZSlcbiAgICAgIGF3YWl0IHByb21pc2VcbiAgICAgIGlmIChkb25lKSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgY2hlY2tBYm9ydFNpZ25hbChvcHRzLnNpZ25hbClcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmVhdFByb21pc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB5aWVsZCBmZWF0UHJvbWlzZXNbaV1cbiAgICB9XG4gICAgY2hlY2tBYm9ydFNpZ25hbChvcHRzLnNpZ25hbClcbiAgICBpZiAob3B0cy52aWV3QXNQYWlycykge1xuICAgICAgeWllbGQgdGhpcy5mZXRjaFBhaXJzKGNocklkLCBmZWF0UHJvbWlzZXMsIG9wdHMpXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZmV0Y2hQYWlycyhjaHJJZDogbnVtYmVyLCBmZWF0UHJvbWlzZXM6IFByb21pc2U8QkFNRmVhdHVyZVtdPltdLCBvcHRzOiBCYW1PcHRzKSB7XG4gICAgY29uc3QgdW5tYXRlZFBhaXJzOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9XG4gICAgY29uc3QgcmVhZElkczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBmZWF0UHJvbWlzZXMubWFwKGFzeW5jIGYgPT4ge1xuICAgICAgICBjb25zdCByZXQgPSBhd2FpdCBmXG4gICAgICAgIGNvbnN0IHJlYWROYW1lczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IHJldFtpXS5uYW1lKClcbiAgICAgICAgICBjb25zdCBpZCA9IHJldFtpXS5pZCgpXG4gICAgICAgICAgaWYgKCFyZWFkTmFtZXNbbmFtZV0pIHtcbiAgICAgICAgICAgIHJlYWROYW1lc1tuYW1lXSA9IDBcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVhZE5hbWVzW25hbWVdKytcbiAgICAgICAgICByZWFkSWRzW2lkXSA9IDFcbiAgICAgICAgfVxuICAgICAgICBlbnRyaWVzKHJlYWROYW1lcykuZm9yRWFjaCgoW2ssIHZdOiBbc3RyaW5nLCBudW1iZXJdKSA9PiB7XG4gICAgICAgICAgaWYgKHYgPT09IDEpIHtcbiAgICAgICAgICAgIHVubWF0ZWRQYWlyc1trXSA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9KSxcbiAgICApXG5cbiAgICBjb25zdCBtYXRlUHJvbWlzZXM6IFByb21pc2U8Q2h1bmtbXT5bXSA9IFtdXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBmZWF0UHJvbWlzZXMubWFwKGFzeW5jIGYgPT4ge1xuICAgICAgICBjb25zdCByZXQgPSBhd2FpdCBmXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IHJldFtpXS5uYW1lKClcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB1bm1hdGVkUGFpcnNbbmFtZV0gJiZcbiAgICAgICAgICAgIChvcHRzLnBhaXJBY3Jvc3NDaHIgfHxcbiAgICAgICAgICAgICAgKHJldFtpXS5fbmV4dF9yZWZpZCgpID09PSBjaHJJZCAmJlxuICAgICAgICAgICAgICAgIE1hdGguYWJzKHJldFtpXS5nZXQoJ3N0YXJ0JykgLSByZXRbaV0uX25leHRfcG9zKCkpIDxcbiAgICAgICAgICAgICAgICAgIChvcHRzLm1heEluc2VydFNpemUgfHwgMjAwMDAwKSkpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBtYXRlUHJvbWlzZXMucHVzaChcbiAgICAgICAgICAgICAgdGhpcy5pbmRleC5ibG9ja3NGb3JSYW5nZShcbiAgICAgICAgICAgICAgICByZXRbaV0uX25leHRfcmVmaWQoKSxcbiAgICAgICAgICAgICAgICByZXRbaV0uX25leHRfcG9zKCksXG4gICAgICAgICAgICAgICAgcmV0W2ldLl9uZXh0X3BvcygpICsgMSxcbiAgICAgICAgICAgICAgICBvcHRzLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgKVxuXG4gICAgY29uc3QgbWF0ZUJsb2NrcyA9IGF3YWl0IFByb21pc2UuYWxsKG1hdGVQcm9taXNlcylcbiAgICBsZXQgbWF0ZUNodW5rczogQ2h1bmtbXSA9IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXRlQmxvY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBtYXRlQ2h1bmtzID0gbWF0ZUNodW5rcy5jb25jYXQobWF0ZUJsb2Nrc1tpXSlcbiAgICB9XG4gICAgLy8gZmlsdGVyIG91dCBkdXBsaWNhdGUgY2h1bmtzICh0aGUgYmxvY2tzIGFyZSBsaXN0cyBvZiBjaHVua3MsIGJsb2NrcyBhcmUgY29uY2F0ZW5hdGVkLCB0aGVuIGZpbHRlciBkdXAgY2h1bmtzKVxuICAgIG1hdGVDaHVua3MgPSBtYXRlQ2h1bmtzXG4gICAgICAuc29ydCgpXG4gICAgICAuZmlsdGVyKChpdGVtLCBwb3MsIGFyeSkgPT4gIXBvcyB8fCBpdGVtLnRvU3RyaW5nKCkgIT09IGFyeVtwb3MgLSAxXS50b1N0cmluZygpKVxuXG4gICAgY29uc3QgbWF0ZVRvdGFsU2l6ZSA9IG1hdGVDaHVua3MubWFwKHMgPT4gcy5mZXRjaGVkU2l6ZSgpKS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKVxuICAgIGlmIChtYXRlVG90YWxTaXplID4gdGhpcy5mZXRjaFNpemVMaW1pdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgZGF0YSBzaXplIG9mICR7bWF0ZVRvdGFsU2l6ZS50b0xvY2FsZVN0cmluZygpfSBieXRlcyBleGNlZWRlZCBmZXRjaCBzaXplIGxpbWl0IG9mICR7dGhpcy5mZXRjaFNpemVMaW1pdC50b0xvY2FsZVN0cmluZygpfSBieXRlc2AsXG4gICAgICApXG4gICAgfVxuICAgIGNvbnN0IG1hdGVGZWF0UHJvbWlzZXMgPSBtYXRlQ2h1bmtzLm1hcChhc3luYyBjID0+IHtcbiAgICAgIGNvbnN0IHsgZGF0YSwgY3Bvc2l0aW9ucywgZHBvc2l0aW9ucywgY2h1bmsgfSA9IGF3YWl0IHRoaXMuZmVhdHVyZUNhY2hlLmdldChcbiAgICAgICAgYy50b1N0cmluZygpLFxuICAgICAgICB7IGNodW5rOiBjLCBvcHRzIH0sXG4gICAgICAgIG9wdHMuc2lnbmFsLFxuICAgICAgKVxuICAgICAgY29uc3QgZmVhdHMgPSBhd2FpdCB0aGlzLnJlYWRCYW1GZWF0dXJlcyhkYXRhLCBjcG9zaXRpb25zLCBkcG9zaXRpb25zLCBjaHVuaylcbiAgICAgIGNvbnN0IG1hdGVSZWNzID0gW11cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmVhdHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgY29uc3QgZmVhdHVyZSA9IGZlYXRzW2ldXG4gICAgICAgIGlmICh1bm1hdGVkUGFpcnNbZmVhdHVyZS5nZXQoJ25hbWUnKV0gJiYgIXJlYWRJZHNbZmVhdHVyZS5pZCgpXSkge1xuICAgICAgICAgIG1hdGVSZWNzLnB1c2goZmVhdHVyZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG1hdGVSZWNzXG4gICAgfSlcbiAgICBjb25zdCBuZXdNYXRlRmVhdHMgPSBhd2FpdCBQcm9taXNlLmFsbChtYXRlRmVhdFByb21pc2VzKVxuICAgIGxldCBmZWF0dXJlc1JldDogQkFNRmVhdHVyZVtdID0gW11cbiAgICBpZiAobmV3TWF0ZUZlYXRzLmxlbmd0aCkge1xuICAgICAgY29uc3QgbmV3TWF0ZXMgPSBuZXdNYXRlRmVhdHMucmVkdWNlKChyZXN1bHQsIGN1cnJlbnQpID0+IHJlc3VsdC5jb25jYXQoY3VycmVudCkpXG4gICAgICBmZWF0dXJlc1JldCA9IGZlYXR1cmVzUmV0LmNvbmNhdChuZXdNYXRlcylcbiAgICB9XG4gICAgcmV0dXJuIGZlYXR1cmVzUmV0XG4gIH1cblxuICBhc3luYyBfcmVhZENodW5rKHsgY2h1bmssIG9wdHMgfTogeyBjaHVuazogdW5rbm93bjsgb3B0czogQmFzZU9wdHMgfSwgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCkge1xuICAgIGNvbnN0IGMgPSBjaHVuayBhcyBDaHVua1xuICAgIGNvbnN0IGJ1ZnNpemUgPSBjLmZldGNoZWRTaXplKClcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmJhbS5yZWFkKEJ1ZmZlci5hbGxvYyhidWZzaXplKSwgMCwgYnVmc2l6ZSwgYy5taW52LmJsb2NrUG9zaXRpb24sIG9wdHMpXG4gICAgY29uc3QgeyBieXRlc1JlYWQgfSA9IHJlc1xuICAgIGxldCB7IGJ1ZmZlciB9ID0gcmVzXG4gICAgY2hlY2tBYm9ydFNpZ25hbChhYm9ydFNpZ25hbClcbiAgICBpZiAoIWJ5dGVzUmVhZCkge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICAgIGlmIChieXRlc1JlYWQgPCBidWZzaXplKSB7XG4gICAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoMCwgYnl0ZXNSZWFkKVxuICAgIH0gZWxzZSB7XG4gICAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoMCwgYnVmc2l6ZSlcbiAgICB9XG5cbiAgICBjb25zdCB7IGJ1ZmZlcjogZGF0YSwgY3Bvc2l0aW9ucywgZHBvc2l0aW9ucyB9ID0gYXdhaXQgdW56aXBDaHVua1NsaWNlKGJ1ZmZlciwgY2h1bmspXG4gICAgY2hlY2tBYm9ydFNpZ25hbChhYm9ydFNpZ25hbClcbiAgICByZXR1cm4geyBkYXRhLCBjcG9zaXRpb25zLCBkcG9zaXRpb25zLCBjaHVuayB9XG4gIH1cblxuICBhc3luYyByZWFkQmFtRmVhdHVyZXMoYmE6IEJ1ZmZlciwgY3Bvc2l0aW9uczogbnVtYmVyW10sIGRwb3NpdGlvbnM6IG51bWJlcltdLCBjaHVuazogQ2h1bmspIHtcbiAgICBsZXQgYmxvY2tTdGFydCA9IDBcbiAgICBjb25zdCBzaW5rID0gW11cbiAgICBsZXQgcG9zID0gMFxuICAgIGxldCBmZWF0c1NpbmNlTGFzdFRpbWVvdXQgPSAwXG5cbiAgICB3aGlsZSAoYmxvY2tTdGFydCArIDQgPCBiYS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGJsb2NrU2l6ZSA9IGJhLnJlYWRJbnQzMkxFKGJsb2NrU3RhcnQpXG4gICAgICBjb25zdCBibG9ja0VuZCA9IGJsb2NrU3RhcnQgKyA0ICsgYmxvY2tTaXplIC0gMVxuXG4gICAgICAvLyBpbmNyZW1lbnQgcG9zaXRpb24gdG8gdGhlIGN1cnJlbnQgZGVjb21wcmVzc2VkIHN0YXR1c1xuICAgICAgaWYgKGRwb3NpdGlvbnMpIHtcbiAgICAgICAgd2hpbGUgKGJsb2NrU3RhcnQgKyBjaHVuay5taW52LmRhdGFQb3NpdGlvbiA+PSBkcG9zaXRpb25zW3BvcysrXSkge31cbiAgICAgICAgcG9zLS1cbiAgICAgIH1cblxuICAgICAgLy8gb25seSB0cnkgdG8gcmVhZCB0aGUgZmVhdHVyZSBpZiB3ZSBoYXZlIGFsbCB0aGUgYnl0ZXMgZm9yIGl0XG4gICAgICBpZiAoYmxvY2tFbmQgPCBiYS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZmVhdHVyZSA9IG5ldyBCQU1GZWF0dXJlKHtcbiAgICAgICAgICBieXRlczoge1xuICAgICAgICAgICAgYnl0ZUFycmF5OiBiYSxcbiAgICAgICAgICAgIHN0YXJ0OiBibG9ja1N0YXJ0LFxuICAgICAgICAgICAgZW5kOiBibG9ja0VuZCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC8vIHRoZSBiZWxvdyByZXN1bHRzIGluIGFuIGF1dG9tYXRpY2FsbHkgY2FsY3VsYXRlZCBmaWxlLW9mZnNldCBiYXNlZCBJRFxuICAgICAgICAgIC8vIGlmIHRoZSBpbmZvIGZvciB0aGF0IGlzIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGNyYzMyIG9mIHRoZSBmZWF0dXJlc1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gY3Bvc2l0aW9uc1twb3NdIHJlZmVycyB0byBhY3R1YWwgZmlsZSBvZmZzZXQgb2YgYSBiZ3ppcCBibG9jayBib3VuZGFyaWVzXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyB3ZSBtdWx0aXBseSBieSAoMSA8PDgpIGluIG9yZGVyIHRvIG1ha2Ugc3VyZSBlYWNoIGJsb2NrIGhhcyBhIFwidW5pcXVlXCJcbiAgICAgICAgICAvLyBhZGRyZXNzIHNwYWNlIHNvIHRoYXQgZGF0YSBpbiB0aGF0IGJsb2NrIGNvdWxkIG5ldmVyIG92ZXJsYXBcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIHRoZW4gdGhlIGJsb2NrU3RhcnQtZHBvc2l0aW9ucyBpcyBhbiB1bmNvbXByZXNzZWQgZmlsZSBvZmZzZXQgZnJvbVxuICAgICAgICAgIC8vIHRoYXQgYmd6aXAgYmxvY2sgYm91bmRhcnksIGFuZCBzaW5jZSB0aGUgY3Bvc2l0aW9ucyBhcmUgbXVsdGlwbGllZCBieVxuICAgICAgICAgIC8vICgxIDw8IDgpIHRoZXNlIHVuY29tcHJlc3NlZCBvZmZzZXRzIGdldCBhIHVuaXF1ZSBzcGFjZVxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gdGhpcyBoYXMgYW4gZXh0cmEgY2h1bmsubWludi5kYXRhUG9zaXRpb24gYWRkZWQgb24gYmVjYXVzZSBpdCBibG9ja1N0YXJ0XG4gICAgICAgICAgLy8gc3RhcnRzIGF0IDAgaW5zdGVhZCBvZiBjaHVuay5taW52LmRhdGFQb3NpdGlvblxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gdGhlICsxIGlzIGp1c3QgdG8gYXZvaWQgYW55IHBvc3NpYmxlIHVuaXF1ZUlkIDAgYnV0IHRoaXMgZG9lcyBub3QgcmVhbGlzdGljYWxseSBoYXBwZW5cbiAgICAgICAgICBmaWxlT2Zmc2V0OiBjcG9zaXRpb25zXG4gICAgICAgICAgICA/IGNwb3NpdGlvbnNbcG9zXSAqICgxIDw8IDgpICtcbiAgICAgICAgICAgICAgKGJsb2NrU3RhcnQgLSBkcG9zaXRpb25zW3Bvc10pICtcbiAgICAgICAgICAgICAgY2h1bmsubWludi5kYXRhUG9zaXRpb24gK1xuICAgICAgICAgICAgICAxXG4gICAgICAgICAgICA6IGNyYzMyLnNpZ25lZChiYS5zbGljZShibG9ja1N0YXJ0LCBibG9ja0VuZCkpLFxuICAgICAgICB9KVxuXG4gICAgICAgIHNpbmsucHVzaChmZWF0dXJlKVxuICAgICAgICBmZWF0c1NpbmNlTGFzdFRpbWVvdXQrK1xuICAgICAgICBpZiAoZmVhdHNTaW5jZUxhc3RUaW1lb3V0ID4gNTAwKSB7XG4gICAgICAgICAgYXdhaXQgdGltZW91dCgxKVxuICAgICAgICAgIGZlYXRzU2luY2VMYXN0VGltZW91dCA9IDBcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBibG9ja1N0YXJ0ID0gYmxvY2tFbmQgKyAxXG4gICAgfVxuICAgIHJldHVybiBzaW5rXG4gIH1cblxuICBhc3luYyBoYXNSZWZTZXEoc2VxTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVmSWQgPSB0aGlzLmNoclRvSW5kZXggJiYgdGhpcy5jaHJUb0luZGV4W3NlcU5hbWVdXG4gICAgcmV0dXJuIHRoaXMuaW5kZXguaGFzUmVmU2VxKHJlZklkKVxuICB9XG5cbiAgYXN5bmMgbGluZUNvdW50KHNlcU5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHJlZklkID0gdGhpcy5jaHJUb0luZGV4ICYmIHRoaXMuY2hyVG9JbmRleFtzZXFOYW1lXVxuICAgIHJldHVybiB0aGlzLmluZGV4LmxpbmVDb3VudChyZWZJZClcbiAgfVxuXG4gIGFzeW5jIGluZGV4Q292KHNlcU5hbWU6IHN0cmluZywgc3RhcnQ/OiBudW1iZXIsIGVuZD86IG51bWJlcikge1xuICAgIGF3YWl0IHRoaXMuaW5kZXgucGFyc2UoKVxuICAgIGNvbnN0IHNlcUlkID0gdGhpcy5jaHJUb0luZGV4ICYmIHRoaXMuY2hyVG9JbmRleFtzZXFOYW1lXVxuICAgIHJldHVybiB0aGlzLmluZGV4LmluZGV4Q292KHNlcUlkLCBzdGFydCwgZW5kKVxuICB9XG59XG4iXX0=
695
+ //# sourceMappingURL=bamFile.js.map