(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/script/mk/utils/EncryptUtil.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, '4dd7c+x4MRMUpC9k5xzhEUq', 'EncryptUtil'); // script/mk/utils/EncryptUtil.ts "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.EncryptUtil = void 0; var hmacSha256_1 = require("./encrypt/hmacSha256"); var CryptoJS = require("./encrypt/aes.js"); /** * 加密解密工具类 * @author 邹勇 */ var EncryptUtil = /** @class */ (function () { function EncryptUtil() { this.options = { default_key_size: 2048, default_public_exponent: new Uint8Array([0x01, 0x00, 0x01]) }; } /** * 随机生成多位字符串 * @param len 字符串长度 * @returns */ EncryptUtil.prototype.randomString = function (len) { if (len === void 0) { len = 32; } var $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnoprstuvwxyz123456789'; var maxPos = $chars.length; var pwd = ''; for (var i = 0; i < len; i++) { pwd += $chars.charAt(Math.floor(Math.random() * maxPos)); } return pwd; }; //说明: // 1.如果加密解密涉及到前端和后端,则这里的key要保持和后端的key一致 // 2.AES的算法模式有好几种(ECB,CBC,CFB,OFB),所以也要和后端保持一致 // 3.AES的补码方式有两种(PKS5,PKS7),所以也要和后端保持一致 // 4.AES的密钥长度有三种(128,192,256,默认是128),所以也要和后端保持一致 // 5.AES的加密结果编码方式有两种(base64和十六进制),具体怎么选择由自己定,但是加密和解密的编码方式要统一 //十六位十六进制数作为秘钥 // private public key = fun_aes.CryptoJS.enc.Utf8.parse("3454345434543454"); //十六位十六进制数作为秘钥偏移量 // private public iv = fun_aes.CryptoJS.enc.Utf8.parse('6666666666666666'); /** * 说明: * 1.如果加密解密涉及到前端和后端,则这里的key要保持和后端的key一致 * 2.AES的算法模式有好几种(ECB,CBC,CFB,OFB),所以也要和后端保持一致 * 3.AES的补码方式有两种(PKS5,PKS7),所以也要和后端保持一致 * 4.AES的密钥长度有三种(128,192,256,默认是128),所以也要和后端保持一致 * 5.AES的加密结果编码方式有两种(base64和十六进制),具体怎么选择由自己定,但是加密和解密的编码方式要统一 * 十六位十六进制数作为秘钥 * private public key = fun_aes.CryptoJS.enc.Utf8.parse("3454345434543454"); * 十六位十六进制数作为秘钥偏移量 * private public iv = fun_aes.CryptoJS.enc.Utf8.parse('6666666666666666'); * * aes加密 * @param word 需要加密的字符串 * @param tkey 加密key,一般为sessionkey * @param appid 游戏的appid * @param state true 存包长 false /r/n * @returns */ EncryptUtil.prototype.encrypt = function (word, tkey, appid, state) { if (state === void 0) { state = true; } var tiv = tkey.substr(0, 16); //明文拼接 var newStr = ''; if (state) { newStr = tiv + word + appid; } else { newStr = tiv + word + '\r\n' + appid; } //加密后 var key = CryptoJS.enc.Utf8.parse(tkey); var iv = CryptoJS.enc.Utf8.parse(tiv); newStr = CryptoJS.enc.Utf8.parse(newStr); var encrypted = CryptoJS.AES.encrypt(newStr, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); encrypted = encrypted.toString(); var mac = hmacSha256_1.hmacSha256.Instance.hex_hmac_sha256(tkey, encrypted); return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(tiv + encrypted + mac)); }; /** * aes解密 * @param word 需要加密的字符串 * @param tkey 加密key,一般为sessionkey * @param appid 游戏的appid * @param state true 存包长 false /r/n * @returns */ EncryptUtil.prototype.decrypt = function (word, tkey, appid, state) { if (state === void 0) { state = true; } var en = CryptoJS.enc.Base64.parse(word).toString(CryptoJS.enc.Utf8); var newStrOne = en.substr(16); var temp = newStrOne.substr(0, newStrOne.length - 64); var de = temp; var key = CryptoJS.enc.Utf8.parse(tkey); var iv = CryptoJS.enc.Utf8.parse(tkey.substr(0, 16)); var decrypt = CryptoJS.AES.decrypt(de, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); var decryptedStr = CryptoJS.enc.Utf8.stringify(decrypt); decryptedStr = decryptedStr.toString(); var newStrThree = ''; if (state) { newStrThree = decryptedStr.slice(16).replace(new RegExp("(.*)" + appid), '$1'); } else { newStrThree = decryptedStr.slice(16).split('\r\n')[0]; } return newStrThree; }; /** * rsa加密 * @param word 需要加密的字符串 * @param isLong 字符串加长版 * @returns */ EncryptUtil.prototype.rsaEncrypt = function (word, isLong) { if (isLong === void 0) { isLong = false; } var jsb = new window['JSEncrypt'](this.options); //公钥 var publicString = '-----BEGIN PUBLIC KEY-----\n' + 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuwz5V8wt525dMS+A9wOd\n' + 'NAjvKgxdyoXYuZSlAJEXLhvJlaXwFCKEsUg/qBBeo4nrRnwaFAjG7ItqbCWR9Ozv\n' + '6oY5tMYQnFFK82XkMGbKm1gG0z9vYKhcNYgHZHi+QKAw4tLLWXWO/QBTGelEXptD\n' + 'azlNmdM+8wHOknTcMuIyjc9Yo5qCoNsCJpA465vnREiBezBbKB3rSw+LmrRcZcFk\n' + 's8hmGtjpabcQ8sCxco7mRzVh6/DomNWfNm7hUP6shrrJirwjQtaS51grlScj8KhN\n' + 'h+kBoiI4Ad0Xz0GHasK5hAMf3sXDsN61r0An8KTfa/nsYSJDwogPIKkeKAsmw9Df\n' + 'EQIDAQAB\n' + '-----END PUBLIC KEY-----'; jsb.setPublicKey(publicString); // 加密内容 var encrypted = isLong ? jsb.encryptLong(word) : jsb.encrypt(word); return encrypted; }; /** * for php pack( N , length ) * @param len * @returns */ EncryptUtil.prototype.pack = function (len) { var buf = new ArrayBuffer(4); var dataView = new DataView(buf); dataView.setUint32(0, len); var str2 = this.ab2str(buf); return str2; }; /** * * @param array * @returns */ EncryptUtil.prototype.utf8ArrayToStr = function (array) { var out, i, len, c; var char2, char3; out = ""; len = array.length; i = 0; while (i < len) { c = array[i++]; switch (c >> 4) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: // 0xxxxxxx out += String.fromCharCode(c); break; case 12: case 13: // 110x xxxx 10xx xxxx char2 = array[i++]; out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F)); break; case 14: // 1110 xxxx 10xx xxxx 10xx xxxx char2 = array[i++]; char3 = array[i++]; out += String.fromCharCode(((c & 0x0F) << 12) | ((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0)); break; } } return out; }; /** * UTF-16转UTF-8 * @param s * @returns */ EncryptUtil.prototype.utf16ToUtf8 = function (s) { if (!s) { return; } var i, code, ret = [], len = s.length; for (i = 0; i < len; i++) { code = s.charCodeAt(i); if (code > 0x0 && code <= 0x7f) { //单字节 //UTF-16 0000 - 007F //UTF-8 0xxxxxxx ret.push(s.charAt(i)); } else if (code >= 0x80 && code <= 0x7ff) { //双字节 //UTF-16 0080 - 07FF //UTF-8 110xxxxx 10xxxxxx ret.push( //110xxxxx String.fromCharCode(0xc0 | ((code >> 6) & 0x1f)), //10xxxxxx String.fromCharCode(0x80 | (code & 0x3f))); } else if (code >= 0x800 && code <= 0xffff) { //三字节 //UTF-16 0800 - FFFF //UTF-8 1110xxxx 10xxxxxx 10xxxxxx ret.push( //1110xxxx String.fromCharCode(0xe0 | ((code >> 12) & 0xf)), //10xxxxxx String.fromCharCode(0x80 | ((code >> 6) & 0x3f)), //10xxxxxx String.fromCharCode(0x80 | (code & 0x3f))); } } return ret.join(''); }; /** * UTF-8转UTF-16 * @param s * @returns */ EncryptUtil.prototype.utf8ToUtf16 = function (s) { if (!s) { return; } var i, codes, bytes, ret = [], len = s.length; for (i = 0; i < len; i++) { codes = []; codes.push(s.charCodeAt(i)); if (((codes[0] >> 7) & 0xff) == 0x0) { //单字节 0xxxxxxx ret.push(s.charAt(i)); } else if (((codes[0] >> 5) & 0xff) == 0x6) { //双字节 110xxxxx 10xxxxxx codes.push(s.charCodeAt(++i)); bytes = []; bytes.push(codes[0] & 0x1f); bytes.push(codes[1] & 0x3f); ret.push(String.fromCharCode((bytes[0] << 6) | bytes[1])); } else if (((codes[0] >> 4) & 0xff) == 0xe) { //三字节 1110xxxx 10xxxxxx 10xxxxxx codes.push(s.charCodeAt(++i)); codes.push(s.charCodeAt(++i)); bytes = []; bytes.push((codes[0] << 4) | ((codes[1] >> 2) & 0xf)); bytes.push(((codes[1] & 0x3) << 6) | (codes[2] & 0x3f)); ret.push(String.fromCharCode((bytes[0] << 8) | bytes[1])); } } return ret.join(''); }; /** * ArrayBuffer转为字符串,参数为ArrayBuffer对象 * @param buf * @returns */ EncryptUtil.prototype.ab2str = function (buf) { return String.fromCharCode.apply(null, new Uint8Array(buf)); }; /** * * @param fileData * @returns */ EncryptUtil.prototype.uint8ArrayToString = function (fileData) { var dataString = ""; for (var i = 0; i < fileData.length; i++) { dataString += String.fromCharCode(fileData[i]); } return dataString; }; /** * * @param str * @returns */ EncryptUtil.prototype.stringToUint8Array = function (str) { var arr = []; for (var i = 0, j = str.length; i < j; ++i) { arr.push(str.charCodeAt(i)); } var tmpUint8Array = new Uint8Array(arr); return tmpUint8Array; }; /** * 字符串转为ArrayBuffer对象,参数为字符串 * @param str * @returns */ EncryptUtil.prototype.str2ab = function (str) { var buf = new ArrayBuffer(str.length); // 每个字符占用2个字节 var bufView = new Uint8Array(buf); for (var i = 0, strLen = str.length; i < strLen; i++) { bufView[i] = str.charCodeAt(i); } return buf; }; return EncryptUtil; }()); exports.EncryptUtil = EncryptUtil; 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcc2NyaXB0XFxta1xcdXRpbHNcXEVuY3J5cHRVdGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1EQUFpRDtBQUNqRCwyQ0FBNEM7QUFFNUM7OztHQUdHO0FBQ0g7SUFBQTtRQXFHWSxZQUFPLEdBQUc7WUFDZCxnQkFBZ0IsRUFBRSxJQUFJO1lBQ3RCLHVCQUF1QixFQUFFLElBQUksVUFBVSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUM5RCxDQUFBO0lBb05MLENBQUM7SUExVEc7Ozs7T0FJRztJQUNJLGtDQUFZLEdBQW5CLFVBQW9CLEdBQVE7UUFBUixvQkFBQSxFQUFBLFFBQVE7UUFDeEIsSUFBSSxNQUFNLEdBQUcsOERBQThELENBQUM7UUFDNUUsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUMzQixJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDYixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFCLEdBQUcsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUE7U0FDM0Q7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRCxLQUFLO0lBQ0wsd0NBQXdDO0lBQ3hDLCtDQUErQztJQUMvQyx3Q0FBd0M7SUFDeEMsaURBQWlEO0lBQ2pELDZEQUE2RDtJQUM3RCxjQUFjO0lBQ2QsNEVBQTRFO0lBQzVFLGlCQUFpQjtJQUNqQiwyRUFBMkU7SUFFM0U7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQWtCRTtJQUNLLDZCQUFPLEdBQWQsVUFBZSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFZO1FBQVosc0JBQUEsRUFBQSxZQUFZO1FBQzFD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ZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaG1hY1NoYTI1NiB9IGZyb20gXCIuL2VuY3J5cHQvaG1hY1NoYTI1NlwiXHJcbmltcG9ydCAqIGFzIENyeXB0b0pTIGZyb20gXCIuL2VuY3J5cHQvYWVzLmpzXCJcclxuXHJcbi8qKlxyXG4gKiDliqDlr4bop6Plr4blt6XlhbfnsbtcclxuICogQGF1dGhvciDpgrnli4dcclxuICovXHJcbmV4cG9ydCBjbGFzcyBFbmNyeXB0VXRpbCB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDpmo/mnLrnlJ/miJDlpJrkvY3lrZfnrKbkuLJcclxuICAgICAqIEBwYXJhbSAgIGxlbiAgICDlrZfnrKbkuLLplb/luqZcclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmFuZG9tU3RyaW5nKGxlbiA9IDMyKSB7XHJcbiAgICAgICAgbGV0ICRjaGFycyA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3Byc3R1dnd4eXoxMjM0NTY3ODknO1xyXG4gICAgICAgIGxldCBtYXhQb3MgPSAkY2hhcnMubGVuZ3RoO1xyXG4gICAgICAgIGxldCBwd2QgPSAnJztcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHB3ZCArPSAkY2hhcnMuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG1heFBvcykpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwd2Q7XHJcbiAgICB9XHJcblxyXG4gICAgLy/or7TmmI7vvJpcclxuICAgIC8vICAxLuWmguaenOWKoOWvhuino+Wvhua2ieWPiuWIsOWJjeerr+WSjOWQjuerr++8jOWImei/memHjOeahGtleeimgeS/neaMgeWSjOWQjuerr+eahGtleeS4gOiHtFxyXG4gICAgLy8gIDIuQUVT55qE566X5rOV5qih5byP5pyJ5aW95Yeg56eN77yIRUNCLENCQyxDRkIsT0ZC77yJ77yM5omA5Lul5Lmf6KaB5ZKM5ZCO56uv5L+d5oyB5LiA6Ie0XHJcbiAgICAvLyAgMy5BRVPnmoTooaXnoIHmlrnlvI/mnInkuKTnp43vvIhQS1M177yMUEtTN++8ie+8jOaJgOS7peS5n+imgeWSjOWQjuerr+S/neaMgeS4gOiHtFxyXG4gICAgLy8gIDQuQUVT55qE5a+G6ZKl6ZW/5bqm5pyJ5LiJ56eN77yIMTI4LDE5MiwyNTbvvIzpu5jorqTmmK8xMjjvvInvvIzmiYDku6XkuZ/opoHlkozlkI7nq6/kv53mjIHkuIDoh7RcclxuICAgIC8vICA1LkFFU+eahOWKoOWvhue7k+aenOe8lueggeaWueW8j+acieS4pOenje+8iGJhc2U2NOWSjOWNgeWFrei/m+WItu+8ie+8jOWFt+S9k+aAjuS5iOmAieaLqeeUseiHquW3seWumu+8jOS9huaYr+WKoOWvhuWSjOino+WvhueahOe8lueggeaWueW8j+imgee7n+S4gFxyXG4gICAgLy/ljYHlha3kvY3ljYHlha3ov5vliLbmlbDkvZzkuLrnp5jpkqVcclxuICAgIC8vIHByaXZhdGUgcHVibGljIGtleSA9IGZ1bl9hZXMuQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UoXCIzNDU0MzQ1NDM0NTQzNDU0XCIpO1xyXG4gICAgLy/ljYHlha3kvY3ljYHlha3ov5vliLbmlbDkvZzkuLrnp5jpkqXlgY/np7vph49cclxuICAgIC8vIHByaXZhdGUgcHVibGljIGl2ID0gZnVuX2Flcy5DcnlwdG9KUy5lbmMuVXRmOC5wYXJzZSgnNjY2NjY2NjY2NjY2NjY2NicpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog6K+05piO77yaXHJcbiAgICAgKiAxLuWmguaenOWKoOWvhuino+Wvhua2ieWPiuWIsOWJjeerr+WSjOWQjuerr++8jOWImei/memHjOeahGtleeimgeS/neaMgeWSjOWQjuerr+eahGtleeS4gOiHtFxyXG4gICAgICogMi5BRVPnmoTnrpfms5XmqKHlvI/mnInlpb3lh6Dnp43vvIhFQ0IsQ0JDLENGQixPRkLvvInvvIzmiYDku6XkuZ/opoHlkozlkI7nq6/kv53mjIHkuIDoh7RcclxuICAgICAqIDMuQUVT55qE6KGl56CB5pa55byP5pyJ5Lik56eN77yIUEtTNe+8jFBLUzfvvInvvIzmiYDku6XkuZ/opoHlkozlkI7nq6/kv53mjIHkuIDoh7RcclxuICAgICAqIDQuQUVT55qE5a+G6ZKl6ZW/5bqm5pyJ5LiJ56eN77yIMTI4LDE5MiwyNTbvvIzpu5jorqTmmK8xMjjvvInvvIzmiYDku6XkuZ/opoHlkozlkI7nq6/kv53mjIHkuIDoh7RcclxuICAgICAqIDUuQUVT55qE5Yqg5a+G57uT5p6c57yW56CB5pa55byP5pyJ5Lik56eN77yIYmFzZTY05ZKM5Y2B5YWt6L+b5Yi277yJ77yM5YW35L2T5oCO5LmI6YCJ5oup55Sx6Ieq5bex5a6a77yM5L2G5piv5Yqg5a+G5ZKM6Kej5a+G55qE57yW56CB5pa55byP6KaB57uf5LiAXHJcbiAgICAgKiDljYHlha3kvY3ljYHlha3ov5vliLbmlbDkvZzkuLrnp5jpkqVcclxuICAgICAqIHByaXZhdGUgcHVibGljIGtleSA9IGZ1bl9hZXMuQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UoXCIzNDU0MzQ1NDM0NTQzNDU0XCIpO1xyXG4gICAgICog5Y2B5YWt5L2N5Y2B5YWt6L+b5Yi25pWw5L2c5Li656eY6ZKl5YGP56e76YePXHJcbiAgICAgKiBwcml2YXRlIHB1YmxpYyBpdiA9IGZ1bl9hZXMuQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UoJzY2NjY2NjY2NjY2NjY2NjYnKTtcclxuICAgICAqIFxyXG4gICAgICogYWVz5Yqg5a+GXHJcbiAgICAgKiBAcGFyYW0gICB3b3JkICAgIOmcgOimgeWKoOWvhueahOWtl+espuS4slxyXG4gICAgICogQHBhcmFtICAgdGtleSAgICDliqDlr4ZrZXnvvIzkuIDoiKzkuLpzZXNzaW9ua2V5XHJcbiAgICAgKiBAcGFyYW0gICBhcHBpZCAgIOa4uOaIj+eahGFwcGlkXHJcbiAgICAgKiBAcGFyYW0gICBzdGF0ZSAgIHRydWUg5a2Y5YyF6ZW/IGZhbHNlIC9yL25cclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBlbmNyeXB0KHdvcmQsIHRrZXksIGFwcGlkLCBzdGF0ZSA9IHRydWUpIHtcclxuICAgICAgICBsZXQgdGl2ID0gdGtleS5zdWJzdHIoMCwgMTYpO1xyXG5cclxuICAgICAgICAvL+aYjuaWh+aLvOaOpVxyXG4gICAgICAgIGxldCBuZXdTdHIgPSAnJztcclxuICAgICAgICBpZiAoc3RhdGUpIHtcclxuICAgICAgICAgICAgbmV3U3RyID0gdGl2ICsgd29yZCArIGFwcGlkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbmV3U3RyID0gdGl2ICsgd29yZCArICdcXHJcXG4nICsgYXBwaWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL+WKoOWvhuWQjlxyXG4gICAgICAgIGxldCBrZXkgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZSh0a2V5KTtcclxuICAgICAgICBsZXQgaXYgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZSh0aXYpO1xyXG5cclxuICAgICAgICBuZXdTdHIgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZShuZXdTdHIpO1xyXG4gICAgICAgIGxldCBlbmNyeXB0ZWQgPSBDcnlwdG9KUy5BRVMuZW5jcnlwdChuZXdTdHIsIGtleSwgeyBpdjogaXYsIG1vZGU6IENyeXB0b0pTLm1vZGUuQ0JDLCBwYWRkaW5nOiBDcnlwdG9KUy5wYWQuUGtjczcgfSk7XHJcbiAgICAgICAgZW5jcnlwdGVkID0gZW5jcnlwdGVkLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgbGV0IG1hYyA9IGhtYWNTaGEyNTYuSW5zdGFuY2UuaGV4X2htYWNfc2hhMjU2KHRrZXksIGVuY3J5cHRlZCk7XHJcbiAgICAgICAgcmV0dXJuIENyeXB0b0pTLmVuYy5CYXNlNjQuc3RyaW5naWZ5KENyeXB0b0pTLmVuYy5VdGY4LnBhcnNlKHRpdiArIGVuY3J5cHRlZCArIG1hYykpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogYWVz6Kej5a+GXHJcbiAgICAgKiBAcGFyYW0gICB3b3JkICAgIOmcgOimgeWKoOWvhueahOWtl+espuS4slxyXG4gICAgICogQHBhcmFtICAgdGtleSAgICDliqDlr4ZrZXnvvIzkuIDoiKzkuLpzZXNzaW9ua2V5XHJcbiAgICAgKiBAcGFyYW0gICBhcHBpZCAgIOa4uOaIj+eahGFwcGlkXHJcbiAgICAgKiBAcGFyYW0gICBzdGF0ZSAgIHRydWUg5a2Y5YyF6ZW/IGZhbHNlIC9yL25cclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGVjcnlwdCh3b3JkLCB0a2V5LCBhcHBpZCwgc3RhdGUgPSB0cnVlKSB7XHJcbiAgICAgICAgbGV0IGVuID0gQ3J5cHRvSlMuZW5jLkJhc2U2NC5wYXJzZSh3b3JkKS50b1N0cmluZyhDcnlwdG9KUy5lbmMuVXRmOCk7XHJcbiAgICAgICAgbGV0IG5ld1N0ck9uZSA9IGVuLnN1YnN0cigxNik7XHJcbiAgICAgICAgbGV0IHRlbXAgPSBuZXdTdHJPbmUuc3Vic3RyKDAsIG5ld1N0ck9uZS5sZW5ndGggLSA2NCk7XHJcbiAgICAgICAgbGV0IGRlID0gdGVtcDtcclxuXHJcbiAgICAgICAgbGV0IGtleSA9IENyeXB0b0pTLmVuYy5VdGY4LnBhcnNlKHRrZXkpO1xyXG4gICAgICAgIGxldCBpdiA9IENyeXB0b0pTLmVuYy5VdGY4LnBhcnNlKHRrZXkuc3Vic3RyKDAsIDE2KSk7XHJcblxyXG4gICAgICAgIGxldCBkZWNyeXB0ID0gQ3J5cHRvSlMuQUVTLmRlY3J5cHQoZGUsIGtleSwgeyBpdjogaXYsIG1vZGU6IENyeXB0b0pTLm1vZGUuQ0JDLCBwYWRkaW5nOiBDcnlwdG9KUy5wYWQuUGtjczcgfSk7XHJcbiAgICAgICAgbGV0IGRlY3J5cHRlZFN0ciA9IENyeXB0b0pTLmVuYy5VdGY4LnN0cmluZ2lmeShkZWNyeXB0KTtcclxuICAgICAgICBkZWNyeXB0ZWRTdHIgPSBkZWNyeXB0ZWRTdHIudG9TdHJpbmcoKTtcclxuXHJcbiAgICAgICAgbGV0IG5ld1N0clRocmVlID0gJyc7XHJcbiAgICAgICAgaWYgKHN0YXRlKSB7XHJcbiAgICAgICAgICAgIG5ld1N0clRocmVlID0gZGVjcnlwdGVkU3RyLnNsaWNlKDE2KS5yZXBsYWNlKG5ldyBSZWdFeHAoXCIoLiopXCIgKyBhcHBpZCksICckMScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbmV3U3RyVGhyZWUgPSBkZWNyeXB0ZWRTdHIuc2xpY2UoMTYpLnNwbGl0KCdcXHJcXG4nKVswXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ld1N0clRocmVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb3B0aW9ucyA9IHtcclxuICAgICAgICBkZWZhdWx0X2tleV9zaXplOiAyMDQ4LFxyXG4gICAgICAgIGRlZmF1bHRfcHVibGljX2V4cG9uZW50OiBuZXcgVWludDhBcnJheShbMHgwMSwgMHgwMCwgMHgwMV0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIHJzYeWKoOWvhlxyXG4gICAgICogQHBhcmFtICAgd29yZCAgICAgICAg6ZyA6KaB5Yqg5a+G55qE5a2X56ym5LiyXHJcbiAgICAgKiBAcGFyYW0gICBpc0xvbmcgICAgICDlrZfnrKbkuLLliqDplb/niYhcclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcnNhRW5jcnlwdCh3b3JkLCBpc0xvbmc6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGxldCBqc2IgPSBuZXcgd2luZG93WydKU0VuY3J5cHQnXSh0aGlzLm9wdGlvbnMpO1xyXG5cclxuICAgICAgICAvL+WFrOmSpVxyXG4gICAgICAgIGxldCBwdWJsaWNTdHJpbmcgPSAnLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cXG4nICtcclxuICAgICAgICAgICAgJ01JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBdXd6NVY4d3Q1MjVkTVMrQTl3T2RcXG4nICtcclxuICAgICAgICAgICAgJ05BanZLZ3hkeW9YWXVaU2xBSkVYTGh2SmxhWHdGQ0tFc1VnL3FCQmVvNG5yUm53YUZBakc3SXRxYkNXUjlPenZcXG4nICtcclxuICAgICAgICAgICAgJzZvWTV0TVlRbkZGSzgyWGtNR2JLbTFnRzB6OXZZS2hjTllnSFpIaStRS0F3NHRMTFdYV08vUUJUR2VsRVhwdERcXG4nICtcclxuICAgICAgICAgICAgJ2F6bE5tZE0rOHdIT2tuVGNNdUl5amM5WW81cUNvTnNDSnBBNDY1dm5SRWlCZXpCYktCM3JTdytMbXJSY1pjRmtcXG4nICtcclxuICAgICAgICAgICAgJ3M4aG1HdGpwYWJjUThzQ3hjbzdtUnpWaDYvRG9tTldmTm03aFVQNnNocnJKaXJ3alF0YVM1MWdybFNjajhLaE5cXG4nICtcclxuICAgICAgICAgICAgJ2gra0JvaUk0QWQwWHowR0hhc0s1aEFNZjNzWERzTjYxcjBBbjhLVGZhL25zWVNKRHdvZ1BJS2tlS0FzbXc5RGZcXG4nICtcclxuICAgICAgICAgICAgJ0VRSURBUUFCXFxuJyArXHJcbiAgICAgICAgICAgICctLS0tLUVORCBQVUJMSUMgS0VZLS0tLS0nXHJcbiAgICAgICAganNiLnNldFB1YmxpY0tleShwdWJsaWNTdHJpbmcpO1xyXG4gICAgICAgIC8vIOWKoOWvhuWGheWuuVxyXG4gICAgICAgIGxldCBlbmNyeXB0ZWQgPSBpc0xvbmcgPyBqc2IuZW5jcnlwdExvbmcod29yZCkgOiBqc2IuZW5jcnlwdCh3b3JkKTtcclxuICAgICAgICByZXR1cm4gZW5jcnlwdGVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogZm9yIHBocCBwYWNrKCBOICwgbGVuZ3RoIClcclxuICAgICAqIEBwYXJhbSAgIGxlbiAgICBcclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcGFjayhsZW46IG51bWJlcikge1xyXG4gICAgICAgIGxldCBidWY6IEFycmF5QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDQpO1xyXG4gICAgICAgIGxldCBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyhidWYpO1xyXG4gICAgICAgIGRhdGFWaWV3LnNldFVpbnQzMigwLCBsZW4pO1xyXG4gICAgICAgIGxldCBzdHIyID0gdGhpcy5hYjJzdHIoYnVmKTtcclxuICAgICAgICByZXR1cm4gc3RyMjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGFycmF5IFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1dGY4QXJyYXlUb1N0cihhcnJheSkge1xyXG4gICAgICAgIGxldCBvdXQsIGksIGxlbiwgYztcclxuICAgICAgICBsZXQgY2hhcjIsIGNoYXIzO1xyXG5cclxuICAgICAgICBvdXQgPSBcIlwiO1xyXG4gICAgICAgIGxlbiA9IGFycmF5Lmxlbmd0aDtcclxuICAgICAgICBpID0gMDtcclxuICAgICAgICB3aGlsZSAoaSA8IGxlbikge1xyXG4gICAgICAgICAgICBjID0gYXJyYXlbaSsrXTtcclxuICAgICAgICAgICAgc3dpdGNoIChjID4+IDQpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiBjYXNlIDI6IGNhc2UgMzogY2FzZSA0OiBjYXNlIDU6IGNhc2UgNjogY2FzZSA3OlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIDB4eHh4eHh4XHJcbiAgICAgICAgICAgICAgICAgICAgb3V0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDEyOiBjYXNlIDEzOlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIDExMHggeHh4eCAgIDEweHggeHh4eFxyXG4gICAgICAgICAgICAgICAgICAgIGNoYXIyID0gYXJyYXlbaSsrXTtcclxuICAgICAgICAgICAgICAgICAgICBvdXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGMgJiAweDFGKSA8PCA2KSB8IChjaGFyMiAmIDB4M0YpKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMTQ6XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gMTExMCB4eHh4ICAxMHh4IHh4eHggIDEweHggeHh4eFxyXG4gICAgICAgICAgICAgICAgICAgIGNoYXIyID0gYXJyYXlbaSsrXTtcclxuICAgICAgICAgICAgICAgICAgICBjaGFyMyA9IGFycmF5W2krK107XHJcbiAgICAgICAgICAgICAgICAgICAgb3V0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKChjICYgMHgwRikgPDwgMTIpIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKChjaGFyMiAmIDB4M0YpIDw8IDYpIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKChjaGFyMyAmIDB4M0YpIDw8IDApKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG91dDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVURi0xNui9rFVURi04XHJcbiAgICAgKiBAcGFyYW0gICBzIFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1dGYxNlRvVXRmOChzKSB7XHJcbiAgICAgICAgaWYgKCFzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBpLCBjb2RlLCByZXQgPSBbXSwgbGVuID0gcy5sZW5ndGg7XHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvZGUgPSBzLmNoYXJDb2RlQXQoaSk7XHJcbiAgICAgICAgICAgIGlmIChjb2RlID4gMHgwICYmIGNvZGUgPD0gMHg3Zikge1xyXG4gICAgICAgICAgICAgICAgLy/ljZXlrZfoioJcclxuICAgICAgICAgICAgICAgIC8vVVRGLTE2IDAwMDAgLSAwMDdGXHJcbiAgICAgICAgICAgICAgICAvL1VURi04ICAweHh4eHh4eFxyXG4gICAgICAgICAgICAgICAgcmV0LnB1c2gocy5jaGFyQXQoaSkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPj0gMHg4MCAmJiBjb2RlIDw9IDB4N2ZmKSB7XHJcbiAgICAgICAgICAgICAgICAvL+WPjOWtl+iKglxyXG4gICAgICAgICAgICAgICAgLy9VVEYtMTYgMDA4MCAtIDA3RkZcclxuICAgICAgICAgICAgICAgIC8vVVRGLTggIDExMHh4eHh4IDEweHh4eHh4XHJcbiAgICAgICAgICAgICAgICByZXQucHVzaChcclxuICAgICAgICAgICAgICAgICAgICAvLzExMHh4eHh4XHJcbiAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZSgweGMwIHwgKChjb2RlID4+IDYpICYgMHgxZikpLFxyXG4gICAgICAgICAgICAgICAgICAgIC8vMTB4eHh4eHhcclxuICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4ODAgfCAoY29kZSAmIDB4M2YpKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlID49IDB4ODAwICYmIGNvZGUgPD0gMHhmZmZmKSB7XHJcbiAgICAgICAgICAgICAgICAvL+S4ieWtl+iKglxyXG4gICAgICAgICAgICAgICAgLy9VVEYtMTYgMDgwMCAtIEZGRkZcclxuICAgICAgICAgICAgICAgIC8vVVRGLTggIDExMTB4eHh4IDEweHh4eHh4IDEweHh4eHh4XHJcbiAgICAgICAgICAgICAgICByZXQucHVzaChcclxuICAgICAgICAgICAgICAgICAgICAvLzExMTB4eHh4XHJcbiAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZSgweGUwIHwgKChjb2RlID4+IDEyKSAmIDB4ZikpLFxyXG4gICAgICAgICAgICAgICAgICAgIC8vMTB4eHh4eHhcclxuICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4ODAgfCAoKGNvZGUgPj4gNikgJiAweDNmKSksXHJcbiAgICAgICAgICAgICAgICAgICAgLy8xMHh4eHh4eFxyXG4gICAgICAgICAgICAgICAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoMHg4MCB8IChjb2RlICYgMHgzZikpXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmV0LmpvaW4oJycpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVVRGLTjovaxVVEYtMTZcclxuICAgICAqIEBwYXJhbSBzIFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1dGY4VG9VdGYxNihzKSB7XHJcbiAgICAgICAgaWYgKCFzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBpLCBjb2RlcywgYnl0ZXMsIHJldCA9IFtdLCBsZW4gPSBzLmxlbmd0aDtcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgY29kZXMgPSBbXTtcclxuICAgICAgICAgICAgY29kZXMucHVzaChzLmNoYXJDb2RlQXQoaSkpO1xyXG4gICAgICAgICAgICBpZiAoKChjb2Rlc1swXSA+PiA3KSAmIDB4ZmYpID09IDB4MCkge1xyXG4gICAgICAgICAgICAgICAgLy/ljZXlrZfoioIgIDB4eHh4eHh4XHJcbiAgICAgICAgICAgICAgICByZXQucHVzaChzLmNoYXJBdChpKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKChjb2Rlc1swXSA+PiA1KSAmIDB4ZmYpID09IDB4Nikge1xyXG4gICAgICAgICAgICAgICAgLy/lj4zlrZfoioIgIDExMHh4eHh4IDEweHh4eHh4XHJcbiAgICAgICAgICAgICAgICBjb2Rlcy5wdXNoKHMuY2hhckNvZGVBdCgrK2kpKTtcclxuICAgICAgICAgICAgICAgIGJ5dGVzID0gW107XHJcbiAgICAgICAgICAgICAgICBieXRlcy5wdXNoKGNvZGVzWzBdICYgMHgxZik7XHJcbiAgICAgICAgICAgICAgICBieXRlcy5wdXNoKGNvZGVzWzFdICYgMHgzZik7XHJcbiAgICAgICAgICAgICAgICByZXQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKChieXRlc1swXSA8PCA2KSB8IGJ5dGVzWzFdKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKChjb2Rlc1swXSA+PiA0KSAmIDB4ZmYpID09IDB4ZSkge1xyXG4gICAgICAgICAgICAgICAgLy/kuInlrZfoioIgIDExMTB4eHh4IDEweHh4eHh4IDEweHh4eHh4XHJcbiAgICAgICAgICAgICAgICBjb2Rlcy5wdXNoKHMuY2hhckNvZGVBdCgrK2kpKTtcclxuICAgICAgICAgICAgICAgIGNvZGVzLnB1c2gocy5jaGFyQ29kZUF0KCsraSkpO1xyXG4gICAgICAgICAgICAgICAgYnl0ZXMgPSBbXTtcclxuICAgICAgICAgICAgICAgIGJ5dGVzLnB1c2goKGNvZGVzWzBdIDw8IDQpIHwgKChjb2Rlc1sxXSA+PiAyKSAmIDB4ZikpO1xyXG4gICAgICAgICAgICAgICAgYnl0ZXMucHVzaCgoKGNvZGVzWzFdICYgMHgzKSA8PCA2KSB8IChjb2Rlc1syXSAmIDB4M2YpKTtcclxuICAgICAgICAgICAgICAgIHJldC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoKGJ5dGVzWzBdIDw8IDgpIHwgYnl0ZXNbMV0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmV0LmpvaW4oJycpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXJyYXlCdWZmZXLovazkuLrlrZfnrKbkuLLvvIzlj4LmlbDkuLpBcnJheUJ1ZmZlcuWvueixoVxyXG4gICAgICogQHBhcmFtIGJ1ZiBcclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWIyc3RyKGJ1ZjogQXJyYXlCdWZmZXIpIHtcclxuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDhBcnJheShidWYpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGZpbGVEYXRhIFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1aW50OEFycmF5VG9TdHJpbmcoZmlsZURhdGEpIHtcclxuICAgICAgICBsZXQgZGF0YVN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBkYXRhU3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoZmlsZURhdGFbaV0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGFTdHJpbmdcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHN0ciBcclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RyaW5nVG9VaW50OEFycmF5KHN0cikge1xyXG4gICAgICAgIGxldCBhcnIgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgaiA9IHN0ci5sZW5ndGg7IGkgPCBqOyArK2kpIHtcclxuICAgICAgICAgICAgYXJyLnB1c2goc3RyLmNoYXJDb2RlQXQoaSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHRtcFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShhcnIpO1xyXG4gICAgICAgIHJldHVybiB0bXBVaW50OEFycmF5XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlrZfnrKbkuLLovazkuLpBcnJheUJ1ZmZlcuWvueixoe+8jOWPguaVsOS4uuWtl+espuS4slxyXG4gICAgICogQHBhcmFtIHN0ciBcclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RyMmFiKHN0cikge1xyXG4gICAgICAgIGxldCBidWYgPSBuZXcgQXJyYXlCdWZmZXIoc3RyLmxlbmd0aCk7IC8vIOavj+S4quWtl+espuWNoOeUqDLkuKrlrZfoioJcclxuICAgICAgICBsZXQgYnVmVmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zik7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHN0ckxlbiA9IHN0ci5sZW5ndGg7IGkgPCBzdHJMZW47IGkrKykge1xyXG4gICAgICAgICAgICBidWZWaWV3W2ldID0gc3RyLmNoYXJDb2RlQXQoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBidWY7XHJcbiAgICB9XHJcblxyXG59Il19