@magic-xpa/gui 4.1200.0-dev4120.21 → 4.1200.0-dev4120.213

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.
Files changed (81) hide show
  1. package/fesm2022/magic-xpa-gui.mjs +5724 -249
  2. package/fesm2022/magic-xpa-gui.mjs.map +1 -1
  3. package/index.d.ts +3 -0
  4. package/package.json +2 -4
  5. package/src/GuiEnums.d.ts +3 -0
  6. package/src/gui/GuiMgControl.d.ts +1 -0
  7. package/src/management/exp/ExpressionInterface.d.ts +1 -0
  8. package/src/management/gui/MgControlBase.d.ts +1 -1
  9. package/src/management/gui/PropInterface.d.ts +2 -1
  10. package/esm2022/index.mjs +0 -71
  11. package/esm2022/magic-xpa-gui.mjs +0 -2
  12. package/esm2022/src/Commands.mjs +0 -184
  13. package/esm2022/src/Events.mjs +0 -425
  14. package/esm2022/src/EventsProcessor.mjs +0 -67
  15. package/esm2022/src/FocusManager.mjs +0 -34
  16. package/esm2022/src/GuiConstants.mjs +0 -68
  17. package/esm2022/src/GuiEnums.mjs +0 -301
  18. package/esm2022/src/GuiEnvironment.mjs +0 -4
  19. package/esm2022/src/IFlowMonitorQueue.mjs +0 -2
  20. package/esm2022/src/Manager.mjs +0 -91
  21. package/esm2022/src/UIBridge.mjs +0 -33
  22. package/esm2022/src/env/IEnvironment.mjs +0 -2
  23. package/esm2022/src/gui/ControlBase.mjs +0 -3
  24. package/esm2022/src/gui/GuiMgControl.mjs +0 -123
  25. package/esm2022/src/gui/GuiMgForm.mjs +0 -4
  26. package/esm2022/src/gui/KeyboardItem.mjs +0 -135
  27. package/esm2022/src/gui/LastFocusedVal.mjs +0 -11
  28. package/esm2022/src/gui/MgValue.mjs +0 -16
  29. package/esm2022/src/gui/PropParentInterface.mjs +0 -2
  30. package/esm2022/src/gui/low/DialogHandler.mjs +0 -7
  31. package/esm2022/src/gui/low/GuiCommand.mjs +0 -68
  32. package/esm2022/src/gui/low/GuiCommandQueue.mjs +0 -35
  33. package/esm2022/src/gui/low/GuiInteractive.mjs +0 -178
  34. package/esm2022/src/gui/low/Style.mjs +0 -20
  35. package/esm2022/src/management/RuntimeContextBase.mjs +0 -42
  36. package/esm2022/src/management/data/BlobType.mjs +0 -281
  37. package/esm2022/src/management/data/DcValues.mjs +0 -214
  38. package/esm2022/src/management/data/DcValuesBuilderBase.mjs +0 -96
  39. package/esm2022/src/management/data/FieldDef.mjs +0 -331
  40. package/esm2022/src/management/data/FieldsTable.mjs +0 -54
  41. package/esm2022/src/management/data/GuiDataViewBase.mjs +0 -88
  42. package/esm2022/src/management/data/GuiFieldBase.mjs +0 -82
  43. package/esm2022/src/management/data/IRecord.mjs +0 -2
  44. package/esm2022/src/management/data/IReferencedObject.mjs +0 -2
  45. package/esm2022/src/management/data/NUM_TYPE.mjs +0 -1739
  46. package/esm2022/src/management/data/ObjectReferenceBase.mjs +0 -48
  47. package/esm2022/src/management/data/ObjectReferencesCollection.mjs +0 -27
  48. package/esm2022/src/management/data/RecordUtils.mjs +0 -361
  49. package/esm2022/src/management/data/VectorType.mjs +0 -612
  50. package/esm2022/src/management/data/VectorTypeBase.mjs +0 -88
  51. package/esm2022/src/management/events/IActionManager.mjs +0 -2
  52. package/esm2022/src/management/events/IGuiEventsManager.mjs +0 -2
  53. package/esm2022/src/management/exp/ExpressionInterface.mjs +0 -244
  54. package/esm2022/src/management/exp/GuiExpressionEvaluator.mjs +0 -305
  55. package/esm2022/src/management/gui/ControlTable.mjs +0 -118
  56. package/esm2022/src/management/gui/DisplayConvertor.mjs +0 -1649
  57. package/esm2022/src/management/gui/FieldValidator.mjs +0 -711
  58. package/esm2022/src/management/gui/GuiControlPropertyAdapter.mjs +0 -24
  59. package/esm2022/src/management/gui/GuiFormPropertyAdapter.mjs +0 -11
  60. package/esm2022/src/management/gui/HebrewDate.mjs +0 -278
  61. package/esm2022/src/management/gui/Helps.mjs +0 -237
  62. package/esm2022/src/management/gui/MgControlBase.mjs +0 -1869
  63. package/esm2022/src/management/gui/MgFormBase.mjs +0 -741
  64. package/esm2022/src/management/gui/PIC.mjs +0 -1185
  65. package/esm2022/src/management/gui/PropDefaults.mjs +0 -230
  66. package/esm2022/src/management/gui/PropInterface.mjs +0 -246
  67. package/esm2022/src/management/gui/PropTable.mjs +0 -221
  68. package/esm2022/src/management/gui/Property.mjs +0 -1362
  69. package/esm2022/src/management/gui/ValidationDetails.mjs +0 -248
  70. package/esm2022/src/management/gui/ValidationDetailsBase.mjs +0 -93
  71. package/esm2022/src/management/gui/WrongFormatException.mjs +0 -29
  72. package/esm2022/src/management/tasks/GuiDataCollection.mjs +0 -4
  73. package/esm2022/src/management/tasks/GuiTaskBase.mjs +0 -511
  74. package/esm2022/src/management/tasks/IMGDataTable.mjs +0 -2
  75. package/esm2022/src/management/tasks/ITask.mjs +0 -2
  76. package/esm2022/src/management/tasks/MgTimer.mjs +0 -21
  77. package/esm2022/src/management/tasks/TaskDefinitionId.mjs +0 -54
  78. package/esm2022/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs +0 -41
  79. package/esm2022/src/util/MemoryUtil.mjs +0 -35
  80. package/esm2022/src/util/ObjectReference.mjs +0 -36
  81. package/esm2022/src/util/UsernamePasswordCredentials.mjs +0 -52
