UNPKG

bp-space-invaders

Version:
288 lines 59.5 kB
import { Component, ViewChild, ElementRef, HostListener } from '@angular/core'; import { COLS, BLOCK_SIZE, ROWS, LEVELSPEED, LEVELHEIGHT, MOON_HEIGHT } from './gameboard-constants'; import { GameService } from '../service/game.service'; import { ObservableTypeEnum } from '../enum/observable-type.enum'; import { TextService } from '../service/text.service'; import { GameCookieService } from '../service/game-cookie.service'; import { InvasionService } from '../service/invasion.service'; import { MoonService } from '../service/moon.service'; import { MoonDefenseService } from '../service/moon-defense.service'; import { SpaceshipService } from '../service/spaceship.service'; import { ProjectileService } from '../service/projectile.service'; import * as i0 from "@angular/core"; import * as i1 from "../service/game-cookie.service"; import * as i2 from "../service/game.service"; import * as i3 from "@angular/common"; export class GameboardComponent { constructor(gameCookieService, gameService) { this.gameCookieService = gameCookieService; this.gameService = gameService; this.isDisplayGrid = false; const gameData = this.gameCookieService.getGameData(); this.highScore = gameData.highScore; } ngOnInit() { this.gameStarted = false; this.ctx = this.gameService.initBoard(this.canvas, COLS, ROWS, BLOCK_SIZE); this.moonService = new MoonService(this.ctx, { x: 0, y: ROWS - MOON_HEIGHT * 2, height: MOON_HEIGHT, width: COLS }); this.spaceshipService = new SpaceshipService(this.gameService, this.ctx, { x: this.moonService.getMoonLeftBoundary(), y: 0, height: this.moonService.getMoonTop(), width: this.moonService.getMoonRightBoundary() }); const boundary = { x: 0, y: 0, height: this.moonService.getMoonTop(), width: COLS }; this.moonDefenseService = new MoonDefenseService(this.gameService, this.ctx, boundary); this.projectileService = new ProjectileService(this.gameService, this.ctx, boundary); this.textService = new TextService(this.gameService, this.ctx, { x: 0, y: 0, height: LEVELHEIGHT[0], width: COLS }); this.invasionService = new InvasionService(this.gameService, this.ctx, { x: 0, y: 0, height: this.moonService.getMoonTop(), width: COLS }); this.gameService.getMasterObservable().subscribe((resultModel) => { if (resultModel.type === ObservableTypeEnum.alienBossDestroyed) { this.calculateScore(resultModel.pointData); } else if (resultModel.type === ObservableTypeEnum.alienDestroyed) { this.calculateScore(resultModel.pointData); if (this.invasionService.aliensDestroyed()) { setTimeout(() => { this.nextLevel(); }, 1000); } } else if (resultModel.type === ObservableTypeEnum.spaceshipDestroyed) { this.gameOver(false); } }); this.resetGame(); this.startAllAnimation(); } calculateScore(score) { this.points += score; if (this.points > this.highScore) { this.highScore = this.points; this.textService.setHighScore(this.highScore); } this.textService.setScore(this.points); } setGameBoard(isReset) { this.invasionService.setupInvasion(LEVELHEIGHT[this.creepLevel]); this.spaceshipService.setupSpaceships(); this.moonDefenseService.setupMoonBase(isReset, this.spaceshipService.getSpaceshipYPosition()); } splat() { if (this.invasionService.splat()) { this.gameOver(true); } } evaluateDamage() { this.projectileService.getActiveBombs().map((bomb) => { this.spaceshipService.isHit(bomb); this.moonDefenseService.getActiveMoonBases().map((moonDefense) => { moonDefense.isHitBomb(bomb); }); }); this.projectileService.getActiveMissiles().map((missile) => { this.invasionService.getAllActiveAliens().map((alien) => { alien.isHit(missile); }); this.moonDefenseService.getActiveMoonBases().map((moonDefense) => { moonDefense.isHitMissile(missile); }); }); if (this.invasionService.increaseInvasionSpeed(this.creepSpeed)) { this.creepSpeedLevel = LEVELSPEED[this.creepSpeed++]; } } startAllAnimation() { this.draw(); this.invasionService.animate(0, 1); this.moonDefenseService.animate(); this.spaceshipService.animate(); this.textService.animate(); } animate(now = 0) { this.evaluateDamage(); this.splat(); if (this.isGameOver || this.isGamePaused) { return; } this.draw(); this.invasionService.animate(now, this.creepSpeedLevel); this.moonDefenseService.animate(); this.projectileService.animate(now); this.spaceshipService.animate(now); this.textService.animate(); this.requestId = requestAnimationFrame(this.animate.bind(this)); } lifeLost() { this.pauseGame('READY ?', 17); setTimeout(() => { this.removeWeapons(); this.pauseGame('', 0); }, 2000); } gameOver(isReset = false) { this.lives += isReset ? 3 : 1; if (this.points >= this.highScore) { this.gameCookieService.setGameData({ highScore: this.highScore }); } if (this.lives < 3) { this.lifeLost(); } else { this.removeWeapons(); setTimeout(() => { this.isGameOver = true; this.gameStarted = false; this.gameService.emitMasterObservableEvent({ type: ObservableTypeEnum.gameStarted, booleanData: false }); cancelAnimationFrame(this.requestId); this.gameService.emitMasterObservableEvent({ type: ObservableTypeEnum.gameOver, booleanData: true }); this.textService.displayText('GAME OVER', 'red', 5); }, 250); } } draw() { this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height); if (this.isDisplayGrid) { this.gameService.addOutlines(this.ctx, 20, 0.2); } this.moonService.animate(); } handleEventListeners(type, code) { if (this.gameStarted && !this.isGamePaused) { this.gameService.emitMasterObservableEvent({ type, stringData: code }); } } keyDownEvent(event) { event.preventDefault(); this.handleEventListeners(ObservableTypeEnum.keyDownEvent, event.code); } keyUpEvent(event) { event.preventDefault(); this.handleEventListeners(ObservableTypeEnum.keyUpEvent, event.code); } play() { this.gameStarted = true; this.gameService.emitMasterObservableEvent({ type: ObservableTypeEnum.gameStarted, booleanData: true }); this.gameService.emitMasterObservableEvent({ type: ObservableTypeEnum.gameOver, booleanData: false }); this.resetGame(); if (this.requestId) { cancelAnimationFrame(this.requestId); } this.animate(); } newLevelSetup(isReset = false) { if (this.creepLevel < 8) { this.creepLevel++; } this.creepSpeed = 0; this.creepSpeedLevel = LEVELSPEED[this.creepSpeed++]; this.invasionService.resetAlienCreep(); this.setGameBoard(isReset); if (this.creepLevel > 4) { this.gameService.emitMasterObservableEvent({ type: ObservableTypeEnum.alienDrop, numberData: ROWS * BLOCK_SIZE }); } } removeWeapons() { this.projectileService.removeProjectiles(); } nextLevel() { this.gameLevel++; this.pauseGame('LEVEL UP', 12); setTimeout(() => { this.removeWeapons(); this.newLevelSetup(); this.pauseGame('', 0); }, 2000); } resetGame() { this.lives = 0; this.creepLevel = -1; this.points = 0; this.gameLevel = 1; this.textService.setScore(this.points); this.textService.setHighScore(this.highScore); this.isGameOver = false; this.isGamePaused = false; this.spaceshipService.setupSpaceships(); this.newLevelSetup(true); } pauseGame(text, textOffset) { if (this.gameStarted) { this.isGamePaused = !this.isGamePaused; if (this.isGamePaused) { cancelAnimationFrame(this.requestId); this.textService.displayText(text, 'white', textOffset); this.gameService.emitMasterObservableEvent({ type: ObservableTypeEnum.gamePaused, booleanData: true }); } else { this.gameService.emitMasterObservableEvent({ type: ObservableTypeEnum.gamePaused, booleanData: false }); this.animate(); } } } pause() { this.pauseGame('PAUSED', 20); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: GameboardComponent, deps: [{ token: i1.GameCookieService }, { token: i2.GameService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.7", type: GameboardComponent, selector: "bp-gameboard", host: { listeners: { "window:keydown": "keyDownEvent($event)", "window:keyup": "keyUpEvent($event)" } }, viewQueries: [{ propertyName: "canvas", first: true, predicate: ["board"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"game-container\">\n <div class=\"game-board-container\">\n <canvas #board class=\"game-board\"></canvas>\n </div>\n <div class=\"button-container\">\n <button (click)=\"play()\" class=\"play-button button\" *ngIf=\"!gameStarted\">Play</button>\n <button (click)=\"gameOver(true)\" class=\"reset-button button\" *ngIf=\"gameStarted\">Reset</button>\n <button (click)=\"pause()\" class=\"pause-button button\" [class.button-disabled]=\"!gameStarted\">Pause</button>\n </div>\n</div>\n", styles: [".game-container{background-color:#000;padding:10px}.game-container .game-board-container{position:relative;margin:auto;display:flex;flex-direction:row;justify-content:center}.game-container .game-board-container .game-board{background-color:#000}.game-container .button-container{position:relative;margin-top:25px;display:flex;flex-direction:row;justify-content:center}.game-container .button-container .play-button{background-color:#4caf50}.game-container .button-container .reset-button{background-color:red}.game-container .button-container .pause-button{margin-left:25px;background-color:#4caf50}.game-container .button-container .pause-button.button-disabled{background-color:#ccc}.game-container .button-container .button{font-size:16px;font-family:\"Press Start 2P\";padding:15px 30px;cursor:pointer;width:140px;border:1px solid black}\n", "@font-face{font-family:\"Press Start 2P\";src:local(\"Press Start 2P Regular\"),local(\"PressStart2P-Regular\"),url(data:application/font-woff2;charset=utf-8;base64,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) format(\"woff2\");font-weight:400;font-style:normal}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: GameboardComponent, decorators: [{ type: Component, args: [{ selector: 'bp-gameboard', template: "<div class=\"game-container\">\n <div class=\"game-board-container\">\n <canvas #board class=\"game-board\"></canvas>\n </div>\n <div class=\"button-container\">\n <button (click)=\"play()\" class=\"play-button button\" *ngIf=\"!gameStarted\">Play</button>\n <button (click)=\"gameOver(true)\" class=\"reset-button button\" *ngIf=\"gameStarted\">Reset</button>\n <button (click)=\"pause()\" class=\"pause-button button\" [class.button-disabled]=\"!gameStarted\">Pause</button>\n </div>\n</div>\n", styles: [".game-container{background-color:#000;padding:10px}.game-container .game-board-container{position:relative;margin:auto;display:flex;flex-direction:row;justify-content:center}.game-container .game-board-container .game-board{background-color:#000}.game-container .button-container{position:relative;margin-top:25px;display:flex;flex-direction:row;justify-content:center}.game-container .button-container .play-button{background-color:#4caf50}.game-container .button-container .reset-button{background-color:red}.game-container .button-container .pause-button{margin-left:25px;background-color:#4caf50}.game-container .button-container .pause-button.button-disabled{background-color:#ccc}.game-container .button-container .button{font-size:16px;font-family:\"Press Start 2P\";padding:15px 30px;cursor:pointer;width:140px;border:1px solid black}\n", "@font-face{font-family:\"Press Start 2P\";src:local(\"Press Start 2P Regular\"),local(\"PressStart2P-Regular\"),url(data:application/font-woff2;charset=utf-8;base64,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) format(\"woff2\");font-weight:400;font-style:normal}\n"] }] }], ctorParameters: () => [{ type: i1.GameCookieService }, { type: i2.GameService }], propDecorators: { canvas: [{ type: ViewChild, args: ['board', { static: true }] }], keyDownEvent: [{ type: HostListener, args: ['window:keydown', ['$event']] }], keyUpEvent: [{ type: HostListener, args: ['window:keyup', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FtZWJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwYWNlLWludmFkZXJzL3NyYy9saWIvZ2FtZWJvYXJkL2dhbWVib2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGFjZS1pbnZhZGVycy9zcmMvbGliL2dhbWVib2FyZC9nYW1lYm9hcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFVLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RixPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHdEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFJbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRW5FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUU5RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDckUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7Ozs7O0FBVWxFLE1BQU0sT0FBTyxrQkFBa0I7SUE2RjdCLFlBQW9CLGlCQUFvQyxFQUFVLFdBQXdCO1FBQXRFLHNCQUFpQixHQUFqQixp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QyxXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQ3hELElBQUksQ0FBQyxXQUFXLENBQUMseUJBQXlCLENBQUM7b0JBQ3pDLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxVQUFVO29CQUNuQyxXQUFXLEVBQUUsSUFBSTtpQkFDQyxDQUFDLENBQUM7YUFDdkI7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQztvQkFDekMsSUFBSSxFQUFFLGtCQUFrQixDQUFDLFVBQVU7b0JBQ25DLFdBQVcsRUFBRSxLQUFLO2lCQUNBLENBQUMsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ2hCO1NBQ0Y7SUFDSCxDQUFDO0lBS0QsS0FBSztRQUNILElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQy9CLENBQUM7OEdBN2ZVLGtCQUFrQjtrR0FBbEIsa0JBQWtCLDRRQzNCL0IsaWdCQVVBOzsyRkRpQmEsa0JBQWtCO2tCQUw5QixTQUFTOytCQUNFLGNBQWM7Z0hBYXhCLE1BQU07c0JBREwsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQXlXcEMsWUFBWTtzQkFEWCxZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVkxQyxVQUFVO3NCQURULFlBQVk7dUJBQUMsY0FBYyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIE9uSW5pdCwgSG9zdExpc3RlbmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDT0xTLCBCTE9DS19TSVpFLCBST1dTLCBMRVZFTFNQRUVELCBMRVZFTEhFSUdIVCwgTU9PTl9IRUlHSFQgfSBmcm9tICcuL2dhbWVib2FyZC1jb25zdGFudHMnO1xuaW1wb3J0IHsgR2FtZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL2dhbWUuc2VydmljZSc7XG5pbXBvcnQgeyBNaXNzaWxlQ2xhc3MgfSBmcm9tICcuLi9taXNzaWxlL21pc3NpbGUvbWlzc2lsZS5jbGFzcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlTW9kZWwgfSBmcm9tICcuLi9tb2RlbC9vYnNlcnZhYmxlLm1vZGVsJztcbmltcG9ydCB7IE9ic2VydmFibGVUeXBlRW51bSB9IGZyb20gJy4uL2VudW0vb2JzZXJ2YWJsZS10eXBlLmVudW0nO1xuaW1wb3J0IHsgQm9tYkNsYXNzIH0gZnJvbSAnLi4vYm9tYi9ib21iLmNsYXNzJztcbmltcG9ydCB7IE1vb25EZWZlbnNlQ2xhc3MgfSBmcm9tICcuLi9tb29uLWRlZmVuc2UvbW9vbi1kZWZlbnNlLmNsYXNzJztcbmltcG9ydCB7IEJvdW5kYXJ5U2V0dXBNb2RlbCB9IGZyb20gJy4uL21vZGVsL2JvdW5kYXJ5LXNldC5tb2RlbCc7XG5pbXBvcnQgeyBUZXh0U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2UvdGV4dC5zZXJ2aWNlJztcbmltcG9ydCB7IEdhbWVDb29raWVTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZS9nYW1lLWNvb2tpZS5zZXJ2aWNlJztcbmltcG9ydCB7IEdhbWVEYXRhTW9kZWwgfSBmcm9tICcuLi9tb2RlbC9nYW1lLWRhdGEubW9kZWwnO1xuaW1wb3J0IHsgSW52YXNpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZS9pbnZhc2lvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEFsaWVuQ2xhc3MgfSBmcm9tICcuLi9hbGllbnMvYWxpZW4vYWxpZW4uY2xhc3MnO1xuaW1wb3J0IHsgTW9vblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL21vb24uc2VydmljZSc7XG5pbXBvcnQgeyBNb29uRGVmZW5zZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL21vb24tZGVmZW5zZS5zZXJ2aWNlJztcbmltcG9ydCB7IFNwYWNlc2hpcFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL3NwYWNlc2hpcC5zZXJ2aWNlJztcbmltcG9ydCB7IFByb2plY3RpbGVTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZS9wcm9qZWN0aWxlLnNlcnZpY2UnO1xuXG4vKipcbiAqIFRoZSBHYW1lYm9hcmQgQ29tcG9uZW50XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2JwLWdhbWVib2FyZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9nYW1lYm9hcmQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9nYW1lYm9hcmQuY29tcG9uZW50LnNjc3MnLCAnLi4vZm9udC9wcmVzcy1zdGFydC0ycC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgR2FtZWJvYXJkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgLyoqXG4gICAqIERpc3BsYXkgR3JpZFxuICAgKi9cbiAgcHJpdmF0ZSBpc0Rpc3BsYXlHcmlkID0gZmFsc2U7XG4gIC8qKlxuICAgKiBUaGUgY2FudmFzXG4gICAqL1xuICBAVmlld0NoaWxkKCdib2FyZCcsIHsgc3RhdGljOiB0cnVlIH0pXG4gIGNhbnZhczogRWxlbWVudFJlZjxIVE1MQ2FudmFzRWxlbWVudD47XG4gIC8qKlxuICAgKiBDYW52YXMgUmVuZGVyaW5nIENvbnRleHQgMkRcbiAgICovXG4gIHByaXZhdGUgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG4gIC8qKlxuICAgKiBUaGUgYW5pbWF0aW9uIHJlcXVlc3QgaWRcbiAgICovXG4gIHByaXZhdGUgcmVxdWVzdElkOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgcG9pbnRzXG4gICAqL1xuICBwcml2YXRlIHBvaW50czogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGhpZ2hzY29yZVxuICAgKi9cbiAgcHJpdmF0ZSBoaWdoU2NvcmU6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBMZXZlbCBEaXNwbGF5XG4gICAqL1xuICBsZXZlbERpc3BsYXk6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBHYW1lIExldmVsXG4gICAqL1xuICBnYW1lTGV2ZWw6IG51bWJlcjtcbiAgLyoqXG4gICAqIElmIHRoZSBnYW1lIGlzIG92ZXdyXG4gICAqL1xuICBwcml2YXRlIGlzR2FtZU92ZXI6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgY3JlZXAgc3BlZWQgbGV2ZWxcbiAgICovXG4gIHByaXZhdGUgY3JlZXBTcGVlZExldmVsOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgY3JlZXAgc3BlZWRcbiAgICovXG4gIHByaXZhdGUgY3JlZXBTcGVlZDogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGNyZWVwIGxldmVsXG4gICAqL1xuICBwcml2YXRlIGNyZWVwTGV2ZWw6IG51bWJlcjtcbiAgLyoqXG4gICAqIFBhdXNlZFxuICAgKi9cbiAgcHJpdmF0ZSBpc0dhbWVQYXVzZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBHYW1lIFN0YXJ0ZWQ7XG4gICAqL1xuICBwdWJsaWMgZ2FtZVN0YXJ0ZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBsaXZlc1xuICAgKi9cbiAgcHJpdmF0ZSBsaXZlczogbnVtYmVyO1xuICAvKipcbiAgICogdGV4dCBjbGFzc1xuICAgKi9cbiAgcHJpdmF0ZSB0ZXh0U2VydmljZTogVGV4dFNlcnZpY2U7XG4gIC8qKlxuICAgKiBJbnZhc2lvbiBTZXJ2aWNlXG4gICAqL1xuICBwcml2YXRlIGludmFzaW9uU2VydmljZTogSW52YXNpb25TZXJ2aWNlO1xuICAvKipcbiAgICogTW9vbiBTZXJ2aWNlXG4gICAqL1xuICBwcml2YXRlIG1vb25TZXJ2aWNlOiBNb29uU2VydmljZTtcbiAgLyoqXG4gICAqIE1vb24gRGVmZW5zZSBTZXJ2aWNlXG4gICAqL1xuICBwcml2YXRlIG1vb25EZWZlbnNlU2VydmljZTogTW9vbkRlZmVuc2VTZXJ2aWNlO1xuICAvKipcbiAgICogU3BhY2VzaGlwIFNlcnZpY2VcbiAgICovXG4gIHByaXZhdGUgc3BhY2VzaGlwU2VydmljZTogU3BhY2VzaGlwU2VydmljZTtcbiAgLyoqXG4gICAqIFByb2plY3RpbGUgU2VydmljZVxuICAgKi9cbiAgcHJpdmF0ZSBwcm9qZWN0aWxlU2VydmljZTogUHJvamVjdGlsZVNlcnZpY2U7XG5cbiAgLyoqXG4gICAqIFRoZSBDb25zdHJ1Y3RvclxuICAgKlxuICAgKiBAcGFyYW0gZ2FtZUNvb2tpZVNlcnZpY2UgVGhlIEdhbWUgQ29va2llIFNlcnZpY2UgZnJvbSBESVxuICAgKiBAcGFyYW0gZ2FtZVNlcnZpY2UgVGhlIEdhbWUgU2VydmljZSBmcm9tIERJXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGdhbWVDb29raWVTZXJ2aWNlOiBHYW1lQ29va2llU2VydmljZSwgcHJpdmF0ZSBnYW1lU2VydmljZTogR2FtZVNlcnZpY2UpIHtcbiAgICBjb25zdCBnYW1lRGF0YSA9IHRoaXMuZ2FtZUNvb2tpZVNlcnZpY2UuZ2V0R2FtZURhdGEoKTtcbiAgICB0aGlzLmhpZ2hTY29yZSA9IGdhbWVEYXRhLmhpZ2hTY29yZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBJbml0XG4gICAqL1xuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmdhbWVTdGFydGVkID0gZmFsc2U7XG4gICAgdGhpcy5jdHggPSB0aGlzLmdhbWVTZXJ2aWNlLmluaXRCb2FyZCh0aGlzLmNhbnZhcywgQ09MUywgUk9XUywgQkxPQ0tfU0laRSk7XG5cbiAgICB0aGlzLm1vb25TZXJ2aWNlID0gbmV3IE1vb25TZXJ2aWNlKHRoaXMuY3R4LCB7XG4gICAgICB4OiAwLFxuICAgICAgeTogUk9XUyAtIE1PT05fSEVJR0hUICogMixcbiAgICAgIGhlaWdodDogTU9PTl9IRUlHSFQsXG4gICAgICB3aWR0aDogQ09MU1xuICAgIH0gYXMgQm91bmRhcnlTZXR1cE1vZGVsKTtcblxuICAgIHRoaXMuc3BhY2VzaGlwU2VydmljZSA9IG5ldyBTcGFjZXNoaXBTZXJ2aWNlKHRoaXMuZ2FtZVNlcnZpY2UsIHRoaXMuY3R4LCB7XG4gICAgICB4OiB0aGlzLm1vb25TZXJ2aWNlLmdldE1vb25MZWZ0Qm91bmRhcnkoKSxcbiAgICAgIHk6IDAsXG4gICAgICBoZWlnaHQ6IHRoaXMubW9vblNlcnZpY2UuZ2V0TW9vblRvcCgpLFxuICAgICAgd2lkdGg6IHRoaXMubW9vblNlcnZpY2UuZ2V0TW9vblJpZ2h0Qm91bmRhcnkoKVxuICAgIH0gYXMgQm91bmRhcnlTZXR1cE1vZGVsKTtcblxuICAgIGNvbnN0IGJvdW5kYXJ5ID0ge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDAsXG4gICAgICBoZWlnaHQ6IHRoaXMubW9vblNlcnZpY2UuZ2V0TW9vblRvcCgpLFxuICAgICAgd2lkdGg6IENPTFNcbiAgICB9IGFzIEJvdW5kYXJ5U2V0dXBNb2RlbDtcblxuICAgIHRoaXMubW9vbkRlZmVuc2VTZXJ2aWNlID0gbmV3IE1vb25EZWZlbnNlU2VydmljZSh0aGlzLmdhbWVTZXJ2aWNlLCB0aGlzLmN0eCwgYm91bmRhcnkpO1xuXG4gICAgdGhpcy5wcm9qZWN0aWxlU2VydmljZSA9IG5ldyBQcm9qZWN0aWxlU2VydmljZSh0aGlzLmdhbWVTZXJ2aWNlLCB0aGlzLmN0eCwgYm91bmRhcnkpO1xuXG4gICAgdGhpcy50ZXh0U2VydmljZSA9IG5ldyBUZXh0U2VydmljZSh0aGlzLmdhbWVTZXJ2aWNlLCB0aGlzLmN0eCwge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDAsXG4gICAgICBoZWlnaHQ6IExFVkVMSEVJR0hUWzBdLFxuICAgICAgd2lkdGg6IENPTFNcbiAgICB9IGFzIEJvdW5kYXJ5U2V0dXBNb2RlbCk7XG5cbiAgICB0aGlzLmludmFzaW9uU2VydmljZSA9IG5ldyBJbnZhc2lvblNlcnZpY2UodGhpcy5nYW1lU2VydmljZSwgdGhpcy5jdHgsIHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwLFxuICAgICAgaGVpZ2h0OiB0aGlzLm1vb25TZXJ2aWNlLmdldE1vb25Ub3AoKSxcbiAgICAgIHdpZHRoOiBDT0xTXG4gICAgfSBhcyBCb3VuZGFyeVNldHVwTW9kZWwpO1xuXG4gICAgdGhpcy5nYW1lU2VydmljZS5nZXRNYXN0ZXJPYnNlcnZhYmxlKCkuc3Vic2NyaWJlKChyZXN1bHRNb2RlbDogT2JzZXJ2YWJsZU1vZGVsKSA9PiB7XG4gICAgICBpZiAocmVzdWx0TW9kZWwudHlwZSA9PT0gT2JzZXJ2YWJsZVR5cGVFbnVtLmFsaWVuQm9zc0Rlc3Ryb3llZCkge1xuICAgICAgICB0aGlzLmNhbGN1bGF0ZVNjb3JlKHJlc3VsdE1vZGVsLnBvaW50RGF0YSk7XG4gICAgICB9IGVsc2UgaWYgKHJlc3VsdE1vZGVsLnR5cGUgPT09IE9ic2VydmFibGVUeXBlRW51bS5hbGllbkRlc3Ryb3llZCkge1xuICAgICAgICB0aGlzLmNhbGN1bGF0ZVNjb3JlKHJlc3VsdE1vZGVsLnBvaW50RGF0YSk7XG4gICAgICAgIGlmICh0aGlzLmludmFzaW9uU2VydmljZS5hbGllbnNEZXN0cm95ZWQoKSkge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5uZXh0TGV2ZWwoKTtcbiAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChyZXN1bHRNb2RlbC50eXBlID09PSBPYnNlcnZhYmxlVHlwZUVudW0uc3BhY2VzaGlwRGVzdHJveWVkKSB7XG4gICAgICAgIHRoaXMuZ2FtZU92ZXIoZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5yZXNldEdhbWUoKTtcbiAgICB0aGlzLnN0YXJ0QWxsQW5pbWF0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGUgdGhlIHNjb3JlXG4gICAqXG4gICAqIEBwYXJhbSBzY29yZSBUaGUgY3VycmVudCBzY29yZVxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVTY29yZShzY29yZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5wb2ludHMgKz0gc2NvcmU7XG4gICAgaWYgKHRoaXMucG9pbnRzID4gdGhpcy5oaWdoU2NvcmUpIHtcbiAgICAgIHRoaXMuaGlnaFNjb3JlID0gdGhpcy5wb2ludHM7XG4gICAgICB0aGlzLnRleHRTZXJ2aWNlLnNldEhpZ2hTY29yZSh0aGlzLmhpZ2hTY29yZSk7XG4gICAgfVxuICAgIHRoaXMudGV4dFNlcnZpY2Uuc2V0U2NvcmUodGhpcy5wb2ludHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgaW5pdGlhbCBnYW1lIGJvYXJkXG4gICAqXG4gICAqIEBwYXJhbSBpc1Jlc2V0IGlmIHRoZSBnYW1lIGlzIHJlc2V0aW5nXG4gICAqL1xuICBwcml2YXRlIHNldEdhbWVCb2FyZChpc1Jlc2V0OiBib29sZWFuKTogdm9pZCB7XG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICovXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMuaW52YXNpb25TZXJ2aWNlLnNldHVwSW52YXNpb24oTEVWRUxIRUlHSFRbdGhpcy5jcmVlcExldmVsXSBhcyBudW1iZXIpO1xuICAgIHRoaXMuc3BhY2VzaGlwU2VydmljZS5zZXR1cFNwYWNlc2hpcHMoKTtcbiAgICB0aGlzLm1vb25EZWZlbnNlU2VydmljZS5zZXR1cE1vb25CYXNlKGlzUmVzZXQsIHRoaXMuc3BhY2VzaGlwU2VydmljZS5nZXRTcGFjZXNoaXBZUG9zaXRpb24oKSk7XG4gIH1cblxuICAvKipcbiAgICogUGFkIHRoZSBsZXZlbFxuICAgKlxuICAgKi9cbiAgLypcbiAgcHJpdmF0ZSBwYWRMZXZlbCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmdhbWVMZXZlbCA8IDEwKSB7XG4gICAgICByZXR1cm4gYEwwJHt0aGlzLmdhbWVMZXZlbH1gO1xuICAgIH1cblxuICAgIHJldHVybiBgTCR7dGhpcy5nYW1lTGV2ZWwudG9TdHJpbmcoKX1gO1xuICB9XG4gICovXG5cbiAgLyoqXG4gICAqIFRoZSBhbGllbnMgaGF2ZSBoaXQgdGhlIGJvdHRvbVxuICAgKi9cbiAgcHJpdmF0ZSBzcGxhdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbnZhc2lvblNlcnZpY2Uuc3BsYXQoKSkge1xuICAgICAgdGhpcy5nYW1lT3Zlcih0cnVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGUgYW55IGRhbWFnZVxuICAgKi9cbiAgcHJpdmF0ZSBldmFsdWF0ZURhbWFnZSgpOiB2b2lkIHtcbiAgICB0aGlzLnByb2plY3RpbGVTZXJ2aWNlLmdldEFjdGl2ZUJvbWJzKCkubWFwKChib21iOiBCb21iQ2xhc3MpID0+IHtcbiAgICAgIHRoaXMuc3BhY2VzaGlwU2VydmljZS5pc0hpdChib21iKTtcbiAgICAgIHRoaXMubW9vbkRlZmVuc2VTZXJ2aWNlLmdldEFjdGl2ZU1vb25CYXNlcygpLm1hcCgobW9vbkRlZmVuc2U6IE1vb25EZWZlbnNlQ2xhc3MpID0+IHtcbiAgICAgICAgbW9vbkRlZmVuc2UuaXNIaXRCb21iKGJvbWIpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnByb2plY3RpbGVTZXJ2aWNlLmdldEFjdGl2ZU1pc3NpbGVzKCkubWFwKChtaXNzaWxlOiBNaXNzaWxlQ2xhc3MpID0+IHtcbiAgICAgIHRoaXMuaW52YXNpb25TZXJ2aWNlLmdldEFsbEFjdGl2ZUFsaWVucygpLm1hcCgoYWxpZW46IEFsaWVuQ2xhc3MpID0+IHtcbiAgICAgICAgYWxpZW4uaXNIaXQobWlzc2lsZSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5tb29uRGVmZW5zZVNlcnZpY2UuZ2V0QWN0aXZlTW9vbkJhc2VzKCkubWFwKChtb29uRGVmZW5zZTogTW9vbkRlZmVuc2VDbGFzc