bp-prism-game
Version:
The BP Prism Game
143 lines • 17.1 kB
JavaScript
import { ObservableTypeEnum } from '../enum/observable-type.enum';
import { AssetAlignEnum } from './enum/asset-align.enum';
import { AssetAlignVerticalEnum } from './enum/asset-align-vertical.enum';
/**
* The Asset Class
*/
export class AssetClass {
/**
* Constructor
* @param gameService The game service
* @param ctx The ctx
* @param assetUid the uid of the asset
* @param imageType The optional animation number
*/
constructor(gameService, ctx, assetUid, imageType) {
this.gameService = gameService;
this.ctx = ctx;
this.assetUid = assetUid;
this.imageType = imageType;
this.assetScale = {
x: 1,
y: 1
};
this.x = 0;
this.y = 0;
this.images = [];
this.assetHeight = 0;
this.assetWidth = 0;
this.isAnimated = false;
this.isDestroyed = false;
this.isGameOver = false;
this.isGamePaused = false;
this.isImageLoaded = false;
this.assetTimer = { start: performance.now(), elapsed: 0 };
this.animationCounter = 0;
this.boundary = this.gameService.getBoundary();
this.init();
}
/**
* Init the asset
*/
init() {
this.gameService.getMasterObservable().subscribe((result) => {
if (result.type === ObservableTypeEnum.keyDownEvent || result.type === ObservableTypeEnum.keyUpEvent) {
this.processKeyStroke(result);
}
else if (result.type === ObservableTypeEnum.gameOver) {
this.isGameOver = result.booleanData;
}
else if (result.type === ObservableTypeEnum.gamePaused) {
this.isGamePaused = result.booleanData;
}
});
}
/**
* The extended animate class
*/
/* eslint-disable-next-line */
animate() { }
/**
* Get the Asset height
*/
getAssetHeight() {
return this.assetHeight * this.assetScale.y;
}
/**
* Get the Asset Width
*/
getAssetWidth() {
return this.assetWidth * this.assetScale.x;
}
/**
* set The Asset Dimensions
* @param height The asset height
* @param width The asset width
*/
setAssetDimensions(height, width) {
this.assetHeight = height;
this.assetWidth = width;
}
/**
* Get the asset uid
*/
get uid() {
return this.assetUid;
}
/**
* Process the key stroke
* @param eventCode the key event code
*/
/* eslint-disable-next-line */
processKeyStroke(event) { }
/**
* Move the asset
* @param asset The asset input
*/
move(asset) {
this.x = asset.x;
this.y = asset.y;
}
/**
* Determine if we should stop the animation
*/
stopAnimation() {
return this.isDestroyed || this.isGameOver || this.isGamePaused;
}
/**
* Position the Asset
*/
positionAsset(alignPosition, justifyPosition) {
let x = 0;
let y = 0;
if (alignPosition === AssetAlignEnum.center) {
x = (this.boundary.right - this.getAssetWidth()) / 2;
}
else if (alignPosition === AssetAlignEnum.leftThird) {
x = this.boundary.right / 3 - this.getAssetWidth() / 2;
}
else if (alignPosition === AssetAlignEnum.leftFourth) {
x = this.boundary.right / 4 - this.getAssetWidth() / 2;
}
else if (alignPosition === AssetAlignEnum.rightThird) {
x = (this.boundary.right * 2) / 3 - this.getAssetWidth() / 2;
}
else if (alignPosition === AssetAlignEnum.rightFourth) {
x = (this.boundary.right * 3) / 4 - this.getAssetWidth() / 2;
}
else if (alignPosition === AssetAlignEnum.right) {
x = this.boundary.right - this.getAssetWidth();
}
if (justifyPosition === AssetAlignVerticalEnum.bottom) {
y = this.boundary.floor - this.getAssetHeight();
}
else if (justifyPosition === AssetAlignVerticalEnum.middle) {
y = (this.boundary.floor - this.getAssetHeight()) / 2;
}
return {
x: Math.round(x),
y: Math.round(y)
};
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXQuY2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcmlzbS9zcmMvbGliL2Fzc2V0L2Fzc2V0LmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBR2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUsxRTs7R0FFRztBQUNILE1BQU0sT0FBZ0IsVUFBVTtJQThEOUI7Ozs7OztPQU1HO0lBQ0gsWUFDWSxXQUF3QixFQUN4QixHQUE2QixFQUM3QixRQUFnQixFQUNoQixTQUEyQjtRQUgzQixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixRQUFHLEdBQUgsR0FBRyxDQUEwQjtRQUM3QixhQUFRLEdBQVIsUUFBUSxDQUFRO1FBQ2hCLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBRXJDLElBQUksQ0FBQyxVQUFVLEdBQUc7WUFDaEIsQ0FBQyxFQUFFLENBQUM7WUFDSixDQUFDLEVBQUUsQ0FBQztTQUNjLENBQUM7UUFDckIsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWCxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVYLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBRWpCLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBRXBCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUks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SyxDQUFDLENBQUMsQ0FBQztZQUNoQixDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDUCxDQUFDO0lBQ2QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUFzc2V0IH0gZnJvbSAnLi4vaW50ZXJmYWNlL2Fzc2V0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBHYW1lU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2UvZ2FtZS5zZXJ2aWNlJztcbmltcG9ydCB7IE9ic2VydmFibGVNb2RlbCB9IGZyb20gJy4uL21vZGVsL29ic2VydmFibGUubW9kZWwnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZVR5cGVFbnVtIH0gZnJvbSAnLi4vZW51bS9vYnNlcnZhYmxlLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBUaW1lck1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvdGltZXIubW9kZWwnO1xuaW1wb3J0IHsgQm91bmRhcnlNb2RlbCB9IGZyb20gJy4uL21vZGVsL2JvdW5kYXJ5Lm1vZGVsJztcbmltcG9ydCB7IEFzc2V0QWxpZ25FbnVtIH0gZnJvbSAnLi9lbnVtL2Fzc2V0LWFsaWduLmVudW0nO1xuaW1wb3J0IHsgQXNzZXRBbGlnblZlcnRpY2FsRW51bSB9IGZyb20gJy4vZW51bS9hc3NldC1hbGlnbi12ZXJ0aWNhbC5lbnVtJztcbmltcG9ydCB7IEFzc2V0U2NhbGVNb2RlbCB9IGZyb20gJy4uL21vZGVsL2Fzc2V0LXNjYWxlLm1vZGUnO1xuaW1wb3J0IHsgSW1hZ2VMb2NhdGlvbk1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvaW1hZ2UvaW1hZ2UtbG9jYXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgSW1hZ2VMb2FkZWRFbnVtIH0gZnJvbSAnLi4vZW51bS9pbWFnZS1sb2FkZWQuZW51bSc7XG5cbi8qKlxuICogVGhlIEFzc2V0IENsYXNzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBc3NldENsYXNzIGltcGxlbWVudHMgSUFzc2V0IHtcbiAgLyoqXG4gICAqIFRoZSB4IGNvb3JkaW5hdGVcbiAgICovXG4gIHB1YmxpYyB4OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgeSBjb29yZGluYXRlXG4gICAqL1xuICBwdWJsaWMgeTogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHJlcXVlc3QgaWQgZnJvbSB0aGUgYW5pbWF0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVxdWVzdElkOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgQXNzZXQgVGltbWVyXG4gICAqL1xuICBwcm90ZWN0ZWQgYXNzZXRUaW1lcjogVGltZXJNb2RlbDtcbiAgLyoqXG4gICAqIEFuaW1hdGlvbiBDb3VudGVyXG4gICAqL1xuICBwcm90ZWN0ZWQgYW5pbWF0aW9uQ291bnRlcjogbnVtYmVyO1xuICAvKipcbiAgICogdGhlIGJvYXJkYXJ5IG1vZGVsXG4gICAqL1xuICBwcm90ZWN0ZWQgYm91bmRhcnk6IEJvdW5kYXJ5TW9kZWw7XG4gIC8qKlxuICAgKiBJcyB0aGUgYXNzZXQgaXMgZGVzdHJveWVkXG4gICAqL1xuICBwdWJsaWMgaXNEZXN0cm95ZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBJZiB0aGUgYXNzZXQgY2FuIGJlIGFuaW1hdGVkXG4gICAqL1xuICBwdWJsaWMgaXNBbmltYXRlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIElmIHRoZSBhc3NldCBrbm93bnMgdGhlIGdhbWUgaXMgb3ZlclxuICAgKi9cbiAgcHJvdGVjdGVkIGlzR2FtZU92ZXI6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBJZiB0aGUgYXNzZXQga25vd25zIHRoZSBnYW1lIGlzIHBhdXNlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGlzR2FtZVBhdXNlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBzY2FsZSBvZiB0aGUgb2JqZWN0XG4gICAqL1xuICBwdWJsaWMgYXNzZXRTY2FsZTogQXNzZXRTY2FsZU1vZGVsO1xuICAvKipcbiAgICogVGhlIGltYWdlc1xuICAgKi9cbiAgcHJvdGVjdGVkIGltYWdlczogSW1hZ2VMb2NhdGlvbk1vZGVsW107XG4gIC8qKlxuICAgKiBJZiB0aGUgaW1hZ2UgaXMgbG9hZGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNJbWFnZUxvYWRlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBhc3NldCBoZWlnaHRcbiAgICovXG4gIHByaXZhdGUgYXNzZXRIZWlnaHQ6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBhc3NldCB3aWR0aFxuICAgKi9cbiAgcHJpdmF0ZSBhc3NldFdpZHRoOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSBnYW1lU2VydmljZSBUaGUgZ2FtZSBzZXJ2aWNlXG4gICAqIEBwYXJhbSBjdHggVGhlIGN0eFxuICAgKiBAcGFyYW0gYXNzZXRVaWQgdGhlIHVpZCBvZiB0aGUgYXNzZXRcbiAgICogQHBhcmFtIGltYWdlVHlwZSBUaGUgb3B0aW9uYWwgYW5pbWF0aW9uIG51bWJlclxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGdhbWVTZXJ2aWNlOiBHYW1lU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gICAgcHJvdGVjdGVkIGFzc2V0VWlkOiBudW1iZXIsXG4gICAgcHJvdGVjdGVkIGltYWdlVHlwZT86IEltYWdlTG9hZGVkRW51bVxuICApIHtcbiAgICB0aGlzLmFzc2V0U2NhbGUgPSB7XG4gICAgICB4OiAxLFxuICAgICAgeTogMVxuICAgIH0gYXMgQXNzZXRTY2FsZU1vZGVsO1xuICAgIHRoaXMueCA9IDA7XG4gICAgdGhpcy55ID0gMDtcblxuICAgIHRoaXMuaW1hZ2VzID0gW107XG5cbiAgICB0aGlzLmFzc2V0SGVpZ2h0ID0gMDtcbiAgICB0aGlzLmFzc2V0V2lkdGggPSAwO1xuXG4gICAgdGhpcy5pc0FuaW1hdGVkID0gZmFsc2U7XG4gICAgdGhpcy5pc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMuaXNHYW1lT3ZlciA9IGZhbHNlO1xuICAgIHRoaXMuaXNHYW1lUGF1c2VkID0gZmFsc2U7XG4gICAgdGhpcy5pc0ltYWdlTG9hZGVkID0gZmFsc2U7XG5cbiAgICB0aGlzLmFzc2V0VGltZXIgPSB7IHN0YXJ0OiBwZXJmb3JtYW5jZS5ub3coKSwgZWxhcHNlZDogMCB9O1xuICAgIHRoaXMuYW5pbWF0aW9uQ291bnRlciA9IDA7XG5cbiAgICB0aGlzLmJvdW5kYXJ5ID0gdGhpcy5nYW1lU2VydmljZS5nZXRCb3VuZGFyeSgpO1xuXG4gICAgdGhpcy5pbml0KCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdCB0aGUgYXNzZXRcbiAgICovXG4gIGluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5nYW1lU2VydmljZS5nZXRNYXN0ZXJPYnNlcnZhYmxlKCkuc3Vic2NyaWJlKChyZXN1bHQ6IE9ic2VydmFibGVNb2RlbCkgPT4ge1xuICAgICAgaWYgKHJlc3VsdC50eXBlID09PSBPYnNlcnZhYmxlVHlwZUVudW0ua2V5RG93bkV2ZW50IHx8IHJlc3VsdC50eXBlID09PSBPYnNlcnZhYmxlVHlwZUVudW0ua2V5VXBFdmVudCkge1xuICAgICAgICB0aGlzLnByb2Nlc3NLZXlTdHJva2UocmVzdWx0KTtcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0LnR5cGUgPT09IE9ic2VydmFibGVUeXBlRW51bS5nYW1lT3Zlcikge1xuICAgICAgICB0aGlzLmlzR2FtZU92ZXIgPSByZXN1bHQuYm9vbGVhbkRhdGE7XG4gICAgICB9IGVsc2UgaWYgKHJlc3VsdC50eXBlID09PSBPYnNlcnZhYmxlVHlwZUVudW0uZ2FtZVBhdXNlZCkge1xuICAgICAgICB0aGlzLmlzR2FtZVBhdXNlZCA9IHJlc3VsdC5ib29sZWFuRGF0YTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogVGhlIGV4dGVuZGVkIGFuaW1hdGUgY2xhc3NcbiAgICovXG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgYW5pbWF0ZSgpOiB2b2lkIHt9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgQXNzZXQgaGVpZ2h0XG4gICAqL1xuICBnZXRBc3NldEhlaWdodCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFzc2V0SGVpZ2h0ICogdGhpcy5hc3NldFNjYWxlLnk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBBc3NldCBXaWR0aFxuICAgKi9cbiAgZ2V0QXNzZXRXaWR0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFzc2V0V2lkdGggKiB0aGlzLmFzc2V0U2NhbGUueDtcbiAgfVxuXG4gIC8qKlxuICAgKiAgc2V0IFRoZSBBc3NldCBEaW1lbnNpb25zXG4gICAqIEBwYXJhbSBoZWlnaHQgVGhlIGFzc2V0IGhlaWdodFxuICAgKiBAcGFyYW0gd2lkdGggVGhlIGFzc2V0IHdpZHRoXG4gICAqL1xuICBzZXRBc3NldERpbWVuc2lvbnMoaGVpZ2h0OiBudW1iZXIsIHdpZHRoOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmFzc2V0SGVpZ2h0ID0gaGVpZ2h0O1xuICAgIHRoaXMuYXNzZXRXaWR0aCA9IHdpZHRoO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYXNzZXQgdWlkXG4gICAqL1xuICBnZXQgdWlkKCkge1xuICAgIHJldHVybiB0aGlzLmFzc2V0VWlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgdGhlIGtleSBzdHJva2VcbiAgICogQHBhcmFtIGV2ZW50Q29kZSB0aGUga2V5IGV2ZW50IGNvZGVcbiAgICovXG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSAqL1xuICBwcm90ZWN0ZWQgcHJvY2Vzc0tleVN0cm9rZShldmVudDogT2JzZXJ2YWJsZU1vZGVsKTogdm9pZCB7fVxuXG4gIC8qKlxuICAgKiBNb3ZlIHRoZSBhc3NldFxuICAgKiBAcGFyYW0gYXNzZXQgVGhlIGFzc2V0IGlucHV0XG4gICAqL1xuICBtb3ZlKGFzc2V0OiBJQXNzZXQpOiB2b2lkIHtcbiAgICB0aGlzLnggPSBhc3NldC54O1xuICAgIHRoaXMueSA9IGFzc2V0Lnk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBzdG9wIHRoZSBhbmltYXRpb25cbiAgICovXG4gIHByb3RlY3RlZCBzdG9wQW5pbWF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzRGVzdHJveWVkIHx8IHRoaXMuaXNHYW1lT3ZlciB8fCB0aGlzLmlzR2FtZVBhdXNlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb3NpdGlvbiB0aGUgQXNzZXRcbiAgICovXG4gIHBvc2l0aW9uQXNzZXQoYWxpZ25Qb3NpdGlvbjogQXNzZXRBbGlnbkVudW0sIGp1c3RpZnlQb3NpdGlvbjogQXNzZXRBbGlnblZlcnRpY2FsRW51bSk6IElBc3NldCB7XG4gICAgbGV0IHggPSAwO1xuICAgIGxldCB5ID0gMDtcblxuICAgIGlmIChhbGlnblBvc2l0aW9uID09PSBBc3NldEFsaWduRW51bS5jZW50ZXIpIHtcbiAgICAgIHggPSAodGhpcy5ib3VuZGFyeS5yaWdodCAtIHRoaXMuZ2V0QXNzZXRXaWR0aCgpKSAvIDI7XG4gICAgfSBlbHNlIGlmIChhbGlnblBvc2l0aW9uID09PSBBc3NldEFsaWduRW51bS5sZWZ0VGhpcmQpIHtcbiAgICAgIHggPSB0aGlzLmJvdW5kYXJ5LnJpZ2h0IC8gMyAtIHRoaXMuZ2V0QXNzZXRXaWR0aCgpIC8gMjtcbiAgICB9IGVsc2UgaWYgKGFsaWduUG9zaXRpb24gPT09IEFzc2V0QWxpZ25FbnVtLmxlZnRGb3VydGgpIHtcbiAgICAgIHggPSB0aGlzLmJvdW5kYXJ5LnJpZ2h0IC8gNCAtIHRoaXMuZ2V0QXNzZXRXaWR0aCgpIC8gMjtcbiAgICB9IGVsc2UgaWYgKGFsaWduUG9zaXRpb24gPT09IEFzc2V0QWxpZ25FbnVtLnJpZ2h0VGhpcmQpIHtcbiAgICAgIHggPSAodGhpcy5ib3VuZGFyeS5yaWdodCAqIDIpIC8gMyAtIHRoaXMuZ2V0QXNzZXRXaWR0aCgpIC8gMjtcbiAgICB9IGVsc2UgaWYgKGFsaWduUG9zaXRpb24gPT09IEFzc2V0QWxpZ25FbnVtLnJpZ2h0Rm91cnRoKSB7XG4gICAgICB4ID0gKHRoaXMuYm91bmRhcnkucmlnaHQgKiAzKSAvIDQgLSB0aGlzLmdldEFzc2V0V2lkdGgoKSAvIDI7XG4gICAgfSBlbHNlIGlmIChhbGlnblBvc2l0aW9uID09PSBBc3NldEFsaWduRW51bS5yaWdodCkge1xuICAgICAgeCA9IHRoaXMuYm91bmRhcnkucmlnaHQgLSB0aGlzLmdldEFzc2V0V2lkdGgoKTtcbiAgICB9XG5cbiAgICBpZiAoanVzdGlmeVBvc2l0aW9uID09PSBBc3NldEFsaWduVmVydGljYWxFbnVtLmJvdHRvbSkge1xuICAgICAgeSA9IHRoaXMuYm91bmRhcnkuZmxvb3IgLSB0aGlzLmdldEFzc2V0SGVpZ2h0KCk7XG4gICAgfSBlbHNlIGlmIChqdXN0aWZ5UG9zaXRpb24gPT09IEFzc2V0QWxpZ25WZXJ0aWNhbEVudW0ubWlkZGxlKSB7XG4gICAgICB5ID0gKHRoaXMuYm91bmRhcnkuZmxvb3IgLSB0aGlzLmdldEFzc2V0SGVpZ2h0KCkpIC8gMjtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogTWF0aC5yb3VuZCh4KSxcbiAgICAgIHk6IE1hdGgucm91bmQoeSlcbiAgICB9IGFzIElBc3NldDtcbiAgfVxufVxuIl19