@magic-xpa/gui 4.1100.0-dev4110.24 → 4.1100.0-dev4110.241
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/{esm2020 → esm2022}/index.mjs +71 -71
- package/{esm2020 → esm2022}/magic-xpa-gui.mjs +1 -1
- package/esm2022/src/Commands.mjs +184 -0
- package/esm2022/src/Events.mjs +425 -0
- package/esm2022/src/EventsProcessor.mjs +67 -0
- package/esm2022/src/FocusManager.mjs +34 -0
- package/esm2022/src/GuiConstants.mjs +68 -0
- package/{esm2020 → esm2022}/src/GuiEnums.mjs +299 -299
- package/esm2022/src/GuiEnvironment.mjs +4 -0
- package/{esm2020 → esm2022}/src/IFlowMonitorQueue.mjs +1 -1
- package/{esm2020 → esm2022}/src/Manager.mjs +91 -91
- package/esm2022/src/UIBridge.mjs +33 -0
- package/{esm2020 → esm2022}/src/env/IEnvironment.mjs +1 -1
- package/{esm2020 → esm2022}/src/gui/ControlBase.mjs +2 -2
- package/esm2022/src/gui/GuiMgControl.mjs +123 -0
- package/{esm2020 → esm2022}/src/gui/GuiMgForm.mjs +3 -3
- package/esm2022/src/gui/KeyboardItem.mjs +135 -0
- package/esm2022/src/gui/LastFocusedVal.mjs +11 -0
- package/esm2022/src/gui/MgValue.mjs +16 -0
- package/{esm2020 → esm2022}/src/gui/PropParentInterface.mjs +1 -1
- package/{esm2020 → esm2022}/src/gui/low/DialogHandler.mjs +6 -6
- package/esm2022/src/gui/low/GuiCommand.mjs +68 -0
- package/esm2022/src/gui/low/GuiCommandQueue.mjs +35 -0
- package/esm2022/src/gui/low/GuiInteractive.mjs +177 -0
- package/esm2022/src/gui/low/Style.mjs +20 -0
- package/esm2022/src/management/RuntimeContextBase.mjs +42 -0
- package/esm2022/src/management/data/BlobType.mjs +281 -0
- package/{esm2020 → esm2022}/src/management/data/DcValues.mjs +214 -214
- package/esm2022/src/management/data/DcValuesBuilderBase.mjs +96 -0
- package/esm2022/src/management/data/FieldDef.mjs +331 -0
- package/esm2022/src/management/data/FieldsTable.mjs +54 -0
- package/esm2022/src/management/data/GuiDataViewBase.mjs +88 -0
- package/esm2022/src/management/data/GuiFieldBase.mjs +82 -0
- package/{esm2020 → esm2022}/src/management/data/IRecord.mjs +1 -1
- package/{esm2020 → esm2022}/src/management/data/IReferencedObject.mjs +1 -1
- package/esm2022/src/management/data/NUM_TYPE.mjs +1739 -0
- package/esm2022/src/management/data/ObjectReferenceBase.mjs +48 -0
- package/esm2022/src/management/data/ObjectReferencesCollection.mjs +27 -0
- package/esm2022/src/management/data/RecordUtils.mjs +361 -0
- package/esm2022/src/management/data/VectorType.mjs +612 -0
- package/esm2022/src/management/data/VectorTypeBase.mjs +88 -0
- package/{esm2020 → esm2022}/src/management/events/IActionManager.mjs +1 -1
- package/{esm2020 → esm2022}/src/management/events/IGuiEventsManager.mjs +1 -1
- package/esm2022/src/management/exp/ExpressionInterface.mjs +244 -0
- package/{esm2020 → esm2022}/src/management/exp/GuiExpressionEvaluator.mjs +305 -307
- package/esm2022/src/management/gui/ControlTable.mjs +118 -0
- package/esm2022/src/management/gui/DisplayConvertor.mjs +1649 -0
- package/esm2022/src/management/gui/FieldValidator.mjs +711 -0
- package/esm2022/src/management/gui/GuiControlPropertyAdapter.mjs +24 -0
- package/{esm2020 → esm2022}/src/management/gui/GuiFormPropertyAdapter.mjs +10 -10
- package/esm2022/src/management/gui/HebrewDate.mjs +278 -0
- package/esm2022/src/management/gui/Helps.mjs +237 -0
- package/esm2022/src/management/gui/MgControlBase.mjs +1859 -0
- package/esm2022/src/management/gui/MgFormBase.mjs +741 -0
- package/esm2022/src/management/gui/PIC.mjs +1185 -0
- package/esm2022/src/management/gui/PropDefaults.mjs +230 -0
- package/{esm2020 → esm2022}/src/management/gui/PropInterface.mjs +246 -245
- package/esm2022/src/management/gui/PropTable.mjs +221 -0
- package/esm2022/src/management/gui/Property.mjs +1362 -0
- package/esm2022/src/management/gui/ValidationDetails.mjs +248 -0
- package/esm2022/src/management/gui/ValidationDetailsBase.mjs +93 -0
- package/esm2022/src/management/gui/WrongFormatException.mjs +29 -0
- package/esm2022/src/management/tasks/GuiDataCollection.mjs +4 -0
- package/esm2022/src/management/tasks/GuiTaskBase.mjs +511 -0
- package/{esm2020 → esm2022}/src/management/tasks/IMGDataTable.mjs +1 -1
- package/{esm2020 → esm2022}/src/management/tasks/ITask.mjs +1 -1
- package/esm2022/src/management/tasks/MgTimer.mjs +21 -0
- package/esm2022/src/management/tasks/TaskDefinitionId.mjs +54 -0
- package/esm2022/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs +41 -0
- package/esm2022/src/util/MemoryUtil.mjs +35 -0
- package/{esm2020 → esm2022}/src/util/ObjectReference.mjs +36 -36
- package/esm2022/src/util/UsernamePasswordCredentials.mjs +52 -0
- package/{fesm2020 → fesm2022}/magic-xpa-gui.mjs +16074 -16074
- package/fesm2022/magic-xpa-gui.mjs.map +1 -0
- package/index.d.ts +70 -70
- package/package.json +6 -12
- package/src/Commands.d.ts +40 -39
- package/src/Events.d.ts +157 -155
- package/src/EventsProcessor.d.ts +13 -13
- package/src/FocusManager.d.ts +8 -8
- package/src/GuiConstants.d.ts +65 -65
- package/src/GuiEnums.d.ts +282 -282
- package/src/GuiEnvironment.d.ts +4 -4
- package/src/IFlowMonitorQueue.d.ts +3 -3
- package/src/Manager.d.ts +26 -26
- package/src/UIBridge.d.ts +16 -16
- package/src/env/IEnvironment.d.ts +31 -31
- package/src/gui/ControlBase.d.ts +4 -4
- package/src/gui/GuiMgControl.d.ts +38 -38
- package/src/gui/GuiMgForm.d.ts +3 -3
- package/src/gui/KeyboardItem.d.ts +18 -18
- package/src/gui/LastFocusedVal.d.ts +7 -7
- package/src/gui/MgValue.d.ts +15 -15
- package/src/gui/PropParentInterface.d.ts +13 -13
- package/src/gui/low/DialogHandler.d.ts +4 -4
- package/src/gui/low/GuiCommand.d.ts +37 -37
- package/src/gui/low/GuiCommandQueue.d.ts +13 -13
- package/src/gui/low/GuiInteractive.d.ts +55 -53
- package/src/gui/low/Style.d.ts +19 -19
- package/src/management/RuntimeContextBase.d.ts +23 -23
- package/src/management/data/BlobType.d.ts +29 -29
- package/src/management/data/DcValues.d.ts +33 -33
- package/src/management/data/DcValuesBuilderBase.d.ts +17 -17
- package/src/management/data/FieldDef.d.ts +53 -53
- package/src/management/data/FieldsTable.d.ts +16 -16
- package/src/management/data/GuiDataViewBase.d.ts +27 -27
- package/src/management/data/GuiFieldBase.d.ts +17 -17
- package/src/management/data/IRecord.d.ts +12 -12
- package/src/management/data/IReferencedObject.d.ts +5 -5
- package/src/management/data/NUM_TYPE.d.ts +103 -103
- package/src/management/data/ObjectReferenceBase.d.ts +16 -16
- package/src/management/data/ObjectReferencesCollection.d.ts +10 -10
- package/src/management/data/RecordUtils.d.ts +21 -21
- package/src/management/data/VectorType.d.ts +52 -52
- package/src/management/data/VectorTypeBase.d.ts +8 -8
- package/src/management/events/IActionManager.d.ts +7 -7
- package/src/management/events/IGuiEventsManager.d.ts +20 -20
- package/src/management/exp/ExpressionInterface.d.ts +242 -242
- package/src/management/exp/GuiExpressionEvaluator.d.ts +47 -47
- package/src/management/gui/ControlTable.d.ts +28 -28
- package/src/management/gui/DisplayConvertor.d.ts +103 -103
- package/src/management/gui/FieldValidator.d.ts +35 -35
- package/src/management/gui/GuiControlPropertyAdapter.d.ts +40 -40
- package/src/management/gui/GuiFormPropertyAdapter.d.ts +17 -17
- package/src/management/gui/HebrewDate.d.ts +46 -46
- package/src/management/gui/Helps.d.ts +51 -51
- package/src/management/gui/MgControlBase.d.ts +223 -223
- package/src/management/gui/MgFormBase.d.ts +160 -160
- package/src/management/gui/PIC.d.ts +108 -108
- package/src/management/gui/PropDefaults.d.ts +7 -7
- package/src/management/gui/PropInterface.d.ts +244 -243
- package/src/management/gui/PropTable.d.ts +33 -33
- package/src/management/gui/Property.d.ts +121 -121
- package/src/management/gui/ValidationDetails.d.ts +52 -52
- package/src/management/gui/ValidationDetailsBase.d.ts +14 -14
- package/src/management/gui/WrongFormatException.d.ts +9 -9
- package/src/management/tasks/GuiDataCollection.d.ts +4 -4
- package/src/management/tasks/GuiTaskBase.d.ts +150 -150
- package/src/management/tasks/IMGDataTable.d.ts +10 -10
- package/src/management/tasks/ITask.d.ts +6 -6
- package/src/management/tasks/MgTimer.d.ts +8 -8
- package/src/management/tasks/TaskDefinitionId.d.ts +16 -16
- package/src/management/tasks/TaskDefinitionIdTableSaxHandler.d.ts +7 -7
- package/src/util/MemoryUtil.d.ts +6 -6
- package/src/util/ObjectReference.d.ts +9 -9
- package/src/util/UsernamePasswordCredentials.d.ts +18 -18
- package/esm2020/src/Commands.mjs +0 -177
- package/esm2020/src/Events.mjs +0 -420
- package/esm2020/src/EventsProcessor.mjs +0 -67
- package/esm2020/src/FocusManager.mjs +0 -34
- package/esm2020/src/GuiConstants.mjs +0 -68
- package/esm2020/src/GuiEnvironment.mjs +0 -4
- package/esm2020/src/UIBridge.mjs +0 -32
- package/esm2020/src/gui/GuiMgControl.mjs +0 -125
- package/esm2020/src/gui/KeyboardItem.mjs +0 -135
- package/esm2020/src/gui/LastFocusedVal.mjs +0 -11
- package/esm2020/src/gui/MgValue.mjs +0 -16
- package/esm2020/src/gui/low/GuiCommand.mjs +0 -66
- package/esm2020/src/gui/low/GuiCommandQueue.mjs +0 -35
- package/esm2020/src/gui/low/GuiInteractive.mjs +0 -165
- package/esm2020/src/gui/low/Style.mjs +0 -20
- package/esm2020/src/management/RuntimeContextBase.mjs +0 -43
- package/esm2020/src/management/data/BlobType.mjs +0 -281
- package/esm2020/src/management/data/DcValuesBuilderBase.mjs +0 -96
- package/esm2020/src/management/data/FieldDef.mjs +0 -331
- package/esm2020/src/management/data/FieldsTable.mjs +0 -54
- package/esm2020/src/management/data/GuiDataViewBase.mjs +0 -90
- package/esm2020/src/management/data/GuiFieldBase.mjs +0 -82
- package/esm2020/src/management/data/NUM_TYPE.mjs +0 -1741
- package/esm2020/src/management/data/ObjectReferenceBase.mjs +0 -48
- package/esm2020/src/management/data/ObjectReferencesCollection.mjs +0 -29
- package/esm2020/src/management/data/RecordUtils.mjs +0 -361
- package/esm2020/src/management/data/VectorType.mjs +0 -612
- package/esm2020/src/management/data/VectorTypeBase.mjs +0 -88
- package/esm2020/src/management/exp/ExpressionInterface.mjs +0 -244
- package/esm2020/src/management/gui/ControlTable.mjs +0 -118
- package/esm2020/src/management/gui/DisplayConvertor.mjs +0 -1679
- package/esm2020/src/management/gui/FieldValidator.mjs +0 -711
- package/esm2020/src/management/gui/GuiControlPropertyAdapter.mjs +0 -22
- package/esm2020/src/management/gui/HebrewDate.mjs +0 -278
- package/esm2020/src/management/gui/Helps.mjs +0 -237
- package/esm2020/src/management/gui/MgControlBase.mjs +0 -1858
- package/esm2020/src/management/gui/MgFormBase.mjs +0 -738
- package/esm2020/src/management/gui/PIC.mjs +0 -1185
- package/esm2020/src/management/gui/PropDefaults.mjs +0 -230
- package/esm2020/src/management/gui/PropTable.mjs +0 -221
- package/esm2020/src/management/gui/Property.mjs +0 -1356
- package/esm2020/src/management/gui/ValidationDetails.mjs +0 -248
- package/esm2020/src/management/gui/ValidationDetailsBase.mjs +0 -93
- package/esm2020/src/management/gui/WrongFormatException.mjs +0 -29
- package/esm2020/src/management/tasks/GuiDataCollection.mjs +0 -4
- package/esm2020/src/management/tasks/GuiTaskBase.mjs +0 -510
- package/esm2020/src/management/tasks/MgTimer.mjs +0 -21
- package/esm2020/src/management/tasks/TaskDefinitionId.mjs +0 -54
- package/esm2020/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs +0 -41
- package/esm2020/src/util/MemoryUtil.mjs +0 -35
- package/esm2020/src/util/UsernamePasswordCredentials.mjs +0 -52
- package/fesm2015/magic-xpa-gui.mjs +0 -16364
- package/fesm2015/magic-xpa-gui.mjs.map +0 -1
- package/fesm2020/magic-xpa-gui.mjs.map +0 -1
|
@@ -0,0 +1,1739 @@
|
|
|
1
|
+
import { Int32, NNumber, NString, NumberStyles, StringBuilder } from '@magic-xpa/mscorelib';
|
|
2
|
+
import { Constants, PICInterface, Randomizer, StorageAttribute, UtilStrByteMode } from '@magic-xpa/utils';
|
|
3
|
+
import { PIC } from '../gui/PIC';
|
|
4
|
+
import { Events } from '../../Events';
|
|
5
|
+
import { GuiEnvironment } from '../../GuiEnvironment';
|
|
6
|
+
export class NUM_TYPE {
|
|
7
|
+
static INT_ZERO_HEX = "00000000";
|
|
8
|
+
static NO_ROOM = -1;
|
|
9
|
+
static ZERO_FILL = -2;
|
|
10
|
+
static NUM_SIZE = 20;
|
|
11
|
+
static NUM_LONG_TYPE = -1;
|
|
12
|
+
static EXP_BIAS = 64;
|
|
13
|
+
static SIGN_MASK = -128;
|
|
14
|
+
COMMACHAR = ',';
|
|
15
|
+
DECIMALCHAR = '.';
|
|
16
|
+
SIGNIFICANT_NUM_SIZE = 0;
|
|
17
|
+
_data = new Int8Array(NUM_TYPE.NUM_SIZE);
|
|
18
|
+
set Data(value) {
|
|
19
|
+
this._data = value;
|
|
20
|
+
}
|
|
21
|
+
get Data() {
|
|
22
|
+
return this._data;
|
|
23
|
+
}
|
|
24
|
+
constructor(recordHexStrOrByteValOrDecStrOrNumFrom, offsetOrPic, lengthOrCompIdx) {
|
|
25
|
+
if (arguments.length === 0) {
|
|
26
|
+
this.constructor_0();
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (arguments.length === 1 && (recordHexStrOrByteValOrDecStrOrNumFrom === null || recordHexStrOrByteValOrDecStrOrNumFrom.constructor === String)) {
|
|
30
|
+
this.constructor_1(recordHexStrOrByteValOrDecStrOrNumFrom);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (arguments.length === 3 && (recordHexStrOrByteValOrDecStrOrNumFrom === null || recordHexStrOrByteValOrDecStrOrNumFrom instanceof Int8Array) && (offsetOrPic === null || offsetOrPic.constructor === Number) && (lengthOrCompIdx === null || lengthOrCompIdx.constructor === Number)) {
|
|
34
|
+
this.constructor_2(recordHexStrOrByteValOrDecStrOrNumFrom, offsetOrPic, lengthOrCompIdx);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (arguments.length === 1 && (recordHexStrOrByteValOrDecStrOrNumFrom === null || recordHexStrOrByteValOrDecStrOrNumFrom instanceof Int8Array)) {
|
|
38
|
+
this.constructor_3(recordHexStrOrByteValOrDecStrOrNumFrom);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (arguments.length === 3 && (recordHexStrOrByteValOrDecStrOrNumFrom === null || recordHexStrOrByteValOrDecStrOrNumFrom.constructor === String) && (offsetOrPic === null || offsetOrPic instanceof PIC) && (lengthOrCompIdx === null || lengthOrCompIdx.constructor === Number)) {
|
|
42
|
+
this.constructor_4(recordHexStrOrByteValOrDecStrOrNumFrom, offsetOrPic, lengthOrCompIdx);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
this.constructor_5(recordHexStrOrByteValOrDecStrOrNumFrom);
|
|
46
|
+
}
|
|
47
|
+
constructor_0() {
|
|
48
|
+
this.initConst();
|
|
49
|
+
this.NUM_ZERO();
|
|
50
|
+
}
|
|
51
|
+
constructor_1(recordHexStr) {
|
|
52
|
+
let i = 0;
|
|
53
|
+
let twoDigits;
|
|
54
|
+
this.initConst();
|
|
55
|
+
try {
|
|
56
|
+
for (i = 0; i < this.SIGNIFICANT_NUM_SIZE; i = i + 1) {
|
|
57
|
+
twoDigits = recordHexStr.substr(i * 2, 2);
|
|
58
|
+
this._data[i] = NUM_TYPE.toSByte(NNumber.Parse(twoDigits, NumberStyles.HexNumber));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch (ex) {
|
|
62
|
+
Events.WriteWarningToLog(ex);
|
|
63
|
+
this.NUM_ZERO();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
constructor_2(byteVal, offset, length) {
|
|
67
|
+
this.constructor_0();
|
|
68
|
+
for (let i = 0; i < length; i = i + 1) {
|
|
69
|
+
this._data[i] = byteVal[i + offset];
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
constructor_3(byteVal) {
|
|
73
|
+
this.constructor_2(byteVal, 0, byteVal.length);
|
|
74
|
+
}
|
|
75
|
+
constructor_4(decStr, pic, compIdx) {
|
|
76
|
+
this.constructor_0();
|
|
77
|
+
this.from_a(decStr, pic, compIdx);
|
|
78
|
+
}
|
|
79
|
+
constructor_5(numFrom) {
|
|
80
|
+
this.initConst();
|
|
81
|
+
this._data = new Int8Array(numFrom._data.length);
|
|
82
|
+
for (let _ai = 0; _ai < this._data.length; ++_ai)
|
|
83
|
+
this._data[_ai] = numFrom._data[_ai];
|
|
84
|
+
}
|
|
85
|
+
toDisplayValue(pic) {
|
|
86
|
+
return this.to_a(pic);
|
|
87
|
+
}
|
|
88
|
+
initConst() {
|
|
89
|
+
let env = GuiEnvironment.Environment;
|
|
90
|
+
this.DECIMALCHAR = env.GetDecimal();
|
|
91
|
+
this.COMMACHAR = env.GetThousands();
|
|
92
|
+
this.SIGNIFICANT_NUM_SIZE = env.GetSignificantNumSize();
|
|
93
|
+
}
|
|
94
|
+
toXMLrecord() {
|
|
95
|
+
let hexStr = new StringBuilder(this.SIGNIFICANT_NUM_SIZE * 2);
|
|
96
|
+
let num;
|
|
97
|
+
if (this.NUM_IS_LONG())
|
|
98
|
+
num = 5;
|
|
99
|
+
else
|
|
100
|
+
num = this.SIGNIFICANT_NUM_SIZE;
|
|
101
|
+
for (let i = 0; i < this.SIGNIFICANT_NUM_SIZE; i++) {
|
|
102
|
+
if (i < num)
|
|
103
|
+
hexStr.Append(('0' + (this._data[i] & 0xFF).toString(16)).slice(-2));
|
|
104
|
+
else
|
|
105
|
+
hexStr.Append("00");
|
|
106
|
+
}
|
|
107
|
+
return hexStr.ToString().toUpperCase();
|
|
108
|
+
}
|
|
109
|
+
from_a(Alpha, pic, compIdx) {
|
|
110
|
+
let i;
|
|
111
|
+
let idx;
|
|
112
|
+
let dec;
|
|
113
|
+
let decs;
|
|
114
|
+
let digit;
|
|
115
|
+
let len;
|
|
116
|
+
let no_pic;
|
|
117
|
+
let Pos;
|
|
118
|
+
let SType;
|
|
119
|
+
let SPart;
|
|
120
|
+
let Signed;
|
|
121
|
+
let buf;
|
|
122
|
+
let mask = "";
|
|
123
|
+
let c;
|
|
124
|
+
let NgtvPrmt;
|
|
125
|
+
let Scan = "";
|
|
126
|
+
let Pbuf = "";
|
|
127
|
+
let is_negative;
|
|
128
|
+
let negStr;
|
|
129
|
+
let negPref;
|
|
130
|
+
let posPref;
|
|
131
|
+
let negSuff;
|
|
132
|
+
let posSuff;
|
|
133
|
+
let specialValNewPolicy = GuiEnvironment.Environment.GetSpecialValNewPolicy();
|
|
134
|
+
no_pic = (pic == null);
|
|
135
|
+
len = 0;
|
|
136
|
+
SType = false;
|
|
137
|
+
SPart = false;
|
|
138
|
+
if (!no_pic) {
|
|
139
|
+
mask = pic.getMask();
|
|
140
|
+
if (!specialValNewPolicy)
|
|
141
|
+
if (Alpha.length > pic.getMaskSize())
|
|
142
|
+
Alpha = Alpha.substr(0, pic.getMaskSize());
|
|
143
|
+
NgtvPrmt = pic.isNegative();
|
|
144
|
+
if (NgtvPrmt) {
|
|
145
|
+
negPref = pic.getNegPref_();
|
|
146
|
+
posPref = pic.getPosPref_();
|
|
147
|
+
negSuff = pic.getNegSuff_();
|
|
148
|
+
posSuff = pic.getPosSuff_();
|
|
149
|
+
if (negPref.length === posPref.length) {
|
|
150
|
+
if (negPref.length === 0 || negPref === posPref)
|
|
151
|
+
SPart = false;
|
|
152
|
+
else
|
|
153
|
+
SPart = true;
|
|
154
|
+
}
|
|
155
|
+
else
|
|
156
|
+
SPart = true;
|
|
157
|
+
if (SPart)
|
|
158
|
+
negStr = negPref;
|
|
159
|
+
else
|
|
160
|
+
negStr = negSuff;
|
|
161
|
+
if (negStr.length === 0)
|
|
162
|
+
SType = true;
|
|
163
|
+
else
|
|
164
|
+
SType = false;
|
|
165
|
+
if (SType)
|
|
166
|
+
Scan = (SPart ? posPref : posSuff);
|
|
167
|
+
else
|
|
168
|
+
Scan = (SPart ? negPref : negSuff);
|
|
169
|
+
len = Scan.length;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
pic = new PIC("", StorageAttribute.NUMERIC, compIdx);
|
|
174
|
+
NgtvPrmt = false;
|
|
175
|
+
}
|
|
176
|
+
dec = false;
|
|
177
|
+
decs = 0;
|
|
178
|
+
digit = 0;
|
|
179
|
+
Signed = 0;
|
|
180
|
+
for (idx = 0; idx < Alpha.length;) {
|
|
181
|
+
if (no_pic || (specialValNewPolicy && idx >= pic.getMaskSize()) || mask[idx] === String.fromCharCode(PICInterface.PIC_N)) {
|
|
182
|
+
c = Alpha[idx];
|
|
183
|
+
if (specialValNewPolicy) {
|
|
184
|
+
if (dec && decs === pic.getDec()) {
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
if (UtilStrByteMode.isDigit(c)) {
|
|
189
|
+
digit++;
|
|
190
|
+
Pbuf += c;
|
|
191
|
+
if (dec)
|
|
192
|
+
decs++;
|
|
193
|
+
}
|
|
194
|
+
else if (c === this.DECIMALCHAR) {
|
|
195
|
+
Pbuf += this.DECIMALCHAR;
|
|
196
|
+
dec = true;
|
|
197
|
+
}
|
|
198
|
+
else if (c !== this.COMMACHAR) {
|
|
199
|
+
if (NgtvPrmt && Signed === 0) {
|
|
200
|
+
Signed = 1;
|
|
201
|
+
for (i = idx, Pos = 0; i <= Alpha.length && Pos < len; i++) {
|
|
202
|
+
if (no_pic || mask[i] === String.fromCharCode(PICInterface.PIC_N)) {
|
|
203
|
+
c = Alpha[i];
|
|
204
|
+
if (c !== Scan[Pos]) {
|
|
205
|
+
if (c === '-' && !SType)
|
|
206
|
+
break;
|
|
207
|
+
if (c === '+' && SType)
|
|
208
|
+
break;
|
|
209
|
+
Signed = -1;
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
Pos++;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
if (Pos > 0 && Pos < len)
|
|
216
|
+
Signed = -1;
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
if (idx === 0) {
|
|
220
|
+
if (pic.getNegPref_().length > 0)
|
|
221
|
+
if (Alpha.startsWith(pic.getNegPref_())) {
|
|
222
|
+
idx += pic.getNegPref_().length;
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
if (pic.getPosPref_().length > 0)
|
|
226
|
+
if (Alpha.startsWith(pic.getPosPref_())) {
|
|
227
|
+
idx += pic.getPosPref_().length;
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
if (pic.getNegSuff_().length > 0)
|
|
233
|
+
if (Alpha.endsWith(pic.getNegSuff_())) {
|
|
234
|
+
idx += pic.getNegSuff_().length;
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
if (pic.getPosSuff_().length > 0)
|
|
238
|
+
if (Alpha.endsWith(pic.getPosSuff_())) {
|
|
239
|
+
idx += pic.getPosSuff_().length;
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
idx++;
|
|
247
|
+
}
|
|
248
|
+
if (Signed === 0 && SType)
|
|
249
|
+
Signed = 1;
|
|
250
|
+
is_negative = (Signed === 1 && !SType) || (Signed !== 1 && SType);
|
|
251
|
+
if (decs > 0 || digit > 9) {
|
|
252
|
+
buf = (is_negative ? '-' : ' ') + Pbuf;
|
|
253
|
+
this.num_4_a_std(buf);
|
|
254
|
+
}
|
|
255
|
+
else
|
|
256
|
+
this.NUM_4_LONG((is_negative ? -1 : 1) * this.a_2_long(Pbuf));
|
|
257
|
+
}
|
|
258
|
+
num_4_a_std(str) {
|
|
259
|
+
let digstr = "";
|
|
260
|
+
let diglen = 0;
|
|
261
|
+
let wholes = 0;
|
|
262
|
+
let decs = 0;
|
|
263
|
+
let isDec = false;
|
|
264
|
+
let isminus = false;
|
|
265
|
+
let pos;
|
|
266
|
+
for (pos = 0; pos < str.length; pos++) {
|
|
267
|
+
let c = str.charAt(pos);
|
|
268
|
+
if (UtilStrByteMode.isDigit(c)) {
|
|
269
|
+
if (diglen > 0 || c !== '0') {
|
|
270
|
+
diglen++;
|
|
271
|
+
digstr = digstr + c;
|
|
272
|
+
if (!isDec)
|
|
273
|
+
wholes++;
|
|
274
|
+
}
|
|
275
|
+
else if (isDec)
|
|
276
|
+
decs = decs + 1;
|
|
277
|
+
}
|
|
278
|
+
else if (c === this.DECIMALCHAR)
|
|
279
|
+
isDec = true;
|
|
280
|
+
else if (c === '-')
|
|
281
|
+
isminus = true;
|
|
282
|
+
}
|
|
283
|
+
this.NUM_ZERO();
|
|
284
|
+
if (diglen === 0)
|
|
285
|
+
return;
|
|
286
|
+
if (((wholes + decs) & 1) > 0) {
|
|
287
|
+
this._data[1] = NUM_TYPE.toSByte(digstr.charCodeAt(0) - '0'.charCodeAt(0));
|
|
288
|
+
pos = 1;
|
|
289
|
+
}
|
|
290
|
+
else
|
|
291
|
+
pos = 0;
|
|
292
|
+
let numptr = 1 + pos;
|
|
293
|
+
diglen = Math.min(diglen, (this.SIGNIFICANT_NUM_SIZE - 1) * 2 - pos);
|
|
294
|
+
while (pos < diglen) {
|
|
295
|
+
let digit1 = NUM_TYPE.toSByte((digstr.charCodeAt(pos++) - '0'.charCodeAt(0)));
|
|
296
|
+
let digit2 = NUM_TYPE.toSByte(((pos < diglen)
|
|
297
|
+
? (digstr.charCodeAt(pos++) - '0'.charCodeAt(0))
|
|
298
|
+
: '\0'.charCodeAt(0)));
|
|
299
|
+
this._data[numptr++] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(digit1) * 10 + NUM_TYPE.toUByte(digit2));
|
|
300
|
+
}
|
|
301
|
+
if (wholes > 0)
|
|
302
|
+
this._data[0] = NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + ((wholes + 1) >> 1));
|
|
303
|
+
else
|
|
304
|
+
this._data[0] = NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS - (decs >> 1));
|
|
305
|
+
if (isminus)
|
|
306
|
+
this._data[0] |= NUM_TYPE.SIGN_MASK;
|
|
307
|
+
}
|
|
308
|
+
NUM_4_LONG(longVal) {
|
|
309
|
+
let hexStr;
|
|
310
|
+
this.NUM_ZERO();
|
|
311
|
+
if (longVal !== 0) {
|
|
312
|
+
if (longVal < 0)
|
|
313
|
+
longVal = (0xFFFFFFFF + longVal + 1);
|
|
314
|
+
hexStr = longVal.toString(16);
|
|
315
|
+
if (longVal > 0)
|
|
316
|
+
hexStr = NUM_TYPE.INT_ZERO_HEX.substr(hexStr.length) + hexStr;
|
|
317
|
+
this._data[1] = NUM_TYPE.toSByte(parseInt(hexStr.substr(6, (8) - (6)), 16));
|
|
318
|
+
this._data[2] = NUM_TYPE.toSByte(parseInt(hexStr.substr(4, (6) - (4)), 16));
|
|
319
|
+
this._data[3] = NUM_TYPE.toSByte(parseInt(hexStr.substr(2, (4) - (2)), 16));
|
|
320
|
+
this._data[4] = NUM_TYPE.toSByte(parseInt(hexStr.substr(0, (2) - (0)), 16));
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
a_2_long(str) {
|
|
324
|
+
let n = 0;
|
|
325
|
+
for (let pos = 0; pos < str.length; pos++) {
|
|
326
|
+
if (UtilStrByteMode.isDigit(str.charAt(pos))) {
|
|
327
|
+
n = n * 10;
|
|
328
|
+
n = n + str.charCodeAt(pos) - '0'.charCodeAt(0);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
return n;
|
|
332
|
+
}
|
|
333
|
+
to_a(pic) {
|
|
334
|
+
return this.to_a_pic(pic);
|
|
335
|
+
}
|
|
336
|
+
to_a_pic(pic) {
|
|
337
|
+
let buf = new Array(128);
|
|
338
|
+
let remains;
|
|
339
|
+
let sign_n;
|
|
340
|
+
let pref_len;
|
|
341
|
+
let suff_len;
|
|
342
|
+
let pref_str;
|
|
343
|
+
let suff_str;
|
|
344
|
+
let str_pos;
|
|
345
|
+
let str_len;
|
|
346
|
+
let out_pos;
|
|
347
|
+
let out_buf;
|
|
348
|
+
let tmp_out_buf;
|
|
349
|
+
let pad;
|
|
350
|
+
let left;
|
|
351
|
+
let pfill;
|
|
352
|
+
let mask_chars;
|
|
353
|
+
let len;
|
|
354
|
+
let res;
|
|
355
|
+
let i;
|
|
356
|
+
let isOut;
|
|
357
|
+
let outVal;
|
|
358
|
+
len = pic.getMaskSize();
|
|
359
|
+
sign_n = (pic.isNegative() && this.num_is_neg() ? false : true);
|
|
360
|
+
pref_len = (sign_n ? pic.getPosPref_().length : pic.getNegPref_().length);
|
|
361
|
+
suff_len = (sign_n ? pic.getPosSuff_().length : pic.getNegSuff_().length);
|
|
362
|
+
left = pic.isLeft();
|
|
363
|
+
pfill = pic.padFill();
|
|
364
|
+
mask_chars = pic.getMaskChars();
|
|
365
|
+
outVal = NString.ToCharArray(pic.getMask().substr(0, len));
|
|
366
|
+
out_buf = ((left || (mask_chars > 0)) ? buf : outVal);
|
|
367
|
+
if (left) {
|
|
368
|
+
for (i = 0; i < out_buf.length; i++)
|
|
369
|
+
out_buf[i] = '0'.toLowerCase();
|
|
370
|
+
}
|
|
371
|
+
isOut = ((left || (mask_chars > 0)) ? false : true);
|
|
372
|
+
str_pos = pref_len;
|
|
373
|
+
str_len = len - pref_len - suff_len;
|
|
374
|
+
tmp_out_buf = out_buf.slice(str_pos, out_buf.length);
|
|
375
|
+
if (this.NUM_IS_LONG())
|
|
376
|
+
remains = this.num_l_2_str(this.NUM_LONG(), tmp_out_buf, str_len, pic);
|
|
377
|
+
else
|
|
378
|
+
remains = this.to_str(tmp_out_buf, str_len, pic);
|
|
379
|
+
for (i = str_pos; i < out_buf.length; i++)
|
|
380
|
+
out_buf[i] = tmp_out_buf[i - str_pos];
|
|
381
|
+
tmp_out_buf = null;
|
|
382
|
+
if (remains < mask_chars) {
|
|
383
|
+
res = new Array(len);
|
|
384
|
+
for (i = 0; i < len; i++)
|
|
385
|
+
res[i] = (remains === NUM_TYPE.ZERO_FILL ? pic.getZeroPad() : '*');
|
|
386
|
+
return NString.FromChars(res);
|
|
387
|
+
}
|
|
388
|
+
if (mask_chars > 0) {
|
|
389
|
+
remains -= mask_chars;
|
|
390
|
+
str_pos += mask_chars;
|
|
391
|
+
str_len -= mask_chars;
|
|
392
|
+
}
|
|
393
|
+
if (pfill) {
|
|
394
|
+
pad = pic.getPad();
|
|
395
|
+
if (left) {
|
|
396
|
+
for (i = 0; i < remains; i++)
|
|
397
|
+
out_buf[str_pos + str_len + i] = pad;
|
|
398
|
+
str_pos += remains;
|
|
399
|
+
}
|
|
400
|
+
else {
|
|
401
|
+
for (i = 0; i < remains; i++)
|
|
402
|
+
out_buf[str_pos + i] = pad;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
else {
|
|
406
|
+
pad = ' ';
|
|
407
|
+
str_pos += remains;
|
|
408
|
+
str_len -= remains;
|
|
409
|
+
}
|
|
410
|
+
if (suff_len > 0) {
|
|
411
|
+
suff_str = sign_n ? pic.getPosSuff_() : pic.getNegSuff_();
|
|
412
|
+
if (suff_len === 1)
|
|
413
|
+
out_buf[str_pos + str_len] = suff_str[0];
|
|
414
|
+
else {
|
|
415
|
+
for (i = 0; i < suff_len; i++)
|
|
416
|
+
out_buf[str_pos + str_len + i] = suff_str[i];
|
|
417
|
+
}
|
|
418
|
+
str_len += suff_len;
|
|
419
|
+
}
|
|
420
|
+
if (pref_len > 0) {
|
|
421
|
+
str_pos -= pref_len;
|
|
422
|
+
str_len += pref_len;
|
|
423
|
+
pref_str = sign_n ? pic.getPosPref_() : pic.getNegPref_();
|
|
424
|
+
if (pref_len === 1)
|
|
425
|
+
out_buf[str_pos] = pref_str[0];
|
|
426
|
+
else
|
|
427
|
+
for (i = 0; i < pref_len; i++)
|
|
428
|
+
out_buf[str_pos + i] = pref_str[i];
|
|
429
|
+
}
|
|
430
|
+
if (!pfill) {
|
|
431
|
+
let outBufLen = out_buf.length;
|
|
432
|
+
if (left) {
|
|
433
|
+
for (i = 0; i < remains && (str_pos + str_len + i < outBufLen); i++)
|
|
434
|
+
out_buf[str_pos + str_len + i] = pad;
|
|
435
|
+
}
|
|
436
|
+
else {
|
|
437
|
+
str_pos -= remains;
|
|
438
|
+
for (i = 0; i < remains && (str_pos + i < outBufLen); i++)
|
|
439
|
+
out_buf[str_pos + i] = pad;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
if (isOut)
|
|
443
|
+
return NString.FromChars(out_buf);
|
|
444
|
+
if (mask_chars === 0) {
|
|
445
|
+
if (str_pos + len > out_buf.length)
|
|
446
|
+
len = out_buf.length - str_pos;
|
|
447
|
+
return NString.FromChars(out_buf, str_pos, len);
|
|
448
|
+
}
|
|
449
|
+
for (out_pos = 0; out_pos < len && str_pos < out_buf.length; out_pos++)
|
|
450
|
+
if (outVal[out_pos] === String.fromCharCode(PICInterface.PIC_N))
|
|
451
|
+
outVal[out_pos] = out_buf[str_pos++];
|
|
452
|
+
return NString.FromChars(outVal);
|
|
453
|
+
}
|
|
454
|
+
num_l_2_str(num, str, len, pic) {
|
|
455
|
+
let commas;
|
|
456
|
+
let digits;
|
|
457
|
+
let i;
|
|
458
|
+
let decs;
|
|
459
|
+
let j;
|
|
460
|
+
if (num < 0)
|
|
461
|
+
num = -num;
|
|
462
|
+
commas = pic.withComa();
|
|
463
|
+
decs = Math.min(pic.getDec(), len - 1);
|
|
464
|
+
if (decs > 0)
|
|
465
|
+
len -= (decs + 1);
|
|
466
|
+
i = len;
|
|
467
|
+
if (num === 0 && !pic.decInFirstPos()) {
|
|
468
|
+
if (pic.zeroFill())
|
|
469
|
+
return (NUM_TYPE.ZERO_FILL);
|
|
470
|
+
if (len === 0)
|
|
471
|
+
return (NUM_TYPE.NO_ROOM);
|
|
472
|
+
if (i > str.length)
|
|
473
|
+
i = str.length;
|
|
474
|
+
str[--i] = '0';
|
|
475
|
+
}
|
|
476
|
+
if (decs > 0) {
|
|
477
|
+
str[len] = this.DECIMALCHAR;
|
|
478
|
+
for (j = 0; j < decs; j++)
|
|
479
|
+
str[len + 1 + j] = '0';
|
|
480
|
+
}
|
|
481
|
+
digits = 0;
|
|
482
|
+
for (; num > 0; num = Math.floor(num / 10)) {
|
|
483
|
+
i--;
|
|
484
|
+
if (commas) {
|
|
485
|
+
if (digits === 3) {
|
|
486
|
+
if (i < 0)
|
|
487
|
+
return (NUM_TYPE.NO_ROOM);
|
|
488
|
+
digits = 0;
|
|
489
|
+
str[i--] = this.COMMACHAR;
|
|
490
|
+
}
|
|
491
|
+
digits++;
|
|
492
|
+
}
|
|
493
|
+
if (i < 0)
|
|
494
|
+
return (NUM_TYPE.NO_ROOM);
|
|
495
|
+
str[i] = ((num % 10).toString());
|
|
496
|
+
}
|
|
497
|
+
return i;
|
|
498
|
+
}
|
|
499
|
+
to_str(str, len, pic) {
|
|
500
|
+
let tmp;
|
|
501
|
+
let commas;
|
|
502
|
+
let digits;
|
|
503
|
+
let decpos;
|
|
504
|
+
let last;
|
|
505
|
+
let first;
|
|
506
|
+
let j;
|
|
507
|
+
let i;
|
|
508
|
+
let decs;
|
|
509
|
+
let num_char;
|
|
510
|
+
commas = pic.withComa();
|
|
511
|
+
decs = pic.getDec();
|
|
512
|
+
if (decs >= len)
|
|
513
|
+
decs = len - 1;
|
|
514
|
+
tmp = new NUM_TYPE(this);
|
|
515
|
+
tmp.round(decs);
|
|
516
|
+
if (tmp.NUM_IS_LONG())
|
|
517
|
+
return tmp.num_l_2_str(tmp.NUM_LONG(), str, len, pic);
|
|
518
|
+
if (pic.zeroFill() && tmp._data[0] === 0)
|
|
519
|
+
return (NUM_TYPE.ZERO_FILL);
|
|
520
|
+
i = len - 1;
|
|
521
|
+
digits = 0;
|
|
522
|
+
decpos = ((tmp._data[0] & ~NUM_TYPE.SIGN_MASK) - NUM_TYPE.EXP_BIAS + 1) * 2;
|
|
523
|
+
last = decpos - 1 + decs;
|
|
524
|
+
first = decpos - 1;
|
|
525
|
+
if (first > 2)
|
|
526
|
+
first = (tmp._data[1] < 10) ? 3 : 2;
|
|
527
|
+
for (j = last; j >= first; j--) {
|
|
528
|
+
if (i < 0)
|
|
529
|
+
return (NUM_TYPE.NO_ROOM);
|
|
530
|
+
if (commas && (j < decpos)) {
|
|
531
|
+
if (digits === 3) {
|
|
532
|
+
digits = 0;
|
|
533
|
+
str[i--] = this.COMMACHAR;
|
|
534
|
+
}
|
|
535
|
+
digits++;
|
|
536
|
+
}
|
|
537
|
+
if (i < 0)
|
|
538
|
+
return (NUM_TYPE.NO_ROOM);
|
|
539
|
+
if ((j < 2) || (j >= this.SIGNIFICANT_NUM_SIZE * 2))
|
|
540
|
+
str[i--] = '0';
|
|
541
|
+
else {
|
|
542
|
+
if (i < 0)
|
|
543
|
+
return (NUM_TYPE.NO_ROOM);
|
|
544
|
+
num_char = tmp._data[j >> 1];
|
|
545
|
+
str[i--] = (((j & 1) !== 0) ? (num_char % 10) : (Math.floor(num_char / 10))).toString();
|
|
546
|
+
}
|
|
547
|
+
if (j === decpos) {
|
|
548
|
+
if (i < 0)
|
|
549
|
+
return (NUM_TYPE.NO_ROOM);
|
|
550
|
+
str[i--] = this.DECIMALCHAR;
|
|
551
|
+
if (i < 0 && pic.decInFirstPos())
|
|
552
|
+
return (0);
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
return (i + 1);
|
|
556
|
+
}
|
|
557
|
+
static add(num1, num2) {
|
|
558
|
+
let sign1;
|
|
559
|
+
let sign2;
|
|
560
|
+
let l;
|
|
561
|
+
let l1;
|
|
562
|
+
let l2;
|
|
563
|
+
let SIGNIFICANT_NUM_SIZE;
|
|
564
|
+
if (num1 === null || num2 === null)
|
|
565
|
+
return null;
|
|
566
|
+
SIGNIFICANT_NUM_SIZE = GuiEnvironment.Environment.GetSignificantNumSize();
|
|
567
|
+
let tmpres = new NUM_TYPE();
|
|
568
|
+
let res = new NUM_TYPE();
|
|
569
|
+
let operData = new OperData();
|
|
570
|
+
if (num1.NUM_IS_LONG()) {
|
|
571
|
+
if (num2.NUM_IS_LONG()) {
|
|
572
|
+
l = l1 = num1.NUM_LONG();
|
|
573
|
+
if (l < 0)
|
|
574
|
+
l = -l;
|
|
575
|
+
if (l < 0x40000000) {
|
|
576
|
+
l = l2 = num2.NUM_LONG();
|
|
577
|
+
if (l < 0)
|
|
578
|
+
l = -l;
|
|
579
|
+
if (l < 0x40000000) {
|
|
580
|
+
l1 += l2;
|
|
581
|
+
res.NUM_4_LONG(l1);
|
|
582
|
+
return res;
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
num2.num_4_std_long();
|
|
586
|
+
}
|
|
587
|
+
num1.num_4_std_long();
|
|
588
|
+
}
|
|
589
|
+
else if (num2.NUM_IS_LONG())
|
|
590
|
+
num2.num_4_std_long();
|
|
591
|
+
sign1 = NUM_TYPE.toSByte(num1._data[0] & NUM_TYPE.SIGN_MASK);
|
|
592
|
+
operData.NUM_Exp1_ = NUM_TYPE.toSByte(num1._data[0] & ~NUM_TYPE.SIGN_MASK);
|
|
593
|
+
sign2 = NUM_TYPE.toSByte(num2._data[0] & NUM_TYPE.SIGN_MASK);
|
|
594
|
+
operData.NUM_Exp2_ = NUM_TYPE.toSByte(num2._data[0] & ~NUM_TYPE.SIGN_MASK);
|
|
595
|
+
operData.NUM_Diff_ = (operData.NUM_Exp1_ - operData.NUM_Exp2_);
|
|
596
|
+
let cmpval = operData.NUM_Diff_;
|
|
597
|
+
if (cmpval === 0) {
|
|
598
|
+
cmpval = NUM_TYPE.toUByte(num1._data[1]) - NUM_TYPE.toUByte(num2._data[1]);
|
|
599
|
+
if (cmpval === 0)
|
|
600
|
+
cmpval = NUM_TYPE.memcmp(num1, 2, num2, 2, SIGNIFICANT_NUM_SIZE - 2);
|
|
601
|
+
}
|
|
602
|
+
if (cmpval >= 0) {
|
|
603
|
+
if (sign1 === sign2)
|
|
604
|
+
tmpres = NUM_TYPE.add_pos(num1, num2, operData);
|
|
605
|
+
else
|
|
606
|
+
tmpres = NUM_TYPE.sub_pos(num1, num2, operData);
|
|
607
|
+
if (tmpres._data[0] !== 0)
|
|
608
|
+
tmpres._data[0] = NUM_TYPE.toSByte(tmpres._data[0] | sign1);
|
|
609
|
+
}
|
|
610
|
+
else {
|
|
611
|
+
let exp = operData.NUM_Exp1_;
|
|
612
|
+
operData.NUM_Exp1_ = operData.NUM_Exp2_;
|
|
613
|
+
operData.NUM_Exp2_ = exp;
|
|
614
|
+
operData.NUM_Diff_ = -operData.NUM_Diff_;
|
|
615
|
+
if (sign1 === sign2)
|
|
616
|
+
tmpres = NUM_TYPE.add_pos(num2, num1, operData);
|
|
617
|
+
else
|
|
618
|
+
tmpres = NUM_TYPE.sub_pos(num2, num1, operData);
|
|
619
|
+
if (tmpres._data[0] !== 0)
|
|
620
|
+
tmpres._data[0] |= sign2;
|
|
621
|
+
}
|
|
622
|
+
return tmpres;
|
|
623
|
+
}
|
|
624
|
+
static sub(num1, num2) {
|
|
625
|
+
if (num1 === null || num2 === null)
|
|
626
|
+
return null;
|
|
627
|
+
let tmpres = new NUM_TYPE();
|
|
628
|
+
let res = new NUM_TYPE();
|
|
629
|
+
let operData = new OperData();
|
|
630
|
+
if (num1.NUM_IS_LONG()) {
|
|
631
|
+
if (num2.NUM_IS_LONG()) {
|
|
632
|
+
let l;
|
|
633
|
+
let l1 = l = num1.NUM_LONG();
|
|
634
|
+
if (l < 0)
|
|
635
|
+
l = -l;
|
|
636
|
+
if (l < 0x40000000) {
|
|
637
|
+
let l2 = l = num2.NUM_LONG();
|
|
638
|
+
if (l < 0)
|
|
639
|
+
l = -l;
|
|
640
|
+
if (l < 0x40000000) {
|
|
641
|
+
l1 -= l2;
|
|
642
|
+
res.NUM_4_LONG(l1);
|
|
643
|
+
return res;
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
num2.num_4_std_long();
|
|
647
|
+
}
|
|
648
|
+
num1.num_4_std_long();
|
|
649
|
+
}
|
|
650
|
+
else if (num2.NUM_IS_LONG())
|
|
651
|
+
num2.num_4_std_long();
|
|
652
|
+
let sign1 = NUM_TYPE.toSByte(num1._data[0] & NUM_TYPE.SIGN_MASK);
|
|
653
|
+
operData.NUM_Exp1_ = NUM_TYPE.toSByte(num1._data[0] & ~NUM_TYPE.SIGN_MASK);
|
|
654
|
+
let sign2 = NUM_TYPE.toSByte(num2._data[0] & NUM_TYPE.SIGN_MASK);
|
|
655
|
+
operData.NUM_Exp2_ = NUM_TYPE.toSByte(num2._data[0] & ~NUM_TYPE.SIGN_MASK);
|
|
656
|
+
operData.NUM_Diff_ = (operData.NUM_Exp1_ - operData.NUM_Exp2_);
|
|
657
|
+
let cmpval = operData.NUM_Diff_;
|
|
658
|
+
if (cmpval === 0) {
|
|
659
|
+
cmpval = NUM_TYPE.toUByte(num1._data[1]) - NUM_TYPE.toUByte(num2._data[1]);
|
|
660
|
+
if (cmpval === 0)
|
|
661
|
+
cmpval = NUM_TYPE.memcmp(num1, 2, num2, 2, GuiEnvironment.Environment.GetSignificantNumSize() - 2);
|
|
662
|
+
}
|
|
663
|
+
if (cmpval >= 0) {
|
|
664
|
+
if (sign1 === sign2)
|
|
665
|
+
tmpres = NUM_TYPE.sub_pos(num1, num2, operData);
|
|
666
|
+
else
|
|
667
|
+
tmpres = NUM_TYPE.add_pos(num1, num2, operData);
|
|
668
|
+
}
|
|
669
|
+
else {
|
|
670
|
+
let exp = operData.NUM_Exp1_;
|
|
671
|
+
operData.NUM_Exp1_ = operData.NUM_Exp2_;
|
|
672
|
+
operData.NUM_Exp2_ = exp;
|
|
673
|
+
operData.NUM_Diff_ = -operData.NUM_Diff_;
|
|
674
|
+
if (sign1 === sign2) {
|
|
675
|
+
tmpres = NUM_TYPE.sub_pos(num2, num1, operData);
|
|
676
|
+
sign1 ^= (NUM_TYPE.SIGN_MASK);
|
|
677
|
+
}
|
|
678
|
+
else
|
|
679
|
+
tmpres = NUM_TYPE.add_pos(num2, num1, operData);
|
|
680
|
+
}
|
|
681
|
+
if (tmpres._data[0] !== 0)
|
|
682
|
+
tmpres._data[0] |= sign1;
|
|
683
|
+
return tmpres;
|
|
684
|
+
}
|
|
685
|
+
static mul(num1, num2) {
|
|
686
|
+
let fullres = new Int8Array(38);
|
|
687
|
+
let pwr;
|
|
688
|
+
let len1;
|
|
689
|
+
let len2;
|
|
690
|
+
let pos1;
|
|
691
|
+
let pos2;
|
|
692
|
+
let pos;
|
|
693
|
+
let digit1;
|
|
694
|
+
let prod;
|
|
695
|
+
let carry;
|
|
696
|
+
let l;
|
|
697
|
+
let l1;
|
|
698
|
+
let l2;
|
|
699
|
+
let SIGNIFICANT_NUM_SIZE;
|
|
700
|
+
if (num1 === null || num2 === null)
|
|
701
|
+
return null;
|
|
702
|
+
SIGNIFICANT_NUM_SIZE = GuiEnvironment.Environment.GetSignificantNumSize();
|
|
703
|
+
let res = new NUM_TYPE();
|
|
704
|
+
let operData = new OperData();
|
|
705
|
+
let i;
|
|
706
|
+
let tmpByte;
|
|
707
|
+
if (num1.NUM_IS_LONG()) {
|
|
708
|
+
if (num2.NUM_IS_LONG()) {
|
|
709
|
+
l = l1 = num1.NUM_LONG();
|
|
710
|
+
if (l < 0)
|
|
711
|
+
l = -l;
|
|
712
|
+
if (l < 0xB000) {
|
|
713
|
+
l = l2 = num2.NUM_LONG();
|
|
714
|
+
if (l < 0)
|
|
715
|
+
l = -l;
|
|
716
|
+
if (l < 0xB000) {
|
|
717
|
+
l1 = l1 * l2;
|
|
718
|
+
res.NUM_4_LONG(l1);
|
|
719
|
+
return res;
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
num2.num_4_std_long();
|
|
723
|
+
}
|
|
724
|
+
num1.num_4_std_long();
|
|
725
|
+
}
|
|
726
|
+
else if (num2.NUM_IS_LONG())
|
|
727
|
+
num2.num_4_std_long();
|
|
728
|
+
operData.NUM_Exp1_ = NUM_TYPE.toSByte(num1._data[0] & ~NUM_TYPE.SIGN_MASK);
|
|
729
|
+
operData.NUM_Exp2_ = NUM_TYPE.toSByte(num2._data[0] & ~NUM_TYPE.SIGN_MASK);
|
|
730
|
+
if (operData.NUM_Exp1_ === 0 || operData.NUM_Exp2_ === 0) {
|
|
731
|
+
res.NUM_ZERO();
|
|
732
|
+
return res;
|
|
733
|
+
}
|
|
734
|
+
for (len1 = SIGNIFICANT_NUM_SIZE - 1; num1._data[len1] === 0; len1--) {
|
|
735
|
+
}
|
|
736
|
+
for (len2 = SIGNIFICANT_NUM_SIZE - 1; num2._data[len2] === 0; len2--) {
|
|
737
|
+
}
|
|
738
|
+
for (i = 0; i < (NUM_TYPE.NUM_SIZE - 1) * 2; i++)
|
|
739
|
+
fullres[i] = 0;
|
|
740
|
+
pos = 0;
|
|
741
|
+
for (pos1 = len1; pos1 > 0; pos1--) {
|
|
742
|
+
pos = pos1 + len2 - 1;
|
|
743
|
+
digit1 = num1._data[pos1];
|
|
744
|
+
carry = 0;
|
|
745
|
+
for (pos2 = len2; pos2 > 0; pos2--) {
|
|
746
|
+
prod = NUM_TYPE.toUByte(digit1) * NUM_TYPE.toUByte(num2._data[pos2]) + carry;
|
|
747
|
+
carry = Math.floor(prod / 100);
|
|
748
|
+
fullres[pos] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(fullres[pos]) + prod % 100);
|
|
749
|
+
tmpByte = fullres[pos];
|
|
750
|
+
pos--;
|
|
751
|
+
if (NUM_TYPE.toUByte(tmpByte) >= 100) {
|
|
752
|
+
fullres[pos + 1] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(fullres[pos + 1]) - 100);
|
|
753
|
+
carry++;
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
fullres[pos] = NUM_TYPE.toSByte(carry);
|
|
757
|
+
}
|
|
758
|
+
pwr = NUM_TYPE.toUByte(operData.NUM_Exp1_) - NUM_TYPE.EXP_BIAS + (NUM_TYPE.toUByte(operData.NUM_Exp2_) - NUM_TYPE.EXP_BIAS);
|
|
759
|
+
if (fullres[0] === 0) {
|
|
760
|
+
pos++;
|
|
761
|
+
pwr--;
|
|
762
|
+
}
|
|
763
|
+
if ((num1._data[0] & NUM_TYPE.SIGN_MASK) === (num2._data[0] & NUM_TYPE.SIGN_MASK))
|
|
764
|
+
res._data[0] = 0;
|
|
765
|
+
else
|
|
766
|
+
res._data[0] = NUM_TYPE.SIGN_MASK;
|
|
767
|
+
res._data[0] |= NUM_TYPE.toSByte(pwr + NUM_TYPE.EXP_BIAS);
|
|
768
|
+
for (i = 0; i < SIGNIFICANT_NUM_SIZE - 1; i++)
|
|
769
|
+
res._data[1 + i] = fullres[pos + i];
|
|
770
|
+
return res;
|
|
771
|
+
}
|
|
772
|
+
static mod(num1, num2) {
|
|
773
|
+
if (num1 === null || num2 === null)
|
|
774
|
+
return null;
|
|
775
|
+
let res = new NUM_TYPE();
|
|
776
|
+
if (num2.num_is_zero()) {
|
|
777
|
+
res.NUM_ZERO();
|
|
778
|
+
return res;
|
|
779
|
+
}
|
|
780
|
+
if (num1.NUM_IS_LONG())
|
|
781
|
+
num1.num_4_std_long();
|
|
782
|
+
if (num2.NUM_IS_LONG())
|
|
783
|
+
num2.num_4_std_long();
|
|
784
|
+
res = NUM_TYPE.div(num1, num2);
|
|
785
|
+
res.num_trunc(0);
|
|
786
|
+
res = NUM_TYPE.mul(res, num2);
|
|
787
|
+
res = NUM_TYPE.sub(num1, res);
|
|
788
|
+
return res;
|
|
789
|
+
}
|
|
790
|
+
static div(num1, num2) {
|
|
791
|
+
let dividend = new Int8Array((NUM_TYPE.NUM_SIZE - 1) * 2);
|
|
792
|
+
let divisor = new Int8Array(NUM_TYPE.NUM_SIZE);
|
|
793
|
+
let pwr;
|
|
794
|
+
let len1;
|
|
795
|
+
let len2;
|
|
796
|
+
let pos1;
|
|
797
|
+
let pos2;
|
|
798
|
+
let pos;
|
|
799
|
+
let quot;
|
|
800
|
+
let prod;
|
|
801
|
+
let carry;
|
|
802
|
+
let SIGNIFICANT_NUM_SIZE;
|
|
803
|
+
if (num1 === null || num2 === null)
|
|
804
|
+
return null;
|
|
805
|
+
SIGNIFICANT_NUM_SIZE = GuiEnvironment.Environment.GetSignificantNumSize();
|
|
806
|
+
let res = new NUM_TYPE();
|
|
807
|
+
let operData = new OperData();
|
|
808
|
+
let i;
|
|
809
|
+
let tmpByte;
|
|
810
|
+
if (num1.NUM_IS_LONG())
|
|
811
|
+
num1.num_4_std_long();
|
|
812
|
+
if (num2.NUM_IS_LONG())
|
|
813
|
+
num2.num_4_std_long();
|
|
814
|
+
operData.NUM_Exp1_ = NUM_TYPE.toSByte(num1._data[0] & ~NUM_TYPE.SIGN_MASK);
|
|
815
|
+
operData.NUM_Exp2_ = NUM_TYPE.toSByte(num2._data[0] & ~NUM_TYPE.SIGN_MASK);
|
|
816
|
+
if (operData.NUM_Exp1_ === 0 || operData.NUM_Exp2_ === 0) {
|
|
817
|
+
res.NUM_ZERO();
|
|
818
|
+
return res;
|
|
819
|
+
}
|
|
820
|
+
for (len1 = SIGNIFICANT_NUM_SIZE - 1; num1._data[len1] === 0; len1--) {
|
|
821
|
+
}
|
|
822
|
+
for (len2 = SIGNIFICANT_NUM_SIZE - 1; num2._data[len2] === 0; len2--) {
|
|
823
|
+
}
|
|
824
|
+
pos = (NUM_TYPE.memcmp(num1, 1, num2, 1, len2) < 0) ? 0 : 1;
|
|
825
|
+
for (i = 0; i < (NUM_TYPE.NUM_SIZE - 1) * 2; i++)
|
|
826
|
+
dividend[i] = 0;
|
|
827
|
+
for (i = 0; i < len1; i++)
|
|
828
|
+
dividend[pos + i] = num1._data[1 + i];
|
|
829
|
+
for (i = 0; i < len2; i++)
|
|
830
|
+
divisor[1 + i] = num2._data[1 + i];
|
|
831
|
+
res.NUM_SET_ZERO();
|
|
832
|
+
pwr = NUM_TYPE.toUByte(operData.NUM_Exp1_) - NUM_TYPE.toUByte(operData.NUM_Exp2_) + pos;
|
|
833
|
+
res._data[0] = NUM_TYPE.toSByte(pwr + NUM_TYPE.EXP_BIAS);
|
|
834
|
+
if ((num1._data[0] & NUM_TYPE.SIGN_MASK) !== (num2._data[0] & NUM_TYPE.SIGN_MASK))
|
|
835
|
+
res._data[0] |= NUM_TYPE.SIGN_MASK;
|
|
836
|
+
quot = Math.floor(100 / (NUM_TYPE.toUByte(divisor[1]) + 1));
|
|
837
|
+
if (quot > 1) {
|
|
838
|
+
carry = 0;
|
|
839
|
+
for (pos2 = len2; pos2 > 0; pos2--) {
|
|
840
|
+
prod = quot * NUM_TYPE.toUByte(divisor[pos2]) + carry;
|
|
841
|
+
carry = Math.floor(prod / 100);
|
|
842
|
+
divisor[pos2] = NUM_TYPE.toSByte(prod % 100);
|
|
843
|
+
}
|
|
844
|
+
carry = 0;
|
|
845
|
+
for (pos1 = len1 + pos - 1; pos1 >= 0; pos1--) {
|
|
846
|
+
prod = quot * NUM_TYPE.toUByte(dividend[pos1]) + carry;
|
|
847
|
+
carry = Math.floor(prod / 100);
|
|
848
|
+
dividend[pos1] = NUM_TYPE.toSByte(prod % 100);
|
|
849
|
+
}
|
|
850
|
+
}
|
|
851
|
+
for (pos1 = 1; pos1 < SIGNIFICANT_NUM_SIZE; pos1++) {
|
|
852
|
+
quot = NUM_TYPE.toUByte(dividend[pos1 - 1]) * 100 + Math.floor(NUM_TYPE.toUByte(dividend[pos1]) / NUM_TYPE.toUByte(divisor[1]));
|
|
853
|
+
if (quot >= 100)
|
|
854
|
+
quot = 99;
|
|
855
|
+
if (quot !== 0) {
|
|
856
|
+
pos = pos1 + len2 - 1;
|
|
857
|
+
carry = 0;
|
|
858
|
+
for (pos2 = len2; pos2 > 0; pos2--) {
|
|
859
|
+
prod = quot * NUM_TYPE.toUByte(divisor[pos2]) + carry;
|
|
860
|
+
carry = Math.floor(prod / 100);
|
|
861
|
+
dividend[pos] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(dividend[pos]) - prod % 100);
|
|
862
|
+
tmpByte = dividend[pos];
|
|
863
|
+
pos--;
|
|
864
|
+
if (tmpByte < 0) {
|
|
865
|
+
dividend[pos + 1] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(dividend[pos + 1]) + 100);
|
|
866
|
+
carry++;
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
dividend[pos] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(dividend[pos]) - carry);
|
|
870
|
+
while (dividend[pos] < 0) {
|
|
871
|
+
quot--;
|
|
872
|
+
pos = pos1 + len2 - 1;
|
|
873
|
+
for (pos2 = len2; pos2 > 0; pos2--) {
|
|
874
|
+
dividend[pos] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(dividend[pos]) + NUM_TYPE.toUByte(divisor[pos2]));
|
|
875
|
+
tmpByte = dividend[pos];
|
|
876
|
+
pos--;
|
|
877
|
+
if (NUM_TYPE.toUByte(tmpByte) >= 100) {
|
|
878
|
+
dividend[pos + 1] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(dividend[pos + 1]) - 100);
|
|
879
|
+
dividend[pos] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(dividend[pos]) + 1);
|
|
880
|
+
}
|
|
881
|
+
}
|
|
882
|
+
}
|
|
883
|
+
}
|
|
884
|
+
res._data[pos1] = NUM_TYPE.toSByte(quot);
|
|
885
|
+
}
|
|
886
|
+
return res;
|
|
887
|
+
}
|
|
888
|
+
static num_cmp(num1, num2) {
|
|
889
|
+
let sign1;
|
|
890
|
+
let sign2;
|
|
891
|
+
let cmpval;
|
|
892
|
+
let l1;
|
|
893
|
+
let l2;
|
|
894
|
+
let tmp;
|
|
895
|
+
let SIGNIFICANT_NUM_SIZE;
|
|
896
|
+
if (num1 == null || num2 == null)
|
|
897
|
+
return Int32.MinValue;
|
|
898
|
+
SIGNIFICANT_NUM_SIZE = GuiEnvironment.Environment.GetSignificantNumSize();
|
|
899
|
+
if (num1.NUM_IS_LONG()) {
|
|
900
|
+
if (num2.NUM_IS_LONG()) {
|
|
901
|
+
l1 = num1.NUM_LONG();
|
|
902
|
+
l2 = num2.NUM_LONG();
|
|
903
|
+
if (l1 >= 0 && l2 >= 0) {
|
|
904
|
+
tmp = l1 - l2;
|
|
905
|
+
if (tmp === 0)
|
|
906
|
+
return (0);
|
|
907
|
+
if (tmp > 0)
|
|
908
|
+
return (1);
|
|
909
|
+
return (-1);
|
|
910
|
+
}
|
|
911
|
+
num2.num_4_std_long();
|
|
912
|
+
}
|
|
913
|
+
num1.num_4_std_long();
|
|
914
|
+
}
|
|
915
|
+
else if (num2.NUM_IS_LONG())
|
|
916
|
+
num2.num_4_std_long();
|
|
917
|
+
sign1 = NUM_TYPE.toSByte(num1._data[0] & NUM_TYPE.SIGN_MASK);
|
|
918
|
+
sign2 = NUM_TYPE.toSByte(num2._data[0] & NUM_TYPE.SIGN_MASK);
|
|
919
|
+
cmpval = (sign1 === sign2)
|
|
920
|
+
? NUM_TYPE.memcmp(num1, 0, num2, 0, SIGNIFICANT_NUM_SIZE)
|
|
921
|
+
: 1;
|
|
922
|
+
if (sign1 !== 0)
|
|
923
|
+
cmpval = -cmpval;
|
|
924
|
+
return (cmpval);
|
|
925
|
+
}
|
|
926
|
+
static numHexStrIsLong(numHexStr) {
|
|
927
|
+
return numHexStr.substr(0, 2) === "FF";
|
|
928
|
+
}
|
|
929
|
+
NUM_ZERO() {
|
|
930
|
+
this.setZero(true);
|
|
931
|
+
}
|
|
932
|
+
NUM_SET_ZERO() {
|
|
933
|
+
this.setZero(false);
|
|
934
|
+
}
|
|
935
|
+
num_is_neg() {
|
|
936
|
+
if (this.NUM_IS_LONG())
|
|
937
|
+
return ((this._data[4] & 0x80) !== 0);
|
|
938
|
+
return ((this._data[0] & NUM_TYPE.SIGN_MASK) !== 0);
|
|
939
|
+
}
|
|
940
|
+
num_is_zero() {
|
|
941
|
+
if (this.NUM_IS_LONG())
|
|
942
|
+
return (this.NUM_LONG() === 0);
|
|
943
|
+
return (this._data[0] === 0);
|
|
944
|
+
}
|
|
945
|
+
num_neg() {
|
|
946
|
+
let l;
|
|
947
|
+
if (this.NUM_IS_LONG()) {
|
|
948
|
+
l = -this.NUM_LONG();
|
|
949
|
+
this.NUM_4_LONG(l);
|
|
950
|
+
return;
|
|
951
|
+
}
|
|
952
|
+
if (this._data[0] !== 0)
|
|
953
|
+
this._data[0] ^= NUM_TYPE.SIGN_MASK;
|
|
954
|
+
}
|
|
955
|
+
NUM_IS_LONG() {
|
|
956
|
+
return this._data[0] === NUM_TYPE.NUM_LONG_TYPE;
|
|
957
|
+
}
|
|
958
|
+
NUM_LONG() {
|
|
959
|
+
if (this._data[1] === 0 && this._data[2] === 0 && this._data[3] === 0 && this._data[4] === -128)
|
|
960
|
+
return Int32.MinValue;
|
|
961
|
+
let dataview = new DataView(this._data.buffer);
|
|
962
|
+
return dataview.getInt32(1, true);
|
|
963
|
+
}
|
|
964
|
+
round(decs) {
|
|
965
|
+
let addval;
|
|
966
|
+
if (this.NUM_IS_LONG())
|
|
967
|
+
return;
|
|
968
|
+
addval = new NUM_TYPE();
|
|
969
|
+
addval._data[0] = NUM_TYPE.toSByte((this._data[0] & NUM_TYPE.SIGN_MASK) | (NUM_TYPE.EXP_BIAS - (decs >> 1)));
|
|
970
|
+
addval._data[1] = NUM_TYPE.toSByte((decs & 1) !== 0 ? 5 : 50);
|
|
971
|
+
let temp = NUM_TYPE.add(this, addval);
|
|
972
|
+
this._data = new Int8Array(temp._data.length);
|
|
973
|
+
this._data = temp._data;
|
|
974
|
+
this.num_trunc(decs);
|
|
975
|
+
}
|
|
976
|
+
dbRound(whole) {
|
|
977
|
+
let addval;
|
|
978
|
+
let pwr;
|
|
979
|
+
let num_diff;
|
|
980
|
+
let i;
|
|
981
|
+
if (this.NUM_IS_LONG())
|
|
982
|
+
return;
|
|
983
|
+
addval = new NUM_TYPE();
|
|
984
|
+
addval._data[0] = NUM_TYPE.toSByte((this._data[0] & NUM_TYPE.SIGN_MASK) | (NUM_TYPE.EXP_BIAS + ((whole + 1) >> 1)));
|
|
985
|
+
addval._data[1] = NUM_TYPE.toSByte(((whole & 1) !== 0) ? 5 : 50);
|
|
986
|
+
let temp = NUM_TYPE.add(this, addval);
|
|
987
|
+
this._data = new Int8Array(temp._data.length);
|
|
988
|
+
for (let _ai = 0; _ai < this._data.length; ++_ai)
|
|
989
|
+
this._data[_ai] = temp._data[_ai];
|
|
990
|
+
pwr = (this._data[0] & ~NUM_TYPE.SIGN_MASK) - NUM_TYPE.EXP_BIAS;
|
|
991
|
+
if ((num_diff = pwr - ((whole + 1) >> 1)) >= 0) {
|
|
992
|
+
if ((whole & 1) !== 0) {
|
|
993
|
+
this._data[1 + num_diff] = NUM_TYPE.toSByte(this._data[1 + num_diff] - this._data[1 + num_diff] % 10);
|
|
994
|
+
num_diff++;
|
|
995
|
+
}
|
|
996
|
+
for (i = 0; i < this.SIGNIFICANT_NUM_SIZE - (1 + num_diff); i++)
|
|
997
|
+
this._data[1 + num_diff + i] = 0;
|
|
998
|
+
}
|
|
999
|
+
else
|
|
1000
|
+
this.NUM_SET_ZERO();
|
|
1001
|
+
}
|
|
1002
|
+
num_trunc(decs) {
|
|
1003
|
+
let pwr;
|
|
1004
|
+
let num_diff;
|
|
1005
|
+
let i;
|
|
1006
|
+
if (this.NUM_IS_LONG())
|
|
1007
|
+
return;
|
|
1008
|
+
pwr = (this._data[0] & ~NUM_TYPE.SIGN_MASK) - NUM_TYPE.EXP_BIAS;
|
|
1009
|
+
if ((num_diff = this.SIGNIFICANT_NUM_SIZE - 1 - pwr - ((decs + 1) >> 1)) < 0)
|
|
1010
|
+
return;
|
|
1011
|
+
if ((num_diff < this.SIGNIFICANT_NUM_SIZE - 1) && ((decs & 1) !== 0)) {
|
|
1012
|
+
this._data[this.SIGNIFICANT_NUM_SIZE - 1 - num_diff] =
|
|
1013
|
+
NUM_TYPE.toSByte(this._data[this.SIGNIFICANT_NUM_SIZE - 1 - num_diff] - this._data[this.SIGNIFICANT_NUM_SIZE - 1 - num_diff] % 10);
|
|
1014
|
+
if (this._data[this.SIGNIFICANT_NUM_SIZE - 1 - num_diff] === 0)
|
|
1015
|
+
num_diff++;
|
|
1016
|
+
}
|
|
1017
|
+
if (num_diff >= this.SIGNIFICANT_NUM_SIZE - 1) {
|
|
1018
|
+
this.NUM_ZERO();
|
|
1019
|
+
return;
|
|
1020
|
+
}
|
|
1021
|
+
for (i = 0; i < num_diff; i++)
|
|
1022
|
+
this._data[this.SIGNIFICANT_NUM_SIZE - num_diff + i] = 0;
|
|
1023
|
+
}
|
|
1024
|
+
num_4_std_long() {
|
|
1025
|
+
let slong;
|
|
1026
|
+
slong = this.NUM_LONG();
|
|
1027
|
+
if (slong >= 0)
|
|
1028
|
+
this.num_4_ulong(slong);
|
|
1029
|
+
else {
|
|
1030
|
+
this.num_4_ulong(-slong);
|
|
1031
|
+
this._data[0] |= NUM_TYPE.SIGN_MASK;
|
|
1032
|
+
}
|
|
1033
|
+
}
|
|
1034
|
+
num_4_ulong(data) {
|
|
1035
|
+
let pwr;
|
|
1036
|
+
let pos;
|
|
1037
|
+
let i;
|
|
1038
|
+
this.NUM_SET_ZERO();
|
|
1039
|
+
pos = pwr = 5;
|
|
1040
|
+
while (data > 0) {
|
|
1041
|
+
this._data[pos--] = NUM_TYPE.toSByte(data % 100);
|
|
1042
|
+
data = Math.floor(data / 100);
|
|
1043
|
+
}
|
|
1044
|
+
if (pos < pwr) {
|
|
1045
|
+
if (pos > 0) {
|
|
1046
|
+
for (i = 0; i < pwr - pos; i++)
|
|
1047
|
+
this._data[1 + i] = this._data[1 + pos + i];
|
|
1048
|
+
for (i = 0; i < pos; i++)
|
|
1049
|
+
this._data[pwr - pos + 1 + i] = 0;
|
|
1050
|
+
}
|
|
1051
|
+
this._data[0] = NUM_TYPE.toSByte(pwr - pos + NUM_TYPE.EXP_BIAS);
|
|
1052
|
+
}
|
|
1053
|
+
}
|
|
1054
|
+
NUM_2_LONG() {
|
|
1055
|
+
if (this.NUM_IS_LONG())
|
|
1056
|
+
return this.NUM_LONG();
|
|
1057
|
+
else
|
|
1058
|
+
return this.num_2_long();
|
|
1059
|
+
}
|
|
1060
|
+
NUM_2_ULONG() {
|
|
1061
|
+
if (this.NUM_IS_LONG())
|
|
1062
|
+
return this.NUM_LONG();
|
|
1063
|
+
else
|
|
1064
|
+
return this.num_2_ulong();
|
|
1065
|
+
}
|
|
1066
|
+
num_2_long() {
|
|
1067
|
+
let slong;
|
|
1068
|
+
let sign;
|
|
1069
|
+
sign = this._data[0] & NUM_TYPE.SIGN_MASK;
|
|
1070
|
+
this._data[0] &= NUM_TYPE.toSByte(~NUM_TYPE.SIGN_MASK);
|
|
1071
|
+
if (sign !== 0) {
|
|
1072
|
+
if (NUM_TYPE.memcmp(this, 0, NUM_TYPE.MinLONG(), 0, this.SIGNIFICANT_NUM_SIZE) > 0)
|
|
1073
|
+
return 0;
|
|
1074
|
+
}
|
|
1075
|
+
else {
|
|
1076
|
+
if (NUM_TYPE.memcmp(this, 0, NUM_TYPE.MaxLONG(), 0, this.SIGNIFICANT_NUM_SIZE) > 0)
|
|
1077
|
+
return 0;
|
|
1078
|
+
}
|
|
1079
|
+
slong = this.num_2_ulong();
|
|
1080
|
+
if (sign !== 0) {
|
|
1081
|
+
slong = -slong;
|
|
1082
|
+
this._data[0] |= NUM_TYPE.toSByte(sign);
|
|
1083
|
+
}
|
|
1084
|
+
return (slong);
|
|
1085
|
+
}
|
|
1086
|
+
num_2_ulong() {
|
|
1087
|
+
let val;
|
|
1088
|
+
let pwr;
|
|
1089
|
+
let pos;
|
|
1090
|
+
let last;
|
|
1091
|
+
pwr = this._data[0] - NUM_TYPE.EXP_BIAS;
|
|
1092
|
+
if (pwr > 5)
|
|
1093
|
+
return (0);
|
|
1094
|
+
last = (pwr === 5);
|
|
1095
|
+
if (last)
|
|
1096
|
+
pwr = 4;
|
|
1097
|
+
val = 0;
|
|
1098
|
+
for (pos = 1; pos <= pwr; pos++)
|
|
1099
|
+
val = val * 100 + NUM_TYPE.toUByte(this._data[pos]);
|
|
1100
|
+
if (last)
|
|
1101
|
+
if (val <= Math.floor((0xFFFFFFFF - NUM_TYPE.toUByte(this._data[5])) / 100))
|
|
1102
|
+
val = val * 100 + NUM_TYPE.toUByte(this._data[5]);
|
|
1103
|
+
else
|
|
1104
|
+
val = 0;
|
|
1105
|
+
return (val);
|
|
1106
|
+
}
|
|
1107
|
+
static add_pos(num1, num2, operData) {
|
|
1108
|
+
let len1;
|
|
1109
|
+
let len2;
|
|
1110
|
+
let len;
|
|
1111
|
+
let pos;
|
|
1112
|
+
let num1ptr;
|
|
1113
|
+
let resptr;
|
|
1114
|
+
let i;
|
|
1115
|
+
let SIGNIFICANT_NUM_SIZE;
|
|
1116
|
+
if (num1 == null || num2 == null)
|
|
1117
|
+
return null;
|
|
1118
|
+
SIGNIFICANT_NUM_SIZE = GuiEnvironment.Environment.GetSignificantNumSize();
|
|
1119
|
+
let res = new NUM_TYPE();
|
|
1120
|
+
if (operData.NUM_Exp2_ === 0 || (operData.NUM_Diff_ >= SIGNIFICANT_NUM_SIZE - 1)) {
|
|
1121
|
+
res = new NUM_TYPE(num1);
|
|
1122
|
+
res._data[0] = operData.NUM_Exp1_;
|
|
1123
|
+
return res;
|
|
1124
|
+
}
|
|
1125
|
+
len1 = 1;
|
|
1126
|
+
for (i = SIGNIFICANT_NUM_SIZE - 2; i > 0; i -= 2) {
|
|
1127
|
+
if (num1.SHRT_IS_ZERO(i))
|
|
1128
|
+
continue;
|
|
1129
|
+
else {
|
|
1130
|
+
len1 = i + 1;
|
|
1131
|
+
break;
|
|
1132
|
+
}
|
|
1133
|
+
}
|
|
1134
|
+
if (num1._data[len1] === 0)
|
|
1135
|
+
len1--;
|
|
1136
|
+
len2 = 1;
|
|
1137
|
+
for (i = SIGNIFICANT_NUM_SIZE - 2; i > 0; i -= 2) {
|
|
1138
|
+
if (num2.SHRT_IS_ZERO(i))
|
|
1139
|
+
continue;
|
|
1140
|
+
else {
|
|
1141
|
+
len2 = i + 1;
|
|
1142
|
+
break;
|
|
1143
|
+
}
|
|
1144
|
+
}
|
|
1145
|
+
if (num2._data[len2] === 0)
|
|
1146
|
+
len2--;
|
|
1147
|
+
if ((len = Math.max(len1, len2 + operData.NUM_Diff_)) > SIGNIFICANT_NUM_SIZE - 1)
|
|
1148
|
+
len = SIGNIFICANT_NUM_SIZE - 1;
|
|
1149
|
+
res.NUM_SET_ZERO();
|
|
1150
|
+
num1ptr = operData.NUM_Diff_;
|
|
1151
|
+
resptr = operData.NUM_Diff_;
|
|
1152
|
+
for (pos = len - operData.NUM_Diff_; pos > 0; pos--) {
|
|
1153
|
+
res._data[resptr + pos] =
|
|
1154
|
+
NUM_TYPE.toSByte(NUM_TYPE.toUByte(res._data[resptr + pos]) + NUM_TYPE.toUByte(num1._data[num1ptr + pos]) + NUM_TYPE.toUByte(num2._data[pos]));
|
|
1155
|
+
if (NUM_TYPE.toUByte(res._data[resptr + pos]) >= 100) {
|
|
1156
|
+
res._data[resptr + pos] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(res._data[resptr + pos]) - 100);
|
|
1157
|
+
res._data[resptr + pos - 1] = 1;
|
|
1158
|
+
}
|
|
1159
|
+
}
|
|
1160
|
+
for (pos = operData.NUM_Diff_; pos > 0; pos--) {
|
|
1161
|
+
res._data[pos] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(res._data[pos]) + NUM_TYPE.toUByte(num1._data[pos]));
|
|
1162
|
+
if (NUM_TYPE.toUByte(res._data[pos]) >= 100) {
|
|
1163
|
+
res._data[pos] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(res._data[pos]) - 100);
|
|
1164
|
+
res._data[pos - 1] = 1;
|
|
1165
|
+
}
|
|
1166
|
+
}
|
|
1167
|
+
if (res._data[0] !== 0) {
|
|
1168
|
+
for (pos = Math.min(len, SIGNIFICANT_NUM_SIZE - 2); pos >= 0; pos--)
|
|
1169
|
+
res._data[pos + 1] = res._data[pos];
|
|
1170
|
+
operData.NUM_Exp1_++;
|
|
1171
|
+
}
|
|
1172
|
+
res._data[0] = operData.NUM_Exp1_;
|
|
1173
|
+
return res;
|
|
1174
|
+
}
|
|
1175
|
+
static sub_pos(num1, num2, operData) {
|
|
1176
|
+
let len1;
|
|
1177
|
+
let len2;
|
|
1178
|
+
let len;
|
|
1179
|
+
let pos;
|
|
1180
|
+
let num1ptr;
|
|
1181
|
+
let resptr;
|
|
1182
|
+
let i;
|
|
1183
|
+
let SIGNIFICANT_NUM_SIZE;
|
|
1184
|
+
if (num1 == null || num2 == null)
|
|
1185
|
+
return null;
|
|
1186
|
+
SIGNIFICANT_NUM_SIZE = GuiEnvironment.Environment.GetSignificantNumSize();
|
|
1187
|
+
let res = new NUM_TYPE();
|
|
1188
|
+
let j;
|
|
1189
|
+
if (operData.NUM_Exp2_ === 0 || (operData.NUM_Diff_ >= SIGNIFICANT_NUM_SIZE - 1)) {
|
|
1190
|
+
res = new NUM_TYPE(num1);
|
|
1191
|
+
res._data[0] = operData.NUM_Exp1_;
|
|
1192
|
+
return res;
|
|
1193
|
+
}
|
|
1194
|
+
len1 = 1;
|
|
1195
|
+
for (i = SIGNIFICANT_NUM_SIZE - 2; i > 0; i -= 2) {
|
|
1196
|
+
if (num1.SHRT_IS_ZERO(i))
|
|
1197
|
+
continue;
|
|
1198
|
+
else {
|
|
1199
|
+
len1 = i + 1;
|
|
1200
|
+
break;
|
|
1201
|
+
}
|
|
1202
|
+
}
|
|
1203
|
+
if (num1._data[len1] === 0)
|
|
1204
|
+
len1--;
|
|
1205
|
+
len2 = 1;
|
|
1206
|
+
for (i = SIGNIFICANT_NUM_SIZE - 2; i > 0; i -= 2) {
|
|
1207
|
+
if (num2.SHRT_IS_ZERO(i))
|
|
1208
|
+
continue;
|
|
1209
|
+
else {
|
|
1210
|
+
len2 = i + 1;
|
|
1211
|
+
break;
|
|
1212
|
+
}
|
|
1213
|
+
}
|
|
1214
|
+
if (num2._data[len2] === 0)
|
|
1215
|
+
len2--;
|
|
1216
|
+
if ((len = Math.max(len1, len2 + operData.NUM_Diff_)) > SIGNIFICANT_NUM_SIZE - 1)
|
|
1217
|
+
len = SIGNIFICANT_NUM_SIZE - 1;
|
|
1218
|
+
res.NUM_SET_ZERO();
|
|
1219
|
+
num1ptr = operData.NUM_Diff_;
|
|
1220
|
+
resptr = operData.NUM_Diff_;
|
|
1221
|
+
for (pos = len - operData.NUM_Diff_; pos > 0; pos--) {
|
|
1222
|
+
res._data[resptr + pos] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(res._data[resptr + pos]) + NUM_TYPE.toUByte(num1._data[num1ptr + pos]) - NUM_TYPE.toUByte(num2._data[pos]));
|
|
1223
|
+
if (res._data[resptr + pos] < 0) {
|
|
1224
|
+
res._data[resptr + pos] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(res._data[resptr + pos]) + 100);
|
|
1225
|
+
res._data[resptr + pos - 1] = NUM_TYPE.toSByte(0xFF);
|
|
1226
|
+
}
|
|
1227
|
+
}
|
|
1228
|
+
for (pos = operData.NUM_Diff_; pos > 0; pos--) {
|
|
1229
|
+
res._data[pos] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(res._data[pos]) + NUM_TYPE.toUByte(num1._data[pos]));
|
|
1230
|
+
if (res._data[pos] < 0) {
|
|
1231
|
+
res._data[pos] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(res._data[pos]) + 100);
|
|
1232
|
+
res._data[pos - 1] = NUM_TYPE.toSByte(0xFF);
|
|
1233
|
+
}
|
|
1234
|
+
}
|
|
1235
|
+
while ((++pos <= len) && res._data[pos] === 0) {
|
|
1236
|
+
}
|
|
1237
|
+
if (pos <= len) {
|
|
1238
|
+
operData.NUM_Diff_ = pos - 1;
|
|
1239
|
+
if (operData.NUM_Diff_ > 0) {
|
|
1240
|
+
for (j = 0; j < len - operData.NUM_Diff_; j++)
|
|
1241
|
+
res._data[1 + j] = res._data[pos + j];
|
|
1242
|
+
for (j = 0; j < operData.NUM_Diff_; j++)
|
|
1243
|
+
res._data[len - operData.NUM_Diff_ + 1 + j] = 0;
|
|
1244
|
+
}
|
|
1245
|
+
res._data[0] = NUM_TYPE.toSByte(NUM_TYPE.toUByte(operData.NUM_Exp1_) - operData.NUM_Diff_);
|
|
1246
|
+
}
|
|
1247
|
+
return res;
|
|
1248
|
+
}
|
|
1249
|
+
num_fix(wholes) {
|
|
1250
|
+
let pwr;
|
|
1251
|
+
let num_diff;
|
|
1252
|
+
if (this.NUM_IS_LONG())
|
|
1253
|
+
this.num_4_std_long();
|
|
1254
|
+
pwr = (this._data[0] & ~NUM_TYPE.SIGN_MASK) - NUM_TYPE.EXP_BIAS;
|
|
1255
|
+
if ((num_diff = pwr - ((wholes + 1) >> 1)) < 0)
|
|
1256
|
+
return;
|
|
1257
|
+
if (num_diff < this.SIGNIFICANT_NUM_SIZE - 1) {
|
|
1258
|
+
if ((wholes & 1) === 1)
|
|
1259
|
+
this._data[1 + num_diff] = NUM_TYPE.toSByte(this._data[1 + num_diff] % 10);
|
|
1260
|
+
while ((num_diff < this.SIGNIFICANT_NUM_SIZE - 1) && this._data[1 + num_diff] === 0)
|
|
1261
|
+
num_diff++;
|
|
1262
|
+
}
|
|
1263
|
+
if (num_diff >= this.SIGNIFICANT_NUM_SIZE - 1) {
|
|
1264
|
+
this.NUM_ZERO();
|
|
1265
|
+
return;
|
|
1266
|
+
}
|
|
1267
|
+
if (num_diff > 0) {
|
|
1268
|
+
let i;
|
|
1269
|
+
for (i = 0; i < this.SIGNIFICANT_NUM_SIZE - 1 - num_diff; i++)
|
|
1270
|
+
this._data[1 + i] = this._data[1 + num_diff + i];
|
|
1271
|
+
for (i = 0; i < num_diff; i++)
|
|
1272
|
+
this._data[this.SIGNIFICANT_NUM_SIZE - num_diff + i] = 0;
|
|
1273
|
+
this._data[0] = NUM_TYPE.toSByte(this._data[0] - NUM_TYPE.toSByte(num_diff));
|
|
1274
|
+
}
|
|
1275
|
+
}
|
|
1276
|
+
SHRT_IS_ZERO(pos) {
|
|
1277
|
+
return this._data[pos] === 0 && this._data[pos + 1] === 0;
|
|
1278
|
+
}
|
|
1279
|
+
setZero(asLong) {
|
|
1280
|
+
let i;
|
|
1281
|
+
for (i = 0; i < NUM_TYPE.NUM_SIZE; i++)
|
|
1282
|
+
this._data[i] = 0;
|
|
1283
|
+
if (asLong)
|
|
1284
|
+
this._data[0] = NUM_TYPE.NUM_LONG_TYPE;
|
|
1285
|
+
}
|
|
1286
|
+
static memcmp(num1, pos1, num2, pos2, len) {
|
|
1287
|
+
let i = 0;
|
|
1288
|
+
while (i < len && num1._data[pos1] === num2._data[pos2] && pos1 < NUM_TYPE.NUM_SIZE && pos2 < NUM_TYPE.NUM_SIZE) {
|
|
1289
|
+
i++;
|
|
1290
|
+
pos1++;
|
|
1291
|
+
pos2++;
|
|
1292
|
+
}
|
|
1293
|
+
if (i === len)
|
|
1294
|
+
return 0;
|
|
1295
|
+
else if (this.toUByte(num1._data[pos1]) < this.toUByte(num2._data[pos2]))
|
|
1296
|
+
return -1;
|
|
1297
|
+
else
|
|
1298
|
+
return 1;
|
|
1299
|
+
}
|
|
1300
|
+
static toUByte(byteVal) {
|
|
1301
|
+
let val = byteVal;
|
|
1302
|
+
if (byteVal < 0)
|
|
1303
|
+
val = 256 + byteVal;
|
|
1304
|
+
return val;
|
|
1305
|
+
}
|
|
1306
|
+
static toSByte(unsignedVal) {
|
|
1307
|
+
let val = 0;
|
|
1308
|
+
if (unsignedVal > Constants.SByteMaxValue)
|
|
1309
|
+
val = (unsignedVal - 256);
|
|
1310
|
+
else
|
|
1311
|
+
val = unsignedVal;
|
|
1312
|
+
return val;
|
|
1313
|
+
}
|
|
1314
|
+
static MaxLONG() {
|
|
1315
|
+
let nUM_TYPE = new NUM_TYPE();
|
|
1316
|
+
nUM_TYPE._data[0] = NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 5);
|
|
1317
|
+
nUM_TYPE._data[1] = 21;
|
|
1318
|
+
nUM_TYPE._data[2] = 47;
|
|
1319
|
+
nUM_TYPE._data[3] = 48;
|
|
1320
|
+
nUM_TYPE._data[4] = 36;
|
|
1321
|
+
nUM_TYPE._data[5] = 47;
|
|
1322
|
+
return nUM_TYPE;
|
|
1323
|
+
}
|
|
1324
|
+
static MinLONG() {
|
|
1325
|
+
let num = new NUM_TYPE();
|
|
1326
|
+
num._data[0] = NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 5);
|
|
1327
|
+
num._data[1] = 21;
|
|
1328
|
+
num._data[2] = 47;
|
|
1329
|
+
num._data[3] = 48;
|
|
1330
|
+
num._data[4] = 36;
|
|
1331
|
+
num._data[5] = 48;
|
|
1332
|
+
return num;
|
|
1333
|
+
}
|
|
1334
|
+
to_double() {
|
|
1335
|
+
return this.storage_mg_2_float(8);
|
|
1336
|
+
}
|
|
1337
|
+
storage_mg_2_float(len) {
|
|
1338
|
+
let sign_pos;
|
|
1339
|
+
let sign;
|
|
1340
|
+
let compnum = new NUM_TYPE();
|
|
1341
|
+
let tmpnum = new NUM_TYPE();
|
|
1342
|
+
let divnum = new NUM_TYPE();
|
|
1343
|
+
let pwr;
|
|
1344
|
+
let bits;
|
|
1345
|
+
let exp;
|
|
1346
|
+
let long1 = 0;
|
|
1347
|
+
let long2 = 0;
|
|
1348
|
+
let fltOut = 0;
|
|
1349
|
+
let cout = new Int8Array([0, 0, 0, 0, 0, 0, 0, 0]);
|
|
1350
|
+
let Num2Pwr23_ = new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 4), 8, 38, 86, 8]);
|
|
1351
|
+
let Num2Pwr52_ = new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 8), 45, 3, 59, 96, 27, 37, 4, 96]);
|
|
1352
|
+
let base_Num16Pwrs = [
|
|
1353
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 1), 1]),
|
|
1354
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 1), 16]),
|
|
1355
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 2), 2, 56]),
|
|
1356
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 2), 40, 96]),
|
|
1357
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 3), 6, 55, 36]),
|
|
1358
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 4), 1, 4, 85, 76]),
|
|
1359
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 4), 16, 77, 72, 16]),
|
|
1360
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 5), 2, 68, 43, 54, 56]),
|
|
1361
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 5), 42, 94, 96, 72, 96]),
|
|
1362
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 6), 6, 87, 19, 47, 67, 36]),
|
|
1363
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 7), 1, 9, 95, 11, 62, 77, 76]),
|
|
1364
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 7), 17, 59, 21, 86, 4, 44, 16]),
|
|
1365
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 8), 2, 81, 47, 49, 76, 71, 6, 56]),
|
|
1366
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 8), 45, 3, 59, 96, 27, 37, 4, 96]),
|
|
1367
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 9), 7, 20, 57, 59, 40, 37, 92, 79, 36])
|
|
1368
|
+
];
|
|
1369
|
+
let base_Num2Pwrs = [
|
|
1370
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 1), 1]),
|
|
1371
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 1), 2]),
|
|
1372
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 1), 4]),
|
|
1373
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 1), 8])
|
|
1374
|
+
];
|
|
1375
|
+
if (this.NUM_IS_LONG())
|
|
1376
|
+
this.num_4_std_long();
|
|
1377
|
+
if (this._data[0] === 0)
|
|
1378
|
+
return 0;
|
|
1379
|
+
sign = NUM_TYPE.toSByte(this._data[0] & NUM_TYPE.SIGN_MASK);
|
|
1380
|
+
this._data[0] = NUM_TYPE.toSByte(this._data[0] & (~NUM_TYPE.SIGN_MASK));
|
|
1381
|
+
if (len === 4) {
|
|
1382
|
+
bits = 24;
|
|
1383
|
+
compnum = new NUM_TYPE(Num2Pwr23_);
|
|
1384
|
+
}
|
|
1385
|
+
else {
|
|
1386
|
+
bits = 53;
|
|
1387
|
+
compnum = new NUM_TYPE(Num2Pwr52_);
|
|
1388
|
+
}
|
|
1389
|
+
pwr = (this._data[0] - NUM_TYPE.EXP_BIAS) << 1;
|
|
1390
|
+
if (pwr < 0)
|
|
1391
|
+
exp = pwr * 3 + Math.floor((pwr + 1) / 3);
|
|
1392
|
+
else
|
|
1393
|
+
exp = pwr * 3 + Math.floor((pwr + 2) / 3);
|
|
1394
|
+
pwr = bits - exp;
|
|
1395
|
+
if (pwr < 0) {
|
|
1396
|
+
pwr = -pwr;
|
|
1397
|
+
tmpnum = NUM_TYPE.div(this, new NUM_TYPE(base_Num16Pwrs[pwr >> 2]));
|
|
1398
|
+
tmpnum = NUM_TYPE.div(tmpnum, new NUM_TYPE(base_Num2Pwrs[pwr & 3]));
|
|
1399
|
+
}
|
|
1400
|
+
else {
|
|
1401
|
+
tmpnum = this;
|
|
1402
|
+
while (pwr >= 60) {
|
|
1403
|
+
tmpnum = NUM_TYPE.mul(tmpnum, new NUM_TYPE(base_Num16Pwrs[14]));
|
|
1404
|
+
pwr -= 56;
|
|
1405
|
+
}
|
|
1406
|
+
tmpnum = NUM_TYPE.mul(tmpnum, new NUM_TYPE(base_Num16Pwrs[pwr >> 2]));
|
|
1407
|
+
tmpnum = NUM_TYPE.mul(tmpnum, new NUM_TYPE(base_Num2Pwrs[pwr & 3]));
|
|
1408
|
+
}
|
|
1409
|
+
while (NUM_TYPE.num_cmp(tmpnum, compnum) < 0) {
|
|
1410
|
+
exp--;
|
|
1411
|
+
tmpnum = NUM_TYPE.add(tmpnum, tmpnum);
|
|
1412
|
+
}
|
|
1413
|
+
if (len === 4) {
|
|
1414
|
+
long1 = tmpnum.num_2_ulong();
|
|
1415
|
+
}
|
|
1416
|
+
else {
|
|
1417
|
+
divnum = NUM_TYPE.div(tmpnum, new NUM_TYPE(base_Num16Pwrs[8]));
|
|
1418
|
+
divnum.num_trunc(0);
|
|
1419
|
+
long1 = divnum.num_2_ulong();
|
|
1420
|
+
divnum = NUM_TYPE.mul(divnum, new NUM_TYPE(base_Num16Pwrs[8]));
|
|
1421
|
+
divnum = NUM_TYPE.sub(tmpnum, divnum);
|
|
1422
|
+
long2 = divnum.num_2_ulong();
|
|
1423
|
+
}
|
|
1424
|
+
sign_pos = len - 1;
|
|
1425
|
+
if (len === 4) {
|
|
1426
|
+
exp += 126;
|
|
1427
|
+
cout[3] = NUM_TYPE.toSByte(exp >> 1);
|
|
1428
|
+
cout[2] = NUM_TYPE.toSByte((this.LO_CHAR(this.HI_SHRT(long1)) & 0x7F) | ((exp & 0x01) << 7));
|
|
1429
|
+
cout[1] = NUM_TYPE.toSByte(this.HI_CHAR(this.LO_SHRT(long1)));
|
|
1430
|
+
cout[0] = NUM_TYPE.toSByte(this.LO_CHAR(this.LO_SHRT(long1)));
|
|
1431
|
+
}
|
|
1432
|
+
else {
|
|
1433
|
+
exp += 1022;
|
|
1434
|
+
cout[7] = NUM_TYPE.toSByte(exp >> 4);
|
|
1435
|
+
cout[6] = NUM_TYPE.toSByte((this.LO_CHAR(this.HI_SHRT(long1)) & 0x0F) | ((exp & 0x0F) << 4));
|
|
1436
|
+
cout[5] = NUM_TYPE.toSByte(this.HI_CHAR(this.LO_SHRT(long1)));
|
|
1437
|
+
cout[4] = NUM_TYPE.toSByte(this.LO_CHAR(this.LO_SHRT(long1)));
|
|
1438
|
+
cout[3] = NUM_TYPE.toSByte(this.HI_CHAR(this.HI_SHRT(long2)));
|
|
1439
|
+
cout[2] = NUM_TYPE.toSByte(this.LO_CHAR(this.HI_SHRT(long2)));
|
|
1440
|
+
cout[1] = NUM_TYPE.toSByte(this.HI_CHAR(this.LO_SHRT(long2)));
|
|
1441
|
+
cout[0] = NUM_TYPE.toSByte(this.LO_CHAR(this.LO_SHRT(long2)));
|
|
1442
|
+
}
|
|
1443
|
+
if (sign !== 0) {
|
|
1444
|
+
cout[sign_pos] |= NUM_TYPE.SIGN_MASK;
|
|
1445
|
+
this._data[0] |= NUM_TYPE.SIGN_MASK;
|
|
1446
|
+
}
|
|
1447
|
+
fltOut = this.sbyteArr_2_Double(cout);
|
|
1448
|
+
return fltOut;
|
|
1449
|
+
}
|
|
1450
|
+
LO_CHAR(n) {
|
|
1451
|
+
return n & 255;
|
|
1452
|
+
}
|
|
1453
|
+
HI_CHAR(n) {
|
|
1454
|
+
return (n & 65280) >> 8;
|
|
1455
|
+
}
|
|
1456
|
+
LO_SHRT(n) {
|
|
1457
|
+
return (n & 65535);
|
|
1458
|
+
}
|
|
1459
|
+
HI_SHRT(n) {
|
|
1460
|
+
return ((n & -65536) >> 16);
|
|
1461
|
+
}
|
|
1462
|
+
static MK_SHRT(c1, c2) {
|
|
1463
|
+
let strInt = (c1 << 8 | c2).toString();
|
|
1464
|
+
return NNumber.Parse(strInt);
|
|
1465
|
+
}
|
|
1466
|
+
static MK_LONG(s1, s2) {
|
|
1467
|
+
let l1 = s1;
|
|
1468
|
+
let l2 = s2;
|
|
1469
|
+
let strLng = (l1 << 16 | l2).toString();
|
|
1470
|
+
return NNumber.Parse(strLng);
|
|
1471
|
+
}
|
|
1472
|
+
sbyteArr_2_Double(array) {
|
|
1473
|
+
let dataview = new DataView(array.buffer);
|
|
1474
|
+
return dataview.getFloat64(0, true);
|
|
1475
|
+
}
|
|
1476
|
+
static double_2_sbyteArray(d) {
|
|
1477
|
+
let buffer = new ArrayBuffer(8);
|
|
1478
|
+
let dataview = new DataView(buffer);
|
|
1479
|
+
dataview.setFloat64(0, d, true);
|
|
1480
|
+
return (new Int8Array(dataview.buffer));
|
|
1481
|
+
}
|
|
1482
|
+
static eval_op_pwr(num1, num2) {
|
|
1483
|
+
let d0;
|
|
1484
|
+
let d1;
|
|
1485
|
+
if (num1 == null || num2 == null)
|
|
1486
|
+
return null;
|
|
1487
|
+
if (num2.NUM_IS_LONG() && !num2.num_is_neg()) {
|
|
1488
|
+
d1 = num2.to_double();
|
|
1489
|
+
let result = NUM_TYPE.from_double(1);
|
|
1490
|
+
for (let i = 0; i < d1; i++)
|
|
1491
|
+
result = this.mul(result, num1);
|
|
1492
|
+
return result;
|
|
1493
|
+
}
|
|
1494
|
+
else {
|
|
1495
|
+
d0 = num1.to_double();
|
|
1496
|
+
d1 = num2.to_double();
|
|
1497
|
+
if (d0 < 0.0 && d1 !== d1)
|
|
1498
|
+
d0 = 0.0;
|
|
1499
|
+
else if (d0 !== 0.0)
|
|
1500
|
+
d0 = Math.pow(d0, d1);
|
|
1501
|
+
}
|
|
1502
|
+
return NUM_TYPE.from_double(d0);
|
|
1503
|
+
}
|
|
1504
|
+
static from_double(d0) {
|
|
1505
|
+
let array = NUM_TYPE.double_2_sbyteArray(d0);
|
|
1506
|
+
return NUM_TYPE.storage_mg_4_float(8, array);
|
|
1507
|
+
}
|
|
1508
|
+
static storage_mg_4_float(len, inp) {
|
|
1509
|
+
let cinp;
|
|
1510
|
+
let sign;
|
|
1511
|
+
let tmp1;
|
|
1512
|
+
let exp;
|
|
1513
|
+
let bias;
|
|
1514
|
+
let long1;
|
|
1515
|
+
let long2;
|
|
1516
|
+
cinp = new Array(inp.length);
|
|
1517
|
+
for (tmp1 = 0; tmp1 < inp.length; tmp1++)
|
|
1518
|
+
cinp[tmp1] = NUM_TYPE.toUByte(inp[tmp1]);
|
|
1519
|
+
sign = cinp[len - 1];
|
|
1520
|
+
if (len === 4) {
|
|
1521
|
+
exp = ((cinp[2] >> 7) | ((cinp[3] & 0x7F) << 1));
|
|
1522
|
+
bias = 150;
|
|
1523
|
+
long1 = 0;
|
|
1524
|
+
long2 = NUM_TYPE.MK_LONG(NUM_TYPE.MK_SHRT(0, cinp[2] | 0x80), NUM_TYPE.MK_SHRT(cinp[1], cinp[0]));
|
|
1525
|
+
}
|
|
1526
|
+
else {
|
|
1527
|
+
exp = (((cinp[7] & 0x7F) << 4) | (cinp[6] >> 4));
|
|
1528
|
+
bias = 1075;
|
|
1529
|
+
long1 = NUM_TYPE.MK_LONG(NUM_TYPE.MK_SHRT(0, (cinp[6] & 0x0F) | 0x10), NUM_TYPE.MK_SHRT(cinp[5], cinp[4]));
|
|
1530
|
+
long2 = NUM_TYPE.MK_LONG(NUM_TYPE.MK_SHRT(cinp[3], cinp[2]), NUM_TYPE.MK_SHRT(cinp[1], cinp[0]));
|
|
1531
|
+
}
|
|
1532
|
+
return NUM_TYPE.storage_num_4_fld_flt(long1, long2, 18, sign, bias, exp);
|
|
1533
|
+
}
|
|
1534
|
+
static storage_num_4_fld_flt(long1, long2, dec, sign, bias, expr) {
|
|
1535
|
+
let base_Num16Pwrs = [
|
|
1536
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 1), 1]),
|
|
1537
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 1), 16]),
|
|
1538
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 2), 2, 56]),
|
|
1539
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 2), 40, 96]),
|
|
1540
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 3), 6, 55, 36]),
|
|
1541
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 4), 1, 4, 85, 76]),
|
|
1542
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 4), 16, 77, 72, 16]),
|
|
1543
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 5), 2, 68, 43, 54, 56]),
|
|
1544
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 5), 42, 94, 96, 72, 96]),
|
|
1545
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 6), 6, 87, 19, 47, 67, 36]),
|
|
1546
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 7), 1, 9, 95, 11, 62, 77, 76]),
|
|
1547
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 7), 17, 59, 21, 86, 4, 44, 16]),
|
|
1548
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 8), 2, 81, 47, 49, 76, 71, 6, 56]),
|
|
1549
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 8), 45, 3, 59, 96, 27, 37, 4, 96]),
|
|
1550
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 9), 7, 20, 57, 59, 40, 37, 92, 79, 36])
|
|
1551
|
+
];
|
|
1552
|
+
let base_Num2Pwrs = [
|
|
1553
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 1), 1]),
|
|
1554
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 1), 2]),
|
|
1555
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 1), 4]),
|
|
1556
|
+
new Int8Array([NUM_TYPE.toSByte(NUM_TYPE.EXP_BIAS + 1), 8])
|
|
1557
|
+
];
|
|
1558
|
+
let tmpnum = new NUM_TYPE();
|
|
1559
|
+
let outVal = new NUM_TYPE();
|
|
1560
|
+
let exp = expr;
|
|
1561
|
+
if (exp === 0) {
|
|
1562
|
+
outVal.NUM_ZERO();
|
|
1563
|
+
return outVal;
|
|
1564
|
+
}
|
|
1565
|
+
outVal.num_4_ulong(long2);
|
|
1566
|
+
if (long1 !== 0) {
|
|
1567
|
+
tmpnum.num_4_ulong(long1);
|
|
1568
|
+
tmpnum = NUM_TYPE.mul(tmpnum, new NUM_TYPE(base_Num16Pwrs[8]));
|
|
1569
|
+
outVal = NUM_TYPE.add(tmpnum, outVal);
|
|
1570
|
+
}
|
|
1571
|
+
exp = (exp - bias);
|
|
1572
|
+
if (exp < 0) {
|
|
1573
|
+
exp = -exp;
|
|
1574
|
+
while (exp >= 60) {
|
|
1575
|
+
outVal = NUM_TYPE.div(outVal, new NUM_TYPE(base_Num16Pwrs[14]));
|
|
1576
|
+
exp -= 56;
|
|
1577
|
+
}
|
|
1578
|
+
tmpnum = NUM_TYPE.mul(new NUM_TYPE(base_Num16Pwrs[exp >> 2]), new NUM_TYPE(base_Num2Pwrs[exp & 3]));
|
|
1579
|
+
outVal = NUM_TYPE.div(outVal, tmpnum);
|
|
1580
|
+
}
|
|
1581
|
+
else {
|
|
1582
|
+
if (exp >= 60) {
|
|
1583
|
+
outVal.NUM_ZERO();
|
|
1584
|
+
return outVal;
|
|
1585
|
+
}
|
|
1586
|
+
tmpnum = NUM_TYPE.mul(new NUM_TYPE(base_Num16Pwrs[exp >> 2]), new NUM_TYPE(base_Num2Pwrs[exp & 3]));
|
|
1587
|
+
outVal = NUM_TYPE.mul(outVal, tmpnum);
|
|
1588
|
+
}
|
|
1589
|
+
if ((sign & 0x80) !== 0)
|
|
1590
|
+
outVal._data[0] = outVal._data[0] | NUM_TYPE.SIGN_MASK;
|
|
1591
|
+
outVal.round(dec);
|
|
1592
|
+
return outVal;
|
|
1593
|
+
}
|
|
1594
|
+
static eval_op_log(val1) {
|
|
1595
|
+
if (val1 == null)
|
|
1596
|
+
return null;
|
|
1597
|
+
let resVal = new NUM_TYPE();
|
|
1598
|
+
let d = val1.to_double();
|
|
1599
|
+
if (d > 0.0)
|
|
1600
|
+
resVal = NUM_TYPE.from_double(Math.log(d));
|
|
1601
|
+
else
|
|
1602
|
+
resVal.NUM_ZERO();
|
|
1603
|
+
return resVal;
|
|
1604
|
+
}
|
|
1605
|
+
static eval_op_exp(val1) {
|
|
1606
|
+
let resVal;
|
|
1607
|
+
if (val1 === null)
|
|
1608
|
+
return null;
|
|
1609
|
+
let d = val1.to_double();
|
|
1610
|
+
resVal = NUM_TYPE.from_double(Math.exp(d));
|
|
1611
|
+
return resVal;
|
|
1612
|
+
}
|
|
1613
|
+
static eval_op_abs(val1) {
|
|
1614
|
+
if (val1 === null)
|
|
1615
|
+
return null;
|
|
1616
|
+
let resVal = new NUM_TYPE(val1);
|
|
1617
|
+
resVal.num_abs();
|
|
1618
|
+
return resVal;
|
|
1619
|
+
}
|
|
1620
|
+
static eval_op_sin(val1) {
|
|
1621
|
+
if (val1 === null)
|
|
1622
|
+
return null;
|
|
1623
|
+
let resVal = new NUM_TYPE();
|
|
1624
|
+
let d = val1.to_double();
|
|
1625
|
+
resVal = NUM_TYPE.from_double(Math.sin(d));
|
|
1626
|
+
return resVal;
|
|
1627
|
+
}
|
|
1628
|
+
static eval_op_cos(val1) {
|
|
1629
|
+
if (val1 === null)
|
|
1630
|
+
return null;
|
|
1631
|
+
let resVal = new NUM_TYPE();
|
|
1632
|
+
let d = val1.to_double();
|
|
1633
|
+
resVal = NUM_TYPE.from_double(Math.cos(d));
|
|
1634
|
+
return resVal;
|
|
1635
|
+
}
|
|
1636
|
+
static eval_op_tan(val1) {
|
|
1637
|
+
if (val1 == null)
|
|
1638
|
+
return null;
|
|
1639
|
+
let resVal = new NUM_TYPE();
|
|
1640
|
+
let d = val1.to_double();
|
|
1641
|
+
resVal = NUM_TYPE.from_double(Math.tan(d));
|
|
1642
|
+
return resVal;
|
|
1643
|
+
}
|
|
1644
|
+
static eval_op_asin(val1) {
|
|
1645
|
+
if (val1 === null)
|
|
1646
|
+
return null;
|
|
1647
|
+
let resVal = new NUM_TYPE();
|
|
1648
|
+
let d = val1.to_double();
|
|
1649
|
+
if (d <= 1.0 && d >= -1.0)
|
|
1650
|
+
resVal = NUM_TYPE.from_double(Math.asin(d));
|
|
1651
|
+
else
|
|
1652
|
+
resVal = NUM_TYPE.from_double(0.0);
|
|
1653
|
+
return resVal;
|
|
1654
|
+
}
|
|
1655
|
+
static eval_op_acos(val1) {
|
|
1656
|
+
if (val1 === null)
|
|
1657
|
+
return null;
|
|
1658
|
+
let resVal = new NUM_TYPE();
|
|
1659
|
+
let d = val1.to_double();
|
|
1660
|
+
if (d <= 1.0 && d >= -1.0)
|
|
1661
|
+
resVal = NUM_TYPE.from_double(Math.acos(d));
|
|
1662
|
+
else
|
|
1663
|
+
resVal = NUM_TYPE.from_double(0.0);
|
|
1664
|
+
return resVal;
|
|
1665
|
+
}
|
|
1666
|
+
static eval_op_atan(val1) {
|
|
1667
|
+
if (val1 === null)
|
|
1668
|
+
return null;
|
|
1669
|
+
let resVal = new NUM_TYPE();
|
|
1670
|
+
let d = val1.to_double();
|
|
1671
|
+
resVal = NUM_TYPE.from_double(Math.atan(d));
|
|
1672
|
+
return resVal;
|
|
1673
|
+
}
|
|
1674
|
+
num_abs() {
|
|
1675
|
+
let l;
|
|
1676
|
+
if (this.NUM_IS_LONG()) {
|
|
1677
|
+
l = this.NUM_LONG();
|
|
1678
|
+
if (l < 0)
|
|
1679
|
+
l = -l;
|
|
1680
|
+
this.NUM_4_LONG(l);
|
|
1681
|
+
return;
|
|
1682
|
+
}
|
|
1683
|
+
this._data[0] &= NUM_TYPE.toSByte(~NUM_TYPE.SIGN_MASK);
|
|
1684
|
+
}
|
|
1685
|
+
static eval_op_rand(val1) {
|
|
1686
|
+
if (val1 === null)
|
|
1687
|
+
return null;
|
|
1688
|
+
let rand_initialized = Randomizer.get_initialized();
|
|
1689
|
+
let rand_mod;
|
|
1690
|
+
let rand_mul;
|
|
1691
|
+
let rand_seed;
|
|
1692
|
+
let tmp_num = new NUM_TYPE();
|
|
1693
|
+
if (!rand_initialized) {
|
|
1694
|
+
Randomizer.set_initialized();
|
|
1695
|
+
rand_mod = new NUM_TYPE();
|
|
1696
|
+
rand_mul = new NUM_TYPE();
|
|
1697
|
+
rand_seed = new NUM_TYPE();
|
|
1698
|
+
rand_mod.num_4_a_std("100000007");
|
|
1699
|
+
rand_mul.num_4_a_std("75000007");
|
|
1700
|
+
rand_seed.num_4_a_std("12345678");
|
|
1701
|
+
Randomizer.set_mod(rand_mod.to_double());
|
|
1702
|
+
Randomizer.set_mul(rand_mul.to_double());
|
|
1703
|
+
Randomizer.set_seed(rand_seed.to_double());
|
|
1704
|
+
}
|
|
1705
|
+
else {
|
|
1706
|
+
rand_mod = NUM_TYPE.from_double(Randomizer.get_mod());
|
|
1707
|
+
rand_mul = NUM_TYPE.from_double(Randomizer.get_mul());
|
|
1708
|
+
rand_seed = NUM_TYPE.from_double(Randomizer.get_seed());
|
|
1709
|
+
}
|
|
1710
|
+
if (!val1.num_is_zero()) {
|
|
1711
|
+
if (val1.num_is_neg())
|
|
1712
|
+
rand_seed.NUM_4_LONG(NUM_TYPE.hash_rand());
|
|
1713
|
+
else
|
|
1714
|
+
rand_seed = new NUM_TYPE(val1);
|
|
1715
|
+
}
|
|
1716
|
+
else {
|
|
1717
|
+
if (rand_seed.num_is_neg()) {
|
|
1718
|
+
tmp_num.NUM_4_LONG(-1);
|
|
1719
|
+
rand_seed = NUM_TYPE.mul(rand_seed, tmp_num);
|
|
1720
|
+
}
|
|
1721
|
+
}
|
|
1722
|
+
rand_seed = NUM_TYPE.mul(rand_seed, rand_mul);
|
|
1723
|
+
rand_seed = NUM_TYPE.mod(rand_seed, rand_mod);
|
|
1724
|
+
tmp_num = NUM_TYPE.div(rand_seed, rand_mod);
|
|
1725
|
+
Randomizer.set_mod(rand_mod.to_double());
|
|
1726
|
+
Randomizer.set_mul(rand_mul.to_double());
|
|
1727
|
+
Randomizer.set_seed(rand_seed.to_double());
|
|
1728
|
+
return tmp_num;
|
|
1729
|
+
}
|
|
1730
|
+
static hash_rand() {
|
|
1731
|
+
return ((new Date().getMilliseconds()) ^ Math.random() * 12345678);
|
|
1732
|
+
}
|
|
1733
|
+
}
|
|
1734
|
+
export class OperData {
|
|
1735
|
+
NUM_Diff_ = 0;
|
|
1736
|
+
NUM_Exp1_ = 0;
|
|
1737
|
+
NUM_Exp2_ = 0;
|
|
1738
|
+
}
|
|
1739
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTlVNX1RZUEUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvc3JjL21hbmFnZW1lbnQvZGF0YS9OVU1fVFlQRS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUcsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdGLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxRyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRWpDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBYXRELE1BQU0sT0FBTyxRQUFRO0lBSW5CLE1BQU0sQ0FBQyxZQUFZLEdBQVcsVUFBVSxDQUFDO0lBQ3pDLE1BQU0sQ0FBQyxPQUFPLEdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDNUIsTUFBTSxDQUFDLFNBQVMsR0FBVyxDQUFDLENBQUMsQ0FBQztJQUM5QixNQUFNLENBQUMsUUFBUSxHQUFXLEVBQUUsQ0FBQztJQUM3QixNQUFNLENBQUMsYUFBYSxHQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sQ0FBQyxRQUFRLEdBQVcsRUFBRSxDQUFDO0lBQzdCLE1BQU0sQ0FBQyxTQUFTLEdBQVcsQ0FBQyxHQUFHLENBQUM7SUFFaEMsU0FBUyxHQUFXLEdBQUcsQ0FBQztJQUN4QixXQUFXLEdBQVcsR0FBRyxDQUFDO0lBQ2xCLG9CQUFvQixHQUFXLENBQUMsQ0FBQztJQUNqQyxLQUFLLEdBQWMsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRTVELElBQUksSUFBSSxDQUFDLEtBQWdC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UUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNyRCxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztnQkFDNUYsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoQyxDQUFDO1FBQ0QsQ0FBQztRQUNMLEtBQUssR0FBRyxHQUFHLFFBQVEsQ0FBQyxTQUFTLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQzlDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQzVDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztnQkFDMUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCLENBQUM7UUFD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QUFRLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3RFLElBQUksU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3hFLElBQUksU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMzRSxJQUFJLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDNUUsSUFBSSxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMvRSxJQUFJLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNsRixJQUFJLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUs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LEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDNUQsSUFBSSxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQy9ELElBQUksU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNoRSxJQUFJLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ25FLElBQUksU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3RFLElBQUksU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3hFLElBQUksU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMzRSxJQUFJLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDNUUsSUFBSSxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMvRSxJQUFJLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNsRixJQUFJLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNuRixJQUFJLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdEYsSUFBSSxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3RGLElBQUksU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxF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QUM7UUFDOUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzlDLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUU1QyxVQUFVLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLFVBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDekMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUMzQyxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBS08sTUFBTSxDQUFDLFNBQVM7UUFDdEIsT0FBTyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQztJQU1yRSxDQUFDOztBQUdILE1BQU0sT0FBTyxRQUFRO0lBQ25CLFNBQVMsR0FBVyxDQUFDLENBQUM7SUFDdEIsU0FBUyxHQUFXLENBQUMsQ0FBQztJQUN0QixTQUFTLEdBQVcsQ0FBQyxDQUFDO0NBQ3ZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgIEludDMyLCBOTnVtYmVyLCBOU3RyaW5nLCBOdW1iZXJTdHlsZXMsIFN0cmluZ0J1aWxkZXIgfSBmcm9tICdAbWFnaWMteHBhL21zY29yZWxpYic7XHJcbmltcG9ydCB7IENvbnN0YW50cywgUElDSW50ZXJmYWNlLCBSYW5kb21pemVyLCBTdG9yYWdlQXR0cmlidXRlLCBVdGlsU3RyQnl0ZU1vZGUgfSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHsgUElDIH0gZnJvbSAnLi4vZ3VpL1BJQyc7XHJcbmltcG9ydCB7IElFbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uL2Vudi9JRW52aXJvbm1lbnQnO1xyXG5pbXBvcnQgeyBFdmVudHMgfSBmcm9tICcuLi8uLi9FdmVudHMnO1xyXG5pbXBvcnQgeyBHdWlFbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uL0d1aUVudmlyb25tZW50JztcclxuXHJcbi8vLyAgIFRoaXMgY2xhc3MgaGFuZGxlcyBhIE1hZ2ljIE51bWJlciB0aGUgaWRlbnRpY2FsIHdheSBpdCdzIHJlcHJlc2VudGVkIGluIE1hZ2ljLlxyXG4vLy8gICBNb3N0IG9mIHRoZSBtZXRob2RzIGluIHRoaXMgY2xhc3Mgd2VyZSBjb3BpZWQgZnJvbSB0aGUgQysrIHNvdXJjZXMgb2YgTWFnaWMsXHJcbi8vLyAgIGluIG9yZGVyIHRvIGtlZXAgdGhlIGV4YWN0IGxvZ2ljIHVzZWQgaW4gb3JkZXIgdG8gaW1wbGVtZW50IGFsbCB0aGUgZnVuY3Rpb25hbGl0eVxyXG4vLy8gICBleHBlY3RlZCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgZXhhY3QgbWV0aG9kcyBuYW1lcyBhbmQgdmFyaWFibGVzIG5hbWVzIHdoZXJlIHVzZWRcclxuLy8vICAgaW4gb3JkZXIgdG8gbWFrZSBmdXR1cmUgZGVidWdnaW5nIG1vcmUgZWFzeWVyLlxyXG4vLy8gICBOb3RpY2UgYSBsb25nIGRhdGEgdHlwZSB0aGF0IGlzIHVzZWQgaW4gTWFnaWMgQysrIHNvdXJjZXMsIGlzIHJlcHJlc2VudGVkIGluIGphdmFcclxuLy8vICAgYnkgdGhlIGludCBkYXRhIHR5cGUuXHJcbi8vLyA8L3N1bW1hcnk+XHJcbi8vLyA8YXV0aG9yPiAgQWxvbiBCYXItTmVzXHJcbi8vLyA8L2F1dGhvcj5cclxuXHJcbmV4cG9ydCBjbGFzcyBOVU1fVFlQRSB7XHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBDb25zdGFudHNcclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIHN0YXRpYyBJTlRfWkVST19IRVg6IHN0cmluZyA9IFwiMDAwMDAwMDBcIjtcclxuICBzdGF0aWMgTk9fUk9PTTogbnVtYmVyID0gLTE7XHJcbiAgc3RhdGljIFpFUk9fRklMTDogbnVtYmVyID0gLTI7XHJcbiAgc3RhdGljIE5VTV9TSVpFOiBudW1iZXIgPSAyMDtcclxuICBzdGF0aWMgTlVNX0xPTkdfVFlQRTogbnVtYmVyID0gLTE7XHJcbiAgc3RhdGljIEVYUF9CSUFTOiBudW1iZXIgPSA2NDtcclxuICBzdGF0aWMgU0lHTl9NQVNLOiBudW1iZXIgPSAtMTI4O1xyXG5cclxuICBDT01NQUNIQVI6IHN0cmluZyA9ICcsJztcclxuICBERUNJTUFMQ0hBUjogc3RyaW5nID0gJy4nO1xyXG4gIHByaXZhdGUgU0lHTklGSUNBTlRfTlVNX1NJWkU6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBfZGF0YTogSW50OEFycmF5ID0gbmV3IEludDhBcnJheShOVU1fVFlQRS5OVU1fU0laRSk7XHJcblxyXG4gIHNldCBEYXRhKHZhbHVlOiBJbnQ4QXJyYXkpIHtcclxuICAgIHRoaXMuX2RhdGEgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBEYXRhKCk6IEludDhBcnJheSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gQ29uc3RydWN0b3IgbGlzdFxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIGNvbnN0cnVjdG9yKCk7XHJcbiAgY29uc3RydWN0b3IocmVjb3JkSGV4U3RyOiBzdHJpbmcpO1xyXG4gIGNvbnN0cnVjdG9yKGJ5dGVWYWw6IEludDhBcnJheSwgb2Zmc2V0OiBudW1iZXIsIGxlbmd0aDogbnVtYmVyKTtcclxuICBjb25zdHJ1Y3RvcihieXRlVmFsOiBJbnQ4QXJyYXkpO1xyXG4gIGNvbnN0cnVjdG9yKGRlY1N0cjogc3RyaW5nLCBwaWM6IFBJQywgY29tcElkeDogbnVtYmVyKTtcclxuICBjb25zdHJ1Y3RvcihudW1Gcm9tOiBOVU1fVFlQRSk7XHJcbiAgY29uc3RydWN0b3IocmVjb3JkSGV4U3RyT3JCeXRlVmFsT3JEZWNTdHJPck51bUZyb20/OiBhbnksIG9mZnNldE9yUGljPzogYW55LCBsZW5ndGhPckNvbXBJZHg/OiBudW1iZXIpIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSAmJiAocmVjb3JkSGV4U3RyT3JCeXRlVmFsT3JEZWNTdHJPck51bUZyb20gPT09IG51bGwgfHwgcmVjb3JkSGV4U3RyT3JCeXRlVmFsT3JEZWNTdHJPck51bUZyb20uY29uc3RydWN0b3IgPT09IFN0cmluZykpIHtcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8xKHJlY29yZEhleFN0ck9yQnl0ZVZhbE9yRGVjU3RyT3JOdW1Gcm9tKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMgJiYgKHJlY29yZEhleFN0ck9yQnl0ZVZhbE9yRGVjU3RyT3JOdW1Gcm9tID09PSBudWxsIHx8IHJlY29yZEhleFN0ck9yQnl0ZVZhbE9yRGVjU3RyT3JOdW1Gcm9tIGluc3RhbmNlb2YgSW50OEFycmF5KSAmJiAob2Zmc2V0T3JQaWMgPT09IG51bGwgfHwgb2Zmc2V0T3JQaWMuY29uc3RydWN0b3IgPT09IE51bWJlcikgJiYgKGxlbmd0aE9yQ29tcElkeCA9PT0gbnVsbCB8fCBsZW5ndGhPckNvbXBJZHguY29uc3RydWN0b3IgPT09IE51bWJlcikpIHtcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8yKHJlY29yZEhleFN0ck9yQnl0ZVZhbE9yRGVjU3RyT3JOdW1Gcm9tLCBvZmZzZXRPclBpYywgbGVuZ3RoT3JDb21wSWR4KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgKHJlY29yZEhleFN0ck9yQnl0ZVZhbE9yRGVjU3RyT3JOdW1Gcm9tID09PSBudWxsIHx8IHJlY29yZEhleFN0ck9yQnl0ZVZhbE9yRGVjU3RyT3JOdW1Gcm9tIGluc3RhbmNlb2YgSW50OEFycmF5KSkge1xyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzMocmVjb3JkSGV4U3RyT3JCeXRlVmFsT3JEZWNTdHJPck51bUZyb20pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiAocmVjb3JkSGV4U3RyT3JCeXRlVmFsT3JEZWNTdHJPck51bUZyb20gPT09IG51bGwgfHwgcmVjb3JkSGV4U3RyT3JCeXRlVmFsT3JEZWNTdHJPck51bUZyb20uY29uc3RydWN0b3IgPT09IFN0cmluZykgJiYgKG9mZnNldE9yUGljID09PSBudWxsIHx8IG9mZnNldE9yUGljIGluc3RhbmNlb2YgUElDKSAmJiAobGVuZ3RoT3JDb21wSWR4ID09PSBudWxsIHx8IGxlbmd0aE9yQ29tcElkeC5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSkge1xyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzQocmVjb3JkSGV4U3RyT3JCeXRlVmFsT3JEZWNTdHJPck51bUZyb20sIG9mZnNldE9yUGljLCBsZW5ndGhPckNvbXBJZHgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvbnN0cnVjdG9yXzUocmVjb3JkSGV4U3RyT3JCeXRlVmFsT3JEZWNTdHJPck51bUZyb20pO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIERlZmF1bHQgY29uc3RydWN0b3IuIFNldCB2YWx1ZSB0byAwXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzAoKTogdm9pZCB7XHJcbiAgICB0aGlzLmluaXRDb25zdCgpO1xyXG4gICAgdGhpcy5OVU1fWkVSTygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENyZWF0ZXMgYSBNYWdpYyBOdW1iZXIgZnJvbSBhIHN0cmluZyBnb3QgZnJvbSB0aGUgWE1MIHJlY29yZCB2YWx1ZS4gVGhlXHJcbiAgLy8vICAgU3RyaW5nIGlzIDQwIGNoYXJhY3RlcnMgbG9uZyBpbiBhbiBoZXhhIHJlcHJlc2VudGF0aW9uLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZWNvcmRIZXhTdHJcIj4gIE1hZ2ljIG51bWJlciBpbiBoZXggZm9ybWF0LCA0MCBjaGFyYWN0ZXJzIGxvbmdcclxuICAvLy8gPC9wYXJhbT5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzEocmVjb3JkSGV4U3RyOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBpOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHR3b0RpZ2l0czogc3RyaW5nO1xyXG4gICAgdGhpcy5pbml0Q29uc3QoKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5TSUdOSUZJQ0FOVF9OVU1fU0laRTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgdHdvRGlnaXRzID0gcmVjb3JkSGV4U3RyLnN1YnN0ciggaSAqIDIsIDIpO1xyXG4gICAgICAgIHRoaXMuX2RhdGFbaV0gPSBOVU1fVFlQRS50b1NCeXRlKE5OdW1iZXIuUGFyc2UodHdvRGlnaXRzLCBOdW1iZXJTdHlsZXMuSGV4TnVtYmVyKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNhdGNoIChleCkge1xyXG4gICAgICBFdmVudHMuV3JpdGVXYXJuaW5nVG9Mb2coZXgpO1xyXG5cclxuICAgICAgdGhpcy5OVU1fWkVSTygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENyZWF0ZXMgYSBNYWdpYyBOdW1iZXIgZnJvbSBhcnJheSBvZiBieXRlcy4gVXNlZCBmcm9tIHRoZSBleHByZXNzaW9uIGV2YWx1YXRvclxyXG4gIC8vLyAgIHdoZW4gYSBNYWdpYyBOdW1iZXIgdmFsdWUgYXBlYXJzIHdpdGhpbiBhbiBleHByZXNzaW9uLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJieXRlVmFsXCI+ICBBcnJheSBvZiBieXRlcyByZXByZXNlbnRpbmcgYSBNYWdpYyBOdW1iZXI8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib2Zmc2V0XCI+ICAgSW5kZXggb2YgdGhlIGZpcnN0IGJ5dGUgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxlbmd0aFwiPiAgIE51bWJlciBvZiBieXRlcyB0byB1c2UgPC9wYXJhbT5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzIoYnl0ZVZhbDogSW50OEFycmF5LCBvZmZzZXQ6IG51bWJlciwgbGVuZ3RoOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuY29uc3RydWN0b3JfMCgpO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIHRoaXMuX2RhdGFbaV0gPSBieXRlVmFsW2kgKyBvZmZzZXRdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENyZWF0ZXMgYSBNYWdpYyBOdW1iZXIgZnJvbSBhcnJheSBvZiBieXRlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8zKGJ5dGVWYWw6IEludDhBcnJheSk6IHZvaWQge1xyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8yKGJ5dGVWYWwsIDAsIGJ5dGVWYWwubGVuZ3RoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDcmVhdGVzIGEgTWFnaWMgTnVtYmVyIGZyb20gYSBkZWNpbWFsIGZvciBudW1iZXIgYW5kIGl0cyBwaWN0dXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRlY1N0clwiPiAgVGhlIG51bWJlciBpbiBhIHN0cmluZyBkZWNpbWFsIGZvcm1hdCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljXCI+ICAgICBUaGUgcGljdHVyZSBmb3JtYXQgdG8gYmUgdXNlZCA8L3BhcmFtPlxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfNChkZWNTdHI6IHN0cmluZywgcGljOiBQSUMsIGNvbXBJZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKCk7XHJcbiAgICB0aGlzLmZyb21fYShkZWNTdHIsIHBpYywgY29tcElkeCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ3JlYXRlcyBhIE1hZ2ljIE51bWJlciBmcm9tIGEgTWFnaWMgTnVtYmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm51bUZyb21cIj4gIFRoZSBzb3VyY2UgTWFnaWMgTnVtYmVyIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl81KG51bUZyb206IE5VTV9UWVBFKTogdm9pZCB7XHJcbiAgICB0aGlzLmluaXRDb25zdCgpO1xyXG4gICAgdGhpcy5fZGF0YSA9IG5ldyBJbnQ4QXJyYXkobnVtRnJvbS5fZGF0YS5sZW5ndGgpO1xyXG4gICAgZm9yIChsZXQgX2FpOiBudW1iZXIgPSAwOyBfYWkgPCB0aGlzLl9kYXRhLmxlbmd0aDsgKytfYWkpXHJcbiAgICAgIHRoaXMuX2RhdGFbX2FpXSA9IG51bUZyb20uX2RhdGFbX2FpXTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCdWlsZCBhIGRlY2ltYWwgc3RyaW5nIGZyb20gdGhlIG51bWJlciBzdG9yZWQgaW4gYSBNYWdpYyBOdW1iZXIuXHJcbiAgLy8vICAgVGhlIHN0cmluZyBpcyBidWlsZCBmcm9tIHRoZSBwaWN0dXJlIHByb3ZpZGVkIGFzIGEgcGFyYW1ldGVyLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNcIj5UaGUgcGljdHVyZSB0byB1c2UgZm9yIGJ1aWxkaW5nIHRoZSBkaXNwbGF5IHN0cmluZ1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gVGhlIGRlY2ltYWwgZm9ybSBvZiB0aGUgTWFnaWMgTnVtYmVyIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICB0b0Rpc3BsYXlWYWx1ZShwaWM6IFBJQyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50b19hKHBpYyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaW5pdCBjb25zdGFudHMgb2YgdGhlIGNsYXNzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGluaXRDb25zdCgpOiB2b2lkIHtcclxuICAgIGxldCBlbnY6IElFbnZpcm9ubWVudCA9IEd1aUVudmlyb25tZW50LkVudmlyb25tZW50O1xyXG4gICAgdGhpcy5ERUNJTUFMQ0hBUiA9IGVudi5HZXREZWNpbWFsKCk7XHJcbiAgICB0aGlzLkNPTU1BQ0hBUiA9IGVudi5HZXRUaG91c2FuZHMoKTtcclxuICAgIHRoaXMuU0lHTklGSUNBTlRfTlVNX1NJWkUgPSBlbnYuR2V0U2lnbmlmaWNhbnROdW1TaXplKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQnVpbGQgYW4gaGV4YWRlY2ltYWwgc3RyaW5nIGZyb20gdGhlIE1hZ2ljIE51bWJlciBmb3IgdGhlIGRhdGEgcmVjb3JkIGluXHJcbiAgLy8vICAgdGhlIFhNTCB0YWcgKHRvIGJlIHNlbnQgdG8gdGhlIE1hZ2ljIFNlcnZlcikuIFRoZSBsZW5ndGggb2YgdGhpcyBzdHJpbmdcclxuICAvLy8gICB3aWxsIGFsbHdheXMgYmUgdHdvIHRpbWVzIHRoZSBsZW5ndGggb2YgdGhlIE1hZ2ljIE51bWJlcnMgKGluIGJ5dGVzKVxyXG4gIC8vLyAgIGJlY2F1c2UgZXZlcnkgYnl0ZSBpbiB0aGUgTWFnaWMgTnVtYmVyIHdpbGwgYmUgdHJhbnNsYXRlZCB0byB0d29cclxuICAvLy8gICBjaGFyYWN0ZXIgaGV4YWRlY2ltYWwgc3RyaW5nLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgaGV4YWRlY2ltYWwgc3RyaW5nXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICB0b1hNTHJlY29yZCgpOiBzdHJpbmcge1xyXG4gICAgbGV0IGhleFN0cjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKHRoaXMuU0lHTklGSUNBTlRfTlVNX1NJWkUgKiAyKTtcclxuICAgIGxldCBudW06IG51bWJlcjtcclxuXHJcbiAgICBpZiAodGhpcy5OVU1fSVNfTE9ORygpKVxyXG4gICAgICBudW0gPSA1O1xyXG4gICAgZWxzZVxyXG4gICAgICBudW0gPSB0aGlzLlNJR05JRklDQU5UX05VTV9TSVpFO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLlNJR05JRklDQU5UX05VTV9TSVpFOyBpKyspIHtcclxuICAgICAgaWYgKGkgPCBudW0pXHJcbiAgICAgICAgaGV4U3RyLkFwcGVuZCgoJzAnICsgKHRoaXMuX2RhdGFbaV0gJiAweEZGKS50b1N0cmluZygxNikpLnNsaWNlKC0yKSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBoZXhTdHIuQXBwZW5kKFwiMDBcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGhleFN0ci5Ub1N0cmluZygpLnRvVXBwZXJDYXNlKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVHJhbnNmb3JtaW5nIGEgZGVjaW1hbCBzdHJpbmcgbnVtYmVyIHRvIGEgTWFnaWMgTnVtYmVyIHVzaW5nIHRoZSBmb3JtYXRcclxuICAvLy8gICBwcm92aWRlZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiQWxwaGFcIj4gIFRoZSBudW1iZXIgaXMgZGVjaW1hbCBzdHJpbmcgZm9ybVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljXCI+ICAgIFRoZSBwaWN0dXJlIGZvbWF0IHRvIHVzZSBmb3IgdGhlIGV4dHJhY3RpbmcgdGhlIG51bWJlclxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHByaXZhdGUgZnJvbV9hKEFscGhhOiBzdHJpbmcsIHBpYzogUElDLCBjb21wSWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgaWR4OiBudW1iZXI7XHJcbiAgICBsZXQgZGVjOiBib29sZWFuO1xyXG4gICAgbGV0IGRlY3M6IG51bWJlcjtcclxuICAgIGxldCBkaWdpdDogbnVtYmVyO1xyXG4gICAgbGV0IGxlbjogbnVtYmVyO1xyXG4gICAgbGV0IG5vX3BpYzogYm9vbGVhbjtcclxuICAgIGxldCBQb3M6IG51bWJlcjtcclxuICAgIGxldCBTVHlwZTogYm9vbGVhbjtcclxuICAgIGxldCBTUGFydDogYm9vbGVhbjtcclxuICAgIGxldCBTaWduZWQ6IG51bWJlcjtcclxuICAgIGxldCBidWY6IHN0cmluZztcclxuICAgIGxldCBtYXNrOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgbGV0IGM6IHN0cmluZztcclxuICAgIGxldCBOZ3R2UHJtdDogYm9vbGVhbjtcclxuICAgIGxldCBTY2FuOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgbGV0IFBidWY6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBsZXQgaXNfbmVnYXRpdmU6IGJvb2xlYW47XHJcbiAgICBsZXQgbmVnU3RyOiBzdHJpbmc7XHJcbiAgICBsZXQgbmVnUHJlZjogc3RyaW5nO1xyXG4gICAgbGV0IHBvc1ByZWY6IHN0cmluZztcclxuICAgIGxldCBuZWdTdWZmOiBzdHJpbmc7XHJcbiAgICBsZXQgcG9zU3VmZjogc3RyaW5nO1xyXG4gICAgbGV0IHNwZWNpYWxWYWxOZXdQb2xpY3k6IGJvb2xlYW4gPSBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRTcGVjaWFsVmFsTmV3UG9saWN5KCk7XHJcblxyXG4gICAgLy8gUGFyc2UgdGhlIHBpY3R1cmUgZm9ybWF0XHJcbiAgICBub19waWMgPSAocGljID09IG51bGwpO1xyXG4gICAgbGVuID0gMDtcclxuICAgIFNUeXBlID0gZmFsc2U7ICAvLyBQSUNfUFNUViA6IHRydWUsIFBJQ19OR1RWOiBmYWxzZVxyXG4gICAgU1BhcnQgPSBmYWxzZTsgIC8vIFBJQ19QUkVGIDogdHJ1ZSwgUElDX1NVRiA6IGZhbHNlXHJcblxyXG4gICAgaWYgKCFub19waWMpIHtcclxuICAgICAgbWFzayA9IHBpYy5nZXRNYXNrKCk7XHJcbiAgICAgIGlmICghc3BlY2lhbFZhbE5ld1BvbGljeSlcclxuICAgICAgICBpZiAoQWxwaGEubGVuZ3RoID4gcGljLmdldE1hc2tTaXplKCkpXHJcbiAgICAgICAgICBBbHBoYSA9IEFscGhhLnN1YnN0cigwLCBwaWMuZ2V0TWFza1NpemUoKSk7XHJcbiAgICAgIE5ndHZQcm10ID0gcGljLmlzTmVnYXRpdmUoKTtcclxuICAgICAgaWYgKE5ndHZQcm10KSB7XHJcbiAgICAgICAgbmVnUHJlZiA9IHBpYy5nZXROZWdQcmVmXygpO1xyXG4gICAgICAgIHBvc1ByZWYgPSBwaWMuZ2V0UG9zUHJlZl8oKTtcclxuICAgICAgICBuZWdTdWZmID0gcGljLmdldE5lZ1N1ZmZfKCk7XHJcbiAgICAgICAgcG9zU3VmZiA9IHBpYy5nZXRQb3NTdWZmXygpO1xyXG5cclxuICAgICAgICBpZiAobmVnUHJlZi5sZW5ndGggPT09IHBvc1ByZWYubGVuZ3RoKSB7XHJcbiAgICAgICAgICBpZiAobmVnUHJlZi5sZW5ndGggPT09IDAgfHwgbmVnUHJlZiA9PT0gcG9zUHJlZilcclxuICAgICAgICAgICAgU1BhcnQgPSBmYWxzZTtcclxuICAgICAgICAgIC8vIFBJQ19TVUZcclxuICAgICAgICAgIGVsc2UgU1BhcnQgPSB0cnVlOyAvLyBQSUNfUFJFRlxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIFNQYXJ0ID0gdHJ1ZTsgLy8gUElDX1BSRUZcclxuXHJcbiAgICAgICAgaWYgKFNQYXJ0KVxyXG4gICAgICAgICAgbmVnU3RyID0gbmVnUHJlZjtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBuZWdTdHIgPSBuZWdTdWZmO1xyXG5cclxuICAgICAgICBpZiAobmVnU3RyLmxlbmd0aCA9PT0gMClcclxuICAgICAgICAgIFNUeXBlID0gdHJ1ZTtcclxuICAgICAgICAvLyBQSUNfUE9TSVRJVkVcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBTVHlwZSA9IGZhbHNlOyAvLyBQSUNfTkVHQVRJVkVcclxuXHJcbiAgICAgICAgaWYgKFNUeXBlKVxyXG4gICAgICAgICAgU2NhbiA9IChTUGFydCA/IHBvc1ByZWYgOiBwb3NTdWZmKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBTY2FuID0gKFNQYXJ0ID8gbmVnUHJlZiA6IG5lZ1N1ZmYpO1xyXG4gICAgICAgIGxlbiA9IFNjYW4ubGVuZ3RoO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcGljID0gbmV3IFBJQyhcIlwiLCBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMsIGNvbXBJZHgpO1xyXG4gICAgICBOZ3R2UHJtdCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIExvY2FsaXplIHZhcmlhYmxlcyBhbmQgZmxhZ3NcclxuICAgIGRlYyA9IGZhbHNlO1xyXG4gICAgZGVjcyA9IDA7XHJcbiAgICBkaWdpdCA9IDA7XHJcbiAgICBTaWduZWQgPSAwO1xyXG5cclxuICAgIC8vIFNwZWNpYWxWYWxOZXdQb2xpY3kgPSBZXHJcbiAgICAvLyBMb29wIG9uIGlucHV0IHN0cmluZyBvZiBudW1iZXJzIGFuZCBtYXRjaCB0aGVtIGFnYWluc3QgdGhlIHBpY3R1cmUgbWFza1xyXG4gICAgLy8gSXQgbWF5IGhhcHBlbiB0aGF0IHRoZSBwaWN0dXJlIG1hc2sgaXMgc21hbGxlciB0aGFuIHJlY2VpdmVkIG51bWJlciBzdHJpbmdcclxuICAgIC8vIEZvciBleGFtcGxlLCBpZiB0aGUgc3RyaW5nIHJlY2VpdmVkIGlzICcxMjM0LjU2JyB3aGVyZWFzIHBpY3R1cmUgaXMgJzIuMSdcclxuICAgIC8vIHRoZW4gdGhlIGNoYXJhY3RlcnMgdG8gcGFyc2UgZnJvbSB0aGUgaW5wdXQgc3RyaW5nIGlzICcxMjM0LjUnIGkuZS4gIyBkaWdpdHNcclxuICAgIC8vIHNwZWNpZmllZCBpbiBwaWN0dXJlIGJlZm9yZSB0aGUgZGVjaW1hbCBzaG91bGQgYmUgaWdub3JlZC4gUGFyc2luZyBzaG91bGRcclxuICAgIC8vIGNvbnRpbnVlIHRpbGwgIyBvZiBkaWdpdHMgYWZ0ZXIgZGVjaW1hbCBwb2ludCBpbiBwaWN0dXJlIG1hdGNoIHdpdGggdGhvc2UgaW5cclxuICAgIC8vIHRoZSBpbnB1dCBzdHJpbmcgb3IgdGhlIGVuZCBvZiB0aGUgc3RyaW5nXHJcbiAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IEFscGhhLmxlbmd0aDsgKSB7XHJcbiAgICAgIC8vIEFzIG1lbnRpb25lZCBhYm92ZSwgY29udGludWUgcGFyc2luZyBldmVuIGlmIG1hc2sgbGVuZ3RoIGFzIGV4aGF1c3RlZCBieSBjaGVja2luZ1xyXG4gICAgICAvLyBpZHggPj0gcGljLm1hc2tfc2l6ZS4gSG93ZXZlciwgYXMgbG9uZyBhcyBtYXNrIGxlbmd0aCBpcyB2YWxpZCwgbWF0Y2ggdGhlIG1hc2tcclxuICAgICAgaWYgKG5vX3BpYyB8fCAoc3BlY2lhbFZhbE5ld1BvbGljeSAmJiBpZHggPj0gcGljLmdldE1hc2tTaXplKCkpICB8fCBtYXNrW2lkeF0gPT09IFN0cmluZy5mcm9tQ2hhckNvZGUoUElDSW50ZXJmYWNlLlBJQ19OKSkge1xyXG4gICAgICAgIGMgPSBBbHBoYVtpZHhdO1xyXG4gICAgICAgIGlmIChzcGVjaWFsVmFsTmV3UG9saWN5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIC8vIHN0b3AgcGFyc2luZyBpZiAjIG9mIGRlY3MgYWxyZWFkeSByZWFjaGVkXHJcbiAgICAgICAgICBpZiAoZGVjICYmIGRlY3MgPT09IHBpYy5nZXREZWMoKSlcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgLy8gRmluYWxseSwgc3RvcCBwYXJzaW5nIG9uIG1hdGNoaW5nIHJlcXVpcmVkIG5vLiBvZiBkZWNpbWFsIGRpZ2l0c1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KGMpKSB7XHJcbiAgICAgICAgICBkaWdpdCsrO1xyXG4gICAgICAgICAgUGJ1ZiArPSBjO1xyXG4gICAgICAgICAgaWYgKGRlYylcclxuICAgICAgICAgICAgZGVjcysrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjID09PSB0aGlzLkRFQ0lNQUxDSEFSKSB7XHJcbiAgICAgICAgICBQYnVmICs9IHRoaXMuREVDSU1BTENIQVI7XHJcbiAgICAgICAgICBkZWMgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjICE9PSB0aGlzLkNPTU1BQ0hBUikge1xyXG4gICAgICAgICAgaWYgKE5ndHZQcm10ICYmIFNpZ25lZCA9PT0gMCkge1xyXG4gICAgICAgICAgICBTaWduZWQgPSAxO1xyXG4gICAgICAgICAgICBmb3IgKGkgPSBpZHgsIFBvcyA9IDA7IGkgPD0gQWxwaGEubGVuZ3RoICYmIFBvcyA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKG5vX3BpYyB8fCBtYXNrW2ldID09PSBTdHJpbmcuZnJvbUNoYXJDb2RlKFBJQ0ludGVyZmFjZS5QSUNfTikpIHtcclxuICAgICAgICAgICAgICAgIGMgPSBBbHBoYVtpXTtcclxuICAgICAgICAgICAgICAgIGlmIChjICE9PSBTY2FuW1Bvc10pIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGMgPT09ICctJyAmJiAhU1R5cGUpXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChjID09PSAnKycgJiYgU1R5cGUpXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgIFNpZ25lZCA9IC0xO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFBvcysrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoUG9zID4gMCAmJiBQb3MgPCBsZW4pXHJcbiAgICAgICAgICAgICAgU2lnbmVkID0gLTE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gUUNSICMgMzA5NjIzIDogSWYgcHJlZml4L3N1ZmZpeCBzdHJpbmdzIGNvbnRhaW5zIGRpZ2l0cyBpbiBpdCwgaXQgaXMgY29uc2lkZXJlZCBhcyBwYXJ0IG9mIGRhdGEuXHJcbiAgICAgICAgICAgIC8vIEluIG9yZGVyIHRvIGF2b2lkIGl0IHNraXAgdGhlIHByZWZpeCAvIHN1ZmZpeCBzdHJpbmdzIHdoaWxlIGV4dHJhY3RpbmcgdGhlIGRhdGEgcGFydCB0byBidWlsZCBOVU1fVFlQRS5cclxuICAgICAgICAgICAgaWYgKGlkeCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgIGlmIChwaWMuZ2V0TmVnUHJlZl8oKS5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgICAgICAgaWYgKEFscGhhLnN0YXJ0c1dpdGgocGljLmdldE5lZ1ByZWZfKCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlkeCArPSBwaWMuZ2V0TmVnUHJlZl8oKS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmIChwaWMuZ2V0UG9zUHJlZl8oKS5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgICAgICAgaWYgKEFscGhhLnN0YXJ0c1dpdGgocGljLmdldFBvc1ByZWZfKCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlkeCArPSBwaWMuZ2V0UG9zUHJlZl8oKS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIGlmIChwaWMuZ2V0TmVnU3VmZl8oKS5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgICAgICAgaWYgKEFscGhhLmVuZHNXaXRoKHBpYy5nZXROZWdTdWZmXygpKSkge1xyXG4gICAgICAgICAgICAgICAgICBpZHggKz0gcGljLmdldE5lZ1N1ZmZfKCkubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAocGljLmdldFBvc1N1ZmZfKCkubGVuZ3RoID4gMClcclxuICAgICAgICAgICAgICAgIGlmIChBbHBoYS5lbmRzV2l0aChwaWMuZ2V0UG9zU3VmZl8oKSkpIHtcclxuICAgICAgICAgICAgICAgICAgaWR4ICs9IHBpYy5nZXRQb3NTdWZmXygpLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWR4Kys7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFNpZ25lZCA9PT0gMCAmJiBTVHlwZSlcclxuICAgICAgU2lnbmVkID0gMTtcclxuXHJcbiAgICAvLyBSZXR1cm4gcmVzdWx0IG9mIGRlY29kZWQgZGlnaXRzXHJcbiAgICBpc19uZWdhdGl2ZSA9IChTaWduZWQgPT09IDEgJiYgIVNUeXBlKSB8fCAoU2lnbmVkICE9PSAxICYmIFNUeXBlKTtcclxuICAgIGlmIChkZWNzID4gMCB8fCBkaWdpdCA+IDkpIHtcclxuICAgICAgYnVmID0gKGlzX25lZ2F0aXZlID8gJy0nIDogJyAnKSArIFBidWY7XHJcbiAgICAgIHRoaXMubnVtXzRfYV9zdGQoYnVmKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5OVU1fNF9MT05HKChpc19uZWdhdGl2ZSA/IC0xIDogMSkgKiB0aGlzLmFfMl9sb25nKFBidWYpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBFeHRyYWN0aW5nIGEgbm9uIGxvbmcgbnVtYmVyIGZyb20gYSBkZWNpbWFsIHN0cmluZyBudW1iZXIgKG51bWJlcnMgd2l0aFxyXG4gIC8vLyAgIGRlY2ltYWwgcG9pbnQsIGV0Yy4uLilcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RyXCI+ICBUaGUgZGVjaW1hbCBzdHJpbmcgbnVtYmVyXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgbnVtXzRfYV9zdGQoc3RyOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBkaWdzdHI6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBsZXQgZGlnbGVuOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHdob2xlczogbnVtYmVyID0gMDtcclxuICAgIGxldCBkZWNzOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGlzRGVjOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgaXNtaW51czogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHBvczogbnVtYmVyO1xyXG5cclxuICAgIGZvciAocG9zID0gMDsgcG9zIDwgc3RyLmxlbmd0aDsgcG9zKyspIHtcclxuICAgICAgbGV0IGM6IHN0cmluZyA9IHN0ci5jaGFyQXQocG9zKTtcclxuICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KGMpKSB7XHJcbiAgICAgICAgaWYgKGRpZ2xlbiA+IDAgfHwgYyAhPT0gJzAnKSB7XHJcbiAgICAgICAgICBkaWdsZW4rKztcclxuICAgICAgICAgIGRpZ3N0ciA9IGRpZ3N0ciArIGM7XHJcbiAgICAgICAgICBpZiAoIWlzRGVjKVxyXG4gICAgICAgICAgICB3aG9sZXMrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoaXNEZWMpXHJcbiAgICAgICAgICBkZWNzID0gZGVjcyArIDE7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoYyA9PT0gdGhpcy5ERUNJTUFMQ0hBUilcclxuICAgICAgICBpc0RlYyA9IHRydWU7XHJcbiAgICAgIGVsc2UgaWYgKGMgPT09ICctJylcclxuICAgICAgICBpc21pbnVzID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLk5VTV9aRVJPKCk7XHJcbiAgICBpZiAoZGlnbGVuID09PSAwKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKCgod2hvbGVzICsgZGVjcykgJiAxKSA+IDApIHtcclxuICAgICAgdGhpcy5fZGF0YVsxXSA9IE5VTV9UWVBFLnRvU0J5dGUoZGlnc3RyLmNoYXJDb2RlQXQoMCkgLSAnMCcuY2hhckNvZGVBdCgwKSk7XHJcbiAgICAgIHBvcyA9IDE7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHBvcyA9IDA7XHJcblxyXG4gICAgbGV0IG51bXB0cjogbnVtYmVyID0gMSArIHBvcztcclxuICAgIGRpZ2xlbiA9IE1hdGgubWluKGRpZ2xlbiwgKHRoaXMuU0lHTklGSUNBTlRfTlVNX1NJWkUgLSAxKSAqIDIgLSBwb3MpO1xyXG4gICAgd2hpbGUgKHBvcyA8IGRpZ2xlbikge1xyXG4gICAgICBsZXQgZGlnaXQxOiBudW1iZXIgPSBOVU1fVFlQRS50b1NCeXRlKChkaWdzdHIuY2hhckNvZGVBdChwb3MrKykgLSAnMCcuY2hhckNvZGVBdCgwKSkpO1xyXG4gICAgICBsZXQgZGlnaXQyOiBudW1iZXIgPSBOVU1fVFlQRS50b1NCeXRlKCgocG9zIDwgZGlnbGVuKVxyXG4gICAgICAgID8gKGRpZ3N0ci5jaGFyQ29kZUF0KHBvcysrKSAtICcwJy5jaGFyQ29kZUF0KDApKVxyXG4gICAgICAgIDogJ1xcMCcuY2hhckNvZGVBdCgwKSkpO1xyXG4gICAgICB0aGlzLl9kYXRhW251bXB0cisrXSA9IE5VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUudG9VQnl0ZShkaWdpdDEpICogMTAgKyBOVU1fVFlQRS50b1VCeXRlKGRpZ2l0MikpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh3aG9sZXMgPiAwKVxyXG4gICAgICB0aGlzLl9kYXRhWzBdID0gTlVNX1RZUEUudG9TQnl0ZSg8bnVtYmVyPk5VTV9UWVBFLkVYUF9CSUFTICsgKCh3aG9sZXMgKyAxKSA+PiAxKSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuX2RhdGFbMF0gPSBOVU1fVFlQRS50b1NCeXRlKDxudW1iZXI+TlVNX1RZUEUuRVhQX0JJQVMgLSAoZGVjcyA+PiAxKSk7XHJcblxyXG4gICAgaWYgKGlzbWludXMpXHJcbiAgICAgIHRoaXMuX2RhdGFbMF0gfD0gTlVNX1RZUEUuU0lHTl9NQVNLO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRyYW5zbGF0aW5nIGEgbG9uZyB2YWx1ZSBpbnRvIGFuIGludGVybmFsIE1hZ2ljIE51bWJlciBmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxvbmdWYWxcIj4gIFRoZSBudW1iZXIgdG8gYmUga2VwdFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIE5VTV80X0xPTkcobG9uZ1ZhbDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgaGV4U3RyOiBzdHJpbmc7XHJcbiAgICB0aGlzLk5VTV9aRVJPKCk7XHJcblxyXG4gICAgaWYgKGxvbmdWYWwgIT09IDApIHtcclxuICAgICAgaWYgKGxvbmdWYWwgPCAwKVxyXG4gICAgICAgIGxvbmdWYWwgPSAoMHhGRkZGRkZGRiArIGxvbmdWYWwgKyAxKTtcclxuXHJcbiAgICAgIGhleFN0ciA9IGxvbmdWYWwudG9TdHJpbmcoMTYpO1xyXG4gICAgICBpZiAobG9uZ1ZhbCA+IDApXHJcbiAgICAgICAgaGV4U3RyID0gTlVNX1RZUEUuSU5UX1pFUk9fSEVYLnN1YnN0cihoZXhTdHIubGVuZ3RoKSArIGhleFN0cjtcclxuXHJcbiAgICAgIHRoaXMuX2RhdGFbMV0gPSBOVU1fVFlQRS50b1NCeXRlKHBhcnNlSW50KGhleFN0ci5zdWJzdHIoNiwgKDgpIC0gKDYpKSwgMTYpKTtcclxuICAgICAgdGhpcy5fZGF0YVsyXSA9IE5VTV9UWVBFLnRvU0J5dGUocGFyc2VJbnQoaGV4U3RyLnN1YnN0cig0LCAoNikgLSAoNCkpLCAxNikpO1xyXG4gICAgICB0aGlzLl9kYXRhWzNdID0gTlVNX1RZUEUudG9TQnl0ZShwYXJzZUludChoZXhTdHIuc3Vic3RyKDIsICg0KSAtICgyKSksIDE2KSk7XHJcbiAgICAgIHRoaXMuX2RhdGFbNF0gPSBOVU1fVFlQRS50b1NCeXRlKHBhcnNlSW50KGhleFN0ci5zdWJzdHIoMCwgKDIpIC0gKDApKSwgMTYpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXR0aW5nIGEgbG9uZyB2YWx1ZSBmcm9tIGEgZGVjaW1hbCBzdHJpbmcgcmVwcmVzZW50aW5nIGEgbG9uZyB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdHJcIj4gIHRoZSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgbG9uZyB2YWx1ZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGxvbmcgbnVtYmVyXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBhXzJfbG9uZyhzdHI6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBsZXQgbjogbnVtYmVyID0gMDtcclxuICAgIGZvciAobGV0IHBvczogbnVtYmVyID0gMDsgcG9zIDwgc3RyLmxlbmd0aDsgcG9zKyspIHtcclxuICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHN0ci5jaGFyQXQocG9zKSkpIHtcclxuICAgICAgICBuID0gbiAqIDEwO1xyXG4gICAgICAgIG4gPSBuICsgc3RyLmNoYXJDb2RlQXQocG9zKSAtICcwJy5jaGFyQ29kZUF0KDApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBBY3RpdmF0aW5nIHRoZSBwcm9jZXNzIG9mIGJ1aWxkaW5nIGEgZGVjaW1hbCBzdHJpbmcgYnkgdGhlIGZvcm1hdCBpbmRpY2F0ZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljXCI+YSBudW1lcmljIHBpY3R1cmUgdG8gdXNlIGZvciBidWlsZGluZyB0aGUgZGlzcGxheSBzdHJpbmdcclxuICAvLy8gPC9wYXJhbT5cclxuICB0b19hKHBpYzogUElDKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnRvX2FfcGljKHBpYyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUGVyZm9ybXMgdGhlIHByb2Nlc3Mgb2YgYnVpbGRpbmcgYSBkZWNpbWFsIHN0cmluZyBieSB0aGUgcGljdHVyZSBwcm92aWRlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNcIj4gIHRoZSBwaWN0dXJlIGNsYXNzIGhvbGRpbmcgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwaWN0dXJlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgc3RyaW5nIGZvcm0gb2YgdGhlIE1hZ2ljIE51bWJlclxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJvdGVjdGVkIHRvX2FfcGljKHBpYzogUElDKTogc3RyaW5nIHtcclxuICAgIGxldCBidWY6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4oMTI4KTtcclxuICAgIGxldCByZW1haW5zOiBudW1iZXI7XHJcbiAgICBsZXQgc2lnbl9uOiBib29sZWFuO1xyXG4gICAgbGV0IHByZWZfbGVuOiBudW1iZXI7XHJcbiAgICBsZXQgc3VmZl9sZW46IG51bWJlcjtcclxuICAgIGxldCBwcmVmX3N0cjogU3RyaW5nO1xyXG4gICAgbGV0IHN1ZmZfc3RyOiBTdHJpbmc7XHJcbiAgICBsZXQgc3RyX3BvczogbnVtYmVyO1xyXG4gICAgbGV0IHN0cl9sZW46IG51bWJlcjtcclxuICAgIGxldCBvdXRfcG9zOiBudW1iZXI7XHJcbiAgICBsZXQgb3V0X2J1Zjogc3RyaW5nW107XHJcbiAgICBsZXQgdG1wX291dF9idWY6IHN0cmluZ1tdO1xyXG4gICAgbGV0IHBhZDogc3RyaW5nO1xyXG4gICAgbGV0IGxlZnQ6IGJvb2xlYW47XHJcbiAgICBsZXQgcGZpbGw6IGJvb2xlYW47XHJcbiAgICBsZXQgbWFza19jaGFyczogbnVtYmVyO1xyXG4gICAgbGV0IGxlbjogbnVtYmVyO1xyXG4gICAgbGV0IHJlczogc3RyaW5nW107XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IGlzT3V0OiBib29sZWFuO1xyXG4gICAgbGV0IG91dFZhbDogc3RyaW5nW107XHJcblxyXG4gICAgbGVuID0gcGljLmdldE1hc2tTaXplKCk7XHJcblxyXG4gICAgLy8gU2V0IHNpZ25zIG9mIG51bWJlclxyXG4gICAgc2lnbl9uID0gKHBpYy5pc05lZ2F0aXZlKCkgJiYgdGhpcy5udW1faXNfbmVnKCkgPyBmYWxzZSA6IHRydWUpO1xyXG5cclxuICAgIHByZWZfbGVuID0gKHNpZ25fbiA/IHBpYy5nZXRQb3NQcmVmXygpLmxlbmd0aCA6IHBpYy5nZXROZWdQcmVmXygpLmxlbmd0aCk7IC8vIHBpY19zaWduW1BJQ19QUkVGXS5sZW47XHJcbiAgICBzdWZmX2xlbiA9IChzaWduX24gPyBwaWMuZ2V0UG9zU3VmZl8oKS5sZW5ndGggOiBwaWMuZ2V0TmVnU3VmZl8oKS5sZW5ndGgpOyAvLyBwaWNfc2lnbltQSUNfU1VGRl0ubGVuO1xyXG5cclxuICAgIGxlZnQgPSBwaWMuaXNMZWZ0KCk7XHJcbiAgICBwZmlsbCA9IHBpYy5wYWRGaWxsKCk7XHJcbiAgICBtYXNrX2NoYXJzID0gcGljLmdldE1hc2tDaGFycygpO1xyXG4gICAgb3V0VmFsID0gTlN0cmluZy5Ub0NoYXJBcnJheShwaWMuZ2V0TWFzaygpLnN1YnN0cigwLCBsZW4pKTtcclxuICAgIG91dF9idWYgPSAoKGxlZnQgfHwgKG1hc2tfY2hhcnMgPiAwKSkgPyBidWYgOiBvdXRWYWwpO1xyXG4gICAgaWYgKGxlZnQpXHJcbiAgICB7XHJcbiAgICAgIGZvciAoaT0wOyBpIDwgb3V0X2J1Zi5sZW5ndGg7IGkrKyApXHJcbiAgICAgICAgb3V0X2J1ZltpXSA9ICg8c3RyaW5nPicwJy50b0xvd2VyQ2FzZSgpKTtcclxuICAgIH1cclxuICAgIGlzT3V0ID0gKChsZWZ0IHx8IChtYXNrX2NoYXJzID4gMCkpID8gZmFsc2UgOiB0cnVlKTtcclxuXHJcbiAgICAvLyBDb252ZXJ0IHRvIHN0cmluZ1xyXG4gICAgc3RyX3BvcyA9IHByZWZfbGVuO1xyXG4gICAgc3RyX2xlbiA9IGxlbiAtIHByZWZfbGVuIC0gc3VmZl9sZW47XHJcbiAgICB0bXBfb3V0X2J1ZiA9IG91dF9idWYuc2xpY2Uoc3RyX3Bvcywgb3V0X2J1Zi5sZW5ndGgpO1xyXG4gICAgaWYgKHRoaXMuTlVNX0lTX0xPTkcoKSlcclxuICAgICAgcmVtYWlucyA9IHRoaXMubnVtX2xfMl9zdHIodGhpcy5OVU1fTE9ORygpLCB0bXBfb3V0X2J1Ziwgc3RyX2xlbiwgcGljKTtcclxuICAgIGVsc2VcclxuICAgICAgICByZW1haW5zID0gdGhpcy50b19zdHIodG1wX291dF9idWYsIHN0cl9sZW4sIHBpYyk7XHJcblxyXG4gICAgZm9yIChpID0gc3RyX3BvczsgaSA8IG91dF9idWYubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgb3V0X2J1ZltpXSA9IHRtcF9vdXRfYnVmW2kgLSBzdHJfcG9zXTtcclxuICAgIHRtcF9vdXRfYnVmID0gbnVsbDtcclxuXHJcbiAgICBpZiAocmVtYWlucyA8IG1hc2tfY2hhcnMpIHtcclxuICAgICAgICByZXMgPSBuZXcgQXJyYXkobGVuKTtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKVxyXG4gICAgICAgIHJlc1tpXSA9IChyZW1haW5zID09PSBOVU1fVFlQRS5aRVJPX0ZJTEwgPyBwaWMuZ2V0WmVyb1BhZCgpIDogJyonKTtcclxuICAgICAgcmV0dXJuIE5TdHJpbmcuRnJvbUNoYXJzKHJlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1hc2tfY2hhcnMgPiAwKSB7XHJcbiAgICAgIHJlbWFpbnMgLT0gbWFza19jaGFycztcclxuICAgICAgc3RyX3BvcyArPSBtYXNrX2NoYXJzO1xyXG4gICAgICBzdHJfbGVuIC09IG1hc2tfY2hhcnM7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdGFrZSBjYXJlIG9mIHBhZCBhZnRlciBhbmQgYmVmb3JlIG51bWJlclxyXG4gICAgaWYgKHBmaWxsKSB7XHJcbiAgICAgIHBhZCA9IHBpYy5nZXRQYWQoKTtcclxuICAgICAgaWYgKGxlZnQpIHtcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmVtYWluczsgaSsrKVxyXG4gICAgICAgICAgb3V0X2J1ZiBbc3RyX3BvcyArIHN0cl9sZW4gKyBpXSA9IHBhZDtcclxuICAgICAgICBzdHJfcG9zICs9IHJlbWFpbnM7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHJlbWFpbnM7IGkrKylcclxuICAgICAgICAgIG91dF9idWZbc3RyX3BvcyArIGldID0gcGFkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcGFkID0gJyAnO1xyXG4gICAgICBzdHJfcG9zICs9IHJlbWFpbnM7XHJcbiAgICAgIHN0cl9sZW4gLT0gcmVtYWlucztcclxuICAgIH1cclxuXHJcbiAgICAvLyB0YWtlIGNhcmUgb2Ygc3VmZml4IGFuZCBwcmVmaXhcclxuICAgIGlmIChzdWZmX2xlbiA+IDApIHtcclxuICAgICAgc3VmZl9zdHIgPSBzaWduX24gPyBwaWMuZ2V0UG9zU3VmZl8oKSA6IHBpYy5nZXROZWdTdWZmXygpO1xyXG4gICAgICBpZiAoc3VmZl9sZW4gPT09IDEpXHJcbiAgICAgICAgb3V0X2J1ZltzdHJfcG9zICsgc3RyX2xlbl0gPSBzdWZmX3N0clswXTtcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHN1ZmZfbGVuOyBpKyspXHJcbiAgICAgICAgICBvdXRfYnVmW3N0cl9wb3MgKyBzdHJfbGVuICsgaV0gPSBzdWZmX3N0cltpXTtcclxuICAgICAgfVxyXG4gICAgICBzdHJfbGVuICs9IHN1ZmZfbGVuO1xyXG4gICAgfVxyXG4gICAgaWYgKHByZWZfbGVuID4gMCkge1xyXG4gICAgICBzdHJfcG9zIC09IHByZWZfbGVuO1xyXG4gICAgICBzdHJfbGVuICs9IHByZWZfbGVuO1xyXG4gICAgICBwcmVmX3N0ciA9IHNpZ25fbiA/IHBpYy5nZXRQb3NQcmVmXygpIDogcGljLmdldE5lZ1ByZWZfKCk7XHJcbiAgICAgIGlmIChwcmVmX2xlbiA9PT0gMSlcclxuICAgICAgICAgIG91dF9idWZbc3RyX3Bvc10gPSBwcmVmX3N0clswXTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcmVmX2xlbjsgaSsrKVxyXG4gICAgICAgICAgb3V0X2J1ZltzdHJfcG9zICsgaV0gPSBwcmVmX3N0cltpXTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBzdHJfcG9zIG5vdyBwb2ludHMgdG8gYmVnaW5uaW5nIG9mIHJlc3VsdCBzdHJcclxuICAgIC8vIHRha2UgY2FyZSBvZiBmaW5hbCBwYWQgYWZ0ZXIgYW5kIGJlZm9yZSBudW1iZXJcclxuICAgIGlmICghcGZpbGwpIHtcclxuICAgICAgbGV0IG91dEJ1ZkxlbjogbnVtYmVyID0gb3V0X2J1Zi5sZW5ndGg7XHJcblxyXG4gICAgICBpZiAobGVmdCkge1xyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCByZW1haW5zICYmIChzdHJfcG9zICsgc3RyX2xlbiArIGkgPCBvdXRCdWZMZW4pOyBpKyspXHJcbiAgICAgICAgICBvdXRfYnVmW3N0cl9wb3MgKyBzdHJfbGVuICsgaV0gPSBwYWQ7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgc3RyX3BvcyAtPSByZW1haW5zO1xyXG5cclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmVtYWlucyAmJiAoc3RyX3BvcyArIGkgPCBvdXRCdWZMZW4pOyBpKyspXHJcbiAgICAgICAgICBvdXRfYnVmW3N0cl9wb3MgKyBpXSA9IHBhZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHJlc3VsdCBidWlsdCwgZmluaXNoXHJcbiAgICBpZiAoaXNPdXQpXHJcbiAgICAgIHJldHVybiBOU3RyaW5nLkZyb21DaGFycyhvdXRfYnVmKTtcclxuXHJcbiAgICAvLyBDb3B5IHJlc3VsdCB0byBvdXRwdXQgYnVmZmVyXHJcbiAgICBpZiAobWFza19jaGFycyA9PT0gMCkge1xyXG4gICAgICBpZiAoc3RyX3BvcyArIGxlbiA+IG91dF9idWYubGVuZ3RoKVxyXG4gICAgICAgIGxlbiA9IG91dF9idWYubGVuZ3RoIC0gc3RyX3BvcztcclxuICAgICAgcmV0dXJuIE5TdHJpbmcuRnJvbUNoYXJzKG91dF9idWYsIHN0cl9wb3MsICBsZW4pO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAob3V0X3BvcyA9IDA7IG91dF9wb3MgPCBsZW4gJiYgc3RyX3BvcyA8IG91dF9idWYubGVuZ3RoOyBvdXRfcG9zKyspXHJcbiAgICAgIGlmIChvdXRWYWxbb3V0X3Bvc10gPT09IFN0cmluZy5mcm9tQ2hhckNvZGUoUElDSW50ZXJmYWNlLlBJQ19OKSlcclxuICAgICAgICBvdXRWYWxbb3V0X3Bvc10gPSBvdXRfYnVmW3N0cl9wb3MrK107XHJcblxyXG4gICAgcmV0dXJuIE5TdHJpbmcuRnJvbUNoYXJzKG91dFZhbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQnVsZGluZyB0aGUgYmFzaWMgZGVjaW1hbCBzdHJpbmcgbnVtYmVyIGZyb20gYSBsb25nIHZhbHVlICh3aXRob3V0XHJcbiAgLy8vICAgdGhlIHNwZWNpYWwgcGljdHVyZSBmZWF0dXJlcykuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm51bVwiPiAgVGhlIG51bWJlciB0byBiZSB0cmFuc2xhdGVkXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdHJcIj4gIFRoZSBtYXNrIHRvIHVzZSBmb3IgYnVpbGRpbmcgdGhlIHN0cmluZyBudW1iZXJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPGxlbj4gICAgbGVuICAgdGhlIGxlbiB0byB1c2UgaW4gdGhlIHN0ciBjaGFyIGFycmF5IDwvbGVuPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljXCI+ICBUaGUgcGljdHVyZSBjbGFzcyBob2xkaW5nIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGljdHVyZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGxlbmd0aCBvZiB0aGUgcmVzdWx0IHN0cmluZ1xyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJvdGVjdGVkIG51bV9sXzJfc3RyKG51bTogbnVtYmVyLCBzdHI6IHN0cmluZ1tdLCBsZW46IG51bWJlciwgcGljOiBQSUMpOiBudW1iZXIge1xyXG4gICAgbGV0IGNvbW1hczogYm9vbGVhbjtcclxuICAgIGxldCBkaWdpdHM6IG51bWJlcjtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgZGVjczogbnVtYmVyO1xyXG4gICAgbGV0IGo6IG51bWJlcjtcclxuXHJcbiAgICBpZiAobnVtIDwgMClcclxuICAgICAgbnVtID0gLW51bTtcclxuICAgIGNvbW1hcyA9IHBpYy53aXRoQ29tYSgpO1xyXG4gICAgZGVjcyA9IE1hdGgubWluKHBpYy5nZXREZWMoKSwgbGVuIC0gMSk7XHJcbiAgICBpZiAoZGVjcyA+IDApXHJcbiAgICAgIGxlbiAtPSAoZGVjcyArIDEpO1xyXG4gICAgaSA9IGxlbjtcclxuXHJcbiAgICAvLyAyNi8xMS85NyBTaGF5IFouIEJ1ZyAjNzcwNTI2IC0gSWYgVGhlIGRlY2ltYWwgcG9pbnQgaXMgdGhlIGZpcnN0XHJcbiAgICAvLyBpbiB0aGUgcGljdHVyZSdzIGZvcm1hdCAtIGFzc3VtZSB0aGF0IHRoZSBpbnB1dCB2YWx1ZSBpcyBsZWdhbCAhIVxyXG4gICAgaWYgKG51bSA9PT0gMCAmJiAhcGljLmRlY0luRmlyc3RQb3MoKSkge1xyXG4gICAgICBpZiAocGljLnplcm9GaWxsKCkpXHJcbiAgICAgICAgcmV0dXJuIChOVU1fVFlQRS5aRVJPX0ZJTEwpO1xyXG4gICAgICBpZiAobGVuID09PSAwKVxyXG4gICAgICAgIHJldHVybiAoTlVNX1RZUEUuTk9fUk9PTSk7XHJcblxyXG4gICAgICBpZiAoaSA+IHN0ci5sZW5ndGgpXHJcbiAgICAgICAgaSA9IHN0ci5sZW5ndGg7XHJcblxyXG4gICAgICBzdHJbLS1pXSA9ICcwJztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGVjcyA+IDApIHtcclxuICAgICAgICBzdHJbbGVuXSA9IHRoaXMuREVDSU1BTENIQVI7XHJcbiAgICAgIGZvciAoaiA9IDA7IGogPCBkZWNzOyBqKyspXHJcbiAgICAgICAgc3RyW2xlbiArIDEgKyBqXSA9ICcwJztcclxuICAgIH1cclxuXHJcbiAgICBkaWdpdHMgPSAwO1xyXG4gICAgZm9yICg7IG51bSA+IDA7IG51bSA9IE1hdGguZmxvb3IobnVtIC8gMTApKSB7XHJcbiAgICAgIGktLTtcclxuICAgICAgaWYgKGNvbW1hcykge1xyXG4gICAgICAgIGlmIChkaWdpdHMgPT09IDMpIHtcclxuICAgICAgICAgIGlmIChpIDwgMClcclxuICAgICAgICAgICAgcmV0dXJuIChOVU1fVFlQRS5OT19ST09NKTtcclxuICAgICAgICAgIGRpZ2l0cyA9IDA7XHJcbiAgICAgICAgICBzdHJbaS0tXSA9IHRoaXMuQ09NTUFDSEFSO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkaWdpdHMrKztcclxuICAgICAgfVxyXG4gICAgICBpZiAoaSA8IDApXHJcbiAgICAgICAgcmV0dXJuIChOVU1fVFlQRS5OT19ST09NKTtcclxuICAgICAgc3RyW2ldID0gKChudW0gJSAxMCkudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQnVsZGluZyB0aGUgYmFzaWMgZGVjaW1hbCBzdHJpbmcgbnVtYmVyIGZyb20gYSBub24gbG9uZyB2YWx1ZSAod2l0aG91dFxyXG4gIC8vLyAgIHRoZSBzcGVjaWFsIHBpY3R1cmUgZmVhdHVyZXMpLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdHJcIj4gIFRoZSBtYXNrIHRvIHVzZSBmb3IgYnVpbGRpbmcgdGhlIHN0cmluZyBudW1iZXJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPGxlbj4gICAgbGVuICAgdGhlIGxlbiB0byB1c2UgaW4gdGhlIHN0ciBjaGFyIGFycmF5IDwvbGVuPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljXCI+ICBUaGUgcGljdHVyZSBjbGFzcyBob2xkaW5nIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGljdHVyZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGxlbmd0aCBvZiB0aGUgcmVzdWx0IHN0cmluZ1xyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJvdGVjdGVkIHRvX3N0cihzdHI6IHN0cmluZ1tdLCBsZW46IG51bWJlciwgcGljOiBQSUMpOiBudW1iZXIge1xyXG4gICAgbGV0IHRtcDogTlVNX1RZUEU7XHJcbiAgICBsZXQgY29tbWFzOiBib29sZWFuO1xyXG4gICAgbGV0IGRpZ2l0czogbnVtYmVyO1xyXG4gICAgbGV0IGRlY3BvczogbnVtYmVyO1xyXG4gICAgbGV0IGxhc3Q6IG51bWJlcjtcclxuICAgIGxldCBmaXJzdDogbnVtYmVyO1xyXG4gICAgbGV0IGo6IG51bWJlcjtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgZGVjczogbnVtYmVyO1xyXG4gICAgbGV0IG51bV9jaGFyOiBudW1iZXI7XHJcblxyXG4gICAgY29tbWFzID0gcGljLndpdGhDb21hKCk7XHJcbiAgICBkZWNzID0gcGljLmdldERlYygpO1xyXG4gICAgaWYgKGRlY3MgPj0gbGVuKVxyXG4gICAgICBkZWNzID0gbGVuIC0gMTtcclxuXHJcbiAgICB0bXAgPSBuZXcgTlVNX1RZUEUodGhpcyk7XHJcbiAgICB0bXAucm91bmQoZGVjcyk7XHJcbiAgICBpZiAodG1wLk5VTV9JU19MT05HKCkpXHJcbiAgICAgIHJldHVybiB0bXAubnVtX2xfMl9zdHIodG1wLk5VTV9MT05HKCksIHN0ciwgbGVuLCBwaWMpO1xyXG5cclxuICAgIGlmIChwaWMuemVyb0ZpbGwoKSAmJiB0bXAuX2RhdGFbMF0gPT09IDApXHJcbiAgICAgIHJldHVybiAoTlVNX1RZUEUuWkVST19GSUxMKTtcclxuXHJcbiAgICBpID0gbGVuIC0gMTtcclxuICAgIGRpZ2l0cyA9IDA7XHJcbiAgICBkZWNwb3MgPSAoKHRtcC5fZGF0YVswXSAmIH5OVU1fVFlQRS5TSUdOX01BU0spIC0gTlVNX1RZUEUuRVhQX0JJQVMgKyAxKSAqIDI7XHJcbiAgICBsYXN0ID0gZGVjcG9zIC0gMSArIGRlY3M7XHJcbiAgICBmaXJzdCA9IGRlY3BvcyAtIDE7XHJcbiAgICBpZiAoZmlyc3QgPiAyKVxyXG4gICAgICBmaXJzdCA9ICh0bXAuX2RhdGFbMV0gPCAxMCkgPyAzIDogMjtcclxuXHJcbiAgICBmb3IgKGogPSBsYXN0OyBqID49IGZpcnN0OyBqLS0pIHtcclxuICAgICAgaWYgKGkgPCAwKVxyXG4gICAgICAgIHJldHVybiAoTlVNX1RZUEUuTk9fUk9PTSk7XHJcblxyXG4gICAgICBpZiAoY29tbWFzICYmIChqIDwgZGVjcG9zKSkge1xyXG4gICAgICAgIGlmIChkaWdpdHMgPT09IDMpIHtcclxuICAgICAgICAgIGRpZ2l0cyA9IDA7XHJcbiAgICAgICAgICBzdHJbaS0tXSA9IHRoaXMuQ09NTUFDSEFSO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkaWdpdHMrKztcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gSlBOOjE1LzA4LzE5OTYgWWFtYSAoSnBuSUQ6WkEwODE1MDAxKVxyXG4gICAgICAvLyBXaGVuIEZvcm1hdD1cIk4xMkNcIiBhbmQgbnVtIGlzIGJpZ2dlciB0aGFuIDEyIGRpZ2l0cy5cclxuICAgICAgLy8gTUFHSUMgY3J1c2hlcy4gQmVjYXVzZSB0aGUgdmFyIGkgYmVjb21lcyBuZWdhdGl2ZS5cclxuICAgICAgaWYgKGkgPCAwKVxyXG4gICAgICAgIHJldHVybiAoTlVNX1RZUEUuTk9fUk9PTSk7XHJcblxyXG4gICAgICBpZiAoKGogPCAyKSB8fCAoaiA+PSB0aGlzLlNJR05JRklDQU5UX05VTV9TSVpFICogMikpXHJcbiAgICAgICAgc3RyW2ktLV0gPSAnMCc7XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChpIDwgMClcclxuICAgICAgICAgIHJldHVybiAoTlVNX1RZUEUuTk9fUk9PTSk7XHJcbiAgICAgICAgbnVtX2NoYXIgPSB0bXAuX2RhdGFbaiA+PiAxXTtcclxuICAgICAgICBzdHJbaS0tXSA9ICgoKGogJiAxKSAhPT0gMCkgPyAobnVtX2NoYXIgJSAxMCkgOiAoTWF0aC5mbG9vcihudW1fY2hhciAvIDEwKSkpLnRvU3RyaW5nKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChqID09PSBkZWNwb3MpIHtcclxuICAgICAgICBpZiAoaSA8IDApXHJcbiAgICAgICAgICByZXR1cm4gKE5VTV9UWVBFLk5PX1JPT00pO1xyXG4gICAgICAgIHN0cltpLS1dID0gdGhpcy5ERUNJTUFMQ0hBUjtcclxuXHJcbiAgICAgICAgLy8gMjYvMTEvOTcgU2hheSBaLiBCdWcgIzc3MDUyNiAtIElmIFRoZSBkZWNpbWFsIHBvaW50IGlzIHRoZSBmaXJzdFxyXG4gICAgICAgIC8vIGluIHRoZSBwaWN0dXJlJ3MgZm9ybWF0IC0gYXNzdW1lIHRoYXQgdGhlIGlucHV0IHZhbHVlIGlzIGxlZ2FsICFcclxuICAgICAgICBpZiAoaSA8IDAgJiYgcGljLmRlY0luRmlyc3RQb3MoKSlcclxuICAgICAgICAgIHJldHVybiAoMCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gKGkgKyAxKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBQZXJmb3JtaW5nIGFuIEFkZCBvcGVyYXRpb24gb24gdHdvIG1hZ2ljIG51bWJlcnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibnVtMVwiPiAgdGhlIGZpcnN0IG51bWJlclxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibnVtMlwiPiAgdGhlIGZpcnN0IG51bWJlclxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHJlc3VsdFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgc3RhdGljIGFkZChudW0xOiBOVU1fVFlQRSwgbnVtMjogTlVNX1RZUEUpOiBOVU1fVFlQRSB7XHJcbiAgICBsZXQgc2lnbjE6IG51bWJlcjtcclxuICAgIGxldCBzaWduMjogbnVtYmVyO1xyXG4gICAgbGV0IGw6IG51bWJlcjtcclxuICAgIGxldCBsMTogbnVtYmVyO1xyXG4gICAgbGV0IGwyOiBudW1iZXI7XHJcbiAgICBsZXQgU0lHTklGSUNBTlRfTlVNX1NJWkU6IG51bWJlcjtcclxuICAgIC8vIG51bGwgdmFsdWVzXHJcbiAgICBpZiAobnVtMSA9PT0gbnVsbCB8fCBudW0yID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBTSUdOSUZJQ0FOVF9OVU1fU0laRSA9IEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldFNpZ25pZmljYW50TnVtU2l6ZSgpO1xyXG4gICAgbGV0IHRtcHJlczogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIGxldCByZXM6IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICBsZXQgb3BlckRhdGE6IE9wZXJEYXRhID0gbmV3IE9wZXJEYXRhKCk7XHJcbiAgICBpZiAobnVtMS5OVU1fSVNfTE9ORygpKSB7XHJcbiAgICAgIGlmIChudW0yLk5VTV9JU19MT05HKCkpIHtcclxuXHJcbiAgICAgICAgbCA9IGwxID0gbnVtMS5OVU1fTE9ORygpO1xyXG4gICAgICAgIGlmIChsIDwgMClcclxuICAgICAgICAgIGwgPSAtbDtcclxuXHJcbiAgICAgICAgaWYgKGwgPCAweDQwMDAwMDAwKSB7XHJcbiAgICAgICAgICBsID0gbDIgPSBudW0yLk5VTV9MT05HKCk7XHJcbiAgICAgICAgICBpZiAobCA8IDApXHJcbiAgICAgICAgICAgIGwgPSAtbDtcclxuICAgICAgICAgIGlmIChsIDwgMHg0MDAwMDAwMCkge1xyXG4gICAgICAgICAgICBsMSArPSBsMjtcclxuICAgICAgICAgICAgcmVzLk5VTV80X0xPTkcobDEpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBudW0yLm51bV80X3N0ZF9sb25nKCk7XHJcbiAgICAgIH1cclxuICAgICAgbnVtMS5udW1fNF9zdGRfbG9uZygpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAobnVtMi5OVU1fSVNfTE9ORygpKVxyXG4gICAgICBudW0yLm51bV80X3N0ZF9sb25nKCk7XHJcblxyXG4gICAgc2lnbjEgPSBOVU1fVFlQRS50b1NCeXRlKG51bTEuX2RhdGFbMF0gJiBOVU1fVFlQRS5TSUdOX01BU0spO1xyXG4gICAgb3BlckRhdGEuTlVNX0V4cDFfID0gTlVNX1RZUEUudG9TQnl0ZShudW0xLl9kYXRhWzBdICYgfk5VTV9UWVBFLlNJR05fTUFTSyk7XHJcbiAgICBzaWduMiA9IE5VTV9UWVBFLnRvU0J5dGUobnVtMi5fZGF0YVswXSAmIE5VTV9UWVBFLlNJR05fTUFTSyk7XHJcbiAgICBvcGVyRGF0YS5OVU1fRXhwMl8gPSBOVU1fVFlQRS50b1NCeXRlKG51bTIuX2RhdGFbMF0gJiB+TlVNX1RZUEUuU0lHTl9NQVNLKTtcclxuICAgIG9wZXJEYXRhLk5VTV9EaWZmXyA9IDxudW1iZXI+KG9wZXJEYXRhLk5VTV9FeHAxXyAtIG9wZXJEYXRhLk5VTV9FeHAyXyk7XHJcblxyXG4gICAgbGV0IGNtcHZhbDogbnVtYmVyID0gb3BlckRhdGEuTlVNX0RpZmZfO1xyXG4gICAgaWYgKGNtcHZhbCA9PT0gMCkge1xyXG4gICAgICBjbXB2YWwgPSBOVU1fVFlQRS50b1VCeXRlKG51bTEuX2RhdGFbMV0pIC0gTlVNX1RZUEUudG9VQnl0ZShudW0yLl9kYXRhWzFdKTtcclxuICAgICAgaWYgKGNtcHZhbCA9PT0gMClcclxuICAgICAgICBjbXB2YWwgPSBOVU1fVFlQRS5tZW1jbXAobnVtMSwgMiwgbnVtMiwgMiwgU0lHTklGSUNBTlRfTlVNX1NJWkUgLSAyKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY21wdmFsID49IDApIHtcclxuICAgICAgaWYgKHNpZ24xID09PSBzaWduMilcclxuICAgICAgICB0bXByZXMgPSBOVU1fVFlQRS5hZGRfcG9zKG51bTEsIG51bTIsIG9wZXJEYXRhKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRtcHJlcyA9IE5VTV9UWVBFLnN1Yl9wb3MobnVtMSwgbnVtMiwgb3BlckRhdGEpO1xyXG5cclxuICAgICAgaWYgKHRtcHJlcy5fZGF0YVswXSAhPT0gMClcclxuICAgICAgICB0bXByZXMuX2RhdGFbMF0gPSBOVU1fVFlQRS50b1NCeXRlKHRtcHJlcy5fZGF0YVswXSB8IHNpZ24xKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBsZXQgZXhwOiBudW1iZXIgPSBvcGVyRGF0YS5OVU1fRXhwMV87XHJcbiAgICAgIG9wZXJEYXRhLk5VTV9FeHAxXyA9IG9wZXJEYXRhLk5VTV9FeHAyXztcclxuICAgICAgb3BlckRhdGEuTlVNX0V4cDJfID0gZXhwO1xyXG4gICAgICBvcGVyRGF0YS5OVU1fRGlmZl8gPSAtb3BlckRhdGEuTlVNX0RpZmZfO1xyXG5cclxuICAgICAgaWYgKHNpZ24xID09PSBzaWduMilcclxuICAgICAgICB0bXByZXMgPSBOVU1fVFlQRS5hZGRfcG9zKG51bTIsIG51bTEsIG9wZXJEYXRhKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRtcHJlcyA9IE5VTV9UWVBFLnN1Yl9wb3MobnVtMiwgbnVtMSwgb3BlckRhdGEpO1xyXG5cclxuICAgICAgaWYgKHRtcHJlcy5fZGF0YVswXSAhPT0gMClcclxuICAgICAgICB0bXByZXMuX2RhdGFbMF0gfD0gc2lnbjI7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRtcHJlcztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBQZXJmb3JtaW5nIGEgU3VidHJhY3Qgb3BlcmF0aW9uIG9uIHR3byBtYWdpYyBudW1iZXJzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm51bTFcIj4gIHRoZSBmaXJzdCBudW1iZXJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm51bTJcIj4gIHRoZSBmaXJzdCBudW1iZXJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSByZXN1bHRcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBzdWIobnVtMTogTlVNX1RZUEUsIG51bTI6IE5VTV9UWVBFKTogTlVNX1RZUEUge1xyXG4gICAgLy8gbnVsbCB2YWx1ZXNcclxuICAgIGlmIChudW0xID09PSBudWxsIHx8IG51bTIgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgIGxldCB0bXByZXM6IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICBsZXQgcmVzOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRSgpO1xyXG4gICAgbGV0IG9wZXJEYXRhOiBPcGVyRGF0YSA9IG5ldyBPcGVyRGF0YSgpO1xyXG5cclxuICAgIGlmIChudW0xLk5VTV9JU19MT05HKCkpIHtcclxuICAgICAgaWYgKG51bTIuTlVNX0lTX0xPTkcoKSkge1xyXG4gICAgICAgIGxldCBsOiBudW1iZXI7XHJcbiAgICAgICAgbGV0IGwxOiBudW1iZXIgPSBsID0gbnVtMS5OVU1fTE9ORygpO1xyXG4gICAgICAgIGlmIChsIDwgMClcclxuICAgICAgICAgIGwgPSAtbDtcclxuICAgICAgICBpZiAobCA8IDB4NDAwMDAwMDApIHtcclxuICAgICAgICAgIGxldCBsMjogbnVtYmVyID0gbCA9IG51bTIuTlVNX0xPTkcoKTtcclxuICAgICAgICAgIGlmIChsIDwgMClcclxuICAgICAgICAgICAgbCA9IC1sO1xyXG4gICAgICAgICAgaWYgKGwgPCAweDQwMDAwMDAwKSB7XHJcbiAgICAgICAgICAgIGwxIC09IGwyO1xyXG4gICAgICAgICAgICByZXMuTlVNXzRfTE9ORyhsMSk7XHJcbiAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG51bTIubnVtXzRfc3RkX2xvbmcoKTtcclxuICAgICAgfVxyXG4gICAgICBudW0xLm51bV80X3N0ZF9sb25nKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChudW0yLk5VTV9JU19MT05HKCkpXHJcbiAgICAgIG51bTIubnVtXzRfc3RkX2xvbmcoKTtcclxuXHJcbiAgICBsZXQgc2lnbjE6IG51bWJlciA9IE5VTV9UWVBFLnRvU0J5dGUobnVtMS5fZGF0YVswXSAmIE5VTV9UWVBFLlNJR05fTUFTSyk7XHJcbiAgICBvcGVyRGF0YS5OVU1fRXhwMV8gPSBOVU1fVFlQRS50b1NCeXRlKG51bTEuX2RhdGFbMF0gJiB+TlVNX1RZUEUuU0lHTl9NQVNLKTtcclxuICAgIGxldCBzaWduMjogbnVtYmVyID0gTlVNX1RZUEUudG9TQnl0ZShudW0yLl9kYXRhWzBdICYgTlVNX1RZUEUuU0lHTl9NQVNLKTtcclxuICAgIG9wZXJEYXRhLk5VTV9FeHAyXyA9IE5VTV9UWVBFLnRvU0J5dGUobnVtMi5fZGF0YVswXSAmIH5OVU1fVFlQRS5TSUdOX01BU0spO1xyXG4gICAgb3BlckRhdGEuTlVNX0RpZmZfID0gPG51bWJlcj4ob3BlckRhdGEuTlVNX0V4cDFfIC0gb3BlckRhdGEuTlVNX0V4cDJfKTtcclxuXHJcbiAgICBsZXQgY21wdmFsOiBudW1iZXIgPSBvcGVyRGF0YS5OVU1fRGlmZl87XHJcbiAgICBpZiAoY21wdmFsID09PSAwKSB7XHJcbiAgICAgIGNtcHZhbCA9IE5VTV9UWVBFLnRvVUJ5dGUobnVtMS5fZGF0YVsxXSkgLSBOVU1fVFlQRS50b1VCeXRlKG51bTIuX2RhdGFbMV0pO1xyXG4gICAgICBpZiAoY21wdmFsID09PSAwKVxyXG4gICAgICAgIGNtcHZhbCA9IE5VTV9UWVBFLm1lbWNtcChudW0xLCAyLCBudW0yLCAyLCBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRTaWduaWZpY2FudE51bVNpemUoKSAtIDIpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjbXB2YWwgPj0gMCkge1xyXG4gICAgICBpZiAoc2lnbjEgPT09IHNpZ24yKVxyXG4gICAgICAgIHRtcHJlcyA9IE5VTV9UWVBFLnN1Yl9wb3MobnVtMSwgbnVtMiwgb3BlckRhdGEpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdG1wcmVzID0gTlVNX1RZUEUuYWRkX3BvcyhudW0xLCBudW0yLCBvcGVyRGF0YSk7XHJcblxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBleHA6IG51bWJlciA9IG9wZXJEYXRhLk5VTV9FeHAxXztcclxuICAgICAgb3BlckRhdGEuTlVNX0V4cDFfID0gb3BlckRhdGEuTlVNX0V4cDJfO1xyXG4gICAgICBvcGVyRGF0YS5OVU1fRXhwMl8gPSBleHA7XHJcbiAgICAgIG9wZXJEYXRhLk5VTV9EaWZmXyA9IC1vcGVyRGF0YS5OVU1fRGlmZl87XHJcbiAgICAgIGlmIChzaWduMSA9PT0gc2lnbjIpIHtcclxuICAgICAgICB0bXByZXMgPSBOVU1fVFlQRS5zdWJfcG9zKG51bTIsIG51bTEsIG9wZXJEYXRhKTtcclxuICAgICAgICBzaWduMSBePSAoTlVNX1RZUEUuU0lHTl9NQVNLKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdG1wcmVzID0gTlVNX1RZUEUuYWRkX3BvcyhudW0yLCBudW0xLCBvcGVyRGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRtcHJlcy5fZGF0YVswXSAhPT0gMClcclxuICAgICAgdG1wcmVzLl9kYXRhWzBdIHw9IHNpZ24xO1xyXG5cclxuICAgIHJldHVybiB0bXByZXM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUGVyZm9ybWluZyBhIE11bHRpcGx5IG9wZXJhdGlvbiBvbiB0d28gbWFnaWMgbnVtYmVyc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJudW0xXCI+ICB0aGUgZmlyc3QgbnVtYmVyXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJudW0yXCI+ICB0aGUgZmlyc3QgbnVtYmVyXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgcmVzdWx0XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBzdGF0aWMgbXVsKG51bTE6IE5VTV9UWVBFLCBudW0yOiBOVU1fVFlQRSk6IE5VTV9UWVBFIHtcclxuXHJcbiAgICBsZXQgZnVsbHJlczogSW50OEFycmF5ID0gbmV3IEludDhBcnJheSgzOCk7XHJcbiAgICBsZXQgcHdyOiBudW1iZXI7XHJcbiAgICBsZXQgbGVuMTogbnVtYmVyO1xyXG4gICAgbGV0IGxlbjI6IG51bWJlcjtcclxuICAgIGxldCBwb3MxOiBudW1iZXI7XHJcbiAgICBsZXQgcG9zMjogbnVtYmVyO1xyXG4gICAgbGV0IHBvczogbnVtYmVyO1xyXG4gICAgbGV0IGRpZ2l0MTogbnVtYmVyO1xyXG4gICAgbGV0IHByb2Q6IG51bWJlcjtcclxuICAgIGxldCBjYXJyeTogbnVtYmVyO1xyXG4gICAgbGV0IGw6IG51bWJlcjtcclxuICAgIGxldCBsMTogbnVtYmVyO1xyXG4gICAgbGV0IGwyOiBudW1iZXI7XHJcbiAgICBsZXQgU0lHTklGSUNBTlRfTlVNX1NJWkU6IG51bWJlcjtcclxuXHJcbiAgICAvLyBudWxsIHZhbHVlc1xyXG4gICAgaWYgKG51bTEgPT09IG51bGwgfHwgbnVtMiA9PT0gbnVsbClcclxuICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgU0lHTklGSUNBTlRfTlVNX1NJWkUgPSBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRTaWduaWZpY2FudE51bVNpemUoKTtcclxuXHJcbiAgICBsZXQgcmVzOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRSgpO1xyXG4gICAgbGV0IG9wZXJEYXRhOiBPcGVyRGF0YSA9IG5ldyBPcGVyRGF0YSgpO1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGxldCB0bXBCeXRlOiBudW1iZXI7XHJcblxyXG4gICAgaWYgKG51bTEuTlVNX0lTX0xPTkcoKSkge1xyXG4gICAgICBpZiAobnVtMi5OVU1fSVNfTE9ORygpKSB7XHJcbiAgICAgICAgbCA9IGwxID0gbnVtMS5OVU1fTE9ORygpO1xyXG4gICAgICAgIGlmIChsIDwgMClcclxuICAgICAgICAgIGwgPSAtbDtcclxuICAgICAgICBpZiAobCA8IDB4QjAwMCkge1xyXG4gICAgICAgICAgbCA9IGwyID0gbnVtMi5OVU1fTE9ORygpO1xyXG4gICAgICAgICAgaWYgKGwgPCAwKVxyXG4gICAgICAgICAgICBsID0gLWw7XHJcbiAgICAgICAgICBpZiAobCA8IDB4QjAwMCkge1xyXG4gICAgICAgICAgICBsMSA9IGwxICogbDI7XHJcbiAgICAgICAgICAgIHJlcy5OVU1fNF9MT05HKGwxKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgbnVtMi5udW1fNF9zdGRfbG9uZygpO1xyXG4gICAgICB9XHJcbiAgICAgIG51bTEubnVtXzRfc3RkX2xvbmcoKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKG51bTIuTlVNX0lTX0xPTkcoKSlcclxuICAgICAgICBudW0yLm51bV80X3N0ZF9sb25nKCk7XHJcblxyXG4gICAgb3BlckRhdGEuTlVNX0V4cDFfID0gTlVNX1RZUEUudG9TQnl0ZShudW0xLl9kYXRhWzBdICYgfk5VTV9UWVBFLlNJR05fTUFTSyk7XHJcbiAgICBvcGVyRGF0YS5OVU1fRXhwMl8gPSBOVU1fVFlQRS50b1NCeXRlKG51bTIuX2RhdGFbMF0gJiB+TlVNX1RZUEUuU0lHTl9NQVNLKTtcclxuICAgIGlmIChvcGVyRGF0YS5OVU1fRXhwMV8gPT09IDAgfHwgb3BlckRhdGEuTlVNX0V4cDJfID09PSAwKSB7XHJcbiAgICAgIHJlcy5OVU1fWkVSTygpO1xyXG4gICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGVuMSA9IFNJR05JRklDQU5UX05VTV9TSVpFIC0gMTtcclxuICAgICAgICAgbnVtMS5fZGF0YVtsZW4xXSA9PT0gMDtcclxuICAgICAgICAgbGVuMS0tKSB7XHJcbiAgICB9XHJcbiAgICBmb3IgKGxlbjIgPSBTSUdOSUZJQ0FOVF9OVU1fU0laRSAtIDE7XHJcbiAgICAgICAgIG51bTIuX2RhdGFbbGVuMl0gPT09IDA7XHJcbiAgICAgICAgIGxlbjItLSkge1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAoaSA9IDA7IGkgPCAoTlVNX1RZUEUuTlVNX1NJWkUgLSAxKSAqIDI7IGkrKylcclxuICAgICAgZnVsbHJlc1tpXSA9IDA7XHJcblxyXG4gICAgcG9zID0gMDtcclxuICAgIGZvciAocG9zMSA9IGxlbjE7IHBvczEgPiAwOyBwb3MxLS0pIHtcclxuICAgICAgcG9zID0gcG9zMSArIGxlbjIgLSAxO1xyXG4gICAgICBkaWdpdDEgPSBudW0xLl9kYXRhW3BvczFdO1xyXG4gICAgICBjYXJyeSA9IDA7XHJcblxyXG4gICAgICBmb3IgKHBvczIgPSBsZW4yOyBwb3MyID4gMDsgcG9zMi0tKSB7XHJcbiAgICAgICAgcHJvZCA9IE5VTV9UWVBFLnRvVUJ5dGUoZGlnaXQxKSAqIE5VTV9UWVBFLnRvVUJ5dGUobnVtMi5fZGF0YVtwb3MyXSkgKyBjYXJyeTtcclxuICAgICAgICBjYXJyeSA9IE1hdGguZmxvb3IocHJvZCAvIDEwMCk7XHJcbiAgICAgICAgZnVsbHJlc1twb3NdID0gTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS50b1VCeXRlKGZ1bGxyZXNbcG9zXSkgKyBwcm9kICUgMTAwKTtcclxuICAgICAgICB0bXBCeXRlID0gZnVsbHJlc1twb3NdO1xyXG4gICAgICAgIHBvcy0tO1xyXG4gICAgICAgIGlmIChOVU1fVFlQRS50b1VCeXRlKHRtcEJ5dGUpID49IDEwMCkge1xyXG4gICAgICAgICAgZnVsbHJlc1twb3MgKyAxXSA9IE5VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUudG9VQnl0ZShmdWxscmVzW3BvcyArIDFdKSAtIDEwMCk7XHJcbiAgICAgICAgICBjYXJyeSsrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBmdWxscmVzW3Bvc10gPSBOVU1fVFlQRS50b1NCeXRlKGNhcnJ5KTtcclxuICAgIH1cclxuXHJcbiAgICBwd3IgPSBOVU1fVFlQRS50b1VCeXRlKG9wZXJEYXRhLk5VTV9FeHAxXykgLSBOVU1fVFlQRS5FWFBfQklBUyArIChOVU1fVFlQRS50b1VCeXRlKG9wZXJEYXRhLk5VTV9FeHAyXykgLSBOVU1fVFlQRS5FWFBfQklBUyk7XHJcbiAgICBpZiAoZnVsbHJlc1swXSA9PT0gMCkge1xyXG4gICAgICBwb3MrKztcclxuICAgICAgcHdyLS07XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKChudW0xLl9kYXRhWzBdICYgTlVNX1RZUEUuU0lHTl9NQVNLKSA9PT0gKG51bTIuX2RhdGFbMF0gJiBOVU1fVFlQRS5TSUdOX01BU0spKVxyXG4gICAgICByZXMuX2RhdGFbMF0gPSAwO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXMuX2RhdGFbMF0gPSBOVU1fVFlQRS5TSUdOX01BU0s7XHJcblxyXG4gICAgcmVzLl9kYXRhWzBdIHw9IE5VTV9UWVBFLnRvU0J5dGUocHdyICsgTlVNX1RZUEUuRVhQX0JJQVMpO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IFNJR05JRklDQU5UX05VTV9TSVpFIC0gMTsgaSsrKVxyXG4gICAgICByZXMuX2RhdGFbMSArIGldID0gZnVsbHJlc1twb3MgKyBpXTtcclxuXHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFBlcmZvcm1pbmcgYSBNb2Qgb3BlcmF0aW9uIG9uIHR3byBtYWdpYyBudW1iZXJzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm51bTFcIj4gIHRoZSBmaXJzdCBudW1iZXJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm51bTJcIj4gIHRoZSBmaXJzdCBudW1iZXJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSByZXN1bHRcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBtb2QobnVtMTogTlVNX1RZUEUsIG51bTI6IE5VTV9UWVBFKTogTlVNX1RZUEUge1xyXG4gICAgLy8gbnVsbCB2YWx1ZXNcclxuICAgIGlmIChudW0xID09PSBudWxsIHx8IG51bTIgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgIGxldCByZXM6IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICBpZiAobnVtMi5udW1faXNfemVybygpKSB7XHJcbiAgICAgIHJlcy5OVU1fWkVSTygpO1xyXG4gICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChudW0xLk5VTV9JU19MT05HKCkpXHJcbiAgICAgIG51bTEubnVtXzRfc3RkX2xvbmcoKTtcclxuXHJcbiAgICBpZiAobnVtMi5OVU1fSVNfTE9ORygpKVxyXG4gICAgICBudW0yLm51bV80X3N0ZF9sb25nKCk7XHJcblxyXG4gICAgcmVzID0gTlVNX1RZUEUuZGl2KG51bTEsIG51bTIpO1xyXG4gICAgcmVzLm51bV90cnVuYygwKTtcclxuICAgIHJlcyA9IE5VTV9UWVBFLm11bChyZXMsIG51bTIpO1xyXG4gICAgcmVzID0gTlVNX1RZUEUuc3ViKG51bTEsIHJlcyk7XHJcblxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBQZXJmb3JtaW5nIGEgRGl2aWRlIG9wZXJhdGlvbiBvbiB0d28gbWFnaWMgbnVtYmVyc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJudW0xXCI+ICB0aGUgZmlyc3QgbnVtYmVyXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJudW0yXCI+ICB0aGUgZmlyc3QgbnVtYmVyXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgcmVzdWx0XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBzdGF0aWMgZGl2KG51bTE6IE5VTV9UWVBFLCBudW0yOiBOVU1fVFlQRSk6IE5VTV9UWVBFIHtcclxuICAgIGxldCBkaXZpZGVuZDogSW50OEFycmF5ID0gbmV3IEludDhBcnJheSgoTlVNX1RZUEUuTlVNX1NJWkUgLSAxKSAqIDIpO1xyXG4gICAgbGV0IGRpdmlzb3I6IEludDhBcnJheSA9IG5ldyBJbnQ4QXJyYXkoTlVNX1RZUEUuTlVNX1NJWkUpO1xyXG4gICAgbGV0IHB3cjogbnVtYmVyO1xyXG4gICAgbGV0IGxlbjE6IG51bWJlcjtcclxuICAgIGxldCBsZW4yOiBudW1iZXI7XHJcbiAgICBsZXQgcG9zMTogbnVtYmVyO1xyXG4gICAgbGV0IHBvczI6IG51bWJlcjtcclxuICAgIGxldCBwb3M6IG51bWJlcjtcclxuICAgIGxldCBxdW90OiBudW1iZXI7XHJcbiAgICBsZXQgcHJvZDogbnVtYmVyO1xyXG4gICAgbGV0IGNhcnJ5OiBudW1iZXI7XHJcbiAgICBsZXQgU0lHTklGSUNBTlRfTlVNX1NJWkU6IG51bWJlcjtcclxuXHJcbiAgICAvLyBudWxsIHZhbHVlc1xyXG4gICAgaWYgKG51bTEgPT09IG51bGwgfHwgbnVtMiA9PT0gbnVsbClcclxuICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgU0lHTklGSUNBTlRfTlVNX1NJWkUgPSBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRTaWduaWZpY2FudE51bVNpemUoKTtcclxuXHJcbiAgICBsZXQgcmVzOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRSgpO1xyXG4gICAgbGV0IG9wZXJEYXRhOiBPcGVyRGF0YSA9IG5ldyBPcGVyRGF0YSgpO1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGxldCB0bXBCeXRlOiBudW1iZXI7XHJcblxyXG4gICAgaWYgKG51bTEuTlVNX0lTX0xPTkcoKSlcclxuICAgICAgbnVtMS5udW1fNF9zdGRfbG9uZygpO1xyXG4gICAgaWYgKG51bTIuTlVNX0lTX0xPTkcoKSlcclxuICAgICAgbnVtMi5udW1fNF9zdGRfbG9uZygpO1xyXG5cclxuICAgIG9wZXJEYXRhLk5VTV9FeHAxXyA9IE5VTV9UWVBFLnRvU0J5dGUobnVtMS5fZGF0YVswXSAmIH5OVU1fVFlQRS5TSUdOX01BU0spO1xyXG4gICAgb3BlckRhdGEuTlVNX0V4cDJfID0gTlVNX1RZUEUudG9TQnl0ZShudW0yLl9kYXRhWzBdICYgfk5VTV9UWVBFLlNJR05fTUFTSyk7XHJcbiAgICBpZiAob3BlckRhdGEuTlVNX0V4cDFfID09PSAwIHx8IG9wZXJEYXRhLk5VTV9FeHAyXyA9PT0gMCkge1xyXG4gICAgICByZXMuTlVNX1pFUk8oKTtcclxuICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxlbjEgPSBTSUdOSUZJQ0FOVF9OVU1fU0laRSAtIDE7XHJcbiAgICAgICAgIG51bTEuX2RhdGFbbGVuMV0gPT09IDA7XHJcbiAgICAgICAgIGxlbjEtLSkge1xyXG4gICAgfVxyXG4gICAgZm9yIChsZW4yID0gU0lHTklGSUNBTlRfTlVNX1NJWkUgLSAxO1xyXG4gICAgICAgICBudW0yLl9kYXRhW2xlbjJdID09PSAwO1xyXG4gICAgICAgICBsZW4yLS0pIHtcclxuICAgIH1cclxuXHJcbiAgICBwb3MgPSAoTlVNX1RZUEUubWVtY21wKG51bTEsIDEsIG51bTIsIDEsIGxlbjIpIDwgMCkgPyAwIDogMTtcclxuICAgIGZvciAoaSA9IDA7IGkgPCAoTlVNX1RZUEUuTlVNX1NJWkUgLSAxKSAqIDI7IGkrKylcclxuICAgICAgZGl2aWRlbmRbaV0gPSAwO1xyXG5cclxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW4xOyBpKyspXHJcbiAgICAgIGRpdmlkZW5kW3BvcyArIGldID0gbnVtMS5fZGF0YVsxICsgaV07XHJcblxyXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjI7IGkrKylcclxuICAgICAgZGl2aXNvclsxICsgaV0gPSBudW0yLl9kYXRhWzEgKyBpXTtcclxuXHJcbiAgICByZXMuTlVNX1NFVF9aRVJPKCk7XHJcbiAgICBwd3IgPSBOVU1fVFlQRS50b1VCeXRlKG9wZXJEYXRhLk5VTV9FeHAxXykgLSBOVU1fVFlQRS50b1VCeXRlKG9wZXJEYXRhLk5VTV9FeHAyXykgKyBwb3M7XHJcbiAgICByZXMuX2RhdGFbMF0gPSBOVU1fVFlQRS50b1NCeXRlKHB3ciArIE5VTV9UWVBFLkVYUF9CSUFTKTtcclxuICAgIGlmICgobnVtMS5fZGF0YVswXSAmIE5VTV9UWVBFLlNJR05fTUFTSykgIT09IChudW0yLl9kYXRhWzBdICYgTlVNX1RZUEUuU0lHTl9NQVNLKSlcclxuICAgICAgcmVzLl9kYXRhWzBdIHw9IE5VTV9UWVBFLlNJR05fTUFTSztcclxuXHJcbiAgICAvLyBub3JtYWxpemUgZGl2aWRlbmQgJiBkaXZpc29yXHJcbiAgICBxdW90ID0gTWF0aC5mbG9vcigxMDAgLyAoTlVNX1RZUEUudG9VQnl0ZShkaXZpc29yWzFdKSArIDEpKTtcclxuICAgIGlmIChxdW90ID4gMSkge1xyXG4gICAgICBjYXJyeSA9IDA7XHJcbiAgICAgIGZvciAocG9zMiA9IGxlbjI7IHBvczIgPiAwOyBwb3MyLS0pIHtcclxuICAgICAgICBwcm9kID0gcXVvdCAqIE5VTV9UWVBFLnRvVUJ5dGUoZGl2aXNvcltwb3MyXSkgKyBjYXJyeTtcclxuICAgICAgICBjYXJyeSA9IE1hdGguZmxvb3IocHJvZCAvIDEwMCk7XHJcbiAgICAgICAgZGl2aXNvcltwb3MyXSA9IE5VTV9UWVBFLnRvU0J5dGUocHJvZCAlIDEwMCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNhcnJ5ID0gMDtcclxuICAgICAgZm9yIChwb3MxID0gbGVuMSArIHBvcyAtIDE7IHBvczEgPj0gMDsgcG9zMS0tKSB7XHJcbiAgICAgICAgcHJvZCA9IHF1b3QgKiBOVU1fVFlQRS50b1VCeXRlKGRpdmlkZW5kW3BvczFdKSArIGNhcnJ5O1xyXG4gICAgICAgIGNhcnJ5ID0gTWF0aC5mbG9vcihwcm9kIC8gMTAwKTtcclxuICAgICAgICBkaXZpZGVuZFtwb3MxXSA9IE5VTV9UWVBFLnRvU0J5dGUocHJvZCAlIDEwMCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBkaXZpZGUgZGl2aWRlbmQgYnkgZGl2aXNvclxyXG4gICAgZm9yIChwb3MxID0gMTsgcG9zMSA8IFNJR05JRklDQU5UX05VTV9TSVpFOyBwb3MxKyspIHtcclxuICAgICAgcXVvdCA9IE5VTV9UWVBFLnRvVUJ5dGUoZGl2aWRlbmRbcG9zMSAtIDFdKSAqIDEwMCArIE1hdGguZmxvb3IoTlVNX1RZUEUudG9VQnl0ZShkaXZpZGVuZFtwb3MxXSkgLyBOVU1fVFlQRS50b1VCeXRlKGRpdmlzb3JbMV0pKTtcclxuICAgICAgaWYgKHF1b3QgPj0gMTAwKVxyXG4gICAgICAgIHF1b3QgPSA5OTtcclxuXHJcbiAgICAgIGlmIChxdW90ICE9PSAwKSB7XHJcbiAgICAgICAgLy8gbXVsdGlwbHkgZGl2aXNvciBieSBxdW90aWVudCwgYW5kIHN1YnRyYWN0IGZyb20gZGl2aWRlbmRcclxuICAgICAgICBwb3MgPSBwb3MxICsgbGVuMiAtIDE7XHJcbiAgICAgICAgY2FycnkgPSAwO1xyXG4gICAgICAgIGZvciAocG9zMiA9IGxlbjI7IHBvczIgPiAwOyBwb3MyLS0pIHtcclxuICAgICAgICAgIHByb2QgPSBxdW90ICogTlVNX1RZUEUudG9VQnl0ZShkaXZpc29yW3BvczJdKSArIGNhcnJ5O1xyXG4gICAgICAgICAgY2FycnkgPSBNYXRoLmZsb29yKHByb2QgLyAxMDApO1xyXG4gICAgICAgICAgZGl2aWRlbmRbcG9zXSA9IE5VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUudG9VQnl0ZShkaXZpZGVuZFtwb3NdKSAtIHByb2QgJSAxMDApO1xyXG4gICAgICAgICAgdG1wQnl0ZSA9IGRpdmlkZW5kW3Bvc107XHJcbiAgICAgICAgICBwb3MtLTtcclxuICAgICAgICAgIGlmICh0bXBCeXRlIDwgMCkge1xyXG4gICAgICAgICAgICBkaXZpZGVuZFtwb3MgKyAxXSA9IE5VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUudG9VQnl0ZShkaXZpZGVuZFtwb3MgKyAxXSkgKyAxMDApO1xyXG4gICAgICAgICAgICBjYXJyeSsrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBkaXZpZGVuZFtwb3NdID0gTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS50b1VCeXRlKGRpdmlkZW5kW3Bvc10pIC0gY2FycnkpO1xyXG5cclxuICAgICAgICAvLyBkZWNyZW1lbnQgcXVvdGllbnQsIGFuZCBhZGQgYmFjayBkaXZpc29yIHRvIGRpdmlkZW5kXHJcbiAgICAgICAgd2hpbGUgKGRpdmlkZW5kW3Bvc10gPCAwKSB7XHJcbiAgICAgICAgICBxdW90LS07XHJcbiAgICAgICAgICBwb3MgPSBwb3MxICsgbGVuMiAtIDE7XHJcbiAgICAgICAgICBmb3IgKHBvczIgPSBsZW4yOyBwb3MyID4gMDsgcG9zMi0tKSB7XHJcbiAgICAgICAgICAgIGRpdmlkZW5kW3Bvc10gPSBOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLnRvVUJ5dGUoZGl2aWRlbmRbcG9zXSkgKyBOVU1fVFlQRS50b1VCeXRlKGRpdmlzb3JbcG9zMl0pKTtcclxuICAgICAgICAgICAgdG1wQnl0ZSA9IGRpdmlkZW5kW3Bvc107XHJcbiAgICAgICAgICAgIHBvcy0tO1xyXG4gICAgICAgICAgICBpZiAoTlVNX1RZUEUudG9VQnl0ZSh0bXBCeXRlKSA+PSAxMDApIHtcclxuICAgICAgICAgICAgICBkaXZpZGVuZFtwb3MgKyAxXSA9IE5VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUudG9VQnl0ZShkaXZpZGVuZFtwb3MgKyAxXSkgLSAxMDApO1xyXG4gICAgICAgICAgICAgIGRpdmlkZW5kW3Bvc10gPSBOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLnRvVUJ5dGUoZGl2aWRlbmRbcG9zXSkgKyAxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXMuX2RhdGFbcG9zMV0gPSBOVU1fVFlQRS50b1NCeXRlKHF1b3QpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ29tcGFyZSB0d28gbWFnaWMgbnVtYmVyc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJudW0xXCI+ICBUaGUgZmlyc3QgbnVtYmVyXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJudW0yXCI+ICBUaGUgc2Vjb25kIG51bWJlclxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gMCBpZiBudW0xPW51bTIsIDEgaWYgbnVtMT5udW0yIG9yIC0xIGlmIG51bTE8bnVtMlxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgc3RhdGljIG51bV9jbXAobnVtMTogTlVNX1RZUEUsIG51bTI6IE5VTV9UWVBFKTogbnVtYmVyIHtcclxuICAgIGxldCBzaWduMTogbnVtYmVyO1xyXG4gICAgbGV0IHNpZ24yOiBudW1iZXI7XHJcbiAgICBsZXQgY21wdmFsOiBudW1iZXI7XHJcbiAgICBsZXQgbDE6IG51bWJlcjtcclxuICAgIGxldCBsMjogbnVtYmVyO1xyXG4gICAgbGV0IHRtcDogbnVtYmVyO1xyXG4gICAgbGV0IFNJR05JRklDQU5UX05VTV9TSVpFOiBudW1iZXI7XHJcblxyXG4gICAgaWYgKG51bTEgPT0gbnVsbCB8fCBudW0yID09IG51bGwpXHJcbiAgICAgIHJldHVybiBJbnQzMi5NaW5WYWx1ZTtcclxuXHJcbiAgICBTSUdOSUZJQ0FOVF9OVU1fU0laRSA9IEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldFNpZ25pZmljYW50TnVtU2l6ZSgpO1xyXG5cclxuICAgIGlmIChudW0xLk5VTV9JU19MT05HKCkpIHtcclxuICAgICAgaWYgKG51bTIuTlVNX0lTX0xPTkcoKSkge1xyXG4gICAgICAgIGwxID0gbnVtMS5OVU1fTE9ORygpO1xyXG4gICAgICAgIGwyID0gbnVtMi5OVU1fTE9ORygpO1xyXG4gICAgICAgIGlmIChsMSA+PSAwICYmIGwyID49IDApIHtcclxuICAgICAgICAgIHRtcCA9IGwxIC0gbDI7XHJcbiAgICAgICAgICBpZiAodG1wID09PSAwKVxyXG4gICAgICAgICAgICByZXR1cm4gKDApO1xyXG4gICAgICAgICAgaWYgKHRtcCA+IDApXHJcbiAgICAgICAgICAgIHJldHVybiAoMSk7XHJcbiAgICAgICAgICByZXR1cm4gKC0xKTtcclxuICAgIH1cclxuICAgICAgICAgICAgbnVtMi5udW1fNF9zdGRfbG9uZygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIG51bTEubnVtXzRfc3RkX2xvbmcoKTtcclxuICAgICAgfVxyXG4gICAgZWxzZSBpZiAobnVtMi5OVU1fSVNfTE9ORygpKVxyXG4gICAgICAgICAgbnVtMi5udW1fNF9zdGRfbG9uZygpO1xyXG5cclxuICAgIHNpZ24xID0gTlVNX1RZUEUudG9TQnl0ZShudW0xLl9kYXRhWzBdICYgTlVNX1RZUEUuU0lHTl9NQVNLKTtcclxuICAgIHNpZ24yID0gTlVNX1RZUEUudG9TQnl0ZShudW0yLl9kYXRhWzBdICYgTlVNX1RZUEUuU0lHTl9NQVNLKTtcclxuICAgIGNtcHZhbCA9IChzaWduMSA9PT0gc2lnbjIpXHJcbiAgICAgID8gTlVNX1RZUEUubWVtY21wKG51bTEsIDAsIG51bTIsIDAsIFNJR05JRklDQU5UX05VTV9TSVpFKVxyXG4gICAgICA6IDE7XHJcbiAgICBpZiAoc2lnbjEgIT09IDApXHJcbiAgICAgIGNtcHZhbCA9IC1jbXB2YWw7XHJcbiAgICByZXR1cm4gKGNtcHZhbCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ2hlY2sgaWYgdGhlIGdpdmVuIGhleCBzdHJpbmcgcmVwcmVzZW50cyBhIGxvbmcgbnVtYmVyLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJudW1IZXhTdHJcIj4gIFRoZSBoZXggc3RyaW5nIHRvIGNoZWNrLlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSwgaWYgdGhlIHN0cmluZyByZXByZXNlbnRzIGEgJ2xvbmcnIG51bWJlciBpbiBOVU1fVFlQRS5cclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBudW1IZXhTdHJJc0xvbmcobnVtSGV4U3RyOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBudW1IZXhTdHIuc3Vic3RyKDAsIDIpID09PSBcIkZGXCI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgWmVyb2VzIHRoZSBNYWdpYyBOdW1iZXIgYXMgYSBsb25nIHplcm9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIE5VTV9aRVJPKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXRaZXJvKHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFplcm9lcyB0aGUgTWFnaWMgTnVtYmVyIChhbGwgYnl0ZXMgd2lsbCBzZXQgdG8gMClcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIE5VTV9TRVRfWkVSTygpOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0WmVybyhmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR2V0dGluZyBpbmRpY2F0aW9uIGZvciB0aGUgc2lnbiBvZiB0aGUgTWFnaWMgTnVtYmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaW4gdGhlIG51bWJlciBpcyBuZWdhdGl2ZSwgZmFsc2UgaWYgcG9zaXRpdmVcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIG51bV9pc19uZWcoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5OVU1fSVNfTE9ORygpKVxyXG4gICAgICByZXR1cm4gKCh0aGlzLl9kYXRhWzRdICYgMHg4MCkgIT09IDApO1xyXG4gICAgcmV0dXJuICgodGhpcy5fZGF0YVswXSAmIE5VTV9UWVBFLlNJR05fTUFTSykgIT09IDApO1xyXG4gICAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR2V0dGluZyBpbmRpY2F0aW9uIGlmIHRoZSBNYWdpYyBOdW1iZXIgaXMgWkVSTyAoYWxsIGJ5dGVzIGVxdWFscyB0byAwKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIGluIHRoZSBudW1iZXIgaXMgWkVSTywgZmFsc2UgaWYgcG9zaXRpdmVcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIG51bV9pc196ZXJvKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuTlVNX0lTX0xPTkcoKSlcclxuICAgICAgcmV0dXJuICh0aGlzLk5VTV9MT05HKCkgPT09IDApO1xyXG4gICAgcmV0dXJuICh0aGlzLl9kYXRhWzBdID09PSAwKTtcclxuICAgIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENoYW5naW5nIHNpZ24gb2YgTWFnaWMgTnVtYmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBudW1fbmVnKCk6IHZvaWQge1xyXG4gICAgbGV0IGw6IG51bWJlcjtcclxuXHJcbiAgICBpZiAodGhpcy5OVU1fSVNfTE9ORygpKSB7XHJcbiAgICAgIGwgPSAtdGhpcy5OVU1fTE9ORygpO1xyXG4gICAgICB0aGlzLk5VTV80X0xPTkcobCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9kYXRhWzBdICE9PSAwKVxyXG4gICAgICB0aGlzLl9kYXRhWzBdIF49IE5VTV9UWVBFLlNJR05fTUFTSztcclxuICAgICAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSXMgdGhlIG51bWJlciBrZXB0IGluIGluIHRoZSBOVU1fVFlQRSBpcyBhIGxvbmcgbnVtYmVyP1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIGluIHRoZSBudW1iZXIgaXMgbG9uZywgZmFsc2UgaWYgbm90XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBOVU1fSVNfTE9ORygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhWzBdID09PSBOVU1fVFlQRS5OVU1fTE9OR19UWVBFO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEdldCB0aGUgbG9uZyB2YWx1ZSBmcm9tIHRoZSBOVU1fVFlQRS5cclxuICAvLy8gICBUSElTIEZVTkNUSU9OIE1VU1QgQkUgV1JJVFRFTiBESUZFUkVOVExZIVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgbG9uZyBudW1iZXJcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIE5VTV9MT05HKCk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5fZGF0YVsxXSA9PT0gMCAmJiB0aGlzLl9kYXRhWzJdID09PSAwICYmIHRoaXMuX2RhdGFbM10gPT09IDAgJiYgdGhpcy5fZGF0YVs0XSA9PT0gLTEyOClcclxuICAgICAgcmV0dXJuIEludDMyLk1pblZhbHVlO1xyXG5cclxuICAgIGxldCBkYXRhdmlldyA9IG5ldyBEYXRhVmlldyh0aGlzLl9kYXRhLmJ1ZmZlcik7XHJcbiAgICByZXR1cm4gZGF0YXZpZXcuZ2V0SW50MzIoMSwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUm91bmRzIHRoZSBOVU1fVFlQRSBudW1iZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGVjc1wiPiAgbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciB0byBkZWNpbWFsIHBvaW50IHRvIHJvdW5kIHRvXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcm91bmQoZGVjczogbnVtYmVyKTogdm9pZCB7XHJcblxyXG4gICAgbGV0IGFkZHZhbDogTlVNX1RZUEU7XHJcblxyXG4gICAgaWYgKHRoaXMuTlVNX0lTX0xPTkcoKSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGFkZHZhbCA9IG5ldyBOVU1fVFlQRSgpO1xyXG4gICAgYWRkdmFsLl9kYXRhWzBdID0gTlVNX1RZUEUudG9TQnl0ZSgodGhpcy5fZGF0YVswXSAmIE5VTV9UWVBFLlNJR05fTUFTSykgfCAoTlVNX1RZUEUuRVhQX0JJQVMgLSAoZGVjcyA+PiAxKSkpO1xyXG4gICAgYWRkdmFsLl9kYXRhWzFdID0gTlVNX1RZUEUudG9TQnl0ZSgoZGVjcyAmIDEpICE9PSAwID8gNSA6IDUwKTtcclxuXHJcbiAgICBsZXQgdGVtcDogTlVNX1RZUEUgPSBOVU1fVFlQRS5hZGQodGhpcywgYWRkdmFsKTtcclxuICAgIHRoaXMuX2RhdGEgPSBuZXcgSW50OEFycmF5KHRlbXAuX2RhdGEubGVuZ3RoKTtcclxuXHJcbiAgICB0aGlzLl9kYXRhID0gdGVtcC5fZGF0YTtcclxuICAgICAgdGhpcy5udW1fdHJ1bmMoZGVjcyk7XHJcbiAgICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSZXR1cm5zIGEgbnVtZXJpYyBleHByZXNzaW9uLCByb3VuZGVkIHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIndob2xlXCI+dGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0byB3aGljaCB0aGUgbnVtZXJpYyBleHByZXNzaW9uIGlzIHJvdW5kZWRcclxuICAvLy8gPC9wYXJhbT5cclxuICBkYlJvdW5kKHdob2xlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBhZGR2YWw6IE5VTV9UWVBFO1xyXG4gICAgbGV0IHB3cjogbnVtYmVyO1xyXG4gICAgbGV0IG51bV9kaWZmOiBudW1iZXI7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG5cclxuICAgIGlmICh0aGlzLk5VTV9JU19MT05HKCkpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICAvLyBBZGQgNSAoaW4gdGhlIGNvcnJlc3BvbmRpbmcgdG8gd2hvbGUgcG9zaXRpb24pXHJcbiAgICBhZGR2YWwgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIGFkZHZhbC5fZGF0YVswXSA9IE5VTV9UWVBFLnRvU0J5dGUoKHRoaXMuX2RhdGFbMF0gJiBOVU1fVFlQRS5TSUdOX01BU0spIHwgKE5VTV9UWVBFLkVYUF9CSUFTICsgKCh3aG9sZSArIDEpID4+IDEpKSk7XHJcbiAgICBhZGR2YWwuX2RhdGFbMV0gPSBOVU1fVFlQRS50b1NCeXRlKCgod2hvbGUgJiAxKSAhPT0gMCkgPyA1IDogNTApO1xyXG5cclxuICAgIGxldCB0ZW1wOiBOVU1fVFlQRSA9IE5VTV9UWVBFLmFkZCh0aGlzLCBhZGR2YWwpO1xyXG4gICAgdGhpcy5fZGF0YSA9IG5ldyBJbnQ4QXJyYXkodGVtcC5fZGF0YS5sZW5ndGgpO1xyXG5cclxuICAgICAgZm9yIChsZXQgX2FpOiBudW1iZXIgPSAwOyBfYWkgPCB0aGlzLl9kYXRhLmxlbmd0aDsgKytfYWkpXHJcbiAgICAgIHRoaXMuX2RhdGFbX2FpXSA9IHRlbXAuX2RhdGFbX2FpXTtcclxuXHJcbiAgICAvLyBQdXQgMCBpbiB0aGUgZW5kIG9mIHRoZSBudW1iZXJcclxuICAgIHB3ciA9ICh0aGlzLl9kYXRhWzBdICYgfk5VTV9UWVBFLlNJR05fTUFTSykgLSBOVU1fVFlQRS5FWFBfQklBUztcclxuXHJcbiAgICBpZiAoKG51bV9kaWZmID0gcHdyIC0gKCh3aG9sZSArIDEpID4+IDEpKSA+PSAwKSB7XHJcbiAgICAgIGlmICgod2hvbGUgJiAxKSAhPT0gMCkge1xyXG4gICAgICAgIHRoaXMuX2RhdGFbMSArIG51bV9kaWZmXSA9IE5VTV9UWVBFLnRvU0J5dGUodGhpcy5fZGF0YVsxICsgbnVtX2RpZmZdIC0gdGhpcy5fZGF0YVsxICsgbnVtX2RpZmZdICUgMTApO1xyXG4gICAgICAgIG51bV9kaWZmKys7XHJcbiAgICAgICAgfVxyXG4gICAgICBmb3IgKGkgPSAwO1xyXG4gICAgICAgICAgIGkgPCB0aGlzLlNJR05JRklDQU5UX05VTV9TSVpFIC0gKDEgKyBudW1fZGlmZik7XHJcbiAgICAgICAgICAgaSsrKVxyXG4gICAgICAgIHRoaXMuX2RhdGFbMSArIG51bV9kaWZmICsgaV0gPSAwO1xyXG4gICAgICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgICB0aGlzLk5VTV9TRVRfWkVSTygpO1xyXG4gICAgICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUcnVuY2F0ZXMgdGhlIE5VTV9UWVBFIG51bWJlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkZWNzXCI+ICBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIHRvIGRlY2ltYWwgcG9pbnQgdG8gaGF2ZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIG51bV90cnVuYyhkZWNzOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBwd3I6IG51bWJlcjtcclxuICAgIGxldCBudW1fZGlmZjogbnVtYmVyO1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuXHJcbiAgICBpZiAodGhpcy5OVU1fSVNfTE9ORygpKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgcHdyID0gKHRoaXMuX2RhdGFbMF0gJiB+TlVNX1RZUEUuU0lHTl9NQVNLKSAtIE5VTV9UWVBFLkVYUF9CSUFTO1xyXG4gICAgaWYgKChudW1fZGlmZiA9IHRoaXMuU0lHTklGSUNBTlRfTlVNX1NJWkUgLSAxIC0gcHdyIC0gKChkZWNzICsgMSkgPj4gMSkpIDwgMClcclxuICAgICAgcmV0dXJuO1xyXG4gICAgaWYgKChudW1fZGlmZiA8IHRoaXMuU0lHTklGSUNBTlRfTlVNX1NJWkUgLSAxKSAmJiAoKGRlY3MgJiAxKSAhPT0gMCkpIHtcclxuICAgICAgdGhpcy5fZGF0YVt0aGlzLlNJR05JRklDQU5UX05VTV9TSVpFIC0gMSAtIG51bV9kaWZmXSA9XHJcbiAgICAgICAgTlVNX1RZUEUudG9TQnl0ZSh0aGlzLl9kYXRhW3RoaXMuU0lHTklGSUNBTlRfTlVNX1NJWkUgLSAxIC0gbnVtX2RpZmZdIC0gdGhpcy5fZGF0YVt0aGlzLlNJR05JRklDQU5UX05VTV9TSVpFIC0gMSAtIG51bV9kaWZmXSAlIDEwKTtcclxuICAgICAgaWYgKHRoaXMuX2RhdGFbdGhpcy5TSUdOSUZJQ0FOVF9OVU1fU0laRSAtIDEgLSBudW1fZGlmZl0gPT09IDApXHJcbiAgICAgICAgbnVtX2RpZmYrKztcclxuICAgICAgICAgIH1cclxuICAgIGlmIChudW1fZGlmZiA+PSB0aGlzLlNJR05JRklDQU5UX05VTV9TSVpFIC0gMSkge1xyXG4gICAgICAgICAgdGhpcy5OVU1fWkVSTygpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgZm9yIChpID0gMDtcclxuICAgICAgICAgaSA8IG51bV9kaWZmO1xyXG4gICAgICAgICBpKyspXHJcbiAgICAgIHRoaXMuX2RhdGFbdGhpcy5TSUdOSUZJQ0FOVF9OVU1fU0laRSAtIG51bV9kaWZmICsgaV0gPSAwO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ29udmVydHMgYSBNYWdpYyBudW1iZXIgZnJvbSBzdGQgbG9uZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJudW1cIj4gIFRoZSBudW1iZXIgdG8gYmUgdHJhbnNsYXRlZFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIG51bV80X3N0ZF9sb25nKCk6IHZvaWQge1xyXG4gICAgbGV0IHNsb25nOiBudW1iZXI7XHJcblxyXG4gICAgc2xvbmcgPSB0aGlzLk5VTV9MT05HKCk7XHJcbiAgICBpZiAoc2xvbmcgPj0gMClcclxuICAgICAgdGhpcy5udW1fNF91bG9uZyhzbG9uZyk7XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5udW1fNF91bG9uZygtc2xvbmcpO1xyXG4gICAgICB0aGlzLl9kYXRhWzBdIHw9IE5VTV9UWVBFLlNJR05fTUFTSztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDb252ZXJ0cyBhIE1hZ2ljIG51bWJlciBmcm9tIHVsb25nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm51bVwiPiAgVGhlIG51bWJlciB0byBiZSB0cmFuc2xhdGVkXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgbnVtXzRfdWxvbmcoZGF0YTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgcHdyOiBudW1iZXI7XHJcbiAgICBsZXQgcG9zOiBudW1iZXI7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG5cclxuICAgIHRoaXMuTlVNX1NFVF9aRVJPKCk7XHJcbiAgICBwb3MgPSBwd3IgPSA1O1xyXG4gICAgd2hpbGUgKGRhdGEgPiAwKSB7XHJcbiAgICAgIHRoaXMuX2RhdGFbcG9zLS1dID0gTlVNX1RZUEUudG9TQnl0ZShkYXRhICUgMTAwKTtcclxuICAgICAgZGF0YSA9IE1hdGguZmxvb3IoZGF0YSAvIDEwMCk7XHJcbiAgICB9XHJcbiAgICBpZiAocG9zIDwgcHdyKSB7XHJcbiAgICAgIGlmIChwb3MgPiAwKSB7XHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHB3ciAtIHBvczsgaSsrKVxyXG4gICAgICAgICAgdGhpcy5fZGF0YVsxICsgaV0gPSB0aGlzLl9kYXRhWzEgKyBwb3MgKyBpXTtcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcG9zOyBpKyspXHJcbiAgICAgICAgICB0aGlzLl9kYXRhW3B3ciAtIHBvcyArIDEgKyBpXSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICB0aGlzLl9kYXRhWzBdID0gTlVNX1RZUEUudG9TQnl0ZShwd3IgLSBwb3MgKyBOVU1fVFlQRS5FWFBfQklBUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXQgdGhlIGxvbmcgdmFsdWUgZnJvbSBhIE1hZ2ljIE51bWJlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgbG9uZyB2YWx1ZSBvZiB0aGUgbnVtYmVyXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBOVU1fMl9MT05HKCk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5OVU1fSVNfTE9ORygpKVxyXG4gICAgICByZXR1cm4gdGhpcy5OVU1fTE9ORygpO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gdGhpcy5udW1fMl9sb25nKCk7XHJcbiAgICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXQgdGhlIFVsb25nIHZhbHVlIGZyb20gYSBNYWdpYyBOdW1iZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGxvbmcgdmFsdWUgb2YgdGhlIG51bWJlclxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgTlVNXzJfVUxPTkcoKTogbnVtYmVyIHtcclxuICAgIGlmICh0aGlzLk5VTV9JU19MT05HKCkpXHJcbiAgICAgIHJldHVybiB0aGlzLk5VTV9MT05HKCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiB0aGlzLm51bV8yX3Vsb25nKCk7XHJcbiAgICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXQgdGhlIGxvbmcgdmFsdWUgZnJvbSBhIG5vbiBsb25nIE1hZ2ljIE51bWJlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgbG9uZyB2YWx1ZSBvZiB0aGUgbnVtYmVyXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBudW1fMl9sb25nKCk6IG51bWJlciB7XHJcbiAgICBsZXQgc2xvbmc6IG51bWJlcjtcclxuICAgIGxldCBzaWduOiBudW1iZXI7XHJcblxyXG4gICAgc2lnbiA9IHRoaXMuX2RhdGFbMF0gJiBOVU1fVFlQRS5TSUdOX01BU0s7XHJcbiAgICB0aGlzLl9kYXRhWzBdICY9IE5VTV9UWVBFLnRvU0J5dGUofk5VTV9UWVBFLlNJR05fTUFTSyk7XHJcbiAgICBpZiAoc2lnbiAhPT0gMCkge1xyXG4gICAgICBpZiAoTlVNX1RZUEUubWVtY21wKHRoaXMsIDAsIE5VTV9UWVBFLk1pbkxPTkcoKSwgMCwgdGhpcy5TSUdOSUZJQ0FOVF9OVU1fU0laRSkgPiAwKVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKE5VTV9UWVBFLm1lbWNtcCh0aGlzLCAwLCBOVU1fVFlQRS5NYXhMT05HKCksIDAsIHRoaXMuU0lHTklGSUNBTlRfTlVNX1NJWkUpID4gMClcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgICAgfVxyXG4gICAgc2xvbmcgPSB0aGlzLm51bV8yX3Vsb25nKCk7XHJcbiAgICBpZiAoc2lnbiAhPT0gMCkge1xyXG4gICAgICBzbG9uZyA9IC1zbG9uZztcclxuICAgICAgdGhpcy5fZGF0YVswXSB8PSBOVU1fVFlQRS50b1NCeXRlKHNpZ24pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIChzbG9uZyk7XHJcbiAgICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXQgdGhlIHVsb25nIHZhbHVlIGZyb20gYSBub24gbG9uZyBNYWdpYyBOdW1iZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHVsb25nIHZhbHVlIG9mIHRoZSBudW1iZXJcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIG51bV8yX3Vsb25nKCk6IG51bWJlciB7XHJcbiAgICBsZXQgdmFsOiBudW1iZXI7XHJcbiAgICBsZXQgcHdyOiBudW1iZXI7XHJcbiAgICBsZXQgcG9zOiBudW1iZXI7XHJcbiAgICBsZXQgbGFzdDogYm9vbGVhbjtcclxuXHJcbiAgICBwd3IgPSB0aGlzLl9kYXRhWzBdIC0gTlVNX1RZUEUuRVhQX0JJQVM7XHJcbiAgICBpZiAocHdyID4gNSlcclxuICAgICAgcmV0dXJuICgwKTtcclxuICAgIGxhc3QgPSAocHdyID09PSA1KTtcclxuICAgIGlmIChsYXN0KVxyXG4gICAgICBwd3IgPSA0O1xyXG5cclxuICAgIHZhbCA9IDA7XHJcbiAgICBmb3IgKHBvcyA9IDE7IHBvcyA8PSBwd3I7IHBvcysrKVxyXG4gICAgICB2YWwgPSB2YWwgKiAxMDAgKyBOVU1fVFlQRS50b1VCeXRlKHRoaXMuX2RhdGFbcG9zXSk7XHJcblxyXG4gICAgaWYgKGxhc3QpXHJcbiAgICAgIGlmICh2YWwgPD0gTWF0aC5mbG9vcigoMHhGRkZGRkZGRiAtIE5VTV9UWVBFLnRvVUJ5dGUodGhpcy5fZGF0YVs1XSkpIC8gMTAwKSlcclxuICAgICAgICB2YWwgPSB2YWwgKiAxMDAgKyBOVU1fVFlQRS50b1VCeXRlKHRoaXMuX2RhdGFbNV0pO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdmFsID0gMDtcclxuICAgIHJldHVybiAodmFsKTtcclxuICAgIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFBlcmZvcm0gdGhlIGFjdHVhbGwgYWRkIG9wZXJhdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJudW0xXCI+ICAgICAgVGhlIGZpcnN0IG51bWJlclxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibnVtMlwiPiAgICAgIFRoZSBzZWNvbmQgbnVtYmVyXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvcGVyRGF0YVwiPiAgSW5mb3JtYXRpb24gZm9yIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvblxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gVGhlIHR3byBudW1iZXJzIGFkZGVkXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBzdGF0aWMgYWRkX3BvcyhudW0xOiBOVU1fVFlQRSwgbnVtMjogTlVNX1RZUEUsIG9wZXJEYXRhOiBPcGVyRGF0YSk6IE5VTV9UWVBFIHtcclxuICAgIGxldCBsZW4xOiBudW1iZXI7XHJcbiAgICBsZXQgbGVuMjogbnVtYmVyO1xyXG4gICAgbGV0IGxlbjogbnVtYmVyO1xyXG4gICAgbGV0IHBvczogbnVtYmVyO1xyXG4gICAgbGV0IG51bTFwdHI6IG51bWJlcjtcclxuICAgIGxldCByZXNwdHI6IG51bWJlcjtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgU0lHTklGSUNBTlRfTlVNX1NJWkU6IG51bWJlcjtcclxuXHJcbiAgICAvLyBudWxsIHZhbHVlc1xyXG4gICAgaWYgKG51bTEgPT0gbnVsbCB8fCBudW0yID09IG51bGwpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgU0lHTklGSUNBTlRfTlVNX1NJWkUgPSBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRTaWduaWZpY2FudE51bVNpemUoKTtcclxuXHJcbiAgICBsZXQgcmVzOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRSgpO1xyXG5cclxuICAgIGlmIChvcGVyRGF0YS5OVU1fRXhwMl8gPT09IDAgfHwgKG9wZXJEYXRhLk5VTV9EaWZmXyA+PSBTSUdOSUZJQ0FOVF9OVU1fU0laRSAtIDEpKSB7XHJcbiAgICAgIHJlcyA9IG5ldyBOVU1fVFlQRShudW0xKTtcclxuICAgICAgcmVzLl9kYXRhWzBdID0gb3BlckRhdGEuTlVNX0V4cDFfO1xyXG4gICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG5cclxuICAgIGxlbjEgPSAxO1xyXG4gICAgZm9yIChpID0gU0lHTklGSUNBTlRfTlVNX1NJWkUgLSAyOyBpID4gMDsgaSAtPSAyKSB7XHJcbiAgICAgIGlmIChudW0xLlNIUlRfSVNfWkVSTyhpKSlcclxuICAgICAgICBjb250aW51ZTtcclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGxlbjEgPSBpICsgMTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIGlmIChudW0xLl9kYXRhW2xlbjFdID09PSAwKVxyXG4gICAgICBsZW4xLS07XHJcblxyXG4gICAgbGVuMiA9IDE7XHJcbiAgICBmb3IgKGkgPSBTSUdOSUZJQ0FOVF9OVU1fU0laRSAtIDI7IGkgPiAwOyBpIC09IDIpIHtcclxuICAgICAgaWYgKG51bTIuU0hSVF9JU19aRVJPKGkpKVxyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBsZW4yID0gaSArIDE7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICBpZiAobnVtMi5fZGF0YVtsZW4yXSA9PT0gMClcclxuICAgICAgbGVuMi0tO1xyXG5cclxuICAgIGlmICgobGVuID0gTWF0aC5tYXgobGVuMSwgbGVuMiArIG9wZXJEYXRhLk5VTV9EaWZmXykpID4gU0lHTklGSUNBTlRfTlVNX1NJWkUgLSAxKVxyXG4gICAgICBsZW4gPSBTSUdOSUZJQ0FOVF9OVU1fU0laRSAtIDE7XHJcblxyXG4gICAgcmVzLk5VTV9TRVRfWkVSTygpO1xyXG4gICAgbnVtMXB0ciA9IG9wZXJEYXRhLk5VTV9EaWZmXztcclxuICAgIHJlc3B0ciA9IG9wZXJEYXRhLk5VTV9EaWZmXztcclxuICAgIGZvciAocG9zID0gbGVuIC0gb3BlckRhdGEuTlVNX0RpZmZfOyBwb3MgPiAwOyBwb3MtLSkge1xyXG4gICAgICByZXMuX2RhdGFbcmVzcHRyICsgcG9zXSA9XHJcbiAgICAgICAgTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS50b1VCeXRlKHJlcy5fZGF0YVtyZXNwdHIgKyBwb3NdKSArIE5VTV9UWVBFLnRvVUJ5dGUobnVtMS5fZGF0YVtudW0xcHRyICsgcG9zXSkgKyBOVU1fVFlQRS50b1VCeXRlKG51bTIuX2RhdGFbcG9zXSkpO1xyXG4gICAgICBpZiAoTlVNX1RZUEUudG9VQnl0ZShyZXMuX2RhdGFbcmVzcHRyICsgcG9zXSkgPj0gMTAwKSB7XHJcbiAgICAgICAgcmVzLl9kYXRhW3Jlc3B0ciArIHBvc10gPSBOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLnRvVUJ5dGUocmVzLl9kYXRhW3Jlc3B0ciArIHBvc10pIC0gMTAwKTtcclxuICAgICAgICByZXMuX2RhdGFbcmVzcHRyICsgcG9zIC0gMV0gPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICBmb3IgKHBvcyA9IG9wZXJEYXRhLk5VTV9EaWZmXzsgcG9zID4gMDsgcG9zLS0pIHtcclxuICAgICAgcmVzLl9kYXRhW3Bvc10gPSBOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLnRvVUJ5dGUocmVzLl9kYXRhW3Bvc10pICsgTlVNX1RZUEUudG9VQnl0ZShudW0xLl9kYXRhW3Bvc10pKTtcclxuICAgICAgaWYgKE5VTV9UWVBFLnRvVUJ5dGUocmVzLl9kYXRhW3Bvc10pID49IDEwMCkge1xyXG4gICAgICAgIHJlcy5fZGF0YVtwb3NdID0gTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS50b1VCeXRlKHJlcy5fZGF0YVtwb3NdKSAtIDEwMCk7XHJcbiAgICAgICAgcmVzLl9kYXRhW3BvcyAtIDFdID0gMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICBpZiAocmVzLl9kYXRhWzBdICE9PSAwKSB7XHJcbiAgICAgIGZvciAocG9zID0gTWF0aC5taW4obGVuLCBTSUdOSUZJQ0FOVF9OVU1fU0laRSAtIDIpOyBwb3MgPj0gMDsgcG9zLS0pXHJcbiAgICAgICAgcmVzLl9kYXRhW3BvcyArIDFdID0gcmVzLl9kYXRhW3Bvc107XHJcbiAgICAgIG9wZXJEYXRhLk5VTV9FeHAxXysrO1xyXG4gICAgICAgICAgfVxyXG4gICAgcmVzLl9kYXRhWzBdID0gb3BlckRhdGEuTlVNX0V4cDFfO1xyXG5cclxuICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUGVyZm9ybSB0aGUgYWN0dWFsbCBzdWIgb3BlcmF0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm51bTFcIj4gICAgICBUaGUgZmlyc3QgbnVtYmVyXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJudW0yXCI+ICAgICAgVGhlIHNlY29uZCBudW1iZXJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9wZXJEYXRhXCI+ICBJbmZvcm1hdGlvbiBmb3IgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBUaGUgcmVzdWx0IG9mIHRoZSBzdWJ0cmFjdGlvbiBvcGVyYXRpb25cclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBzdWJfcG9zKG51bTE6IE5VTV9UWVBFLCBudW0yOiBOVU1fVFlQRSwgb3BlckRhdGE6IE9wZXJEYXRhKTogTlVNX1RZUEUge1xyXG4gICAgbGV0IGxlbjE6IG51bWJlcjtcclxuICAgIGxldCBsZW4yOiBudW1iZXI7XHJcbiAgICBsZXQgbGVuOiBudW1iZXI7XHJcbiAgICBsZXQgcG9zOiBudW1iZXI7XHJcbiAgICBsZXQgbnVtMXB0cjogbnVtYmVyO1xyXG4gICAgbGV0IHJlc3B0cjogbnVtYmVyO1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGxldCBTSUdOSUZJQ0FOVF9OVU1fU0laRTogbnVtYmVyO1xyXG5cclxuICAgIC8vIG51bGwgdmFsdWVzXHJcbiAgICBpZiAobnVtMSA9PSBudWxsIHx8IG51bTIgPT0gbnVsbClcclxuICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgU0lHTklGSUNBTlRfTlVNX1NJWkUgPSBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRTaWduaWZpY2FudE51bVNpemUoKTtcclxuXHJcbiAgICBsZXQgcmVzOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRSgpO1xyXG4gICAgbGV0IGo6IG51bWJlcjtcclxuXHJcbiAgICBpZiAob3BlckRhdGEuTlVNX0V4cDJfID09PSAwIHx8IChvcGVyRGF0YS5OVU1fRGlmZl8gPj0gU0lHTklGSUNBTlRfTlVNX1NJWkUgLSAxKSkge1xyXG4gICAgICByZXMgPSBuZXcgTlVNX1RZUEUobnVtMSk7XHJcbiAgICAgIHJlcy5fZGF0YVswXSA9IG9wZXJEYXRhLk5VTV9FeHAxXztcclxuICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuXHJcbiAgICBsZW4xID0gMTtcclxuICAgIGZvciAoaSA9IFNJR05JRklDQU5UX05VTV9TSVpFIC0gMjsgaSA+IDA7IGkgLT0gMikge1xyXG4gICAgICBpZiAobnVtMS5TSFJUX0lTX1pFUk8oaSkpXHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBsZW4xID0gaSArIDE7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICBpZiAobnVtMS5fZGF0YVtsZW4xXSA9PT0gMClcclxuICAgICAgbGVuMS0tO1xyXG5cclxuICAgIGxlbjIgPSAxO1xyXG4gICAgZm9yIChpID0gU0lHTklGSUNBTlRfTlVNX1NJWkUgLSAyOyBpID4gMDsgaSAtPSAyKSB7XHJcbiAgICAgIGlmIChudW0yLlNIUlRfSVNfWkVSTyhpKSlcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgbGVuMiA9IGkgKyAxO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgaWYgKG51bTIuX2RhdGFbbGVuMl0gPT09IDApXHJcbiAgICAgIGxlbjItLTtcclxuXHJcbiAgICBpZiAoKGxlbiA9IE1hdGgubWF4KGxlbjEsIGxlbjIgKyBvcGVyRGF0YS5OVU1fRGlmZl8pKSA+IFNJR05JRklDQU5UX05VTV9TSVpFIC0gMSlcclxuICAgICAgbGVuID0gU0lHTklGSUNBTlRfTlVNX1NJWkUgLSAxO1xyXG5cclxuICAgIHJlcy5OVU1fU0VUX1pFUk8oKTtcclxuICAgIG51bTFwdHIgPSBvcGVyRGF0YS5OVU1fRGlmZl87XHJcbiAgICByZXNwdHIgPSBvcGVyRGF0YS5OVU1fRGlmZl87XHJcbiAgICBmb3IgKHBvcyA9IGxlbiAtIG9wZXJEYXRhLk5VTV9EaWZmXzsgcG9zID4gMDsgcG9zLS0pIHtcclxuXHJcbiAgICAgIHJlcy5fZGF0YVtyZXNwdHIgKyBwb3NdID0gTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS50b1VCeXRlKHJlcy5fZGF0YVtyZXNwdHIgKyBwb3NdKSArIE5VTV9UWVBFLnRvVUJ5dGUobnVtMS5fZGF0YVtudW0xcHRyICsgcG9zXSkgLSBOVU1fVFlQRS50b1VCeXRlKG51bTIuX2RhdGFbcG9zXSkpO1xyXG4gICAgICBpZiAocmVzLl9kYXRhW3Jlc3B0ciArIHBvc10gPCAwKSB7XHJcbiAgICAgICAgcmVzLl9kYXRhW3Jlc3B0ciArIHBvc10gPSBOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLnRvVUJ5dGUocmVzLl9kYXRhW3Jlc3B0ciArIHBvc10pICsgMTAwKTtcclxuICAgICAgICByZXMuX2RhdGFbcmVzcHRyICsgcG9zIC0gMV0gPSBOVU1fVFlQRS50b1NCeXRlKDB4RkYpOyAvLyAyNTVcclxuICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgIGZvciAocG9zID0gb3BlckRhdGEuTlVNX0RpZmZfOyBwb3MgPiAwOyBwb3MtLSkge1xyXG4gICAgICByZXMuX2RhdGFbcG9zXSA9IE5VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUudG9VQnl0ZShyZXMuX2RhdGFbcG9zXSkgKyBOVU1fVFlQRS50b1VCeXRlKG51bTEuX2RhdGFbcG9zXSkpO1xyXG4gICAgICBpZiAocmVzLl9kYXRhW3Bvc10gPCAwKSB7XHJcbiAgICAgICAgcmVzLl9kYXRhW3Bvc10gPSBOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLnRvVUJ5dGUocmVzLl9kYXRhW3Bvc10pICsgMTAwKTtcclxuICAgICAgICByZXMuX2RhdGFbcG9zIC0gMV0gPSBOVU1fVFlQRS50b1NCeXRlKDB4RkYpOyAvLyAyNTVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgd2hpbGUgKCgrK3BvcyA8PSBsZW4pICYmIHJlcy5fZGF0YVtwb3NdID09PSAwKSB7XHJcbiAgICAgICAgfVxyXG4gICAgaWYgKHBvcyA8PSBsZW4pIHtcclxuICAgICAgb3BlckRhdGEuTlVNX0RpZmZfID0gcG9zIC0gMTtcclxuICAgICAgaWYgKG9wZXJEYXRhLk5VTV9EaWZmXyA+IDApIHtcclxuICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGVuIC0gb3BlckRhdGEuTlVNX0RpZmZfOyBqKyspXHJcbiAgICAgICAgICByZXMuX2RhdGFbMSArIGpdID0gcmVzLl9kYXRhW3BvcyArIGpdO1xyXG4gICAgICAgIGZvciAoaiA9IDA7IGogPCBvcGVyRGF0YS5OVU1fRGlmZl87IGorKylcclxuICAgICAgICAgIHJlcy5fZGF0YVtsZW4gLSBvcGVyRGF0YS5OVU1fRGlmZl8gKyAxICsgal0gPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIHJlcy5fZGF0YVswXSA9IE5VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUudG9VQnl0ZShvcGVyRGF0YS5OVU1fRXhwMV8pIC0gb3BlckRhdGEuTlVNX0RpZmZfKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFBlcmZvcm0gdGhlIGFjdHVhbCAgRklYIG9wZXJhdGlvbiB3aXRoIHdob2xlIHBhcnQgb2YgdGhlIG51bWJlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ3aG9sZXNcIj5udW1iZXIgb2YgbmVlZGVkIHdob2xlIGRpZ2l0c1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIG51bV9maXgod2hvbGVzOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBwd3I6IG51bWJlcjtcclxuICAgIGxldCBudW1fZGlmZjogbnVtYmVyO1xyXG5cclxuICAgIGlmICh0aGlzLk5VTV9JU19MT05HKCkpXHJcbiAgICAgIHRoaXMubnVtXzRfc3RkX2xvbmcoKTtcclxuICAgIHB3ciA9ICh0aGlzLl9kYXRhWzBdICYgfk5VTV9UWVBFLlNJR05fTUFTSykgLSBOVU1fVFlQRS5FWFBfQklBUztcclxuXHJcbiAgICBpZiAoKG51bV9kaWZmID0gcHdyIC0gKCh3aG9sZXMgKyAxKSA+PiAxKSkgPCAwKVxyXG4gICAgICByZXR1cm47XHJcbiAgICBpZiAobnVtX2RpZmYgPCB0aGlzLlNJR05JRklDQU5UX05VTV9TSVpFIC0gMSkge1xyXG4gICAgICBpZiAoKHdob2xlcyAmIDEpID09PSAxKVxyXG4gICAgICAgIHRoaXMuX2RhdGFbMSArIG51bV9kaWZmXSA9IE5VTV9UWVBFLnRvU0J5dGUodGhpcy5fZGF0YVsxICsgbnVtX2RpZmZdICUgMTApO1xyXG4gICAgICB3aGlsZSAoKG51bV9kaWZmIDwgdGhpcy5TSUdOSUZJQ0FOVF9OVU1fU0laRSAtIDEpICYmIHRoaXMuX2RhdGFbMSArIG51bV9kaWZmXSA9PT0gMClcclxuICAgICAgICBudW1fZGlmZisrO1xyXG4gICAgICB9XHJcbiAgICBpZiAobnVtX2RpZmYgPj0gdGhpcy5TSUdOSUZJQ0FOVF9OVU1fU0laRSAtIDEpIHtcclxuICAgICAgICB0aGlzLk5VTV9aRVJPKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgaWYgKG51bV9kaWZmID4gMCkge1xyXG4gICAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5TSUdOSUZJQ0FOVF9OVU1fU0laRSAtIDEgLSBudW1fZGlmZjsgaSsrKVxyXG4gICAgICAgIHRoaXMuX2RhdGFbMSArIGldID0gdGhpcy5fZGF0YVsxICsgbnVtX2RpZmYgKyBpXTtcclxuXHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fZGlmZjsgaSsrKVxyXG4gICAgICAgIHRoaXMuX2RhdGFbdGhpcy5TSUdOSUZJQ0FOVF9OVU1fU0laRSAtIG51bV9kaWZmICsgaV0gPSAwO1xyXG4gICAgICB0aGlzLl9kYXRhWzBdID0gTlVNX1RZUEUudG9TQnl0ZSh0aGlzLl9kYXRhWzBdIC0gTlVNX1RZUEUudG9TQnl0ZShudW1fZGlmZikpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlmIGJ5dGUgb24gc3BlY2lmaWMgcG9zaXRpb24gaXMgemVybyBvciAweEZGXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBvc2l0aW9uXCI+aW4gTlVNIHRvIGJlIGNoZWNrZWRcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGlzIHRoZSBieXRlIHplcm9cclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIFNIUlRfSVNfWkVSTyhwb3M6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RhdGFbcG9zXSA9PT0gMCAmJiB0aGlzLl9kYXRhW3BvcyArIDFdID09PSAwO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFplcm8gYSBNYWdpYyBOdW1iZXIuIElmIHRoZSBudW1iZXIgc2hvdWxkIGNvbnRhaW4gYSBsb25nIHplcm8sIHRoZSBmaXJzdFxyXG4gIC8vLyAgIGJ5dGUgaXMgc2V0IHRvIE5VTV9MT05HX1RZUEUuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImFzTG9uZ1wiPiAgc2V0IHRoZSBNYWdpYyBOdW1iZXIgdG8gY29udGFpbiBhIGxvbmcgemVybyB2YWx1ZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHByaXZhdGUgc2V0WmVybyhhc0xvbmc6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcblxyXG4gICAgZm9yIChpID0gMDsgaSA8IE5VTV9UWVBFLk5VTV9TSVpFOyBpKyspXHJcbiAgICAgIHRoaXMuX2RhdGFbaV0gPSAwO1xyXG5cclxuICAgIGlmIChhc0xvbmcpXHJcbiAgICAgIHRoaXMuX2RhdGFbMF0gPSBOVU1fVFlQRS5OVU1fTE9OR19UWVBFO1xyXG4gICAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ29tcGFyZSB0d28gTWFnaWMgTnVtYmVyc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJudW0xXCI+ICBUaGUgZmlyc3QgbnVtYmVyXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwb3MxXCI+ICBUaGUgcG9zaXRpb24gb2YgbnVtMSB0byBjb21wYXJlIGZyb21cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm51bTJcIj4gIFRoZSBzZWNvbmQgbnVtYmVyXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwb3MzXCI+ICBUaGUgcG9zaXRpb24gb2YgbnVtMiB0byBjb21wYXJlIGZyb21cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IDAgaWYgaWRlbnRpY2FsLCAxIGlmIG51bTE+bnVtMiwgLTEgaWYgbnVtMTxudW0yXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIHN0YXRpYyBtZW1jbXAobnVtMTogTlVNX1RZUEUsIHBvczE6IG51bWJlciwgbnVtMjogTlVNX1RZUEUsIHBvczI6IG51bWJlciwgbGVuOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IGk6IG51bWJlciA9IDA7XHJcblxyXG4gICAgd2hpbGUgKGkgPCBsZW4gJiYgbnVtMS5fZGF0YVtwb3MxXSA9PT0gbnVtMi5fZGF0YVtwb3MyXSAmJiBwb3MxIDwgTlVNX1RZUEUuTlVNX1NJWkUgJiYgcG9zMiA8IE5VTV9UWVBFLk5VTV9TSVpFKSB7XHJcbiAgICAgIGkrKztcclxuICAgICAgcG9zMSsrO1xyXG4gICAgICBwb3MyKys7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGkgPT09IGxlbilcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICBlbHNlIGlmICh0aGlzLnRvVUJ5dGUobnVtMS5fZGF0YVtwb3MxXSkgPCB0aGlzLnRvVUJ5dGUobnVtMi5fZGF0YVtwb3MyXSkpXHJcbiAgICAgIHJldHVybiAtMTtcclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIDE7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR2V0IGEgdW5zaWduZWQgdmFsdWUgZnJvbSBhIGJ5dGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYnl0ZVZhbFwiPiAgQSBzaWduZWQgYnl0ZSB2YWx1ZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHVuc2lnbmVkIHZhbHVlIG9mIHRoZSBieXRlXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBzdGF0aWMgdG9VQnl0ZShieXRlVmFsOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHZhbDogbnVtYmVyID0gYnl0ZVZhbDtcclxuXHJcbiAgICBpZiAoYnl0ZVZhbCA8IDApXHJcbiAgICAgIHZhbCA9IDI1NiArIGJ5dGVWYWw7XHJcblxyXG4gICAgcmV0dXJuIHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXQgYSBzaWduZWQgYnl0ZSB2YWx1ZSBmcm9tIGEgdW5zaWduZWQgdmFsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInNpZ25lZFZhbFwiPiAgQW4gdW5zaWduZWQgYnl0ZSB2YWx1ZSAoYXMgYW4gaW50ZWdlcilcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBzaWduZWQgdmFsdWUgYXMgYSBieXRlXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBzdGF0aWMgdG9TQnl0ZSh1bnNpZ25lZFZhbDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCB2YWw6IG51bWJlciA9IDA7XHJcblxyXG4gICAgaWYgKHVuc2lnbmVkVmFsID4gQ29uc3RhbnRzLlNCeXRlTWF4VmFsdWUpXHJcbiAgICAgIHZhbCA9ICh1bnNpZ25lZFZhbCAtIDI1Nik7XHJcbiAgICBlbHNlXHJcbiAgICAgIHZhbCA9IHVuc2lnbmVkVmFsO1xyXG5cclxuICAgIHJldHVybiB2YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR2V0IHRoZSBtYXhpbXVtIGxvbmcgbnVtYmVyIGluIE5VTV9UWVBFIHN0ZCBmb3JtYXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBNYXhMT05HKCk6IE5VTV9UWVBFIHtcclxuICAgIGxldCBuVU1fVFlQRTogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIG5VTV9UWVBFLl9kYXRhWzBdID0gTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS5FWFBfQklBUyArIDUpO1xyXG4gICAgblVNX1RZUEUuX2RhdGFbMV0gPSAyMTtcclxuICAgIG5VTV9UWVBFLl9kYXRhWzJdID0gNDc7XHJcbiAgICBuVU1fVFlQRS5fZGF0YVszXSA9IDQ4O1xyXG4gICAgblVNX1RZUEUuX2RhdGFbNF0gPSAzNjtcclxuICAgIG5VTV9UWVBFLl9kYXRhWzVdID0gNDc7XHJcbiAgICByZXR1cm4gblVNX1RZUEU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR2V0IHRoZSBtaW5pbXVtIGxvbmcgbnVtYmVyIGluIE5VTV9UWVBFIHN0ZCBmb3JtYXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBNaW5MT05HKCk6IE5VTV9UWVBFIHtcclxuICAgIGxldCBudW06IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICBudW0uX2RhdGFbMF0gPSBOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLkVYUF9CSUFTICsgNSk7XHJcbiAgICBudW0uX2RhdGFbMV0gPSAyMTtcclxuICAgIG51bS5fZGF0YVsyXSA9IDQ3O1xyXG4gICAgbnVtLl9kYXRhWzNdID0gNDg7XHJcbiAgICBudW0uX2RhdGFbNF0gPSAzNjtcclxuICAgIG51bS5fZGF0YVs1XSA9IDQ4O1xyXG4gICAgcmV0dXJuIG51bTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXQgZG91YmxlIG51bWJlciBmcm9tIE1hZ2ljIE5VTV9UWVBFXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICB0b19kb3VibGUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnN0b3JhZ2VfbWdfMl9mbG9hdCg4KTsgLy8gTGVuZ3RoIG9mIGRvdWJsZSBpcyA4IGJ5dGVcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXQgZG91YmxlIG51bWJlciBmcm9tIE1hZ2ljIE5VTV9UWVBFXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxlblwiPm9mIGJ5dGUgb2YgbmVlZGVkIG51bWJlciAtIFVTRSA4XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBzdG9yYWdlX21nXzJfZmxvYXQobGVuOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHNpZ25fcG9zOiBudW1iZXI7XHJcbiAgICBsZXQgc2lnbjogbnVtYmVyO1xyXG4gICAgbGV0IGNvbXBudW06IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICBsZXQgdG1wbnVtOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRSgpO1xyXG4gICAgbGV0IGRpdm51bTogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIGxldCBwd3I6IG51bWJlcjtcclxuICAgIGxldCBiaXRzOiBudW1iZXI7XHJcbiAgICBsZXQgZXhwOiBudW1iZXI7XHJcbiAgICBsZXQgbG9uZzE6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgbG9uZzI6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgZmx0T3V0OiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGNvdXQ6IEludDhBcnJheSA9IG5ldyBJbnQ4QXJyYXkoWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdKTtcclxuICAgIGxldCBOdW0yUHdyMjNfOiBJbnQ4QXJyYXkgPSBuZXcgSW50OEFycmF5KFtOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLkVYUF9CSUFTICsgNCksIDgsIDM4LCA4NiwgOF0pO1xyXG4gICAgbGV0IE51bTJQd3I1Ml86IEludDhBcnJheSA9IG5ldyBJbnQ4QXJyYXkoW05VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUuRVhQX0JJQVMgKyA4KSwgNDUsIDMsIDU5LCA5NiwgMjcsIDM3LCA0LCA5Nl0pO1xyXG4gICAgbGV0IGJhc2VfTnVtMTZQd3JzOiBJbnQ4QXJyYXlbXSA9IFtcclxuICAgICAgbmV3IEludDhBcnJheShbTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS5FWFBfQklBUyArIDEpLCAxXSksXHJcbiAgICAgIG5ldyBJbnQ4QXJyYXkoW05VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUuRVhQX0JJQVMgKyAxKSwgMTZdKSxcclxuICAgICAgbmV3IEludDhBcnJheShbTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS5FWFBfQklBUyArIDIpLCAyLCA1Nl0pLFxyXG4gICAgICBuZXcgSW50OEFycmF5KFtOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLkVYUF9CSUFTICsgMiksIDQwLCA5Nl0pLFxyXG4gICAgICBuZXcgSW50OEFycmF5KFtOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLkVYUF9CSUFTICsgMyksIDYsIDU1LCAzNl0pLFxyXG4gICAgICBuZXcgSW50OEFycmF5KFtOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLkVYUF9CSUFTICsgNCksIDEsIDQsIDg1LCA3Nl0pLFxyXG4gICAgICBuZXcgSW50OEFycmF5KFtOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLkVYUF9CSUFTICsgNCksIDE2LCA3NywgNzIsIDE2XSksXHJcbiAgICAgIG5ldyBJbnQ4QXJyYXkoW05VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUuRVhQX0JJQVMgKyA1KSwgMiwgNjgsIDQzLCA1NCwgNTZdKSxcclxuICAgICAgbmV3IEludDhBcnJheShbTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS5FWFBfQklBUyArIDUpLCA0MiwgOTQsIDk2LCA3MiwgOTZdKSxcclxuICAgICAgbmV3IEludDhBcnJheShbTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS5FWFBfQklBUyArIDYpLCA2LCA4NywgMTksIDQ3LCA2NywgMzZdKSxcclxuICAgICAgbmV3IEludDhBcnJheShbTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS5FWFBfQklBUyArIDcpLCAxLCA5LCA5NSwgMTEsIDYyLCA3NywgNzZdKSxcclxuICAgICAgbmV3IEludDhBcnJheShbTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS5FWFBfQklBUyArIDcpLCAxNywgNTksIDIxLCA4NiwgNCwgNDQsIDE2XSksXHJcbiAgICAgIG5ldyBJbnQ4QXJyYXkoW05VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUuRVhQX0JJQVMgKyA4KSwgMiwgODEsIDQ3LCA0OSwgNzYsIDcxLCA2LCA1Nl0pLFxyXG4gICAgICBuZXcgSW50OEFycmF5KFtOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLkVYUF9CSUFTICsgOCksIDQ1LCAzLCA1OSwgOTYsIDI3LCAzNywgNCwgOTZdKSxcclxuICAgICAgbmV3IEludDhBcnJheShbTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS5FWFBfQklBUyArIDkpLCA3LCAyMCwgNTcsIDU5LCA0MCwgMzcsIDkyLCA3OSwgMzZdKVxyXG4gICAgXTtcclxuXHJcbiAgICBsZXQgYmFzZV9OdW0yUHdyczogSW50OEFycmF5W10gPSBbXHJcbiAgICAgIG5ldyBJbnQ4QXJyYXkoW05VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUuRVhQX0JJQVMgKyAxKSwgMV0pLFxyXG4gICAgICBuZXcgSW50OEFycmF5KFtOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLkVYUF9CSUFTICsgMSksIDJdKSxcclxuICAgICAgbmV3IEludDhBcnJheShbTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS5FWFBfQklBUyArIDEpLCA0XSksXHJcbiAgICAgIG5ldyBJbnQ4QXJyYXkoW05VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUuRVhQX0JJQVMgKyAxKSwgOF0pXHJcbiAgICAgIF07XHJcblxyXG4gICAgaWYgKHRoaXMuTlVNX0lTX0xPTkcoKSlcclxuICAgICAgdGhpcy5udW1fNF9zdGRfbG9uZygpO1xyXG4gICAgaWYgKHRoaXMuX2RhdGFbMF0gPT09IDApXHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgc2lnbiA9IE5VTV9UWVBFLnRvU0J5dGUodGhpcy5fZGF0YVswXSAmIE5VTV9UWVBFLlNJR05fTUFTSyk7XHJcbiAgICB0aGlzLl9kYXRhWzBdID0gTlVNX1RZUEUudG9TQnl0ZSh0aGlzLl9kYXRhWzBdICYgPG51bWJlcj4ofk5VTV9UWVBFLlNJR05fTUFTSykpO1xyXG4gICAgaWYgKGxlbiA9PT0gNCkge1xyXG4gICAgICBiaXRzID0gMjQ7XHJcbiAgICAgIGNvbXBudW0gPSBuZXcgTlVNX1RZUEUoTnVtMlB3cjIzXyk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgYml0cyA9IDUzO1xyXG4gICAgICBjb21wbnVtID0gbmV3IE5VTV9UWVBFKE51bTJQd3I1Ml8pO1xyXG4gICAgfVxyXG4gICAgcHdyID0gKHRoaXMuX2RhdGFbMF0gLSBOVU1fVFlQRS5FWFBfQklBUykgPDwgMTtcclxuICAgIGlmIChwd3IgPCAwKVxyXG4gICAgICBleHAgPSBwd3IgKiAzICsgTWF0aC5mbG9vcigocHdyICsgMSkgLyAzKTtcclxuICAgIGVsc2UgZXhwID0gcHdyICogMyArIE1hdGguZmxvb3IoKHB3ciArIDIpIC8gMyk7XHJcbiAgICBwd3IgPSBiaXRzIC0gZXhwO1xyXG4gICAgaWYgKHB3ciA8IDApIHtcclxuICAgICAgcHdyID0gLXB3cjtcclxuICAgICAgdG1wbnVtID0gTlVNX1RZUEUuZGl2KHRoaXMsIG5ldyBOVU1fVFlQRShiYXNlX051bTE2UHdyc1twd3IgPj4gMl0pKTtcclxuICAgICAgdG1wbnVtID0gTlVNX1RZUEUuZGl2KHRtcG51bSwgbmV3IE5VTV9UWVBFKGJhc2VfTnVtMlB3cnNbcHdyICYgM10pKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0bXBudW0gPSB0aGlzO1xyXG4gICAgICB3aGlsZSAocHdyID49IDYwKSB7XHJcbiAgICAgICAgdG1wbnVtID0gTlVNX1RZUEUubXVsKHRtcG51bSwgbmV3IE5VTV9UWVBFKGJhc2VfTnVtMTZQd3JzWzE0XSkpO1xyXG4gICAgICAgIHB3ciAtPSA1NjtcclxuICAgICAgfVxyXG4gICAgICB0bXBudW0gPSBOVU1fVFlQRS5tdWwodG1wbnVtLCBuZXcgTlVNX1RZUEUoYmFzZV9OdW0xNlB3cnNbcHdyID4+IDJdKSk7XHJcbiAgICAgIHRtcG51bSA9IE5VTV9UWVBFLm11bCh0bXBudW0sIG5ldyBOVU1fVFlQRShiYXNlX051bTJQd3JzW3B3ciAmIDNdKSk7XHJcbiAgICB9XHJcbiAgICB3aGlsZSAoTlVNX1RZUEUubnVtX2NtcCh0bXBudW0sIGNvbXBudW0pIDwgMCkge1xyXG4gICAgICBleHAtLTtcclxuICAgICAgdG1wbnVtID0gTlVNX1RZUEUuYWRkKHRtcG51bSwgdG1wbnVtKTtcclxuICAgIH1cclxuICAgIGlmIChsZW4gPT09IDQpIHtcclxuICAgICAgbG9uZzEgPSB0bXBudW0ubnVtXzJfdWxvbmcoKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBkaXZudW0gPSBOVU1fVFlQRS5kaXYodG1wbnVtLCBuZXcgTlVNX1RZUEUoYmFzZV9OdW0xNlB3cnNbOF0pKTtcclxuICAgICAgZGl2bnVtLm51bV90cnVuYygwKTtcclxuICAgICAgbG9uZzEgPSBkaXZudW0ubnVtXzJfdWxvbmcoKTtcclxuICAgICAgZGl2bnVtID0gTlVNX1RZUEUubXVsKGRpdm51bSwgbmV3IE5VTV9UWVBFKGJhc2VfTnVtMTZQd3JzWzhdKSk7XHJcbiAgICAgIGRpdm51bSA9IE5VTV9UWVBFLnN1Yih0bXBudW0sIGRpdm51bSk7XHJcbiAgICAgIGxvbmcyID0gZGl2bnVtLm51bV8yX3Vsb25nKCk7XHJcbiAgICB9XHJcbiAgICBzaWduX3BvcyA9IGxlbiAtIDE7XHJcbiAgICBpZiAobGVuID09PSA0KSB7XHJcbiAgICAgIGV4cCArPSAxMjY7XHJcbiAgICAgIGNvdXRbM10gPSBOVU1fVFlQRS50b1NCeXRlKGV4cCA+PiAxKTtcclxuICAgICAgY291dFsyXSA9IE5VTV9UWVBFLnRvU0J5dGUoKHRoaXMuTE9fQ0hBUih0aGlzLkhJX1NIUlQobG9uZzEpKSAmIDB4N0YpIHwgKChleHAgJiAweDAxKSA8PCA3KSk7XHJcbiAgICAgIGNvdXRbMV0gPSBOVU1fVFlQRS50b1NCeXRlKHRoaXMuSElfQ0hBUih0aGlzLkxPX1NIUlQobG9uZzEpKSk7XHJcbiAgICAgIGNvdXRbMF0gPSBOVU1fVFlQRS50b1NCeXRlKHRoaXMuTE9fQ0hBUih0aGlzLkxPX1NIUlQobG9uZzEpKSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgZXhwICs9IDEwMjI7XHJcbiAgICAgIGNvdXRbN10gPSBOVU1fVFlQRS50b1NCeXRlKGV4cCA+PiA0KTtcclxuXHJcbiAgICAgIGNvdXRbNl0gPSBOVU1fVFlQRS50b1NCeXRlKCh0aGlzLkxPX0NIQVIodGhpcy5ISV9TSFJUKGxvbmcxKSkgJiAweDBGKSB8ICgoZXhwICYgMHgwRikgPDwgNCkpO1xyXG5cclxuICAgICAgY291dFs1XSA9IE5VTV9UWVBFLnRvU0J5dGUodGhpcy5ISV9DSEFSKHRoaXMuTE9fU0hSVChsb25nMSkpKTtcclxuXHJcbiAgICAgIGNvdXRbNF0gPSBOVU1fVFlQRS50b1NCeXRlKHRoaXMuTE9fQ0hBUih0aGlzLkxPX1NIUlQobG9uZzEpKSk7XHJcbiAgICAgIGNvdXRbM10gPSBOVU1fVFlQRS50b1NCeXRlKHRoaXMuSElfQ0hBUih0aGlzLkhJX1NIUlQobG9uZzIpKSk7XHJcbiAgICAgIGNvdXRbMl0gPSBOVU1fVFlQRS50b1NCeXRlKHRoaXMuTE9fQ0hBUih0aGlzLkhJX1NIUlQobG9uZzIpKSk7XHJcbiAgICAgIGNvdXRbMV0gPSBOVU1fVFlQRS50b1NCeXRlKHRoaXMuSElfQ0hBUih0aGlzLkxPX1NIUlQobG9uZzIpKSk7XHJcbiAgICAgIGNvdXRbMF0gPSBOVU1fVFlQRS50b1NCeXRlKHRoaXMuTE9fQ0hBUih0aGlzLkxPX1NIUlQobG9uZzIpKSk7XHJcbiAgICB9XHJcbiAgICBpZiAoc2lnbiAhPT0gMCkge1xyXG4gICAgICBjb3V0W3NpZ25fcG9zXSB8PSBOVU1fVFlQRS5TSUdOX01BU0s7XHJcbiAgICAgIHRoaXMuX2RhdGFbMF0gfD0gTlVNX1RZUEUuU0lHTl9NQVNLO1xyXG4gICAgfVxyXG4gICAgZmx0T3V0ID0gdGhpcy5zYnl0ZUFycl8yX0RvdWJsZShjb3V0KTtcclxuICAgIHJldHVybiBmbHRPdXQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQml0X1dpc2UgbWFzayA6IExlYXZlIGxhc3QgYnl0ZSBpbiBudW1iZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgTE9fQ0hBUihuOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIG4gJiAyNTU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQml0X1dpc2UgbWFzayA6IExlYXZlIGJ5dGUgYmVmb3JlIGxhc3RcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgSElfQ0hBUihuOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIChuICYgNjUyODApID4+IDg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQml0X1dpc2UgbWFzayA6IExlYXZlIDIgbGFzdCBieXRlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBMT19TSFJUKG46IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gPG51bWJlcj4obiAmIDY1NTM1KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCaXRfV2lzZSBtYXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIEhJX1NIUlQobjogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiA8bnVtYmVyPigobiAmIC02NTUzNikgPj4gMTYpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJpdF9XaXNlIG1hc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgc3RhdGljIE1LX1NIUlQoYzE6IG51bWJlciwgYzI6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgc3RySW50OiBzdHJpbmcgPSAoYzEgPDwgOCB8IGMyKS50b1N0cmluZygpO1xyXG4gICAgcmV0dXJuIE5OdW1iZXIuUGFyc2Uoc3RySW50KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCaXRfV2lzZSBtYXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHN0YXRpYyBNS19MT05HKHMxOiBudW1iZXIsIHMyOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IGwxOiBudW1iZXIgPSA8bnVtYmVyPnMxO1xyXG4gICAgbGV0IGwyOiBudW1iZXIgPSA8bnVtYmVyPnMyO1xyXG4gICAgbGV0IHN0ckxuZzogc3RyaW5nID0gKGwxIDw8IDE2IHwgbDIpLnRvU3RyaW5nKCk7XHJcbiAgICByZXR1cm4gTk51bWJlci5QYXJzZShzdHJMbmcpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgZG91YmxlIGZyb20gYXJyYXkgb2YgYnl0ZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYXJyYXlcIj5vZiBieXRlcywgaW5uZXIgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRvdWJsZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gZG91YmxlXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIHNieXRlQXJyXzJfRG91YmxlKGFycmF5OiBJbnQ4QXJyYXkpOiBudW1iZXIge1xyXG4gICAgbGV0IGRhdGF2aWV3ID0gbmV3IERhdGFWaWV3KGFycmF5LmJ1ZmZlcik7XHJcbiAgICByZXR1cm4gZGF0YXZpZXcuZ2V0RmxvYXQ2NCgwLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgYnl0ZSBhcnJheSBmb3IgZG91YmxlICg4IGJ5dGVzIGluIEphdmEpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRvdWJsZVwiPnRvIGdldCBpdHMgYnl0ZSByZXByZXNlbnRhdGlvblxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYnl0ZSBhcnJheVxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgZG91YmxlXzJfc2J5dGVBcnJheShkOiBudW1iZXIpOiBJbnQ4QXJyYXkge1xyXG4gICAgbGV0IGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcig4KTtcclxuICAgIGxldCBkYXRhdmlldyA9IG5ldyBEYXRhVmlldyhidWZmZXIpO1xyXG4gICAgZGF0YXZpZXcuc2V0RmxvYXQ2NCgwLCBkLCB0cnVlKTtcclxuICAgIHJldHVybiAobmV3IEludDhBcnJheShkYXRhdmlldy5idWZmZXIpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBQZXJmb3JtaW5nIGFuIFBvd2VyIG9wZXJhdGlvbiBvbiB0d28gbWFnaWMgbnVtYmVycyBWYWwxXlZhbDJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibnVtMVwiPiAgdGhlIGZpcnN0IG51bWJlciAtIG51bWJlclxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibnVtMlwiPiAgdGhlIGZpcnN0IG51bWJlciAtIHBvd2VyXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgcmVzdWx0XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBzdGF0aWMgZXZhbF9vcF9wd3IobnVtMTogTlVNX1RZUEUsIG51bTI6IE5VTV9UWVBFKTogTlVNX1RZUEUge1xyXG4gICAgbGV0IGQwOiBudW1iZXI7XHJcbiAgICBsZXQgZDE6IG51bWJlcjtcclxuXHJcbiAgICAvLyBudWxsIHZhbHVlc1xyXG4gICAgaWYgKG51bTEgPT0gbnVsbCB8fCBudW0yID09IG51bGwpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgIC8vIElmIHNlY29uZCBvcGVyYXRvciBpcyBhbiBpbnRlZ2VyICh3aGljaCBpcyBzbyBpbiBtb3N0IG9mIHRoZSBjYXNlcylcclxuICAgIC8vIGFuZCBpdCBpcyBub3QgLXZlLCB0aGVuIGNhbGN1bGF0ZSBwb3dlciB1c2luZyBzaW1wbGUgbXVsdGlwbGljYXRpb25cclxuICAgIC8vIFRoZXJlIGlzIGEgcHJvYmxlbSBpbiBmcm9tX2RvdWJsZSBhcyBpdCBkb2Vzbid0IHJldHVybiBleGFjdFxyXG4gICAgLy8gdmFsdWVzIChmb3IgZXhhbXBsZSwgcGFzc2luZyAxLjAwMjQ0MSBpbiBudW0gdG8gZnJvbV9kb3VibGUgd291bGRcclxuICAgIC8vIHJldHVybiAxLjAwMjQ0MDk5OTk5OTk5KS4gYnR3LCB0aGlzIHByb2JsZW0gZXhpc3RzIGV2ZW4gaW4gVmlzdWFsIHN0dWRpbydzXHJcbiAgICAvLyB3YXRjaCB3aW5kb3cgKHRyeSB0eXBpbmcgMS4wMDI0NDEgaW4gTmFtZSBjb2x1bW4gb2Ygd2F0Y2ggd2luZG93KS5cclxuICAgIGlmIChudW0yLk5VTV9JU19MT05HKCkgJiYgIW51bTIubnVtX2lzX25lZygpKSB7XHJcbiAgICAgIGQxID0gbnVtMi50b19kb3VibGUoKTtcclxuICAgICAgbGV0IHJlc3VsdDogTlVNX1RZUEUgPSBOVU1fVFlQRS5mcm9tX2RvdWJsZSgxKTtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGQxOyBpKyspXHJcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5tdWwocmVzdWx0LCBudW0xKTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgIGQwID0gbnVtMS50b19kb3VibGUoKTtcclxuICAgICAgZDEgPSBudW0yLnRvX2RvdWJsZSgpO1xyXG4gICAgICBpZiAoZDAgPCAwLjAgJiYgZDEgIT09IDxudW1iZXI+IGQxKVxyXG4gICAgICAgIGQwID0gMC4wO1xyXG4gICAgICAvKiBwd3IgKDAuMCwgMC4wKSAtPiBlcnJvciAqL1xyXG4gICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xyXG4gICAgICBlbHNlIGlmIChkMCAhPT0gMC4wKVxyXG4gICAgICAgIGQwID0gTWF0aC5wb3coZDAsIGQxKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gTlVNX1RZUEUuZnJvbV9kb3VibGUoZDApO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRyYW5zbGF0ZSBkb3VibGUgdG8gTlVNX1RZUEVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZG91YmxlXCI+dG8gdHJhbnNsYXRlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBOVU1fVFlQRSBvZiB0aGUgZG91YmxlXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBzdGF0aWMgZnJvbV9kb3VibGUoZDA6IG51bWJlcik6IE5VTV9UWVBFIHtcclxuICAgIGxldCBhcnJheTogSW50OEFycmF5ID0gTlVNX1RZUEUuZG91YmxlXzJfc2J5dGVBcnJheShkMCk7XHJcbiAgICByZXR1cm4gTlVNX1RZUEUuc3RvcmFnZV9tZ180X2Zsb2F0KDgsIGFycmF5KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0cmFuc2xhdGUgYnl0ZSBhcnJheSAgdG8gTlVNX1RZUEVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGVuXCI+b2YgdGhlIG5lZWRlZCBudW1iZXIoOClcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJ5dGVcIj5hcnJheSBtYXNrXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBOVU1fVFlQRSBmb3IgdGhlIG5lZWRlZCBhdHRyaWJ1dGVzXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIHN0YXRpYyBzdG9yYWdlX21nXzRfZmxvYXQobGVuOiBudW1iZXIsIGlucDogSW50OEFycmF5KTogTlVNX1RZUEUge1xyXG4gICAgbGV0IGNpbnA6IG51bWJlcltdO1xyXG4gICAgbGV0IHNpZ246IG51bWJlcjtcclxuICAgIGxldCB0bXAxOiBudW1iZXI7XHJcbiAgICBsZXQgZXhwOiBudW1iZXI7XHJcbiAgICBsZXQgYmlhczogbnVtYmVyO1xyXG4gICAgbGV0IGxvbmcxOiBudW1iZXI7XHJcbiAgICBsZXQgbG9uZzI6IG51bWJlcjtcclxuXHJcbiAgICBjaW5wID0gbmV3IEFycmF5PG51bWJlcj4oaW5wLmxlbmd0aCk7XHJcbiAgICBmb3IgKHRtcDEgPSAwO1xyXG4gICAgICAgICB0bXAxIDwgaW5wLmxlbmd0aDtcclxuICAgICAgICAgdG1wMSsrKVxyXG4gICAgICBjaW5wW3RtcDFdID0gTlVNX1RZUEUudG9VQnl0ZShpbnBbdG1wMV0pO1xyXG5cclxuICAgIHNpZ24gPSBjaW5wW2xlbiAtIDFdO1xyXG4gICAgaWYgKGxlbiA9PT0gNCkge1xyXG4gICAgICBleHAgPSA8bnVtYmVyPigoY2lucFsyXSA+PiA3KSB8ICgoY2lucFszXSAmIDB4N0YpIDw8IDEpKTtcclxuICAgICAgYmlhcyA9IDE1MDsgLy8gMTI2ICsgKDEgKyAyMyk7XHJcbiAgICAgIGxvbmcxID0gMDtcclxuICAgICAgbG9uZzIgPSBOVU1fVFlQRS5NS19MT05HKE5VTV9UWVBFLk1LX1NIUlQoMCwgY2lucFsyXSB8IDB4ODApLCBOVU1fVFlQRS5NS19TSFJUKGNpbnBbMV0sIGNpbnBbMF0pKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBleHAgPSA8bnVtYmVyPigoKGNpbnBbN10gJiAweDdGKSA8PCA0KSB8IChjaW5wWzZdID4+IDQpKTtcclxuICAgICAgYmlhcyA9IDEwNzU7IC8vIDEwMjIgKyAoMSArIDIwICsgMzIpO1xyXG4gICAgICBsb25nMSA9IE5VTV9UWVBFLk1LX0xPTkcoTlVNX1RZUEUuTUtfU0hSVCgwLCAoY2lucFs2XSAmIDB4MEYpIHwgMHgxMCksIE5VTV9UWVBFLk1LX1NIUlQoY2lucFs1XSwgY2lucFs0XSkpO1xyXG4gICAgICBsb25nMiA9IE5VTV9UWVBFLk1LX0xPTkcoTlVNX1RZUEUuTUtfU0hSVChjaW5wWzNdLCBjaW5wWzJdKSwgTlVNX1RZUEUuTUtfU0hSVChjaW5wWzFdLCBjaW5wWzBdKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gTlVNX1RZUEUuc3RvcmFnZV9udW1fNF9mbGRfZmx0KGxvbmcxLCBsb25nMiwgMTgsIHNpZ24sIGJpYXMsIGV4cCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdHJhbnNsYXRlIGJ5dGUgYXJyYXkgIHRvIE5VTV9UWVBFIChsaWtlIGluIE1hZ2ljIFNvdWNlIGNvZGUpLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgc3RvcmFnZV9udW1fNF9mbGRfZmx0KGxvbmcxOiBudW1iZXIsIGxvbmcyOiBudW1iZXIsIGRlYzogbnVtYmVyLCBzaWduOiBudW1iZXIsIGJpYXM6IG51bWJlciwgZXhwcjogbnVtYmVyKTogTlVNX1RZUEUge1xyXG4gICAgbGV0IGJhc2VfTnVtMTZQd3JzOiBJbnQ4QXJyYXlbXSA9IFtcclxuICAgICAgbmV3IEludDhBcnJheShbTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS5FWFBfQklBUyArIDEpLCAxXSksXHJcbiAgICAgIG5ldyBJbnQ4QXJyYXkoW05VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUuRVhQX0JJQVMgKyAxKSwgMTZdKSxcclxuICAgICAgbmV3IEludDhBcnJheShbTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS5FWFBfQklBUyArIDIpLCAyLCA1Nl0pLFxyXG4gICAgICBuZXcgSW50OEFycmF5KFtOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLkVYUF9CSUFTICsgMiksIDQwLCA5Nl0pLFxyXG4gICAgICBuZXcgSW50OEFycmF5KFtOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLkVYUF9CSUFTICsgMyksIDYsIDU1LCAzNl0pLFxyXG4gICAgICBuZXcgSW50OEFycmF5KFtOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLkVYUF9CSUFTICsgNCksIDEsIDQsIDg1LCA3Nl0pLFxyXG4gICAgICBuZXcgSW50OEFycmF5KFtOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLkVYUF9CSUFTICsgNCksIDE2LCA3NywgNzIsIDE2XSksXHJcbiAgICAgIG5ldyBJbnQ4QXJyYXkoW05VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUuRVhQX0JJQVMgKyA1KSwgMiwgNjgsIDQzLCA1NCwgNTZdKSxcclxuICAgICAgbmV3IEludDhBcnJheShbTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS5FWFBfQklBUyArIDUpLCA0MiwgOTQsIDk2LCA3MiwgOTZdKSxcclxuICAgICAgbmV3IEludDhBcnJheShbTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS5FWFBfQklBUyArIDYpLCA2LCA4NywgMTksIDQ3LCA2NywgMzZdKSxcclxuICAgICAgbmV3IEludDhBcnJheShbTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS5FWFBfQklBUyArIDcpLCAxLCA5LCA5NSwgMTEsIDYyLCA3NywgNzZdKSxcclxuICAgICAgbmV3IEludDhBcnJheShbTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS5FWFBfQklBUyArIDcpLCAxNywgNTksIDIxLCA4NiwgNCwgNDQsIDE2XSksXHJcbiAgICAgIG5ldyBJbnQ4QXJyYXkoW05VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUuRVhQX0JJQVMgKyA4KSwgMiwgODEsIDQ3LCA0OSwgNzYsIDcxLCA2LCA1Nl0pLFxyXG4gICAgICBuZXcgSW50OEFycmF5KFtOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLkVYUF9CSUFTICsgOCksIDQ1LCAzLCA1OSwgOTYsIDI3LCAzNywgNCwgOTZdKSxcclxuICAgICAgbmV3IEludDhBcnJheShbTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS5FWFBfQklBUyArIDkpLCA3LCAyMCwgNTcsIDU5LCA0MCwgMzcsIDkyLCA3OSwgMzZdKVxyXG4gICAgXTtcclxuXHJcbiAgICBsZXQgYmFzZV9OdW0yUHdyczogSW50OEFycmF5W10gPSBbXHJcbiAgICAgIG5ldyBJbnQ4QXJyYXkoW05VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUuRVhQX0JJQVMgKyAxKSwgMV0pLFxyXG4gICAgICBuZXcgSW50OEFycmF5KFtOVU1fVFlQRS50b1NCeXRlKE5VTV9UWVBFLkVYUF9CSUFTICsgMSksIDJdKSxcclxuICAgICAgbmV3IEludDhBcnJheShbTlVNX1RZUEUudG9TQnl0ZShOVU1fVFlQRS5FWFBfQklBUyArIDEpLCA0XSksXHJcbiAgICAgIG5ldyBJbnQ4QXJyYXkoW05VTV9UWVBFLnRvU0J5dGUoTlVNX1RZUEUuRVhQX0JJQVMgKyAxKSwgOF0pXHJcbiAgICBdO1xyXG4gICAgbGV0IHRtcG51bTogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIGxldCBvdXRWYWw6IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICBsZXQgZXhwOiBudW1iZXIgPSA8bnVtYmVyPmV4cHI7XHJcbiAgICBpZiAoZXhwID09PSAwKSB7XHJcbiAgICAgIG91dFZhbC5OVU1fWkVSTygpO1xyXG4gICAgICByZXR1cm4gb3V0VmFsO1xyXG4gICAgfVxyXG4gICAgb3V0VmFsLm51bV80X3Vsb25nKGxvbmcyKTtcclxuICAgIGlmIChsb25nMSAhPT0gMCkge1xyXG4gICAgICB0bXBudW0ubnVtXzRfdWxvbmcobG9uZzEpO1xyXG4gICAgICB0bXBudW0gPSBOVU1fVFlQRS5tdWwodG1wbnVtLCBuZXcgTlVNX1RZUEUoYmFzZV9OdW0xNlB3cnNbOF0pKTtcclxuICAgICAgb3V0VmFsID0gTlVNX1RZUEUuYWRkKHRtcG51bSwgb3V0VmFsKTtcclxuICAgIH1cclxuICAgIGV4cCA9IDxudW1iZXI+KGV4cCAtIGJpYXMpO1xyXG4gICAgaWYgKGV4cCA8IDApIHtcclxuICAgICAgZXhwID0gLWV4cDtcclxuICAgICAgd2hpbGUgKGV4cCA+PSA2MCkge1xyXG4gICAgICAgIG91dFZhbCA9IE5VTV9UWVBFLmRpdihvdXRWYWwsIG5ldyBOVU1fVFlQRShiYXNlX051bTE2UHdyc1sxNF0pKTtcclxuICAgICAgICBleHAgLT0gNTY7XHJcbiAgICAgIH1cclxuICAgICAgdG1wbnVtID0gTlVNX1RZUEUubXVsKG5ldyBOVU1fVFlQRShiYXNlX051bTE2UHdyc1tleHAgPj4gMl0pLFxyXG4gICAgICAgIG5ldyBOVU1fVFlQRShiYXNlX051bTJQd3JzW2V4cCAmIDNdKSk7XHJcbiAgICAgIG91dFZhbCA9IE5VTV9UWVBFLmRpdihvdXRWYWwsIHRtcG51bSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKGV4cCA+PSA2MCkge1xyXG4gICAgICAgIG91dFZhbC5OVU1fWkVSTygpO1xyXG4gICAgICAgIHJldHVybiBvdXRWYWw7XHJcbiAgICAgIH1cclxuICAgICAgdG1wbnVtID0gTlVNX1RZUEUubXVsKG5ldyBOVU1fVFlQRShiYXNlX051bTE2UHdyc1tleHAgPj4gMl0pLFxyXG4gICAgICAgIG5ldyBOVU1fVFlQRShiYXNlX051bTJQd3JzW2V4cCAmIDNdKSk7XHJcbiAgICAgIG91dFZhbCA9IE5VTV9UWVBFLm11bChvdXRWYWwsIHRtcG51bSk7XHJcbiAgICB9XHJcbiAgICBpZiAoKHNpZ24gJiAweDgwKSAhPT0gMClcclxuICAgICAgb3V0VmFsLl9kYXRhWzBdID0gb3V0VmFsLl9kYXRhWzBdIHwgTlVNX1RZUEUuU0lHTl9NQVNLO1xyXG4gICAgb3V0VmFsLnJvdW5kKGRlYyk7XHJcbiAgICByZXR1cm4gb3V0VmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIE1hdGhlbWF0aWNhbCBmdW5jdGlvbnMgaW1wbGVtZW50YXRpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBldmFsX29wX2xvZyh2YWwxOiBOVU1fVFlQRSk6IE5VTV9UWVBFIHtcclxuICAgIGlmICh2YWwxID09IG51bGwpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgbGV0IHJlc1ZhbDogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIGxldCBkOiBudW1iZXIgPSB2YWwxLnRvX2RvdWJsZSgpO1xyXG5cclxuICAgIGlmIChkID4gMC4wKVxyXG4gICAgICByZXNWYWwgPSBOVU1fVFlQRS5mcm9tX2RvdWJsZShNYXRoLmxvZyhkKSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJlc1ZhbC5OVU1fWkVSTygpO1xyXG4gICAgcmV0dXJuIHJlc1ZhbDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBldmFsX29wX2V4cCh2YWwxOiBOVU1fVFlQRSk6IE5VTV9UWVBFIHtcclxuICAgIGxldCByZXNWYWw6IE5VTV9UWVBFO1xyXG5cclxuICAgIGlmICh2YWwxID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgbGV0IGQ6IG51bWJlciA9IHZhbDEudG9fZG91YmxlKCk7XHJcbiAgICByZXNWYWwgPSBOVU1fVFlQRS5mcm9tX2RvdWJsZShNYXRoLmV4cChkKSk7XHJcbiAgICByZXR1cm4gcmVzVmFsO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGV2YWxfb3BfYWJzKHZhbDE6IE5VTV9UWVBFKTogTlVNX1RZUEUge1xyXG4gICAgaWYgKHZhbDEgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgbGV0IHJlc1ZhbDogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUodmFsMSk7XHJcbiAgICByZXNWYWwubnVtX2FicygpO1xyXG4gICAgcmV0dXJuIHJlc1ZhbDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBldmFsX29wX3Npbih2YWwxOiBOVU1fVFlQRSk6IE5VTV9UWVBFIHtcclxuICAgIGlmICh2YWwxID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIGxldCByZXNWYWw6IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICBsZXQgZDogbnVtYmVyID0gdmFsMS50b19kb3VibGUoKTtcclxuICAgIHJlc1ZhbCA9IE5VTV9UWVBFLmZyb21fZG91YmxlKE1hdGguc2luKGQpKTtcclxuICAgIHJldHVybiByZXNWYWw7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZXZhbF9vcF9jb3ModmFsMTogTlVNX1RZUEUpOiBOVU1fVFlQRSB7XHJcbiAgICBpZiAodmFsMSA9PT0gbnVsbClcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICBsZXQgcmVzVmFsOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRSgpO1xyXG4gICAgICBsZXQgZDogbnVtYmVyID0gdmFsMS50b19kb3VibGUoKTtcclxuICAgIHJlc1ZhbCA9IE5VTV9UWVBFLmZyb21fZG91YmxlKE1hdGguY29zKGQpKTtcclxuICAgIHJldHVybiByZXNWYWw7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZXZhbF9vcF90YW4odmFsMTogTlVNX1RZUEUpOiBOVU1fVFlQRSB7XHJcbiAgICBpZiAodmFsMSA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIGxldCByZXNWYWw6IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICBsZXQgZDogbnVtYmVyID0gdmFsMS50b19kb3VibGUoKTtcclxuICAgIHJlc1ZhbCA9IE5VTV9UWVBFLmZyb21fZG91YmxlKE1hdGgudGFuKGQpKTtcclxuICAgIHJldHVybiByZXNWYWw7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZXZhbF9vcF9hc2luKHZhbDE6IE5VTV9UWVBFKTogTlVNX1RZUEUge1xyXG4gICAgaWYgKHZhbDEgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgbGV0IHJlc1ZhbDogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIGxldCBkOiBudW1iZXIgPSB2YWwxLnRvX2RvdWJsZSgpO1xyXG4gICAgaWYgKGQgPD0gMS4wICYmIGQgPj0gLTEuMClcclxuICAgICAgcmVzVmFsID0gTlVNX1RZUEUuZnJvbV9kb3VibGUoTWF0aC5hc2luKGQpKTtcclxuICAgIGVsc2VcclxuICAgICAgcmVzVmFsID0gTlVNX1RZUEUuZnJvbV9kb3VibGUoMC4wKTtcclxuICAgIHJldHVybiByZXNWYWw7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZXZhbF9vcF9hY29zKHZhbDE6IE5VTV9UWVBFKTogTlVNX1RZUEUge1xyXG4gICAgaWYgKHZhbDEgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgbGV0IHJlc1ZhbDogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIGxldCBkOiBudW1iZXIgPSB2YWwxLnRvX2RvdWJsZSgpO1xyXG5cclxuICAgIGlmIChkIDw9IDEuMCAmJiBkID49IC0xLjApXHJcbiAgICAgIHJlc1ZhbCA9IE5VTV9UWVBFLmZyb21fZG91YmxlKE1hdGguYWNvcyhkKSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJlc1ZhbCA9IE5VTV9UWVBFLmZyb21fZG91YmxlKDAuMCk7XHJcbiAgICByZXR1cm4gcmVzVmFsO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGV2YWxfb3BfYXRhbih2YWwxOiBOVU1fVFlQRSk6IE5VTV9UWVBFIHtcclxuICAgIGlmICh2YWwxID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIGxldCByZXNWYWw6IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICAgIGxldCBkOiBudW1iZXIgPSB2YWwxLnRvX2RvdWJsZSgpO1xyXG4gICAgcmVzVmFsID0gTlVNX1RZUEUuZnJvbV9kb3VibGUoTWF0aC5hdGFuKGQpKTtcclxuICAgIHJldHVybiByZXNWYWw7XHJcbiAgfVxyXG5cclxuICBudW1fYWJzKCk6IHZvaWQge1xyXG4gICAgbGV0IGw6IG51bWJlcjtcclxuICAgIGlmICh0aGlzLk5VTV9JU19MT05HKCkpIHtcclxuICAgICAgbCA9IHRoaXMuTlVNX0xPTkcoKTtcclxuICAgICAgaWYgKGwgPCAwKVxyXG4gICAgICAgIGwgPSAtbDtcclxuICAgICAgdGhpcy5OVU1fNF9MT05HKGwpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl9kYXRhWzBdICY9IE5VTV9UWVBFLnRvU0J5dGUofk5VTV9UWVBFLlNJR05fTUFTSyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUmFuZG9tYWwgTWF0aCBmdW5jdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc3RhdGljIGV2YWxfb3BfcmFuZCh2YWwxOiBOVU1fVFlQRSk6IE5VTV9UWVBFIHtcclxuICAgIGlmICh2YWwxID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBsZXQgcmFuZF9pbml0aWFsaXplZDogYm9vbGVhbiA9IFJhbmRvbWl6ZXIuZ2V0X2luaXRpYWxpemVkKCk7XHJcbiAgICBsZXQgcmFuZF9tb2Q6IE5VTV9UWVBFO1xyXG4gICAgbGV0IHJhbmRfbXVsOiBOVU1fVFlQRTtcclxuICAgIGxldCByYW5kX3NlZWQ6IE5VTV9UWVBFO1xyXG5cclxuICAgIGxldCB0bXBfbnVtOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRSgpO1xyXG5cclxuICAgIGlmICghcmFuZF9pbml0aWFsaXplZCkge1xyXG4gICAgICBSYW5kb21pemVyLnNldF9pbml0aWFsaXplZCgpOyAvLyBzZXQgdG8gdHJ1ZVxyXG4gICAgICByYW5kX21vZCA9IG5ldyBOVU1fVFlQRSgpO1xyXG4gICAgICByYW5kX211bCA9IG5ldyBOVU1fVFlQRSgpO1xyXG4gICAgICByYW5kX3NlZWQgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgICAgcmFuZF9tb2QubnVtXzRfYV9zdGQoXCIxMDAwMDAwMDdcIik7XHJcbiAgICAgIHJhbmRfbXVsLm51bV80X2Ffc3RkKFwiNzUwMDAwMDdcIik7XHJcbiAgICAgIHJhbmRfc2VlZC5udW1fNF9hX3N0ZChcIjEyMzQ1Njc4XCIpO1xyXG5cclxuICAgICAgUmFuZG9taXplci5zZXRfbW9kKHJhbmRfbW9kLnRvX2RvdWJsZSgpKTtcclxuICAgICAgUmFuZG9taXplci5zZXRfbXVsKHJhbmRfbXVsLnRvX2RvdWJsZSgpKTtcclxuICAgICAgUmFuZG9taXplci5zZXRfc2VlZChyYW5kX3NlZWQudG9fZG91YmxlKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgcmFuZF9tb2QgPSBOVU1fVFlQRS5mcm9tX2RvdWJsZShSYW5kb21pemVyLmdldF9tb2QoKSk7XHJcbiAgICAgIHJhbmRfbXVsID0gTlVNX1RZUEUuZnJvbV9kb3VibGUoUmFuZG9taXplci5nZXRfbXVsKCkpO1xyXG4gICAgICByYW5kX3NlZWQgPSBOVU1fVFlQRS5mcm9tX2RvdWJsZShSYW5kb21pemVyLmdldF9zZWVkKCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICBpZiAoIXZhbDEubnVtX2lzX3plcm8oKSkge1xyXG4gICAgICBpZiAodmFsMS5udW1faXNfbmVnKCkpXHJcbiAgICAgICAgcmFuZF9zZWVkLk5VTV80X0xPTkcoTlVNX1RZUEUuaGFzaF9yYW5kKCkpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgcmFuZF9zZWVkID0gbmV3IE5VTV9UWVBFKHZhbDEpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICBpZiAocmFuZF9zZWVkLm51bV9pc19uZWcoKSkge1xyXG4gICAgICAgIHRtcF9udW0uTlVNXzRfTE9ORygtMSk7XHJcbiAgICAgICAgcmFuZF9zZWVkID0gTlVNX1RZUEUubXVsKHJhbmRfc2VlZCwgdG1wX251bSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByYW5kX3NlZWQgPSBOVU1fVFlQRS5tdWwocmFuZF9zZWVkLCByYW5kX211bCk7XHJcbiAgICByYW5kX3NlZWQgPSBOVU1fVFlQRS5tb2QocmFuZF9zZWVkLCByYW5kX21vZCk7XHJcbiAgICB0bXBfbnVtID0gTlVNX1RZUEUuZGl2KHJhbmRfc2VlZCwgcmFuZF9tb2QpO1xyXG4gICAgLy8gcmVzZXQgZ2xvYmFscyB2YXJpYWJsZXNcclxuICAgIFJhbmRvbWl6ZXIuc2V0X21vZChyYW5kX21vZC50b19kb3VibGUoKSk7XHJcbiAgICBSYW5kb21pemVyLnNldF9tdWwocmFuZF9tdWwudG9fZG91YmxlKCkpO1xyXG4gICAgUmFuZG9taXplci5zZXRfc2VlZChyYW5kX3NlZWQudG9fZG91YmxlKCkpO1xyXG4gICAgcmV0dXJuIHRtcF9udW07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGEgcmFuZG9tIHZhbHVlIHRvIHVzZSBhcyB0aGUgY3RsIGVuY3JpcHRpb24gIGtleVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgaGFzaF9yYW5kKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKChuZXcgRGF0ZSgpLmdldE1pbGxpc2Vjb25kcygpKSBeIE1hdGgucmFuZG9tKCkgKiAxMjM0NTY3OCk7XHJcbiAgICAvLyBsZXQgYXJyYXk6IG51bWJlcltdID0gbmV3IEFycmF5PG51bWJlcj4oMTAwKTtcclxuICAgIC8vIGZvciAobGV0IF9haTogbnVtYmVyID0gMDsgX2FpIDwgYXJyYXkubGVuZ3RoOyArK19haSlcclxuICAgIC8vICAgYXJyYXlbX2FpXSA9IDA7XHJcbiAgICAvLyBuZXcgUmFuZG9tKCkuTmV4dEJ5dGVzKGFycmF5KTtcclxuICAgIC8vIHJldHVybiA8bnVtYmVyPihNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpIF4gTlVNX1RZUEUuaGFzaF9zdHJfbmV3KGFycmF5KSk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgT3BlckRhdGEge1xyXG4gIE5VTV9EaWZmXzogbnVtYmVyID0gMDtcclxuICBOVU1fRXhwMV86IG51bWJlciA9IDA7XHJcbiAgTlVNX0V4cDJfOiBudW1iZXIgPSAwO1xyXG59XHJcblxyXG4iXX0=
|