UNPKG

@catull/igniteui-angular

Version:

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

444 lines 36.2 kB
import { __decorate, __metadata, __param } from "tslib"; import { CommonModule } from '@angular/common'; import { Component, Directive, HostBinding, Optional, Inject, Input, NgModule } from '@angular/core'; import { IgxButtonModule } from '../directives/button/button.directive'; let NEXT_ID = 0; /** * IgxCardMedia is container for the card media section. * Use it to wrap images and videos. */ let IgxCardMediaDirective = class IgxCardMediaDirective { constructor() { /** * @hidden */ this.cssClass = 'igx-card__media'; /** * An @Input property that sets the `width` and `min-width` style property * of the media container. If not provided it will be set to `auto`. * ```html * <igx-card-media width="300px"></igx-card-media> * ``` */ this.width = 'auto'; /** * An @Input property that sets the `height` style property of the media container. * If not provided it will be set to `auto`. * ```html * <igx-card-media height="50%"></igx-card-media> * ``` */ this.height = 'auto'; /** * An @Input property that sets the `role` attribute of the media container. */ this.role = 'img'; } }; __decorate([ HostBinding('class.igx-card__media'), __metadata("design:type", Object) ], IgxCardMediaDirective.prototype, "cssClass", void 0); __decorate([ HostBinding('style.width'), HostBinding('style.min-width'), Input(), __metadata("design:type", Object) ], IgxCardMediaDirective.prototype, "width", void 0); __decorate([ HostBinding('style.height'), Input(), __metadata("design:type", Object) ], IgxCardMediaDirective.prototype, "height", void 0); __decorate([ HostBinding('attr.role'), Input(), __metadata("design:type", Object) ], IgxCardMediaDirective.prototype, "role", void 0); IgxCardMediaDirective = __decorate([ Directive({ // tslint:disable-next-line:directive-selector selector: 'igx-card-media' }) ], IgxCardMediaDirective); export { IgxCardMediaDirective }; /** * IgxCardHeader is container for the card header */ let IgxCardHeaderComponent = class IgxCardHeaderComponent { constructor() { /** * @hidden */ this.cssClass = 'igx-card-header'; /** * An @Input property that sets the layout style of the header. * By default the header elements(thumbnail and title/subtitle) are aligned horizontally. * ```html * <igx-card-header [vertical]="true"></igx-card-header> * ``` */ this.vertical = false; /** * An @Input property that sets the value of the `role` attribute of the card header. * By default the value is set to `header`. * ```html * <igx-card-header role="header"></igx-card-header> * ``` */ this.role = 'header'; } }; __decorate([ HostBinding('class.igx-card-header'), __metadata("design:type", Object) ], IgxCardHeaderComponent.prototype, "cssClass", void 0); __decorate([ HostBinding('class.igx-card-header--vertical'), Input(), __metadata("design:type", Object) ], IgxCardHeaderComponent.prototype, "vertical", void 0); __decorate([ HostBinding('attr.role'), __metadata("design:type", Object) ], IgxCardHeaderComponent.prototype, "role", void 0); IgxCardHeaderComponent = __decorate([ Component({ selector: 'igx-card-header', template: "<div class=\"igx-card-header__thumbnail\">\n <ng-content select=\"igx-avatar, igx-card-media, [igxCardThumbnail]\"></ng-content>\n</div>\n\n<div class=\"igx-card-header__titles\">\n <ng-content select=\"\n [igxCardHeaderTitle],\n [igxCardHeaderSubtitle],\n .igx-card-header__title,\n .igx-card-header__subtitle\">\n </ng-content>\n</div>\n\n<ng-content></ng-content>\n" }) ], IgxCardHeaderComponent); export { IgxCardHeaderComponent }; /** * IgxCardThumbnail is container for the card thumbnail section. * Use it to wrap anything you want to be used as a thumbnail. */ let IgxCardThumbnailDirective = class IgxCardThumbnailDirective { }; IgxCardThumbnailDirective = __decorate([ Directive({ selector: '[igxCardThumbnail]' }) ], IgxCardThumbnailDirective); export { IgxCardThumbnailDirective }; /** * igxCardHeaderTitle is used to denote the header title in a card. * Use it to tag text nodes. */ let IgxCardHeaderTitleDirective = class IgxCardHeaderTitleDirective { constructor() { /** * @hidden */ this.cssClass = 'igx-card__header__title'; } }; __decorate([ HostBinding('class.igx-card-header__title'), __metadata("design:type", Object) ], IgxCardHeaderTitleDirective.prototype, "cssClass", void 0); IgxCardHeaderTitleDirective = __decorate([ Directive({ selector: '[igxCardHeaderTitle]' }) ], IgxCardHeaderTitleDirective); export { IgxCardHeaderTitleDirective }; /** * igxCardHeaderSubtitle is used to denote the header subtitle in a card. * Use it to tag text nodes. */ let IgxCardHeaderSubtitleDirective = class IgxCardHeaderSubtitleDirective { constructor() { /** * @hidden */ this.cssClass = 'igx-card-header__subtitle'; } }; __decorate([ HostBinding('class.igx-card-header__subtitle'), __metadata("design:type", Object) ], IgxCardHeaderSubtitleDirective.prototype, "cssClass", void 0); IgxCardHeaderSubtitleDirective = __decorate([ Directive({ selector: '[igxCardHeaderSubtitle]' }) ], IgxCardHeaderSubtitleDirective); export { IgxCardHeaderSubtitleDirective }; /** * IgxCardContent is container for the card content. */ let IgxCardContentDirective = class IgxCardContentDirective { constructor() { /** * @hidden */ this.cssClass = 'igx-card-content'; } }; __decorate([ HostBinding('class.igx-card-content'), __metadata("design:type", Object) ], IgxCardContentDirective.prototype, "cssClass", void 0); IgxCardContentDirective = __decorate([ Directive({ // tslint:disable-next-line:directive-selector selector: 'igx-card-content' }) ], IgxCardContentDirective); export { IgxCardContentDirective }; /** * IgxCardFooter is container for the card footer */ let IgxCardFooterDirective = class IgxCardFooterDirective { constructor() { /** * An @Input property that sets the value of the `role` attribute of the card footer. * By default the value is set to `footer`. * ```html * <igx-card-footer role="footer"></igx-card-footer> * ``` */ this.role = 'footer'; } }; __decorate([ HostBinding('attr.role'), Input(), __metadata("design:type", Object) ], IgxCardFooterDirective.prototype, "role", void 0); IgxCardFooterDirective = __decorate([ Directive({ // tslint:disable-next-line:directive-selector selector: 'igx-card-footer' }) ], IgxCardFooterDirective); export { IgxCardFooterDirective }; /** * **Ignite UI for Angular Card** - * [Documentation](https://www.infragistics.com/products/ignite-ui-angular/angular/components/card.html) * * The Ignite UI Card serves as a container that allows custom content to be organized in an appealing way. There are * five sections in a card that you can use to organize your content. These are header, media, content, actions, and footer. * * Example: * ```html * <igx-card> * <igx-card-header> * <h3 igxCardHeaderTitle>{{title}}</h3> * <h5 igxCardHeaderSubtitle>{{subtitle}}</h5> * </igx-card-header> * <igx-card-actions> * <button igxButton igxRipple>Share</button> * <button igxButton igxRipple>Play Album</button> * </igx-card-actions> * </igx-card> * ``` */ export var IgxCardType; (function (IgxCardType) { IgxCardType["DEFAULT"] = "default"; IgxCardType["OUTLINED"] = "outlined"; })(IgxCardType || (IgxCardType = {})); let IgxCardComponent = class IgxCardComponent { constructor() { /** * Sets/gets the `id` of the card. * If not set, `id` will have value `"igx-card-0"`; * ```html * <igx-card id = "my-first-card"></igx-card> * ``` * ```typescript * let cardId = this.card.id; * ``` * @memberof IgxCardComponent */ this.id = `igx-card-${NEXT_ID++}`; /** * An @Input property that sets the value of the `role` attribute of the card. * By default the value is set to `group`. * ```html * <igx-card role="group"></igx-card> * ``` */ this.role = 'group'; /** * An @Input property that sets the value of the `type` attribute of the card. * By default the value is set to `default`. You can make the card use the * outlined style by setting the value to `outlined`. * ```html * <igx-card type="outlined"></igx-card> * ``` */ this.type = IgxCardType.DEFAULT; /** * An @Input property that sets the value of the `horizontal` attribute of the card. * Setting this to `true` will make the different card sections align horizontally, * essentially flipping the card to the side. * ```html * <igx-card [horizontal]="true"></igx-card> * ``` */ this.horizontal = false; } /** * A getter which will return true if the card type is `outlined`. */ get isOutlinedCard() { return this.type === IgxCardType.OUTLINED; } }; __decorate([ HostBinding('attr.id'), Input(), __metadata("design:type", Object) ], IgxCardComponent.prototype, "id", void 0); __decorate([ HostBinding('attr.role'), Input(), __metadata("design:type", Object) ], IgxCardComponent.prototype, "role", void 0); __decorate([ HostBinding('class.igx-card'), Input(), __metadata("design:type", String) ], IgxCardComponent.prototype, "type", void 0); __decorate([ HostBinding('class.igx-card--outlined'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], IgxCardComponent.prototype, "isOutlinedCard", null); __decorate([ HostBinding('class.igx-card--horizontal'), Input(), __metadata("design:type", Object) ], IgxCardComponent.prototype, "horizontal", void 0); IgxCardComponent = __decorate([ Component({ selector: 'igx-card', template: "<ng-container select='igx-card-media'></ng-container>\n\n<ng-container select='igx-card-header'></ng-container>\n<ng-container select='igx-card-content'>\n <ng-content></ng-content>\n</ng-container>\n\n<ng-container select='igx-card-actions'></ng-container>\n" }) ], IgxCardComponent); export { IgxCardComponent }; export var IgxCardActionsLayout; (function (IgxCardActionsLayout) { IgxCardActionsLayout["DEFAULT"] = "default"; IgxCardActionsLayout["JUSTIFY"] = "justify"; })(IgxCardActionsLayout || (IgxCardActionsLayout = {})); /** * IgxCardActions is container for the card actions. */ let IgxCardActionsComponent = class IgxCardActionsComponent { constructor(card) { this.card = card; this.isVerticalSet = false; /** * An @Input property that sets the layout style of the actions. * By default icons and icon buttons, as well as regular buttons * are split into two containers, which are then positioned on both ends * of the card-actions area. * You can justify the elements in those groups so they are positioned equally * from one another taking up all the space available along the card actions axis. * ```html * <igx-card-actions layout="justify"></igx-card-actions> * ``` */ this.layout = 'default'; /** * An @Input property that sets order of the buttons the actions area. * By default all icons/icon buttons are placed at the end of the action * area. Any regular buttons(flat, raised) will appear before the icons/icon buttons * placed in the actions area. * If you want to reverse their positions so that icons appear first, use the `reverse` * attribute. * ```html * <igx-card-actions [reverse]="true"></igx-card-actions> * ``` */ this.reverse = false; } /** * A getter that returns `true` when the layout has been * set to `justify`. */ get isJustifyLayout() { return this.layout === IgxCardActionsLayout.JUSTIFY; } ngOnChanges(changes) { for (const prop in changes) { if (prop === 'vertical') { this.isVerticalSet = true; } } } ngOnInit() { this.vertical = !this.isVerticalSet && this.card.horizontal; } }; IgxCardActionsComponent.ctorParameters = () => [ { type: IgxCardComponent, decorators: [{ type: Optional }, { type: Inject, args: [IgxCardComponent,] }] } ]; __decorate([ HostBinding('class.igx-card-actions'), Input(), __metadata("design:type", String) ], IgxCardActionsComponent.prototype, "layout", void 0); __decorate([ HostBinding('class.igx-card-actions--vertical'), Input(), __metadata("design:type", Boolean) ], IgxCardActionsComponent.prototype, "vertical", void 0); __decorate([ HostBinding('class.igx-card-actions--justify'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], IgxCardActionsComponent.prototype, "isJustifyLayout", null); __decorate([ HostBinding('class.igx-card-actions--reverse'), Input(), __metadata("design:type", Object) ], IgxCardActionsComponent.prototype, "reverse", void 0); IgxCardActionsComponent = __decorate([ Component({ // tslint:disable-next-line:directive-selector selector: 'igx-card-actions', template: "<div class=\"igx-card-actions__icons\">\n <ng-content select=\"igx-icon, [igxButton='icon']\"></ng-content>\n</div>\n\n<div #buttons class=\"igx-card-actions__buttons\">\n <ng-content select=\"[igxButton]\"></ng-content>\n</div>\n\n\n<ng-content></ng-content>\n" }), __param(0, Optional()), __param(0, Inject(IgxCardComponent)), __metadata("design:paramtypes", [IgxCardComponent]) ], IgxCardActionsComponent); export { IgxCardActionsComponent }; /** * @hidden */ let IgxCardModule = class IgxCardModule { }; IgxCardModule = __decorate([ NgModule({ declarations: [ IgxCardComponent, IgxCardHeaderComponent, IgxCardMediaDirective, IgxCardContentDirective, IgxCardActionsComponent, IgxCardFooterDirective, IgxCardHeaderTitleDirective, IgxCardHeaderSubtitleDirective, IgxCardThumbnailDirective, ], exports: [ IgxCardComponent, IgxCardHeaderComponent, IgxCardMediaDirective, IgxCardContentDirective, IgxCardActionsComponent, IgxCardFooterDirective, IgxCardHeaderTitleDirective, IgxCardHeaderSubtitleDirective, IgxCardThumbnailDirective, ], imports: [CommonModule, IgxButtonModule] }) ], IgxCardModule); export { IgxCardModule }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9pZ25pdGV1aS1hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2NhcmQvY2FyZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0gsU0FBUyxFQUNULFNBQVMsRUFDVCxXQUFXLEVBQ1gsUUFBUSxFQUNSLE1BQU0sRUFDTixLQUFLLEVBQ0wsUUFBUSxFQUlYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUV4RSxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFFaEI7OztHQUdHO0FBS0gsSUFBYSxxQkFBcUIsR0FBbEMsTUFBYSxxQkFBcUI7SUFBbEM7UUFDSTs7V0FFRztRQUVJLGFBQVEsR0FBRyxpQkFBaUIsQ0FBQztRQUVwQzs7Ozs7O1dBTUc7UUFJSSxVQUFLLEdBQUcsTUFBTSxDQUFDO1FBRXRCOzs7Ozs7V0FNRztRQUdJLFdBQU0sR0FBRyxNQUFNLENBQUM7UUFFdkI7O1dBRUc7UUFHSSxTQUFJLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLENBQUM7Q0FBQSxDQUFBO0FBL0JHO0lBREMsV0FBVyxDQUFDLHVCQUF1QixDQUFDOzt1REFDRDtBQVlwQztJQUhDLFdBQVcsQ0FBQyxhQUFhLENBQUM7SUFDMUIsV0FBVyxDQUFDLGlCQUFpQixDQUFDO0lBQzlCLEtBQUssRUFBRTs7b0RBQ2M7QUFXdEI7SUFGQyxXQUFXLENBQUMsY0FBYyxDQUFDO0lBQzNCLEtBQUssRUFBRTs7cURBQ2U7QUFPdkI7SUFGQyxXQUFXLENBQUMsV0FBVyxDQUFDO0lBQ3hCLEtBQUssRUFBRTs7bURBQ1k7QUFuQ1gscUJBQXFCO0lBSmpDLFNBQVMsQ0FBQztRQUNQLDhDQUE4QztRQUM5QyxRQUFRLEVBQUUsZ0JBQWdCO0tBQzdCLENBQUM7R0FD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QWMsZ0JBQWdCO0dBSHRFLHVCQUF1QixDQStEbkM7U0EvRFksdUJBQXVCO0FBaUVwQzs7R0FFRztBQTBCSCxJQUFhLGFBQWEsR0FBMUIsTUFBYSxhQUFhO0NBQUksQ0FBQTtBQUFqQixhQUFhO0lBekJ6QixRQUFRLENBQUM7UUFDTixZQUFZLEVBQUU7WUFDVixnQkFBZ0I7WUFDaEIsc0JBQXNCO1lBQ3RCLHFCQUFxQjtZQUNyQix1QkFBdUI7WUFDdkIsdUJBQXVCO1lBQ3ZCLHNCQUFzQjtZQUN0QiwyQkFBMkI7WUFDM0IsOEJBQThCO1lBQzlCLHlCQUF5QjtTQUM1QjtRQUNELE9BQU8sRUFBRTtZQUNMLGdCQUFnQjtZQUNoQixzQkFBc0I7WUFDdEIscUJBQXFCO1lBQ3JCLHVCQUF1QjtZQUN2Qix1QkFBdUI7WUFDdkIsc0JBQXNCO1lBQ3RCLDJCQUEyQjtZQUMzQiw4QkFBOEI7WUFDOUIseUJBQXlCO1NBQzVCO1FBQ0QsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLGVBQWUsQ0FBQztLQUMzQyxDQUFDO0dBQ1csYUFBYSxDQUFJO1NBQWpCLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgRGlyZWN0aXZlLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIE9wdGlvbmFsLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBOZ01vZHVsZSxcbiAgICBPbkluaXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIFNpbXBsZUNoYW5nZXNcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJZ3hCdXR0b25Nb2R1bGUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2J1dHRvbi9idXR0b24uZGlyZWN0aXZlJztcblxubGV0IE5FWFRfSUQgPSAwO1xuXG4vKipcbiAqIElneENhcmRNZWRpYSBpcyBjb250YWluZXIgZm9yIHRoZSBjYXJkIG1lZGlhIHNlY3Rpb24uXG4gKiBVc2UgaXQgdG8gd3JhcCBpbWFnZXMgYW5kIHZpZGVvcy5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxuICAgIHNlbGVjdG9yOiAnaWd4LWNhcmQtbWVkaWEnXG59KVxuZXhwb3J0IGNsYXNzIElneENhcmRNZWRpYURpcmVjdGl2ZSB7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWNhcmRfX21lZGlhJylcbiAgICBwdWJsaWMgY3NzQ2xhc3MgPSAnaWd4LWNhcmRfX21lZGlhJztcblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgdGhlIGB3aWR0aGAgYW5kIGBtaW4td2lkdGhgIHN0eWxlIHByb3BlcnR5XG4gICAgICogb2YgdGhlIG1lZGlhIGNvbnRhaW5lci4gSWYgbm90IHByb3ZpZGVkIGl0IHdpbGwgYmUgc2V0IHRvIGBhdXRvYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jYXJkLW1lZGlhIHdpZHRoPVwiMzAwcHhcIj48L2lneC1jYXJkLW1lZGlhPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnc3R5bGUud2lkdGgnKVxuICAgIEBIb3N0QmluZGluZygnc3R5bGUubWluLXdpZHRoJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB3aWR0aCA9ICdhdXRvJztcblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgdGhlIGBoZWlnaHRgIHN0eWxlIHByb3BlcnR5IG9mIHRoZSBtZWRpYSBjb250YWluZXIuXG4gICAgICogSWYgbm90IHByb3ZpZGVkIGl0IHdpbGwgYmUgc2V0IHRvIGBhdXRvYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jYXJkLW1lZGlhIGhlaWdodD1cIjUwJVwiPjwvaWd4LWNhcmQtbWVkaWE+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS5oZWlnaHQnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGhlaWdodCA9ICdhdXRvJztcblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgdGhlIGByb2xlYCBhdHRyaWJ1dGUgb2YgdGhlIG1lZGlhIGNvbnRhaW5lci5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcm9sZSA9ICdpbWcnO1xufVxuXG4vKipcbiAqIElneENhcmRIZWFkZXIgaXMgY29udGFpbmVyIGZvciB0aGUgY2FyZCBoZWFkZXJcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdpZ3gtY2FyZC1oZWFkZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnY2FyZC1oZWFkZXIuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIElneENhcmRIZWFkZXJDb21wb25lbnQge1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1jYXJkLWhlYWRlcicpXG4gICAgcHVibGljIGNzc0NsYXNzID0gJ2lneC1jYXJkLWhlYWRlcic7XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIHRoZSBsYXlvdXQgc3R5bGUgb2YgdGhlIGhlYWRlci5cbiAgICAgKiBCeSBkZWZhdWx0IHRoZSBoZWFkZXIgZWxlbWVudHModGh1bWJuYWlsIGFuZCB0aXRsZS9zdWJ0aXRsZSkgYXJlIGFsaWduZWQgaG9yaXpvbnRhbGx5LlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNhcmQtaGVhZGVyIFt2ZXJ0aWNhbF09XCJ0cnVlXCI+PC9pZ3gtY2FyZC1oZWFkZXI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtY2FyZC1oZWFkZXItLXZlcnRpY2FsJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB2ZXJ0aWNhbCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIGByb2xlYCBhdHRyaWJ1dGUgb2YgdGhlIGNhcmQgaGVhZGVyLlxuICAgICAqIEJ5IGRlZmF1bHQgdGhlIHZhbHVlIGlzIHNldCB0byBgaGVhZGVyYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jYXJkLWhlYWRlciByb2xlPVwiaGVhZGVyXCI+PC9pZ3gtY2FyZC1oZWFkZXI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKVxuICAgIHB1YmxpYyByb2xlID0gJ2hlYWRlcic7XG59XG5cbi8qKlxuICogSWd4Q2FyZFRodW1ibmFpbCBpcyBjb250YWluZXIgZm9yIHRoZSBjYXJkIHRodW1ibmFpbCBzZWN0aW9uLlxuICogVXNlIGl0IHRvIHdyYXAgYW55dGhpbmcgeW91IHdhbnQgdG8gYmUgdXNlZCBhcyBhIHRodW1ibmFpbC5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4Q2FyZFRodW1ibmFpbF0nXG59KVxuZXhwb3J0IGNsYXNzIElneENhcmRUaHVtYm5haWxEaXJlY3RpdmUgeyB9XG5cbi8qKlxuICogaWd4Q2FyZEhlYWRlclRpdGxlIGlzIHVzZWQgdG8gZGVub3RlIHRoZSBoZWFkZXIgdGl0bGUgaW4gYSBjYXJkLlxuICogVXNlIGl0IHRvIHRhZyB0ZXh0IG5vZGVzLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tpZ3hDYXJkSGVhZGVyVGl0bGVdJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hDYXJkSGVhZGVyVGl0bGVEaXJlY3RpdmUge1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1jYXJkLWhlYWRlcl9fdGl0bGUnKVxuICAgIHB1YmxpYyBjc3NDbGFzcyA9ICdpZ3gtY2FyZF9faGVhZGVyX190aXRsZSc7XG59XG5cbi8qKlxuICogaWd4Q2FyZEhlYWRlclN1YnRpdGxlIGlzIHVzZWQgdG8gZGVub3RlIHRoZSBoZWFkZXIgc3VidGl0bGUgaW4gYSBjYXJkLlxuICogVXNlIGl0IHRvIHRhZyB0ZXh0IG5vZGVzLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tpZ3hDYXJkSGVhZGVyU3VidGl0bGVdJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hDYXJkSGVhZGVyU3VidGl0bGVEaXJlY3RpdmUge1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1jYXJkLWhlYWRlcl9fc3VidGl0bGUnKVxuICAgIHB1YmxpYyBjc3NDbGFzcyA9ICdpZ3gtY2FyZC1oZWFkZXJfX3N1YnRpdGxlJztcbn1cbi8qKlxuICogSWd4Q2FyZENvbnRlbnQgaXMgY29udGFpbmVyIGZvciB0aGUgY2FyZCBjb250ZW50LlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLXNlbGVjdG9yXG4gICAgc2VsZWN0b3I6ICdpZ3gtY2FyZC1jb250ZW50J1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hDYXJkQ29udGVudERpcmVjdGl2ZSB7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWNhcmQtY29udGVudCcpXG4gICAgcHVibGljIGNzc0NsYXNzID0gJ2lneC1jYXJkLWNvbnRlbnQnO1xufVxuXG4vKipcbiAqIElneENhcmRGb290ZXIgaXMgY29udGFpbmVyIGZvciB0aGUgY2FyZCBmb290ZXJcbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxuICAgIHNlbGVjdG9yOiAnaWd4LWNhcmQtZm9vdGVyJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hDYXJkRm9vdGVyRGlyZWN0aXZlIHtcbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYHJvbGVgIGF0dHJpYnV0ZSBvZiB0aGUgY2FyZCBmb290ZXIuXG4gICAgICogQnkgZGVmYXVsdCB0aGUgdmFsdWUgaXMgc2V0IHRvIGBmb290ZXJgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNhcmQtZm9vdGVyIHJvbGU9XCJmb290ZXJcIj48L2lneC1jYXJkLWZvb3Rlcj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcm9sZSA9ICdmb290ZXInO1xufVxuXG4vKipcbiAqICoqSWduaXRlIFVJIGZvciBBbmd1bGFyIENhcmQqKiAtXG4gKiBbRG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly93d3cuaW5mcmFnaXN0aWNzLmNvbS9wcm9kdWN0cy9pZ25pdGUtdWktYW5ndWxhci9hbmd1bGFyL2NvbXBvbmVudHMvY2FyZC5odG1sKVxuICpcbiAqIFRoZSBJZ25pdGUgVUkgQ2FyZCBzZXJ2ZXMgYXMgYSBjb250YWluZXIgdGhhdCBhbGxvd3MgY3VzdG9tIGNvbnRlbnQgdG8gYmUgb3JnYW5pemVkIGluIGFuIGFwcGVhbGluZyB3YXkuIFRoZXJlIGFyZVxuICogZml2ZSBzZWN0aW9ucyBpbiBhIGNhcmQgdGhhdCB5b3UgY2FuIHVzZSB0byBvcmdhbml6ZSB5b3VyIGNvbnRlbnQuIFRoZXNlIGFyZSBoZWFkZXIsIG1lZGlhLCBjb250ZW50LCBhY3Rpb25zLCBhbmQgZm9vdGVyLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGBodG1sXG4gKiA8aWd4LWNhcmQ+XG4gKiAgIDxpZ3gtY2FyZC1oZWFkZXI+XG4gKiAgICAgPGgzIGlneENhcmRIZWFkZXJUaXRsZT57e3RpdGxlfX08L2gzPlxuICogICAgIDxoNSBpZ3hDYXJkSGVhZGVyU3VidGl0bGU+e3tzdWJ0aXRsZX19PC9oNT5cbiAqICAgPC9pZ3gtY2FyZC1oZWFkZXI+XG4gKiAgIDxpZ3gtY2FyZC1hY3Rpb25zPlxuICogICAgICAgPGJ1dHRvbiBpZ3hCdXR0b24gaWd4UmlwcGxlPlNoYXJlPC9idXR0b24+XG4gKiAgICAgICA8YnV0dG9uIGlneEJ1dHRvbiBpZ3hSaXBwbGU+UGxheSBBbGJ1bTwvYnV0dG9uPlxuICogICA8L2lneC1jYXJkLWFjdGlvbnM+XG4gKiA8L2lneC1jYXJkPlxuICogYGBgXG4gKi9cblxuZXhwb3J0IGVudW0gSWd4Q2FyZFR5cGUge1xuICAgIERFRkFVTFQgPSAnZGVmYXVsdCcsXG4gICAgT1VUTElORUQgPSAnb3V0bGluZWQnXG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnaWd4LWNhcmQnLFxuICAgIHRlbXBsYXRlVXJsOiAnY2FyZC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgSWd4Q2FyZENvbXBvbmVudCB7XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBgaWRgIG9mIHRoZSBjYXJkLlxuICAgICAqIElmIG5vdCBzZXQsIGBpZGAgd2lsbCBoYXZlIHZhbHVlIGBcImlneC1jYXJkLTBcImA7XG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2FyZCBpZCA9IFwibXktZmlyc3QtY2FyZFwiPjwvaWd4LWNhcmQ+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBjYXJkSWQgPSAgdGhpcy5jYXJkLmlkO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hDYXJkQ29tcG9uZW50XG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmlkJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBpZCA9IGBpZ3gtY2FyZC0ke05FWFRfSUQrK31gO1xuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIGByb2xlYCBhdHRyaWJ1dGUgb2YgdGhlIGNhcmQuXG4gICAgICogQnkgZGVmYXVsdCB0aGUgdmFsdWUgaXMgc2V0IHRvIGBncm91cGAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2FyZCByb2xlPVwiZ3JvdXBcIj48L2lneC1jYXJkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5yb2xlJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyByb2xlID0gJ2dyb3VwJztcblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgdGhlIHZhbHVlIG9mIHRoZSBgdHlwZWAgYXR0cmlidXRlIG9mIHRoZSBjYXJkLlxuICAgICAqIEJ5IGRlZmF1bHQgdGhlIHZhbHVlIGlzIHNldCB0byBgZGVmYXVsdGAuIFlvdSBjYW4gbWFrZSB0aGUgY2FyZCB1c2UgdGhlXG4gICAgICogb3V0bGluZWQgc3R5bGUgYnkgc2V0dGluZyB0aGUgdmFsdWUgdG8gYG91dGxpbmVkYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jYXJkIHR5cGU9XCJvdXRsaW5lZFwiPjwvaWd4LWNhcmQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtY2FyZCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdHlwZTogSWd4Q2FyZFR5cGUgfCBzdHJpbmcgPSBJZ3hDYXJkVHlwZS5ERUZBVUxUO1xuXG4gICAgLyoqXG4gICAgICogQSBnZXR0ZXIgd2hpY2ggd2lsbCByZXR1cm4gdHJ1ZSBpZiB0aGUgY2FyZCB0eXBlIGlzIGBvdXRsaW5lZGAuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtY2FyZC0tb3V0bGluZWQnKVxuICAgIGdldCBpc091dGxpbmVkQ2FyZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gSWd4Q2FyZFR5cGUuT1VUTElORUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIGBob3Jpem9udGFsYCBhdHRyaWJ1dGUgb2YgdGhlIGNhcmQuXG4gICAgICogU2V0dGluZyB0aGlzIHRvIGB0cnVlYCB3aWxsIG1ha2UgdGhlIGRpZmZlcmVudCBjYXJkIHNlY3Rpb25zIGFsaWduIGhvcml6b250YWxseSxcbiAgICAgKiBlc3NlbnRpYWxseSBmbGlwcGluZyB0aGUgY2FyZCB0byB0aGUgc2lkZS5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jYXJkIFtob3Jpem9udGFsXT1cInRydWVcIj48L2lneC1jYXJkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWNhcmQtLWhvcml6b250YWwnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGhvcml6b250YWwgPSBmYWxzZTtcbn1cblxuZXhwb3J0IGVudW0gSWd4Q2FyZEFjdGlvbnNMYXlvdXQge1xuICAgIERFRkFVTFQgPSAnZGVmYXVsdCcsXG4gICAgSlVTVElGWSA9ICdqdXN0aWZ5Jyxcbn1cblxuLyoqXG4gKiBJZ3hDYXJkQWN0aW9ucyBpcyBjb250YWluZXIgZm9yIHRoZSBjYXJkIGFjdGlvbnMuXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtc2VsZWN0b3JcbiAgICBzZWxlY3RvcjogJ2lneC1jYXJkLWFjdGlvbnMnLFxuICAgIHRlbXBsYXRlVXJsOiAnY2FyZC1hY3Rpb25zLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hDYXJkQWN0aW9uc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgICBwcml2YXRlIGlzVmVydGljYWxTZXQgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIEBJbmplY3QoSWd4Q2FyZENvbXBvbmVudCkgcHVibGljIGNhcmQ6IElneENhcmRDb21wb25lbnQpIHsgfVxuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgbGF5b3V0IHN0eWxlIG9mIHRoZSBhY3Rpb25zLlxuICAgICAqIEJ5IGRlZmF1bHQgaWNvbnMgYW5kIGljb24gYnV0dG9ucywgYXMgd2VsbCBhcyByZWd1bGFyIGJ1dHRvbnNcbiAgICAgKiBhcmUgc3BsaXQgaW50byB0d28gY29udGFpbmVycywgd2hpY2ggYXJlIHRoZW4gcG9zaXRpb25lZCBvbiBib3RoIGVuZHNcbiAgICAgKiBvZiB0aGUgY2FyZC1hY3Rpb25zIGFyZWEuXG4gICAgICogWW91IGNhbiBqdXN0aWZ5IHRoZSBlbGVtZW50cyBpbiB0aG9zZSBncm91cHMgc28gdGhleSBhcmUgcG9zaXRpb25lZCBlcXVhbGx5XG4gICAgICogZnJvbSBvbmUgYW5vdGhlciB0YWtpbmcgdXAgYWxsIHRoZSBzcGFjZSBhdmFpbGFibGUgYWxvbmcgdGhlIGNhcmQgYWN0aW9ucyBheGlzLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNhcmQtYWN0aW9ucyBsYXlvdXQ9XCJqdXN0aWZ5XCI+PC9pZ3gtY2FyZC1hY3Rpb25zPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWNhcmQtYWN0aW9ucycpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbGF5b3V0OiBJZ3hDYXJkQWN0aW9uc0xheW91dCB8IHN0cmluZyA9ICdkZWZhdWx0JztcblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgdGhlIHZlcnRpY2FsIGF0dHJpYnV0ZSBvZiB0aGUgYWN0aW9ucy5cbiAgICAgKiBXaGVuIHNldCB0byBgdHJ1ZWAgdGhlIGFjdGlvbnMgd2lsbCBiZSBsYXllZCBvdXQgdmVydGljYWxseS5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1jYXJkLWFjdGlvbnMtLXZlcnRpY2FsJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB2ZXJ0aWNhbDogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEEgZ2V0dGVyIHRoYXQgcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgbGF5b3V0IGhhcyBiZWVuXG4gICAgICogc2V0IHRvIGBqdXN0aWZ5YC5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1jYXJkLWFjdGlvbnMtLWp1c3RpZnknKVxuICAgIGdldCBpc0p1c3RpZnlMYXlvdXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxheW91dCA9PT0gSWd4Q2FyZEFjdGlvbnNMYXlvdXQuSlVTVElGWTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIG9yZGVyIG9mIHRoZSBidXR0b25zIHRoZSBhY3Rpb25zIGFyZWEuXG4gICAgICogQnkgZGVmYXVsdCBhbGwgaWNvbnMvaWNvbiBidXR0b25zIGFyZSBwbGFjZWQgYXQgdGhlIGVuZCBvZiB0aGUgYWN0aW9uXG4gICAgICogYXJlYS4gQW55IHJlZ3VsYXIgYnV0dG9ucyhmbGF0LCByYWlzZWQpIHdpbGwgYXBwZWFyIGJlZm9yZSB0aGUgaWNvbnMvaWNvbiBidXR0b25zXG4gICAgICogcGxhY2VkIGluIHRoZSBhY3Rpb25zIGFyZWEuXG4gICAgICogSWYgeW91IHdhbnQgdG8gcmV2ZXJzZSB0aGVpciBwb3NpdGlvbnMgc28gdGhhdCBpY29ucyBhcHBlYXIgZmlyc3QsIHVzZSB0aGUgYHJldmVyc2VgXG4gICAgICogYXR0cmlidXRlLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNhcmQtYWN0aW9ucyBbcmV2ZXJzZV09XCJ0cnVlXCI+PC9pZ3gtY2FyZC1hY3Rpb25zPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWNhcmQtYWN0aW9ucy0tcmV2ZXJzZScpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcmV2ZXJzZSA9IGZhbHNlO1xuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gY2hhbmdlcykge1xuICAgICAgICAgICAgaWYgKHByb3AgPT09ICd2ZXJ0aWNhbCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzVmVydGljYWxTZXQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMudmVydGljYWwgPSAhdGhpcy5pc1ZlcnRpY2FsU2V0ICYmIHRoaXMuY2FyZC5ob3Jpem9udGFsO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbkBOZ01vZHVsZSh7XG4gICAgZGVjbGFyYXRpb25zOiBbXG4gICAgICAgIElneENhcmRDb21wb25lbnQsXG4gICAgICAgIElneENhcmRIZWFkZXJDb21wb25lbnQsXG4gICAgICAgIElneENhcmRNZWRpYURpcmVjdGl2ZSxcbiAgICAgICAgSWd4Q2FyZENvbnRlbnREaXJlY3RpdmUsXG4gICAgICAgIElneENhcmRBY3Rpb25zQ29tcG9uZW50LFxuICAgICAgICBJZ3hDYXJkRm9vdGVyRGlyZWN0aXZlLFxuICAgICAgICBJZ3hDYXJkSGVhZGVyVGl0bGVEaXJlY3RpdmUsXG4gICAgICAgIElneENhcmRIZWFkZXJTdWJ0aXRsZURpcmVjdGl2ZSxcbiAgICAgICAgSWd4Q2FyZFRodW1ibmFpbERpcmVjdGl2ZSxcbiAgICBdLFxuICAgIGV4cG9ydHM6IFtcbiAgICAgICAgSWd4Q2FyZENvbXBvbmVudCxcbiAgICAgICAgSWd4Q2FyZEhlYWRlckNvbXBvbmVudCxcbiAgICAgICAgSWd4Q2FyZE1lZGlhRGlyZWN0aXZlLFxuICAgICAgICBJZ3hDYXJkQ29udGVudERpcmVjdGl2ZSxcbiAgICAgICAgSWd4Q2FyZEFjdGlvbnNDb21wb25lbnQsXG4gICAgICAgIElneENhcmRGb290ZXJEaXJlY3RpdmUsXG4gICAgICAgIElneENhcmRIZWFkZXJUaXRsZURpcmVjdGl2ZSxcbiAgICAgICAgSWd4Q2FyZEhlYWRlclN1YnRpdGxlRGlyZWN0aXZlLFxuICAgICAgICBJZ3hDYXJkVGh1bWJuYWlsRGlyZWN0aXZlLFxuICAgIF0sXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgSWd4QnV0dG9uTW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hDYXJkTW9kdWxlIHsgfVxuIl19