UNPKG

@nodro7/angular-mydatepicker

Version:
118 lines 25.8 kB
import { Component, EventEmitter, Input, Output, ViewEncapsulation } from "@angular/core"; import { UtilService } from "../../services/angular-mydatepicker.util.service"; import { KeyCode } from "../../enums/key-code.enum"; import { MonthId } from "../../enums/month-id.enum"; import { ActiveView } from "../../enums/active-view.enum"; import { OPTS, DATES, WEEK_DAYS, SELECTED_DATE, SELECTED_DATE_RANGE } from "../../constants/constants"; import * as i0 from "@angular/core"; import * as i1 from "../../services/angular-mydatepicker.util.service"; import * as i2 from "@angular/common"; export class DayViewComponent { constructor(utilService) { this.utilService = utilService; this.dayCellClicked = new EventEmitter(); this.dayCellKeyDown = new EventEmitter(); this.viewActivated = new EventEmitter(); this.prevMonthId = MonthId.prev; this.currMonthId = MonthId.curr; this.nextMonthId = MonthId.next; } ngOnChanges(changes) { if (changes.hasOwnProperty(OPTS)) { this.opts = changes[OPTS].currentValue; } if (changes.hasOwnProperty(DATES)) { this.dates = changes[DATES].currentValue; } if (changes.hasOwnProperty(WEEK_DAYS)) { this.weekDays = changes[WEEK_DAYS].currentValue; } if (changes.hasOwnProperty(SELECTED_DATE)) { this.selectedDate = changes[SELECTED_DATE].currentValue; } if (changes.hasOwnProperty(SELECTED_DATE_RANGE)) { this.selectedDateRange = changes[SELECTED_DATE_RANGE].currentValue; } } ngAfterViewInit() { this.viewActivated.emit(ActiveView.Date); } onDayCellClicked(event, cell) { event.stopPropagation(); if (cell.disabledDate.disabled) { return; } this.dayCellClicked.emit(cell); } onDayCellKeyDown(event, cell) { const keyCode = this.utilService.getKeyCodeFromEvent(event); if (keyCode !== KeyCode.tab) { event.preventDefault(); if (keyCode === KeyCode.enter || keyCode === KeyCode.space) { this.onDayCellClicked(event, cell); } else if (this.opts.moveFocusByArrowKeys) { this.dayCellKeyDown.emit(event); } } } onDayCellMouseEnter(cell) { if (this.utilService.isInitializedDate(this.selectedDateRange.begin) && !this.utilService.isInitializedDate(this.selectedDateRange.end)) { for (const w of this.dates) { for (const day of w.week) { day.range = this.utilService.isDateSameOrEarlier(this.selectedDateRange.begin, day.dateObj) && this.utilService.isDateSameOrEarlier(day.dateObj, cell.dateObj); } } } } onDayCellMouseLeave() { for (const w of this.dates) { for (const day of w.week) { day.range = false; } } } isDateInRange(date) { return this.utilService.isDateInRange(date, this.selectedDateRange); } isDateSame(date) { return this.utilService.isDateSame(this.selectedDate, date); } isDateRangeBeginOrEndSame(date) { return this.utilService.isDateRangeBeginOrEndSame(this.selectedDateRange, date); } isDateRangeBegin(date) { return this.utilService.isDateRangeBegin(this.selectedDateRange, date); } isDateRangeEnd(date) { return this.utilService.isDateRangeEnd(this.selectedDateRange, date); } isDaySelected(day) { return !this.opts.dateRange && this.isDateSame(day.dateObj) || this.opts.dateRange && this.isDateRangeBeginOrEndSame(day.dateObj); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: DayViewComponent, deps: [{ token: i1.UtilService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: DayViewComponent, selector: "lib-day-view", inputs: { opts: "opts", dates: "dates", weekDays: "weekDays", selectedDate: "selectedDate", selectedDateRange: "selectedDateRange", viewChanged: "viewChanged" }, outputs: { dayCellClicked: "dayCellClicked", dayCellKeyDown: "dayCellKeyDown", viewActivated: "viewActivated" }, providers: [UtilService], usesOnChanges: true, ngImport: i0, template: "<table class=\"myDpCalTable\" [ngClass]=\"{'ng-myrtl': opts.rtl, 'myDpFooter': opts.showFooterToday, 'myDpNoFooter': !opts.showFooterToday, 'myDpViewChangeAnimation': opts.viewChangeAnimation && viewChanged}\">\n <thead>\n <tr>\n <th class=\"myDpWeekDayTitle myDpWeekDayTitleWeekNbr\" *ngIf=\"opts.showWeekNumbers && opts.firstDayOfWeek==='mo'\">#</th>\n <th class=\"myDpWeekDayTitle\" scope=\"col\" *ngFor=\"let d of weekDays\">{{d}}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let w of dates\">\n <td class=\"myDpDaycellWeekNbr\" *ngIf=\"opts.showWeekNumbers && opts.firstDayOfWeek==='mo'\">{{w.weekNbr}}</td>\n <td *ngFor=\"let d of w.week\"\n id=\"d_{{d.row}}_{{d.col}}\"\n class=\"d_{{d.row}}_{{d.col}} myDpDaycell {{d.markedDate.styleClass}} {{d.disabledDate.styleClass}}\"\n [ngClass]=\"{'myDpRangeColor': isDateInRange(d.dateObj) || d.range,\n 'myDpPrevMonth': d.cmo === prevMonthId,\n 'myDpCurrMonth':d.cmo === currMonthId && !d.disabledDate.disabled,\n 'myDpNextMonth': d.cmo === nextMonthId,\n 'myDpSelectedDay':isDaySelected(d),\n 'myDpRangeBegin':this.opts.dateRange && isDateRangeBegin(d.dateObj),\n 'myDpRangeEnd':this.opts.dateRange && isDateRangeEnd(d.dateObj),\n 'myDpDisabled': d.disabledDate.disabled && !d.disabledDate.styleClass.length,\n 'myDpTableSingleDay': !d.disabledDate.disabled}\"\n [attr.aria-current]=\"d.currDay ? 'date' : null\"\n [attr.aria-disabled]=\"d.disabledDate.disabled || null\"\n [attr.aria-selected]=\"isDaySelected(d) || null\"\n [attr.tabindex]=\"!d.disabledDate.disabled ? 0 : -1\"\n (click)=\"onDayCellClicked($event, d)\"\n (keydown)=\"onDayCellKeyDown($event, d)\"\n (mouseenter)=\"onDayCellMouseEnter(d)\"\n (mouseleave)=\"onDayCellMouseLeave()\">\n <span *ngIf=\"d.markedDate.marked && d.markedDate.color.length\" class=\"myDpMarkDate\" [ngStyle]=\"{'border-top': '8px solid ' + d.markedDate.color}\"></span>\n <span class=\"myDpDayValue\"\n [attr.aria-label]=\"[(d.dateObj.month + '/' + d.dateObj.day + '/' + d.dateObj.year | date:'fullDate')]\"\n [ngClass]=\"{'myDpMarkCurrDay': d.currDay && opts.markCurrentDay, 'myDpDimDay': d.highlight && (d.cmo===prevMonthId || d.cmo===nextMonthId || d.disabledDate.disabled), 'myDpHighlight': d.highlight}\">{{d.dateObj.day}}</span>\n </td>\n </tr>\n </tbody>\n</table>\n", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: DayViewComponent, decorators: [{ type: Component, args: [{ selector: "lib-day-view", providers: [UtilService], encapsulation: ViewEncapsulation.None, template: "<table class=\"myDpCalTable\" [ngClass]=\"{'ng-myrtl': opts.rtl, 'myDpFooter': opts.showFooterToday, 'myDpNoFooter': !opts.showFooterToday, 'myDpViewChangeAnimation': opts.viewChangeAnimation && viewChanged}\">\n <thead>\n <tr>\n <th class=\"myDpWeekDayTitle myDpWeekDayTitleWeekNbr\" *ngIf=\"opts.showWeekNumbers && opts.firstDayOfWeek==='mo'\">#</th>\n <th class=\"myDpWeekDayTitle\" scope=\"col\" *ngFor=\"let d of weekDays\">{{d}}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let w of dates\">\n <td class=\"myDpDaycellWeekNbr\" *ngIf=\"opts.showWeekNumbers && opts.firstDayOfWeek==='mo'\">{{w.weekNbr}}</td>\n <td *ngFor=\"let d of w.week\"\n id=\"d_{{d.row}}_{{d.col}}\"\n class=\"d_{{d.row}}_{{d.col}} myDpDaycell {{d.markedDate.styleClass}} {{d.disabledDate.styleClass}}\"\n [ngClass]=\"{'myDpRangeColor': isDateInRange(d.dateObj) || d.range,\n 'myDpPrevMonth': d.cmo === prevMonthId,\n 'myDpCurrMonth':d.cmo === currMonthId && !d.disabledDate.disabled,\n 'myDpNextMonth': d.cmo === nextMonthId,\n 'myDpSelectedDay':isDaySelected(d),\n 'myDpRangeBegin':this.opts.dateRange && isDateRangeBegin(d.dateObj),\n 'myDpRangeEnd':this.opts.dateRange && isDateRangeEnd(d.dateObj),\n 'myDpDisabled': d.disabledDate.disabled && !d.disabledDate.styleClass.length,\n 'myDpTableSingleDay': !d.disabledDate.disabled}\"\n [attr.aria-current]=\"d.currDay ? 'date' : null\"\n [attr.aria-disabled]=\"d.disabledDate.disabled || null\"\n [attr.aria-selected]=\"isDaySelected(d) || null\"\n [attr.tabindex]=\"!d.disabledDate.disabled ? 0 : -1\"\n (click)=\"onDayCellClicked($event, d)\"\n (keydown)=\"onDayCellKeyDown($event, d)\"\n (mouseenter)=\"onDayCellMouseEnter(d)\"\n (mouseleave)=\"onDayCellMouseLeave()\">\n <span *ngIf=\"d.markedDate.marked && d.markedDate.color.length\" class=\"myDpMarkDate\" [ngStyle]=\"{'border-top': '8px solid ' + d.markedDate.color}\"></span>\n <span class=\"myDpDayValue\"\n [attr.aria-label]=\"[(d.dateObj.month + '/' + d.dateObj.day + '/' + d.dateObj.year | date:'fullDate')]\"\n [ngClass]=\"{'myDpMarkCurrDay': d.currDay && opts.markCurrentDay, 'myDpDimDay': d.highlight && (d.cmo===prevMonthId || d.cmo===nextMonthId || d.disabledDate.disabled), 'myDpHighlight': d.highlight}\">{{d.dateObj.day}}</span>\n </td>\n </tr>\n </tbody>\n</table>\n" }] }], ctorParameters: function () { return [{ type: i1.UtilService }]; }, propDecorators: { opts: [{ type: Input }], dates: [{ type: Input }], weekDays: [{ type: Input }], selectedDate: [{ type: Input }], selectedDateRange: [{ type: Input }], viewChanged: [{ type: Input }], dayCellClicked: [{ type: Output }], dayCellKeyDown: [{ type: Output }], viewActivated: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF5LXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1teWRhdGVwaWNrZXIvc3JjL2xpYi9jb21wb25lbnRzL2RheS12aWV3L2RheS12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItbXlkYXRlcGlja2VyL3NyYy9saWIvY29tcG9uZW50cy9kYXktdmlldy9kYXktdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQTRCLE1BQU0sRUFBRSxpQkFBaUIsRUFBZ0IsTUFBTSxlQUFlLENBQUM7QUFNakksT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGtEQUFrRCxDQUFDO0FBQzdFLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDbEQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ3hELE9BQU8sRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQzs7OztBQVFyRyxNQUFNLE9BQU8sZ0JBQWdCO0lBZ0IzQixZQUFvQixXQUF3QjtRQUF4QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQVJsQyxtQkFBYyxHQUFpQyxJQUFJLFlBQVksRUFBa0IsQ0FBQztRQUNsRixtQkFBYyxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBQzVELGtCQUFhLEdBQTZCLElBQUksWUFBWSxFQUFjLENBQUM7UUFFbkYsZ0JBQVcsR0FBVyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQ25DLGdCQUFXLEdBQVcsT0FBTyxDQUFDLElBQUksQ0FBQztR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QUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BJLENBQUM7OEdBeEdVLGdCQUFnQjtrR0FBaEIsZ0JBQWdCLDBUQUhoQixDQUFDLFdBQVcsQ0FBQywrQ0NmMUIscWdGQXNDQTs7MkZEcEJhLGdCQUFnQjtrQkFONUIsU0FBUzsrQkFDRSxjQUFjLGFBRWIsQ0FBQyxXQUFXLENBQUMsaUJBQ1QsaUJBQWlCLENBQUMsSUFBSTtrR0FHNUIsSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUksY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPdXRwdXQsIFZpZXdFbmNhcHN1bGF0aW9uLCBTaW1wbGVDaGFuZ2VzfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtJTXlDYWxlbmRhckRheX0gZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvbXktY2FsZW5kYXItZGF5LmludGVyZmFjZVwiO1xuaW1wb3J0IHtJTXlEYXRlfSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9teS1kYXRlLmludGVyZmFjZVwiO1xuaW1wb3J0IHtJTXlEYXRlUmFuZ2V9IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL215LWRhdGUtcmFuZ2UuaW50ZXJmYWNlXCI7XG5pbXBvcnQge0lNeU9wdGlvbnN9IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL215LW9wdGlvbnMuaW50ZXJmYWNlXCI7XG5pbXBvcnQge0lNeVdlZWt9IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL215LXdlZWsuaW50ZXJmYWNlXCI7XG5pbXBvcnQge1V0aWxTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvYW5ndWxhci1teWRhdGVwaWNrZXIudXRpbC5zZXJ2aWNlXCI7XG5pbXBvcnQge0tleUNvZGV9IGZyb20gXCIuLi8uLi9lbnVtcy9rZXktY29kZS5lbnVtXCI7XG5pbXBvcnQge01vbnRoSWR9IGZyb20gXCIuLi8uLi9lbnVtcy9tb250aC1pZC5lbnVtXCI7XG5pbXBvcnQge0FjdGl2ZVZpZXd9IGZyb20gXCIuLi8uLi9lbnVtcy9hY3RpdmUtdmlldy5lbnVtXCI7XG5pbXBvcnQge09QVFMsIERBVEVTLCBXRUVLX0RBWVMsIFNFTEVDVEVEX0RBVEUsIFNFTEVDVEVEX0RBVEVfUkFOR0V9IGZyb20gXCIuLi8uLi9jb25zdGFudHMvY29uc3RhbnRzXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJsaWItZGF5LXZpZXdcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9kYXktdmlldy5jb21wb25lbnQuaHRtbFwiLFxuICBwcm92aWRlcnM6IFtVdGlsU2VydmljZV0sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgRGF5Vmlld0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBJbnB1dCgpIG9wdHM6IElNeU9wdGlvbnM7XG4gIEBJbnB1dCgpIGRhdGVzOiBBcnJheTxJTXlXZWVrPjtcbiAgQElucHV0KCkgd2Vla0RheXM6IEFycmF5PHN0cmluZz47XG4gIEBJbnB1dCgpIHNlbGVjdGVkRGF0ZTogSU15RGF0ZTtcbiAgQElucHV0KCkgc2VsZWN0ZWREYXRlUmFuZ2U6IElNeURhdGVSYW5nZTtcbiAgQElucHV0KCkgdmlld0NoYW5nZWQ6IGJvb2xlYW47XG5cbiAgQE91dHB1dCgpIGRheUNlbGxDbGlja2VkOiBFdmVudEVtaXR0ZXI8SU15Q2FsZW5kYXJEYXk+ID0gbmV3IEV2ZW50RW1pdHRlcjxJTXlDYWxlbmRhckRheT4oKTtcbiAgQE91dHB1dCgpIGRheUNlbGxLZXlEb3duOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgdmlld0FjdGl2YXRlZDogRXZlbnRFbWl0dGVyPEFjdGl2ZVZpZXc+ID0gbmV3IEV2ZW50RW1pdHRlcjxBY3RpdmVWaWV3PigpO1xuXG4gIHByZXZNb250aElkOiBudW1iZXIgPSBNb250aElkLnByZXY7XG4gIGN1cnJNb250aElkOiBudW1iZXIgPSBNb250aElkLmN1cnI7XG4gIG5leHRNb250aElkOiBudW1iZXIgPSBNb250aElkLm5leHQ7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSB1dGlsU2VydmljZTogVXRpbFNlcnZpY2UpIHsgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eShPUFRTKSkge1xuICAgICAgdGhpcy5vcHRzID0gY2hhbmdlc1tPUFRTXS5jdXJyZW50VmFsdWU7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KERBVEVTKSkge1xuICAgICAgdGhpcy5kYXRlcyA9IGNoYW5nZXNbREFURVNdLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoV0VFS19EQVlTKSkge1xuICAgICAgdGhpcy53ZWVrRGF5cyA9IGNoYW5nZXNbV0VFS19EQVlTXS5jdXJyZW50VmFsdWU7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KFNFTEVDVEVEX0RBVEUpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IGNoYW5nZXNbU0VMRUNURURfREFURV0uY3VycmVudFZhbHVlO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eShTRUxFQ1RFRF9EQVRFX1JBTkdFKSkge1xuICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZSA9IGNoYW5nZXNbU0VMRUNURURfREFURV9SQU5HRV0uY3VycmVudFZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdBY3RpdmF0ZWQuZW1pdChBY3RpdmVWaWV3LkRhdGUpO1xuICB9XG5cbiAgb25EYXlDZWxsQ2xpY2tlZChldmVudDogYW55LCBjZWxsOiBJTXlDYWxlbmRhckRheSk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKGNlbGwuZGlzYWJsZWREYXRlLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kYXlDZWxsQ2xpY2tlZC5lbWl0KGNlbGwpO1xuICB9XG5cbiAgb25EYXlDZWxsS2V5RG93bihldmVudDogYW55LCBjZWxsOiBJTXlDYWxlbmRhckRheSkge1xuICAgIGNvbnN0IGtleUNvZGU6IG51bWJlciA9IHRoaXMudXRpbFNlcnZpY2UuZ2V0S2V5Q29kZUZyb21FdmVudChldmVudCk7XG4gICAgaWYgKGtleUNvZGUgIT09IEtleUNvZGUudGFiKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBpZiAoa2V5Q29kZSA9PT0gS2V5Q29kZS5lbnRlciB8fCBrZXlDb2RlID09PSBLZXlDb2RlLnNwYWNlKSB7XG4gICAgICAgIHRoaXMub25EYXlDZWxsQ2xpY2tlZChldmVudCwgY2VsbCk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmICh0aGlzLm9wdHMubW92ZUZvY3VzQnlBcnJvd0tleXMpIHtcbiAgICAgICAgdGhpcy5kYXlDZWxsS2V5RG93bi5lbWl0KGV2ZW50KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uRGF5Q2VsbE1vdXNlRW50ZXIoY2VsbDogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMudXRpbFNlcnZpY2UuaXNJbml0aWFsaXplZERhdGUodGhpcy5zZWxlY3RlZERhdGVSYW5nZS5iZWdpbikgJiYgIXRoaXMudXRpbFNlcnZpY2UuaXNJbml0aWFsaXplZERhdGUodGhpcy5zZWxlY3RlZERhdGVSYW5nZS5lbmQpKSB7XG4gICAgICBmb3IgKGNvbnN0IHcgb2YgdGhpcy5kYXRlcykge1xuICAgICAgICBmb3IgKGNvbnN0IGRheSBvZiB3LndlZWspIHtcbiAgICAgICAgICBkYXkucmFuZ2UgPSB0aGlzLnV0aWxTZXJ2aWNlLmlzRGF0ZVNhbWVPckVhcmxpZXIodGhpcy5zZWxlY3RlZERhdGVSYW5nZS5iZWdpbiwgZGF5LmRhdGVPYmopICYmIHRoaXMudXRpbFNlcnZpY2UuaXNEYXRlU2FtZU9yRWFybGllcihkYXkuZGF0ZU9iaiwgY2VsbC5kYXRlT2JqKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uRGF5Q2VsbE1vdXNlTGVhdmUoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCB3IG9mIHRoaXMuZGF0ZXMpIHtcbiAgICAgIGZvciAoY29uc3QgZGF5IG9mIHcud2Vlaykge1xuICAgICAgICBkYXkucmFuZ2UgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpc0RhdGVJblJhbmdlKGRhdGU6IElNeURhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy51dGlsU2VydmljZS5pc0RhdGVJblJhbmdlKGRhdGUsIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UpO1xuICB9XG5cbiAgaXNEYXRlU2FtZShkYXRlOiBJTXlEYXRlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudXRpbFNlcnZpY2UuaXNEYXRlU2FtZSh0aGlzLnNlbGVjdGVkRGF0ZSwgZGF0ZSk7XG4gIH1cblxuICBpc0RhdGVSYW5nZUJlZ2luT3JFbmRTYW1lKGRhdGU6IElNeURhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy51dGlsU2VydmljZS5pc0RhdGVSYW5nZUJlZ2luT3JFbmRTYW1lKHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UsIGRhdGUpO1xuICB9XG5cbiAgaXNEYXRlUmFuZ2VCZWdpbihkYXRlOiBJTXlEYXRlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudXRpbFNlcnZpY2UuaXNEYXRlUmFuZ2VCZWdpbih0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlLCBkYXRlKTtcbiAgfVxuXG4gIGlzRGF0ZVJhbmdlRW5kKGRhdGU6IElNeURhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy51dGlsU2VydmljZS5pc0RhdGVSYW5nZUVuZCh0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlLCBkYXRlKTtcbiAgfVxuXG4gIGlzRGF5U2VsZWN0ZWQoZGF5OiBJTXlDYWxlbmRhckRheSkge1xuICAgIHJldHVybiAhdGhpcy5vcHRzLmRhdGVSYW5nZSAmJiB0aGlzLmlzRGF0ZVNhbWUoZGF5LmRhdGVPYmopIHx8IHRoaXMub3B0cy5kYXRlUmFuZ2UgJiYgdGhpcy5pc0RhdGVSYW5nZUJlZ2luT3JFbmRTYW1lKGRheS5kYXRlT2JqKTtcbiAgfVxufVxuIiwiPHRhYmxlIGNsYXNzPVwibXlEcENhbFRhYmxlXCIgW25nQ2xhc3NdPVwieyduZy1teXJ0bCc6IG9wdHMucnRsLCAnbXlEcEZvb3Rlcic6IG9wdHMuc2hvd0Zvb3RlclRvZGF5LCAnbXlEcE5vRm9vdGVyJzogIW9wdHMuc2hvd0Zvb3RlclRvZGF5LCAnbXlEcFZpZXdDaGFuZ2VBbmltYXRpb24nOiBvcHRzLnZpZXdDaGFuZ2VBbmltYXRpb24gJiYgdmlld0NoYW5nZWR9XCI+XG4gIDx0aGVhZD5cbiAgICA8dHI+XG4gICAgICA8dGggY2xhc3M9XCJteURwV2Vla0RheVRpdGxlIG15RHBXZWVrRGF5VGl0bGVXZWVrTmJyXCIgKm5nSWY9XCJvcHRzLnNob3dXZWVrTnVtYmVycyAmJiBvcHRzLmZpcnN0RGF5T2ZXZWVrPT09J21vJ1wiPiM8L3RoPlxuICAgICAgPHRoIGNsYXNzPVwibXlEcFdlZWtEYXlUaXRsZVwiIHNjb3BlPVwiY29sXCIgKm5nRm9yPVwibGV0IGQgb2Ygd2Vla0RheXNcIj57e2R9fTwvdGg+XG4gICAgPC90cj5cbiAgPC90aGVhZD5cbiAgPHRib2R5PlxuICAgIDx0ciAqbmdGb3I9XCJsZXQgdyBvZiBkYXRlc1wiPlxuICAgICAgPHRkIGNsYXNzPVwibXlEcERheWNlbGxXZWVrTmJyXCIgKm5nSWY9XCJvcHRzLnNob3dXZWVrTnVtYmVycyAmJiBvcHRzLmZpcnN0RGF5T2ZXZWVrPT09J21vJ1wiPnt7dy53ZWVrTmJyfX08L3RkPlxuICAgICAgPHRkICpuZ0Zvcj1cImxldCBkIG9mIHcud2Vla1wiXG4gICAgICAgICAgaWQ9XCJkX3t7ZC5yb3d9fV97e2QuY29sfX1cIlxuICAgICAgICAgIGNsYXNzPVwiZF97e2Qucm93fX1fe3tkLmNvbH19IG15RHBEYXljZWxsIHt7ZC5tYXJrZWREYXRlLnN0eWxlQ2xhc3N9fSB7e2QuZGlzYWJsZWREYXRlLnN0eWxlQ2xhc3N9fVwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwieydteURwUmFuZ2VDb2xvcic6IGlzRGF0ZUluUmFuZ2UoZC5kYXRlT2JqKSB8fCBkLnJhbmdlLFxuICAgICAgICAgICAgICAgICdteURwUHJldk1vbnRoJzogZC5jbW8gPT09IHByZXZNb250aElkLFxuICAgICAgICAgICAgICAgICdteURwQ3Vyck1vbnRoJzpkLmNtbyA9PT0gY3Vyck1vbnRoSWQgJiYgIWQuZGlzYWJsZWREYXRlLmRpc2FibGVkLFxuICAgICAgICAgICAgICAgICdteURwTmV4dE1vbnRoJzogZC5jbW8gPT09IG5leHRNb250aElkLFxuICAgICAgICAgICAgICAgICdteURwU2VsZWN0ZWREYXknOmlzRGF5U2VsZWN0ZWQoZCksXG4gICAgICAgICAgICAgICAgJ215RHBSYW5nZUJlZ2luJzp0aGlzLm9wdHMuZGF0ZVJhbmdlICYmIGlzRGF0ZVJhbmdlQmVnaW4oZC5kYXRlT2JqKSxcbiAgICAgICAgICAgICAgICAnbXlEcFJhbmdlRW5kJzp0aGlzLm9wdHMuZGF0ZVJhbmdlICYmIGlzRGF0ZVJhbmdlRW5kKGQuZGF0ZU9iaiksXG4gICAgICAgICAgICAgICAgJ215RHBEaXNhYmxlZCc6IGQuZGlzYWJsZWREYXRlLmRpc2FibGVkICYmICFkLmRpc2FibGVkRGF0ZS5zdHlsZUNsYXNzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAnbXlEcFRhYmxlU2luZ2xlRGF5JzogIWQuZGlzYWJsZWREYXRlLmRpc2FibGVkfVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1jdXJyZW50XT1cImQuY3VyckRheSA/ICdkYXRlJyA6IG51bGxcIlxuICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiZC5kaXNhYmxlZERhdGUuZGlzYWJsZWQgfHwgbnVsbFwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc0RheVNlbGVjdGVkKGQpIHx8IG51bGxcIlxuICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cIiFkLmRpc2FibGVkRGF0ZS5kaXNhYmxlZCA/IDAgOiAtMVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uRGF5Q2VsbENsaWNrZWQoJGV2ZW50LCBkKVwiXG4gICAgICAgICAgKGtleWRvd24pPVwib25EYXlDZWxsS2V5RG93bigkZXZlbnQsIGQpXCJcbiAgICAgICAgICAobW91c2VlbnRlcik9XCJvbkRheUNlbGxNb3VzZUVudGVyKGQpXCJcbiAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvbkRheUNlbGxNb3VzZUxlYXZlKClcIj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJkLm1hcmtlZERhdGUubWFya2VkICYmIGQubWFya2VkRGF0ZS5jb2xvci5sZW5ndGhcIiBjbGFzcz1cIm15RHBNYXJrRGF0ZVwiIFtuZ1N0eWxlXT1cInsnYm9yZGVyLXRvcCc6ICc4cHggc29saWQgJyArIGQubWFya2VkRGF0ZS5jb2xvcn1cIj48L3NwYW4+XG4gICAgICAgIDxzcGFuICBjbGFzcz1cIm15RHBEYXlWYWx1ZVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJbKGQuZGF0ZU9iai5tb250aCArICcvJyArIGQuZGF0ZU9iai5kYXkgKyAnLycgKyBkLmRhdGVPYmoueWVhciB8IGRhdGU6J2Z1bGxEYXRlJyldXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7J215RHBNYXJrQ3VyckRheSc6IGQuY3VyckRheSAmJiBvcHRzLm1hcmtDdXJyZW50RGF5LCAnbXlEcERpbURheSc6IGQuaGlnaGxpZ2h0ICYmIChkLmNtbz09PXByZXZNb250aElkIHx8IGQuY21vPT09bmV4dE1vbnRoSWQgfHwgZC5kaXNhYmxlZERhdGUuZGlzYWJsZWQpLCAnbXlEcEhpZ2hsaWdodCc6IGQuaGlnaGxpZ2h0fVwiPnt7ZC5kYXRlT2JqLmRheX19PC9zcGFuPlxuICAgICAgPC90ZD5cbiAgICA8L3RyPlxuICA8L3Rib2R5PlxuPC90YWJsZT5cbiJdfQ==