Mandala/temp/quick-scripts/dst/assets/Script/DrawingBoard.js
2024-10-30 15:19:32 +08:00

823 lines
103 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(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