@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
package/esm2022/src/Logger.mjs
DELETED
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
import { Logger_LogLevels, Logger_MessageDirection } from "./enums";
|
|
2
|
-
import { DateTime, Debug, Exception, NString, StringBuilder, Thread, isNullOrUndefined } from "@magic-xpa/mscorelib";
|
|
3
|
-
import { OSEnvironment } from "./PlatformUtils";
|
|
4
|
-
import { DateTimeUtils } from "./DateTimeUtils";
|
|
5
|
-
import { XMLConstants } from "./XMLConstants";
|
|
6
|
-
import { RequestInfo } from "./RequestInfo";
|
|
7
|
-
import { StrUtil } from "./StrUtil";
|
|
8
|
-
export var LogType;
|
|
9
|
-
(function (LogType) {
|
|
10
|
-
LogType[LogType["info"] = 1] = "info";
|
|
11
|
-
LogType[LogType["warning"] = 2] = "warning";
|
|
12
|
-
LogType[LogType["error"] = 3] = "error";
|
|
13
|
-
})(LogType || (LogType = {}));
|
|
14
|
-
export class Logger {
|
|
15
|
-
static instance = null;
|
|
16
|
-
LogLevel = 0;
|
|
17
|
-
ShouldBeep = false;
|
|
18
|
-
static set Instance(value) {
|
|
19
|
-
Logger.instance = value;
|
|
20
|
-
}
|
|
21
|
-
static get Instance() {
|
|
22
|
-
if (Logger.instance === null) {
|
|
23
|
-
Logger.instance = new Logger();
|
|
24
|
-
}
|
|
25
|
-
return Logger.instance;
|
|
26
|
-
}
|
|
27
|
-
Initialize(logLevel, shouldBeep) {
|
|
28
|
-
try {
|
|
29
|
-
this.LogLevel = logLevel;
|
|
30
|
-
this.ShouldBeep = shouldBeep;
|
|
31
|
-
}
|
|
32
|
-
catch (e) {
|
|
33
|
-
this.WriteDevToLog("ClientManager.init(): " + e.Message);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
ShouldLog(logLevel) {
|
|
37
|
-
if (arguments.length === 1)
|
|
38
|
-
return this.ShouldLog_0(logLevel);
|
|
39
|
-
else
|
|
40
|
-
return this.ShouldLog_1();
|
|
41
|
-
}
|
|
42
|
-
ShouldLog_0(logLevel) {
|
|
43
|
-
return this.LogLevel === logLevel;
|
|
44
|
-
}
|
|
45
|
-
ShouldLog_1() {
|
|
46
|
-
return this.LogLevel > Logger_LogLevels.None;
|
|
47
|
-
}
|
|
48
|
-
ShouldLogServerRelatedMessages() {
|
|
49
|
-
return (this.ShouldLogExtendedServerRelatedMessages() || Logger.Instance.ShouldLog(Logger_LogLevels.Server)) && this.LogLevel !== Logger_LogLevels.Basic;
|
|
50
|
-
}
|
|
51
|
-
ShouldLogExtendedServerRelatedMessages() {
|
|
52
|
-
return (Logger.Instance.ShouldLog(Logger_LogLevels.ServerMessages) || Logger.Instance.ShouldLog(Logger_LogLevels.Support) || Logger.Instance.ShouldLog(Logger_LogLevels.Development)) && this.LogLevel !== Logger_LogLevels.Basic;
|
|
53
|
-
}
|
|
54
|
-
WriteToLog(msg, openIfNecessary, logType = LogType.info) {
|
|
55
|
-
if (this.LogLevel > Logger_LogLevels.None || openIfNecessary) {
|
|
56
|
-
msg = NString.Format("{0} {1}", (this.LogLevel === Logger_LogLevels.Basic) ? new Date().toISOString() : DateTimeUtils.ToString(DateTime.Now, XMLConstants.ERROR_LOG_TIME_FORMAT, this), msg);
|
|
57
|
-
switch (logType) {
|
|
58
|
-
case LogType.error:
|
|
59
|
-
console.error(msg);
|
|
60
|
-
break;
|
|
61
|
-
case LogType.warning:
|
|
62
|
-
console.warn(msg);
|
|
63
|
-
break;
|
|
64
|
-
default:
|
|
65
|
-
console.log(msg);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
WriteServerToLog(msg) {
|
|
70
|
-
if (this.ShouldLogServerRelatedMessages()) {
|
|
71
|
-
this.WriteToLog(NString.Format("Server, Thread={0}: ", Thread.CurrentThread.ManagedThreadId) + msg, false, LogType.info);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
WriteServerMessagesToLog(msg) {
|
|
75
|
-
if (this.ShouldLogExtendedServerRelatedMessages()) {
|
|
76
|
-
this.WriteToLog("Server#: " + msg, false, LogType.info);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
WriteSupportToLog(msg, skipLine) {
|
|
80
|
-
if (this.LogLevel >= Logger_LogLevels.Support && this.LogLevel !== Logger_LogLevels.Basic) {
|
|
81
|
-
if (skipLine) {
|
|
82
|
-
this.WriteToLog("SUPPORT: " + msg, false, LogType.info);
|
|
83
|
-
}
|
|
84
|
-
else {
|
|
85
|
-
this.WriteToLog("SUPPORT: " + msg + OSEnvironment.EolSeq + "-----------------------------------------------------------------------------------------------------------", false, LogType.info);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
WriteGuiToLog(msg) {
|
|
90
|
-
if (this.LogLevel >= Logger_LogLevels.Gui && this.LogLevel !== Logger_LogLevels.Basic) {
|
|
91
|
-
this.WriteToLog(msg, false, LogType.info);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
WriteDevToLog(msg) {
|
|
95
|
-
if (this.LogLevel >= Logger_LogLevels.Development && this.LogLevel !== Logger_LogLevels.Basic) {
|
|
96
|
-
this.WriteToLog("DEV: " + msg, false, LogType.info);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
WriteBasicToLog(messageDirection, contextID, sessionCounter, clientID, serverID, responseTime, statusCode, httpHeaders, contentLength) {
|
|
100
|
-
if (this.LogLevel === Logger_LogLevels.Basic) {
|
|
101
|
-
let text = httpHeaders;
|
|
102
|
-
text = text.trim();
|
|
103
|
-
text = NString.Replace(text, "\r\n", "|");
|
|
104
|
-
let arg_E4_0 = "RIA,{0}_{1},{2},{3},{4},{5},-,{6},{7},{8},{9},{10},{11}";
|
|
105
|
-
let expr_3E = new Array(12);
|
|
106
|
-
expr_3E[1] = Thread.CurrentThread.ManagedThreadId;
|
|
107
|
-
expr_3E[2] = new Date().toISOString();
|
|
108
|
-
expr_3E[3] = ((messageDirection === Logger_MessageDirection.MessageLeaving) ? "MSGL" : "MSGE");
|
|
109
|
-
expr_3E[4] = contextID;
|
|
110
|
-
expr_3E[5] = sessionCounter;
|
|
111
|
-
expr_3E[6] = clientID;
|
|
112
|
-
expr_3E[7] = serverID;
|
|
113
|
-
expr_3E[8] = ((responseTime !== 0) ? responseTime.toString() : "-");
|
|
114
|
-
let arg_D3_1 = 9;
|
|
115
|
-
let arg_D3_2;
|
|
116
|
-
arg_D3_2 = statusCode;
|
|
117
|
-
expr_3E[arg_D3_1] = arg_D3_2;
|
|
118
|
-
expr_3E[10] = text;
|
|
119
|
-
expr_3E[11] = contentLength;
|
|
120
|
-
let value = NString.Format(arg_E4_0, expr_3E);
|
|
121
|
-
console.log(value);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
WriteRequestInfoToLog(requestInfo, extraMessageStr) {
|
|
125
|
-
if (this.LogLevel === Logger_LogLevels.RequestInfo) {
|
|
126
|
-
console.log(extraMessageStr, RequestInfo.clone(requestInfo));
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
WriteBasicErrorToLog() {
|
|
130
|
-
Debug.Assert(this.LogLevel === Logger_LogLevels.Basic);
|
|
131
|
-
}
|
|
132
|
-
WriteErrorToLog(msg) {
|
|
133
|
-
this.WriteToLog("MagicWeb [ERROR]: " + StrUtil.getConsoleErorString(msg), true, LogType.error);
|
|
134
|
-
}
|
|
135
|
-
WriteExceptionToLog(msgOrEx, msg) {
|
|
136
|
-
if (msgOrEx instanceof Error) {
|
|
137
|
-
this.WriteExceptionToLog_2(msgOrEx, msg);
|
|
138
|
-
return;
|
|
139
|
-
}
|
|
140
|
-
if (arguments.length === 1 && (msgOrEx !== null || msgOrEx instanceof Exception)) {
|
|
141
|
-
this.WriteExceptionToLog_1(msgOrEx);
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
this.WriteExceptionToLog_3(msgOrEx, msg);
|
|
145
|
-
}
|
|
146
|
-
WriteExceptionToLogWithMsg(msg) {
|
|
147
|
-
this.WriteToLog("MagicWeb [ERROR]: " + StrUtil.getConsoleErorString(msg), true, LogType.error);
|
|
148
|
-
}
|
|
149
|
-
WriteExceptionToLog_1(ex) {
|
|
150
|
-
this.WriteExceptionToLogWithMsg(NString.Format("{0} : {1}{2}{3}{4}", [
|
|
151
|
-
ex.GetType(), OSEnvironment.EolSeq, ex.StackTrace, OSEnvironment.EolSeq, ex.Message
|
|
152
|
-
]));
|
|
153
|
-
}
|
|
154
|
-
WriteExceptionToLog_2(ex, message) {
|
|
155
|
-
if (isNullOrUndefined(message))
|
|
156
|
-
this.WriteExceptionToLogWithMsg(NString.Format("{0}{1}{2}", [ex.stack, OSEnvironment.EolSeq, ex.message]));
|
|
157
|
-
else
|
|
158
|
-
this.WriteExceptionToLogWithMsg(NString.Format("{0}{1}{2}{4}{5}", [message, OSEnvironment.EolSeq, ex.stack, OSEnvironment.EolSeq, ex.message]));
|
|
159
|
-
}
|
|
160
|
-
WriteExceptionToLog_3(ex, msg) {
|
|
161
|
-
this.WriteExceptionToLogWithMsg(NString.Format("{0}, {1} : {2}{3}{4}{5}", [
|
|
162
|
-
ex.GetType(), msg, OSEnvironment.EolSeq, ex.StackTrace, OSEnvironment.EolSeq, ex.Message
|
|
163
|
-
]));
|
|
164
|
-
}
|
|
165
|
-
WriteWarningToLog(msgOrEx, msg) {
|
|
166
|
-
if (arguments.length === 1 && msgOrEx !== null) {
|
|
167
|
-
if (msgOrEx instanceof Exception)
|
|
168
|
-
this.WriteWarningToLog_1(msgOrEx);
|
|
169
|
-
else if (msgOrEx instanceof Error)
|
|
170
|
-
this.WriteWarningToLog_2(msgOrEx);
|
|
171
|
-
}
|
|
172
|
-
else
|
|
173
|
-
this.WriteWarningToLog_3(msgOrEx, msg);
|
|
174
|
-
}
|
|
175
|
-
WriteWarningToLogWithMsg(msg) {
|
|
176
|
-
if (this.LogLevel !== Logger_LogLevels.Basic) {
|
|
177
|
-
this.WriteToLog("MagicWeb [WARNING]: " + msg, true, LogType.warning);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
WriteWarningToLog_1(ex) {
|
|
181
|
-
this.WriteWarningToLogWithMsg(ex.GetType() + " : " + OSEnvironment.EolSeq + ex.StackTrace + OSEnvironment.EolSeq + ex.Message);
|
|
182
|
-
}
|
|
183
|
-
WriteWarningToLog_2(ex) {
|
|
184
|
-
this.WriteWarningToLogWithMsg(NString.Format("{0}{1}{2}", [
|
|
185
|
-
ex.stack, OSEnvironment.EolSeq, ex.message
|
|
186
|
-
]));
|
|
187
|
-
}
|
|
188
|
-
WriteWarningToLog_3(ex, msg) {
|
|
189
|
-
this.WriteWarningToLogWithMsg(NString.Format("{0}, {1} : {2}{3}{4}{5}", [
|
|
190
|
-
ex.GetType(), msg, OSEnvironment.EolSeq, ex.StackTrace, OSEnvironment.EolSeq, ex.Message
|
|
191
|
-
]));
|
|
192
|
-
}
|
|
193
|
-
WriteStackTrace(stackTrace, framesToPrint, traceTitle) {
|
|
194
|
-
if (traceTitle === null) {
|
|
195
|
-
traceTitle = "Stack trace:";
|
|
196
|
-
}
|
|
197
|
-
let stringBuilder = new StringBuilder(traceTitle + OSEnvironment.EolSeq);
|
|
198
|
-
let frames = stackTrace.GetFrames();
|
|
199
|
-
let array = frames;
|
|
200
|
-
for (let i = 0; i < array.length; i = i + 1) {
|
|
201
|
-
let stackFrame = array[i];
|
|
202
|
-
framesToPrint = framesToPrint - 1;
|
|
203
|
-
stringBuilder.Append(stackFrame.toString());
|
|
204
|
-
if (framesToPrint === 0) {
|
|
205
|
-
stringBuilder.Append("\t... more stack frames ...\n");
|
|
206
|
-
break;
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
this.WriteToLog(stringBuilder.ToString(), true);
|
|
210
|
-
}
|
|
211
|
-
Flush() {
|
|
212
|
-
}
|
|
213
|
-
constructor() {
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdXRpbHMvc3JjL0xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDbEUsT0FBTyxFQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBYyxhQUFhLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDL0gsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFNUMsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBR2xDLE1BQU0sQ0FBTixJQUFZLE9BSVg7QUFKRCxXQUFZLE9BQU87SUFDakIscUNBQVEsQ0FBQTtJQUNSLDJDQUFPLENBQUE7SUFDUCx1Q0FBSyxDQUFBO0FBQ1AsQ0FBQyxFQUpXLE9BQU8sS0FBUCxPQUFPLFFBSWxCO0FBT0QsTUFBTSxPQUFPLE1BQU07SUFDakIsTUFBTSxDQUFDLFFBQVEsR0FBVyxJQUFJLENBQUM7SUFDL0IsUUFBUSxHQUFxQixDQUFDLENBQUM7SUFLL0IsVUFBVSxHQUFZLEtBQUssQ0FBQztJQUU1QixNQUFNLEtBQUssUUFBUSxDQUFDLEtBQWE7UUFDL0IsTUFBTSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDMUIsQ0FBQztJQUVELE1BQU0sS0FBSyxRQUFRO1FBQ2pCLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxJQUFJLEVBQUU7WUFDNUIsTUFBTSxDQUFDLFFBQVEsR0FBRyxJ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QUFDLEVBQUU7WUFDbkQsSUFBSSxVQUFVLEdBQWlCLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QyxhQUFhLEdBQUcsYUFBYSxHQUFHLENBQUMsQ0FBQztZQUVsQyxhQUFhLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBRTVDLElBQUksYUFBYSxLQUFLLENBQUMsRUFBRTtnQkFDdkIsYUFBYSxDQUFDLE1BQU0sQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO2dCQUN0RCxNQUFNO2FBQ1A7U0FDRjtRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFLRCxLQUFLO0lBRUwsQ0FBQztJQUVEO0lBQ0EsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TG9nZ2VyX0xvZ0xldmVscywgTG9nZ2VyX01lc3NhZ2VEaXJlY3Rpb259IGZyb20gXCIuL2VudW1zXCI7XHJcbmltcG9ydCB7RGF0ZVRpbWUsIERlYnVnLCBFeGNlcHRpb24sIE5TdHJpbmcsIFN0YWNrVHJhY2UsIFN0cmluZ0J1aWxkZXIsIFRocmVhZCwgaXNOdWxsT3JVbmRlZmluZWR9IGZyb20gXCJAbWFnaWMteHBhL21zY29yZWxpYlwiO1xyXG5pbXBvcnQge09TRW52aXJvbm1lbnR9IGZyb20gXCIuL1BsYXRmb3JtVXRpbHNcIjtcclxuaW1wb3J0IHtEYXRlVGltZVV0aWxzfSBmcm9tIFwiLi9EYXRlVGltZVV0aWxzXCI7XHJcbmltcG9ydCB7WE1MQ29uc3RhbnRzfSBmcm9tIFwiLi9YTUxDb25zdGFudHNcIjtcclxuaW1wb3J0ICogYXMgSlNTdGFja1RyYWNlIGZyb20gJ3N0YWNrdHJhY2UtanMnO1xyXG5pbXBvcnQge1JlcXVlc3RJbmZvfSBmcm9tIFwiLi9SZXF1ZXN0SW5mb1wiO1xyXG5pbXBvcnQge1N0clV0aWx9IGZyb20gXCIuL1N0clV0aWxcIjtcclxuaW1wb3J0IEpTU3RhY2tGcmFtZSA9IEpTU3RhY2tUcmFjZS5TdGFja0ZyYW1lO1xyXG5cclxuZXhwb3J0IGVudW0gTG9nVHlwZSB7XHJcbiAgaW5mbyA9IDEsXHJcbiAgd2FybmluZyxcclxuICBlcnJvclxyXG59XHJcblxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gTG9nZ2VyIGNsYXNzIHdpbGwgdGFrZSBjYXJlIG9mIGNsaWVudCBzaWRlIGxvZ2dpbmcgLiBJdCB3aWxsIGNoZWNrIGZvciB2YXJpb3VzIGxvZyBsZXZlbHMgYW5kIGFjY29yZGluZ2x5IHdpbGwgd3JpdGUgbWVzc2FnZXMgaW4gbG9nIGZpbGUuXHJcbi8vLyA8L3N1bW1hcnk+XHJcbi8vQGR5bmFtaWNcclxuZXhwb3J0IGNsYXNzIExvZ2dlciB7XHJcbiAgc3RhdGljIGluc3RhbmNlOiBMb2dnZXIgPSBudWxsO1xyXG4gIExvZ0xldmVsOiBMb2dnZXJfTG9nTGV2ZWxzID0gMDsgLy8gSW50ZXJuYWxMb2dMZXZlbFxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFdoaWxlIHdyaXRpbmcgdGhlIGVycm9yIG1lc3NhZ2VzIGluIHRoZSBmaWxlIHBsYXkgdGhlIGJlZXAuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBTaG91bGRCZWVwOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHN0YXRpYyBzZXQgSW5zdGFuY2UodmFsdWU6IExvZ2dlcikge1xyXG4gICAgTG9nZ2VyLmluc3RhbmNlID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IExvZ2dlciB7XHJcbiAgICBpZiAoTG9nZ2VyLmluc3RhbmNlID09PSBudWxsKSB7XHJcbiAgICAgIExvZ2dlci5pbnN0YW5jZSA9IG5ldyBMb2dnZXIoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBMb2dnZXIuaW5zdGFuY2U7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBJbml0aWFsaXplIGxvZ2dlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibG9nTGV2ZWxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImludGVybmFsTG9nU3luY1wiPjwvcGFyYW0+XHJcbiAgSW5pdGlhbGl6ZShsb2dMZXZlbDogTG9nZ2VyX0xvZ0xldmVscywgc2hvdWxkQmVlcDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gbGV0IGxvZ1N5bmM6IExvZ1N5bmNNb2RlICA9IExvZ1N5bmNNb2RlLlNlc3Npb247XHJcbiAgICAgIHRoaXMuTG9nTGV2ZWwgPSBsb2dMZXZlbDtcclxuICAgICAgdGhpcy5TaG91bGRCZWVwID0gc2hvdWxkQmVlcDtcclxuXHJcbiAgICAgIC8vIFRPRE86IGltcGxlbWVudFxyXG4vLyAgIFN0cmluZyBzdHJMb2dTeW5jID0gaW50ZXJuYWxMb2dTeW5jO1xyXG4vLyAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoc3RyTG9nU3luYykpXHJcbi8vIHtcclxuLy8gICBpZiAoc3RyTG9nU3luYy5TdGFydHNXaXRoKFwiTVwiLCBTdHJpbmdDb21wYXJpc29uLkN1cnJlbnRDdWx0dXJlSWdub3JlQ2FzZSkpXHJcbi8vICAgbG9nU3luYyA9IExvZ1N5bmNNb2RlLk1lc3NhZ2U7XHJcbi8vICAgZWxzZSBpZiAoc3RyTG9nU3luYy5TdGFydHNXaXRoKFwiRlwiLCBTdHJpbmdDb21wYXJpc29uLkN1cnJlbnRDdWx0dXJlSWdub3JlQ2FzZSkpXHJcbi8vICAgbG9nU3luYyA9IExvZ1N5bmNNb2RlLkZsdXNoO1xyXG4vLyB9XHJcbi8vXHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICB0aGlzLldyaXRlRGV2VG9Mb2coXCJDbGllbnRNYW5hZ2VyLmluaXQoKTogXCIgKyBlLk1lc3NhZ2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5Pjwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsb2dMZXZlbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuXHJcbiAgU2hvdWxkTG9nKGxvZ0xldmVsOiBMb2dnZXJfTG9nTGV2ZWxzKTogYm9vbGVhbjtcclxuICBTaG91bGRMb2coKTogYm9vbGVhbjtcclxuICBTaG91bGRMb2cobG9nTGV2ZWw/OiBMb2dnZXJfTG9nTGV2ZWxzKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSlcclxuICAgICAgcmV0dXJuIHRoaXMuU2hvdWxkTG9nXzAobG9nTGV2ZWwpO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gdGhpcy5TaG91bGRMb2dfMSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBTaG91bGRMb2dfMChsb2dMZXZlbDogTG9nZ2VyX0xvZ0xldmVscyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuTG9nTGV2ZWwgPT09IGxvZ0xldmVsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBTaG91bGRMb2dfMSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLkxvZ0xldmVsID4gTG9nZ2VyX0xvZ0xldmVscy5Ob25lO1xyXG4gIH1cclxuXHJcbiAgU2hvdWxkTG9nU2VydmVyUmVsYXRlZE1lc3NhZ2VzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICh0aGlzLlNob3VsZExvZ0V4dGVuZGVkU2VydmVyUmVsYXRlZE1lc3NhZ2VzKCkgfHwgTG9nZ2VyLkluc3RhbmNlLlNob3VsZExvZyhMb2dnZXJfTG9nTGV2ZWxzLlNlcnZlcikpICYmIHRoaXMuTG9nTGV2ZWwgIT09IExvZ2dlcl9Mb2dMZXZlbHMuQmFzaWM7XHJcbiAgfVxyXG5cclxuICBTaG91bGRMb2dFeHRlbmRlZFNlcnZlclJlbGF0ZWRNZXNzYWdlcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoTG9nZ2VyLkluc3RhbmNlLlNob3VsZExvZyhMb2dnZXJfTG9nTGV2ZWxzLlNlcnZlck1lc3NhZ2VzKSB8fCBMb2dnZXIuSW5zdGFuY2UuU2hvdWxkTG9nKExvZ2dlcl9Mb2dMZXZlbHMuU3VwcG9ydCkgfHwgTG9nZ2VyLkluc3RhbmNlLlNob3VsZExvZyhMb2dnZXJfTG9nTGV2ZWxzLkRldmVsb3BtZW50KSkgJiYgdGhpcy5Mb2dMZXZlbCAhPT0gTG9nZ2VyX0xvZ0xldmVscy5CYXNpYztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT48L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibXNnXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvcGVuSWZOZWNlc3NhcnlcIj5vcGVuIHRoZSBsb2cgZmlsZSBpZiBub3Qgb3BlbmVkIHlldDwvcGFyYW0+XHJcblxyXG4gIFdyaXRlVG9Mb2cobXNnOiBzdHJpbmcsIG9wZW5JZk5lY2Vzc2FyeTogYm9vbGVhbiwgbG9nVHlwZTogTG9nVHlwZSA9IExvZ1R5cGUuaW5mbyk6IHZvaWQge1xyXG5cclxuICAgIGlmICh0aGlzLkxvZ0xldmVsID4gTG9nZ2VyX0xvZ0xldmVscy5Ob25lIHx8IG9wZW5JZk5lY2Vzc2FyeSkge1xyXG4gICAgICBtc2cgPSBOU3RyaW5nLkZvcm1hdChcInswfSB7MX1cIiwgKHRoaXMuTG9nTGV2ZWwgPT09IExvZ2dlcl9Mb2dMZXZlbHMuQmFzaWMpID8gbmV3IERhdGUoKS50b0lTT1N0cmluZygpIDogRGF0ZVRpbWVVdGlscy5Ub1N0cmluZyhEYXRlVGltZS5Ob3csIFhNTENvbnN0YW50cy5FUlJPUl9MT0dfVElNRV9GT1JNQVQsIHRoaXMpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cpO1xyXG5cclxuICAgICAgc3dpdGNoIChsb2dUeXBlKSB7XHJcbiAgICAgICAgY2FzZSBMb2dUeXBlLmVycm9yOlxyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBMb2dUeXBlLndhcm5pbmc6XHJcbiAgICAgICAgICBjb25zb2xlLndhcm4obXNnKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhtc2cpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHdyaXRlIGEgc2VydmVyIGFjY2VzcyB0byB0aGUgbG9nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtc2dcIj50aGUgbWVzc2FnZSB0byB3cml0ZSB0byB0aGUgbG9nPC9wYXJhbT5cclxuICBXcml0ZVNlcnZlclRvTG9nKG1zZzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5TaG91bGRMb2dTZXJ2ZXJSZWxhdGVkTWVzc2FnZXMoKSkge1xyXG4gICAgICB0aGlzLldyaXRlVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJTZXJ2ZXIsIFRocmVhZD17MH06IFwiLCBUaHJlYWQuQ3VycmVudFRocmVhZC5NYW5hZ2VkVGhyZWFkSWQpICsgbXNnLCBmYWxzZSwgTG9nVHlwZS5pbmZvKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gd3JpdGUgYSBzZXJ2ZXIgYWNjZXNzIHRvIHRoZSBsb2csIGluY2x1ZGluZyB0aGUgY29udGVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibXNnXCI+dGhlIG1lc3NhZ2UgdG8gd3JpdGUgdG8gdGhlIGxvZzwvcGFyYW0+XHJcbiAgV3JpdGVTZXJ2ZXJNZXNzYWdlc1RvTG9nKG1zZzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5TaG91bGRMb2dFeHRlbmRlZFNlcnZlclJlbGF0ZWRNZXNzYWdlcygpKSB7XHJcbiAgICAgIHRoaXMuV3JpdGVUb0xvZyhcIlNlcnZlciM6IFwiICsgbXNnLCBmYWxzZSwgTG9nVHlwZS5pbmZvKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5Xcml0ZSBhIFFDIG1lc3NhZ2UgdG8gdGhlIGxvZzwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtc2dcIj50aGUgbWVzc2FnZSB0byB3cml0ZSB0byB0aGUgbG9nPC9wYXJhbT5cclxuICBXcml0ZVN1cHBvcnRUb0xvZyhtc2c6IHN0cmluZywgc2tpcExpbmU6IGJvb2xlYW4pOiB2b2lkIHtcclxuXHJcbiAgICBpZiAodGhpcy5Mb2dMZXZlbCA+PSBMb2dnZXJfTG9nTGV2ZWxzLlN1cHBvcnQgJiYgdGhpcy5Mb2dMZXZlbCAhPT0gTG9nZ2VyX0xvZ0xldmVscy5CYXNpYykge1xyXG4gICAgICBpZiAoc2tpcExpbmUpIHtcclxuICAgICAgICB0aGlzLldyaXRlVG9Mb2coXCJTVVBQT1JUOiBcIiArIG1zZywgZmFsc2UsIExvZ1R5cGUuaW5mbyk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5Xcml0ZVRvTG9nKFwiU1VQUE9SVDogXCIgKyBtc2cgKyBPU0Vudmlyb25tZW50LkVvbFNlcSArIFwiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cIiwgZmFsc2UsIExvZ1R5cGUuaW5mbyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gd3JpdGUgYSBwZXJmb3JtYW5jZSBtZXNzYWdlIHRvIHRoZSBsb2dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1zZ1wiPnRoZSBtZXNzYWdlIHRvIHdyaXRlIHRvIHRoZSBsb2c8L3BhcmFtPlxyXG4gIFdyaXRlR3VpVG9Mb2cobXNnOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICBpZiAodGhpcy5Mb2dMZXZlbCA+PSBMb2dnZXJfTG9nTGV2ZWxzLkd1aSAmJiB0aGlzLkxvZ0xldmVsICE9PSBMb2dnZXJfTG9nTGV2ZWxzLkJhc2ljKSB7XHJcbiAgICAgIHRoaXMuV3JpdGVUb0xvZyhtc2csIGZhbHNlLCBMb2dUeXBlLmluZm8pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyB3cml0ZSBhIGRldmVsb3BlciBtZXNzYWdlIHRvIHRoZSBsb2dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1zZ1wiPnRoZSBtZXNzYWdlIHRvIHdyaXRlIHRvIHRoZSBsb2c8L3BhcmFtPlxyXG4gIFdyaXRlRGV2VG9Mb2cobXNnOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLkxvZ0xldmVsID49IExvZ2dlcl9Mb2dMZXZlbHMuRGV2ZWxvcG1lbnQgJiYgdGhpcy5Mb2dMZXZlbCAhPT0gTG9nZ2VyX0xvZ0xldmVscy5CYXNpYykge1xyXG4gICAgICB0aGlzLldyaXRlVG9Mb2coXCJERVY6IFwiICsgbXNnLCBmYWxzZSwgTG9nVHlwZS5pbmZvKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gV3JpdGVzIGEgYmFzaWMgbGV2ZWwgZW50cnkgdG8gbG9nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtZXNzYWdlRGlyZWN0aW9uXCI+bWVzc2FnZSBkaXJlY3Rpb24gcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgbW9kdWxlIChSSUEgY2xpZW50KS4gQ2FuIGJlIGVpdGhlciBNZXNzYWdlRW50ZXJpbmcgb3IgTWVzc2FnZUxlYXZpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0YXR1c0NvZGVcIj5IVFRQIHN0YXR1cyBjb2RlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250ZW50TGVuZ3RoXCI+bGVuZ3RoIG9mIHRoZSBodHRwIG1lc3NhZ2U8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImh0dHBIZWFkZXJzXCI+SFRUUCBoZWFkZXJzPC9wYXJhbT5cclxuICBXcml0ZUJhc2ljVG9Mb2cobWVzc2FnZURpcmVjdGlvbjogTG9nZ2VyX01lc3NhZ2VEaXJlY3Rpb24sIGNvbnRleHRJRDogc3RyaW5nLCBzZXNzaW9uQ291bnRlcjogbnVtYmVyLCBjbGllbnRJRDogc3RyaW5nLCBzZXJ2ZXJJRDogc3RyaW5nLCByZXNwb25zZVRpbWU6IG51bWJlciwgc3RhdHVzQ29kZTogc3RyaW5nLCBodHRwSGVhZGVyczogc3RyaW5nLCBjb250ZW50TGVuZ3RoOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLkxvZ0xldmVsID09PSBMb2dnZXJfTG9nTGV2ZWxzLkJhc2ljKSB7XHJcbiAgICAgIGxldCB0ZXh0OiBzdHJpbmcgPSBodHRwSGVhZGVycztcclxuICAgICAgdGV4dCA9IHRleHQudHJpbSgpO1xyXG4gICAgICB0ZXh0ID0gTlN0cmluZy5SZXBsYWNlKHRleHQsIFwiXFxyXFxuXCIsIFwifFwiKTtcclxuICAgICAgbGV0IGFyZ19FNF8wOiBzdHJpbmcgPSBcIlJJQSx7MH1fezF9LHsyfSx7M30sezR9LHs1fSwtLHs2fSx7N30sezh9LHs5fSx7MTB9LHsxMX1cIjtcclxuICAgICAgbGV0IGV4cHJfM0U6IGFueVtdID0gbmV3IEFycmF5PGFueT4oMTIpO1xyXG5cclxuICAgICAgLy8gVE9ETyA6IG5lZWQgdG8gY2hlY2sgSG93IHRvIGhhbmRsZSBQcm9jZXNzIGNsYXNzLlxyXG4gICAgICAvLyBleHByXzNFWzBdID0gUHJvY2Vzcy5HZXRDdXJyZW50UHJvY2VzcygpLklkO1xyXG4gICAgICBleHByXzNFWzFdID0gVGhyZWFkLkN1cnJlbnRUaHJlYWQuTWFuYWdlZFRocmVhZElkO1xyXG4gICAgICBleHByXzNFWzJdID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xyXG4gICAgICBleHByXzNFWzNdID0gKChtZXNzYWdlRGlyZWN0aW9uID09PSBMb2dnZXJfTWVzc2FnZURpcmVjdGlvbi5NZXNzYWdlTGVhdmluZykgPyBcIk1TR0xcIiA6IFwiTVNHRVwiKTtcclxuICAgICAgZXhwcl8zRVs0XSA9IGNvbnRleHRJRDtcclxuICAgICAgZXhwcl8zRVs1XSA9IHNlc3Npb25Db3VudGVyO1xyXG4gICAgICBleHByXzNFWzZdID0gY2xpZW50SUQ7XHJcbiAgICAgIGV4cHJfM0VbN10gPSBzZXJ2ZXJJRDtcclxuICAgICAgZXhwcl8zRVs4XSA9ICgocmVzcG9uc2VUaW1lICE9PSAwKSA/IHJlc3BvbnNlVGltZS50b1N0cmluZygpIDogXCItXCIpO1xyXG4gICAgICBsZXQgYXJnX0QzXzE6IG51bWJlciA9IDk7XHJcbiAgICAgIGxldCBhcmdfRDNfMjogYW55O1xyXG4gICAgICBhcmdfRDNfMiA9IHN0YXR1c0NvZGU7XHJcbiAgICAgIGV4cHJfM0VbYXJnX0QzXzFdID0gYXJnX0QzXzI7XHJcbiAgICAgIGV4cHJfM0VbMTBdID0gdGV4dDtcclxuICAgICAgZXhwcl8zRVsxMV0gPSBjb250ZW50TGVuZ3RoO1xyXG4gICAgICBsZXQgdmFsdWU6IHN0cmluZyA9IE5TdHJpbmcuRm9ybWF0KGFyZ19FNF8wLCBleHByXzNFKTtcclxuICAgICAgY29uc29sZS5sb2codmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBXcml0ZXMgcmVxdWVzdCBpbmZvcm1hdGlvbiB0byBsb2dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNsaWVudFNlc3Npb25cIj5UaGUgY2xpZW50U2Vzc2lvbiBvYmplY3QgdG8gYmUgbG9nZ2VkPC9wYXJhbT5cclxuICBXcml0ZVJlcXVlc3RJbmZvVG9Mb2cocmVxdWVzdEluZm86IFJlcXVlc3RJbmZvLCBleHRyYU1lc3NhZ2VTdHI6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuTG9nTGV2ZWwgPT09IExvZ2dlcl9Mb2dMZXZlbHMuUmVxdWVzdEluZm8pIHtcclxuXHJcbiAgICAgIC8vIENocm9tZSBkZWJ1Z2dlciBhdXRvbWF0aWNhbGx5IHJlY29tcHV0ZXMgbG9nZ2VkIG9iamVjdHMuXHJcbiAgICAgIC8vIEhlbmNlLCBjbG9uZSB0aGUgcmVxdWVzdEluZm8gb2JqZWN0IHRvIHByaW50IHRoZSBkZXRhaWxzIGF0IHRoZSB0aW1lIG9mIGxvZ2dpbmdcclxuICAgICAgY29uc29sZS5sb2coZXh0cmFNZXNzYWdlU3RyLCBSZXF1ZXN0SW5mby5jbG9uZShyZXF1ZXN0SW5mbykpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBXcml0ZXMgYSByZXF1ZXN0IGV4Y2VwdGlvbiBiYXNpYyBsZXZlbCBlbnRyeSB0byBsb2dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRleHRJRFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic2Vzc2lvbkNvdW50ZXJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNsaWVudElEXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzZXJ2ZXJJRFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZXhcIj50aGUgbG9nZ2VkIGV4Y2VwdGlvbjwvcGFyYW0+XHJcbiAgV3JpdGVCYXNpY0Vycm9yVG9Mb2coKTogdm9pZCB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQodGhpcy5Mb2dMZXZlbCA9PT0gTG9nZ2VyX0xvZ0xldmVscy5CYXNpYyk7XHJcblxyXG4gICAgLy8gVE9ETyA6IE5lZWQgdG8gY2hlY2sgaG93IHRvIGhhbmRsZSBQcm9jZXNzXHJcbiAgICAvLyBsZXQgdmFsdWU6IHN0cmluZyA9IE5TdHJpbmcuRm9ybWF0KFwiUklBLHswfV97MX0sezJ9LHszfSx7NH0sezV9LC0sezZ9LHs3fSwtLC0sLSx7OH0gezl9XCIsIFtcclxuICAgIC8vIFByb2Nlc3MuR2V0Q3VycmVudFByb2Nlc3MoKS5JZCwgVGhyZWFkLkN1cnJlbnRUaHJlYWQuTWFuYWdlZFRocmVhZElkLCBEYXRlVGltZS5VdGNOb3cuVG9TdHJpbmcoXCJ5eXl5LU1NLWRkVEhIOm1tOnNzLmZmZmZmZmZaXCIpLCBcIlJFU1wiLCBjb250ZXh0SUQsIHNlc3Npb25Db3VudGVyLCBjbGllbnRJRCwgc2VydmVySUQsIGV4LkdldFR5cGUoKSwgZXguTWVzc2FnZVxyXG4gICAgLy8gXSk7XHJcbiAgICAvLyBOQ29uc29sZS5Xcml0ZUxpbmUodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBXcml0ZSBhbiBlcnJvciB0byB0aGUgbG9nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtc2dcIj50aGUgbWVzc2FnZSB0byB3cml0ZSB0byB0aGUgbG9nPC9wYXJhbT5cclxuICBXcml0ZUVycm9yVG9Mb2cobXNnOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuV3JpdGVUb0xvZyhcIk1hZ2ljV2ViIFtFUlJPUl06IFwiICsgU3RyVXRpbC5nZXRDb25zb2xlRXJvclN0cmluZyhtc2cpLCB0cnVlLCBMb2dUeXBlLmVycm9yKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gV3JpdGUgYW4gaW50ZXJuYWwgZXJyb3IgdG8gdGhlIGxvZy4gQWxzbyBwcmludHMgc3RhY2sgdHJhY2UgYWxvbmcgd2l0aCB0aGUgbWVzc2FnZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibXNnXCI+dGhlIG1lc3NhZ2UgdG8gd3JpdGUgdG8gdGhlIGxvZzwvcGFyYW0+XHJcbiAgV3JpdGVFeGNlcHRpb25Ub0xvZyhleDogRXhjZXB0aW9uKTogdm9pZDtcclxuICBXcml0ZUV4Y2VwdGlvblRvTG9nKGV4OiBFcnJvcik6IHZvaWQ7XHJcbiAgV3JpdGVFeGNlcHRpb25Ub0xvZyhleDogRXhjZXB0aW9uLCBtc2c6IHN0cmluZyk6IHZvaWQ7XHJcbiAgV3JpdGVFeGNlcHRpb25Ub0xvZyhtc2dPckV4OiBhbnksIG1zZz86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKG1zZ09yRXggaW5zdGFuY2VvZiBFcnJvcikge1xyXG4gICAgICB0aGlzLldyaXRlRXhjZXB0aW9uVG9Mb2dfMihtc2dPckV4LCBtc2cpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSAmJiAobXNnT3JFeCAhPT0gbnVsbCB8fCBtc2dPckV4IGluc3RhbmNlb2YgRXhjZXB0aW9uKSkge1xyXG4gICAgICB0aGlzLldyaXRlRXhjZXB0aW9uVG9Mb2dfMShtc2dPckV4KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuV3JpdGVFeGNlcHRpb25Ub0xvZ18zKG1zZ09yRXgsIG1zZyk7XHJcbiAgfVxyXG5cclxuICBXcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhtc2c6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5Xcml0ZVRvTG9nKFwiTWFnaWNXZWIgW0VSUk9SXTogXCIgKyBTdHJVdGlsLmdldENvbnNvbGVFcm9yU3RyaW5nKG1zZyksIHRydWUsIExvZ1R5cGUuZXJyb3IpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBXcml0ZUV4Y2VwdGlvblRvTG9nXzEoZXg6IEV4Y2VwdGlvbik6IHZvaWQge1xyXG4gICAgdGhpcy5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhOU3RyaW5nLkZvcm1hdChcInswfSA6IHsxfXsyfXszfXs0fVwiLCBbXHJcbiAgICAgIGV4LkdldFR5cGUoKSwgT1NFbnZpcm9ubWVudC5Fb2xTZXEsIGV4LlN0YWNrVHJhY2UsIE9TRW52aXJvbm1lbnQuRW9sU2VxLCBleC5NZXNzYWdlXHJcbiAgICBdKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIFdyaXRlRXhjZXB0aW9uVG9Mb2dfMihleDogRXJyb3IsIG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKG1lc3NhZ2UpKVxyXG4gICAgICB0aGlzLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKE5TdHJpbmcuRm9ybWF0KFwiezB9ezF9ezJ9XCIsIFtleC5zdGFjaywgT1NFbnZpcm9ubWVudC5Fb2xTZXEsIGV4Lm1lc3NhZ2VdKSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coTlN0cmluZy5Gb3JtYXQoXCJ7MH17MX17Mn17NH17NX1cIiwgW21lc3NhZ2UsIE9TRW52aXJvbm1lbnQuRW9sU2VxLCBleC5zdGFjaywgT1NFbnZpcm9ubWVudC5Fb2xTZXEsIGV4Lm1lc3NhZ2VdKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIFdyaXRlRXhjZXB0aW9uVG9Mb2dfMyhleDogRXhjZXB0aW9uLCBtc2c6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhOU3RyaW5nLkZvcm1hdChcInswfSwgezF9IDogezJ9ezN9ezR9ezV9XCIsIFtcclxuICAgICAgZXguR2V0VHlwZSgpLCBtc2csIE9TRW52aXJvbm1lbnQuRW9sU2VxLCBleC5TdGFja1RyYWNlLCBPU0Vudmlyb25tZW50LkVvbFNlcSwgZXguTWVzc2FnZVxyXG4gICAgXSkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiB3cml0ZSBhIHdhcm5pbmcgdG8gdGhlIGxvZzwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtc2dcIj50aGUgbWVzc2FnZSB0byB3cml0ZSB0byB0aGUgbG9nPC9wYXJhbT5cclxuICBXcml0ZVdhcm5pbmdUb0xvZyhleDogRXhjZXB0aW9uKTogdm9pZDtcclxuICBXcml0ZVdhcm5pbmdUb0xvZyhleDogRXhjZXB0aW9uLCBtc2c6IHN0cmluZyk6IHZvaWQ7XHJcbiAgV3JpdGVXYXJuaW5nVG9Mb2coZXg6IEVycm9yKTogdm9pZDtcclxuICBXcml0ZVdhcm5pbmdUb0xvZyhtc2dPckV4OiBhbnksIG1zZz86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgbXNnT3JFeCAhPT0gbnVsbCkge1xyXG4gICAgICBpZiAobXNnT3JFeCBpbnN0YW5jZW9mIEV4Y2VwdGlvbilcclxuICAgICAgICB0aGlzLldyaXRlV2FybmluZ1RvTG9nXzEobXNnT3JFeCk7XHJcbiAgICAgIGVsc2UgaWYgKG1zZ09yRXggaW5zdGFuY2VvZiBFcnJvcilcclxuICAgICAgICB0aGlzLldyaXRlV2FybmluZ1RvTG9nXzIobXNnT3JFeCk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuV3JpdGVXYXJuaW5nVG9Mb2dfMyhtc2dPckV4LCBtc2cpO1xyXG4gIH1cclxuXHJcbiAgV3JpdGVXYXJuaW5nVG9Mb2dXaXRoTXNnKG1zZzogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgaWYgKHRoaXMuTG9nTGV2ZWwgIT09IExvZ2dlcl9Mb2dMZXZlbHMuQmFzaWMpIHtcclxuICAgICAgdGhpcy5Xcml0ZVRvTG9nKFwiTWFnaWNXZWIgW1dBUk5JTkddOiBcIiArIG1zZywgdHJ1ZSwgTG9nVHlwZS53YXJuaW5nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgV3JpdGVXYXJuaW5nVG9Mb2dfMShleDogRXhjZXB0aW9uKTogdm9pZCB7XHJcbiAgICB0aGlzLldyaXRlV2FybmluZ1RvTG9nV2l0aE1zZyhleC5HZXRUeXBlKCkgKyBcIiA6IFwiICsgT1NFbnZpcm9ubWVudC5Fb2xTZXEgKyBleC5TdGFja1RyYWNlICsgT1NFbnZpcm9ubWVudC5Fb2xTZXEgKyBleC5NZXNzYWdlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgV3JpdGVXYXJuaW5nVG9Mb2dfMihleDogRXJyb3IpOiB2b2lkIHtcclxuICAgIHRoaXMuV3JpdGVXYXJuaW5nVG9Mb2dXaXRoTXNnKE5TdHJpbmcuRm9ybWF0KFwiezB9ezF9ezJ9XCIsIFtcclxuICAgICAgZXguc3RhY2ssIE9TRW52aXJvbm1lbnQuRW9sU2VxLCBleC5tZXNzYWdlXHJcbiAgICBdKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIFdyaXRlV2FybmluZ1RvTG9nXzMoZXg6IEV4Y2VwdGlvbiwgbXNnOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuV3JpdGVXYXJuaW5nVG9Mb2dXaXRoTXNnKE5TdHJpbmcuRm9ybWF0KFwiezB9LCB7MX0gOiB7Mn17M317NH17NX1cIiwgW1xyXG4gICAgICBleC5HZXRUeXBlKCksIG1zZywgT1NFbnZpcm9ubWVudC5Fb2xTZXEsIGV4LlN0YWNrVHJhY2UsIE9TRW52aXJvbm1lbnQuRW9sU2VxLCBleC5NZXNzYWdlXHJcbiAgICBdKSk7XHJcbiAgfVxyXG5cclxuICBXcml0ZVN0YWNrVHJhY2Uoc3RhY2tUcmFjZTogU3RhY2tUcmFjZSwgZnJhbWVzVG9QcmludDogbnVtYmVyLCB0cmFjZVRpdGxlOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICBpZiAodHJhY2VUaXRsZSA9PT0gbnVsbCkge1xyXG4gICAgICB0cmFjZVRpdGxlID0gXCJTdGFjayB0cmFjZTpcIjtcclxuICAgIH1cclxuICAgIGxldCBzdHJpbmdCdWlsZGVyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIodHJhY2VUaXRsZSArIE9TRW52aXJvbm1lbnQuRW9sU2VxKTtcclxuICAgIGxldCBmcmFtZXM6IEpTU3RhY2tGcmFtZVtdID0gc3RhY2tUcmFjZS5HZXRGcmFtZXMoKTtcclxuICAgIGxldCBhcnJheTogSlNTdGFja0ZyYW1lW10gPSBmcmFtZXM7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgbGV0IHN0YWNrRnJhbWU6IEpTU3RhY2tGcmFtZSA9IGFycmF5W2ldO1xyXG4gICAgICBmcmFtZXNUb1ByaW50ID0gZnJhbWVzVG9QcmludCAtIDE7XHJcblxyXG4gICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZChzdGFja0ZyYW1lLnRvU3RyaW5nKCkpO1xyXG5cclxuICAgICAgaWYgKGZyYW1lc1RvUHJpbnQgPT09IDApIHtcclxuICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZChcIlxcdC4uLiBtb3JlIHN0YWNrIGZyYW1lcyAuLi5cXG5cIik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuV3JpdGVUb0xvZyhzdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCksIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBGbHVzaCB0aGUgbG9nIHdyaXRlci5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEZsdXNoKCk6IHZvaWQge1xyXG5cclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
export var MagicProperties;
|
|
2
|
-
(function (MagicProperties) {
|
|
3
|
-
MagicProperties["LineDivider"] = "line_divider";
|
|
4
|
-
MagicProperties["ImageFile"] = "image_file";
|
|
5
|
-
MagicProperties["Wallpaper"] = "wallpaper";
|
|
6
|
-
})(MagicProperties || (MagicProperties = {}));
|
|
7
|
-
export var BindingLevel;
|
|
8
|
-
(function (BindingLevel) {
|
|
9
|
-
BindingLevel[BindingLevel["Control"] = 1] = "Control";
|
|
10
|
-
BindingLevel[BindingLevel["Character"] = 2] = "Character";
|
|
11
|
-
})(BindingLevel || (BindingLevel = {}));
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWFnaWNDb25zdGFudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91dGlscy9zcmMvTWFnaWNDb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFOLElBQVksZUFJWDtBQUpELFdBQVksZUFBZTtJQUN6QiwrQ0FBNEIsQ0FBQTtJQUM1QiwyQ0FBd0IsQ0FBQTtJQUN4QiwwQ0FBdUIsQ0FBQTtBQUN6QixDQUFDLEVBSlcsZUFBZSxLQUFmLGVBQWUsUUFJMUI7QUFFRCxNQUFNLENBQU4sSUFBWSxZQUlYO0FBSkQsV0FBWSxZQUFZO0lBRXRCLHFEQUFXLENBQUE7SUFDWCx5REFBUyxDQUFBO0FBQ1gsQ0FBQyxFQUpXLFlBQVksS0FBWixZQUFZLFFBSXZCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGVudW0gTWFnaWNQcm9wZXJ0aWVzIHtcclxuICBMaW5lRGl2aWRlciA9IFwibGluZV9kaXZpZGVyXCIsXHJcbiAgSW1hZ2VGaWxlID0gXCJpbWFnZV9maWxlXCIsXHJcbiAgV2FsbHBhcGVyID0gXCJ3YWxscGFwZXJcIixcclxufVxyXG5cclxuZXhwb3J0IGVudW0gQmluZGluZ0xldmVsXHJcbntcclxuICBDb250cm9sID0gMSxcclxuICBDaGFyYWN0ZXJcclxufVxyXG4iXX0=
|
package/esm2022/src/Misc.mjs
DELETED
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import { StringBuilder, NString, NNumber, DateTime, RefParam } from "@magic-xpa/mscorelib";
|
|
2
|
-
export class Misc {
|
|
3
|
-
static WriteStackTrace(throwable) {
|
|
4
|
-
console.log(throwable.Message);
|
|
5
|
-
console.log(throwable.StackTrace);
|
|
6
|
-
}
|
|
7
|
-
static ToSByteArray(byteArray) {
|
|
8
|
-
let sbyteArray = null;
|
|
9
|
-
if (byteArray !== null) {
|
|
10
|
-
sbyteArray = new Int8Array(byteArray.length);
|
|
11
|
-
for (let i = 0; i < byteArray.length; i = i + 1) {
|
|
12
|
-
sbyteArray[i] = byteArray[i];
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
return sbyteArray;
|
|
16
|
-
}
|
|
17
|
-
static ToByteArray(sbyteArray) {
|
|
18
|
-
let byteArray = null;
|
|
19
|
-
if (sbyteArray !== null) {
|
|
20
|
-
byteArray = new Uint8Array(sbyteArray.length);
|
|
21
|
-
for (let i = 0; i < sbyteArray.length; i = i + 1) {
|
|
22
|
-
byteArray[i] = sbyteArray[i];
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
return byteArray;
|
|
26
|
-
}
|
|
27
|
-
static CompareByteArray(source, destination, numberOfBytes) {
|
|
28
|
-
if (source.length >= numberOfBytes && destination.length >= numberOfBytes) {
|
|
29
|
-
for (let len = 0; len < numberOfBytes; len++) {
|
|
30
|
-
if (source[len] !== destination[len])
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
else
|
|
35
|
-
return false;
|
|
36
|
-
return true;
|
|
37
|
-
}
|
|
38
|
-
static URShift(number, bits) {
|
|
39
|
-
let result;
|
|
40
|
-
if (number >= 0) {
|
|
41
|
-
result = number >> bits;
|
|
42
|
-
}
|
|
43
|
-
else {
|
|
44
|
-
result = (number >> bits) + (2 << ~bits);
|
|
45
|
-
}
|
|
46
|
-
return result;
|
|
47
|
-
}
|
|
48
|
-
static getSystemMilliseconds() {
|
|
49
|
-
return Math.floor((DateTime.Now.Ticks - 621355968000000000) / 10000);
|
|
50
|
-
}
|
|
51
|
-
static CompareIntArrays(arrayOne, arrayTwo) {
|
|
52
|
-
let areEqual = false;
|
|
53
|
-
if (arrayOne === arrayTwo) {
|
|
54
|
-
areEqual = true;
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
if (arrayOne !== null && arrayTwo !== null) {
|
|
58
|
-
if (arrayOne.length === arrayTwo.length) {
|
|
59
|
-
for (let i = 0; i < arrayOne.length; i = i + 1) {
|
|
60
|
-
if (arrayOne[i] !== arrayTwo[i]) {
|
|
61
|
-
break;
|
|
62
|
-
}
|
|
63
|
-
areEqual = true;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
return areEqual;
|
|
69
|
-
}
|
|
70
|
-
static GetCommaSeperatedString(intArray) {
|
|
71
|
-
let temp = new StringBuilder();
|
|
72
|
-
for (let val = 0; val < intArray.length; val = val + 1) {
|
|
73
|
-
let value = intArray[val];
|
|
74
|
-
if (temp.Length > 0) {
|
|
75
|
-
temp.Append(",");
|
|
76
|
-
}
|
|
77
|
-
temp.Append(value);
|
|
78
|
-
}
|
|
79
|
-
return temp.ToString();
|
|
80
|
-
}
|
|
81
|
-
static GetIntArray(commaSeparatedValue) {
|
|
82
|
-
let intArray = new Array(0);
|
|
83
|
-
if (!NString.IsNullOrEmpty(commaSeparatedValue)) {
|
|
84
|
-
let vals = commaSeparatedValue.split(',');
|
|
85
|
-
intArray = new Array(vals.length);
|
|
86
|
-
let outInt = new RefParam(0);
|
|
87
|
-
for (let iCtr = 0; iCtr < vals.length; iCtr = iCtr + 1) {
|
|
88
|
-
NNumber.TryParse(vals[iCtr], outInt);
|
|
89
|
-
intArray[iCtr] = outInt.value;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
return intArray;
|
|
93
|
-
}
|
|
94
|
-
static IsWebUrl(fileName) {
|
|
95
|
-
return fileName.toLowerCase().startsWith("http");
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlzYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3V0aWxzL3NyYy9NaXNjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVVBLE9BQU8sRUFDTSxhQUFhLEVBQ3hCLE9BQU8sRUFBRSxPQUFPLEVBQ2hCLFFBQVEsRUFBRSxRQUFRLEVBQ25CLE1BQU0sc0JBQXNCLENBQUM7QUFPOUIsTUFBTSxPQUFPLElBQUk7SUFPZixNQUFNLENBQUMsZUFBZSxDQUFDLFNBQW9CO1FBQ3pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFPRCxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQXFCO1FBQ3ZDLElBQUksVUFBVSxHQUFjLElBQUksQ0FBQztRQUNqQyxJQUFJLFNBQVMsS0FBSyxJQUFJLEVBQUU7WUFDdEIsVUFBVSxHQUFHLElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3QyxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDdkQsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFXLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN0QztTQUNGO1FBQ0QsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQU9ELE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBcUI7UUFDdEMsSUFBSSxTQUFTLEdBQWUsSUFBSSxDQUFDO1FBQ2pDLElBQUksVUFBVSxLQUFLLElBQUksRUFBRTtZQUN2QixTQUFTLEdBQUcsSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzlDLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxF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QyxXQUFXLENBQUMsbUJBQTJCO1FBQzVDLElBQUksUUFBUSxHQUFhLElBQUksS0FBSyxDQUFTLENBQUMsQ0FBQyxDQUFDO1FBRTlDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDL0MsSUFBSSxJQUFJLEdBQWEsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BELFFBQVEsR0FBRyxJQUFJLEtBQUssQ0FBUyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFMUMsSUFBSSxNQUFNLEdBQXFCLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9DLEtBQUssSUFBSSxJQUFJLEdBQVcsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxFQUFFO2dCQUM5RCxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDckMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7YUFDL0I7U0FDRjtRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQWdCO1FBQzlCLE9BQU8sUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuRCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbiBvcmRlciB0byBjb252ZXJ0IHNvbWUgZnVuY3Rpb25hbGl0eSB0byBWaXN1YWwgQyMsIHRoZSBKYXZhIExhbmd1YWdlIENvbnZlcnNpb24gQXNzaXN0YW50XHJcbi8vIGNyZWF0ZXMgXCJzdXBwb3J0IGNsYXNzZXNcIiB0aGF0IGR1cGxpY2F0ZSB0aGUgb3JpZ2luYWwgZnVuY3Rpb25hbGl0eS5cclxuLy9cclxuLy8gU3VwcG9ydCBjbGFzc2VzIHJlcGxpY2F0ZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgb3JpZ2luYWwgY29kZSwgYnV0IGluIHNvbWUgY2FzZXMgdGhleSBhcmVcclxuLy8gc3Vic3RhbnRpYWxseSBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJhbGx5LiBBbHRob3VnaCBldmVyeSBlZmZvcnQgaXMgbWFkZSB0byBwcmVzZXJ2ZSB0aGVcclxuLy8gb3JpZ2luYWwgYXJjaGl0ZWN0dXJlIG9mIHRoZSBhcHBsaWNhdGlvbiBpbiB0aGUgY29udmVydGVkIHByb2plY3QsIHRoZSB1c2VyIHNob3VsZCBiZSBhd2FyZSB0aGF0XHJcbi8vIHRoZSBwcmltYXJ5IGdvYWwgb2YgdGhlc2Ugc3VwcG9ydCBjbGFzc2VzIGlzIHRvIHJlcGxpY2F0ZSBmdW5jdGlvbmFsaXR5LCBhbmQgdGhhdCBhdCB0aW1lc1xyXG4vLyB0aGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSByZXN1bHRpbmcgc29sdXRpb24gbWF5IGRpZmZlciBzb21ld2hhdC5cclxuXHJcblxyXG5pbXBvcnQge1xyXG4gIEV4Y2VwdGlvbiwgU3RyaW5nQnVpbGRlcixcclxuICBOU3RyaW5nLCBOTnVtYmVyLFxyXG4gIERhdGVUaW1lLCBSZWZQYXJhbVxyXG59IGZyb20gXCJAbWFnaWMteHBhL21zY29yZWxpYlwiO1xyXG5cclxuXHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyBDb250YWlucyBjb252ZXJzaW9uIHN1cHBvcnQgZWxlbWVudHMgc3VjaCBhcyBjbGFzc2VzLCBpbnRlcmZhY2VzIGFuZCBzdGF0aWMgbWV0aG9kcy5cclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIE1pc2Mge1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFdyaXRlcyB0aGUgZXhjZXB0aW9uIHN0YWNrIHRyYWNlIHRvIHRoZSByZWNlaXZlZCBzdHJlYW1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRocm93YWJsZVwiPkV4Y2VwdGlvbiB0byBvYnRhaW4gaW5mb3JtYXRpb24gZnJvbTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3RyZWFtXCI+T3V0cHV0IHNyZWFtIHVzZWQgdG8gd3JpdGUgdG88L3BhcmFtPlxyXG4gIHN0YXRpYyBXcml0ZVN0YWNrVHJhY2UodGhyb3dhYmxlOiBFeGNlcHRpb24pOiB2b2lkIHtcclxuICAgIGNvbnNvbGUubG9nKHRocm93YWJsZS5NZXNzYWdlKTtcclxuICAgIGNvbnNvbGUubG9nKHRocm93YWJsZS5TdGFja1RyYWNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmVjZWl2ZXMgYSBieXRlIGFycmF5IGFuZCByZXR1cm5zIGl0IHRyYW5zZm9ybWVkIGluIGFuIGJ5dGUgYXJyYXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImJ5dGVBcnJheVwiPkJ5dGUgYXJyYXkgdG8gcHJvY2VzczwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPlRoZSB0cmFuc2Zvcm1lZCBhcnJheTwvcmV0dXJucz5cclxuICBzdGF0aWMgVG9TQnl0ZUFycmF5KGJ5dGVBcnJheTogVWludDhBcnJheSk6IEludDhBcnJheSB7XHJcbiAgICBsZXQgc2J5dGVBcnJheTogSW50OEFycmF5ID0gbnVsbDtcclxuICAgIGlmIChieXRlQXJyYXkgIT09IG51bGwpIHtcclxuICAgICAgc2J5dGVBcnJheSA9IG5ldyBJbnQ4QXJyYXkoYnl0ZUFycmF5Lmxlbmd0aCk7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBieXRlQXJyYXkubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICBzYnl0ZUFycmF5W2ldID0gPG51bWJlcj5ieXRlQXJyYXlbaV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzYnl0ZUFycmF5O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZWNlaXZlcyBzYnl0ZSBhcnJheSBhbmQgcmV0dXJucyBpdCB0cmFuc2Zvcm1lZCBpbiBhIGJ5dGUgYXJyYXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNieXRlQXJyYXlcIj5zYnl0ZSBhcnJheSB0byBwcm9jZXNzPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+VGhlIHRyYW5zZm9ybWVkIGFycmF5PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBUb0J5dGVBcnJheShzYnl0ZUFycmF5OiBJbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcclxuICAgIGxldCBieXRlQXJyYXk6IFVpbnQ4QXJyYXkgPSBudWxsO1xyXG4gICAgaWYgKHNieXRlQXJyYXkgIT09IG51bGwpIHtcclxuICAgICAgYnl0ZUFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoc2J5dGVBcnJheS5sZW5ndGgpO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgc2J5dGVBcnJheS5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIGJ5dGVBcnJheVtpXSA9IDxudW1iZXI+c2J5dGVBcnJheVtpXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJ5dGVBcnJheTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gQ29tcGFyZXMgbnVtYmVyIG9mIGJ5dGVzIGluIHR3byBieXRlIGFycmF5czwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzb3VyY2VcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRlc3RpbmF0aW9uXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJudW1iZXJPZkJ5dGVzXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGJvb2xlbiB0cnVlIGlmIGVxdWFsPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBDb21wYXJlQnl0ZUFycmF5KHNvdXJjZTogVWludDhBcnJheSwgZGVzdGluYXRpb246IFVpbnQ4QXJyYXksIG51bWJlck9mQnl0ZXM6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHNvdXJjZS5sZW5ndGggPj0gbnVtYmVyT2ZCeXRlcyAmJiBkZXN0aW5hdGlvbi5sZW5ndGggPj0gbnVtYmVyT2ZCeXRlcykge1xyXG4gICAgICBmb3IgKGxldCBsZW46IG51bWJlciA9IDA7IGxlbiA8IG51bWJlck9mQnl0ZXM7IGxlbisrKSB7XHJcbiAgICAgICAgaWYgKHNvdXJjZVtsZW5dICE9PSBkZXN0aW5hdGlvbltsZW5dKVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUGVyZm9ybXMgYW4gdW5zaWduZWQgYml0d2lzZSByaWdodCBzaGlmdCB3aXRoIHRoZSBzcGVjaWZpZWQgbnVtYmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJudW1iZXJcIj5OdW1iZXIgdG8gb3BlcmF0ZSBvbjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiYml0c1wiPkFtbW91bnQgb2YgYml0cyB0byBzaGlmdDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPlRoZSByZXN1bHRpbmcgbnVtYmVyIGZyb20gdGhlIHNoaWZ0IG9wZXJhdGlvbjwvcmV0dXJucz5cclxuICAvLyBUT0RPOiBpbnN0ZWFkIG9mIGNhbGxpbmcgVVJTaGlmdChudW1iZXIsIGJpdHMpLCB3ZSBjYW4gdXNlKCh1aW50KW51bWJlcikgPj4gYml0cy5cclxuICBzdGF0aWMgVVJTaGlmdChudW1iZXI6IG51bWJlciwgYml0czogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCByZXN1bHQ6IG51bWJlcjtcclxuICAgIGlmIChudW1iZXIgPj0gMCkge1xyXG4gICAgICByZXN1bHQgPSBudW1iZXIgPj4gYml0cztcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXN1bHQgPSAobnVtYmVyID4+IGJpdHMpICsgKDIgPDwgfmJpdHMpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZ2V0IHN5c3RlbSdzIHRpbWUgaW4gbWlsbGlzZWNvbmRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBnZXRTeXN0ZW1NaWxsaXNlY29uZHMoKTogbnVtYmVyIHtcclxuICAgIC8vIFRPRE8gLSBjaGVjayBpZiB3ZSBuZWVkIHRoaXMgYWRqdXN0bWVudFxyXG4gICAgcmV0dXJuIE1hdGguZmxvb3IoKERhdGVUaW1lLk5vdy5UaWNrcyAtIDYyMTM1NTk2ODAwMDAwMDAwMCkgLyAxMDAwMCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENvbXBhcmVzIDIgaW50IGFycmF5c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiYXJyYXlPbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImFycmF5VHdvXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+dHJ1ZSBpZiBhcnJheXMgYXJlIGVxdWFsIGVsc2UgZmFsc2U8L3JldHVybnM+XHJcbiAgc3RhdGljIENvbXBhcmVJbnRBcnJheXMoYXJyYXlPbmU6IG51bWJlcltdLCBhcnJheVR3bzogbnVtYmVyW10pOiBib29sZWFuIHtcclxuICAgIGxldCBhcmVFcXVhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKGFycmF5T25lID09PSBhcnJheVR3bykge1xyXG4gICAgICBhcmVFcXVhbCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKGFycmF5T25lICE9PSBudWxsICYmIGFycmF5VHdvICE9PSBudWxsKSB7XHJcbiAgICAgICAgaWYgKGFycmF5T25lLmxlbmd0aCA9PT0gYXJyYXlUd28ubGVuZ3RoKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgYXJyYXlPbmUubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICAgICAgaWYgKGFycmF5T25lW2ldICE9PSBhcnJheVR3b1tpXSkge1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGFyZUVxdWFsID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcmVFcXVhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmV0dXJucyB0aGUgY29tbWEgc2VwYXJhdGVkIHN0cmluZyBmb3IgdGhlIHZhbHVlcyBwYXNzZWQgaW4gaW50IGFycmF5LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVzXCI+SW50ZWdlciBhcnJheTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPmNvbW1hIHNlcGFyYXRlZCBzdHJpbmc8L3JldHVybnM+XHJcbiAgc3RhdGljIEdldENvbW1hU2VwZXJhdGVkU3RyaW5nKGludEFycmF5OiBudW1iZXJbXSk6IHN0cmluZyB7XHJcbiAgICBsZXQgdGVtcDogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICBmb3IgKGxldCB2YWw6IG51bWJlciA9IDA7IHZhbCA8IGludEFycmF5Lmxlbmd0aDsgdmFsID0gdmFsICsgMSkge1xyXG4gICAgICBsZXQgdmFsdWU6IG51bWJlciA9IGludEFycmF5W3ZhbF07XHJcbiAgICAgIGlmICh0ZW1wLkxlbmd0aCA+IDApIHtcclxuICAgICAgICB0ZW1wLkFwcGVuZChcIixcIik7XHJcbiAgICAgIH1cclxuICAgICAgdGVtcC5BcHBlbmQodmFsdWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRlbXAuVG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmV0dXJucyBpbnQgYXJyYXkgb3V0IG9mIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlXCI+Y29tbWEgc2VwYXJhdGVkIHN0cmluZzwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPkludGVnZXIgYXJyYXk8L3JldHVybnM+XHJcbiAgc3RhdGljIEdldEludEFycmF5KGNvbW1hU2VwYXJhdGVkVmFsdWU6IHN0cmluZyk6IG51bWJlcltdIHtcclxuICAgIGxldCBpbnRBcnJheTogbnVtYmVyW10gPSBuZXcgQXJyYXk8bnVtYmVyPigwKTtcclxuXHJcbiAgICBpZiAoIU5TdHJpbmcuSXNOdWxsT3JFbXB0eShjb21tYVNlcGFyYXRlZFZhbHVlKSkge1xyXG4gICAgICBsZXQgdmFsczogc3RyaW5nW10gPSBjb21tYVNlcGFyYXRlZFZhbHVlLnNwbGl0KCcsJyk7XHJcbiAgICAgIGludEFycmF5ID0gbmV3IEFycmF5PG51bWJlcj4odmFscy5sZW5ndGgpO1xyXG5cclxuICAgICAgbGV0IG91dEludDogUmVmUGFyYW08bnVtYmVyPiA9IG5ldyBSZWZQYXJhbSgwKTtcclxuICAgICAgZm9yIChsZXQgaUN0cjogbnVtYmVyID0gMDsgaUN0ciA8IHZhbHMubGVuZ3RoOyBpQ3RyID0gaUN0ciArIDEpIHtcclxuICAgICAgICBOTnVtYmVyLlRyeVBhcnNlKHZhbHNbaUN0cl0sIG91dEludCk7XHJcbiAgICAgICAgaW50QXJyYXlbaUN0cl0gPSBvdXRJbnQudmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaW50QXJyYXk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgSXNXZWJVcmwoZmlsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGZpbGVOYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChcImh0dHBcIik7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|