UNPKG

angular-cesium

Version:
159 lines 21.4 kB
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, Input, ViewChild } from '@angular/core'; import { Subject } from 'rxjs'; import * as _get from 'lodash.get'; import { AcLayerComponent } from '../ac-layer/ac-layer.component'; import { LayerService } from '../../services/layer-service/layer-service.service'; import { BasicDesc } from '../../services/basic-desc/basic-desc.service'; /** * This is component represents an array under `ac-layer`. * The element must be a child of ac-layer element. * + acFor `{string}` - get the tracked array and entityName (see the example). * + idGetter `{Function}` - a function that gets the id for a given element in the array -should be defined for maximum performance. * + show `{boolean}` - show/hide array's entities. * * __Usage :__ * ``` *<ac-layer acFor="let track of tracks$" [show]="show" [context]="this" [store]="true"> * <ac-array-desc acFor="let arrayItem of track.array" [idGetter]="trackArrayIdGetter"> * <ac-array-desc acFor="let innerArrayItem of arrayItem.innerArray" [idGetter]="trackArrayIdGetter"> * <ac-point-desc props="{ * position: innerArrayItem.pos, * pixelSize: 10, * color: getTrackColor(track), * outlineColor: Cesium.Color.BLUE, * outlineWidth: 1 * }"> * </ac-point-desc> * </ac-array-desc> * </ac-array-desc> *</ac-layer> * ``` */ export class AcArrayDescComponent { constructor(layerService, cd) { this.layerService = layerService; this.cd = cd; this.show = true; this.entitiesMap = new Map(); this.id = 0; this.acForRgx = /^let\s+.+\s+of\s+.+$/; this.arrayObservable$ = new Subject(); } ngOnChanges(changes) { if (changes['acFor'].firstChange) { const acForString = changes['acFor'].currentValue; if (!this.acForRgx.test(acForString)) { throw new Error(`ac-layer: Invalid [acFor] syntax. Expected: [acFor]="let item of observable" .Instead received: ${acForString}`); } const acForArr = changes['acFor'].currentValue.split(' '); this.arrayPath = acForArr[3]; this.entityName = acForArr[1]; } } ngOnInit() { if (this.layer) { this.layer.getLayerService().cache = false; } this.layerServiceSubscription = this.layerService.layerUpdates().subscribe(() => { this.cd.detectChanges(); }); } ngAfterContentInit() { this.layerService.context['arrayObservable$'] = this.arrayObservable$; this.layerService.registerDescription(this); this.basicDescs._results.forEach((component) => { component.setLayerService(this.layer.getLayerService()); }); this.arrayDescs._results.splice(0, 1); this.arrayDescs._results.forEach((component) => { this.layerService.unregisterDescription(component); this.layer.getLayerService().registerDescription(component); component.layerService = this.layer.getLayerService(); component.setLayerService(this.layer.getLayerService()); }); } ngOnDestroy() { if (this.layerServiceSubscription) { this.layerServiceSubscription.unsubscribe(); } } setLayerService(layerService) { this.layerService = layerService; } draw(context, id, contextEntity) { const get = _get; const entitiesArray = get(context, this.arrayPath); if (!entitiesArray) { return; } const previousEntitiesIdArray = this.entitiesMap.get(id); const entitiesIdArray = []; this.entitiesMap.set(id, entitiesIdArray); entitiesArray.forEach((item, index) => { this.layerService.context[this.entityName] = item; const arrayItemId = this.generateCombinedId(id, item, index); entitiesIdArray.push(arrayItemId); this.layer.update(contextEntity, arrayItemId); }); if (previousEntitiesIdArray) { const entitiesToRemove = this.idGetter ? previousEntitiesIdArray.filter((entityId) => entitiesIdArray.indexOf(entityId) < 0) : previousEntitiesIdArray; if (entitiesToRemove) { entitiesToRemove.forEach((entityId) => this.layer.remove(entityId)); } } } remove(id) { const entitiesIdArray = this.entitiesMap.get(id); if (entitiesIdArray) { entitiesIdArray.forEach((entityId) => this.layer.remove(entityId)); } this.entitiesMap.delete(id); } removeAll() { this.layer.removeAll(); this.entitiesMap.clear(); } getAcForString() { return `let ${this.entityName + '___temp'} of arrayObservable$`; } generateCombinedId(entityId, arrayItem, index) { let arrayItemId; if (this.idGetter) { arrayItemId = this.idGetter(arrayItem, index); } else { arrayItemId = (this.id++) % Number.MAX_SAFE_INTEGER; } return entityId + arrayItemId; } } AcArrayDescComponent.decorators = [ { type: Component, args: [{ selector: 'ac-array-desc', template: ` <ac-layer #layer [acFor]="getAcForString()" [context]="layerService.context" [options]="layerService.options" [show]="layerService.show && show" [zIndex]="layerService.zIndex"> <ng-content #content></ng-content> </ac-layer> `, changeDetection: ChangeDetectionStrategy.OnPush },] } ]; AcArrayDescComponent.ctorParameters = () => [ { type: LayerService }, { type: ChangeDetectorRef } ]; AcArrayDescComponent.propDecorators = { acFor: [{ type: Input }], idGetter: [{ type: Input }], show: [{ type: Input }], layer: [{ type: ViewChild, args: ['layer', { static: true },] }], basicDescs: [{ type: ContentChildren, args: [BasicDesc, { descendants: false },] }], arrayDescs: [{ type: ContentChildren, args: [AcArrayDescComponent, { descendants: false },] }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWMtYXJyYXktZGVzYy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNlc2l1bS9zcmMvbGliL2FuZ3VsYXItY2VzaXVtL2NvbXBvbmVudHMvYWMtYXJyYXktZGVzYy9hYy1hcnJheS1kZXNjLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsZUFBZSxFQUNmLEtBQUssRUFLTCxTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFFN0MsT0FBTyxLQUFLLElBQUksTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUV6RTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBZUgsTUFBTSxPQUFPLG9CQUFvQjtJQWtCL0IsWUFBbUIsWUFBMEIsRUFBVSxFQUFxQjtRQUF6RCxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUFVLE9BQUUsR0FBRixFQUFFLENBQW1CO1FBWm5FLFNBQUksR0FBRyxJQUFJLENBQUM7UUFJYixnQkFBVyxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO1FBRTFDLE9BQUUsR0FBRyxDQUFDLENBQUM7UUFDRSxhQUFRLEdBQUcsc0JBQXNCLENBQUM7UUFHbkQscUJBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQWtCLENBQUM7SUFHakQsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUU7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bnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlckNvbnRlbnRJbml0LFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBDb250ZW50Q2hpbGRyZW4sXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWNOb3RpZmljYXRpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvYWMtbm90aWZpY2F0aW9uJztcclxuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IElEZXNjcmlwdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9kZXNjcmlwdGlvbic7XHJcbmltcG9ydCAqIGFzIF9nZXQgZnJvbSAnbG9kYXNoLmdldCc7XHJcbmltcG9ydCB7IEFjTGF5ZXJDb21wb25lbnQgfSBmcm9tICcuLi9hYy1sYXllci9hYy1sYXllci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBMYXllclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9sYXllci1zZXJ2aWNlL2xheWVyLXNlcnZpY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2ljRGVzYyB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Jhc2ljLWRlc2MvYmFzaWMtZGVzYy5zZXJ2aWNlJztcclxuXHJcbi8qKlxyXG4gKiAgVGhpcyBpcyBjb21wb25lbnQgcmVwcmVzZW50cyBhbiBhcnJheSB1bmRlciBgYWMtbGF5ZXJgLlxyXG4gKiAgVGhlIGVsZW1lbnQgbXVzdCBiZSBhIGNoaWxkIG9mIGFjLWxheWVyIGVsZW1lbnQuXHJcbiAqICArIGFjRm9yIGB7c3RyaW5nfWAgLSBnZXQgdGhlIHRyYWNrZWQgYXJyYXkgYW5kIGVudGl0eU5hbWUgKHNlZSB0aGUgZXhhbXBsZSkuXHJcbiAqICArIGlkR2V0dGVyIGB7RnVuY3Rpb259YCAtIGEgZnVuY3Rpb24gdGhhdCBnZXRzIHRoZSBpZCBmb3IgYSBnaXZlbiBlbGVtZW50IGluIHRoZSBhcnJheSAtc2hvdWxkIGJlIGRlZmluZWQgZm9yIG1heGltdW0gcGVyZm9ybWFuY2UuXHJcbiAqICArIHNob3cgYHtib29sZWFufWAgLSBzaG93L2hpZGUgYXJyYXkncyBlbnRpdGllcy5cclxuICpcclxuICogIF9fVXNhZ2UgOl9fXHJcbiAqICBgYGBcclxuICo8YWMtbGF5ZXIgYWNGb3I9XCJsZXQgdHJhY2sgb2YgdHJhY2tzJFwiIFtzaG93XT1cInNob3dcIiBbY29udGV4dF09XCJ0aGlzXCIgW3N0b3JlXT1cInRydWVcIj5cclxuICogIDxhYy1hcnJheS1kZXNjIGFjRm9yPVwibGV0IGFycmF5SXRlbSBvZiB0cmFjay5hcnJheVwiIFtpZEdldHRlcl09XCJ0cmFja0FycmF5SWRHZXR0ZXJcIj5cclxuICogICAgPGFjLWFycmF5LWRlc2MgYWNGb3I9XCJsZXQgaW5uZXJBcnJheUl0ZW0gb2YgYXJyYXlJdGVtLmlubmVyQXJyYXlcIiBbaWRHZXR0ZXJdPVwidHJhY2tBcnJheUlkR2V0dGVyXCI+XHJcbiAqICAgICAgPGFjLXBvaW50LWRlc2MgcHJvcHM9XCJ7XHJcbiAqICAgICAgICBwb3NpdGlvbjogaW5uZXJBcnJheUl0ZW0ucG9zLFxyXG4gKiAgICAgICAgcGl4ZWxTaXplOiAxMCxcclxuICogICAgICAgIGNvbG9yOiBnZXRUcmFja0NvbG9yKHRyYWNrKSxcclxuICogICAgICAgIG91dGxpbmVDb2xvcjogQ2VzaXVtLkNvbG9yLkJMVUUsXHJcbiAqICAgICAgICBvdXRsaW5lV2lkdGg6IDFcclxuICogICAgICB9XCI+XHJcbiAqICAgICAgPC9hYy1wb2ludC1kZXNjPlxyXG4gKiAgICA8L2FjLWFycmF5LWRlc2M+XHJcbiAqICA8L2FjLWFycmF5LWRlc2M+XHJcbiAqPC9hYy1sYXllcj5cclxuICogIGBgYFxyXG4gKi9cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYWMtYXJyYXktZGVzYycsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxhYy1sYXllciAjbGF5ZXIgW2FjRm9yXT1cImdldEFjRm9yU3RyaW5nKClcIlxyXG4gICAgICAgICAgICAgIFtjb250ZXh0XT1cImxheWVyU2VydmljZS5jb250ZXh0XCJcclxuICAgICAgICAgICAgICBbb3B0aW9uc109XCJsYXllclNlcnZpY2Uub3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgW3Nob3ddPVwibGF5ZXJTZXJ2aWNlLnNob3cgJiYgc2hvd1wiXHJcbiAgICAgICAgICAgICAgW3pJbmRleF09XCJsYXllclNlcnZpY2UuekluZGV4XCI+XHJcbiAgICAgIDxuZy1jb250ZW50ICNjb250ZW50PjwvbmctY29udGVudD5cclxuICAgIDwvYWMtbGF5ZXI+XHJcbiAgYCxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIEFjQXJyYXlEZXNjQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSwgSURlc2NyaXB0aW9uIHtcclxuXHJcbiAgQElucHV0KCkgYWNGb3I6IHN0cmluZztcclxuXHJcbiAgQElucHV0KCkgaWRHZXR0ZXI6IChpdGVtOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHN0cmluZztcclxuXHJcbiAgQElucHV0KCkgc2hvdyA9IHRydWU7XHJcbiAgQFZpZXdDaGlsZCgnbGF5ZXInLCB7c3RhdGljOiB0cnVlfSkgcHJpdmF0ZSBsYXllcjogQWNMYXllckNvbXBvbmVudDtcclxuICBAQ29udGVudENoaWxkcmVuKEJhc2ljRGVzYywge2Rlc2NlbmRhbnRzOiBmYWxzZX0pIHByaXZhdGUgYmFzaWNEZXNjczogYW55O1xyXG4gIEBDb250ZW50Q2hpbGRyZW4oQWNBcnJheURlc2NDb21wb25lbnQsIHtkZXNjZW5kYW50czogZmFsc2V9KSBwcml2YXRlIGFycmF5RGVzY3M6IGFueTtcclxuICBwcml2YXRlIGVudGl0aWVzTWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xyXG4gIHByaXZhdGUgbGF5ZXJTZXJ2aWNlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgcHJpdmF0ZSBpZCA9IDA7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhY0ZvclJneCA9IC9ebGV0XFxzKy4rXFxzK29mXFxzKy4rJC87XHJcbiAgZW50aXR5TmFtZTogc3RyaW5nO1xyXG4gIGFycmF5UGF0aDogc3RyaW5nO1xyXG4gIGFycmF5T2JzZXJ2YWJsZSQgPSBuZXcgU3ViamVjdDxBY05vdGlmaWNhdGlvbj4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIGxheWVyU2VydmljZTogTGF5ZXJTZXJ2aWNlLCBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZikge1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbJ2FjRm9yJ10uZmlyc3RDaGFuZ2UpIHtcclxuICAgICAgY29uc3QgYWNGb3JTdHJpbmcgPSBjaGFuZ2VzWydhY0ZvciddLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgaWYgKCF0aGlzLmFjRm9yUmd4LnRlc3QoYWNGb3JTdHJpbmcpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBhYy1sYXllcjogSW52YWxpZCBbYWNGb3JdIHN5bnRheC4gRXhwZWN0ZWQ6IFthY0Zvcl09XCJsZXQgaXRlbSBvZiBvYnNlcnZhYmxlXCIgLkluc3RlYWQgcmVjZWl2ZWQ6ICR7YWNGb3JTdHJpbmd9YCk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgYWNGb3JBcnIgPSBjaGFuZ2VzWydhY0ZvciddLmN1cnJlbnRWYWx1ZS5zcGxpdCgnICcpO1xyXG4gICAgICB0aGlzLmFycmF5UGF0aCA9IGFjRm9yQXJyWzNdO1xyXG4gICAgICB0aGlzLmVudGl0eU5hbWUgPSBhY0ZvckFyclsxXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMubGF5ZXIpIHtcclxuICAgICAgdGhpcy5sYXllci5nZXRMYXllclNlcnZpY2UoKS5jYWNoZSA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubGF5ZXJTZXJ2aWNlU3Vic2NyaXB0aW9uID0gdGhpcy5sYXllclNlcnZpY2UubGF5ZXJVcGRhdGVzKCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMubGF5ZXJTZXJ2aWNlLmNvbnRleHRbJ2FycmF5T2JzZXJ2YWJsZSQnXSA9IHRoaXMuYXJyYXlPYnNlcnZhYmxlJDtcclxuICAgIHRoaXMubGF5ZXJTZXJ2aWNlLnJlZ2lzdGVyRGVzY3JpcHRpb24odGhpcyk7XHJcbiAgICB0aGlzLmJhc2ljRGVzY3MuX3Jlc3VsdHMuZm9yRWFjaCgoY29tcG9uZW50OiBCYXNpY0Rlc2MpID0+IHtcclxuICAgICAgY29tcG9uZW50LnNldExheWVyU2VydmljZSh0aGlzLmxheWVyLmdldExheWVyU2VydmljZSgpKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5hcnJheURlc2NzLl9yZXN1bHRzLnNwbGljZSgwLCAxKTtcclxuICAgIHRoaXMuYXJyYXlEZXNjcy5fcmVzdWx0cy5mb3JFYWNoKChjb21wb25lbnQ6IEFjQXJyYXlEZXNjQ29tcG9uZW50KSA9PiB7XHJcbiAgICAgIHRoaXMubGF5ZXJTZXJ2aWNlLnVucmVnaXN0ZXJEZXNjcmlwdGlvbihjb21wb25lbnQpO1xyXG4gICAgICB0aGlzLmxheWVyLmdldExheWVyU2VydmljZSgpLnJlZ2lzdGVyRGVzY3JpcHRpb24oY29tcG9uZW50KTtcclxuICAgICAgY29tcG9uZW50LmxheWVyU2VydmljZSA9IHRoaXMubGF5ZXIuZ2V0TGF5ZXJTZXJ2aWNlKCk7XHJcbiAgICAgIGNvbXBvbmVudC5zZXRMYXllclNlcnZpY2UodGhpcy5sYXllci5nZXRMYXllclNlcnZpY2UoKSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMubGF5ZXJTZXJ2aWNlU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMubGF5ZXJTZXJ2aWNlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRMYXllclNlcnZpY2UobGF5ZXJTZXJ2aWNlOiBMYXllclNlcnZpY2UpIHtcclxuICAgIHRoaXMubGF5ZXJTZXJ2aWNlID0gbGF5ZXJTZXJ2aWNlO1xyXG4gIH1cclxuXHJcbiAgZHJhdyhjb250ZXh0OiBhbnksIGlkOiBzdHJpbmcsIGNvbnRleHRFbnRpdHk6IGFueSkge1xyXG4gICAgY29uc3QgZ2V0ID0gX2dldDtcclxuICAgIGNvbnN0IGVudGl0aWVzQXJyYXk6IGFueVtdID0gZ2V0KGNvbnRleHQsIHRoaXMuYXJyYXlQYXRoKTtcclxuICAgIGlmICghZW50aXRpZXNBcnJheSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBwcmV2aW91c0VudGl0aWVzSWRBcnJheSA9IHRoaXMuZW50aXRpZXNNYXAuZ2V0KGlkKTtcclxuICAgIGNvbnN0IGVudGl0aWVzSWRBcnJheTogYW55W10gPSBbXTtcclxuICAgIHRoaXMuZW50aXRpZXNNYXAuc2V0KGlkLCBlbnRpdGllc0lkQXJyYXkpO1xyXG5cclxuICAgIGVudGl0aWVzQXJyYXkuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgdGhpcy5sYXllclNlcnZpY2UuY29udGV4dFt0aGlzLmVudGl0eU5hbWVdID0gaXRlbTtcclxuICAgICAgY29uc3QgYXJyYXlJdGVtSWQgPSB0aGlzLmdlbmVyYXRlQ29tYmluZWRJZChpZCwgaXRlbSwgaW5kZXgpO1xyXG4gICAgICBlbnRpdGllc0lkQXJyYXkucHVzaChhcnJheUl0ZW1JZCk7XHJcbiAgICAgIHRoaXMubGF5ZXIudXBkYXRlKGNvbnRleHRFbnRpdHksIGFycmF5SXRlbUlkKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChwcmV2aW91c0VudGl0aWVzSWRBcnJheSkge1xyXG4gICAgICBjb25zdCBlbnRpdGllc1RvUmVtb3ZlID0gdGhpcy5pZEdldHRlciA/XHJcbiAgICAgICAgcHJldmlvdXNFbnRpdGllc0lkQXJyYXkuZmlsdGVyKChlbnRpdHlJZCkgPT4gZW50aXRpZXNJZEFycmF5LmluZGV4T2YoZW50aXR5SWQpIDwgMCkgOlxyXG4gICAgICAgIHByZXZpb3VzRW50aXRpZXNJZEFycmF5O1xyXG4gICAgICBpZiAoZW50aXRpZXNUb1JlbW92ZSkge1xyXG4gICAgICAgIGVudGl0aWVzVG9SZW1vdmUuZm9yRWFjaCgoZW50aXR5SWQpID0+IHRoaXMubGF5ZXIucmVtb3ZlKGVudGl0eUlkKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZShpZDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBlbnRpdGllc0lkQXJyYXkgPSB0aGlzLmVudGl0aWVzTWFwLmdldChpZCk7XHJcbiAgICBpZiAoZW50aXRpZXNJZEFycmF5KSB7XHJcbiAgICAgIGVudGl0aWVzSWRBcnJheS5mb3JFYWNoKChlbnRpdHlJZCkgPT4gdGhpcy5sYXllci5yZW1vdmUoZW50aXR5SWQpKTtcclxuICAgIH1cclxuICAgIHRoaXMuZW50aXRpZXNNYXAuZGVsZXRlKGlkKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUFsbCgpIHtcclxuICAgIHRoaXMubGF5ZXIucmVtb3ZlQWxsKCk7XHJcbiAgICB0aGlzLmVudGl0aWVzTWFwLmNsZWFyKCk7XHJcbiAgfVxyXG5cclxuICBnZXRBY0ZvclN0cmluZygpIHtcclxuICAgIHJldHVybiBgbGV0ICR7dGhpcy5lbnRpdHlOYW1lICsgJ19fX3RlbXAnfSBvZiBhcnJheU9ic2VydmFibGUkYDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2VuZXJhdGVDb21iaW5lZElkKGVudGl0eUlkOiBzdHJpbmcsIGFycmF5SXRlbTogYW55LCBpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBhcnJheUl0ZW1JZDtcclxuICAgIGlmICh0aGlzLmlkR2V0dGVyKSB7XHJcbiAgICAgIGFycmF5SXRlbUlkID0gdGhpcy5pZEdldHRlcihhcnJheUl0ZW0sIGluZGV4KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGFycmF5SXRlbUlkID0gKHRoaXMuaWQrKykgJSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcclxuICAgIH1cclxuICAgIHJldHVybiBlbnRpdHlJZCArIGFycmF5SXRlbUlkO1xyXG4gIH1cclxufVxyXG4iXX0=