UNPKG

@catull/igniteui-angular

Version:

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

546 lines 50 kB
import { __decorate, __extends, __metadata, __param, __values } from "tslib"; import { CommonModule } from '@angular/common'; import { Component, ContentChild, ContentChildren, ElementRef, EventEmitter, forwardRef, HostBinding, Input, NgModule, Output, QueryList, TemplateRef, ViewChild, Optional, Inject, Directive } from '@angular/core'; import { IgxRippleModule } from '../directives/ripple/ripple.directive'; import { IgxListItemComponent } from './list-item.component'; import { IgxListBaseDirective, IgxDataLoadingTemplateDirective, IgxEmptyListTemplateDirective, IgxListItemLeftPanningTemplateDirective, IgxListItemRightPanningTemplateDirective } from './list.common'; import { DisplayDensityToken, DisplayDensity } from '../core/density'; var NEXT_ID = 0; /** * **Ignite UI for Angular List** - * [Documentation](https://www.infragistics.com/products/ignite-ui-angular/angular/components/list.html) * * The Ignite UI List displays rows of items and supports one or more header items as well as search and filtering * of list items. Each list item is completely templateable and will support any valid HTML or Angular component. * * Example: * ```html * <igx-list> * <igx-list-item isHeader="true">Contacts</igx-list-item> * <igx-list-item *ngFor="let contact of contacts"> * <span class="name">{{ contact.name }}</span> * <span class="phone">{{ contact.phone }}</span> * </igx-list-item> * </igx-list> * ``` */ /** * igxListThumbnail is container for the List media * Use it to wrap anything you want to be used as a thumbnail. */ var IgxListThumbnailDirective = /** @class */ (function () { function IgxListThumbnailDirective() { } IgxListThumbnailDirective = __decorate([ Directive({ // tslint:disable-next-line:directive-selector selector: '[igxListThumbnail]' }) ], IgxListThumbnailDirective); return IgxListThumbnailDirective; }()); export { IgxListThumbnailDirective }; /** * igxListAction is container for the List action * Use it to wrap anything you want to be used as a list action: icon, checkbox... */ var IgxListActionDirective = /** @class */ (function () { function IgxListActionDirective() { } IgxListActionDirective = __decorate([ Directive({ // tslint:disable-next-line:directive-selector selector: '[igxListAction]' }) ], IgxListActionDirective); return IgxListActionDirective; }()); export { IgxListActionDirective }; /** * igxListLine is container for the List text content * Use it to wrap anything you want to be used as a plane text. */ var IgxListLineDirective = /** @class */ (function () { function IgxListLineDirective() { } IgxListLineDirective = __decorate([ Directive({ // tslint:disable-next-line:directive-selector selector: '[igxListLine]' }) ], IgxListLineDirective); return IgxListLineDirective; }()); export { IgxListLineDirective }; /** * igxListLineTitle is a directive that add class to the target element * Use it to make anything to look like list Title. */ var IgxListLineTitleDirective = /** @class */ (function () { function IgxListLineTitleDirective() { this.cssClass = 'igx-list__item-line-title'; } __decorate([ HostBinding('class.igx-list__item-line-title'), __metadata("design:type", Object) ], IgxListLineTitleDirective.prototype, "cssClass", void 0); IgxListLineTitleDirective = __decorate([ Directive({ // tslint:disable-next-line:directive-selector selector: '[igxListLineTitle]' }) ], IgxListLineTitleDirective); return IgxListLineTitleDirective; }()); export { IgxListLineTitleDirective }; /** * igxListLineSubTitle is a directive that add class to the target element * Use it to make anything to look like list Subtitle. */ var IgxListLineSubTitleDirective = /** @class */ (function () { function IgxListLineSubTitleDirective() { this.cssClass = 'igx-list__item-line-subtitle'; } __decorate([ HostBinding('class.igx-list__item-line-subtitle'), __metadata("design:type", Object) ], IgxListLineSubTitleDirective.prototype, "cssClass", void 0); IgxListLineSubTitleDirective = __decorate([ Directive({ // tslint:disable-next-line:directive-selector selector: '[igxListLineSubTitle]' }) ], IgxListLineSubTitleDirective); return IgxListLineSubTitleDirective; }()); export { IgxListLineSubTitleDirective }; var IgxListComponent = /** @class */ (function (_super) { __extends(IgxListComponent, _super); function IgxListComponent(element, _displayDensityOptions) { var _this = _super.call(this, _displayDensityOptions) || this; _this.element = element; _this._displayDensityOptions = _displayDensityOptions; /** * Provides a threshold after which the item's panning will be completed automatically. * By default this property is set to 0.5 which is 50% of the list item's width. * ```typescript * this.list.panEndTriggeringThreshold = 0.8; * ``` */ _this.panEndTriggeringThreshold = 0.5; /** * Sets/gets the `id` of the list. * If not set, the `id` of the first list component will be `"igx-list-0"`. * ```html * <igx-list id = "my-first-list"></igx-list> * ``` * ```typescript * let listId = this.list.id; * ``` * @memberof IgxListComponent */ _this.id = "igx-list-" + NEXT_ID++; /** * Sets/gets whether the left panning of an item is allowed. * Default value is `false`. * ```html * <igx-list [allowLeftPanning] = "true"></igx-list> * ``` * ```typescript * let isLeftPanningAllowed = this.list.allowLeftPanning; * ``` * @memberof IgxListComponent */ _this.allowLeftPanning = false; /** * Sets/gets whether the right panning of an item is allowed. * Default value is `false`. * ```html * <igx-list [allowRightPanning] = "true"></igx-list> * ``` * ```typescript * let isRightPanningAllowed = this.list.allowRightPanning; * ``` * @memberof IgxListComponent */ _this.allowRightPanning = false; /** * Sets/gets whether the list is currently loading data. * Set it to display the dataLoadingTemplate while data is being retrieved. * Default value is `false`. * ```html * <igx-list [isLoading]="true"></igx-list> * ``` * ```typescript * let isLoading = this.list.isLoading; * ``` * @memberof IgxListComponent */ _this.isLoading = false; /** * Emits an event within the current list when left pan gesture is executed on a list item. * Provides a reference to an object of type `IListItemPanningEventArgs` as an event argument. * ```html * <igx-list [allowLeftPanning]="true" (onLeftPan)="onLeftPan($event)"></igx-list> * ``` * @memberof IgxListComponent */ _this.onLeftPan = new EventEmitter(); /** * Emits an event within the current list when right pan gesture is executed on a list item. * Provides a reference to an object of type `IListItemPanningEventArgs` as an event argument. * ```html * <igx-list [allowRightPanning]="true" (onRightPan)="onRightPan($event)"></igx-list> * ``` * @memberof IgxListComponent */ _this.onRightPan = new EventEmitter(); /** * Emits an event within the current list when pan gesture is executed on list item. * Provides references to the `IgxListItemComponent` and `IgxListPanState` as event arguments. * ```html * <igx-list (onPanStateChange) = "onPanStateChange($event)"></igx-list> * ``` * @memberof IgxListComponent */ _this.onPanStateChange = new EventEmitter(); /** * Emits an event within the current list when a list item has been clicked. * Provides references to the `IgxListItemComponent` and `Event` as event arguments. * ```html * <igx-list (onItemClicked) = "onItemClicked($event)"></igx-list> * ``` * @memberof IgxListComponent */ _this.onItemClicked = new EventEmitter(); return _this; } IgxListComponent_1 = IgxListComponent; Object.defineProperty(IgxListComponent.prototype, "sortedChildren", { /** * @hidden * @internal */ get: function () { if (this.children !== undefined) { return this.children.toArray() .sort(function (a, b) { return a.index - b.index; }); } return null; }, enumerable: true, configurable: true }); Object.defineProperty(IgxListComponent.prototype, "role", { /** * Gets the `role` attribute. * ```typescript * let listRole = this.list.role; * ``` * @memberof IgxListComponent */ get: function () { return 'list'; }, enumerable: true, configurable: true }); Object.defineProperty(IgxListComponent.prototype, "isListEmpty", { /** * Returns boolean indicating if the list is empty. * ```typescript * let isEmpty = this.list.isListEmpty; * ``` * @memberof IgxListComponent */ get: function () { return !this.children || this.children.length === 0; }, enumerable: true, configurable: true }); Object.defineProperty(IgxListComponent.prototype, "cssClass", { /** * @hidden */ get: function () { return !this.isListEmpty && this.displayDensity === DisplayDensity.comfortable; }, enumerable: true, configurable: true }); Object.defineProperty(IgxListComponent.prototype, "cssClassCompact", { /** * @hidden */ get: function () { return !this.isListEmpty && this.displayDensity === DisplayDensity.compact; }, enumerable: true, configurable: true }); Object.defineProperty(IgxListComponent.prototype, "cssClassCosy", { /** * @hidden */ get: function () { return !this.isListEmpty && this.displayDensity === DisplayDensity.cosy; }, enumerable: true, configurable: true }); Object.defineProperty(IgxListComponent.prototype, "items", { /** * Returns the `items` in the list excluding the headers. * ```typescript * let listItems: IgxListItemComponent[] = this.list.items; * ``` * @memberof IgxListComponent */ get: function () { var e_1, _a; var items = []; if (this.children !== undefined) { try { for (var _b = __values(this.sortedChildren), _c = _b.next(); !_c.done; _c = _b.next()) { var child = _c.value; if (!child.isHeader) { items.push(child); } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_1) throw e_1.error; } } } return items; }, enumerable: true, configurable: true }); Object.defineProperty(IgxListComponent.prototype, "headers", { /** * Returns the headers in the list. * ```typescript * let listHeaders: IgxListItemComponent[] = this.list.headers; * ``` * @memberof IgxListComponent */ get: function () { var e_2, _a; var headers = []; if (this.children !== undefined) { try { for (var _b = __values(this.children.toArray()), _c = _b.next(); !_c.done; _c = _b.next()) { var child = _c.value; if (child.isHeader) { headers.push(child); } } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_2) throw e_2.error; } } } return headers; }, enumerable: true, configurable: true }); Object.defineProperty(IgxListComponent.prototype, "context", { /** * Returns the `context` object which represents the `template context` binding into the `list container` * by providing the `$implicit` declaration which is the `IgxListComponent` itself. * ```typescript * let listComponent = this.list.context; * ``` */ get: function () { return { $implicit: this }; }, enumerable: true, configurable: true }); Object.defineProperty(IgxListComponent.prototype, "template", { /** * Returns the `template` of an empty list. * ```typescript * let listTemplate = this.list.template; * ``` * @memberof IgxListComponent */ get: function () { if (this.isLoading) { return this.dataLoadingTemplate ? this.dataLoadingTemplate.template : this.defaultDataLoadingTemplate; } else { return this.emptyListTemplate ? this.emptyListTemplate.template : this.defaultEmptyListTemplate; } }, enumerable: true, configurable: true }); var IgxListComponent_1; IgxListComponent.ctorParameters = function () { return [ { type: ElementRef }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DisplayDensityToken,] }] } ]; }; __decorate([ ContentChildren(forwardRef(function () { return IgxListItemComponent; }), { descendants: true }), __metadata("design:type", QueryList) ], IgxListComponent.prototype, "children", void 0); __decorate([ ContentChild(IgxEmptyListTemplateDirective, { read: IgxEmptyListTemplateDirective }), __metadata("design:type", IgxEmptyListTemplateDirective) ], IgxListComponent.prototype, "emptyListTemplate", void 0); __decorate([ ContentChild(IgxDataLoadingTemplateDirective, { read: IgxDataLoadingTemplateDirective }), __metadata("design:type", IgxDataLoadingTemplateDirective) ], IgxListComponent.prototype, "dataLoadingTemplate", void 0); __decorate([ ContentChild(IgxListItemLeftPanningTemplateDirective, { read: IgxListItemLeftPanningTemplateDirective }), __metadata("design:type", IgxListItemLeftPanningTemplateDirective) ], IgxListComponent.prototype, "listItemLeftPanningTemplate", void 0); __decorate([ ContentChild(IgxListItemRightPanningTemplateDirective, { read: IgxListItemRightPanningTemplateDirective }), __metadata("design:type", IgxListItemRightPanningTemplateDirective) ], IgxListComponent.prototype, "listItemRightPanningTemplate", void 0); __decorate([ Input(), __metadata("design:type", Object) ], IgxListComponent.prototype, "panEndTriggeringThreshold", void 0); __decorate([ ViewChild('defaultEmptyList', { read: TemplateRef, static: true }), __metadata("design:type", TemplateRef) ], IgxListComponent.prototype, "defaultEmptyListTemplate", void 0); __decorate([ ViewChild('defaultDataLoading', { read: TemplateRef, static: true }), __metadata("design:type", TemplateRef) ], IgxListComponent.prototype, "defaultDataLoadingTemplate", void 0); __decorate([ HostBinding('attr.id'), Input(), __metadata("design:type", Object) ], IgxListComponent.prototype, "id", void 0); __decorate([ Input(), __metadata("design:type", Object) ], IgxListComponent.prototype, "allowLeftPanning", void 0); __decorate([ Input(), __metadata("design:type", Object) ], IgxListComponent.prototype, "allowRightPanning", void 0); __decorate([ Input(), __metadata("design:type", Object) ], IgxListComponent.prototype, "isLoading", void 0); __decorate([ Output(), __metadata("design:type", Object) ], IgxListComponent.prototype, "onLeftPan", void 0); __decorate([ Output(), __metadata("design:type", Object) ], IgxListComponent.prototype, "onRightPan", void 0); __decorate([ Output(), __metadata("design:type", Object) ], IgxListComponent.prototype, "onPanStateChange", void 0); __decorate([ Output(), __metadata("design:type", Object) ], IgxListComponent.prototype, "onItemClicked", void 0); __decorate([ HostBinding('attr.role'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], IgxListComponent.prototype, "role", null); __decorate([ HostBinding('class.igx-list-empty'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxListComponent.prototype, "isListEmpty", null); __decorate([ HostBinding('class.igx-list'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxListComponent.prototype, "cssClass", null); __decorate([ HostBinding('class.igx-list--compact'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxListComponent.prototype, "cssClassCompact", null); __decorate([ HostBinding('class.igx-list--cosy'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxListComponent.prototype, "cssClassCosy", null); IgxListComponent = IgxListComponent_1 = __decorate([ Component({ selector: 'igx-list', template: "<ng-content></ng-content>\n\n<ng-template #defaultEmptyList>\n <article class=\"message\">\n There are no items in the list.\n </article>\n</ng-template>\n\n<ng-template #defaultDataLoading>\n <article class=\"message\">\n Loading data from the server...\n </article>\n</ng-template>\n\n<ng-container *ngIf=\"!children || children.length === 0 || isLoading\">\n <ng-container *ngTemplateOutlet=\"template; context: context\">\n </ng-container>\n</ng-container>\n", providers: [{ provide: IgxListBaseDirective, useExisting: IgxListComponent_1 }] }), __param(1, Optional()), __param(1, Inject(DisplayDensityToken)), __metadata("design:paramtypes", [ElementRef, Object]) ], IgxListComponent); return IgxListComponent; }(IgxListBaseDirective)); export { IgxListComponent }; /** * @hidden */ var IgxListModule = /** @class */ (function () { function IgxListModule() { } IgxListModule = __decorate([ NgModule({ declarations: [ IgxListBaseDirective, IgxListComponent, IgxListItemComponent, IgxListThumbnailDirective, IgxListActionDirective, IgxListLineDirective, IgxListLineTitleDirective, IgxListLineSubTitleDirective, IgxDataLoadingTemplateDirective, IgxEmptyListTemplateDirective, IgxListItemLeftPanningTemplateDirective, IgxListItemRightPanningTemplateDirective ], exports: [ IgxListComponent, IgxListItemComponent, IgxListThumbnailDirective, IgxListActionDirective, IgxListLineDirective, IgxListLineTitleDirective, IgxListLineSubTitleDirective, IgxDataLoadingTemplateDirective, IgxEmptyListTemplateDirective, IgxListItemLeftPanningTemplateDirective, IgxListItemRightPanningTemplateDirective ], imports: [ CommonModule, IgxRippleModule ] }) ], IgxListModule); return IgxListModule; }()); export { IgxListModule }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9pZ25pdGV1aS1hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2xpc3QvbGlzdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0gsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLEtBQUssRUFDTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDVCxXQUFXLEVBQ1gsU0FBUyxFQUNULFFBQVEsRUFDUixNQUFNLEVBQUUsU0FBUyxFQUNwQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFeEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0QsT0FBTyxFQUNILG9CQUFvQixFQUNwQiwrQkFBK0IsRUFDL0IsNkJBQTZCLEVBRTdCLHVDQUF1QyxFQUN2Qyx3Q0FBd0MsRUFDM0MsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUEwQixtQkFBbUIsRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUc5RixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFtQmhCOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUVIOzs7R0FHRztBQU1IO0lBQUE7SUFBd0MsQ0FBQztJQUE1Qix5QkFBeUI7UUFMckMsU0FBUyxDQUFDO1lBQ1AsOENBQThDO1lBQzlDLFFBQVEsRUFBRSxvQkFBb0I7U0FDakMsQ0FBQztPQUVXLHlCQUF5QixDQUFHO0lBQUQsZ0NBQUM7Q0FBQSxBQUF6QyxJQUF5QztTQUE1Qix5QkFBeUI7QUFFdEM7OztHQUdHO0FBTUg7SUFBQTtJQUFxQyxDQUFDO0lBQXpCLHNCQUFzQjtRQUxsQyxTQUFT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QGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZCxcbiAgICBDb250ZW50Q2hpbGRyZW4sXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgZm9yd2FyZFJlZixcbiAgICBIb3N0QmluZGluZyxcbiAgICBJbnB1dCxcbiAgICBOZ01vZHVsZSxcbiAgICBPdXRwdXQsXG4gICAgUXVlcnlMaXN0LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBPcHRpb25hbCxcbiAgICBJbmplY3QsIERpcmVjdGl2ZVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgSWd4UmlwcGxlTW9kdWxlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9yaXBwbGUvcmlwcGxlLmRpcmVjdGl2ZSc7XG5cbmltcG9ydCB7IElneExpc3RJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9saXN0LWl0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7XG4gICAgSWd4TGlzdEJhc2VEaXJlY3RpdmUsXG4gICAgSWd4RGF0YUxvYWRpbmdUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBJZ3hFbXB0eUxpc3RUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBJZ3hMaXN0UGFuU3RhdGUsXG4gICAgSWd4TGlzdEl0ZW1MZWZ0UGFubmluZ1RlbXBsYXRlRGlyZWN0aXZlLFxuICAgIElneExpc3RJdGVtUmlnaHRQYW5uaW5nVGVtcGxhdGVEaXJlY3RpdmVcbn0gZnJvbSAnLi9saXN0LmNvbW1vbic7XG5pbXBvcnQgeyBJRGlzcGxheURlbnNpdHlPcHRpb25zLCBEaXNwbGF5RGVuc2l0eVRva2VuLCBEaXNwbGF5RGVuc2l0eSB9IGZyb20gJy4uL2NvcmUvZGVuc2l0eSc7XG5pbXBvcnQgeyBJQmFzZUV2ZW50QXJncyB9IGZyb20gJy4uL2NvcmUvdXRpbHMnO1xuXG5sZXQgTkVYVF9JRCA9IDA7XG5leHBvcnQgaW50ZXJmYWNlIElQYW5TdGF0ZUNoYW5nZUV2ZW50QXJncyBleHRlbmRzIElCYXNlRXZlbnRBcmdzIHtcbiAgICBvbGRTdGF0ZTogSWd4TGlzdFBhblN0YXRlO1xuICAgIG5ld1N0YXRlOiBJZ3hMaXN0UGFuU3RhdGU7XG4gICAgaXRlbTogSWd4TGlzdEl0ZW1Db21wb25lbnQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxpc3RJdGVtQ2xpY2tFdmVudEFyZ3MgZXh0ZW5kcyBJQmFzZUV2ZW50QXJncyB7XG4gICAgaXRlbTogSWd4TGlzdEl0ZW1Db21wb25lbnQ7XG4gICAgZXZlbnQ6IEV2ZW50O1xuICAgIGRpcmVjdGlvbjogSWd4TGlzdFBhblN0YXRlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElMaXN0SXRlbVBhbm5pbmdFdmVudEFyZ3MgZXh0ZW5kcyBJQmFzZUV2ZW50QXJncyB7XG4gICAgaXRlbTogSWd4TGlzdEl0ZW1Db21wb25lbnQ7XG4gICAgZGlyZWN0aW9uOiBJZ3hMaXN0UGFuU3RhdGU7XG4gICAga2VlcEl0ZW06IGJvb2xlYW47XG59XG5cbi8qKlxuICogKipJZ25pdGUgVUkgZm9yIEFuZ3VsYXIgTGlzdCoqIC1cbiAqIFtEb2N1bWVudGF0aW9uXShodHRwczovL3d3dy5pbmZyYWdpc3RpY3MuY29tL3Byb2R1Y3RzL2lnbml0ZS11aS1hbmd1bGFyL2FuZ3VsYXIvY29tcG9uZW50cy9saXN0Lmh0bWwpXG4gKlxuICogVGhlIElnbml0ZSBVSSBMaXN0IGRpc3BsYXlzIHJvd3Mgb2YgaXRlbXMgYW5kIHN1cHBvcnRzIG9uZSBvciBtb3JlIGhlYWRlciBpdGVtcyBhcyB3ZWxsIGFzIHNlYXJjaCBhbmQgZmlsdGVyaW5nXG4gKiBvZiBsaXN0IGl0ZW1zLiBFYWNoIGxpc3QgaXRlbSBpcyBjb21wbGV0ZWx5IHRlbXBsYXRlYWJsZSBhbmQgd2lsbCBzdXBwb3J0IGFueSB2YWxpZCBIVE1MIG9yIEFuZ3VsYXIgY29tcG9uZW50LlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGBodG1sXG4gKiA8aWd4LWxpc3Q+XG4gKiAgIDxpZ3gtbGlzdC1pdGVtIGlzSGVhZGVyPVwidHJ1ZVwiPkNvbnRhY3RzPC9pZ3gtbGlzdC1pdGVtPlxuICogICA8aWd4LWxpc3QtaXRlbSAqbmdGb3I9XCJsZXQgY29udGFjdCBvZiBjb250YWN0c1wiPlxuICogICAgIDxzcGFuIGNsYXNzPVwibmFtZVwiPnt7IGNvbnRhY3QubmFtZSB9fTwvc3Bhbj5cbiAqICAgICA8c3BhbiBjbGFzcz1cInBob25lXCI+e3sgY29udGFjdC5waG9uZSB9fTwvc3Bhbj5cbiAqICAgPC9pZ3gtbGlzdC1pdGVtPlxuICogPC9pZ3gtbGlzdD5cbiAqIGBgYFxuICovXG5cbi8qKlxuICogaWd4TGlzdFRodW1ibmFpbCBpcyBjb250YWluZXIgZm9yIHRoZSBMaXN0IG1lZGlhXG4gKiBVc2UgaXQgdG8gd3JhcCBhbnl0aGluZyB5b3Ugd2FudCB0byBiZSB1c2VkIGFzIGEgdGh1bWJuYWlsLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLXNlbGVjdG9yXG4gICAgc2VsZWN0b3I6ICdbaWd4TGlzdFRodW1ibmFpbF0nXG59KVxuXG5leHBvcnQgY2xhc3MgSWd4TGlzdFRodW1ibmFpbERpcmVjdGl2ZSB7fVxuXG4vKipcbiAqIGlneExpc3RBY3Rpb24gaXMgY29udGFpbmVyIGZvciB0aGUgTGlzdCBhY3Rpb25cbiAqIFVzZSBpdCB0byB3cmFwIGFueXRoaW5nIHlvdSB3YW50IHRvIGJlIHVzZWQgYXMgYSBsaXN0IGFjdGlvbjogaWNvbiwgY2hlY2tib3guLi5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxuICAgIHNlbGVjdG9yOiAnW2lneExpc3RBY3Rpb25dJ1xufSlcblxuZXhwb3J0IGNsYXNzIElneExpc3RBY3Rpb25EaXJlY3RpdmUge31cblxuLyoqXG4gKiBpZ3hMaXN0TGluZSBpcyBjb250YWluZXIgZm9yIHRoZSBMaXN0IHRleHQgY29udGVudFxuICogVXNlIGl0IHRvIHdyYXAgYW55dGhpbmcgeW91IHdhbnQgdG8gYmUgdXNlZCBhcyBhIHBsYW5lIHRleHQuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtc2VsZWN0b3JcbiAgICBzZWxlY3RvcjogJ1tpZ3hMaXN0TGluZV0nXG59KVxuXG5leHBvcnQgY2xhc3MgSWd4TGlzdExpbmVEaXJlY3RpdmUge31cblxuLyoqXG4gKiBpZ3hMaXN0TGluZVRpdGxlIGlzIGEgZGlyZWN0aXZlIHRoYXQgYWRkIGNsYXNzIHRvIHRoZSB0YXJnZXQgZWxlbWVudFxuICogVXNlIGl0IHRvIG1ha2UgYW55dGhpbmcgdG8gbG9vayBsaWtlIGxpc3QgVGl0bGUuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtc2VsZWN0b3JcbiAgICBzZWxlY3RvcjogJ1tpZ3hMaXN0TGluZVRpdGxlXSdcbn0pXG5cbmV4cG9ydCBjbGFzcyBJZ3hMaXN0TGluZVRpdGxlRGlyZWN0aXZlIHtcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1saXN0X19pdGVtLWxpbmUtdGl0bGUnKVxuICAgIHB1YmxpYyBjc3NDbGFzcyA9ICdpZ3gtbGlzdF9faXRlbS1saW5lLXRpdGxlJztcbn1cblxuLyoqXG4gKiBpZ3hMaXN0TGluZVN1YlRpdGxlIGlzIGEgZGlyZWN0aXZlIHRoYXQgYWRkIGNsYXNzIHRvIHRoZSB0YXJnZXQgZWxlbWVudFxuICogVXNlIGl0IHRvIG1ha2UgYW55dGhpbmcgdG8gbG9vayBsaWtlIGxpc3QgU3VidGl0bGUuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtc2VsZWN0b3JcbiAgICBzZWxlY3RvcjogJ1tpZ3hMaXN0TGluZVN1YlRpdGxlXSdcbn0pXG5cbmV4cG9ydCBjbGFzcyBJZ3hMaXN0TGluZVN1YlRpdGxlRGlyZWN0aXZlIHtcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1saXN0X19pdGVtLWxpbmUtc3VidGl0bGUnKVxuICAgIHB1YmxpYyBjc3NDbGFzcyA9ICdpZ3gtbGlzdF9faXRlbS1saW5lLXN1YnRpdGxlJztcbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdpZ3gtbGlzdCcsXG4gICAgdGVtcGxhdGVVcmw6ICdsaXN0LmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IElneExpc3RCYXNlRGlyZWN0aXZlLCB1c2VFeGlzdGluZzogSWd4TGlzdENvbXBvbmVudCB9XVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hMaXN0Q29tcG9uZW50IGV4dGVuZHMgSWd4TGlzdEJhc2VEaXJlY3RpdmUge1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGVsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRGlzcGxheURlbnNpdHlUb2tlbikgcHJvdGVjdGVkIF9kaXNwbGF5RGVuc2l0eU9wdGlvbnM6IElEaXNwbGF5RGVuc2l0eU9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoX2Rpc3BsYXlEZW5zaXR5T3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgYWxsIGl0ZW1zIGFuZCBoZWFkZXJzIGluIHRoZSBsaXN0LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbGlzdENoaWxkcmVuOiBRdWVyeUxpc3QgPSB0aGlzLmxpc3QuY2hpbGRyZW47XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneExpc3RDb21wb25lbnRcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKGZvcndhcmRSZWYoKCkgPT4gSWd4TGlzdEl0ZW1Db21wb25lbnQpLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gICAgcHVibGljIGNoaWxkcmVuOiBRdWVyeUxpc3Q8SWd4TGlzdEl0ZW1Db21wb25lbnQ+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXQgc29ydGVkQ2hpbGRyZW4oKTogSWd4TGlzdEl0ZW1Db21wb25lbnRbXSB7XG4gICAgICAgIGlmICh0aGlzLmNoaWxkcmVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLnRvQXJyYXkoKVxuICAgICAgICAgICAgICAgIC5zb3J0KChhOiBJZ3hMaXN0SXRlbUNvbXBvbmVudCwgYjogSWd4TGlzdEl0ZW1Db21wb25lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuaW5kZXggLSBiLmluZGV4O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHRlbXBsYXRlIHdoaWNoIHdpbGwgYmUgdXNlZCBieSB0aGUgSWd4TGlzdCBpbiBjYXNlIHRoZXJlIGFyZSBubyBsaXN0IGl0ZW1zIGRlZmluZWQgYW5kIGBpc0xvYWRpbmdgIGlzIHNldCB0byBgZmFsc2VgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgZW1wdHlUZW1wbGF0ZSA9IHRoaXMubGlzdC5lbXB0eUxpc3RUZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4TGlzdENvbXBvbmVudFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4RW1wdHlMaXN0VGVtcGxhdGVEaXJlY3RpdmUsIHsgcmVhZDogSWd4RW1wdHlMaXN0VGVtcGxhdGVEaXJlY3RpdmUgfSlcbiAgICBwdWJsaWMgZW1wdHlMaXN0VGVtcGxhdGU6IElneEVtcHR5TGlzdFRlbXBsYXRlRGlyZWN0aXZlO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdGVtcGxhdGUgd2hpY2ggd2lsbCBiZSB1c2VkIGJ5IHRoZSBJZ3hMaXN0IGluIGNhc2UgdGhlcmUgYXJlIG5vIGxpc3QgaXRlbXMgZGVmaW5lZCBhbmQgYGlzTG9hZGluZ2AgaXMgc2V0IHRvIGB0cnVlYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGxvYWRpbmdUZW1wbGF0ZSA9IHRoaXMubGlzdC5kYXRhTG9hZGluZ1RlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hMaXN0Q29tcG9uZW50XG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hEYXRhTG9hZGluZ1RlbXBsYXRlRGlyZWN0aXZlLCB7IHJlYWQ6IElneERhdGFMb2FkaW5nVGVtcGxhdGVEaXJlY3RpdmUgfSlcbiAgICBwdWJsaWMgZGF0YUxvYWRpbmdUZW1wbGF0ZTogSWd4RGF0YUxvYWRpbmdUZW1wbGF0ZURpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgdGVtcGxhdGUgc2hvd24gd2hlbiBsZWZ0IHBhbm5pbmcgYSBsaXN0IGl0ZW0uXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgbnVsbGAuXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LWxpc3QgW2FsbG93TGVmdFBhbm5pbmddID0gXCJ0cnVlXCI+PC9pZ3gtbGlzdD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGl0ZW1MZWZ0UGFuVG1wbCA9IHRoaXMubGlzdC5saXN0SXRlbUxlZnRQYW5uaW5nVGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneExpc3RDb21wb25lbnRcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneExpc3RJdGVtTGVmdFBhbm5pbmdUZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBJZ3hMaXN0SXRlbUxlZnRQYW5uaW5nVGVtcGxhdGVEaXJlY3RpdmUgfSlcbiAgICBwdWJsaWMgbGlzdEl0ZW1MZWZ0UGFubmluZ1RlbXBsYXRlOiBJZ3hMaXN0SXRlbUxlZnRQYW5uaW5nVGVtcGxhdGVEaXJlY3RpdmU7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIHRlbXBsYXRlIHNob3duIHdoZW4gcmlnaHQgcGFubmluZyBhIGxpc3QgaXRlbS5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGBudWxsYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogIDxpZ3gtbGlzdCBbYWxsb3dMZWZ0UGFubmluZ10gPSBcInRydWVcIj48L2lneC1saXN0PlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXRlbVJpZ2h0UGFuVG1wbCA9IHRoaXMubGlzdC5saXN0SXRlbVJpZ2h0UGFubmluZ1RlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hMaXN0Q29tcG9uZW50XG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hMaXN0SXRlbVJpZ2h0UGFubmluZ1RlbXBsYXRlRGlyZWN0aXZlLCB7IHJlYWQ6IElneExpc3RJdGVtUmlnaHRQYW5uaW5nVGVtcGxhdGVEaXJlY3RpdmUgfSlcbiAgICBwdWJsaWMgbGlzdEl0ZW1SaWdodFBhbm5pbmdUZW1wbGF0ZTogSWd4TGlzdEl0ZW1SaWdodFBhbm5pbmdUZW1wbGF0ZURpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIFByb3ZpZGVzIGEgdGhyZXNob2xkIGFmdGVyIHdoaWNoIHRoZSBpdGVtJ3MgcGFubmluZyB3aWxsIGJlIGNvbXBsZXRlZCBhdXRvbWF0aWNhbGx5LlxuICAgICAqIEJ5IGRlZmF1bHQgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdG8gMC41IHdoaWNoIGlzIDUwJSBvZiB0aGUgbGlzdCBpdGVtJ3Mgd2lkdGguXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMubGlzdC5wYW5FbmRUcmlnZ2VyaW5nVGhyZXNob2xkID0gMC44O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHBhbkVuZFRyaWdnZXJpbmdUaHJlc2hvbGQgPSAwLjU7XG5cbiAgICAvKipAaGlkZGVuKi9cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0RW1wdHlMaXN0JywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIGRlZmF1bHRFbXB0eUxpc3RUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKkBoaWRkZW4qL1xuICAgIEBWaWV3Q2hpbGQoJ2RlZmF1bHREYXRhTG9hZGluZycsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBkZWZhdWx0RGF0YUxvYWRpbmdUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgYGlkYCBvZiB0aGUgbGlzdC5cbiAgICAgKiBJZiBub3Qgc2V0LCB0aGUgYGlkYCBvZiB0aGUgZmlyc3QgbGlzdCBjb21wb25lbnQgd2lsbCBiZSBgXCJpZ3gtbGlzdC0wXCJgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWxpc3QgaWQgPSBcIm15LWZpcnN0LWxpc3RcIj48L2lneC1saXN0PlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbGlzdElkID0gIHRoaXMubGlzdC5pZDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4TGlzdENvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaWQgPSBgaWd4LWxpc3QtJHtORVhUX0lEKyt9YDtcblxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB3aGV0aGVyIHRoZSBsZWZ0IHBhbm5pbmcgb2YgYW4gaXRlbSBpcyBhbGxvd2VkLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogIDxpZ3gtbGlzdCBbYWxsb3dMZWZ0UGFubmluZ10gPSBcInRydWVcIj48L2lneC1saXN0PlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNMZWZ0UGFubmluZ0FsbG93ZWQgPSB0aGlzLmxpc3QuYWxsb3dMZWZ0UGFubmluZztcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4TGlzdENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGFsbG93TGVmdFBhbm5pbmcgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB3aGV0aGVyIHRoZSByaWdodCBwYW5uaW5nIG9mIGFuIGl0ZW0gaXMgYWxsb3dlZC5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LWxpc3QgW2FsbG93UmlnaHRQYW5uaW5nXSA9IFwidHJ1ZVwiPjwvaWd4LWxpc3Q+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc1JpZ2h0UGFubmluZ0FsbG93ZWQgPSB0aGlzLmxpc3QuYWxsb3dSaWdodFBhbm5pbmc7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneExpc3RDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBhbGxvd1JpZ2h0UGFubmluZyA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHdoZXRoZXIgdGhlIGxpc3QgaXMgY3VycmVudGx5IGxvYWRpbmcgZGF0YS5cbiAgICAgKiBTZXQgaXQgdG8gZGlzcGxheSB0aGUgZGF0YUxvYWRpbmdUZW1wbGF0ZSB3aGlsZSBkYXRhIGlzIGJlaW5nIHJldHJpZXZlZC5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LWxpc3QgW2lzTG9hZGluZ109XCJ0cnVlXCI+PC9pZ3gtbGlzdD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzTG9hZGluZyA9IHRoaXMubGlzdC5pc0xvYWRpbmc7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneExpc3RDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBpc0xvYWRpbmcgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGFuIGV2ZW50IHdpdGhpbiB0aGUgY3VycmVudCBsaXN0IHdoZW4gbGVmdCBwYW4gZ2VzdHVyZSBpcyBleGVjdXRlZCBvbiBhIGxpc3QgaXRlbS5cbiAgICAgKiBQcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhbiBvYmplY3Qgb2YgdHlwZSBgSUxpc3RJdGVtUGFubmluZ0V2ZW50QXJnc2AgYXMgYW4gZXZlbnQgYXJndW1lbnQuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtbGlzdCBbYWxsb3dMZWZ0UGFubmluZ109XCJ0cnVlXCIgKG9uTGVmdFBhbik9XCJvbkxlZnRQYW4oJGV2ZW50KVwiPjwvaWd4LWxpc3Q+XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneExpc3RDb21wb25lbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25MZWZ0UGFuID0gbmV3IEV2ZW50RW1pdHRlcjxJTGlzdEl0ZW1QYW5uaW5nRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHMgYW4gZXZlbnQgd2l0aGluIHRoZSBjdXJyZW50IGxpc3Qgd2hlbiByaWdodCBwYW4gZ2VzdHVyZSBpcyBleGVjdXRlZCBvbiBhIGxpc3QgaXRlbS5cbiAgICAgKiBQcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhbiBvYmplY3Qgb2YgdHlwZSBgSUxpc3RJdGVtUGFubmluZ0V2ZW50QXJnc2AgYXMgYW4gZXZlbnQgYXJndW1lbnQuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtbGlzdCBbYWxsb3dSaWdodFBhbm5pbmddPVwidHJ1ZVwiIChvblJpZ2h0UGFuKT1cIm9uUmlnaHRQYW4oJGV2ZW50KVwiPjwvaWd4LWxpc3Q+XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneExpc3RDb21wb25lbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25SaWdodFBhbiA9IG5ldyBFdmVudEVtaXR0ZXI8SUxpc3RJdGVtUGFubmluZ0V2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICogRW1pdHMgYW4gZXZlbnQgd2l0aGluIHRoZSBjdXJyZW50IGxpc3Qgd2hlbiBwYW4gZ2VzdHVyZSBpcyBleGVjdXRlZCBvbiBsaXN0IGl0ZW0uXG4gICAgKiBQcm92aWRlcyByZWZlcmVuY2VzIHRvIHRoZSBgSWd4TGlzdEl0ZW1Db21wb25lbnRgIGFuZCBgSWd4TGlzdFBhblN0YXRlYCBhcyBldmVudCBhcmd1bWVudHMuXG4gICAgKiBgYGBodG1sXG4gICAgKiA8aWd4LWxpc3QgKG9uUGFuU3RhdGVDaGFuZ2UpID0gXCJvblBhblN0YXRlQ2hhbmdlKCRldmVudClcIj48L2lneC1saXN0PlxuICAgICogYGBgXG4gICAgKiBAbWVtYmVyb2YgSWd4TGlzdENvbXBvbmVudFxuICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uUGFuU3RhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPElQYW5TdGF0ZUNoYW5nZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGFuIGV2ZW50IHdpdGhpbiB0aGUgY3VycmVudCBsaXN0IHdoZW4gYSBsaXN0IGl0ZW0gaGFzIGJlZW4gY2xpY2tlZC5cbiAgICAgKiBQcm92aWRlcyByZWZlcmVuY2VzIHRvIHRoZSBgSWd4TGlzdEl0ZW1Db21wb25lbnRgIGFuZCBgRXZlbnRgIGFzIGV2ZW50IGFyZ3VtZW50cy5cbiAgICAgKiAgYGBgaHRtbFxuICAgICAqIDxpZ3gtbGlzdCAob25JdGVtQ2xpY2tlZCkgPSBcIm9uSXRlbUNsaWNrZWQoJGV2ZW50KVwiPjwvaWd4LWxpc3Q+XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneExpc3RDb21wb25lbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25JdGVtQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SUxpc3RJdGVtQ2xpY2tFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBgcm9sZWAgYXR0cmlidXRlLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbGlzdFJvbGUgPSAgdGhpcy5saXN0LnJvbGU7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneExpc3RDb21wb25lbnRcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gICAgcHVibGljIGdldCByb2xlKCkge1xuICAgICAgICByZXR1cm4gJ2xpc3QnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBsaXN0IGlzIGVtcHR5LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNFbXB0eSA9ICB0aGlzLmxpc3QuaXNMaXN0RW1wdHk7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneExpc3RDb21wb25lbnRcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1saXN0LWVtcHR5JylcbiAgICBwdWJsaWMgZ2V0IGlzTGlzdEVtcHR5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuY2hpbGRyZW4gfHwgdGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWxpc3QnKVxuICAgIHB1YmxpYyBnZXQgY3NzQ2xhc3MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5pc0xpc3RFbXB0eSAmJiB0aGlzLmRpc3BsYXlEZW5zaXR5ID09PSBEaXNwbGF5RGVuc2l0eS5jb21mb3J0YWJsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtbGlzdC0tY29tcGFjdCcpXG4gICAgcHVibGljIGdldCBjc3NDbGFzc0NvbXBhY3QoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5pc0xpc3RFbXB0eSAmJiB0aGlzLmRpc3BsYXlEZW5zaXR5ID09PSBEaXNwbGF5RGVuc2l0eS5jb21wYWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1saXN0LS1jb3N5JylcbiAgICBwdWJsaWMgZ2V0IGNzc0NsYXNzQ29zeSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzTGlzdEVtcHR5ICYmIHRoaXMuZGlzcGxheURlbnNpdHkgPT09IERpc3BsYXlEZW5zaXR5LmNvc3k7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYGl0ZW1zYCBpbiB0aGUgbGlzdCBleGNsdWRpbmcgdGhlIGhlYWRlcnMuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBsaXN0SXRlbXM6IElneExpc3RJdGVtQ29tcG9uZW50W10gPSB0aGlzLmxpc3QuaXRlbXM7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneExpc3RDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGl0ZW1zKCk6IElneExpc3RJdGVtQ29tcG9uZW50W10ge1xuICAgICAgICBjb25zdCBpdGVtczogSWd4TGlzdEl0ZW1Db21wb25lbnRbXSA9IFtdO1xuICAgICAgICBpZiAodGhpcy5jaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuc29ydGVkQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNoaWxkLmlzSGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaGVhZGVycyBpbiB0aGUgbGlzdC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGxpc3RIZWFkZXJzOiBJZ3hMaXN0SXRlbUNvbXBvbmVudFtdID0gIHRoaXMubGlzdC5oZWFkZXJzO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hMaXN0Q29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIGdldCBoZWFkZXJzKCk6IElneExpc3RJdGVtQ29tcG9uZW50W10ge1xuICAgICAgICBjb25zdCBoZWFkZXJzOiBJZ3hMaXN0SXRlbUNvbXBvbmVudFtdID0gW107XG4gICAgICAgIGlmICh0aGlzLmNoaWxkcmVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbi50b0FycmF5KCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNIZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhlYWRlcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYGNvbnRleHRgIG9iamVjdCB3aGljaCByZXByZXNlbnRzIHRoZSBgdGVtcGxhdGUgY29udGV4dGAgYmluZGluZyBpbnRvIHRoZSBgbGlzdCBjb250YWluZXJgXG4gICAgICogYnkgcHJvdmlkaW5nIHRoZSBgJGltcGxpY2l0YCBkZWNsYXJhdGlvbiB3aGljaCBpcyB0aGUgYElneExpc3RDb21wb25lbnRgIGl0c2VsZi5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGxpc3RDb21wb25lbnQgPSAgdGhpcy5saXN0LmNvbnRleHQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBjb250ZXh0KCk6IGFueSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAkaW1wbGljaXQ6IHRoaXNcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBgdGVtcGxhdGVgIG9mIGFuIGVtcHR5IGxpc3QuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBsaXN0VGVtcGxhdGUgPSB0aGlzLmxpc3QudGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneExpc3RDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgICAgICBpZiAodGhpcy5pc0xvYWRpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFMb2FkaW5nVGVtcGxhdGUgPyB0aGlzLmRhdGFMb2FkaW5nVGVtcGxhdGUudGVtcGxhdGUgOiB0aGlzLmRlZmF1bHREYXRhTG9hZGluZ1RlbXBsYXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1wdHlMaXN0VGVtcGxhdGUgPyB0aGlzLmVtcHR5TGlzdFRlbXBsYXRlLnRlbXBsYXRlIDogdGhpcy5kZWZhdWx0RW1wdHlMaXN0VGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5ATmdNb2R1bGUoe1xuICAgIGRlY2xhcmF0aW9uczogW1xuICAgICAgICBJZ3hMaXN0QmFzZURpcmVjdGl2ZSxcbiAgICAgICAgSWd4TGlzdENvbXBvbmVudCxcbiAgICAgICAgSWd4TGlzdEl0ZW1Db21wb25lbnQsXG4gICAgICAgIElneExpc3RUaHVtYm5haWxEaXJlY3RpdmUsXG4gICAgICAgIElneExpc3RBY3Rpb25EaXJlY3RpdmUsXG4gICAgICAgIElneExpc3RMaW5lRGlyZWN0aXZlLFxuICAgICAgICBJZ3hMaXN0TGluZVRpdGxlRGlyZWN0aXZlLFxuICAgICAgICBJZ3hMaXN0TGluZVN1YlRpdGxlRGlyZWN0aXZlLFxuICAgICAgICBJZ3hEYXRhTG9hZGluZ1RlbXBsYXRlRGlyZWN0aXZlLFxuICAgICAgICBJZ3hFbXB0eUxpc3RUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICAgICAgSWd4TGlzdEl0ZW1MZWZ0UGFubmluZ1RlbXBsYXRlRGlyZWN0aXZlLFxuICAgICAgICBJZ3hMaXN0SXRlbVJpZ2h0UGFubmluZ1RlbXBsYXRlRGlyZWN0aXZlXG4gICAgXSxcbiAgICBleHBvcnRzOiBbXG4gICAgICAgIElneExpc3RDb21wb25lbnQsXG4gICAgICAgIElneExpc3RJdGVtQ29tcG9uZW50LFxuICAgICAgICBJZ3hMaXN0VGh1bWJuYWlsRGlyZWN0aXZlLFxuICAgICAgICBJZ3hMaXN0QWN0aW9uRGlyZWN0aXZlLFxuICAgICAgICBJZ3hMaXN0TGluZURpcmVjdGl2ZSxcbiAgICAgICAgSWd4TGlzdExpbmVUaXRsZURpcmVjdGl2ZSxcbiAgICAgICAgSWd4TGlzdExpbmVTdWJUaXRsZURpcmVjdGl2ZSxcbiAgICAgICAgSWd4RGF0YUxvYWRpbmdUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICAgICAgSWd4RW1wdHlMaXN0VGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgICAgIElneExpc3RJdGVtTGVmdFBhbm5pbmdUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICAgICAgSWd4TGlzdEl0ZW1SaWdodFBhbm5pbmdUZW1wbGF0ZURpcmVjdGl2ZVxuICAgIF0sXG4gICAgaW1wb3J0czogW1xuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIElneFJpcHBsZU1vZHVsZVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgSWd4TGlzdE1vZHVsZSB7XG59XG4iXX0=