UNPKG

matrix-react-sdk

Version:
136 lines (128 loc) 26 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.DefaultOptions = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _arrays = require("../../utils/arrays"); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } /* Copyright 2024 New Vector Ltd. Copyright 2021-2023 The Matrix.org Foundation C.I.C. Copyright 2022 Arseny Uskov SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ const DefaultOptions = exports.DefaultOptions = { maxCount: 120, gravity: 3.2, maxDrift: 5, maxRot: 5 }; const KEY_FRAME_INTERVAL = 15; // 15ms, roughly class Hearts { constructor(options) { (0, _defineProperty2.default)(this, "options", void 0); (0, _defineProperty2.default)(this, "context", null); (0, _defineProperty2.default)(this, "particles", []); (0, _defineProperty2.default)(this, "lastAnimationTime", 0); (0, _defineProperty2.default)(this, "colours", ["rgba(194,210,224,1)", "rgba(235,214,219,1)", "rgba(255,211,45,1)", "rgba(255,190,174,1)", "rgba(255,173,226,1)", "rgba(242,114,171,1)", "rgba(228,55,116,1)", "rgba(255,86,130,1)", "rgba(244,36,57,1)", "rgba(247,126,157,1)", "rgba(243,142,140,1)", "rgba(252,116,183,1)"]); (0, _defineProperty2.default)(this, "isRunning", false); (0, _defineProperty2.default)(this, "start", async (canvas, timeout = 3000) => { if (!canvas) { return; } this.context = canvas.getContext("2d"); this.particles = []; const count = this.options.maxCount; while (this.particles.length < count) { this.particles.push(this.resetParticle({}, canvas.width, canvas.height)); } this.isRunning = true; requestAnimationFrame(this.renderLoop); if (timeout) { window.setTimeout(this.stop, timeout); } }); (0, _defineProperty2.default)(this, "stop", async () => { this.isRunning = false; }); (0, _defineProperty2.default)(this, "resetParticle", (particle, width, height) => { particle.color = this.colours[Math.random() * this.colours.length | 0]; particle.x = Math.random() * width; particle.y = Math.random() * height + height; particle.xCol = particle.x; particle.scale = Math.random() * 0.07 + 0.04; particle.maximumDrift = Math.random() * this.options.maxDrift + 3.5; particle.maximumRot = Math.random() * this.options.maxRot + 3.5; particle.gravity = this.options.gravity + Math.random() * 4.8; return particle; }); (0, _defineProperty2.default)(this, "renderLoop", () => { if (!this.context || !this.context.canvas) { return; } if (this.particles.length === 0) { this.context.clearRect(0, 0, this.context.canvas.width, this.context.canvas.height); } else { const timeDelta = Date.now() - this.lastAnimationTime; if (timeDelta >= KEY_FRAME_INTERVAL || !this.lastAnimationTime) { // Clear the screen first this.context.clearRect(0, 0, this.context.canvas.width, this.context.canvas.height); this.lastAnimationTime = Date.now(); this.animateAndRenderHearts(); } requestAnimationFrame(this.renderLoop); } }); this.options = _objectSpread(_objectSpread({}, DefaultOptions), options); } animateAndRenderHearts() { if (!this.context || !this.context.canvas) { return; } for (const particle of (0, _arrays.arrayFastClone)(this.particles)) { particle.y -= particle.gravity; // We treat the drift as a sine function to have a more fluid-like movement instead // of a pong-like movement off walls of the X column. This means that for // $x=A\sin(\frac{2\pi}{P}y)$ we use the `maximumDrift` as the amplitude (A) and a // large multiplier to create a very long waveform through P. const peakDistance = 75 * particle.maximumDrift; const PI2 = Math.PI * 2; particle.x = 6 * particle.maximumDrift * Math.sin(0.7 * (PI2 / peakDistance) * particle.y); particle.x += particle.xCol; // bring the particle to the right place const posScale = 1 / particle.scale; const x = particle.x * posScale; const y = particle.y * posScale; this.context.save(); this.context.scale(particle.scale, particle.scale); this.context.beginPath(); // Rotate the heart about its centre. // The tilt of the heart is modelled similarly to its horizontal drift, // using a sine function. this.context.translate(248 + x, 215 + y); this.context.rotate(1 / 10 * particle.maximumRot * Math.sin(PI2 / peakDistance * particle.y * 0.8)); this.context.translate(-248 - x, -215 - y); // Use bezier curves to draw a heart using pre-calculated coordinates. this.context.moveTo(140 + x, 20 + y); this.context.bezierCurveTo(73 + x, 20 + y, 20 + x, 74 + y, 20 + x, 140 + y); this.context.bezierCurveTo(20 + x, 275 + y, 156 + x, 310 + y, 248 + x, 443 + y); this.context.bezierCurveTo(336 + x, 311 + y, 477 + x, 270 + y, 477 + x, 140 + y); this.context.bezierCurveTo(477 + x, 74 + y, 423 + x, 20 + y, 357 + x, 20 + y); this.context.bezierCurveTo(309 + x, 20 + y, 267 + x, 48 + y, 248 + x, 89 + y); this.context.bezierCurveTo(229 + x, 48 + y, 188 + x, 20 + y, 140 + x, 20 + y); this.context.closePath(); this.context.fillStyle = particle.color; this.context.fill(); this.context.restore(); // Remove any dead hearts after a 100px wide margin. if (particle.y < -100) { const idx = this.particles.indexOf(particle); this.particles.splice(idx, 1); } } } } exports.default = Hearts; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYXJyYXlzIiwicmVxdWlyZSIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJkZWZhdWx0IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIkRlZmF1bHRPcHRpb25zIiwiZXhwb3J0cyIsIm1heENvdW50IiwiZ3Jhdml0eSIsIm1heERyaWZ0IiwibWF4Um90IiwiS0VZX0ZSQU1FX0lOVEVSVkFMIiwiSGVhcnRzIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwiY2FudmFzIiwidGltZW91dCIsImNvbnRleHQiLCJnZXRDb250ZXh0IiwicGFydGljbGVzIiwiY291bnQiLCJyZXNldFBhcnRpY2xlIiwid2lkdGgiLCJoZWlnaHQiLCJpc1J1bm5pbmciLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJyZW5kZXJMb29wIiwid2luZG93Iiwic2V0VGltZW91dCIsInN0b3AiLCJwYXJ0aWNsZSIsImNvbG9yIiwiY29sb3VycyIsIk1hdGgiLCJyYW5kb20iLCJ4IiwieSIsInhDb2wiLCJzY2FsZSIsIm1heGltdW1EcmlmdCIsIm1heGltdW1Sb3QiLCJjbGVhclJlY3QiLCJ0aW1lRGVsdGEiLCJEYXRlIiwibm93IiwibGFzdEFuaW1hdGlvblRpbWUiLCJhbmltYXRlQW5kUmVuZGVySGVhcnRzIiwiYXJyYXlGYXN0Q2xvbmUiLCJwZWFrRGlzdGFuY2UiLCJQSTIiLCJQSSIsInNpbiIsInBvc1NjYWxlIiwic2F2ZSIsImJlZ2luUGF0aCIsInRyYW5zbGF0ZSIsInJvdGF0ZSIsIm1vdmVUbyIsImJlemllckN1cnZlVG8iLCJjbG9zZVBhdGgiLCJmaWxsU3R5bGUiLCJmaWxsIiwicmVzdG9yZSIsImlkeCIsImluZGV4T2YiLCJzcGxpY2UiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZWZmZWN0cy9oZWFydHMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjEtMjAyMyBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuQ29weXJpZ2h0IDIwMjIgQXJzZW55IFVza292XG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiAqL1xuaW1wb3J0IElDYW52YXNFZmZlY3QgZnJvbSBcIi4uL0lDYW52YXNFZmZlY3RcIjtcbmltcG9ydCB7IGFycmF5RmFzdENsb25lIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2FycmF5c1wiO1xuXG5leHBvcnQgdHlwZSBIZWFydE9wdGlvbnMgPSB7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGhlYXJ0cyB0byByZW5kZXIgYXQgYSBnaXZlbiB0aW1lXG4gICAgICovXG4gICAgbWF4Q291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIGdyYXZpdHkgdG8gYXBwbHkgdG8gdGhlIGhlYXJ0c1xuICAgICAqL1xuICAgIGdyYXZpdHk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgZHJpZnQgKGhvcml6b250YWwgc3dheSkgdG8gYXBwbHkgdG8gdGhlIGhlYXJ0cy4gRWFjaCBoZWFydCB2YXJpZXMuXG4gICAgICovXG4gICAgbWF4RHJpZnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGlsdCB0byBhcHBseSB0byB0aGUgaGVhcnQuIEVhY2ggaGVhcnQgdmFyaWVzLlxuICAgICAqL1xuICAgIG1heFJvdDogbnVtYmVyO1xufTtcblxudHlwZSBIZWFydCA9IHtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuICAgIHhDb2w6IG51bWJlcjtcbiAgICBzY2FsZTogbnVtYmVyO1xuICAgIG1heGltdW1EcmlmdDogbnVtYmVyO1xuICAgIG1heGltdW1Sb3Q6IG51bWJlcjtcbiAgICBncmF2aXR5OiBudW1iZXI7XG4gICAgY29sb3I6IHN0cmluZztcbn07XG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0T3B0aW9uczogSGVhcnRPcHRpb25zID0ge1xuICAgIG1heENvdW50OiAxMjAsXG4gICAgZ3Jhdml0eTogMy4yLFxuICAgIG1heERyaWZ0OiA1LFxuICAgIG1heFJvdDogNSxcbn07XG5cbmNvbnN0IEtFWV9GUkFNRV9JTlRFUlZBTCA9IDE1OyAvLyAxNW1zLCByb3VnaGx5XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhlYXJ0cyBpbXBsZW1lbnRzIElDYW52YXNFZmZlY3Qge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogSGVhcnRPcHRpb25zO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHsgW2tleTogc3RyaW5nXTogYW55IH0pIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0geyAuLi5EZWZhdWx0T3B0aW9ucywgLi4ub3B0aW9ucyB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBwYXJ0aWNsZXM6IEFycmF5PEhlYXJ0PiA9IFtdO1xuICAgIHByaXZhdGUgbGFzdEFuaW1hdGlvblRpbWUgPSAwO1xuXG4gICAgcHJpdmF0ZSBjb2xvdXJzID0gW1xuICAgICAgICBcInJnYmEoMTk0LDIxMCwyMjQsMSlcIixcbiAgICAgICAgXCJyZ2JhKDIzNSwyMTQsMjE5LDEpXCIsXG4gICAgICAgIFwicmdiYSgyNTUsMjExLDQ1LDEpXCIsXG4gICAgICAgIFwicmdiYSgyNTUsMTkwLDE3NCwxKVwiLFxuICAgICAgICBcInJnYmEoMjU1LDE3MywyMjYsMSlcIixcbiAgICAgICAgXCJyZ2JhKDI0MiwxMTQsMTcxLDEpXCIsXG4gICAgICAgIFwicmdiYSgyMjgsNTUsMTE2LDEpXCIsXG4gICAgICAgIFwicmdiYSgyNTUsODYsMTMwLDEpXCIsXG4gICAgICAgIFwicmdiYSgyNDQsMzYsNTcsMSlcIixcbiAgICAgICAgXCJyZ2JhKDI0NywxMjYsMTU3LDEpXCIsXG4gICAgICAgIFwicmdiYSgyNDMsMTQyLDE0MCwxKVwiLFxuICAgICAgICBcInJnYmEoMjUyLDExNiwxODMsMSlcIixcbiAgICBdO1xuXG4gICAgcHVibGljIGlzUnVubmluZyA9IGZhbHNlO1xuXG4gICAgcHVibGljIHN0YXJ0ID0gYXN5bmMgKGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsIHRpbWVvdXQgPSAzMDAwKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGlmICghY2FudmFzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgICAgdGhpcy5wYXJ0aWNsZXMgPSBbXTtcbiAgICAgICAgY29uc3QgY291bnQgPSB0aGlzLm9wdGlvbnMubWF4Q291bnQ7XG4gICAgICAgIHdoaWxlICh0aGlzLnBhcnRpY2xlcy5sZW5ndGggPCBjb3VudCkge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWNsZXMucHVzaCh0aGlzLnJlc2V0UGFydGljbGUoe30gYXMgSGVhcnQsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNSdW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMucmVuZGVyTG9vcCk7XG4gICAgICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnN0b3AsIHRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHB1YmxpYyBzdG9wID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICB0aGlzLmlzUnVubmluZyA9IGZhbHNlO1xuICAgIH07XG5cbiAgICBwcml2YXRlIHJlc2V0UGFydGljbGUgPSAocGFydGljbGU6IEhlYXJ0LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IEhlYXJ0ID0+IHtcbiAgICAgICAgcGFydGljbGUuY29sb3IgPSB0aGlzLmNvbG91cnNbKE1hdGgucmFuZG9tKCkgKiB0aGlzLmNvbG91cnMubGVuZ3RoKSB8IDBdO1xuICAgICAgICBwYXJ0aWNsZS54ID0gTWF0aC5yYW5kb20oKSAqIHdpZHRoO1xuICAgICAgICBwYXJ0aWNsZS55ID0gTWF0aC5yYW5kb20oKSAqIGhlaWdodCArIGhlaWdodDtcbiAgICAgICAgcGFydGljbGUueENvbCA9IHBhcnRpY2xlLng7XG4gICAgICAgIHBhcnRpY2xlLnNjYWxlID0gTWF0aC5yYW5kb20oKSAqIDAuMDcgKyAwLjA0O1xuICAgICAgICBwYXJ0aWNsZS5tYXhpbXVtRHJpZnQgPSBNYXRoLnJhbmRvbSgpICogdGhpcy5vcHRpb25zLm1heERyaWZ0ICsgMy41O1xuICAgICAgICBwYXJ0aWNsZS5tYXhpbXVtUm90ID0gTWF0aC5yYW5kb20oKSAqIHRoaXMub3B0aW9ucy5tYXhSb3QgKyAzLjU7XG4gICAgICAgIHBhcnRpY2xlLmdyYXZpdHkgPSB0aGlzLm9wdGlvbnMuZ3Jhdml0eSArIE1hdGgucmFuZG9tKCkgKiA0Ljg7XG4gICAgICAgIHJldHVybiBwYXJ0aWNsZTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSByZW5kZXJMb29wID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuY29udGV4dCB8fCAhdGhpcy5jb250ZXh0LmNhbnZhcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBhcnRpY2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5jbGVhclJlY3QoMCwgMCwgdGhpcy5jb250ZXh0LmNhbnZhcy53aWR0aCwgdGhpcy5jb250ZXh0LmNhbnZhcy5oZWlnaHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdGltZURlbHRhID0gRGF0ZS5ub3coKSAtIHRoaXMubGFzdEFuaW1hdGlvblRpbWU7XG4gICAgICAgICAgICBpZiAodGltZURlbHRhID49IEtFWV9GUkFNRV9JTlRFUlZBTCB8fCAhdGhpcy5sYXN0QW5pbWF0aW9uVGltZSkge1xuICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSBzY3JlZW4gZmlyc3RcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHRoaXMuY29udGV4dC5jYW52YXMud2lkdGgsIHRoaXMuY29udGV4dC5jYW52YXMuaGVpZ2h0KTtcblxuICAgICAgICAgICAgICAgIHRoaXMubGFzdEFuaW1hdGlvblRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgIHRoaXMuYW5pbWF0ZUFuZFJlbmRlckhlYXJ0cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMucmVuZGVyTG9vcCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBhbmltYXRlQW5kUmVuZGVySGVhcnRzKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY29udGV4dCB8fCAhdGhpcy5jb250ZXh0LmNhbnZhcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgcGFydGljbGUgb2YgYXJyYXlGYXN0Q2xvbmUodGhpcy5wYXJ0aWNsZXMpKSB7XG4gICAgICAgICAgICBwYXJ0aWNsZS55IC09IHBhcnRpY2xlLmdyYXZpdHk7XG5cbiAgICAgICAgICAgIC8vIFdlIHRyZWF0IHRoZSBkcmlmdCBhcyBhIHNpbmUgZnVuY3Rpb24gdG8gaGF2ZSBhIG1vcmUgZmx1aWQtbGlrZSBtb3ZlbWVudCBpbnN0ZWFkXG4gICAgICAgICAgICAvLyBvZiBhIHBvbmctbGlrZSBtb3ZlbWVudCBvZmYgd2FsbHMgb2YgdGhlIFggY29sdW1uLiBUaGlzIG1lYW5zIHRoYXQgZm9yXG4gICAgICAgICAgICAvLyAkeD1BXFxzaW4oXFxmcmFjezJcXHBpfXtQfXkpJCB3ZSB1c2UgdGhlIGBtYXhpbXVtRHJpZnRgIGFzIHRoZSBhbXBsaXR1ZGUgKEEpIGFuZCBhXG4gICAgICAgICAgICAvLyBsYXJnZSBtdWx0aXBsaWVyIHRvIGNyZWF0ZSBhIHZlcnkgbG9uZyB3YXZlZm9ybSB0aHJvdWdoIFAuXG4gICAgICAgICAgICBjb25zdCBwZWFrRGlzdGFuY2UgPSA3NSAqIHBhcnRpY2xlLm1heGltdW1EcmlmdDtcbiAgICAgICAgICAgIGNvbnN0IFBJMiA9IE1hdGguUEkgKiAyO1xuICAgICAgICAgICAgcGFydGljbGUueCA9IDYgKiBwYXJ0aWNsZS5tYXhpbXVtRHJpZnQgKiBNYXRoLnNpbigwLjcgKiAoUEkyIC8gcGVha0Rpc3RhbmNlKSAqIHBhcnRpY2xlLnkpO1xuICAgICAgICAgICAgcGFydGljbGUueCArPSBwYXJ0aWNsZS54Q29sOyAvLyBicmluZyB0aGUgcGFydGljbGUgdG8gdGhlIHJpZ2h0IHBsYWNlXG5cbiAgICAgICAgICAgIGNvbnN0IHBvc1NjYWxlID0gMSAvIHBhcnRpY2xlLnNjYWxlO1xuICAgICAgICAgICAgY29uc3QgeCA9IHBhcnRpY2xlLnggKiBwb3NTY2FsZTtcbiAgICAgICAgICAgIGNvbnN0IHkgPSBwYXJ0aWNsZS55ICogcG9zU2NhbGU7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5zYXZlKCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc2NhbGUocGFydGljbGUuc2NhbGUsIHBhcnRpY2xlLnNjYWxlKTtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5iZWdpblBhdGgoKTtcblxuICAgICAgICAgICAgLy8gUm90YXRlIHRoZSBoZWFydCBhYm91dCBpdHMgY2VudHJlLlxuICAgICAgICAgICAgLy8gVGhlIHRpbHQgb2YgdGhlIGhlYXJ0IGlzIG1vZGVsbGVkIHNpbWlsYXJseSB0byBpdHMgaG9yaXpvbnRhbCBkcmlmdCxcbiAgICAgICAgICAgIC8vIHVzaW5nIGEgc2luZSBmdW5jdGlvbi5cbiAgICAgICAgICAgIHRoaXMuY29udGV4dC50cmFuc2xhdGUoMjQ4ICsgeCwgMjE1ICsgeSk7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQucm90YXRlKCgxIC8gMTApICogcGFydGljbGUubWF4aW11bVJvdCAqIE1hdGguc2luKChQSTIgLyBwZWFrRGlzdGFuY2UpICogcGFydGljbGUueSAqIDAuOCkpO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnRyYW5zbGF0ZSgtMjQ4IC0geCwgLTIxNSAtIHkpO1xuXG4gICAgICAgICAgICAvLyBVc2UgYmV6aWVyIGN1cnZlcyB0byBkcmF3IGEgaGVhcnQgdXNpbmcgcHJlLWNhbGN1bGF0ZWQgY29vcmRpbmF0ZXMuXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQubW92ZVRvKDE0MCArIHgsIDIwICsgeSk7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuYmV6aWVyQ3VydmVUbyg3MyArIHgsIDIwICsgeSwgMjAgKyB4LCA3NCArIHksIDIwICsgeCwgMTQwICsgeSk7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuYmV6aWVyQ3VydmVUbygyMCArIHgsIDI3NSArIHksIDE1NiArIHgsIDMxMCArIHksIDI0OCArIHgsIDQ0MyArIHkpO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmJlemllckN1cnZlVG8oMzM2ICsgeCwgMzExICsgeSwgNDc3ICsgeCwgMjcwICsgeSwgNDc3ICsgeCwgMTQwICsgeSk7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuYmV6aWVyQ3VydmVUbyg0NzcgKyB4LCA3NCArIHksIDQyMyArIHgsIDIwICsgeSwgMzU3ICsgeCwgMjAgKyB5KTtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5iZXppZXJDdXJ2ZVRvKDMwOSArIHgsIDIwICsgeSwgMjY3ICsgeCwgNDggKyB5LCAyNDggKyB4LCA4OSArIHkpO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmJlemllckN1cnZlVG8oMjI5ICsgeCwgNDggKyB5LCAxODggKyB4LCAyMCArIHksIDE0MCArIHgsIDIwICsgeSk7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuY2xvc2VQYXRoKCk7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5maWxsU3R5bGUgPSBwYXJ0aWNsZS5jb2xvcjtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5maWxsKCk7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5yZXN0b3JlKCk7XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSBhbnkgZGVhZCBoZWFydHMgYWZ0ZXIgYSAxMDBweCB3aWRlIG1hcmdpbi5cbiAgICAgICAgICAgIGlmIChwYXJ0aWNsZS55IDwgLTEwMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IHRoaXMucGFydGljbGVzLmluZGV4T2YocGFydGljbGUpO1xuICAgICAgICAgICAgICAgIHRoaXMucGFydGljbGVzLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVNBLElBQUFBLE9BQUEsR0FBQUMsT0FBQTtBQUFvRCxTQUFBQyxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUss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