@kushki/ng-suka
Version:
<p align="center"> <h1 align="center">Suka Components Angular</h1> <p align="center"> An Angular implementation of the Suka Design System </p> </p>
516 lines • 34 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, ViewChild, HostBinding } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
/** @enum {number} */
var CheckboxState = {
Init: 0,
Indeterminate: 1,
Checked: 2,
Unchecked: 3,
};
export { CheckboxState };
CheckboxState[CheckboxState.Init] = 'Init';
CheckboxState[CheckboxState.Indeterminate] = 'Indeterminate';
CheckboxState[CheckboxState.Checked] = 'Checked';
CheckboxState[CheckboxState.Unchecked] = 'Unchecked';
var CheckboxChange = /** @class */ (function () {
function CheckboxChange() {
}
return CheckboxChange;
}());
export { CheckboxChange };
if (false) {
/** @type {?} */
CheckboxChange.prototype.source;
/** @type {?} */
CheckboxChange.prototype.checked;
}
var Checkbox = /** @class */ (function () {
/**
* Creates an instance of `Checkbox`.
*/
function Checkbox(changeDetectorRef) {
this.changeDetectorRef = changeDetectorRef;
/**
* Size of the checkbox.
*/
this.size = 'md';
/**
* Set to `true` for checkbox to be rendered without any classes on the host element.
*/
this.inline = false;
/**
* Set to `true` for a disabled checkbox.
*/
this.disabled = false;
/**
* Set to `true` for a loading checkbox.
*/
this.skeleton = false;
/**
* Set to `true` to hide the checkbox labels.
*/
this.hideLabel = false;
/**
* The unique id for the checkbox component.
*/
this.id = "checkbox-" + Checkbox.checkboxCount;
/**
* Used to set the `aria-label` attribute on the input element.
*/
// tslint:disable-next-line:no-input-rename
this.ariaLabel = '';
/**
* Emits event notifying other classes when a change in state occurs on a checkbox after a
* click.
*/
// tslint:disable-next-line: no-output-native
this.change = new EventEmitter();
/**
* Emits event notifying other classes when a change in state occurs specifically
* on an indeterminate checkbox.
*/
this.indeterminateChange = new EventEmitter();
/**
* Set to `true` if the input checkbox is selected (or checked).
*/
// tslint:disable-next-line: variable-name
this._checked = false;
/**
* Set to `true` if the input checkbox is in state indeterminate.
*/
// tslint:disable-next-line: variable-name
this._indeterminate = false;
this.currentCheckboxState = CheckboxState.Init;
/**
* Called when checkbox is blurred. Needed to properly implement `ControlValueAccessor`.
*/
this.onTouched = (/**
* @return {?}
*/
function () { });
/**
* Method set in `registerOnChange` to propagate changes back to the form.
*/
this.propagateChange = (/**
* @param {?} _
* @return {?}
*/
function (_) { });
Checkbox.checkboxCount++;
}
Object.defineProperty(Checkbox.prototype, "indeterminate", {
/**
* Reflects whether the checkbox state is indeterminate.
*/
get: /**
* Reflects whether the checkbox state is indeterminate.
* @return {?}
*/
function () {
return this._indeterminate;
},
/**
* Set the checkbox's indeterminate state to match the parameter and transition the view to reflect the change.
*/
set: /**
* Set the checkbox's indeterminate state to match the parameter and transition the view to reflect the change.
* @param {?} indeterminate
* @return {?}
*/
function (indeterminate) {
/** @type {?} */
var changed = this._indeterminate !== indeterminate;
this._indeterminate = indeterminate;
if (changed) {
this.transitionCheckboxState(CheckboxState.Indeterminate);
}
else {
this.transitionCheckboxState(this.checked ? CheckboxState.Checked : CheckboxState.Unchecked);
}
this.indeterminateChange.emit(this._indeterminate);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Checkbox.prototype, "checked", {
/**
* Returns value `true` if state is selected for the checkbox.
*/
get: /**
* Returns value `true` if state is selected for the checkbox.
* @return {?}
*/
function () {
return this._checked;
},
/**
* Updating the state of a checkbox to match the state of the parameter passed in.
*/
set: /**
* Updating the state of a checkbox to match the state of the parameter passed in.
* @param {?} checked
* @return {?}
*/
function (checked) {
var _this = this;
if (checked !== this.checked) {
if (this._indeterminate) {
Promise.resolve().then((/**
* @return {?}
*/
function () {
_this._indeterminate = false;
_this.indeterminateChange.emit(_this._indeterminate);
}));
}
this._checked = checked;
this.changeDetectorRef.markForCheck();
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(Checkbox.prototype, "checkboxWrapperClass", {
get: /**
* @return {?}
*/
function () {
return !this.inline;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Checkbox.prototype, "formItemClass", {
get: /**
* @return {?}
*/
function () {
return !this.inline;
},
enumerable: true,
configurable: true
});
/**
* Toggle the selected state of the checkbox.
*/
/**
* Toggle the selected state of the checkbox.
* @return {?}
*/
Checkbox.prototype.toggle = /**
* Toggle the selected state of the checkbox.
* @return {?}
*/
function () {
this.checked = !this.checked;
};
// this is the initial value set to the component
// this is the initial value set to the component
/**
* @param {?} value
* @return {?}
*/
Checkbox.prototype.writeValue =
// this is the initial value set to the component
/**
* @param {?} value
* @return {?}
*/
function (value) {
this.checked = !!value;
};
/**
* Sets a method in order to propagate changes back to the form.
*/
/**
* Sets a method in order to propagate changes back to the form.
* @param {?} fn
* @return {?}
*/
Checkbox.prototype.registerOnChange = /**
* Sets a method in order to propagate changes back to the form.
* @param {?} fn
* @return {?}
*/
function (fn) {
this.propagateChange = fn;
};
/**
* Registers a callback to be triggered when the control has been touched.
* @param fn Callback to be triggered when the checkbox is touched.
*/
/**
* Registers a callback to be triggered when the control has been touched.
* @param {?} fn Callback to be triggered when the checkbox is touched.
* @return {?}
*/
Checkbox.prototype.registerOnTouched = /**
* Registers a callback to be triggered when the control has been touched.
* @param {?} fn Callback to be triggered when the checkbox is touched.
* @return {?}
*/
function (fn) {
this.onTouched = fn;
};
/**
* Executes on the event of a change within `Checkbox` to block propagation.
*/
/**
* Executes on the event of a change within `Checkbox` to block propagation.
* @param {?} event
* @return {?}
*/
Checkbox.prototype.onChange = /**
* Executes on the event of a change within `Checkbox` to block propagation.
* @param {?} event
* @return {?}
*/
function (event) {
event.stopPropagation();
};
/**
* Handles click events on the `Checkbox` and emits changes to other classes.
*/
/**
* Handles click events on the `Checkbox` and emits changes to other classes.
* @param {?} event
* @return {?}
*/
Checkbox.prototype.onClick = /**
* Handles click events on the `Checkbox` and emits changes to other classes.
* @param {?} event
* @return {?}
*/
function (event) {
if (!this.disabled) {
this.toggle();
this.transitionCheckboxState(this._checked ? CheckboxState.Checked : CheckboxState.Unchecked);
this.emitChangeEvent();
}
};
/**
* Handles changes between checkbox states.
*/
/**
* Handles changes between checkbox states.
* @param {?} newState
* @return {?}
*/
Checkbox.prototype.transitionCheckboxState = /**
* Handles changes between checkbox states.
* @param {?} newState
* @return {?}
*/
function (newState) {
/** @type {?} */
var oldState = this.currentCheckboxState;
// Indeterminate has to be set always if it's transitioned to
// checked has to be set before indeterminate or it overrides
// indeterminate's dash
if (newState === CheckboxState.Indeterminate) {
this.checked = false;
this.inputCheckbox.nativeElement.indeterminate = true;
}
if (oldState === newState) {
return;
}
this.currentCheckboxState = newState;
};
/**
* Creates instance of `CheckboxChange` used to propagate the change event.
*/
/**
* Creates instance of `CheckboxChange` used to propagate the change event.
* @return {?}
*/
Checkbox.prototype.emitChangeEvent = /**
* Creates instance of `CheckboxChange` used to propagate the change event.
* @return {?}
*/
function () {
/** @type {?} */
var event = new CheckboxChange();
event.source = this;
event.checked = this.checked;
this.propagateChange(this.checked);
this.change.emit(event);
};
/**
* Updates the checkbox if it is in the indeterminate state.
*/
/**
* Updates the checkbox if it is in the indeterminate state.
* @return {?}
*/
Checkbox.prototype.ngAfterViewInit = /**
* Updates the checkbox if it is in the indeterminate state.
* @return {?}
*/
function () {
if (this.indeterminate) {
this.inputCheckbox.nativeElement.indeterminate = true;
this.checked = false;
}
};
/**
* Variable used for creating unique ids for checkbox components.
*/
Checkbox.checkboxCount = 0;
Checkbox.decorators = [
{ type: Component, args: [{
selector: 'suka-checkbox',
template: "\n <input\n #inputCheckbox\n class=\"checkbox\"\n type=\"checkbox\"\n [id]=\"id\"\n [value]=\"value\"\n [name]=\"name\"\n [required]=\"required\"\n [checked]=\"checked\"\n [disabled]=\"disabled\"\n [indeterminate]=\"indeterminate\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledby\"\n [attr.aria-checked]=\"(indeterminate ? 'mixed' : checked)\"\n (change)=\"onChange($event)\"\n (click)=\"onClick($event)\">\n <label\n [for]=\"id\"\n class=\"checkbox-label\"\n [ngClass]=\"{\n 'skeleton' : skeleton\n }\">\n <span [ngClass]=\"{'visually-hidden' : hideLabel}\">\n <ng-content></ng-content>\n </span>\n </label>\n ",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: Checkbox,
multi: true
}
],
changeDetection: ChangeDetectionStrategy.OnPush
}] }
];
/** @nocollapse */
Checkbox.ctorParameters = function () { return [
{ type: ChangeDetectorRef }
]; };
Checkbox.propDecorators = {
size: [{ type: Input }],
nested: [{ type: Input }],
inline: [{ type: Input }],
disabled: [{ type: Input }],
skeleton: [{ type: Input }],
hideLabel: [{ type: Input }],
name: [{ type: Input }],
id: [{ type: Input }],
required: [{ type: Input }],
value: [{ type: Input }],
ariaLabel: [{ type: Input, args: ['aria-label',] }],
ariaLabelledby: [{ type: Input, args: ['aria-labelledby',] }],
indeterminate: [{ type: Input }],
checked: [{ type: Input }],
checkboxWrapperClass: [{ type: HostBinding, args: ['class.checkbox-wrapper',] }],
formItemClass: [{ type: HostBinding, args: ['class.form-item',] }],
change: [{ type: Output }],
indeterminateChange: [{ type: Output }],
inputCheckbox: [{ type: ViewChild, args: ['inputCheckbox', { static: true },] }]
};
return Checkbox;
}());
export { Checkbox };
if (false) {
/**
* Variable used for creating unique ids for checkbox components.
* @type {?}
*/
Checkbox.checkboxCount;
/**
* Size of the checkbox.
* @type {?}
*/
Checkbox.prototype.size;
/**
* Set to `true` for checkbox to be rendered with nested styles.
* @type {?}
*/
Checkbox.prototype.nested;
/**
* Set to `true` for checkbox to be rendered without any classes on the host element.
* @type {?}
*/
Checkbox.prototype.inline;
/**
* Set to `true` for a disabled checkbox.
* @type {?}
*/
Checkbox.prototype.disabled;
/**
* Set to `true` for a loading checkbox.
* @type {?}
*/
Checkbox.prototype.skeleton;
/**
* Set to `true` to hide the checkbox labels.
* @type {?}
*/
Checkbox.prototype.hideLabel;
/**
* Sets the name attribute on the `input` element.
* @type {?}
*/
Checkbox.prototype.name;
/**
* The unique id for the checkbox component.
* @type {?}
*/
Checkbox.prototype.id;
/**
* Reflects the required attribute of the `input` element.
* @type {?}
*/
Checkbox.prototype.required;
/**
* Sets the value attribute on the `input` element.
* @type {?}
*/
Checkbox.prototype.value;
/**
* Used to set the `aria-label` attribute on the input element.
* @type {?}
*/
Checkbox.prototype.ariaLabel;
/**
* Used to set the `aria-labelledby` attribute on the input element.
* @type {?}
*/
Checkbox.prototype.ariaLabelledby;
/**
* Emits event notifying other classes when a change in state occurs on a checkbox after a
* click.
* @type {?}
*/
Checkbox.prototype.change;
/**
* Emits event notifying other classes when a change in state occurs specifically
* on an indeterminate checkbox.
* @type {?}
*/
Checkbox.prototype.indeterminateChange;
/**
* Set to `true` if the input checkbox is selected (or checked).
* @type {?}
*/
Checkbox.prototype._checked;
/**
* Set to `true` if the input checkbox is in state indeterminate.
* @type {?}
*/
Checkbox.prototype._indeterminate;
/** @type {?} */
Checkbox.prototype.currentCheckboxState;
/**
* Maintains a reference to the view DOM element of the `Checkbox`.
* @type {?}
*/
Checkbox.prototype.inputCheckbox;
/**
* Called when checkbox is blurred. Needed to properly implement `ControlValueAccessor`.
* @type {?}
*/
Checkbox.prototype.onTouched;
/**
* Method set in `registerOnChange` to propagate changes back to the form.
* @type {?}
*/
Checkbox.prototype.propagateChange;
/**
* @type {?}
* @protected
*/
Checkbox.prototype.changeDetectorRef;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGt1c2hraS9uZy1zdWthLyIsInNvdXJjZXMiOlsibGliL2NoZWNrYm94L2NoZWNrYm94LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsV0FBVyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQzs7O0lBSXZFLE9BQUk7SUFDSixnQkFBYTtJQUNiLFVBQU87SUFDUCxZQUFTOzs7Ozs7O0FBR1g7SUFBQTtJQUdBLENBQUM7SUFBRCxxQkFBQztBQUFELENBQUMsQUFIRCxJQUdDOzs7O0lBRkMsZ0NBQWlCOztJQUNqQixpQ0FBaUI7O0FBSW5CO0lBb0xFOztPQUVHO0lBQ0gsa0JBQXNCLGlCQUFvQztRQUFwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1COzs7O1FBdElqRCxTQUFJLEdBQWdCLElBQUksQ0FBQzs7OztRQVF6QixXQUFNLEdBQUcsS0FBSyxDQUFDOzs7O1FBSWYsYUFBUSxHQUFHLEtBQUssQ0FBQzs7OztRQUlqQixhQUFRLEdBQUcsS0FBSyxDQUFDOzs7O1FBSWpCLGNBQVMsR0FBRyxLQUFLLENBQUM7Ozs7UUFRbEIsT0FBRSxHQUFHLGNBQVksUUFBUSxDQUFDLGFBQWUsQ0FBQzs7Ozs7UUFhOUIsY0FBUyxHQUFHLEVBQUUsQ0FBQzs7Ozs7O1FBaUUxQixXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQWtCLENBQUM7Ozs7O1FBSzVDLHdCQUFtQixHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7Ozs7O1FBTTVELGFBQVEsR0FBRyxLQUFLLENBQUM7Ozs7O1FBS2pCLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBRXZC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eUJBQXVCOzs7OztJQUt2Qiw2QkFBb0M7Ozs7O0lBS3BDLGtDQUFpRDs7Ozs7O0lBNERqRCwwQkFBc0Q7Ozs7OztJQUt0RCx1Q0FBNEQ7Ozs7O0lBTTVELDRCQUFpQjs7Ozs7SUFLakIsa0NBQXVCOztJQUV2Qix3Q0FBeUQ7Ozs7O0lBS3pELGlDQUF3RTs7Ozs7SUEwRHhFLDZCQUFpQzs7Ozs7SUFnRGpDLG1DQUFrQzs7Ozs7SUFyR3RCLHFDQUE4QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgSG9zdEJpbmRpbmdcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiwgQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cblxuZXhwb3J0IGVudW0gQ2hlY2tib3hTdGF0ZSB7XG4gIEluaXQsXG4gIEluZGV0ZXJtaW5hdGUsXG4gIENoZWNrZWQsXG4gIFVuY2hlY2tlZFxufVxuXG5leHBvcnQgY2xhc3MgQ2hlY2tib3hDaGFuZ2Uge1xuICBzb3VyY2U6IENoZWNrYm94O1xuICBjaGVja2VkOiBib29sZWFuO1xufVxuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N1a2EtY2hlY2tib3gnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxpbnB1dFxuICAgICAgI2lucHV0Q2hlY2tib3hcbiAgICAgIGNsYXNzPVwiY2hlY2tib3hcIlxuICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgIFtpZF09XCJpZFwiXG4gICAgICBbdmFsdWVdPVwidmFsdWVcIlxuICAgICAgW25hbWVdPVwibmFtZVwiXG4gICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgW2NoZWNrZWRdPVwiY2hlY2tlZFwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW2luZGV0ZXJtaW5hdGVdPVwiaW5kZXRlcm1pbmF0ZVwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbFwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiYXJpYUxhYmVsbGVkYnlcIlxuICAgICAgW2F0dHIuYXJpYS1jaGVja2VkXT1cIihpbmRldGVybWluYXRlID8gJ21peGVkJyA6IGNoZWNrZWQpXCJcbiAgICAgIChjaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAoY2xpY2spPVwib25DbGljaygkZXZlbnQpXCI+XG4gICAgPGxhYmVsXG4gICAgICBbZm9yXT1cImlkXCJcbiAgICAgIGNsYXNzPVwiY2hlY2tib3gtbGFiZWxcIlxuICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAnc2tlbGV0b24nIDogc2tlbGV0b25cbiAgICAgIH1cIj5cbiAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cInsndmlzdWFsbHktaGlkZGVuJyA6IGhpZGVMYWJlbH1cIj5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgPC9zcGFuPlxuICAgIDwvbGFiZWw+XG4gIGAsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IENoZWNrYm94LFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBjb21wb25lbnQtY2xhc3Mtc3VmZml4XG5leHBvcnQgY2xhc3MgQ2hlY2tib3ggaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgQWZ0ZXJWaWV3SW5pdCB7XG4gIC8qKlxuICAgKiBWYXJpYWJsZSB1c2VkIGZvciBjcmVhdGluZyB1bmlxdWUgaWRzIGZvciBjaGVja2JveCBjb21wb25lbnRzLlxuICAgKi9cbiAgc3RhdGljIGNoZWNrYm94Q291bnQgPSAwO1xuXG4gIC8qKlxuICAgKiBTaXplIG9mIHRoZSBjaGVja2JveC5cbiAgICovXG4gIEBJbnB1dCgpIHNpemU6ICdzbScgfCAnbWQnID0gJ21kJztcbiAgLyoqXG4gICAqIFNldCB0byBgdHJ1ZWAgZm9yIGNoZWNrYm94IHRvIGJlIHJlbmRlcmVkIHdpdGggbmVzdGVkIHN0eWxlcy5cbiAgICovXG4gIEBJbnB1dCgpIG5lc3RlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNldCB0byBgdHJ1ZWAgZm9yIGNoZWNrYm94IHRvIGJlIHJlbmRlcmVkIHdpdGhvdXQgYW55IGNsYXNzZXMgb24gdGhlIGhvc3QgZWxlbWVudC5cbiAgICovXG4gIEBJbnB1dCgpIGlubGluZSA9IGZhbHNlO1xuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCBmb3IgYSBkaXNhYmxlZCBjaGVja2JveC5cbiAgICovXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIGZvciBhIGxvYWRpbmcgY2hlY2tib3guXG4gICAqL1xuICBASW5wdXQoKSBza2VsZXRvbiA9IGZhbHNlO1xuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCB0byBoaWRlIHRoZSBjaGVja2JveCBsYWJlbHMuXG4gICAqL1xuICBASW5wdXQoKSBoaWRlTGFiZWwgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFNldHMgdGhlIG5hbWUgYXR0cmlidXRlIG9uIHRoZSBgaW5wdXRgIGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKSBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdW5pcXVlIGlkIGZvciB0aGUgY2hlY2tib3ggY29tcG9uZW50LlxuICAgKi9cbiAgQElucHV0KCkgaWQgPSBgY2hlY2tib3gtJHtDaGVja2JveC5jaGVja2JveENvdW50fWA7XG4gIC8qKlxuICAgKiBSZWZsZWN0cyB0aGUgcmVxdWlyZWQgYXR0cmlidXRlIG9mIHRoZSBgaW5wdXRgIGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKSByZXF1aXJlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNldHMgdGhlIHZhbHVlIGF0dHJpYnV0ZSBvbiB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKi9cbiAgQElucHV0KCkgdmFsdWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFVzZWQgdG8gc2V0IHRoZSBgYXJpYS1sYWJlbGAgYXR0cmlidXRlIG9uIHRoZSBpbnB1dCBlbGVtZW50LlxuICAgKi9cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWlucHV0LXJlbmFtZVxuICBASW5wdXQoJ2FyaWEtbGFiZWwnKSBhcmlhTGFiZWwgPSAnJztcbiAgLyoqXG4gICAqIFVzZWQgdG8gc2V0IHRoZSBgYXJpYS1sYWJlbGxlZGJ5YCBhdHRyaWJ1dGUgb24gdGhlIGlucHV0IGVsZW1lbnQuXG4gICAqL1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8taW5wdXQtcmVuYW1lXG4gIEBJbnB1dCgnYXJpYS1sYWJlbGxlZGJ5JykgYXJpYUxhYmVsbGVkYnk6IHN0cmluZztcblxuICAvKipcbiAgICogUmVmbGVjdHMgd2hldGhlciB0aGUgY2hlY2tib3ggc3RhdGUgaXMgaW5kZXRlcm1pbmF0ZS5cbiAgICovXG4gIGdldCBpbmRldGVybWluYXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9pbmRldGVybWluYXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY2hlY2tib3gncyBpbmRldGVybWluYXRlIHN0YXRlIHRvIG1hdGNoIHRoZSBwYXJhbWV0ZXIgYW5kIHRyYW5zaXRpb24gdGhlIHZpZXcgdG8gcmVmbGVjdCB0aGUgY2hhbmdlLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IGluZGV0ZXJtaW5hdGUoaW5kZXRlcm1pbmF0ZTogYm9vbGVhbikge1xuICAgIGNvbnN0IGNoYW5nZWQgPSB0aGlzLl9pbmRldGVybWluYXRlICE9PSBpbmRldGVybWluYXRlO1xuICAgIHRoaXMuX2luZGV0ZXJtaW5hdGUgPSBpbmRldGVybWluYXRlO1xuXG4gICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgIHRoaXMudHJhbnNpdGlvbkNoZWNrYm94U3RhdGUoQ2hlY2tib3hTdGF0ZS5JbmRldGVybWluYXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmFuc2l0aW9uQ2hlY2tib3hTdGF0ZSh0aGlzLmNoZWNrZWQgPyBDaGVja2JveFN0YXRlLkNoZWNrZWQgOiBDaGVja2JveFN0YXRlLlVuY2hlY2tlZCk7XG4gICAgfVxuXG4gICAgdGhpcy5pbmRldGVybWluYXRlQ2hhbmdlLmVtaXQodGhpcy5faW5kZXRlcm1pbmF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB2YWx1ZSBgdHJ1ZWAgaWYgc3RhdGUgaXMgc2VsZWN0ZWQgZm9yIHRoZSBjaGVja2JveC5cbiAgICovXG4gIGdldCBjaGVja2VkKCkge1xuICAgIHJldHVybiB0aGlzLl9jaGVja2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0aW5nIHRoZSBzdGF0ZSBvZiBhIGNoZWNrYm94IHRvIG1hdGNoIHRoZSBzdGF0ZSBvZiB0aGUgcGFyYW1ldGVyIHBhc3NlZCBpbi5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBjaGVja2VkKGNoZWNrZWQ6IGJvb2xlYW4pIHtcbiAgICBpZiAoY2hlY2tlZCAhPT0gdGhpcy5jaGVja2VkKSB7XG4gICAgICBpZiAodGhpcy5faW5kZXRlcm1pbmF0ZSkge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9pbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5pbmRldGVybWluYXRlQ2hhbmdlLmVtaXQodGhpcy5faW5kZXRlcm1pbmF0ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5fY2hlY2tlZCA9IGNoZWNrZWQ7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuY2hlY2tib3gtd3JhcHBlcicpIGdldCBjaGVja2JveFdyYXBwZXJDbGFzcygpIHtcbiAgICByZXR1cm4gIXRoaXMuaW5saW5lO1xuICB9XG4gIEBIb3N0QmluZGluZygnY2xhc3MuZm9ybS1pdGVtJykgZ2V0IGZvcm1JdGVtQ2xhc3MoKSB7XG4gICAgcmV0dXJuICF0aGlzLmlubGluZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBldmVudCBub3RpZnlpbmcgb3RoZXIgY2xhc3NlcyB3aGVuIGEgY2hhbmdlIGluIHN0YXRlIG9jY3VycyBvbiBhIGNoZWNrYm94IGFmdGVyIGFcbiAgICogY2xpY2suXG4gICAqL1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLW91dHB1dC1uYXRpdmVcbiAgQE91dHB1dCgpIGNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hlY2tib3hDaGFuZ2U+KCk7XG4gIC8qKlxuICAgKiBFbWl0cyBldmVudCBub3RpZnlpbmcgb3RoZXIgY2xhc3NlcyB3aGVuIGEgY2hhbmdlIGluIHN0YXRlIG9jY3VycyBzcGVjaWZpY2FsbHlcbiAgICogb24gYW4gaW5kZXRlcm1pbmF0ZSBjaGVja2JveC5cbiAgICovXG4gIEBPdXRwdXQoKSBpbmRldGVybWluYXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIGlmIHRoZSBpbnB1dCBjaGVja2JveCBpcyBzZWxlY3RlZCAob3IgY2hlY2tlZCkuXG4gICAqL1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcbiAgX2NoZWNrZWQgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFNldCB0byBgdHJ1ZWAgaWYgdGhlIGlucHV0IGNoZWNrYm94IGlzIGluIHN0YXRlIGluZGV0ZXJtaW5hdGUuXG4gICAqL1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcbiAgX2luZGV0ZXJtaW5hdGUgPSBmYWxzZTtcblxuICBjdXJyZW50Q2hlY2tib3hTdGF0ZTogQ2hlY2tib3hTdGF0ZSA9IENoZWNrYm94U3RhdGUuSW5pdDtcblxuICAvKipcbiAgICogTWFpbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2aWV3IERPTSBlbGVtZW50IG9mIHRoZSBgQ2hlY2tib3hgLlxuICAgKi9cbiAgQFZpZXdDaGlsZCgnaW5wdXRDaGVja2JveCcsIHsgc3RhdGljOiB0cnVlIH0pIGlucHV0Q2hlY2tib3g6IEVsZW1lbnRSZWY7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYENoZWNrYm94YC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgICBDaGVja2JveC5jaGVja2JveENvdW50Kys7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlIHRoZSBzZWxlY3RlZCBzdGF0ZSBvZiB0aGUgY2hlY2tib3guXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlKCkge1xuICAgIHRoaXMuY2hlY2tlZCA9ICF0aGlzLmNoZWNrZWQ7XG4gIH1cblxuICAvLyB0aGlzIGlzIHRoZSBpbml0aWFsIHZhbHVlIHNldCB0byB0aGUgY29tcG9uZW50XG4gIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLmNoZWNrZWQgPSAhIXZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYSBtZXRob2QgaW4gb3JkZXIgdG8gcHJvcGFnYXRlIGNoYW5nZXMgYmFjayB0byB0aGUgZm9ybS5cbiAgICovXG4gIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSBjb250cm9sIGhhcyBiZWVuIHRvdWNoZWQuXG4gICAqIEBwYXJhbSBmbiBDYWxsYmFjayB0byBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgY2hlY2tib3ggaXMgdG91Y2hlZC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KSB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBvbiB0aGUgZXZlbnQgb2YgYSBjaGFuZ2Ugd2l0aGluIGBDaGVja2JveGAgdG8gYmxvY2sgcHJvcGFnYXRpb24uXG4gICAqL1xuICBvbkNoYW5nZShldmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgY2xpY2sgZXZlbnRzIG9uIHRoZSBgQ2hlY2tib3hgIGFuZCBlbWl0cyBjaGFuZ2VzIHRvIG90aGVyIGNsYXNzZXMuXG4gICAqL1xuICBvbkNsaWNrKGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgdGhpcy50cmFuc2l0aW9uQ2hlY2tib3hTdGF0ZSh0aGlzLl9jaGVja2VkID8gQ2hlY2tib3hTdGF0ZS5DaGVja2VkIDogQ2hlY2tib3hTdGF0ZS5VbmNoZWNrZWQpO1xuICAgICAgdGhpcy5lbWl0Q2hhbmdlRXZlbnQoKTtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBjaGVja2JveCBpcyBibHVycmVkLiBOZWVkZWQgdG8gcHJvcGVybHkgaW1wbGVtZW50IGBDb250cm9sVmFsdWVBY2Nlc3NvcmAuXG4gICAqL1xuICBvblRvdWNoZWQ6ICgpID0+IGFueSA9ICgpID0+IHsgfTtcblxuICAvKipcbiAgICogSGFuZGxlcyBjaGFuZ2VzIGJldHdlZW4gY2hlY2tib3ggc3RhdGVzLlxuICAgKi9cbiAgdHJhbnNpdGlvbkNoZWNrYm94U3RhdGUobmV3U3RhdGU6IENoZWNrYm94U3RhdGUpIHtcbiAgICBjb25zdCBvbGRTdGF0ZSA9IHRoaXMuY3VycmVudENoZWNrYm94U3RhdGU7XG5cbiAgICAvLyBJbmRldGVybWluYXRlIGhhcyB0byBiZSBzZXQgYWx3YXlzIGlmIGl0J3MgdHJhbnNpdGlvbmVkIHRvXG4gICAgLy8gY2hlY2tlZCBoYXMgdG8gYmUgc2V0IGJlZm9yZSBpbmRldGVybWluYXRlIG9yIGl0IG92ZXJyaWRlc1xuICAgIC8vIGluZGV0ZXJtaW5hdGUncyBkYXNoXG4gICAgaWYgKG5ld1N0YXRlID09PSBDaGVja2JveFN0YXRlLkluZGV0ZXJtaW5hdGUpIHtcbiAgICAgIHRoaXMuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5pbnB1dENoZWNrYm94Lm5hdGl2ZUVsZW1lbnQuaW5kZXRlcm1pbmF0ZSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG9sZFN0YXRlID09PSBuZXdTdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY3VycmVudENoZWNrYm94U3RhdGUgPSBuZXdTdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGluc3RhbmNlIG9mIGBDaGVja2JveENoYW5nZWAgdXNlZCB0byBwcm9wYWdhdGUgdGhlIGNoYW5nZSBldmVudC5cbiAgICovXG4gIGVtaXRDaGFuZ2VFdmVudCgpIHtcbiAgICBjb25zdCBldmVudCA9IG5ldyBDaGVja2JveENoYW5nZSgpO1xuICAgIGV2ZW50LnNvdXJjZSA9IHRoaXM7XG4gICAgZXZlbnQuY2hlY2tlZCA9IHRoaXMuY2hlY2tlZDtcblxuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHRoaXMuY2hlY2tlZCk7XG4gICAgdGhpcy5jaGFuZ2UuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgY2hlY2tib3ggaWYgaXQgaXMgaW4gdGhlIGluZGV0ZXJtaW5hdGUgc3RhdGUuXG4gICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgaWYgKHRoaXMuaW5kZXRlcm1pbmF0ZSkge1xuICAgICAgdGhpcy5pbnB1dENoZWNrYm94Lm5hdGl2ZUVsZW1lbnQuaW5kZXRlcm1pbmF0ZSA9IHRydWU7XG4gICAgICB0aGlzLmNoZWNrZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHNldCBpbiBgcmVnaXN0ZXJPbkNoYW5nZWAgdG8gcHJvcGFnYXRlIGNoYW5nZXMgYmFjayB0byB0aGUgZm9ybS5cbiAgICovXG4gIHByb3BhZ2F0ZUNoYW5nZSA9IChfOiBhbnkpID0+IHsgfTtcbn1cbiJdfQ==