ngx-pluto
Version:
448 lines • 40.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ViewEncapsulation, Input, ViewChild, forwardRef, Output, EventEmitter, ElementRef } from "@angular/core";
import * as moment_ from 'moment';
/** @type {?} */
const moment = moment_;
import { ComponentPortal } from "@angular/cdk/portal";
import { NG_VALUE_ACCESSOR } from "@angular/forms";
import { NpDateRangePickerPopup } from "../components/date-range-picker-popup";
import { DATE_FORMAT, DATE_TIME_FORMAT } from "../date-picker-const";
import { NpInput } from "../../input";
import { NpDatePickerService } from "../date-picker.service";
/**
* Date range picker组件
*/
export class NpDateRangePicker {
/**
* @param {?} datePickerService
*/
constructor(datePickerService) {
this.datePickerService = datePickerService;
/**
* 展示开始时间占位符
*/
this.startPlaceholder = '';
/**
* 展示结束时间占位符
*/
this.endPlaceholder = '';
/**
* 已选时间
*/
this.dates = [];
/**
* 日期时间展示格式,默认只展示日期
*/
this.format = DATE_FORMAT;
/**
* 是否展示时间,默认不展示
*/
this.isShowTime = false;
/**
* 显示在footer左侧的自定义时间标签数组,如“昨天”等
*/
this.footerItems = [];
this.onDateRangeChanged = new EventEmitter();
this.isHover = false;
this.emitChange = (/**
* @param {?} _
* @return {?}
*/
(_) => { });
}
/**
* @return {?}
*/
ngOnInit() {
if (this.dates && this.dates.length === 2) {
/** @type {?} */
let dates = this.datePickerService.buildStartAndEndDates(moment(this.dates[0]).clone(), moment(this.dates[1]).clone());
this.startDate = dates[0];
this.endDate = dates[1];
this.syncSValue();
this.syncEValue();
}
this.overlayRef = this.datePickerService.getOverlayRef(this.dateRangeStartPicker.npInput);
if (this.isShowTime) {
this.format = DATE_TIME_FORMAT;
}
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
}
/**
* @return {?}
*/
onStartPickerClicked() {
this.onToggleDatePickerPopup();
}
/**
* @return {?}
*/
onEndPickerClicked() {
this.onToggleDatePickerPopup();
}
/**
* @return {?}
*/
onToggleDatePickerPopup() {
if (this.isDisabled) {
return;
}
if (this.overlayRef.hasAttached()) {
this.closePopup();
return;
}
this.daterangePickerPopupRef = this.overlayRef.attach(new ComponentPortal(NpDateRangePickerPopup));
this.daterangePickerPopupRef.instance.datePickerType = 'date-range-picker';
this.daterangePickerPopupRef.instance.footerItems = this.footerItems;
this.daterangePickerPopupRef.instance.startDate = moment(this.startDate);
this.daterangePickerPopupRef.instance.endDate = moment(this.endDate);
this.subscribeNotifyEvents();
this.overlayRef.backdropClick().subscribe((/**
* @return {?}
*/
() => {
this.closePopup();
}));
if (this.dateRangeWrapper && this.dateRangeWrapper.nativeElement) {
this.dateRangeWrapper.nativeElement.focus();
}
}
/**
* @param {?} data
* @return {?}
*/
onStartDateBlur(data) {
if (this.datePickerService.isValid(data.value)) {
this.startDate = moment(data.value, this.format).clone();
}
else {
// 如果输入日期不合法,默认当前时间
this.startDate = moment().clone();
}
/** @type {?} */
let dates = this.datePickerService.buildStartAndEndDates(moment(this.startDate).clone(), moment(this.endDate).clone());
this.startDate = dates[0];
this.endDate = dates[1];
this.syncSValue();
this.syncEValue();
this.emitChange([this.startDate, this.endDate]);
this.onDateRangeChanged.emit([this.startDate, this.endDate]);
}
/**
* @param {?} data
* @return {?}
*/
onEndDateBlur(data) {
if (this.datePickerService.isValid(data.value)) {
this.endDate = moment(data.value, this.format).clone();
}
else {
// 如果输入日期不合法,默认当前时间
this.endDate = moment().clone();
}
/** @type {?} */
let dates = this.datePickerService.buildStartAndEndDates(moment(this.startDate).clone(), moment(this.endDate).clone());
this.startDate = dates[0];
this.endDate = dates[1];
this.syncSValue();
this.syncEValue();
this.emitChange([this.startDate, this.endDate]);
this.onDateRangeChanged.emit([this.startDate, this.endDate]);
}
/**
* @return {?}
*/
onClear() {
if (this.isDisabled) {
return;
}
this.startDate = null;
this.endDate = null;
this.syncSValue();
this.syncEValue();
this.emitChange([]);
this.onDateRangeChanged.emit([]);
}
/**
* @return {?}
*/
onMouseenter() {
this.isHover = true;
}
/**
* @return {?}
*/
onMouseleave() {
this.isHover = false;
}
//#region Private methods
/**
* 每次this.startDate改变时,这个方法都必须要调用
* @private
* @return {?}
*/
syncSValue() {
if (this.startDate && this.datePickerService.isValid(this.startDate)) {
this.sValue = moment(this.startDate, this.format).format(this.format);
}
else {
this.sValue = '';
}
}
/**
* 每次this.endDate改变时,这个方法都必须要调用
* @private
* @return {?}
*/
syncEValue() {
if (this.endDate && this.datePickerService.isValid(this.endDate)) {
this.eValue = moment(this.endDate, this.format).format(this.format);
}
else {
this.eValue = '';
}
}
/**
* @private
* @return {?}
*/
closePopup() {
if (this.overlayRef.hasAttached()) {
this.overlayRef.detach();
}
}
/**
* @private
* @return {?}
*/
subscribeNotifyEvents() {
this.daterangePickerPopupRef.instance.onStartDayClicked.subscribe((/**
* @param {?} res
* @return {?}
*/
(res) => {
if (this.datePickerService.isValid(this.endDate)) {
this.emitDataAndClosePopup([res.day.date, moment(this.endDate).clone()]);
}
else {
this.startDate = res.day.date;
this.syncSValue();
}
}));
this.daterangePickerPopupRef.instance.onEndDayClicked.subscribe((/**
* @param {?} res
* @return {?}
*/
(res) => {
if (this.datePickerService.isValid(this.startDate)) {
this.emitDataAndClosePopup([res.day.date, moment(this.startDate).clone()]);
}
else {
this.endDate = res.day.date;
this.syncEValue();
}
}));
this.daterangePickerPopupRef.instance.onItemLabelClicked.subscribe((/**
* @param {?} res
* @return {?}
*/
(res) => {
if (res && res.values && res.values.length === 2) {
if (((res.values[0]) instanceof Function) && ((res.values[1]) instanceof Function)) {
this.emitDataAndClosePopup([((/** @type {?} */ (res.values[0])))(), ((/** @type {?} */ (res.values[1])))()]);
}
else {
this.emitDataAndClosePopup([moment((/** @type {?} */ (res.values[0]))), moment((/** @type {?} */ (res.values[1])))]);
}
}
}));
}
/**
* @private
* @param {?} dates
* @return {?}
*/
emitDataAndClosePopup(dates) {
/** @type {?} */
let sortedDates = this.datePickerService.sortDates(dates);
this.startDate = sortedDates[0].clone();
this.endDate = sortedDates[sortedDates.length - 1].clone();
this.syncSValue();
this.syncEValue();
this.emitChange([this.startDate, this.endDate]);
this.onDateRangeChanged.emit([this.startDate, this.endDate]);
this.closePopup();
}
//#endregion
//#region Implement for ControlValueAccessor
/**
* @param {?} obj
* @return {?}
*/
writeValue(obj) {
if (obj && obj.length === 2 && this.datePickerService.isValid(obj[0]) && this.datePickerService.isValid(obj[1])) {
/** @type {?} */
let sortedDates = this.datePickerService.sortDates(obj);
this.startDate = sortedDates[0].clone();
this.endDate = sortedDates[sortedDates.length - 1].clone();
}
else {
this.startDate = null;
this.endDate = null;
}
this.syncSValue();
this.syncEValue();
}
/**
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this.emitChange = fn;
}
/**
* @param {?} fn
* @return {?}
*/
registerOnTouched(fn) { }
}
NpDateRangePicker.decorators = [
{ type: Component, args: [{
selector: `np-date-range-picker`,
template: "<div class=\"np-date-range-picker-wrapper flex-wrap row-flex\" (mouseenter)=\"onMouseenter()\"\r\n (mouseleave)=\"onMouseleave()\">\r\n <i *ngIf=\"!isHover\" class=\"far fa-calendar\"></i>\r\n <i *ngIf=\"isHover\" class=\"fas fa-times-circle\" (click)=\"onClear()\"></i>\r\n <div class=\"flex-wrap col-flex\" *ngIf=\"label\">\r\n <label class=\"np-date-lbl\">\r\n <span class=\"form-required\" *ngIf=\"isRequired\">*</span>\r\n {{ label }}\r\n </label>\r\n </div>\r\n <div>\r\n <div #dateRangeWrapper class=\"date-range-wrapper flex-wrap row-flex\">\r\n <np-input #dateRangeStartPicker class=\"date-range-start-picker\" [(ngModel)]=\"sValue\" [isRequired]=\"isRequired\"\r\n [isDisabled]=\"isDisabled\" [placeholder]=\"startPlaceholder\" (click)=\"onStartPickerClicked()\" (onBlur)=\"onStartDateBlur($event)\">\r\n </np-input>\r\n <span class=\"range-picker-divider\" [ngClass]=\"{'disabled': isDisabled}\"> ~ </span>\r\n <np-input #dateRangeEndPicker class=\"date-range-end-picker\" [(ngModel)]=\"eValue\" [isDisabled]=\"isDisabled\"\r\n [placeholder]=\"endPlaceholder\" (click)=\"onEndPickerClicked()\" (onBlur)=\"onEndDateBlur($event)\">\r\n </np-input>\r\n </div>\r\n <span class=\"error-message\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n </div>\r\n</div>\r\n",
encapsulation: ViewEncapsulation.None,
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
() => NpDateRangePicker)),
multi: true,
}
],
styles: [".np-date-range-picker-wrapper{position:relative;align-items:baseline}.np-date-range-picker-wrapper>.far.fa-calendar,.np-date-range-picker-wrapper>.fas.fa-times-circle{position:absolute;right:10px;line-height:34px;font-size:15px;cursor:pointer;z-index:1}.np-date-range-picker-wrapper .np-date-lbl{width:80px;margin-right:20px;text-align:right;font-size:13px;font-weight:700;height:34px;line-height:34px}.np-date-range-picker-wrapper .date-range-wrapper .np-input-wrapper .np-input{height:32px}.np-date-range-picker-wrapper .date-range-wrapper .date-range-start-picker .np-input{width:160px}.np-date-range-picker-wrapper .date-range-wrapper .date-range-end-picker .np-input{width:190px}.np-date-range-picker-wrapper .error-message{display:block;font-size:10px;margin:5px}"]
}] }
];
/** @nocollapse */
NpDateRangePicker.ctorParameters = () => [
{ type: NpDatePickerService }
];
NpDateRangePicker.propDecorators = {
label: [{ type: Input }],
isRequired: [{ type: Input }],
startPlaceholder: [{ type: Input }],
endPlaceholder: [{ type: Input }],
errorMessage: [{ type: Input }],
isDisabled: [{ type: Input }],
dates: [{ type: Input }],
format: [{ type: Input }],
isShowTime: [{ type: Input }],
footerItems: [{ type: Input }],
onDateRangeChanged: [{ type: Output }],
dateRangeWrapper: [{ type: ViewChild, args: ['dateRangeWrapper',] }],
dateRangeStartPicker: [{ type: ViewChild, args: ['dateRangeStartPicker',] }],
dateRangeEndPicker: [{ type: ViewChild, args: ['dateRangeEndPicker',] }]
};
if (false) {
/**
* 标签
* @type {?}
*/
NpDateRangePicker.prototype.label;
/**
* 是否必填,true仅在标签前面添加红色*号, false不加
* @type {?}
*/
NpDateRangePicker.prototype.isRequired;
/**
* 展示开始时间占位符
* @type {?}
*/
NpDateRangePicker.prototype.startPlaceholder;
/**
* 展示结束时间占位符
* @type {?}
*/
NpDateRangePicker.prototype.endPlaceholder;
/**
* 校验错误时显示错误信息
* @type {?}
*/
NpDateRangePicker.prototype.errorMessage;
/**
* 是否禁用
* @type {?}
*/
NpDateRangePicker.prototype.isDisabled;
/**
* 已选时间
* @type {?}
*/
NpDateRangePicker.prototype.dates;
/**
* 日期时间展示格式,默认只展示日期
* @type {?}
*/
NpDateRangePicker.prototype.format;
/**
* 是否展示时间,默认不展示
* @type {?}
*/
NpDateRangePicker.prototype.isShowTime;
/**
* 显示在footer左侧的自定义时间标签数组,如“昨天”等
* @type {?}
*/
NpDateRangePicker.prototype.footerItems;
/** @type {?} */
NpDateRangePicker.prototype.onDateRangeChanged;
/** @type {?} */
NpDateRangePicker.prototype.dateRangeWrapper;
/** @type {?} */
NpDateRangePicker.prototype.dateRangeStartPicker;
/** @type {?} */
NpDateRangePicker.prototype.dateRangeEndPicker;
/** @type {?} */
NpDateRangePicker.prototype.daterangePickerPopupRef;
/** @type {?} */
NpDateRangePicker.prototype.startDate;
/** @type {?} */
NpDateRangePicker.prototype.endDate;
/**
* @type {?}
* @private
*/
NpDateRangePicker.prototype.overlayRef;
/** @type {?} */
NpDateRangePicker.prototype.isHover;
/**
* @type {?}
* @private
*/
NpDateRangePicker.prototype.emitChange;
/**
* 日期输入框文本值,每当this.startDate改变时此值会同步改变
* @type {?}
*/
NpDateRangePicker.prototype.sValue;
/**
* 日期输入框文本值,每当this.endDate改变时此值会同步改变
* @type {?}
*/
NpDateRangePicker.prototype.eValue;
/**
* @type {?}
* @private
*/
NpDateRangePicker.prototype.datePickerService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS1waWNrZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtcGx1dG8vIiwic291cmNlcyI6WyJsaWIvZGF0ZS1waWNrZXIvZGF0ZS1yYW5nZS1waWNrZXIvZGF0ZS1yYW5nZS1waWNrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQVUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQTRCLE1BQU0sRUFBRSxZQUFZLEVBQWdCLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3SyxPQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQzs7TUFBTyxNQUFNLEdBQUcsT0FBTztBQUV6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGlCQUFpQixFQUF3QixNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVyRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxtQkFBbUIsRUFBbUIsTUFBTSx3QkFBd0IsQ0FBQzs7OztBQW1COUUsTUFBTSxPQUFPLGlCQUFpQjs7OztJQWlENUIsWUFBb0IsaUJBQXNDO1FBQXRDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBcUI7Ozs7UUExQ2pELHFCQUFnQixHQUFXLEVBQUUsQ0FBQzs7OztRQUU5QixtQkFBYyxHQUFXLEVBQUUsQ0FBQzs7OztRQU81QixVQUFLLEdBQW1DLEVBQUUsQ0FBQzs7OztRQUUzQyxXQUFNLEdBQVcsV0FBVyxDQUFDOzs7O1FBRTdCLGVBQVUsR0FBWSxLQUFLLENBQUM7Ozs7UUFFNUIsZ0JBQVcsR0FBMkIsRUFBRSxDQUFDO1FBRXhDLHVCQUFrQixHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFhdkQsWUFBTyxHQUFZLEtBQUssQ0FBQztRQUVqQixlQUFVOzs7O1FBQUcsQ0FBQyxDQUFNLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBQztJQVV5QixDQUFDOzs7O0lBRS9ELFFBQVE7UUFDTixJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFOztnQkFDckMsS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdEgsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUNuQjtRQUVELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFMUYsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ25CLElBQUksQ0FBQyxNQUFNLEdBQUcsZ0JBQWdCLENBQUM7U0FDaEM7SUFDSCxDQUFDOzs7OztJQUVELFdBQVcsQ0FBQyxPQUFzQjtJQUNsQyxDQUFDOzs7O0lBRUQsb0JBQW9CO1FBQ2xCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0lBQ2pDLENBQUM7Ozs7SUFFRCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7SUFDakMsQ0FBQzs7OztJQUVELHVCQUF1QjtRQUNyQixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkIsT0FBTztTQUNSO1FBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ2pDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxlQUFlLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO1FBQ25HLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsY0FBYyxHQUFHLG1CQUFtQixDQUFDO1FBQzNFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDckUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBRTdCLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLENBQUMsU0FBUzs7O1FBQUMsR0FBRyxFQUFFO1lBQzdDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQixDQUFDLEVBQUMsQ0FBQztRQUVILElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUU7WUFDaEUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUM3QztJQUNILENBQUM7Ozs7O0lBRUQsZUFBZSxDQUFDLElBQWdDO1FBQzlDLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDOUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDMUQ7YUFBTTtZQUNMLG1CQUFtQjtZQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ25DOztZQUVHLEtBQUssR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3RILElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQzs7Ozs7SUFFRCxhQUFhLENBQUMsSUFBZ0M7UUFDNUMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM5QyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUN4RDthQUFNO1lBQ0wsbUJBQW1CO1lBQ25CLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDakM7O1lBRUcsS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEgsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUMvRCxDQUFDOzs7O0lBRUQsT0FBTztRQUNMLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRWxCLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNuQyxDQUFDOzs7O0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7Ozs7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDdkIsQ0FBQzs7Ozs7OztJQUtPLFVBQVU7UUFDaEIsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ3BFLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDdkU7YUFBTTtZQUNMLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1NBQ2xCO0lBQ0gsQ0FBQzs7Ozs7O0lBR08sVUFBVTtRQUNoQixJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDaEUsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNyRTthQUFNO1lBQ0wsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7U0FDbEI7SUFDSCxDQUFDOzs7OztJQUVPLFVBQVU7UUFDaEIsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ2pDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDMUI7SUFDSCxDQUFDOzs7OztJQUVPLHFCQUFxQjtRQUMzQixJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFNBQVM7Ozs7UUFBQyxDQUFDLEdBQWdELEVBQUUsRUFBRTtZQUNySCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNoRCxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQzthQUMxRTtpQkFBTTtnQkFDTCxJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO2dCQUM5QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7YUFDbkI7UUFDSCxDQUFDLEVBQUMsQ0FBQztRQUVILElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLFNBQVM7Ozs7UUFBQyxDQUFDLEdBQWdELEVBQUUsRUFBRTtZQUNuSCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFO2dCQUNsRCxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQzthQUM1RTtpQkFBTTtnQkFDTCxJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO2dCQUM1QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7YUFDbkI7UUFDSCxDQUFDLEVBQUMsQ0FBQztRQUVILElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsU0FBUzs7OztRQUFDLENBQUMsR0FBeUIsRUFBRSxFQUFFO1lBQy9GLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUNoRCxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxRQUFRLENBQUMsRUFBRTtvQkFDbEYsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxtQkFBSyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFBLENBQUMsRUFBRSxFQUFFLENBQUMsbUJBQUssR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBQSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7aUJBQzlFO3FCQUFNO29CQUNMLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxtQkFBSyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFBLENBQUMsRUFBRSxNQUFNLENBQUMsbUJBQUssR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBQSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN0RjthQUNGO1FBQ0gsQ0FBQyxFQUFDLENBQUM7SUFDTCxDQUFDOzs7Ozs7SUFFTyxxQkFBcUIsQ0FBQyxLQUE0Qjs7WUFDcEQsV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO1FBQ3pELElBQUksQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDM0QsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQzs7Ozs7OztJQUlELFVBQVUsQ0FBQyxHQUFRO1FBQ2pCLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTs7Z0JBQzNHLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQztZQUN2RCxJQUFJLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsT0FBTyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQzVEO2FBQU07WUFDTCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUN0QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztTQUNyQjtRQUVELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQzs7Ozs7SUFFRCxnQkFBZ0IsQ0FBQyxFQUFPO1FBQ3RCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7Ozs7O0lBRUQsaUJBQWlCLENBQUMsRUFBTyxJQUFVLENBQUM7OztZQXJRckMsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxzQkFBc0I7Z0JBQ2hDLHcxQ0FBcUM7Z0JBRXJDLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO2dCQUNyQyxTQUFTLEVBQUU7b0JBQ1Q7d0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjt3QkFDMUIsV0FBVyxFQUFFLFVBQVU7Ozt3QkFBQyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsRUFBQzt3QkFDaEQsS0FBSyxFQUFFLElBQUk7cUJBQ1o7aUJBQ0Y7O2FBQ0Y7Ozs7WUFqQlEsbUJBQW1COzs7b0JBc0J6QixLQUFLO3lCQUVMLEtBQUs7K0JBRUwsS0FBSzs2QkFFTCxLQUFLOzJCQUVMLEtBQUs7eUJBRUwsS0FBSztvQkFHTCxLQUFLO3FCQUVMLEtBQUs7eUJBRUwsS0FBSzswQkFFTCxLQUFLO2lDQUVMLE1BQU07K0JBRU4sU0FBUyxTQUFDLGtCQUFrQjttQ0FDNUIsU0FBUyxTQUFDLHNCQUFzQjtpQ0FDaEMsU0FBUyxTQUFDLG9CQUFvQjs7Ozs7OztJQXpCL0Isa0NBQXVCOzs7OztJQUV2Qix1Q0FBNkI7Ozs7O0lBRTdCLDZDQUF1Qzs7Ozs7SUFFdkMsMkNBQXFDOzs7OztJQUVyQyx5Q0FBOEI7Ozs7O0lBRTlCLHVDQUE2Qjs7Ozs7SUFHN0Isa0NBQW9EOzs7OztJQUVwRCxtQ0FBc0M7Ozs7O0lBRXRDLHVDQUFxQzs7Ozs7SUFFckMsd0NBQWtEOztJQUVsRCwrQ0FBdUQ7O0lBRXZELDZDQUF5RTs7SUFDekUsaURBQWlFOztJQUNqRSwrQ0FBNkQ7O0lBRTdELG9EQUE4RDs7SUFHOUQsc0NBQW1DOztJQUNuQyxvQ0FBaUM7Ozs7O0lBRWpDLHVDQUErQjs7SUFDL0Isb0NBQXlCOzs7OztJQUV6Qix1Q0FBcUM7Ozs7O0lBSXJDLG1DQUFlOzs7OztJQUlmLG1DQUFlOzs7OztJQUVILDhDQUE4QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgVmlld0VuY2Fwc3VsYXRpb24sIE9uSW5pdCwgSW5wdXQsIFZpZXdDaGlsZCwgZm9yd2FyZFJlZiwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgQ29tcG9uZW50UmVmLCBFbGVtZW50UmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0ICogYXMgbW9tZW50XyBmcm9tICdtb21lbnQnOyBjb25zdCBtb21lbnQgPSBtb21lbnRfXHJcbmltcG9ydCB7IE92ZXJsYXlSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL292ZXJsYXlcIjtcclxuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsIH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9wb3J0YWxcIjtcclxuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IE5wRGF0ZVJhbmdlUGlja2VyUG9wdXAgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9kYXRlLXJhbmdlLXBpY2tlci1wb3B1cFwiO1xyXG5pbXBvcnQgeyBEQVRFX0ZPUk1BVCwgREFURV9USU1FX0ZPUk1BVCB9IGZyb20gXCIuLi9kYXRlLXBpY2tlci1jb25zdFwiO1xyXG5pbXBvcnQgeyBEYXRlUGlja2VyRm9vdGVySXRlbSB9IGZyb20gXCIuLi9jb21wb25lbnRzL2RhdGUtcGlja2VyLWZvb3RlclwiO1xyXG5pbXBvcnQgeyBOcElucHV0IH0gZnJvbSBcIi4uLy4uL2lucHV0XCI7XHJcbmltcG9ydCB7IE5wRGF0ZVBpY2tlclNlcnZpY2UsIERheURhdGFQZXJNb250aCB9IGZyb20gXCIuLi9kYXRlLXBpY2tlci5zZXJ2aWNlXCI7XHJcblxyXG4vKipcclxuICogRGF0ZSByYW5nZSBwaWNrZXLnu4Tku7ZcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBgbnAtZGF0ZS1yYW5nZS1waWNrZXJgLFxyXG4gIHRlbXBsYXRlVXJsOiAnZGF0ZS1yYW5nZS1waWNrZXIuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJ2RhdGUtcmFuZ2UtcGlja2VyLnNjc3MnXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTnBEYXRlUmFuZ2VQaWNrZXIpLFxyXG4gICAgICBtdWx0aTogdHJ1ZSxcclxuICAgIH1cclxuICBdXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgTnBEYXRlUmFuZ2VQaWNrZXIgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG5cclxuICAvKirmoIfnrb4gKi9cclxuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nO1xyXG4gIC8qKuaYr+WQpuW/heWhq++8jHRydWXku4XlnKjmoIfnrb7liY3pnaLmt7vliqDnuqLoibIq5Y+377yMIGZhbHNl5LiN5YqgKi9cclxuICBASW5wdXQoKSBpc1JlcXVpcmVkOiBib29sZWFuO1xyXG4gIC8qKuWxleekuuW8gOWni+aXtumXtOWNoOS9jeespiAqL1xyXG4gIEBJbnB1dCgpIHN0YXJ0UGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xyXG4gIC8qKuWxleekuue7k+adn+aXtumXtOWNoOS9jeespiAqL1xyXG4gIEBJbnB1dCgpIGVuZFBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcclxuICAvKirmoKHpqozplJnor6/ml7bmmL7npLrplJnor6/kv6Hmga8gKi9cclxuICBASW5wdXQoKSBlcnJvck1lc3NhZ2U6IHN0cmluZztcclxuICAvKirmmK/lkKbnpoHnlKggKi9cclxuICBASW5wdXQoKSBpc0Rpc2FibGVkOiBib29sZWFuO1xyXG5cclxuICAvKirlt7LpgInml7bpl7QgKi9cclxuICBASW5wdXQoKSBkYXRlczogQXJyYXk8bW9tZW50Xy5Nb21lbnQgfCBzdHJpbmc+ID0gW107XHJcbiAgLyoq5pel5pyf5pe26Ze05bGV56S65qC85byP77yM6buY6K6k5Y+q5bGV56S65pel5pyfICovXHJcbiAgQElucHV0KCkgZm9ybWF0OiBzdHJpbmcgPSBEQVRFX0ZPUk1BVDtcclxuICAvKirmmK/lkKblsZXnpLrml7bpl7TvvIzpu5jorqTkuI3lsZXnpLogKi9cclxuICBASW5wdXQoKSBpc1Nob3dUaW1lOiBib29sZWFuID0gZmFsc2U7XHJcbiAgLyoq5pi+56S65ZyoZm9vdGVy5bem5L6n55qE6Ieq5a6a5LmJ5pe26Ze05qCH562+5pWw57uE77yM5aaC4oCc5pio5aSp4oCd562JICovXHJcbiAgQElucHV0KCkgZm9vdGVySXRlbXM6IERhdGVQaWNrZXJGb290ZXJJdGVtW10gPSBbXTtcclxuXHJcbiAgQE91dHB1dCgpIG9uRGF0ZVJhbmdlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAVmlld0NoaWxkKCdkYXRlUmFuZ2VXcmFwcGVyJykgZGF0ZVJhbmdlV3JhcHBlcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XHJcbiAgQFZpZXdDaGlsZCgnZGF0ZVJhbmdlU3RhcnRQaWNrZXInKSBkYXRlUmFuZ2VTdGFydFBpY2tlcjogTnBJbnB1dDtcclxuICBAVmlld0NoaWxkKCdkYXRlUmFuZ2VFbmRQaWNrZXInKSBkYXRlUmFuZ2VFbmRQaWNrZXI6IE5wSW5wdXQ7XHJcblxyXG4gIGRhdGVyYW5nZVBpY2tlclBvcHVwUmVmOiBDb21wb25lbnRSZWY8TnBEYXRlUmFuZ2VQaWNrZXJQb3B1cD47XHJcblxyXG5cclxuICBzdGFydERhdGU6IG1vbWVudF8uTW9tZW50IHwgc3RyaW5nO1xyXG4gIGVuZERhdGU6IG1vbWVudF8uTW9tZW50IHwgc3RyaW5nO1xyXG5cclxuICBwcml2YXRlIG92ZXJsYXlSZWY6IE92ZXJsYXlSZWY7XHJcbiAgaXNIb3ZlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIGVtaXRDaGFuZ2UgPSAoXzogYW55KSA9PiB7IH07XHJcblxyXG5cclxuICAvKirml6XmnJ/ovpPlhaXmoYbmlofmnKzlgLzvvIzmr4/lvZN0aGlzLnN0YXJ0RGF0ZeaUueWPmOaXtuatpOWAvOS8muWQjOatpeaUueWPmCovXHJcbiAgc1ZhbHVlOiBzdHJpbmc7XHJcblxyXG5cclxuICAvKirml6XmnJ/ovpPlhaXmoYbmlofmnKzlgLzvvIzmr4/lvZN0aGlzLmVuZERhdGXmlLnlj5jml7bmraTlgLzkvJrlkIzmraXmlLnlj5gqL1xyXG4gIGVWYWx1ZTogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRhdGVQaWNrZXJTZXJ2aWNlOiBOcERhdGVQaWNrZXJTZXJ2aWNlKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBpZiAodGhpcy5kYXRlcyAmJiB0aGlzLmRhdGVzLmxlbmd0aCA9PT0gMikge1xyXG4gICAgICBsZXQgZGF0ZXMgPSB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmJ1aWxkU3RhcnRBbmRFbmREYXRlcyhtb21lbnQodGhpcy5kYXRlc1swXSkuY2xvbmUoKSwgbW9tZW50KHRoaXMuZGF0ZXNbMV0pLmNsb25lKCkpO1xyXG4gICAgICB0aGlzLnN0YXJ0RGF0ZSA9IGRhdGVzWzBdO1xyXG4gICAgICB0aGlzLmVuZERhdGUgPSBkYXRlc1sxXTtcclxuICAgICAgdGhpcy5zeW5jU1ZhbHVlKCk7XHJcbiAgICAgIHRoaXMuc3luY0VWYWx1ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub3ZlcmxheVJlZiA9IHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuZ2V0T3ZlcmxheVJlZih0aGlzLmRhdGVSYW5nZVN0YXJ0UGlja2VyLm5wSW5wdXQpO1xyXG5cclxuICAgIGlmICh0aGlzLmlzU2hvd1RpbWUpIHtcclxuICAgICAgdGhpcy5mb3JtYXQgPSBEQVRFX1RJTUVfRk9STUFUO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgb25TdGFydFBpY2tlckNsaWNrZWQoKSB7XHJcbiAgICB0aGlzLm9uVG9nZ2xlRGF0ZVBpY2tlclBvcHVwKCk7XHJcbiAgfVxyXG5cclxuICBvbkVuZFBpY2tlckNsaWNrZWQoKSB7XHJcbiAgICB0aGlzLm9uVG9nZ2xlRGF0ZVBpY2tlclBvcHVwKCk7XHJcbiAgfVxyXG5cclxuICBvblRvZ2dsZURhdGVQaWNrZXJQb3B1cCgpIHtcclxuICAgIGlmICh0aGlzLmlzRGlzYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm92ZXJsYXlSZWYuaGFzQXR0YWNoZWQoKSkge1xyXG4gICAgICB0aGlzLmNsb3NlUG9wdXAoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZGF0ZXJhbmdlUGlja2VyUG9wdXBSZWYgPSB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKG5ldyBDb21wb25lbnRQb3J0YWwoTnBEYXRlUmFuZ2VQaWNrZXJQb3B1cCkpO1xyXG4gICAgdGhpcy5kYXRlcmFuZ2VQaWNrZXJQb3B1cFJlZi5pbnN0YW5jZS5kYXRlUGlja2VyVHlwZSA9ICdkYXRlLXJhbmdlLXBpY2tlcic7XHJcbiAgICB0aGlzLmRhdGVyYW5nZVBpY2tlclBvcHVwUmVmLmluc3RhbmNlLmZvb3Rlckl0ZW1zID0gdGhpcy5mb290ZXJJdGVtcztcclxuICAgIHRoaXMuZGF0ZXJhbmdlUGlja2VyUG9wdXBSZWYuaW5zdGFuY2Uuc3RhcnREYXRlID0gbW9tZW50KHRoaXMuc3RhcnREYXRlKTtcclxuICAgIHRoaXMuZGF0ZXJhbmdlUGlja2VyUG9wdXBSZWYuaW5zdGFuY2UuZW5kRGF0ZSA9IG1vbWVudCh0aGlzLmVuZERhdGUpO1xyXG4gICAgdGhpcy5zdWJzY3JpYmVOb3RpZnlFdmVudHMoKTtcclxuXHJcbiAgICB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuY2xvc2VQb3B1cCgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMuZGF0ZVJhbmdlV3JhcHBlciAmJiB0aGlzLmRhdGVSYW5nZVdyYXBwZXIubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICB0aGlzLmRhdGVSYW5nZVdyYXBwZXIubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25TdGFydERhdGVCbHVyKGRhdGE6IHsgdmFsdWU6IGFueSwgZXZlbnQ6IGFueSB9KSB7XHJcbiAgICBpZiAodGhpcy5kYXRlUGlja2VyU2VydmljZS5pc1ZhbGlkKGRhdGEudmFsdWUpKSB7XHJcbiAgICAgIHRoaXMuc3RhcnREYXRlID0gbW9tZW50KGRhdGEudmFsdWUsIHRoaXMuZm9ybWF0KS5jbG9uZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8g5aaC5p6c6L6T5YWl5pel5pyf5LiN5ZCI5rOV77yM6buY6K6k5b2T5YmN5pe26Ze0XHJcbiAgICAgIHRoaXMuc3RhcnREYXRlID0gbW9tZW50KCkuY2xvbmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZGF0ZXMgPSB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmJ1aWxkU3RhcnRBbmRFbmREYXRlcyhtb21lbnQodGhpcy5zdGFydERhdGUpLmNsb25lKCksIG1vbWVudCh0aGlzLmVuZERhdGUpLmNsb25lKCkpO1xyXG4gICAgdGhpcy5zdGFydERhdGUgPSBkYXRlc1swXTtcclxuICAgIHRoaXMuZW5kRGF0ZSA9IGRhdGVzWzFdO1xyXG4gICAgdGhpcy5zeW5jU1ZhbHVlKCk7XHJcbiAgICB0aGlzLnN5bmNFVmFsdWUoKTtcclxuICAgIHRoaXMuZW1pdENoYW5nZShbdGhpcy5zdGFydERhdGUsIHRoaXMuZW5kRGF0ZV0pO1xyXG4gICAgdGhpcy5vbkRhdGVSYW5nZUNoYW5nZWQuZW1pdChbdGhpcy5zdGFydERhdGUsIHRoaXMuZW5kRGF0ZV0pO1xyXG4gIH1cclxuXHJcbiAgb25FbmREYXRlQmx1cihkYXRhOiB7IHZhbHVlOiBhbnksIGV2ZW50OiBhbnkgfSkge1xyXG4gICAgaWYgKHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuaXNWYWxpZChkYXRhLnZhbHVlKSkge1xyXG4gICAgICB0aGlzLmVuZERhdGUgPSBtb21lbnQoZGF0YS52YWx1ZSwgdGhpcy5mb3JtYXQpLmNsb25lKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyDlpoLmnpzovpPlhaXml6XmnJ/kuI3lkIjms5XvvIzpu5jorqTlvZPliY3ml7bpl7RcclxuICAgICAgdGhpcy5lbmREYXRlID0gbW9tZW50KCkuY2xvbmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZGF0ZXMgPSB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmJ1aWxkU3RhcnRBbmRFbmREYXRlcyhtb21lbnQodGhpcy5zdGFydERhdGUpLmNsb25lKCksIG1vbWVudCh0aGlzLmVuZERhdGUpLmNsb25lKCkpO1xyXG4gICAgdGhpcy5zdGFydERhdGUgPSBkYXRlc1swXTtcclxuICAgIHRoaXMuZW5kRGF0ZSA9IGRhdGVzWzFdO1xyXG4gICAgdGhpcy5zeW5jU1ZhbHVlKCk7XHJcbiAgICB0aGlzLnN5bmNFVmFsdWUoKTtcclxuICAgIHRoaXMuZW1pdENoYW5nZShbdGhpcy5zdGFydERhdGUsIHRoaXMuZW5kRGF0ZV0pO1xyXG4gICAgdGhpcy5vbkRhdGVSYW5nZUNoYW5nZWQuZW1pdChbdGhpcy5zdGFydERhdGUsIHRoaXMuZW5kRGF0ZV0pO1xyXG4gIH1cclxuXHJcbiAgb25DbGVhcigpIHtcclxuICAgIGlmICh0aGlzLmlzRGlzYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3RhcnREYXRlID0gbnVsbDtcclxuICAgIHRoaXMuZW5kRGF0ZSA9IG51bGw7XHJcbiAgICB0aGlzLnN5bmNTVmFsdWUoKTtcclxuICAgIHRoaXMuc3luY0VWYWx1ZSgpO1xyXG5cclxuICAgIHRoaXMuZW1pdENoYW5nZShbXSk7XHJcbiAgICB0aGlzLm9uRGF0ZVJhbmdlQ2hhbmdlZC5lbWl0KFtdKTtcclxuICB9XHJcblxyXG4gIG9uTW91c2VlbnRlcigpIHtcclxuICAgIHRoaXMuaXNIb3ZlciA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBvbk1vdXNlbGVhdmUoKSB7XHJcbiAgICB0aGlzLmlzSG92ZXIgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBQcml2YXRlIG1ldGhvZHNcclxuXHJcbiAgLyoq5q+P5qyhdGhpcy5zdGFydERhdGXmlLnlj5jml7bvvIzov5nkuKrmlrnms5Xpg73lv4XpobvopoHosIPnlKggKi9cclxuICBwcml2YXRlIHN5bmNTVmFsdWUoKSB7XHJcbiAgICBpZiAodGhpcy5zdGFydERhdGUgJiYgdGhpcy5kYXRlUGlja2VyU2VydmljZS5pc1ZhbGlkKHRoaXMuc3RhcnREYXRlKSkge1xyXG4gICAgICB0aGlzLnNWYWx1ZSA9IG1vbWVudCh0aGlzLnN0YXJ0RGF0ZSwgdGhpcy5mb3JtYXQpLmZvcm1hdCh0aGlzLmZvcm1hdCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNWYWx1ZSA9ICcnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoq5q+P5qyhdGhpcy5lbmREYXRl5pS55Y+Y5pe277yM6L+Z5Liq5pa55rOV6YO95b+F6aG76KaB6LCD55SoICovXHJcbiAgcHJpdmF0ZSBzeW5jRVZhbHVlKCkge1xyXG4gICAgaWYgKHRoaXMuZW5kRGF0ZSAmJiB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmlzVmFsaWQodGhpcy5lbmREYXRlKSkge1xyXG4gICAgICB0aGlzLmVWYWx1ZSA9IG1vbWVudCh0aGlzLmVuZERhdGUsIHRoaXMuZm9ybWF0KS5mb3JtYXQodGhpcy5mb3JtYXQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5lVmFsdWUgPSAnJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xvc2VQb3B1cCgpIHtcclxuICAgIGlmICh0aGlzLm92ZXJsYXlSZWYuaGFzQXR0YWNoZWQoKSkge1xyXG4gICAgICB0aGlzLm92ZXJsYXlSZWYuZGV0YWNoKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN1YnNjcmliZU5vdGlmeUV2ZW50cygpIHtcclxuICAgIHRoaXMuZGF0ZXJhbmdlUGlja2VyUG9wdXBSZWYuaW5zdGFuY2Uub25TdGFydERheUNsaWNrZWQuc3Vic2NyaWJlKChyZXM6IHsgZGF5OiBEYXlEYXRhUGVyTW9udGgsIGRhdGVzOiBBcnJheTxhbnk+IH0pID0+IHtcclxuICAgICAgaWYgKHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuaXNWYWxpZCh0aGlzLmVuZERhdGUpKSB7XHJcbiAgICAgICAgdGhpcy5lbWl0RGF0YUFuZENsb3NlUG9wdXAoW3Jlcy5kYXkuZGF0ZSwgbW9tZW50KHRoaXMuZW5kRGF0ZSkuY2xvbmUoKV0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3RhcnREYXRlID0gcmVzLmRheS5kYXRlO1xyXG4gICAgICAgIHRoaXMuc3luY1NWYWx1ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmRhdGVyYW5nZVBpY2tlclBvcHVwUmVmLmluc3RhbmNlLm9uRW5kRGF5Q2xpY2tlZC5zdWJzY3JpYmUoKHJlczogeyBkYXk6IERheURhdGFQZXJNb250aCwgZGF0ZXM6IEFycmF5PGFueT4gfSkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5kYXRlUGlja2VyU2VydmljZS5pc1ZhbGlkKHRoaXMuc3RhcnREYXRlKSkge1xyXG4gICAgICAgIHRoaXMuZW1pdERhdGFBbmRDbG9zZVBvcHVwKFtyZXMuZGF5LmRhdGUsIG1vbWVudCh0aGlzLnN0YXJ0RGF0ZSkuY2xvbmUoKV0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZW5kRGF0ZSA9IHJlcy5kYXkuZGF0ZTtcclxuICAgICAgICB0aGlzLnN5bmNFVmFsdWUoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5kYXRlcmFuZ2VQaWNrZXJQb3B1cFJlZi5pbnN0YW5jZS5vbkl0ZW1MYWJlbENsaWNrZWQuc3Vic2NyaWJlKChyZXM6IERhdGVQaWNrZXJGb290ZXJJdGVtKSA9PiB7XHJcbiAgICAgIGlmIChyZXMgJiYgcmVzLnZhbHVlcyAmJiByZXMudmFsdWVzLmxlbmd0aCA9PT0gMikge1xyXG4gICAgICAgIGlmICgoKHJlcy52YWx1ZXNbMF0pIGluc3RhbmNlb2YgRnVuY3Rpb24pICYmICgocmVzLnZhbHVlc1sxXSkgaW5zdGFuY2VvZiBGdW5jdGlvbikpIHtcclxuICAgICAgICAgIHRoaXMuZW1pdERhdGFBbmRDbG9zZVBvcHVwKFsoPGFueT5yZXMudmFsdWVzWzBdKSgpLCAoPGFueT5yZXMudmFsdWVzWzFdKSgpXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZW1pdERhdGFBbmRDbG9zZVBvcHVwKFttb21lbnQoPGFueT5yZXMudmFsdWVzWzBdKSwgbW9tZW50KDxhbnk+cmVzLnZhbHVlc1sxXSldKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbWl0RGF0YUFuZENsb3NlUG9wdXAoZGF0ZXM6IEFycmF5PG1vbWVudF8uTW9tZW50Pikge1xyXG4gICAgbGV0IHNvcnRlZERhdGVzID0gdGhpcy5kYXRlUGlja2VyU2VydmljZS5zb3J0RGF0ZXMoZGF0ZXMpO1xyXG4gICAgdGhpcy5zdGFydERhdGUgPSBzb3J0ZWREYXRlc1swXS5jbG9uZSgpO1xyXG4gICAgdGhpcy5lbmREYXRlID0gc29ydGVkRGF0ZXNbc29ydGVkRGF0ZXMubGVuZ3RoIC0gMV0uY2xvbmUoKTtcclxuICAgIHRoaXMuc3luY1NWYWx1ZSgpO1xyXG4gICAgdGhpcy5zeW5jRVZhbHVlKCk7XHJcbiAgICB0aGlzLmVtaXRDaGFuZ2UoW3RoaXMuc3RhcnREYXRlLCB0aGlzLmVuZERhdGVdKTtcclxuICAgIHRoaXMub25EYXRlUmFuZ2VDaGFuZ2VkLmVtaXQoW3RoaXMuc3RhcnREYXRlLCB0aGlzLmVuZERhdGVdKTtcclxuICAgIHRoaXMuY2xvc2VQb3B1cCgpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIEltcGxlbWVudCBmb3IgQ29udHJvbFZhbHVlQWNjZXNzb3JcclxuICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XHJcbiAgICBpZiAob2JqICYmIG9iai5sZW5ndGggPT09IDIgJiYgdGhpcy5kYXRlUGlja2VyU2VydmljZS5pc1ZhbGlkKG9ialswXSkgJiYgdGhpcy5kYXRlUGlja2VyU2VydmljZS5pc1ZhbGlkKG9ialsxXSkpIHtcclxuICAgICAgbGV0IHNvcnRlZERhdGVzID0gdGhpcy5kYXRlUGlja2VyU2VydmljZS5zb3J0RGF0ZXMob2JqKTtcclxuICAgICAgdGhpcy5zdGFydERhdGUgPSBzb3J0ZWREYXRlc1swXS5jbG9uZSgpO1xyXG4gICAgICB0aGlzLmVuZERhdGUgPSBzb3J0ZWREYXRlc1tzb3J0ZWREYXRlcy5sZW5ndGggLSAxXS5jbG9uZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zdGFydERhdGUgPSBudWxsO1xyXG4gICAgICB0aGlzLmVuZERhdGUgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3luY1NWYWx1ZSgpO1xyXG4gICAgdGhpcy5zeW5jRVZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuZW1pdENoYW5nZSA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQgeyB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcbn0iXX0=