theme-lib
Version:
This is a simple example Angular Library published to npm.
909 lines • 62.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
/*
* @license
* Copyright Akveo. All Rights Reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*/
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ContentChildren, ElementRef, EventEmitter, forwardRef, Inject, Input, Output, QueryList, ViewChild, } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { take, takeWhile } from 'rxjs/operators';
import { defer, merge } from 'rxjs';
import { NbAdjustment, NbOverlayService, NbPortalDirective, NbPosition, NbPositionBuilderService, NbTrigger, NbTriggerStrategyBuilder, } from '../cdk';
import { NbOptionComponent } from './option.component';
import { NbButtonComponent } from '../button/button.component';
import { NB_DOCUMENT } from '../../theme.options';
import { convertToBoolProperty } from '../helpers';
var NbSelectLabelComponent = /** @class */ (function () {
function NbSelectLabelComponent() {
}
NbSelectLabelComponent.decorators = [
{ type: Component, args: [{
selector: 'nb-select-label',
template: '<ng-content></ng-content>'
}] }
];
return NbSelectLabelComponent;
}());
export { NbSelectLabelComponent };
/*
* The `NbSelectComponent` provides a capability to select one of the passed items.
*
* @stacked-example(Showcase, select/select-showcase.component)
*
* ### Installation
*
* Import `NbSelectModule` to your feature module.
* ```ts
* @NgModule({
* imports: [
* // ...
* NbSelectModule,
* ],
* })
* export class PageModule { }
* ```
* ### Usage
*
* If you want to use it as the multi-select control you have to mark it as `multiple`.
* In this case, `nb-select` will work only with arrays - accept arrays and propagate arrays.
*
* @stacked-example(Multiple, select/select-multiple.component)
*
* Items without values will clean selection.
*
* @stacked-example(Clean selection, select/select-clean.component)
*
* Select may be bounded using `selected` input:
*
* ```html
* <nb-select [(selected)]="selected"></nb-selected>
* ```
*
* Or you can bind control with form controls or ngModel:
*
* @stacked-example(Select form binding, select/select-form.component)
*
* Options in the select may be grouped using `nb-option-group` component.
*
* @stacked-example(Grouping, select/select-groups.component)
*
* Select may have a placeholder that will be shown when nothing selected:
*
* @stacked-example(Placeholder, select/select-placeholder.component)
*
* You can disable select, options and whole groups.
*
* @stacked-example(Disabled select, select/select-disabled.component)
*
* Also, the custom label may be provided in select.
* This custom label will be used for instead placeholder when something selected.
*
* @stacked-example(Custom label, select/select-label.component)
*
* Default `nb-select` size is `medium` and status color is `primary`.
* Select is available in multiple colors using `status` property:
*
* @stacked-example(Select statuses, select/select-status.component)
*
* There are four select sizes:
*
* @stacked-example(Select sizes, select/select-sizes.component)
*
* And two additional style types - `outline`:
*
* @stacked-example(Outline select, select/select-outline.component)
*
* and `hero`:
*
* @stacked-example(Select colors, select/select-hero.component)
*
* Select is available in different shapes, that could be combined with the other properties:
*
* @stacked-example(Select shapes, select/select-shapes.component)
*
*
* @styles
*
* select-border-width:
* select-max-height:
* select-bg:
* select-checkbox-color:
* select-checkmark-color:
* select-option-disabled-bg:
* select-option-disabled-opacity:
* select-option-padding:
* */
/**
* @template T
*/
var NbSelectComponent = /** @class */ (function () {
function NbSelectComponent(document, overlay, hostRef, positionBuilder, cd) {
var _this = this;
this.document = document;
this.overlay = overlay;
this.hostRef = hostRef;
this.positionBuilder = positionBuilder;
this.cd = cd;
/*
* Select status (adds specific styles):
* `primary`, `info`, `success`, `warning`, `danger`
*/
this.status = 'primary';
/*
* Renders select placeholder if nothing selected.
* */
this.placeholder = '';
/*
* Will be emitted when selected value changes.
* */
this.selectedChange = new EventEmitter();
this.multiple = false;
/*
* List of selected options.
* */
this.selectionModel = [];
/*
* Current overlay position because of we have to toggle overlayPosition
* in [ngClass] direction and this directive can use only string.
*/
this.overlayPosition = (/** @type {?} */ (''));
/*
* Stream of events that will fire when one of the options fire selectionChange event.
* */
this.selectionChange = defer(function () {
return merge.apply(void 0, tslib_1.__spread(_this.options.map(function (it) { return it.selectionChange; })));
});
this.alive = true;
/*
* Function passed through control value accessor to propagate changes.
* */
this.onChange = function () { };
this.onTouched = function () { };
}
Object.defineProperty(NbSelectComponent.prototype, "setSelected", {
/*
* Accepts selected item or array of selected items.
* */
set: /*
* Accepts selected item or array of selected items.
* */
/**
* @param {?} value
* @return {?}
*/
function (value) {
this.writeValue(value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(NbSelectComponent.prototype, "setMultiple", {
/*
* Gives capability just write `multiple` over the element.
* */
set: /*
* Gives capability just write `multiple` over the element.
* */
/**
* @param {?} multiple
* @return {?}
*/
function (multiple) {
this.multiple = convertToBoolProperty(multiple);
},
enumerable: true,
configurable: true
});
Object.defineProperty(NbSelectComponent.prototype, "isOpened", {
/*
* Determines is select opened.
* */
get: /*
* Determines is select opened.
* */
/**
* @return {?}
*/
function () {
return this.ref && this.ref.hasAttached();
},
enumerable: true,
configurable: true
});
Object.defineProperty(NbSelectComponent.prototype, "isHidden", {
/*
* Determines is select hidden.
* */
get: /*
* Determines is select hidden.
* */
/**
* @return {?}
*/
function () {
return !this.isOpened;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NbSelectComponent.prototype, "hostWidth", {
/*
* Returns width of the select button.
* */
get: /*
* Returns width of the select button.
* */
/**
* @return {?}
*/
function () {
return this.hostRef.nativeElement.getBoundingClientRect().width;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NbSelectComponent.prototype, "selectionView", {
/*
* Content rendered in the label.
* */
get: /*
* Content rendered in the label.
* */
/**
* @return {?}
*/
function () {
if (this.selectionModel.length > 1) {
return this.selectionModel.map(function (option) { return option.content; }).join(', ');
}
return this.selectionModel[0].content;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
NbSelectComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.createOverlay();
};
/**
* @return {?}
*/
NbSelectComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
this.subscribeOnTriggers();
this.subscribeOnPositionChange();
this.subscribeOnSelectionChange();
};
/**
* @return {?}
*/
NbSelectComponent.prototype.ngAfterContentInit = /**
* @return {?}
*/
function () {
if (this.queue) {
this.writeValue(this.queue);
this.cd.detectChanges();
}
};
/**
* @return {?}
*/
NbSelectComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.ref.dispose();
};
/**
* @return {?}
*/
NbSelectComponent.prototype.show = /**
* @return {?}
*/
function () {
if (this.isHidden) {
this.ref.attach(this.portal);
this.cd.markForCheck();
}
};
/**
* @return {?}
*/
NbSelectComponent.prototype.hide = /**
* @return {?}
*/
function () {
if (this.isOpened) {
this.ref.detach();
this.cd.markForCheck();
}
};
/**
* @param {?} fn
* @return {?}
*/
NbSelectComponent.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onChange = fn;
};
/**
* @param {?} fn
* @return {?}
*/
NbSelectComponent.prototype.registerOnTouched = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onTouched = fn;
};
/**
* @param {?} isDisabled
* @return {?}
*/
NbSelectComponent.prototype.setDisabledState = /**
* @param {?} isDisabled
* @return {?}
*/
function (isDisabled) {
this.disabled = isDisabled;
this.cd.detectChanges();
};
/**
* @param {?} value
* @return {?}
*/
NbSelectComponent.prototype.writeValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
if (!value) {
return;
}
if (this.options) {
this.setSelection(value);
}
else {
this.queue = value;
}
};
/*
* Selects option or clear all selected options if value is null.
* */
/*
* Selects option or clear all selected options if value is null.
* */
/**
* @protected
* @param {?} option
* @return {?}
*/
NbSelectComponent.prototype.handleSelect = /*
* Selects option or clear all selected options if value is null.
* */
/**
* @protected
* @param {?} option
* @return {?}
*/
function (option) {
if (option.value) {
this.selectOption(option);
}
else {
this.reset();
}
this.cd.detectChanges();
};
/*
* Deselect all selected options.
* */
/*
* Deselect all selected options.
* */
/**
* @protected
* @return {?}
*/
NbSelectComponent.prototype.reset = /*
* Deselect all selected options.
* */
/**
* @protected
* @return {?}
*/
function () {
this.selectionModel.forEach(function (option) { return option.deselect(); });
this.selectionModel = [];
this.hide();
this.button.nativeElement.focus();
this.emitSelected(null);
};
/*
* Determines how to select option as multiple or single.
* */
/*
* Determines how to select option as multiple or single.
* */
/**
* @protected
* @param {?} option
* @return {?}
*/
NbSelectComponent.prototype.selectOption = /*
* Determines how to select option as multiple or single.
* */
/**
* @protected
* @param {?} option
* @return {?}
*/
function (option) {
if (this.multiple) {
this.handleMultipleSelect(option);
}
else {
this.handleSingleSelect(option);
}
};
/*
* Select single option.
* */
/*
* Select single option.
* */
/**
* @protected
* @param {?} option
* @return {?}
*/
NbSelectComponent.prototype.handleSingleSelect = /*
* Select single option.
* */
/**
* @protected
* @param {?} option
* @return {?}
*/
function (option) {
/** @type {?} */
var selected = this.selectionModel.pop();
if (selected && selected !== option) {
selected.deselect();
}
this.selectionModel = [option];
option.select();
this.hide();
this.button.nativeElement.focus();
this.emitSelected(option.value);
};
/*
* Select for multiple options.
* */
/*
* Select for multiple options.
* */
/**
* @protected
* @param {?} option
* @return {?}
*/
NbSelectComponent.prototype.handleMultipleSelect = /*
* Select for multiple options.
* */
/**
* @protected
* @param {?} option
* @return {?}
*/
function (option) {
if (option.selected) {
this.selectionModel = this.selectionModel.filter(function (s) { return s.value !== option.value; });
option.deselect();
}
else {
this.selectionModel.push(option);
option.select();
}
this.emitSelected(this.selectionModel.map(function (opt) { return opt.value; }));
};
/**
* @protected
* @return {?}
*/
NbSelectComponent.prototype.createOverlay = /**
* @protected
* @return {?}
*/
function () {
/** @type {?} */
var scrollStrategy = this.createScrollStrategy();
this.positionStrategy = this.createPositionStrategy();
this.ref = this.overlay.create({ positionStrategy: this.positionStrategy, scrollStrategy: scrollStrategy });
};
/**
* @protected
* @return {?}
*/
NbSelectComponent.prototype.createPositionStrategy = /**
* @protected
* @return {?}
*/
function () {
return this.positionBuilder
.connectedTo(this.hostRef)
.position(NbPosition.BOTTOM)
.offset(0)
.adjustment(NbAdjustment.VERTICAL);
};
/**
* @protected
* @return {?}
*/
NbSelectComponent.prototype.createScrollStrategy = /**
* @protected
* @return {?}
*/
function () {
return this.overlay.scrollStrategies.block();
};
/**
* @protected
* @return {?}
*/
NbSelectComponent.prototype.subscribeOnTriggers = /**
* @protected
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var triggerStrategy = new NbTriggerStrategyBuilder()
.document(this.document)
.trigger(NbTrigger.CLICK)
.host(this.hostRef.nativeElement)
.container(function () { return _this.getContainer(); })
.build();
triggerStrategy.show$
.pipe(takeWhile(function () { return _this.alive; }))
.subscribe(function () { return _this.show(); });
triggerStrategy.hide$
.pipe(takeWhile(function () { return _this.alive; }))
.subscribe(function ($event) {
_this.hide();
if (!_this.isClickedWithinComponent($event)) {
_this.onTouched();
}
});
};
/**
* @protected
* @return {?}
*/
NbSelectComponent.prototype.subscribeOnPositionChange = /**
* @protected
* @return {?}
*/
function () {
var _this = this;
this.positionStrategy.positionChange
.pipe(takeWhile(function () { return _this.alive; }))
.subscribe(function (position) { return _this.overlayPosition = position; });
this.positionStrategy.positionChange
.pipe(take(1))
.subscribe(function () { return _this.cd.detectChanges(); });
};
/**
* @protected
* @return {?}
*/
NbSelectComponent.prototype.subscribeOnSelectionChange = /**
* @protected
* @return {?}
*/
function () {
var _this = this;
this.selectionChange
.pipe(takeWhile(function () { return _this.alive; }))
.subscribe(function (option) { return _this.handleSelect(option); });
};
/**
* @protected
* @return {?}
*/
NbSelectComponent.prototype.getContainer = /**
* @protected
* @return {?}
*/
function () {
return this.ref && this.ref.hasAttached() && (/** @type {?} */ ({
location: {
nativeElement: this.ref.overlayElement,
},
}));
};
/*
* Propagate selected value.
* */
/*
* Propagate selected value.
* */
/**
* @protected
* @param {?} selected
* @return {?}
*/
NbSelectComponent.prototype.emitSelected = /*
* Propagate selected value.
* */
/**
* @protected
* @param {?} selected
* @return {?}
*/
function (selected) {
this.onChange(selected);
this.selectedChange.emit(selected);
};
/*
* Set selected value in model.
* */
/*
* Set selected value in model.
* */
/**
* @protected
* @param {?} value
* @return {?}
*/
NbSelectComponent.prototype.setSelection = /*
* Set selected value in model.
* */
/**
* @protected
* @param {?} value
* @return {?}
*/
function (value) {
var _this = this;
/** @type {?} */
var isArray = Array.isArray(value);
if (this.multiple && !isArray) {
throw new Error('Can\'t assign single value if select is marked as multiple');
}
if (!this.multiple && isArray) {
throw new Error('Can\'t assign array if select is not marked as multiple');
}
this.cleanSelection();
if (isArray) {
((/** @type {?} */ (value))).forEach(function (option) { return _this.selectValue(option); });
}
else {
this.selectValue((/** @type {?} */ (value)));
}
this.cd.markForCheck();
this.cd.detectChanges();
};
/**
* @protected
* @return {?}
*/
NbSelectComponent.prototype.cleanSelection = /**
* @protected
* @return {?}
*/
function () {
this.selectionModel.forEach(function (option) { return option.deselect(); });
this.selectionModel = [];
};
/*
* Selects value.
* */
/*
* Selects value.
* */
/**
* @protected
* @param {?} value
* @return {?}
*/
NbSelectComponent.prototype.selectValue = /*
* Selects value.
* */
/**
* @protected
* @param {?} value
* @return {?}
*/
function (value) {
/** @type {?} */
var corresponding = this.options.find(function (option) { return option.value === value; });
if (corresponding) {
corresponding.select();
this.selectionModel.push(corresponding);
}
};
/*
* Sets touched if focus moved outside of button and overlay,
* ignoring the case when focus moved to options overlay.
*/
/*
* Sets touched if focus moved outside of button and overlay,
* ignoring the case when focus moved to options overlay.
*/
/**
* @return {?}
*/
NbSelectComponent.prototype.trySetTouched = /*
* Sets touched if focus moved outside of button and overlay,
* ignoring the case when focus moved to options overlay.
*/
/**
* @return {?}
*/
function () {
if (this.isHidden) {
this.onTouched();
}
};
/**
* @protected
* @param {?} $event
* @return {?}
*/
NbSelectComponent.prototype.isClickedWithinComponent = /**
* @protected
* @param {?} $event
* @return {?}
*/
function ($event) {
return this.hostRef.nativeElement === $event.target || this.hostRef.nativeElement.contains((/** @type {?} */ ($event.target)));
};
NbSelectComponent.decorators = [
{ type: Component, args: [{
selector: 'nb-select',
template: "<button\r\n nbButton\r\n [size]=\"size\"\r\n [status]=\"status\"\r\n [shape]=\"shape\"\r\n [hero]=\"hero\"\r\n [disabled]=\"disabled\"\r\n [fullWidth]=\"fullWidth\"\r\n [outline]=\"outline\"\r\n [class.opened]=\"isOpened\"\r\n [ngClass]=\"overlayPosition\"\r\n (blur)=\"trySetTouched()\"\r\n type=\"button\">\r\n\r\n <ng-container *ngIf=\"selectionModel?.length\">\r\n\r\n <ng-container *ngIf=\"customLabel\">\r\n <ng-content select=\"nb-select-label\"></ng-content>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!customLabel\">{{ selectionView }}</ng-container>\r\n\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!selectionModel?.length\">{{ placeholder }}</ng-container>\r\n\r\n</button>\r\n\r\n<nb-card *nbPortal class=\"select\" [ngClass]=\"[status, overlayPosition]\" [style.width.px]=\"hostWidth\">\r\n <nb-card-body>\r\n <ng-content select=\"nb-option, nb-option-group\"></ng-content>\r\n </nb-card-body>\r\n</nb-card>\r\n",
changeDetection: ChangeDetectionStrategy.OnPush,
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(function () { return NbSelectComponent; }),
multi: true,
},
],
styles: ["/*!\r\n * @license\r\n * Copyright Akveo. All Rights Reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n */:host{display:block}:host button{position:relative;width:100%;text-align:start;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border:none}:host button::after{top:50%;right:.75rem;position:absolute;display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:'';border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}"]
}] }
];
/** @nocollapse */
NbSelectComponent.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: Inject, args: [NB_DOCUMENT,] }] },
{ type: NbOverlayService },
{ type: ElementRef },
{ type: NbPositionBuilderService },
{ type: ChangeDetectorRef }
]; };
NbSelectComponent.propDecorators = {
size: [{ type: Input }],
status: [{ type: Input }],
shape: [{ type: Input }],
hero: [{ type: Input }],
disabled: [{ type: Input }],
fullWidth: [{ type: Input }],
outline: [{ type: Input }],
placeholder: [{ type: Input }],
selectedChange: [{ type: Output }],
setSelected: [{ type: Input, args: ['selected',] }],
setMultiple: [{ type: Input, args: ['multiple',] }],
options: [{ type: ContentChildren, args: [NbOptionComponent, { descendants: true },] }],
customLabel: [{ type: ContentChild, args: [NbSelectLabelComponent,] }],
portal: [{ type: ViewChild, args: [NbPortalDirective,] }],
button: [{ type: ViewChild, args: [NbButtonComponent, { read: ElementRef },] }]
};
return NbSelectComponent;
}());
export { NbSelectComponent };
if (false) {
/** @type {?} */
NbSelectComponent.prototype.size;
/** @type {?} */
NbSelectComponent.prototype.status;
/** @type {?} */
NbSelectComponent.prototype.shape;
/** @type {?} */
NbSelectComponent.prototype.hero;
/** @type {?} */
NbSelectComponent.prototype.disabled;
/** @type {?} */
NbSelectComponent.prototype.fullWidth;
/** @type {?} */
NbSelectComponent.prototype.outline;
/** @type {?} */
NbSelectComponent.prototype.placeholder;
/** @type {?} */
NbSelectComponent.prototype.selectedChange;
/** @type {?} */
NbSelectComponent.prototype.options;
/** @type {?} */
NbSelectComponent.prototype.customLabel;
/** @type {?} */
NbSelectComponent.prototype.portal;
/** @type {?} */
NbSelectComponent.prototype.button;
/** @type {?} */
NbSelectComponent.prototype.multiple;
/** @type {?} */
NbSelectComponent.prototype.selectionModel;
/** @type {?} */
NbSelectComponent.prototype.positionStrategy;
/** @type {?} */
NbSelectComponent.prototype.overlayPosition;
/** @type {?} */
NbSelectComponent.prototype.selectionChange;
/**
* @type {?}
* @protected
*/
NbSelectComponent.prototype.ref;
/**
* @type {?}
* @protected
*/
NbSelectComponent.prototype.alive;
/**
* @type {?}
* @protected
*/
NbSelectComponent.prototype.queue;
/**
* @type {?}
* @protected
*/
NbSelectComponent.prototype.onChange;
/**
* @type {?}
* @protected
*/
NbSelectComponent.prototype.onTouched;
/**
* @type {?}
* @protected
*/
NbSelectComponent.prototype.document;
/**
* @type {?}
* @protected
*/
NbSelectComponent.prototype.overlay;
/**
* @type {?}
* @protected
*/
NbSelectComponent.prototype.hostRef;
/**
* @type {?}
* @protected
*/
NbSelectComponent.prototype.positionBuilder;
/**
* @type {?}
* @protected
*/
NbSelectComponent.prototype.cd;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3RoZW1lLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL3NlbGVjdC9zZWxlY3QuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFNQSxPQUFPLEVBR0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBRVQsWUFBWSxFQUNaLGVBQWUsRUFDZixVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBQ1QsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBRWhELE9BQU8sRUFFTCxZQUFZLEVBRVosZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQixVQUFVLEVBQ1Ysd0JBQXdCLEVBQ3hCLFNBQVMsRUFFVCx3QkFBd0IsR0FDekIsTUFBTSxRQUFRLENBQUM7QUFDaEIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUduRDtJQUFBO0lBS0EsQ0FBQzs7Z0JBTEEsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxpQkFBaUI7b0JBQzNCLFFBQVEsRUFBRSwyQkFBMkI7aUJBQ3RDOztJQUVELDZCQUFDO0NBQUEsQUFMRCxJQUtDO1NBRFksc0JBQXNCOzs7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QUU1QixrQ0FBZ0M7Ozs7O0lBT2hDLGtDQUF5Qjs7Ozs7SUFLekIscUNBQXdDOzs7OztJQUN4QyxzQ0FBeUM7Ozs7O0lBRTdCLHFDQUF1Qzs7Ozs7SUFDdkMsb0NBQW1DOzs7OztJQUNuQyxvQ0FBMEM7Ozs7O0lBQzFDLDRDQUFtRDs7Ozs7SUFDbkQsK0JBQStCIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IEFrdmVvLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG4gKi9cclxuXHJcbmltcG9ydCB7XHJcbiAgQWZ0ZXJDb250ZW50SW5pdCxcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBDb21wb25lbnRSZWYsXHJcbiAgQ29udGVudENoaWxkLFxyXG4gIENvbnRlbnRDaGlsZHJlbixcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBmb3J3YXJkUmVmLFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBRdWVyeUxpc3QsXHJcbiAgVmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IHRha2UsIHRha2VXaGlsZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgZGVmZXIsIG1lcmdlLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQge1xyXG4gIE5iQWRqdXN0YWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3ksXHJcbiAgTmJBZGp1c3RtZW50LFxyXG4gIE5iT3ZlcmxheVJlZixcclxuICBOYk92ZXJsYXlTZXJ2aWNlLFxyXG4gIE5iUG9ydGFsRGlyZWN0aXZlLFxyXG4gIE5iUG9zaXRpb24sXHJcbiAgTmJQb3NpdGlvbkJ1aWxkZXJTZXJ2aWNlLCBOYlNjcm9sbFN0cmF0ZWd5LFxyXG4gIE5iVHJpZ2dlcixcclxuICBOYlRyaWdnZXJTdHJhdGVneSxcclxuICBOYlRyaWdnZXJTdHJhdGVneUJ1aWxkZXIsXHJcbn0gZnJvbSAnLi4vY2RrJztcclxuaW1wb3J0IHsgTmJPcHRpb25Db21wb25lbnQgfSBmcm9tICcuL29wdGlvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBOYkJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uL2J1dHRvbi9idXR0b24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgTkJfRE9DVU1FTlQgfSBmcm9tICcuLi8uLi90aGVtZS5vcHRpb25zJztcclxuaW1wb3J0IHsgY29udmVydFRvQm9vbFByb3BlcnR5IH0gZnJvbSAnLi4vaGVscGVycyc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduYi1zZWxlY3QtbGFiZWwnLFxyXG4gIHRlbXBsYXRlOiAnPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PicsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOYlNlbGVjdExhYmVsQ29tcG9uZW50IHtcclxufVxyXG5cclxuLypcclxuICogVGhlIGBOYlNlbGVjdENvbXBvbmVudGAgcHJvdmlkZXMgYSBjYXBhYmlsaXR5IHRvIHNlbGVjdCBvbmUgb2YgdGhlIHBhc3NlZCBpdGVtcy5cclxuICpcclxuICogQHN0YWNrZWQtZXhhbXBsZShTaG93Y2FzZSwgc2VsZWN0L3NlbGVjdC1zaG93Y2FzZS5jb21wb25lbnQpXHJcbiAqXHJcbiAqICMjIyBJbnN0YWxsYXRpb25cclxuICpcclxuICogSW1wb3J0IGBOYlNlbGVjdE1vZHVsZWAgdG8geW91ciBmZWF0dXJlIG1vZHVsZS5cclxuICogYGBgdHNcclxuICogQE5nTW9kdWxlKHtcclxuICogICBpbXBvcnRzOiBbXHJcbiAqICAgXHQvLyAuLi5cclxuICogICAgIE5iU2VsZWN0TW9kdWxlLFxyXG4gKiAgIF0sXHJcbiAqIH0pXHJcbiAqIGV4cG9ydCBjbGFzcyBQYWdlTW9kdWxlIHsgfVxyXG4gKiBgYGBcclxuICogIyMjIFVzYWdlXHJcbiAqXHJcbiAqIElmIHlvdSB3YW50IHRvIHVzZSBpdCBhcyB0aGUgbXVsdGktc2VsZWN0IGNvbnRyb2wgeW91IGhhdmUgdG8gbWFyayBpdCBhcyBgbXVsdGlwbGVgLlxyXG4gKiBJbiB0aGlzIGNhc2UsIGBuYi1zZWxlY3RgIHdpbGwgd29yayBvbmx5IHdpdGggYXJyYXlzIC0gYWNjZXB0IGFycmF5cyBhbmQgcHJvcGFnYXRlIGFycmF5cy5cclxuICpcclxuICogQHN0YWNrZWQtZXhhbXBsZShNdWx0aXBsZSwgc2VsZWN0L3NlbGVjdC1tdWx0aXBsZS5jb21wb25lbnQpXHJcbiAqXHJcbiAqIEl0ZW1zIHdpdGhvdXQgdmFsdWVzIHdpbGwgY2xlYW4gc2VsZWN0aW9uLlxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKENsZWFuIHNlbGVjdGlvbiwgc2VsZWN0L3NlbGVjdC1jbGVhbi5jb21wb25lbnQpXHJcbiAqXHJcbiAqIFNlbGVjdCBtYXkgYmUgYm91bmRlZCB1c2luZyBgc2VsZWN0ZWRgIGlucHV0OlxyXG4gKlxyXG4gKiBgYGBodG1sXHJcbiAqIDxuYi1zZWxlY3QgWyhzZWxlY3RlZCldPVwic2VsZWN0ZWRcIj48L25iLXNlbGVjdGVkPlxyXG4gKiBgYGBcclxuICpcclxuICogT3IgeW91IGNhbiBiaW5kIGNvbnRyb2wgd2l0aCBmb3JtIGNvbnRyb2xzIG9yIG5nTW9kZWw6XHJcbiAqXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoU2VsZWN0IGZvcm0gYmluZGluZywgc2VsZWN0L3NlbGVjdC1mb3JtLmNvbXBvbmVudClcclxuICpcclxuICogT3B0aW9ucyBpbiB0aGUgc2VsZWN0IG1heSBiZSBncm91cGVkIHVzaW5nIGBuYi1vcHRpb24tZ3JvdXBgIGNvbXBvbmVudC5cclxuICpcclxuICogQHN0YWNrZWQtZXhhbXBsZShHcm91cGluZywgc2VsZWN0L3NlbGVjdC1ncm91cHMuY29tcG9uZW50KVxyXG4gKlxyXG4gKiBTZWxlY3QgbWF5IGhhdmUgYSBwbGFjZWhvbGRlciB0aGF0IHdpbGwgYmUgc2hvd24gd2hlbiBub3RoaW5nIHNlbGVjdGVkOlxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKFBsYWNlaG9sZGVyLCBzZWxlY3Qvc2VsZWN0LXBsYWNlaG9sZGVyLmNvbXBvbmVudClcclxuICpcclxuICogWW91IGNhbiBkaXNhYmxlIHNlbGVjdCwgb3B0aW9ucyBhbmQgd2hvbGUgZ3JvdXBzLlxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKERpc2FibGVkIHNlbGVjdCwgc2VsZWN0L3NlbGVjdC1kaXNhYmxlZC5jb21wb25lbnQpXHJcbiAqXHJcbiAqIEFsc28sIHRoZSBjdXN0b20gbGFiZWwgbWF5IGJlIHByb3ZpZGVkIGluIHNlbGVjdC5cclxuICogVGhpcyBjdXN0b20gbGFiZWwgd2lsbCBiZSB1c2VkIGZvciBpbnN0ZWFkIHBsYWNlaG9sZGVyIHdoZW4gc29tZXRoaW5nIHNlbGVjdGVkLlxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKEN1c3RvbSBsYWJlbCwgc2VsZWN0L3NlbGVjdC1sYWJlbC5jb21wb25lbnQpXHJcbiAqXHJcbiAqIERlZmF1bHQgYG5iLXNlbGVjdGAgc2l6ZSBpcyBgbWVkaXVtYCBhbmQgc3RhdHVzIGNvbG9yIGlzIGBwcmltYXJ5YC5cclxuICogU2VsZWN0IGlzIGF2YWlsYWJsZSBpbiBtdWx0aXBsZSBjb2xvcnMgdXNpbmcgYHN0YXR1c2AgcHJvcGVydHk6XHJcbiAqXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoU2VsZWN0IHN0YXR1c2VzLCBzZWxlY3Qvc2VsZWN0LXN0YXR1cy5jb21wb25lbnQpXHJcbiAqXHJcbiAqIFRoZXJlIGFyZSBmb3VyIHNlbGVjdCBzaXplczpcclxuICpcclxuICogQHN0YWNrZWQtZXhhbXBsZShTZWxlY3Qgc2l6ZXMsIHNlbGVjdC9zZWxlY3Qtc2l6ZXMuY29tcG9uZW50KVxyXG4gKlxyXG4gKiBBbmQgdHdvIGFkZGl0aW9uYWwgc3R5bGUgdHlwZXMgLSBgb3V0bGluZWA6XHJcbiAqXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoT3V0bGluZSBzZWxlY3QsIHNlbGVjdC9zZWxlY3Qtb3V0bGluZS5jb21wb25lbnQpXHJcbiAqXHJcbiAqIGFuZCBgaGVyb2A6XHJcbiAqXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoU2VsZWN0IGNvbG9ycywgc2VsZWN0L3NlbGVjdC1oZXJvLmNvbXBvbmVudClcclxuICpcclxuICogU2VsZWN0IGlzIGF2YWlsYWJsZSBpbiBkaWZmZXJlbnQgc2hhcGVzLCB0aGF0IGNvdWxkIGJlIGNvbWJpbmVkIHdpdGggdGhlIG90aGVyIHByb3BlcnRpZXM6XHJcbiAqXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoU2VsZWN0IHNoYXBlcywgc2VsZWN0L3NlbGVjdC1zaGFwZXMuY29tcG9uZW50KVxyXG4gKlxyXG4gKlxyXG4gKiBAc3R5bGVzXHJcbiAqXHJcbiAqIHNlbGVjdC1ib3JkZXItd2lkdGg6XHJcbiAqIHNlbGVjdC1tYXgtaGVpZ2h0OlxyXG4gKiBzZWxlY3QtYmc6XHJcbiAqIHNlbGVjdC1jaGVja2JveC1jb2xvcjpcclxuICogc2VsZWN0LWNoZWNrbWFyay1jb2xvcjpcclxuICogc2VsZWN0LW9wdGlvbi1kaXNhYmxlZC1iZzpcclxuICogc2VsZWN0LW9wdGlvbi1kaXNhYmxlZC1vcGFjaXR5OlxyXG4gKiBzZWxlY3Qtb3B0aW9uLXBhZGRpbmc6XHJcbiAqICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmItc2VsZWN0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9zZWxlY3QuY29tcG9uZW50LnNjc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE5iU2VsZWN0Q29tcG9uZW50KSxcclxuICAgICAgbXVsdGk6IHRydWUsXHJcbiAgICB9LFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOYlNlbGVjdENvbXBvbmVudDxUPiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcbiAgLypcclxuICAgKiBTZWxlY3Qgc2l6ZSwgYXZhaWxhYmxlIHNpemVzOlxyXG4gICAqIGB4eHNtYWxsYCwgYHhzbWFsbGAsIGBzbWFsbGAsIGBtZWRpdW1gLCBgbGFyZ2VgXHJcbiAgICovXHJcbiAgQElucHV0KCkgc2l6ZTogc3RyaW5nO1xyXG5cclxuICAvKlxyXG4gICAqIFNlbGVjdCBzdGF0dXMgKGFkZHMgc3BlY2lmaWMgc3R5bGVzKTpcclxuICAgKiBgcHJpbWFyeWAsIGBpbmZvYCwgYHN1Y2Nlc3NgLCBgd2FybmluZ2AsIGBkYW5nZXJgXHJcbiAgICovXHJcbiAgQElucHV0KCkgc3RhdHVzOiBzdHJpbmcgPSAncHJpbWFyeSc7XHJcblxyXG4gIC8qXHJcbiAgICogU2VsZWN0IHNoYXBlczogYHJlY3RhbmdsZWAsIGByb3VuZGAsIGBzZW1pLXJvdW5kYFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHNoYXBlOiBzdHJpbmc7XHJcblxyXG4gIC8qXHJcbiAgICogQWRkcyBgaGVyb2Agc3R5bGVzXHJcbiAgICovXHJcbiAgQElucHV0KCkgaGVybzogYm9vbGVhbjtcclxuXHJcbiAgLypcclxuICAgKiBEaXNhYmxlcyB0aGUgc2VsZWN0XHJcbiAgICovXHJcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW47XHJcblxyXG4gIC8qXHJcbiAgICogSWYgc2V0IGVsZW1lbnQgd2lsbCBmaWxsIGl0cyBjb250YWluZXJcclxuICAgKi9cclxuICBASW5wdXQoKSBmdWxsV2lkdGg6IGJvb2xlYW47XHJcblxyXG4gIC8qXHJcbiAgICogQWRkcyBgb3V0bGluZWAgc3R5bGVzXHJcbiAgICovXHJcbiAgQElucHV0KCkgb3V0bGluZTogYm9vbGVhbjtcclxuXHJcbiAgLypcclxuICAgKiBSZW5kZXJzIHNlbGVjdCBwbGFjZWhvbGRlciBpZiBub3RoaW5nIHNlbGVjdGVkLlxyXG4gICAqICovXHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xyXG5cclxuICAvKlxyXG4gICAqIFdpbGwgYmUgZW1pdHRlZCB3aGVuIHNlbGVjdGVkIHZhbHVlIGNoYW5nZXMuXHJcbiAgICogKi9cclxuICBAT3V0cHV0KCkgc2VsZWN0ZWRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxUIHwgVFtdPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgLypcclxuICAgKiBBY2NlcHRzIHNlbGVjdGVkIGl0ZW0gb3IgYXJyYXkgb2Ygc2VsZWN0ZWQgaXRlbXMuXHJcbiAgICogKi9cclxuICBASW5wdXQoJ3NlbGVjdGVkJylcclxuICBzZXQgc2V0U2VsZWN0ZWQodmFsdWU6IFQgfCBUW10pIHtcclxuICAgIHRoaXMud3JpdGVWYWx1ZSh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIEdpdmVzIGNhcGFiaWxpdHkganVzdCB3cml0ZSBgbXVsdGlwbGVgIG92ZXIgdGhlIGVsZW1lbnQuXHJcbiAgICogKi9cclxuICBASW5wdXQoJ211bHRpcGxlJylcclxuICBzZXQgc2V0TXVsdGlwbGUobXVsdGlwbGU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMubXVsdGlwbGUgPSBjb252ZXJ0VG9Cb29sUHJvcGVydHkobXVsdGlwbGUpO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBMaXN0IG9mIGBOYk9wdGlvbkNvbXBvbmVudGAncyBjb21wb25lbnRzIHBhc3NlZCBhcyBjb250ZW50LlxyXG4gICAqIFRPRE8gbWF5YmUgaXQgd291bGQgYmUgYmV0dGVyIHByb3ZpZGUgd3JhcHBlclxyXG4gICAqICovXHJcbiAgQENvbnRlbnRDaGlsZHJlbihOYk9wdGlvbkNvbXBvbmVudCwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KSBvcHRpb25zOiBRdWVyeUxpc3Q8TmJPcHRpb25Db21wb25lbnQ8VD4+O1xyXG5cclxuICAvKlxyXG4gICAqIEN1c3RvbSBzZWxlY3QgbGFiZWwsIHdpbGwgYmUgcmVuZGVyZWQgaW5zdGVhZCBvZiBkZWZhdWx0IGVudW1lcmF0aW9uIHdpdGggY29tYS5cclxuICAgKiAqL1xyXG4gIEBDb250ZW50Q2hpbGQoTmJTZWxlY3RMYWJlbENvbXBvbmVudCkgY3VzdG9tTGFiZWw7XHJcblxyXG4gIC8qXHJcbiAgICogTmJDYXJkIHdpdGggb3B0aW9ucyBjb250ZW50LlxyXG4gICAqICovXHJcbiAgQFZpZXdDaGlsZChOYlBvcnRhbERpcmVjdGl2ZSkgcG9ydGFsOiBOYlBvcnRhbERpcmVjdGl2ZTtcclxuXHJcbiAgQFZpZXdDaGlsZChOYkJ1dHRvbkNvbXBvbmVudCwgeyByZWFkOiBFbGVtZW50UmVmIH0pIGJ1dHRvbjogRWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD47XHJcblxyXG4gIG11bHRpcGxlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qXHJcbiAgICogTGlzdCBvZiBzZWxlY3RlZCBvcHRpb25zLlxy