ontimize-web-ngx
Version:
Ontimize Web framework using Angular 15
113 lines • 20.8 kB
JavaScript
import { Inject, Injectable, Optional } from "@angular/core";
import { BehaviorSubject, timer, tap, shareReplay, distinctUntilChanged, filter, map, merge, Subject, takeUntil } from "rxjs";
import { O_TABLE_GLOBAL_CONFIG } from "./utils/o-table.tokens";
import * as i0 from "@angular/core";
export class OTableLoadingService {
constructor(config) {
this.config = config;
this.loading$ = new BehaviorSubject(true);
this.THRESHOLD = 300;
this.MIN_VISIBLE = 300;
this.visibleSince = null;
this.showSkeleton$ = new BehaviorSubject(false);
this.processingBlocked$ = new BehaviorSubject(false);
this.destroy$ = new Subject();
this.isInitialLoad$ = new BehaviorSubject(true);
this.isLoading$ = this.loading$.pipe(distinctUntilChanged(), map(loading => ({ loading, shouldShow: loading })), shareReplay(1));
this.handleProcessingBlock$ = this.isLoading$.pipe(tap(state => {
const shouldBlock = state.shouldShow;
if (this.processingBlocked$.value !== shouldBlock) {
this.processingBlocked$.next(shouldBlock);
}
}));
this.isProcessing$ = this.processingBlocked$.pipe(distinctUntilChanged(), shareReplay(1));
this.handleShow$ = this.isLoading$.pipe(filter(state => state.shouldShow), tap(() => {
const threshold = this.isInitialLoad$.value ? 0 : this.THRESHOLD;
timer(threshold).subscribe(() => {
if (this.loading$.value) {
this.visibleSince = performance.now();
this.showSkeleton$.next(true);
}
});
}));
this.handleHide$ = this.isLoading$.pipe(filter(state => !state.shouldShow), tap(() => {
const now = performance.now();
if (this.isInitialLoad$.value) {
this.isInitialLoad$.next(false);
}
if (this.visibleSince !== null) {
const elapsed = now - this.visibleSince;
if (elapsed < this.MIN_VISIBLE) {
const remaining = this.MIN_VISIBLE - elapsed;
timer(remaining).subscribe(() => {
this.visibleSince = null;
this.showSkeleton$.next(false);
});
}
else {
this.visibleSince = null;
this.showSkeleton$.next(false);
}
}
}));
this.showLoading$ = merge(this.handleShow$, this.handleHide$).pipe(map(() => this.showSkeleton$.value), distinctUntilChanged(), shareReplay(1));
this.THRESHOLD = config?.loading?.threshold ?? this.THRESHOLD;
this.MIN_VISIBLE = config?.loading?.minVisible ?? this.MIN_VISIBLE;
this.handleProcessingBlock$
.pipe(takeUntil(this.destroy$))
.subscribe();
this.handleShow$
.pipe(takeUntil(this.destroy$))
.subscribe();
this.handleHide$
.pipe(takeUntil(this.destroy$))
.subscribe();
this.showLoading$ = this.showSkeleton$.pipe(takeUntil(this.destroy$), distinctUntilChanged(), shareReplay(1));
}
setLoading(value) {
if (value && this.isBlocked()) {
return;
}
if (this.loading$.value !== value) {
this.loading$.next(value);
}
}
isBlocked() {
return this.processingBlocked$.value;
}
setProcessingBlock(value) {
if (this.processingBlocked$.value !== value) {
this.processingBlocked$.next(value);
}
}
handleProtected(event) {
if (this.isBlocked()) {
if (event) {
event.preventDefault();
event.stopPropagation();
}
return false;
}
this.setLoading(true);
return true;
}
ngOnDestroy() {
this.destroy$.next(void 0);
this.destroy$.complete();
this.loading$.complete();
this.showSkeleton$.complete();
this.processingBlocked$.complete();
this.isInitialLoad$.complete();
}
}
OTableLoadingService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTableLoadingService, deps: [{ token: O_TABLE_GLOBAL_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
OTableLoadingService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTableLoadingService });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTableLoadingService, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [O_TABLE_GLOBAL_CONFIG]
}] }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby10YWJsZS1sb2FkaW5nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbnRpbWl6ZS13ZWItbmd4L3NyYy9saWIvY29tcG9uZW50cy90YWJsZS9vLXRhYmxlLWxvYWRpbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBYSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTlILE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDOztBQUkvRCxNQUFNLE9BQU8sb0JBQW9CO0lBNEMvQixZQUM4RCxNQUEwQjtRQUExQixXQUFNLEdBQU4sTUFBTSxDQUFvQjtRQXRDdkUsYUFBUSxHQUFHLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBTXJDLGNBQVMsR0FBVyxHQUFHLENBQUM7UUFNeEIsZ0JBQVcsR0FBVyxHQUFHLENBQUM7UUFNbkMsaUJBQVksR0FBa0IsSUFBSSxDQUFDO1FBSzFCLGtCQUFhLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFLcEQsdUJBQWtCLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFLekQsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFFL0IsbUJBQWMsR0FBRyxJQUFJLGVBQWUsQ0FBVSxJQUFJLENBQUMsQ0FBQztRQWdDcEQsZUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUM5QyxvQkFBb0IsRUFBRSxFQUN0QixHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUs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QUFDO0lBT0Qsa0JBQWtCLENBQUMsS0FBYztRQUMvQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEtBQUssS0FBSyxFQUFFO1lBQzNDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDckM7SUFDSCxDQUFDO0lBZUQsZUFBZSxDQUFDLEtBQWtCO1FBQ2hDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ3BCLElBQUksS0FBSyxFQUFFO2dCQUNULEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO2FBQ3pCO1lBQ0QsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBVUQsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUV6QixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDakMsQ0FBQzs7a0hBcFBVLG9CQUFvQixrQkE2Q1QscUJBQXFCO3NIQTdDaEMsb0JBQW9COzRGQUFwQixvQkFBb0I7a0JBRGhDLFVBQVU7OzBCQThDTixRQUFROzswQkFBSSxNQUFNOzJCQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT25EZXN0cm95LCBPcHRpb25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIHRpbWVyLCB0YXAsIHNoYXJlUmVwbGF5LCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBtYXAsIG1lcmdlLCBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tIFwicnhqc1wiO1xuXG5pbXBvcnQgeyBPX1RBQkxFX0dMT0JBTF9DT05GSUcgfSBmcm9tIFwiLi91dGlscy9vLXRhYmxlLnRva2Vuc1wiO1xuaW1wb3J0IHsgT1RhYmxlR2xvYmFsQ29uZmlnIH0gZnJvbSBcIi4uLy4uL3R5cGVzL3RhYmxlL28tdGFibGUtZ2xvYmFsLWNvbmZpZy50eXBlXCI7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBPVGFibGVMb2FkaW5nU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSAge1xuXG4gIC8qKlxuICAgICAqIFRyYWNrcyB0aGUgcmF3IGxvYWRpbmcgc3RhdGUuXG4gICAgICogLSBgdHJ1ZWA6IGFuIGFzeW5jIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcy5cbiAgICAgKiAtIGBmYWxzZWA6IG5vIGxvYWRpbmcgaXMgb2NjdXJyaW5nLlxuICAgICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGxvYWRpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0cnVlKTtcblxuICAvKipcbiAgICogTWluaW11bSBkZWxheSAobXMpIHJlcXVpcmVkIGJlZm9yZSB0aGUgc2tlbGV0b24gY2FuIGJlIGRpc3BsYXllZC5cbiAgICogUHJldmVudHMgZmxpY2tlcmluZyB3aGVuIG9wZXJhdGlvbnMgcmVzb2x2ZSBxdWlja2x5LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBUSFJFU0hPTEQ6IG51bWJlciA9IDMwMDtcblxuICAvKipcbiAgICogTWluaW11bSBhbW91bnQgb2YgdGltZSAobXMpIHRoZSBza2VsZXRvbiBtdXN0IHJlbWFpbiB2aXNpYmxlIG9uY2Ugc2hvd24uXG4gICAqIEVuc3VyZXMgY29uc2lzdGVudCBVWCB3aGVuIG9wZXJhdGlvbnMgZmluaXNoIHF1aWNrbHkuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IE1JTl9WSVNJQkxFOiBudW1iZXIgPSAzMDA7XG5cbiAgLyoqXG4gICAqIFRpbWVzdGFtcCBpbmRpY2F0aW5nIHdoZW4gdGhlIHNrZWxldG9uIHdhcyBtYWRlIHZpc2libGUuXG4gICAqIFVzZWQgdG8gZW5mb3JjZSB0aGUgbWluaW11bSB2aXNpYmxlIGR1cmF0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSB2aXNpYmxlU2luY2U6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUcmFja3MgdGhlIGFjdHVhbCBza2VsZXRvbiB2aXNpYmlsaXR5IHN0YXRlLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzaG93U2tlbGV0b24kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIFVJIGludGVyYWN0aW9uIGlzIGJsb2NrZWQgZHVyaW5nIHByb2Nlc3NpbmcuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHByb2Nlc3NpbmdCbG9ja2VkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyB3aGVuIHRoZSBzZXJ2aWNlIGlzIGRlc3Ryb3llZCwgdXNlZCB0byBjbGVhbiB1cCBzdWJzY3JpcHRpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpc0luaXRpYWxMb2FkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChPX1RBQkxFX0dMT0JBTF9DT05GSUcpIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBPVGFibGVHbG9iYWxDb25maWdcbiAgKSB7XG5cbiAgICAvLyBMb2FkIGNvbmZpZ3VyYWJsZSBkZWZhdWx0cyBpZiBwcm92aWRlZFxuICAgIHRoaXMuVEhSRVNIT0xEID0gY29uZmlnPy5sb2FkaW5nPy50aHJlc2hvbGQgPz8gdGhpcy5USFJFU0hPTEQ7XG4gICAgdGhpcy5NSU5fVklTSUJMRSA9IGNvbmZpZz8ubG9hZGluZz8ubWluVmlzaWJsZSA/PyB0aGlzLk1JTl9WSVNJQkxFO1xuXG4gICAgdGhpcy5oYW5kbGVQcm9jZXNzaW5nQmxvY2skXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLmhhbmRsZVNob3ckXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLmhhbmRsZUhpZGUkXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICAvKipcbiAgICAqIFB1YmxpYyBvYnNlcnZhYmxlIGV4cG9zaW5nIHdoZXRoZXIgdGhlIHNrZWxldG9uIHNob3VsZCBiZSB2aXNpYmxlLlxuICAgICovXG4gICAgdGhpcy5zaG93TG9hZGluZyQgPSB0aGlzLnNob3dTa2VsZXRvbiQucGlwZShcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICBzaGFyZVJlcGxheSgxKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGlzTG9hZGluZyQgPSB0aGlzLmxvYWRpbmckLnBpcGUoXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBtYXAobG9hZGluZyA9PiAoeyBsb2FkaW5nLCBzaG91bGRTaG93OiBsb2FkaW5nIH0pKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG5cbiAgLyoqXG4gICogSW50ZXJuYWwgc3RyZWFtIHRoYXQgaGFuZGxlcyBpbW1lZGlhdGUgVUkgYmxvY2tpbmcgd2hlbmV2ZXIgbG9hZGluZyBzdGFydHMuXG4gICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlUHJvY2Vzc2luZ0Jsb2NrJCA9IHRoaXMuaXNMb2FkaW5nJC5waXBlKFxuICAgIHRhcChzdGF0ZSA9PiB7XG4gICAgICBjb25zdCBzaG91bGRCbG9jayA9IHN0YXRlLnNob3VsZFNob3c7XG5cbiAgICAgIGlmICh0aGlzLnByb2Nlc3NpbmdCbG9ja2VkJC52YWx1ZSAhPT0gc2hvdWxkQmxvY2spIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzaW5nQmxvY2tlZCQubmV4dChzaG91bGRCbG9jayk7XG4gICAgICB9XG4gICAgfSlcbiAgKTtcblxuICAvKipcbiAqIFB1YmxpYyBvYnNlcnZhYmxlIGluZGljYXRpbmcgd2hldGhlciB0aGUgVUkgaXMgY3VycmVudGx5IGJsb2NrZWQuXG4gKiBQcmV2ZW50cyB1c2VycyBmcm9tIGludGVyYWN0aW5nIGR1cmluZyBwcm90ZWN0ZWQgb3BlcmF0aW9ucy5cbiAqL1xuICByZWFkb25seSBpc1Byb2Nlc3NpbmckID0gdGhpcy5wcm9jZXNzaW5nQmxvY2tlZCQucGlwZShcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgLyoqXG4gICAgICogSW50ZXJuYWwgc3RyZWFtIHRoYXQgbWFuYWdlcyBkaXNwbGF5aW5nIHRoZSBza2VsZXRvbiB1c2luZ1xuICAgICAqIGEgbm9uLWNhbmNlbGFibGUgdGhyZXNob2xkIHRpbWVyLlxuICAgICAqXG4gICAgICogSWYgbG9hZGluZyBpcyBzdGlsbCBhY3RpdmUgb25jZSB0aGUgdGhyZXNob2xkIGV4cGlyZXMsXG4gICAgICogdGhlIHNrZWxldG9uIGJlY29tZXMgdmlzaWJsZS5cbiAgICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVTaG93JCA9IHRoaXMuaXNMb2FkaW5nJC5waXBlKFxuICAgIGZpbHRlcihzdGF0ZSA9PiBzdGF0ZS5zaG91bGRTaG93KSxcbiAgICB0YXAoKCkgPT4ge1xuICAgICAgY29uc3QgdGhyZXNob2xkID0gdGhpcy5pc0luaXRpYWxMb2FkJC52YWx1ZSA/IDAgOiB0aGlzLlRIUkVTSE9MRDtcblxuICAgICAgdGltZXIodGhyZXNob2xkKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5sb2FkaW5nJC52YWx1ZSkge1xuICAgICAgICAgIHRoaXMudmlzaWJsZVNpbmNlID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICAgICAgdGhpcy5zaG93U2tlbGV0b24kLm5leHQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pXG4gICk7XG4gIC8qKlxuICAgICAqIEludGVybmFsIHN0cmVhbSB0aGF0IG1hbmFnZXMgaGlkaW5nIHRoZSBza2VsZXRvbiB3aGlsZSBlbmZvcmNpbmdcbiAgICAgKiB0aGUgbWluaW11bSB2aXNpYmxlIGR1cmF0aW9uLlxuICAgICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZUhpZGUkID0gdGhpcy5pc0xvYWRpbmckLnBpcGUoXG4gICAgZmlsdGVyKHN0YXRlID0+ICFzdGF0ZS5zaG91bGRTaG93KSxcbiAgICB0YXAoKCkgPT4ge1xuICAgICAgY29uc3Qgbm93ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cbiAgICAgIGlmICh0aGlzLmlzSW5pdGlhbExvYWQkLnZhbHVlKSB7XG4gICAgICAgIHRoaXMuaXNJbml0aWFsTG9hZCQubmV4dChmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIE9ubHkgZW5mb3JjZSBkZWxheSBpZiB0aGUgc2tlbGV0b24gd2FzIGFjdHVhbGx5IHNob3duXG4gICAgICBpZiAodGhpcy52aXNpYmxlU2luY2UgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZCA9IG5vdyAtIHRoaXMudmlzaWJsZVNpbmNlO1xuICAgICAgICBpZiAoZWxhcHNlZCA8IHRoaXMuTUlOX1ZJU0lCTEUpIHtcbiAgICAgICAgICBjb25zdCByZW1haW5pbmcgPSB0aGlzLk1JTl9WSVNJQkxFIC0gZWxhcHNlZDtcbiAgICAgICAgICB0aW1lcihyZW1haW5pbmcpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnZpc2libGVTaW5jZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnNob3dTa2VsZXRvbiQubmV4dChmYWxzZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy52aXNpYmxlU2luY2UgPSBudWxsO1xuICAgICAgICAgIHRoaXMuc2hvd1NrZWxldG9uJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gICk7XG4gIC8qKlxuICAgICogQ29tYmluZWQgb2JzZXJ2YWJsZSBmb3IgYWN0aXZhdGluZyByZWFjdGl2ZSBmbG93cy5cbiAgICAqIFRoZSAqYWN0dWFsKiBza2VsZXRvbiBzdGF0ZSBpcyBjb250cm9sbGVkIGJ5IGBzaG93U2tlbGV0b24kYC5cbiAgICAqL1xuICByZWFkb25seSBzaG93TG9hZGluZyQgPSBtZXJnZShcbiAgICB0aGlzLmhhbmRsZVNob3ckLFxuICAgIHRoaXMuaGFuZGxlSGlkZSRcbiAgKS5waXBlKFxuICAgIG1hcCgoKSA9PiB0aGlzLnNob3dTa2VsZXRvbiQudmFsdWUpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gUFVCTElDIEFQSSBNRVRIT0RTXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBpbnRlcm5hbCBsb2FkaW5nIHN0YXRlLlxuICAgKiBQcmV2ZW50cyBlbmFibGluZyBsb2FkaW5nIHdoaWxlIGEgcHJvY2Vzc2luZyBibG9jayBpcyBhY3RpdmUuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBXaGV0aGVyIGxvYWRpbmcgaXMgYWN0aXZlLlxuICAgKi9cbiAgc2V0TG9hZGluZyh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh2YWx1ZSAmJiB0aGlzLmlzQmxvY2tlZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmxvYWRpbmckLnZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy5sb2FkaW5nJC5uZXh0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBVSSBpcyBjdXJyZW50bHkgYmxvY2tlZC5cbiAgICovXG4gIGlzQmxvY2tlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzaW5nQmxvY2tlZCQudmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogTWFudWFsbHkgdG9nZ2xlcyB0aGUgVUkgcHJvY2Vzc2luZy1ibG9jayBzdGF0ZS5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFdoZXRoZXIgdGhlIFVJIHNob3VsZCBiZSBibG9ja2VkLlxuICAgKi9cbiAgc2V0UHJvY2Vzc2luZ0Jsb2NrKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJvY2Vzc2luZ0Jsb2NrZWQkLnZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy5wcm9jZXNzaW5nQmxvY2tlZCQubmV4dCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gQ0xJQ0sgUFJPVEVDVElPTlxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogUHJvdGVjdHMgdXNlciBpbnRlcmFjdGlvbnMgKGNsaWNrcykgZnJvbSBmaXJpbmcgd2hpbGUgYSBwcm90ZWN0ZWRcbiAgICogb3BlcmF0aW9uIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudCBPcHRpb25hbCBtb3VzZSBldmVudCB0byBzdG9wIHByb3BhZ2F0aW9uLlxuICAgKiBAcGFyYW0gb3BlcmF0aW9uIE9wdGlvbmFsIG5hbWUgb2YgdGhlIG9wZXJhdGlvbiBmb3IgZGVidWdnaW5nL2xvZ3MuXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgY2xpY2sgc2hvdWxkIGJlIHByb2Nlc3NlZCwgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gICAqL1xuICBoYW5kbGVQcm90ZWN0ZWQoZXZlbnQ/OiBNb3VzZUV2ZW50KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNCbG9ja2VkKCkpIHtcbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnNldExvYWRpbmcodHJ1ZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBMSUZFQ1lDTEVcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIENsZWFucyB1cCBhbGwgaW50ZXJuYWwgc3Vic2NyaXB0aW9ucyBhbmQgY29tcGxldGVzIHN0cmVhbXMuXG4gICAqL1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodm9pZCAwKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG5cbiAgICB0aGlzLmxvYWRpbmckLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5zaG93U2tlbGV0b24kLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5wcm9jZXNzaW5nQmxvY2tlZCQuY29tcGxldGUoKTtcbiAgICB0aGlzLmlzSW5pdGlhbExvYWQkLmNvbXBsZXRlKCk7XG4gIH1cblxufSJdfQ==