UNPKG

bp-prism-game

Version:
165 lines 20.4 kB
import { SceneryClass } from '../scenery.class'; import { ImageLoadedEnum } from '../../enum/image-loaded.enum'; import { GameAssetEnum } from '../../enum/game-assets.enum'; /** * The Water Class */ export class WaterClass extends SceneryClass { /** * Constructor * @param gameService The GameService * @param ctx The ctx * @param guid The guid of the alien * @param imageType The type of water */ constructor(gameService, ctx, guid, imageType) { super(gameService, ctx, guid, imageType); /** * The scale ranges */ this.scaleRanges = [0.014, 0.016, 0.021]; this.type = GameAssetEnum.water; this.waveImages = []; this.animationTimers = []; this.animationTimers.push(Math.random() * 750 + 250); this.animationTimers.push(Math.random() * 1000 + 250); this.assetTimers = []; this.assetTimers.push({ start: performance.now(), elapsed: 0 }); this.assetTimers.push({ start: performance.now(), elapsed: 0 }); this.loadWaterImages(imageType); this.assetScale = { x: 0.2, y: 0.2 }; } /** * Get the wave scale */ getWaveScale() { return Math.round((Math.random() * 1.25 + 1) * 10) / 1000; } /** * Get the wave position based on the scale * @param scale The scale of the wave */ getWavePosition(scale) { let multiplier = 85; if (scale > 0 && scale < this.scaleRanges[0]) { multiplier = 225; } else if (scale >= this.scaleRanges[0] && scale < this.scaleRanges[1]) { multiplier = 150; } else if (scale >= this.scaleRanges[1] && scale < this.scaleRanges[2]) { multiplier = 100; } return Math.random() * multiplier + 30; } /** * Configure a wave * @param wave The wave to configure */ waveConfiguration(wave) { const scale = this.getWaveScale(); wave.x = this.getWavePosition(scale); wave.y = this.getWavePosition(scale); wave.scale = scale; return wave; } /** * Load the Water Images * * @param waterImageType The water type */ loadWaterImages(waterImageType) { this.images.push(this.gameService.getImage(waterImageType)); for (let wave = 0; wave < 4; wave++) { this.waveImages.push(this.waveConfiguration({ image: this.gameService.getImage(ImageLoadedEnum.waterWaves) })); } this.isImageLoaded = true; } /** * Draw everything necessary */ draw() { if (this.isImageLoaded) { this.images.map((imageData) => { this.ctx.save(); this.ctx.translate(this.x, this.y); this.ctx.scale(this.assetScale.x, this.assetScale.y); if (imageData.isRotate) { this.ctx.rotate(this.gameService.getRadians(imageData.rotate)); } this.ctx.drawImage(imageData.imageSource, imageData.x, imageData.y); this.ctx.restore(); }); this.waveImages.map((waveData) => { this.ctx.save(); this.ctx.translate(this.x, this.y); this.ctx.scale(waveData.scale, waveData.scale); this.ctx.drawImage(waveData.image.imageSource, // The image waveData.x, // sx Start x clipping waveData.y // sy Start y clipping ); this.ctx.restore(); }); } } /** * Add the wave scale * @param wave The wave */ addWaveScale(wave) { wave.scale += 0.005; return Math.round(wave.scale * 1000) / 1000; } /** * Calculate the X Boundary * @param waveData The wave model */ calculateXBoundary(waveData) { return waveData.scale * waveData.x + waveData.scale * waveData.image.width < 4; } /** * Calculate the Y Boundary * @param waveData The wave model */ calculateYBoundary(waveData) { return waveData.scale * waveData.y + waveData.scale * waveData.image.height < 4; } /** * Validate The Timer * @param now The current animation time * @param index The current timer index */ validateTimer(now, index) { if (this.assetTimers[index].elapsed > this.animationTimers[index]) { this.assetTimers[index].start = now; const timerIndex = index * 2; const timerIndexMax = timerIndex + 2; for (let waveIndex = timerIndex; waveIndex < timerIndexMax; waveIndex++) { const waveData = this.waveImages[waveIndex]; if (this.calculateXBoundary(waveData) && this.calculateYBoundary(waveData)) { waveData.scale = this.addWaveScale(waveData); } else { this.waveConfiguration(waveData); } } } } /** * Animate the Scenery * @param now the current time */ animate(now = 0) { this.assetTimers.map((timer, index) => { timer.elapsed = now - timer.start; this.validateTimer(now, index); }); this.draw(); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0ZXIuY2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcmlzbS9zcmMvbGliL3NjZW5lcnkvd2F0ZXIvd2F0ZXIuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWhELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUEwQjVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFVBQVcsU0FBUSxZQUFZO0lBb0IxQzs7Ozs7O09BTUc7SUFDSCxZQUFZLFdBQXdCLEVBQUUsR0FBNkIsRUFBRSxJQUFZLEVBQUUsU0FBMEI7UUFDM0csS0FBSyxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBdEIzQzs7V0FFRztRQUNLLGdCQUFXLEdBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBcUJwRCxJQUFJLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUM7UUFDaEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFFckIsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBRXRELElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxF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QkFFNUMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxFQUFFO29CQUMxRSxRQUFRLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQzlDO3FCQUFNO29CQUNMLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDbEM7YUFDRjtTQUNGO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNJLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQWlCLEVBQUUsS0FBYSxFQUFFLEVBQUU7WUFDeEQsS0FBSyxDQUFDLE9BQU8sR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUNsQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNkLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEdhbWVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZS9nYW1lLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2NlbmVyeUNsYXNzIH0gZnJvbSAnLi4vc2NlbmVyeS5jbGFzcyc7XG5pbXBvcnQgeyBBc3NldFNjYWxlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hc3NldC1zY2FsZS5tb2RlJztcbmltcG9ydCB7IEltYWdlTG9hZGVkRW51bSB9IGZyb20gJy4uLy4uL2VudW0vaW1hZ2UtbG9hZGVkLmVudW0nO1xuaW1wb3J0IHsgR2FtZUFzc2V0RW51bSB9IGZyb20gJy4uLy4uL2VudW0vZ2FtZS1hc3NldHMuZW51bSc7XG5pbXBvcnQgeyBJbWFnZUxvY2F0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbC9pbWFnZS9pbWFnZS1sb2NhdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBUaW1lck1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWwvdGltZXIubW9kZWwnO1xuXG4vKipcbiAqIFRoZSBXYXZlIG1vZGVsXG4gKi9cbmludGVyZmFjZSBXYXZlTW9kZWwge1xuICAvKipcbiAgICogSW1hZ2UgTG9jYXRpb24gTW9kZWxcbiAgICovXG4gIGltYWdlOiBJbWFnZUxvY2F0aW9uTW9kZWw7XG4gIC8qKlxuICAgKiBYIHBvc2l0aW9uXG4gICAqL1xuICB4OiBudW1iZXI7XG4gIC8qKlxuICAgKiB5IHBvc2l0aW9uXG4gICAqL1xuICB5OiBudW1iZXI7XG4gIC8qKlxuICAgKiBTY2FsZVxuICAgKi9cbiAgc2NhbGU6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgV2F0ZXIgQ2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIFdhdGVyQ2xhc3MgZXh0ZW5kcyBTY2VuZXJ5Q2xhc3Mge1xuICAvKipcbiAgICogVGhlIHdhdGVyIHdhdmVzIGltYWdlXG4gICAqL1xuICBwcml2YXRlIHdhdmVJbWFnZXM6IFdhdmVNb2RlbFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgc2NhbGUgcmFuZ2VzXG4gICAqL1xuICBwcml2YXRlIHNjYWxlUmFuZ2VzOiBudW1iZXJbXSA9IFswLjAxNCwgMC4wMTYsIDAuMDIxXTtcblxuICAvKipcbiAgICogVGhlIGFuaW1hdGlvblRpbWVyIGZvciB0aGUgd2F2ZXNcbiAgICovXG4gIHByaXZhdGUgYW5pbWF0aW9uVGltZXJzOiBudW1iZXJbXTtcbiAgLyoqXG4gICAqIFRoZSBhc3NldFRpbWVzIGZvciB0aGUgd2F2ZXNcbiAgICovXG4gIHByaXZhdGUgYXNzZXRUaW1lcnM6IFRpbWVyTW9kZWxbXTtcblxuICAvKipcbiAgICogQ29uc3RydWN0b3JcbiAgICogQHBhcmFtIGdhbWVTZXJ2aWNlIFRoZSBHYW1lU2VydmljZVxuICAgKiBAcGFyYW0gY3R4IFRoZSBjdHhcbiAgICogQHBhcmFtIGd1aWQgVGhlIGd1aWQgb2YgdGhlIGFsaWVuXG4gICAqIEBwYXJhbSBpbWFnZVR5cGUgVGhlIHR5cGUgb2Ygd2F0ZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yKGdhbWVTZXJ2aWNlOiBHYW1lU2VydmljZSwgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIGd1aWQ6IG51bWJlciwgaW1hZ2VUeXBlOiBJbWFnZUxvYWRlZEVudW0pIHtcbiAgICBzdXBlcihnYW1lU2VydmljZSwgY3R4LCBndWlkLCBpbWFnZVR5cGUpO1xuXG4gICAgdGhpcy50eXBlID0gR2FtZUFzc2V0RW51bS53YXRlcjtcbiAgICB0aGlzLndhdmVJbWFnZXMgPSBbXTtcblxuICAgIHRoaXMuYW5pbWF0aW9uVGltZXJzID0gW107XG4gICAgdGhpcy5hbmltYXRpb25UaW1lcnMucHVzaChNYXRoLnJhbmRvbSgpICogNzUwICsgMjUwKTtcbiAgICB0aGlzLmFuaW1hdGlvblRpbWVycy5wdXNoKE1hdGgucmFuZG9tKCkgKiAxMDAwICsgMjUwKTtcblxuICAgIHRoaXMuYXNzZXRUaW1lcnMgPSBbXTtcbiAgICB0aGlzLmFzc2V0VGltZXJzLnB1c2goeyBzdGFydDogcGVyZm9ybWFuY2Uubm93KCksIGVsYXBzZWQ6IDAgfSBhcyBUaW1lck1vZGVsKTtcbiAgICB0aGlzLmFzc2V0VGltZXJzLnB1c2goeyBzdGFydDogcGVyZm9ybWFuY2Uubm93KCksIGVsYXBzZWQ6IDAgfSBhcyBUaW1lck1vZGVsKTtcblxuICAgIHRoaXMubG9hZFdhdGVySW1hZ2VzKGltYWdlVHlwZSk7XG5cbiAgICB0aGlzLmFzc2V0U2NhbGUgPSB7XG4gICAgICB4OiAwLjIsXG4gICAgICB5OiAwLjJcbiAgICB9IGFzIEFzc2V0U2NhbGVNb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHdhdmUgc2NhbGVcbiAgICovXG4gIHByaXZhdGUgZ2V0V2F2ZVNjYWxlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoKE1hdGgucmFuZG9tKCkgKiAxLjI1ICsgMSkgKiAxMCkgLyAxMDAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgd2F2ZSBwb3NpdGlvbiBiYXNlZCBvbiB0aGUgc2NhbGVcbiAgICogQHBhcmFtIHNjYWxlIFRoZSBzY2FsZSBvZiB0aGUgd2F2ZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRXYXZlUG9zaXRpb24oc2NhbGU6IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IG11bHRpcGxpZXIgPSA4NTtcbiAgICBpZiAoc2NhbGUgPiAwICYmIHNjYWxlIDwgdGhpcy5zY2FsZVJhbmdlc1swXSkge1xuICAgICAgbXVsdGlwbGllciA9IDIyNTtcbiAgICB9IGVsc2UgaWYgKHNjYWxlID49IHRoaXMuc2NhbGVSYW5nZXNbMF0gJiYgc2NhbGUgPCB0aGlzLnNjYWxlUmFuZ2VzWzFdKSB7XG4gICAgICBtdWx0aXBsaWVyID0gMTUwO1xuICAgIH0gZWxzZSBpZiAoc2NhbGUgPj0gdGhpcy5zY2FsZVJhbmdlc1sxXSAmJiBzY2FsZSA8IHRoaXMuc2NhbGVSYW5nZXNbMl0pIHtcbiAgICAgIG11bHRpcGxpZXIgPSAxMDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgKiBtdWx0aXBsaWVyICsgMzA7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlndXJlIGEgd2F2ZVxuICAgKiBAcGFyYW0gd2F2ZSBUaGUgd2F2ZSB0byBjb25maWd1cmVcbiAgICovXG4gIHByaXZhdGUgd2F2ZUNvbmZpZ3VyYXRpb24od2F2ZTogV2F2ZU1vZGVsKTogV2F2ZU1vZGVsIHtcbiAgICBjb25zdCBzY2FsZSA9IHRoaXMuZ2V0V2F2ZVNjYWxlKCk7XG4gICAgd2F2ZS54ID0gdGhpcy5nZXRXYXZlUG9zaXRpb24oc2NhbGUpO1xuICAgIHdhdmUueSA9IHRoaXMuZ2V0V2F2ZVBvc2l0aW9uKHNjYWxlKTtcbiAgICB3YXZlLnNjYWxlID0gc2NhbGU7XG5cbiAgICByZXR1cm4gd2F2ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIHRoZSBXYXRlciBJbWFnZXNcbiAgICpcbiAgICogQHBhcmFtIHdhdGVySW1hZ2VUeXBlIFRoZSB3YXRlciB0eXBlXG4gICAqL1xuICBwcml2YXRlIGxvYWRXYXRlckltYWdlcyh3YXRlckltYWdlVHlwZTogSW1hZ2VMb2FkZWRFbnVtKTogdm9pZCB7XG4gICAgdGhpcy5pbWFnZXMucHVzaCh0aGlzLmdhbWVTZXJ2aWNlLmdldEltYWdlKHdhdGVySW1hZ2VUeXBlKSk7XG5cbiAgICBmb3IgKGxldCB3YXZlID0gMDsgd2F2ZSA8IDQ7IHdhdmUrKykge1xuICAgICAgdGhpcy53YXZlSW1hZ2VzLnB1c2goXG4gICAgICAgIHRoaXMud2F2ZUNvbmZpZ3VyYXRpb24oe1xuICAgICAgICAgIGltYWdlOiB0aGlzLmdhbWVTZXJ2aWNlLmdldEltYWdlKEltYWdlTG9hZGVkRW51bS53YXRlcldhdmVzKVxuICAgICAgICB9IGFzIFdhdmVNb2RlbClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5pc0ltYWdlTG9hZGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3IGV2ZXJ5dGhpbmcgbmVjZXNzYXJ5XG4gICAqL1xuICBwcm90ZWN0ZWQgZHJhdygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0ltYWdlTG9hZGVkKSB7XG4gICAgICB0aGlzLmltYWdlcy5tYXAoKGltYWdlRGF0YTogSW1hZ2VMb2NhdGlvbk1vZGVsKSA9PiB7XG4gICAgICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICAgICAgdGhpcy5jdHgudHJhbnNsYXRlKHRoaXMueCwgdGhpcy55KTtcbiAgICAgICAgdGhpcy5jdHguc2NhbGUodGhpcy5hc3NldFNjYWxlLngsIHRoaXMuYXNzZXRTY2FsZS55KTtcbiAgICAgICAgaWYgKGltYWdlRGF0YS5pc1JvdGF0ZSkge1xuICAgICAgICAgIHRoaXMuY3R4LnJvdGF0ZSh0aGlzLmdhbWVTZXJ2aWNlLmdldFJhZGlhbnMoaW1hZ2VEYXRhLnJvdGF0ZSkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3R4LmRyYXdJbWFnZShpbWFnZURhdGEuaW1hZ2VTb3VyY2UsIGltYWdlRGF0YS54LCBpbWFnZURhdGEueSk7XG4gICAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLndhdmVJbWFnZXMubWFwKCh3YXZlRGF0YTogV2F2ZU1vZGVsKSA9PiB7XG4gICAgICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICAgICAgdGhpcy5jdHgudHJhbnNsYXRlKHRoaXMueCwgdGhpcy55KTtcbiAgICAgICAgdGhpcy5jdHguc2NhbGUod2F2ZURhdGEuc2NhbGUsIHdhdmVEYXRhLnNjYWxlKTtcbiAgICAgICAgdGhpcy5jdHguZHJhd0ltYWdlKFxuICAgICAgICAgIHdhdmVEYXRhLmltYWdlLmltYWdlU291cmNlLCAvLyBUaGUgaW1hZ2VcbiAgICAgICAgICB3YXZlRGF0YS54LCAvLyBzeCBTdGFydCB4IGNsaXBwaW5nXG4gICAgICAgICAgd2F2ZURhdGEueSAvLyBzeSBTdGFydCB5IGNsaXBwaW5nXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdGhlIHdhdmUgc2NhbGVcbiAgICogQHBhcmFtIHdhdmUgVGhlIHdhdmVcbiAgICovXG4gIHByaXZhdGUgYWRkV2F2ZVNjYWxlKHdhdmU6IFdhdmVNb2RlbCk6IG51bWJlciB7XG4gICAgd2F2ZS5zY2FsZSArPSAwLjAwNTtcbiAgICByZXR1cm4gTWF0aC5yb3VuZCh3YXZlLnNjYWxlICogMTAwMCkgLyAxMDAwO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0aGUgWCBCb3VuZGFyeVxuICAgKiBAcGFyYW0gd2F2ZURhdGEgVGhlIHdhdmUgbW9kZWxcbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlWEJvdW5kYXJ5KHdhdmVEYXRhOiBXYXZlTW9kZWwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gd2F2ZURhdGEuc2NhbGUgKiB3YXZlRGF0YS54ICsgd2F2ZURhdGEuc2NhbGUgKiB3YXZlRGF0YS5pbWFnZS53aWR0aCA8IDQ7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHRoZSBZIEJvdW5kYXJ5XG4gICAqIEBwYXJhbSB3YXZlRGF0YSBUaGUgd2F2ZSBtb2RlbFxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVZQm91bmRhcnkod2F2ZURhdGE6IFdhdmVNb2RlbCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3YXZlRGF0YS5zY2FsZSAqIHdhdmVEYXRhLnkgKyB3YXZlRGF0YS5zY2FsZSAqIHdhdmVEYXRhLmltYWdlLmhlaWdodCA8IDQ7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgVGhlIFRpbWVyXG4gICAqIEBwYXJhbSBub3cgVGhlIGN1cnJlbnQgYW5pbWF0aW9uIHRpbWVcbiAgICogQHBhcmFtIGluZGV4IFRoZSBjdXJyZW50IHRpbWVyIGluZGV4XG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlVGltZXIobm93OiBudW1iZXIsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hc3NldFRpbWVyc1tpbmRleF0uZWxhcHNlZCA+IHRoaXMuYW5pbWF0aW9uVGltZXJzW2luZGV4XSkge1xuICAgICAgdGhpcy5hc3NldFRpbWVyc1tpbmRleF0uc3RhcnQgPSBub3c7XG5cbiAgICAgIGNvbnN0IHRpbWVySW5kZXggPSBpbmRleCAqIDI7XG4gICAgICBjb25zdCB0aW1lckluZGV4TWF4ID0gdGltZXJJbmRleCArIDI7XG5cbiAgICAgIGZvciAobGV0IHdhdmVJbmRleCA9IHRpbWVySW5kZXg7IHdhdmVJbmRleCA8IHRpbWVySW5kZXhNYXg7IHdhdmVJbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IHdhdmVEYXRhID0gdGhpcy53YXZlSW1hZ2VzW3dhdmVJbmRleF07XG5cbiAgICAgICAgaWYgKHRoaXMuY2FsY3VsYXRlWEJvdW5kYXJ5KHdhdmVEYXRhKSAmJiB0aGlzLmNhbGN1bGF0ZVlCb3VuZGFyeSh3YXZlRGF0YSkpIHtcbiAgICAgICAgICB3YXZlRGF0YS5zY2FsZSA9IHRoaXMuYWRkV2F2ZVNjYWxlKHdhdmVEYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLndhdmVDb25maWd1cmF0aW9uKHdhdmVEYXRhKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBbmltYXRlIHRoZSBTY2VuZXJ5XG4gICAqIEBwYXJhbSBub3cgdGhlIGN1cnJlbnQgdGltZVxuICAgKi9cbiAgcHVibGljIGFuaW1hdGUobm93ID0gMCk6IHZvaWQge1xuICAgIHRoaXMuYXNzZXRUaW1lcnMubWFwKCh0aW1lcjogVGltZXJNb2RlbCwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgdGltZXIuZWxhcHNlZCA9IG5vdyAtIHRpbWVyLnN0YXJ0O1xuICAgICAgdGhpcy52YWxpZGF0ZVRpbWVyKG5vdywgaW5kZXgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5kcmF3KCk7XG4gIH1cbn1cbiJdfQ==