UNPKG

@universal-material/angular

Version:

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

37 lines 26 kB
import { Component, Input } from '@angular/core'; import { DatepickerState } from '../datepicker-state.model'; import * as i0 from "@angular/core"; import * as i1 from "../datepicker-base.component"; import * as i2 from "@angular/common"; import * as i3 from "../../ripple/ripple.directive"; export class DatepickerContentComponent { constructor(elementRef, datepicker) { this.datepicker = datepicker; this.DatepickerState = DatepickerState; this.pickerState = DatepickerState.SelectDay; this.disabled = false; elementRef.nativeElement.classList.add('u-datepicker'); } _datesAreEqual(dateA, dateB) { return dateA.getUTCMonth() === dateB.getUTCMonth() && dateA.getUTCFullYear() === dateB.getUTCFullYear() && dateA.getDate() === dateB.getDate(); } setYear(year) { this.datepicker.setYear(year); this.pickerState = DatepickerState.SelectMonth; } setMonth(month) { this.datepicker.setMonth(month); this.pickerState = DatepickerState.SelectDay; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DatepickerContentComponent, deps: [{ token: i0.ElementRef }, { token: i1.DatepickerBaseComponent }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DatepickerContentComponent, selector: "u-datepicker-content", inputs: { disabled: "disabled" }, ngImport: i0, template: "<ng-container *ngIf=\"datepicker\">\n <div class=\"u-datepicker-header\" *ngIf=\"!datepicker.hideHeader\">\n <div class=\"u-datepicker-header-title\">{{datepicker.datepickerTitle}}</div>\n <div class=\"u-datepicker-header-date\">{{datepicker.formattedDate}}</div>\n </div>\n <div class=\"u-datepicker-body\">\n <ng-container *ngIf=\"pickerState === DatepickerState.SelectDay\">\n <div class=\"u-datepicker-navigation\">\n <u-button type=\"button\" variant=\"text\" (click)=\"pickerState = DatepickerState.SelectYear\" [disabled]=\"disabled\">\n {{datepicker.currentMonth.nameWithYear}}\n </u-button>\n <u-button-set class=\"ml-auto\">\n <u-icon-button type=\"button\" (click)=\"datepicker.showPreviousMonth()\" [disabled]=\"disabled\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"1em\" fill=\"currentColor\">\n <path d=\"M560-240 320-480l240-240 56 56-184 184 184 184-56 56Z\"/>\n </svg>\n </u-icon-button>\n <u-icon-button type=\"button\" (click)=\"datepicker.showNextMonth()\" [disabled]=\"disabled\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"1em\" fill=\"currentColor\">\n <path d=\"M504-480 320-664l56-56 240 240-240 240-56-56 184-184Z\"/>\n </svg>\n </u-icon-button>\n </u-button-set>\n </div>\n <div class=\"u-datepicker-content\">\n <div class=\"u-datepicker-weekdays\">\n <span class=\"u-datepicker-weekday\" *ngFor=\"let dayName of datepicker.weekDayNames\">{{dayName}}</span>\n </div>\n <div class=\"u-datepicker-week\" *ngFor=\"let week of datepicker.weeks; trackBy: datepicker.trackByWeek\">\n <button type=\"button\"\n uRipple\n class=\"u-datepicker-day\"\n [disabled]=\"disabled\"\n *ngFor=\"let day of week.days; trackBy: datepicker.trackByDay\"\n [class.disabled]=\"day.disabled\"\n [class.active]=\"datepicker.isEqualToSelectedDate(day.date)\"\n [class.u-datepicker-current-day]=\"datepicker.isEqualToTodayDate(day.date)\"\n [class.u-datepicker-day-outside-month]=\"day.outsideMonth\"\n (click)=\"!day.disabled && datepicker.selectDate(day.date)\">\n <ng-container *ngTemplateOutlet=\"datepicker.dayTemplate || defaultDayTemplate; context: {$implicit: day.date}\"></ng-container>\n </button>\n </div>\n </div>\n\n </ng-container>\n <ng-container *ngIf=\"pickerState === DatepickerState.SelectYear\">\n <div class=\"u-datepicker-navigation\">\n <u-button\n type=\"button\"\n (click)=\"pickerState = DatepickerState.SelectDay\"\n [disabled]=\"disabled\">\n {{datepicker.currentMonth.formattedYear}}\n </u-button>\n <u-button-set class=\"ml-auto\">\n <u-icon-button\n type=\"button\"\n (click)=\"datepicker.setYearGroups(datepicker.baseYear - datepicker.totalVisibleYears)\"\n [disabled]=\"disabled\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"1em\" fill=\"currentColor\">\n <path d=\"M560-240 320-480l240-240 56 56-184 184 184 184-56 56Z\"/>\n </svg>\n </u-icon-button>\n <u-icon-button\n type=\"button\"\n (click)=\"datepicker.setYearGroups(datepicker.baseYear + datepicker.totalVisibleYears)\"\n [disabled]=\"disabled\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"1em\" fill=\"currentColor\">\n <path d=\"M504-480 320-664l56-56 240 240-240 240-56-56 184-184Z\"/>\n </svg>\n </u-icon-button>\n </u-button-set>\n </div>\n <div class=\"u-datepicker-content\">\n <div class=\"u-datepicker-year-group\" *ngFor=\"let yearGroup of datepicker.yearGroups\">\n <div uRipple class=\"u-datepicker-year-month-button\"\n *ngFor=\"let year of yearGroup\"\n [class.disabled]=\"year.disabled\"\n [class.active]=\"year.year === datepicker.currentMonth.utcYear\"\n (click)=\"!year.disabled && setYear(year.year)\">{{year.year}}</div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"pickerState === DatepickerState.SelectMonth\">\n <div class=\"u-datepicker-navigation\">\n <u-button\n type=\"button\"\n variant=\"text\"\n (click)=\"pickerState = DatepickerState.SelectDay\"\n [disabled]=\"disabled\">\n {{datepicker.currentMonth.formattedYear}}\n </u-button>\n </div>\n <div class=\"u-datepicker-content\">\n <div class=\"u-datepicker-month-group\" *ngFor=\"let monthGroup of datepicker.monthGroups\">\n <div uRipple class=\"u-datepicker-year-month-button\"\n *ngFor=\"let month of monthGroup\"\n [class.disabled]=\"month.disabled\"\n [class.active]=\"month.utcMonth === datepicker.currentMonth.utcMonth\"\n (click)=\"!month.disabled && setMonth(month)\">{{month.name | uppercase}}</div>\n </div>\n </div>\n </ng-container>\n <u-button-set class=\"u-datepicker-clear justify-content-end w-100\">\n <u-button\n *ngIf=\"!datepicker.hideClear\"\n type=\"button\"\n variant=\"text\"\n color=\"primary\"\n (click)=\"datepicker.selectDate(null)\"\n [disabled]=\"disabled\">{{datepicker.clearLabel}}</u-button>\n </u-button-set>\n </div>\n</ng-container>\n\n<ng-template #defaultDayTemplate let-date>{{date.getDate()}}</ng-template>\n", styles: [".u-datepicker-clear{margin-top:8px}.u-datepicker-year-month-button.disabled,.u-datepicker-day.disabled{opacity:.2}.u-datepicker-year-month-button.disabled:before,.u-datepicker-day.disabled:before{display:none}\n"], dependencies: [{ 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.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.RippleDirective, selector: "[uRipple]", inputs: ["rippleConfig", "rippleDisabled"] }, { kind: "pipe", type: i2.UpperCasePipe, name: "uppercase" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DatepickerContentComponent, decorators: [{ type: Component, args: [{ selector: 'u-datepicker-content', template: "<ng-container *ngIf=\"datepicker\">\n <div class=\"u-datepicker-header\" *ngIf=\"!datepicker.hideHeader\">\n <div class=\"u-datepicker-header-title\">{{datepicker.datepickerTitle}}</div>\n <div class=\"u-datepicker-header-date\">{{datepicker.formattedDate}}</div>\n </div>\n <div class=\"u-datepicker-body\">\n <ng-container *ngIf=\"pickerState === DatepickerState.SelectDay\">\n <div class=\"u-datepicker-navigation\">\n <u-button type=\"button\" variant=\"text\" (click)=\"pickerState = DatepickerState.SelectYear\" [disabled]=\"disabled\">\n {{datepicker.currentMonth.nameWithYear}}\n </u-button>\n <u-button-set class=\"ml-auto\">\n <u-icon-button type=\"button\" (click)=\"datepicker.showPreviousMonth()\" [disabled]=\"disabled\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"1em\" fill=\"currentColor\">\n <path d=\"M560-240 320-480l240-240 56 56-184 184 184 184-56 56Z\"/>\n </svg>\n </u-icon-button>\n <u-icon-button type=\"button\" (click)=\"datepicker.showNextMonth()\" [disabled]=\"disabled\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"1em\" fill=\"currentColor\">\n <path d=\"M504-480 320-664l56-56 240 240-240 240-56-56 184-184Z\"/>\n </svg>\n </u-icon-button>\n </u-button-set>\n </div>\n <div class=\"u-datepicker-content\">\n <div class=\"u-datepicker-weekdays\">\n <span class=\"u-datepicker-weekday\" *ngFor=\"let dayName of datepicker.weekDayNames\">{{dayName}}</span>\n </div>\n <div class=\"u-datepicker-week\" *ngFor=\"let week of datepicker.weeks; trackBy: datepicker.trackByWeek\">\n <button type=\"button\"\n uRipple\n class=\"u-datepicker-day\"\n [disabled]=\"disabled\"\n *ngFor=\"let day of week.days; trackBy: datepicker.trackByDay\"\n [class.disabled]=\"day.disabled\"\n [class.active]=\"datepicker.isEqualToSelectedDate(day.date)\"\n [class.u-datepicker-current-day]=\"datepicker.isEqualToTodayDate(day.date)\"\n [class.u-datepicker-day-outside-month]=\"day.outsideMonth\"\n (click)=\"!day.disabled && datepicker.selectDate(day.date)\">\n <ng-container *ngTemplateOutlet=\"datepicker.dayTemplate || defaultDayTemplate; context: {$implicit: day.date}\"></ng-container>\n </button>\n </div>\n </div>\n\n </ng-container>\n <ng-container *ngIf=\"pickerState === DatepickerState.SelectYear\">\n <div class=\"u-datepicker-navigation\">\n <u-button\n type=\"button\"\n (click)=\"pickerState = DatepickerState.SelectDay\"\n [disabled]=\"disabled\">\n {{datepicker.currentMonth.formattedYear}}\n </u-button>\n <u-button-set class=\"ml-auto\">\n <u-icon-button\n type=\"button\"\n (click)=\"datepicker.setYearGroups(datepicker.baseYear - datepicker.totalVisibleYears)\"\n [disabled]=\"disabled\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"1em\" fill=\"currentColor\">\n <path d=\"M560-240 320-480l240-240 56 56-184 184 184 184-56 56Z\"/>\n </svg>\n </u-icon-button>\n <u-icon-button\n type=\"button\"\n (click)=\"datepicker.setYearGroups(datepicker.baseYear + datepicker.totalVisibleYears)\"\n [disabled]=\"disabled\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"1em\" fill=\"currentColor\">\n <path d=\"M504-480 320-664l56-56 240 240-240 240-56-56 184-184Z\"/>\n </svg>\n </u-icon-button>\n </u-button-set>\n </div>\n <div class=\"u-datepicker-content\">\n <div class=\"u-datepicker-year-group\" *ngFor=\"let yearGroup of datepicker.yearGroups\">\n <div uRipple class=\"u-datepicker-year-month-button\"\n *ngFor=\"let year of yearGroup\"\n [class.disabled]=\"year.disabled\"\n [class.active]=\"year.year === datepicker.currentMonth.utcYear\"\n (click)=\"!year.disabled && setYear(year.year)\">{{year.year}}</div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"pickerState === DatepickerState.SelectMonth\">\n <div class=\"u-datepicker-navigation\">\n <u-button\n type=\"button\"\n variant=\"text\"\n (click)=\"pickerState = DatepickerState.SelectDay\"\n [disabled]=\"disabled\">\n {{datepicker.currentMonth.formattedYear}}\n </u-button>\n </div>\n <div class=\"u-datepicker-content\">\n <div class=\"u-datepicker-month-group\" *ngFor=\"let monthGroup of datepicker.monthGroups\">\n <div uRipple class=\"u-datepicker-year-month-button\"\n *ngFor=\"let month of monthGroup\"\n [class.disabled]=\"month.disabled\"\n [class.active]=\"month.utcMonth === datepicker.currentMonth.utcMonth\"\n (click)=\"!month.disabled && setMonth(month)\">{{month.name | uppercase}}</div>\n </div>\n </div>\n </ng-container>\n <u-button-set class=\"u-datepicker-clear justify-content-end w-100\">\n <u-button\n *ngIf=\"!datepicker.hideClear\"\n type=\"button\"\n variant=\"text\"\n color=\"primary\"\n (click)=\"datepicker.selectDate(null)\"\n [disabled]=\"disabled\">{{datepicker.clearLabel}}</u-button>\n </u-button-set>\n </div>\n</ng-container>\n\n<ng-template #defaultDayTemplate let-date>{{date.getDate()}}</ng-template>\n", styles: [".u-datepicker-clear{margin-top:8px}.u-datepicker-year-month-button.disabled,.u-datepicker-day.disabled{opacity:.2}.u-datepicker-year-month-button.disabled:before,.u-datepicker-day.disabled:before{display:none}\n"] }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.DatepickerBaseComponent }]; }, propDecorators: { disabled: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1jb250ZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9kYXRlcGlja2VyL2RhdGVwaWNrZXItY29udGVudC9kYXRlcGlja2VyLWNvbnRlbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci1jb250ZW50L2RhdGVwaWNrZXItY29udGVudC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFzQyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFckYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7OztBQVM1RCxNQUFNLE9BQU8sMEJBQTBCO0lBS3JDLFlBQVksVUFBc0IsRUFDYixVQUFtQztRQUFuQyxlQUFVLEdBQVYsVUFBVSxDQUF5QjtRQUx4RCxvQkFBZSxHQUFHLGVBQWUsQ0FBQztRQUNsQyxnQkFBVyxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQUM7UUFDL0IsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUl4QixVQUFVLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVPLGNBQWMsQ0FBQyxLQUFXLEVBQUUsS0FBVztRQUM3QyxPQUFPLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxLQUFLLENBQUMsV0FBVyxFQUFFO2VBQzdDLEtBQUssQ0FBQyxjQUFjLEVBQUUsS0FBSyxLQUFLLENBQUMsY0FBYyxFQUFFO2VBQ2pELEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0MsQ0FBQztJQUVELE9BQU8sQ0FBQyxJQUFZO1FBQ2xCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsZUFBZSxDQUFDLFdBQVcsQ0FBQztJQUNqRCxDQUFDO0lBRUQsUUFBUSxDQUFDLEtBQVk7UUFDbkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDO0lBQy9DLENBQUM7K0dBeEJVLDBCQUEwQjttR0FBMUIsMEJBQTBCLDhGQ1h2QyxpeExBbUhBOzs0RkR4R2EsMEJBQTBCO2tCQUx0QyxTQUFTOytCQUNFLHNCQUFzQjt1SUFPdkIsUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSwgRWxlbWVudFJlZiwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRGF0ZXBpY2tlclN0YXRlIH0gZnJvbSAnLi4vZGF0ZXBpY2tlci1zdGF0ZS5tb2RlbCc7XG5pbXBvcnQgeyBEYXRlcGlja2VyQmFzZUNvbXBvbmVudCB9IGZyb20gJy4uL2RhdGVwaWNrZXItYmFzZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTW9udGggfSBmcm9tICcuLi9tb250aC5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3UtZGF0ZXBpY2tlci1jb250ZW50JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGVwaWNrZXItY29udGVudC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RhdGVwaWNrZXItY29udGVudC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIERhdGVwaWNrZXJDb250ZW50Q29tcG9uZW50IHtcbiAgRGF0ZXBpY2tlclN0YXRlID0gRGF0ZXBpY2tlclN0YXRlO1xuICBwaWNrZXJTdGF0ZSA9IERhdGVwaWNrZXJTdGF0ZS5TZWxlY3REYXk7XG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgICAgICAgcmVhZG9ubHkgZGF0ZXBpY2tlcjogRGF0ZXBpY2tlckJhc2VDb21wb25lbnQpIHtcbiAgICBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndS1kYXRlcGlja2VyJyk7XG4gIH1cblxuICBwcml2YXRlIF9kYXRlc0FyZUVxdWFsKGRhdGVBOiBEYXRlLCBkYXRlQjogRGF0ZSkge1xuICAgIHJldHVybiBkYXRlQS5nZXRVVENNb250aCgpID09PSBkYXRlQi5nZXRVVENNb250aCgpXG4gICAgICAmJiBkYXRlQS5nZXRVVENGdWxsWWVhcigpID09PSBkYXRlQi5nZXRVVENGdWxsWWVhcigpXG4gICAgICAmJiBkYXRlQS5nZXREYXRlKCkgPT09IGRhdGVCLmdldERhdGUoKTtcbiAgfVxuXG4gIHNldFllYXIoeWVhcjogbnVtYmVyKSB7XG4gICAgdGhpcy5kYXRlcGlja2VyLnNldFllYXIoeWVhcik7XG4gICAgdGhpcy5waWNrZXJTdGF0ZSA9IERhdGVwaWNrZXJTdGF0ZS5TZWxlY3RNb250aDtcbiAgfVxuXG4gIHNldE1vbnRoKG1vbnRoOiBNb250aCkge1xuICAgIHRoaXMuZGF0ZXBpY2tlci5zZXRNb250aChtb250aCk7XG4gICAgdGhpcy5waWNrZXJTdGF0ZSA9IERhdGVwaWNrZXJTdGF0ZS5TZWxlY3REYXk7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRlcGlja2VyXCI+XG4gIDxkaXYgY2xhc3M9XCJ1LWRhdGVwaWNrZXItaGVhZGVyXCIgKm5nSWY9XCIhZGF0ZXBpY2tlci5oaWRlSGVhZGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cInUtZGF0ZXBpY2tlci1oZWFkZXItdGl0bGVcIj57e2RhdGVwaWNrZXIuZGF0ZXBpY2tlclRpdGxlfX08L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwidS1kYXRlcGlja2VyLWhlYWRlci1kYXRlXCI+e3tkYXRlcGlja2VyLmZvcm1hdHRlZERhdGV9fTwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInUtZGF0ZXBpY2tlci1ib2R5XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBpY2tlclN0YXRlID09PSBEYXRlcGlja2VyU3RhdGUuU2VsZWN0RGF5XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwidS1kYXRlcGlja2VyLW5hdmlnYXRpb25cIj5cbiAgICAgICAgPHUtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwidGV4dFwiIChjbGljayk9XCJwaWNrZXJTdGF0ZSA9IERhdGVwaWNrZXJTdGF0ZS5TZWxlY3RZZWFyXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XG4gICAgICAgICAge3tkYXRlcGlja2VyLmN1cnJlbnRNb250aC5uYW1lV2l0aFllYXJ9fVxuICAgICAgICA8L3UtYnV0dG9uPlxuICAgICAgICA8dS1idXR0b24tc2V0IGNsYXNzPVwibWwtYXV0b1wiPlxuICAgICAgICAgIDx1LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZGF0ZXBpY2tlci5zaG93UHJldmlvdXNNb250aCgpXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBoZWlnaHQ9XCIyNHB4XCIgdmlld0JveD1cIjAgLTk2MCA5NjAgOTYwXCIgd2lkdGg9XCIxZW1cIiBmaWxsPVwiY3VycmVudENvbG9yXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNTYwLTI0MCAzMjAtNDgwbDI0MC0yNDAgNTYgNTYtMTg0IDE4NCAxODQgMTg0LTU2IDU2WlwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvdS1pY29uLWJ1dHRvbj5cbiAgICAgICAgICA8dS1pY29uLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImRhdGVwaWNrZXIuc2hvd05leHRNb250aCgpXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBoZWlnaHQ9XCIyNHB4XCIgdmlld0JveD1cIjAgLTk2MCA5NjAgOTYwXCIgd2lkdGg9XCIxZW1cIiBmaWxsPVwiY3VycmVudENvbG9yXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNTA0LTQ4MCAzMjAtNjY0bDU2LTU2IDI0MCAyNDAtMjQwIDI0MC01Ni01NiAxODQtMTg0WlwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvdS1pY29uLWJ1dHRvbj5cbiAgICAgICAgPC91LWJ1dHRvbi1zZXQ+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ1LWRhdGVwaWNrZXItY29udGVudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidS1kYXRlcGlja2VyLXdlZWtkYXlzXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ1LWRhdGVwaWNrZXItd2Vla2RheVwiICpuZ0Zvcj1cImxldCBkYXlOYW1lIG9mIGRhdGVwaWNrZXIud2Vla0RheU5hbWVzXCI+e3tkYXlOYW1lfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwidS1kYXRlcGlja2VyLXdlZWtcIiAqbmdGb3I9XCJsZXQgd2VlayBvZiBkYXRlcGlja2VyLndlZWtzOyB0cmFja0J5OiBkYXRlcGlja2VyLnRyYWNrQnlXZWVrXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIHVSaXBwbGVcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidS1kYXRlcGlja2VyLWRheVwiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGRheSBvZiB3ZWVrLmRheXM7IHRyYWNrQnk6IGRhdGVwaWNrZXIudHJhY2tCeURheVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiZGF5LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiZGF0ZXBpY2tlci5pc0VxdWFsVG9TZWxlY3RlZERhdGUoZGF5LmRhdGUpXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy51LWRhdGVwaWNrZXItY3VycmVudC1kYXldPVwiZGF0ZXBpY2tlci5pc0VxdWFsVG9Ub2RheURhdGUoZGF5LmRhdGUpXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy51LWRhdGVwaWNrZXItZGF5LW91dHNpZGUtbW9udGhdPVwiZGF5Lm91dHNpZGVNb250aFwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiIWRheS5kaXNhYmxlZCAmJiBkYXRlcGlja2VyLnNlbGVjdERhdGUoZGF5LmRhdGUpXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZGF0ZXBpY2tlci5kYXlUZW1wbGF0ZSB8fCBkZWZhdWx0RGF5VGVtcGxhdGU7IGNvbnRleHQ6IHskaW1wbGljaXQ6IGRheS5kYXRlfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBpY2tlclN0YXRlID09PSBEYXRlcGlja2VyU3RhdGUuU2VsZWN0WWVhclwiPlxuICAgICAgPGRpdiBjbGFzcz1cInUtZGF0ZXBpY2tlci1uYXZpZ2F0aW9uXCI+XG4gICAgICAgIDx1LWJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIChjbGljayk9XCJwaWNrZXJTdGF0ZSA9IERhdGVwaWNrZXJTdGF0ZS5TZWxlY3REYXlcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiPlxuICAgICAgICAgIHt7ZGF0ZXBpY2tlci5jdXJyZW50TW9udGguZm9ybWF0dGVkWWVhcn19XG4gICAgICAgIDwvdS1idXR0b24+XG4gICAgICAgIDx1LWJ1dHRvbi1zZXQgY2xhc3M9XCJtbC1hdXRvXCI+XG4gICAgICAgICAgPHUtaWNvbi1idXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImRhdGVwaWNrZXIuc2V0WWVhckdyb3VwcyhkYXRlcGlja2VyLmJhc2VZZWFyIC0gZGF0ZXBpY2tlci50b3RhbFZpc2libGVZZWFycylcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBoZWlnaHQ9XCIyNHB4XCIgdmlld0JveD1cIjAgLTk2MCA5NjAgOTYwXCIgd2lkdGg9XCIxZW1cIiBmaWxsPVwiY3VycmVudENvbG9yXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNTYwLTI0MCAzMjAtNDgwbDI0MC0yNDAgNTYgNTYtMTg0IDE4NCAxODQgMTg0LTU2IDU2WlwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvdS1pY29uLWJ1dHRvbj5cbiAgICAgICAgICA8dS1pY29uLWJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwiZGF0ZXBpY2tlci5zZXRZZWFyR3JvdXBzKGRhdGVwaWNrZXIuYmFzZVllYXIgKyBkYXRlcGlja2VyLnRvdGFsVmlzaWJsZVllYXJzKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjI0cHhcIiB2aWV3Qm94PVwiMCAtOTYwIDk2MCA5NjBcIiB3aWR0aD1cIjFlbVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk01MDQtNDgwIDMyMC02NjRsNTYtNTYgMjQwIDI0MC0yNDAgMjQwLTU2LTU2IDE4NC0xODRaXCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC91LWljb24tYnV0dG9uPlxuICAgICAgICA8L3UtYnV0dG9uLXNldD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInUtZGF0ZXBpY2tlci1jb250ZW50XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ1LWRhdGVwaWNrZXIteWVhci1ncm91cFwiICpuZ0Zvcj1cImxldCB5ZWFyR3JvdXAgb2YgZGF0ZXBpY2tlci55ZWFyR3JvdXBzXCI+XG4gICAgICAgICAgPGRpdiB1UmlwcGxlIGNsYXNzPVwidS1kYXRlcGlja2VyLXllYXItbW9udGgtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCB5ZWFyIG9mIHllYXJHcm91cFwiXG4gICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwieWVhci5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cInllYXIueWVhciA9PT0gZGF0ZXBpY2tlci5jdXJyZW50TW9udGgudXRjWWVhclwiXG4gICAgICAgICAgICAgICAoY2xpY2spPVwiIXllYXIuZGlzYWJsZWQgJiYgc2V0WWVhcih5ZWFyLnllYXIpXCI+e3t5ZWFyLnllYXJ9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwaWNrZXJTdGF0ZSA9PT0gRGF0ZXBpY2tlclN0YXRlLlNlbGVjdE1vbnRoXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwidS1kYXRlcGlja2VyLW5hdmlnYXRpb25cIj5cbiAgICAgICAgPHUtYnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgdmFyaWFudD1cInRleHRcIlxuICAgICAgICAgIChjbGljayk9XCJwaWNrZXJTdGF0ZSA9IERhdGVwaWNrZXJTdGF0ZS5TZWxlY3REYXlcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiPlxuICAgICAgICAgIHt7ZGF0ZXBpY2tlci5jdXJyZW50TW9udGguZm9ybWF0dGVkWWVhcn19XG4gICAgICAgIDwvdS1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ1LWRhdGVwaWNrZXItY29udGVudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidS1kYXRlcGlja2VyLW1vbnRoLWdyb3VwXCIgKm5nRm9yPVwibGV0IG1vbnRoR3JvdXAgb2YgZGF0ZXBpY2tlci5tb250aEdyb3Vwc1wiPlxuICAgICAgICAgIDxkaXYgdVJpcHBsZSBjbGFzcz1cInUtZGF0ZXBpY2tlci15ZWFyLW1vbnRoLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgbW9udGggb2YgbW9udGhHcm91cFwiXG4gICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwibW9udGguZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJtb250aC51dGNNb250aCA9PT0gZGF0ZXBpY2tlci5jdXJyZW50TW9udGgudXRjTW9udGhcIlxuICAgICAgICAgICAgICAgKGNsaWNrKT1cIiFtb250aC5kaXNhYmxlZCAmJiBzZXRNb250aChtb250aClcIj57e21vbnRoLm5hbWUgfCB1cHBlcmNhc2V9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDx1LWJ1dHRvbi1zZXQgY2xhc3M9XCJ1LWRhdGVwaWNrZXItY2xlYXIganVzdGlmeS1jb250ZW50LWVuZCB3LTEwMFwiPlxuICAgICAgPHUtYnV0dG9uXG4gICAgICAgICpuZ0lmPVwiIWRhdGVwaWNrZXIuaGlkZUNsZWFyXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIHZhcmlhbnQ9XCJ0ZXh0XCJcbiAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgKGNsaWNrKT1cImRhdGVwaWNrZXIuc2VsZWN0RGF0ZShudWxsKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiPnt7ZGF0ZXBpY2tlci5jbGVhckxhYmVsfX08L3UtYnV0dG9uPlxuICAgIDwvdS1idXR0b24tc2V0PlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHREYXlUZW1wbGF0ZSBsZXQtZGF0ZT57e2RhdGUuZ2V0RGF0ZSgpfX08L25nLXRlbXBsYXRlPlxuIl19