@magic-xpa/gui 4.800.0-dev480.94 → 4.801.0-dev000.0
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/{esm2015/index.js → esm2020/index.mjs} +0 -0
- package/{esm2015/magic-xpa-gui.js → esm2020/magic-xpa-gui.mjs} +0 -0
- package/esm2020/src/Commands.mjs +186 -0
- package/esm2020/src/Events.mjs +420 -0
- package/esm2020/src/EventsProcessor.mjs +67 -0
- package/esm2020/src/FocusManager.mjs +34 -0
- package/{esm2015/src/GuiConstants.js → esm2020/src/GuiConstants.mjs} +0 -0
- package/{esm2015/src/GuiEnums.js → esm2020/src/GuiEnums.mjs} +126 -127
- package/{esm2015/src/GuiEnvironment.js → esm2020/src/GuiEnvironment.mjs} +0 -0
- package/{esm2015/src/IFlowMonitorQueue.js → esm2020/src/IFlowMonitorQueue.mjs} +2 -1
- package/esm2020/src/Manager.mjs +192 -0
- package/{esm2015/src/UIBridge.js → esm2020/src/UIBridge.mjs} +0 -0
- package/{esm2015/src/env/IEnvironment.js → esm2020/src/env/IEnvironment.mjs} +2 -1
- package/{esm2015/src/gui/ControlBase.js → esm2020/src/gui/ControlBase.mjs} +0 -0
- package/{esm2015/src/gui/GuiMgControl.js → esm2020/src/gui/GuiMgControl.mjs} +0 -0
- package/{esm2015/src/gui/GuiMgForm.js → esm2020/src/gui/GuiMgForm.mjs} +0 -0
- package/{esm2015/src/gui/KeyboardItem.js → esm2020/src/gui/KeyboardItem.mjs} +0 -0
- package/{esm2015/src/gui/LastFocusedVal.js → esm2020/src/gui/LastFocusedVal.mjs} +0 -0
- package/{esm2015/src/gui/MgValue.js → esm2020/src/gui/MgValue.mjs} +0 -0
- package/{esm2015/src/gui/PropParentInterface.js → esm2020/src/gui/PropParentInterface.mjs} +1 -0
- package/{esm2015/src/gui/low/DialogHandler.js → esm2020/src/gui/low/DialogHandler.mjs} +0 -0
- package/{esm2015/src/gui/low/GuiCommand.js → esm2020/src/gui/low/GuiCommand.mjs} +0 -0
- package/{esm2015/src/gui/low/GuiCommandQueue.js → esm2020/src/gui/low/GuiCommandQueue.mjs} +0 -0
- package/esm2020/src/gui/low/GuiInteractive.mjs +545 -0
- package/esm2020/src/gui/low/Style.mjs +47 -0
- package/esm2020/src/management/RuntimeContextBase.mjs +52 -0
- package/{esm2015/src/management/data/BlobType.js → esm2020/src/management/data/BlobType.mjs} +0 -0
- package/esm2020/src/management/data/DcValues.mjs +214 -0
- package/esm2020/src/management/data/DcValuesBuilderBase.mjs +97 -0
- package/{esm2015/src/management/data/FieldDef.js → esm2020/src/management/data/FieldDef.mjs} +0 -0
- package/{esm2015/src/management/data/FieldsTable.js → esm2020/src/management/data/FieldsTable.mjs} +0 -0
- package/esm2020/src/management/data/GuiDataViewBase.mjs +90 -0
- package/esm2020/src/management/data/GuiFieldBase.mjs +82 -0
- package/{esm2015/src/management/data/IRecord.js → esm2020/src/management/data/IRecord.mjs} +1 -0
- package/{esm2015/src/management/data/IReferencedObject.js → esm2020/src/management/data/IReferencedObject.mjs} +1 -0
- package/{esm2015/src/management/data/NUM_TYPE.js → esm2020/src/management/data/NUM_TYPE.mjs} +0 -0
- package/esm2020/src/management/data/ObjectReferenceBase.mjs +48 -0
- package/{esm2015/src/management/data/ObjectReferencesCollection.js → esm2020/src/management/data/ObjectReferencesCollection.mjs} +0 -0
- package/esm2020/src/management/data/RecordUtils.mjs +361 -0
- package/{esm2015/src/management/data/VectorType.js → esm2020/src/management/data/VectorType.mjs} +0 -0
- package/{esm2015/src/management/data/VectorTypeBase.js → esm2020/src/management/data/VectorTypeBase.mjs} +0 -0
- package/{esm2015/src/management/events/IActionManager.js → esm2020/src/management/events/IActionManager.mjs} +1 -0
- package/esm2020/src/management/events/IGuiEventsManager.mjs +2 -0
- package/{esm2015/src/management/exp/ExpressionInterface.js → esm2020/src/management/exp/ExpressionInterface.mjs} +2 -1
- package/esm2020/src/management/exp/GuiExpressionEvaluator.mjs +333 -0
- package/{esm2015/src/management/gui/ControlTable.js → esm2020/src/management/gui/ControlTable.mjs} +0 -0
- package/esm2020/src/management/gui/DisplayConvertor.mjs +1706 -0
- package/esm2020/src/management/gui/FieldValidator.mjs +1507 -0
- package/esm2020/src/management/gui/GuiControlPropertyAdapter.mjs +22 -0
- package/{esm2015/src/management/gui/GuiFormPropertyAdapter.js → esm2020/src/management/gui/GuiFormPropertyAdapter.mjs} +0 -0
- package/{esm2015/src/management/gui/HebrewDate.js → esm2020/src/management/gui/HebrewDate.mjs} +0 -0
- package/{esm2015/src/management/gui/Helps.js → esm2020/src/management/gui/Helps.mjs} +0 -0
- package/esm2020/src/management/gui/MgControlBase.mjs +1873 -0
- package/esm2020/src/management/gui/MgFormBase.mjs +748 -0
- package/esm2020/src/management/gui/PIC.mjs +1178 -0
- package/esm2020/src/management/gui/PropDefaults.mjs +230 -0
- package/{esm2015/src/management/gui/PropInterface.js → esm2020/src/management/gui/PropInterface.mjs} +2 -4
- package/esm2020/src/management/gui/PropTable.mjs +221 -0
- package/esm2020/src/management/gui/Property.mjs +1382 -0
- package/{esm2015/src/management/gui/ValidationDetails.js → esm2020/src/management/gui/ValidationDetails.mjs} +0 -0
- package/{esm2015/src/management/gui/ValidationDetailsBase.js → esm2020/src/management/gui/ValidationDetailsBase.mjs} +0 -0
- package/{esm2015/src/management/gui/WrongFormatException.js → esm2020/src/management/gui/WrongFormatException.mjs} +0 -0
- package/{esm2015/src/management/tasks/GuiDataCollection.js → esm2020/src/management/tasks/GuiDataCollection.mjs} +0 -0
- package/esm2020/src/management/tasks/GuiTaskBase.mjs +502 -0
- package/{esm2015/src/management/tasks/IMGDataTable.js → esm2020/src/management/tasks/IMGDataTable.mjs} +1 -0
- package/{esm2015/src/management/tasks/ITask.js → esm2020/src/management/tasks/ITask.mjs} +1 -0
- package/esm2020/src/management/tasks/MgTimer.mjs +21 -0
- package/esm2020/src/management/tasks/TaskDefinitionId.mjs +54 -0
- package/esm2020/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs +41 -0
- package/{esm2015/src/util/AuthenticationDialogHandler.js → esm2020/src/util/AuthenticationDialogHandler.mjs} +0 -0
- package/{esm2015/src/util/MemoryUtil.js → esm2020/src/util/MemoryUtil.mjs} +0 -0
- package/{esm2015/src/util/ObjectReference.js → esm2020/src/util/ObjectReference.mjs} +0 -0
- package/esm2020/src/util/ProcessLauncher.mjs +32 -0
- package/esm2020/src/util/UsernamePasswordCredentials.mjs +52 -0
- package/fesm2015/{magic-xpa-gui.js → magic-xpa-gui.mjs} +305 -365
- package/fesm2015/magic-xpa-gui.mjs.map +1 -0
- package/fesm2020/magic-xpa-gui.mjs +17805 -0
- package/fesm2020/magic-xpa-gui.mjs.map +1 -0
- package/package.json +27 -14
- package/src/Commands.d.ts +1 -0
- package/src/Events.d.ts +2 -2
- package/src/EventsProcessor.d.ts +1 -1
- package/src/GuiEnums.d.ts +125 -126
- package/src/IFlowMonitorQueue.d.ts +1 -1
- package/src/Manager.d.ts +2 -3
- package/src/env/IEnvironment.d.ts +1 -0
- package/src/gui/low/GuiInteractive.d.ts +3 -1
- package/src/gui/low/Style.d.ts +0 -3
- package/src/management/RuntimeContextBase.d.ts +2 -0
- package/src/management/data/DcValues.d.ts +1 -1
- package/src/management/data/DcValuesBuilderBase.d.ts +1 -1
- package/src/management/data/RecordUtils.d.ts +0 -3
- package/src/management/events/IGuiEventsManager.d.ts +5 -5
- package/src/management/exp/ExpressionInterface.d.ts +1 -0
- package/src/management/exp/GuiExpressionEvaluator.d.ts +2 -2
- package/src/management/gui/DisplayConvertor.d.ts +6 -6
- package/src/management/gui/GuiControlPropertyAdapter.d.ts +6 -6
- package/src/management/gui/MgControlBase.d.ts +4 -5
- package/src/management/gui/MgFormBase.d.ts +1 -1
- package/src/management/gui/PropInterface.d.ts +2 -4
- package/src/management/gui/PropTable.d.ts +1 -1
- package/src/management/gui/Property.d.ts +3 -3
- package/src/management/tasks/GuiTaskBase.d.ts +3 -8
- package/src/management/tasks/TaskDefinitionId.d.ts +1 -0
- package/src/util/ProcessLauncher.d.ts +1 -3
- package/bundles/magic-xpa-gui.umd.js +0 -19459
- package/bundles/magic-xpa-gui.umd.js.map +0 -1
- package/bundles/magic-xpa-gui.umd.min.js +0 -16
- package/bundles/magic-xpa-gui.umd.min.js.map +0 -1
- package/esm2015/src/Commands.js +0 -185
- package/esm2015/src/Events.js +0 -420
- package/esm2015/src/EventsProcessor.js +0 -68
- package/esm2015/src/FocusManager.js +0 -41
- package/esm2015/src/Manager.js +0 -197
- package/esm2015/src/gui/low/GuiInteractive.js +0 -539
- package/esm2015/src/gui/low/Style.js +0 -50
- package/esm2015/src/management/RuntimeContextBase.js +0 -50
- package/esm2015/src/management/data/DcValues.js +0 -214
- package/esm2015/src/management/data/DcValuesBuilderBase.js +0 -97
- package/esm2015/src/management/data/GuiDataViewBase.js +0 -90
- package/esm2015/src/management/data/GuiFieldBase.js +0 -85
- package/esm2015/src/management/data/ObjectReferenceBase.js +0 -48
- package/esm2015/src/management/data/RecordUtils.js +0 -447
- package/esm2015/src/management/events/IGuiEventsManager.js +0 -1
- package/esm2015/src/management/exp/GuiExpressionEvaluator.js +0 -333
- package/esm2015/src/management/gui/DisplayConvertor.js +0 -1706
- package/esm2015/src/management/gui/FieldValidator.js +0 -1507
- package/esm2015/src/management/gui/GuiControlPropertyAdapter.js +0 -4
- package/esm2015/src/management/gui/MgControlBase.js +0 -1979
- package/esm2015/src/management/gui/MgFormBase.js +0 -763
- package/esm2015/src/management/gui/PIC.js +0 -1176
- package/esm2015/src/management/gui/PropDefaults.js +0 -232
- package/esm2015/src/management/gui/PropTable.js +0 -224
- package/esm2015/src/management/gui/Property.js +0 -1409
- package/esm2015/src/management/tasks/GuiTaskBase.js +0 -533
- package/esm2015/src/management/tasks/MgTimer.js +0 -21
- package/esm2015/src/management/tasks/TaskDefinitionId.js +0 -47
- package/esm2015/src/management/tasks/TaskDefinitionIdTableSaxHandler.js +0 -41
- package/esm2015/src/util/ProcessLauncher.js +0 -32
- package/esm2015/src/util/UsernamePasswordCredentials.js +0 -52
- package/fesm2015/magic-xpa-gui.js.map +0 -1
|
@@ -1,333 +0,0 @@
|
|
|
1
|
-
import { ApplicationException, NString } from '@magic-xpa/mscorelib';
|
|
2
|
-
import { Rtf, StorageAttribute, StorageAttributeCheck, StrUtil } from '@magic-xpa/utils';
|
|
3
|
-
import { Manager } from '../../Manager';
|
|
4
|
-
import { Commands } from '../../Commands';
|
|
5
|
-
import { NUM_TYPE } from '../data/NUM_TYPE';
|
|
6
|
-
import { BlobType } from '../data/BlobType';
|
|
7
|
-
import { DisplayConvertor } from '../gui/DisplayConvertor';
|
|
8
|
-
export class GuiExpressionEvaluator {
|
|
9
|
-
constructor() {
|
|
10
|
-
this.ExpTask = null;
|
|
11
|
-
this.Events = null;
|
|
12
|
-
}
|
|
13
|
-
eval_op_statusbar_set_text(resVal, statusBarText) {
|
|
14
|
-
resVal.Attr = StorageAttribute.UNICODE;
|
|
15
|
-
resVal.StrVal = Manager.GetCurrentRuntimeContext().DefaultStatusMsg;
|
|
16
|
-
if (Manager.GetCurrentRuntimeContext().DefaultStatusMsg === null) {
|
|
17
|
-
resVal.StrVal = '';
|
|
18
|
-
}
|
|
19
|
-
else {
|
|
20
|
-
resVal.StrVal = Manager.GetCurrentRuntimeContext().DefaultStatusMsg;
|
|
21
|
-
}
|
|
22
|
-
resVal.IsNull = false;
|
|
23
|
-
if (!(statusBarText.Attr !== StorageAttribute.ALPHA && statusBarText.Attr !== StorageAttribute.UNICODE)) {
|
|
24
|
-
if (!statusBarText.IsNull) {
|
|
25
|
-
let text = statusBarText.StrVal;
|
|
26
|
-
let task = this.ExpTask.GetContextTask();
|
|
27
|
-
if (task.getForm() === null && Manager.GetCurrentRuntimeContext().FrameForm !== null) {
|
|
28
|
-
task = Manager.GetCurrentRuntimeContext().FrameForm.getTask();
|
|
29
|
-
}
|
|
30
|
-
task.WriteToMessagePane(text, false);
|
|
31
|
-
Manager.GetCurrentRuntimeContext().DefaultStatusMsg = text;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
IsParallel(task) {
|
|
36
|
-
return false;
|
|
37
|
-
}
|
|
38
|
-
eval_op_browserExecute_DO(resVal, controlName, text, sync, language) {
|
|
39
|
-
resVal.Attr = StorageAttribute.BOOLEAN;
|
|
40
|
-
resVal.BoolVal = false;
|
|
41
|
-
let form = this.ExpTask.getForm();
|
|
42
|
-
let sCtrlName = StrUtil.rtrim(controlName.StrVal);
|
|
43
|
-
let control = this.ExpTask.getForm().GetCtrl(sCtrlName);
|
|
44
|
-
if (control !== null && control.isBrowserControl()) {
|
|
45
|
-
resVal.BoolVal = Commands.browserExecute(control, text.StrVal, sync.BoolVal, language);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
eval_op_ctrl_name(resVal) {
|
|
49
|
-
let lastClickedCtrlName = Manager.GetCurrentRuntimeContext().LastClickedCtrlName;
|
|
50
|
-
resVal.StrVal = (NString.IsNullOrEmpty(lastClickedCtrlName) ? '' : lastClickedCtrlName);
|
|
51
|
-
resVal.Attr = StorageAttribute.ALPHA;
|
|
52
|
-
}
|
|
53
|
-
eval_op_formStateClear(formName, resVal) {
|
|
54
|
-
}
|
|
55
|
-
eval_op_gotoCtrl(ctrlName, rowNum, generation, retVal) {
|
|
56
|
-
retVal.Attr = StorageAttribute.BOOLEAN;
|
|
57
|
-
retVal.BoolVal = false;
|
|
58
|
-
let task = this.GetContextTask(generation.MgNumVal.NUM_2_LONG());
|
|
59
|
-
if (task === null || task.getForm() === null)
|
|
60
|
-
return;
|
|
61
|
-
let iRowNum = rowNum.MgNumVal.NUM_2_LONG();
|
|
62
|
-
let sCtrlName = StrUtil.rtrim(ctrlName.StrVal);
|
|
63
|
-
let ctrl = task.getForm().GetCtrl(sCtrlName);
|
|
64
|
-
retVal.BoolVal = this.HandleControlGoto(task, ctrl, iRowNum);
|
|
65
|
-
}
|
|
66
|
-
static GetContextTask(currTask, generation) {
|
|
67
|
-
let task = null;
|
|
68
|
-
let taskBase = currTask.GetContextTask();
|
|
69
|
-
if (generation === GuiExpressionEvaluator.TRIGGER_TASK) {
|
|
70
|
-
task = taskBase;
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
if (generation < taskBase.GetTaskDepth()) {
|
|
74
|
-
task = taskBase.GetTaskAncestor(generation);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
return task;
|
|
78
|
-
}
|
|
79
|
-
GetContextTask(generation) {
|
|
80
|
-
return GuiExpressionEvaluator.GetContextTask(this.ExpTask, generation);
|
|
81
|
-
}
|
|
82
|
-
ConstructMagicNum(resVal, i, attr) {
|
|
83
|
-
resVal.MgNumVal = new NUM_TYPE();
|
|
84
|
-
resVal.MgNumVal.NUM_4_LONG(i);
|
|
85
|
-
resVal.Attr = attr;
|
|
86
|
-
}
|
|
87
|
-
SetNULL(resVal, attr) {
|
|
88
|
-
resVal.IsNull = true;
|
|
89
|
-
resVal.Attr = attr;
|
|
90
|
-
switch (attr) {
|
|
91
|
-
case StorageAttribute.ALPHA:
|
|
92
|
-
case StorageAttribute.UNICODE:
|
|
93
|
-
resVal.StrVal = null;
|
|
94
|
-
break;
|
|
95
|
-
case StorageAttribute.TIME:
|
|
96
|
-
case StorageAttribute.DATE:
|
|
97
|
-
case StorageAttribute.NUMERIC:
|
|
98
|
-
resVal.MgNumVal = null;
|
|
99
|
-
break;
|
|
100
|
-
case StorageAttribute.BOOLEAN:
|
|
101
|
-
resVal.BoolVal = false;
|
|
102
|
-
break;
|
|
103
|
-
default:
|
|
104
|
-
break;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
GetValidatedValue(currCtrl, oldValue, newValue) {
|
|
108
|
-
let vd = currCtrl.buildCopyPicture(oldValue, newValue);
|
|
109
|
-
vd.evaluate();
|
|
110
|
-
let validationFailed = vd.ValidationFailed;
|
|
111
|
-
let ctrlValue;
|
|
112
|
-
if (validationFailed) {
|
|
113
|
-
let field = currCtrl.getField();
|
|
114
|
-
ctrlValue = ((field.getType() === StorageAttribute.BLOB_VECTOR) ? field.getCellDefualtValue() : field.getDefaultValue());
|
|
115
|
-
}
|
|
116
|
-
else {
|
|
117
|
-
ctrlValue = vd.getDispValue();
|
|
118
|
-
}
|
|
119
|
-
return ctrlValue;
|
|
120
|
-
}
|
|
121
|
-
SetVal(resVal, type, val, pic) {
|
|
122
|
-
switch (type) {
|
|
123
|
-
case StorageAttribute.ALPHA:
|
|
124
|
-
case StorageAttribute.BLOB:
|
|
125
|
-
case StorageAttribute.BLOB_VECTOR:
|
|
126
|
-
case StorageAttribute.UNICODE:
|
|
127
|
-
resVal.Attr = type;
|
|
128
|
-
resVal.StrVal = val;
|
|
129
|
-
if (type === StorageAttribute.BLOB || type === StorageAttribute.BLOB_VECTOR)
|
|
130
|
-
resVal.IncludeBlobPrefix = true;
|
|
131
|
-
break;
|
|
132
|
-
case StorageAttribute.NUMERIC:
|
|
133
|
-
case StorageAttribute.DATE:
|
|
134
|
-
case StorageAttribute.TIME:
|
|
135
|
-
resVal.Attr = type;
|
|
136
|
-
if (val == null)
|
|
137
|
-
resVal.MgNumVal = null;
|
|
138
|
-
else if (pic == null)
|
|
139
|
-
resVal.MgNumVal = new NUM_TYPE(val);
|
|
140
|
-
else
|
|
141
|
-
resVal.MgNumVal = new NUM_TYPE(val, pic, (this.ExpTask).getCompIdx());
|
|
142
|
-
break;
|
|
143
|
-
case StorageAttribute.BOOLEAN:
|
|
144
|
-
resVal.Attr = type;
|
|
145
|
-
resVal.BoolVal = DisplayConvertor.toBoolean(val);
|
|
146
|
-
break;
|
|
147
|
-
default:
|
|
148
|
-
this.SetNULL(resVal, type);
|
|
149
|
-
this.Events.WriteExceptionToLog('ExpressionEvaluator.SetVal() there is no such type : ' + type);
|
|
150
|
-
break;
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
static exp_build_string(val) {
|
|
154
|
-
let name = '';
|
|
155
|
-
if (val.StrVal !== null) {
|
|
156
|
-
let len = val.StrVal.length;
|
|
157
|
-
if (len > 0) {
|
|
158
|
-
name = StrUtil.ZstringMake(val.StrVal, len);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
return name;
|
|
162
|
-
}
|
|
163
|
-
static isExpVal(obj) {
|
|
164
|
-
return obj instanceof ExpVal;
|
|
165
|
-
}
|
|
166
|
-
BlobStringConversion(val, expectedType) {
|
|
167
|
-
if (StorageAttributeCheck.IsTypeAlphaOrUnicode(expectedType)) {
|
|
168
|
-
if (val.Attr === StorageAttribute.BLOB) {
|
|
169
|
-
let includeBlobPrefix = val.IncludeBlobPrefix;
|
|
170
|
-
if (includeBlobPrefix) {
|
|
171
|
-
let contentType = BlobType.getContentType(val.StrVal);
|
|
172
|
-
val.StrVal = BlobType.getString(val.StrVal);
|
|
173
|
-
val.IncludeBlobPrefix = false;
|
|
174
|
-
if (contentType !== BlobType.CONTENT_TYPE_BINARY && Rtf.isRtf(val.StrVal)) {
|
|
175
|
-
val.StrVal = StrUtil.GetPlainTextfromRtf(val.StrVal);
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
val.Attr = expectedType;
|
|
179
|
-
}
|
|
180
|
-
else {
|
|
181
|
-
if (val.Attr === StorageAttribute.BLOB_VECTOR) {
|
|
182
|
-
let includeBlobPrefix2 = val.IncludeBlobPrefix;
|
|
183
|
-
if (includeBlobPrefix2) {
|
|
184
|
-
val.StrVal = BlobType.removeBlobPrefix(val.StrVal);
|
|
185
|
-
val.IncludeBlobPrefix = false;
|
|
186
|
-
}
|
|
187
|
-
val.Attr = expectedType;
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
else {
|
|
192
|
-
if (expectedType === StorageAttribute.BLOB) {
|
|
193
|
-
if (StorageAttributeCheck.IsTypeAlphaOrUnicode(val.Attr)) {
|
|
194
|
-
let contentType = (val.Attr === StorageAttribute.ALPHA) ? BlobType.CONTENT_TYPE_ANSI : BlobType.CONTENT_TYPE_UNICODE;
|
|
195
|
-
val.StrVal = BlobType.createFromString(val.StrVal, contentType);
|
|
196
|
-
val.IncludeBlobPrefix = true;
|
|
197
|
-
val.Attr = expectedType;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
eval_op_zimeread(resVal) {
|
|
203
|
-
resVal.Attr = StorageAttribute.ALPHA;
|
|
204
|
-
resVal.StrVal = '';
|
|
205
|
-
let utilImeJpn = Manager.UtilImeJpn;
|
|
206
|
-
if (utilImeJpn !== null) {
|
|
207
|
-
let strImeRead = utilImeJpn.StrImeRead;
|
|
208
|
-
if (!NString.IsNullOrEmpty(utilImeJpn.StrImeRead)) {
|
|
209
|
-
resVal.StrVal = strImeRead;
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
eval_op_win_help(expFilePath, expHelpCmd, expHelpKey, resVal) {
|
|
214
|
-
let filePath = expFilePath.StrVal;
|
|
215
|
-
let helpCmd = expHelpCmd.MgNumVal.NUM_2_LONG();
|
|
216
|
-
let helpKey = expHelpKey.StrVal;
|
|
217
|
-
resVal.Attr = StorageAttribute.BOOLEAN;
|
|
218
|
-
try {
|
|
219
|
-
Manager.ShowWindowHelp(filePath, helpCmd, helpKey);
|
|
220
|
-
resVal.BoolVal = true;
|
|
221
|
-
}
|
|
222
|
-
catch (ex) {
|
|
223
|
-
resVal.BoolVal = false;
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
ConvertExpVal(val, expectedType) {
|
|
227
|
-
if (StorageAttributeCheck.StorageFldAlphaUnicodeOrBlob(val.Attr, expectedType)) {
|
|
228
|
-
this.BlobStringConversion(val, expectedType);
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
GuiExpressionEvaluator.TRIGGER_TASK = 500000;
|
|
233
|
-
export class ExpVal {
|
|
234
|
-
constructor(attr, isNull, mgVal) {
|
|
235
|
-
this.Attr = StorageAttribute.NONE;
|
|
236
|
-
this.IsNull = false;
|
|
237
|
-
this.MgNumVal = null;
|
|
238
|
-
this.StrVal = null;
|
|
239
|
-
this.BoolVal = false;
|
|
240
|
-
this.IncludeBlobPrefix = false;
|
|
241
|
-
this.OriginalNull = false;
|
|
242
|
-
this.VectorField = null;
|
|
243
|
-
if (arguments.length === 0) {
|
|
244
|
-
this.constructor_0();
|
|
245
|
-
return;
|
|
246
|
-
}
|
|
247
|
-
this.constructor_1(attr, isNull, mgVal);
|
|
248
|
-
}
|
|
249
|
-
constructor_0() {
|
|
250
|
-
this.Attr = StorageAttribute.NONE;
|
|
251
|
-
}
|
|
252
|
-
constructor_1(attr, isNull, mgVal) {
|
|
253
|
-
this.Init(attr, isNull, mgVal);
|
|
254
|
-
}
|
|
255
|
-
Copy(src) {
|
|
256
|
-
this.Attr = src.Attr;
|
|
257
|
-
this.BoolVal = src.BoolVal;
|
|
258
|
-
this.IncludeBlobPrefix = src.IncludeBlobPrefix;
|
|
259
|
-
this.IsNull = src.IsNull;
|
|
260
|
-
this.MgNumVal = src.MgNumVal;
|
|
261
|
-
this.StrVal = src.StrVal;
|
|
262
|
-
this.VectorField = src.VectorField;
|
|
263
|
-
this.OriginalNull = src.OriginalNull;
|
|
264
|
-
}
|
|
265
|
-
Nullify() {
|
|
266
|
-
this.Init(StorageAttribute.NONE, true, null);
|
|
267
|
-
}
|
|
268
|
-
Init(attr, isNull, mgVal) {
|
|
269
|
-
this.Attr = attr;
|
|
270
|
-
this.IsNull = isNull;
|
|
271
|
-
switch (this.Attr) {
|
|
272
|
-
case StorageAttribute.ALPHA:
|
|
273
|
-
case StorageAttribute.UNICODE:
|
|
274
|
-
this.StrVal = mgVal;
|
|
275
|
-
break;
|
|
276
|
-
case StorageAttribute.BLOB:
|
|
277
|
-
case StorageAttribute.BLOB_VECTOR:
|
|
278
|
-
this.StrVal = mgVal;
|
|
279
|
-
this.IncludeBlobPrefix = true;
|
|
280
|
-
break;
|
|
281
|
-
case StorageAttribute.NUMERIC:
|
|
282
|
-
case StorageAttribute.DATE:
|
|
283
|
-
case StorageAttribute.TIME:
|
|
284
|
-
this.MgNumVal = ((mgVal !== null) ? new NUM_TYPE(mgVal) : null);
|
|
285
|
-
break;
|
|
286
|
-
case StorageAttribute.BOOLEAN:
|
|
287
|
-
this.BoolVal = (mgVal !== null && mgVal === '1');
|
|
288
|
-
break;
|
|
289
|
-
case StorageAttribute.NONE:
|
|
290
|
-
this.BoolVal = false;
|
|
291
|
-
this.StrVal = null;
|
|
292
|
-
this.MgNumVal = null;
|
|
293
|
-
this.OriginalNull = true;
|
|
294
|
-
this.VectorField = null;
|
|
295
|
-
this.IncludeBlobPrefix = false;
|
|
296
|
-
break;
|
|
297
|
-
case StorageAttribute.DOTNET:
|
|
298
|
-
this.StrVal = mgVal;
|
|
299
|
-
break;
|
|
300
|
-
default:
|
|
301
|
-
throw new ApplicationException('in ExpVal.ExpVal() illegal attribute: \'' + this.Attr + '\'');
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
ToMgVal() {
|
|
305
|
-
let str;
|
|
306
|
-
switch (this.Attr) {
|
|
307
|
-
case StorageAttribute.ALPHA:
|
|
308
|
-
case StorageAttribute.BLOB:
|
|
309
|
-
case StorageAttribute.BLOB_VECTOR:
|
|
310
|
-
case StorageAttribute.UNICODE:
|
|
311
|
-
str = this.StrVal;
|
|
312
|
-
break;
|
|
313
|
-
case StorageAttribute.NUMERIC:
|
|
314
|
-
case StorageAttribute.DATE:
|
|
315
|
-
case StorageAttribute.TIME:
|
|
316
|
-
str = this.MgNumVal.toXMLrecord();
|
|
317
|
-
break;
|
|
318
|
-
case StorageAttribute.BOOLEAN:
|
|
319
|
-
str = this.BoolVal
|
|
320
|
-
? '1'
|
|
321
|
-
: '0';
|
|
322
|
-
break;
|
|
323
|
-
default:
|
|
324
|
-
str = '[illegal attribute: ' + this.Attr + ']';
|
|
325
|
-
break;
|
|
326
|
-
}
|
|
327
|
-
return str;
|
|
328
|
-
}
|
|
329
|
-
isEmptyString() {
|
|
330
|
-
return (this.Attr === StorageAttribute.ALPHA || this.Attr === StorageAttribute.UNICODE) && this.StrVal === '';
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3VpRXhwcmVzc2lvbkV2YWx1YXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2d1aS9zcmMvbWFuYWdlbWVudC9leHAvR3VpRXhwcmVzc2lvbkV2YWx1YXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsb0JBQW9CLEVBQVEsT0FBTyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0UsT0FBTyxFQUFlLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxxQkFBcUIsRUFBRSxPQUFPLEVBQWMsTUFBTSxrQkFBa0IsQ0FBQztBQUdsSCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR3hDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFHNUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRzVDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRzNELE1BQU0sT0FBZ0Isc0JBQXNCO0lBMlUxQztRQXpVQSxZQUFPLEdBQWdCLElBQUksQ0FBQztRQUNwQixXQUFNLEdBQVEsSUFBSSxDQUFDO0lBMFUzQixDQUFDO0lBN1RELDBCQUEwQixDQUFDLE1BQWMsRUFBRSxhQUFxQjtRQUM5RCxNQUFNLENBQUMsSUFBSSxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQztRQUN2QyxNQUFNLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLGdCQUFnQixDQUFDO1FBRXBFLElBQUksT0FBTyxDQUFDLHdCQUF3QixFQUFFLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxFQUFFO1lBQ2hFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1NBQ3BCO2FBQU07WUFDTCxNQUFNLENBQUMsTUFBTSxHQUFH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QWdCLENBQUMsSUFBSSxDQUFDO1lBQzNCLEtBQUssZ0JBQWdCLENBQUMsV0FBVyxDQUFDO1lBQ2xDLEtBQUssZ0JBQWdCLENBQUMsT0FBTztnQkFDM0IsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7Z0JBQ2xCLE1BQU07WUFFUixLQUFLLGdCQUFnQixDQUFDLE9BQU8sQ0FBQztZQUM5QixLQUFLLGdCQUFnQixDQUFDLElBQUksQ0FBQztZQUMzQixLQUFLLGdCQUFnQixDQUFDLElBQUk7Z0JBQ3hCLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNsQyxNQUFNO1lBRVIsS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPO2dCQUMzQixHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU87b0JBQ2hCLENBQUMsQ0FBQyxHQUFHO29CQUNMLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQ1IsTUFBTTtZQUVSO2dCQUNFLEdBQUcsR0FBRyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztnQkFDL0MsTUFBTTtTQUNUO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBTUQsYUFBYTtRQUNYLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLGdCQUFnQixDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFDO0lBQ2hILENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcGxpY2F0aW9uRXhjZXB0aW9uLCBMaXN0LCBOU3RyaW5nIH0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQgeyBIZWxwQ29tbWFuZCwgUnRmLCBTdG9yYWdlQXR0cmlidXRlLCBTdG9yYWdlQXR0cmlidXRlQ2hlY2ssIFN0clV0aWwsIFV0aWxJbWVKcG4gfSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHsgR3VpVGFza0Jhc2UgfSBmcm9tICcuLi90YXNrcy9HdWlUYXNrQmFzZSc7XHJcbmltcG9ydCB7IElUYXNrIH0gZnJvbSAnLi4vdGFza3MvSVRhc2snO1xyXG5pbXBvcnQgeyBNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vTWFuYWdlcic7XHJcbmltcG9ydCB7IE1nRm9ybUJhc2UgfSBmcm9tICcuLi9ndWkvTWdGb3JtQmFzZSc7XHJcbmltcG9ydCB7IE1nQ29udHJvbEJhc2UgfSBmcm9tICcuLi9ndWkvTWdDb250cm9sQmFzZSc7XHJcbmltcG9ydCB7IENvbW1hbmRzIH0gZnJvbSAnLi4vLi4vQ29tbWFuZHMnO1xyXG5pbXBvcnQgeyBOVU1fVFlQRSB9IGZyb20gJy4uL2RhdGEvTlVNX1RZUEUnO1xyXG5pbXBvcnQgeyBHdWlGaWVsZEJhc2UgfSBmcm9tICcuLi9kYXRhL0d1aUZpZWxkQmFzZSc7XHJcblxyXG5pbXBvcnQgeyBCbG9iVHlwZSB9IGZyb20gJy4uL2RhdGEvQmxvYlR5cGUnO1xyXG5pbXBvcnQgeyBWYWxpZGF0aW9uRGV0YWlscyB9IGZyb20gJy4uL2d1aS9WYWxpZGF0aW9uRGV0YWlscyc7XHJcbmltcG9ydCB7IFBJQyB9IGZyb20gJy4uL2d1aS9QSUMnO1xyXG5pbXBvcnQgeyBEaXNwbGF5Q29udmVydG9yIH0gZnJvbSAnLi4vZ3VpL0Rpc3BsYXlDb252ZXJ0b3InO1xyXG5cclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBHdWlFeHByZXNzaW9uRXZhbHVhdG9yIHtcclxuICBzdGF0aWMgVFJJR0dFUl9UQVNLOiBudW1iZXIgPSA1MDAwMDA7XHJcbiAgRXhwVGFzazogR3VpVGFza0Jhc2UgPSBudWxsO1xyXG4gIHByaXZhdGUgRXZlbnRzOiBhbnkgPSBudWxsO1xyXG5cclxuICBhYnN0cmFjdCBHZXRUb3BNb3N0Rm9ybXMoY29udGV4dElkOiBudW1iZXIpOiBMaXN0PE1nRm9ybUJhc2U+O1xyXG5cclxuICBhYnN0cmFjdCBIYW5kbGVDb250cm9sR290byh0YXNrOiBJVGFzaywgY3RybDogTWdDb250cm9sQmFzZSwgcm93Tm86IG51bWJlcik6IGJvb2xlYW47XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+KHByb3RlY3RlZClcclxuICAvLy8gc2V0cyB0aGUgc3RhdHVzIGJhciB0ZXh0IHdpdGggdGhlIGdpdmVuIHRleHQgYW5kXHJcbiAgLy8vIHNldHMgdGhlIHJlc3VsdCB3aXRoIHRoZSBsYXN0IHRleHQgdGhhdCB3YXMgc2V0IHRvIHRoZSBzdGF0dXMgYmFyIGJ5IHRoZSB1c2Ugb2YgdGhpcyBmdW5jdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZXNWYWxcIj5sYXN0IHRleHQgb2Ygc3RhdHVzIGJhcjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdGF0dXNCYXJUZXh0XCI+dGhlIHRleHQgdG8gYmUgc2V0IGF0IHN0YXR1cyBiYXI8L3BhcmFtPlxyXG4gIGV2YWxfb3Bfc3RhdHVzYmFyX3NldF90ZXh0KHJlc1ZhbDogRXhwVmFsLCBzdGF0dXNCYXJUZXh0OiBFeHBWYWwpOiB2b2lkIHtcclxuICAgIHJlc1ZhbC5BdHRyID0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFO1xyXG4gICAgcmVzVmFsLlN0clZhbCA9IE1hbmFnZXIuR2V0Q3VycmVudFJ1bnRpbWVDb250ZXh0KCkuRGVmYXVsdFN0YXR1c01zZztcclxuXHJcbiAgICBpZiAoTWFuYWdlci5HZXRDdXJyZW50UnVudGltZUNvbnRleHQoKS5EZWZhdWx0U3RhdHVzTXNnID09PSBudWxsKSB7XHJcbiAgICAgIHJlc1ZhbC5TdHJWYWwgPSAnJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJlc1ZhbC5TdHJWYWwgPSBNYW5hZ2VyLkdldEN1cnJlbnRSdW50aW1lQ29udGV4dCgpLkRlZmF1bHRTdGF0dXNNc2c7XHJcbiAgICB9XHJcbiAgICByZXNWYWwuSXNOdWxsID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKCEoc3RhdHVzQmFyVGV4dC5BdHRyICE9PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBICYmIHN0YXR1c0JhclRleHQuQXR0ciAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFKSkge1xyXG4gICAgICBpZiAoIXN0YXR1c0JhclRleHQuSXNOdWxsKSB7XHJcbiAgICAgICAgbGV0IHRleHQ6IHN0cmluZyA9IHN0YXR1c0JhclRleHQuU3RyVmFsO1xyXG4gICAgICAgIGxldCB0YXNrOiBHdWlUYXNrQmFzZSA9IDxHdWlUYXNrQmFzZT50aGlzLkV4cFRhc2suR2V0Q29udGV4dFRhc2soKTtcclxuXHJcbiAgICAgICAgLy8gSW4gY2FzZSBvZiBub24gaW50ZXJhY3RpdmUgdGFza3MsIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGFzayBoYXMgb3BlbiB3aW5kb3cgPSBObywgU28gZGlzcGxheSB0aGUgc3RhdHVzIGJhciBtc2cgb24gZnJhbWUgd2luZG93LlxyXG4gICAgICAgIGlmICh0YXNrLmdldEZvcm0oKSA9PT0gbnVsbCAmJiBNYW5hZ2VyLkdldEN1cnJlbnRSdW50aW1lQ29udGV4dCgpLkZyYW1lRm9ybSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgdGFzayA9IE1hbmFnZXIuR2V0Q3VycmVudFJ1bnRpbWVDb250ZXh0KCkuRnJhbWVGb3JtLmdldFRhc2soKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGFzay5Xcml0ZVRvTWVzc2FnZVBhbmUodGV4dCwgZmFsc2UpO1xyXG4gICAgICAgIE1hbmFnZXIuR2V0Q3VycmVudFJ1bnRpbWVDb250ZXh0KCkuRGVmYXVsdFN0YXR1c01zZyA9IHRleHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBJc1BhcmFsbGVsKHRhc2s6IEd1aVRhc2tCYXNlKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuXHJcbiAgZXZhbF9vcF9icm93c2VyRXhlY3V0ZV9ETyhyZXNWYWw6IEV4cFZhbCwgY29udHJvbE5hbWU6IEV4cFZhbCwgdGV4dDogRXhwVmFsLCBzeW5jOiBFeHBWYWwsIGxhbmd1YWdlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHJlc1ZhbC5BdHRyID0gU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOO1xyXG4gICAgcmVzVmFsLkJvb2xWYWwgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBGaW5kIHRoZSBicm93c2VyIGNvbnRyb2wgYnkgdGhlIGNvbnRyb2wgbmFtZVxyXG4gICAgbGV0IGZvcm06IE1nRm9ybUJhc2UgPSB0aGlzLkV4cFRhc2suZ2V0Rm9ybSgpO1xyXG4gICAgbGV0IHNDdHJsTmFtZTogc3RyaW5nID0gU3RyVXRpbC5ydHJpbShjb250cm9sTmFtZS5TdHJWYWwpO1xyXG4gICAgbGV0IGNvbnRyb2w6IE1nQ29udHJvbEJhc2UgPSB0aGlzLkV4cFRhc2suZ2V0Rm9ybSgpLkdldEN0cmwoc0N0cmxOYW1lKTtcclxuICAgIGlmIChjb250cm9sICE9PSBudWxsICYmIGNvbnRyb2wuaXNCcm93c2VyQ29udHJvbCgpKSB7XHJcbiAgICAgIHJlc1ZhbC5Cb29sVmFsID0gQ29tbWFuZHMuYnJvd3NlckV4ZWN1dGUoY29udHJvbCwgdGV4dC5TdHJWYWwsIHN5bmMuQm9vbFZhbCwgbGFuZ3VhZ2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5Pihwcm90ZWN0ZWQpXHJcbiAgLy8vIHJldHVybiB0aGUgY29udHJvbCBuYW1lIG9mIGxhc3QgY2xpY2tlZCBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBldmFsX29wX2N0cmxfbmFtZShyZXNWYWw6IEV4cFZhbCk6IHZvaWQge1xyXG4gICAgbGV0IGxhc3RDbGlja2VkQ3RybE5hbWU6IHN0cmluZyA9IE1hbmFnZXIuR2V0Q3VycmVudFJ1bnRpbWVDb250ZXh0KCkuTGFzdENsaWNrZWRDdHJsTmFtZTtcclxuICAgIHJlc1ZhbC5TdHJWYWwgPSAoTlN0cmluZy5Jc051bGxPckVtcHR5KGxhc3RDbGlja2VkQ3RybE5hbWUpID8gJycgOiBsYXN0Q2xpY2tlZEN0cmxOYW1lKTtcclxuICAgIHJlc1ZhbC5BdHRyID0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4ocHJvdGVjdGVkKVxyXG4gIC8vLyAgIENsZWFycyB0aGUgZm9ybSB1c2VyIHN0YXRlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmb3JtTmFtZVwiPmZvcm0gbmFtZSAoY3VycmVudCBmb3JtKCcnKSAvYWxsIGZvcm1zKCopKSA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlc1ZhbFwiPnN1Y2NlZWQgb3IgZmFpbGVkPC9wYXJhbT5cclxuICBldmFsX29wX2Zvcm1TdGF0ZUNsZWFyKGZvcm1OYW1lOiBFeHBWYWwsIHJlc1ZhbDogRXhwVmFsKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+KHByb3RlY3RlZClcclxuICAvLy8gTW92ZXMgdGhlIGNhcmV0IHRvIHNwZWNpZmllZCBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxOYW1lXCI+dGhlIG5hbWUgb2YgdGhlIGRlc3RpbmF0aW9uIGNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicm93TnVtXCI+dGhlIHJvdyBpbiB0aGUgdGFibGUgIDAgcmVwcmVzZW50cyBjdXJyZW50IHJvdzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJnZW5lcmF0aW9uXCI+dGhlIHRhc2sgZ2VuZXJhdGlvbjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZXRWYWxcIj50aGUgcmVzdWx0PC9wYXJhbT5cclxuICBldmFsX29wX2dvdG9DdHJsKGN0cmxOYW1lOiBFeHBWYWwsIHJvd051bTogRXhwVmFsLCBnZW5lcmF0aW9uOiBFeHBWYWwsIHJldFZhbDogRXhwVmFsKTogdm9pZCB7XHJcbiAgICByZXRWYWwuQXR0ciA9IFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjtcclxuICAgIHJldFZhbC5Cb29sVmFsID0gZmFsc2U7XHJcbiAgICBsZXQgdGFzazogR3VpVGFza0Jhc2UgPSB0aGlzLkdldENvbnRleHRUYXNrKGdlbmVyYXRpb24uTWdOdW1WYWwuTlVNXzJfTE9ORygpKTtcclxuICAgIGlmICh0YXNrID09PSBudWxsIHx8IHRhc2suZ2V0Rm9ybSgpID09PSBudWxsKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgbGV0IGlSb3dOdW06IG51bWJlciA9IHJvd051bS5NZ051bVZhbC5OVU1fMl9MT05HKCk7XHJcbiAgICBsZXQgc0N0cmxOYW1lOiBzdHJpbmcgPSBTdHJVdGlsLnJ0cmltKGN0cmxOYW1lLlN0clZhbCk7XHJcbiAgICBsZXQgY3RybDogTWdDb250cm9sQmFzZSA9IHRhc2suZ2V0Rm9ybSgpLkdldEN0cmwoc0N0cmxOYW1lKTtcclxuICAgIHJldFZhbC5Cb29sVmFsID0gdGhpcy5IYW5kbGVDb250cm9sR290byh0YXNrLCBjdHJsLCBpUm93TnVtKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4ocHJvdGVjdGVkKVxyXG4gIC8vLyBnZXQgY29udGV4dCB0YXNrIGJ5IGEgc3BlY2lmaWVkIGdlbmVyYXRpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3VyclRhc2tcIj5jdXJyZW50IHRhc2s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZ2VuZXJhdGlvblwiPnRhc2sgZ2VuZXJhdGlvbjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0YXNrIGF0IHNwZWNpZmllZCBnZW5lcmF0aW9uPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBHZXRDb250ZXh0VGFzayhjdXJyVGFzazogR3VpVGFza0Jhc2UsIGdlbmVyYXRpb246IG51bWJlcik6IEd1aVRhc2tCYXNlIHtcclxuICAgIGxldCB0YXNrOiBHdWlUYXNrQmFzZSA9IG51bGw7XHJcbiAgICBsZXQgdGFza0Jhc2U6IEd1aVRhc2tCYXNlID0gPEd1aVRhc2tCYXNlPiBjdXJyVGFzay5HZXRDb250ZXh0VGFzaygpO1xyXG4gICAgaWYgKGdlbmVyYXRpb24gPT09IEd1aUV4cHJlc3Npb25FdmFsdWF0b3IuVFJJR0dFUl9UQVNLKSB7XHJcbiAgICAgIHRhc2sgPSB0YXNrQmFzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChnZW5lcmF0aW9uIDwgdGFza0Jhc2UuR2V0VGFza0RlcHRoKCkpIHtcclxuICAgICAgICB0YXNrID0gPEd1aVRhc2tCYXNlPnRhc2tCYXNlLkdldFRhc2tBbmNlc3RvcihnZW5lcmF0aW9uKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+KHByb3RlY3RlZClcclxuICAvLy8gZ2V0IGNvbnRleHQgdGFzayBieSBhIHNwZWNpZmllZCBnZW5lcmF0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImdlbmVyYXRpb25cIj50YXNrIGdlbmVyYXRpb248L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGFzayBhdCBzcGVjaWZpZWQgZ2VuZXJhdGlvbjwvcmV0dXJucz5cclxuICBHZXRDb250ZXh0VGFzayhnZW5lcmF0aW9uOiBudW1iZXIpOiBHdWlUYXNrQmFzZSB7XHJcbiAgICByZXR1cm4gR3VpRXhwcmVzc2lvbkV2YWx1YXRvci5HZXRDb250ZXh0VGFzayh0aGlzLkV4cFRhc2ssIGdlbmVyYXRpb24pO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5Pihwcm90ZWN0ZWQpXHJcbiAgLy8vIENyZWF0ZSBhIE5VTV9UWVBFIHdpdGggdGhlIHZhbHVlIG9mIGkgYW5kIHNldCB0aGUgRXhwVmFsIHdpdGggaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIENvbnN0cnVjdE1hZ2ljTnVtKHJlc1ZhbDogRXhwVmFsLCBpOiBudW1iZXIsIGF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUpOiB2b2lkIHtcclxuICAgIHJlc1ZhbC5NZ051bVZhbCA9IG5ldyBOVU1fVFlQRSgpO1xyXG4gICAgcmVzVmFsLk1nTnVtVmFsLk5VTV80X0xPTkcoaSk7XHJcbiAgICByZXNWYWwuQXR0ciA9IGF0dHI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+KHB1YmxpYylcclxuICAvLy8gc2V0IG51bGwgdmFsdWUgdG8gRXhwcmVzc2lvbiBFdmFsdWF0b3JcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVzVmFsXCI+dG8gc2V0IGl0IE5VTEw8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYXR0clwiPmF0dHJpYnV0ZSBvZiBFeHBWYWx1ZTwvcGFyYW0+XHJcbiAgU2V0TlVMTChyZXNWYWw6IEV4cFZhbCwgYXR0cjogU3RvcmFnZUF0dHJpYnV0ZSk6IHZvaWQge1xyXG4gICAgcmVzVmFsLklzTnVsbCA9IHRydWU7XHJcbiAgICByZXNWYWwuQXR0ciA9IGF0dHI7XHJcblxyXG4gICAgc3dpdGNoIChhdHRyKSB7XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREU6XHJcbiAgICAgICAgcmVzVmFsLlN0clZhbCA9IG51bGw7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVElNRTpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkRBVEU6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDOlxyXG4gICAgICAgIHJlc1ZhbC5NZ051bVZhbCA9IG51bGw7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjpcclxuICAgICAgICByZXNWYWwuQm9vbFZhbCA9IGZhbHNlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB2YWxpZGF0ZSB2YWx1ZSBvZiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdXJyQ3RybFwiPmNvbnRyb2wgd2hvc2UgdmFsdWUgbmVlZCB0byBiZSBldmFsdWF0ZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib2xkVmFsdWVcIj5vbGQgdmFsdWUgb2YgdGhlIGNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3VmFsdWVcIj5uZXcgdmFsdWUgb2YgdGhlIGNvbnRyb2w8L3BhcmFtPlxyXG4gIEdldFZhbGlkYXRlZFZhbHVlKGN1cnJDdHJsOiBNZ0NvbnRyb2xCYXNlLCBvbGRWYWx1ZTogc3RyaW5nLCBuZXdWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCB2ZDogVmFsaWRhdGlvbkRldGFpbHMgPSBjdXJyQ3RybC5idWlsZENvcHlQaWN0dXJlKG9sZFZhbHVlLCBuZXdWYWx1ZSk7XHJcbiAgICB2ZC5ldmFsdWF0ZSgpO1xyXG4gICAgbGV0IHZhbGlkYXRpb25GYWlsZWQ6IGJvb2xlYW4gPSB2ZC5WYWxpZGF0aW9uRmFpbGVkO1xyXG4gICAgbGV0IGN0cmxWYWx1ZTogc3RyaW5nO1xyXG4gICAgaWYgKHZhbGlkYXRpb25GYWlsZWQpIHtcclxuICAgICAgbGV0IGZpZWxkOiBHdWlGaWVsZEJhc2UgPSBjdXJyQ3RybC5nZXRGaWVsZCgpO1xyXG4gICAgICBjdHJsVmFsdWUgPSAoKGZpZWxkLmdldFR5cGUoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikgPyBmaWVsZC5nZXRDZWxsRGVmdWFsdFZhbHVlKCkgOiBmaWVsZC5nZXREZWZhdWx0VmFsdWUoKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjdHJsVmFsdWUgPSB2ZC5nZXREaXNwVmFsdWUoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBjdHJsVmFsdWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGV4cFZhbHVlIG9mIG5lZWRlZCB0eXBlIC4gdGhlIHZhbHVlIGlzIGluaXRlZCBieSB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZXNWYWxcIj5uZWVkIGJlIGV2YWx1YXRlZC9pbml0aWFsaXplZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0eXBlXCI+b2YgcmVzVmFsIChBbHBoYXxOdW1lcmljfExvZ2ljYWx8RGF0ZXxUaW1lfEJsb2J8VmVjdG9yKTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj5zdHJpbmcvaGV4YSBzdHJpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljXCI+Zm9yIHN0cmluZyBldmFsdWF0aW9uPC9wYXJhbT5cclxuICBTZXRWYWwocmVzVmFsOiBFeHBWYWwsIHR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUsIHZhbDogc3RyaW5nLCBwaWM6IFBJQyk6IHZvaWQge1xyXG5cclxuICAgIHN3aXRjaCAodHlwZSkge1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQjpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERTpcclxuICAgICAgICByZXNWYWwuQXR0ciA9IHR5cGU7XHJcbiAgICAgICAgcmVzVmFsLlN0clZhbCA9IHZhbDtcclxuXHJcbiAgICAgICAgaWYgKHR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQiB8fCB0eXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKVxyXG4gICAgICAgICAgcmVzVmFsLkluY2x1ZGVCbG9iUHJlZml4ID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuREFURTpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlRJTUU6XHJcbiAgICAgICAgcmVzVmFsLkF0dHIgPSB0eXBlO1xyXG4gICAgICAgIGlmICh2YWwgPT0gbnVsbClcclxuICAgICAgICAgIHJlc1ZhbC5NZ051bVZhbCA9IG51bGw7XHJcbiAgICAgICAgZWxzZSBpZiAocGljID09IG51bGwpXHJcbiAgICAgICAgICByZXNWYWwuTWdOdW1WYWwgPSBuZXcgTlVNX1RZUEUodmFsKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICByZXNWYWwuTWdOdW1WYWwgPSBuZXcgTlVNX1RZUEUodmFsLCBwaWMsICh0aGlzLkV4cFRhc2spLmdldENvbXBJZHgoKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjpcclxuICAgICAgICByZXNWYWwuQXR0ciA9IHR5cGU7XHJcbiAgICAgICAgcmVzVmFsLkJvb2xWYWwgPSBEaXNwbGF5Q29udmVydG9yLnRvQm9vbGVhbih2YWwpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aGlzLlNldE5VTEwocmVzVmFsLCB0eXBlKTtcclxuXHJcbiAgICAgICAgdGhpcy5FdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZygnRXhwcmVzc2lvbkV2YWx1YXRvci5TZXRWYWwoKSB0aGVyZSBpcyBubyBzdWNoIHR5cGUgOiAnICsgdHlwZSk7XHJcblxyXG4gICAgICAgIC8vIENsaWVudE1hbmFnZXIuSW5zdGFuY2UuV3JpdGVFcnJvclRvTG9nKFwiRXhwcmVzc2lvbkV2YWx1YXRvci5TZXRWYWwoKSB0aGVyZSBpcyBubyBzdWNoIHR5cGUgOiBcIiArIHR5cGUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5Pihwcm90ZWN0ZWQpXHJcbiAgLy8vIHRyaW1zIGFuZCByZXR1cm5zIHRoZSBzdHJpbmcuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPmNvbnRhaW5pbmcgc3RyaW5nIHRvIGJlIHRyaW1tZWQgKHN0clZhbF8gbWVtYmVyIG9mIEV4cFZhbCk8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz50cmltbWVkIHN0cmluZzwvcmV0dXJucz5cclxuICBzdGF0aWMgZXhwX2J1aWxkX3N0cmluZyh2YWw6IEV4cFZhbCk6IHN0cmluZyB7XHJcbiAgICBsZXQgbmFtZTogc3RyaW5nID0gJyc7XHJcbiAgICBpZiAodmFsLlN0clZhbCAhPT0gbnVsbCkge1xyXG4gICAgICBsZXQgbGVuOiBudW1iZXIgPSA8bnVtYmVyPnZhbC5TdHJWYWwubGVuZ3RoO1xyXG4gICAgICBpZiAobGVuID4gMCkge1xyXG4gICAgICAgIG5hbWUgPSBTdHJVdGlsLlpzdHJpbmdNYWtlKHZhbC5TdHJWYWwsIDxudW1iZXI+bGVuKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5hbWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNoZWNrcyBpZiB0aGUgb2JqZWN0IGlzIGluc3RhbmNlIG9mIEV4cFZhbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib2JqXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBpc0V4cFZhbChvYmo6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEV4cFZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4ocHJpdmF0ZSlcclxuICAvLy8gaGFuZGxlIGNvbnZlcnNpb25zIGJldHdlZW4gYmxvYiBhbmQgdW5pY29kZS9hbHBoYVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJleHBlY3RlZFR5cGVcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgQmxvYlN0cmluZ0NvbnZlcnNpb24odmFsOiBFeHBWYWwsIGV4cGVjdGVkVHlwZTogU3RvcmFnZUF0dHJpYnV0ZSk6IHZvaWQge1xyXG4gICAgaWYgKFN0b3JhZ2VBdHRyaWJ1dGVDaGVjay5Jc1R5cGVBbHBoYU9yVW5pY29kZShleHBlY3RlZFR5cGUpKSB7XHJcbiAgICAgIGlmICh2YWwuQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CKSB7XHJcbiAgICAgICAgbGV0IGluY2x1ZGVCbG9iUHJlZml4OiBib29sZWFuID0gdmFsLkluY2x1ZGVCbG9iUHJlZml4O1xyXG4gICAgICAgIGlmIChpbmNsdWRlQmxvYlByZWZpeCkge1xyXG4gICAgICAgICAgbGV0IGNvbnRlbnRUeXBlOiBzdHJpbmcgPSBCbG9iVHlwZS5nZXRDb250ZW50VHlwZSh2YWwuU3RyVmFsKTtcclxuICAgICAgICAgIHZhbC5TdHJWYWwgPSBCbG9iVHlwZS5nZXRTdHJpbmcodmFsLlN0clZhbCk7XHJcbiAgICAgICAgICB2YWwuSW5jbHVkZUJsb2JQcmVmaXggPSBmYWxzZTtcclxuICAgICAgICAgIGlmIChjb250ZW50VHlwZSAhPT0gQmxvYlR5cGUuQ09OVEVOVF9UWVBFX0JJTkFSWSAmJiBSdGYuaXNSdGYodmFsLlN0clZhbCkpIHtcclxuICAgICAgICAgICAgdmFsLlN0clZhbCA9IFN0clV0aWwuR2V0UGxhaW5UZXh0ZnJvbVJ0Zih2YWwuU3RyVmFsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdmFsLkF0dHIgPSBleHBlY3RlZFR5cGU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHZhbC5BdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKSB7XHJcbiAgICAgICAgICBsZXQgaW5jbHVkZUJsb2JQcmVmaXgyOiBib29sZWFuID0gdmFsLkluY2x1ZGVCbG9iUHJlZml4O1xyXG4gICAgICAgICAgaWYgKGluY2x1ZGVCbG9iUHJlZml4Mikge1xyXG4gICAgICAgICAgICB2YWwuU3RyVmFsID0gQmxvYlR5cGUucmVtb3ZlQmxvYlByZWZpeCh2YWwuU3RyVmFsKTtcclxuICAgICAgICAgICAgdmFsLkluY2x1ZGVCbG9iUHJlZml4ID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB2YWwuQXR0ciA9IGV4cGVjdGVkVHlwZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChleHBlY3RlZFR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQikge1xyXG4gICAgICAgIGlmIChTdG9yYWdlQXR0cmlidXRlQ2hlY2suSXNUeXBlQWxwaGFPclVuaWNvZGUodmFsLkF0dHIpKSB7XHJcbiAgICAgICAgICBsZXQgY29udGVudFR5cGU6IHN0cmluZyA9ICh2YWwuQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSkgPyBCbG9iVHlwZS5DT05URU5UX1RZUEVfQU5TSSA6IEJsb2JUeXBlLkNPTlRFTlRfVFlQRV9VTklDT0RFO1xyXG4gICAgICAgICAgdmFsLlN0clZhbCA9IEJsb2JUeXBlLmNyZWF0ZUZyb21TdHJpbmcodmFsLlN0clZhbCwgY29udGVudFR5cGUpO1xyXG4gICAgICAgICAgdmFsLkluY2x1ZGVCbG9iUHJlZml4ID0gdHJ1ZTtcclxuICAgICAgICAgIHZhbC5BdHRyID0gZXhwZWN0ZWRUeXBlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZXZhbF9vcF96aW1lcmVhZChyZXNWYWw6IEV4cFZhbCk6IHZvaWQge1xyXG4gICAgcmVzVmFsLkF0dHIgPSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBO1xyXG4gICAgcmVzVmFsLlN0clZhbCA9ICcnO1xyXG4gICAgbGV0IHV0aWxJbWVKcG46IFV0aWxJbWVKcG4gPSBNYW5hZ2VyLlV0aWxJbWVKcG47XHJcbiAgICBpZiAodXRpbEltZUpwbiAhPT0gbnVsbCkge1xyXG4gICAgICBsZXQgc3RySW1lUmVhZDogc3RyaW5nID0gdXRpbEltZUpwbi5TdHJJbWVSZWFkO1xyXG4gICAgICBpZiAoIU5TdHJpbmcuSXNOdWxsT3JFbXB0eSh1dGlsSW1lSnBuLlN0ckltZVJlYWQpKSB7XHJcbiAgICAgICAgcmVzVmFsLlN0clZhbCA9IHN0ckltZVJlYWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV2YWxfb3Bfd2luX2hlbHAoZXhwRmlsZVBhdGg6IEV4cFZhbCwgZXhwSGVscENtZDogRXhwVmFsLCBleHBIZWxwS2V5OiBFeHBWYWwsIHJlc1ZhbDogRXhwVmFsKTogdm9pZCB7XHJcbiAgICBsZXQgZmlsZVBhdGg6IHN0cmluZyA9IGV4cEZpbGVQYXRoLlN0clZhbDtcclxuICAgIGxldCBoZWxwQ21kOiBIZWxwQ29tbWFuZCA9IDxIZWxwQ29tbWFuZD5leHBIZWxwQ21kLk1nTnVtVmFsLk5VTV8yX0xPTkcoKTtcclxuICAgIGxldCBoZWxwS2V5OiBzdHJpbmcgPSBleHBIZWxwS2V5LlN0clZhbDtcclxuICAgIHJlc1ZhbC5BdHRyID0gU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIE1hbmFnZXIuU2hvd1dpbmRvd0hlbHAoZmlsZVBhdGgsIGhlbHBDbWQsIGhlbHBLZXkpO1xyXG4gICAgICByZXNWYWwuQm9vbFZhbCA9IHRydWU7XHJcbiAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICByZXNWYWwuQm9vbFZhbCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQ29udmVydEV4cFZhbCh2YWw6IEV4cFZhbCwgZXhwZWN0ZWRUeXBlOiBTdG9yYWdlQXR0cmlidXRlKTogdm9pZCB7XHJcbiAgICBpZiAoU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLlN0b3JhZ2VGbGRBbHBoYVVuaWNvZGVPckJsb2IodmFsLkF0dHIsIGV4cGVjdGVkVHlwZSkpIHtcclxuICAgICAgdGhpcy5CbG9iU3RyaW5nQ29udmVyc2lvbih2YWwsIGV4cGVjdGVkVHlwZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuXHJcbiAgfVxyXG59XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIFRoZSBjbGFzcyBob2xkcyBkYXRhIG9mIGEgYmFzaWMgZWxlbWVudCAoY29uc3RhbnQgb3IgdmFyaWFibGUpIHRoYXRcclxuLy8vICAgYXBwZWFycyBvciBhcmUgcmVzdWx0IG9mIGV4ZWN1dGlvbiBvZiBvcGVyYXRvclxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgRXhwVmFsIHtcclxuICBBdHRyOiBTdG9yYWdlQXR0cmlidXRlID0gU3RvcmFnZUF0dHJpYnV0ZS5OT05FO1xyXG4gIElzTnVsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIE1nTnVtVmFsOiBOVU1fVFlQRSA9IG51bGw7XHJcbiAgU3RyVmFsOiBzdHJpbmcgPSBudWxsO1xyXG4gIEJvb2xWYWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBJbmNsdWRlQmxvYlByZWZpeDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIE9yaWdpbmFsTnVsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIFZlY3RvckZpZWxkOiBHdWlGaWVsZEJhc2UgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpO1xyXG4gIGNvbnN0cnVjdG9yKGF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUsIGlzTnVsbDogYm9vbGVhbiwgbWdWYWw6IHN0cmluZyk7XHJcbiAgY29uc3RydWN0b3IoYXR0cj86IFN0b3JhZ2VBdHRyaWJ1dGUsIGlzTnVsbD86IGJvb2xlYW4sIG1nVmFsPzogc3RyaW5nKSB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzAoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8xKGF0dHIsIGlzTnVsbCwgbWdWYWwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8wKCk6IHZvaWQge1xyXG4gICAgdGhpcy5BdHRyID0gU3RvcmFnZUF0dHJpYnV0ZS5OT05FO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8xKGF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUsIGlzTnVsbDogYm9vbGVhbiwgbWdWYWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5Jbml0KGF0dHIsIGlzTnVsbCwgbWdWYWwpO1xyXG4gIH1cclxuXHJcbiAgQ29weShzcmM6IEV4cFZhbCk6IHZvaWQge1xyXG4gICAgdGhpcy5BdHRyID0gc3JjLkF0dHI7XHJcbiAgICB0aGlzLkJvb2xWYWwgPSBzcmMuQm9vbFZhbDtcclxuICAgIHRoaXMuSW5jbHVkZUJsb2JQcmVmaXggPSBzcmMuSW5jbHVkZUJsb2JQcmVmaXg7XHJcbiAgICB0aGlzLklzTnVsbCA9IHNyYy5Jc051bGw7XHJcbiAgICB0aGlzLk1nTnVtVmFsID0gc3JjLk1nTnVtVmFsO1xyXG4gICAgdGhpcy5TdHJWYWwgPSBzcmMuU3RyVmFsO1xyXG4gICAgdGhpcy5WZWN0b3JGaWVsZCA9IHNyYy5WZWN0b3JGaWVsZDtcclxuICAgIHRoaXMuT3JpZ2luYWxOdWxsID0gc3JjLk9yaWdpbmFsTnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gbnVsbGlmeVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgTnVsbGlmeSgpOiB2b2lkIHtcclxuICAgIHRoaXMuSW5pdChTdG9yYWdlQXR0cmlidXRlLk5PTkUsIHRydWUsIG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGluaXRpYWxpemVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEluaXQoYXR0cjogU3RvcmFnZUF0dHJpYnV0ZSwgaXNOdWxsOiBib29sZWFuLCBtZ1ZhbDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLkF0dHIgPSBhdHRyO1xyXG4gICAgdGhpcy5Jc051bGwgPSBpc051bGw7XHJcblxyXG5cclxuICAgIHN3aXRjaCAodGhpcy5BdHRyKSB7XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREU6XHJcbiAgICAgICAgdGhpcy5TdHJWYWwgPSBtZ1ZhbDtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CTE9COlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1I6XHJcbiAgICAgICAgdGhpcy5TdHJWYWwgPSBtZ1ZhbDtcclxuICAgICAgICB0aGlzLkluY2x1ZGVCbG9iUHJlZml4ID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuREFURTpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlRJTUU6XHJcbiAgICAgICAgdGhpcy5NZ051bVZhbCA9ICgobWdWYWwgIT09IG51bGwpID8gbmV3IE5VTV9UWVBFKG1nVmFsKSA6IG51bGwpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU46XHJcbiAgICAgICAgdGhpcy5Cb29sVmFsID0gKG1nVmFsICE9PSBudWxsICYmIG1nVmFsID09PSAnMScpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5PTkU6XHJcbiAgICAgICAgdGhpcy5Cb29sVmFsID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5TdHJWYWwgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuTWdOdW1WYWwgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuT3JpZ2luYWxOdWxsID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLlZlY3RvckZpZWxkID0gbnVsbDtcclxuICAgICAgICB0aGlzLkluY2x1ZGVCbG9iUHJlZml4ID0gZmFsc2U7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuRE9UTkVUOlxyXG4gICAgICAgIC8vIEZvciBkb3RuZXQgb2JqZWN0cywgRXhwVmFsIHNob3VsZCBiZSBjb25zdHJ1Y3RlZCB1c2luZyBvdmVybG9hZGVkIENvbnN0cnVjdG9yLlxyXG4gICAgICAgIC8vIElmIGl0IGlzIGEgYmxvYlByZWZpeCwgaXQgc2hvdWxkIGJlIGRvbmUgaGVyZS5cclxuICAgICAgICB0aGlzLlN0clZhbCA9IG1nVmFsO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oJ2luIEV4cFZhbC5FeHBWYWwoKSBpbGxlZ2FsIGF0dHJpYnV0ZTogXFwnJyArIHRoaXMuQXR0ciArICdcXCcnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXRzIHRoZSBzdHJpbmcgZm9ybSBvZiB0aGUgdmFsdWUgaW4gdGhlIEV4cFZhbCBjbGFzc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgVG9NZ1ZhbCgpOiBzdHJpbmcge1xyXG5cclxuICAgIGxldCBzdHI6IHN0cmluZztcclxuXHJcbiAgICBzd2l0Y2ggKHRoaXMuQXR0cikge1xyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CTE9COlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1I6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFOlxyXG4gICAgICAgIHN0ciA9IHRoaXMuU3RyVmFsO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5EQVRFOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVElNRTpcclxuICAgICAgICBzdHIgPSB0aGlzLk1nTnVtVmFsLnRvWE1McmVjb3JkKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjpcclxuICAgICAgICBzdHIgPSB0aGlzLkJvb2xWYWxcclxuICAgICAgICAgID8gJzEnXHJcbiAgICAgICAgICA6ICcwJztcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgc3RyID0gJ1tpbGxlZ2FsIGF0dHJpYnV0ZTogJyArIHRoaXMuQXR0ciArICddJztcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiBzdHI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBhbiBlbXB0eSBzdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNFbXB0eVN0cmluZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAodGhpcy5BdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBIHx8IHRoaXMuQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFKSAmJiB0aGlzLlN0clZhbCA9PT0gJyc7XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=
|