theme-lib
Version:
This is a simple example Angular Library published to npm.
561 lines • 41.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/*
* @license
* Copyright Akveo. All Rights Reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*/
import { Component, ComponentFactoryResolver, EventEmitter, Inject, Input, Output, Type, } from '@angular/core';
import { takeWhile } from 'rxjs/operators';
import { Subject } from 'rxjs';
import { NbAdjustment, NbComponentPortal, NbOverlayService, NbPosition, NbPositionBuilderService, NbTrigger, NbTriggerStrategyBuilder, patch, } from '../cdk';
import { NbDatepickerContainerComponent } from './datepicker-container.component';
import { NB_DOCUMENT } from '../../theme.options';
import { NbCalendarRangeComponent } from '../calendar/calendar-range.component';
import { NbCalendarComponent } from '../calendar/calendar.component';
import { NbCalendarSize, NbCalendarViewMode, NbDateService, NbNativeDateService, } from '../calendar-kit';
import { NbDatepicker } from './datepicker.directive';
/*
* The `NbBasePicker` component concentrates overlay manipulation logic.
* */
/**
* @abstract
* @template D, T, P
*/
export class NbBasePicker extends NbDatepicker {
/**
* @param {?} document
* @param {?} positionBuilder
* @param {?} overlay
* @param {?} cfr
* @param {?} dateService
*/
constructor(document, positionBuilder, overlay, cfr, dateService) {
super();
this.document = document;
this.positionBuilder = positionBuilder;
this.overlay = overlay;
this.cfr = cfr;
this.dateService = dateService;
/*
* Defines if we should render previous and next months
* in the current month view.
* */
this.boundingMonth = true;
/*
* Defines starting view for calendar.
* */
this.startView = NbCalendarViewMode.DATE;
/*
* Size of the calendar and entire components.
* Can be 'medium' which is default or 'large'.
* */
this.size = NbCalendarSize.MEDIUM;
/*
* Hide picker when a date or a range is selected, `true` by default
* @type {boolean}
*/
this.hideOnSelect = true;
/*
* Stream of picker changes. Required to be the subject because picker hides and shows and picker
* change stream becomes recreated.
* */
this.onChange$ = new Subject();
this.alive = true;
this.blur$ = new Subject();
}
/*
* Returns picker instance.
* */
/**
* @return {?}
*/
get picker() {
return this.pickerRef && this.pickerRef.instance;
}
/*
* Stream of picker value changes.
* */
/**
* @return {?}
*/
get valueChange() {
return this.onChange$.asObservable();
}
/**
* @return {?}
*/
get isShown() {
return this.ref && this.ref.hasAttached();
}
/*
* Emits when datepicker looses focus.
*/
/**
* @return {?}
*/
get blur() {
return this.blur$.asObservable();
}
/**
* @return {?}
*/
ngOnChanges() {
if (this.dateService instanceof NbNativeDateService && this.format) {
throw new Error('Can\'t format native date. To use custom formatting you have to install @nebular/moment or ' +
'@nebular/date-fns package and import NbMomentDateModule or NbDateFnsDateModule accordingly.' +
'More information at "Formatting issue" ' +
'https://akveo.github.io/nebular/docs/components/datepicker/overview#nbdatepickercomponent');
}
}
/**
* @return {?}
*/
ngOnDestroy() {
this.alive = false;
this.hide();
this.ref.dispose();
}
/*
* Datepicker knows nothing about host html input element.
* So, attach method attaches datepicker to the host input element.
* */
/**
* @param {?} hostRef
* @return {?}
*/
attach(hostRef) {
this.hostRef = hostRef;
this.positionStrategy = this.createPositionStrategy();
this.ref = this.overlay.create({
positionStrategy: this.positionStrategy,
scrollStrategy: this.overlay.scrollStrategies.reposition(),
});
this.subscribeOnPositionChange();
this.subscribeOnTriggers();
}
/**
* @return {?}
*/
getValidatorConfig() {
return { min: this.min, max: this.max, filter: this.filter };
}
/**
* @return {?}
*/
show() {
this.container = this.ref.attach(new NbComponentPortal(NbDatepickerContainerComponent, null, null, this.cfr));
this.instantiatePicker();
this.subscribeOnValueChange();
this.writeQueue();
this.patchWithInputs();
}
/**
* @return {?}
*/
shouldHide() {
return this.hideOnSelect && !!this.value;
}
/**
* @return {?}
*/
hide() {
this.ref.detach();
// save current value if picker was rendered
if (this.picker) {
this.queue = this.value;
this.pickerRef.destroy();
this.pickerRef = null;
this.container = null;
}
}
/**
* @protected
* @return {?}
*/
createPositionStrategy() {
return this.positionBuilder
.connectedTo(this.hostRef)
.position(NbPosition.BOTTOM)
.adjustment(NbAdjustment.COUNTERCLOCKWISE);
}
/**
* @protected
* @return {?}
*/
subscribeOnPositionChange() {
this.positionStrategy.positionChange
.pipe(takeWhile(() => this.alive))
.subscribe((position) => patch(this.container, { position }));
}
/**
* @protected
* @return {?}
*/
createTriggerStrategy() {
return new NbTriggerStrategyBuilder()
.document(this.document)
.trigger(NbTrigger.FOCUS)
.host(this.hostRef.nativeElement)
.container(() => this.container)
.build();
}
/**
* @protected
* @return {?}
*/
subscribeOnTriggers() {
/** @type {?} */
const triggerStrategy = this.createTriggerStrategy();
triggerStrategy.show$.pipe(takeWhile(() => this.alive)).subscribe(() => this.show());
triggerStrategy.hide$.pipe(takeWhile(() => this.alive)).subscribe(() => {
this.blur$.next();
this.hide();
});
}
/**
* @protected
* @return {?}
*/
instantiatePicker() {
this.pickerRef = this.container.instance.attach(new NbComponentPortal(this.pickerClass, null, null, this.cfr));
}
/*
* Subscribes on picker value changes and emit data through this.onChange$ subject.
* */
/**
* @protected
* @return {?}
*/
subscribeOnValueChange() {
this.pickerValueChange.subscribe(date => {
this.onChange$.next(date);
});
}
/**
* @protected
* @return {?}
*/
patchWithInputs() {
this.picker.boundingMonth = this.boundingMonth;
this.picker.startView = this.startView;
this.picker.min = this.min;
this.picker.max = this.max;
this.picker.filter = this.filter;
this.picker._cellComponent = this.dayCellComponent;
this.picker.monthCellComponent = this.monthCellComponent;
this.picker._yearCellComponent = this.yearCellComponent;
this.picker.size = this.size;
this.picker.visibleDate = this.visibleDate;
}
}
/** @nocollapse */
NbBasePicker.ctorParameters = () => [
{ type: undefined, decorators: [{ type: Inject, args: [NB_DOCUMENT,] }] },
{ type: NbPositionBuilderService },
{ type: NbOverlayService },
{ type: ComponentFactoryResolver },
{ type: NbDateService }
];
NbBasePicker.propDecorators = {
format: [{ type: Input }],
boundingMonth: [{ type: Input }],
startView: [{ type: Input }],
min: [{ type: Input }],
max: [{ type: Input }],
filter: [{ type: Input }],
dayCellComponent: [{ type: Input }],
monthCellComponent: [{ type: Input }],
yearCellComponent: [{ type: Input }],
size: [{ type: Input }],
visibleDate: [{ type: Input }],
hideOnSelect: [{ type: Input }]
};
if (false) {
/** @type {?} */
NbBasePicker.prototype.format;
/** @type {?} */
NbBasePicker.prototype.boundingMonth;
/** @type {?} */
NbBasePicker.prototype.startView;
/** @type {?} */
NbBasePicker.prototype.min;
/** @type {?} */
NbBasePicker.prototype.max;
/** @type {?} */
NbBasePicker.prototype.filter;
/** @type {?} */
NbBasePicker.prototype.dayCellComponent;
/** @type {?} */
NbBasePicker.prototype.monthCellComponent;
/** @type {?} */
NbBasePicker.prototype.yearCellComponent;
/** @type {?} */
NbBasePicker.prototype.size;
/** @type {?} */
NbBasePicker.prototype.visibleDate;
/** @type {?} */
NbBasePicker.prototype.hideOnSelect;
/**
* @type {?}
* @protected
*/
NbBasePicker.prototype.pickerClass;
/**
* @type {?}
* @protected
*/
NbBasePicker.prototype.ref;
/**
* @type {?}
* @protected
*/
NbBasePicker.prototype.container;
/**
* @type {?}
* @protected
*/
NbBasePicker.prototype.positionStrategy;
/**
* @type {?}
* @protected
*/
NbBasePicker.prototype.hostRef;
/**
* @type {?}
* @protected
*/
NbBasePicker.prototype.onChange$;
/**
* @type {?}
* @protected
*/
NbBasePicker.prototype.pickerRef;
/**
* @type {?}
* @protected
*/
NbBasePicker.prototype.alive;
/**
* @type {?}
* @protected
*/
NbBasePicker.prototype.queue;
/**
* @type {?}
* @protected
*/
NbBasePicker.prototype.blur$;
/**
* @type {?}
* @protected
*/
NbBasePicker.prototype.document;
/**
* @type {?}
* @protected
*/
NbBasePicker.prototype.positionBuilder;
/**
* @type {?}
* @protected
*/
NbBasePicker.prototype.overlay;
/**
* @type {?}
* @protected
*/
NbBasePicker.prototype.cfr;
/**
* @type {?}
* @protected
*/
NbBasePicker.prototype.dateService;
/**
* @abstract
* @protected
* @return {?}
*/
NbBasePicker.prototype.pickerValueChange = function () { };
/**
* @abstract
* @protected
* @return {?}
*/
NbBasePicker.prototype.writeQueue = function () { };
}
/*
* The DatePicker components itself.
* Provides a proxy to `NbCalendar` options as well as custom picker options.
*/
/**
* @template D
*/
export class NbDatepickerComponent extends NbBasePicker {
constructor() {
super(...arguments);
this.pickerClass = NbCalendarComponent;
}
/*
* Date which will be rendered as selected.
* */
/**
* @param {?} date
* @return {?}
*/
set date(date) {
this.value = date;
}
/*
* Emits date when selected.
* */
/**
* @return {?}
*/
get dateChange() {
return (/** @type {?} */ (this.valueChange));
}
/**
* @return {?}
*/
get value() {
return this.picker.date;
}
/**
* @param {?} date
* @return {?}
*/
set value(date) {
if (!this.picker) {
this.queue = date;
return;
}
if (date) {
this.picker.visibleDate = date;
this.picker.date = date;
}
}
/**
* @protected
* @return {?}
*/
get pickerValueChange() {
return this.picker.dateChange;
}
/**
* @protected
* @return {?}
*/
writeQueue() {
this.value = this.queue;
}
}
NbDatepickerComponent.decorators = [
{ type: Component, args: [{
selector: 'nb-datepicker',
template: ''
}] }
];
NbDatepickerComponent.propDecorators = {
date: [{ type: Input }],
dateChange: [{ type: Output }]
};
if (false) {
/**
* @type {?}
* @protected
*/
NbDatepickerComponent.prototype.pickerClass;
}
/*
* The RangeDatePicker components itself.
* Provides a proxy to `NbCalendarRange` options as well as custom picker options.
*/
/**
* @template D
*/
export class NbRangepickerComponent extends NbBasePicker {
constructor() {
super(...arguments);
this.pickerClass = NbCalendarRangeComponent;
}
/*
* Range which will be rendered as selected.
* */
/**
* @param {?} range
* @return {?}
*/
set range(range) {
this.value = range;
}
/*
* Emits range when start selected and emits again when end selected.
* */
/**
* @return {?}
*/
get rangeChange() {
return (/** @type {?} */ (this.valueChange));
}
/**
* @return {?}
*/
get value() {
return this.picker.range;
}
/**
* @param {?} range
* @return {?}
*/
set value(range) {
if (!this.picker) {
this.queue = range;
return;
}
if (range) {
this.picker.visibleDate = range && range.start;
this.picker.range = range;
}
}
/**
* @protected
* @return {?}
*/
get pickerValueChange() {
return this.picker.rangeChange;
}
/**
* @return {?}
*/
shouldHide() {
return super.shouldHide() && !!(this.value.start && this.value.end);
}
/**
* @protected
* @return {?}
*/
writeQueue() {
this.value = this.queue;
}
}
NbRangepickerComponent.decorators = [
{ type: Component, args: [{
selector: 'nb-rangepicker',
template: ''
}] }
];
NbRangepickerComponent.propDecorators = {
range: [{ type: Input }],
rangeChange: [{ type: Output }]
};
if (false) {
/**
* @type {?}
* @protected
*/
NbRangepickerComponent.prototype.pickerClass;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly90aGVtZS1saWIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9kYXRlcGlja2VyL2RhdGVwaWNrZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQU1BLE9BQU8sRUFDTCxTQUFTLEVBQ1Qsd0JBQXdCLEVBSXhCLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFDTixJQUFJLEdBQ0wsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFM0MsT0FBTyxFQUVMLFlBQVksRUFDWixpQkFBaUIsRUFFakIsZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVix3QkFBd0IsRUFDeEIsU0FBUyxFQUVULHdCQUF3QixFQUN4QixLQUFLLEdBQ04sTUFBTSxRQUFRLENBQUM7QUFDaEIsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDbEYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sRUFBbUIsd0JBQXdCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQTtBQUNoRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNyRSxPQUFPLEVBRUwsY0FBYyxFQUNkLGtCQUFrQixFQUNsQixhQUFhLEVBQ2IsbUJBQW1CLEdBQ3BCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLFlBQVksRUFBMkIsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7QUFNL0UsTUFBTSxPQUFnQixZQUFzQixTQUFRLFlBQWU7Ozs7Ozs7O0lBK0dqRSxZQUEyQyxRQUFRLEVBQzdCLGVBQXlDLEVBQ3pDLE9BQXlCLEVBQ3pCLEdBQTZCLEVBQzdCLFdBQTZCO1FB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QUMsV0FBVyxDQUFDO0lBQ2pDLENBQUM7Ozs7SUFFRCxVQUFVO1FBQ1IsT0FBTyxLQUFLLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0RSxDQUFDOzs7OztJQUVTLFVBQVU7UUFDbEIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQzFCLENBQUM7OztZQS9DRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGdCQUFnQjtnQkFDMUIsUUFBUSxFQUFFLEVBQUU7YUFDYjs7O29CQU9FLEtBQUs7MEJBT0wsTUFBTTs7Ozs7OztJQVpQLDZDQUFvRiIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCBBa3Zlby4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuICovXHJcblxyXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgQ29tcG9uZW50UmVmLFxyXG4gIE9uQ2hhbmdlcyxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE91dHB1dCxcclxuICBUeXBlLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyB0YWtlV2hpbGUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7XHJcbiAgTmJBZGp1c3RhYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSxcclxuICBOYkFkanVzdG1lbnQsXHJcbiAgTmJDb21wb25lbnRQb3J0YWwsXHJcbiAgTmJPdmVybGF5UmVmLFxyXG4gIE5iT3ZlcmxheVNlcnZpY2UsXHJcbiAgTmJQb3NpdGlvbixcclxuICBOYlBvc2l0aW9uQnVpbGRlclNlcnZpY2UsXHJcbiAgTmJUcmlnZ2VyLFxyXG4gIE5iVHJpZ2dlclN0cmF0ZWd5LFxyXG4gIE5iVHJpZ2dlclN0cmF0ZWd5QnVpbGRlcixcclxuICBwYXRjaCxcclxufSBmcm9tICcuLi9jZGsnO1xyXG5pbXBvcnQgeyBOYkRhdGVwaWNrZXJDb250YWluZXJDb21wb25lbnQgfSBmcm9tICcuL2RhdGVwaWNrZXItY29udGFpbmVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE5CX0RPQ1VNRU5UIH0gZnJvbSAnLi4vLi4vdGhlbWUub3B0aW9ucyc7XHJcbmltcG9ydCB7IE5iQ2FsZW5kYXJSYW5nZSwgTmJDYWxlbmRhclJhbmdlQ29tcG9uZW50IH0gZnJvbSAnLi4vY2FsZW5kYXIvY2FsZW5kYXItcmFuZ2UuY29tcG9uZW50J1xyXG5pbXBvcnQgeyBOYkNhbGVuZGFyQ29tcG9uZW50IH0gZnJvbSAnLi4vY2FsZW5kYXIvY2FsZW5kYXIuY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBOYkNhbGVuZGFyQ2VsbCxcclxuICBOYkNhbGVuZGFyU2l6ZSxcclxuICBOYkNhbGVuZGFyVmlld01vZGUsXHJcbiAgTmJEYXRlU2VydmljZSxcclxuICBOYk5hdGl2ZURhdGVTZXJ2aWNlLFxyXG59IGZyb20gJy4uL2NhbGVuZGFyLWtpdCc7XHJcbmltcG9ydCB7IE5iRGF0ZXBpY2tlciwgTmJQaWNrZXJWYWxpZGF0b3JDb25maWcgfSBmcm9tICcuL2RhdGVwaWNrZXIuZGlyZWN0aXZlJztcclxuXHJcblxyXG4vKlxyXG4gKiBUaGUgYE5iQmFzZVBpY2tlcmAgY29tcG9uZW50IGNvbmNlbnRyYXRlcyBvdmVybGF5IG1hbmlwdWxhdGlvbiBsb2dpYy5cclxuICogKi9cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE5iQmFzZVBpY2tlcjxELCBULCBQPiBleHRlbmRzIE5iRGF0ZXBpY2tlcjxUPiBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuICAvKlxyXG4gICAqIERhdGVwaWNrZXIgZGF0ZSBmb3JtYXQuIENhbiBiZSB1c2VkIG9ubHkgd2l0aCBkYXRlIGFkYXB0ZXJzIChtb21lbnQsIGRhdGUtZm5zKSBzaW5jZSBuYXRpdmUgZGF0ZVxyXG4gICAqIG9iamVjdCBkb2Vzbid0IHN1cHBvcnQgZm9ybWF0dGluZy5cclxuICAgKiAqL1xyXG4gIEBJbnB1dCgpIGZvcm1hdDogc3RyaW5nO1xyXG5cclxuICAvKlxyXG4gICAqIERlZmluZXMgaWYgd2Ugc2hvdWxkIHJlbmRlciBwcmV2aW91cyBhbmQgbmV4dCBtb250aHNcclxuICAgKiBpbiB0aGUgY3VycmVudCBtb250aCB2aWV3LlxyXG4gICAqICovXHJcbiAgQElucHV0KCkgYm91bmRpbmdNb250aDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qXHJcbiAgICogRGVmaW5lcyBzdGFydGluZyB2aWV3IGZvciBjYWxlbmRhci5cclxuICAgKiAqL1xyXG4gIEBJbnB1dCgpIHN0YXJ0VmlldzogTmJDYWxlbmRhclZpZXdNb2RlID0gTmJDYWxlbmRhclZpZXdNb2RlLkRBVEU7XHJcblxyXG4gIC8qXHJcbiAgICogTWluaW11bSBhdmFpbGFibGUgZGF0ZSBmb3Igc2VsZWN0aW9uLlxyXG4gICAqICovXHJcbiAgQElucHV0KCkgbWluOiBUO1xyXG5cclxuICAvKlxyXG4gICAqIE1heGltdW0gYXZhaWxhYmxlIGRhdGUgZm9yIHNlbGVjdGlvbi5cclxuICAgKiAqL1xyXG4gIEBJbnB1dCgpIG1heDogVDtcclxuXHJcbiAgLypcclxuICAgKiBQcmVkaWNhdGUgdGhhdCBkZWNpZGVzIHdoaWNoIGNlbGxzIHdpbGwgYmUgZGlzYWJsZWQuXHJcbiAgICogKi9cclxuICBASW5wdXQoKSBmaWx0ZXI6IChUKSA9PiBib29sZWFuO1xyXG5cclxuICAvKlxyXG4gICAqIEN1c3RvbSBkYXkgY2VsbCBjb21wb25lbnQuIEhhdmUgdG8gaW1wbGVtZW50IGBOYkNhbGVuZGFyQ2VsbGAgaW50ZXJmYWNlLlxyXG4gICAqICovXHJcbiAgQElucHV0KCkgZGF5Q2VsbENvbXBvbmVudDogVHlwZTxOYkNhbGVuZGFyQ2VsbDxELCBUPj47XHJcblxyXG4gIC8qXHJcbiAgICogQ3VzdG9tIG1vbnRoIGNlbGwgY29tcG9uZW50LiBIYXZlIHRvIGltcGxlbWVudCBgTmJDYWxlbmRhckNlbGxgIGludGVyZmFjZS5cclxuICAgKiAqL1xyXG4gIEBJbnB1dCgpIG1vbnRoQ2VsbENvbXBvbmVudDogVHlwZTxOYkNhbGVuZGFyQ2VsbDxELCBUPj47XHJcblxyXG4gIC8qXHJcbiAgICogQ3VzdG9tIHllYXIgY2VsbCBjb21wb25lbnQuIEhhdmUgdG8gaW1wbGVtZW50IGBOYkNhbGVuZGFyQ2VsbGAgaW50ZXJmYWNlLlxyXG4gICAqICovXHJcbiAgQElucHV0KCkgeWVhckNlbGxDb21wb25lbnQ6IFR5cGU8TmJDYWxlbmRhckNlbGw8RCwgVD4+O1xyXG5cclxuICAvKlxyXG4gICAqIFNpemUgb2YgdGhlIGNhbGVuZGFyIGFuZCBlbnRpcmUgY29tcG9uZW50cy5cclxuICAgKiBDYW4gYmUgJ21lZGl1bScgd2hpY2ggaXMgZGVmYXVsdCBvciAnbGFyZ2UnLlxyXG4gICAqICovXHJcbiAgQElucHV0KCkgc2l6ZTogTmJDYWxlbmRhclNpemUgPSBOYkNhbGVuZGFyU2l6ZS5NRURJVU07XHJcblxyXG4gIC8qXHJcbiAgICogRGVwZW5kaW5nIG9uIHRoaXMgZGF0ZSBhIHBhcnRpY3VsYXIgbW9udGggaXMgc2VsZWN0ZWQgaW4gdGhlIGNhbGVuZGFyXHJcbiAgICovXHJcbiAgQElucHV0KCkgdmlzaWJsZURhdGU6IEQ7XHJcblxyXG4gIC8qXHJcbiAgICogSGlkZSBwaWNrZXIgd2hlbiBhIGRhdGUgb3IgYSByYW5nZSBpcyBzZWxlY3RlZCwgYHRydWVgIGJ5IGRlZmF1bHRcclxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgKi9cclxuICBASW5wdXQoKSBoaWRlT25TZWxlY3Q6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvKlxyXG4gICAqIENhbGVuZGFyIGNvbXBvbmVudCBjbGFzcyB0aGF0IGhhcyB0byBiZSBpbnN0YW50aWF0ZWQgaW5zaWRlIG92ZXJsYXkuXHJcbiAgICogKi9cclxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcGlja2VyQ2xhc3M6IFR5cGU8UD47XHJcblxyXG4gIC8qXHJcbiAgICogT3ZlcmxheSByZWZlcmVuY2Ugb2JqZWN0LlxyXG4gICAqICovXHJcbiAgcHJvdGVjdGVkIHJlZjogTmJPdmVybGF5UmVmO1xyXG5cclxuICAvKlxyXG4gICAqIERhdGVwaWNrZXIgY29udGFpbmVyIHRoYXQgY29udGFpbnMgaW5zdGFudGlhdGVkIHBpY2tlci5cclxuICAgKiAqL1xyXG4gIHByb3RlY3RlZCBjb250YWluZXI6IENvbXBvbmVudFJlZjxOYkRhdGVwaWNrZXJDb250YWluZXJDb21wb25lbnQ+O1xyXG5cclxuICAvKlxyXG4gICAqIFBvc2l0aW9uaW5nIHN0cmF0ZWd5IHVzZWQgYnkgb3ZlcmxheS5cclxuICAgKiAqL1xyXG4gIHByb3RlY3RlZCBwb3NpdGlvblN0cmF0ZWd5OiBOYkFkanVzdGFibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5O1xyXG5cclxuICAvKlxyXG4gICAqIEhUTUwgaW5wdXQgcmVmZXJlbmNlIHRvIHdoaWNoIGRhdGVwaWNrZXIgY29ubmVjdGVkLlxyXG4gICAqICovXHJcbiAgcHJvdGVjdGVkIGhvc3RSZWY6IEVsZW1lbnRSZWY7XHJcblxyXG4gIC8qXHJcbiAgICogU3RyZWFtIG9mIHBpY2tlciBjaGFuZ2VzLiBSZXF1aXJlZCB0byBiZSB0aGUgc3ViamVjdCBiZWNhdXNlIHBpY2tlciBoaWRlcyBhbmQgc2hvd3MgYW5kIHBpY2tlclxyXG4gICAqIGNoYW5nZSBzdHJlYW0gYmVjb21lcyByZWNyZWF0ZWQuXHJcbiAgICogKi9cclxuICBwcm90ZWN0ZWQgb25DaGFuZ2UkOiBTdWJqZWN0PFQ+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgLypcclxuICAgKiBSZWZlcmVuY2UgdG8gdGhlIHBpY2tlciBpbnN0YW5jZSBpdHNlbGYuXHJcbiAgICogKi9cclxuICBwcm90ZWN0ZWQgcGlja2VyUmVmOiBDb21wb25lbnRSZWY8YW55PjtcclxuXHJcbiAgcHJvdGVjdGVkIGFsaXZlOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLypcclxuICAgKiBRdWV1ZSBjb250YWlucyB0aGUgbGFzdCB2YWx1ZSB0aGF0IHdhcyBhcHBsaWVkIHRvIHRoZSBwaWNrZXIgd2hlbiBpdCB3YXMgaGlkZGVuLlxyXG4gICAqIFRoaXMgdmFsdWUgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHBpY2tlciBhcyBzb29uIGFzIGl0IHNob3duLlxyXG4gICAqICovXHJcbiAgcHJvdGVjdGVkIHF1ZXVlOiBUO1xyXG5cclxuICBwcm90ZWN0ZWQgYmx1ciQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihASW5qZWN0KE5CX0RPQ1VNRU5UKSBwcm90ZWN0ZWQgZG9jdW1lbnQsXHJcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIHBvc2l0aW9uQnVpbGRlcjogTmJQb3NpdGlvbkJ1aWxkZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBvdmVybGF5OiBOYk92ZXJsYXlTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBjZnI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgZGF0ZVNlcnZpY2U6IE5iRGF0ZVNlcnZpY2U8RD4sXHJcbiAgKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBSZXR1cm5zIHBpY2tlciBpbnN0YW5jZS5cclxuICAgKiAqL1xyXG4gIGdldCBwaWNrZXIoKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLnBpY2tlclJlZiAmJiB0aGlzLnBpY2tlclJlZi5pbnN0YW5jZTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogU3RyZWFtIG9mIHBpY2tlciB2YWx1ZSBjaGFuZ2VzLlxyXG4gICAqICovXHJcbiAgZ2V0IHZhbHVlQ2hhbmdlKCk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgcmV0dXJuIHRoaXMub25DaGFuZ2UkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzU2hvd24oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZWYgJiYgdGhpcy5yZWYuaGFzQXR0YWNoZWQoKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogRW1pdHMgd2hlbiBkYXRlcGlja2VyIGxvb3NlcyBmb2N1cy5cclxuICAgKi9cclxuICBnZXQgYmx1cigpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLmJsdXIkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCBwaWNrZXJWYWx1ZUNoYW5nZSgpOiBPYnNlcnZhYmxlPFQ+O1xyXG5cclxuICBuZ09uQ2hhbmdlcygpIHtcclxuICAgIGlmICh0aGlzLmRhdGVTZXJ2aWNlIGluc3RhbmNlb2YgTmJOYXRpdmVEYXRlU2VydmljZSAmJiB0aGlzLmZvcm1hdCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgZm9ybWF0IG5hdGl2ZSBkYXRlLiBUbyB1c2UgY3VzdG9tIGZvcm1hdHRpbmcgeW91IGhhdmUgdG8gaW5zdGFsbCBAbmVidWxhci9tb21lbnQgb3IgJyArXHJcbiAgICAgICdAbmVidWxhci9kYXRlLWZucyBwYWNrYWdlIGFuZCBpbXBvcnQgTmJNb21lbnREYXRlTW9kdWxlIG9yIE5iRGF0ZUZuc0RhdGVNb2R1bGUgYWNjb3JkaW5nbHkuJyArXHJcbiAgICAgICdNb3JlIGluZm9ybWF0aW9uIGF0IFwiRm9ybWF0dGluZyBpc3N1ZVwiICcgK1xyXG4gICAgICAnaHR0cHM6Ly9ha3Zlby5naXRodWIuaW8vbmVidWxhci9kb2NzL2NvbXBvbmVudHMvZGF0ZXBpY2tlci9vdmVydmlldyNuYmRhdGVwaWNrZXJjb21wb25lbnQnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5hbGl2ZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5oaWRlKCk7XHJcbiAgICB0aGlzLnJlZi5kaXNwb3NlKCk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIERhdGVwaWNrZXIga25vd3Mgbm90aGluZyBhYm91dCBob3N0IGh0bWwgaW5wdXQgZWxlbWVudC5cclxuICAgKiBTbywgYXR0YWNoIG1ldGhvZCBhdHRhY2hlcyBkYXRlcGlja2VyIHRvIHRoZSBob3N0IGlucHV0IGVsZW1lbnQuXHJcbiAgICogKi9cclxuICBhdHRhY2goaG9zdFJlZjogRWxlbWVudFJlZikge1xyXG4gICAgdGhpcy5ob3N0UmVmID0gaG9zdFJlZjtcclxuXHJcbiAgICB0aGlzLnBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLmNyZWF0ZVBvc2l0aW9uU3RyYXRlZ3koKTtcclxuICAgIHRoaXMucmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZSh7XHJcbiAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IHRoaXMucG9zaXRpb25TdHJhdGVneSxcclxuICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLnJlcG9zaXRpb24oKSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5zdWJzY3JpYmVPblBvc2l0aW9uQ2hhbmdlKCk7XHJcbiAgICB0aGlzLnN1YnNjcmliZU9uVHJpZ2dlcnMoKTtcclxuICB9XHJcblxyXG4gIGdldFZhbGlkYXRvckNvbmZpZygpOiBOYlBpY2tlclZhbGlkYXRvckNvbmZpZzxUPiB7XHJcbiAgICByZXR1cm4geyBtaW46IHRoaXMubWluLCBtYXg6IHRoaXMubWF4LCBmaWx0ZXI6IHRoaXMuZmlsdGVyIH07XHJcbiAgfVxyXG5cclxuICBzaG93KCkge1xyXG4gICAgdGhpcy5jb250YWluZXIgPSB0aGlzLnJlZi5hdHRhY2gobmV3IE5iQ29tcG9uZW50UG9ydGFsKE5iRGF0ZXBpY2tlckNvbnRhaW5lckNvbXBvbmVudCwgbnVsbCwgbnVsbCwgdGhpcy5jZnIpKTtcclxuICAgIHRoaXMuaW5zdGFudGlhdGVQaWNrZXIoKTtcclxuICAgIHRoaXMuc3Vic2NyaWJlT25WYWx1ZUNoYW5nZSgpO1xyXG4gICAgdGhpcy53cml0ZVF1ZXVlKCk7XHJcbiAgICB0aGlzLnBhdGNoV2l0aElucHV0cygpO1xyXG4gIH1cclxuXHJcbiAgc2hvdWxkSGlkZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmhpZGVPblNlbGVjdCAmJiAhIXRoaXMudmFsdWU7XHJcbiAgfVxyXG5cclxuICBoaWRlKCkge1xyXG4gICAgdGhpcy5yZWYuZGV0YWNoKCk7XHJcbiAgICAvLyBzYXZlIGN1cnJlbnQgdmFsdWUgaWYgcGlja2VyIHdhcyByZW5kZXJlZFxyXG4gICAgaWYgKHRoaXMucGlja2VyKSB7XHJcbiAgICAgIHRoaXMucXVldWUgPSB0aGlzLnZhbHVlO1xyXG4gICAgICB0aGlzLnBpY2tlclJlZi5kZXN0cm95KCk7XHJcbiAgICAgIHRoaXMucGlja2VyUmVmID0gbnVsbDtcclxuICAgICAgdGhpcy5jb250YWluZXIgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHdyaXRlUXVldWUoKTtcclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZVBvc2l0aW9uU3RyYXRlZ3koKTogTmJBZGp1c3RhYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSB7XHJcbiAgICByZXR1cm4gdGhpcy5wb3NpdGlvbkJ1aWxkZXJcclxuICAgICAgLmNvbm5lY3RlZFRvKHRoaXMuaG9zdFJlZilcclxuICAgICAgLnBvc2l0aW9uKE5iUG9zaXRpb24uQk9UVE9NKVxyXG4gICAgICAuYWRqdXN0bWVudChOYkFkanVzdG1lbnQuQ09VTlRFUkNMT0NLV0lTRSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc3Vic2NyaWJlT25Qb3NpdGlvbkNoYW5nZSgpIHtcclxuICAgIHRoaXMucG9zaXRpb25TdHJhdGVneS5wb3NpdGlvbkNoYW5nZVxyXG4gICAgICAucGlwZSh0YWtlV2hpbGUoKCkgPT4gdGhpcy5hbGl2ZSkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHBvc2l0aW9uOiBOYlBvc2l0aW9uKSA9PiBwYXRjaCh0aGlzLmNvbnRhaW5lciwgeyBwb3NpdGlvbiB9KSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY3JlYXRlVHJpZ2dlclN0cmF0ZWd5KCk6IE5iVHJpZ2dlclN0cmF0ZWd5IHtcclxuICAgIHJldHVybiBuZXcgTmJUcmlnZ2VyU3RyYXRlZ3lCdWlsZGVyKClcclxuICAgICAgLmRvY3VtZW50KHRoaXMuZG9jdW1lbnQpXHJcbiAgICAgIC50cmlnZ2VyKE5iVHJpZ2dlci5GT0NVUylcclxuICAgICAgLmhvc3QodGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQpXHJcbiAgICAgIC5jb250YWluZXIoKCkgPT4gdGhpcy5jb250YWluZXIpXHJcbiAgICAgIC5idWlsZCgpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHN1YnNjcmliZU9uVHJpZ2dlcnMoKSB7XHJcbiAgICBjb25zdCB0cmlnZ2VyU3RyYXRlZ3kgPSB0aGlzLmNyZWF0ZVRyaWdnZXJTdHJhdGVneSgpO1xyXG4gICAgdHJpZ2dlclN0cmF0ZWd5LnNob3ckLnBpcGUodGFrZVdoaWxlKCgpID0+IHRoaXMuYWxpdmUpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zaG93KCkpO1xyXG4gICAgdHJpZ2dlclN0cmF0ZWd5LmhpZGUkLnBpcGUodGFrZVdoaWxlKCgpID0+IHRoaXMuYWxpdmUpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLmJsdXIkLm5leHQoKTtcclxuICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBpbnN0YW50aWF0ZVBpY2tlcigpIHtcclxuICAgIHRoaXMucGlja2VyUmVmID0gdGhpcy5jb250YWluZXIuaW5zdGFuY2UuYXR0YWNoKG5ldyBOYkNvbXBvbmVudFBvcnRhbCh0aGlzLnBpY2tlckNsYXNzLCBudWxsLCBudWxsLCB0aGlzLmNmcikpO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBTdWJzY3JpYmVzIG9uIHBpY2tlciB2YWx1ZSBjaGFuZ2VzIGFuZCBlbWl0IGRhdGEgdGhyb3VnaCB0aGlzLm9uQ2hhbmdlJCBzdWJqZWN0LlxyXG4gICAqICovXHJcbiAgcHJvdGVjdGVkIHN1YnNjcmliZU9uVmFsdWVDaGFuZ2UoKSB7XHJcbiAgICB0aGlzLnBpY2tlclZhbHVlQ2hhbmdlLnN1YnNjcmliZShkYXRlID0+IHtcclxuICAgICAgdGhpcy5vbkNoYW5nZSQubmV4dChkYXRlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHBhdGNoV2l0aElucHV0cygpIHtcclxuICAgIHRoaXMucGlja2VyLmJvdW5kaW5nTW9udGggPSB0aGlzLmJvdW5kaW5nTW9udGg7XHJcbiAgICB0aGlzLnBpY2tlci5zdGFydFZpZXcgPSB0aGlzLnN0YXJ0VmlldztcclxuICAgIHRoaXMucGlja2VyLm1pbiA9IHRoaXMubWluO1xyXG4gICAgdGhpcy5waWNrZXIubWF4ID0gdGhpcy5tYXg7XHJcbiAgICB0aGlzLnBpY2tlci5maWx0ZXIgPSB0aGlzLmZpbHRlcjtcclxuICAgIHRoaXMucGlja2VyLl9jZWxsQ29tcG9uZW50ID0gdGhpcy5kYXlDZWxsQ29tcG9uZW50O1xyXG4gICAgdGhpcy5waWNrZXIubW9udGhDZWxsQ29tcG9uZW50ID0gdGhpcy5tb250aENlbGxDb21wb25lbnQ7XHJcbiAgICB0aGlzLnBpY2tlci5feWVhckNlbGxDb21wb25lbnQgPSB0aGlzLnllYXJDZWxsQ29tcG9uZW50O1xyXG4gICAgdGhpcy5waWNrZXIuc2l6ZSA9IHRoaXMuc2l6ZTtcclxuICAgIHRoaXMucGlja2VyLnZpc2libGVEYXRlID0gdGhpcy52aXNpYmxlRGF0ZTtcclxuICB9XHJcbn1cclxuXHJcbi8qXHJcbiAqIFRoZSBEYXRlUGlja2VyIGNvbXBvbmVudHMgaXRzZWxmLlxyXG4gKiBQcm92aWRlcyBhIHByb3h5IHRvIGBOYkNhbGVuZGFyYCBvcHRpb25zIGFzIHdlbGwgYXMgY3VzdG9tIHBpY2tlciBvcHRpb25zLlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduYi1kYXRlcGlja2VyJyxcclxuICB0ZW1wbGF0ZTogJycsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOYkRhdGVwaWNrZXJDb21wb25lbnQ8RD4gZXh0ZW5kcyBOYkJhc2VQaWNrZXI8RCwgRCwgTmJDYWxlbmRhckNvbXBvbmVudDxEPj4ge1xyXG4gIHByb3RlY3RlZCBwaWNrZXJDbGFzczogVHlwZTxOYkNhbGVuZGFyQ29tcG9uZW50PEQ+PiA9IE5iQ2FsZW5kYXJDb21wb25lbnQ7XHJcblxyXG4gIC8qXHJcbiAgICogRGF0ZSB3aGljaCB3aWxsIGJlIHJlbmRlcmVkIGFzIHNlbGVjdGVkLlxyXG4gICAqICovXHJcbiAgQElucHV0KCkgc2V0IGRhdGUoZGF0ZTogRCkge1xyXG4gICAgdGhpcy52YWx1ZSA9IGRhdGU7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIEVtaXRzIGRhdGUgd2hlbiBzZWxlY3RlZC5cclxuICAgKiAqL1xyXG4gIEBPdXRwdXQoKSBnZXQgZGF0ZUNoYW5nZSgpOiBFdmVudEVtaXR0ZXI8RD4ge1xyXG4gICAgcmV0dXJuIHRoaXMudmFsdWVDaGFuZ2UgYXMgRXZlbnRFbWl0dGVyPEQ+O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHZhbHVlKCk6IEQge1xyXG4gICAgcmV0dXJuIHRoaXMucGlja2VyLmRhdGU7XHJcbiAgfVxyXG5cclxuICBzZXQgdmFsdWUoZGF0ZTogRCkge1xyXG4gICAgaWYgKCF0aGlzLnBpY2tlcikge1xyXG4gICAgICB0aGlzLnF1ZXVlID0gZGF0ZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChkYXRlKSB7XHJcbiAgICAgIHRoaXMucGlja2VyLnZpc2libGVEYXRlID0gZGF0ZTtcclxuICAgICAgdGhpcy5waWNrZXIuZGF0ZSA9IGRhdGU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0IHBpY2tlclZhbHVlQ2hhbmdlKCk6IE9ic2VydmFibGU8RD4ge1xyXG4gICAgcmV0dXJuIHRoaXMucGlja2VyLmRhdGVDaGFuZ2U7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgd3JpdGVRdWV1ZSgpIHtcclxuICAgIHRoaXMudmFsdWUgPSB0aGlzLnF1ZXVlO1xyXG4gIH1cclxufVxyXG5cclxuLypcclxuICogVGhlIFJhbmdlRGF0ZVBpY2tlciBjb21wb25lbnRzIGl0c2VsZi5cclxuICogUHJvdmlkZXMgYSBwcm94eSB0byBgTmJDYWxlbmRhclJhbmdlYCBvcHRpb25zIGFzIHdlbGwgYXMgY3VzdG9tIHBpY2tlciBvcHRpb25zLlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduYi1yYW5nZXBpY2tlcicsXHJcbiAgdGVtcGxhdGU6ICcnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmJSYW5nZXBpY2tlckNvbXBvbmVudDxEPiBleHRlbmRzIE5iQmFzZVBpY2tlcjxELCBOYkNhbGVuZGFyUmFuZ2U8RD4sIE5iQ2FsZW5kYXJSYW5nZUNvbXBvbmVudDxEPj4ge1xyXG4gIHByb3RlY3RlZCBwaWNrZXJDbGFzczogVHlwZTxOYkNhbGVuZGFyUmFuZ2VDb21wb25lbnQ8RD4+ID0gTmJDYWxlbmRhclJhbmdlQ29tcG9uZW50O1xyXG5cclxuICAvKlxyXG4gICAqIFJhbmdlIHdoaWNoIHdpbGwgYmUgcmVuZGVyZWQgYXMgc2VsZWN0ZWQuXHJcbiAgICogKi9cclxuICBASW5wdXQoKSBzZXQgcmFuZ2UocmFuZ2U6IE5iQ2FsZW5kYXJSYW5nZTxEPikge1xyXG4gICAgdGhpcy52YWx1ZSA9IHJhbmdlO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBFbWl0cyByYW5nZSB3aGVuIHN0YXJ0IHNlbGVjdGVkIGFuZCBlbWl0cyBhZ2FpbiB3aGVuIGVuZCBzZWxlY3RlZC5cclxuICAgKiAqL1xyXG4gIEBPdXRwdXQoKSBnZXQgcmFuZ2VDaGFuZ2UoKTogRXZlbnRFbWl0dGVyPE5iQ2FsZW5kYXJSYW5nZTxEPj4ge1xyXG4gICAgcmV0dXJuIHRoaXMudmFsdWVDaGFuZ2UgYXMgRXZlbnRFbWl0dGVyPE5iQ2FsZW5kYXJSYW5nZTxEPj47XHJcbiAgfVxyXG5cclxuICBnZXQgdmFsdWUoKTogTmJDYWxlbmRhclJhbmdlPEQ+IHtcclxuICAgIHJldHVybiB0aGlzLnBpY2tlci5yYW5nZTtcclxuICB9XHJcblxyXG4gIHNldCB2YWx1ZShyYW5nZTogTmJDYWxlbmRhclJhbmdlPEQ+KSB7XHJcbiAgICBpZiAoIXRoaXMucGlja2VyKSB7XHJcbiAgICAgIHRoaXMucXVldWUgPSByYW5nZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyYW5nZSkge1xyXG4gICAgICB0aGlzLnBpY2tlci52aXNpYmxlRGF0ZSA9IHJhbmdlICYmIHJhbmdlLnN0YXJ0O1xyXG4gICAgICB0aGlzLnBpY2tlci5yYW5nZSA9IHJhbmdlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldCBwaWNrZXJWYWx1ZUNoYW5nZSgpOiBPYnNlcnZhYmxlPE5iQ2FsZW5kYXJSYW5nZTxEPj4ge1xyXG4gICAgcmV0dXJuIHRoaXMucGlja2VyLnJhbmdlQ2hhbmdlO1xyXG4gIH1cclxuXHJcbiAgc2hvdWxkSGlkZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBzdXBlci5zaG91bGRIaWRlKCkgJiYgISEodGhpcy52YWx1ZS5zdGFydCAmJiB0aGlzLnZhbHVlLmVuZCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgd3JpdGVRdWV1ZSgpIHtcclxuICAgIHRoaXMudmFsdWUgPSB0aGlzLnF1ZXVlO1xyXG4gIH1cclxufVxyXG4iXX0=