(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/__qc_index__.js'; var __require = nodeEnv ? function (request) { return cc.require(request); } : function (request) { return __quick_compile_project__.require(request, __filename); }; function __define (exports, require, module) { if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);} require('./assets/Script/DrawingBoard'); require('./assets/Script/Game'); } if (nodeEnv) { __define(__module.exports, __require, __module); } else { __quick_compile_project__.registerModuleFunc(__filename, function () { __define(__module.exports, __require, __module); }); } })(); //------QC-SOURCE-SPLIT------ (function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Script/DrawingBoard.js'; var __require = nodeEnv ? function (request) { return cc.require(request); } : function (request) { return __quick_compile_project__.require(request, __filename); }; function __define (exports, require, module) { if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict"; cc._RF.push(module, '2e8d2n1khFBWb8oCWax7o8C', 'DrawingBoard'); // Script/DrawingBoard.ts "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** * 画板: * 可使用任意颜色绘制矩形,三角形,圆,直线,并统计每种颜色的像素个数 * 擦除图案时,设置画板的颜色为透明色再进行绘制即可 * @href https://forum.cocos.org/t/topic/89902 */ var DrawingBoard = /** @class */ (function () { /** * 可对每个像素点绘制的画板,画板使用的坐标系原点为左下角,X轴向右为正,Y轴向上为正 * @param width 画板宽度 * @param height 画板高度 * @param data 指定画板初始内容,参数为记录颜色分量的一维数组,不传入参数时,画板中全部像素为透明 */ function DrawingBoard(width, height, data) { this.init(width, height, data); } Object.defineProperty(DrawingBoard.prototype, "width", { /**画板宽度 */ get: function () { return this._witdh; }, enumerable: false, configurable: true }); Object.defineProperty(DrawingBoard.prototype, "height", { /**画板高度 */ get: function () { return this._height; }, enumerable: false, configurable: true }); //#region 初始化 /** * 对画板进行初始化,会清空已绘制的所有内容 * @param width 画板宽度 * @param height 画板高度 * @param data 指定画板初始内容,参数为记录颜色分量的一维数组,不传入参数时,画板内容为全部透明的矩形 */ DrawingBoard.prototype.init = function (width, height, data) { this.tempColor = this.tempR = this.tempG = this.tempB = this.tempA = 0; this.curColor = 0; this._witdh = Math.round(width); this._height = Math.round(height); this.initPointColor(); this.initMaskPoint(); this.initPixelColor(); this.initLineData(); if (!!data) { this.setData(data); } }; DrawingBoard.prototype.initPointColor = function () { if (!this.pointColor) { this.pointColor = []; } for (var x = 0; x < this.width; ++x) { if (!this.pointColor[x]) { this.pointColor[x] = []; } for (var y = 0; y < this.height; ++y) { this.pointColor[x][y] = 0; } } this.colorCount = {}; this.colorCount[0] = this.width * this.height; }; DrawingBoard.prototype.initMaskPoint = function () { if (!this.maskPoint) { this.maskPoint = []; } for (var x = 0; x < this.width; ++x) { if (!this.maskPoint[x]) { this.maskPoint[x] = []; } for (var y = 0; y < this.height; ++y) { this.maskPoint[x][y] = 1; } } }; DrawingBoard.prototype.initPixelColor = function () { this.buffer = new ArrayBuffer(this.width * this.height * 4); this.pixelColor = new Uint8Array(this.buffer); this.pixelColor.fill(0); }; //#endregion //#region 重置内容 /**重置画板,画板的宽高不变,但会清空已绘制的所有内容,恢复至透明状态 */ DrawingBoard.prototype.reset = function () { this.resetPointColor(); this.resetMaskPoint(); this.resetPixelColor(); }; DrawingBoard.prototype.resetPointColor = function () { for (var x = this.width - 1; x >= 0; --x) { for (var y = this.height - 1; y >= 0; --y) { this.pointColor[x][y] = 0; } } for (var key in this.colorCount) { this.colorCount[key] = 0; } }; DrawingBoard.prototype.resetMaskPoint = function () { for (var x = this.width - 1; x >= 0; --x) { for (var y = this.height - 1; y >= 0; --y) { this.maskPoint[x][y] = 1; } } }; DrawingBoard.prototype.resetPixelColor = function () { this.pixelColor.fill(0); }; //#endregion /** * 传入图像的像素数据,直接设置画板的内容,图像尺寸必须与画板一致,若需要重新设置画板大小,请使用 init() 函数 * @param data 记录各像素颜色分量的一维数组 */ DrawingBoard.prototype.setData = function (data) { var pixelData = new Uint8Array(data); if (pixelData.length != this.width * this.height * 4) { console.warn("画板设置数据失败,数据长度与画板大小不一致。"); return; } this.setPixelColorByRGBA(pixelData); this.setPointColorByRGBA(pixelData); }; /** * 记录各像素颜色分量 * @param data 颜色分量一维数组 */ DrawingBoard.prototype.setPixelColorByRGBA = function (data) { this.pixelColor.set(data); }; /** * 按像素点的坐标记录像素点的颜色值 * @param data 颜色分量一维数组 */ DrawingBoard.prototype.setPointColorByRGBA = function (data) { this.colorCount = {}; for (var y = 0; y < this.height; ++y) { var i = y * this.height; for (var x = 0; x < this.width; ++x) { var color = this.convertToNumber(data[i++], data[i++], data[i++], data[i++]); this.pointColor[x][y] = color; if (!this.colorCount[color]) { this.colorCount[color] = 1; } else { this.colorCount[color] += 1; } } } }; /** * 设置不能绘制图案的像素区域 * @param data 像素坐标为索引,0表示不能绘制,1表示能绘制 */ DrawingBoard.prototype.setMask = function (data) { for (var x = this.width - 1; x >= 0; --x) { if (!!data[x]) { for (var y = this.height - 1; y >= 0; --y) { if (undefined != data[x][y]) { this.maskPoint[x][y] = data[x][y]; } } } } }; /** * 设置画板为全部区域都不能绘制 */ DrawingBoard.prototype.setDisable = function () { for (var x = this.width - 1; x >= 0; --x) { for (var y = this.height - 1; y >= 0; --y) { this.maskPoint[x][y] = 0; } } }; /** * 在现有可绘制区域的基础上添加可以绘制的像素点区域。 * 此方法不会禁用画板当前可绘制的像素点区域,只会添加新的可绘制区域 * @param data 像素坐标为索引,0表示不能绘制,1表示能绘制 */ DrawingBoard.prototype.addEnablePoints = function (data) { for (var x = this.width - 1; x >= 0; --x) { if (!!data[x]) { for (var y = this.height - 1; y >= 0; --y) { if (!!data[x][y]) { this.maskPoint[x][y] = data[x][y]; } } } } }; /** * 获取画板中的数据 * @param data 用于接收数据的数组 * @returns {number[]} 返回存储各像素点颜色分量的一维数组 */ DrawingBoard.prototype.copyData = function (data) { if (undefined === data) { data = []; } for (var i = 0, count = this.pixelColor.length; i < count; ++i) { data[i] = this.pixelColor[i]; } return data; }; /** * 获取画板中记录每个像素的颜色分量的数据 * @returns 将直接返回画板内部的数组;注:若使用者需要对该数据进行修改,请使用 copyData 方法获取,以免影响画板的像素个数计数功能 */ DrawingBoard.prototype.getData = function () { return this.pixelColor; }; /**获取画板内部使用的内存块,若仅需要获取像素数据,不进一步处理,使用 getData 即可 */ DrawingBoard.prototype.getBuffer = function () { return this.buffer; }; DrawingBoard.prototype.getPointData = function () { return this.pointColor; }; /** * 获取指定颜色的像素的个数 * @param r 颜色的r分量 * @param g 颜色的g分量 * @param b 颜色的b分量 * @param a 颜色透明度,默认为255 */ DrawingBoard.prototype.getColorCount = function (r, g, b, a) { if (a === void 0) { a = 255; } var c = this.convertToNumber(r, g, b, a); return this.colorCount[c]; }; /** * 设置画板绘制图案使使用的颜色 * @param r 包含RGBA分量的颜色对象,或者颜色的r分量 * @param g 颜色的g分量 * @param b 颜色的b分量 * @param a 颜色透明度,默认为255 */ DrawingBoard.prototype.setColor = function (r, g, b, a) { if (a === void 0) { a = 255; } this.curColor = this.convertToNumber(r, g, b, a); if (!this.colorCount[this.curColor]) { this.colorCount[this.curColor] = 0; } this.tempColor = this.curColor; this.tempR = r; this.tempG = g; this.tempB = b; this.tempA = a; }; /**清空所有已绘制的内容 */ DrawingBoard.prototype.clear = function () { this.reset(); }; DrawingBoard.prototype.initLineData = function () { this.previousLineEndPos = new Vec2(); this.previousLineEndPosT = new Vec2(); this.previousLineEndPosB = new Vec2(); this.previousLineCircleEnd = true; this.previousLineWidth = 1; }; /** * 移动画笔到指定的位置,调用 lineTo 函数时将使用该点作为直线的起点 * @param x 坐标X * @param y 坐标Y */ DrawingBoard.prototype.moveTo = function (x, y) { x = Math.round(x); y = Math.round(y); this.previousLineEndPos.set(x, y); this.previousLineEndPosT.set(x, y); this.previousLineEndPosB.set(x, y); }; /** * 设置线宽 */ DrawingBoard.prototype.setLineWidth = function (w) { this.previousLineWidth = w; }; /** * 设置线段端点样式 * @param b 线段端点是否为圆形 */ DrawingBoard.prototype.setLineCircleEnd = function (b) { this.previousLineCircleEnd = b; }; /** * 绘制直线,使用默认的颜色、线宽和线段端点样式 * @param x1 起点坐标X * @param y1 起点坐标Y * @param x2 终点坐标X * @param y2 终点坐标Y */ DrawingBoard.prototype.line = function (x1, y1, x2, y2) { x1 = Math.round(x1); x2 = Math.round(x2); y1 = Math.round(y1); y2 = Math.round(y2); if (x1 == x2 && y1 == y2) return; var width = this.previousLineWidth; var circleEnd = this.previousLineCircleEnd; this.previousLineEndPos.set(x2, y2); var offsetX = 0; var offsetY = 0; var rateK = 1; if (x1 == x2) { offsetX = Math.round(width * 0.5); } else if (y1 == y2) { offsetY = Math.round(width * 0.5); } else { var k = (y2 - y1) / (x2 - x1); rateK = Math.sqrt(k * k + 1); offsetY = width * 0.5 / rateK; offsetX = Math.round(offsetY * k); offsetY = Math.round(offsetY); } this.previousLineEndPosT.set(x2 - offsetX, y2 + offsetY); this.previousLineEndPosB.set(x2 + offsetX, y2 - offsetY); var p1 = new Vec2(x1, y1); var p2 = new Vec2(x2, y2); if (x1 > x2) { p1.x = x2; p1.y = y2; p2.x = x1; p2.y = y1; } this._drawLine(p1, p2, width, offsetX, offsetY, rateK); if (circleEnd) { this._drawCircle(x1, y1, width * 0.5); this._drawCircle(x2, y2, width * 0.5); } }; /** * 绘制到指定坐标的直线,起点为上一次绘制的直线的终点,使用默认的颜色、宽度和线段端点样式 * @param x 终点坐标X * @param y 终点坐标Y */ DrawingBoard.prototype.lineTo = function (x, y) { x = Math.round(x); y = Math.round(y); if (this.previousLineEndPos.x == x && this.previousLineEndPos.y == y) return; var width = this.previousLineWidth; var circleEnd = this.previousLineCircleEnd; var x1 = this.previousLineEndPos.x; var y1 = this.previousLineEndPos.y; var x2 = x; var y2 = y; if (x1 > x2) { x1 = x2; y1 = y2; x2 = this.previousLineEndPos.x; y2 = this.previousLineEndPos.y; } var offsetX = 0; var offsetY = 0; var rateK = 1; if (x1 == x2) { offsetX = Math.round(width * 0.5); } else if (y1 == y2) { offsetY = Math.round(width * 0.5); } else { var k = (y2 - y1) / (x2 - x1); rateK = Math.sqrt(k * k + 1); offsetY = width * 0.5 / rateK; offsetX = Math.round(offsetY * k); offsetY = Math.round(offsetY); } if (!circleEnd) { if (this.previousLineEndPos.x != this.previousLineEndPosT.x || this.previousLineEndPos.y != this.previousLineEndPosT.y) { var p1 = new Vec2(this.previousLineEndPos.x - offsetX, this.previousLineEndPos.y + offsetY); var p2 = new Vec2(this.previousLineEndPos.x + offsetX, this.previousLineEndPos.y - offsetY); this._drawTriangle([p1, p2, this.previousLineEndPosT]); this._drawTriangle([p1, p2, this.previousLineEndPosB]); } } else { this._drawCircle(x1, y1, width * 0.5); this._drawCircle(x2, y2, width * 0.5); } this._drawLine(new Vec2(x1, y1), new Vec2(x2, y2), width, offsetX, offsetY, rateK); this.previousLineEndPos.set(x, y); this.previousLineEndPosT.set(x - offsetX, y + offsetY); this.previousLineEndPosB.set(x + offsetX, y - offsetY); }; /** * 绘制直线,不包含线段端点样式 * @param p1 线段起点坐标 * @param p2 线段终点坐标 * @param width 线段宽度 * @param color 线段颜色 */ DrawingBoard.prototype._drawLine = function (p1, p2, width, offsetX, offsetY, slopeRate) { if (p1.y == p2.y) { //水平直线 var x = p1.x < p2.x ? p1.x : p2.x; this._drawRect(new Vec2(x, Math.round(p1.y - width * 0.5)), Math.abs(p1.x - p2.x), width); } else if (p1.x == p2.x) { //垂直直线 var y = p1.y < p2.y ? p1.y : p2.y; this._drawRect(new Vec2(Math.round(p1.x - width * 0.5), y), width, Math.abs(p1.y - p2.y)); } else { //倾斜直线 var inverseK = (p1.x - p2.x) / (p1.y - p2.y); var p1t = new Vec2(p1.x - offsetX, p1.y + offsetY); var p1b = new Vec2(p1.x + offsetX, p1.y - offsetY); var p2t = new Vec2(p2.x - offsetX, p2.y + offsetY); var p2b = new Vec2(p2.x + offsetX, p2.y - offsetY); var p1c = new Vec2(); var p2c = new Vec2(); var height = Math.round(width * slopeRate); if (p2.y > p1.y) { if (p1b.x < p2t.x) { p1c.x = p1b.x; p1c.y = p1b.y + height; p2c.x = p2t.x; p2c.y = p2t.y - height; this._drawVerticalTriangle(p1c, p1b, p1t); this._drawParallelogram(p1b, p2c, height); this._drawVerticalTriangle(p2t, p2c, p2b); } else { p1c.x = p1b.x; p1c.y = Math.round(p2t.y - (p1c.x - p2t.x) * inverseK); p2c.x = p2t.x; p2c.y = Math.round(p1b.y + (p1b.x - p2c.x) * inverseK); this._drawVerticalTriangle(p2t, p2c, p1t); this._drawParallelogram(p2c, p1b, p2t.y - p2c.y); this._drawVerticalTriangle(p1c, p1b, p2b); } } else { if (p1t.x < p2b.x) { p1c.x = p1t.x; p1c.y = p1t.y - height; p2c.x = p2b.x; p2c.y = p2b.y + height; this._drawVerticalTriangle(p1t, p1c, p1b); this._drawParallelogram(p1c, p2b, height); this._drawVerticalTriangle(p2c, p2b, p2t); } else { p1c.x = p1t.x; p1c.y = Math.round(p2b.y - (p1c.x - p2b.x) * inverseK); p2c.x = p2b.x; p2c.y = Math.round(p1t.y + (p1t.x - p2c.x) * inverseK); this._drawVerticalTriangle(p2c, p2b, p1b); this._drawParallelogram(p2b, p1c, p1t.y - p1c.y); this._drawVerticalTriangle(p1t, p1c, p2t); } } } }; //#endregion //#region 绘制:矩形 /** * 绘制矩形 * @param x 矩形左下角的坐标X * @param y 矩形左下角的坐标Y * @param w 矩形宽度 * @param h 矩形高度 */ DrawingBoard.prototype.rect = function (x, y, w, h) { x = Math.round(x); y = Math.round(y); this._drawRect(new Vec2(x, y), w, h); }; /** * 绘制矩形 * @param p 矩形左下顶点的坐标 * @param w 矩形宽度 * @param h 矩形高度 * @param color 矩形填充的颜色 */ DrawingBoard.prototype._drawRect = function (p, w, h) { var minX = this.clampX(p.x); var maxX = this.clampX(p.x + w); var minY = this.clampY(p.y); var maxY = this.clampY(p.y + h); // for (let x = minX; x <= maxX; ++x) { // for (let y = minY; y <= maxY; ++y) { // this._drawPixel(x, y); // } // } for (var y = minY; y <= maxY; ++y) { this._drawRowPixel(minX, maxX, y); } }; /** * 绘制平行四边形,平行四边形的左右两边与Y轴平行 * @param p1 左下顶点坐标 * @param p2 右下顶点坐标 * @param height 垂直边高度 * @param color 颜色 */ DrawingBoard.prototype._drawParallelogram = function (p1, p2, height) { if (p1.x == p2.x) return; var k = (p2.y - p1.y) / (p2.x - p1.x); var minX = this._minX(p1.x); var maxX = this._maxX(p2.x); for (var x = minX; x <= maxX; ++x) { var minY = p1.y + Math.round((x - p1.x) * k); var maxY = minY + height; minY = this._minY(minY); maxY = this._maxY(maxY); this._drawColPixel(minY, maxY, x); // for (let y = minY; y <= maxY; ++y) { // this._drawPixel(x, y); // } } }; //#endregion //#region 绘制:三角形 /** * 绘制三角形 * @param x1 顶点1坐标X * @param y1 顶点1坐标Y * @param x2 顶点2坐标X * @param y2 顶点2坐标Y * @param x3 顶点3坐标X * @param y3 顶点3坐标Y */ DrawingBoard.prototype.triangle = function (x1, y1, x2, y2, x3, y3) { x1 = Math.round(x1); y1 = Math.round(y1); x2 = Math.round(x2); y2 = Math.round(y2); x3 = Math.round(x3); y3 = Math.round(y3); var pList = []; pList.push(new Vec2(x1, y1)); pList.push(new Vec2(x2, y2)); pList.push(new Vec2(x3, y3)); this._drawTriangle(pList); }; /** * 绘制任意三角形 * @param p1 顶点坐标 * @param p2 * @param p3 * @param color 填充颜色 */ DrawingBoard.prototype._drawTriangle = function (pList) { pList.sort(function (a, b) { return a.x - b.x; }); var p1 = pList[0]; var p2 = pList[1]; var p3 = pList[2]; if (p1.x == p2.x) { if (p1.x == p3.x) return; if (p1.y < p2.y) { p1 = pList[1]; p2 = pList[0]; } this._drawVerticalTriangle(p1, p2, p3); return; } var k = (p3.y - p1.y) / (p3.x - p1.x); var p4 = new Vec2(p2.x, Math.round(p1.y + (p2.x - p1.x) * k)); if (p4.y == p2.y) return; if (p4.y < p2.y) { this._drawVerticalTriangle(p2, p4, p1); this._drawVerticalTriangle(p2, p4, p3); } else { this._drawVerticalTriangle(p4, p2, p1); this._drawVerticalTriangle(p4, p2, p3); } }; /** * 绘制一条边与Y轴平行的三角形 * @param p1 三角形垂直边的 上 顶点坐标 * @param p2 三角形垂直边的 下 顶点坐标 * @param p3 三角形 左侧或右侧 顶点坐标 * @param color 要绘制的颜色 */ DrawingBoard.prototype._drawVerticalTriangle = function (p1, p2, p3) { if (p3.x == p1.x) return; var k1 = (p3.y - p1.y) / (p3.x - p1.x); var k2 = (p3.y - p2.y) / (p3.x - p2.x); var maxX = p3.x, minX = p1.x; if (maxX < minX) { maxX = p1.x; minX = p3.x; } minX = this._minX(minX); maxX = this._maxX(maxX); for (var x = minX; x <= maxX; ++x) { var maxY = this.clampY(Math.round(p1.y + (x - p1.x) * k1)); var minY = this.clampY(Math.round(p2.y + (x - p2.x) * k2)); this._drawColPixel(minY, maxY, x); // for (let y = minY; y <= maxY; ++y) { // this._drawPixel(x, y); // } } }; //#endregion //#region 绘制:圆 /** * 绘制一个圆 * @param x 圆心坐标x * @param y 圆心坐标y * @param radius 圆的半径 */ DrawingBoard.prototype.circle = function (x, y, radius) { x = Math.round(x); y = Math.round(y); this._drawCircle(x, y, radius); }; DrawingBoard.prototype._drawCircle = function (x, y, radius) { radius = Math.round(radius); if (radius == 0) return; //三角形的斜边的平方 var dis = radius * radius; // let minX = this._minX(x - radius); // let maxX = this._maxX(x + radius); // for (let i = minX; i <= maxX; ++i) { // let r = x - i; // r = Math.round(Math.sqrt(dis - r * r)); // let minY = this._minY(y - r); // let maxY = this._maxY(y + r); // for (let j = minY; j <= maxY; ++j) { // this._drawPixel(i, j); // } // } var minY = this.clampY(y - radius); var maxY = this.clampY(y + radius); for (var j = minY; j <= maxY; ++j) { var r = j - y; r = Math.round(Math.sqrt(dis - r * r)); var minX = this.clampX(x - r); var maxX = this.clampX(x + r); this._drawRowPixel(minX, maxX, j); } }; //#endregion //#region 内部绘制方法 DrawingBoard.prototype._minX = function (x) { return x >= 0 ? x : 0; }; DrawingBoard.prototype._maxX = function (x) { return x < this.width ? x : this.width - 1; }; DrawingBoard.prototype._minY = function (y) { return y >= 0 ? y : 0; }; DrawingBoard.prototype._maxY = function (y) { return y < this.height ? y : this.height - 1; }; DrawingBoard.prototype.clampX = function (x) { if (x < 0) return 0; if (x >= this.width) return this.width - 1; return x; }; DrawingBoard.prototype.clampY = function (y) { if (y < 0) return 0; if (y >= this.height) return this.height - 1; return y; }; /**绘制一个像素点的颜色 */ DrawingBoard.prototype._drawPixel = function (x, y) { x = Math.round(x); y = Math.round(y); if (this.maskPoint[x][y] == 0) return; if (this.pointColor[x][y] == this.tempColor) return; var index = (y * this.width + x) * 4; this.pixelColor[index] = this.tempR; this.pixelColor[index + 1] = this.tempG; this.pixelColor[index + 2] = this.tempB; this.pixelColor[index + 3] = this.tempA; var c = this.pointColor[x][y]; this.colorCount[c]--; this.colorCount[this.tempColor]++; this.pointColor[x][y] = this.tempColor; }; /** * 连续绘制一行中的像素点 * @param startX 起点X坐标 * @param endX 终点X坐标 * @param y Y坐标 */ DrawingBoard.prototype._drawRowPixel = function (startX, endX, y) { var _a; var index = (y * this.width + startX) * 4; for (var x = startX; x <= endX; ++x) { if ((this.maskPoint[x][y] != 0 && this.pointColor[x][y] != this.tempColor) || this.pixelColor[index + 3] != 255) { this.pixelColor[index] = this.tempR; this.pixelColor[index + 1] = this.tempG; this.pixelColor[index + 2] = this.tempB; this.pixelColor[index + 3] = this.tempA; cc.tween(this.pixelColor) .delay(5) .to(0.5, (_a = {}, _a[index + 3] = 0, _a)) .start(); var c = this.pointColor[x][y]; this.colorCount[c]--; this.colorCount[this.tempColor]++; this.pointColor[x][y] = this.tempColor; } index += 4; } }; /** * 连续绘制一列中的像素点 * @param startY 起点Y坐标 * @param endY 终点Y坐标 * @param x X坐标 */ DrawingBoard.prototype._drawColPixel = function (startY, endY, x) { var _a; var index = (startY * this.width + x) * 4; for (var y = startY; y <= endY; ++y) { if ((this.maskPoint[x][y] != 0 && this.pointColor[x][y] != this.tempColor) || this.pixelColor[index + 3] != 255) { this.pixelColor[index] = this.tempR; this.pixelColor[index + 1] = this.tempG; this.pixelColor[index + 2] = this.tempB; this.pixelColor[index + 3] = this.tempA; cc.tween(this.pixelColor) .delay(5) .to(0.5, (_a = {}, _a[index + 3] = 0, _a)) .start(); var c = this.pointColor[x][y]; this.colorCount[c]--; this.colorCount[this.tempColor]++; this.pointColor[x][y] = this.tempColor; } index += this.width * 4; } }; /** * 将RGBA颜色分量转换为一个数值表示的颜色,颜色分量为0~255之间的值 * @param r * @param g * @param b * @param a */ DrawingBoard.prototype.convertToNumber = function (r, g, b, a) { if (a === void 0) { a = 255; } //颜色值将用于数组索引,不能为负数,故红色分量为奇数时将减1变为偶数 return ((r & 0xfe) << 23) | (g << 16) | (b << 8) | a; }; /**将十六进制的颜色转换为RGBA分量表示的颜色 */ DrawingBoard.prototype.convertToRGBA = function (color) { //颜色值将用于数组索引,不能为负数,故红色分量为奇数时将减1变为偶数 return { r: (color & 0xef000000) >> 23, g: (color & 0x00ff0000) >> 16, b: (color & 0x0000ff00) >> 8, a: (color & 0x000000ff), }; }; return DrawingBoard; }()); exports.default = DrawingBoard; var Vec2 = /** @class */ (function () { function Vec2(x, y) { if (x === void 0) { x = 0; } if (y === void 0) { y = 0; } this.x = x; this.y = y; } Vec2.prototype.set = function (p, y) { if (typeof p === "number") { this.x = p; this.y = y; } else { this.x = p.x; this.y = p.y; } }; return Vec2; }()); cc._RF.pop(); } if (nodeEnv) { __define(__module.exports, __require, __module); } else { __quick_compile_project__.registerModuleFunc(__filename, function () { __define(__module.exports, __require, __module); }); } })(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0XFxEcmF3aW5nQm9hcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7Ozs7R0FLRztBQUNIO0lBNkJJOzs7OztPQUtHO0lBQ0gsc0JBQW1CLEtBQWEsRUFBRSxNQUFjLEVBQUUsSUFBa0I7UUFDaEUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFsQ0Qsc0JBQVcsK0JBQUs7UUFEaEIsVUFBVTthQUNWLGNBQTZCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBR2xELHNCQUFXLGdDQUFNO1FBRGpCLFVBQVU7YUFDVixjQUE4QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQWlDcEQsYUFBYTtJQUNiOzs7OztPQUtHO0lBQ0ksMkJBQUksR0FBWCxVQUFZLEtBQWEsRUFBRSxNQUFjLEVBQUUsSUFBa0I7UUFDekQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNsQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxJ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LENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQztTQUMxQixDQUFDO0lBQ04sQ0FBQztJQUdMLG1CQUFDO0FBQUQsQ0F6d0JBLEFBeXdCQyxJQUFBOztBQUNEO0lBR0ksY0FBWSxDQUFhLEVBQUUsQ0FBYTtRQUE1QixrQkFBQSxFQUFBLEtBQWE7UUFBRSxrQkFBQSxFQUFBLEtBQWE7UUFDcEMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWCxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNmLENBQUM7SUFDTSxrQkFBRyxHQUFWLFVBQVcsQ0FBZ0IsRUFBRSxDQUFVO1FBQ25DLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ1gsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDZDthQUFNO1lBQ0gsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2IsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2hCO0lBQ0wsQ0FBQztJQUNMLFdBQUM7QUFBRCxDQWhCQSxBQWdCQyxJQUFBIiwiZmlsZSI6IiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiDnlLvmnb/vvJpcbiAqIOWPr+S9v+eUqOS7u+aEj+minOiJsue7mOWItuefqeW9ou+8jOS4ieinkuW9ou+8jOWchu+8jOebtOe6v++8jOW5tue7n+iuoeavj+enjeminOiJsueahOWDj+e0oOS4quaVsFxuICog5pOm6Zmk5Zu+5qGI5pe277yM6K6+572u55S75p2/55qE6aKc6Imy5Li66YCP5piO6Imy5YaN6L+b6KGM57uY5Yi25Y2z5Y+vXG4gKiBAaHJlZiBodHRwczovL2ZvcnVtLmNvY29zLm9yZy90L3RvcGljLzg5OTAyXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERyYXdpbmdCb2FyZCB7XG4gICAgcHJpdmF0ZSBfd2l0ZGg6IG51bWJlcjtcbiAgICAvKirnlLvmnb/lrr3luqYgKi9cbiAgICBwdWJsaWMgZ2V0IHdpZHRoKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl93aXRkaDsgfVxuICAgIHByaXZhdGUgX2hlaWdodDogbnVtYmVyO1xuICAgIC8qKueUu+adv+mrmOW6piAqL1xuICAgIHB1YmxpYyBnZXQgaGVpZ2h0KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9oZWlnaHQ7IH1cblxuICAgIC8qKuiusOW9leavj+S4quWDj+e0oOeCueeahOminOiJsuWAvOeahOaVsOe7hO+8jOminOiJsuWAvOeUqOWNgeWFrei/m+WItuihqOekuu+8jFJHQkHmoLzlvI8gKi9cbiAgICBwcml2YXRlIHBvaW50Q29sb3I6IG51bWJlcltdW107XG4gICAgLyoq6K6w5b2V5q+P5Liq5YOP57Sg54K56IO95ZCm57uY5Yi277yMMOihqOekuuS4jeiDvee7mOWItu+8jDHooajnpLrog73nu5jliLYgKi9cbiAgICBwcml2YXRlIG1hc2tQb2ludDogbnVtYmVyW11bXTtcbiAgICAvKirlrZjlgqjlg4/ntKDmlbDmja7nmoTlhoXlrZjlnZcgKi9cbiAgICBwcml2YXRlIGJ1ZmZlcjogQXJyYXlCdWZmZXI7XG4gICAgLyoq6aKc6Imy5YiG6YeP5LiA57u05pWw57uE77yM5L6b5riy5p+T5L2/55SoICovXG4gICAgcHJpdmF0ZSBwaXhlbENvbG9yOiBVaW50OEFycmF5O1xuICAgIC8qKuiusOW9leWQhOenjeminOiJsueahOWDj+e0oOeahOaVsOmHjyAqL1xuICAgIHByaXZhdGUgY29sb3JDb3VudDogeyBba2V5OiBudW1iZXJdOiBudW1iZXIgfTtcblxuICAgIC8qKuiusOW9leacgOi/keS4gOasoee7mOWItuWDj+e0oOeahOminOiJsijljYHlha3ov5vliLbpopzoibLlgLwp77yM6LCD55So57uY5Yi25Ye95pWw5LiU5pyq5oyH5a6a6aKc6Imy5YC85pe277yM5bCG5L2/55So6K+l5YC8ICovXG4gICAgcHJpdmF0ZSBjdXJDb2xvcjogbnVtYmVyO1xuXG4gICAgLyoq5Li05pe25a2Y5YKo55qE6aKc6Imy5YC8ICovXG4gICAgcHJpdmF0ZSB0ZW1wQ29sb3I6IG51bWJlcjtcbiAgICBwcml2YXRlIHRlbXBSOiBudW1iZXI7XG4gICAgcHJpdmF0ZSB0ZW1wRzogbnVtYmVyO1xuICAgIHByaXZhdGUgdGVtcEI6IG51bWJlcjtcbiAgICBwcml2YXRlIHRlbXBBOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiDlj6/lr7nmr4/kuKrlg4/ntKDngrnnu5jliLbnmoTnlLvmnb/vvIznlLvmnb/kvb/nlKjnmoTlnZDmoIfns7vljp/ngrnkuLrlt6bkuIvop5LvvIxY6L205ZCR5Y+z5Li65q2j77yMWei9tOWQkeS4iuS4uuato1xuICAgICAqIEBwYXJhbSB3aWR0aCAgICAg55S75p2/5a695bqmXG4gICAgICogQHBhcmFtIGhlaWdodCAgICDnlLvmnb/pq5jluqZcbiAgICAgKiBAcGFyYW0gZGF0YSAgICAgIOaMh+WumueUu+adv+WIneWni+WGheWuue+8jOWPguaVsOS4uuiusOW9leminOiJsuWIhumHj+eahOS4gOe7tOaVsOe7hO+8jOS4jeS8oOWFpeWPguaVsOaXtu+8jOeUu+adv+S4reWFqOmDqOWDj+e0oOS4uumAj+aYjlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcih3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgZGF0YT86IEFycmF5QnVmZmVyKSB7XG4gICAgICAgIHRoaXMuaW5pdCh3aWR0aCwgaGVpZ2h0LCBkYXRhKTtcbiAgICB9XG5cbiAgICAvLyNyZWdpb24g5Yid5aeL5YyWXG4gICAgLyoqXG4gICAgICog5a+555S75p2/6L+b6KGM5Yid5aeL5YyW77yM5Lya5riF56m65bey57uY5Yi255qE5omA5pyJ5YaF5a65XG4gICAgICogQHBhcmFtIHdpZHRoICAgICDnlLvmnb/lrr3luqZcbiAgICAgKiBAcGFyYW0gaGVpZ2h0ICAgIOeUu+adv+mrmOW6plxuICAgICAqIEBwYXJhbSBkYXRhICAgICAg5oyH5a6a55S75p2/5Yid5aeL5YaF5a6577yM5Y+C5pWw5Li66K6w5b2V6aKc6Imy5YiG6YeP55qE5LiA57u05pWw57uE77yM5LiN5Lyg5YWl5Y+C5pWw5pe277yM55S75p2/5YaF5a655Li65YWo6YOo6YCP5piO55qE55+p5b2iXG4gICAgICovXG4gICAgcHVibGljIGluaXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGRhdGE/OiBBcnJheUJ1ZmZlcikge1xuICAgICAgICB0aGlzLnRlbXBDb2xvciA9IHRoaXMudGVtcFIgPSB0aGlzLnRlbXBHID0gdGhpcy50ZW1wQiA9IHRoaXMudGVtcEEgPSAwO1xuICAgICAgICB0aGlzLmN1ckNvbG9yID0gMDtcbiAgICAgICAgdGhpcy5fd2l0ZGggPSBNYXRoLnJvdW5kKHdpZHRoKTtcbiAgICAgICAgdGhpcy5faGVpZ2h0ID0gTWF0aC5yb3VuZChoZWlnaHQpO1xuICAgICAgICB0aGlzLmluaXRQb2ludENvbG9yKCk7XG4gICAgICAgIHRoaXMuaW5pdE1hc2tQb2ludCgpO1xuICAgICAgICB0aGlzLmluaXRQaXhlbENvbG9yKCk7XG4gICAgICAgIHRoaXMuaW5pdExpbmVEYXRhKCk7XG4gICAgICAgIGlmICghIWRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0YShkYXRhKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIGluaXRQb2ludENvbG9yKCkge1xuICAgICAgICBpZiAoIXRoaXMucG9pbnRDb2xvcikge1xuICAgICAgICAgICAgdGhpcy5wb2ludENvbG9yID0gW107XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLndpZHRoOyArK3gpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5wb2ludENvbG9yW3hdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wb2ludENvbG9yW3hdID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHRoaXMuaGVpZ2h0OyArK3kpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvaW50Q29sb3JbeF1beV0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29sb3JDb3VudCA9IHt9O1xuICAgICAgICB0aGlzLmNvbG9yQ291bnRbMF0gPSB0aGlzLndpZHRoICogdGhpcy5oZWlnaHQ7XG4gICAgfVxuICAgIHByaXZhdGUgaW5pdE1hc2tQb2ludCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLm1hc2tQb2ludCkge1xuICAgICAgICAgICAgdGhpcy5tYXNrUG9pbnQgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHRoaXMud2lkdGg7ICsreCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLm1hc2tQb2ludFt4XSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWFza1BvaW50W3hdID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHRoaXMuaGVpZ2h0OyArK3kpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hc2tQb2ludFt4XVt5XSA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBpbml0UGl4ZWxDb2xvcigpIHtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIodGhpcy53aWR0aCAqIHRoaXMuaGVpZ2h0ICogNCk7XG4gICAgICAgIHRoaXMucGl4ZWxDb2xvciA9IG5ldyBVaW50OEFycmF5KHRoaXMuYnVmZmVyKTtcbiAgICAgICAgdGhpcy5waXhlbENvbG9yLmZpbGwoMCk7XG4gICAgfVxuICAgIC8vI2VuZHJlZ2lvblxuXG4gICAgLy8jcmVnaW9uIOmHjee9ruWGheWuuVxuICAgIC8qKumHjee9rueUu+adv++8jOeUu+adv+eahOWuvemrmOS4jeWPmO+8jOS9huS8mua4heepuuW3sue7mOWItueahOaJgOacieWGheWuue+8jOaBouWkjeiHs+mAj+aYjueKtuaAgSAqL1xuICAgIHB1YmxpYyByZXNldCgpIHtcbiAgICAgICAgdGhpcy5yZXNldFBvaW50Q29sb3IoKTtcbiAgICAgICAgdGhpcy5yZXNldE1hc2tQb2ludCgpO1xuICAgICAgICB0aGlzLnJlc2V0UGl4ZWxDb2xvcigpO1xuICAgIH1cbiAgICBwcml2YXRlIHJlc2V0UG9pbnRDb2xvcigpIHtcbiAgICAgICAgZm9yIChsZXQgeCA9IHRoaXMud2lkdGggLSAxOyB4ID49IDA7IC0teCkge1xuICAgICAgICAgICAgZm9yIChsZXQgeSA9IHRoaXMuaGVpZ2h0IC0gMTsgeSA+PSAwOyAtLXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvaW50Q29sb3JbeF1beV0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGtleSBpbiB0aGlzLmNvbG9yQ291bnQpIHtcbiAgICAgICAgICAgIHRoaXMuY29sb3JDb3VudFtrZXldID0gMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIHJlc2V0TWFza1BvaW50KCkge1xuICAgICAgICBmb3IgKGxldCB4ID0gdGhpcy53aWR0aCAtIDE7IHggPj0gMDsgLS14KSB7XG4gICAgICAgICAgICBmb3IgKGxldCB5ID0gdGhpcy5oZWlnaHQgLSAxOyB5ID49IDA7IC0teSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWFza1BvaW50W3hdW3ldID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIHJlc2V0UGl4ZWxDb2xvcigpIHtcbiAgICAgICAgdGhpcy5waXhlbENvbG9yLmZpbGwoMCk7XG4gICAgfVxuICAgIC8vI2VuZHJlZ2lvblxuXG4gICAgLyoqXG4gICAgICog5Lyg5YWl5Zu+5YOP55qE5YOP57Sg5pWw5o2u77yM55u05o6l6K6+572u55S75p2/55qE5YaF5a6577yM5Zu+5YOP5bC65a+45b+F6aG75LiO55S75p2/5LiA6Ie077yM6Iul6ZyA6KaB6YeN5paw6K6+572u55S75p2/5aSn5bCP77yM6K+35L2/55SoIGluaXQoKSDlh73mlbBcbiAgICAgKiBAcGFyYW0gZGF0YSDorrDlvZXlkITlg4/ntKDpopzoibLliIbph4/nmoTkuIDnu7TmlbDnu4RcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RGF0YShkYXRhOiBBcnJheUJ1ZmZlcikge1xuICAgICAgICBsZXQgcGl4ZWxEYXRhID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIGlmIChwaXhlbERhdGEubGVuZ3RoICE9IHRoaXMud2lkdGggKiB0aGlzLmhlaWdodCAqIDQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIueUu+adv+iuvue9ruaVsOaNruWksei0pe+8jOaVsOaNrumVv+W6puS4jueUu+adv+Wkp+Wwj+S4jeS4gOiHtOOAglwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFBpeGVsQ29sb3JCeVJHQkEocGl4ZWxEYXRhKTtcbiAgICAgICAgdGhpcy5zZXRQb2ludENvbG9yQnlSR0JBKHBpeGVsRGF0YSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOiusOW9leWQhOWDj+e0oOminOiJsuWIhumHj1xuICAgICAqIEBwYXJhbSBkYXRhIOminOiJsuWIhumHj+S4gOe7tOaVsOe7hFxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0UGl4ZWxDb2xvckJ5UkdCQShkYXRhOiBVaW50OEFycmF5KSB7XG4gICAgICAgIHRoaXMucGl4ZWxDb2xvci5zZXQoZGF0YSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOaMieWDj+e0oOeCueeahOWdkOagh+iusOW9leWDj+e0oOeCueeahOminOiJsuWAvFxuICAgICAqIEBwYXJhbSBkYXRhIOminOiJsuWIhumHj+S4gOe7tOaVsOe7hFxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0UG9pbnRDb2xvckJ5UkdCQShkYXRhOiBVaW50OEFycmF5KSB7XG4gICAgICAgIHRoaXMuY29sb3JDb3VudCA9IHt9O1xuICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHRoaXMuaGVpZ2h0OyArK3kpIHtcbiAgICAgICAgICAgIGxldCBpID0geSAqIHRoaXMuaGVpZ2h0O1xuICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLndpZHRoOyArK3gpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29sb3IgPSB0aGlzLmNvbnZlcnRUb051bWJlcihkYXRhW2krK10sIGRhdGFbaSsrXSwgZGF0YVtpKytdLCBkYXRhW2krK10pO1xuICAgICAgICAgICAgICAgIHRoaXMucG9pbnRDb2xvclt4XVt5XSA9IGNvbG9yO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb2xvckNvdW50W2NvbG9yXSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbG9yQ291bnRbY29sb3JdID0gMTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbG9yQ291bnRbY29sb3JdICs9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6K6+572u5LiN6IO957uY5Yi25Zu+5qGI55qE5YOP57Sg5Yy65Z+fXG4gICAgICogQHBhcmFtIGRhdGEgIOWDj+e0oOWdkOagh+S4uue0ouW8le+8jDDooajnpLrkuI3og73nu5jliLbvvIwx6KGo56S66IO957uY5Yi2XG4gICAgICovXG4gICAgcHVibGljIHNldE1hc2soZGF0YTogbnVtYmVyW11bXSkge1xuICAgICAgICBmb3IgKGxldCB4ID0gdGhpcy53aWR0aCAtIDE7IHggPj0gMDsgLS14KSB7XG4gICAgICAgICAgICBpZiAoISFkYXRhW3hdKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeSA9IHRoaXMuaGVpZ2h0IC0gMTsgeSA+PSAwOyAtLXkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVuZGVmaW5lZCAhPSBkYXRhW3hdW3ldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hc2tQb2ludFt4XVt5XSA9IGRhdGFbeF1beV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICog6K6+572u55S75p2/5Li65YWo6YOo5Yy65Z+f6YO95LiN6IO957uY5Yi2XG4gICAgICovXG4gICAgcHVibGljIHNldERpc2FibGUoKSB7XG4gICAgICAgIGZvciAobGV0IHggPSB0aGlzLndpZHRoIC0gMTsgeCA+PSAwOyAtLXgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHkgPSB0aGlzLmhlaWdodCAtIDE7IHkgPj0gMDsgLS15KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXNrUG9pbnRbeF1beV0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOWcqOeOsOacieWPr+e7mOWItuWMuuWfn+eahOWfuuehgOS4iua3u+WKoOWPr+S7pee7mOWItueahOWDj+e0oOeCueWMuuWfn+OAglxuICAgICAqIOatpOaWueazleS4jeS8muemgeeUqOeUu+adv+W9k+WJjeWPr+e7mOWItueahOWDj+e0oOeCueWMuuWfn++8jOWPquS8mua3u+WKoOaWsOeahOWPr+e7mOWItuWMuuWfn1xuICAgICAqIEBwYXJhbSBkYXRhICDlg4/ntKDlnZDmoIfkuLrntKLlvJXvvIww6KGo56S65LiN6IO957uY5Yi277yMMeihqOekuuiDvee7mOWItlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRFbmFibGVQb2ludHMoZGF0YTogbnVtYmVyW11bXSkge1xuICAgICAgICBmb3IgKGxldCB4ID0gdGhpcy53aWR0aCAtIDE7IHggPj0gMDsgLS14KSB7XG4gICAgICAgICAgICBpZiAoISFkYXRhW3hdKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeSA9IHRoaXMuaGVpZ2h0IC0gMTsgeSA+PSAwOyAtLXkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEhZGF0YVt4XVt5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXNrUG9pbnRbeF1beV0gPSBkYXRhW3hdW3ldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6I635Y+W55S75p2/5Lit55qE5pWw5o2uXG4gICAgICogQHBhcmFtIGRhdGEg55So5LqO5o6l5pS25pWw5o2u55qE5pWw57uEXG4gICAgICogQHJldHVybnMge251bWJlcltdfSDov5Tlm57lrZjlgqjlkITlg4/ntKDngrnpopzoibLliIbph4/nmoTkuIDnu7TmlbDnu4RcbiAgICAgKi9cbiAgICBwdWJsaWMgY29weURhdGEoZGF0YT86IG51bWJlcltdKTogbnVtYmVyW10ge1xuICAgICAgICBpZiAodW5kZWZpbmVkID09PSBkYXRhKSB7XG4gICAgICAgICAgICBkYXRhID0gW107XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGNvdW50ID0gdGhpcy5waXhlbENvbG9yLmxlbmd0aDsgaSA8IGNvdW50OyArK2kpIHtcbiAgICAgICAgICAgIGRhdGFbaV0gPSB0aGlzLnBpeGVsQ29sb3JbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOiOt+WPlueUu+adv+S4reiusOW9leavj+S4quWDj+e0oOeahOminOiJsuWIhumHj+eahOaVsOaNrlxuICAgICAqIEByZXR1cm5zIOWwhuebtOaOpei/lOWbnueUu+adv+WGhemDqOeahOaVsOe7hO+8m+azqO+8muiLpeS9v+eUqOiAhemcgOimgeWvueivpeaVsOaNrui/m+ihjOS/ruaUue+8jOivt+S9v+eUqCBjb3B5RGF0YSDmlrnms5Xojrflj5bvvIzku6XlhY3lvbHlk43nlLvmnb/nmoTlg4/ntKDkuKrmlbDorqHmlbDlip/og71cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RGF0YSgpOiBVaW50OEFycmF5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGl4ZWxDb2xvcjtcbiAgICB9XG4gICAgLyoq6I635Y+W55S75p2/5YaF6YOo5L2/55So55qE5YaF5a2Y5Z2X77yM6Iul5LuF6ZyA6KaB6I635Y+W5YOP57Sg5pWw5o2u77yM5LiN6L+b5LiA5q2l5aSE55CG77yM5L2/55SoIGdldERhdGEg5Y2z5Y+vICovXG4gICAgcHVibGljIGdldEJ1ZmZlcigpOiBBcnJheUJ1ZmZlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlcjtcbiAgICB9XG4gICAgcHVibGljIGdldFBvaW50RGF0YSgpOiBudW1iZXJbXVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9pbnRDb2xvcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICog6I635Y+W5oyH5a6a6aKc6Imy55qE5YOP57Sg55qE5Liq5pWwXG4gICAgICogQHBhcmFtIHIg6aKc6Imy55qEcuWIhumHj1xuICAgICAqIEBwYXJhbSBnIOminOiJsueahGfliIbph49cbiAgICAgKiBAcGFyYW0gYiDpopzoibLnmoRi5YiG6YePXG4gICAgICogQHBhcmFtIGEg6aKc6Imy6YCP5piO5bqm77yM6buY6K6k5Li6MjU1XG4gICAgICovXG4gICAgcHVibGljIGdldENvbG9yQ291bnQocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlciwgYTogbnVtYmVyID0gMjU1KTogbnVtYmVyIHtcbiAgICAgICAgbGV0IGMgPSB0aGlzLmNvbnZlcnRUb051bWJlcihyLCBnLCBiLCBhKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sb3JDb3VudFtjXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICog6K6+572u55S75p2/57uY5Yi25Zu+5qGI5L2/5L2/55So55qE6aKc6ImyXG4gICAgICogQHBhcmFtIHIg5YyF5ZCrUkdCQeWIhumHj+eahOminOiJsuWvueixoe+8jOaIluiAheminOiJsueahHLliIbph49cbiAgICAgKiBAcGFyYW0gZyDpopzoibLnmoRn5YiG6YePXG4gICAgICogQHBhcmFtIGIg6aKc6Imy55qEYuWIhumHj1xuICAgICAqIEBwYXJhbSBhIOminOiJsumAj+aYjuW6pu+8jOm7mOiupOS4ujI1NVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRDb2xvcihyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBhOiBudW1iZXIgPSAyNTUpIHtcbiAgICAgICAgdGhpcy5jdXJDb2xvciA9IHRoaXMuY29udmVydFRvTnVtYmVyKHIsIGcsIGIsIGEpO1xuICAgICAgICBpZiAoIXRoaXMuY29sb3JDb3VudFt0aGlzLmN1ckNvbG9yXSkge1xuICAgICAgICAgICAgdGhpcy5jb2xvckNvdW50W3RoaXMuY3VyQ29sb3JdID0gMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRlbXBDb2xvciA9IHRoaXMuY3VyQ29sb3I7XG4gICAgICAgIHRoaXMudGVtcFIgPSByO1xuICAgICAgICB0aGlzLnRlbXBHID0gZztcbiAgICAgICAgdGhpcy50ZW1wQiA9IGI7XG4gICAgICAgIHRoaXMudGVtcEEgPSBhO1xuICAgIH1cbiAgICAvKirmuIXnqbrmiYDmnInlt7Lnu5jliLbnmoTlhoXlrrkgKi9cbiAgICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG5cbiAgICAvLyNyZWdpb24g57uY5Yi277ya55u057q/XG4gICAgLy/nm7Tnur9cbiAgICAvKirkuIrkuIDmrKHnu5jliLbnmoTnm7Tnur/nmoTnu4jngrkgKi9cbiAgICBwcml2YXRlIHByZXZpb3VzTGluZUVuZFBvczogVmVjMjtcbiAgICBwcml2YXRlIHByZXZpb3VzTGluZUVuZFBvc1Q6IFZlYzI7XG4gICAgcHJpdmF0ZSBwcmV2aW91c0xpbmVFbmRQb3NCOiBWZWMyO1xuICAgIC8qKuS4iuS4gOasoee7mOWItueahOebtOe6v+eahOerr+eCueagt+W8jyAqL1xuICAgIHByaXZhdGUgcHJldmlvdXNMaW5lQ2lyY2xlRW5kOiBib29sZWFuO1xuICAgIC8qKuS4iuS4gOasoee7mOWItueahOebtOe6v+eahOWuveW6piAqL1xuICAgIHByaXZhdGUgcHJldmlvdXNMaW5lV2lkdGg6IG51bWJlcjtcbiAgICBwcml2YXRlIGluaXRMaW5lRGF0YSgpIHtcbiAgICAgICAgdGhpcy5wcmV2aW91c0xpbmVFbmRQb3MgPSBuZXcgVmVjMigpO1xuICAgICAgICB0aGlzLnByZXZpb3VzTGluZUVuZFBvc1QgPSBuZXcgVmVjMigpO1xuICAgICAgICB0aGlzLnByZXZpb3VzTGluZUVuZFBvc0IgPSBuZXcgVmVjMigpO1xuICAgICAgICB0aGlzLnByZXZpb3VzTGluZUNpcmNsZUVuZCA9IHRydWU7XG4gICAgICAgIHRoaXMucHJldmlvdXNMaW5lV2lkdGggPSAxO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDnp7vliqjnlLvnrJTliLDmjIflrprnmoTkvY3nva7vvIzosIPnlKggbGluZVRvIOWHveaVsOaXtuWwhuS9v+eUqOivpeeCueS9nOS4uuebtOe6v+eahOi1t+eCuVxuICAgICAqIEBwYXJhbSB4ICAgICDlnZDmoIdYXG4gICAgICogQHBhcmFtIHkgICAgIOWdkOagh1lcbiAgICAgKi9cbiAgICBwdWJsaWMgbW92ZVRvKHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gICAgICAgIHggPSBNYXRoLnJvdW5kKHgpO1xuICAgICAgICB5ID0gTWF0aC5yb3VuZCh5KTtcbiAgICAgICAgdGhpcy5wcmV2aW91c0xpbmVFbmRQb3Muc2V0KHgsIHkpO1xuICAgICAgICB0aGlzLnByZXZpb3VzTGluZUVuZFBvc1Quc2V0KHgsIHkpO1xuICAgICAgICB0aGlzLnByZXZpb3VzTGluZUVuZFBvc0Iuc2V0KHgsIHkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDorr7nva7nur/lrr1cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0TGluZVdpZHRoKHc6IG51bWJlcikge1xuICAgICAgICB0aGlzLnByZXZpb3VzTGluZVdpZHRoID0gdztcbiAgICB9XG4gICAgLyoqXG4gICAgICog6K6+572u57q/5q6156uv54K55qC35byPXG4gICAgICogQHBhcmFtIGIg57q/5q6156uv54K55piv5ZCm5Li65ZyG5b2iXG4gICAgICovXG4gICAgcHVibGljIHNldExpbmVDaXJjbGVFbmQoYjogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnByZXZpb3VzTGluZUNpcmNsZUVuZCA9IGI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog57uY5Yi255u057q/77yM5L2/55So6buY6K6k55qE6aKc6Imy44CB57q/5a695ZKM57q/5q6156uv54K55qC35byPXG4gICAgICogQHBhcmFtIHgxICAgICAgICDotbfngrnlnZDmoIdYXG4gICAgICogQHBhcmFtIHkxICAgICAgICDotbfngrnlnZDmoIdZXG4gICAgICogQHBhcmFtIHgyICAgICAgICDnu4jngrnlnZDmoIdYXG4gICAgICogQHBhcmFtIHkyICAgICAgICDnu4jngrnlnZDmoIdZXG4gICAgICovXG4gICAgcHVibGljIGxpbmUoeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlcikge1xuICAgICAgICB4MSA9IE1hdGgucm91bmQoeDEpO1xuICAgICAgICB4MiA9IE1hdGgucm91bmQoeDIpO1xuICAgICAgICB5MSA9IE1hdGgucm91bmQoeTEpO1xuICAgICAgICB5MiA9IE1hdGgucm91bmQoeTIpO1xuICAgICAgICBpZiAoeDEgPT0geDIgJiYgeTEgPT0geTIpIHJldHVybjtcbiAgICAgICAgbGV0IHdpZHRoID0gdGhpcy5wcmV2aW91c0xpbmVXaWR0aDtcbiAgICAgICAgbGV0IGNpcmNsZUVuZCA9IHRoaXMucHJldmlvdXNMaW5lQ2lyY2xlRW5kO1xuICAgICAgICB0aGlzLnByZXZpb3VzTGluZUVuZFBvcy5zZXQoeDIsIHkyKTtcbiAgICAgICAgbGV0IG9mZnNldFggPSAwO1xuICAgICAgICBsZXQgb2Zmc2V0WSA9IDA7XG4gICAgICAgIGxldCByYXRlSyA9IDE7XG4gICAgICAgIGlmICh4MSA9PSB4Mikge1xuICAgICAgICAgICAgb2Zmc2V0WCA9IE1hdGgucm91bmQod2lkdGggKiAwLjUpO1xuICAgICAgICB9IGVsc2UgaWYgKHkxID09IHkyKSB7XG4gICAgICAgICAgICBvZmZzZXRZID0gTWF0aC5yb3VuZCh3aWR0aCAqIDAuNSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgayA9ICh5MiAtIHkxKSAvICh4MiAtIHgxKTtcbiAgICAgICAgICAgIHJhdGVLID0gTWF0aC5zcXJ0KGsgKiBrICsgMSk7XG4gICAgICAgICAgICBvZmZzZXRZID0gd2lkdGggKiAwLjUgLyByYXRlSztcbiAgICAgICAgICAgIG9mZnNldFggPSBNYXRoLnJvdW5kKG9mZnNldFkgKiBrKTtcbiAgICAgICAgICAgIG9mZnNldFkgPSBNYXRoLnJvdW5kKG9mZnNldFkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJldmlvdXNMaW5lRW5kUG9zVC5zZXQoeDIgLSBvZmZzZXRYLCB5MiArIG9mZnNldFkpO1xuICAgICAgICB0aGlzLnByZXZpb3VzTGluZUVuZFBvc0Iuc2V0KHgyICsgb2Zmc2V0WCwgeTIgLSBvZmZzZXRZKTtcblxuICAgICAgICBsZXQgcDEgPSBuZXcgVmVjMih4MSwgeTEpO1xuICAgICAgICBsZXQgcDIgPSBuZXcgVmVjMih4MiwgeTIpO1xuICAgICAgICBpZiAoeDEgPiB4Mikge1xuICAgICAgICAgICAgcDEueCA9IHgyO1xuICAgICAgICAgICAgcDEueSA9IHkyO1xuICAgICAgICAgICAgcDIueCA9IHgxO1xuICAgICAgICAgICAgcDIueSA9IHkxO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RyYXdMaW5lKHAxLCBwMiwgd2lkdGgsIG9mZnNldFgsIG9mZnNldFksIHJhdGVLKTtcbiAgICAgICAgaWYgKGNpcmNsZUVuZCkge1xuICAgICAgICAgICAgdGhpcy5fZHJhd0NpcmNsZSh4MSwgeTEsIHdpZHRoICogMC41KTtcbiAgICAgICAgICAgIHRoaXMuX2RyYXdDaXJjbGUoeDIsIHkyLCB3aWR0aCAqIDAuNSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICog57uY5Yi25Yiw5oyH5a6a5Z2Q5qCH55qE55u057q/77yM6LW354K55Li65LiK5LiA5qyh57uY5Yi255qE55u057q/55qE57uI54K577yM5L2/55So6buY6K6k55qE6aKc6Imy44CB5a695bqm5ZKM57q/5q6156uv54K55qC35byPXG4gICAgICogQHBhcmFtIHggICAgIOe7iOeCueWdkOagh1hcbiAgICAgKiBAcGFyYW0geSAgICAg57uI54K55Z2Q5qCHWVxuICAgICAqL1xuICAgIHB1YmxpYyBsaW5lVG8oeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICAgICAgeCA9IE1hdGgucm91bmQoeCk7XG4gICAgICAgIHkgPSBNYXRoLnJvdW5kKHkpO1xuICAgICAgICBpZiAodGhpcy5wcmV2aW91c0xpbmVFbmRQb3MueCA9PSB4ICYmIHRoaXMucHJldmlvdXNMaW5lRW5kUG9zLnkgPT0geSkgcmV0dXJuO1xuICAgICAgICBsZXQgd2lkdGggPSB0aGlzLnByZXZpb3VzTGluZVdpZHRoO1xuICAgICAgICBsZXQgY2lyY2xlRW5kID0gdGhpcy5wcmV2aW91c0xpbmVDaXJjbGVFbmQ7XG4gICAgICAgIGxldCB4MSA9IHRoaXMucHJldmlvdXNMaW5lRW5kUG9zLng7XG4gICAgICAgIGxldCB5MSA9IHRoaXMucHJldmlvdXNMaW5lRW5kUG9zLnk7XG4gICAgICAgIGxldCB4MiA9IHg7XG4gICAgICAgIGxldCB5MiA9IHk7XG4gICAgICAgIGlmICh4MSA+IHgyKSB7XG4gICAgICAgICAgICB4MSA9IHgyO1xuICAgICAgICAgICAgeTEgPSB5MjtcbiAgICAgICAgICAgIHgyID0gdGhpcy5wcmV2aW91c0xpbmVFbmRQb3MueDtcbiAgICAgICAgICAgIHkyID0gdGhpcy5wcmV2aW91c0xpbmVFbmRQb3MueTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb2Zmc2V0WCA9IDA7XG4gICAgICAgIGxldCBvZmZzZXRZID0gMDtcbiAgICAgICAgbGV0IHJhdGVLID0gMTtcbiAgICAgICAgaWYgKHgxID09IHgyKSB7XG4gICAgICAgICAgICBvZmZzZXRYID0gTWF0aC5yb3VuZCh3aWR0aCAqIDAuNSk7XG4gICAgICAgIH0gZWxzZSBpZiAoeTEgPT0geTIpIHtcbiAgICAgICAgICAgIG9mZnNldFkgPSBNYXRoLnJvdW5kKHdpZHRoICogMC41KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBrID0gKHkyIC0geTEpIC8gKHgyIC0geDEpO1xuICAgICAgICAgICAgcmF0ZUsgPSBNYXRoLnNxcnQoayAqIGsgKyAxKTtcbiAgICAgICAgICAgIG9mZnNldFkgPSB3aWR0aCAqIDAuNSAvIHJhdGVLO1xuICAgICAgICAgICAgb2Zmc2V0WCA9IE1hdGgucm91bmQob2Zmc2V0WSAqIGspO1xuICAgICAgICAgICAgb2Zmc2V0WSA9IE1hdGgucm91bmQob2Zmc2V0WSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjaXJjbGVFbmQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXZpb3VzTGluZUVuZFBvcy54ICE9IHRoaXMucHJldmlvdXNMaW5lRW5kUG9zVC54XG4gICAgICAgICAgICAgICAgfHwgdGhpcy5wcmV2aW91c0xpbmVFbmRQb3MueSAhPSB0aGlzLnByZXZpb3VzTGluZUVuZFBvc1QueSkge1xuICAgICAgICAgICAgICAgIGxldCBwMSA9IG5ldyBWZWMyKHRoaXMucHJldmlvdXNMaW5lRW5kUG9zLnggLSBvZmZzZXRYLCB0aGlzLnByZXZpb3VzTGluZUVuZFBvcy55ICsgb2Zmc2V0WSk7XG4gICAgICAgICAgICAgICAgbGV0IHAyID0gbmV3IFZlYzIodGhpcy5wcmV2aW91c0xpbmVFbmRQb3MueCArIG9mZnNldFgsIHRoaXMucHJldmlvdXNMaW5lRW5kUG9zLnkgLSBvZmZzZXRZKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9kcmF3VHJpYW5nbGUoW3AxLCBwMiwgdGhpcy5wcmV2aW91c0xpbmVFbmRQb3NUXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZHJhd1RyaWFuZ2xlKFtwMSwgcDIsIHRoaXMucHJldmlvdXNMaW5lRW5kUG9zQl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZHJhd0NpcmNsZSh4MSwgeTEsIHdpZHRoICogMC41KTtcbiAgICAgICAgICAgIHRoaXMuX2RyYXdDaXJjbGUoeDIsIHkyLCB3aWR0aCAqIDAuNSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZHJhd0xpbmUobmV3IFZlYzIoeDEsIHkxKSwgbmV3IFZlYzIoeDIsIHkyKSwgd2lkdGgsIG9mZnNldFgsIG9mZnNldFksIHJhdGVLKTtcblxuICAgICAgICB0aGlzLnByZXZpb3VzTGluZUVuZFBvcy5zZXQoeCwgeSk7XG4gICAgICAgIHRoaXMucHJldmlvdXNMaW5lRW5kUG9zVC5zZXQoeCAtIG9mZnNldFgsIHkgKyBvZmZzZXRZKTtcbiAgICAgICAgdGhpcy5wcmV2aW91c0xpbmVFbmRQb3NCLnNldCh4ICsgb2Zmc2V0WCwgeSAtIG9mZnNldFkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDnu5jliLbnm7Tnur/vvIzkuI3ljIXlkKvnur/mrrXnq6/ngrnmoLflvI9cbiAgICAgKiBAcGFyYW0gcDEgICAgICAgIOe6v+autei1t+eCueWdkOagh1xuICAgICAqIEBwYXJhbSBwMiAgICAgICAg57q/5q6157uI54K55Z2Q5qCHXG4gICAgICogQHBhcmFtIHdpZHRoICAgICDnur/mrrXlrr3luqZcbiAgICAgKiBAcGFyYW0gY29sb3IgICAgIOe6v+auteminOiJslxuICAgICAqL1xuICAgIHByaXZhdGUgX2RyYXdMaW5lKHAxOiBWZWMyLCBwMjogVmVjMiwgd2lkdGg6IG51bWJlciwgb2Zmc2V0WDogbnVtYmVyLCBvZmZzZXRZOiBudW1iZXIsIHNsb3BlUmF0ZTogbnVtYmVyKSB7XG4gICAgICAgIGlmIChwMS55ID09IHAyLnkpIHtcbiAgICAgICAgICAgIC8v5rC05bmz55u057q/XG4gICAgICAgICAgICBsZXQgeCA9IHAxLnggPCBwMi54ID8gcDEueCA6IHAyLng7XG4gICAgICAgICAgICB0aGlzLl9kcmF3UmVjdChuZXcgVmVjMih4LCBNYXRoLnJvdW5kKHAxLnkgLSB3aWR0aCAqIDAuNSkpLCBNYXRoLmFicyhwMS54IC0gcDIueCksIHdpZHRoKTtcbiAgICAgICAgfSBlbHNlIGlmIChwMS54ID09IHAyLngpIHtcbiAgICAgICAgICAgIC8v5Z6C55u055u057q/XG4gICAgICAgICAgICBsZXQgeSA9IHAxLnkgPCBwMi55ID8gcDEueSA6IHAyLnk7XG4gICAgICAgICAgICB0aGlzLl9kcmF3UmVjdChuZXcgVmVjMihNYXRoLnJvdW5kKHAxLnggLSB3aWR0aCAqIDAuNSksIHkpLCB3aWR0aCwgTWF0aC5hYnMocDEueSAtIHAyLnkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8v5YC+5pac55u057q/XG4gICAgICAgICAgICBsZXQgaW52ZXJzZUsgPSAocDEueCAtIHAyLngpIC8gKHAxLnkgLSBwMi55KTtcbiAgICAgICAgICAgIGxldCBwMXQgPSBuZXcgVmVjMihwMS54IC0gb2Zmc2V0WCwgcDEueSArIG9mZnNldFkpO1xuICAgICAgICAgICAgbGV0IHAxYiA9IG5ldyBWZWMyKHAxLnggKyBvZmZzZXRYLCBwMS55IC0gb2Zmc2V0WSk7XG4gICAgICAgICAgICBsZXQgcDJ0ID0gbmV3IFZlYzIocDIueCAtIG9mZnNldFgsIHAyLnkgKyBvZmZzZXRZKTtcbiAgICAgICAgICAgIGxldCBwMmIgPSBuZXcgVmVjMihwMi54ICsgb2Zmc2V0WCwgcDIueSAtIG9mZnNldFkpO1xuICAgICAgICAgICAgbGV0IHAxYyA9IG5ldyBWZWMyKCk7XG4gICAgICAgICAgICBsZXQgcDJjID0gbmV3IFZlYzIoKTtcbiAgICAgICAgICAgIGxldCBoZWlnaHQgPSBNYXRoLnJvdW5kKHdpZHRoICogc2xvcGVSYXRlKTtcbiAgICAgICAgICAgIGlmIChwMi55ID4gcDEueSkge1xuICAgICAgICAgICAgICAgIGlmIChwMWIueCA8IHAydC54KSB7XG4gICAgICAgICAgICAgICAgICAgIHAxYy54ID0gcDFiLng7XG4gICAgICAgICAgICAgICAgICAgIHAxYy55ID0gcDFiLnkgKyBoZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIHAyYy54ID0gcDJ0Lng7XG4gICAgICAgICAgICAgICAgICAgIHAyYy55ID0gcDJ0LnkgLSBoZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RyYXdWZXJ0aWNhbFRyaWFuZ2xlKHAxYywgcDFiLCBwMXQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kcmF3UGFyYWxsZWxvZ3JhbShwMWIsIHAyYywgaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZHJhd1ZlcnRpY2FsVHJpYW5nbGUocDJ0LCBwMmMsIHAyYik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcDFjLnggPSBwMWIueDtcbiAgICAgICAgICAgICAgICAgICAgcDFjLnkgPSBNYXRoLnJvdW5kKHAydC55IC0gKHAxYy54IC0gcDJ0LngpICogaW52ZXJzZUspO1xuICAgICAgICAgICAgICAgICAgICBwMmMueCA9IHAydC54O1xuICAgICAgICAgICAgICAgICAgICBwMmMueSA9IE1hdGgucm91bmQocDFiLnkgKyAocDFiLnggLSBwMmMueCkgKiBpbnZlcnNlSyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RyYXdWZXJ0aWNhbFRyaWFuZ2xlKHAydCwgcDJjLCBwMXQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kcmF3UGFyYWxsZWxvZ3JhbShwMmMsIHAxYiwgcDJ0LnkgLSBwMmMueSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RyYXdWZXJ0aWNhbFRyaWFuZ2xlKHAxYywgcDFiLCBwMmIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHAxdC54IDwgcDJiLngpIHtcbiAgICAgICAgICAgICAgICAgICAgcDFjLnggPSBwMXQueDtcbiAgICAgICAgICAgICAgICAgICAgcDFjLnkgPSBwMXQueSAtIGhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgcDJjLnggPSBwMmIueDtcbiAgICAgICAgICAgICAgICAgICAgcDJjLnkgPSBwMmIueSArIGhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZHJhd1ZlcnRpY2FsVHJpYW5nbGUocDF0LCBwMWMsIHAxYik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RyYXdQYXJhbGxlbG9ncmFtKHAxYywgcDJiLCBoZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kcmF3VmVydGljYWxUcmlhbmdsZShwMmMsIHAyYiwgcDJ0KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwMWMueCA9IHAxdC54O1xuICAgICAgICAgICAgICAgICAgICBwMWMueSA9IE1hdGgucm91bmQocDJiLnkgLSAocDFjLnggLSBwMmIueCkgKiBpbnZlcnNlSyk7XG4gICAgICAgICAgICAgICAgICAgIHAyYy54ID0gcDJiLng7XG4gICAgICAgICAgICAgICAgICAgIHAyYy55ID0gTWF0aC5yb3VuZChwMXQueSArIChwMXQueCAtIHAyYy54KSAqIGludmVyc2VLKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZHJhd1ZlcnRpY2FsVHJpYW5nbGUocDJjLCBwMmIsIHAxYik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RyYXdQYXJhbGxlbG9ncmFtKHAyYiwgcDFjLCBwMXQueSAtIHAxYy55KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZHJhd1ZlcnRpY2FsVHJpYW5nbGUocDF0LCBwMWMsIHAydCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8jZW5kcmVnaW9uXG5cbiAgICAvLyNyZWdpb24g57uY5Yi277ya55+p5b2iXG4gICAgLyoqXG4gICAgICog57uY5Yi255+p5b2iXG4gICAgICogQHBhcmFtIHggICAgIOefqeW9ouW3puS4i+inkueahOWdkOagh1hcbiAgICAgKiBAcGFyYW0geSAgICAg55+p5b2i5bem5LiL6KeS55qE5Z2Q5qCHWVxuICAgICAqIEBwYXJhbSB3ICAgICDnn6nlvaLlrr3luqZcbiAgICAgKiBAcGFyYW0gaCAgICAg55+p5b2i6auY5bqmXG4gICAgICovXG4gICAgcHVibGljIHJlY3QoeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKSB7XG4gICAgICAgIHggPSBNYXRoLnJvdW5kKHgpO1xuICAgICAgICB5ID0gTWF0aC5yb3VuZCh5KTtcbiAgICAgICAgdGhpcy5fZHJhd1JlY3QobmV3IFZlYzIoeCwgeSksIHcsIGgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDnu5jliLbnn6nlvaJcbiAgICAgKiBAcGFyYW0gcCAgICAgICAgIOefqeW9ouW3puS4i+mhtueCueeahOWdkOagh1xuICAgICAqIEBwYXJhbSB3ICAgICAgICAg55+p5b2i5a695bqmXG4gICAgICogQHBhcmFtIGggICAgICAgICDnn6nlvaLpq5jluqZcbiAgICAgKiBAcGFyYW0gY29sb3IgICAgIOefqeW9ouWhq+WFheeahOminOiJslxuICAgICAqL1xuICAgIHByaXZhdGUgX2RyYXdSZWN0KHA6IFZlYzIsIHc6IG51bWJlciwgaDogbnVtYmVyKSB7XG4gICAgICAgIGxldCBtaW5YID0gdGhpcy5jbGFtcFgocC54KTtcbiAgICAgICAgbGV0IG1heFggPSB0aGlzLmNsYW1wWChwLnggKyB3KTtcbiAgICAgICAgbGV0IG1pblkgPSB0aGlzLmNsYW1wWShwLnkpO1xuICAgICAgICBsZXQgbWF4WSA9IHRoaXMuY2xhbXBZKHAueSArIGgpO1xuICAgICAgICAvLyBmb3IgKGxldCB4ID0gbWluWDsgeCA8PSBtYXhYOyArK3gpIHtcbiAgICAgICAgLy8gICAgIGZvciAobGV0IHkgPSBtaW5ZOyB5IDw9IG1heFk7ICsreSkge1xuICAgICAgICAvLyAgICAgICAgIHRoaXMuX2RyYXdQaXhlbCh4LCB5KTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuICAgICAgICBmb3IgKGxldCB5ID0gbWluWTsgeSA8PSBtYXhZOyArK3kpIHtcbiAgICAgICAgICAgIHRoaXMuX2RyYXdSb3dQaXhlbChtaW5YLCBtYXhYLCB5KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiDnu5jliLblubPooYzlm5vovrnlvaLvvIzlubPooYzlm5vovrnlvaLnmoTlt6blj7PkuKTovrnkuI5Z6L205bmz6KGMXG4gICAgICogQHBhcmFtIHAxICAgICAgICDlt6bkuIvpobbngrnlnZDmoIdcbiAgICAgKiBAcGFyYW0gcDIgICAgICAgIOWPs+S4i+mhtueCueWdkOagh1xuICAgICAqIEBwYXJhbSBoZWlnaHQgICAg5Z6C55u06L656auY5bqmXG4gICAgICogQHBhcmFtIGNvbG9yICAgICDpopzoibJcbiAgICAgKi9cbiAgICBwcml2YXRlIF9kcmF3UGFyYWxsZWxvZ3JhbShwMTogVmVjMiwgcDI6IFZlYzIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgICAgIGlmIChwMS54ID09IHAyLngpIHJldHVybjtcbiAgICAgICAgbGV0IGsgPSAocDIueSAtIHAxLnkpIC8gKHAyLnggLSBwMS54KTtcbiAgICAgICAgbGV0IG1pblggPSB0aGlzLl9taW5YKHAxLngpO1xuICAgICAgICBsZXQgbWF4WCA9IHRoaXMuX21heFgocDIueCk7XG4gICAgICAgIGZvciAobGV0IHggPSBtaW5YOyB4IDw9IG1heFg7ICsreCkge1xuICAgICAgICAgICAgbGV0IG1pblkgPSBwMS55ICsgTWF0aC5yb3VuZCgoeCAtIHAxLngpICogayk7XG4gICAgICAgICAgICBsZXQgbWF4WSA9IG1pblkgKyBoZWlnaHQ7XG4gICAgICAgICAgICBtaW5ZID0gdGhpcy5fbWluWShtaW5ZKTtcbiAgICAgICAgICAgIG1heFkgPSB0aGlzLl9tYXhZKG1heFkpO1xuICAgICAgICAgICAgdGhpcy5fZHJhd0NvbFBpeGVsKG1pblksIG1heFksIHgpO1xuICAgICAgICAgICAgLy8gZm9yIChsZXQgeSA9IG1pblk7IHkgPD0gbWF4WTsgKyt5KSB7XG4gICAgICAgICAgICAvLyAgICAgdGhpcy5fZHJhd1BpeGVsKHgsIHkpO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vI2VuZHJlZ2lvblxuXG4gICAgLy8jcmVnaW9uIOe7mOWItu+8muS4ieinkuW9olxuICAgIC8qKlxuICAgICAqIOe7mOWItuS4ieinkuW9olxuICAgICAqIEBwYXJhbSB4MSAgICDpobbngrkx5Z2Q5qCHWFxuICAgICAqIEBwYXJhbSB5MSAgICDpobbngrkx5Z2Q5qCHWVxuICAgICAqIEBwYXJhbSB4MiAgICDpobbngrky5Z2Q5qCHWFxuICAgICAqIEBwYXJhbSB5MiAgICDpobbngrky5Z2Q5qCHWVxuICAgICAqIEBwYXJhbSB4MyAgICDpobbngrkz5Z2Q5qCHWFxuICAgICAqIEBwYXJhbSB5MyAgICDpobbngrkz5Z2Q5qCHWVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmlhbmdsZSh4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyLCB4MzogbnVtYmVyLCB5MzogbnVtYmVyKSB7XG4gICAgICAgIHgxID0gTWF0aC5yb3VuZCh4MSk7XG4gICAgICAgIHkxID0gTWF0aC5yb3VuZCh5MSk7XG4gICAgICAgIHgyID0gTWF0aC5yb3VuZCh4Mik7XG4gICAgICAgIHkyID0gTWF0aC5yb3VuZCh5Mik7XG4gICAgICAgIHgzID0gTWF0aC5yb3VuZCh4Myk7XG4gICAgICAgIHkzID0gTWF0aC5yb3VuZCh5Myk7XG4gICAgICAgIGxldCBwTGlzdDogVmVjMltdID0gW107XG4gICAgICAgIHBMaXN0LnB1c2gobmV3IFZlYzIoeDEsIHkxKSk7XG4gICAgICAgIHBMaXN0LnB1c2gobmV3IFZlYzIoeDIsIHkyKSk7XG4gICAgICAgIHBMaXN0LnB1c2gobmV3IFZlYzIoeDMsIHkzKSk7XG4gICAgICAgIHRoaXMuX2RyYXdUcmlhbmdsZShwTGlzdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOe7mOWItuS7u+aEj+S4ieinkuW9olxuICAgICAqIEBwYXJhbSBwMSAgICDpobbngrnlnZDmoIdcbiAgICAgKiBAcGFyYW0gcDIgXG4gICAgICogQHBhcmFtIHAzIFxuICAgICAqIEBwYXJhbSBjb2xvciDloavlhYXpopzoibJcbiAgICAgKi9cbiAgICBwcml2YXRlIF9kcmF3VHJpYW5nbGUocExpc3Q6IFZlYzJbXSkge1xuICAgICAgICBwTGlzdC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYS54IC0gYi54O1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IHAxID0gcExpc3RbMF07XG4gICAgICAgIGxldCBwMiA9IHBMaXN0WzFdO1xuICAgICAgICBsZXQgcDMgPSBwTGlzdFsyXTtcbiAgICAgICAgaWYgKHAxLnggPT0gcDIueCkge1xuICAgICAgICAgICAgaWYgKHAxLnggPT0gcDMueCkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHAxLnkgPCBwMi55KSB7XG4gICAgICAgICAgICAgICAgcDEgPSBwTGlzdFsxXTtcbiAgICAgICAgICAgICAgICBwMiA9IHBMaXN0WzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fZHJhd1ZlcnRpY2FsVHJpYW5nbGUocDEsIHAyLCBwMyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGsgPSAocDMueSAtIHAxLnkpIC8gKHAzLnggLSBwMS54KTtcbiAgICAgICAgbGV0IHA0ID0gbmV3IFZlYzIocDIueCwgTWF0aC5yb3VuZChwMS55ICsgKHAyLnggLSBwMS54KSAqIGspKTtcbiAgICAgICAgaWYgKHA0LnkgPT0gcDIueSkgcmV0dXJuO1xuICAgICAgICBpZiAocDQueSA8IHAyLnkpIHtcbiAgICAgICAgICAgIHRoaXMuX2RyYXdWZXJ0aWNhbFRyaWFuZ2xlKHAyLCBwNCwgcDEpO1xuICAgICAgICAgICAgdGhpcy5fZHJhd1ZlcnRpY2FsVHJpYW5nbGUocDIsIHA0LCBwMyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9kcmF3VmVydGljYWxUcmlhbmdsZShwNCwgcDIsIHAxKTtcbiAgICAgICAgICAgIHRoaXMuX2RyYXdWZXJ0aWNhbFRyaWFuZ2xlKHA0LCBwMiwgcDMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOe7mOWItuS4gOadoei+ueS4jlnovbTlubPooYznmoTkuInop5LlvaJcbiAgICAgKiBAcGFyYW0gcDEgICAg5LiJ6KeS5b2i5Z6C55u06L6555qEIOS4iiDpobbngrnlnZDmoIdcbiAgICAgKiBAcGFyYW0gcDIgICAg5LiJ6KeS5b2i5Z6C55u06L6555qEIOS4iyDpobbngrnlnZDmoIdcbiAgICAgKiBAcGFyYW0gcDMgICAg5LiJ6KeS5b2iIOW3puS+p+aIluWPs+S+pyDpobbngrnlnZDmoIdcbiAgICAgKiBAcGFyYW0gY29sb3Ig6KaB57uY5Yi255qE6aKc6ImyXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZHJhd1ZlcnRpY2FsVHJpYW5nbGUocDE6IFZlYzIsIHAyOiBWZWMyLCBwMzogVmVjMikge1xuICAgICAgICBpZiAocDMueCA9PSBwMS54KSByZXR1cm47XG4gICAgICAgIGxldCBrMSA9IChwMy55IC0gcDEueSkgLyAocDMueCAtIHAxLngpO1xuICAgICAgICBsZXQgazIgPSAocDMueSAtIHAyLnkpIC8gKHAzLnggLSBwMi54KTtcbiAgICAgICAgbGV0IG1heFggPSBwMy54LCBtaW5YID0gcDEueDtcbiAgICAgICAgaWYgKG1heFggPCBtaW5YKSB7XG4gICAgICAgICAgICBtYXhYID0gcDEueDtcbiAgICAgICAgICAgIG1pblggPSBwMy54O1xuICAgICAgICB9XG4gICAgICAgIG1pblggPSB0aGlzLl9taW5YKG1pblgpO1xuICAgICAgICBtYXhYID0gdGhpcy5fbWF4WChtYXhYKTtcbiAgICAgICAgZm9yIChsZXQgeCA9IG1pblg7IHggPD0gbWF4WDsgKyt4KSB7XG4gICAgICAgICAgICBsZXQgbWF4WSA9IHRoaXMuY2xhbXBZKE1hdGgucm91bmQocDEueSArICh4IC0gcDEueCkgKiBrMSkpO1xuICAgICAgICAgICAgbGV0IG1pblkgPSB0aGlzLmNsYW1wWShNYXRoLnJvdW5kKHAyLnkgKyAoeCAtIHAyLngpICogazIpKTtcbiAgICAgICAgICAgIHRoaXMuX2RyYXdDb2xQaXhlbChtaW5ZLCBtYXhZLCB4KTtcbiAgICAgICAgICAgIC8vIGZvciAobGV0IHkgPSBtaW5ZOyB5IDw9IG1heFk7ICsreSkge1xuICAgICAgICAgICAgLy8gICAgIHRoaXMuX2RyYXdQaXhlbCh4LCB5KTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyNlbmRyZWdpb25cblxuICAgIC8vI3JlZ2lvbiDnu5jliLbvvJrlnIZcbiAgICAvKipcbiAgICAqIOe7mOWItuS4gOS4quWchlxuICAgICogQHBhcmFtIHggICAgICAgICDlnIblv4PlnZDmoId4XG4gICAgKiBAcGFyYW0geSAgICAgICAgIOWchuW/g+WdkOagh3lcbiAgICAqIEBwYXJhbSByYWRpdXMgICAg5ZyG55qE5Y2K5b6EXG4gICAgKi9cbiAgICBwdWJsaWMgY2lyY2xlKHg6IG51bWJlciwgeTogbnVtYmVyLCByYWRpdXM6IG51bWJlcikge1xuICAgICAgICB4ID0gTWF0aC5yb3VuZCh4KTtcbiAgICAgICAgeSA9IE1hdGgucm91bmQoeSk7XG4gICAgICAgIHRoaXMuX2RyYXdDaXJjbGUoeCwgeSwgcmFkaXVzKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBfZHJhd0NpcmNsZSh4OiBudW1iZXIsIHk6IG51bWJlciwgcmFkaXVzOiBudW1iZXIpIHtcbiAgICAgICAgcmFkaXVzID0gTWF0aC5yb3VuZChyYWRpdXMpO1xuICAgICAgICBpZiAocmFkaXVzID09IDApIHJldHVybjtcbiAgICAgICAgLy/kuInop5LlvaLnmoTmlpzovrnnmoTlubPmlrlcbiAgICAgICAgbGV0IGRpcyA9IHJhZGl1cyAqIHJhZGl1cztcbiAgICAgICAgLy8gbGV0IG1pblggPSB0aGlzLl9taW5YKHggLSByYWRpdXMpO1xuICAgICAgICAvLyBsZXQgbWF4WCA9IHRoaXMuX21heFgoeCArIHJhZGl1cyk7XG4gICAgICAgIC8vIGZvciAobGV0IGkgPSBtaW5YOyBpIDw9IG1heFg7ICsraSkge1xuICAgICAgICAvLyAgICAgbGV0IHIgPSB4IC0gaTtcbiAgICAgICAgLy8gICAgIHIgPSBNYXRoLnJvdW5kKE1hdGguc3FydChkaXMgLSByICogcikpO1xuICAgICAgICAvLyAgICAgbGV0IG1pblkgPSB0aGlzLl9taW5ZKHkgLSByKTtcbiAgICAgICAgLy8gICAgIGxldCBtYXhZID0gdGhpcy5fbWF4WSh5ICsgcik7XG4gICAgICAgIC8vICAgICBmb3IgKGxldCBqID0gbWluWTsgaiA8PSBtYXhZOyArK2opIHtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLl9kcmF3UGl4ZWwoaSwgaik7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cbiAgICAgICAgbGV0IG1pblkgPSB0aGlzLmNsYW1wWSh5IC0gcmFkaXVzKTtcbiAgICAgICAgbGV0IG1heFkgPSB0aGlzLmNsYW1wWSh5ICsgcmFkaXVzKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IG1pblk7IGogPD0gbWF4WTsgKytqKSB7XG4gICAgICAgICAgICBsZXQgciA9IGogLSB5O1xuICAgICAgICAgICAgciA9IE1hdGgucm91bmQoTWF0aC5zcXJ0KGRpcyAtIHIgKiByKSk7XG4gICAgICAgICAgICBsZXQgbWluWCA9IHRoaXMuY2xhbXBYKHggLSByKTtcbiAgICAgICAgICAgIGxldCBtYXhYID0gdGhpcy5jbGFtcFgoeCArIHIpO1xuICAgICAgICAgICAgdGhpcy5fZHJhd1Jvd1BpeGVsKG1pblgsIG1heFgsIGopO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vI2VuZHJlZ2lvblxuXG4gICAgLy8jcmVnaW9uIOWGhemDqOe7mOWItuaWueazlVxuICAgIHByaXZhdGUgX21pblgoeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHggPj0gMCA/IHggOiAwO1xuICAgIH1cbiAgICBwcml2YXRlIF9tYXhYKHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB4IDwgdGhpcy53aWR0aCA/IHggOiB0aGlzLndpZHRoIC0gMTtcbiAgICB9XG4gICAgcHJpdmF0ZSBfbWluWSh5OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4geSA+PSAwID8geSA6IDA7XG4gICAgfVxuICAgIHByaXZhdGUgX21heFkoeTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHkgPCB0aGlzLmhlaWdodCA/IHkgOiB0aGlzLmhlaWdodCAtIDE7XG4gICAgfVxuICAgIHByaXZhdGUgY2xhbXBYKHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGlmICh4IDwgMCkgcmV0dXJuIDA7XG4gICAgICAgIGlmICh4ID49IHRoaXMud2lkdGgpIHJldHVybiB0aGlzLndpZHRoIC0gMTtcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICAgIHByaXZhdGUgY2xhbXBZKHk6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGlmICh5IDwgMCkgcmV0dXJuIDA7XG4gICAgICAgIGlmICh5ID49IHRoaXMuaGVpZ2h0KSByZXR1cm4gdGhpcy5oZWlnaHQgLSAxO1xuICAgICAgICByZXR1cm4geTtcbiAgICB9XG4gICAgLyoq57uY5Yi25LiA5Liq5YOP57Sg54K555qE6aKc6ImyICovXG4gICAgcHJpdmF0ZSBfZHJhd1BpeGVsKHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gICAgICAgIHggPSBNYXRoLnJvdW5kKHgpO1xuICAgICAgICB5ID0gTWF0aC5yb3VuZCh5KTtcbiAgICAgICAgaWYgKHRoaXMubWFza1BvaW50W3hdW3ldID09IDApIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMucG9pbnRDb2xvclt4XVt5XSA9PSB0aGlzLnRlbXBDb2xvcikgcmV0dXJuO1xuICAgICAgICBsZXQgaW5kZXggPSAoeSAqIHRoaXMud2lkdGggKyB4KSAqIDQ7XG4gICAgICAgIHRoaXMucGl4ZWxDb2xvcltpbmRleF0gPSB0aGlzLnRlbXBSO1xuICAgICAgICB0aGlzLnBpeGVsQ29sb3JbaW5kZXggKyAxXSA9IHRoaXMudGVtcEc7XG4gICAgICAgIHRoaXMucGl4ZWxDb2xvcltpbmRleCArIDJdID0gdGhpcy50ZW1wQjtcbiAgICAgICAgdGhpcy5waXhlbENvbG9yW2luZGV4ICsgM10gPSB0aGlzLnRlbXBBO1xuICAgICAgICBsZXQgYyA9IHRoaXMucG9pbnRDb2xvclt4XVt5XTtcbiAgICAgICAgdGhpcy5jb2xvckNvdW50W2NdLS07XG4gICAgICAgIHRoaXMuY29sb3JDb3VudFt0aGlzLnRlbXBDb2xvcl0rKztcbiAgICAgICAgdGhpcy5wb2ludENvbG9yW3hdW3ldID0gdGhpcy50ZW1wQ29sb3I7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOi/nue7ree7mOWItuS4gOihjOS4reeahOWDj+e0oOeCuVxuICAgICAqIEBwYXJhbSBzdGFydFggICAg6LW354K5WOWdkOagh1xuICAgICAqIEBwYXJhbSBlbmRYICAgICAg57uI54K5WOWdkOagh1xuICAgICAqIEBwYXJhbSB5ICAgICAgICAgWeWdkOagh1xuICAgICAqL1xuICAgIHByaXZhdGUgX2RyYXdSb3dQaXhlbChzdGFydFg6IG51bWJlciwgZW5kWDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICAgICAgbGV0IGluZGV4ID0gKHkgKiB0aGlzLndpZHRoICsgc3RhcnRYKSAqIDQ7XG4gICAgICAgIGZvciAobGV0IHggPSBzdGFydFg7IHggPD0gZW5kWDsgKyt4KSB7XG4gICAgICAgICAgICBpZiAoKHRoaXMubWFza1BvaW50W3hdW3ldICE9IDAgJiYgdGhpcy5wb2ludENvbG9yW3hdW3ldICE9IHRoaXMudGVtcENvbG9yKSB8fCB0aGlzLnBpeGVsQ29sb3JbaW5kZXggKyAzXSAhPSAyNTUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBpeGVsQ29sb3JbaW5kZXhdID0gdGhpcy50ZW1wUjtcbiAgICAgICAgICAgICAgICB0aGlzLnBpeGVsQ29sb3JbaW5kZXggKyAxXSA9IHRoaXMudGVtcEc7XG4gICAgICAgICAgICAgICAgdGhpcy5waXhlbENvbG9yW2luZGV4ICsgMl0gPSB0aGlzLnRlbXBCO1xuICAgICAgICAgICAgICAgIHRoaXMucGl4ZWxDb2xvcltpbmRleCArIDNdID0gdGhpcy50ZW1wQTtcbiAgICAgICAgICAgICAgICBjYy50d2Vlbih0aGlzLnBpeGVsQ29sb3IpXG4gICAgICAgICAgICAgICAgLmRlbGF5KDUpXG4gICAgICAgICAgICAgICAgLnRvKDAuNSx7W2luZGV4ICsgM106MH0pXG4gICAgICAgICAgICAgICAgLnN0YXJ0KCk7XG4gICAgICAgICAgICAgICAgbGV0IGMgPSB0aGlzLnBvaW50Q29sb3JbeF1beV07XG4gICAgICAgICAgICAgICAgdGhpcy5jb2xvckNvdW50W2NdLS07XG4gICAgICAgICAgICAgICAgdGhpcy5jb2xvckNvdW50W3RoaXMudGVtcENvbG9yXSsrO1xuICAgICAgICAgICAgICAgIHRoaXMucG9pbnRDb2xvclt4XVt5XSA9IHRoaXMudGVtcENvbG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5kZXggKz0gNDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiDov57nu63nu5jliLbkuIDliJfkuK3nmoTlg4/ntKDngrlcbiAgICAgKiBAcGFyYW0gc3RhcnRZICAgIOi1t+eCuVnlnZDmoIdcbiAgICAgKiBAcGFyYW0gZW5kWSAgICAgIOe7iOeCuVnlnZDmoIdcbiAgICAgKiBAcGFyYW0geCAgICAgICAgIFjlnZDmoIdcbiAgICAgKi9cbiAgICBwcml2YXRlIF9kcmF3Q29sUGl4ZWwoc3RhcnRZOiBudW1iZXIsIGVuZFk6IG51bWJlciwgeDogbnVtYmVyKSB7XG4gICAgICAgIGxldCBpbmRleCA9IChzdGFydFkgKiB0aGlzLndpZHRoICsgeCkgKiA0O1xuICAgICAgICBmb3IgKGxldCB5ID0gc3RhcnRZOyB5IDw9IGVuZFk7ICsreSkge1xuICAgICAgICAgICAgaWYgKCh0aGlzLm1hc2tQb2ludFt4XVt5XSAhPSAwICYmIHRoaXMucG9pbnRDb2xvclt4XVt5XSAhPSB0aGlzLnRlbXBDb2xvcikgfHwgdGhpcy5waXhlbENvbG9yW2luZGV4ICsgM10gIT0gMjU1ICkge1xuICAgICAgICAgICAgICAgIHRoaXMucGl4ZWxDb2xvcltpbmRleF0gPSB0aGlzLnRlbXBSO1xuICAgICAgICAgICAgICAgIHRoaXMucGl4ZWxDb2xvcltpbmRleCArIDFdID0gdGhpcy50ZW1wRztcbiAgICAgICAgICAgICAgICB0aGlzLnBpeGVsQ29sb3JbaW5kZXggKyAyXSA9IHRoaXMudGVtcEI7XG4gICAgICAgICAgICAgICAgdGhpcy5waXhlbENvbG9yW2luZGV4ICsgM10gPSB0aGlzLnRlbXBBO1xuICAgICAgICAgICAgICAgIGNjLnR3ZWVuKHRoaXMucGl4ZWxDb2xvcilcbiAgICAgICAgICAgICAgICAuZGVsYXkoNSlcbiAgICAgICAgICAgICAgICAudG8oMC41LHtbaW5kZXggKyAzXTowfSlcbiAgICAgICAgICAgICAgICAuc3RhcnQoKTtcbiAgICAgICAgICAgICAgICBsZXQgYyA9IHRoaXMucG9pbnRDb2xvclt4XVt5XTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbG9yQ291bnRbY10tLTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbG9yQ291bnRbdGhpcy50ZW1wQ29sb3JdKys7XG4gICAgICAgICAgICAgICAgdGhpcy5wb2ludENvbG9yW3hdW3ldID0gdGhpcy50ZW1wQ29sb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbmRleCArPSB0aGlzLndpZHRoICogNDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiDlsIZSR0JB6aKc6Imy5YiG6YeP6L2s5o2i5Li65LiA5Liq5pWw5YC86KGo56S655qE6aKc6Imy77yM6aKc6Imy5YiG6YeP5Li6MH4yNTXkuYvpl7TnmoTlgLxcbiAgICAgKiBAcGFyYW0gciBcbiAgICAgKiBAcGFyYW0gZyBcbiAgICAgKiBAcGFyYW0gYiBcbiAgICAgKiBAcGFyYW0gYSBcbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbnZlcnRUb051bWJlcihyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBhOiBudW1iZXIgPSAyNTUpOiBudW1iZXIge1xuICAgICAgICAvL+minOiJsuWAvOWwhueUqOS6juaVsOe7hOe0ouW8le+8jOS4jeiDveS4uui0n+aVsO+8jOaVhee6ouiJsuWIhumHj+S4uuWlh+aVsOaXtuWwhuWHjzHlj5jkuLrlgbbmlbBcbiAgICAgICAgcmV0dXJuICgociAmIDB4ZmUpIDw8IDIzKSB8IChnIDw8IDE2KSB8IChiIDw8IDgpIHwgYTtcbiAgICB9XG4gICAgLyoq5bCG5Y2B5YWt6L+b5Yi255qE6aKc6Imy6L2s5o2i5Li6UkdCQeWIhumHj+ihqOekuueahOminOiJsiAqL1xuICAgIHByaXZhdGUgY29udmVydFRvUkdCQShjb2xvcjogbnVtYmVyKTogeyByOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBhOiBudW1iZXIgfSB7XG4gICAgICAgIC8v6aKc6Imy5YC85bCG55So5LqO5pWw57uE57Si5byV77yM5LiN6IO95Li66LSf5pWw77yM5pWF57qi6Imy5YiG6YeP5Li65aWH5pWw5pe25bCG5YePMeWPmOS4uuWBtuaVsFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcjogKGNvbG9yICYgMHhlZjAwMDAwMCkgPj4gMjMsXG4gICAgICAgICAgICBnOiAoY29sb3IgJiAweDAwZmYwMDAwKSA+PiAxNixcbiAgICAgICAgICAgIGI6IChjb2xvciAmIDB4MDAwMGZmMDApID4+IDgsXG4gICAgICAgICAgICBhOiAoY29sb3IgJiAweDAwMDAwMGZmKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8jZW5kcmVnaW9uXG5cbn1cbmNsYXNzIFZlYzIge1xuICAgIHB1YmxpYyB4OiBudW1iZXI7XG4gICAgcHVibGljIHk6IG51bWJlcjtcbiAgICBjb25zdHJ1Y3Rvcih4OiBudW1iZXIgPSAwLCB5OiBudW1iZXIgPSAwKSB7XG4gICAgICAgIHRoaXMueCA9IHg7XG4gICAgICAgIHRoaXMueSA9IHk7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQocDogbnVtYmVyIHwgVmVjMiwgeT86IG51bWJlcikge1xuICAgICAgICBpZiAodHlwZW9mIHAgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHRoaXMueCA9IHA7XG4gICAgICAgICAgICB0aGlzLnkgPSB5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy54ID0gcC54O1xuICAgICAgICAgICAgdGhpcy55ID0gcC55O1xuICAgICAgICB9XG4gICAgfVxufVxuIl19 //------QC-SOURCE-SPLIT------ (function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Script/Game.js'; var __require = nodeEnv ? function (request) { return cc.require(request); } : function (request) { return __quick_compile_project__.require(request, __filename); }; function __define (exports, require, module) { if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict"; cc._RF.push(module, '1c26dVSok5E7o2PwD2sGBJa', 'Game'); // Script/Game.ts "use strict"; // Learn TypeScript: // - https://docs.cocos.com/creator/manual/en/scripting/typescript.html // Learn Attribute: // - https://docs.cocos.com/creator/manual/en/scripting/reference/attributes.html // Learn life-cycle callbacks: // - https://docs.cocos.com/creator/manual/en/scripting/life-cycle-callbacks.html var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); var DrawingBoard_1 = require("./DrawingBoard"); var _a = cc._decorator, ccclass = _a.ccclass, property = _a.property; var GameState; (function (GameState) { GameState[GameState["drawing"] = 1] = "drawing"; GameState[GameState["erasing"] = 2] = "erasing"; })(GameState || (GameState = {})); var Game = /** @class */ (function (_super) { __extends(Game, _super); function Game() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.drawNode = null; _this.captureCamera = null; _this.mainCamera = null; _this.db = null; _this.gameState = GameState.drawing; _this.texture = null; _this.prePos = cc.Vec2.ZERO; _this.startPos = cc.Vec2.ZERO; _this.lastColor = cc.Color.BLUE; _this.errColor = cc.Color.RED; _this.lastLineWidth = 1; _this.history = []; _this.touchId = -1; _this.touchScale = false; return _this; } Game.prototype.start = function () { var _this = this; this.initDb(); this.initTexture(); this.initRead(); setTimeout(function () { _this.drawNode.on("touchstart", _this.onTouchStart, _this); _this.drawNode.on("touchmove", _this.onTouchMove, _this); _this.drawNode.on("touchend", _this.onTouchEnd, _this); _this.drawNode.on("touchcancel", _this.onTouchEnd, _this); }, 2000); }; Game.prototype.initDb = function () { //创建一个画板(需传入画板尺寸,将自动初始化) this.db = new DrawingBoard_1.default(this.drawNode.width, this.drawNode.height); //设置画板的绘图颜色(每次绘制前都可以重新设置) this.lastLineWidth = 15; this.db.setLineWidth(this.lastLineWidth); // this.db.setColor(this.lastColor.r, this.lastColor.g, this.lastColor.b, this.lastColor.a); //线条端点以圆角结尾 this.db.setLineCircleEnd(true); }; Game.prototype.initTexture = function () { this.texture = new cc.RenderTexture(); this.texture.initWithSize(this.drawNode.width, this.drawNode.height, cc.RenderTexture.DepthStencilFormat.RB_FMT_S8); var spf = new cc.SpriteFrame(this.texture); this.drawNode.getComponent(cc.Sprite).spriteFrame = spf; }; Game.prototype.initRead = function () { this.targetCamera = this.node.getChildByName("tagCamera").getComponent(cc.Camera); var rander = new cc.RenderTexture(); rander.initWithSize(this.node.width, this.node.height, cc.RenderTexture.DepthStencilFormat.RB_FMT_S8); this.targetCamera.targetTexture = rander; this.targetCamera.render(); console.log("完成"); }; Game.prototype.onTouchStart = function (e) { //将触摸位置作为线条的起点 //画板中使用的坐标系,与图片坐标系一样,原点在左上角,X轴向右为正,Y轴向下为正 //所以Y轴坐标应反过来, 这里用getLocationInView而不是getLocation this.touchId = e.getID(); if (this.touchId == 1) { this.touchScale = true; return; } var pos = e.getLocation(); this.prePos = this.convertToDrawNodePos(pos); this.startPos = this.convertToDrawNodePos(pos); this.db.moveTo(this.prePos.x, this.prePos.y); }; Game.prototype.onTouchMove = function (e) { var touches = e.getTouches(); var touch1 = touches[0]; var delta1 = touch1.getDelta(); var pos = e.getLocation(); var pos1 = this.convertToDrawNodePos(touch1.getLocation()); var dst = this.startPos.sub(pos1).mag(); // this.label.string = touches.length + ""; if (touches.length == 1 && this.touchId < 1 && !this.touchScale && dst > 7) { // alert("不该进来"); this.prePos = this.convertToDrawNodePos(pos); var jg = this.pd(e); this.changeColor(jg); if (this.gameState == GameState.drawing) { //从上一次绘制线条后的终点开始向鼠标当前位置绘制线条 this.db.lineTo(this.prePos.x, this.prePos.y); } else if (this.gameState == GameState.erasing) { // 橡皮擦 this.db.circle(this.prePos.x, this.prePos.y, 10); } //每次画板中的数据有变化后,及时将数据应用到贴图上,在屏幕上显示出来 this.drawToImg(); } else if (touches.length == 2) { var touch1 = touches[0], touch2 = touches[1]; var delta1 = touch1.getDelta(), delta2 = touch2.getDelta(); var touchPoint1 = this.node.parent.convertToNodeSpaceAR(touch1.getLocation()); var touchPoint2 = this.node.parent.convertToNodeSpaceAR(touch2.getLocation()); var distance = touchPoint1.sub(touchPoint2); var delta = delta1.sub(delta2); var scale = 1; if (Math.abs(distance.x) > Math.abs(distance.y)) { scale = (distance.x + delta.x) / distance.x * this.node.scale; } else { scale = (distance.y + delta.y) / distance.y * this.node.scale; } if (scale > 2) scale = 2; this.node.scale = scale <= 0.1 ? 0.1 : scale; } }; Game.prototype.onTouchEnd = function (e) { this.touchId = e.getID(); if (this.touchId == 1) this.touchScale = false; this.addHistory(); }; Game.prototype.pd = function (event) { var cha = 2; var pos = event.getLocation(); var jg = false; for (var i = -cha; i < cha; i++) { var postion = cc.v2(); postion.x = pos.x + i; for (var j = -cha; j < cha; j++) { postion.y = pos.y + j; // console.log("检测点:",postion.x,postion.y); var img = this.getGraphisData(postion); if ((img[0] != 255 && img[1] != 255 && img[2] != 255)) { jg = true; j = 10000; i = 10000; } } } // return jg; }; Game.prototype.convertToDrawNodePos = function (worldPos) { var pos = this.drawNode.convertToNodeSpaceAR(worldPos); pos.x += this.drawNode.width * this.drawNode.anchorX; pos.y += this.drawNode.height * this.drawNode.anchorY; pos.y = this.drawNode.height - pos.y; return pos; }; Game.prototype.addHistory = function () { var copy = this.db.copyData(); var ucopy = new Uint8Array(copy); this.history.push({ data: ucopy }); // cc.log('历史步骤: ', this.history.length); }; Game.prototype.drawToImg = function () { //获取画板中绘制的图案数据 var data = this.db.getData(); //将数据传递给贴图对象 this.texture.initWithData(data, cc.Texture2D.PixelFormat.RGBA8888, this.db.width, this.db.height); }; Game.prototype.changeColor = function (red) { if (!red) this.db.setColor(this.errColor.r, this.errColor.g, this.errColor.b, this.errColor.a); else this.db.setColor(this.lastColor.r, this.lastColor.g, this.lastColor.b, this.lastColor.a); }; Game.prototype.getGraphisData = function (point) { var Uint8 = new Uint8Array(4); Uint8 = this.targetCamera.targetTexture.readPixels(Uint8, point.x, point.y, 1, 1); return Uint8; }; Game.prototype.onBtnDraw = function () { this.db.setLineWidth(this.lastLineWidth); this.db.setColor(this.lastColor.r, this.lastColor.g, this.lastColor.b, this.lastColor.a); this.gameState = GameState.drawing; }; Game.prototype.onBtnErase = function () { this.db.setLineWidth(this.lastLineWidth * 3); // 橡皮擦的颜色不能是(0,0,0,0),因为这样会和DrawingBoard里的默认颜色相同导致绘制跳过 this.db.setColor(255, 255, 255, 0); this.gameState = GameState.erasing; }; Game.prototype.onBtnClear = function () { this.db.reset(); this.drawToImg(); this.history.splice(0, this.history.length); }; Game.prototype.onBtnRevoke = function () { this.history.pop(); if (this.history.length) { var data = this.history[this.history.length - 1].data; this.db.setData(data.buffer); this.texture.initWithData(this.db.getData(), cc.Texture2D.PixelFormat.RGBA8888, this.db.width, this.db.height); } else { this.onBtnClear(); } cc.log('历史记录剩余: ', this.history.length); }; Game.prototype.onBtnSave = function () { var _this = this; if (cc.sys.isBrowser) { var width = this.drawNode.width; var height = this.drawNode.height; this.captureCamera.enabled = true; var texture = new cc.RenderTexture(); texture.initWithSize(width, height, cc.RenderTexture.DepthStencilFormat.RB_FMT_S8); this.captureCamera.targetTexture = texture; var canvas = document.createElement('canvas'); canvas.width = width; canvas.height = height; var ctx = canvas.getContext('2d'); this.captureCamera.render(); var data = texture.readPixels(); // write the render data var rowBytes = width * 4; for (var row = 0; row < height; row++) { var srow = height - 1 - row; var imageData = ctx.createImageData(width, 1); var start = srow * width * 4; for (var i = 0; i < rowBytes; i++) { imageData.data[i] = data[start + i]; } ctx.putImageData(imageData, 0, row); } // var dataUrl = canvas.toDataURL('image/png'); // cc.log('iamge-base64:', dataUrl); var saveLink = document.createElementNS('http://www.w3.org/1999/xhtml', 'a'); saveLink.href = dataUrl; saveLink.download = String(Date.now()) + '.png'; var event = document.createEvent('MouseEvents'); event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); saveLink.dispatchEvent(event); this.scheduleOnce(function (t) { _this.captureCamera.enabled = false; }, 0.1); } else { cc.warn('暂时只支持web端保存图片'); } }; Game.prototype.update = function (dt) { }; __decorate([ property(cc.Node) ], Game.prototype, "drawNode", void 0); __decorate([ property(cc.Camera) ], Game.prototype, "captureCamera", void 0); __decorate([ property(cc.Camera) ], Game.prototype, "mainCamera", void 0); Game = __decorate([ ccclass ], Game); return Game; }(cc.Component)); exports.default = Game; cc._RF.pop(); } if (nodeEnv) { __define(__module.exports, __require, __module); } else { __quick_compile_project__.registerModuleFunc(__filename, function () { __define(__module.exports, __require, __module); }); } })(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,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USxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7MENBQ087SUFHekI7UUFEQyxRQUFRLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQzsrQ0FDWTtJQUdoQztRQURDLFFBQVEsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDOzRDQUNTO0lBUlosSUFBSTtRQUR4QixPQUFPO09BQ2EsSUFBSSxDQThReEI7SUFBRCxXQUFDO0NBOVFELEFBOFFDLENBOVFpQyxFQUFFLENBQUMsU0FBUyxHQThRN0M7a0JBOVFvQixJQUFJIiwiZmlsZSI6IiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gTGVhcm4gVHlwZVNjcmlwdDpcbi8vICAtIGh0dHBzOi8vZG9jcy5jb2Nvcy5jb20vY3JlYXRvci9tYW51YWwvZW4vc2NyaXB0aW5nL3R5cGVzY3JpcHQuaHRtbFxuLy8gTGVhcm4gQXR0cmlidXRlOlxuLy8gIC0gaHR0cHM6Ly9kb2NzLmNvY29zLmNvbS9jcmVhdG9yL21hbnVhbC9lbi9zY3JpcHRpbmcvcmVmZXJlbmNlL2F0dHJpYnV0ZXMuaHRtbFxuLy8gTGVhcm4gbGlmZS1jeWNsZSBjYWxsYmFja3M6XG4vLyAgLSBodHRwczovL2RvY3MuY29jb3MuY29tL2NyZWF0b3IvbWFudWFsL2VuL3NjcmlwdGluZy9saWZlLWN5Y2xlLWNhbGxiYWNrcy5odG1sXG5cbmltcG9ydCBEcmF3aW5nQm9hcmQgZnJvbSBcIi4vRHJhd2luZ0JvYXJkXCI7XG5cbmNvbnN0IHsgY2NjbGFzcywgcHJvcGVydHkgfSA9IGNjLl9kZWNvcmF0b3I7XG5cbmVudW0gR2FtZVN0YXRlIHtcbiAgICBkcmF3aW5nID0gMSxcbiAgICBlcmFzaW5nID0gMixcbn1cblxuQGNjY2xhc3NcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdhbWUgZXh0ZW5kcyBjYy5Db21wb25lbnQge1xuICAgIEBwcm9wZXJ0eShjYy5Ob2RlKVxuICAgIGRyYXdOb2RlOiBjYy5Ob2RlID0gbnVsbDtcblxuICAgIEBwcm9wZXJ0eShjYy5DYW1lcmEpXG4gICAgY2FwdHVyZUNhbWVyYTogY2MuQ2FtZXJhID0gbnVsbDtcblxuICAgIEBwcm9wZXJ0eShjYy5DYW1lcmEpXG4gICAgbWFpbkNhbWVyYTogY2MuQ2FtZXJhID0gbnVsbDtcblxuICAgIHByaXZhdGUgdGFyZ2V0Q2FtZXJhOiBjYy5DYW1lcmE7XG4gICAgcHJpdmF0ZSBkYjogRHJhd2luZ0JvYXJkID0gbnVsbDtcbiAgICBwcml2YXRlIGdhbWVTdGF0ZTogR2FtZVN0YXRlID0gR2FtZVN0YXRlLmRyYXdpbmc7XG4gICAgcHJpdmF0ZSB0ZXh0dXJlOiBjYy5SZW5kZXJUZXh0dXJlID0gbnVsbDtcbiAgICBwcml2YXRlIHByZVBvczogY2MuVmVjMiA9IGNjLlZlYzIuWkVSTztcbiAgICBwcml2YXRlIHN0YXJ0UG9zOiBjYy5WZWMyID0gY2MuVmVjMi5aRVJPO1xuICAgIHByaXZhdGUgbGFzdENvbG9yOiBjYy5Db2xvciA9IGNjLkNvbG9yLkJMVUU7XG4gICAgcHJpdmF0ZSBlcnJDb2xvcjogY2MuQ29sb3IgPSBjYy5Db2xvci5SRUQ7XG4gICAgcHJpdmF0ZSBsYXN0TGluZVdpZHRoOiBudW1iZXIgPSAxO1xuICAgIHByaXZhdGUgaGlzdG9yeTogYW55W10gPSBbXTtcbiAgICBwcml2YXRlIHRvdWNoSWQgPSAtMTtcbiAgICBwcml2YXRlIHRvdWNoU2NhbGUgPSBmYWxzZTtcbiAgXG5cbiAgICBzdGFydCgpIHtcbiAgICAgICAgdGhpcy5pbml0RGIoKTtcbiAgICAgICAgdGhpcy5pbml0VGV4dHVyZSgpO1xuICAgICAgICB0aGlzLmluaXRSZWFkKCk7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRyYXdOb2RlLm9uKFwidG91Y2hzdGFydFwiLCB0aGlzLm9uVG91Y2hTdGFydCwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLmRyYXdOb2RlLm9uKFwidG91Y2htb3ZlXCIsIHRoaXMub25Ub3VjaE1vdmUsIHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5kcmF3Tm9kZS5vbihcInRvdWNoZW5kXCIsIHRoaXMub25Ub3VjaEVuZCwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLmRyYXdOb2RlLm9uKFwidG91Y2hjYW5jZWxcIiwgdGhpcy5vblRvdWNoRW5kLCB0aGlzKTtcbiAgICAgICAgfSwgMjAwMCk7XG4gICAgfVxuXG4gICAgaW5pdERiKCkge1xuICAgICAgICAvL+WIm+W7uuS4gOS4queUu+advyjpnIDkvKDlhaXnlLvmnb/lsLrlr7jvvIzlsIboh6rliqjliJ3lp4vljJYpXG4gICAgICAgIHRoaXMuZGIgPSBuZXcgRHJhd2luZ0JvYXJkKHRoaXMuZHJhd05vZGUud2lkdGgsIHRoaXMuZHJhd05vZGUuaGVpZ2h0KTtcbiAgICAgICAgLy/orr7nva7nlLvmnb/nmoTnu5jlm77popzoibLvvIjmr4/mrKHnu5jliLbliY3pg73lj6/ku6Xph43mlrDorr7nva7vvIlcbiAgICAgICAgdGhpcy5sYXN0TGluZVdpZHRoID0gMTU7XG4gICAgICAgIHRoaXMuZGIuc2V0TGluZVdpZHRoKHRoaXMubGFzdExpbmVXaWR0aCk7XG4gICAgICAgIC8vIHRoaXMuZGIuc2V0Q29sb3IodGhpcy5sYXN0Q29sb3IuciwgdGhpcy5sYXN0Q29sb3IuZywgdGhpcy5sYXN0Q29sb3IuYiwgdGhpcy5sYXN0Q29sb3IuYSk7XG4gICAgICAgIC8v57q/5p2h56uv54K55Lul5ZyG6KeS57uT5bC+XG4gICAgICAgIHRoaXMuZGIuc2V0TGluZUNpcmNsZUVuZCh0cnVlKTtcbiAgICB9XG5cbiAgICBpbml0VGV4dHVyZSgpIHtcbiAgICAgICAgdGhpcy50ZXh0dXJlID0gbmV3IGNjLlJlbmRlclRleHR1cmUoKTtcbiAgICAgICAgdGhpcy50ZXh0dXJlLmluaXRXaXRoU2l6ZSh0aGlzLmRyYXdOb2RlLndpZHRoLCB0aGlzLmRyYXdOb2RlLmhlaWdodCwgY2MuUmVuZGVyVGV4dHVyZS5EZXB0aFN0ZW5jaWxGb3JtYXQuUkJfRk1UX1M4KTtcbiAgICAgICAgbGV0IHNwZjogY2MuU3ByaXRlRnJhbWUgPSBuZXcgY2MuU3ByaXRlRnJhbWUodGhpcy50ZXh0dXJlKTtcbiAgICAgICAgdGhpcy5kcmF3Tm9kZS5nZXRDb21wb25lbnQoY2MuU3ByaXRlKS5zcHJpdGVGcmFtZSA9IHNwZjtcbiAgICB9XG5cbiAgICBpbml0UmVhZCgpe1xuICAgICAgICB0aGlzLnRhcmdldENhbWVyYSA9IHRoaXMubm9kZS5nZXRDaGlsZEJ5TmFtZShcInRhZ0NhbWVyYVwiKS5nZXRDb21wb25lbnQoY2MuQ2FtZXJhKTtcbiAgICAgICAgdmFyIHJhbmRlciA9IG5ldyBjYy5SZW5kZXJUZXh0dXJlKCk7XG4gICAgICAgIHJhbmRlci5pbml0V2l0aFNpemUodGhpcy5ub2RlLndpZHRoLCB0aGlzLm5vZGUuaGVpZ2h0LCBjYy5SZW5kZXJUZXh0dXJlLkRlcHRoU3RlbmNpbEZvcm1hdC5SQl9GTVRfUzgpO1xuICAgICAgICB0aGlzLnRhcmdldENhbWVyYS50YXJnZXRUZXh0dXJlID0gcmFuZGVyO1xuICAgICAgICB0aGlzLnRhcmdldENhbWVyYS5yZW5kZXIoKTtcbiAgICAgICAgY29uc29sZS5sb2coXCLlrozmiJBcIik7XG4gICAgfVxuXG4gICAgb25Ub3VjaFN0YXJ0KGU6IGNjLkV2ZW50LkV2ZW50VG91Y2gpIHtcbiAgICAgICAgLy/lsIbop6bmkbjkvY3nva7kvZzkuLrnur/mnaHnmoTotbfngrlcbiAgICAgICAgLy/nlLvmnb/kuK3kvb/nlKjnmoTlnZDmoIfns7vvvIzkuI7lm77niYflnZDmoIfns7vkuIDmoLfvvIzljp/ngrnlnKjlt6bkuIrop5LvvIxY6L205ZCR5Y+z5Li65q2j77yMWei9tOWQkeS4i+S4uuato1xuICAgICAgICAvL+aJgOS7pVnovbTlnZDmoIflupTlj43ov4fmnaUsIOi/memHjOeUqGdldExvY2F0aW9uSW5WaWV36ICM5LiN5pivZ2V0TG9jYXRpb25cbiAgIFxuICAgICAgICB0aGlzLnRvdWNoSWQgPSBlLmdldElEKCk7XG4gICAgICAgIGlmKHRoaXMudG91Y2hJZCA9PSAxKXtcbiAgICAgICAgICAgIHRoaXMudG91Y2hTY2FsZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gXG5cbiAgICAgICAgbGV0IHBvcyA9IGUuZ2V0TG9jYXRpb24oKTtcbiAgICAgICAgdGhpcy5wcmVQb3MgPSB0aGlzLmNvbnZlcnRUb0RyYXdOb2RlUG9zKHBvcyk7XG4gICAgICAgIHRoaXMuc3RhcnRQb3MgPSB0aGlzLmNvbnZlcnRUb0RyYXdOb2RlUG9zKHBvcyk7XG4gICAgICAgIHRoaXMuZGIubW92ZVRvKHRoaXMucHJlUG9zLngsIHRoaXMucHJlUG9zLnkpO1xuICAgICAgICBcbiAgICB9XG5cbiAgICBvblRvdWNoTW92ZShlOiBjYy5FdmVudC5FdmVudFRvdWNoKSB7XG4gICAgICAgIGxldCB0b3VjaGVzID0gZS5nZXRUb3VjaGVzKCk7XG4gICAgICAgIHZhciB0b3VjaDEgPSB0b3VjaGVzWzBdXG4gICAgICAgIHZhciBkZWx0YTEgPSB0b3VjaDEuZ2V0RGVsdGEoKTtcbiAgICAgICAgbGV0IHBvcyA9IGUuZ2V0TG9jYXRpb24oKTtcbiBcbiAgICAgICAgbGV0IHBvczEgPSB0aGlzLmNvbnZlcnRUb0RyYXdOb2RlUG9zKHRvdWNoMS5nZXRMb2NhdGlvbigpKTtcbiAgICAgICAgbGV0IGRzdCA9IHRoaXMuc3RhcnRQb3Muc3ViKHBvczEpLm1hZygpXG4gICAgICAgIC8vIHRoaXMubGFiZWwuc3RyaW5nID0gdG91Y2hlcy5sZW5ndGggKyBcIlwiO1xuICAgICAgICBpZih0b3VjaGVzLmxlbmd0aCA9PSAxICYmIHRoaXMudG91Y2hJZCA8IDEgJiYgIXRoaXMudG91Y2hTY2FsZSAmJiBkc3QgPiA3KXtcbiAgICAgICAgICAgIC8vIGFsZXJ0KFwi5LiN6K+l6L+b5p2lXCIpO1xuICAgICAgICAgICAgdGhpcy5wcmVQb3MgPSB0aGlzLmNvbnZlcnRUb0RyYXdOb2RlUG9zKHBvcyk7XG4gICAgICAgICAgICB2YXIgamcgPSB0aGlzLnBkKGUpO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VDb2xvcihqZylcbiAgICAgICAgICAgIGlmICh0aGlzLmdhbWVTdGF0ZSA9PSBHYW1lU3RhdGUuZHJhd2luZykge1xuICAgICAgICAgICAgICAgIC8v5LuO5LiK5LiA5qyh57uY5Yi257q/5p2h5ZCO55qE57uI54K55byA5aeL5ZCR6byg5qCH5b2T5YmN5L2N572u57uY5Yi257q/5p2hXG4gICAgICAgICAgICAgICAgdGhpcy5kYi5saW5lVG8odGhpcy5wcmVQb3MueCwgdGhpcy5wcmVQb3MueSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2FtZVN0YXRlID09IEdhbWVTdGF0ZS5lcmFzaW5nKSB7XG4gICAgICAgICAgICAgICAgLy8g5qmh55qu5pOmXG4gICAgICAgICAgICAgICAgdGhpcy5kYi5jaXJjbGUodGhpcy5wcmVQb3MueCwgdGhpcy5wcmVQb3MueSwgMTApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy/mr4/mrKHnlLvmnb/kuK3nmoTmlbDmja7mnInlj5jljJblkI7vvIzlj4rml7blsIbmlbDmja7lupTnlKjliLDotLTlm77kuIrvvIzlnKjlsY/luZXkuIrmmL7npLrlh7rmnaVcbiAgICAgICAgICAgIHRoaXMuZHJhd1RvSW1nKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZih0b3VjaGVzLmxlbmd0aCA9PSAyKXtcbiAgICAgICAgICAgIHZhciB0b3VjaDEgPSB0b3VjaGVzWzBdLCB0b3VjaDIgPSB0b3VjaGVzWzFdO1xuICAgICAgICAgICAgdmFyIGRlbHRhMSA9IHRvdWNoMS5nZXREZWx0YSgpLCBkZWx0YTIgPSB0b3VjaDIuZ2V0RGVsdGEoKTtcbiAgICAgICAgICAgIHZhciB0b3VjaFBvaW50MSA9IHRoaXMubm9kZS5wYXJlbnQuY29udmVydFRvTm9kZVNwYWNlQVIodG91Y2gxLmdldExvY2F0aW9uKCkpO1xuICAgICAgICAgICAgdmFyIHRvdWNoUG9pbnQyID0gdGhpcy5ub2RlLnBhcmVudC5jb252ZXJ0VG9Ob2RlU3BhY2VBUih0b3VjaDIuZ2V0TG9jYXRpb24oKSk7XG5cbiAgICAgICAgICAgIHZhciBkaXN0YW5jZSA9IHRvdWNoUG9pbnQxLnN1Yih0b3VjaFBvaW50Mik7XG4gICAgICAgICAgICB2YXIgZGVsdGEgPSBkZWx0YTEuc3ViKGRlbHRhMik7XG4gICAgICAgICAgICB2YXIgc2NhbGUgPSAxO1xuXG4gICAgICAgICAgICBpZihNYXRoLmFicyhkaXN0YW5jZS54KSA+IE1hdGguYWJzKGRpc3RhbmNlLnkpKXtcbiAgICAgICAgICAgICAgICBzY2FsZSA9IChkaXN0YW5jZS54ICsgZGVsdGEueCkgLyBkaXN0YW5jZS54ICogdGhpcy5ub2RlLnNjYWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICBzY2FsZSA9IChkaXN0YW5jZS55ICsgZGVsdGEueSkgLyBkaXN0YW5jZS55ICogdGhpcy5ub2RlLnNjYWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoc2NhbGUgPiAyICkgc2NhbGUgPSAyO1xuICAgICAgICAgICAgdGhpcy5ub2RlLnNjYWxlID0gc2NhbGUgPD0gMC4xID8gMC4xOiBzY2FsZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uVG91Y2hFbmQoZTogY2MuRXZlbnQuRXZlbnRUb3VjaCkge1xuICAgICAgICB0aGlzLnRvdWNoSWQgPSBlLmdldElEKCk7XG4gICAgICAgIGlmKHRoaXMudG91Y2hJZCA9PSAxKSB0aGlzLnRvdWNoU2NhbGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hZGRIaXN0b3J5KCk7XG4gICAgfVxuXG4gICAgcGQoZXZlbnQpe1xuICAgICAgICBsZXQgY2hhID0gMjtcbiAgICAgICAgdmFyIHBvcyA9IGV2ZW50LmdldExvY2F0aW9uKCk7XG4gICAgICAgIHZhciBqZyA9IGZhbHNlO1xuICAgICAgICBmb3IobGV0IGk9LWNoYTsgaTxjaGE7aSsrKXtcbiAgICAgICAgICAgIGxldCBwb3N0aW9uID0gY2MudjIoKTtcbiAgICAgICAgICAgIHBvc3Rpb24ueCA9IHBvcy54ICsgaTtcbiAgICAgICAgICAgIGZvcihsZXQgaiA9LWNoYTsgajxjaGE7IGorKyl7XG4gICAgICAgICAgICAgICAgcG9zdGlvbi55ID0gcG9zLnkgKyBqO1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwi5qOA5rWL54K5OlwiLHBvc3Rpb24ueCxwb3N0aW9uLnkpO1xuICAgICAgICAgICAgICAgIGxldCBpbWcgPSB0aGlzLmdldEdyYXBoaXNEYXRhKHBvc3Rpb24pO1xuICAgICAgICAgICAgICAgIGlmKChpbWdbMF0gIT0gMjU1ICYmIGltZ1sxXSE9MjU1ICYmIGltZ1syXSE9MjU1KSl7XG4gICAgICAgICAgICAgICAgICAgIGpnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaiA9IDEwMDAwOyBpID0gMTAwMDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICBcbiAgICAgICAgfVxuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gamc7XG5cbiAgICB9XG5cbiAgICBjb252ZXJ0VG9EcmF3Tm9kZVBvcyh3b3JsZFBvczogY2MuVmVjMikge1xuICAgICAgICBsZXQgcG9zID0gdGhpcy5kcmF3Tm9kZS5jb252ZXJ0VG9Ob2RlU3BhY2VBUih3b3JsZFBvcyk7XG4gICAgICAgIHBvcy54ICs9IHRoaXMuZHJhd05vZGUud2lkdGggKiB0aGlzLmRyYXdOb2RlLmFuY2hvclg7XG4gICAgICAgIHBvcy55ICs9IHRoaXMuZHJhd05vZGUuaGVpZ2h0ICogdGhpcy5kcmF3Tm9kZS5hbmNob3JZO1xuICAgICAgICBwb3MueSA9IHRoaXMuZHJhd05vZGUuaGVpZ2h0IC0gcG9zLnk7XG4gICAgICAgIHJldHVybiBwb3M7XG4gICAgfVxuXG4gICAgYWRkSGlzdG9yeSgpIHtcbiAgICAgICAgbGV0IGNvcHkgPSB0aGlzLmRiLmNvcHlEYXRhKCk7XG4gICAgICAgIGxldCB1Y29weSA9IG5ldyBVaW50OEFycmF5KGNvcHkpO1xuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaCh7IGRhdGE6IHVjb3B5IH0pO1xuICAgICAgICAvLyBjYy5sb2coJ+WOhuWPsuatpemqpDogJywgdGhpcy5oaXN0b3J5Lmxlbmd0aCk7XG4gICAgfVxuXG4gICAgZHJhd1RvSW1nKCkge1xuICAgICAgICAvL+iOt+WPlueUu+adv+S4ree7mOWItueahOWbvuahiOaVsOaNrlxuICAgICAgICBsZXQgZGF0YTogVWludDhBcnJheSA9IHRoaXMuZGIuZ2V0RGF0YSgpO1xuICAgICAgICAvL+WwhuaVsOaNruS8oOmAkue7mei0tOWbvuWvueixoVxuICAgICAgICB0aGlzLnRleHR1cmUuaW5pdFdpdGhEYXRhKGRhdGEsIGNjLlRleHR1cmUyRC5QaXhlbEZvcm1hdC5SR0JBODg4OCwgdGhpcy5kYi53aWR0aCwgdGhpcy5kYi5oZWlnaHQpO1xuICAgIH1cblxuICAgIGNoYW5nZUNvbG9yKHJlZCl7XG4gICAgICAgIGlmKCFyZWQpIHRoaXMuZGIuc2V0Q29sb3IodGhpcy5lcnJDb2xvci5yLCB0aGlzLmVyckNvbG9yLmcsIHRoaXMuZXJyQ29sb3IuYiwgdGhpcy5lcnJDb2xvci5hKVxuICAgICAgICBlbHNlIHRoaXMuZGIuc2V0Q29sb3IodGhpcy5sYXN0Q29sb3IuciwgdGhpcy5sYXN0Q29sb3IuZywgdGhpcy5sYXN0Q29sb3IuYiwgdGhpcy5sYXN0Q29sb3IuYSk7XG4gICAgfVxuXG4gICAgZ2V0R3JhcGhpc0RhdGEocG9pbnQpe1xuICAgICAgICBsZXQgVWludDggPSBuZXcgVWludDhBcnJheSg0KTtcbiAgICAgICAgVWludDggPSB0aGlzLnRhcmdldENhbWVyYS50YXJnZXRUZXh0dXJlLnJlYWRQaXhlbHMoVWludDgscG9pbnQueCxwb2ludC55LDEsMSk7XG5cbiAgICAgICAgcmV0dXJuIFVpbnQ4O1xuICAgIH1cblxuXG4gICAgb25CdG5EcmF3KCkge1xuICAgICAgICB0aGlzLmRiLnNldExpbmVXaWR0aCh0aGlzLmxhc3RMaW5lV2lkdGgpO1xuICAgICAgICB0aGlzLmRiLnNldENvbG9yKHRoaXMubGFzdENvbG9yLnIsIHRoaXMubGFzdENvbG9yLmcsIHRoaXMubGFzdENvbG9yLmIsIHRoaXMubGFzdENvbG9yLmEpO1xuICAgICAgICB0aGlzLmdhbWVTdGF0ZSA9IEdhbWVTdGF0ZS5kcmF3aW5nO1xuICAgIH1cblxuICAgIG9uQnRuRXJhc2UoKSB7XG4gICAgICAgIHRoaXMuZGIuc2V0TGluZVdpZHRoKHRoaXMubGFzdExpbmVXaWR0aCAqIDMpO1xuICAgICAgICAvLyDmqaHnmq7mk6bnmoTpopzoibLkuI3og73mmK8oMCwwLDAsMCks5Zug5Li66L+Z5qC35Lya5ZKMRHJhd2luZ0JvYXJk6YeM55qE6buY6K6k6aKc6Imy55u45ZCM5a+86Ie057uY5Yi26Lez6L+HXG4gICAgICAgIHRoaXMuZGIuc2V0Q29sb3IoMjU1LCAyNTUsIDI1NSwgMCk7XG4gICAgICAgIHRoaXMuZ2FtZVN0YXRlID0gR2FtZVN0YXRlLmVyYXNpbmc7XG5cbiAgICB9XG5cbiAgICBvbkJ0bkNsZWFyKCkge1xuICAgICAgICB0aGlzLmRiLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuZHJhd1RvSW1nKCk7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5zcGxpY2UoMCwgdGhpcy5oaXN0b3J5Lmxlbmd0aCk7XG4gICAgfVxuXG4gICAgb25CdG5SZXZva2UoKSB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wb3AoKTtcbiAgICAgICAgaWYgKHRoaXMuaGlzdG9yeS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBkYXRhOiBVaW50OEFycmF5ID0gdGhpcy5oaXN0b3J5W3RoaXMuaGlzdG9yeS5sZW5ndGggLSAxXS5kYXRhO1xuICAgICAgICAgICAgdGhpcy5kYi5zZXREYXRhKGRhdGEuYnVmZmVyKTtcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZS5pbml0V2l0aERhdGEodGhpcy5kYi5nZXREYXRhKCksIGNjLlRleHR1cmUyRC5QaXhlbEZvcm1hdC5SR0JBODg4OCwgdGhpcy5kYi53aWR0aCwgdGhpcy5kYi5oZWlnaHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vbkJ0bkNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2MubG9nKCfljoblj7LorrDlvZXliankvZk6ICcsIHRoaXMuaGlzdG9yeS5sZW5ndGgpO1xuICAgIH1cblxuICAgIG9uQnRuU2F2ZSgpIHtcbiAgICAgICAgaWYgKGNjLnN5cy5pc0Jyb3dzZXIpIHtcbiAgICAgICAgICAgIGxldCB3aWR0aCA9IHRoaXMuZHJhd05vZGUud2lkdGg7XG4gICAgICAgICAgICBsZXQgaGVpZ2h0ID0gdGhpcy5kcmF3Tm9kZS5oZWlnaHQ7XG5cbiAgICAgICAgICAgIHRoaXMuY2FwdHVyZUNhbWVyYS5lbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCB0ZXh0dXJlID0gbmV3IGNjLlJlbmRlclRleHR1cmUoKTtcbiAgICAgICAgICAgIHRleHR1cmUuaW5pdFdpdGhTaXplKHdpZHRoLCBoZWlnaHQsIGNjLlJlbmRlclRleHR1cmUuRGVwdGhTdGVuY2lsRm9ybWF0LlJCX0ZNVF9TOCk7XG4gICAgICAgICAgICB0aGlzLmNhcHR1cmVDYW1lcmEudGFyZ2V0VGV4dHVyZSA9IHRleHR1cmU7XG5cbiAgICAgICAgICAgIGxldCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgICAgICBsZXQgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgICAgICB0aGlzLmNhcHR1cmVDYW1lcmEucmVuZGVyKCk7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHRleHR1cmUucmVhZFBpeGVscygpO1xuICAgICAgICAgICAgLy8gd3JpdGUgdGhlIHJlbmRlciBkYXRhXG4gICAgICAgICAgICBsZXQgcm93Qnl0ZXMgPSB3aWR0aCAqIDQ7XG4gICAgICAgICAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNyb3cgPSBoZWlnaHQgLSAxIC0gcm93O1xuICAgICAgICAgICAgICAgIGxldCBpbWFnZURhdGEgPSBjdHguY3JlYXRlSW1hZ2VEYXRhKHdpZHRoLCAxKTtcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSBzcm93ICogd2lkdGggKiA0O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93Qnl0ZXM7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpbWFnZURhdGEuZGF0YVtpXSA9IGRhdGFbc3RhcnQgKyBpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3R4LnB1dEltYWdlRGF0YShpbWFnZURhdGEsIDAsIHJvdyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgbGV0IGRhdGFVcmwgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTtcbiAgICAgICAgICAgIC8vIGNjLmxvZygnaWFtZ2UtYmFzZTY0OicsIGRhdGFVcmwpO1xuICAgICAgICAgICAgbGV0IHNhdmVMaW5rOiBhbnkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnYScpO1xuICAgICAgICAgICAgc2F2ZUxpbmsuaHJlZiA9IGRhdGFVcmw7XG4gICAgICAgICAgICBzYXZlTGluay5kb3dubG9hZCA9IFN0cmluZyhEYXRlLm5vdygpKSArICcucG5nJztcbiAgICAgICAgICAgIGxldCBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdNb3VzZUV2ZW50cycpO1xuICAgICAgICAgICAgZXZlbnQuaW5pdE1vdXNlRXZlbnQoJ2NsaWNrJywgdHJ1ZSwgZmFsc2UsIHdpbmRvdywgMCwgMCwgMCwgMCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAsIG51bGwpO1xuICAgICAgICAgICAgc2F2ZUxpbmsuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlT25jZSh0ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhcHR1cmVDYW1lcmEuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfSwgMC4xKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNjLndhcm4oJ+aaguaXtuWPquaUr+aMgXdlYuerr+S/neWtmOWbvueJhycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlIChkdCkge1xuICAgICAgICBcbiAgICB9XG59XG4iXX0= //------QC-SOURCE-SPLIT------