@teselagen/react-table 6.10.9 → 6.10.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/ReactList.js DELETED
@@ -1,715 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
-
7
- var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
8
-
9
- var _propTypes = require('prop-types');
10
-
11
- var _propTypes2 = _interopRequireDefault(_propTypes);
12
-
13
- var _react = require('react');
14
-
15
- var _react2 = _interopRequireDefault(_react);
16
-
17
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
-
19
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
20
-
21
- function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
22
-
23
- function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* eslint-disable no-empty */
24
- /* eslint-disable no-cond-assign */
25
- /* eslint-disable no-cond-assign */
26
- /* eslint-disable default-case */
27
- /* eslint-disable default-case */
28
- /* eslint-disable no-cond-assign */
29
- // import module from 'module';
30
-
31
-
32
- var CLIENT_SIZE_KEYS = { x: 'clientWidth', y: 'clientHeight' };
33
- var CLIENT_START_KEYS = { x: 'clientTop', y: 'clientLeft' };
34
- var INNER_SIZE_KEYS = { x: 'innerWidth', y: 'innerHeight' };
35
- var OFFSET_SIZE_KEYS = { x: 'offsetWidth', y: 'offsetHeight' };
36
- var OFFSET_START_KEYS = { x: 'offsetLeft', y: 'offsetTop' };
37
- var OVERFLOW_KEYS = { x: 'overflowX', y: 'overflowY' };
38
- var SCROLL_SIZE_KEYS = { x: 'scrollWidth', y: 'scrollHeight' };
39
- var SCROLL_START_KEYS = { x: 'scrollLeft', y: 'scrollTop' };
40
- var SIZE_KEYS = { x: 'minWidth', y: 'minHeight' };
41
-
42
- var NOOP = function NOOP() {};
43
-
44
- // If a browser doesn't support the `options` argument to
45
- // add/removeEventListener, we need to check, otherwise we will
46
- // accidentally set `capture` with a truthy value.
47
- var PASSIVE = function () {
48
- if (typeof window === 'undefined') return false;
49
- var hasSupport = false;
50
- try {
51
- document.createElement('div').addEventListener('test', NOOP, {
52
- get passive() {
53
- hasSupport = true;
54
- return false;
55
- }
56
- });
57
- } catch (e) {
58
- // noop
59
- }
60
- return hasSupport;
61
- }() ? { passive: true } : false;
62
-
63
- var UNSTABLE_MESSAGE = 'ReactList failed to reach a stable state.';
64
- var MAX_SYNC_UPDATES = 100;
65
-
66
- var isEqualSubset = function isEqualSubset(a, b) {
67
- for (var key in b) {
68
- if (a[key] !== b[key]) return false;
69
- }return true;
70
- };
71
-
72
- var ReactList = function (_React$Component) {
73
- _inherits(ReactList, _React$Component);
74
-
75
- function ReactList(props) {
76
- _classCallCheck(this, ReactList);
77
-
78
- var _this = _possibleConstructorReturn(this, (ReactList.__proto__ || Object.getPrototypeOf(ReactList)).call(this, props));
79
-
80
- var initialIndex = props.initialIndex;
81
-
82
- var itemsPerRow = 1;
83
-
84
- var _this$constrain = _this.constrain(initialIndex, 0, itemsPerRow, props),
85
- from = _this$constrain.from,
86
- size = _this$constrain.size;
87
-
88
- _this.state = { from: from, size: size, itemsPerRow: itemsPerRow };
89
- _this.cache = {};
90
- _this.prevPrevState = {};
91
- _this.unstable = false;
92
- _this.updateCounter = 0;
93
- return _this;
94
- }
95
-
96
- //tnr: commenting this out.. not sure if it is actually needed
97
- // UNSAFE_componentWillReceiveProps(nextProps) {
98
- // let { from, size, itemsPerRow } = this.state;
99
- // if (nextProps.clearCache) this.cache = {};
100
- // this.maybeSetState(
101
- // this.constrain(from, size, itemsPerRow, nextProps),
102
- // NOOP
103
- // );
104
- // }
105
-
106
- _createClass(ReactList, [{
107
- key: 'componentDidMount',
108
- value: function componentDidMount() {
109
- this.updateFrame = this.updateFrame.bind(this);
110
- window.addEventListener('resize', this.updateFrame);
111
- this.updateFrame(this.scrollTo.bind(this, this.props.initialIndex));
112
- }
113
- }, {
114
- key: 'componentDidUpdate',
115
- value: function componentDidUpdate() {
116
- var _this2 = this;
117
-
118
- // If the list has reached an unstable state, prevent an infinite loop.
119
- if (this.unstable) return;
120
-
121
- if (++this.updateCounter > MAX_SYNC_UPDATES) {
122
- this.unstable = true;
123
- return console.error(UNSTABLE_MESSAGE);
124
- }
125
-
126
- if (!this.updateCounterTimeoutId) {
127
- this.updateCounterTimeoutId = setTimeout(function () {
128
- _this2.updateCounter = 0;
129
- delete _this2.updateCounterTimeoutId;
130
- }, 0);
131
- }
132
- // this.dontUpdate = true;
133
- this.updateFrame();
134
-
135
- //TNR: extra code to 'fix' the scroll height when scrolling upwards
136
- //tnr commenting this out because we are now doing a better job of calculating row heights
137
- // if (this.rowToFixScroll) {
138
- // const { row, cache: previousSize } = this.rowToFixScroll;
139
- // const actualSize = this.cache[row];
140
- // if (actualSize && actualSize !== previousSize) {
141
- // this.getScrollParent().scrollBy({
142
- // top: -(
143
- // (previousSize || this.props.itemSizeEstimator(row, {})) - actualSize
144
- // )
145
- // });
146
- // this.rowToFixScroll = null;
147
- // }
148
- // }
149
- }
150
- // shouldComponentUpdate() {
151
- // if (this.dontUpdate) {
152
- // this.dontUpdate = false;
153
- // return false;
154
- // }
155
- // return true;
156
- // }
157
-
158
- }, {
159
- key: 'maybeSetState',
160
- value: function maybeSetState(b, cb) {
161
- if (isEqualSubset(this.state, b)) return cb();
162
-
163
- //TNR: extra code to 'fix' the scroll height when scrolling upwards
164
- if (this.state.from === b.from + 1) {
165
- this.rowToFixScroll = { row: b.from, cache: this.cache[b.from] };
166
- }
167
- this.setState(b, cb);
168
- }
169
- }, {
170
- key: 'componentWillUnmount',
171
- value: function componentWillUnmount() {
172
- window.removeEventListener('resize', this.updateFrame);
173
- this.scrollParent.removeEventListener('scroll', this.updateFrame, PASSIVE);
174
- this.scrollParent.removeEventListener('mousewheel', NOOP, PASSIVE);
175
- }
176
- }, {
177
- key: 'getOffset',
178
- value: function getOffset(el) {
179
- var axis = this.props.axis;
180
-
181
- var offset = el[CLIENT_START_KEYS[axis]] || 0;
182
- var offsetKey = OFFSET_START_KEYS[axis];
183
- do {
184
- offset += el[offsetKey] || 0;
185
- } while (el = el.offsetParent);
186
- return offset;
187
- }
188
- }, {
189
- key: 'getEl',
190
- value: function getEl() {
191
- return this.el || this.items;
192
- }
193
- }, {
194
- key: 'getScrollParent',
195
- value: function getScrollParent() {
196
- var _props = this.props,
197
- axis = _props.axis,
198
- scrollParentGetter = _props.scrollParentGetter;
199
-
200
- if (scrollParentGetter) return scrollParentGetter();
201
- var el = this.getEl();
202
- if (!el) return window;
203
- var overflowKey = OVERFLOW_KEYS[axis];
204
- while (el = el.parentElement) {
205
- switch (window.getComputedStyle(el)[overflowKey]) {
206
- case 'auto':
207
- case 'scroll':
208
- case 'overlay':
209
- return el;
210
- }
211
- }
212
- return window;
213
- }
214
- }, {
215
- key: 'getScrollPosition',
216
- value: function getScrollPosition() {
217
- var scrollParent = this.scrollParent;
218
- var axis = this.props.axis;
219
-
220
- var scrollKey = SCROLL_START_KEYS[axis];
221
- var actual = scrollParent === window ? // Firefox always returns document.body[scrollKey] as 0 and Chrome/Safari
222
- // always return document.documentElement[scrollKey] as 0, so take
223
- // whichever has a value.
224
- document.body[scrollKey] || document.documentElement[scrollKey] : scrollParent[scrollKey];
225
- var max = this.getScrollSize() - this.getViewportSize();
226
- var scroll = Math.max(0, Math.min(actual, max));
227
- var el = this.getEl();
228
- return this.getOffset(scrollParent) + scroll - this.getOffset(el);
229
- }
230
- }, {
231
- key: 'setScroll',
232
- value: function setScroll(offset) {
233
- var scrollParent = this.scrollParent;
234
- var axis = this.props.axis;
235
-
236
- offset += this.getOffset(this.getEl());
237
- if (scrollParent === window) return window.scrollTo(0, offset);
238
-
239
- offset -= this.getOffset(this.scrollParent);
240
- scrollParent[SCROLL_START_KEYS[axis]] = offset;
241
- }
242
- }, {
243
- key: 'getViewportSize',
244
- value: function getViewportSize() {
245
- var scrollParent = this.scrollParent;
246
- var axis = this.props.axis;
247
-
248
- return scrollParent === window ? window[INNER_SIZE_KEYS[axis]] : scrollParent[CLIENT_SIZE_KEYS[axis]];
249
- }
250
- }, {
251
- key: 'getScrollSize',
252
- value: function getScrollSize() {
253
- var scrollParent = this.scrollParent;
254
- var _document = document,
255
- body = _document.body,
256
- documentElement = _document.documentElement;
257
-
258
- var key = SCROLL_SIZE_KEYS[this.props.axis];
259
- return scrollParent === window ? Math.max(body[key], documentElement[key]) : scrollParent[key];
260
- }
261
- }, {
262
- key: 'hasDeterminateSize',
263
- value: function hasDeterminateSize() {
264
- var _props2 = this.props,
265
- itemSizeGetter = _props2.itemSizeGetter,
266
- type = _props2.type;
267
-
268
- return type === 'uniform' || itemSizeGetter;
269
- }
270
- }, {
271
- key: 'getStartAndEnd',
272
- value: function getStartAndEnd() {
273
- var threshold = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.props.threshold;
274
-
275
- var scroll = this.getScrollPosition();
276
- var start = Math.max(0, scroll - threshold);
277
- var end = scroll + this.getViewportSize() + threshold;
278
- if (this.hasDeterminateSize()) {
279
- end = Math.min(end, this.getSpaceBefore(this.props.length));
280
- }
281
- return { start: start, end: end };
282
- }
283
- }, {
284
- key: 'getItemSizeAndItemsPerRow',
285
- value: function getItemSizeAndItemsPerRow() {
286
- var _props3 = this.props,
287
- axis = _props3.axis,
288
- useStaticSize = _props3.useStaticSize;
289
- var _state = this.state,
290
- itemSize = _state.itemSize,
291
- itemsPerRow = _state.itemsPerRow;
292
-
293
- if (useStaticSize && itemSize && itemsPerRow) {
294
- return { itemSize: itemSize, itemsPerRow: itemsPerRow };
295
- }
296
-
297
- var itemEls = this.items.children;
298
- if (!itemEls.length) return {};
299
-
300
- var firstEl = itemEls[0];
301
-
302
- // Firefox has a problem where it will return a *slightly* (less than
303
- // thousandths of a pixel) different size for the same element between
304
- // renders. This can cause an infinite render loop, so only change the
305
- // itemSize when it is significantly different.
306
- var firstElSize = firstEl[OFFSET_SIZE_KEYS[axis]];
307
- var delta = Math.abs(firstElSize - itemSize);
308
- if (isNaN(delta) || delta >= 1) itemSize = firstElSize;
309
-
310
- if (!itemSize) return {};
311
-
312
- var startKey = OFFSET_START_KEYS[axis];
313
- var firstStart = firstEl[startKey];
314
- itemsPerRow = 1;
315
- for (var item = itemEls[itemsPerRow]; item && item[startKey] === firstStart; item = itemEls[itemsPerRow]) {
316
- ++itemsPerRow;
317
- }
318
-
319
- return { itemSize: itemSize, itemsPerRow: itemsPerRow };
320
- }
321
- }, {
322
- key: 'updateFrame',
323
- value: function updateFrame(cb) {
324
- this.updateScrollParent();
325
- if (typeof cb !== 'function') cb = NOOP;
326
- switch (this.props.type) {
327
- case 'simple':
328
- return this.updateSimpleFrame(cb);
329
- case 'variable':
330
- return this.updateVariableFrame(cb);
331
- case 'uniform':
332
- return this.updateUniformFrame(cb);
333
- }
334
- }
335
- }, {
336
- key: 'updateScrollParent',
337
- value: function updateScrollParent() {
338
- var prev = this.scrollParent;
339
- if (prev) {
340
- return; //https://github.com/coderiety/react-list/pull/196
341
- }
342
- this.scrollParent = this.getScrollParent();
343
- if (prev === this.scrollParent) return;
344
- if (prev) {
345
- prev.removeEventListener('scroll', this.updateFrame);
346
- prev.removeEventListener('mousewheel', NOOP);
347
- }
348
- this.scrollParent.addEventListener('scroll', this.updateFrame, PASSIVE);
349
- this.scrollParent.addEventListener('mousewheel', NOOP, PASSIVE);
350
- }
351
- }, {
352
- key: 'updateSimpleFrame',
353
- value: function updateSimpleFrame(cb) {
354
- var _getStartAndEnd = this.getStartAndEnd(),
355
- end = _getStartAndEnd.end;
356
-
357
- var itemEls = this.items.children;
358
- var elEnd = 0;
359
-
360
- if (itemEls.length) {
361
- var axis = this.props.axis;
362
-
363
- var firstItemEl = itemEls[0];
364
- var lastItemEl = itemEls[itemEls.length - 1];
365
- elEnd = this.getOffset(lastItemEl) + lastItemEl[OFFSET_SIZE_KEYS[axis]] - this.getOffset(firstItemEl);
366
- }
367
-
368
- if (elEnd > end) return cb();
369
-
370
- var _props4 = this.props,
371
- pageSize = _props4.pageSize,
372
- length = _props4.length;
373
-
374
- var size = Math.min(this.state.size + pageSize, length);
375
- this.maybeSetState({ size: size }, cb);
376
- }
377
- }, {
378
- key: 'updateVariableFrame',
379
- value: function updateVariableFrame(cb) {
380
- if (!this.props.itemSizeGetter) this.cacheSizes();
381
-
382
- var _getStartAndEnd2 = this.getStartAndEnd(),
383
- start = _getStartAndEnd2.start,
384
- end = _getStartAndEnd2.end;
385
-
386
- var _props5 = this.props,
387
- length = _props5.length,
388
- pageSize = _props5.pageSize;
389
-
390
- var space = 0;
391
- var from = 0;
392
- var size = 0;
393
- var maxFrom = length - 1;
394
-
395
- while (from < maxFrom) {
396
- var itemSize = this.getSizeOfItem(from);
397
- if (itemSize == null || space + itemSize > start) break;
398
- space += itemSize;
399
- ++from;
400
- }
401
-
402
- var maxSize = length - from;
403
-
404
- while (size < maxSize && space < end) {
405
- var _itemSize = this.getSizeOfItem(from + size);
406
- if (_itemSize == null) {
407
- size = Math.min(size + pageSize, maxSize);
408
- break;
409
- }
410
- space += _itemSize;
411
- ++size;
412
- }
413
- this.maybeSetState({ from: from, size: size }, cb);
414
- }
415
- }, {
416
- key: 'updateUniformFrame',
417
- value: function updateUniformFrame(cb) {
418
- var _getItemSizeAndItemsP = this.getItemSizeAndItemsPerRow(),
419
- itemSize = _getItemSizeAndItemsP.itemSize,
420
- itemsPerRow = _getItemSizeAndItemsP.itemsPerRow;
421
-
422
- if (!itemSize || !itemsPerRow) return cb();
423
-
424
- var _getStartAndEnd3 = this.getStartAndEnd(),
425
- start = _getStartAndEnd3.start,
426
- end = _getStartAndEnd3.end;
427
-
428
- var _constrain = this.constrain(Math.floor(start / itemSize) * itemsPerRow, (Math.ceil((end - start) / itemSize) + 1) * itemsPerRow, itemsPerRow, this.props),
429
- from = _constrain.from,
430
- size = _constrain.size;
431
-
432
- return this.maybeSetState({ itemsPerRow: itemsPerRow, from: from, itemSize: itemSize, size: size }, cb);
433
- }
434
- }, {
435
- key: 'getSpaceBefore',
436
- value: function getSpaceBefore(index) {
437
- var cache = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
438
-
439
- if (cache[index] != null) return cache[index];
440
-
441
- // Try the static itemSize.
442
- var _state2 = this.state,
443
- itemSize = _state2.itemSize,
444
- itemsPerRow = _state2.itemsPerRow;
445
-
446
- if (itemSize) {
447
- return cache[index] = Math.floor(index / itemsPerRow) * itemSize;
448
- }
449
-
450
- // Find the closest space to index there is a cached value for.
451
- var from = index;
452
- while (from > 0 && cache[--from] == null) {}
453
-
454
- // Finally, accumulate sizes of items from - index.
455
- var space = cache[from] || 0;
456
- for (var i = from; i < index; ++i) {
457
- cache[i] = space;
458
- var _itemSize2 = this.getSizeOfItem(i);
459
- if (_itemSize2 == null) break;
460
- space += _itemSize2;
461
- }
462
-
463
- return cache[index] = space;
464
- }
465
- }, {
466
- key: 'cacheSizes',
467
- value: function cacheSizes() {
468
- var cache = this.cache;
469
- var from = this.state.from;
470
-
471
- if (!this.items) return;
472
- var itemEls = this.items.children;
473
- var sizeKey = OFFSET_SIZE_KEYS[this.props.axis];
474
- for (var i = 0, l = itemEls.length; i < l; ++i) {
475
- cache[from + i] = itemEls[i][sizeKey];
476
- }
477
- }
478
- }, {
479
- key: 'getSizeOfItem',
480
- value: function getSizeOfItem(index) {
481
- var cache = this.cache,
482
- items = this.items;
483
- var _props6 = this.props,
484
- axis = _props6.axis,
485
- itemSizeGetter = _props6.itemSizeGetter,
486
- itemSizeEstimator = _props6.itemSizeEstimator,
487
- type = _props6.type;
488
- var _state3 = this.state,
489
- from = _state3.from,
490
- itemSize = _state3.itemSize,
491
- size = _state3.size;
492
-
493
- // Try the static itemSize.
494
-
495
- if (itemSize) return itemSize;
496
-
497
- // Try the itemSizeGetter.
498
- if (itemSizeGetter) return itemSizeGetter(index);
499
-
500
- // Try the cache.
501
- if (index in cache) return cache[index];
502
-
503
- // Try the DOM.
504
- if (type === 'simple' && index >= from && index < from + size && items) {
505
- var itemEl = items.children[index - from];
506
- if (itemEl) return itemEl[OFFSET_SIZE_KEYS[axis]];
507
- }
508
-
509
- // Try the itemSizeEstimator.
510
- if (itemSizeEstimator) return itemSizeEstimator(index, cache);
511
- }
512
- }, {
513
- key: 'constrain',
514
- value: function constrain(from, size, itemsPerRow, _ref) {
515
- var length = _ref.length,
516
- minSize = _ref.minSize,
517
- type = _ref.type;
518
-
519
- size = Math.max(size, minSize);
520
- var mod = size % itemsPerRow;
521
- if (mod) size += itemsPerRow - mod;
522
- if (size > length) size = length;
523
- from = type === 'simple' || !from ? 0 : Math.max(Math.min(from, length - size), 0);
524
-
525
- if (mod = from % itemsPerRow) {
526
- from -= mod;
527
- size += mod;
528
- }
529
-
530
- return { from: from, size: size };
531
- }
532
- }, {
533
- key: 'scrollTo',
534
- value: function scrollTo(index) {
535
- if (index != null) this.setScroll(this.getSpaceBefore(index) - 100);
536
- }
537
- }, {
538
- key: 'scrollAround',
539
- value: function scrollAround(index) {
540
- var current = this.getScrollPosition();
541
- var bottom = this.getSpaceBefore(index);
542
- var top = bottom - this.getViewportSize() + this.getSizeOfItem(index);
543
- var min = Math.min(top, bottom);
544
- var max = Math.max(top, bottom);
545
- if (current <= min) return this.setScroll(min - this.getViewportSize());
546
- if (current > max) {
547
- return this.setScroll(max - this.getViewportSize() - 100);
548
- }
549
- }
550
- }, {
551
- key: 'getVisibleRange',
552
- value: function getVisibleRange() {
553
- var _state4 = this.state,
554
- from = _state4.from,
555
- size = _state4.size;
556
-
557
- var _getStartAndEnd4 = this.getStartAndEnd(0),
558
- start = _getStartAndEnd4.start,
559
- end = _getStartAndEnd4.end;
560
-
561
- var cache = {};
562
- var first = void 0,
563
- last = void 0;
564
- for (var i = from; i < from + size; ++i) {
565
- var itemStart = this.getSpaceBefore(i, cache);
566
- var itemEnd = itemStart + this.getSizeOfItem(i);
567
- if (first == null && itemEnd > start) first = i;
568
- if (first != null && itemStart < end) last = i;
569
- }
570
- return [first, last];
571
- }
572
- //this can be used as a static method via the react list ref
573
-
574
- }, {
575
- key: 'getFractionalVisibleRange',
576
- value: function getFractionalVisibleRange() {
577
- var _state5 = this.state,
578
- from = _state5.from,
579
- size = _state5.size;
580
-
581
- var _getStartAndEnd5 = this.getStartAndEnd(0),
582
- start = _getStartAndEnd5.start,
583
- end = _getStartAndEnd5.end;
584
-
585
- var cache = {};
586
- var first = void 0,
587
- last = void 0;
588
-
589
- for (var i = from; i < from + size; ++i) {
590
- var itemStart = this.getSpaceBefore(i, cache);
591
- var itemEnd = itemStart + this.getSizeOfItem(i);
592
- if (first == null && itemEnd > start) {
593
- first = i + 1 - (itemEnd - start) / (itemEnd - itemStart);
594
- }
595
- if (first != null && itemStart < end) {
596
- last = i - (itemEnd - end) / (itemEnd - itemStart);
597
- }
598
- }
599
- return [first, last];
600
- }
601
- }, {
602
- key: 'renderItems',
603
- value: function renderItems() {
604
- var _this3 = this;
605
-
606
- var _props7 = this.props,
607
- itemRenderer = _props7.itemRenderer,
608
- itemsRenderer = _props7.itemsRenderer;
609
- var _state6 = this.state,
610
- from = _state6.from,
611
- size = _state6.size;
612
-
613
- var items = [];
614
- for (var i = 0; i < size; ++i) {
615
- items.push(itemRenderer(from + i, i));
616
- }return itemsRenderer(items, function (c) {
617
- return _this3.items = c;
618
- });
619
- }
620
- }, {
621
- key: 'render',
622
- value: function render() {
623
- var _this4 = this;
624
-
625
- var _props8 = this.props,
626
- axis = _props8.axis,
627
- length = _props8.length,
628
- type = _props8.type;
629
- var _state7 = this.state,
630
- from = _state7.from,
631
- itemsPerRow = _state7.itemsPerRow;
632
-
633
- var items = this.renderItems();
634
- if (type === 'simple') return items;
635
-
636
- var style = { position: 'relative' };
637
- var cache = {};
638
- var bottom = Math.ceil(length / itemsPerRow) * itemsPerRow;
639
- var size = this.getSpaceBefore(bottom, cache);
640
- if (size) {
641
- style[SIZE_KEYS[axis]] = size;
642
- if (axis === 'x') style.overflowX = 'hidden';
643
- }
644
- var offset = this.getSpaceBefore(from, cache);
645
- var x = axis === 'x' ? offset : 0;
646
- var y = axis === 'y' ? offset : 0;
647
- var listStyle = {
648
- //tnr trying out: https://github.com/coderiety/react-list/pull/154
649
- position: 'relative',
650
- top: y,
651
- left: x
652
- };
653
- return _react2.default.createElement(
654
- 'div',
655
- {
656
- style: style,
657
- ref: function ref(c) {
658
- if (c) _this4.el = c;
659
- }
660
- },
661
- _react2.default.createElement(
662
- 'div',
663
- { style: listStyle },
664
- items
665
- )
666
- );
667
- }
668
- }]);
669
-
670
- return ReactList;
671
- }(_react2.default.Component);
672
-
673
- ReactList.displayName = 'ReactList';
674
- ReactList.propTypes = {
675
- axis: _propTypes2.default.oneOf(['x', 'y']),
676
- initialIndex: _propTypes2.default.number,
677
- itemRenderer: _propTypes2.default.func,
678
- itemSizeEstimator: _propTypes2.default.func,
679
- itemSizeGetter: _propTypes2.default.func,
680
- itemsRenderer: _propTypes2.default.func,
681
- length: _propTypes2.default.number,
682
- minSize: _propTypes2.default.number,
683
- pageSize: _propTypes2.default.number,
684
- scrollParentGetter: _propTypes2.default.func,
685
- threshold: _propTypes2.default.number,
686
- type: _propTypes2.default.oneOf(['simple', 'variable', 'uniform']),
687
- useStaticSize: _propTypes2.default.bool,
688
- useTranslate3d: _propTypes2.default.bool
689
- };
690
- ReactList.defaultProps = {
691
- axis: 'y',
692
- itemRenderer: function itemRenderer(index, key) {
693
- return _react2.default.createElement(
694
- 'div',
695
- { key: key },
696
- index
697
- );
698
- },
699
- itemsRenderer: function itemsRenderer(items, ref) {
700
- return _react2.default.createElement(
701
- 'div',
702
- { ref: ref },
703
- items
704
- );
705
- },
706
- length: 0,
707
- minSize: 1,
708
- pageSize: 10,
709
- threshold: 100,
710
- type: 'simple',
711
- useStaticSize: false,
712
- useTranslate3d: false
713
- };
714
- exports.default = ReactList;
715
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9SZWFjdExpc3QuanMiXSwibmFtZXMiOlsiQ0xJRU5UX1NJWkVfS0VZUyIsIngiLCJ5IiwiQ0xJRU5UX1NUQVJUX0tFWVMiLCJJTk5FUl9TSVpFX0tFWVMiLCJPRkZTRVRfU0laRV9LRVlTIiwiT0ZGU0VUX1NUQVJUX0tFWVMiLCJPVkVSRkxPV19LRVlTIiwiU0NST0xMX1NJWkVfS0VZUyIsIlNDUk9MTF9TVEFSVF9LRVlTIiwiU0laRV9LRVlTIiwiTk9PUCIsIlBBU1NJVkUiLCJ3aW5kb3ciLCJoYXNTdXBwb3J0IiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsInBhc3NpdmUiLCJlIiwiVU5TVEFCTEVfTUVTU0FHRSIsIk1BWF9TWU5DX1VQREFURVMiLCJpc0VxdWFsU3Vic2V0IiwiYSIsImIiLCJrZXkiLCJSZWFjdExpc3QiLCJwcm9wcyIsImluaXRpYWxJbmRleCIsIml0ZW1zUGVyUm93IiwiY29uc3RyYWluIiwiZnJvbSIsInNpemUiLCJzdGF0ZSIsImNhY2hlIiwicHJldlByZXZTdGF0ZSIsInVuc3RhYmxlIiwidXBkYXRlQ291bnRlciIsInVwZGF0ZUZyYW1lIiwiYmluZCIsInNjcm9sbFRvIiwiY29uc29sZSIsImVycm9yIiwidXBkYXRlQ291bnRlclRpbWVvdXRJZCIsInNldFRpbWVvdXQiLCJjYiIsInJvd1RvRml4U2Nyb2xsIiwicm93Iiwic2V0U3RhdGUiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwic2Nyb2xsUGFyZW50IiwiZWwiLCJheGlzIiwib2Zmc2V0Iiwib2Zmc2V0S2V5Iiwib2Zmc2V0UGFyZW50IiwiaXRlbXMiLCJzY3JvbGxQYXJlbnRHZXR0ZXIiLCJnZXRFbCIsIm92ZXJmbG93S2V5IiwicGFyZW50RWxlbWVudCIsImdldENvbXB1dGVkU3R5bGUiLCJzY3JvbGxLZXkiLCJhY3R1YWwiLCJib2R5IiwiZG9jdW1lbnRFbGVtZW50IiwibWF4IiwiZ2V0U2Nyb2xsU2l6ZSIsImdldFZpZXdwb3J0U2l6ZSIsInNjcm9sbCIsIk1hdGgiLCJtaW4iLCJnZXRPZmZzZXQiLCJpdGVtU2l6ZUdldHRlciIsInR5cGUiLCJ0aHJlc2hvbGQiLCJnZXRTY3JvbGxQb3NpdGlvbiIsInN0YXJ0IiwiZW5kIiwiaGFzRGV0ZXJtaW5hdGVTaXplIiwiZ2V0U3BhY2VCZWZvcmUiLCJsZW5ndGgiLCJ1c2VTdGF0aWNTaXplIiwiaXRlbVNpemUiLCJpdGVtRWxzIiwiY2hpbGRyZW4iLCJmaXJzdEVsIiwiZmlyc3RFbFNpemUiLCJkZWx0YSIsImFicyIsImlzTmFOIiwic3RhcnRLZXkiLCJmaXJzdFN0YXJ0IiwiaXRlbSIsInVwZGF0ZVNjcm9sbFBhcmVudCIsInVwZGF0ZVNpbXBsZUZyYW1lIiwidXBkYXRlVmFyaWFibGVGcmFtZSIsInVwZGF0ZVVuaWZvcm1GcmFtZSIsInByZXYiLCJnZXRTY3JvbGxQYXJlbnQiLCJnZXRTdGFydEFuZEVuZCIsImVsRW5kIiwiZmlyc3RJdGVtRWwiLCJsYXN0SXRlbUVsIiwicGFnZVNpemUiLCJtYXliZVNldFN0YXRlIiwiY2FjaGVTaXplcyIsInNwYWNlIiwibWF4RnJvbSIsImdldFNpemVPZkl0ZW0iLCJtYXhTaXplIiwiZ2V0SXRlbVNpemVBbmRJdGVtc1BlclJvdyIsImZsb29yIiwiY2VpbCIsImluZGV4IiwiaSIsInNpemVLZXkiLCJsIiwiaXRlbVNpemVFc3RpbWF0b3IiLCJpdGVtRWwiLCJtaW5TaXplIiwibW9kIiwic2V0U2Nyb2xsIiwiY3VycmVudCIsImJvdHRvbSIsInRvcCIsImZpcnN0IiwibGFzdCIsIml0ZW1TdGFydCIsIml0ZW1FbmQiLCJpdGVtUmVuZGVyZXIiLCJpdGVtc1JlbmRlcmVyIiwicHVzaCIsImMiLCJyZW5kZXJJdGVtcyIsInN0eWxlIiwicG9zaXRpb24iLCJvdmVyZmxvd1giLCJsaXN0U3R5bGUiLCJsZWZ0IiwiUmVhY3QiLCJDb21wb25lbnQiLCJkaXNwbGF5TmFtZSIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsIm9uZU9mIiwibnVtYmVy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YWJsZSBuby1lbXB0eSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tY29uZC1hc3NpZ24gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbmQtYXNzaWduICovXG4vKiBlc2xpbnQtZGlzYWJsZSBkZWZhdWx0LWNhc2UgKi9cbi8qIGVzbGludC1kaXNhYmxlIGRlZmF1bHQtY2FzZSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tY29uZC1hc3NpZ24gKi9cbi8vIGltcG9ydCBtb2R1bGUgZnJvbSAnbW9kdWxlJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5jb25zdCBDTElFTlRfU0laRV9LRVlTID0geyB4OiAnY2xpZW50V2lkdGgnLCB5OiAnY2xpZW50SGVpZ2h0JyB9O1xuY29uc3QgQ0xJRU5UX1NUQVJUX0tFWVMgPSB7IHg6ICdjbGllbnRUb3AnLCB5OiAnY2xpZW50TGVmdCcgfTtcbmNvbnN0IElOTkVSX1NJWkVfS0VZUyA9IHsgeDogJ2lubmVyV2lkdGgnLCB5OiAnaW5uZXJIZWlnaHQnIH07XG5jb25zdCBPRkZTRVRfU0laRV9LRVlTID0geyB4OiAnb2Zmc2V0V2lkdGgnLCB5OiAnb2Zmc2V0SGVpZ2h0JyB9O1xuY29uc3QgT0ZGU0VUX1NUQVJUX0tFWVMgPSB7IHg6ICdvZmZzZXRMZWZ0JywgeTogJ29mZnNldFRvcCcgfTtcbmNvbnN0IE9WRVJGTE9XX0tFWVMgPSB7IHg6ICdvdmVyZmxvd1gnLCB5OiAnb3ZlcmZsb3dZJyB9O1xuY29uc3QgU0NST0xMX1NJWkVfS0VZUyA9IHsgeDogJ3Njcm9sbFdpZHRoJywgeTogJ3Njcm9sbEhlaWdodCcgfTtcbmNvbnN0IFNDUk9MTF9TVEFSVF9LRVlTID0geyB4OiAnc2Nyb2xsTGVmdCcsIHk6ICdzY3JvbGxUb3AnIH07XG5jb25zdCBTSVpFX0tFWVMgPSB7IHg6ICdtaW5XaWR0aCcsIHk6ICdtaW5IZWlnaHQnIH07XG5cbmNvbnN0IE5PT1AgPSAoKSA9PiB7fTtcblxuLy8gSWYgYSBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgYG9wdGlvbnNgIGFyZ3VtZW50IHRvXG4vLyBhZGQvcmVtb3ZlRXZlbnRMaXN0ZW5lciwgd2UgbmVlZCB0byBjaGVjaywgb3RoZXJ3aXNlIHdlIHdpbGxcbi8vIGFjY2lkZW50YWxseSBzZXQgYGNhcHR1cmVgIHdpdGggYSB0cnV0aHkgdmFsdWUuXG5jb25zdCBQQVNTSVZFID0gKCgpID0+IHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gZmFsc2U7XG4gIGxldCBoYXNTdXBwb3J0ID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykuYWRkRXZlbnRMaXN0ZW5lcigndGVzdCcsIE5PT1AsIHtcbiAgICAgIGdldCBwYXNzaXZlKCkge1xuICAgICAgICBoYXNTdXBwb3J0ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gbm9vcFxuICB9XG4gIHJldHVybiBoYXNTdXBwb3J0O1xufSkoKVxuICA/IHsgcGFzc2l2ZTogdHJ1ZSB9XG4gIDogZmFsc2U7XG5cbmNvbnN0IFVOU1RBQkxFX01FU1NBR0UgPSAnUmVhY3RMaXN0IGZhaWxlZCB0byByZWFjaCBhIHN0YWJsZSBzdGF0ZS4nO1xuY29uc3QgTUFYX1NZTkNfVVBEQVRFUyA9IDEwMDtcblxuY29uc3QgaXNFcXVhbFN1YnNldCA9IChhLCBiKSA9PiB7XG4gIGZvciAoY29uc3Qga2V5IGluIGIpIGlmIChhW2tleV0gIT09IGJba2V5XSkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVhY3RMaXN0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgc3RhdGljIGRpc3BsYXlOYW1lID0gJ1JlYWN0TGlzdCc7XG5cbiAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICBheGlzOiBQcm9wVHlwZXMub25lT2YoWyd4JywgJ3knXSksXG4gICAgaW5pdGlhbEluZGV4OiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIGl0ZW1SZW5kZXJlcjogUHJvcFR5cGVzLmZ1bmMsXG4gICAgaXRlbVNpemVFc3RpbWF0b3I6IFByb3BUeXBlcy5mdW5jLFxuICAgIGl0ZW1TaXplR2V0dGVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBpdGVtc1JlbmRlcmVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBsZW5ndGg6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgbWluU2l6ZTogUHJvcFR5cGVzLm51bWJlcixcbiAgICBwYWdlU2l6ZTogUHJvcFR5cGVzLm51bWJlcixcbiAgICBzY3JvbGxQYXJlbnRHZXR0ZXI6IFByb3BUeXBlcy5mdW5jLFxuICAgIHRocmVzaG9sZDogUHJvcFR5cGVzLm51bWJlcixcbiAgICB0eXBlOiBQcm9wVHlwZXMub25lT2YoWydzaW1wbGUnLCAndmFyaWFibGUnLCAndW5pZm9ybSddKSxcbiAgICB1c2VTdGF0aWNTaXplOiBQcm9wVHlwZXMuYm9vbCxcbiAgICB1c2VUcmFuc2xhdGUzZDogUHJvcFR5cGVzLmJvb2xcbiAgfTtcblxuICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgIGF4aXM6ICd5JyxcbiAgICBpdGVtUmVuZGVyZXI6IChpbmRleCwga2V5KSA9PiA8ZGl2IGtleT17a2V5fT57aW5kZXh9PC9kaXY+LFxuICAgIGl0ZW1zUmVuZGVyZXI6IChpdGVtcywgcmVmKSA9PiA8ZGl2IHJlZj17cmVmfT57aXRlbXN9PC9kaXY+LFxuICAgIGxlbmd0aDogMCxcbiAgICBtaW5TaXplOiAxLFxuICAgIHBhZ2VTaXplOiAxMCxcbiAgICB0aHJlc2hvbGQ6IDEwMCxcbiAgICB0eXBlOiAnc2ltcGxlJyxcbiAgICB1c2VTdGF0aWNTaXplOiBmYWxzZSxcbiAgICB1c2VUcmFuc2xhdGUzZDogZmFsc2VcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICBjb25zdCB7IGluaXRpYWxJbmRleCB9ID0gcHJvcHM7XG4gICAgY29uc3QgaXRlbXNQZXJSb3cgPSAxO1xuICAgIGNvbnN0IHsgZnJvbSwgc2l6ZSB9ID0gdGhpcy5jb25zdHJhaW4oaW5pdGlhbEluZGV4LCAwLCBpdGVtc1BlclJvdywgcHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7IGZyb20sIHNpemUsIGl0ZW1zUGVyUm93IH07XG4gICAgdGhpcy5jYWNoZSA9IHt9O1xuICAgIHRoaXMucHJldlByZXZTdGF0ZSA9IHt9O1xuICAgIHRoaXMudW5zdGFibGUgPSBmYWxzZTtcbiAgICB0aGlzLnVwZGF0ZUNvdW50ZXIgPSAwO1xuICB9XG5cbiAgLy90bnI6IGNvbW1lbnRpbmcgdGhpcyBvdXQuLiBub3Qgc3VyZSBpZiBpdCBpcyBhY3R1YWxseSBuZWVkZWRcbiAgLy8gVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gIC8vICAgbGV0IHsgZnJvbSwgc2l6ZSwgaXRlbXNQZXJSb3cgfSA9IHRoaXMuc3RhdGU7XG4gIC8vICAgaWYgKG5leHRQcm9wcy5jbGVhckNhY2hlKSB0aGlzLmNhY2hlID0ge307XG4gIC8vICAgdGhpcy5tYXliZVNldFN0YXRlKFxuICAvLyAgICAgdGhpcy5jb25zdHJhaW4oZnJvbSwgc2l6ZSwgaXRlbXNQZXJSb3csIG5leHRQcm9wcyksXG4gIC8vICAgICBOT09QXG4gIC8vICAgKTtcbiAgLy8gfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHRoaXMudXBkYXRlRnJhbWUgPSB0aGlzLnVwZGF0ZUZyYW1lLmJpbmQodGhpcyk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMudXBkYXRlRnJhbWUpO1xuICAgIHRoaXMudXBkYXRlRnJhbWUodGhpcy5zY3JvbGxUby5iaW5kKHRoaXMsIHRoaXMucHJvcHMuaW5pdGlhbEluZGV4KSk7XG4gIH1cblxuICBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgLy8gSWYgdGhlIGxpc3QgaGFzIHJlYWNoZWQgYW4gdW5zdGFibGUgc3RhdGUsIHByZXZlbnQgYW4gaW5maW5pdGUgbG9vcC5cbiAgICBpZiAodGhpcy51bnN0YWJsZSkgcmV0dXJuO1xuXG4gICAgaWYgKCsrdGhpcy51cGRhdGVDb3VudGVyID4gTUFYX1NZTkNfVVBEQVRFUykge1xuICAgICAgdGhpcy51bnN0YWJsZSA9IHRydWU7XG4gICAgICByZXR1cm4gY29uc29sZS5lcnJvcihVTlNUQUJMRV9NRVNTQUdFKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudXBkYXRlQ291bnRlclRpbWVvdXRJZCkge1xuICAgICAgdGhpcy51cGRhdGVDb3VudGVyVGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlQ291bnRlciA9IDA7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnVwZGF0ZUNvdW50ZXJUaW1lb3V0SWQ7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gICAgLy8gdGhpcy5kb250VXBkYXRlID0gdHJ1ZTtcbiAgICB0aGlzLnVwZGF0ZUZyYW1lKCk7XG5cbiAgICAvL1ROUjogZXh0cmEgY29kZSB0byAnZml4JyB0aGUgc2Nyb2xsIGhlaWdodCB3aGVuIHNjcm9sbGluZyB1cHdhcmRzXG4gICAgLy90bnIgY29tbWVudGluZyB0aGlzIG91dCBiZWNhdXNlIHdlIGFyZSBub3cgZG9pbmcgYSBiZXR0ZXIgam9iIG9mIGNhbGN1bGF0aW5nIHJvdyBoZWlnaHRzXG4gICAgLy8gaWYgKHRoaXMucm93VG9GaXhTY3JvbGwpIHtcbiAgICAvLyAgIGNvbnN0IHsgcm93LCBjYWNoZTogcHJldmlvdXNTaXplIH0gPSB0aGlzLnJvd1RvRml4U2Nyb2xsO1xuICAgIC8vICAgY29uc3QgYWN0dWFsU2l6ZSA9IHRoaXMuY2FjaGVbcm93XTtcbiAgICAvLyAgIGlmIChhY3R1YWxTaXplICYmIGFjdHVhbFNpemUgIT09IHByZXZpb3VzU2l6ZSkge1xuICAgIC8vICAgICB0aGlzLmdldFNjcm9sbFBhcmVudCgpLnNjcm9sbEJ5KHtcbiAgICAvLyAgICAgICB0b3A6IC0oXG4gICAgLy8gICAgICAgICAocHJldmlvdXNTaXplIHx8IHRoaXMucHJvcHMuaXRlbVNpemVFc3RpbWF0b3Iocm93LCB7fSkpIC0gYWN0dWFsU2l6ZVxuICAgIC8vICAgICAgIClcbiAgICAvLyAgICAgfSk7XG4gICAgLy8gICAgIHRoaXMucm93VG9GaXhTY3JvbGwgPSBudWxsO1xuICAgIC8vICAgfVxuICAgIC8vIH1cbiAgfVxuICAvLyBzaG91bGRDb21wb25lbnRVcGRhdGUoKSB7XG4gIC8vICAgaWYgKHRoaXMuZG9udFVwZGF0ZSkge1xuICAvLyAgICAgdGhpcy5kb250VXBkYXRlID0gZmFsc2U7XG4gIC8vICAgICByZXR1cm4gZmFsc2U7XG4gIC8vICAgfVxuICAvLyAgIHJldHVybiB0cnVlO1xuICAvLyB9XG4gIG1heWJlU2V0U3RhdGUoYiwgY2IpIHtcbiAgICBpZiAoaXNFcXVhbFN1YnNldCh0aGlzLnN0YXRlLCBiKSkgcmV0dXJuIGNiKCk7XG5cbiAgICAvL1ROUjogZXh0cmEgY29kZSB0byAnZml4JyB0aGUgc2Nyb2xsIGhlaWdodCB3aGVuIHNjcm9sbGluZyB1cHdhcmRzXG4gICAgaWYgKHRoaXMuc3RhdGUuZnJvbSA9PT0gYi5mcm9tICsgMSkge1xuICAgICAgdGhpcy5yb3dUb0ZpeFNjcm9sbCA9IHsgcm93OiBiLmZyb20sIGNhY2hlOiB0aGlzLmNhY2hlW2IuZnJvbV0gfTtcbiAgICB9XG4gICAgdGhpcy5zZXRTdGF0ZShiLCBjYik7XG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy51cGRhdGVGcmFtZSk7XG4gICAgdGhpcy5zY3JvbGxQYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy51cGRhdGVGcmFtZSwgUEFTU0lWRSk7XG4gICAgdGhpcy5zY3JvbGxQYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V3aGVlbCcsIE5PT1AsIFBBU1NJVkUpO1xuICB9XG5cbiAgZ2V0T2Zmc2V0KGVsKSB7XG4gICAgY29uc3QgeyBheGlzIH0gPSB0aGlzLnByb3BzO1xuICAgIGxldCBvZmZzZXQgPSBlbFtDTElFTlRfU1RBUlRfS0VZU1theGlzXV0gfHwgMDtcbiAgICBjb25zdCBvZmZzZXRLZXkgPSBPRkZTRVRfU1RBUlRfS0VZU1theGlzXTtcbiAgICBkbyBvZmZzZXQgKz0gZWxbb2Zmc2V0S2V5XSB8fCAwO1xuICAgIHdoaWxlICgoZWwgPSBlbC5vZmZzZXRQYXJlbnQpKTtcbiAgICByZXR1cm4gb2Zmc2V0O1xuICB9XG5cbiAgZ2V0RWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWwgfHwgdGhpcy5pdGVtcztcbiAgfVxuXG4gIGdldFNjcm9sbFBhcmVudCgpIHtcbiAgICBjb25zdCB7IGF4aXMsIHNjcm9sbFBhcmVudEdldHRlciB9ID0gdGhpcy5wcm9wcztcbiAgICBpZiAoc2Nyb2xsUGFyZW50R2V0dGVyKSByZXR1cm4gc2Nyb2xsUGFyZW50R2V0dGVyKCk7XG4gICAgbGV0IGVsID0gdGhpcy5nZXRFbCgpO1xuICAgIGlmICghZWwpIHJldHVybiB3aW5kb3c7XG4gICAgY29uc3Qgb3ZlcmZsb3dLZXkgPSBPVkVSRkxPV19LRVlTW2F4aXNdO1xuICAgIHdoaWxlICgoZWwgPSBlbC5wYXJlbnRFbGVtZW50KSkge1xuICAgICAgc3dpdGNoICh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbClbb3ZlcmZsb3dLZXldKSB7XG4gICAgICAgIGNhc2UgJ2F1dG8nOlxuICAgICAgICBjYXNlICdzY3JvbGwnOlxuICAgICAgICBjYXNlICdvdmVybGF5JzpcbiAgICAgICAgICByZXR1cm4gZWw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB3aW5kb3c7XG4gIH1cblxuICBnZXRTY3JvbGxQb3NpdGlvbigpIHtcbiAgICBjb25zdCB7IHNjcm9sbFBhcmVudCB9ID0gdGhpcztcbiAgICBjb25zdCB7IGF4aXMgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qgc2Nyb2xsS2V5ID0gU0NST0xMX1NUQVJUX0tFWVNbYXhpc107XG4gICAgY29uc3QgYWN0dWFsID1cbiAgICAgIHNjcm9sbFBhcmVudCA9PT0gd2luZG93XG4gICAgICAgID8gLy8gRmlyZWZveCBhbHdheXMgcmV0dXJucyBkb2N1bWVudC5ib2R5W3Njcm9sbEtleV0gYXMgMCBhbmQgQ2hyb21lL1NhZmFyaVxuICAgICAgICAgIC8vIGFsd2F5cyByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W3Njcm9sbEtleV0gYXMgMCwgc28gdGFrZVxuICAgICAgICAgIC8vIHdoaWNoZXZlciBoYXMgYSB2YWx1ZS5cbiAgICAgICAgICBkb2N1bWVudC5ib2R5W3Njcm9sbEtleV0gfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W3Njcm9sbEtleV1cbiAgICAgICAgOiBzY3JvbGxQYXJlbnRbc2Nyb2xsS2V5XTtcbiAgICBjb25zdCBtYXggPSB0aGlzLmdldFNjcm9sbFNpemUoKSAtIHRoaXMuZ2V0Vmlld3BvcnRTaXplKCk7XG4gICAgY29uc3Qgc2Nyb2xsID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oYWN0dWFsLCBtYXgpKTtcbiAgICBjb25zdCBlbCA9IHRoaXMuZ2V0RWwoKTtcbiAgICByZXR1cm4gdGhpcy5nZXRPZmZzZXQoc2Nyb2xsUGFyZW50KSArIHNjcm9sbCAtIHRoaXMuZ2V0T2Zmc2V0KGVsKTtcbiAgfVxuXG4gIHNldFNjcm9sbChvZmZzZXQpIHtcbiAgICBjb25zdCB7IHNjcm9sbFBhcmVudCB9ID0gdGhpcztcbiAgICBjb25zdCB7IGF4aXMgfSA9IHRoaXMucHJvcHM7XG4gICAgb2Zmc2V0ICs9IHRoaXMuZ2V0T2Zmc2V0KHRoaXMuZ2V0RWwoKSk7XG4gICAgaWYgKHNjcm9sbFBhcmVudCA9PT0gd2luZG93KSByZXR1cm4gd2luZG93LnNjcm9sbFRvKDAsIG9mZnNldCk7XG5cbiAgICBvZmZzZXQgLT0gdGhpcy5nZXRPZmZzZXQodGhpcy5zY3JvbGxQYXJlbnQpO1xuICAgIHNjcm9sbFBhcmVudFtTQ1JPTExfU1RBUlRfS0VZU1theGlzXV0gPSBvZmZzZXQ7XG4gIH1cblxuICBnZXRWaWV3cG9ydFNpemUoKSB7XG4gICAgY29uc3QgeyBzY3JvbGxQYXJlbnQgfSA9IHRoaXM7XG4gICAgY29uc3QgeyBheGlzIH0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiBzY3JvbGxQYXJlbnQgPT09IHdpbmRvd1xuICAgICAgPyB3aW5kb3dbSU5ORVJfU0laRV9LRVlTW2F4aXNdXVxuICAgICAgOiBzY3JvbGxQYXJlbnRbQ0xJRU5UX1NJWkVfS0VZU1theGlzXV07XG4gIH1cblxuICBnZXRTY3JvbGxTaXplKCkge1xuICAgIGNvbnN0IHsgc2Nyb2xsUGFyZW50IH0gPSB0aGlzO1xuICAgIGNvbnN0IHsgYm9keSwgZG9jdW1lbnRFbGVtZW50IH0gPSBkb2N1bWVudDtcbiAgICBjb25zdCBrZXkgPSBTQ1JPTExfU0laRV9LRVlTW3RoaXMucHJvcHMuYXhpc107XG4gICAgcmV0dXJuIHNjcm9sbFBhcmVudCA9PT0gd2luZG93XG4gICAgICA/IE1hdGgubWF4KGJvZHlba2V5XSwgZG9jdW1lbnRFbGVtZW50W2tleV0pXG4gICAgICA6IHNjcm9sbFBhcmVudFtrZXldO1xuICB9XG5cbiAgaGFzRGV0ZXJtaW5hdGVTaXplKCkge1xuICAgIGNvbnN0IHsgaXRlbVNpemVHZXR0ZXIsIHR5cGUgfSA9IHRoaXMucHJvcHM7XG4gICAgcmV0dXJuIHR5cGUgPT09ICd1bmlmb3JtJyB8fCBpdGVtU2l6ZUdldHRlcjtcbiAgfVxuXG4gIGdldFN0YXJ0QW5kRW5kKHRocmVzaG9sZCA9IHRoaXMucHJvcHMudGhyZXNob2xkKSB7XG4gICAgY29uc3Qgc2Nyb2xsID0gdGhpcy5nZXRTY3JvbGxQb3NpdGlvbigpO1xuICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoMCwgc2Nyb2xsIC0gdGhyZXNob2xkKTtcbiAgICBsZXQgZW5kID0gc2Nyb2xsICsgdGhpcy5nZXRWaWV3cG9ydFNpemUoKSArIHRocmVzaG9sZDtcbiAgICBpZiAodGhpcy5oYXNEZXRlcm1pbmF0ZVNpemUoKSkge1xuICAgICAgZW5kID0gTWF0aC5taW4oZW5kLCB0aGlzLmdldFNwYWNlQmVmb3JlKHRoaXMucHJvcHMubGVuZ3RoKSk7XG4gICAgfVxuICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgfVxuXG4gIGdldEl0ZW1TaXplQW5kSXRlbXNQZXJSb3coKSB7XG4gICAgY29uc3QgeyBheGlzLCB1c2VTdGF0aWNTaXplIH0gPSB0aGlzLnByb3BzO1xuICAgIGxldCB7IGl0ZW1TaXplLCBpdGVtc1BlclJvdyB9ID0gdGhpcy5zdGF0ZTtcbiAgICBpZiAodXNlU3RhdGljU2l6ZSAmJiBpdGVtU2l6ZSAmJiBpdGVtc1BlclJvdykge1xuICAgICAgcmV0dXJuIHsgaXRlbVNpemUsIGl0ZW1zUGVyUm93IH07XG4gICAgfVxuXG4gICAgY29uc3QgaXRlbUVscyA9IHRoaXMuaXRlbXMuY2hpbGRyZW47XG4gICAgaWYgKCFpdGVtRWxzLmxlbmd0aCkgcmV0dXJuIHt9O1xuXG4gICAgY29uc3QgZmlyc3RFbCA9IGl0ZW1FbHNbMF07XG5cbiAgICAvLyBGaXJlZm94IGhhcyBhIHByb2JsZW0gd2hlcmUgaXQgd2lsbCByZXR1cm4gYSAqc2xpZ2h0bHkqIChsZXNzIHRoYW5cbiAgICAvLyB0aG91c2FuZHRocyBvZiBhIHBpeGVsKSBkaWZmZXJlbnQgc2l6ZSBmb3IgdGhlIHNhbWUgZWxlbWVudCBiZXR3ZWVuXG4gICAgLy8gcmVuZGVycy4gVGhpcyBjYW4gY2F1c2UgYW4gaW5maW5pdGUgcmVuZGVyIGxvb3AsIHNvIG9ubHkgY2hhbmdlIHRoZVxuICAgIC8vIGl0ZW1TaXplIHdoZW4gaXQgaXMgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQuXG4gICAgY29uc3QgZmlyc3RFbFNpemUgPSBmaXJzdEVsW09GRlNFVF9TSVpFX0tFWVNbYXhpc11dO1xuICAgIGNvbnN0IGRlbHRhID0gTWF0aC5hYnMoZmlyc3RFbFNpemUgLSBpdGVtU2l6ZSk7XG4gICAgaWYgKGlzTmFOKGRlbHRhKSB8fCBkZWx0YSA+PSAxKSBpdGVtU2l6ZSA9IGZpcnN0RWxTaXplO1xuXG4gICAgaWYgKCFpdGVtU2l6ZSkgcmV0dXJuIHt9O1xuXG4gICAgY29uc3Qgc3RhcnRLZXkgPSBPRkZTRVRfU1RBUlRfS0VZU1theGlzXTtcbiAgICBjb25zdCBmaXJzdFN0YXJ0ID0gZmlyc3RFbFtzdGFydEtleV07XG4gICAgaXRlbXNQZXJSb3cgPSAxO1xuICAgIGZvciAoXG4gICAgICBsZXQgaXRlbSA9IGl0ZW1FbHNbaXRlbXNQZXJSb3ddO1xuICAgICAgaXRlbSAmJiBpdGVtW3N0YXJ0S2V5XSA9PT0gZmlyc3RTdGFydDtcbiAgICAgIGl0ZW0gPSBpdGVtRWxzW2l0ZW1zUGVyUm93XVxuICAgICkge1xuICAgICAgKytpdGVtc1BlclJvdztcbiAgICB9XG5cbiAgICByZXR1cm4geyBpdGVtU2l6ZSwgaXRlbXNQZXJSb3cgfTtcbiAgfVxuXG4gIHVwZGF0ZUZyYW1lKGNiKSB7XG4gICAgdGhpcy51cGRhdGVTY3JvbGxQYXJlbnQoKTtcbiAgICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSBjYiA9IE5PT1A7XG4gICAgc3dpdGNoICh0aGlzLnByb3BzLnR5cGUpIHtcbiAgICAgIGNhc2UgJ3NpbXBsZSc6XG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVNpbXBsZUZyYW1lKGNiKTtcbiAgICAgIGNhc2UgJ3ZhcmlhYmxlJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlVmFyaWFibGVGcmFtZShjYik7XG4gICAgICBjYXNlICd1bmlmb3JtJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlVW5pZm9ybUZyYW1lKGNiKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVTY3JvbGxQYXJlbnQoKSB7XG4gICAgY29uc3QgcHJldiA9IHRoaXMuc2Nyb2xsUGFyZW50O1xuICAgIGlmIChwcmV2KSB7XG4gICAgICByZXR1cm47IC8vaHR0cHM6Ly9naXRodWIuY29tL2NvZGVyaWV0eS9yZWFjdC1saXN0L3B1bGwvMTk2XG4gICAgfVxuICAgIHRoaXMuc2Nyb2xsUGFyZW50ID0gdGhpcy5nZXRTY3JvbGxQYXJlbnQoKTtcbiAgICBpZiAocHJldiA9PT0gdGhpcy5zY3JvbGxQYXJlbnQpIHJldHVybjtcbiAgICBpZiAocHJldikge1xuICAgICAgcHJldi5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLnVwZGF0ZUZyYW1lKTtcbiAgICAgIHByZXYucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V3aGVlbCcsIE5PT1ApO1xuICAgIH1cbiAgICB0aGlzLnNjcm9sbFBhcmVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLnVwZGF0ZUZyYW1lLCBQQVNTSVZFKTtcbiAgICB0aGlzLnNjcm9sbFBhcmVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXdoZWVsJywgTk9PUCwgUEFTU0lWRSk7XG4gIH1cblxuICB1cGRhdGVTaW1wbGVGcmFtZShjYikge1xuICAgIGNvbnN0IHsgZW5kIH0gPSB0aGlzLmdldFN0YXJ0QW5kRW5kKCk7XG4gICAgY29uc3QgaXRlbUVscyA9IHRoaXMuaXRlbXMuY2hpbGRyZW47XG4gICAgbGV0IGVsRW5kID0gMDtcblxuICAgIGlmIChpdGVtRWxzLmxlbmd0aCkge1xuICAgICAgY29uc3QgeyBheGlzIH0gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3QgZmlyc3RJdGVtRWwgPSBpdGVtRWxzWzBdO1xuICAgICAgY29uc3QgbGFzdEl0ZW1FbCA9IGl0ZW1FbHNbaXRlbUVscy5sZW5ndGggLSAxXTtcbiAgICAgIGVsRW5kID1cbiAgICAgICAgdGhpcy5nZXRPZmZzZXQobGFzdEl0ZW1FbCkgK1xuICAgICAgICBsYXN0SXRlbUVsW09GRlNFVF9TSVpFX0tFWVNbYXhpc11dIC1cbiAgICAgICAgdGhpcy5nZXRPZmZzZXQoZmlyc3RJdGVtRWwpO1xuICAgIH1cblxuICAgIGlmIChlbEVuZCA+IGVuZCkgcmV0dXJuIGNiKCk7XG5cbiAgICBjb25zdCB7IHBhZ2VTaXplLCBsZW5ndGggfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qgc2l6ZSA9IE1hdGgubWluKHRoaXMuc3RhdGUuc2l6ZSArIHBhZ2VTaXplLCBsZW5ndGgpO1xuICAgIHRoaXMubWF5YmVTZXRTdGF0ZSh7IHNpemUgfSwgY2IpO1xuICB9XG5cbiAgdXBkYXRlVmFyaWFibGVGcmFtZShjYikge1xuICAgIGlmICghdGhpcy5wcm9wcy5pdGVtU2l6ZUdldHRlcikgdGhpcy5jYWNoZVNpemVzKCk7XG5cbiAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHRoaXMuZ2V0U3RhcnRBbmRFbmQoKTtcbiAgICBjb25zdCB7IGxlbmd0aCwgcGFnZVNpemUgfSA9IHRoaXMucHJvcHM7XG4gICAgbGV0IHNwYWNlID0gMDtcbiAgICBsZXQgZnJvbSA9IDA7XG4gICAgbGV0IHNpemUgPSAwO1xuICAgIGNvbnN0IG1heEZyb20gPSBsZW5ndGggLSAxO1xuXG4gICAgd2hpbGUgKGZyb20gPCBtYXhGcm9tKSB7XG4gICAgICBjb25zdCBpdGVtU2l6ZSA9IHRoaXMuZ2V0U2l6ZU9mSXRlbShmcm9tKTtcbiAgICAgIGlmIChpdGVtU2l6ZSA9PSBudWxsIHx8IHNwYWNlICsgaXRlbVNpemUgPiBzdGFydCkgYnJlYWs7XG4gICAgICBzcGFjZSArPSBpdGVtU2l6ZTtcbiAgICAgICsrZnJvbTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXhTaXplID0gbGVuZ3RoIC0gZnJvbTtcblxuICAgIHdoaWxlIChzaXplIDwgbWF4U2l6ZSAmJiBzcGFjZSA8IGVuZCkge1xuICAgICAgY29uc3QgaXRlbVNpemUgPSB0aGlzLmdldFNpemVPZkl0ZW0oZnJvbSArIHNpemUpO1xuICAgICAgaWYgKGl0ZW1TaXplID09IG51bGwpIHtcbiAgICAgICAgc2l6ZSA9IE1hdGgubWluKHNpemUgKyBwYWdlU2l6ZSwgbWF4U2l6ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3BhY2UgKz0gaXRlbVNpemU7XG4gICAgICArK3NpemU7XG4gICAgfVxuICAgIHRoaXMubWF5YmVTZXRTdGF0ZSh7IGZyb20sIHNpemUgfSwgY2IpO1xuICB9XG5cbiAgdXBkYXRlVW5pZm9ybUZyYW1lKGNiKSB7XG4gICAgY29uc3QgeyBpdGVtU2l6ZSwgaXRlbXNQZXJSb3cgfSA9IHRoaXMuZ2V0SXRlbVNpemVBbmRJdGVtc1BlclJvdygpO1xuXG4gICAgaWYgKCFpdGVtU2l6ZSB8fCAhaXRlbXNQZXJSb3cpIHJldHVybiBjYigpO1xuXG4gICAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSB0aGlzLmdldFN0YXJ0QW5kRW5kKCk7XG5cbiAgICBjb25zdCB7IGZyb20sIHNpemUgfSA9IHRoaXMuY29uc3RyYWluKFxuICAgICAgTWF0aC5mbG9vcihzdGFydCAvIGl0ZW1TaXplKSAqIGl0ZW1zUGVyUm93LFxuICAgICAgKE1hdGguY2VpbCgoZW5kIC0gc3RhcnQpIC8gaXRlbVNpemUpICsgMSkgKiBpdGVtc1BlclJvdyxcbiAgICAgIGl0ZW1zUGVyUm93LFxuICAgICAgdGhpcy5wcm9wc1xuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy5tYXliZVNldFN0YXRlKHsgaXRlbXNQZXJSb3csIGZyb20sIGl0ZW1TaXplLCBzaXplIH0sIGNiKTtcbiAgfVxuXG4gIGdldFNwYWNlQmVmb3JlKGluZGV4LCBjYWNoZSA9IHt9KSB7XG4gICAgaWYgKGNhY2hlW2luZGV4XSAhPSBudWxsKSByZXR1cm4gY2FjaGVbaW5kZXhdO1xuXG4gICAgLy8gVHJ5IHRoZSBzdGF0aWMgaXRlbVNpemUuXG4gICAgY29uc3QgeyBpdGVtU2l6ZSwgaXRlbXNQZXJSb3cgfSA9IHRoaXMuc3RhdGU7XG4gICAgaWYgKGl0ZW1TaXplKSB7XG4gICAgICByZXR1cm4gKGNhY2hlW2luZGV4XSA9IE1hdGguZmxvb3IoaW5kZXggLyBpdGVtc1BlclJvdykgKiBpdGVtU2l6ZSk7XG4gICAgfVxuXG4gICAgLy8gRmluZCB0aGUgY2xvc2VzdCBzcGFjZSB0byBpbmRleCB0aGVyZSBpcyBhIGNhY2hlZCB2YWx1ZSBmb3IuXG4gICAgbGV0IGZyb20gPSBpbmRleDtcbiAgICB3aGlsZSAoZnJvbSA+IDAgJiYgY2FjaGVbLS1mcm9tXSA9PSBudWxsKTtcblxuICAgIC8vIEZpbmFsbHksIGFjY3VtdWxhdGUgc2l6ZXMgb2YgaXRlbXMgZnJvbSAtIGluZGV4LlxuICAgIGxldCBzcGFjZSA9IGNhY2hlW2Zyb21dIHx8IDA7XG4gICAgZm9yIChsZXQgaSA9IGZyb207IGkgPCBpbmRleDsgKytpKSB7XG4gICAgICBjYWNoZVtpXSA9IHNwYWNlO1xuICAgICAgY29uc3QgaXRlbVNpemUgPSB0aGlzLmdldFNpemVPZkl0ZW0oaSk7XG4gICAgICBpZiAoaXRlbVNpemUgPT0gbnVsbCkgYnJlYWs7XG4gICAgICBzcGFjZSArPSBpdGVtU2l6ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGNhY2hlW2luZGV4XSA9IHNwYWNlKTtcbiAgfVxuXG4gIGNhY2hlU2l6ZXMoKSB7XG4gICAgY29uc3QgeyBjYWNoZSB9ID0gdGhpcztcbiAgICBjb25zdCB7IGZyb20gfSA9IHRoaXMuc3RhdGU7XG4gICAgaWYgKCF0aGlzLml0ZW1zKSByZXR1cm47XG4gICAgY29uc3QgaXRlbUVscyA9IHRoaXMuaXRlbXMuY2hpbGRyZW47XG4gICAgY29uc3Qgc2l6ZUtleSA9IE9GRlNFVF9TSVpFX0tFWVNbdGhpcy5wcm9wcy5heGlzXTtcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IGl0ZW1FbHMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICBjYWNoZVtmcm9tICsgaV0gPSBpdGVtRWxzW2ldW3NpemVLZXldO1xuICAgIH1cbiAgfVxuXG4gIGdldFNpemVPZkl0ZW0oaW5kZXgpIHtcbiAgICBjb25zdCB7IGNhY2hlLCBpdGVtcyB9ID0gdGhpcztcbiAgICBjb25zdCB7IGF4aXMsIGl0ZW1TaXplR2V0dGVyLCBpdGVtU2l6ZUVzdGltYXRvciwgdHlwZSB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7IGZyb20sIGl0ZW1TaXplLCBzaXplIH0gPSB0aGlzLnN0YXRlO1xuXG4gICAgLy8gVHJ5IHRoZSBzdGF0aWMgaXRlbVNpemUuXG4gICAgaWYgKGl0ZW1TaXplKSByZXR1cm4gaXRlbVNpemU7XG5cbiAgICAvLyBUcnkgdGhlIGl0ZW1TaXplR2V0dGVyLlxuICAgIGlmIChpdGVtU2l6ZUdldHRlcikgcmV0dXJuIGl0ZW1TaXplR2V0dGVyKGluZGV4KTtcblxuICAgIC8vIFRyeSB0aGUgY2FjaGUuXG4gICAgaWYgKGluZGV4IGluIGNhY2hlKSByZXR1cm4gY2FjaGVbaW5kZXhdO1xuXG4gICAgLy8gVHJ5IHRoZSBET00uXG4gICAgaWYgKHR5cGUgPT09ICdzaW1wbGUnICYmIGluZGV4ID49IGZyb20gJiYgaW5kZXggPCBmcm9tICsgc2l6ZSAmJiBpdGVtcykge1xuICAgICAgY29uc3QgaXRlbUVsID0gaXRlbXMuY2hpbGRyZW5baW5kZXggLSBmcm9tXTtcbiAgICAgIGlmIChpdGVtRWwpIHJldHVybiBpdGVtRWxbT0ZGU0VUX1NJWkVfS0VZU1theGlzXV07XG4gICAgfVxuXG4gICAgLy8gVHJ5IHRoZSBpdGVtU2l6ZUVzdGltYXRvci5cbiAgICBpZiAoaXRlbVNpemVFc3RpbWF0b3IpIHJldHVybiBpdGVtU2l6ZUVzdGltYXRvcihpbmRleCwgY2FjaGUpO1xuICB9XG5cbiAgY29uc3RyYWluKGZyb20sIHNpemUsIGl0ZW1zUGVyUm93LCB7IGxlbmd0aCwgbWluU2l6ZSwgdHlwZSB9KSB7XG4gICAgc2l6ZSA9IE1hdGgubWF4KHNpemUsIG1pblNpemUpO1xuICAgIGxldCBtb2QgPSBzaXplICUgaXRlbXNQZXJSb3c7XG4gICAgaWYgKG1vZCkgc2l6ZSArPSBpdGVtc1BlclJvdyAtIG1vZDtcbiAgICBpZiAoc2l6ZSA+IGxlbmd0aCkgc2l6ZSA9IGxlbmd0aDtcbiAgICBmcm9tID1cbiAgICAgIHR5cGUgPT09ICdzaW1wbGUnIHx8ICFmcm9tXG4gICAgICAgID8gMFxuICAgICAgICA6IE1hdGgubWF4KE1hdGgubWluKGZyb20sIGxlbmd0aCAtIHNpemUpLCAwKTtcblxuICAgIGlmICgobW9kID0gZnJvbSAlIGl0ZW1zUGVyUm93KSkge1xuICAgICAgZnJvbSAtPSBtb2Q7XG4gICAgICBzaXplICs9IG1vZDtcbiAgICB9XG5cbiAgICByZXR1cm4geyBmcm9tLCBzaXplIH07XG4gIH1cblxuICBzY3JvbGxUbyhpbmRleCkge1xuICAgIGlmIChpbmRleCAhPSBudWxsKSB0aGlzLnNldFNjcm9sbCh0aGlzLmdldFNwYWNlQmVmb3JlKGluZGV4KSAtIDEwMCk7XG4gIH1cblxuICBzY3JvbGxBcm91bmQoaW5kZXgpIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5nZXRTY3JvbGxQb3NpdGlvbigpO1xuICAgIGNvbnN0IGJvdHRvbSA9IHRoaXMuZ2V0U3BhY2VCZWZvcmUoaW5kZXgpO1xuICAgIGNvbnN0IHRvcCA9IGJvdHRvbSAtIHRoaXMuZ2V0Vmlld3BvcnRTaXplKCkgKyB0aGlzLmdldFNpemVPZkl0ZW0oaW5kZXgpO1xuICAgIGNvbnN0IG1pbiA9IE1hdGgubWluKHRvcCwgYm90dG9tKTtcbiAgICBjb25zdCBtYXggPSBNYXRoLm1heCh0b3AsIGJvdHRvbSk7XG4gICAgaWYgKGN1cnJlbnQgPD0gbWluKSByZXR1cm4gdGhpcy5zZXRTY3JvbGwobWluIC0gdGhpcy5nZXRWaWV3cG9ydFNpemUoKSk7XG4gICAgaWYgKGN1cnJlbnQgPiBtYXgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldFNjcm9sbChtYXggLSB0aGlzLmdldFZpZXdwb3J0U2l6ZSgpIC0gMTAwKTtcbiAgICB9XG4gIH1cblxuICBnZXRWaXNpYmxlUmFuZ2UoKSB7XG4gICAgY29uc3QgeyBmcm9tLCBzaXplIH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gdGhpcy5nZXRTdGFydEFuZEVuZCgwKTtcbiAgICBjb25zdCBjYWNoZSA9IHt9O1xuICAgIGxldCBmaXJzdCwgbGFzdDtcbiAgICBmb3IgKGxldCBpID0gZnJvbTsgaSA8IGZyb20gKyBzaXplOyArK2kpIHtcbiAgICAgIGNvbnN0IGl0ZW1TdGFydCA9IHRoaXMuZ2V0U3BhY2VCZWZvcmUoaSwgY2FjaGUpO1xuICAgICAgY29uc3QgaXRlbUVuZCA9IGl0ZW1TdGFydCArIHRoaXMuZ2V0U2l6ZU9mSXRlbShpKTtcbiAgICAgIGlmIChmaXJzdCA9PSBudWxsICYmIGl0ZW1FbmQgPiBzdGFydCkgZmlyc3QgPSBpO1xuICAgICAgaWYgKGZpcnN0ICE9IG51bGwgJiYgaXRlbVN0YXJ0IDwgZW5kKSBsYXN0ID0gaTtcbiAgICB9XG4gICAgcmV0dXJuIFtmaXJzdCwgbGFzdF07XG4gIH1cbiAgLy90aGlzIGNhbiBiZSB1c2VkIGFzIGEgc3RhdGljIG1ldGhvZCB2aWEgdGhlIHJlYWN0IGxpc3QgcmVmXG4gIGdldEZyYWN0aW9uYWxWaXNpYmxlUmFuZ2UoKSB7XG4gICAgY29uc3QgeyBmcm9tLCBzaXplIH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gdGhpcy5nZXRTdGFydEFuZEVuZCgwKTtcbiAgICBjb25zdCBjYWNoZSA9IHt9O1xuICAgIGxldCBmaXJzdCwgbGFzdDtcblxuICAgIGZvciAobGV0IGkgPSBmcm9tOyBpIDwgZnJvbSArIHNpemU7ICsraSkge1xuICAgICAgY29uc3QgaXRlbVN0YXJ0ID0gdGhpcy5nZXRTcGFjZUJlZm9yZShpLCBjYWNoZSk7XG4gICAgICBjb25zdCBpdGVtRW5kID0gaXRlbVN0YXJ0ICsgdGhpcy5nZXRTaXplT2ZJdGVtKGkpO1xuICAgICAgaWYgKGZpcnN0ID09IG51bGwgJiYgaXRlbUVuZCA+IHN0YXJ0KSB7XG4gICAgICAgIGZpcnN0ID0gaSArIDEgLSAoaXRlbUVuZCAtIHN0YXJ0KSAvIChpdGVtRW5kIC0gaXRlbVN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIGlmIChmaXJzdCAhPSBudWxsICYmIGl0ZW1TdGFydCA8IGVuZCkge1xuICAgICAgICBsYXN0ID0gaSAtIChpdGVtRW5kIC0gZW5kKSAvIChpdGVtRW5kIC0gaXRlbVN0YXJ0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtmaXJzdCwgbGFzdF07XG4gIH1cblxuICByZW5kZXJJdGVtcygpIHtcbiAgICBjb25zdCB7IGl0ZW1SZW5kZXJlciwgaXRlbXNSZW5kZXJlciB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7IGZyb20sIHNpemUgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgaXRlbXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7ICsraSkgaXRlbXMucHVzaChpdGVtUmVuZGVyZXIoZnJvbSArIGksIGkpKTtcbiAgICByZXR1cm4gaXRlbXNSZW5kZXJlcihpdGVtcywgYyA9PiAodGhpcy5pdGVtcyA9IGMpKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IGF4aXMsIGxlbmd0aCwgdHlwZSAvKiB1c2VUcmFuc2xhdGUzZCAqLyB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7IGZyb20sIGl0ZW1zUGVyUm93IH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5yZW5kZXJJdGVtcygpO1xuICAgIGlmICh0eXBlID09PSAnc2ltcGxlJykgcmV0dXJuIGl0ZW1zO1xuXG4gICAgY29uc3Qgc3R5bGUgPSB7IHBvc2l0aW9uOiAncmVsYXRpdmUnIH07XG4gICAgY29uc3QgY2FjaGUgPSB7fTtcbiAgICBjb25zdCBib3R0b20gPSBNYXRoLmNlaWwobGVuZ3RoIC8gaXRlbXNQZXJSb3cpICogaXRlbXNQZXJSb3c7XG4gICAgY29uc3Qgc2l6ZSA9IHRoaXMuZ2V0U3BhY2VCZWZvcmUoYm90dG9tLCBjYWNoZSk7XG4gICAgaWYgKHNpemUpIHtcbiAgICAgIHN0eWxlW1NJWkVfS0VZU1theGlzXV0gPSBzaXplO1xuICAgICAgaWYgKGF4aXMgPT09ICd4Jykgc3R5bGUub3ZlcmZsb3dYID0gJ2hpZGRlbic7XG4gICAgfVxuICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuZ2V0U3BhY2VCZWZvcmUoZnJvbSwgY2FjaGUpO1xuICAgIGNvbnN0IHggPSBheGlzID09PSAneCcgPyBvZmZzZXQgOiAwO1xuICAgIGNvbnN0IHkgPSBheGlzID09PSAneScgPyBvZmZzZXQgOiAwO1xuICAgIGNvbnN0IGxpc3RTdHlsZSA9IHtcbiAgICAgIC8vdG5yIHRyeWluZyBvdXQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlcmlldHkvcmVhY3QtbGlzdC9wdWxsLzE1NFxuICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICB0b3A6IHksXG4gICAgICBsZWZ0OiB4XG4gICAgfTtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdlxuICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICAgIHJlZj17YyA9PiB7XG4gICAgICAgICAgaWYgKGMpIHRoaXMuZWwgPSBjO1xuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICA8ZGl2IHN0eWxlPXtsaXN0U3R5bGV9PntpdGVtc308L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn1cbiJdfQ==