UNPKG

@magic-xpa/utils

Version:

magic utils package

431 lines • 41.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { ApplicationException, ISO_8859_1_Encoding } from "@magic-xpa/mscorelib"; import { StrUtil } from "./StrUtil"; import { Misc } from "./Misc"; var Base64 = /** @class */ (function () { function Base64() { } /** * @param {?} strOrData * @param {?=} encodingOrIsUseEnvCharset * @param {?=} encoding * @return {?} */ Base64.encode = /** * @param {?} strOrData * @param {?=} encodingOrIsUseEnvCharset * @param {?=} encoding * @return {?} */ function (strOrData, encodingOrIsUseEnvCharset, encoding) { if (arguments.length === 2) return Base64.encode_0(strOrData, encodingOrIsUseEnvCharset); else if (arguments.length === 3) return Base64.encode_1(strOrData, encodingOrIsUseEnvCharset, encoding); else return Base64.encode_2(strOrData); }; /// <summary> This method encodes the given string using the base64-encoding /// specified in RFC-2045 (Section 6.8). It's used for example in the /// "Basic" authorization scheme. /// </summary> /// <param name="str">the string </param> /// <param name="encoding"> Environment.Encoding </param> /// <returns> the base64-encoded str </returns> /// <summary> This method encodes the given string using the base64-encoding /// specified in RFC-2045 (Section 6.8). It's used for example in the /// "Basic" authorization scheme. /// </summary> /// <param name="str">the string </param> /// <param name="encoding"> Environment.Encoding </param> /// <returns> the base64-encoded str </returns> /** * @param {?} str * @param {?} encoding * @return {?} */ Base64.encode_0 = /// <summary> This method encodes the given string using the base64-encoding /// specified in RFC-2045 (Section 6.8). It's used for example in the /// "Basic" authorization scheme. /// </summary> /// <param name="str">the string </param> /// <param name="encoding"> Environment.Encoding </param> /// <returns> the base64-encoded str </returns> /** * @param {?} str * @param {?} encoding * @return {?} */ function (str, encoding) { return Base64.encode(str, false, encoding); }; /// <summary> Encodes string using the base64-encoding. /// If isUseEnvCharset is true, use the specific charset when converting /// string to byte array. (DBCS support) /// </summary> /// <param name="str">the string </param> /// <param name="isUseEnvCharset"> </param> /// <param name="encoding"> Environment.Encoding </param> /// <returns> the base64-encoded str </returns> /// <summary> Encodes string using the base64-encoding. /// If isUseEnvCharset is true, use the specific charset when converting /// string to byte array. (DBCS support) /// </summary> /// <param name="str">the string </param> /// <param name="isUseEnvCharset"> </param> /// <param name="encoding"> Environment.Encoding </param> /// <returns> the base64-encoded str </returns> /** * @param {?} str * @param {?} isUseEnvCharset * @param {?} encoding * @return {?} */ Base64.encode_1 = /// <summary> Encodes string using the base64-encoding. /// If isUseEnvCharset is true, use the specific charset when converting /// string to byte array. (DBCS support) /// </summary> /// <param name="str">the string </param> /// <param name="isUseEnvCharset"> </param> /// <param name="encoding"> Environment.Encoding </param> /// <returns> the base64-encoded str </returns> /** * @param {?} str * @param {?} isUseEnvCharset * @param {?} encoding * @return {?} */ function (str, isUseEnvCharset, encoding) { /** @type {?} */ var result; if (str === null) { result = null; } else { if (str === "") { result = str; } else { try { /** @type {?} */ var instance = ISO_8859_1_Encoding.ISO_8859_1; /** @type {?} */ var encoding2 = isUseEnvCharset ? encoding : instance; /** @type {?} */ var ba = Base64.encode(encoding2.GetBytes(str)); result = instance.GetString(ba, 0, ba.length); } catch (ex) { throw new ApplicationException(ex.Message); } } } return result; }; /// <summary> This method encodes the given byte[] using the base64-encoding /// specified in RFC-2045 (Section 6.8). /// </summary> /// <param name="data">the data </param> /// <returns> the base64-encoded data </returns> /// <summary> This method encodes the given byte[] using the base64-encoding /// specified in RFC-2045 (Section 6.8). /// </summary> /// <param name="data">the data </param> /// <returns> the base64-encoded data </returns> /** * @param {?} data * @return {?} */ Base64.encode_2 = /// <summary> This method encodes the given byte[] using the base64-encoding /// specified in RFC-2045 (Section 6.8). /// </summary> /// <param name="data">the data </param> /// <returns> the base64-encoded data </returns> /** * @param {?} data * @return {?} */ function (data) { if (data === null) return null; /** @type {?} */ var dest = new Uint8Array(Math.floor((data.length + 2) / 3) * 4); /** @type {?} */ var sidx = 0; /** @type {?} */ var didx = 0; // 3-byte to 4-byte conversion + 0-63 to ASCII printable conversion while (sidx < data.length - 2) { dest[didx++] = Base64._base64EncMap[Misc.URShift((/** @type {?} */ (data[sidx])), 2) & 63]; dest[didx++] = Base64._base64EncMap[(Misc.URShift((/** @type {?} */ (data[sidx + 1])), 4) & 15) | ((/** @type {?} */ (data[sidx])) << 4 & 63)]; dest[didx++] = Base64._base64EncMap[(Misc.URShift((/** @type {?} */ (data[sidx + 2])), 6) & 3) | ((/** @type {?} */ (data[sidx + 1])) << 2 & 63)]; dest[didx++] = Base64._base64EncMap[(/** @type {?} */ ((data[sidx + 2] & 63)))]; sidx = sidx + 3; } if (sidx < data.length) { dest[didx++] = Base64._base64EncMap[Misc.URShift((/** @type {?} */ (data[sidx])), 2) & 63]; if (sidx < data.length - 1) { dest[didx++] = Base64._base64EncMap[(Misc.URShift((/** @type {?} */ (data[sidx + 1])), 4) & 15) | ((/** @type {?} */ (data[sidx])) << 4 & 63)]; dest[didx++] = Base64._base64EncMap[(/** @type {?} */ (data[sidx + 1])) << 2 & 63]; } else { dest[didx++] = Base64._base64EncMap[(/** @type {?} */ (data[sidx])) << 4 & 63]; } } // add padding while (didx < dest.length) { dest[didx] = 61; didx = didx + 1; } return dest; }; /** * @param {?} strOrData * @param {?=} encoding * @return {?} */ Base64.decode = /** * @param {?} strOrData * @param {?=} encoding * @return {?} */ function (strOrData, encoding) { if (arguments.length === 1 && (strOrData === null || strOrData.constructor === String)) return Base64.decode_0(strOrData); else if (arguments.length === 2) return Base64.decode_1(strOrData, encoding); else return Base64.decode_2(strOrData); }; /// <summary> This method decodes the given string using the base64-encoding /// specified in RFC-2045 (Section 6.8). /// </summary> /// <param name="str">the base64-encoded string. </param> /// <returns> the decoded str.</returns> /// <summary> This method decodes the given string using the base64-encoding /// specified in RFC-2045 (Section 6.8). /// </summary> /// <param name="str">the base64-encoded string. </param> /// <returns> the decoded str.</returns> /** * @param {?} str * @return {?} */ Base64.decode_0 = /// <summary> This method decodes the given string using the base64-encoding /// specified in RFC-2045 (Section 6.8). /// </summary> /// <param name="str">the base64-encoded string. </param> /// <returns> the decoded str.</returns> /** * @param {?} str * @return {?} */ function (str) { return Base64.decode(str, null); }; /// <summary> This method decodes the given string using the base64-encoding /// specified in RFC-2045 (Section 6.8). /// </summary> /// <param name="str">the base64-encoded string. </param> /// <param name="encoding">Environment.Encoding or null.</param> /// <returns> the decoded str.</returns> /// <summary> This method decodes the given string using the base64-encoding /// specified in RFC-2045 (Section 6.8). /// </summary> /// <param name="str">the base64-encoded string. </param> /// <param name="encoding">Environment.Encoding or null.</param> /// <returns> the decoded str.</returns> /** * @param {?} str * @param {?} encoding * @return {?} */ Base64.decode_1 = /// <summary> This method decodes the given string using the base64-encoding /// specified in RFC-2045 (Section 6.8). /// </summary> /// <param name="str">the base64-encoded string. </param> /// <param name="encoding">Environment.Encoding or null.</param> /// <returns> the decoded str.</returns> /** * @param {?} str * @param {?} encoding * @return {?} */ function (str, encoding) { /** @type {?} */ var result; if (str === null) { result = null; } else { if (str === "") { result = str; } else { try { /** @type {?} */ var instance = ISO_8859_1_Encoding.ISO_8859_1; /** @type {?} */ var array = Base64.decode(instance.GetBytes(str)); /** @type {?} */ var encoding2 = (encoding !== null) ? encoding : instance; result = encoding2.GetString(array, 0, array.length); } catch (ex) { throw new ApplicationException(ex.Message); } } } return result; }; /// <summary> This method decodes the given byte[] using the base64-encoding /// specified in RFC-2045 (Section 6.8). /// </summary> /// <param name="data">the base64-encoded data.</param> /// <returns> the decoded <var>data</va /// <summary> This method decodes the given byte[] using the base64-encoding /// specified in RFC-2045 (Section 6.8). /// </summary> /// <param name="data">the base64-encoded data.</param> /// <returns> the decoded <var>data</va /** * @param {?} data * @return {?} */ Base64.decode_2 = /// <summary> This method decodes the given byte[] using the base64-encoding /// specified in RFC-2045 (Section 6.8). /// </summary> /// <param name="data">the base64-encoded data.</param> /// <returns> the decoded <var>data</va /** * @param {?} data * @return {?} */ function (data) { if (data === null) return null; /** @type {?} */ var tail = data.length; while (data[tail - 1] === '='.charCodeAt(0)) { tail = tail - 1; } /** @type {?} */ var dest = new Uint8Array(tail - Math.floor(data.length / 4)); // ASCII printable to 0-63 conversion for (var idx = 0; idx < data.length; idx = idx + 1) { data[idx] = Base64._base64DecMap[data[idx]]; } // 4-byte to 3-byte conversion /** @type {?} */ var sidx = 0; /** @type {?} */ var didx; for (didx = 0; didx < dest.length - 2; didx = didx + 3) { dest[didx] = (((data[sidx] << 2) & 255) | (Misc.URShift(data[sidx + 1], 4) & 3)); dest[didx + 1] = (((data[sidx + 1] << 4) & 255) | (Misc.URShift(data[sidx + 2], 2) & 15)); dest[didx + 2] = (((data[sidx + 2] << 6) & 255) | (data[sidx + 3] & 63)); sidx = sidx + 4; } if (didx < dest.length) dest[didx] = (((data[sidx] << 2) & 255) | (Misc.URShift(data[sidx + 1], 4) & 3)); if ((didx = didx + 1) < dest.length) dest[didx] = (((data[sidx + 1] << 4) & 255) | (Misc.URShift(data[sidx + 2], 2) & 15)); return dest; }; /// <summary> decoded and return an hex representation of the data</summary> /// <summary> decoded and return an hex representation of the data</summary> /** * @param {?} str * @return {?} */ Base64.decodeToHex = /// <summary> decoded and return an hex representation of the data</summary> /** * @param {?} str * @return {?} */ function (str) { if (str === null) return null; if (str === "") return str; return StrUtil.stringToHexaDump(Base64.decode(str), 2); }; /// <summary> decodes a string to byte array</summary> /// <summary> decodes a string to byte array</summary> /** * @param {?} str * @return {?} */ Base64.decodeToByte = /// <summary> decodes a string to byte array</summary> /** * @param {?} str * @return {?} */ function (str) { if (str === null) return null; // QCR 740918 if we have and empty expression it is sent from the server as empty string // and changed locally to a string with one blank either way they are not valid base64 encoded // string and should not be decoded. if (str === "" || str === " ") return new Uint8Array(0); try { /** @type {?} */ var instance = ISO_8859_1_Encoding.ISO_8859_1; return Base64.decode(instance.GetBytes(str)); } catch (ex) { throw new ApplicationException(ex.Message); } }; /** * @return {?} */ Base64.initializeEncMap = /** * @return {?} */ function () { return new Uint8Array([ 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47 ]); }; /** * @return {?} */ Base64.initializeDecMap = /** * @return {?} */ function () { /** @type {?} */ var decMap = new Uint8Array(128); for (var i = 0; i < Base64._base64EncMap.length; i = i + 1) { decMap[Base64._base64EncMap[i]] = i; } return decMap; }; Base64._base64EncMap = Base64.initializeEncMap(); Base64._base64DecMap = Base64.initializeDecMap(); return Base64; }()); export { Base64 }; if (false) { /** @type {?} */ Base64._base64EncMap; /** @type {?} */ Base64._base64DecMap; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZTY0LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG1hZ2ljLXhwYS91dGlscy8iLCJzb3VyY2VzIjpbInNyYy9CYXNlNjQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBc0Isb0JBQW9CLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFFNUI7SUFBQTtJQXNQQSxDQUFDOzs7Ozs7O0lBOU9RLGFBQU07Ozs7OztJQUFiLFVBQWMsU0FBYyxFQUFFLHlCQUErQixFQUFFLFFBQW1CO1FBQ2hGLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1lBQ3pCLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO1FBRS9ELElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztZQUM5QixNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUseUJBQXlCLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFekUsSUFBSTtZQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCw0RUFBNEU7SUFDNUUscUVBQXFFO0lBQ3JFLGlDQUFpQztJQUNqQyxjQUFjO0lBQ2QseUNBQXlDO0lBQ3pDLHlEQUF5RDtJQUN6RCwrQ0FBK0M7Ozs7Ozs7Ozs7Ozs7SUFDaEMsZUFBUTs7Ozs7Ozs7Ozs7OztJQUF2QixVQUF3QixHQUFXLEVBQUUsUUFBa0I7UUFDckQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lB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QUMsQ0FBQztZQUNqRixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMxRixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDekUsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7UUFDbEIsQ0FBQztRQUVELEVBQUUsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXhGLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsNEVBQTRFOzs7Ozs7SUFDckUsa0JBQVc7Ozs7OztJQUFsQixVQUFtQixHQUFXO1FBQzVCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUM7WUFDZixNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ2QsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQztZQUNiLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFFYixNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELHNEQUFzRDs7Ozs7O0lBQy9DLG1CQUFZOzs7Ozs7SUFBbkIsVUFBb0IsR0FBVztRQUM3QixFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDO1lBQ2YsTUFBTSxDQUFDLElBQUksQ0FBQztRQUVkLHdGQUF3RjtRQUN4Riw4RkFBOEY7UUFDOUYsb0NBQW9DO1FBQ3BDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFLElBQUksR0FBRyxLQUFLLEdBQUcsQ0FBQztZQUM1QixNQUFNLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFM0IsSUFBSSxDQUFDOztnQkFDQyxRQUFRLEdBQWEsbUJBQW1CLENBQUMsVUFBVTtZQUN2RCxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUNELEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDVixNQUFNLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLENBQUM7SUFDSCxDQUFDOzs7O0lBRWMsdUJBQWdCOzs7SUFBL0I7UUFDRSxNQUFNLENBQUMsSUFBSSxVQUFVLENBQUM7WUFDcEIsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtZQUMxRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztZQUN4RixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtZQUMzRixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtTQUNuQixDQUFDLENBQUM7SUFFTCxDQUFDOzs7O0lBRWMsdUJBQWdCOzs7SUFBL0I7O1lBQ00sTUFBTSxHQUFlLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQztRQUU1QyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbkUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUVELE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQXBQYyxvQkFBYSxHQUFlLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQ3RELG9CQUFhLEdBQWUsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFvUHZFLGFBQUM7Q0FBQSxBQXRQRCxJQXNQQztTQXRQWSxNQUFNOzs7SUFDakIscUJBQXFFOztJQUNyRSxxQkFBcUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0VuY29kaW5nLCBFeGNlcHRpb24sIEFwcGxpY2F0aW9uRXhjZXB0aW9uLCBJU09fODg1OV8xX0VuY29kaW5nfSBmcm9tIFwiQG1hZ2ljLXhwYS9tc2NvcmVsaWJcIjtcclxuaW1wb3J0IHtTdHJVdGlsfSBmcm9tIFwiLi9TdHJVdGlsXCI7XHJcbmltcG9ydCB7TWlzY30gZnJvbSBcIi4vTWlzY1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEJhc2U2NHtcclxuICBwcml2YXRlIHN0YXRpYyBfYmFzZTY0RW5jTWFwOiBVaW50OEFycmF5ID0gQmFzZTY0LmluaXRpYWxpemVFbmNNYXAoKTtcclxuICBwcml2YXRlIHN0YXRpYyBfYmFzZTY0RGVjTWFwOiBVaW50OEFycmF5ID0gQmFzZTY0LmluaXRpYWxpemVEZWNNYXAoKTtcclxuXHJcblxyXG4gIHN0YXRpYyBlbmNvZGUoc3RyOiBzdHJpbmcsIGVuY29kaW5nOiBFbmNvZGluZyk6IHN0cmluZztcclxuICBzdGF0aWMgZW5jb2RlKHN0cjogc3RyaW5nLCBpc1VzZUVudkNoYXJzZXQ6IGJvb2xlYW4sIGVuY29kaW5nOiBFbmNvZGluZyk6IHN0cmluZztcclxuICBzdGF0aWMgZW5jb2RlKGRhdGE6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5O1xyXG4gIHN0YXRpYyBlbmNvZGUoc3RyT3JEYXRhOiBhbnksIGVuY29kaW5nT3JJc1VzZUVudkNoYXJzZXQ/OiBhbnksIGVuY29kaW5nPzogRW5jb2RpbmcpOiBhbnkge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpXHJcbiAgICAgIHJldHVybiBCYXNlNjQuZW5jb2RlXzAoc3RyT3JEYXRhLCBlbmNvZGluZ09ySXNVc2VFbnZDaGFyc2V0KTtcclxuXHJcbiAgICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKVxyXG4gICAgICByZXR1cm4gQmFzZTY0LmVuY29kZV8xKHN0ck9yRGF0YSwgZW5jb2RpbmdPcklzVXNlRW52Q2hhcnNldCwgZW5jb2RpbmcpO1xyXG5cclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIEJhc2U2NC5lbmNvZGVfMihzdHJPckRhdGEpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBUaGlzIG1ldGhvZCBlbmNvZGVzIHRoZSBnaXZlbiBzdHJpbmcgdXNpbmcgdGhlIGJhc2U2NC1lbmNvZGluZ1xyXG4gIC8vLyBzcGVjaWZpZWQgaW4gUkZDLTIwNDUgKFNlY3Rpb24gNi44KS4gSXQncyB1c2VkIGZvciBleGFtcGxlIGluIHRoZVxyXG4gIC8vLyBcIkJhc2ljXCIgYXV0aG9yaXphdGlvbiBzY2hlbWUuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdHJcIj50aGUgc3RyaW5nIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZW5jb2RpbmdcIj4gRW52aXJvbm1lbnQuRW5jb2RpbmcgPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBiYXNlNjQtZW5jb2RlZCBzdHIgPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgc3RhdGljIGVuY29kZV8wKHN0cjogc3RyaW5nLCBlbmNvZGluZzogRW5jb2RpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIEJhc2U2NC5lbmNvZGUoc3RyLCBmYWxzZSwgZW5jb2RpbmcpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBFbmNvZGVzIHN0cmluZyB1c2luZyB0aGUgYmFzZTY0LWVuY29kaW5nLlxyXG4gIC8vLyBJZiBpc1VzZUVudkNoYXJzZXQgaXMgdHJ1ZSwgdXNlIHRoZSBzcGVjaWZpYyBjaGFyc2V0IHdoZW4gY29udmVydGluZ1xyXG4gIC8vLyBzdHJpbmcgdG8gYnl0ZSBhcnJheS4gKERCQ1Mgc3VwcG9ydClcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0clwiPnRoZSBzdHJpbmcgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc1VzZUVudkNoYXJzZXRcIj4gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJlbmNvZGluZ1wiPiBFbnZpcm9ubWVudC5FbmNvZGluZyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGJhc2U2NC1lbmNvZGVkIHN0ciA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgZW5jb2RlXzEoc3RyOiBzdHJpbmcsIGlzVXNlRW52Q2hhcnNldDogYm9vbGVhbiwgZW5jb2Rpbmc6IEVuY29kaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCByZXN1bHQ6IHN0cmluZztcclxuICAgIGlmIChzdHIgPT09IG51bGwpIHtcclxuICAgICAgcmVzdWx0ID0gbnVsbDtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoc3RyID09PSBcIlwiKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gc3RyO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBsZXQgaW5zdGFuY2U6IEVuY29kaW5nID0gSVNPXzg4NTlfMV9FbmNvZGluZy5JU09fODg1OV8xO1xyXG4gICAgICAgICAgbGV0IGVuY29kaW5nMjogRW5jb2RpbmcgPSBpc1VzZUVudkNoYXJzZXQgPyBlbmNvZGluZyA6IGluc3RhbmNlO1xyXG4gICAgICAgICAgbGV0IGJhOiBVaW50OEFycmF5ID0gQmFzZTY0LmVuY29kZShlbmNvZGluZzIuR2V0Qnl0ZXMoc3RyKSk7XHJcbiAgICAgICAgICByZXN1bHQgPSBpbnN0YW5jZS5HZXRTdHJpbmcoYmEsIDAsIGJhLmxlbmd0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKGV4Lk1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gVGhpcyBtZXRob2QgZW5jb2RlcyB0aGUgZ2l2ZW4gYnl0ZVtdIHVzaW5nIHRoZSBiYXNlNjQtZW5jb2RpbmdcclxuICAvLy8gc3BlY2lmaWVkIGluIFJGQy0yMDQ1IChTZWN0aW9uIDYuOCkuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkYXRhXCI+dGhlIGRhdGEgPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBiYXNlNjQtZW5jb2RlZCBkYXRhIDwvcmV0dXJucz5cclxuICBwcml2YXRlIHN0YXRpYyBlbmNvZGVfMihkYXRhOiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XHJcblxyXG4gICAgaWYgKGRhdGEgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgIGxldCBkZXN0OiBVaW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoTWF0aC5mbG9vcigoZGF0YS5sZW5ndGggKyAyKSAvIDMpICogNCk7XHJcbiAgICBsZXQgc2lkeDogbnVtYmVyID0gMDtcclxuICAgIGxldCBkaWR4OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8vIDMtYnl0ZSB0byA0LWJ5dGUgY29udmVyc2lvbiArIDAtNjMgdG8gQVNDSUkgcHJpbnRhYmxlIGNvbnZlcnNpb25cclxuICAgIHdoaWxlIChzaWR4IDwgZGF0YS5sZW5ndGggLSAyKSB7XHJcbiAgICAgIGRlc3RbZGlkeCsrXSA9IEJhc2U2NC5fYmFzZTY0RW5jTWFwW01pc2MuVVJTaGlmdCg8bnVtYmVyPmRhdGFbc2lkeF0sIDIpICYgNjNdO1xyXG4gICAgICBkZXN0W2RpZHgrK10gPSBCYXNlNjQuX2Jhc2U2NEVuY01hcFsoTWlzYy5VUlNoaWZ0KDxudW1iZXI+ZGF0YVtzaWR4ICsgMV0sIDQpICYgMTUpIHwgKDxudW1iZXI+ZGF0YVtzaWR4XSA8PCA0ICYgNjMpXTtcclxuICAgICAgZGVzdFtkaWR4KytdID0gQmFzZTY0Ll9iYXNlNjRFbmNNYXBbKE1pc2MuVVJTaGlmdCg8bnVtYmVyPmRhdGFbc2lkeCArIDJdLCA2KSAmIDMpIHwgKDxudW1iZXI+ZGF0YVtzaWR4ICsgMV0gPDwgMiAmIDYzKV07XHJcbiAgICAgIGRlc3RbZGlkeCsrXSA9IEJhc2U2NC5fYmFzZTY0RW5jTWFwWzxudW1iZXI+KGRhdGFbc2lkeCArIDJdICYgNjMpXTtcclxuICAgICAgc2lkeCA9IHNpZHggKyAzO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzaWR4IDwgZGF0YS5sZW5ndGgpIHtcclxuICAgICAgZGVzdFtkaWR4KytdID0gQmFzZTY0Ll9iYXNlNjRFbmNNYXBbTWlzYy5VUlNoaWZ0KDxudW1iZXI+ZGF0YVtzaWR4XSwgMikgJiA2M107XHJcbiAgICAgIGlmIChzaWR4IDwgZGF0YS5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgZGVzdFtkaWR4KytdID0gQmFzZTY0Ll9iYXNlNjRFbmNNYXBbKE1pc2MuVVJTaGlmdCg8bnVtYmVyPmRhdGFbc2lkeCArIDFdLCA0KSAmIDE1KSB8ICg8bnVtYmVyPmRhdGFbc2lkeF0gPDwgNCAmIDYzKV07XHJcbiAgICAgICAgZGVzdFtkaWR4KytdID0gQmFzZTY0Ll9iYXNlNjRFbmNNYXBbPG51bWJlcj5kYXRhW3NpZHggKyAxXSA8PCAyICYgNjNdO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGRlc3RbZGlkeCsrXSA9IEJhc2U2NC5fYmFzZTY0RW5jTWFwWzxudW1iZXI+ZGF0YVtzaWR4XSA8PCA0ICYgNjNdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYWRkIHBhZGRpbmdcclxuICAgIHdoaWxlIChkaWR4IDwgZGVzdC5sZW5ndGgpIHtcclxuICAgICAgZGVzdFtkaWR4XSA9IDYxO1xyXG4gICAgICBkaWR4ID0gZGlkeCArIDE7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGRlc3Q7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZGVjb2RlKHN0cjogc3RyaW5nKTogc3RyaW5nO1xyXG4gIHN0YXRpYyBkZWNvZGUoc3RyOiBzdHJpbmcsIGVuY29kaW5nOiBFbmNvZGluZyk6IHN0cmluZztcclxuICBzdGF0aWMgZGVjb2RlKGRhdGE6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5O1xyXG4gIHN0YXRpYyBkZWNvZGUoc3RyT3JEYXRhOiBhbnksIGVuY29kaW5nPzogRW5jb2RpbmcpOiBhbnkge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgKHN0ck9yRGF0YSA9PT0gbnVsbCB8fCBzdHJPckRhdGEuY29uc3RydWN0b3IgPT09IFN0cmluZykpXHJcbiAgICAgIHJldHVybiBCYXNlNjQuZGVjb2RlXzAoc3RyT3JEYXRhKTtcclxuXHJcbiAgICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKVxyXG4gICAgICByZXR1cm4gQmFzZTY0LmRlY29kZV8xKHN0ck9yRGF0YSwgZW5jb2RpbmcpO1xyXG5cclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIEJhc2U2NC5kZWNvZGVfMihzdHJPckRhdGEpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBUaGlzIG1ldGhvZCBkZWNvZGVzIHRoZSBnaXZlbiBzdHJpbmcgdXNpbmcgdGhlIGJhc2U2NC1lbmNvZGluZ1xyXG4gIC8vLyBzcGVjaWZpZWQgaW4gUkZDLTIwNDUgKFNlY3Rpb24gNi44KS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0clwiPnRoZSBiYXNlNjQtZW5jb2RlZCBzdHJpbmcuIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgZGVjb2RlZCBzdHIuPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgc3RhdGljIGRlY29kZV8wKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBCYXNlNjQuZGVjb2RlKHN0ciwgbnVsbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IFRoaXMgbWV0aG9kIGRlY29kZXMgdGhlIGdpdmVuIHN0cmluZyB1c2luZyB0aGUgYmFzZTY0LWVuY29kaW5nXHJcbiAgLy8vIHNwZWNpZmllZCBpbiBSRkMtMjA0NSAoU2VjdGlvbiA2LjgpLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3RyXCI+dGhlIGJhc2U2NC1lbmNvZGVkIHN0cmluZy4gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJlbmNvZGluZ1wiPkVudmlyb25tZW50LkVuY29kaW5nIG9yIG51bGwuPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBkZWNvZGVkIHN0ci48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgZGVjb2RlXzEoc3RyOiBzdHJpbmcsIGVuY29kaW5nOiBFbmNvZGluZyk6IHN0cmluZyB7XHJcblxyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nO1xyXG4gICAgaWYgKHN0ciA9PT0gbnVsbCkge1xyXG4gICAgICByZXN1bHQgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChzdHIgPT09IFwiXCIpIHtcclxuICAgICAgICByZXN1bHQgPSBzdHI7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGxldCBpbnN0YW5jZTogSVNPXzg4NTlfMV9FbmNvZGluZyA9IElTT184ODU5XzFfRW5jb2RpbmcuSVNPXzg4NTlfMTtcclxuICAgICAgICAgIGxldCBhcnJheTogVWludDhBcnJheSA9IEJhc2U2NC5kZWNvZGUoaW5zdGFuY2UuR2V0Qnl0ZXMoc3RyKSk7XHJcbiAgICAgICAgICBsZXQgZW5jb2RpbmcyOiBFbmNvZGluZyA9IChlbmNvZGluZyAhPT0gbnVsbCkgPyBlbmNvZGluZyA6IGluc3RhbmNlO1xyXG4gICAgICAgICAgcmVzdWx0ID0gZW5jb2RpbmcyLkdldFN0cmluZyhhcnJheSwgMCwgYXJyYXkubGVuZ3RoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oZXguTWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBUaGlzIG1ldGhvZCBkZWNvZGVzIHRoZSBnaXZlbiBieXRlW10gdXNpbmcgdGhlIGJhc2U2NC1lbmNvZGluZ1xyXG4gIC8vLyBzcGVjaWZpZWQgaW4gUkZDLTIwNDUgKFNlY3Rpb24gNi44KS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRhdGFcIj50aGUgYmFzZTY0LWVuY29kZWQgZGF0YS48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGRlY29kZWQgPHZhcj5kYXRhPC92YVxyXG4gIHByaXZhdGUgc3RhdGljIGRlY29kZV8yKGRhdGE6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcclxuICAgIGlmIChkYXRhID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBsZXQgdGFpbDogbnVtYmVyID0gZGF0YS5sZW5ndGg7XHJcbiAgICB3aGlsZSAoZGF0YVt0YWlsIC0gMV0gPT09ICc9Jy5jaGFyQ29kZUF0KDApKSB7XHJcbiAgICAgIHRhaWwgPSB0YWlsIC0gMTtcclxuICAgIH1cclxuICAgIGxldCBkZXN0OiBVaW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkodGFpbCAtIE1hdGguZmxvb3IoZGF0YS5sZW5ndGggLyA0KSk7XHJcblxyXG4gICAgLy8gQVNDSUkgcHJpbnRhYmxlIHRvIDAtNjMgY29udmVyc2lvblxyXG4gICAgZm9yIChsZXQgaWR4OiBudW1iZXIgPSAwOyBpZHggPCBkYXRhLmxlbmd0aDsgaWR4ID0gaWR4ICsgMSkge1xyXG4gICAgICBkYXRhW2lkeF0gPSBCYXNlNjQuX2Jhc2U2NERlY01hcFtkYXRhW2lkeF1dO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDQtYnl0ZSB0byAzLWJ5dGUgY29udmVyc2lvblxyXG4gICAgbGV0IHNpZHg6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgZGlkeDogbnVtYmVyO1xyXG4gICAgZm9yIChkaWR4ID0gMDsgZGlkeCA8IGRlc3QubGVuZ3RoIC0gMjsgZGlkeCA9IGRpZHggKyAzKSB7XHJcbiAgICAgIGRlc3RbZGlkeF0gPSAoKChkYXRhW3NpZHhdIDw8IDIpICYgMjU1KSB8IChNaXNjLlVSU2hpZnQoZGF0YVtzaWR4ICsgMV0sIDQpICYgMykpO1xyXG4gICAgICBkZXN0W2RpZHggKyAxXSA9ICgoKGRhdGFbc2lkeCArIDFdIDw8IDQpICYgMjU1KSB8IChNaXNjLlVSU2hpZnQoZGF0YVtzaWR4ICsgMl0sIDIpICYgMTUpKTtcclxuICAgICAgZGVzdFtkaWR4ICsgMl0gPSAoKChkYXRhW3NpZHggKyAyXSA8PCA2KSAmIDI1NSkgfCAoZGF0YVtzaWR4ICsgM10gJiA2MykpO1xyXG4gICAgICBzaWR4ID0gc2lkeCArIDQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGRpZHggPCBkZXN0Lmxlbmd0aClcclxuICAgICAgZGVzdFtkaWR4XSA9ICgoKGRhdGFbc2lkeF0gPDwgMikgJiAyNTUpIHwgKE1pc2MuVVJTaGlmdChkYXRhW3NpZHggKyAxXSwgNCkgJiAzKSk7XHJcbiAgICBpZiAoKGRpZHggPSBkaWR4ICsgMSkgPCBkZXN0Lmxlbmd0aClcclxuICAgICAgZGVzdFtkaWR4XSA9ICgoKGRhdGFbc2lkeCArIDFdIDw8IDQpICYgMjU1KSB8IChNaXNjLlVSU2hpZnQoZGF0YVtzaWR4ICsgMl0sIDIpICYgMTUpKTtcclxuXHJcbiAgICByZXR1cm4gZGVzdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gZGVjb2RlZCBhbmQgcmV0dXJuIGFuIGhleCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGF0YTwvc3VtbWFyeT5cclxuICBzdGF0aWMgZGVjb2RlVG9IZXgoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKHN0ciA9PT0gbnVsbClcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICBpZiAoc3RyID09PSBcIlwiKVxyXG4gICAgICByZXR1cm4gc3RyO1xyXG5cclxuICAgIHJldHVybiBTdHJVdGlsLnN0cmluZ1RvSGV4YUR1bXAoQmFzZTY0LmRlY29kZShzdHIpLCAyKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gZGVjb2RlcyBhIHN0cmluZyB0byBieXRlIGFycmF5PC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBkZWNvZGVUb0J5dGUoc3RyOiBzdHJpbmcpOiBVaW50OEFycmF5IHtcclxuICAgIGlmIChzdHIgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgIC8vIFFDUiA3NDA5MTggaWYgd2UgaGF2ZSBhbmQgZW1wdHkgZXhwcmVzc2lvbiBpdCBpcyBzZW50IGZyb20gdGhlIHNlcnZlciBhcyBlbXB0eSBzdHJpbmdcclxuICAgIC8vIGFuZCBjaGFuZ2VkIGxvY2FsbHkgdG8gYSBzdHJpbmcgd2l0aCBvbmUgYmxhbmsgZWl0aGVyIHdheSB0aGV5IGFyZSBub3QgdmFsaWQgYmFzZTY0IGVuY29kZWRcclxuICAgIC8vIHN0cmluZyBhbmQgc2hvdWxkIG5vdCBiZSBkZWNvZGVkLlxyXG4gICAgaWYgKHN0ciA9PT0gXCJcIiB8fCBzdHIgPT09IFwiIFwiKVxyXG4gICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGluc3RhbmNlOiBFbmNvZGluZyA9IElTT184ODU5XzFfRW5jb2RpbmcuSVNPXzg4NTlfMTtcclxuICAgICAgcmV0dXJuIEJhc2U2NC5kZWNvZGUoaW5zdGFuY2UuR2V0Qnl0ZXMoc3RyKSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKGV4Lk1lc3NhZ2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgaW5pdGlhbGl6ZUVuY01hcCgpIHtcclxuICAgIHJldHVybiBuZXcgVWludDhBcnJheShbXHJcbiAgICAgIDY1LCA2NiwgNjcsIDY4LCA2OSwgNzAsIDcxLCA3MiwgNzMsIDc0LCA3NSwgNzYsIDc3LCA3OCwgNzksIDgwLCA4MSwgODIsIDgzLFxyXG4gICAgICA4NCwgODUsIDg2LCA4NywgODgsIDg5LCA5MCwgOTcsIDk4LCA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LFxyXG4gICAgICAxMTAsIDExMSwgMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDQ4LCA0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LFxyXG4gICAgICA1NSwgNTYsIDU3LCA0MywgNDdcclxuICAgIF0pO1xyXG5cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIGluaXRpYWxpemVEZWNNYXAoKSB7XHJcbiAgICBsZXQgZGVjTWFwOiBVaW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoMTI4KTtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgQmFzZTY0Ll9iYXNlNjRFbmNNYXAubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgZGVjTWFwW0Jhc2U2NC5fYmFzZTY0RW5jTWFwW2ldXSA9IGk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGRlY01hcDtcclxuICB9XHJcbn1cclxuIl19