@magic-xpa/utils
Version:
magic utils package
431 lines • 41.3 kB
JavaScript
/**
* @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