UNPKG

theme-lib

Version:

This is a simple example Angular Library published to npm.

411 lines 28.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /* * @license * Copyright Akveo. All Rights Reserved. * Licensed under the MIT License. See License.txt in the project root for license information. */ import { Component, Input, HostBinding, HostListener, Renderer2, ElementRef } from '@angular/core'; import { convertToBoolProperty } from '../helpers'; /* * Basic button component. * * Default button size is `medium` and status color is `primary`: * @stacked-example(Button Showcase, button/button-showcase.component) * * ```html * <button nbButton></button> * ``` * ### Installation * * Import `NbButtonModule` to your feature module. * ```ts * @NgModule({ * imports: [ * // ... * NbButtonModule, * ], * }) * export class PageModule { } * ``` * ### Usage * * Buttons are available in multiple colors using `status` property: * @stacked-example(Button Colors, button/button-colors.component.html) * * There are three button sizes: * * @stacked-example(Button Sizes, button/button-sizes.component.html) * * And two additional style types - `outline`: * * @stacked-example(Outline Buttons, button/button-outline.component.html) * * and `hero`: * * @stacked-example(Button Colors, button/button-hero.component.html) * * Buttons available in different shapes, which could be combined with the other properties: * @stacked-example(Button Shapes, button/button-shapes.component) * * `nbButton` could be applied to the following selectors - `button`, `input[type="button"]`, `input[type="submit"]` * and `a`: * @stacked-example(Button Elements, button/button-types.component.html) * * Button can be made `fullWidth`: * @stacked-example(Full Width Button, button/button-full-width.component.html) * * @styles * * btn-fg: * btn-font-family: * btn-line-height: * btn-disabled-opacity: * btn-cursor: * btn-primary-bg: * btn-secondary-bg: * btn-info-bg: * btn-success-bg: * btn-warning-bg: * btn-danger-bg: * btn-secondary-border: * btn-secondary-border-width: * btn-padding-y-lg: * btn-padding-x-lg: * btn-font-size-lg: * btn-padding-y-md: * btn-padding-x-md: * btn-font-size-md: * btn-padding-y-sm: * btn-padding-x-sm: * btn-font-size-sm: * btn-padding-y-xs: * btn-padding-x-xs: * btn-font-size-xs: * btn-border-radius: * btn-rectangle-border-radius: * btn-semi-round-border-radius: * btn-round-border-radius: * btn-hero-shadow: * btn-hero-text-shadow: * btn-hero-bevel-size: * btn-hero-glow-size: * btn-hero-primary-glow-size: * btn-hero-success-glow-size: * btn-hero-warning-glow-size: * btn-hero-info-glow-size: * btn-hero-danger-glow-size: * btn-hero-secondary-glow-size: * btn-hero-degree: * btn-hero-primary-degree: * btn-hero-success-degree: * btn-hero-warning-degree: * btn-hero-info-degree: * btn-hero-danger-degree: * btn-hero-secondary-degree: * btn-hero-border-radius: * btn-outline-fg: * btn-outline-hover-fg: * btn-outline-focus-fg: */ export class NbButtonComponent { /** * @param {?} renderer * @param {?} hostElement */ constructor(renderer, hostElement) { this.renderer = renderer; this.hostElement = hostElement; this.fullWidth = false; } /** * @return {?} */ get xsmall() { return this.size === NbButtonComponent.SIZE_XSMALL; } /** * @return {?} */ get small() { return this.size === NbButtonComponent.SIZE_SMALL; } /** * @return {?} */ get medium() { return this.size === NbButtonComponent.SIZE_MEDIUM; } /** * @return {?} */ get large() { return this.size === NbButtonComponent.SIZE_LARGE; } /** * @return {?} */ get primary() { return this.status === NbButtonComponent.STATUS_PRIMARY; } /** * @return {?} */ get info() { return this.status === NbButtonComponent.STATUS_INFO; } /** * @return {?} */ get success() { return this.status === NbButtonComponent.STATUS_SUCCESS; } /** * @return {?} */ get warning() { return this.status === NbButtonComponent.STATUS_WARNING; } /** * @return {?} */ get danger() { return this.status === NbButtonComponent.STATUS_DANGER; } /** * @return {?} */ get rectangle() { return this.shape === NbButtonComponent.SHAPE_RECTANGLE; } /** * @return {?} */ get round() { return this.shape === NbButtonComponent.SHAPE_ROUND; } /** * @return {?} */ get semiRound() { return this.shape === NbButtonComponent.SHAPE_SEMI_ROUND; } // issue #794 /** * @return {?} */ get tabbable() { return this.disabled ? '-1' : '0'; } /* * Button size, available sizes: * `xxsmall`, `xsmall`, `small`, `medium`, `large` * @param {string} val */ /** * @private * @param {?} val * @return {?} */ set setSize(val) { this.size = val; } /* * Button status (adds specific styles): * `primary`, `info`, `success`, `warning`, `danger` * @param {string} val */ /** * @private * @param {?} val * @return {?} */ set setStatus(val) { this.status = val; } /* * Button shapes: `rectangle`, `round`, `semi-round` * @param {string} val */ /** * @private * @param {?} val * @return {?} */ set setShape(val) { this.shape = val; } /* * Adds `hero` styles * @param {boolean} val */ /** * @param {?} val * @return {?} */ set setHero(val) { this.hero = convertToBoolProperty(val); } /* * Disables the button * @param {boolean} val */ /** * @param {?} val * @return {?} */ set setDisabled(val) { this.disabled = convertToBoolProperty(val); this.renderer.setProperty(this.hostElement.nativeElement, 'disabled', this.disabled); } /* * If set element will fill its container * @param {boolean} */ /** * @param {?} value * @return {?} */ set setFullWidth(value) { this.fullWidth = convertToBoolProperty(value); } /* * Adds `outline` styles * @param {boolean} val */ /** * @param {?} val * @return {?} */ set setOutline(val) { this.outline = convertToBoolProperty(val); } /* * @private * Keep this handler to partially support anchor disabling. * Unlike button, anchor doesn't have 'disabled' DOM property, * so handler will be called anyway. We preventing navigation and bubbling. * Disabling is partial due to click handlers precedence. Consider example: * <a nbButton [disabled]="true" (click)="clickHandler()">...</a> * 'clickHandler' will be called before our host listener below. We can't prevent * such handlers call. */ /** * @param {?} event * @return {?} */ onClick(event) { if (this.disabled) { event.preventDefault(); event.stopImmediatePropagation(); } } } NbButtonComponent.SIZE_XSMALL = 'xsmall'; NbButtonComponent.SIZE_SMALL = 'small'; NbButtonComponent.SIZE_MEDIUM = 'medium'; NbButtonComponent.SIZE_LARGE = 'large'; NbButtonComponent.STATUS_PRIMARY = 'primary'; NbButtonComponent.STATUS_INFO = 'info'; NbButtonComponent.STATUS_SUCCESS = 'success'; NbButtonComponent.STATUS_WARNING = 'warning'; NbButtonComponent.STATUS_DANGER = 'danger'; NbButtonComponent.SHAPE_RECTANGLE = 'rectangle'; NbButtonComponent.SHAPE_ROUND = 'round'; NbButtonComponent.SHAPE_SEMI_ROUND = 'semi-round'; NbButtonComponent.decorators = [ { type: Component, args: [{ selector: 'button[nbButton],a[nbButton],input[type="button"][nbButton],input[type="submit"][nbButton]', template: ` <ng-content></ng-content> `, styles: [":host{text-transform:uppercase;letter-spacing:.4px;border:2px solid transparent;transition:none;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;text-align:center;text-decoration:none;display:inline-block;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}:host:focus,:host:hover{text-decoration:none}:host.btn-full-width{width:100%}"] }] } ]; /** @nocollapse */ NbButtonComponent.ctorParameters = () => [ { type: Renderer2 }, { type: ElementRef } ]; NbButtonComponent.propDecorators = { xsmall: [{ type: HostBinding, args: ['class.btn-xsmall',] }], small: [{ type: HostBinding, args: ['class.btn-small',] }], medium: [{ type: HostBinding, args: ['class.btn-medium',] }], large: [{ type: HostBinding, args: ['class.btn-large',] }], primary: [{ type: HostBinding, args: ['class.btn-primary',] }], info: [{ type: HostBinding, args: ['class.btn-info',] }], success: [{ type: HostBinding, args: ['class.btn-success',] }], warning: [{ type: HostBinding, args: ['class.btn-warning',] }], danger: [{ type: HostBinding, args: ['class.btn-danger',] }], rectangle: [{ type: HostBinding, args: ['class.btn-rectangle',] }], round: [{ type: HostBinding, args: ['class.btn-round',] }], semiRound: [{ type: HostBinding, args: ['class.btn-semi-round',] }], hero: [{ type: HostBinding, args: ['class.btn-hero',] }], outline: [{ type: HostBinding, args: ['class.btn-outline',] }], disabled: [{ type: HostBinding, args: ['attr.aria-disabled',] }, { type: HostBinding, args: ['class.btn-disabled',] }], tabbable: [{ type: HostBinding, args: ['attr.tabindex',] }], fullWidth: [{ type: HostBinding, args: ['class.btn-full-width',] }], setSize: [{ type: Input, args: ['size',] }], setStatus: [{ type: Input, args: ['status',] }], setShape: [{ type: Input, args: ['shape',] }], setHero: [{ type: Input, args: ['hero',] }], setDisabled: [{ type: Input, args: ['disabled',] }], setFullWidth: [{ type: Input, args: ['fullWidth',] }], setOutline: [{ type: Input, args: ['outline',] }], onClick: [{ type: HostListener, args: ['click', ['$event'],] }] }; if (false) { /** @type {?} */ NbButtonComponent.SIZE_XSMALL; /** @type {?} */ NbButtonComponent.SIZE_SMALL; /** @type {?} */ NbButtonComponent.SIZE_MEDIUM; /** @type {?} */ NbButtonComponent.SIZE_LARGE; /** @type {?} */ NbButtonComponent.STATUS_PRIMARY; /** @type {?} */ NbButtonComponent.STATUS_INFO; /** @type {?} */ NbButtonComponent.STATUS_SUCCESS; /** @type {?} */ NbButtonComponent.STATUS_WARNING; /** @type {?} */ NbButtonComponent.STATUS_DANGER; /** @type {?} */ NbButtonComponent.SHAPE_RECTANGLE; /** @type {?} */ NbButtonComponent.SHAPE_ROUND; /** @type {?} */ NbButtonComponent.SHAPE_SEMI_ROUND; /** @type {?} */ NbButtonComponent.prototype.size; /** @type {?} */ NbButtonComponent.prototype.status; /** @type {?} */ NbButtonComponent.prototype.accent; /** @type {?} */ NbButtonComponent.prototype.shape; /** @type {?} */ NbButtonComponent.prototype.hero; /** @type {?} */ NbButtonComponent.prototype.outline; /** @type {?} */ NbButtonComponent.prototype.disabled; /** @type {?} */ NbButtonComponent.prototype.fullWidth; /** * @type {?} * @protected */ NbButtonComponent.prototype.renderer; /** * @type {?} * @protected */ NbButtonComponent.prototype.hostElement; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3RoZW1lLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2J1dHRvbi9idXR0b24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQU1BLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxZQUFZLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQThHbkQsTUFBTSxPQUFPLGlCQUFpQjs7Ozs7SUFxTDVCLFlBQ1ksUUFBbUIsRUFDbkIsV0FBb0M7UUFEcEMsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixnQkFBVyxHQUFYLFdBQVcsQ0FBeUI7UUF4RmhELGNBQVMsR0FBRyxLQUFLLENBQUM7SUF5RmYsQ0FBQzs7OztJQWxLSixJQUNJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssaUJBQWlCLENBQUMsV0FBVyxDQUFDO0lBQ3JELENBQUM7Ozs7SUFFRCxJQUNJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssaUJBQWlCLENBQUMsVUFBVSxDQUFDO0lBQ3BELENBQUM7Ozs7SUFFRCxJQUNJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssaUJBQWlCLENBQUMsV0FBVyxDQUFDO0lBQ3JELENBQUM7Ozs7SUFFRCxJQUNJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssaUJBQWlCLENBQUMsVUFBVSxDQUFDO0lBQ3BELENBQUM7Ozs7SUFFRCxJQUNJLE9BQU87UUFDVCxPQUFPLElB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Qzs7SUFFckMsaUNBQTJDOztJQUMzQyw4QkFBcUM7O0lBQ3JDLGlDQUEyQzs7SUFDM0MsaUNBQTJDOztJQUMzQyxnQ0FBeUM7O0lBRXpDLGtDQUE4Qzs7SUFDOUMsOEJBQXNDOztJQUN0QyxtQ0FBZ0Q7O0lBRWhELGlDQUFhOztJQUNiLG1DQUFlOztJQUNmLG1DQUFlOztJQUNmLGtDQUFjOztJQThEZCxpQ0FBNkM7O0lBQzdDLG9DQUFtRDs7SUFFbkQscUNBQ3FEOztJQVFyRCxzQ0FDa0I7Ozs7O0lBdUZoQixxQ0FBNkI7Ozs7O0lBQzdCLHdDQUE4QyIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCBBa3Zlby4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuICovXHJcblxyXG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBIb3N0QmluZGluZywgSG9zdExpc3RlbmVyLCBSZW5kZXJlcjIsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgY29udmVydFRvQm9vbFByb3BlcnR5IH0gZnJvbSAnLi4vaGVscGVycyc7XHJcblxyXG4vKlxyXG4gKiBCYXNpYyBidXR0b24gY29tcG9uZW50LlxyXG4gKlxyXG4gKiBEZWZhdWx0IGJ1dHRvbiBzaXplIGlzIGBtZWRpdW1gIGFuZCBzdGF0dXMgY29sb3IgaXMgYHByaW1hcnlgOlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKEJ1dHRvbiBTaG93Y2FzZSwgYnV0dG9uL2J1dHRvbi1zaG93Y2FzZS5jb21wb25lbnQpXHJcbiAqXHJcbiAqIGBgYGh0bWxcclxuICogPGJ1dHRvbiBuYkJ1dHRvbj48L2J1dHRvbj5cclxuICogYGBgXHJcbiAqICMjIyBJbnN0YWxsYXRpb25cclxuICpcclxuICogSW1wb3J0IGBOYkJ1dHRvbk1vZHVsZWAgdG8geW91ciBmZWF0dXJlIG1vZHVsZS5cclxuICogYGBgdHNcclxuICogQE5nTW9kdWxlKHtcclxuICogICBpbXBvcnRzOiBbXHJcbiAqICAgXHQvLyAuLi5cclxuICogICAgIE5iQnV0dG9uTW9kdWxlLFxyXG4gKiAgIF0sXHJcbiAqIH0pXHJcbiAqIGV4cG9ydCBjbGFzcyBQYWdlTW9kdWxlIHsgfVxyXG4gKiBgYGBcclxuICogIyMjIFVzYWdlXHJcbiAqXHJcbiAqIEJ1dHRvbnMgYXJlIGF2YWlsYWJsZSBpbiBtdWx0aXBsZSBjb2xvcnMgdXNpbmcgYHN0YXR1c2AgcHJvcGVydHk6XHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoQnV0dG9uIENvbG9ycywgYnV0dG9uL2J1dHRvbi1jb2xvcnMuY29tcG9uZW50Lmh0bWwpXHJcbiAqXHJcbiAqIFRoZXJlIGFyZSB0aHJlZSBidXR0b24gc2l6ZXM6XHJcbiAqXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoQnV0dG9uIFNpemVzLCBidXR0b24vYnV0dG9uLXNpemVzLmNvbXBvbmVudC5odG1sKVxyXG4gKlxyXG4gKiBBbmQgdHdvIGFkZGl0aW9uYWwgc3R5bGUgdHlwZXMgLSBgb3V0bGluZWA6XHJcbiAqXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoT3V0bGluZSBCdXR0b25zLCBidXR0b24vYnV0dG9uLW91dGxpbmUuY29tcG9uZW50Lmh0bWwpXHJcbiAqXHJcbiAqIGFuZCBgaGVyb2A6XHJcbiAqXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoQnV0dG9uIENvbG9ycywgYnV0dG9uL2J1dHRvbi1oZXJvLmNvbXBvbmVudC5odG1sKVxyXG4gKlxyXG4gKiBCdXR0b25zIGF2YWlsYWJsZSBpbiBkaWZmZXJlbnQgc2hhcGVzLCB3aGljaCBjb3VsZCBiZSBjb21iaW5lZCB3aXRoIHRoZSBvdGhlciBwcm9wZXJ0aWVzOlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKEJ1dHRvbiBTaGFwZXMsIGJ1dHRvbi9idXR0b24tc2hhcGVzLmNvbXBvbmVudClcclxuICpcclxuICogYG5iQnV0dG9uYCBjb3VsZCBiZSBhcHBsaWVkIHRvIHRoZSBmb2xsb3dpbmcgc2VsZWN0b3JzIC0gYGJ1dHRvbmAsIGBpbnB1dFt0eXBlPVwiYnV0dG9uXCJdYCwgYGlucHV0W3R5cGU9XCJzdWJtaXRcIl1gXHJcbiAqIGFuZCBgYWA6XHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoQnV0dG9uIEVsZW1lbnRzLCBidXR0b24vYnV0dG9uLXR5cGVzLmNvbXBvbmVudC5odG1sKVxyXG4gKlxyXG4gKiBCdXR0b24gY2FuIGJlIG1hZGUgYGZ1bGxXaWR0aGA6XHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoRnVsbCBXaWR0aCBCdXR0b24sIGJ1dHRvbi9idXR0b24tZnVsbC13aWR0aC5jb21wb25lbnQuaHRtbClcclxuICpcclxuICogQHN0eWxlc1xyXG4gKlxyXG4gKiBidG4tZmc6XHJcbiAqIGJ0bi1mb250LWZhbWlseTpcclxuICogYnRuLWxpbmUtaGVpZ2h0OlxyXG4gKiBidG4tZGlzYWJsZWQtb3BhY2l0eTpcclxuICogYnRuLWN1cnNvcjpcclxuICogYnRuLXByaW1hcnktYmc6XHJcbiAqIGJ0bi1zZWNvbmRhcnktYmc6XHJcbiAqIGJ0bi1pbmZvLWJnOlxyXG4gKiBidG4tc3VjY2Vzcy1iZzpcclxuICogYnRuLXdhcm5pbmctYmc6XHJcbiAqIGJ0bi1kYW5nZXItYmc6XHJcbiAqIGJ0bi1zZWNvbmRhcnktYm9yZGVyOlxyXG4gKiBidG4tc2Vjb25kYXJ5LWJvcmRlci13aWR0aDpcclxuICogYnRuLXBhZGRpbmcteS1sZzpcclxuICogYnRuLXBhZGRpbmcteC1sZzpcclxuICogYnRuLWZvbnQtc2l6ZS1sZzpcclxuICogYnRuLXBhZGRpbmcteS1tZDpcclxuICogYnRuLXBhZGRpbmcteC1tZDpcclxuICogYnRuLWZvbnQtc2l6ZS1tZDpcclxuICogYnRuLXBhZGRpbmcteS1zbTpcclxuICogYnRuLXBhZGRpbmcteC1zbTpcclxuICogYnRuLWZvbnQtc2l6ZS1zbTpcclxuICogYnRuLXBhZGRpbmcteS14czpcclxuICogYnRuLXBhZGRpbmcteC14czpcclxuICogYnRuLWZvbnQtc2l6ZS14czpcclxuICogYnRuLWJvcmRlci1yYWRpdXM6XHJcbiAqIGJ0bi1yZWN0YW5nbGUtYm9yZGVyLXJhZGl1czpcclxuICogYnRuLXNlbWktcm91bmQtYm9yZGVyLXJhZGl1czpcclxuICogYnRuLXJvdW5kLWJvcmRlci1yYWRpdXM6XHJcbiAqIGJ0bi1oZXJvLXNoYWRvdzpcclxuICogYnRuLWhlcm8tdGV4dC1zaGFkb3c6XHJcbiAqIGJ0bi1oZXJvLWJldmVsLXNpemU6XHJcbiAqIGJ0bi1oZXJvLWdsb3ctc2l6ZTpcclxuICogYnRuLWhlcm8tcHJpbWFyeS1nbG93LXNpemU6XHJcbiAqIGJ0bi1oZXJvLXN1Y2Nlc3MtZ2xvdy1zaXplOlxyXG4gKiBidG4taGVyby13YXJuaW5nLWdsb3ctc2l6ZTpcclxuICogYnRuLWhlcm8taW5mby1nbG93LXNpemU6XHJcbiAqIGJ0bi1oZXJvLWRhbmdlci1nbG93LXNpemU6XHJcbiAqIGJ0bi1oZXJvLXNlY29uZGFyeS1nbG93LXNpemU6XHJcbiAqIGJ0bi1oZXJvLWRlZ3JlZTpcclxuICogYnRuLWhlcm8tcHJpbWFyeS1kZWdyZWU6XHJcbiAqIGJ0bi1oZXJvLXN1Y2Nlc3MtZGVncmVlOlxyXG4gKiBidG4taGVyby13YXJuaW5nLWRlZ3JlZTpcclxuICogYnRuLWhlcm8taW5mby1kZWdyZWU6XHJcbiAqIGJ0bi1oZXJvLWRhbmdlci1kZWdyZWU6XHJcbiAqIGJ0bi1oZXJvLXNlY29uZGFyeS1kZWdyZWU6XHJcbiAqIGJ0bi1oZXJvLWJvcmRlci1yYWRpdXM6XHJcbiAqIGJ0bi1vdXRsaW5lLWZnOlxyXG4gKiBidG4tb3V0bGluZS1ob3Zlci1mZzpcclxuICogYnRuLW91dGxpbmUtZm9jdXMtZmc6XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2J1dHRvbltuYkJ1dHRvbl0sYVtuYkJ1dHRvbl0saW5wdXRbdHlwZT1cImJ1dHRvblwiXVtuYkJ1dHRvbl0saW5wdXRbdHlwZT1cInN1Ym1pdFwiXVtuYkJ1dHRvbl0nLFxyXG4gIHN0eWxlVXJsczogWycuL2J1dHRvbi5jb21wb25lbnQuc2NzcyddLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbiAgYCxcclxufSlcclxuZXhwb3J0IGNsYXNzIE5iQnV0dG9uQ29tcG9uZW50IHtcclxuXHJcbiAgc3RhdGljIHJlYWRvbmx5IFNJWkVfWFNNQUxMID0gJ3hzbWFsbCc7XHJcbiAgc3RhdGljIHJlYWRvbmx5IFNJWkVfU01BTEwgPSAnc21hbGwnO1xyXG4gIHN0YXRpYyByZWFkb25seSBTSVpFX01FRElVTSA9ICdtZWRpdW0nO1xyXG4gIHN0YXRpYyByZWFkb25seSBTSVpFX0xBUkdFID0gJ2xhcmdlJztcclxuXHJcbiAgc3RhdGljIHJlYWRvbmx5IFNUQVRVU19QUklNQVJZID0gJ3ByaW1hcnknO1xyXG4gIHN0YXRpYyByZWFkb25seSBTVEFUVVNfSU5GTyA9ICdpbmZvJztcclxuICBzdGF0aWMgcmVhZG9ubHkgU1RBVFVTX1NVQ0NFU1MgPSAnc3VjY2Vzcyc7XHJcbiAgc3RhdGljIHJlYWRvbmx5IFNUQVRVU19XQVJOSU5HID0gJ3dhcm5pbmcnO1xyXG4gIHN0YXRpYyByZWFkb25seSBTVEFUVVNfREFOR0VSID0gJ2Rhbmdlcic7XHJcblxyXG4gIHN0YXRpYyByZWFkb25seSBTSEFQRV9SRUNUQU5HTEUgPSAncmVjdGFuZ2xlJztcclxuICBzdGF0aWMgcmVhZG9ubHkgU0hBUEVfUk9VTkQgPSAncm91bmQnO1xyXG4gIHN0YXRpYyByZWFkb25seSBTSEFQRV9TRU1JX1JPVU5EID0gJ3NlbWktcm91bmQnO1xyXG5cclxuICBzaXplOiBzdHJpbmc7XHJcbiAgc3RhdHVzOiBzdHJpbmc7XHJcbiAgYWNjZW50OiBzdHJpbmc7XHJcbiAgc2hhcGU6IHN0cmluZztcclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5idG4teHNtYWxsJylcclxuICBnZXQgeHNtYWxsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2l6ZSA9PT0gTmJCdXR0b25Db21wb25lbnQuU0laRV9YU01BTEw7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmJ0bi1zbWFsbCcpXHJcbiAgZ2V0IHNtYWxsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2l6ZSA9PT0gTmJCdXR0b25Db21wb25lbnQuU0laRV9TTUFMTDtcclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYnRuLW1lZGl1bScpXHJcbiAgZ2V0IG1lZGl1bSgpIHtcclxuICAgIHJldHVybiB0aGlzLnNpemUgPT09IE5iQnV0dG9uQ29tcG9uZW50LlNJWkVfTUVESVVNO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5idG4tbGFyZ2UnKVxyXG4gIGdldCBsYXJnZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnNpemUgPT09IE5iQnV0dG9uQ29tcG9uZW50LlNJWkVfTEFSR0U7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmJ0bi1wcmltYXJ5JylcclxuICBnZXQgcHJpbWFyeSgpIHtcclxuICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gTmJCdXR0b25Db21wb25lbnQuU1RBVFVTX1BSSU1BUlk7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmJ0bi1pbmZvJylcclxuICBnZXQgaW5mbygpIHtcclxuICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gTmJCdXR0b25Db21wb25lbnQuU1RBVFVTX0lORk87XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmJ0bi1zdWNjZXNzJylcclxuICBnZXQgc3VjY2VzcygpIHtcclxuICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gTmJCdXR0b25Db21wb25lbnQuU1RBVFVTX1NVQ0NFU1M7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmJ0bi13YXJuaW5nJylcclxuICBnZXQgd2FybmluZygpIHtcclxuICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gTmJCdXR0b25Db21wb25lbnQuU1RBVFVTX1dBUk5JTkc7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmJ0bi1kYW5nZXInKVxyXG4gIGdldCBkYW5nZXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0dXMgPT09IE5iQnV0dG9uQ29tcG9uZW50LlNUQVRVU19EQU5HRVI7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmJ0bi1yZWN0YW5nbGUnKVxyXG4gIGdldCByZWN0YW5nbGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaGFwZSA9PT0gTmJCdXR0b25Db21wb25lbnQuU0hBUEVfUkVDVEFOR0xFO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5idG4tcm91bmQnKVxyXG4gIGdldCByb3VuZCgpIHtcclxuICAgIHJldHVybiB0aGlzLnNoYXBlID09PSBOYkJ1dHRvbkNvbXBvbmVudC5TSEFQRV9ST1VORDtcclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYnRuLXNlbWktcm91bmQnKVxyXG4gIGdldCBzZW1pUm91bmQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaGFwZSA9PT0gTmJCdXR0b25Db21wb25lbnQuU0hBUEVfU0VNSV9ST1VORDtcclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYnRuLWhlcm8nKSBoZXJvOiBib29sZWFuO1xyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYnRuLW91dGxpbmUnKSBvdXRsaW5lOiBib29sZWFuO1xyXG5cclxuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1kaXNhYmxlZCcpXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5idG4tZGlzYWJsZWQnKSBkaXNhYmxlZDogYm9vbGVhbjtcclxuXHJcbiAgLy8gaXNzdWUgIzc5NFxyXG4gIEBIb3N0QmluZGluZygnYXR0ci50YWJpbmRleCcpXHJcbiAgZ2V0IHRhYmJhYmxlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlZCA/ICctMScgOiAnMCc7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmJ0bi1mdWxsLXdpZHRoJylcclxuICBmdWxsV2lkdGggPSBmYWxzZTtcclxuXHJcbiAgLypcclxuICAgKiBCdXR0b24gc2l6ZSwgYXZhaWxhYmxlIHNpemVzOlxyXG4gICAqIGB4eHNtYWxsYCwgYHhzbWFsbGAsIGBzbWFsbGAsIGBtZWRpdW1gLCBgbGFyZ2VgXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbFxyXG4gICAqL1xyXG4gIEBJbnB1dCgnc2l6ZScpXHJcbiAgcHJpdmF0ZSBzZXQgc2V0U2l6ZSh2YWw6IHN0cmluZykge1xyXG4gICAgdGhpcy5zaXplID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBCdXR0b24gc3RhdHVzIChhZGRzIHNwZWNpZmljIHN0eWxlcyk6XHJcbiAgICogYHByaW1hcnlgLCBgaW5mb2AsIGBzdWNjZXNzYCwgYHdhcm5pbmdgLCBgZGFuZ2VyYFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWxcclxuICAgKi9cclxuICBASW5wdXQoJ3N0YXR1cycpXHJcbiAgcHJpdmF0ZSBzZXQgc2V0U3RhdHVzKHZhbDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnN0YXR1cyA9IHZhbDtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogQnV0dG9uIHNoYXBlczogYHJlY3RhbmdsZWAsIGByb3VuZGAsIGBzZW1pLXJvdW5kYFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWxcclxuICAgKi9cclxuICBASW5wdXQoJ3NoYXBlJylcclxuICBwcml2YXRlIHNldCBzZXRTaGFwZSh2YWw6IHN0cmluZykge1xyXG4gICAgdGhpcy5zaGFwZSA9IHZhbDtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogQWRkcyBgaGVyb2Agc3R5bGVzXHJcbiAgICogQHBhcmFtIHtib29sZWFufSB2YWxcclxuICAgKi9cclxuICBASW5wdXQoJ2hlcm8nKVxyXG4gIHNldCBzZXRIZXJvKHZhbDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5oZXJvID0gY29udmVydFRvQm9vbFByb3BlcnR5KHZhbCk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIERpc2FibGVzIHRoZSBidXR0b25cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbFxyXG4gICAqL1xyXG4gIEBJbnB1dCgnZGlzYWJsZWQnKVxyXG4gIHNldCBzZXREaXNhYmxlZCh2YWw6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuZGlzYWJsZWQgPSBjb252ZXJ0VG9Cb29sUHJvcGVydHkodmFsKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LCAnZGlzYWJsZWQnLCB0aGlzLmRpc2FibGVkKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogSWYgc2V0IGVsZW1lbnQgd2lsbCBmaWxsIGl0cyBjb250YWluZXJcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59XHJcbiAgICovXHJcbiAgQElucHV0KCdmdWxsV2lkdGgnKVxyXG4gIHNldCBzZXRGdWxsV2lkdGgodmFsdWUpIHtcclxuICAgIHRoaXMuZnVsbFdpZHRoID0gY29udmVydFRvQm9vbFByb3BlcnR5KHZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogQWRkcyBgb3V0bGluZWAgc3R5bGVzXHJcbiAgICogQHBhcmFtIHtib29sZWFufSB2YWxcclxuICAgKi9cclxuICBASW5wdXQoJ291dGxpbmUnKVxyXG4gIHNldCBzZXRPdXRsaW5lKHZhbDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5vdXRsaW5lID0gY29udmVydFRvQm9vbFByb3BlcnR5KHZhbCk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICogS2VlcCB0aGlzIGhhbmRsZXIgdG8gcGFydGlhbGx5IHN1cHBvcnQgYW5jaG9yIGRpc2FibGluZy5cclxuICAgKiBVbmxpa2UgYnV0dG9uLCBhbmNob3IgZG9lc24ndCBoYXZlICdkaXNhYmxlZCcgRE9NIHByb3BlcnR5LFxyXG4gICAqIHNvIGhhbmRsZXIgd2lsbCBiZSBjYWxsZWQgYW55d2F5LiBXZSBwcmV2ZW50aW5nIG5hdmlnYXRpb24gYW5kIGJ1YmJsaW5nLlxyXG4gICAqIERpc2FibGluZyBpcyBwYXJ0aWFsIGR1ZSB0byBjbGljayBoYW5kbGVycyBwcmVjZWRlbmNlLiBDb25zaWRlciBleGFtcGxlOlxyXG4gICAqIDxhIG5iQnV0dG9uIFtkaXNhYmxlZF09XCJ0cnVlXCIgKGNsaWNrKT1cImNsaWNrSGFuZGxlcigpXCI+Li4uPC9hPlxyXG4gICAqICdjbGlja0hhbmRsZXInIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBvdXIgaG9zdCBsaXN0ZW5lciBiZWxvdy4gV2UgY2FuJ3QgcHJldmVudFxyXG4gICAqIHN1Y2ggaGFuZGxlcnMgY2FsbC5cclxuICAgKi9cclxuICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pXHJcbiAgb25DbGljayhldmVudDogRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcm90ZWN0ZWQgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgIHByb3RlY3RlZCBob3N0RWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXHJcbiAgKSB7fVxyXG59XHJcbiJdfQ==