@ng-bootstrap/ng-bootstrap
Version:
Angular powered Bootstrap
175 lines • 16.3 kB
JavaScript
import { ChangeDetectionStrategy, Component, HostBinding, inject, Input, ViewEncapsulation } from '@angular/core';
import { getValueInRange, isNumber } from '../util/util';
import { NgbProgressbarConfig } from './progressbar-config';
import { PercentPipe } from '@angular/common';
import * as i0 from "@angular/core";
/**
* A directive that provides feedback on the progress of a workflow or an action.
*/
export class NgbProgressbar {
/**
* The maximal value to be displayed in the progress bar.
*
* Should be a positive number. Will default to 100 otherwise.
*/
set max(max) {
this._max = !isNumber(max) || max <= 0 ? 100 : max;
}
get max() {
return this._max;
}
constructor() {
this._config = inject(NgbProgressbarConfig);
this.stacked = inject(NgbProgressbarStacked, { optional: true });
/**
* If `true`, the stripes on the progress bar are animated.
*
* Takes effect only for browsers supporting CSS3 animations, and if `striped` is `true`.
*/
this.animated = this._config.animated;
/**
* The accessible progress bar name.
*
* @since 13.1.0
*/
this.ariaLabel = this._config.ariaLabel;
/**
* If `true`, the progress bars will be displayed as striped.
*/
this.striped = this._config.striped;
/**
* If `true`, the current percentage will be shown in the `xx%` format.
*/
this.showValue = this._config.showValue;
/**
* Optional text variant type of the progress bar.
*
* Supports types based on Bootstrap background color variants, like:
* `"success"`, `"info"`, `"warning"`, `"danger"`, `"primary"`, `"secondary"`, `"dark"` and so on.
*
* @since 5.2.0
*/
this.textType = this._config.textType;
/**
* The type of the progress bar.
*
* Supports types based on Bootstrap background color variants, like:
* `"success"`, `"info"`, `"warning"`, `"danger"`, `"primary"`, `"secondary"`, `"dark"` and so on.
*/
this.type = this._config.type;
/**
* The current value for the progress bar.
*
* Should be in the `[0, max]` range.
*/
this.value = 0;
/**
* The height of the progress bar.
*
* Accepts any valid CSS height values, ex. `"2rem"`
*/
this.height = this._config.height;
this.max = this._config.max;
}
getValue() {
return getValueInRange(this.value, this.max);
}
getPercentValue() {
return (100 * this.getValue()) / this.max;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: NgbProgressbar, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.0.0", type: NgbProgressbar, isStandalone: true, selector: "ngb-progressbar", inputs: { max: "max", animated: "animated", ariaLabel: "ariaLabel", striped: "striped", showValue: "showValue", textType: "textType", type: "type", value: "value", height: "height" }, host: { attributes: { "role": "progressbar", "aria-valuemin": "0" }, properties: { "attr.aria-valuenow": "getValue()", "attr.aria-valuemax": "max", "attr.aria-label": "ariaLabel", "style.width.%": "stacked ? getPercentValue() : null", "style.height": "this.height" }, classAttribute: "progress" }, ngImport: i0, template: `
<div
class="progress-bar{{ type ? (textType ? ' bg-' + type : ' text-bg-' + type) : '' }}{{
textType ? ' text-' + textType : ''
}}"
[class.progress-bar-animated]="animated"
[class.progress-bar-striped]="striped"
[style.width.%]="!stacked ? getPercentValue() : null"
>
@if (showValue) {
<span i18n="@@ngb.progressbar.value">{{ getValue() / max | percent }}</span>
}
<ng-content />
</div>
`, isInline: true, dependencies: [{ kind: "pipe", type: PercentPipe, name: "percent" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: NgbProgressbar, decorators: [{
type: Component,
args: [{
selector: 'ngb-progressbar',
standalone: true,
imports: [PercentPipe],
changeDetection: ChangeDetectionStrategy.OnPush,
encapsulation: ViewEncapsulation.None,
host: {
class: 'progress',
role: 'progressbar',
'[attr.aria-valuenow]': 'getValue()',
'aria-valuemin': '0',
'[attr.aria-valuemax]': 'max',
'[attr.aria-label]': 'ariaLabel',
'[style.width.%]': 'stacked ? getPercentValue() : null',
},
template: `
<div
class="progress-bar{{ type ? (textType ? ' bg-' + type : ' text-bg-' + type) : '' }}{{
textType ? ' text-' + textType : ''
}}"
[class.progress-bar-animated]="animated"
[class.progress-bar-striped]="striped"
[style.width.%]="!stacked ? getPercentValue() : null"
>
@if (showValue) {
<span i18n="@@ngb.progressbar.value">{{ getValue() / max | percent }}</span>
}
<ng-content />
</div>
`,
}]
}], ctorParameters: () => [], propDecorators: { max: [{
type: Input
}], animated: [{
type: Input
}], ariaLabel: [{
type: Input
}], striped: [{
type: Input
}], showValue: [{
type: Input
}], textType: [{
type: Input
}], type: [{
type: Input
}], value: [{
type: Input,
args: [{ required: true }]
}], height: [{
type: Input
}, {
type: HostBinding,
args: ['style.height']
}] } });
/**
* A directive that allow to stack progress bars.
*
* @since 16.0.0
*/
export class NgbProgressbarStacked {
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: NgbProgressbarStacked, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.0", type: NgbProgressbarStacked, isStandalone: true, selector: "ngb-progressbar-stacked", host: { classAttribute: "progress-stacked" }, ngImport: i0, template: `<ng-content></ng-content>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: NgbProgressbarStacked, decorators: [{
type: Component,
args: [{
selector: 'ngb-progressbar-stacked',
standalone: true,
changeDetection: ChangeDetectionStrategy.OnPush,
encapsulation: ViewEncapsulation.None,
host: {
class: 'progress-stacked',
},
template: `<ng-content></ng-content>`,
}]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3Jlc3NiYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcHJvZ3Jlc3NiYXIvcHJvZ3Jlc3NiYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsSCxPQUFPLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBRTlDOztHQUVHO0FBZ0NILE1BQU0sT0FBTyxjQUFjO0lBSzFCOzs7O09BSUc7SUFDSCxJQUNJLEdBQUcsQ0FBQyxHQUFXO1FBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDcEQsQ0FBQztJQUVELElBQUksR0FBRztRQUNOLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNsQixDQUFDO0lBMEREO1FBMUVRLFlBQU8sR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUN4QyxZQUFPLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFpQm5FOzs7O1dBSUc7UUFDTSxhQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFFMUM7Ozs7V0FJRztRQUNNLGNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztRQUU1Qzs7V0FFRztRQUNNLFlBQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUV4Qzs7V0FFRztRQUNNLGNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztRQUU1Qzs7Ozs7OztXQU9HO1FBQ00sYUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBRTFDOzs7OztXQUtHO1FBQ00sU0FBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBRWxDOzs7O1dBSUc7UUFDd0IsVUFBSyxHQUFHLENBQUMsQ0FBQztRQUVyQzs7OztXQUlHO1FBQ21DLFdBQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUdsRSxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO0lBQzdCLENBQUM7SUFFRCxRQUFRO1FBQ1AsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELGVBQWU7UUFDZCxPQUFPLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDM0MsQ0FBQzs4R0FyRlcsY0FBYztrR0FBZCxjQUFjLDZpQkFoQmhCOzs7Ozs7Ozs7Ozs7OztFQWNULHVEQTFCUyxXQUFXOzsyRkE0QlQsY0FBYztrQkEvQjFCLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLGlCQUFpQjtvQkFDM0IsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxDQUFDLFdBQVcsQ0FBQztvQkFDdEIsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO29CQUNyQyxJQUFJLEVBQUU7d0JBQ0wsS0FBSyxFQUFFLFVBQVU7d0JBQ2pCLElBQUksRUFBRSxhQUFhO3dCQUNuQixzQkFBc0IsRUFBRSxZQUFZO3dCQUNwQyxlQUFlLEVBQUUsR0FBRzt3QkFDcEIsc0JBQXNCLEVBQUUsS0FBSzt3QkFDN0IsbUJBQW1CLEVBQUUsV0FBVzt3QkFDaEMsaUJBQWlCLEVBQUUsb0NBQW9DO3FCQUN2RDtvQkFDRCxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7O0VBY1Q7aUJBQ0Q7d0RBWUksR0FBRztzQkFETixLQUFLO2dCQWNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBT0csU0FBUztzQkFBakIsS0FBSztnQkFLRyxPQUFPO3NCQUFmLEtBQUs7Z0JBS0csU0FBUztzQkFBakIsS0FBSztnQkFVRyxRQUFRO3NCQUFoQixLQUFLO2dCQVFHLElBQUk7c0JBQVosS0FBSztnQkFPcUIsS0FBSztzQkFBL0IsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBT2EsTUFBTTtzQkFBM0MsS0FBSzs7c0JBQUksV0FBVzt1QkFBQyxjQUFjOztBQWVyQzs7OztHQUlHO0FBV0gsTUFBTSxPQUFPLHFCQUFxQjs4R0FBckIscUJBQXFCO2tHQUFyQixxQkFBcUIsaUlBRnZCLDJCQUEyQjs7MkZBRXpCLHFCQUFxQjtrQkFWakMsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUseUJBQXlCO29CQUNuQyxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO29CQUNyQyxJQUFJLEVBQUU7d0JBQ0wsS0FBSyxFQUFFLGtCQUFrQjtxQkFDekI7b0JBQ0QsUUFBUSxFQUFFLDJCQUEyQjtpQkFDckMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBIb3N0QmluZGluZywgaW5qZWN0LCBJbnB1dCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGdldFZhbHVlSW5SYW5nZSwgaXNOdW1iZXIgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IHsgTmdiUHJvZ3Jlc3NiYXJDb25maWcgfSBmcm9tICcuL3Byb2dyZXNzYmFyLWNvbmZpZyc7XG5pbXBvcnQgeyBQZXJjZW50UGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbi8qKlxuICogQSBkaXJlY3RpdmUgdGhhdCBwcm92aWRlcyBmZWVkYmFjayBvbiB0aGUgcHJvZ3Jlc3Mgb2YgYSB3b3JrZmxvdyBvciBhbiBhY3Rpb24uXG4gKi9cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ25nYi1wcm9ncmVzc2JhcicsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdGltcG9ydHM6IFtQZXJjZW50UGlwZV0sXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuXHRlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuXHRob3N0OiB7XG5cdFx0Y2xhc3M6ICdwcm9ncmVzcycsXG5cdFx0cm9sZTogJ3Byb2dyZXNzYmFyJyxcblx0XHQnW2F0dHIuYXJpYS12YWx1ZW5vd10nOiAnZ2V0VmFsdWUoKScsXG5cdFx0J2FyaWEtdmFsdWVtaW4nOiAnMCcsXG5cdFx0J1thdHRyLmFyaWEtdmFsdWVtYXhdJzogJ21heCcsXG5cdFx0J1thdHRyLmFyaWEtbGFiZWxdJzogJ2FyaWFMYWJlbCcsXG5cdFx0J1tzdHlsZS53aWR0aC4lXSc6ICdzdGFja2VkID8gZ2V0UGVyY2VudFZhbHVlKCkgOiBudWxsJyxcblx0fSxcblx0dGVtcGxhdGU6IGBcblx0XHQ8ZGl2XG5cdFx0XHRjbGFzcz1cInByb2dyZXNzLWJhcnt7IHR5cGUgPyAodGV4dFR5cGUgPyAnIGJnLScgKyB0eXBlIDogJyB0ZXh0LWJnLScgKyB0eXBlKSA6ICcnIH19e3tcblx0XHRcdFx0dGV4dFR5cGUgPyAnIHRleHQtJyArIHRleHRUeXBlIDogJydcblx0XHRcdH19XCJcblx0XHRcdFtjbGFzcy5wcm9ncmVzcy1iYXItYW5pbWF0ZWRdPVwiYW5pbWF0ZWRcIlxuXHRcdFx0W2NsYXNzLnByb2dyZXNzLWJhci1zdHJpcGVkXT1cInN0cmlwZWRcIlxuXHRcdFx0W3N0eWxlLndpZHRoLiVdPVwiIXN0YWNrZWQgPyBnZXRQZXJjZW50VmFsdWUoKSA6IG51bGxcIlxuXHRcdD5cblx0XHRcdEBpZiAoc2hvd1ZhbHVlKSB7XG5cdFx0XHRcdDxzcGFuIGkxOG49XCJAQG5nYi5wcm9ncmVzc2Jhci52YWx1ZVwiPnt7IGdldFZhbHVlKCkgLyBtYXggfCBwZXJjZW50IH19PC9zcGFuPlxuXHRcdFx0fVxuXHRcdFx0PG5nLWNvbnRlbnQgLz5cblx0XHQ8L2Rpdj5cblx0YCxcbn0pXG5leHBvcnQgY2xhc3MgTmdiUHJvZ3Jlc3NiYXIge1xuXHRwcml2YXRlIF9jb25maWcgPSBpbmplY3QoTmdiUHJvZ3Jlc3NiYXJDb25maWcpO1xuXHRwdWJsaWMgc3RhY2tlZCA9IGluamVjdChOZ2JQcm9ncmVzc2JhclN0YWNrZWQsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cdHByaXZhdGUgX21heDogbnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBUaGUgbWF4aW1hbCB2YWx1ZSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHByb2dyZXNzIGJhci5cblx0ICpcblx0ICogU2hvdWxkIGJlIGEgcG9zaXRpdmUgbnVtYmVyLiBXaWxsIGRlZmF1bHQgdG8gMTAwIG90aGVyd2lzZS5cblx0ICovXG5cdEBJbnB1dCgpXG5cdHNldCBtYXgobWF4OiBudW1iZXIpIHtcblx0XHR0aGlzLl9tYXggPSAhaXNOdW1iZXIobWF4KSB8fCBtYXggPD0gMCA/IDEwMCA6IG1heDtcblx0fVxuXG5cdGdldCBtYXgoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5fbWF4O1xuXHR9XG5cblx0LyoqXG5cdCAqIElmIGB0cnVlYCwgdGhlIHN0cmlwZXMgb24gdGhlIHByb2dyZXNzIGJhciBhcmUgYW5pbWF0ZWQuXG5cdCAqXG5cdCAqIFRha2VzIGVmZmVjdCBvbmx5IGZvciBicm93c2VycyBzdXBwb3J0aW5nIENTUzMgYW5pbWF0aW9ucywgYW5kIGlmIGBzdHJpcGVkYCBpcyBgdHJ1ZWAuXG5cdCAqL1xuXHRASW5wdXQoKSBhbmltYXRlZCA9IHRoaXMuX2NvbmZpZy5hbmltYXRlZDtcblxuXHQvKipcblx0ICogVGhlIGFjY2Vzc2libGUgcHJvZ3Jlc3MgYmFyIG5hbWUuXG5cdCAqXG5cdCAqIEBzaW5jZSAxMy4xLjBcblx0ICovXG5cdEBJbnB1dCgpIGFyaWFMYWJlbCA9IHRoaXMuX2NvbmZpZy5hcmlhTGFiZWw7XG5cblx0LyoqXG5cdCAqIElmIGB0cnVlYCwgdGhlIHByb2dyZXNzIGJhcnMgd2lsbCBiZSBkaXNwbGF5ZWQgYXMgc3RyaXBlZC5cblx0ICovXG5cdEBJbnB1dCgpIHN0cmlwZWQgPSB0aGlzLl9jb25maWcuc3RyaXBlZDtcblxuXHQvKipcblx0ICogSWYgYHRydWVgLCB0aGUgY3VycmVudCBwZXJjZW50YWdlIHdpbGwgYmUgc2hvd24gaW4gdGhlIGB4eCVgIGZvcm1hdC5cblx0ICovXG5cdEBJbnB1dCgpIHNob3dWYWx1ZSA9IHRoaXMuX2NvbmZpZy5zaG93VmFsdWU7XG5cblx0LyoqXG5cdCAqIE9wdGlvbmFsIHRleHQgdmFyaWFudCB0eXBlIG9mIHRoZSBwcm9ncmVzcyBiYXIuXG5cdCAqXG5cdCAqIFN1cHBvcnRzIHR5cGVzIGJhc2VkIG9uIEJvb3RzdHJhcCBiYWNrZ3JvdW5kIGNvbG9yIHZhcmlhbnRzLCBsaWtlOlxuXHQgKiAgYFwic3VjY2Vzc1wiYCwgYFwiaW5mb1wiYCwgYFwid2FybmluZ1wiYCwgYFwiZGFuZ2VyXCJgLCBgXCJwcmltYXJ5XCJgLCBgXCJzZWNvbmRhcnlcImAsIGBcImRhcmtcImAgYW5kIHNvIG9uLlxuXHQgKlxuXHQgKiBAc2luY2UgNS4yLjBcblx0ICovXG5cdEBJbnB1dCgpIHRleHRUeXBlID0gdGhpcy5fY29uZmlnLnRleHRUeXBlO1xuXG5cdC8qKlxuXHQgKiBUaGUgdHlwZSBvZiB0aGUgcHJvZ3Jlc3MgYmFyLlxuXHQgKlxuXHQgKiBTdXBwb3J0cyB0eXBlcyBiYXNlZCBvbiBCb290c3RyYXAgYmFja2dyb3VuZCBjb2xvciB2YXJpYW50cywgbGlrZTpcblx0ICogIGBcInN1Y2Nlc3NcImAsIGBcImluZm9cImAsIGBcIndhcm5pbmdcImAsIGBcImRhbmdlclwiYCwgYFwicHJpbWFyeVwiYCwgYFwic2Vjb25kYXJ5XCJgLCBgXCJkYXJrXCJgIGFuZCBzbyBvbi5cblx0ICovXG5cdEBJbnB1dCgpIHR5cGUgPSB0aGlzLl9jb25maWcudHlwZTtcblxuXHQvKipcblx0ICogVGhlIGN1cnJlbnQgdmFsdWUgZm9yIHRoZSBwcm9ncmVzcyBiYXIuXG5cdCAqXG5cdCAqIFNob3VsZCBiZSBpbiB0aGUgYFswLCBtYXhdYCByYW5nZS5cblx0ICovXG5cdEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIHZhbHVlID0gMDtcblxuXHQvKipcblx0ICogVGhlIGhlaWdodCBvZiB0aGUgcHJvZ3Jlc3MgYmFyLlxuXHQgKlxuXHQgKiBBY2NlcHRzIGFueSB2YWxpZCBDU1MgaGVpZ2h0IHZhbHVlcywgZXguIGBcIjJyZW1cImBcblx0ICovXG5cdEBJbnB1dCgpIEBIb3N0QmluZGluZygnc3R5bGUuaGVpZ2h0JykgaGVpZ2h0ID0gdGhpcy5fY29uZmlnLmhlaWdodDtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHR0aGlzLm1heCA9IHRoaXMuX2NvbmZpZy5tYXg7XG5cdH1cblxuXHRnZXRWYWx1ZSgpIHtcblx0XHRyZXR1cm4gZ2V0VmFsdWVJblJhbmdlKHRoaXMudmFsdWUsIHRoaXMubWF4KTtcblx0fVxuXG5cdGdldFBlcmNlbnRWYWx1ZSgpIHtcblx0XHRyZXR1cm4gKDEwMCAqIHRoaXMuZ2V0VmFsdWUoKSkgLyB0aGlzLm1heDtcblx0fVxufVxuXG4vKipcbiAqIEEgZGlyZWN0aXZlIHRoYXQgYWxsb3cgdG8gc3RhY2sgcHJvZ3Jlc3MgYmFycy5cbiAqXG4gKiBAc2luY2UgMTYuMC4wXG4gKi9cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ25nYi1wcm9ncmVzc2Jhci1zdGFja2VkJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0Y2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG5cdGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG5cdGhvc3Q6IHtcblx0XHRjbGFzczogJ3Byb2dyZXNzLXN0YWNrZWQnLFxuXHR9LFxuXHR0ZW1wbGF0ZTogYDxuZy1jb250ZW50PjwvbmctY29udGVudD5gLFxufSlcbmV4cG9ydCBjbGFzcyBOZ2JQcm9ncmVzc2JhclN0YWNrZWQge31cbiJdfQ==