@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>
525 lines • 34.4 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';
/**
* Used to emit changes performed on checkbox components.
*/
var /**
* Used to emit changes performed on checkbox components.
*/
CheckboxChange = /** @class */ (function () {
function CheckboxChange() {
}
return CheckboxChange;
}());
/**
* Used to emit changes performed on checkbox components.
*/
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGt1c2hraS9uZy1zdWthLyIsInNvdXJjZXMiOlsibGliL2NoZWNrYm94L2NoZWNrYm94LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsV0FBVyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQzs7O0lBTXZFLE9BQUk7SUFDSixnQkFBYTtJQUNiLFVBQU87SUFDUCxZQUFTOzs7Ozs7Ozs7O0FBTVg7Ozs7SUFBQTtJQUdBLENBQUM7SUFBRCxxQkFBQztBQUFELENBQUMsQUFIRCxJQUdDOzs7Ozs7O0lBRkMsZ0NBQWlCOztJQUNqQixpQ0FBaUI7O0FBR25CO0lBK0xFOztPQUVHO0lBQ0gsa0JBQXNCLGlCQUFvQztRQUFwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1COzs7O1FBakpqRCxTQUFJLEdBQWdCLElBQUksQ0FBQzs7OztRQVV6QixXQUFNLEdBQUcsS0FBSyxDQUFDOzs7O1FBS2YsYUFBUSxHQUFHLEtBQUssQ0FBQzs7OztRQUtqQixhQUFRLEdBQUcsS0FBSyxDQUFDOzs7O1FBS2pCLGNBQVMsR0FBRyxLQUFLLENBQUM7Ozs7UUFVbEIsT0FBRSxHQUFHLGNBQVksUUFBUSxDQUFDLGFBQWUsQ0FBQzs7Ozs7UUFnQjlCLGNBQVMsR0FBRyxFQUFFLENBQUM7Ozs7OztRQWtFMUIsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFrQixDQUFDOzs7OztRQUs1Qyx3QkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDOzs7OztRQU01RCxhQUFRLEdBQUcsS0FBSyxDQUFDOzs7OztRQUtqQixtQkFBYyxHQUFHLEtBQUss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Ozs7O0lBSzNCLHlCQUF1Qjs7Ozs7SUFNdkIsNkJBQW9DOzs7OztJQU1wQyxrQ0FBaUQ7Ozs7OztJQTREakQsMEJBQXNEOzs7Ozs7SUFLdEQsdUNBQTREOzs7OztJQU01RCw0QkFBaUI7Ozs7O0lBS2pCLGtDQUF1Qjs7SUFFdkIsd0NBQXlEOzs7OztJQUt6RCxpQ0FBd0U7Ozs7O0lBMER4RSw2QkFBaUM7Ozs7O0lBZ0RqQyxtQ0FBa0M7Ozs7O0lBckd0QixxQ0FBOEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIEhvc3RCaW5kaW5nXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG4vKipcbiAqIERlZmluZXMgdGhlIHNldCBvZiBzdGF0ZXMgZm9yIGEgY2hlY2tib3ggY29tcG9uZW50LlxuICovXG5leHBvcnQgZW51bSBDaGVja2JveFN0YXRlIHtcbiAgSW5pdCxcbiAgSW5kZXRlcm1pbmF0ZSxcbiAgQ2hlY2tlZCxcbiAgVW5jaGVja2VkXG59XG5cbi8qKlxuICogVXNlZCB0byBlbWl0IGNoYW5nZXMgcGVyZm9ybWVkIG9uIGNoZWNrYm94IGNvbXBvbmVudHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBDaGVja2JveENoYW5nZSB7XG4gIHNvdXJjZTogQ2hlY2tib3g7XG4gIGNoZWNrZWQ6IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N1a2EtY2hlY2tib3gnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxpbnB1dFxuICAgICAgI2lucHV0Q2hlY2tib3hcbiAgICAgIGNsYXNzPVwiY2hlY2tib3hcIlxuICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgIFtpZF09XCJpZFwiXG4gICAgICBbdmFsdWVdPVwidmFsdWVcIlxuICAgICAgW25hbWVdPVwibmFtZVwiXG4gICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgW2NoZWNrZWRdPVwiY2hlY2tlZFwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW2luZGV0ZXJtaW5hdGVdPVwiaW5kZXRlcm1pbmF0ZVwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbFwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiYXJpYUxhYmVsbGVkYnlcIlxuICAgICAgW2F0dHIuYXJpYS1jaGVja2VkXT1cIihpbmRldGVybWluYXRlID8gJ21peGVkJyA6IGNoZWNrZWQpXCJcbiAgICAgIChjaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAoY2xpY2spPVwib25DbGljaygkZXZlbnQpXCI+XG4gICAgPGxhYmVsXG4gICAgICBbZm9yXT1cImlkXCJcbiAgICAgIGNsYXNzPVwiY2hlY2tib3gtbGFiZWxcIlxuICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAnc2tlbGV0b24nIDogc2tlbGV0b25cbiAgICAgIH1cIj5cbiAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cInsndmlzdWFsbHktaGlkZGVuJyA6IGhpZGVMYWJlbH1cIj5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgPC9zcGFuPlxuICAgIDwvbGFiZWw+XG4gIGAsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IENoZWNrYm94LFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBjb21wb25lbnQtY2xhc3Mtc3VmZml4XG5leHBvcnQgY2xhc3MgQ2hlY2tib3ggaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgQWZ0ZXJWaWV3SW5pdCB7XG4gIC8qKlxuICAgKiBWYXJpYWJsZSB1c2VkIGZvciBjcmVhdGluZyB1bmlxdWUgaWRzIGZvciBjaGVja2JveCBjb21wb25lbnRzLlxuICAgKi9cbiAgc3RhdGljIGNoZWNrYm94Q291bnQgPSAwO1xuXG4gIC8qKlxuICAgKiBTaXplIG9mIHRoZSBjaGVja2JveC5cbiAgICovXG4gIEBJbnB1dCgpIHNpemU6ICdzbScgfCAnbWQnID0gJ21kJztcblxuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCBmb3IgY2hlY2tib3ggdG8gYmUgcmVuZGVyZWQgd2l0aCBuZXN0ZWQgc3R5bGVzLlxuICAgKi9cbiAgQElucHV0KCkgbmVzdGVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIGZvciBjaGVja2JveCB0byBiZSByZW5kZXJlZCB3aXRob3V0IGFueSBjbGFzc2VzIG9uIHRoZSBob3N0IGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKSBpbmxpbmUgPSBmYWxzZTtcblxuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCBmb3IgYSBkaXNhYmxlZCBjaGVja2JveC5cbiAgICovXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNldCB0byBgdHJ1ZWAgZm9yIGEgbG9hZGluZyBjaGVja2JveC5cbiAgICovXG4gIEBJbnB1dCgpIHNrZWxldG9uID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNldCB0byBgdHJ1ZWAgdG8gaGlkZSB0aGUgY2hlY2tib3ggbGFiZWxzLlxuICAgKi9cbiAgQElucHV0KCkgaGlkZUxhYmVsID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIG5hbWUgYXR0cmlidXRlIG9uIHRoZSBgaW5wdXRgIGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgaWQgZm9yIHRoZSBjaGVja2JveCBjb21wb25lbnQuXG4gICAqL1xuICBASW5wdXQoKSBpZCA9IGBjaGVja2JveC0ke0NoZWNrYm94LmNoZWNrYm94Q291bnR9YDtcblxuICAvKipcbiAgICogUmVmbGVjdHMgdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZSBvZiB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKi9cbiAgQElucHV0KCkgcmVxdWlyZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHZhbHVlIGF0dHJpYnV0ZSBvbiB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKi9cbiAgQElucHV0KCkgdmFsdWU6IHN0cmluZztcblxuICAvKipcbiAgICogVXNlZCB0byBzZXQgdGhlIGBhcmlhLWxhYmVsYCBhdHRyaWJ1dGUgb24gdGhlIGlucHV0IGVsZW1lbnQuXG4gICAqL1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8taW5wdXQtcmVuYW1lXG4gIEBJbnB1dCgnYXJpYS1sYWJlbCcpIGFyaWFMYWJlbCA9ICcnO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHNldCB0aGUgYGFyaWEtbGFiZWxsZWRieWAgYXR0cmlidXRlIG9uIHRoZSBpbnB1dCBlbGVtZW50LlxuICAgKi9cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWlucHV0LXJlbmFtZVxuICBASW5wdXQoJ2FyaWEtbGFiZWxsZWRieScpIGFyaWFMYWJlbGxlZGJ5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlZmxlY3RzIHdoZXRoZXIgdGhlIGNoZWNrYm94IHN0YXRlIGlzIGluZGV0ZXJtaW5hdGUuXG4gICAqL1xuICBnZXQgaW5kZXRlcm1pbmF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5faW5kZXRlcm1pbmF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGNoZWNrYm94J3MgaW5kZXRlcm1pbmF0ZSBzdGF0ZSB0byBtYXRjaCB0aGUgcGFyYW1ldGVyIGFuZCB0cmFuc2l0aW9uIHRoZSB2aWV3IHRvIHJlZmxlY3QgdGhlIGNoYW5nZS5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBpbmRldGVybWluYXRlKGluZGV0ZXJtaW5hdGU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjaGFuZ2VkID0gdGhpcy5faW5kZXRlcm1pbmF0ZSAhPT0gaW5kZXRlcm1pbmF0ZTtcbiAgICB0aGlzLl9pbmRldGVybWluYXRlID0gaW5kZXRlcm1pbmF0ZTtcblxuICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICB0aGlzLnRyYW5zaXRpb25DaGVja2JveFN0YXRlKENoZWNrYm94U3RhdGUuSW5kZXRlcm1pbmF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHJhbnNpdGlvbkNoZWNrYm94U3RhdGUodGhpcy5jaGVja2VkID8gQ2hlY2tib3hTdGF0ZS5DaGVja2VkIDogQ2hlY2tib3hTdGF0ZS5VbmNoZWNrZWQpO1xuICAgIH1cblxuICAgIHRoaXMuaW5kZXRlcm1pbmF0ZUNoYW5nZS5lbWl0KHRoaXMuX2luZGV0ZXJtaW5hdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdmFsdWUgYHRydWVgIGlmIHN0YXRlIGlzIHNlbGVjdGVkIGZvciB0aGUgY2hlY2tib3guXG4gICAqL1xuICBnZXQgY2hlY2tlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY2hlY2tlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGluZyB0aGUgc3RhdGUgb2YgYSBjaGVja2JveCB0byBtYXRjaCB0aGUgc3RhdGUgb2YgdGhlIHBhcmFtZXRlciBwYXNzZWQgaW4uXG4gICAqL1xuICBASW5wdXQoKSBzZXQgY2hlY2tlZChjaGVja2VkOiBib29sZWFuKSB7XG4gICAgaWYgKGNoZWNrZWQgIT09IHRoaXMuY2hlY2tlZCkge1xuICAgICAgaWYgKHRoaXMuX2luZGV0ZXJtaW5hdGUpIHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5faW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuaW5kZXRlcm1pbmF0ZUNoYW5nZS5lbWl0KHRoaXMuX2luZGV0ZXJtaW5hdGUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NoZWNrZWQgPSBjaGVja2VkO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmNoZWNrYm94LXdyYXBwZXInKSBnZXQgY2hlY2tib3hXcmFwcGVyQ2xhc3MoKSB7XG4gICAgcmV0dXJuICF0aGlzLmlubGluZTtcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZvcm0taXRlbScpIGdldCBmb3JtSXRlbUNsYXNzKCkge1xuICAgIHJldHVybiAhdGhpcy5pbmxpbmU7XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgZXZlbnQgbm90aWZ5aW5nIG90aGVyIGNsYXNzZXMgd2hlbiBhIGNoYW5nZSBpbiBzdGF0ZSBvY2N1cnMgb24gYSBjaGVja2JveCBhZnRlciBhXG4gICAqIGNsaWNrLlxuICAgKi9cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1vdXRwdXQtbmF0aXZlXG4gIEBPdXRwdXQoKSBjaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPENoZWNrYm94Q2hhbmdlPigpO1xuICAvKipcbiAgICogRW1pdHMgZXZlbnQgbm90aWZ5aW5nIG90aGVyIGNsYXNzZXMgd2hlbiBhIGNoYW5nZSBpbiBzdGF0ZSBvY2N1cnMgc3BlY2lmaWNhbGx5XG4gICAqIG9uIGFuIGluZGV0ZXJtaW5hdGUgY2hlY2tib3guXG4gICAqL1xuICBAT3V0cHV0KCkgaW5kZXRlcm1pbmF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCBpZiB0aGUgaW5wdXQgY2hlY2tib3ggaXMgc2VsZWN0ZWQgKG9yIGNoZWNrZWQpLlxuICAgKi9cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiB2YXJpYWJsZS1uYW1lXG4gIF9jaGVja2VkID0gZmFsc2U7XG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIGlmIHRoZSBpbnB1dCBjaGVja2JveCBpcyBpbiBzdGF0ZSBpbmRldGVybWluYXRlLlxuICAgKi9cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiB2YXJpYWJsZS1uYW1lXG4gIF9pbmRldGVybWluYXRlID0gZmFsc2U7XG5cbiAgY3VycmVudENoZWNrYm94U3RhdGU6IENoZWNrYm94U3RhdGUgPSBDaGVja2JveFN0YXRlLkluaXQ7XG5cbiAgLyoqXG4gICAqIE1haW50YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgdmlldyBET00gZWxlbWVudCBvZiB0aGUgYENoZWNrYm94YC5cbiAgICovXG4gIEBWaWV3Q2hpbGQoJ2lucHV0Q2hlY2tib3gnLCB7IHN0YXRpYzogdHJ1ZSB9KSBpbnB1dENoZWNrYm94OiBFbGVtZW50UmVmO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIGBDaGVja2JveGAuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgQ2hlY2tib3guY2hlY2tib3hDb3VudCsrO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSB0aGUgc2VsZWN0ZWQgc3RhdGUgb2YgdGhlIGNoZWNrYm94LlxuICAgKi9cbiAgcHVibGljIHRvZ2dsZSgpIHtcbiAgICB0aGlzLmNoZWNrZWQgPSAhdGhpcy5jaGVja2VkO1xuICB9XG5cbiAgLy8gdGhpcyBpcyB0aGUgaW5pdGlhbCB2YWx1ZSBzZXQgdG8gdGhlIGNvbXBvbmVudFxuICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5jaGVja2VkID0gISF2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGEgbWV0aG9kIGluIG9yZGVyIHRvIHByb3BhZ2F0ZSBjaGFuZ2VzIGJhY2sgdG8gdGhlIGZvcm0uXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KSB7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayB0byBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgY29udHJvbCBoYXMgYmVlbiB0b3VjaGVkLlxuICAgKiBAcGFyYW0gZm4gQ2FsbGJhY2sgdG8gYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIGNoZWNrYm94IGlzIHRvdWNoZWQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSkge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgb24gdGhlIGV2ZW50IG9mIGEgY2hhbmdlIHdpdGhpbiBgQ2hlY2tib3hgIHRvIGJsb2NrIHByb3BhZ2F0aW9uLlxuICAgKi9cbiAgb25DaGFuZ2UoZXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGNsaWNrIGV2ZW50cyBvbiB0aGUgYENoZWNrYm94YCBhbmQgZW1pdHMgY2hhbmdlcyB0byBvdGhlciBjbGFzc2VzLlxuICAgKi9cbiAgb25DbGljayhldmVudCkge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICAgIHRoaXMudHJhbnNpdGlvbkNoZWNrYm94U3RhdGUodGhpcy5fY2hlY2tlZCA/IENoZWNrYm94U3RhdGUuQ2hlY2tlZCA6IENoZWNrYm94U3RhdGUuVW5jaGVja2VkKTtcbiAgICAgIHRoaXMuZW1pdENoYW5nZUV2ZW50KCk7XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gY2hlY2tib3ggaXMgYmx1cnJlZC4gTmVlZGVkIHRvIHByb3Blcmx5IGltcGxlbWVudCBgQ29udHJvbFZhbHVlQWNjZXNzb3JgLlxuICAgKi9cbiAgb25Ub3VjaGVkOiAoKSA9PiBhbnkgPSAoKSA9PiB7IH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgY2hhbmdlcyBiZXR3ZWVuIGNoZWNrYm94IHN0YXRlcy5cbiAgICovXG4gIHRyYW5zaXRpb25DaGVja2JveFN0YXRlKG5ld1N0YXRlOiBDaGVja2JveFN0YXRlKSB7XG4gICAgY29uc3Qgb2xkU3RhdGUgPSB0aGlzLmN1cnJlbnRDaGVja2JveFN0YXRlO1xuXG4gICAgLy8gSW5kZXRlcm1pbmF0ZSBoYXMgdG8gYmUgc2V0IGFsd2F5cyBpZiBpdCdzIHRyYW5zaXRpb25lZCB0b1xuICAgIC8vIGNoZWNrZWQgaGFzIHRvIGJlIHNldCBiZWZvcmUgaW5kZXRlcm1pbmF0ZSBvciBpdCBvdmVycmlkZXNcbiAgICAvLyBpbmRldGVybWluYXRlJ3MgZGFzaFxuICAgIGlmIChuZXdTdGF0ZSA9PT0gQ2hlY2tib3hTdGF0ZS5JbmRldGVybWluYXRlKSB7XG4gICAgICB0aGlzLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuaW5wdXRDaGVja2JveC5uYXRpdmVFbGVtZW50LmluZGV0ZXJtaW5hdGUgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvbGRTdGF0ZSA9PT0gbmV3U3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJlbnRDaGVja2JveFN0YXRlID0gbmV3U3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBpbnN0YW5jZSBvZiBgQ2hlY2tib3hDaGFuZ2VgIHVzZWQgdG8gcHJvcGFnYXRlIHRoZSBjaGFuZ2UgZXZlbnQuXG4gICAqL1xuICBlbWl0Q2hhbmdlRXZlbnQoKSB7XG4gICAgY29uc3QgZXZlbnQgPSBuZXcgQ2hlY2tib3hDaGFuZ2UoKTtcbiAgICBldmVudC5zb3VyY2UgPSB0aGlzO1xuICAgIGV2ZW50LmNoZWNrZWQgPSB0aGlzLmNoZWNrZWQ7XG5cbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLmNoZWNrZWQpO1xuICAgIHRoaXMuY2hhbmdlLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGNoZWNrYm94IGlmIGl0IGlzIGluIHRoZSBpbmRldGVybWluYXRlIHN0YXRlLlxuICAgKi9cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGlmICh0aGlzLmluZGV0ZXJtaW5hdGUpIHtcbiAgICAgIHRoaXMuaW5wdXRDaGVja2JveC5uYXRpdmVFbGVtZW50LmluZGV0ZXJtaW5hdGUgPSB0cnVlO1xuICAgICAgdGhpcy5jaGVja2VkID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCBzZXQgaW4gYHJlZ2lzdGVyT25DaGFuZ2VgIHRvIHByb3BhZ2F0ZSBjaGFuZ2VzIGJhY2sgdG8gdGhlIGZvcm0uXG4gICAqL1xuICBwcm9wYWdhdGVDaGFuZ2UgPSAoXzogYW55KSA9PiB7IH07XG59XG4iXX0=