UNPKG

@magic-xpa/utils

Version:

magic utils package

729 lines (723 loc) • 81.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { NString, RefParam, StringBuilder } from "@magic-xpa/mscorelib"; import { UtilStrByteMode } from "./UtilStrByteMode"; import { Rtf } from "./Rtf"; /** @type {?} */ const HTML_BACKSLASH = "&#092;"; /** @type {?} */ const HTML_COMMA = "&#044;"; /** @type {?} */ const HTML_HYPHEN = "&#045;"; /** @type {?} */ const STR_2_HTML = 1; /** @type {?} */ export const SEQ_2_HTML = 2; /** @type {?} */ export const HTML_2_STR = 3; /** @type {?} */ const HTML_2_SEQ = 4; /** @type {?} */ export const SEQ_2_STR = 5; export class StrUtil { /** * @param {?} str * @param {?} len * @return {?} */ static mem_trim(str, len) { /** @type {?} */ let result; if (len > 0) { if (len > str.length) { result = -1; return result; } while (len > 0 && str[len - 1] === ' ') { len = len - 1; } } result = len; return result; } /** * @param {?} dest * @param {?} destCount * @param {?} src * @param {?} srcCount * @param {?} len * @return {?} */ static memmove(dest, destCount, src, srcCount, len) { /** @type {?} */ let stringBuilder = new StringBuilder(dest.length + len); if (UtilStrByteMode.isLocaleDefLangJPN() && dest.length < destCount) { stringBuilder.Append(NString.FromChar(' ', destCount)); } else { stringBuilder.Append(dest.substr(0, destCount)); } stringBuilder.Append(src.substr(srcCount, len)); if (stringBuilder.Length < dest.length) { stringBuilder.Append(dest.substr(stringBuilder.Length)); } return stringBuilder.ToString(); } /** * @param {?} dest * @param {?} destCount * @param {?} src * @param {?} scrCountOrSrcCount * @param {?} count * @return {?} */ static memcpy(dest, destCount, src, scrCountOrSrcCount, count) { if (arguments.length === 5 && (dest === null || dest.constructor === String) && (destCount === null || destCount.constructor === Number) && (src === null || src.constructor === String) && (scrCountOrSrcCount === null || scrCountOrSrcCount.constructor === Number) && (count === null || count.constructor === Number)) { return StrUtil.memcpy_0(dest, destCount, src, scrCountOrSrcCount, count); } StrUtil.memcpy_1(dest, destCount, src, scrCountOrSrcCount, count); } /** * @param {?} dest * @param {?} destCount * @param {?} src * @param {?} scrCount * @param {?} count * @return {?} */ static memcpy_0(dest, destCount, src, scrCount, count) { /** @type {?} */ let stringBuilder = new StringBuilder(dest.substr(0, destCount)); if (scrCount + count < src.length) { stringBuilder.Append(src.substr(scrCount, count - scrCount)); } else { stringBuilder.Append(src.substr(scrCount)); } /** @type {?} */ let size = dest.length - destCount - count; if (size > 0) { stringBuilder.Append(dest.substr(destCount + count)); } return stringBuilder.ToString(); } /** * @param {?} dest * @param {?} destCount * @param {?} src * @param {?} srcCount * @param {?} count * @return {?} */ static memcpy_1(dest, destCount, src, srcCount, count) { while (count > 0 && destCount < dest.length && srcCount < src.length) { dest[destCount++] = src[srcCount++]; count = count - 1; } } /** * @param {?} dest * @param {?} destCount * @param {?} inVal * @param {?} counter * @return {?} */ static memset(dest, destCount, inVal, counter) { if (arguments.length === 4 && (dest === null || dest.constructor === String) && (destCount === null || destCount.constructor === Number) && (inVal === null || inVal.constructor === Number) && (counter === null || counter.constructor === Number)) { return StrUtil.memset_0(dest, destCount, inVal, counter); } StrUtil.memset_1(dest, destCount, inVal, counter); } /** * @param {?} dest * @param {?} destCount * @param {?} inVal * @param {?} counter * @return {?} */ static memset_0(dest, destCount, inVal, counter) { /** @type {?} */ let first = new StringBuilder(dest.substr(0, destCount)); while (counter > 0) { first.Append(inVal); counter = counter - 1; } if (first.Length < dest.length) { first.Append(dest.substr(first.Length)); } return first.ToString(); } /** * @param {?} dest * @param {?} destCount * @param {?} inVal * @param {?} counter * @return {?} */ static memset_1(dest, destCount, inVal, counter) { while (counter > 0 && destCount < dest.length) { dest[destCount++] = inVal; counter = counter - 1; } } /** * @param {?} str * @param {?} substr * @return {?} */ static strstr(str, substr) { /** @type {?} */ let from = str.indexOf(substr); /** @type {?} */ let result; if (from < 0) { result = null; } else { result = str.substr(from); } return result; } /** * *************************** * @param {?} text * @return {?} */ static ReverseString(text) { /** @type {?} */ let array = NString.ToCharArray(text.ToString()); array.reverse(); return new StringBuilder(NString.FromChars(array)); } /** * @param {?} str * @return {?} */ static rtrim(str) { return StrUtil.rtrimWithNull(str, false); } /** * @param {?} str * @param {?} trimNullChars * @return {?} */ static rtrimWithNull(str, trimNullChars) { /** @type {?} */ let result; if (typeof str === "undefined" || str === null || str.length === 0) { result = str; } else { /** @type {?} */ let idx = str.length - 1; if (trimNullChars) { while (idx >= 0 && (str[idx] === ' ' || str[idx] === String.fromCharCode(0) /*''*/)) { idx = idx - 1; } } else { while (idx >= 0 && str[idx] === ' ') { idx = idx - 1; } } idx = idx + 1; if (idx < str.length) { result = str.substr(0, idx); } else { result = str; } } return result; } /** * @param {?} str * @return {?} */ static ltrim(str) { /** @type {?} */ let length = str.length; /** @type {?} */ let i = 0; /** @type {?} */ let result; if (str === null || length === 0) { result = str; } else { while (i < length && str[i] === ' ' /*' '*/) { i = i + 1; } if (i > 0) { str = str.substr(i); } result = str; } return result; } /** * @param {?} str * @param {?} strToDelete * @return {?} */ static DeleteStringsFromEnds(str, strToDelete) { if (str.startsWith(strToDelete)) { str = str.substr(strToDelete.length); } if (str.endsWith(strToDelete)) { str = str.substr(0, str.length - strToDelete.length); } /** @type {?} */ let result; if (str.length === 0) { result = null; } else { result = str; } return result; } /** * @param {?} str * @param {?} len * @return {?} */ static padStr(str, len) { /** @type {?} */ let padLen = len - str.length; if (padLen > 0) { if (StrUtil._paddingSpaces === null || StrUtil._paddingSpaces.length < padLen) { StrUtil._paddingSpaces = NString.FromChar(' ', padLen); } /** @type {?} */ let stringBuilder = new StringBuilder(len); stringBuilder.Append(str); stringBuilder.Append(StrUtil._paddingSpaces, 0, padLen); str = stringBuilder.ToString(); } return str; } /** * @param {?} source * @param {?} delim * @return {?} */ static tokenize(source, delim) { // It is mentioned in the comment that we should not use String.Split() // because its behavior is different than Java's tokenizer. // So, we were suppose to use our own implementation (the commented code below). // But all these years, we were calling XmlParser.getToken() which was actually // using String.Split(). And we didn't face any problem. // So, it seems that we do not have problem in using String.Split(). // But now, we can improve the performance here... // XmlParser.getTokens() was getting a String[] using String.Split(). // It was then creating a List<String> from this String[] and was returning it to // tokenize(). // tokenize() was again converting this List<String> back to String[]. // So why not call String.Split() directly? return source.split(delim); /* String [] tokens = null; char [] delimArry = delim.toCharArray(); //since java discards delimiters from the start and end of the string and c# does not //we need to remove them manually // source = source.TrimEnd(delimArry); // source = source.TrimStart(delimArry); source = source.trim(); //now that we have remove starting and ending delimiters we can split tokens = source.Split(delimArry); /* * only one problem: if we have two Subsequent delimiters for example : * the delimiter is ';' and the string is: "first;;second;third" * then in java String tokenizer will give us only 3 tokens :first,second and third * while is c# split wethod will return 4 tokens: first,empty string,second and third * we need to deal with that */ /* List res = new List(); for (int i = 0 ; i < tokens.length; i++) { if (tokens[i] != "" ) res.addItem(tokens[i]); } return (String [])(res.getAllItems (String.class));*/ } /** * @param {?} str * @param {?} minLength * @return {?} */ static stringToHexaDump(str, minLength) { /** @type {?} */ let stringBuilder = new StringBuilder(str.length * minLength); for (let indx = 0; indx < str.length; indx = indx + 1) { /** @type {?} */ let currInt = str.charCodeAt(indx); /** @type {?} */ let hexStr = currInt.toString(16); while (hexStr.length < minLength) { hexStr = "0" + hexStr; } stringBuilder.Append(hexStr); } return stringBuilder.ToString().toUpperCase(); } /** * @param {?} str * @param {?} from * @param {?} to * @return {?} */ static searchAndReplace(str, from, to) { if (arguments.length === 3 && (str === null || str.constructor === String) && (from === null || from.constructor === String) && (to === null || to.constructor === String)) { return StrUtil.searchAndReplace_0(str, from, to); } return StrUtil.searchAndReplace_1(str, from, to); } /** * @param {?} str * @param {?} from * @param {?} to * @return {?} */ static searchAndReplace_0(str, from, to) { /** @type {?} */ let lastSubStr = 0; /** @type {?} */ let startSubStr; /** @type {?} */ let result; if ((startSubStr = str.indexOf(from)) === -1) { result = str; } else { /** @type {?} */ let stringBuilder = new StringBuilder(str.length); while (startSubStr !== -1) { stringBuilder.Append(str.substr(lastSubStr, startSubStr - lastSubStr) + to); startSubStr = startSubStr + from.length; lastSubStr = startSubStr; startSubStr = str.indexOf(from, lastSubStr); } stringBuilder.Append(str.substr(lastSubStr)); result = stringBuilder.ToString(); } return result; } /** * @param {?} str * @param {?} from * @param {?} to * @return {?} */ static searchAndReplace_1(str, from, to) { /** @type {?} */ let lastSubStr = 0; /** @type {?} */ let sarIndex = 0; /** @type {?} */ let fromCopy = from.slice(); /** @type {?} */ let startSubStr; /** @type {?} */ let SARindex = new RefParam(0); startSubStr = StrUtil.indexOf(str, fromCopy, lastSubStr, SARindex); sarIndex = SARindex.value; if (startSubStr === -1) return str; /** @type {?} */ let result; /** @type {?} */ let tmpBuf = new StringBuilder(str.length); while (startSubStr !== -1) { tmpBuf.Append(str.substr(lastSubStr, startSubStr - lastSubStr) + to[sarIndex]); startSubStr += fromCopy[sarIndex].length; lastSubStr = startSubStr; startSubStr = StrUtil.indexOf(str, fromCopy, lastSubStr, SARindex); sarIndex = SARindex.value; } ; tmpBuf.Append(str.substr(lastSubStr)); result = tmpBuf.ToString(); return result; } /** * @param {?} str * @param {?} strings * @param {?} offset * @param {?} SARindex * @return {?} */ static indexOf(str, strings, offset, SARindex) { /** @type {?} */ let minOffset = -1; for (let i = 0; i < strings.length; i = i + 1) { /** @type {?} */ let flag = strings[i] === null; if (!(strings[i] === null)) { /** @type {?} */ let resultOffset = str.indexOf(strings[i], offset); if (resultOffset === -1) { strings[i] = null; } else { if (resultOffset < minOffset || minOffset === -1) { minOffset = resultOffset; SARindex.value = i; } } } } /** @type {?} */ let result; if (minOffset > -1) { result = minOffset; } else { SARindex.value = -1; result = -1; } return result; } /** * @param {?} userString * @param {?} token * @param {?} occurrence * @param {?} val * @return {?} */ static replaceStringTokens(userString, token, occurrence, val) { /** @type {?} */ let tokenLen = token.length; /** @type {?} */ let currPosition = 0; /** @type {?} */ let newString = userString; if (val !== null) { /** @type {?} */ let num2 = 0; while (num2 < occurrence && currPosition !== -1) { currPosition = userString.indexOf(token, currPosition + ((num2 === 0) ? 0 : tokenLen)); num2 = num2 + 1; } if (currPosition !== -1) { newString = userString.substr(0, currPosition) + val + userString.substr(currPosition + tokenLen, userString.length - (currPosition + tokenLen)); } } return newString; } /** * @param {?} source * @param {?} type * @return {?} */ static makePrintableTokens(source, type) { if (arguments.length === 2 && (source === null || source.constructor === String) && (type === null || type.constructor === Number)) { return StrUtil.makePrintableTokens_0(source, type); } StrUtil.makePrintableTokens_1(source, type); } /** * @param {?} source * @param {?} type * @return {?} */ static makePrintableTokens_0(source, type) { /** @type {?} */ let escStr = [ "\\", "-", "," ]; /** @type {?} */ let escSeq = [ "\\\\", "\\-", "\\," ]; /** @type {?} */ let escHtm = [ HTML_BACKSLASH, HTML_HYPHEN, HTML_COMMA ]; /** @type {?} */ let result; switch (type) { case STR_2_HTML: result = StrUtil.searchAndReplace(source, escStr, escHtm); break; case SEQ_2_HTML: result = StrUtil.searchAndReplace(source, escSeq, escHtm); break; case HTML_2_SEQ: result = StrUtil.searchAndReplace(source, escHtm, escSeq); break; case HTML_2_STR: result = StrUtil.searchAndReplace(source, escHtm, escStr); break; case SEQ_2_STR: result = StrUtil.searchAndReplace(source, escSeq, escStr); break; default: result = source; break; } return result; } /** * @param {?} source * @param {?} type * @return {?} */ static makePrintableTokens_1(source, type) { if (source !== null) { /** @type {?} */ let length = source.length; for (let i = 0; i < length; i = i + 1) { /** @type {?} */ let currElm = source.get_Item(i); source.set_Item(i, StrUtil.makePrintableTokens_0(currElm, type)); } } } /** * @param {?} source * @return {?} */ static makePrintable(source) { /** @type {?} */ let from = [ "\n", "\r", "'", "\\", "\"", "\0" ]; /** @type {?} */ let to = [ "\\n", "\\r", "\\'", "\\\\", "\\\"", "\\0" ]; return StrUtil.searchAndReplace(source, from, to); } /** * @param {?} source * @return {?} */ static makePrintable2(source) { /** @type {?} */ let from = [ "\n", "\r", "\0" ]; /** @type {?} */ let to = [ "\\n", "\\r", "\\0" ]; return StrUtil.searchAndReplace(source, from, to); } /** * @param {?} s * @param {?} len * @return {?} */ static ZstringMake(s, len) { len = StrUtil.mem_trim(s, len); return s.substr(0, len); } /** * @param {?} rtfText * @return {?} */ static GetPlainTextfromRtf(rtfText) { if (Rtf.isRtf(rtfText)) { /** @type {?} */ let rtf = new Rtf(); /** @type {?} */ let outputTxt = new StringBuilder(""); rtf.toTxt(rtfText, outputTxt); rtfText = outputTxt.ToString(); } return rtfText; } /** * @param {?} str1 * @param {?} str2 * @return {?} */ static StringsArraysEqual(str1, str2) { /** @type {?} */ let result; if (str1 === null && str2 === null) { result = true; } else { if (str1 === null || str2 === null) { result = false; } else { if (str1.length !== str2.length) { result = false; } else { for (let index = 0; index < /** @type {?} */ (str1.length); index = index + 1) { if ((str1[index] !== str2[index])) { result = false; return result; } } result = true; } } } return result; } /** * @param {?} buf * @param {?} len * @param {?} filler * @return {?} */ static SearchAndReplaceWildChars(buf, len, filler) { buf = NString.PadRight(buf, len); /** @type {?} */ let escChar = false; /** @type {?} */ let stopSearch = false; /** @type {?} */ let tmpBuf = new StringBuilder(len); for (let i = 0; i < len; i = i + 1) { switch (buf[i]) { case ('\\'): { /** @type {?} */ let isNextCharWild = true; //If next char is not wild , then copy '\', if this is first char. if ((i + 1 < len) && (buf[i + 1] != '*' && buf[i + 1] != '\\')) isNextCharWild = false; if (escChar || !isNextCharWild) tmpBuf.Append(buf[i]); escChar = !escChar; } break; case ('*'): if (escChar) tmpBuf.Append(buf[i]); else { tmpBuf.Append(filler, len - tmpBuf.Length); stopSearch = true; } escChar = false; break; case '?': tmpBuf.Append(filler); escChar = false; break; default: tmpBuf.Append(buf[i]); escChar = false; break; } } /** @type {?} */ let text = tmpBuf.ToString(); return NString.TrimEnd(NString.TrimEnd(text, ['\0'])); } } StrUtil._paddingSpaces = null; if (false) { /** @type {?} */ StrUtil._paddingSpaces; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RyVXRpbC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BtYWdpYy14cGEvdXRpbHMvIiwic291cmNlcyI6WyJzcmMvU3RyVXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFPLE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDNUUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7O0FBRTFCLE1BQU0sY0FBYyxHQUFXLFFBQVEsQ0FBQzs7QUFDeEMsTUFBTSxVQUFVLEdBQVcsUUFBUSxDQUFDOztBQUNwQyxNQUFNLFdBQVcsR0FBVyxRQUFRLENBQUM7O0FBQ3JDLE1BQU0sVUFBVSxHQUFXLENBQUMsQ0FBQzs7QUFDN0IsYUFBYSxVQUFVLEdBQVcsQ0FBQyxDQUFDOztBQUNwQyxhQUFhLFVBQVUsR0FBVyxDQUFDLENBQUM7O0FBQ3BDLE1BQU0sVUFBVSxHQUFXLENBQUMsQ0FBQzs7QUFDN0IsYUFBYSxTQUFTLEdBQVcsQ0FBQyxDQUFDO0FBRW5DLE1BQU07Ozs7OztJQUlKLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBVyxFQUFFLEdBQVc7O1FBQ3RDLElBQUksTUFBTSxDQUFTO1FBQ25CLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ1osRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNyQixNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ1osTUFBTSxDQUFDLE1BQU0sQ0FBQzthQUNmO1lBQ0QsT0FBTyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ3ZDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO2FB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LEVBQUUsQ0FBQztRQUNyQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN2RDs7eUJBdnBCdUMsSUFBSSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TGlzdCwgTlN0cmluZywgUmVmUGFyYW0sIFN0cmluZ0J1aWxkZXJ9IGZyb20gXCJAbWFnaWMteHBhL21zY29yZWxpYlwiO1xyXG5pbXBvcnQge1V0aWxTdHJCeXRlTW9kZX0gZnJvbSBcIi4vVXRpbFN0ckJ5dGVNb2RlXCI7XHJcbmltcG9ydCB7UnRmfSBmcm9tIFwiLi9SdGZcIjtcclxuXHJcbmNvbnN0IEhUTUxfQkFDS1NMQVNIOiBzdHJpbmcgPSBcIiYjMDkyO1wiO1xyXG5jb25zdCBIVE1MX0NPTU1BOiBzdHJpbmcgPSBcIiYjMDQ0O1wiO1xyXG5jb25zdCBIVE1MX0hZUEhFTjogc3RyaW5nID0gXCImIzA0NTtcIjtcclxuY29uc3QgU1RSXzJfSFRNTDogbnVtYmVyID0gMTtcclxuZXhwb3J0IGNvbnN0IFNFUV8yX0hUTUw6IG51bWJlciA9IDI7XHJcbmV4cG9ydCBjb25zdCBIVE1MXzJfU1RSOiBudW1iZXIgPSAzO1xyXG5jb25zdCBIVE1MXzJfU0VROiBudW1iZXIgPSA0O1xyXG5leHBvcnQgY29uc3QgU0VRXzJfU1RSOiBudW1iZXIgPSA1O1xyXG5cclxuZXhwb3J0IGNsYXNzIFN0clV0aWwge1xyXG4gIHByaXZhdGUgc3RhdGljIF9wYWRkaW5nU3BhY2VzOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+IHRyaW0gdGhlIGVuZCBvZiB0aGUgc3RyaW5nPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBtZW1fdHJpbShzdHI6IHN0cmluZywgbGVuOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHJlc3VsdDogbnVtYmVyO1xyXG4gICAgaWYgKGxlbiA+IDApIHtcclxuICAgICAgaWYgKGxlbiA+IHN0ci5sZW5ndGgpIHtcclxuICAgICAgICByZXN1bHQgPSAtMTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9XHJcbiAgICAgIHdoaWxlIChsZW4gPiAwICYmIHN0cltsZW4gLSAxXSA9PT0gJyAnKSB7XHJcbiAgICAgICAgbGVuID0gbGVuIC0gMTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmVzdWx0ID0gbGVuO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBtZW1tb3ZlKGRlc3Q6IHN0cmluZywgZGVzdENvdW50OiBudW1iZXIsIHNyYzogc3RyaW5nLCBzcmNDb3VudDogbnVtYmVyLCBsZW46IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgc3RyaW5nQnVpbGRlcjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKGRlc3QubGVuZ3RoICsgbGVuKTtcclxuICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nSlBOKCkgJiYgZGVzdC5sZW5ndGggPCBkZXN0Q291bnQpIHtcclxuICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQoTlN0cmluZy5Gcm9tQ2hhcignICcsIGRlc3RDb3VudCkpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKGRlc3Quc3Vic3RyKDAsIGRlc3RDb3VudCkpO1xyXG4gICAgfVxyXG4gICAgc3RyaW5nQnVpbGRlci5BcHBlbmQoc3JjLnN1YnN0cihzcmNDb3VudCwgbGVuKSk7XHJcblxyXG4gICAgaWYgKHN0cmluZ0J1aWxkZXIuTGVuZ3RoIDwgZGVzdC5sZW5ndGgpIHtcclxuICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZChkZXN0LnN1YnN0cihzdHJpbmdCdWlsZGVyLkxlbmd0aCkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0cmluZ0J1aWxkZXIuVG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBtZW1jcHkoZGVzdDogc3RyaW5nLCBkZXN0Q291bnQ6IG51bWJlciwgc3JjOiBzdHJpbmcsIHNjckNvdW50OiBudW1iZXIsIGNvdW50OiBudW1iZXIpOiBzdHJpbmc7XHJcbiAgc3RhdGljIG1lbWNweShkZXN0OiBzdHJpbmdbXSwgZGVzdENvdW50OiBudW1iZXIsIHNyYzogc3RyaW5nW10sIHNyY0NvdW50OiBudW1iZXIsIGNvdW50OiBudW1iZXIpOiB2b2lkO1xyXG4gIHN0YXRpYyBtZW1jcHkoZGVzdDogYW55LCBkZXN0Q291bnQ6IG51bWJlciwgc3JjOiBhbnksIHNjckNvdW50T3JTcmNDb3VudDogbnVtYmVyLCBjb3VudDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA1ICYmIChkZXN0ID09PSBudWxsIHx8IGRlc3QuY29uc3RydWN0b3IgPT09IFN0cmluZykgJiYgKGRlc3RDb3VudCA9PT0gbnVsbCB8fCBkZXN0Q291bnQuY29uc3RydWN0b3IgPT09IE51bWJlcikgJiYgKHNyYyA9PT0gbnVsbCB8fCBzcmMuY29uc3RydWN0b3IgPT09IFN0cmluZykgJiYgKHNjckNvdW50T3JTcmNDb3VudCA9PT0gbnVsbCB8fCBzY3JDb3VudE9yU3JjQ291bnQuY29uc3RydWN0b3IgPT09IE51bWJlcikgJiYgKGNvdW50ID09PSBudWxsIHx8IGNvdW50LmNvbnN0cnVjdG9yID09PSBOdW1iZXIpKSB7XHJcbiAgICAgIHJldHVybiBTdHJVdGlsLm1lbWNweV8wKGRlc3QsIGRlc3RDb3VudCwgc3JjLCBzY3JDb3VudE9yU3JjQ291bnQsIGNvdW50KTtcclxuICAgIH1cclxuICAgIFN0clV0aWwubWVtY3B5XzEoZGVzdCwgZGVzdENvdW50LCBzcmMsIHNjckNvdW50T3JTcmNDb3VudCwgY291bnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNvcHkgcGFydCBvZiBzdHJpbmcgaW50byBhbm90aGVyIHN0cmluZywgbGlrZSBtZW1jcHkgb2YgQywgYnV0IDQgc3RyaW5nIG9ubHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGVzdFwiPnN0cmluZzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkZXN0Q291bnRcIj5vZiBjb3VudGVyIHN0YXJ0IGZyb20gaW4gZGVzdGlnbmF0aW9uIHN0cmluZzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzcmNcIj5zdHJpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic2NyQ291bnR