UNPKG

bp-prism-game

Version:
111 lines 16.3 kB
import { Component, ViewChild } from '@angular/core'; import { PrismBaseClass } from '../prism-base/prism-base.class'; import { AlienBaseClass } from '../alien-base/alien-base.class'; import { BLOCK_SIZE } from '../../gameboard/gameboard-constants'; import { AssetAlignEnum } from '../../asset/enum/asset-align.enum'; import { AssetAlignVerticalEnum } from '../../asset/enum/asset-align-vertical.enum'; import * as i0 from "@angular/core"; import * as i1 from "../../service/game.service"; import * as i2 from "@angular/common"; /** * The Prism Base Component */ export class BaseComponent { /** * The Constructor * @param gameService The GameService from DI */ constructor(gameService) { this.gameService = gameService; this.assets = [ { key: 'prismBase1', name: 'B-1' }, { key: 'alienBase1', name: 'A-1' } ]; } /** * On Init */ ngOnInit() { const rows = 31; const columns = 31; this.gameBoard = Array.from({ length: rows }, () => Array(columns).fill(0)); this.ctx = this.gameService.initBoard(this.canvas, rows, columns, BLOCK_SIZE * 5, this.gameBoard); this.addPrismBases(); this.animate(); this.base.animate(); } /** * Add the prismBases */ addPrismBases() { this.bases = []; const prismBase1 = new PrismBaseClass(this.gameService, this.ctx, 1); prismBase1.isDestroyed = true; this.bases.push(prismBase1); const prismBase2 = new AlienBaseClass(this.gameService, this.ctx, 1); prismBase2.isDestroyed = true; this.bases.push(prismBase2); this.base = this.bases[0]; this.base.isDestroyed = false; } /** * Animate the object once */ animateAsset() { this.base.move(this.base.positionAsset(AssetAlignEnum.center, AssetAlignVerticalEnum.middle)); this.base.isDestroyed = false; cancelAnimationFrame(this.requestId); this.animate(); } /** * Draw the board */ draw() { this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height); this.gameService.addOutlines(this.ctx, 1, 0.1); } /** * Animate */ animate() { this.draw(); this.base.animate(); this.requestId = requestAnimationFrame(this.animate.bind(this)); } /** * toggleAssets * * @param key The asset to display */ toggleAssets(key) { this.base.isDestroyed = true; this.draw(); let index = 0; this.bases.map((prismBase) => { prismBase.isDestroyed = true; }); this.assets.map((asset, $index) => { if (key === asset.key) { index = $index; } }); this.base = this.bases[index]; this.animateAsset(); } } BaseComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: BaseComponent, deps: [{ token: i1.GameService }], target: i0.ɵɵFactoryTarget.Component }); BaseComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.2", type: BaseComponent, selector: "bp-prism-base", viewQueries: [{ propertyName: "canvas", first: true, predicate: ["board"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"game-container\">\n <div class=\"asset-title\">Prism Base</div>\n <div class=\"game-board-container\">\n <canvas #board class=\"game-board\"></canvas>\n </div>\n <div class=\"button-container\">\n <button (click)=\"animateAsset()\" class=\"animation-button button\">Animate</button>\n <div *ngFor=\"let asset of assets\">\n <button (click)=\"toggleAssets(asset.key)\" class=\"animation-button button\">\n {{ asset.name }}\n </button>\n </div>\n </div>\n</div>\n", styles: [".game-container .asset-title{margin-bottom:25px;width:100%;text-align:center}.game-container .game-board-container{display:flex;flex-direction:row;justify-content:center}.game-container .game-board-container .game-board{border:solid 2px grey;background-color:#000}.game-container .button-container{position:relative;margin-top:25px;display:flex;flex-wrap:wrap;flex-direction:row;justify-content:space-evenly}.game-container .button-container .animation-button{background-color:#4caf50}.game-container .button-container .button{flex-wrap:wrap;font-size:16px;margin-top:10px;padding:15px 30px;cursor:pointer;width:165px;border:1px solid black}\n"], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: BaseComponent, decorators: [{ type: Component, args: [{ selector: 'bp-prism-base', template: "<div class=\"game-container\">\n <div class=\"asset-title\">Prism Base</div>\n <div class=\"game-board-container\">\n <canvas #board class=\"game-board\"></canvas>\n </div>\n <div class=\"button-container\">\n <button (click)=\"animateAsset()\" class=\"animation-button button\">Animate</button>\n <div *ngFor=\"let asset of assets\">\n <button (click)=\"toggleAssets(asset.key)\" class=\"animation-button button\">\n {{ asset.name }}\n </button>\n </div>\n </div>\n</div>\n", styles: [".game-container .asset-title{margin-bottom:25px;width:100%;text-align:center}.game-container .game-board-container{display:flex;flex-direction:row;justify-content:center}.game-container .game-board-container .game-board{border:solid 2px grey;background-color:#000}.game-container .button-container{position:relative;margin-top:25px;display:flex;flex-wrap:wrap;flex-direction:row;justify-content:space-evenly}.game-container .button-container .animation-button{background-color:#4caf50}.game-container .button-container .button{flex-wrap:wrap;font-size:16px;margin-top:10px;padding:15px 30px;cursor:pointer;width:165px;border:1px solid black}\n"] }] }], ctorParameters: function () { return [{ type: i1.GameService }]; }, propDecorators: { canvas: [{ type: ViewChild, args: ['board', { static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcmlzbS9zcmMvbGliL2Jhc2UvdGVzdC1jb21wb25lbnQvYmFzZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcmlzbS9zcmMvbGliL2Jhc2UvdGVzdC1jb21wb25lbnQvYmFzZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFzQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHekUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDOzs7O0FBRXBGOztHQUVHO0FBTUgsTUFBTSxPQUFPLGFBQWE7SUFvQ3hCOzs7T0FHRztJQUNILFlBQW9CLFdBQXdCO1FBQXhCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQzFDLElBQUksQ0FBQyxNQUFNLEdBQUc7WUFDWjtnQkFDRSxHQUFHLEVBQUUsWUFBWTtnQkFDakIsSUFBSSxFQUFFLEtBQUs7YUFDZTtZQUM1QjtnQkFDRSxHQUFHLEVBQUUsWUFBWTtnQkFDakIsSUFBSSxFQUFFLEtBQUs7YUFDZTtTQUM3QixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUTtRQUNOLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNoQixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFhLENBQUMsQ0FBQztRQUV4RixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVsRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQ7O09BRUc7SUFDSyxhQUFhO1FBQ25CLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBRWhCLE1BQU0sVUFBVSxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyRSxVQUFVLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUM5QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUU1QixNQUFNLFVBQVUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckUsVUFBVSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFNUIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUNoQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZO1FBQ1YsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzlGLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUM5QixvQkFBb0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7T0FFRztJQUNLLElBQUk7UUFDVixJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxPQUFPO1FBQ1osSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLHFCQUFxQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBeUIsQ0FBQyxDQUFDO0lBQzFGLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsWUFBWSxDQUFDLEdBQVc7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQzdCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNaLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBeUIsRUFBRSxFQUFFO1lBQzNDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUE4QixFQUFFLE1BQWMsRUFBRSxFQUFFO1lBQ2pFLElBQUksR0FBRyxLQUFLLEtBQUssQ0FBQyxHQUFHLEVBQUU7Z0JBQ3JCLEtBQUssR0FBRyxNQUFNLENBQUM7YUFDaEI7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQzs7MEdBcklVLGFBQWE7OEZBQWIsYUFBYSxvS0NsQjFCLDhmQWNBOzJGRElhLGFBQWE7a0JBTHpCLFNBQVM7K0JBQ0UsZUFBZTtrR0FTekIsTUFBTTtzQkFETCxTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgRWxlbWVudFJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBHYW1lU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2UvZ2FtZS5zZXJ2aWNlJztcbmltcG9ydCB7IEFzc2V0Q29uZmlndXJhdGlvbk1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXNzZXQtY29uZmlndXJhdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBQcmlzbUJhc2VDbGFzcyB9IGZyb20gJy4uL3ByaXNtLWJhc2UvcHJpc20tYmFzZS5jbGFzcyc7XG5pbXBvcnQgeyBBbGllbkJhc2VDbGFzcyB9IGZyb20gJy4uL2FsaWVuLWJhc2UvYWxpZW4tYmFzZS5jbGFzcyc7XG5pbXBvcnQgeyBCYXNlQ2xhc3MgfSBmcm9tICcuLi9iYXNlLmNsYXNzJztcbmltcG9ydCB7IEJMT0NLX1NJWkUgfSBmcm9tICcuLi8uLi9nYW1lYm9hcmQvZ2FtZWJvYXJkLWNvbnN0YW50cyc7XG5pbXBvcnQgeyBBc3NldEFsaWduRW51bSB9IGZyb20gJy4uLy4uL2Fzc2V0L2VudW0vYXNzZXQtYWxpZ24uZW51bSc7XG5pbXBvcnQgeyBBc3NldEFsaWduVmVydGljYWxFbnVtIH0gZnJvbSAnLi4vLi4vYXNzZXQvZW51bS9hc3NldC1hbGlnbi12ZXJ0aWNhbC5lbnVtJztcblxuLyoqXG4gKiBUaGUgUHJpc20gQmFzZSBDb21wb25lbnRcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYnAtcHJpc20tYmFzZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9iYXNlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYmFzZS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAvKipcbiAgICogVGhlIGNhbnZhc1xuICAgKi9cbiAgQFZpZXdDaGlsZCgnYm9hcmQnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBjYW52YXM6IEVsZW1lbnRSZWY8SFRNTENhbnZhc0VsZW1lbnQ+O1xuXG4gIC8qKlxuICAgKiBDVFNcbiAgICovXG4gIHByaXZhdGUgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG5cbiAgLyoqXG4gICAqIHJlcXVlc3QgSWRcbiAgICovXG4gIHByaXZhdGUgcmVxdWVzdElkOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEJhc2VzXG4gICAqL1xuICBwcml2YXRlIGJhc2VzOiBCYXNlQ2xhc3NbXTtcblxuICAvKipcbiAgICogVGhlIEJhc2VcbiAgICovXG4gIHByaXZhdGUgYmFzZTogQmFzZUNsYXNzO1xuXG4gIC8qKlxuICAgKiBEZWJ1ZyBBc3NldHNcbiAgICovXG4gIHB1YmxpYyBhc3NldHM6IEFzc2V0Q29uZmlndXJhdGlvbk1vZGVsW107XG4gIC8qKlxuICAgKiBHYW1lYm9hcmRcbiAgICovXG4gIHByaXZhdGUgZ2FtZUJvYXJkOiBudW1iZXJbXVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgQ29uc3RydWN0b3JcbiAgICogQHBhcmFtIGdhbWVTZXJ2aWNlIFRoZSBHYW1lU2VydmljZSBmcm9tIERJXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGdhbWVTZXJ2aWNlOiBHYW1lU2VydmljZSkge1xuICAgIHRoaXMuYXNzZXRzID0gW1xuICAgICAge1xuICAgICAgICBrZXk6ICdwcmlzbUJhc2UxJyxcbiAgICAgICAgbmFtZTogJ0ItMSdcbiAgICAgIH0gYXMgQXNzZXRDb25maWd1cmF0aW9uTW9kZWwsXG4gICAgICB7XG4gICAgICAgIGtleTogJ2FsaWVuQmFzZTEnLFxuICAgICAgICBuYW1lOiAnQS0xJ1xuICAgICAgfSBhcyBBc3NldENvbmZpZ3VyYXRpb25Nb2RlbFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogT24gSW5pdFxuICAgKi9cbiAgbmdPbkluaXQoKSB7XG4gICAgY29uc3Qgcm93cyA9IDMxO1xuICAgIGNvbnN0IGNvbHVtbnMgPSAzMTtcbiAgICB0aGlzLmdhbWVCb2FyZCA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHJvd3MgfSwgKCkgPT4gQXJyYXkoY29sdW1ucykuZmlsbCgwKSBhcyBudW1iZXJbXSk7XG5cbiAgICB0aGlzLmN0eCA9IHRoaXMuZ2FtZVNlcnZpY2UuaW5pdEJvYXJkKHRoaXMuY2FudmFzLCByb3dzLCBjb2x1bW5zLCBCTE9DS19TSVpFICogNSwgdGhpcy5nYW1lQm9hcmQpO1xuXG4gICAgdGhpcy5hZGRQcmlzbUJhc2VzKCk7XG4gICAgdGhpcy5hbmltYXRlKCk7XG4gICAgdGhpcy5iYXNlLmFuaW1hdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdGhlIHByaXNtQmFzZXNcbiAgICovXG4gIHByaXZhdGUgYWRkUHJpc21CYXNlcygpOiB2b2lkIHtcbiAgICB0aGlzLmJhc2VzID0gW107XG5cbiAgICBjb25zdCBwcmlzbUJhc2UxID0gbmV3IFByaXNtQmFzZUNsYXNzKHRoaXMuZ2FtZVNlcnZpY2UsIHRoaXMuY3R4LCAxKTtcbiAgICBwcmlzbUJhc2UxLmlzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICB0aGlzLmJhc2VzLnB1c2gocHJpc21CYXNlMSk7XG5cbiAgICBjb25zdCBwcmlzbUJhc2UyID0gbmV3IEFsaWVuQmFzZUNsYXNzKHRoaXMuZ2FtZVNlcnZpY2UsIHRoaXMuY3R4LCAxKTtcbiAgICBwcmlzbUJhc2UyLmlzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICB0aGlzLmJhc2VzLnB1c2gocHJpc21CYXNlMik7XG5cbiAgICB0aGlzLmJhc2UgPSB0aGlzLmJhc2VzWzBdO1xuICAgIHRoaXMuYmFzZS5pc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuaW1hdGUgdGhlIG9iamVjdCBvbmNlXG4gICAqL1xuICBhbmltYXRlQXNzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5iYXNlLm1vdmUodGhpcy5iYXNlLnBvc2l0aW9uQXNzZXQoQXNzZXRBbGlnbkVudW0uY2VudGVyLCBBc3NldEFsaWduVmVydGljYWxFbnVtLm1pZGRsZSkpO1xuICAgIHRoaXMuYmFzZS5pc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMucmVxdWVzdElkKTtcbiAgICB0aGlzLmFuaW1hdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3IHRoZSBib2FyZFxuICAgKi9cbiAgcHJpdmF0ZSBkcmF3KCkge1xuICAgIHRoaXMuY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLmN0eC5jYW52YXMud2lkdGgsIHRoaXMuY3R4LmNhbnZhcy5oZWlnaHQpO1xuICAgIHRoaXMuZ2FtZVNlcnZpY2UuYWRkT3V0bGluZXModGhpcy5jdHgsIDEsIDAuMSk7XG4gIH1cblxuICAvKipcbiAgICogQW5pbWF0ZVxuICAgKi9cbiAgcHVibGljIGFuaW1hdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kcmF3KCk7XG4gICAgdGhpcy5iYXNlLmFuaW1hdGUoKTtcbiAgICB0aGlzLnJlcXVlc3RJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGUuYmluZCh0aGlzKSBhcyBGcmFtZVJlcXVlc3RDYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogdG9nZ2xlQXNzZXRzXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgVGhlIGFzc2V0IHRvIGRpc3BsYXlcbiAgICovXG4gIHRvZ2dsZUFzc2V0cyhrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuYmFzZS5pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgdGhpcy5kcmF3KCk7XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICB0aGlzLmJhc2VzLm1hcCgocHJpc21CYXNlOiBQcmlzbUJhc2VDbGFzcykgPT4ge1xuICAgICAgcHJpc21CYXNlLmlzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICB9KTtcbiAgICB0aGlzLmFzc2V0cy5tYXAoKGFzc2V0OiBBc3NldENvbmZpZ3VyYXRpb25Nb2RlbCwgJGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGlmIChrZXkgPT09IGFzc2V0LmtleSkge1xuICAgICAgICBpbmRleCA9ICRpbmRleDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuYmFzZSA9IHRoaXMuYmFzZXNbaW5kZXhdO1xuICAgIHRoaXMuYW5pbWF0ZUFzc2V0KCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJnYW1lLWNvbnRhaW5lclwiPlxuICA8ZGl2IGNsYXNzPVwiYXNzZXQtdGl0bGVcIj5QcmlzbSBCYXNlPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJnYW1lLWJvYXJkLWNvbnRhaW5lclwiPlxuICAgIDxjYW52YXMgI2JvYXJkIGNsYXNzPVwiZ2FtZS1ib2FyZFwiPjwvY2FudmFzPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImJ1dHRvbi1jb250YWluZXJcIj5cbiAgICA8YnV0dG9uIChjbGljayk9XCJhbmltYXRlQXNzZXQoKVwiIGNsYXNzPVwiYW5pbWF0aW9uLWJ1dHRvbiBidXR0b25cIj5BbmltYXRlPC9idXR0b24+XG4gICAgPGRpdiAqbmdGb3I9XCJsZXQgYXNzZXQgb2YgYXNzZXRzXCI+XG4gICAgICA8YnV0dG9uIChjbGljayk9XCJ0b2dnbGVBc3NldHMoYXNzZXQua2V5KVwiIGNsYXNzPVwiYW5pbWF0aW9uLWJ1dHRvbiBidXR0b25cIj5cbiAgICAgICAge3sgYXNzZXQubmFtZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=