UNPKG

@magic-xpa/utils

Version:

magic utils package

630 lines 50.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { PICInterface } from "./PICInterface"; import { UtilStrByteMode } from "./UtilStrByteMode"; import { NNumber } from "@magic-xpa/mscorelib"; /** @type {?} */ var MAX_GENGO = 5; /** @type {?} */ var IDX_UPPERCASE_ALPHA = 0; /** @type {?} */ var IDX_LOWERCASE_ALPHA = 1; /** @type {?} */ var IDX_KANJI = 2; /** @type {?} */ var IDX_YEAR = 0; /** @type {?} */ var IDX_MONTH = 1; /** @type {?} */ var IDX_DAY = 2; /** @type {?} */ var IDX_DOY = 3; var UtilDateJpn = /** @class */ (function () { function UtilDateJpn() { /// <summary> /// JPN: Japanese date picture support /// Utility Class for Japanese date /// </summary> /// <author> Toshiro Nakayoshi (MSJ) /// </author> // ---- gengo (the name of an era) --------------------------------------- this.MaxGengo = MAX_GENGO; } /** * @return {?} */ UtilDateJpn.getInstance = /** * @return {?} */ function () { if (UtilDateJpn._instance === null) { UtilDateJpn._instance = new UtilDateJpn(); } return UtilDateJpn._instance; }; /** * @return {?} */ UtilDateJpn.getArrayDow = /** * @return {?} */ function () { return UtilDateJpn.JweekStr; }; /** * @param {?} intIdx * @return {?} */ UtilDateJpn.getStrDow = /** * @param {?} intIdx * @return {?} */ function (intIdx) { /** @type {?} */ var flag = intIdx < 0 || 7 < intIdx; if (flag) { intIdx = 0; } return UtilDateJpn.JweekStr[intIdx]; }; /** * @param {?} month * @return {?} */ UtilDateJpn.convertStrMonth = /** * @param {?} month * @return {?} */ function (month) { /** @type {?} */ var flag = month < 0 || 12 < month; if (flag) { month = 0; } return UtilDateJpn.JmonthStr[month]; }; /// <summary> /// Convert a year (A.D.) into Japanese year of an era /// This method is modeled after "date_jpn_year_ofs" function in /// "\mglocal\jpn\jpndate_jpn.cpp". /// </summary> /// <param name = "intYear:">year (A.D.) /// </param> /// <param name = "intDoy:">DOY /// </param> /// <returns> year of an era. /// if either param is invalid, it returns 0. /// </returns> /// <summary> /// Convert a year (A.D.) into Japanese year of an era /// This method is modeled after "date_jpn_year_ofs" function in /// "\mglocal\jpn\jpndate_jpn.cpp". /// </summary> /// <param name = "intYear:">year (A.D.) /// </param> /// <param name = "intDoy:">DOY /// </param> /// <returns> year of an era. /// if either param is invalid, it returns 0. /// </returns> /** * @param {?} intYear * @param {?} intDoy * @return {?} */ UtilDateJpn.prototype.date_jpn_year_ofs = /// <summary> /// Convert a year (A.D.) into Japanese year of an era /// This method is modeled after "date_jpn_year_ofs" function in /// "\mglocal\jpn\jpndate_jpn.cpp". /// </summary> /// <param name = "intYear:">year (A.D.) /// </param> /// <param name = "intDoy:">DOY /// </param> /// <returns> year of an era. /// if either param is invalid, it returns 0. /// </returns> /** * @param {?} intYear * @param {?} intDoy * @return {?} */ function (intYear, intDoy) { /** @type {?} */ var result; if (intYear < 1 || intDoy < 1) { result = 0; } else { /** @type {?} */ var num = this.MaxGengo - 1; while (intYear < UtilDateJpn.StartDayOfGengo[num][0]) { num = num - 1; } if (intYear === UtilDateJpn.StartDayOfGengo[num][0] && intDoy < UtilDateJpn.StartDayOfGengo[num][3]) { num = num - 1; } result = intYear - UtilDateJpn.StartDayOfGengo[num][0] + 1; } return result; }; /// <summary> /// Convert a year (A.D.) into a name of a Japanese era /// This method is modeled after "date_jpn_yr_2_a" function in /// "\mglocal\jpn\jpndate_jpn.cpp". /// </summary> /// <param name = "intYear:">year (A.D.) /// </param> /// <param name = "intDoy:">DOY /// </param> /// <param name = "isKanji:">return a full name (true) or the first letter (false). /// </param> /// <returns> name of an era /// if either param is invalid, it returns "?". /// </returns> /// <summary> /// Convert a year (A.D.) into a name of a Japanese era /// This method is modeled after "date_jpn_yr_2_a" function in /// "\mglocal\jpn\jpndate_jpn.cpp". /// </summary> /// <param name = "intYear:">year (A.D.) /// </param> /// <param name = "intDoy:">DOY /// </param> /// <param name = "isKanji:">return a full name (true) or the first letter (false). /// </param> /// <returns> name of an era /// if either param is invalid, it returns "?". /// </returns> /** * @param {?} intYear * @param {?} intDoy * @param {?} isKanji * @return {?} */ UtilDateJpn.prototype.date_jpn_yr_2_a = /// <summary> /// Convert a year (A.D.) into a name of a Japanese era /// This method is modeled after "date_jpn_yr_2_a" function in /// "\mglocal\jpn\jpndate_jpn.cpp". /// </summary> /// <param name = "intYear:">year (A.D.) /// </param> /// <param name = "intDoy:">DOY /// </param> /// <param name = "isKanji:">return a full name (true) or the first letter (false). /// </param> /// <returns> name of an era /// if either param is invalid, it returns "?". /// </returns> /** * @param {?} intYear * @param {?} intDoy * @param {?} isKanji * @return {?} */ function (intYear, intDoy, isKanji) { /** @type {?} */ var num; if (intYear < 1 || intDoy < 1) { num = 0; } else { num = this.MaxGengo - 1; while (intYear < UtilDateJpn.StartDayOfGengo[num][0]) { num = num - 1; } if (intYear === UtilDateJpn.StartDayOfGengo[num][0] && intDoy < UtilDateJpn.StartDayOfGengo[num][3]) { num = num - 1; } } /** @type {?} */ var result; if (isKanji) { result = UtilDateJpn.GengoStr[num][2]; } else { result = UtilDateJpn.GengoStr[num][0]; } return result; }; /// <summary> /// Get the first year (A.D.) of a specified Japanese era /// This method is modeled after "date_jpn_yr_4_a" function in /// "\mglocal\jpn\jpndate_jpn.cpp". /// </summary> /// <param name = "ucp_str:">name of a specified Japanese era /// </param> /// <param name = "s_len:">length (the number of bytes) of ucp_str /// </param> /// <returns> year (A.D.) /// </returns> /// <summary> /// Get the first year (A.D.) of a specified Japanese era /// This method is modeled after "date_jpn_yr_4_a" function in /// "\mglocal\jpn\jpndate_jpn.cpp". /// </summary> /// <param name = "ucp_str:">name of a specified Japanese era /// </param> /// <param name = "s_len:">length (the number of bytes) of ucp_str /// </param> /// <returns> year (A.D.) /// </returns> /** * @param {?} ucp_str * @param {?} s_len * @return {?} */ UtilDateJpn.prototype.date_jpn_yr_4_a = /// <summary> /// Get the first year (A.D.) of a specified Japanese era /// This method is modeled after "date_jpn_yr_4_a" function in /// "\mglocal\jpn\jpndate_jpn.cpp". /// </summary> /// <param name = "ucp_str:">name of a specified Japanese era /// </param> /// <param name = "s_len:">length (the number of bytes) of ucp_str /// </param> /// <returns> year (A.D.) /// </returns> /** * @param {?} ucp_str * @param {?} s_len * @return {?} */ function (ucp_str, s_len) { /** @type {?} */ var i = this.MaxGengo - 1; if (s_len > 0) { if (s_len > 1) { ucp_str = UtilStrByteMode.leftB(ucp_str, s_len); } while (i > 0) { if (s_len === 1) { if (ucp_str === UtilDateJpn.GengoStr[i][0] || ucp_str === UtilDateJpn.GengoStr[i][1]) { break; } } else { if (s_len > 1) { /** @type {?} */ var text = UtilStrByteMode.leftB(UtilDateJpn.GengoStr[i][2], s_len); if (ucp_str === text) { break; } } } i = i - 1; } } /** @type {?} */ var result; if (i > 0) { result = UtilDateJpn.StartDayOfGengo[i][0]; } else { /** @type {?} */ var text = ucp_str.substr(0, 1); if (text === " " || text === "?") { result = 1; } else { result = 0; } } return result; }; /// <summary> /// Get the name of an era in date string /// </summary> /// <param name = "strDate:">string of input strDate /// </param> /// <param name = "strPicture:">string of picture /// </param> /// <param name = "intStartPos:">start position to search /// </param> /// <returns> name of an era /// </returns> /// <summary> /// Get the name of an era in date string /// </summary> /// <param name = "strDate:">string of input strDate /// </param> /// <param name = "strPicture:">string of picture /// </param> /// <param name = "intStartPos:">start position to search /// </param> /// <returns> name of an era /// </returns> /** * @param {?} strDate * @param {?} strPicture * @param {?} intStartPos * @return {?} */ UtilDateJpn.getEraNameStrInDate = /// <summary> /// Get the name of an era in date string /// </summary> /// <param name = "strDate:">string of input strDate /// </param> /// <param name = "strPicture:">string of picture /// </param> /// <param name = "intStartPos:">start position to search /// </param> /// <returns> name of an era /// </returns> /** * @param {?} strDate * @param {?} strPicture * @param {?} intStartPos * @return {?} */ function (strDate, strPicture, intStartPos) { /** @type {?} */ var result = null; /** @type {?} */ var intPicIdxOfs = 0; /** @type {?} */ var i = intStartPos; while (i + intPicIdxOfs < strPicture.length) { /** @type {?} */ var intLetters = void 0; if (strPicture.charCodeAt(i + intPicIdxOfs) === PICInterface.PIC_JY1) { intLetters = 1; } else { if (strPicture.charCodeAt(i + intPicIdxOfs) === PICInterface.PIC_JY2) { intLetters = 1; } else { if (strPicture.charCodeAt(i + intPicIdxOfs) === PICInterface.PIC_JY4) { intLetters = 2; } else { // If "strDate" contains DBCS, the position of "strPicture" has to skip next index. if (i < strDate.length) { if (!UtilStrByteMode.isHalfWidth(strDate[i]) && UtilStrByteMode.isHalfWidth(strPicture[i + intPicIdxOfs])) { intPicIdxOfs = intPicIdxOfs + 1; } } i = i + 1; continue; } } } result = strDate.substr(i, intLetters); break; // exit loop } return result; }; /// <summary> /// Get the length of the name of an era in picture /// </summary> /// <param name = "strPicture">string of picture /// </param> /// <param name = "intStartPos">start position to search /// </param> /// <returns> length of the name (the number of bytes) /// </returns> /// <summary> /// Get the length of the name of an era in picture /// </summary> /// <param name = "strPicture">string of picture /// </param> /// <param name = "intStartPos">start position to search /// </param> /// <returns> length of the name (the number of bytes) /// </returns> /** * @param {?} strPicture * @param {?} intStartPos * @return {?} */ UtilDateJpn.getEraNameLenInPicture = /// <summary> /// Get the length of the name of an era in picture /// </summary> /// <param name = "strPicture">string of picture /// </param> /// <param name = "intStartPos">start position to search /// </param> /// <returns> length of the name (the number of bytes) /// </returns> /** * @param {?} strPicture * @param {?} intStartPos * @return {?} */ function (strPicture, intStartPos) { /** @type {?} */ var intLetters = 0; for (var i = intStartPos; i < strPicture.length; i = i + 1) { if (strPicture.charCodeAt(i) === PICInterface.PIC_JY1) { intLetters = 1; } else { if (strPicture.charCodeAt(i) === PICInterface.PIC_JY2) { intLetters = 2; } else { if (strPicture.charCodeAt(i) === PICInterface.PIC_JY4) { intLetters = 4; } } } if (intLetters > 0) { break; } } return intLetters; }; /// <summary> /// Get the start year of an era in picture /// </summary> /// <param name = "strDate:">string of input strDate /// </param> /// <param name = "strPicture:">string of picture /// </param> /// <returns> start year of the era /// </returns> /// <summary> /// Get the start year of an era in picture /// </summary> /// <param name = "strDate:">string of input strDate /// </param> /// <param name = "strPicture:">string of picture /// </param> /// <returns> start year of the era /// </returns> /** * @param {?} strDate * @param {?} strPicture * @return {?} */ UtilDateJpn.prototype.getStartYearOfEra = /// <summary> /// Get the start year of an era in picture /// </summary> /// <param name = "strDate:">string of input strDate /// </param> /// <param name = "strPicture:">string of picture /// </param> /// <returns> start year of the era /// </returns> /** * @param {?} strDate * @param {?} strPicture * @return {?} */ function (strDate, strPicture) { /** @type {?} */ var eraNameStrInDate = UtilDateJpn.getEraNameStrInDate(strDate, strPicture, 0); /** @type {?} */ var result; if (eraNameStrInDate === null) { result = 0; } else { /** @type {?} */ var eraNameLenInPicture = UtilDateJpn.getEraNameLenInPicture(strPicture, 0); if (eraNameLenInPicture === 0) { result = 0; } else { /** @type {?} */ var intStartYearOfEra = this.date_jpn_yr_4_a(eraNameStrInDate, eraNameLenInPicture); result = intStartYearOfEra; } } return result; }; /// <summary> Add extra Gengo data into the Gengo tables</summary> /// <param name="strExtraGengo:"> /// </param> /// <returns> /// </returns> /// <summary> Add extra Gengo data into the Gengo tables</summary> /// <param name="strExtraGengo:"> /// </param> /// <returns> /// </returns> /** * @param {?} strExtraGengo * @return {?} */ UtilDateJpn.prototype.addExtraGengo = /// <summary> Add extra Gengo data into the Gengo tables</summary> /// <param name="strExtraGengo:"> /// </param> /// <returns> /// </returns> /** * @param {?} strExtraGengo * @return {?} */ function (strExtraGengo) { // e.g. strExtraGengo = "2012/04/01,092,AaABCD;2013/04/01,091,WwWXYZ;" /** @type {?} */ var array = strExtraGengo.split(';'); for (var i = 0; i <= array.length; i = i + 1) { if (array[i].length > 0) { /** @type {?} */ var array2 = array[i].split(','); if (array2.length === 2 && array2[0].length > 0 && array2[1].length > 0 && array2[2].length > 0) { /** @type {?} */ var array3 = array2[0].split('/'); if (array3.length === 2 && array3[0].length > 0 && array3[1].length > 0 && array3[2].length > 0) { UtilDateJpn.GengoStr[5 + i][0] = array2[2].substr(0, 1); // symbol name (upper case): A UtilDateJpn.GengoStr[5 + i][1] = array2[2].substr(1, 1); // symbol name (lower case): a UtilDateJpn.GengoStr[5 + i][2] = array2[2].substr(2); // gengo name: ABCD UtilDateJpn.StartDayOfGengo[5 + i][0] = NNumber.Parse(array3[0]); // start year: 2012 UtilDateJpn.StartDayOfGengo[5 + i][1] = NNumber.Parse(array3[1]); // start month: 4 UtilDateJpn.StartDayOfGengo[5 + i][2] = NNumber.Parse(array3[2]); // start day: 1 UtilDateJpn.StartDayOfGengo[5 + i][3] = NNumber.Parse(array2[1]); // days since January 1: 92 this.MaxGengo = this.MaxGengo + 1; } } } } }; UtilDateJpn._instance = null; UtilDateJpn.JweekStr = [ " ", "日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日" ]; UtilDateJpn.JmonthStr = [ "", " 1月", " 2月", " 3月", " 4月", " 5月", " 6月", " 7月", " 8月", " 9月", "10月", "11月", "12月" ]; UtilDateJpn.GengoStr = [ [ "?", "?", "????" ], [ "M", "m", "明治" ], [ "T", "t", "大正" ], [ "S", "s", "昭和" ], [ "H", "h", "平成" ], [ "?", "?", "??" ], [ "?", "?", "??" ], [ "?", "?", "??" ] ]; UtilDateJpn.StartDayOfGengo = [ [ 1, 1, 1, 1 ], [ 1868, 9, 8, 252 ], [ 1912, 6, 30, 212 ], [ 1926, 12, 25, 359 ], [ 1989, 1, 8, 8 ], new Array(4), new Array(4), new Array(4) ]; return UtilDateJpn; }()); export { UtilDateJpn }; if (false) { /** @type {?} */ UtilDateJpn._instance; /** @type {?} */ UtilDateJpn.JweekStr; /** @type {?} */ UtilDateJpn.JmonthStr; /** @type {?} */ UtilDateJpn.GengoStr; /** @type {?} */ UtilDateJpn.StartDayOfGengo; /** @type {?} */ UtilDateJpn.prototype.MaxGengo; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXRpbERhdGVKcG4uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbWFnaWMteHBhL3V0aWxzLyIsInNvdXJjZXMiOlsic3JjL1V0aWxEYXRlSnBuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBVSxPQUFPLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQzs7SUFFaEQsU0FBUyxHQUFXLENBQUM7O0lBQ3JCLG1CQUFtQixHQUFXLENBQUM7O0lBQy9CLG1CQUFtQixHQUFXLENBQUM7O0lBQy9CLFNBQVMsR0FBVyxDQUFDOztJQUNyQixRQUFRLEdBQVcsQ0FBQzs7SUFDcEIsU0FBUyxHQUFXLENBQUM7O0lBQ3JCLE9BQU8sR0FBVyxDQUFDOztJQUNuQixPQUFPLEdBQVcsQ0FBQztBQUd6QjtJQUFBO1FBQ0UsYUFBYTtRQUNiLHdDQUF3QztRQUN4QyxxQ0FBcUM7UUFDckMsY0FBYztRQUNkLHFDQUFxQztRQUNyQyxhQUFhO1FBMkNiLDJFQUEyRTtRQUNuRSxhQUFRLEdBQVcsU0FBUyxDQUFDO0lBd1J2QyxDQUFDOzs7O0lBdFJRLHVCQUFXOzs7SUFBbEI7UUFDRSxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDbkMsV0FBVyxDQUFDLFNBQVMsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQzVDLENBQUM7UUFDRCxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQztJQUMvQixDQUFDOzs7O0lBRU0sdUJBQVc7OztJQUFsQjtRQUNFLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDO0lBQzlCLENBQUM7Ozs7O0lBRU0scUJBQVM7Ozs7SUFBaEIsVUFBaUIsTUFBYzs7WUFDekIsSUFBSSxHQUFZLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU07UUFDNUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNULE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDYixDQUFDO1FBQ0QsTUFBTSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEMsQ0FBQzs7Ozs7SUFFTSwyQkFBZTs7OztJQUF0QixVQUF1QixLQUFhOztZQUM5QixJQUFJLEdBQVksS0FBSyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsS0FBSztRQUMzQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ1QsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNaLENBQUM7UUFDRCxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsYUFBYTtJQUNiLHdEQUF3RDtJQUN4RCxrRUFBa0U7SUFDbEUscUNBQXFDO0lBQ3JDLGNBQWM7SUFDZCx3Q0FBd0M7SUFDeEMsWUFBWTtJQUNaLCtCQUErQjtJQUMvQixZQUFZO0lBQ1osNkJBQTZCO0lBQzdCLCtDQUErQztJQUMvQyxjQUFjOzs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFDZCx1Q0FBaUI7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUFqQixVQUFrQixPQUFlLEVBQUUsTUFBYzs7WUFDM0MsTUFBYztRQUNsQixFQUFFLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlCLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDYixDQUFDO1FBQ0QsSUFBSSxDQUFDLENBQUM7O2dCQUNBLEdBQUcsR0FBVyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUM7WUFDbkMsT0FBTyxPQUFPLEdBQUcsV0FBVyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNyRCxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNoQixDQUFDO1lBQ0QsRUFBRSxDQUFDLENBQUMsT0FBTyxLQUFLLFdBQVcsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxHQUFHLFdBQVcsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNoQixDQUFDO1lBQ0QsTUFBTSxHQUFHLE9BQU8sR0FBRyxXQUFXLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsYUFBYTtJQUNiLHlEQUF5RDtJQUN6RCxnRUFBZ0U7SUFDaEUscUNBQXFDO0lBQ3JDLGNBQWM7SUFDZCx3Q0FBd0M7SUFDeEMsWUFBWTtJQUNaLCtCQUErQjtJQUMvQixZQUFZO0lBQ1osbUZBQW1GO0lBQ25GLFlBQVk7SUFDWiw0QkFBNEI7SUFDNUIsaURBQWlEO0lBQ2pELGNBQWM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUNkLHFDQUFlOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFBZixVQUFnQixPQUFlLEVBQUUsTUFBYyxFQUFFLE9BQWdCOztZQUMzRCxHQUFXO1FBQ2YsRUFBRSxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QixHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsQ0FBQztRQUNELElBQUksQ0FBQyxDQUFDO1lBQ0osR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBQ3hCLE9BQU8sT0FBTyxHQUFHLFdBQVcsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDckQsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDaEIsQ0FBQztZQUNELEVBQUUsQ0FBQyxDQUFDLE9BQU8sS0FBSyxXQUFXLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sR0FBRyxXQUFXLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDaEIsQ0FBQztRQUNILENBQUM7O1lBQ0csTUFBYztRQUNsQixFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ1osTUFBTSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUNELElBQUksQ0FBQyxDQUFDO1lBQ0osTUFBTSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUNELE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELGFBQWE7SUFDYiwyREFBMkQ7SUFDM0QsZ0VBQWdFO0lBQ2hFLHFDQUFxQztJQUNyQyxjQUFjO0lBQ2QsNkRBQTZEO0lBQzdELFlBQVk7SUFDWixrRUFBa0U7SUFDbEUsWUFBWTtJQUNaLHlCQUF5QjtJQUN6QixjQUFjOzs7Ozs7Ozs7Ozs7Ozs7OztJQUNOLHFDQUFlOzs7Ozs7Ozs7Ozs7Ozs7OztJQUF2QixVQUF3QixPQUFlLEVBQUUsS0FBYTs7WUFDaEQsQ0FBQyxHQUFXLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQztRQUNqQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNkLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNkLE9BQU8sR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNsRCxDQUFDO1lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2IsRUFBRSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2hCLEVBQUUsQ0FBQyxDQUFDLE9BQU8sS0FBSyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sS0FBSyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDckYsS0FBSyxDQUFDO29CQUNSLENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCxJQUFJLENBQUMsQ0FBQztvQkFDSixFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7NEJBQ1YsSUFBSSxHQUFXLGVBQWUsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUM7d0JBQzNFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDOzRCQUNyQixLQUFLLENBQUM7d0JBQ1IsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDWixDQUFDO1FBQ0gsQ0FBQzs7WUFDRyxNQUFjO1FBQ2xCLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ1YsTUFBTSxHQUFHLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUNELElBQUksQ0FBQyxDQUFDOztnQkFDRSxJQUFJLEdBQVcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3pDLEVBQUUsQ0FBQyxDQUFDLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDYixDQUFDO1lBQ0QsSUFBSSxDQUFDLENBQUM7Z0JBQ0osTUFBTSxHQUFHLENBQUMsQ0FBQztZQUNiLENBQUM7UUFDSCxDQUFDO1FBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsYUFBYTtJQUNiLDJDQUEyQztJQUMzQyxjQUFjO0lBQ2Qsb0RBQW9EO0lBQ3BELFlBQVk7SUFDWixpREFBaUQ7SUFDakQsWUFBWTtJQUNaLHlEQUF5RDtJQUN6RCxZQUFZO0lBQ1osNEJBQTRCO0lBQzVCLGNBQWM7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUNDLCtCQUFtQjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBQWxDLFVBQW1DLE9BQWUsRUFBRSxVQUFrQixFQUFFLFdBQW1COztZQUNyRixNQUFNLEdBQVcsSUFBSTs7WUFDckIsWUFBWSxHQUFXLENBQUM7O1lBQ3hCLENBQUMsR0FBVyxXQUFXO1FBQzNCLE9BQU8sQ0FBQyxHQUFHLFlBQVksR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7O2dCQUN4QyxVQUFVLFNBQVE7WUFDdEIsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLEtBQUssWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ3JFLFVBQVUsR0FBRyxDQUFDLENBQUM7WUFDakIsQ0FBQztZQUNELElBQUksQ0FBQyxDQUFDO2dCQUNKLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxLQUFLLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO29CQUNyRSxVQUFVLEdBQUcsQ0FBQyxDQUFDO2dCQUNqQixDQUFDO2dCQUNELElBQUksQ0FBQyxDQUFDO29CQUNKLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxLQUFLLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO3dCQUNyRSxVQUFVLEdBQUcsQ0FBQyxDQUFDO29CQUNqQixDQUFDO29CQUFDLElBQUksQ0FBQyxDQUFDO3dCQUNOLG1GQUFtRjt3QkFDbkYsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDOzRCQUN2QixFQUFFLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksZUFBZSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUMxRyxZQUFZLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQzs0QkFDbEMsQ0FBQzt3QkFDSCxDQUFDO3dCQUNELENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUNWLFFBQVEsQ0FBQztvQkFDWCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBQ0QsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3ZDLEtBQUssQ0FBQyxDQUFDLFlBQVk7UUFDckIsQ0FBQztRQUNELE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELGFBQWE7SUFDYixxREFBcUQ7SUFDckQsY0FBYztJQUNkLGdEQUFnRDtJQUNoRCxZQUFZO0lBQ1osd0RBQXdEO0lBQ3hELFlBQVk7SUFDWixzREFBc0Q7SUFDdEQsY0FBYzs7Ozs7Ozs7Ozs7Ozs7O0lBQ0Msa0NBQXNCOzs7Ozs7Ozs7Ozs7Ozs7SUFBckMsVUFBc0MsVUFBa0IsRUFBRSxXQUFtQjs7WUFDdkUsVUFBVSxHQUFXLENBQUM7UUFDMUIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQVcsV0FBVyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbkUsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDdEQsVUFBVSxHQUFHLENBQUMsQ0FBQztZQUNqQixDQUFDO1lBQ0QsSUFBSSxDQUFDLENBQUM7Z0JBQ0osRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztvQkFDdEQsVUFBVSxHQUFHLENBQUMsQ0FBQztnQkFDakIsQ0FBQztnQkFDRCxJQUFJLENBQUMsQ0FBQztvQkFDSixFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO3dCQUN0RCxVQUFVLEdBQUcsQ0FBQyxDQUFDO29CQUNqQixDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBQ0QsRUFBRSxDQUFDLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25CLEtBQUssQ0FBQztZQUNSLENBQUM7UUFDSCxDQUFDO1FBQ0QsTUFBTSxDQUFDLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQsYUFBYTtJQUNiLDZDQUE2QztJQUM3QyxjQUFjO0lBQ2Qsb0RBQW9EO0lBQ3BELFlBQVk7SUFDWixpREFBaUQ7SUFDakQsWUFBWTtJQUNaLG1DQUFtQztJQUNuQyxjQUFjOzs7Ozs7Ozs7Ozs7Ozs7SUFDZCx1Q0FBaUI7Ozs7Ozs7Ozs7Ozs7OztJQUFqQixVQUFrQixPQUFlLEVBQUUsVUFBa0I7O1lBQy9DLGdCQUFnQixHQUFXLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQzs7WUFDbEYsTUFBYztRQUNsQixFQUFFLENBQUMsQ0FBQyxnQkFBZ0IsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzlCLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDYixDQUFDO1FBQ0QsSUFBSSxDQUFDLENBQUM7O2dCQUNBLG1CQUFtQixHQUFXLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBQ25GLEVBQUUsQ0FBQyxDQUFDLG1CQUFtQixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzlCLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDYixDQUFDO1lBQ0QsSUFBSSxDQUFDLENBQUM7O29CQUNBLGlCQUFpQixHQUFXLElBQUksQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLEVBQUUsbUJBQW1CLENBQUM7Z0JBQzNGLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQztZQUM3QixDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELGtFQUFrRTtJQUNsRSxpQ0FBaUM7SUFDakMsWUFBWTtJQUNaLGFBQWE7SUFDYixjQUFjOzs7Ozs7Ozs7O0lBQ2QsbUNBQWE7Ozs7Ozs7Ozs7SUFBYixVQUFjLGFBQXFCOzs7WUFFN0IsS0FBSyxHQUFhLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1FBQzlDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JELEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7b0JBQ3BCLE1BQU0sR0FBYSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztnQkFDMUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzt3QkFDNUYsTUFBTSxHQUFhLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO29CQUMzQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ2hHLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsOEJBQThCO3dCQUN2RixXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLDhCQUE4Qjt3QkFDdkYsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFJLG1CQUFtQjt3QkFFNUUsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFJLG1CQUFtQjt3QkFDeEYsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFJLGlCQUFpQjt3QkFDdEYsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFJLGVBQWU7d0JBQ3BGLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBSSwyQkFBMkI7d0JBQ2hHLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7b0JBQ3BDLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQWpVYyxxQkFBUyxHQUFnQixJQUFJLENBQUM7SUFFOUIsb0JBQVEsR0FBYTtRQUNsQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSztLQUN2RCxDQUFDO0lBQ2EscUJBQVMsR0FBYTtRQUNuQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLO0tBQ3ZGLENBQUM7SUFDYSxvQkFBUSxHQUFlO1FBQ3BDO1lBQ0UsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNO1NBQ2pCLEVBQUU7WUFDRCxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUk7U0FDZixFQUFFO1lBQ0QsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJO1NBQ2YsRUFBRTtZQUNELEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSTtTQUNmLEVBQUU7WUFDRCxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUk7U0FDZixFQUFFO1lBQ0QsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJO1NBQ2YsRUFBRTtZQUNELEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSTtTQUNmLEVBQUU7WUFDRCxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUk7U0FDZjtLQUNGLENBQUM7SUFDYSwyQkFBZSxHQUFlO1FBQzNDO1lBQ0UsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztTQUNYLEVBQUU7WUFDRCxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHO1NBQ2hCLEVBQUU7WUFDRCxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHO1NBQ2pCLEVBQUU7WUFDRCxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHO1NBQ2xCLEVBQUU7WUFDRCxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1NBQ2QsRUFBRSxJQUFJLEtBQUssQ0FBUyxDQUFDLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBUyxDQUFDLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBUyxDQUFDLENBQUM7S0FDcEUsQ0FBQztJQTJSSixrQkFBQztDQUFBLEFBMVVELElBMFVDO1NBMVVZLFdBQVc7OztJQVF0QixzQkFBNkM7O0lBRTdDLHFCQUVFOztJQUNGLHNCQUVFOztJQUNGLHFCQWtCRTs7SUFDRiw0QkFZRTs7SUFHRiwrQkFBcUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1BJQ0ludGVyZmFjZX0gZnJvbSBcIi4vUElDSW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7VXRpbFN0ckJ5dGVNb2RlfSBmcm9tIFwiLi9VdGlsU3RyQnl0ZU1vZGVcIjtcclxuaW1wb3J0IHtOU3RyaW5nLCBOTnVtYmVyfSBmcm9tIFwiQG1hZ2ljLXhwYS9tc2NvcmVsaWJcIjtcclxuXHJcbmNvbnN0IE1BWF9HRU5HTzogbnVtYmVyID0gNTtcclxuY29uc3QgSURYX1VQUEVSQ0FTRV9BTFBIQTogbnVtYmVyID0gMDtcclxuY29uc3QgSURYX0xPV0VSQ0FTRV9BTFBIQTogbnVtYmVyID0gMTtcclxuY29uc3QgSURYX0tBTkpJOiBudW1iZXIgPSAyO1xyXG5jb25zdCBJRFhfWUVBUjogbnVtYmVyID0gMDtcclxuY29uc3QgSURYX01PTlRIOiBudW1iZXIgPSAxO1xyXG5jb25zdCBJRFhfREFZOiBudW1iZXIgPSAyO1xyXG5jb25zdCBJRFhfRE9ZOiBudW1iZXIgPSAzO1xyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBVdGlsRGF0ZUpwbiB7XHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAvLy8gICBVdGlsaXR5IENsYXNzIGZvciBKYXBhbmVzZSBkYXRlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPGF1dGhvcj4gIFRvc2hpcm8gTmFrYXlvc2hpIChNU0opXHJcbiAgLy8vIDwvYXV0aG9yPlxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IFV0aWxEYXRlSnBuID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgSndlZWtTdHI6IHN0cmluZ1tdID0gW1xyXG4gICAgXCIgICBcIiwgXCLml6Xmm5zml6VcIiwgXCLmnIjmm5zml6VcIiwgXCLngavmm5zml6VcIiwgXCLmsLTmm5zml6VcIiwgXCLmnKjmm5zml6VcIiwgXCLph5Hmm5zml6VcIiwgXCLlnJ/mm5zml6VcIlxyXG4gIF07XHJcbiAgcHJpdmF0ZSBzdGF0aWMgSm1vbnRoU3RyOiBzdHJpbmdbXSA9IFtcclxuICAgIFwiXCIsIFwiIDHmnIhcIiwgXCIgMuaciFwiLCBcIiAz5pyIXCIsIFwiIDTmnIhcIiwgXCIgNeaciFwiLCBcIiA25pyIXCIsIFwiIDfmnIhcIiwgXCIgOOaciFwiLCBcIiA55pyIXCIsIFwiMTDmnIhcIiwgXCIxMeaciFwiLCBcIjEy5pyIXCJcclxuICBdO1xyXG4gIHByaXZhdGUgc3RhdGljIEdlbmdvU3RyOiBzdHJpbmdbXVtdID0gW1xyXG4gICAgW1xyXG4gICAgICBcIj9cIiwgXCI/XCIsIFwiPz8/P1wiXHJcbiAgICBdLCBbXHJcbiAgICAgIFwiTVwiLCBcIm1cIiwgXCLmmI7msrtcIlxyXG4gICAgXSwgW1xyXG4gICAgICBcIlRcIiwgXCJ0XCIsIFwi5aSn5q2jXCJcclxuICAgIF0sIFtcclxuICAgICAgXCJTXCIsIFwic1wiLCBcIuaYreWSjFwiXHJcbiAgICBdLCBbXHJcbiAgICAgIFwiSFwiLCBcImhcIiwgXCLlubPmiJBcIlxyXG4gICAgXSwgW1xyXG4gICAgICBcIj9cIiwgXCI/XCIsIFwi77yf77yfXCJcclxuICAgIF0sIFtcclxuICAgICAgXCI/XCIsIFwiP1wiLCBcIu+8n++8n1wiXHJcbiAgICBdLCBbXHJcbiAgICAgIFwiP1wiLCBcIj9cIiwgXCLvvJ/vvJ9cIlxyXG4gICAgXVxyXG4gIF07XHJcbiAgcHJpdmF0ZSBzdGF0aWMgU3RhcnREYXlPZkdlbmdvOiBudW1iZXJbXVtdID0gW1xyXG4gICAgW1xyXG4gICAgICAxLCAxLCAxLCAxXHJcbiAgICBdLCBbXHJcbiAgICAgIDE4NjgsIDksIDgsIDI1MlxyXG4gICAgXSwgW1xyXG4gICAgICAxOTEyLCA2LCAzMCwgMjEyXHJcbiAgICBdLCBbXHJcbiAgICAgIDE5MjYsIDEyLCAyNSwgMzU5XHJcbiAgICBdLCBbXHJcbiAgICAgIDE5ODksIDEsIDgsIDhcclxuICAgIF0sIG5ldyBBcnJheTxudW1iZXI+KDQpLCBuZXcgQXJyYXk8bnVtYmVyPig0KSwgbmV3IEFycmF5PG51bWJlcj4oNClcclxuICBdO1xyXG5cclxuICAvLyAtLS0tIGdlbmdvICh0aGUgbmFtZSBvZiBhbiBlcmEpICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICBwcml2YXRlIE1heEdlbmdvOiBudW1iZXIgPSBNQVhfR0VOR087XHJcblxyXG4gIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBVdGlsRGF0ZUpwbiB7XHJcbiAgICBpZiAoVXRpbERhdGVKcG4uX2luc3RhbmNlID09PSBudWxsKSB7XHJcbiAgICAgIFV0aWxEYXRlSnBuLl9pbnN0YW5jZSA9IG5ldyBVdGlsRGF0ZUpwbigpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFV0aWxEYXRlSnBuLl9pbnN0YW5jZTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXRBcnJheURvdygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gVXRpbERhdGVKcG4uSndlZWtTdHI7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0U3RyRG93KGludElkeDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBmbGFnOiBib29sZWFuID0gaW50SWR4IDwgMCB8fCA3IDwgaW50SWR4O1xyXG4gICAgaWYgKGZsYWcpIHtcclxuICAgICAgaW50SWR4ID0gMDtcclxuICAgIH1cclxuICAgIHJldHVybiBVdGlsRGF0ZUpwbi5Kd2Vla1N0cltpbnRJZHhdO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNvbnZlcnRTdHJNb250aChtb250aDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBmbGFnOiBib29sZWFuID0gbW9udGggPCAwIHx8IDEyIDwgbW9udGg7XHJcbiAgICBpZiAoZmxhZykge1xyXG4gICAgICBtb250aCA9IDA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVXRpbERhdGVKcG4uSm1vbnRoU3RyW21vbnRoXTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDb252ZXJ0IGEgeWVhciAoQS5ELikgaW50byBKYXBhbmVzZSB5ZWFyIG9mIGFuIGVyYVxyXG4gIC8vLyAgIFRoaXMgbWV0aG9kIGlzIG1vZGVsZWQgYWZ0ZXIgXCJkYXRlX2pwbl95ZWFyX29mc1wiIGZ1bmN0aW9uIGluXHJcbiAgLy8vICAgXCJcXG1nbG9jYWxcXGpwblxcanBuZGF0ZV9qcG4uY3BwXCIuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImludFllYXI6XCI+eWVhciAoQS5ELilcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImludERveTpcIj5ET1lcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHllYXIgb2YgYW4gZXJhLlxyXG4gIC8vLyAgIGlmIGVpdGhlciBwYXJhbSBpcyBpbnZhbGlkLCBpdCByZXR1cm5zIDAuXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBkYXRlX2pwbl95ZWFyX29mcyhpbnRZZWFyOiBudW1iZXIsIGludERveTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCByZXN1bHQ6IG51bWJlcjtcclxuICAgIGlmIChpbnRZZWFyIDwgMSB8fCBpbnREb3kgPCAxKSB7XHJcbiAgICAgIHJlc3VsdCA9IDA7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IG51bTogbnVtYmVyID0gdGhpcy5NYXhHZW5nbyAtIDE7XHJcbiAgICAgIHdoaWxlIChpbnRZZWFyIDwgVXRpbERhdGVKcG4uU3RhcnREYXlPZkdlbmdvW251bV1bMF0pIHtcclxuICAgICAgICBudW0gPSBudW0gLSAxO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChpbnRZZWFyID09PSBVdGlsRGF0ZUpwbi5TdGFydERheU9mR2VuZ29bbnVtXVswXSAmJiBpbnREb3kgPCBVdGlsRGF0ZUpwbi5TdGFydERheU9mR2VuZ29bbnVtXVszXSkge1xyXG4gICAgICAgIG51bSA9IG51bSAtIDE7XHJcbiAgICAgIH1cclxuICAgICAgcmVzdWx0ID0gaW50WWVhciAtIFV0aWxEYXRlSnBuLlN0YXJ0RGF5T2ZHZW5nb1tudW1dWzBdICsgMTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ29udmVydCBhIHllYXIgKEEuRC4pIGludG8gYSBuYW1lIG9mIGEgSmFwYW5lc2UgZXJhXHJcbiAgLy8vICAgVGhpcyBtZXRob2QgaXMgbW9kZWxlZCBhZnRlciBcImRhdGVfanBuX3lyXzJfYVwiIGZ1bmN0aW9uIGluXHJcbiAgLy8vICAgXCJcXG1nbG9jYWxcXGpwblxcanBuZGF0ZV9qcG4uY3BwXCIuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImludFllYXI6XCI+eWVhciAoQS5ELilcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImludERveTpcIj5ET1lcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzS2Fuamk6XCI+cmV0dXJuIGEgZnVsbCBuYW1lICh0cnVlKSBvciB0aGUgZmlyc3QgbGV0dGVyIChmYWxzZSkuXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBuYW1lIG9mIGFuIGVyYVxyXG4gIC8vLyAgIGlmIGVpdGhlciBwYXJhbSBpcyBpbnZhbGlkLCBpdCByZXR1cm5zIFwiP1wiLlxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgZGF0ZV9qcG5feXJfMl9hKGludFllYXI6IG51bWJlciwgaW50RG95OiBudW1iZXIsIGlzS2Fuamk6IGJvb2xlYW4pOiBzdHJpbmcge1xyXG4gICAgbGV0IG51bTogbnVtYmVyO1xyXG4gICAgaWYgKGludFllYXIgPCAxIHx8IGludERveSA8IDEpIHtcclxuICAgICAgbnVtID0gMDtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBudW0gPSB0aGlzLk1heEdlbmdvIC0gMTtcclxuICAgICAgd2hpbGUgKGludFllYXIgPCBVdGlsRGF0ZUpwbi5TdGFydERheU9mR2VuZ29bbnVtXVswXSkge1xyXG4gICAgICAgIG51bSA9IG51bSAtIDE7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGludFllYXIgPT09IFV0aWxEYXRlSnBuLlN0YXJ0RGF5T2ZHZW5nb1tudW1dWzBdICYmIGludERveSA8IFV0aWxEYXRlSnBuLlN0YXJ0RGF5T2ZHZW5nb1tudW1dWzNdKSB7XHJcbiAgICAgICAgbnVtID0gbnVtIC0gMTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nO1xyXG4gICAgaWYgKGlzS2FuamkpIHtcclxuICAgICAgcmVzdWx0ID0gVXRpbERhdGVKcG4uR2VuZ29TdHJbbnVtXVsyXTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXN1bHQgPSBVdGlsRGF0ZUpwbi5HZW5nb1N0cltudW1dWzBdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXQgdGhlIGZpcnN0IHllYXIgKEEuRC4pIG9mIGEgc3BlY2lmaWVkIEphcGFuZXNlIGVyYVxyXG4gIC8vLyAgIFRoaXMgbWV0aG9kIGlzIG1vZGVsZWQgYWZ0ZXIgXCJkYXRlX2pwbl95cl80X2FcIiBmdW5jdGlvbiBpblxyXG4gIC8vLyAgIFwiXFxtZ2xvY2FsXFxqcG5cXGpwbmRhdGVfanBuLmNwcFwiLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ1Y3Bfc3RyOlwiPm5hbWUgb2YgYSBzcGVjaWZpZWQgSmFwYW5lc2UgZXJhXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzX2xlbjpcIj5sZW5ndGggKHRoZSBudW1iZXIgb2YgYnl0ZXMpIG9mIHVjcF9zdHJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHllYXIgKEEuRC4pXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGRhdGVfanBuX3lyXzRfYSh1Y3Bfc3RyOiBzdHJpbmcsIHNfbGVuOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IGk6IG51bWJlciA9IHRoaXMuTWF4R2VuZ28gLSAxO1xyXG4gICAgaWYgKHNfbGVuID4gMCkge1xyXG4gICAgICBpZiAoc19sZW4gPiAxKSB7XHJcbiAgICAgICAgdWNwX3N0ciA9IFV0aWxTdHJCeXRlTW9kZS5sZWZ0Qih1Y3Bfc3RyLCBzX2xlbik7XHJcbiAgICAgIH1cclxuICAgICAgd2hpbGUgKGkgPiAwKSB7XHJcbiAgICAgICAgaWYgKHNfbGVuID09PSAxKSB7XHJcbiAgICAgICAgICBpZiAodWNwX3N0ciA9PT0gVXRpbERhdGVKcG4uR2VuZ29TdHJbaV1bMF0gfHwgdWNwX3N0ciA9PT0gVXRpbERhdGVKcG4uR2VuZ29TdHJbaV1bMV0pIHtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgaWYgKHNfbGVuID4gMSkge1xyXG4gICAgICAgICAgICBsZXQgdGV4dDogc3RyaW5nID0gVXRpbFN0ckJ5dGVNb2RlLmxlZnRCKFV0aWxEYXRlSnBuLkdlbmdvU3RyW2ldWzJdLCBzX2xlbik7XHJcbiAgICAgICAgICAgIGlmICh1Y3Bfc3RyID09PSB0ZXh0KSB7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaSA9IGkgLSAxO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgcmVzdWx0OiBudW1iZXI7XHJcbiAgICBpZiAoaSA+IDApIHtcclxuICAgICAgcmVzdWx0ID0gVXRpbERhdGVKcG4uU3RhcnREYXlPZkdlbmdvW2ldWzBdO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRleHQ6IHN0cmluZyA9IHVjcF9zdHIuc3Vic3RyKDAsIDEpO1xyXG4gICAgICBpZiAodGV4dCA9PT0gXCIgXCIgfHwgdGV4dCA9PT0gXCI/XCIpIHtcclxuICAgICAgICByZXN1bHQgPSAxO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHJlc3VsdCA9IDA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR2V0IHRoZSBuYW1lIG9mIGFuIGVyYSBpbiBkYXRlIHN0cmluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdHJEYXRlOlwiPnN0cmluZyBvZiBpbnB1dCBzdHJEYXRlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdHJQaWN0dXJlOlwiPnN0cmluZyBvZiBwaWN0dXJlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpbnRTdGFydFBvczpcIj5zdGFydCBwb3NpdGlvbiB0byBzZWFyY2hcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IG5hbWUgb2YgYW4gZXJhXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIHN0YXRpYyBnZXRFcmFOYW1lU3RySW5EYXRlKHN0ckRhdGU6IHN0cmluZywgc3RyUGljdHVyZTogc3RyaW5nLCBpbnRTdGFydFBvczogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCByZXN1bHQ6IHN0cmluZyA9IG51bGw7XHJcbiAgICBsZXQgaW50UGljSWR4T2ZzOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGk6IG51bWJlciA9IGludFN0YXJ0UG9zO1xyXG4gICAgd2hpbGUgKGkgKyBpbnRQaWNJZHhPZnMgPCBzdHJQaWN0dXJlLmxlbmd0aCkge1xyXG4gICAgICBsZXQgaW50TGV0dGVyczogbnVtYmVyO1xyXG4gICAgICBpZiAoc3RyUGljdHVyZS5jaGFyQ29kZUF0KGkgKyBpbnRQaWNJZHhPZnMpID09PSBQSUNJbnRlcmZhY2UuUElDX0pZMSkge1xyXG4gICAgICAgIGludExldHRlcnMgPSAxO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChzdHJQaWN0dXJlLmNoYXJDb2RlQXQoaSArIGludFBpY0lkeE9mcykgPT09IFBJQ0ludGVyZmFjZS5QSUNfSlkyKSB7XHJcbiAgICAgICAgICBpbnRMZXR0ZXJzID0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBpZiAoc3RyUGljdHVyZS5jaGFyQ29kZUF0KGkgKyBpbnRQaWNJZHhPZnMpID09PSBQSUNJbnRlcmZhY2UuUElDX0pZNCkge1xyXG4gICAgICAgICAgICBpbnRMZXR0ZXJzID0gMjtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIElmIFwic3RyRGF0ZVwiIGNvbnRhaW5zIERCQ1MsIHRoZSBwb3NpdGlvbiBvZiBcInN0clBpY3R1cmVcIiBoYXMgdG8gc2tpcCBuZXh0IGluZGV4LlxyXG4gICAgICAgICAgICBpZiAoaSA8IHN0ckRhdGUubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgaWYgKCFVdGlsU3RyQnl0ZU1vZGUuaXNIYWxmV2lkdGgoc3RyRGF0ZVtpXSkgJiYgVXRpbFN0ckJ5dGVNb2RlLmlzSGFsZldpZHRoKHN0clBpY3R1cmVbaSArIGludFBpY0lkeE9mc10pKSB7XHJcbiAgICAgICAgICAgICAgICBpbnRQaWNJZHhPZnMgPSBpbnRQaWNJZHhPZnMgKyAxO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpID0gaSArIDE7XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXN1bHQgPSBzdHJEYXRlLnN1YnN0cihpLCBpbnRMZXR0ZXJzKTtcclxuICAgICAgYnJlYWs7IC8vIGV4aXQgbG9vcFxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgbmFtZSBvZiBhbiBlcmEgaW4gcGljdHVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdHJQaWN0dXJlXCI+c3RyaW5nIG9mIHBpY3R1cmVcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImludFN0YXJ0UG9zXCI+c3RhcnQgcG9zaXRpb24gdG8gc2VhcmNoXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBsZW5ndGggb2YgdGhlIG5hbWUgKHRoZSBudW1iZXIgb2YgYnl0ZXMpXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIHN0YXRpYyBnZXRFcmFOYW1lTGVuSW5QaWN0dXJlKHN0clBpY3R1cmU6IHN0cmluZywgaW50U3RhcnRQb3M6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgaW50TGV0dGVyczogbnVtYmVyID0gMDtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IGludFN0YXJ0UG9zOyBpIDwgc3RyUGljdHVyZS5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICBpZiAoc3RyUGljdHVyZS5jaGFyQ29kZUF0KGkpID09PSBQSUNJbnRlcmZhY2UuUElDX0pZMSkge1xyXG4gICAgICAgIGludExldHRlcnMgPSAxO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChzdHJQaWN0dXJlLmNoYXJDb2RlQXQoaSkgPT09IFBJQ0ludGVyZmFjZS5QSUNfSlkyKSB7XHJcbiAgICAgICAgICBpbnRMZXR0ZXJzID0gMjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBpZiAoc3RyUGljdHVyZS5jaGFyQ29kZUF0KGkpID09PSBQSUNJbnRlcmZhY2UuUElDX0pZNCkge1xyXG4gICAgICAgICAgICBpbnRMZXR0ZXJzID0gNDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGludExldHRlcnMgPiAwKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBpbnRMZXR0ZXJzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEdldCB0aGUgc3RhcnQgeWVhciBvZiBhbiBlcmEgaW4gcGljdHVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdHJEYXRlOlwiPnN0cmluZyBvZiBpbnB1dCBzdHJEYXRlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdHJQaWN0dXJlOlwiPnN0cmluZyBvZiBwaWN0dXJlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBzdGFydCB5ZWFyIG9mIHRoZSBlcmFcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGdldFN0YXJ0WWVhck9mRXJhKHN0ckRhdGU6IHN0cmluZywgc3RyUGljdHVyZTogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGxldCBlcmFOYW1lU3RySW5EYXRlOiBzdHJpbmcgPSBVdGlsRGF0ZUpwbi5nZXRFcmFOYW1lU3RySW5EYXRlKHN0ckRhdGUsIHN0clBpY3R1cmUsIDApO1xyXG4gICAgbGV0IHJlc3VsdDogbnVtYmVyO1xyXG4gICAgaWYgKGVyYU5hbWVTdHJJbkRhdGUgPT09IG51bGwpIHtcclxuICAgICAgcmVzdWx0ID0gMDtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBsZXQgZXJhTmFtZUxlbkluUGljdHVyZTogbnVtYmVyID0gVXRpbERhdGVKcG4uZ2V0RXJhTmFtZUxlbkluUGljdHVyZShzdHJQaWN0dXJlLCAwKTtcclxuICAgICAgaWYgKGVyYU5hbWVMZW5JblBpY3R1cmUgPT09IDApIHtcclxuICAgICAgICByZXN1bHQgPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGxldCBpbnRTdGFydFllYXJPZkVyYTogbnVtYmVyID0gdGhpcy5kYXRlX2pwbl95cl80X2EoZXJhTmFtZVN0ckluRGF0ZSwgZXJhTmFtZUxlbkluUGljdHVyZSk7XHJcbiAgICAgICAgcmVzdWx0ID0gaW50U3RhcnRZZWFyT2ZFcmE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IEFkZCBleHRyYSBHZW5nbyBkYXRhIGludG8gdGhlIEdlbmdvIHRhYmxlczwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdHJFeHRyYUdlbmdvOlwiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5cclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGFkZEV4dHJhR2VuZ28oc3RyRXh0cmFHZW5nbzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAvLyBlLmcuIHN0ckV4dHJhR2VuZ28gPSBcIjIwMTIvMDQvMDEsMDkyLEFhQUJDRDsyMDEzLzA0LzAxLDA5MSxXd1dYWVo7XCJcclxuICAgIGxldCBhcnJheTogc3RyaW5nW10gPSBzdHJFeHRyYUdlbmdvLnNwbGl0KCc7Jyk7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDw9IGFycmF5Lmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGlmIChhcnJheVtpXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbGV0IGFycmF5Mjogc3RyaW5nW10gPSBhcnJheVtpXS5zcGxpdCgnLCcpO1xyXG4gICAgICAgIGlmIChhcnJheTIubGVuZ3RoID09PSAyICYmIGFycmF5MlswXS5sZW5ndGggPiAwICYmIGFycmF5MlsxXS5sZW5ndGggPiAwICYmIGFycmF5MlsyXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBsZXQgYXJyYXkzOiBzdHJpbmdbXSA9IGFycmF5MlswXS5zcGxpdCgnLycpO1xyXG4gICAgICAgICAgaWYgKGFycmF5My5sZW5ndGggPT09IDIgJiYgYXJyYXkzWzBdLmxlbmd0aCA+IDAgJiYgYXJyYXkzWzFdLmxlbmd0aCA+IDAgJiYgYXJyYXkzWzJdLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgVXRpbERhdGVKcG4uR2VuZ29TdHJbNSArIGldWzBdID0gYXJyYXkyWzJdLnN1YnN0cigwLCAxKTsgLy8gc3ltYm9sIG5hbWUgKHVwcGVyIGNhc2UpOiBBXHJcbiAgICAgICAgICAgIFV0aWxEYXRlSnBuLkdlbmdvU3RyWzUgKyBpXVsxXSA9IGFycmF5MlsyXS5zdWJzdHIoMSwgMSk7IC8vIHN5bWJvbCBuYW1lIChsb3dlciBjYXNlKTogYVxyXG4gICAgICAgICAgICBVdGlsRGF0ZUpwbi5HZW5nb1N0cls1ICsgaV1bMl0gPSBhcnJheTJbMl0uc3Vic3RyKDIpOyAgICAvLyBnZW5nbyBuYW1lOiBBQkNEXHJcblxyXG4gICAgICAgICAgICBVdGlsRGF0ZUpwbi5TdGFydERheU9mR2VuZ29bNSArIGldWzBdID0gTk51bWJlci5QYXJzZShhcnJheTNbMF0pOyAgICAvLyBzdGFydCB5ZWFyOiAyMDEyXHJcbiAgICAgICAgICAgIFV0aWxEYXRlSnBuLlN0YXJ0RGF5T2ZHZW5nb1s1ICsgaV1bMV0gPSBOTnVtYmVyLlBhcnNlKGFycmF5M1sxXSk7ICAgIC8vIHN0YXJ0IG1vbnRoOiA0XHJcbiAgICAgICAgICAgIFV0aWxEYXRlSnBuLlN0YXJ0RGF5T2ZHZW5nb1s1ICsgaV1bMl0gPSBOTnVtYmVyLlBhcnNlKGFycmF5M1syXSk7ICAgIC8vIHN0YXJ0IGRheTogMVxyXG4gICAgICAgICAgICBVdGlsRGF0ZUpwbi5TdGFydERheU9mR2VuZ29bNSArIGldWzNdID0gTk51bWJlci5QYXJzZShhcnJheTJbMV0pOyAgICAvLyBkYXlzIHNpbmNlIEphbnVhcnkgMTogOTJcclxuICAgICAgICAgICAgdGhpcy5N