UNPKG

@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>

373 lines 23.4 kB
/** * @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} */ const ToggleState = { Init: 0, Checked: 1, Unchecked: 2, }; export { ToggleState }; ToggleState[ToggleState.Init] = 'Init'; ToggleState[ToggleState.Checked] = 'Checked'; ToggleState[ToggleState.Unchecked] = 'Unchecked'; export class ToggleChange { } if (false) { /** @type {?} */ ToggleChange.prototype.source; /** @type {?} */ ToggleChange.prototype.checked; } // tslint:disable-next-line: component-class-suffix export class Toggle { /** * Creates an instance of `Toggle`. * @param {?} changeDetectorRef */ constructor(changeDetectorRef) { this.changeDetectorRef = changeDetectorRef; /** * Set to `true` for toggle to be rendered without any classes on the host element. */ this.inline = false; /** * Set to `true` for a disabled toggle. */ this.disabled = false; /** * Set to `true` for a loading toggle. */ this.skeleton = false; /** * Set to `true` to hide the toggle labels. */ this.hideLabel = false; /** * The unique id for the toggle component. */ this.id = `toggle-${Toggle.toggleCount}`; /** * Used to set the `aria-label` attribute on the input element. */ // tslint:disable-next-line:no-input-rename this.ariaLabel = ''; /** * Horizontal distribution of elements */ this.distribution = 'equalSpacing'; /** * Emits event notifying other classes when a change in state occurs on a toggle after a * click. */ // tslint:disable-next-line: no-output-native this.change = new EventEmitter(); /** * Set to `true` if the input toggle is selected (or checked). */ // tslint:disable-next-line: variable-name this._checked = false; this.currentToggleState = ToggleState.Init; /** * Called when toggle is blurred. Needed to properly implement `ControlValueAccessor`. */ this.onTouched = (/** * @return {?} */ () => { }); /** * Method set in `registerOnChange` to propagate changes back to the form. */ this.propagateChange = (/** * @param {?} _ * @return {?} */ (_) => { }); Toggle.toggleCount++; } /** * Returns value `true` if state is selected for the toggle. * @return {?} */ get checked() { return this._checked; } /** * Updating the state of a toggle to match the state of the parameter passed in. * @param {?} checked * @return {?} */ set checked(checked) { if (checked !== this.checked) { this._checked = checked; this.changeDetectorRef.markForCheck(); } } /** * @return {?} */ get toggleWrapperClass() { return !this.inline; } /** * @return {?} */ get formItemClass() { return !this.inline; } /** * Toggle the selected state of the toggle. * @return {?} */ toggle() { this.checked = !this.checked; } // this is the initial value set to the component /** * @param {?} value * @return {?} */ writeValue(value) { this.checked = !!value; } /** * Sets a method in order to propagate changes back to the form. * @param {?} fn * @return {?} */ registerOnChange(fn) { this.propagateChange = fn; } /** * Registers a callback to be triggered when the control has been touched. * @param {?} fn Callback to be triggered when the toggle is touched. * @return {?} */ registerOnTouched(fn) { this.onTouched = fn; } /** * Executes on the event of a change within `Toggle` to block propagation. * @param {?} event * @return {?} */ onChange(event) { event.stopPropagation(); } /** * Handles click events on the `Toggle` and emits changes to other classes. * @param {?} event * @return {?} */ onClick(event) { if (!this.disabled) { this.toggle(); this.transitionToggleState(this._checked ? ToggleState.Checked : ToggleState.Unchecked); this.emitChangeEvent(); } } /** * Handles changes between toggle states. * @param {?} newState * @return {?} */ transitionToggleState(newState) { /** @type {?} */ const oldState = this.currentToggleState; if (oldState === newState) { return; } this.currentToggleState = newState; } /** * Creates instance of `ToggleChange` used to propagate the change event. * @return {?} */ emitChangeEvent() { /** @type {?} */ const event = new ToggleChange(); event.source = this; event.checked = this.checked; this.propagateChange(this.checked); this.change.emit(event); } } /** * Variable used for creating unique ids for toggle components. */ Toggle.toggleCount = 0; Toggle.decorators = [ { type: Component, args: [{ selector: 'suka-toggle', template: ` <label class=" toggle toggle--distribution-{{distribution}} " [ngClass]="{ 'skeleton' : skeleton, 'disabled': disabled }" > <ng-content></ng-content> <input type="checkbox" [id]="id" [value]="value" [name]="name" [required]="required" [checked]="checked" [disabled]="disabled" [attr.aria-label]="ariaLabel" [attr.aria-labelledby]="ariaLabelledby" [attr.aria-checked]="checked" (change)="onChange($event)" (click)="onClick($event)" /> <span class="toggle-body"> <span class="toggle-switch"></span> <span class="toggle-track"> <span class="toggle-bg"></span> <span class="toggle-bg toggle-bg_negative"></span> </span> </span> </label> `, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: Toggle, multi: true } ], changeDetection: ChangeDetectionStrategy.OnPush }] } ]; /** @nocollapse */ Toggle.ctorParameters = () => [ { type: ChangeDetectorRef } ]; Toggle.propDecorators = { 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',] }], distribution: [{ type: Input }], checked: [{ type: Input }], toggleWrapperClass: [{ type: HostBinding, args: ['class.toggle-wrapper',] }], formItemClass: [{ type: HostBinding, args: ['class.form-item',] }], change: [{ type: Output }], inputToggle: [{ type: ViewChild, args: ['inputToggle', { static: true },] }] }; if (false) { /** * Variable used for creating unique ids for toggle components. * @type {?} */ Toggle.toggleCount; /** * Set to `true` for toggle to be rendered with nested styles. * @type {?} */ Toggle.prototype.nested; /** * Set to `true` for toggle to be rendered without any classes on the host element. * @type {?} */ Toggle.prototype.inline; /** * Set to `true` for a disabled toggle. * @type {?} */ Toggle.prototype.disabled; /** * Set to `true` for a loading toggle. * @type {?} */ Toggle.prototype.skeleton; /** * Set to `true` to hide the toggle labels. * @type {?} */ Toggle.prototype.hideLabel; /** * Sets the name attribute on the `input` element. * @type {?} */ Toggle.prototype.name; /** * The unique id for the toggle component. * @type {?} */ Toggle.prototype.id; /** * Reflects the required attribute of the `input` element. * @type {?} */ Toggle.prototype.required; /** * Sets the value attribute on the `input` element. * @type {?} */ Toggle.prototype.value; /** * Used to set the `aria-label` attribute on the input element. * @type {?} */ Toggle.prototype.ariaLabel; /** * Used to set the `aria-labelledby` attribute on the input element. * @type {?} */ Toggle.prototype.ariaLabelledby; /** * Horizontal distribution of elements * @type {?} */ Toggle.prototype.distribution; /** * Emits event notifying other classes when a change in state occurs on a toggle after a * click. * @type {?} */ Toggle.prototype.change; /** * Set to `true` if the input toggle is selected (or checked). * @type {?} */ Toggle.prototype._checked; /** @type {?} */ Toggle.prototype.currentToggleState; /** * Maintains a reference to the view DOM element of the `Toggle`. * @type {?} */ Toggle.prototype.inputToggle; /** * Called when toggle is blurred. Needed to properly implement `ControlValueAccessor`. * @type {?} */ Toggle.prototype.onTouched; /** * Method set in `registerOnChange` to propagate changes back to the form. * @type {?} */ Toggle.prototype.propagateChange; /** * @type {?} * @protected */ Toggle.prototype.changeDetectorRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9nZ2xlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BrdXNoa2kvbmctc3VrYS8iLCJzb3VyY2VzIjpbImxpYi90b2dnbGUvdG9nZ2xlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsV0FBVyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQzs7O0lBSXZFLE9BQUk7SUFDSixVQUFPO0lBQ1AsWUFBUzs7Ozs7O0FBR1gsTUFBTSxPQUFPLFlBQVk7Q0FHeEI7OztJQUZDLDhCQUFlOztJQUNmLCtCQUFpQjs7QUFrRG5CLG1EQUFtRDtBQUNuRCxNQUFNLE9BQU8sTUFBTTs7Ozs7SUEwR2pCLFlBQXNCLGlCQUFvQztRQUFwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1COzs7O1FBN0ZqRCxXQUFNLEdBQUcsS0FBSyxDQUFDOzs7O1FBSWYsYUFBUSxHQUFHLEtBQUssQ0FBQzs7OztRQUlqQixhQUFRLEdBQUcsS0FBSyxDQUFDOzs7O1FBSWpCLGNBQVMsR0FBRyxLQUFLLENBQUM7Ozs7UUFRbEIsT0FBRSxHQUFHLFVBQVUsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDOzs7OztRQWF4QixjQUFTLEdBQUcsRUFBRSxDQUFDOzs7O1FBVzNCLGlCQUFZLEdBQXVELGNBQWMsQ0FBQzs7Ozs7O1FBK0JqRixXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQWdCLENBQUM7Ozs7O1FBTXBELGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFakIsdUJBQWtCLEdBQWdCLFdBQVcsQ0FBQyxJQUFJLENBQUM7Ozs7UUErRG5ELGNBQVM7OztRQUFjLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBQzs7OztRQThCakMs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QUs7d0JBSUwsS0FBSzttQkFJTCxLQUFLO2lCQUlMLEtBQUs7dUJBSUwsS0FBSztvQkFJTCxLQUFLO3dCQUtMLEtBQUssU0FBQyxZQUFZOzZCQUtsQixLQUFLLFNBQUMsaUJBQWlCOzJCQU12QixLQUFLO3NCQVlMLEtBQUs7aUNBT0wsV0FBVyxTQUFDLHNCQUFzQjs0QkFHbEMsV0FBVyxTQUFDLGlCQUFpQjtxQkFTN0IsTUFBTTswQkFhTixTQUFTLFNBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTs7Ozs7OztJQWpHMUMsbUJBQXVCOzs7OztJQUt2Qix3QkFBeUI7Ozs7O0lBSXpCLHdCQUF3Qjs7Ozs7SUFJeEIsMEJBQTBCOzs7OztJQUkxQiwwQkFBMEI7Ozs7O0lBSTFCLDJCQUEyQjs7Ozs7SUFJM0Isc0JBQXNCOzs7OztJQUl0QixvQkFBNkM7Ozs7O0lBSTdDLDBCQUEyQjs7Ozs7SUFJM0IsdUJBQXVCOzs7OztJQUt2QiwyQkFBb0M7Ozs7O0lBS3BDLGdDQUFpRDs7Ozs7SUFNakQsOEJBQTJGOzs7Ozs7SUErQjNGLHdCQUFvRDs7Ozs7SUFNcEQsMEJBQWlCOztJQUVqQixvQ0FBbUQ7Ozs7O0lBS25ELDZCQUFvRTs7Ozs7SUEwRHBFLDJCQUFpQzs7Ozs7SUE4QmpDLGlDQUFrQzs7Ozs7SUFuRnRCLG1DQUE4QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgSG9zdEJpbmRpbmdcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiwgQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cblxuZXhwb3J0IGVudW0gVG9nZ2xlU3RhdGUge1xuICBJbml0LFxuICBDaGVja2VkLFxuICBVbmNoZWNrZWRcbn1cblxuZXhwb3J0IGNsYXNzIFRvZ2dsZUNoYW5nZSB7XG4gIHNvdXJjZTogVG9nZ2xlO1xuICBjaGVja2VkOiBib29sZWFuO1xufVxuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N1a2EtdG9nZ2xlJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bGFiZWxcbiAgICAgIGNsYXNzPVwiXG4gICAgICAgIHRvZ2dsZVxuICAgICAgICB0b2dnbGUtLWRpc3RyaWJ1dGlvbi17e2Rpc3RyaWJ1dGlvbn19XG4gICAgICBcIlxuICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAnc2tlbGV0b24nIDogc2tlbGV0b24sXG4gICAgICAgICdkaXNhYmxlZCc6IGRpc2FibGVkXG4gICAgICB9XCJcbiAgICA+XG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICA8aW5wdXRcbiAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgW2lkXT1cImlkXCJcbiAgICAgICAgW3ZhbHVlXT1cInZhbHVlXCJcbiAgICAgICAgW25hbWVdPVwibmFtZVwiXG4gICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgICAgIFtjaGVja2VkXT1cImNoZWNrZWRcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbFwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJhcmlhTGFiZWxsZWRieVwiXG4gICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCJjaGVja2VkXCJcbiAgICAgICAgKGNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiXG4gICAgICAvPlxuICAgICAgPHNwYW4gY2xhc3M9XCJ0b2dnbGUtYm9keVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRvZ2dsZS1zd2l0Y2hcIj48L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidG9nZ2xlLXRyYWNrXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b2dnbGUtYmdcIj48L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b2dnbGUtYmcgdG9nZ2xlLWJnX25lZ2F0aXZlXCI+PC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L3NwYW4+XG4gICAgPC9sYWJlbD5cbiAgYCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogVG9nZ2xlLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBjb21wb25lbnQtY2xhc3Mtc3VmZml4XG5leHBvcnQgY2xhc3MgVG9nZ2xlIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICAvKipcbiAgICogVmFyaWFibGUgdXNlZCBmb3IgY3JlYXRpbmcgdW5pcXVlIGlkcyBmb3IgdG9nZ2xlIGNvbXBvbmVudHMuXG4gICAqL1xuICBzdGF0aWMgdG9nZ2xlQ291bnQgPSAwO1xuXG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIGZvciB0b2dnbGUgdG8gYmUgcmVuZGVyZWQgd2l0aCBuZXN0ZWQgc3R5bGVzLlxuICAgKi9cbiAgQElucHV0KCkgbmVzdGVkOiBib29sZWFuO1xuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCBmb3IgdG9nZ2xlIHRvIGJlIHJlbmRlcmVkIHdpdGhvdXQgYW55IGNsYXNzZXMgb24gdGhlIGhvc3QgZWxlbWVudC5cbiAgICovXG4gIEBJbnB1dCgpIGlubGluZSA9IGZhbHNlO1xuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCBmb3IgYSBkaXNhYmxlZCB0b2dnbGUuXG4gICAqL1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCBmb3IgYSBsb2FkaW5nIHRvZ2dsZS5cbiAgICovXG4gIEBJbnB1dCgpIHNrZWxldG9uID0gZmFsc2U7XG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIHRvIGhpZGUgdGhlIHRvZ2dsZSBsYWJlbHMuXG4gICAqL1xuICBASW5wdXQoKSBoaWRlTGFiZWwgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFNldHMgdGhlIG5hbWUgYXR0cmlidXRlIG9uIHRoZSBgaW5wdXRgIGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKSBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdW5pcXVlIGlkIGZvciB0aGUgdG9nZ2xlIGNvbXBvbmVudC5cbiAgICovXG4gIEBJbnB1dCgpIGlkID0gYHRvZ2dsZS0ke1RvZ2dsZS50b2dnbGVDb3VudH1gO1xuICAvKipcbiAgICogUmVmbGVjdHMgdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZSBvZiB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKi9cbiAgQElucHV0KCkgcmVxdWlyZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgb24gdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICovXG4gIEBJbnB1dCgpIHZhbHVlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBVc2VkIHRvIHNldCB0aGUgYGFyaWEtbGFiZWxgIGF0dHJpYnV0ZSBvbiB0aGUgaW5wdXQgZWxlbWVudC5cbiAgICovXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1pbnB1dC1yZW5hbWVcbiAgQElucHV0KCdhcmlhLWxhYmVsJykgYXJpYUxhYmVsID0gJyc7XG4gIC8qKlxuICAgKiBVc2VkIHRvIHNldCB0aGUgYGFyaWEtbGFiZWxsZWRieWAgYXR0cmlidXRlIG9uIHRoZSBpbnB1dCBlbGVtZW50LlxuICAgKi9cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWlucHV0LXJlbmFtZVxuICBASW5wdXQoJ2FyaWEtbGFiZWxsZWRieScpIGFyaWFMYWJlbGxlZGJ5OiBzdHJpbmc7XG5cblxuICAvKipcbiAgICogIEhvcml6b250YWwgZGlzdHJpYnV0aW9uIG9mIGVsZW1lbnRzXG4gICAqL1xuICBASW5wdXQoKSBkaXN0cmlidXRpb246ICdsZWFkaW5nJyB8ICd0cmFpbGluZycgfCAnZXF1YWxTcGFjaW5nJyB8ICdjZW50ZXInID0gJ2VxdWFsU3BhY2luZyc7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdmFsdWUgYHRydWVgIGlmIHN0YXRlIGlzIHNlbGVjdGVkIGZvciB0aGUgdG9nZ2xlLlxuICAgKi9cbiAgZ2V0IGNoZWNrZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NoZWNrZWQ7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRpbmcgdGhlIHN0YXRlIG9mIGEgdG9nZ2xlIHRvIG1hdGNoIHRoZSBzdGF0ZSBvZiB0aGUgcGFyYW1ldGVyIHBhc3NlZCBpbi5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBjaGVja2VkKGNoZWNrZWQ6IGJvb2xlYW4pIHtcbiAgICBpZiAoY2hlY2tlZCAhPT0gdGhpcy5jaGVja2VkKSB7XG4gICAgICB0aGlzLl9jaGVja2VkID0gY2hlY2tlZDtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy50b2dnbGUtd3JhcHBlcicpIGdldCB0b2dnbGVXcmFwcGVyQ2xhc3MoKSB7XG4gICAgcmV0dXJuICF0aGlzLmlubGluZTtcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZvcm0taXRlbScpIGdldCBmb3JtSXRlbUNsYXNzKCkge1xuICAgIHJldHVybiAhdGhpcy5pbmxpbmU7XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgZXZlbnQgbm90aWZ5aW5nIG90aGVyIGNsYXNzZXMgd2hlbiBhIGNoYW5nZSBpbiBzdGF0ZSBvY2N1cnMgb24gYSB0b2dnbGUgYWZ0ZXIgYVxuICAgKiBjbGljay5cbiAgICovXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tb3V0cHV0LW5hdGl2ZVxuICBAT3V0cHV0KCkgY2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUb2dnbGVDaGFuZ2U+KCk7XG5cbiAgLyoqXG4gICAqIFNldCB0byBgdHJ1ZWAgaWYgdGhlIGlucHV0IHRvZ2dsZSBpcyBzZWxlY3RlZCAob3IgY2hlY2tlZCkuXG4gICAqL1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcbiAgX2NoZWNrZWQgPSBmYWxzZTtcblxuICBjdXJyZW50VG9nZ2xlU3RhdGU6IFRvZ2dsZVN0YXRlID0gVG9nZ2xlU3RhdGUuSW5pdDtcblxuICAvKipcbiAgICogTWFpbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2aWV3IERPTSBlbGVtZW50IG9mIHRoZSBgVG9nZ2xlYC5cbiAgICovXG4gIEBWaWV3Q2hpbGQoJ2lucHV0VG9nZ2xlJywgeyBzdGF0aWM6IHRydWUgfSkgaW5wdXRUb2dnbGU6IEVsZW1lbnRSZWY7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYFRvZ2dsZWAuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgVG9nZ2xlLnRvZ2dsZUNvdW50Kys7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlIHRoZSBzZWxlY3RlZCBzdGF0ZSBvZiB0aGUgdG9nZ2xlLlxuICAgKi9cbiAgcHVibGljIHRvZ2dsZSgpIHtcbiAgICB0aGlzLmNoZWNrZWQgPSAhdGhpcy5jaGVja2VkO1xuICB9XG5cbiAgLy8gdGhpcyBpcyB0aGUgaW5pdGlhbCB2YWx1ZSBzZXQgdG8gdGhlIGNvbXBvbmVudFxuICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5jaGVja2VkID0gISF2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGEgbWV0aG9kIGluIG9yZGVyIHRvIHByb3BhZ2F0ZSBjaGFuZ2VzIGJhY2sgdG8gdGhlIGZvcm0uXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KSB7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayB0byBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgY29udHJvbCBoYXMgYmVlbiB0b3VjaGVkLlxuICAgKiBAcGFyYW0gZm4gQ2FsbGJhY2sgdG8gYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIHRvZ2dsZSBpcyB0b3VjaGVkLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIG9uIHRoZSBldmVudCBvZiBhIGNoYW5nZSB3aXRoaW4gYFRvZ2dsZWAgdG8gYmxvY2sgcHJvcGFnYXRpb24uXG4gICAqL1xuICBvbkNoYW5nZShldmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgY2xpY2sgZXZlbnRzIG9uIHRoZSBgVG9nZ2xlYCBhbmQgZW1pdHMgY2hhbmdlcyB0byBvdGhlciBjbGFzc2VzLlxuICAgKi9cbiAgb25DbGljayhldmVudCkge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICAgIHRoaXMudHJhbnNpdGlvblRvZ2dsZVN0YXRlKHRoaXMuX2NoZWNrZWQgPyBUb2dnbGVTdGF0ZS5DaGVja2VkIDogVG9nZ2xlU3RhdGUuVW5jaGVja2VkKTtcbiAgICAgIHRoaXMuZW1pdENoYW5nZUV2ZW50KCk7XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdG9nZ2xlIGlzIGJsdXJyZWQuIE5lZWRlZCB0byBwcm9wZXJseSBpbXBsZW1lbnQgYENvbnRyb2xWYWx1ZUFjY2Vzc29yYC5cbiAgICovXG4gIG9uVG91Y2hlZDogKCkgPT4gYW55ID0gKCkgPT4geyB9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGNoYW5nZXMgYmV0d2VlbiB0b2dnbGUgc3RhdGVzLlxuICAgKi9cbiAgdHJhbnNpdGlvblRvZ2dsZVN0YXRlKG5ld1N0YXRlOiBUb2dnbGVTdGF0ZSkge1xuICAgIGNvbnN0IG9sZFN0YXRlID0gdGhpcy5jdXJyZW50VG9nZ2xlU3RhdGU7XG5cbiAgICBpZiAob2xkU3RhdGUgPT09IG5ld1N0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50VG9nZ2xlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGluc3RhbmNlIG9mIGBUb2dnbGVDaGFuZ2VgIHVzZWQgdG8gcHJvcGFnYXRlIHRoZSBjaGFuZ2UgZXZlbnQuXG4gICAqL1xuICBlbWl0Q2hhbmdlRXZlbnQoKSB7XG4gICAgY29uc3QgZXZlbnQgPSBuZXcgVG9nZ2xlQ2hhbmdlKCk7XG4gICAgZXZlbnQuc291cmNlID0gdGhpcztcbiAgICBldmVudC5jaGVja2VkID0gdGhpcy5jaGVja2VkO1xuXG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodGhpcy5jaGVja2VkKTtcbiAgICB0aGlzLmNoYW5nZS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2Qgc2V0IGluIGByZWdpc3Rlck9uQ2hhbmdlYCB0byBwcm9wYWdhdGUgY2hhbmdlcyBiYWNrIHRvIHRoZSBmb3JtLlxuICAgKi9cbiAgcHJvcGFnYXRlQ2hhbmdlID0gKF86IGFueSkgPT4geyB9O1xufVxuIl19