rome-rails 2.1.22
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.rspec +2 -0
- data/.travis.yml +4 -0
- data/CODE_OF_CONDUCT.md +13 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +82 -0
- data/Rakefile +6 -0
- data/lib/rome/rails.rb +8 -0
- data/lib/rome/rails/version.rb +5 -0
- data/rome-rails.gemspec +31 -0
- data/vendor/assets/javascripts/rome.js +5765 -0
- data/vendor/assets/javascripts/rome.standalone.js +2658 -0
- data/vendor/assets/stylesheets/rome.css +94 -0
- metadata +116 -0
@@ -0,0 +1,2658 @@
|
|
1
|
+
/**
|
2
|
+
* rome - Customizable date (and time) picker. Opt-in UI, no jQuery!
|
3
|
+
* @version v2.1.22
|
4
|
+
* @link https://github.com/bevacqua/rome
|
5
|
+
* @license MIT
|
6
|
+
*/
|
7
|
+
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.rome = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
|
8
|
+
'use strict';
|
9
|
+
|
10
|
+
var crossvent = require('crossvent');
|
11
|
+
var throttle = require('./throttle');
|
12
|
+
var tailormade = require('./tailormade');
|
13
|
+
|
14
|
+
function bullseye (el, target, options) {
|
15
|
+
var o = options;
|
16
|
+
var domTarget = target && target.tagName;
|
17
|
+
|
18
|
+
if (!domTarget && arguments.length === 2) {
|
19
|
+
o = target;
|
20
|
+
}
|
21
|
+
if (!domTarget) {
|
22
|
+
target = el;
|
23
|
+
}
|
24
|
+
if (!o) { o = {}; }
|
25
|
+
|
26
|
+
var destroyed = false;
|
27
|
+
var throttledWrite = throttle(write, 30);
|
28
|
+
var tailorOptions = { update: o.autoupdateToCaret !== false && update };
|
29
|
+
var tailor = o.caret && tailormade(target, tailorOptions);
|
30
|
+
|
31
|
+
write();
|
32
|
+
|
33
|
+
if (o.tracking !== false) {
|
34
|
+
crossvent.add(window, 'resize', throttledWrite);
|
35
|
+
}
|
36
|
+
|
37
|
+
return {
|
38
|
+
read: readNull,
|
39
|
+
refresh: write,
|
40
|
+
destroy: destroy,
|
41
|
+
sleep: sleep
|
42
|
+
};
|
43
|
+
|
44
|
+
function sleep () {
|
45
|
+
tailorOptions.sleeping = true;
|
46
|
+
}
|
47
|
+
|
48
|
+
function readNull () { return read(); }
|
49
|
+
|
50
|
+
function read (readings) {
|
51
|
+
var bounds = target.getBoundingClientRect();
|
52
|
+
var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
|
53
|
+
if (tailor) {
|
54
|
+
readings = tailor.read();
|
55
|
+
return {
|
56
|
+
x: (readings.absolute ? 0 : bounds.left) + readings.x,
|
57
|
+
y: (readings.absolute ? 0 : bounds.top) + scrollTop + readings.y + 20
|
58
|
+
};
|
59
|
+
}
|
60
|
+
return {
|
61
|
+
x: bounds.left,
|
62
|
+
y: bounds.top + scrollTop
|
63
|
+
};
|
64
|
+
}
|
65
|
+
|
66
|
+
function update (readings) {
|
67
|
+
write(readings);
|
68
|
+
}
|
69
|
+
|
70
|
+
function write (readings) {
|
71
|
+
if (destroyed) {
|
72
|
+
throw new Error('Bullseye can\'t refresh after being destroyed. Create another instance instead.');
|
73
|
+
}
|
74
|
+
if (tailor && !readings) {
|
75
|
+
tailorOptions.sleeping = false;
|
76
|
+
tailor.refresh(); return;
|
77
|
+
}
|
78
|
+
var p = read(readings);
|
79
|
+
if (!tailor && target !== el) {
|
80
|
+
p.y += target.offsetHeight;
|
81
|
+
}
|
82
|
+
el.style.left = p.x + 'px';
|
83
|
+
el.style.top = p.y + 'px';
|
84
|
+
}
|
85
|
+
|
86
|
+
function destroy () {
|
87
|
+
if (tailor) { tailor.destroy(); }
|
88
|
+
crossvent.remove(window, 'resize', throttledWrite);
|
89
|
+
destroyed = true;
|
90
|
+
}
|
91
|
+
}
|
92
|
+
|
93
|
+
module.exports = bullseye;
|
94
|
+
|
95
|
+
},{"./tailormade":11,"./throttle":12,"crossvent":18}],2:[function(require,module,exports){
|
96
|
+
(function (global){
|
97
|
+
'use strict';
|
98
|
+
|
99
|
+
var getSelection;
|
100
|
+
var doc = global.document;
|
101
|
+
var getSelectionRaw = require('./getSelectionRaw');
|
102
|
+
var getSelectionNullOp = require('./getSelectionNullOp');
|
103
|
+
var getSelectionSynthetic = require('./getSelectionSynthetic');
|
104
|
+
var isHost = require('./isHost');
|
105
|
+
if (isHost.method(global, 'getSelection')) {
|
106
|
+
getSelection = getSelectionRaw;
|
107
|
+
} else if (typeof doc.selection === 'object' && doc.selection) {
|
108
|
+
getSelection = getSelectionSynthetic;
|
109
|
+
} else {
|
110
|
+
getSelection = getSelectionNullOp;
|
111
|
+
}
|
112
|
+
|
113
|
+
module.exports = getSelection;
|
114
|
+
|
115
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
116
|
+
|
117
|
+
},{"./getSelectionNullOp":3,"./getSelectionRaw":4,"./getSelectionSynthetic":5,"./isHost":6}],3:[function(require,module,exports){
|
118
|
+
'use strict';
|
119
|
+
|
120
|
+
function noop () {}
|
121
|
+
|
122
|
+
function getSelectionNullOp () {
|
123
|
+
return {
|
124
|
+
removeAllRanges: noop,
|
125
|
+
addRange: noop
|
126
|
+
};
|
127
|
+
}
|
128
|
+
|
129
|
+
module.exports = getSelectionNullOp;
|
130
|
+
|
131
|
+
},{}],4:[function(require,module,exports){
|
132
|
+
(function (global){
|
133
|
+
'use strict';
|
134
|
+
|
135
|
+
function getSelectionRaw () {
|
136
|
+
return global.getSelection();
|
137
|
+
}
|
138
|
+
|
139
|
+
module.exports = getSelectionRaw;
|
140
|
+
|
141
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
142
|
+
|
143
|
+
},{}],5:[function(require,module,exports){
|
144
|
+
(function (global){
|
145
|
+
'use strict';
|
146
|
+
|
147
|
+
var rangeToTextRange = require('./rangeToTextRange');
|
148
|
+
var doc = global.document;
|
149
|
+
var body = doc.body;
|
150
|
+
var GetSelectionProto = GetSelection.prototype;
|
151
|
+
|
152
|
+
function GetSelection (selection) {
|
153
|
+
var self = this;
|
154
|
+
var range = selection.createRange();
|
155
|
+
|
156
|
+
this._selection = selection;
|
157
|
+
this._ranges = [];
|
158
|
+
|
159
|
+
if (selection.type === 'Control') {
|
160
|
+
updateControlSelection(self);
|
161
|
+
} else if (isTextRange(range)) {
|
162
|
+
updateFromTextRange(self, range);
|
163
|
+
} else {
|
164
|
+
updateEmptySelection(self);
|
165
|
+
}
|
166
|
+
}
|
167
|
+
|
168
|
+
GetSelectionProto.removeAllRanges = function () {
|
169
|
+
var textRange;
|
170
|
+
try {
|
171
|
+
this._selection.empty();
|
172
|
+
if (this._selection.type !== 'None') {
|
173
|
+
textRange = body.createTextRange();
|
174
|
+
textRange.select();
|
175
|
+
this._selection.empty();
|
176
|
+
}
|
177
|
+
} catch (e) {
|
178
|
+
}
|
179
|
+
updateEmptySelection(this);
|
180
|
+
};
|
181
|
+
|
182
|
+
GetSelectionProto.addRange = function (range) {
|
183
|
+
if (this._selection.type === 'Control') {
|
184
|
+
addRangeToControlSelection(this, range);
|
185
|
+
} else {
|
186
|
+
rangeToTextRange(range).select();
|
187
|
+
this._ranges[0] = range;
|
188
|
+
this.rangeCount = 1;
|
189
|
+
this.isCollapsed = this._ranges[0].collapsed;
|
190
|
+
updateAnchorAndFocusFromRange(this, range, false);
|
191
|
+
}
|
192
|
+
};
|
193
|
+
|
194
|
+
GetSelectionProto.setRanges = function (ranges) {
|
195
|
+
this.removeAllRanges();
|
196
|
+
var rangeCount = ranges.length;
|
197
|
+
if (rangeCount > 1) {
|
198
|
+
createControlSelection(this, ranges);
|
199
|
+
} else if (rangeCount) {
|
200
|
+
this.addRange(ranges[0]);
|
201
|
+
}
|
202
|
+
};
|
203
|
+
|
204
|
+
GetSelectionProto.getRangeAt = function (index) {
|
205
|
+
if (index < 0 || index >= this.rangeCount) {
|
206
|
+
throw new Error('getRangeAt(): index out of bounds');
|
207
|
+
} else {
|
208
|
+
return this._ranges[index].cloneRange();
|
209
|
+
}
|
210
|
+
};
|
211
|
+
|
212
|
+
GetSelectionProto.removeRange = function (range) {
|
213
|
+
if (this._selection.type !== 'Control') {
|
214
|
+
removeRangeManually(this, range);
|
215
|
+
return;
|
216
|
+
}
|
217
|
+
var controlRange = this._selection.createRange();
|
218
|
+
var rangeElement = getSingleElementFromRange(range);
|
219
|
+
var newControlRange = body.createControlRange();
|
220
|
+
var el;
|
221
|
+
var removed = false;
|
222
|
+
for (var i = 0, len = controlRange.length; i < len; ++i) {
|
223
|
+
el = controlRange.item(i);
|
224
|
+
if (el !== rangeElement || removed) {
|
225
|
+
newControlRange.add(controlRange.item(i));
|
226
|
+
} else {
|
227
|
+
removed = true;
|
228
|
+
}
|
229
|
+
}
|
230
|
+
newControlRange.select();
|
231
|
+
updateControlSelection(this);
|
232
|
+
};
|
233
|
+
|
234
|
+
GetSelectionProto.eachRange = function (fn, returnValue) {
|
235
|
+
var i = 0;
|
236
|
+
var len = this._ranges.length;
|
237
|
+
for (i = 0; i < len; ++i) {
|
238
|
+
if (fn(this.getRangeAt(i))) {
|
239
|
+
return returnValue;
|
240
|
+
}
|
241
|
+
}
|
242
|
+
};
|
243
|
+
|
244
|
+
GetSelectionProto.getAllRanges = function () {
|
245
|
+
var ranges = [];
|
246
|
+
this.eachRange(function (range) {
|
247
|
+
ranges.push(range);
|
248
|
+
});
|
249
|
+
return ranges;
|
250
|
+
};
|
251
|
+
|
252
|
+
GetSelectionProto.setSingleRange = function (range) {
|
253
|
+
this.removeAllRanges();
|
254
|
+
this.addRange(range);
|
255
|
+
};
|
256
|
+
|
257
|
+
function createControlSelection (sel, ranges) {
|
258
|
+
var controlRange = body.createControlRange();
|
259
|
+
for (var i = 0, el, len = ranges.length; i < len; ++i) {
|
260
|
+
el = getSingleElementFromRange(ranges[i]);
|
261
|
+
try {
|
262
|
+
controlRange.add(el);
|
263
|
+
} catch (e) {
|
264
|
+
throw new Error('setRanges(): Element could not be added to control selection');
|
265
|
+
}
|
266
|
+
}
|
267
|
+
controlRange.select();
|
268
|
+
updateControlSelection(sel);
|
269
|
+
}
|
270
|
+
|
271
|
+
function removeRangeManually (sel, range) {
|
272
|
+
var ranges = sel.getAllRanges();
|
273
|
+
sel.removeAllRanges();
|
274
|
+
for (var i = 0, len = ranges.length; i < len; ++i) {
|
275
|
+
if (!isSameRange(range, ranges[i])) {
|
276
|
+
sel.addRange(ranges[i]);
|
277
|
+
}
|
278
|
+
}
|
279
|
+
if (!sel.rangeCount) {
|
280
|
+
updateEmptySelection(sel);
|
281
|
+
}
|
282
|
+
}
|
283
|
+
|
284
|
+
function updateAnchorAndFocusFromRange (sel, range) {
|
285
|
+
var anchorPrefix = 'start';
|
286
|
+
var focusPrefix = 'end';
|
287
|
+
sel.anchorNode = range[anchorPrefix + 'Container'];
|
288
|
+
sel.anchorOffset = range[anchorPrefix + 'Offset'];
|
289
|
+
sel.focusNode = range[focusPrefix + 'Container'];
|
290
|
+
sel.focusOffset = range[focusPrefix + 'Offset'];
|
291
|
+
}
|
292
|
+
|
293
|
+
function updateEmptySelection (sel) {
|
294
|
+
sel.anchorNode = sel.focusNode = null;
|
295
|
+
sel.anchorOffset = sel.focusOffset = 0;
|
296
|
+
sel.rangeCount = 0;
|
297
|
+
sel.isCollapsed = true;
|
298
|
+
sel._ranges.length = 0;
|
299
|
+
}
|
300
|
+
|
301
|
+
function rangeContainsSingleElement (rangeNodes) {
|
302
|
+
if (!rangeNodes.length || rangeNodes[0].nodeType !== 1) {
|
303
|
+
return false;
|
304
|
+
}
|
305
|
+
for (var i = 1, len = rangeNodes.length; i < len; ++i) {
|
306
|
+
if (!isAncestorOf(rangeNodes[0], rangeNodes[i])) {
|
307
|
+
return false;
|
308
|
+
}
|
309
|
+
}
|
310
|
+
return true;
|
311
|
+
}
|
312
|
+
|
313
|
+
function getSingleElementFromRange (range) {
|
314
|
+
var nodes = range.getNodes();
|
315
|
+
if (!rangeContainsSingleElement(nodes)) {
|
316
|
+
throw new Error('getSingleElementFromRange(): range did not consist of a single element');
|
317
|
+
}
|
318
|
+
return nodes[0];
|
319
|
+
}
|
320
|
+
|
321
|
+
function isTextRange (range) {
|
322
|
+
return range && range.text !== void 0;
|
323
|
+
}
|
324
|
+
|
325
|
+
function updateFromTextRange (sel, range) {
|
326
|
+
sel._ranges = [range];
|
327
|
+
updateAnchorAndFocusFromRange(sel, range, false);
|
328
|
+
sel.rangeCount = 1;
|
329
|
+
sel.isCollapsed = range.collapsed;
|
330
|
+
}
|
331
|
+
|
332
|
+
function updateControlSelection (sel) {
|
333
|
+
sel._ranges.length = 0;
|
334
|
+
if (sel._selection.type === 'None') {
|
335
|
+
updateEmptySelection(sel);
|
336
|
+
} else {
|
337
|
+
var controlRange = sel._selection.createRange();
|
338
|
+
if (isTextRange(controlRange)) {
|
339
|
+
updateFromTextRange(sel, controlRange);
|
340
|
+
} else {
|
341
|
+
sel.rangeCount = controlRange.length;
|
342
|
+
var range;
|
343
|
+
for (var i = 0; i < sel.rangeCount; ++i) {
|
344
|
+
range = doc.createRange();
|
345
|
+
range.selectNode(controlRange.item(i));
|
346
|
+
sel._ranges.push(range);
|
347
|
+
}
|
348
|
+
sel.isCollapsed = sel.rangeCount === 1 && sel._ranges[0].collapsed;
|
349
|
+
updateAnchorAndFocusFromRange(sel, sel._ranges[sel.rangeCount - 1], false);
|
350
|
+
}
|
351
|
+
}
|
352
|
+
}
|
353
|
+
|
354
|
+
function addRangeToControlSelection (sel, range) {
|
355
|
+
var controlRange = sel._selection.createRange();
|
356
|
+
var rangeElement = getSingleElementFromRange(range);
|
357
|
+
var newControlRange = body.createControlRange();
|
358
|
+
for (var i = 0, len = controlRange.length; i < len; ++i) {
|
359
|
+
newControlRange.add(controlRange.item(i));
|
360
|
+
}
|
361
|
+
try {
|
362
|
+
newControlRange.add(rangeElement);
|
363
|
+
} catch (e) {
|
364
|
+
throw new Error('addRange(): Element could not be added to control selection');
|
365
|
+
}
|
366
|
+
newControlRange.select();
|
367
|
+
updateControlSelection(sel);
|
368
|
+
}
|
369
|
+
|
370
|
+
function isSameRange (left, right) {
|
371
|
+
return (
|
372
|
+
left.startContainer === right.startContainer &&
|
373
|
+
left.startOffset === right.startOffset &&
|
374
|
+
left.endContainer === right.endContainer &&
|
375
|
+
left.endOffset === right.endOffset
|
376
|
+
);
|
377
|
+
}
|
378
|
+
|
379
|
+
function isAncestorOf (ancestor, descendant) {
|
380
|
+
var node = descendant;
|
381
|
+
while (node.parentNode) {
|
382
|
+
if (node.parentNode === ancestor) {
|
383
|
+
return true;
|
384
|
+
}
|
385
|
+
node = node.parentNode;
|
386
|
+
}
|
387
|
+
return false;
|
388
|
+
}
|
389
|
+
|
390
|
+
function getSelection () {
|
391
|
+
return new GetSelection(global.document.selection);
|
392
|
+
}
|
393
|
+
|
394
|
+
module.exports = getSelection;
|
395
|
+
|
396
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
397
|
+
|
398
|
+
},{"./rangeToTextRange":7}],6:[function(require,module,exports){
|
399
|
+
'use strict';
|
400
|
+
|
401
|
+
function isHostMethod (host, prop) {
|
402
|
+
var type = typeof host[prop];
|
403
|
+
return type === 'function' || !!(type === 'object' && host[prop]) || type === 'unknown';
|
404
|
+
}
|
405
|
+
|
406
|
+
function isHostProperty (host, prop) {
|
407
|
+
return typeof host[prop] !== 'undefined';
|
408
|
+
}
|
409
|
+
|
410
|
+
function many (fn) {
|
411
|
+
return function areHosted (host, props) {
|
412
|
+
var i = props.length;
|
413
|
+
while (i--) {
|
414
|
+
if (!fn(host, props[i])) {
|
415
|
+
return false;
|
416
|
+
}
|
417
|
+
}
|
418
|
+
return true;
|
419
|
+
};
|
420
|
+
}
|
421
|
+
|
422
|
+
module.exports = {
|
423
|
+
method: isHostMethod,
|
424
|
+
methods: many(isHostMethod),
|
425
|
+
property: isHostProperty,
|
426
|
+
properties: many(isHostProperty)
|
427
|
+
};
|
428
|
+
|
429
|
+
},{}],7:[function(require,module,exports){
|
430
|
+
(function (global){
|
431
|
+
'use strict';
|
432
|
+
|
433
|
+
var doc = global.document;
|
434
|
+
var body = doc.body;
|
435
|
+
|
436
|
+
function rangeToTextRange (p) {
|
437
|
+
if (p.collapsed) {
|
438
|
+
return createBoundaryTextRange({ node: p.startContainer, offset: p.startOffset }, true);
|
439
|
+
}
|
440
|
+
var startRange = createBoundaryTextRange({ node: p.startContainer, offset: p.startOffset }, true);
|
441
|
+
var endRange = createBoundaryTextRange({ node: p.endContainer, offset: p.endOffset }, false);
|
442
|
+
var textRange = body.createTextRange();
|
443
|
+
textRange.setEndPoint('StartToStart', startRange);
|
444
|
+
textRange.setEndPoint('EndToEnd', endRange);
|
445
|
+
return textRange;
|
446
|
+
}
|
447
|
+
|
448
|
+
function isCharacterDataNode (node) {
|
449
|
+
var t = node.nodeType;
|
450
|
+
return t === 3 || t === 4 || t === 8 ;
|
451
|
+
}
|
452
|
+
|
453
|
+
function createBoundaryTextRange (p, starting) {
|
454
|
+
var bound;
|
455
|
+
var parent;
|
456
|
+
var offset = p.offset;
|
457
|
+
var workingNode;
|
458
|
+
var childNodes;
|
459
|
+
var range = body.createTextRange();
|
460
|
+
var data = isCharacterDataNode(p.node);
|
461
|
+
|
462
|
+
if (data) {
|
463
|
+
bound = p.node;
|
464
|
+
parent = bound.parentNode;
|
465
|
+
} else {
|
466
|
+
childNodes = p.node.childNodes;
|
467
|
+
bound = offset < childNodes.length ? childNodes[offset] : null;
|
468
|
+
parent = p.node;
|
469
|
+
}
|
470
|
+
|
471
|
+
workingNode = doc.createElement('span');
|
472
|
+
workingNode.innerHTML = '&#feff;';
|
473
|
+
|
474
|
+
if (bound) {
|
475
|
+
parent.insertBefore(workingNode, bound);
|
476
|
+
} else {
|
477
|
+
parent.appendChild(workingNode);
|
478
|
+
}
|
479
|
+
|
480
|
+
range.moveToElementText(workingNode);
|
481
|
+
range.collapse(!starting);
|
482
|
+
parent.removeChild(workingNode);
|
483
|
+
|
484
|
+
if (data) {
|
485
|
+
range[starting ? 'moveStart' : 'moveEnd']('character', offset);
|
486
|
+
}
|
487
|
+
return range;
|
488
|
+
}
|
489
|
+
|
490
|
+
module.exports = rangeToTextRange;
|
491
|
+
|
492
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
493
|
+
|
494
|
+
},{}],8:[function(require,module,exports){
|
495
|
+
'use strict';
|
496
|
+
|
497
|
+
var getSelection = require('./getSelection');
|
498
|
+
var setSelection = require('./setSelection');
|
499
|
+
|
500
|
+
module.exports = {
|
501
|
+
get: getSelection,
|
502
|
+
set: setSelection
|
503
|
+
};
|
504
|
+
|
505
|
+
},{"./getSelection":2,"./setSelection":9}],9:[function(require,module,exports){
|
506
|
+
(function (global){
|
507
|
+
'use strict';
|
508
|
+
|
509
|
+
var getSelection = require('./getSelection');
|
510
|
+
var rangeToTextRange = require('./rangeToTextRange');
|
511
|
+
var doc = global.document;
|
512
|
+
|
513
|
+
function setSelection (p) {
|
514
|
+
if (doc.createRange) {
|
515
|
+
modernSelection();
|
516
|
+
} else {
|
517
|
+
oldSelection();
|
518
|
+
}
|
519
|
+
|
520
|
+
function modernSelection () {
|
521
|
+
var sel = getSelection();
|
522
|
+
var range = doc.createRange();
|
523
|
+
if (!p.startContainer) {
|
524
|
+
return;
|
525
|
+
}
|
526
|
+
if (p.endContainer) {
|
527
|
+
range.setEnd(p.endContainer, p.endOffset);
|
528
|
+
} else {
|
529
|
+
range.setEnd(p.startContainer, p.startOffset);
|
530
|
+
}
|
531
|
+
range.setStart(p.startContainer, p.startOffset);
|
532
|
+
sel.removeAllRanges();
|
533
|
+
sel.addRange(range);
|
534
|
+
}
|
535
|
+
|
536
|
+
function oldSelection () {
|
537
|
+
rangeToTextRange(p).select();
|
538
|
+
}
|
539
|
+
}
|
540
|
+
|
541
|
+
module.exports = setSelection;
|
542
|
+
|
543
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
544
|
+
|
545
|
+
},{"./getSelection":2,"./rangeToTextRange":7}],10:[function(require,module,exports){
|
546
|
+
'use strict';
|
547
|
+
|
548
|
+
var get = easyGet;
|
549
|
+
var set = easySet;
|
550
|
+
|
551
|
+
if (document.selection && document.selection.createRange) {
|
552
|
+
get = hardGet;
|
553
|
+
set = hardSet;
|
554
|
+
}
|
555
|
+
|
556
|
+
function easyGet (el) {
|
557
|
+
return {
|
558
|
+
start: el.selectionStart,
|
559
|
+
end: el.selectionEnd
|
560
|
+
};
|
561
|
+
}
|
562
|
+
|
563
|
+
function hardGet (el) {
|
564
|
+
var active = document.activeElement;
|
565
|
+
if (active !== el) {
|
566
|
+
el.focus();
|
567
|
+
}
|
568
|
+
|
569
|
+
var range = document.selection.createRange();
|
570
|
+
var bookmark = range.getBookmark();
|
571
|
+
var original = el.value;
|
572
|
+
var marker = getUniqueMarker(original);
|
573
|
+
var parent = range.parentElement();
|
574
|
+
if (parent === null || !inputs(parent)) {
|
575
|
+
return result(0, 0);
|
576
|
+
}
|
577
|
+
range.text = marker + range.text + marker;
|
578
|
+
|
579
|
+
var contents = el.value;
|
580
|
+
|
581
|
+
el.value = original;
|
582
|
+
range.moveToBookmark(bookmark);
|
583
|
+
range.select();
|
584
|
+
|
585
|
+
return result(contents.indexOf(marker), contents.lastIndexOf(marker) - marker.length);
|
586
|
+
|
587
|
+
function result (start, end) {
|
588
|
+
if (active !== el) { // don't disrupt pre-existing state
|
589
|
+
if (active) {
|
590
|
+
active.focus();
|
591
|
+
} else {
|
592
|
+
el.blur();
|
593
|
+
}
|
594
|
+
}
|
595
|
+
return { start: start, end: end };
|
596
|
+
}
|
597
|
+
}
|
598
|
+
|
599
|
+
function getUniqueMarker (contents) {
|
600
|
+
var marker;
|
601
|
+
do {
|
602
|
+
marker = '@@marker.' + Math.random() * new Date();
|
603
|
+
} while (contents.indexOf(marker) !== -1);
|
604
|
+
return marker;
|
605
|
+
}
|
606
|
+
|
607
|
+
function inputs (el) {
|
608
|
+
return ((el.tagName === 'INPUT' && el.type === 'text') || el.tagName === 'TEXTAREA');
|
609
|
+
}
|
610
|
+
|
611
|
+
function easySet (el, p) {
|
612
|
+
el.selectionStart = parse(el, p.start);
|
613
|
+
el.selectionEnd = parse(el, p.end);
|
614
|
+
}
|
615
|
+
|
616
|
+
function hardSet (el, p) {
|
617
|
+
var range = el.createTextRange();
|
618
|
+
|
619
|
+
if (p.start === 'end' && p.end === 'end') {
|
620
|
+
range.collapse(false);
|
621
|
+
range.select();
|
622
|
+
} else {
|
623
|
+
range.collapse(true);
|
624
|
+
range.moveEnd('character', parse(el, p.end));
|
625
|
+
range.moveStart('character', parse(el, p.start));
|
626
|
+
range.select();
|
627
|
+
}
|
628
|
+
}
|
629
|
+
|
630
|
+
function parse (el, value) {
|
631
|
+
return value === 'end' ? el.value.length : value || 0;
|
632
|
+
}
|
633
|
+
|
634
|
+
function sell (el, p) {
|
635
|
+
if (arguments.length === 2) {
|
636
|
+
set(el, p);
|
637
|
+
}
|
638
|
+
return get(el);
|
639
|
+
}
|
640
|
+
|
641
|
+
module.exports = sell;
|
642
|
+
|
643
|
+
},{}],11:[function(require,module,exports){
|
644
|
+
(function (global){
|
645
|
+
'use strict';
|
646
|
+
|
647
|
+
var sell = require('sell');
|
648
|
+
var crossvent = require('crossvent');
|
649
|
+
var seleccion = require('seleccion');
|
650
|
+
var throttle = require('./throttle');
|
651
|
+
var getSelection = seleccion.get;
|
652
|
+
var props = [
|
653
|
+
'direction',
|
654
|
+
'boxSizing',
|
655
|
+
'width',
|
656
|
+
'height',
|
657
|
+
'overflowX',
|
658
|
+
'overflowY',
|
659
|
+
'borderTopWidth',
|
660
|
+
'borderRightWidth',
|
661
|
+
'borderBottomWidth',
|
662
|
+
'borderLeftWidth',
|
663
|
+
'paddingTop',
|
664
|
+
'paddingRight',
|
665
|
+
'paddingBottom',
|
666
|
+
'paddingLeft',
|
667
|
+
'fontStyle',
|
668
|
+
'fontVariant',
|
669
|
+
'fontWeight',
|
670
|
+
'fontStretch',
|
671
|
+
'fontSize',
|
672
|
+
'fontSizeAdjust',
|
673
|
+
'lineHeight',
|
674
|
+
'fontFamily',
|
675
|
+
'textAlign',
|
676
|
+
'textTransform',
|
677
|
+
'textIndent',
|
678
|
+
'textDecoration',
|
679
|
+
'letterSpacing',
|
680
|
+
'wordSpacing'
|
681
|
+
];
|
682
|
+
var win = global;
|
683
|
+
var doc = document;
|
684
|
+
var ff = win.mozInnerScreenX !== null && win.mozInnerScreenX !== void 0;
|
685
|
+
|
686
|
+
function tailormade (el, options) {
|
687
|
+
var textInput = el.tagName === 'INPUT' || el.tagName === 'TEXTAREA';
|
688
|
+
var throttledRefresh = throttle(refresh, 30);
|
689
|
+
var o = options || {};
|
690
|
+
|
691
|
+
bind();
|
692
|
+
|
693
|
+
return {
|
694
|
+
read: readPosition,
|
695
|
+
refresh: throttledRefresh,
|
696
|
+
destroy: destroy
|
697
|
+
};
|
698
|
+
|
699
|
+
function noop () {}
|
700
|
+
function readPosition () { return (textInput ? coordsText : coordsHTML)(); }
|
701
|
+
|
702
|
+
function refresh () {
|
703
|
+
if (o.sleeping) {
|
704
|
+
return;
|
705
|
+
}
|
706
|
+
return (o.update || noop)(readPosition());
|
707
|
+
}
|
708
|
+
|
709
|
+
function coordsText () {
|
710
|
+
var p = sell(el);
|
711
|
+
var context = prepare();
|
712
|
+
var readings = readTextCoords(context, p.start);
|
713
|
+
doc.body.removeChild(context.mirror);
|
714
|
+
return readings;
|
715
|
+
}
|
716
|
+
|
717
|
+
function coordsHTML () {
|
718
|
+
var sel = getSelection();
|
719
|
+
if (sel.rangeCount) {
|
720
|
+
var range = sel.getRangeAt(0);
|
721
|
+
var needsToWorkAroundNewlineBug = range.startContainer.nodeName === 'P' && range.startOffset === 0;
|
722
|
+
if (needsToWorkAroundNewlineBug) {
|
723
|
+
return {
|
724
|
+
x: range.startContainer.offsetLeft,
|
725
|
+
y: range.startContainer.offsetTop,
|
726
|
+
absolute: true
|
727
|
+
};
|
728
|
+
}
|
729
|
+
if (range.getClientRects) {
|
730
|
+
var rects = range.getClientRects();
|
731
|
+
if (rects.length > 0) {
|
732
|
+
return {
|
733
|
+
x: rects[0].left,
|
734
|
+
y: rects[0].top,
|
735
|
+
absolute: true
|
736
|
+
};
|
737
|
+
}
|
738
|
+
}
|
739
|
+
}
|
740
|
+
return { x: 0, y: 0 };
|
741
|
+
}
|
742
|
+
|
743
|
+
function readTextCoords (context, p) {
|
744
|
+
var rest = doc.createElement('span');
|
745
|
+
var mirror = context.mirror;
|
746
|
+
var computed = context.computed;
|
747
|
+
|
748
|
+
write(mirror, read(el).substring(0, p));
|
749
|
+
|
750
|
+
if (el.tagName === 'INPUT') {
|
751
|
+
mirror.textContent = mirror.textContent.replace(/\s/g, '\u00a0');
|
752
|
+
}
|
753
|
+
|
754
|
+
write(rest, read(el).substring(p) || '.');
|
755
|
+
|
756
|
+
mirror.appendChild(rest);
|
757
|
+
|
758
|
+
return {
|
759
|
+
x: rest.offsetLeft + parseInt(computed['borderLeftWidth']),
|
760
|
+
y: rest.offsetTop + parseInt(computed['borderTopWidth'])
|
761
|
+
};
|
762
|
+
}
|
763
|
+
|
764
|
+
function read (el) {
|
765
|
+
return textInput ? el.value : el.innerHTML;
|
766
|
+
}
|
767
|
+
|
768
|
+
function prepare () {
|
769
|
+
var computed = win.getComputedStyle ? getComputedStyle(el) : el.currentStyle;
|
770
|
+
var mirror = doc.createElement('div');
|
771
|
+
var style = mirror.style;
|
772
|
+
|
773
|
+
doc.body.appendChild(mirror);
|
774
|
+
|
775
|
+
if (el.tagName !== 'INPUT') {
|
776
|
+
style.wordWrap = 'break-word';
|
777
|
+
}
|
778
|
+
style.whiteSpace = 'pre-wrap';
|
779
|
+
style.position = 'absolute';
|
780
|
+
style.visibility = 'hidden';
|
781
|
+
props.forEach(copy);
|
782
|
+
|
783
|
+
if (ff) {
|
784
|
+
style.width = parseInt(computed.width) - 2 + 'px';
|
785
|
+
if (el.scrollHeight > parseInt(computed.height)) {
|
786
|
+
style.overflowY = 'scroll';
|
787
|
+
}
|
788
|
+
} else {
|
789
|
+
style.overflow = 'hidden';
|
790
|
+
}
|
791
|
+
return { mirror: mirror, computed: computed };
|
792
|
+
|
793
|
+
function copy (prop) {
|
794
|
+
style[prop] = computed[prop];
|
795
|
+
}
|
796
|
+
}
|
797
|
+
|
798
|
+
function write (el, value) {
|
799
|
+
if (textInput) {
|
800
|
+
el.textContent = value;
|
801
|
+
} else {
|
802
|
+
el.innerHTML = value;
|
803
|
+
}
|
804
|
+
}
|
805
|
+
|
806
|
+
function bind (remove) {
|
807
|
+
var op = remove ? 'remove' : 'add';
|
808
|
+
crossvent[op](el, 'keydown', throttledRefresh);
|
809
|
+
crossvent[op](el, 'keyup', throttledRefresh);
|
810
|
+
crossvent[op](el, 'input', throttledRefresh);
|
811
|
+
crossvent[op](el, 'paste', throttledRefresh);
|
812
|
+
crossvent[op](el, 'change', throttledRefresh);
|
813
|
+
}
|
814
|
+
|
815
|
+
function destroy () {
|
816
|
+
bind(true);
|
817
|
+
}
|
818
|
+
}
|
819
|
+
|
820
|
+
module.exports = tailormade;
|
821
|
+
|
822
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
823
|
+
|
824
|
+
},{"./throttle":12,"crossvent":18,"seleccion":8,"sell":10}],12:[function(require,module,exports){
|
825
|
+
'use strict';
|
826
|
+
|
827
|
+
function throttle (fn, boundary) {
|
828
|
+
var last = -Infinity;
|
829
|
+
var timer;
|
830
|
+
return function bounced () {
|
831
|
+
if (timer) {
|
832
|
+
return;
|
833
|
+
}
|
834
|
+
unbound();
|
835
|
+
|
836
|
+
function unbound () {
|
837
|
+
clearTimeout(timer);
|
838
|
+
timer = null;
|
839
|
+
var next = last + boundary;
|
840
|
+
var now = Date.now();
|
841
|
+
if (now > next) {
|
842
|
+
last = now;
|
843
|
+
fn();
|
844
|
+
} else {
|
845
|
+
timer = setTimeout(unbound, next - now);
|
846
|
+
}
|
847
|
+
}
|
848
|
+
};
|
849
|
+
}
|
850
|
+
|
851
|
+
module.exports = throttle;
|
852
|
+
|
853
|
+
},{}],13:[function(require,module,exports){
|
854
|
+
'use strict';
|
855
|
+
|
856
|
+
var ticky = require('ticky');
|
857
|
+
|
858
|
+
module.exports = function debounce (fn, args, ctx) {
|
859
|
+
if (!fn) { return; }
|
860
|
+
ticky(function run () {
|
861
|
+
fn.apply(ctx || null, args || []);
|
862
|
+
});
|
863
|
+
};
|
864
|
+
|
865
|
+
},{"ticky":16}],14:[function(require,module,exports){
|
866
|
+
'use strict';
|
867
|
+
|
868
|
+
var atoa = require('atoa');
|
869
|
+
var debounce = require('./debounce');
|
870
|
+
|
871
|
+
module.exports = function emitter (thing, options) {
|
872
|
+
var opts = options || {};
|
873
|
+
var evt = {};
|
874
|
+
if (thing === undefined) { thing = {}; }
|
875
|
+
thing.on = function (type, fn) {
|
876
|
+
if (!evt[type]) {
|
877
|
+
evt[type] = [fn];
|
878
|
+
} else {
|
879
|
+
evt[type].push(fn);
|
880
|
+
}
|
881
|
+
return thing;
|
882
|
+
};
|
883
|
+
thing.once = function (type, fn) {
|
884
|
+
fn._once = true; // thing.off(fn) still works!
|
885
|
+
thing.on(type, fn);
|
886
|
+
return thing;
|
887
|
+
};
|
888
|
+
thing.off = function (type, fn) {
|
889
|
+
var c = arguments.length;
|
890
|
+
if (c === 1) {
|
891
|
+
delete evt[type];
|
892
|
+
} else if (c === 0) {
|
893
|
+
evt = {};
|
894
|
+
} else {
|
895
|
+
var et = evt[type];
|
896
|
+
if (!et) { return thing; }
|
897
|
+
et.splice(et.indexOf(fn), 1);
|
898
|
+
}
|
899
|
+
return thing;
|
900
|
+
};
|
901
|
+
thing.emit = function () {
|
902
|
+
var args = atoa(arguments);
|
903
|
+
return thing.emitterSnapshot(args.shift()).apply(this, args);
|
904
|
+
};
|
905
|
+
thing.emitterSnapshot = function (type) {
|
906
|
+
var et = (evt[type] || []).slice(0);
|
907
|
+
return function () {
|
908
|
+
var args = atoa(arguments);
|
909
|
+
var ctx = this || thing;
|
910
|
+
if (type === 'error' && opts.throws !== false && !et.length) { throw args.length === 1 ? args[0] : args; }
|
911
|
+
et.forEach(function emitter (listen) {
|
912
|
+
if (opts.async) { debounce(listen, args, ctx); } else { listen.apply(ctx, args); }
|
913
|
+
if (listen._once) { thing.off(type, listen); }
|
914
|
+
});
|
915
|
+
return thing;
|
916
|
+
};
|
917
|
+
};
|
918
|
+
return thing;
|
919
|
+
};
|
920
|
+
|
921
|
+
},{"./debounce":13,"atoa":15}],15:[function(require,module,exports){
|
922
|
+
module.exports = function atoa (a, n) { return Array.prototype.slice.call(a, n); }
|
923
|
+
|
924
|
+
},{}],16:[function(require,module,exports){
|
925
|
+
var si = typeof setImmediate === 'function', tick;
|
926
|
+
if (si) {
|
927
|
+
tick = function (fn) { setImmediate(fn); };
|
928
|
+
} else {
|
929
|
+
tick = function (fn) { setTimeout(fn, 0); };
|
930
|
+
}
|
931
|
+
|
932
|
+
module.exports = tick;
|
933
|
+
},{}],17:[function(require,module,exports){
|
934
|
+
(function (global){
|
935
|
+
|
936
|
+
var NativeCustomEvent = global.CustomEvent;
|
937
|
+
|
938
|
+
function useNative () {
|
939
|
+
try {
|
940
|
+
var p = new NativeCustomEvent('cat', { detail: { foo: 'bar' } });
|
941
|
+
return 'cat' === p.type && 'bar' === p.detail.foo;
|
942
|
+
} catch (e) {
|
943
|
+
}
|
944
|
+
return false;
|
945
|
+
}
|
946
|
+
|
947
|
+
/**
|
948
|
+
* Cross-browser `CustomEvent` constructor.
|
949
|
+
*
|
950
|
+
* https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent.CustomEvent
|
951
|
+
*
|
952
|
+
* @public
|
953
|
+
*/
|
954
|
+
|
955
|
+
module.exports = useNative() ? NativeCustomEvent :
|
956
|
+
|
957
|
+
// IE >= 9
|
958
|
+
'function' === typeof document.createEvent ? function CustomEvent (type, params) {
|
959
|
+
var e = document.createEvent('CustomEvent');
|
960
|
+
if (params) {
|
961
|
+
e.initCustomEvent(type, params.bubbles, params.cancelable, params.detail);
|
962
|
+
} else {
|
963
|
+
e.initCustomEvent(type, false, false, void 0);
|
964
|
+
}
|
965
|
+
return e;
|
966
|
+
} :
|
967
|
+
|
968
|
+
// IE <= 8
|
969
|
+
function CustomEvent (type, params) {
|
970
|
+
var e = document.createEventObject();
|
971
|
+
e.type = type;
|
972
|
+
if (params) {
|
973
|
+
e.bubbles = Boolean(params.bubbles);
|
974
|
+
e.cancelable = Boolean(params.cancelable);
|
975
|
+
e.detail = params.detail;
|
976
|
+
} else {
|
977
|
+
e.bubbles = false;
|
978
|
+
e.cancelable = false;
|
979
|
+
e.detail = void 0;
|
980
|
+
}
|
981
|
+
return e;
|
982
|
+
}
|
983
|
+
|
984
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
985
|
+
|
986
|
+
},{}],18:[function(require,module,exports){
|
987
|
+
(function (global){
|
988
|
+
'use strict';
|
989
|
+
|
990
|
+
var customEvent = require('custom-event');
|
991
|
+
var eventmap = require('./eventmap');
|
992
|
+
var doc = document;
|
993
|
+
var addEvent = addEventEasy;
|
994
|
+
var removeEvent = removeEventEasy;
|
995
|
+
var hardCache = [];
|
996
|
+
|
997
|
+
if (!global.addEventListener) {
|
998
|
+
addEvent = addEventHard;
|
999
|
+
removeEvent = removeEventHard;
|
1000
|
+
}
|
1001
|
+
|
1002
|
+
function addEventEasy (el, type, fn, capturing) {
|
1003
|
+
return el.addEventListener(type, fn, capturing);
|
1004
|
+
}
|
1005
|
+
|
1006
|
+
function addEventHard (el, type, fn) {
|
1007
|
+
return el.attachEvent('on' + type, wrap(el, type, fn));
|
1008
|
+
}
|
1009
|
+
|
1010
|
+
function removeEventEasy (el, type, fn, capturing) {
|
1011
|
+
return el.removeEventListener(type, fn, capturing);
|
1012
|
+
}
|
1013
|
+
|
1014
|
+
function removeEventHard (el, type, fn) {
|
1015
|
+
return el.detachEvent('on' + type, unwrap(el, type, fn));
|
1016
|
+
}
|
1017
|
+
|
1018
|
+
function fabricateEvent (el, type, model) {
|
1019
|
+
var e = eventmap.indexOf(type) === -1 ? makeCustomEvent() : makeClassicEvent();
|
1020
|
+
if (el.dispatchEvent) {
|
1021
|
+
el.dispatchEvent(e);
|
1022
|
+
} else {
|
1023
|
+
el.fireEvent('on' + type, e);
|
1024
|
+
}
|
1025
|
+
function makeClassicEvent () {
|
1026
|
+
var e;
|
1027
|
+
if (doc.createEvent) {
|
1028
|
+
e = doc.createEvent('Event');
|
1029
|
+
e.initEvent(type, true, true);
|
1030
|
+
} else if (doc.createEventObject) {
|
1031
|
+
e = doc.createEventObject();
|
1032
|
+
}
|
1033
|
+
return e;
|
1034
|
+
}
|
1035
|
+
function makeCustomEvent () {
|
1036
|
+
return new customEvent(type, { detail: model });
|
1037
|
+
}
|
1038
|
+
}
|
1039
|
+
|
1040
|
+
function wrapperFactory (el, type, fn) {
|
1041
|
+
return function wrapper (originalEvent) {
|
1042
|
+
var e = originalEvent || global.event;
|
1043
|
+
e.target = e.target || e.srcElement;
|
1044
|
+
e.preventDefault = e.preventDefault || function preventDefault () { e.returnValue = false; };
|
1045
|
+
e.stopPropagation = e.stopPropagation || function stopPropagation () { e.cancelBubble = true; };
|
1046
|
+
e.which = e.which || e.keyCode;
|
1047
|
+
fn.call(el, e);
|
1048
|
+
};
|
1049
|
+
}
|
1050
|
+
|
1051
|
+
function wrap (el, type, fn) {
|
1052
|
+
var wrapper = unwrap(el, type, fn) || wrapperFactory(el, type, fn);
|
1053
|
+
hardCache.push({
|
1054
|
+
wrapper: wrapper,
|
1055
|
+
element: el,
|
1056
|
+
type: type,
|
1057
|
+
fn: fn
|
1058
|
+
});
|
1059
|
+
return wrapper;
|
1060
|
+
}
|
1061
|
+
|
1062
|
+
function unwrap (el, type, fn) {
|
1063
|
+
var i = find(el, type, fn);
|
1064
|
+
if (i) {
|
1065
|
+
var wrapper = hardCache[i].wrapper;
|
1066
|
+
hardCache.splice(i, 1); // free up a tad of memory
|
1067
|
+
return wrapper;
|
1068
|
+
}
|
1069
|
+
}
|
1070
|
+
|
1071
|
+
function find (el, type, fn) {
|
1072
|
+
var i, item;
|
1073
|
+
for (i = 0; i < hardCache.length; i++) {
|
1074
|
+
item = hardCache[i];
|
1075
|
+
if (item.element === el && item.type === type && item.fn === fn) {
|
1076
|
+
return i;
|
1077
|
+
}
|
1078
|
+
}
|
1079
|
+
}
|
1080
|
+
|
1081
|
+
module.exports = {
|
1082
|
+
add: addEvent,
|
1083
|
+
remove: removeEvent,
|
1084
|
+
fabricate: fabricateEvent
|
1085
|
+
};
|
1086
|
+
|
1087
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1088
|
+
|
1089
|
+
},{"./eventmap":19,"custom-event":17}],19:[function(require,module,exports){
|
1090
|
+
(function (global){
|
1091
|
+
'use strict';
|
1092
|
+
|
1093
|
+
var eventmap = [];
|
1094
|
+
var eventname = '';
|
1095
|
+
var ron = /^on/;
|
1096
|
+
|
1097
|
+
for (eventname in global) {
|
1098
|
+
if (ron.test(eventname)) {
|
1099
|
+
eventmap.push(eventname.slice(2));
|
1100
|
+
}
|
1101
|
+
}
|
1102
|
+
|
1103
|
+
module.exports = eventmap;
|
1104
|
+
|
1105
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1106
|
+
|
1107
|
+
},{}],20:[function(require,module,exports){
|
1108
|
+
'use strict';
|
1109
|
+
|
1110
|
+
var isInput = require('./isInput');
|
1111
|
+
var bindings = {};
|
1112
|
+
|
1113
|
+
function has (source, target) {
|
1114
|
+
var binding = bindings[source.id];
|
1115
|
+
return binding && binding[target.id];
|
1116
|
+
}
|
1117
|
+
|
1118
|
+
function insert (source, target) {
|
1119
|
+
var binding = bindings[source.id];
|
1120
|
+
if (!binding) {
|
1121
|
+
binding = bindings[source.id] = {};
|
1122
|
+
}
|
1123
|
+
var invalidate = invalidator(target);
|
1124
|
+
binding[target.id] = invalidate;
|
1125
|
+
source.on('data', invalidate);
|
1126
|
+
source.on('destroyed', remove.bind(null, source, target));
|
1127
|
+
}
|
1128
|
+
|
1129
|
+
function remove (source, target) {
|
1130
|
+
var binding = bindings[source.id];
|
1131
|
+
if (!binding) {
|
1132
|
+
return;
|
1133
|
+
}
|
1134
|
+
var invalidate = binding[target.id];
|
1135
|
+
source.off('data', invalidate);
|
1136
|
+
delete binding[target.id];
|
1137
|
+
}
|
1138
|
+
|
1139
|
+
function invalidator (target) {
|
1140
|
+
return function invalidate () {
|
1141
|
+
target.refresh();
|
1142
|
+
};
|
1143
|
+
}
|
1144
|
+
|
1145
|
+
function add (source, target) {
|
1146
|
+
if (isInput(target.associated) || has(source, target)) {
|
1147
|
+
return;
|
1148
|
+
}
|
1149
|
+
insert(source, target);
|
1150
|
+
}
|
1151
|
+
|
1152
|
+
module.exports = {
|
1153
|
+
add: add,
|
1154
|
+
remove: remove
|
1155
|
+
};
|
1156
|
+
|
1157
|
+
},{"./isInput":30}],21:[function(require,module,exports){
|
1158
|
+
'use strict';
|
1159
|
+
|
1160
|
+
var crossvent = require('crossvent');
|
1161
|
+
var emitter = require('contra/emitter');
|
1162
|
+
var dom = require('./dom');
|
1163
|
+
var text = require('./text');
|
1164
|
+
var parse = require('./parse');
|
1165
|
+
var clone = require('./clone');
|
1166
|
+
var defaults = require('./defaults');
|
1167
|
+
var momentum = require('./momentum');
|
1168
|
+
var classes = require('./classes');
|
1169
|
+
var noop = require('./noop');
|
1170
|
+
var no;
|
1171
|
+
|
1172
|
+
function calendar (calendarOptions) {
|
1173
|
+
var o;
|
1174
|
+
var ref;
|
1175
|
+
var refCal;
|
1176
|
+
var container;
|
1177
|
+
var rendered = false;
|
1178
|
+
|
1179
|
+
// date variables
|
1180
|
+
var monthOffsetAttribute = 'data-rome-offset';
|
1181
|
+
var weekdays;
|
1182
|
+
var weekdayCount;
|
1183
|
+
var calendarMonths = [];
|
1184
|
+
var lastYear;
|
1185
|
+
var lastMonth;
|
1186
|
+
var lastDay;
|
1187
|
+
var lastDayElement;
|
1188
|
+
var datewrapper;
|
1189
|
+
var back;
|
1190
|
+
var next;
|
1191
|
+
|
1192
|
+
// time variables
|
1193
|
+
var secondsInDay = 60 * 60 * 24;
|
1194
|
+
var time;
|
1195
|
+
var timelist;
|
1196
|
+
|
1197
|
+
var api = emitter({
|
1198
|
+
associated: calendarOptions.associated
|
1199
|
+
});
|
1200
|
+
|
1201
|
+
init();
|
1202
|
+
setTimeout(ready, 0);
|
1203
|
+
|
1204
|
+
return api;
|
1205
|
+
|
1206
|
+
function napi () { return api; }
|
1207
|
+
|
1208
|
+
function init (initOptions) {
|
1209
|
+
o = defaults(initOptions || calendarOptions, api);
|
1210
|
+
if (!container) { container = dom({ className: o.styles.container }); }
|
1211
|
+
weekdays = o.weekdayFormat;
|
1212
|
+
weekdayCount = weekdays.length;
|
1213
|
+
lastMonth = no;
|
1214
|
+
lastYear = no;
|
1215
|
+
lastDay = no;
|
1216
|
+
lastDayElement = no;
|
1217
|
+
o.appendTo.appendChild(container);
|
1218
|
+
|
1219
|
+
removeChildren(container);
|
1220
|
+
rendered = false;
|
1221
|
+
ref = o.initialValue ? o.initialValue : momentum.moment();
|
1222
|
+
refCal = ref.clone();
|
1223
|
+
|
1224
|
+
api.back = subtractMonth;
|
1225
|
+
api.container = container;
|
1226
|
+
api.destroyed = false;
|
1227
|
+
api.destroy = destroy.bind(api, false);
|
1228
|
+
api.emitValues = emitValues;
|
1229
|
+
api.getDate = getDate;
|
1230
|
+
api.getDateString = getDateString;
|
1231
|
+
api.getMoment = getMoment;
|
1232
|
+
api.hide = hide;
|
1233
|
+
api.next = addMonth;
|
1234
|
+
api.options = changeOptions;
|
1235
|
+
api.options.reset = resetOptions;
|
1236
|
+
api.refresh = refresh;
|
1237
|
+
api.restore = napi;
|
1238
|
+
api.setValue = setValue;
|
1239
|
+
api.show = show;
|
1240
|
+
|
1241
|
+
eventListening();
|
1242
|
+
ready();
|
1243
|
+
|
1244
|
+
return api;
|
1245
|
+
}
|
1246
|
+
|
1247
|
+
function ready () {
|
1248
|
+
api.emit('ready', clone(o));
|
1249
|
+
}
|
1250
|
+
|
1251
|
+
function destroy (silent) {
|
1252
|
+
if (container && container.parentNode) {
|
1253
|
+
container.parentNode.removeChild(container);
|
1254
|
+
}
|
1255
|
+
|
1256
|
+
if (o) {
|
1257
|
+
eventListening(true);
|
1258
|
+
}
|
1259
|
+
|
1260
|
+
var destroyed = api.emitterSnapshot('destroyed');
|
1261
|
+
api.back = noop;
|
1262
|
+
api.destroyed = true;
|
1263
|
+
api.destroy = napi;
|
1264
|
+
api.emitValues = napi;
|
1265
|
+
api.getDate = noop;
|
1266
|
+
api.getDateString = noop;
|
1267
|
+
api.getMoment = noop;
|
1268
|
+
api.hide = napi;
|
1269
|
+
api.next = noop;
|
1270
|
+
api.options = napi;
|
1271
|
+
api.options.reset = napi;
|
1272
|
+
api.refresh = napi;
|
1273
|
+
api.restore = init;
|
1274
|
+
api.setValue = napi;
|
1275
|
+
api.show = napi;
|
1276
|
+
api.off();
|
1277
|
+
|
1278
|
+
if (silent !== true) {
|
1279
|
+
destroyed();
|
1280
|
+
}
|
1281
|
+
|
1282
|
+
return api;
|
1283
|
+
}
|
1284
|
+
|
1285
|
+
function eventListening (remove) {
|
1286
|
+
var op = remove ? 'remove' : 'add';
|
1287
|
+
if (o.autoHideOnBlur) { crossvent[op](document.documentElement, 'focus', hideOnBlur, true); }
|
1288
|
+
if (o.autoHideOnClick) { crossvent[op](document, 'click', hideOnClick); }
|
1289
|
+
}
|
1290
|
+
|
1291
|
+
function changeOptions (options) {
|
1292
|
+
if (arguments.length === 0) {
|
1293
|
+
return clone(o);
|
1294
|
+
}
|
1295
|
+
destroy();
|
1296
|
+
init(options);
|
1297
|
+
return api;
|
1298
|
+
}
|
1299
|
+
|
1300
|
+
function resetOptions () {
|
1301
|
+
return changeOptions({ appendTo: o.appendTo });
|
1302
|
+
}
|
1303
|
+
|
1304
|
+
function render () {
|
1305
|
+
if (rendered) {
|
1306
|
+
return;
|
1307
|
+
}
|
1308
|
+
rendered = true;
|
1309
|
+
renderDates();
|
1310
|
+
renderTime();
|
1311
|
+
api.emit('render');
|
1312
|
+
}
|
1313
|
+
|
1314
|
+
function renderDates () {
|
1315
|
+
if (!o.date) {
|
1316
|
+
return;
|
1317
|
+
}
|
1318
|
+
var i;
|
1319
|
+
calendarMonths = [];
|
1320
|
+
|
1321
|
+
datewrapper = dom({ className: o.styles.date, parent: container });
|
1322
|
+
|
1323
|
+
for (i = 0; i < o.monthsInCalendar; i++) {
|
1324
|
+
renderMonth(i);
|
1325
|
+
}
|
1326
|
+
|
1327
|
+
crossvent.add(back, 'click', subtractMonth);
|
1328
|
+
crossvent.add(next, 'click', addMonth);
|
1329
|
+
crossvent.add(datewrapper, 'click', pickDay);
|
1330
|
+
|
1331
|
+
function renderMonth (i) {
|
1332
|
+
var month = dom({ className: o.styles.month, parent: datewrapper });
|
1333
|
+
if (i === 0) {
|
1334
|
+
back = dom({ type: 'button', className: o.styles.back, attributes: { type: 'button' }, parent: month });
|
1335
|
+
}
|
1336
|
+
if (i === o.monthsInCalendar -1) {
|
1337
|
+
next = dom({ type: 'button', className: o.styles.next, attributes: { type: 'button' }, parent: month });
|
1338
|
+
}
|
1339
|
+
var label = dom({ className: o.styles.monthLabel, parent: month });
|
1340
|
+
var date = dom({ type: 'table', className: o.styles.dayTable, parent: month });
|
1341
|
+
var datehead = dom({ type: 'thead', className: o.styles.dayHead, parent: date });
|
1342
|
+
var dateheadrow = dom({ type: 'tr', className: o.styles.dayRow, parent: datehead });
|
1343
|
+
var datebody = dom({ type: 'tbody', className: o.styles.dayBody, parent: date });
|
1344
|
+
var j;
|
1345
|
+
|
1346
|
+
for (j = 0; j < weekdayCount; j++) {
|
1347
|
+
dom({ type: 'th', className: o.styles.dayHeadElem, parent: dateheadrow, text: weekdays[weekday(j)] });
|
1348
|
+
}
|
1349
|
+
|
1350
|
+
datebody.setAttribute(monthOffsetAttribute, i);
|
1351
|
+
calendarMonths.push({
|
1352
|
+
label: label,
|
1353
|
+
body: datebody
|
1354
|
+
});
|
1355
|
+
}
|
1356
|
+
}
|
1357
|
+
|
1358
|
+
function renderTime () {
|
1359
|
+
if (!o.time || !o.timeInterval) {
|
1360
|
+
return;
|
1361
|
+
}
|
1362
|
+
var timewrapper = dom({ className: o.styles.time, parent: container });
|
1363
|
+
time = dom({ className: o.styles.selectedTime, parent: timewrapper, text: ref.format(o.timeFormat) });
|
1364
|
+
crossvent.add(time, 'click', toggleTimeList);
|
1365
|
+
timelist = dom({ className: o.styles.timeList, parent: timewrapper });
|
1366
|
+
crossvent.add(timelist, 'click', pickTime);
|
1367
|
+
var next = momentum.moment('00:00:00', 'HH:mm:ss');
|
1368
|
+
var latest = next.clone().add(1, 'days');
|
1369
|
+
while (next.isBefore(latest)) {
|
1370
|
+
dom({ className: o.styles.timeOption, parent: timelist, text: next.format(o.timeFormat) });
|
1371
|
+
next.add(o.timeInterval, 'seconds');
|
1372
|
+
}
|
1373
|
+
}
|
1374
|
+
|
1375
|
+
function weekday (index, backwards) {
|
1376
|
+
var factor = backwards ? -1 : 1;
|
1377
|
+
var offset = index + o.weekStart * factor;
|
1378
|
+
if (offset >= weekdayCount || offset < 0) {
|
1379
|
+
offset += weekdayCount * -factor;
|
1380
|
+
}
|
1381
|
+
return offset;
|
1382
|
+
}
|
1383
|
+
|
1384
|
+
function displayValidTimesOnly () {
|
1385
|
+
if (!o.time || !rendered) {
|
1386
|
+
return;
|
1387
|
+
}
|
1388
|
+
var times = timelist.children;
|
1389
|
+
var length = times.length;
|
1390
|
+
var date;
|
1391
|
+
var time;
|
1392
|
+
var item;
|
1393
|
+
var i;
|
1394
|
+
for (i = 0; i < length; i++) {
|
1395
|
+
item = times[i];
|
1396
|
+
time = momentum.moment(text(item), o.timeFormat);
|
1397
|
+
date = setTime(ref.clone(), time);
|
1398
|
+
item.style.display = isInRange(date, false, o.timeValidator) ? 'block' : 'none';
|
1399
|
+
}
|
1400
|
+
}
|
1401
|
+
|
1402
|
+
function toggleTimeList (show) {
|
1403
|
+
var display = typeof show === 'boolean' ? show : timelist.style.display === 'none';
|
1404
|
+
if (display) {
|
1405
|
+
showTimeList();
|
1406
|
+
} else {
|
1407
|
+
hideTimeList();
|
1408
|
+
}
|
1409
|
+
}
|
1410
|
+
|
1411
|
+
function showTimeList () { if (timelist) { timelist.style.display = 'block'; } }
|
1412
|
+
function hideTimeList () { if (timelist) { timelist.style.display = 'none'; } }
|
1413
|
+
function showCalendar () { container.style.display = 'inline-block'; api.emit('show'); }
|
1414
|
+
function hideCalendar () {
|
1415
|
+
if (container.style.display !== 'none') {
|
1416
|
+
container.style.display = 'none';
|
1417
|
+
api.emit('hide');
|
1418
|
+
}
|
1419
|
+
}
|
1420
|
+
|
1421
|
+
function show () {
|
1422
|
+
render();
|
1423
|
+
refresh();
|
1424
|
+
toggleTimeList(!o.date);
|
1425
|
+
showCalendar();
|
1426
|
+
return api;
|
1427
|
+
}
|
1428
|
+
|
1429
|
+
function hide () {
|
1430
|
+
hideTimeList();
|
1431
|
+
setTimeout(hideCalendar, 0);
|
1432
|
+
return api;
|
1433
|
+
}
|
1434
|
+
|
1435
|
+
function hideConditionally () {
|
1436
|
+
hideTimeList();
|
1437
|
+
|
1438
|
+
var pos = classes.contains(container, o.styles.positioned);
|
1439
|
+
if (pos) {
|
1440
|
+
setTimeout(hideCalendar, 0);
|
1441
|
+
}
|
1442
|
+
return api;
|
1443
|
+
}
|
1444
|
+
|
1445
|
+
function calendarEventTarget (e) {
|
1446
|
+
var target = e.target;
|
1447
|
+
if (target === api.associated) {
|
1448
|
+
return true;
|
1449
|
+
}
|
1450
|
+
while (target) {
|
1451
|
+
if (target === container) {
|
1452
|
+
return true;
|
1453
|
+
}
|
1454
|
+
target = target.parentNode;
|
1455
|
+
}
|
1456
|
+
}
|
1457
|
+
|
1458
|
+
function hideOnBlur (e) {
|
1459
|
+
if (calendarEventTarget(e)) {
|
1460
|
+
return;
|
1461
|
+
}
|
1462
|
+
hideConditionally();
|
1463
|
+
}
|
1464
|
+
|
1465
|
+
function hideOnClick (e) {
|
1466
|
+
if (calendarEventTarget(e)) {
|
1467
|
+
return;
|
1468
|
+
}
|
1469
|
+
hideConditionally();
|
1470
|
+
}
|
1471
|
+
|
1472
|
+
function subtractMonth () { changeMonth('subtract'); }
|
1473
|
+
function addMonth () { changeMonth('add'); }
|
1474
|
+
function changeMonth (op) {
|
1475
|
+
var bound;
|
1476
|
+
var direction = op === 'add' ? -1 : 1;
|
1477
|
+
var offset = o.monthsInCalendar + direction * getMonthOffset(lastDayElement);
|
1478
|
+
refCal[op](offset, 'months');
|
1479
|
+
bound = inRange(refCal.clone());
|
1480
|
+
ref = bound || ref;
|
1481
|
+
if (bound) { refCal = bound.clone(); }
|
1482
|
+
update();
|
1483
|
+
api.emit(op === 'add' ? 'next' : 'back', ref.month());
|
1484
|
+
}
|
1485
|
+
|
1486
|
+
function update (silent) {
|
1487
|
+
updateCalendar();
|
1488
|
+
updateTime();
|
1489
|
+
if (silent !== true) { emitValues(); }
|
1490
|
+
displayValidTimesOnly();
|
1491
|
+
}
|
1492
|
+
|
1493
|
+
function updateCalendar () {
|
1494
|
+
if (!o.date || !rendered) {
|
1495
|
+
return;
|
1496
|
+
}
|
1497
|
+
var y = refCal.year();
|
1498
|
+
var m = refCal.month();
|
1499
|
+
var d = refCal.date();
|
1500
|
+
if (d === lastDay && m === lastMonth && y === lastYear) {
|
1501
|
+
return;
|
1502
|
+
}
|
1503
|
+
var canStay = isDisplayed();
|
1504
|
+
lastDay = refCal.date();
|
1505
|
+
lastMonth = refCal.month();
|
1506
|
+
lastYear = refCal.year();
|
1507
|
+
if (canStay) { updateCalendarSelection(); return; }
|
1508
|
+
calendarMonths.forEach(updateMonth);
|
1509
|
+
renderAllDays();
|
1510
|
+
|
1511
|
+
function updateMonth (month, i) {
|
1512
|
+
var offsetCal = refCal.clone().add(i, 'months');
|
1513
|
+
text(month.label, offsetCal.format(o.monthFormat));
|
1514
|
+
removeChildren(month.body);
|
1515
|
+
}
|
1516
|
+
}
|
1517
|
+
|
1518
|
+
function updateCalendarSelection () {
|
1519
|
+
var day = refCal.date() - 1;
|
1520
|
+
selectDayElement(false);
|
1521
|
+
calendarMonths.forEach(function (cal) {
|
1522
|
+
var days;
|
1523
|
+
if (sameCalendarMonth(cal.date, refCal)) {
|
1524
|
+
days = cast(cal.body.children).map(aggregate);
|
1525
|
+
days = Array.prototype.concat.apply([], days).filter(inside);
|
1526
|
+
selectDayElement(days[day]);
|
1527
|
+
}
|
1528
|
+
});
|
1529
|
+
|
1530
|
+
function cast (like) {
|
1531
|
+
var dest = [];
|
1532
|
+
var i;
|
1533
|
+
for (i = 0; i < like.length; i++) {
|
1534
|
+
dest.push(like[i]);
|
1535
|
+
}
|
1536
|
+
return dest;
|
1537
|
+
}
|
1538
|
+
|
1539
|
+
function aggregate (child) {
|
1540
|
+
return cast(child.children);
|
1541
|
+
}
|
1542
|
+
|
1543
|
+
function inside (child) {
|
1544
|
+
return !classes.contains(child, o.styles.dayPrevMonth) &&
|
1545
|
+
!classes.contains(child, o.styles.dayNextMonth);
|
1546
|
+
}
|
1547
|
+
}
|
1548
|
+
|
1549
|
+
function isDisplayed () {
|
1550
|
+
return calendarMonths.some(matches);
|
1551
|
+
|
1552
|
+
function matches (cal) {
|
1553
|
+
if (!lastYear) { return false; }
|
1554
|
+
return sameCalendarMonth(cal.date, refCal);
|
1555
|
+
}
|
1556
|
+
}
|
1557
|
+
|
1558
|
+
function sameCalendarMonth (left, right) {
|
1559
|
+
return left && right && left.year() === right.year() && left.month() === right.month();
|
1560
|
+
}
|
1561
|
+
|
1562
|
+
function updateTime () {
|
1563
|
+
if (!o.time || !rendered) {
|
1564
|
+
return;
|
1565
|
+
}
|
1566
|
+
text(time, ref.format(o.timeFormat));
|
1567
|
+
}
|
1568
|
+
|
1569
|
+
function emitValues () {
|
1570
|
+
api.emit('data', getDateString());
|
1571
|
+
api.emit('year', ref.year());
|
1572
|
+
api.emit('month', ref.month());
|
1573
|
+
api.emit('day', ref.day());
|
1574
|
+
api.emit('time', ref.format(o.timeFormat));
|
1575
|
+
return api;
|
1576
|
+
}
|
1577
|
+
|
1578
|
+
function refresh () {
|
1579
|
+
lastYear = false;
|
1580
|
+
lastMonth = false;
|
1581
|
+
lastDay = false;
|
1582
|
+
update(true);
|
1583
|
+
return api;
|
1584
|
+
}
|
1585
|
+
|
1586
|
+
function setValue (value) {
|
1587
|
+
var date = parse(value, o.inputFormat);
|
1588
|
+
if (date === null) {
|
1589
|
+
return;
|
1590
|
+
}
|
1591
|
+
ref = inRange(date) || ref;
|
1592
|
+
refCal = ref.clone();
|
1593
|
+
update(true);
|
1594
|
+
|
1595
|
+
return api;
|
1596
|
+
}
|
1597
|
+
|
1598
|
+
function removeChildren (elem, self) {
|
1599
|
+
while (elem && elem.firstChild) {
|
1600
|
+
elem.removeChild(elem.firstChild);
|
1601
|
+
}
|
1602
|
+
if (self === true) {
|
1603
|
+
elem.parentNode.removeChild(elem);
|
1604
|
+
}
|
1605
|
+
}
|
1606
|
+
|
1607
|
+
function renderAllDays () {
|
1608
|
+
var i;
|
1609
|
+
for (i = 0; i < o.monthsInCalendar; i++) {
|
1610
|
+
renderDays(i);
|
1611
|
+
}
|
1612
|
+
}
|
1613
|
+
|
1614
|
+
function renderDays (offset) {
|
1615
|
+
var month = calendarMonths[offset];
|
1616
|
+
var offsetCal = refCal.clone().add(offset, 'months');
|
1617
|
+
var total = offsetCal.daysInMonth();
|
1618
|
+
var current = offsetCal.month() !== ref.month() ? -1 : ref.date(); // -1 : 1..31
|
1619
|
+
var first = offsetCal.clone().date(1);
|
1620
|
+
var firstDay = weekday(first.day(), true); // 0..6
|
1621
|
+
var tr = dom({ type: 'tr', className: o.styles.dayRow, parent: month.body });
|
1622
|
+
var prevMonth = hiddenWhen(offset !== 0, [o.styles.dayBodyElem, o.styles.dayPrevMonth]);
|
1623
|
+
var nextMonth = hiddenWhen(offset !== o.monthsInCalendar - 1, [o.styles.dayBodyElem, o.styles.dayNextMonth]);
|
1624
|
+
var disabled = o.styles.dayDisabled;
|
1625
|
+
var lastDay;
|
1626
|
+
|
1627
|
+
part({
|
1628
|
+
base: first.clone().subtract(firstDay, 'days'),
|
1629
|
+
length: firstDay,
|
1630
|
+
cell: prevMonth
|
1631
|
+
});
|
1632
|
+
|
1633
|
+
part({
|
1634
|
+
base: first.clone(),
|
1635
|
+
length: total,
|
1636
|
+
cell: [o.styles.dayBodyElem],
|
1637
|
+
selectable: true
|
1638
|
+
});
|
1639
|
+
|
1640
|
+
lastDay = first.clone().add(total, 'days');
|
1641
|
+
|
1642
|
+
part({
|
1643
|
+
base: lastDay,
|
1644
|
+
length: weekdayCount - tr.children.length,
|
1645
|
+
cell: nextMonth
|
1646
|
+
});
|
1647
|
+
|
1648
|
+
back.disabled = !isInRangeLeft(first, true);
|
1649
|
+
next.disabled = !isInRangeRight(lastDay, true);
|
1650
|
+
month.date = offsetCal.clone();
|
1651
|
+
|
1652
|
+
function part (data) {
|
1653
|
+
var i, day, node;
|
1654
|
+
for (i = 0; i < data.length; i++) {
|
1655
|
+
if (tr.children.length === weekdayCount) {
|
1656
|
+
tr = dom({ type: 'tr', className: o.styles.dayRow, parent: month.body });
|
1657
|
+
}
|
1658
|
+
day = data.base.clone().add(i, 'days');
|
1659
|
+
node = dom({
|
1660
|
+
type: 'td',
|
1661
|
+
parent: tr,
|
1662
|
+
text: day.format(o.dayFormat),
|
1663
|
+
className: validationTest(day, data.cell.join(' ').split(' ')).join(' ')
|
1664
|
+
});
|
1665
|
+
if (data.selectable && day.date() === current) {
|
1666
|
+
selectDayElement(node);
|
1667
|
+
}
|
1668
|
+
}
|
1669
|
+
}
|
1670
|
+
|
1671
|
+
function validationTest (day, cell) {
|
1672
|
+
if (!isInRange(day, true, o.dateValidator)) { cell.push(disabled); }
|
1673
|
+
return cell;
|
1674
|
+
}
|
1675
|
+
|
1676
|
+
function hiddenWhen (value, cell) {
|
1677
|
+
if (value) { cell.push(o.styles.dayConcealed); }
|
1678
|
+
return cell;
|
1679
|
+
}
|
1680
|
+
}
|
1681
|
+
|
1682
|
+
function isInRange (date, allday, validator) {
|
1683
|
+
if (!isInRangeLeft(date, allday)) {
|
1684
|
+
return false;
|
1685
|
+
}
|
1686
|
+
if (!isInRangeRight(date, allday)) {
|
1687
|
+
return false;
|
1688
|
+
}
|
1689
|
+
var valid = (validator || Function.prototype).call(api, date.toDate());
|
1690
|
+
return valid !== false;
|
1691
|
+
}
|
1692
|
+
|
1693
|
+
function isInRangeLeft (date, allday) {
|
1694
|
+
var min = !o.min ? false : (allday ? o.min.clone().startOf('day') : o.min);
|
1695
|
+
return !min || !date.isBefore(min);
|
1696
|
+
}
|
1697
|
+
|
1698
|
+
function isInRangeRight (date, allday) {
|
1699
|
+
var max = !o.max ? false : (allday ? o.max.clone().endOf('day') : o.max);
|
1700
|
+
return !max || !date.isAfter(max);
|
1701
|
+
}
|
1702
|
+
|
1703
|
+
function inRange (date) {
|
1704
|
+
if (o.min && date.isBefore(o.min)) {
|
1705
|
+
return inRange(o.min.clone());
|
1706
|
+
} else if (o.max && date.isAfter(o.max)) {
|
1707
|
+
return inRange(o.max.clone());
|
1708
|
+
}
|
1709
|
+
var value = date.clone().subtract(1, 'days');
|
1710
|
+
if (validateTowards(value, date, 'add')) {
|
1711
|
+
return inTimeRange(value);
|
1712
|
+
}
|
1713
|
+
value = date.clone();
|
1714
|
+
if (validateTowards(value, date, 'subtract')) {
|
1715
|
+
return inTimeRange(value);
|
1716
|
+
}
|
1717
|
+
}
|
1718
|
+
|
1719
|
+
function inTimeRange (value) {
|
1720
|
+
var copy = value.clone().subtract(o.timeInterval, 'seconds');
|
1721
|
+
var times = Math.ceil(secondsInDay / o.timeInterval);
|
1722
|
+
var i;
|
1723
|
+
for (i = 0; i < times; i++) {
|
1724
|
+
copy.add(o.timeInterval, 'seconds');
|
1725
|
+
if (copy.date() > value.date()) {
|
1726
|
+
copy.subtract(1, 'days');
|
1727
|
+
}
|
1728
|
+
if (o.timeValidator.call(api, copy.toDate()) !== false) {
|
1729
|
+
return copy;
|
1730
|
+
}
|
1731
|
+
}
|
1732
|
+
}
|
1733
|
+
|
1734
|
+
function validateTowards (value, date, op) {
|
1735
|
+
var valid = false;
|
1736
|
+
while (valid === false) {
|
1737
|
+
value[op](1, 'days');
|
1738
|
+
if (value.month() !== date.month()) {
|
1739
|
+
break;
|
1740
|
+
}
|
1741
|
+
valid = o.dateValidator.call(api, value.toDate());
|
1742
|
+
}
|
1743
|
+
return valid !== false;
|
1744
|
+
}
|
1745
|
+
|
1746
|
+
function pickDay (e) {
|
1747
|
+
var target = e.target;
|
1748
|
+
if (classes.contains(target, o.styles.dayDisabled) || !classes.contains(target, o.styles.dayBodyElem)) {
|
1749
|
+
return;
|
1750
|
+
}
|
1751
|
+
var day = parseInt(text(target), 10);
|
1752
|
+
var prev = classes.contains(target, o.styles.dayPrevMonth);
|
1753
|
+
var next = classes.contains(target, o.styles.dayNextMonth);
|
1754
|
+
var offset = getMonthOffset(target) - getMonthOffset(lastDayElement);
|
1755
|
+
ref.add(offset, 'months');
|
1756
|
+
if (prev || next) {
|
1757
|
+
ref.add(prev ? -1 : 1, 'months');
|
1758
|
+
}
|
1759
|
+
selectDayElement(target);
|
1760
|
+
ref.date(day); // must run after setting the month
|
1761
|
+
setTime(ref, inRange(ref) || ref);
|
1762
|
+
refCal = ref.clone();
|
1763
|
+
if (o.autoClose === true) { hideConditionally(); }
|
1764
|
+
update();
|
1765
|
+
}
|
1766
|
+
|
1767
|
+
function selectDayElement (node) {
|
1768
|
+
if (lastDayElement) {
|
1769
|
+
classes.remove(lastDayElement, o.styles.selectedDay);
|
1770
|
+
}
|
1771
|
+
if (node) {
|
1772
|
+
classes.add(node, o.styles.selectedDay);
|
1773
|
+
}
|
1774
|
+
lastDayElement = node;
|
1775
|
+
}
|
1776
|
+
|
1777
|
+
function getMonthOffset (elem) {
|
1778
|
+
var offset;
|
1779
|
+
while (elem && elem.getAttribute) {
|
1780
|
+
offset = elem.getAttribute(monthOffsetAttribute);
|
1781
|
+
if (typeof offset === 'string') {
|
1782
|
+
return parseInt(offset, 10);
|
1783
|
+
}
|
1784
|
+
elem = elem.parentNode;
|
1785
|
+
}
|
1786
|
+
return 0;
|
1787
|
+
}
|
1788
|
+
|
1789
|
+
function setTime (to, from) {
|
1790
|
+
to.hour(from.hour()).minute(from.minute()).second(from.second());
|
1791
|
+
return to;
|
1792
|
+
}
|
1793
|
+
|
1794
|
+
function pickTime (e) {
|
1795
|
+
var target = e.target;
|
1796
|
+
if (!classes.contains(target, o.styles.timeOption)) {
|
1797
|
+
return;
|
1798
|
+
}
|
1799
|
+
var value = momentum.moment(text(target), o.timeFormat);
|
1800
|
+
setTime(ref, value);
|
1801
|
+
refCal = ref.clone();
|
1802
|
+
emitValues();
|
1803
|
+
updateTime();
|
1804
|
+
if ((!o.date && o.autoClose === true) || o.autoClose === 'time') {
|
1805
|
+
hideConditionally();
|
1806
|
+
} else {
|
1807
|
+
hideTimeList();
|
1808
|
+
}
|
1809
|
+
}
|
1810
|
+
|
1811
|
+
function getDate () {
|
1812
|
+
return ref.toDate();
|
1813
|
+
}
|
1814
|
+
|
1815
|
+
function getDateString (format) {
|
1816
|
+
return ref.format(format || o.inputFormat);
|
1817
|
+
}
|
1818
|
+
|
1819
|
+
function getMoment () {
|
1820
|
+
return ref.clone();
|
1821
|
+
}
|
1822
|
+
}
|
1823
|
+
|
1824
|
+
module.exports = calendar;
|
1825
|
+
|
1826
|
+
},{"./classes":22,"./clone":23,"./defaults":25,"./dom":26,"./momentum":31,"./noop":32,"./parse":33,"./text":45,"contra/emitter":14,"crossvent":18}],22:[function(require,module,exports){
|
1827
|
+
'use strict';
|
1828
|
+
|
1829
|
+
var trim = /^\s+|\s+$/g;
|
1830
|
+
var whitespace = /\s+/;
|
1831
|
+
|
1832
|
+
function classes (node) {
|
1833
|
+
return node.className.replace(trim, '').split(whitespace);
|
1834
|
+
}
|
1835
|
+
|
1836
|
+
function set (node, value) {
|
1837
|
+
node.className = value.join(' ');
|
1838
|
+
}
|
1839
|
+
|
1840
|
+
function add (node, value) {
|
1841
|
+
var values = remove(node, value);
|
1842
|
+
values.push(value);
|
1843
|
+
set(node, values);
|
1844
|
+
}
|
1845
|
+
|
1846
|
+
function remove (node, value) {
|
1847
|
+
var values = classes(node);
|
1848
|
+
var i = values.indexOf(value);
|
1849
|
+
if (i !== -1) {
|
1850
|
+
values.splice(i, 1);
|
1851
|
+
set(node, values);
|
1852
|
+
}
|
1853
|
+
return values;
|
1854
|
+
}
|
1855
|
+
|
1856
|
+
function contains (node, value) {
|
1857
|
+
return classes(node).indexOf(value) !== -1;
|
1858
|
+
}
|
1859
|
+
|
1860
|
+
module.exports = {
|
1861
|
+
add: add,
|
1862
|
+
remove: remove,
|
1863
|
+
contains: contains
|
1864
|
+
};
|
1865
|
+
|
1866
|
+
},{}],23:[function(require,module,exports){
|
1867
|
+
'use strict';
|
1868
|
+
|
1869
|
+
var momentum = require('./momentum');
|
1870
|
+
|
1871
|
+
// naïve implementation, specifically meant to clone `options` objects
|
1872
|
+
function clone (thing) {
|
1873
|
+
var copy = {};
|
1874
|
+
var value;
|
1875
|
+
|
1876
|
+
for (var key in thing) {
|
1877
|
+
value = thing[key];
|
1878
|
+
|
1879
|
+
if (!value) {
|
1880
|
+
copy[key] = value;
|
1881
|
+
} else if (momentum.isMoment(value)) {
|
1882
|
+
copy[key] = value.clone();
|
1883
|
+
} else if (value._isStylesConfiguration) {
|
1884
|
+
copy[key] = clone(value);
|
1885
|
+
} else {
|
1886
|
+
copy[key] = value;
|
1887
|
+
}
|
1888
|
+
}
|
1889
|
+
|
1890
|
+
return copy;
|
1891
|
+
}
|
1892
|
+
|
1893
|
+
module.exports = clone;
|
1894
|
+
|
1895
|
+
},{"./momentum":31}],24:[function(require,module,exports){
|
1896
|
+
'use strict';
|
1897
|
+
|
1898
|
+
var index = require('./index');
|
1899
|
+
var input = require('./input');
|
1900
|
+
var inline = require('./inline');
|
1901
|
+
var isInput = require('./isInput');
|
1902
|
+
|
1903
|
+
function core (elem, options) {
|
1904
|
+
var cal;
|
1905
|
+
var existing = index.find(elem);
|
1906
|
+
if (existing) {
|
1907
|
+
return existing;
|
1908
|
+
}
|
1909
|
+
|
1910
|
+
if (isInput(elem)) {
|
1911
|
+
cal = input(elem, options);
|
1912
|
+
} else {
|
1913
|
+
cal = inline(elem, options);
|
1914
|
+
}
|
1915
|
+
index.assign(elem, cal);
|
1916
|
+
|
1917
|
+
return cal;
|
1918
|
+
}
|
1919
|
+
|
1920
|
+
module.exports = core;
|
1921
|
+
|
1922
|
+
},{"./index":27,"./inline":28,"./input":29,"./isInput":30}],25:[function(require,module,exports){
|
1923
|
+
'use strict';
|
1924
|
+
|
1925
|
+
var parse = require('./parse');
|
1926
|
+
var isInput = require('./isInput');
|
1927
|
+
var momentum = require('./momentum');
|
1928
|
+
|
1929
|
+
function defaults (options, cal) {
|
1930
|
+
var temp;
|
1931
|
+
var no;
|
1932
|
+
var o = options || {};
|
1933
|
+
if (o.autoHideOnClick === no) { o.autoHideOnClick = true; }
|
1934
|
+
if (o.autoHideOnBlur === no) { o.autoHideOnBlur = true; }
|
1935
|
+
if (o.autoClose === no) { o.autoClose = true; }
|
1936
|
+
if (o.appendTo === no) { o.appendTo = document.body; }
|
1937
|
+
if (o.appendTo === 'parent') {
|
1938
|
+
if (isInput(cal.associated)) {
|
1939
|
+
o.appendTo = cal.associated.parentNode;
|
1940
|
+
} else {
|
1941
|
+
throw new Error('Inline calendars must be appended to a parent node explicitly.');
|
1942
|
+
}
|
1943
|
+
}
|
1944
|
+
if (o.invalidate === no) { o.invalidate = true; }
|
1945
|
+
if (o.required === no) { o.required = false; }
|
1946
|
+
if (o.date === no) { o.date = true; }
|
1947
|
+
if (o.time === no) { o.time = true; }
|
1948
|
+
if (o.date === false && o.time === false) { throw new Error('At least one of `date` or `time` must be `true`.'); }
|
1949
|
+
if (o.inputFormat === no) {
|
1950
|
+
if (o.date && o.time) {
|
1951
|
+
o.inputFormat = 'YYYY-MM-DD HH:mm';
|
1952
|
+
} else if (o.date) {
|
1953
|
+
o.inputFormat = 'YYYY-MM-DD';
|
1954
|
+
} else {
|
1955
|
+
o.inputFormat = 'HH:mm';
|
1956
|
+
}
|
1957
|
+
}
|
1958
|
+
if (o.initialValue === no) {
|
1959
|
+
o.initialValue = null;
|
1960
|
+
} else {
|
1961
|
+
o.initialValue = parse(o.initialValue, o.inputFormat);
|
1962
|
+
}
|
1963
|
+
if (o.min === no) { o.min = null; } else { o.min = parse(o.min, o.inputFormat); }
|
1964
|
+
if (o.max === no) { o.max = null; } else { o.max = parse(o.max, o.inputFormat); }
|
1965
|
+
if (o.timeInterval === no) { o.timeInterval = 60 * 30; } // 30 minutes by default
|
1966
|
+
if (o.min && o.max) {
|
1967
|
+
if (o.max.isBefore(o.min)) {
|
1968
|
+
temp = o.max;
|
1969
|
+
o.max = o.min;
|
1970
|
+
o.min = temp;
|
1971
|
+
}
|
1972
|
+
if (o.date === true) {
|
1973
|
+
if (o.max.clone().subtract(1, 'days').isBefore(o.min)) {
|
1974
|
+
throw new Error('`max` must be at least one day after `min`');
|
1975
|
+
}
|
1976
|
+
} else if (o.timeInterval * 1000 - o.min % (o.timeInterval * 1000) > o.max - o.min) {
|
1977
|
+
throw new Error('`min` to `max` range must allow for at least one time option that matches `timeInterval`');
|
1978
|
+
}
|
1979
|
+
}
|
1980
|
+
if (o.dateValidator === no) { o.dateValidator = Function.prototype; }
|
1981
|
+
if (o.timeValidator === no) { o.timeValidator = Function.prototype; }
|
1982
|
+
if (o.timeFormat === no) { o.timeFormat = 'HH:mm'; }
|
1983
|
+
if (o.weekStart === no) { o.weekStart = momentum.moment().weekday(0).day(); }
|
1984
|
+
if (o.weekdayFormat === no) { o.weekdayFormat = 'min'; }
|
1985
|
+
if (o.weekdayFormat === 'long') {
|
1986
|
+
o.weekdayFormat = momentum.moment.weekdays();
|
1987
|
+
} else if (o.weekdayFormat === 'short') {
|
1988
|
+
o.weekdayFormat = momentum.moment.weekdaysShort();
|
1989
|
+
} else if (o.weekdayFormat === 'min') {
|
1990
|
+
o.weekdayFormat = momentum.moment.weekdaysMin();
|
1991
|
+
} else if (!Array.isArray(o.weekdayFormat) || o.weekdayFormat.length < 7) {
|
1992
|
+
throw new Error('`weekdays` must be `min`, `short`, or `long`');
|
1993
|
+
}
|
1994
|
+
if (o.monthsInCalendar === no) { o.monthsInCalendar = 1; }
|
1995
|
+
if (o.monthFormat === no) { o.monthFormat = 'MMMM YYYY'; }
|
1996
|
+
if (o.dayFormat === no) { o.dayFormat = 'DD'; }
|
1997
|
+
if (o.styles === no) { o.styles = {}; }
|
1998
|
+
|
1999
|
+
o.styles._isStylesConfiguration = true;
|
2000
|
+
|
2001
|
+
var styl = o.styles;
|
2002
|
+
if (styl.back === no) { styl.back = 'rd-back'; }
|
2003
|
+
if (styl.container === no) { styl.container = 'rd-container'; }
|
2004
|
+
if (styl.positioned === no) { styl.positioned = 'rd-container-attachment'; }
|
2005
|
+
if (styl.date === no) { styl.date = 'rd-date'; }
|
2006
|
+
if (styl.dayBody === no) { styl.dayBody = 'rd-days-body'; }
|
2007
|
+
if (styl.dayBodyElem === no) { styl.dayBodyElem = 'rd-day-body'; }
|
2008
|
+
if (styl.dayPrevMonth === no) { styl.dayPrevMonth = 'rd-day-prev-month'; }
|
2009
|
+
if (styl.dayNextMonth === no) { styl.dayNextMonth = 'rd-day-next-month'; }
|
2010
|
+
if (styl.dayDisabled === no) { styl.dayDisabled = 'rd-day-disabled'; }
|
2011
|
+
if (styl.dayConcealed === no) { styl.dayConcealed = 'rd-day-concealed'; }
|
2012
|
+
if (styl.dayHead === no) { styl.dayHead = 'rd-days-head'; }
|
2013
|
+
if (styl.dayHeadElem === no) { styl.dayHeadElem = 'rd-day-head'; }
|
2014
|
+
if (styl.dayRow === no) { styl.dayRow = 'rd-days-row'; }
|
2015
|
+
if (styl.dayTable === no) { styl.dayTable = 'rd-days'; }
|
2016
|
+
if (styl.month === no) { styl.month = 'rd-month'; }
|
2017
|
+
if (styl.monthLabel === no) { styl.monthLabel = 'rd-month-label'; }
|
2018
|
+
if (styl.next === no) { styl.next = 'rd-next'; }
|
2019
|
+
if (styl.selectedDay === no) { styl.selectedDay = 'rd-day-selected'; }
|
2020
|
+
if (styl.selectedTime === no) { styl.selectedTime = 'rd-time-selected'; }
|
2021
|
+
if (styl.time === no) { styl.time = 'rd-time'; }
|
2022
|
+
if (styl.timeList === no) { styl.timeList = 'rd-time-list'; }
|
2023
|
+
if (styl.timeOption === no) { styl.timeOption = 'rd-time-option'; }
|
2024
|
+
|
2025
|
+
return o;
|
2026
|
+
}
|
2027
|
+
|
2028
|
+
module.exports = defaults;
|
2029
|
+
|
2030
|
+
},{"./isInput":30,"./momentum":31,"./parse":33}],26:[function(require,module,exports){
|
2031
|
+
'use strict';
|
2032
|
+
|
2033
|
+
function dom (options) {
|
2034
|
+
var o = options || {};
|
2035
|
+
if (!o.type) { o.type = 'div'; }
|
2036
|
+
var elem = document.createElement(o.type);
|
2037
|
+
if (o.className) { elem.className = o.className; }
|
2038
|
+
if (o.text) { elem.innerText = elem.textContent = o.text; }
|
2039
|
+
if (o.attributes) {
|
2040
|
+
Object.keys(o.attributes).forEach(function(key) {
|
2041
|
+
elem.setAttribute(key, o.attributes[key]);
|
2042
|
+
});
|
2043
|
+
}
|
2044
|
+
if (o.parent) { o.parent.appendChild(elem); }
|
2045
|
+
return elem;
|
2046
|
+
}
|
2047
|
+
|
2048
|
+
module.exports = dom;
|
2049
|
+
|
2050
|
+
},{}],27:[function(require,module,exports){
|
2051
|
+
'use strict';
|
2052
|
+
var no;
|
2053
|
+
var ikey = 'data-rome-id';
|
2054
|
+
var index = [];
|
2055
|
+
|
2056
|
+
function find (thing) { // can be a DOM element or a number
|
2057
|
+
if (typeof thing !== 'number' && thing && thing.getAttribute) {
|
2058
|
+
return find(thing.getAttribute(ikey));
|
2059
|
+
}
|
2060
|
+
var existing = index[thing];
|
2061
|
+
if (existing !== no) {
|
2062
|
+
return existing;
|
2063
|
+
}
|
2064
|
+
return null;
|
2065
|
+
}
|
2066
|
+
|
2067
|
+
function assign (elem, instance) {
|
2068
|
+
elem.setAttribute(ikey, instance.id = index.push(instance) - 1);
|
2069
|
+
}
|
2070
|
+
|
2071
|
+
module.exports = {
|
2072
|
+
find: find,
|
2073
|
+
assign: assign
|
2074
|
+
};
|
2075
|
+
|
2076
|
+
},{}],28:[function(require,module,exports){
|
2077
|
+
'use strict';
|
2078
|
+
|
2079
|
+
var calendar = require('./calendar');
|
2080
|
+
|
2081
|
+
function inline (elem, calendarOptions) {
|
2082
|
+
var o = calendarOptions || {};
|
2083
|
+
|
2084
|
+
o.appendTo = elem;
|
2085
|
+
o.associated = elem;
|
2086
|
+
|
2087
|
+
var cal = calendar(o);
|
2088
|
+
cal.show();
|
2089
|
+
return cal;
|
2090
|
+
}
|
2091
|
+
|
2092
|
+
module.exports = inline;
|
2093
|
+
|
2094
|
+
},{"./calendar":21}],29:[function(require,module,exports){
|
2095
|
+
'use strict';
|
2096
|
+
|
2097
|
+
var crossvent = require('crossvent');
|
2098
|
+
var bullseye = require('bullseye');
|
2099
|
+
var throttle = require('./throttle');
|
2100
|
+
var clone = require('./clone');
|
2101
|
+
var defaults = require('./defaults');
|
2102
|
+
var calendar = require('./calendar');
|
2103
|
+
var momentum = require('./momentum');
|
2104
|
+
var classes = require('./classes');
|
2105
|
+
|
2106
|
+
function inputCalendar (input, calendarOptions) {
|
2107
|
+
var o = calendarOptions || {};
|
2108
|
+
|
2109
|
+
o.associated = input;
|
2110
|
+
|
2111
|
+
var api = calendar(o);
|
2112
|
+
var throttledTakeInput = throttle(takeInput, 30);
|
2113
|
+
var ignoreInvalidation;
|
2114
|
+
var ignoreShow;
|
2115
|
+
var eye;
|
2116
|
+
|
2117
|
+
init(o);
|
2118
|
+
|
2119
|
+
return api;
|
2120
|
+
|
2121
|
+
function init (initOptions) {
|
2122
|
+
o = defaults(initOptions || o, api);
|
2123
|
+
|
2124
|
+
classes.add(api.container, o.styles.positioned);
|
2125
|
+
crossvent.add(api.container, 'mousedown', containerMouseDown);
|
2126
|
+
crossvent.add(api.container, 'click', containerClick);
|
2127
|
+
|
2128
|
+
api.getDate = unrequire(api.getDate);
|
2129
|
+
api.getDateString = unrequire(api.getDateString);
|
2130
|
+
api.getMoment = unrequire(api.getMoment);
|
2131
|
+
|
2132
|
+
if (o.initialValue) {
|
2133
|
+
input.value = o.initialValue.format(o.inputFormat);
|
2134
|
+
}
|
2135
|
+
|
2136
|
+
eye = bullseye(api.container, input);
|
2137
|
+
api.on('data', updateInput);
|
2138
|
+
api.on('show', eye.refresh);
|
2139
|
+
|
2140
|
+
eventListening();
|
2141
|
+
throttledTakeInput();
|
2142
|
+
}
|
2143
|
+
|
2144
|
+
function destroy () {
|
2145
|
+
eventListening(true);
|
2146
|
+
eye.destroy();
|
2147
|
+
eye = null;
|
2148
|
+
}
|
2149
|
+
|
2150
|
+
function eventListening (remove) {
|
2151
|
+
var op = remove ? 'remove' : 'add';
|
2152
|
+
crossvent[op](input, 'click', show);
|
2153
|
+
crossvent[op](input, 'touchend', show);
|
2154
|
+
crossvent[op](input, 'focusin', show);
|
2155
|
+
crossvent[op](input, 'change', throttledTakeInput);
|
2156
|
+
crossvent[op](input, 'keypress', throttledTakeInput);
|
2157
|
+
crossvent[op](input, 'keydown', throttledTakeInput);
|
2158
|
+
crossvent[op](input, 'input', throttledTakeInput);
|
2159
|
+
if (o.invalidate) { crossvent[op](input, 'blur', invalidateInput); }
|
2160
|
+
|
2161
|
+
if (remove) {
|
2162
|
+
api.once('ready', init);
|
2163
|
+
api.off('destroyed', destroy);
|
2164
|
+
} else {
|
2165
|
+
api.off('ready', init);
|
2166
|
+
api.once('destroyed', destroy);
|
2167
|
+
}
|
2168
|
+
}
|
2169
|
+
|
2170
|
+
function containerClick () {
|
2171
|
+
ignoreShow = true;
|
2172
|
+
input.focus();
|
2173
|
+
ignoreShow = false;
|
2174
|
+
}
|
2175
|
+
|
2176
|
+
function containerMouseDown () {
|
2177
|
+
ignoreInvalidation = true;
|
2178
|
+
setTimeout(unignore, 0);
|
2179
|
+
|
2180
|
+
function unignore () {
|
2181
|
+
ignoreInvalidation = false;
|
2182
|
+
}
|
2183
|
+
}
|
2184
|
+
|
2185
|
+
function invalidateInput () {
|
2186
|
+
if (!ignoreInvalidation && !isEmpty()) {
|
2187
|
+
api.emitValues();
|
2188
|
+
}
|
2189
|
+
}
|
2190
|
+
|
2191
|
+
function show () {
|
2192
|
+
if (ignoreShow) {
|
2193
|
+
return;
|
2194
|
+
}
|
2195
|
+
api.show();
|
2196
|
+
}
|
2197
|
+
|
2198
|
+
function takeInput () {
|
2199
|
+
var value = input.value.trim();
|
2200
|
+
if (isEmpty()) {
|
2201
|
+
return;
|
2202
|
+
}
|
2203
|
+
var date = momentum.moment(value, o.inputFormat, o.strictParse);
|
2204
|
+
api.setValue(date);
|
2205
|
+
}
|
2206
|
+
|
2207
|
+
function updateInput (data) {
|
2208
|
+
input.value = data;
|
2209
|
+
}
|
2210
|
+
|
2211
|
+
function isEmpty () {
|
2212
|
+
return o.required === false && input.value.trim() === '';
|
2213
|
+
}
|
2214
|
+
|
2215
|
+
function unrequire (fn) {
|
2216
|
+
return function maybe () {
|
2217
|
+
return isEmpty() ? null : fn.apply(this, arguments);
|
2218
|
+
};
|
2219
|
+
}
|
2220
|
+
}
|
2221
|
+
|
2222
|
+
module.exports = inputCalendar;
|
2223
|
+
|
2224
|
+
},{"./calendar":21,"./classes":22,"./clone":23,"./defaults":25,"./momentum":31,"./throttle":46,"bullseye":1,"crossvent":18}],30:[function(require,module,exports){
|
2225
|
+
'use strict';
|
2226
|
+
|
2227
|
+
function isInput (elem) {
|
2228
|
+
return elem && elem.nodeName && elem.nodeName.toLowerCase() === 'input';
|
2229
|
+
}
|
2230
|
+
|
2231
|
+
module.exports = isInput;
|
2232
|
+
|
2233
|
+
},{}],31:[function(require,module,exports){
|
2234
|
+
'use strict';
|
2235
|
+
|
2236
|
+
function isMoment (value) {
|
2237
|
+
return value && Object.prototype.hasOwnProperty.call(value, '_isAMomentObject');
|
2238
|
+
}
|
2239
|
+
|
2240
|
+
var api = {
|
2241
|
+
moment: null,
|
2242
|
+
isMoment: isMoment
|
2243
|
+
};
|
2244
|
+
|
2245
|
+
module.exports = api;
|
2246
|
+
|
2247
|
+
},{}],32:[function(require,module,exports){
|
2248
|
+
'use strict';
|
2249
|
+
|
2250
|
+
function noop () {}
|
2251
|
+
|
2252
|
+
module.exports = noop;
|
2253
|
+
|
2254
|
+
},{}],33:[function(require,module,exports){
|
2255
|
+
'use strict';
|
2256
|
+
|
2257
|
+
var momentum = require('./momentum');
|
2258
|
+
|
2259
|
+
function raw (date, format) {
|
2260
|
+
if (typeof date === 'string') {
|
2261
|
+
return momentum.moment(date, format);
|
2262
|
+
}
|
2263
|
+
if (Object.prototype.toString.call(date) === '[object Date]') {
|
2264
|
+
return momentum.moment(date);
|
2265
|
+
}
|
2266
|
+
if (momentum.isMoment(date)) {
|
2267
|
+
return date.clone();
|
2268
|
+
}
|
2269
|
+
}
|
2270
|
+
|
2271
|
+
function parse (date, format) {
|
2272
|
+
var m = raw(date, typeof format === 'string' ? format : null);
|
2273
|
+
return m && m.isValid() ? m : null;
|
2274
|
+
}
|
2275
|
+
|
2276
|
+
module.exports = parse;
|
2277
|
+
|
2278
|
+
},{"./momentum":31}],34:[function(require,module,exports){
|
2279
|
+
'use strict';
|
2280
|
+
|
2281
|
+
if (!Array.prototype.filter) {
|
2282
|
+
Array.prototype.filter = function (fn, ctx) {
|
2283
|
+
var f = [];
|
2284
|
+
this.forEach(function (v, i, t) {
|
2285
|
+
if (fn.call(ctx, v, i, t)) { f.push(v); }
|
2286
|
+
}, ctx);
|
2287
|
+
return f;
|
2288
|
+
};
|
2289
|
+
}
|
2290
|
+
|
2291
|
+
},{}],35:[function(require,module,exports){
|
2292
|
+
'use strict';
|
2293
|
+
|
2294
|
+
if (!Array.prototype.forEach) {
|
2295
|
+
Array.prototype.forEach = function (fn, ctx) {
|
2296
|
+
if (this === void 0 || this === null || typeof fn !== 'function') {
|
2297
|
+
throw new TypeError();
|
2298
|
+
}
|
2299
|
+
var t = this;
|
2300
|
+
var len = t.length;
|
2301
|
+
for (var i = 0; i < len; i++) {
|
2302
|
+
if (i in t) { fn.call(ctx, t[i], i, t); }
|
2303
|
+
}
|
2304
|
+
};
|
2305
|
+
}
|
2306
|
+
|
2307
|
+
},{}],36:[function(require,module,exports){
|
2308
|
+
'use strict';
|
2309
|
+
|
2310
|
+
if (!Array.prototype.indexOf) {
|
2311
|
+
Array.prototype.indexOf = function (what, start) {
|
2312
|
+
if (this === undefined || this === null) {
|
2313
|
+
throw new TypeError();
|
2314
|
+
}
|
2315
|
+
var length = this.length;
|
2316
|
+
start = +start || 0;
|
2317
|
+
if (Math.abs(start) === Infinity) {
|
2318
|
+
start = 0;
|
2319
|
+
} else if (start < 0) {
|
2320
|
+
start += length;
|
2321
|
+
if (start < 0) { start = 0; }
|
2322
|
+
}
|
2323
|
+
for (; start < length; start++) {
|
2324
|
+
if (this[start] === what) {
|
2325
|
+
return start;
|
2326
|
+
}
|
2327
|
+
}
|
2328
|
+
return -1;
|
2329
|
+
};
|
2330
|
+
}
|
2331
|
+
|
2332
|
+
},{}],37:[function(require,module,exports){
|
2333
|
+
'use strict';
|
2334
|
+
|
2335
|
+
Array.isArray || (Array.isArray = function (a) {
|
2336
|
+
return '' + a !== a && Object.prototype.toString.call(a) === '[object Array]';
|
2337
|
+
});
|
2338
|
+
|
2339
|
+
},{}],38:[function(require,module,exports){
|
2340
|
+
'use strict';
|
2341
|
+
|
2342
|
+
if (!Array.prototype.map) {
|
2343
|
+
Array.prototype.map = function (fn, ctx) {
|
2344
|
+
var context, result, i;
|
2345
|
+
|
2346
|
+
if (this == null) {
|
2347
|
+
throw new TypeError('this is null or not defined');
|
2348
|
+
}
|
2349
|
+
|
2350
|
+
var source = Object(this);
|
2351
|
+
var len = source.length >>> 0;
|
2352
|
+
|
2353
|
+
if (typeof fn !== 'function') {
|
2354
|
+
throw new TypeError(fn + ' is not a function');
|
2355
|
+
}
|
2356
|
+
|
2357
|
+
if (arguments.length > 1) {
|
2358
|
+
context = ctx;
|
2359
|
+
}
|
2360
|
+
|
2361
|
+
result = new Array(len);
|
2362
|
+
i = 0;
|
2363
|
+
|
2364
|
+
while (i < len) {
|
2365
|
+
if (i in source) {
|
2366
|
+
result[i] = fn.call(context, source[i], i, source);
|
2367
|
+
}
|
2368
|
+
i++;
|
2369
|
+
}
|
2370
|
+
return result;
|
2371
|
+
};
|
2372
|
+
}
|
2373
|
+
|
2374
|
+
},{}],39:[function(require,module,exports){
|
2375
|
+
'use strict';
|
2376
|
+
|
2377
|
+
if (!Array.prototype.some) {
|
2378
|
+
Array.prototype.some = function (fn, ctx) {
|
2379
|
+
var context, i;
|
2380
|
+
|
2381
|
+
if (this == null) {
|
2382
|
+
throw new TypeError('this is null or not defined');
|
2383
|
+
}
|
2384
|
+
|
2385
|
+
var source = Object(this);
|
2386
|
+
var len = source.length >>> 0;
|
2387
|
+
|
2388
|
+
if (typeof fn !== 'function') {
|
2389
|
+
throw new TypeError(fn + ' is not a function');
|
2390
|
+
}
|
2391
|
+
|
2392
|
+
if (arguments.length > 1) {
|
2393
|
+
context = ctx;
|
2394
|
+
}
|
2395
|
+
|
2396
|
+
i = 0;
|
2397
|
+
|
2398
|
+
while (i < len) {
|
2399
|
+
if (i in source) {
|
2400
|
+
var test = fn.call(context, source[i], i, source);
|
2401
|
+
if (test) {
|
2402
|
+
return true;
|
2403
|
+
}
|
2404
|
+
}
|
2405
|
+
i++;
|
2406
|
+
}
|
2407
|
+
return false;
|
2408
|
+
};
|
2409
|
+
}
|
2410
|
+
|
2411
|
+
},{}],40:[function(require,module,exports){
|
2412
|
+
'use strict';
|
2413
|
+
|
2414
|
+
if (!Function.prototype.bind) {
|
2415
|
+
Function.prototype.bind = function (context) {
|
2416
|
+
if (typeof this !== 'function') {
|
2417
|
+
throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');
|
2418
|
+
}
|
2419
|
+
var curried = Array.prototype.slice.call(arguments, 1);
|
2420
|
+
var original = this;
|
2421
|
+
var NoOp = function () {};
|
2422
|
+
var bound = function () {
|
2423
|
+
var ctx = this instanceof NoOp && context ? this : context;
|
2424
|
+
var args = curried.concat(Array.prototype.slice.call(arguments));
|
2425
|
+
return original.apply(ctx, args);
|
2426
|
+
};
|
2427
|
+
NoOp.prototype = this.prototype;
|
2428
|
+
bound.prototype = new NoOp();
|
2429
|
+
return bound;
|
2430
|
+
};
|
2431
|
+
}
|
2432
|
+
|
2433
|
+
},{}],41:[function(require,module,exports){
|
2434
|
+
'use strict';
|
2435
|
+
|
2436
|
+
var hasOwn = Object.prototype.hasOwnProperty;
|
2437
|
+
var hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString');
|
2438
|
+
var dontEnums = [
|
2439
|
+
'toString',
|
2440
|
+
'toLocaleString',
|
2441
|
+
'valueOf',
|
2442
|
+
'hasOwnProperty',
|
2443
|
+
'isPrototypeOf',
|
2444
|
+
'propertyIsEnumerable',
|
2445
|
+
'constructor'
|
2446
|
+
];
|
2447
|
+
var dontEnumsLength = dontEnums.length;
|
2448
|
+
|
2449
|
+
if (!Object.keys) {
|
2450
|
+
Object.keys = function(obj) {
|
2451
|
+
if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {
|
2452
|
+
throw new TypeError('Object.keys called on non-object');
|
2453
|
+
}
|
2454
|
+
|
2455
|
+
var result = [], prop, i;
|
2456
|
+
|
2457
|
+
for (prop in obj) {
|
2458
|
+
if (hasOwn.call(obj, prop)) {
|
2459
|
+
result.push(prop);
|
2460
|
+
}
|
2461
|
+
}
|
2462
|
+
|
2463
|
+
if (hasDontEnumBug) {
|
2464
|
+
for (i = 0; i < dontEnumsLength; i++) {
|
2465
|
+
if (hasOwn.call(obj, dontEnums[i])) {
|
2466
|
+
result.push(dontEnums[i]);
|
2467
|
+
}
|
2468
|
+
}
|
2469
|
+
}
|
2470
|
+
return result;
|
2471
|
+
};
|
2472
|
+
}
|
2473
|
+
|
2474
|
+
},{}],42:[function(require,module,exports){
|
2475
|
+
'use strict';
|
2476
|
+
|
2477
|
+
if (!String.prototype.trim) {
|
2478
|
+
String.prototype.trim = function () {
|
2479
|
+
return this.replace(/^\s+|\s+$/g, '');
|
2480
|
+
};
|
2481
|
+
}
|
2482
|
+
|
2483
|
+
},{}],43:[function(require,module,exports){
|
2484
|
+
'use strict';
|
2485
|
+
|
2486
|
+
// these are only required for IE < 9
|
2487
|
+
// maybe move to IE-specific distro?
|
2488
|
+
require('./polyfills/function.bind');
|
2489
|
+
require('./polyfills/array.foreach');
|
2490
|
+
require('./polyfills/array.map');
|
2491
|
+
require('./polyfills/array.filter');
|
2492
|
+
require('./polyfills/array.isarray');
|
2493
|
+
require('./polyfills/array.indexof');
|
2494
|
+
require('./polyfills/array.some');
|
2495
|
+
require('./polyfills/string.trim');
|
2496
|
+
require('./polyfills/object.keys');
|
2497
|
+
|
2498
|
+
var core = require('./core');
|
2499
|
+
var index = require('./index');
|
2500
|
+
var use = require('./use');
|
2501
|
+
|
2502
|
+
core.use = use.bind(core);
|
2503
|
+
core.find = index.find;
|
2504
|
+
core.val = require('./validators');
|
2505
|
+
|
2506
|
+
module.exports = core;
|
2507
|
+
|
2508
|
+
},{"./core":24,"./index":27,"./polyfills/array.filter":34,"./polyfills/array.foreach":35,"./polyfills/array.indexof":36,"./polyfills/array.isarray":37,"./polyfills/array.map":38,"./polyfills/array.some":39,"./polyfills/function.bind":40,"./polyfills/object.keys":41,"./polyfills/string.trim":42,"./use":47,"./validators":48}],44:[function(require,module,exports){
|
2509
|
+
(function (global){
|
2510
|
+
var rome = require('./rome');
|
2511
|
+
var momentum = require('./momentum');
|
2512
|
+
|
2513
|
+
rome.use(global.moment);
|
2514
|
+
|
2515
|
+
if (momentum.moment === void 0) {
|
2516
|
+
throw new Error('rome depends on moment.js, you can get it at http://momentjs.com, or you could use the bundled distribution file instead.');
|
2517
|
+
}
|
2518
|
+
|
2519
|
+
module.exports = rome;
|
2520
|
+
|
2521
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
2522
|
+
|
2523
|
+
},{"./momentum":31,"./rome":43}],45:[function(require,module,exports){
|
2524
|
+
'use strict';
|
2525
|
+
|
2526
|
+
function text (elem, value) {
|
2527
|
+
if (arguments.length === 2) {
|
2528
|
+
elem.innerText = elem.textContent = value;
|
2529
|
+
}
|
2530
|
+
return elem.innerText || elem.textContent;
|
2531
|
+
}
|
2532
|
+
|
2533
|
+
module.exports = text;
|
2534
|
+
|
2535
|
+
},{}],46:[function(require,module,exports){
|
2536
|
+
'use strict';
|
2537
|
+
|
2538
|
+
module.exports = function throttle (fn, boundary) {
|
2539
|
+
var last = -Infinity;
|
2540
|
+
var timer;
|
2541
|
+
return function bounced () {
|
2542
|
+
if (timer) {
|
2543
|
+
return;
|
2544
|
+
}
|
2545
|
+
unbound();
|
2546
|
+
|
2547
|
+
function unbound () {
|
2548
|
+
clearTimeout(timer);
|
2549
|
+
timer = null;
|
2550
|
+
var next = last + boundary;
|
2551
|
+
var now = +new Date();
|
2552
|
+
if (now > next) {
|
2553
|
+
last = now;
|
2554
|
+
fn.apply(this, arguments);
|
2555
|
+
} else {
|
2556
|
+
timer = setTimeout(unbound, next - now);
|
2557
|
+
}
|
2558
|
+
}
|
2559
|
+
};
|
2560
|
+
};
|
2561
|
+
|
2562
|
+
},{}],47:[function(require,module,exports){
|
2563
|
+
'use strict';
|
2564
|
+
|
2565
|
+
var momentum = require('./momentum');
|
2566
|
+
|
2567
|
+
function use (moment) {
|
2568
|
+
this.moment = momentum.moment = moment;
|
2569
|
+
}
|
2570
|
+
|
2571
|
+
module.exports = use;
|
2572
|
+
|
2573
|
+
},{"./momentum":31}],48:[function(require,module,exports){
|
2574
|
+
'use strict';
|
2575
|
+
|
2576
|
+
var index = require('./index');
|
2577
|
+
var parse = require('./parse');
|
2578
|
+
var association = require('./association');
|
2579
|
+
|
2580
|
+
function compareBuilder (compare) {
|
2581
|
+
return function factory (value) {
|
2582
|
+
var fixed = parse(value);
|
2583
|
+
|
2584
|
+
return function validate (date) {
|
2585
|
+
var cal = index.find(value);
|
2586
|
+
var left = parse(date);
|
2587
|
+
var right = fixed || cal && cal.getMoment();
|
2588
|
+
if (!right) {
|
2589
|
+
return true;
|
2590
|
+
}
|
2591
|
+
if (cal) {
|
2592
|
+
association.add(this, cal);
|
2593
|
+
}
|
2594
|
+
return compare(left, right);
|
2595
|
+
};
|
2596
|
+
};
|
2597
|
+
}
|
2598
|
+
|
2599
|
+
function rangeBuilder (how, compare) {
|
2600
|
+
return function factory (start, end) {
|
2601
|
+
var dates;
|
2602
|
+
var len = arguments.length;
|
2603
|
+
|
2604
|
+
if (Array.isArray(start)) {
|
2605
|
+
dates = start;
|
2606
|
+
} else {
|
2607
|
+
if (len === 1) {
|
2608
|
+
dates = [start];
|
2609
|
+
} else if (len === 2) {
|
2610
|
+
dates = [[start, end]];
|
2611
|
+
}
|
2612
|
+
}
|
2613
|
+
|
2614
|
+
return function validate (date) {
|
2615
|
+
return dates.map(expand.bind(this))[how](compare.bind(this, date));
|
2616
|
+
};
|
2617
|
+
|
2618
|
+
function expand (value) {
|
2619
|
+
var start, end;
|
2620
|
+
var cal = index.find(value);
|
2621
|
+
if (cal) {
|
2622
|
+
start = end = cal.getMoment();
|
2623
|
+
} else if (Array.isArray(value)) {
|
2624
|
+
start = value[0]; end = value[1];
|
2625
|
+
} else {
|
2626
|
+
start = end = value;
|
2627
|
+
}
|
2628
|
+
if (cal) {
|
2629
|
+
association.add(cal, this);
|
2630
|
+
}
|
2631
|
+
return {
|
2632
|
+
start: parse(start).startOf('day').toDate(),
|
2633
|
+
end: parse(end).endOf('day').toDate()
|
2634
|
+
};
|
2635
|
+
}
|
2636
|
+
};
|
2637
|
+
}
|
2638
|
+
|
2639
|
+
var afterEq = compareBuilder(function (left, right) { return left >= right; });
|
2640
|
+
var after = compareBuilder(function (left, right) { return left > right; });
|
2641
|
+
var beforeEq = compareBuilder(function (left, right) { return left <= right; });
|
2642
|
+
var before = compareBuilder(function (left, right) { return left < right; });
|
2643
|
+
|
2644
|
+
var except = rangeBuilder('every', function (left, right) { return right.start > left || right.end < left; });
|
2645
|
+
var only = rangeBuilder('some', function (left, right) { return right.start <= left && right.end >= left; });
|
2646
|
+
|
2647
|
+
module.exports = {
|
2648
|
+
afterEq: afterEq,
|
2649
|
+
after: after,
|
2650
|
+
beforeEq: beforeEq,
|
2651
|
+
before: before,
|
2652
|
+
except: except,
|
2653
|
+
only: only
|
2654
|
+
};
|
2655
|
+
|
2656
|
+
},{"./association":20,"./index":27,"./parse":33}]},{},[44])(44)
|
2657
|
+
});
|
2658
|
+
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvYnVsbHNleWUvYnVsbHNleWUuanMiLCJub2RlX21vZHVsZXMvYnVsbHNleWUvbm9kZV9tb2R1bGVzL3NlbGVjY2lvbi9zcmMvZ2V0U2VsZWN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2J1bGxzZXllL25vZGVfbW9kdWxlcy9zZWxlY2Npb24vc3JjL2dldFNlbGVjdGlvbk51bGxPcC5qcyIsIm5vZGVfbW9kdWxlcy9idWxsc2V5ZS9ub2RlX21vZHVsZXMvc2VsZWNjaW9uL3NyYy9nZXRTZWxlY3Rpb25SYXcuanMiLCJub2RlX21vZHVsZXMvYnVsbHNleWUvbm9kZV9tb2R1bGVzL3NlbGVjY2lvbi9zcmMvZ2V0U2VsZWN0aW9uU3ludGhldGljLmpzIiwibm9kZV9tb2R1bGVzL2J1bGxzZXllL25vZGVfbW9kdWxlcy9zZWxlY2Npb24vc3JjL2lzSG9zdC5qcyIsIm5vZGVfbW9kdWxlcy9idWxsc2V5ZS9ub2RlX21vZHVsZXMvc2VsZWNjaW9uL3NyYy9yYW5nZVRvVGV4dFJhbmdlLmpzIiwibm9kZV9tb2R1bGVzL2J1bGxzZXllL25vZGVfbW9kdWxlcy9zZWxlY2Npb24vc3JjL3NlbGVjY2lvbi5qcyIsIm5vZGVfbW9kdWxlcy9idWxsc2V5ZS9ub2RlX21vZHVsZXMvc2VsZWNjaW9uL3NyYy9zZXRTZWxlY3Rpb24uanMiLCJub2RlX21vZHVsZXMvYnVsbHNleWUvbm9kZV9tb2R1bGVzL3NlbGwvc2VsbC5qcyIsIm5vZGVfbW9kdWxlcy9idWxsc2V5ZS90YWlsb3JtYWRlLmpzIiwibm9kZV9tb2R1bGVzL2J1bGxzZXllL3Rocm90dGxlLmpzIiwibm9kZV9tb2R1bGVzL2NvbnRyYS9kZWJvdW5jZS5qcyIsIm5vZGVfbW9kdWxlcy9jb250cmEvZW1pdHRlci5qcyIsIm5vZGVfbW9kdWxlcy9jb250cmEvbm9kZV9tb2R1bGVzL2F0b2EvYXRvYS5qcyIsIm5vZGVfbW9kdWxlcy9jb250cmEvbm9kZV9tb2R1bGVzL3RpY2t5L3RpY2t5LWJyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvY3Jvc3N2ZW50L25vZGVfbW9kdWxlcy9jdXN0b20tZXZlbnQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY3Jvc3N2ZW50L3NyYy9jcm9zc3ZlbnQuanMiLCJub2RlX21vZHVsZXMvY3Jvc3N2ZW50L3NyYy9ldmVudG1hcC5qcyIsInNyYy9hc3NvY2lhdGlvbi5qcyIsInNyYy9jYWxlbmRhci5qcyIsInNyYy9jbGFzc2VzLmpzIiwic3JjL2Nsb25lLmpzIiwic3JjL2NvcmUuanMiLCJzcmMvZGVmYXVsdHMuanMiLCJzcmMvZG9tLmpzIiwic3JjL2luZGV4LmpzIiwic3JjL2lubGluZS5qcyIsInNyYy9pbnB1dC5qcyIsInNyYy9pc0lucHV0LmpzIiwic3JjL21vbWVudHVtLmpzIiwic3JjL25vb3AuanMiLCJzcmMvcGFyc2UuanMiLCJzcmMvcG9seWZpbGxzL2FycmF5LmZpbHRlci5qcyIsInNyYy9wb2x5ZmlsbHMvYXJyYXkuZm9yZWFjaC5qcyIsInNyYy9wb2x5ZmlsbHMvYXJyYXkuaW5kZXhvZi5qcyIsInNyYy9wb2x5ZmlsbHMvYXJyYXkuaXNhcnJheS5qcyIsInNyYy9wb2x5ZmlsbHMvYXJyYXkubWFwLmpzIiwic3JjL3BvbHlmaWxscy9hcnJheS5zb21lLmpzIiwic3JjL3BvbHlmaWxscy9mdW5jdGlvbi5iaW5kLmpzIiwic3JjL3BvbHlmaWxscy9vYmplY3Qua2V5cy5qcyIsInNyYy9wb2x5ZmlsbHMvc3RyaW5nLnRyaW0uanMiLCJzcmMvcm9tZS5qcyIsInNyYy9yb21lLnN0YW5kYWxvbmUuanMiLCJzcmMvdGV4dC5qcyIsInNyYy90aHJvdHRsZS5qcyIsInNyYy91c2UuanMiLCJzcmMvdmFsaWRhdG9ycy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDdEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDMVBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDNURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2hHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNoTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdERBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDaERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNsR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIndXNlIHN0cmljdCc7XG5cbnZhciBjcm9zc3ZlbnQgPSByZXF1aXJlKCdjcm9zc3ZlbnQnKTtcbnZhciB0aHJvdHRsZSA9IHJlcXVpcmUoJy4vdGhyb3R0bGUnKTtcbnZhciB0YWlsb3JtYWRlID0gcmVxdWlyZSgnLi90YWlsb3JtYWRlJyk7XG5cbmZ1bmN0aW9uIGJ1bGxzZXllIChlbCwgdGFyZ2V0LCBvcHRpb25zKSB7XG4gIHZhciBvID0gb3B0aW9ucztcbiAgdmFyIGRvbVRhcmdldCA9IHRhcmdldCAmJiB0YXJnZXQudGFnTmFtZTtcblxuICBpZiAoIWRvbVRhcmdldCAmJiBhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgbyA9IHRhcmdldDtcbiAgfVxuICBpZiAoIWRvbVRhcmdldCkge1xuICAgIHRhcmdldCA9IGVsO1xuICB9XG4gIGlmICghbykgeyBvID0ge307IH1cblxuICB2YXIgZGVzdHJveWVkID0gZmFsc2U7XG4gIHZhciB0aHJvdHRsZWRXcml0ZSA9IHRocm90dGxlKHdyaXRlLCAzMCk7XG4gIHZhciB0YWlsb3JPcHRpb25zID0geyB1cGRhdGU6IG8uYXV0b3VwZGF0ZVRvQ2FyZXQgIT09IGZhbHNlICYmIHVwZGF0ZSB9O1xuICB2YXIgdGFpbG9yID0gby5jYXJldCAmJiB0YWlsb3JtYWRlKHRhcmdldCwgdGFpbG9yT3B0aW9ucyk7XG5cbiAgd3JpdGUoKTtcblxuICBpZiAoby50cmFja2luZyAhPT0gZmFsc2UpIHtcbiAgICBjcm9zc3ZlbnQuYWRkKHdpbmRvdywgJ3Jlc2l6ZScsIHRocm90dGxlZFdyaXRlKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcmVhZDogcmVhZE51bGwsXG4gICAgcmVmcmVzaDogd3JpdGUsXG4gICAgZGVzdHJveTogZGVzdHJveSxcbiAgICBzbGVlcDogc2xlZXBcbiAgfTtcblxuICBmdW5jdGlvbiBzbGVlcCAoKSB7XG4gICAgdGFpbG9yT3B0aW9ucy5zbGVlcGluZyA9IHRydWU7XG4gIH1cblxuICBmdW5jdGlvbiByZWFkTnVsbCAoKSB7IHJldHVybiByZWFkKCk7IH1cblxuICBmdW5jdGlvbiByZWFkIChyZWFkaW5ncykge1xuICAgIHZhciBib3VuZHMgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdmFyIHNjcm9sbFRvcCA9IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7XG4gICAgaWYgKHRhaWxvcikge1xuICAgICAgcmVhZGluZ3MgPSB0YWlsb3IucmVhZCgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogKHJlYWRpbmdzLmFic29sdXRlID8gMCA6IGJvdW5kcy5sZWZ0KSArIHJlYWRpbmdzLngsXG4gICAgICAgIHk6IChyZWFkaW5ncy5hYnNvbHV0ZSA/IDAgOiBib3VuZHMudG9wKSArIHNjcm9sbFRvcCArIHJlYWRpbmdzLnkgKyAyMFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGJvdW5kcy5sZWZ0LFxuICAgICAgeTogYm91bmRzLnRvcCArIHNjcm9sbFRvcFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGUgKHJlYWRpbmdzKSB7XG4gICAgd3JpdGUocmVhZGluZ3MpO1xuICB9XG5cbiAgZnVuY3Rpb24gd3JpdGUgKHJlYWRpbmdzKSB7XG4gICAgaWYgKGRlc3Ryb3llZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWxsc2V5ZSBjYW5cXCd0IHJlZnJlc2ggYWZ0ZXIgYmVpbmcgZGVzdHJveWVkLiBDcmVhdGUgYW5vdGhlciBpbnN0YW5jZSBpbnN0ZWFkLicpO1xuICAgIH1cbiAgICBpZiAodGFpbG9yICYmICFyZWFkaW5ncykge1xuICAgICAgdGFpbG9yT3B0aW9ucy5zbGVlcGluZyA9IGZhbHNlO1xuICAgICAgdGFpbG9yLnJlZnJlc2goKTsgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgcCA9IHJlYWQocmVhZGluZ3MpO1xuICAgIGlmICghdGFpbG9yICYmIHRhcmdldCAhPT0gZWwpIHtcbiAgICAgIHAueSArPSB0YXJnZXQub2Zmc2V0SGVpZ2h0O1xuICAgIH1cbiAgICBlbC5zdHlsZS5sZWZ0ID0gcC54ICsgJ3B4JztcbiAgICBlbC5zdHlsZS50b3AgPSBwLnkgKyAncHgnO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVzdHJveSAoKSB7XG4gICAgaWYgKHRhaWxvcikgeyB0YWlsb3IuZGVzdHJveSgpOyB9XG4gICAgY3Jvc3N2ZW50LnJlbW92ZSh3aW5kb3csICdyZXNpemUnLCB0aHJvdHRsZWRXcml0ZSk7XG4gICAgZGVzdHJveWVkID0gdHJ1ZTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJ1bGxzZXllO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZ2V0U2VsZWN0aW9uO1xudmFyIGRvYyA9IGdsb2JhbC5kb2N1bWVudDtcbnZhciBnZXRTZWxlY3Rpb25SYXcgPSByZXF1aXJlKCcuL2dldFNlbGVjdGlvblJhdycpO1xudmFyIGdldFNlbGVjdGlvbk51bGxPcCA9IHJlcXVpcmUoJy4vZ2V0U2VsZWN0aW9uTnVsbE9wJyk7XG52YXIgZ2V0U2VsZWN0aW9uU3ludGhldGljID0gcmVxdWlyZSgnLi9nZXRTZWxlY3Rpb25TeW50aGV0aWMnKTtcbnZhciBpc0hvc3QgPSByZXF1aXJlKCcuL2lzSG9zdCcpO1xuaWYgKGlzSG9zdC5tZXRob2QoZ2xvYmFsLCAnZ2V0U2VsZWN0aW9uJykpIHtcbiAgZ2V0U2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uUmF3O1xufSBlbHNlIGlmICh0eXBlb2YgZG9jLnNlbGVjdGlvbiA9PT0gJ29iamVjdCcgJiYgZG9jLnNlbGVjdGlvbikge1xuICBnZXRTZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb25TeW50aGV0aWM7XG59IGVsc2Uge1xuICBnZXRTZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb25OdWxsT3A7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0U2VsZWN0aW9uO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBub29wICgpIHt9XG5cbmZ1bmN0aW9uIGdldFNlbGVjdGlvbk51bGxPcCAoKSB7XG4gIHJldHVybiB7XG4gICAgcmVtb3ZlQWxsUmFuZ2VzOiBub29wLFxuICAgIGFkZFJhbmdlOiBub29wXG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0U2VsZWN0aW9uTnVsbE9wO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb25SYXcgKCkge1xuICByZXR1cm4gZ2xvYmFsLmdldFNlbGVjdGlvbigpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFNlbGVjdGlvblJhdztcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHJhbmdlVG9UZXh0UmFuZ2UgPSByZXF1aXJlKCcuL3JhbmdlVG9UZXh0UmFuZ2UnKTtcbnZhciBkb2MgPSBnbG9iYWwuZG9jdW1lbnQ7XG52YXIgYm9keSA9IGRvYy5ib2R5O1xudmFyIEdldFNlbGVjdGlvblByb3RvID0gR2V0U2VsZWN0aW9uLnByb3RvdHlwZTtcblxuZnVuY3Rpb24gR2V0U2VsZWN0aW9uIChzZWxlY3Rpb24pIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcmFuZ2UgPSBzZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTtcblxuICB0aGlzLl9zZWxlY3Rpb24gPSBzZWxlY3Rpb247XG4gIHRoaXMuX3JhbmdlcyA9IFtdO1xuXG4gIGlmIChzZWxlY3Rpb24udHlwZSA9PT0gJ0NvbnRyb2wnKSB7XG4gICAgdXBkYXRlQ29udHJvbFNlbGVjdGlvbihzZWxmKTtcbiAgfSBlbHNlIGlmIChpc1RleHRSYW5nZShyYW5nZSkpIHtcbiAgICB1cGRhdGVGcm9tVGV4dFJhbmdlKHNlbGYsIHJhbmdlKTtcbiAgfSBlbHNlIHtcbiAgICB1cGRhdGVFbXB0eVNlbGVjdGlvbihzZWxmKTtcbiAgfVxufVxuXG5HZXRTZWxlY3Rpb25Qcm90by5yZW1vdmVBbGxSYW5nZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB0ZXh0UmFuZ2U7XG4gIHRyeSB7XG4gICAgdGhpcy5fc2VsZWN0aW9uLmVtcHR5KCk7XG4gICAgaWYgKHRoaXMuX3NlbGVjdGlvbi50eXBlICE9PSAnTm9uZScpIHtcbiAgICAgIHRleHRSYW5nZSA9IGJvZHkuY3JlYXRlVGV4dFJhbmdlKCk7XG4gICAgICB0ZXh0UmFuZ2Uuc2VsZWN0KCk7XG4gICAgICB0aGlzLl9zZWxlY3Rpb24uZW1wdHkoKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgfVxuICB1cGRhdGVFbXB0eVNlbGVjdGlvbih0aGlzKTtcbn07XG5cbkdldFNlbGVjdGlvblByb3RvLmFkZFJhbmdlID0gZnVuY3Rpb24gKHJhbmdlKSB7XG4gIGlmICh0aGlzLl9zZWxlY3Rpb24udHlwZSA9PT0gJ0NvbnRyb2wnKSB7XG4gICAgYWRkUmFuZ2VUb0NvbnRyb2xTZWxlY3Rpb24odGhpcywgcmFuZ2UpO1xuICB9IGVsc2Uge1xuICAgIHJhbmdlVG9UZXh0UmFuZ2UocmFuZ2UpLnNlbGVjdCgpO1xuICAgIHRoaXMuX3Jhbmdlc1swXSA9IHJhbmdlO1xuICAgIHRoaXMucmFuZ2VDb3VudCA9IDE7XG4gICAgdGhpcy5pc0NvbGxhcHNlZCA9IHRoaXMuX3Jhbmdlc1swXS5jb2xsYXBzZWQ7XG4gICAgdXBkYXRlQW5jaG9yQW5kRm9jdXNGcm9tUmFuZ2UodGhpcywgcmFuZ2UsIGZhbHNlKTtcbiAgfVxufTtcblxuR2V0U2VsZWN0aW9uUHJvdG8uc2V0UmFuZ2VzID0gZnVuY3Rpb24gKHJhbmdlcykge1xuICB0aGlzLnJlbW92ZUFsbFJhbmdlcygpO1xuICB2YXIgcmFuZ2VDb3VudCA9IHJhbmdlcy5sZW5ndGg7XG4gIGlmIChyYW5nZUNvdW50ID4gMSkge1xuICAgIGNyZWF0ZUNvbnRyb2xTZWxlY3Rpb24odGhpcywgcmFuZ2VzKTtcbiAgfSBlbHNlIGlmIChyYW5nZUNvdW50KSB7XG4gICAgdGhpcy5hZGRSYW5nZShyYW5nZXNbMF0pO1xuICB9XG59O1xuXG5HZXRTZWxlY3Rpb25Qcm90by5nZXRSYW5nZUF0ID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5yYW5nZUNvdW50KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdnZXRSYW5nZUF0KCk6IGluZGV4IG91dCBvZiBib3VuZHMnKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5fcmFuZ2VzW2luZGV4XS5jbG9uZVJhbmdlKCk7XG4gIH1cbn07XG5cbkdldFNlbGVjdGlvblByb3RvLnJlbW92ZVJhbmdlID0gZnVuY3Rpb24gKHJhbmdlKSB7XG4gIGlmICh0aGlzLl9zZWxlY3Rpb24udHlwZSAhPT0gJ0NvbnRyb2wnKSB7XG4gICAgcmVtb3ZlUmFuZ2VNYW51YWxseSh0aGlzLCByYW5nZSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBjb250cm9sUmFuZ2UgPSB0aGlzLl9zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTtcbiAgdmFyIHJhbmdlRWxlbWVudCA9IGdldFNpbmdsZUVsZW1lbnRGcm9tUmFuZ2UocmFuZ2UpO1xuICB2YXIgbmV3Q29udHJvbFJhbmdlID0gYm9keS5jcmVhdGVDb250cm9sUmFuZ2UoKTtcbiAgdmFyIGVsO1xuICB2YXIgcmVtb3ZlZCA9IGZhbHNlO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gY29udHJvbFJhbmdlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgZWwgPSBjb250cm9sUmFuZ2UuaXRlbShpKTtcbiAgICBpZiAoZWwgIT09IHJhbmdlRWxlbWVudCB8fCByZW1vdmVkKSB7XG4gICAgICBuZXdDb250cm9sUmFuZ2UuYWRkKGNvbnRyb2xSYW5nZS5pdGVtKGkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVtb3ZlZCA9IHRydWU7XG4gICAgfVxuICB9XG4gIG5ld0NvbnRyb2xSYW5nZS5zZWxlY3QoKTtcbiAgdXBkYXRlQ29udHJvbFNlbGVjdGlvbih0aGlzKTtcbn07XG5cbkdldFNlbGVjdGlvblByb3RvLmVhY2hSYW5nZSA9IGZ1bmN0aW9uIChmbiwgcmV0dXJuVmFsdWUpIHtcbiAgdmFyIGkgPSAwO1xuICB2YXIgbGVuID0gdGhpcy5fcmFuZ2VzLmxlbmd0aDtcbiAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKGZuKHRoaXMuZ2V0UmFuZ2VBdChpKSkpIHtcbiAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICB9XG4gIH1cbn07XG5cbkdldFNlbGVjdGlvblByb3RvLmdldEFsbFJhbmdlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHJhbmdlcyA9IFtdO1xuICB0aGlzLmVhY2hSYW5nZShmdW5jdGlvbiAocmFuZ2UpIHtcbiAgICByYW5nZXMucHVzaChyYW5nZSk7XG4gIH0pO1xuICByZXR1cm4gcmFuZ2VzO1xufTtcblxuR2V0U2VsZWN0aW9uUHJvdG8uc2V0U2luZ2xlUmFuZ2UgPSBmdW5jdGlvbiAocmFuZ2UpIHtcbiAgdGhpcy5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgdGhpcy5hZGRSYW5nZShyYW5nZSk7XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVDb250cm9sU2VsZWN0aW9uIChzZWwsIHJhbmdlcykge1xuICB2YXIgY29udHJvbFJhbmdlID0gYm9keS5jcmVhdGVDb250cm9sUmFuZ2UoKTtcbiAgZm9yICh2YXIgaSA9IDAsIGVsLCBsZW4gPSByYW5nZXMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICBlbCA9IGdldFNpbmdsZUVsZW1lbnRGcm9tUmFuZ2UocmFuZ2VzW2ldKTtcbiAgICB0cnkge1xuICAgICAgY29udHJvbFJhbmdlLmFkZChlbCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZXRSYW5nZXMoKTogRWxlbWVudCBjb3VsZCBub3QgYmUgYWRkZWQgdG8gY29udHJvbCBzZWxlY3Rpb24nKTtcbiAgICB9XG4gIH1cbiAgY29udHJvbFJhbmdlLnNlbGVjdCgpO1xuICB1cGRhdGVDb250cm9sU2VsZWN0aW9uKHNlbCk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVJhbmdlTWFudWFsbHkgKHNlbCwgcmFuZ2UpIHtcbiAgdmFyIHJhbmdlcyA9IHNlbC5nZXRBbGxSYW5nZXMoKTtcbiAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gcmFuZ2VzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKCFpc1NhbWVSYW5nZShyYW5nZSwgcmFuZ2VzW2ldKSkge1xuICAgICAgc2VsLmFkZFJhbmdlKHJhbmdlc1tpXSk7XG4gICAgfVxuICB9XG4gIGlmICghc2VsLnJhbmdlQ291bnQpIHtcbiAgICB1cGRhdGVFbXB0eVNlbGVjdGlvbihzZWwpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUFuY2hvckFuZEZvY3VzRnJvbVJhbmdlIChzZWwsIHJhbmdlKSB7XG4gIHZhciBhbmNob3JQcmVmaXggPSAnc3RhcnQnO1xuICB2YXIgZm9jdXNQcmVmaXggPSAnZW5kJztcbiAgc2VsLmFuY2hvck5vZGUgPSByYW5nZVthbmNob3JQcmVmaXggKyAnQ29udGFpbmVyJ107XG4gIHNlbC5hbmNob3JPZmZzZXQgPSByYW5nZVthbmNob3JQcmVmaXggKyAnT2Zmc2V0J107XG4gIHNlbC5mb2N1c05vZGUgPSByYW5nZVtmb2N1c1ByZWZpeCArICdDb250YWluZXInXTtcbiAgc2VsLmZvY3VzT2Zmc2V0ID0gcmFuZ2VbZm9jdXNQcmVmaXggKyAnT2Zmc2V0J107XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUVtcHR5U2VsZWN0aW9uIChzZWwpIHtcbiAgc2VsLmFuY2hvck5vZGUgPSBzZWwuZm9jdXNOb2RlID0gbnVsbDtcbiAgc2VsLmFuY2hvck9mZnNldCA9IHNlbC5mb2N1c09mZnNldCA9IDA7XG4gIHNlbC5yYW5nZUNvdW50ID0gMDtcbiAgc2VsLmlzQ29sbGFwc2VkID0gdHJ1ZTtcbiAgc2VsLl9yYW5nZXMubGVuZ3RoID0gMDtcbn1cblxuZnVuY3Rpb24gcmFuZ2VDb250YWluc1NpbmdsZUVsZW1lbnQgKHJhbmdlTm9kZXMpIHtcbiAgaWYgKCFyYW5nZU5vZGVzLmxlbmd0aCB8fCByYW5nZU5vZGVzWzBdLm5vZGVUeXBlICE9PSAxKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAodmFyIGkgPSAxLCBsZW4gPSByYW5nZU5vZGVzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKCFpc0FuY2VzdG9yT2YocmFuZ2VOb2Rlc1swXSwgcmFuZ2VOb2Rlc1tpXSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGdldFNpbmdsZUVsZW1lbnRGcm9tUmFuZ2UgKHJhbmdlKSB7XG4gIHZhciBub2RlcyA9IHJhbmdlLmdldE5vZGVzKCk7XG4gIGlmICghcmFuZ2VDb250YWluc1NpbmdsZUVsZW1lbnQobm9kZXMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdnZXRTaW5nbGVFbGVtZW50RnJvbVJhbmdlKCk6IHJhbmdlIGRpZCBub3QgY29uc2lzdCBvZiBhIHNpbmdsZSBlbGVtZW50Jyk7XG4gIH1cbiAgcmV0dXJuIG5vZGVzWzBdO1xufVxuXG5mdW5jdGlvbiBpc1RleHRSYW5nZSAocmFuZ2UpIHtcbiAgcmV0dXJuIHJhbmdlICYmIHJhbmdlLnRleHQgIT09IHZvaWQgMDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRnJvbVRleHRSYW5nZSAoc2VsLCByYW5nZSkge1xuICBzZWwuX3JhbmdlcyA9IFtyYW5nZV07XG4gIHVwZGF0ZUFuY2hvckFuZEZvY3VzRnJvbVJhbmdlKHNlbCwgcmFuZ2UsIGZhbHNlKTtcbiAgc2VsLnJhbmdlQ291bnQgPSAxO1xuICBzZWwuaXNDb2xsYXBzZWQgPSByYW5nZS5jb2xsYXBzZWQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRyb2xTZWxlY3Rpb24gKHNlbCkge1xuICBzZWwuX3Jhbmdlcy5sZW5ndGggPSAwO1xuICBpZiAoc2VsLl9zZWxlY3Rpb24udHlwZSA9PT0gJ05vbmUnKSB7XG4gICAgdXBkYXRlRW1wdHlTZWxlY3Rpb24oc2VsKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgY29udHJvbFJhbmdlID0gc2VsLl9zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTtcbiAgICBpZiAoaXNUZXh0UmFuZ2UoY29udHJvbFJhbmdlKSkge1xuICAgICAgdXBkYXRlRnJvbVRleHRSYW5nZShzZWwsIGNvbnRyb2xSYW5nZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbC5yYW5nZUNvdW50ID0gY29udHJvbFJhbmdlLmxlbmd0aDtcbiAgICAgIHZhciByYW5nZTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsLnJhbmdlQ291bnQ7ICsraSkge1xuICAgICAgICByYW5nZSA9IGRvYy5jcmVhdGVSYW5nZSgpO1xuICAgICAgICByYW5nZS5zZWxlY3ROb2RlKGNvbnRyb2xSYW5nZS5pdGVtKGkpKTtcbiAgICAgICAgc2VsLl9yYW5nZXMucHVzaChyYW5nZSk7XG4gICAgICB9XG4gICAgICBzZWwuaXNDb2xsYXBzZWQgPSBzZWwucmFuZ2VDb3VudCA9PT0gMSAmJiBzZWwuX3Jhbmdlc1swXS5jb2xsYXBzZWQ7XG4gICAgICB1cGRhdGVBbmNob3JBbmRGb2N1c0Zyb21SYW5nZShzZWwsIHNlbC5fcmFuZ2VzW3NlbC5yYW5nZUNvdW50IC0gMV0sIGZhbHNlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkUmFuZ2VUb0NvbnRyb2xTZWxlY3Rpb24gKHNlbCwgcmFuZ2UpIHtcbiAgdmFyIGNvbnRyb2xSYW5nZSA9IHNlbC5fc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7XG4gIHZhciByYW5nZUVsZW1lbnQgPSBnZXRTaW5nbGVFbGVtZW50RnJvbVJhbmdlKHJhbmdlKTtcbiAgdmFyIG5ld0NvbnRyb2xSYW5nZSA9IGJvZHkuY3JlYXRlQ29udHJvbFJhbmdlKCk7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBjb250cm9sUmFuZ2UubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICBuZXdDb250cm9sUmFuZ2UuYWRkKGNvbnRyb2xSYW5nZS5pdGVtKGkpKTtcbiAgfVxuICB0cnkge1xuICAgIG5ld0NvbnRyb2xSYW5nZS5hZGQocmFuZ2VFbGVtZW50KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignYWRkUmFuZ2UoKTogRWxlbWVudCBjb3VsZCBub3QgYmUgYWRkZWQgdG8gY29udHJvbCBzZWxlY3Rpb24nKTtcbiAgfVxuICBuZXdDb250cm9sUmFuZ2Uuc2VsZWN0KCk7XG4gIHVwZGF0ZUNvbnRyb2xTZWxlY3Rpb24oc2VsKTtcbn1cblxuZnVuY3Rpb24gaXNTYW1lUmFuZ2UgKGxlZnQsIHJpZ2h0KSB7XG4gIHJldHVybiAoXG4gICAgbGVmdC5zdGFydENvbnRhaW5lciA9PT0gcmlnaHQuc3RhcnRDb250YWluZXIgJiZcbiAgICBsZWZ0LnN0YXJ0T2Zmc2V0ID09PSByaWdodC5zdGFydE9mZnNldCAmJlxuICAgIGxlZnQuZW5kQ29udGFpbmVyID09PSByaWdodC5lbmRDb250YWluZXIgJiZcbiAgICBsZWZ0LmVuZE9mZnNldCA9PT0gcmlnaHQuZW5kT2Zmc2V0XG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzQW5jZXN0b3JPZiAoYW5jZXN0b3IsIGRlc2NlbmRhbnQpIHtcbiAgdmFyIG5vZGUgPSBkZXNjZW5kYW50O1xuICB3aGlsZSAobm9kZS5wYXJlbnROb2RlKSB7XG4gICAgaWYgKG5vZGUucGFyZW50Tm9kZSA9PT0gYW5jZXN0b3IpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0U2VsZWN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBHZXRTZWxlY3Rpb24oZ2xvYmFsLmRvY3VtZW50LnNlbGVjdGlvbik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0U2VsZWN0aW9uO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBpc0hvc3RNZXRob2QgKGhvc3QsIHByb3ApIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgaG9zdFtwcm9wXTtcbiAgcmV0dXJuIHR5cGUgPT09ICdmdW5jdGlvbicgfHwgISEodHlwZSA9PT0gJ29iamVjdCcgJiYgaG9zdFtwcm9wXSkgfHwgdHlwZSA9PT0gJ3Vua25vd24nO1xufVxuXG5mdW5jdGlvbiBpc0hvc3RQcm9wZXJ0eSAoaG9zdCwgcHJvcCkge1xuICByZXR1cm4gdHlwZW9mIGhvc3RbcHJvcF0gIT09ICd1bmRlZmluZWQnO1xufVxuXG5mdW5jdGlvbiBtYW55IChmbikge1xuICByZXR1cm4gZnVuY3Rpb24gYXJlSG9zdGVkIChob3N0LCBwcm9wcykge1xuICAgIHZhciBpID0gcHJvcHMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGlmICghZm4oaG9zdCwgcHJvcHNbaV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRob2Q6IGlzSG9zdE1ldGhvZCxcbiAgbWV0aG9kczogbWFueShpc0hvc3RNZXRob2QpLFxuICBwcm9wZXJ0eTogaXNIb3N0UHJvcGVydHksXG4gIHByb3BlcnRpZXM6IG1hbnkoaXNIb3N0UHJvcGVydHkpXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZG9jID0gZ2xvYmFsLmRvY3VtZW50O1xudmFyIGJvZHkgPSBkb2MuYm9keTtcblxuZnVuY3Rpb24gcmFuZ2VUb1RleHRSYW5nZSAocCkge1xuICBpZiAocC5jb2xsYXBzZWQpIHtcbiAgICByZXR1cm4gY3JlYXRlQm91bmRhcnlUZXh0UmFuZ2UoeyBub2RlOiBwLnN0YXJ0Q29udGFpbmVyLCBvZmZzZXQ6IHAuc3RhcnRPZmZzZXQgfSwgdHJ1ZSk7XG4gIH1cbiAgdmFyIHN0YXJ0UmFuZ2UgPSBjcmVhdGVCb3VuZGFyeVRleHRSYW5nZSh7IG5vZGU6IHAuc3RhcnRDb250YWluZXIsIG9mZnNldDogcC5zdGFydE9mZnNldCB9LCB0cnVlKTtcbiAgdmFyIGVuZFJhbmdlID0gY3JlYXRlQm91bmRhcnlUZXh0UmFuZ2UoeyBub2RlOiBwLmVuZENvbnRhaW5lciwgb2Zmc2V0OiBwLmVuZE9mZnNldCB9LCBmYWxzZSk7XG4gIHZhciB0ZXh0UmFuZ2UgPSBib2R5LmNyZWF0ZVRleHRSYW5nZSgpO1xuICB0ZXh0UmFuZ2Uuc2V0RW5kUG9pbnQoJ1N0YXJ0VG9TdGFydCcsIHN0YXJ0UmFuZ2UpO1xuICB0ZXh0UmFuZ2Uuc2V0RW5kUG9pbnQoJ0VuZFRvRW5kJywgZW5kUmFuZ2UpO1xuICByZXR1cm4gdGV4dFJhbmdlO1xufVxuXG5mdW5jdGlvbiBpc0NoYXJhY3RlckRhdGFOb2RlIChub2RlKSB7XG4gIHZhciB0ID0gbm9kZS5ub2RlVHlwZTtcbiAgcmV0dXJuIHQgPT09IDMgfHwgdCA9PT0gNCB8fCB0ID09PSA4IDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQm91bmRhcnlUZXh0UmFuZ2UgKHAsIHN0YXJ0aW5nKSB7XG4gIHZhciBib3VuZDtcbiAgdmFyIHBhcmVudDtcbiAgdmFyIG9mZnNldCA9IHAub2Zmc2V0O1xuICB2YXIgd29ya2luZ05vZGU7XG4gIHZhciBjaGlsZE5vZGVzO1xuICB2YXIgcmFuZ2UgPSBib2R5LmNyZWF0ZVRleHRSYW5nZSgpO1xuICB2YXIgZGF0YSA9IGlzQ2hhcmFjdGVyRGF0YU5vZGUocC5ub2RlKTtcblxuICBpZiAoZGF0YSkge1xuICAgIGJvdW5kID0gcC5ub2RlO1xuICAgIHBhcmVudCA9IGJvdW5kLnBhcmVudE5vZGU7XG4gIH0gZWxzZSB7XG4gICAgY2hpbGROb2RlcyA9IHAubm9kZS5jaGlsZE5vZGVzO1xuICAgIGJvdW5kID0gb2Zmc2V0IDwgY2hpbGROb2Rlcy5sZW5ndGggPyBjaGlsZE5vZGVzW29mZnNldF0gOiBudWxsO1xuICAgIHBhcmVudCA9IHAubm9kZTtcbiAgfVxuXG4gIHdvcmtpbmdOb2RlID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgd29ya2luZ05vZGUuaW5uZXJIVE1MID0gJyYjZmVmZjsnO1xuXG4gIGlmIChib3VuZCkge1xuICAgIHBhcmVudC5pbnNlcnRCZWZvcmUod29ya2luZ05vZGUsIGJvdW5kKTtcbiAgfSBlbHNlIHtcbiAgICBwYXJlbnQuYXBwZW5kQ2hpbGQod29ya2luZ05vZGUpO1xuICB9XG5cbiAgcmFuZ2UubW92ZVRvRWxlbWVudFRleHQod29ya2luZ05vZGUpO1xuICByYW5nZS5jb2xsYXBzZSghc3RhcnRpbmcpO1xuICBwYXJlbnQucmVtb3ZlQ2hpbGQod29ya2luZ05vZGUpO1xuXG4gIGlmIChkYXRhKSB7XG4gICAgcmFuZ2Vbc3RhcnRpbmcgPyAnbW92ZVN0YXJ0JyA6ICdtb3ZlRW5kJ10oJ2NoYXJhY3RlcicsIG9mZnNldCk7XG4gIH1cbiAgcmV0dXJuIHJhbmdlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJhbmdlVG9UZXh0UmFuZ2U7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBnZXRTZWxlY3Rpb24gPSByZXF1aXJlKCcuL2dldFNlbGVjdGlvbicpO1xudmFyIHNldFNlbGVjdGlvbiA9IHJlcXVpcmUoJy4vc2V0U2VsZWN0aW9uJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXQ6IGdldFNlbGVjdGlvbixcbiAgc2V0OiBzZXRTZWxlY3Rpb25cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBnZXRTZWxlY3Rpb24gPSByZXF1aXJlKCcuL2dldFNlbGVjdGlvbicpO1xudmFyIHJhbmdlVG9UZXh0UmFuZ2UgPSByZXF1aXJlKCcuL3JhbmdlVG9UZXh0UmFuZ2UnKTtcbnZhciBkb2MgPSBnbG9iYWwuZG9jdW1lbnQ7XG5cbmZ1bmN0aW9uIHNldFNlbGVjdGlvbiAocCkge1xuICBpZiAoZG9jLmNyZWF0ZVJhbmdlKSB7XG4gICAgbW9kZXJuU2VsZWN0aW9uKCk7XG4gIH0gZWxzZSB7XG4gICAgb2xkU2VsZWN0aW9uKCk7XG4gIH1cblxuICBmdW5jdGlvbiBtb2Rlcm5TZWxlY3Rpb24gKCkge1xuICAgIHZhciBzZWwgPSBnZXRTZWxlY3Rpb24oKTtcbiAgICB2YXIgcmFuZ2UgPSBkb2MuY3JlYXRlUmFuZ2UoKTtcbiAgICBpZiAoIXAuc3RhcnRDb250YWluZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHAuZW5kQ29udGFpbmVyKSB7XG4gICAgICByYW5nZS5zZXRFbmQocC5lbmRDb250YWluZXIsIHAuZW5kT2Zmc2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmFuZ2Uuc2V0RW5kKHAuc3RhcnRDb250YWluZXIsIHAuc3RhcnRPZmZzZXQpO1xuICAgIH1cbiAgICByYW5nZS5zZXRTdGFydChwLnN0YXJ0Q29udGFpbmVyLCBwLnN0YXJ0T2Zmc2V0KTtcbiAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgc2VsLmFkZFJhbmdlKHJhbmdlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9sZFNlbGVjdGlvbiAoKSB7XG4gICAgcmFuZ2VUb1RleHRSYW5nZShwKS5zZWxlY3QoKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldFNlbGVjdGlvbjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGdldCA9IGVhc3lHZXQ7XG52YXIgc2V0ID0gZWFzeVNldDtcblxuaWYgKGRvY3VtZW50LnNlbGVjdGlvbiAmJiBkb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UpIHtcbiAgZ2V0ID0gaGFyZEdldDtcbiAgc2V0ID0gaGFyZFNldDtcbn1cblxuZnVuY3Rpb24gZWFzeUdldCAoZWwpIHtcbiAgcmV0dXJuIHtcbiAgICBzdGFydDogZWwuc2VsZWN0aW9uU3RhcnQsXG4gICAgZW5kOiBlbC5zZWxlY3Rpb25FbmRcbiAgfTtcbn1cblxuZnVuY3Rpb24gaGFyZEdldCAoZWwpIHtcbiAgdmFyIGFjdGl2ZSA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIGlmIChhY3RpdmUgIT09IGVsKSB7XG4gICAgZWwuZm9jdXMoKTtcbiAgfVxuXG4gIHZhciByYW5nZSA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpO1xuICB2YXIgYm9va21hcmsgPSByYW5nZS5nZXRCb29rbWFyaygpO1xuICB2YXIgb3JpZ2luYWwgPSBlbC52YWx1ZTtcbiAgdmFyIG1hcmtlciA9IGdldFVuaXF1ZU1hcmtlcihvcmlnaW5hbCk7XG4gIHZhciBwYXJlbnQgPSByYW5nZS5wYXJlbnRFbGVtZW50KCk7XG4gIGlmIChwYXJlbnQgPT09IG51bGwgfHwgIWlucHV0cyhwYXJlbnQpKSB7XG4gICAgcmV0dXJuIHJlc3VsdCgwLCAwKTtcbiAgfVxuICByYW5nZS50ZXh0ID0gbWFya2VyICsgcmFuZ2UudGV4dCArIG1hcmtlcjtcblxuICB2YXIgY29udGVudHMgPSBlbC52YWx1ZTtcblxuICBlbC52YWx1ZSA9IG9yaWdpbmFsO1xuICByYW5nZS5tb3ZlVG9Cb29rbWFyayhib29rbWFyayk7XG4gIHJhbmdlLnNlbGVjdCgpO1xuXG4gIHJldHVybiByZXN1bHQoY29udGVudHMuaW5kZXhPZihtYXJrZXIpLCBjb250ZW50cy5sYXN0SW5kZXhPZihtYXJrZXIpIC0gbWFya2VyLmxlbmd0aCk7XG5cbiAgZnVuY3Rpb24gcmVzdWx0IChzdGFydCwgZW5kKSB7XG4gICAgaWYgKGFjdGl2ZSAhPT0gZWwpIHsgLy8gZG9uJ3QgZGlzcnVwdCBwcmUtZXhpc3Rpbmcgc3RhdGVcbiAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgYWN0aXZlLmZvY3VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbC5ibHVyKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydCwgZW5kOiBlbmQgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRVbmlxdWVNYXJrZXIgKGNvbnRlbnRzKSB7XG4gIHZhciBtYXJrZXI7XG4gIGRvIHtcbiAgICBtYXJrZXIgPSAnQEBtYXJrZXIuJyArIE1hdGgucmFuZG9tKCkgKiBuZXcgRGF0ZSgpO1xuICB9IHdoaWxlIChjb250ZW50cy5pbmRleE9mKG1hcmtlcikgIT09IC0xKTtcbiAgcmV0dXJuIG1hcmtlcjtcbn1cblxuZnVuY3Rpb24gaW5wdXRzIChlbCkge1xuICByZXR1cm4gKChlbC50YWdOYW1lID09PSAnSU5QVVQnICYmIGVsLnR5cGUgPT09ICd0ZXh0JykgfHwgZWwudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJyk7XG59XG5cbmZ1bmN0aW9uIGVhc3lTZXQgKGVsLCBwKSB7XG4gIGVsLnNlbGVjdGlvblN0YXJ0ID0gcGFyc2UoZWwsIHAuc3RhcnQpO1xuICBlbC5zZWxlY3Rpb25FbmQgPSBwYXJzZShlbCwgcC5lbmQpO1xufVxuXG5mdW5jdGlvbiBoYXJkU2V0IChlbCwgcCkge1xuICB2YXIgcmFuZ2UgPSBlbC5jcmVhdGVUZXh0UmFuZ2UoKTtcblxuICBpZiAocC5zdGFydCA9PT0gJ2VuZCcgJiYgcC5lbmQgPT09ICdlbmQnKSB7XG4gICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpO1xuICAgIHJhbmdlLnNlbGVjdCgpO1xuICB9IGVsc2Uge1xuICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICAgIHJhbmdlLm1vdmVFbmQoJ2NoYXJhY3RlcicsIHBhcnNlKGVsLCBwLmVuZCkpO1xuICAgIHJhbmdlLm1vdmVTdGFydCgnY2hhcmFjdGVyJywgcGFyc2UoZWwsIHAuc3RhcnQpKTtcbiAgICByYW5nZS5zZWxlY3QoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZSAoZWwsIHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gJ2VuZCcgPyBlbC52YWx1ZS5sZW5ndGggOiB2YWx1ZSB8fCAwO1xufVxuXG5mdW5jdGlvbiBzZWxsIChlbCwgcCkge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgIHNldChlbCwgcCk7XG4gIH1cbiAgcmV0dXJuIGdldChlbCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2VsbDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHNlbGwgPSByZXF1aXJlKCdzZWxsJyk7XG52YXIgY3Jvc3N2ZW50ID0gcmVxdWlyZSgnY3Jvc3N2ZW50Jyk7XG52YXIgc2VsZWNjaW9uID0gcmVxdWlyZSgnc2VsZWNjaW9uJyk7XG52YXIgdGhyb3R0bGUgPSByZXF1aXJlKCcuL3Rocm90dGxlJyk7XG52YXIgZ2V0U2VsZWN0aW9uID0gc2VsZWNjaW9uLmdldDtcbnZhciBwcm9wcyA9IFtcbiAgJ2RpcmVjdGlvbicsXG4gICdib3hTaXppbmcnLFxuICAnd2lkdGgnLFxuICAnaGVpZ2h0JyxcbiAgJ292ZXJmbG93WCcsXG4gICdvdmVyZmxvd1knLFxuICAnYm9yZGVyVG9wV2lkdGgnLFxuICAnYm9yZGVyUmlnaHRXaWR0aCcsXG4gICdib3JkZXJCb3R0b21XaWR0aCcsXG4gICdib3JkZXJMZWZ0V2lkdGgnLFxuICAncGFkZGluZ1RvcCcsXG4gICdwYWRkaW5nUmlnaHQnLFxuICAncGFkZGluZ0JvdHRvbScsXG4gICdwYWRkaW5nTGVmdCcsXG4gICdmb250U3R5bGUnLFxuICAnZm9udFZhcmlhbnQnLFxuICAnZm9udFdlaWdodCcsXG4gICdmb250U3RyZXRjaCcsXG4gICdmb250U2l6ZScsXG4gICdmb250U2l6ZUFkanVzdCcsXG4gICdsaW5lSGVpZ2h0JyxcbiAgJ2ZvbnRGYW1pbHknLFxuICAndGV4dEFsaWduJyxcbiAgJ3RleHRUcmFuc2Zvcm0nLFxuICAndGV4dEluZGVudCcsXG4gICd0ZXh0RGVjb3JhdGlvbicsXG4gICdsZXR0ZXJTcGFjaW5nJyxcbiAgJ3dvcmRTcGFjaW5nJ1xuXTtcbnZhciB3aW4gPSBnbG9iYWw7XG52YXIgZG9jID0gZG9jdW1lbnQ7XG52YXIgZmYgPSB3aW4ubW96SW5uZXJTY3JlZW5YICE9PSBudWxsICYmIHdpbi5tb3pJbm5lclNjcmVlblggIT09IHZvaWQgMDtcblxuZnVuY3Rpb24gdGFpbG9ybWFkZSAoZWwsIG9wdGlvbnMpIHtcbiAgdmFyIHRleHRJbnB1dCA9IGVsLnRhZ05hbWUgPT09ICdJTlBVVCcgfHwgZWwudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJztcbiAgdmFyIHRocm90dGxlZFJlZnJlc2ggPSB0aHJvdHRsZShyZWZyZXNoLCAzMCk7XG4gIHZhciBvID0gb3B0aW9ucyB8fCB7fTtcblxuICBiaW5kKCk7XG5cbiAgcmV0dXJuIHtcbiAgICByZWFkOiByZWFkUG9zaXRpb24sXG4gICAgcmVmcmVzaDogdGhyb3R0bGVkUmVmcmVzaCxcbiAgICBkZXN0cm95OiBkZXN0cm95XG4gIH07XG5cbiAgZnVuY3Rpb24gbm9vcCAoKSB7fVxuICBmdW5jdGlvbiByZWFkUG9zaXRpb24gKCkgeyByZXR1cm4gKHRleHRJbnB1dCA/IGNvb3Jkc1RleHQgOiBjb29yZHNIVE1MKSgpOyB9XG5cbiAgZnVuY3Rpb24gcmVmcmVzaCAoKSB7XG4gICAgaWYgKG8uc2xlZXBpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIChvLnVwZGF0ZSB8fCBub29wKShyZWFkUG9zaXRpb24oKSk7XG4gIH1cblxuICBmdW5jdGlvbiBjb29yZHNUZXh0ICgpIHtcbiAgICB2YXIgcCA9IHNlbGwoZWwpO1xuICAgIHZhciBjb250ZXh0ID0gcHJlcGFyZSgpO1xuICAgIHZhciByZWFkaW5ncyA9IHJlYWRUZXh0Q29vcmRzKGNvbnRleHQsIHAuc3RhcnQpO1xuICAgIGRvYy5ib2R5LnJlbW92ZUNoaWxkKGNvbnRleHQubWlycm9yKTtcbiAgICByZXR1cm4gcmVhZGluZ3M7XG4gIH1cblxuICBmdW5jdGlvbiBjb29yZHNIVE1MICgpIHtcbiAgICB2YXIgc2VsID0gZ2V0U2VsZWN0aW9uKCk7XG4gICAgaWYgKHNlbC5yYW5nZUNvdW50KSB7XG4gICAgICB2YXIgcmFuZ2UgPSBzZWwuZ2V0UmFuZ2VBdCgwKTtcbiAgICAgIHZhciBuZWVkc1RvV29ya0Fyb3VuZE5ld2xpbmVCdWcgPSByYW5nZS5zdGFydENvbnRhaW5lci5ub2RlTmFtZSA9PT0gJ1AnICYmIHJhbmdlLnN0YXJ0T2Zmc2V0ID09PSAwO1xuICAgICAgaWYgKG5lZWRzVG9Xb3JrQXJvdW5kTmV3bGluZUJ1Zykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHg6IHJhbmdlLnN0YXJ0Q29udGFpbmVyLm9mZnNldExlZnQsXG4gICAgICAgICAgeTogcmFuZ2Uuc3RhcnRDb250YWluZXIub2Zmc2V0VG9wLFxuICAgICAgICAgIGFic29sdXRlOiB0cnVlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAocmFuZ2UuZ2V0Q2xpZW50UmVjdHMpIHtcbiAgICAgICAgdmFyIHJlY3RzID0gcmFuZ2UuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICAgICAgaWYgKHJlY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogcmVjdHNbMF0ubGVmdCxcbiAgICAgICAgICAgIHk6IHJlY3RzWzBdLnRvcCxcbiAgICAgICAgICAgIGFic29sdXRlOiB0cnVlXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyB4OiAwLCB5OiAwIH07XG4gIH1cblxuICBmdW5jdGlvbiByZWFkVGV4dENvb3JkcyAoY29udGV4dCwgcCkge1xuICAgIHZhciByZXN0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICB2YXIgbWlycm9yID0gY29udGV4dC5taXJyb3I7XG4gICAgdmFyIGNvbXB1dGVkID0gY29udGV4dC5jb21wdXRlZDtcblxuICAgIHdyaXRlKG1pcnJvciwgcmVhZChlbCkuc3Vic3RyaW5nKDAsIHApKTtcblxuICAgIGlmIChlbC50YWdOYW1lID09PSAnSU5QVVQnKSB7XG4gICAgICBtaXJyb3IudGV4dENvbnRlbnQgPSBtaXJyb3IudGV4dENvbnRlbnQucmVwbGFjZSgvXFxzL2csICdcXHUwMGEwJyk7XG4gICAgfVxuXG4gICAgd3JpdGUocmVzdCwgcmVhZChlbCkuc3Vic3RyaW5nKHApIHx8ICcuJyk7XG5cbiAgICBtaXJyb3IuYXBwZW5kQ2hpbGQocmVzdCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogcmVzdC5vZmZzZXRMZWZ0ICsgcGFyc2VJbnQoY29tcHV0ZWRbJ2JvcmRlckxlZnRXaWR0aCddKSxcbiAgICAgIHk6IHJlc3Qub2Zmc2V0VG9wICsgcGFyc2VJbnQoY29tcHV0ZWRbJ2JvcmRlclRvcFdpZHRoJ10pXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWQgKGVsKSB7XG4gICAgcmV0dXJuIHRleHRJbnB1dCA/IGVsLnZhbHVlIDogZWwuaW5uZXJIVE1MO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJlcGFyZSAoKSB7XG4gICAgdmFyIGNvbXB1dGVkID0gd2luLmdldENvbXB1dGVkU3R5bGUgPyBnZXRDb21wdXRlZFN0eWxlKGVsKSA6IGVsLmN1cnJlbnRTdHlsZTtcbiAgICB2YXIgbWlycm9yID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHZhciBzdHlsZSA9IG1pcnJvci5zdHlsZTtcblxuICAgIGRvYy5ib2R5LmFwcGVuZENoaWxkKG1pcnJvcik7XG5cbiAgICBpZiAoZWwudGFnTmFtZSAhPT0gJ0lOUFVUJykge1xuICAgICAgc3R5bGUud29yZFdyYXAgPSAnYnJlYWstd29yZCc7XG4gICAgfVxuICAgIHN0eWxlLndoaXRlU3BhY2UgPSAncHJlLXdyYXAnO1xuICAgIHN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICBzdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgcHJvcHMuZm9yRWFjaChjb3B5KTtcblxuICAgIGlmIChmZikge1xuICAgICAgc3R5bGUud2lkdGggPSBwYXJzZUludChjb21wdXRlZC53aWR0aCkgLSAyICsgJ3B4JztcbiAgICAgIGlmIChlbC5zY3JvbGxIZWlnaHQgPiBwYXJzZUludChjb21wdXRlZC5oZWlnaHQpKSB7XG4gICAgICAgIHN0eWxlLm92ZXJmbG93WSA9ICdzY3JvbGwnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgIH1cbiAgICByZXR1cm4geyBtaXJyb3I6IG1pcnJvciwgY29tcHV0ZWQ6IGNvbXB1dGVkIH07XG5cbiAgICBmdW5jdGlvbiBjb3B5IChwcm9wKSB7XG4gICAgICBzdHlsZVtwcm9wXSA9IGNvbXB1dGVkW3Byb3BdO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHdyaXRlIChlbCwgdmFsdWUpIHtcbiAgICBpZiAodGV4dElucHV0KSB7XG4gICAgICBlbC50ZXh0Q29udGVudCA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbC5pbm5lckhUTUwgPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBiaW5kIChyZW1vdmUpIHtcbiAgICB2YXIgb3AgPSByZW1vdmUgPyAncmVtb3ZlJyA6ICdhZGQnO1xuICAgIGNyb3NzdmVudFtvcF0oZWwsICdrZXlkb3duJywgdGhyb3R0bGVkUmVmcmVzaCk7XG4gICAgY3Jvc3N2ZW50W29wXShlbCwgJ2tleXVwJywgdGhyb3R0bGVkUmVmcmVzaCk7XG4gICAgY3Jvc3N2ZW50W29wXShlbCwgJ2lucHV0JywgdGhyb3R0bGVkUmVmcmVzaCk7XG4gICAgY3Jvc3N2ZW50W29wXShlbCwgJ3Bhc3RlJywgdGhyb3R0bGVkUmVmcmVzaCk7XG4gICAgY3Jvc3N2ZW50W29wXShlbCwgJ2NoYW5nZScsIHRocm90dGxlZFJlZnJlc2gpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVzdHJveSAoKSB7XG4gICAgYmluZCh0cnVlKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRhaWxvcm1hZGU7XG4iLCIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIHRocm90dGxlIChmbiwgYm91bmRhcnkpIHtcbiAgdmFyIGxhc3QgPSAtSW5maW5pdHk7XG4gIHZhciB0aW1lcjtcbiAgcmV0dXJuIGZ1bmN0aW9uIGJvdW5jZWQgKCkge1xuICAgIGlmICh0aW1lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB1bmJvdW5kKCk7XG5cbiAgICBmdW5jdGlvbiB1bmJvdW5kICgpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aW1lciA9IG51bGw7XG4gICAgICB2YXIgbmV4dCA9IGxhc3QgKyBib3VuZGFyeTtcbiAgICAgIHZhciBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgaWYgKG5vdyA+IG5leHQpIHtcbiAgICAgICAgbGFzdCA9IG5vdztcbiAgICAgICAgZm4oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRpbWVyID0gc2V0VGltZW91dCh1bmJvdW5kLCBuZXh0IC0gbm93KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdGhyb3R0bGU7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB0aWNreSA9IHJlcXVpcmUoJ3RpY2t5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGVib3VuY2UgKGZuLCBhcmdzLCBjdHgpIHtcbiAgaWYgKCFmbikgeyByZXR1cm47IH1cbiAgdGlja3koZnVuY3Rpb24gcnVuICgpIHtcbiAgICBmbi5hcHBseShjdHggfHwgbnVsbCwgYXJncyB8fCBbXSk7XG4gIH0pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGF0b2EgPSByZXF1aXJlKCdhdG9hJyk7XG52YXIgZGVib3VuY2UgPSByZXF1aXJlKCcuL2RlYm91bmNlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZW1pdHRlciAodGhpbmcsIG9wdGlvbnMpIHtcbiAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgZXZ0ID0ge307XG4gIGlmICh0aGluZyA9PT0gdW5kZWZpbmVkKSB7IHRoaW5nID0ge307IH1cbiAgdGhpbmcub24gPSBmdW5jdGlvbiAodHlwZSwgZm4pIHtcbiAgICBpZiAoIWV2dFt0eXBlXSkge1xuICAgICAgZXZ0W3R5cGVdID0gW2ZuXTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXZ0W3R5cGVdLnB1c2goZm4pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpbmc7XG4gIH07XG4gIHRoaW5nLm9uY2UgPSBmdW5jdGlvbiAodHlwZSwgZm4pIHtcbiAgICBmbi5fb25jZSA9IHRydWU7IC8vIHRoaW5nLm9mZihmbikgc3RpbGwgd29ya3MhXG4gICAgdGhpbmcub24odHlwZSwgZm4pO1xuICAgIHJldHVybiB0aGluZztcbiAgfTtcbiAgdGhpbmcub2ZmID0gZnVuY3Rpb24gKHR5cGUsIGZuKSB7XG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGlmIChjID09PSAxKSB7XG4gICAgICBkZWxldGUgZXZ0W3R5cGVdO1xuICAgIH0gZWxzZSBpZiAoYyA9PT0gMCkge1xuICAgICAgZXZ0ID0ge307XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBldCA9IGV2dFt0eXBlXTtcbiAgICAgIGlmICghZXQpIHsgcmV0dXJuIHRoaW5nOyB9XG4gICAgICBldC5zcGxpY2UoZXQuaW5kZXhPZihmbiksIDEpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpbmc7XG4gIH07XG4gIHRoaW5nLmVtaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3MgPSBhdG9hKGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIHRoaW5nLmVtaXR0ZXJTbmFwc2hvdChhcmdzLnNoaWZ0KCkpLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICB9O1xuICB0aGluZy5lbWl0dGVyU25hcHNob3QgPSBmdW5jdGlvbiAodHlwZSkge1xuICAgIHZhciBldCA9IChldnRbdHlwZV0gfHwgW10pLnNsaWNlKDApO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgYXJncyA9IGF0b2EoYXJndW1lbnRzKTtcbiAgICAgIHZhciBjdHggPSB0aGlzIHx8IHRoaW5nO1xuICAgICAgaWYgKHR5cGUgPT09ICdlcnJvcicgJiYgb3B0cy50aHJvd3MgIT09IGZhbHNlICYmICFldC5sZW5ndGgpIHsgdGhyb3cgYXJncy5sZW5ndGggPT09IDEgPyBhcmdzWzBdIDogYXJnczsgfVxuICAgICAgZXQuZm9yRWFjaChmdW5jdGlvbiBlbWl0dGVyIChsaXN0ZW4pIHtcbiAgICAgICAgaWYgKG9wdHMuYXN5bmMpIHsgZGVib3VuY2UobGlzdGVuLCBhcmdzLCBjdHgpOyB9IGVsc2UgeyBsaXN0ZW4uYXBwbHkoY3R4LCBhcmdzKTsgfVxuICAgICAgICBpZiAobGlzdGVuLl9vbmNlKSB7IHRoaW5nLm9mZih0eXBlLCBsaXN0ZW4pOyB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0aGluZztcbiAgICB9O1xuICB9O1xuICByZXR1cm4gdGhpbmc7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBhdG9hIChhLCBuKSB7IHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLCBuKTsgfVxuIiwidmFyIHNpID0gdHlwZW9mIHNldEltbWVkaWF0ZSA9PT0gJ2Z1bmN0aW9uJywgdGljaztcbmlmIChzaSkge1xuICB0aWNrID0gZnVuY3Rpb24gKGZuKSB7IHNldEltbWVkaWF0ZShmbik7IH07XG59IGVsc2Uge1xuICB0aWNrID0gZnVuY3Rpb24gKGZuKSB7IHNldFRpbWVvdXQoZm4sIDApOyB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRpY2s7IiwiXG52YXIgTmF0aXZlQ3VzdG9tRXZlbnQgPSBnbG9iYWwuQ3VzdG9tRXZlbnQ7XG5cbmZ1bmN0aW9uIHVzZU5hdGl2ZSAoKSB7XG4gIHRyeSB7XG4gICAgdmFyIHAgPSBuZXcgTmF0aXZlQ3VzdG9tRXZlbnQoJ2NhdCcsIHsgZGV0YWlsOiB7IGZvbzogJ2JhcicgfSB9KTtcbiAgICByZXR1cm4gICdjYXQnID09PSBwLnR5cGUgJiYgJ2JhcicgPT09IHAuZGV0YWlsLmZvbztcbiAgfSBjYXRjaCAoZSkge1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDcm9zcy1icm93c2VyIGBDdXN0b21FdmVudGAgY29uc3RydWN0b3IuXG4gKlxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0N1c3RvbUV2ZW50LkN1c3RvbUV2ZW50XG4gKlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gdXNlTmF0aXZlKCkgPyBOYXRpdmVDdXN0b21FdmVudCA6XG5cbi8vIElFID49IDlcbidmdW5jdGlvbicgPT09IHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFdmVudCA/IGZ1bmN0aW9uIEN1c3RvbUV2ZW50ICh0eXBlLCBwYXJhbXMpIHtcbiAgdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtcbiAgaWYgKHBhcmFtcykge1xuICAgIGUuaW5pdEN1c3RvbUV2ZW50KHR5cGUsIHBhcmFtcy5idWJibGVzLCBwYXJhbXMuY2FuY2VsYWJsZSwgcGFyYW1zLmRldGFpbCk7XG4gIH0gZWxzZSB7XG4gICAgZS5pbml0Q3VzdG9tRXZlbnQodHlwZSwgZmFsc2UsIGZhbHNlLCB2b2lkIDApO1xuICB9XG4gIHJldHVybiBlO1xufSA6XG5cbi8vIElFIDw9IDhcbmZ1bmN0aW9uIEN1c3RvbUV2ZW50ICh0eXBlLCBwYXJhbXMpIHtcbiAgdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCgpO1xuICBlLnR5cGUgPSB0eXBlO1xuICBpZiAocGFyYW1zKSB7XG4gICAgZS5idWJibGVzID0gQm9vbGVhbihwYXJhbXMuYnViYmxlcyk7XG4gICAgZS5jYW5jZWxhYmxlID0gQm9vbGVhbihwYXJhbXMuY2FuY2VsYWJsZSk7XG4gICAgZS5kZXRhaWwgPSBwYXJhbXMuZGV0YWlsO1xuICB9IGVsc2Uge1xuICAgIGUuYnViYmxlcyA9IGZhbHNlO1xuICAgIGUuY2FuY2VsYWJsZSA9IGZhbHNlO1xuICAgIGUuZGV0YWlsID0gdm9pZCAwO1xuICB9XG4gIHJldHVybiBlO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY3VzdG9tRXZlbnQgPSByZXF1aXJlKCdjdXN0b20tZXZlbnQnKTtcbnZhciBldmVudG1hcCA9IHJlcXVpcmUoJy4vZXZlbnRtYXAnKTtcbnZhciBkb2MgPSBkb2N1bWVudDtcbnZhciBhZGRFdmVudCA9IGFkZEV2ZW50RWFzeTtcbnZhciByZW1vdmVFdmVudCA9IHJlbW92ZUV2ZW50RWFzeTtcbnZhciBoYXJkQ2FjaGUgPSBbXTtcblxuaWYgKCFnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcikge1xuICBhZGRFdmVudCA9IGFkZEV2ZW50SGFyZDtcbiAgcmVtb3ZlRXZlbnQgPSByZW1vdmVFdmVudEhhcmQ7XG59XG5cbmZ1bmN0aW9uIGFkZEV2ZW50RWFzeSAoZWwsIHR5cGUsIGZuLCBjYXB0dXJpbmcpIHtcbiAgcmV0dXJuIGVsLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZm4sIGNhcHR1cmluZyk7XG59XG5cbmZ1bmN0aW9uIGFkZEV2ZW50SGFyZCAoZWwsIHR5cGUsIGZuKSB7XG4gIHJldHVybiBlbC5hdHRhY2hFdmVudCgnb24nICsgdHlwZSwgd3JhcChlbCwgdHlwZSwgZm4pKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRXZlbnRFYXN5IChlbCwgdHlwZSwgZm4sIGNhcHR1cmluZykge1xuICByZXR1cm4gZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBmbiwgY2FwdHVyaW5nKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRXZlbnRIYXJkIChlbCwgdHlwZSwgZm4pIHtcbiAgcmV0dXJuIGVsLmRldGFjaEV2ZW50KCdvbicgKyB0eXBlLCB1bndyYXAoZWwsIHR5cGUsIGZuKSk7XG59XG5cbmZ1bmN0aW9uIGZhYnJpY2F0ZUV2ZW50IChlbCwgdHlwZSwgbW9kZWwpIHtcbiAgdmFyIGUgPSBldmVudG1hcC5pbmRleE9mKHR5cGUpID09PSAtMSA/IG1ha2VDdXN0b21FdmVudCgpIDogbWFrZUNsYXNzaWNFdmVudCgpO1xuICBpZiAoZWwuZGlzcGF0Y2hFdmVudCkge1xuICAgIGVsLmRpc3BhdGNoRXZlbnQoZSk7XG4gIH0gZWxzZSB7XG4gICAgZWwuZmlyZUV2ZW50KCdvbicgKyB0eXBlLCBlKTtcbiAgfVxuICBmdW5jdGlvbiBtYWtlQ2xhc3NpY0V2ZW50ICgpIHtcbiAgICB2YXIgZTtcbiAgICBpZiAoZG9jLmNyZWF0ZUV2ZW50KSB7XG4gICAgICBlID0gZG9jLmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgICAgZS5pbml0RXZlbnQodHlwZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChkb2MuY3JlYXRlRXZlbnRPYmplY3QpIHtcbiAgICAgIGUgPSBkb2MuY3JlYXRlRXZlbnRPYmplY3QoKTtcbiAgICB9XG4gICAgcmV0dXJuIGU7XG4gIH1cbiAgZnVuY3Rpb24gbWFrZUN1c3RvbUV2ZW50ICgpIHtcbiAgICByZXR1cm4gbmV3IGN1c3RvbUV2ZW50KHR5cGUsIHsgZGV0YWlsOiBtb2RlbCB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3cmFwcGVyRmFjdG9yeSAoZWwsIHR5cGUsIGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiB3cmFwcGVyIChvcmlnaW5hbEV2ZW50KSB7XG4gICAgdmFyIGUgPSBvcmlnaW5hbEV2ZW50IHx8IGdsb2JhbC5ldmVudDtcbiAgICBlLnRhcmdldCA9IGUudGFyZ2V0IHx8IGUuc3JjRWxlbWVudDtcbiAgICBlLnByZXZlbnREZWZhdWx0ID0gZS5wcmV2ZW50RGVmYXVsdCB8fCBmdW5jdGlvbiBwcmV2ZW50RGVmYXVsdCAoKSB7IGUucmV0dXJuVmFsdWUgPSBmYWxzZTsgfTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbiA9IGUuc3RvcFByb3BhZ2F0aW9uIHx8IGZ1bmN0aW9uIHN0b3BQcm9wYWdhdGlvbiAoKSB7IGUuY2FuY2VsQnViYmxlID0gdHJ1ZTsgfTtcbiAgICBlLndoaWNoID0gZS53aGljaCB8fCBlLmtleUNvZGU7XG4gICAgZm4uY2FsbChlbCwgZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHdyYXAgKGVsLCB0eXBlLCBmbikge1xuICB2YXIgd3JhcHBlciA9IHVud3JhcChlbCwgdHlwZSwgZm4pIHx8IHdyYXBwZXJGYWN0b3J5KGVsLCB0eXBlLCBmbik7XG4gIGhhcmRDYWNoZS5wdXNoKHtcbiAgICB3cmFwcGVyOiB3cmFwcGVyLFxuICAgIGVsZW1lbnQ6IGVsLFxuICAgIHR5cGU6IHR5cGUsXG4gICAgZm46IGZuXG4gIH0pO1xuICByZXR1cm4gd3JhcHBlcjtcbn1cblxuZnVuY3Rpb24gdW53cmFwIChlbCwgdHlwZSwgZm4pIHtcbiAgdmFyIGkgPSBmaW5kKGVsLCB0eXBlLCBmbik7XG4gIGlmIChpKSB7XG4gICAgdmFyIHdyYXBwZXIgPSBoYXJkQ2FjaGVbaV0ud3JhcHBlcjtcbiAgICBoYXJkQ2FjaGUuc3BsaWNlKGksIDEpOyAvLyBmcmVlIHVwIGEgdGFkIG9mIG1lbW9yeVxuICAgIHJldHVybiB3cmFwcGVyO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmQgKGVsLCB0eXBlLCBmbikge1xuICB2YXIgaSwgaXRlbTtcbiAgZm9yIChpID0gMDsgaSA8IGhhcmRDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgIGl0ZW0gPSBoYXJkQ2FjaGVbaV07XG4gICAgaWYgKGl0ZW0uZWxlbWVudCA9PT0gZWwgJiYgaXRlbS50eXBlID09PSB0eXBlICYmIGl0ZW0uZm4gPT09IGZuKSB7XG4gICAgICByZXR1cm4gaTtcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGFkZDogYWRkRXZlbnQsXG4gIHJlbW92ZTogcmVtb3ZlRXZlbnQsXG4gIGZhYnJpY2F0ZTogZmFicmljYXRlRXZlbnRcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBldmVudG1hcCA9IFtdO1xudmFyIGV2ZW50bmFtZSA9ICcnO1xudmFyIHJvbiA9IC9eb24vO1xuXG5mb3IgKGV2ZW50bmFtZSBpbiBnbG9iYWwpIHtcbiAgaWYgKHJvbi50ZXN0KGV2ZW50bmFtZSkpIHtcbiAgICBldmVudG1hcC5wdXNoKGV2ZW50bmFtZS5zbGljZSgyKSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBldmVudG1hcDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGlzSW5wdXQgPSByZXF1aXJlKCcuL2lzSW5wdXQnKTtcbnZhciBiaW5kaW5ncyA9IHt9O1xuXG5mdW5jdGlvbiBoYXMgKHNvdXJjZSwgdGFyZ2V0KSB7XG4gIHZhciBiaW5kaW5nID0gYmluZGluZ3Nbc291cmNlLmlkXTtcbiAgcmV0dXJuIGJpbmRpbmcgJiYgYmluZGluZ1t0YXJnZXQuaWRdO1xufVxuXG5mdW5jdGlvbiBpbnNlcnQgKHNvdXJjZSwgdGFyZ2V0KSB7XG4gIHZhciBiaW5kaW5nID0gYmluZGluZ3Nbc291cmNlLmlkXTtcbiAgaWYgKCFiaW5kaW5nKSB7XG4gICAgYmluZGluZyA9IGJpbmRpbmdzW3NvdXJjZS5pZF0gPSB7fTtcbiAgfVxuICB2YXIgaW52YWxpZGF0ZSA9IGludmFsaWRhdG9yKHRhcmdldCk7XG4gIGJpbmRpbmdbdGFyZ2V0LmlkXSA9IGludmFsaWRhdGU7XG4gIHNvdXJjZS5vbignZGF0YScsIGludmFsaWRhdGUpO1xuICBzb3VyY2Uub24oJ2Rlc3Ryb3llZCcsIHJlbW92ZS5iaW5kKG51bGwsIHNvdXJjZSwgdGFyZ2V0KSk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZSAoc291cmNlLCB0YXJnZXQpIHtcbiAgdmFyIGJpbmRpbmcgPSBiaW5kaW5nc1tzb3VyY2UuaWRdO1xuICBpZiAoIWJpbmRpbmcpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGludmFsaWRhdGUgPSBiaW5kaW5nW3RhcmdldC5pZF07XG4gIHNvdXJjZS5vZmYoJ2RhdGEnLCBpbnZhbGlkYXRlKTtcbiAgZGVsZXRlIGJpbmRpbmdbdGFyZ2V0LmlkXTtcbn1cblxuZnVuY3Rpb24gaW52YWxpZGF0b3IgKHRhcmdldCkge1xuICByZXR1cm4gZnVuY3Rpb24gaW52YWxpZGF0ZSAoKSB7XG4gICAgdGFyZ2V0LnJlZnJlc2goKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYWRkIChzb3VyY2UsIHRhcmdldCkge1xuICBpZiAoaXNJbnB1dCh0YXJnZXQuYXNzb2NpYXRlZCkgfHwgaGFzKHNvdXJjZSwgdGFyZ2V0KSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpbnNlcnQoc291cmNlLCB0YXJnZXQpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgYWRkOiBhZGQsXG4gIHJlbW92ZTogcmVtb3ZlXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY3Jvc3N2ZW50ID0gcmVxdWlyZSgnY3Jvc3N2ZW50Jyk7XG52YXIgZW1pdHRlciA9IHJlcXVpcmUoJ2NvbnRyYS9lbWl0dGVyJyk7XG52YXIgZG9tID0gcmVxdWlyZSgnLi9kb20nKTtcbnZhciB0ZXh0ID0gcmVxdWlyZSgnLi90ZXh0Jyk7XG52YXIgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlJyk7XG52YXIgY2xvbmUgPSByZXF1aXJlKCcuL2Nsb25lJyk7XG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKCcuL2RlZmF1bHRzJyk7XG52YXIgbW9tZW50dW0gPSByZXF1aXJlKCcuL21vbWVudHVtJyk7XG52YXIgY2xhc3NlcyA9IHJlcXVpcmUoJy4vY2xhc3NlcycpO1xudmFyIG5vb3AgPSByZXF1aXJlKCcuL25vb3AnKTtcbnZhciBubztcblxuZnVuY3Rpb24gY2FsZW5kYXIgKGNhbGVuZGFyT3B0aW9ucykge1xuICB2YXIgbztcbiAgdmFyIHJlZjtcbiAgdmFyIHJlZkNhbDtcbiAgdmFyIGNvbnRhaW5lcjtcbiAgdmFyIHJlbmRlcmVkID0gZmFsc2U7XG5cbiAgLy8gZGF0ZSB2YXJpYWJsZXNcbiAgdmFyIG1vbnRoT2Zmc2V0QXR0cmlidXRlID0gJ2RhdGEtcm9tZS1vZmZzZXQnO1xuICB2YXIgd2Vla2RheXM7XG4gIHZhciB3ZWVrZGF5Q291bnQ7XG4gIHZhciBjYWxlbmRhck1vbnRocyA9IFtdO1xuICB2YXIgbGFzdFllYXI7XG4gIHZhciBsYXN0TW9udGg7XG4gIHZhciBsYXN0RGF5O1xuICB2YXIgbGFzdERheUVsZW1lbnQ7XG4gIHZhciBkYXRld3JhcHBlcjtcbiAgdmFyIGJhY2s7XG4gIHZhciBuZXh0O1xuXG4gIC8vIHRpbWUgdmFyaWFibGVzXG4gIHZhciBzZWNvbmRzSW5EYXkgPSA2MCAqIDYwICogMjQ7XG4gIHZhciB0aW1lO1xuICB2YXIgdGltZWxpc3Q7XG5cbiAgdmFyIGFwaSA9IGVtaXR0ZXIoe1xuICAgIGFzc29jaWF0ZWQ6IGNhbGVuZGFyT3B0aW9ucy5hc3NvY2lhdGVkXG4gIH0pO1xuXG4gIGluaXQoKTtcbiAgc2V0VGltZW91dChyZWFkeSwgMCk7XG5cbiAgcmV0dXJuIGFwaTtcblxuICBmdW5jdGlvbiBuYXBpICgpIHsgcmV0dXJuIGFwaTsgfVxuXG4gIGZ1bmN0aW9uIGluaXQgKGluaXRPcHRpb25zKSB7XG4gICAgbyA9IGRlZmF1bHRzKGluaXRPcHRpb25zIHx8IGNhbGVuZGFyT3B0aW9ucywgYXBpKTtcbiAgICBpZiAoIWNvbnRhaW5lcikgeyBjb250YWluZXIgPSBkb20oeyBjbGFzc05hbWU6IG8uc3R5bGVzLmNvbnRhaW5lciB9KTsgfVxuICAgIHdlZWtkYXlzID0gby53ZWVrZGF5Rm9ybWF0O1xuICAgIHdlZWtkYXlDb3VudCA9IHdlZWtkYXlzLmxlbmd0aDtcbiAgICBsYXN0TW9udGggPSBubztcbiAgICBsYXN0WWVhciA9IG5vO1xuICAgIGxhc3REYXkgPSBubztcbiAgICBsYXN0RGF5RWxlbWVudCA9IG5vO1xuICAgIG8uYXBwZW5kVG8uYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcblxuICAgIHJlbW92ZUNoaWxkcmVuKGNvbnRhaW5lcik7XG4gICAgcmVuZGVyZWQgPSBmYWxzZTtcbiAgICByZWYgPSBvLmluaXRpYWxWYWx1ZSA/IG8uaW5pdGlhbFZhbHVlIDogbW9tZW50dW0ubW9tZW50KCk7XG4gICAgcmVmQ2FsID0gcmVmLmNsb25lKCk7XG5cbiAgICBhcGkuYmFjayA9IHN1YnRyYWN0TW9udGg7XG4gICAgYXBpLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICBhcGkuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgYXBpLmRlc3Ryb3kgPSBkZXN0cm95LmJpbmQoYXBpLCBmYWxzZSk7XG4gICAgYXBpLmVtaXRWYWx1ZXMgPSBlbWl0VmFsdWVzO1xuICAgIGFwaS5nZXREYXRlID0gZ2V0RGF0ZTtcbiAgICBhcGkuZ2V0RGF0ZVN0cmluZyA9IGdldERhdGVTdHJpbmc7XG4gICAgYXBpLmdldE1vbWVudCA9IGdldE1vbWVudDtcbiAgICBhcGkuaGlkZSA9IGhpZGU7XG4gICAgYXBpLm5leHQgPSBhZGRNb250aDtcbiAgICBhcGkub3B0aW9ucyA9IGNoYW5nZU9wdGlvbnM7XG4gICAgYXBpLm9wdGlvbnMucmVzZXQgPSByZXNldE9wdGlvbnM7XG4gICAgYXBpLnJlZnJlc2ggPSByZWZyZXNoO1xuICAgIGFwaS5yZXN0b3JlID0gbmFwaTtcbiAgICBhcGkuc2V0VmFsdWUgPSBzZXRWYWx1ZTtcbiAgICBhcGkuc2hvdyA9IHNob3c7XG5cbiAgICBldmVudExpc3RlbmluZygpO1xuICAgIHJlYWR5KCk7XG5cbiAgICByZXR1cm4gYXBpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVhZHkgKCkge1xuICAgIGFwaS5lbWl0KCdyZWFkeScsIGNsb25lKG8pKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlc3Ryb3kgKHNpbGVudCkge1xuICAgIGlmIChjb250YWluZXIgJiYgY29udGFpbmVyLnBhcmVudE5vZGUpIHtcbiAgICAgIGNvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgaWYgKG8pIHtcbiAgICAgIGV2ZW50TGlzdGVuaW5nKHRydWUpO1xuICAgIH1cblxuICAgIHZhciBkZXN0cm95ZWQgPSBhcGkuZW1pdHRlclNuYXBzaG90KCdkZXN0cm95ZWQnKTtcbiAgICBhcGkuYmFjayA9IG5vb3A7XG4gICAgYXBpLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgYXBpLmRlc3Ryb3kgPSBuYXBpO1xuICAgIGFwaS5lbWl0VmFsdWVzID0gbmFwaTtcbiAgICBhcGkuZ2V0RGF0ZSA9IG5vb3A7XG4gICAgYXBpLmdldERhdGVTdHJpbmcgPSBub29wO1xuICAgIGFwaS5nZXRNb21lbnQgPSBub29wO1xuICAgIGFwaS5oaWRlID0gbmFwaTtcbiAgICBhcGkubmV4dCA9IG5vb3A7XG4gICAgYXBpLm9wdGlvbnMgPSBuYXBpO1xuICAgIGFwaS5vcHRpb25zLnJlc2V0ID0gbmFwaTtcbiAgICBhcGkucmVmcmVzaCA9IG5hcGk7XG4gICAgYXBpLnJlc3RvcmUgPSBpbml0O1xuICAgIGFwaS5zZXRWYWx1ZSA9IG5hcGk7XG4gICAgYXBpLnNob3cgPSBuYXBpO1xuICAgIGFwaS5vZmYoKTtcblxuICAgIGlmIChzaWxlbnQgIT09IHRydWUpIHtcbiAgICAgIGRlc3Ryb3llZCgpO1xuICAgIH1cblxuICAgIHJldHVybiBhcGk7XG4gIH1cblxuICBmdW5jdGlvbiBldmVudExpc3RlbmluZyAocmVtb3ZlKSB7XG4gICAgdmFyIG9wID0gcmVtb3ZlID8gJ3JlbW92ZScgOiAnYWRkJztcbiAgICBpZiAoby5hdXRvSGlkZU9uQmx1cikgeyBjcm9zc3ZlbnRbb3BdKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgJ2ZvY3VzJywgaGlkZU9uQmx1ciwgdHJ1ZSk7IH1cbiAgICBpZiAoby5hdXRvSGlkZU9uQ2xpY2spIHsgY3Jvc3N2ZW50W29wXShkb2N1bWVudCwgJ2NsaWNrJywgaGlkZU9uQ2xpY2spOyB9XG4gIH1cblxuICBmdW5jdGlvbiBjaGFuZ2VPcHRpb25zIChvcHRpb25zKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBjbG9uZShvKTtcbiAgICB9XG4gICAgZGVzdHJveSgpO1xuICAgIGluaXQob3B0aW9ucyk7XG4gICAgcmV0dXJuIGFwaTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0T3B0aW9ucyAoKSB7XG4gICAgcmV0dXJuIGNoYW5nZU9wdGlvbnMoeyBhcHBlbmRUbzogby5hcHBlbmRUbyB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbmRlciAoKSB7XG4gICAgaWYgKHJlbmRlcmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlbmRlcmVkID0gdHJ1ZTtcbiAgICByZW5kZXJEYXRlcygpO1xuICAgIHJlbmRlclRpbWUoKTtcbiAgICBhcGkuZW1pdCgncmVuZGVyJyk7XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJEYXRlcyAoKSB7XG4gICAgaWYgKCFvLmRhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGk7XG4gICAgY2FsZW5kYXJNb250aHMgPSBbXTtcblxuICAgIGRhdGV3cmFwcGVyID0gZG9tKHsgY2xhc3NOYW1lOiBvLnN0eWxlcy5kYXRlLCBwYXJlbnQ6IGNvbnRhaW5lciB9KTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBvLm1vbnRoc0luQ2FsZW5kYXI7IGkrKykge1xuICAgICAgcmVuZGVyTW9udGgoaSk7XG4gICAgfVxuXG4gICAgY3Jvc3N2ZW50LmFkZChiYWNrLCAnY2xpY2snLCBzdWJ0cmFjdE1vbnRoKTtcbiAgICBjcm9zc3ZlbnQuYWRkKG5leHQsICdjbGljaycsIGFkZE1vbnRoKTtcbiAgICBjcm9zc3ZlbnQuYWRkKGRhdGV3cmFwcGVyLCAnY2xpY2snLCBwaWNrRGF5KTtcblxuICAgIGZ1bmN0aW9uIHJlbmRlck1vbnRoIChpKSB7XG4gICAgICB2YXIgbW9udGggPSBkb20oeyBjbGFzc05hbWU6IG8uc3R5bGVzLm1vbnRoLCBwYXJlbnQ6IGRhdGV3cmFwcGVyIH0pO1xuICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgYmFjayA9IGRvbSh7IHR5cGU6ICdidXR0b24nLCBjbGFzc05hbWU6IG8uc3R5bGVzLmJhY2ssIGF0dHJpYnV0ZXM6IHsgdHlwZTogJ2J1dHRvbicgfSwgcGFyZW50OiBtb250aCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChpID09PSBvLm1vbnRoc0luQ2FsZW5kYXIgLTEpIHtcbiAgICAgICAgbmV4dCA9IGRvbSh7IHR5cGU6ICdidXR0b24nLCBjbGFzc05hbWU6IG8uc3R5bGVzLm5leHQsIGF0dHJpYnV0ZXM6IHsgdHlwZTogJ2J1dHRvbicgfSwgcGFyZW50OiBtb250aCB9KTtcbiAgICAgIH1cbiAgICAgIHZhciBsYWJlbCA9IGRvbSh7IGNsYXNzTmFtZTogby5zdHlsZXMubW9udGhMYWJlbCwgcGFyZW50OiBtb250aCB9KTtcbiAgICAgIHZhciBkYXRlID0gZG9tKHsgdHlwZTogJ3RhYmxlJywgY2xhc3NOYW1lOiBvLnN0eWxlcy5kYXlUYWJsZSwgcGFyZW50OiBtb250aCB9KTtcbiAgICAgIHZhciBkYXRlaGVhZCA9IGRvbSh7IHR5cGU6ICd0aGVhZCcsIGNsYXNzTmFtZTogby5zdHlsZXMuZGF5SGVhZCwgcGFyZW50OiBkYXRlIH0pO1xuICAgICAgdmFyIGRhdGVoZWFkcm93ID0gZG9tKHsgdHlwZTogJ3RyJywgY2xhc3NOYW1lOiBvLnN0eWxlcy5kYXlSb3csIHBhcmVudDogZGF0ZWhlYWQgfSk7XG4gICAgICB2YXIgZGF0ZWJvZHkgPSBkb20oeyB0eXBlOiAndGJvZHknLCBjbGFzc05hbWU6IG8uc3R5bGVzLmRheUJvZHksIHBhcmVudDogZGF0ZSB9KTtcbiAgICAgIHZhciBqO1xuXG4gICAgICBmb3IgKGogPSAwOyBqIDwgd2Vla2RheUNvdW50OyBqKyspIHtcbiAgICAgICAgZG9tKHsgdHlwZTogJ3RoJywgY2xhc3NOYW1lOiBvLnN0eWxlcy5kYXlIZWFkRWxlbSwgcGFyZW50OiBkYXRlaGVhZHJvdywgdGV4dDogd2Vla2RheXNbd2Vla2RheShqKV0gfSk7XG4gICAgICB9XG5cbiAgICAgIGRhdGVib2R5LnNldEF0dHJpYnV0ZShtb250aE9mZnNldEF0dHJpYnV0ZSwgaSk7XG4gICAgICBjYWxlbmRhck1vbnRocy5wdXNoKHtcbiAgICAgICAgbGFiZWw6IGxhYmVsLFxuICAgICAgICBib2R5OiBkYXRlYm9keVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyVGltZSAoKSB7XG4gICAgaWYgKCFvLnRpbWUgfHwgIW8udGltZUludGVydmFsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1ld3JhcHBlciA9IGRvbSh7IGNsYXNzTmFtZTogby5zdHlsZXMudGltZSwgcGFyZW50OiBjb250YWluZXIgfSk7XG4gICAgdGltZSA9IGRvbSh7IGNsYXNzTmFtZTogby5zdHlsZXMuc2VsZWN0ZWRUaW1lLCBwYXJlbnQ6IHRpbWV3cmFwcGVyLCB0ZXh0OiByZWYuZm9ybWF0KG8udGltZUZvcm1hdCkgfSk7XG4gICAgY3Jvc3N2ZW50LmFkZCh0aW1lLCAnY2xpY2snLCB0b2dnbGVUaW1lTGlzdCk7XG4gICAgdGltZWxpc3QgPSBkb20oeyBjbGFzc05hbWU6IG8uc3R5bGVzLnRpbWVMaXN0LCBwYXJlbnQ6IHRpbWV3cmFwcGVyIH0pO1xuICAgIGNyb3NzdmVudC5hZGQodGltZWxpc3QsICdjbGljaycsIHBpY2tUaW1lKTtcbiAgICB2YXIgbmV4dCA9IG1vbWVudHVtLm1vbWVudCgnMDA6MDA6MDAnLCAnSEg6bW06c3MnKTtcbiAgICB2YXIgbGF0ZXN0ID0gbmV4dC5jbG9uZSgpLmFkZCgxLCAnZGF5cycpO1xuICAgIHdoaWxlIChuZXh0LmlzQmVmb3JlKGxhdGVzdCkpIHtcbiAgICAgIGRvbSh7IGNsYXNzTmFtZTogby5zdHlsZXMudGltZU9wdGlvbiwgcGFyZW50OiB0aW1lbGlzdCwgdGV4dDogbmV4dC5mb3JtYXQoby50aW1lRm9ybWF0KSB9KTtcbiAgICAgIG5leHQuYWRkKG8udGltZUludGVydmFsLCAnc2Vjb25kcycpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHdlZWtkYXkgKGluZGV4LCBiYWNrd2FyZHMpIHtcbiAgICB2YXIgZmFjdG9yID0gYmFja3dhcmRzID8gLTEgOiAxO1xuICAgIHZhciBvZmZzZXQgPSBpbmRleCArIG8ud2Vla1N0YXJ0ICogZmFjdG9yO1xuICAgIGlmIChvZmZzZXQgPj0gd2Vla2RheUNvdW50IHx8IG9mZnNldCA8IDApIHtcbiAgICAgIG9mZnNldCArPSB3ZWVrZGF5Q291bnQgKiAtZmFjdG9yO1xuICAgIH1cbiAgICByZXR1cm4gb2Zmc2V0O1xuICB9XG5cbiAgZnVuY3Rpb24gZGlzcGxheVZhbGlkVGltZXNPbmx5ICgpIHtcbiAgICBpZiAoIW8udGltZSB8fCAhcmVuZGVyZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVzID0gdGltZWxpc3QuY2hpbGRyZW47XG4gICAgdmFyIGxlbmd0aCA9IHRpbWVzLmxlbmd0aDtcbiAgICB2YXIgZGF0ZTtcbiAgICB2YXIgdGltZTtcbiAgICB2YXIgaXRlbTtcbiAgICB2YXIgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW0gPSB0aW1lc1tpXTtcbiAgICAgIHRpbWUgPSBtb21lbnR1bS5tb21lbnQodGV4dChpdGVtKSwgby50aW1lRm9ybWF0KTtcbiAgICAgIGRhdGUgPSBzZXRUaW1lKHJlZi5jbG9uZSgpLCB0aW1lKTtcbiAgICAgIGl0ZW0uc3R5bGUuZGlzcGxheSA9IGlzSW5SYW5nZShkYXRlLCBmYWxzZSwgby50aW1lVmFsaWRhdG9yKSA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdG9nZ2xlVGltZUxpc3QgKHNob3cpIHtcbiAgICB2YXIgZGlzcGxheSA9IHR5cGVvZiBzaG93ID09PSAnYm9vbGVhbicgPyBzaG93IDogdGltZWxpc3Quc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnO1xuICAgIGlmIChkaXNwbGF5KSB7XG4gICAgICBzaG93VGltZUxpc3QoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGlkZVRpbWVMaXN0KCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2hvd1RpbWVMaXN0ICgpIHsgaWYgKHRpbWVsaXN0KSB7IHRpbWVsaXN0LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOyB9IH1cbiAgZnVuY3Rpb24gaGlkZVRpbWVMaXN0ICgpIHsgaWYgKHRpbWVsaXN0KSB7IHRpbWVsaXN0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7IH0gfVxuICBmdW5jdGlvbiBzaG93Q2FsZW5kYXIgKCkgeyBjb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUtYmxvY2snOyBhcGkuZW1pdCgnc2hvdycpOyB9XG4gIGZ1bmN0aW9uIGhpZGVDYWxlbmRhciAoKSB7XG4gICAgaWYgKGNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScpIHtcbiAgICAgIGNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgYXBpLmVtaXQoJ2hpZGUnKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzaG93ICgpIHtcbiAgICByZW5kZXIoKTtcbiAgICByZWZyZXNoKCk7XG4gICAgdG9nZ2xlVGltZUxpc3QoIW8uZGF0ZSk7XG4gICAgc2hvd0NhbGVuZGFyKCk7XG4gICAgcmV0dXJuIGFwaTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhpZGUgKCkge1xuICAgIGhpZGVUaW1lTGlzdCgpO1xuICAgIHNldFRpbWVvdXQoaGlkZUNhbGVuZGFyLCAwKTtcbiAgICByZXR1cm4gYXBpO1xuICB9XG5cbiAgZnVuY3Rpb24gaGlkZUNvbmRpdGlvbmFsbHkgKCkge1xuICAgIGhpZGVUaW1lTGlzdCgpO1xuXG4gICAgdmFyIHBvcyA9IGNsYXNzZXMuY29udGFpbnMoY29udGFpbmVyLCBvLnN0eWxlcy5wb3NpdGlvbmVkKTtcbiAgICBpZiAocG9zKSB7XG4gICAgICBzZXRUaW1lb3V0KGhpZGVDYWxlbmRhciwgMCk7XG4gICAgfVxuICAgIHJldHVybiBhcGk7XG4gIH1cblxuICBmdW5jdGlvbiBjYWxlbmRhckV2ZW50VGFyZ2V0IChlKSB7XG4gICAgdmFyIHRhcmdldCA9IGUudGFyZ2V0O1xuICAgIGlmICh0YXJnZXQgPT09IGFwaS5hc3NvY2lhdGVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgd2hpbGUgKHRhcmdldCkge1xuICAgICAgaWYgKHRhcmdldCA9PT0gY29udGFpbmVyKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaGlkZU9uQmx1ciAoZSkge1xuICAgIGlmIChjYWxlbmRhckV2ZW50VGFyZ2V0KGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGhpZGVDb25kaXRpb25hbGx5KCk7XG4gIH1cblxuICBmdW5jdGlvbiBoaWRlT25DbGljayAoZSkge1xuICAgIGlmIChjYWxlbmRhckV2ZW50VGFyZ2V0KGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGhpZGVDb25kaXRpb25hbGx5KCk7XG4gIH1cblxuICBmdW5jdGlvbiBzdWJ0cmFjdE1vbnRoICgpIHsgY2hhbmdlTW9udGgoJ3N1YnRyYWN0Jyk7IH1cbiAgZnVuY3Rpb24gYWRkTW9udGggKCkgeyBjaGFuZ2VNb250aCgnYWRkJyk7IH1cbiAgZnVuY3Rpb24gY2hhbmdlTW9udGggKG9wKSB7XG4gICAgdmFyIGJvdW5kO1xuICAgIHZhciBkaXJlY3Rpb24gPSBvcCA9PT0gJ2FkZCcgPyAtMSA6IDE7XG4gICAgdmFyIG9mZnNldCA9IG8ubW9udGhzSW5DYWxlbmRhciArIGRpcmVjdGlvbiAqIGdldE1vbnRoT2Zmc2V0KGxhc3REYXlFbGVtZW50KTtcbiAgICByZWZDYWxbb3BdKG9mZnNldCwgJ21vbnRocycpO1xuICAgIGJvdW5kID0gaW5SYW5nZShyZWZDYWwuY2xvbmUoKSk7XG4gICAgcmVmID0gYm91bmQgfHwgcmVmO1xuICAgIGlmIChib3VuZCkgeyByZWZDYWwgPSBib3VuZC5jbG9uZSgpOyB9XG4gICAgdXBkYXRlKCk7XG4gICAgYXBpLmVtaXQob3AgPT09ICdhZGQnID8gJ25leHQnIDogJ2JhY2snLCByZWYubW9udGgoKSk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGUgKHNpbGVudCkge1xuICAgIHVwZGF0ZUNhbGVuZGFyKCk7XG4gICAgdXBkYXRlVGltZSgpO1xuICAgIGlmIChzaWxlbnQgIT09IHRydWUpIHsgZW1pdFZhbHVlcygpOyB9XG4gICAgZGlzcGxheVZhbGlkVGltZXNPbmx5KCk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVDYWxlbmRhciAoKSB7XG4gICAgaWYgKCFvLmRhdGUgfHwgIXJlbmRlcmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB5ID0gcmVmQ2FsLnllYXIoKTtcbiAgICB2YXIgbSA9IHJlZkNhbC5tb250aCgpO1xuICAgIHZhciBkID0gcmVmQ2FsLmRhdGUoKTtcbiAgICBpZiAoZCA9PT0gbGFzdERheSAmJiBtID09PSBsYXN0TW9udGggJiYgeSA9PT0gbGFzdFllYXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGNhblN0YXkgPSBpc0Rpc3BsYXllZCgpO1xuICAgIGxhc3REYXkgPSByZWZDYWwuZGF0ZSgpO1xuICAgIGxhc3RNb250aCA9IHJlZkNhbC5tb250aCgpO1xuICAgIGxhc3RZZWFyID0gcmVmQ2FsLnllYXIoKTtcbiAgICBpZiAoY2FuU3RheSkgeyB1cGRhdGVDYWxlbmRhclNlbGVjdGlvbigpOyByZXR1cm47IH1cbiAgICBjYWxlbmRhck1vbnRocy5mb3JFYWNoKHVwZGF0ZU1vbnRoKTtcbiAgICByZW5kZXJBbGxEYXlzKCk7XG5cbiAgICBmdW5jdGlvbiB1cGRhdGVNb250aCAobW9udGgsIGkpIHtcbiAgICAgIHZhciBvZmZzZXRDYWwgPSByZWZDYWwuY2xvbmUoKS5hZGQoaSwgJ21vbnRocycpO1xuICAgICAgdGV4dChtb250aC5sYWJlbCwgb2Zmc2V0Q2FsLmZvcm1hdChvLm1vbnRoRm9ybWF0KSk7XG4gICAgICByZW1vdmVDaGlsZHJlbihtb250aC5ib2R5KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVDYWxlbmRhclNlbGVjdGlvbiAoKSB7XG4gICAgdmFyIGRheSA9IHJlZkNhbC5kYXRlKCkgLSAxO1xuICAgIHNlbGVjdERheUVsZW1lbnQoZmFsc2UpO1xuICAgIGNhbGVuZGFyTW9udGhzLmZvckVhY2goZnVuY3Rpb24gKGNhbCkge1xuICAgICAgdmFyIGRheXM7XG4gICAgICBpZiAoc2FtZUNhbGVuZGFyTW9udGgoY2FsLmRhdGUsIHJlZkNhbCkpIHtcbiAgICAgICAgZGF5cyA9IGNhc3QoY2FsLmJvZHkuY2hpbGRyZW4pLm1hcChhZ2dyZWdhdGUpO1xuICAgICAgICBkYXlzID0gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSwgZGF5cykuZmlsdGVyKGluc2lkZSk7XG4gICAgICAgIHNlbGVjdERheUVsZW1lbnQoZGF5c1tkYXldKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGNhc3QgKGxpa2UpIHtcbiAgICAgIHZhciBkZXN0ID0gW107XG4gICAgICB2YXIgaTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBsaWtlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGRlc3QucHVzaChsaWtlW2ldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZXN0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFnZ3JlZ2F0ZSAoY2hpbGQpIHtcbiAgICAgIHJldHVybiBjYXN0KGNoaWxkLmNoaWxkcmVuKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnNpZGUgKGNoaWxkKSB7XG4gICAgICByZXR1cm4gIWNsYXNzZXMuY29udGFpbnMoY2hpbGQsIG8uc3R5bGVzLmRheVByZXZNb250aCkgJiZcbiAgICAgICAgICAgICAhY2xhc3Nlcy5jb250YWlucyhjaGlsZCwgby5zdHlsZXMuZGF5TmV4dE1vbnRoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpc0Rpc3BsYXllZCAoKSB7XG4gICAgcmV0dXJuIGNhbGVuZGFyTW9udGhzLnNvbWUobWF0Y2hlcyk7XG5cbiAgICBmdW5jdGlvbiBtYXRjaGVzIChjYWwpIHtcbiAgICAgIGlmICghbGFzdFllYXIpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICByZXR1cm4gc2FtZUNhbGVuZGFyTW9udGgoY2FsLmRhdGUsIHJlZkNhbCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2FtZUNhbGVuZGFyTW9udGggKGxlZnQsIHJpZ2h0KSB7XG4gICAgcmV0dXJuIGxlZnQgJiYgcmlnaHQgJiYgbGVmdC55ZWFyKCkgPT09IHJpZ2h0LnllYXIoKSAmJiBsZWZ0Lm1vbnRoKCkgPT09IHJpZ2h0Lm1vbnRoKCk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVUaW1lICgpIHtcbiAgICBpZiAoIW8udGltZSB8fCAhcmVuZGVyZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGV4dCh0aW1lLCByZWYuZm9ybWF0KG8udGltZUZvcm1hdCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZW1pdFZhbHVlcyAoKSB7XG4gICAgYXBpLmVtaXQoJ2RhdGEnLCBnZXREYXRlU3RyaW5nKCkpO1xuICAgIGFwaS5lbWl0KCd5ZWFyJywgcmVmLnllYXIoKSk7XG4gICAgYXBpLmVtaXQoJ21vbnRoJywgcmVmLm1vbnRoKCkpO1xuICAgIGFwaS5lbWl0KCdkYXknLCByZWYuZGF5KCkpO1xuICAgIGFwaS5lbWl0KCd0aW1lJywgcmVmLmZvcm1hdChvLnRpbWVGb3JtYXQpKTtcbiAgICByZXR1cm4gYXBpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVmcmVzaCAoKSB7XG4gICAgbGFzdFllYXIgPSBmYWxzZTtcbiAgICBsYXN0TW9udGggPSBmYWxzZTtcbiAgICBsYXN0RGF5ID0gZmFsc2U7XG4gICAgdXBkYXRlKHRydWUpO1xuICAgIHJldHVybiBhcGk7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRWYWx1ZSAodmFsdWUpIHtcbiAgICB2YXIgZGF0ZSA9IHBhcnNlKHZhbHVlLCBvLmlucHV0Rm9ybWF0KTtcbiAgICBpZiAoZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZWYgPSBpblJhbmdlKGRhdGUpIHx8IHJlZjtcbiAgICByZWZDYWwgPSByZWYuY2xvbmUoKTtcbiAgICB1cGRhdGUodHJ1ZSk7XG5cbiAgICByZXR1cm4gYXBpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3ZlQ2hpbGRyZW4gKGVsZW0sIHNlbGYpIHtcbiAgICB3aGlsZSAoZWxlbSAmJiBlbGVtLmZpcnN0Q2hpbGQpIHtcbiAgICAgIGVsZW0ucmVtb3ZlQ2hpbGQoZWxlbS5maXJzdENoaWxkKTtcbiAgICB9XG4gICAgaWYgKHNlbGYgPT09IHRydWUpIHtcbiAgICAgIGVsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJBbGxEYXlzICgpIHtcbiAgICB2YXIgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgby5tb250aHNJbkNhbGVuZGFyOyBpKyspIHtcbiAgICAgIHJlbmRlckRheXMoaSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyRGF5cyAob2Zmc2V0KSB7XG4gICAgdmFyIG1vbnRoID0gY2FsZW5kYXJNb250aHNbb2Zmc2V0XTtcbiAgICB2YXIgb2Zmc2V0Q2FsID0gcmVmQ2FsLmNsb25lKCkuYWRkKG9mZnNldCwgJ21vbnRocycpO1xuICAgIHZhciB0b3RhbCA9IG9mZnNldENhbC5kYXlzSW5Nb250aCgpO1xuICAgIHZhciBjdXJyZW50ID0gb2Zmc2V0Q2FsLm1vbnRoKCkgIT09IHJlZi5tb250aCgpID8gLTEgOiByZWYuZGF0ZSgpOyAvLyAtMSA6IDEuLjMxXG4gICAgdmFyIGZpcnN0ID0gb2Zmc2V0Q2FsLmNsb25lKCkuZGF0ZSgxKTtcbiAgICB2YXIgZmlyc3REYXkgPSB3ZWVrZGF5KGZpcnN0LmRheSgpLCB0cnVlKTsgLy8gMC4uNlxuICAgIHZhciB0ciA9IGRvbSh7IHR5cGU6ICd0cicsIGNsYXNzTmFtZTogby5zdHlsZXMuZGF5Um93LCBwYXJlbnQ6IG1vbnRoLmJvZHkgfSk7XG4gICAgdmFyIHByZXZNb250aCA9IGhpZGRlbldoZW4ob2Zmc2V0ICE9PSAwLCBbby5zdHlsZXMuZGF5Qm9keUVsZW0sIG8uc3R5bGVzLmRheVByZXZNb250aF0pO1xuICAgIHZhciBuZXh0TW9udGggPSBoaWRkZW5XaGVuKG9mZnNldCAhPT0gby5tb250aHNJbkNhbGVuZGFyIC0gMSwgW28uc3R5bGVzLmRheUJvZHlFbGVtLCBvLnN0eWxlcy5kYXlOZXh0TW9udGhdKTtcbiAgICB2YXIgZGlzYWJsZWQgPSBvLnN0eWxlcy5kYXlEaXNhYmxlZDtcbiAgICB2YXIgbGFzdERheTtcblxuICAgIHBhcnQoe1xuICAgICAgYmFzZTogZmlyc3QuY2xvbmUoKS5zdWJ0cmFjdChmaXJzdERheSwgJ2RheXMnKSxcbiAgICAgIGxlbmd0aDogZmlyc3REYXksXG4gICAgICBjZWxsOiBwcmV2TW9udGhcbiAgICB9KTtcblxuICAgIHBhcnQoe1xuICAgICAgYmFzZTogZmlyc3QuY2xvbmUoKSxcbiAgICAgIGxlbmd0aDogdG90YWwsXG4gICAgICBjZWxsOiBbby5zdHlsZXMuZGF5Qm9keUVsZW1dLFxuICAgICAgc2VsZWN0YWJsZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgbGFzdERheSA9IGZpcnN0LmNsb25lKCkuYWRkKHRvdGFsLCAnZGF5cycpO1xuXG4gICAgcGFydCh7XG4gICAgICBiYXNlOiBsYXN0RGF5LFxuICAgICAgbGVuZ3RoOiB3ZWVrZGF5Q291bnQgLSB0ci5jaGlsZHJlbi5sZW5ndGgsXG4gICAgICBjZWxsOiBuZXh0TW9udGhcbiAgICB9KTtcblxuICAgIGJhY2suZGlzYWJsZWQgPSAhaXNJblJhbmdlTGVmdChmaXJzdCwgdHJ1ZSk7XG4gICAgbmV4dC5kaXNhYmxlZCA9ICFpc0luUmFuZ2VSaWdodChsYXN0RGF5LCB0cnVlKTtcbiAgICBtb250aC5kYXRlID0gb2Zmc2V0Q2FsLmNsb25lKCk7XG5cbiAgICBmdW5jdGlvbiBwYXJ0IChkYXRhKSB7XG4gICAgICB2YXIgaSwgZGF5LCBub2RlO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRyLmNoaWxkcmVuLmxlbmd0aCA9PT0gd2Vla2RheUNvdW50KSB7XG4gICAgICAgICAgdHIgPSBkb20oeyB0eXBlOiAndHInLCBjbGFzc05hbWU6IG8uc3R5bGVzLmRheVJvdywgcGFyZW50OiBtb250aC5ib2R5IH0pO1xuICAgICAgICB9XG4gICAgICAgIGRheSA9IGRhdGEuYmFzZS5jbG9uZSgpLmFkZChpLCAnZGF5cycpO1xuICAgICAgICBub2RlID0gZG9tKHtcbiAgICAgICAgICB0eXBlOiAndGQnLFxuICAgICAgICAgIHBhcmVudDogdHIsXG4gICAgICAgICAgdGV4dDogZGF5LmZvcm1hdChvLmRheUZvcm1hdCksXG4gICAgICAgICAgY2xhc3NOYW1lOiB2YWxpZGF0aW9uVGVzdChkYXksIGRhdGEuY2VsbC5qb2luKCcgJykuc3BsaXQoJyAnKSkuam9pbignICcpXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZGF0YS5zZWxlY3RhYmxlICYmIGRheS5kYXRlKCkgPT09IGN1cnJlbnQpIHtcbiAgICAgICAgICBzZWxlY3REYXlFbGVtZW50KG5vZGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGlvblRlc3QgKGRheSwgY2VsbCkge1xuICAgICAgaWYgKCFpc0luUmFuZ2UoZGF5LCB0cnVlLCBvLmRhdGVWYWxpZGF0b3IpKSB7IGNlbGwucHVzaChkaXNhYmxlZCk7IH1cbiAgICAgIHJldHVybiBjZWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhpZGRlbldoZW4gKHZhbHVlLCBjZWxsKSB7XG4gICAgICBpZiAodmFsdWUpIHsgY2VsbC5wdXNoKG8uc3R5bGVzLmRheUNvbmNlYWxlZCk7IH1cbiAgICAgIHJldHVybiBjZWxsO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGlzSW5SYW5nZSAoZGF0ZSwgYWxsZGF5LCB2YWxpZGF0b3IpIHtcbiAgICBpZiAoIWlzSW5SYW5nZUxlZnQoZGF0ZSwgYWxsZGF5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWlzSW5SYW5nZVJpZ2h0KGRhdGUsIGFsbGRheSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIHZhbGlkID0gKHZhbGlkYXRvciB8fCBGdW5jdGlvbi5wcm90b3R5cGUpLmNhbGwoYXBpLCBkYXRlLnRvRGF0ZSgpKTtcbiAgICByZXR1cm4gdmFsaWQgIT09IGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNJblJhbmdlTGVmdCAoZGF0ZSwgYWxsZGF5KSB7XG4gICAgdmFyIG1pbiA9ICFvLm1pbiA/IGZhbHNlIDogKGFsbGRheSA/IG8ubWluLmNsb25lKCkuc3RhcnRPZignZGF5JykgOiBvLm1pbik7XG4gICAgcmV0dXJuICFtaW4gfHwgIWRhdGUuaXNCZWZvcmUobWluKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzSW5SYW5nZVJpZ2h0IChkYXRlLCBhbGxkYXkpIHtcbiAgICB2YXIgbWF4ID0gIW8ubWF4ID8gZmFsc2UgOiAoYWxsZGF5ID8gby5tYXguY2xvbmUoKS5lbmRPZignZGF5JykgOiBvLm1heCk7XG4gICAgcmV0dXJuICFtYXggfHwgIWRhdGUuaXNBZnRlcihtYXgpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5SYW5nZSAoZGF0ZSkge1xuICAgIGlmIChvLm1pbiAmJiBkYXRlLmlzQmVmb3JlKG8ubWluKSkge1xuICAgICAgcmV0dXJuIGluUmFuZ2Uoby5taW4uY2xvbmUoKSk7XG4gICAgfSBlbHNlIGlmIChvLm1heCAmJiBkYXRlLmlzQWZ0ZXIoby5tYXgpKSB7XG4gICAgICByZXR1cm4gaW5SYW5nZShvLm1heC5jbG9uZSgpKTtcbiAgICB9XG4gICAgdmFyIHZhbHVlID0gZGF0ZS5jbG9uZSgpLnN1YnRyYWN0KDEsICdkYXlzJyk7XG4gICAgaWYgKHZhbGlkYXRlVG93YXJkcyh2YWx1ZSwgZGF0ZSwgJ2FkZCcpKSB7XG4gICAgICByZXR1cm4gaW5UaW1lUmFuZ2UodmFsdWUpO1xuICAgIH1cbiAgICB2YWx1ZSA9IGRhdGUuY2xvbmUoKTtcbiAgICBpZiAodmFsaWRhdGVUb3dhcmRzKHZhbHVlLCBkYXRlLCAnc3VidHJhY3QnKSkge1xuICAgICAgcmV0dXJuIGluVGltZVJhbmdlKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpblRpbWVSYW5nZSAodmFsdWUpIHtcbiAgICB2YXIgY29weSA9IHZhbHVlLmNsb25lKCkuc3VidHJhY3Qoby50aW1lSW50ZXJ2YWwsICdzZWNvbmRzJyk7XG4gICAgdmFyIHRpbWVzID0gTWF0aC5jZWlsKHNlY29uZHNJbkRheSAvIG8udGltZUludGVydmFsKTtcbiAgICB2YXIgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGltZXM7IGkrKykge1xuICAgICAgY29weS5hZGQoby50aW1lSW50ZXJ2YWwsICdzZWNvbmRzJyk7XG4gICAgICBpZiAoY29weS5kYXRlKCkgPiB2YWx1ZS5kYXRlKCkpIHtcbiAgICAgICAgY29weS5zdWJ0cmFjdCgxLCAnZGF5cycpO1xuICAgICAgfVxuICAgICAgaWYgKG8udGltZVZhbGlkYXRvci5jYWxsKGFwaSwgY29weS50b0RhdGUoKSkgIT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBjb3B5O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHZhbGlkYXRlVG93YXJkcyAodmFsdWUsIGRhdGUsIG9wKSB7XG4gICAgdmFyIHZhbGlkID0gZmFsc2U7XG4gICAgd2hpbGUgKHZhbGlkID09PSBmYWxzZSkge1xuICAgICAgdmFsdWVbb3BdKDEsICdkYXlzJyk7XG4gICAgICBpZiAodmFsdWUubW9udGgoKSAhPT0gZGF0ZS5tb250aCgpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdmFsaWQgPSBvLmRhdGVWYWxpZGF0b3IuY2FsbChhcGksIHZhbHVlLnRvRGF0ZSgpKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkICE9PSBmYWxzZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBpY2tEYXkgKGUpIHtcbiAgICB2YXIgdGFyZ2V0ID0gZS50YXJnZXQ7XG4gICAgaWYgKGNsYXNzZXMuY29udGFpbnModGFyZ2V0LCBvLnN0eWxlcy5kYXlEaXNhYmxlZCkgfHwgIWNsYXNzZXMuY29udGFpbnModGFyZ2V0LCBvLnN0eWxlcy5kYXlCb2R5RWxlbSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGRheSA9IHBhcnNlSW50KHRleHQodGFyZ2V0KSwgMTApO1xuICAgIHZhciBwcmV2ID0gY2xhc3Nlcy5jb250YWlucyh0YXJnZXQsIG8uc3R5bGVzLmRheVByZXZNb250aCk7XG4gICAgdmFyIG5leHQgPSBjbGFzc2VzLmNvbnRhaW5zKHRhcmdldCwgby5zdHlsZXMuZGF5TmV4dE1vbnRoKTtcbiAgICB2YXIgb2Zmc2V0ID0gZ2V0TW9udGhPZmZzZXQodGFyZ2V0KSAtIGdldE1vbnRoT2Zmc2V0KGxhc3REYXlFbGVtZW50KTtcbiAgICByZWYuYWRkKG9mZnNldCwgJ21vbnRocycpO1xuICAgIGlmIChwcmV2IHx8IG5leHQpIHtcbiAgICAgIHJlZi5hZGQocHJldiA/IC0xIDogMSwgJ21vbnRocycpO1xuICAgIH1cbiAgICBzZWxlY3REYXlFbGVtZW50KHRhcmdldCk7XG4gICAgcmVmLmRhdGUoZGF5KTsgLy8gbXVzdCBydW4gYWZ0ZXIgc2V0dGluZyB0aGUgbW9udGhcbiAgICBzZXRUaW1lKHJlZiwgaW5SYW5nZShyZWYpIHx8IHJlZik7XG4gICAgcmVmQ2FsID0gcmVmLmNsb25lKCk7XG4gICAgaWYgKG8uYXV0b0Nsb3NlID09PSB0cnVlKSB7IGhpZGVDb25kaXRpb25hbGx5KCk7IH1cbiAgICB1cGRhdGUoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNlbGVjdERheUVsZW1lbnQgKG5vZGUpIHtcbiAgICBpZiAobGFzdERheUVsZW1lbnQpIHtcbiAgICAgIGNsYXNzZXMucmVtb3ZlKGxhc3REYXlFbGVtZW50LCBvLnN0eWxlcy5zZWxlY3RlZERheSk7XG4gICAgfVxuICAgIGlmIChub2RlKSB7XG4gICAgICBjbGFzc2VzLmFkZChub2RlLCBvLnN0eWxlcy5zZWxlY3RlZERheSk7XG4gICAgfVxuICAgIGxhc3REYXlFbGVtZW50ID0gbm9kZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE1vbnRoT2Zmc2V0IChlbGVtKSB7XG4gICAgdmFyIG9mZnNldDtcbiAgICB3aGlsZSAoZWxlbSAmJiBlbGVtLmdldEF0dHJpYnV0ZSkge1xuICAgICAgb2Zmc2V0ID0gZWxlbS5nZXRBdHRyaWJ1dGUobW9udGhPZmZzZXRBdHRyaWJ1dGUpO1xuICAgICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUludChvZmZzZXQsIDEwKTtcbiAgICAgIH1cbiAgICAgIGVsZW0gPSBlbGVtLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0VGltZSAodG8sIGZyb20pIHtcbiAgICB0by5ob3VyKGZyb20uaG91cigpKS5taW51dGUoZnJvbS5taW51dGUoKSkuc2Vjb25kKGZyb20uc2Vjb25kKCkpO1xuICAgIHJldHVybiB0bztcbiAgfVxuXG4gIGZ1bmN0aW9uIHBpY2tUaW1lIChlKSB7XG4gICAgdmFyIHRhcmdldCA9IGUudGFyZ2V0O1xuICAgIGlmICghY2xhc3Nlcy5jb250YWlucyh0YXJnZXQsIG8uc3R5bGVzLnRpbWVPcHRpb24pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB2YWx1ZSA9IG1vbWVudHVtLm1vbWVudCh0ZXh0KHRhcmdldCksIG8udGltZUZvcm1hdCk7XG4gICAgc2V0VGltZShyZWYsIHZhbHVlKTtcbiAgICByZWZDYWwgPSByZWYuY2xvbmUoKTtcbiAgICBlbWl0VmFsdWVzKCk7XG4gICAgdXBkYXRlVGltZSgpO1xuICAgIGlmICgoIW8uZGF0ZSAmJiBvLmF1dG9DbG9zZSA9PT0gdHJ1ZSkgfHwgby5hdXRvQ2xvc2UgPT09ICd0aW1lJykge1xuICAgICAgaGlkZUNvbmRpdGlvbmFsbHkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGlkZVRpbWVMaXN0KCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RGF0ZSAoKSB7XG4gICAgcmV0dXJuIHJlZi50b0RhdGUoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldERhdGVTdHJpbmcgKGZvcm1hdCkge1xuICAgIHJldHVybiByZWYuZm9ybWF0KGZvcm1hdCB8fCBvLmlucHV0Rm9ybWF0KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE1vbWVudCAoKSB7XG4gICAgcmV0dXJuIHJlZi5jbG9uZSgpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2FsZW5kYXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB0cmltID0gL15cXHMrfFxccyskL2c7XG52YXIgd2hpdGVzcGFjZSA9IC9cXHMrLztcblxuZnVuY3Rpb24gY2xhc3NlcyAobm9kZSkge1xuICByZXR1cm4gbm9kZS5jbGFzc05hbWUucmVwbGFjZSh0cmltLCAnJykuc3BsaXQod2hpdGVzcGFjZSk7XG59XG5cbmZ1bmN0aW9uIHNldCAobm9kZSwgdmFsdWUpIHtcbiAgbm9kZS5jbGFzc05hbWUgPSB2YWx1ZS5qb2luKCcgJyk7XG59XG5cbmZ1bmN0aW9uIGFkZCAobm9kZSwgdmFsdWUpIHtcbiAgdmFyIHZhbHVlcyA9IHJlbW92ZShub2RlLCB2YWx1ZSk7XG4gIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgc2V0KG5vZGUsIHZhbHVlcyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZSAobm9kZSwgdmFsdWUpIHtcbiAgdmFyIHZhbHVlcyA9IGNsYXNzZXMobm9kZSk7XG4gIHZhciBpID0gdmFsdWVzLmluZGV4T2YodmFsdWUpO1xuICBpZiAoaSAhPT0gLTEpIHtcbiAgICB2YWx1ZXMuc3BsaWNlKGksIDEpO1xuICAgIHNldChub2RlLCB2YWx1ZXMpO1xuICB9XG4gIHJldHVybiB2YWx1ZXM7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zIChub2RlLCB2YWx1ZSkge1xuICByZXR1cm4gY2xhc3Nlcyhub2RlKS5pbmRleE9mKHZhbHVlKSAhPT0gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhZGQ6IGFkZCxcbiAgcmVtb3ZlOiByZW1vdmUsXG4gIGNvbnRhaW5zOiBjb250YWluc1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1vbWVudHVtID0gcmVxdWlyZSgnLi9tb21lbnR1bScpO1xuXG4vLyBuYcOvdmUgaW1wbGVtZW50YXRpb24sIHNwZWNpZmljYWxseSBtZWFudCB0byBjbG9uZSBgb3B0aW9uc2Agb2JqZWN0c1xuZnVuY3Rpb24gY2xvbmUgKHRoaW5nKSB7XG4gIHZhciBjb3B5ID0ge307XG4gIHZhciB2YWx1ZTtcblxuICBmb3IgKHZhciBrZXkgaW4gdGhpbmcpIHtcbiAgICB2YWx1ZSA9IHRoaW5nW2tleV07XG5cbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICBjb3B5W2tleV0gPSB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKG1vbWVudHVtLmlzTW9tZW50KHZhbHVlKSkge1xuICAgICAgY29weVtrZXldID0gdmFsdWUuY2xvbmUoKTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlLl9pc1N0eWxlc0NvbmZpZ3VyYXRpb24pIHtcbiAgICAgIGNvcHlba2V5XSA9IGNsb25lKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29weVtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvcHk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmU7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpbmRleCA9IHJlcXVpcmUoJy4vaW5kZXgnKTtcbnZhciBpbnB1dCA9IHJlcXVpcmUoJy4vaW5wdXQnKTtcbnZhciBpbmxpbmUgPSByZXF1aXJlKCcuL2lubGluZScpO1xudmFyIGlzSW5wdXQgPSByZXF1aXJlKCcuL2lzSW5wdXQnKTtcblxuZnVuY3Rpb24gY29yZSAoZWxlbSwgb3B0aW9ucykge1xuICB2YXIgY2FsO1xuICB2YXIgZXhpc3RpbmcgPSBpbmRleC5maW5kKGVsZW0pO1xuICBpZiAoZXhpc3RpbmcpIHtcbiAgICByZXR1cm4gZXhpc3Rpbmc7XG4gIH1cblxuICBpZiAoaXNJbnB1dChlbGVtKSkge1xuICAgIGNhbCA9IGlucHV0KGVsZW0sIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIGNhbCA9IGlubGluZShlbGVtLCBvcHRpb25zKTtcbiAgfVxuICBpbmRleC5hc3NpZ24oZWxlbSwgY2FsKTtcblxuICByZXR1cm4gY2FsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcmU7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKTtcbnZhciBpc0lucHV0ID0gcmVxdWlyZSgnLi9pc0lucHV0Jyk7XG52YXIgbW9tZW50dW0gPSByZXF1aXJlKCcuL21vbWVudHVtJyk7XG5cbmZ1bmN0aW9uIGRlZmF1bHRzIChvcHRpb25zLCBjYWwpIHtcbiAgdmFyIHRlbXA7XG4gIHZhciBubztcbiAgdmFyIG8gPSBvcHRpb25zIHx8IHt9O1xuICBpZiAoby5hdXRvSGlkZU9uQ2xpY2sgPT09IG5vKSB7IG8uYXV0b0hpZGVPbkNsaWNrID0gdHJ1ZTsgfVxuICBpZiAoby5hdXRvSGlkZU9uQmx1ciA9PT0gbm8pIHsgby5hdXRvSGlkZU9uQmx1ciA9IHRydWU7IH1cbiAgaWYgKG8uYXV0b0Nsb3NlID09PSBubykgeyBvLmF1dG9DbG9zZSA9IHRydWU7IH1cbiAgaWYgKG8uYXBwZW5kVG8gPT09IG5vKSB7IG8uYXBwZW5kVG8gPSBkb2N1bWVudC5ib2R5OyB9XG4gIGlmIChvLmFwcGVuZFRvID09PSAncGFyZW50Jykge1xuICAgIGlmIChpc0lucHV0KGNhbC5hc3NvY2lhdGVkKSkge1xuICAgICAgby5hcHBlbmRUbyA9IGNhbC5hc3NvY2lhdGVkLnBhcmVudE5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW5saW5lIGNhbGVuZGFycyBtdXN0IGJlIGFwcGVuZGVkIHRvIGEgcGFyZW50IG5vZGUgZXhwbGljaXRseS4nKTtcbiAgICB9XG4gIH1cbiAgaWYgKG8uaW52YWxpZGF0ZSA9PT0gbm8pIHsgby5pbnZhbGlkYXRlID0gdHJ1ZTsgfVxuICBpZiAoby5yZXF1aXJlZCA9PT0gbm8pIHsgby5yZXF1aXJlZCA9IGZhbHNlOyB9XG4gIGlmIChvLmRhdGUgPT09IG5vKSB7IG8uZGF0ZSA9IHRydWU7IH1cbiAgaWYgKG8udGltZSA9PT0gbm8pIHsgby50aW1lID0gdHJ1ZTsgfVxuICBpZiAoby5kYXRlID09PSBmYWxzZSAmJiBvLnRpbWUgPT09IGZhbHNlKSB7IHRocm93IG5ldyBFcnJvcignQXQgbGVhc3Qgb25lIG9mIGBkYXRlYCBvciBgdGltZWAgbXVzdCBiZSBgdHJ1ZWAuJyk7IH1cbiAgaWYgKG8uaW5wdXRGb3JtYXQgPT09IG5vKSB7XG4gICAgaWYgKG8uZGF0ZSAmJiBvLnRpbWUpIHtcbiAgICAgIG8uaW5wdXRGb3JtYXQgPSAnWVlZWS1NTS1ERCBISDptbSc7XG4gICAgfSBlbHNlIGlmIChvLmRhdGUpIHtcbiAgICAgIG8uaW5wdXRGb3JtYXQgPSAnWVlZWS1NTS1ERCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG8uaW5wdXRGb3JtYXQgPSAnSEg6bW0nO1xuICAgIH1cbiAgfVxuICBpZiAoby5pbml0aWFsVmFsdWUgPT09IG5vKSB7XG4gICAgby5pbml0aWFsVmFsdWUgPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIG8uaW5pdGlhbFZhbHVlID0gcGFyc2Uoby5pbml0aWFsVmFsdWUsIG8uaW5wdXRGb3JtYXQpO1xuICB9XG4gIGlmIChvLm1pbiA9PT0gbm8pIHsgby5taW4gPSBudWxsOyB9IGVsc2UgeyBvLm1pbiA9IHBhcnNlKG8ubWluLCBvLmlucHV0Rm9ybWF0KTsgfVxuICBpZiAoby5tYXggPT09IG5vKSB7IG8ubWF4ID0gbnVsbDsgfSBlbHNlIHsgby5tYXggPSBwYXJzZShvLm1heCwgby5pbnB1dEZvcm1hdCk7IH1cbiAgaWYgKG8udGltZUludGVydmFsID09PSBubykgeyBvLnRpbWVJbnRlcnZhbCA9IDYwICogMzA7IH0gLy8gMzAgbWludXRlcyBieSBkZWZhdWx0XG4gIGlmIChvLm1pbiAmJiBvLm1heCkge1xuICAgIGlmIChvLm1heC5pc0JlZm9yZShvLm1pbikpIHtcbiAgICAgIHRlbXAgPSBvLm1heDtcbiAgICAgIG8ubWF4ID0gby5taW47XG4gICAgICBvLm1pbiA9IHRlbXA7XG4gICAgfVxuICAgIGlmIChvLmRhdGUgPT09IHRydWUpIHtcbiAgICAgIGlmIChvLm1heC5jbG9uZSgpLnN1YnRyYWN0KDEsICdkYXlzJykuaXNCZWZvcmUoby5taW4pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYG1heGAgbXVzdCBiZSBhdCBsZWFzdCBvbmUgZGF5IGFmdGVyIGBtaW5gJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvLnRpbWVJbnRlcnZhbCAqIDEwMDAgLSBvLm1pbiAlIChvLnRpbWVJbnRlcnZhbCAqIDEwMDApID4gby5tYXggLSBvLm1pbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdgbWluYCB0byBgbWF4YCByYW5nZSBtdXN0IGFsbG93IGZvciBhdCBsZWFzdCBvbmUgdGltZSBvcHRpb24gdGhhdCBtYXRjaGVzIGB0aW1lSW50ZXJ2YWxgJyk7XG4gICAgfVxuICB9XG4gIGlmIChvLmRhdGVWYWxpZGF0b3IgPT09IG5vKSB7IG8uZGF0ZVZhbGlkYXRvciA9IEZ1bmN0aW9uLnByb3RvdHlwZTsgfVxuICBpZiAoby50aW1lVmFsaWRhdG9yID09PSBubykgeyBvLnRpbWVWYWxpZGF0b3IgPSBGdW5jdGlvbi5wcm90b3R5cGU7IH1cbiAgaWYgKG8udGltZUZvcm1hdCA9PT0gbm8pIHsgby50aW1lRm9ybWF0ID0gJ0hIOm1tJzsgfVxuICBpZiAoby53ZWVrU3RhcnQgPT09IG5vKSB7IG8ud2Vla1N0YXJ0ID0gbW9tZW50dW0ubW9tZW50KCkud2Vla2RheSgwKS5kYXkoKTsgfVxuICBpZiAoby53ZWVrZGF5Rm9ybWF0ID09PSBubykgeyBvLndlZWtkYXlGb3JtYXQgPSAnbWluJzsgfVxuICBpZiAoby53ZWVrZGF5Rm9ybWF0ID09PSAnbG9uZycpIHtcbiAgICBvLndlZWtkYXlGb3JtYXQgPSBtb21lbnR1bS5tb21lbnQud2Vla2RheXMoKTtcbiAgfSBlbHNlIGlmIChvLndlZWtkYXlGb3JtYXQgPT09ICdzaG9ydCcpIHtcbiAgICBvLndlZWtkYXlGb3JtYXQgPSBtb21lbnR1bS5tb21lbnQud2Vla2RheXNTaG9ydCgpO1xuICB9IGVsc2UgaWYgKG8ud2Vla2RheUZvcm1hdCA9PT0gJ21pbicpIHtcbiAgICBvLndlZWtkYXlGb3JtYXQgPSBtb21lbnR1bS5tb21lbnQud2Vla2RheXNNaW4oKTtcbiAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShvLndlZWtkYXlGb3JtYXQpIHx8IG8ud2Vla2RheUZvcm1hdC5sZW5ndGggPCA3KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdgd2Vla2RheXNgIG11c3QgYmUgYG1pbmAsIGBzaG9ydGAsIG9yIGBsb25nYCcpO1xuICB9XG4gIGlmIChvLm1vbnRoc0luQ2FsZW5kYXIgPT09IG5vKSB7IG8ubW9udGhzSW5DYWxlbmRhciA9IDE7IH1cbiAgaWYgKG8ubW9udGhGb3JtYXQgPT09IG5vKSB7IG8ubW9udGhGb3JtYXQgPSAnTU1NTSBZWVlZJzsgfVxuICBpZiAoby5kYXlGb3JtYXQgPT09IG5vKSB7IG8uZGF5Rm9ybWF0ID0gJ0REJzsgfVxuICBpZiAoby5zdHlsZXMgPT09IG5vKSB7IG8uc3R5bGVzID0ge307IH1cblxuICBvLnN0eWxlcy5faXNTdHlsZXNDb25maWd1cmF0aW9uID0gdHJ1ZTtcblxuICB2YXIgc3R5bCA9IG8uc3R5bGVzO1xuICBpZiAoc3R5bC5iYWNrID09PSBubykgeyBzdHlsLmJhY2sgPSAncmQtYmFjayc7IH1cbiAgaWYgKHN0eWwuY29udGFpbmVyID09PSBubykgeyBzdHlsLmNvbnRhaW5lciA9ICdyZC1jb250YWluZXInOyB9XG4gIGlmIChzdHlsLnBvc2l0aW9uZWQgPT09IG5vKSB7IHN0eWwucG9zaXRpb25lZCA9ICdyZC1jb250YWluZXItYXR0YWNobWVudCc7IH1cbiAgaWYgKHN0eWwuZGF0ZSA9PT0gbm8pIHsgc3R5bC5kYXRlID0gJ3JkLWRhdGUnOyB9XG4gIGlmIChzdHlsLmRheUJvZHkgPT09IG5vKSB7IHN0eWwuZGF5Qm9keSA9ICdyZC1kYXlzLWJvZHknOyB9XG4gIGlmIChzdHlsLmRheUJvZHlFbGVtID09PSBubykgeyBzdHlsLmRheUJvZHlFbGVtID0gJ3JkLWRheS1ib2R5JzsgfVxuICBpZiAoc3R5bC5kYXlQcmV2TW9udGggPT09IG5vKSB7IHN0eWwuZGF5UHJldk1vbnRoID0gJ3JkLWRheS1wcmV2LW1vbnRoJzsgfVxuICBpZiAoc3R5bC5kYXlOZXh0TW9udGggPT09IG5vKSB7IHN0eWwuZGF5TmV4dE1vbnRoID0gJ3JkLWRheS1uZXh0LW1vbnRoJzsgfVxuICBpZiAoc3R5bC5kYXlEaXNhYmxlZCA9PT0gbm8pIHsgc3R5bC5kYXlEaXNhYmxlZCA9ICdyZC1kYXktZGlzYWJsZWQnOyB9XG4gIGlmIChzdHlsLmRheUNvbmNlYWxlZCA9PT0gbm8pIHsgc3R5bC5kYXlDb25jZWFsZWQgPSAncmQtZGF5LWNvbmNlYWxlZCc7IH1cbiAgaWYgKHN0eWwuZGF5SGVhZCA9PT0gbm8pIHsgc3R5bC5kYXlIZWFkID0gJ3JkLWRheXMtaGVhZCc7IH1cbiAgaWYgKHN0eWwuZGF5SGVhZEVsZW0gPT09IG5vKSB7IHN0eWwuZGF5SGVhZEVsZW0gPSAncmQtZGF5LWhlYWQnOyB9XG4gIGlmIChzdHlsLmRheVJvdyA9PT0gbm8pIHsgc3R5bC5kYXlSb3cgPSAncmQtZGF5cy1yb3cnOyB9XG4gIGlmIChzdHlsLmRheVRhYmxlID09PSBubykgeyBzdHlsLmRheVRhYmxlID0gJ3JkLWRheXMnOyB9XG4gIGlmIChzdHlsLm1vbnRoID09PSBubykgeyBzdHlsLm1vbnRoID0gJ3JkLW1vbnRoJzsgfVxuICBpZiAoc3R5bC5tb250aExhYmVsID09PSBubykgeyBzdHlsLm1vbnRoTGFiZWwgPSAncmQtbW9udGgtbGFiZWwnOyB9XG4gIGlmIChzdHlsLm5leHQgPT09IG5vKSB7IHN0eWwubmV4dCA9ICdyZC1uZXh0JzsgfVxuICBpZiAoc3R5bC5zZWxlY3RlZERheSA9PT0gbm8pIHsgc3R5bC5zZWxlY3RlZERheSA9ICdyZC1kYXktc2VsZWN0ZWQnOyB9XG4gIGlmIChzdHlsLnNlbGVjdGVkVGltZSA9PT0gbm8pIHsgc3R5bC5zZWxlY3RlZFRpbWUgPSAncmQtdGltZS1zZWxlY3RlZCc7IH1cbiAgaWYgKHN0eWwudGltZSA9PT0gbm8pIHsgc3R5bC50aW1lID0gJ3JkLXRpbWUnOyB9XG4gIGlmIChzdHlsLnRpbWVMaXN0ID09PSBubykgeyBzdHlsLnRpbWVMaXN0ID0gJ3JkLXRpbWUtbGlzdCc7IH1cbiAgaWYgKHN0eWwudGltZU9wdGlvbiA9PT0gbm8pIHsgc3R5bC50aW1lT3B0aW9uID0gJ3JkLXRpbWUtb3B0aW9uJzsgfVxuXG4gIHJldHVybiBvO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmF1bHRzO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBkb20gKG9wdGlvbnMpIHtcbiAgdmFyIG8gPSBvcHRpb25zIHx8IHt9O1xuICBpZiAoIW8udHlwZSkgeyBvLnR5cGUgPSAnZGl2JzsgfVxuICB2YXIgZWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoby50eXBlKTtcbiAgaWYgKG8uY2xhc3NOYW1lKSB7IGVsZW0uY2xhc3NOYW1lID0gby5jbGFzc05hbWU7IH1cbiAgaWYgKG8udGV4dCkgeyBlbGVtLmlubmVyVGV4dCA9IGVsZW0udGV4dENvbnRlbnQgPSBvLnRleHQ7IH1cbiAgaWYgKG8uYXR0cmlidXRlcykge1xuICAgIE9iamVjdC5rZXlzKG8uYXR0cmlidXRlcykuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgIGVsZW0uc2V0QXR0cmlidXRlKGtleSwgby5hdHRyaWJ1dGVzW2tleV0pO1xuICAgIH0pO1xuICB9XG4gIGlmIChvLnBhcmVudCkgeyBvLnBhcmVudC5hcHBlbmRDaGlsZChlbGVtKTsgfVxuICByZXR1cm4gZWxlbTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkb207XG4iLCIndXNlIHN0cmljdCc7XG52YXIgbm87XG52YXIgaWtleSA9ICdkYXRhLXJvbWUtaWQnO1xudmFyIGluZGV4ID0gW107XG5cbmZ1bmN0aW9uIGZpbmQgKHRoaW5nKSB7IC8vIGNhbiBiZSBhIERPTSBlbGVtZW50IG9yIGEgbnVtYmVyXG4gIGlmICh0eXBlb2YgdGhpbmcgIT09ICdudW1iZXInICYmIHRoaW5nICYmIHRoaW5nLmdldEF0dHJpYnV0ZSkge1xuICAgIHJldHVybiBmaW5kKHRoaW5nLmdldEF0dHJpYnV0ZShpa2V5KSk7XG4gIH1cbiAgdmFyIGV4aXN0aW5nID0gaW5kZXhbdGhpbmddO1xuICBpZiAoZXhpc3RpbmcgIT09IG5vKSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBhc3NpZ24gKGVsZW0sIGluc3RhbmNlKSB7XG4gIGVsZW0uc2V0QXR0cmlidXRlKGlrZXksIGluc3RhbmNlLmlkID0gaW5kZXgucHVzaChpbnN0YW5jZSkgLSAxKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGZpbmQ6IGZpbmQsXG4gIGFzc2lnbjogYXNzaWduXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2FsZW5kYXIgPSByZXF1aXJlKCcuL2NhbGVuZGFyJyk7XG5cbmZ1bmN0aW9uIGlubGluZSAoZWxlbSwgY2FsZW5kYXJPcHRpb25zKSB7XG4gIHZhciBvID0gY2FsZW5kYXJPcHRpb25zIHx8IHt9O1xuXG4gIG8uYXBwZW5kVG8gPSBlbGVtO1xuICBvLmFzc29jaWF0ZWQgPSBlbGVtO1xuXG4gIHZhciBjYWwgPSBjYWxlbmRhcihvKTtcbiAgY2FsLnNob3coKTtcbiAgcmV0dXJuIGNhbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpbmxpbmU7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjcm9zc3ZlbnQgPSByZXF1aXJlKCdjcm9zc3ZlbnQnKTtcbnZhciBidWxsc2V5ZSA9IHJlcXVpcmUoJ2J1bGxzZXllJyk7XG52YXIgdGhyb3R0bGUgPSByZXF1aXJlKCcuL3Rocm90dGxlJyk7XG52YXIgY2xvbmUgPSByZXF1aXJlKCcuL2Nsb25lJyk7XG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKCcuL2RlZmF1bHRzJyk7XG52YXIgY2FsZW5kYXIgPSByZXF1aXJlKCcuL2NhbGVuZGFyJyk7XG52YXIgbW9tZW50dW0gPSByZXF1aXJlKCcuL21vbWVudHVtJyk7XG52YXIgY2xhc3NlcyA9IHJlcXVpcmUoJy4vY2xhc3NlcycpO1xuXG5mdW5jdGlvbiBpbnB1dENhbGVuZGFyIChpbnB1dCwgY2FsZW5kYXJPcHRpb25zKSB7XG4gIHZhciBvID0gY2FsZW5kYXJPcHRpb25zIHx8IHt9O1xuXG4gIG8uYXNzb2NpYXRlZCA9IGlucHV0O1xuXG4gIHZhciBhcGkgPSBjYWxlbmRhcihvKTtcbiAgdmFyIHRocm90dGxlZFRha2VJbnB1dCA9IHRocm90dGxlKHRha2VJbnB1dCwgMzApO1xuICB2YXIgaWdub3JlSW52YWxpZGF0aW9uO1xuICB2YXIgaWdub3JlU2hvdztcbiAgdmFyIGV5ZTtcblxuICBpbml0KG8pO1xuXG4gIHJldHVybiBhcGk7XG5cbiAgZnVuY3Rpb24gaW5pdCAoaW5pdE9wdGlvbnMpIHtcbiAgICBvID0gZGVmYXVsdHMoaW5pdE9wdGlvbnMgfHwgbywgYXBpKTtcblxuICAgIGNsYXNzZXMuYWRkKGFwaS5jb250YWluZXIsIG8uc3R5bGVzLnBvc2l0aW9uZWQpO1xuICAgIGNyb3NzdmVudC5hZGQoYXBpLmNvbnRhaW5lciwgJ21vdXNlZG93bicsIGNvbnRhaW5lck1vdXNlRG93bik7XG4gICAgY3Jvc3N2ZW50LmFkZChhcGkuY29udGFpbmVyLCAnY2xpY2snLCBjb250YWluZXJDbGljayk7XG5cbiAgICBhcGkuZ2V0RGF0ZSA9IHVucmVxdWlyZShhcGkuZ2V0RGF0ZSk7XG4gICAgYXBpLmdldERhdGVTdHJpbmcgPSB1bnJlcXVpcmUoYXBpLmdldERhdGVTdHJpbmcpO1xuICAgIGFwaS5nZXRNb21lbnQgPSB1bnJlcXVpcmUoYXBpLmdldE1vbWVudCk7XG5cbiAgICBpZiAoby5pbml0aWFsVmFsdWUpIHtcbiAgICAgIGlucHV0LnZhbHVlID0gby5pbml0aWFsVmFsdWUuZm9ybWF0KG8uaW5wdXRGb3JtYXQpO1xuICAgIH1cblxuICAgIGV5ZSA9IGJ1bGxzZXllKGFwaS5jb250YWluZXIsIGlucHV0KTtcbiAgICBhcGkub24oJ2RhdGEnLCB1cGRhdGVJbnB1dCk7XG4gICAgYXBpLm9uKCdzaG93JywgZXllLnJlZnJlc2gpO1xuXG4gICAgZXZlbnRMaXN0ZW5pbmcoKTtcbiAgICB0aHJvdHRsZWRUYWtlSW5wdXQoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlc3Ryb3kgKCkge1xuICAgIGV2ZW50TGlzdGVuaW5nKHRydWUpO1xuICAgIGV5ZS5kZXN0cm95KCk7XG4gICAgZXllID0gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGV2ZW50TGlzdGVuaW5nIChyZW1vdmUpIHtcbiAgICB2YXIgb3AgPSByZW1vdmUgPyAncmVtb3ZlJyA6ICdhZGQnO1xuICAgIGNyb3NzdmVudFtvcF0oaW5wdXQsICdjbGljaycsIHNob3cpO1xuICAgIGNyb3NzdmVudFtvcF0oaW5wdXQsICd0b3VjaGVuZCcsIHNob3cpO1xuICAgIGNyb3NzdmVudFtvcF0oaW5wdXQsICdmb2N1c2luJywgc2hvdyk7XG4gICAgY3Jvc3N2ZW50W29wXShpbnB1dCwgJ2NoYW5nZScsIHRocm90dGxlZFRha2VJbnB1dCk7XG4gICAgY3Jvc3N2ZW50W29wXShpbnB1dCwgJ2tleXByZXNzJywgdGhyb3R0bGVkVGFrZUlucHV0KTtcbiAgICBjcm9zc3ZlbnRbb3BdKGlucHV0LCAna2V5ZG93bicsIHRocm90dGxlZFRha2VJbnB1dCk7XG4gICAgY3Jvc3N2ZW50W29wXShpbnB1dCwgJ2lucHV0JywgdGhyb3R0bGVkVGFrZUlucHV0KTtcbiAgICBpZiAoby5pbnZhbGlkYXRlKSB7IGNyb3NzdmVudFtvcF0oaW5wdXQsICdibHVyJywgaW52YWxpZGF0ZUlucHV0KTsgfVxuXG4gICAgaWYgKHJlbW92ZSkge1xuICAgICAgYXBpLm9uY2UoJ3JlYWR5JywgaW5pdCk7XG4gICAgICBhcGkub2ZmKCdkZXN0cm95ZWQnLCBkZXN0cm95KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBpLm9mZigncmVhZHknLCBpbml0KTtcbiAgICAgIGFwaS5vbmNlKCdkZXN0cm95ZWQnLCBkZXN0cm95KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjb250YWluZXJDbGljayAoKSB7XG4gICAgaWdub3JlU2hvdyA9IHRydWU7XG4gICAgaW5wdXQuZm9jdXMoKTtcbiAgICBpZ25vcmVTaG93ID0gZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiBjb250YWluZXJNb3VzZURvd24gKCkge1xuICAgIGlnbm9yZUludmFsaWRhdGlvbiA9IHRydWU7XG4gICAgc2V0VGltZW91dCh1bmlnbm9yZSwgMCk7XG5cbiAgICBmdW5jdGlvbiB1bmlnbm9yZSAoKSB7XG4gICAgICBpZ25vcmVJbnZhbGlkYXRpb24gPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbnZhbGlkYXRlSW5wdXQgKCkge1xuICAgIGlmICghaWdub3JlSW52YWxpZGF0aW9uICYmICFpc0VtcHR5KCkpIHtcbiAgICAgIGFwaS5lbWl0VmFsdWVzKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2hvdyAoKSB7XG4gICAgaWYgKGlnbm9yZVNob3cpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXBpLnNob3coKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRha2VJbnB1dCAoKSB7XG4gICAgdmFyIHZhbHVlID0gaW5wdXQudmFsdWUudHJpbSgpO1xuICAgIGlmIChpc0VtcHR5KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGRhdGUgPSBtb21lbnR1bS5tb21lbnQodmFsdWUsIG8uaW5wdXRGb3JtYXQsIG8uc3RyaWN0UGFyc2UpO1xuICAgIGFwaS5zZXRWYWx1ZShkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUlucHV0IChkYXRhKSB7XG4gICAgaW5wdXQudmFsdWUgPSBkYXRhO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNFbXB0eSAoKSB7XG4gICAgcmV0dXJuIG8ucmVxdWlyZWQgPT09IGZhbHNlICYmIGlucHV0LnZhbHVlLnRyaW0oKSA9PT0gJyc7XG4gIH1cblxuICBmdW5jdGlvbiB1bnJlcXVpcmUgKGZuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIG1heWJlICgpIHtcbiAgICAgIHJldHVybiBpc0VtcHR5KCkgPyBudWxsIDogZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5wdXRDYWxlbmRhcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gaXNJbnB1dCAoZWxlbSkge1xuICByZXR1cm4gZWxlbSAmJiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0Jztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0lucHV0O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBpc01vbWVudCAodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ19pc0FNb21lbnRPYmplY3QnKTtcbn1cblxudmFyIGFwaSA9IHtcbiAgbW9tZW50OiBudWxsLFxuICBpc01vbWVudDogaXNNb21lbnRcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gYXBpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBub29wICgpIHt9XG5cbm1vZHVsZS5leHBvcnRzID0gbm9vcDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1vbWVudHVtID0gcmVxdWlyZSgnLi9tb21lbnR1bScpO1xuXG5mdW5jdGlvbiByYXcgKGRhdGUsIGZvcm1hdCkge1xuICBpZiAodHlwZW9mIGRhdGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG1vbWVudHVtLm1vbWVudChkYXRlLCBmb3JtYXQpO1xuICB9XG4gIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZGF0ZSkgPT09ICdbb2JqZWN0IERhdGVdJykge1xuICAgIHJldHVybiBtb21lbnR1bS5tb21lbnQoZGF0ZSk7XG4gIH1cbiAgaWYgKG1vbWVudHVtLmlzTW9tZW50KGRhdGUpKSB7XG4gICAgcmV0dXJuIGRhdGUuY2xvbmUoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZSAoZGF0ZSwgZm9ybWF0KSB7XG4gIHZhciBtID0gcmF3KGRhdGUsIHR5cGVvZiBmb3JtYXQgPT09ICdzdHJpbmcnID8gZm9ybWF0IDogbnVsbCk7XG4gIHJldHVybiBtICYmIG0uaXNWYWxpZCgpID8gbSA6IG51bGw7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyc2U7XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmICghQXJyYXkucHJvdG90eXBlLmZpbHRlcikge1xuICBBcnJheS5wcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24gKGZuLCBjdHgpIHtcbiAgICB2YXIgZiA9IFtdO1xuICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAodiwgaSwgdCkge1xuICAgICAgaWYgKGZuLmNhbGwoY3R4LCB2LCBpLCB0KSkgeyBmLnB1c2godik7IH1cbiAgICB9LCBjdHgpO1xuICAgIHJldHVybiBmO1xuICB9O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAoIUFycmF5LnByb3RvdHlwZS5mb3JFYWNoKSB7XG4gIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKGZuLCBjdHgpIHtcbiAgICBpZiAodGhpcyA9PT0gdm9pZCAwIHx8IHRoaXMgPT09IG51bGwgfHwgdHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgfVxuICAgIHZhciB0ID0gdGhpcztcbiAgICB2YXIgbGVuID0gdC5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgaWYgKGkgaW4gdCkgeyBmbi5jYWxsKGN0eCwgdFtpXSwgaSwgdCk7IH1cbiAgICB9XG4gIH07XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmICghQXJyYXkucHJvdG90eXBlLmluZGV4T2YpIHtcbiAgQXJyYXkucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiAod2hhdCwgc3RhcnQpIHtcbiAgICBpZiAodGhpcyA9PT0gdW5kZWZpbmVkIHx8IHRoaXMgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICB9XG4gICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoO1xuICAgIHN0YXJ0ID0gK3N0YXJ0IHx8IDA7XG4gICAgaWYgKE1hdGguYWJzKHN0YXJ0KSA9PT0gSW5maW5pdHkpIHtcbiAgICAgIHN0YXJ0ID0gMDtcbiAgICB9IGVsc2UgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgc3RhcnQgKz0gbGVuZ3RoO1xuICAgICAgaWYgKHN0YXJ0IDwgMCkgeyBzdGFydCA9IDA7IH1cbiAgICB9XG4gICAgZm9yICg7IHN0YXJ0IDwgbGVuZ3RoOyBzdGFydCsrKSB7XG4gICAgICBpZiAodGhpc1tzdGFydF0gPT09IHdoYXQpIHtcbiAgICAgICAgcmV0dXJuIHN0YXJ0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH07XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbkFycmF5LmlzQXJyYXkgfHwgKEFycmF5LmlzQXJyYXkgPSBmdW5jdGlvbiAoYSkge1xuICByZXR1cm4gJycgKyBhICE9PSBhICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAoIUFycmF5LnByb3RvdHlwZS5tYXApIHtcbiAgQXJyYXkucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uIChmbiwgY3R4KSB7XG4gICAgdmFyIGNvbnRleHQsIHJlc3VsdCwgaTtcblxuICAgIGlmICh0aGlzID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RoaXMgaXMgbnVsbCBvciBub3QgZGVmaW5lZCcpO1xuICAgIH1cblxuICAgIHZhciBzb3VyY2UgPSBPYmplY3QodGhpcyk7XG4gICAgdmFyIGxlbiA9IHNvdXJjZS5sZW5ndGggPj4+IDA7XG5cbiAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGZuICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xuICAgIH1cblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgY29udGV4dCA9IGN0eDtcbiAgICB9XG5cbiAgICByZXN1bHQgPSBuZXcgQXJyYXkobGVuKTtcbiAgICBpID0gMDtcblxuICAgIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgICBpZiAoaSBpbiBzb3VyY2UpIHtcbiAgICAgICAgcmVzdWx0W2ldID0gZm4uY2FsbChjb250ZXh0LCBzb3VyY2VbaV0sIGksIHNvdXJjZSk7XG4gICAgICB9XG4gICAgICBpKys7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmICghQXJyYXkucHJvdG90eXBlLnNvbWUpIHtcbiAgQXJyYXkucHJvdG90eXBlLnNvbWUgPSBmdW5jdGlvbiAoZm4sIGN0eCkge1xuICAgIHZhciBjb250ZXh0LCBpO1xuXG4gICAgaWYgKHRoaXMgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndGhpcyBpcyBudWxsIG9yIG5vdCBkZWZpbmVkJyk7XG4gICAgfVxuXG4gICAgdmFyIHNvdXJjZSA9IE9iamVjdCh0aGlzKTtcbiAgICB2YXIgbGVuID0gc291cmNlLmxlbmd0aCA+Pj4gMDtcblxuICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoZm4gKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICBjb250ZXh0ID0gY3R4O1xuICAgIH1cblxuICAgIGkgPSAwO1xuXG4gICAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICAgIGlmIChpIGluIHNvdXJjZSkge1xuICAgICAgICB2YXIgdGVzdCA9IGZuLmNhbGwoY29udGV4dCwgc291cmNlW2ldLCBpLCBzb3VyY2UpO1xuICAgICAgICBpZiAodGVzdCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpKys7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKCFGdW5jdGlvbi5wcm90b3R5cGUuYmluZCkge1xuICBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdGdW5jdGlvbi5wcm90b3R5cGUuYmluZCAtIHdoYXQgaXMgdHJ5aW5nIHRvIGJlIGJvdW5kIGlzIG5vdCBjYWxsYWJsZScpO1xuICAgIH1cbiAgICB2YXIgY3VycmllZCA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgdmFyIG9yaWdpbmFsID0gdGhpcztcbiAgICB2YXIgTm9PcCA9IGZ1bmN0aW9uICgpIHt9O1xuICAgIHZhciBib3VuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBjdHggPSB0aGlzIGluc3RhbmNlb2YgTm9PcCAmJiBjb250ZXh0ID8gdGhpcyA6IGNvbnRleHQ7XG4gICAgICB2YXIgYXJncyA9IGN1cnJpZWQuY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuICAgICAgcmV0dXJuIG9yaWdpbmFsLmFwcGx5KGN0eCwgYXJncyk7XG4gICAgfTtcbiAgICBOb09wLnByb3RvdHlwZSA9IHRoaXMucHJvdG90eXBlO1xuICAgIGJvdW5kLnByb3RvdHlwZSA9IG5ldyBOb09wKCk7XG4gICAgcmV0dXJuIGJvdW5kO1xuICB9O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBoYXNEb250RW51bUJ1ZyA9ICEoeyB0b1N0cmluZzogbnVsbCB9KS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgndG9TdHJpbmcnKTtcbnZhciBkb250RW51bXMgPSBbXG4gICd0b1N0cmluZycsXG4gICd0b0xvY2FsZVN0cmluZycsXG4gICd2YWx1ZU9mJyxcbiAgJ2hhc093blByb3BlcnR5JyxcbiAgJ2lzUHJvdG90eXBlT2YnLFxuICAncHJvcGVydHlJc0VudW1lcmFibGUnLFxuICAnY29uc3RydWN0b3InXG5dO1xudmFyIGRvbnRFbnVtc0xlbmd0aCA9IGRvbnRFbnVtcy5sZW5ndGg7XG5cbmlmICghT2JqZWN0LmtleXMpIHtcbiAgT2JqZWN0LmtleXMgPSBmdW5jdGlvbihvYmopIHtcbiAgICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgJiYgKHR5cGVvZiBvYmogIT09ICdmdW5jdGlvbicgfHwgb2JqID09PSBudWxsKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmtleXMgY2FsbGVkIG9uIG5vbi1vYmplY3QnKTtcbiAgICB9XG5cbiAgICB2YXIgcmVzdWx0ID0gW10sIHByb3AsIGk7XG5cbiAgICBmb3IgKHByb3AgaW4gb2JqKSB7XG4gICAgICBpZiAoaGFzT3duLmNhbGwob2JqLCBwcm9wKSkge1xuICAgICAgICByZXN1bHQucHVzaChwcm9wKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzRG9udEVudW1CdWcpIHtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBkb250RW51bXNMZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaGFzT3duLmNhbGwob2JqLCBkb250RW51bXNbaV0pKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goZG9udEVudW1zW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAoIVN0cmluZy5wcm90b3R5cGUudHJpbSkge1xuICBTdHJpbmcucHJvdG90eXBlLnRyaW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpO1xuICB9O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyB0aGVzZSBhcmUgb25seSByZXF1aXJlZCBmb3IgSUUgPCA5XG4vLyBtYXliZSBtb3ZlIHRvIElFLXNwZWNpZmljIGRpc3Rybz9cbnJlcXVpcmUoJy4vcG9seWZpbGxzL2Z1bmN0aW9uLmJpbmQnKTtcbnJlcXVpcmUoJy4vcG9seWZpbGxzL2FycmF5LmZvcmVhY2gnKTtcbnJlcXVpcmUoJy4vcG9seWZpbGxzL2FycmF5Lm1hcCcpO1xucmVxdWlyZSgnLi9wb2x5ZmlsbHMvYXJyYXkuZmlsdGVyJyk7XG5yZXF1aXJlKCcuL3BvbHlmaWxscy9hcnJheS5pc2FycmF5Jyk7XG5yZXF1aXJlKCcuL3BvbHlmaWxscy9hcnJheS5pbmRleG9mJyk7XG5yZXF1aXJlKCcuL3BvbHlmaWxscy9hcnJheS5zb21lJyk7XG5yZXF1aXJlKCcuL3BvbHlmaWxscy9zdHJpbmcudHJpbScpO1xucmVxdWlyZSgnLi9wb2x5ZmlsbHMvb2JqZWN0LmtleXMnKTtcblxudmFyIGNvcmUgPSByZXF1aXJlKCcuL2NvcmUnKTtcbnZhciBpbmRleCA9IHJlcXVpcmUoJy4vaW5kZXgnKTtcbnZhciB1c2UgPSByZXF1aXJlKCcuL3VzZScpO1xuXG5jb3JlLnVzZSA9IHVzZS5iaW5kKGNvcmUpO1xuY29yZS5maW5kID0gaW5kZXguZmluZDtcbmNvcmUudmFsID0gcmVxdWlyZSgnLi92YWxpZGF0b3JzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gY29yZTtcbiIsInZhciByb21lID0gcmVxdWlyZSgnLi9yb21lJyk7XG52YXIgbW9tZW50dW0gPSByZXF1aXJlKCcuL21vbWVudHVtJyk7XG5cbnJvbWUudXNlKGdsb2JhbC5tb21lbnQpO1xuXG5pZiAobW9tZW50dW0ubW9tZW50ID09PSB2b2lkIDApIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdyb21lIGRlcGVuZHMgb24gbW9tZW50LmpzLCB5b3UgY2FuIGdldCBpdCBhdCBodHRwOi8vbW9tZW50anMuY29tLCBvciB5b3UgY291bGQgdXNlIHRoZSBidW5kbGVkIGRpc3RyaWJ1dGlvbiBmaWxlIGluc3RlYWQuJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcm9tZTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gdGV4dCAoZWxlbSwgdmFsdWUpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICBlbGVtLmlubmVyVGV4dCA9IGVsZW0udGV4dENvbnRlbnQgPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gZWxlbS5pbm5lclRleHQgfHwgZWxlbS50ZXh0Q29udGVudDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0ZXh0O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRocm90dGxlIChmbiwgYm91bmRhcnkpIHtcbiAgdmFyIGxhc3QgPSAtSW5maW5pdHk7XG4gIHZhciB0aW1lcjtcbiAgcmV0dXJuIGZ1bmN0aW9uIGJvdW5jZWQgKCkge1xuICAgIGlmICh0aW1lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB1bmJvdW5kKCk7XG5cbiAgICBmdW5jdGlvbiB1bmJvdW5kICgpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aW1lciA9IG51bGw7XG4gICAgICB2YXIgbmV4dCA9IGxhc3QgKyBib3VuZGFyeTtcbiAgICAgIHZhciBub3cgPSArbmV3IERhdGUoKTtcbiAgICAgIGlmIChub3cgPiBuZXh0KSB7XG4gICAgICAgIGxhc3QgPSBub3c7XG4gICAgICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQodW5ib3VuZCwgbmV4dCAtIG5vdyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1vbWVudHVtID0gcmVxdWlyZSgnLi9tb21lbnR1bScpO1xuXG5mdW5jdGlvbiB1c2UgKG1vbWVudCkge1xuICB0aGlzLm1vbWVudCA9IG1vbWVudHVtLm1vbWVudCA9IG1vbWVudDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB1c2U7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpbmRleCA9IHJlcXVpcmUoJy4vaW5kZXgnKTtcbnZhciBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKTtcbnZhciBhc3NvY2lhdGlvbiA9IHJlcXVpcmUoJy4vYXNzb2NpYXRpb24nKTtcblxuZnVuY3Rpb24gY29tcGFyZUJ1aWxkZXIgKGNvbXBhcmUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGZhY3RvcnkgKHZhbHVlKSB7XG4gICAgdmFyIGZpeGVkID0gcGFyc2UodmFsdWUpO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIHZhbGlkYXRlIChkYXRlKSB7XG4gICAgICB2YXIgY2FsID0gaW5kZXguZmluZCh2YWx1ZSk7XG4gICAgICB2YXIgbGVmdCA9IHBhcnNlKGRhdGUpO1xuICAgICAgdmFyIHJpZ2h0ID0gZml4ZWQgfHwgY2FsICYmIGNhbC5nZXRNb21lbnQoKTtcbiAgICAgIGlmICghcmlnaHQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoY2FsKSB7XG4gICAgICAgIGFzc29jaWF0aW9uLmFkZCh0aGlzLCBjYWwpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbXBhcmUobGVmdCwgcmlnaHQpO1xuICAgIH07XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJhbmdlQnVpbGRlciAoaG93LCBjb21wYXJlKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmYWN0b3J5IChzdGFydCwgZW5kKSB7XG4gICAgdmFyIGRhdGVzO1xuICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc3RhcnQpKSB7XG4gICAgICBkYXRlcyA9IHN0YXJ0O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobGVuID09PSAxKSB7XG4gICAgICAgIGRhdGVzID0gW3N0YXJ0XTtcbiAgICAgIH0gZWxzZSBpZiAobGVuID09PSAyKSB7XG4gICAgICAgIGRhdGVzID0gW1tzdGFydCwgZW5kXV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIHZhbGlkYXRlIChkYXRlKSB7XG4gICAgICByZXR1cm4gZGF0ZXMubWFwKGV4cGFuZC5iaW5kKHRoaXMpKVtob3ddKGNvbXBhcmUuYmluZCh0aGlzLCBkYXRlKSk7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGV4cGFuZCAodmFsdWUpIHtcbiAgICAgIHZhciBzdGFydCwgZW5kO1xuICAgICAgdmFyIGNhbCA9IGluZGV4LmZpbmQodmFsdWUpO1xuICAgICAgaWYgKGNhbCkge1xuICAgICAgICBzdGFydCA9IGVuZCA9IGNhbC5nZXRNb21lbnQoKTtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgc3RhcnQgPSB2YWx1ZVswXTsgZW5kID0gdmFsdWVbMV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGFydCA9IGVuZCA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGNhbCkge1xuICAgICAgICBhc3NvY2lhdGlvbi5hZGQoY2FsLCB0aGlzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0OiBwYXJzZShzdGFydCkuc3RhcnRPZignZGF5JykudG9EYXRlKCksXG4gICAgICAgIGVuZDogcGFyc2UoZW5kKS5lbmRPZignZGF5JykudG9EYXRlKClcbiAgICAgIH07XG4gICAgfVxuICB9O1xufVxuXG52YXIgYWZ0ZXJFcSAgPSBjb21wYXJlQnVpbGRlcihmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHsgcmV0dXJuIGxlZnQgPj0gcmlnaHQ7IH0pO1xudmFyIGFmdGVyICAgID0gY29tcGFyZUJ1aWxkZXIoZnVuY3Rpb24gKGxlZnQsIHJpZ2h0KSB7IHJldHVybiBsZWZ0ICA+IHJpZ2h0OyB9KTtcbnZhciBiZWZvcmVFcSA9IGNvbXBhcmVCdWlsZGVyKGZ1bmN0aW9uIChsZWZ0LCByaWdodCkgeyByZXR1cm4gbGVmdCA8PSByaWdodDsgfSk7XG52YXIgYmVmb3JlICAgPSBjb21wYXJlQnVpbGRlcihmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHsgcmV0dXJuIGxlZnQgIDwgcmlnaHQ7IH0pO1xuXG52YXIgZXhjZXB0ICAgPSByYW5nZUJ1aWxkZXIoJ2V2ZXJ5JywgZnVuY3Rpb24gKGxlZnQsIHJpZ2h0KSB7IHJldHVybiByaWdodC5zdGFydCAgPiBsZWZ0IHx8IHJpZ2h0LmVuZCAgPCBsZWZ0OyB9KTtcbnZhciBvbmx5ICAgICA9IHJhbmdlQnVpbGRlcignc29tZScsICBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHsgcmV0dXJuIHJpZ2h0LnN0YXJ0IDw9IGxlZnQgJiYgcmlnaHQuZW5kID49IGxlZnQ7IH0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgYWZ0ZXJFcTogYWZ0ZXJFcSxcbiAgYWZ0ZXI6IGFmdGVyLFxuICBiZWZvcmVFcTogYmVmb3JlRXEsXG4gIGJlZm9yZTogYmVmb3JlLFxuICBleGNlcHQ6IGV4Y2VwdCxcbiAgb25seTogb25seVxufTtcbiJdfQ==
|