UNPKG

igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

647 lines • 43 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { CommonModule } from '@angular/common'; import { Component, ContentChild, ContentChildren, ElementRef, HostBinding, HostListener, Input, NgModule, QueryList, Inject, Optional } from '@angular/core'; import { IgxHintDirective } from '../directives/hint/hint.directive'; import { IgxInputDirective, IgxInputState } from '../directives/input/input.directive'; import { IgxLabelDirective } from '../directives/label/label.directive'; import { IgxPrefixDirective, IgxPrefixModule } from '../directives/prefix/prefix.directive'; import { IgxSuffixDirective, IgxSuffixModule } from '../directives/suffix/suffix.directive'; import { DisplayDensity, DisplayDensityToken, DisplayDensityBase } from '../core/displayDensity'; import { IgxInputGroupBase } from './input-group.common'; /** @type {?} */ var NEXT_ID = 0; /** @enum {number} */ var IgxInputGroupType = { LINE: 0, BOX: 1, BORDER: 2, SEARCH: 3, }; IgxInputGroupType[IgxInputGroupType.LINE] = 'LINE'; IgxInputGroupType[IgxInputGroupType.BOX] = 'BOX'; IgxInputGroupType[IgxInputGroupType.BORDER] = 'BORDER'; IgxInputGroupType[IgxInputGroupType.SEARCH] = 'SEARCH'; var IgxInputGroupComponent = /** @class */ (function (_super) { tslib_1.__extends(IgxInputGroupComponent, _super); function IgxInputGroupComponent(_element, _displayDensityOptions) { var _this = _super.call(this, _displayDensityOptions) || this; _this._element = _element; _this._displayDensityOptions = _displayDensityOptions; _this._type = IgxInputGroupType.LINE; _this._filled = false; _this._supressInputAutofocus = false; /** * An \@Input property that sets the value of `id` attribute. If not provided it will be automatically generated. * ```html * <igx-input-group [id]="'igx-input-group-55'"></igx-input-group> * ``` */ _this.id = "igx-input-group-" + NEXT_ID++; /** * Property that enables/disables the autogenerated class of the `IgxInputGroupComponent`. * By default applied the class is applied. * ```typescript * \@ViewChild("MyInputGroup") * public inputGroup: IgxInputGroupComponent; * ngAfterViewInit(){ * this.inputGroup.defaultClass = false; * ``` * } */ _this.defaultClass = true; /** * @hidden */ _this.hasPlaceholder = false; /** * @hidden */ _this.isRequired = false; /** * @hidden */ _this.isFocused = false; /** * @hidden */ _this.isBox = false; /** * @hidden */ _this.isBorder = false; /** * @hidden */ _this.isSearch = false; /** * An \@Input property that disables the `IgxInputGroupComponent`. * ```html * <igx-input-group [disabled]="'true'"></igx-input-group> * ``` */ _this.disabled = false; /** * @hidden */ _this.hasWarning = false; _this.element = _element; return _this; } Object.defineProperty(IgxInputGroupComponent.prototype, "validClass", { /** * @hidden */ get: /** * @hidden * @return {?} */ function () { return this.input.valid === IgxInputState.VALID; }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputGroupComponent.prototype, "invalidClass", { /** * @hidden */ get: /** * @hidden * @return {?} */ function () { return this.input.valid === IgxInputState.INVALID; }, enumerable: true, configurable: true }); /** *@hidden */ /** * @hidden * @param {?} event * @return {?} */ IgxInputGroupComponent.prototype.onClick = /** * @hidden * @param {?} event * @return {?} */ function (event) { if (!this._supressInputAutofocus) { this.input.focus(); } }; Object.defineProperty(IgxInputGroupComponent.prototype, "type", { /** * Returns the type of the `IgxInputGroupComponent`. How the input is styled. * Values are `line` - 0, `box` - 1, `border` - 2 and `search` - 3. The default is `line`. * ```typescript *@ViewChild("MyInputGroup") *public inputGroup: IgxInputGroupComponent; *ngAfterViewInit(){ * let inputType = this.inputGroup.type; *} * ``` */ get: /** * Returns the type of the `IgxInputGroupComponent`. How the input is styled. * Values are `line` - 0, `box` - 1, `border` - 2 and `search` - 3. The default is `line`. * ```typescript * \@ViewChild("MyInputGroup") * public inputGroup: IgxInputGroupComponent; * ngAfterViewInit(){ * let inputType = this.inputGroup.type; * } * ``` * @return {?} */ function () { return this._type.toString(); }, /** * An @Input property that sets how the input will be styled. * The allowed values are `line`, `box`, `border` and `search`. The default is `line`. * ```html *<igx-input-group [type]="'search'"> * ``` */ set: /** * An \@Input property that sets how the input will be styled. * The allowed values are `line`, `box`, `border` and `search`. The default is `line`. * ```html * <igx-input-group [type]="'search'"> * ``` * @param {?} value * @return {?} */ function (value) { /** @type {?} */ var type = ((/** @type {?} */ (IgxInputGroupType)))[value.toUpperCase()]; if (type !== undefined) { this.isBox = this.isBorder = this.isSearch = false; switch (type) { case IgxInputGroupType.BOX: this.isBox = true; break; case IgxInputGroupType.BORDER: this.isBorder = true; break; case IgxInputGroupType.SEARCH: this.isSearch = true; break; default: break; } this._type = type; } }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputGroupComponent.prototype, "supressInputAutofocus", { /** * Returns whether the input element of the input group will be automatically focused on click. * ```typescript * let supressInputAutofocus = this.inputGroup.supressInputAutofocus; * ``` */ get: /** * Returns whether the input element of the input group will be automatically focused on click. * ```typescript * let supressInputAutofocus = this.inputGroup.supressInputAutofocus; * ``` * @return {?} */ function () { return this._supressInputAutofocus; }, /** * Sets whether the input element of the input group will be automatically focused on click. * ```html * <igx-input-group [supressInputAutofocus]="true"></igx-input-group> * ``` */ set: /** * Sets whether the input element of the input group will be automatically focused on click. * ```html * <igx-input-group [supressInputAutofocus]="true"></igx-input-group> * ``` * @param {?} value * @return {?} */ function (value) { this._supressInputAutofocus = value; }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputGroupComponent.prototype, "isFilled", { /** *@hidden */ get: /** * @hidden * @return {?} */ function () { return this._filled || (this.input && this.input.value); }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputGroupComponent.prototype, "isDisplayDensityCosy", { /** *@hidden */ get: /** * @hidden * @return {?} */ function () { return this.displayDensity === DisplayDensity.cosy; }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputGroupComponent.prototype, "isDisplayDensityComfortable", { /** *@hidden */ get: /** * @hidden * @return {?} */ function () { return this.displayDensity === DisplayDensity.comfortable; }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputGroupComponent.prototype, "isDisplayDensityCompact", { /** *@hidden */ get: /** * @hidden * @return {?} */ function () { return this.displayDensity === DisplayDensity.compact; }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputGroupComponent.prototype, "hasHints", { /** * Returns whether the `IgxInputGroupComponent` has hints. * ```typescript *@ViewChild("MyInputGroup") *public inputGroup: IgxInputGroupComponent; *ngAfterViewInit(){ * let inputHints = this.inputGroup.hasHints; *} * ``` */ get: /** * Returns whether the `IgxInputGroupComponent` has hints. * ```typescript * \@ViewChild("MyInputGroup") * public inputGroup: IgxInputGroupComponent; * ngAfterViewInit(){ * let inputHints = this.inputGroup.hasHints; * } * ``` * @return {?} */ function () { return this.hints.length > 0; }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputGroupComponent.prototype, "hasBorder", { /** * Returns whether the `IgxInputGroupComponent` has border. * ```typescript *@ViewChild("MyInputGroup") *public inputGroup: IgxInputGroupComponent; *ngAfterViewInit(){ * let inputBroder = this.inputGroup.hasBorder; *} * ``` */ get: /** * Returns whether the `IgxInputGroupComponent` has border. * ```typescript * \@ViewChild("MyInputGroup") * public inputGroup: IgxInputGroupComponent; * ngAfterViewInit(){ * let inputBroder = this.inputGroup.hasBorder; * } * ``` * @return {?} */ function () { return this._type === IgxInputGroupType.LINE || this._type === IgxInputGroupType.BOX; }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputGroupComponent.prototype, "isTypeLine", { /** * Returns whether the `IgxInputGroupComponent` type is line. * ```typescript *@ViewChild("MyInputGroup1") *public inputGroup: IgxInputGroupComponent; *ngAfterViewInit(){ * let isTypeLine = this.inputGroup.isTypeLine; *} * ``` */ get: /** * Returns whether the `IgxInputGroupComponent` type is line. * ```typescript * \@ViewChild("MyInputGroup1") * public inputGroup: IgxInputGroupComponent; * ngAfterViewInit(){ * let isTypeLine = this.inputGroup.isTypeLine; * } * ``` * @return {?} */ function () { return this._type === IgxInputGroupType.LINE; }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputGroupComponent.prototype, "isTypeBox", { /** * Returns whether the `IgxInputGroupComponent` type is box. * ```typescript *@ViewChild("MyInputGroup1") *public inputGroup: IgxInputGroupComponent; *ngAfterViewInit(){ * let isTypeBox = this.inputGroup.isTypeBox; *} *``` */ get: /** * Returns whether the `IgxInputGroupComponent` type is box. * ```typescript * \@ViewChild("MyInputGroup1") * public inputGroup: IgxInputGroupComponent; * ngAfterViewInit(){ * let isTypeBox = this.inputGroup.isTypeBox; * } * ``` * @return {?} */ function () { return this._type === IgxInputGroupType.BOX; }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputGroupComponent.prototype, "isTypeBorder", { /** * Returns whether the `IgxInputGroupComponent` type is border. * ```typescript *@ViewChild("MyInputGroup1") *public inputGroup: IgxInputGroupComponent; *ngAfterViewInit(){ * let isTypeBorder = this.inputGroup.isTypeBorder; *} * ``` */ get: /** * Returns whether the `IgxInputGroupComponent` type is border. * ```typescript * \@ViewChild("MyInputGroup1") * public inputGroup: IgxInputGroupComponent; * ngAfterViewInit(){ * let isTypeBorder = this.inputGroup.isTypeBorder; * } * ``` * @return {?} */ function () { return this._type === IgxInputGroupType.BORDER; }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputGroupComponent.prototype, "isTypeSearch", { /** * Returns whether the `IgxInputGroupComponent` type is search. * ```typescript *@ViewChild("MyInputGroup1") *public inputGroup: IgxInputGroupComponent; *ngAfterViewInit(){ * let isTypeSearch = this.inputGroup.isTypeSearch; *} * ``` */ get: /** * Returns whether the `IgxInputGroupComponent` type is search. * ```typescript * \@ViewChild("MyInputGroup1") * public inputGroup: IgxInputGroupComponent; * ngAfterViewInit(){ * let isTypeSearch = this.inputGroup.isTypeSearch; * } * ``` * @return {?} */ function () { return this._type === IgxInputGroupType.SEARCH; }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputGroupComponent.prototype, "filled", { get: /** * @return {?} */ function () { return this._filled; }, set: /** * @param {?} val * @return {?} */ function (val) { this._filled = val; }, enumerable: true, configurable: true }); IgxInputGroupComponent.decorators = [ { type: Component, args: [{ selector: 'igx-input-group', template: "<div class=\"igx-input-group__wrapper\" *ngIf=\"isTypeBox; else bundle\">\n <ng-container *ngTemplateOutlet=\"bundle\"></ng-container>\n</div>\n<div class=\"igx-input-group__hint\">\n <ng-content select=\"igx-hint,[igxHint]\"></ng-content>\n</div>\n<ng-template #bundle>\n <div class=\"igx-input-group__bundle\">\n <ng-content select=\"igx-prefix,[igxPrefix]\"></ng-content>\n <div class=\"igx-input-group__bundle-main\">\n <ng-content select=\"[igxLabel]\"></ng-content>\n <ng-content select=\"[igxInput]\"></ng-content>\n </div>\n <ng-content select=\"igx-suffix,[igxSuffix]\"></ng-content>\n </div>\n <div class=\"igx-input-group__border\" *ngIf=\"hasBorder\"></div>\n</ng-template>\n", providers: [{ provide: IgxInputGroupBase, useExisting: IgxInputGroupComponent }] }] } ]; /** @nocollapse */ IgxInputGroupComponent.ctorParameters = function () { return [ { type: ElementRef }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DisplayDensityToken,] }] } ]; }; IgxInputGroupComponent.propDecorators = { id: [{ type: HostBinding, args: ['attr.id',] }, { type: Input }], defaultClass: [{ type: HostBinding, args: ['class.igx-input-group',] }], hasPlaceholder: [{ type: HostBinding, args: ['class.igx-input-group--placeholder',] }], isRequired: [{ type: HostBinding, args: ['class.igx-input-group--required',] }], isFocused: [{ type: HostBinding, args: ['class.igx-input-group--focused',] }], isBox: [{ type: HostBinding, args: ['class.igx-input-group--box',] }], isBorder: [{ type: HostBinding, args: ['class.igx-input-group--border',] }], isSearch: [{ type: HostBinding, args: ['class.igx-input-group--search',] }], disabled: [{ type: HostBinding, args: ['class.igx-input-group--disabled',] }, { type: Input }], validClass: [{ type: HostBinding, args: ['class.igx-input-group--valid',] }], invalidClass: [{ type: HostBinding, args: ['class.igx-input-group--invalid',] }], hasWarning: [{ type: HostBinding, args: ['class.igx-input-group--warning',] }], hints: [{ type: ContentChildren, args: [IgxHintDirective, { read: IgxHintDirective },] }], input: [{ type: ContentChild, args: [IgxInputDirective, { read: IgxInputDirective },] }], onClick: [{ type: HostListener, args: ['click', ['$event'],] }], type: [{ type: Input, args: ['type',] }], supressInputAutofocus: [{ type: Input }], isFilled: [{ type: HostBinding, args: ['class.igx-input-group--filled',] }], isDisplayDensityCosy: [{ type: HostBinding, args: ['class.igx-input-group--cosy',] }], isDisplayDensityComfortable: [{ type: HostBinding, args: ['class.igx-input-group--comfortable',] }], isDisplayDensityCompact: [{ type: HostBinding, args: ['class.igx-input-group--compact',] }] }; return IgxInputGroupComponent; }(DisplayDensityBase)); export { IgxInputGroupComponent }; if (false) { /** * @type {?} * @private */ IgxInputGroupComponent.prototype._type; /** * @type {?} * @private */ IgxInputGroupComponent.prototype._filled; /** * @type {?} * @private */ IgxInputGroupComponent.prototype._supressInputAutofocus; /** * An ElementRef property of the `IgxInputGroupComponent`. * @type {?} */ IgxInputGroupComponent.prototype.element; /** * An \@Input property that sets the value of `id` attribute. If not provided it will be automatically generated. * ```html * <igx-input-group [id]="'igx-input-group-55'"></igx-input-group> * ``` * @type {?} */ IgxInputGroupComponent.prototype.id; /** * Property that enables/disables the autogenerated class of the `IgxInputGroupComponent`. * By default applied the class is applied. * ```typescript * \@ViewChild("MyInputGroup") * public inputGroup: IgxInputGroupComponent; * ngAfterViewInit(){ * this.inputGroup.defaultClass = false; * ``` * } * @type {?} */ IgxInputGroupComponent.prototype.defaultClass; /** * @hidden * @type {?} */ IgxInputGroupComponent.prototype.hasPlaceholder; /** * @hidden * @type {?} */ IgxInputGroupComponent.prototype.isRequired; /** * @hidden * @type {?} */ IgxInputGroupComponent.prototype.isFocused; /** * @hidden * @type {?} */ IgxInputGroupComponent.prototype.isBox; /** * @hidden * @type {?} */ IgxInputGroupComponent.prototype.isBorder; /** * @hidden * @type {?} */ IgxInputGroupComponent.prototype.isSearch; /** * An \@Input property that disables the `IgxInputGroupComponent`. * ```html * <igx-input-group [disabled]="'true'"></igx-input-group> * ``` * @type {?} */ IgxInputGroupComponent.prototype.disabled; /** * @hidden * @type {?} */ IgxInputGroupComponent.prototype.hasWarning; /** * @hidden * @type {?} * @protected */ IgxInputGroupComponent.prototype.hints; /** * @hidden * @type {?} * @protected */ IgxInputGroupComponent.prototype.input; /** * @type {?} * @private */ IgxInputGroupComponent.prototype._element; /** * @type {?} * @private */ IgxInputGroupComponent.prototype._displayDensityOptions; } /** * @hidden */ var IgxInputGroupModule = /** @class */ (function () { function IgxInputGroupModule() { } IgxInputGroupModule.decorators = [ { type: NgModule, args: [{ declarations: [IgxInputGroupComponent, IgxHintDirective, IgxInputDirective, IgxLabelDirective], exports: [IgxInputGroupComponent, IgxHintDirective, IgxInputDirective, IgxLabelDirective, IgxPrefixDirective, IgxSuffixDirective], imports: [CommonModule, IgxPrefixModule, IgxSuffixModule] },] } ]; return IgxInputGroupModule; }()); export { IgxInputGroupModule }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtZ3JvdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9pbnB1dC1ncm91cC9pbnB1dC1ncm91cC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUNILFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFDTCxRQUFRLEVBQ1IsU0FBUyxFQUNULE1BQU0sRUFDTixRQUFRLEVBQ1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDckUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUMzRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDNUYsT0FBTyxFQUFFLGNBQWMsRUFBMEIsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6SCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7SUFFckQsT0FBTyxHQUFHLENBQUM7OztJQUdYLE9BQUk7SUFDSixNQUFHO0lBQ0gsU0FBTTtJQUNOLFNBQU07Ozs7OztBQUdWO0lBSzRDLGtEQUFrQjtJQThOMUQsZ0NBQW9CLFFBQW9CLEVBQ2Esc0JBQThDO1FBRG5HLFlBRUksa0JBQU0sc0JBQXNCLENBQUMsU0FFaEM7UUFKbUIsY0FBUSxHQUFSLFFBQVEsQ0FBWTtRQUNhLDRCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUE5TjNGLFdBQUssR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7UUFDL0IsYUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQiw0QkFBc0IsR0FBRyxLQUFLLENBQUM7Ozs7Ozs7UUFlaEMsUUFBRSxHQUFHLHFCQUFtQixPQUFPLEVBQUksQ0FBQzs7Ozs7Ozs7Ozs7O1FBY3BDLGtCQUFZLEdBQUcsSUFBSSxDQUFDOzs7O1FBTXBCLG9CQUFjLEdBQUcsS0FBSyxDQUFDOzs7O1FBTXZCLGdCQUFVLEdBQUcsS0FBSyxDQUFDOzs7O1FBTW5CLGVBQVMsR0FBRyxLQUFLLENBQUM7Ozs7UUFPbEIsV0FBSyxHQUFHLEtBQUssQ0FBQzs7OztRQU1kLGNBQVEsR0FBRyxLQUFLLENBQUM7Ozs7UUFNakIsY0FBUSxHQUFHLEtBQUssQ0FBQzs7Ozs7OztRQVVqQixjQUFRLEdBQUcsS0FBSyxDQUFDOzs7O1FBc0JqQixnQkFBVSxHQUFHLEtBQUssQ0FBQztRQTRIdEIsS0FBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUM7O0lBQzVCLENBQUM7SUE5SUQsc0JBQ1csOENBQVU7UUFKckI7O1dBRUc7Ozs7O1FBQ0g7WUFFSSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLGFBQWEsQ0FBQyxLQUFLLENBQUM7UUFDcEQsQ0FBQzs7O09BQUE7SUFLRCxzQkFDVyxnREFBWTtRQUp2Qjs7V0FFRzs7Ozs7UUFDSDtZQUVJLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssYUFBYSxDQUFDLE9BQU8sQ0FBQztRQUN0RCxDQUFDOzs7T0FBQTtJQW9CRDs7T0FFRzs7Ozs7O0lBRUksd0NBQU87Ozs7O0lBRGQsVUFDZSxLQUFLO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUU7WUFDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUN0QjtJQUNMLENBQUM7SUFTRCxzQkFDSSx3Q0FBSTtRQTBFUjs7Ozs7Ozs7OztXQVVHOzs7Ozs7Ozs7Ozs7O1FBQ0g7WUFDSSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakMsQ0FBQztRQS9GRDs7Ozs7O1dBTUc7Ozs7Ozs7Ozs7UUFDSCxVQUNTLEtBQWE7O2dCQUNaLElBQUksR0FBc0IsQ0FBQyxtQkFBQSxpQkFBaUIsRUFBTyxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQy9FLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTtnQkFDcEIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO2dCQUNuRCxRQUFRLElBQUksRUFBRTtvQkFDVixLQUFLLGlCQUFpQixDQUFDLEdBQUc7d0JBQ3RCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO3dCQUNsQixNQUFNO29CQUNWLEtBQUssaUJBQWlCLENBQUMsTUFBTTt3QkFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7d0JBQ3JCLE1BQU07b0JBQ1YsS0FBSyxpQkFBaUIsQ0FBQyxNQUFNO3dCQUN6QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQzt3QkFDckIsTUFBTTtvQkFDVixPQUFPLENBQUMsQ0FBQyxNQUFNO2lCQUNsQjtnQkFFRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQzthQUNyQjtRQUNMLENBQUM7OztPQUFBO0lBUUQsc0JBQ1cseURBQXFCO1FBUGhDOzs7OztXQUtHOzs7Ozs7OztRQUNIO1lBRUksT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUM7UUFDdkMsQ0FBQztRQUVEOzs7OztXQUtHOzs7Ozs7Ozs7UUFDSCxVQUFpQyxLQUFjO1lBQzNDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLENBQUM7UUFDeEMsQ0FBQzs7O09BVkE7SUFlRCxzQkFDSSw0Q0FBUTtRQUpaOztXQUVHOzs7OztRQUNIO1lBRUksT0FBTyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVELENBQUM7OztPQUFBO0lBS0Qsc0JBQ0ksd0RBQW9CO1FBSnhCOztXQUVHOzs7OztRQUNIO1lBRUksT0FBTyxJQUFJLENBQUMsY0FBYyxLQUFLLGNBQWMsQ0FBQyxJQUFJLENBQUM7UUFDdkQsQ0FBQzs7O09BQUE7SUFLRCxzQkFDSSwrREFBMkI7UUFKL0I7O1dBRUc7Ozs7O1FBQ0g7WUFFSSxPQUFPLElBQUksQ0FBQyxjQUFjLEtBQUssY0FBYyxDQUFDLFdBQVcsQ0FBQztRQUM5RCxDQUFDOzs7T0FBQTtJQUtELHNCQUNJLDJEQUF1QjtRQUozQjs7V0FFRzs7Ozs7UUFDSDtZQUVJLE9BQU8sSUFBSSxDQUFDLGNBQWMsS0FBSyxjQUFjLENBQUMsT0FBTyxDQUFDO1FBQzFELENBQUM7OztPQUFBO0lBaUNELHNCQUFJLDRDQUFRO1FBVlo7Ozs7Ozs7OztXQVNHOzs7Ozs7Ozs7Ozs7UUFDSDtZQUNJLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLENBQUM7OztPQUFBO0lBWUQsc0JBQUksNkNBQVM7UUFWYjs7Ozs7Ozs7O1dBU0c7Ozs7Ozs7Ozs7OztRQUNIO1lBQ0ksT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLGlCQUFpQixDQUFDLElBQUk7Z0JBQ3hDLElBQUksQ0FBQyxLQUFLLEtBQUssaUJBQWlCLENBQUMsR0FBRyxDQUFDO1FBQzdDLENBQUM7OztPQUFBO0lBWUQsc0JBQVcsOENBQVU7UUFWckI7Ozs7Ozs7OztXQVNHOzs7Ozs7Ozs7Ozs7UUFDSDtZQUNJLE9BQVEsSUFBSSxDQUFDLEtBQUssS0FBSyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7UUFDbEQsQ0FBQzs7O09BQUE7SUFZRCxzQkFBSSw2Q0FBUztRQVZiOzs7Ozs7Ozs7V0FTRzs7Ozs7Ozs7Ozs7O1FBQ0g7WUFDSSxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssaUJBQWlCLENBQUMsR0FBRyxDQUFDO1FBQ2hELENBQUM7OztPQUFBO0lBWUQsc0JBQUksZ0RBQVk7UUFWaEI7Ozs7Ozs7OztXQVNHOzs7Ozs7Ozs7Ozs7UUFDSDtZQUNJLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7UUFDbkQsQ0FBQzs7O09BQUE7SUFZRCxzQkFBSSxnREFBWTtRQVZoQjs7Ozs7Ozs7O1dBU0c7Ozs7Ozs7Ozs7OztRQUNIO1lBQ0ksT0FBUSxJQUFJLENBQUMsS0FBSyxLQUFLLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztRQUNwRCxDQUFDOzs7T0FBQTtJQUVELHNCQUFJLDBDQUFNOzs7O1FBQVY7WUFDSSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDeEIsQ0FBQzs7Ozs7UUFFRCxVQUFXLEdBQUc7WUFDVixJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQztRQUN2QixDQUFDOzs7T0FKQTs7Z0JBaFVKLFNBQVMsU0FBQztvQkFDUCxRQUFRLEVBQUUsaUJBQWlCO29CQUMzQiw0dkJBQXlDO29CQUN6QyxTQUFTLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQztpQkFDbkY7Ozs7Z0JBOUJHLFVBQVU7Z0RBOFBMLFFBQVEsWUFBSSxNQUFNLFNBQUMsbUJBQW1COzs7cUJBL00xQyxXQUFXLFNBQUMsU0FBUyxjQUNyQixLQUFLOytCQWNMLFdBQVcsU0FBQyx1QkFBdUI7aUNBTW5DLFdBQVcsU0FBQyxvQ0FBb0M7NkJBTWhELFdBQVcsU0FBQyxpQ0FBaUM7NEJBTTdDLFdBQVcsU0FBQyxnQ0FBZ0M7d0JBTzVDLFdBQVcsU0FBQyw0QkFBNEI7MkJBTXhDLFdBQVcsU0FBQywrQkFBK0I7MkJBTTNDLFdBQVcsU0FBQywrQkFBK0I7MkJBUzNDLFdBQVcsU0FBQyxpQ0FBaUMsY0FDN0MsS0FBSzs2QkFNTCxXQUFXLFNBQUMsOEJBQThCOytCQVExQyxXQUFXLFNBQUMsZ0NBQWdDOzZCQVE1QyxXQUFXLFNBQUMsZ0NBQWdDO3dCQU01QyxlQUFlLFNBQUMsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7d0JBTTVELFlBQVksU0FBQyxpQkFBaUIsRUFBRSxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRTswQkFNM0QsWUFBWSxTQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQzt1QkFjaEMsS0FBSyxTQUFDLE1BQU07d0NBNEJaLEtBQUs7MkJBa0JMLFdBQVcsU0FBQywrQkFBK0I7dUNBUTNDLFdBQVcsU0FBQyw2QkFBNkI7OENBUXpDLFdBQVcsU0FBQyxvQ0FBb0M7MENBUWhELFdBQVcsU0FBQyxnQ0FBZ0M7O0lBc0hqRCw2QkFBQztDQUFBLEFBclVELENBSzRDLGtCQUFrQixHQWdVN0Q7U0FoVVksc0JBQXNCOzs7Ozs7SUFDL0IsdUNBQXVDOzs7OztJQUN2Qyx5Q0FBd0I7Ozs7O0lBQ3hCLHdEQUF1Qzs7Ozs7SUFLdkMseUNBQTJCOzs7Ozs7OztJQVEzQixvQ0FFMkM7Ozs7Ozs7Ozs7Ozs7SUFhM0MsOENBQzJCOzs7OztJQUszQixnREFDOEI7Ozs7O0lBSzlCLDRDQUMwQjs7Ozs7SUFLMUIsMkNBQ3lCOzs7OztJQU16Qix1Q0FDcUI7Ozs7O0lBS3JCLDBDQUN3Qjs7Ozs7SUFLeEIsMENBQ3dCOzs7Ozs7OztJQVF4QiwwQ0FFd0I7Ozs7O0lBcUJ4Qiw0Q0FDMEI7Ozs7OztJQUsxQix1Q0FDNkM7Ozs7OztJQUs3Qyx1Q0FDbUM7Ozs7O0lBNkd2QiwwQ0FBNEI7Ozs7O0lBQ3BDLHdEQUErRjs7Ozs7QUFzR3ZHO0lBQUE7SUFLbUMsQ0FBQzs7Z0JBTG5DLFFBQVEsU0FBQztvQkFDTixZQUFZLEVBQUUsQ0FBQyxzQkFBc0IsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsQ0FBQztvQkFDOUYsT0FBTyxFQUFFLENBQUMsc0JBQXNCLEVBQUcsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUM7b0JBQ2xJLE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxlQUFlLEVBQUUsZUFBZSxDQUFDO2lCQUM1RDs7SUFDa0MsMEJBQUM7Q0FBQSxBQUxwQyxJQUtvQztTQUF2QixtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBFbGVtZW50UmVmLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbnB1dCxcbiAgICBOZ01vZHVsZSxcbiAgICBRdWVyeUxpc3QsXG4gICAgSW5qZWN0LFxuICAgIE9wdGlvbmFsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSWd4SGludERpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvaGludC9oaW50LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hJbnB1dERpcmVjdGl2ZSwgSWd4SW5wdXRTdGF0ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvaW5wdXQvaW5wdXQuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneExhYmVsRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9sYWJlbC9sYWJlbC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4UHJlZml4RGlyZWN0aXZlLCBJZ3hQcmVmaXhNb2R1bGV9IGZyb20gJy4uL2RpcmVjdGl2ZXMvcHJlZml4L3ByZWZpeC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4U3VmZml4RGlyZWN0aXZlLCBJZ3hTdWZmaXhNb2R1bGUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3N1ZmZpeC9zdWZmaXguZGlyZWN0aXZlJztcbmltcG9ydCB7IERpc3BsYXlEZW5zaXR5LCBJRGlzcGxheURlbnNpdHlPcHRpb25zLCBEaXNwbGF5RGVuc2l0eVRva2VuLCBEaXNwbGF5RGVuc2l0eUJhc2UgfSBmcm9tICcuLi9jb3JlL2Rpc3BsYXlEZW5zaXR5JztcbmltcG9ydCB7IElneElucHV0R3JvdXBCYXNlIH0gZnJvbSAnLi9pbnB1dC1ncm91cC5jb21tb24nO1xuXG5sZXQgTkVYVF9JRCA9IDA7XG5cbmVudW0gSWd4SW5wdXRHcm91cFR5cGUge1xuICAgIExJTkUsXG4gICAgQk9YLFxuICAgIEJPUkRFUixcbiAgICBTRUFSQ0hcbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdpZ3gtaW5wdXQtZ3JvdXAnLFxuICAgIHRlbXBsYXRlVXJsOiAnaW5wdXQtZ3JvdXAuY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW3sgcHJvdmlkZTogSWd4SW5wdXRHcm91cEJhc2UsIHVzZUV4aXN0aW5nOiBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50IH1dXG59KVxuZXhwb3J0IGNsYXNzIElneElucHV0R3JvdXBDb21wb25lbnQgZXh0ZW5kcyBEaXNwbGF5RGVuc2l0eUJhc2UgaW1wbGVtZW50cyBJZ3hJbnB1dEdyb3VwQmFzZSB7XG4gICAgcHJpdmF0ZSBfdHlwZSA9IElneElucHV0R3JvdXBUeXBlLkxJTkU7XG4gICAgcHJpdmF0ZSBfZmlsbGVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfc3VwcmVzc0lucHV0QXV0b2ZvY3VzID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBBbiBFbGVtZW50UmVmIHByb3BlcnR5IG9mIHRoZSBgSWd4SW5wdXRHcm91cENvbXBvbmVudGAuXG4gICAgICovXG4gICAgcHVibGljIGVsZW1lbnQ6IEVsZW1lbnRSZWY7XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIHRoZSB2YWx1ZSBvZiBgaWRgIGF0dHJpYnV0ZS4gSWYgbm90IHByb3ZpZGVkIGl0IHdpbGwgYmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtaW5wdXQtZ3JvdXAgW2lkXT1cIidpZ3gtaW5wdXQtZ3JvdXAtNTUnXCI+PC9pZ3gtaW5wdXQtZ3JvdXA+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmlkJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBpZCA9IGBpZ3gtaW5wdXQtZ3JvdXAtJHtORVhUX0lEKyt9YDtcblxuICAgIC8qKlxuICAgICAqIFByb3BlcnR5IHRoYXQgZW5hYmxlcy9kaXNhYmxlcyB0aGUgYXV0b2dlbmVyYXRlZCBjbGFzcyBvZiB0aGUgYElneElucHV0R3JvdXBDb21wb25lbnRgLlxuICAgICAqIEJ5IGRlZmF1bHQgYXBwbGllZCB0aGUgY2xhc3MgaXMgYXBwbGllZC5cbiAgICAgKmBgYHR5cGVzY3JpcHRcbiAgICAgKkBWaWV3Q2hpbGQoXCJNeUlucHV0R3JvdXBcIilcbiAgICAgKnB1YmxpYyBpbnB1dEdyb3VwOiBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50O1xuICAgICAqbmdBZnRlclZpZXdJbml0KCl7XG4gICAgICp0aGlzLmlucHV0R3JvdXAuZGVmYXVsdENsYXNzID0gZmFsc2U7XG4gICAgICpgYGBcbiAgICAgKn1cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cCcpXG4gICAgcHVibGljIGRlZmF1bHRDbGFzcyA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtaW5wdXQtZ3JvdXAtLXBsYWNlaG9sZGVyJylcbiAgICBwdWJsaWMgaGFzUGxhY2Vob2xkZXIgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cC0tcmVxdWlyZWQnKVxuICAgIHB1YmxpYyBpc1JlcXVpcmVkID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtaW5wdXQtZ3JvdXAtLWZvY3VzZWQnKVxuICAgIHB1YmxpYyBpc0ZvY3VzZWQgPSBmYWxzZTtcblxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWlucHV0LWdyb3VwLS1ib3gnKVxuICAgIHB1YmxpYyBpc0JveCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWlucHV0LWdyb3VwLS1ib3JkZXInKVxuICAgIHB1YmxpYyBpc0JvcmRlciA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWlucHV0LWdyb3VwLS1zZWFyY2gnKVxuICAgIHB1YmxpYyBpc1NlYXJjaCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgZGlzYWJsZXMgdGhlIGBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50YC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1pbnB1dC1ncm91cCBbZGlzYWJsZWRdPVwiJ3RydWUnXCI+PC9pZ3gtaW5wdXQtZ3JvdXA+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtaW5wdXQtZ3JvdXAtLWRpc2FibGVkJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWlucHV0LWdyb3VwLS12YWxpZCcpXG4gICAgcHVibGljIGdldCB2YWxpZENsYXNzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnB1dC52YWxpZCA9PT0gSWd4SW5wdXRTdGF0ZS5WQUxJRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtaW5wdXQtZ3JvdXAtLWludmFsaWQnKVxuICAgIHB1YmxpYyBnZXQgaW52YWxpZENsYXNzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnB1dC52YWxpZCA9PT0gSWd4SW5wdXRTdGF0ZS5JTlZBTElEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cC0td2FybmluZycpXG4gICAgcHVibGljIGhhc1dhcm5pbmcgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneEhpbnREaXJlY3RpdmUsIHsgcmVhZDogSWd4SGludERpcmVjdGl2ZSB9KVxuICAgIHByb3RlY3RlZCBoaW50czogUXVlcnlMaXN0PElneEhpbnREaXJlY3RpdmU+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4SW5wdXREaXJlY3RpdmUsIHsgcmVhZDogSWd4SW5wdXREaXJlY3RpdmUgfSlcbiAgICBwcm90ZWN0ZWQgaW5wdXQ6IElneElucHV0RGlyZWN0aXZlO1xuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbkNsaWNrKGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5fc3VwcmVzc0lucHV0QXV0b2ZvY3VzKSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIGhvdyB0aGUgaW5wdXQgd2lsbCBiZSBzdHlsZWQuXG4gICAgICogVGhlIGFsbG93ZWQgdmFsdWVzIGFyZSBgbGluZWAsIGBib3hgLCBgYm9yZGVyYCBhbmQgYHNlYXJjaGAuIFRoZSBkZWZhdWx0IGlzIGBsaW5lYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICo8aWd4LWlucHV0LWdyb3VwIFt0eXBlXT1cIidzZWFyY2gnXCI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KCd0eXBlJylcbiAgICBzZXQgdHlwZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHR5cGU6IElneElucHV0R3JvdXBUeXBlID0gKElneElucHV0R3JvdXBUeXBlIGFzIGFueSlbdmFsdWUudG9VcHBlckNhc2UoKV07XG4gICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaXNCb3ggPSB0aGlzLmlzQm9yZGVyID0gdGhpcy5pc1NlYXJjaCA9IGZhbHNlO1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBJZ3hJbnB1dEdyb3VwVHlwZS5CT1g6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNCb3ggPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIElneElucHV0R3JvdXBUeXBlLkJPUkRFUjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0JvcmRlciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgSWd4SW5wdXRHcm91cFR5cGUuU0VBUkNIOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU2VhcmNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBpbnB1dCBlbGVtZW50IG9mIHRoZSBpbnB1dCBncm91cCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZm9jdXNlZCBvbiBjbGljay5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHN1cHJlc3NJbnB1dEF1dG9mb2N1cyA9IHRoaXMuaW5wdXRHcm91cC5zdXByZXNzSW5wdXRBdXRvZm9jdXM7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHN1cHJlc3NJbnB1dEF1dG9mb2N1cygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1cHJlc3NJbnB1dEF1dG9mb2N1cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIGlucHV0IGVsZW1lbnQgb2YgdGhlIGlucHV0IGdyb3VwIHdpbGwgYmUgYXV0b21hdGljYWxseSBmb2N1c2VkIG9uIGNsaWNrLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWlucHV0LWdyb3VwIFtzdXByZXNzSW5wdXRBdXRvZm9jdXNdPVwidHJ1ZVwiPjwvaWd4LWlucHV0LWdyb3VwPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgc3VwcmVzc0lucHV0QXV0b2ZvY3VzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3N1cHJlc3NJbnB1dEF1dG9mb2N1cyA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWlucHV0LWdyb3VwLS1maWxsZWQnKVxuICAgIGdldCBpc0ZpbGxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbGxlZCB8fCAodGhpcy5pbnB1dCAmJiB0aGlzLmlucHV0LnZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cC0tY29zeScpXG4gICAgZ2V0IGlzRGlzcGxheURlbnNpdHlDb3N5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwbGF5RGVuc2l0eSA9PT0gRGlzcGxheURlbnNpdHkuY29zeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cC0tY29tZm9ydGFibGUnKVxuICAgIGdldCBpc0Rpc3BsYXlEZW5zaXR5Q29tZm9ydGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlEZW5zaXR5ID09PSBEaXNwbGF5RGVuc2l0eS5jb21mb3J0YWJsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cC0tY29tcGFjdCcpXG4gICAgZ2V0IGlzRGlzcGxheURlbnNpdHlDb21wYWN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwbGF5RGVuc2l0eSA9PT0gRGlzcGxheURlbnNpdHkuY29tcGFjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBgSWd4SW5wdXRHcm91cENvbXBvbmVudGAuIEhvdyB0aGUgaW5wdXQgaXMgc3R5bGVkLlxuICAgICAqIFZhbHVlcyBhcmUgYGxpbmVgIC0gMCwgYGJveGAgLSAxLCBgYm9yZGVyYCAtIDIgIGFuZCBgc2VhcmNoYCAtIDMuIFRoZSBkZWZhdWx0IGlzIGBsaW5lYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICpAVmlld0NoaWxkKFwiTXlJbnB1dEdyb3VwXCIpXG4gICAgICpwdWJsaWMgaW5wdXRHcm91cDogSWd4SW5wdXRHcm91cENvbXBvbmVudDtcbiAgICAgKm5nQWZ0ZXJWaWV3SW5pdCgpe1xuICAgICAqICAgIGxldCBpbnB1dFR5cGUgPSB0aGlzLmlucHV0R3JvdXAudHlwZTtcbiAgICAgKn1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgdHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3R5cGUudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9lbGVtZW50OiBFbGVtZW50UmVmLFxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KERpc3BsYXlEZW5zaXR5VG9rZW4pIHByaXZhdGUgX2Rpc3BsYXlEZW5zaXR5T3B0aW9uczogSURpc3BsYXlEZW5zaXR5T3B0aW9ucykge1xuICAgICAgICBzdXBlcihfZGlzcGxheURlbnNpdHlPcHRpb25zKTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gX2VsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBgSWd4SW5wdXRHcm91cENvbXBvbmVudGAgaGFzIGhpbnRzLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKkBWaWV3Q2hpbGQoXCJNeUlucHV0R3JvdXBcIilcbiAgICAgKnB1YmxpYyBpbnB1dEdyb3VwOiBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50O1xuICAgICAqbmdBZnRlclZpZXdJbml0KCl7XG4gICAgICogICAgbGV0IGlucHV0SGludHMgPSB0aGlzLmlucHV0R3JvdXAuaGFzSGludHM7XG4gICAgICp9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IGhhc0hpbnRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oaW50cy5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgYElneElucHV0R3JvdXBDb21wb25lbnRgIGhhcyBib3JkZXIuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqQFZpZXdDaGlsZChcIk15SW5wdXRHcm91cFwiKVxuICAgICAqcHVibGljIGlucHV0R3JvdXA6IElneElucHV0R3JvdXBDb21wb25lbnQ7XG4gICAgICpuZ0FmdGVyVmlld0luaXQoKXtcbiAgICAgKiAgICBsZXQgaW5wdXRCcm9kZXIgPSB0aGlzLmlucHV0R3JvdXAuaGFzQm9yZGVyO1xuICAgICAqfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdldCBoYXNCb3JkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90eXBlID09PSBJZ3hJbnB1dEdyb3VwVHlwZS5MSU5FIHx8XG4gICAgICAgICAgICB0aGlzLl90eXBlID09PSBJZ3hJbnB1dEdyb3VwVHlwZS5CT1g7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBgSWd4SW5wdXRHcm91cENvbXBvbmVudGAgdHlwZSBpcyBsaW5lLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKkBWaWV3Q2hpbGQoXCJNeUlucHV0R3JvdXAxXCIpXG4gICAgICpwdWJsaWMgaW5wdXRHcm91cDogSWd4SW5wdXRHcm91cENvbXBvbmVudDtcbiAgICAgKm5nQWZ0ZXJWaWV3SW5pdCgpe1xuICAgICAqICAgIGxldCBpc1R5cGVMaW5lID0gdGhpcy5pbnB1dEdyb3VwLmlzVHlwZUxpbmU7XG4gICAgICp9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc1R5cGVMaW5lKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIHRoaXMuX3R5cGUgPT09IElneElucHV0R3JvdXBUeXBlLkxJTkU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBgSWd4SW5wdXRHcm91cENvbXBvbmVudGAgdHlwZSBpcyBib3guXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqQFZpZXdDaGlsZChcIk15SW5wdXRHcm91cDFcIilcbiAgICAgKnB1YmxpYyBpbnB1dEdyb3VwOiBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50O1xuICAgICAqbmdBZnRlclZpZXdJbml0KCl7XG4gICAgICogICAgbGV0IGlzVHlwZUJveCA9IHRoaXMuaW5wdXRHcm91cC5pc1R5cGVCb3g7XG4gICAgICp9XG4gICAgICpgYGBcbiAgICAgKi9cbiAgICBnZXQgaXNUeXBlQm94KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHlwZSA9PT0gSWd4SW5wdXRHcm91cFR5cGUuQk9YO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgYElneElucHV0R3JvdXBDb21wb25lbnRgIHR5cGUgaXMgYm9yZGVyLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKkBWaWV3Q2hpbGQoXCJNeUlucHV0R3JvdXAxXCIpXG4gICAgICpwdWJsaWMgaW5wdXRHcm91cDogSWd4SW5wdXRHcm91cENvbXBvbmVudDtcbiAgICAgKm5nQWZ0ZXJWaWV3SW5pdCgpe1xuICAgICAqICAgIGxldCBpc1R5cGVCb3JkZXIgPSB0aGlzLmlucHV0R3JvdXAuaXNUeXBlQm9yZGVyO1xuICAgICAqfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdldCBpc1R5cGVCb3JkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90eXBlID09PSBJZ3hJbnB1dEdyb3VwVHlwZS5CT1JERVI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBgSWd4SW5wdXRHcm91cENvbXBvbmVudGAgdHlwZSBpcyBzZWFyY2guXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqQFZpZXdDaGlsZChcIk15SW5wdXRHcm91cDFcIilcbiAgICAgKnB1YmxpYyBpbnB1dEdyb3VwOiBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50O1xuICAgICAqbmdBZnRlclZpZXdJbml0KCl7XG4gICAgICogICAgbGV0IGlzVHlwZVNlYXJjaCA9IHRoaXMuaW5wdXRHcm91cC5pc1R5cGVTZWFyY2g7XG4gICAgICp9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IGlzVHlwZVNlYXJjaCgpIHtcbiAgICAgICAgcmV0dXJuICB0aGlzLl90eXBlID09PSBJZ3hJbnB1dEdyb3VwVHlwZS5TRUFSQ0g7XG4gICAgfVxuXG4gICAgZ2V0IGZpbGxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbGxlZDtcbiAgICB9XG5cbiAgICBzZXQgZmlsbGVkKHZhbCkge1xuICAgICAgICB0aGlzLl9maWxsZWQgPSB2YWw7XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuQE5nTW9kdWxlKHtcbiAgICBkZWNsYXJhdGlvbnM6IFtJZ3hJbnB1dEdyb3VwQ29tcG9uZW50LCBJZ3hIaW50RGlyZWN0aXZlLCBJZ3hJbnB1dERpcmVjdGl2ZSwgSWd4TGFiZWxEaXJlY3RpdmVdLFxuICAgIGV4cG9ydHM6IFtJZ3hJbnB1dEdyb3VwQ29tcG9uZW50LCAgSWd4SGludERpcmVjdGl2ZSwgSWd4SW5wdXREaXJlY3RpdmUsIElneExhYmVsRGlyZWN0aXZlLCBJZ3hQcmVmaXhEaXJlY3RpdmUsIElneFN1ZmZpeERpcmVjdGl2ZV0sXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgSWd4UHJlZml4TW9kdWxlLCBJZ3hTdWZmaXhNb2R1bGVdXG59KVxuZXhwb3J0IGNsYXNzIElneElucHV0R3JvdXBNb2R1bGUgeyB9XG4iXX0=