storm-toggler
Version:
Accessible UI state toggling
184 lines (153 loc) • 20.4 kB
JavaScript
(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){
(function (global){
'use strict';
var _stormToggler = require('./libs/storm-toggler');
var _stormToggler2 = _interopRequireDefault(_stormToggler);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var onDOMContentLoadedTasks = [function () {
_stormToggler2.default.init('.js-toggle');
_stormToggler2.default.init('.js-toggle__local', {
local: true,
delay: 0,
callback: function callback() {
var _this = this;
if (this.open) {
global.Togglers.forEach(function (toggler) {
if (toggler !== _this && !!toggler.open && toggler.DOMElement !== _this.targetElement) {
toggler.toggle();
}
});
}
}
});
}];
global.Togglers = {};
if ('addEventListener' in window) window.addEventListener('DOMContentLoaded', function () {
onDOMContentLoadedTasks.forEach(function (fn) {
return fn();
});
});
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"./libs/storm-toggler":2}],2:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
/**
* @name storm-toggler: Class and ARIA toggle UI state manipulation
* @version 0.11.0: Wed, 15 Mar 2017 13:46:42 GMT
* @author mjbp
* @license MIT
*/
var defaults = {
delay: 0,
startOpen: false,
local: false,
prehook: false,
callback: false,
focus: true,
trapTab: false
};
var StormToggler = {
init: function init() {
var _this = this;
this.targetElement = document.getElementById(this.targetId);
this.classTarget = !this.settings.local ? document.documentElement : this.targetElement.parentNode;
this.siblingBtns = [].slice.call(document.querySelectorAll('[href="#' + this.targetId + '"], [data-target="#' + this.targetId + '"]'));
if (this.settings.focus) this.focusableChildren = this.getFocusableChildren();
if (this.settings.trapTab) this.boundKeyListener = this.keyListener.bind(this);
this.statusClass = !this.settings.local ? 'on--' + this.targetId : 'active';
this.animatingClass = !this.settings.local ? 'animating--' + this.targetId : 'animating';
this.siblingBtns.forEach(function (btn) {
btn.setAttribute('role', 'button');
btn.setAttribute('aria-controls', _this.targetId);
btn.setAttribute('aria-expanded', 'false');
});
this.btn.addEventListener('click', function (e) {
_this.toggle(e);
});
this.settings.startOpen && this.toggle();
return this;
},
getFocusableChildren: function getFocusableChildren() {
var focusableElements = ['a[href]', 'area[href]', 'input:not([disabled])', 'select:not([disabled])', 'textarea:not([disabled])', 'button:not([disabled])', 'iframe', 'object', 'embed', '[contenteditable]', '[tabindex]:not([tabindex="-1"])'];
return [].slice.call(this.targetElement.querySelectorAll(focusableElements.join(',')));
},
toggleAttributes: function toggleAttributes() {
this.isOpen = !this.isOpen;
this.siblingBtns.forEach(function (sibling) {
sibling.setAttribute('aria-expanded', sibling.getAttribute('aria-expanded') === 'true' ? 'false' : 'true');
});
},
toggleDocumentState: function toggleDocumentState() {
this.classTarget.classList.remove(this.animatingClass);
this.classTarget.classList.toggle(this.statusClass);
},
manageFocus: function manageFocus() {
var _this2 = this;
if (!this.isOpen) {
this.lastFocused = document.activeElement;
this.focusableChildren.length && window.setTimeout(function () {
return _this2.focusableChildren[0].focus();
}, this.settings.delay);
this.settings.trapTab && document.addEventListener('keydown', this.boundKeyListener);
} else {
this.settings.trapTab && document.removeEventListener('keydown', this.boundKeyListener);
this.focusableChildren.length && window.setTimeout(function () {
_this2.lastFocused.focus();
_this2.lastFocused = false;
}, this.settings.delay);
}
},
trapTab: function trapTab(e) {
var focusedIndex = this.focusableChildren.indexOf(document.activeElement);
if (e.shiftKey && focusedIndex === 0) {
e.preventDefault();
this.focusableChildren[this.focusableChildren.length - 1].focus();
} else {
if (!e.shiftKey && focusedIndex === this.focusableChildren.length - 1) {
e.preventDefault();
this.focusableChildren[0].focus();
}
}
},
keyListener: function keyListener(e) {
if (this.isOpen && e.keyCode === 27) {
e.preventDefault();
this.toggle();
}
if (this.isOpen && e.keyCode === 9) {
this.trapTab(e);
}
},
toggle: function toggle(e) {
var _this3 = this;
var delay = this.classTarget.classList.contains(this.statusClass) ? this.settings.delay : 0;
!!this.settings.prehook && typeof this.settings.prehook === 'function' && this.settings.prehook.call(this);
if (e) {
e.preventDefault();
e.stopPropagation();
}
this.classTarget.classList.add(this.animatingClass);
window.setTimeout(function () {
!!_this3.settings.focus && _this3.focusableChildren && _this3.manageFocus();
_this3.toggleAttributes();
_this3.toggleDocumentState();
!!_this3.settings.callback && typeof _this3.settings.callback === 'function' && _this3.settings.callback.call(_this3);
}, delay);
}
};
var init = function init(sel, opts) {
var els = [].slice.call(document.querySelectorAll(sel));
if (!els.length) throw new Error('Toggler cannot be initialised, no augmentable elements found');
return els.map(function (el) {
return Object.assign(Object.create(StormToggler), {
btn: el,
targetId: (el.getAttribute('href') || el.getAttribute('data-target')).substr(1),
settings: Object.assign({}, defaults, opts)
}).init();
});
};
exports.default = { init: init };
},{}]},{},[1])
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJleGFtcGxlL3NyYy9hcHAuanMiLCJleGFtcGxlL3NyYy9saWJzL3N0b3JtLXRvZ2dsZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7QUNBQTs7Ozs7O0FBRUEsSUFBTSwwQkFBMEIsQ0FBQyxZQUFNO0FBQ3RDLHdCQUFRLElBQVIsQ0FBYSxZQUFiO0FBQ0Esd0JBQVEsSUFBUixDQUFhLG1CQUFiLEVBQWtDO0FBQ2pDLFNBQU8sSUFEMEI7QUFFakMsU0FBTyxDQUYwQjtBQUdqQyxZQUFVLG9CQUFXO0FBQUE7O0FBQ3BCLE9BQUcsS0FBSyxJQUFSLEVBQWE7QUFDWixXQUFPLFFBQVAsQ0FBZ0IsT0FBaEIsQ0FBd0IsbUJBQVc7QUFDbEMsU0FBRyxxQkFBb0IsQ0FBQyxDQUFDLFFBQVEsSUFBOUIsSUFBc0MsUUFBUSxVQUFSLEtBQXVCLE1BQUssYUFBckUsRUFBbUY7QUFDbEYsY0FBUSxNQUFSO0FBQ0E7QUFDRCxLQUpEO0FBS0E7QUFDRDtBQVhnQyxFQUFsQztBQWFBLENBZitCLENBQWhDOztBQWlCQSxPQUFPLFFBQVAsR0FBa0IsRUFBbEI7O0FBRUEsSUFBRyxzQkFBc0IsTUFBekIsRUFBaUMsT0FBTyxnQkFBUCxDQUF3QixrQkFBeEIsRUFBNEMsWUFBTTtBQUFFLHlCQUF3QixPQUF4QixDQUFnQyxVQUFDLEVBQUQ7QUFBQSxTQUFRLElBQVI7QUFBQSxFQUFoQztBQUFnRCxDQUFwRzs7Ozs7Ozs7OztBQ3JCakM7Ozs7OztBQU1BLElBQU0sV0FBVztBQUNoQixRQUFPLENBRFM7QUFFaEIsWUFBVyxLQUZLO0FBR2hCLFFBQU8sS0FIUztBQUloQixVQUFTLEtBSk87QUFLaEIsV0FBVSxLQUxNO0FBTWhCLFFBQU8sSUFOUztBQU9oQixVQUFTO0FBUE8sQ0FBakI7O0FBVUEsSUFBTSxlQUFlO0FBQ3BCLEtBRG9CLGtCQUNiO0FBQUE7O0FBQ04sT0FBSyxhQUFMLEdBQXFC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SSxLQUFKLENBQVUsOERBQVYsQ0FBTjs7QUFFaEIsUUFBTyxJQUFJLEdBQUosQ0FBUSxVQUFDLEVBQUQsRUFBUTtBQUN0QixTQUFPLE9BQU8sTUFBUCxDQUFjLE9BQU8sTUFBUCxDQUFjLFlBQWQsQ0FBZCxFQUEyQztBQUNqRCxRQUFLLEVBRDRDO0FBRWpELGFBQVUsQ0FBQyxHQUFHLFlBQUgsQ0FBZ0IsTUFBaEIsS0FBMEIsR0FBRyxZQUFILENBQWdCLGFBQWhCLENBQTNCLEVBQTJELE1BQTNELENBQWtFLENBQWxFLENBRnVDO0FBR2pELGFBQVUsT0FBTyxNQUFQLENBQWMsRUFBZCxFQUFrQixRQUFsQixFQUE0QixJQUE1QjtBQUh1QyxHQUEzQyxFQUlKLElBSkksRUFBUDtBQUtBLEVBTk0sQ0FBUDtBQU9BLENBWkQ7O2tCQWNlLEVBQUUsVUFBRixFIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsImltcG9ydCBUb2dnbGVyIGZyb20gJy4vbGlicy9zdG9ybS10b2dnbGVyJztcblxuY29uc3Qgb25ET01Db250ZW50TG9hZGVkVGFza3MgPSBbKCkgPT4ge1xuXHRUb2dnbGVyLmluaXQoJy5qcy10b2dnbGUnKTtcblx0VG9nZ2xlci5pbml0KCcuanMtdG9nZ2xlX19sb2NhbCcsIHtcblx0XHRsb2NhbDogdHJ1ZSxcblx0XHRkZWxheTogMCxcblx0XHRjYWxsYmFjazogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZih0aGlzLm9wZW4pe1xuXHRcdFx0XHRnbG9iYWwuVG9nZ2xlcnMuZm9yRWFjaCh0b2dnbGVyID0+IHtcblx0XHRcdFx0XHRpZih0b2dnbGVyICE9PSB0aGlzICYmICEhdG9nZ2xlci5vcGVuICYmIHRvZ2dsZXIuRE9NRWxlbWVudCAhPT0gdGhpcy50YXJnZXRFbGVtZW50KXtcblx0XHRcdFx0XHRcdHRvZ2dsZXIudG9nZ2xlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufV07XG5cbmdsb2JhbC5Ub2dnbGVycyA9IHt9O1xuICAgIFxuaWYoJ2FkZEV2ZW50TGlzdGVuZXInIGluIHdpbmRvdykgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7IG9uRE9NQ29udGVudExvYWRlZFRhc2tzLmZvckVhY2goKGZuKSA9PiBmbigpKTsgfSk7XG4iLCIvKipcbiAqIEBuYW1lIHN0b3JtLXRvZ2dsZXI6IENsYXNzIGFuZCBBUklBIHRvZ2dsZSBVSSBzdGF0ZSBtYW5pcHVsYXRpb25cbiAqIEB2ZXJzaW9uIDAuMTEuMDogV2VkLCAxNSBNYXIgMjAxNyAxMzo0Njo0MiBHTVRcbiAqIEBhdXRob3IgbWpicFxuICogQGxpY2Vuc2UgTUlUXG4gKi9cbmNvbnN0IGRlZmF1bHRzID0ge1xuXHRkZWxheTogMCxcblx0c3RhcnRPcGVuOiBmYWxzZSxcblx0bG9jYWw6IGZhbHNlLFxuXHRwcmVob29rOiBmYWxzZSxcblx0Y2FsbGJhY2s6IGZhbHNlLFxuXHRmb2N1czogdHJ1ZSxcblx0dHJhcFRhYjogZmFsc2Vcbn07XG5cbmNvbnN0IFN0b3JtVG9nZ2xlciA9IHtcblx0aW5pdCgpIHtcblx0XHR0aGlzLnRhcmdldEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnRhcmdldElkKTtcblx0XHR0aGlzLmNsYXNzVGFyZ2V0ID0gKCF0aGlzLnNldHRpbmdzLmxvY2FsKSA/IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCA6IHRoaXMudGFyZ2V0RWxlbWVudC5wYXJlbnROb2RlO1xuXHRcdHRoaXMuc2libGluZ0J0bnMgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tocmVmPVwiIycgKyB0aGlzLnRhcmdldElkICsgJ1wiXSwgW2RhdGEtdGFyZ2V0PVwiIycgKyB0aGlzLnRhcmdldElkICsgJ1wiXScpKTtcblx0XHRpZih0aGlzLnNldHRpbmdzLmZvY3VzKSB0aGlzLmZvY3VzYWJsZUNoaWxkcmVuID0gdGhpcy5nZXRGb2N1c2FibGVDaGlsZHJlbigpO1xuXHRcdGlmKHRoaXMuc2V0dGluZ3MudHJhcFRhYikgdGhpcy5ib3VuZEtleUxpc3RlbmVyID0gdGhpcy5rZXlMaXN0ZW5lci5iaW5kKHRoaXMpO1xuXG5cdFx0dGhpcy5zdGF0dXNDbGFzcyA9ICF0aGlzLnNldHRpbmdzLmxvY2FsID8gYG9uLS0ke3RoaXMudGFyZ2V0SWR9YCA6ICdhY3RpdmUnO1xuXHRcdHRoaXMuYW5pbWF0aW5nQ2xhc3MgPSAhdGhpcy5zZXR0aW5ncy5sb2NhbCA/IGBhbmltYXRpbmctLSR7dGhpcy50YXJnZXRJZH1gIDogJ2FuaW1hdGluZyc7XG5cblx0XHR0aGlzLnNpYmxpbmdCdG5zLmZvckVhY2goYnRuID0+IHtcblx0XHRcdGJ0bi5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCdidXR0b24nKTtcblx0XHRcdGJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtY29udHJvbHMnLCB0aGlzLnRhcmdldElkKTtcblx0XHRcdGJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKTtcblx0XHR9KTtcblxuXHRcdHRoaXMuYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7IHRoaXMudG9nZ2xlKGUpOyB9KTtcblx0XHR0aGlzLnNldHRpbmdzLnN0YXJ0T3BlbiAmJiB0aGlzLnRvZ2dsZSgpO1xuXHRcdFxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXHRnZXRGb2N1c2FibGVDaGlsZHJlbigpIHtcblx0XHRjb25zdCBmb2N1c2FibGVFbGVtZW50cyA9IFsnYVtocmVmXScsICdhcmVhW2hyZWZdJywgJ2lucHV0Om5vdChbZGlzYWJsZWRdKScsICdzZWxlY3Q6bm90KFtkaXNhYmxlZF0pJywgJ3RleHRhcmVhOm5vdChbZGlzYWJsZWRdKScsICdidXR0b246bm90KFtkaXNhYmxlZF0pJywgJ2lmcmFtZScsICdvYmplY3QnLCAnZW1iZWQnLCAnW2NvbnRlbnRlZGl0YWJsZV0nLCAnW3RhYmluZGV4XTpub3QoW3RhYmluZGV4PVwiLTFcIl0pJ107XG5cblx0XHRyZXR1cm4gW10uc2xpY2UuY2FsbCh0aGlzLnRhcmdldEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChmb2N1c2FibGVFbGVtZW50cy5qb2luKCcsJykpKTtcblx0fSxcblx0dG9nZ2xlQXR0cmlidXRlczogZnVuY3Rpb24oKXtcblx0XHR0aGlzLmlzT3BlbiA9ICF0aGlzLmlzT3Blbjtcblx0XHR0aGlzLnNpYmxpbmdCdG5zLmZvckVhY2goc2libGluZyA9PiB7XG5cdFx0XHRzaWJsaW5nLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIHNpYmxpbmcuZ2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJykgPT09ICd0cnVlJyA/ICdmYWxzZScgOiAndHJ1ZScpO1xuXHRcdH0pO1xuXHR9LFxuXHR0b2dnbGVEb2N1bWVudFN0YXRlOiBmdW5jdGlvbigpe1xuXHRcdHRoaXMuY2xhc3NUYXJnZXQuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLmFuaW1hdGluZ0NsYXNzKTtcblx0XHR0aGlzLmNsYXNzVGFyZ2V0LmNsYXNzTGlzdC50b2dnbGUodGhpcy5zdGF0dXNDbGFzcyk7XG5cdH0sXG5cdG1hbmFnZUZvY3VzOiBmdW5jdGlvbigpe1xuXHRcdGlmKCF0aGlzLmlzT3Blbil7XG5cdFx0XHR0aGlzLmxhc3RGb2N1c2VkID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblx0XHRcdHRoaXMuZm9jdXNhYmxlQ2hpbGRyZW4ubGVuZ3RoICYmIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHRoaXMuZm9jdXNhYmxlQ2hpbGRyZW5bMF0uZm9jdXMoKSwgdGhpcy5zZXR0aW5ncy5kZWxheSk7XG5cdFx0XHR0aGlzLnNldHRpbmdzLnRyYXBUYWIgJiYgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuYm91bmRLZXlMaXN0ZW5lcik7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy5zZXR0aW5ncy50cmFwVGFiICYmIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmJvdW5kS2V5TGlzdGVuZXIpO1xuXHRcdFx0dGhpcy5mb2N1c2FibGVDaGlsZHJlbi5sZW5ndGggJiYgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmxhc3RGb2N1c2VkLmZvY3VzKCk7XG5cdFx0XHRcdHRoaXMubGFzdEZvY3VzZWQgPSBmYWxzZTtcblx0XHRcdH0sIHRoaXMuc2V0dGluZ3MuZGVsYXkpO1xuXHRcdH1cblx0fSxcblx0dHJhcFRhYjogZnVuY3Rpb24oZSl7XG5cdFx0bGV0IGZvY3VzZWRJbmRleCA9IHRoaXMuZm9jdXNhYmxlQ2hpbGRyZW4uaW5kZXhPZihkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcblx0XHRpZihlLnNoaWZ0S2V5ICYmIGZvY3VzZWRJbmRleCA9PT0gMCkge1xuXHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0dGhpcy5mb2N1c2FibGVDaGlsZHJlblt0aGlzLmZvY3VzYWJsZUNoaWxkcmVuLmxlbmd0aCAtIDFdLmZvY3VzKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmKCFlLnNoaWZ0S2V5ICYmIGZvY3VzZWRJbmRleCA9PT0gdGhpcy5mb2N1c2FibGVDaGlsZHJlbi5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0dGhpcy5mb2N1c2FibGVDaGlsZHJlblswXS5mb2N1cygpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0a2V5TGlzdGVuZXIoZSl7XG5cdFx0aWYgKHRoaXMuaXNPcGVuICYmIGUua2V5Q29kZSA9PT0gMjcpIHtcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdHRoaXMudG9nZ2xlKCk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLmlzT3BlbiAmJiBlLmtleUNvZGUgPT09IDkpIHtcblx0XHRcdHRoaXMudHJhcFRhYihlKTtcblx0XHR9XG5cdH0sXG5cdHRvZ2dsZTogZnVuY3Rpb24oZSl7XG5cdFx0bGV0IGRlbGF5ID0gdGhpcy5jbGFzc1RhcmdldC5jbGFzc0xpc3QuY29udGFpbnModGhpcy5zdGF0dXNDbGFzcykgPyAgdGhpcy5zZXR0aW5ncy5kZWxheSA6IDA7XG5cblx0XHQoISF0aGlzLnNldHRpbmdzLnByZWhvb2sgJiYgdHlwZW9mIHRoaXMuc2V0dGluZ3MucHJlaG9vayA9PT0gJ2Z1bmN0aW9uJykgJiYgdGhpcy5zZXR0aW5ncy5wcmVob29rLmNhbGwodGhpcyk7XG5cdFx0XG5cdFx0aWYoZSl7XG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdH1cblx0XHRcblx0XHR0aGlzLmNsYXNzVGFyZ2V0LmNsYXNzTGlzdC5hZGQodGhpcy5hbmltYXRpbmdDbGFzcyk7XG5cdFx0XG5cdFx0d2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0KCEhdGhpcy5zZXR0aW5ncy5mb2N1cyAmJiB0aGlzLmZvY3VzYWJsZUNoaWxkcmVuKSAmJiB0aGlzLm1hbmFnZUZvY3VzKCk7XG5cdFx0XHR0aGlzLnRvZ2dsZUF0dHJpYnV0ZXMoKTtcblx0XHRcdHRoaXMudG9nZ2xlRG9jdW1lbnRTdGF0ZSgpO1xuXHRcdFx0KCEhdGhpcy5zZXR0aW5ncy5jYWxsYmFjayAmJiB0eXBlb2YgdGhpcy5zZXR0aW5ncy5jYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykgJiYgdGhpcy5zZXR0aW5ncy5jYWxsYmFjay5jYWxsKHRoaXMpO1xuXHRcdH0sIGRlbGF5KTtcblx0fVxufTtcblxuY29uc3QgaW5pdCA9IChzZWwsIG9wdHMpID0+IHtcblx0bGV0IGVscyA9IFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWwpKTtcblx0XG5cdGlmKCFlbHMubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ1RvZ2dsZXIgY2Fubm90IGJlIGluaXRpYWxpc2VkLCBubyBhdWdtZW50YWJsZSBlbGVtZW50cyBmb3VuZCcpO1xuXG5cdHJldHVybiBlbHMubWFwKChlbCkgPT4ge1xuXHRcdHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoU3Rvcm1Ub2dnbGVyKSwge1xuXHRcdFx0YnRuOiBlbCxcblx0XHRcdHRhcmdldElkOiAoZWwuZ2V0QXR0cmlidXRlKCdocmVmJyl8fCBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdGFyZ2V0JykpLnN1YnN0cigxKSxcblx0XHRcdHNldHRpbmdzOiBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0cywgb3B0cylcblx0XHR9KS5pbml0KCk7XG5cdH0pO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgeyBpbml0IH07Il19