@ng-dnd/core
Version:
Drag and Drop for Angular
143 lines • 24.3 kB
JavaScript
import { NgZone } from '@angular/core';
import { BehaviorSubject, ReplaySubject, Subscription } from 'rxjs';
import { distinctUntilChanged, map, switchMap, take, tap } from 'rxjs/operators';
import { TYPE_DYNAMIC } from '../tokens';
import { invariant } from './invariant';
import { areCollectsEqual } from '../utils/areCollectsEqual';
export class Connection {
constructor(factoryArgs, manager, ngZone, initialType) {
this.factoryArgs = factoryArgs;
this.manager = manager;
this.ngZone = ngZone;
/** A subject basically used to kick off any observables waiting for a type to be set via setType/setTypes */
this.resolvedType$ = new ReplaySubject(1);
/**
* This one lives exactly as long as the connection.
* It is responsible for disposing of the handlerConnector, and any internal listen() subscriptions.
*/
this.subscriptionConnectionLifetime = new Subscription();
this.onUpdate = () => {
this.handlerConnector.reconnect();
};
this.handleChange = () => {
this.collector$.next(this.handlerMonitor);
};
invariant(typeof manager === 'object',
// TODO: update this mini-documentation
'Could not find the drag and drop manager in the context of %s. ' +
'Make sure to wrap the top-level component of your app with DragDropContext. '
// 'Read more: ',
);
NgZone.assertNotInAngularZone();
this.handlerMonitor = this.factoryArgs.createMonitor(this.manager);
this.collector$ = new BehaviorSubject(this.handlerMonitor);
this.handler = this.factoryArgs.createHandler(this.handlerMonitor);
this.handlerConnector = this.factoryArgs.createConnector(this.manager.getBackend());
// handlerConnector lives longer than any per-type subscription
this.subscriptionConnectionLifetime.add(() => this.handlerConnector.receiveHandlerId(null));
if (initialType && initialType !== TYPE_DYNAMIC) {
this.setTypes(initialType);
}
}
listen(mapFn) {
// Listeners are generally around as long as the connection.
// This isn't 100% true, but there is no way of knowing (even if you ref-count it)
// when a component no longer needs it.
return this.resolvedType$.pipe(
// this ensures we don't start emitting values until there is a type resolved
take(1),
// switch our attention to the incoming firehose of 'something changed' events
switchMap(() => this.collector$),
// turn them into 'interesting state' via the monitor and a user-provided function
map(mapFn),
// don't emit EVERY time the firehose says something changed, only when the interesting state changes
distinctUntilChanged(areCollectsEqual),
// TODO: how to reduce the frequency of change detection?
tap(this.onUpdate));
}
connect(fn) {
const subscription = this.resolvedType$.pipe(take(1)).subscribe(() => {
// must run inside ngZone otherwise the zone app may have small issue
this.ngZone.run(() => {
fn(this.handlerConnector.hooks);
});
});
// now chain this onto the connection's unsubscribe call.
// just in case you destroy your component before setting a type on anything
// i.e.:
// conn without a type
// source = this.dnd.dragSource(null, { ... })
// manually connect to the DOM, which won't handle the returned subscription like the directive does
// ngAfterViewInit() { this.source.connectDragSource(this.myDiv.nativeElement); }
// never set a type
// then destroy your component, the source, but not the connection request.
// ngOnDestroy() { this.source.unsubscribe(); }
//
// without this, you would have a hanging resolvedType$.pipe(take(1)) subscription
// with this, it dies with the source's unsubscribe call.
//
// doesn't need this.subscriptionTypeLifetime, because pipe(take(1)) already does that
this.subscriptionConnectionLifetime.add(subscription);
return subscription;
}
connectDropTarget(node) {
return this.connect(c => c.dropTarget(node));
}
connectDragSource(node, options) {
return this.connect(c => c.dragSource(node, options));
}
connectDragPreview(node, options) {
return this.connect(c => c.dragPreview(node, options));
}
setTypes(type) {
// must run outside ngZone
this.ngZone.runOutsideAngular(() => {
this.receiveType(type);
this.resolvedType$.next(1);
});
}
setType(type) {
this.setTypes(type);
}
getHandlerId() {
return this.handlerId;
}
receiveType(type) {
if (type === this.currentType) {
return;
}
NgZone.assertNotInAngularZone();
this.currentType = type;
if (this.subscriptionTypeLifetime) {
this.subscriptionTypeLifetime.unsubscribe();
}
// console.debug('subscribed to ' + type.toString());
this.subscriptionTypeLifetime = new Subscription();
const { handlerId, unregister } = this.factoryArgs.registerHandler(type, this.handler, this.manager);
this.handlerId = handlerId;
this.handlerMonitor.receiveHandlerId(handlerId);
this.handlerConnector.receiveHandlerId(handlerId);
const globalMonitor = this.manager.getMonitor();
const unsubscribe = globalMonitor.subscribeToStateChange(this.handleChange, {
handlerIds: [handlerId],
});
this.subscriptionTypeLifetime.add(unsubscribe);
this.subscriptionTypeLifetime.add(unregister);
// this.subscriptionTypeLifetime.add(() => console.debug("unsubscribed from " + type.toString()));
}
unsubscribe() {
if (this.subscriptionTypeLifetime) {
this.subscriptionTypeLifetime.unsubscribe();
}
this.subscriptionConnectionLifetime.unsubscribe();
}
add(teardown) {
return this.subscriptionConnectionLifetime.add(teardown);
}
get closed() {
return this.subscriptionConnectionLifetime && this.subscriptionConnectionLifetime.closed;
}
}
export const TargetConnection = Connection;
export const SourceConnection = Connection;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdGlvbi1mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2ludGVybmFsL2Nvbm5lY3Rpb24tZmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZDLE9BQU8sRUFBRSxlQUFlLEVBQWMsYUFBYSxFQUFFLFlBQVksRUFBaUIsTUFBTSxNQUFNLENBQUM7QUFDL0YsT0FBTyxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFekMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV4QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQTJCN0QsTUFBTSxPQUFPLFVBQVU7SUE0QnJCLFlBQ1UsV0FBOEMsRUFDOUMsT0FBd0IsRUFDeEIsTUFBYyxFQUN0QixXQUF3QztRQUhoQyxnQkFBVyxHQUFYLFdBQVcsQ0FBbUM7UUFDOUMsWUFBTyxHQUFQLE9BQU8sQ0FBaUI7UUFDeEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQXZCeEIsNkdBQTZHO1FBQzVGLGtCQUFhLEdBQUcsSUFBSSxhQUFhLENBQU0sQ0FBQyxDQUFDLENBQUM7UUFhM0Q7OztXQUdHO1FBQ0ssbUNBQThCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQStDcEQsYUFBUSxHQUFHLEdBQUcsRUFBRTtZQUN0QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDcEMsQ0FBQyxDQUFDO1FBMkZNLGlCQUFZLEdBQUcsR0FBRyxFQUFFO1lBQzFCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztR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aEUsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsVUFBK0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmFja2VuZCwgRHJhZ0Ryb3BNYW5hZ2VyIH0gZnJvbSAnZG5kLWNvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBSZXBsYXlTdWJqZWN0LCBTdWJzY3JpcHRpb24sIFRlYXJkb3duTG9naWMgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIHN3aXRjaE1hcCwgdGFrZSwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgVFlQRV9EWU5BTUlDIH0gZnJvbSAnLi4vdG9rZW5zJztcbmltcG9ydCB7IFR5cGVPclR5cGVBcnJheSB9IGZyb20gJy4uL3R5cGUtaXNoJztcbmltcG9ydCB7IGludmFyaWFudCB9IGZyb20gJy4vaW52YXJpYW50JztcblxuaW1wb3J0IHsgYXJlQ29sbGVjdHNFcXVhbCB9IGZyb20gJy4uL3V0aWxzL2FyZUNvbGxlY3RzRXF1YWwnO1xuXG5pbXBvcnQgeyBEcmFnU291cmNlLCBEcm9wVGFyZ2V0IH0gZnJvbSAnLi4vY29ubmVjdGlvbi10eXBlcyc7XG5pbXBvcnQge1xuICBEcmFnUHJldmlld09wdGlvbnMsXG4gIERyYWdTb3VyY2VDb25uZWN0b3IsXG4gIERyYWdTb3VyY2VPcHRpb25zLFxuICBEcm9wVGFyZ2V0Q29ubmVjdG9yLFxufSBmcm9tICcuLi9jb25uZWN0b3JzJztcbmltcG9ydCB7IERyYWdTb3VyY2VNb25pdG9yIH0gZnJvbSAnLi4vc291cmNlLW1vbml0b3InO1xuaW1wb3J0IHsgRHJvcFRhcmdldE1vbml0b3IgfSBmcm9tICcuLi90YXJnZXQtbW9uaXRvcic7XG5pbXBvcnQgeyBDb25uZWN0b3IgfSBmcm9tICcuL2NyZWF0ZVNvdXJjZUNvbm5lY3Rvcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmFjdG9yeUFyZ3M8VE1vbml0b3IsIFRDb25uZWN0b3I+IHtcbiAgY3JlYXRlSGFuZGxlcjogKGhhbmRsZXJNb25pdG9yOiBhbnkpID0+IGFueTtcbiAgY3JlYXRlTW9uaXRvcjogKG1hbmFnZXI6IERyYWdEcm9wTWFuYWdlcikgPT4gVE1vbml0b3I7XG4gIGNyZWF0ZUNvbm5lY3RvcjogKGJhY2tlbmQ6IEJhY2tlbmQpID0+IENvbm5lY3RvcjxUQ29ubmVjdG9yPjtcbiAgcmVnaXN0ZXJIYW5kbGVyOiAoXG4gICAgdHlwZTogYW55LFxuICAgIGhhbmRsZXI6IGFueSxcbiAgICBtYW5hZ2VyOiBEcmFnRHJvcE1hbmFnZXJcbiAgKSA9PiB7XG4gICAgaGFuZGxlcklkOiBhbnk7XG4gICAgdW5yZWdpc3RlcjogU3Vic2NyaXB0aW9uIHwgKCguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCk7XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uPFRNb25pdG9yIGV4dGVuZHMgRHJhZ1NvdXJjZU1vbml0b3IgfCBEcm9wVGFyZ2V0TW9uaXRvciwgVENvbm5lY3Rvcj4ge1xuICAvLyBpbW11dGFibGUgYWZ0ZXIgaW5zdGFudGlhdGlvblxuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZXJNb25pdG9yOiBhbnk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlckNvbm5lY3RvcjogQ29ubmVjdG9yPFRDb25uZWN0b3I+O1xuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZXI6IGFueTtcblxuICAvKiogVGhlIHN0cmVhbSBvZiBhbGwgY2hhbmdlIGV2ZW50cyBmcm9tIHRoZSBpbnRlcm5hbCBzdWJzY3JpcHRpb24ncyBoYW5kbGVDaGFuZ2UgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjb2xsZWN0b3IkOiBCZWhhdmlvclN1YmplY3Q8VE1vbml0b3I+O1xuICAvKiogQSBzdWJqZWN0IGJhc2ljYWxseSB1c2VkIHRvIGtpY2sgb2ZmIGFueSBvYnNlcnZhYmxlcyB3YWl0aW5nIGZvciBhIHR5cGUgdG8gYmUgc2V0IHZpYSBzZXRUeXBlL3NldFR5cGVzICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZWRUeXBlJCA9IG5ldyBSZXBsYXlTdWJqZWN0PGFueT4oMSk7XG5cbiAgLy8gbXV0YWJsZSBzdGF0ZVxuICBwcml2YXRlIGN1cnJlbnRUeXBlPzogVHlwZU9yVHlwZUFycmF5O1xuICBwcml2YXRlIGhhbmRsZXJJZDogYW55O1xuXG4gIC8qKlxuICAgKiBUaGlzIG9uZSBpcyBjcmVhdGVkIGFuZCBkZXN0cm95ZWQgb25jZSBwZXIgdHlwZSBvciBsaXN0IG9mIHR5cGVzLlxuICAgKiBCZWNhdXNlIGVhY2ggdGltZSB3ZSBjaGFuZ2UgdGhlIHR5cGUsIHdlIHVuc3Vic2NyaWJlIGZyb20gdGhlIGdsb2JhbCBzdGF0ZSBzdG9yYWdlIGFuZFxuICAgKiByZS1zdWJzY3JpYmUgd2l0aCB0aGUgbmV3IHR5cGUuXG4gICAqL1xuICBwcml2YXRlIHN1YnNjcmlwdGlvblR5cGVMaWZldGltZT86IFN1YnNjcmlwdGlvbjtcblxuICAvKipcbiAgICogVGhpcyBvbmUgbGl2ZXMgZXhhY3RseSBhcyBsb25nIGFzIHRoZSBjb25uZWN0aW9uLlxuICAgKiBJdCBpcyByZXNwb25zaWJsZSBmb3IgZGlzcG9zaW5nIG9mIHRoZSBoYW5kbGVyQ29ubmVjdG9yLCBhbmQgYW55IGludGVybmFsIGxpc3RlbigpIHN1YnNjcmlwdGlvbnMuXG4gICAqL1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbkNvbm5lY3Rpb25MaWZldGltZSA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZhY3RvcnlBcmdzOiBGYWN0b3J5QXJnczxUTW9uaXRvciwgVENvbm5lY3Rvcj4sXG4gICAgcHJpdmF0ZSBtYW5hZ2VyOiBEcmFnRHJvcE1hbmFnZXIsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBpbml0aWFsVHlwZTogVHlwZU9yVHlwZUFycmF5IHwgdW5kZWZpbmVkXG4gICkge1xuICAgIGludmFyaWFudChcbiAgICAgIHR5cGVvZiBtYW5hZ2VyID09PSAnb2JqZWN0JyxcbiAgICAgIC8vIFRPRE86IHVwZGF0ZSB0aGlzIG1pbmktZG9jdW1lbnRhdGlvblxuICAgICAgJ0NvdWxkIG5vdCBmaW5kIHRoZSBkcmFnIGFuZCBkcm9wIG1hbmFnZXIgaW4gdGhlIGNvbnRleHQgb2YgJXMuICcgK1xuICAgICAgICAnTWFrZSBzdXJlIHRvIHdyYXAgdGhlIHRvcC1sZXZlbCBjb21wb25lbnQgb2YgeW91ciBhcHAgd2l0aCBEcmFnRHJvcENvbnRleHQuICdcbiAgICAgIC8vICdSZWFkIG1vcmU6ICcsXG4gICAgKTtcbiAgICBOZ1pvbmUuYXNzZXJ0Tm90SW5Bbmd1bGFyWm9uZSgpO1xuXG4gICAgdGhpcy5oYW5kbGVyTW9uaXRvciA9IHRoaXMuZmFjdG9yeUFyZ3MuY3JlYXRlTW9uaXRvcih0aGlzLm1hbmFnZXIpO1xuICAgIHRoaXMuY29sbGVjdG9yJCA9IG5ldyBCZWhhdmlvclN1YmplY3QodGhpcy5oYW5kbGVyTW9uaXRvcik7XG4gICAgdGhpcy5oYW5kbGVyID0gdGhpcy5mYWN0b3J5QXJncy5jcmVhdGVIYW5kbGVyKHRoaXMuaGFuZGxlck1vbml0b3IpO1xuICAgIHRoaXMuaGFuZGxlckNvbm5lY3RvciA9IHRoaXMuZmFjdG9yeUFyZ3MuY3JlYXRlQ29ubmVjdG9yKHRoaXMubWFuYWdlci5nZXRCYWNrZW5kKCkpO1xuICAgIC8vIGhhbmRsZXJDb25uZWN0b3IgbGl2ZXMgbG9uZ2VyIHRoYW4gYW55IHBlci10eXBlIHN1YnNjcmlwdGlvblxuICAgIHRoaXMuc3Vic2NyaXB0aW9uQ29ubmVjdGlvbkxpZmV0aW1lLmFkZCgoKSA9PiB0aGlzLmhhbmRsZXJDb25uZWN0b3IucmVjZWl2ZUhhbmRsZXJJZChudWxsKSk7XG5cbiAgICBpZiAoaW5pdGlhbFR5cGUgJiYgaW5pdGlhbFR5cGUgIT09IFRZUEVfRFlOQU1JQykge1xuICAgICAgdGhpcy5zZXRUeXBlcyhpbml0aWFsVHlwZSk7XG4gICAgfVxuICB9XG5cbiAgbGlzdGVuPFA+KG1hcEZuOiAobW9uaXRvcjogVE1vbml0b3IpID0+IFApOiBPYnNlcnZhYmxlPFA+IHtcbiAgICAvLyBMaXN0ZW5lcnMgYXJlIGdlbmVyYWxseSBhcm91bmQgYXMgbG9uZyBhcyB0aGUgY29ubmVjdGlvbi5cbiAgICAvLyBUaGlzIGlzbid0IDEwMCUgdHJ1ZSwgYnV0IHRoZXJlIGlzIG5vIHdheSBvZiBrbm93aW5nIChldmVuIGlmIHlvdSByZWYtY291bnQgaXQpXG4gICAgLy8gd2hlbiBhIGNvbXBvbmVudCBubyBsb25nZXIgbmVlZHMgaXQuXG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlJC5waXBlKFxuICAgICAgLy8gdGhpcyBlbnN1cmVzIHdlIGRvbid0IHN0YXJ0IGVtaXR0aW5nIHZhbHVlcyB1bnRpbCB0aGVyZSBpcyBhIHR5cGUgcmVzb2x2ZWRcbiAgICAgIHRha2UoMSksXG4gICAgICAvLyBzd2l0Y2ggb3VyIGF0dGVudGlvbiB0byB0aGUgaW5jb21pbmcgZmlyZWhvc2Ugb2YgJ3NvbWV0aGluZyBjaGFuZ2VkJyBldmVudHNcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmNvbGxlY3RvciQpLFxuICAgICAgLy8gdHVybiB0aGVtIGludG8gJ2ludGVyZXN0aW5nIHN0YXRlJyB2aWEgdGhlIG1vbml0b3IgYW5kIGEgdXNlci1wcm92aWRlZCBmdW5jdGlvblxuICAgICAgbWFwKG1hcEZuKSxcbiAgICAgIC8vIGRvbid0IGVtaXQgRVZFUlkgdGltZSB0aGUgZmlyZWhvc2Ugc2F5cyBzb21ldGhpbmcgY2hhbmdlZCwgb25seSB3aGVuIHRoZSBpbnRlcmVzdGluZyBzdGF0ZSBjaGFuZ2VzXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChhcmVDb2xsZWN0c0VxdWFsKSxcbiAgICAgIC8vIFRPRE86IGhvdyB0byByZWR1Y2UgdGhlIGZyZXF1ZW5jeSBvZiBjaGFuZ2UgZGV0ZWN0aW9uP1xuICAgICAgdGFwKHRoaXMub25VcGRhdGUpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgb25VcGRhdGUgPSAoKSA9PiB7XG4gICAgdGhpcy5oYW5kbGVyQ29ubmVjdG9yLnJlY29ubmVjdCgpO1xuICB9O1xuXG4gIGNvbm5lY3QoZm46IChjb25uZWN0b3I6IFRDb25uZWN0b3IpID0+IHZvaWQpIHtcbiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLnJlc29sdmVkVHlwZSQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgLy8gbXVzdCBydW4gaW5zaWRlIG5nWm9uZSBvdGhlcndpc2UgdGhlIHpvbmUgYXBwIG1heSBoYXZlIHNtYWxsIGlzc3VlXG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICBmbih0aGlzLmhhbmRsZXJDb25uZWN0b3IuaG9va3MpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgLy8gbm93IGNoYWluIHRoaXMgb250byB0aGUgY29ubmVjdGlvbidzIHVuc3Vic2NyaWJlIGNhbGwuXG4gICAgLy8ganVzdCBpbiBjYXNlIHlvdSBkZXN0cm95IHlvdXIgY29tcG9uZW50IGJlZm9yZSBzZXR0aW5nIGEgdHlwZSBvbiBhbnl0aGluZ1xuICAgIC8vIGkuZS46XG4gICAgLy8gY29ubiB3aXRob3V0IGEgdHlwZVxuICAgIC8vICAgICBzb3VyY2UgPSB0aGlzLmRuZC5kcmFnU291cmNlKG51bGwsIHsgLi4uIH0pXG4gICAgLy8gbWFudWFsbHkgY29ubmVjdCB0byB0aGUgRE9NLCB3aGljaCB3b24ndCBoYW5kbGUgdGhlIHJldHVybmVkIHN1YnNjcmlwdGlvbiBsaWtlIHRoZSBkaXJlY3RpdmUgZG9lc1xuICAgIC8vICAgICBuZ0FmdGVyVmlld0luaXQoKSB7IHRoaXMuc291cmNlLmNvbm5lY3REcmFnU291cmNlKHRoaXMubXlEaXYubmF0aXZlRWxlbWVudCk7IH1cbiAgICAvLyBuZXZlciBzZXQgYSB0eXBlXG4gICAgLy8gdGhlbiBkZXN0cm95IHlvdXIgY29tcG9uZW50LCB0aGUgc291cmNlLCBidXQgbm90IHRoZSBjb25uZWN0aW9uIHJlcXVlc3QuXG4gICAgLy8gICAgIG5nT25EZXN0cm95KCkgeyB0aGlzLnNvdXJjZS51bnN1YnNjcmliZSgpOyB9XG4gICAgLy9cbiAgICAvLyB3aXRob3V0IHRoaXMsIHlvdSB3b3VsZCBoYXZlIGEgaGFuZ2luZyByZXNvbHZlZFR5cGUkLnBpcGUodGFrZSgxKSkgc3Vic2NyaXB0aW9uXG4gICAgLy8gd2l0aCB0aGlzLCBpdCBkaWVzIHdpdGggdGhlIHNvdXJjZSdzIHVuc3Vic2NyaWJlIGNhbGwuXG4gICAgLy9cbiAgICAvLyBkb2Vzbid0IG5lZWQgdGhpcy5zdWJzY3JpcHRpb25UeXBlTGlmZXRpbWUsIGJlY2F1c2UgcGlwZSh0YWtlKDEpKSBhbHJlYWR5IGRvZXMgdGhhdFxuICAgIHRoaXMuc3Vic2NyaXB0aW9uQ29ubmVjdGlvbkxpZmV0aW1lLmFkZChzdWJzY3JpcHRpb24pO1xuICAgIHJldHVybiBzdWJzY3JpcHRpb247XG4gIH1cblxuICBjb25uZWN0RHJvcFRhcmdldChub2RlOiBOb2RlKSB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdChjID0+IChjIGFzIERyb3BUYXJnZXRDb25uZWN0b3IpLmRyb3BUYXJnZXQobm9kZSkpO1xuICB9XG5cbiAgY29ubmVjdERyYWdTb3VyY2Uobm9kZTogTm9kZSwgb3B0aW9uczogRHJhZ1NvdXJjZU9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0KGMgPT4gKGMgYXMgRHJhZ1NvdXJjZUNvbm5lY3RvcikuZHJhZ1NvdXJjZShub2RlLCBvcHRpb25zKSk7XG4gIH1cblxuICBjb25uZWN0RHJhZ1ByZXZpZXcobm9kZTogTm9kZSwgb3B0aW9uczogRHJhZ1ByZXZpZXdPcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdChjID0+IChjIGFzIERyYWdTb3VyY2VDb25uZWN0b3IpLmRyYWdQcmV2aWV3KG5vZGUsIG9wdGlvbnMpKTtcbiAgfVxuXG4gIHNldFR5cGVzKHR5cGU6IFR5cGVPclR5cGVBcnJheSkge1xuICAgIC8vIG11c3QgcnVuIG91dHNpZGUgbmdab25lXG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5yZWNlaXZlVHlwZSh0eXBlKTtcbiAgICAgIHRoaXMucmVzb2x2ZWRUeXBlJC5uZXh0KDEpO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0VHlwZSh0eXBlOiBzdHJpbmcgfCBzeW1ib2wpIHtcbiAgICB0aGlzLnNldFR5cGVzKHR5cGUpO1xuICB9XG5cbiAgZ2V0SGFuZGxlcklkKCkge1xuICAgIHJldHVybiB0aGlzLmhhbmRsZXJJZDtcbiAgfVxuXG4gIHJlY2VpdmVUeXBlKHR5cGU6IFR5cGVPclR5cGVBcnJheSkge1xuICAgIGlmICh0eXBlID09PSB0aGlzLmN1cnJlbnRUeXBlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgTmdab25lLmFzc2VydE5vdEluQW5ndWxhclpvbmUoKTtcblxuICAgIHRoaXMuY3VycmVudFR5cGUgPSB0eXBlO1xuXG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uVHlwZUxpZmV0aW1lKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvblR5cGVMaWZldGltZS51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICAvLyBjb25zb2xlLmRlYnVnKCdzdWJzY3JpYmVkIHRvICcgKyB0eXBlLnRvU3RyaW5nKCkpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uVHlwZUxpZmV0aW1lID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gICAgY29uc3QgeyBoYW5kbGVySWQsIHVucmVnaXN0ZXIgfSA9IHRoaXMuZmFjdG9yeUFyZ3MucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgdHlwZSxcbiAgICAgIHRoaXMuaGFuZGxlcixcbiAgICAgIHRoaXMubWFuYWdlclxuICAgICk7XG5cbiAgICB0aGlzLmhhbmRsZXJJZCA9IGhhbmRsZXJJZDtcbiAgICB0aGlzLmhhbmRsZXJNb25pdG9yLnJlY2VpdmVIYW5kbGVySWQoaGFuZGxlcklkKTtcbiAgICB0aGlzLmhhbmRsZXJDb25uZWN0b3IucmVjZWl2ZUhhbmRsZXJJZChoYW5kbGVySWQpO1xuXG4gICAgY29uc3QgZ2xvYmFsTW9uaXRvciA9IHRoaXMubWFuYWdlci5nZXRNb25pdG9yKCk7XG4gICAgY29uc3QgdW5zdWJzY3JpYmUgPSBnbG9iYWxNb25pdG9yLnN1YnNjcmliZVRvU3RhdGVDaGFuZ2UodGhpcy5oYW5kbGVDaGFuZ2UsIHtcbiAgICAgIGhhbmRsZXJJZHM6IFtoYW5kbGVySWRdLFxuICAgIH0pO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25UeXBlTGlmZXRpbWUuYWRkKHVuc3Vic2NyaWJlKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvblR5cGVMaWZldGltZS5hZGQodW5yZWdpc3Rlcik7XG4gICAgLy8gdGhpcy5zdWJzY3JpcHRpb25UeXBlTGlmZXRpbWUuYWRkKCgpID0+IGNvbnNvbGUuZGVidWcoXCJ1bnN1YnNjcmliZWQgZnJvbSBcIiArIHR5cGUudG9TdHJpbmcoKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDaGFuZ2UgPSAoKSA9PiB7XG4gICAgdGhpcy5jb2xsZWN0b3IkLm5leHQodGhpcy5oYW5kbGVyTW9uaXRvcik7XG4gIH07XG5cbiAgdW5zdWJzY3JpYmUoKSB7XG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uVHlwZUxpZmV0aW1lKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvblR5cGVMaWZldGltZS51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLnN1YnNjcmlwdGlvbkNvbm5lY3Rpb25MaWZldGltZS51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgYWRkKHRlYXJkb3duOiBUZWFyZG93bkxvZ2ljKSB7XG4gICAgcmV0dXJuIHRoaXMuc3Vic2NyaXB0aW9uQ29ubmVjdGlvbkxpZmV0aW1lLmFkZCh0ZWFyZG93bik7XG4gIH1cblxuICBnZXQgY2xvc2VkKCkge1xuICAgIHJldHVybiB0aGlzLnN1YnNjcmlwdGlvbkNvbm5lY3Rpb25MaWZldGltZSAmJiB0aGlzLnN1YnNjcmlwdGlvbkNvbm5lY3Rpb25MaWZldGltZS5jbG9zZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBTb3VyY2VDb25zdHJ1Y3RvcjxJdGVtID0gdW5rbm93biwgRHJvcFJlc3VsdCA9IHVua25vd24+IHtcbiAgbmV3IChcbiAgICBmYWN0b3J5QXJnczogRmFjdG9yeUFyZ3M8RHJhZ1NvdXJjZU1vbml0b3IsIERyYWdTb3VyY2VDb25uZWN0b3I+LFxuICAgIG1hbmFnZXI6IERyYWdEcm9wTWFuYWdlcixcbiAgICBuZ1pvbmU6IE5nWm9uZSxcbiAgICBpbml0aWFsVHlwZTogc3RyaW5nIHwgc3ltYm9sIHwgdW5kZWZpbmVkXG4gICk6IERyYWdTb3VyY2U8SXRlbSwgRHJvcFJlc3VsdD47XG59XG5leHBvcnQgaW50ZXJmYWNlIFRhcmdldENvbnN0cnVjdG9yIHtcbiAgbmV3IChcbiAgICBmYWN0b3J5QXJnczogRmFjdG9yeUFyZ3M8RHJvcFRhcmdldE1vbml0b3IsIERyb3BUYXJnZXRDb25uZWN0b3I+LFxuICAgIG1hbmFnZXI6IERyYWdEcm9wTWFuYWdlcixcbiAgICBuZ1pvbmU6IE5nWm9uZSxcbiAgICBpbml0aWFsVHlwZTogVHlwZU9yVHlwZUFycmF5IHwgdW5kZWZpbmVkXG4gICk6IERyb3BUYXJnZXQ7XG59XG5cbmV4cG9ydCBjb25zdCBUYXJnZXRDb25uZWN0aW9uID0gQ29ubmVjdGlvbiBhcyBUYXJnZXRDb25zdHJ1Y3RvcjtcbmV4cG9ydCBjb25zdCBTb3VyY2VDb25uZWN0aW9uID0gQ29ubmVjdGlvbiBhcyBTb3VyY2VDb25zdHJ1Y3RvcjtcbiJdfQ==