@teselagen/react-table 6.10.8 → 6.10.11
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/es/index.js +4 -2
- package/es/methods.js +13 -32
- package/es/utils.js +2 -2
- package/lib/index.js +4 -2
- package/lib/methods.js +13 -32
- package/lib/utils.js +2 -2
- package/package.json +1 -1
- package/react-table.js +16 -33
- package/react-table.min.js +1 -1
- package/src/index.js +2 -0
- package/src/methods.js +22 -44
- package/src/utils.js +9 -1
- package/CHANGELOG.md +0 -182
- package/es/ReactList.js +0 -702
- package/lib/ReactList.js +0 -715
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==
|