UNPKG

@uex/web-extensions

Version:

Uex extensions for Angular 6+ web projects

268 lines 25.3 kB
/** * @fileoverview added by tsickle * Generated from: lib/modules/button/directives/ripple.directive.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Directive, ElementRef, Input, HostListener } from '@angular/core'; import * as _ from 'lodash'; /** * Adiciona o efeito "ripple" ao clicar em um elemento * @abstract */ export class RippleDirectiveBase { /** * @param {?} elementRef */ constructor(elementRef) { this.elementRef = elementRef; /** * @ignore */ this._no_ripple = false; this._default_ripple_opacity = '0.15'; } /** * @private * @param {?} no_ripple * @return {?} */ set set_no_ripple(no_ripple) { this.no_ripple = _.isString(no_ripple) && no_ripple == '' ? true : (_.isBoolean(no_ripple) ? ((/** @type {?} */ (no_ripple))) : true); } /** * @param {?} value * @return {?} */ set no_ripple(value) { this._no_ripple = value; } /** * @return {?} */ get no_ripple() { return this._no_ripple; } /** * @param {?} e * @return {?} */ _onClick(e) { if (this.no_ripple) { return; } /** @type {?} */ const targetEl = this.elementRef ? this.elementRef.nativeElement : null; if (!targetEl) { return; } if (this._animate_timeout) { clearTimeout(this._animate_timeout); } /** @type {?} */ let rippleEl = ((/** @type {?} */ (targetEl.querySelector('.ripple')))); if (!!rippleEl) { rippleEl.classList.remove('animate'); } else { rippleEl = document.createElement('span'); rippleEl.classList.add('ripple'); targetEl.appendChild(rippleEl); } /** @type {?} */ let offset_x = e.offsetX; /** @type {?} */ let offset_y = e.offsetY; if (e.target != targetEl) { /** @type {?} */ const relative_offset = this._relativeOffset((/** @type {?} */ (e.target)), targetEl); offset_x += relative_offset.left; offset_y += relative_offset.top; } rippleEl.style.width = rippleEl.style.height = Math.max(targetEl.offsetWidth, targetEl.offsetHeight) + 'px'; rippleEl.style.left = (offset_x - rippleEl.offsetWidth / 2) + 'px'; rippleEl.style.top = (offset_y - rippleEl.offsetHeight / 2) + 'px'; // Apply element color and background color to wrapper /** @type {?} */ const element_style = window.getComputedStyle(targetEl, null); /** @type {?} */ const color = element_style.color; /** @type {?} */ const background_contrast_color = this._contrast(this._contrast(color)); rippleEl.style.color = color; rippleEl.style.background = background_contrast_color; rippleEl.classList.add('animate'); this._animate_timeout = setTimeout((/** * @return {?} */ () => rippleEl.classList.remove('animate')), 650); } /** * @private * @param {?} color * @param {?=} bw * @return {?} */ _contrast(color, bw = true) { /** @type {?} */ let colorHex = this._toHexadecimal(color); if (!/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(colorHex)) { return '#FFFFFF'; } if (colorHex.length === 4) { colorHex = colorHex.replace(/^#(.)(.)(.)/i, '#$1$1$2$2$3$3'); } /** @type {?} */ const r = parseInt(colorHex.substr(1, 2), 16); /** @type {?} */ const g = parseInt(colorHex.substr(3, 2), 16); /** @type {?} */ const b = parseInt(colorHex.substr(5, 2), 16); if (bw) { // https://github.com/lffg/yiq/blob/master/index.js /** @type {?} */ const yiq = ((r * 299) + (g * 587) + (b * 114)) / 1000; return this._toRGBA(yiq >= 128 ? '#000000' : '#FFFFFF'); } return this._toRGBA(`#${this._padZero(r)}${this._padZero(g)}${this._padZero(b)}`); } /** * @private * @param {?} color * @param {?=} allow_alpha * @return {?} */ _toHexadecimal(color, allow_alpha = false) { if (!color || (color && color.indexOf('(') == -1)) { return color; } /** @type {?} */ const parts = color.replace(/(rgba|rgb)/g, '').replace(/[\(\)]/g, '').split(',').map((/** * @param {?} part * @return {?} */ (part) => _.trim(part))); /** @type {?} */ const r = this._padZero(parseInt(parts[0], 10).toString(16)); /** @type {?} */ const g = this._padZero(parseInt(parts[1], 10).toString(16)); /** @type {?} */ const b = this._padZero(parseInt(parts[2], 10).toString(16)); if (parts[3] && allow_alpha) { /** @type {?} */ const a = parseFloat(parseFloat(parts[3].substring(0, parts[3].length - 1)).toFixed(2)); return `#${r}${g}${b}${this._padZero((a * 255).toString(16).substring(0, 2))}`; } return `#${r}${g}${b}`; } /** * @private * @param {?} color * @param {?=} opacity * @return {?} */ _toRGBA(color, opacity = this._default_ripple_opacity) { /** @type {?} */ const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(color); return result ? `rgba(${parseInt(result[1], 16)}, ${parseInt(result[2], 16)}, ${parseInt(result[3], 16)}, ${opacity})` : color; } /** * @private * @param {?} str * @param {?=} len * @return {?} */ _padZero(str, len = 2) { if (_.isNumber(str)) { str = str.toString(); } /** @type {?} */ const zeros = new Array(len).join('0'); return (zeros + str).slice(-len); } /** * @private * @param {?} child_element * @param {?} parent_element * @return {?} */ _relativeOffset(child_element, parent_element) { /** @type {?} */ const offset_parent_element = ((/** @type {?} */ (child_element.offsetParent))); /** @type {?} */ const parent_rect = offset_parent_element.getBoundingClientRect(); /** @type {?} */ const child_rect = child_element.getBoundingClientRect(); /** @type {?} */ const offset = { top: child_rect.top - parent_rect.top, left: child_rect.left - parent_rect.left } // Reached top of document ; // Reached top of document if (offset_parent_element.tagName === 'BODY') { return offset; } // Parent element contains the 'top' element we want the offset to be relative to if (child_element.parentElement === parent_element) { return offset; } // Reached the 'top' element we want the offset to be relative to if (offset_parent_element === parent_element) { return offset; } // Get parent's relative offset /** @type {?} */ const parent_offset = this._relativeOffset(offset_parent_element, parent_element); offset.top += parent_offset.top; offset.left += parent_offset.left; return offset; } } RippleDirectiveBase.propDecorators = { set_no_ripple: [{ type: Input, args: ['no-ripple',] }], _onClick: [{ type: HostListener, args: ['mousedown', ['$event'],] }] }; if (false) { /** * @ignore * @type {?} * @protected */ RippleDirectiveBase.prototype._no_ripple; /** * @type {?} * @private */ RippleDirectiveBase.prototype._default_ripple_opacity; /** * @type {?} * @private */ RippleDirectiveBase.prototype._animate_timeout; /** @type {?} */ RippleDirectiveBase.prototype.elementRef; } export class RippleDirective extends RippleDirectiveBase { /** * @param {?} elementRef */ constructor(elementRef) { super(elementRef); this.elementRef = elementRef; } } RippleDirective.decorators = [ { type: Directive, args: [{ selector: '[with-ripple], .with-ripple' },] } ]; /** @nocollapse */ RippleDirective.ctorParameters = () => [ { type: ElementRef } ]; if (false) { /** @type {?} */ RippleDirective.prototype.elementRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmlwcGxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B1ZXgvd2ViLWV4dGVuc2lvbnMvIiwic291cmNlcyI6WyJsaWIvbW9kdWxlcy9idXR0b24vZGlyZWN0aXZlcy9yaXBwbGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzRSxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQzs7Ozs7QUFLNUIsTUFBTSxPQUFnQixtQkFBbUI7Ozs7SUFPdkMsWUFDUyxVQUFzQjtRQUF0QixlQUFVLEdBQVYsVUFBVSxDQUFZOzs7O1FBYXJCLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFFckIsNEJBQXVCLEdBQUcsTUFBTSxDQUFDO0lBZHRDLENBQUM7Ozs7OztJQVBKLElBQ1ksYUFBYSxDQUFDLFNBQTJCO1FBQ25ELElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBUyxTQUFTLEVBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1SCxDQUFDOzs7OztJQU1ELElBQVcsU0FBUyxDQUFDLEtBQWM7UUFDakMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDMUIsQ0FBQzs7OztJQUNELElBQVcsU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQzs7Ozs7SUFVNkMsUUFBUSxDQUFDLENBQWE7UUFDbEUsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQUUsT0FBTztTQUFFOztjQUV6QixRQUFR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LENBQUMsSUFBSTtTQUN6QztRQUVELDBCQUEwQjs7UUFBMUIsMEJBQTBCO1FBQzFCLElBQUkscUJBQXFCLENBQUMsT0FBTyxLQUFLLE1BQU0sRUFBRTtZQUFFLE9BQU8sTUFBTSxDQUFDO1NBQUU7UUFFaEUsaUZBQWlGO1FBQ2pGLElBQUksYUFBYSxDQUFDLGFBQWEsS0FBSyxjQUFjLEVBQUU7WUFBRSxPQUFPLE1BQU0sQ0FBQztTQUFFO1FBRXRFLGlFQUFpRTtRQUNqRSxJQUFJLHFCQUFxQixLQUFLLGNBQWMsRUFBRTtZQUFFLE9BQU8sTUFBTSxDQUFDO1NBQUU7OztjQUcxRCxhQUFhLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsRUFBRSxjQUFjLENBQUM7UUFDakYsTUFBTSxDQUFDLEdBQUcsSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxJQUFJLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQztRQUNsQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDOzs7NEJBbEpBLEtBQUssU0FBQyxXQUFXO3VCQXdCakIsWUFBWSxTQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7Ozs7Ozs7SUFMckMseUNBQTZCOzs7OztJQUU3QixzREFBeUM7Ozs7O0lBQ3pDLCtDQUE4Qjs7SUFoQjVCLHlDQUE2Qjs7QUFrSmpDLE1BQU0sT0FBTyxlQUFnQixTQUFRLG1CQUFtQjs7OztJQUN0RCxZQUNTLFVBQXNCO1FBRTdCLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUZWLGVBQVUsR0FBVixVQUFVLENBQVk7SUFHL0IsQ0FBQzs7O1lBUkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSw2QkFBNkI7YUFDeEM7Ozs7WUFoS21CLFVBQVU7Ozs7SUFtSzFCLHFDQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xyXG5cclxuLyoqXHJcbiAqIEFkaWNpb25hIG8gZWZlaXRvIFwicmlwcGxlXCIgYW8gY2xpY2FyIGVtIHVtIGVsZW1lbnRvXHJcbiAqL1xyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUmlwcGxlRGlyZWN0aXZlQmFzZSB7XHJcblxyXG4gIEBJbnB1dCgnbm8tcmlwcGxlJylcclxuICBwcml2YXRlIHNldCBzZXRfbm9fcmlwcGxlKG5vX3JpcHBsZTogYm9vbGVhbiB8IHN0cmluZykge1xyXG4gICAgdGhpcy5ub19yaXBwbGUgPSBfLmlzU3RyaW5nKG5vX3JpcHBsZSkgJiYgbm9fcmlwcGxlID09ICcnID8gdHJ1ZSA6IChfLmlzQm9vbGVhbihub19yaXBwbGUpID8gKDxib29sZWFuPm5vX3JpcHBsZSkgOiB0cnVlKTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWZcclxuICApIHt9XHJcblxyXG4gIHB1YmxpYyBzZXQgbm9fcmlwcGxlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9ub19yaXBwbGUgPSB2YWx1ZTtcclxuICB9XHJcbiAgcHVibGljIGdldCBub19yaXBwbGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbm9fcmlwcGxlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBfbm9fcmlwcGxlID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgX2RlZmF1bHRfcmlwcGxlX29wYWNpdHkgPSAnMC4xNSc7XHJcbiAgcHJpdmF0ZSBfYW5pbWF0ZV90aW1lb3V0OiBhbnk7XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicsIFsnJGV2ZW50J10pIHB1YmxpYyBfb25DbGljayhlOiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5ub19yaXBwbGUpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgY29uc3QgdGFyZ2V0RWwgPSB0aGlzLmVsZW1lbnRSZWYgPyB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCA6IG51bGw7XHJcbiAgICBpZiAoIXRhcmdldEVsKSB7IHJldHVybjsgfVxyXG5cclxuICAgIGlmICh0aGlzLl9hbmltYXRlX3RpbWVvdXQpIHsgY2xlYXJUaW1lb3V0KHRoaXMuX2FuaW1hdGVfdGltZW91dCk7IH1cclxuXHJcbiAgICBsZXQgcmlwcGxlRWwgPSAoPEhUTUxFbGVtZW50PnRhcmdldEVsLnF1ZXJ5U2VsZWN0b3IoJy5yaXBwbGUnKSk7XHJcblxyXG4gICAgaWYgKCEhcmlwcGxlRWwpIHtcclxuICAgICAgcmlwcGxlRWwuY2xhc3NMaXN0LnJlbW92ZSgnYW5pbWF0ZScpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmlwcGxlRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgIHJpcHBsZUVsLmNsYXNzTGlzdC5hZGQoJ3JpcHBsZScpO1xyXG4gICAgICB0YXJnZXRFbC5hcHBlbmRDaGlsZChyaXBwbGVFbCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG9mZnNldF94ID0gZS5vZmZzZXRYO1xyXG4gICAgbGV0IG9mZnNldF95ID0gZS5vZmZzZXRZO1xyXG5cclxuICAgIGlmIChlLnRhcmdldCAhPSB0YXJnZXRFbCkge1xyXG4gICAgICBjb25zdCByZWxhdGl2ZV9vZmZzZXQgPSB0aGlzLl9yZWxhdGl2ZU9mZnNldCg8SFRNTEVsZW1lbnQ+ZS50YXJnZXQsIHRhcmdldEVsKTtcclxuXHJcbiAgICAgIG9mZnNldF94ICs9IHJlbGF0aXZlX29mZnNldC5sZWZ0O1xyXG4gICAgICBvZmZzZXRfeSArPSByZWxhdGl2ZV9vZmZzZXQudG9wO1xyXG4gICAgfVxyXG5cclxuICAgIHJpcHBsZUVsLnN0eWxlLndpZHRoID0gcmlwcGxlRWwuc3R5bGUuaGVpZ2h0ID0gTWF0aC5tYXgodGFyZ2V0RWwub2Zmc2V0V2lkdGgsIHRhcmdldEVsLm9mZnNldEhlaWdodCkgKyAncHgnO1xyXG4gICAgcmlwcGxlRWwuc3R5bGUubGVmdCA9IChvZmZzZXRfeCAtIHJpcHBsZUVsLm9mZnNldFdpZHRoIC8gMikgKyAncHgnO1xyXG4gICAgcmlwcGxlRWwuc3R5bGUudG9wID0gKG9mZnNldF95IC0gcmlwcGxlRWwub2Zmc2V0SGVpZ2h0IC8gMikgKyAncHgnO1xyXG5cclxuICAgIC8vIEFwcGx5IGVsZW1lbnQgY29sb3IgYW5kIGJhY2tncm91bmQgY29sb3IgdG8gd3JhcHBlclxyXG4gICAgY29uc3QgZWxlbWVudF9zdHlsZSAgICA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRhcmdldEVsLCBudWxsKTtcclxuICAgIGNvbnN0IGNvbG9yICAgICAgICAgICA9IGVsZW1lbnRfc3R5bGUuY29sb3I7XHJcblxyXG4gICAgY29uc3QgYmFja2dyb3VuZF9jb250cmFzdF9jb2xvciA9IHRoaXMuX2NvbnRyYXN0KHRoaXMuX2NvbnRyYXN0KGNvbG9yKSk7XHJcblxyXG4gICAgcmlwcGxlRWwuc3R5bGUuY29sb3IgPSBjb2xvcjtcclxuICAgIHJpcHBsZUVsLnN0eWxlLmJhY2tncm91bmQgPSBiYWNrZ3JvdW5kX2NvbnRyYXN0X2NvbG9yO1xyXG5cclxuICAgIHJpcHBsZUVsLmNsYXNzTGlzdC5hZGQoJ2FuaW1hdGUnKTtcclxuICAgIHRoaXMuX2FuaW1hdGVfdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gcmlwcGxlRWwuY2xhc3NMaXN0LnJlbW92ZSgnYW5pbWF0ZScpLCA2NTApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY29udHJhc3QoY29sb3I6IHN0cmluZywgYnc6IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nIHtcclxuXHJcbiAgICBsZXQgY29sb3JIZXggPSB0aGlzLl90b0hleGFkZWNpbWFsKGNvbG9yKTtcclxuXHJcbiAgICBpZiAoISAvKF4jWzAtOUEtRl17Nn0kKXwoXiNbMC05QS1GXXszfSQpL2kudGVzdChjb2xvckhleCkpIHtcclxuICAgICAgcmV0dXJuICcjRkZGRkZGJztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29sb3JIZXgubGVuZ3RoID09PSA0KSB7XHJcbiAgICAgIGNvbG9ySGV4ID0gY29sb3JIZXgucmVwbGFjZSgvXiMoLikoLikoLikvaSwgJyMkMSQxJDIkMiQzJDMnKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByID0gcGFyc2VJbnQoY29sb3JIZXguc3Vic3RyKDEsIDIpLCAxNik7XHJcbiAgICBjb25zdCBnID0gcGFyc2VJbnQoY29sb3JIZXguc3Vic3RyKDMsIDIpLCAxNik7XHJcbiAgICBjb25zdCBiID0gcGFyc2VJbnQoY29sb3JIZXguc3Vic3RyKDUsIDIpLCAxNik7XHJcblxyXG4gICAgaWYgKGJ3KSB7XHJcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9sZmZnL3lpcS9ibG9iL21hc3Rlci9pbmRleC5qc1xyXG4gICAgICBjb25zdCB5aXEgPSAoKHIgKiAyOTkpICsgKGcgKiA1ODcpICsgKGIgKiAxMTQpKSAvIDEwMDA7XHJcbiAgICAgIHJldHVybiB0aGlzLl90b1JHQkEoeWlxID49IDEyOCA/ICcjMDAwMDAwJyA6ICcjRkZGRkZGJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX3RvUkdCQShgIyR7dGhpcy5fcGFkWmVybyhyKX0ke3RoaXMuX3BhZFplcm8oZyl9JHt0aGlzLl9wYWRaZXJvKGIpfWApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdG9IZXhhZGVjaW1hbChjb2xvcjogc3RyaW5nLCBhbGxvd19hbHBoYTogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nIHtcclxuICAgIGlmICghY29sb3IgfHwgKGNvbG9yICYmIGNvbG9yLmluZGV4T2YoJygnKSA9PSAtMSkpIHsgcmV0dXJuIGNvbG9yOyB9XHJcblxyXG4gICAgY29uc3QgcGFydHMgPSBjb2xvci5yZXBsYWNlKC8ocmdiYXxyZ2IpL2csICcnKS5yZXBsYWNlKC9bXFwoXFwpXS9nLCAnJykuc3BsaXQoJywnKS5tYXAoKHBhcnQpID0+IF8udHJpbShwYXJ0KSk7XHJcblxyXG4gICAgY29uc3QgciA9IHRoaXMuX3BhZFplcm8ocGFyc2VJbnQocGFydHNbMF0sIDEwKS50b1N0cmluZygxNikpO1xyXG4gICAgY29uc3QgZyA9IHRoaXMuX3BhZFplcm8ocGFyc2VJbnQocGFydHNbMV0sIDEwKS50b1N0cmluZygxNikpO1xyXG4gICAgY29uc3QgYiA9IHRoaXMuX3BhZFplcm8ocGFyc2VJbnQocGFydHNbMl0sIDEwKS50b1N0cmluZygxNikpO1xyXG5cclxuICAgIGlmIChwYXJ0c1szXSAmJiBhbGxvd19hbHBoYSkge1xyXG4gICAgICBjb25zdCBhID0gcGFyc2VGbG9hdChwYXJzZUZsb2F0KHBhcnRzWzNdLnN1YnN0cmluZygwLCBwYXJ0c1szXS5sZW5ndGggLSAxKSkudG9GaXhlZCgyKSk7XHJcbiAgICAgIHJldHVybiBgIyR7cn0ke2d9JHtifSR7dGhpcy5fcGFkWmVybygoYSAqIDI1NSkudG9TdHJpbmcoMTYpLnN1YnN0cmluZygwLCAyKSl9YDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYCMke3J9JHtnfSR7Yn1gO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdG9SR0JBKGNvbG9yOiBzdHJpbmcsIG9wYWNpdHk6IHN0cmluZyA9IHRoaXMuX2RlZmF1bHRfcmlwcGxlX29wYWNpdHkpIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IC9eIz8oW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KShbYS1mXFxkXXsyfSkkL2kuZXhlYyhjb2xvcik7XHJcbiAgICByZXR1cm4gcmVzdWx0ID8gYHJnYmEoJHtwYXJzZUludChyZXN1bHRbMV0sIDE2KX0sICR7cGFyc2VJbnQocmVzdWx0WzJdLCAxNil9LCAke3BhcnNlSW50KHJlc3VsdFszXSwgMTYpfSwgJHtvcGFjaXR5fSlgIDogY29sb3I7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9wYWRaZXJvKHN0cjogc3RyaW5nIHwgbnVtYmVyLCBsZW46IG51bWJlciA9IDIpOiBzdHJpbmcge1xyXG4gICAgaWYgKF8uaXNOdW1iZXIoc3RyKSkgeyBzdHIgPSBzdHIudG9TdHJpbmcoKTsgfVxyXG4gICAgY29uc3QgemVyb3MgPSBuZXcgQXJyYXkobGVuKS5qb2luKCcwJyk7XHJcbiAgICByZXR1cm4gKHplcm9zICsgc3RyKS5zbGljZSgtbGVuKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3JlbGF0aXZlT2Zmc2V0KGNoaWxkX2VsZW1lbnQ6IEhUTUxFbGVtZW50LCBwYXJlbnRfZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgIGNvbnN0IG9mZnNldF9wYXJlbnRfZWxlbWVudCA9ICg8SFRNTEVsZW1lbnQ+Y2hpbGRfZWxlbWVudC5vZmZzZXRQYXJlbnQpO1xyXG4gICAgY29uc3QgcGFyZW50X3JlY3QgPSBvZmZzZXRfcGFyZW50X2VsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCBjaGlsZF9yZWN0ID0gY2hpbGRfZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICBjb25zdCBvZmZzZXQgPSB7XHJcbiAgICAgIHRvcDogY2hpbGRfcmVjdC50b3AgLSBwYXJlbnRfcmVjdC50b3AsXHJcbiAgICAgIGxlZnQ6IGNoaWxkX3JlY3QubGVmdCAtIHBhcmVudF9yZWN0LmxlZnRcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZWFjaGVkIHRvcCBvZiBkb2N1bWVudFxyXG4gICAgaWYgKG9mZnNldF9wYXJlbnRfZWxlbWVudC50YWdOYW1lID09PSAnQk9EWScpIHsgcmV0dXJuIG9mZnNldDsgfVxyXG5cclxuICAgIC8vIFBhcmVudCBlbGVtZW50IGNvbnRhaW5zIHRoZSAndG9wJyBlbGVtZW50IHdlIHdhbnQgdGhlIG9mZnNldCB0byBiZSByZWxhdGl2ZSB0b1xyXG4gICAgaWYgKGNoaWxkX2VsZW1lbnQucGFyZW50RWxlbWVudCA9PT0gcGFyZW50X2VsZW1lbnQpIHsgcmV0dXJuIG9mZnNldDsgfVxyXG5cclxuICAgIC8vIFJlYWNoZWQgdGhlICd0b3AnIGVsZW1lbnQgd2Ugd2FudCB0aGUgb2Zmc2V0IHRvIGJlIHJlbGF0aXZlIHRvXHJcbiAgICBpZiAob2Zmc2V0X3BhcmVudF9lbGVtZW50ID09PSBwYXJlbnRfZWxlbWVudCkgeyByZXR1cm4gb2Zmc2V0OyB9XHJcblxyXG4gICAgLy8gR2V0IHBhcmVudCdzIHJlbGF0aXZlIG9mZnNldFxyXG4gICAgY29uc3QgcGFyZW50X29mZnNldCA9IHRoaXMuX3JlbGF0aXZlT2Zmc2V0KG9mZnNldF9wYXJlbnRfZWxlbWVudCwgcGFyZW50X2VsZW1lbnQpO1xyXG4gICAgb2Zmc2V0LnRvcCArPSBwYXJlbnRfb2Zmc2V0LnRvcDtcclxuICAgIG9mZnNldC5sZWZ0ICs9IHBhcmVudF9vZmZzZXQubGVmdDtcclxuICAgIHJldHVybiBvZmZzZXQ7XHJcbiAgfVxyXG59XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1t3aXRoLXJpcHBsZV0sIC53aXRoLXJpcHBsZSdcclxufSlcclxuZXhwb3J0IGNsYXNzIFJpcHBsZURpcmVjdGl2ZSBleHRlbmRzIFJpcHBsZURpcmVjdGl2ZUJhc2Uge1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWZcclxuICApIHtcclxuICAgIHN1cGVyKGVsZW1lbnRSZWYpXHJcbiAgfVxyXG59XHJcbiJdfQ==