@magic-xpa/utils
Version:
magic utils package
810 lines (809 loc) • 76.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Encoding, StringBuilder } from "@magic-xpa/mscorelib";
var UtilStrByteMode = /** @class */ (function () {
function UtilStrByteMode() {
}
/// <summary> Checks the environment whether it is running on DBCS environment
/// Returns true if the language code for the current default Locale is
/// DBCS language (in non-Unicode encoding).
///
/// </summary>
/// <returns> true if DBCS, or false if SBCS
/// </returns>
/**
* @return {?}
*/
UtilStrByteMode.isLocaleDefLangDBCS = /**
* @return {?}
*/
function () {
return UtilStrByteMode._bLocaleDefLangJPN || UtilStrByteMode._bLocaleDefLangCHN || UtilStrByteMode._bLocaleDefLangKOR;
};
/// <summary> Checks whether the language code for the current default Locale
/// is JAPANESE.
///
/// </summary>
/// <returns> true if JAPANESE, or false if not
/// </returns>
/**
* @return {?}
*/
UtilStrByteMode.isLocaleDefLangJPN = /**
* @return {?}
*/
function () {
return UtilStrByteMode._bLocaleDefLangJPN;
};
/// <summary> Checks whether the language code for the current default Locale
/// is KOREAN.
///
/// </summary>
/// <returns> true if KOREAN, or false if not
/// </returns>
/**
* @return {?}
*/
UtilStrByteMode.isLocaleDefLangKOR = /**
* @return {?}
*/
function () {
return UtilStrByteMode._bLocaleDefLangKOR;
};
/**
* @param {?} c
* @return {?}
*/
UtilStrByteMode.isKoreanCharacter = /**
* @param {?} c
* @return {?}
*/
function (c) {
return (44032 <= /*'가'*/ c && c <= 55203 /*'힣'*/) || (4352 <= /*'ᄀ'*/ c && c <= 4607 /*'ᇿ'*/) || (12592 <= /*''*/ c && c <= 12687 /*''*/) || (43360 <= /*'ꥠ'*/ c && c <= 43391 /*''*/) || (55216 <= /*'ힰ'*/ c && c <= 55295 /*''*/);
};
/// <summary> Length of String
/// Returns the number of bytes (in default encoding).
///
/// </summary>
/// <param name="strVal:">string (in Unicode)
/// </param>
/// <returns> the number of bytes (in default encoding)
///
/// Example: lenB("abXYc")
/// Where 'a', 'b' and 'c' are SBCS, and 'X' and 'Y' are DBCS, it returns
/// 7.
/// </returns>
/**
* @param {?} strVal
* @return {?}
*/
UtilStrByteMode.lenB = /**
* @param {?} strVal
* @return {?}
*/
function (strVal) {
// convert to byte[] by default-encoding
return UtilStrByteMode.Encoding.GetByteCount(strVal);
};
/// <summary> Substring of String
/// Extracts a specified number of characters (a substring) from a string.
/// If a DBCS character is divided in two, it will be replace to a space.
///
/// </summary>
/// <param name="strVal:">string (in Unicode)
/// </param>
/// <param name="ofs:">starting position (byte) of the substring
/// </param>
/// <param name="len:">number of bytes to be extracted (i.e. bytes of substring)
/// </param>
/// <returns> substring
///
/// Example: midB("abXYc", 2, 4)
/// Where 'a', 'b' and 'c' are SBCS, and 'X' and 'Y' are DBCS, it returns
/// "bX ".
/// </returns>
/**
* @param {?} strVal
* @param {?} ofs
* @param {?} len
* @return {?}
*/
UtilStrByteMode.midB = /**
* @param {?} strVal
* @param {?} ofs
* @param {?} len
* @return {?}
*/
function (strVal, ofs, len) {
/** @type {?} */
var intValidMaxIndex = -1;
/** @type {?} */
var intValidMinIndex = -1;
/** @type {?} */
var bHeadSpace = false;
/** @type {?} */
var bEndSpace = false;
/** @type {?} */
var strRet;
// check and modify ofs & len
if (len <= 0)
return "";
if (ofs <= 0) {
ofs = 0;
intValidMinIndex = 0;
bHeadSpace = false;
}
/** @type {?} */
var intByteLength = UtilStrByteMode.lenB(strVal);
if (intByteLength < ofs)
return "";
/** @type {?} */
var LenMax = intByteLength - ofs;
if (LenMax < len)
len = LenMax;
// set MinIndex and MaxIndex for substring
intByteLength = 0;
for (var intIndex = 0; intIndex < strVal.length; intIndex = intIndex + 1) {
/** @type {?} */
var s = strVal.substr(intIndex, 1);
intByteLength = intByteLength + UtilStrByteMode.Encoding.GetByteCount(s);
if (intValidMinIndex === -1) {
if (intByteLength === ofs) {
intValidMinIndex = intIndex + 1;
bHeadSpace = false;
}
else if (intByteLength > ofs) {
intValidMinIndex = intIndex + 1;
bHeadSpace = true;
}
}
if (intValidMaxIndex === -1) {
if (intByteLength === ofs + len) {
intValidMaxIndex = intIndex;
bEndSpace = false;
break;
}
else if (intByteLength > ofs + len) {
intValidMaxIndex = intIndex - 1;
bEndSpace = true;
break;
}
}
}
/** @type {?} */
var strbufAddingBuf = new StringBuilder(len);
// execute Mid
if (bHeadSpace) {
strbufAddingBuf.Append(' ');
}
if (intValidMinIndex <= intValidMaxIndex) {
strbufAddingBuf.Append(strVal.substr(intValidMinIndex, intValidMaxIndex + 1 - intValidMinIndex));
}
if (bEndSpace) {
strbufAddingBuf.Append(' ');
}
strRet = strbufAddingBuf.ToString();
strbufAddingBuf = null;
return strRet;
};
/// <summary> Get Characters from Left of String
/// Returns a specified number of bytes from the left side of a string.
/// If a DBCS character is divided in two, it will be replace to a space.
///
/// </summary>
/// <param name="strVal:">string (in Unicode)
/// </param>
/// <param name="len:">number of bytes to be retured
/// </param>
/// <returns> output string
///
/// Example: leftB("abXYc", 4)
/// Where 'a', 'b' and 'c' are SBCS, and 'X' and 'Y' are DBCS, it returns
/// "abX".
/// </returns>
/**
* @param {?} strVal
* @param {?} len
* @return {?}
*/
UtilStrByteMode.leftB = /**
* @param {?} strVal
* @param {?} len
* @return {?}
*/
function (strVal, len) {
return UtilStrByteMode.midB(strVal, 0, len);
};
/// <summary> Get Characters from Right of String
/// Returns a specified number of bytes from the right side of a string.
/// If a DBCS character is divided in two, it will be replace to a space.
///
/// </summary>
/// <param name="strVal:">string (in Unicode)
/// </param>
/// <param name="len:">number of bytes to be retured
/// </param>
/// <returns> output string
///
/// Example: rightB("abXYc", 4)
/// Where 'a', 'b' and 'c' are SBCS, and 'X' and 'Y' are DBCS, it returns
/// " Yc".
/// </returns>
/**
* @param {?} strVal
* @param {?} len
* @return {?}
*/
UtilStrByteMode.rightB = /**
* @param {?} strVal
* @param {?} len
* @return {?}
*/
function (strVal, len) {
/** @type {?} */
var byteFldsValLen = UtilStrByteMode.lenB(strVal);
if (len < 0) {
len = 0;
}
/** @type {?} */
var ofs = byteFldsValLen - len;
if (ofs < 0) {
ofs = 0;
}
return UtilStrByteMode.midB(strVal, ofs, len);
};
/// <summary> Insert String
/// Inserts one string into another.
/// If a DBCS character is divided in two, it will be replace to a space.
///
/// </summary>
/// <param name="strTarget:">A string that represents the target string.
/// </param>
/// <param name="strSource:">A string that represents the source string.
/// </param>
/// <param name="ofs:">A number that represents the starting position (byte) in
/// the target.
/// </param>
/// <param name="len:">A number that represents the number of bytes from the
/// source that will be inserted into the target.
/// </param>
/// <returns> output string
///
/// Example: insB("abXYc", "de", 4, 1)
/// Where 'a', 'b', 'c', 'd' and 'e' are SBCS, and 'X' and 'Y' are DBCS,
/// it returns "ab d Yc".
/// </returns>
/**
* @param {?} strTarget
* @param {?} strSource
* @param {?} ofs
* @param {?} len
* @return {?}
*/
UtilStrByteMode.insB = /**
* @param {?} strTarget
* @param {?} strSource
* @param {?} ofs
* @param {?} len
* @return {?}
*/
function (strTarget, strSource, ofs, len) {
if (ofs < 0) {
ofs = 0;
}
else {
if (ofs >= 1) {
ofs = ofs - 1;
}
}
if (len < 0) {
len = 0;
}
/** @type {?} */
var intTargetLenB = UtilStrByteMode.lenB(strTarget);
/** @type {?} */
var intSourceLenB = UtilStrByteMode.lenB(strSource);
/** @type {?} */
var strbufRetVal = new StringBuilder(ofs + len);
strbufRetVal.Append(UtilStrByteMode.leftB(strTarget, ofs));
for (var intAddSpaceLen = ofs - intTargetLenB; intAddSpaceLen > 0; intAddSpaceLen = intAddSpaceLen - 1) {
strbufRetVal.Append(' ');
}
strbufRetVal.Append(UtilStrByteMode.leftB(strSource, len));
for (var i = len - intSourceLenB; i > 0; i = i - 1) {
strbufRetVal.Append(' ');
}
strbufRetVal.Append(UtilStrByteMode.rightB(strTarget, intTargetLenB - ofs));
return strbufRetVal.ToString();
};
/// <summary> Delete Characters
/// Delete characters from a string.
/// If a DBCS character is divided in two, it will be replace to a space.
///
/// </summary>
/// <param name="strVal:">string (in Unicode)
/// </param>
/// <param name="ofs:">The position (byte) of the first character to be deleted.
/// </param>
/// <param name="len:">The number of characters to be deleted, beginning with
/// position start and proceeding rightward.
/// </param>
/// <returns> output string
///
/// Example: delB("abXYc", 2, 4)
/// Where 'a', 'b' and 'c' are SBCS, and 'X' and 'Y' are DBCS, it returns
/// "a c".
/// </returns>
/**
* @param {?} strVal
* @param {?} ofs
* @param {?} len
* @return {?}
*/
UtilStrByteMode.delB = /**
* @param {?} strVal
* @param {?} ofs
* @param {?} len
* @return {?}
*/
function (strVal, ofs, len) {
if (ofs < 0) {
ofs = 0;
}
else {
if (ofs >= 1) {
ofs = ofs - 1;
}
}
/** @type {?} */
var intValLenB = UtilStrByteMode.lenB(strVal);
if (ofs + len > intValLenB) {
len = intValLenB - ofs;
}
/** @type {?} */
var strRet;
if (len <= 0) {
strRet = strVal;
}
else {
/** @type {?} */
var intRightSideLenB = intValLenB - ofs - len;
if (intRightSideLenB < 0) {
strRet = strVal;
}
else {
/** @type {?} */
var strbufRetVal = new StringBuilder(ofs + intRightSideLenB);
strbufRetVal.Append(UtilStrByteMode.leftB(strVal, ofs));
strbufRetVal.Append(UtilStrByteMode.rightB(strVal, intRightSideLenB));
strRet = strbufRetVal.ToString();
}
}
return strRet;
};
/// <summary> In-String Search
/// Returns a number that represents the first position (byte) of a
/// substring within a string.
///
/// </summary>
/// <param name="strTarget:">string (in Unicode)
/// </param>
/// <param name="strSearch:">string which will be the search argument in string
/// </param>
/// <returns> number, 0 if not found
///
/// Example: instrB("abXYc", "Y")
/// Where 'a', 'b' and 'c' are SBCS, and 'X' and 'Y' are DBCS, it returns
/// 5.
/// </returns>
/**
* @param {?} strTarget
* @param {?} strSearch
* @return {?}
*/
UtilStrByteMode.instrB = /**
* @param {?} strTarget
* @param {?} strSearch
* @return {?}
*/
function (strTarget, strSearch) {
if (strSearch.length === 0) {
// nothing to look for
return 0;
}
/** @type {?} */
var ofs = strTarget.indexOf(strSearch);
if (ofs < 0) {
// not found
return 0;
}
return UtilStrByteMode.lenB(strTarget.substr(0, ofs)) + 1;
};
/// <summary> Replace Substring Within a String (Byte Mode)
/// Replaces a substring within a string with another substring.
/// If a DBCS character is divided in two, it will be replace to a space.
///
/// </summary>
/// <param name="strTarget:">target string where the replacement will take place.
/// </param>
/// <param name="strOrigin:">string that provides the substring to be copied to
/// target.
/// </param>
/// <param name="ofs:">the first position (byte) in the target string that will
/// receive the substring from origin.
/// </param>
/// <param name="len:">the number of bytes that will be moved from origin to
/// target, starting from the leftmost character of origin.
/// </param>
/// <returns> string containing modified target string
///
/// Example: repB("abXYc", "de", 4, 2)
/// Where 'a', 'b', 'c', 'd' and 'e' are SBCS, and 'X' and 'Y' are DBCS,
/// it returns "ab de c".
/// </returns>
/**
* @param {?} strTarget
* @param {?} strOrigin
* @param {?} ofs
* @param {?} len
* @return {?}
*/
UtilStrByteMode.repB = /**
* @param {?} strTarget
* @param {?} strOrigin
* @param {?} ofs
* @param {?} len
* @return {?}
*/
function (strTarget, strOrigin, ofs, len) {
/** @type {?} */
var strbufAddingBuf = new StringBuilder();
if (ofs < 0) {
ofs = 0;
}
else {
if (ofs >= 1) {
ofs = ofs - 1;
}
}
if (len < 0) {
len = 0;
}
strbufAddingBuf.Append(UtilStrByteMode.leftB(strTarget, ofs));
/** @type {?} */
var intAddSpaceLen = ofs - UtilStrByteMode.lenB(strTarget);
for (; intAddSpaceLen > 0; intAddSpaceLen--)
strbufAddingBuf.Append(' ');
strbufAddingBuf.Append(UtilStrByteMode.leftB(strOrigin, len));
/** @type {?} */
var intRightLen = UtilStrByteMode.lenB(strTarget) - (ofs + len);
if (intRightLen > 0) {
strbufAddingBuf.Append(UtilStrByteMode.rightB(strTarget, intRightLen));
}
// add blanks to the end
intAddSpaceLen = len - UtilStrByteMode.lenB(strOrigin);
for (; intAddSpaceLen > 0; intAddSpaceLen--) {
strbufAddingBuf.Append(' ');
}
return strbufAddingBuf.ToString();
};
/// <summary> Replace Substring Within a String (Character Mode)
/// Replaces a substring within a string with another substring.
///
/// </summary>
/// <param name="strTarget:">target string where the replacement will take place.
/// </param>
/// <param name="strOrigin:">string that provides the substring to be copied to
/// target.
/// </param>
/// <param name="ofs:">the first position (character) in the target string that
/// will receive the substring from origin.
/// </param>
/// <param name="len:">the number of characters that will be moved from origin
/// to target, starting from the leftmost character of origin.
/// </param>
/// <returns> string containing modified target string
///
/// Example: repB("abXYc", "de", 4, 2)
/// Whether each character is SBCS or DBCS, it returns "abXde".
/// </returns>
/**
* @param {?} strTarget
* @param {?} strOrigin
* @param {?} ofs
* @param {?} len
* @return {?}
*/
UtilStrByteMode.repC = /**
* @param {?} strTarget
* @param {?} strOrigin
* @param {?} ofs
* @param {?} len
* @return {?}
*/
function (strTarget, strOrigin, ofs, len) {
/** @type {?} */
var strbufAddingBuf = new StringBuilder();
if (ofs < 0) {
ofs = 0;
}
else {
if (ofs >= 1) {
ofs = ofs - 1;
}
}
if (len < 0) {
len = 0;
}
strbufAddingBuf.Append(strTarget.substr(0, ofs));
/** @type {?} */
var intAddSpaceLen = ofs - strTarget.length;
for (; intAddSpaceLen > 0; intAddSpaceLen--)
strbufAddingBuf.Append(' ');
strbufAddingBuf.Append(strOrigin.substr(0, len));
/** @type {?} */
var intRightLen = strTarget.length - (ofs + len);
if (intRightLen > 0) {
strbufAddingBuf.Append(strTarget.substr(ofs + len));
}
for (var i = len - strOrigin.length; i > 0; i = i - 1) {
strbufAddingBuf.Append(' ');
}
return strbufAddingBuf.ToString();
};
/// <summary> Checks whether a character is 1 byte (halfwidth) or not (fullwidth)
/// Returns true if the character is represented by 1 byte in non-Unicode
/// encoding.
/// </summary>
/// <param name="letter:">a character to be checked.
/// </param>
/// <returns> true if the character is halfwidth (SBCS), or false if it is
/// fullwidth (DBCS).
/// </returns>
/**
* @param {?} str
* @return {?}
*/
UtilStrByteMode.isHalfWidth = /**
* @param {?} str
* @return {?}
*/
function (str) {
/** @type {?} */
var letter = str.charCodeAt(0);
if (32 <= /*' '*/ letter && letter <= 126 /*'~'*/) {
return true;
}
else {
/** @type {?} */
var len = UtilStrByteMode.lenB(str);
if (len === 1)
return true;
}
return false;
};
/// <summary> Checks whether a character is halfwidth digit letter
/// Do not use "Character.isDigit" which cannot distinguish between
/// halfwidth digit letter(SBCS) and fullwidth difit letter(DBCS).
/// </summary>
/// <param name="letter:">a character to be checked.
/// </param>
/// <returns> true if the character is halfwidth digit letter, or
/// false if it is DBCS or not digit letter.
/// </returns>
/**
* @param {?} letter
* @return {?}
*/
UtilStrByteMode.isDigit = /**
* @param {?} letter
* @return {?}
*/
function (letter) {
return 48 <= /*'0'*/ /*'0'*/ letter.charCodeAt(0) && letter.charCodeAt(0) <= 57 /*'9'*/;
};
/// <summary>Checks whether a character is one of those supported for # Alpha Mask</summary>
/// <param name="letter:">a character to be checked.
/// </param>
/// <returns> true if the character is halfwidth digit letter, or
/// false if it is DBCS or not digit letter.
/// </returns>
/**
* @param {?} letter
* @return {?}
*/
UtilStrByteMode.asNumeric = /**
* @param {?} letter
* @return {?}
*/
function (letter) {
/** @type {?} */
var result;
switch (letter.charCodeAt(0)) {
case 42: /*'*'*/
case 43: /*'+'*/
case 44: /*','*/
case 45: /*'-'*/
case 46: /*'.'*/
case 47:
/*'/'*/
result = true;
break;
default:
result = false;
break;
}
return result;
};
/// <summary> Converts a position for the 1st string (Source) to a position for
/// the 2nd string (Dest).
/// If a double byte character exists in the strings, the position for the
/// Source could be different from the position for the Dest.
/// (DBCS Support)
///
/// </summary>
/// <param name="strSource:">Source string
/// </param>
/// <param name="strDest:">Dest string
/// </param>
/// <param name="pos:">position in the Source string
/// </param>
/// <param name="isAdvance:">advance or retreat the ret pos if a DBCS char is split
/// </param>
/// <returns> position in the Dest string
///
/// Example: convPos("abcYZ", "YZabc", 4)
/// It returns 4, if the all characters in the strings are SBCS.
///
/// If 'a', 'b' and 'c' are SBCS, and 'Y' and 'Z' are DBCS, it
/// returns 3.
/// pos
/// Unicode index 0 1 2 3 [4]
/// +-------------+
/// Source string |a|b|c| Y | Z |
/// +-------------+
/// ANSI index 0 1 2 3 4[5]6
/// +-------------+
/// Dest string | Y | Z |a|b|c|
/// +-------------+
/// Unicode index 0 1 2[3]4
/// ret
/// </returns>
/**
* @param {?} strSource
* @param {?} strDest
* @param {?} pos
* @param {?} isAdvance
* @return {?}
*/
UtilStrByteMode.convPos = /**
* @param {?} strSource
* @param {?} strDest
* @param {?} pos
* @param {?} isAdvance
* @return {?}
*/
function (strSource, strDest, pos, isAdvance) {
/** @type {?} */
var retPos;
if (pos < 0)
return 0;
if (pos > strSource.length)
pos = strSource.length;
/** @type {?} */
var diffLen = UtilStrByteMode.lenB(strSource) - UtilStrByteMode.lenB(strDest);
if (diffLen > 0) {
/** @type {?} */
var stringBuilder = new StringBuilder(strDest);
for (; diffLen > 0; diffLen--)
stringBuilder.Append(' ');
strDest = stringBuilder.ToString();
}
/** @type {?} */
var byteSource = UtilStrByteMode.Encoding.GetBytes(strSource.substr(0, pos));
/** @type {?} */
var strLeftB = UtilStrByteMode.leftB(strDest, byteSource.length);
retPos = strLeftB.length;
if (!isAdvance && retPos > 0 && strLeftB.charCodeAt(retPos - 1) === 32 /*' '*/ && strDest.charCodeAt(retPos - 1) !== 32 /*' '*/) {
retPos = retPos - 1;
}
return retPos;
};
/// <summary> return the number of characters of picture which corresponds to
/// given string.
/// </summary>
/// <param name="str:">given string
/// </param>
/// <param name="picture:">picture
/// </param>
/// <returns> minimal length of picture
/// Example: getMinLenPicture("ZZ20/11/", "JJJJYY/MM/DD") [ZZ is DBCS]
/// It returns 10.
/// </returns>
/// (DBCS Support)
/**
* @param {?} str
* @param {?} picture
* @return {?}
*/
UtilStrByteMode.getMinLenPicture = /**
* @param {?} str
* @param {?} picture
* @return {?}
*/
function (str, picture) {
/** @type {?} */
var len = 0;
if (UtilStrByteMode.lenB(picture) - UtilStrByteMode.lenB(str) > 0) {
len = UtilStrByteMode.convPos(str, picture, str.length, false);
}
else
len = picture.length;
return len;
};
/// <summary>
/// </summary> Compares two specified strings in the DBCS sort order and returns an integer
/// that indicates their relative position.
/// <param name="str1:">The first string to compare.
/// </param>
/// <param name="str2:">The second string to compare.
/// </param>
/// <returns>an integer that indicates the lexical relationship between the two strings.
/// -1: str1 is less than str2.
/// 0: str1 equals str2.
/// 1: str1 is greater than str2.
/// </returns>
/**
* @param {?} str1
* @param {?} str2
* @return {?}
*/
UtilStrByteMode.strcmp = /**
* @param {?} str1
* @param {?} str2
* @return {?}
*/
function (str1, str2) {
/** @type {?} */
var array1 = UtilStrByteMode.Encoding.GetBytes(str1);
/** @type {?} */
var array2 = UtilStrByteMode.Encoding.GetBytes(str2);
for (var i = 0; i < array1.length && i < array2.length; i++) {
if (array1[i] > array2[i]) {
return 1;
}
else if (array1[i] < array2[i]) {
return -1;
}
}
if (array1.length > array2.length)
return 1;
if (array1.length < array2.length)
return -1;
else
return 0;
};
UtilStrByteMode.Encoding = Encoding.UTF8;
// TODO : need to check what to do with CultureInfo
UtilStrByteMode.twoLetterISOLanguageName = " ";
UtilStrByteMode._bLocaleDefLangJPN = (UtilStrByteMode.twoLetterISOLanguageName === "ja");
UtilStrByteMode._bLocaleDefLangCHN = (UtilStrByteMode.twoLetterISOLanguageName === "zh");
UtilStrByteMode._bLocaleDefLangKOR = (UtilStrByteMode.twoLetterISOLanguageName === "ko");
return UtilStrByteMode;
}());
export { UtilStrByteMode };
if (false) {
/** @type {?} */
UtilStrByteMode.Encoding;
/** @type {?} */
UtilStrByteMode.twoLetterISOLanguageName;
/** @type {?} */
UtilStrByteMode._bLocaleDefLangJPN;
/** @type {?} */
UtilStrByteMode._bLocaleDefLangCHN;
/** @type {?} */
UtilStrByteMode._bLocaleDefLangKOR;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXRpbFN0ckJ5dGVNb2RlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG1hZ2ljLXhwYS91dGlscy8iLCJzb3VyY2VzIjpbInNyYy9VdGlsU3RyQnl0ZU1vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQU1BLE9BQU8sRUFBVSxRQUFRLEVBQUUsYUFBYSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7Ozs7SUFVcEUsOEVBQThFO0lBQzlFLHVFQUF1RTtJQUN2RSw0Q0FBNEM7SUFDNUMsR0FBRztJQUNILGNBQWM7SUFDZCw0Q0FBNEM7SUFDNUMsY0FBYzs7OztJQUNQLG1DQUFtQjs7O0lBQTFCO1FBQ0UsTUFBTSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsSUFBSSxlQUFlLENBQUMsa0JBQWtCLElBQUksZUFBZSxDQUFDLGtCQUFrQixDQUFDO0tBQ3ZIO0lBRUQsNkVBQTZFO0lBQzdFLGdCQUFnQjtJQUNoQixHQUFHO0lBQ0gsY0FBYztJQUNkLCtDQUErQztJQUMvQyxjQUFjOzs7O0lBQ1Asa0NBQWtCOzs7SUFBekI7UUFDRSxNQUFNLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDO0tBQzNDO0lBRUQsNkVBQTZFO0lBQzdFLGNBQWM7SUFDZCxHQUFHO0lBQ0gsY0FBYztJQUNkLDZDQUE2QztJQUM3QyxjQUFjOzs7O0lBQ1Asa0NBQWtCOzs7SUFBekI7UUFDRSxNQUFNLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDO0tBQzNDOzs7OztJQUVNLGlDQUFpQjs7OztJQUF4QixVQUF5QixDQUFTO1FBQ2hDLE1BQU0sQ0FBQyxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUEsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVEsSUFBSSxDQUFDLElBQUksSUFBSSxPQUFPLENBQUEsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLFNBQVEsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUEsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVEsSUFBSSxDQUFDLEtBQUss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QWUsQ0FBQyx3QkFBd0IsS0FBSyxJQUFJLENBQUM7eUNBQ25ELENBQUMsZUFBZSxDQUFDLHdCQUF3QixLQUFLLElBQUksQ0FBQzt5Q0FDbkQsQ0FBQyxlQUFlLENBQUMsd0JBQXdCLEtBQUssSUFBSSxDQUFDOzBCQWRsRzs7U0FRYSxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiLy8vIDxzdW1tYXJ5PkpQTjogREJDUyBzdXBwb3J0XHJcbi8vLyBVdGlsaXR5IENsYXNzIGZvciBTdHJpbmdcclxuLy8vIEluIHRoaXMgY2xhc3MsIGNvbnNpZGVyaW5nIERCQ1MsIHN0cmluZ3MgYXJlIGNvdW50ZWQgYnkgdGhlIG51bWJlclxyXG4vLy8gb2YgYnl0ZXMsIG5vdCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMuXHJcbi8vLyA8L3N1bW1hcnk+XHJcbi8vLyA8YXV0aG9yPiAgVG9zaGlybyBOYWtheW9zaGkgKE1TSikgPC9hdXRob3I+XHJcbmltcG9ydCB7TlN0cmluZywgRW5jb2RpbmcsIFN0cmluZ0J1aWxkZXJ9IGZyb20gXCJAbWFnaWMteHBhL21zY29yZWxpYlwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFV0aWxTdHJCeXRlTW9kZSAge1xyXG4gIHB1YmxpYyBzdGF0aWMgRW5jb2Rpbmc6IEVuY29kaW5nID0gRW5jb2RpbmcuVVRGODtcclxuICAgIC8vIFRPRE8gOiBuZWVkIHRvIGNoZWNrIHdoYXQgdG8gZG8gd2l0aCBDdWx0dXJlSW5mb1xyXG4gIHN0YXRpYyB0d29MZXR0ZXJJU09MYW5ndWFnZU5hbWU6IHN0cmluZyA9IFwiIFwiO1xyXG4gIHByaXZhdGUgc3RhdGljIF9iTG9jYWxlRGVmTGFuZ0pQTjogYm9vbGVhbiA9IChVdGlsU3RyQnl0ZU1vZGUudHdvTGV0dGVySVNPTGFuZ3VhZ2VOYW1lID09PSBcImphXCIpO1xyXG4gIHByaXZhdGUgc3RhdGljIF9iTG9jYWxlRGVmTGFuZ0NITjogYm9vbGVhbiA9IChVdGlsU3RyQnl0ZU1vZGUudHdvTGV0dGVySVNPTGFuZ3VhZ2VOYW1lID09PSBcInpoXCIpO1xyXG4gIHByaXZhdGUgc3RhdGljIF9iTG9jYWxlRGVmTGFuZ0tPUjogYm9vbGVhbiA9IChVdGlsU3RyQnl0ZU1vZGUudHdvTGV0dGVySVNPTGFuZ3VhZ2VOYW1lID09PSBcImtvXCIpO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+IENoZWNrcyB0aGUgZW52aXJvbm1lbnQgd2hldGhlciBpdCBpcyBydW5uaW5nIG9uIERCQ1MgZW52aXJvbm1lbnRcclxuICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBsYW5ndWFnZSBjb2RlIGZvciB0aGUgY3VycmVudCBkZWZhdWx0IExvY2FsZSBpc1xyXG4gIC8vLyBEQkNTIGxhbmd1YWdlIChpbiBub24tVW5pY29kZSBlbmNvZGluZykuXHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgREJDUywgb3IgZmFsc2UgaWYgU0JDU1xyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgc3RhdGljIGlzTG9jYWxlRGVmTGFuZ0RCQ1MoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gVXRpbFN0ckJ5dGVNb2RlLl9iTG9jYWxlRGVmTGFuZ0pQTiB8fCBVdGlsU3RyQnl0ZU1vZGUuX2JMb2NhbGVEZWZMYW5nQ0hOIHx8IFV0aWxTdHJCeXRlTW9kZS5fYkxvY2FsZURlZkxhbmdLT1I7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IENoZWNrcyB3aGV0aGVyIHRoZSBsYW5ndWFnZSBjb2RlIGZvciB0aGUgY3VycmVudCBkZWZhdWx0IExvY2FsZVxyXG4gIC8vLyBpcyBKQVBBTkVTRS5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSBpZiBKQVBBTkVTRSwgb3IgZmFsc2UgaWYgbm90XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBzdGF0aWMgaXNMb2NhbGVEZWZMYW5nSlBOKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIFV0aWxTdHJCeXRlTW9kZS5fYkxvY2FsZURlZkxhbmdKUE47XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IENoZWNrcyB3aGV0aGVyIHRoZSBsYW5ndWFnZSBjb2RlIGZvciB0aGUgY3VycmVudCBkZWZhdWx0IExvY2FsZVxyXG4gIC8vLyBpcyBLT1JFQU4uXHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgS09SRUFOLCBvciBmYWxzZSBpZiBub3RcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBpc0xvY2FsZURlZkxhbmdLT1IoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gVXRpbFN0ckJ5dGVNb2RlLl9iTG9jYWxlRGVmTGFuZ0tPUjtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBpc0tvcmVhbkNoYXJhY3RlcihjOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoNDQwMzIgPD0gLyon6rCAJyovYyAmJiBjIDw9IDU1MjAzLyon7Z6jJyovKSB8fCAoNDM1MiA8PSAvKifhhIAnKi9jICYmIGMgPD0gNDYwNy8qJ+GHvycqLykgfHwgKDEyNTkyIDw9IC8qJ+OEsCcqL2MgJiYgYyA8PSAxMjY4Ny8qJ+OGjycqLykgfHwgKDQzMzYwIDw9IC8qJ+qloCcqL2MgJiYgYyA8PSA0MzM5MS8qJ+qlvycqLykgfHwgKDU1MjE2IDw9IC8qJ+2esCcqL2MgJiYgYyA8PSA1NTI5NS8qJ+2fvycqLyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IExlbmd0aCBvZiBTdHJpbmdcclxuICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIChpbiBkZWZhdWx0IGVuY29kaW5nKS5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0clZhbDpcIj5zdHJpbmcgKGluIFVuaWNvZGUpXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgbnVtYmVyIG9mIGJ5dGVzIChpbiBkZWZhdWx0IGVuY29kaW5nKVxyXG4gIC8vL1xyXG4gIC8vLyBFeGFtcGxlOiBsZW5CKFwiYWJYWWNcIilcclxuICAvLy8gV2hlcmUgJ2EnLCAnYicgYW5kICAnYycgYXJlIFNCQ1MsIGFuZCAnWCcgYW5kICdZJyBhcmUgREJDUywgaXQgcmV0dXJuc1xyXG4gIC8vLyA3LlxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgc3RhdGljIGxlbkIoc3RyVmFsOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgLy8gY29udmVydCB0byBieXRlW10gYnkgZGVmYXVsdC1lbmNvZGluZ1xyXG4gIC