UNPKG

react-background-animation

Version:
263 lines (209 loc) 31.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _react = _interopRequireWildcard(require("react")); var _lodash = _interopRequireDefault(require("lodash")); var _jquery = _interopRequireDefault(require("jquery")); var _mosaicStyled = require("./mosaicStyled"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; if (obj != null) { var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } var MosaicGround = /*#__PURE__*/ function (_PureComponent) { _inherits(MosaicGround, _PureComponent); function MosaicGround(props) { var _this; _classCallCheck(this, MosaicGround); _this = _possibleConstructorReturn(this, _getPrototypeOf(MosaicGround).call(this, props)); _this.excuteEffect = _this.excuteEffect.bind(_assertThisInitialized(_this)); return _this; } _createClass(MosaicGround, [{ key: "excuteEffect", value: function excuteEffect() { (function () { var Photo, addListeners, canvas, createGrid, ctx, gridItem, grids, height, img, imgInfo, imgSrc, imgs, init, magnet, mouse, populateCanvas, _render, resizeCanvas, rotateAndPaintImage, updateMouse, useGrid, width; canvas = document.getElementById('canvas'); ctx = canvas.getContext('2d'); width = canvas.width = window.innerWidth; height = canvas.height = window.innerHeight; imgSrc = canvas.dataset.image; img = new Image(); useGrid = true; imgInfo = {}; imgs = []; grids = []; magnet = 2000; mouse = { x: 1, y: 0 }; init = function init() { addListeners(); img.onload = function (e) { var numberToShow; // Check for firefox. imgInfo.width = e.path ? e.path[0].width : e.target.width; imgInfo.height = e.path ? e.path[0].height : e.target.height; numberToShow = Math.ceil(window.innerWidth / imgInfo.width) * Math.ceil(window.innerHeight / imgInfo.height); if (useGrid) { createGrid(); } populateCanvas(numberToShow * 4); canvas.classList.add('ready'); return _render(); }; return img.src = imgSrc; }; addListeners = function addListeners() { window.addEventListener('resize', resizeCanvas); window.addEventListener('mousemove', updateMouse); return window.addEventListener('touchmove', updateMouse); }; updateMouse = function updateMouse(e) { mouse.x = e.clientX; return mouse.y = e.clientY; }; resizeCanvas = function resizeCanvas() { width = canvas.width = window.innerWidth; return height = canvas.height = window.innerHeight; }; populateCanvas = function populateCanvas(nb) { var i, p, results; i = 0; results = []; while (i <= nb) { p = new Photo(); imgs.push(p); results.push(i++); } return results; }; createGrid = function createGrid() { var c, grid, i, imgScale, item, j, k, l, r, ref, ref1, ref2, results, x, y; imgScale = 0.5; grid = { row: Math.ceil(window.innerWidth / (imgInfo.width * imgScale)), cols: Math.ceil(window.innerHeight / (imgInfo.height * imgScale)), rowWidth: imgInfo.width * imgScale, colHeight: imgInfo.height * imgScale }; for (r = j = 0, ref = grid.row; 0 <= ref ? j < ref : j > ref; r = 0 <= ref ? ++j : --j) { x = r * grid.rowWidth; for (c = k = 0, ref1 = grid.cols; 0 <= ref1 ? k < ref1 : k > ref1; c = 0 <= ref1 ? ++k : --k) { y = c * grid.colHeight; item = new gridItem(x, y, grid.rowWidth, grid.colHeight); grids.push(item); } } results = []; for (i = l = 0, ref2 = grids.length; 0 <= ref2 ? l < ref2 : l > ref2; i = 0 <= ref2 ? ++l : --l) { results.push(grids[i].draw()); } return results; }; gridItem = function gridItem() { var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var w = arguments.length > 2 ? arguments[2] : undefined; var h = arguments.length > 3 ? arguments[3] : undefined; this.draw = function () { ctx.drawImage(img, x, y, w, h); }; }; Photo = function Photo() { var TO_RADIANS, finalX, finalY, forceX, forceY, h, r, seed, w, x, y; seed = Math.random() * (2.5 - 0.7) + 0.7; w = imgInfo.width / seed; h = imgInfo.height / seed; x = window.innerWidth * Math.random(); finalX = x; y = window.innerHeight * Math.random(); finalY = y; console.log("INIT Y :: ".concat(finalY, " || INIT X :: ").concat(finalX)); r = Math.random() * (180 - -180) + -180; forceX = 0; forceY = 0; TO_RADIANS = Math.PI / 180; this.update = function () { var distance, dx, dy, powerX, powerY, x0, x1, y0, y1; x0 = x; y0 = y; x1 = mouse.x; y1 = mouse.y; dx = x1 - x0; dy = y1 - y0; distance = Math.sqrt(dx * dx + dy * dy); powerX = x0 - dx / distance * magnet / distance; powerY = y0 - dy / distance * magnet / distance; forceX = (forceX + (finalX - x0) / 2) / 2.1; forceY = (forceY + (finalY - y0) / 2) / 2.2; x = powerX + forceX; y = powerY + forceY; }; this.draw = function () { return rotateAndPaintImage(ctx, img, r * TO_RADIANS, x, y, w / 2, h / 2, w, h); }; }; rotateAndPaintImage = function rotateAndPaintImage(context, image, angle, positionX, positionY, axisX, axisY, widthX, widthY) { context.translate(positionX, positionY); context.rotate(angle); context.drawImage(image, -axisX, -axisY, widthX, widthY); context.rotate(-angle); return context.translate(-positionX, -positionY); }; _render = function render() { var x, y; x = 0; y = 0; ctx.clearRect(0, 0, width, height); while (y < grids.length) { grids[y].draw(); y++; } while (x < imgs.length) { imgs[x].update(); imgs[x].draw(); x++; } return requestAnimationFrame(_render); }; init(); }).call(this); } }, { key: "componentDidMount", value: function componentDidMount() { this.excuteEffect(); } }, { key: "render", value: function render() { var _this$props$dataImage = this.props.dataImage, dataImage = _this$props$dataImage === void 0 ? 'http://unsplash.it/g/450/200/?random=1' : _this$props$dataImage; return _react["default"].createElement("div", { className: this.props.className || '' }, _react["default"].createElement(_mosaicStyled.Mosaic, null, _react["default"].createElement("canvas", { id: "canvas", "data-image": dataImage }), _react["default"].createElement("div", { className: "intro" }))); } }]); return MosaicGround; }(_react.PureComponent); var _default = MosaicGround; exports["default"] = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jc3NFZmZlY3RzL21vc2FpY0dyb3VuZC9tb3NhaWMuanN4Il0sIm5hbWVzIjpbIk1vc2FpY0dyb3VuZCIsInByb3BzIiwiZXhjdXRlRWZmZWN0IiwiYmluZCIsIlBob3RvIiwiYWRkTGlzdGVuZXJzIiwiY2FudmFzIiwiY3JlYXRlR3JpZCIsImN0eCIsImdyaWRJdGVtIiwiZ3JpZHMiLCJoZWlnaHQiLCJpbWciLCJpbWdJbmZvIiwiaW1nU3JjIiwiaW1ncyIsImluaXQiLCJtYWduZXQiLCJtb3VzZSIsInBvcHVsYXRlQ2FudmFzIiwicmVuZGVyIiwicmVzaXplQ2FudmFzIiwicm90YXRlQW5kUGFpbnRJbWFnZSIsInVwZGF0ZU1vdXNlIiwidXNlR3JpZCIsIndpZHRoIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImdldENvbnRleHQiLCJ3aW5kb3ciLCJpbm5lcldpZHRoIiwiaW5uZXJIZWlnaHQiLCJkYXRhc2V0IiwiaW1hZ2UiLCJJbWFnZSIsIngiLCJ5Iiwib25sb2FkIiwiZSIsIm51bWJlclRvU2hvdyIsInBhdGgiLCJ0YXJnZXQiLCJNYXRoIiwiY2VpbCIsImNsYXNzTGlzdCIsImFkZCIsInNyYyIsImFkZEV2ZW50TGlzdGVuZXIiLCJjbGllbnRYIiwiY2xpZW50WSIsIm5iIiwiaSIsInAiLCJyZXN1bHRzIiwicHVzaCIsImMiLCJncmlkIiwiaW1nU2NhbGUiLCJpdGVtIiwiaiIsImsiLCJsIiwiciIsInJlZiIsInJlZjEiLCJyZWYyIiwicm93IiwiY29scyIsInJvd1dpZHRoIiwiY29sSGVpZ2h0IiwibGVuZ3RoIiwiZHJhdyIsInciLCJoIiwiZHJhd0ltYWdlIiwiVE9fUkFESUFOUyIsImZpbmFsWCIsImZpbmFsWSIsImZvcmNlWCIsImZvcmNlWSIsInNlZWQiLCJyYW5kb20iLCJjb25zb2xlIiwibG9nIiwiUEkiLCJ1cGRhdGUiLCJkaXN0YW5jZSIsImR4IiwiZHkiLCJwb3dlclgiLCJwb3dlclkiLCJ4MCIsIngxIiwieTAiLCJ5MSIsInNxcnQiLCJjb250ZXh0IiwiYW5nbGUiLCJwb3NpdGlvblgiLCJwb3NpdGlvblkiLCJheGlzWCIsImF4aXNZIiwid2lkdGhYIiwid2lkdGhZIiwidHJhbnNsYXRlIiwicm90YXRlIiwiY2xlYXJSZWN0IiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiY2FsbCIsImRhdGFJbWFnZSIsImNsYXNzTmFtZSIsIlB1cmVDb21wb25lbnQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFHQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFFTUEsWTs7Ozs7QUFFSix3QkFBWUMsS0FBWixFQUFtQjtBQUFBOztBQUFBOztBQUNqQixzRkFBTUEsS0FBTjtBQUNBLFVBQUtDLFlBQUwsR0FBb0IsTUFBS0EsWUFBTCxDQUFrQkMsSUFBbEIsK0JBQXBCO0FBRmlCO0FBR2xCOzs7O21DQUVjO0FBQ2IsT0FBQyxZQUFZO0FBQ1gsWUFBSUMsS0FBSixFQUFXQyxZQUFYLEVBQXlCQyxNQUF6QixFQUFpQ0MsVUFBakMsRUFBNkNDLEdBQTdDLEVBQWtEQyxRQUFsRCxFQUE0REMsS0FBNUQsRUFBbUVDLE1BQW5FLEVBQTJFQyxHQUEzRSxFQUFnRkMsT0FBaEYsRUFBeUZDLE1BQXpGLEVBQWlHQyxJQUFqRyxFQUF1R0MsSUFBdkcsRUFBNkdDLE1BQTdHLEVBQXFIQyxLQUFySCxFQUE0SEMsY0FBNUgsRUFBNElDLE9BQTVJLEVBQW9KQyxZQUFwSixFQUFrS0MsbUJBQWxLLEVBQXVMQyxXQUF2TCxFQUFvTUMsT0FBcE0sRUFBNk1DLEtBQTdNOztBQUVBbkIsUUFBQUEsTUFBTSxHQUFHb0IsUUFBUSxDQUFDQyxjQUFULENBQXdCLFFBQXhCLENBQVQ7QUFFQW5CLFFBQUFBLEdBQUcsR0FBR0YsTUFBTSxDQUFDc0IsVUFBUCxDQUFrQixJQUFsQixDQUFOO0FBRUFILFFBQUFBLEtBQUssR0FBR25CLE1BQU0sQ0FBQ21CLEtBQVAsR0FBZUksTUFBTSxDQUFDQyxVQUE5QjtBQUVBbkIsUUFB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L0csWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyBQdXJlQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnXHJcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCdcclxuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5J1xyXG5cclxuLy8gaW1wb3J0ICcuL21vc2FpYy5zY3NzJ1xyXG5pbXBvcnQgeyBNb3NhaWMgfSBmcm9tICcuL21vc2FpY1N0eWxlZCdcclxuXHJcbmNsYXNzIE1vc2FpY0dyb3VuZCBleHRlbmRzIFB1cmVDb21wb25lbnQge1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgc3VwZXIocHJvcHMpXHJcbiAgICB0aGlzLmV4Y3V0ZUVmZmVjdCA9IHRoaXMuZXhjdXRlRWZmZWN0LmJpbmQodGhpcylcclxuICB9XHJcblxyXG4gIGV4Y3V0ZUVmZmVjdCgpIHtcclxuICAgIChmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciBQaG90bywgYWRkTGlzdGVuZXJzLCBjYW52YXMsIGNyZWF0ZUdyaWQsIGN0eCwgZ3JpZEl0ZW0sIGdyaWRzLCBoZWlnaHQsIGltZywgaW1nSW5mbywgaW1nU3JjLCBpbWdzLCBpbml0LCBtYWduZXQsIG1vdXNlLCBwb3B1bGF0ZUNhbnZhcywgcmVuZGVyLCByZXNpemVDYW52YXMsIHJvdGF0ZUFuZFBhaW50SW1hZ2UsIHVwZGF0ZU1vdXNlLCB1c2VHcmlkLCB3aWR0aDtcclxuXHJcbiAgICAgIGNhbnZhcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYW52YXMnKTtcclxuXHJcbiAgICAgIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xyXG5cclxuICAgICAgd2lkdGggPSBjYW52YXMud2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcclxuXHJcbiAgICAgIGhlaWdodCA9IGNhbnZhcy5oZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XHJcblxyXG4gICAgICBpbWdTcmMgPSBjYW52YXMuZGF0YXNldC5pbWFnZTtcclxuXHJcbiAgICAgIGltZyA9IG5ldyBJbWFnZSgpO1xyXG5cclxuICAgICAgdXNlR3JpZCA9IHRydWU7XHJcblxyXG4gICAgICBpbWdJbmZvID0ge307XHJcblxyXG4gICAgICBpbWdzID0gW107XHJcblxyXG4gICAgICBncmlkcyA9IFtdO1xyXG5cclxuICAgICAgbWFnbmV0ID0gMjAwMDtcclxuXHJcbiAgICAgIG1vdXNlID0ge1xyXG4gICAgICAgIHg6IDEsXHJcbiAgICAgICAgeTogMFxyXG4gICAgICB9O1xyXG5cclxuXHJcbiAgICAgIGluaXQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgYWRkTGlzdGVuZXJzKCk7XHJcbiAgICAgICAgaW1nLm9ubG9hZCA9IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICB2YXIgbnVtYmVyVG9TaG93O1xyXG4gICAgICAgICAgLy8gQ2hlY2sgZm9yIGZpcmVmb3guIFxyXG4gICAgICAgICAgaW1nSW5mby53aWR0aCA9IGUucGF0aCA/IGUucGF0aFswXS53aWR0aCA6IGUudGFyZ2V0LndpZHRoO1xyXG4gICAgICAgICAgaW1nSW5mby5oZWlnaHQgPSBlLnBhdGggPyBlLnBhdGhbMF0uaGVpZ2h0IDogZS50YXJnZXQuaGVpZ2h0O1xyXG4gICAgICAgICAgbnVtYmVyVG9TaG93ID0gTWF0aC5jZWlsKHdpbmRvdy5pbm5lcldpZHRoIC8gaW1nSW5mby53aWR0aCkgKiBNYXRoLmNlaWwod2luZG93LmlubmVySGVpZ2h0IC8gaW1nSW5mby5oZWlnaHQpO1xyXG4gICAgICAgICAgaWYgKHVzZUdyaWQpIHtcclxuICAgICAgICAgICAgY3JlYXRlR3JpZCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcG9wdWxhdGVDYW52YXMobnVtYmVyVG9TaG93ICogNCk7XHJcbiAgICAgICAgICBjYW52YXMuY2xhc3NMaXN0LmFkZCgncmVhZHknKTtcclxuICAgICAgICAgIHJldHVybiByZW5kZXIoKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBpbWcuc3JjID0gaW1nU3JjO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgYWRkTGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCByZXNpemVDYW52YXMpO1xyXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB1cGRhdGVNb3VzZSk7XHJcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB1cGRhdGVNb3VzZSk7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICB1cGRhdGVNb3VzZSA9IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgbW91c2UueCA9IGUuY2xpZW50WDtcclxuICAgICAgICByZXR1cm4gbW91c2UueSA9IGUuY2xpZW50WTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHJlc2l6ZUNhbnZhcyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB3aWR0aCA9IGNhbnZhcy53aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xyXG4gICAgICAgIHJldHVybiBoZWlnaHQgPSBjYW52YXMuaGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgcG9wdWxhdGVDYW52YXMgPSBmdW5jdGlvbiAobmIpIHtcclxuICAgICAgICB2YXIgaSwgcCwgcmVzdWx0cztcclxuICAgICAgICBpID0gMDtcclxuICAgICAgICByZXN1bHRzID0gW107XHJcbiAgICAgICAgd2hpbGUgKGkgPD0gbmIpIHtcclxuICAgICAgICAgIHAgPSBuZXcgUGhvdG8oKTtcclxuICAgICAgICAgIGltZ3MucHVzaChwKTtcclxuICAgICAgICAgIHJlc3VsdHMucHVzaChpKyspO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0cztcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNyZWF0ZUdyaWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIGMsIGdyaWQsIGksIGltZ1NjYWxlLCBpdGVtLCBqLCBrLCBsLCByLCByZWYsIHJlZjEsIHJlZjIsIHJlc3VsdHMsIHgsIHk7XHJcbiAgICAgICAgaW1nU2NhbGUgPSAwLjU7XHJcbiAgICAgICAgZ3JpZCA9IHtcclxuICAgICAgICAgIHJvdzogTWF0aC5jZWlsKHdpbmRvdy5pbm5lcldpZHRoIC8gKGltZ0luZm8ud2lkdGggKiBpbWdTY2FsZSkpLFxyXG4gICAgICAgICAgY29sczogTWF0aC5jZWlsKHdpbmRvdy5pbm5lckhlaWdodCAvIChpbWdJbmZvLmhlaWdodCAqIGltZ1NjYWxlKSksXHJcbiAgICAgICAgICByb3dXaWR0aDogaW1nSW5mby53aWR0aCAqIGltZ1NjYWxlLFxyXG4gICAgICAgICAgY29sSGVpZ2h0OiBpbWdJbmZvLmhlaWdodCAqIGltZ1NjYWxlXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZm9yIChyID0gaiA9IDAsIHJlZiA9IGdyaWQucm93OyAwIDw9IHJlZiA/IGogPCByZWYgOiBqID4gcmVmOyByID0gMCA8PSByZWYgPyArK2ogOiAtLWopIHtcclxuICAgICAgICAgIHggPSByICogZ3JpZC5yb3dXaWR0aDtcclxuICAgICAgICAgIGZvciAoYyA9IGsgPSAwLCByZWYxID0gZ3JpZC5jb2xzOyAwIDw9IHJlZjEgPyBrIDwgcmVmMSA6IGsgPiByZWYxOyBjID0gMCA8PSByZWYxID8gKytrIDogLS1rKSB7XHJcbiAgICAgICAgICAgIHkgPSBjICogZ3JpZC5jb2xIZWlnaHQ7XHJcbiAgICAgICAgICAgIGl0ZW0gPSBuZXcgZ3JpZEl0ZW0oeCwgeSwgZ3JpZC5yb3dXaWR0aCwgZ3JpZC5jb2xIZWlnaHQpO1xyXG4gICAgICAgICAgICBncmlkcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXN1bHRzID0gW107XHJcbiAgICAgICAgZm9yIChpID0gbCA9IDAsIHJlZjIgPSBncmlkcy5sZW5ndGg7IDAgPD0gcmVmMiA/IGwgPCByZWYyIDogbCA+IHJlZjI7IGkgPSAwIDw9IHJlZjIgPyArK2wgOiAtLWwpIHtcclxuICAgICAgICAgIHJlc3VsdHMucHVzaChncmlkc1tpXS5kcmF3KCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0cztcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGdyaWRJdGVtID0gZnVuY3Rpb24gKHggPSAwLCB5ID0gMCwgdywgaCkge1xyXG4gICAgICAgIHRoaXMuZHJhdyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCB4LCB5LCB3LCBoKTtcclxuICAgICAgICB9O1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgUGhvdG8gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIFRPX1JBRElBTlMsIGZpbmFsWCwgZmluYWxZLCBmb3JjZVgsIGZvcmNlWSwgaCwgciwgc2VlZCwgdywgeCwgeTtcclxuICAgICAgICBzZWVkID0gTWF0aC5yYW5kb20oKSAqICgyLjUgLSAwLjcpICsgMC43O1xyXG4gICAgICAgIHcgPSBpbWdJbmZvLndpZHRoIC8gc2VlZDtcclxuICAgICAgICBoID0gaW1nSW5mby5oZWlnaHQgLyBzZWVkO1xyXG4gICAgICAgIHggPSB3aW5kb3cuaW5uZXJXaWR0aCAqIE1hdGgucmFuZG9tKCk7XHJcbiAgICAgICAgZmluYWxYID0geDtcclxuICAgICAgICB5ID0gd2luZG93LmlubmVySGVpZ2h0ICogTWF0aC5yYW5kb20oKTtcclxuICAgICAgICBmaW5hbFkgPSB5O1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGBJTklUIFkgOjogJHtmaW5hbFl9IHx8IElOSVQgWCA6OiAke2ZpbmFsWH1gKTtcclxuICAgICAgICByID0gTWF0aC5yYW5kb20oKSAqICgxODAgLSAtMTgwKSArIC0xODA7XHJcbiAgICAgICAgZm9yY2VYID0gMDtcclxuICAgICAgICBmb3JjZVkgPSAwO1xyXG4gICAgICAgIFRPX1JBRElBTlMgPSBNYXRoLlBJIC8gMTgwO1xyXG4gICAgICAgIHRoaXMudXBkYXRlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgdmFyIGRpc3RhbmNlLCBkeCwgZHksIHBvd2VyWCwgcG93ZXJZLCB4MCwgeDEsIHkwLCB5MTtcclxuICAgICAgICAgIHgwID0geDtcclxuICAgICAgICAgIHkwID0geTtcclxuICAgICAgICAgIHgxID0gbW91c2UueDtcclxuICAgICAgICAgIHkxID0gbW91c2UueTtcclxuICAgICAgICAgIGR4ID0geDEgLSB4MDtcclxuICAgICAgICAgIGR5ID0geTEgLSB5MDtcclxuICAgICAgICAgIGRpc3RhbmNlID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTtcclxuICAgICAgICAgIHBvd2VyWCA9IHgwIC0gZHggLyBkaXN0YW5jZSAqIG1hZ25ldCAvIGRpc3RhbmNlO1xyXG4gICAgICAgICAgcG93ZXJZID0geTAgLSBkeSAvIGRpc3RhbmNlICogbWFnbmV0IC8gZGlzdGFuY2U7XHJcbiAgICAgICAgICBmb3JjZVggPSAoZm9yY2VYICsgKGZpbmFsWCAtIHgwKSAvIDIpIC8gMi4xO1xyXG4gICAgICAgICAgZm9yY2VZID0gKGZvcmNlWSArIChmaW5hbFkgLSB5MCkgLyAyKSAvIDIuMjtcclxuICAgICAgICAgIHggPSBwb3dlclggKyBmb3JjZVg7XHJcbiAgICAgICAgICB5ID0gcG93ZXJZICsgZm9yY2VZO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5kcmF3ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgcmV0dXJuIHJvdGF0ZUFuZFBhaW50SW1hZ2UoY3R4LCBpbWcsIHIgKiBUT19SQURJQU5TLCB4LCB5LCB3IC8gMiwgaCAvIDIsIHcsIGgpO1xyXG4gICAgICAgIH07XHJcbiAgICAgIH07XHJcblxyXG4gICAgICByb3RhdGVBbmRQYWludEltYWdlID0gZnVuY3Rpb24gKGNvbnRleHQsIGltYWdlLCBhbmdsZSwgcG9zaXRpb25YLCBwb3NpdGlvblksIGF4aXNYLCBheGlzWSwgd2lkdGhYLCB3aWR0aFkpIHtcclxuICAgICAgICBjb250ZXh0LnRyYW5zbGF0ZShwb3NpdGlvblgsIHBvc2l0aW9uWSk7XHJcbiAgICAgICAgY29udGV4dC5yb3RhdGUoYW5nbGUpO1xyXG4gICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGltYWdlLCAtYXhpc1gsIC1heGlzWSwgd2lkdGhYLCB3aWR0aFkpO1xyXG4gICAgICAgIGNvbnRleHQucm90YXRlKC1hbmdsZSk7XHJcbiAgICAgICAgcmV0dXJuIGNvbnRleHQudHJhbnNsYXRlKC1wb3NpdGlvblgsIC1wb3NpdGlvblkpO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgcmVuZGVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciB4LCB5O1xyXG4gICAgICAgIHggPSAwO1xyXG4gICAgICAgIHkgPSAwO1xyXG4gICAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XHJcbiAgICAgICAgd2hpbGUgKHkgPCBncmlkcy5sZW5ndGgpIHtcclxuICAgICAgICAgIGdyaWRzW3ldLmRyYXcoKTtcclxuICAgICAgICAgIHkrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgd2hpbGUgKHggPCBpbWdzLmxlbmd0aCkge1xyXG4gICAgICAgICAgaW1nc1t4XS51cGRhdGUoKTtcclxuICAgICAgICAgIGltZ3NbeF0uZHJhdygpO1xyXG4gICAgICAgICAgeCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJlbmRlcik7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBpbml0KCk7XHJcblxyXG4gICAgfSkuY2FsbCh0aGlzKTtcclxuICB9XHJcblxyXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xyXG4gICAgdGhpcy5leGN1dGVFZmZlY3QoKVxyXG4gIH1cclxuXHJcbiAgcmVuZGVyKCkge1xyXG4gICAgY29uc3QgeyBkYXRhSW1hZ2UgPSAnaHR0cDovL3Vuc3BsYXNoLml0L2cvNDUwLzIwMC8/cmFuZG9tPTEnIH0gPSB0aGlzLnByb3BzXHJcbiAgICByZXR1cm4gKFxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgJyd9PlxyXG4gICAgICAgIDxNb3NhaWM+XHJcbiAgICAgICAgICA8Y2FudmFzIGlkPVwiY2FudmFzXCIgZGF0YS1pbWFnZT17ZGF0YUltYWdlfT48L2NhbnZhcz5cclxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaW50cm9cIj48L2Rpdj5cclxuICAgICAgICA8L01vc2FpYz5cclxuICAgICAgPC9kaXY+XHJcbiAgICApXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBNb3NhaWNHcm91bmQiXX0=