UNPKG

@doku-dev/doku-fragment

Version:

A new Angular UI library that moving away from Bootstrap and built from scratch.

189 lines 26 kB
import { Directive, HostBinding, Inject, Input, Optional, } from '@angular/core'; import { ReplaySubject, filter, fromEvent, startWith, takeUntil } from 'rxjs'; import { DokuTable } from './table.directive'; import * as i0 from "@angular/core"; import * as i1 from "./table.directive"; export var DokuStickyColumnPosition; (function (DokuStickyColumnPosition) { DokuStickyColumnPosition["Left"] = "left"; DokuStickyColumnPosition["Right"] = "right"; })(DokuStickyColumnPosition || (DokuStickyColumnPosition = {})); export class DokuTableStickyColumn { constructor(elementRef, renderer, ngZone, dokuTable) { this.elementRef = elementRef; this.renderer = renderer; this.ngZone = ngZone; this.dokuTable = dokuTable; this.destroy$ = new ReplaySubject(); } get element() { return this.elementRef.nativeElement; } get isStickyLeft() { return this.position === DokuStickyColumnPosition.Left; } get isStickyRight() { return this.position === DokuStickyColumnPosition.Right; } ngOnChanges(changes) { if (changes['position']?.previousValue !== changes['position']?.currentValue) { this.ngZone.runOutsideAngular(() => { this.observer?.disconnect(); setTimeout(() => { if (this.isStickyRight) this.handleDynamicStyleRight(); if (this.isStickyLeft) this.handleDynamicStyleLeft(); }, 0); }); } } ngAfterViewInit() { // Giving delay to detect table container being initialized. setTimeout(() => { this.watchTableContainerScrollEvent(); }, 0); } ngOnDestroy() { this.observer?.disconnect(); this.destroy$.next(true); this.destroy$.complete(); } handleDynamicStyleRight() { // Get next sticky column const nextStickyColumn = this.element.nextElementSibling; if (!nextStickyColumn) return; if (!nextStickyColumn.classList.contains('d-table-sticky-column-right')) return; this.observer = new ResizeObserver(() => { // If has next sticky column, get the width of the column. const nextStickyColumnWidth = this.getSiblingElementClientWidth(nextStickyColumn, 'next'); // Set the start `right` point of the current sticky column // from the next sticky column width. const rightValue = nextStickyColumnWidth + 'px'; this.renderer.setStyle(this.element, 'right', rightValue); }); if (this.element.parentElement) { this.observer.observe(this.element.parentElement); } } handleDynamicStyleLeft() { // Get previous sticky column const prevStickyColumn = this.element.previousElementSibling; if (!prevStickyColumn) return; // if (prevStickyColumn.classList.contains('d-table-sticky-column-left')) return; this.observer = new ResizeObserver(() => { // If has previous sticky column, get the width of the column. const prevStickyColumnWidth = this.getSiblingElementClientWidth(prevStickyColumn, 'previous'); // Set the start `left` point of the current sticky column // from the prev sticky column width. const leftValue = prevStickyColumnWidth + 'px'; this.renderer.setStyle(this.element, 'left', leftValue); }); if (this.element.parentElement) { this.observer.observe(this.element.parentElement); } } getSiblingElementClientWidth(nextElement, siblingPosition) { const sibling = siblingPosition === 'previous' ? nextElement.previousElementSibling : nextElement.nextElementSibling; if (sibling) { const siblingClientWidth = this.getSiblingElementClientWidth(sibling, siblingPosition); return nextElement.getBoundingClientRect().width + siblingClientWidth; } return nextElement.getBoundingClientRect().width; } watchTableContainerScrollEvent() { this.ngZone.runOutsideAngular(() => { const tableElement = this.dokuTable?.['elementRef'].nativeElement; const tableContainerElement = this.dokuTable?.['containerElement']; if (!tableContainerElement || !tableElement) return; fromEvent(tableContainerElement, 'scroll') .pipe(startWith(new Event('scroll')), filter(() => !!this.position), takeUntil(this.destroy$)) .subscribe(() => { this.handleStickyLeftShadow(tableElement, tableContainerElement); this.handleStickyRightShadow(tableElement, tableContainerElement); }); }); } handleStickyLeftShadow(_, tableContainerElement) { if (!this.isLastStickyColumn()) return; if (this.position !== DokuStickyColumnPosition.Left) return; tableContainerElement.scrollLeft > 0 ? this.toggleShadowClass('add') : this.toggleShadowClass('remove'); } handleStickyRightShadow(tableElement, tableContainerElement) { if (!this.isLastStickyColumn()) return; if (this.position !== DokuStickyColumnPosition.Right) return; // Don't need to provide the shadow because the table element has no more columns to scroll. if (tableElement.clientWidth < tableContainerElement.clientWidth) return; const offsetWidth = tableElement.clientWidth - tableContainerElement.clientWidth; const offsetScroll = offsetWidth - tableContainerElement.scrollLeft; // Giving check offset to 0.5 because the client width value is rounded to nearest integer. offsetScroll > 0.5 ? this.toggleShadowClass('add') : this.toggleShadowClass('remove'); } /** * Check whether this column is the last sticky column. * * For the `left` position, will check if no sticky column after. * For the `right` position, will check if no sticky column before. */ isLastStickyColumn() { if (this.isStickyLeft) { const nextElement = this.element.nextElementSibling; if (nextElement?.classList.contains('d-table-sticky-column-left')) return false; return true; } if (this.isStickyRight) { const prevElement = this.element.previousElementSibling; if (prevElement?.classList.contains('d-table-sticky-column-right')) return false; return true; } return false; } toggleShadowClass(type) { if (type === 'add') { this.renderer.addClass(this.element, 'd-table-sticky-column-shadow'); } if (type === 'remove') { this.renderer.removeClass(this.element, 'd-table-sticky-column-shadow'); } } } DokuTableStickyColumn.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuTableStickyColumn, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: DokuTable, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); DokuTableStickyColumn.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: DokuTableStickyColumn, isStandalone: true, selector: "th[doku-sticky-column], td[doku-sticky-column]", inputs: { position: ["doku-sticky-column", "position"] }, host: { properties: { "class.d-table-sticky-column-left": "this.isStickyLeft", "class.d-table-sticky-column-right": "this.isStickyRight" } }, exportAs: ["dokuStickyColumn"], usesOnChanges: true, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuTableStickyColumn, decorators: [{ type: Directive, args: [{ selector: 'th[doku-sticky-column], td[doku-sticky-column]', exportAs: 'dokuStickyColumn', standalone: true, }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.NgZone }, { type: i1.DokuTable, decorators: [{ type: Optional }, { type: Inject, args: [DokuTable] }] }]; }, propDecorators: { position: [{ type: Input, args: ['doku-sticky-column'] }], isStickyLeft: [{ type: HostBinding, args: ['class.d-table-sticky-column-left'] }], isStickyRight: [{ type: HostBinding, args: ['class.d-table-sticky-column-right'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtc3RpY2t5LWNvbHVtbi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kb2t1LWZyYWdtZW50L3NyYy9saWIvdGFibGUvdGFibGUtc3RpY2t5LWNvbHVtbi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxXQUFXLEVBQ1gsTUFBTSxFQUNOLEtBQUssRUFJTCxRQUFRLEdBR1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7QUFFOUMsTUFBTSxDQUFOLElBQVksd0JBR1g7QUFIRCxXQUFZLHdCQUF3QjtJQUNsQyx5Q0FBYSxDQUFBO0lBQ2IsMkNBQWUsQ0FBQTtBQUNqQixDQUFDLEVBSFcsd0JBQXdCLEtBQXhCLHdCQUF3QixRQUduQztBQU9ELE1BQU0sT0FBTyxxQkFBcUI7SUFNaEMsWUFDVSxVQUFzQixFQUN0QixRQUFtQixFQUNuQixNQUFjLEVBQ2lCLFNBQXFCO1FBSHBELGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2lCLGNBQVMsR0FBVCxTQUFTLENBQVk7UUFOdEQsYUFBUSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7SUFPcEMsQ0FBQztJQUVKLElBQWMsT0FBTztRQUNuQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxJQUNjLFlBQVk7UUFDeEIsT0FBTyxJQUFJLENBQUMsUUFBUSxLQUFLLHdCQUF3QixDQUFDLElBQUksQ0FBQztJQUN6RCxDQUFDO0lBRUQsSUFD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MEJBV0ksUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxTQUFTOzRDQVRGLFFBQVE7c0JBQXBDLEtBQUs7dUJBQUMsb0JBQW9CO2dCQWlCYixZQUFZO3NCQUR6QixXQUFXO3VCQUFDLGtDQUFrQztnQkFNakMsYUFBYTtzQkFEMUIsV0FBVzt1QkFBQyxtQ0FBbUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPcHRpb25hbCxcbiAgUmVuZGVyZXIyLFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIGZpbHRlciwgZnJvbUV2ZW50LCBzdGFydFdpdGgsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRG9rdVRhYmxlIH0gZnJvbSAnLi90YWJsZS5kaXJlY3RpdmUnO1xuXG5leHBvcnQgZW51bSBEb2t1U3RpY2t5Q29sdW1uUG9zaXRpb24ge1xuICBMZWZ0ID0gJ2xlZnQnLFxuICBSaWdodCA9ICdyaWdodCcsXG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ3RoW2Rva3Utc3RpY2t5LWNvbHVtbl0sIHRkW2Rva3Utc3RpY2t5LWNvbHVtbl0nLFxuICBleHBvcnRBczogJ2Rva3VTdGlja3lDb2x1bW4nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBEb2t1VGFibGVTdGlja3lDb2x1bW4gaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBJbnB1dCgnZG9rdS1zdGlja3ktY29sdW1uJykgcG9zaXRpb24/OiBEb2t1U3RpY2t5Q29sdW1uUG9zaXRpb247XG5cbiAgcHJpdmF0ZSBvYnNlcnZlcj86IFJlc2l6ZU9ic2VydmVyO1xuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFJlcGxheVN1YmplY3QoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChEb2t1VGFibGUpIHByaXZhdGUgZG9rdVRhYmxlPzogRG9rdVRhYmxlXG4gICkge31cblxuICBwcm90ZWN0ZWQgZ2V0IGVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZC10YWJsZS1zdGlja3ktY29sdW1uLWxlZnQnKVxuICBwcm90ZWN0ZWQgZ2V0IGlzU3RpY2t5TGVmdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wb3NpdGlvbiA9PT0gRG9rdVN0aWNreUNvbHVtblBvc2l0aW9uLkxlZnQ7XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmQtdGFibGUtc3RpY2t5LWNvbHVtbi1yaWdodCcpXG4gIHByb3RlY3RlZCBnZXQgaXNTdGlja3lSaWdodCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wb3NpdGlvbiA9PT0gRG9rdVN0aWNreUNvbHVtblBvc2l0aW9uLlJpZ2h0O1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydwb3NpdGlvbiddPy5wcmV2aW91c1ZhbHVlICE9PSBjaGFuZ2VzWydwb3NpdGlvbiddPy5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgdGhpcy5vYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmlzU3RpY2t5UmlnaHQpIHRoaXMuaGFuZGxlRHluYW1pY1N0eWxlUmlnaHQoKTtcbiAgICAgICAgICBpZiAodGhpcy5pc1N0aWNreUxlZnQpIHRoaXMuaGFuZGxlRHluYW1pY1N0eWxlTGVmdCgpO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAvLyBHaXZpbmcgZGVsYXkgdG8gZGV0ZWN0IHRhYmxlIGNvbnRhaW5lciBiZWluZyBpbml0aWFsaXplZC5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMud2F0Y2hUYWJsZUNvbnRhaW5lclNjcm9sbEV2ZW50KCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRHluYW1pY1N0eWxlUmlnaHQoKSB7XG4gICAgLy8gR2V0IG5leHQgc3RpY2t5IGNvbHVtblxuICAgIGNvbnN0IG5leHRTdGlja3lDb2x1bW4gPSB0aGlzLmVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgIGlmICghbmV4dFN0aWNreUNvbHVtbikgcmV0dXJuO1xuICAgIGlmICghbmV4dFN0aWNreUNvbHVtbi5jbGFzc0xpc3QuY29udGFpbnMoJ2QtdGFibGUtc3RpY2t5LWNvbHVtbi1yaWdodCcpKSByZXR1cm47XG5cbiAgICB0aGlzLm9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgIC8vIElmIGhhcyBuZXh0IHN0aWNreSBjb2x1bW4sIGdldCB0aGUgd2lkdGggb2YgdGhlIGNvbHVtbi5cbiAgICAgIGNvbnN0IG5leHRTdGlja3lDb2x1bW5XaWR0aCA9IHRoaXMuZ2V0U2libGluZ0VsZW1lbnRDbGllbnRXaWR0aChuZXh0U3RpY2t5Q29sdW1uLCAnbmV4dCcpO1xuXG4gICAgICAvLyBTZXQgdGhlIHN0YXJ0IGByaWdodGAgcG9pbnQgb2YgdGhlIGN1cnJlbnQgc3RpY2t5IGNvbHVtblxuICAgICAgLy8gZnJvbSB0aGUgbmV4dCBzdGlja3kgY29sdW1uIHdpZHRoLlxuICAgICAgY29uc3QgcmlnaHRWYWx1ZSA9IG5leHRTdGlja3lDb2x1bW5XaWR0aCArICdweCc7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWxlbWVudCwgJ3JpZ2h0JywgcmlnaHRWYWx1ZSk7XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5lbGVtZW50LnBhcmVudEVsZW1lbnQpIHtcbiAgICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmVsZW1lbnQucGFyZW50RWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVEeW5hbWljU3R5bGVMZWZ0KCkge1xuICAgIC8vIEdldCBwcmV2aW91cyBzdGlja3kgY29sdW1uXG4gICAgY29uc3QgcHJldlN0aWNreUNvbHVtbiA9IHRoaXMuZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgIGlmICghcHJldlN0aWNreUNvbHVtbikgcmV0dXJuO1xuICAgIC8vIGlmIChwcmV2U3RpY2t5Q29sdW1uLmNsYXNzTGlzdC5jb250YWlucygnZC10YWJsZS1zdGlja3ktY29sdW1uLWxlZnQnKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5vYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICAvLyBJZiBoYXMgcHJldmlvdXMgc3RpY2t5IGNvbHVtbiwgZ2V0IHRoZSB3aWR0aCBvZiB0aGUgY29sdW1uLlxuICAgICAgY29uc3QgcHJldlN0aWNreUNvbHVtbldpZHRoID0gdGhpcy5nZXRTaWJsaW5nRWxlbWVudENsaWVudFdpZHRoKHByZXZTdGlja3lDb2x1bW4sICdwcmV2aW91cycpO1xuXG4gICAgICAvLyBTZXQgdGhlIHN0YXJ0IGBsZWZ0YCBwb2ludCBvZiB0aGUgY3VycmVudCBzdGlja3kgY29sdW1uXG4gICAgICAvLyBmcm9tIHRoZSBwcmV2IHN0aWNreSBjb2x1bW4gd2lkdGguXG4gICAgICBjb25zdCBsZWZ0VmFsdWUgPSBwcmV2U3RpY2t5Q29sdW1uV2lkdGggKyAncHgnO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsZW1lbnQsICdsZWZ0JywgbGVmdFZhbHVlKTtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmVsZW1lbnQucGFyZW50RWxlbWVudCkge1xuICAgICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKHRoaXMuZWxlbWVudC5wYXJlbnRFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFNpYmxpbmdFbGVtZW50Q2xpZW50V2lkdGgoXG4gICAgbmV4dEVsZW1lbnQ6IEVsZW1lbnQsXG4gICAgc2libGluZ1Bvc2l0aW9uOiAncHJldmlvdXMnIHwgJ25leHQnXG4gICk6IG51bWJlciB7XG4gICAgY29uc3Qgc2libGluZyA9XG4gICAgICBzaWJsaW5nUG9zaXRpb24gPT09ICdwcmV2aW91cydcbiAgICAgICAgPyAobmV4dEVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZyBhcyBFbGVtZW50KVxuICAgICAgICA6IChuZXh0RWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcgYXMgRWxlbWVudCk7XG5cbiAgICBpZiAoc2libGluZykge1xuICAgICAgY29uc3Qgc2libGluZ0NsaWVudFdpZHRoID0gdGhpcy5nZXRTaWJsaW5nRWxlbWVudENsaWVudFdpZHRoKHNpYmxpbmcsIHNpYmxpbmdQb3NpdGlvbik7XG4gICAgICByZXR1cm4gbmV4dEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggKyBzaWJsaW5nQ2xpZW50V2lkdGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICB9XG5cbiAgcHJpdmF0ZSB3YXRjaFRhYmxlQ29udGFpbmVyU2Nyb2xsRXZlbnQoKSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgY29uc3QgdGFibGVFbGVtZW50OiBIVE1MVGFibGVFbGVtZW50ID0gdGhpcy5kb2t1VGFibGU/LlsnZWxlbWVudFJlZiddLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBjb25zdCB0YWJsZUNvbnRhaW5lckVsZW1lbnQgPSB0aGlzLmRva3VUYWJsZT8uWydjb250YWluZXJFbGVtZW50J107XG5cbiAgICAgIGlmICghdGFibGVDb250YWluZXJFbGVtZW50IHx8ICF0YWJsZUVsZW1lbnQpIHJldHVybjtcblxuICAgICAgZnJvbUV2ZW50KHRhYmxlQ29udGFpbmVyRWxlbWVudCwgJ3Njcm9sbCcpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHN0YXJ0V2l0aChuZXcgRXZlbnQoJ3Njcm9sbCcpKSxcbiAgICAgICAgICBmaWx0ZXIoKCkgPT4gISF0aGlzLnBvc2l0aW9uKSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmhhbmRsZVN0aWNreUxlZnRTaGFkb3codGFibGVFbGVtZW50LCB0YWJsZUNvbnRhaW5lckVsZW1lbnQpO1xuICAgICAgICAgIHRoaXMuaGFuZGxlU3RpY2t5UmlnaHRTaGFkb3codGFibGVFbGVtZW50LCB0YWJsZUNvbnRhaW5lckVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlU3RpY2t5TGVmdFNoYWRvdyhfOiBIVE1MVGFibGVFbGVtZW50LCB0YWJsZUNvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKCF0aGlzLmlzTGFzdFN0aWNreUNvbHVtbigpKSByZXR1cm47XG4gICAgaWYgKHRoaXMucG9zaXRpb24gIT09IERva3VTdGlja3lDb2x1bW5Qb3NpdGlvbi5MZWZ0KSByZXR1cm47XG5cbiAgICB0YWJsZUNvbnRhaW5lckVsZW1lbnQuc2Nyb2xsTGVmdCA+IDBcbiAgICAgID8gdGhpcy50b2dnbGVTaGFkb3dDbGFzcygnYWRkJylcbiAgICAgIDogdGhpcy50b2dnbGVTaGFkb3dDbGFzcygncmVtb3ZlJyk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVN0aWNreVJpZ2h0U2hhZG93KFxuICAgIHRhYmxlRWxlbWVudDogSFRNTFRhYmxlRWxlbWVudCxcbiAgICB0YWJsZUNvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50XG4gICkge1xuICAgIGlmICghdGhpcy5pc0xhc3RTdGlja3lDb2x1bW4oKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnBvc2l0aW9uICE9PSBEb2t1U3RpY2t5Q29sdW1uUG9zaXRpb24uUmlnaHQpIHJldHVybjtcblxuICAgIC8vIERvbid0IG5lZWQgdG8gcHJvdmlkZSB0aGUgc2hhZG93IGJlY2F1c2UgdGhlIHRhYmxlIGVsZW1lbnQgaGFzIG5vIG1vcmUgY29sdW1ucyB0byBzY3JvbGwuXG4gICAgaWYgKHRhYmxlRWxlbWVudC5jbGllbnRXaWR0aCA8IHRhYmxlQ29udGFpbmVyRWxlbWVudC5jbGllbnRXaWR0aCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2Zmc2V0V2lkdGggPSB0YWJsZUVsZW1lbnQuY2xpZW50V2lkdGggLSB0YWJsZUNvbnRhaW5lckVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgY29uc3Qgb2Zmc2V0U2Nyb2xsID0gb2Zmc2V0V2lkdGggLSB0YWJsZUNvbnRhaW5lckVsZW1lbnQuc2Nyb2xsTGVmdDtcblxuICAgIC8vIEdpdmluZyBjaGVjayBvZmZzZXQgdG8gMC41IGJlY2F1c2UgdGhlIGNsaWVudCB3aWR0aCB2YWx1ZSBpcyByb3VuZGVkIHRvIG5lYXJlc3QgaW50ZWdlci5cbiAgICBvZmZzZXRTY3JvbGwgPiAwLjUgPyB0aGlzLnRvZ2dsZVNoYWRvd0NsYXNzKCdhZGQnKSA6IHRoaXMudG9nZ2xlU2hhZG93Q2xhc3MoJ3JlbW92ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHdoZXRoZXIgdGhpcyBjb2x1bW4gaXMgdGhlIGxhc3Qgc3RpY2t5IGNvbHVtbi5cbiAgICpcbiAgICogRm9yIHRoZSBgbGVmdGAgcG9zaXRpb24sIHdpbGwgY2hlY2sgaWYgbm8gc3RpY2t5IGNvbHVtbiBhZnRlci5cbiAgICogRm9yIHRoZSBgcmlnaHRgIHBvc2l0aW9uLCB3aWxsIGNoZWNrIGlmIG5vIHN0aWNreSBjb2x1bW4gYmVmb3JlLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0xhc3RTdGlja3lDb2x1bW4oKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNTdGlja3lMZWZ0KSB7XG4gICAgICBjb25zdCBuZXh0RWxlbWVudCA9IHRoaXMuZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICBpZiAobmV4dEVsZW1lbnQ/LmNsYXNzTGlzdC5jb250YWlucygnZC10YWJsZS1zdGlja3ktY29sdW1uLWxlZnQnKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNTdGlja3lSaWdodCkge1xuICAgICAgY29uc3QgcHJldkVsZW1lbnQgPSB0aGlzLmVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgIGlmIChwcmV2RWxlbWVudD8uY2xhc3NMaXN0LmNvbnRhaW5zKCdkLXRhYmxlLXN0aWNreS1jb2x1bW4tcmlnaHQnKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSB0b2dnbGVTaGFkb3dDbGFzcyh0eXBlOiAnYWRkJyB8ICdyZW1vdmUnKTogdm9pZCB7XG4gICAgaWYgKHR5cGUgPT09ICdhZGQnKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWxlbWVudCwgJ2QtdGFibGUtc3RpY2t5LWNvbHVtbi1zaGFkb3cnKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ3JlbW92ZScpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbGVtZW50LCAnZC10YWJsZS1zdGlja3ktY29sdW1uLXNoYWRvdycpO1xuICAgIH1cbiAgfVxufVxuIl19