@@ -1,221 +0,0 @@
1
- import { ApplicationException, Hashtable, List, NNumber, NString } from "@magic-xpa/mscorelib";
2
- import { Property } from "./Property";
3
- import { XMLConstants, XmlParser } from "@magic-xpa/utils";
4
- import { Events } from "../../Events";
5
- import { PropInterface } from "./PropInterface";
6
- import { GuiFormPropertyAdapter } from "./GuiFormPropertyAdapter";
7
- import { GuiControlPropertyAdapter } from "./GuiControlPropertyAdapter";
8
- export class PropTable {
9
- _hashTab = null;
10
- _props = null;
11
- _parent = null;
12
- constructor(parent_) {
13
- if (arguments.length === 0) {
14
- this.constructor_0();
15
- return;
16
- }
17
- this.constructor_1(parent_);
18
- }
19
- constructor_0() {
20
- this._props = new List();
21
- this._hashTab = new Hashtable(20);
22
- }
23
- constructor_1(parent_) {
24
- this.constructor_0();
25
- this._parent = parent_;
26
- }
27
- fillData(parentObj, parType, parser) {
28
- while (this.initInnerObjects(parser.getNextTag(), parentObj, parType, parser)) {
29
- }
30
- }
31
- fillDataByExists(task, parser) {
32
- while (this.fillExistInnerObjects(parser.getNextTag(), task, parser)) {
33
- }
34
- }
35
- initInnerObjects(foundTagName, parentObj, parType, parser) {
36
- if (foundTagName !== null && foundTagName === XMLConstants.MG_TAG_PROP) {
37
- let property = new Property();
38
- property.fillData(parentObj, parType, parser);
39
- this.addProp(property);
40
- }
41
- else
42
- return false;
43
- return true;
44
- }
45
- addProp(prop) {
46
- this._hashTab.set_Item(prop.getID(), prop);
47
- this._props.push(prop);
48
- }
49
- delPropById(id) {
50
- if (this._props === null)
51
- return;
52
- let existingProp = this._hashTab.get_Item(id);
53
- if (existingProp !== null) {
54
- this._props.Remove(existingProp);
55
- this._hashTab.Remove(id);
56
- }
57
- }
58
- fillExistInnerObjects(nameOfFound, task, parser) {
59
- let tokensVector = new List();
60
- let endContext = -1;
61
- if (nameOfFound == null)
62
- return false;
63
- if (nameOfFound === XMLConstants.MG_TAG_CONTROL)
64
- endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex());
65
- else if (nameOfFound === XMLConstants.MG_TAG_PROP)
66
- endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_TERM, parser.getCurrIndex());
67
- else if (nameOfFound === ('/' + XMLConstants.MG_TAG_CONTROL) ||
68
- GuiFormPropertyAdapter.IsEndFormTag(nameOfFound)) {
69
- parser.setCurrIndex2EndOfTag();
70
- return false;
71
- }
72
- if (endContext !== -1 && endContext < parser.getXMLdata().length) {
73
- let tag = parser.getXMLsubstring(endContext);
74
- parser.add2CurrIndex(tag.indexOf(nameOfFound) + nameOfFound.length);
75
- tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
76
- if (nameOfFound === XMLConstants.MG_TAG_CONTROL) {
77
- this._parent = task.getCtrl(NNumber.Parse(this.fillName(tokensVector)));
78
- parser.setCurrIndex(++endContext);
79
- return true;
80
- }
81
- else if (nameOfFound === XMLConstants.MG_TAG_PROP) {
82
- if (this._parent != null) {
83
- let strPropId = this.fillName(tokensVector);
84
- let propId = NNumber.Parse(strPropId);
85
- let prop = null;
86
- if (this._parent != null)
87
- prop = this._parent.getProp(propId);
88
- if (prop == null)
89
- Events.WriteExceptionToLog(NString.Format("in PropTable.fillExistInnerObjects() no property with id={0}", strPropId));
90
- else
91
- this.addProp(prop);
92
- parser.setCurrIndex(endContext + XMLConstants.TAG_TERM.length);
93
- return true;
94
- }
95
- else
96
- Events.WriteExceptionToLog("in PropTable.fillExistInnerObjects() missing control");
97
- }
98
- else {
99
- Events.WriteExceptionToLog(NString.Format("in PropTable.fillExistInnerObjects() illegal tag name: {0}", nameOfFound));
100
- parser.setCurrIndex(++endContext);
101
- return true;
102
- }
103
- }
104
- if (nameOfFound === XMLConstants.MG_TAG_CONTROL) {
105
- parser.setCurrIndex(++endContext);
106
- return true;
107
- }
108
- else if (GuiFormPropertyAdapter.IsFormTag(nameOfFound)) {
109
- this._parent = task.getForm();
110
- this._parent.fillName(nameOfFound);
111
- return true;
112
- }
113
- else if (nameOfFound === ('/' + XMLConstants.MG_TAG_FLD))
114
- return false;
115
- parser.setCurrIndex(endContext + XMLConstants.TAG_TERM.length);
116
- return true;
117
- }
118
- fillName(tokensVector) {
119
- let attribute = null;
120
- let valueStr;
121
- for (let j = 0; j < tokensVector.length; j = j + 2) {
122
- attribute = tokensVector.get_Item(j);
123
- valueStr = tokensVector.get_Item(j + 1);
124
- if (attribute === XMLConstants.MG_ATTR_DITIDX || attribute === XMLConstants.MG_ATTR_ID)
125
- return valueStr;
126
- }
127
- Events.WriteExceptionToLog(NString.Format("Unrecognized attribute: '{0}'", attribute));
128
- return null;
129
- }
130
- getSize() {
131
- return this._props.length;
132
- }
133
- getProp(idx) {
134
- if (idx < 0 || idx >= this._props.length)
135
- return null;
136
- return this._props.get_Item(idx);
137
- }
138
- getPropById(id) {
139
- return this._hashTab.get_Item(id);
140
- }
141
- propExists(id) {
142
- return this.getPropById(id) !== null;
143
- }
144
- setProp(propId, val, parent, parentType) {
145
- let prop = this.getPropById(propId);
146
- if (prop === null) {
147
- prop = new Property(propId, parent, parentType);
148
- this.addProp(prop);
149
- }
150
- prop.setValue(val);
151
- prop.setOrgValue();
152
- }
153
- async RefreshDisplay(forceRefresh, onlyRepeatableProps) {
154
- let allPropsRefreshed = true;
155
- let prop;
156
- let i = 0;
157
- let form = null;
158
- let visibleProps = new List();
159
- if (this._parent != null && this._parent instanceof GuiControlPropertyAdapter)
160
- form = this._parent.getForm();
161
- if (form != null)
162
- form.checkAndCreateRow(form.DisplayLine);
163
- for (i = 0; i < this.getSize(); i++) {
164
- prop = this.getProp(i);
165
- try {
166
- if (onlyRepeatableProps && !Property.isRepeatableInTable())
167
- continue;
168
- if (prop.getID() === PropInterface.PROP_TYPE_VISIBLE)
169
- visibleProps.push(prop);
170
- else
171
- await prop.RefreshDisplay(forceRefresh);
172
- }
173
- catch (ex) {
174
- if (ex instanceof ApplicationException) {
175
- Events.WriteExceptionToLog(ex);
176
- allPropsRefreshed = false;
177
- }
178
- else
179
- throw ex;
180
- }
181
- }
182
- for (let i = 0; i < visibleProps.length; i++) {
183
- let visibleProp = visibleProps[i];
184
- await visibleProp.RefreshDisplay(forceRefresh);
185
- }
186
- return allPropsRefreshed;
187
- }
188
- updatePrevValueArray(newSize) {
189
- for (let i = 0; i < this._props.length; i = i + 1) {
190
- let property = this._props.get_Item(i);
191
- property.updatePrevValueArray(newSize);
192
- }
193
- }
194
- resetPrevValueArray() {
195
- for (let i = 0; i < this._props.length; i = i + 1) {
196
- let property = this._props.get_Item(i);
197
- property.ResetPrevValueArray();
198
- }
199
- }
200
- resetPrevValAt(index) {
201
- for (let i = 0; i < this._props.length; i = i + 1) {
202
- let property = this._props.get_Item(i);
203
- property.resetPrevValAt(index);
204
- }
205
- }
206
- clearLabelPrevValueArray() {
207
- let labelProperty = this.getPropById(45);
208
- if (labelProperty !== null)
209
- labelProperty.clearPrevValueArray();
210
- }
211
- getCtrlRef() {
212
- return ((this._parent instanceof GuiControlPropertyAdapter) ? this._parent : null);
213
- }
214
- InsertPrevValueArray(count) {
215
- for (let i = 0; i < this._props.length; i++) {
216
- let prop = this._props[i];
217
- prop.InsertPrevValueArray(count);
218
- }
219
- }
220
- }
221
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvcFRhYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3VpL3NyYy9tYW5hZ2VtZW50L2d1aS9Qcm9wVGFibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLG9CQUFvQixFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzdGLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFcEMsT0FBTyxFQUFDLFlBQVksRUFBRSxTQUFTLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUV6RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUt0RSxNQUFNLE9BQU8sU0FBUztJQUVaLFFBQVEsR0FBZ0MsSUFBSSxDQUFDO0lBQzdDLE1BQU0sR0FBbUIsSUFBSSxDQUFDO0lBQzlCLE9BQU8sR0FBd0IsSUFBSSxDQUFDO0lBUTVDLFlBQVksT0FBNkI7UUFFdkMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUMxQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRU8sYUFBYTtRQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksSUFBSSxFQUFZLENBQUM7UUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLFNBQVMsQ0FBbUIsRUFBRSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVPLGFBQWEsQ0FB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YmVyLCBOU3RyaW5nfSBmcm9tIFwiQG1hZ2ljLXhwYS9tc2NvcmVsaWJcIjtcclxuaW1wb3J0IHtQcm9wZXJ0eX0gZnJvbSBcIi4vUHJvcGVydHlcIjtcclxuaW1wb3J0IHtQcm9wUGFyZW50SW50ZXJmYWNlfSBmcm9tIFwiLi4vLi4vZ3VpL1Byb3BQYXJlbnRJbnRlcmZhY2VcIjtcclxuaW1wb3J0IHtYTUxDb25zdGFudHMsIFhtbFBhcnNlcn0gZnJvbSBcIkBtYWdpYy14cGEvdXRpbHNcIjtcclxuaW1wb3J0IHtHdWlUYXNrQmFzZX0gZnJvbSBcIi4uL3Rhc2tzL0d1aVRhc2tCYXNlXCI7XHJcbmltcG9ydCB7RXZlbnRzfSBmcm9tIFwiLi4vLi4vRXZlbnRzXCI7XHJcbmltcG9ydCB7UHJvcEludGVyZmFjZX0gZnJvbSBcIi4vUHJvcEludGVyZmFjZVwiO1xyXG5pbXBvcnQge0d1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXJ9IGZyb20gXCIuL0d1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXJcIjtcclxuaW1wb3J0IHtHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyfSBmcm9tIFwiLi9HdWlDb250cm9sUHJvcGVydHlBZGFwdGVyXCI7XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIHByb3BlcnRpZXMgdGFibGVcclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIFByb3BUYWJsZSB7XHJcblxyXG4gIHByaXZhdGUgX2hhc2hUYWI6IEhhc2h0YWJsZTxudW1iZXIsIFByb3BlcnR5PiA9IG51bGw7IC8vIGZvciBmYXN0IGFjY2VzcyB0byBwcm9wZXJ0aWVzXHJcbiAgcHJpdmF0ZSBfcHJvcHM6IExpc3Q8UHJvcGVydHk+ID0gbnVsbDtcclxuICBwcml2YXRlIF9wYXJlbnQ6IFByb3BQYXJlbnRJbnRlcmZhY2UgPSBudWxsO1xyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENUT1JcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNvbnN0cnVjdG9yKCk7XHJcbiAgY29uc3RydWN0b3IocGFyZW50XzogUHJvcFBhcmVudEludGVyZmFjZSk7XHJcbiAgY29uc3RydWN0b3IocGFyZW50Xz86IFByb3BQYXJlbnRJbnRlcmZhY2UpIHtcclxuXHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzAoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8xKHBhcmVudF8pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8wKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJvcHMgPSBuZXcgTGlzdDxQcm9wZXJ0eT4oKTtcclxuICAgIHRoaXMuX2hhc2hUYWIgPSBuZXcgSGFzaHRhYmxlPG51bWJlciwgUHJvcGVydHk+KDIwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMShwYXJlbnRfOiBQcm9wUGFyZW50SW50ZXJmYWNlKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbnN0cnVjdG9yXzAoKTtcclxuICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudF87XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcGFyc2UgdGhlIHByb3BlcnRpZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGFyZW50T2JqXCI+cmVmZXJlbmNlIHRvIHBhcmVudCBvYmplY3QoR3VpVGFza0Jhc2UpPC9wYXJhbT5cclxuICBmaWxsRGF0YShwYXJlbnRPYmo6IFByb3BQYXJlbnRJbnRlcmZhY2UsIHBhclR5cGU6IHN0cmluZywgcGFyc2VyOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuICAgIHdoaWxlICh0aGlzLmluaXRJbm5lck9iamVjdHMocGFyc2VyLmdldE5leHRUYWcoKSwgcGFyZW50T2JqLCBwYXJUeXBlLCBwYXJzZXIpKSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRm9yIHJlY29tcHV0ZTogUGFyc2UgdGhlIGV4aXN0aW5nIHByb3BlcnRpZXMgYW5kIGNyZWF0ZSByZWZlcmVuY2VzIHRvIHRoZW1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPnJlZmVyZW5jZSB0byB0aGUgcGFyZW50IEd1aVRhc2tCYXNlPC9wYXJhbT5cclxuICBmaWxsRGF0YUJ5RXhpc3RzKHRhc2s6IEd1aVRhc2tCYXNlLCBwYXJzZXI6IFhtbFBhcnNlcik6IHZvaWQge1xyXG4gICAgd2hpbGUgKHRoaXMuZmlsbEV4aXN0SW5uZXJPYmplY3RzKHBhcnNlci5nZXROZXh0VGFnKCksIHRhc2ssIHBhcnNlcikpIHtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBmaWxsIHRoZSBpbm5lciBvYmplY3RzIG9mIHRoZSBjbGFzc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3VuZFRhZ05hbWVcIj5uYW1lIG9mIHRhZywgb2Ygb2JqZWN0LCB3aGljaCBuZWVkIGJlIGFsbG9jYXRlZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwYXJlbnRPYmpcIj5yZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBvYmplY3QsIG5lZWQgYmUgYWRkZWQgdG8gZXZlcnkgUHJvcGVydHk8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gTWFuYWdlci5YbWxQYXJzZXIuZ2V0Q3VyckluZGV4KCksIHRoZSBmb3VuZCBvYmplY3QgdGFnIGFuZCBBTEwgaXRzIHN1YnRhZ3MgZmluaXNoPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgaW5pdElubmVyT2JqZWN0cyhmb3VuZFRhZ05hbWU6IHN0cmluZywgcGFyZW50T2JqOiBQcm9wUGFyZW50SW50ZXJmYWNlLCBwYXJUeXBlOiBzdHJpbmcsIHBhcnNlcjogWG1sUGFyc2VyKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoZm91bmRUYWdOYW1lICE9PSBudWxsICYmIGZvdW5kVGFnTmFtZSA9PT0gWE1MQ29uc3RhbnRzLk1HX1RBR19QUk9QKSB7XHJcbiAgICAgIGxldCBwcm9wZXJ0eTogUHJvcGVydHkgPSBuZXcgUHJvcGVydHkoKTtcclxuICAgICAgcHJvcGVydHkuZmlsbERhdGEocGFyZW50T2JqLCBwYXJUeXBlLCBwYXJzZXIpO1xyXG4gICAgICB0aGlzLmFkZFByb3AocHJvcGVydHkpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhZGRpbmcgcHJvcGVydHkgYnkga2V5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BcIj48L3BhcmFtPlxyXG4gIGFkZFByb3AocHJvcDogUHJvcGVydHkpOiB2b2lkIHtcclxuICAgIHRoaXMuX2hhc2hUYWIuc2V0X0l0ZW0ocHJvcC5nZXRJRCgpLCBwcm9wKTtcclxuICAgIHRoaXMuX3Byb3BzLnB1c2gocHJvcCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkXCI+PC9wYXJhbT5cclxuICBkZWxQcm9wQnlJZChpZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fcHJvcHMgPT09IG51bGwpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBsZXQgZXhpc3RpbmdQcm9wOiBQcm9wZXJ0eSA9IDxQcm9wZXJ0eT50aGlzLl9oYXNoVGFiLmdldF9JdGVtKGlkKTtcclxuICAgIGlmIChleGlzdGluZ1Byb3AgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fcHJvcHMuUmVtb3ZlKGV4aXN0aW5nUHJvcCk7XHJcbiAgICAgIHRoaXMuX2hhc2hUYWIuUmVtb3ZlKGlkKTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRm9yIFJlY29tcHV0ZTogRmlsbCBQcm9wVGFibGUgd2l0aCByZWZlcmVuY2UgdG8gZXhpc3RpbmcgUHJvcFRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj5yZWZlcmVuY2UgdG8gcGFyZW50IEd1aVRhc2tCYXNlPC9wYXJhbT5cclxuICBwcml2YXRlIGZpbGxFeGlzdElubmVyT2JqZWN0cyhuYW1lT2ZGb3VuZDogc3RyaW5nLCB0YXNrOiBHdWlUYXNrQmFzZSwgcGFyc2VyOiBYbWxQYXJzZXIpOiBib29sZWFuIHtcclxuXHJcbiAgICBsZXQgdG9rZW5zVmVjdG9yOiBMaXN0PHN0cmluZz4gPSBuZXcgTGlzdDxzdHJpbmc+KCk7XHJcbiAgICBsZXQgZW5kQ29udGV4dDogbnVtYmVyID0gLTE7XHJcblxyXG4gICAgaWYgKG5hbWVPZkZvdW5kID09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAobmFtZU9mRm91bmQgPT09IFhNTENvbnN0YW50cy5NR19UQUdfQ09OVFJPTClcclxuICAgICAgZW5kQ29udGV4dCA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX0NMT1NFLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgZWxzZSBpZiAobmFtZU9mRm91bmQgPT09IFhNTENvbnN0YW50cy5NR19UQUdfUFJPUClcclxuICAgICAgZW5kQ29udGV4dCA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX1RFUk0sIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICBlbHNlIGlmIChuYW1lT2ZGb3VuZCA9PT0gKCcvJyArIFhNTENvbnN0YW50cy5NR19UQUdfQ09OVFJPTCkgfHxcclxuICAgICAgR3VpRm9ybVByb3BlcnR5QWRhcHRlci5Jc0VuZEZvcm1UYWcobmFtZU9mRm91bmQpKSB7XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChlbmRDb250ZXh0ICE9PSAtMSAmJiBlbmRDb250ZXh0IDwgcGFyc2VyLmdldFhNTGRhdGEoKS5sZW5ndGgpIHtcclxuICAgICAgLy8gbGFzdCBwb3NpdGlvbiBvZiBpdHMgdGFnXHJcbiAgICAgIGxldCB0YWc6IHN0cmluZyA9IHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCk7XHJcbiAgICAgIHBhcnNlci5hZGQyQ3VyckluZGV4KHRhZy5pbmRleE9mKG5hbWVPZkZvdW5kKSArIG5hbWVPZkZvdW5kLmxlbmd0aCk7XHJcbiAgICAgIHRva2Vuc1ZlY3RvciA9IFhtbFBhcnNlci5nZXRUb2tlbnMocGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KSwgWE1MQ29uc3RhbnRzLlhNTF9BVFRSX0RFTElNKTtcclxuICAgICAgaWYgKG5hbWVPZkZvdW5kID09PSBYTUxDb25zdGFudHMuTUdfVEFHX0NPTlRST0wpIHtcclxuICAgICAgICAvLyBkaXRpZHggb2YgRXhpc3RzIENvbnRyb2xcclxuICAgICAgICB0aGlzLl9wYXJlbnQgPSB0YXNrLmdldEN0cmwoTk51bWJlci5QYXJzZSh0aGlzLmZpbGxOYW1lKHRva2Vuc1ZlY3RvcikpKTtcclxuICAgICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KCsrZW5kQ29udGV4dCk7IC8vIHRvIGRlbGV0ZSBcIj5cIlxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKG5hbWVPZkZvdW5kID09PSBYTUxDb25zdGFudHMuTUdfVEFHX1BST1ApIHtcclxuICAgICAgICBpZiAodGhpcy5fcGFyZW50ICE9IG51bGwpIHtcclxuICAgICAgICAgIGxldCBzdHJQcm9wSWQ6IHN0cmluZyA9IHRoaXMuZmlsbE5hbWUodG9rZW5zVmVjdG9yKTtcclxuICAgICAgICAgIGxldCBwcm9wSWQ6IG51bWJlciA9IE5OdW1iZXIuUGFyc2Uoc3RyUHJvcElkKTtcclxuICAgICAgICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IG51bGw7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuX3BhcmVudCAhPSBudWxsKVxyXG4gICAgICAgICAgICBwcm9wID0gdGhpcy5fcGFyZW50LmdldFByb3AocHJvcElkKTtcclxuXHJcbiAgICAgICAgICBpZiAocHJvcCA9PSBudWxsKVxyXG4gICAgICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcImluIFByb3BUYWJsZS5maWxsRXhpc3RJbm5lck9iamVjdHMoKSBubyBwcm9wZXJ0eSB3aXRoIGlkPXswfVwiLCBzdHJQcm9wSWQpKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5hZGRQcm9wKHByb3ApO1xyXG4gICAgICAgICAgcGFyc2VyLnNldEN1cnJJbmRleChlbmRDb250ZXh0ICsgWE1MQ29uc3RhbnRzLlRBR19URVJNLmxlbmd0aCk7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coXCJpbiBQcm9wVGFibGUuZmlsbEV4aXN0SW5uZXJPYmplY3RzKCkgbWlzc2luZyBjb250cm9sXCIpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiaW4gUHJvcFRhYmxlLmZpbGxFeGlzdElubmVyT2JqZWN0cygpIGlsbGVnYWwgdGFnIG5hbWU6IHswfVwiLCBuYW1lT2ZGb3VuZCkpO1xyXG4gICAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoKytlbmRDb250ZXh0KTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChuYW1lT2ZGb3VuZCA9PT0gWE1MQ29uc3RhbnRzLk1HX1RBR19DT05UUk9MKSB7XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoKytlbmRDb250ZXh0KTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChHdWlGb3JtUHJvcGVydHlBZGFwdGVyLklzRm9ybVRhZyhuYW1lT2ZGb3VuZCkpIHtcclxuICAgICAgdGhpcy5fcGFyZW50ID0gdGFzay5nZXRGb3JtKCk7XHJcbiAgICAgICg8R3VpRm9ybVByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudCkuZmlsbE5hbWUobmFtZU9mRm91bmQpO1xyXG5cclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChuYW1lT2ZGb3VuZCA9PT0gKCcvJyArIFhNTENvbnN0YW50cy5NR19UQUdfRkxEKSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIHBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCArIFhNTENvbnN0YW50cy5UQUdfVEVSTS5sZW5ndGgpOyAvLyBleGl0IG9mIGJvdW5kc1xyXG4gICAgcmV0dXJuIHRydWU7XHJcblxyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBGaW5kIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIENvbnRyb2wsIG9yIG9mIGFuIGV4aXN0aW5nIFByb3BlcnR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IE5hbWUgb2YgY29udHJvbDwvcmV0dXJucz5cclxuICBwcml2YXRlIGZpbGxOYW1lKHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+KTogc3RyaW5nIHtcclxuICAgIGxldCBhdHRyaWJ1dGU6IHN0cmluZyA9IG51bGw7XHJcbiAgICBsZXQgdmFsdWVTdHI6IHN0cmluZztcclxuXHJcbiAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgdG9rZW5zVmVjdG9yLmxlbmd0aDsgaiA9IGogKyAyKSB7XHJcbiAgICAgIGF0dHJpYnV0ZSA9IHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqKTtcclxuICAgICAgdmFsdWVTdHIgPSB0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaiArIDEpO1xyXG5cclxuICAgICAgaWYgKGF0dHJpYnV0ZSA9PT0gWE1MQ29uc3RhbnRzLk1HX0FUVFJfRElUSURYIHx8IGF0dHJpYnV0ZSA9PT0gWE1MQ29uc3RhbnRzLk1HX0FUVFJfSUQpXHJcbiAgICAgICAgcmV0dXJuIHZhbHVlU3RyO1xyXG4gICAgfVxyXG4gICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJVbnJlY29nbml6ZWQgYXR0cmlidXRlOiAnezB9J1wiLCBhdHRyaWJ1dGUpKTtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBzaXplIG9mIHRoZSB2ZWN0b3IgcHJvcHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gc2l6ZSBvZiB0aGUgcHJvcHMgbWVtYmVyPC9yZXR1cm5zPlxyXG4gIGdldFNpemUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9wcm9wcy5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGEgUHJvcGVydHkgYnkgaXRzIGluZGV4IGluIHRoZSB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj50aGUgaW5kZXggb2YgdGhlIHByb3BlcnR5PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHJlZmVyZW5jZSB0byB0aGUgcmVxdWlyZWQgUHJvcGVydHk8L3JldHVybnM+XHJcbiAgZ2V0UHJvcChpZHg6IG51bWJlcik6IFByb3BlcnR5IHtcclxuICAgIGlmIChpZHggPCAwIHx8IGlkeCA+PSB0aGlzLl9wcm9wcy5sZW5ndGgpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgcmV0dXJuIHRoaXMuX3Byb3BzLmdldF9JdGVtKGlkeCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGEgUHJvcGVydHkgYnkgaXRzIGlkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkXCI+b2YgdGhlIHByb3BlcnR5PC9wYXJhbT5cclxuICBnZXRQcm9wQnlJZChpZDogbnVtYmVyKTogUHJvcGVydHkge1xyXG4gICAgcmV0dXJuIDxQcm9wZXJ0eT50aGlzLl9oYXNoVGFiLmdldF9JdGVtKGlkKTtcclxuICB9XHJcblxyXG4gIHByb3BFeGlzdHMoaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcEJ5SWQoaWQpICE9PSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBhIHByb3BlcnR5IHZhbHVlLiBpbiBjYXNlIHRoZSB0YWJsZSBkb2Vzbid0IGNvbnRhaW4gc3VjaCBwcm9wZXJ0eSwgY3JlYXRlcyBhIG5ldyBQcm9wZXJ0eSBvYmplY3QgYW5kIGFkZCBpdCB0byB0aGUgdGFibGUuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPnRoZSBpZCBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+dGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwYXJlbnRcIj5hIHJlZmVyZW5jZSB0byB0aGUgcGFyZW50IG9iamVjdDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwYXJlbnRUeXBlXCI+dGhlIHR5cGUgb2YgdGhlIHBhcmVudCBvYmplY3Q8L3BhcmFtPlxyXG4gIHNldFByb3AocHJvcElkOiBudW1iZXIsIHZhbDogc3RyaW5nLCBwYXJlbnQ6IFByb3BQYXJlbnRJbnRlcmZhY2UsIHBhcmVudFR5cGU6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcEJ5SWQocHJvcElkKTtcclxuICAgIGlmIChwcm9wID09PSBudWxsKSB7XHJcbiAgICAgIHByb3AgPSBuZXcgUHJvcGVydHkocHJvcElkLCBwYXJlbnQsIHBhcmVudFR5cGUpO1xyXG4gICAgICB0aGlzLmFkZFByb3AocHJvcCk7XHJcbiAgICB9XHJcbiAgICBwcm9wLnNldFZhbHVlKHZhbCk7XHJcbiAgICBwcm9wLnNldE9yZ1ZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVmcmVzaCBkaXNwbGF5IG9mIHRoZSBwcm9wZXJ0aWVzIGluIHRoZSBUYWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3JjZVJlZnJlc2hcIj5pZiB0cnVlLCByZWZyZXNoIGlzIGZvcmNlZCByZWdhcmRsZXNzIG9mIHRoZSBwcmV2aW91cyB2YWx1ZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvbmx5UmVwZWF0YWJsZVByb3BzXCI+aWYgdHJ1ZSwgcmVmcmVzaGVzIG9ubHkgcmVwZWF0YWJsZSB0cmVlIHByb3BlcnRpZXM8L3BhcmFtPlxyXG4gIGFzeW5jIFJlZnJlc2hEaXNwbGF5KGZvcmNlUmVmcmVzaDogYm9vbGVhbiwgb25seVJlcGVhdGFibGVQcm9wczogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG5cclxuICAgIGxldCBhbGxQcm9wc1JlZnJlc2hlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHk7XHJcbiAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuICAgIGxldCBmb3JtOiBHdWlGb3JtUHJvcGVydHlBZGFwdGVyID0gbnVsbDtcclxuICAgIGxldCB2aXNpYmxlUHJvcHM6IExpc3Q8UHJvcGVydHk+ID0gbmV3IExpc3QoKTtcclxuXHJcblxyXG4gICAgaWYgKHRoaXMuX3BhcmVudCAhPSBudWxsICYmIHRoaXMuX3BhcmVudCBpbnN0YW5jZW9mIEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIpXHJcbiAgICAgIGZvcm0gPSAoPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+dGhpcy5fcGFyZW50KS5nZXRGb3JtKCk7XHJcblxyXG4gICAgaWYgKGZvcm0gIT0gbnVsbClcclxuICAgICAgZm9ybS5jaGVja0FuZENyZWF0ZVJvdyhmb3JtLkRpc3BsYXlMaW5lKTtcclxuXHJcblxyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuZ2V0U2l6ZSgpOyBpKyspIHtcclxuICAgICAgcHJvcCA9IHRoaXMuZ2V0UHJvcChpKTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICAvLyBpZiB0aGlzIHByb3BlcnR5IGlzIG5vdCByZXBlYXRhYmxlIGluIHRyZWUgb3IgdGFibGUsIGFuZCBvbmx5UmVwZWF0YWJsZVByb3BzIHR1cm5lZCBvblxyXG4gICAgICAgIC8vIGRvIG5vdCByZWZyZXNoIHRoaXMgcHJvcGVydHlcclxuICAgICAgICBpZiAob25seVJlcGVhdGFibGVQcm9wcyAmJiAhUHJvcGVydHkuaXNSZXBlYXRhYmxlSW5UYWJsZSgpKVxyXG4gICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgIC8vIFJlZnJlc2ggVmlzaWJsZSBwcm9wIG9ubHkgYWZ0ZXIgcmVmcmVzaGluZyB0aGUgbmF2aWdhdGlvbiBwcm9wcyBsaWtlIFgsIFkuXHJcbiAgICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgY29udHJvbCBpcyBzaG93biBvbiBpdHMgZGVmYXVsdCBsb2NhdGlvbiBmaXJzdCBhbmRcclxuICAgICAgICAvLyB0aGVuIG1vdmVkIHNvbWV3aGVyZSBlbHNlLiBBbmQgdGhpcyBpcyBjbGVhcmx5IHZpc2libGUuXHJcbiAgICAgICAgaWYgKHByb3AuZ2V0SUQoKSA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRSlcclxuICAgICAgICAgIHZpc2libGVQcm9wcy5wdXNoKHByb3ApO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGF3YWl0IHByb3AuUmVmcmVzaERpc3BsYXkoZm9yY2VSZWZyZXNoKTtcclxuICAgICAgfVxyXG4gICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBBcHBsaWNhdGlvbkV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coZXgpO1xyXG4gICAgICAgICAgYWxsUHJvcHNSZWZyZXNoZWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhyb3cgIGV4O1xyXG5cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmlzaWJsZVByb3BzLmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICBsZXQgdmlzaWJsZVByb3AgPSB2aXNpYmxlUHJvcHNbaV07XHJcbiAgICAgIGF3YWl0IHZpc2libGVQcm9wLlJlZnJlc2hEaXNwbGF5KGZvcmNlUmVmcmVzaCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGFsbFByb3BzUmVmcmVzaGVkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHVwZGF0ZSBhbGwgcHJvcGVydGllcyBhcnJheSBzaXplXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1NpemVcIj48L3BhcmFtPlxyXG4gIHVwZGF0ZVByZXZWYWx1ZUFycmF5KG5ld1NpemU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX3Byb3BzLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGxldCBwcm9wZXJ0eTogUHJvcGVydHkgPSB0aGlzLl9wcm9wcy5nZXRfSXRlbShpKTtcclxuICAgICAgcHJvcGVydHkudXBkYXRlUHJldlZhbHVlQXJyYXkobmV3U2l6ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHVwZGF0ZSBhbGwgcHJvcGVydGllcyBhcnJheSBzaXplXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXNldFByZXZWYWx1ZUFycmF5KCk6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX3Byb3BzLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGxldCBwcm9wZXJ0eTogUHJvcGVydHkgPSB0aGlzLl9wcm9wcy5nZXRfSXRlbShpKTtcclxuICAgICAgcHJvcGVydHkuUmVzZXRQcmV2VmFsdWVBcnJheSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXNldCBwcmV2IHZhbHVlIGF0IGluZGV4LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVzZXRQcmV2VmFsQXQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX3Byb3BzLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGxldCBwcm9wZXJ0eTogUHJvcGVydHkgPSB0aGlzLl9wcm9wcy5nZXRfSXRlbShpKTtcclxuICAgICAgcHJvcGVydHkucmVzZXRQcmV2VmFsQXQoaW5kZXgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjbGVhciBwcmV2VmFsdWUgYXJyYXkgb2YgTGFiZWwgcHJvcGVydHkgaWYgZXhpc3RzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjbGVhckxhYmVsUHJldlZhbHVlQXJyYXkoKTogdm9pZCB7XHJcbiAgICBsZXQgbGFiZWxQcm9wZXJ0eTogUHJvcGVydHkgPSB0aGlzLmdldFByb3BCeUlkKDQ1KTtcclxuICAgIGlmIChsYWJlbFByb3BlcnR5ICE9PSBudWxsKVxyXG4gICAgICBsYWJlbFByb3BlcnR5LmNsZWFyUHJldlZhbHVlQXJyYXkoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0Q3RybFJlZigpOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyIHtcclxuICAgIHJldHVybiAoKHRoaXMuX3BhcmVudCBpbnN0YW5jZW9mIEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIpID8gPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+dGhpcy5fcGFyZW50IDogbnVsbCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgSW5zZXJ0UHJldlZhbHVlQXJyYXkoIGNvdW50OiBudW1iZXIpIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9wcm9wcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgcHJvcDogUHJvcGVydHkgPSB0aGlzLl9wcm9wc1tpXTtcclxuICAgICAgcHJvcC5JbnNlcnRQcmV2VmFsdWVBcnJheShjb3VudCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==