UNPKG

@antischematic/angular-state-library

Version:
181 lines 24.5 kB
/// <reference path="../../../node_modules/zone.js/zone.d.ts" /> import { EventEmitter, InjectionToken } from "@angular/core"; import { BehaviorSubject, map, merge, Observable, Subject, takeWhile } from "rxjs"; function handleError(transition) { if (transition.failed) { transition.onError.next(transition.thrownError); } else if (transition.resetOnSuccess) { transition.retryCount = 0; } } function checkStable({ transition, microtasks, macroTasks, parentZone, timeout }) { const { isUnstable } = transition; const { slowMs, timeoutMs, slow, isSlow } = transition; if (!microtasks && !macroTasks && !transition.stable) { clearTimeout(timeout.timeoutId); clearTimeout(timeout.slowId); parentZone.run(() => { handleError(transition); if (slow) { isSlow.next(false); } isUnstable.next(false); }); } if ((microtasks || macroTasks) && transition.stable) { if (transition.failed) { transition.retryCount++; } transition.failed = false; transition.timeout = false; transition.thrownError = null; parentZone.run(() => { isUnstable.next(true); if (slowMs) { timeout.slowId = setTimeout(() => { transition.isSlow.next(true); }, slowMs); } if (timeoutMs) { timeout.timeoutId = setTimeout(() => { transition.failed = true; transition.timeout = true; transition.thrownError = new Error(`Transition timed out after ${timeoutMs}ms`); transition.cancel(); }, timeoutMs); } }); } } let id = 0; export class TransitionSpec { constructor(name, transition) { this.name = name; this.transition = transition; this.microtasks = 0; this.macroTasks = 0; this.parentZone = Zone.current; this.tasks = new Set(); this.timeout = {}; this.properties = { id: id++ }; } onScheduleTask(parentZoneDelegate, currentZone, targetZone, task) { this.tasks.add(task); return parentZoneDelegate.scheduleTask(targetZone, task); } onInvokeTask(parentZoneDelegate, currentZone, targetZone, task, applyThis, applyArgs) { this.tasks.delete(task); return parentZoneDelegate.invokeTask(targetZone, task, applyThis, applyArgs); } onCancelTask(parentZoneDelegate, currentZone, targetZone, task) { this.tasks.delete(task); return parentZoneDelegate.cancelTask(targetZone, task); } onHasTask(parentZoneDelegate, currentZone, targetZone, hasTaskState) { if (currentZone === targetZone) { if (hasTaskState.change === "microTask") { this.microtasks += hasTaskState.microTask ? 1 : -1; checkStable(this); } else if (hasTaskState.change === "macroTask") { this.macroTasks += hasTaskState.macroTask ? 1 : -1; checkStable(this); } } return parentZoneDelegate.hasTask(targetZone, hasTaskState); } onHandleError(parentZoneDelegate, currentZone, targetZone, error) { this.transition.failed = true; this.transition.thrownError = error; return parentZoneDelegate.handleError(targetZone, error); } cancelTasks() { for (const task of this.tasks) { task.zone.cancelTask(task); } } } export class Transition { constructor(options = {}) { this.options = options; this.spec = new TransitionSpec("transition", this); this.isUnstable = new BehaviorSubject(false); this.isSlow = new BehaviorSubject(false); this.onError = new Subject(); this.timeout = false; this.failed = false; this.retryCount = 0; this.thrownError = null; this.emitter = new EventEmitter(options.async); this.slowMs = options.slowMs ?? 0; this.timeoutMs = options.timeoutMs ?? 0; this.resetOnSuccess = options.resetOnSuccess ?? false; } get stable() { return !this.unstable; } get unstable() { return this.isUnstable.value; } get slow() { return this.isSlow.value; } next(value) { this.run(this.emitter.next, this.emitter, value); } error(error) { this.run(this.emitter.error, this.emitter, error); } complete() { this.run(this.emitter.complete, this.emitter); } emit(value) { this.run(this.emitter.emit, this.emitter, value); return this.isUnstable.pipe(takeWhile(Boolean)); } cancel() { this.spec.cancelTasks(); } subscribe(observer) { return this.emitter.subscribe(observer); } run(fn, applyThis, ...applyArgs) { if (Zone.current.get("id") === this.spec.properties.id) { return fn.apply(this, applyArgs); } else { const zone = Zone.current.fork(this.spec); if (this.options.cancelPrevious) { this.cancel(); } return zone.runGuarded(fn, applyThis, applyArgs); } } ngOnSelect(observer) { return merge(this.isUnstable, this.isSlow).pipe(map(() => this)).subscribe(observer); } } export function useTransition(transition, options = { emit: false }) { return source => transition ? new Observable(subscriber => { return transition.run(() => { if (options.emit) { subscriber.add(transition.subscribe(subscriber)); } subscriber.add(source.subscribe(subscriber)); return subscriber; }); }) : source; } export const TransitionToken = class TransitionToken extends InjectionToken { constructor(name, options) { super(name, { factory() { return new Transition(options); } }); } }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNpdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL3RyYW5zaXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZ0VBQWdFO0FBRWhFLE9BQU8sRUFBQyxZQUFZLEVBQUUsY0FBYyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzNELE9BQU8sRUFDSixlQUFlLEVBQ2YsR0FBRyxFQUFFLEtBQUssRUFFVixVQUFVLEVBRVYsT0FBTyxFQUNQLFNBQVMsRUFDWCxNQUFNLE1BQU0sQ0FBQztBQVdkLFNBQVMsV0FBVyxDQUFDLFVBQXNCO0lBQ3hDLElBQUksVUFBVSxDQUFDLE1BQU0sRUFBRTtRQUNwQixVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUE7S0FDakQ7U0FBTSxJQUFJLFVBQVUsQ0FBQyxjQUFjLEVBQUU7UUFDbkMsVUFBVSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUE7S0FDM0I7QUFDSixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFrQjtJQUM3RixNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsVUFBVSxDQUFBO0lBQ2pDLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUE7SUFDdEQsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUU7UUFDbkQsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUMvQixZQUFZLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQzVCLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ2pCLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUN2QixJ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QTtJQUNMLENBQUM7Q0FDSCxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL25vZGVfbW9kdWxlcy96b25lLmpzL3pvbmUuZC50c1wiIC8+XG5cbmltcG9ydCB7RXZlbnRFbWl0dGVyLCBJbmplY3Rpb25Ub2tlbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7XG4gICBCZWhhdmlvclN1YmplY3QsXG4gICBtYXAsIG1lcmdlLFxuICAgTW9ub1R5cGVPcGVyYXRvckZ1bmN0aW9uLFxuICAgT2JzZXJ2YWJsZSwgT2JzZXJ2ZXIsXG4gICBQYXJ0aWFsT2JzZXJ2ZXIsXG4gICBTdWJqZWN0LCBTdWJzY3JpcHRpb24sXG4gICB0YWtlV2hpbGVcbn0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7T25TZWxlY3R9IGZyb20gXCIuL3NlbGVjdFwiO1xuXG5pbnRlcmZhY2UgVHJhbnNpdGlvbk9wdGlvbnMge1xuICAgYXN5bmM/OiBib29sZWFuXG4gICBzbG93TXM/OiBudW1iZXJcbiAgIHRpbWVvdXRNcz86IG51bWJlclxuICAgcmVzZXRPblN1Y2Nlc3M/OiBib29sZWFuXG4gICBjYW5jZWxQcmV2aW91cz86IGJvb2xlYW5cbn1cblxuZnVuY3Rpb24gaGFuZGxlRXJyb3IodHJhbnNpdGlvbjogVHJhbnNpdGlvbikge1xuICAgaWYgKHRyYW5zaXRpb24uZmFpbGVkKSB7XG4gICAgICB0cmFuc2l0aW9uLm9uRXJyb3IubmV4dCh0cmFuc2l0aW9uLnRocm93bkVycm9yKVxuICAgfSBlbHNlIGlmICh0cmFuc2l0aW9uLnJlc2V0T25TdWNjZXNzKSB7XG4gICAgICB0cmFuc2l0aW9uLnJldHJ5Q291bnQgPSAwXG4gICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrU3RhYmxlKHsgdHJhbnNpdGlvbiwgbWljcm90YXNrcywgbWFjcm9UYXNrcywgcGFyZW50Wm9uZSwgdGltZW91dCB9OiBUcmFuc2l0aW9uU3BlYykge1xuICAgY29uc3QgeyBpc1Vuc3RhYmxlIH0gPSB0cmFuc2l0aW9uXG4gICBjb25zdCB7IHNsb3dNcywgdGltZW91dE1zLCBzbG93LCBpc1Nsb3cgfSA9IHRyYW5zaXRpb25cbiAgIGlmICghbWljcm90YXNrcyAmJiAhbWFjcm9UYXNrcyAmJiAhdHJhbnNpdGlvbi5zdGFibGUpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0LnRpbWVvdXRJZClcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0LnNsb3dJZClcbiAgICAgIHBhcmVudFpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgIGhhbmRsZUVycm9yKHRyYW5zaXRpb24pXG4gICAgICAgICBpZiAoc2xvdykge1xuICAgICAgICAgICAgaXNTbG93Lm5leHQoZmFsc2UpXG4gICAgICAgICB9XG4gICAgICAgICBpc1Vuc3RhYmxlLm5leHQoZmFsc2UpXG4gICAgICB9KVxuICAgfVxuICAgaWYgKChtaWNyb3Rhc2tzIHx8IG1hY3JvVGFza3MpICYmIHRyYW5zaXRpb24uc3RhYmxlKSB7XG4gICAgICBpZiAodHJhbnNpdGlvbi5mYWlsZWQpIHtcbiAgICAgICAgIHRyYW5zaXRpb24ucmV0cnlDb3VudCsrXG4gICAgICB9XG4gICAgICB0cmFuc2l0aW9uLmZhaWxlZCA9IGZhbHNlXG4gICAgICB0cmFuc2l0aW9uLnRpbWVvdXQgPSBmYWxzZVxuICAgICAgdHJhbnNpdGlvbi50aHJvd25FcnJvciA9IG51bGxcbiAgICAgIHBhcmVudFpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgIGlzVW5zdGFibGUubmV4dCh0cnVlKVxuICAgICAgICAgaWYgKHNsb3dNcykge1xuICAgICAgICAgICAgdGltZW91dC5zbG93SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgIHRyYW5zaXRpb24uaXNTbG93Lm5leHQodHJ1ZSlcbiAgICAgICAgICAgIH0sIHNsb3dNcylcbiAgICAgICAgIH1cbiAgICAgICAgIGlmICh0aW1lb3V0TXMpIHtcbiAgICAgICAgICAgIHRpbWVvdXQudGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICB0cmFuc2l0aW9uLmZhaWxlZCA9IHRydWVcbiAgICAgICAgICAgICAgIHRyYW5zaXRpb24udGltZW91dCA9IHRydWVcbiAgICAgICAgICAgICAgIHRyYW5zaXRpb24udGhyb3duRXJyb3IgPSBuZXcgRXJyb3IoYFRyYW5zaXRpb24gdGltZWQgb3V0IGFmdGVyICR7dGltZW91dE1zfW1zYClcbiAgICAgICAgICAgICAgIHRyYW5zaXRpb24uY2FuY2VsKClcbiAgICAgICAgICAgIH0sIHRpbWVvdXRNcylcbiAgICAgICAgIH1cbiAgICAgIH0pXG4gICB9XG59XG5cbmxldCBpZCA9IDBcblxuZXhwb3J0IGNsYXNzIFRyYW5zaXRpb25TcGVjIGltcGxlbWVudHMgWm9uZVNwZWMge1xuICAgbWljcm90YXNrcyA9IDBcbiAgIG1hY3JvVGFza3MgPSAwXG4gICBwYXJlbnRab25lID0gWm9uZS5jdXJyZW50XG4gICB0YXNrcyA9IG5ldyBTZXQ8VGFzaz4oKVxuICAgdGltZW91dCA9IHt9IGFzIGFueVxuICAgcHJvcGVydGllcyA9IHtcbiAgICAgIGlkOiBpZCsrXG4gICB9XG5cbiAgIG9uU2NoZWR1bGVUYXNrKHBhcmVudFpvbmVEZWxlZ2F0ZTogWm9uZURlbGVnYXRlLCBjdXJyZW50Wm9uZTogWm9uZSwgdGFyZ2V0Wm9uZTogWm9uZSwgdGFzazogVGFzaykge1xuICAgICAgdGhpcy50YXNrcy5hZGQodGFzaylcbiAgICAgIHJldHVybiBwYXJlbnRab25lRGVsZWdhdGUuc2NoZWR1bGVUYXNrKHRhcmdldFpvbmUsIHRhc2spXG4gICB9XG5cbiAgIG9uSW52b2tlVGFzayhwYXJlbnRab25lRGVsZWdhdGU6IFpvbmVEZWxlZ2F0ZSwgY3VycmVudFpvbmU6IFpvbmUsIHRhcmdldFpvbmU6IFpvbmUsIHRhc2s6IFRhc2ssIGFwcGx5VGhpczogYW55LCBhcHBseUFyZ3M/OiBhbnlbXSkge1xuICAgICAgdGhpcy50YXNrcy5kZWxldGUodGFzaylcbiAgICAgIHJldHVybiBwYXJlbnRab25lRGVsZWdhdGUuaW52b2tlVGFzayh0YXJnZXRab25lLCB0YXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncylcbiAgIH1cblxuICAgb25DYW5jZWxUYXNrKHBhcmVudFpvbmVEZWxlZ2F0ZTogWm9uZURlbGVnYXRlLCBjdXJyZW50Wm9uZTogWm9uZSwgdGFyZ2V0Wm9uZTogWm9uZSwgdGFzazogVGFzaykge1xuICAgICAgdGhpcy50YXNrcy5kZWxldGUodGFzaylcbiAgICAgIHJldHVybiBwYXJlbnRab25lRGVsZWdhdGUuY2FuY2VsVGFzayh0YXJnZXRab25lLCB0YXNrKVxuICAgfVxuXG4gICBvbkhhc1Rhc2socGFyZW50Wm9uZURlbGVnYXRlOiBab25lRGVsZWdhdGUsIGN1cnJlbnRab25lOiBab25lLCB0YXJnZXRab25lOiBab25lLCBoYXNUYXNrU3RhdGU6IEhhc1Rhc2tTdGF0ZSkge1xuICAgICAgaWYgKGN1cnJlbnRab25lID09PSB0YXJnZXRab25lKSB7XG4gICAgICAgICBpZiAoaGFzVGFza1N0YXRlLmNoYW5nZSA9PT0gXCJtaWNyb1Rhc2tcIikge1xuICAgICAgICAgICAgdGhpcy5taWNyb3Rhc2tzICs9IGhhc1Rhc2tTdGF0ZS5taWNyb1Rhc2sgPyAxIDogLTFcbiAgICAgICAgICAgIGNoZWNrU3RhYmxlKHRoaXMpXG4gICAgICAgICB9IGVsc2UgaWYgKGhhc1Rhc2tTdGF0ZS5jaGFuZ2UgPT09IFwibWFjcm9UYXNrXCIpIHtcbiAgICAgICAgICAgIHRoaXMubWFjcm9UYXNrcyArPSBoYXNUYXNrU3RhdGUubWFjcm9UYXNrID8gMSA6IC0xXG4gICAgICAgICAgICBjaGVja1N0YWJsZSh0aGlzKVxuICAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcmVudFpvbmVEZWxlZ2F0ZS5oYXNUYXNrKHRhcmdldFpvbmUsIGhhc1Rhc2tTdGF0ZSlcbiAgIH1cblxuICAgb25IYW5kbGVFcnJvcihwYXJlbnRab25lRGVsZWdhdGU6IFpvbmVEZWxlZ2F0ZSwgY3VycmVudFpvbmU6IFpvbmUsIHRhcmdldFpvbmU6IFpvbmUsIGVycm9yOiBhbnkpIHtcbiAgICAgIHRoaXMudHJhbnNpdGlvbi5mYWlsZWQgPSB0cnVlXG4gICAgICB0aGlzLnRyYW5zaXRpb24udGhyb3duRXJyb3IgPSBlcnJvclxuICAgICAgcmV0dXJuIHBhcmVudFpvbmVEZWxlZ2F0ZS5oYW5kbGVFcnJvcih0YXJnZXRab25lLCBlcnJvcilcbiAgIH1cblxuICAgY2FuY2VsVGFza3MoKSB7XG4gICAgICBmb3IgKGNvbnN0IHRhc2sgb2YgdGhpcy50YXNrcykge1xuICAgICAgICAgdGFzay56b25lLmNhbmNlbFRhc2sodGFzaylcbiAgICAgIH1cbiAgIH1cblxuICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIHRyYW5zaXRpb246IFRyYW5zaXRpb248YW55Pikge31cbn1cblxuZXhwb3J0IGNsYXNzIFRyYW5zaXRpb248VCA9IHVua25vd24+IGltcGxlbWVudHMgT25TZWxlY3Qge1xuICAgcHJpdmF0ZSByZWFkb25seSBzcGVjOiBUcmFuc2l0aW9uU3BlYyA9IG5ldyBUcmFuc2l0aW9uU3BlYyhcInRyYW5zaXRpb25cIiwgdGhpcylcbiAgIHByaXZhdGUgcmVhZG9ubHkgZW1pdHRlcjogRXZlbnRFbWl0dGVyPFQ+XG5cbiAgIHJlYWRvbmx5IHRpbWVvdXRNczogbnVtYmVyXG4gICByZWFkb25seSBzbG93TXM6IG51bWJlclxuICAgcmVhZG9ubHkgcmVzZXRPblN1Y2Nlc3M6IGJvb2xlYW5cbiAgIHJlYWRvbmx5IGlzVW5zdGFibGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKVxuICAgcmVhZG9ubHkgaXNTbG93ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSlcbiAgIHJlYWRvbmx5IG9uRXJyb3IgPSBuZXcgU3ViamVjdDx1bmtub3duPigpXG5cbiAgIHRpbWVvdXQgPSBmYWxzZVxuICAgZmFpbGVkID0gZmFsc2VcbiAgIHJldHJ5Q291bnQgPSAwXG4gICB0aHJvd25FcnJvcjogdW5rbm93biA9IG51bGxcblxuICAgZ2V0IHN0YWJsZSgpIHtcbiAgICAgIHJldHVybiAhdGhpcy51bnN0YWJsZVxuICAgfVxuXG4gICBnZXQgdW5zdGFibGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1Vuc3RhYmxlLnZhbHVlXG4gICB9XG5cbiAgIGdldCBzbG93KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNTbG93LnZhbHVlXG4gICB9XG5cbiAgIG5leHQodmFsdWU6IFQpIHtcbiAgICAgIHRoaXMucnVuKHRoaXMuZW1pdHRlci5uZXh0LCB0aGlzLmVtaXR0ZXIsIHZhbHVlKVxuICAgfVxuXG4gICBlcnJvcihlcnJvcjogdW5rbm93bikge1xuICAgICAgdGhpcy5ydW4odGhpcy5lbWl0dGVyLmVycm9yLCB0aGlzLmVtaXR0ZXIsIGVycm9yKVxuICAgfVxuXG4gICBjb21wbGV0ZSgpIHtcbiAgICAgIHRoaXMucnVuKHRoaXMuZW1pdHRlci5jb21wbGV0ZSwgdGhpcy5lbWl0dGVyKVxuICAgfVxuXG4gICBlbWl0KHZhbHVlOiBUKSB7XG4gICAgICB0aGlzLnJ1bih0aGlzLmVtaXR0ZXIuZW1pdCwgdGhpcy5lbWl0dGVyLCB2YWx1ZSlcbiAgICAgIHJldHVybiB0aGlzLmlzVW5zdGFibGUucGlwZShcbiAgICAgICAgIHRha2VXaGlsZShCb29sZWFuKVxuICAgICAgKVxuICAgfVxuXG4gICBjYW5jZWwoKSB7XG4gICAgICB0aGlzLnNwZWMuY2FuY2VsVGFza3MoKVxuICAgfVxuXG4gICBzdWJzY3JpYmUobmV4dDogKHZhbHVlOiBUKSA9PiB2b2lkKTogU3Vic2NyaXB0aW9uO1xuICAgc3Vic2NyaWJlKG9ic2VydmVyPzogUGFydGlhbDxPYnNlcnZlcjxUPj4pOiBTdWJzY3JpcHRpb25cbiAgIHN1YnNjcmliZShvYnNlcnZlcj86IGFueSk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICByZXR1cm4gdGhpcy5lbWl0dGVyLnN1YnNjcmliZShvYnNlcnZlcik7XG4gICB9XG5cbiAgIHJ1bjxUIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk+KGZuOiBGdW5jdGlvbiwgYXBwbHlUaGlzPzoge30sIC4uLmFwcGx5QXJnczogUGFyYW1ldGVyczxUPik6IFJldHVyblR5cGU8VD4ge1xuICAgICAgaWYgKFpvbmUuY3VycmVudC5nZXQoXCJpZFwiKSA9PT0gdGhpcy5zcGVjLnByb3BlcnRpZXMuaWQpIHtcbiAgICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcHBseUFyZ3MpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgY29uc3Qgem9uZSA9IFpvbmUuY3VycmVudC5mb3JrKHRoaXMuc3BlYylcbiAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY2FuY2VsUHJldmlvdXMpIHtcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsKClcbiAgICAgICAgIH1cbiAgICAgICAgIHJldHVybiB6b25lLnJ1bkd1YXJkZWQoZm4sIGFwcGx5VGhpcywgYXBwbHlBcmdzKVxuICAgICAgfVxuICAgfVxuXG4gICBuZ09uU2VsZWN0KG9ic2VydmVyOiBQYXJ0aWFsT2JzZXJ2ZXI8YW55Pikge1xuICAgICAgcmV0dXJuIG1lcmdlKHRoaXMuaXNVbnN0YWJsZSwgdGhpcy5pc1Nsb3cpLnBpcGUobWFwKCgpID0+IHRoaXMpKS5zdWJzY3JpYmUob2JzZXJ2ZXIpXG4gICB9XG5cbiAgIGNvbnN0cnVjdG9yKHByaXZhdGUgb3B0aW9uczogVHJhbnNpdGlvbk9wdGlvbnMgPSB7fSkge1xuICAgICAgdGhpcy5lbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxUPihvcHRpb25zLmFzeW5jKVxuICAgICAgdGhpcy5zbG93TXMgPSBvcHRpb25zLnNsb3dNcyA/PyAwXG4gICAgICB0aGlzLnRpbWVvdXRNcyA9IG9wdGlvbnMudGltZW91dE1zID8/IDBcbiAgICAgIHRoaXMucmVzZXRPblN1Y2Nlc3MgPSBvcHRpb25zLnJlc2V0T25TdWNjZXNzID8/IGZhbHNlXG4gICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlVHJhbnNpdGlvbk9wdGlvbnMge1xuICAgZW1pdDogYm9vbGVhblxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlVHJhbnNpdGlvbjxUPih0cmFuc2l0aW9uPzogVHJhbnNpdGlvbjxUPiwgb3B0aW9ucz86IHsgZW1pdDogdHJ1ZSB9KTogTW9ub1R5cGVPcGVyYXRvckZ1bmN0aW9uPFQ+XG5leHBvcnQgZnVuY3Rpb24gdXNlVHJhbnNpdGlvbjxUPih0cmFuc2l0aW9uPzogVHJhbnNpdGlvbiwgb3B0aW9ucz86IHsgZW1pdDogZmFsc2UgfSk6IE1vbm9UeXBlT3BlcmF0b3JGdW5jdGlvbjxUPlxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRyYW5zaXRpb248VD4odHJhbnNpdGlvbj86IFRyYW5zaXRpb24sIG9wdGlvbnM6IFVzZVRyYW5zaXRpb25PcHRpb25zID0geyBlbWl0OiBmYWxzZSB9KTogTW9ub1R5cGVPcGVyYXRvckZ1bmN0aW9uPFQ+IHtcbiAgIHJldHVybiBzb3VyY2UgPT4gdHJhbnNpdGlvbiA/IG5ldyBPYnNlcnZhYmxlPGFueT4oc3Vic2NyaWJlciA9PiB7XG4gICAgICByZXR1cm4gdHJhbnNpdGlvbi5ydW4oKCkgPT4ge1xuICAgICAgICAgaWYgKG9wdGlvbnMuZW1pdCkge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5hZGQodHJhbnNpdGlvbi5zdWJzY3JpYmUoc3Vic2NyaWJlcikpXG4gICAgICAgICB9XG4gICAgICAgICBzdWJzY3JpYmVyLmFkZChzb3VyY2Uuc3Vic2NyaWJlKHN1YnNjcmliZXIpKVxuICAgICAgICAgcmV0dXJuIHN1YnNjcmliZXJcbiAgICAgIH0pXG4gICB9KSA6IHNvdXJjZVxufVxuXG5pbnRlcmZhY2UgVHJhbnNpdGlvblRva2VuIHtcbiAgIG5ldzxUPihuYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiBUcmFuc2l0aW9uT3B0aW9ucyk6IEluamVjdGlvblRva2VuPFRyYW5zaXRpb248VD4+XG59XG5cbmV4cG9ydCBjb25zdCBUcmFuc2l0aW9uVG9rZW46IFRyYW5zaXRpb25Ub2tlbiA9IGNsYXNzIFRyYW5zaXRpb25Ub2tlbjxUPiBleHRlbmRzIEluamVjdGlvblRva2VuPFRyYW5zaXRpb248VD4+IHtcbiAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgb3B0aW9ucz86IFRyYW5zaXRpb25PcHRpb25zKSB7XG4gICAgICBzdXBlcihuYW1lLCB7XG4gICAgICAgICBmYWN0b3J5KCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKG9wdGlvbnMpXG4gICAgICAgICB9XG4gICAgICB9KVxuICAgfVxufVxuIl19