carbon-components-angular
Version:
Next generation components
279 lines • 21.2 kB
JavaScript
import { Checkbox, CHECKBOX_GROUP_HOST } from "carbon-components-angular/checkbox";
import { Component, Inject, Input, Optional, HostBinding, TemplateRef } from "@angular/core";
import { NG_VALUE_ACCESSOR } from "@angular/forms";
import * as i0 from "@angular/core";
import * as i1 from "carbon-components-angular/i18n";
import * as i2 from "@angular/common";
/**
* @deprecated since v5 - Use boolean
* Defines the set of states for a toggle component.
*/
export var ToggleState;
(function (ToggleState) {
ToggleState[ToggleState["Init"] = 0] = "Init";
ToggleState[ToggleState["Checked"] = 1] = "Checked";
ToggleState[ToggleState["Unchecked"] = 2] = "Unchecked";
})(ToggleState || (ToggleState = {}));
/**
* @todo - Toggle component will no longer extend `Checkbox` component as of v6
* Toggle is no longer repies on using checkbox, so doesn't make sense for us to continue inheriting ALL checkbox
* component attributes.
*/
/**
* Get started with importing the module:
*
* ```typescript
* import { ToggleModule } from 'carbon-components-angular';
* ```
*
* ```html
* <cds-toggle [(ngModel)]="toggleState">Toggle</cds-toggle>
* ```
*
* [See demo](../../?path=/story/components-toggle--basic)
*/
export class Toggle extends Checkbox {
/**
* Creates an instance of Toggle.
*/
constructor(changeDetectorRef, hostGroup, i18n) {
super(changeDetectorRef, hostGroup);
this.changeDetectorRef = changeDetectorRef;
this.i18n = i18n;
/**
* Size of the toggle component.
*/
this.size = "md";
/**
* Set to `true` to hide the toggle label & set toggle on/off text to label.
*/
this.hideLabel = false;
this.skeleton = false;
this.toggleClass = true;
/**
* The unique id allocated to the `Toggle`.
*/
this.id = "toggle-" + Toggle.toggleCount;
this._offValues = this.i18n.getOverridable("TOGGLE.OFF");
this._onValues = this.i18n.getOverridable("TOGGLE.ON");
Toggle.toggleCount++;
}
/**
* Text that is set on the left side of the toggle.
*/
set offText(value) {
this._offValues.override(value);
}
get offText() {
return this._offValues.value;
}
/**
* Text that is set on the right side of the toggle.
*/
set onText(value) {
this._onValues.override(value);
}
get onText() {
return this._onValues.value;
}
get disabledClass() {
return this.disabled;
}
get formItem() {
return !this.skeleton;
}
/**
* `ControlValueAccessor` method to programmatically disable the toggle input.
*
* ex: `this.formGroup.get("myToggle").disable();`
*
* @param isDisabled `true` to disable the input
*/
setDisabledState(isDisabled) {
this.disabled = isDisabled;
}
getOffText() {
return this._offValues.subject;
}
getOnText() {
return this._onValues.subject;
}
getCheckedText() {
if (this.checked) {
return this._onValues.subject;
}
return this._offValues.subject;
}
/**
* Creates instance of `ToggleChange` used to propagate the change event.
*/
emitChangeEvent() {
this.checkedChange.emit(this.checked);
this.propagateChange(this.checked);
}
isTemplate(value) {
return value instanceof TemplateRef;
}
}
/**
* Variable used for creating unique ids for toggle components.
*/
Toggle.toggleCount = 0;
Toggle.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: Toggle, deps: [{ token: i0.ChangeDetectorRef }, { token: CHECKBOX_GROUP_HOST, optional: true }, { token: i1.I18n }], target: i0.ɵɵFactoryTarget.Component });
Toggle.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: Toggle, selector: "cds-toggle, ibm-toggle", inputs: { offText: "offText", onText: "onText", label: "label", size: "size", hideLabel: "hideLabel", ariaLabel: "ariaLabel", skeleton: "skeleton" }, host: { properties: { "class.cds--toggle--skeleton": "this.skeleton", "class.cds--toggle": "this.toggleClass", "class.cds--toggle--disabled": "this.disabledClass", "class.cds--form-item": "this.formItem" } }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: Toggle,
multi: true
}
], usesInheritance: true, ngImport: i0, template: `
<ng-container *ngIf="!skeleton; else skeletonTemplate;">
<button
class="cds--toggle__button"
[disabled]="disabled"
[id]="id"
role="switch"
type="button"
[attr.aria-checked]="checked"
(click)="onClick($event)"
[attr.aria-label]="ariaLabel">
</button>
<label
class="cds--toggle__label"
[for]="id">
<span
class="cds--toggle__label-text"
[ngClass]="{
'cds--visually-hidden': hideLabel
}">
<ng-container *ngIf="!isTemplate(label)">{{label}}</ng-container>
<ng-template *ngIf="isTemplate(label)" [ngTemplateOutlet]="label"></ng-template>
</span>
<div
class="cds--toggle__appearance"
[ngClass]="{
'cds--toggle__appearance--sm': size === 'sm'
}">
<div
class="cds--toggle__switch"
[ngClass]="{
'cds--toggle__switch--checked': checked
}">
<svg
*ngIf="size === 'sm'"
class='cds--toggle__check'
width="6px"
height="5px"
viewBox="0 0 6 5">
<path d="M2.2 2.7L5 0 6 1 2.2 5 0 2.7 1 1.5z" />
</svg>
</div>
<span class="cds--toggle__text">
{{(hideLabel ? label : (getCheckedText() | async))}}
</span>
</div>
</label>
</ng-container>
<ng-template #skeletonTemplate>
<div class="cds--toggle__skeleton-circle"></div>
<div class="cds--toggle__skeleton-rectangle"></div>
</ng-template>
`, isInline: true, dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: Toggle, decorators: [{
type: Component,
args: [{
selector: "cds-toggle, ibm-toggle",
template: `
<ng-container *ngIf="!skeleton; else skeletonTemplate;">
<button
class="cds--toggle__button"
[disabled]="disabled"
[id]="id"
role="switch"
type="button"
[attr.aria-checked]="checked"
(click)="onClick($event)"
[attr.aria-label]="ariaLabel">
</button>
<label
class="cds--toggle__label"
[for]="id">
<span
class="cds--toggle__label-text"
[ngClass]="{
'cds--visually-hidden': hideLabel
}">
<ng-container *ngIf="!isTemplate(label)">{{label}}</ng-container>
<ng-template *ngIf="isTemplate(label)" [ngTemplateOutlet]="label"></ng-template>
</span>
<div
class="cds--toggle__appearance"
[ngClass]="{
'cds--toggle__appearance--sm': size === 'sm'
}">
<div
class="cds--toggle__switch"
[ngClass]="{
'cds--toggle__switch--checked': checked
}">
<svg
*ngIf="size === 'sm'"
class='cds--toggle__check'
width="6px"
height="5px"
viewBox="0 0 6 5">
<path d="M2.2 2.7L5 0 6 1 2.2 5 0 2.7 1 1.5z" />
</svg>
</div>
<span class="cds--toggle__text">
{{(hideLabel ? label : (getCheckedText() | async))}}
</span>
</div>
</label>
</ng-container>
<ng-template #skeletonTemplate>
<div class="cds--toggle__skeleton-circle"></div>
<div class="cds--toggle__skeleton-rectangle"></div>
</ng-template>
`,
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: Toggle,
multi: true
}
]
}]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [CHECKBOX_GROUP_HOST]
}] }, { type: i1.I18n }]; }, propDecorators: { offText: [{
type: Input
}], onText: [{
type: Input
}], label: [{
type: Input
}], size: [{
type: Input
}], hideLabel: [{
type: Input
}], ariaLabel: [{
type: Input
}], skeleton: [{
type: HostBinding,
args: ["class.cds--toggle--skeleton"]
}, {
type: Input
}], toggleClass: [{
type: HostBinding,
args: ["class.cds--toggle"]
}], disabledClass: [{
type: HostBinding,
args: ["class.cds--toggle--disabled"]
}], formItem: [{
type: HostBinding,
args: ["class.cds--form-item"]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9nZ2xlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90b2dnbGUvdG9nZ2xlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLG1CQUFtQixFQUFxQixNQUFNLG9DQUFvQyxDQUFDO0FBQ3RHLE9BQU8sRUFFTixTQUFTLEVBQ1QsTUFBTSxFQUNOLEtBQUssRUFDTCxRQUFRLEVBQ1IsV0FBVyxFQUNYLFdBQVcsRUFDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQUtuRDs7O0dBR0c7QUFDSCxNQUFNLENBQU4sSUFBWSxXQUlYO0FBSkQsV0FBWSxXQUFXO0lBQ3RCLDZDQUFJLENBQUE7SUFDSixtREFBTyxDQUFBO0lBQ1AsdURBQVMsQ0FBQTtBQUNWLENBQUMsRUFKVyxXQUFXLEtBQVgsV0FBVyxRQUl0QjtBQUVEOzs7O0dBSUc7QUFFSDs7Ozs7Ozs7Ozs7O0dBWUc7QUFnRUgsTUFBTSxPQUFPLE1BQU8sU0FBUSxRQUFRO0lBaUVuQzs7T0FFRztJQUNILFlBQ1csaUJBQW9DLEVBQ0wsU0FBbUMsRUFDbEUsSUFBVTtRQUVwQixLQUFLLENBQUMsaUJBQWlCLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFKMUIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUVwQyxTQUFJLEdBQUosSUFBSSxDQUFNO1FBdENyQjs7V0FFRztRQUNNLFNBQUksR0FBZ0IsSUFBSSxDQUFDO1FBQ2xDOztXQUVHO1FBQ00sY0FBUyxHQUFHLEtBQUssQ0FBQztRQU8wQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRXBDLGdCQUFXLEdBQUcsSUFBSSxDQUFDO1FBU3JEOztXQUVHO1FBQ0gsT0FBRSxHQUFHLFNBQVMsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBRTFCLGVBQVUsR0FBRyxJQUFJLENBQUMsSUFB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QUE2Qjs7c0JBQUcsS0FBSztnQkFFaEIsV0FBVztzQkFBNUMsV0FBVzt1QkFBQyxtQkFBbUI7Z0JBQ2dCLGFBQWE7c0JBQTVELFdBQVc7dUJBQUMsNkJBQTZCO2dCQUlELFFBQVE7c0JBQWhELFdBQVc7dUJBQUMsc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hlY2tib3gsIENIRUNLQk9YX0dST1VQX0hPU1QsIENoZWNrYm94R3JvdXBIb3N0IH0gZnJvbSBcImNhcmJvbi1jb21wb25lbnRzLWFuZ3VsYXIvY2hlY2tib3hcIjtcbmltcG9ydCB7XG5cdENoYW5nZURldGVjdG9yUmVmLFxuXHRDb21wb25lbnQsXG5cdEluamVjdCxcblx0SW5wdXQsXG5cdE9wdGlvbmFsLFxuXHRIb3N0QmluZGluZyxcblx0VGVtcGxhdGVSZWZcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5cbmltcG9ydCB7IEkxOG4gfSBmcm9tIFwiY2FyYm9uLWNvbXBvbmVudHMtYW5ndWxhci9pMThuXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSBcInJ4anNcIjtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSB2NSAtIFVzZSBib29sZWFuXG4gKiBEZWZpbmVzIHRoZSBzZXQgb2Ygc3RhdGVzIGZvciBhIHRvZ2dsZSBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBlbnVtIFRvZ2dsZVN0YXRlIHtcblx0SW5pdCxcblx0Q2hlY2tlZCxcblx0VW5jaGVja2VkXG59XG5cbi8qKlxuICogQHRvZG8gLSBUb2dnbGUgY29tcG9uZW50IHdpbGwgbm8gbG9uZ2VyIGV4dGVuZCBgQ2hlY2tib3hgIGNvbXBvbmVudCBhcyBvZiB2NlxuICogVG9nZ2xlIGlzIG5vIGxvbmdlciByZXBpZXMgb24gdXNpbmcgY2hlY2tib3gsIHNvIGRvZXNuJ3QgbWFrZSBzZW5zZSBmb3IgdXMgdG8gY29udGludWUgaW5oZXJpdGluZyBBTEwgY2hlY2tib3hcbiAqIGNvbXBvbmVudCBhdHRyaWJ1dGVzLlxuICovXG5cbi8qKlxuICogR2V0IHN0YXJ0ZWQgd2l0aCBpbXBvcnRpbmcgdGhlIG1vZHVsZTpcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBUb2dnbGVNb2R1bGUgfSBmcm9tICdjYXJib24tY29tcG9uZW50cy1hbmd1bGFyJztcbiAqIGBgYFxuICpcbiAqIGBgYGh0bWxcbiAqIDxjZHMtdG9nZ2xlIFsobmdNb2RlbCldPVwidG9nZ2xlU3RhdGVcIj5Ub2dnbGU8L2Nkcy10b2dnbGU+XG4gKiBgYGBcbiAqXG4gKiBbU2VlIGRlbW9dKC4uLy4uLz9wYXRoPS9zdG9yeS9jb21wb25lbnRzLXRvZ2dsZS0tYmFzaWMpXG4gKi9cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogXCJjZHMtdG9nZ2xlLCBpYm0tdG9nZ2xlXCIsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbjsgZWxzZSBza2VsZXRvblRlbXBsYXRlO1wiPlxuXHRcdFx0PGJ1dHRvblxuXHRcdFx0XHRjbGFzcz1cImNkcy0tdG9nZ2xlX19idXR0b25cIlxuXHRcdFx0XHRbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuXHRcdFx0XHRbaWRdPVwiaWRcIlxuXHRcdFx0XHRyb2xlPVwic3dpdGNoXCJcblx0XHRcdFx0dHlwZT1cImJ1dHRvblwiXG5cdFx0XHRcdFthdHRyLmFyaWEtY2hlY2tlZF09XCJjaGVja2VkXCJcblx0XHRcdFx0KGNsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiXG5cdFx0XHRcdFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsXCI+XG5cdFx0XHQ8L2J1dHRvbj5cblx0XHRcdDxsYWJlbFxuXHRcdFx0XHRjbGFzcz1cImNkcy0tdG9nZ2xlX19sYWJlbFwiXG5cdFx0XHRcdFtmb3JdPVwiaWRcIj5cblx0XHRcdFx0PHNwYW5cblx0XHRcdFx0XHRjbGFzcz1cImNkcy0tdG9nZ2xlX19sYWJlbC10ZXh0XCJcblx0XHRcdFx0XHRbbmdDbGFzc109XCJ7XG5cdFx0XHRcdFx0XHQnY2RzLS12aXN1YWxseS1oaWRkZW4nOiBoaWRlTGFiZWxcblx0XHRcdFx0XHR9XCI+XG5cdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1RlbXBsYXRlKGxhYmVsKVwiPnt7bGFiZWx9fTwvbmctY29udGFpbmVyPlxuXHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSAqbmdJZj1cImlzVGVtcGxhdGUobGFiZWwpXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwibGFiZWxcIj48L25nLXRlbXBsYXRlPlxuXHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdDxkaXZcblx0XHRcdFx0XHRjbGFzcz1cImNkcy0tdG9nZ2xlX19hcHBlYXJhbmNlXCJcblx0XHRcdFx0XHRbbmdDbGFzc109XCJ7XG5cdFx0XHRcdFx0XHQnY2RzLS10b2dnbGVfX2FwcGVhcmFuY2UtLXNtJzogc2l6ZSA9PT0gJ3NtJ1xuXHRcdFx0XHRcdH1cIj5cblx0XHRcdFx0XHQ8ZGl2XG5cdFx0XHRcdFx0XHRjbGFzcz1cImNkcy0tdG9nZ2xlX19zd2l0Y2hcIlxuXHRcdFx0XHRcdFx0W25nQ2xhc3NdPVwie1xuXHRcdFx0XHRcdFx0XHQnY2RzLS10b2dnbGVfX3N3aXRjaC0tY2hlY2tlZCc6IGNoZWNrZWRcblx0XHRcdFx0XHRcdH1cIj5cblx0XHRcdFx0XHRcdDxzdmdcblx0XHRcdFx0XHRcdFx0Km5nSWY9XCJzaXplID09PSAnc20nXCJcblx0XHRcdFx0XHRcdFx0Y2xhc3M9J2Nkcy0tdG9nZ2xlX19jaGVjaydcblx0XHRcdFx0XHRcdFx0d2lkdGg9XCI2cHhcIlxuXHRcdFx0XHRcdFx0XHRoZWlnaHQ9XCI1cHhcIlxuXHRcdFx0XHRcdFx0XHR2aWV3Qm94PVwiMCAwIDYgNVwiPlxuXHRcdFx0XHRcdFx0XHQ8cGF0aCBkPVwiTTIuMiAyLjdMNSAwIDYgMSAyLjIgNSAwIDIuNyAxIDEuNXpcIiAvPlxuXHRcdFx0XHRcdFx0PC9zdmc+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJjZHMtLXRvZ2dsZV9fdGV4dFwiPlxuXHRcdFx0XHRcdFx0e3soaGlkZUxhYmVsID8gbGFiZWwgOiAoZ2V0Q2hlY2tlZFRleHQoKSB8IGFzeW5jKSl9fVxuXHRcdFx0XHRcdDwvc3Bhbj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2xhYmVsPlxuXHRcdDwvbmctY29udGFpbmVyPlxuXHRcdDxuZy10ZW1wbGF0ZSAjc2tlbGV0b25UZW1wbGF0ZT5cblx0XHRcdDxkaXYgY2xhc3M9XCJjZHMtLXRvZ2dsZV9fc2tlbGV0b24tY2lyY2xlXCI+PC9kaXY+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwiY2RzLS10b2dnbGVfX3NrZWxldG9uLXJlY3RhbmdsZVwiPjwvZGl2PlxuXHRcdDwvbmctdGVtcGxhdGU+XG5cdGAsXG5cdHByb3ZpZGVyczogW1xuXHRcdHtcblx0XHRcdHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuXHRcdFx0dXNlRXhpc3Rpbmc6IFRvZ2dsZSxcblx0XHRcdG11bHRpOiB0cnVlXG5cdFx0fVxuXHRdXG59KVxuZXhwb3J0IGNsYXNzIFRvZ2dsZSBleHRlbmRzIENoZWNrYm94IHtcblx0LyoqXG5cdCAqIFZhcmlhYmxlIHVzZWQgZm9yIGNyZWF0aW5nIHVuaXF1ZSBpZHMgZm9yIHRvZ2dsZSBjb21wb25lbnRzLlxuXHQgKi9cblx0c3RhdGljIHRvZ2dsZUNvdW50ID0gMDtcblxuXHQvKipcblx0ICogVGV4dCB0aGF0IGlzIHNldCBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSB0b2dnbGUuXG5cdCAqL1xuXHRASW5wdXQoKVxuXHRzZXQgb2ZmVGV4dCh2YWx1ZTogc3RyaW5nIHwgT2JzZXJ2YWJsZTxzdHJpbmc+KSB7XG5cdFx0dGhpcy5fb2ZmVmFsdWVzLm92ZXJyaWRlKHZhbHVlKTtcblx0fVxuXG5cdGdldCBvZmZUZXh0KCkge1xuXHRcdHJldHVybiB0aGlzLl9vZmZWYWx1ZXMudmFsdWU7XG5cdH1cblxuXHQvKipcblx0ICogVGV4dCB0aGF0IGlzIHNldCBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgdG9nZ2xlLlxuXHQgKi9cblx0QElucHV0KClcblx0c2V0IG9uVGV4dCh2YWx1ZTogc3RyaW5nIHwgT2JzZXJ2YWJsZTxzdHJpbmc+KSB7XG5cdFx0dGhpcy5fb25WYWx1ZXMub3ZlcnJpZGUodmFsdWUpO1xuXHR9XG5cblx0Z2V0IG9uVGV4dCgpIHtcblx0XHRyZXR1cm4gdGhpcy5fb25WYWx1ZXMudmFsdWU7XG5cdH1cblx0LyoqXG5cdCAqIFRleHQgdGhhdCBpcyBzZXQgYXMgdGhlIGxhYmVsIG9mIHRoZSB0b2dnbGUuXG5cdCAqL1xuXHRASW5wdXQoKSBsYWJlbDogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55Pjtcblx0LyoqXG5cdCAqIFNpemUgb2YgdGhlIHRvZ2dsZSBjb21wb25lbnQuXG5cdCAqL1xuXHRASW5wdXQoKSBzaXplOiBcInNtXCIgfCBcIm1kXCIgPSBcIm1kXCI7XG5cdC8qKlxuXHQgKiBTZXQgdG8gYHRydWVgIHRvIGhpZGUgdGhlIHRvZ2dsZSBsYWJlbCAmIHNldCB0b2dnbGUgb24vb2ZmIHRleHQgdG8gbGFiZWwuXG5cdCAqL1xuXHRASW5wdXQoKSBoaWRlTGFiZWwgPSBmYWxzZTtcblxuXHQvKipcblx0ICogU2V0IGBhcmlhLWxhYmVsYCBwcm9wZXJ0eSBmb3IgdGhlIGJ1dHRvbiB3aGVuIGxhYmVsIGlzIGVtcHR5XG5cdCAqL1xuXHRASW5wdXQoKSBhcmlhTGFiZWw6IHN0cmluZztcblxuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy5jZHMtLXRvZ2dsZS0tc2tlbGV0b25cIikgQElucHV0KCkgc2tlbGV0b24gPSBmYWxzZTtcblxuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy5jZHMtLXRvZ2dsZVwiKSB0b2dnbGVDbGFzcyA9IHRydWU7XG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tdG9nZ2xlLS1kaXNhYmxlZFwiKSBnZXQgZGlzYWJsZWRDbGFzcyAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZGlzYWJsZWQ7XG5cdH1cblxuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy5jZHMtLWZvcm0taXRlbVwiKSBnZXQgZm9ybUl0ZW0oKSB7XG5cdFx0cmV0dXJuICF0aGlzLnNrZWxldG9uO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB1bmlxdWUgaWQgYWxsb2NhdGVkIHRvIHRoZSBgVG9nZ2xlYC5cblx0ICovXG5cdGlkID0gXCJ0b2dnbGUtXCIgKyBUb2dnbGUudG9nZ2xlQ291bnQ7XG5cblx0cHJvdGVjdGVkIF9vZmZWYWx1ZXMgPSB0aGlzLmkxOG4uZ2V0T3ZlcnJpZGFibGUoXCJUT0dHTEUuT0ZGXCIpO1xuXHRwcm90ZWN0ZWQgX29uVmFsdWVzID0gdGhpcy5pMThuLmdldE92ZXJyaWRhYmxlKFwiVE9HR0xFLk9OXCIpO1xuXHQvKipcblx0ICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBUb2dnbGUuXG5cdCAqL1xuXHRjb25zdHJ1Y3Rvcihcblx0XHRwcm90ZWN0ZWQgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuXHRcdEBPcHRpb25hbCgpIEBJbmplY3QoQ0hFQ0tCT1hfR1JPVVBfSE9TVCkgaG9zdEdyb3VwOiBDaGVja2JveEdyb3VwSG9zdCB8IG51bGwsXG5cdFx0cHJvdGVjdGVkIGkxOG46IEkxOG5cblx0KSB7XG5cdFx0c3VwZXIoY2hhbmdlRGV0ZWN0b3JSZWYsIGhvc3RHcm91cCk7XG5cdFx0VG9nZ2xlLnRvZ2dsZUNvdW50Kys7XG5cdH1cblxuXHQvKipcblx0ICogYENvbnRyb2xWYWx1ZUFjY2Vzc29yYCBtZXRob2QgdG8gcHJvZ3JhbW1hdGljYWxseSBkaXNhYmxlIHRoZSB0b2dnbGUgaW5wdXQuXG5cdCAqXG5cdCAqIGV4OiBgdGhpcy5mb3JtR3JvdXAuZ2V0KFwibXlUb2dnbGVcIikuZGlzYWJsZSgpO2Bcblx0ICpcblx0ICogQHBhcmFtIGlzRGlzYWJsZWQgYHRydWVgIHRvIGRpc2FibGUgdGhlIGlucHV0XG5cdCAqL1xuXHRzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pIHtcblx0XHR0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcblx0fVxuXG5cdGdldE9mZlRleHQoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcblx0XHRyZXR1cm4gdGhpcy5fb2ZmVmFsdWVzLnN1YmplY3Q7XG5cdH1cblxuXHRnZXRPblRleHQoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcblx0XHRyZXR1cm4gdGhpcy5fb25WYWx1ZXMuc3ViamVjdDtcblx0fVxuXG5cdGdldENoZWNrZWRUZXh0KCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG5cdFx0aWYgKHRoaXMuY2hlY2tlZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29uVmFsdWVzLnN1YmplY3Q7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLl9vZmZWYWx1ZXMuc3ViamVjdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGluc3RhbmNlIG9mIGBUb2dnbGVDaGFuZ2VgIHVzZWQgdG8gcHJvcGFnYXRlIHRoZSBjaGFuZ2UgZXZlbnQuXG5cdCAqL1xuXHRlbWl0Q2hhbmdlRXZlbnQoKSB7XG5cdFx0dGhpcy5jaGVja2VkQ2hhbmdlLmVtaXQodGhpcy5jaGVja2VkKTtcblx0XHR0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLmNoZWNrZWQpO1xuXHR9XG5cblx0cHVibGljIGlzVGVtcGxhdGUodmFsdWUpIHtcblx0XHRyZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZjtcblx0fVxufVxuIl19