@magic-xpa/utils 4.1200.0-dev4120.21 → 4.1200.0-dev4120.212
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/magic-xpa-utils.mjs +1222 -72
- package/fesm2022/magic-xpa-utils.mjs.map +1 -1
- package/index.d.ts +3 -0
- package/package.json +2 -4
- package/src/MsgInterface.d.ts +5 -0
- package/src/StrUtil.d.ts +1 -0
- package/src/XMLConstants.d.ts +2 -0
- package/esm2022/index.mjs +0 -27
- package/esm2022/magic-xpa-utils.mjs +0 -2
- package/esm2022/src/Base64.mjs +0 -164
- package/esm2022/src/ChoiceUtils.mjs +0 -79
- package/esm2022/src/Constants.mjs +0 -74
- package/esm2022/src/DateTimeUtils.mjs +0 -54
- package/esm2022/src/DateUtil.mjs +0 -58
- package/esm2022/src/InternalInterface.mjs +0 -341
- package/esm2022/src/JSON_Utils.mjs +0 -7
- package/esm2022/src/Logger.mjs +0 -216
- package/esm2022/src/MagicConstants.mjs +0 -12
- package/esm2022/src/Misc.mjs +0 -98
- package/esm2022/src/MsgInterface.mjs +0 -192
- package/esm2022/src/PICInterface.mjs +0 -60
- package/esm2022/src/PlatformUtils.mjs +0 -11
- package/esm2022/src/Queue.mjs +0 -28
- package/esm2022/src/Randomizer.mjs +0 -34
- package/esm2022/src/RequestInfo.mjs +0 -28
- package/esm2022/src/Rtf.mjs +0 -614
- package/esm2022/src/StorageAttribute.mjs +0 -84
- package/esm2022/src/StrUtil.mjs +0 -453
- package/esm2022/src/SyncExecutionHelper.mjs +0 -21
- package/esm2022/src/UtilDateJpn.mjs +0 -232
- package/esm2022/src/UtilImeJpn.mjs +0 -13
- package/esm2022/src/UtilStrByteMode.mjs +0 -300
- package/esm2022/src/XMLConstants.mjs +0 -169
- package/esm2022/src/Xml/XmlParser.mjs +0 -247
- package/esm2022/src/enums.mjs +0 -1763
|
@@ -1,247 +0,0 @@
|
|
|
1
|
-
import { NString, List, ApplicationException, StringBuilder, NChar, NNumber } from "@magic-xpa/mscorelib";
|
|
2
|
-
import { XMLConstants } from "../XMLConstants";
|
|
3
|
-
export class XmlParser {
|
|
4
|
-
static endOfNameChar = [' ', '>'];
|
|
5
|
-
_currIndex = 0;
|
|
6
|
-
_xmLdata = "";
|
|
7
|
-
_history = new List();
|
|
8
|
-
constructor(data = NString.Empty) {
|
|
9
|
-
this.setXMLdata(data);
|
|
10
|
-
this.setCurrIndex(0);
|
|
11
|
-
}
|
|
12
|
-
static getTokens(str, delimiter, isMagicXML = true) {
|
|
13
|
-
let tokensVec = new List();
|
|
14
|
-
let token = null;
|
|
15
|
-
if (isMagicXML) {
|
|
16
|
-
str = str.trim();
|
|
17
|
-
}
|
|
18
|
-
let strTok = str.split(delimiter.charAt(0));
|
|
19
|
-
for (let i = 0; i < strTok.length; i = i + 1) {
|
|
20
|
-
if (isMagicXML && i === strTok.length - 1 && strTok.length % 2 === 1) {
|
|
21
|
-
break;
|
|
22
|
-
}
|
|
23
|
-
token = strTok[i];
|
|
24
|
-
if (isMagicXML) {
|
|
25
|
-
if (i % 2 === 0) {
|
|
26
|
-
token = token.trim();
|
|
27
|
-
if (token.endsWith("=")) {
|
|
28
|
-
token = token.substr(0, token.length - 1);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
else if (token === "")
|
|
32
|
-
token = " ";
|
|
33
|
-
}
|
|
34
|
-
if (token === null)
|
|
35
|
-
throw new ApplicationException("in ClientManager.Instance.XMLParser.getTokens() null token value");
|
|
36
|
-
tokensVec.push(token);
|
|
37
|
-
}
|
|
38
|
-
return tokensVec;
|
|
39
|
-
}
|
|
40
|
-
static unescape(str) {
|
|
41
|
-
let unescapedString = new StringBuilder(str.length);
|
|
42
|
-
for (let i = 0; i < str.length; i++) {
|
|
43
|
-
if (str[i] !== '\\') {
|
|
44
|
-
unescapedString.Append(str[i]);
|
|
45
|
-
continue;
|
|
46
|
-
}
|
|
47
|
-
switch (str[++i]) {
|
|
48
|
-
case 'q':
|
|
49
|
-
unescapedString.Append('\"');
|
|
50
|
-
break;
|
|
51
|
-
case 'o':
|
|
52
|
-
unescapedString.Append('\'');
|
|
53
|
-
break;
|
|
54
|
-
case 'l':
|
|
55
|
-
unescapedString.Append('<');
|
|
56
|
-
break;
|
|
57
|
-
case 'g':
|
|
58
|
-
unescapedString.Append('>');
|
|
59
|
-
break;
|
|
60
|
-
case 'e':
|
|
61
|
-
unescapedString.Append('=');
|
|
62
|
-
break;
|
|
63
|
-
case 'r':
|
|
64
|
-
unescapedString.Append('\r');
|
|
65
|
-
break;
|
|
66
|
-
case 'n':
|
|
67
|
-
unescapedString.Append('\n');
|
|
68
|
-
break;
|
|
69
|
-
default:
|
|
70
|
-
unescapedString.Append(str[i]);
|
|
71
|
-
break;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
return (unescapedString.ToString());
|
|
75
|
-
}
|
|
76
|
-
static escape(str) {
|
|
77
|
-
let escapedString = new StringBuilder(str.length * 2);
|
|
78
|
-
for (let i = 0; i < str.length; i++) {
|
|
79
|
-
switch (str[i]) {
|
|
80
|
-
case '\\':
|
|
81
|
-
escapedString.Append("\\\\");
|
|
82
|
-
break;
|
|
83
|
-
case '"':
|
|
84
|
-
escapedString.Append("\\q");
|
|
85
|
-
break;
|
|
86
|
-
case '\'':
|
|
87
|
-
escapedString.Append("\\o");
|
|
88
|
-
break;
|
|
89
|
-
case '<':
|
|
90
|
-
escapedString.Append("\\l");
|
|
91
|
-
break;
|
|
92
|
-
case '>':
|
|
93
|
-
escapedString.Append("\\g");
|
|
94
|
-
break;
|
|
95
|
-
case '=':
|
|
96
|
-
escapedString.Append("\\e");
|
|
97
|
-
break;
|
|
98
|
-
case '\r':
|
|
99
|
-
escapedString.Append("\r");
|
|
100
|
-
break;
|
|
101
|
-
case '\n':
|
|
102
|
-
escapedString.Append("\n");
|
|
103
|
-
break;
|
|
104
|
-
default:
|
|
105
|
-
escapedString.Append(str[i]);
|
|
106
|
-
break;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
return (escapedString.ToString());
|
|
110
|
-
}
|
|
111
|
-
static escapeUrl(str) {
|
|
112
|
-
return NString.Replace(str, "&", "&");
|
|
113
|
-
}
|
|
114
|
-
getNextTag() {
|
|
115
|
-
if (this._xmLdata.length - this._currIndex <= 1) {
|
|
116
|
-
return null;
|
|
117
|
-
}
|
|
118
|
-
for (let tmpIndx = this._currIndex + 1; tmpIndx < this._xmLdata.length; tmpIndx++) {
|
|
119
|
-
let tmpChar = this._xmLdata[tmpIndx];
|
|
120
|
-
if (NChar.IsLetter(tmpChar) || tmpChar === '/') {
|
|
121
|
-
let endOfTag = NString.IndexOfAny(this._xmLdata, XmlParser.endOfNameChar, tmpIndx, this._xmLdata.length - tmpIndx);
|
|
122
|
-
if (endOfTag === -1)
|
|
123
|
-
return null;
|
|
124
|
-
else
|
|
125
|
-
return this._xmLdata.substr(tmpIndx, endOfTag - tmpIndx);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
return null;
|
|
129
|
-
}
|
|
130
|
-
getXMLsubstring(endContext) {
|
|
131
|
-
return this._xmLdata.substr(this._currIndex, endContext - this._currIndex);
|
|
132
|
-
}
|
|
133
|
-
GetCurrentElementValue() {
|
|
134
|
-
this.setCurrIndex2EndOfTag();
|
|
135
|
-
let endContext = this.getXMLdata().indexOf(XMLConstants.TAG_OPEN, this.getCurrIndex());
|
|
136
|
-
let value = this.getXMLsubstring(endContext);
|
|
137
|
-
this.setCurrIndex2EndOfTag();
|
|
138
|
-
return value;
|
|
139
|
-
}
|
|
140
|
-
setCurrIndex2EndOfTag() {
|
|
141
|
-
this._currIndex = this._xmLdata.indexOf(XMLConstants.TAG_CLOSE, this._currIndex) + 1;
|
|
142
|
-
}
|
|
143
|
-
static getInt(valueStr) {
|
|
144
|
-
return NNumber.Parse(valueStr.trim());
|
|
145
|
-
}
|
|
146
|
-
static getBoolean(valueStr) {
|
|
147
|
-
return valueStr[0] === '1';
|
|
148
|
-
}
|
|
149
|
-
getCurrIndex() {
|
|
150
|
-
return this._currIndex;
|
|
151
|
-
}
|
|
152
|
-
getXMLdata() {
|
|
153
|
-
return this._xmLdata;
|
|
154
|
-
}
|
|
155
|
-
add2CurrIndex(add) {
|
|
156
|
-
this._currIndex = this._currIndex + add;
|
|
157
|
-
}
|
|
158
|
-
setCurrIndex(index) {
|
|
159
|
-
this._currIndex = index;
|
|
160
|
-
}
|
|
161
|
-
setXMLdata(data) {
|
|
162
|
-
if (data !== null)
|
|
163
|
-
this._xmLdata = data.trim();
|
|
164
|
-
else {
|
|
165
|
-
this._xmLdata = null;
|
|
166
|
-
this.setCurrIndex(0);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
PrepareFormReadString(newXmlString) {
|
|
170
|
-
this.setXMLdata(newXmlString);
|
|
171
|
-
this.setCurrIndex(0);
|
|
172
|
-
}
|
|
173
|
-
push() {
|
|
174
|
-
this._history.push(this._currIndex);
|
|
175
|
-
this._history.push(this._xmLdata);
|
|
176
|
-
}
|
|
177
|
-
pop() {
|
|
178
|
-
let count = this._history.length;
|
|
179
|
-
this._xmLdata = this._history.get_Item(count - 1);
|
|
180
|
-
this._currIndex = this._history.get_Item(count - 2);
|
|
181
|
-
this._history.SetSize(count - 2);
|
|
182
|
-
}
|
|
183
|
-
loadTableCacheData(data) {
|
|
184
|
-
this.setXMLdata(data);
|
|
185
|
-
this.setCurrIndex(0);
|
|
186
|
-
}
|
|
187
|
-
ReadToEndOfCurrentElement() {
|
|
188
|
-
let currentTag = this.getNextTag();
|
|
189
|
-
let currentTagIndex = this._xmLdata.indexOf(XMLConstants.TAG_OPEN + currentTag, this.getCurrIndex());
|
|
190
|
-
let nextOpenTagIndex = this._xmLdata.indexOf(XMLConstants.TAG_OPEN, currentTagIndex + 1);
|
|
191
|
-
if (nextOpenTagIndex === -1)
|
|
192
|
-
nextOpenTagIndex = this._xmLdata.length;
|
|
193
|
-
let elementEndIndex = NString.IndexOf(this._xmLdata, XMLConstants.TAG_TERM, this.getCurrIndex(), nextOpenTagIndex - this.getCurrIndex());
|
|
194
|
-
if (elementEndIndex === -1)
|
|
195
|
-
elementEndIndex = this._xmLdata.indexOf("/" + currentTag, this.getCurrIndex()) + currentTag.length + XMLConstants.TAG_TERM.length;
|
|
196
|
-
else
|
|
197
|
-
elementEndIndex = elementEndIndex + XMLConstants.TAG_TERM.length;
|
|
198
|
-
let elementBlock = this.getXMLsubstring(elementEndIndex);
|
|
199
|
-
this.setCurrIndex(elementEndIndex);
|
|
200
|
-
return elementBlock;
|
|
201
|
-
}
|
|
202
|
-
ReadContentOfCurrentElement() {
|
|
203
|
-
let currentTag = this.getNextTag();
|
|
204
|
-
let elementEndIndex = this._xmLdata.indexOf("</" + currentTag + ">", this.getCurrIndex());
|
|
205
|
-
if (elementEndIndex === -1)
|
|
206
|
-
return NString.Empty;
|
|
207
|
-
this.setCurrIndex2EndOfTag();
|
|
208
|
-
let elementBlock = this.getXMLsubstring(elementEndIndex);
|
|
209
|
-
this.setCurrIndex(elementEndIndex);
|
|
210
|
-
this.setCurrIndex2EndOfTag();
|
|
211
|
-
return elementBlock;
|
|
212
|
-
}
|
|
213
|
-
toString(headCharCount, tailCharCount) {
|
|
214
|
-
if (arguments.length === 0) {
|
|
215
|
-
return this.ToString_0();
|
|
216
|
-
}
|
|
217
|
-
return this.ToString_1(headCharCount, tailCharCount);
|
|
218
|
-
}
|
|
219
|
-
ToString_0() {
|
|
220
|
-
return this.toString(20, 50);
|
|
221
|
-
}
|
|
222
|
-
ToString_1(headCharCount, tailCharCount) {
|
|
223
|
-
let markerPosition = Math.min(this._currIndex, this._xmLdata.length);
|
|
224
|
-
let segmentStartIndex = Math.max(0, markerPosition - headCharCount);
|
|
225
|
-
let segmentEndIndex = Math.min(this._xmLdata.length, markerPosition + tailCharCount);
|
|
226
|
-
let headLength = markerPosition - segmentStartIndex;
|
|
227
|
-
let tailLength = segmentEndIndex - markerPosition;
|
|
228
|
-
let segment = new StringBuilder();
|
|
229
|
-
if (segmentStartIndex > 0)
|
|
230
|
-
segment.Append("...");
|
|
231
|
-
if (headLength > 0)
|
|
232
|
-
segment.Append(this._xmLdata, segmentStartIndex, headLength);
|
|
233
|
-
segment.Append("|-{").Append(this._currIndex).Append("}-|");
|
|
234
|
-
if (tailLength > 0)
|
|
235
|
-
segment.Append(this._xmLdata, this._currIndex, tailLength);
|
|
236
|
-
if (segmentEndIndex < this._xmLdata.length)
|
|
237
|
-
segment.Append("...");
|
|
238
|
-
return segment.ToString();
|
|
239
|
-
}
|
|
240
|
-
SkipXMLElement() {
|
|
241
|
-
let endContext = this.getXMLdata().indexOf(XMLConstants.TAG_TERM, this.getCurrIndex());
|
|
242
|
-
if (endContext !== -1 && endContext < this.getXMLdata().length) {
|
|
243
|
-
this.setCurrIndex2EndOfTag();
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWG1sUGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdXRpbHMvc3JjL1htbC9YbWxQYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFHN0MsTUFBTSxPQUFPLFNBQVM7SUFDWixNQUFNLENBQUMsYUFBYSxHQUFhLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBRTVDLFVBQVUsR0FBVyxDQUFDLENBQUM7SUFDdkIsUUFBUSxHQUFXLEVBQUUsQ0FBQztJQUN0QixRQUFRLEdBQTBCLElBQUksSUFBSSxFQUFFLENBQUM7SUFNckQsWUFBWSxPQUFlLE9BQU8sQ0FBQyxLQUFLO1FBQ3RDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBT0QsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFXLEVBQUUsU0FBaUIsRUFBRSxhQUFzQixJQUFJO1FBQ3pFLElBQUksU0FBUyxHQUFpQixJQUFJLElBQUksRUFBVSxDQUFDO1FBQ2pELElBQUksS0FBSyxHQUFXLElBQUksQ0FBQztRQUV6QixJQUFJLFVBQVUsRUFBRTtZQUNkLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDbEI7UUFFRCxJQUFJLE1BQU0sR0FBYSxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV0RCxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUlwRCxJQUFJLFVBQVUsSUFBSSxDQUFDLEtBQUssTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNwRSxNQUFNO2FBQ1A7WUFFRCxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xCLElBQUksVUFBVSxFQUFFO2dCQUVkLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ2YsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDckIsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO3dCQUN2QixLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztxQkFDM0M7aUJBQ0Y7cUJBRUksSUFBSSxLQUFLLEtBQUssRUFBRTtvQkFDbkIsS0FBSyxHQUFHLEdBQUcsQ0FBQzthQUNmO1lBRUQsSUFBSSxLQUFLLEtBQUssSUFBSTtnQkFDaEIsTUFBTSxJQUFJLG9CQUFvQixDQUFDLGtFQUFrRSxDQUFDLENBQUM7WUFFckcsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN2QjtRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFPTSxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQVc7UUFFaEMsSUFBSSxlQUFlLEdBQWtCLElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVuRSxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMzQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQ25CLGVBQWUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQy9CLFNBQVM7YUFDVjtZQUVELFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2hCLEtBQUssR0FBRztvQkFDTixlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM3QixNQUFNO2dCQUNSLEtBQUssR0FBRztvQkFDTixlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM3QixNQUFNO2dCQUNSLEtBQUssR0FBRztvQkFDTixlQUFlLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUM1QixNQUFNO2dCQUNSLEtBQUssR0FBRztvQkFDTixlQUFlLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUM1QixNQUFNO2dCQUNSLEtBQUssR0FBRztvQkFDTixlQUFlLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUM1QixNQUFNO2dCQUNSLEtBQUssR0FBRztvQkFDTixlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM3QixNQUFNO2dCQUNSLEtBQUssR0FBRztvQkFDTixlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM3QixNQUFNO2dCQUNSO29CQUNFLGVBQWUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQy9CLE1BQU07YUFDVDtTQUNGO1FBQ0QsT0FBTyxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFPTSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQVc7UUFFOUIsSUFBSSxhQUFhLEdBQWtCLElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFckUsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDM0MsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2QsS0FBSyxJQUFJO29CQUNQLGFBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQzdCLE1BQU07Z0JBQ1IsS0FBSyxHQUFHO29CQUNOLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzVCLE1BQU07Z0JBQ1IsS0FBSyxJQUFJO29CQUNQLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzVCLE1BQU07Z0JBQ1IsS0FBSyxHQUFHO29CQUNOLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzVCLE1BQU07Z0JBQ1IsS0FBSyxHQUFHO29CQUNOLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzVCLE1BQU07Z0JBQ1IsS0FBSyxHQUFHO29CQUNOLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzVCLE1BQU07Z0JBQ1IsS0FBSyxJQUFJO29CQUNQLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzNCLE1BQU07Z0JBQ1IsS0FBSyxJQUFJO29CQUNQLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzNCLE1BQU07Z0JBQ1I7b0JBQ0UsYUFBYSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDN0IsTUFBTTthQUNUO1NBQ0Y7UUFFRCxPQUFPLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQU9ELE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBVztRQUMxQixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBSUQsVUFBVTtRQUNSLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLEVBQUU7WUFDL0MsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELEtBQUssSUFBSSxPQUFPLEdBQVcsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLEVBQUUsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQ3pGLElBQUksT0FBTyxHQUFXLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFHN0MsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE9BQU8sS0FBSyxHQUFHLEVBQUU7Z0JBQzlDLElBQUksUUFBUSxHQUFXLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQztnQkFFM0gsSUFBSSxRQUFRLEtBQUssQ0FBQyxDQUFDO29CQUNqQixPQUFPLElBQUksQ0FBQzs7b0JBRVosT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDO2FBQzVEO1NBQ0Y7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFJRCxlQUFlLENBQUMsVUFBa0I7UUFDaEMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUlELHNCQUFzQjtRQUNwQixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM3QixJQUFJLFVBQVUsR0FBVyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7UUFFL0YsSUFBSSxLQUFLLEdBQVcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM3QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFHRCxxQkFBcUI7UUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUdELE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBZ0I7UUFDNUIsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFHRCxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQWdCO1FBQ2hDLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQztJQUM3QixDQUFDO0lBR0QsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRUQsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsYUFBYSxDQUFDLEdBQVc7UUFDdkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQztJQUMxQyxDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQWE7UUFDeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDMUIsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFZO1FBQ3JCLElBQUksSUFBSSxLQUFLLElBQUk7WUFDZixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUN6QjtZQUNILElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdEI7SUFDSCxDQUFDO0lBTUQscUJBQXFCLENBQUMsWUFBb0I7UUFDeEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFHRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBR0QsR0FBRztRQUNELElBQUksS0FBSyxHQUFXLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBRXpDLElBQUksQ0FBQyxRQUFRLEdBQVcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxVQUFVLEdBQVcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRTVELElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBR0Qsa0JBQWtCLENBQUMsSUFBWTtRQUM3QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQWlCRCx5QkFBeUI7UUFFdkIsSUFBSSxVQUFVLEdBQVcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzNDLElBQUksZUFBZSxHQUFXLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxRQUFRLEdBQUcsVUFBVSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBSTdHLElBQUksZ0JBQWdCLEdBQVcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxlQUFlLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDakcsSUFBSSxnQkFBZ0IsS0FBSyxDQUFDLENBQUM7WUFDekIsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFHMUMsSUFBSSxlQUFlLEdBQVcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLGdCQUFnQixHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ2pKLElBQUksZUFBZSxLQUFLLENBQUMsQ0FBQztZQUV4QixlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDOztZQUVsSSxlQUFlLEdBQUcsZUFBZSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBR25FLElBQUksWUFBWSxHQUFXLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLENBQUM7UUFHakUsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUVuQyxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRUQsMkJBQTJCO1FBRXpCLElBQUksVUFBVSxHQUFXLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUczQyxJQUFJLGVBQWUsR0FBVyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsVUFBVSxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUVsRyxJQUFJLGVBQWUsS0FBSyxDQUFDLENBQUM7WUFFeEIsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBR3ZCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBRzdCLElBQUksWUFBWSxHQUFXLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLENBQUM7UUFHakUsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUU3QixPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBZUQsUUFBUSxDQUFDLGFBQXNCLEVBQUUsYUFBc0I7UUFDckQsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUMxQixPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUMxQjtRQUNELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQVdPLFVBQVU7UUFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBYU8sVUFBVSxDQUFDLGFBQXFCLEVBQUUsYUFBcUI7UUFDN0QsSUFBSSxjQUFjLEdBQVcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0UsSUFBSSxpQkFBaUIsR0FBVyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxjQUFjLEdBQUcsYUFBYSxDQUFDLENBQUM7UUFDNUUsSUFBSSxlQUFlLEdBQVcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxjQUFjLEdBQUcsYUFBYSxDQUFDLENBQUM7UUFFN0YsSUFBSSxVQUFVLEdBQVcsY0FBYyxHQUFHLGlCQUFpQixDQUFDO1FBQzVELElBQUksVUFBVSxHQUFXLGVBQWUsR0FBRyxjQUFjLENBQUM7UUFFMUQsSUFBSSxPQUFPLEdBQWtCLElBQUksYUFBYSxFQUFFLENBQUM7UUFDakQsSUFBSSxpQkFBaUIsR0FBRyxDQUFDO1lBQ3ZCLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFeEIsSUFBSSxVQUFVLEdBQUcsQ0FBQztZQUNoQixPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFL0QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU1RCxJQUFJLFVBQVUsR0FBRyxDQUFDO1lBQ2hCLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRTdELElBQUksZUFBZSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTTtZQUN4QyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXhCLE9BQU8sT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxVQUFVLEdBQVcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQy9GLElBQUksVUFBVSxLQUFLLENBQUMsQ0FBQyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxFQUFFO1lBQzlELElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1NBQzlCO0lBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TlN0cmluZywgTGlzdCwgQXBwbGljYXRpb25FeGNlcHRpb24sIFN0cmluZ0J1aWxkZXIsIE5DaGFyLCBOTnVtYmVyfSBmcm9tIFwiQG1hZ2ljLXhwYS9tc2NvcmVsaWJcIjtcclxuaW1wb3J0IHtYTUxDb25zdGFudHN9IGZyb20gXCIuLi9YTUxDb25zdGFudHNcIjtcclxuXHJcbi8vLyA8c3VtbWFyeT4gYSBoZWxwZXIgY2xhc3MgZm9yIHRoZSBwYXJzaW5nIG9mIHRoZSBYTUw8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBYbWxQYXJzZXIge1xyXG4gIHByaXZhdGUgc3RhdGljIGVuZE9mTmFtZUNoYXI6IHN0cmluZ1tdID0gWycgJywgJz4nXTtcclxuXHJcbiAgcHJpdmF0ZSBfY3VyckluZGV4OiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgX3htTGRhdGE6IHN0cmluZyA9IFwiXCI7XHJcbiAgcHJpdmF0ZSBfaGlzdG9yeTogTGlzdDxudW1iZXIgfCBzdHJpbmc+ID0gbmV3IExpc3QoKTsgLy8gSW4gb3JkZXIgdG8gYWxsb3cgcmVjdXJzaXZlIHBhcnNpbmcgd2Ugc2F2ZSBwcmV2IGRhdGFcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGF0YVwiPjwvcGFyYW0+XHJcbiAgY29uc3RydWN0b3IoZGF0YTogc3RyaW5nID0gTlN0cmluZy5FbXB0eSkge1xyXG4gICAgdGhpcy5zZXRYTUxkYXRhKGRhdGEpO1xyXG4gICAgdGhpcy5zZXRDdXJySW5kZXgoMCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHBhcnNlIGEgc3RyaW5nIGFjY29yZGluZyB0byBhIHNldCBvZiBkZWxpbWl0ZXJzIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBpbiBhIHZlY3Rvcjwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdHJcIj50aGUgU3RyaW5nIHdoaWNoIG5lZWQgYmUgcGFydGVkIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGVsaW1pdGVyXCI+dGhlIGRlbGltaXRlciB3aGljaCBwYXJ0IGRpZmZlcmVudCBwYXJ0cyBvZiBzdHIgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc01hZ2ljWE1MXCI+aXMgbmVlZGVkIHRva2VuaXplciB3b3JraW5nIG9uIE1hZ2ljIFhNTCwgc28gdGhlIFwiPVwiIHNpZ24gd2lsbCBiZSBkZWxpdGVkIGluIHRoZSBlbmQgb2YgZXZlcnkgZmlyc3QgdG9rZW4gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRtcFZlY3RvciBkeW5hbWljYWxseSBhcnJheSwgd2hpY2ggY29uc2lzdCB0b2tlbnMgaW4gZXZlcnkgZWxlbWVudCwgZXZlcnkgdG9rZW4gaXMgU3RyaW5nIDwvcmV0dXJucz5cclxuICBzdGF0aWMgZ2V0VG9rZW5zKHN0cjogc3RyaW5nLCBkZWxpbWl0ZXI6IHN0cmluZywgaXNNYWdpY1hNTDogYm9vbGVhbiA9IHRydWUpOiBMaXN0PHN0cmluZz4ge1xyXG4gICAgbGV0IHRva2Vuc1ZlYzogTGlzdDxzdHJpbmc+ID0gbmV3IExpc3Q8c3RyaW5nPigpO1xyXG4gICAgbGV0IHRva2VuOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAgIGlmIChpc01hZ2ljWE1MKSB7XHJcbiAgICAgIHN0ciA9IHN0ci50cmltKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHN0clRvazogc3RyaW5nW10gPSBzdHIuc3BsaXQoZGVsaW1pdGVyLmNoYXJBdCgwKSk7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHN0clRvay5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAvLyBTcGxpdCBpbiBDIyBjcmVhdGVzIGEgbGFzdCBlbXB0eSBzdHJpbmcgdG9rZW4gaWYgdGhlIHNvdXJjZSBzdHJpbmcgZW5kcyB3aXRoXHJcbiAgICAgIC8vIHRoZSBkZWxpbWl0ZXIgb3IgaWYgdGhlIHN0cmluZyBpcyBlbXB0eSAoYXMgb3Bwb3NlZCB0byBKYXZhIHRoYXQgd2lsbCBpZ25vcmUgaXQpXHJcbiAgICAgIC8vIHRoZXJlZm9yZSB3ZSBoYXZlIHRvIGJyZWFrIHRoaXMgbG9vcCBpZiBzdWNoIGNhc2Ugb2NjdXJzLlxyXG4gICAgICBpZiAoaXNNYWdpY1hNTCAmJiBpID09PSBzdHJUb2subGVuZ3RoIC0gMSAmJiBzdHJUb2subGVuZ3RoICUgMiA9PT0gMSkge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0b2tlbiA9IHN0clRva1tpXTtcclxuICAgICAgaWYgKGlzTWFnaWNYTUwpIHtcclxuICAgICAgICAvLyB0aGUgMXN0IHRva2VuIGluIHRoZSBwYWlyIGNvbWVzIHdpdGggXCI9XCIsIHJlbW92ZSBpdC5cclxuICAgICAgICBpZiAoaSAlIDIgPT09IDApIHtcclxuICAgICAgICAgIHRva2VuID0gdG9rZW4udHJpbSgpO1xyXG4gICAgICAgICAgaWYgKHRva2VuLmVuZHNXaXRoKFwiPVwiKSkge1xyXG4gICAgICAgICAgICB0b2tlbiA9IHRva2VuLnN1YnN0cigwLCB0b2tlbi5sZW5ndGggLSAxKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gMm5kIHRva2VuIGluIHRoZSBwYWlyIGNhbiBiZSBhbiBlbXB0eSBzdHJpbmcsIGluIHRoYXQgY2FzZSBzZXQgaXQgdG8gXCIgXCIuXHJcbiAgICAgICAgZWxzZSBpZiAodG9rZW4gPT09IFwiXCIpXHJcbiAgICAgICAgICB0b2tlbiA9IFwiIFwiO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodG9rZW4gPT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gQ2xpZW50TWFuYWdlci5JbnN0YW5jZS5YTUxQYXJzZXIuZ2V0VG9rZW5zKCkgbnVsbCB0b2tlbiB2YWx1ZVwiKTtcclxuXHJcbiAgICAgIHRva2Vuc1ZlYy5wdXNoKHRva2VuKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdG9rZW5zVmVjO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PnVuc2NhcGUgZnJvbTpcclxuICAvLy8ge1wiJmFtcDtcIixcXFxcLCBcXHEsIFxcbywgXFxsLCBcXGcsIFxcZSwgXFxcXHIsIFxcXFxufSwgdG86XHJcbiAgLy8vIHtcIiZcIiwgICAgIFxcLCAgXCIsICAnLCAgPCwgID4sICA9LCAgXFxyLCAgXFxufVxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0clwiPlN0cmluZyB0byBiZSBjb252ZXJ0ZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz51bmVzY2FwZWQgc3RyaW5nPC9yZXR1cm5zPlxyXG4gIHB1YmxpYyBzdGF0aWMgdW5lc2NhcGUoc3RyOiBzdHJpbmcpOiBzdHJpbmdcclxuICB7XHJcbiAgICBsZXQgdW5lc2NhcGVkU3RyaW5nOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoc3RyLmxlbmd0aCk7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAoc3RyW2ldICE9PSAnXFxcXCcpIHtcclxuICAgICAgICB1bmVzY2FwZWRTdHJpbmcuQXBwZW5kKHN0cltpXSk7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHN3aXRjaCAoc3RyWysraV0pIHtcclxuICAgICAgICBjYXNlICdxJzpcclxuICAgICAgICAgIHVuZXNjYXBlZFN0cmluZy5BcHBlbmQoJ1xcXCInKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ28nOlxyXG4gICAgICAgICAgdW5lc2NhcGVkU3RyaW5nLkFwcGVuZCgnXFwnJyk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdsJzpcclxuICAgICAgICAgIHVuZXNjYXBlZFN0cmluZy5BcHBlbmQoJzwnKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ2cnOlxyXG4gICAgICAgICAgdW5lc2NhcGVkU3RyaW5nLkFwcGVuZCgnPicpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnZSc6XHJcbiAgICAgICAgICB1bmVzY2FwZWRTdHJpbmcuQXBwZW5kKCc9Jyk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdyJzpcclxuICAgICAgICAgIHVuZXNjYXBlZFN0cmluZy5BcHBlbmQoJ1xccicpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnbic6XHJcbiAgICAgICAgICB1bmVzY2FwZWRTdHJpbmcuQXBwZW5kKCdcXG4nKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICB1bmVzY2FwZWRTdHJpbmcuQXBwZW5kKHN0cltpXSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuICh1bmVzY2FwZWRTdHJpbmcuVG9TdHJpbmcoKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+ZXNjYXBlIGZyb206XHJcbiAgLy8vIHtcXCwgIFwiLCAgJywgIDwsICAgPiwgID0sICBcXHIsICBcXG59LCB0bzpcclxuICAvLy8ge1xcXFwsIFxccSwgXFwwLCBcXGwsICBcXGcsIFxcZSwgXFxcXHIsIFxcXFxufVxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0clwiPlN0cmluZyB0byBiZSBjb252ZXJ0ZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5lc2NhcGVkIHN0cmluZzwvcmV0dXJucz5cclxuICBwdWJsaWMgc3RhdGljIGVzY2FwZShzdHI6IHN0cmluZyk6IHN0cmluZ1xyXG4gIHtcclxuICAgIGxldCBlc2NhcGVkU3RyaW5nOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoc3RyLmxlbmd0aCAqIDIpO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgc3dpdGNoIChzdHJbaV0pIHtcclxuICAgICAgICBjYXNlICdcXFxcJzpcclxuICAgICAgICAgIGVzY2FwZWRTdHJpbmcuQXBwZW5kKFwiXFxcXFxcXFxcIik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdcIic6XHJcbiAgICAgICAgICBlc2NhcGVkU3RyaW5nLkFwcGVuZChcIlxcXFxxXCIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnXFwnJzpcclxuICAgICAgICAgIGVzY2FwZWRTdHJpbmcuQXBwZW5kKFwiXFxcXG9cIik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICc8JzpcclxuICAgICAgICAgIGVzY2FwZWRTdHJpbmcuQXBwZW5kKFwiXFxcXGxcIik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICc+JzpcclxuICAgICAgICAgIGVzY2FwZWRTdHJpbmcuQXBwZW5kKFwiXFxcXGdcIik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICc9JzpcclxuICAgICAgICAgIGVzY2FwZWRTdHJpbmcuQXBwZW5kKFwiXFxcXGVcIik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdcXHInOlxyXG4gICAgICAgICAgZXNjYXBlZFN0cmluZy5BcHBlbmQoXCJcXHJcIik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdcXG4nOlxyXG4gICAgICAgICAgZXNjYXBlZFN0cmluZy5BcHBlbmQoXCJcXG5cIik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgZXNjYXBlZFN0cmluZy5BcHBlbmQoc3RyW2ldKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIChlc2NhcGVkU3RyaW5nLlRvU3RyaW5nKCkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBoZXJlIHdlIG9ubHkgbmVlZCB0byB0YWtlIGNhcmUgb2YgXCImXCIgc28gdGhhdCBTYXggcGFyc2VyIHdpbGwgYmUgYWJsZSB0byBoYW5kbGUgdXJsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdHJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIGVzY2FwZVVybChzdHI6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gTlN0cmluZy5SZXBsYWNlKHN0ciwgXCImXCIsIFwiJmFtcDtcIik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Z2V0IG5leHQgdGFnIG5hbWUgZnJvbSBjdXJyZW50IGluZGV4IGluIFhNTCBzdHJpbmc8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBuZXh0IHRhZyBuYW1lIDwvcmV0dXJucz5cclxuICBnZXROZXh0VGFnKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5feG1MZGF0YS5sZW5ndGggLSB0aGlzLl9jdXJySW5kZXggPD0gMSkge1xyXG4gICAgICByZXR1cm4gbnVsbDsgIC8vIGVuZCBvZiBYTUwgc3RyaW5nXHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChsZXQgdG1wSW5keDogbnVtYmVyID0gdGhpcy5fY3VyckluZGV4ICsgMTsgdG1wSW5keCA8IHRoaXMuX3htTGRhdGEubGVuZ3RoOyB0bXBJbmR4KyspIHtcclxuICAgICAgbGV0IHRtcENoYXI6IHN0cmluZyA9IHRoaXMuX3htTGRhdGFbdG1wSW5keF07XHJcblxyXG4gICAgICAvLyBhIGxldHRlciBzdGFydHMgYW4gZWxlbWVudCBhbmQgZW5kcyB3aXRoIFwiIFwiLiBcIi9cIiBzdGFydHMgYW4gZWxlbWVudCBjbG9zaW5nIGFuZCBlbmRzIHdpdGggJz4nLlxyXG4gICAgICBpZiAoTkNoYXIuSXNMZXR0ZXIodG1wQ2hhcikgfHwgdG1wQ2hhciA9PT0gJy8nKSB7XHJcbiAgICAgICAgbGV0IGVuZE9mVGFnOiBudW1iZXIgPSBOU3RyaW5nLkluZGV4T2ZBbnkodGhpcy5feG1MZGF0YSwgWG1sUGFyc2VyLmVuZE9mTmFtZUNoYXIsIHRtcEluZHgsIHRoaXMuX3htTGRhdGEubGVuZ3RoIC0gdG1wSW5keCk7XHJcblxyXG4gICAgICAgIGlmIChlbmRPZlRhZyA9PT0gLTEpXHJcbiAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5feG1MZGF0YS5zdWJzdHIodG1wSW5keCwgZW5kT2ZUYWcgLSB0bXBJbmR4KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlN1YnN0cmluZyBvZiBYTUxzdHJpbmc8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBzdWJzdHJpbmcgb2YgWE1MIHN0cmluZyAtZnJvbSBjdXJySW5kZXggdG8gZW5kQ29udGV4dCA8L3JldHVybnM+XHJcbiAgZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQ6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5feG1MZGF0YS5zdWJzdHIodGhpcy5fY3VyckluZGV4LCBlbmRDb250ZXh0IC0gdGhpcy5fY3VyckluZGV4KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5nZXQgY3VycmVudCBlbGVtZW50IHZhbHVlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gZWxlbWVudCdzIHZhbHVlIDwvcmV0dXJucz5cclxuICBHZXRDdXJyZW50RWxlbWVudFZhbHVlKCk6IHN0cmluZyB7XHJcbiAgICB0aGlzLnNldEN1cnJJbmRleDJFbmRPZlRhZygpO1xyXG4gICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHRoaXMuZ2V0WE1MZGF0YSgpLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19PUEVOLCB0aGlzLmdldEN1cnJJbmRleCgpKTtcclxuICAgIC8vIHJlYWQgdmFsdWUgb2YgeG1sIGVsZW1lbnRcclxuICAgIGxldCB2YWx1ZTogc3RyaW5nID0gdGhpcy5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCk7XHJcbiAgICB0aGlzLnNldEN1cnJJbmRleDJFbmRPZlRhZygpO1xyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PnNldCBjdXJyZW50IGluZGV4IChvbiBwYXJzaW5nIHRpbWUpIHRvIHRoZSBlbmQgb2YgY3VycmVudCB0YWc8L3N1bW1hcnk+XHJcbiAgc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY3VyckluZGV4ID0gdGhpcy5feG1MZGF0YS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UsIHRoaXMuX2N1cnJJbmRleCkgKyAxO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmdldCBpbnQgZnJvbSBzdHJpbmcgYXQgcGFyc2luZyB0aW1lPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBnZXRJbnQodmFsdWVTdHI6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gTk51bWJlci5QYXJzZSh2YWx1ZVN0ci50cmltKCkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmdldCBib29sZWFuIGZyb20gc3RyaW5nIGF0IHBhcnNpbmcgdGltZTwvc3VtbWFyeT5cclxuICBzdGF0aWMgZ2V0Qm9vbGVhbih2YWx1ZVN0cjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdmFsdWVTdHJbMF0gPT09ICcxJztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5nZXQvc2V0IGZ1bmN0aW9ucyA0IFhNTHN0cmluZyAmIGN1cnJJbmRleCwgZm9yIHBhcnNlcjwvc3VtbWFyeT5cclxuICBnZXRDdXJySW5kZXgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJySW5kZXg7XHJcbiAgfVxyXG5cclxuICBnZXRYTUxkYXRhKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5feG1MZGF0YTtcclxuICB9XHJcblxyXG4gIGFkZDJDdXJySW5kZXgoYWRkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2N1cnJJbmRleCA9IHRoaXMuX2N1cnJJbmRleCArIGFkZDtcclxuICB9XHJcblxyXG4gIHNldEN1cnJJbmRleChpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jdXJySW5kZXggPSBpbmRleDtcclxuICB9XHJcblxyXG4gIHNldFhNTGRhdGEoZGF0YTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoZGF0YSAhPT0gbnVsbClcclxuICAgICAgdGhpcy5feG1MZGF0YSA9IGRhdGEudHJpbSgpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuX3htTGRhdGEgPSBudWxsO1xyXG4gICAgICB0aGlzLnNldEN1cnJJbmRleCgwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcHJlcGFyZSB0aGUgcGFyc2VyIHRvIHJlYWQgZnJvbSB0aGUgbmV3WG1sU3RyaW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJuZXdYbWxTdHJpbmdcIj48L3BhcmFtPlxyXG4gIFByZXBhcmVGb3JtUmVhZFN0cmluZyhuZXdYbWxTdHJpbmc6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXRYTUxkYXRhKG5ld1htbFN0cmluZyk7XHJcbiAgICB0aGlzLnNldEN1cnJJbmRleCgwKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gcHVzaCB0aGUgY3VycmVudCBwYXJzaW5nIGluZm9ybWF0aW9uIGludG8gdGhlIGhpc3Rvcnkgc3RhY2s8L3N1bW1hcnk+XHJcbiAgcHVzaCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2hpc3RvcnkucHVzaCh0aGlzLl9jdXJySW5kZXgpO1xyXG4gICAgdGhpcy5faGlzdG9yeS5wdXNoKHRoaXMuX3htTGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiByZXN0b3JlIHRoZSBwcmV2aW91cyBwYXJzaW5nIGluZm9ybWF0aW9uIGZyb20gdGhlIGhpc3Rvcnkgc3RhY2s8L3N1bW1hcnk+XHJcbiAgcG9wKCk6IHZvaWQge1xyXG4gICAgbGV0IGNvdW50OiBudW1iZXIgPSB0aGlzLl9oaXN0b3J5Lmxlbmd0aDtcclxuXHJcbiAgICB0aGlzLl94bUxkYXRhID0gPHN0cmluZz50aGlzLl9oaXN0b3J5LmdldF9JdGVtKGNvdW50IC0gMSk7XHJcbiAgICB0aGlzLl9jdXJySW5kZXggPSA8bnVtYmVyPnRoaXMuX2hpc3RvcnkuZ2V0X0l0ZW0oY291bnQgLSAyKTtcclxuXHJcbiAgICB0aGlzLl9oaXN0b3J5LlNldFNpemUoY291bnQgLSAyKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5nZXRzIGEgdGFibGUgY2FjaGUgeG1sIGFuZCBzZXQgdGhlIHhtbHBhcnNlciBkYXRhIGFuZCBpbmRleCBhY2NvcmRpbmdseTwvc3VtbWFyeT5cclxuICBsb2FkVGFibGVDYWNoZURhdGEoZGF0YTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnNldFhNTGRhdGEoZGF0YSk7XHJcbiAgICB0aGlzLnNldEN1cnJJbmRleCgwKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmVhZHMgdGhlIFhNTCBmcm9tIHRoZSBlbGVtZW50IGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIHVudGlsIHRoZSBlbmQgb2ZcclxuICAvLy8gdGhlIGVsZW1lbnQsIHJldHVybmluZyB0aGUgY29udGVudHMgYXMgYSBzdHJpbmcuIFRoaXMgYWxsb3dzIGRlZmVycmluZyB0aGVcclxuICAvLy8gcHJvY2Vzc2luZyBvZiBhbiBlbGVtZW50IHVudGlsIHRoZSB0aW1lIGlzIHJpZ2h0IHRvIGRvIHNvLjxici8+XHJcbiAgLy8vIFRoZSByZXR1cm5lZCBzdHJpbmcgY29udGFpbnMgdGhlIGVsZW1lbnQgdGFnIGl0c2VsZi4gRm9yIGV4YW1wbGU6PGJyLz5cclxuICAvLy8gLSBBc3N1bWluZyB0aGF0IHRoZSBjdXJyZW50IGVsZW1lbnQgaXMgJ2VsZW1lbnQxJywgd2l0aCAyICdpbm5lckVsZW1lbnQnIGVsZW1lbnRzLCB0aGVcclxuICAvLy8gcmVzdWx0aW5nIHN0cmluZyB3aWxsIGxvb2sgbGlrZSB0aGlzOjxici8+XHJcbiAgLy8vIDxlbGVtZW50MT5cclxuICAvLy8gICA8aW5uZXJlbGVtZW50Lz5cclxuICAvLy8gICA8aW5uZXJlbGVtZW50Lz5cclxuICAvLy8gPC9lbGVtZW50MT5cclxuICAvLy9cclxuICAvLy8gVGhpcyBtYWtlcyB0aGUgcmVzdWx0IHZhbGlkIGZvciBwcm9jZXNzaW5nIGJ5IHRoaXMgWE1MIHBhcnNlci5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgUmVhZFRvRW5kT2ZDdXJyZW50RWxlbWVudCgpOiBzdHJpbmcge1xyXG4gICAgLy8gR2V0IHRoZSBjdXJyZW50IHRhZyBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlIG9mIF9jdXJySW5kZXguXHJcbiAgICBsZXQgY3VycmVudFRhZzogc3RyaW5nID0gdGhpcy5nZXROZXh0VGFnKCk7XHJcbiAgICBsZXQgY3VycmVudFRhZ0luZGV4OiBudW1iZXIgPSB0aGlzLl94bUxkYXRhLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19PUEVOICsgY3VycmVudFRhZywgdGhpcy5nZXRDdXJySW5kZXgoKSk7XHJcblxyXG4gICAgLy8gRmluZCB0aGUgZW5kIG9mIHRoZSBlbGVtZW50J3MgYmxvY2sgaW4gdGhlIFhNTC5cclxuICAgIC8vIGZpbmQgbmV4dCBvcGVuIHRhZ1xyXG4gICAgbGV0IG5leHRPcGVuVGFnSW5kZXg6IG51bWJlciA9IHRoaXMuX3htTGRhdGEuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX09QRU4sIGN1cnJlbnRUYWdJbmRleCArIDEpO1xyXG4gICAgaWYgKG5leHRPcGVuVGFnSW5kZXggPT09IC0xKVxyXG4gICAgICBuZXh0T3BlblRhZ0luZGV4ID0gdGhpcy5feG1MZGF0YS5sZW5ndGg7XHJcblxyXG4gICAgLy8gZmluZCBhIGNsb3NlIHRhZyBCRUZPUkUgdGhlIG5leHQgb3BlbiB0YWdcclxuICAgIGxldCBlbGVtZW50RW5kSW5kZXg6IG51bWJlciA9IE5TdHJpbmcuSW5kZXhPZih0aGlzLl94bUxkYXRhLCBYTUxDb25zdGFudHMuVEFHX1RFUk0sIHRoaXMuZ2V0Q3VyckluZGV4KCksIG5leHRPcGVuVGFnSW5kZXggLSB0aGlzLmdldEN1cnJJbmRleCgpKTtcclxuICAgIGlmIChlbGVtZW50RW5kSW5kZXggPT09IC0xKVxyXG4gICAgLy8gY2xvc2UgdGFnIHdhcyBub3QgZm91bmQgaW4gcmFuZ2UgLSB3ZSBoYXZlIGlubmVyIGVsZW1lbnRzLCBsb29rIGZvciB0aGUgZnVsbCBjbG9zZSB0YWdcclxuICAgICAgZWxlbWVudEVuZEluZGV4ID0gdGhpcy5feG1MZGF0YS5pbmRleE9mKFwiL1wiICsgY3VycmVudFRhZywgdGhpcy5nZXRDdXJySW5kZXgoKSkgKyBjdXJyZW50VGFnLmxlbmd0aCArIFhNTENvbnN0YW50cy5UQUdfVEVSTS5sZW5ndGg7XHJcbiAgICBlbHNlXHJcbiAgICAgIGVsZW1lbnRFbmRJbmRleCA9IGVsZW1lbnRFbmRJbmRleCArIFhNTENvbnN0YW50cy5UQUdfVEVSTS5sZW5ndGg7XHJcblxyXG4gICAgLy8gQ29weSB0aGUgZWxlbWVudCBkYXRhIHNvIGl0IGNhbiBiZSByZXR1cm5lZC5cclxuICAgIGxldCBlbGVtZW50QmxvY2s6IHN0cmluZyA9IHRoaXMuZ2V0WE1Mc3Vic3RyaW5nKGVsZW1lbnRFbmRJbmRleCk7XHJcblxyXG4gICAgLy8gTW92ZSB0aGUgcGFyc2VyIHRvIHRoZSBlbmQgb2YgdGhlIGVsZW1lbnQgYmxvY2suXHJcbiAgICB0aGlzLnNldEN1cnJJbmRleChlbGVtZW50RW5kSW5kZXgpO1xyXG5cclxuICAgIHJldHVybiBlbGVtZW50QmxvY2s7XHJcbiAgfVxyXG5cclxuICBSZWFkQ29udGVudE9mQ3VycmVudEVsZW1lbnQoKTogc3RyaW5nIHtcclxuICAgIC8vIEdldCB0aGUgY3VycmVudCB0YWcgYWNjb3JkaW5nIHRvIHRoZSB2YWx1ZSBvZiBfY3VyckluZGV4LlxyXG4gICAgbGV0IGN1cnJlbnRUYWc6IHN0cmluZyA9IHRoaXMuZ2V0TmV4dFRhZygpO1xyXG5cclxuICAgIC8vIEZpbmQgdGhlIGVuZCBvZiB0aGUgZWxlbWVudCdzIGJsb2NrIGluIHRoZSBYTUwuXHJcbiAgICBsZXQgZWxlbWVudEVuZEluZGV4OiBudW1iZXIgPSB0aGlzLl94bUxkYXRhLmluZGV4T2YoXCI8L1wiICsgY3VycmVudFRhZyArIFwiPlwiLCB0aGlzLmdldEN1cnJJbmRleCgpKTtcclxuXHJcbiAgICBpZiAoZWxlbWVudEVuZEluZGV4ID09PSAtMSlcclxuICAgICAgLy8gQ2FuJ3QgZmluZCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQgLSBlaXRoZXIgWE1MIGlzIGZhdWx0eSBvciB0aGUgZWxlbWVudCBpcyBlbXB0eS5cclxuICAgICAgcmV0dXJuIE5TdHJpbmcuRW1wdHk7XHJcblxyXG4gICAgLy8gTW92ZSB0byB0aGUgZW5kIG9mIHRoZSBvcGVuaW5nIHRhZ1xyXG4gICAgdGhpcy5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuXHJcbiAgICAvLyBDb3B5IHRoZSBjb250ZW50IG9mIHRoZSBlbGVtZW50IChmcm9tIHRoZSBlbmQgb2YgdGhlIG9wZW5pbmcgdGFnIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNsb3NpbmcgdGFnKS5cclxuICAgIGxldCBlbGVtZW50QmxvY2s6IHN0cmluZyA9IHRoaXMuZ2V0WE1Mc3Vic3RyaW5nKGVsZW1lbnRFbmRJbmRleCk7XHJcblxyXG4gICAgLy8gTW92ZSB0aGUgcGFyc2VyIHRvIHRoZSBlbmQgb2YgdGhlIGVsZW1lbnQgYmxvY2suXHJcbiAgICB0aGlzLnNldEN1cnJJbmRleChlbGVtZW50RW5kSW5kZXgpO1xyXG4gICAgdGhpcy5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuXHJcbiAgICByZXR1cm4gZWxlbWVudEJsb2NrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZW5lcmF0ZXMgYSBzdHJpbmcgdGhhdCB2aXN1YWxpemVzIHRoZSBYTUwgcGFyc2VyIHN0YXRlIChlLmcuIGZvciBkZWJ1ZyB3YXRjaCBsaXN0Lik8YnIvPlxyXG4gIC8vLyBUaGUgbWV0aG9kIHdpbGwgc2hvdyB0aGUgWE1MIGRhdGEsIHRyaW1taW5nIGl0IHRvIDIwIGNoYXJhY3RlcnMgYmVmb3JlIHRoZVxyXG4gIC8vLyBjdXJyZW50IHBvc2l0aW9uIChfY3VyckluZGV4KSBhbmQgdXAgdG8gNTAgY2hhcmFjdGVycyBhZnRlciB0aGUgY3VycmVudCBwb3NpdGlvbi5cclxuICAvLy8gVGhlIGN1cnJlbnQgcG9zaXRpb24gaXRzZWxmIHdpbGwgYmUgbWFya2VkIHdpdGggYSBtYXJrZXIgdGhhdCBsb29rcyBsaWtlOlxyXG4gIC8vLyB8LXtjdXJyZW50IGluZGV4fS18IDxici8+XHJcbiAgLy8vIFRoZSBtYXJrZXIgd2lsbCBiZSBwbGFjZWQgaW1tZWRpYXRlbHkgYmVmb3JlIF94bWxEYXRhW19jdXJySW5kZXhdLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaGVhZENoYXJDb3VudFwiPk51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHNob3cgYmVmb3JlIHRoZSBjdXJyZW50IHBvc2l0aW9uIG1hcmtlci48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhaWxDaGFyQ291bnRcIj5OdW1iZXIgb2YgY2hhcmFjdGVycyB0byBzaG93IGFmdGVyIHRoZSBjdXJyZW50IHBvc2l0aW9uIG1hcmtlci48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgdG9TdHJpbmcoKTogc3RyaW5nO1xyXG4gIHRvU3RyaW5nKGhlYWRDaGFyQ291bnQ6IG51bWJlciwgdGFpbENoYXJDb3VudDogbnVtYmVyKTogc3RyaW5nO1xyXG4gIHRvU3RyaW5nKGhlYWRDaGFyQ291bnQ/OiBudW1iZXIsIHRhaWxDaGFyQ291bnQ/OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuVG9TdHJpbmdfMCgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuVG9TdHJpbmdfMShoZWFkQ2hhckNvdW50LCB0YWlsQ2hhckNvdW50KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2VuZXJhdGVzIGEgc3RyaW5nIHRoYXQgdmlzdWFsaXplcyB0aGUgWE1MIHBhcnNlciBzdGF0ZSAoZS5nLiBmb3IgZGVidWcgd2F0Y2ggbGlzdC4pPGJyLz5cclxuICAvLy8gVGhlIG1ldGhvZCB3aWxsIHNob3cgdGhlIFhNTCBkYXRhLCB0cmltbWluZyBpdCB0byAyMCBjaGFyYWN0ZXJzIGJlZm9yZSB0aGVcclxuICAvLy8gY3VycmVudCBwb3NpdGlvbiAoX2N1cnJJbmRleCkgYW5kIHVwIHRvIDUwIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIGN1cnJlbnQgcG9zaXRpb24uXHJcbiAgLy8vIFRoZSBjdXJyZW50IHBvc2l0aW9uIGl0c2VsZiB3aWxsIGJlIG1hcmtlZCB3aXRoIGEgbWFya2VyIHRoYXQgbG9va3MgbGlrZTpcclxuICAvLy8gfC17Y3VycmVudCBpbmRleH0tfCA8YnIvPlxyXG4gIC8vLyBUaGUgbWFya2VyIHdpbGwgYmUgcGxhY2VkIGltbWVkaWF0ZWx5IGJlZm9yZSBfeG1sRGF0YVtfY3VyckluZGV4XS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBUb1N0cmluZ18wKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50b1N0cmluZygyMCwgNTApO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZW5lcmF0ZXMgYSBzdHJpbmcgdGhhdCB2aXN1YWxpemVzIHRoZSBYTUwgcGFyc2VyIHN0YXRlIChlLmcuIGZvciBkZWJ1ZyB3YXRjaCBsaXN0Lik8YnIvPlxyXG4gIC8vLyBUaGUgbWV0aG9kIHdpbGwgc2hvdyB0aGUgWE1MIGRhdGEsIHRyaW1taW5nIGl0IHRvIGhlYWRDaGFyQ291bnQgY2hhcmFjdGVycyBiZWZvcmUgdGhlXHJcbiAgLy8vIGN1cnJlbnQgcG9zaXRpb24gKF9jdXJySW5kZXgpIGFuZCB1cCB0byB0YWlsQ2hhckNvdW50IGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIGN1cnJlbnQgcG9zaXRpb24uXHJcbiAgLy8vIFRoZSBjdXJyZW50IHBvc2l0aW9uIGl0c2VsZiB3aWxsIGJlIG1hcmtlZCB3aXRoIGEgbWFya2VyIHRoYXQgbG9va3MgbGlrZTpcclxuICAvLy8gfC17Y3VycmVudCBpbmRleH0tfCA8YnIvPlxyXG4gIC8vLyBUaGUgbWFya2VyIHdpbGwgYmUgcGxhY2VkIGltbWVkaWF0ZWx5IGJlZm9yZSBfeG1sRGF0YVtfY3VyckluZGV4XS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImhlYWRDaGFyQ291bnRcIj5OdW1iZXIgb2YgY2hhcmFjdGVycyB0byBzaG93IGJlZm9yZSB0aGUgY3VycmVudCBwb3NpdGlvbiBtYXJrZXIuPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YWlsQ2hhckNvdW50XCI+TnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gc2hvdyBhZnRlciB0aGUgY3VycmVudCBwb3NpdGlvbiBtYXJrZXIuPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgVG9TdHJpbmdfMShoZWFkQ2hhckNvdW50OiBudW1iZXIsIHRhaWxDaGFyQ291bnQ6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgbWFya2VyUG9zaXRpb246IG51bWJlciA9IE1hdGgubWluKHRoaXMuX2N1cnJJbmRleCwgdGhpcy5feG1MZGF0YS5sZW5ndGgpO1xyXG4gICAgbGV0IHNlZ21lbnRTdGFydEluZGV4OiBudW1iZXIgPSBNYXRoLm1heCgwLCBtYXJrZXJQb3NpdGlvbiAtIGhlYWRDaGFyQ291bnQpO1xyXG4gICAgbGV0IHNlZ21lbnRFbmRJbmRleDogbnVtYmVyID0gTWF0aC5taW4odGhpcy5feG1MZGF0YS5sZW5ndGgsIG1hcmtlclBvc2l0aW9uICsgdGFpbENoYXJDb3VudCk7XHJcblxyXG4gICAgbGV0IGhlYWRMZW5ndGg6IG51bWJlciA9IG1hcmtlclBvc2l0aW9uIC0gc2VnbWVudFN0YXJ0SW5kZXg7XHJcbiAgICBsZXQgdGFpbExlbmd0aDogbnVtYmVyID0gc2VnbWVudEVuZEluZGV4IC0gbWFya2VyUG9zaXRpb247XHJcblxyXG4gICAgbGV0IHNlZ21lbnQ6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgaWYgKHNlZ21lbnRTdGFydEluZGV4ID4gMClcclxuICAgICAgc2VnbWVudC5BcHBlbmQoXCIuLi5cIik7XHJcblxyXG4gICAgaWYgKGhlYWRMZW5ndGggPiAwKVxyXG4gICAgICBzZWdtZW50LkFwcGVuZCh0aGlzLl94bUxkYXRhLCBzZWdtZW50U3RhcnRJbmRleCwgaGVhZExlbmd0aCk7XHJcblxyXG4gICAgc2VnbWVudC5BcHBlbmQoXCJ8LXtcIikuQXBwZW5kKHRoaXMuX2N1cnJJbmRleCkuQXBwZW5kKFwifS18XCIpO1xyXG5cclxuICAgIGlmICh0YWlsTGVuZ3RoID4gMClcclxuICAgICAgc2VnbWVudC5BcHBlbmQodGhpcy5feG1MZGF0YSwgdGhpcy5fY3VyckluZGV4LCB0YWlsTGVuZ3RoKTtcclxuXHJcbiAgICBpZiAoc2VnbWVudEVuZEluZGV4IDwgdGhpcy5feG1MZGF0YS5sZW5ndGgpXHJcbiAgICAgIHNlZ21lbnQuQXBwZW5kKFwiLi4uXCIpO1xyXG5cclxuICAgIHJldHVybiBzZWdtZW50LlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICBTa2lwWE1MRWxlbWVudCgpOiB2b2lkIHtcclxuICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSB0aGlzLmdldFhNTGRhdGEoKS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfVEVSTSwgdGhpcy5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICBpZiAoZW5kQ29udGV4dCAhPT0gLTEgJiYgZW5kQ29udGV4dCA8IHRoaXMuZ2V0WE1MZGF0YSgpLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnNldEN1cnJJbmRleDJFbmRPZlRhZygpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
|