sb-element
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 12.0.1. It is a component library constructed around the SCSS library [Sb-Theming](https://github.com/SeverinBuchser/SbTheming) and supports [Angular Schematics]
180 lines • 19.1 kB
JavaScript
import { Injectable } from '@angular/core';
import { Color, Size } from "../../core";
import { Queue } from '../../models/queue/queue';
import * as i0 from "@angular/core";
/**
* Provides a global service to display alerts.
*
* The alert service can be used by any component which either whishes to show
* or to create an alert to be shown.
*
* If a component wants to show alerts, the
* component has to call [subscribe]{@link #subscribe} with the component as the
* parameter. The component also needs to implement the
* {@link AlertServiceSubscriber} interface so the service can inform the
* subscriber about the incoming alerts.
*
* If a component wants to create an alert, the service provides different
* methods which have predefined colors. The different methods take a `message`
* which is a `string` and an optional `size` parameter, which is also a
* `string`. The methods then passes the alert to the
* {@link AlertServiceSubscriber} with a predefinded color. There is also a
* method, which lets you customize everything: [alert]{@link #alert}. All these
* methods then add the created alert to the [alertQueue]{@link #alertQueue},
* and then call [work]{@link #work}. This method times the alerts and then
* informs the subscriber when a alert needs to be shown (when an alert is
* ready to be shown).
*
* The lifecycle of an {@link Alert} inside the service:
* 1. The {@link Alert} gets created via a create call (like
* [alert]{@link #alert}).
* 2. The {@link Alert} gets placed into the [alertQueue]{@link #alertQueue}.
* 3. The [work]{@link #work} method then removes an {@link Alert} out of the
* queue and tells the subscribers to show the removed {@link Alert}. The
* {@link Alert} gets collected by the garbage collector after the {@link Alert}
* has been shown.
* 4. If all subscribers have finished showing the {@link Alert}, the work
* method checks if the [alertQueue]{@link #alertQueue} is empty or not. If the
* queue is empty, the [work]{@link #work} method terminates. If not, go to step
* 3 again.
*
*/
export class SbAlertService {
constructor() {
/**
* An array of all subscribers.
*/
this.subscribers = new Array();
/**
* The queue of all [Alerts]{@link Alert} which need to be shown.
*/
this.alertQueue = new Queue();
/**
* Flag to inidcate if the service is busy working on the
* [alertQueue]{@link #alertQueue} or not.
*/
this.isBusy = false;
}
/**
* Adds a new subscriber into [subscribers]{@link #subscribers}.
*
* @param{AlertServiceSubscriber} subscriber The new subscriber
*/
subscribe(subscriber) {
this.subscribers.push(subscriber);
}
/**
* Creates and shows an {@link Alert} with color `warn`.
*
* @param{string} message The message of the alert
* @param{string} size The size of the alert
*/
warn(message, size = Size.MEDIUM) {
this.alert(message, size, Color.WARN);
}
/**
* Creates and shows an {@link Alert} with color `success`.
*
* @param{string} message The message of the alert
* @param{string} size The size of the alert
*/
success(message, size = Size.MEDIUM) {
this.alert(message, size, Color.SUCCESS);
}
/**
* Creates and shows an {@link Alert} with color `info`.
*
* @param{string} message The message of the alert
* @param{string} size The size of the alert
*/
inform(message, size = Size.MEDIUM) {
this.alert(message, size, Color.INFO);
}
/**
* Creates and shows an {@link Alert} with color `primary`.
*
* @param{string} message The message of the alert
* @param{string} size The size of the alert
*/
primary(message, size = Size.MEDIUM) {
this.alert(message, size, Color.PRIMARY);
}
/**
* Creates and shows an {@link Alert} with color `secondary`.
*
* @param{string} message The message of the alert
* @param{string} size The size of the alert
*/
secondary(message, size = Size.MEDIUM) {
this.alert(message, size, Color.SECONDARY);
}
/**
* Creates and shows an {@link Alert}.
*
* The `message`, `size` and `color` of the {@link Alert} can be specified as
* parameters. The {@link Alert} gets created with these parameters and
* placed into the [alertQueue]{@link #alertQueue}. After that, the
* [work]{@link #work} method gets called.
*
* @param{string} message The message of the alert
* @param{string} size The size of the alert
* @param{string} color The color of the alert
*/
alert(message, size = Size.MEDIUM, color = Color.WARN) {
this.alertQueue.enqueue({
message,
size,
color
});
this.work();
}
/**
* Works on the [alertQueue]{@link #alertQueue}.
*
* If the service is not busy working on the [alertQueue]{@link #alertQueue}
* and the [alertQueue]{@link #alertQueue} is not empty, meaning that there
* are still [Alerts]{@link Alert} to process, the method will set the
* [isBusy]{@link #isBusy} flag, remove the next {@link Alert} from the queue
* and show the {@link Alert} by calling [showAlert]{@link #showAlert}.
*
* Once the show call has finished, the [isBusy]{@link #isBusy} flag is unset
* and the [work]{@link #work} method gets called again.
*
* If a current work call is still in progress, meaning the
* [isBusy]{@link #isBusy} flag is set, a new work call will do nothing.
*/
async work() {
if (!this.alertQueue.isEmpty() && !this.isBusy) {
this.isBusy = true;
let alert = this.alertQueue.dequeue();
if (alert) {
this.showAlert(alert).then(() => {
this.isBusy = false;
this.work();
});
}
else {
this.isBusy = false;
}
}
}
/**
* Notifies all subscibers to show an {@link Alert}.
*
* @param{Alert} alert The `Alert` to show
* @returns{Promise<any>} A promise, which is resolved when all subscribers
* have finished showing the `alert`
*/
async showAlert(alert) {
return Promise.all(this.subscribers.map(subscriber => subscriber.alert(alert)));
}
}
SbAlertService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.0", ngImport: i0, type: SbAlertService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
SbAlertService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.0", ngImport: i0, type: SbAlertService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.0", ngImport: i0, type: SbAlertService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NiLWVsZW1lbnQvc3JjL2xpYi9ub3RpZmljYXRpb24vYWxlcnQvYWxlcnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBR3pDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7QUFFakQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9DRztBQUlILE1BQU0sT0FBTyxjQUFjO0lBSDNCO1FBS0U7O1dBRUc7UUFDSyxnQkFBVyxHQUNmLElBQUksS0FBSyxFQUEwQixDQUFDO1FBRXhDOztXQUVHO1FBQ0ssZUFBVSxHQUFtQixJQUFJLEtBQUssRUFBVyxDQUFDO1FBRTFEOzs7V0FHRztRQUNLLFdBQU0sR0FBWSxLQUFLLENBQUM7S0E2SGpDO0lBM0hDOzs7O09BSUc7SUFDSSxTQUFTLENBQUMsVUFBa0M7UUFDakQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksSUFBSSxDQUFDLE9BQWUsRUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU07UUFDN0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxPQUFPLENBQUMsT0FBZSxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTTtRQUNoRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxPQUFlLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNO1FBQy9DLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksT0FBTyxDQUFDLE9BQWUsRUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU07UUFDaEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxTQUFTLENBQUMsT0FBZSxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTTtRQUNsRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNJLEtBQUssQ0FBQyxPQUFlLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJO1FBQ2xFLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDO1lBQ3RCLE9BQU87WUFDUCxJQUFJO1lBQ0osS0FBSztTQUNOLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNLLEtBQUssQ0FBQyxJQUFJO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUM5QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztZQUNuQixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RDLElBQUksS0FBSyxFQUFFO2dCQUNULElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtvQkFDOUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7b0JBQ3BCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDZCxDQUFDLENBQUMsQ0FBQzthQUNKO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO2FBQ3JCO1NBQ0Y7SUFDSCxDQUFDO0lBR0Q7Ozs7OztPQU1HO0lBQ0ssS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFjO1FBQ3BDLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUNuRCxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUN4QixDQUFDLENBQUM7SUFDTCxDQUFDOzsyR0E3SVUsY0FBYzsrR0FBZCxjQUFjLGNBRmIsTUFBTTsyRkFFUCxjQUFjO2tCQUgxQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbG9yLCBTaXplIH0gZnJvbSBcIi4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IFNiQWxlcnQgfSBmcm9tICcuL2FsZXJ0JztcbmltcG9ydCB7IEFsZXJ0U2VydmljZVN1YnNjcmliZXIgfSBmcm9tICcuL2FsZXJ0LXNlcnZpY2Utc3Vic2NyaWJlcic7XG5pbXBvcnQgeyBRdWV1ZSB9IGZyb20gJy4uLy4uL21vZGVscy9xdWV1ZS9xdWV1ZSc7XG5cbi8qKlxuICogUHJvdmlkZXMgYSBnbG9iYWwgc2VydmljZSB0byBkaXNwbGF5IGFsZXJ0cy5cbiAqXG4gKiBUaGUgYWxlcnQgc2VydmljZSBjYW4gYmUgdXNlZCBieSBhbnkgY29tcG9uZW50IHdoaWNoIGVpdGhlciB3aGlzaGVzIHRvIHNob3dcbiAqIG9yIHRvIGNyZWF0ZSBhbiBhbGVydCB0byBiZSBzaG93bi5cbiAqXG4gKiBJZiBhIGNvbXBvbmVudCB3YW50cyB0byBzaG93IGFsZXJ0cywgdGhlXG4gKiBjb21wb25lbnQgaGFzIHRvIGNhbGwgW3N1YnNjcmliZV17QGxpbmsgI3N1YnNjcmliZX0gd2l0aCB0aGUgY29tcG9uZW50IGFzIHRoZVxuICogcGFyYW1ldGVyLiBUaGUgY29tcG9uZW50IGFsc28gbmVlZHMgdG8gaW1wbGVtZW50IHRoZVxuICoge0BsaW5rIEFsZXJ0U2VydmljZVN1YnNjcmliZXJ9IGludGVyZmFjZSBzbyB0aGUgc2VydmljZSBjYW4gaW5mb3JtIHRoZVxuICogc3Vic2NyaWJlciBhYm91dCB0aGUgaW5jb21pbmcgYWxlcnRzLlxuICpcbiAqIElmIGEgY29tcG9uZW50IHdhbnRzIHRvIGNyZWF0ZSBhbiBhbGVydCwgdGhlIHNlcnZpY2UgcHJvdmlkZXMgZGlmZmVyZW50XG4gKiBtZXRob2RzIHdoaWNoIGhhdmUgcHJlZGVmaW5lZCBjb2xvcnMuIFRoZSBkaWZmZXJlbnQgbWV0aG9kcyB0YWtlIGEgYG1lc3NhZ2VgXG4gKiB3aGljaCBpcyBhIGBzdHJpbmdgIGFuZCBhbiBvcHRpb25hbCBgc2l6ZWAgcGFyYW1ldGVyLCB3aGljaCBpcyBhbHNvIGFcbiAqIGBzdHJpbmdgLiBUaGUgbWV0aG9kcyB0aGVuIHBhc3NlcyB0aGUgYWxlcnQgdG8gdGhlXG4gKiB7QGxpbmsgQWxlcnRTZXJ2aWNlU3Vic2NyaWJlcn0gd2l0aCBhIHByZWRlZmluZGVkIGNvbG9yLiBUaGVyZSBpcyBhbHNvIGFcbiAqIG1ldGhvZCwgd2hpY2ggbGV0cyB5b3UgY3VzdG9taXplIGV2ZXJ5dGhpbmc6IFthbGVydF17QGxpbmsgI2FsZXJ0fS4gQWxsIHRoZXNlXG4gKiBtZXRob2RzIHRoZW4gYWRkIHRoZSBjcmVhdGVkIGFsZXJ0IHRvIHRoZSBbYWxlcnRRdWV1ZV17QGxpbmsgI2FsZXJ0UXVldWV9LFxuICogYW5kIHRoZW4gY2FsbCBbd29ya117QGxpbmsgI3dvcmt9LiBUaGlzIG1ldGhvZCB0aW1lcyB0aGUgYWxlcnRzIGFuZCB0aGVuXG4gKiBpbmZvcm1zIHRoZSBzdWJzY3JpYmVyIHdoZW4gYSBhbGVydCBuZWVkcyB0byBiZSBzaG93biAod2hlbiBhbiBhbGVydCBpc1xuICogcmVhZHkgdG8gYmUgc2hvd24pLlxuICpcbiAqIFRoZSBsaWZlY3ljbGUgb2YgYW4ge0BsaW5rIEFsZXJ0fSBpbnNpZGUgdGhlIHNlcnZpY2U6XG4gKiAxLiBUaGUge0BsaW5rIEFsZXJ0fSBnZXRzIGNyZWF0ZWQgdmlhIGEgY3JlYXRlIGNhbGwgKGxpa2VcbiAqIFthbGVydF17QGxpbmsgI2FsZXJ0fSkuXG4gKiAyLiBUaGUge0BsaW5rIEFsZXJ0fSBnZXRzIHBsYWNlZCBpbnRvIHRoZSBbYWxlcnRRdWV1ZV17QGxpbmsgI2FsZXJ0UXVldWV9LlxuICogMy4gVGhlIFt3b3JrXXtAbGluayAjd29ya30gbWV0aG9kIHRoZW4gcmVtb3ZlcyBhbiB7QGxpbmsgQWxlcnR9IG91dCBvZiB0aGVcbiAqIHF1ZXVlIGFuZCB0ZWxscyB0aGUgc3Vic2NyaWJlcnMgdG8gc2hvdyB0aGUgcmVtb3ZlZCB7QGxpbmsgQWxlcnR9LiBUaGVcbiAqIHtAbGluayBBbGVydH0gZ2V0cyBjb2xsZWN0ZWQgYnkgdGhlIGdhcmJhZ2UgY29sbGVjdG9yIGFmdGVyIHRoZSB7QGxpbmsgQWxlcnR9XG4gKiBoYXMgYmVlbiBzaG93bi5cbiAqIDQuIElmIGFsbCBzdWJzY3JpYmVycyBoYXZlIGZpbmlzaGVkIHNob3dpbmcgdGhlIHtAbGluayBBbGVydH0sIHRoZSB3b3JrXG4gKiBtZXRob2QgY2hlY2tzIGlmIHRoZSBbYWxlcnRRdWV1ZV17QGxpbmsgI2FsZXJ0UXVldWV9IGlzIGVtcHR5IG9yIG5vdC4gSWYgdGhlXG4gKiBxdWV1ZSBpcyBlbXB0eSwgdGhlIFt3b3JrXXtAbGluayAjd29ya30gbWV0aG9kIHRlcm1pbmF0ZXMuIElmIG5vdCwgZ28gdG8gc3RlcFxuICogMyBhZ2Fpbi5cbiAqXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFNiQWxlcnRTZXJ2aWNlIHtcblxuICAvKipcbiAgICogQW4gYXJyYXkgb2YgYWxsIHN1YnNjcmliZXJzLlxuICAgKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVyczogQXJyYXk8QWxlcnRTZXJ2aWNlU3Vic2NyaWJlcj5cbiAgICA9IG5ldyBBcnJheTxBbGVydFNlcnZpY2VTdWJzY3JpYmVyPigpO1xuXG4gIC8qKlxuICAgKiBUaGUgcXVldWUgb2YgYWxsIFtBbGVydHNde0BsaW5rIEFsZXJ0fSB3aGljaCBuZWVkIHRvIGJlIHNob3duLlxuICAgKi9cbiAgcHJpdmF0ZSBhbGVydFF1ZXVlOiBRdWV1ZTxTYkFsZXJ0PiA9IG5ldyBRdWV1ZTxTYkFsZXJ0PigpO1xuXG4gIC8qKlxuICAgKiBGbGFnIHRvIGluaWRjYXRlIGlmIHRoZSBzZXJ2aWNlIGlzIGJ1c3kgd29ya2luZyBvbiB0aGVcbiAgICogW2FsZXJ0UXVldWVde0BsaW5rICNhbGVydFF1ZXVlfSBvciBub3QuXG4gICAqL1xuICBwcml2YXRlIGlzQnVzeTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IHN1YnNjcmliZXIgaW50byBbc3Vic2NyaWJlcnNde0BsaW5rICNzdWJzY3JpYmVyc30uXG4gICAqXG4gICAqIEBwYXJhbXtBbGVydFNlcnZpY2VTdWJzY3JpYmVyfSBzdWJzY3JpYmVyIFRoZSBuZXcgc3Vic2NyaWJlclxuICAgKi9cbiAgcHVibGljIHN1YnNjcmliZShzdWJzY3JpYmVyOiBBbGVydFNlcnZpY2VTdWJzY3JpYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpYmVycy5wdXNoKHN1YnNjcmliZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIHNob3dzIGFuIHtAbGluayBBbGVydH0gd2l0aCBjb2xvciBgd2FybmAuXG4gICAqXG4gICAqIEBwYXJhbXtzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2Ugb2YgdGhlIGFsZXJ0XG4gICAqIEBwYXJhbXtzdHJpbmd9IHNpemUgVGhlIHNpemUgb2YgdGhlIGFsZXJ0XG4gICAqL1xuICBwdWJsaWMgd2FybihtZXNzYWdlOiBzdHJpbmcsIHNpemUgPSBTaXplLk1FRElVTSk6IHZvaWQge1xuICAgIHRoaXMuYWxlcnQobWVzc2FnZSwgc2l6ZSwgQ29sb3IuV0FSTik7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbmQgc2hvd3MgYW4ge0BsaW5rIEFsZXJ0fSB3aXRoIGNvbG9yIGBzdWNjZXNzYC5cbiAgICpcbiAgICogQHBhcmFte3N0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSBvZiB0aGUgYWxlcnRcbiAgICogQHBhcmFte3N0cmluZ30gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgYWxlcnRcbiAgICovXG4gIHB1YmxpYyBzdWNjZXNzKG1lc3NhZ2U6IHN0cmluZywgc2l6ZSA9IFNpemUuTUVESVVNKTogdm9pZCB7XG4gICAgdGhpcy5hbGVydChtZXNzYWdlLCBzaXplLCBDb2xvci5TVUNDRVNTKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuZCBzaG93cyBhbiB7QGxpbmsgQWxlcnR9IHdpdGggY29sb3IgYGluZm9gLlxuICAgKlxuICAgKiBAcGFyYW17c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIG9mIHRoZSBhbGVydFxuICAgKiBAcGFyYW17c3RyaW5nfSBzaXplIFRoZSBzaXplIG9mIHRoZSBhbGVydFxuICAgKi9cbiAgcHVibGljIGluZm9ybShtZXNzYWdlOiBzdHJpbmcsIHNpemUgPSBTaXplLk1FRElVTSk6IHZvaWQge1xuICAgIHRoaXMuYWxlcnQobWVzc2FnZSwgc2l6ZSwgQ29sb3IuSU5GTyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbmQgc2hvd3MgYW4ge0BsaW5rIEFsZXJ0fSB3aXRoIGNvbG9yIGBwcmltYXJ5YC5cbiAgICpcbiAgICogQHBhcmFte3N0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSBvZiB0aGUgYWxlcnRcbiAgICogQHBhcmFte3N0cmluZ30gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgYWxlcnRcbiAgICovXG4gIHB1YmxpYyBwcmltYXJ5KG1lc3NhZ2U6IHN0cmluZywgc2l6ZSA9IFNpemUuTUVESVVNKTogdm9pZCB7XG4gICAgdGhpcy5hbGVydChtZXNzYWdlLCBzaXplLCBDb2xvci5QUklNQVJZKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuZCBzaG93cyBhbiB7QGxpbmsgQWxlcnR9IHdpdGggY29sb3IgYHNlY29uZGFyeWAuXG4gICAqXG4gICAqIEBwYXJhbXtzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2Ugb2YgdGhlIGFsZXJ0XG4gICAqIEBwYXJhbXtzdHJpbmd9IHNpemUgVGhlIHNpemUgb2YgdGhlIGFsZXJ0XG4gICAqL1xuICBwdWJsaWMgc2Vjb25kYXJ5KG1lc3NhZ2U6IHN0cmluZywgc2l6ZSA9IFNpemUuTUVESVVNKTogdm9pZCB7XG4gICAgdGhpcy5hbGVydChtZXNzYWdlLCBzaXplLCBDb2xvci5TRUNPTkRBUlkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIHNob3dzIGFuIHtAbGluayBBbGVydH0uXG4gICAqXG4gICAqIFRoZSBgbWVzc2FnZWAsIGBzaXplYCBhbmQgYGNvbG9yYCBvZiB0aGUge0BsaW5rIEFsZXJ0fSBjYW4gYmUgc3BlY2lmaWVkIGFzXG4gICAqIHBhcmFtZXRlcnMuIFRoZSB7QGxpbmsgQWxlcnR9IGdldHMgY3JlYXRlZCB3aXRoIHRoZXNlIHBhcmFtZXRlcnMgYW5kXG4gICAqIHBsYWNlZCBpbnRvIHRoZSBbYWxlcnRRdWV1ZV17QGxpbmsgI2FsZXJ0UXVldWV9LiBBZnRlciB0aGF0LCB0aGVcbiAgICogW3dvcmtde0BsaW5rICN3b3JrfSBtZXRob2QgZ2V0cyBjYWxsZWQuXG4gICAqXG4gICAqIEBwYXJhbXtzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2Ugb2YgdGhlIGFsZXJ0XG4gICAqIEBwYXJhbXtzdHJpbmd9IHNpemUgVGhlIHNpemUgb2YgdGhlIGFsZXJ0XG4gICAqIEBwYXJhbXtzdHJpbmd9IGNvbG9yIFRoZSBjb2xvciBvZiB0aGUgYWxlcnRcbiAgICovXG4gIHB1YmxpYyBhbGVydChtZXNzYWdlOiBzdHJpbmcsIHNpemUgPSBTaXplLk1FRElVTSwgY29sb3IgPSBDb2xvci5XQVJOKTogdm9pZCB7XG4gICAgdGhpcy5hbGVydFF1ZXVlLmVucXVldWUoe1xuICAgICAgbWVzc2FnZSxcbiAgICAgIHNpemUsXG4gICAgICBjb2xvclxuICAgIH0pO1xuICAgIHRoaXMud29yaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdvcmtzIG9uIHRoZSBbYWxlcnRRdWV1ZV17QGxpbmsgI2FsZXJ0UXVldWV9LlxuICAgKlxuICAgKiBJZiB0aGUgc2VydmljZSBpcyBub3QgYnVzeSB3b3JraW5nIG9uIHRoZSBbYWxlcnRRdWV1ZV17QGxpbmsgI2FsZXJ0UXVldWV9XG4gICAqIGFuZCB0aGUgW2FsZXJ0UXVldWVde0BsaW5rICNhbGVydFF1ZXVlfSBpcyBub3QgZW1wdHksIG1lYW5pbmcgdGhhdCB0aGVyZVxuICAgKiBhcmUgc3RpbGwgW0FsZXJ0c117QGxpbmsgQWxlcnR9IHRvIHByb2Nlc3MsIHRoZSBtZXRob2Qgd2lsbCBzZXQgdGhlXG4gICAqIFtpc0J1c3lde0BsaW5rICNpc0J1c3l9IGZsYWcsIHJlbW92ZSB0aGUgbmV4dCB7QGxpbmsgQWxlcnR9IGZyb20gdGhlIHF1ZXVlXG4gICAqIGFuZCBzaG93IHRoZSB7QGxpbmsgQWxlcnR9IGJ5IGNhbGxpbmcgW3Nob3dBbGVydF17QGxpbmsgI3Nob3dBbGVydH0uXG4gICAqXG4gICAqIE9uY2UgdGhlIHNob3cgY2FsbCBoYXMgZmluaXNoZWQsIHRoZSBbaXNCdXN5XXtAbGluayAjaXNCdXN5fSBmbGFnIGlzIHVuc2V0XG4gICAqIGFuZCB0aGUgW3dvcmtde0BsaW5rICN3b3JrfSBtZXRob2QgZ2V0cyBjYWxsZWQgYWdhaW4uXG4gICAqXG4gICAqIElmIGEgY3VycmVudCB3b3JrIGNhbGwgaXMgc3RpbGwgaW4gcHJvZ3Jlc3MsIG1lYW5pbmcgdGhlXG4gICAqIFtpc0J1c3lde0BsaW5rICNpc0J1c3l9IGZsYWcgaXMgc2V0LCBhIG5ldyB3b3JrIGNhbGwgd2lsbCBkbyBub3RoaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3b3JrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5hbGVydFF1ZXVlLmlzRW1wdHkoKSAmJiAhdGhpcy5pc0J1c3kpIHtcbiAgICAgIHRoaXMuaXNCdXN5ID0gdHJ1ZTtcbiAgICAgIGxldCBhbGVydCA9IHRoaXMuYWxlcnRRdWV1ZS5kZXF1ZXVlKCk7XG4gICAgICBpZiAoYWxlcnQpIHtcbiAgICAgICAgdGhpcy5zaG93QWxlcnQoYWxlcnQpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaXNCdXN5ID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy53b3JrKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pc0J1c3kgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBOb3RpZmllcyBhbGwgc3Vic2NpYmVycyB0byBzaG93IGFuIHtAbGluayBBbGVydH0uXG4gICAqXG4gICAqIEBwYXJhbXtBbGVydH0gYWxlcnQgVGhlIGBBbGVydGAgdG8gc2hvd1xuICAgKiBAcmV0dXJuc3tQcm9taXNlPGFueT59IEEgcHJvbWlzZSwgd2hpY2ggaXMgcmVzb2x2ZWQgd2hlbiBhbGwgc3Vic2NyaWJlcnNcbiAgICogaGF2ZSBmaW5pc2hlZCBzaG93aW5nIHRoZSBgYWxlcnRgXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNob3dBbGVydChhbGVydDogU2JBbGVydCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHRoaXMuc3Vic2NyaWJlcnMubWFwKHN1YnNjcmliZXIgPT5cbiAgICAgIHN1YnNjcmliZXIuYWxlcnQoYWxlcnQpXG4gICAgKSk7XG4gIH1cbn1cbiJdfQ==