UNPKG

@ema/js-base-library

Version:

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.2.0.

392 lines 30 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * Provides utilities for DOM manipulation */ var /** * Provides utilities for DOM manipulation */ DomUtil = /** @class */ (function () { function DomUtil() { } /** * Adds a class to a HTMLElement. */ /** * Adds a class to a HTMLElement. * @param {?} el * @param {?} className * @return {?} */ DomUtil.addClass = /** * Adds a class to a HTMLElement. * @param {?} el * @param {?} className * @return {?} */ function (el, className) { if (el.classList) el.classList.add(className); else el.className += ' ' + className; }; /** * Checks whether a HTMLElement has a class. */ /** * Checks whether a HTMLElement has a class. * @param {?} el * @param {?} className * @return {?} */ DomUtil.hasClass = /** * Checks whether a HTMLElement has a class. * @param {?} el * @param {?} className * @return {?} */ function (el, className) { if (el.classList) el.classList.contains(className); else new RegExp('(^| )' + className + '( |$)', 'gi').test(el.className); }; /** * Removes a class form a HTMLElement. */ /** * Removes a class form a HTMLElement. * @param {?} el * @param {?} className * @return {?} */ DomUtil.removeClass = /** * Removes a class form a HTMLElement. * @param {?} el * @param {?} className * @return {?} */ function (el, className) { if (el.classList) el.classList.remove(className); else el.className = el.className.replace(new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'), ' '); }; /** * Removes a class from a HTMLElement when present, or adds it when not present. */ /** * Removes a class from a HTMLElement when present, or adds it when not present. * @param {?} el * @param {?} className * @return {?} */ DomUtil.toggleClass = /** * Removes a class from a HTMLElement when present, or adds it when not present. * @param {?} el * @param {?} className * @return {?} */ function (el, className) { if (el.classList) { el.classList.toggle(className); } else { /** @type {?} */ var classes = el.className.split(' '); /** @type {?} */ var existingIndex = classes.indexOf(className); if (existingIndex >= 0) classes.splice(existingIndex, 1); else classes.push(className); el.className = classes.join(' '); } }; /** * Removes a HTMLElement from the DOM. */ /** * Removes a HTMLElement from the DOM. * @param {?} el * @return {?} */ DomUtil.remove = /** * Removes a HTMLElement from the DOM. * @param {?} el * @return {?} */ function (el) { el.parentNode.removeChild(el); }; /** * Returns an object with all the attributes of a HTMLElement as key / value pairs. */ /** * Returns an object with all the attributes of a HTMLElement as key / value pairs. * @param {?} el * @return {?} */ DomUtil.getAttributes = /** * Returns an object with all the attributes of a HTMLElement as key / value pairs. * @param {?} el * @return {?} */ function (el) { /** @type {?} */ var attrs = el.attributes; /** @type {?} */ var obj = {}; /** @type {?} */ var i = 0; for (; i < attrs.length; i++) { obj[attrs[i].name] = attrs[i].value; } return obj; }; /** * Sets attributes of a HTMLElement. */ /** * Sets attributes of a HTMLElement. * @param {?} el * @param {?} attributes * @return {?} */ DomUtil.setAttributes = /** * Sets attributes of a HTMLElement. * @param {?} el * @param {?} attributes * @return {?} */ function (el, attributes) { Object.keys(attributes).forEach((/** * @param {?} k * @return {?} */ function (k) { el.setAttribute(k, attributes[k]); })); }; /** * Get a style property of a HTMLElement. */ /** * Get a style property of a HTMLElement. * @param {?} el * @param {?} styleProp * @return {?} */ DomUtil.getStyle = /** * Get a style property of a HTMLElement. * @param {?} el * @param {?} styleProp * @return {?} */ function (el, styleProp) { /** @type {?} */ var value; /** @type {?} */ var defaultView = el.ownerDocument.defaultView; // W3C standard way: if (defaultView && defaultView.getComputedStyle) { // sanitize property name to css notation (hypen separated words eg. font-Size) styleProp = styleProp.replace(/([A-Z])/g, '-$1').toLowerCase(); return defaultView.getComputedStyle(el, null).getPropertyValue(styleProp); } else if (el['currentStyle']) { // IE // sanitize property name to camelCase styleProp = styleProp.replace(/\-(\w)/g, (/** * @param {?} str * @param {?} letter * @return {?} */ function (str, letter) { return letter.toUpperCase(); })); value = el['currentStyle'][styleProp]; // convert other units to pixels on IE if (/^\d+(em|pt|%|ex)?$/i.test(value)) { return ((/** * @param {?} value * @return {?} */ function (value) { /** @type {?} */ var oldLeft = el.style.left; /** @type {?} */ var oldRsLeft = el['runtimeStyle'].left; el['runtimeStyle'].left = el['currentStyle'].left; el.style.left = value || 0; value = el.style['pixelLeft'] + 'px'; el.style.left = oldLeft; el['runtimeStyle'].left = oldRsLeft; return value; }))(value); } return value; } }; /** * Returns the width and height of the viewport. */ /** * Returns the width and height of the viewport. * @return {?} */ DomUtil.viewportSize = /** * Returns the width and height of the viewport. * @return {?} */ function () { /** @type {?} */ var obj = { width: undefined, height: undefined }; if (typeof window !== 'undefined') { if (window.innerHeight) { obj.width = window.innerWidth; obj.height = window.innerHeight; } else { obj.width = document.documentElement.clientWidth; obj.height = document.documentElement.clientHeight; } } // todo: native if (typeof window === 'undefined') { } return obj; }; /** * @param {?} str * @return {?} */ DomUtil.copyToClipboard = /** * @param {?} str * @return {?} */ function (str) { /** @type {?} */ var el = document.createElement('textarea'); el.value = str; // Set its value to the string that you want copied el.setAttribute('readonly', ''); // Make it readonly to be tamper-proof el.style.position = 'absolute'; el.style.left = '-9999px'; // Move outside the screen to make it invisible document.body.appendChild(el); // Append the <textarea> element to the HTML document // Append the <textarea> element to the HTML document /** @type {?} */ var selected = document.getSelection().rangeCount > 0 // Check if there is any content selected previously ? document.getSelection().getRangeAt(0) // Store selection if found : false; el.select(); // Select the <textarea> content document.execCommand('copy'); // Copy - only works as a result of a user action (e.g. click events) document.body.removeChild(el); // Remove the <textarea> element if (selected) { // If a selection existed before copying document.getSelection().removeAllRanges(); // Unselect everything on the HTML document document.getSelection().addRange(selected); // Restore the original selection } }; /** * @param {?} el * @param {?=} duration * @param {?=} delay * @param {?=} display * @return {?} */ DomUtil.fadeIn = /** * @param {?} el * @param {?=} duration * @param {?=} delay * @param {?=} display * @return {?} */ function (el, duration, delay, display) { if (duration === void 0) { duration = 300; } if (delay === void 0) { delay = 0; } if (display === void 0) { display = 'block'; } /** @type {?} */ var step = (1 / duration) * 10; el.style.opacity = '0'; el.style.display = display; setTimeout((/** * @return {?} */ function () { ((/** * @return {?} */ function fade() { /** @type {?} */ var val = parseFloat(el.style.opacity); if (!((val += step) > 1)) { el.style.opacity = val.toString(); requestAnimationFrame(fade); } }))(); }), delay); }; /** * @param {?} el * @param {?=} duration * @param {?=} delay * @param {?=} visible * @return {?} */ DomUtil.fadeOut = /** * @param {?} el * @param {?=} duration * @param {?=} delay * @param {?=} visible * @return {?} */ function (el, duration, delay, visible) { if (duration === void 0) { duration = 300; } if (delay === void 0) { delay = 0; } if (visible === void 0) { visible = false; } /** @type {?} */ var step = (1 / duration) * 10; el.style.opacity = '1'; setTimeout((/** * @return {?} */ function () { ((/** * @return {?} */ function fade() { /** @type {?} */ var opacity = Number(el.style.opacity); opacity = opacity - step; el.style.opacity = opacity.toString(); if (opacity < 0) { if (visible === false) { el.style.display = 'none'; el.style.opacity = '1'; } } else { requestAnimationFrame(fade); } }))(); }), delay); }; /** * @param {?} name * @return {?} */ DomUtil.getUrlParameterByName = /** * @param {?} name * @return {?} */ function (name) { /** @type {?} */ var match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search); return match && decodeURIComponent(match[1].replace(/\+/g, ' ')); }; return DomUtil; }()); /** * Provides utilities for DOM manipulation */ export { DomUtil }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9tLXV0aWwuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZW1hL2pzLWJhc2UtbGlicmFyeS8iLCJzb3VyY2VzIjpbImxpYi91dGlscy9kb20tdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBR0E7Ozs7SUFBQTtJQWdNQSxDQUFDO0lBOUxHOztPQUVHOzs7Ozs7O0lBQ0ksZ0JBQVE7Ozs7OztJQUFmLFVBQWdCLEVBQWUsRUFBRSxTQUFpQjtRQUM5QyxJQUFJLEVBQUUsQ0FBQyxTQUFTO1lBQ1osRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7O1lBRTVCLEVBQUUsQ0FBQyxTQUFTLElBQUksR0FBRyxHQUFHLFNBQVMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7O09BRUc7Ozs7Ozs7SUFDSSxnQkFBUTs7Ozs7O0lBQWYsVUFBZ0IsRUFBZSxFQUFFLFNBQWlCO1FBQzlDLElBQUksRUFBRSxDQUFDLFNBQVM7WUFDWixFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQzs7WUFFakMsSUFBSSxNQUFNLENBQUMsT0FBTyxHQUFHLFNBQVMsR0FBRyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRUQ7O09BRUc7Ozs7Ozs7SUFDSSxtQkFBVzs7Ozs7O0lBQWxCLFVBQW1CLEVBQWUsRUFBRSxTQUFpQjtRQUNqRCxJQUFJLEVBQUUsQ0FBQyxTQUFTO1lBQ1osRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7O1lBRS9CLEVBQUUsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVMsRUFBRSxJ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QUFDO1lBQ1A7OztZQUFDLFNBQVMsSUFBSTs7b0JBQ04sT0FBTyxHQUFXLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztnQkFDOUMsT0FBTyxHQUFHLE9BQU8sR0FBRyxJQUFJLENBQUM7Z0JBQ3pCLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFO29CQUNiLElBQUksT0FBTyxLQUFLLEtBQUssRUFBRTt3QkFDbkIsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO3dCQUMxQixFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7cUJBQzFCO2lCQUNKO3FCQUFNO29CQUNILHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUMvQjtZQUNMLENBQUMsRUFBQyxFQUFFLENBQUM7UUFDVCxDQUFDLEdBQUUsS0FBSyxDQUFDLENBQUM7SUFFZCxDQUFDOzs7OztJQUVNLDZCQUFxQjs7OztJQUE1QixVQUE2QixJQUFZOztZQUNqQyxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLEdBQUcsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQzNFLE9BQU8sS0FBSyxJQUFJLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUdMLGNBQUM7QUFBRCxDQUFDLEFBaE1ELElBZ01DIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQcm92aWRlcyB1dGlsaXRpZXMgZm9yIERPTSBtYW5pcHVsYXRpb25cbiAqL1xuZXhwb3J0IGNsYXNzIERvbVV0aWwge1xuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGNsYXNzIHRvIGEgSFRNTEVsZW1lbnQuXG4gICAgICovXG4gICAgc3RhdGljIGFkZENsYXNzKGVsOiBIVE1MRWxlbWVudCwgY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGVsLmNsYXNzTGlzdClcbiAgICAgICAgICAgIGVsLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZWwuY2xhc3NOYW1lICs9ICcgJyArIGNsYXNzTmFtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciBhIEhUTUxFbGVtZW50IGhhcyBhIGNsYXNzLlxuICAgICAqL1xuICAgIHN0YXRpYyBoYXNDbGFzcyhlbDogSFRNTEVsZW1lbnQsIGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGlmIChlbC5jbGFzc0xpc3QpXG4gICAgICAgICAgICBlbC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbmV3IFJlZ0V4cCgnKF58ICknICsgY2xhc3NOYW1lICsgJyggfCQpJywgJ2dpJykudGVzdChlbC5jbGFzc05hbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBjbGFzcyBmb3JtIGEgSFRNTEVsZW1lbnQuXG4gICAgICovXG4gICAgc3RhdGljIHJlbW92ZUNsYXNzKGVsOiBIVE1MRWxlbWVudCwgY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGVsLmNsYXNzTGlzdClcbiAgICAgICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZWwuY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lLnJlcGxhY2UobmV3IFJlZ0V4cCgnKF58XFxcXGIpJyArIGNsYXNzTmFtZS5zcGxpdCgnICcpLmpvaW4oJ3wnKSArICcoXFxcXGJ8JCknLCAnZ2knKSwgJyAnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgY2xhc3MgZnJvbSBhIEhUTUxFbGVtZW50IHdoZW4gcHJlc2VudCwgb3IgYWRkcyBpdCB3aGVuIG5vdCBwcmVzZW50LlxuICAgICAqL1xuICAgIHN0YXRpYyB0b2dnbGVDbGFzcyhlbDogSFRNTEVsZW1lbnQsIGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGlmIChlbC5jbGFzc0xpc3QpIHtcbiAgICAgICAgICAgIGVsLmNsYXNzTGlzdC50b2dnbGUoY2xhc3NOYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBjbGFzc2VzID0gZWwuY2xhc3NOYW1lLnNwbGl0KCcgJyk7XG4gICAgICAgICAgICBsZXQgZXhpc3RpbmdJbmRleCA9IGNsYXNzZXMuaW5kZXhPZihjbGFzc05hbWUpO1xuXG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdJbmRleCA+PSAwKVxuICAgICAgICAgICAgICAgIGNsYXNzZXMuc3BsaWNlKGV4aXN0aW5nSW5kZXgsIDEpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaChjbGFzc05hbWUpO1xuXG4gICAgICAgICAgICBlbC5jbGFzc05hbWUgPSBjbGFzc2VzLmpvaW4oJyAnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBIVE1MRWxlbWVudCBmcm9tIHRoZSBET00uXG4gICAgICovXG4gICAgc3RhdGljIHJlbW92ZShlbDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhbGwgdGhlIGF0dHJpYnV0ZXMgb2YgYSBIVE1MRWxlbWVudCBhcyBrZXkgLyB2YWx1ZSBwYWlycy5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0QXR0cmlidXRlcyhlbDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgbGV0IGF0dHJzID0gZWwuYXR0cmlidXRlcywgb2JqID0ge30sIGkgPSAwO1xuICAgICAgICBmb3IgKDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBvYmpbYXR0cnNbaV0ubmFtZV0gPSBhdHRyc1tpXS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgYXR0cmlidXRlcyBvZiBhIEhUTUxFbGVtZW50LlxuICAgICAqL1xuICAgIHN0YXRpYyBzZXRBdHRyaWJ1dGVzKGVsOiBIVE1MRWxlbWVudCwgYXR0cmlidXRlczogb2JqZWN0KSB7XG4gICAgICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goKGspID0+IHtcbiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShrLCBhdHRyaWJ1dGVzW2tdKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgc3R5bGUgcHJvcGVydHkgb2YgYSBIVE1MRWxlbWVudC5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0U3R5bGUoZWw6IEhUTUxFbGVtZW50LCBzdHlsZVByb3A6IHN0cmluZykge1xuICAgICAgICBsZXQgdmFsdWU7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRWaWV3ID0gZWwub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcbiAgICAgICAgLy8gVzNDIHN0YW5kYXJkIHdheTpcbiAgICAgICAgaWYgKGRlZmF1bHRWaWV3ICYmIGRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUpIHtcbiAgICAgICAgICAgIC8vIHNhbml0aXplIHByb3BlcnR5IG5hbWUgdG8gY3NzIG5vdGF0aW9uIChoeXBlbiBzZXBhcmF0ZWQgd29yZHMgZWcuIGZvbnQtU2l6ZSlcbiAgICAgICAgICAgIHN0eWxlUHJvcCA9IHN0eWxlUHJvcC5yZXBsYWNlKC8oW0EtWl0pL2csICctJDEnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWwsIG51bGwpLmdldFByb3BlcnR5VmFsdWUoc3R5bGVQcm9wKTtcbiAgICAgICAgfSBlbHNlIGlmIChlbFsnY3VycmVudFN0eWxlJ10pIHsgLy8gSUVcbiAgICAgICAgICAgIC8vIHNhbml0aXplIHByb3BlcnR5IG5hbWUgdG8gY2FtZWxDYXNlXG4gICAgICAgICAgICBzdHlsZVByb3AgPSBzdHlsZVByb3AucmVwbGFjZSgvXFwtKFxcdykvZywgZnVuY3Rpb24oc3RyLCBsZXR0ZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhbHVlID0gZWxbJ2N1cnJlbnRTdHlsZSddW3N0eWxlUHJvcF07XG4gICAgICAgICAgICAvLyBjb252ZXJ0IG90aGVyIHVuaXRzIHRvIHBpeGVscyBvbiBJRVxuICAgICAgICAgICAgaWYgKC9eXFxkKyhlbXxwdHwlfGV4KT8kL2kudGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZExlZnQgPSBlbC5zdHlsZS5sZWZ0LCBvbGRSc0xlZnQgPSBlbFsncnVudGltZVN0eWxlJ10ubGVmdDtcbiAgICAgICAgICAgICAgICAgICAgZWxbJ3J1bnRpbWVTdHlsZSddLmxlZnQgPSBlbFsnY3VycmVudFN0eWxlJ10ubGVmdDtcbiAgICAgICAgICAgICAgICAgICAgZWwuc3R5bGUubGVmdCA9IHZhbHVlIHx8IDA7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZWwuc3R5bGVbJ3BpeGVsTGVmdCddICsgJ3B4JztcbiAgICAgICAgICAgICAgICAgICAgZWwuc3R5bGUubGVmdCA9IG9sZExlZnQ7XG4gICAgICAgICAgICAgICAgICAgIGVsWydydW50aW1lU3R5bGUnXS5sZWZ0ID0gb2xkUnNMZWZ0O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICAgICAgfSkodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgdmlld3BvcnQuXG4gICAgICovXG4gICAgc3RhdGljIHZpZXdwb3J0U2l6ZSgpIHtcbiAgICAgICAgbGV0IG9iaiA9IHt3aWR0aDp1bmRlZmluZWQsIGhlaWdodDp1bmRlZmluZWR9O1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmICh3aW5kb3cuaW5uZXJIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBvYmoud2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICAgICAgICAgICAgICBvYmouaGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvYmoud2lkdGggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgICAgICAgICAgICAgb2JqLmhlaWdodCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdG9kbzogbmF0aXZlXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykgeyB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgc3RhdGljIGNvcHlUb0NsaXBib2FyZChzdHI6IHN0cmluZykge1xuICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7ICAvLyBDcmVhdGUgYSA8dGV4dGFyZWE+IGVsZW1lbnRcbiAgICAgICAgZWwudmFsdWUgPSBzdHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGl0cyB2YWx1ZSB0byB0aGUgc3RyaW5nIHRoYXQgeW91IHdhbnQgY29waWVkXG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZSgncmVhZG9ubHknLCAnJyk7ICAgICAgICAgICAgICAgIC8vIE1ha2UgaXQgcmVhZG9ubHkgdG8gYmUgdGFtcGVyLXByb29mXG4gICAgICAgIGVsLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgZWwuc3R5bGUubGVmdCA9ICctOTk5OXB4JzsgICAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBvdXRzaWRlIHRoZSBzY3JlZW4gdG8gbWFrZSBpdCBpbnZpc2libGVcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlbCk7ICAgICAgICAgICAgICAgICAgLy8gQXBwZW5kIHRoZSA8dGV4dGFyZWE+IGVsZW1lbnQgdG8gdGhlIEhUTUwgZG9jdW1lbnRcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPVxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCkucmFuZ2VDb3VudCA+IDAgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGFueSBjb250ZW50IHNlbGVjdGVkIHByZXZpb3VzbHlcbiAgICAgICAgICAgICAgICA/IGRvY3VtZW50LmdldFNlbGVjdGlvbigpLmdldFJhbmdlQXQoMCkgICAgIC8vIFN0b3JlIHNlbGVjdGlvbiBpZiBmb3VuZFxuICAgICAgICAgICAgICAgIDogZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFyayBhcyBmYWxzZSB0byBrbm93IG5vIHNlbGVjdGlvbiBleGlzdGVkIGJlZm9yZVxuICAgICAgICBlbC5zZWxlY3QoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWxlY3QgdGhlIDx0ZXh0YXJlYT4gY29udGVudFxuICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpOyAgICAgICAgICAgICAgICAgICAvLyBDb3B5IC0gb25seSB3b3JrcyBhcyBhIHJlc3VsdCBvZiBhIHVzZXIgYWN0aW9uIChlLmcuIGNsaWNrIGV2ZW50cylcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChlbCk7ICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSA8dGV4dGFyZWE+IGVsZW1lbnRcbiAgICAgICAgaWYgKHNlbGVjdGVkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgYSBzZWxlY3Rpb24gZXhpc3RlZCBiZWZvcmUgY29weWluZ1xuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7ICAgIC8vIFVuc2VsZWN0IGV2ZXJ5dGhpbmcgb24gdGhlIEhUTUwgZG9jdW1lbnRcbiAgICAgICAgICAgIGRvY3VtZW50LmdldFNlbGVjdGlvbigpLmFkZFJhbmdlKHNlbGVjdGVkKTsgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBzZWxlY3Rpb25cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmYWRlSW4oZWw6IEhUTUxFbGVtZW50LCBkdXJhdGlvbjogbnVtYmVyID0gMzAwLCBkZWxheTogbnVtYmVyID0gMCwgZGlzcGxheTogc3RyaW5nID0gJ2Jsb2NrJyl7XG4gICAgICAgIGxldCBzdGVwID0gKDEgLyBkdXJhdGlvbikgKiAxMDtcbiAgICAgICAgZWwuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgZWwuc3R5bGUuZGlzcGxheSA9IGRpc3BsYXk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgKGZ1bmN0aW9uIGZhZGUoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbCA9IHBhcnNlRmxvYXQoZWwuc3R5bGUub3BhY2l0eSk7XG4gICAgICAgICAgICAgICAgaWYgKCEoKHZhbCArPSBzdGVwKSA+IDEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsLnN0eWxlLm9wYWNpdHkgPSB2YWwudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZhZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgIH0sIGRlbGF5KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZmFkZU91dChlbDogSFRNTEVsZW1lbnQsIGR1cmF0aW9uOiBudW1iZXIgPSAzMDAsIGRlbGF5OiBudW1iZXIgPSAwLCB2aXNpYmxlOiBib29sZWFuID0gZmFsc2Upe1xuICAgICAgICBsZXQgc3RlcCA9ICgxIC8gZHVyYXRpb24pICogMTA7XG4gICAgICAgIGVsLnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgKGZ1bmN0aW9uIGZhZGUoKSB7XG4gICAgICAgICAgICAgICAgbGV0IG9wYWNpdHk6IG51bWJlciA9IE51bWJlcihlbC5zdHlsZS5vcGFjaXR5KTtcbiAgICAgICAgICAgICAgICBvcGFjaXR5ID0gb3BhY2l0eSAtIHN0ZXA7XG4gICAgICAgICAgICAgICAgZWwuc3R5bGUub3BhY2l0eSA9IG9wYWNpdHkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICBpZiAob3BhY2l0eSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZpc2libGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWwuc3R5bGUub3BhY2l0eSA9ICcxJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmYWRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICB9LCBkZWxheSk7XG5cbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0VXJsUGFyYW1ldGVyQnlOYW1lKG5hbWU6IHN0cmluZykge1xuICAgICAgICBsZXQgbWF0Y2ggPSBSZWdFeHAoJ1s/Jl0nICsgbmFtZSArICc9KFteJl0qKScpLmV4ZWMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG4gICAgICAgIHJldHVybiBtYXRjaCAmJiBkZWNvZGVVUklDb21wb25lbnQobWF0Y2hbMV0ucmVwbGFjZSgvXFwrL2csICcgJykpO1xuICAgIH1cblxuXG59XG4iXX0=