UNPKG

ngx-party-parrots

Version:
297 lines 29.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, HostListener, Input, NgZone, ViewChild } from '@angular/core'; import { config } from '../../config'; /** @enum {string} */ const SlalomDirection = { RIGHT: 'RIGHT', LEFT: 'LEFT', }; export class NgxPartyParrotsComponent { /** * @param {?} ngZone */ constructor(ngZone) { this.ngZone = ngZone; this.parrotsSprites = []; this.ngZone.runOutsideAngular((/** * @return {?} */ () => { /** @type {?} */ const loop = (/** * @return {?} */ () => { this.context.clearRect(0, 0, this.canvasWidth, this.canvasHeight); this.parrotsSprites.forEach((/** * @param {?} parrot * @return {?} */ (parrot) => { parrot.update(); parrot.render(); })); this.windowAnimationFrame = requestAnimationFrame(loop); }); this.windowAnimationFrame = requestAnimationFrame(loop); })); } /** * @param {?} mode * @return {?} */ set mode(mode) { this.opacity = this.opacity || config.modes[mode].opacity; this.parrotsAmount = this.parrotsAmount || config.modes[mode].parrotsAmount; this.parrotsData = this.parrotsData || config.modes[mode].parrotsData; this.speed = this.speed || config.modes[mode].speed; this.skiingMode = this.skiingMode || config.modes[mode].skiingMode; this.slalomLength = this.slalomLength || config.modes[mode].slalomLength; } /** * @return {?} */ ngOnInit() { this.prepareCanvas(); this.parrotsSprites = Array.from({ length: this.parrotsAmount }) .map((/** * @return {?} */ () => this.createSprite())); } /** * @return {?} */ prepareCanvas() { this.canvasWidth = window.innerWidth; this.canvasHeight = window.innerHeight; // resize canvas to match whole window this.canvas.nativeElement.width = this.canvasWidth; this.canvas.nativeElement.height = this.canvasHeight; // save canvas context this.context = this.canvas.nativeElement.getContext('2d'); this.context.globalAlpha = this.opacity; } /** * @param {?} src * @return {?} */ createImage(src) { /** @type {?} */ const parrotImage = new Image(); parrotImage.src = src; return parrotImage; } /** * @return {?} */ createSprite() { /** @type {?} */ let randomParrot = this.randomNumberFromMinToMax(0, this.parrotsData.length); /** @type {?} */ let options = (/** * @param {?} randomParrot * @return {?} */ (randomParrot) => { return { frameIndex: 0, tickCount: 0, ticksPerFrame: 1, positionX: this.randomNumberFromMinToMax(0, this.canvasWidth), positionY: this.randomNumberFromMinToMax(this.randomNumberFromMinToMax(-150, -100), 0), slalomMovementLength: this.randomNumberFromMinToMax(this.slalomLength.min, this.slalomLength.max), slalomMovementDirection: SlalomDirection.RIGHT, speed: this.randomNumberFromMinToMax(this.speed.min, this.speed.max), scaleFactor: this.getScalingFactorForWidth(this.parrotsData[randomParrot].width), context: this.context, image: this.createImage(this.parrotsData[randomParrot].imageSrc) }; }); /** @type {?} */ let sprite = Object.assign({}, this.parrotsData[randomParrot], options(randomParrot)); sprite.render = (/** * @return {?} */ () => { sprite.context.drawImage(sprite.image, sprite.frameIndex * sprite.width / sprite.numberOfFrames, 0, sprite.width / sprite.numberOfFrames, sprite.height, sprite.positionX, sprite.positionY, sprite.width / sprite.scaleFactor / sprite.numberOfFrames, sprite.height / sprite.scaleFactor); }); sprite.updatePosition = (/** * @return {?} */ () => { if (sprite.positionY < this.canvasHeight) { sprite.positionY = sprite.positionY + sprite.speed; if (this.skiingMode === 'yes') { this.setSlalomDirection(sprite); } } else { randomParrot = this.randomNumberFromMinToMax(0, this.parrotsData.length); sprite = Object.assign({}, sprite, this.parrotsData[randomParrot], options(randomParrot)); // sprite.positionX = this.randomNumberFromMinToMax(0, this.canvasWidth); // sprite.positionY = this.randomNumberFromMinToMax(-200, 0); } }); sprite.updateFrames = (/** * @return {?} */ () => { // If the current frame index is in range if (sprite.frameIndex < sprite.numberOfFrames - 1) { sprite.frameIndex += 1; } else { sprite.frameIndex = 0; } }); sprite.update = (/** * @return {?} */ () => { sprite.tickCount += 1; if (sprite.tickCount > sprite.ticksPerFrame) { sprite.tickCount = 0; sprite.updateFrames(); sprite.updatePosition(); } }); return sprite; } /** * @param {?} min * @param {?} max * @return {?} */ randomNumberFromMinToMax(min, max) { return Math.floor(Math.random() * max) + min; } /** * @param {?} width * @return {?} */ getScalingFactorForWidth(width) { if (width < 1280) { return 1; } else { return Number((Math.random() * (2 - 1) + 2).toFixed(2)); } } /** * @param {?} sprite * @return {?} */ setSlalomDirection(sprite) { // if out of the board from the right if (sprite.positionX > this.canvasWidth) { sprite.slalomMovementDirection = SlalomDirection.LEFT; sprite.slalomMovementLength = this.randomNumberFromMinToMax(this.slalomLength.min, this.slalomLength.max); } // if out of the board from the left if (sprite.positionX < 0) { sprite.slalomMovementDirection = SlalomDirection.RIGHT; sprite.slalomMovementLength = this.randomNumberFromMinToMax(this.slalomLength.min, this.slalomLength.max); } if (sprite.slalomMovementDirection === SlalomDirection.LEFT && sprite.slalomMovementLength) { sprite.positionX = sprite.positionX - sprite.speed; sprite.slalomMovementLength--; } if (sprite.slalomMovementDirection === SlalomDirection.RIGHT && sprite.slalomMovementLength) { sprite.positionX = sprite.positionX + sprite.speed; sprite.slalomMovementLength--; } if (sprite.slalomMovementLength === 0) { // change direction if (sprite.slalomMovementDirection === SlalomDirection.RIGHT) { sprite.slalomMovementDirection = SlalomDirection.LEFT; } else { sprite.slalomMovementDirection = SlalomDirection.RIGHT; } sprite.slalomMovementLength = this.randomNumberFromMinToMax(this.slalomLength.min, this.slalomLength.max); } } /** * @return {?} */ onResize() { this.canvasWidth = window.innerWidth; this.canvasHeight = window.innerHeight; // update canvas size (possibly window resized) this.canvas.nativeElement.width = this.canvasWidth; this.canvas.nativeElement.height = this.canvasHeight; } /** * @return {?} */ ngOnDestroy() { cancelAnimationFrame(this.windowAnimationFrame); } } NgxPartyParrotsComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-pp-party-parrots', template: "<canvas class=\"parrot-rain\" #canvas></canvas>\n", styles: [".parrot-rain{width:100vw;height:100vh;background:0 0;margin:0;padding:0;position:fixed;left:0;top:0;z-index:100;pointer-events:none}"] }] } ]; /** @nocollapse */ NgxPartyParrotsComponent.ctorParameters = () => [ { type: NgZone } ]; NgxPartyParrotsComponent.propDecorators = { canvas: [{ type: ViewChild, args: ['canvas',] }], parrotsAmount: [{ type: Input }], opacity: [{ type: Input }], parrotsData: [{ type: Input }], speed: [{ type: Input }], skiingMode: [{ type: Input }], slalomLength: [{ type: Input }], mode: [{ type: Input, args: ['mode',] }], onResize: [{ type: HostListener, args: ['window:resize',] }] }; if (false) { /** @type {?} */ NgxPartyParrotsComponent.prototype.canvas; /** @type {?} */ NgxPartyParrotsComponent.prototype.parrotsAmount; /** @type {?} */ NgxPartyParrotsComponent.prototype.opacity; /** @type {?} */ NgxPartyParrotsComponent.prototype.parrotsData; /** @type {?} */ NgxPartyParrotsComponent.prototype.speed; /** @type {?} */ NgxPartyParrotsComponent.prototype.skiingMode; /** @type {?} */ NgxPartyParrotsComponent.prototype.slalomLength; /** * @type {?} * @private */ NgxPartyParrotsComponent.prototype.canvasWidth; /** * @type {?} * @private */ NgxPartyParrotsComponent.prototype.canvasHeight; /** * @type {?} * @private */ NgxPartyParrotsComponent.prototype.context; /** * @type {?} * @private */ NgxPartyParrotsComponent.prototype.windowAnimationFrame; /** @type {?} */ NgxPartyParrotsComponent.prototype.parrotsSprites; /** @type {?} */ NgxPartyParrotsComponent.prototype.ngZone; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXBhcnR5LXBhcnJvdHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXBhcnR5LXBhcnJvdHMvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9uZ3gtcGFydHktcGFycm90cy9uZ3gtcGFydHktcGFycm90cy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQXFCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDOzs7SUFLcEMsT0FBUSxPQUFPO0lBQ2YsTUFBTyxNQUFNOztBQVFmLE1BQU0sT0FBTyx3QkFBd0I7Ozs7SUF5Qm5DLFlBQW1CLE1BQWM7UUFBZCxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBRmpDLG1CQUFjLEdBQUcsRUFBRSxDQUFDO1FBR2xCLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCOzs7UUFBQyxHQUFHLEVBQUU7O2tCQUMzQixJQUFJOzs7WUFBRyxHQUFHLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ2xFLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTzs7OztnQkFBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO29CQUNyQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ2hCLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbEIsQ0FBQyxFQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLG9CQUFvQixHQUFHLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBRTFELENBQUMsQ0FBQTtZQUVELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FB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bkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDdkQsQ0FBQzs7OztJQUVELFdBQVc7UUFDVCxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUNsRCxDQUFDOzs7WUFqTkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxzQkFBc0I7Z0JBQ2hDLDZEQUFpRDs7YUFFbEQ7Ozs7WUFkd0MsTUFBTTs7O3FCQWlCNUMsU0FBUyxTQUFDLFFBQVE7NEJBQ2xCLEtBQUs7c0JBQ0wsS0FBSzswQkFDTCxLQUFLO29CQUNMLEtBQUs7eUJBQ0wsS0FBSzsyQkFDTCxLQUFLO21CQUVMLEtBQUssU0FBQyxNQUFNO3VCQXNMWixZQUFZLFNBQUMsZUFBZTs7OztJQTlMN0IsMENBQTRCOztJQUM1QixpREFBK0I7O0lBQy9CLDJDQUF5Qjs7SUFDekIsK0NBQW9DOztJQUNwQyx5Q0FBNkM7O0lBQzdDLDhDQUE0Qjs7SUFDNUIsZ0RBQW9EOzs7OztJQVdwRCwrQ0FBNEI7Ozs7O0lBQzVCLGdEQUE2Qjs7Ozs7SUFDN0IsMkNBQTBDOzs7OztJQUMxQyx3REFBcUM7O0lBQ3JDLGtEQUFvQjs7SUFFUiwwQ0FBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE5nWm9uZSwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi4vLi4vY29uZmlnJztcbmltcG9ydCB7IFBhcnJvdE1vZGVsIH0gZnJvbSAnLi4vLi4vcGFycm90cy9wYXJyb3QubW9kZWwnO1xuXG5cbmVudW0gU2xhbG9tRGlyZWN0aW9uIHtcbiAgUklHSFQgPSAnUklHSFQnLFxuICBMRUZUID0gJ0xFRlQnXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1wcC1wYXJ0eS1wYXJyb3RzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL25neC1wYXJ0eS1wYXJyb3RzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbmd4LXBhcnR5LXBhcnJvdHMuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIE5neFBhcnR5UGFycm90c0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICBAVmlld0NoaWxkKCdjYW52YXMnKSBjYW52YXM7XG4gIEBJbnB1dCgpIHBhcnJvdHNBbW91bnQ6IG51bWJlcjtcbiAgQElucHV0KCkgb3BhY2l0eTogbnVtYmVyO1xuICBASW5wdXQoKSBwYXJyb3RzRGF0YTogUGFycm90TW9kZWxbXTtcbiAgQElucHV0KCkgc3BlZWQ6IHsgbWluOiBudW1iZXIsIG1heDogbnVtYmVyIH07XG4gIEBJbnB1dCgpIHNraWluZ01vZGU6IHN0cmluZztcbiAgQElucHV0KCkgc2xhbG9tTGVuZ3RoOiB7IG1pbjogbnVtYmVyLCBtYXg6IG51bWJlciB9O1xuXG4gIEBJbnB1dCgnbW9kZScpIHNldCBtb2RlKG1vZGU6IHN0cmluZykge1xuICAgIHRoaXMub3BhY2l0eSA9IHRoaXMub3BhY2l0eSB8fCBjb25maWcubW9kZXNbbW9kZV0ub3BhY2l0eTtcbiAgICB0aGlzLnBhcnJvdHNBbW91bnQgPSB0aGlzLnBhcnJvdHNBbW91bnQgfHwgY29uZmlnLm1vZGVzW21vZGVdLnBhcnJvdHNBbW91bnQ7XG4gICAgdGhpcy5wYXJyb3RzRGF0YSA9IHRoaXMucGFycm90c0RhdGEgfHwgY29uZmlnLm1vZGVzW21vZGVdLnBhcnJvdHNEYXRhO1xuICAgIHRoaXMuc3BlZWQgPSB0aGlzLnNwZWVkIHx8IGNvbmZpZy5tb2Rlc1ttb2RlXS5zcGVlZDtcbiAgICB0aGlzLnNraWluZ01vZGUgPSB0aGlzLnNraWluZ01vZGUgfHwgY29uZmlnLm1vZGVzW21vZGVdLnNraWluZ01vZGU7XG4gICAgdGhpcy5zbGFsb21MZW5ndGggPSB0aGlzLnNsYWxvbUxlbmd0aCB8fCBjb25maWcubW9kZXNbbW9kZV0uc2xhbG9tTGVuZ3RoO1xuICB9XG5cbiAgcHJpdmF0ZSBjYW52YXNXaWR0aDogbnVtYmVyO1xuICBwcml2YXRlIGNhbnZhc0hlaWdodDogbnVtYmVyO1xuICBwcml2YXRlIGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcbiAgcHJpdmF0ZSB3aW5kb3dBbmltYXRpb25GcmFtZTogbnVtYmVyO1xuICBwYXJyb3RzU3ByaXRlcyA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuZ1pvbmU6IE5nWm9uZSkge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGNvbnN0IGxvb3AgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29udGV4dC5jbGVhclJlY3QoMCwgMCwgdGhpcy5jYW52YXNXaWR0aCwgdGhpcy5jYW52YXNIZWlnaHQpO1xuICAgICAgICB0aGlzLnBhcnJvdHNTcHJpdGVzLmZvckVhY2goKHBhcnJvdCkgPT4ge1xuICAgICAgICAgIHBhcnJvdC51cGRhdGUoKTtcbiAgICAgICAgICBwYXJyb3QucmVuZGVyKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLndpbmRvd0FuaW1hdGlvbkZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApO1xuXG4gICAgICB9O1xuXG4gICAgICB0aGlzLndpbmRvd0FuaW1hdGlvbkZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5wcmVwYXJlQ2FudmFzKCk7XG4gICAgdGhpcy5wYXJyb3RzU3ByaXRlcyA9IEFycmF5LmZyb20oe2xlbmd0aDogdGhpcy5wYXJyb3RzQW1vdW50fSlcbiAgICAgIC5tYXAoKCkgPT4gdGhpcy5jcmVhdGVTcHJpdGUoKSk7XG4gIH1cblxuICBwcmVwYXJlQ2FudmFzKCk6IHZvaWQge1xuICAgIHRoaXMuY2FudmFzV2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICB0aGlzLmNhbnZhc0hlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcblxuICAgIC8vIHJlc2l6ZSBjYW52YXMgdG8gbWF0Y2ggd2hvbGUgd2luZG93XG4gICAgdGhpcy5jYW52YXMubmF0aXZlRWxlbWVudC53aWR0aCA9IHRoaXMuY2FudmFzV2lkdGg7XG4gICAgdGhpcy5jYW52YXMubmF0aXZlRWxlbWVudC5oZWlnaHQgPSB0aGlzLmNhbnZhc0hlaWdodDtcblxuICAgIC8vIHNhdmUgY2FudmFzIGNvbnRleHRcbiAgICB0aGlzLmNvbnRleHQgPSB0aGlzLmNhbnZhcy5uYXRpdmVFbGVtZW50LmdldENvbnRleHQoJzJkJyk7XG4gICAgdGhpcy5jb250ZXh0Lmdsb2JhbEFscGhhID0gdGhpcy5vcGFjaXR5O1xuICB9XG4gIGNyZWF0ZUltYWdlKHNyYyk6IEhUTUxJbWFnZUVsZW1lbnQge1xuICAgIGNvbnN0IHBhcnJvdEltYWdlID0gbmV3IEltYWdlKCk7XG4gICAgcGFycm90SW1hZ2Uuc3JjID0gc3JjO1xuICAgIHJldHVybiBwYXJyb3RJbWFnZTtcbiAgfVxuICBjcmVhdGVTcHJpdGUoKSB7XG4gICAgbGV0IHJhbmRvbVBhcnJvdDogbnVtYmVyID0gdGhpcy5yYW5kb21OdW1iZXJGcm9tTWluVG9NYXgoMCwgdGhpcy5wYXJyb3RzRGF0YS5sZW5ndGgpO1xuXG4gICAgbGV0IG9wdGlvbnMgPSAocmFuZG9tUGFycm90KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmcmFtZUluZGV4OiAwLFxuICAgICAgICB0aWNrQ291bnQ6IDAsXG4gICAgICAgIHRpY2tzUGVyRnJhbWU6IDEsXG4gICAgICAgIHBvc2l0aW9uWDogdGhpcy5yYW5kb21OdW1iZXJGcm9tTWluVG9NYXgoMCwgdGhpcy5jYW52YXNXaWR0aCksXG4gICAgICAgIHBvc2l0aW9uWTogdGhpcy5yYW5kb21OdW1iZXJGcm9tTWluVG9NYXgodGhpcy5yYW5kb21OdW1iZXJGcm9tTWluVG9NYXgoLTE1MCwgLTEwMCksIDApLFxuICAgICAgICBzbGFsb21Nb3ZlbWVudExlbmd0aDogdGhpcy5yYW5kb21OdW1iZXJGcm9tTWluVG9NYXgodGhpcy5zbGFsb21MZW5ndGgubWluLCB0aGlzLnNsYWxvbUxlbmd0aC5tYXgpLFxuICAgICAgICBzbGFsb21Nb3ZlbWVudERpcmVjdGlvbjogU2xhbG9tRGlyZWN0aW9uLlJJR0hULFxuICAgICAgICBzcGVlZDogdGhpcy5yYW5kb21OdW1iZXJGcm9tTWluVG9NYXgodGhpcy5zcGVlZC5taW4sIHRoaXMuc3BlZWQubWF4KSxcbiAgICAgICAgc2NhbGVGYWN0b3I6IHRoaXMuZ2V0U2NhbGluZ0ZhY3RvckZvcldpZHRoKHRoaXMucGFycm90c0RhdGFbcmFuZG9tUGFycm90XS53aWR0aCksXG4gICAgICAgIGNvbnRleHQ6IHRoaXMuY29udGV4dCxcbiAgICAgICAgaW1hZ2U6IHRoaXMuY3JlYXRlSW1hZ2UodGhpcy5wYXJyb3RzRGF0YVtyYW5kb21QYXJyb3RdLmltYWdlU3JjKVxuICAgICAgfVxuXG4gICAgfTtcblxuICAgIGxldCBzcHJpdGU6IGFueSA9IHtcbiAgICAgIC4uLnRoaXMucGFycm90c0RhdGFbcmFuZG9tUGFycm90XSxcbiAgICAgIC4uLm9wdGlvbnMocmFuZG9tUGFycm90KVxuICAgIH07XG5cbiAgICBzcHJpdGUucmVuZGVyID0gKCkgPT4ge1xuICAgICAgc3ByaXRlLmNvbnRleHQuZHJhd0ltYWdlKFxuICAgICAgICBzcHJpdGUuaW1hZ2UsXG4gICAgICAgIHNwcml0ZS5mcmFtZUluZGV4ICogc3ByaXRlLndpZHRoIC8gc3ByaXRlLm51bWJlck9mRnJhbWVzLFxuICAgICAgICAwLFxuICAgICAgICBzcHJpdGUud2lkdGggLyBzcHJpdGUubnVtYmVyT2ZGcmFtZXMsXG4gICAgICAgIHNwcml0ZS5oZWlnaHQsXG4gICAgICAgIHNwcml0ZS5wb3NpdGlvblgsXG4gICAgICAgIHNwcml0ZS5wb3NpdGlvblksXG4gICAgICAgIHNwcml0ZS53aWR0aCAvIHNwcml0ZS5zY2FsZUZhY3RvciAvIHNwcml0ZS5udW1iZXJPZkZyYW1lcyxcbiAgICAgICAgc3ByaXRlLmhlaWdodCAvIHNwcml0ZS5zY2FsZUZhY3Rvcik7XG4gICAgfTtcblxuICAgIHNwcml0ZS51cGRhdGVQb3NpdGlvbiA9ICgpID0+IHtcbiAgICAgIGlmIChzcHJpdGUucG9zaXRpb25ZIDwgdGhpcy5jYW52YXNIZWlnaHQpIHtcbiAgICAgICAgc3ByaXRlLnBvc2l0aW9uWSA9IHNwcml0ZS5wb3NpdGlvblkgKyBzcHJpdGUuc3BlZWQ7XG5cbiAgICAgICAgaWYgKHRoaXMuc2tpaW5nTW9kZSA9PT0gJ3llcycpIHtcbiAgICAgICAgICB0aGlzLnNldFNsYWxvbURpcmVjdGlvbihzcHJpdGUpO1xuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJhbmRvbVBhcnJvdCA9IHRoaXMucmFuZG9tTnVtYmVyRnJvbU1pblRvTWF4KDAsIHRoaXMucGFycm90c0RhdGEubGVuZ3RoKTtcblxuICAgICAgICBzcHJpdGUgPSB7XG4gICAgICAgICAgLi4uc3ByaXRlLFxuICAgICAgICAgIC4uLnRoaXMucGFycm90c0RhdGFbcmFuZG9tUGFycm90XSxcbiAgICAgICAgICAuLi5vcHRpb25zKHJhbmRvbVBhcnJvdClcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gc3ByaXRlLnBvc2l0aW9uWCA9IHRoaXMucmFuZG9tTnVtYmVyRnJvbU1pblRvTWF4KDAsIHRoaXMuY2FudmFzV2lkdGgpO1xuICAgICAgICAvLyBzcHJpdGUucG9zaXRpb25ZID0gdGhpcy5yYW5kb21OdW1iZXJGcm9tTWluVG9NYXgoLTIwMCwgMCk7XG5cblxuICAgICAgfVxuICAgIH07XG5cbiAgICBzcHJpdGUudXBkYXRlRnJhbWVzID0gKCkgPT4ge1xuICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgZnJhbWUgaW5kZXggaXMgaW4gcmFuZ2VcbiAgICAgIGlmIChzcHJpdGUuZnJhbWVJbmRleCA8IHNwcml0ZS5udW1iZXJPZkZyYW1lcyAtIDEpIHtcbiAgICAgICAgc3ByaXRlLmZyYW1lSW5kZXggKz0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwcml0ZS5mcmFtZUluZGV4ID0gMDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgc3ByaXRlLnVwZGF0ZSA9ICgpID0+IHtcblxuICAgICAgc3ByaXRlLnRpY2tDb3VudCArPSAxO1xuXG4gICAgICBpZiAoc3ByaXRlLnRpY2tDb3VudCA+IHNwcml0ZS50aWNrc1BlckZyYW1lKSB7XG4gICAgICAgIHNwcml0ZS50aWNrQ291bnQgPSAwO1xuICAgICAgICBzcHJpdGUudXBkYXRlRnJhbWVzKCk7XG4gICAgICAgIHNwcml0ZS51cGRhdGVQb3NpdGlvbigpO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIHNwcml0ZTtcbiAgfVxuXG4gIHJhbmRvbU51bWJlckZyb21NaW5Ub01heChtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBtYXgpICsgbWluO1xuICB9XG5cbiAgZ2V0U2NhbGluZ0ZhY3RvckZvcldpZHRoKHdpZHRoKTogbnVtYmVyIHtcbiAgICBpZiAod2lkdGggPCAxMjgwKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIE51bWJlcigoTWF0aC5yYW5kb20oKSAqICgyIC0gMSkgKyAyKS50b0ZpeGVkKDIpKTtcbiAgICB9XG4gIH1cbiAgc2V0U2xhbG9tRGlyZWN0aW9uKHNwcml0ZSkge1xuICAgIC8vIGlmIG91dCBvZiB0aGUgYm9hcmQgZnJvbSB0aGUgcmlnaHRcbiAgICBpZiAoc3ByaXRlLnBvc2l0aW9uWCA+IHRoaXMuY2FudmFzV2lkdGgpIHtcbiAgICAgIHNwcml0ZS5zbGFsb21Nb3ZlbWVudERpcmVjdGlvbiA9IFNsYWxvbURpcmVjdGlvbi5MRUZUO1xuICAgICAgc3ByaXRlLnNsYWxvbU1vdmVtZW50TGVuZ3RoID0gdGhpcy5yYW5kb21OdW1iZXJGcm9tTWluVG9NYXgodGhpcy5zbGFsb21MZW5ndGgubWluLCB0aGlzLnNsYWxvbUxlbmd0aC5tYXgpO1xuICAgIH1cbiAgICAvLyBpZiBvdXQgb2YgdGhlIGJvYXJkIGZyb20gdGhlIGxlZnRcbiAgICBpZiAoc3ByaXRlLnBvc2l0aW9uWCA8IDApIHtcbiAgICAgIHNwcml0ZS5zbGFsb21Nb3ZlbWVudERpcmVjdGlvbiA9IFNsYWxvbURpcmVjdGlvbi5SSUdIVDtcbiAgICAgIHNwcml0ZS5zbGFsb21Nb3ZlbWVudExlbmd0aCA9IHRoaXMucmFuZG9tTnVtYmVyRnJvbU1pblRvTWF4KHRoaXMuc2xhbG9tTGVuZ3RoLm1pbiwgdGhpcy5zbGFsb21MZW5ndGgubWF4KTtcbiAgICB9XG5cbiAgICBpZiAoc3ByaXRlLnNsYWxvbU1vdmVtZW50RGlyZWN0aW9uID09PSBTbGFsb21EaXJlY3Rpb24uTEVGVCAmJiBzcHJpdGUuc2xhbG9tTW92ZW1lbnRMZW5ndGgpIHtcbiAgICAgIHNwcml0ZS5wb3NpdGlvblggPSBzcHJpdGUucG9zaXRpb25YIC0gc3ByaXRlLnNwZWVkO1xuICAgICAgc3ByaXRlLnNsYWxvbU1vdmVtZW50TGVuZ3RoLS07XG4gICAgfVxuXG4gICAgaWYgKHNwcml0ZS5zbGFsb21Nb3ZlbWVudERpcmVjdGlvbiA9PT0gU2xhbG9tRGlyZWN0aW9uLlJJR0hUICYmIHNwcml0ZS5zbGFsb21Nb3ZlbWVudExlbmd0aCkge1xuICAgICAgc3ByaXRlLnBvc2l0aW9uWCA9IHNwcml0ZS5wb3NpdGlvblggKyBzcHJpdGUuc3BlZWQ7XG4gICAgICBzcHJpdGUuc2xhbG9tTW92ZW1lbnRMZW5ndGgtLTtcbiAgICB9XG5cbiAgICBpZiAoc3ByaXRlLnNsYWxvbU1vdmVtZW50TGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBjaGFuZ2UgZGlyZWN0aW9uXG4gICAgICBpZiAoc3ByaXRlLnNsYWxvbU1vdmVtZW50RGlyZWN0aW9uID09PSBTbGFsb21EaXJlY3Rpb24uUklHSFQpIHtcbiAgICAgICAgc3ByaXRlLnNsYWxvbU1vdmVtZW50RGlyZWN0aW9uID0gU2xhbG9tRGlyZWN0aW9uLkxFRlQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzcHJpdGUuc2xhbG9tTW92ZW1lbnREaXJlY3Rpb24gPSBTbGFsb21EaXJlY3Rpb24uUklHSFQ7XG4gICAgICB9XG4gICAgICBzcHJpdGUuc2xhbG9tTW92ZW1lbnRMZW5ndGggPSB0aGlzLnJhbmRvbU51bWJlckZyb21NaW5Ub01heCh0aGlzLnNsYWxvbUxlbmd0aC5taW4sIHRoaXMuc2xhbG9tTGVuZ3RoLm1heCk7XG4gICAgfVxuICB9XG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxuICBvblJlc2l6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbnZhc1dpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgdGhpcy5jYW52YXNIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG5cbiAgICAvLyB1cGRhdGUgY2FudmFzIHNpemUgKHBvc3NpYmx5IHdpbmRvdyByZXNpemVkKVxuICAgIHRoaXMuY2FudmFzLm5hdGl2ZUVsZW1lbnQud2lkdGggPSB0aGlzLmNhbnZhc1dpZHRoO1xuICAgIHRoaXMuY2FudmFzLm5hdGl2ZUVsZW1lbnQuaGVpZ2h0ID0gdGhpcy5jYW52YXNIZWlnaHQ7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLndpbmRvd0FuaW1hdGlvbkZyYW1lKTtcbiAgfVxuXG59XG4iXX0=