@magic-xpa/gui 4.801.0-dev481.221 → 4.801.0-dev481.225

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.
@@ -1,6 +1,5 @@
1
- import { ApplicationException, Debug, ISO_8859_1_Encoding, NNumber, NString, NumberStyles, StringBuilder } from "@magic-xpa/mscorelib";
2
- import { Base64, Misc, StorageAttribute, StorageAttributeCheck, StrUtil, UtilStrByteMode, XmlParser } from "@magic-xpa/utils";
3
- import { NUM_TYPE } from "./NUM_TYPE";
1
+ import { ApplicationException, Debug, ISO_8859_1_Encoding, NNumber, NumberStyles, StringBuilder } from "@magic-xpa/mscorelib";
2
+ import { Base64, StorageAttribute, StorageAttributeCheck, StrUtil, UtilStrByteMode, XmlParser } from "@magic-xpa/utils";
4
3
  import { GuiEnvironment } from "../../GuiEnvironment";
5
4
  import { VectorTypeBase } from "./VectorTypeBase";
6
5
  export class RecordUtils {
@@ -25,91 +24,6 @@ export class RecordUtils {
25
24
  return RecordUtils.byteStreamToString(new StringBuilder(stream));
26
25
  }
27
26
  static serializeItemVal(itemVal, itemAttr, cellAttr, toBase64) {
28
- if (arguments.length === 2)
29
- return RecordUtils.serializeItemVal_0(itemVal, itemAttr);
30
- else
31
- return RecordUtils.serializeItemVal_1(itemVal, itemAttr, cellAttr, toBase64);
32
- }
33
- static serializeItemVal_0(itemVal, itemAttr) {
34
- Debug.Assert(itemVal !== null);
35
- let valueSize;
36
- let tmpBufLen = NString.Empty;
37
- let tmpBuf = null;
38
- let contentWithLength = null;
39
- let pos = 0;
40
- let fldValLen = 0;
41
- let tempItemVal = NString.Empty;
42
- let noOfPackets = 0;
43
- let tmpNoOfPackets = null;
44
- let tmpStrNoOfPackets = NString.Empty;
45
- switch (itemAttr) {
46
- case StorageAttribute.NUMERIC:
47
- case StorageAttribute.DATE:
48
- case StorageAttribute.TIME:
49
- let numType = new NUM_TYPE(itemVal);
50
- tmpBuf = Misc.ToByteArray(numType.Data);
51
- break;
52
- case StorageAttribute.BOOLEAN:
53
- tmpBuf = GuiEnvironment.Environment.GetEncoding().GetBytes(itemVal);
54
- break;
55
- case StorageAttribute.ALPHA:
56
- itemVal = StrUtil.rtrim(itemVal);
57
- valueSize = UtilStrByteMode.lenB(itemVal).toString(16).toUpperCase();
58
- for (let j = 0; j < 4 - valueSize.length; j++)
59
- tmpBufLen += "0";
60
- tmpBufLen += valueSize;
61
- tmpBuf = new Uint8Array(GuiEnvironment.Environment.GetEncoding().GetBytes(tmpBufLen).length + GuiEnvironment.Environment.GetEncoding().GetBytes(itemVal).length);
62
- tmpBuf.set(GuiEnvironment.Environment.GetEncoding().GetBytes(tmpBufLen), 0);
63
- tmpBuf.set(GuiEnvironment.Environment.GetEncoding().GetBytes(itemVal), GuiEnvironment.Environment.GetEncoding().GetBytes(tmpBufLen).length);
64
- break;
65
- case StorageAttribute.UNICODE:
66
- itemVal = StrUtil.rtrim(itemVal);
67
- valueSize = (itemVal.length.toString(16)).toUpperCase();
68
- for (let j = 0; j < 4 - valueSize.length; j++)
69
- tmpBufLen += "0";
70
- tmpBufLen += valueSize;
71
- tmpBuf = new Uint8Array(GuiEnvironment.Environment.GetEncoding().GetBytes(tmpBufLen).length + GuiEnvironment.Environment.GetEncoding().GetBytes(itemVal).length);
72
- tmpBuf.set(GuiEnvironment.Environment.GetEncoding().GetBytes(tmpBufLen), 0);
73
- tmpBuf.set(GuiEnvironment.Environment.GetEncoding().GetBytes(itemVal), GuiEnvironment.Environment.GetEncoding().GetBytes(tmpBufLen).length);
74
- break;
75
- case StorageAttribute.BLOB:
76
- pos = 0;
77
- fldValLen = ISO_8859_1_Encoding.ISO_8859_1.GetByteCount(itemVal);
78
- noOfPackets = Math.floor(fldValLen / 0xFFFF);
79
- tmpBufLen = "FFFF";
80
- tmpNoOfPackets = GuiEnvironment.Environment.GetEncoding().GetBytes(tmpBufLen);
81
- for (let i = 0; i < noOfPackets; i++) {
82
- tempItemVal = itemVal.substr(pos, 0xFFFF);
83
- pos += 0xFFFF;
84
- let tempItemValBytes = ISO_8859_1_Encoding.ISO_8859_1.GetBytes(tempItemVal);
85
- contentWithLength = new Uint8Array(tmpNoOfPackets.length + tempItemValBytes.length);
86
- contentWithLength.set(tmpNoOfPackets);
87
- contentWithLength.set(tempItemValBytes, tmpNoOfPackets.length);
88
- }
89
- let lastPacketSize = fldValLen % 0xFFFF;
90
- if (lastPacketSize > 0) {
91
- tempItemVal = itemVal.substr(pos, (fldValLen) - (pos));
92
- let tempItemValBytes = ISO_8859_1_Encoding.ISO_8859_1.GetBytes(tempItemVal);
93
- tmpBufLen = NString.Format(String.fromCharCode(tempItemValBytes.length), "X4");
94
- let tempContentWithLength = new Uint8Array(contentWithLength.length +
95
- GuiEnvironment.Environment.GetEncoding().GetBytes(tmpBufLen).length +
96
- ISO_8859_1_Encoding.ISO_8859_1.GetBytes(tempItemVal).length);
97
- tempContentWithLength.set(contentWithLength);
98
- tempContentWithLength.set(GuiEnvironment.Environment.GetEncoding().GetBytes(tmpBufLen), contentWithLength.length);
99
- tempContentWithLength.set(ISO_8859_1_Encoding.ISO_8859_1.GetBytes(tempItemVal), contentWithLength.length + GuiEnvironment.Environment.GetEncoding().GetBytes(tmpBufLen).length);
100
- contentWithLength = tempContentWithLength;
101
- noOfPackets++;
102
- }
103
- tmpStrNoOfPackets = NString.Format(String.fromCharCode(noOfPackets), "D4");
104
- tmpNoOfPackets = GuiEnvironment.Environment.GetEncoding().GetBytes(tmpStrNoOfPackets);
105
- tmpBuf = new Uint8Array(contentWithLength.length + tmpNoOfPackets.length);
106
- tmpBuf.set(tmpNoOfPackets);
107
- tmpBuf.set(contentWithLength, tmpNoOfPackets.length);
108
- break;
109
- }
110
- return tmpBuf;
111
- }
112
- static serializeItemVal_1(itemVal, itemAttr, cellAttr, toBase64) {
113
27
  Debug.Assert(itemVal != null);
114
28
  let significantNumSize = GuiEnvironment.Environment.GetSignificantNumSize() * 2;
115
29
  let valueSize;
@@ -444,4 +358,4 @@ export class RecordUtils {
444
358
  return RecordUtils.getString(tmp, type, useHex);
445
359
  }
446
360
  }
447
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjb3JkVXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvc3JjL21hbmFnZW1lbnQvZGF0YS9SZWNvcmRVdGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLEtBQUssRUFDSyxtQkFBbUIsRUFDN0IsT0FBTyxFQUNQLE9BQU8sRUFDUCxZQUFZLEVBRVosYUFBYSxFQUNkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLE1BQU0sRUFDTixJQUFJLEVBQ0osZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixPQUFPLEVBQ1AsZUFBZSxFQUNmLFNBQVMsRUFDVixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVsRCxNQUFNLE9BQU8sV0FBVztJQUd0QixNQUFNLENBQUMsa0JBQWtCLENBQUMsTUFBVztRQUNuQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLFlBQVksYUFBYSxDQUFDLEVBQUU7WUFDbEYsT0FBTyxXQUFXLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDakQ7UUFDRCxPQUFPLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBT08sTUFBTSxDQUFDLG9CQUFvQixDQUFDLE1BQXFCO1FBQ3ZELElBQUksT0FBZSxDQUFDO1FBQ3BCLElBQUksUUFBZ0IsQ0FBQztRQUNyQixJQUFJLE1BQU0sR0FBa0IsSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENB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UUFBMEIsRUFBRSxRQUEwQixFQUFFLFFBQWlCO1FBQzVHLElBQUksTUFBTSxHQUFXLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN6RixPQUFPLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUdELE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBVyxFQUFFLElBQXNCO1FBQ3BELElBQUksTUFBTSxHQUFZLGNBQWMsQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxJQUFJLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxLQUFLO2VBQ2xHLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPLElBQUkscUJBQXFCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBR3BGLElBQUksR0FBVyxDQUFDO1FBQ2hCLElBQUksSUFBSSxLQUFLLGdCQUFnQixDQUFDLEtBQUssSUFBSSxJQUFJLEtBQUssZ0JBQWdCLENBQUMsT0FBTztZQUN0RSxJQUFJLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxJQUFJLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUU7WUFDekUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDckI7O1lBRUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUVaLE9BQU8sV0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2xELENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQXBwbGljYXRpb25FeGNlcHRpb24sXHJcbiAgRGVidWcsXHJcbiAgRW5jb2RpbmcsIElTT184ODU5XzFfRW5jb2RpbmcsXHJcbiAgTk51bWJlcixcclxuICBOU3RyaW5nLFxyXG4gIE51bWJlclN0eWxlcyxcclxuICBSZWZQYXJhbSxcclxuICBTdHJpbmdCdWlsZGVyXHJcbn0gZnJvbSBcIkBtYWdpYy14cGEvbXNjb3JlbGliXCI7XHJcbmltcG9ydCB7XHJcbiAgQmFzZTY0LFxyXG4gIE1pc2MsXHJcbiAgU3RvcmFnZUF0dHJpYnV0ZSxcclxuICBTdG9yYWdlQXR0cmlidXRlQ2hlY2ssXHJcbiAgU3RyVXRpbCxcclxuICBVdGlsU3RyQnl0ZU1vZGUsXHJcbiAgWG1sUGFyc2VyXHJcbn0gZnJvbSBcIkBtYWdpYy14cGEvdXRpbHNcIjtcclxuaW1wb3J0IHtOVU1fVFlQRX0gZnJvbSBcIi4vTlVNX1RZUEVcIjtcclxuaW1wb3J0IHsgR3VpRW52aXJvbm1lbnQgfSBmcm9tIFwiLi4vLi4vR3VpRW52aXJvbm1lbnRcIjtcclxuaW1wb3J0IHsgVmVjdG9yVHlwZUJhc2UgfSBmcm9tIFwiLi9WZWN0b3JUeXBlQmFzZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFJlY29yZFV0aWxzIHtcclxuICBzdGF0aWMgYnl0ZVN0cmVhbVRvU3RyaW5nKHN0cmVhbTogU3RyaW5nQnVpbGRlcik6IHN0cmluZztcclxuICBzdGF0aWMgYnl0ZVN0cmVhbVRvU3RyaW5nKHN0cmVhbTogc3RyaW5nKTogc3RyaW5nO1xyXG4gIHN0YXRpYyBieXRlU3RyZWFtVG9TdHJpbmcoc3RyZWFtOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgKHN0cmVhbSA9PT0gbnVsbCB8fCBzdHJlYW0gaW5zdGFuY2VvZiBTdHJpbmdCdWlsZGVyKSkge1xyXG4gICAgICByZXR1cm4gUmVjb3JkVXRpbHMuYnl0ZVN0cmVhbVRvU3RyaW5nXzAoc3RyZWFtKTtcclxuICAgIH1cclxuICAgIHJldHVybiBSZWNvcmRVdGlscy5ieXRlU3RyZWFtVG9TdHJpbmdfMShzdHJlYW0pO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRyYW5zbGF0ZSBieXRlIHN0cmVhbSB0byBTdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVzdWx0XCI+b2YgdGhlIHRyYW5zbGF0aW9uPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0cmVhbVwiPihpbiBTdHJpbmdCdWZmZXIgZm9ybSkgdG8gdHJhbnNsYXRlIGZyb208L3BhcmFtPlxyXG4gIHByaXZhdGUgc3RhdGljIGJ5dGVTdHJlYW1Ub1N0cmluZ18wKHN0cmVhbTogU3RyaW5nQnVpbGRlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgY3VyclN0cjogc3RyaW5nO1xyXG4gICAgbGV0IGN1cnJDaGFyOiBzdHJpbmc7XHJcbiAgICBsZXQgcmVzdWx0OiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoTWF0aC5mbG9vcihzdHJlYW0uTGVuZ3RoIC8gMikpO1xyXG5cclxuICAgIGZvciAobGV0IGluZHg6IG51bWJlciA9IDA7IGluZHggPCBzdHJlYW0uTGVuZ3RoOyBpbmR4ID0gaW5keCArIDIpIHtcclxuICAgICAgY3VyclN0ciA9IHN0cmVhbS5nZXRfSXRlbShpbmR4KSArIHN0cmVhbS5nZXRfSXRlbShpbmR4ICsgMSk7XHJcbiAgICAgIGN1cnJDaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZShOTnVtYmVyLlBhcnNlKGN1cnJTdHIsIE51bWJlclN0eWxlcy5IZXhOdW1iZXIpKTtcclxuICAgICAgcmVzdWx0LkFwcGVuZChjdXJyQ2hhcik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0LlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdHJhbnNsYXRlIGJ5dGUgc3RyZWFtIHRvIFN0cmluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVN0cmVhbVRvU3RyaW5nXzEoc3RyZWFtOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIFJlY29yZFV0aWxzLmJ5dGVTdHJlYW1Ub1N0cmluZyhuZXcgU3RyaW5nQnVpbGRlcihzdHJlYW0pKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBzZXJpYWxpemVJdGVtVmFsKGl0ZW1WYWw6IHN0cmluZywgaXRlbUF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUpOiBVaW50OEFycmF5O1xyXG4gIHN0YXRpYyBzZXJpYWxpemVJdGVtVmFsKGl0ZW1WYWw6IHN0cmluZywgaXRlbUF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUsIGNlbGxBdHRyOiBTdG9yYWdlQXR0cmlidXRlLCB0b0Jhc2U2NDogYm9vbGVhbik6IHN0cmluZztcclxuICBzdGF0aWMgc2VyaWFsaXplSXRlbVZhbChpdGVtVmFsOiBzdHJpbmcsIGl0ZW1BdHRyOiBTdG9yYWdlQXR0cmlidXRlLCBjZWxsQXR0cj86IFN0b3JhZ2VBdHRyaWJ1dGUsIHRvQmFzZTY0PzogYm9vbGVhbik6IGFueSB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMilcclxuICAgICAgcmV0dXJuIFJlY29yZFV0aWxzLnNlcmlhbGl6ZUl0ZW1WYWxfMChpdGVtVmFsLCBpdGVtQXR0cik7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiBSZWNvcmRVdGlscy5zZXJpYWxpemVJdGVtVmFsXzEoaXRlbVZhbCwgaXRlbUF0dHIsIGNlbGxBdHRyLCB0b0Jhc2U2NCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBzZXJpYWxpemVJdGVtVmFsXzAoaXRlbVZhbDogc3RyaW5nLCBpdGVtQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSk6IFVpbnQ4QXJyYXkge1xyXG4gICAgRGVidWcuQXNzZXJ0KGl0ZW1WYWwgIT09IG51bGwpO1xyXG5cclxuICAgIGxldCB2YWx1ZVNpemU6IHN0cmluZztcclxuICAgIGxldCB0bXBCdWZMZW46IHN0cmluZyA9IE5TdHJpbmcuRW1wdHk7XHJcbiAgICBsZXQgdG1wQnVmOiBVaW50OEFycmF5ID0gbnVsbDtcclxuICAgIGxldCBjb250ZW50V2l0aExlbmd0aDogVWludDhBcnJheSA9IG51bGw7XHJcbiAgICBsZXQgcG9zOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGZsZFZhbExlbjogbnVtYmVyID0gMDtcclxuICAgIGxldCB0ZW1wSXRlbVZhbDogc3RyaW5nID0gTlN0cmluZy5FbXB0eTtcclxuICAgIGxldCBub09mUGFja2V0czogbnVtYmVyID0gMDtcclxuICAgIGxldCB0bXBOb09mUGFja2V0czogVWludDhBcnJheSA9IG51bGw7XHJcbiAgICBsZXQgdG1wU3RyTm9PZlBhY2tldHM6IHN0cmluZyA9IE5TdHJpbmcuRW1wdHk7XHJcblxyXG4gICAgc3dpdGNoIChpdGVtQXR0cikge1xyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQzpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkRBVEU6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5USU1FOlxyXG4gICAgICAgIGxldCBudW1UeXBlOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRShpdGVtVmFsKTtcclxuICAgICAgICB0bXBCdWYgPSBNaXNjLlRvQnl0ZUFycmF5KG51bVR5cGUuRGF0YSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjpcclxuICAgICAgICB0bXBCdWYgPSBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRFbmNvZGluZygpLkdldEJ5dGVzKGl0ZW1WYWwpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBOlxyXG4gICAgICAgIGl0ZW1WYWwgPSBTdHJVdGlsLnJ0cmltKGl0ZW1WYWwpO1xyXG4gICAgICAgIHZhbHVlU2l6ZSA9IFV0aWxTdHJCeXRlTW9kZS5sZW5CKGl0ZW1WYWwpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xyXG5cclxuICAgICAgICAvLyBhZGQgbGVhZGluZyB6ZXJvcyAoaWYgbmVlZGVkKVxyXG4gICAgICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCA0IC0gdmFsdWVTaXplLmxlbmd0aDsgaisrKVxyXG4gICAgICAgICAgdG1wQnVmTGVuICs9IFwiMFwiO1xyXG4gICAgICAgIHRtcEJ1ZkxlbiArPSB2YWx1ZVNpemU7XHJcblxyXG4gICAgICAgIHRtcEJ1ZiA9IG5ldyBVaW50OEFycmF5KEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldEVuY29kaW5nKCkuR2V0Qnl0ZXModG1wQnVmTGVuKS5sZW5ndGggKyBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRFbmNvZGluZygpLkdldEJ5dGVzKGl0ZW1WYWwpLmxlbmd0aCk7XHJcbiAgICAgICAgdG1wQnVmLnNldChHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRFbmNvZGluZygpLkdldEJ5dGVzKHRtcEJ1ZkxlbiksIDApO1xyXG4gICAgICAgIHRtcEJ1Zi5zZXQoR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0RW5jb2RpbmcoKS5HZXRCeXRlcyhpdGVtVmFsKSwgR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0RW5jb2RpbmcoKS5HZXRCeXRlcyh0bXBCdWZMZW4pLmxlbmd0aCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERTpcclxuICAgICAgICBpdGVtVmFsID0gU3RyVXRpbC5ydHJpbShpdGVtVmFsKTtcclxuICAgICAgICB2YWx1ZVNpemUgPSAoaXRlbVZhbC5sZW5ndGgudG9TdHJpbmcoMTYpKS50b1VwcGVyQ2FzZSgpO1xyXG5cclxuICAgICAgICAvLyBhZGQgbGVhZGluZyB6ZXJvcyAoaWYgbmVlZGVkKVxyXG4gICAgICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCA0IC0gdmFsdWVTaXplLmxlbmd0aDsgaisrKVxyXG4gICAgICAgICAgdG1wQnVmTGVuICs9IFwiMFwiO1xyXG4gICAgICAgIHRtcEJ1ZkxlbiArPSB2YWx1ZVNpemU7XHJcblxyXG4gICAgICAgIHRtcEJ1ZiA9IG5ldyBVaW50OEFycmF5KEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldEVuY29kaW5nKCkuR2V0Qnl0ZXModG1wQnVmTGVuKS5sZW5ndGggKyBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRFbmNvZGluZygpLkdldEJ5dGVzKGl0ZW1WYWwpLmxlbmd0aCk7XHJcbiAgICAgICAgdG1wQnVmLnNldChHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRFbmNvZGluZygpLkdldEJ5dGVzKHRtcEJ1ZkxlbiksIDApO1xyXG4gICAgICAgIHRtcEJ1Zi5zZXQoR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0RW5jb2RpbmcoKS5HZXRCeXRlcyhpdGVtVmFsKSwgR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0RW5jb2RpbmcoKS5HZXRCeXRlcyh0bXBCdWZMZW4pLmxlbmd0aCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQjpcclxuICAgICAgICBwb3MgPSAwO1xyXG4gICAgICAgIC8vIGJsb2Igd2lsbCBiZSBzZXJpYWxpemVkIGluIHBhY2tldCBvZiBzaXplIDB4RkZGRi5cclxuICAgICAgICAvLyBTbyBmb3JtYXQgb2Ygc2VyaWFsaXplZCBidWZmZXIgZm9yIGJsb2IgaXNcclxuICAgICAgICAvLyBuby4gb2YgcGFja2V0cyAobikgKyBsZW5ndGgxICsgZGF0YTEgKyBsZW5ndGgyICsgZGF0YTIgKyAuLi4uLi5sZW5ndGggbiArIGRhdGFuXHJcbiAgICAgICAgZmxkVmFsTGVuID0gSVNPXzg4NTlfMV9FbmNvZGluZy5JU09fODg1OV8xLkdldEJ5dGVDb3VudChpdGVtVmFsKTtcclxuXHJcbiAgICAgICAgbm9PZlBhY2tldHMgPSBNYXRoLmZsb29yKGZsZFZhbExlbiAvIDB4RkZGRik7XHJcblxyXG4gICAgICAgIHRtcEJ1ZkxlbiA9IFwiRkZGRlwiO1xyXG4gICAgICAgIHRtcE5vT2ZQYWNrZXRzID0gR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0RW5jb2RpbmcoKS5HZXRCeXRlcyh0bXBCdWZMZW4pO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgbm9PZlBhY2tldHM7IGkrKykge1xyXG4gICAgICAgICAgdGVtcEl0ZW1WYWwgPSBpdGVtVmFsLnN1YnN0cihwb3MsIDB4RkZGRik7XHJcbiAgICAgICAgICBwb3MgKz0gMHhGRkZGO1xyXG5cclxuICAgICAgICAgIGxldCB0ZW1wSXRlbVZhbEJ5dGVzOiBVaW50OEFycmF5ID0gSVNPXzg4NTlfMV9FbmNvZGluZy5JU09fODg1OV8xLkdldEJ5dGVzKHRlbXBJdGVtVmFsKTtcclxuICAgICAgICAgIGNvbnRlbnRXaXRoTGVuZ3RoID0gbmV3IFVpbnQ4QXJyYXkodG1wTm9PZlBhY2tldHMubGVuZ3RoICsgdGVtcEl0ZW1WYWxCeXRlcy5sZW5ndGgpO1xyXG4gICAgICAgICAgY29udGVudFdpdGhMZW5ndGguc2V0KHRtcE5vT2ZQYWNrZXRzKTtcclxuICAgICAgICAgIGNvbnRlbnRXaXRoTGVuZ3RoLnNldCh0ZW1wSXRlbVZhbEJ5dGVzLCB0bXBOb09mUGFja2V0cy5sZW5ndGgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGxhc3RQYWNrZXRTaXplOiBudW1iZXIgPSBmbGRWYWxMZW4gJSAweEZGRkY7XHJcblxyXG4gICAgICAgIGlmIChsYXN0UGFja2V0U2l6ZSA+IDApIHtcclxuICAgICAgICAgIHRlbXBJdGVtVmFsID0gaXRlbVZhbC5zdWJzdHIocG9zLCAoZmxkVmFsTGVuKSAtIChwb3MpKTtcclxuICAgICAgICAgIGxldCB0ZW1wSXRlbVZhbEJ5dGVzOiBVaW50OEFycmF5ID0gSVNPXzg4NTlfMV9FbmNvZGluZy5JU09fODg1OV8xLkdldEJ5dGVzKHRlbXBJdGVtVmFsKTtcclxuXHJcbiAgICAgICAgICB0bXBCdWZMZW4gPSBOU3RyaW5nLkZvcm1hdChTdHJpbmcuZnJvbUNoYXJDb2RlKHRlbXBJdGVtVmFsQnl0ZXMubGVuZ3RoKSwgXCJYNFwiKTtcclxuXHJcbiAgICAgICAgICBsZXQgdGVtcENvbnRlbnRXaXRoTGVuZ3RoOiBVaW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkgKGNvbnRlbnRXaXRoTGVuZ3RoLmxlbmd0aCArXHJcbiAgICAgICAgICAgIEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldEVuY29kaW5nKCkuR2V0Qnl0ZXModG1wQnVmTGVuKS5sZW5ndGggK1xyXG4gICAgICAgICAgICBJU09fODg1OV8xX0VuY29kaW5nLklTT184ODU5XzEuR2V0Qnl0ZXModGVtcEl0ZW1WYWwpLmxlbmd0aCk7XHJcbiAgICAgICAgICB0ZW1wQ29udGVudFdpdGhMZW5ndGguc2V0KGNvbnRlbnRXaXRoTGVuZ3RoKTtcclxuICAgICAgICAgIHRlbXBDb250ZW50V2l0aExlbmd0aC5zZXQoR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0RW5jb2RpbmcoKS5HZXRCeXRlcyh0bXBCdWZMZW4pLCBjb250ZW50V2l0aExlbmd0aC5sZW5ndGgpO1xyXG4gICAgICAgICAgdGVtcENvbnRlbnRXaXRoTGVuZ3RoLnNldChJU09fODg1OV8xX0VuY29kaW5nLklTT184ODU5XzEuR2V0Qnl0ZXModGVtcEl0ZW1WYWwpLCBjb250ZW50V2l0aExlbmd0aC5sZW5ndGggKyBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRFbmNvZGluZygpLkdldEJ5dGVzKHRtcEJ1ZkxlbikubGVuZ3RoKTtcclxuICAgICAgICAgIGNvbnRlbnRXaXRoTGVuZ3RoID0gdGVtcENvbnRlbnRXaXRoTGVuZ3RoO1xyXG4gICAgICAgICAgbm9PZlBhY2tldHMrKztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRtcFN0ck5vT2ZQYWNrZXRzID0gTlN0cmluZy5Gb3JtYXQoU3RyaW5nLmZyb21DaGFyQ29kZShub09mUGFja2V0cyksIFwiRDRcIik7XHJcbiAgICAgICAgdG1wTm9PZlBhY2tldHMgPSBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRFbmNvZGluZygpLkdldEJ5dGVzKHRtcFN0ck5vT2ZQYWNrZXRzKTtcclxuXHJcbiAgICAgICAgdG1wQnVmID0gbmV3IFVpbnQ4QXJyYXkgKGNvbnRlbnRXaXRoTGVuZ3RoLmxlbmd0aCArIHRtcE5vT2ZQYWNrZXRzLmxlbmd0aCk7XHJcbiAgICAgICAgdG1wQnVmLnNldCh0bXBOb09mUGFja2V0cyk7XHJcbiAgICAgICAgdG1wQnVmLnNldChjb250ZW50V2l0aExlbmd0aCwgdG1wTm9PZlBhY2tldHMubGVuZ3RoKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH0gLy8gZW5kIG9mIHRoZSB0eXBlIGNhc2UgYmxvY2tcclxuXHJcbiAgICByZXR1cm4gdG1wQnVmO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNlcmlhbGl6ZSBhbiBpdGVtIChmaWVsZC9nbG9iYWwgcGFyYW0vLi4uKSB0byBhbiBYTUwgZm9ybWF0IChhcHBsaWNhYmxlIHRvIGJlIHBhc3NlZCB0byB0aGUgc2VydmVyKS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXRlbVZhbFwiPml0ZW0ncyB2YWx1ZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpdGVtQXR0clwiPml0ZW0ncyBhdHRyaWJ1dGU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY2VsbEF0dHJcIj5jZWxsJ3MgYXR0cmlidXRlIC0gcmVsZXZhbnQgb25seSBpZiAnaXRlbUF0dHInIGlzIHZlY3RvcjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0b0Jhc2U2NFwiPmRlY2lkZSBCYXNlNjQgZW5jb2RpbmcgaXMgdG8gYmUgZG9uZTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPnNlcmlhbGl6ZWQgYnVmZmVyPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgc3RhdGljIHNlcmlhbGl6ZUl0ZW1WYWxfMShpdGVtVmFsOiBzdHJpbmcsIGl0ZW1BdHRyOiBTdG9yYWdlQXR0cmlidXRlLCBjZWxsQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSwgdG9CYXNlNjQ6IGJvb2xlYW4pOiBzdHJpbmcge1xyXG4gICAgRGVidWcuQXNzZXJ0KGl0ZW1WYWwgIT0gbnVsbCk7XHJcblxyXG4gICAgbGV0IHNpZ25pZmljYW50TnVtU2l6ZTogbnVtYmVyID0gR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0U2lnbmlmaWNhbnROdW1TaXplKCkgKiAyO1xyXG5cclxuICAgIGxldCB2YWx1ZVNpemU6IHN0cmluZztcclxuICAgIGxldCBqOiBudW1iZXI7XHJcbiAgICBsZXQgdG1wQnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgIGxldCBwb3M6IG51bWJlcjtcclxuICAgIGxldCBmbGRWYWxMZW46IG51bWJlciA7XHJcblxyXG4gICAgLy8gZm9yIGFscGhhIHR5cGUgYWRkIHRoZSBsZW5ndGggb2YgdGhlIHZhbHVlIGFzIGhleCBudW1iZXIgb2YgNCBkaWdpdHNcclxuICAgIHN3aXRjaCAoaXRlbUF0dHIpIHtcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5EQVRFOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVElNRTpcclxuICAgICAgICBpdGVtVmFsID0gIXRvQmFzZTY0XHJcbiAgICAgICAgICA/IGl0ZW1WYWwuc3Vic3RyKDAsIHNpZ25pZmljYW50TnVtU2l6ZSlcclxuICAgICAgICAgIDogQmFzZTY0LmVuY29kZSh0aGlzLmJ5dGVTdHJlYW1Ub1N0cmluZyhpdGVtVmFsLnN1YnN0cigwLCBzaWduaWZpY2FudE51bVNpemUpKSwgR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0RW5jb2RpbmcoKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFOlxyXG4gICAgICAgIGl0ZW1WYWwgPSBTdHJVdGlsLnJ0cmltKGl0ZW1WYWwpO1xyXG4gICAgICAgIHBvcyA9IDA7XHJcbiAgICAgICAgZmxkVmFsTGVuID0gaXRlbVZhbC5sZW5ndGg7XHJcblxyXG4gICAgICAgIGRvIHtcclxuICAgICAgICAgIGxldCBudWxsQ2hyUG9zOiBudW1iZXIgPSBpdGVtVmFsLmluZGV4T2YoU3RyaW5nLmZyb21DaGFyQ29kZSgwKSwgcG9zKTtcclxuICAgICAgICAgIGlmIChudWxsQ2hyUG9zID09PSAtMSkge1xyXG4gICAgICAgICAgICB2YWx1ZVNpemUgPSAoZmxkVmFsTGVuIC0gcG9zKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgLy8gYWRkIGxlYWRpbmcgemVyb3MgKGlmIG5lZWRlZClcclxuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDQgLSB2YWx1ZVNpemUubGVuZ3RoOyBqKyspXHJcbiAgICAgICAgICAgICAgdG1wQnVmLkFwcGVuZCgnMCcpO1xyXG4gICAgICAgICAgICB0bXBCdWYuQXBwZW5kKHZhbHVlU2l6ZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAocG9zID4gMClcclxuICAgICAgICAgICAgICBpdGVtVmFsID0gaXRlbVZhbC5zdWJzdHIocG9zLCAoZmxkVmFsTGVuKSAtIChwb3MpKTtcclxuXHJcbiAgICAgICAgICAgIHBvcyA9IGZsZFZhbExlbjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBJZiBOVUxMIGNoYXJzIGV4aXN0IGluIHRoZSBtaWRkbGUgb2YgdGhlIHZhbHVlIC0gY3JlYXRlIGEgc3Bhbm5lZCByZWNvcmRcclxuICAgICAgICAgICAgLy8gVHVybiBvbiB0aGUgaGlnaCBtb3N0IGJpdCBpbiB0aGUgbGVuZ3RoICh0byBpbmRpY2F0ZSBhIHNlZ21lbnQpXHJcbiAgICAgICAgICAgIHZhbHVlU2l6ZSA9IChudWxsQ2hyUG9zIC0gcG9zICsgMHg4MDAwKS50b1N0cmluZyAoMTYpLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgICAgIHRtcEJ1Zi5BcHBlbmQodmFsdWVTaXplKTtcclxuICAgICAgICAgICAgdG1wQnVmLkFwcGVuZChpdGVtVmFsLnN1YnN0cihwb3MsIChudWxsQ2hyUG9zKSAtIChwb3MpKSk7XHJcblxyXG4gICAgICAgICAgICAvLyBDb3VudCBudW1iZXIgb2YgY29uc2VjdXRpdmUgTlVMTCBjaGFycywgYW5kIGFkZCB0aGVpciBjb3VudCB0byBYTUxcclxuICAgICAgICAgICAgZm9yIChqID0gMTsgaiA8IGZsZFZhbExlbiAtIG51bGxDaHJQb3MgJiYgaXRlbVZhbC5jaGFyQ29kZUF0KG51bGxDaHJQb3MgKyBqKSA9PT0gMDsgaisrKSB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gYWRkIGxlYWRpbmcgemVyb3MgKGlmIG5lZWRlZClcclxuICAgICAgICAgICAgdmFsdWVTaXplID0gXCIwMDAwXCIgKyAoai50b1N0cmluZygxNikpLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgICAgIHRtcEJ1Zi5BcHBlbmQodmFsdWVTaXplLnN1YnN0cih2YWx1ZVNpemUubGVuZ3RoIC0gNCkpO1xyXG5cclxuICAgICAgICAgICAgLy8gQXBwZW5kIGEgaGV4IGR1bXAgb2Ygc3BlY2lhbCBjaGFyc1xyXG4gICAgICAgICAgICBmb3IgKHBvcyA9IG51bGxDaHJQb3M7IGogPiAwOyBqLS0sIHBvcysrKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHRtcFN0cjogc3RyaW5nID0gXCIwXCIgKyBpdGVtVmFsLmNoYXJDb2RlQXQobnVsbENoclBvcykudG9TdHJpbmcoMTYpO1xyXG4gICAgICAgICAgICAgIHRtcEJ1Zi5BcHBlbmQodG1wU3RyLnN1YnN0cih0bXBTdHIubGVuZ3RoIC0gMikpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBJZiBzcGVjaWFsIGNoYXJzIHdlcmUgbGFzdCwgYWRkIHRoZSBsZW5ndGggb2YgdGhlIGxhc3Qgc2VnbWVudCAoemVybylcclxuICAgICAgICAgICAgaWYgKHBvcyA+PSBmbGRWYWxMZW4pIHtcclxuICAgICAgICAgICAgICB0bXBCdWYuQXBwZW5kKFwiMDAwMFwiKTtcclxuICAgICAgICAgICAgICBpdGVtVmFsID0gXCJcIjtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gd2hpbGUgKHBvcyA8IGZsZFZhbExlbik7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQjpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuRE9UTkVUOlxyXG4gICAgICAgIHBvcyA9IDA7XHJcblxyXG4gICAgICAgIGZsZFZhbExlbiA9IGl0ZW1WYWwubGVuZ3RoO1xyXG5cclxuICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSAmJiBpdGVtQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikge1xyXG4gICAgICAgICAgaWYgKGNlbGxBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBIHx8IGNlbGxBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLk1FTU8pIHtcclxuICAgICAgICAgICAgaXRlbVZhbCA9IFZlY3RvclR5cGVCYXNlLmFkanVzdEFscGhhU3RyaW5nc0luRmxhdERhdGEoaXRlbVZhbCk7XHJcblxyXG4gICAgICAgICAgICAvLyBUaGUgZmxhdCBkYXRhIHdpbGwgYmUgZGl2aWRlZCBieSAweDNGRkYgY2hhcmFjdGVycy5cclxuICAgICAgICAgICAgLy8gRWFjaCBzZWdtZW50IHdpbGwgYmUgc2l6ZSBpbiAweDNGRkYgfiAweDdGRkYgYnl0ZXMuXHJcbiAgICAgICAgICAgIC8vIFRoZSBzaXplIGRlcGVuZHMgb24gdGhlIG51bWJlciBvZiBEQkNTIGNoYXJhY3RlcnMsIG5vdCBmaXhlZCBpbiAweDdGRkYuXHJcbiAgICAgICAgICAgIGRvIHtcclxuICAgICAgICAgICAgICBpZiAoaXRlbVZhbC5sZW5ndGggPCBwb3MgKyAweDNGRkYpXHJcbiAgICAgICAgICAgICAgLy8gKDB4ODAwMCAtIDEpIC8gMiA9IDB4M0ZGRlxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmIChwb3MgPiAwKVxyXG4gICAgICAgICAgICAgICAgICBpdGVtVmFsID0gaXRlbVZhbC5zdWJzdHIocG9zKTtcclxuXHJcbiAgICAgICAgICAgICAgICB2YWx1ZVNpemUgPSAoVXRpbFN0ckJ5dGVNb2RlLmxlbkIoaXRlbVZhbCkudG9TdHJpbmcoMTYpKS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgLy8gYWRkIGxlYWRpbmcgemVyb3MgKGlmIG5lZWRlZClcclxuICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0IC0gdmFsdWVTaXplLmxlbmd0aDsgaisrKVxyXG4gICAgICAgICAgICAgICAgICB0bXBCdWYuQXBwZW5kKCcwJyk7XHJcbiAgICAgICAgICAgICAgICB0bXBCdWYuQXBwZW5kKHZhbHVlU2l6ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gaGV4IGVuY29kaW5nXHJcbiAgICAgICAgICAgICAgICBpdGVtVmFsID0gIXRvQmFzZTY0XHJcbiAgICAgICAgICAgICAgICAgID8gU3RyVXRpbC5zdHJpbmdUb0hleGFEdW1wKGl0ZW1WYWwsIDQpXHJcbiAgICAgICAgICAgICAgICAgIDogQmFzZTY0LmVuY29kZShpdGVtVmFsLCB0cnVlLCBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRFbmNvZGluZygpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBwb3MgPSBmbGRWYWxMZW47XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGV0IHN0clN1Yjogc3RyaW5nID0gaXRlbVZhbC5zdWJzdHIocG9zLCAweDNGRkYpO1xyXG4gICAgICAgICAgICAgICAgLy8gKyAweDgwMDAgLi4uIHRvIGluZGljYXRlIG5vdCB0aGUgbGFzdCBzZWdtZW50XHJcbiAgICAgICAgICAgICAgICB2YWx1ZVNpemUgPSAoKFV0aWxTdHJCeXRlTW9kZS5sZW5CKHN0clN1YikgKyAweDgwMDApLnRvU3RyaW5nKDE2KSkudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgIHRtcEJ1Zi5BcHBlbmQodmFsdWVTaXplKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBoZXggb3IgYmFzZTY0IGVuY29kaW5nXHJcbiAgICAgICAgICAgICAgICB0bXBCdWYuQXBwZW5kKCF0b0Jhc2U2NFxyXG4gICAgICAgICAgICAgICAgICA/IFN0clV0aWwuc3RyaW5nVG9IZXhhRHVtcChzdHJTdWIsIDQpXHJcbiAgICAgICAgICAgICAgICAgIDogQmFzZTY0LmVuY29kZShzdHJTdWIsIHRydWUsIEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldEVuY29kaW5nKCkpKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0bXBCdWYuQXBwZW5kKFwiMDAwMFwiKTtcclxuICAgICAgICAgICAgICAgIHBvcyArPSAweDNGRkY7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IHdoaWxlIChwb3MgPCBmbGRWYWxMZW4pIDtcclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgaWYgKGZsZFZhbExlbiA8IHBvcyArIDB4N0ZGRilcclxuICAgICAgICAgIC8vIDB4ODAwMCAtMSA9IDB4N0ZGRlxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB2YWx1ZVNpemUgPSAoKGZsZFZhbExlbiAtIHBvcykudG9TdHJpbmcoMTYpKS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgICAgICAvLyBhZGQgbGVhZGluZyB6ZXJvcyAoaWYgbmVlZGVkKVxyXG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNCAtIHZhbHVlU2l6ZS5sZW5ndGg7IGorKylcclxuICAgICAgICAgICAgICB0bXBCdWYuQXBwZW5kKCcwJyk7XHJcbiAgICAgICAgICAgIHRtcEJ1Zi5BcHBlbmQodmFsdWVTaXplKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChwb3MgPiAwKVxyXG4gICAgICAgICAgICAgIGl0ZW1WYWwgPSBpdGVtVmFsLnN1YnN0cihwb3MsIChmbGRWYWxMZW4pIC0gKHBvcykpO1xyXG5cclxuICAgICAgICAgICAgLy8gaGV4IGVuY29kaW5nXHJcbiAgICAgICAgICAgIGl0ZW1WYWwgPSAhdG9CYXNlNjRcclxuICAgICAgICAgICAgICA/IFN0clV0aWwuc3RyaW5nVG9IZXhhRHVtcChpdGVtVmFsLCA0KVxyXG4gICAgICAgICAgICAgIDogQmFzZTY0LmVuY29kZShpdGVtVmFsLCBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRFbmNvZGluZygpKTtcclxuXHJcbiAgICAgICAgICAgIHBvcyA9IGZsZFZhbExlbjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyB0byBpbmRpY2F0ZSB0aGUgZnVsbCBzZWdtZW50XHJcbiAgICAgICAgICAgIHZhbHVlU2l6ZSA9IFwiRkZGRlwiOyAvLyAoSW50ZWdlci50b0hleFN0cmluZyAoMHhGRkZGKSkudG9VcHBlckNhc2UoKVxyXG4gICAgICAgICAgICB0bXBCdWYuQXBwZW5kKHZhbHVlU2l6ZSk7XHJcblxyXG4gICAgICAgICAgICAvLyBoZXggb3IgYmFzZTY0IGVuY29kaW5nXHJcbiAgICAgICAgICAgIGlmICghdG9CYXNlNjQpXHJcbiAgICAgICAgICAgICAgdG1wQnVmLkFwcGVuZChTdHJVdGlsLnN0cmluZ1RvSGV4YUR1bXAoaXRlbVZhbC5zdWJzdHIocG9zLCAweDdGRkYpLCA0KSk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICB0bXBCdWYuQXBwZW5kKEJhc2U2NC5lbmNvZGUoaXRlbVZhbC5zdWJzdHIocG9zLCAweDdGRkYpLCBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRFbmNvZGluZygpKSk7XHJcblxyXG4gICAgICAgICAgICB0bXBCdWYuQXBwZW5kKFwiMDAwMFwiKTtcclxuICAgICAgICAgICAgcG9zICs9IDB4N0ZGRjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IHdoaWxlIChwb3MgPCBmbGRWYWxMZW4pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfSAvLyBlbmQgb2YgdGhlIHR5cGUgY2FzZSBibG9ja1xyXG4gICAgdG1wQnVmLkFwcGVuZChpdGVtVmFsKTtcclxuICAgIHJldHVybiB0bXBCdWYuVG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gRGVzZXJpYWxpemVzIGFuIGl0ZW0ncyAoZmllbGQvZ2xvYmFsIHBhcmFtLy4uLikgdmFsdWUgPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIml0ZW1WYWxcIj5pdGVtJ3MgdmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIml0ZW1BdHRyXCI+aXRlbSdzIGF0dHJpYnV0ZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXRlbUxlblwiPml0ZW0ncyBsZW5ndGg8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInVzZUhleFwiPmluZGljYXRlcyB3aGV0aGVyIHRoZSBpdGVtVmFsIGlzIGluIEhleCBvciBCYXNlNjQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNlbGxBdHRyXCI+Y2VsbCdzIGF0dHJpYnV0ZSAtIHJlbGV2YW50IG9ubHkgaWYgJ2l0ZW1BdHRyJyBpcyB2ZWN0b3I8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInBhcnNlZExlblwiPm91dCBwYXJhbWV0ZXIuIFJldHVybnMgdGhlIGxlbmd0aCBvZiBpdGVtVmFsIHBhcnNlZDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgZGVTZXJpYWxpemVJdGVtVmFsKGl0ZW1WYWw6IHN0cmluZywgaXRlbUF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUsIGl0ZW1MZW46IG51bWJlciwgdXNlSGV4OiBib29sZWFuLCBjZWxsQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSwgcGFyc2VkTGVuOiBSZWZQYXJhbTxudW1iZXI+KTogc3RyaW5nIHtcclxuICAgIGxldCB2YWw6IHN0cmluZyA9IG51bGw7XHJcbiAgICBsZXQgaWR4OiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGxlbjogbnVtYmVyLCBlbmRJZHg6IG51bWJlcjtcclxuICAgIGxldCBzdWZmaXhCdWY6IFN0cmluZ0J1aWxkZXIgPSBudWxsO1xyXG4gICAgbGV0IHRtcDogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgICBpZiAoaXRlbUF0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEFcclxuICAgICAgfHwgaXRlbUF0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERVxyXG4gICAgICB8fCBpdGVtQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CXHJcbiAgICAgIHx8IGl0ZW1BdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SXHJcbiAgICAgIHx8IGl0ZW1BdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkRPVE5FVFxyXG4gICAgKSB7XHJcbiAgICAgIC8vIGZpcnN0IDQgY2hhcmFjdGVycyBhcmUgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIChoZXggbnVtYmVyKVxyXG4gICAgICBlbmRJZHggPSBpZHggKyA0O1xyXG4gICAgICB0bXAgPSBpdGVtVmFsLnN1YnN0cihpZHgsIChlbmRJZHgpIC0gKGlkeCkpO1xyXG4gICAgICBsZW4gPSBOTnVtYmVyLlBhcnNlKHRtcCwgTnVtYmVyU3R5bGVzLkhleE51bWJlcik7XHJcbiAgICAgIGlkeCA9IGVuZElkeDtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGl0ZW1BdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU4pXHJcbiAgICAgIGxlbiA9IDE7XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IHNpZ25pZmljYW50TnVtU2l6ZTogbnVtYmVyID0gR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0U2lnbmlmaWNhbnROdW1TaXplKCk7XHJcbiAgICAgIGlmICh1c2VIZXgpXHJcbiAgICAgICAgbGVuID0gc2lnbmlmaWNhbnROdW1TaXplICogMjtcclxuICAgICAgZWxzZVxyXG4gICAgICAvLyBpZiB3b3JraW5nIGluIGJhc2U2NFxyXG4gICAgICAgIGxlbiA9IChNYXRoLmZsb29yKChzaWduaWZpY2FudE51bVNpemUgKyAyKSAvIDMpICogNCk7XHJcbiAgICB9XHJcbiAgICAvLyBPb3BzLCBkaWQgd2UgYnVtcGVkIGludG8gYSBzcGFubmVkIHJlY29yZCAoV2UgaWRlbnRpZnkgaXQgd2hlbiB0aGUgaGlnaC1tb3N0IGJpdCBpcyBvbik/XHJcbiAgICBpZiAoKGxlbiAmIDB4ODAwMCkgPiAwKSB7XHJcbiAgICAgIHN1ZmZpeEJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICAgIGxlbiA9IChsZW4gJiAweDdGRkYpO1xyXG5cclxuICAgICAgaWYgKGl0ZW1BdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IgfHwgaXRlbUF0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1JcclxuICAgICAgICB8fCBpdGVtQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5ET1RORVQpXHJcbiAgICAgICAgaWYgKHVzZUhleClcclxuICAgICAgICAgIGxlbiAqPSAyO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGxlbiA9IChNYXRoLmZsb29yKChsZW4gKyAyKSAvIDMpICogNCk7XHJcblxyXG4gICAgICBwYXJzZWRMZW4udmFsdWUgPSB0aGlzLmdldFNwYW5uZWRGaWVsZChpdGVtVmFsLCBsZW4sIGlkeCwgaXRlbUF0dHIsIHN1ZmZpeEJ1ZiwgdXNlSGV4KTtcclxuICAgICAgdmFsID0gc3VmZml4QnVmLlRvU3RyaW5nKCk7XHJcbiAgICAgIGVuZElkeCA9IGlkeCArIHBhcnNlZExlbi52YWx1ZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoaXRlbUF0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQlxyXG4gICAgICAgIHx8IGl0ZW1BdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SXHJcbiAgICAgICAgfHwgaXRlbUF0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuRE9UTkVUXHJcbiAgICAgIClcclxuICAgICAgICBpZiAodXNlSGV4KVxyXG4gICAgICAgICAgbGVuICo9IDI7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgbGVuID0gKE1hdGguZmxvb3IoKGxlbiArIDIpIC8gMykgKiA0KTtcclxuXHJcbiAgICAgIGVuZElkeCA9IGlkeCArIGxlbjtcclxuICAgICAgaWYgKGVuZElkeCA+IGl0ZW1WYWwubGVuZ3RoKVxyXG4gICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFJlY29yZC5maWxsRmllbGRzRGF0YSgpIGRhdGEgc3RyaW5nIHRvbyBzaG9ydDpcXG5cIiArIGl0ZW1WYWwpO1xyXG5cclxuICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkgJiYgaXRlbUF0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpXHJcbiAgICAgICAgdmFsID0gdGhpcy5nZXRTdHJpbmcoaXRlbVZhbC5zdWJzdHIoaWR4LCAoZW5kSWR4KSAtIChpZHgpKSwgaXRlbUF0dHIsIHVzZUhleCwgKGNlbGxBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBKSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB2YWwgPSB0aGlzLmdldFN0cmluZyhpdGVtVmFsLnN1YnN0cihpZHgsIChlbmRJZHgpIC0gKGlkeCkpLCBpdGVtQXR0ciwgdXNlSGV4KTtcclxuICAgIH1cclxuXHJcbiAgICBpZHggPSBlbmRJZHg7XHJcblxyXG4gICAgaWYgKGl0ZW1BdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBIHx8IGl0ZW1BdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUpIHtcclxuICAgICAgbGVuID0gaXRlbUxlbjtcclxuICAgICAgdmFsID0gU3RyVXRpbC5wYWRTdHIodmFsLCBsZW4pO1xyXG5cclxuICAgICAgaWYgKGl0ZW1BdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBICYmIFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkpXHJcbiAgICAgICAgdmFsID0gVXRpbFN0ckJ5dGVNb2RlLmxlZnRCKHZhbCwgbGVuKTtcclxuICAgIH1cclxuXHJcbiAgICBwYXJzZWRMZW4udmFsdWUgPSBlbmRJZHg7XHJcbiAgICByZXR1cm4gdmFsO1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0U3RyaW5nKHN0cjogc3RyaW5nLCB0eXBlOiBTdG9yYWdlQXR0cmlidXRlKTogc3RyaW5nO1xyXG4gIHN0YXRpYyBnZXRTdHJpbmcoc3RyOiBzdHJpbmcsIHR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUsIHVzZUhleDogYm9vbGVhbik6IHN0cmluZztcclxuICBzdGF0aWMgZ2V0U3RyaW5nKHN0cjogc3RyaW5nLCB0eXBlOiBTdG9yYWdlQXR0cmlidXRlLCB1c2VIZXg6IGJvb2xlYW4sIHVzZUVudkNoYXJzZXQ6IGJvb2xlYW4pOiBzdHJpbmc7XHJcbiAgc3RhdGljIGdldFN0cmluZyhzdHI6IHN0cmluZywgdHlwZTogU3RvcmFnZUF0dHJpYnV0ZSwgdXNlSGV4PzogYm9vbGVhbiwgdXNlRW52Q2hhcnNldD86IGJvb2xlYW4pOiBzdHJpbmcge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpXHJcbiAgICAgIHJldHVybiBSZWNvcmRVdGlscy5nZXRTdHJpbmdfMChzdHIsIHR5cGUsIHVzZUhleCk7XHJcblxyXG4gICAgaWYoYXJndW1lbnRzLmxlbmd0aCA9PT0gMilcclxuICAgICAgcmV0dXJuIFJlY29yZFV0aWxzLmdldFN0cmluZ18yKHN0ciwgdHlwZSk7XHJcblxyXG4gICAgcmV0dXJuIFJlY29yZFV0aWxzLmdldFN0cmluZ18xKHN0ciwgdHlwZSwgdXNlSGV4LCB1c2VFbnZDaGFyc2V0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gcmlnaHQgc3RyaW5nIGluIGNvbmZpZGVuY2Ugd2l0aCB0aGUgdHlwZTwvcmV0dXJucz5cclxuICBwcml2YXRlIHN0YXRpYyBnZXRTdHJpbmdfMChzdHI6IHN0cmluZywgdHlwZTogU3RvcmFnZUF0dHJpYnV0ZSwgdXNlSGV4OiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBSZWNvcmRVdGlscy5nZXRTdHJpbmcoc3RyLCB0eXBlLCB1c2VIZXgsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gcmlnaHQgc3RyaW5nIGluIGNvbmZpZGVuY2Ugd2l0aCB0aGUgdHlwZTwvcmV0dXJucz5cclxuICBwcml2YXRlIHN0YXRpYyBnZXRTdHJpbmdfMShzdHI6IHN0cmluZywgdHlwZTogU3RvcmFnZUF0dHJpYnV0ZSwgdXNlSGV4OiBib29sZWFuLCB1c2VFbnZDaGFyc2V0OiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIGxldCByZXN1bHQ6IHN0cmluZztcclxuICAgIGlmICh1c2VIZXgpIHtcclxuICAgICAgaWYgKHR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQiB8fCB0eXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SXHJcbiAgICAgICAgfHwgdHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5ET1RORVQpXHJcbiAgICAgICAgcmVzdWx0ID0gUmVjb3JkVXRpbHMuYnl0ZVN0cmVhbVRvU3RyaW5nKHN0cik7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICByZXN1bHQgPSBzdHI7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQiB8fCB0eXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SXHJcbiAgICAgICAgfHwgdHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5ET1RORVQpXHJcbiAgICAgICAgcmVzdWx0ID0gQmFzZTY0LmRlY29kZShzdHIsIHVzZUVudkNoYXJzZXQgPyBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRFbmNvZGluZygpIDogbnVsbCk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICByZXN1bHQgPSBCYXNlNjQuZGVjb2RlVG9IZXgoc3RyKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0U3Bhbm5lZEZpZWxkKGZsZHNWYWw6IHN0cmluZywgZmlyc3RTZWdMZW46IG51bWJlciwgaWR4OiBudW1iZXIsIHR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUsIHJlc3VsdDogU3RyaW5nQnVpbGRlciwgdXNlSGV4OiBib29sZWFuKTogbnVtYmVyO1xyXG4gIHN0YXRpYyBnZXRTcGFubmVkRmllbGQoZmxkc1ZhbDogVWludDhBcnJheSwgZmlyc3RTZWdMZW46IG51bWJlciwgaWR4OiBudW1iZXIsIHR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUsIHJlc3VsdDogU3RyaW5nQnVpbGRlciwgdXNlSGV4OiBib29sZWFuLCBub09mUGFja2V0czogbnVtYmVyKTogbnVtYmVyO1xyXG4gIHN0YXRpYyBnZXRTcGFubmVkRmllbGQoZmxkc1ZhbDogYW55LCBmaXJzdFNlZ0xlbjogbnVtYmVyLCBpZHg6IG51bWJlciwgdHlwZTogU3RvcmFnZUF0dHJpYnV0ZSwgcmVzdWx0OiBTdHJpbmdCdWlsZGVyLCB1c2VIZXg6IGJvb2xlYW4sIG5vT2ZQYWNrZXRzPzogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA2KVxyXG4gICAgICByZXR1cm4gUmVjb3JkVXRpbHMuZ2V0U3Bhbm5lZEZpZWxkXzAoZmxkc1ZhbCwgZmlyc3RTZWdMZW4sIGlkeCwgdHlwZSwgcmVzdWx0LCB1c2VIZXgpO1xyXG5cclxuICAgIHJldHVybiBSZWNvcmRVdGlscy5nZXRTcGFubmVkRmllbGRfMShmbGRzVmFsLCBmaXJzdFNlZ0xlbiwgaWR4LCB0eXBlLCByZXN1bHQsIHVzZUhleCwgbm9PZlBhY2tldHMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRyYW5zbGF0ZSBYTUwgLT4gZmllbGQgdmFsdWUgZm9yIGEgc3Bhbm5lZCBBTFBIQSBmaWVsZCwgYW5kIHJldHVybiB0aGUgYWN0dWFsXHJcbiAgLy8vICAgZmllbGQncyBsZW5ndGguIEEgc3Bhbm5lZCBmaWVsZCBtYXkgYmUgYWNjZXB0ZWQgZnJvbSB0aGUgc2VydmVyIHdoZW4gYW5cclxuICAvLy8gICBBTFBIQSBpbmNsdWRlcyBzcGVjaWFsIGNoYXJzIHN1Y2ggYXMgTlVMTCB3aGljaCBjYW5ub3QgYmUgZXNjYXBlZCB1c2luZyBhICdcXCcgKGxpa2UsXHJcbiAgLy8vICAgZm9yIGV4YW1wbGUsICdcXFwiJykuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZHNWYWxcIj5zdHJpbmcgZm9yIHBhcnNpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmlyc3RTZWdMZW5cIj5sZW5ndGggKGluIGNoYXJzKSBvZiBmaXJzdCBzZWdtZW50LjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj5pbmRleCBpbiBzdHJpbmcsIGZyb20gd2hpY2ggdGhlIGZpcnN0IHNlZ21lbnRzIGRhdGEgc3RhcnRzLjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0eXBlXCI+b2YgdmFyaWFibGUgaXMgbG9va2luZyBmb3I8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVzdWx0XCI+dGhlIHJlc3VsdCBzdHJpbmcsIHdoaWNoIHdpbGwgY29udGFpbiB0aGUgcGFyc2VkIGZpZWxkIGNvbnRlbnQuPC9wYXJhbT5cclxuICBwcml2YXRlIHN0YXRpYyBnZXRTcGFubmVkRmllbGRfMChmbGRzVmFsOiBzdHJpbmcsIGZpcnN0U2VnTGVuOiBudW1iZXIsIGlkeDogbnVtYmVyLCB0eXBlOiBTdG9yYWdlQXR0cmlidXRlLCByZXN1bHQ6IFN0cmluZ0J1aWxkZXIsIHVzZUhleDogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICBsZXQgZW5kSWR4OiBudW1iZXIgPSBpZHggKyBmaXJzdFNlZ0xlbjtcclxuICAgIGxldCBsZW46IG51bWJlcjtcclxuICAgIGxldCBiZWdpbjogbnVtYmVyID0gaWR4O1xyXG4gICAgbGV0IGFzY2lpQ29kZTogc3RyaW5nO1xyXG4gICAgbGV0IHRtcDogc3RyaW5nO1xyXG4gICAgbGV0IHN1ZmZpeEJ1ZjogU3RyaW5nQnVpbGRlciA9IG51bGw7XHJcbiAgICBsZXQgcGFyc2VkTGVuOiBudW1iZXI7XHJcblxyXG4gICAgaWYgKGVuZElkeCA+IGZsZHNWYWwubGVuZ3RoKSB7XHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFJlY29yZC5nZXRTcGFubmVkRmllbGQoKSBkYXRhIHN0cmluZyB0b28gc2hvcnQ6XFxuXCIgKyBmbGRzVmFsKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhcHBlbmQgZmlyc3Qgc2VnbWVudFxyXG4gICAgcmVzdWx0LlJlbW92ZSgwLCByZXN1bHQuTGVuZ3RoKTtcclxuICAgIHJlc3VsdC5BcHBlbmQoUmVjb3JkVXRpbHMuZ2V0U3RyaW5nKGZsZHNWYWwuc3Vic3RyKGlkeCwgZW5kSWR4IC0gaWR4KSwgdHlwZSwgdXNlSGV4KSk7XHJcblxyXG4gICAgaWR4ID0gaWR4ICsgZmlyc3RTZWdMZW47XHJcblxyXG4gICAgLy8gbmV4dCA0IGNoYXJhY3RlcnMgYXJlIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyAoaGV4IG51bWJlcikgb2Ygc3BlY2lhbCBieXRlcy5cclxuICAgIGVuZElkeCA9IGlkeCArIDQ7XHJcbiAgICB0bXAgPSBmbGRzVmFsLnN1YnN0cihpZHgsIGVuZElkeCAtIGlkeCk7XHJcbiAgICBsZW4gPSBOTnVtYmVyLlBhcnNlKHRtcCwgTnVtYmVyU3R5bGVzLkhleE51bWJlcik7XHJcbiAgICBpZHggPSBlbmRJZHg7XHJcblxyXG4gICAgLy8gaWYgd29ya2luZyBpbiBoZXhcclxuICAgIGlmICh1c2VIZXgpXHJcbiAgICAgIGVuZElkeCA9IGlkeCArIGxlbiAqIDI7XHJcbiAgICBlbHNlXHJcbiAgICAgIGVuZElkeCA9IGlkeCArIE1hdGguZmxvb3IoKGxlbiArIDIpIC8gMyApICogNDtcclxuXHJcbiAgICBpZiAoZW5kSWR4ID4gZmxkc1ZhbC5sZW5ndGgpXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFJlY29yZC5nZXRTcGFubmVkRmllbGQoKSBkYXRhIHN0cmluZyB0b28gc2hvcnQ6XFxuXCIgKyBmbGRzVmFsKTtcclxuXHJcbiAgICAvLyBhcHBlbmQgc3BlY2lhbCBjaGFycywgb25lIGJ5IG9uZVxyXG4gICAgd2hpbGUgKGlkeCA8IGVuZElkeCkge1xyXG4gICAgICB0bXAgPSBmbGRzVmFsLnN1YnN0cihpZHgsIDIpO1xyXG4gICAgICBhc2NpaUNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKE5OdW1iZXIuUGFyc2UodG1wLCBOdW1iZXJTdHlsZXMuSGV4TnVtYmVyKSk7XHJcbiAgICAgIHJlc3VsdC5BcHBlbmQoYXNjaWlDb2RlKTtcclxuICAgICAgaWR4ID0gaWR4ICsgMjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBuZXh0IDQgY2hhcnMgYXJlIHRoZSBsZW5ndGggb2YgbmV4dCBzZWdtZW50XHJcbiAgICBlbmRJZHggPSBpZHggKyA0O1xyXG4gICAgdG1wID0gZmxkc1ZhbC5zdWJzdHIoaWR4LCBlbmRJZHggLSBpZHgpO1xyXG4gICAgbGVuID0gTk51bWJlci5QYXJzZSh0bXAsIE51bWJlclN0eWxlcy5IZXhOdW1iZXIpO1xyXG4gICAgaWR4ID0gZW5kSWR4O1xyXG5cclxuICAgIGlmICgobGVuICYgMHg4MDAwKSA+IDApIHtcclxuICAgICAgLy8gT29wcywgbmV4dCBzZWdtZW50IG1heSBhbHNvIGJlIHNwYW5uZWRcclxuICAgICAgc3VmZml4QnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgICAgbGVuID0gKGxlbiAmIDB4N0ZGRik7XHJcblxyXG4gICAgICBpZiAodHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CIHx8IHR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpXHJcbiAgICAgICAgaWYgKHVzZUhleClcclxuICAgICAgICAgIGxlbiA9IGxlbiAqIDI7XHJcbiAgICAgICAgLy8gd29ya2luZyBpbiBiYXNlNjRcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBsZW4gPSBNYXRoLmZsb29yKChsZW4gKyAyKSAvIDMpICogNDtcclxuXHJcbiAgICAgIHBhcnNlZExlbiA9IFJlY29yZFV0aWxzLmdldFNwYW5uZWRGaWVsZChmbGRzVmFsLCBsZW4sIGlkeCwgdHlwZSwgc3VmZml4QnVmLCB1c2VIZXgpO1xyXG4gICAgICAvLyBhZnRlciB1c2luZyByZWN1cnNpdmUgZnVuY3Rpb24gdGVoIHN1ZmZpeEJ1ZiBpcyBpbiB0aGUgcmlnaHQgdHJhbnNmb3JtZWQgZm9ybVxyXG4gICAgICByZXN1bHQuQXBwZW5kKHN1ZmZpeEJ1Zi5Ub1N0cmluZygpKTtcclxuXHJcbiAgICAgIGlkeCA9IGlkeCArIHBhcnNlZExlbjtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CIHx8IHR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpXHJcbiAgICAgICAgaWYgKHVzZUhleClcclxuICAgICAgICAgIGxlbiA9IGxlbiAqIDI7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgbGVuID0gTWF0aC5mbG9vcigobGVuICsgMikgLyAzKSAqIDQ7XHJcblxyXG4gICAgICAvLyBuZXh0IHNlZ21lbnQgaXNuJ3Qgc3Bhbm5lZC4gSXQgbXVzdCBiZSB0aGUgbGFzdCBvbmUuXHJcbiAgICAgIGVuZElkeCA9IGlkeCArIGxlbjtcclxuICAgICAgaWYgKGVuZElkeCA+IGZsZHNWYWwubGVuZ3RoKVxyXG4gICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFJlY29yZC5maWxsRmllbGRzRGF0YSgpIGRhdGEgc3RyaW5nIHRvbyBzaG9ydDpcXG5cIiArIGZsZHNWYWwpO1xyXG5cclxuICAgICAgcmVzdWx0LkFwcGVuZChSZWNvcmRVdGlscy5nZXRTdHJpbmcoZmxkc1ZhbC5zdWJzdHIoaWR4LCBlbmRJZHggLSBpZHgpLCB0eXBlLCB1c2VIZXgpKTtcclxuICAgICAgaWR4ID0gZW5kSWR4O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpZHggLSBiZWdpbjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gVHJhbnNsYXRlIHZhbHVlIG9mIHRoZSBzcGFubmVkIGZpZWxkIHRvIGFjdHVhbCB2YWx1ZS4gRmllbGQgdmFsdWUgd2lsbCBiZSBpbiB0aGUgZm9ybWF0IG9mIGxlbmd0aCBhbmQgZGF0YVxyXG4gIC8vLyBbIChMZW5ndGggfCBkYXRhKSAoKExlbmd0aCB8IGRhdGEpKS4uLi4uXVxyXG4gIC8vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVhZCBsZW5ndGggYW5kIGRhdGEgb2YgZWFjaCBwYWNrZXQgYW5kIHJldHVybiBhY3R1YWwgdmFsdWUuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmbGRzVmFsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmaXJzdFNlZ0xlblwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaWR4XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0eXBlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXN1bHRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInVzZUhleFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibm9PZlBhY2tldHNcIj4gVG90YWwgbnVtYmVyIG9mIHBhY2tldHMgc2VudCBmcm9tIHRoZSBzZXJ2ZXI8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0U3Bhbm5lZEZpZWxkXzEoZmxkc1ZhbDogVWludDhBcnJheSwgZmlyc3RTZWdMZW46IG51bWJlciwgaWR4OiBudW1iZXIsIHR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUsIHJlc3VsdDogU3RyaW5nQnVpbGRlciwgdXNlSGV4OiBib29sZWFuLCBub09mUGFja2V0czogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBlbmRJZHg6IG51bWJlciA9IGlkeCArIGZpcnN0U2VnTGVuO1xyXG4gICAgbGV0IGxlbjogbnVtYmVyO1xyXG4gICAgbGV0IGJlZ2luOiBudW1iZXIgPSBpZHg7XHJcbiAgICBsZXQgdG1wOiBzdHJpbmc7XHJcbiAgICBsZXQgc3VmZml4QnVmOiBTdHJpbmdCdWlsZGVyID0gbnVsbDtcclxuICAgIGxldCBwYXJzZWRMZW46IG51bWJlcjtcclxuICAgIGxldCB0bXBFbmM6IEVuY29kaW5nO1xyXG4gICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkpXHJcbiAgICAgIHRtcEVuYyA9IElTT184ODU5XzFfRW5jb2RpbmcuSVNPXzg4NTlfMTtcclxuICAgIGVsc2VcclxuICAgICAgdG1wRW5jID0gR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0RW5jb2RpbmcoKTtcclxuXHJcbiAgICBpZiAoZW5kSWR4ID4gZmxkc1ZhbC5sZW5ndGgpXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFJlY29yZC5nZXRTcGFubmVkRmllbGQoKSBkYXRhIHN0cmluZyB0b28gc2hvcnQ6XFxuXCIgKyBmbGRzVmFsKTtcclxuXHJcbiAgICAvLyBhcHBlbmQgZmlyc3Qgc2VnbWVudFxyXG4gICAgcmVzdWx0LlJlbW92ZSgwLCByZXN1bHQuTGVuZ3RoKTtcclxuICAgIHJlc3VsdC5BcHBlbmQodG1wRW5jLkdldFN0cmluZyhmbGRzVmFsLCBpZHgsIGZpcnN0U2VnTGVuKSk7XHJcbiAgICBub09mUGFja2V0cyA9IG5vT2ZQYWNrZXRzIC0gMTtcclxuXHJcbiAgICBpZiAobm9PZlBhY2tldHMgPD0gMClcclxuICAgICAgcmV0dXJuIDA7XHJcblxyXG4gICAgaWR4ID0gaWR4ICsgZmlyc3RTZWdMZW47XHJcblxyXG4gICAgLy8gbmV4dCA0IGNoYXJhY3RlcnMgYXJlIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyAoaGV4IG51bWJlcikgb2Ygc3BlY2lhbCBieXRlcy5cclxuICAgIGVuZElkeCA9IGlkeCArIDQ7XHJcbiAgICB0bXAgPSB0bXBFbmMuR2V0U3RyaW5nKGZsZHNWYWwsIGlkeCwgNCk7XHJcbiAgICBsZW4gPSBOTnVtYmVyLlBhcnNlKHRtcCwgTnVtYmVyU3R5bGVzLkhleE51bWJlcik7XHJcbiAgICBpZHggPSBlbmRJZHg7XHJcblxyXG4gICAgaWYgKGVuZElkeCA+IGZsZHNWYWwubGVuZ3RoKVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBSZWNvcmQuZ2V0U3Bhbm5lZEZpZWxkKCkgZGF0YSBzdHJpbmcgdG9vIHNob3J0OlxcblwiICsgZmxkc1ZhbCk7XHJcblxyXG4gICAgLy8gbmV4dCA0IGNoYXJzIGFyZSB0aGUgbGVuZ3RoIG9mIG5leHQgc2VnbWVudFxyXG4gICAgZW5kSWR4ID0gaWR4ICsgNDtcclxuICAgIHRtcCA9IHRtcEVuYy5HZXRTdHJpbmcoZmxkc1ZhbCwgaWR4LCA0KTtcclxuICAgIGxlbiA9IE5OdW1iZXIuUGFyc2UodG1wLCBOdW1iZXJTdHlsZXMuSGV4TnVtYmVyKTtcclxuICAgIGlkeCA9IGVuZElkeDtcclxuXHJcbiAgICBpZiAoKGxlbiAmIDB4ODAwMCkgPiAwKSB7XHJcbiAgICAgIC8vIE9vcHMsIG5leHQgc2VnbWVudCBtYXkgYWxzbyBiZSBzcGFubmVkXHJcbiAgICAgIHN1ZmZpeEJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcblxyXG4gICAgICBwYXJzZWRMZW4gPSBSZWNvcmRVdGlscy5nZXRTcGFubmVkRmllbGQoZmxkc1ZhbCwgbGVuLCBpZHgsIHR5cGUsIHN1ZmZpeEJ1ZiwgdXNlSGV4LCBub09mUGFja2V0cyk7XHJcbiAgICAgIC8vIGFmdGVyIHVzaW5nIHJlY3Vyc2l2ZSBmdW5jdGlvbiB0ZWggc3VmZml4QnVmIGlzIGluIHRoZSByaWdodCB0cmFuc2Zvcm1lZCBmb3JtXHJcbiAgICAgIHJlc3VsdC5BcHBlbmQoc3VmZml4QnVmLlRvU3RyaW5nKCkpO1xyXG4gICAgICBpZHggPSBpZHggKyBwYXJzZWRMZW47XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gbmV4dCBzZWdtZW50IGlzbid0IHNwYW5uZWQuIEl0IG11c3QgYmUgdGhlIGxhc3Qgb25lLlxyXG4gICAgICBlbmRJZHggPSBpZHggKyBsZW47XHJcbiAgICAgIGlmIChlbmRJZHggPiBmbGRzVmFsLmxlbmd0aClcclxuICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBSZWNvcmQuZmlsbEZpZWxkc0RhdGEoKSBkYXRhIHN0cmluZyB0b28gc2hvcnQ6XFxuXCIgKyBmbGRzVmFsKTtcclxuXHJcbiAgICAgIHJlc3VsdC5BcHBlbmQodG1wRW5jLkdldFN0cmluZyhmbGRzVmFsLCBpZHgsIGxlbikpO1xyXG4gICAgICBpZHggPSBlbmRJZHg7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGlkeCAtIGJlZ2luO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNlcmlhbGl6ZSBhbiBpdGVtIChmaWVsZC9nbG9iYWwgcGFyYW0vLi4uKSB0byBhbiBYTUwgZm9ybWF0IChhcHBsaWNhYmxlIHRvIGJlIHBhc3NlZCB0byB0aGUgc2VydmVyKS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+aXRlbSdzIHZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIml0ZW1BdHRyXCI+aXRlbSdzIGF0dHJpYnV0ZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjZWxsQXR0clwiPmNlbGwncyBhdHRyaWJ1dGUgLSByZWxldmFudCBvbmx5IGlmICdpdGVtQXR0cicgaXMgdmVjdG9yPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIlRvQmFzZTY0XCI+PmRlY2lkZSBCYXNlNjQgZW5jb2RpbmcgaXMgdG8gYmUgZG9uZTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPnNlcmlhbGl6ZWQgWE1MIGZvcm1hdDwvcmV0dXJucz5cclxuICBzdGF0aWMgaXRlbVZhbFRvWE1MKGl0ZW1WYWw6IHN0cmluZywgaXRlbUF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUsIGNlbGxBdHRyOiBTdG9yYWdlQXR0cmlidXRlLCBUb0Jhc2U2NDogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICBsZXQgdG1wQnVmOiBzdHJpbmcgPSBSZWNvcmRVdGlscy5zZXJpYWxpemVJdGVtVmFsKGl0ZW1WYWwsIGl0ZW1BdHRyLCBjZWxsQXR0ciwgVG9CYXNlNjQpO1xyXG4gICAgcmV0dXJuIFhtbFBhcnNlci5lc2NhcGUodG1wQnVmKS50b1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiBnZXQgdGhlIGFjdHVhbCBzdHJpbmcgYWNjb3JkaW5nIHRvICd0eXBlJzwvcmV0dXJucz5cclxuICBzdGF0aWMgZ2V0U3RyaW5nXzIoc3RyOiBzdHJpbmcsIHR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUpOiBzdHJpbmcge1xyXG4gICAgbGV0IHVzZUhleDogYm9vbGVhbiA9IEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldERlYnVnTGV2ZWwoKSA+IDEgfHwgdHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQVxyXG4gICAgICB8fCB0eXBlID09PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUgfHwgU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLmlzVHlwZUxvZ2ljYWwodHlwZSk7XHJcblxyXG4gICAgLy8gZmlyc3QgNCBjaGFyYWN0ZXJzIGFyZSB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgKGhleCBudW1iZXIpXHJcbiAgICBsZXQgdG1wOiBzdHJpbmc7XHJcbiAgICBpZiAodHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSB8fCB0eXBlID09PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUgfHxcclxuICAgICAgdHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CIHx8IHR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpIHtcclxuICAgICAgdG1wID0gc3RyLnN1YnN0cig0KTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdG1wID0gc3RyO1xyXG5cclxuICAgIHJldHVybiBSZWNvcmRVdGlscy5nZXRTdHJpbmcodG1wLCB0eXBlLCB1c2VIZXgpO1xyXG4gIH1cclxuXHJcbn1cclxuIl19
361
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjb3JkVXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvc3JjL21hbmFnZW1lbnQvZGF0YS9SZWNvcmRVdGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLEtBQUssRUFDSyxtQkFBbUIsRUFDN0IsT0FBTyxFQUVQLFlBQVksRUFFWixhQUFhLEVBQ2QsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQ0wsTUFBTSxFQUVOLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsT0FBTyxFQUNQLGVBQWUsRUFDZixTQUFTLEVBQ1YsTUFBTSxrQkFBa0IsQ0FBQztBQUUxQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWxELE1BQU0sT0FBTyxXQUFXO0lBR3RCLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFXO1FBQ25DLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sWUFBWSxhQUFhLENBQUMsRUFBRTtZQUNsRixPQUFPLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNqRDtRQUNELE9BQU8sV0FBVyxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFPTyxNQUFNLENBQUMsb0JBQW9CLENBQUMsTUFBcUI7UUFDdkQsSUFBSSxPQUFlLENBQUM7UUFDcEIsSUFBSSxRQUFnQixDQUFDO1FBQ3JCLElBQUksTUFBTSxHQUFrQixJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU3RSxLQUFLLElBQUksSUFBSSxHQUFXLENB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QUMsUUFBUSxFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUdELE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBVyxFQUFFLElBQXNCO1FBQ3BELElBQUksTUFBTSxHQUFZLGNBQWMsQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxJQUFJLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxLQUFLO2VBQ2xHLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPLElBQUkscUJBQXFCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBR3BGLElBQUksR0FBVyxDQUFDO1FBQ2hCLElBQUksSUFBSSxLQUFLLGdCQUFnQixDQUFDLEtBQUssSUFBSSxJQUFJLEtBQUssZ0JBQWdCLENBQUMsT0FBTztZQUN0RSxJQUFJLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxJQUFJLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUU7WUFDekUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDckI7O1lBRUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUVaLE9BQU8sV0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2xELENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQXBwbGljYXRpb25FeGNlcHRpb24sXHJcbiAgRGVidWcsXHJcbiAgRW5jb2RpbmcsIElTT184ODU5XzFfRW5jb2RpbmcsXHJcbiAgTk51bWJlcixcclxuICBOU3RyaW5nLFxyXG4gIE51bWJlclN0eWxlcyxcclxuICBSZWZQYXJhbSxcclxuICBTdHJpbmdCdWlsZGVyXHJcbn0gZnJvbSBcIkBtYWdpYy14cGEvbXNjb3JlbGliXCI7XHJcbmltcG9ydCB7XHJcbiAgQmFzZTY0LFxyXG4gIE1pc2MsXHJcbiAgU3RvcmFnZUF0dHJpYnV0ZSxcclxuICBTdG9yYWdlQXR0cmlidXRlQ2hlY2ssXHJcbiAgU3RyVXRpbCxcclxuICBVdGlsU3RyQnl0ZU1vZGUsXHJcbiAgWG1sUGFyc2VyXHJcbn0gZnJvbSBcIkBtYWdpYy14cGEvdXRpbHNcIjtcclxuaW1wb3J0IHtOVU1fVFlQRX0gZnJvbSBcIi4vTlVNX1RZUEVcIjtcclxuaW1wb3J0IHsgR3VpRW52aXJvbm1lbnQgfSBmcm9tIFwiLi4vLi4vR3VpRW52aXJvbm1lbnRcIjtcclxuaW1wb3J0IHsgVmVjdG9yVHlwZUJhc2UgfSBmcm9tIFwiLi9WZWN0b3JUeXBlQmFzZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFJlY29yZFV0aWxzIHtcclxuICBzdGF0aWMgYnl0ZVN0cmVhbVRvU3RyaW5nKHN0cmVhbTogU3RyaW5nQnVpbGRlcik6IHN0cmluZztcclxuICBzdGF0aWMgYnl0ZVN0cmVhbVRvU3RyaW5nKHN0cmVhbTogc3RyaW5nKTogc3RyaW5nO1xyXG4gIHN0YXRpYyBieXRlU3RyZWFtVG9TdHJpbmcoc3RyZWFtOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgKHN0cmVhbSA9PT0gbnVsbCB8fCBzdHJlYW0gaW5zdGFuY2VvZiBTdHJpbmdCdWlsZGVyKSkge1xyXG4gICAgICByZXR1cm4gUmVjb3JkVXRpbHMuYnl0ZVN0cmVhbVRvU3RyaW5nXzAoc3RyZWFtKTtcclxuICAgIH1cclxuICAgIHJldHVybiBSZWNvcmRVdGlscy5ieXRlU3RyZWFtVG9TdHJpbmdfMShzdHJlYW0pO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRyYW5zbGF0ZSBieXRlIHN0cmVhbSB0byBTdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVzdWx0XCI+b2YgdGhlIHRyYW5zbGF0aW9uPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0cmVhbVwiPihpbiBTdHJpbmdCdWZmZXIgZm9ybSkgdG8gdHJhbnNsYXRlIGZyb208L3BhcmFtPlxyXG4gIHByaXZhdGUgc3RhdGljIGJ5dGVTdHJlYW1Ub1N0cmluZ18wKHN0cmVhbTogU3RyaW5nQnVpbGRlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgY3VyclN0cjogc3RyaW5nO1xyXG4gICAgbGV0IGN1cnJDaGFyOiBzdHJpbmc7XHJcbiAgICBsZXQgcmVzdWx0OiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoTWF0aC5mbG9vcihzdHJlYW0uTGVuZ3RoIC8gMikpO1xyXG5cclxuICAgIGZvciAobGV0IGluZHg6IG51bWJlciA9IDA7IGluZHggPCBzdHJlYW0uTGVuZ3RoOyBpbmR4ID0gaW5keCArIDIpIHtcclxuICAgICAgY3VyclN0ciA9IHN0cmVhbS5nZXRfSXRlbShpbmR4KSArIHN0cmVhbS5nZXRfSXRlbShpbmR4ICsgMSk7XHJcbiAgICAgIGN1cnJDaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZShOTnVtYmVyLlBhcnNlKGN1cnJTdHIsIE51bWJlclN0eWxlcy5IZXhOdW1iZXIpKTtcclxuICAgICAgcmVzdWx0LkFwcGVuZChjdXJyQ2hhcik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0LlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdHJhbnNsYXRlIGJ5dGUgc3RyZWFtIHRvIFN0cmluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVN0cmVhbVRvU3RyaW5nXzEoc3RyZWFtOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIFJlY29yZFV0aWxzLmJ5dGVTdHJlYW1Ub1N0cmluZyhuZXcgU3RyaW5nQnVpbGRlcihzdHJlYW0pKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXJpYWxpemUgYW4gaXRlbSAoZmllbGQvZ2xvYmFsIHBhcmFtLy4uLikgdG8gYW4gWE1MIGZvcm1hdCAoYXBwbGljYWJsZSB0byBiZSBwYXNzZWQgdG8gdGhlIHNlcnZlcikuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIml0ZW1WYWxcIj5pdGVtJ3MgdmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXRlbUF0dHJcIj5pdGVtJ3MgYXR0cmlidXRlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNlbGxBdHRyXCI+Y2VsbCdzIGF0dHJpYnV0ZSAtIHJlbGV2YW50IG9ubHkgaWYgJ2l0ZW1BdHRyJyBpcyB2ZWN0b3I8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidG9CYXNlNjRcIj5kZWNpZGUgQmFzZTY0IGVuY29kaW5nIGlzIHRvIGJlIGRvbmU8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5zZXJpYWxpemVkIGJ1ZmZlcjwvcmV0dXJucz5cclxuICBzdGF0aWMgc2VyaWFsaXplSXRlbVZhbChpdGVtVmFsOiBzdHJpbmcsIGl0ZW1BdHRyOiBTdG9yYWdlQXR0cmlidXRlLCBjZWxsQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSwgdG9CYXNlNjQ6IGJvb2xlYW4pOiBzdHJpbmcge1xyXG4gICAgRGVidWcuQXNzZXJ0KGl0ZW1WYWwgIT0gbnVsbCk7XHJcblxyXG4gICAgbGV0IHNpZ25pZmljYW50TnVtU2l6ZTogbnVtYmVyID0gR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0U2lnbmlmaWNhbnROdW1TaXplKCkgKiAyO1xyXG5cclxuICAgIGxldCB2YWx1ZVNpemU6IHN0cmluZztcclxuICAgIGxldCBqOiBudW1iZXI7XHJcbiAgICBsZXQgdG1wQnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgIGxldCBwb3M6IG51bWJlcjtcclxuICAgIGxldCBmbGRWYWxMZW46IG51bWJlciA7XHJcblxyXG4gICAgLy8gZm9yIGFscGhhIHR5cGUgYWRkIHRoZSBsZW5ndGggb2YgdGhlIHZhbHVlIGFzIGhleCBudW1iZXIgb2YgNCBkaWdpdHNcclxuICAgIHN3aXRjaCAoaXRlbUF0dHIpIHtcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5EQVRFOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVElNRTpcclxuICAgICAgICBpdGVtVmFsID0gIXRvQmFzZTY0XHJcbiAgICAgICAgICA/IGl0ZW1WYWwuc3Vic3RyKDAsIHNpZ25pZmljYW50TnVtU2l6ZSlcclxuICAgICAgICAgIDogQmFzZTY0LmVuY29kZSh0aGlzLmJ5dGVTdHJlYW1Ub1N0cmluZyhpdGVtVmFsLnN1YnN0cigwLCBzaWduaWZpY2FudE51bVNpemUpKSwgR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0RW5jb2RpbmcoKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFOlxyXG4gICAgICAgIGl0ZW1WYWwgPSBTdHJVdGlsLnJ0cmltKGl0ZW1WYWwpO1xyXG4gICAgICAgIHBvcyA9IDA7XHJcbiAgICAgICAgZmxkVmFsTGVuID0gaXRlbVZhbC5sZW5ndGg7XHJcblxyXG4gICAgICAgIGRvIHtcclxuICAgICAgICAgIGxldCBudWxsQ2hyUG9zOiBudW1iZXIgPSBpdGVtVmFsLmluZGV4T2YoU3RyaW5nLmZyb21DaGFyQ29kZSgwKSwgcG9zKTtcclxuICAgICAgICAgIGlmIChudWxsQ2hyUG9zID09PSAtMSkge1xyXG4gICAgICAgICAgICB2YWx1ZVNpemUgPSAoZmxkVmFsTGVuIC0gcG9zKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgLy8gYWRkIGxlYWRpbmcgemVyb3MgKGlmIG5lZWRlZClcclxuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDQgLSB2YWx1ZVNpemUubGVuZ3RoOyBqKyspXHJcbiAgICAgICAgICAgICAgdG1wQnVmLkFwcGVuZCgnMCcpO1xyXG4gICAgICAgICAgICB0bXBCdWYuQXBwZW5kKHZhbHVlU2l6ZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAocG9zID4gMClcclxuICAgICAgICAgICAgICBpdGVtVmFsID0gaXRlbVZhbC5zdWJzdHIocG9zLCAoZmxkVmFsTGVuKSAtIChwb3MpKTtcclxuXHJcbiAgICAgICAgICAgIHBvcyA9IGZsZFZhbExlbjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBJZiBOVUxMIGNoYXJzIGV4aXN0IGluIHRoZSBtaWRkbGUgb2YgdGhlIHZhbHVlIC0gY3JlYXRlIGEgc3Bhbm5lZCByZWNvcmRcclxuICAgICAgICAgICAgLy8gVHVybiBvbiB0aGUgaGlnaCBtb3N0IGJpdCBpbiB0aGUgbGVuZ3RoICh0byBpbmRpY2F0ZSBhIHNlZ21lbnQpXHJcbiAgICAgICAgICAgIHZhbHVlU2l6ZSA9IChudWxsQ2hyUG9zIC0gcG9zICsgMHg4MDAwKS50b1N0cmluZyAoMTYpLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgICAgIHRtcEJ1Zi5BcHBlbmQodmFsdWVTaXplKTtcclxuICAgICAgICAgICAgdG1wQnVmLkFwcGVuZChpdGVtVmFsLnN1YnN0cihwb3MsIChudWxsQ2hyUG9zKSAtIChwb3MpKSk7XHJcblxyXG4gICAgICAgICAgICAvLyBDb3VudCBudW1iZXIgb2YgY29uc2VjdXRpdmUgTlVMTCBjaGFycywgYW5kIGFkZCB0aGVpciBjb3VudCB0byBYTUxcclxuICAgICAgICAgICAgZm9yIChqID0gMTsgaiA8IGZsZFZhbExlbiAtIG51bGxDaHJQb3MgJiYgaXRlbVZhbC5jaGFyQ29kZUF0KG51bGxDaHJQb3MgKyBqKSA9PT0gMDsgaisrKSB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gYWRkIGxlYWRpbmcgemVyb3MgKGlmIG5lZWRlZClcclxuICAgICAgICAgICAgdmFsdWVTaXplID0gXCIwMDAwXCIgKyAoai50b1N0cmluZygxNikpLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgICAgIHRtcEJ1Zi5BcHBlbmQodmFsdWVTaXplLnN1YnN0cih2YWx1ZVNpemUubGVuZ3RoIC0gNCkpO1xyXG5cclxuICAgICAgICAgICAgLy8gQXBwZW5kIGEgaGV4IGR1bXAgb2Ygc3BlY2lhbCBjaGFyc1xyXG4gICAgICAgICAgICBmb3IgKHBvcyA9IG51bGxDaHJQb3M7IGogPiAwOyBqLS0sIHBvcysrKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHRtcFN0cjogc3RyaW5nID0gXCIwXCIgKyBpdGVtVmFsLmNoYXJDb2RlQXQobnVsbENoclBvcykudG9TdHJpbmcoMTYpO1xyXG4gICAgICAgICAgICAgIHRtcEJ1Zi5BcHBlbmQodG1wU3RyLnN1YnN0cih0bXBTdHIubGVuZ3RoIC0gMikpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBJZiBzcGVjaWFsIGNoYXJzIHdlcmUgbGFzdCwgYWRkIHRoZSBsZW5ndGggb2YgdGhlIGxhc3Qgc2VnbWVudCAoemVybylcclxuICAgICAgICAgICAgaWYgKHBvcyA+PSBmbGRWYWxMZW4pIHtcclxuICAgICAgICAgICAgICB0bXBCdWYuQXBwZW5kKFwiMDAwMFwiKTtcclxuICAgICAgICAgICAgICBpdGVtVmFsID0gXCJcIjtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gd2hpbGUgKHBvcyA8IGZsZFZhbExlbik7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQjpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuRE9UTkVUOlxyXG4gICAgICAgIHBvcyA9IDA7XHJcblxyXG4gICAgICAgIGZsZFZhbExlbiA9IGl0ZW1WYWwubGVuZ3RoO1xyXG5cclxuICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSAmJiBpdGVtQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikge1xyXG4gICAgICAgICAgaWYgKGNlbGxBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBIHx8IGNlbGxBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLk1FTU8pIHtcclxuICAgICAgICAgICAgaXRlbVZhbCA9IFZlY3RvclR5cGVCYXNlLmFkanVzdEFscGhhU3RyaW5nc0luRmxhdERhdGEoaXRlbVZhbCk7XHJcblxyXG4gICAgICAgICAgICAvLyBUaGUgZmxhdCBkYXRhIHdpbGwgYmUgZGl2aWRlZCBieSAweDNGRkYgY2hhcmFjdGVycy5cclxuICAgICAgICAgICAgLy8gRWFjaCBzZWdtZW50IHdpbGwgYmUgc2l6ZSBpbiAweDNGRkYgfiAweDdGRkYgYnl0ZXMuXHJcbiAgICAgICAgICAgIC8vIFRoZSBzaXplIGRlcGVuZHMgb24gdGhlIG51bWJlciBvZiBEQkNTIGNoYXJhY3RlcnMsIG5vdCBmaXhlZCBpbiAweDdGRkYuXHJcbiAgICAgICAgICAgIGRvIHtcclxuICAgICAgICAgICAgICBpZiAoaXRlbVZhbC5sZW5ndGggPCBwb3MgKyAweDNGRkYpXHJcbiAgICAgICAgICAgICAgLy8gKDB4ODAwMCAtIDEpIC8gMiA9IDB4M0ZGRlxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmIChwb3MgPiAwKVxyXG4gICAgICAgICAgICAgICAgICBpdGVtVmFsID0gaXRlbVZhbC5zdWJzdHIocG9zKTtcclxuXHJcbiAgICAgICAgICAgICAgICB2YWx1ZVNpemUgPSAoVXRpbFN0ckJ5dGVNb2RlLmxlbkIoaXRlbVZhbCkudG9TdHJpbmcoMTYpKS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgLy8gYWRkIGxlYWRpbmcgemVyb3MgKGlmIG5lZWRlZClcclxuICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0IC0gdmFsdWVTaXplLmxlbmd0aDsgaisrKVxyXG4gICAgICAgICAgICAgICAgICB0bXBCdWYuQXBwZW5kKCcwJyk7XHJcbiAgICAgICAgICAgICAgICB0bXBCdWYuQXBwZW5kKHZhbHVlU2l6ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gaGV4IGVuY29kaW5nXHJcbiAgICAgICAgICAgICAgICBpdGVtVmFsID0gIXRvQmFzZTY0XHJcbiAgICAgICAgICAgICAgICAgID8gU3RyVXRpbC5zdHJpbmdUb0hleGFEdW1wKGl0ZW1WYWwsIDQpXHJcbiAgICAgICAgICAgICAgICAgIDogQmFzZTY0LmVuY29kZShpdGVtVmFsLCB0cnVlLCBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRFbmNvZGluZygpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBwb3MgPSBmbGRWYWxMZW47XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGV0IHN0clN1Yjogc3RyaW5nID0gaXRlbVZhbC5zdWJzdHIocG9zLCAweDNGRkYpO1xyXG4gICAgICAgICAgICAgICAgLy8gKyAweDgwMDAgLi4uIHRvIGluZGljYXRlIG5vdCB0aGUgbGFzdCBzZWdtZW50XHJcbiAgICAgICAgICAgICAgICB2YWx1ZVNpemUgPSAoKFV0aWxTdHJCeXRlTW9kZS5sZW5CKHN0clN1YikgKyAweDgwMDApLnRvU3RyaW5nKDE2KSkudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgIHRtcEJ1Zi5BcHBlbmQodmFsdWVTaXplKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBoZXggb3IgYmFzZTY0IGVuY29kaW5nXHJcbiAgICAgICAgICAgICAgICB0bXBCdWYuQXBwZW5kKCF0b0Jhc2U2NFxyXG4gICAgICAgICAgICAgICAgICA/IFN0clV0aWwuc3RyaW5nVG9IZXhhRHVtcChzdHJTdWIsIDQpXHJcbiAgICAgICAgICAgICAgICAgIDogQmFzZTY0LmVuY29kZShzdHJTdWIsIHRydWUsIEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldEVuY29kaW5nKCkpKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0bXBCdWYuQXBwZW5kKFwiMDAwMFwiKTtcclxuICAgICAgICAgICAgICAgIHBvcyArPSAweDNGRkY7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IHdoaWxlIChwb3MgPCBmbGRWYWxMZW4pIDtcclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgaWYgKGZsZFZhbExlbiA8IHBvcyArIDB4N0ZGRilcclxuICAgICAgICAgIC8vIDB4ODAwMCAtMSA9IDB4N0ZGRlxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB2YWx1ZVNpemUgPSAoKGZsZFZhbExlbiAtIHBvcykudG9TdHJpbmcoMTYpKS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgICAgICAvLyBhZGQgbGVhZGluZyB6ZXJvcyAoaWYgbmVlZGVkKVxyXG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNCAtIHZhbHVlU2l6ZS5sZW5ndGg7IGorKylcclxuICAgICAgICAgICAgICB0bXBCdWYuQXBwZW5kKCcwJyk7XHJcbiAgICAgICAgICAgIHRtcEJ1Zi5BcHBlbmQodmFsdWVTaXplKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChwb3MgPiAwKVxyXG4gICAgICAgICAgICAgIGl0ZW1WYWwgPSBpdGVtVmFsLnN1YnN0cihwb3MsIChmbGRWYWxMZW4pIC0gKHBvcykpO1xyXG5cclxuICAgICAgICAgICAgLy8gaGV4IGVuY29kaW5nXHJcbiAgICAgICAgICAgIGl0ZW1WYWwgPSAhdG9CYXNlNjRcclxuICAgICAgICAgICAgICA/IFN0clV0aWwuc3RyaW5nVG9IZXhhRHVtcChpdGVtVmFsLCA0KVxyXG4gICAgICAgICAgICAgIDogQmFzZTY0LmVuY29kZShpdGVtVmFsLCBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRFbmNvZGluZygpKTtcclxuXHJcbiAgICAgICAgICAgIHBvcyA9IGZsZFZhbExlbjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyB0byBpbmRpY2F0ZSB0aGUgZnVsbCBzZWdtZW50XHJcbiAgICAgICAgICAgIHZhbHVlU2l6ZSA9IFwiRkZGRlwiOyAvLyAoSW50ZWdlci50b0hleFN0cmluZyAoMHhGRkZGKSkudG9VcHBlckNhc2UoKVxyXG4gICAgICAgICAgICB0bXBCdWYuQXBwZW5kKHZhbHVlU2l6ZSk7XHJcblxyXG4gICAgICAgICAgICAvLyBoZXggb3IgYmFzZTY0IGVuY29kaW5nXHJcbiAgICAgICAgICAgIGlmICghdG9CYXNlNjQpXHJcbiAgICAgICAgICAgICAgdG1wQnVmLkFwcGVuZChTdHJVdGlsLnN0cmluZ1RvSGV4YUR1bXAoaXRlbVZhbC5zdWJzdHIocG9zLCAweDdGRkYpLCA0KSk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICB0bXBCdWYuQXBwZW5kKEJhc2U2NC5lbmNvZGUoaXRlbVZhbC5zdWJzdHIocG9zLCAweDdGRkYpLCBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRFbmNvZGluZygpKSk7XHJcblxyXG4gICAgICAgICAgICB0bXBCdWYuQXBwZW5kKFwiMDAwMFwiKTtcclxuICAgICAgICAgICAgcG9zICs9IDB4N0ZGRjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IHdoaWxlIChwb3MgPCBmbGRWYWxMZW4pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfSAvLyBlbmQgb2YgdGhlIHR5cGUgY2FzZSBibG9ja1xyXG4gICAgdG1wQnVmLkFwcGVuZChpdGVtVmFsKTtcclxuICAgIHJldHVybiB0bXBCdWYuVG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gRGVzZXJpYWxpemVzIGFuIGl0ZW0ncyAoZmllbGQvZ2xvYmFsIHBhcmFtLy4uLikgdmFsdWUgPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIml0ZW1WYWxcIj5pdGVtJ3MgdmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIml0ZW1BdHRyXCI+aXRlbSdzIGF0dHJpYnV0ZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXRlbUxlblwiPml0ZW0ncyBsZW5ndGg8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInVzZUhleFwiPmluZGljYXRlcyB3aGV0aGVyIHRoZSBpdGVtVmFsIGlzIGluIEhleCBvciBCYXNlNjQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNlbGxBdHRyXCI+Y2VsbCdzIGF0dHJpYnV0ZSAtIHJlbGV2YW50IG9ubHkgaWYgJ2l0ZW1BdHRyJyBpcyB2ZWN0b3I8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInBhcnNlZExlblwiPm91dCBwYXJhbWV0ZXIuIFJldHVybnMgdGhlIGxlbmd0aCBvZiBpdGVtVmFsIHBhcnNlZDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgZGVTZXJpYWxpemVJdGVtVmFsKGl0ZW1WYWw6IHN0cmluZywgaXRlbUF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUsIGl0ZW1MZW46IG51bWJlciwgdXNlSGV4OiBib29sZWFuLCBjZWxsQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSwgcGFyc2VkTGVuOiBSZWZQYXJhbTxudW1iZXI+KTogc3RyaW5nIHtcclxuICAgIGxldCB2YWw6IHN0cmluZyA9IG51bGw7XHJcbiAgICBsZXQgaWR4OiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGxlbjogbnVtYmVyLCBlbmRJZHg6IG51bWJlcjtcclxuICAgIGxldCBzdWZmaXhCdWY6IFN0cmluZ0J1aWxkZXIgPSBudWxsO1xyXG4gICAgbGV0IHRtcDogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgICBpZiAoaXRlbUF0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEFcclxuICAgICAgfHwgaXRlbUF0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERVxyXG4gICAgICB8fCBpdGVtQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CXHJcbiAgICAgIHx8IGl0ZW1BdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SXHJcbiAgICAgIHx8IGl0ZW1BdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkRPVE5FVFxyXG4gICAgKSB7XHJcbiAgICAgIC8vIGZpcnN0IDQgY2hhcmFjdGVycyBhcmUgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIChoZXggbnVtYmVyKVxyXG4gICAgICBlbmRJZHggPSBpZHggKyA0O1xyXG4gICAgICB0bXAgPSBpdGVtVmFsLnN1YnN0cihpZHgsIChlbmRJZHgpIC0gKGlkeCkpO1xyXG4gICAgICBsZW4gPSBOTnVtYmVyLlBhcnNlKHRtcCwgTnVtYmVyU3R5bGVzLkhleE51bWJlcik7XHJcbiAgICAgIGlkeCA9IGVuZElkeDtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGl0ZW1BdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU4pXHJcbiAgICAgIGxlbiA9IDE7XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IHNpZ25pZmljYW50TnVtU2l6ZTogbnVtYmVyID0gR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0U2lnbmlmaWNhbnROdW1TaXplKCk7XHJcbiAgICAgIGlmICh1c2VIZXgpXHJcbiAgICAgICAgbGVuID0gc2lnbmlmaWNhbnROdW1TaXplICogMjtcclxuICAgICAgZWxzZVxyXG4gICAgICAvLyBpZiB3b3JraW5nIGluIGJhc2U2NFxyXG4gICAgICAgIGxlbiA9IChNYXRoLmZsb29yKChzaWduaWZpY2FudE51bVNpemUgKyAyKSAvIDMpICogNCk7XHJcbiAgICB9XHJcbiAgICAvLyBPb3BzLCBkaWQgd2UgYnVtcGVkIGludG8gYSBzcGFubmVkIHJlY29yZCAoV2UgaWRlbnRpZnkgaXQgd2hlbiB0aGUgaGlnaC1tb3N0IGJpdCBpcyBvbik/XHJcbiAgICBpZiAoKGxlbiAmIDB4ODAwMCkgPiAwKSB7XHJcbiAgICAgIHN1ZmZpeEJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICAgIGxlbiA9IChsZW4gJiAweDdGRkYpO1xyXG5cclxuICAgICAgaWYgKGl0ZW1BdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IgfHwgaXRlbUF0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1JcclxuICAgICAgICB8fCBpdGVtQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5ET1RORVQpXHJcbiAgICAgICAgaWYgKHVzZUhleClcclxuICAgICAgICAgIGxlbiAqPSAyO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGxlbiA9IChNYXRoLmZsb29yKChsZW4gKyAyKSAvIDMpICogNCk7XHJcblxyXG4gICAgICBwYXJzZWRMZW4udmFsdWUgPSB0aGlzLmdldFNwYW5uZWRGaWVsZChpdGVtVmFsLCBsZW4sIGlkeCwgaXRlbUF0dHIsIHN1ZmZpeEJ1ZiwgdXNlSGV4KTtcclxuICAgICAgdmFsID0gc3VmZml4QnVmLlRvU3RyaW5nKCk7XHJcbiAgICAgIGVuZElkeCA9IGlkeCArIHBhcnNlZExlbi52YWx1ZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoaXRlbUF0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQlxyXG4gICAgICAgIHx8IGl0ZW1BdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SXHJcbiAgICAgICAgfHwgaXRlbUF0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuRE9UTkVUXHJcbiAgICAgIClcclxuICAgICAgICBpZiAodXNlSGV4KVxyXG4gICAgICAgICAgbGVuICo9IDI7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgbGVuID0gKE1hdGguZmxvb3IoKGxlbiArIDIpIC8gMykgKiA0KTtcclxuXHJcbiAgICAgIGVuZElkeCA9IGlkeCArIGxlbjtcclxuICAgICAgaWYgKGVuZElkeCA+IGl0ZW1WYWwubGVuZ3RoKVxyXG4gICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFJlY29yZC5maWxsRmllbGRzRGF0YSgpIGRhdGEgc3RyaW5nIHRvbyBzaG9ydDpcXG5cIiArIGl0ZW1WYWwpO1xyXG5cclxuICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkgJiYgaXRlbUF0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpXHJcbiAgICAgICAgdmFsID0gdGhpcy5nZXRTdHJpbmcoaXRlbVZhbC5zdWJzdHIoaWR4LCAoZW5kSWR4KSAtIChpZHgpKSwgaXRlbUF0dHIsIHVzZUhleCwgKGNlbGxBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBKSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB2YWwgPSB0aGlzLmdldFN0cmluZyhpdGVtVmFsLnN1YnN0cihpZHgsIChlbmRJZHgpIC0gKGlkeCkpLCBpdGVtQXR0ciwgdXNlSGV4KTtcclxuICAgIH1cclxuXHJcbiAgICBpZHggPSBlbmRJZHg7XHJcblxyXG4gICAgaWYgKGl0ZW1BdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBIHx8IGl0ZW1BdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUpIHtcclxuICAgICAgbGVuID0gaXRlbUxlbjtcclxuICAgICAgdmFsID0gU3RyVXRpbC5wYWRTdHIodmFsLCBsZW4pO1xyXG5cclxuICAgICAgaWYgKGl0ZW1BdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBICYmIFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkpXHJcbiAgICAgICAgdmFsID0gVXRpbFN0ckJ5dGVNb2RlLmxlZnRCKHZhbCwgbGVuKTtcclxuICAgIH1cclxuXHJcbiAgICBwYXJzZWRMZW4udmFsdWUgPSBlbmRJZHg7XHJcbiAgICByZXR1cm4gdmFsO1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0U3RyaW5nKHN0cjogc3RyaW5nLCB0eXBlOiBTdG9yYWdlQXR0cmlidXRlKTogc3RyaW5nO1xyXG4gIHN0YXRpYyBnZXRTdHJpbmcoc3RyOiBzdHJpbmcsIHR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUsIHVzZUhleDogYm9vbGVhbik6IHN0cmluZztcclxuICBzdGF0aWMgZ2V0U3RyaW5nKHN0cjogc3RyaW5nLCB0eXBlOiBTdG9yYWdlQXR0cmlidXRlLCB1c2VIZXg6IGJvb2xlYW4sIHVzZUVudkNoYXJzZXQ6IGJvb2xlYW4pOiBzdHJpbmc7XHJcbiAgc3RhdGljIGdldFN0cmluZyhzdHI6IHN0cmluZywgdHlwZTogU3RvcmFnZUF0dHJpYnV0ZSwgdXNlSGV4PzogYm9vbGVhbiwgdXNlRW52Q2hhcnNldD86IGJvb2xlYW4pOiBzdHJpbmcge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpXHJcbiAgICAgIHJldHVybiBSZWNvcmRVdGlscy5nZXRTdHJpbmdfMChzdHIsIHR5cGUsIHVzZUhleCk7XHJcblxyXG4gICAgaWYoYXJndW1lbnRzLmxlbmd0aCA9PT0gMilcclxuICAgICAgcmV0dXJuIFJlY29yZFV0aWxzLmdldFN0cmluZ18yKHN0ciwgdHlwZSk7XHJcblxyXG4gICAgcmV0dXJuIFJlY29yZFV0aWxzLmdldFN0cmluZ18xKHN0ciwgdHlwZSwgdXNlSGV4LCB1c2VFbnZDaGFyc2V0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gcmlnaHQgc3RyaW5nIGluIGNvbmZpZGVuY2Ugd2l0aCB0aGUgdHlwZTwvcmV0dXJucz5cclxuICBwcml2YXRlIHN0YXRpYyBnZXRTdHJpbmdfMChzdHI6IHN0cmluZywgdHlwZTogU3RvcmFnZUF0dHJpYnV0ZSwgdXNlSGV4OiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBSZWNvcmRVdGlscy5nZXRTdHJpbmcoc3RyLCB0eXBlLCB1c2VIZXgsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gcmlnaHQgc3RyaW5nIGluIGNvbmZpZGVuY2Ugd2l0aCB0aGUgdHlwZTwvcmV0dXJucz5cclxuICBwcml2YXRlIHN0YXRpYyBnZXRTdHJpbmdfMShzdHI6IHN0cmluZywgdHlwZTogU3RvcmFnZUF0dHJpYnV0ZSwgdXNlSGV4OiBib29sZWFuLCB1c2VFbnZDaGFyc2V0OiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIGxldCByZXN1bHQ6IHN0cmluZztcclxuICAgIGlmICh1c2VIZXgpIHtcclxuICAgICAgaWYgKHR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQiB8fCB0eXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SXHJcbiAgICAgICAgfHwgdHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5ET1RORVQpXHJcbiAgICAgICAgcmVzdWx0ID0gUmVjb3JkVXRpbHMuYnl0ZVN0cmVhbVRvU3RyaW5nKHN0cik7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICByZXN1bHQgPSBzdHI7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQiB8fCB0eXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SXHJcbiAgICAgICAgfHwgdHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5ET1RORVQpXHJcbiAgICAgICAgcmVzdWx0ID0gQmFzZTY0LmRlY29kZShzdHIsIHVzZUVudkNoYXJzZXQgPyBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRFbmNvZGluZygpIDogbnVsbCk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICByZXN1bHQgPSBCYXNlNjQuZGVjb2RlVG9IZXgoc3RyKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0U3Bhbm5lZEZpZWxkKGZsZHNWYWw6IHN0cmluZywgZmlyc3RTZWdMZW46IG51bWJlciwgaWR4OiBudW1iZXIsIHR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUsIHJlc3VsdDogU3RyaW5nQnVpbGRlciwgdXNlSGV4OiBib29sZWFuKTogbnVtYmVyO1xyXG4gIHN0YXRpYyBnZXRTcGFubmVkRmllbGQoZmxkc1ZhbDogVWludDhBcnJheSwgZmlyc3RTZWdMZW46IG51bWJlciwgaWR4OiBudW1iZXIsIHR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUsIHJlc3VsdDogU3RyaW5nQnVpbGRlciwgdXNlSGV4OiBib29sZWFuLCBub09mUGFja2V0czogbnVtYmVyKTogbnVtYmVyO1xyXG4gIHN0YXRpYyBnZXRTcGFubmVkRmllbGQoZmxkc1ZhbDogYW55LCBmaXJzdFNlZ0xlbjogbnVtYmVyLCBpZHg6IG51bWJlciwgdHlwZTogU3RvcmFnZUF0dHJpYnV0ZSwgcmVzdWx0OiBTdHJpbmdCdWlsZGVyLCB1c2VIZXg6IGJvb2xlYW4sIG5vT2ZQYWNrZXRzPzogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA2KVxyXG4gICAgICByZXR1cm4gUmVjb3JkVXRpbHMuZ2V0U3Bhbm5lZEZpZWxkXzAoZmxkc1ZhbCwgZmlyc3RTZWdMZW4sIGlkeCwgdHlwZSwgcmVzdWx0LCB1c2VIZXgpO1xyXG5cclxuICAgIHJldHVybiBSZWNvcmRVdGlscy5nZXRTcGFubmVkRmllbGRfMShmbGRzVmFsLCBmaXJzdFNlZ0xlbiwgaWR4LCB0eXBlLCByZXN1bHQsIHVzZUhleCwgbm9PZlBhY2tldHMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRyYW5zbGF0ZSBYTUwgLT4gZmllbGQgdmFsdWUgZm9yIGEgc3Bhbm5lZCBBTFBIQSBmaWVsZCwgYW5kIHJldHVybiB0aGUgYWN0dWFsXHJcbiAgLy8vICAgZmllbGQncyBsZW5ndGguIEEgc3Bhbm5lZCBmaWVsZCBtYXkgYmUgYWNjZXB0ZWQgZnJvbSB0aGUgc2VydmVyIHdoZW4gYW5cclxuICAvLy8gICBBTFBIQSBpbmNsdWRlcyBzcGVjaWFsIGNoYXJzIHN1Y2ggYXMgTlVMTCB3aGljaCBjYW5ub3QgYmUgZXNjYXBlZCB1c2luZyBhICdcXCcgKGxpa2UsXHJcbiAgLy8vICAgZm9yIGV4YW1wbGUsICdcXFwiJykuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZHNWYWxcIj5zdHJpbmcgZm9yIHBhcnNpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmlyc3RTZWdMZW5cIj5sZW5ndGggKGluIGNoYXJzKSBvZiBmaXJzdCBzZWdtZW50LjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj5pbmRleCBpbiBzdHJpbmcsIGZyb20gd2hpY2ggdGhlIGZpcnN0IHNlZ21lbnRzIGRhdGEgc3RhcnRzLjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0eXBlXCI+b2YgdmFyaWFibGUgaXMgbG9va2luZyBmb3I8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVzdWx0XCI+dGhlIHJlc3VsdCBzdHJpbmcsIHdoaWNoIHdpbGwgY29udGFpbiB0aGUgcGFyc2VkIGZpZWxkIGNvbnRlbnQuPC9wYXJhbT5cclxuICBwcml2YXRlIHN0YXRpYyBnZXRTcGFubmVkRmllbGRfMChmbGRzVmFsOiBzdHJpbmcsIGZpcnN0U2VnTGVuOiBudW1iZXIsIGlkeDogbnVtYmVyLCB0eXBlOiBTdG9yYWdlQXR0cmlidXRlLCByZXN1bHQ6IFN0cmluZ0J1aWxkZXIsIHVzZUhleDogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICBsZXQgZW5kSWR4OiBudW1iZXIgPSBpZHggKyBmaXJzdFNlZ0xlbjtcclxuICAgIGxldCBsZW46IG51bWJlcjtcclxuICAgIGxldCBiZWdpbjogbnVtYmVyID0gaWR4O1xyXG4gICAgbGV0IGFzY2lpQ29kZTogc3RyaW5nO1xyXG4gICAgbGV0IHRtcDogc3RyaW5nO1xyXG4gICAgbGV0IHN1ZmZpeEJ1ZjogU3RyaW5nQnVpbGRlciA9IG51bGw7XHJcbiAgICBsZXQgcGFyc2VkTGVuOiBudW1iZXI7XHJcblxyXG4gICAgaWYgKGVuZElkeCA+IGZsZHNWYWwubGVuZ3RoKSB7XHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFJlY29yZC5nZXRTcGFubmVkRmllbGQoKSBkYXRhIHN0cmluZyB0b28gc2hvcnQ6XFxuXCIgKyBmbGRzVmFsKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhcHBlbmQgZmlyc3Qgc2VnbWVudFxyXG4gICAgcmVzdWx0LlJlbW92ZSgwLCByZXN1bHQuTGVuZ3RoKTtcclxuICAgIHJlc3VsdC5BcHBlbmQoUmVjb3JkVXRpbHMuZ2V0U3RyaW5nKGZsZHNWYWwuc3Vic3RyKGlkeCwgZW5kSWR4IC0gaWR4KSwgdHlwZSwgdXNlSGV4KSk7XHJcblxyXG4gICAgaWR4ID0gaWR4ICsgZmlyc3RTZWdMZW47XHJcblxyXG4gICAgLy8gbmV4dCA0IGNoYXJhY3RlcnMgYXJlIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyAoaGV4IG51bWJlcikgb2Ygc3BlY2lhbCBieXRlcy5cclxuICAgIGVuZElkeCA9IGlkeCArIDQ7XHJcbiAgICB0bXAgPSBmbGRzVmFsLnN1YnN0cihpZHgsIGVuZElkeCAtIGlkeCk7XHJcbiAgICBsZW4gPSBOTnVtYmVyLlBhcnNlKHRtcCwgTnVtYmVyU3R5bGVzLkhleE51bWJlcik7XHJcbiAgICBpZHggPSBlbmRJZHg7XHJcblxyXG4gICAgLy8gaWYgd29ya2luZyBpbiBoZXhcclxuICAgIGlmICh1c2VIZXgpXHJcbiAgICAgIGVuZElkeCA9IGlkeCArIGxlbiAqIDI7XHJcbiAgICBlbHNlXHJcbiAgICAgIGVuZElkeCA9IGlkeCArIE1hdGguZmxvb3IoKGxlbiArIDIpIC8gMyApICogNDtcclxuXHJcbiAgICBpZiAoZW5kSWR4ID4gZmxkc1ZhbC5sZW5ndGgpXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFJlY29yZC5nZXRTcGFubmVkRmllbGQoKSBkYXRhIHN0cmluZyB0b28gc2hvcnQ6XFxuXCIgKyBmbGRzVmFsKTtcclxuXHJcbiAgICAvLyBhcHBlbmQgc3BlY2lhbCBjaGFycywgb25lIGJ5IG9uZVxyXG4gICAgd2hpbGUgKGlkeCA8IGVuZElkeCkge1xyXG4gICAgICB0bXAgPSBmbGRzVmFsLnN1YnN0cihpZHgsIDIpO1xyXG4gICAgICBhc2NpaUNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKE5OdW1iZXIuUGFyc2UodG1wLCBOdW1iZXJTdHlsZXMuSGV4TnVtYmVyKSk7XHJcbiAgICAgIHJlc3VsdC5BcHBlbmQoYXNjaWlDb2RlKTtcclxuICAgICAgaWR4ID0gaWR4ICsgMjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBuZXh0IDQgY2hhcnMgYXJlIHRoZSBsZW5ndGggb2YgbmV4dCBzZWdtZW50XHJcbiAgICBlbmRJZHggPSBpZHggKyA0O1xyXG4gICAgdG1wID0gZmxkc1ZhbC5zdWJzdHIoaWR4LCBlbmRJZHggLSBpZHgpO1xyXG4gICAgbGVuID0gTk51bWJlci5QYXJzZSh0bXAsIE51bWJlclN0eWxlcy5IZXhOdW1iZXIpO1xyXG4gICAgaWR4ID0gZW5kSWR4O1xyXG5cclxuICAgIGlmICgobGVuICYgMHg4MDAwKSA+IDApIHtcclxuICAgICAgLy8gT29wcywgbmV4dCBzZWdtZW50IG1heSBhbHNvIGJlIHNwYW5uZWRcclxuICAgICAgc3VmZml4QnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgICAgbGVuID0gKGxlbiAmIDB4N0ZGRik7XHJcblxyXG4gICAgICBpZiAodHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CIHx8IHR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpXHJcbiAgICAgICAgaWYgKHVzZUhleClcclxuICAgICAgICAgIGxlbiA9IGxlbiAqIDI7XHJcbiAgICAgICAgLy8gd29ya2luZyBpbiBiYXNlNjRcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBsZW4gPSBNYXRoLmZsb29yKChsZW4gKyAyKSAvIDMpICogNDtcclxuXHJcbiAgICAgIHBhcnNlZExlbiA9IFJlY29yZFV0aWxzLmdldFNwYW5uZWRGaWVsZChmbGRzVmFsLCBsZW4sIGlkeCwgdHlwZSwgc3VmZml4QnVmLCB1c2VIZXgpO1xyXG4gICAgICAvLyBhZnRlciB1c2luZyByZWN1cnNpdmUgZnVuY3Rpb24gdGVoIHN1ZmZpeEJ1ZiBpcyBpbiB0aGUgcmlnaHQgdHJhbnNmb3JtZWQgZm9ybVxyXG4gICAgICByZXN1bHQuQXBwZW5kKHN1ZmZpeEJ1Zi5Ub1N0cmluZygpKTtcclxuXHJcbiAgICAgIGlkeCA9IGlkeCArIHBhcnNlZExlbjtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CIHx8IHR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpXHJcbiAgICAgICAgaWYgKHVzZUhleClcclxuICAgICAgICAgIGxlbiA9IGxlbiAqIDI7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgbGVuID0gTWF0aC5mbG9vcigobGVuICsgMikgLyAzKSAqIDQ7XHJcblxyXG4gICAgICAvLyBuZXh0IHNlZ21lbnQgaXNuJ3Qgc3Bhbm5lZC4gSXQgbXVzdCBiZSB0aGUgbGFzdCBvbmUuXHJcbiAgICAgIGVuZElkeCA9IGlkeCArIGxlbjtcclxuICAgICAgaWYgKGVuZElkeCA+IGZsZHNWYWwubGVuZ3RoKVxyXG4gICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFJlY29yZC5maWxsRmllbGRzRGF0YSgpIGRhdGEgc3RyaW5nIHRvbyBzaG9ydDpcXG5cIiArIGZsZHNWYWwpO1xyXG5cclxuICAgICAgcmVzdWx0LkFwcGVuZChSZWNvcmRVdGlscy5nZXRTdHJpbmcoZmxkc1ZhbC5zdWJzdHIoaWR4LCBlbmRJZHggLSBpZHgpLCB0eXBlLCB1c2VIZXgpKTtcclxuICAgICAgaWR4ID0gZW5kSWR4O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpZHggLSBiZWdpbjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gVHJhbnNsYXRlIHZhbHVlIG9mIHRoZSBzcGFubmVkIGZpZWxkIHRvIGFjdHVhbCB2YWx1ZS4gRmllbGQgdmFsdWUgd2lsbCBiZSBpbiB0aGUgZm9ybWF0IG9mIGxlbmd0aCBhbmQgZGF0YVxyXG4gIC8vLyBbIChMZW5ndGggfCBkYXRhKSAoKExlbmd0aCB8IGRhdGEpKS4uLi4uXVxyXG4gIC8vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVhZCBsZW5ndGggYW5kIGRhdGEgb2YgZWFjaCBwYWNrZXQgYW5kIHJldHVybiBhY3R1YWwgdmFsdWUuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmbGRzVmFsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmaXJzdFNlZ0xlblwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaWR4XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0eXBlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXN1bHRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInVzZUhleFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibm9PZlBhY2tldHNcIj4gVG90YWwgbnVtYmVyIG9mIHBhY2tldHMgc2VudCBmcm9tIHRoZSBzZXJ2ZXI8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0U3Bhbm5lZEZpZWxkXzEoZmxkc1ZhbDogVWludDhBcnJheSwgZmlyc3RTZWdMZW46IG51bWJlciwgaWR4OiBudW1iZXIsIHR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUsIHJlc3VsdDogU3RyaW5nQnVpbGRlciwgdXNlSGV4OiBib29sZWFuLCBub09mUGFja2V0czogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBlbmRJZHg6IG51bWJlciA9IGlkeCArIGZpcnN0U2VnTGVuO1xyXG4gICAgbGV0IGxlbjogbnVtYmVyO1xyXG4gICAgbGV0IGJlZ2luOiBudW1iZXIgPSBpZHg7XHJcbiAgICBsZXQgdG1wOiBzdHJpbmc7XHJcbiAgICBsZXQgc3VmZml4QnVmOiBTdHJpbmdCdWlsZGVyID0gbnVsbDtcclxuICAgIGxldCBwYXJzZWRMZW46IG51bWJlcjtcclxuICAgIGxldCB0bXBFbmM6IEVuY29kaW5nO1xyXG4gICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkpXHJcbiAgICAgIHRtcEVuYyA9IElTT184ODU5XzFfRW5jb2RpbmcuSVNPXzg4NTlfMTtcclxuICAgIGVsc2VcclxuICAgICAgdG1wRW5jID0gR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0RW5jb2RpbmcoKTtcclxuXHJcbiAgICBpZiAoZW5kSWR4ID4gZmxkc1ZhbC5sZW5ndGgpXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFJlY29yZC5nZXRTcGFubmVkRmllbGQoKSBkYXRhIHN0cmluZyB0b28gc2hvcnQ6XFxuXCIgKyBmbGRzVmFsKTtcclxuXHJcbiAgICAvLyBhcHBlbmQgZmlyc3Qgc2VnbWVudFxyXG4gICAgcmVzdWx0LlJlbW92ZSgwLCByZXN1bHQuTGVuZ3RoKTtcclxuICAgIHJlc3VsdC5BcHBlbmQodG1wRW5jLkdldFN0cmluZyhmbGRzVmFsLCBpZHgsIGZpcnN0U2VnTGVuKSk7XHJcbiAgICBub09mUGFja2V0cyA9IG5vT2ZQYWNrZXRzIC0gMTtcclxuXHJcbiAgICBpZiAobm9PZlBhY2tldHMgPD0gMClcclxuICAgICAgcmV0dXJuIDA7XHJcblxyXG4gICAgaWR4ID0gaWR4ICsgZmlyc3RTZWdMZW47XHJcblxyXG4gICAgLy8gbmV4dCA0IGNoYXJhY3RlcnMgYXJlIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyAoaGV4IG51bWJlcikgb2Ygc3BlY2lhbCBieXRlcy5cclxuICAgIGVuZElkeCA9IGlkeCArIDQ7XHJcbiAgICB0bXAgPSB0bXBFbmMuR2V0U3RyaW5nKGZsZHNWYWwsIGlkeCwgNCk7XHJcbiAgICBsZW4gPSBOTnVtYmVyLlBhcnNlKHRtcCwgTnVtYmVyU3R5bGVzLkhleE51bWJlcik7XHJcbiAgICBpZHggPSBlbmRJZHg7XHJcblxyXG4gICAgaWYgKGVuZElkeCA+IGZsZHNWYWwubGVuZ3RoKVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBSZWNvcmQuZ2V0U3Bhbm5lZEZpZWxkKCkgZGF0YSBzdHJpbmcgdG9vIHNob3J0OlxcblwiICsgZmxkc1ZhbCk7XHJcblxyXG4gICAgLy8gbmV4dCA0IGNoYXJzIGFyZSB0aGUgbGVuZ3RoIG9mIG5leHQgc2VnbWVudFxyXG4gICAgZW5kSWR4ID0gaWR4ICsgNDtcclxuICAgIHRtcCA9IHRtcEVuYy5HZXRTdHJpbmcoZmxkc1ZhbCwgaWR4LCA0KTtcclxuICAgIGxlbiA9IE5OdW1iZXIuUGFyc2UodG1wLCBOdW1iZXJTdHlsZXMuSGV4TnVtYmVyKTtcclxuICAgIGlkeCA9IGVuZElkeDtcclxuXHJcbiAgICBpZiAoKGxlbiAmIDB4ODAwMCkgPiAwKSB7XHJcbiAgICAgIC8vIE9vcHMsIG5leHQgc2VnbWVudCBtYXkgYWxzbyBiZSBzcGFubmVkXHJcbiAgICAgIHN1ZmZpeEJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcblxyXG4gICAgICBwYXJzZWRMZW4gPSBSZWNvcmRVdGlscy5nZXRTcGFubmVkRmllbGQoZmxkc1ZhbCwgbGVuLCBpZHgsIHR5cGUsIHN1ZmZpeEJ1ZiwgdXNlSGV4LCBub09mUGFja2V0cyk7XHJcbiAgICAgIC8vIGFmdGVyIHVzaW5nIHJlY3Vyc2l2ZSBmdW5jdGlvbiB0ZWggc3VmZml4QnVmIGlzIGluIHRoZSByaWdodCB0cmFuc2Zvcm1lZCBmb3JtXHJcbiAgICAgIHJlc3VsdC5BcHBlbmQoc3VmZml4QnVmLlRvU3RyaW5nKCkpO1xyXG4gICAgICBpZHggPSBpZHggKyBwYXJzZWRMZW47XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gbmV4dCBzZWdtZW50IGlzbid0IHNwYW5uZWQuIEl0IG11c3QgYmUgdGhlIGxhc3Qgb25lLlxyXG4gICAgICBlbmRJZHggPSBpZHggKyBsZW47XHJcbiAgICAgIGlmIChlbmRJZHggPiBmbGRzVmFsLmxlbmd0aClcclxuICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBSZWNvcmQuZmlsbEZpZWxkc0RhdGEoKSBkYXRhIHN0cmluZyB0b28gc2hvcnQ6XFxuXCIgKyBmbGRzVmFsKTtcclxuXHJcbiAgICAgIHJlc3VsdC5BcHBlbmQodG1wRW5jLkdldFN0cmluZyhmbGRzVmFsLCBpZHgsIGxlbikpO1xyXG4gICAgICBpZHggPSBlbmRJZHg7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGlkeCAtIGJlZ2luO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNlcmlhbGl6ZSBhbiBpdGVtIChmaWVsZC9nbG9iYWwgcGFyYW0vLi4uKSB0byBhbiBYTUwgZm9ybWF0IChhcHBsaWNhYmxlIHRvIGJlIHBhc3NlZCB0byB0aGUgc2VydmVyKS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+aXRlbSdzIHZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIml0ZW1BdHRyXCI+aXRlbSdzIGF0dHJpYnV0ZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjZWxsQXR0clwiPmNlbGwncyBhdHRyaWJ1dGUgLSByZWxldmFudCBvbmx5IGlmICdpdGVtQXR0cicgaXMgdmVjdG9yPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIlRvQmFzZTY0XCI+PmRlY2lkZSBCYXNlNjQgZW5jb2RpbmcgaXMgdG8gYmUgZG9uZTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPnNlcmlhbGl6ZWQgWE1MIGZvcm1hdDwvcmV0dXJucz5cclxuICBzdGF0aWMgaXRlbVZhbFRvWE1MKGl0ZW1WYWw6IHN0cmluZywgaXRlbUF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUsIGNlbGxBdHRyOiBTdG9yYWdlQXR0cmlidXRlLCBUb0Jhc2U2NDogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICBsZXQgdG1wQnVmOiBzdHJpbmcgPSBSZWNvcmRVdGlscy5zZXJpYWxpemVJdGVtVmFsKGl0ZW1WYWwsIGl0ZW1BdHRyLCBjZWxsQXR0ciwgVG9CYXNlNjQpO1xyXG4gICAgcmV0dXJuIFhtbFBhcnNlci5lc2NhcGUodG1wQnVmKS50b1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiBnZXQgdGhlIGFjdHVhbCBzdHJpbmcgYWNjb3JkaW5nIHRvICd0eXBlJzwvcmV0dXJucz5cclxuICBzdGF0aWMgZ2V0U3RyaW5nXzIoc3RyOiBzdHJpbmcsIHR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUpOiBzdHJpbmcge1xyXG4gICAgbGV0IHVzZUhleDogYm9vbGVhbiA9IEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldERlYnVnTGV2ZWwoKSA+IDEgfHwgdHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQVxyXG4gICAgICB8fCB0eXBlID09PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUgfHwgU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLmlzVHlwZUxvZ2ljYWwodHlwZSk7XHJcblxyXG4gICAgLy8gZmlyc3QgNCBjaGFyYWN0ZXJzIGFyZSB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgKGhleCBudW1iZXIpXHJcbiAgICBsZXQgdG1wOiBzdHJpbmc7XHJcbiAgICBpZiAodHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSB8fCB0eXBlID09PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUgfHxcclxuICAgICAgdHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CIHx8IHR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpIHtcclxuICAgICAgdG1wID0gc3RyLnN1YnN0cig0KTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdG1wID0gc3RyO1xyXG5cclxuICAgIHJldHVybiBSZWNvcmRVdGlscy5nZXRTdHJpbmcodG1wLCB0eXBlLCB1c2VIZXgpO1xyXG4gIH1cclxuXHJcbn1cclxuIl19