mtrl-addons 0.3.9 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/viewport/features/collection.d.ts +1 -0
- package/dist/index.js +121 -114
- package/dist/index.mjs +121 -114
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -3732,6 +3732,38 @@ function withCollection(config = {}) {
|
|
|
3732
3732
|
}
|
|
3733
3733
|
return result;
|
|
3734
3734
|
};
|
|
3735
|
+
const reset = () => {
|
|
3736
|
+
logMemoryStats("reset:before");
|
|
3737
|
+
abortControllers.forEach((controller) => {
|
|
3738
|
+
try {
|
|
3739
|
+
controller.abort();
|
|
3740
|
+
} catch (e) {}
|
|
3741
|
+
});
|
|
3742
|
+
abortControllers.clear();
|
|
3743
|
+
items.length = 0;
|
|
3744
|
+
loadRequestQueue.length = 0;
|
|
3745
|
+
loadedRanges.clear();
|
|
3746
|
+
pendingRanges.clear();
|
|
3747
|
+
failedRanges.clear();
|
|
3748
|
+
activeLoadRanges.clear();
|
|
3749
|
+
activeRequests.clear();
|
|
3750
|
+
cursorMap.clear();
|
|
3751
|
+
pageToOffsetMap.clear();
|
|
3752
|
+
totalItems = 0;
|
|
3753
|
+
currentCursor = null;
|
|
3754
|
+
highestLoadedPage = 0;
|
|
3755
|
+
discoveredTotal = null;
|
|
3756
|
+
hasReachedEnd = false;
|
|
3757
|
+
hasCompletedInitialPositionLoad = false;
|
|
3758
|
+
activeLoadCount = 0;
|
|
3759
|
+
completedLoads = 0;
|
|
3760
|
+
failedLoads = 0;
|
|
3761
|
+
cancelledLoads = 0;
|
|
3762
|
+
component2.items = items;
|
|
3763
|
+
component2.totalItems = 0;
|
|
3764
|
+
logMemoryStats("reset:after");
|
|
3765
|
+
component2.emit?.("collection:reset");
|
|
3766
|
+
};
|
|
3735
3767
|
component2.viewport.collection = {
|
|
3736
3768
|
loadRange: (offset, limit) => loadRange(offset, limit),
|
|
3737
3769
|
loadMissingRanges: (range, caller) => loadMissingRanges(range, caller || "viewport.collection"),
|
|
@@ -3742,7 +3774,8 @@ function withCollection(config = {}) {
|
|
|
3742
3774
|
setTotalItems,
|
|
3743
3775
|
getTotalItems: () => totalItems,
|
|
3744
3776
|
getCurrentCursor: () => currentCursor,
|
|
3745
|
-
getCursorForPage: (page) => cursorMap.get(page) || null
|
|
3777
|
+
getCursorForPage: (page) => cursorMap.get(page) || null,
|
|
3778
|
+
reset
|
|
3746
3779
|
};
|
|
3747
3780
|
component2.collection = {
|
|
3748
3781
|
items,
|
|
@@ -3762,7 +3795,8 @@ function withCollection(config = {}) {
|
|
|
3762
3795
|
getTotalItems: () => totalItems,
|
|
3763
3796
|
setTotalItems,
|
|
3764
3797
|
getCurrentCursor: () => currentCursor,
|
|
3765
|
-
getCursorForPage: (page) => cursorMap.get(page) || null
|
|
3798
|
+
getCursorForPage: (page) => cursorMap.get(page) || null,
|
|
3799
|
+
reset
|
|
3766
3800
|
};
|
|
3767
3801
|
component2.items = items;
|
|
3768
3802
|
const destroy = () => {
|
|
@@ -3808,7 +3842,8 @@ function withCollection(config = {}) {
|
|
|
3808
3842
|
setTotalItems,
|
|
3809
3843
|
getTotalItems: () => totalItems,
|
|
3810
3844
|
getCurrentCursor: () => currentCursor,
|
|
3811
|
-
getCursorForPage: (page) => cursorMap.get(page) || null
|
|
3845
|
+
getCursorForPage: (page) => cursorMap.get(page) || null,
|
|
3846
|
+
reset
|
|
3812
3847
|
}
|
|
3813
3848
|
};
|
|
3814
3849
|
};
|
|
@@ -3998,8 +4033,10 @@ var withRendering = (config = {}) => {
|
|
|
3998
4033
|
maxPoolSize = VIEWPORT_CONSTANTS.RENDERING.DEFAULT_MAX_POOL_SIZE,
|
|
3999
4034
|
maintainDomOrder = true
|
|
4000
4035
|
} = config;
|
|
4036
|
+
const getCollectionItems = () => {
|
|
4037
|
+
return component2.collection?.items || component2.items || [];
|
|
4038
|
+
};
|
|
4001
4039
|
const renderedElements = new Map;
|
|
4002
|
-
const collectionItems = {};
|
|
4003
4040
|
const elementPool = [];
|
|
4004
4041
|
const poolStats = { created: 0, recycled: 0, poolSize: 0, released: 0 };
|
|
4005
4042
|
const layoutResults = new WeakMap;
|
|
@@ -4050,7 +4087,6 @@ var withRendering = (config = {}) => {
|
|
|
4050
4087
|
}
|
|
4051
4088
|
component2.on?.("item:update-request", (data) => {
|
|
4052
4089
|
const { index, item, previousItem } = data;
|
|
4053
|
-
collectionItems[index] = item;
|
|
4054
4090
|
const existingElement = renderedElements.get(index);
|
|
4055
4091
|
const wasVisible = !!existingElement;
|
|
4056
4092
|
const wasSelected = existingElement ? import_mtrl7.hasClass(existingElement, VIEWPORT_CONSTANTS.SELECTION.SELECTED_CLASS) || import_mtrl7.hasClass(existingElement, "mtrl-viewport-item--selected") : false;
|
|
@@ -4093,29 +4129,6 @@ var withRendering = (config = {}) => {
|
|
|
4093
4129
|
component2.on?.("item:remove-request", (data) => {
|
|
4094
4130
|
const { index, item } = data;
|
|
4095
4131
|
isRemovingItem = true;
|
|
4096
|
-
const collectionItemsSource = component2.collection?.items || component2.items || [];
|
|
4097
|
-
const keys = Object.keys(collectionItems).map(Number).filter((k) => !isNaN(k)).sort((a, b) => a - b);
|
|
4098
|
-
delete collectionItems[index];
|
|
4099
|
-
const loadedLength = collectionItemsSource.length;
|
|
4100
|
-
for (const key of keys) {
|
|
4101
|
-
if (key > index) {
|
|
4102
|
-
const newIndex = key - 1;
|
|
4103
|
-
if (newIndex < loadedLength && collectionItemsSource[newIndex]) {
|
|
4104
|
-
collectionItems[newIndex] = collectionItemsSource[newIndex];
|
|
4105
|
-
} else {
|
|
4106
|
-
collectionItems[newIndex] = collectionItems[key];
|
|
4107
|
-
}
|
|
4108
|
-
delete collectionItems[key];
|
|
4109
|
-
}
|
|
4110
|
-
}
|
|
4111
|
-
const finalKeys = Object.keys(collectionItems).map(Number).filter((k) => !isNaN(k)).sort((a, b) => a - b);
|
|
4112
|
-
const badIndices = [];
|
|
4113
|
-
for (let i = 0;i < Math.min(30, finalKeys.length); i++) {
|
|
4114
|
-
const k = finalKeys[i];
|
|
4115
|
-
if (!collectionItems[k] || collectionItems[k]._placeholder) {
|
|
4116
|
-
badIndices.push(k);
|
|
4117
|
-
}
|
|
4118
|
-
}
|
|
4119
4132
|
const existingElement = renderedElements.get(index);
|
|
4120
4133
|
if (existingElement && existingElement.parentNode) {
|
|
4121
4134
|
releaseElement(existingElement);
|
|
@@ -4154,13 +4167,8 @@ var withRendering = (config = {}) => {
|
|
|
4154
4167
|
const loadedRanges = collection.getLoadedRanges();
|
|
4155
4168
|
loadedRanges.clear();
|
|
4156
4169
|
}
|
|
4157
|
-
const
|
|
4158
|
-
const
|
|
4159
|
-
cacheKeys.forEach((key) => {
|
|
4160
|
-
if (key >= loadedItemsCount) {
|
|
4161
|
-
delete collectionItems[key];
|
|
4162
|
-
}
|
|
4163
|
-
});
|
|
4170
|
+
const collectionItemsArr = getCollectionItems();
|
|
4171
|
+
const loadedItemsCount = collectionItemsArr.length;
|
|
4164
4172
|
const visibleRange = component2.viewport?.getVisibleRange?.();
|
|
4165
4173
|
if (visibleRange && collection?.loadMissingRanges) {
|
|
4166
4174
|
collection.loadMissingRanges({ start: 0, end: Math.max(visibleRange.end, loadedItemsCount) }, "item-removal");
|
|
@@ -4172,37 +4180,18 @@ var withRendering = (config = {}) => {
|
|
|
4172
4180
|
const { items: newItems, position, previousCount } = data;
|
|
4173
4181
|
if (!newItems || newItems.length === 0)
|
|
4174
4182
|
return;
|
|
4175
|
-
const collectionItemsSource = component2.collection?.items || component2.items || [];
|
|
4176
4183
|
const itemsAdded = newItems.length;
|
|
4177
4184
|
if (position === "start") {
|
|
4178
|
-
const keys = Object.keys(collectionItems).map(Number).filter((k) => !isNaN(k)).sort((a, b) => b - a);
|
|
4179
|
-
for (const key of keys) {
|
|
4180
|
-
const newIndex = key + itemsAdded;
|
|
4181
|
-
collectionItems[newIndex] = collectionItems[key];
|
|
4182
|
-
delete collectionItems[key];
|
|
4183
|
-
}
|
|
4184
|
-
for (let i = 0;i < itemsAdded; i++) {
|
|
4185
|
-
collectionItems[i] = newItems[i];
|
|
4186
|
-
}
|
|
4187
4185
|
const renderedKeys = Array.from(renderedElements.keys()).sort((a, b) => b - a);
|
|
4188
4186
|
const newRenderedElements = new Map;
|
|
4189
4187
|
for (const key of renderedKeys) {
|
|
4190
4188
|
const element = renderedElements.get(key);
|
|
4191
|
-
|
|
4192
|
-
|
|
4193
|
-
|
|
4194
|
-
newRenderedElements.set(newIndex, element);
|
|
4195
|
-
}
|
|
4189
|
+
const newIndex = key + itemsAdded;
|
|
4190
|
+
element.setAttribute("data-index", String(newIndex));
|
|
4191
|
+
newRenderedElements.set(newIndex, element);
|
|
4196
4192
|
}
|
|
4197
4193
|
renderedElements.clear();
|
|
4198
|
-
|
|
4199
|
-
renderedElements.set(key, element);
|
|
4200
|
-
}
|
|
4201
|
-
} else {
|
|
4202
|
-
for (let i = 0;i < itemsAdded; i++) {
|
|
4203
|
-
const index = previousCount + i;
|
|
4204
|
-
collectionItems[index] = newItems[i];
|
|
4205
|
-
}
|
|
4194
|
+
newRenderedElements.forEach((el, idx) => renderedElements.set(idx, el));
|
|
4206
4195
|
}
|
|
4207
4196
|
if (viewportState) {
|
|
4208
4197
|
viewportState.totalItems = (viewportState.totalItems || 0) + itemsAdded;
|
|
@@ -4221,15 +4210,20 @@ var withRendering = (config = {}) => {
|
|
|
4221
4210
|
});
|
|
4222
4211
|
});
|
|
4223
4212
|
component2.on?.("collection:items-evicted", (data) => {
|
|
4224
|
-
const { keepStart, keepEnd
|
|
4225
|
-
|
|
4226
|
-
for (const key in collectionItems) {
|
|
4227
|
-
const index = parseInt(key, 10);
|
|
4213
|
+
const { keepStart, keepEnd } = data;
|
|
4214
|
+
renderedElements.forEach((element, index) => {
|
|
4228
4215
|
if (index < keepStart || index > keepEnd) {
|
|
4229
|
-
|
|
4230
|
-
|
|
4216
|
+
releaseElement(element);
|
|
4217
|
+
renderedElements.delete(index);
|
|
4231
4218
|
}
|
|
4232
|
-
}
|
|
4219
|
+
});
|
|
4220
|
+
});
|
|
4221
|
+
component2.on?.("collection:reset", () => {
|
|
4222
|
+
renderedElements.forEach((element) => {
|
|
4223
|
+
releaseElement(element);
|
|
4224
|
+
});
|
|
4225
|
+
renderedElements.clear();
|
|
4226
|
+
currentVisibleRange = { start: -1, end: -1 };
|
|
4233
4227
|
});
|
|
4234
4228
|
component2.on?.("collection:range-loaded", (data) => {
|
|
4235
4229
|
if (!data.items?.length)
|
|
@@ -4238,59 +4232,42 @@ var withRendering = (config = {}) => {
|
|
|
4238
4232
|
if (placeholders && !placeholders.hasAnalyzedStructure()) {
|
|
4239
4233
|
placeholders.analyzeDataStructure(data.items);
|
|
4240
4234
|
}
|
|
4241
|
-
let skippedCount = 0;
|
|
4242
4235
|
data.items.forEach((item, i) => {
|
|
4243
4236
|
const index = data.offset + i;
|
|
4244
|
-
const
|
|
4245
|
-
|
|
4246
|
-
|
|
4247
|
-
|
|
4248
|
-
|
|
4249
|
-
|
|
4250
|
-
|
|
4251
|
-
|
|
4252
|
-
if (newElement) {
|
|
4253
|
-
import_mtrl7.removeClass(newElement, VIEWPORT_CONSTANTS.PLACEHOLDER.CLASS);
|
|
4254
|
-
if (newElement.firstElementChild) {
|
|
4255
|
-
import_mtrl7.removeClass(newElement.firstElementChild, VIEWPORT_CONSTANTS.PLACEHOLDER.CLASS);
|
|
4256
|
-
}
|
|
4257
|
-
import_mtrl7.addClass(newElement, "viewport-item--replaced");
|
|
4258
|
-
Object.assign(newElement.style, {
|
|
4259
|
-
position: element.style.position,
|
|
4260
|
-
transform: element.style.transform,
|
|
4261
|
-
width: element.style.width
|
|
4262
|
-
});
|
|
4263
|
-
element.parentNode?.replaceChild(newElement, element);
|
|
4264
|
-
renderedElements.set(index, newElement);
|
|
4265
|
-
releaseElement(element);
|
|
4266
|
-
setTimeout(() => {
|
|
4267
|
-
import_mtrl7.removeClass(newElement, "viewport-item--replaced");
|
|
4268
|
-
}, 300);
|
|
4269
|
-
} else {
|
|
4270
|
-
releaseElement(element);
|
|
4271
|
-
renderedElements.delete(index);
|
|
4237
|
+
const element = renderedElements.get(index);
|
|
4238
|
+
const isPlaceholderElement = element?.classList.contains(VIEWPORT_CONSTANTS.PLACEHOLDER.CLASS) || element?.classList.contains(`mtrl-${VIEWPORT_CONSTANTS.PLACEHOLDER.CLASS}`);
|
|
4239
|
+
if (isPlaceholderElement) {
|
|
4240
|
+
const newElement = renderItem(item, index);
|
|
4241
|
+
if (newElement) {
|
|
4242
|
+
import_mtrl7.removeClass(newElement, VIEWPORT_CONSTANTS.PLACEHOLDER.CLASS);
|
|
4243
|
+
if (newElement.firstElementChild) {
|
|
4244
|
+
import_mtrl7.removeClass(newElement.firstElementChild, VIEWPORT_CONSTANTS.PLACEHOLDER.CLASS);
|
|
4272
4245
|
}
|
|
4246
|
+
import_mtrl7.addClass(newElement, "viewport-item--replaced");
|
|
4247
|
+
Object.assign(newElement.style, {
|
|
4248
|
+
position: element.style.position,
|
|
4249
|
+
transform: element.style.transform,
|
|
4250
|
+
width: element.style.width
|
|
4251
|
+
});
|
|
4252
|
+
element.parentNode?.replaceChild(newElement, element);
|
|
4253
|
+
renderedElements.set(index, newElement);
|
|
4254
|
+
releaseElement(element);
|
|
4255
|
+
setTimeout(() => {
|
|
4256
|
+
import_mtrl7.removeClass(newElement, "viewport-item--replaced");
|
|
4257
|
+
}, 300);
|
|
4258
|
+
} else {
|
|
4259
|
+
releaseElement(element);
|
|
4260
|
+
renderedElements.delete(index);
|
|
4273
4261
|
}
|
|
4274
|
-
} else if (wasPlaceholder && !hasElement) {
|
|
4275
|
-
skippedCount++;
|
|
4276
4262
|
}
|
|
4277
4263
|
});
|
|
4278
|
-
if (skippedCount > 0 && viewportState?.visibleRange) {
|
|
4279
|
-
const { start, end } = viewportState.visibleRange;
|
|
4280
|
-
const loadedStart = data.offset;
|
|
4281
|
-
const loadedEnd = data.offset + data.items.length - 1;
|
|
4282
|
-
if (loadedStart <= end && loadedEnd >= start) {
|
|
4283
|
-
renderItems();
|
|
4284
|
-
}
|
|
4285
|
-
}
|
|
4286
4264
|
const { visibleRange } = viewportState || {};
|
|
4287
4265
|
if (visibleRange) {
|
|
4288
4266
|
const renderStart = Math.max(0, visibleRange.start - overscan);
|
|
4289
4267
|
const renderEnd = Math.min(viewportState?.totalItems ?? 0 - 1, visibleRange.end + overscan);
|
|
4290
4268
|
const loadedStart = data.offset;
|
|
4291
4269
|
const loadedEnd = data.offset + data.items.length - 1;
|
|
4292
|
-
const
|
|
4293
|
-
const needsRender = loadedStart <= renderEnd && loadedEnd >= renderStart && renderedElements.size < renderEnd - renderStart + 1 || hasPlaceholdersInRange;
|
|
4270
|
+
const needsRender = loadedStart <= renderEnd && loadedEnd >= renderStart && renderedElements.size < renderEnd - renderStart + 1;
|
|
4294
4271
|
if (needsRender)
|
|
4295
4272
|
renderItems();
|
|
4296
4273
|
}
|
|
@@ -4499,8 +4476,7 @@ var withRendering = (config = {}) => {
|
|
|
4499
4476
|
releaseElement(element);
|
|
4500
4477
|
renderedElements.delete(index);
|
|
4501
4478
|
});
|
|
4502
|
-
const
|
|
4503
|
-
const items = hasCollectionItems ? collectionItems : component2.items || [];
|
|
4479
|
+
const items = getCollectionItems();
|
|
4504
4480
|
const missingItems = [];
|
|
4505
4481
|
const newElements = [];
|
|
4506
4482
|
for (let i = renderStart;i <= renderEnd; i++) {
|
|
@@ -4518,7 +4494,6 @@ var withRendering = (config = {}) => {
|
|
|
4518
4494
|
text: VIEWPORT_CONSTANTS.PLACEHOLDER.MASK_CHARACTER.repeat(25),
|
|
4519
4495
|
description: VIEWPORT_CONSTANTS.PLACEHOLDER.MASK_CHARACTER.repeat(40)
|
|
4520
4496
|
};
|
|
4521
|
-
collectionItems[i] = item;
|
|
4522
4497
|
}
|
|
4523
4498
|
const element = renderItem(item, i);
|
|
4524
4499
|
if (element) {
|
|
@@ -4587,9 +4562,6 @@ var withRendering = (config = {}) => {
|
|
|
4587
4562
|
});
|
|
4588
4563
|
renderedElements.clear();
|
|
4589
4564
|
elementPool.length = 0;
|
|
4590
|
-
for (const key in collectionItems) {
|
|
4591
|
-
delete collectionItems[key];
|
|
4592
|
-
}
|
|
4593
4565
|
currentVisibleRange = { start: -1, end: -1 };
|
|
4594
4566
|
viewportState = null;
|
|
4595
4567
|
lastRenderTime = 0;
|
|
@@ -4716,6 +4688,9 @@ var createViewport = (config = {}) => {
|
|
|
4716
4688
|
destroy: () => {},
|
|
4717
4689
|
updateViewport: () => {},
|
|
4718
4690
|
isInitialized: () => isInitialized,
|
|
4691
|
+
resetInitialization: () => {
|
|
4692
|
+
isInitialized = false;
|
|
4693
|
+
},
|
|
4719
4694
|
_shouldInit: () => !isInitialized,
|
|
4720
4695
|
scrollToIndex: (index, alignment) => {},
|
|
4721
4696
|
scrollToPosition: (position) => {},
|
|
@@ -4866,6 +4841,38 @@ var withAPI = (config) => {
|
|
|
4866
4841
|
});
|
|
4867
4842
|
return {
|
|
4868
4843
|
...component2,
|
|
4844
|
+
async reload() {
|
|
4845
|
+
if (component2.viewport?.collection?.reset) {
|
|
4846
|
+
component2.viewport.collection.reset();
|
|
4847
|
+
}
|
|
4848
|
+
if (component2.viewport?.scrollTo) {
|
|
4849
|
+
component2.viewport.scrollTo(0);
|
|
4850
|
+
}
|
|
4851
|
+
const itemsContainer = component2.element?.querySelector(".mtrl-viewport-items");
|
|
4852
|
+
if (itemsContainer) {
|
|
4853
|
+
itemsContainer.innerHTML = "";
|
|
4854
|
+
}
|
|
4855
|
+
if (component2.viewport?.resetInitialization) {
|
|
4856
|
+
component2.viewport.resetInitialization();
|
|
4857
|
+
}
|
|
4858
|
+
if (component2.viewport?.initialize) {
|
|
4859
|
+
component2.viewport.initialize();
|
|
4860
|
+
}
|
|
4861
|
+
component2.emit?.("reloaded");
|
|
4862
|
+
},
|
|
4863
|
+
clear() {
|
|
4864
|
+
if (component2.viewport?.collection?.reset) {
|
|
4865
|
+
component2.viewport.collection.reset();
|
|
4866
|
+
}
|
|
4867
|
+
if (component2.viewport?.scrollTo) {
|
|
4868
|
+
component2.viewport.scrollTo(0);
|
|
4869
|
+
}
|
|
4870
|
+
const itemsContainer = component2.element?.querySelector(".mtrl-viewport-items");
|
|
4871
|
+
if (itemsContainer) {
|
|
4872
|
+
itemsContainer.innerHTML = "";
|
|
4873
|
+
}
|
|
4874
|
+
component2.emit?.("cleared");
|
|
4875
|
+
},
|
|
4869
4876
|
setItems(items) {
|
|
4870
4877
|
if (component2.viewport?.collection) {
|
|
4871
4878
|
component2.viewport.collection.setItems(items);
|
|
@@ -7215,5 +7222,5 @@ var createForm = (config = {}) => {
|
|
|
7215
7222
|
}
|
|
7216
7223
|
};
|
|
7217
7224
|
|
|
7218
|
-
//# debugId=
|
|
7219
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvdXRpbHMudHMiLCAiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvdGFwLnRzIiwgIi4uL3NyYy9jb3JlL2dlc3R1cmVzL3N3aXBlLnRzIiwgIi4uL3NyYy9jb3JlL2dlc3R1cmVzL2xvbmdwcmVzcy50cyIsICIuLi9zcmMvY29yZS9nZXN0dXJlcy9wYW4udHMiLCAiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvcGluY2gudHMiLCAiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvcm90YXRlLnRzIiwgIi4uL3NyYy9jb3JlL2dlc3R1cmVzL21hbmFnZXIudHMiLCAiLi4vc3JjL2NvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlcy9pbmRleC50cyIsICIuLi9zcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3RhcC50cyIsICIuLi9zcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3N3aXBlLnRzIiwgIi4uL3NyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMvbG9uZ3ByZXNzLnRzIiwgIi4uL3NyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMvcGFuLnRzIiwgIi4uL3NyYy9jb3JlL2xheW91dC9zY2hlbWEudHMiLCAiLi4vc3JjL2NvcmUvbGF5b3V0L2NvbmZpZy50cyIsICIuLi9zcmMvY29yZS9sYXlvdXQvanN4LnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L3ZpZXdwb3J0LnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3V0aWxzLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL2Jhc2UudHMiLCAiLi4vc3JjL2NvcmUvdmlld3BvcnQvY29uc3RhbnRzLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3ZpcnR1YWwudHMiLCAiLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvc2Nyb2xsaW5nLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL21vbWVudHVtLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3Njcm9sbGJhci50cyIsICIuLi9zcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9jb2xsZWN0aW9uLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3BsYWNlaG9sZGVycy50cyIsICIuLi9zcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9yZW5kZXJpbmcudHMiLCAiLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvZXZlbnRzLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L3ZsaXN0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL3ZpZXdwb3J0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL2FwaS50cyIsICIuLi9zcmMvY29tcG9uZW50cy92bGlzdC9jb25zdGFudHMudHMiLCAiLi4vc3JjL2NvbXBvbmVudHMvdmxpc3QvZmVhdHVyZXMvc2VsZWN0aW9uLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL2tleWJvYXJkLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vZm9ybS50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2xheW91dC50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2NvbnN0YW50cy50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2NvbmZpZy50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2ZpZWxkcy50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2RhdGEudHMiLCAiLi4vc3JjL2NvbXBvbmVudHMvZm9ybS9mZWF0dXJlcy9jb250cm9sbGVyLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vZmVhdHVyZXMvc3VibWl0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vZmVhdHVyZXMvcHJvdGVjdGlvbi50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2FwaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy91dGlscy50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgZ2VzdHVyZSBkZXRlY3Rpb25cbiAqL1xuXG5pbXBvcnQgeyBHZXN0dXJlRXZlbnQsIEdlc3R1cmVTdGF0ZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQ2FsY3VsYXRlIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50c1xuICpcbiAqIEBwYXJhbSB4MSAtIFggY29vcmRpbmF0ZSBvZiBmaXJzdCBwb2ludFxuICogQHBhcmFtIHkxIC0gWSBjb29yZGluYXRlIG9mIGZpcnN0IHBvaW50XG4gKiBAcGFyYW0geDIgLSBYIGNvb3JkaW5hdGUgb2Ygc2Vjb25kIHBvaW50XG4gKiBAcGFyYW0geTIgLSBZIGNvb3JkaW5hdGUgb2Ygc2Vjb25kIHBvaW50XG4gKiBAcmV0dXJucyBEaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERpc3RhbmNlKFxuICB4MTogbnVtYmVyLFxuICB5MTogbnVtYmVyLFxuICB4MjogbnVtYmVyLFxuICB5MjogbnVtYmVyXG4pOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KHgyIC0geDEsIDIpICsgTWF0aC5wb3coeTIgLSB5MSwgMikpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBhbmdsZSBiZXR3ZWVuIHR3byBwb2ludHMgaW4gZGVncmVlcyAoMC0zNjApXG4gKlxuICogQHBhcmFtIHgxIC0gWCBjb29yZGluYXRlIG9mIGZpcnN0IHBvaW50XG4gKiBAcGFyYW0geTEgLSBZIGNvb3JkaW5hdGUgb2YgZmlyc3QgcG9pbnRcbiAqIEBwYXJhbSB4MiAtIFggY29vcmRpbmF0ZSBvZiBzZWNvbmQgcG9pbnRcbiAqIEBwYXJhbSB5MiAtIFkgY29vcmRpbmF0ZSBvZiBzZWNvbmQgcG9pbnRcbiAqIEByZXR1cm5zIEFuZ2xlIGluIGRlZ3JlZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFuZ2xlKFxuICB4MTogbnVtYmVyLFxuICB5MTogbnVtYmVyLFxuICB4MjogbnVtYmVyLFxuICB5MjogbnVtYmVyXG4pOiBudW1iZXIge1xuICBjb25zdCBhbmdsZSA9IChNYXRoLmF0YW4yKHkyIC0geTEsIHgyIC0geDEpICogMTgwKSAvIE1hdGguUEk7XG4gIHJldHVybiBhbmdsZSA8IDAgPyBhbmdsZSArIDM2MCA6IGFuZ2xlO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGJhc2UgZ2VzdHVyZSBldmVudFxuICpcbiAqIEBwYXJhbSB0eXBlIC0gVHlwZSBvZiBnZXN0dXJlXG4gKiBAcGFyYW0gb3JpZ2luYWxFdmVudCAtIE9yaWdpbmFsIERPTSBldmVudFxuICogQHBhcmFtIHN0YXRlIC0gQ3VycmVudCBnZXN0dXJlIHN0YXRlXG4gKiBAcmV0dXJucyBCYXNlIGdlc3R1cmUgZXZlbnQgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHZXN0dXJlRXZlbnQoXG4gIHR5cGU6IHN0cmluZyxcbiAgb3JpZ2luYWxFdmVudDogRXZlbnQsXG4gIHN0YXRlOiBHZXN0dXJlU3RhdGVcbik6IEdlc3R1cmVFdmVudCB7XG4gIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICBsZXQgZGVmYXVsdFByZXZlbnRlZCA9IGZhbHNlO1xuXG4gIGNvbnN0IGV2ZW50OiBHZXN0dXJlRXZlbnQgPSB7XG4gICAgdHlwZSxcbiAgICBvcmlnaW5hbEV2ZW50LFxuICAgIHRhcmdldDpcbiAgICAgIChzdGF0ZS50YXJnZXQgYXMgRXZlbnRUYXJnZXQpIHx8IChvcmlnaW5hbEV2ZW50LnRhcmdldCBhcyBFdmVudFRhcmdldCksXG4gICAgc3RhcnRUaW1lOiBzdGF0ZS5zdGFydFRpbWUsXG4gICAgZW5kVGltZSxcbiAgICBkdXJhdGlvbjogZW5kVGltZSAtIHN0YXRlLnN0YXJ0VGltZSxcbiAgICBkZWZhdWx0UHJldmVudGVkLFxuICAgIHByZXZlbnREZWZhdWx0OiAoKSA9PiB7XG4gICAgICBkZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICAgIGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgaWYgKG9yaWdpbmFsRXZlbnQuY2FuY2VsYWJsZSkge1xuICAgICAgICBvcmlnaW5hbEV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBzdG9wUHJvcGFnYXRpb246ICgpID0+IHtcbiAgICAgIG9yaWdpbmFsRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gZXZlbnQ7XG59XG5cbi8qKlxuICogRGV0ZWN0IGlmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgdG91Y2ggZXZlbnRzXG4gKlxuICogQHJldHVybnMgV2hldGhlciB0b3VjaCBpcyBzdXBwb3J0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1RvdWNoU3VwcG9ydCgpOiBib29sZWFuIHtcbiAgY29uc3QgbWF4UG9pbnRzID0gKG5hdmlnYXRvciBhcyBhbnkpLm1heFRvdWNoUG9pbnRzO1xuICByZXR1cm4gKFxuICAgIFwib250b3VjaHN0YXJ0XCIgaW4gd2luZG93IHx8ICh0eXBlb2YgbWF4UG9pbnRzID09PSBcIm51bWJlclwiICYmIG1heFBvaW50cyA+IDApXG4gICk7XG59XG5cbi8qKlxuICogRGV0ZWN0IGlmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgcG9pbnRlciBldmVudHNcbiAqXG4gKiBAcmV0dXJucyBXaGV0aGVyIHBvaW50ZXIgZXZlbnRzIGFyZSBzdXBwb3J0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1BvaW50ZXJTdXBwb3J0KCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISF3aW5kb3cuUG9pbnRlckV2ZW50O1xufVxuXG4vKipcbiAqIEV4dHJhY3Qgbm9ybWFsaXplZCB0b3VjaCBjb29yZGluYXRlcyBmcm9tIGFuIGV2ZW50XG4gKiBXb3JrcyB3aXRoIG1vdXNlIGV2ZW50cywgdG91Y2ggZXZlbnRzIGFuZCBwb2ludGVyIGV2ZW50c1xuICpcbiAqIEBwYXJhbSBlIC0gRE9NIGV2ZW50XG4gKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBjbGllbnRYIGFuZCBjbGllbnRZIGNvb3JkaW5hdGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUb3VjaENvb3JkaW5hdGVzKFxuICBlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCB8IFBvaW50ZXJFdmVudFxuKTogeyBjbGllbnRYOiBudW1iZXI7IGNsaWVudFk6IG51bWJlciB9IHtcbiAgaWYgKFwidG91Y2hlc1wiIGluIGUgJiYgQXJyYXkuaXNBcnJheShlLnRvdWNoZXMpICYmIGUudG91Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsaWVudFg6IGUudG91Y2hlc1swXS5jbGllbnRYLFxuICAgICAgY2xpZW50WTogZS50b3VjaGVzWzBdLmNsaWVudFksXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY2xpZW50WDogKGUgYXMgTW91c2VFdmVudCB8IFBvaW50ZXJFdmVudCkuY2xpZW50WCxcbiAgICBjbGllbnRZOiAoZSBhcyBNb3VzZUV2ZW50IHwgUG9pbnRlckV2ZW50KS5jbGllbnRZLFxuICB9O1xufVxuIiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy90YXAudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2dlc3R1cmVzXG4gKiBAZGVzY3JpcHRpb24gVGFwIGdlc3R1cmUgZGV0ZWN0aW9uXG4gKi9cblxuaW1wb3J0IHsgVGFwRXZlbnQsIEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0IH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVHZXN0dXJlRXZlbnQgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBEZXRlY3QgdGFwIGdlc3R1cmVcbiAqIFxuICogQHBhcmFtIGNvbnRleHQgLSBHZXN0dXJlIGRldGVjdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBUYXAgZXZlbnQgb3IgbnVsbCBpZiBubyB0YXAgZGV0ZWN0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdFRhcChjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCk6IFRhcEV2ZW50IHwgbnVsbCB7XG4gIGNvbnN0IHsgc3RhdGUsIG9wdGlvbnMsIG9yaWdpbmFsRXZlbnQgfSA9IGNvbnRleHQ7XG4gIFxuICAvLyBDYWxjdWxhdGUgZGlzdGFuY2UgYmV0d2VlbiBzdGFydCBhbmQgY3VycmVudCBwb3NpdGlvblxuICBjb25zdCBkZWx0YVggPSBzdGF0ZS5jdXJyZW50WCAtIHN0YXRlLnN0YXJ0WDtcbiAgY29uc3QgZGVsdGFZID0gc3RhdGUuY3VycmVudFkgLSBzdGF0ZS5zdGFydFk7XG4gIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG4gIFxuICAvLyBDaGVjayBpZiBtb3ZlbWVudCBpcyB3aXRoaW4gdGhyZXNob2xkXG4gIGlmIChkaXN0YW5jZSA8IG9wdGlvbnMudGFwRGlzdGFuY2VUaHJlc2hvbGQpIHtcbiAgICAvLyBDaGVjayBmb3IgZG91YmxlIHRhcFxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgaXNEb3VibGVUYXAgPSBub3cgLSBzdGF0ZS5sYXN0VGFwVGltZSA8IDMwMDtcbiAgICBcbiAgICBjb25zdCB0YXBDb3VudCA9IGlzRG91YmxlVGFwID8gc3RhdGUudGFwQ291bnQgKyAxIDogMTtcbiAgICBcbiAgICAvLyBDcmVhdGUgdGFwIGV2ZW50XG4gICAgY29uc3QgdGFwRXZlbnQ6IFRhcEV2ZW50ID0ge1xuICAgICAgLi4uY3JlYXRlR2VzdHVyZUV2ZW50KCd0YXAnLCBvcmlnaW5hbEV2ZW50LCBzdGF0ZSksXG4gICAgICB0eXBlOiAndGFwJyxcbiAgICAgIGNvdW50OiB0YXBDb3VudCxcbiAgICAgIHg6IHN0YXRlLmN1cnJlbnRYLFxuICAgICAgeTogc3RhdGUuY3VycmVudFlcbiAgICB9O1xuICAgIFxuICAgIHJldHVybiB0YXBFdmVudDtcbiAgfVxuICBcbiAgcmV0dXJuIG51bGw7XG59IiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy9zd2lwZS50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBTd2lwZSBnZXN0dXJlIGRldGVjdGlvblxuICovXG5cbmltcG9ydCB7IFN3aXBlRXZlbnQsIEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0LCBTV0lQRV9ESVJFQ1RJT05TIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVHZXN0dXJlRXZlbnQgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBEZXRlcm1pbmUgc3dpcGUgZGlyZWN0aW9uIGJhc2VkIG9uIGRlbHRhIFggYW5kIFlcbiAqIFxuICogQHBhcmFtIGRlbHRhWCAtIERpc3RhbmNlIG1vdmVkIGluIFggZGlyZWN0aW9uXG4gKiBAcGFyYW0gZGVsdGFZIC0gRGlzdGFuY2UgbW92ZWQgaW4gWSBkaXJlY3Rpb25cbiAqIEByZXR1cm5zIERpcmVjdGlvbiBvZiB0aGUgc3dpcGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN3aXBlRGlyZWN0aW9uKGRlbHRhWDogbnVtYmVyLCBkZWx0YVk6IG51bWJlcik6IFNXSVBFX0RJUkVDVElPTlMge1xuICBpZiAoTWF0aC5hYnMoZGVsdGFYKSA+IE1hdGguYWJzKGRlbHRhWSkpIHtcbiAgICByZXR1cm4gZGVsdGFYID4gMCA/IFNXSVBFX0RJUkVDVElPTlMuUklHSFQgOiBTV0lQRV9ESVJFQ1RJT05TLkxFRlQ7XG4gIH1cbiAgcmV0dXJuIGRlbHRhWSA+IDAgPyBTV0lQRV9ESVJFQ1RJT05TLkRPV04gOiBTV0lQRV9ESVJFQ1RJT05TLlVQO1xufVxuXG4vKipcbiAqIERldGVjdCBzd2lwZSBnZXN0dXJlXG4gKiBcbiAqIEBwYXJhbSBjb250ZXh0IC0gR2VzdHVyZSBkZXRlY3Rpb24gY29udGV4dFxuICogQHJldHVybnMgU3dpcGUgZXZlbnQgb3IgbnVsbCBpZiBubyBzd2lwZSBkZXRlY3RlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0U3dpcGUoY29udGV4dDogR2VzdHVyZURldGVjdGlvbkNvbnRleHQpOiBTd2lwZUV2ZW50IHwgbnVsbCB7XG4gIGNvbnN0IHsgc3RhdGUsIG9wdGlvbnMsIG9yaWdpbmFsRXZlbnQgfSA9IGNvbnRleHQ7XG4gIFxuICAvLyBDYWxjdWxhdGUgZGVsdGFzIGFuZCBkaXN0YW5jZVxuICBjb25zdCBkZWx0YVggPSBzdGF0ZS5jdXJyZW50WCAtIHN0YXRlLnN0YXJ0WDtcbiAgY29uc3QgZGVsdGFZID0gc3RhdGUuY3VycmVudFkgLSBzdGF0ZS5zdGFydFk7XG4gIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG4gIFxuICAvLyBDYWxjdWxhdGUgdGltZSBhbmQgdmVsb2NpdHlcbiAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gIGNvbnN0IGRlbHRhVGltZSA9IGVuZFRpbWUgLSBzdGF0ZS5zdGFydFRpbWU7XG4gIGNvbnN0IHZlbG9jaXR5ID0gZGlzdGFuY2UgLyBkZWx0YVRpbWU7XG4gIFxuICAvLyBDaGVjayBpZiBpdCdzIGEgc3dpcGVcbiAgaWYgKGRpc3RhbmNlID49IG9wdGlvbnMuc3dpcGVUaHJlc2hvbGQgJiYgZGVsdGFUaW1lIDw9IG9wdGlvbnMuc3dpcGVUaW1lVGhyZXNob2xkKSB7XG4gICAgY29uc3QgZGlyZWN0aW9uID0gZ2V0U3dpcGVEaXJlY3Rpb24oZGVsdGFYLCBkZWx0YVkpO1xuICAgIFxuICAgIC8vIENyZWF0ZSBzd2lwZSBldmVudFxuICAgIGNvbnN0IHN3aXBlRXZlbnQ6IFN3aXBlRXZlbnQgPSB7XG4gICAgICAuLi5jcmVhdGVHZXN0dXJlRXZlbnQoJ3N3aXBlJywgb3JpZ2luYWxFdmVudCwgc3RhdGUpLFxuICAgICAgdHlwZTogJ3N3aXBlJyxcbiAgICAgIGRpcmVjdGlvbixcbiAgICAgIGRlbHRhWCxcbiAgICAgIGRlbHRhWSxcbiAgICAgIGRpc3RhbmNlLFxuICAgICAgdmVsb2NpdHksXG4gICAgICBzdGFydFg6IHN0YXRlLnN0YXJ0WCxcbiAgICAgIHN0YXJ0WTogc3RhdGUuc3RhcnRZLFxuICAgICAgZW5kWDogc3RhdGUuY3VycmVudFgsXG4gICAgICBlbmRZOiBzdGF0ZS5jdXJyZW50WVxuICAgIH07XG4gICAgXG4gICAgcmV0dXJuIHN3aXBlRXZlbnQ7XG4gIH1cbiAgXG4gIHJldHVybiBudWxsO1xufSIsCiAgICAiLy8gc3JjL2NvcmUvZ2VzdHVyZXMvbG9uZ3ByZXNzLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIExvbmcgcHJlc3MgZ2VzdHVyZSBkZXRlY3Rpb25cbiAqL1xuXG5pbXBvcnQgeyBMb25nUHJlc3NFdmVudCwgR2VzdHVyZURldGVjdGlvbkNvbnRleHQgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZUdlc3R1cmVFdmVudCB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIERldGVjdCBsb25nIHByZXNzIGdlc3R1cmVcbiAqIFxuICogVGhpcyBpcyBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSBvdGhlciBnZXN0dXJlIGRldGVjdG9ycyBhcyBpdCBzZXRzIHVwIGEgdGltZXJcbiAqIGFuZCByZXR1cm5zIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSB0aW1lciBjb21wbGV0ZXMuXG4gKiBcbiAqIEBwYXJhbSBjb250ZXh0IC0gR2VzdHVyZSBkZXRlY3Rpb24gY29udGV4dFxuICogQHBhcmFtIGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gY2FsbCB3aGVuIGxvbmcgcHJlc3MgaXMgZGV0ZWN0ZWRcbiAqIEByZXR1cm5zIENsZWFudXAgZnVuY3Rpb24gdG8gY2FuY2VsIHRoZSBsb25nIHByZXNzIGRldGVjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0TG9uZ1ByZXNzKFxuICBjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCxcbiAgY2FsbGJhY2s6IChldmVudDogTG9uZ1ByZXNzRXZlbnQpID0+IHZvaWRcbik6ICgpID0+IHZvaWQge1xuICBjb25zdCB7IHN0YXRlLCBvcHRpb25zLCBvcmlnaW5hbEV2ZW50IH0gPSBjb250ZXh0O1xuICBcbiAgLy8gU2V0IGEgdGltZXIgZm9yIGxvbmcgcHJlc3MgZGV0ZWN0aW9uXG4gIGNvbnN0IHRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgIC8vIE9ubHkgdHJpZ2dlciBpZiBnZXN0dXJlIGlzIHN0aWxsIGFjdGl2ZVxuICAgIGlmIChzdGF0ZS5hY3RpdmUpIHtcbiAgICAgIC8vIENoZWNrIGlmIG1vdmVtZW50IGlzIHdpdGhpbiB0aHJlc2hvbGRcbiAgICAgIGNvbnN0IGRpZmZYID0gTWF0aC5hYnMoc3RhdGUuY3VycmVudFggLSBzdGF0ZS5zdGFydFgpO1xuICAgICAgY29uc3QgZGlmZlkgPSBNYXRoLmFicyhzdGF0ZS5jdXJyZW50WSAtIHN0YXRlLnN0YXJ0WSk7XG4gICAgICBcbiAgICAgIGlmIChkaWZmWCA8IG9wdGlvbnMudGFwRGlzdGFuY2VUaHJlc2hvbGQgJiYgZGlmZlkgPCBvcHRpb25zLnRhcERpc3RhbmNlVGhyZXNob2xkKSB7XG4gICAgICAgIC8vIENyZWF0ZSBsb25nIHByZXNzIGV2ZW50XG4gICAgICAgIGNvbnN0IGxvbmdQcmVzc0V2ZW50OiBMb25nUHJlc3NFdmVudCA9IHtcbiAgICAgICAgICAuLi5jcmVhdGVHZXN0dXJlRXZlbnQoJ2xvbmdwcmVzcycsIG9yaWdpbmFsRXZlbnQsIHN0YXRlKSxcbiAgICAgICAgICB0eXBlOiAnbG9uZ3ByZXNzJyxcbiAgICAgICAgICB4OiBzdGF0ZS5jdXJyZW50WCxcbiAgICAgICAgICB5OiBzdGF0ZS5jdXJyZW50WVxuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgLy8gVHJpZ2dlciBjYWxsYmFja1xuICAgICAgICBjYWxsYmFjayhsb25nUHJlc3NFdmVudCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBvcHRpb25zLmxvbmdQcmVzc1RpbWUpO1xuICBcbiAgLy8gUmV0dXJuIGNsZWFudXAgZnVuY3Rpb25cbiAgcmV0dXJuICgpID0+IHtcbiAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICB9O1xufVxuXG4vKipcbiAqIENoZWNrIGlmIG1vdmVtZW50IHdvdWxkIGNhbmNlbCBhIGxvbmcgcHJlc3NcbiAqIFxuICogQHBhcmFtIGNvbnRleHQgLSBHZXN0dXJlIGRldGVjdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsb25nIHByZXNzIHNob3VsZCBiZSBjYW5jZWxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkQ2FuY2VsTG9uZ1ByZXNzKGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0KTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgc3RhdGUsIG9wdGlvbnMgfSA9IGNvbnRleHQ7XG4gIFxuICBjb25zdCBkaWZmWCA9IE1hdGguYWJzKHN0YXRlLmN1cnJlbnRYIC0gc3RhdGUuc3RhcnRYKTtcbiAgY29uc3QgZGlmZlkgPSBNYXRoLmFicyhzdGF0ZS5jdXJyZW50WSAtIHN0YXRlLnN0YXJ0WSk7XG4gIFxuICByZXR1cm4gZGlmZlggPiBvcHRpb25zLnRhcERpc3RhbmNlVGhyZXNob2xkIHx8IGRpZmZZID4gb3B0aW9ucy50YXBEaXN0YW5jZVRocmVzaG9sZDtcbn0iLAogICAgIi8vIHNyYy9jb3JlL2dlc3R1cmVzL3Bhbi50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBQYW4gZ2VzdHVyZSBkZXRlY3Rpb25cbiAqL1xuXG5pbXBvcnQgeyBQYW5FdmVudCwgR2VzdHVyZURldGVjdGlvbkNvbnRleHQgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlR2VzdHVyZUV2ZW50IH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBEZXRlY3QgcGFuIGdlc3R1cmVcbiAqXG4gKiBAcGFyYW0gY29udGV4dCAtIEdlc3R1cmUgZGV0ZWN0aW9uIGNvbnRleHRcbiAqIEByZXR1cm5zIFBhbiBldmVudCBvciBudWxsIGlmIG5vIHNpZ25pZmljYW50IG1vdmVtZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RQYW4oY29udGV4dDogR2VzdHVyZURldGVjdGlvbkNvbnRleHQpOiBQYW5FdmVudCB8IG51bGwge1xuICBjb25zdCB7IHN0YXRlLCBvcmlnaW5hbEV2ZW50IH0gPSBjb250ZXh0O1xuXG4gIC8vIENhbGN1bGF0ZSBkZWx0YSBmcm9tIHN0YXJ0IHBvc2l0aW9uXG4gIGNvbnN0IGRlbHRhWCA9IHN0YXRlLmN1cnJlbnRYIC0gc3RhdGUuc3RhcnRYO1xuICBjb25zdCBkZWx0YVkgPSBzdGF0ZS5jdXJyZW50WSAtIHN0YXRlLnN0YXJ0WTtcblxuICAvLyBDYWxjdWxhdGUgZGVsdGEgZnJvbSBsYXN0IHBvc2l0aW9uIHRvIGRldGVybWluZSBpZiB0aGVyZSdzIHNpZ25pZmljYW50IG1vdmVtZW50XG4gIGNvbnN0IG1vdmVEZWx0YVggPSBzdGF0ZS5jdXJyZW50WCAtIHN0YXRlLmxhc3RYO1xuICBjb25zdCBtb3ZlRGVsdGFZID0gc3RhdGUuY3VycmVudFkgLSBzdGF0ZS5sYXN0WTtcbiAgY29uc3QgbW92ZURlbHRhID0gTWF0aC5zcXJ0KFxuICAgIG1vdmVEZWx0YVggKiBtb3ZlRGVsdGFYICsgbW92ZURlbHRhWSAqIG1vdmVEZWx0YVlcbiAgKTtcblxuICAvLyBDaGVjayBpZiBtb3ZlbWVudCBpcyBzaWduaWZpY2FudFxuICBpZiAobW92ZURlbHRhID4gMCkge1xuICAgIC8vIENyZWF0ZSBwYW4gZXZlbnRcbiAgICBjb25zdCBwYW5FdmVudDogUGFuRXZlbnQgPSB7XG4gICAgICAuLi5jcmVhdGVHZXN0dXJlRXZlbnQoXCJwYW5cIiwgb3JpZ2luYWxFdmVudCwgc3RhdGUpLFxuICAgICAgdHlwZTogXCJwYW5cIixcbiAgICAgIGRlbHRhWCxcbiAgICAgIGRlbHRhWSxcbiAgICAgIHN0YXJ0WDogc3RhdGUuc3RhcnRYLFxuICAgICAgc3RhcnRZOiBzdGF0ZS5zdGFydFksXG4gICAgICBjdXJyZW50WDogc3RhdGUuY3VycmVudFgsXG4gICAgICBjdXJyZW50WTogc3RhdGUuY3VycmVudFksXG4gICAgfTtcblxuICAgIHJldHVybiBwYW5FdmVudDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy9waW5jaC50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBQaW5jaCBnZXN0dXJlIGRldGVjdGlvblxuICovXG5cbmltcG9ydCB7IFBpbmNoRXZlbnQsIEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUdlc3R1cmVFdmVudCwgZ2V0RGlzdGFuY2UgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIERldGVjdCBwaW5jaCBnZXN0dXJlXG4gKlxuICogQHBhcmFtIGNvbnRleHQgLSBHZXN0dXJlIGRldGVjdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0gdG91Y2gxIC0gRmlyc3QgdG91Y2ggcG9pbnRcbiAqIEBwYXJhbSB0b3VjaDIgLSBTZWNvbmQgdG91Y2ggcG9pbnRcbiAqIEByZXR1cm5zIFBpbmNoIGV2ZW50IG9yIG51bGwgaWYgbm8gcGluY2ggZGV0ZWN0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdFBpbmNoKFxuICBjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCxcbiAgdG91Y2gxOiBUb3VjaCxcbiAgdG91Y2gyOiBUb3VjaFxuKTogUGluY2hFdmVudCB8IG51bGwge1xuICBjb25zdCB7IHN0YXRlLCBvcmlnaW5hbEV2ZW50IH0gPSBjb250ZXh0O1xuXG4gIC8vIENhbGN1bGF0ZSBjdXJyZW50IGRpc3RhbmNlIGJldHdlZW4gdG91Y2ggcG9pbnRzXG4gIGNvbnN0IGN1cnJlbnREaXN0YW5jZSA9IGdldERpc3RhbmNlKFxuICAgIHRvdWNoMS5jbGllbnRYLFxuICAgIHRvdWNoMS5jbGllbnRZLFxuICAgIHRvdWNoMi5jbGllbnRYLFxuICAgIHRvdWNoMi5jbGllbnRZXG4gICk7XG5cbiAgLy8gTWluaW11bSBtb3ZlbWVudCB0aHJlc2hvbGQgZm9yIHBpbmNoIGRldGVjdGlvblxuICBjb25zdCBQSU5DSF9USFJFU0hPTEQgPSAxMDtcblxuICAvLyBDaGVjayBpZiB0aGUgZGlzdGFuY2UgY2hhbmdlIGlzIHNpZ25pZmljYW50XG4gIGlmIChNYXRoLmFicyhjdXJyZW50RGlzdGFuY2UgLSBzdGF0ZS5zdGFydERpc3RhbmNlKSA+IFBJTkNIX1RIUkVTSE9MRCkge1xuICAgIC8vIENhbGN1bGF0ZSBzY2FsZSBmYWN0b3JcbiAgICBjb25zdCBzY2FsZSA9IGN1cnJlbnREaXN0YW5jZSAvIHN0YXRlLnN0YXJ0RGlzdGFuY2U7XG5cbiAgICAvLyBDYWxjdWxhdGUgY2VudGVyIHBvaW50XG4gICAgY29uc3QgY2VudGVyWCA9ICh0b3VjaDEuY2xpZW50WCArIHRvdWNoMi5jbGllbnRYKSAvIDI7XG4gICAgY29uc3QgY2VudGVyWSA9ICh0b3VjaDEuY2xpZW50WSArIHRvdWNoMi5jbGllbnRZKSAvIDI7XG5cbiAgICAvLyBDcmVhdGUgcGluY2ggZXZlbnRcbiAgICBjb25zdCBwaW5jaEV2ZW50OiBQaW5jaEV2ZW50ID0ge1xuICAgICAgLi4uY3JlYXRlR2VzdHVyZUV2ZW50KFwicGluY2hcIiwgb3JpZ2luYWxFdmVudCwgc3RhdGUpLFxuICAgICAgdHlwZTogXCJwaW5jaFwiLFxuICAgICAgc2NhbGUsXG4gICAgICBjZW50ZXJYLFxuICAgICAgY2VudGVyWSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHBpbmNoRXZlbnQ7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsCiAgICAiLy8gc3JjL2NvcmUvZ2VzdHVyZXMvcm90YXRlLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIFJvdGF0ZSBnZXN0dXJlIGRldGVjdGlvblxuICovXG5cbmltcG9ydCB7IFJvdGF0ZUV2ZW50LCBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBjcmVhdGVHZXN0dXJlRXZlbnQsIGdldEFuZ2xlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBEZXRlY3Qgcm90YXRlIGdlc3R1cmVcbiAqXG4gKiBAcGFyYW0gY29udGV4dCAtIEdlc3R1cmUgZGV0ZWN0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSB0b3VjaDEgLSBGaXJzdCB0b3VjaCBwb2ludFxuICogQHBhcmFtIHRvdWNoMiAtIFNlY29uZCB0b3VjaCBwb2ludFxuICogQHJldHVybnMgUm90YXRlIGV2ZW50IG9yIG51bGwgaWYgbm8gcm90YXRpb24gZGV0ZWN0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdFJvdGF0ZShcbiAgY29udGV4dDogR2VzdHVyZURldGVjdGlvbkNvbnRleHQsXG4gIHRvdWNoMTogVG91Y2gsXG4gIHRvdWNoMjogVG91Y2hcbik6IFJvdGF0ZUV2ZW50IHwgbnVsbCB7XG4gIGNvbnN0IHsgc3RhdGUsIG9yaWdpbmFsRXZlbnQgfSA9IGNvbnRleHQ7XG5cbiAgLy8gQ2FsY3VsYXRlIGN1cnJlbnQgYW5nbGUgYmV0d2VlbiB0b3VjaCBwb2ludHNcbiAgY29uc3QgY3VycmVudEFuZ2xlID0gZ2V0QW5nbGUoXG4gICAgdG91Y2gxLmNsaWVudFgsXG4gICAgdG91Y2gxLmNsaWVudFksXG4gICAgdG91Y2gyLmNsaWVudFgsXG4gICAgdG91Y2gyLmNsaWVudFlcbiAgKTtcblxuICAvLyBNaW5pbXVtIHJvdGF0aW9uIHRocmVzaG9sZCBmb3IgZGV0ZWN0aW9uXG4gIGNvbnN0IFJPVEFUSU9OX1RIUkVTSE9MRCA9IDEwO1xuXG4gIC8vIENhbGN1bGF0ZSByb3RhdGlvbiBkaWZmZXJlbmNlXG4gIGNvbnN0IHJvdGF0aW9uRGlmZiA9IGN1cnJlbnRBbmdsZSAtIHN0YXRlLnN0YXJ0QW5nbGU7XG5cbiAgLy8gQ2hlY2sgaWYgcm90YXRpb24gaXMgc2lnbmlmaWNhbnRcbiAgaWYgKE1hdGguYWJzKHJvdGF0aW9uRGlmZikgPiBST1RBVElPTl9USFJFU0hPTEQpIHtcbiAgICAvLyBDYWxjdWxhdGUgY2VudGVyIHBvaW50XG4gICAgY29uc3QgY2VudGVyWCA9ICh0b3VjaDEuY2xpZW50WCArIHRvdWNoMi5jbGllbnRYKSAvIDI7XG4gICAgY29uc3QgY2VudGVyWSA9ICh0b3VjaDEuY2xpZW50WSArIHRvdWNoMi5jbGllbnRZKSAvIDI7XG5cbiAgICAvLyBDcmVhdGUgcm90YXRlIGV2ZW50XG4gICAgY29uc3Qgcm90YXRlRXZlbnQ6IFJvdGF0ZUV2ZW50ID0ge1xuICAgICAgLi4uY3JlYXRlR2VzdHVyZUV2ZW50KFwicm90YXRlXCIsIG9yaWdpbmFsRXZlbnQsIHN0YXRlKSxcbiAgICAgIHR5cGU6IFwicm90YXRlXCIsXG4gICAgICByb3RhdGlvbjogcm90YXRpb25EaWZmLFxuICAgICAgY2VudGVyWCxcbiAgICAgIGNlbnRlclksXG4gICAgfTtcblxuICAgIHJldHVybiByb3RhdGVFdmVudDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy9tYW5hZ2VyLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIEdlc3R1cmUgbWFuYWdlbWVudCBzeXN0ZW0gZm9yIGhhbmRsaW5nIHRvdWNoIGFuZCBtb3VzZSBpbnRlcmFjdGlvbnNcbiAqL1xuXG5pbXBvcnQgeyBcbiAgR2VzdHVyZUNvbmZpZyxcbiAgR2VzdHVyZU1hbmFnZXIsXG4gIEdlc3R1cmVTdGF0ZSxcbiAgR2VzdHVyZUhhbmRsZXIsXG4gIEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0LFxuICBBbnlHZXN0dXJlRXZlbnQsXG4gIEdFU1RVUkVfVFlQRVMsXG4gIFNXSVBFX0RJUkVDVElPTlNcbn0gZnJvbSAnLi90eXBlcyc7XG5cbmltcG9ydCB7IGRldGVjdFRhcCB9IGZyb20gJy4vdGFwJztcbmltcG9ydCB7IGRldGVjdFN3aXBlIH0gZnJvbSAnLi9zd2lwZSc7XG5pbXBvcnQgeyBkZXRlY3RMb25nUHJlc3MsIHNob3VsZENhbmNlbExvbmdQcmVzcyB9IGZyb20gJy4vbG9uZ3ByZXNzJztcbmltcG9ydCB7IGRldGVjdFBhbiB9IGZyb20gJy4vcGFuJztcbmltcG9ydCB7IGRldGVjdFBpbmNoIH0gZnJvbSAnLi9waW5jaCc7XG5pbXBvcnQgeyBkZXRlY3RSb3RhdGUgfSBmcm9tICcuL3JvdGF0ZSc7XG5pbXBvcnQgeyBoYXNUb3VjaFN1cHBvcnQsIGhhc1BvaW50ZXJTdXBwb3J0LCBnZXRUb3VjaENvb3JkaW5hdGVzIH0gZnJvbSAnLi91dGlscyc7XG5cbi8vIFJlLWV4cG9ydCB0eXBlcyBhbmQgY29uc3RhbnRzXG5leHBvcnQgeyBHRVNUVVJFX1RZUEVTLCBTV0lQRV9ESVJFQ1RJT05TIH07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGdlc3R1cmUgbWFuYWdlciBmb3IgaGFuZGxpbmcgdG91Y2ggYW5kIG1vdXNlIGludGVyYWN0aW9uc1xuICogXG4gKiBAcGFyYW0gZWxlbWVudCAtIERPTSBlbGVtZW50IHRvIGF0dGFjaCBnZXN0dXJlIHJlY29nbml0aW9uIHRvXG4gKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiBAcmV0dXJucyBHZXN0dXJlIG1hbmFnZXIgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUdlc3R1cmVNYW5hZ2VyID0gKFxuICBlbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgY29uZmlnOiBHZXN0dXJlQ29uZmlnID0ge31cbik6IEdlc3R1cmVNYW5hZ2VyID0+IHtcbiAgLy8gRGVmYXVsdCBjb25maWd1cmF0aW9uXG4gIGNvbnN0IG9wdGlvbnM6IFJlcXVpcmVkPEdlc3R1cmVDb25maWc+ID0ge1xuICAgIHN3aXBlVGhyZXNob2xkOiAzMCxcbiAgICBzd2lwZVRpbWVUaHJlc2hvbGQ6IDMwMCxcbiAgICBsb25nUHJlc3NUaW1lOiA1MDAsXG4gICAgdGFwRGlzdGFuY2VUaHJlc2hvbGQ6IDEwLFxuICAgIHByZXZlbnREZWZhdWx0OiB0cnVlLFxuICAgIHN0b3BQcm9wYWdhdGlvbjogZmFsc2UsXG4gICAgLi4uY29uZmlnXG4gIH07XG4gIFxuICAvLyBFdmVudCBoYW5kbGVycyBzdG9yYWdlXG4gIGNvbnN0IGhhbmRsZXJzOiBNYXA8c3RyaW5nLCBTZXQ8R2VzdHVyZUhhbmRsZXI+PiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIEdlc3R1cmUgc3RhdGVcbiAgY29uc3Qgc3RhdGU6IEdlc3R1cmVTdGF0ZSA9IHtcbiAgICBhY3RpdmU6IGZhbHNlLFxuICAgIHN0YXJ0VGltZTogMCxcbiAgICBzdGFydFg6IDAsXG4gICAgc3RhcnRZOiAwLFxuICAgIGxhc3RYOiAwLFxuICAgIGxhc3RZOiAwLFxuICAgIGN1cnJlbnRYOiAwLFxuICAgIGN1cnJlbnRZOiAwLFxuICAgIHRvdWNoQ291bnQ6IDAsXG4gICAgbG9uZ1ByZXNzVGltZXI6IG51bGwsXG4gICAgc3RhcnREaXN0YW5jZTogMCxcbiAgICBzdGFydEFuZ2xlOiAwLFxuICAgIGxhc3RUYXBUaW1lOiAwLFxuICAgIHRhcENvdW50OiAwLFxuICAgIHRhcmdldDogbnVsbFxuICB9O1xuICBcbiAgLy8gRGV0ZWN0IGZlYXR1cmUgc3VwcG9ydFxuICBjb25zdCBzdXBwb3J0VG91Y2ggPSBoYXNUb3VjaFN1cHBvcnQoKTtcbiAgY29uc3Qgc3VwcG9ydFBvaW50ZXIgPSBoYXNQb2ludGVyU3VwcG9ydCgpO1xuICAgIFxuICBjb25zdCBnZXN0dXJlU3VwcG9ydCA9IHtcbiAgICB0YXA6IHRydWUsXG4gICAgc3dpcGU6IHRydWUsXG4gICAgc3dpcGVsZWZ0OiB0cnVlLFxuICAgIHN3aXBlcmlnaHQ6IHRydWUsXG4gICAgc3dpcGV1cDogdHJ1ZSxcbiAgICBzd2lwZWRvd246IHRydWUsXG4gICAgbG9uZ3ByZXNzOiB0cnVlLFxuICAgIHBhbjogdHJ1ZSxcbiAgICBwaW5jaDogc3VwcG9ydFRvdWNoIHx8IHN1cHBvcnRQb2ludGVyLFxuICAgIHJvdGF0ZTogc3VwcG9ydFRvdWNoIHx8IHN1cHBvcnRQb2ludGVyXG4gIH07XG4gIFxuICAvKipcbiAgICogRGlzcGF0Y2ggYSBnZXN0dXJlIGV2ZW50XG4gICAqL1xuICBjb25zdCBkaXNwYXRjaEdlc3R1cmUgPSAoZXZlbnQ6IEFueUdlc3R1cmVFdmVudCk6IHZvaWQgPT4ge1xuICAgIC8vIEdldCBoYW5kbGVycyBmb3IgdGhpcyBldmVudCB0eXBlXG4gICAgY29uc3QgZXZlbnRIYW5kbGVycyA9IGhhbmRsZXJzLmdldChldmVudC50eXBlKTtcbiAgICBpZiAoIWV2ZW50SGFuZGxlcnMpIHJldHVybjtcbiAgICBcbiAgICAvLyBDYWxsIGVhY2ggaGFuZGxlclxuICAgIGV2ZW50SGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhbmRsZXIoZXZlbnQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgaW4gZ2VzdHVyZSBoYW5kbGVyIGZvciAke2V2ZW50LnR5cGV9OmAsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvLyBGb3Igc3dpcGUsIGFsc28gZGlzcGF0Y2ggZGlyZWN0aW9uLXNwZWNpZmljIGV2ZW50c1xuICAgIGlmIChldmVudC50eXBlID09PSAnc3dpcGUnICYmICdkaXJlY3Rpb24nIGluIGV2ZW50KSB7XG4gICAgICBjb25zdCBkaXJlY3Rpb25FdmVudCA9IHsgLi4uZXZlbnQsIHR5cGU6IGBzd2lwZSR7ZXZlbnQuZGlyZWN0aW9ufWAgYXMgYW55IH07XG4gICAgICBkaXNwYXRjaEdlc3R1cmUoZGlyZWN0aW9uRXZlbnQgYXMgYW55KTtcbiAgICB9XG4gICAgXG4gICAgLy8gQXBwbHkgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciBwcmV2ZW50RGVmYXVsdCBhbmQgc3RvcFByb3BhZ2F0aW9uXG4gICAgaWYgKG9wdGlvbnMucHJldmVudERlZmF1bHQgJiYgIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIFxuICAgIGlmIChvcHRpb25zLnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICB9O1xuICBcbiAgLy8gUmVmZXJlbmNlIHRvIHRoZSBsb25ncHJlc3MgY2xlYW51cCBmdW5jdGlvblxuICBsZXQgbG9uZ1ByZXNzQ2xlYW51cDogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIFxuICAvKipcbiAgICogSGFuZGxlIHRvdWNoL21vdXNlIHN0YXJ0XG4gICAqL1xuICBjb25zdCBoYW5kbGVTdGFydCA9IChlOiBUb3VjaEV2ZW50IHwgTW91c2VFdmVudCB8IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHRvdWNoID0gZ2V0VG91Y2hDb29yZGluYXRlcyhlKTtcbiAgICBjb25zdCB0b3VjaENvdW50ID0gJ3RvdWNoZXMnIGluIGUgPyBlLnRvdWNoZXMubGVuZ3RoIDogMTtcbiAgICBcbiAgICAvLyBTdG9yZSBnZXN0dXJlIHN0YXRlXG4gICAgc3RhdGUuYWN0aXZlID0gdHJ1ZTtcbiAgICBzdGF0ZS5zdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHN0YXRlLnN0YXJ0WCA9IHN0YXRlLmxhc3RYID0gc3RhdGUuY3VycmVudFggPSB0b3VjaC5jbGllbnRYO1xuICAgIHN0YXRlLnN0YXJ0WSA9IHN0YXRlLmxhc3RZID0gc3RhdGUuY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuICAgIHN0YXRlLnRvdWNoQ291bnQgPSB0b3VjaENvdW50O1xuICAgIHN0YXRlLnRhcmdldCA9IGUudGFyZ2V0O1xuICAgIFxuICAgIC8vIEhhbmRsZSBtdWx0aS10b3VjaCBnZXN0dXJlc1xuICAgIGlmICh0b3VjaENvdW50ID09PSAyICYmICd0b3VjaGVzJyBpbiBlKSB7XG4gICAgICBjb25zdCB0b3VjaDEgPSBlLnRvdWNoZXNbMF07XG4gICAgICBjb25zdCB0b3VjaDIgPSBlLnRvdWNoZXNbMV07XG4gICAgICBcbiAgICAgIC8vIFNldCBpbml0aWFsIHZhbHVlcyBmb3IgcGluY2ggYW5kIHJvdGF0ZVxuICAgICAgc3RhdGUuc3RhcnREaXN0YW5jZSA9IE1hdGguc3FydChcbiAgICAgICAgTWF0aC5wb3codG91Y2gyLmNsaWVudFggLSB0b3VjaDEuY2xpZW50WCwgMikgKyBcbiAgICAgICAgTWF0aC5wb3codG91Y2gyLmNsaWVudFkgLSB0b3VjaDEuY2xpZW50WSwgMilcbiAgICAgICk7XG4gICAgICBcbiAgICAgIHN0YXRlLnN0YXJ0QW5nbGUgPSBNYXRoLmF0YW4yKFxuICAgICAgICB0b3VjaDIuY2xpZW50WSAtIHRvdWNoMS5jbGllbnRZLFxuICAgICAgICB0b3VjaDIuY2xpZW50WCAtIHRvdWNoMS5jbGllbnRYXG4gICAgICApICogMTgwIC8gTWF0aC5QSTtcbiAgICAgIFxuICAgICAgaWYgKHN0YXRlLnN0YXJ0QW5nbGUgPCAwKSBzdGF0ZS5zdGFydEFuZ2xlICs9IDM2MDtcbiAgICB9XG4gICAgXG4gICAgLy8gU2V0dXAgY29udGV4dCBmb3IgZ2VzdHVyZSBkZXRlY3Rpb25cbiAgICBjb25zdCBjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCA9IHtcbiAgICAgIHN0YXRlLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGVcbiAgICB9O1xuICAgIFxuICAgIC8vIFN0YXJ0IGxvbmcgcHJlc3MgZGV0ZWN0aW9uXG4gICAgaWYgKGxvbmdQcmVzc0NsZWFudXApIHtcbiAgICAgIGxvbmdQcmVzc0NsZWFudXAoKTtcbiAgICB9XG4gICAgXG4gICAgbG9uZ1ByZXNzQ2xlYW51cCA9IGRldGVjdExvbmdQcmVzcyhjb250ZXh0LCAobG9uZ1ByZXNzRXZlbnQpID0+IHtcbiAgICAgIGRpc3BhdGNoR2VzdHVyZShsb25nUHJlc3NFdmVudCk7XG4gICAgfSk7XG4gIH07XG4gIFxuICAvKipcbiAgICogSGFuZGxlIHRvdWNoL21vdXNlIG1vdmVcbiAgICovXG4gIGNvbnN0IGhhbmRsZU1vdmUgPSAoZTogVG91Y2hFdmVudCB8IE1vdXNlRXZlbnQgfCBQb2ludGVyRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoIXN0YXRlLmFjdGl2ZSkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IHRvdWNoID0gZ2V0VG91Y2hDb29yZGluYXRlcyhlKTtcbiAgICBjb25zdCB0b3VjaENvdW50ID0gJ3RvdWNoZXMnIGluIGUgPyBlLnRvdWNoZXMubGVuZ3RoIDogMTtcbiAgICBcbiAgICAvLyBVcGRhdGUgcG9zaXRpb25zXG4gICAgc3RhdGUubGFzdFggPSBzdGF0ZS5jdXJyZW50WDtcbiAgICBzdGF0ZS5sYXN0WSA9IHN0YXRlLmN1cnJlbnRZO1xuICAgIHN0YXRlLmN1cnJlbnRYID0gdG91Y2guY2xpZW50WDtcbiAgICBzdGF0ZS5jdXJyZW50WSA9IHRvdWNoLmNsaWVudFk7XG4gICAgXG4gICAgLy8gU2V0dXAgY29udGV4dCBmb3IgZ2VzdHVyZSBkZXRlY3Rpb25cbiAgICBjb25zdCBjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCA9IHtcbiAgICAgIHN0YXRlLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGVcbiAgICB9O1xuICAgIFxuICAgIC8vIENoZWNrIGlmIHdlIHNob3VsZCBjYW5jZWwgbG9uZ3ByZXNzXG4gICAgaWYgKHNob3VsZENhbmNlbExvbmdQcmVzcyhjb250ZXh0KSAmJiBsb25nUHJlc3NDbGVhbnVwKSB7XG4gICAgICBsb25nUHJlc3NDbGVhbnVwKCk7XG4gICAgICBsb25nUHJlc3NDbGVhbnVwID0gbnVsbDtcbiAgICB9XG4gICAgXG4gICAgLy8gRGV0ZWN0IHBhbiBnZXN0dXJlXG4gICAgY29uc3QgcGFuRXZlbnQgPSBkZXRlY3RQYW4oY29udGV4dCk7XG4gICAgaWYgKHBhbkV2ZW50KSB7XG4gICAgICBkaXNwYXRjaEdlc3R1cmUocGFuRXZlbnQpO1xuICAgIH1cbiAgICBcbiAgICAvLyBNdWx0aS10b3VjaCBnZXN0dXJlc1xuICAgIGlmICh0b3VjaENvdW50ID09PSAyICYmICd0b3VjaGVzJyBpbiBlKSB7XG4gICAgICBjb25zdCB0b3VjaDEgPSBlLnRvdWNoZXNbMF07XG4gICAgICBjb25zdCB0b3VjaDIgPSBlLnRvdWNoZXNbMV07XG4gICAgICBcbiAgICAgIC8vIERldGVjdCBwaW5jaFxuICAgICAgY29uc3QgcGluY2hFdmVudCA9IGRldGVjdFBpbmNoKGNvbnRleHQsIHRvdWNoMSwgdG91Y2gyKTtcbiAgICAgIGlmIChwaW5jaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoR2VzdHVyZShwaW5jaEV2ZW50KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRGV0ZWN0IHJvdGF0ZVxuICAgICAgY29uc3Qgcm90YXRlRXZlbnQgPSBkZXRlY3RSb3RhdGUoY29udGV4dCwgdG91Y2gxLCB0b3VjaDIpO1xuICAgICAgaWYgKHJvdGF0ZUV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoR2VzdHVyZShyb3RhdGVFdmVudCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBcbiAgLyoqXG4gICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBlbmRcbiAgICovXG4gIGNvbnN0IGhhbmRsZUVuZCA9IChlOiBUb3VjaEV2ZW50IHwgTW91c2VFdmVudCB8IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgIGlmICghc3RhdGUuYWN0aXZlKSByZXR1cm47XG4gICAgXG4gICAgLy8gQ2FuY2VsIGFueSBvbmdvaW5nIGxvbmcgcHJlc3MgZGV0ZWN0aW9uXG4gICAgaWYgKGxvbmdQcmVzc0NsZWFudXApIHtcbiAgICAgIGxvbmdQcmVzc0NsZWFudXAoKTtcbiAgICAgIGxvbmdQcmVzc0NsZWFudXAgPSBudWxsO1xuICAgIH1cbiAgICBcbiAgICAvLyBTZXR1cCBjb250ZXh0IGZvciBnZXN0dXJlIGRldGVjdGlvblxuICAgIGNvbnN0IGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0ID0ge1xuICAgICAgc3RhdGUsXG4gICAgICBvcHRpb25zLFxuICAgICAgb3JpZ2luYWxFdmVudDogZVxuICAgIH07XG4gICAgXG4gICAgLy8gRGV0ZWN0IHRhcFxuICAgIGNvbnN0IHRhcEV2ZW50ID0gZGV0ZWN0VGFwKGNvbnRleHQpO1xuICAgIGlmICh0YXBFdmVudCkge1xuICAgICAgLy8gVXBkYXRlIHRhcCBjb3VudCBmb3IgbmV4dCB0YXBcbiAgICAgIHN0YXRlLmxhc3RUYXBUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIHN0YXRlLnRhcENvdW50ID0gdGFwRXZlbnQuY291bnQ7XG4gICAgICBcbiAgICAgIGRpc3BhdGNoR2VzdHVyZSh0YXBFdmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERldGVjdCBzd2lwZVxuICAgICAgY29uc3Qgc3dpcGVFdmVudCA9IGRldGVjdFN3aXBlKGNvbnRleHQpO1xuICAgICAgaWYgKHN3aXBlRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hHZXN0dXJlKHN3aXBlRXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBSZXNldCBzdGF0ZVxuICAgIHN0YXRlLmFjdGl2ZSA9IGZhbHNlO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBjYW5jZWxcbiAgICovXG4gIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpOiB2b2lkID0+IHtcbiAgICAvLyBDYW5jZWwgbG9uZyBwcmVzcyBkZXRlY3Rpb25cbiAgICBpZiAobG9uZ1ByZXNzQ2xlYW51cCkge1xuICAgICAgbG9uZ1ByZXNzQ2xlYW51cCgpO1xuICAgICAgbG9uZ1ByZXNzQ2xlYW51cCA9IG51bGw7XG4gICAgfVxuICAgIFxuICAgIC8vIFJlc2V0IHN0YXRlXG4gICAgc3RhdGUuYWN0aXZlID0gZmFsc2U7XG4gIH07XG4gIFxuICAvLyBFdmVudCBsaXN0ZW5lciByZWZlcmVuY2VzXG4gIGxldCBldmVudExpc3RlbmVyczogeyBcbiAgICBbZXZlbnQ6IHN0cmluZ106IEV2ZW50TGlzdGVuZXIgXG4gIH0gPSB7fTtcbiAgXG4gIC8qKlxuICAgKiBTZXQgdXAgZXZlbnQgbGlzdGVuZXJzIGJhc2VkIG9uIGF2YWlsYWJsZSBBUElzXG4gICAqL1xuICBjb25zdCBzZXR1cEV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChzdXBwb3J0UG9pbnRlcikge1xuICAgICAgLy8gVXNlIFBvaW50ZXIgRXZlbnRzIEFQSVxuICAgICAgZXZlbnRMaXN0ZW5lcnMgPSB7XG4gICAgICAgIHBvaW50ZXJkb3duOiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICBwb2ludGVybW92ZTogaGFuZGxlTW92ZSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICBwb2ludGVydXA6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICBwb2ludGVyY2FuY2VsOiBoYW5kbGVDYW5jZWwgYXMgRXZlbnRMaXN0ZW5lclxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnRUb3VjaCkge1xuICAgICAgLy8gVXNlIFRvdWNoIEV2ZW50cyBBUElcbiAgICAgIGV2ZW50TGlzdGVuZXJzID0ge1xuICAgICAgICB0b3VjaHN0YXJ0OiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICB0b3VjaG1vdmU6IGhhbmRsZU1vdmUgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgICAgdG91Y2hlbmQ6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICB0b3VjaGNhbmNlbDogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXJcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZhbGwgYmFjayB0byBNb3VzZSBFdmVudHMgQVBJXG4gICAgICBldmVudExpc3RlbmVycyA9IHtcbiAgICAgICAgbW91c2Vkb3duOiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICBtb3VzZW1vdmU6IGhhbmRsZU1vdmUgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgICAgbW91c2V1cDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICAgIG1vdXNlbGVhdmU6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyXG4gICAgICB9O1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgbGlzdGVuZXJzIHRvIGVsZW1lbnRcbiAgICBPYmplY3QuZW50cmllcyhldmVudExpc3RlbmVycykuZm9yRWFjaCgoW2V2ZW50LCBsaXN0ZW5lcl0pID0+IHtcbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIHsgcGFzc2l2ZTogIW9wdGlvbnMucHJldmVudERlZmF1bHQgfSk7XG4gICAgfSk7XG4gIH07XG4gIFxuICAvKipcbiAgICogUmVtb3ZlIGFsbCBldmVudCBsaXN0ZW5lcnNcbiAgICovXG4gIGNvbnN0IHJlbW92ZUV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgIC8vIFJlbW92ZSBhbGwgbGlzdGVuZXJzIGZyb20gZWxlbWVudFxuICAgIE9iamVjdC5lbnRyaWVzKGV2ZW50TGlzdGVuZXJzKS5mb3JFYWNoKChbZXZlbnQsIGxpc3RlbmVyXSkgPT4ge1xuICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgfSk7XG4gICAgXG4gICAgLy8gQ2xlYXIgZXZlbnRMaXN0ZW5lcnMgb2JqZWN0XG4gICAgZXZlbnRMaXN0ZW5lcnMgPSB7fTtcbiAgfTtcbiAgXG4gIC8vIEluaXRpYWxpemUgZXZlbnQgbGlzdGVuZXJzXG4gIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgXG4gIHJldHVybiB7XG4gICAgLyoqXG4gICAgICogQWRkIGEgZ2VzdHVyZSBldmVudCBsaXN0ZW5lclxuICAgICAqIEBwYXJhbSBldmVudFR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgdG8gbGlzdGVuIGZvclxuICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAqIEByZXR1cm5zIEdlc3R1cmUgbWFuYWdlciBmb3IgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBvbihldmVudFR5cGU6IHN0cmluZywgaGFuZGxlcjogR2VzdHVyZUhhbmRsZXIpOiBHZXN0dXJlTWFuYWdlciB7XG4gICAgICBpZiAoIWhhbmRsZXJzLmhhcyhldmVudFR5cGUpKSB7XG4gICAgICAgIGhhbmRsZXJzLnNldChldmVudFR5cGUsIG5ldyBTZXQoKSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGhhbmRsZXJzLmdldChldmVudFR5cGUpIS5hZGQoaGFuZGxlcik7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIFxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIGdlc3R1cmUgZXZlbnQgbGlzdGVuZXJcbiAgICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gVHlwZSBvZiBnZXN0dXJlXG4gICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIHRvIHJlbW92ZVxuICAgICAqIEByZXR1cm5zIEdlc3R1cmUgbWFuYWdlciBmb3IgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBvZmYoZXZlbnRUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IEdlc3R1cmVIYW5kbGVyKTogR2VzdHVyZU1hbmFnZXIge1xuICAgICAgY29uc3QgZXZlbnRIYW5kbGVycyA9IGhhbmRsZXJzLmdldChldmVudFR5cGUpO1xuICAgICAgaWYgKGV2ZW50SGFuZGxlcnMpIHtcbiAgICAgICAgZXZlbnRIYW5kbGVycy5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIFxuICAgICAgICBpZiAoZXZlbnRIYW5kbGVycy5zaXplID09PSAwKSB7XG4gICAgICAgICAgaGFuZGxlcnMuZGVsZXRlKGV2ZW50VHlwZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYSBnZXN0dXJlIGlzIHN1cHBvcnRlZCBvbiB0aGUgY3VycmVudCBkZXZpY2VcbiAgICAgKiBAcGFyYW0gZ2VzdHVyZVR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgdG8gY2hlY2tcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBnZXN0dXJlIGlzIHN1cHBvcnRlZFxuICAgICAqL1xuICAgIGlzU3VwcG9ydGVkKGdlc3R1cmVUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBnZXN0dXJlVHlwZSBpbiBnZXN0dXJlU3VwcG9ydCAmJiBnZXN0dXJlU3VwcG9ydFtnZXN0dXJlVHlwZSBhcyBrZXlvZiB0eXBlb2YgZ2VzdHVyZVN1cHBvcnRdO1xuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogRW5hYmxlIGdlc3R1cmUgcmVjb2duaXRpb24gYnkgYWRkaW5nIGV2ZW50IGxpc3RlbmVyc1xuICAgICAqIEByZXR1cm5zIEdlc3R1cmUgbWFuYWdlciBmb3IgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBlbmFibGUoKTogR2VzdHVyZU1hbmFnZXIge1xuICAgICAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBcbiAgICAvKipcbiAgICAgKiBEaXNhYmxlIGdlc3R1cmUgcmVjb2duaXRpb24gYnkgcmVtb3ZpbmcgZXZlbnQgbGlzdGVuZXJzXG4gICAgICogQHJldHVybnMgR2VzdHVyZSBtYW5hZ2VyIGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIGRpc2FibGUoKTogR2VzdHVyZU1hbmFnZXIge1xuICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogQ2xlYW4gdXAgZXZlbnQgbGlzdGVuZXJzIGFuZCB0aW1lcnNcbiAgICAgKi9cbiAgICBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgLy8gQ2xlYW4gdXAgbGlzdGVuZXJzXG4gICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgICAgXG4gICAgICAvLyBDbGVhciBsb25nIHByZXNzIHRpbWVyXG4gICAgICBpZiAobG9uZ1ByZXNzQ2xlYW51cCkge1xuICAgICAgICBsb25nUHJlc3NDbGVhbnVwKCk7XG4gICAgICAgIGxvbmdQcmVzc0NsZWFudXAgPSBudWxsO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDbGVhciBoYW5kbGVyIHJlZmVyZW5jZXNcbiAgICAgIGhhbmRsZXJzLmNsZWFyKCk7XG4gICAgfVxuICB9O1xufTsiLAogICAgIi8vIHNyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2NvbXBvc2UvZmVhdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBBZGRzIGdlc3R1cmUgcmVjb2duaXRpb24gY2FwYWJpbGl0aWVzIHRvIGNvbXBvbmVudHNcbiAqL1xuXG5pbXBvcnQgeyBCYXNlQ29tcG9uZW50LCBFbGVtZW50Q29tcG9uZW50IH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZUdlc3R1cmVNYW5hZ2VyLFxuICBHZXN0dXJlTWFuYWdlcixcbiAgR2VzdHVyZUNvbmZpZyxcbiAgR2VzdHVyZUhhbmRsZXIsXG4gIEFueUdlc3R1cmVFdmVudCxcbn0gZnJvbSBcIi4uLy4uLy4uL2dlc3R1cmVzXCI7XG5pbXBvcnQgeyBoYXNMaWZlY3ljbGUsIGhhc0VtaXQgfSBmcm9tIFwibXRybFwiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGdlc3R1cmVzIGZlYXR1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXN0dXJlc0ZlYXR1cmVDb25maWcgZXh0ZW5kcyBHZXN0dXJlQ29uZmlnIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIGdlc3R1cmUgcmVjb2duaXRpb24gaW1tZWRpYXRlbHlcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlR2VzdHVyZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsIGdlc3R1cmUgZXZlbnQgaGFuZGxlcnNcbiAgICovXG4gIGdlc3R1cmVIYW5kbGVycz86IFJlY29yZDxzdHJpbmcsIEdlc3R1cmVIYW5kbGVyPjtcblxuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IHdpdGggZ2VzdHVyZSByZWNvZ25pdGlvbiBjYXBhYmlsaXRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXN0dXJlc0NvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvKipcbiAgICogR2VzdHVyZSBtYW5hZ2VyIGluc3RhbmNlXG4gICAqL1xuICBnZXN0dXJlczogR2VzdHVyZU1hbmFnZXI7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGdlc3R1cmUgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gVHlwZSBvZiBnZXN0dXJlIGV2ZW50XG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uR2VzdHVyZTogKGV2ZW50VHlwZTogc3RyaW5nLCBoYW5kbGVyOiBHZXN0dXJlSGFuZGxlcikgPT4gR2VzdHVyZXNDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGdlc3R1cmUgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gVHlwZSBvZiBnZXN0dXJlIGV2ZW50XG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZkdlc3R1cmU6IChldmVudFR5cGU6IHN0cmluZywgaGFuZGxlcjogR2VzdHVyZUhhbmRsZXIpID0+IEdlc3R1cmVzQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIGdlc3R1cmUgdHlwZSBpcyBzdXBwb3J0ZWQgb24gdGhlIGN1cnJlbnQgZGV2aWNlXG4gICAqIEBwYXJhbSBnZXN0dXJlVHlwZSAtIFR5cGUgb2YgZ2VzdHVyZSB0byBjaGVja1xuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBnZXN0dXJlIGlzIHN1cHBvcnRlZFxuICAgKi9cbiAgaXNHZXN0dXJlU3VwcG9ydGVkOiAoZ2VzdHVyZVR5cGU6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlIGdlc3R1cmUgcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgR2VzdHVyZXNDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBlbmFibGVHZXN0dXJlczogKCkgPT4gR2VzdHVyZXNDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIERpc2FibGUgZ2VzdHVyZSByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGRpc2FibGVHZXN0dXJlczogKCkgPT4gR2VzdHVyZXNDb21wb25lbnQ7XG59XG5cbi8qKlxuICogQWRkcyBnZXN0dXJlIHJlY29nbml0aW9uIGNhcGFiaWxpdGllcyB0byBhIGNvbXBvbmVudC5cbiAqIFRoaXMgaXMgYSBjb21wcmVoZW5zaXZlIGdlc3R1cmUgZmVhdHVyZSB0aGF0IGFkZHMgc3VwcG9ydCBmb3IgYWxsIGdlc3R1cmUgdHlwZXMuXG4gKiBGb3IgbW9yZSBsaWdodHdlaWdodCwgc3BlY2lmaWMgZ2VzdHVyZXMsIHVzZSB0aGUgaW5kaXZpZHVhbCBnZXN0dXJlIGZlYXR1cmVzLlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9iamVjdCBjb250YWluaW5nIGdlc3R1cmUgc2V0dGluZ3NcbiAqIEByZXR1cm5zIEZ1bmN0aW9uIHRoYXQgZW5oYW5jZXMgYSBjb21wb25lbnQgd2l0aCBnZXN0dXJlIGNhcGFiaWxpdGllc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gQWRkIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnRcbiAqIGNvbnN0IGNvbXBvbmVudCA9IHBpcGUoXG4gKiAgIGNyZWF0ZUJhc2UsXG4gKiAgIHdpdGhFbGVtZW50KC4uLiksXG4gKiAgIHdpdGhHZXN0dXJlcyh7XG4gKiAgICAgc3dpcGVUaHJlc2hvbGQ6IDUwLFxuICogICAgIGdlc3R1cmVIYW5kbGVyczoge1xuICogICAgICAgJ3RhcCc6IChlKSA9PiBoYW5kbGVUYXAoZSksXG4gKiAgICAgICAnc3dpcGVsZWZ0JzogKGUpID0+IG5hdmlnYXRlRm9yd2FyZChlKSxcbiAqICAgICAgICdzd2lwZXJpZ2h0JzogKGUpID0+IG5hdmlnYXRlQmFjayhlKVxuICogICAgIH1cbiAqICAgfSlcbiAqICkoY29uZmlnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgd2l0aEdlc3R1cmVzID1cbiAgKGNvbmZpZzogR2VzdHVyZXNGZWF0dXJlQ29uZmlnID0ge30pID0+XG4gIDxDIGV4dGVuZHMgRWxlbWVudENvbXBvbmVudD4oY29tcG9uZW50OiBDKTogQyAmIEdlc3R1cmVzQ29tcG9uZW50ID0+IHtcbiAgICBpZiAoIWNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJDYW5ub3QgYWRkIGdlc3R1cmUgcmVjb2duaXRpb246IG1pc3NpbmcgZWxlbWVudFwiKTtcbiAgICAgIHJldHVybiBjb21wb25lbnQgYXMgQyAmIEdlc3R1cmVzQ29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIGVuYWJsZUdlc3R1cmVzID0gdHJ1ZSxcbiAgICAgIGdlc3R1cmVIYW5kbGVycyA9IHt9LFxuICAgICAgLi4uZ2VzdHVyZUNvbmZpZ1xuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBDcmVhdGUgZ2VzdHVyZSBtYW5hZ2VyXG4gICAgY29uc3QgZ2VzdHVyZU1hbmFnZXIgPSBjcmVhdGVHZXN0dXJlTWFuYWdlcihcbiAgICAgIGNvbXBvbmVudC5lbGVtZW50LFxuICAgICAgZ2VzdHVyZUNvbmZpZ1xuICAgICk7XG5cbiAgICAvLyBBZGQgaW5pdGlhbCBnZXN0dXJlIGhhbmRsZXJzXG4gICAgT2JqZWN0LmVudHJpZXMoZ2VzdHVyZUhhbmRsZXJzKS5mb3JFYWNoKChbZXZlbnRUeXBlLCBoYW5kbGVyXSkgPT4ge1xuICAgICAgZ2VzdHVyZU1hbmFnZXIub24oZXZlbnRUeXBlLCBoYW5kbGVyKTtcbiAgICB9KTtcblxuICAgIC8vIEVuYWJsZS9kaXNhYmxlIGJhc2VkIG9uIGNvbmZpZ1xuICAgIGlmICghZW5hYmxlR2VzdHVyZXMpIHtcbiAgICAgIGdlc3R1cmVNYW5hZ2VyLmRpc2FibGUoKTtcbiAgICB9XG5cbiAgICAvLyBDb25uZWN0IHdpdGggZXhpc3RpbmcgZXZlbnQgc3lzdGVtIGlmIGF2YWlsYWJsZVxuICAgIGlmIChoYXNFbWl0KGNvbXBvbmVudCkpIHtcbiAgICAgIC8vIEZvcndhcmQgZ2VzdHVyZSBldmVudHMgdG8gdGhlIGNvbXBvbmVudCdzIGV2ZW50IHN5c3RlbVxuICAgICAgY29uc3QgZm9yd2FyZEdlc3R1cmVFdmVudHMgPSAoZXZlbnQ6IEFueUdlc3R1cmVFdmVudCkgPT4ge1xuICAgICAgICBjb21wb25lbnQuZW1pdChldmVudC50eXBlLCBldmVudCk7XG4gICAgICB9O1xuXG4gICAgICAvLyBSZWdpc3RlciBmb3J3YXJkZXIgZm9yIGNvbW1vbiBnZXN0dXJlIHR5cGVzXG4gICAgICBbXG4gICAgICAgIFwidGFwXCIsXG4gICAgICAgIFwic3dpcGVcIixcbiAgICAgICAgXCJzd2lwZWxlZnRcIixcbiAgICAgICAgXCJzd2lwZXJpZ2h0XCIsXG4gICAgICAgIFwic3dpcGV1cFwiLFxuICAgICAgICBcInN3aXBlZG93blwiLFxuICAgICAgICBcImxvbmdwcmVzc1wiLFxuICAgICAgICBcInBpbmNoXCIsXG4gICAgICAgIFwicm90YXRlXCIsXG4gICAgICAgIFwicGFuXCIsXG4gICAgICBdLmZvckVhY2goKHR5cGUpID0+IHtcbiAgICAgICAgZ2VzdHVyZU1hbmFnZXIub24odHlwZSwgZm9yd2FyZEdlc3R1cmVFdmVudHMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGxpZmVjeWNsZSBpbnRlZ3JhdGlvblxuICAgIGlmIChoYXNMaWZlY3ljbGUoY29tcG9uZW50KSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95O1xuXG4gICAgICBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGdlc3R1cmUgbWFuYWdlclxuICAgICAgICBnZXN0dXJlTWFuYWdlci5kZXN0cm95KCk7XG5cbiAgICAgICAgLy8gQ2FsbCBvcmlnaW5hbCBkZXN0cm95IG1ldGhvZFxuICAgICAgICBvcmlnaW5hbERlc3Ryb3kuY2FsbChjb21wb25lbnQubGlmZWN5Y2xlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBnZXN0dXJlczogZ2VzdHVyZU1hbmFnZXIsXG5cbiAgICAgIC8qKlxuICAgICAgICogQWRkIGEgZ2VzdHVyZSBldmVudCBoYW5kbGVyXG4gICAgICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gVHlwZSBvZiBnZXN0dXJlIGV2ZW50XG4gICAgICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICAgICAqIEByZXR1cm5zIEdlc3R1cmVzQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgICAgICovXG4gICAgICBvbkdlc3R1cmUoZXZlbnRUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IEdlc3R1cmVIYW5kbGVyKSB7XG4gICAgICAgIGdlc3R1cmVNYW5hZ2VyLm9uKGV2ZW50VHlwZSwgaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBSZW1vdmUgYSBnZXN0dXJlIGV2ZW50IGhhbmRsZXJcbiAgICAgICAqIEBwYXJhbSBldmVudFR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgZXZlbnRcbiAgICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICogQHJldHVybnMgR2VzdHVyZXNDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIG9mZkdlc3R1cmUoZXZlbnRUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IEdlc3R1cmVIYW5kbGVyKSB7XG4gICAgICAgIGdlc3R1cmVNYW5hZ2VyLm9mZihldmVudFR5cGUsIGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgYSBnZXN0dXJlIHR5cGUgaXMgc3VwcG9ydGVkIG9uIHRoZSBjdXJyZW50IGRldmljZVxuICAgICAgICogQHBhcmFtIGdlc3R1cmVUeXBlIC0gVHlwZSBvZiBnZXN0dXJlIHRvIGNoZWNrXG4gICAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBnZXN0dXJlIGlzIHN1cHBvcnRlZFxuICAgICAgICovXG4gICAgICBpc0dlc3R1cmVTdXBwb3J0ZWQoZ2VzdHVyZVR5cGU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gZ2VzdHVyZU1hbmFnZXIuaXNTdXBwb3J0ZWQoZ2VzdHVyZVR5cGUpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBFbmFibGUgZ2VzdHVyZSByZWNvZ25pdGlvblxuICAgICAgICogQHJldHVybnMgR2VzdHVyZXNDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZUdlc3R1cmVzKCkge1xuICAgICAgICBnZXN0dXJlTWFuYWdlci5lbmFibGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIERpc2FibGUgZ2VzdHVyZSByZWNvZ25pdGlvblxuICAgICAgICogQHJldHVybnMgR2VzdHVyZXNDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVHZXN0dXJlcygpIHtcbiAgICAgICAgZ2VzdHVyZU1hbmFnZXIuZGlzYWJsZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbiIsCiAgICAiLy8gc3JjL2NvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlcy90YXAudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBBZGRzIHRhcCBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGNvbXBvbmVudHNcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEJhc2VDb21wb25lbnQsIEVsZW1lbnRDb21wb25lbnQgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgVGFwRXZlbnQsIEdlc3R1cmVIYW5kbGVyIH0gZnJvbSBcIi4uLy4uLy4uL2dlc3R1cmVzXCI7XG5pbXBvcnQgeyBoYXNMaWZlY3ljbGUsIGhhc0VtaXQgfSBmcm9tIFwibXRybFwiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRhcCBnZXN0dXJlIGZlYXR1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXBHZXN0dXJlQ29uZmlnIHtcbiAgLyoqXG4gICAqIERpc3RhbmNlIHRocmVzaG9sZCAoaW4gcGl4ZWxzKSBmb3IgdGFwIHJlY29nbml0aW9uXG4gICAqIEBkZWZhdWx0IDEwXG4gICAqL1xuICB0YXBEaXN0YW5jZVRocmVzaG9sZD86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBwcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3JzIG9uIHRvdWNoIGV2ZW50c1xuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBwcmV2ZW50RGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIHRhcCBnZXN0dXJlXG4gICAqL1xuICBvblRhcD86IEdlc3R1cmVIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVuYWJsZSB0YXAgcmVjb2duaXRpb24gaW1tZWRpYXRlbHlcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vKipcbiAqIENvbXBvbmVudCB3aXRoIHRhcCBnZXN0dXJlIHJlY29nbml0aW9uIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhcEdlc3R1cmVDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIEFkZCBhIHRhcCBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblRhcDogKGhhbmRsZXI6IChldmVudDogVGFwRXZlbnQpID0+IHZvaWQpID0+IFRhcEdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHRhcCBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZUYXA6IChoYW5kbGVyOiAoZXZlbnQ6IFRhcEV2ZW50KSA9PiB2b2lkKSA9PiBUYXBHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBFbmFibGUgdGFwIHJlY29nbml0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGVuYWJsZVRhcDogKCkgPT4gVGFwR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogRGlzYWJsZSB0YXAgcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZGlzYWJsZVRhcDogKCkgPT4gVGFwR2VzdHVyZUNvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBBZGRzIHRhcCBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50LlxuICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IGFsdGVybmF0aXZlIHRvIHRoZSBmdWxsIGdlc3R1cmUgc3lzdGVtLFxuICogZm9jdXNlZCBvbmx5IG9uIHRhcCBkZXRlY3Rpb24uXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0IGNvbnRhaW5pbmcgdGFwIHNldHRpbmdzXG4gKiBAcmV0dXJucyBGdW5jdGlvbiB0aGF0IGVuaGFuY2VzIGEgY29tcG9uZW50IHdpdGggdGFwIGNhcGFiaWxpdGllc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gQWRkIHRhcCBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50XG4gKiBjb25zdCBjb21wb25lbnQgPSBwaXBlKFxuICogICBjcmVhdGVCYXNlLFxuICogICB3aXRoRWxlbWVudCguLi4pLFxuICogICB3aXRoVGFwR2VzdHVyZSh7XG4gKiAgICAgb25UYXA6IChlKSA9PiBjb25zb2xlLmxvZygnVGFwcGVkIGF0JywgZS54LCBlLnkpXG4gKiAgIH0pXG4gKiApKGNvbmZpZyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhUYXBHZXN0dXJlID1cbiAgKGNvbmZpZzogVGFwR2VzdHVyZUNvbmZpZyA9IHt9KSA9PlxuICA8QyBleHRlbmRzIEVsZW1lbnRDb21wb25lbnQ+KGNvbXBvbmVudDogQyk6IEMgJiBUYXBHZXN0dXJlQ29tcG9uZW50ID0+IHtcbiAgICBpZiAoIWNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJDYW5ub3QgYWRkIHRhcCBnZXN0dXJlIHJlY29nbml0aW9uOiBtaXNzaW5nIGVsZW1lbnRcIik7XG4gICAgICByZXR1cm4gY29tcG9uZW50IGFzIEMgJiBUYXBHZXN0dXJlQ29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIHRhcERpc3RhbmNlVGhyZXNob2xkID0gMTAsXG4gICAgICBwcmV2ZW50RGVmYXVsdCA9IHRydWUsXG4gICAgICBvblRhcCxcbiAgICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBFdmVudCBoYW5kbGVycyBzdG9yYWdlXG4gICAgY29uc3QgaGFuZGxlcnM6IFNldDwoZXZlbnQ6IFRhcEV2ZW50KSA9PiB2b2lkPiA9IG5ldyBTZXQoKTtcblxuICAgIC8vIElmIGluaXRpYWwgaGFuZGxlciBwcm92aWRlZCwgYWRkIGl0XG4gICAgaWYgKG9uVGFwKSB7XG4gICAgICBoYW5kbGVycy5hZGQob25UYXAgYXMgKGV2ZW50OiBUYXBFdmVudCkgPT4gdm9pZCk7XG4gICAgfVxuXG4gICAgLy8gR2VzdHVyZSBzdGF0ZSBmb3IgdHJhY2tpbmdcbiAgICBsZXQgc3RhcnRYID0gMDtcbiAgICBsZXQgc3RhcnRZID0gMDtcbiAgICBsZXQgYWN0aXZlID0gZmFsc2U7XG4gICAgbGV0IHN0YXJ0VGltZSA9IDA7XG4gICAgbGV0IGxhc3RUYXBUaW1lID0gMDtcbiAgICBsZXQgdGFwQ291bnQgPSAwO1xuICAgIGxldCBpc0VuYWJsZWQgPSBlbmFibGVkO1xuXG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2ggYSB0YXAgZXZlbnQgdG8gYWxsIGhhbmRsZXJzXG4gICAgICovXG4gICAgY29uc3QgZGlzcGF0Y2hUYXAgPSAoXG4gICAgICBlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCxcbiAgICAgIHg6IG51bWJlcixcbiAgICAgIHk6IG51bWJlclxuICAgICk6IHZvaWQgPT4ge1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGlzRG91YmxlVGFwID0gbm93IC0gbGFzdFRhcFRpbWUgPCAzMDA7XG5cbiAgICAgIGlmIChpc0RvdWJsZVRhcCkge1xuICAgICAgICB0YXBDb3VudCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFwQ291bnQgPSAxO1xuICAgICAgfVxuXG4gICAgICBsYXN0VGFwVGltZSA9IG5vdztcblxuICAgICAgLy8gQ3JlYXRlIHRoZSB0YXAgZXZlbnRcbiAgICAgIGNvbnN0IHRhcEV2ZW50OiBUYXBFdmVudCA9IHtcbiAgICAgICAgdHlwZTogXCJ0YXBcIixcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgdGFyZ2V0OiBlLnRhcmdldCEsXG4gICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgZW5kVGltZTogbm93LFxuICAgICAgICBkdXJhdGlvbjogbm93IC0gc3RhcnRUaW1lLFxuICAgICAgICBkZWZhdWx0UHJldmVudGVkOiBmYWxzZSxcbiAgICAgICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgICB0YXBFdmVudC5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZS5jYW5jZWxhYmxlKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzdG9wUHJvcGFnYXRpb246ICgpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9LFxuICAgICAgICBjb3VudDogdGFwQ291bnQsXG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICB9O1xuXG4gICAgICAvLyBDYWxsIGVhY2ggaGFuZGxlclxuICAgICAgaGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGhhbmRsZXIodGFwRXZlbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBpbiB0YXAgaGFuZGxlcjpcIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gRm9yd2FyZCB0byBjb21wb25lbnQncyBldmVudCBzeXN0ZW0gaWYgYXZhaWxhYmxlXG4gICAgICBpZiAoaGFzRW1pdChjb21wb25lbnQpKSB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0KFwidGFwXCIsIHRhcEV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgcHJldmVudERlZmF1bHQgaWYgY29uZmlndXJlZFxuICAgICAgaWYgKHByZXZlbnREZWZhdWx0ICYmICF0YXBFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgIHRhcEV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBzdGFydFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZVN0YXJ0ID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWlzRW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0b3VjaCA9IFwidG91Y2hlc1wiIGluIGUgPyBlLnRvdWNoZXNbMF0gOiBlO1xuXG4gICAgICBzdGFydFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgc3RhcnRZID0gdG91Y2guY2xpZW50WTtcbiAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBhY3RpdmUgPSB0cnVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgZW5kXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlRW5kID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWFjdGl2ZSB8fCAhaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRvdWNoID1cbiAgICAgICAgXCJjaGFuZ2VkVG91Y2hlc1wiIGluIGUgJiYgZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggPiAwXG4gICAgICAgICAgPyBlLmNoYW5nZWRUb3VjaGVzWzBdXG4gICAgICAgICAgOiAoZSBhcyBNb3VzZUV2ZW50KTtcblxuICAgICAgY29uc3QgZW5kWCA9IHRvdWNoLmNsaWVudFg7XG4gICAgICBjb25zdCBlbmRZID0gdG91Y2guY2xpZW50WTtcblxuICAgICAgLy8gQ2FsY3VsYXRlIGRpc3RhbmNlIG1vdmVkXG4gICAgICBjb25zdCBkZWx0YVggPSBlbmRYIC0gc3RhcnRYO1xuICAgICAgY29uc3QgZGVsdGFZID0gZW5kWSAtIHN0YXJ0WTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIG1vdmVtZW50IGlzIHdpdGhpbiB0aHJlc2hvbGRcbiAgICAgIGlmIChkaXN0YW5jZSA8IHRhcERpc3RhbmNlVGhyZXNob2xkKSB7XG4gICAgICAgIGRpc3BhdGNoVGFwKGUsIGVuZFgsIGVuZFkpO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIGNhbmNlbFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvLyBFdmVudCBsaXN0ZW5lcnMgZGljdGlvbmFyeVxuICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzOiBSZWNvcmQ8c3RyaW5nLCBFdmVudExpc3RlbmVyPiA9IHtcbiAgICAgIG1vdXNlZG93bjogaGFuZGxlU3RhcnQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNldXA6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2VsZWF2ZTogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaHN0YXJ0OiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hlbmQ6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hjYW5jZWw6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGQgZXZlbnQgbGlzdGVuZXJzIHRvIGVsZW1lbnRcbiAgICAgKi9cbiAgICBjb25zdCBzZXR1cEV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCB7XG4gICAgICAgICAgcGFzc2l2ZTogIXByZXZlbnREZWZhdWx0LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGZyb20gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHJlbW92ZUV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBTZXR1cCBsaXN0ZW5lcnMgaWYgaW5pdGlhbGx5IGVuYWJsZWRcbiAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGxpZmVjeWNsZSBpbnRlZ3JhdGlvblxuICAgIGlmIChoYXNMaWZlY3ljbGUoY29tcG9uZW50KSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95O1xuXG4gICAgICBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuXG4gICAgICAgIC8vIENsZWFyIGhhbmRsZXJzXG4gICAgICAgIGhhbmRsZXJzLmNsZWFyKCk7XG5cbiAgICAgICAgLy8gQ2FsbCBvcmlnaW5hbCBkZXN0cm95IG1ldGhvZFxuICAgICAgICBvcmlnaW5hbERlc3Ryb3kuY2FsbChjb21wb25lbnQubGlmZWN5Y2xlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG5cbiAgICAgIC8qKlxuICAgICAgICogQWRkIGEgdGFwIGV2ZW50IGhhbmRsZXJcbiAgICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgICAgICovXG4gICAgICBvblRhcChoYW5kbGVyOiAoZXZlbnQ6IFRhcEV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBhIHRhcCBldmVudCBoYW5kbGVyXG4gICAgICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICAgICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgb2ZmVGFwKGhhbmRsZXI6IChldmVudDogVGFwRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRW5hYmxlIHRhcCByZWNvZ25pdGlvblxuICAgICAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgICAgICovXG4gICAgICBlbmFibGVUYXAoKSB7XG4gICAgICAgIGlmICghaXNFbmFibGVkKSB7XG4gICAgICAgICAgaXNFbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIERpc2FibGUgdGFwIHJlY29nbml0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVUYXAoKSB7XG4gICAgICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvLyBzcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3N3aXBlLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzXG4gKiBAZGVzY3JpcHRpb24gQWRkcyBzd2lwZSBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGNvbXBvbmVudHNcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEJhc2VDb21wb25lbnQsIEVsZW1lbnRDb21wb25lbnQgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHtcbiAgU3dpcGVFdmVudCxcbiAgU1dJUEVfRElSRUNUSU9OUyxcbiAgR2VzdHVyZUhhbmRsZXIsXG59IGZyb20gXCIuLi8uLi8uLi9nZXN0dXJlc1wiO1xuaW1wb3J0IHsgaGFzTGlmZWN5Y2xlLCBoYXNFbWl0IH0gZnJvbSBcIm10cmxcIjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBzd2lwZSBnZXN0dXJlIGZlYXR1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTd2lwZUdlc3R1cmVDb25maWcge1xuICAvKipcbiAgICogTWluaW11bSBkaXN0YW5jZSAoaW4gcGl4ZWxzKSB0byByZWNvZ25pemUgYSBzd2lwZVxuICAgKiBAZGVmYXVsdCAzMFxuICAgKi9cbiAgc3dpcGVUaHJlc2hvbGQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gdGltZSAoaW4gbXMpIGluIHdoaWNoIGEgc3dpcGUgbXVzdCBiZSBjb21wbGV0ZWRcbiAgICogQGRlZmF1bHQgMzAwXG4gICAqL1xuICBzd2lwZVRpbWVUaHJlc2hvbGQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcHJldmVudCBkZWZhdWx0IGJlaGF2aW9ycyBvbiB0b3VjaCBldmVudHNcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcHJldmVudERlZmF1bHQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVyIGZvciBhbnkgc3dpcGUgZGlyZWN0aW9uXG4gICAqL1xuICBvblN3aXBlPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciBsZWZ0IHN3aXBlc1xuICAgKi9cbiAgb25Td2lwZUxlZnQ/OiBHZXN0dXJlSGFuZGxlcjtcblxuICAvKipcbiAgICogSGFuZGxlciBzcGVjaWZpY2FsbHkgZm9yIHJpZ2h0IHN3aXBlc1xuICAgKi9cbiAgb25Td2lwZVJpZ2h0PzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciB1cCBzd2lwZXNcbiAgICovXG4gIG9uU3dpcGVVcD86IEdlc3R1cmVIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVyIHNwZWNpZmljYWxseSBmb3IgZG93biBzd2lwZXNcbiAgICovXG4gIG9uU3dpcGVEb3duPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIHN3aXBlIHJlY29nbml0aW9uIGltbWVkaWF0ZWx5XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgd2l0aCBzd2lwZSBnZXN0dXJlIHJlY29nbml0aW9uIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFN3aXBlR2VzdHVyZUNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvKipcbiAgICogQWRkIGEgaGFuZGxlciBmb3IgYW55IHN3aXBlIGRpcmVjdGlvblxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb25Td2lwZTogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBoYW5kbGVyIHNwZWNpZmljYWxseSBmb3IgbGVmdCBzd2lwZXNcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uU3dpcGVMZWZ0OiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciByaWdodCBzd2lwZXNcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uU3dpcGVSaWdodDogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBoYW5kbGVyIHNwZWNpZmljYWxseSBmb3IgdXAgc3dpcGVzXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblN3aXBlVXA6IChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpID0+IFN3aXBlR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogQWRkIGEgaGFuZGxlciBzcGVjaWZpY2FsbHkgZm9yIGRvd24gc3dpcGVzXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblN3aXBlRG93bjogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBzd2lwZSBldmVudCBoYW5kbGVyIGZvciBhbnkgZGlyZWN0aW9uXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZTd2lwZTogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBsZWZ0IHN3aXBlIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlN3aXBlTGVmdDogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSByaWdodCBzd2lwZSBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZTd2lwZVJpZ2h0OiAoXG4gICAgaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkXG4gICkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gdXAgc3dpcGUgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmU3dpcGVVcDogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBkb3duIHN3aXBlIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlN3aXBlRG93bjogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBFbmFibGUgc3dpcGUgcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZW5hYmxlU3dpcGU6ICgpID0+IFN3aXBlR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogRGlzYWJsZSBzd2lwZSByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBkaXNhYmxlU3dpcGU6ICgpID0+IFN3aXBlR2VzdHVyZUNvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgc3dpcGUgZGlyZWN0aW9uIGJhc2VkIG9uIGRlbHRhIFggYW5kIFlcbiAqXG4gKiBAcGFyYW0gZGVsdGFYIC0gRGlzdGFuY2UgbW92ZWQgaW4gWCBkaXJlY3Rpb25cbiAqIEBwYXJhbSBkZWx0YVkgLSBEaXN0YW5jZSBtb3ZlZCBpbiBZIGRpcmVjdGlvblxuICogQHJldHVybnMgRGlyZWN0aW9uIG9mIHRoZSBzd2lwZVxuICovXG5mdW5jdGlvbiBnZXRTd2lwZURpcmVjdGlvbihkZWx0YVg6IG51bWJlciwgZGVsdGFZOiBudW1iZXIpOiBTV0lQRV9ESVJFQ1RJT05TIHtcbiAgaWYgKE1hdGguYWJzKGRlbHRhWCkgPiBNYXRoLmFicyhkZWx0YVkpKSB7XG4gICAgcmV0dXJuIGRlbHRhWCA+IDAgPyBTV0lQRV9ESVJFQ1RJT05TLlJJR0hUIDogU1dJUEVfRElSRUNUSU9OUy5MRUZUO1xuICB9XG4gIHJldHVybiBkZWx0YVkgPiAwID8gU1dJUEVfRElSRUNUSU9OUy5ET1dOIDogU1dJUEVfRElSRUNUSU9OUy5VUDtcbn1cblxuLyoqXG4gKiBBZGRzIHN3aXBlIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnQuXG4gKiBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQgYWx0ZXJuYXRpdmUgdG8gdGhlIGZ1bGwgZ2VzdHVyZSBzeXN0ZW0sXG4gKiBmb2N1c2VkIG9ubHkgb24gc3dpcGUgZGV0ZWN0aW9uLlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9iamVjdCBjb250YWluaW5nIHN3aXBlIHNldHRpbmdzXG4gKiBAcmV0dXJucyBGdW5jdGlvbiB0aGF0IGVuaGFuY2VzIGEgY29tcG9uZW50IHdpdGggc3dpcGUgY2FwYWJpbGl0aWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBBZGQgc3dpcGUgZ2VzdHVyZSByZWNvZ25pdGlvbiB0byBhIGNvbXBvbmVudFxuICogY29uc3QgY29tcG9uZW50ID0gcGlwZShcbiAqICAgY3JlYXRlQmFzZSxcbiAqICAgd2l0aEVsZW1lbnQoLi4uKSxcbiAqICAgd2l0aFN3aXBlR2VzdHVyZSh7XG4gKiAgICAgb25Td2lwZUxlZnQ6ICgpID0+IHNob3dOZXh0UGFnZSgpLFxuICogICAgIG9uU3dpcGVSaWdodDogKCkgPT4gc2hvd1ByZXZpb3VzUGFnZSgpXG4gKiAgIH0pXG4gKiApKGNvbmZpZyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhTd2lwZUdlc3R1cmUgPVxuICAoY29uZmlnOiBTd2lwZUdlc3R1cmVDb25maWcgPSB7fSkgPT5cbiAgPEMgZXh0ZW5kcyBFbGVtZW50Q29tcG9uZW50Pihjb21wb25lbnQ6IEMpOiBDICYgU3dpcGVHZXN0dXJlQ29tcG9uZW50ID0+IHtcbiAgICBpZiAoIWNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJDYW5ub3QgYWRkIHN3aXBlIGdlc3R1cmUgcmVjb2duaXRpb246IG1pc3NpbmcgZWxlbWVudFwiKTtcbiAgICAgIHJldHVybiBjb21wb25lbnQgYXMgQyAmIFN3aXBlR2VzdHVyZUNvbXBvbmVudDtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IGNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCB7XG4gICAgICBzd2lwZVRocmVzaG9sZCA9IDMwLFxuICAgICAgc3dpcGVUaW1lVGhyZXNob2xkID0gMzAwLFxuICAgICAgcHJldmVudERlZmF1bHQgPSB0cnVlLFxuICAgICAgb25Td2lwZSxcbiAgICAgIG9uU3dpcGVMZWZ0LFxuICAgICAgb25Td2lwZVJpZ2h0LFxuICAgICAgb25Td2lwZVVwLFxuICAgICAgb25Td2lwZURvd24sXG4gICAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gRXZlbnQgaGFuZGxlcnMgc3RvcmFnZSBieSBkaXJlY3Rpb25cbiAgICBjb25zdCBoYW5kbGVycyA9IHtcbiAgICAgIHN3aXBlOiBuZXcgU2V0PChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZD4oKSxcbiAgICAgIHN3aXBlbGVmdDogbmV3IFNldDwoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQ+KCksXG4gICAgICBzd2lwZXJpZ2h0OiBuZXcgU2V0PChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZD4oKSxcbiAgICAgIHN3aXBldXA6IG5ldyBTZXQ8KGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkPigpLFxuICAgICAgc3dpcGVkb3duOiBuZXcgU2V0PChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZD4oKSxcbiAgICB9O1xuXG4gICAgLy8gQWRkIGluaXRpYWwgaGFuZGxlcnMgaWYgcHJvdmlkZWRcbiAgICBpZiAob25Td2lwZSkgaGFuZGxlcnMuc3dpcGUuYWRkKG9uU3dpcGUgYXMgKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKTtcbiAgICBpZiAob25Td2lwZUxlZnQpXG4gICAgICBoYW5kbGVycy5zd2lwZWxlZnQuYWRkKG9uU3dpcGVMZWZ0IGFzIChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCk7XG4gICAgaWYgKG9uU3dpcGVSaWdodClcbiAgICAgIGhhbmRsZXJzLnN3aXBlcmlnaHQuYWRkKG9uU3dpcGVSaWdodCBhcyAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpO1xuICAgIGlmIChvblN3aXBlVXApXG4gICAgICBoYW5kbGVycy5zd2lwZXVwLmFkZChvblN3aXBlVXAgYXMgKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKTtcbiAgICBpZiAob25Td2lwZURvd24pXG4gICAgICBoYW5kbGVycy5zd2lwZWRvd24uYWRkKG9uU3dpcGVEb3duIGFzIChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCk7XG5cbiAgICAvLyBHZXN0dXJlIHN0YXRlIGZvciB0cmFja2luZ1xuICAgIGxldCBzdGFydFggPSAwO1xuICAgIGxldCBzdGFydFkgPSAwO1xuICAgIGxldCBhY3RpdmUgPSBmYWxzZTtcbiAgICBsZXQgc3RhcnRUaW1lID0gMDtcbiAgICBsZXQgaXNFbmFibGVkID0gZW5hYmxlZDtcblxuICAgIC8qKlxuICAgICAqIERpc3BhdGNoIGEgc3dpcGUgZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgaGFuZGxlcnNcbiAgICAgKi9cbiAgICBjb25zdCBkaXNwYXRjaFN3aXBlID0gKFxuICAgICAgZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQsXG4gICAgICBlbmRYOiBudW1iZXIsXG4gICAgICBlbmRZOiBudW1iZXJcbiAgICApOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGRlbHRhWCA9IGVuZFggLSBzdGFydFg7XG4gICAgICBjb25zdCBkZWx0YVkgPSBlbmRZIC0gc3RhcnRZO1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcbiAgICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgZHVyYXRpb24gPSBlbmRUaW1lIC0gc3RhcnRUaW1lO1xuICAgICAgY29uc3QgdmVsb2NpdHkgPSBkaXN0YW5jZSAvIGR1cmF0aW9uO1xuICAgICAgY29uc3QgZGlyZWN0aW9uID0gZ2V0U3dpcGVEaXJlY3Rpb24oZGVsdGFYLCBkZWx0YVkpO1xuXG4gICAgICAvLyBDcmVhdGUgdGhlIHN3aXBlIGV2ZW50XG4gICAgICBjb25zdCBzd2lwZUV2ZW50OiBTd2lwZUV2ZW50ID0ge1xuICAgICAgICB0eXBlOiBcInN3aXBlXCIsXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHRhcmdldDogZS50YXJnZXQhLFxuICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgIGVuZFRpbWUsXG4gICAgICAgIGR1cmF0aW9uLFxuICAgICAgICBkZWZhdWx0UHJldmVudGVkOiBmYWxzZSxcbiAgICAgICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgICBzd2lwZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChlLmNhbmNlbGFibGUpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHN0b3BQcm9wYWdhdGlvbjogKCkgPT4ge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgZGVsdGFYLFxuICAgICAgICBkZWx0YVksXG4gICAgICAgIGRpc3RhbmNlLFxuICAgICAgICB2ZWxvY2l0eSxcbiAgICAgICAgc3RhcnRYLFxuICAgICAgICBzdGFydFksXG4gICAgICAgIGVuZFgsXG4gICAgICAgIGVuZFksXG4gICAgICB9O1xuXG4gICAgICAvLyBGaXJzdCB0cmlnZ2VyIGdlbmVyaWMgc3dpcGUgaGFuZGxlcnNcbiAgICAgIGhhbmRsZXJzLnN3aXBlLmZvckVhY2goKGhhbmRsZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBoYW5kbGVyKHN3aXBlRXZlbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBpbiBzd2lwZSBoYW5kbGVyOlwiLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBUaGVuIHRyaWdnZXIgZGlyZWN0aW9uLXNwZWNpZmljIGhhbmRsZXJzXG4gICAgICBjb25zdCBkaXJlY3Rpb25LZXkgPSBgc3dpcGUke2RpcmVjdGlvbn1gIGFzIGtleW9mIHR5cGVvZiBoYW5kbGVycztcbiAgICAgIGhhbmRsZXJzW2RpcmVjdGlvbktleV0uZm9yRWFjaCgoaGFuZGxlcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGhhbmRsZXIoeyAuLi5zd2lwZUV2ZW50LCB0eXBlOiBkaXJlY3Rpb25LZXkgfSBhcyBTd2lwZUV2ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBpbiAke2RpcmVjdGlvbktleX0gaGFuZGxlcjpgLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBGb3J3YXJkIHRvIGNvbXBvbmVudCdzIGV2ZW50IHN5c3RlbSBpZiBhdmFpbGFibGVcbiAgICAgIGlmIChoYXNFbWl0KGNvbXBvbmVudCkpIHtcbiAgICAgICAgY29tcG9uZW50LmVtaXQoXCJzd2lwZVwiLCBzd2lwZUV2ZW50KTtcbiAgICAgICAgY29tcG9uZW50LmVtaXQoZGlyZWN0aW9uS2V5LCBzd2lwZUV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgcHJldmVudERlZmF1bHQgaWYgY29uZmlndXJlZFxuICAgICAgaWYgKHByZXZlbnREZWZhdWx0ICYmICFzd2lwZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgc3dpcGVFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2Ugc3RhcnRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVTdGFydCA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgdG91Y2ggPSBcInRvdWNoZXNcIiBpbiBlID8gZS50b3VjaGVzWzBdIDogZTtcblxuICAgICAgc3RhcnRYID0gdG91Y2guY2xpZW50WDtcbiAgICAgIHN0YXJ0WSA9IHRvdWNoLmNsaWVudFk7XG4gICAgICBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgYWN0aXZlID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIGVuZFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUVuZCA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFhY3RpdmUgfHwgIWlzRW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0b3VjaCA9XG4gICAgICAgIFwiY2hhbmdlZFRvdWNoZXNcIiBpbiBlICYmIGUuY2hhbmdlZFRvdWNoZXMubGVuZ3RoID4gMFxuICAgICAgICAgID8gZS5jaGFuZ2VkVG91Y2hlc1swXVxuICAgICAgICAgIDogKGUgYXMgTW91c2VFdmVudCk7XG5cbiAgICAgIGNvbnN0IGVuZFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgY29uc3QgZW5kWSA9IHRvdWNoLmNsaWVudFk7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBzd2lwZSBwcm9wZXJ0aWVzXG4gICAgICBjb25zdCBkZWx0YVggPSBlbmRYIC0gc3RhcnRYO1xuICAgICAgY29uc3QgZGVsdGFZID0gZW5kWSAtIHN0YXJ0WTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG5cbiAgICAgIC8vIENoZWNrIGlmIGl0J3MgYSBzd2lwZVxuICAgICAgaWYgKGRpc3RhbmNlID49IHN3aXBlVGhyZXNob2xkICYmIGR1cmF0aW9uIDw9IHN3aXBlVGltZVRocmVzaG9sZCkge1xuICAgICAgICBkaXNwYXRjaFN3aXBlKGUsIGVuZFgsIGVuZFkpO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIGNhbmNlbFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvLyBFdmVudCBsaXN0ZW5lcnMgZGljdGlvbmFyeVxuICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzOiBSZWNvcmQ8c3RyaW5nLCBFdmVudExpc3RlbmVyPiA9IHtcbiAgICAgIG1vdXNlZG93bjogaGFuZGxlU3RhcnQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNldXA6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2VsZWF2ZTogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaHN0YXJ0OiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hlbmQ6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hjYW5jZWw6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGQgZXZlbnQgbGlzdGVuZXJzIHRvIGVsZW1lbnRcbiAgICAgKi9cbiAgICBjb25zdCBzZXR1cEV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCB7XG4gICAgICAgICAgcGFzc2l2ZTogIXByZXZlbnREZWZhdWx0LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGZyb20gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHJlbW92ZUV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBTZXR1cCBsaXN0ZW5lcnMgaWYgaW5pdGlhbGx5IGVuYWJsZWRcbiAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGxpZmVjeWNsZSBpbnRlZ3JhdGlvblxuICAgIGlmIChoYXNMaWZlY3ljbGUoY29tcG9uZW50KSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95O1xuXG4gICAgICBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuXG4gICAgICAgIC8vIENsZWFyIGhhbmRsZXJzXG4gICAgICAgIE9iamVjdC52YWx1ZXMoaGFuZGxlcnMpLmZvckVhY2goKGhhbmRsZXJTZXQpID0+IGhhbmRsZXJTZXQuY2xlYXIoKSk7XG5cbiAgICAgICAgLy8gQ2FsbCBvcmlnaW5hbCBkZXN0cm95IG1ldGhvZFxuICAgICAgICBvcmlnaW5hbERlc3Ryb3kuY2FsbChjb21wb25lbnQubGlmZWN5Y2xlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG5cbiAgICAgIC8vIEFkZCBoYW5kbGVyIG1ldGhvZHNcbiAgICAgIG9uU3dpcGUoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvblN3aXBlTGVmdChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGVsZWZ0LmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvblN3aXBlUmlnaHQoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlcmlnaHQuYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9uU3dpcGVVcChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGV1cC5hZGQoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb25Td2lwZURvd24oaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlZG93bi5hZGQoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLy8gUmVtb3ZlIGhhbmRsZXIgbWV0aG9kc1xuICAgICAgb2ZmU3dpcGUoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvZmZTd2lwZUxlZnQoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlbGVmdC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb2ZmU3dpcGVSaWdodChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGVyaWdodC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb2ZmU3dpcGVVcChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGV1cC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb2ZmU3dpcGVEb3duKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5zd2lwZWRvd24uZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8vIEVuYWJsZS9kaXNhYmxlIG1ldGhvZHNcbiAgICAgIGVuYWJsZVN3aXBlKCkge1xuICAgICAgICBpZiAoIWlzRW5hYmxlZCkge1xuICAgICAgICAgIGlzRW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgZGlzYWJsZVN3aXBlKCkge1xuICAgICAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICAgICAgaXNFbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbiIsCiAgICAiLy8gc3JjL2NvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlcy9sb25ncHJlc3MudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBBZGRzIGxvbmcgcHJlc3MgZ2VzdHVyZSByZWNvZ25pdGlvbiB0byBjb21wb25lbnRzXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBCYXNlQ29tcG9uZW50LCBFbGVtZW50Q29tcG9uZW50IH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IExvbmdQcmVzc0V2ZW50LCBHZXN0dXJlSGFuZGxlciB9IGZyb20gXCIuLi8uLi8uLi9nZXN0dXJlc1wiO1xuaW1wb3J0IHsgaGFzTGlmZWN5Y2xlLCBoYXNFbWl0IH0gZnJvbSBcIm10cmxcIjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBsb25nIHByZXNzIGdlc3R1cmUgZmVhdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvbmdQcmVzc0dlc3R1cmVDb25maWcge1xuICAvKipcbiAgICogVGltZSAoaW4gbXMpIHRvIHJlY29nbml6ZSBhIGxvbmcgcHJlc3NcbiAgICogQGRlZmF1bHQgNTAwXG4gICAqL1xuICBsb25nUHJlc3NUaW1lPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEaXN0YW5jZSB0aHJlc2hvbGQgKGluIHBpeGVscykgZm9yIG1vdmVtZW50IHRoYXQgY2FuY2VscyBsb25nIHByZXNzXG4gICAqIEBkZWZhdWx0IDEwXG4gICAqL1xuICBtb3ZlVGhyZXNob2xkPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHByZXZlbnQgZGVmYXVsdCBiZWhhdmlvcnMgb24gdG91Y2ggZXZlbnRzXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHByZXZlbnREZWZhdWx0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgbG9uZyBwcmVzcyBnZXN0dXJlXG4gICAqL1xuICBvbkxvbmdQcmVzcz86IEdlc3R1cmVIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBsb25nIHByZXNzIHJlY29nbml0aW9uIGltbWVkaWF0ZWx5XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgd2l0aCBsb25nIHByZXNzIGdlc3R1cmUgcmVjb2duaXRpb24gY2FwYWJpbGl0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9uZ1ByZXNzR2VzdHVyZUNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvKipcbiAgICogQWRkIGEgbG9uZyBwcmVzcyBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvbkxvbmdQcmVzczogKFxuICAgIGhhbmRsZXI6IChldmVudDogTG9uZ1ByZXNzRXZlbnQpID0+IHZvaWRcbiAgKSA9PiBMb25nUHJlc3NHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBsb25nIHByZXNzIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZkxvbmdQcmVzczogKFxuICAgIGhhbmRsZXI6IChldmVudDogTG9uZ1ByZXNzRXZlbnQpID0+IHZvaWRcbiAgKSA9PiBMb25nUHJlc3NHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBFbmFibGUgbG9uZyBwcmVzcyByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBlbmFibGVMb25nUHJlc3M6ICgpID0+IExvbmdQcmVzc0dlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIERpc2FibGUgbG9uZyBwcmVzcyByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBkaXNhYmxlTG9uZ1ByZXNzOiAoKSA9PiBMb25nUHJlc3NHZXN0dXJlQ29tcG9uZW50O1xufVxuXG4vKipcbiAqIEFkZHMgbG9uZyBwcmVzcyBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50LlxuICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IGFsdGVybmF0aXZlIHRvIHRoZSBmdWxsIGdlc3R1cmUgc3lzdGVtLFxuICogZm9jdXNlZCBvbmx5IG9uIGxvbmcgcHJlc3MgZGV0ZWN0aW9uLlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9iamVjdCBjb250YWluaW5nIGxvbmcgcHJlc3Mgc2V0dGluZ3NcbiAqIEByZXR1cm5zIEZ1bmN0aW9uIHRoYXQgZW5oYW5jZXMgYSBjb21wb25lbnQgd2l0aCBsb25nIHByZXNzIGNhcGFiaWxpdGllc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gQWRkIGxvbmcgcHJlc3MgZ2VzdHVyZSByZWNvZ25pdGlvbiB0byBhIGNvbXBvbmVudFxuICogY29uc3QgY29tcG9uZW50ID0gcGlwZShcbiAqICAgY3JlYXRlQmFzZSxcbiAqICAgd2l0aEVsZW1lbnQoLi4uKSxcbiAqICAgd2l0aExvbmdQcmVzc0dlc3R1cmUoe1xuICogICAgIGxvbmdQcmVzc1RpbWU6IDgwMCxcbiAqICAgICBvbkxvbmdQcmVzczogKGUpID0+IHNob3dDb250ZXh0TWVudShlLngsIGUueSlcbiAqICAgfSlcbiAqICkoY29uZmlnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgd2l0aExvbmdQcmVzc0dlc3R1cmUgPVxuICAoY29uZmlnOiBMb25nUHJlc3NHZXN0dXJlQ29uZmlnID0ge30pID0+XG4gIDxDIGV4dGVuZHMgRWxlbWVudENvbXBvbmVudD4oY29tcG9uZW50OiBDKTogQyAmIExvbmdQcmVzc0dlc3R1cmVDb21wb25lbnQgPT4ge1xuICAgIGlmICghY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJDYW5ub3QgYWRkIGxvbmcgcHJlc3MgZ2VzdHVyZSByZWNvZ25pdGlvbjogbWlzc2luZyBlbGVtZW50XCJcbiAgICAgICk7XG4gICAgICByZXR1cm4gY29tcG9uZW50IGFzIEMgJiBMb25nUHJlc3NHZXN0dXJlQ29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIGxvbmdQcmVzc1RpbWUgPSA1MDAsXG4gICAgICBtb3ZlVGhyZXNob2xkID0gMTAsXG4gICAgICBwcmV2ZW50RGVmYXVsdCA9IHRydWUsXG4gICAgICBvbkxvbmdQcmVzcyxcbiAgICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBFdmVudCBoYW5kbGVycyBzdG9yYWdlXG4gICAgY29uc3QgaGFuZGxlcnM6IFNldDwoZXZlbnQ6IExvbmdQcmVzc0V2ZW50KSA9PiB2b2lkPiA9IG5ldyBTZXQoKTtcblxuICAgIC8vIElmIGluaXRpYWwgaGFuZGxlciBwcm92aWRlZCwgYWRkIGl0XG4gICAgaWYgKG9uTG9uZ1ByZXNzKSB7XG4gICAgICBoYW5kbGVycy5hZGQob25Mb25nUHJlc3MgYXMgKGV2ZW50OiBMb25nUHJlc3NFdmVudCkgPT4gdm9pZCk7XG4gICAgfVxuXG4gICAgLy8gR2VzdHVyZSBzdGF0ZSBmb3IgdHJhY2tpbmdcbiAgICBsZXQgc3RhcnRYID0gMDtcbiAgICBsZXQgc3RhcnRZID0gMDtcbiAgICBsZXQgY3VycmVudFggPSAwO1xuICAgIGxldCBjdXJyZW50WSA9IDA7XG4gICAgbGV0IGFjdGl2ZSA9IGZhbHNlO1xuICAgIGxldCBzdGFydFRpbWUgPSAwO1xuICAgIGxldCBsb25nUHJlc3NUaW1lcjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGlzRW5hYmxlZCA9IGVuYWJsZWQ7XG5cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaCBhIGxvbmcgcHJlc3MgZXZlbnQgdG8gYWxsIGhhbmRsZXJzXG4gICAgICovXG4gICAgY29uc3QgZGlzcGF0Y2hMb25nUHJlc3MgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIC8vIENyZWF0ZSB0aGUgbG9uZyBwcmVzcyBldmVudFxuICAgICAgY29uc3QgbG9uZ1ByZXNzRXZlbnQ6IExvbmdQcmVzc0V2ZW50ID0ge1xuICAgICAgICB0eXBlOiBcImxvbmdwcmVzc1wiLFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICB0YXJnZXQ6IGUudGFyZ2V0ISxcbiAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICBlbmRUaW1lOiBEYXRlLm5vdygpLFxuICAgICAgICBkdXJhdGlvbjogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSxcbiAgICAgICAgZGVmYXVsdFByZXZlbnRlZDogZmFsc2UsXG4gICAgICAgIHByZXZlbnREZWZhdWx0OiAoKSA9PiB7XG4gICAgICAgICAgbG9uZ1ByZXNzRXZlbnQuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSxcbiAgICAgICAgeDogY3VycmVudFgsXG4gICAgICAgIHk6IGN1cnJlbnRZLFxuICAgICAgfTtcblxuICAgICAgLy8gQ2FsbCBlYWNoIGhhbmRsZXJcbiAgICAgIGhhbmRsZXJzLmZvckVhY2goKGhhbmRsZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBoYW5kbGVyKGxvbmdQcmVzc0V2ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgaW4gbG9uZyBwcmVzcyBoYW5kbGVyOlwiLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBGb3J3YXJkIHRvIGNvbXBvbmVudCdzIGV2ZW50IHN5c3RlbSBpZiBhdmFpbGFibGVcbiAgICAgIGlmIChoYXNFbWl0KGNvbXBvbmVudCkpIHtcbiAgICAgICAgY29tcG9uZW50LmVtaXQoXCJsb25ncHJlc3NcIiwgbG9uZ1ByZXNzRXZlbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBwcmV2ZW50RGVmYXVsdCBpZiBjb25maWd1cmVkXG4gICAgICBpZiAocHJldmVudERlZmF1bHQgJiYgIWxvbmdQcmVzc0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgbG9uZ1ByZXNzRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIHN0YXJ0XG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlU3RhcnQgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRvdWNoID0gXCJ0b3VjaGVzXCIgaW4gZSA/IGUudG91Y2hlc1swXSA6IGU7XG5cbiAgICAgIHN0YXJ0WCA9IGN1cnJlbnRYID0gdG91Y2guY2xpZW50WDtcbiAgICAgIHN0YXJ0WSA9IGN1cnJlbnRZID0gdG91Y2guY2xpZW50WTtcbiAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBhY3RpdmUgPSB0cnVlO1xuXG4gICAgICAvLyBDYW5jZWwgYW55IGV4aXN0aW5nIHRpbWVyXG4gICAgICBpZiAobG9uZ1ByZXNzVGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB1cCBsb25nIHByZXNzIHRpbWVyXG4gICAgICBsb25nUHJlc3NUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICAgIC8vIENoZWNrIGlmIG1vdmVtZW50IHdhcyB3aXRoaW4gdGhyZXNob2xkXG4gICAgICAgICAgY29uc3QgZGVsdGFYID0gY3VycmVudFggLSBzdGFydFg7XG4gICAgICAgICAgY29uc3QgZGVsdGFZID0gY3VycmVudFkgLSBzdGFydFk7XG4gICAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcblxuICAgICAgICAgIGlmIChkaXN0YW5jZSA8IG1vdmVUaHJlc2hvbGQpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoTG9uZ1ByZXNzKGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxvbmdQcmVzc1RpbWVyID0gbnVsbDtcbiAgICAgIH0sIGxvbmdQcmVzc1RpbWUpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgbW92ZVxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZU1vdmUgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghYWN0aXZlIHx8ICFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgdG91Y2ggPSBcInRvdWNoZXNcIiBpbiBlID8gZS50b3VjaGVzWzBdIDogZTtcblxuICAgICAgY3VycmVudFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuXG4gICAgICAvLyBDaGVjayBpZiBtb3ZlbWVudCBleGNlZWRzIHRocmVzaG9sZFxuICAgICAgY29uc3QgZGVsdGFYID0gY3VycmVudFggLSBzdGFydFg7XG4gICAgICBjb25zdCBkZWx0YVkgPSBjdXJyZW50WSAtIHN0YXJ0WTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG5cbiAgICAgIGlmIChkaXN0YW5jZSA+IG1vdmVUaHJlc2hvbGQpIHtcbiAgICAgICAgLy8gQ2FuY2VsIGxvbmcgcHJlc3MgaWYgbW92ZWQgdG9vIG11Y2hcbiAgICAgICAgaWYgKGxvbmdQcmVzc1RpbWVyICE9PSBudWxsKSB7XG4gICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICAgICAgbG9uZ1ByZXNzVGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBlbmRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVFbmQgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAobG9uZ1ByZXNzVGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICAgIGxvbmdQcmVzc1RpbWVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBjYW5jZWxcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVDYW5jZWwgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAobG9uZ1ByZXNzVGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICAgIGxvbmdQcmVzc1RpbWVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8vIEV2ZW50IGxpc3RlbmVycyBkaWN0aW9uYXJ5XG4gICAgY29uc3QgZXZlbnRMaXN0ZW5lcnM6IFJlY29yZDxzdHJpbmcsIEV2ZW50TGlzdGVuZXI+ID0ge1xuICAgICAgbW91c2Vkb3duOiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2Vtb3ZlOiBoYW5kbGVNb3ZlIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICBtb3VzZXVwOiBoYW5kbGVFbmQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNlbGVhdmU6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hzdGFydDogaGFuZGxlU3RhcnQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNobW92ZTogaGFuZGxlTW92ZSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hlbmQ6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hjYW5jZWw6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGQgZXZlbnQgbGlzdGVuZXJzIHRvIGVsZW1lbnRcbiAgICAgKi9cbiAgICBjb25zdCBzZXR1cEV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCB7XG4gICAgICAgICAgcGFzc2l2ZTogIXByZXZlbnREZWZhdWx0LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGZyb20gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHJlbW92ZUV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBTZXR1cCBsaXN0ZW5lcnMgaWYgaW5pdGlhbGx5IGVuYWJsZWRcbiAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGxpZmVjeWNsZSBpbnRlZ3JhdGlvblxuICAgIGlmIChoYXNMaWZlY3ljbGUoY29tcG9uZW50KSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95O1xuXG4gICAgICBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuXG4gICAgICAgIC8vIENsZWFyIGFueSB0aW1lcnNcbiAgICAgICAgaWYgKGxvbmdQcmVzc1RpbWVyICE9PSBudWxsKSB7XG4gICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICAgICAgbG9uZ1ByZXNzVGltZXIgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgaGFuZGxlcnNcbiAgICAgICAgaGFuZGxlcnMuY2xlYXIoKTtcblxuICAgICAgICAvLyBDYWxsIG9yaWdpbmFsIGRlc3Ryb3kgbWV0aG9kXG4gICAgICAgIG9yaWdpbmFsRGVzdHJveS5jYWxsKGNvbXBvbmVudC5saWZlY3ljbGUpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcblxuICAgICAgLyoqXG4gICAgICAgKiBBZGQgYSBsb25nIHByZXNzIGV2ZW50IGhhbmRsZXJcbiAgICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgICAgICovXG4gICAgICBvbkxvbmdQcmVzcyhoYW5kbGVyOiAoZXZlbnQ6IExvbmdQcmVzc0V2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBhIGxvbmcgcHJlc3MgZXZlbnQgaGFuZGxlclxuICAgICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIG9mZkxvbmdQcmVzcyhoYW5kbGVyOiAoZXZlbnQ6IExvbmdQcmVzc0V2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEVuYWJsZSBsb25nIHByZXNzIHJlY29nbml0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZUxvbmdQcmVzcygpIHtcbiAgICAgICAgaWYgKCFpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZSBsb25nIHByZXNzIHJlY29nbml0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVMb25nUHJlc3MoKSB7XG4gICAgICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuXG4gICAgICAgICAgLy8gQ2xlYXIgYW55IHRpbWVyc1xuICAgICAgICAgIGlmIChsb25nUHJlc3NUaW1lciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICAgICAgICBsb25nUHJlc3NUaW1lciA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvLyBzcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3Bhbi50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIEFkZHMgcGFuIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gY29tcG9uZW50c1xuICovXG5cbmltcG9ydCB0eXBlIHsgQmFzZUNvbXBvbmVudCwgRWxlbWVudENvbXBvbmVudCB9IGZyb20gXCJtdHJsXCI7XG5pbXBvcnQgeyBQYW5FdmVudCwgR2VzdHVyZUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vLi4vZ2VzdHVyZXNcIjtcbmltcG9ydCB7IGhhc0xpZmVjeWNsZSwgaGFzRW1pdCB9IGZyb20gXCJtdHJsXCI7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgcGFuIGdlc3R1cmUgZmVhdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhbkdlc3R1cmVDb25maWcge1xuICAvKipcbiAgICogV2hldGhlciB0byBwcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3JzIG9uIHRvdWNoIGV2ZW50c1xuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBwcmV2ZW50RGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIHBhbiBzdGFydCAoZmlyc3QgbW92ZW1lbnQpXG4gICAqL1xuICBvblBhblN0YXJ0PzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIHBhbiBtb3ZlIChjb250aW51b3VzIHVwZGF0ZXMgZHVyaW5nIHBhbilcbiAgICovXG4gIG9uUGFuPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIHBhbiBlbmQgKHRvdWNoL21vdXNlIHJlbGVhc2UpXG4gICAqL1xuICBvblBhbkVuZD86IEdlc3R1cmVIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBwYW4gcmVjb2duaXRpb24gaW1tZWRpYXRlbHlcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vKipcbiAqIEV4dGVuZCB0aGUgUGFuRXZlbnQgaW50ZXJmYWNlIHRvIHN1cHBvcnQgb3VyIGN1c3RvbSBldmVudCB0eXBlc1xuICovXG5pbnRlcmZhY2UgRXh0ZW5kZWRQYW5FdmVudCBleHRlbmRzIE9taXQ8UGFuRXZlbnQsIFwidHlwZVwiPiB7XG4gIHR5cGU6IFwicGFuXCIgfCBcInBhbnN0YXJ0XCIgfCBcInBhbmVuZFwiO1xufVxuXG4vKipcbiAqIENvbXBvbmVudCB3aXRoIHBhbiBnZXN0dXJlIHJlY29nbml0aW9uIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhbkdlc3R1cmVDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgZm9yIHBhbiBzdGFydFxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb25QYW5TdGFydDogKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpID0+IFBhbkdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgZm9yIHBhbiBtb3ZlIChjb250aW51b3VzIHVwZGF0ZXMpXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblBhbjogKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpID0+IFBhbkdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgZm9yIHBhbiBlbmRcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uUGFuRW5kOiAoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgcGFuIHN0YXJ0IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlBhblN0YXJ0OiAoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgcGFuIG1vdmUgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmUGFuOiAoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgcGFuIGVuZCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZQYW5FbmQ6IChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSA9PiBQYW5HZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBFbmFibGUgcGFuIHJlY29nbml0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGVuYWJsZVBhbjogKCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogRGlzYWJsZSBwYW4gcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZGlzYWJsZVBhbjogKCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBBZGRzIHBhbiBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50LlxuICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IGFsdGVybmF0aXZlIHRvIHRoZSBmdWxsIGdlc3R1cmUgc3lzdGVtLFxuICogZm9jdXNlZCBvbmx5IG9uIHBhbiBkZXRlY3Rpb24uXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0IGNvbnRhaW5pbmcgcGFuIHNldHRpbmdzXG4gKiBAcmV0dXJucyBGdW5jdGlvbiB0aGF0IGVuaGFuY2VzIGEgY29tcG9uZW50IHdpdGggcGFuIGNhcGFiaWxpdGllc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gQWRkIHBhbiBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50XG4gKiBjb25zdCBjb21wb25lbnQgPSBwaXBlKFxuICogICBjcmVhdGVCYXNlLFxuICogICB3aXRoRWxlbWVudCguLi4pLFxuICogICB3aXRoUGFuR2VzdHVyZSh7XG4gKiAgICAgb25QYW5TdGFydDogKGUpID0+IHN0YXJ0RHJhZyhlKSxcbiAqICAgICBvblBhbjogKGUpID0+IHVwZGF0ZURyYWdQb3NpdGlvbihlKSxcbiAqICAgICBvblBhbkVuZDogKGUpID0+IGVuZERyYWcoZSlcbiAqICAgfSlcbiAqICkoY29uZmlnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgd2l0aFBhbkdlc3R1cmUgPVxuICAoY29uZmlnOiBQYW5HZXN0dXJlQ29uZmlnID0ge30pID0+XG4gIDxDIGV4dGVuZHMgRWxlbWVudENvbXBvbmVudD4oY29tcG9uZW50OiBDKTogQyAmIFBhbkdlc3R1cmVDb21wb25lbnQgPT4ge1xuICAgIGlmICghY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkNhbm5vdCBhZGQgcGFuIGdlc3R1cmUgcmVjb2duaXRpb246IG1pc3NpbmcgZWxlbWVudFwiKTtcbiAgICAgIHJldHVybiBjb21wb25lbnQgYXMgQyAmIFBhbkdlc3R1cmVDb21wb25lbnQ7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCBjb25maWd1cmF0aW9uXG4gICAgY29uc3Qge1xuICAgICAgcHJldmVudERlZmF1bHQgPSB0cnVlLFxuICAgICAgb25QYW5TdGFydCxcbiAgICAgIG9uUGFuLFxuICAgICAgb25QYW5FbmQsXG4gICAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gRXZlbnQgaGFuZGxlcnMgc3RvcmFnZSBieSBwYW4gcGhhc2VcbiAgICBjb25zdCBoYW5kbGVycyA9IHtcbiAgICAgIHBhbnN0YXJ0OiBuZXcgU2V0PChldmVudDogUGFuRXZlbnQpID0+IHZvaWQ+KCksXG4gICAgICBwYW46IG5ldyBTZXQ8KGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZD4oKSxcbiAgICAgIHBhbmVuZDogbmV3IFNldDwoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkPigpLFxuICAgIH07XG5cbiAgICAvLyBBZGQgaW5pdGlhbCBoYW5kbGVycyBpZiBwcm92aWRlZFxuICAgIGlmIChvblBhblN0YXJ0KVxuICAgICAgaGFuZGxlcnMucGFuc3RhcnQuYWRkKG9uUGFuU3RhcnQgYXMgKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCk7XG4gICAgaWYgKG9uUGFuKSBoYW5kbGVycy5wYW4uYWRkKG9uUGFuIGFzIChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpO1xuICAgIGlmIChvblBhbkVuZCkgaGFuZGxlcnMucGFuZW5kLmFkZChvblBhbkVuZCBhcyAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKTtcblxuICAgIC8vIEdlc3R1cmUgc3RhdGUgZm9yIHRyYWNraW5nXG4gICAgbGV0IHN0YXJ0WCA9IDA7XG4gICAgbGV0IHN0YXJ0WSA9IDA7XG4gICAgbGV0IGxhc3RYID0gMDtcbiAgICBsZXQgbGFzdFkgPSAwO1xuICAgIGxldCBjdXJyZW50WCA9IDA7XG4gICAgbGV0IGN1cnJlbnRZID0gMDtcbiAgICBsZXQgYWN0aXZlID0gZmFsc2U7XG4gICAgbGV0IGlzUGFubmluZyA9IGZhbHNlO1xuICAgIGxldCBzdGFydFRpbWUgPSAwO1xuICAgIGxldCBpc0VuYWJsZWQgPSBlbmFibGVkO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgcGFuIGV2ZW50IHdpdGggdGhlIGN1cnJlbnQgc3RhdGVcbiAgICAgKi9cbiAgICBjb25zdCBjcmVhdGVQYW5FdmVudCA9IChcbiAgICAgIGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50LFxuICAgICAgdHlwZTogXCJwYW5zdGFydFwiIHwgXCJwYW5cIiB8IFwicGFuZW5kXCJcbiAgICApOiBFeHRlbmRlZFBhbkV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IGV2ZW50OiBFeHRlbmRlZFBhbkV2ZW50ID0ge1xuICAgICAgICB0eXBlLFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICB0YXJnZXQ6IGUudGFyZ2V0ISxcbiAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICBlbmRUaW1lOiBEYXRlLm5vdygpLFxuICAgICAgICBkdXJhdGlvbjogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSxcbiAgICAgICAgZGVmYXVsdFByZXZlbnRlZDogZmFsc2UsXG4gICAgICAgIHByZXZlbnREZWZhdWx0OiAoKSA9PiB7XG4gICAgICAgICAgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGVsdGFYOiBjdXJyZW50WCAtIHN0YXJ0WCxcbiAgICAgICAgZGVsdGFZOiBjdXJyZW50WSAtIHN0YXJ0WSxcbiAgICAgICAgc3RhcnRYLFxuICAgICAgICBzdGFydFksXG4gICAgICAgIGN1cnJlbnRYLFxuICAgICAgICBjdXJyZW50WSxcbiAgICAgIH07XG4gICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERpc3BhdGNoIGEgcGFuIGV2ZW50IHRvIGFsbCByZWdpc3RlcmVkIGhhbmRsZXJzXG4gICAgICovXG4gICAgY29uc3QgZGlzcGF0Y2hQYW4gPSAoXG4gICAgICBlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCxcbiAgICAgIHR5cGU6IFwicGFuc3RhcnRcIiB8IFwicGFuXCIgfCBcInBhbmVuZFwiXG4gICAgKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBleHRlbmRlZFBhbkV2ZW50ID0gY3JlYXRlUGFuRXZlbnQoZSwgdHlwZSk7XG5cbiAgICAgIC8vIENhbGwgZWFjaCBoYW5kbGVyIGZvciB0aGlzIHBoYXNlXG4gICAgICBoYW5kbGVyc1t0eXBlXS5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVHlwZSBhc3NlcnRpb24gZm9yIHRoZSBoYW5kbGVyIGNhbGwgLSB3ZSdyZSBkZWxpYmVyYXRlbHkgcGFzc2luZyBvdXIgZXh0ZW5kZWQgZXZlbnRcbiAgICAgICAgICBoYW5kbGVyKGV4dGVuZGVkUGFuRXZlbnQgYXMgdW5rbm93biBhcyBQYW5FdmVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgaW4gJHt0eXBlfSBoYW5kbGVyOmAsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEZvcndhcmQgdG8gY29tcG9uZW50J3MgZXZlbnQgc3lzdGVtIGlmIGF2YWlsYWJsZVxuICAgICAgaWYgKGhhc0VtaXQoY29tcG9uZW50KSkge1xuICAgICAgICBjb21wb25lbnQuZW1pdCh0eXBlLCBleHRlbmRlZFBhbkV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgcHJldmVudERlZmF1bHQgaWYgY29uZmlndXJlZFxuICAgICAgaWYgKHByZXZlbnREZWZhdWx0ICYmICFleHRlbmRlZFBhbkV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgZXh0ZW5kZWRQYW5FdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2Ugc3RhcnRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVTdGFydCA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgdG91Y2ggPSBcInRvdWNoZXNcIiBpbiBlID8gZS50b3VjaGVzWzBdIDogZTtcblxuICAgICAgc3RhcnRYID0gbGFzdFggPSBjdXJyZW50WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgICBzdGFydFkgPSBsYXN0WSA9IGN1cnJlbnRZID0gdG91Y2guY2xpZW50WTtcbiAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBhY3RpdmUgPSB0cnVlO1xuICAgICAgaXNQYW5uaW5nID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBtb3ZlXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlTW92ZSA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFhY3RpdmUgfHwgIWlzRW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0b3VjaCA9IFwidG91Y2hlc1wiIGluIGUgPyBlLnRvdWNoZXNbMF0gOiBlO1xuXG4gICAgICAvLyBVcGRhdGUgcG9zaXRpb25cbiAgICAgIGxhc3RYID0gY3VycmVudFg7XG4gICAgICBsYXN0WSA9IGN1cnJlbnRZO1xuICAgICAgY3VycmVudFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgbW92ZW1lbnQgZGVsdGFcbiAgICAgIGNvbnN0IG1vdmVEZWx0YVggPSBjdXJyZW50WCAtIGxhc3RYO1xuICAgICAgY29uc3QgbW92ZURlbHRhWSA9IGN1cnJlbnRZIC0gbGFzdFk7XG4gICAgICBjb25zdCBtb3ZlRGVsdGEgPSBNYXRoLnNxcnQoXG4gICAgICAgIG1vdmVEZWx0YVggKiBtb3ZlRGVsdGFYICsgbW92ZURlbHRhWSAqIG1vdmVEZWx0YVlcbiAgICAgICk7XG5cbiAgICAgIC8vIERldGVjdCBzaWduaWZpY2FudCBtb3ZlbWVudFxuICAgICAgaWYgKG1vdmVEZWx0YSA+IDApIHtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3Qgc2lnbmlmaWNhbnQgbW92ZW1lbnQsIHRyaWdnZXIgcGFuc3RhcnRcbiAgICAgICAgaWYgKCFpc1Bhbm5pbmcpIHtcbiAgICAgICAgICBpc1Bhbm5pbmcgPSB0cnVlO1xuICAgICAgICAgIGRpc3BhdGNoUGFuKGUsIFwicGFuc3RhcnRcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGVuIHRyaWdnZXIgdGhlIGNvbnRpbnVvdXMgcGFuIGV2ZW50XG4gICAgICAgIGRpc3BhdGNoUGFuKGUsIFwicGFuXCIpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgZW5kXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlRW5kID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWFjdGl2ZSB8fCAhaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIC8vIElmIHdlIHdlcmUgcGFubmluZywgdHJpZ2dlciB0aGUgcGFuZW5kIGV2ZW50XG4gICAgICBpZiAoaXNQYW5uaW5nKSB7XG4gICAgICAgIGRpc3BhdGNoUGFuKGUsIFwicGFuZW5kXCIpO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICAgIGlzUGFubmluZyA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgY2FuY2VsXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWFjdGl2ZSB8fCAhaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIC8vIElmIHdlIHdlcmUgcGFubmluZywgdHJpZ2dlciB0aGUgcGFuZW5kIGV2ZW50XG4gICAgICBpZiAoaXNQYW5uaW5nKSB7XG4gICAgICAgIGRpc3BhdGNoUGFuKGUsIFwicGFuZW5kXCIpO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICAgIGlzUGFubmluZyA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvLyBFdmVudCBsaXN0ZW5lcnMgZGljdGlvbmFyeVxuICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzOiBSZWNvcmQ8c3RyaW5nLCBFdmVudExpc3RlbmVyPiA9IHtcbiAgICAgIG1vdXNlZG93bjogaGFuZGxlU3RhcnQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNlbW92ZTogaGFuZGxlTW92ZSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2V1cDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICBtb3VzZWxlYXZlOiBoYW5kbGVDYW5jZWwgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNoc3RhcnQ6IGhhbmRsZVN0YXJ0IGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaG1vdmU6IGhhbmRsZU1vdmUgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNoZW5kOiBoYW5kbGVFbmQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNoY2FuY2VsOiBoYW5kbGVDYW5jZWwgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQWRkIGV2ZW50IGxpc3RlbmVycyB0byBlbGVtZW50XG4gICAgICovXG4gICAgY29uc3Qgc2V0dXBFdmVudExpc3RlbmVycyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKGV2ZW50TGlzdGVuZXJzKS5mb3JFYWNoKChbZXZlbnQsIGxpc3RlbmVyXSkgPT4ge1xuICAgICAgICBjb21wb25lbnQuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lciwge1xuICAgICAgICAgIHBhc3NpdmU6ICFwcmV2ZW50RGVmYXVsdCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGV2ZW50IGxpc3RlbmVycyBmcm9tIGVsZW1lbnRcbiAgICAgKi9cbiAgICBjb25zdCByZW1vdmVFdmVudExpc3RlbmVycyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKGV2ZW50TGlzdGVuZXJzKS5mb3JFYWNoKChbZXZlbnQsIGxpc3RlbmVyXSkgPT4ge1xuICAgICAgICBjb21wb25lbnQuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gU2V0dXAgbGlzdGVuZXJzIGlmIGluaXRpYWxseSBlbmFibGVkXG4gICAgaWYgKGlzRW5hYmxlZCkge1xuICAgICAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBsaWZlY3ljbGUgaW50ZWdyYXRpb25cbiAgICBpZiAoaGFzTGlmZWN5Y2xlKGNvbXBvbmVudCkpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IGNvbXBvbmVudC5saWZlY3ljbGUuZGVzdHJveTtcblxuICAgICAgY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAvLyBDbGVhbiB1cCBldmVudCBsaXN0ZW5lcnNcbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcblxuICAgICAgICAvLyBDbGVhciBoYW5kbGVyc1xuICAgICAgICBPYmplY3QudmFsdWVzKGhhbmRsZXJzKS5mb3JFYWNoKChoYW5kbGVyU2V0KSA9PiBoYW5kbGVyU2V0LmNsZWFyKCkpO1xuXG4gICAgICAgIC8vIENhbGwgb3JpZ2luYWwgZGVzdHJveSBtZXRob2RcbiAgICAgICAgb3JpZ2luYWxEZXN0cm95LmNhbGwoY29tcG9uZW50LmxpZmVjeWNsZSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBlbmhhbmNlZCBjb21wb25lbnRcbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tcG9uZW50LFxuXG4gICAgICAvLyBBZGQgaGFuZGxlciBtZXRob2RzXG4gICAgICBvblBhblN0YXJ0KGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMucGFuc3RhcnQuYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9uUGFuKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMucGFuLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvblBhbkVuZChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnBhbmVuZC5hZGQoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLy8gUmVtb3ZlIGhhbmRsZXIgbWV0aG9kc1xuICAgICAgb2ZmUGFuU3RhcnQoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5wYW5zdGFydC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb2ZmUGFuKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMucGFuLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvZmZQYW5FbmQoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5wYW5lbmQuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8vIEVuYWJsZS9kaXNhYmxlIG1ldGhvZHNcbiAgICAgIGVuYWJsZVBhbigpIHtcbiAgICAgICAgaWYgKCFpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIGRpc2FibGVQYW4oKSB7XG4gICAgICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvKipcbiAqIEBtb2R1bGUgY29yZS9sYXlvdXQvc2NoZW1hXG4gKiBAZGVzY3JpcHRpb24gVW5pZmllZCBsYXlvdXQgc2NoZW1hIHByb2Nlc3NvciB3aXRoIGludGVncmF0ZWQgb3B0aW1pemF0aW9uc1xuICogQ29uc29saWRhdGVzIGFycmF5LCBvYmplY3QsIEpTWCwgYW5kIHRlbXBsYXRlIHByb2Nlc3Npbmcgd2l0aCBidWlsdC1pbiBwZXJmb3JtYW5jZSBlbmhhbmNlbWVudHNcbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUWVBFUyAoRXNzZW50aWFsIG9ubHkpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0Q29uZmlnIHtcbiAgLyoqIEJhc2UgbGF5b3V0IHR5cGUgKi9cbiAgdHlwZT86IFwic3RhY2tcIiB8IFwicm93XCIgfCBcImdyaWRcIiB8IHN0cmluZztcbiAgLyoqIFNwYWNpbmcgYmV0d2VlbiBlbGVtZW50cyAqL1xuICBnYXA/OiBudW1iZXIgfCBzdHJpbmc7XG4gIC8qKiBBZGRpdGlvbmFsIENTUyBjbGFzc2VzICovXG4gIGNsYXNzPzogc3RyaW5nO1xuICAvKiogQWxpZ25tZW50IG9mIGl0ZW1zIGFsb25nIHRoZSBjcm9zcyBheGlzICovXG4gIGFsaWduPzogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgfCBcInN0cmV0Y2hcIjtcbiAgLyoqIEFsaWdubWVudCBvZiBpdGVtcyBhbG9uZyB0aGUgbWFpbiBheGlzICovXG4gIGp1c3RpZnk/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiB8IFwiYmV0d2VlblwiIHwgXCJhcm91bmRcIiB8IFwiZXZlbmx5XCI7XG4gIC8qKiBXaGV0aGVyIGFuZCBob3cgaXRlbXMgc2hvdWxkIHdyYXAgKi9cbiAgd3JhcD86IGJvb2xlYW4gfCBcInJldmVyc2VcIiB8IFwibm93cmFwXCI7XG4gIC8qKiBXaGV0aGVyIHJvdyBpdGVtcyBzaG91bGQgc3RhY2sgdmVydGljYWxseSBvbiBtb2JpbGUgKi9cbiAgbW9iaWxlU3RhY2s/OiBib29sZWFuO1xuICAvKiogV2hldGhlciByb3cgaXRlbXMgc2hvdWxkIHNjcm9sbCBob3Jpem9udGFsbHkgb24gbW9iaWxlICovXG4gIG1vYmlsZVNjcm9sbD86IGJvb2xlYW47XG4gIC8qKiBOdW1iZXIgb2YgY29sdW1ucyBvciBhdXRvbWF0aWMgc2l6aW5nIG1ldGhvZCAqL1xuICBjb2x1bW5zPzogbnVtYmVyIHwgXCJhdXRvLWZpdFwiIHwgXCJhdXRvLWZpbGxcIjtcbiAgLyoqIFdoZXRoZXIgdG8gdXNlIGRlbnNlIHBhY2tpbmcgYWxnb3JpdGhtIGZvciBncmlkICovXG4gIGRlbnNlPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgZ3JpZCBpdGVtcyBzaG91bGQgYWRqdXN0IGhlaWdodCBhdXRvbWF0aWNhbGx5ICovXG4gIGF1dG9IZWlnaHQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExheW91dEl0ZW1Db25maWcge1xuICAvKiogQ29sdW1uIHdpZHRoIGluIGEgMTItY29sdW1uIGdyaWQgKi9cbiAgd2lkdGg/OiBudW1iZXI7XG4gIC8qKiBXaWR0aCBvbiBzbWFsbCBzY3JlZW5zICovXG4gIHNtPzogbnVtYmVyO1xuICAvKiogV2lkdGggb24gbWVkaXVtIHNjcmVlbnMgKi9cbiAgbWQ/OiBudW1iZXI7XG4gIC8qKiBXaWR0aCBvbiBsYXJnZSBzY3JlZW5zICovXG4gIGxnPzogbnVtYmVyO1xuICAvKiogV2lkdGggb24gZXh0cmEtbGFyZ2Ugc2NyZWVucyAqL1xuICB4bD86IG51bWJlcjtcbiAgLyoqIE51bWJlciBvZiBncmlkIGNvbHVtbnMgdG8gc3BhbiAqL1xuICBzcGFuPzogbnVtYmVyO1xuICAvKiogTnVtYmVyIG9mIGdyaWQgcm93cyB0byBzcGFuICovXG4gIHJvd1NwYW4/OiBudW1iZXI7XG4gIC8qKiBEaXNwbGF5IG9yZGVyICovXG4gIG9yZGVyPzogbnVtYmVyIHwgXCJmaXJzdFwiIHwgXCJsYXN0XCI7XG4gIC8qKiBTZWxmLWFsaWdubWVudCB3aXRoaW4gY29udGFpbmVyICovXG4gIGFsaWduPzogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgfCBcInN0cmV0Y2hcIjtcbiAgLyoqIFdoZXRoZXIgaXRlbSBzaG91bGQgYXV0b21hdGljYWxseSBzaXplICovXG4gIGF1dG8/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExheW91dE9wdGlvbnMge1xuICAvKiogRGVmYXVsdCBjcmVhdG9yIGZ1bmN0aW9uIHRvIHVzZSBpZiBub3Qgc3BlY2lmaWVkIGluIHNjaGVtYSAqL1xuICBjcmVhdG9yPzogRnVuY3Rpb247XG4gIC8qKiBXaGV0aGVyIHRvIGFwcGx5IENTUyBjbGFzcyBwcmVmaXggQGRlZmF1bHQgdHJ1ZSAqL1xuICBwcmVmaXg/OiBib29sZWFuO1xuICAvKiogQWRkaXRpb25hbCBvcHRpb25zICovXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMYXlvdXRSZXN1bHQge1xuICAvKiogVGhlIHJhdyBsYXlvdXQgb2JqZWN0IHdpdGggYWxsIGNvbXBvbmVudHMgKi9cbiAgbGF5b3V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAvKiogUmVmZXJlbmNlIHRvIHRoZSByb290IGVsZW1lbnQgZm9yIGNvbnZlbmllbmNlICovXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgYW55O1xuICAvKiogRmxhdHRlbmVkIGNvbXBvbmVudCBtYXAgKi9cbiAgY29tcG9uZW50OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAvKiogR2V0cyBhIGNvbXBvbmVudCBieSBuYW1lICovXG4gIGdldChuYW1lOiBzdHJpbmcpOiBhbnk7XG4gIC8qKiBHZXRzIGFsbCBjb21wb25lbnRzIGluIGEgZmxhdHRlbmVkIG1hcCAqL1xuICBnZXRBbGwoKTogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgLyoqIERlc3Ryb3lzIHRoZSBsYXlvdXQsIGNsZWFuaW5nIHVwIGFsbCBjb21wb25lbnRzICovXG4gIGRlc3Ryb3koKTogdm9pZDtcbn1cblxudHlwZSBDb21wb25lbnRMaWtlID0geyBlbGVtZW50OiBIVE1MRWxlbWVudDsgW2tleTogc3RyaW5nXTogYW55IH07XG50eXBlIFNjaGVtYUl0ZW0gPSBGdW5jdGlvbiB8IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIGFueT4gfCBTY2hlbWFJdGVtW107XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJVSUxULUlOIE9QVElNSVpBVElPTlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBGcmFnbWVudCBQb29sIGZvciBlZmZpY2llbnQgRG9jdW1lbnRGcmFnbWVudCByZXVzZVxuICogUmVkdWNlcyBHQyBwcmVzc3VyZSBpbiBoaWdoLWZyZXF1ZW5jeSBsYXlvdXQgY3JlYXRpb24gc2NlbmFyaW9zXG4gKi9cbmNsYXNzIEZyYWdtZW50UG9vbCB7XG4gIHByaXZhdGUgcG9vbDogRG9jdW1lbnRGcmFnbWVudFtdID0gW107XG4gIHByaXZhdGUgbWF4U2l6ZSA9IDg7IC8vIE9wdGltaXplZCBzaXplIGZvciBtZW1vcnkgZWZmaWNpZW5jeVxuXG4gIGdldCgpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICByZXR1cm4gdGhpcy5wb29sLnBvcCgpIHx8IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgfVxuXG4gIHJlbGVhc2UoZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wb29sLmxlbmd0aCA8IHRoaXMubWF4U2l6ZSAmJiBmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5wb29sLnB1c2goZnJhZ21lbnQpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMucG9vbC5sZW5ndGggPSAwO1xuICB9XG59XG5cbmNvbnN0IGZyYWdtZW50UG9vbCA9IG5ldyBGcmFnbWVudFBvb2woKTtcblxuLyoqXG4gKiBDbGFzcyBuYW1lIGNhY2hlIGZvciBsYXlvdXQgY29uZmlndXJhdGlvbnNcbiAqIFJlZHVjZXMgc3RyaW5nIG9wZXJhdGlvbnMgYnkgY2FjaGluZyBnZW5lcmF0ZWQgY2xhc3MgbmFtZXNcbiAqL1xuY29uc3QgY2xhc3NDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbi8vIENvbmZpZ3VyYXRpb24gY29uc3RhbnRzXG5jb25zdCBQUkVGSVggPSBcIm10cmxcIjsgLy8gVE9ETzogTWFrZSB0aGlzIGNvbmZpZ3VyYWJsZVxuY29uc3QgUFJFRklYX1dJVEhfREFTSCA9IGAke1BSRUZJWH0tYDtcblxuLyoqXG4gKiBHZXRzIGEgY2FjaGVkIGNsYXNzIG5hbWUgZm9yIGxheW91dCBjb25maWd1cmF0aW9uXG4gKiBPcHRpbWl6ZWQgZm9yIGRpZmZlcmVudCBjbGFzcyBuYW1pbmcgcGF0dGVybnNcbiAqL1xuZnVuY3Rpb24gZ2V0Q2FjaGVkQ2xhc3NOYW1lKFxuICB0eXBlOiBzdHJpbmcsXG4gIHByb3BlcnR5OiBzdHJpbmcsXG4gIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIsXG4pOiBzdHJpbmcge1xuICBjb25zdCBrZXkgPSBgJHt0eXBlfS0ke3Byb3BlcnR5fS0ke3ZhbHVlfWA7XG4gIGlmICghY2xhc3NDYWNoZS5oYXMoa2V5KSkge1xuICAgIGlmICh0eXBlID09PSBcIml0ZW1cIikge1xuICAgICAgY2xhc3NDYWNoZS5zZXQoXG4gICAgICAgIGtleSxcbiAgICAgICAgcHJvcGVydHkgPT09IFwiXCJcbiAgICAgICAgICA/IGBsYXlvdXRfX2l0ZW0tLSR7dmFsdWV9YFxuICAgICAgICAgIDogYGxheW91dF9faXRlbS0tJHtwcm9wZXJ0eX0tJHt2YWx1ZX1gLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yIGxheW91dCBjbGFzc2VzLCBhbGlnbiB1c2VzIGxheW91dC0te3R5cGV9LXt2YWx1ZX1cbiAgICAgIC8vIGJ1dCBqdXN0aWZ5IGFuZCBvdGhlcnMgdXNlIGxheW91dC0te3R5cGV9LXtwcm9wZXJ0eX0te3ZhbHVlfVxuICAgICAgaWYgKHByb3BlcnR5ID09PSBcImFsaWduXCIpIHtcbiAgICAgICAgY2xhc3NDYWNoZS5zZXQoa2V5LCBgbGF5b3V0LS0ke3R5cGV9LSR7dmFsdWV9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGFzc0NhY2hlLnNldChrZXksIGBsYXlvdXQtLSR7dHlwZX0tJHtwcm9wZXJ0eX0tJHt2YWx1ZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNsYXNzQ2FjaGUuZ2V0KGtleSkhO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBPUFRJTUlaRUQgVVRJTElUSUVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgdmFsdWUgaXMgYSBjb21wb25lbnQgb2JqZWN0IChoYXMgYW4gZWxlbWVudCBwcm9wZXJ0eSlcbiAqL1xuZnVuY3Rpb24gaXNDb21wb25lbnQodmFsdWU6IGFueSk6IHZhbHVlIGlzIENvbXBvbmVudExpa2Uge1xuICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIFwiZWxlbWVudFwiIGluIHZhbHVlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkb2N1bWVudCBmcmFnbWVudCB1c2luZyBwb29saW5nIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAqL1xuZnVuY3Rpb24gY3JlYXRlRnJhZ21lbnQoKTogRG9jdW1lbnRGcmFnbWVudCB7XG4gIHJldHVybiBmcmFnbWVudFBvb2wuZ2V0KCk7XG59XG5cbi8qKlxuICogUmVsZWFzZXMgYSBmcmFnbWVudCBiYWNrIHRvIHRoZSBwb29sIGZvciByZXVzZVxuICovXG5mdW5jdGlvbiByZWxlYXNlRnJhZ21lbnQoZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpOiB2b2lkIHtcbiAgZnJhZ21lbnRQb29sLnJlbGVhc2UoZnJhZ21lbnQpO1xufVxuXG4vKipcbiAqIE9wdGltaXplZCBjbGFzcyBwcm9jZXNzaW5nIHdpdGggbWluaW1hbCBzdHJpbmcgb3BlcmF0aW9uc1xuICogSGFuZGxlcyBhcnJheXMsIHN0cmluZ3MsIGNsYXNzTmFtZSBhbGlhc2VzLCBhbmQgcmF3Q2xhc3MgZWZmaWNpZW50bHlcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0NsYXNzTmFtZXMoXG4gIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIHNraXBQcmVmaXggPSBmYWxzZSxcbik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICBpZiAoIW9wdGlvbnMpIHJldHVybiBvcHRpb25zO1xuXG4gIGNvbnN0IGhhc1Jhd0NsYXNzID0gb3B0aW9ucy5yYXdDbGFzcztcbiAgY29uc3QgaGFzUmVndWxhckNsYXNzID0gb3B0aW9ucy5jbGFzcyB8fCBvcHRpb25zLmNsYXNzTmFtZTtcblxuICAvLyBGYXN0IHBhdGg6IG5vIGNsYXNzIHByb3BlcnRpZXMgYXQgYWxsXG4gIGlmICghaGFzUmF3Q2xhc3MgJiYgIWhhc1JlZ3VsYXJDbGFzcykgcmV0dXJuIG9wdGlvbnM7XG5cbiAgLy8gRmFzdCBwYXRoOiBvbmx5IHJhd0NsYXNzIGFuZCBza2lwcGluZyBwcmVmaXggKG1vc3QgY29tbW9uIHJhd0NsYXNzIHNjZW5hcmlvKVxuICBpZiAoaGFzUmF3Q2xhc3MgJiYgIWhhc1JlZ3VsYXJDbGFzcyAmJiBza2lwUHJlZml4KSB7XG4gICAgY29uc3QgcHJvY2Vzc2VkID0geyAuLi5vcHRpb25zIH07XG4gICAgZGVsZXRlIHByb2Nlc3NlZC5yYXdDbGFzcztcblxuICAgIC8vIERpcmVjdCBhc3NpZ25tZW50IGZvciBzaW1wbGUgc3RyaW5nXG4gICAgaWYgKHR5cGVvZiBoYXNSYXdDbGFzcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcHJvY2Vzc2VkLmNsYXNzID0gaGFzUmF3Q2xhc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEhhbmRsZSBhcnJheSBjYXNlXG4gICAgICBwcm9jZXNzZWQuY2xhc3MgPSBoYXNSYXdDbGFzcy5qb2luKFwiIFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb2Nlc3NlZDtcbiAgfVxuXG4gIC8vIEZ1bGwgcHJvY2Vzc2luZyBwYXRoIChvbmx5IHdoZW4gbmVlZGVkKVxuICBjb25zdCBwcm9jZXNzZWQgPSB7IC4uLm9wdGlvbnMgfTtcbiAgbGV0IGZpbmFsQ2xhc3NlcyA9IFwiXCI7XG5cbiAgLy8gSGFuZGxlIHByZWZpeGVkIGNsYXNzZXMgb25seSBpZiBub3Qgc2tpcHBpbmcgcHJlZml4XG4gIGlmICghc2tpcFByZWZpeCAmJiBoYXNSZWd1bGFyQ2xhc3MpIHtcbiAgICBsZXQgcHJlZml4ZWRTdHJpbmcgPSBcIlwiO1xuXG4gICAgaWYgKHByb2Nlc3NlZC5jbGFzcykge1xuICAgICAgcHJlZml4ZWRTdHJpbmcgKz0gQXJyYXkuaXNBcnJheShwcm9jZXNzZWQuY2xhc3MpXG4gICAgICAgID8gcHJvY2Vzc2VkLmNsYXNzLmpvaW4oXCIgXCIpXG4gICAgICAgIDogcHJvY2Vzc2VkLmNsYXNzO1xuICAgIH1cbiAgICBpZiAocHJvY2Vzc2VkLmNsYXNzTmFtZSkge1xuICAgICAgcHJlZml4ZWRTdHJpbmcgKz0gKHByZWZpeGVkU3RyaW5nID8gXCIgXCIgOiBcIlwiKSArIHByb2Nlc3NlZC5jbGFzc05hbWU7XG4gICAgfVxuXG4gICAgaWYgKHByZWZpeGVkU3RyaW5nKSB7XG4gICAgICBmaW5hbENsYXNzZXMgPSBwcmVmaXhlZFN0cmluZ1xuICAgICAgICAuc3BsaXQoL1xccysvKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5tYXAoKGNscykgPT5cbiAgICAgICAgICBjbHMuc3RhcnRzV2l0aChQUkVGSVhfV0lUSF9EQVNIKSA/IGNscyA6IFBSRUZJWF9XSVRIX0RBU0ggKyBjbHMsXG4gICAgICAgIClcbiAgICAgICAgLmpvaW4oXCIgXCIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSByYXdDbGFzcyAoYWx3YXlzIHByb2Nlc3NlZCB3aGVuIHByZXNlbnQpXG4gIGlmIChoYXNSYXdDbGFzcykge1xuICAgIGNvbnN0IHJhd1N0cmluZyA9IEFycmF5LmlzQXJyYXkoaGFzUmF3Q2xhc3MpXG4gICAgICA/IGhhc1Jhd0NsYXNzLmZpbHRlcihCb29sZWFuKS5qb2luKFwiIFwiKVxuICAgICAgOiBoYXNSYXdDbGFzcztcblxuICAgIGZpbmFsQ2xhc3NlcyArPSAoZmluYWxDbGFzc2VzID8gXCIgXCIgOiBcIlwiKSArIHJhd1N0cmluZztcbiAgfVxuXG4gIGlmIChmaW5hbENsYXNzZXMpIHtcbiAgICBwcm9jZXNzZWQuY2xhc3MgPSBmaW5hbENsYXNzZXM7XG4gIH1cblxuICAvLyBDbGVhbiB1cCBpbiBvbmUgb3BlcmF0aW9uXG4gIGRlbGV0ZSBwcm9jZXNzZWQuY2xhc3NOYW1lO1xuICBkZWxldGUgcHJvY2Vzc2VkLnJhd0NsYXNzO1xuXG4gIHJldHVybiBwcm9jZXNzZWQ7XG59XG5cbi8qKlxuICogT3B0aW1pemVkIHBhcmFtZXRlciBleHRyYWN0aW9uIGZvciBhcnJheSBzY2hlbWFzXG4gKiBSZWR1Y2VzIG11bHRpcGxlIGFycmF5IGxvb2t1cHMgd2l0aCBiYXRjaCBwcm9jZXNzaW5nXG4gKi9cbmludGVyZmFjZSBFeHRyYWN0ZWRQYXJhbWV0ZXJzIHtcbiAgY3JlYXRvcjogRnVuY3Rpb247XG4gIG5hbWU/OiBzdHJpbmc7XG4gIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIGNvbnN1bWVkOiBudW1iZXI7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RQYXJhbWV0ZXJzKFxuICBzY2hlbWE6IFNjaGVtYUl0ZW1bXSxcbiAgc3RhcnRJbmRleDogbnVtYmVyLFxuICBkZWZhdWx0Q3JlYXRvcjogRnVuY3Rpb24sXG4pOiBFeHRyYWN0ZWRQYXJhbWV0ZXJzIHtcbiAgY29uc3QgaXRlbXMgPSBzY2hlbWEuc2xpY2Uoc3RhcnRJbmRleCwgc3RhcnRJbmRleCArIDMpO1xuICBsZXQgY3JlYXRvciwgbmFtZSwgb3B0aW9ucztcbiAgbGV0IGNvbnN1bWVkID0gMTtcblxuICBjb25zdCBbZmlyc3QsIHNlY29uZCwgdGhpcmRdID0gaXRlbXM7XG5cbiAgaWYgKHR5cGVvZiBmaXJzdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY3JlYXRvciA9IGZpcnN0O1xuICAgIGlmICh0eXBlb2Ygc2Vjb25kID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBuYW1lID0gc2Vjb25kO1xuICAgICAgY29uc3VtZWQgPSAyO1xuICAgICAgaWYgKGlzT2JqZWN0KHRoaXJkKSkge1xuICAgICAgICBvcHRpb25zID0gdGhpcmQ7XG4gICAgICAgIGNvbnN1bWVkID0gMztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHNlY29uZCkpIHtcbiAgICAgIG9wdGlvbnMgPSBzZWNvbmQ7XG4gICAgICBjb25zdW1lZCA9IDI7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBmaXJzdCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNyZWF0b3IgPSBkZWZhdWx0Q3JlYXRvcjtcbiAgICBuYW1lID0gZmlyc3Q7XG4gICAgaWYgKGlzT2JqZWN0KHNlY29uZCkpIHtcbiAgICAgIG9wdGlvbnMgPSBzZWNvbmQ7XG4gICAgICBjb25zdW1lZCA9IDI7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGZpcnN0KSkge1xuICAgIGNyZWF0b3IgPSBkZWZhdWx0Q3JlYXRvcjtcbiAgICBvcHRpb25zID0gZmlyc3Q7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNyZWF0b3I6IGNyZWF0b3IgfHwgZGVmYXVsdENyZWF0b3IsXG4gICAgbmFtZSxcbiAgICBvcHRpb25zOiAob3B0aW9ucyB8fCB7fSkgYXMgUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBjb25zdW1lZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBTaW1wbGUgb2JqZWN0IHR5cGUgY2hlY2tcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRE9NIFVUSUxJVElFUyAoU2ltcGxpZmllZClcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBTaW1wbGUgRE9NIGVsZW1lbnQgY3JlYXRpb25cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRWxlbWVudChvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30pOiBIVE1MRWxlbWVudCB7XG4gIGNvbnN0IHRhZyA9IG9wdGlvbnMudGFnIHx8IFwiZGl2XCI7XG4gIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XG5cbiAgaWYgKG9wdGlvbnMuY2xhc3MpIHtcbiAgICBlbGVtZW50LmNsYXNzTmFtZSA9IG9wdGlvbnMuY2xhc3M7XG4gIH1cblxuICBpZiAob3B0aW9ucy5zdHlsZSkge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5zdHlsZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBvcHRpb25zLnN0eWxlKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zLnN0eWxlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIG9wdGlvbnMuc3R5bGUpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRpb25zLnRleHRDb250ZW50KSB7XG4gICAgZWxlbWVudC50ZXh0Q29udGVudCA9IG9wdGlvbnMudGV4dENvbnRlbnQ7XG4gIH1cblxuICBpZiAob3B0aW9ucy50ZXh0KSB7XG4gICAgZWxlbWVudC50ZXh0Q29udGVudCA9IG9wdGlvbnMudGV4dDtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxuXG4vKipcbiAqIEFkZHMgYSBDU1MgY2xhc3MgdG8gYW4gZWxlbWVudFxuICovXG5mdW5jdGlvbiBhZGRDbGFzcyhlbGVtZW50OiBIVE1MRWxlbWVudCwgY2xhc3NOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGVsZW1lbnQgJiYgY2xhc3NOYW1lKSB7XG4gICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgZWxlbWVudCBoYXMgYSBDU1MgY2xhc3NcbiAqL1xuZnVuY3Rpb24gaGFzQ2xhc3MoZWxlbWVudDogSFRNTEVsZW1lbnQsIGNsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBlbGVtZW50ICYmIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFVOSUZJRUQgQ09NUE9ORU5UIENSRUFUSU9OICh3aXRoIGRlc3RydWN0dXJpbmcgb3B0aW1pemF0aW9uKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENyZWF0ZXMgYSBjb21wb25lbnQgaW5zdGFuY2Ugd2l0aCBvcHRpbWl6ZWQgb3B0aW9uIHByb2Nlc3NpbmdcbiAqIFVzZXMgZGVzdHJ1Y3R1cmluZyBmb3IgY2xlYW5lciBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKFxuICBDb21wb25lbnQ6IGFueSxcbiAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuKTogYW55IHtcbiAgdHJ5IHtcbiAgICAvLyBEZXN0cnVjdHVyZSBzcGVjaWFsIGNvbmZpZ3MgaW4gb25lIG9wZXJhdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIGxheW91dDogbGF5b3V0Q29uZmlnLFxuICAgICAgbGF5b3V0SXRlbTogbGF5b3V0SXRlbUNvbmZpZyxcbiAgICAgIHN0eWxlOiBzdHlsZUNvbmZpZyxcbiAgICAgIGF0dHJpYnV0ZXM6IGF0dHJpYnV0ZXNDb25maWcsXG4gICAgICBldmVudHM6IGV2ZW50c0NvbmZpZyxcbiAgICAgIGV2ZW50LCAvLyBMZWdhY3kgc3VwcG9ydFxuICAgICAgLi4uY2xlYW5PcHRpb25zXG4gICAgfSA9IG9wdGlvbnM7XG5cbiAgICAvLyBVc2UgZXZlbnRzIG92ZXIgZXZlbnQgKGV2ZW50cyBpcyBwcmVmZXJyZWQpXG4gICAgY29uc3QgZmluYWxFdmVudHNDb25maWcgPSBldmVudHNDb25maWcgfHwgZXZlbnQ7XG5cbiAgICAvLyBJZiBzdHlsZSBpcyBhIHN0cmluZywgYWx3YXlzIHBhc3MgaXQgdGhyb3VnaCB0byB0aGUgY29tcG9uZW50XG4gICAgaWYgKHN0eWxlQ29uZmlnICYmIHR5cGVvZiBzdHlsZUNvbmZpZyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY2xlYW5PcHRpb25zLnN0eWxlID0gc3R5bGVDb25maWc7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGNvbXBvbmVudFxuICAgIGNvbnN0IGlzQ2xhc3MgPVxuICAgICAgdHlwZW9mIENvbXBvbmVudCA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKENvbXBvbmVudCwgXCJwcm90b3R5cGVcIik/LndyaXRhYmxlID09PVxuICAgICAgICBmYWxzZTtcblxuICAgIGNvbnN0IGNvbXBvbmVudCA9IGlzQ2xhc3NcbiAgICAgID8gbmV3IENvbXBvbmVudChjbGVhbk9wdGlvbnMpXG4gICAgICA6IENvbXBvbmVudChjbGVhbk9wdGlvbnMpO1xuXG4gICAgLy8gQXBwbHkgY29uZmlndXJhdGlvbnMgaWYgY29tcG9uZW50IGhhcyBlbGVtZW50XG4gICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgY29uc3QgZWxlbWVudCA9XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50IHx8XG4gICAgICAgIChjb21wb25lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IGNvbXBvbmVudCA6IG51bGwpO1xuICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgLy8gQXBwbHkgbGF5b3V0IGNsYXNzZXNcbiAgICAgICAgaWYgKGxheW91dENvbmZpZykgYXBwbHlMYXlvdXRDbGFzc2VzKGVsZW1lbnQsIGxheW91dENvbmZpZyk7XG5cbiAgICAgICAgLy8gQXBwbHkgbGF5b3V0IGl0ZW0gY2xhc3Nlc1xuICAgICAgICBpZiAobGF5b3V0SXRlbUNvbmZpZykgYXBwbHlMYXlvdXRJdGVtQ2xhc3NlcyhlbGVtZW50LCBsYXlvdXRJdGVtQ29uZmlnKTtcblxuICAgICAgICAvLyBBcHBseSBzdHlsZVxuICAgICAgICBpZiAoc3R5bGVDb25maWcgJiYgdHlwZW9mIHN0eWxlQ29uZmlnID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCBzdHlsZUNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBhdHRyaWJ1dGVzXG4gICAgICAgIGlmIChhdHRyaWJ1dGVzQ29uZmlnICYmIHR5cGVvZiBhdHRyaWJ1dGVzQ29uZmlnID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlc0NvbmZpZykpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwbHkgZXZlbnRzXG4gICAgICAgIGlmIChmaW5hbEV2ZW50c0NvbmZpZyAmJiB0eXBlb2YgZmluYWxFdmVudHNDb25maWcgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaW5hbEV2ZW50c0NvbmZpZykpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZXZlbnREZWYgb2YgZmluYWxFdmVudHNDb25maWcpIHtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXZlbnREZWYpICYmIGV2ZW50RGVmLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW2V2ZW50TmFtZSwgaGFuZGxlcl0gPSBldmVudERlZjtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICB0eXBlb2YgZXZlbnROYW1lID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgICAgICB0eXBlb2YgaGFuZGxlciA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbZXZlbnROYW1lLCBoYW5kbGVyXSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgICAgICAgICAgZmluYWxFdmVudHNDb25maWcsXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBjcmVhdGluZyBjb21wb25lbnQgaW5zdGFuY2U6XCIsIGVycm9yKTtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBJTlRFR1JBVEVEIExBWU9VVCBDT05GSUdVUkFUSU9OICh3aXRoIGNhY2hpbmcpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQXBwbGllcyBsYXlvdXQgY2xhc3NlcyBiYXNlZCBvbiBjb25maWd1cmF0aW9uXG4gKiBVc2VzIGludGVncmF0ZWQgY2FjaGluZyBmb3Igb3B0aW1hbCBwZXJmb3JtYW5jZVxuICovXG5mdW5jdGlvbiBhcHBseUxheW91dENsYXNzZXMoXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICBsYXlvdXRDb25maWc6IExheW91dENvbmZpZyxcbik6IHZvaWQge1xuICBpZiAoIWVsZW1lbnQgfHwgIWxheW91dENvbmZpZykgcmV0dXJuO1xuXG4gIC8vIEFwcGx5IGJhc2UgbGF5b3V0IHR5cGVcbiAgaWYgKGxheW91dENvbmZpZy50eXBlKSB7XG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLSR7bGF5b3V0Q29uZmlnLnR5cGV9YCk7XG4gIH1cblxuICAvLyBBcHBseSBwcm9wZXJ0aWVzIHdpdGggY2FjaGluZ1xuICBjb25zdCBsYXlvdXRUeXBlID0gbGF5b3V0Q29uZmlnLnR5cGUgfHwgZ2V0TGF5b3V0VHlwZShlbGVtZW50KTtcbiAgaWYgKGxheW91dFR5cGUpIHtcbiAgICBpZiAobGF5b3V0Q29uZmlnLmdhcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgUFJFRklYX1dJVEhfREFTSCArXG4gICAgICAgICAgZ2V0Q2FjaGVkQ2xhc3NOYW1lKGxheW91dFR5cGUsIFwiZ2FwXCIsIGxheW91dENvbmZpZy5nYXApLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGxheW91dENvbmZpZy5hbGlnbikge1xuICAgICAgYWRkQ2xhc3MoXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIFBSRUZJWF9XSVRIX0RBU0ggK1xuICAgICAgICAgIGdldENhY2hlZENsYXNzTmFtZShsYXlvdXRUeXBlLCBcImFsaWduXCIsIGxheW91dENvbmZpZy5hbGlnbiksXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobGF5b3V0Q29uZmlnLmp1c3RpZnkpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICtcbiAgICAgICAgICBnZXRDYWNoZWRDbGFzc05hbWUobGF5b3V0VHlwZSwgXCJqdXN0aWZ5XCIsIGxheW91dENvbmZpZy5qdXN0aWZ5KSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gR3JpZC1zcGVjaWZpYyBwcm9wZXJ0aWVzXG4gIGlmIChsYXlvdXRDb25maWcudHlwZSA9PT0gXCJncmlkXCIgfHwgZ2V0TGF5b3V0VHlwZShlbGVtZW50KSA9PT0gXCJncmlkXCIpIHtcbiAgICBpZiAodHlwZW9mIGxheW91dENvbmZpZy5jb2x1bW5zID09PSBcIm51bWJlclwiKSB7XG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgUFJFRklYX1dJVEhfREFTSCArXG4gICAgICAgICAgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiZ3JpZFwiLCBcImNvbHNcIiwgbGF5b3V0Q29uZmlnLmNvbHVtbnMpLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGxheW91dENvbmZpZy5jb2x1bW5zID09PSBcImF1dG8tZmlsbFwiKSB7XG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcImdyaWRcIiwgXCJmaWxsXCIsIFwiYXV0b1wiKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChsYXlvdXRDb25maWcuY29sdW1ucyA9PT0gXCJhdXRvLWZpdFwiKSB7XG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcImdyaWRcIiwgXCJjb2xzXCIsIFwiYXV0by1maXRcIiksXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobGF5b3V0Q29uZmlnLmRlbnNlKVxuICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLWdyaWQtZGVuc2VgKTtcbiAgICBpZiAobGF5b3V0Q29uZmlnLmF1dG9IZWlnaHQpXG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tZ3JpZC1hdXRvLWhlaWdodGApO1xuICB9XG5cbiAgLy8gUm93LXNwZWNpZmljIHByb3BlcnRpZXNcbiAgaWYgKGxheW91dENvbmZpZy50eXBlID09PSBcInJvd1wiIHx8IGdldExheW91dFR5cGUoZWxlbWVudCkgPT09IFwicm93XCIpIHtcbiAgICBpZiAobGF5b3V0Q29uZmlnLndyYXAgPT09IGZhbHNlIHx8IGxheW91dENvbmZpZy53cmFwID09PSBcIm5vd3JhcFwiKSB7XG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tcm93LW5vd3JhcGApO1xuICAgIH0gZWxzZSBpZiAobGF5b3V0Q29uZmlnLndyYXAgPT09IFwicmV2ZXJzZVwiKSB7XG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tcm93LXdyYXAtcmV2ZXJzZWApO1xuICAgIH1cbiAgICBpZiAobGF5b3V0Q29uZmlnLm1vYmlsZVN0YWNrKVxuICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLXJvdy1tb2JpbGUtc3RhY2tgKTtcbiAgICBpZiAobGF5b3V0Q29uZmlnLm1vYmlsZVNjcm9sbClcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3ctbW9iaWxlLXNjcm9sbGApO1xuICB9XG5cbiAgLy8gQ3VzdG9tIGNsYXNzZXNcbiAgaWYgKGxheW91dENvbmZpZy5jbGFzcykge1xuICAgIGxheW91dENvbmZpZy5jbGFzc1xuICAgICAgLnNwbGl0KFwiIFwiKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLmZvckVhY2goKGNscykgPT4gZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNscykpO1xuICB9XG59XG5cbi8qKlxuICogQXBwbGllcyBsYXlvdXQgaXRlbSBjbGFzc2VzIGJhc2VkIG9uIGNvbmZpZ3VyYXRpb25cbiAqIFVzZXMgaW50ZWdyYXRlZCBjYWNoaW5nIGZvciBvcHRpbWFsIHBlcmZvcm1hbmNlXG4gKi9cbmZ1bmN0aW9uIGFwcGx5TGF5b3V0SXRlbUNsYXNzZXMoXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICBpdGVtQ29uZmlnOiBMYXlvdXRJdGVtQ29uZmlnLFxuKTogdm9pZCB7XG4gIGlmICghZWxlbWVudCB8fCAhaXRlbUNvbmZpZykgcmV0dXJuO1xuXG4gIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0X19pdGVtYCk7XG5cbiAgLy8gV2lkdGggYW5kIHJlc3BvbnNpdmUgY2xhc3NlcyB3aXRoIGNhY2hpbmdcbiAgaWYgKGl0ZW1Db25maWcud2lkdGggJiYgaXRlbUNvbmZpZy53aWR0aCA+PSAxICYmIGl0ZW1Db25maWcud2lkdGggPD0gMTIpIHtcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcIlwiLCBpdGVtQ29uZmlnLndpZHRoKSxcbiAgICApO1xuICB9XG4gIGlmIChpdGVtQ29uZmlnLnNtKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwic21cIiwgaXRlbUNvbmZpZy5zbSksXG4gICAgKTtcbiAgaWYgKGl0ZW1Db25maWcubWQpXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJtZFwiLCBpdGVtQ29uZmlnLm1kKSxcbiAgICApO1xuICBpZiAoaXRlbUNvbmZpZy5sZylcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcImxnXCIsIGl0ZW1Db25maWcubGcpLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLnhsKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwieGxcIiwgaXRlbUNvbmZpZy54bCksXG4gICAgKTtcblxuICAvLyBHcmlkIHNwYW4gY2xhc3Nlc1xuICBpZiAoaXRlbUNvbmZpZy5zcGFuKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwic3BhblwiLCBpdGVtQ29uZmlnLnNwYW4pLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLnJvd1NwYW4pXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArXG4gICAgICAgIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJyb3ctc3BhblwiLCBpdGVtQ29uZmlnLnJvd1NwYW4pLFxuICAgICk7XG5cbiAgLy8gT3JkZXIgYW5kIGFsaWdubWVudFxuICBpZiAoaXRlbUNvbmZpZy5vcmRlcilcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcIm9yZGVyXCIsIGl0ZW1Db25maWcub3JkZXIpLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLmFsaWduKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwic2VsZlwiLCBpdGVtQ29uZmlnLmFsaWduKSxcbiAgICApO1xuICBpZiAoaXRlbUNvbmZpZy5hdXRvKVxuICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0X19pdGVtLS1hdXRvYCk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgbGF5b3V0IHR5cGUgZnJvbSBlbGVtZW50IGNsYXNzZXNcbiAqL1xuZnVuY3Rpb24gZ2V0TGF5b3V0VHlwZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IHN0cmluZyB7XG4gIHJldHVybiBoYXNDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tc3RhY2tgKVxuICAgID8gXCJzdGFja1wiXG4gICAgOiBoYXNDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tcm93YClcbiAgICAgID8gXCJyb3dcIlxuICAgICAgOiBoYXNDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tZ3JpZGApXG4gICAgICAgID8gXCJncmlkXCJcbiAgICAgICAgOiBcIlwiO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBVTklGSUVEIFNDSEVNQSBQUk9DRVNTT1JTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUHJvY2Vzc2VzIGFycmF5LWJhc2VkIHNjaGVtYSBkZWZpbml0aW9uc1xuICogT3B0aW1pemVkIHdpdGggcGFyYW1ldGVyIGV4dHJhY3Rpb24gYW5kIGludGVncmF0ZWQgY29uZmlndXJhdGlvblxuICovXG5mdW5jdGlvbiBwcm9jZXNzQXJyYXlTY2hlbWEoXG4gIHNjaGVtYTogU2NoZW1hSXRlbVtdIHwgYW55LFxuICBwYXJlbnRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsLFxuICBsZXZlbDogbnVtYmVyID0gMCxcbiAgb3B0aW9uczogTGF5b3V0T3B0aW9ucyA9IHt9LFxuKTogTGF5b3V0UmVzdWx0IHtcbiAgbGV2ZWwrKztcbiAgY29uc3QgbGF5b3V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIGNvbnN0IGNvbXBvbmVudHM6IEFycmF5PFtzdHJpbmcsIGFueV0+ID0gW107XG4gIGNvbnN0IGZyYWdtZW50ID0gY3JlYXRlRnJhZ21lbnQoKTtcbiAgbGV0IGNvbXBvbmVudCA9IG51bGw7XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KHNjaGVtYSkpIHtcbiAgICByZXR1cm4gY3JlYXRlTGF5b3V0UmVzdWx0KGxheW91dCk7XG4gIH1cblxuICBjb25zdCBkZWZhdWx0Q3JlYXRvciA9IChvcHRpb25zIGFzIGFueSkuY3JlYXRvciB8fCBjcmVhdGVFbGVtZW50O1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgaXRlbSA9IHNjaGVtYVtpXTtcbiAgICBpZiAoIWl0ZW0pIGNvbnRpbnVlO1xuXG4gICAgLy8gSGFuZGxlIG5lc3RlZCBhcnJheXNcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gY29tcG9uZW50IHx8IHBhcmVudEVsZW1lbnQ7XG4gICAgICBjb25zdCByZXN1bHQgPSBwcm9jZXNzQXJyYXlTY2hlbWEoaXRlbSwgY29udGFpbmVyLCBsZXZlbCwgb3B0aW9ucyk7XG4gICAgICAvLyBNZXJnZSBuZXN0ZWQgY29tcG9uZW50cyBhcnJheSBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQubGF5b3V0LmNvbXBvbmVudHMpKSB7XG4gICAgICAgIGNvbXBvbmVudHMucHVzaCguLi5yZXN1bHQubGF5b3V0LmNvbXBvbmVudHMpO1xuICAgICAgICBkZWxldGUgcmVzdWx0LmxheW91dC5jb21wb25lbnRzO1xuICAgICAgfVxuICAgICAgT2JqZWN0LmFzc2lnbihsYXlvdXQsIHJlc3VsdC5sYXlvdXQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gVXNlIG9wdGltaXplZCBwYXJhbWV0ZXIgZXh0cmFjdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIGNyZWF0b3IsXG4gICAgICBuYW1lLFxuICAgICAgb3B0aW9uczogaXRlbU9wdGlvbnMsXG4gICAgICBjb25zdW1lZCxcbiAgICB9ID0gZXh0cmFjdFBhcmFtZXRlcnMoc2NoZW1hLCBpLCBkZWZhdWx0Q3JlYXRvcik7XG5cbiAgICBpZiAoIWNyZWF0b3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIlNraXBwaW5nIHVuc3VwcG9ydGVkIGl0ZW0gdHlwZTpcIiwgaXRlbSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IHRvIGRpdiBmb3IgY3JlYXRlRWxlbWVudFxuICAgIGlmIChjcmVhdG9yID09PSBjcmVhdGVFbGVtZW50ICYmICEoXCJ0YWdcIiBpbiBpdGVtT3B0aW9ucykpIHtcbiAgICAgIGl0ZW1PcHRpb25zLnRhZyA9IFwiZGl2XCI7XG4gICAgfVxuXG4gICAgLy8gQWR2YW5jZSBpbmRleCBieSBjb25zdW1lZCBpdGVtcyBtaW51cyAxIChsb29wIGluY3JlbWVudCBoYW5kbGVzIHRoZSArMSlcbiAgICBpICs9IGNvbnN1bWVkIC0gMTtcblxuICAgIC8vIFByb2Nlc3Mgb3B0aW9ucyB3aXRoIHByZWZpeCAtIG9wdGltaXplZCBkZWNpc2lvbiBsb2dpY1xuICAgIGNvbnN0IHNob3VsZEFwcGx5UHJlZml4ID1cbiAgICAgIFwicHJlZml4XCIgaW4gaXRlbU9wdGlvbnMgPyBpdGVtT3B0aW9ucy5wcmVmaXggOiBvcHRpb25zLnByZWZpeCAhPT0gZmFsc2U7XG5cbiAgICAvLyBGYXN0IHBhdGg6IHByb2Nlc3Mgb25seSB3aGVuIG5lZWRlZFxuICAgIGNvbnN0IHByb2Nlc3NlZE9wdGlvbnMgPVxuICAgICAgc2hvdWxkQXBwbHlQcmVmaXggfHwgaXRlbU9wdGlvbnMucmF3Q2xhc3NcbiAgICAgICAgPyBwcm9jZXNzQ2xhc3NOYW1lcyhpdGVtT3B0aW9ucywgIXNob3VsZEFwcGx5UHJlZml4KVxuICAgICAgICA6IGl0ZW1PcHRpb25zOyAvLyBObyBjb3B5IG5lZWRlZCBpZiBubyBwcm9jZXNzaW5nXG5cbiAgICAvLyBBZGQgbmFtZSB0byBvcHRpb25zIGlmIG5lZWRlZFxuICAgIGlmIChcbiAgICAgIG5hbWUgJiZcbiAgICAgICEoXCJuYW1lXCIgaW4gcHJvY2Vzc2VkT3B0aW9ucykgJiZcbiAgICAgICEoY3JlYXRvciA9PT0gY3JlYXRlRWxlbWVudCB8fCAoY3JlYXRvciBhcyBhbnkpLmlzRWxlbWVudClcbiAgICApIHtcbiAgICAgIHByb2Nlc3NlZE9wdGlvbnMubmFtZSA9IG5hbWU7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGNvbXBvbmVudFxuICAgIGNvbXBvbmVudCA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGNyZWF0b3IsIHByb2Nlc3NlZE9wdGlvbnMpO1xuICAgIGNvbnN0IGVsZW1lbnQgPSBpc0NvbXBvbmVudChjb21wb25lbnQpID8gY29tcG9uZW50LmVsZW1lbnQgOiBjb21wb25lbnQ7XG5cbiAgICBpZiAobGV2ZWwgPT09IDEpIGxheW91dC5lbGVtZW50ID0gZWxlbWVudDtcbiAgICBpZiAobmFtZSkge1xuICAgICAgbGF5b3V0W25hbWVdID0gY29tcG9uZW50O1xuICAgICAgY29tcG9uZW50cy5wdXNoKFtuYW1lLCBjb21wb25lbnRdKTtcbiAgICB9XG5cbiAgICAvLyBBcHBlbmQgdG8gRE9NXG4gICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgaWYgKFwiaW5zZXJ0XCIgaW4gY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQuaW5zZXJ0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY29tcG9uZW50Lmluc2VydChmcmFnbWVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgY29tcG9uZW50Ll9jb250YWluZXIgPSBwYXJlbnRFbGVtZW50O1xuICAgICAgICBpZiAoXG4gICAgICAgICAgXCJvbkluc2VydGVkXCIgaW4gY29tcG9uZW50ICYmXG4gICAgICAgICAgdHlwZW9mIGNvbXBvbmVudC5vbkluc2VydGVkID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29tcG9uZW50Lm9uSW5zZXJ0ZWQocGFyZW50RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBBcHBlbmQgZnJhZ21lbnQgdG8gcGFyZW50XG4gIGlmIChwYXJlbnRFbGVtZW50ICYmIGZyYWdtZW50Lmhhc0NoaWxkTm9kZXMoKSkge1xuICAgIGNvbnN0IHdyYXBwZXIgPSBpc0NvbXBvbmVudChwYXJlbnRFbGVtZW50KVxuICAgICAgPyBwYXJlbnRFbGVtZW50LmVsZW1lbnRcbiAgICAgIDogcGFyZW50RWxlbWVudDtcbiAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGZyYWdtZW50KTtcbiAgfVxuXG4gIC8vIFJlbGVhc2UgZnJhZ21lbnQgYmFjayB0byBwb29sXG4gIHJlbGVhc2VGcmFnbWVudChmcmFnbWVudCk7XG5cbiAgbGF5b3V0LmNvbXBvbmVudHMgPSBjb21wb25lbnRzO1xuICByZXR1cm4gY3JlYXRlTGF5b3V0UmVzdWx0KGxheW91dCk7XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIG9iamVjdC1iYXNlZCBzY2hlbWEgZGVmaW5pdGlvbnNcbiAqIFNpbXBsaWZpZWQgYW5kIG9wdGltaXplZCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NPYmplY3RTY2hlbWEoXG4gIHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB8IHN0cmluZyxcbiAgcGFyZW50RWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbCxcbiAgb3B0aW9uczogTGF5b3V0T3B0aW9ucyA9IHt9LFxuKTogTGF5b3V0UmVzdWx0IHtcbiAgY29uc3QgbGF5b3V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIGNvbnN0IGRlZmF1bHRDcmVhdG9yID0gb3B0aW9ucy5jcmVhdG9yIHx8IGNyZWF0ZUVsZW1lbnQ7XG5cbiAgLy8gSGFuZGxlIHJvb3QgZWxlbWVudCBjcmVhdGlvblxuICBpZiAoKHNjaGVtYSBhcyBhbnkpLmVsZW1lbnQgJiYgIXBhcmVudEVsZW1lbnQpIHtcbiAgICBjb25zdCBlbGVtZW50RGVmID0gKHNjaGVtYSBhcyBhbnkpLmVsZW1lbnQ7XG4gICAgY29uc3QgY3JlYXRlRWxlbWVudEZuID0gZWxlbWVudERlZi5jcmVhdG9yIHx8IGRlZmF1bHRDcmVhdG9yO1xuXG4gICAgY29uc3QgZWxlbWVudE9wdGlvbnMgPSBlbGVtZW50RGVmLm9wdGlvbnMgfHwge307XG4gICAgY29uc3QgcHJvY2Vzc2VkT3B0aW9ucyA9XG4gICAgICBvcHRpb25zLnByZWZpeCAhPT0gZmFsc2VcbiAgICAgICAgPyBwcm9jZXNzQ2xhc3NOYW1lcyhlbGVtZW50T3B0aW9ucylcbiAgICAgICAgOiB7IC4uLmVsZW1lbnRPcHRpb25zIH07XG5cbiAgICBjb25zdCByb290Q29tcG9uZW50ID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoXG4gICAgICBjcmVhdGVFbGVtZW50Rm4sXG4gICAgICBwcm9jZXNzZWRPcHRpb25zLFxuICAgICk7XG4gICAgbGF5b3V0LmVsZW1lbnQgPSByb290Q29tcG9uZW50O1xuICAgIGlmIChlbGVtZW50RGVmLm5hbWUpIGxheW91dFtlbGVtZW50RGVmLm5hbWVdID0gcm9vdENvbXBvbmVudDtcblxuICAgIC8vIFByb2Nlc3MgY2hpbGRyZW5cbiAgICBpZiAoZWxlbWVudERlZi5jaGlsZHJlbikge1xuICAgICAgY29uc3Qgcm9vdEVsZW1lbnQgPSBpc0NvbXBvbmVudChyb290Q29tcG9uZW50KVxuICAgICAgICA/IHJvb3RDb21wb25lbnQuZWxlbWVudFxuICAgICAgICA6IHJvb3RDb21wb25lbnQ7XG4gICAgICBjb25zdCBjaGlsZFJlc3VsdCA9IHByb2Nlc3NPYmplY3RTY2hlbWEoXG4gICAgICAgIGVsZW1lbnREZWYuY2hpbGRyZW4sXG4gICAgICAgIHJvb3RFbGVtZW50LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5hc3NpZ24obGF5b3V0LCBjaGlsZFJlc3VsdC5sYXlvdXQpO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbiAgfVxuXG4gIC8vIFByb2Nlc3Mgbm9ybWFsIHNjaGVtYSBlbGVtZW50c1xuICBjb25zdCBmcmFnbWVudCA9IHBhcmVudEVsZW1lbnQgPyBjcmVhdGVGcmFnbWVudCgpIDogbnVsbDtcblxuICBmb3IgKGNvbnN0IGtleSBpbiBzY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIGNvbnN0IGRlZiA9IChzY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgYW55Pilba2V5XTtcbiAgICBpZiAoIWRlZikgY29udGludWU7XG5cbiAgICBjb25zdCBlbGVtZW50Q3JlYXRvciA9IGRlZi5jcmVhdG9yIHx8IGRlZmF1bHRDcmVhdG9yO1xuICAgIGNvbnN0IGVsZW1lbnRPcHRpb25zID0gZGVmLm9wdGlvbnMgfHwge307XG4gICAgY29uc3Qgc2hvdWxkQXBwbHlQcmVmaXggPVxuICAgICAgXCJwcmVmaXhcIiBpbiBlbGVtZW50T3B0aW9uc1xuICAgICAgICA/IGVsZW1lbnRPcHRpb25zLnByZWZpeFxuICAgICAgICA6IG9wdGlvbnMucHJlZml4ICE9PSBmYWxzZTtcbiAgICBjb25zdCBwcm9jZXNzZWRPcHRpb25zID0gc2hvdWxkQXBwbHlQcmVmaXhcbiAgICAgID8gcHJvY2Vzc0NsYXNzTmFtZXMoZWxlbWVudE9wdGlvbnMpXG4gICAgICA6IHsgLi4uZWxlbWVudE9wdGlvbnMgfTtcblxuICAgIGlmICghZGVmLm5hbWUgJiYga2V5ICE9PSBcImVsZW1lbnRcIikge1xuICAgICAgZGVmLm5hbWUgPSBrZXk7XG4gICAgfVxuXG4gICAgY29uc3QgY3JlYXRlZCA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGVsZW1lbnRDcmVhdG9yLCBwcm9jZXNzZWRPcHRpb25zKTtcbiAgICBsYXlvdXRba2V5XSA9IGNyZWF0ZWQ7XG4gICAgaWYgKGRlZi5uYW1lICYmIGRlZi5uYW1lICE9PSBrZXkpIGxheW91dFtkZWYubmFtZV0gPSBjcmVhdGVkO1xuXG4gICAgY29uc3QgZWxlbWVudCA9IGlzQ29tcG9uZW50KGNyZWF0ZWQpID8gY3JlYXRlZC5lbGVtZW50IDogY3JlYXRlZDtcbiAgICBpZiAoZnJhZ21lbnQpIGZyYWdtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuXG4gICAgLy8gUHJvY2VzcyBjaGlsZHJlblxuICAgIGlmIChkZWYuY2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IGNoaWxkUmVzdWx0ID0gcHJvY2Vzc09iamVjdFNjaGVtYShkZWYuY2hpbGRyZW4sIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgT2JqZWN0LmFzc2lnbihsYXlvdXQsIGNoaWxkUmVzdWx0LmxheW91dCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQXBwZW5kIHRvIHBhcmVudFxuICBpZiAocGFyZW50RWxlbWVudCAmJiBmcmFnbWVudCkge1xuICAgIGNvbnN0IHBhcmVudERvbSA9IGlzQ29tcG9uZW50KHBhcmVudEVsZW1lbnQpXG4gICAgICA/IHBhcmVudEVsZW1lbnQuZWxlbWVudFxuICAgICAgOiBwYXJlbnRFbGVtZW50O1xuICAgIHBhcmVudERvbS5hcHBlbmRDaGlsZChmcmFnbWVudCk7XG4gICAgcmVsZWFzZUZyYWdtZW50KGZyYWdtZW50KTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gTEFZT1VUIFJFU1VMVCBDUkVBVElPTlxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEZsYXR0ZW5zIGEgbmVzdGVkIGxheW91dCBpbnRvIGEgc2ltcGxlIG9iamVjdCB3aXRoIGVsZW1lbnQgYW5kIGNvbXBvbmVudCByZWZlcmVuY2VzXG4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW5MYXlvdXQobGF5b3V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIGNvbnN0IGZsYXR0ZW5lZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gIGlmICghbGF5b3V0IHx8IHR5cGVvZiBsYXlvdXQgIT09IFwib2JqZWN0XCIpIHJldHVybiBmbGF0dGVuZWQ7XG5cbiAgZm9yIChjb25zdCBrZXkgaW4gbGF5b3V0KSB7XG4gICAgY29uc3QgdmFsdWUgPSBsYXlvdXRba2V5XTtcbiAgICBpZiAoXG4gICAgICB2YWx1ZSAmJlxuICAgICAgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICh2YWx1ZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8XG4gICAgICAgICh0eXBlb2YgU1ZHRWxlbWVudCAhPT0gXCJ1bmRlZmluZWRcIiAmJiB2YWx1ZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpIHx8XG4gICAgICAgIGlzQ29tcG9uZW50KHZhbHVlKSlcbiAgICApIHtcbiAgICAgIGZsYXR0ZW5lZFtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZsYXR0ZW5lZDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbGF5b3V0IHJlc3VsdCBvYmplY3Qgd2l0aCB1dGlsaXR5IGZ1bmN0aW9uc1xuICovXG5mdW5jdGlvbiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogTGF5b3V0UmVzdWx0IHtcbiAgY29uc3QgZmxhdHRlbmVkQ29tcG9uZW50cyA9IGZsYXR0ZW5MYXlvdXQobGF5b3V0KTtcblxuICByZXR1cm4ge1xuICAgIGxheW91dCxcbiAgICBlbGVtZW50OiBsYXlvdXQuZWxlbWVudCxcbiAgICBjb21wb25lbnQ6IGZsYXR0ZW5lZENvbXBvbmVudHMsXG5cbiAgICBnZXQobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICAgIHJldHVybiBsYXlvdXRbbmFtZV0gPz8gbnVsbDtcbiAgICB9LFxuXG4gICAgZ2V0QWxsKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgcmV0dXJuIGZsYXR0ZW5lZENvbXBvbmVudHM7XG4gICAgfSxcblxuICAgIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAvLyBUcmFjayBkZXN0cm95ZWQgY29tcG9uZW50cyB0byBhdm9pZCBkb3VibGUtZGVzdHJveVxuICAgICAgY29uc3QgZGVzdHJveWVkID0gbmV3IFNldDxhbnk+KCk7XG5cbiAgICAgIC8vIEhlbHBlciB0byBzYWZlbHkgZGVzdHJveSBhIGNvbXBvbmVudFxuICAgICAgY29uc3QgZGVzdHJveUNvbXBvbmVudCA9IChjb21wb25lbnQ6IGFueSk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoIWNvbXBvbmVudCB8fCBkZXN0cm95ZWQuaGFzKGNvbXBvbmVudCkpIHJldHVybjtcblxuICAgICAgICAvLyBTa2lwIHBsYWluIEhUTUwgZWxlbWVudHMgYW5kIG5vbi1vYmplY3RzXG4gICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCB0eXBlb2YgY29tcG9uZW50ICE9PSBcIm9iamVjdFwiKVxuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAvLyBDaGVjayBpZiBpdCdzIGEgY29tcG9uZW50IHdpdGggZGVzdHJveSBtZXRob2RcbiAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgZGVzdHJveWVkLmFkZChjb21wb25lbnQpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21wb25lbnQuZGVzdHJveSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBkZXN0cm95IGVycm9ycyAtIGNvbXBvbmVudCBtYXkgYWxyZWFkeSBiZSBjbGVhbmVkIHVwXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBGaXJzdCBkZXN0cm95IGNvbXBvbmVudHMgZnJvbSB0aGUgY29tcG9uZW50cyBhcnJheSAoaWYgcHJlc2VudClcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBhbGwgbmFtZWQgY29tcG9uZW50cyBhcmUgZGVzdHJveWVkIGV2ZW4gaWYgbmVzdGVkXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShsYXlvdXQuY29tcG9uZW50cykpIHtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgY29tcG9uZW50XSBvZiBsYXlvdXQuY29tcG9uZW50cykge1xuICAgICAgICAgIGRlc3Ryb3lDb21wb25lbnQoY29tcG9uZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGVuIGl0ZXJhdGUgb3ZlciBhbGwgbGF5b3V0IGtleXMgZm9yIGFueSBtaXNzZWQgY29tcG9uZW50c1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gbGF5b3V0KSB7XG4gICAgICAgIGlmIChrZXkgPT09IFwiZWxlbWVudFwiIHx8IGtleSA9PT0gXCJjb21wb25lbnRzXCIpIGNvbnRpbnVlO1xuICAgICAgICBkZXN0cm95Q29tcG9uZW50KGxheW91dFtrZXldKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYXIgdGhlIGNvbXBvbmVudHMgYXJyYXlcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGxheW91dC5jb21wb25lbnRzKSkge1xuICAgICAgICBsYXlvdXQuY29tcG9uZW50cy5sZW5ndGggPSAwO1xuICAgICAgfVxuXG4gICAgICAvLyBSZW1vdmUgcm9vdCBlbGVtZW50IGZyb20gRE9NXG4gICAgICBpZiAobGF5b3V0LmVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGlzQ29tcG9uZW50KGxheW91dC5lbGVtZW50KVxuICAgICAgICAgID8gbGF5b3V0LmVsZW1lbnQuZWxlbWVudFxuICAgICAgICAgIDogbGF5b3V0LmVsZW1lbnQ7XG4gICAgICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDbGVhciByZWZlcmVuY2VzIHRvIGhlbHAgR0NcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGxheW91dCkge1xuICAgICAgICBkZWxldGUgbGF5b3V0W2tleV07XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVU5JRklFRCBFTlRSWSBQT0lOVFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsYXlvdXQgZnJvbSB2YXJpb3VzIHNjaGVtYSBmb3JtYXRzXG4gKiBVbmlmaWVkIHByb2Nlc3NvciBmb3IgYXJyYXlzLCBvYmplY3RzLCBKU1gsIGFuZCBIVE1MIHN0cmluZ3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxheW91dChcbiAgc2NoZW1hOiBhbnksXG4gIHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGwsXG4gIG9wdGlvbnM6IExheW91dE9wdGlvbnMgPSB7fSxcbik6IExheW91dFJlc3VsdCB7XG4gIC8vIEhhbmRsZSBmdW5jdGlvbiBzY2hlbWFzXG4gIGlmICh0eXBlb2Ygc2NoZW1hID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBzY2hlbWEgPSBzY2hlbWEoKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBIVE1MIHN0cmluZyBzY2hlbWFzXG4gIGlmICh0eXBlb2Ygc2NoZW1hID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG4gICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gc2NoZW1hLnRyaW0oKTtcbiAgICBjb25zdCBmcmFnbWVudCA9IHRlbXBsYXRlLmNvbnRlbnQ7XG5cbiAgICBpZiAocGFyZW50RWxlbWVudCAmJiBmcmFnbWVudC5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICAgIHBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IGxheW91dCA9IHsgZWxlbWVudDogZnJhZ21lbnQuZmlyc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQgfTtcbiAgICByZXR1cm4gY3JlYXRlTGF5b3V0UmVzdWx0KGxheW91dCk7XG4gIH1cblxuICAvLyBIYW5kbGUgSlNYLWxpa2Ugc2NoZW1hcyAoYXJyYXkgd2l0aCBmdW5jdGlvbiwgc3RyaW5nLCBvYmplY3QgcGF0dGVybilcbiAgaWYgKFxuICAgIEFycmF5LmlzQXJyYXkoc2NoZW1hKSAmJlxuICAgIHNjaGVtYS5sZW5ndGggPj0gMyAmJlxuICAgIHR5cGVvZiBzY2hlbWFbMF0gPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIHR5cGVvZiBzY2hlbWFbMV0gPT09IFwic3RyaW5nXCIgJiZcbiAgICBpc09iamVjdChzY2hlbWFbMl0pXG4gICkge1xuICAgIHJldHVybiBwcm9jZXNzQXJyYXlTY2hlbWEoc2NoZW1hLCBwYXJlbnRFbGVtZW50LCAwLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8vIFJvdXRlIHRvIGFwcHJvcHJpYXRlIHByb2Nlc3NvclxuICByZXR1cm4gQXJyYXkuaXNBcnJheShzY2hlbWEpXG4gICAgPyBwcm9jZXNzQXJyYXlTY2hlbWEoc2NoZW1hLCBwYXJlbnRFbGVtZW50LCAwLCBvcHRpb25zKVxuICAgIDogcHJvY2Vzc09iamVjdFNjaGVtYShzY2hlbWEsIHBhcmVudEVsZW1lbnQsIG9wdGlvbnMpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFWFBPUlRTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIENsZWFyIGZ1bmN0aW9ucyBmb3IgdGhlIHVuaWZpZWQgc3lzdGVtXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJDbGFzc0NhY2hlKCk6IHZvaWQge1xuICBjbGFzc0NhY2hlLmNsZWFyKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckZyYWdtZW50UG9vbCgpOiB2b2lkIHtcbiAgZnJhZ21lbnRQb29sLmNsZWFyKCk7XG59XG5cbmV4cG9ydCB7XG4gIHByb2Nlc3NDbGFzc05hbWVzLFxuICBpc0NvbXBvbmVudCxcbiAgZmxhdHRlbkxheW91dCxcbiAgYXBwbHlMYXlvdXRDbGFzc2VzLFxuICBhcHBseUxheW91dEl0ZW1DbGFzc2VzLFxuICBjcmVhdGVMYXlvdXRSZXN1bHQsXG59O1xuIiwKICAgICIvKipcbiAqIEBtb2R1bGUgY29yZS9sYXlvdXQvY29uZmlnXG4gKiBAZGVzY3JpcHRpb24gRXNzZW50aWFsIGxheW91dCBjb25maWd1cmF0aW9uIHV0aWxpdGllc1xuICogQ29yZSBmdW5jdGlvbmFsaXR5IGlzIGludGVncmF0ZWQgaW50byBzY2hlbWEudHMgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICovXG5cbi8vIENvbmZpZ3VyYXRpb24gY29uc3RhbnRzXG5jb25zdCBQUkVGSVggPSBcIm10cmxcIjsgLy8gVE9ETzogTWFrZSB0aGlzIGNvbmZpZ3VyYWJsZSBmcm9tIG1haW4gbXRybCBjb25maWdcbmNvbnN0IFBSRUZJWF9XSVRIX0RBU0ggPSBgJHtQUkVGSVh9LWA7XG5cbi8qKlxuICogU2ltcGxlIERPTSB1dGlsaXRpZXNcbiAqL1xuZnVuY3Rpb24gYWRkQ2xhc3MoZWxlbWVudDogYW55LCBjbGFzc05hbWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZWxlbWVudCAmJiBjbGFzc05hbWUgJiYgZWxlbWVudC5jbGFzc0xpc3QpIHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNDbGFzcyhlbGVtZW50OiBhbnksIGNsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBlbGVtZW50ICYmIGVsZW1lbnQuY2xhc3NMaXN0ICYmIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSk7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGNsZWFuIHVwIHByZXZpb3VzIGxheW91dCBjbGFzc2VzIGZyb20gYW4gZWxlbWVudFxuICogVXNlZnVsIGZvciBkeW5hbWljIGNsYXNzIG1hbmFnZW1lbnRcbiAqXG4gKiBAcGFyYW0gZWxlbWVudCAtIEVsZW1lbnQgdG8gY2xlYW4gbGF5b3V0IGNsYXNzZXMgZnJvbVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYW51cExheW91dENsYXNzZXMoZWxlbWVudDogYW55KTogdm9pZCB7XG4gIGlmICghZWxlbWVudCB8fCAhZWxlbWVudC5jbGFzc0xpc3QpIHJldHVybjtcblxuICAvLyBHZXQgYWxsIGNsYXNzZXMgZnJvbSB0aGUgZWxlbWVudFxuICBjb25zdCBjbGFzc0xpc3QgPSBBcnJheS5mcm9tKGVsZW1lbnQuY2xhc3NMaXN0KSBhcyBzdHJpbmdbXTtcblxuICAvLyBGaW5kIGFuZCByZW1vdmUgbGF5b3V0LXJlbGF0ZWQgY2xhc3Nlc1xuICBjb25zdCBsYXlvdXRDbGFzc2VzID0gY2xhc3NMaXN0LmZpbHRlcihcbiAgICAoY2xzOiBzdHJpbmcpID0+XG4gICAgICBjbHMuc3RhcnRzV2l0aChgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tYCkgfHxcbiAgICAgIGNscy5pbmNsdWRlcyhgLSR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLWApXG4gICk7XG5cbiAgLy8gUmVtb3ZlIGVhY2ggbGF5b3V0IGNsYXNzXG4gIGxheW91dENsYXNzZXMuZm9yRWFjaCgoY2xzOiBzdHJpbmcpID0+IHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoY2xzKTtcbiAgfSk7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgbGF5b3V0IHR5cGUgZnJvbSBlbGVtZW50IGNsYXNzZXNcbiAqXG4gKiBAcGFyYW0gZWxlbWVudCAtIEVsZW1lbnQgdG8gY2hlY2tcbiAqIEByZXR1cm5zIExheW91dCB0eXBlIGlmIGZvdW5kLCBlbXB0eSBzdHJpbmcgb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXlvdXRUeXBlKGVsZW1lbnQ6IGFueSk6IHN0cmluZyB7XG4gIHJldHVybiBoYXNDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tc3RhY2tgKVxuICAgID8gXCJzdGFja1wiXG4gICAgOiBoYXNDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tcm93YClcbiAgICA/IFwicm93XCJcbiAgICA6IGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1ncmlkYClcbiAgICA/IFwiZ3JpZFwiXG4gICAgOiBcIlwiO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGNvbmZpZ3VyZWQgcHJlZml4IGZvciB0aGUgbGF5b3V0IHN5c3RlbVxuICogQHJldHVybnMgQ3VycmVudCBwcmVmaXggd2l0aCBkYXNoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXlvdXRQcmVmaXgoKTogc3RyaW5nIHtcbiAgcmV0dXJuIFBSRUZJWF9XSVRIX0RBU0g7XG59XG5cbi8qKlxuICogU2V0cyBsYXlvdXQgY2xhc3NlcyBvbiBhbiBlbGVtZW50IGR5bmFtaWNhbGx5XG4gKiBVc2VmdWwgZm9yIHByb2dyYW1tYXRpYyBsYXlvdXQgdXBkYXRlc1xuICpcbiAqIEBwYXJhbSBlbGVtZW50IC0gVGFyZ2V0IGVsZW1lbnRcbiAqIEBwYXJhbSBsYXlvdXRUeXBlIC0gTGF5b3V0IHR5cGUgdG8gYXBwbHlcbiAqIEBwYXJhbSBjbGFzc2VzIC0gQWRkaXRpb25hbCBjbGFzc2VzIHRvIGFwcGx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRMYXlvdXRDbGFzc2VzKFxuICBlbGVtZW50OiBhbnksXG4gIGxheW91dFR5cGU6IHN0cmluZyxcbiAgY2xhc3Nlczogc3RyaW5nW10gPSBbXVxuKTogdm9pZCB7XG4gIGlmICghZWxlbWVudCB8fCAhbGF5b3V0VHlwZSkgcmV0dXJuO1xuXG4gIC8vIENsZWFuIHVwIGV4aXN0aW5nIGxheW91dCBjbGFzc2VzIGZpcnN0XG4gIGNsZWFudXBMYXlvdXRDbGFzc2VzKGVsZW1lbnQpO1xuXG4gIC8vIEFwcGx5IGJhc2UgbGF5b3V0IHR5cGVcbiAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLSR7bGF5b3V0VHlwZX1gKTtcblxuICAvLyBBcHBseSBhZGRpdGlvbmFsIGNsYXNzZXNcbiAgY2xhc3Nlcy5mb3JFYWNoKChjbHMpID0+IHtcbiAgICBpZiAoY2xzLnN0YXJ0c1dpdGgoXCJsYXlvdXQtLVwiKSB8fCBjbHMuc3RhcnRzV2l0aChcImxheW91dF9fXCIpKSB7XG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfSR7Y2xzfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBjbHMpO1xuICAgIH1cbiAgfSk7XG59XG4iLAogICAgIi8qKlxuICogQG1vZHVsZSBjb3JlL2xheW91dC9qc3hcbiAqIEBkZXNjcmlwdGlvbiBKU1gtbGlrZSBzeW50YXggc3VwcG9ydCBmb3IgbGF5b3V0IGNyZWF0aW9uXG4gKiBQcm92aWRlcyBhIHNpbXBsZSBoKCkgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGVsZW1lbnRzIHdpdGhvdXQgUmVhY3QgZGVwZW5kZW5jeVxuICovXG5cbmltcG9ydCB0eXBlIHsgTGF5b3V0UmVzdWx0IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUxheW91dCB9IGZyb20gXCIuL3NjaGVtYVwiO1xuXG4vKipcbiAqIEZyYWdtZW50IHN5bWJvbCBmb3IgSlNYIGZyYWdtZW50c1xuICovXG5leHBvcnQgY29uc3QgRnJhZ21lbnQgPSBTeW1ib2woXCJGcmFnbWVudFwiKTtcblxuLyoqXG4gKiBKU1gtbGlrZSBoeXBlcnNjcmlwdCBmdW5jdGlvblxuICogQ3JlYXRlcyBlbGVtZW50cyBpbiBhIFJlYWN0LWxpa2Ugc3ludGF4IHdpdGhvdXQgUmVhY3QgZGVwZW5kZW5jeVxuICpcbiAqIEBwYXJhbSB0YWcgLSBIVE1MIHRhZyBuYW1lLCBjb21wb25lbnQgZnVuY3Rpb24sIG9yIEZyYWdtZW50XG4gKiBAcGFyYW0gcHJvcHMgLSBFbGVtZW50IHByb3BlcnRpZXMgYW5kIGF0dHJpYnV0ZXNcbiAqIEBwYXJhbSBjaGlsZHJlbiAtIENoaWxkIGVsZW1lbnRzXG4gKiBAcmV0dXJucyBET00gZWxlbWVudCBvciBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGgoXG4gIHRhZzogc3RyaW5nIHwgRnVuY3Rpb24gfCB0eXBlb2YgRnJhZ21lbnQsXG4gIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwsXG4gIC4uLmNoaWxkcmVuOiBhbnlbXVxuKTogYW55IHtcbiAgLy8gSGFuZGxlIEZyYWdtZW50XG4gIGlmICh0YWcgPT09IEZyYWdtZW50KSB7XG4gICAgY29uc3QgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgIGlmIChjaGlsZCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPVxuICAgICAgICAgIHR5cGVvZiBjaGlsZCA9PT0gXCJzdHJpbmdcIiA/IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNoaWxkKSA6IGNoaWxkO1xuICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZnJhZ21lbnQ7XG4gIH1cblxuICAvLyBIYW5kbGUgc3RyaW5nIHRhZ3MgKEhUTUwgZWxlbWVudHMpXG4gIGlmICh0eXBlb2YgdGFnID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcblxuICAgIC8vIEFwcGx5IHByb3BzXG4gICAgaWYgKHByb3BzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9wcykpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJjbGFzc05hbWVcIiB8fCBrZXkgPT09IFwiY2xhc3NcIikge1xuICAgICAgICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5LnN0YXJ0c1dpdGgoXCJvblwiKSAmJiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIEV2ZW50IGhhbmRsZXJcbiAgICAgICAgICBjb25zdCBldmVudE5hbWUgPSBrZXkuc2xpY2UoMikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcInN0eWxlXCIgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgLy8gU3R5bGUgb2JqZWN0XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCIpIHtcbiAgICAgICAgICAvLyBIVE1MIGNvbnRlbnRcbiAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IHZhbHVlLl9faHRtbCB8fCBcIlwiO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBSZWd1bGFyIGF0dHJpYnV0ZVxuICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBcHBlbmQgY2hpbGRyZW5cbiAgICBjaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgaWYgKGNoaWxkICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjaGlsZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY2hpbGQpKTtcbiAgICAgICAgfSBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIE5vZGUpIHtcbiAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZyhjaGlsZCkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICAvLyBIYW5kbGUgY29tcG9uZW50IGZ1bmN0aW9uc1xuICBpZiAodHlwZW9mIHRhZyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc3QgYWxsUHJvcHMgPSBwcm9wcyB8fCB7fTtcbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgYWxsUHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICB9XG4gICAgcmV0dXJuIHRhZyhhbGxQcm9wcyk7XG4gIH1cblxuICAvLyBGYWxsYmFjayB0byBkaXZcbiAgcmV0dXJuIGgoXCJkaXZcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbGF5b3V0IHVzaW5nIEpTWC1saWtlIHN5bnRheFxuICogUHJvdmlkZXMgYSBicmlkZ2UgYmV0d2VlbiBKU1ggYW5kIHRoZSBsYXlvdXQgc3lzdGVtXG4gKlxuICogQHBhcmFtIGpzeEVsZW1lbnQgLSBKU1ggZWxlbWVudCBjcmVhdGVkIHdpdGggaCgpXG4gKiBAcGFyYW0gcGFyZW50RWxlbWVudCAtIFBhcmVudCBlbGVtZW50IHRvIGF0dGFjaCB0b1xuICogQHJldHVybnMgTGF5b3V0IHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSnN4TGF5b3V0KFxuICBqc3hFbGVtZW50OiBhbnksXG4gIHBhcmVudEVsZW1lbnQ/OiBhbnlcbik6IExheW91dFJlc3VsdCB7XG4gIC8vIENvbnZlcnQgSlNYIGVsZW1lbnQgdG8gbGF5b3V0IHNjaGVtYVxuICBjb25zdCBzY2hlbWEgPSBqc3hFbGVtZW50O1xuXG4gIC8vIENyZWF0ZSBsYXlvdXQgdXNpbmcgdGhlIHN0YW5kYXJkIGNyZWF0ZUxheW91dCBmdW5jdGlvblxuICByZXR1cm4gY3JlYXRlTGF5b3V0KHNjaGVtYSwgcGFyZW50RWxlbWVudCk7XG59XG5cbi8qKlxuICogVXRpbGl0eSB0byBjcmVhdGUgYSBzaW1wbGUgY29tcG9uZW50IGZyb20gYSBmdW5jdGlvblxuICogVXNlZnVsIGZvciBjcmVhdGluZyByZXVzYWJsZSBKU1ggY29tcG9uZW50c1xuICpcbiAqIEBwYXJhbSBmbiAtIENvbXBvbmVudCBmdW5jdGlvblxuICogQHJldHVybnMgQ29tcG9uZW50IHRoYXQgY2FuIGJlIHVzZWQgaW4gSlNYXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb25lbnQoZm46IChwcm9wczogUmVjb3JkPHN0cmluZywgYW55PikgPT4gYW55KTogRnVuY3Rpb24ge1xuICByZXR1cm4gZnVuY3Rpb24gKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogYW55IHtcbiAgICByZXR1cm4gZm4ocHJvcHMgfHwge30pO1xuICB9O1xufVxuXG4vKipcbiAqIFV0aWxpdHkgdG8gcmVuZGVyIG11bHRpcGxlIEpTWCBlbGVtZW50c1xuICogVXNlZnVsIGZvciBjcmVhdGluZyBsaXN0cyBvciBjb2xsZWN0aW9uc1xuICpcbiAqIEBwYXJhbSBlbGVtZW50cyAtIEFycmF5IG9mIEpTWCBlbGVtZW50c1xuICogQHBhcmFtIHBhcmVudEVsZW1lbnQgLSBQYXJlbnQgZWxlbWVudCB0byBhdHRhY2ggdG9cbiAqIEByZXR1cm5zIEFycmF5IG9mIGxheW91dCByZXN1bHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJFbGVtZW50cyhcbiAgZWxlbWVudHM6IGFueVtdLFxuICBwYXJlbnRFbGVtZW50PzogYW55XG4pOiBMYXlvdXRSZXN1bHRbXSB7XG4gIHJldHVybiBlbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IGNyZWF0ZUpzeExheW91dChlbGVtZW50LCBwYXJlbnRFbGVtZW50KSk7XG59XG5cbi8qKlxuICogQ29tbW9uIEpTWCBlbGVtZW50IGNyZWF0b3JzIGZvciBjb252ZW5pZW5jZVxuICovXG5leHBvcnQgY29uc3QganN4ID0ge1xuICBkaXY6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwiZGl2XCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIHNwYW46IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwic3BhblwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxuICBwOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcInBcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgYnV0dG9uOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcImJ1dHRvblwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxuICBpbnB1dDogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PikgPT4gaChcImlucHV0XCIsIHByb3BzKSxcbiAgaW1nOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBoKFwiaW1nXCIsIHByb3BzKSxcbiAgYTogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJhXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIHVsOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcInVsXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIGxpOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcImxpXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIHNlY3Rpb246IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwic2VjdGlvblwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxuICBoZWFkZXI6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwiaGVhZGVyXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIGZvb3RlcjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJmb290ZXJcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgbWFpbjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJtYWluXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIGFydGljbGU6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwiYXJ0aWNsZVwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxufTtcbiIsCiAgICAiLyoqXG4gKiBWaWV3cG9ydCAtIENvcmUgdmlydHVhbCBzY3JvbGxpbmcgZW5naW5lXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBWaWV3cG9ydENvbmZpZyxcbiAgVmlld3BvcnRDb250ZXh0LFxuICBWaWV3cG9ydENvbXBvbmVudCxcbiAgSXRlbVJhbmdlLFxuICBWaWV3cG9ydEluZm8sXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBwaXBlIH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IHdpdGhCYXNlIH0gZnJvbSBcIi4vZmVhdHVyZXMvYmFzZVwiO1xuaW1wb3J0IHsgd2l0aFZpcnR1YWwgfSBmcm9tIFwiLi9mZWF0dXJlcy92aXJ0dWFsXCI7XG5pbXBvcnQgeyB3aXRoU2Nyb2xsaW5nIH0gZnJvbSBcIi4vZmVhdHVyZXMvc2Nyb2xsaW5nXCI7XG5pbXBvcnQgeyB3aXRoTW9tZW50dW0gfSBmcm9tIFwiLi9mZWF0dXJlcy9tb21lbnR1bVwiO1xuaW1wb3J0IHsgd2l0aFNjcm9sbGJhciB9IGZyb20gXCIuL2ZlYXR1cmVzL3Njcm9sbGJhclwiO1xuaW1wb3J0IHsgd2l0aENvbGxlY3Rpb24gfSBmcm9tIFwiLi9mZWF0dXJlcy9jb2xsZWN0aW9uXCI7XG5pbXBvcnQgeyB3aXRoUGxhY2Vob2xkZXJzIH0gZnJvbSBcIi4vZmVhdHVyZXMvcGxhY2Vob2xkZXJzXCI7XG5pbXBvcnQgeyB3aXRoUmVuZGVyaW5nIH0gZnJvbSBcIi4vZmVhdHVyZXMvcmVuZGVyaW5nXCI7XG5pbXBvcnQgeyB3aXRoRXZlbnRzIH0gZnJvbSBcIi4vZmVhdHVyZXMvZXZlbnRzXCI7XG5cbi8vIEludGVybmFsIHZpZXdwb3J0IHN0YXRlXG5pbnRlcmZhY2UgVmlld3BvcnRTdGF0ZSB7XG4gIHNjcm9sbFBvc2l0aW9uOiBudW1iZXI7XG4gIHRvdGFsSXRlbXM6IG51bWJlcjtcbiAgaXRlbVNpemU6IG51bWJlcjtcbiAgY29udGFpbmVyU2l6ZTogbnVtYmVyO1xuICB2aXJ0dWFsVG90YWxTaXplOiBudW1iZXI7XG4gIHZpc2libGVSYW5nZTogSXRlbVJhbmdlO1xuICBpdGVtc0NvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsO1xuICB2ZWxvY2l0eTogbnVtYmVyO1xuICBzY3JvbGxEaXJlY3Rpb246IFwiZm9yd2FyZFwiIHwgXCJiYWNrd2FyZFwiO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB2aWV3cG9ydC1lbmhhbmNlZCBjb21wb25lbnQgdXNpbmcgY29tcG9zaXRpb25cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gVmlld3BvcnQgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgRnVuY3Rpb24gdGhhdCBlbmhhbmNlcyBhIGNvbXBvbmVudCB3aXRoIHZpZXdwb3J0IGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgY29uc3QgY3JlYXRlVmlld3BvcnQgPSAoY29uZmlnOiBWaWV3cG9ydENvbmZpZyA9IHt9KSA9PiB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dD4oY29tcG9uZW50OiBUKTogVCAmIFZpZXdwb3J0Q29tcG9uZW50ID0+IHtcbiAgICAvLyBUcmFjayBpZiB2aWV3cG9ydCBoYXMgYmVlbiBpbml0aWFsaXplZCB0byBwcmV2ZW50IG11bHRpcGxlIGluaXRpYWxpemF0aW9uc1xuICAgIGxldCBpc0luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgICAvLyBObyBub3JtYWxpemF0aW9uIG5lZWRlZCAtIHdlJ2xsIHVzZSB0aGUgbmVzdGVkIHN0cnVjdHVyZSBkaXJlY3RseVxuXG4gICAgLy8gQ3JlYXRlIHNoYXJlZCB2aWV3cG9ydCBzdGF0ZVxuICAgIGNvbnN0IHN0YXRlOiBWaWV3cG9ydFN0YXRlID0ge1xuICAgICAgc2Nyb2xsUG9zaXRpb246IDAsXG4gICAgICB0b3RhbEl0ZW1zOiBjb21wb25lbnQudG90YWxJdGVtcyB8fCAwLFxuICAgICAgaXRlbVNpemU6IGNvbmZpZy52aXJ0dWFsPy5pdGVtU2l6ZSB8fCA1MCxcbiAgICAgIGNvbnRhaW5lclNpemU6IDAsXG4gICAgICB2aXJ0dWFsVG90YWxTaXplOiAwLFxuICAgICAgdmlzaWJsZVJhbmdlOiB7IHN0YXJ0OiAwLCBlbmQ6IDAgfSxcbiAgICAgIGl0ZW1zQ29udGFpbmVyOiBudWxsLFxuICAgICAgdmVsb2NpdHk6IDAsXG4gICAgICBzY3JvbGxEaXJlY3Rpb246IFwiZm9yd2FyZFwiLFxuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgYmFzZSB2aWV3cG9ydCBBUElcbiAgICBjb25zdCB2aWV3cG9ydEFQSSA9IHtcbiAgICAgIC8vIENvcmUgQVBJXG4gICAgICBpbml0aWFsaXplOiAoKSA9PiB7XG4gICAgICAgIC8vIFByZXZlbnQgbXVsdGlwbGUgaW5pdGlhbGl6YXRpb25zXG4gICAgICAgIGlmIChpc0luaXRpYWxpemVkKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1ZpZXdwb3J0XSBJbml0aWFsaXppbmcgd2l0aCBzdGF0ZTpcIiwge1xuICAgICAgICAvLyAgIGVsZW1lbnQ6ICEhY29tcG9uZW50LmVsZW1lbnQsXG4gICAgICAgIC8vICAgdG90YWxJdGVtczogY29tcG9uZW50LnRvdGFsSXRlbXMsXG4gICAgICAgIC8vICAgaXRlbVNpemU6IGNvbmZpZy52aXJ0dWFsPy5pdGVtU2l6ZSxcbiAgICAgICAgLy8gfSk7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBjb250YWluZXIgc2l6ZVxuICAgICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgICBzdGF0ZS5jb250YWluZXJTaXplID1cbiAgICAgICAgICAgIGNvbmZpZy5zY3JvbGxpbmc/Lm9yaWVudGF0aW9uID09PSBcImhvcml6b250YWxcIlxuICAgICAgICAgICAgICA/IGNvbXBvbmVudC5lbGVtZW50Lm9mZnNldFdpZHRoXG4gICAgICAgICAgICAgIDogY29tcG9uZW50LmVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCJbVmlld3BvcnRdIENvbnRhaW5lciBzaXplOlwiLCBzdGF0ZS5jb250YWluZXJTaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBpbml0aWFsIHZpcnR1YWwgc2l6ZVxuICAgICAgICBzdGF0ZS52aXJ0dWFsVG90YWxTaXplID0gc3RhdGUudG90YWxJdGVtcyAqIHN0YXRlLml0ZW1TaXplO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBpbml0aWFsIHZpc2libGUgcmFuZ2VcbiAgICAgICAgc3RhdGUudmlzaWJsZVJhbmdlID0gY2FsY3VsYXRlVmlzaWJsZVJhbmdlKHN0YXRlLnNjcm9sbFBvc2l0aW9uKTtcblxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltWaWV3cG9ydF0gSW5pdGlhbCBzdGF0ZTpcIiwge1xuICAgICAgICAvLyAgIGNvbnRhaW5lclNpemU6IHN0YXRlLmNvbnRhaW5lclNpemUsXG4gICAgICAgIC8vICAgdmlydHVhbFRvdGFsU2l6ZTogc3RhdGUudmlydHVhbFRvdGFsU2l6ZSxcbiAgICAgICAgLy8gICB2aXNpYmxlUmFuZ2U6IHN0YXRlLnZpc2libGVSYW5nZSxcbiAgICAgICAgLy8gfSk7XG4gICAgICB9LFxuXG4gICAgICBkZXN0cm95OiAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFudXAgd2lsbCBiZSBoYW5kbGVkIGJ5IGZlYXR1cmVzXG4gICAgICB9LFxuXG4gICAgICB1cGRhdGVWaWV3cG9ydDogKCkgPT4ge1xuICAgICAgICAvLyBXaWxsIGJlIGltcGxlbWVudGVkIGJ5IHJlbmRlcmluZyBmZWF0dXJlXG4gICAgICB9LFxuXG4gICAgICAvLyBDaGVjayBpZiBhbHJlYWR5IGluaXRpYWxpemVkXG4gICAgICBpc0luaXRpYWxpemVkOiAoKSA9PiBpc0luaXRpYWxpemVkLFxuXG4gICAgICAvLyBBbGxvdyBmZWF0dXJlcyB0byBjaGVjayBpZiBpbml0IHNob3VsZCBwcm9jZWVkXG4gICAgICBfc2hvdWxkSW5pdDogKCkgPT4gIWlzSW5pdGlhbGl6ZWQsXG5cbiAgICAgIC8vIFNjcm9sbGluZyBBUEkgKHdpbGwgYmUgb3ZlcnJpZGRlbiBieSBzY3JvbGxpbmcgZmVhdHVyZSlcbiAgICAgIHNjcm9sbFRvSW5kZXg6IChcbiAgICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgICAgYWxpZ25tZW50PzogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIsXG4gICAgICApID0+IHtcbiAgICAgICAgLy8gUGxhY2Vob2xkZXIgLSB3aWxsIGJlIGltcGxlbWVudGVkIGJ5IHNjcm9sbGluZyBmZWF0dXJlXG4gICAgICB9LFxuXG4gICAgICBzY3JvbGxUb1Bvc2l0aW9uOiAocG9zaXRpb246IG51bWJlcikgPT4ge1xuICAgICAgICAvLyBXaWxsIGJlIGltcGxlbWVudGVkIGJ5IHNjcm9sbGluZyBmZWF0dXJlXG4gICAgICB9LFxuXG4gICAgICBnZXRTY3JvbGxQb3NpdGlvbjogKCkgPT4gc3RhdGUuc2Nyb2xsUG9zaXRpb24sXG5cbiAgICAgIC8vIEluZm8gQVBJXG4gICAgICBnZXRWaXNpYmxlUmFuZ2U6ICgpID0+IHN0YXRlLnZpc2libGVSYW5nZSxcblxuICAgICAgZ2V0Vmlld3BvcnRJbmZvOiAoKTogVmlld3BvcnRJbmZvID0+ICh7XG4gICAgICAgIGNvbnRhaW5lclNpemU6IHN0YXRlLmNvbnRhaW5lclNpemUsXG4gICAgICAgIHRvdGFsVmlydHVhbFNpemU6IHN0YXRlLnZpcnR1YWxUb3RhbFNpemUsXG4gICAgICAgIHZpc2libGVSYW5nZTogc3RhdGUudmlzaWJsZVJhbmdlLFxuICAgICAgICB2aXJ0dWFsU2Nyb2xsUG9zaXRpb246IHN0YXRlLnNjcm9sbFBvc2l0aW9uLFxuICAgICAgfSksXG5cbiAgICAgIC8vIFJlbmRlcmluZyBBUElcbiAgICAgIHJlbmRlckl0ZW1zOiAoKSA9PiB7XG4gICAgICAgIC8vIFdpbGwgYmUgaW1wbGVtZW50ZWQgYnkgcmVuZGVyaW5nIGZlYXR1cmVcbiAgICAgIH0sXG5cbiAgICAgIC8vIEludGVybmFsIHN0YXRlIChmb3IgZmVhdHVyZXMgdG8gYWNjZXNzKVxuICAgICAgc3RhdGUsXG4gICAgfTtcblxuICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjYWxjdWxhdGUgdmlzaWJsZSByYW5nZVxuICAgIGNvbnN0IGNhbGN1bGF0ZVZpc2libGVSYW5nZSA9IChzY3JvbGxQb3M6IG51bWJlcik6IEl0ZW1SYW5nZSA9PiB7XG4gICAgICBjb25zdCBpdGVtU2l6ZSA9IHN0YXRlLml0ZW1TaXplO1xuICAgICAgY29uc3Qgc3RhcnQgPSBNYXRoLmZsb29yKHNjcm9sbFBvcyAvIGl0ZW1TaXplKTtcbiAgICAgIGNvbnN0IHZpc2libGVDb3VudCA9IE1hdGguY2VpbChzdGF0ZS5jb250YWluZXJTaXplIC8gaXRlbVNpemUpO1xuICAgICAgY29uc3QgZW5kID0gTWF0aC5taW4oc3RhcnQgKyB2aXNpYmxlQ291bnQsIHN0YXRlLnRvdGFsSXRlbXMgLSAxKTtcblxuICAgICAgcmV0dXJuIHsgc3RhcnQ6IE1hdGgubWF4KDAsIHN0YXJ0KSwgZW5kOiBNYXRoLm1heCgwLCBlbmQpIH07XG4gICAgfTtcblxuICAgIC8vIEFkZCB2aWV3cG9ydCBBUEkgdG8gY29tcG9uZW50XG4gICAgY29uc3QgYmFzZUNvbXBvbmVudCA9IHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIHZpZXdwb3J0OiB2aWV3cG9ydEFQSSxcbiAgICB9O1xuXG4gICAgLy8gQnVpbGQgdGhlIGVuaGFuY2VtZW50IHBpcGVsaW5lXG4gICAgY29uc3QgZW5oYW5jZXJzOiBBcnJheTwoYzogYW55KSA9PiBhbnk+ID0gW107XG5cbiAgICAvLyBFdmVudHMgc3lzdGVtIChhbHdheXMgZmlyc3QgLSBwcm92aWRlcyBjb21tdW5pY2F0aW9uIGZvciBvdGhlciBmZWF0dXJlcylcbiAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgIHdpdGhFdmVudHMoe1xuICAgICAgICBkZWJ1ZzogY29uZmlnLmRlYnVnLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIEJhc2Ugc2V0dXAgKGNyZWF0ZXMgRE9NIHN0cnVjdHVyZSlcbiAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgIHdpdGhCYXNlKHtcbiAgICAgICAgY2xhc3NOYW1lOiBjb25maWcuY2xhc3NOYW1lLFxuICAgICAgICBvcmllbnRhdGlvbjogY29uZmlnLnNjcm9sbGluZz8ub3JpZW50YXRpb24sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gVmlydHVhbCBzY3JvbGxpbmcgKHJlcXVpcmVkIGZvciBtb3N0IGZlYXR1cmVzKVxuICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgd2l0aFZpcnR1YWwoe1xuICAgICAgICBpdGVtU2l6ZTogY29uZmlnLnZpcnR1YWw/Lml0ZW1TaXplLFxuICAgICAgICBvdmVyc2NhbjogY29uZmlnLnZpcnR1YWw/Lm92ZXJzY2FuLFxuICAgICAgICBvcmllbnRhdGlvbjogY29uZmlnLnNjcm9sbGluZz8ub3JpZW50YXRpb24sXG4gICAgICAgIGF1dG9EZXRlY3RJdGVtU2l6ZTogY29uZmlnLnZpcnR1YWw/LmF1dG9EZXRlY3RJdGVtU2l6ZSxcbiAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4OiAoY29uZmlnIGFzIGFueSkuaW5pdGlhbFNjcm9sbEluZGV4LFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIFNjcm9sbGluZyBiZWhhdmlvclxuICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgd2l0aFNjcm9sbGluZyh7XG4gICAgICAgIG9yaWVudGF0aW9uOiBjb25maWcuc2Nyb2xsaW5nPy5vcmllbnRhdGlvbixcbiAgICAgICAgc2Vuc2l0aXZpdHk6IGNvbmZpZy5zY3JvbGxpbmc/LnNlbnNpdGl2aXR5LFxuICAgICAgICBzbW9vdGhpbmc6IGNvbmZpZy5zY3JvbGxpbmc/LmFuaW1hdGlvbixcbiAgICAgICAgc3RvcE9uQ2xpY2s6IGNvbmZpZy5zY3JvbGxpbmc/LnN0b3BPbkNsaWNrLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIE1vbWVudHVtIHNjcm9sbGluZyAodG91Y2gvZHJhZyBzdXBwb3J0IGZvciBtb2JpbGUpXG4gICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICB3aXRoTW9tZW50dW0oe1xuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICBzdG9wT25DbGljazogY29uZmlnLnNjcm9sbGluZz8uc3RvcE9uQ2xpY2ssXG4gICAgICAgIGRlY2VsZXJhdGlvbjogY29uZmlnLnNjcm9sbGluZz8ubW9tZW50dW0/LmRlY2VsZXJhdGlvbixcbiAgICAgICAgbWluVmVsb2NpdHk6IGNvbmZpZy5zY3JvbGxpbmc/Lm1vbWVudHVtPy5taW5WZWxvY2l0eSxcbiAgICAgICAgbWluRHVyYXRpb246IGNvbmZpZy5zY3JvbGxpbmc/Lm1vbWVudHVtPy5tYXhEdXJhdGlvbixcbiAgICAgICAgbWluVmVsb2NpdHlUaHJlc2hvbGQ6IGNvbmZpZy5zY3JvbGxpbmc/Lm1vbWVudHVtPy52ZWxvY2l0eVRocmVzaG9sZCxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBTY3JvbGxiYXIgKG9wdGlvbmFsKVxuICAgIGlmIChjb25maWcuc2Nyb2xsYmFyPy5lbmFibGVkICE9PSBmYWxzZSkge1xuICAgICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICAgIHdpdGhTY3JvbGxiYXIoe1xuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgYXV0b0hpZGU6IGNvbmZpZy5zY3JvbGxiYXI/LmF1dG9IaWRlLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGNvbGxlY3Rpb24gaWYgY29uZmlndXJlZFxuICAgIGlmIChjb25maWcuY29sbGVjdGlvbj8uYWRhcHRlcikge1xuICAgICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICAgIHdpdGhDb2xsZWN0aW9uKHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiBjb25maWcuY29sbGVjdGlvbi5hZGFwdGVyLFxuICAgICAgICAgIHJhbmdlU2l6ZTogY29uZmlnLnBhZ2luYXRpb24/LmxpbWl0LFxuICAgICAgICAgIHN0cmF0ZWd5OiBjb25maWcucGFnaW5hdGlvbj8uc3RyYXRlZ3kgYXNcbiAgICAgICAgICAgIHwgXCJvZmZzZXRcIlxuICAgICAgICAgICAgfCBcInBhZ2VcIlxuICAgICAgICAgICAgfCBcImN1cnNvclwiXG4gICAgICAgICAgICB8IHVuZGVmaW5lZCxcbiAgICAgICAgICB0cmFuc2Zvcm06IGNvbmZpZy5jb2xsZWN0aW9uPy50cmFuc2Zvcm0sXG4gICAgICAgICAgY2FuY2VsTG9hZFRocmVzaG9sZDogY29uZmlnLnBlcmZvcm1hbmNlPy5jYW5jZWxMb2FkVGhyZXNob2xkLFxuICAgICAgICAgIG1heENvbmN1cnJlbnRSZXF1ZXN0czogY29uZmlnLnBlcmZvcm1hbmNlPy5tYXhDb25jdXJyZW50UmVxdWVzdHMsXG4gICAgICAgICAgZW5hYmxlUmVxdWVzdFF1ZXVlOiBjb25maWcucGVyZm9ybWFuY2U/LmVuYWJsZVJlcXVlc3RRdWV1ZSAhPT0gZmFsc2UsXG4gICAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4OiAoY29uZmlnIGFzIGFueSkuaW5pdGlhbFNjcm9sbEluZGV4LFxuICAgICAgICAgIHNlbGVjdElkOiAoY29uZmlnIGFzIGFueSkuc2VsZWN0SWQsXG4gICAgICAgICAgYXV0b0xvYWQ6IChjb25maWcgYXMgYW55KS5hdXRvTG9hZCAhPT0gZmFsc2UsXG4gICAgICAgICAgYXV0b1NlbGVjdEZpcnN0OiAoY29uZmlnIGFzIGFueSkuYXV0b1NlbGVjdEZpcnN0LFxuICAgICAgICAgIG1heENhY2hlZEl0ZW1zOiBjb25maWcuY2FjaGU/Lm1heEl0ZW1zLFxuICAgICAgICAgIGV2aWN0aW9uQnVmZmVyOiBjb25maWcuY2FjaGU/LmV2aWN0aW9uQnVmZmVyLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gUGxhY2Vob2xkZXJzIChvcHRpb25hbCwgcmVxdWlyZXMgY29sbGVjdGlvbilcbiAgICBpZiAoY29uZmlnLmNvbGxlY3Rpb24/LmFkYXB0ZXIgJiYgY29uZmlnLnBsYWNlaG9sZGVycz8uZW5hYmxlZCAhPT0gZmFsc2UpIHtcbiAgICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgICB3aXRoUGxhY2Vob2xkZXJzKHtcbiAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgIGFuYWx5emVGaXJzdExvYWQ6IGNvbmZpZy5wbGFjZWhvbGRlcnM/LmFuYWx5emVGaXJzdExvYWQgPz8gdHJ1ZSxcbiAgICAgICAgICBtYXNrQ2hhcmFjdGVyOiBjb25maWcucGxhY2Vob2xkZXJzPy5tYXNrQ2hhcmFjdGVyLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gUmVuZGVyaW5nIChhbHdheXMgbGFzdCB0byBoYXZlIGFjY2VzcyB0byBhbGwgZmVhdHVyZXMpXG4gICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICB3aXRoUmVuZGVyaW5nKHtcbiAgICAgICAgdGVtcGxhdGU6IGNvbmZpZy50ZW1wbGF0ZSxcbiAgICAgICAgb3ZlcnNjYW46IGNvbmZpZy52aXJ0dWFsPy5vdmVyc2NhbixcbiAgICAgICAgbWFpbnRhaW5Eb21PcmRlcjogY29uZmlnLnJlbmRlcmluZz8ubWFpbnRhaW5Eb21PcmRlcixcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBDb21wb3NlIGFsbCBlbmhhbmNlcnNcbiAgICBjb25zdCBlbmhhbmNlID0gcGlwZSguLi5lbmhhbmNlcnMpO1xuXG4gICAgLy8gQXBwbHkgZW5oYW5jZW1lbnRzXG4gICAgY29uc3QgZW5oYW5jZWQgPSBlbmhhbmNlKGJhc2VDb21wb25lbnQpO1xuXG4gICAgLy8gQXV0by1pbml0aWFsaXplIGlmIGVsZW1lbnQgaXMgcHJvdmlkZWRcbiAgICBpZiAoZW5oYW5jZWQuZWxlbWVudCkge1xuICAgICAgZW5oYW5jZWQudmlld3BvcnQuaW5pdGlhbGl6ZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBlbmhhbmNlZCBhcyBUICYgVmlld3BvcnRDb21wb25lbnQ7XG4gIH07XG59O1xuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy91dGlscy50c1xuXG4vKipcbiAqIFNoYXJlZCB1dGlsaXRpZXMgZm9yIHZpZXdwb3J0IGZlYXR1cmVzXG4gKiBFbGltaW5hdGVzIGNvZGUgZHVwbGljYXRpb24gYWNyb3NzIGZlYXR1cmVzXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogV3JhcHMgdmlld3BvcnQgaW5pdGlhbGl6YXRpb24gd2l0aCBmZWF0dXJlLXNwZWNpZmljIGxvZ2ljXG4gKiBFbGltaW5hdGVzIHRoZSByZXBlYXRlZCBpbml0aWFsaXphdGlvbiBob29rIHBhdHRlcm5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBJbml0aWFsaXplPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBWaWV3cG9ydENvbXBvbmVudD4oXG4gIGNvbXBvbmVudDogVCxcbiAgZmVhdHVyZUluaXQ6ICgpID0+IHZvaWQsXG4pOiB2b2lkIHtcbiAgY29uc3Qgb3JpZ2luYWxJbml0aWFsaXplID0gY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemU7XG4gIGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplID0gKCkgPT4ge1xuICAgIC8vIENoZWNrIGlmIGFscmVhZHkgaW5pdGlhbGl6ZWQgKHJldHVybnMgZmFsc2UgaWYgYWxyZWFkeSBkb25lKVxuICAgIGNvbnN0IHJlc3VsdCA9IG9yaWdpbmFsSW5pdGlhbGl6ZSgpO1xuICAgIC8vIE9ubHkgcnVuIGZlYXR1cmUgaW5pdCBpZiBiYXNlIGluaXQgYWN0dWFsbHkgcmFuIChkaWRuJ3QgcmV0dXJuIGZhbHNlKVxuICAgIGlmIChyZXN1bHQgIT09IGZhbHNlKSB7XG4gICAgICBmZWF0dXJlSW5pdCgpO1xuICAgIH1cbiAgICAvLyBQcm9wYWdhdGUgdGhlIHJlc3VsdCB0aHJvdWdoIHRoZSBjaGFpbiBzbyBvdXRlciB3cmFwcGVycyBrbm93IHRvIHNraXBcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG4vKipcbiAqIFdyYXBzIGNvbXBvbmVudCBkZXN0cm95IHdpdGggY2xlYW51cCBsb2dpY1xuICogRWxpbWluYXRlcyB0aGUgcmVwZWF0ZWQgZGVzdHJveSBob29rIHBhdHRlcm5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBEZXN0cm95PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgY29tcG9uZW50OiBULFxuICBjbGVhbnVwOiAoKSA9PiB2b2lkLFxuKTogdm9pZCB7XG4gIGlmIChcImRlc3Ryb3lcIiBpbiBjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQuZGVzdHJveTtcbiAgICAoY29tcG9uZW50IGFzIGFueSkuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgIGNsZWFudXAoKTtcbiAgICAgIG9yaWdpbmFsRGVzdHJveT8uKCk7XG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgdmlld3BvcnQgc3RhdGUgd2l0aCBwcm9wZXIgdHlwaW5nXG4gKiBFbGltaW5hdGVzIHJlcGVhdGVkIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Vmlld3BvcnRTdGF0ZShjb21wb25lbnQ6IFZpZXdwb3J0Q29tcG9uZW50KTogYW55IHtcbiAgcmV0dXJuIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zdGF0ZTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYW4gaXRlbSBpcyBhIHBsYWNlaG9sZGVyXG4gKiBFbGltaW5hdGVzIGR1cGxpY2F0ZWQgcGxhY2Vob2xkZXIgZGV0ZWN0aW9uIGxvZ2ljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BsYWNlaG9sZGVyKGl0ZW06IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGl0ZW0gJiZcbiAgICB0eXBlb2YgaXRlbSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIChpdGVtLl9wbGFjZWhvbGRlciA9PT0gdHJ1ZSB8fCBpdGVtW1wiX3BsYWNlaG9sZGVyXCJdID09PSB0cnVlKSAvLyBTdXBwb3J0IGJvdGggYWNjZXNzIHBhdHRlcm5zXG4gICk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJhbmdlIGtleSBmb3IgZGVkdXBsaWNhdGlvblxuICogVXNlZCBieSBtdWx0aXBsZSBmZWF0dXJlcyBmb3IgdHJhY2tpbmcgcmFuZ2VzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSYW5nZUtleShyYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3JhbmdlLnN0YXJ0fS0ke3JhbmdlLmVuZH1gO1xufVxuXG4vKipcbiAqIENsYW1wcyBhIHZhbHVlIGJldHdlZW4gbWluIGFuZCBtYXhcbiAqIFVzZWQgYnkgbXVsdGlwbGUgZmVhdHVyZXMgZm9yIGJvdW5kYXJ5IGNoZWNraW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFtcCh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbihtYXgsIHZhbHVlKSk7XG59XG5cbi8qKlxuICogU3RvcmVzIGEgZnVuY3Rpb24gcmVmZXJlbmNlIG9uIHRoZSBjb21wb25lbnQgZm9yIGxhdGVyIGFjY2Vzc1xuICogRWxpbWluYXRlcyBwYXR0ZXJuIGxpa2UgKGNvbXBvbmVudCBhcyBhbnkpLl9mZWF0dXJlRnVuY3Rpb24gPSBmblxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RvcmVGZWF0dXJlRnVuY3Rpb248VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KFxuICBjb21wb25lbnQ6IFQsXG4gIG5hbWU6IHN0cmluZyxcbiAgZm46IEZ1bmN0aW9uLFxuKTogdm9pZCB7XG4gIChjb21wb25lbnQgYXMgYW55KVtuYW1lXSA9IGZuO1xufVxuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9iYXNlLnRzXG5cbi8qKlxuICogQmFzZSBWaWV3cG9ydCBGZWF0dXJlIC0gU2V0cyB1cCBjb3JlIHZpZXdwb3J0IHN0cnVjdHVyZVxuICogUHJvdmlkZXMgdGhlIGZvdW5kYXRpb24gZm9yIG90aGVyIHZpZXdwb3J0IGZlYXR1cmVzXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyB3cmFwSW5pdGlhbGl6ZSwgZ2V0Vmlld3BvcnRTdGF0ZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZUNvbmZpZyB7XG4gIGNsYXNzTmFtZT86IHN0cmluZztcbiAgb3JpZW50YXRpb24/OiBcInZlcnRpY2FsXCIgfCBcImhvcml6b250YWxcIjtcbn1cblxuLyoqXG4gKiBCYXNlIGZlYXR1cmUgZm9yIHZpZXdwb3J0XG4gKiBTZXRzIHVwIHRoZSBET00gc3RydWN0dXJlIGFuZCBjb3JlIHN0eWxlc1xuICovXG5leHBvcnQgY29uc3Qgd2l0aEJhc2UgPSAoY29uZmlnOiBCYXNlQ29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KGNvbXBvbmVudDogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHsgY2xhc3NOYW1lID0gXCJtdHJsLXZpZXdwb3J0XCIsIG9yaWVudGF0aW9uID0gXCJ2ZXJ0aWNhbFwiIH0gPSBjb25maWc7XG5cbiAgICAvLyBVc2UgdGhlIHNoYXJlZCB3cmFwcGVyIHV0aWxpdHlcbiAgICB3cmFwSW5pdGlhbGl6ZShjb21wb25lbnQsICgpID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBjb21wb25lbnQuZWxlbWVudDtcbiAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuO1xuXG4gICAgICAvLyBDcmVhdGUgdmlld3BvcnQgc3RydWN0dXJlXG4gICAgICBsZXQgdmlld3BvcnRFbGVtZW50ID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBcIi5tdHJsLXZpZXdwb3J0XCJcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgIGlmICghdmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5jbGFzc05hbWUgPSBjbGFzc05hbWU7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gYFxuICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgYDtcblxuICAgICAgICAvLyBTZXQgb3JpZW50YXRpb25cbiAgICAgICAgdmlld3BvcnRFbGVtZW50LnNldEF0dHJpYnV0ZShcImRhdGEtb3JpZW50YXRpb25cIiwgb3JpZW50YXRpb24pO1xuXG4gICAgICAgIC8vIENyZWF0ZSBpdGVtcyBjb250YWluZXJcbiAgICAgICAgY29uc3QgaXRlbXNDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBpdGVtc0NvbnRhaW5lci5jbGFzc05hbWUgPSBcIm10cmwtdmlld3BvcnQtaXRlbXNcIjtcbiAgICAgICAgaXRlbXNDb250YWluZXIuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGA7XG5cbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFwcGVuZENoaWxkKGl0ZW1zQ29udGFpbmVyKTtcbiAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZCh2aWV3cG9ydEVsZW1lbnQpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSB2aWV3cG9ydCBzdGF0ZSB3aXRoIGNvbnRhaW5lcnMgdXNpbmcgdXRpbGl0eVxuICAgICAgICBjb25zdCBzdGF0ZSA9IGdldFZpZXdwb3J0U3RhdGUoY29tcG9uZW50KTtcbiAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgc3RhdGUudmlld3BvcnRFbGVtZW50ID0gdmlld3BvcnRFbGVtZW50O1xuICAgICAgICAgIHN0YXRlLml0ZW1zQ29udGFpbmVyID0gaXRlbXNDb250YWluZXI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdG9yZSByZWZlcmVuY2VzIG9uIGNvbXBvbmVudFxuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkudmlld3BvcnRFbGVtZW50ID0gdmlld3BvcnRFbGVtZW50O1xuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuaXRlbXNDb250YWluZXIgPSBpdGVtc0NvbnRhaW5lcjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH07XG59O1xuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9jb25zdGFudHMudHNcblxuLyoqXG4gKiBWaWV3cG9ydCBDb25zdGFudHNcbiAqIENlbnRyYWxpemVkIGNvbnN0YW50cyBmb3IgYWxsIHZpZXdwb3J0IGZ1bmN0aW9uYWxpdHlcbiAqIENvbnNvbGlkYXRlZCBmcm9tIHZpZXdwb3J0LCB2aWV3cG9ydC9mZWF0dXJlcywgYW5kIGxpc3QtbWFuYWdlciBjb25zdGFudHNcbiAqL1xuXG5leHBvcnQgY29uc3QgVklFV1BPUlRfQ09OU1RBTlRTID0ge1xuICAvLyBWaXJ0dWFsIHNjcm9sbGluZyBkZWZhdWx0c1xuICBWSVJUVUFMX1NDUk9MTDoge1xuICAgIERFRkFVTFRfSVRFTV9TSVpFOiA0OCxcbiAgICBPVkVSU0NBTl9CVUZGRVI6IDIsXG4gICAgU0NST0xMX1NFTlNJVElWSVRZOiAwLjcsXG4gICAgTUFYX1ZJUlRVQUxfU0laRTogMTAwICogMTAwMCAqIDEwMDAsIC8vIDEwME0gcGl4ZWxzIC0gbW9kZXJuIGJyb3dzZXJzIGNhbiBoYW5kbGUgdGhpc1xuICAgIEFVVE9fREVURUNUX0lURU1fU0laRTogdHJ1ZSwgLy8gRW5hYmxlIGF1dG9tYXRpYyBpdGVtIHNpemUgZGV0ZWN0aW9uXG4gIH0sXG5cbiAgLy8gU2Nyb2xsaW5nIHNldHRpbmdzXG4gIFNDUk9MTElORzoge1xuICAgIE9WRVJTQ0FOOiAxLCAvLyBGcm9tIGZlYXR1cmVzL2NvbnN0YW50c1xuICB9LFxuXG4gIC8vIFJlbmRlcmluZyBzZXR0aW5nc1xuICBSRU5ERVJJTkc6IHtcbiAgICAvLyBFbGVtZW50IHJlY3ljbGluZ1xuICAgIERFRkFVTFRfTUFYX1BPT0xfU0laRTogMTAwLFxuICAgIENMQVNTRVM6IHtcbiAgICAgIElURU06IFwidmlld3BvcnQtaXRlbVwiLFxuICAgIH0sXG4gIH0sXG5cbiAgLy8gTG9hZGluZyBzZXR0aW5nc1xuICBMT0FESU5HOiB7XG4gICAgQ0FOQ0VMX1RIUkVTSE9MRDogMjUsIC8vIHB4L21zIC0gdmVsb2NpdHkgYWJvdmUgd2hpY2ggbG9hZHMgY2FuY2VsXG4gICAgTUFYX0NPTkNVUlJFTlRfUkVRVUVTVFM6IDEsIC8vIFBhcmFsbGVsIHJlcXVlc3RzIGFsbG93ZWRcbiAgICBERUZBVUxUX1JBTkdFX1NJWkU6IDIwLCAvLyBJdGVtcyBwZXIgcmVxdWVzdFxuICAgIERFQk9VTkNFX0xPQURJTkc6IDE1MCwgLy8gRGVib3VuY2UgZGVsYXkgKG1zKVxuICAgIE1JTl9SQU5HRV9TSVpFOiAxMCwgLy8gTWluaW11bSBpdGVtcyBwZXIgbG9hZFxuICAgIE1BWF9SQU5HRV9TSVpFOiAxMDAsIC8vIE1heGltdW0gaXRlbXMgcGVyIGxvYWRcbiAgICBSRVFVRVNUX1RJTUVPVVQ6IDUwMDAsIC8vIFJlcXVlc3QgdGltZW91dCAobXMpXG4gICAgUkVUUllfQVRURU1QVFM6IDIsIC8vIEZhaWxlZCByZXF1ZXN0IHJldHJpZXNcbiAgICBSRVRSWV9ERUxBWTogMTAwMCwgLy8gRGVsYXkgYmV0d2VlbiByZXRyaWVzIChtcylcbiAgfSxcblxuICAvLyBSZXF1ZXN0IHF1ZXVlIGNvbmZpZ3VyYXRpb24gKGZyb20gZmVhdHVyZXMvY29uc3RhbnRzKVxuICBSRVFVRVNUX1FVRVVFOiB7XG4gICAgRU5BQkxFRDogdHJ1ZSwgLy8gRW5hYmxlIHJlcXVlc3QgcXVldWluZ1xuICAgIE1BWF9RVUVVRV9TSVpFOiAxLCAvLyBNYXggcXVldWVkIHJlcXVlc3RzXG4gICAgTUFYX0FDVElWRV9SRVFVRVNUUzogMiwgLy8gTWF4IGNvbmN1cnJlbnQgYWN0aXZlIHJlcXVlc3RzXG4gIH0sXG5cbiAgLy8gUGxhY2Vob2xkZXIgc2V0dGluZ3NcbiAgUExBQ0VIT0xERVI6IHtcbiAgICBNQVNLX0NIQVJBQ1RFUjogXCJYXCIsIC8vIFVwZGF0ZWQgZnJvbSBsaXN0LW1hbmFnZXJcbiAgICBDTEFTUzogXCJ2aWV3cG9ydC1pdGVtLS1wbGFjZWhvbGRlclwiLFxuICAgIE1BWF9TQU1QTEVfU0laRTogMjAsXG4gICAgUExBQ0VIT0xERVJfRkxBRzogXCJfcGxhY2Vob2xkZXJcIixcbiAgICBSQU5ET01fTEVOR1RIX1ZBUklBTkNFOiB0cnVlLFxuICB9LFxuXG4gIC8vIFNwZWVkIHRyYWNraW5nIChmcm9tIGxpc3QtbWFuYWdlcilcbiAgU1BFRURfVFJBQ0tJTkc6IHtcbiAgICAvLyBWZWxvY2l0eSBjYWxjdWxhdGlvblxuICAgIERFQ0VMRVJBVElPTl9GQUNUT1I6IDAuODUsIC8vIHZlbG9jaXR5IGRlY2F5IHBlciBmcmFtZVxuICB9LFxuXG4gIC8vIE1vbWVudHVtIHNldHRpbmdzXG4gIE1PTUVOVFVNOiB7XG4gICAgRU5BQkxFRDogZmFsc2UsIC8vIEVuYWJsZSBtb21lbnR1bSBieSBkZWZhdWx0XG4gICAgREVDRUxFUkFUSU9OX0ZBQ1RPUjogMC45NSwgLy8gSG93IHF1aWNrbHkgdmVsb2NpdHkgZGVjcmVhc2VzIHBlciBmcmFtZSAoaGlnaGVyID0gbG9uZ2VyIGNvYXN0KVxuICAgIE1JTl9WRUxPQ0lUWTogMC4xLCAvLyBNaW5pbXVtIHZlbG9jaXR5IGJlZm9yZSBzdG9wcGluZyAocHgvbXMpXG4gICAgTUlOX0RVUkFUSU9OOiA3NTAsIC8vIE1heGltdW0gZ2VzdHVyZSBkdXJhdGlvbiB0byB0cmlnZ2VyIG1vbWVudHVtIChtcylcbiAgICBNSU5fVkVMT0NJVFlfVEhSRVNIT0xEOiAwLjQsIC8vIE1pbmltdW0gdmVsb2NpdHkgdG8gdHJpZ2dlciBtb21lbnR1bSAocHgvbXMpXG4gICAgRlJBTUVfVElNRTogMTYsIC8vIEFzc3VtZWQgZnJhbWUgdGltZSBmb3IgY2FsY3VsYXRpb25zIChtcylcbiAgfSxcblxuICAvLyBJbml0aWFsIGxvYWQgY29uZmlndXJhdGlvbiAoZnJvbSBsaXN0LW1hbmFnZXIpXG4gIElOSVRJQUxfTE9BRDoge1xuICAgIFNUUkFURUdZOiBcInBsYWNlaG9sZGVyc1wiLCAvLyBcInBsYWNlaG9sZGVyc1wiIHwgXCJkaXJlY3RcIiB8IFwicHJvZ3Jlc3NpdmVcIlxuICAgIFZJRVdQT1JUX01VTFRJUExJRVI6IDEuNSwgLy8gbG9hZCAxLjV4IHZpZXdwb3J0IGNhcGFjaXR5XG4gICAgTUlOX0lURU1TOiAxMCxcbiAgICBNQVhfSVRFTVM6IDEwMCxcbiAgICBQTEFDRUhPTERFUl9DT1VOVDogMjAsIC8vIGRlZmF1bHQgcGxhY2Vob2xkZXIgY291bnRcbiAgICBTSE9XX0xPQURJTkdfU1RBVEU6IHRydWUsXG4gICAgTE9BRElOR19ERUxBWTogMTAwLCAvLyBtcyAtIGRlbGF5IGJlZm9yZSBzaG93aW5nIGxvYWRpbmcgc3RhdGVcbiAgfSxcblxuICAvLyBTZWxlY3Rpb24gc2V0dGluZ3NcbiAgU0VMRUNUSU9OOiB7XG4gICAgU0VMRUNURURfQ0xBU1M6IFwidmlld3BvcnQtaXRlbS0tc2VsZWN0ZWRcIixcbiAgfSxcblxuICAvLyBTY3JvbGxiYXIgc2V0dGluZ3MgKGZyb20gbGlzdC1tYW5hZ2VyKVxuICBTQ1JPTExCQVI6IHtcbiAgICAvLyBDU1MgY2xhc3Nlc1xuICAgIENMQVNTRVM6IHtcbiAgICAgIFNDUk9MTEJBUjogXCJ2aWV3cG9ydF9fc2Nyb2xsYmFyXCIsXG4gICAgICBTQ1JPTExCQVJfVFJBQ0s6IFwidmlld3BvcnRfX3Njcm9sbGJhci10cmFja1wiLFxuICAgICAgU0NST0xMQkFSX1RIVU1COiBcInZpZXdwb3J0X19zY3JvbGxiYXItdGh1bWJcIixcbiAgICAgIFNDUk9MTEJBUl9WSVNJQkxFOiBcInZpZXdwb3J0X19zY3JvbGxiYXItLXZpc2libGVcIixcbiAgICAgIFNDUk9MTEJBUl9EUkFHR0lORzogXCJ2aWV3cG9ydF9fc2Nyb2xsYmFyLS1kcmFnZ2luZ1wiLFxuICAgICAgU0NST0xMQkFSX1RIVU1CX0RSQUdHSU5HOiBcInZpZXdwb3J0X19zY3JvbGxiYXItdGh1bWItLWRyYWdnaW5nXCIsXG4gICAgfSxcbiAgfSxcblxuICAvLyBPcmllbnRhdGlvbiAoZnJvbSBsaXN0LW1hbmFnZXIpXG4gIE9SSUVOVEFUSU9OOiB7XG4gICAgREVGQVVMVF9PUklFTlRBVElPTjogXCJ2ZXJ0aWNhbFwiLFxuICAgIERFRkFVTFRfQ1JPU1NfQVhJU19BTElHTk1FTlQ6IFwic3RyZXRjaFwiLFxuICAgIFJFVkVSU0VfRElSRUNUSU9OOiBmYWxzZSxcbiAgfSxcblxuICBQQUdJTkFUSU9OOiB7XG4gICAgREVGQVVMVF9TVFJBVEVHWTogXCJvZmZzZXRcIiBhcyBcIm9mZnNldFwiIHwgXCJwYWdlXCIgfCBcImN1cnNvclwiLFxuICAgIERFRkFVTFRfTElNSVQ6IDIwLFxuICAgIFNUUkFURUdJRVM6IHtcbiAgICAgIFBBR0U6IFwicGFnZVwiIGFzIGNvbnN0LFxuICAgICAgT0ZGU0VUOiBcIm9mZnNldFwiIGFzIGNvbnN0LFxuICAgICAgQ1VSU09SOiBcImN1cnNvclwiIGFzIGNvbnN0LFxuICAgIH0sXG4gICAgQ1VSU09SX0NMRUFOVVBfSU5URVJWQUw6IDYwMDAwLCAvLyBDbGVhbiB1cCBvbGQgY3Vyc29ycyBldmVyeSBtaW51dGVcbiAgICBNQVhfQ1VSU09SX01BUF9TSVpFOiAxMDAwLCAvLyBNYXhpbXVtIG51bWJlciBvZiBjdXJzb3JzIHRvIGtlZXAgaW4gbWVtb3J5XG4gICAgLy8gQ3Vyc29yLXNwZWNpZmljIHZpcnR1YWwgc2l6aW5nXG4gICAgQ1VSU09SX1NDUk9MTF9NQVJHSU5fTVVMVElQTElFUjogMywgLy8gTXVsdGlwbHkgcmFuZ2VTaXplIGJ5IHRoaXMgZm9yIHNjcm9sbCBtYXJnaW5cbiAgICBDVVJTT1JfTUlOX1ZJUlRVQUxfU0laRV9NVUxUSVBMSUVSOiAzLCAvLyBNaW5pbXVtIHZpcnR1YWwgc2l6ZSBhcyBtdWx0aXBsaWVyIG9mIHJhbmdlU2l6ZVxuICB9LFxufTtcblxuLyoqXG4gKiBUeXBlIGZvciBvdmVycmlkaW5nIGNvbnN0YW50cyBhdCBydW50aW1lXG4gKi9cbmV4cG9ydCB0eXBlIFZpZXdwb3J0Q29uc3RhbnRzID0gdHlwZW9mIFZJRVdQT1JUX0NPTlNUQU5UUztcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gbWVyZ2UgdXNlciBjb25zdGFudHMgd2l0aCBkZWZhdWx0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VDb25zdGFudHMoXG4gIHVzZXJDb25zdGFudHM6IFBhcnRpYWw8Vmlld3BvcnRDb25zdGFudHM+ID0ge30sXG4pOiBWaWV3cG9ydENvbnN0YW50cyB7XG4gIHJldHVybiB7XG4gICAgLi4uVklFV1BPUlRfQ09OU1RBTlRTLFxuICAgIC4uLnVzZXJDb25zdGFudHMsXG4gIH07XG59XG4iLAogICAgIi8qKlxuICogVmlydHVhbCBGZWF0dXJlIC0gQ29yZSB2aXJ0dWFsIHNjcm9sbGluZyBjYWxjdWxhdGlvbnNcbiAqIEhhbmRsZXMgdmlzaWJsZSByYW5nZSBjYWxjdWxhdGlvbiBhbmQgdG90YWwgdmlydHVhbCBzaXplIG1hbmFnZW1lbnRcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZJRVdQT1JUX0NPTlNUQU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHdyYXBJbml0aWFsaXplLCBnZXRWaWV3cG9ydFN0YXRlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBWaXJ0dWFsQ29uZmlnIHtcbiAgaXRlbVNpemU/OiBudW1iZXI7XG4gIG92ZXJzY2FuPzogbnVtYmVyO1xuICBvcmllbnRhdGlvbj86IFwidmVydGljYWxcIiB8IFwiaG9yaXpvbnRhbFwiO1xuICBhdXRvRGV0ZWN0SXRlbVNpemU/OiBib29sZWFuO1xuICBkZWJ1Zz86IGJvb2xlYW47XG4gIGluaXRpYWxTY3JvbGxJbmRleD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBWaXJ0dWFsIHNjcm9sbGluZyBmZWF0dXJlIGZvciB2aWV3cG9ydFxuICogSGFuZGxlcyB2aXNpYmxlIHJhbmdlIGNhbGN1bGF0aW9ucyB3aXRoIGNvbXByZXNzaW9uIGZvciBsYXJnZSBkYXRhc2V0c1xuICovXG5leHBvcnQgY29uc3Qgd2l0aFZpcnR1YWwgPSAoY29uZmlnOiBWaXJ0dWFsQ29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KGNvbXBvbmVudDogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGl0ZW1TaXplLFxuICAgICAgb3ZlcnNjYW4gPSBWSUVXUE9SVF9DT05TVEFOVFMuVklSVFVBTF9TQ1JPTEwuT1ZFUlNDQU5fQlVGRkVSLFxuICAgICAgb3JpZW50YXRpb24gPSBcInZlcnRpY2FsXCIsXG4gICAgICBhdXRvRGV0ZWN0SXRlbVNpemUgPSBpdGVtU2l6ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gVklFV1BPUlRfQ09OU1RBTlRTLlZJUlRVQUxfU0NST0xMLkFVVE9fREVURUNUX0lURU1fU0laRVxuICAgICAgICA6IGZhbHNlLFxuICAgICAgZGVidWcgPSBmYWxzZSxcbiAgICAgIGluaXRpYWxTY3JvbGxJbmRleCA9IDAsXG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIFVzZSBwcm92aWRlZCBpdGVtU2l6ZSBvciBkZWZhdWx0LCBidXQgbWFyayBpZiB3ZSBzaG91bGQgYXV0by1kZXRlY3RcbiAgICBjb25zdCBpbml0aWFsSXRlbVNpemUgPVxuICAgICAgaXRlbVNpemUgfHwgVklFV1BPUlRfQ09OU1RBTlRTLlZJUlRVQUxfU0NST0xMLkRFRkFVTFRfSVRFTV9TSVpFO1xuXG4gICAgY29uc3QgTUFYX1ZJUlRVQUxfU0laRSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5WSVJUVUFMX1NDUk9MTC5NQVhfVklSVFVBTF9TSVpFO1xuICAgIGxldCB2aWV3cG9ydFN0YXRlOiBhbnk7XG4gICAgbGV0IGhhc0NhbGN1bGF0ZWRJdGVtU2l6ZSA9IGZhbHNlO1xuICAgIGxldCBoYXNSZWNhbGN1bGF0ZWRTY3JvbGxGb3JDb21wcmVzc2lvbiA9IGZhbHNlOyAvLyBUcmFjayBpZiB3ZSd2ZSByZWNhbGN1bGF0ZWQgc2Nyb2xsIHBvc2l0aW9uIGZvciBjb21wcmVzc2lvblxuXG4gICAgLy8gSW5pdGlhbGl6ZSB1c2luZyBzaGFyZWQgd3JhcHBlclxuICAgIHdyYXBJbml0aWFsaXplKGNvbXBvbmVudCwgKCkgPT4ge1xuICAgICAgdmlld3BvcnRTdGF0ZSA9IGdldFZpZXdwb3J0U3RhdGUoY29tcG9uZW50KTtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSkgcmV0dXJuO1xuXG4gICAgICBPYmplY3QuYXNzaWduKHZpZXdwb3J0U3RhdGUsIHtcbiAgICAgICAgaXRlbVNpemU6IGluaXRpYWxJdGVtU2l6ZSxcbiAgICAgICAgb3ZlcnNjYW4sXG4gICAgICAgIGNvbnRhaW5lclNpemU6XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS52aWV3cG9ydEVsZW1lbnQ/LltcbiAgICAgICAgICAgIG9yaWVudGF0aW9uID09PSBcImhvcml6b250YWxcIiA/IFwib2Zmc2V0V2lkdGhcIiA6IFwib2Zmc2V0SGVpZ2h0XCJcbiAgICAgICAgICBdIHx8IDYwMCxcbiAgICAgIH0pO1xuXG4gICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplKHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyk7XG5cbiAgICAgIC8vIElmIHdlIGhhdmUgYW4gaW5pdGlhbCBzY3JvbGwgaW5kZXgsIGNhbGN1bGF0ZSBpbml0aWFsIHNjcm9sbCBwb3NpdGlvblxuICAgICAgLy8gTm90ZTogV2Ugc3RvcmUgdGhlIGluaXRpYWxTY3JvbGxJbmRleCB0byB1c2UgZGlyZWN0bHkgaW4gcmFuZ2UgY2FsY3VsYXRpb25zXG4gICAgICAvLyBiZWNhdXNlIHNjcm9sbCBwb3NpdGlvbiBtYXkgYmUgY29tcHJlc3NlZCBmb3IgbGFyZ2UgbGlzdHNcbiAgICAgIGxldCBpbml0aWFsU2Nyb2xsUG9zaXRpb24gPSB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uIHx8IDA7XG5cbiAgICAgIGlmIChpbml0aWFsU2Nyb2xsSW5kZXggPiAwKSB7XG4gICAgICAgIC8vIFN0b3JlIHRoZSB0YXJnZXQgaW5kZXggZm9yIHVzZSBpbiByYW5nZSBjYWxjdWxhdGlvbnNcbiAgICAgICAgKHZpZXdwb3J0U3RhdGUgYXMgYW55KS50YXJnZXRTY3JvbGxJbmRleCA9IGluaXRpYWxTY3JvbGxJbmRleDtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgc2Nyb2xsIHBvc2l0aW9uIChtYXkgYmUgY29tcHJlc3NlZCBmb3IgbGFyZ2UgbGlzdHMpXG4gICAgICAgIGluaXRpYWxTY3JvbGxQb3NpdGlvbiA9XG4gICAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4ICogKHZpZXdwb3J0U3RhdGUuaXRlbVNpemUgfHwgaW5pdGlhbEl0ZW1TaXplKTtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiA9IGluaXRpYWxTY3JvbGxQb3NpdGlvbjtcblxuICAgICAgICAvLyBOb3RpZnkgc2Nyb2xsaW5nIGZlYXR1cmUgdG8gc3luYyBpdHMgbG9jYWwgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgIC8vIFVzZSBzZXRUaW1lb3V0IHRvIGVuc3VyZSBzY3JvbGxpbmcgZmVhdHVyZSBoYXMgaW5pdGlhbGl6ZWRcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnNjcm9sbC1wb3NpdGlvbi1zeW5jXCIsIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBpbml0aWFsU2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgICBzb3VyY2U6IFwiaW5pdGlhbC1zY3JvbGwtaW5kZXhcIixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZVZpc2libGVSYW5nZShpbml0aWFsU2Nyb2xsUG9zaXRpb24pO1xuXG4gICAgICAvLyBFbnN1cmUgY29udGFpbmVyIHNpemUgaXMgbWVhc3VyZWQgYWZ0ZXIgRE9NIGlzIHJlYWR5XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICB1cGRhdGVDb250YWluZXJTaXplKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIEhlbHBlciBmdW5jdGlvbnNcbiAgICBjb25zdCBnZXRDb21wcmVzc2lvblJhdGlvID0gKCk6IG51bWJlciA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGU/LnZpcnR1YWxUb3RhbFNpemUpIHJldHVybiAxO1xuICAgICAgY29uc3QgYWN0dWFsU2l6ZSA9IHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyAqIHZpZXdwb3J0U3RhdGUuaXRlbVNpemU7XG4gICAgICByZXR1cm4gYWN0dWFsU2l6ZSA8PSBNQVhfVklSVFVBTF9TSVpFID8gMSA6IE1BWF9WSVJUVUFMX1NJWkUgLyBhY3R1YWxTaXplO1xuICAgIH07XG5cbiAgICBjb25zdCBsb2cgPSAobWVzc2FnZTogc3RyaW5nLCBkYXRhPzogYW55KSA9PiB7XG4gICAgICBpZiAoZGVidWcpIGNvbnNvbGUubG9nKGBbVmlydHVhbF0gJHttZXNzYWdlfWAsIGRhdGEpO1xuICAgIH07XG5cbiAgICAvLyBDYWxjdWxhdGUgdmlzaWJsZSByYW5nZVxuICAgIGNvbnN0IGNhbGN1bGF0ZVZpc2libGVSYW5nZSA9IChcbiAgICAgIHNjcm9sbFBvc2l0aW9uOiBudW1iZXIsXG4gICAgKTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9ID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJbVmlydHVhbF0gTm8gdmlld3BvcnQgc3RhdGUsIHJldHVybmluZyBlbXB0eSByYW5nZVwiKTtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IDAsIGVuZDogMCB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGNvbnRhaW5lclNpemUsIHRvdGFsSXRlbXMgfSA9IHZpZXdwb3J0U3RhdGU7XG5cbiAgICAgIC8vIEVhcmx5IHJldHVybnMgZm9yIGludmFsaWQgc3RhdGVzXG4gICAgICBpZiAoXG4gICAgICAgICFjb250YWluZXJTaXplIHx8XG4gICAgICAgIGNvbnRhaW5lclNpemUgPD0gMCB8fFxuICAgICAgICAhdG90YWxJdGVtcyB8fFxuICAgICAgICB0b3RhbEl0ZW1zIDw9IDBcbiAgICAgICkge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIGFuIGluaXRpYWxTY3JvbGxJbmRleCwgdXNlIGl0IHRvIGNhbGN1bGF0ZSB0aGUgcmFuZ2VcbiAgICAgICAgLy8gZXZlbiB3aGVuIHRvdGFsSXRlbXMgaXMgMCAobm90IHlldCBsb2FkZWQgZnJvbSBBUEkpXG4gICAgICAgIGlmIChpbml0aWFsU2Nyb2xsSW5kZXggPiAwKSB7XG4gICAgICAgICAgY29uc3QgdmlzaWJsZUNvdW50ID0gTWF0aC5jZWlsKFxuICAgICAgICAgICAgKGNvbnRhaW5lclNpemUgfHwgNjAwKSAvXG4gICAgICAgICAgICAgICh2aWV3cG9ydFN0YXRlLml0ZW1TaXplIHx8IGluaXRpYWxJdGVtU2l6ZSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBzdGFydCA9IE1hdGgubWF4KDAsIGluaXRpYWxTY3JvbGxJbmRleCAtIG92ZXJzY2FuKTtcbiAgICAgICAgICBjb25zdCBlbmQgPSBpbml0aWFsU2Nyb2xsSW5kZXggKyB2aXNpYmxlQ291bnQgKyBvdmVyc2NhbjtcbiAgICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgICAgIH1cbiAgICAgICAgbG9nKGBJbnZhbGlkIHN0YXRlOiBjb250YWluZXI9JHtjb250YWluZXJTaXplfSwgaXRlbXM9JHt0b3RhbEl0ZW1zfWApO1xuICAgICAgICByZXR1cm4geyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZpcnR1YWxTaXplID1cbiAgICAgICAgdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplIHx8IHRvdGFsSXRlbXMgKiB2aWV3cG9ydFN0YXRlLml0ZW1TaXplO1xuICAgICAgY29uc3QgdmlzaWJsZUNvdW50ID0gTWF0aC5jZWlsKGNvbnRhaW5lclNpemUgLyB2aWV3cG9ydFN0YXRlLml0ZW1TaXplKTtcbiAgICAgIGNvbnN0IGNvbXByZXNzaW9uUmF0aW8gPSBnZXRDb21wcmVzc2lvblJhdGlvKCk7XG5cbiAgICAgIGxldCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcjtcblxuICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIHRhcmdldCBzY3JvbGwgaW5kZXggKGZvciBpbml0aWFsU2Nyb2xsSW5kZXggd2l0aCBjb21wcmVzc2lvbilcbiAgICAgIGNvbnN0IHRhcmdldFNjcm9sbEluZGV4ID0gKHZpZXdwb3J0U3RhdGUgYXMgYW55KS50YXJnZXRTY3JvbGxJbmRleDtcblxuICAgICAgaWYgKGNvbXByZXNzaW9uUmF0aW8gPCAxKSB7XG4gICAgICAgIC8vIENvbXByZXNzZWQgc3BhY2UgY2FsY3VsYXRpb25cbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHRhcmdldFNjcm9sbEluZGV4LCB1c2UgaXQgZGlyZWN0bHkgaW5zdGVhZCBvZiBjYWxjdWxhdGluZyBmcm9tIHNjcm9sbCBwb3NpdGlvblxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgd2Ugc2hvdyB0aGUgY29ycmVjdCBpdGVtcyBldmVuIHdoZW4gdmlydHVhbCBzcGFjZSBpcyBjb21wcmVzc2VkXG4gICAgICAgIGlmICh0YXJnZXRTY3JvbGxJbmRleCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldFNjcm9sbEluZGV4ID4gMCkge1xuICAgICAgICAgIHN0YXJ0ID0gTWF0aC5tYXgoMCwgdGFyZ2V0U2Nyb2xsSW5kZXggLSBvdmVyc2Nhbik7XG4gICAgICAgICAgZW5kID0gTWF0aC5taW4oXG4gICAgICAgICAgICB0b3RhbEl0ZW1zIC0gMSxcbiAgICAgICAgICAgIHRhcmdldFNjcm9sbEluZGV4ICsgdmlzaWJsZUNvdW50ICsgb3ZlcnNjYW4sXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBDbGVhciB0YXJnZXRTY3JvbGxJbmRleCBhZnRlciBmaXJzdCB1c2Ugc28gbm9ybWFsIHNjcm9sbGluZyB3b3Jrc1xuICAgICAgICAgIGRlbGV0ZSAodmlld3BvcnRTdGF0ZSBhcyBhbnkpLnRhcmdldFNjcm9sbEluZGV4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsU2l6ZTtcbiAgICAgICAgICBjb25zdCBleGFjdEluZGV4ID0gc2Nyb2xsUmF0aW8gKiB0b3RhbEl0ZW1zO1xuICAgICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihleGFjdEluZGV4KTtcbiAgICAgICAgICBlbmQgPSBNYXRoLmNlaWwoZXhhY3RJbmRleCkgKyB2aXNpYmxlQ291bnQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOZWFyLWJvdHRvbSBoYW5kbGluZ1xuICAgICAgICBjb25zdCBtYXhTY3JvbGwgPSB2aXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemU7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlRnJvbUJvdHRvbSA9IG1heFNjcm9sbCAtIHNjcm9sbFBvc2l0aW9uO1xuXG4gICAgICAgIGlmIChkaXN0YW5jZUZyb21Cb3R0b20gPD0gY29udGFpbmVyU2l6ZSAmJiBkaXN0YW5jZUZyb21Cb3R0b20gPj0gLTEpIHtcbiAgICAgICAgICBjb25zdCBpdGVtc0F0Qm90dG9tID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgIGNvbnRhaW5lclNpemUgLyB2aWV3cG9ydFN0YXRlLml0ZW1TaXplLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgZmlyc3RWaXNpYmxlQXRCb3R0b20gPSBNYXRoLm1heCgwLCB0b3RhbEl0ZW1zIC0gaXRlbXNBdEJvdHRvbSk7XG4gICAgICAgICAgY29uc3QgaW50ZXJwb2xhdGlvbiA9IE1hdGgubWF4KFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIE1hdGgubWluKDEsIDEgLSBkaXN0YW5jZUZyb21Cb3R0b20gLyBjb250YWluZXJTaXplKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgc3RhcnQgPSBNYXRoLmZsb29yKFxuICAgICAgICAgICAgc3RhcnQgKyAoZmlyc3RWaXNpYmxlQXRCb3R0b20gLSBzdGFydCkgKiBpbnRlcnBvbGF0aW9uLFxuICAgICAgICAgICk7XG4gICAgICAgICAgZW5kID1cbiAgICAgICAgICAgIGRpc3RhbmNlRnJvbUJvdHRvbSA8PSAxXG4gICAgICAgICAgICAgID8gdG90YWxJdGVtcyAtIDFcbiAgICAgICAgICAgICAgOiBNYXRoLm1pbih0b3RhbEl0ZW1zIC0gMSwgc3RhcnQgKyB2aXNpYmxlQ291bnQgKyBvdmVyc2Nhbik7XG5cbiAgICAgICAgICBsb2coXCJOZWFyIGJvdHRvbSBjYWxjdWxhdGlvbjpcIiwge1xuICAgICAgICAgICAgZGlzdGFuY2VGcm9tQm90dG9tLFxuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbixcbiAgICAgICAgICAgIHN0YXJ0LFxuICAgICAgICAgICAgZW5kLFxuICAgICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwbHkgb3ZlcnNjYW5cbiAgICAgICAgc3RhcnQgPSBNYXRoLm1heCgwLCBzdGFydCAtIG92ZXJzY2FuKTtcbiAgICAgICAgZW5kID0gTWF0aC5taW4odG90YWxJdGVtcyAtIDEsIGVuZCArIG92ZXJzY2FuKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpcmVjdCBjYWxjdWxhdGlvblxuICAgICAgICBzdGFydCA9IE1hdGgubWF4KFxuICAgICAgICAgIDAsXG4gICAgICAgICAgTWF0aC5mbG9vcihzY3JvbGxQb3NpdGlvbiAvIHZpZXdwb3J0U3RhdGUuaXRlbVNpemUpIC0gb3ZlcnNjYW4sXG4gICAgICAgICk7XG4gICAgICAgIGVuZCA9IE1hdGgubWluKHRvdGFsSXRlbXMgLSAxLCBzdGFydCArIHZpc2libGVDb3VudCArIG92ZXJzY2FuICogMik7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIG91dHB1dFxuICAgICAgaWYgKGlzTmFOKHN0YXJ0KSB8fCBpc05hTihlbmQpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbVmlydHVhbF0gTmFOIGluIHJhbmdlIGNhbGN1bGF0aW9uOlwiLCB7XG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgY29udGFpbmVyU2l6ZSxcbiAgICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICAgIGl0ZW1TaXplOiB2aWV3cG9ydFN0YXRlLml0ZW1TaXplLFxuICAgICAgICAgIGNvbXByZXNzaW9uUmF0aW8sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgICB9XG5cbiAgICAgIC8vIGxvZyhgUmFuZ2U6ICR7c3RhcnR9LSR7ZW5kfSAoc2Nyb2xsOiAke3Njcm9sbFBvc2l0aW9ufSlgKTtcblxuICAgICAgLy8gU3RyYXRlZ2ljIGxvZyBmb3IgbGFzdCByYW5nZVxuICAgICAgLy8gaWYgKGVuZCA+PSB0b3RhbEl0ZW1zIC0gMTApIHtcbiAgICAgIC8vICAgY29uc29sZS5sb2coXG4gICAgICAvLyAgICAgYFtWaXJ0dWFsXSBOZWFyIGVuZCByYW5nZTogJHtzdGFydH0tJHtlbmR9LCB0b3RhbEl0ZW1zPSR7dG90YWxJdGVtc30sIGxhc3RJdGVtUG9zPSR7XG4gICAgICAvLyAgICAgICBlbmQgKiB2aWV3cG9ydFN0YXRlLml0ZW1TaXplXG4gICAgICAvLyAgICAgfXB4LCB2aXJ0dWFsU2l6ZT0ke3ZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZX1weGBcbiAgICAgIC8vICAgKTtcbiAgICAgIC8vIH1cblxuICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICAgIH07XG5cbiAgICAvLyBDYWxjdWxhdGUgYWN0dWFsIHZpc2libGUgcmFuZ2UgKHdpdGhvdXQgb3ZlcnNjYW4gYnVmZmVyKVxuICAgIGNvbnN0IGNhbGN1bGF0ZUFjdHVhbFZpc2libGVSYW5nZSA9IChzY3JvbGxQb3NpdGlvbjogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUpIHJldHVybiB7IHN0YXJ0OiAwLCBlbmQ6IDAgfTtcblxuICAgICAgY29uc3QgeyBjb250YWluZXJTaXplLCB0b3RhbEl0ZW1zIH0gPSB2aWV3cG9ydFN0YXRlO1xuICAgICAgaWYgKCFjb250YWluZXJTaXplIHx8ICF0b3RhbEl0ZW1zKSByZXR1cm4geyBzdGFydDogMCwgZW5kOiAwIH07XG5cbiAgICAgIGNvbnN0IGl0ZW1TaXplID0gdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZTtcbiAgICAgIGNvbnN0IHZpc2libGVDb3VudCA9IE1hdGguY2VpbChjb250YWluZXJTaXplIC8gaXRlbVNpemUpO1xuICAgICAgY29uc3QgY29tcHJlc3Npb25SYXRpbyA9IHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZVxuICAgICAgICA/ICh0b3RhbEl0ZW1zICogaXRlbVNpemUpIC8gdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplXG4gICAgICAgIDogMTtcblxuICAgICAgbGV0IHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyO1xuXG4gICAgICBpZiAoY29tcHJlc3Npb25SYXRpbyA8IDEpIHtcbiAgICAgICAgLy8gQ29tcHJlc3NlZCBzcGFjZSAtIGNhbGN1bGF0ZSBiYXNlZCBvbiBzY3JvbGwgcmF0aW9cbiAgICAgICAgY29uc3QgdmlydHVhbFNpemUgPVxuICAgICAgICAgIHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZSB8fCB0b3RhbEl0ZW1zICogaXRlbVNpemU7XG4gICAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsU2l6ZTtcbiAgICAgICAgc3RhcnQgPSBNYXRoLmZsb29yKHNjcm9sbFJhdGlvICogdG90YWxJdGVtcyk7XG4gICAgICAgIGVuZCA9IE1hdGgubWluKHRvdGFsSXRlbXMgLSAxLCBzdGFydCArIHZpc2libGVDb3VudCAtIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRGlyZWN0IGNhbGN1bGF0aW9uXG4gICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihzY3JvbGxQb3NpdGlvbiAvIGl0ZW1TaXplKTtcbiAgICAgICAgZW5kID0gTWF0aC5taW4odG90YWxJdGVtcyAtIDEsIHN0YXJ0ICsgdmlzaWJsZUNvdW50IC0gMSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVuc3VyZSB2YWxpZCByYW5nZVxuICAgICAgc3RhcnQgPSBNYXRoLm1heCgwLCBzdGFydCk7XG4gICAgICBlbmQgPSBNYXRoLm1heChzdGFydCwgZW5kKTtcblxuICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICAgIH07XG5cbiAgICAvLyBVcGRhdGUgZnVuY3Rpb25zXG4gICAgY29uc3QgdXBkYXRlVmlzaWJsZVJhbmdlID0gKHNjcm9sbFBvc2l0aW9uOiBudW1iZXIpID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSkgcmV0dXJuO1xuICAgICAgdmlld3BvcnRTdGF0ZS52aXNpYmxlUmFuZ2UgPSBjYWxjdWxhdGVWaXNpYmxlUmFuZ2Uoc2Nyb2xsUG9zaXRpb24pO1xuXG4gICAgICAvLyBERUJVRzogTG9nIHdobyBjYWxscyB1cGRhdGVWaXNpYmxlUmFuZ2Ugd2l0aCAwIHdoZW4gaXQgc2hvdWxkIGJlIG5vbi16ZXJvXG5cbiAgICAgIC8vIENhbGN1bGF0ZSBhY3R1YWwgdmlzaWJsZSByYW5nZSAod2l0aG91dCBvdmVyc2NhbikgZm9yIFVJIGRpc3BsYXlcbiAgICAgIGNvbnN0IGFjdHVhbFZpc2libGVSYW5nZSA9IGNhbGN1bGF0ZUFjdHVhbFZpc2libGVSYW5nZShzY3JvbGxQb3NpdGlvbik7XG5cbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgcmFuZ2U6IHZpZXdwb3J0U3RhdGUudmlzaWJsZVJhbmdlLFxuICAgICAgICB2aXNpYmxlUmFuZ2U6IGFjdHVhbFZpc2libGVSYW5nZSxcbiAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIHRvdGFsIHZpcnR1YWwgc2l6ZVxuICAgIGNvbnN0IHVwZGF0ZVRvdGFsVmlydHVhbFNpemUgPSAodG90YWxJdGVtczogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUpIHJldHVybjtcblxuICAgICAgY29uc3Qgb2xkU2l6ZSA9IHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZTtcbiAgICAgIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyA9IHRvdGFsSXRlbXM7XG4gICAgICBjb25zdCBhY3R1YWxTaXplID0gdG90YWxJdGVtcyAqIHZpZXdwb3J0U3RhdGUuaXRlbVNpemU7XG5cbiAgICAgIC8vIEdldCBwYWRkaW5nIGZyb20gdGhlIGl0ZW1zIGNvbnRhaW5lciBpZiBhdmFpbGFibGVcbiAgICAgIGxldCB0b3RhbFBhZGRpbmcgPSAwO1xuICAgICAgaWYgKHZpZXdwb3J0U3RhdGUuaXRlbXNDb250YWluZXIpIHtcbiAgICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKFxuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuaXRlbXNDb250YWluZXIsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdUb3AgPSBwYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUucGFkZGluZ1RvcCkgfHwgMDtcbiAgICAgICAgY29uc3QgcGFkZGluZ0JvdHRvbSA9IHBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5wYWRkaW5nQm90dG9tKSB8fCAwO1xuICAgICAgICB0b3RhbFBhZGRpbmcgPSBwYWRkaW5nVG9wICsgcGFkZGluZ0JvdHRvbTtcbiAgICAgIH1cblxuICAgICAgLy8gSW5jbHVkZSBwYWRkaW5nIGluIHRoZSB2aXJ0dWFsIHNpemVcbiAgICAgIHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZSA9IE1hdGgubWluKFxuICAgICAgICBhY3R1YWxTaXplICsgdG90YWxQYWRkaW5nLFxuICAgICAgICBNQVhfVklSVFVBTF9TSVpFLFxuICAgICAgKTtcblxuICAgICAgLy8gU3RyYXRlZ2ljIGxvZyBmb3IgZGVidWdnaW5nIGdhcCBpc3N1ZVxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbVmlydHVhbF0gVG90YWwgc2l6ZSB1cGRhdGU6IGl0ZW1zPSR7dG90YWxJdGVtc30sIGl0ZW1TaXplPSR7dmlld3BvcnRTdGF0ZS5pdGVtU2l6ZX1weCwgcGFkZGluZz0ke3RvdGFsUGFkZGluZ31weCwgdmlydHVhbFNpemU9JHt2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemV9cHggKHdhcyAke29sZFNpemV9cHgpYFxuICAgICAgLy8gKTtcblxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnZpcnR1YWwtc2l6ZS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZTogdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplLFxuICAgICAgICB0b3RhbEl0ZW1zOiB0b3RhbEl0ZW1zLFxuICAgICAgICBjb21wcmVzc2lvblJhdGlvOiBnZXRDb21wcmVzc2lvblJhdGlvKCksXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIGNvbnRhaW5lciBzaXplXG4gICAgY29uc3QgdXBkYXRlQ29udGFpbmVyU2l6ZSA9ICgpID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSB8fCAhdmlld3BvcnRTdGF0ZS52aWV3cG9ydEVsZW1lbnQpIHJldHVybjtcblxuICAgICAgY29uc3Qgc2l6ZSA9XG4gICAgICAgIHZpZXdwb3J0U3RhdGUudmlld3BvcnRFbGVtZW50W1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUub3JpZW50YXRpb24gPT09IFwiaG9yaXpvbnRhbFwiXG4gICAgICAgICAgICA/IFwib2Zmc2V0V2lkdGhcIlxuICAgICAgICAgICAgOiBcIm9mZnNldEhlaWdodFwiXG4gICAgICAgIF07XG5cbiAgICAgIC8vIExvZyB0aGUgYWN0dWFsIG1lYXN1cmVtZW50XG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtWaXJ0dWFsXSBDb250YWluZXIgc2l6ZSBtZWFzdXJlZDogJHtzaXplfXB4IGZyb20gdmlld3BvcnQgZWxlbWVudGBcbiAgICAgIC8vICk7XG5cbiAgICAgIGlmIChzaXplICE9PSB2aWV3cG9ydFN0YXRlLmNvbnRhaW5lclNpemUpIHtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS5jb250YWluZXJTaXplID0gc2l6ZTtcbiAgICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG4gICAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUodmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zKTsgLy8gQWxzbyB1cGRhdGUgdmlydHVhbCBzaXplXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpjb250YWluZXItc2l6ZS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgICBjb250YWluZXJTaXplOiBzaXplLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gT3ZlcnJpZGUgdmlld3BvcnQgbWV0aG9kc1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5nZXRWaXNpYmxlUmFuZ2UgPSAoKSA9PlxuICAgICAgdmlld3BvcnRTdGF0ZT8udmlzaWJsZVJhbmdlIHx8XG4gICAgICBjYWxjdWxhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZT8uc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG5cbiAgICAvLyBFdmVudCBsaXN0ZW5lcnNcbiAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnNjcm9sbFwiLCAoZGF0YTogYW55KSA9PlxuICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKGRhdGEucG9zaXRpb24pLFxuICAgICk7XG5cbiAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0Oml0ZW1zLWNoYW5nZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKGRhdGEudG90YWxJdGVtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUoZGF0YS50b3RhbEl0ZW1zKTtcbiAgICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGU/LnNjcm9sbFBvc2l0aW9uIHx8IDApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gTGlzdGVuIGZvciB0b3RhbCBpdGVtcyBjaGFuZ2VzIChpbXBvcnRhbnQgZm9yIGN1cnNvciBwYWdpbmF0aW9uKVxuICAgIC8vIE5vdGU6IHNldFRvdGFsSXRlbXMoKSB1cGRhdGVzIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyBCRUZPUkUgZW1pdHRpbmcgdGhpcyBldmVudCxcbiAgICAvLyBzbyB3ZSBjYW4ndCByZWx5IG9uIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyB0byBkZXRlY3QgdGhlIGZpcnN0IHRvdGFsLlxuICAgIC8vIEluc3RlYWQgd2UgdXNlIHRoZSBoYXNSZWNhbGN1bGF0ZWRTY3JvbGxGb3JDb21wcmVzc2lvbiBmbGFnLlxuICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6dG90YWwtaXRlbXMtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICBpZiAoZGF0YS50b3RhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICAgIC8vIEZJWDogV2hlbiB3ZSBmaXJzdCByZWNlaXZlIHRvdGFsSXRlbXMgd2l0aCBpbml0aWFsU2Nyb2xsSW5kZXggYW5kIGNvbXByZXNzaW9uLFxuICAgICAgLy8gcmVjYWxjdWxhdGUgc2Nyb2xsIHBvc2l0aW9uIHRvIGFjY291bnQgZm9yIGNvbXByZXNzaW9uLlxuICAgICAgLy8gV2l0aG91dCB0aGlzLCBpbml0aWFsU2Nyb2xsSW5kZXggY2FsY3VsYXRlcyBwb3NpdGlvbiBhcyBpbmRleCAqIGl0ZW1TaXplLFxuICAgICAgLy8gYnV0IHJlbmRlcmluZyB1c2VzIGNvbXByZXNzZWQgc3BhY2UsIGNhdXNpbmcgaXRlbXMgdG8gYXBwZWFyIG9mZi1zY3JlZW4uXG4gICAgICAvL1xuICAgICAgLy8gV2UgY2hlY2sgdGhpcyBCRUZPUkUgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZSBiZWNhdXNlIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGVcbiAgICAgIC8vIHNjcm9sbCBwb3NpdGlvbiBiYXNlZCBvbiB0aGUgbmV3IHRvdGFsLCBhbmQgdGhlIGZsYWcgZW5zdXJlcyB3ZSBvbmx5IGRvIHRoaXMgb25jZS5cbiAgICAgIGlmIChcbiAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4ID4gMCAmJlxuICAgICAgICAhaGFzUmVjYWxjdWxhdGVkU2Nyb2xsRm9yQ29tcHJlc3Npb24gJiZcbiAgICAgICAgZGF0YS50b3RhbCA+IDBcbiAgICAgICkge1xuICAgICAgICBjb25zdCBhY3R1YWxUb3RhbFNpemUgPSBkYXRhLnRvdGFsICogdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZTtcbiAgICAgICAgY29uc3QgaXNDb21wcmVzc2VkID0gYWN0dWFsVG90YWxTaXplID4gTUFYX1ZJUlRVQUxfU0laRTtcblxuICAgICAgICBpZiAoaXNDb21wcmVzc2VkKSB7XG4gICAgICAgICAgLy8gUmVjYWxjdWxhdGUgc2Nyb2xsIHBvc2l0aW9uIHVzaW5nIGNvbXByZXNzaW9uLWF3YXJlIGZvcm11bGFcbiAgICAgICAgICAvLyBTYW1lIGZvcm11bGEgdXNlZCBpbiBzY3JvbGxUb0luZGV4XG4gICAgICAgICAgY29uc3QgcmF0aW8gPSBpbml0aWFsU2Nyb2xsSW5kZXggLyBkYXRhLnRvdGFsO1xuICAgICAgICAgIGNvbnN0IGNvbXByZXNzZWRQb3NpdGlvbiA9IHJhdGlvICogTUFYX1ZJUlRVQUxfU0laRTtcblxuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPSBjb21wcmVzc2VkUG9zaXRpb247XG5cbiAgICAgICAgICAvLyBOb3RpZnkgc2Nyb2xsaW5nIGZlYXR1cmUgdG8gc3luYyBpdHMgbG9jYWwgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnNjcm9sbC1wb3NpdGlvbi1zeW5jXCIsIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBjb21wcmVzc2VkUG9zaXRpb24sXG4gICAgICAgICAgICBzb3VyY2U6IFwiY29tcHJlc3Npb24tcmVjYWxjdWxhdGlvblwiLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gQ2xlYXIgdGFyZ2V0U2Nyb2xsSW5kZXggc2luY2Ugd2UndmUgbm93IGNvcnJlY3RseSBjYWxjdWxhdGVkIHRoZSBzY3JvbGwgcG9zaXRpb25cbiAgICAgICAgICAvLyBUaGUgbm9ybWFsIGNvbXByZXNzZWQgc2Nyb2xsaW5nIGZvcm11bGEgd2lsbCBub3cgd29yayBjb3JyZWN0bHlcbiAgICAgICAgICBkZWxldGUgKHZpZXdwb3J0U3RhdGUgYXMgYW55KS50YXJnZXRTY3JvbGxJbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hcmsgYXMgZG9uZSBldmVuIGlmIG5vdCBjb21wcmVzc2VkIC0gd2Ugb25seSB3YW50IHRvIGRvIHRoaXMgY2hlY2sgb25jZVxuICAgICAgICBoYXNSZWNhbGN1bGF0ZWRTY3JvbGxGb3JDb21wcmVzc2lvbiA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUoZGF0YS50b3RhbCk7XG4gICAgICB1cGRhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZT8uc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG5cbiAgICAgIC8vIFRyaWdnZXIgYSByZW5kZXIgdG8gdXBkYXRlIHRoZSB2aWV3XG4gICAgICBjb21wb25lbnQudmlld3BvcnQ/LnJlbmRlckl0ZW1zPy4oKTtcbiAgICB9KTtcblxuICAgIC8vIExpc3RlbiBmb3IgY29udGFpbmVyIHNpemUgY2hhbmdlcyB0byByZWNhbGN1bGF0ZSB2aXJ0dWFsIHNpemVcbiAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OmNvbnRhaW5lci1zaXplLWNoYW5nZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKHZpZXdwb3J0U3RhdGUgJiYgZGF0YS5jb250YWluZXJTaXplICE9PSB2aWV3cG9ydFN0YXRlLmNvbnRhaW5lclNpemUpIHtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS5jb250YWluZXJTaXplID0gZGF0YS5jb250YWluZXJTaXplO1xuICAgICAgICAvLyBSZWNhbGN1bGF0ZSB2aXJ0dWFsIHNpemUgd2l0aCBuZXcgY29udGFpbmVyIHNpemVcbiAgICAgICAgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZSh2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMpO1xuICAgICAgICB1cGRhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiB8fCAwKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbXBvbmVudC5vbj8uKFwiY29sbGVjdGlvbjpyYW5nZS1sb2FkZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBkYXRhLnRvdGFsICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgZGF0YS50b3RhbCAhPT0gdmlld3BvcnRTdGF0ZT8udG90YWxJdGVtc1xuICAgICAgKSB7XG4gICAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUoZGF0YS50b3RhbCk7XG4gICAgICB9XG4gICAgICB1cGRhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZT8uc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG4gICAgICBjb21wb25lbnQudmlld3BvcnQ/LnJlbmRlckl0ZW1zPy4oKTtcbiAgICB9KTtcblxuICAgIC8vIExpc3RlbiBmb3IgZmlyc3QgaXRlbXMgcmVuZGVyZWQgdG8gY2FsY3VsYXRlIGl0ZW0gc2l6ZSAoaWYgYXV0by1kZXRlY3Rpb24gaXMgZW5hYmxlZClcbiAgICBpZiAoYXV0b0RldGVjdEl0ZW1TaXplKSB7XG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0Oml0ZW1zLXJlbmRlcmVkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFoYXNDYWxjdWxhdGVkSXRlbVNpemUgJiZcbiAgICAgICAgICBkYXRhLmVsZW1lbnRzPy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgdmlld3BvcnRTdGF0ZVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBDYWxjdWxhdGUgYXZlcmFnZSBpdGVtIHNpemUgZnJvbSBmaXJzdCByZW5kZXJlZCBiYXRjaFxuICAgICAgICAgIGNvbnN0IHNpemVzOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICAgIGNvbnN0IHNpemVQcm9wZXJ0eSA9XG4gICAgICAgICAgICBvcmllbnRhdGlvbiA9PT0gXCJob3Jpem9udGFsXCIgPyBcIm9mZnNldFdpZHRoXCIgOiBcIm9mZnNldEhlaWdodFwiO1xuXG4gICAgICAgICAgZGF0YS5lbGVtZW50cy5mb3JFYWNoKChlbGVtZW50OiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IGVsZW1lbnRbc2l6ZVByb3BlcnR5XTtcbiAgICAgICAgICAgIGlmIChzaXplID4gMCkge1xuICAgICAgICAgICAgICBzaXplcy5wdXNoKHNpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHNpemVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGF2Z1NpemUgPSBNYXRoLnJvdW5kKFxuICAgICAgICAgICAgICBzaXplcy5yZWR1Y2UoKHN1bSwgc2l6ZSkgPT4gc3VtICsgc2l6ZSwgMCkgLyBzaXplcy5sZW5ndGgsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNJdGVtU2l6ZSA9IHZpZXdwb3J0U3RhdGUuaXRlbVNpemU7XG4gICAgICAgICAgICB2aWV3cG9ydFN0YXRlLml0ZW1TaXplID0gYXZnU2l6ZTtcblxuICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBpbml0aWFsU2Nyb2xsSW5kZXgsIHJlY2FsY3VsYXRlIHNjcm9sbCBwb3NpdGlvblxuICAgICAgICAgICAgLy8gYmFzZWQgb24gdGhlIG5ld2x5IGRldGVjdGVkIGl0ZW0gc2l6ZVxuICAgICAgICAgICAgaWYgKGluaXRpYWxTY3JvbGxJbmRleCA+IDAgJiYgYXZnU2l6ZSAhPT0gcHJldmlvdXNJdGVtU2l6ZSkge1xuICAgICAgICAgICAgICBjb25zdCBuZXdTY3JvbGxQb3NpdGlvbiA9IGluaXRpYWxTY3JvbGxJbmRleCAqIGF2Z1NpemU7XG4gICAgICAgICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPSBuZXdTY3JvbGxQb3NpdGlvbjtcblxuICAgICAgICAgICAgICAvLyBOb3RpZnkgc2Nyb2xsaW5nIGZlYXR1cmUgdG8gc3luYyBpdHMgbG9jYWwgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpzY3JvbGwtcG9zaXRpb24tc3luY1wiLCB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IG5ld1Njcm9sbFBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogXCJpdGVtLXNpemUtZGV0ZWN0ZWRcIixcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlY2FsY3VsYXRlIGV2ZXJ5dGhpbmcgd2l0aCBuZXcgc2l6ZVxuICAgICAgICAgICAgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZSh2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMpO1xuICAgICAgICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG5cbiAgICAgICAgICAgIC8vIFJlLXJlbmRlciB0byBhZGp1c3QgcG9zaXRpb25zXG4gICAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQ/LnJlbmRlckl0ZW1zPy4oKTtcblxuICAgICAgICAgICAgLy8gRW1pdCBldmVudCBmb3Igc2l6ZSBjaGFuZ2VcbiAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDppdGVtLXNpemUtZGV0ZWN0ZWRcIiwge1xuICAgICAgICAgICAgICBwcmV2aW91c1NpemU6IGluaXRpYWxJdGVtU2l6ZSxcbiAgICAgICAgICAgICAgZGV0ZWN0ZWRTaXplOiBhdmdTaXplLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGhhc0NhbGN1bGF0ZWRJdGVtU2l6ZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBFeHBvc2UgdmlydHVhbCBBUElcbiAgICBjb25zdCBjb21wcmVzc2lvblJhdGlvID0gZ2V0Q29tcHJlc3Npb25SYXRpbygpO1xuICAgIChjb21wb25lbnQgYXMgYW55KS52aXJ0dWFsID0ge1xuICAgICAgY2FsY3VsYXRlVmlzaWJsZVJhbmdlLFxuICAgICAgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZSxcbiAgICAgIGdldFRvdGFsVmlydHVhbFNpemU6ICgpID0+IHZpZXdwb3J0U3RhdGU/LnZpcnR1YWxUb3RhbFNpemUgfHwgMCxcbiAgICAgIGdldENvbnRhaW5lclNpemU6ICgpID0+IHZpZXdwb3J0U3RhdGU/LmNvbnRhaW5lclNpemUgfHwgMCxcbiAgICAgIHVwZGF0ZUNvbnRhaW5lclNpemU6IChzaXplOiBudW1iZXIpID0+IHtcbiAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLmNvbnRhaW5lclNpemUgPSBzaXplO1xuICAgICAgICAgIHVwZGF0ZVZpc2libGVSYW5nZSh2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uIHx8IDApO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZ2V0SXRlbVNpemU6ICgpID0+IHZpZXdwb3J0U3RhdGU/Lml0ZW1TaXplIHx8IGluaXRpYWxJdGVtU2l6ZSxcbiAgICAgIGNhbGN1bGF0ZUluZGV4RnJvbVBvc2l0aW9uOiAocG9zaXRpb246IG51bWJlcikgPT5cbiAgICAgICAgTWF0aC5mbG9vcihcbiAgICAgICAgICBwb3NpdGlvbiAvXG4gICAgICAgICAgICAoKHZpZXdwb3J0U3RhdGU/Lml0ZW1TaXplIHx8IGluaXRpYWxJdGVtU2l6ZSkgKiBjb21wcmVzc2lvblJhdGlvKSxcbiAgICAgICAgKSxcbiAgICAgIGNhbGN1bGF0ZVBvc2l0aW9uRm9ySW5kZXg6IChpbmRleDogbnVtYmVyKSA9PlxuICAgICAgICBpbmRleCAqICh2aWV3cG9ydFN0YXRlPy5pdGVtU2l6ZSB8fCBpbml0aWFsSXRlbVNpemUpICogY29tcHJlc3Npb25SYXRpbyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8qKlxuICogU2Nyb2xsaW5nIEZlYXR1cmUgLSBWaXJ0dWFsIHNjcm9sbGluZyB3aXRoIGludGVncmF0ZWQgdmVsb2NpdHkgdHJhY2tpbmdcbiAqIEhhbmRsZXMgd2hlZWwgZXZlbnRzLCB0b3VjaC9tb3VzZSBldmVudHMsIHNjcm9sbCBwb3NpdGlvbiBtYW5hZ2VtZW50LCB2ZWxvY2l0eSBtZWFzdXJlbWVudCwgYW5kIG1vbWVudHVtIHNjcm9sbGluZ1xuICovXG5cbmltcG9ydCB0eXBlIHsgVmlld3BvcnRDb250ZXh0LCBWaWV3cG9ydENvbXBvbmVudCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVklFV1BPUlRfQ09OU1RBTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgd3JhcEluaXRpYWxpemUsIGdldFZpZXdwb3J0U3RhdGUsIGNsYW1wIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTY3JvbGxpbmdDb25maWcge1xuICBvcmllbnRhdGlvbj86IFwidmVydGljYWxcIiB8IFwiaG9yaXpvbnRhbFwiO1xuICBzZW5zaXRpdml0eT86IG51bWJlcjtcbiAgc21vb3RoaW5nPzogYm9vbGVhbjtcbiAgaWRsZVRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKiBTdG9wIHNjcm9sbGluZyB3aGVuIGNsaWNraW5nIG9uIHRoZSB2aWV3cG9ydCAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgc3RvcE9uQ2xpY2s/OiBib29sZWFuO1xufVxuXG4vLyBTcGVlZCB0cmFja2VyIGludGVyZmFjZVxuaW50ZXJmYWNlIFNwZWVkVHJhY2tlciB7XG4gIHZlbG9jaXR5OiBudW1iZXI7XG4gIGxhc3RQb3NpdGlvbjogbnVtYmVyO1xuICBsYXN0VGltZTogbnVtYmVyO1xuICBkaXJlY3Rpb246IFwiZm9yd2FyZFwiIHwgXCJiYWNrd2FyZFwiO1xuICBzYW1wbGVzOiBBcnJheTx7IHBvc2l0aW9uOiBudW1iZXI7IHRpbWU6IG51bWJlciB9Pjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHNwZWVkIHRyYWNrZXJcbiAqL1xuY29uc3QgY3JlYXRlU3BlZWRUcmFja2VyID0gKCk6IFNwZWVkVHJhY2tlciA9PiAoe1xuICB2ZWxvY2l0eTogMCxcbiAgbGFzdFBvc2l0aW9uOiAwLFxuICBsYXN0VGltZTogRGF0ZS5ub3coKSxcbiAgZGlyZWN0aW9uOiBcImZvcndhcmRcIixcbiAgc2FtcGxlczogW10sXG59KTtcblxuLyoqXG4gKiBVcGRhdGVzIHNwZWVkIHRyYWNrZXIgd2l0aCBuZXcgcG9zaXRpb25cbiAqL1xuY29uc3QgdXBkYXRlU3BlZWRUcmFja2VyID0gKFxuICB0cmFja2VyOiBTcGVlZFRyYWNrZXIsXG4gIG5ld1Bvc2l0aW9uOiBudW1iZXIsXG4gIHByZXZpb3VzUG9zaXRpb246IG51bWJlcixcbik6IFNwZWVkVHJhY2tlciA9PiB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGNvbnN0IHRpbWVEZWx0YSA9IG5vdyAtIHRyYWNrZXIubGFzdFRpbWU7XG5cbiAgaWYgKHRpbWVEZWx0YSA9PT0gMCkgcmV0dXJuIHRyYWNrZXI7XG5cbiAgY29uc3QgcG9zaXRpb25EZWx0YSA9IG5ld1Bvc2l0aW9uIC0gcHJldmlvdXNQb3NpdGlvbjtcbiAgLy8gS2VlcCB2ZWxvY2l0eSBzaWduZWQgKHBvc2l0aXZlID0gZm9yd2FyZC9kb3duLCBuZWdhdGl2ZSA9IGJhY2t3YXJkL3VwKVxuICBjb25zdCBpbnN0YW50VmVsb2NpdHkgPSBwb3NpdGlvbkRlbHRhIC8gdGltZURlbHRhO1xuXG4gIC8vIEFkZCBuZXcgc2FtcGxlXG4gIGNvbnN0IHNhbXBsZXMgPSBbLi4udHJhY2tlci5zYW1wbGVzLCB7IHBvc2l0aW9uOiBuZXdQb3NpdGlvbiwgdGltZTogbm93IH1dO1xuXG4gIC8vIEtlZXAgb25seSByZWNlbnQgc2FtcGxlcyAobGFzdCAxMDBtcylcbiAgY29uc3QgcmVjZW50U2FtcGxlcyA9IHNhbXBsZXMuZmlsdGVyKChzKSA9PiBub3cgLSBzLnRpbWUgPCAxMDApO1xuXG4gIC8vIENhbGN1bGF0ZSBhdmVyYWdlIHZlbG9jaXR5IGZyb20gcmVjZW50IHNhbXBsZXMgKHByZXNlcnZpbmcgc2lnbi9kaXJlY3Rpb24pXG4gIGxldCBhdmdWZWxvY2l0eSA9IGluc3RhbnRWZWxvY2l0eTtcbiAgaWYgKHJlY2VudFNhbXBsZXMubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IG9sZGVzdFNhbXBsZSA9IHJlY2VudFNhbXBsZXNbMF07XG4gICAgY29uc3QgdG90YWxEaXN0YW5jZSA9IG5ld1Bvc2l0aW9uIC0gb2xkZXN0U2FtcGxlLnBvc2l0aW9uOyAvLyBTaWduZWQgZGlzdGFuY2VcbiAgICBjb25zdCB0b3RhbFRpbWUgPSBub3cgLSBvbGRlc3RTYW1wbGUudGltZTtcbiAgICBhdmdWZWxvY2l0eSA9IHRvdGFsVGltZSA+IDAgPyB0b3RhbERpc3RhbmNlIC8gdG90YWxUaW1lIDogaW5zdGFudFZlbG9jaXR5O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB2ZWxvY2l0eTogYXZnVmVsb2NpdHksXG4gICAgbGFzdFBvc2l0aW9uOiBuZXdQb3NpdGlvbixcbiAgICBsYXN0VGltZTogbm93LFxuICAgIGRpcmVjdGlvbjogcG9zaXRpb25EZWx0YSA+PSAwID8gXCJmb3J3YXJkXCIgOiBcImJhY2t3YXJkXCIsXG4gICAgc2FtcGxlczogcmVjZW50U2FtcGxlcyxcbiAgfTtcbn07XG5cbi8qKlxuICogU2Nyb2xsaW5nIGZlYXR1cmUgZm9yIHZpZXdwb3J0XG4gKiBIYW5kbGVzIHdoZWVsIGV2ZW50cywgdmVsb2NpdHkgdHJhY2tpbmcsIGFuZCBpZGxlIGRldGVjdGlvblxuICovXG5leHBvcnQgY29uc3Qgd2l0aFNjcm9sbGluZyA9IChjb25maWc6IFNjcm9sbGluZ0NvbmZpZyA9IHt9KSA9PiB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50Pihjb21wb25lbnQ6IFQpOiBUID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBvcmllbnRhdGlvbiA9IFwidmVydGljYWxcIixcbiAgICAgIHNlbnNpdGl2aXR5ID0gVklFV1BPUlRfQ09OU1RBTlRTLlZJUlRVQUxfU0NST0xMLlNDUk9MTF9TRU5TSVRJVklUWSxcbiAgICAgIHNtb290aGluZyA9IGZhbHNlLFxuICAgICAgaWRsZVRpbWVvdXQgPSAxMDAsIC8vIERlZmF1bHQgaWRsZSB0aW1lb3V0IGluIG1zXG4gICAgICBzdG9wT25DbGljayA9IHRydWUsIC8vIFN0b3Agc2Nyb2xsaW5nIG9uIGNsaWNrIGJ5IGRlZmF1bHRcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gU3RhdGVcbiAgICBsZXQgc2Nyb2xsUG9zaXRpb24gPSAwO1xuICAgIGxldCB0b3RhbFZpcnR1YWxTaXplID0gMDtcbiAgICBsZXQgY29udGFpbmVyU2l6ZSA9IDA7XG4gICAgbGV0IGlzU2Nyb2xsaW5nID0gZmFsc2U7XG4gICAgbGV0IGlzU2Nyb2xsZWRGcm9tVG9wID0gZmFsc2U7IC8vIFRyYWNrIGlmIHNjcm9sbGVkIGF3YXkgZnJvbSB0b3BcbiAgICBsZXQgbGFzdFNjcm9sbFRpbWUgPSAwO1xuICAgIGxldCBzcGVlZFRyYWNrZXIgPSBjcmVhdGVTcGVlZFRyYWNrZXIoKTtcbiAgICBsZXQgaWRsZVRpbWVvdXRJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGlkbGVDaGVja0ZyYW1lOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgbGFzdElkbGVDaGVja1Bvc2l0aW9uID0gMDtcbiAgICBsZXQgaGFzRW1pdHRlZElkbGUgPSBmYWxzZTsgLy8gVHJhY2sgaWYgd2UndmUgYWxyZWFkeSBlbWl0dGVkIGlkbGVcbiAgICBsZXQgYW5jaG9yUG9zaXRpb246IG51bWJlciB8IG51bGwgPSBudWxsOyAvLyBBbmNob3IgcG9zaXRpb24gdG8gbWFpbnRhaW4gb24gY2xpY2sgKGZvciBzdG9wT25DbGljaylcbiAgICBsZXQgYW5jaG9yVGltZSA9IDA7IC8vIFRpbWVzdGFtcCB3aGVuIGFuY2hvciB3YXMgc2V0XG4gICAgbGV0IGxhc3RXaGVlbFRpbWUgPSAwOyAvLyBUaW1lc3RhbXAgb2YgbGFzdCB3aGVlbCBldmVudCAoZm9yIGRldGVjdGluZyBnYXBzKVxuICAgIGxldCBhbmNob3JJbml0aWFsRGVsdGEgPSAwOyAvLyBJbml0aWFsIHdoZWVsIGRlbHRhIHdoZW4gYW5jaG9yIHdhcyBzZXQgKHRvIGRldGVjdCBkZWNheSlcbiAgICBsZXQgYW5jaG9yTGFzdERlbHRhID0gMDsgLy8gUHJldmlvdXMgd2hlZWwgZGVsdGEgKHRvIGRldGVjdCBpbmNyZWFzaW5nIGRlbHRhID0gbmV3IHNjcm9sbClcbiAgICBsZXQgYW5jaG9yTWluRGVsdGEgPSBJbmZpbml0eTsgLy8gTWluaW11bSBkZWx0YSBzZWVuIHNpbmNlIGFuY2hvciAodG8gZGV0ZWN0IHJlYWNjZWxlcmF0aW9uKVxuICAgIGxldCBjb25zZWN1dGl2ZUluY3JlYXNlcyA9IDA7IC8vIENvdW50IG9mIGNvbnNlY3V0aXZlIGRlbHRhIGluY3JlYXNlcyAodG8gZGV0ZWN0IHN1c3RhaW5lZCBuZXcgc2Nyb2xsaW5nKVxuICAgIGxldCBzdXN0YWluZWRIaWdoQ291bnQgPSAwOyAvLyBDb3VudCBvZiBldmVudHMgd2hlcmUgZGVsdGEgaXMgc2lnbmlmaWNhbnRseSBhYm92ZSBtaW5pbXVtIChzdXN0YWluZWQgbmV3IHNjcm9sbGluZylcblxuICAgIC8vIGNvbnNvbGUubG9nKGBbU2Nyb2xsaW5nXSBJbml0aWFsIHN0YXRlIC0gcG9zaXRpb246ICR7c2Nyb2xsUG9zaXRpb259YCk7XG5cbiAgICAvLyBUaHJlc2hvbGQgZm9yIGNvbnNpZGVyaW5nIHRoZSBsaXN0IFwic2Nyb2xsZWRcIiAoaW4gcGl4ZWxzKVxuICAgIGNvbnN0IFNDUk9MTEVEX1RIUkVTSE9MRCA9IDE7XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBzY3JvbGxlZCBzdGF0ZSBjbGFzcyBvbiB0aGUgdmxpc3QgY29udGFpbmVyXG4gICAgICogQWRkcyAtLXNjcm9sbGVkIG1vZGlmaWVyIHdoZW4gbGlzdCBpcyBub3QgYXQgdGhlIHRvcFxuICAgICAqL1xuICAgIGNvbnN0IHVwZGF0ZVNjcm9sbGVkU3RhdGUgPSAoXG4gICAgICB2aWV3cG9ydEVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgICAgcG9zaXRpb246IG51bWJlcixcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHNob3VsZEJlU2Nyb2xsZWQgPSBwb3NpdGlvbiA+IFNDUk9MTEVEX1RIUkVTSE9MRDtcbiAgICAgIGlmIChzaG91bGRCZVNjcm9sbGVkICE9PSBpc1Njcm9sbGVkRnJvbVRvcCkge1xuICAgICAgICBpc1Njcm9sbGVkRnJvbVRvcCA9IHNob3VsZEJlU2Nyb2xsZWQ7XG4gICAgICAgIC8vIEZpbmQgdGhlIHZsaXN0IGNvbnRhaW5lciAocGFyZW50IG9mIHZpZXdwb3J0KVxuICAgICAgICBjb25zdCB2bGlzdENvbnRhaW5lciA9IHZpZXdwb3J0RWxlbWVudC5jbG9zZXN0KFwiLm10cmwtdmxpc3RcIik7XG4gICAgICAgIGlmICh2bGlzdENvbnRhaW5lcikge1xuICAgICAgICAgIHZsaXN0Q29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUoXG4gICAgICAgICAgICBcIm10cmwtdmxpc3QtLXNjcm9sbGVkXCIsXG4gICAgICAgICAgICBzaG91bGRCZVNjcm9sbGVkLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gR2V0IHZpZXdwb3J0IHN0YXRlXG4gICAgbGV0IHZpZXdwb3J0U3RhdGU6IGFueTtcblxuICAgIC8vIFVzZSBzaGFyZWQgaW5pdGlhbGl6YXRpb24gd3JhcHBlclxuICAgIHdyYXBJbml0aWFsaXplKGNvbXBvbmVudCwgKCkgPT4ge1xuICAgICAgdmlld3BvcnRTdGF0ZSA9IGdldFZpZXdwb3J0U3RhdGUoY29tcG9uZW50KTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBzdGF0ZSB2YWx1ZXNcbiAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgIHRvdGFsVmlydHVhbFNpemUgPSB2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemUgfHwgMDtcbiAgICAgICAgY29udGFpbmVyU2l6ZSA9IHZpZXdwb3J0U3RhdGUuY29udGFpbmVyU2l6ZSB8fCAwO1xuICAgICAgICAvLyBTeW5jIHNjcm9sbFBvc2l0aW9uIGZyb20gdmlld3BvcnRTdGF0ZSAoaW1wb3J0YW50IGZvciBpbml0aWFsU2Nyb2xsSW5kZXgpXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID4gMCkge1xuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uID0gdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBMaXN0ZW4gZm9yIHZpcnR1YWwgc2l6ZSBjaGFuZ2VzXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnZpcnR1YWwtc2l6ZS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJbU2Nyb2xsaW5nXSBWaXJ0dWFsIHNpemUgY2hhbmdlZDpcIiwgZGF0YSk7XG4gICAgICAgIHVwZGF0ZVNjcm9sbEJvdW5kcyhkYXRhLnRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3Igc2Nyb2xsIHBvc2l0aW9uIGNoYW5nZXMgZnJvbSBvdGhlciBmZWF0dXJlcyAoZS5nLiwgdmlydHVhbC50cyBhZnRlciBpdGVtIHNpemUgZGV0ZWN0aW9uKVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpzY3JvbGwtcG9zaXRpb24tc3luY1wiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChkYXRhLnBvc2l0aW9uICE9PSB1bmRlZmluZWQgJiYgZGF0YS5wb3NpdGlvbiAhPT0gc2Nyb2xsUG9zaXRpb24pIHtcbiAgICAgICAgICBzY3JvbGxQb3NpdGlvbiA9IGRhdGEucG9zaXRpb247XG4gICAgICAgICAgLy8gQWxzbyB1cGRhdGUgbG9jYWwgdHJhY2tpbmcgdmFyc1xuICAgICAgICAgIHRvdGFsVmlydHVhbFNpemUgPVxuICAgICAgICAgICAgdmlld3BvcnRTdGF0ZT8udmlydHVhbFRvdGFsU2l6ZSB8fCB0b3RhbFZpcnR1YWxTaXplO1xuICAgICAgICAgIGNvbnRhaW5lclNpemUgPSB2aWV3cG9ydFN0YXRlPy5jb250YWluZXJTaXplIHx8IGNvbnRhaW5lclNpemU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGNvbnRhaW5lciBzaXplIGNoYW5nZXNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6Y29udGFpbmVyLXNpemUtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChkYXRhLmNvbnRhaW5lclNpemUpIHtcbiAgICAgICAgICBjb250YWluZXJTaXplID0gZGF0YS5jb250YWluZXJTaXplO1xuICAgICAgICAgIHVwZGF0ZVNjcm9sbEJvdW5kcyh0b3RhbFZpcnR1YWxTaXplLCBjb250YWluZXJTaXplKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEF0dGFjaCB3aGVlbCBldmVudCBsaXN0ZW5lciB0byB2aWV3cG9ydCBlbGVtZW50XG4gICAgICBjb25zdCB2aWV3cG9ydEVsZW1lbnQgPVxuICAgICAgICB2aWV3cG9ydFN0YXRlPy52aWV3cG9ydEVsZW1lbnQgfHwgKGNvbXBvbmVudCBhcyBhbnkpLnZpZXdwb3J0RWxlbWVudDtcbiAgICAgIGlmICh2aWV3cG9ydEVsZW1lbnQpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtTY3JvbGxpbmddIEF0dGFjaGluZyB3aGVlbCBldmVudCB0byB2aWV3cG9ydCBlbGVtZW50YCk7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwid2hlZWxcIiwgaGFuZGxlV2hlZWwsIHtcbiAgICAgICAgICBwYXNzaXZlOiBmYWxzZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBzY3JvbGxlZCBzdGF0ZSBiYXNlZCBvbiBjdXJyZW50IHNjcm9sbCBwb3NpdGlvblxuICAgICAgICB1cGRhdGVTY3JvbGxlZFN0YXRlKHZpZXdwb3J0RWxlbWVudCwgc2Nyb2xsUG9zaXRpb24pO1xuXG4gICAgICAgIC8vIEFkZCBtb3VzZWRvd24gbGlzdGVuZXIgdG8gc3RvcCBzY3JvbGxpbmcgb24gY2xpY2tcbiAgICAgICAgaWYgKHN0b3BPbkNsaWNrKSB7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgaGFuZGxlTW91c2VEb3duKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0b3JlIHJlZmVyZW5jZSBmb3IgY2xlYW51cFxuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuX3Njcm9sbGluZ1ZpZXdwb3J0RWxlbWVudCA9IHZpZXdwb3J0RWxlbWVudDtcbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLl9zY3JvbGxpbmdTdG9wT25DbGljayA9IHN0b3BPbkNsaWNrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbU2Nyb2xsaW5nXSBObyB2aWV3cG9ydCBlbGVtZW50IGZvdW5kIGZvciB3aGVlbCBldmVudHNgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFVzZSBjbGFtcCBmcm9tIHV0aWxzXG5cbiAgICAvLyBTdGFydCBpZGxlIGRldGVjdGlvblxuICAgIGNvbnN0IHN0YXJ0SWRsZURldGVjdGlvbiA9ICgpID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1Njcm9sbGluZ10gU3RhcnRpbmcgaWRsZSBkZXRlY3Rpb25cIik7XG5cbiAgICAgIC8vIFN0b3AgYW55IGV4aXN0aW5nIGlkbGUgZGV0ZWN0aW9uIGZpcnN0XG4gICAgICBpZiAoaWRsZUNoZWNrRnJhbWUgIT09IG51bGwpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWRsZUNoZWNrRnJhbWUpO1xuICAgICAgICBpZGxlQ2hlY2tGcmFtZSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGhhc0VtaXR0ZWRJZGxlID0gZmFsc2U7IC8vIFJlc2V0IGlkbGUgZW1pc3Npb24gZmxhZ1xuICAgICAgY29uc3QgY2hlY2tJZGxlID0gKCkgPT4ge1xuICAgICAgICBpZiAoc2Nyb2xsUG9zaXRpb24gPT09IGxhc3RJZGxlQ2hlY2tQb3NpdGlvbikge1xuICAgICAgICAgIC8vIFBvc2l0aW9uIGhhc24ndCBjaGFuZ2VkIC0gd2UncmUgaWRsZVxuICAgICAgICAgIGlmICghaGFzRW1pdHRlZElkbGUgJiYgKHNwZWVkVHJhY2tlci52ZWxvY2l0eSA+IDAgfHwgaXNTY3JvbGxpbmcpKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgXCJbU2Nyb2xsaW5nXSBJZGxlIGRldGVjdGVkIC0gcG9zaXRpb24gc3RhYmxlLCBzZXR0aW5nIHZlbG9jaXR5IHRvIHplcm9cIlxuICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgIGhhc0VtaXR0ZWRJZGxlID0gdHJ1ZTsgLy8gTWFyayB0aGF0IHdlJ3ZlIGVtaXR0ZWQgaWRsZVxuICAgICAgICAgICAgc2V0VmVsb2NpdHlUb1plcm8oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUG9zaXRpb24gY2hhbmdlZCwgcmVzZXQgdGhlIGZsYWdcbiAgICAgICAgICBoYXNFbWl0dGVkSWRsZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RJZGxlQ2hlY2tQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgICBpZGxlQ2hlY2tGcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShjaGVja0lkbGUpO1xuICAgICAgfTtcbiAgICAgIGlkbGVDaGVja0ZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNoZWNrSWRsZSk7XG4gICAgfTtcblxuICAgIC8vIFN0b3AgaWRsZSBkZXRlY3Rpb25cbiAgICBjb25zdCBzdG9wSWRsZURldGVjdGlvbiA9ICgpID0+IHtcbiAgICAgIGlmIChpZGxlQ2hlY2tGcmFtZSkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltTY3JvbGxpbmddIFN0b3BwaW5nIGlkbGUgZGV0ZWN0aW9uXCIpO1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShpZGxlQ2hlY2tGcmFtZSk7XG4gICAgICAgIGlkbGVDaGVja0ZyYW1lID0gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gU2V0IHZlbG9jaXR5IHRvIHplcm8gYW5kIGVtaXQgaWRsZSBldmVudFxuICAgIGNvbnN0IHNldFZlbG9jaXR5VG9aZXJvID0gKCkgPT4ge1xuICAgICAgLy8gU3RvcCBpZGxlIGRldGVjdGlvbiBzaW5jZSB3ZSdyZSBub3cgaWRsZVxuICAgICAgc3RvcElkbGVEZXRlY3Rpb24oKTtcblxuICAgICAgc3BlZWRUcmFja2VyID0gY3JlYXRlU3BlZWRUcmFja2VyKCk7XG4gICAgICBpc1Njcm9sbGluZyA9IGZhbHNlOyAvLyBSZXNldCBzY3JvbGxpbmcgc3RhdGVcblxuICAgICAgLy8gRW1pdCB2ZWxvY2l0eSBjaGFuZ2VcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDp2ZWxvY2l0eS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgdmVsb2NpdHk6IDAsXG4gICAgICAgIGRpcmVjdGlvbjogc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgIH0pO1xuXG4gICAgICAvLyBFbWl0IGlkbGUgc3RhdGVcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDppZGxlXCIsIHtcbiAgICAgICAgcG9zaXRpb246IHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICBsYXN0U2Nyb2xsVGltZSxcbiAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gVXBkYXRlIGNvbnRhaW5lciBwb3NpdGlvblxuICAgIGNvbnN0IHVwZGF0ZUNvbnRhaW5lclBvc2l0aW9uID0gKCkgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlIHx8ICF2aWV3cG9ydFN0YXRlLml0ZW1zQ29udGFpbmVyKSByZXR1cm47XG5cbiAgICAgIC8vIEl0ZW1zIGNvbnRhaW5lciBkb2Vzbid0IG1vdmUgLSBpdGVtcyBpbnNpZGUgaXQgYXJlIHBvc2l0aW9uZWRcbiAgICAgIC8vIFRoaXMgaXMgaGFuZGxlZCBieSB0aGUgcmVuZGVyaW5nIGZlYXR1cmVcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIG1vdXNlZG93biB0byBzdG9wIHNjcm9sbGluZyBvbiBjbGlja1xuICAgIGNvbnN0IGhhbmRsZU1vdXNlRG93biA9IChfZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgLy8gQW5jaG9yIHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbiAtIGFueSB3aGVlbCBldmVudHMgd2lsbCBiZSBmb3JjZWQgYmFjayB0byB0aGlzIHBvc2l0aW9uXG4gICAgICAvLyBUaGlzIGVsZWdhbnRseSBoYW5kbGVzIG1vdXNlIHdoZWVscyB3aXRoIHBoeXNpY2FsIGluZXJ0aWEgKGxpa2UgTG9naXRlY2ggZnJlZS1zcGluKVxuICAgICAgYW5jaG9yUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgIGFuY2hvclRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgYW5jaG9ySW5pdGlhbERlbHRhID0gMDsgLy8gV2lsbCBiZSBzZXQgYnkgZmlyc3Qgd2hlZWwgZXZlbnRcbiAgICAgIGFuY2hvckxhc3REZWx0YSA9IDA7XG4gICAgICBhbmNob3JNaW5EZWx0YSA9IEluZmluaXR5O1xuICAgICAgY29uc2VjdXRpdmVJbmNyZWFzZXMgPSAwO1xuICAgICAgc3VzdGFpbmVkSGlnaENvdW50ID0gMDtcblxuICAgICAgLy8gT25seSBzdG9wIGlmIHdlJ3JlIGN1cnJlbnRseSBzY3JvbGxpbmdcbiAgICAgIGlmIChpc1Njcm9sbGluZyB8fCBzcGVlZFRyYWNrZXIudmVsb2NpdHkgPiAwKSB7XG4gICAgICAgIHNldFZlbG9jaXR5VG9aZXJvKCk7XG4gICAgICB9XG4gICAgICAvLyBBbHNvIHN0b3AgbW9tZW50dW0gYW5pbWF0aW9uIGlmIGFjdGl2ZVxuICAgICAgY29uc3QgbW9tZW50dW1TdGF0ZSA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5tb21lbnR1bVN0YXRlO1xuICAgICAgaWYgKG1vbWVudHVtU3RhdGU/LnN0b3BNb21lbnR1bSkge1xuICAgICAgICBtb21lbnR1bVN0YXRlLnN0b3BNb21lbnR1bSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgd2hlZWwgZXZlbnRcbiAgICBjb25zdCBoYW5kbGVXaGVlbCA9IChldmVudDogV2hlZWxFdmVudCkgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgY29uc3QgZGVsdGEgPSBvcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiID8gZXZlbnQuZGVsdGFZIDogZXZlbnQuZGVsdGFYO1xuICAgICAgY29uc3Qgc2Nyb2xsRGVsdGEgPSBkZWx0YSAqIHNlbnNpdGl2aXR5O1xuXG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgdGltZVNpbmNlTGFzdFdoZWVsID0gbm93IC0gbGFzdFdoZWVsVGltZTtcbiAgICAgIGxhc3RXaGVlbFRpbWUgPSBub3c7XG5cbiAgICAgIC8vIElmIHdlIGhhdmUgYW4gYW5jaG9yIHBvc2l0aW9uICh1c2VyIGNsaWNrZWQgdG8gc3RvcCBzY3JvbGxpbmcpLFxuICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyBpbnRlbnRpb25hbCBuZXcgc2Nyb2xsaW5nIG9yIHJlc2lkdWFsIHdoZWVsIGluZXJ0aWFcbiAgICAgIGlmIChhbmNob3JQb3NpdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCB0aW1lU2luY2VBbmNob3IgPSBub3cgLSBhbmNob3JUaW1lO1xuICAgICAgICBjb25zdCB3aGVlbERlbHRhTWFnbml0dWRlID0gTWF0aC5hYnMoc2Nyb2xsRGVsdGEpO1xuXG4gICAgICAgIC8vIFRyYWNrIGluaXRpYWwgZGVsdGEgdG8gZGV0ZWN0IHdoZW4gaW5lcnRpYSBoYXMgZGVjYXllZFxuICAgICAgICBpZiAoYW5jaG9ySW5pdGlhbERlbHRhID09PSAwKSB7XG4gICAgICAgICAgYW5jaG9ySW5pdGlhbERlbHRhID0gd2hlZWxEZWx0YU1hZ25pdHVkZTtcbiAgICAgICAgICBhbmNob3JMYXN0RGVsdGEgPSB3aGVlbERlbHRhTWFnbml0dWRlO1xuICAgICAgICAgIGFuY2hvck1pbkRlbHRhID0gd2hlZWxEZWx0YU1hZ25pdHVkZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyYWNrIG1pbmltdW0gZGVsdGEgdG8gZGV0ZWN0IHJlYWNjZWxlcmF0aW9uICh1c2VyIHN0YXJ0ZWQgc2Nyb2xsaW5nIGFnYWluKVxuICAgICAgICBhbmNob3JNaW5EZWx0YSA9IE1hdGgubWluKGFuY2hvck1pbkRlbHRhLCB3aGVlbERlbHRhTWFnbml0dWRlKTtcblxuICAgICAgICAvLyBEZXRlY3QgaWYgZGVsdGEgaXMgaW5jcmVhc2luZyAodXNlciBzdGFydGVkIG5ldyBzY3JvbGwpXG4gICAgICAgIC8vIEluZXJ0aWEgb25seSBkZWNheXMsIHNvIGluY3JlYXNpbmcgZGVsdGEgPSBpbnRlbnRpb25hbCBuZXcgc2Nyb2xsaW5nXG4gICAgICAgIC8vIEJVVDogZmlsdGVyIG91dCBiYXRjaGVkIGV2ZW50cyB3aGVyZSBkZWx0YSBpcyB+MnggdGhlIGxhc3QgKGJyb3dzZXIgYmF0Y2hpbmcsIG5vdCByZWFsIGluY3JlYXNlKVxuICAgICAgICBjb25zdCBpc0JhdGNoZWRFdmVudCA9XG4gICAgICAgICAgd2hlZWxEZWx0YU1hZ25pdHVkZSA+IGFuY2hvckxhc3REZWx0YSAqIDEuOCAmJlxuICAgICAgICAgIHdoZWVsRGVsdGFNYWduaXR1ZGUgPCBhbmNob3JMYXN0RGVsdGEgKiAyLjI7XG5cbiAgICAgICAgLy8gVHJhY2sgY29uc2VjdXRpdmUgaW5jcmVhc2VzIC0gc3VzdGFpbmVkIGluY3JlYXNlcyBpbmRpY2F0ZSBuZXcgc2Nyb2xsaW5nXG4gICAgICAgIC8vIFVzZSAxJSB0aHJlc2hvbGQgdG8gY2F0Y2ggZ3JhZHVhbCBhY2NlbGVyYXRpb25cbiAgICAgICAgaWYgKCFpc0JhdGNoZWRFdmVudCAmJiB3aGVlbERlbHRhTWFnbml0dWRlID4gYW5jaG9yTGFzdERlbHRhICogMS4wMSkge1xuICAgICAgICAgIGNvbnNlY3V0aXZlSW5jcmVhc2VzKys7XG4gICAgICAgIH0gZWxzZSBpZiAod2hlZWxEZWx0YU1hZ25pdHVkZSA8IGFuY2hvckxhc3REZWx0YSAqIDAuOTkpIHtcbiAgICAgICAgICAvLyBEZWx0YSBkZWNyZWFzaW5nIC0gcmVzZXQgY291bnRlclxuICAgICAgICAgIGNvbnNlY3V0aXZlSW5jcmVhc2VzID0gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBkZWx0YSBpcyByb3VnaGx5IHRoZSBzYW1lICh3aXRoaW4gMSUpLCBkb24ndCBjaGFuZ2UgdGhlIGNvdW50ZXJcblxuICAgICAgICAvLyBUcmFjayBzdXN0YWluZWQgaGlnaCBkZWx0YSAoZGVsdGEgc2lnbmlmaWNhbnRseSBhYm92ZSBtaW5pbXVtIGZvciBtdWx0aXBsZSBldmVudHMpXG4gICAgICAgIC8vIFRoaXMgY2F0Y2hlcyB3aGVuIHVzZXIgc3RhcnRzIHNjcm9sbGluZyBidXQgZGVsdGEgcGxhdGVhdXMgaW5zdGVhZCBvZiBzdHJpY3RseSBpbmNyZWFzaW5nXG4gICAgICAgIGlmICghaXNCYXRjaGVkRXZlbnQgJiYgd2hlZWxEZWx0YU1hZ25pdHVkZSA+IGFuY2hvck1pbkRlbHRhICogMS4wNSkge1xuICAgICAgICAgIHN1c3RhaW5lZEhpZ2hDb3VudCsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN1c3RhaW5lZEhpZ2hDb3VudCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWxlYXNlIGlmOiAzKyBjb25zZWN1dGl2ZSBpbmNyZWFzZXMsIE9SIHN1c3RhaW5lZCBoaWdoIGRlbHRhLCBPUiBzaWduaWZpY2FudCBzaW5nbGUgaW5jcmVhc2VcbiAgICAgICAgY29uc3Qgc3VzdGFpbmVkSW5jcmVhc2UgPSBjb25zZWN1dGl2ZUluY3JlYXNlcyA+PSAzO1xuICAgICAgICBjb25zdCBzdXN0YWluZWRIaWdoID0gc3VzdGFpbmVkSGlnaENvdW50ID49IDU7IC8vIDUrIGV2ZW50cyBhdCA1JSsgYWJvdmUgbWluaW11bVxuICAgICAgICBjb25zdCBzaWduaWZpY2FudEluY3JlYXNlID1cbiAgICAgICAgICAhaXNCYXRjaGVkRXZlbnQgJiZcbiAgICAgICAgICB3aGVlbERlbHRhTWFnbml0dWRlID4gYW5jaG9yTWluRGVsdGEgKiAxLjE1ICYmIC8vIDE1JSBpbmNyZWFzZSBmcm9tIG1pbmltdW1cbiAgICAgICAgICB3aGVlbERlbHRhTWFnbml0dWRlID4gYW5jaG9yTGFzdERlbHRhICogMS4wODsgLy8gYW5kIDglIGluY3JlYXNpbmcgZnJvbSBsYXN0XG4gICAgICAgIGNvbnN0IGRlbHRhSW5jcmVhc2luZyA9XG4gICAgICAgICAgc3VzdGFpbmVkSW5jcmVhc2UgfHwgc3VzdGFpbmVkSGlnaCB8fCBzaWduaWZpY2FudEluY3JlYXNlO1xuXG4gICAgICAgIC8vIFJlbGVhc2UgYW5jaG9yIGlmOlxuICAgICAgICAvLyAxLiBUaGVyZSB3YXMgYSBnYXAgaW4gd2hlZWwgZXZlbnRzICg+IDIwMG1zKSAtIHVzZXIgc3RvcHBlZCBhbmQgc3RhcnRlZCBuZXcgc2Nyb2xsXG4gICAgICAgIC8vIDIuIERlbHRhIGlzIGluY3JlYXNpbmcgZnJvbSBtaW5pbXVtIC0gdXNlciBzdGFydGVkIHNjcm9sbGluZyBhZ2FpbiBkdXJpbmcgaW5lcnRpYVxuICAgICAgICAvLyAzLiBEZWx0YSBoYXMgZGVjYXllZCBzaWduaWZpY2FudGx5ICg8IDMwJSBvZiBpbml0aWFsKSAtIGluZXJ0aWEgaXMgd2luZGluZyBkb3duXG4gICAgICAgIC8vIDQuIExvdyBhYnNvbHV0ZSBkZWx0YSAoPCAzMCkgLSBnZW50bGUgaW50ZW50aW9uYWwgc2Nyb2xsXG4gICAgICAgIGNvbnN0IGhhc1doZWVsR2FwID0gdGltZVNpbmNlTGFzdFdoZWVsID4gMjAwO1xuICAgICAgICBjb25zdCBkZWx0YURlY2F5ZWQgPSB3aGVlbERlbHRhTWFnbml0dWRlIDwgYW5jaG9ySW5pdGlhbERlbHRhICogMC4zO1xuICAgICAgICBjb25zdCBpc0xvd0RlbHRhID0gd2hlZWxEZWx0YU1hZ25pdHVkZSA8IDMwO1xuXG4gICAgICAgIGlmIChoYXNXaGVlbEdhcCkge1xuICAgICAgICAgIC8vIFRpbWUgZ2FwIC0gdXNlciBzdG9wcGVkIGFuZCBzdGFydGVkIG5ldyBzY3JvbGxcbiAgICAgICAgICBhbmNob3JQb3NpdGlvbiA9IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoZGVsdGFJbmNyZWFzaW5nICYmIHRpbWVTaW5jZUFuY2hvciA+IDEwMCkge1xuICAgICAgICAgIC8vIERlbHRhIGluY3JlYXNpbmcgLSB1c2VyIHN0YXJ0ZWQgc2Nyb2xsaW5nIGFnYWluXG4gICAgICAgICAgYW5jaG9yUG9zaXRpb24gPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKGlzTG93RGVsdGEpIHtcbiAgICAgICAgICAvLyBWZXJ5IGxvdyBkZWx0YSAtIGdlbnRsZSBpbnRlbnRpb25hbCBzY3JvbGxcbiAgICAgICAgICBhbmNob3JQb3NpdGlvbiA9IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoZGVsdGFEZWNheWVkICYmIHRpbWVTaW5jZUFuY2hvciA+IDMwMCkge1xuICAgICAgICAgIC8vIERlbHRhIGhhcyBkZWNheWVkIGFuZCBzb21lIHRpbWUgcGFzc2VkIC0gaW5lcnRpYSBpcyBkb25lXG4gICAgICAgICAgYW5jaG9yUG9zaXRpb24gPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFN0aWxsIGluIGluZXJ0aWEgcGhhc2UgLSBzdGF5IGFuY2hvcmVkXG4gICAgICAgICAgaWYgKHNjcm9sbFBvc2l0aW9uICE9PSBhbmNob3JQb3NpdGlvbikge1xuICAgICAgICAgICAgc2Nyb2xsUG9zaXRpb24gPSBhbmNob3JQb3NpdGlvbjtcbiAgICAgICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBVcGRhdGUgbGFzdCBkZWx0YSBmb3IgbmV4dCBjb21wYXJpc29uXG4gICAgICAgICAgYW5jaG9yTGFzdERlbHRhID0gd2hlZWxEZWx0YU1hZ25pdHVkZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgbGFzdCBkZWx0YSBmb3IgbmV4dCBjb21wYXJpc29uXG4gICAgICAgIGFuY2hvckxhc3REZWx0YSA9IHdoZWVsRGVsdGFNYWduaXR1ZGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByZXZpb3VzUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgIGNvbnN0IG1heFNjcm9sbCA9IE1hdGgubWF4KDAsIHRvdGFsVmlydHVhbFNpemUgLSBjb250YWluZXJTaXplKTtcblxuICAgICAgbGV0IG5ld1Bvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb24gKyBzY3JvbGxEZWx0YTtcblxuICAgICAgLy8gQXBwbHkgc21vb3RoaW5nIGlmIGVuYWJsZWRcbiAgICAgIGlmIChzbW9vdGhpbmcpIHtcbiAgICAgICAgY29uc3Qgc21vb3RoaW5nRmFjdG9yID0gMC4zO1xuICAgICAgICBuZXdQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uICsgc2Nyb2xsRGVsdGEgKiBzbW9vdGhpbmdGYWN0b3I7XG4gICAgICB9XG5cbiAgICAgIG5ld1Bvc2l0aW9uID0gY2xhbXAobmV3UG9zaXRpb24sIDAsIG1heFNjcm9sbCk7XG5cbiAgICAgIGlmIChuZXdQb3NpdGlvbiAhPT0gc2Nyb2xsUG9zaXRpb24pIHtcbiAgICAgICAgc2Nyb2xsUG9zaXRpb24gPSBuZXdQb3NpdGlvbjtcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcblxuICAgICAgICAvLyBVcGRhdGUgc2Nyb2xsIHN0YXRlXG4gICAgICAgIGlmICghaXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICBpc1Njcm9sbGluZyA9IHRydWU7XG4gICAgICAgICAgLy8gU3RvcCBhbnkgZXhpc3RpbmcgaWRsZSBkZXRlY3Rpb24gYmVmb3JlIHN0YXJ0aW5nIG5ldyBvbmVcbiAgICAgICAgICBzdG9wSWRsZURldGVjdGlvbigpO1xuICAgICAgICAgIHN0YXJ0SWRsZURldGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RTY3JvbGxUaW1lID0gbm93O1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzcGVlZCB0cmFja2VyXG4gICAgICAgIHNwZWVkVHJhY2tlciA9IHVwZGF0ZVNwZWVkVHJhY2tlcihcbiAgICAgICAgICBzcGVlZFRyYWNrZXIsXG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgcHJldmlvdXNQb3NpdGlvbixcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBVcGRhdGUgdmlld3BvcnQgc3RhdGVcbiAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS52ZWxvY2l0eSA9IHNwZWVkVHJhY2tlci52ZWxvY2l0eTtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbERpcmVjdGlvbiA9IHNwZWVkVHJhY2tlci5kaXJlY3Rpb247XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgc2Nyb2xsZWQgc3RhdGUgY2xhc3NcbiAgICAgICAgY29uc3Qgdmlld3BvcnRFbCA9XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZT8udmlld3BvcnRFbGVtZW50IHx8IChjb21wb25lbnQgYXMgYW55KS52aWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgIGlmICh2aWV3cG9ydEVsKSB7XG4gICAgICAgICAgdXBkYXRlU2Nyb2xsZWRTdGF0ZSh2aWV3cG9ydEVsLCBzY3JvbGxQb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IGV2ZW50c1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6c2Nyb2xsXCIsIHtcbiAgICAgICAgICBwb3NpdGlvbjogc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgZGlyZWN0aW9uOiBzcGVlZFRyYWNrZXIuZGlyZWN0aW9uLFxuICAgICAgICAgIHByZXZpb3VzUG9zaXRpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDp2ZWxvY2l0eS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgICB2ZWxvY2l0eTogc3BlZWRUcmFja2VyLnZlbG9jaXR5LFxuICAgICAgICAgIGRpcmVjdGlvbjogc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVHJpZ2dlciByZW5kZXJcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnJlbmRlckl0ZW1zKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFNjcm9sbCB0byBwb3NpdGlvblxuICAgIGNvbnN0IHNjcm9sbFRvUG9zaXRpb24gPSAocG9zaXRpb246IG51bWJlciwgc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBtYXhTY3JvbGwgPSBNYXRoLm1heCgwLCB0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZSk7XG4gICAgICBjb25zdCBjbGFtcGVkUG9zaXRpb24gPSBjbGFtcChwb3NpdGlvbiwgMCwgbWF4U2Nyb2xsKTtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbU2Nyb2xsaW5nXSBzY3JvbGxUb1Bvc2l0aW9uOiBwb3M9JHtwb3NpdGlvbn0gLT4gJHtjbGFtcGVkUG9zaXRpb259LCBzb3VyY2U9JHtzb3VyY2V9LCBjdXJyZW50UG9zPSR7c2Nyb2xsUG9zaXRpb259LCB2ZWxvY2l0eT0ke3NwZWVkVHJhY2tlci52ZWxvY2l0eS50b0ZpeGVkKFxuICAgICAgLy8gICAgIDNcbiAgICAgIC8vICAgKX1gXG4gICAgICAvLyApO1xuXG4gICAgICBpZiAoY2xhbXBlZFBvc2l0aW9uICE9PSBzY3JvbGxQb3NpdGlvbikge1xuICAgICAgICBjb25zdCBwcmV2aW91c1Bvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICAgIHNjcm9sbFBvc2l0aW9uID0gY2xhbXBlZFBvc2l0aW9uO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzcGVlZCB0cmFja2VyIHRvIGNhbGN1bGF0ZSB2ZWxvY2l0eVxuICAgICAgICBzcGVlZFRyYWNrZXIgPSB1cGRhdGVTcGVlZFRyYWNrZXIoXG4gICAgICAgICAgc3BlZWRUcmFja2VyLFxuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgIHByZXZpb3VzUG9zaXRpb24sXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHZpZXdwb3J0IHN0YXRlXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUudmVsb2NpdHkgPSBzcGVlZFRyYWNrZXIudmVsb2NpdHk7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxEaXJlY3Rpb24gPSBzcGVlZFRyYWNrZXIuZGlyZWN0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID1cbiAgICAgICAgICBjbGFtcGVkUG9zaXRpb24gPiBwcmV2aW91c1Bvc2l0aW9uID8gXCJmb3J3YXJkXCIgOiBcImJhY2t3YXJkXCI7XG5cbiAgICAgICAgLy8gVXBkYXRlIHNjcm9sbGVkIHN0YXRlIGNsYXNzXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0RWwgPVxuICAgICAgICAgIHZpZXdwb3J0U3RhdGU/LnZpZXdwb3J0RWxlbWVudCB8fCAoY29tcG9uZW50IGFzIGFueSkudmlld3BvcnRFbGVtZW50O1xuICAgICAgICBpZiAodmlld3BvcnRFbCkge1xuICAgICAgICAgIHVwZGF0ZVNjcm9sbGVkU3RhdGUodmlld3BvcnRFbCwgc2Nyb2xsUG9zaXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBzY3JvbGwgZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnNjcm9sbFwiLCB7XG4gICAgICAgICAgcG9zaXRpb246IHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgICBwcmV2aW91c1Bvc2l0aW9uLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBFbWl0IHZlbG9jaXR5IGNoYW5nZSBldmVudCBzbyBjb2xsZWN0aW9uIGNhbiB0cmFjayBpdFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6dmVsb2NpdHktY2hhbmdlZFwiLCB7XG4gICAgICAgICAgdmVsb2NpdHk6IHNwZWVkVHJhY2tlci52ZWxvY2l0eSxcbiAgICAgICAgICBkaXJlY3Rpb246IHNwZWVkVHJhY2tlci5kaXJlY3Rpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzY3JvbGwgc3RhdGUgYW5kIGlkbGUgZGV0ZWN0aW9uXG4gICAgICAgIGlmICghaXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICBpc1Njcm9sbGluZyA9IHRydWU7XG4gICAgICAgICAgc3RhcnRJZGxlRGV0ZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFNjcm9sbFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIC8vIFRyaWdnZXIgcmVuZGVyXG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtTY3JvbGxpbmddIFBvc2l0aW9uIHVuY2hhbmdlZDogJHtzY3JvbGxQb3NpdGlvbn1gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtTY3JvbGxpbmddIFBvc2l0aW9uIHVuY2hhbmdlZDogJHtzY3JvbGxQb3NpdGlvbn0sIG5vdCByZXNldHRpbmcgaWRsZSB0aW1lb3V0YFxuICAgICAgICAvLyApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBTY3JvbGwgdG8gaW5kZXhcbiAgICBjb25zdCBzY3JvbGxUb0luZGV4ID0gKFxuICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgIGFsaWdubWVudDogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIsXG4gICAgKSA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtTY3JvbGxpbmddIHNjcm9sbFRvSW5kZXggY2FsbGVkOiBpbmRleD0ke2luZGV4fSwgYWxpZ25tZW50PSR7YWxpZ25tZW50fWBcbiAgICAgIC8vICk7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhgW1Njcm9sbGluZ10gc2Nyb2xsVG9JbmRleCBhYm9ydGVkOiBubyB2aWV3cG9ydCBzdGF0ZWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGl0ZW1TaXplID0gdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZSB8fCA1MDtcbiAgICAgIGNvbnN0IHRvdGFsSXRlbXMgPSB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgfHwgMDtcbiAgICAgIGNvbnN0IGFjdHVhbFRvdGFsU2l6ZSA9IHRvdGFsSXRlbXMgKiBpdGVtU2l6ZTtcbiAgICAgIGNvbnN0IE1BWF9WSVJUVUFMX1NJWkUgPVxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuVklSVFVBTF9TQ1JPTEwuTUFYX1ZJUlRVQUxfU0laRTtcbiAgICAgIGNvbnN0IGlzQ29tcHJlc3NlZCA9IGFjdHVhbFRvdGFsU2l6ZSA+IE1BWF9WSVJUVUFMX1NJWkU7XG5cbiAgICAgIGxldCB0YXJnZXRQb3NpdGlvbjogbnVtYmVyO1xuXG4gICAgICBpZiAoaXNDb21wcmVzc2VkKSB7XG4gICAgICAgIC8vIEluIGNvbXByZXNzZWQgc3BhY2UsIG1hcCBpbmRleCB0byB2aXJ0dWFsIHBvc2l0aW9uXG4gICAgICAgIGNvbnN0IHJhdGlvID0gaW5kZXggLyB0b3RhbEl0ZW1zO1xuICAgICAgICB0YXJnZXRQb3NpdGlvbiA9IHJhdGlvICogTWF0aC5taW4oYWN0dWFsVG90YWxTaXplLCBNQVhfVklSVFVBTF9TSVpFKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpcmVjdCBjYWxjdWxhdGlvbiB3aGVuIG5vdCBjb21wcmVzc2VkXG4gICAgICAgIHRhcmdldFBvc2l0aW9uID0gaW5kZXggKiBpdGVtU2l6ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRqdXN0IHBvc2l0aW9uIGJhc2VkIG9uIGFsaWdubWVudFxuICAgICAgc3dpdGNoIChhbGlnbm1lbnQpIHtcbiAgICAgICAgY2FzZSBcImNlbnRlclwiOlxuICAgICAgICAgIHRhcmdldFBvc2l0aW9uIC09IGNvbnRhaW5lclNpemUgLyAyIC0gaXRlbVNpemUgLyAyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgdGFyZ2V0UG9zaXRpb24gLT0gY29udGFpbmVyU2l6ZSAtIGl0ZW1TaXplO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtTY3JvbGxpbmddIFRhcmdldCBwb3NpdGlvbjogJHt0YXJnZXRQb3NpdGlvbn0sIGlzQ29tcHJlc3NlZDogJHtpc0NvbXByZXNzZWR9YFxuICAgICAgLy8gKTtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbU2Nyb2xsaW5nXSBTY3JvbGxUb0luZGV4OiBpbmRleD0ke2luZGV4fSwgcG9zaXRpb249JHt0YXJnZXRQb3NpdGlvbn0sIGFsaWdubWVudD0ke2FsaWdubWVudH1gXG4gICAgICAvLyApO1xuXG4gICAgICBzY3JvbGxUb1Bvc2l0aW9uKHRhcmdldFBvc2l0aW9uLCBcInNjcm9sbFRvSW5kZXhcIik7XG4gICAgfTtcblxuICAgIC8vIFNjcm9sbCB0byBhIHNwZWNpZmljIHBhZ2VcbiAgICBjb25zdCBzY3JvbGxUb1BhZ2UgPSAoXG4gICAgICBwYWdlOiBudW1iZXIsXG4gICAgICBsaW1pdDogbnVtYmVyID0gMjAsXG4gICAgICBhbGlnbm1lbnQ6IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiID0gXCJzdGFydFwiLFxuICAgICkgPT4ge1xuICAgICAgLy8gVmFsaWRhdGUgYWxpZ25tZW50IHBhcmFtZXRlclxuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgYWxpZ25tZW50ICE9PSBcInN0cmluZ1wiIHx8XG4gICAgICAgICFbXCJzdGFydFwiLCBcImNlbnRlclwiLCBcImVuZFwiXS5pbmNsdWRlcyhhbGlnbm1lbnQpXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbU2Nyb2xsaW5nXSBJbnZhbGlkIGFsaWdubWVudCBcIiR7YWxpZ25tZW50fVwiLCB1c2luZyBcInN0YXJ0XCJgLFxuICAgICAgICApO1xuICAgICAgICBhbGlnbm1lbnQgPSBcInN0YXJ0XCI7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGluIGN1cnNvciBtb2RlXG4gICAgICBjb25zdCB2aWV3cG9ydENvbmZpZyA9IChjb21wb25lbnQgYXMgYW55KS5jb25maWc7XG4gICAgICBjb25zdCBpc0N1cnNvck1vZGUgPSB2aWV3cG9ydENvbmZpZz8ucGFnaW5hdGlvbj8uc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCI7XG5cbiAgICAgIGlmIChpc0N1cnNvck1vZGUpIHtcbiAgICAgICAgLy8gSW4gY3Vyc29yIG1vZGUsIGNoZWNrIGlmIHdlIGNhbiBzY3JvbGwgdG8gdGhpcyBwYWdlXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuY29sbGVjdGlvbjtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24pIHtcbiAgICAgICAgICBjb25zdCBoaWdoZXN0TG9hZGVkUGFnZSA9IE1hdGguZmxvb3IoXG4gICAgICAgICAgICBjb2xsZWN0aW9uLmdldExvYWRlZFJhbmdlcygpLnNpemUsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChwYWdlID4gaGlnaGVzdExvYWRlZFBhZ2UgKyAxKSB7XG4gICAgICAgICAgICAvLyBMaW1pdCBob3cgbWFueSBwYWdlcyB3ZSdsbCBsb2FkIGF0IG9uY2UgdG8gcHJldmVudCBleGNlc3NpdmUgQVBJIGNhbGxzXG4gICAgICAgICAgICBjb25zdCBtYXhQYWdlc1RvTG9hZCA9IDEwOyAvLyBSZWFzb25hYmxlIGxpbWl0XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRQYWdlID0gTWF0aC5taW4oXG4gICAgICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgICAgIGhpZ2hlc3RMb2FkZWRQYWdlICsgbWF4UGFnZXNUb0xvYWQsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIGBbU2Nyb2xsaW5nXSBDYW5ub3QganVtcCBkaXJlY3RseSB0byBwYWdlICR7cGFnZX0gaW4gY3Vyc29yIG1vZGUuIGAgK1xuICAgICAgICAgICAgICAgIGBQYWdlcyBtdXN0IGJlIGxvYWRlZCBzZXF1ZW50aWFsbHkuIEN1cnJlbnQgaGlnaGVzdCBwYWdlOiAke2hpZ2hlc3RMb2FkZWRQYWdlfS4gYCArXG4gICAgICAgICAgICAgICAgYFdpbGwgbG9hZCB1cCB0byBwYWdlICR7dGFyZ2V0UGFnZX1gLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gVHJpZ2dlciBzZXF1ZW50aWFsIGxvYWRpbmcgdG8gdGhlIHRhcmdldCBwYWdlIChsaW1pdGVkKVxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0T2Zmc2V0ID0gKHRhcmdldFBhZ2UgLSAxKSAqIGxpbWl0O1xuICAgICAgICAgICAgY29uc3QgY3VycmVudE9mZnNldCA9IGhpZ2hlc3RMb2FkZWRQYWdlICogbGltaXQ7XG5cbiAgICAgICAgICAgIC8vIExvYWQgcGFnZXMgc2VxdWVudGlhbGx5IHVwIHRvIHRoZSBsaW1pdGVkIHRhcmdldFxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIGBbU2Nyb2xsaW5nXSBJbml0aWF0aW5nIHNlcXVlbnRpYWwgbG9hZCBmcm9tIHBhZ2UgJHtcbiAgICAgICAgICAgIC8vICAgICBoaWdoZXN0TG9hZGVkUGFnZSArIDFcbiAgICAgICAgICAgIC8vICAgfSB0byAke3RhcmdldFBhZ2V9YCxcbiAgICAgICAgICAgIC8vICk7XG5cbiAgICAgICAgICAgIC8vIFNjcm9sbCB0byB0aGUgbGFzdCBsb2FkZWQgcG9zaXRpb24gZmlyc3RcbiAgICAgICAgICAgIGNvbnN0IGxhc3RMb2FkZWRJbmRleCA9IGhpZ2hlc3RMb2FkZWRQYWdlICogbGltaXQ7XG4gICAgICAgICAgICBzY3JvbGxUb0luZGV4KGxhc3RMb2FkZWRJbmRleCwgYWxpZ25tZW50KTtcblxuICAgICAgICAgICAgLy8gVGhlIGNvbGxlY3Rpb24gZmVhdHVyZSB3aWxsIGhhbmRsZSBzZXF1ZW50aWFsIGxvYWRpbmdcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ29udmVydCBwYWdlIHRvIGluZGV4IChwYWdlIDEgPSBpbmRleCAwKVxuICAgICAgY29uc3QgaW5kZXggPSAocGFnZSAtIDEpICogbGltaXQ7XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGluZ10gU2Nyb2xsVG9QYWdlOiBwYWdlPSR7cGFnZX0sIGxpbWl0PSR7bGltaXR9LCB0YXJnZXRJbmRleD0ke2luZGV4fSwgYWxpZ25tZW50PSR7YWxpZ25tZW50fWBcbiAgICAgIC8vICk7XG5cbiAgICAgIC8vIEp1c3Qgc2Nyb2xsIHRvIHRoZSBpbmRleCAtIGxldCB0aGUgbm9ybWFsIHJlbmRlcmluZyBmbG93IGhhbmRsZSBkYXRhIGxvYWRpbmcgYW5kIHBsYWNlaG9sZGVyc1xuICAgICAgc2Nyb2xsVG9JbmRleChpbmRleCwgYWxpZ25tZW50KTtcbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIHNjcm9sbCBib3VuZHNcbiAgICBjb25zdCB1cGRhdGVTY3JvbGxCb3VuZHMgPSAoXG4gICAgICBuZXdUb3RhbFNpemU6IG51bWJlcixcbiAgICAgIG5ld0NvbnRhaW5lclNpemU6IG51bWJlcixcbiAgICApID0+IHtcbiAgICAgIHRvdGFsVmlydHVhbFNpemUgPSBuZXdUb3RhbFNpemU7XG4gICAgICBjb250YWluZXJTaXplID0gbmV3Q29udGFpbmVyU2l6ZTtcblxuICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplID0gbmV3VG90YWxTaXplO1xuICAgICAgICB2aWV3cG9ydFN0YXRlLmNvbnRhaW5lclNpemUgPSBuZXdDb250YWluZXJTaXplO1xuICAgICAgfVxuXG4gICAgICAvLyBEb24ndCBjbGFtcCBzY3JvbGwgcG9zaXRpb24gdW50aWwgd2UgaGF2ZSByZWFsIGRhdGEgbG9hZGVkXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIHJlc2V0dGluZyBpbml0aWFsU2Nyb2xsSW5kZXggcG9zaXRpb24gYmVmb3JlIGRhdGEgYXJyaXZlc1xuICAgICAgLy8gQ2hlY2sgdG90YWxJdGVtcyBpbnN0ZWFkIG9mIHRvdGFsVmlydHVhbFNpemUgc2luY2UgdmlydHVhbFNpemUgY2FuIGJlIG5vbi16ZXJvIGZyb20gcGFkZGluZ1xuICAgICAgY29uc3QgdG90YWxJdGVtcyA9IHZpZXdwb3J0U3RhdGU/LnRvdGFsSXRlbXMgfHwgMDtcbiAgICAgIGlmICh0b3RhbEl0ZW1zIDw9IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDbGFtcCBjdXJyZW50IHBvc2l0aW9uIHRvIG5ldyBib3VuZHNcbiAgICAgIGNvbnN0IG1heFNjcm9sbCA9IE1hdGgubWF4KDAsIHRvdGFsVmlydHVhbFNpemUgLSBjb250YWluZXJTaXplKTtcbiAgICAgIGlmIChzY3JvbGxQb3NpdGlvbiA+IG1heFNjcm9sbCkge1xuICAgICAgICBzY3JvbGxUb1Bvc2l0aW9uKG1heFNjcm9sbCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEV4dGVuZCB2aWV3cG9ydCBBUElcbiAgICBjb25zdCBvcmlnaW5hbFNjcm9sbFRvSW5kZXggPSBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9JbmRleDtcbiAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9JbmRleCA9IChcbiAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgICBhbGlnbm1lbnQ/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIixcbiAgICApID0+IHtcbiAgICAgIHNjcm9sbFRvSW5kZXgoaW5kZXgsIGFsaWdubWVudCk7XG4gICAgICBvcmlnaW5hbFNjcm9sbFRvSW5kZXg/LihpbmRleCwgYWxpZ25tZW50KTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIHNjcm9sbFRvUGFnZSB0byB2aWV3cG9ydCBBUEkgKG5ldyBtZXRob2QsIG5vIG9yaWdpbmFsIHRvIHByZXNlcnZlKVxuICAgIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zY3JvbGxUb1BhZ2UgPSAoXG4gICAgICBwYWdlOiBudW1iZXIsXG4gICAgICBsaW1pdD86IG51bWJlcixcbiAgICAgIGFsaWdubWVudD86IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiLFxuICAgICkgPT4ge1xuICAgICAgc2Nyb2xsVG9QYWdlKHBhZ2UsIGxpbWl0LCBhbGlnbm1lbnQpO1xuICAgIH07XG5cbiAgICBjb25zdCBvcmlnaW5hbFNjcm9sbFRvUG9zaXRpb24gPSBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9Qb3NpdGlvbjtcbiAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9Qb3NpdGlvbiA9IChwb3NpdGlvbjogbnVtYmVyKSA9PiB7XG4gICAgICBzY3JvbGxUb1Bvc2l0aW9uKHBvc2l0aW9uLCBcImFwaVwiKTtcbiAgICAgIG9yaWdpbmFsU2Nyb2xsVG9Qb3NpdGlvbj8uKHBvc2l0aW9uKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb3JpZ2luYWxHZXRTY3JvbGxQb3NpdGlvbiA9IGNvbXBvbmVudC52aWV3cG9ydC5nZXRTY3JvbGxQb3NpdGlvbjtcbiAgICBjb21wb25lbnQudmlld3BvcnQuZ2V0U2Nyb2xsUG9zaXRpb24gPSAoKSA9PiB7XG4gICAgICByZXR1cm4gc2Nyb2xsUG9zaXRpb247XG4gICAgfTtcblxuICAgIC8vIEFkZCB3aGVlbCBldmVudCBsaXN0ZW5lciBvbiBpbml0aWFsaXphdGlvblxuICAgIC8vIFRoaXMgYmxvY2sgaXMgcmVtb3ZlZCBhcyBwZXIgdGhlIGVkaXQgaGludC5cblxuICAgIC8vIENsZWFuIHVwIG9uIGRlc3Ryb3lcbiAgICBpZiAoXCJkZXN0cm95XCIgaW4gY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQuZGVzdHJveTtcbiAgICAgIGNvbXBvbmVudC5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAvLyBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0RWxlbWVudCA9IChjb21wb25lbnQgYXMgYW55KS5fc2Nyb2xsaW5nVmlld3BvcnRFbGVtZW50O1xuICAgICAgICBpZiAodmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLCBoYW5kbGVXaGVlbCk7XG4gICAgICAgICAgaWYgKChjb21wb25lbnQgYXMgYW55KS5fc2Nyb2xsaW5nU3RvcE9uQ2xpY2spIHtcbiAgICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGhhbmRsZU1vdXNlRG93bik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgdGltZW91dHNcbiAgICAgICAgaWYgKGlkbGVUaW1lb3V0SWQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoaWRsZVRpbWVvdXRJZCk7XG4gICAgICAgIH1cblxuICAgICAgICBzdG9wSWRsZURldGVjdGlvbigpO1xuICAgICAgICBvcmlnaW5hbERlc3Ryb3k/LigpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBBZGQgc2Nyb2xsQnkgbWV0aG9kXG4gICAgY29uc3Qgc2Nyb2xsQnkgPSAoZGVsdGE6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgcHJldmlvdXNQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgY29uc3QgbWF4U2Nyb2xsID0gTWF0aC5tYXgoMCwgdG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuICAgICAgY29uc3QgbmV3UG9zaXRpb24gPSBjbGFtcChzY3JvbGxQb3NpdGlvbiArIGRlbHRhLCAwLCBtYXhTY3JvbGwpO1xuXG4gICAgICBpZiAobmV3UG9zaXRpb24gIT09IHByZXZpb3VzUG9zaXRpb24pIHtcbiAgICAgICAgc2Nyb2xsUG9zaXRpb24gPSBuZXdQb3NpdGlvbjtcblxuICAgICAgICAvLyBVcGRhdGUgc3BlZWQgdHJhY2tlclxuICAgICAgICBzcGVlZFRyYWNrZXIgPSB1cGRhdGVTcGVlZFRyYWNrZXIoXG4gICAgICAgICAgc3BlZWRUcmFja2VyLFxuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgIHByZXZpb3VzUG9zaXRpb24sXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHZpZXdwb3J0IHN0YXRlXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUudmVsb2NpdHkgPSBzcGVlZFRyYWNrZXIudmVsb2NpdHk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgc2Nyb2xsZWQgc3RhdGUgY2xhc3NcbiAgICAgICAgY29uc3Qgdmlld3BvcnRFbCA9XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZT8udmlld3BvcnRFbGVtZW50IHx8IChjb21wb25lbnQgYXMgYW55KS52aWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgIGlmICh2aWV3cG9ydEVsKSB7XG4gICAgICAgICAgdXBkYXRlU2Nyb2xsZWRTdGF0ZSh2aWV3cG9ydEVsLCBzY3JvbGxQb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IHNjcm9sbCBldmVudFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6c2Nyb2xsXCIsIHtcbiAgICAgICAgICBwb3NpdGlvbjogc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgdmVsb2NpdHk6IHNwZWVkVHJhY2tlci52ZWxvY2l0eSxcbiAgICAgICAgICBkaXJlY3Rpb246IHNwZWVkVHJhY2tlci5kaXJlY3Rpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFRyaWdnZXIgcmVuZGVyXG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcz8uKCk7XG5cbiAgICAgICAgLy8gU3RhcnQgaWRsZSBkZXRlY3Rpb24gaWYgbm90IHNjcm9sbGluZ1xuICAgICAgICBpZiAoIWlzU2Nyb2xsaW5nKSB7XG4gICAgICAgICAgaXNTY3JvbGxpbmcgPSB0cnVlO1xuICAgICAgICAgIHN0YXJ0SWRsZURldGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RTY3JvbGxUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gRXhwb3NlIHNjcm9sbGluZyBzdGF0ZSBmb3Igb3RoZXIgZmVhdHVyZXNcbiAgICAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc2Nyb2xsaW5nU3RhdGUgPSB7XG4gICAgICBzZXRWZWxvY2l0eVRvWmVybyxcbiAgICB9O1xuXG4gICAgLy8gQWRkIHNjcm9sbEJ5IHRvIHZpZXdwb3J0IEFQSVxuICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxCeSA9IHNjcm9sbEJ5O1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5nZXRWZWxvY2l0eSA9ICgpID0+IHNwZWVkVHJhY2tlci52ZWxvY2l0eTtcblxuICAgIC8vIEV4cG9zZSBzY3JvbGxpbmcgQVBJXG4gICAgKGNvbXBvbmVudCBhcyBhbnkpLnNjcm9sbGluZyA9IHtcbiAgICAgIGhhbmRsZVdoZWVsLFxuICAgICAgc2Nyb2xsVG9Qb3NpdGlvbixcbiAgICAgIHNjcm9sbFRvSW5kZXgsXG4gICAgICBzY3JvbGxUb1BhZ2UsXG4gICAgICBzY3JvbGxCeSxcbiAgICAgIGdldFNjcm9sbFBvc2l0aW9uOiAoKSA9PiBzY3JvbGxQb3NpdGlvbixcbiAgICAgIHVwZGF0ZVNjcm9sbEJvdW5kcyxcbiAgICAgIGdldFZlbG9jaXR5OiAoKSA9PiBzcGVlZFRyYWNrZXIudmVsb2NpdHksXG4gICAgICBnZXREaXJlY3Rpb246ICgpID0+IHNwZWVkVHJhY2tlci5kaXJlY3Rpb24sXG4gICAgICBpc1Njcm9sbGluZzogKCkgPT4gaXNTY3JvbGxpbmcsXG4gICAgfTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH07XG59O1xuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9tb21lbnR1bS50c1xuXG4vKipcbiAqIE1vbWVudHVtIEZlYXR1cmUgLSBBZGRzIGluZXJ0aWFsIHNjcm9sbGluZyB0byB2aWV3cG9ydFxuICogUHJvdmlkZXMgc21vb3RoIGRlY2VsZXJhdGlvbiBhZnRlciB0b3VjaC9tb3VzZSBkcmFnIGdlc3R1cmVzXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbXBvbmVudCwgVmlld3BvcnRDb250ZXh0IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBWSUVXUE9SVF9DT05TVEFOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbmludGVyZmFjZSBNb21lbnR1bUNvbmZpZyB7XG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuICBkZWNlbGVyYXRpb24/OiBudW1iZXI7XG4gIG1pblZlbG9jaXR5PzogbnVtYmVyO1xuICBtaW5EdXJhdGlvbj86IG51bWJlcjtcbiAgbWluVmVsb2NpdHlUaHJlc2hvbGQ/OiBudW1iZXI7XG4gIC8qKiBTdG9wIG1vbWVudHVtIHdoZW4gY2xpY2tpbmcgb24gdGhlIHZpZXdwb3J0IChkZWZhdWx0OiB0cnVlKSAqL1xuICBzdG9wT25DbGljaz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQWRkcyBtb21lbnR1bSBzY3JvbGxpbmcgdG8gdmlld3BvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhNb21lbnR1bSA9IChjb25maWc6IE1vbWVudHVtQ29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KGNvbXBvbmVudDogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGVuYWJsZWQgPSBWSUVXUE9SVF9DT05TVEFOVFMuTU9NRU5UVU0uRU5BQkxFRCxcbiAgICAgIGRlY2VsZXJhdGlvbiA9IFZJRVdQT1JUX0NPTlNUQU5UUy5NT01FTlRVTS5ERUNFTEVSQVRJT05fRkFDVE9SLFxuICAgICAgbWluVmVsb2NpdHkgPSBWSUVXUE9SVF9DT05TVEFOVFMuTU9NRU5UVU0uTUlOX1ZFTE9DSVRZLFxuICAgICAgbWluRHVyYXRpb24gPSBWSUVXUE9SVF9DT05TVEFOVFMuTU9NRU5UVU0uTUlOX0RVUkFUSU9OLFxuICAgICAgbWluVmVsb2NpdHlUaHJlc2hvbGQgPSBWSUVXUE9SVF9DT05TVEFOVFMuTU9NRU5UVU0uTUlOX1ZFTE9DSVRZX1RIUkVTSE9MRCxcbiAgICAgIHN0b3BPbkNsaWNrID0gdHJ1ZSwgLy8gU3RvcCBtb21lbnR1bSBvbiBjbGljayBieSBkZWZhdWx0XG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIEFsd2F5cyBhcHBseSB0aGUgZmVhdHVyZSwgYnV0IGNoZWNrIGlzRW5hYmxlZCBhdCBydW50aW1lXG5cbiAgICAvLyBNb21lbnR1bSBzdGF0ZVxuICAgIGxldCBtb21lbnR1bUFuaW1hdGlvbklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaXNUb3VjaGluZyA9IGZhbHNlO1xuICAgIGxldCBpc01vdXNlRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICBsZXQgbGFzdFRvdWNoUG9zaXRpb24gPSAwO1xuICAgIGxldCBsYXN0TW91c2VQb3NpdGlvbiA9IDA7XG4gICAgbGV0IHRvdWNoU3RhcnRUaW1lID0gMDtcbiAgICBsZXQgdmlld3BvcnRTdGF0ZTogYW55O1xuICAgIGxldCBzY3JvbGxpbmdTdGF0ZTogYW55O1xuICAgIGxldCBpc0VuYWJsZWQgPSBlbmFibGVkOyAvLyBUcmFjayBjdXJyZW50IGVuYWJsZWQgc3RhdGVcblxuICAgIC8vIEdldCByZWZlcmVuY2VzIGFmdGVyIGluaXRpYWxpemF0aW9uXG4gICAgY29uc3Qgb3JpZ2luYWxJbml0aWFsaXplID0gY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemU7XG4gICAgY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBvcmlnaW5hbEluaXRpYWxpemUoKTtcbiAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBpbml0aWFsaXplZFxuICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBHZXQgdmlld3BvcnQgYW5kIHNjcm9sbGluZyBzdGF0ZXNcbiAgICAgIHZpZXdwb3J0U3RhdGUgPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU7XG4gICAgICBzY3JvbGxpbmdTdGF0ZSA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zY3JvbGxpbmdTdGF0ZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIC8vIFN0b3AgbW9tZW50dW0gYW5pbWF0aW9uIChjYW4gYmUgY2FsbGVkIGV4dGVybmFsbHkpXG4gICAgY29uc3Qgc3RvcE1vbWVudHVtID0gKCkgPT4ge1xuICAgICAgaWYgKG1vbWVudHVtQW5pbWF0aW9uSWQpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUobW9tZW50dW1BbmltYXRpb25JZCk7XG4gICAgICAgIG1vbWVudHVtQW5pbWF0aW9uSWQgPSBudWxsO1xuICAgICAgICAvLyBSZXNldCB2ZWxvY2l0eSBpbiBzY3JvbGxpbmcgZmVhdHVyZVxuICAgICAgICBpZiAoc2Nyb2xsaW5nU3RhdGUpIHtcbiAgICAgICAgICBzY3JvbGxpbmdTdGF0ZS5zZXRWZWxvY2l0eVRvWmVybz8uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gU3RhcnQgbW9tZW50dW0gYW5pbWF0aW9uXG4gICAgY29uc3Qgc3RhcnRNb21lbnR1bSA9IChpbml0aWFsVmVsb2NpdHk6IG51bWJlcikgPT4ge1xuICAgICAgLy8gQ2FuY2VsIGFueSBleGlzdGluZyBtb21lbnR1bVxuICAgICAgaWYgKG1vbWVudHVtQW5pbWF0aW9uSWQpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUobW9tZW50dW1BbmltYXRpb25JZCk7XG4gICAgICB9XG5cbiAgICAgIGxldCB2ZWxvY2l0eSA9IGluaXRpYWxWZWxvY2l0eTtcblxuICAgICAgY29uc3QgYW5pbWF0ZSA9ICgpID0+IHtcbiAgICAgICAgLy8gQXBwbHkgZGVjZWxlcmF0aW9uXG4gICAgICAgIHZlbG9jaXR5ICo9IGRlY2VsZXJhdGlvbjtcblxuICAgICAgICAvLyBTdG9wIGlmIHZlbG9jaXR5IGlzIHRvbyBzbWFsbFxuICAgICAgICBpZiAoTWF0aC5hYnModmVsb2NpdHkpIDwgbWluVmVsb2NpdHkpIHtcbiAgICAgICAgICBtb21lbnR1bUFuaW1hdGlvbklkID0gbnVsbDtcbiAgICAgICAgICAvLyBSZXNldCB2ZWxvY2l0eSBpbiBzY3JvbGxpbmcgZmVhdHVyZVxuICAgICAgICAgIGlmIChzY3JvbGxpbmdTdGF0ZSkge1xuICAgICAgICAgICAgc2Nyb2xsaW5nU3RhdGUuc2V0VmVsb2NpdHlUb1plcm8/LigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxjdWxhdGUgc2Nyb2xsIGRlbHRhICh2ZWxvY2l0eSBpcyBpbiBweC9tcywgc28gbXVsdGlwbHkgYnkgZnJhbWUgdGltZSlcbiAgICAgICAgY29uc3QgZnJhbWVEZWx0YSA9IHZlbG9jaXR5ICogVklFV1BPUlRfQ09OU1RBTlRTLk1PTUVOVFVNLkZSQU1FX1RJTUU7XG5cbiAgICAgICAgLy8gVXNlIHNjcm9sbGluZyBmZWF0dXJlJ3MgQVBJIHRvIHVwZGF0ZSBwb3NpdGlvblxuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5KSB7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5KGZyYW1lRGVsdGEpO1xuXG4gICAgICAgICAgLy8gQ29udGludWUgYW5pbWF0aW9uXG4gICAgICAgICAgbW9tZW50dW1BbmltYXRpb25JZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShhbmltYXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBObyBzY3JvbGxCeSBtZXRob2QsIHN0b3AgbW9tZW50dW1cbiAgICAgICAgICBtb21lbnR1bUFuaW1hdGlvbklkID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgbW9tZW50dW1BbmltYXRpb25JZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShhbmltYXRlKTtcbiAgICB9O1xuXG4gICAgLy8gVG91Y2ggZXZlbnQgaGFuZGxlcnNcbiAgICBjb25zdCBoYW5kbGVUb3VjaFN0YXJ0ID0gKGU6IFRvdWNoRXZlbnQpID0+IHtcbiAgICAgIGlzVG91Y2hpbmcgPSB0cnVlO1xuICAgICAgY29uc3QgdG91Y2ggPSBlLnRvdWNoZXNbMF07XG4gICAgICBjb25zdCBvcmllbnRhdGlvbiA9IHZpZXdwb3J0U3RhdGU/Lm9yaWVudGF0aW9uIHx8IFwidmVydGljYWxcIjtcbiAgICAgIGxhc3RUb3VjaFBvc2l0aW9uID1cbiAgICAgICAgb3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIiA/IHRvdWNoLmNsaWVudFkgOiB0b3VjaC5jbGllbnRYO1xuICAgICAgdG91Y2hTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAvLyBDYW5jZWwgYW55IG9uZ29pbmcgbW9tZW50dW1cbiAgICAgIGlmIChtb21lbnR1bUFuaW1hdGlvbklkKSB7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKG1vbWVudHVtQW5pbWF0aW9uSWQpO1xuICAgICAgICBtb21lbnR1bUFuaW1hdGlvbklkID0gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlVG91Y2hNb3ZlID0gKGU6IFRvdWNoRXZlbnQpID0+IHtcbiAgICAgIGlmICghaXNUb3VjaGluZykgcmV0dXJuO1xuXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7IC8vIFByZXZlbnQgbmF0aXZlIHNjcm9sbGluZ1xuXG4gICAgICBjb25zdCB0b3VjaCA9IGUudG91Y2hlc1swXTtcbiAgICAgIGNvbnN0IG9yaWVudGF0aW9uID0gdmlld3BvcnRTdGF0ZT8ub3JpZW50YXRpb24gfHwgXCJ2ZXJ0aWNhbFwiO1xuICAgICAgY29uc3QgY3VycmVudFBvc2l0aW9uID1cbiAgICAgICAgb3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIiA/IHRvdWNoLmNsaWVudFkgOiB0b3VjaC5jbGllbnRYO1xuICAgICAgY29uc3QgZGVsdGEgPSBsYXN0VG91Y2hQb3NpdGlvbiAtIGN1cnJlbnRQb3NpdGlvbjsgLy8gSW52ZXJ0ZWQgZm9yIG5hdHVyYWwgc2Nyb2xsaW5nXG4gICAgICBsYXN0VG91Y2hQb3NpdGlvbiA9IGN1cnJlbnRQb3NpdGlvbjtcblxuICAgICAgLy8gVXNlIHNjcm9sbGluZyBmZWF0dXJlJ3MgQVBJICgxOjEgdG91Y2gtdG8tc2Nyb2xsIGZvciBuYXR1cmFsIGZlZWwpXG4gICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5KSB7XG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxCeShkZWx0YSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZVRvdWNoRW5kID0gKCkgPT4ge1xuICAgICAgaWYgKCFpc1RvdWNoaW5nKSByZXR1cm47XG4gICAgICBpc1RvdWNoaW5nID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IHRvdWNoRW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB0b3VjaER1cmF0aW9uID0gdG91Y2hFbmRUaW1lIC0gdG91Y2hTdGFydFRpbWU7XG5cbiAgICAgIC8vIEdldCBjdXJyZW50IHZlbG9jaXR5IGZyb20gc2Nyb2xsaW5nIGZlYXR1cmVcbiAgICAgIGNvbnN0IHZlbG9jaXR5ID0gY29tcG9uZW50LnZpZXdwb3J0LmdldFZlbG9jaXR5Py4oKSB8fCAwO1xuXG4gICAgICAvLyBPbmx5IHN0YXJ0IG1vbWVudHVtIGlmIHRoZSB0b3VjaCB3YXMgcXVpY2sgZW5vdWdoIGFuZCB3ZSBoYXZlIHZlbG9jaXR5XG4gICAgICBpZiAoXG4gICAgICAgIHRvdWNoRHVyYXRpb24gPCBtaW5EdXJhdGlvbiAmJlxuICAgICAgICBNYXRoLmFicyh2ZWxvY2l0eSkgPiBtaW5WZWxvY2l0eVRocmVzaG9sZFxuICAgICAgKSB7XG4gICAgICAgIHN0YXJ0TW9tZW50dW0odmVsb2NpdHkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgY2xpY2sgdG8gc3RvcCBtb21lbnR1bSAod2l0aG91dCBwcmV2ZW50aW5nIHNlbGVjdGlvbilcbiAgICBjb25zdCBoYW5kbGVDbGljayA9IChfZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgc3RvcE1vbWVudHVtKCk7XG4gICAgfTtcblxuICAgIC8vIE1vdXNlIGV2ZW50IGhhbmRsZXJzIGZvciBkZXNrdG9wXG4gICAgY29uc3QgaGFuZGxlTW91c2VEb3duID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlzTW91c2VEcmFnZ2luZyA9IHRydWU7XG4gICAgICBjb25zdCBvcmllbnRhdGlvbiA9IHZpZXdwb3J0U3RhdGU/Lm9yaWVudGF0aW9uIHx8IFwidmVydGljYWxcIjtcbiAgICAgIGxhc3RNb3VzZVBvc2l0aW9uID0gb3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIiA/IGUuY2xpZW50WSA6IGUuY2xpZW50WDtcbiAgICAgIHRvdWNoU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgICAgLy8gQ2FuY2VsIGFueSBvbmdvaW5nIG1vbWVudHVtXG4gICAgICBzdG9wTW9tZW50dW0oKTtcblxuICAgICAgLy8gUHJldmVudCB0ZXh0IHNlbGVjdGlvblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZU1vdmUgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgaWYgKCFpc01vdXNlRHJhZ2dpbmcpIHJldHVybjtcblxuICAgICAgY29uc3Qgb3JpZW50YXRpb24gPSB2aWV3cG9ydFN0YXRlPy5vcmllbnRhdGlvbiB8fCBcInZlcnRpY2FsXCI7XG4gICAgICBjb25zdCBjdXJyZW50UG9zaXRpb24gPVxuICAgICAgICBvcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiID8gZS5jbGllbnRZIDogZS5jbGllbnRYO1xuICAgICAgY29uc3QgZGVsdGEgPSBsYXN0TW91c2VQb3NpdGlvbiAtIGN1cnJlbnRQb3NpdGlvbjtcbiAgICAgIGxhc3RNb3VzZVBvc2l0aW9uID0gY3VycmVudFBvc2l0aW9uO1xuXG4gICAgICAvLyBVc2Ugc2Nyb2xsaW5nIGZlYXR1cmUncyBBUEkgKDE6MSBkcmFnLXRvLXNjcm9sbCBmb3IgbmF0dXJhbCBmZWVsKVxuICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxCeSkge1xuICAgICAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsQnkoZGVsdGEpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZVVwID0gKCkgPT4ge1xuICAgICAgaWYgKCFpc01vdXNlRHJhZ2dpbmcpIHJldHVybjtcbiAgICAgIGlzTW91c2VEcmFnZ2luZyA9IGZhbHNlO1xuXG4gICAgICBjb25zdCBtb3VzZVVwVGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBkcmFnRHVyYXRpb24gPSBtb3VzZVVwVGltZSAtIHRvdWNoU3RhcnRUaW1lO1xuXG4gICAgICAvLyBHZXQgY3VycmVudCB2ZWxvY2l0eSBmcm9tIHNjcm9sbGluZyBmZWF0dXJlXG4gICAgICBjb25zdCB2ZWxvY2l0eSA9IGNvbXBvbmVudC52aWV3cG9ydC5nZXRWZWxvY2l0eT8uKCkgfHwgMDtcblxuICAgICAgLy8gU3RhcnQgbW9tZW50dW0gZm9yIHF1aWNrIGRyYWdzXG4gICAgICBpZiAoXG4gICAgICAgIGRyYWdEdXJhdGlvbiA8IG1pbkR1cmF0aW9uICYmXG4gICAgICAgIE1hdGguYWJzKHZlbG9jaXR5KSA+IG1pblZlbG9jaXR5VGhyZXNob2xkXG4gICAgICApIHtcbiAgICAgICAgc3RhcnRNb21lbnR1bSh2ZWxvY2l0eSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIE92ZXJyaWRlIGluaXRpYWxpemUgdG8gYWRkIGV2ZW50IGxpc3RlbmVyc1xuICAgIGNvbnN0IG9yaWdpbmFsSW5pdCA9IGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplO1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplID0gKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gb3JpZ2luYWxJbml0KCk7XG4gICAgICAvLyBTa2lwIGlmIGFscmVhZHkgaW5pdGlhbGl6ZWRcbiAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgdmlld3BvcnRFbGVtZW50ID1cbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLnZpZXdwb3J0RWxlbWVudCB8fFxuICAgICAgICAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU/LnZpZXdwb3J0RWxlbWVudDtcblxuICAgICAgaWYgKHZpZXdwb3J0RWxlbWVudCkge1xuICAgICAgICAvLyBUb3VjaCBldmVudHNcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaHN0YXJ0XCIsIGhhbmRsZVRvdWNoU3RhcnQsIHtcbiAgICAgICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgaGFuZGxlVG91Y2hNb3ZlLCB7XG4gICAgICAgICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsIGhhbmRsZVRvdWNoRW5kLCB7XG4gICAgICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTW91c2UgZXZlbnRzIGZvciBkZXNrdG9wIGRyYWdnaW5nXG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGhhbmRsZU1vdXNlRG93bik7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBoYW5kbGVNb3VzZVVwKTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIGhhbmRsZU1vdXNlVXApO1xuXG4gICAgICAgIC8vIEFkZCBjbGljayBsaXN0ZW5lciB0byBzdG9wIG1vbWVudHVtIG9uIGNsaWNrICh3aXRob3V0IGJsb2NraW5nIHNlbGVjdGlvbilcbiAgICAgICAgaWYgKHN0b3BPbkNsaWNrKSB7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVDbGljayk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdG9yZSByZWZlcmVuY2UgZm9yIGNsZWFudXBcbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLl9tb21lbnR1bVZpZXdwb3J0RWxlbWVudCA9IHZpZXdwb3J0RWxlbWVudDtcbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLl9tb21lbnR1bVN0b3BPbkNsaWNrID0gc3RvcE9uQ2xpY2s7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIENsZWFuIHVwIG9uIGRlc3Ryb3lcbiAgICBpZiAoXCJkZXN0cm95XCIgaW4gY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQuZGVzdHJveTtcbiAgICAgIGNvbXBvbmVudC5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAvLyBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0RWxlbWVudCA9IChjb21wb25lbnQgYXMgYW55KS5fbW9tZW50dW1WaWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgIGlmICh2aWV3cG9ydEVsZW1lbnQpIHtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgaGFuZGxlVG91Y2hTdGFydCk7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgaGFuZGxlVG91Y2hNb3ZlKTtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsIGhhbmRsZVRvdWNoRW5kKTtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBoYW5kbGVNb3VzZURvd24pO1xuICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGhhbmRsZU1vdXNlVXApO1xuICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCBoYW5kbGVNb3VzZVVwKTtcbiAgICAgICAgICBpZiAoKGNvbXBvbmVudCBhcyBhbnkpLl9tb21lbnR1bVN0b3BPbkNsaWNrKSB7XG4gICAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNsaWNrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYW5jZWwgbW9tZW50dW0gYW5pbWF0aW9uXG4gICAgICAgIHN0b3BNb21lbnR1bSgpO1xuXG4gICAgICAgIG9yaWdpbmFsRGVzdHJveSgpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBFeHBvc2UgbW9tZW50dW0gc3RhdGUgZm9yIG90aGVyIGZlYXR1cmVzXG4gICAgKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLm1vbWVudHVtU3RhdGUgPSB7XG4gICAgICBzdG9wTW9tZW50dW0sXG4gICAgfTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH07XG59O1xuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9zY3JvbGxiYXIudHNcblxuLyoqXG4gKiBTY3JvbGxiYXIgRmVhdHVyZSAtIEN1c3RvbSBzY3JvbGxiYXIgaW1wbGVtZW50YXRpb25cbiAqIFByb3ZpZGVzIHZpc3VhbCBzY3JvbGwgaW5kaWNhdGlvbiBhbmQgZHJhZy10by1zY3JvbGwgZnVuY3Rpb25hbGl0eVxuICovXG5cbmltcG9ydCB0eXBlIHsgVmlld3BvcnRDb250ZXh0LCBWaWV3cG9ydENvbXBvbmVudCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVklFV1BPUlRfQ09OU1RBTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgd3JhcEluaXRpYWxpemUsIHdyYXBEZXN0cm95LCBzdG9yZUZlYXR1cmVGdW5jdGlvbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBQUkVGSVgsIGFkZENsYXNzLCByZW1vdmVDbGFzcyB9IGZyb20gXCJtdHJsXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Nyb2xsYmFyQ29uZmlnIHtcbiAgZW5hYmxlZD86IGJvb2xlYW47XG4gIGF1dG9IaWRlPzogYm9vbGVhbjtcbiAgdGh1bWJNaW5IZWlnaHQ/OiBudW1iZXI7XG4gIHRodW1iQ29sb3I/OiBzdHJpbmc7XG4gIHRyYWNrQ29sb3I/OiBzdHJpbmc7XG4gIGJvcmRlclJhZGl1cz86IG51bWJlcjtcbiAgZmFkZVRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Nyb2xsYmFyQ29tcG9uZW50IHtcbiAgc2Nyb2xsYmFyOiB7XG4gICAgc2hvdzogKCkgPT4gdm9pZDtcbiAgICBoaWRlOiAoKSA9PiB2b2lkO1xuICAgIHVwZGF0ZUJvdW5kczogKHRvdGFsVmlydHVhbFNpemU6IG51bWJlciwgY29udGFpbmVyU2l6ZTogbnVtYmVyKSA9PiB2b2lkO1xuICAgIHVwZGF0ZVBvc2l0aW9uOiAoc2Nyb2xsUG9zaXRpb246IG51bWJlcikgPT4gdm9pZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBBZGRzIHNjcm9sbGJhciBmdW5jdGlvbmFsaXR5IHRvIHZpZXdwb3J0IGNvbXBvbmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFNjcm9sbGJhcihjb25maWc6IFNjcm9sbGJhckNvbmZpZyA9IHt9KSB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50PihcbiAgICBjb21wb25lbnQ6IFRcbiAgKTogVCAmIFNjcm9sbGJhckNvbXBvbmVudCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgZW5hYmxlZCA9IHRydWUsXG4gICAgICBhdXRvSGlkZSA9IHRydWUsXG4gICAgICB0aHVtYk1pbkhlaWdodCA9IDI1LFxuICAgICAgYm9yZGVyUmFkaXVzID0gNCxcbiAgICAgIGZhZGVUaW1lb3V0ID0gMTAwMCxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gUmV0dXJuIG5vLW9wIGlmIGRpc2FibGVkXG4gICAgaWYgKCFlbmFibGVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jb21wb25lbnQsXG4gICAgICAgIHNjcm9sbGJhcjoge1xuICAgICAgICAgIHNob3c6ICgpID0+IHt9LFxuICAgICAgICAgIGhpZGU6ICgpID0+IHt9LFxuICAgICAgICAgIHVwZGF0ZUJvdW5kczogKCkgPT4ge30sXG4gICAgICAgICAgdXBkYXRlUG9zaXRpb246ICgpID0+IHt9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBTdGF0ZVxuICAgIGxldCB2aWV3cG9ydEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IHNjcm9sbGJhclRyYWNrOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIGxldCBzY3JvbGxiYXJUaHVtYjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIGxldCBpc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgbGV0IGRyYWdTdGFydFkgPSAwO1xuICAgIGxldCBkcmFnU3RhcnRTY3JvbGxQb3NpdGlvbiA9IDA7XG4gICAgbGV0IGhpZGVUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICAgIGxldCB0b3RhbFZpcnR1YWxTaXplID0gMDtcbiAgICBsZXQgY29udGFpbmVyU2l6ZSA9IDA7XG4gICAgbGV0IHRodW1iSGVpZ2h0ID0gMDtcbiAgICBsZXQgYW5pbWF0aW9uRnJhbWVJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGlzQ3Vyc29yTW9kZSA9IGZhbHNlO1xuICAgIGxldCBsb2FkZWRJdGVtc0NvdW50ID0gMDtcblxuICAgIC8vIENyZWF0ZSBzY3JvbGxiYXIgZWxlbWVudHNcbiAgICBjb25zdCBjcmVhdGVTY3JvbGxiYXJFbGVtZW50cyA9ICgpID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRFbGVtZW50KSByZXR1cm47XG5cbiAgICAgIHNjcm9sbGJhclRyYWNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGFkZENsYXNzKHNjcm9sbGJhclRyYWNrLCBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSKTtcbiAgICAgIHNjcm9sbGJhclRyYWNrLnN0eWxlLmNzc1RleHQgPSBgXG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICB6LWluZGV4OiAxMDtcbiAgICAgIGA7XG5cbiAgICAgIHNjcm9sbGJhclRodW1iID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAgICAgYWRkQ2xhc3MoXG4gICAgICAgIHNjcm9sbGJhclRodW1iLFxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSX1RIVU1CXG4gICAgICApO1xuXG4gICAgICBzY3JvbGxiYXJUcmFjay5hcHBlbmRDaGlsZChzY3JvbGxiYXJUaHVtYik7XG4gICAgICB2aWV3cG9ydEVsZW1lbnQuYXBwZW5kQ2hpbGQoc2Nyb2xsYmFyVHJhY2spO1xuICAgIH07XG5cbiAgICAvLyBTaG93L2hpZGUgZnVuY3Rpb25zXG4gICAgY29uc3Qgc2hvdyA9ICgpID0+IHtcbiAgICAgIGlmICghc2Nyb2xsYmFyVHJhY2sgfHwgdG90YWxWaXJ0dWFsU2l6ZSA8PSBjb250YWluZXJTaXplKSByZXR1cm47XG5cbiAgICAgIGlmIChoaWRlVGltZW91dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQoaGlkZVRpbWVvdXQpO1xuICAgICAgICBoaWRlVGltZW91dCA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBzY3JvbGxiYXJUcmFjayxcbiAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlNDUk9MTEJBUi5DTEFTU0VTLlNDUk9MTEJBUl9WSVNJQkxFXG4gICAgICApO1xuXG4gICAgICBpZiAoYXV0b0hpZGUgJiYgIWlzRHJhZ2dpbmcpIHtcbiAgICAgICAgaGlkZVRpbWVvdXQgPSBzZXRUaW1lb3V0KGhpZGUsIGZhZGVUaW1lb3V0KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGlkZSA9ICgpID0+IHtcbiAgICAgIGlmICghc2Nyb2xsYmFyVHJhY2sgfHwgaXNEcmFnZ2luZykgcmV0dXJuO1xuICAgICAgcmVtb3ZlQ2xhc3MoXG4gICAgICAgIHNjcm9sbGJhclRyYWNrLFxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSX1ZJU0lCTEVcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSBzY3JvbGxiYXIgYm91bmRzXG4gICAgY29uc3QgdXBkYXRlQm91bmRzID0gKG5ld1RvdGFsU2l6ZTogbnVtYmVyLCBuZXdDb250YWluZXJTaXplOiBudW1iZXIpID0+IHtcbiAgICAgIHRvdGFsVmlydHVhbFNpemUgPSBuZXdUb3RhbFNpemU7XG4gICAgICBjb250YWluZXJTaXplID0gbmV3Q29udGFpbmVyU2l6ZTtcblxuICAgICAgaWYgKCFzY3JvbGxiYXJUcmFjayB8fCAhc2Nyb2xsYmFyVGh1bWIpIHJldHVybjtcblxuICAgICAgY29uc3QgbmVlZHNTY3JvbGxiYXIgPSB0b3RhbFZpcnR1YWxTaXplID4gY29udGFpbmVyU2l6ZTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGJhcl0gdXBkYXRlQm91bmRzOiB0b3RhbFNpemU9JHt0b3RhbFZpcnR1YWxTaXplfSwgY29udGFpbmVyU2l6ZT0ke2NvbnRhaW5lclNpemV9LCBuZWVkc1Njcm9sbGJhcj0ke25lZWRzU2Nyb2xsYmFyfWBcbiAgICAgIC8vICk7XG4gICAgICBzY3JvbGxiYXJUcmFjay5zdHlsZS5kaXNwbGF5ID0gbmVlZHNTY3JvbGxiYXIgPyBcImJsb2NrXCIgOiBcIm5vbmVcIjtcblxuICAgICAgaWYgKG5lZWRzU2Nyb2xsYmFyKSB7XG4gICAgICAgIGxldCBzY3JvbGxSYXRpbzogbnVtYmVyO1xuXG4gICAgICAgIGlmIChpc0N1cnNvck1vZGUgJiYgbG9hZGVkSXRlbXNDb3VudCA+IDApIHtcbiAgICAgICAgICAvLyBGb3IgY3Vyc29yIG1vZGUsIHRodW1iIHNpemUgcmVwcmVzZW50cyBsb2FkZWQgY29udGVudCB2cyBlc3RpbWF0ZWQgdG90YWxcbiAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBrbm93IHRvdGFsLCB1c2UgbG9hZGVkIGl0ZW1zICogMiBhcyBlc3RpbWF0ZVxuICAgICAgICAgIGNvbnN0IGVzdGltYXRlZFRvdGFsID1cbiAgICAgICAgICAgIHRvdGFsVmlydHVhbFNpemUgPiAwID8gdG90YWxWaXJ0dWFsU2l6ZSA6IGxvYWRlZEl0ZW1zQ291bnQgKiAyO1xuICAgICAgICAgIHNjcm9sbFJhdGlvID1cbiAgICAgICAgICAgIGNvbnRhaW5lclNpemUgL1xuICAgICAgICAgICAgTWF0aC5tYXgoZXN0aW1hdGVkVG90YWwsIGxvYWRlZEl0ZW1zQ291bnQgKyBjb250YWluZXJTaXplKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBOb3JtYWwgY2FsY3VsYXRpb24gZm9yIG9mZnNldC9wYWdlIHN0cmF0ZWdpZXNcbiAgICAgICAgICBzY3JvbGxSYXRpbyA9IGNvbnRhaW5lclNpemUgLyB0b3RhbFZpcnR1YWxTaXplO1xuICAgICAgICB9XG5cbiAgICAgICAgdGh1bWJIZWlnaHQgPSBNYXRoLm1heCh0aHVtYk1pbkhlaWdodCwgc2Nyb2xsUmF0aW8gKiBjb250YWluZXJTaXplKTtcbiAgICAgICAgc2Nyb2xsYmFyVGh1bWIuc3R5bGUuaGVpZ2h0ID0gYCR7dGh1bWJIZWlnaHR9cHhgO1xuICAgICAgICB1cGRhdGVQb3NpdGlvbihjb21wb25lbnQudmlld3BvcnQ/LmdldFNjcm9sbFBvc2l0aW9uKCkgfHwgMCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSB0aHVtYiBwb3NpdGlvblxuICAgIGNvbnN0IHVwZGF0ZVBvc2l0aW9uID0gKHNjcm9sbFBvczogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoIXNjcm9sbGJhclRodW1iIHx8ICFzY3JvbGxiYXJUcmFjaykgcmV0dXJuO1xuXG4gICAgICBjb25zdCBzY3JvbGxhYmxlRGlzdGFuY2UgPSB0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZTtcbiAgICAgIGlmIChzY3JvbGxhYmxlRGlzdGFuY2UgPD0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IE1hdGgubWluKFxuICAgICAgICAxLFxuICAgICAgICBNYXRoLm1heCgwLCBzY3JvbGxQb3MgLyBzY3JvbGxhYmxlRGlzdGFuY2UpXG4gICAgICApO1xuICAgICAgY29uc3QgbWF4VGh1bWJQb3NpdGlvbiA9XG4gICAgICAgIHNjcm9sbGJhclRyYWNrLmNsaWVudEhlaWdodCAtIHNjcm9sbGJhclRodW1iLmNsaWVudEhlaWdodDtcbiAgICAgIGNvbnN0IHRodW1iUG9zaXRpb24gPSBzY3JvbGxSYXRpbyAqIG1heFRodW1iUG9zaXRpb247XG5cbiAgICAgIHNjcm9sbGJhclRodW1iLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKCR7dGh1bWJQb3NpdGlvbn1weClgO1xuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgdHJhY2sgY2xpY2tcbiAgICBjb25zdCBoYW5kbGVUcmFja0NsaWNrID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmICghc2Nyb2xsYmFyVHJhY2sgfHwgIXNjcm9sbGJhclRodW1iIHx8IGUudGFyZ2V0ID09PSBzY3JvbGxiYXJUaHVtYilcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0cmFja1JlY3QgPSBzY3JvbGxiYXJUcmFjay5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IGNsaWNrWSA9IGUuY2xpZW50WSAtIHRyYWNrUmVjdC50b3A7XG4gICAgICBjb25zdCB0aHVtYkNlbnRlclkgPSBjbGlja1kgLSB0aHVtYkhlaWdodCAvIDI7XG4gICAgICBjb25zdCBtYXhUaHVtYlBvc2l0aW9uID0gY29udGFpbmVyU2l6ZSAtIHRodW1iSGVpZ2h0O1xuICAgICAgY29uc3QgdGh1bWJQb3NpdGlvbiA9IE1hdGgubWF4KFxuICAgICAgICAwLFxuICAgICAgICBNYXRoLm1pbih0aHVtYkNlbnRlclksIG1heFRodW1iUG9zaXRpb24pXG4gICAgICApO1xuICAgICAgY29uc3Qgc2Nyb2xsUmF0aW8gPSB0aHVtYlBvc2l0aW9uIC8gbWF4VGh1bWJQb3NpdGlvbjtcbiAgICAgIGNvbnN0IHRhcmdldFNjcm9sbFBvc2l0aW9uID1cbiAgICAgICAgc2Nyb2xsUmF0aW8gKiAodG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuXG4gICAgICBjb21wb25lbnQudmlld3BvcnQ/LnNjcm9sbFRvUG9zaXRpb24odGFyZ2V0U2Nyb2xsUG9zaXRpb24pO1xuICAgIH07XG5cbiAgICAvLyBNb3VzZSBldmVudCBoYW5kbGVyc1xuICAgIGNvbnN0IGhhbmRsZVRodW1iTW91c2VEb3duID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIGlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgZHJhZ1N0YXJ0WSA9IGUuY2xpZW50WTtcbiAgICAgIGRyYWdTdGFydFNjcm9sbFBvc2l0aW9uID0gY29tcG9uZW50LnZpZXdwb3J0Py5nZXRTY3JvbGxQb3NpdGlvbigpIHx8IDA7XG5cbiAgICAgIGlmIChzY3JvbGxiYXJUcmFjaykge1xuICAgICAgICBhZGRDbGFzcyhcbiAgICAgICAgICBzY3JvbGxiYXJUcmFjayxcbiAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSX0RSQUdHSU5HXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVtaXQgZHJhZyBzdGFydCBldmVudCB0byBub3RpZnkgdmlld3BvcnRcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpkcmFnLXN0YXJ0XCIsIHtcbiAgICAgICAgc291cmNlOiBcInNjcm9sbGJhclwiLFxuICAgICAgICBzdGFydFBvc2l0aW9uOiBkcmFnU3RhcnRTY3JvbGxQb3NpdGlvbixcbiAgICAgIH0pO1xuXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBoYW5kbGVNb3VzZVVwKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlTW91c2VNb3ZlID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmICghaXNEcmFnZ2luZyB8fCAhc2Nyb2xsYmFyVHJhY2sgfHwgIXNjcm9sbGJhclRodW1iKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGRlbHRhWSA9IGUuY2xpZW50WSAtIGRyYWdTdGFydFk7XG4gICAgICBjb25zdCB0cmFja0hlaWdodCA9IHNjcm9sbGJhclRyYWNrLmNsaWVudEhlaWdodDtcbiAgICAgIGNvbnN0IHRodW1iSGVpZ2h0ID0gc2Nyb2xsYmFyVGh1bWIuY2xpZW50SGVpZ2h0O1xuICAgICAgY29uc3QgbWF4VGh1bWJUcmF2ZWwgPSB0cmFja0hlaWdodCAtIHRodW1iSGVpZ2h0O1xuXG4gICAgICBpZiAobWF4VGh1bWJUcmF2ZWwgPD0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBkZWx0YVJhdGlvID0gZGVsdGFZIC8gbWF4VGh1bWJUcmF2ZWw7XG4gICAgICBjb25zdCBkcmFnU3RhcnRTY3JvbGxSYXRpbyA9XG4gICAgICAgIGRyYWdTdGFydFNjcm9sbFBvc2l0aW9uIC8gKHRvdGFsVmlydHVhbFNpemUgLSBjb250YWluZXJTaXplKTtcbiAgICAgIGNvbnN0IG5ld1Njcm9sbFJhdGlvID0gTWF0aC5tYXgoXG4gICAgICAgIDAsXG4gICAgICAgIE1hdGgubWluKDEsIGRyYWdTdGFydFNjcm9sbFJhdGlvICsgZGVsdGFSYXRpbylcbiAgICAgICk7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aHVtYiBwb3NpdGlvbiBpbW1lZGlhdGVseVxuICAgICAgY29uc3QgdGh1bWJQb3NpdGlvbiA9IG5ld1Njcm9sbFJhdGlvICogbWF4VGh1bWJUcmF2ZWw7XG4gICAgICBzY3JvbGxiYXJUaHVtYi5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgke3RodW1iUG9zaXRpb259cHgpYDtcblxuICAgICAgLy8gQ2FsY3VsYXRlIG5ldyBzY3JvbGwgcG9zaXRpb25cbiAgICAgIGNvbnN0IG5ld1Bvc2l0aW9uID0gbmV3U2Nyb2xsUmF0aW8gKiAodG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuICAgICAgbGFzdFJlcXVlc3RlZFNjcm9sbFBvc2l0aW9uID0gbmV3UG9zaXRpb247XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGJhcl0gTW91c2UgbW92ZTogbmV3UG9zPSR7bmV3UG9zaXRpb24udG9GaXhlZChcbiAgICAgIC8vICAgICAwXG4gICAgICAvLyAgICl9LCBhbmltYXRpb25GcmFtZUlkPSR7YW5pbWF0aW9uRnJhbWVJZH1gXG4gICAgICAvLyApO1xuXG4gICAgICAvLyBUaHJvdHRsZSB2aWV3cG9ydCB1cGRhdGVzXG4gICAgICBpZiAoYW5pbWF0aW9uRnJhbWVJZCA9PT0gbnVsbCAmJiBjb21wb25lbnQudmlld3BvcnQpIHtcbiAgICAgICAgYW5pbWF0aW9uRnJhbWVJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW1Njcm9sbGJhcl0gUkFGIGNhbGxiYWNrOiBzY3JvbGxpbmcgdG8gJHtsYXN0UmVxdWVzdGVkU2Nyb2xsUG9zaXRpb259YFxuICAgICAgICAgIC8vICk7XG4gICAgICAgICAgaWYgKGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbiAhPT0gbnVsbCAmJiBjb21wb25lbnQudmlld3BvcnQpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb1Bvc2l0aW9uKGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFuaW1hdGlvbkZyYW1lSWQgPSBudWxsO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlTW91c2VVcCA9ICgpID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1Njcm9sbGJhcl0gTW91c2UgdXAgLSBlbmRpbmcgZHJhZ1wiKTtcbiAgICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTtcblxuICAgICAgaWYgKGFuaW1hdGlvbkZyYW1lSWQgIT09IG51bGwpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoYW5pbWF0aW9uRnJhbWVJZCk7XG4gICAgICAgIGFuaW1hdGlvbkZyYW1lSWQgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAobGFzdFJlcXVlc3RlZFNjcm9sbFBvc2l0aW9uICE9PSBudWxsICYmIGNvbXBvbmVudC52aWV3cG9ydCkge1xuICAgICAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9Qb3NpdGlvbihsYXN0UmVxdWVzdGVkU2Nyb2xsUG9zaXRpb24pO1xuICAgICAgICBsYXN0UmVxdWVzdGVkU2Nyb2xsUG9zaXRpb24gPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2Nyb2xsYmFyVHJhY2spIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3MoXG4gICAgICAgICAgc2Nyb2xsYmFyVHJhY2ssXG4gICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlNDUk9MTEJBUi5DTEFTU0VTLlNDUk9MTEJBUl9EUkFHR0lOR1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBFbWl0IGRyYWcgZW5kIGV2ZW50XG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6ZHJhZy1lbmRcIiwge1xuICAgICAgICBzb3VyY2U6IFwic2Nyb2xsYmFyXCIsXG4gICAgICAgIGVuZFBvc2l0aW9uOiBjb21wb25lbnQudmlld3BvcnQ/LmdldFNjcm9sbFBvc2l0aW9uKCkgfHwgMCxcbiAgICAgIH0pO1xuXG4gICAgICBoaWRlKCk7XG5cbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgaGFuZGxlTW91c2VNb3ZlKTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGhhbmRsZU1vdXNlVXApO1xuICAgIH07XG5cbiAgICAvLyBJbml0aWFsaXplIGZ1bmN0aW9uXG4gICAgY29uc3QgaW5pdGlhbGl6ZSA9ICgpID0+IHtcbiAgICAgIGlmIChpc0luaXRpYWxpemVkKSByZXR1cm47XG5cbiAgICAgIHZpZXdwb3J0RWxlbWVudCA9IGNvbXBvbmVudC5lbGVtZW50Py5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBgLiR7UFJFRklYfS12aWV3cG9ydGBcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgIGlmICghdmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIltTY3JvbGxiYXJdIE5vIHZpZXdwb3J0IGVsZW1lbnQgZm91bmRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICB2aWV3cG9ydEVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICBgLiR7UFJFRklYfS0ke1ZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVJ9YFxuICAgICAgICApXG4gICAgICApXG4gICAgICAgIHJldHVybjtcblxuICAgICAgY3JlYXRlU2Nyb2xsYmFyRWxlbWVudHMoKTtcbiAgICAgIGlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgICBpZiAoc2Nyb2xsYmFyVHJhY2sgJiYgdmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgIHNjcm9sbGJhclRyYWNrLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVUcmFja0NsaWNrKTtcblxuICAgICAgICBpZiAoc2Nyb2xsYmFyVGh1bWIpIHtcbiAgICAgICAgICBzY3JvbGxiYXJUaHVtYi5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGhhbmRsZVRodW1iTW91c2VEb3duKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2VlbnRlclwiLCBzaG93LCB7IHBhc3NpdmU6IHRydWUgfSk7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgIFwibW91c2VsZWF2ZVwiLFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIGlmICghaXNEcmFnZ2luZykgaGlkZSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBwYXNzaXZlOiB0cnVlIH1cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIGN1cnJlbnQgdmlld3BvcnQgc3RhdGVcbiAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQpIHtcbiAgICAgICAgY29uc3QgaW5mbyA9IGNvbXBvbmVudC52aWV3cG9ydC5nZXRWaWV3cG9ydEluZm8oKTtcbiAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9IGluZm8udG90YWxWaXJ0dWFsU2l6ZTtcbiAgICAgICAgY29udGFpbmVyU2l6ZSA9IGluZm8uY29udGFpbmVyU2l6ZTtcblxuICAgICAgICAvLyBDaGVjayBpZiB3ZSdyZSBpbiBjdXJzb3IgbW9kZVxuICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb247XG4gICAgICAgIGNvbnN0IHZpZXdwb3J0Q29uZmlnID0gKGNvbXBvbmVudCBhcyBhbnkpLmNvbmZpZztcbiAgICAgICAgaXNDdXJzb3JNb2RlID0gdmlld3BvcnRDb25maWc/LnBhZ2luYXRpb24/LnN0cmF0ZWd5ID09PSBcImN1cnNvclwiO1xuXG4gICAgICAgIHVwZGF0ZUJvdW5kcyh0b3RhbFZpcnR1YWxTaXplLCBjb250YWluZXJTaXplKTtcbiAgICAgICAgdXBkYXRlUG9zaXRpb24oY29tcG9uZW50LnZpZXdwb3J0LmdldFNjcm9sbFBvc2l0aW9uKCkpO1xuICAgICAgfVxuXG4gICAgICAvLyBFdmVudCBsaXN0ZW5lcnNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6c2Nyb2xsXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFpc0RyYWdnaW5nKSB7XG4gICAgICAgICAgdXBkYXRlUG9zaXRpb24oZGF0YS5wb3NpdGlvbik7XG4gICAgICAgICAgc2hvdygpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDp2aXJ0dWFsLXNpemUtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRvdGFsVmlydHVhbFNpemUgPSBkYXRhLnRvdGFsVmlydHVhbFNpemU7XG4gICAgICAgIHVwZGF0ZUJvdW5kcyhkYXRhLnRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6Y29udGFpbmVyLXNpemUtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnRhaW5lclNpemUgPSBkYXRhLmNvbnRhaW5lclNpemU7XG4gICAgICAgIHVwZGF0ZUJvdW5kcyh0b3RhbFZpcnR1YWxTaXplLCBkYXRhLmNvbnRhaW5lclNpemUpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgaXRlbXMgbG9hZGVkIHRvIHVwZGF0ZSBzY3JvbGxiYXIgaW4gY3Vyc29yIG1vZGVcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6aXRlbXMtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChpc0N1cnNvck1vZGUpIHtcbiAgICAgICAgICBsb2FkZWRJdGVtc0NvdW50ID0gZGF0YS5sb2FkZWRDb3VudCB8fCAwO1xuICAgICAgICAgIHVwZGF0ZUJvdW5kcyh0b3RhbFZpcnR1YWxTaXplLCBjb250YWluZXJTaXplKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgdG90YWwgaXRlbXMgY2hhbmdlcyAoaW1wb3J0YW50IGZvciBjdXJzb3IgbW9kZSlcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6dG90YWwtaXRlbXMtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChpc0N1cnNvck1vZGUgJiYgZGF0YS50b3RhbCkge1xuICAgICAgICAgIC8vIEluIGN1cnNvciBtb2RlLCB0aGUgdG90YWwgaXMgZHluYW1pY1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYFtTY3JvbGxiYXJdIEN1cnNvciBtb2RlOiB1cGRhdGluZyBib3VuZHMgZm9yIG5ldyB0b3RhbCAke2RhdGEudG90YWx9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgdXBkYXRlQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gU3RvcmUgaW5pdGlhbGl6ZSBmdW5jdGlvblxuICAgIHN0b3JlRmVhdHVyZUZ1bmN0aW9uKGNvbXBvbmVudCwgXCJfc2Nyb2xsYmFySW5pdGlhbGl6ZVwiLCBpbml0aWFsaXplKTtcblxuICAgIC8vIEhvb2sgaW50byB2aWV3cG9ydCBpbml0aWFsaXphdGlvblxuICAgIHdyYXBJbml0aWFsaXplKGNvbXBvbmVudCwgaW5pdGlhbGl6ZSk7XG5cbiAgICAvLyBDbGVhbnVwXG4gICAgY29uc3QgZGVzdHJveSA9ICgpID0+IHtcbiAgICAgIGlmIChzY3JvbGxiYXJUcmFjaykge1xuICAgICAgICBzY3JvbGxiYXJUcmFjay5yZW1vdmUoKTtcbiAgICAgICAgc2Nyb2xsYmFyVHJhY2sgPSBudWxsO1xuICAgICAgfVxuICAgICAgc2Nyb2xsYmFyVGh1bWIgPSBudWxsO1xuICAgICAgdmlld3BvcnRFbGVtZW50ID0gbnVsbDtcbiAgICAgIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAgICAgaWYgKGhpZGVUaW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dChoaWRlVGltZW91dCk7XG4gICAgICAgIGhpZGVUaW1lb3V0ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgaGFuZGxlTW91c2VVcCk7XG4gICAgfTtcblxuICAgIHN0b3JlRmVhdHVyZUZ1bmN0aW9uKGNvbXBvbmVudCwgXCJfc2Nyb2xsYmFyRGVzdHJveVwiLCBkZXN0cm95KTtcbiAgICB3cmFwRGVzdHJveShjb21wb25lbnQsIGRlc3Ryb3kpO1xuXG4gICAgLy8gUmV0dXJuIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBzY3JvbGxiYXI6IHsgc2hvdywgaGlkZSwgdXBkYXRlQm91bmRzLCB1cGRhdGVQb3NpdGlvbiB9LFxuICAgIH07XG4gIH07XG59XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL2NvbGxlY3Rpb24udHNcblxuLyoqXG4gKiBDb2xsZWN0aW9uIEZlYXR1cmUgLSBEYXRhIG1hbmFnZW1lbnQgYW5kIHJhbmdlIGxvYWRpbmdcbiAqIEhhbmRsZXMgY29sbGVjdGlvbiBpbnRlZ3JhdGlvbiwgcGFnaW5hdGlvbiwgYW5kIGRhdGEgZmV0Y2hpbmdcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZJRVdQT1JUX0NPTlNUQU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHdyYXBEZXN0cm95IH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0aW9uQ29uZmlnIHtcbiAgY29sbGVjdGlvbj86IGFueTsgLy8gQ29sbGVjdGlvbiBhZGFwdGVyXG4gIHJhbmdlU2l6ZT86IG51bWJlcjsgLy8gRGVmYXVsdCByYW5nZSBzaXplIGZvciBsb2FkaW5nXG4gIHN0cmF0ZWd5PzogXCJvZmZzZXRcIiB8IFwicGFnZVwiIHwgXCJjdXJzb3JcIjsgLy8gTG9hZGluZyBzdHJhdGVneVxuICB0cmFuc2Zvcm0/OiAoaXRlbTogYW55KSA9PiBhbnk7IC8vIEl0ZW0gdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25cbiAgY2FuY2VsTG9hZFRocmVzaG9sZD86IG51bWJlcjsgLy8gVmVsb2NpdHkgdGhyZXNob2xkIGZvciBjYW5jZWxsaW5nIGxvYWRzXG4gIG1heENvbmN1cnJlbnRSZXF1ZXN0cz86IG51bWJlcjtcbiAgZW5hYmxlUmVxdWVzdFF1ZXVlPzogYm9vbGVhbjtcbiAgbWF4UXVldWVTaXplPzogbnVtYmVyO1xuICBsb2FkT25EcmFnRW5kPzogYm9vbGVhbjsgLy8gRW5hYmxlIGxvYWRpbmcgd2hlbiBkcmFnIGVuZHMgKHNhZmV0eSBtZWFzdXJlKVxuICBpbml0aWFsU2Nyb2xsSW5kZXg/OiBudW1iZXI7IC8vIEluaXRpYWwgc2Nyb2xsIHBvc2l0aW9uICgwLWJhc2VkIGluZGV4KVxuICBzZWxlY3RJZD86IHN0cmluZyB8IG51bWJlcjsgLy8gSUQgb2YgaXRlbSB0byBzZWxlY3QgYWZ0ZXIgaW5pdGlhbCBsb2FkIGNvbXBsZXRlc1xuICBhdXRvTG9hZD86IGJvb2xlYW47IC8vIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBsb2FkIGRhdGEgb24gaW5pdGlhbGl6YXRpb24gKGRlZmF1bHQ6IHRydWUpXG4gIGF1dG9TZWxlY3RGaXJzdD86IGJvb2xlYW47IC8vIEF1dG9tYXRpY2FsbHkgc2VsZWN0IGZpcnN0IGl0ZW0gYWZ0ZXIgaW5pdGlhbCBsb2FkIChkZWZhdWx0OiBmYWxzZSlcbiAgLyoqIE1heGltdW0gaXRlbXMgdG8ga2VlcCBpbiBtZW1vcnkgKGRlZmF1bHQ6IDEwMDApICovXG4gIG1heENhY2hlZEl0ZW1zPzogbnVtYmVyO1xuICAvKiogRXh0cmEgaXRlbXMgdG8ga2VlcCBhcm91bmQgdmlzaWJsZSByYW5nZSBkdXJpbmcgZXZpY3Rpb24gKGRlZmF1bHQ6IDE1MCkgKi9cbiAgZXZpY3Rpb25CdWZmZXI/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGlvbkNvbXBvbmVudCB7XG4gIGNvbGxlY3Rpb246IHtcbiAgICBsb2FkUmFuZ2U6IChvZmZzZXQ6IG51bWJlciwgbGltaXQ6IG51bWJlcikgPT4gUHJvbWlzZTxhbnlbXT47XG4gICAgbG9hZE1pc3NpbmdSYW5nZXM6IChcbiAgICAgIHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0sXG4gICAgICBjYWxsZXI/OiBzdHJpbmcsXG4gICAgKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIGdldExvYWRlZFJhbmdlczogKCkgPT4gU2V0PG51bWJlcj47XG4gICAgZ2V0UGVuZGluZ1JhbmdlczogKCkgPT4gU2V0PG51bWJlcj47XG4gICAgY2xlYXJGYWlsZWRSYW5nZXM6ICgpID0+IHZvaWQ7XG4gICAgcmV0cnlGYWlsZWRSYW5nZTogKHJhbmdlSWQ6IG51bWJlcikgPT4gUHJvbWlzZTxhbnlbXT47XG4gICAgc2V0VG90YWxJdGVtczogKHRvdGFsOiBudW1iZXIpID0+IHZvaWQ7XG4gICAgZ2V0VG90YWxJdGVtczogKCkgPT4gbnVtYmVyO1xuICAgIC8vIEN1cnNvci1zcGVjaWZpYyBtZXRob2RzXG4gICAgZ2V0Q3VycmVudEN1cnNvcjogKCkgPT4gc3RyaW5nIHwgbnVsbDtcbiAgICBnZXRDdXJzb3JGb3JQYWdlOiAocGFnZTogbnVtYmVyKSA9PiBzdHJpbmcgfCBudWxsO1xuICB9O1xufVxuXG4vKipcbiAqIEFkZHMgY29sbGVjdGlvbiBmdW5jdGlvbmFsaXR5IHRvIHZpZXdwb3J0IGNvbXBvbmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aENvbGxlY3Rpb24oY29uZmlnOiBDb2xsZWN0aW9uQ29uZmlnID0ge30pIHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KFxuICAgIGNvbXBvbmVudDogVCxcbiAgKTogVCAmIENvbGxlY3Rpb25Db21wb25lbnQgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbGxlY3Rpb24sXG4gICAgICByYW5nZVNpemUgPSBWSUVXUE9SVF9DT05TVEFOVFMuTE9BRElORy5ERUZBVUxUX1JBTkdFX1NJWkUsXG4gICAgICBzdHJhdGVneSA9IFwib2Zmc2V0XCIsXG4gICAgICB0cmFuc2Zvcm0sXG4gICAgICBjYW5jZWxMb2FkVGhyZXNob2xkID0gVklFV1BPUlRfQ09OU1RBTlRTLkxPQURJTkcuQ0FOQ0VMX1RIUkVTSE9MRCxcbiAgICAgIG1heENvbmN1cnJlbnRSZXF1ZXN0cyA9IFZJRVdQT1JUX0NPTlNUQU5UUy5MT0FESU5HXG4gICAgICAgIC5NQVhfQ09OQ1VSUkVOVF9SRVFVRVNUUyxcbiAgICAgIGVuYWJsZVJlcXVlc3RRdWV1ZSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5SRVFVRVNUX1FVRVVFLkVOQUJMRUQsXG4gICAgICBtYXhRdWV1ZVNpemUgPSBWSUVXUE9SVF9DT05TVEFOVFMuUkVRVUVTVF9RVUVVRS5NQVhfUVVFVUVfU0laRSxcbiAgICAgIGxvYWRPbkRyYWdFbmQgPSB0cnVlLCAvLyBEZWZhdWx0IHRvIHRydWUgYXMgc2FmZXR5IG1lYXN1cmVcbiAgICAgIGluaXRpYWxTY3JvbGxJbmRleCA9IDAsIC8vIFN0YXJ0IGZyb20gYmVnaW5uaW5nIGJ5IGRlZmF1bHRcbiAgICAgIHNlbGVjdElkLCAvLyBJRCBvZiBpdGVtIHRvIHNlbGVjdCBhZnRlciBpbml0aWFsIGxvYWRcbiAgICAgIGF1dG9Mb2FkID0gdHJ1ZSwgLy8gQXV0by1sb2FkIGluaXRpYWwgZGF0YSBieSBkZWZhdWx0XG4gICAgICBhdXRvU2VsZWN0Rmlyc3QgPSBmYWxzZSwgLy8gQXV0b21hdGljYWxseSBzZWxlY3QgZmlyc3QgaXRlbSBhZnRlciBpbml0aWFsIGxvYWRcbiAgICAgIG1heENhY2hlZEl0ZW1zID0gMTAwMCwgLy8gTWF4aW11bSBpdGVtcyB0byBrZWVwIGluIG1lbW9yeVxuICAgICAgZXZpY3Rpb25CdWZmZXIgPSAxNTAsIC8vIEV4dHJhIGl0ZW1zIHRvIGtlZXAgYXJvdW5kIHZpc2libGUgcmFuZ2VcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gVHJhY2sgaWYgd2UndmUgY29tcGxldGVkIHRoZSBpbml0aWFsIGxvYWQgZm9yIGluaXRpYWxTY3JvbGxJbmRleFxuICAgIC8vIFRoaXMgcHJldmVudHMgdGhlIHZpZXdwb3J0OnJhbmdlLWNoYW5nZWQgbGlzdGVuZXIgZnJvbSBsb2FkaW5nIHBhZ2UgMVxuICAgIGxldCBoYXNDb21wbGV0ZWRJbml0aWFsUG9zaXRpb25Mb2FkID0gZmFsc2U7XG4gICAgY29uc3QgaGFzSW5pdGlhbFNjcm9sbEluZGV4ID0gaW5pdGlhbFNjcm9sbEluZGV4ID4gMDtcblxuICAgIC8vIGNvbnNvbGUubG9nKFwiW1ZpZXdwb3J0IENvbGxlY3Rpb25dIEluaXRpYWxpemVkIHdpdGggY29uZmlnOlwiLCB7XG4gICAgLy8gICBzdHJhdGVneSxcbiAgICAvLyAgIHJhbmdlU2l6ZSxcbiAgICAvLyAgIGluaXRpYWxTY3JvbGxJbmRleCxcbiAgICAvLyB9KTtcblxuICAgIC8vIExvYWRpbmcgbWFuYWdlciBzdGF0ZVxuICAgIGludGVyZmFjZSBRdWV1ZWRSZXF1ZXN0IHtcbiAgICAgIHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH07XG4gICAgICBwcmlvcml0eTogXCJoaWdoXCIgfCBcIm5vcm1hbFwiIHwgXCJsb3dcIjtcbiAgICAgIHRpbWVzdGFtcDogbnVtYmVyO1xuICAgICAgcmVzb2x2ZTogKCkgPT4gdm9pZDtcbiAgICAgIHJlamVjdDogKGVycm9yOiBhbnkpID0+IHZvaWQ7XG4gICAgICBjYWxsZXI/OiBzdHJpbmc7XG4gICAgfVxuXG4gICAgLy8gU3RhdGUgdHJhY2tpbmdcbiAgICBsZXQgY3VycmVudFZlbG9jaXR5ID0gMDtcbiAgICBsZXQgYWN0aXZlTG9hZENvdW50ID0gMDtcbiAgICBsZXQgY29tcGxldGVkTG9hZHMgPSAwO1xuICAgIGxldCBmYWlsZWRMb2FkcyA9IDA7XG4gICAgbGV0IGNhbmNlbGxlZExvYWRzID0gMDtcbiAgICBsZXQgaXNEcmFnZ2luZyA9IGZhbHNlOyAvLyBUcmFjayBkcmFnIHN0YXRlXG5cbiAgICAvLyBDYWNoZSBldmljdGlvbiBjb25maWd1cmF0aW9uIChmcm9tIGNvbmZpZylcbiAgICBjb25zdCBNQVhfQ0FDSEVEX0lURU1TID0gbWF4Q2FjaGVkSXRlbXM7XG4gICAgY29uc3QgRVZJQ1RJT05fQlVGRkVSID0gZXZpY3Rpb25CdWZmZXI7XG5cbiAgICAvLyBNZW1vcnkgZGlhZ25vc3RpY3NcbiAgICBjb25zdCBsb2dNZW1vcnlTdGF0cyA9IChjYWxsZXI6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgaXRlbUNvdW50ID0gaXRlbXMuZmlsdGVyKEJvb2xlYW4pLmxlbmd0aDtcbiAgICAgIGNvbnN0IGxvYWRlZFJhbmdlQ291bnQgPSBsb2FkZWRSYW5nZXMuc2l6ZTtcbiAgICAgIGNvbnN0IHBlbmRpbmdSYW5nZUNvdW50ID0gcGVuZGluZ1Jhbmdlcy5zaXplO1xuICAgICAgY29uc3QgYWJvcnRDb250cm9sbGVyQ291bnQgPSBhYm9ydENvbnRyb2xsZXJzLnNpemU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEV2aWN0IGl0ZW1zIGZhciBmcm9tIHRoZSBjdXJyZW50IHZpc2libGUgcmFuZ2UgdG8gcHJldmVudCBtZW1vcnkgYmxvYXRcbiAgICAgKiBLZWVwcyBpdGVtcyB3aXRoaW4gRVZJQ1RJT05fQlVGRkVSIG9mIHRoZSB2aXNpYmxlIHJhbmdlXG4gICAgICovXG4gICAgY29uc3QgZXZpY3REaXN0YW50SXRlbXMgPSAodmlzaWJsZVN0YXJ0OiBudW1iZXIsIHZpc2libGVFbmQ6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgaXRlbUNvdW50ID0gaXRlbXMuZmlsdGVyKEJvb2xlYW4pLmxlbmd0aDtcblxuICAgICAgLy8gT25seSBldmljdCBpZiB3ZSBoYXZlIG1vcmUgdGhhbiBNQVhfQ0FDSEVEX0lURU1TXG4gICAgICBpZiAoaXRlbUNvdW50IDw9IE1BWF9DQUNIRURfSVRFTVMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBrZWVwU3RhcnQgPSBNYXRoLm1heCgwLCB2aXNpYmxlU3RhcnQgLSBFVklDVElPTl9CVUZGRVIpO1xuICAgICAgY29uc3Qga2VlcEVuZCA9IHZpc2libGVFbmQgKyBFVklDVElPTl9CVUZGRVI7XG5cbiAgICAgIGxldCBldmljdGVkQ291bnQgPSAwO1xuICAgICAgY29uc3QgcmFuZ2VzVG9SZW1vdmUgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICAgICAgLy8gRmluZCBpdGVtcyB0byBldmljdCBhbmQgdHJhY2sgd2hpY2ggcmFuZ2VzIGFyZSBhZmZlY3RlZFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaXRlbXNbaV0gIT09IHVuZGVmaW5lZCAmJiAoaSA8IGtlZXBTdGFydCB8fCBpID4ga2VlcEVuZCkpIHtcbiAgICAgICAgICBkZWxldGUgaXRlbXNbaV07XG4gICAgICAgICAgZXZpY3RlZENvdW50Kys7XG4gICAgICAgICAgLy8gTWFyayB0aGUgcmFuZ2UgY29udGFpbmluZyB0aGlzIGl0ZW0gZm9yIHJlbW92YWwgZnJvbSBsb2FkZWRSYW5nZXNcbiAgICAgICAgICAvLyBUaGlzIGVuc3VyZXMgdGhlIHJhbmdlIHdpbGwgYmUgcmVsb2FkZWQgd2hlbiBzY3JvbGxpbmcgYmFja1xuICAgICAgICAgIGNvbnN0IGFmZmVjdGVkUmFuZ2VJZCA9IE1hdGguZmxvb3IoaSAvIHJhbmdlU2l6ZSk7XG4gICAgICAgICAgcmFuZ2VzVG9SZW1vdmUuYWRkKGFmZmVjdGVkUmFuZ2VJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVtb3ZlIGFsbCByYW5nZXMgdGhhdCBoYWQgYW55IGl0ZW1zIGV2aWN0ZWRcbiAgICAgIC8vIFRoaXMgaXMgY3JpdGljYWw6IGV2ZW4gaWYgb25seSBwYXJ0IG9mIGEgcmFuZ2Ugd2FzIGV2aWN0ZWQsXG4gICAgICAvLyB3ZSBtdXN0IHJlbW92ZSBpdCBmcm9tIGxvYWRlZFJhbmdlcyBzbyBpdCBnZXRzIHJlbG9hZGVkXG4gICAgICAvLyBBbHNvIHJlbW92ZSBmcm9tIHBlbmRpbmdSYW5nZXMgLSBpZiBhIHNsb3cgcmVxdWVzdCBjb21wbGV0ZXMgZm9yIGFuIGV2aWN0ZWQgcmFuZ2UsXG4gICAgICAvLyB3ZSBkb24ndCB3YW50IGl0IHRvIGJsb2NrIGZ1dHVyZSBsb2FkcyB3aGVuIHVzZXIgc2Nyb2xscyBiYWNrXG4gICAgICByYW5nZXNUb1JlbW92ZS5mb3JFYWNoKChyYW5nZUlkKSA9PiB7XG4gICAgICAgIGxvYWRlZFJhbmdlcy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgIHBlbmRpbmdSYW5nZXMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICAvLyBDbGVhbiB1cCBhY3RpdmUgcmVxdWVzdHMgdHJhY2tpbmdcbiAgICAgICAgYWN0aXZlUmVxdWVzdHMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICAvLyBBbHNvIGFib3J0IGFueSBpbi1mbGlnaHQgcmVxdWVzdCBmb3IgdGhpcyByYW5nZSB0byBmcmVlIHVwIG5ldHdvcmsgcmVzb3VyY2VzXG4gICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBhYm9ydENvbnRyb2xsZXJzLmdldChyYW5nZUlkKTtcbiAgICAgICAgaWYgKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgICAgYWJvcnRDb250cm9sbGVycy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZXZpY3RlZENvdW50ID4gMCkge1xuICAgICAgICAvLyBFbWl0IGV2ZW50IGZvciByZW5kZXJpbmcgdG8gYWxzbyBjbGVhbiB1cFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY29sbGVjdGlvbjppdGVtcy1ldmljdGVkXCIsIHtcbiAgICAgICAgICBrZWVwU3RhcnQsXG4gICAgICAgICAga2VlcEVuZCxcbiAgICAgICAgICBldmljdGVkQ291bnQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBhY3RpdmVMb2FkUmFuZ2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgbGV0IGxvYWRSZXF1ZXN0UXVldWU6IFF1ZXVlZFJlcXVlc3RbXSA9IFtdO1xuXG4gICAgLy8gQWJvcnRDb250cm9sbGVyIG1hcCBmb3IgY2FuY2VsbGluZyBpbi1mbGlnaHQgcmVxdWVzdHNcbiAgICBjb25zdCBhYm9ydENvbnRyb2xsZXJzID0gbmV3IE1hcDxudW1iZXIsIEFib3J0Q29udHJvbGxlcj4oKTtcblxuICAgIC8vIFN0YXRlXG4gICAgbGV0IGl0ZW1zOiBhbnlbXSA9IFtdO1xuICAgIGxldCB0b3RhbEl0ZW1zID0gMDtcbiAgICBsZXQgbG9hZGVkUmFuZ2VzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgbGV0IHBlbmRpbmdSYW5nZXMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICBsZXQgZmFpbGVkUmFuZ2VzID0gbmV3IE1hcDxcbiAgICAgIG51bWJlcixcbiAgICAgIHtcbiAgICAgICAgYXR0ZW1wdHM6IG51bWJlcjtcbiAgICAgICAgbGFzdEVycm9yOiBFcnJvcjtcbiAgICAgICAgdGltZXN0YW1wOiBudW1iZXI7XG4gICAgICB9XG4gICAgPigpO1xuICAgIGxldCBhY3RpdmVSZXF1ZXN0cyA9IG5ldyBNYXA8bnVtYmVyLCBQcm9taXNlPGFueVtdPj4oKTtcblxuICAgIC8vIEN1cnNvciBwYWdpbmF0aW9uIHN0YXRlXG4gICAgbGV0IGN1cnJlbnRDdXJzb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjdXJzb3JNYXAgPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpOyAvLyBNYXAgcGFnZSBudW1iZXIgdG8gY3Vyc29yXG4gICAgbGV0IHBhZ2VUb09mZnNldE1hcCA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7IC8vIE1hcCBwYWdlIHRvIGFjdHVhbCBvZmZzZXRcbiAgICBsZXQgaGlnaGVzdExvYWRlZFBhZ2UgPSAwO1xuICAgIGxldCBkaXNjb3ZlcmVkVG90YWw6IG51bWJlciB8IG51bGwgPSBudWxsOyAvLyBUcmFjayBkaXNjb3ZlcmVkIHRvdGFsIGZyb20gQVBJXG4gICAgbGV0IGhhc1JlYWNoZWRFbmQgPSBmYWxzZTsgLy8gVHJhY2sgaWYgd2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIGRhdGFcblxuICAgIC8vIFNoYXJlIGl0ZW1zIGFycmF5IHdpdGggY29tcG9uZW50XG4gICAgY29tcG9uZW50Lml0ZW1zID0gaXRlbXM7XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSB1bmlxdWUgSUQgZm9yIGEgcmFuZ2UgYmFzZWQgb24gb2Zmc2V0IGFuZCB0aGUgYmFzZSByYW5nZSBzaXplXG4gICAgICovXG4gICAgY29uc3QgZ2V0UmFuZ2VJZCA9IChvZmZzZXQ6IG51bWJlciwgbGltaXQ6IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgICAvLyBBbHdheXMgdXNlIHRoZSBiYXNlIHJhbmdlU2l6ZSBmb3IgY29uc2lzdGVudCBJRHNcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBtZXJnZWQgcmFuZ2VzIGNhbiBiZSB0cmFja2VkIHByb3Blcmx5XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihvZmZzZXQgLyByYW5nZVNpemUpO1xuICAgIH07XG5cbiAgICAvLyBMb2FkaW5nIG1hbmFnZXIgaGVscGVyc1xuICAgIGNvbnN0IGdldFJhbmdlS2V5ID0gKHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pOiBzdHJpbmcgPT4ge1xuICAgICAgcmV0dXJuIGAke3JhbmdlLnN0YXJ0fS0ke3JhbmdlLmVuZH1gO1xuICAgIH07XG5cbiAgICBjb25zdCBjYW5Mb2FkID0gKCk6IGJvb2xlYW4gPT4ge1xuICAgICAgcmV0dXJuIGN1cnJlbnRWZWxvY2l0eSA8PSBjYW5jZWxMb2FkVGhyZXNob2xkO1xuICAgIH07XG5cbiAgICBjb25zdCBwcm9jZXNzUXVldWUgPSAoKSA9PiB7XG4gICAgICBpZiAoIWVuYWJsZVJlcXVlc3RRdWV1ZSB8fCBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAvLyBTb3J0IHF1ZXVlIGJ5IHByaW9yaXR5IGFuZCB0aW1lc3RhbXBcbiAgICAgIGxvYWRSZXF1ZXN0UXVldWUuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBwcmlvcml0eU9yZGVyID0geyBoaWdoOiAwLCBub3JtYWw6IDEsIGxvdzogMiB9O1xuICAgICAgICBjb25zdCBwcmlvcml0eURpZmYgPVxuICAgICAgICAgIHByaW9yaXR5T3JkZXJbYS5wcmlvcml0eV0gLSBwcmlvcml0eU9yZGVyW2IucHJpb3JpdHldO1xuICAgICAgICByZXR1cm4gcHJpb3JpdHlEaWZmICE9PSAwID8gcHJpb3JpdHlEaWZmIDogYS50aW1lc3RhbXAgLSBiLnRpbWVzdGFtcDtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBQcm9jZXNzIHJlcXVlc3RzIHVwIHRvIGNhcGFjaXR5XG4gICAgICB3aGlsZSAoXG4gICAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoID4gMCAmJlxuICAgICAgICBhY3RpdmVMb2FkQ291bnQgPCBtYXhDb25jdXJyZW50UmVxdWVzdHNcbiAgICAgICkge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gbG9hZFJlcXVlc3RRdWV1ZS5zaGlmdCgpO1xuICAgICAgICBpZiAocmVxdWVzdCkge1xuICAgICAgICAgIGV4ZWN1dGVRdWV1ZWRMb2FkKHJlcXVlc3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGV4ZWN1dGVRdWV1ZWRMb2FkID0gKHJlcXVlc3Q6IFF1ZXVlZFJlcXVlc3QpID0+IHtcbiAgICAgIGFjdGl2ZUxvYWRDb3VudCsrO1xuICAgICAgYWN0aXZlTG9hZFJhbmdlcy5hZGQoZ2V0UmFuZ2VLZXkocmVxdWVzdC5yYW5nZSkpO1xuXG4gICAgICAvLyBDYWxsIHRoZSBhY3R1YWwgbG9hZE1pc3NpbmdSYW5nZXMgZnVuY3Rpb25cbiAgICAgIGxvYWRNaXNzaW5nUmFuZ2VzSW50ZXJuYWwocmVxdWVzdC5yYW5nZSwgcmVxdWVzdC5jYWxsZXIpXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXF1ZXN0LnJlc29sdmUoKTtcbiAgICAgICAgICBjb21wbGV0ZWRMb2FkcysrO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgIHJlcXVlc3QucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICBmYWlsZWRMb2FkcysrO1xuICAgICAgICB9KVxuICAgICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgYWN0aXZlTG9hZENvdW50LS07XG4gICAgICAgICAgYWN0aXZlTG9hZFJhbmdlcy5kZWxldGUoZ2V0UmFuZ2VLZXkocmVxdWVzdC5yYW5nZSkpO1xuICAgICAgICAgIHByb2Nlc3NRdWV1ZSgpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtIGl0ZW1zIGlmIHRyYW5zZm9ybSBmdW5jdGlvbiBwcm92aWRlZFxuICAgICAqL1xuICAgIGNvbnN0IHRyYW5zZm9ybUl0ZW1zID0gKHJhd0l0ZW1zOiBhbnlbXSk6IGFueVtdID0+IHtcbiAgICAgIGlmICghdHJhbnNmb3JtKSByZXR1cm4gcmF3SXRlbXM7XG4gICAgICByZXR1cm4gcmF3SXRlbXMubWFwKHRyYW5zZm9ybSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIExvYWQgYSByYW5nZSBvZiBkYXRhXG4gICAgICovXG4gICAgY29uc3QgbG9hZFJhbmdlID0gYXN5bmMgKG9mZnNldDogbnVtYmVyLCBsaW1pdDogbnVtYmVyKTogUHJvbWlzZTxhbnlbXT4gPT4ge1xuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gbG9hZFJhbmdlIGNhbGxlZDogb2Zmc2V0PSR7b2Zmc2V0fSwgbGltaXQ9JHtsaW1pdH1gLFxuICAgICAgLy8gKTtcblxuICAgICAgaWYgKCFjb2xsZWN0aW9uKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIltDb2xsZWN0aW9uXSBObyBjb2xsZWN0aW9uIGFkYXB0ZXIgY29uZmlndXJlZFwiKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByYW5nZUlkID0gZ2V0UmFuZ2VJZChvZmZzZXQsIGxpbWl0KTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKGBbQ29sbGVjdGlvbl0gUmFuZ2UgSUQ6ICR7cmFuZ2VJZH1gKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBsb2FkZWRcbiAgICAgIGlmIChsb2FkZWRSYW5nZXMuaGFzKHJhbmdlSWQpKSB7XG4gICAgICAgIHJldHVybiBpdGVtcy5zbGljZShvZmZzZXQsIG9mZnNldCArIGxpbWl0KTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBwZW5kaW5nXG4gICAgICBpZiAocGVuZGluZ1Jhbmdlcy5oYXMocmFuZ2VJZCkpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdSZXF1ZXN0ID0gYWN0aXZlUmVxdWVzdHMuZ2V0KHJhbmdlSWQpO1xuICAgICAgICBpZiAoZXhpc3RpbmdSZXF1ZXN0KSB7XG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nUmVxdWVzdDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBNYXJrIGFzIHBlbmRpbmdcbiAgICAgIHBlbmRpbmdSYW5nZXMuYWRkKHJhbmdlSWQpO1xuXG4gICAgICAvLyBDcmVhdGUgQWJvcnRDb250cm9sbGVyIGZvciB0aGlzIHJlcXVlc3RcbiAgICAgIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIGFib3J0Q29udHJvbGxlcnMuc2V0KHJhbmdlSWQsIGFib3J0Q29udHJvbGxlcik7XG5cbiAgICAgIC8vIENyZWF0ZSByZXF1ZXN0IHByb21pc2VcbiAgICAgIGNvbnN0IHJlcXVlc3RQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBDYWxsIGNvbGxlY3Rpb24gYWRhcHRlciB3aXRoIGFwcHJvcHJpYXRlIHBhcmFtZXRlcnNcbiAgICAgICAgICBjb25zdCBwYWdlID0gTWF0aC5mbG9vcihvZmZzZXQgLyBsaW1pdCkgKyAxO1xuICAgICAgICAgIGxldCBwYXJhbXM6IGFueTtcblxuICAgICAgICAgIGlmIChzdHJhdGVneSA9PT0gXCJjdXJzb3JcIikge1xuICAgICAgICAgICAgLy8gRm9yIGN1cnNvciBwYWdpbmF0aW9uXG4gICAgICAgICAgICBpZiAocGFnZSA9PT0gMSkge1xuICAgICAgICAgICAgICAvLyBGaXJzdCBwYWdlIC0gbm8gY3Vyc29yXG4gICAgICAgICAgICAgIHBhcmFtcyA9IHsgbGltaXQgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgY3Vyc29yIGZvciBwcmV2aW91cyBwYWdlXG4gICAgICAgICAgICAgIGNvbnN0IHByZXZQYWdlQ3Vyc29yID0gY3Vyc29yTWFwLmdldChwYWdlIC0gMSk7XG4gICAgICAgICAgICAgIGlmICghcHJldlBhZ2VDdXJzb3IpIHtcbiAgICAgICAgICAgICAgICAvLyBDYW4ndCBsb2FkIHRoaXMgcGFnZSB3aXRob3V0IHByZXZpb3VzIGN1cnNvclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgIGBbQ29sbGVjdGlvbl0gQ2Fubm90IGxvYWQgcGFnZSAke3BhZ2V9IHdpdGhvdXQgY3Vyc29yIGZvciBwYWdlICR7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2UgLSAxXG4gICAgICAgICAgICAgICAgICB9YCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgIGBTZXF1ZW50aWFsIGxvYWRpbmcgcmVxdWlyZWQgLSBtaXNzaW5nIGN1cnNvciBmb3IgcGFnZSAke1xuICAgICAgICAgICAgICAgICAgICBwYWdlIC0gMVxuICAgICAgICAgICAgICAgICAgfWAsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBwYXJhbXMgPSB7IGN1cnNvcjogcHJldlBhZ2VDdXJzb3IsIGxpbWl0IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChzdHJhdGVneSA9PT0gXCJwYWdlXCIpIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IHsgcGFnZSwgbGltaXQgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gb2Zmc2V0IHN0cmF0ZWd5XG4gICAgICAgICAgICBwYXJhbXMgPSB7IG9mZnNldCwgbGltaXQgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgIGBbVmlld3BvcnQgQ29sbGVjdGlvbl0gTG9hZGluZyByYW5nZSBvZmZzZXQ9JHtvZmZzZXR9LCBsaW1pdD0ke2xpbWl0fSwgc3RyYXRlZ3k9JHtzdHJhdGVneX0sIGNhbGN1bGF0ZWQgcGFnZT0ke3BhZ2V9LCBwYXJhbXM6YCxcbiAgICAgICAgICAvLyAgIEpTT04uc3RyaW5naWZ5KHBhcmFtcylcbiAgICAgICAgICAvLyApO1xuXG4gICAgICAgICAgLy8gUGFzcyBhYm9ydCBzaWduYWwgdG8gdGhlIGFkYXB0ZXIgaWYgaXQgc3VwcG9ydHMgaXRcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNvbGxlY3Rpb24ucmVhZCh7XG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgICAgICBzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBFeHRyYWN0IGl0ZW1zIGFuZCB0b3RhbFxuICAgICAgICAgIGNvbnN0IHJhd0l0ZW1zID0gcmVzcG9uc2UuZGF0YSB8fCByZXNwb25zZS5pdGVtcyB8fCByZXNwb25zZTtcbiAgICAgICAgICBjb25zdCBtZXRhID0gcmVzcG9uc2UubWV0YSB8fCB7fTtcblxuICAgICAgICAgIC8vIEZvciBjdXJzb3IgcGFnaW5hdGlvbiwgdHJhY2sgdGhlIGN1cnNvciAoY2hlY2sgYm90aCBjdXJzb3IgYW5kIG5leHRDdXJzb3IpXG4gICAgICAgICAgY29uc3QgcmVzcG9uc2VDdXJzb3IgPSBtZXRhLmN1cnNvciB8fCBtZXRhLm5leHRDdXJzb3I7XG4gICAgICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImN1cnNvclwiICYmIHJlc3BvbnNlQ3Vyc29yKSB7XG4gICAgICAgICAgICBjdXJyZW50Q3Vyc29yID0gcmVzcG9uc2VDdXJzb3I7XG4gICAgICAgICAgICBjdXJzb3JNYXAuc2V0KHBhZ2UsIHJlc3BvbnNlQ3Vyc29yKTtcbiAgICAgICAgICAgIHBhZ2VUb09mZnNldE1hcC5zZXQocGFnZSwgb2Zmc2V0KTtcbiAgICAgICAgICAgIGhpZ2hlc3RMb2FkZWRQYWdlID0gTWF0aC5tYXgoaGlnaGVzdExvYWRlZFBhZ2UsIHBhZ2UpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gU3RvcmVkIGN1cnNvciBmb3IgcGFnZSAke3BhZ2V9OiAke3Jlc3BvbnNlQ3Vyc29yfWAsXG4gICAgICAgICAgICAvLyApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENoZWNrIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZFxuICAgICAgICAgIGlmIChzdHJhdGVneSA9PT0gXCJjdXJzb3JcIiAmJiBtZXRhLmhhc05leHQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBoYXNSZWFjaGVkRW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFJlYWNoZWQgZW5kIG9mIGN1cnNvciBwYWdpbmF0aW9uIGF0IHBhZ2UgJHtwYWdlfWAsXG4gICAgICAgICAgICAvLyApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFVwZGF0ZSBkaXNjb3ZlcmVkIHRvdGFsIGlmIHByb3ZpZGVkXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIG1ldGEudG90YWw6ICR7bWV0YS50b3RhbH0sIGRpc2NvdmVyZWRUb3RhbCBiZWZvcmU6ICR7ZGlzY292ZXJlZFRvdGFsfWAsXG4gICAgICAgICAgLy8gKTtcbiAgICAgICAgICBpZiAobWV0YS50b3RhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBkaXNjb3ZlcmVkVG90YWwgPSBtZXRhLnRvdGFsO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhgW0NvbGxlY3Rpb25dIGRpc2NvdmVyZWRUb3RhbCBhZnRlcjogJHtkaXNjb3ZlcmVkVG90YWx9YCk7XG5cbiAgICAgICAgICAvLyBUcmFuc2Zvcm0gaXRlbXNcbiAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZEl0ZW1zID0gdHJhbnNmb3JtSXRlbXMocmF3SXRlbXMpO1xuXG4gICAgICAgICAgLy8gQWRkIGl0ZW1zIHRvIGFycmF5XG4gICAgICAgICAgdHJhbnNmb3JtZWRJdGVtcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaXRlbXNbb2Zmc2V0ICsgaW5kZXhdID0gaXRlbTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEZvciBjdXJzb3Igc3RyYXRlZ3ksIGNhbGN1bGF0ZSBkeW5hbWljIHRvdGFsIGJhc2VkIG9uIGxvYWRlZCBkYXRhXG4gICAgICAgICAgLy8gVXNlIG51bGxpc2ggY29hbGVzY2luZyAoPz8pIGluc3RlYWQgb2YgfHwgdG8gaGFuZGxlIGRpc2NvdmVyZWRUb3RhbCA9IDAgY29ycmVjdGx5XG4gICAgICAgICAgbGV0IG5ld1RvdGFsID0gZGlzY292ZXJlZFRvdGFsID8/IHRvdGFsSXRlbXM7XG5cbiAgICAgICAgICAvLyBDUklUSUNBTCBGSVg6IFdoZW4gQVBJIHJldHVybnMgMCBpdGVtcyBvbiBwYWdlIDEgKG9mZnNldCAwKSwgdGhlIGxpc3QgaXMgZW1wdHkuXG4gICAgICAgICAgLy8gV2UgbXVzdCBzZXQgdG90YWxJdGVtcyB0byAwIHJlZ2FyZGxlc3Mgb2YgbWV0YS50b3RhbCBiZWluZyB1bmRlZmluZWQuXG4gICAgICAgICAgLy8gVGhpcyBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIGNvdW50PWZhbHNlIGlzIHNlbnQgYnV0IHRoZSBsaXN0IGlzIGFjdHVhbGx5IGVtcHR5LlxuICAgICAgICAgIGlmIChvZmZzZXQgPT09IDAgJiYgdHJhbnNmb3JtZWRJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIEVtcHR5IHJlc3VsdCBvbiBwYWdlIDEgLSBmb3JjaW5nIHRvdGFsSXRlbXMgdG8gMGAsXG4gICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgbmV3VG90YWwgPSAwO1xuICAgICAgICAgICAgZGlzY292ZXJlZFRvdGFsID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIG5ld1RvdGFsIGluaXRpYWw6ICR7bmV3VG90YWx9LCB0b3RhbEl0ZW1zOiAke3RvdGFsSXRlbXN9LCBzdHJhdGVneTogJHtzdHJhdGVneX1gLFxuICAgICAgICAgIC8vICk7XG5cbiAgICAgICAgICBpZiAoc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIpIHtcbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0b3RhbCBiYXNlZCBvbiBsb2FkZWQgaXRlbXMgKyBtYXJnaW5cbiAgICAgICAgICAgIGNvbnN0IGxvYWRlZEl0ZW1zQ291bnQgPSBpdGVtcy5maWx0ZXIoXG4gICAgICAgICAgICAgIChpdGVtKSA9PiBpdGVtICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICApLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IG1hcmdpbkl0ZW1zID0gaGFzUmVhY2hlZEVuZFxuICAgICAgICAgICAgICA/IDBcbiAgICAgICAgICAgICAgOiByYW5nZVNpemUgKlxuICAgICAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QQUdJTkFUSU9OLkNVUlNPUl9TQ1JPTExfTUFSR0lOX01VTFRJUExJRVI7XG4gICAgICAgICAgICBjb25zdCBtaW5WaXJ0dWFsSXRlbXMgPVxuICAgICAgICAgICAgICByYW5nZVNpemUgKlxuICAgICAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUEFHSU5BVElPTi5DVVJTT1JfTUlOX1ZJUlRVQUxfU0laRV9NVUxUSVBMSUVSO1xuXG4gICAgICAgICAgICAvLyBEeW5hbWljIHRvdGFsOiBsb2FkZWQgaXRlbXMgKyBtYXJnaW4gKHVubGVzcyB3ZSd2ZSByZWFjaGVkIHRoZSBlbmQpXG4gICAgICAgICAgICBuZXdUb3RhbCA9IE1hdGgubWF4KFxuICAgICAgICAgICAgICBsb2FkZWRJdGVtc0NvdW50ICsgbWFyZ2luSXRlbXMsXG4gICAgICAgICAgICAgIG1pblZpcnR1YWxJdGVtcyxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIEN1cnNvciBtb2RlIHZpcnR1YWwgc2l6ZTogbG9hZGVkPSR7bG9hZGVkSXRlbXNDb3VudH0sIG1hcmdpbj0ke21hcmdpbkl0ZW1zfSwgdG90YWw9JHtuZXdUb3RhbH0sIGhhc1JlYWNoZWRFbmQ9JHtoYXNSZWFjaGVkRW5kfWAsXG4gICAgICAgICAgICAvLyApO1xuXG4gICAgICAgICAgICAvLyBVcGRhdGUgdG90YWwgaWYgaXQgaGFzIGdyb3duXG4gICAgICAgICAgICBpZiAobmV3VG90YWwgPiB0b3RhbEl0ZW1zKSB7XG4gICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gVXBkYXRpbmcgY3Vyc29yIHZpcnR1YWwgc2l6ZSBmcm9tICR7dG90YWxJdGVtc30gdG8gJHtuZXdUb3RhbH1gLFxuICAgICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgICB0b3RhbEl0ZW1zID0gbmV3VG90YWw7XG4gICAgICAgICAgICAgIHNldFRvdGFsSXRlbXMobmV3VG90YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGb3Igb3RoZXIgc3RyYXRlZ2llcywgdXNlIGRpc2NvdmVyZWQgdG90YWwgb3IgY3VycmVudCB0b3RhbFxuICAgICAgICAgICAgLy8gVXNlIG51bGxpc2ggY29hbGVzY2luZyAoPz8pIGluc3RlYWQgb2YgfHwgdG8gaGFuZGxlIGRpc2NvdmVyZWRUb3RhbCA9IDAgY29ycmVjdGx5XG4gICAgICAgICAgICBuZXdUb3RhbCA9IGRpc2NvdmVyZWRUb3RhbCA/PyB0b3RhbEl0ZW1zO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFVwZGF0ZSBzdGF0ZVxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBCZWZvcmUgc3RhdGUgdXBkYXRlOiBuZXdUb3RhbD0ke25ld1RvdGFsfSwgdG90YWxJdGVtcz0ke3RvdGFsSXRlbXN9LCB3aWxsIHVwZGF0ZTogJHtuZXdUb3RhbCAhPT0gdG90YWxJdGVtc31gLFxuICAgICAgICAgIC8vICk7XG4gICAgICAgICAgaWYgKG5ld1RvdGFsICE9PSB0b3RhbEl0ZW1zKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhgW0NvbGxlY3Rpb25dIENhbGxpbmcgc2V0VG90YWxJdGVtcygke25ld1RvdGFsfSlgKTtcbiAgICAgICAgICAgIHRvdGFsSXRlbXMgPSBuZXdUb3RhbDtcbiAgICAgICAgICAgIHNldFRvdGFsSXRlbXMobmV3VG90YWwpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFVwZGF0ZSBjb21wb25lbnQgaXRlbXMgcmVmZXJlbmNlXG4gICAgICAgICAgY29tcG9uZW50Lml0ZW1zID0gaXRlbXM7XG5cbiAgICAgICAgICAvLyBFbWl0IGl0ZW1zIGNoYW5nZWQgZXZlbnRcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6aXRlbXMtY2hhbmdlZFwiLCB7XG4gICAgICAgICAgICB0b3RhbEl0ZW1zOiBuZXdUb3RhbCxcbiAgICAgICAgICAgIGxvYWRlZENvdW50OiBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gIT09IHVuZGVmaW5lZCkubGVuZ3RoLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gVXBkYXRlIHZpZXdwb3J0IHN0YXRlXG4gICAgICAgICAgY29uc3Qgdmlld3BvcnRTdGF0ZSA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zdGF0ZTtcbiAgICAgICAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgICAgICAgLy8gVXNlIG51bGxpc2ggY29hbGVzY2luZyAoPz8pIGluc3RlYWQgb2YgfHwgdG8gaGFuZGxlIG5ld1RvdGFsID0gMCBjb3JyZWN0bHlcbiAgICAgICAgICAgIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyA9IG5ld1RvdGFsID8/IGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBWZXJpZnkgaXRlbXMgYXJlIGFjdHVhbGx5IHN0aWxsIGluIHRoZSBhcnJheSBiZWZvcmUgbWFya2luZyBhcyBsb2FkZWRcbiAgICAgICAgICAvLyBUaGlzIHByZXZlbnRzIGEgcmFjZSBjb25kaXRpb24gd2hlcmUgZXZpY3Rpb24gaGFwcGVucyBkdXJpbmcgYXN5bmMgbG9hZDpcbiAgICAgICAgICAvLyAxLiBMb2FkIHN0YXJ0cyBmb3IgcmFuZ2UgQVxuICAgICAgICAgIC8vIDIuIFVzZXIgc2Nyb2xscyB0byByYW5nZSBCXG4gICAgICAgICAgLy8gMy4gRXZpY3Rpb24gcmVtb3ZlcyBpdGVtcyBmcm9tIHJhbmdlIEEgYW5kIHJlbW92ZXMgZnJvbSBsb2FkZWRSYW5nZXNcbiAgICAgICAgICAvLyA0LiBMb2FkIGZvciByYW5nZSBBIGNvbXBsZXRlcywgd291bGQgcmUtYWRkIHRvIGxvYWRlZFJhbmdlc1xuICAgICAgICAgIC8vIDUuIFVzZXIgc2Nyb2xscyBiYWNrIHRvIEEsIGxvYWRlZFJhbmdlcyBzYXlzIGxvYWRlZCBidXQgaXRlbXMgYXJlIGdvbmVcbiAgICAgICAgICBjb25zdCBpdGVtc0FjdHVhbGx5U3RvcmVkID1cbiAgICAgICAgICAgIHRyYW5zZm9ybWVkSXRlbXMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgdHJhbnNmb3JtZWRJdGVtcy5ldmVyeShcbiAgICAgICAgICAgICAgKF8sIGlkeCkgPT4gaXRlbXNbb2Zmc2V0ICsgaWR4XSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChpdGVtc0FjdHVhbGx5U3RvcmVkKSB7XG4gICAgICAgICAgICAvLyBNYXJrIGFzIGxvYWRlZCBvbmx5IGlmIGl0ZW1zIGFyZSBhY3R1YWxseSBwcmVzZW50XG4gICAgICAgICAgICBsb2FkZWRSYW5nZXMuYWRkKHJhbmdlSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBBbHdheXMgY2xlYW4gdXAgcGVuZGluZy9mYWlsZWQgc3RhdGVcbiAgICAgICAgICBwZW5kaW5nUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgICBmYWlsZWRSYW5nZXMuZGVsZXRlKHJhbmdlSWQpO1xuXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFJhbmdlICR7cmFuZ2VJZH0gbG9hZGVkIHN1Y2Nlc3NmdWxseSB3aXRoICR7dHJhbnNmb3JtZWRJdGVtcy5sZW5ndGh9IGl0ZW1zYFxuICAgICAgICAgIC8vICk7XG5cbiAgICAgICAgICAvLyBMb2cgbWVtb3J5IHN0YXRzIHBlcmlvZGljYWxseSAoZXZlcnkgNSBsb2FkcylcbiAgICAgICAgICBpZiAoY29tcGxldGVkTG9hZHMgJSA1ID09PSAwKSB7XG4gICAgICAgICAgICBsb2dNZW1vcnlTdGF0cyhgbG9hZDoke2NvbXBsZXRlZExvYWRzfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEVtaXQgZXZlbnRzXG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCB7XG4gICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICAgIGl0ZW1zOiB0cmFuc2Zvcm1lZEl0ZW1zLFxuICAgICAgICAgICAgdG90YWw6IG5ld1RvdGFsLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRW1pdCBjb2xsZWN0aW9uIGxvYWRlZCBldmVudCB3aXRoIG1vcmUgZGV0YWlsc1xuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJjb2xsZWN0aW9uOnJhbmdlLWxvYWRlZFwiLCB7XG4gICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICAgIGl0ZW1zOiB0cmFuc2Zvcm1lZEl0ZW1zLFxuICAgICAgICAgICAgdG90YWw6IG5ld1RvdGFsLFxuICAgICAgICAgICAgcmFuZ2VJZCxcbiAgICAgICAgICAgIGl0ZW1zSW5NZW1vcnk6IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbSAhPT0gdW5kZWZpbmVkKS5sZW5ndGgsXG4gICAgICAgICAgICBjdXJzb3I6IHN0cmF0ZWd5ID09PSBcImN1cnNvclwiID8gY3VycmVudEN1cnNvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIFRyaWdnZXIgdmlld3BvcnQgdXBkYXRlXG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0Py51cGRhdGVWaWV3cG9ydD8uKCk7XG5cbiAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWRJdGVtcztcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBIYW5kbGUgQWJvcnRFcnJvciBhbmQgXCJGYWlsZWQgdG8gZmV0Y2hcIiAod2hpY2ggY2FuIG9jY3VyIG9uIGFib3J0KSBncmFjZWZ1bGx5XG4gICAgICAgICAgY29uc3QgaXNBYm9ydEVycm9yID1cbiAgICAgICAgICAgIChlcnJvciBhcyBFcnJvcikubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIgfHxcbiAgICAgICAgICAgICgoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2UgPT09IFwiRmFpbGVkIHRvIGZldGNoXCIgJiZcbiAgICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKTtcblxuICAgICAgICAgIGlmIChpc0Fib3J0RXJyb3IpIHtcbiAgICAgICAgICAgIHBlbmRpbmdSYW5nZXMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICAgICAgY2FuY2VsbGVkTG9hZHMrKztcbiAgICAgICAgICAgIC8vIERvbid0IHRocm93LCBqdXN0IHJldHVybiBlbXB0eSBhcnJheVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEhhbmRsZSBvdGhlciBlcnJvcnNcbiAgICAgICAgICBwZW5kaW5nUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgICBmYWlsZWRMb2FkcysrO1xuXG4gICAgICAgICAgY29uc3QgYXR0ZW1wdHMgPSAoZmFpbGVkUmFuZ2VzLmdldChyYW5nZUlkKT8uYXR0ZW1wdHMgfHwgMCkgKyAxO1xuICAgICAgICAgIGZhaWxlZFJhbmdlcy5zZXQocmFuZ2VJZCwge1xuICAgICAgICAgICAgYXR0ZW1wdHMsXG4gICAgICAgICAgICBsYXN0RXJyb3I6IGVycm9yIGFzIEVycm9yLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRW1pdCBlcnJvciBldmVudFxuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpyYW5nZS1lcnJvclwiLCB7XG4gICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgYXR0ZW1wdHMsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBhY3RpdmVSZXF1ZXN0cy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgICAgYWJvcnRDb250cm9sbGVycy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG5cbiAgICAgIGFjdGl2ZVJlcXVlc3RzLnNldChyYW5nZUlkLCByZXF1ZXN0UHJvbWlzZSk7XG4gICAgICByZXR1cm4gcmVxdWVzdFByb21pc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIExvYWQgbWlzc2luZyByYW5nZXMgZnJvbSBjb2xsZWN0aW9uXG4gICAgICovXG4gICAgY29uc3QgbG9hZE1pc3NpbmdSYW5nZXNJbnRlcm5hbCA9IGFzeW5jIChcbiAgICAgIHJhbmdlOiB7XG4gICAgICAgIHN0YXJ0OiBudW1iZXI7XG4gICAgICAgIGVuZDogbnVtYmVyO1xuICAgICAgfSxcbiAgICAgIGNhbGxlcj86IHN0cmluZyxcbiAgICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGlmICghY29sbGVjdGlvbikgcmV0dXJuO1xuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBsb2FkTWlzc2luZ1Jhbmdlc0ludGVybmFsIC0gcmFuZ2U6ICR7c3RhcnR9LSR7ZW5kfSwgc3RyYXRlZ3k6ICR7c3RyYXRlZ3l9YCxcbiAgICAgIC8vICk7XG5cbiAgICAgIC8vIEZvciBjdXJzb3IgcGFnaW5hdGlvbiwgd2UgbmVlZCB0byBsb2FkIHNlcXVlbnRpYWxseVxuICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImN1cnNvclwiKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGFnZSA9IE1hdGguZmxvb3IocmFuZ2Uuc3RhcnQgLyByYW5nZVNpemUpICsgMTtcbiAgICAgICAgY29uc3QgZW5kUGFnZSA9IE1hdGguZmxvb3IocmFuZ2UuZW5kIC8gcmFuZ2VTaXplKSArIDE7XG5cbiAgICAgICAgLy8gTGltaXQgaG93IG1hbnkgcGFnZXMgd2UnbGwgbG9hZCBhdCBvbmNlXG4gICAgICAgIGNvbnN0IG1heFBhZ2VzVG9Mb2FkID0gMTA7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRIaWdoZXN0UGFnZSA9IGhpZ2hlc3RMb2FkZWRQYWdlIHx8IDA7XG4gICAgICAgIGNvbnN0IGxpbWl0ZWRFbmRQYWdlID0gTWF0aC5taW4oXG4gICAgICAgICAgZW5kUGFnZSxcbiAgICAgICAgICBjdXJyZW50SGlnaGVzdFBhZ2UgKyBtYXhQYWdlc1RvTG9hZCxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIEN1cnNvciBtb2RlOiBuZWVkIHRvIGxvYWQgcGFnZXMgJHtzdGFydFBhZ2V9IHRvICR7ZW5kUGFnZX0sIGxpbWl0ZWQgdG8gJHtsaW1pdGVkRW5kUGFnZX1gLFxuICAgICAgICAvLyApO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlIG5lZWQgdG8gbG9hZCBwYWdlcyBzZXF1ZW50aWFsbHlcbiAgICAgICAgZm9yIChsZXQgcGFnZSA9IHN0YXJ0UGFnZTsgcGFnZSA8PSBsaW1pdGVkRW5kUGFnZTsgcGFnZSsrKSB7XG4gICAgICAgICAgY29uc3QgcmFuZ2VJZCA9IHBhZ2UgLSAxOyAvLyBDb252ZXJ0IHRvIDAtYmFzZWQgcmFuZ2VJZFxuICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHJhbmdlSWQgKiByYW5nZVNpemU7XG5cbiAgICAgICAgICAvLyBTa2lwIGlmIGFscmVhZHkgYmVpbmcgbG9hZGVkXG4gICAgICAgICAgaWYgKHBlbmRpbmdSYW5nZXMuaGFzKHJhbmdlSWQpKSB7XG4gICAgICAgICAgICAvLyBSYW5nZSBhbHJlYWR5IGJlaW5nIGxvYWRlZFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghbG9hZGVkUmFuZ2VzLmhhcyhyYW5nZUlkKSAmJiAhcGVuZGluZ1Jhbmdlcy5oYXMocmFuZ2VJZCkpIHtcbiAgICAgICAgICAgIC8vIEZvciBjdXJzb3IgcGFnaW5hdGlvbiwgd2UgbXVzdCBsb2FkIHNlcXVlbnRpYWxseVxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhbGwgcHJldmlvdXMgcGFnZXMgbG9hZGVkXG4gICAgICAgICAgICBpZiAocGFnZSA+IDEpIHtcbiAgICAgICAgICAgICAgbGV0IGNhbkxvYWQgPSB0cnVlO1xuICAgICAgICAgICAgICBmb3IgKGxldCBwcmV2UGFnZSA9IDE7IHByZXZQYWdlIDwgcGFnZTsgcHJldlBhZ2UrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZSYW5nZUlkID0gcHJldlBhZ2UgLSAxO1xuICAgICAgICAgICAgICAgIGlmICghbG9hZGVkUmFuZ2VzLmhhcyhwcmV2UmFuZ2VJZCkpIHtcbiAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIENhbm5vdCBsb2FkIHBhZ2UgJHtwYWdlfSAtIG5lZWQgdG8gbG9hZCBwYWdlICR7cHJldlBhZ2V9IGZpcnN0YCxcbiAgICAgICAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgICAgICAgICBjYW5Mb2FkID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgIC8vIFRyeSB0byBsb2FkIHRoZSBtaXNzaW5nIHBhZ2VcbiAgICAgICAgICAgICAgICAgIGlmICghcGVuZGluZ1Jhbmdlcy5oYXMocHJldlJhbmdlSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbG9hZFJhbmdlKHByZXZSYW5nZUlkICogcmFuZ2VTaXplLCByYW5nZVNpemUpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBgW0NvbGxlY3Rpb25dIEZhaWxlZCB0byBsb2FkIHByZXJlcXVpc2l0ZSBwYWdlICR7cHJldlBhZ2V9OmAsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gU3RvcCB0cnlpbmcgdG8gbG9hZCBmdXJ0aGVyIHBhZ2VzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICghY2FuTG9hZCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBTa2lwIHRoaXMgcGFnZSBmb3Igbm93XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgbG9hZFJhbmdlKG9mZnNldCwgcmFuZ2VTaXplKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFtDb2xsZWN0aW9uXSBGYWlsZWQgdG8gbG9hZCBwYWdlICR7cGFnZX06YCwgZXJyb3IpO1xuICAgICAgICAgICAgICBicmVhazsgLy8gU3RvcCBzZXF1ZW50aWFsIGxvYWRpbmcgb24gZXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW5kUGFnZSA+IGxpbWl0ZWRFbmRQYWdlKSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFN0b3BwZWQgYXQgcGFnZSAke2xpbWl0ZWRFbmRQYWdlfSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSBsb2FkaW5nIChyZXF1ZXN0ZWQgdXAgdG8gJHtlbmRQYWdlfSlgLFxuICAgICAgICAgIC8vICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIE9yaWdpbmFsIGxvZ2ljIGZvciBvZmZzZXQvcGFnZSBzdHJhdGVnaWVzXG4gICAgICAvLyBDYWxjdWxhdGUgcmFuZ2UgYm91bmRhcmllc1xuICAgICAgY29uc3Qgc3RhcnRSYW5nZSA9IE1hdGguZmxvb3IocmFuZ2Uuc3RhcnQgLyByYW5nZVNpemUpO1xuICAgICAgY29uc3QgZW5kUmFuZ2UgPSBNYXRoLmZsb29yKHJhbmdlLmVuZCAvIHJhbmdlU2l6ZSk7XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIHBhZ2Ugc3RyYXRlZ3kgLSBzdGFydFJhbmdlOiAke3N0YXJ0UmFuZ2V9LCBlbmRSYW5nZTogJHtlbmRSYW5nZX0sIGxvYWRlZFJhbmdlczogWyR7QXJyYXkuZnJvbShsb2FkZWRSYW5nZXMpLmpvaW4oXCIsIFwiKX1dYCxcbiAgICAgIC8vICk7XG5cbiAgICAgIC8vIENvbGxlY3QgcmFuZ2VzIHRoYXQgbmVlZCBsb2FkaW5nXG4gICAgICBjb25zdCByYW5nZXNUb0xvYWQ6IG51bWJlcltdID0gW107XG4gICAgICBmb3IgKGxldCByYW5nZUlkID0gc3RhcnRSYW5nZTsgcmFuZ2VJZCA8PSBlbmRSYW5nZTsgcmFuZ2VJZCsrKSB7XG4gICAgICAgIGlmICghbG9hZGVkUmFuZ2VzLmhhcyhyYW5nZUlkKSAmJiAhcGVuZGluZ1Jhbmdlcy5oYXMocmFuZ2VJZCkpIHtcbiAgICAgICAgICByYW5nZXNUb0xvYWQucHVzaChyYW5nZUlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocmFuZ2VzVG9Mb2FkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBBbGwgcmFuZ2VzIGFyZSBhbHJlYWR5IGxvYWRlZCBvciBwZW5kaW5nXG4gICAgICAgIC8vIEJ1dCB2ZXJpZnkgdGhlIGRhdGEgYWN0dWFsbHkgZXhpc3RzIGluIGl0ZW1zIGFycmF5IChkZWZlbnNpdmUgY2hlY2spXG4gICAgICAgIGZvciAobGV0IHJhbmdlSWQgPSBzdGFydFJhbmdlOyByYW5nZUlkIDw9IGVuZFJhbmdlOyByYW5nZUlkKyspIHtcbiAgICAgICAgICBpZiAobG9hZGVkUmFuZ2VzLmhhcyhyYW5nZUlkKSkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyByYW5nZSBhY3R1YWxseSBoYXMgZGF0YVxuICAgICAgICAgICAgY29uc3QgcmFuZ2VTdGFydCA9IHJhbmdlSWQgKiByYW5nZVNpemU7XG4gICAgICAgICAgICBjb25zdCBoYXNEYXRhID0gaXRlbXNcbiAgICAgICAgICAgICAgLnNsaWNlKHJhbmdlU3RhcnQsIHJhbmdlU3RhcnQgKyByYW5nZVNpemUpXG4gICAgICAgICAgICAgIC5zb21lKChpdGVtKSA9PiBpdGVtICE9PSB1bmRlZmluZWQpO1xuICAgICAgICAgICAgaWYgKCFoYXNEYXRhKSB7XG4gICAgICAgICAgICAgIC8vIFJhbmdlIG1hcmtlZCBsb2FkZWQgYnV0IG5vIGRhdGEgLSBmb3JjZSByZWxvYWRcbiAgICAgICAgICAgICAgbG9hZGVkUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgICAgICAgcmFuZ2VzVG9Mb2FkLnB1c2gocmFuZ2VJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGFyZSBxdWV1ZWQgcmVxdWVzdHMgd2Ugc2hvdWxkIHByb2Nlc3NcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHJhbmdlc1RvTG9hZC5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICBhY3RpdmVMb2FkQ291bnQgPCBtYXhDb25jdXJyZW50UmVxdWVzdHNcbiAgICAgICAgKSB7XG4gICAgICAgICAgcHJvY2Vzc1F1ZXVlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJhbmdlc1RvTG9hZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gTG9hZGluZyAke3Jhbmdlc1RvTG9hZC5sZW5ndGh9IHJhbmdlczogWyR7cmFuZ2VzVG9Mb2FkLmpvaW4oXCIsIFwiKX1dYCxcbiAgICAgIC8vICk7XG5cbiAgICAgIC8vIExvYWQgcmFuZ2VzIGluZGl2aWR1YWxseSAtIG5vIG1lcmdpbmcgdG8gYXZvaWQgbG9hZGluZyBvbGQgcmFuZ2VzXG4gICAgICBjb25zdCBwcm9taXNlcyA9IHJhbmdlc1RvTG9hZC5tYXAoKHJhbmdlSWQpID0+XG4gICAgICAgIGxvYWRSYW5nZShyYW5nZUlkICogcmFuZ2VTaXplLCByYW5nZVNpemUpLFxuICAgICAgKTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChwcm9taXNlcyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFZlbG9jaXR5LWF3YXJlIHdyYXBwZXIgZm9yIGxvYWRNaXNzaW5nUmFuZ2VzXG4gICAgICovXG4gICAgY29uc3QgbG9hZE1pc3NpbmdSYW5nZXMgPSAoXG4gICAgICByYW5nZToge1xuICAgICAgICBzdGFydDogbnVtYmVyO1xuICAgICAgICBlbmQ6IG51bWJlcjtcbiAgICAgIH0sXG4gICAgICBjYWxsZXI/OiBzdHJpbmcsXG4gICAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCByYW5nZUtleSA9IGdldFJhbmdlS2V5KHJhbmdlKTtcblxuICAgICAgICAvLyBDaGVjayBpZiBhbHJlYWR5IGxvYWRpbmdcbiAgICAgICAgaWYgKGFjdGl2ZUxvYWRSYW5nZXMuaGFzKHJhbmdlS2V5KSkge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTa2lwIGlmIGRyYWdnaW5nIHdpdGggbG93IHZlbG9jaXR5IChidXQgbm90IGlmIHdlJ3JlIGlkbGUpXG4gICAgICAgIGlmIChpc0RyYWdnaW5nICYmIGN1cnJlbnRWZWxvY2l0eSA8IDAuNSAmJiBjdXJyZW50VmVsb2NpdHkgPiAwKSB7XG4gICAgICAgICAgY2FuY2VsbGVkTG9hZHMrKztcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgdmVsb2NpdHkgLSBpZiB0b28gaGlnaCwgY2FuY2VsIHRoZSByZXF1ZXN0IGVudGlyZWx5XG4gICAgICAgIGlmICghY2FuTG9hZCgpKSB7XG4gICAgICAgICAgY2FuY2VsbGVkTG9hZHMrKztcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgY2FwYWNpdHlcbiAgICAgICAgaWYgKGFjdGl2ZUxvYWRDb3VudCA8IG1heENvbmN1cnJlbnRSZXF1ZXN0cykge1xuICAgICAgICAgIC8vIEV4ZWN1dGUgaW1tZWRpYXRlbHlcbiAgICAgICAgICBleGVjdXRlUXVldWVkTG9hZCh7XG4gICAgICAgICAgICByYW5nZSxcbiAgICAgICAgICAgIHByaW9yaXR5OiBcIm5vcm1hbFwiLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICAgIGNhbGxlcixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBlbmFibGVSZXF1ZXN0UXVldWUgJiZcbiAgICAgICAgICBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCA8IG1heFF1ZXVlU2l6ZVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBRdWV1ZSB0aGUgcmVxdWVzdFxuICAgICAgICAgIGxvYWRSZXF1ZXN0UXVldWUucHVzaCh7XG4gICAgICAgICAgICByYW5nZSxcbiAgICAgICAgICAgIHByaW9yaXR5OiBcIm5vcm1hbFwiLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICAgIGNhbGxlcixcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgIGBbTG9hZGluZ01hbmFnZXJdIFF1ZXVlZCByZXF1ZXN0IChhdCBjYXBhY2l0eSksIHF1ZXVlIHNpemU6ICR7bG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGh9YFxuICAgICAgICAgIC8vICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUXVldWUgaXMgZnVsbCAtIGJ1dCBkb24ndCBkcm9wIGlkbGUvcmFuZ2UtY2hhbmdlZCByZXF1ZXN0cywgdGhleSdyZSBjcml0aWNhbCFcbiAgICAgICAgICAvLyBJbnN0ZWFkLCBjbGVhciBvbGQgcXVldWVkIHJlcXVlc3RzIGFuZCBhZGQgdGhlIG5ldyBvbmVcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjYWxsZXIgPT09IFwidmlld3BvcnQ6aWRsZVwiIHx8XG4gICAgICAgICAgICBjYWxsZXIgPT09IFwidmlld3BvcnQ6cmFuZ2UtY2hhbmdlZFwiXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBDbGVhciBvbGQgcXVldWVkIHJlcXVlc3RzIC0gdGhleSdyZSBmb3IgcmFuZ2VzIHVzZXIgc2Nyb2xsZWQgcGFzdFxuICAgICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5mb3JFYWNoKChyKSA9PiB7XG4gICAgICAgICAgICAgIGNhbmNlbGxlZExvYWRzKys7XG4gICAgICAgICAgICAgIHIucmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAvLyBRdWV1ZSB0aGlzIHByaW9yaXR5IHJlcXVlc3RcbiAgICAgICAgICAgIGxvYWRSZXF1ZXN0UXVldWUucHVzaCh7XG4gICAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgICBwcmlvcml0eTogXCJoaWdoXCIsXG4gICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICAgICAgcmVqZWN0LFxuICAgICAgICAgICAgICBjYWxsZXIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUXVldWUgb3ZlcmZsb3cgLSByZXNvbHZlIHRvIGF2b2lkIGVycm9yc1xuICAgICAgICAgICAgaWYgKGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoID49IG1heFF1ZXVlU2l6ZSkge1xuICAgICAgICAgICAgICBjb25zdCByZW1vdmVkID0gbG9hZFJlcXVlc3RRdWV1ZS5zcGxpY2UoXG4gICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCAtIG1heFF1ZXVlU2l6ZSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmVtb3ZlZC5mb3JFYWNoKChyKSA9PiB7XG4gICAgICAgICAgICAgICAgY2FuY2VsbGVkTG9hZHMrKztcbiAgICAgICAgICAgICAgICByLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0cnkgYSBmYWlsZWQgcmFuZ2VcbiAgICAgKi9cbiAgICBjb25zdCByZXRyeUZhaWxlZFJhbmdlID0gYXN5bmMgKHJhbmdlSWQ6IG51bWJlcik6IFByb21pc2U8YW55W10+ID0+IHtcbiAgICAgIGZhaWxlZFJhbmdlcy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICBjb25zdCBvZmZzZXQgPSByYW5nZUlkICogcmFuZ2VTaXplO1xuICAgICAgcmV0dXJuIGxvYWRSYW5nZShvZmZzZXQsIHJhbmdlU2l6ZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldCB0b3RhbCBpdGVtcyBjb3VudFxuICAgICAqL1xuICAgIGNvbnN0IHNldFRvdGFsSXRlbXMgPSAodG90YWw6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgdG90YWxJdGVtcyA9IHRvdGFsO1xuXG4gICAgICAvLyBVcGRhdGUgdmlld3BvcnQgc3RhdGUncyB0b3RhbCBpdGVtc1xuICAgICAgY29uc3Qgdmlld3BvcnRTdGF0ZSA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zdGF0ZTtcbiAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyA9IHRvdGFsO1xuICAgICAgfVxuXG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6dG90YWwtaXRlbXMtY2hhbmdlZFwiLCB7IHRvdGFsIH0pO1xuICAgIH07XG5cbiAgICAvLyBIb29rIGludG8gdmlld3BvcnQgaW5pdGlhbGl6YXRpb25cbiAgICBjb25zdCBvcmlnaW5hbEluaXRpYWxpemUgPSBjb21wb25lbnQudmlld3BvcnQuaW5pdGlhbGl6ZTtcbiAgICBjb21wb25lbnQudmlld3BvcnQuaW5pdGlhbGl6ZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG9yaWdpbmFsSW5pdGlhbGl6ZSgpO1xuICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IGluaXRpYWxpemVkXG4gICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCBpbml0aWFsIHRvdGFsIGlmIHByb3ZpZGVkXG4gICAgICBpZiAoY29tcG9uZW50LnRvdGFsSXRlbXMpIHtcbiAgICAgICAgdG90YWxJdGVtcyA9IGNvbXBvbmVudC50b3RhbEl0ZW1zO1xuICAgICAgfVxuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGRyYWcgZXZlbnRzXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OmRyYWctc3RhcnRcIiwgKCkgPT4ge1xuICAgICAgICBpc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICAgIH0pO1xuXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OmRyYWctZW5kXCIsICgpID0+IHtcbiAgICAgICAgaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICAvLyBQcm9jZXNzIGFueSBxdWV1ZWQgcmVxdWVzdHMgYWZ0ZXIgZHJhZyBlbmRzIChzYWZldHkgbWVhc3VyZSlcbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHBsYWNlaG9sZGVycyBhcmUgcmVwbGFjZWQgZXZlbiBpZiBpZGxlIGRldGVjdGlvbiBmYWlsc1xuICAgICAgICBpZiAobG9hZE9uRHJhZ0VuZCkge1xuICAgICAgICAgIHByb2Nlc3NRdWV1ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciByYW5nZSBjaGFuZ2VzXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnJhbmdlLWNoYW5nZWRcIiwgYXN5bmMgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAvLyBEb24ndCBsb2FkIGR1cmluZyBmYXN0IHNjcm9sbGluZyAtIGxvYWRNaXNzaW5nUmFuZ2VzIHdpbGwgaGFuZGxlIHZlbG9jaXR5IGNoZWNrXG5cbiAgICAgICAgLy8gRXh0cmFjdCByYW5nZSBmcm9tIGV2ZW50IGRhdGEgLSB2aXJ0dWFsIGZlYXR1cmUgZW1pdHMgeyByYW5nZTogeyBzdGFydCwgZW5kIH0sIHNjcm9sbFBvc2l0aW9uIH1cbiAgICAgICAgY29uc3QgcmFuZ2UgPSBkYXRhLnJhbmdlIHx8IGRhdGE7XG4gICAgICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gcmFuZ2U7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgcmFuZ2UgYmVmb3JlIGxvYWRpbmdcbiAgICAgICAgaWYgKHR5cGVvZiBzdGFydCAhPT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgZW5kICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgXCJbQ29sbGVjdGlvbl0gSW52YWxpZCByYW5nZSBpbiB2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkIGV2ZW50OlwiLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNraXAgbG9hZGluZyBwYWdlIDEgaWYgd2UgaGF2ZSBhbiBpbml0aWFsU2Nyb2xsSW5kZXggYW5kIGhhdmVuJ3QgY29tcGxldGVkIGluaXRpYWwgbG9hZCB5ZXRcbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyB0aGUgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIGluIHZpcnR1YWwudHMgZnJvbSB0cmlnZ2VyaW5nIGEgcGFnZSAxIGxvYWRcbiAgICAgICAgLy8gYWZ0ZXIgd2UndmUgYWxyZWFkeSBzdGFydGVkIGxvYWRpbmcgdGhlIGNvcnJlY3QgaW5pdGlhbCBwYWdlXG4gICAgICAgIGlmIChoYXNJbml0aWFsU2Nyb2xsSW5kZXggJiYgIWhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQpIHtcbiAgICAgICAgICBjb25zdCBwYWdlMUVuZEluZGV4ID0gcmFuZ2VTaXplIC0gMTsgLy8gZS5nLiwgMjkgZm9yIHJhbmdlU2l6ZT0zMFxuICAgICAgICAgIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPD0gcGFnZTFFbmRJbmRleCkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHJlcXVlc3QgZm9yIHBhZ2UgMSwgc2tpcCBpdFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExvYWQgbWlzc2luZyByYW5nZXMgaWYgbmVlZGVkXG4gICAgICAgIGF3YWl0IGxvYWRNaXNzaW5nUmFuZ2VzKHsgc3RhcnQsIGVuZCB9LCBcInZpZXdwb3J0OnJhbmdlLWNoYW5nZWRcIik7XG5cbiAgICAgICAgLy8gRXZpY3QgZGlzdGFudCBpdGVtcyB0byBwcmV2ZW50IG1lbW9yeSBibG9hdFxuICAgICAgICBldmljdERpc3RhbnRJdGVtcyhzdGFydCwgZW5kKTtcblxuICAgICAgICAvLyBGb3IgY3Vyc29yIG1vZGUsIGNoZWNrIGlmIHdlIG5lZWQgdG8gdXBkYXRlIHZpcnR1YWwgc2l6ZVxuICAgICAgICBpZiAoc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIgJiYgIWhhc1JlYWNoZWRFbmQpIHtcbiAgICAgICAgICBjb25zdCBsb2FkZWRJdGVtc0NvdW50ID0gaXRlbXMuZmlsdGVyKFxuICAgICAgICAgICAgKGl0ZW0pID0+IGl0ZW0gIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICApLmxlbmd0aDtcbiAgICAgICAgICBjb25zdCBtYXJnaW5JdGVtcyA9XG4gICAgICAgICAgICByYW5nZVNpemUgKlxuICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlBBR0lOQVRJT04uQ1VSU09SX1NDUk9MTF9NQVJHSU5fTVVMVElQTElFUjtcbiAgICAgICAgICBjb25zdCBtaW5WaXJ0dWFsSXRlbXMgPVxuICAgICAgICAgICAgcmFuZ2VTaXplICpcbiAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QQUdJTkFUSU9OLkNVUlNPUl9NSU5fVklSVFVBTF9TSVpFX01VTFRJUExJRVI7XG4gICAgICAgICAgY29uc3QgZHluYW1pY1RvdGFsID0gTWF0aC5tYXgoXG4gICAgICAgICAgICBsb2FkZWRJdGVtc0NvdW50ICsgbWFyZ2luSXRlbXMsXG4gICAgICAgICAgICBtaW5WaXJ0dWFsSXRlbXMsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChkeW5hbWljVG90YWwgIT09IHRvdGFsSXRlbXMpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFVwZGF0aW5nIGN1cnNvciB2aXJ0dWFsIHNpemUgZnJvbSAke3RvdGFsSXRlbXN9IHRvICR7ZHluYW1pY1RvdGFsfWAsXG4gICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgc2V0VG90YWxJdGVtcyhkeW5hbWljVG90YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgdmVsb2NpdHkgY2hhbmdlc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDp2ZWxvY2l0eS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWZWxvY2l0eSA9IGN1cnJlbnRWZWxvY2l0eTtcbiAgICAgICAgY3VycmVudFZlbG9jaXR5ID0gTWF0aC5hYnMoZGF0YS52ZWxvY2l0eSB8fCAwKTtcblxuICAgICAgICAvLyBXaGVuIHZlbG9jaXR5IGRyb3BzIGJlbG93IHRocmVzaG9sZCwgcHJvY2VzcyBxdWV1ZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgcHJldmlvdXNWZWxvY2l0eSA+IGNhbmNlbExvYWRUaHJlc2hvbGQgJiZcbiAgICAgICAgICBjdXJyZW50VmVsb2NpdHkgPD0gY2FuY2VsTG9hZFRocmVzaG9sZFxuICAgICAgICApIHtcbiAgICAgICAgICBwcm9jZXNzUXVldWUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgaWRsZSBzdGF0ZSB0byBwcm9jZXNzIHF1ZXVlXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OmlkbGVcIiwgYXN5bmMgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBjdXJyZW50VmVsb2NpdHkgPSAwO1xuXG4gICAgICAgIC8vIFJlc2V0IGRyYWdnaW5nIHN0YXRlIG9uIGlkbGUgc2luY2UgdXNlciBoYXMgc3RvcHBlZCBtb3ZpbmdcbiAgICAgICAgaWYgKGlzRHJhZ2dpbmcpIHtcbiAgICAgICAgICBpc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgY3VycmVudCB2aXNpYmxlIHJhbmdlIGZyb20gdmlld3BvcnRcbiAgICAgICAgY29uc3Qgdmlld3BvcnRTdGF0ZSA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zdGF0ZTtcbiAgICAgICAgY29uc3QgdmlzaWJsZVJhbmdlID0gdmlld3BvcnRTdGF0ZT8udmlzaWJsZVJhbmdlO1xuXG4gICAgICAgIGlmICh2aXNpYmxlUmFuZ2UpIHtcbiAgICAgICAgICAvLyBDbGVhciBzdGFsZSByZXF1ZXN0cyBmcm9tIHF1ZXVlIHRoYXQgYXJlIGZhciBmcm9tIGN1cnJlbnQgdmlzaWJsZSByYW5nZVxuICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHJhbmdlU2l6ZSAqIDI7IC8vIEFsbG93IHNvbWUgYnVmZmVyXG4gICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZSA9IGxvYWRSZXF1ZXN0UXVldWUuZmlsdGVyKChyZXF1ZXN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0RW5kID0gcmVxdWVzdC5yYW5nZS5lbmQ7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0U3RhcnQgPSByZXF1ZXN0LnJhbmdlLnN0YXJ0O1xuICAgICAgICAgICAgY29uc3QgaXNSZWxldmFudCA9XG4gICAgICAgICAgICAgIHJlcXVlc3RFbmQgPj0gdmlzaWJsZVJhbmdlLnN0YXJ0IC0gYnVmZmVyICYmXG4gICAgICAgICAgICAgIHJlcXVlc3RTdGFydCA8PSB2aXNpYmxlUmFuZ2UuZW5kICsgYnVmZmVyO1xuXG4gICAgICAgICAgICBpZiAoIWlzUmVsZXZhbnQpIHtcbiAgICAgICAgICAgICAgcmVxdWVzdC5yZXNvbHZlKCk7IC8vIFJlc29sdmUgdG8gYXZvaWQgaGFuZ2luZyBwcm9taXNlc1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGlzUmVsZXZhbnQ7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBMb2FkIHRoZSBjdXJyZW50IHZpc2libGUgcmFuZ2UgaWYgbmVlZGVkXG4gICAgICAgICAgYXdhaXQgbG9hZE1pc3NpbmdSYW5nZXModmlzaWJsZVJhbmdlLCBcInZpZXdwb3J0OmlkbGVcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbHNvIHByb2Nlc3MgYW55IHF1ZXVlZCByZXF1ZXN0c1xuICAgICAgICBwcm9jZXNzUXVldWUoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGl0ZW0gcmVtb3ZhbCAtIERPTidUIGNsZWFyIGxvYWRlZFJhbmdlcyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlbG9hZFxuICAgICAgLy8gVGhlIGRhdGEgaXMgYWxyZWFkeSBzaGlmdGVkIGxvY2FsbHkgaW4gYXBpLnRzIGFuZCByZW5kZXJpbmcudHNcbiAgICAgIC8vIFJlbG9hZGluZyB3b3VsZCBjYXVzZSByYWNlIGNvbmRpdGlvbnMgYW5kIG92ZXJ3cml0ZSB0aGUgY29ycmVjdCB0b3RhbEl0ZW1zXG4gICAgICBjb21wb25lbnQub24/LihcIml0ZW06cmVtb3ZlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBbQ29sbGVjdGlvbl0gaXRlbTpyZW1vdmVkIGV2ZW50IC0gaW5kZXg6ICR7ZGF0YS5pbmRleH1gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtDb2xsZWN0aW9uXSBpdGVtcy5sZW5ndGg6ICR7aXRlbXMubGVuZ3RofWApO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBkaXNjb3ZlcmVkVG90YWwgdG8gbWF0Y2ggdGhlIG5ldyBjb3VudFxuICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHN0YWxlIGRpc2NvdmVyZWRUb3RhbCBmcm9tIGJlaW5nIHVzZWQgb24gbmV4dCBsb2FkXG4gICAgICAgIGlmIChkaXNjb3ZlcmVkVG90YWwgIT09IG51bGwgJiYgZGlzY292ZXJlZFRvdGFsID4gMCkge1xuICAgICAgICAgIGRpc2NvdmVyZWRUb3RhbCA9IGRpc2NvdmVyZWRUb3RhbCAtIDE7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFVwZGF0ZWQgZGlzY292ZXJlZFRvdGFsIHRvOiAke2Rpc2NvdmVyZWRUb3RhbH1gLFxuICAgICAgICAgIC8vICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOT1RFOiBEbyBOT1QgZGVjcmVtZW50IHRvdGFsSXRlbXMgaGVyZSFcbiAgICAgICAgLy8gYXBpLnRzIGFscmVhZHkgY2FsbHMgc2V0VG90YWxJdGVtcygpIGFmdGVyIGVtaXR0aW5nIGl0ZW06cmVtb3ZlLXJlcXVlc3QsXG4gICAgICAgIC8vIHdoaWNoIHByb3Blcmx5IHVwZGF0ZXMgdG90YWxJdGVtcy4gRGVjcmVtZW50aW5nIGhlcmUgd291bGQgY2F1c2UgYSBkb3VibGUtZGVjcmVtZW50LlxuXG4gICAgICAgIC8vIERPTidUIGNsZWFyIGxvYWRlZFJhbmdlcyAtIHdlIHdhbnQgdG8ga2VlcCB1c2luZyB0aGUgbG9jYWwgZGF0YVxuICAgICAgICAvLyBUaGUgZGF0YSBoYXMgYmVlbiBzaGlmdGVkIGxvY2FsbHkgYW5kIGlzIHN0aWxsIHZhbGlkXG4gICAgICAgIC8vIENsZWFyaW5nIHdvdWxkIHRyaWdnZXIgYSByZWxvYWQgd2hpY2ggY2F1c2VzIHJhY2UgY29uZGl0aW9uc1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIEtlZXBpbmcgbG9hZGVkUmFuZ2VzIGludGFjdDpgLFxuICAgICAgICAvLyAgIEFycmF5LmZyb20obG9hZGVkUmFuZ2VzKSxcbiAgICAgICAgLy8gKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBMb2FkIGluaXRpYWwgZGF0YSBpZiBjb2xsZWN0aW9uIGlzIGF2YWlsYWJsZSBhbmQgYXV0b0xvYWQgaXMgZW5hYmxlZFxuICAgICAgaWYgKGNvbGxlY3Rpb24gJiYgYXV0b0xvYWQpIHtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBpbml0aWFsIHNjcm9sbCBpbmRleCBPUiBhIHNlbGVjdElkLCBsb2FkIGRhdGEgZm9yIHRoYXQgcG9zaXRpb24gZGlyZWN0bHlcbiAgICAgICAgLy8gRG9uJ3QgdXNlIHNjcm9sbFRvSW5kZXgoKSBhcyBpdCB0cmlnZ2VycyBhbmltYXRpb24vdmVsb2NpdHkgdHJhY2tpbmdcbiAgICAgICAgLy8gdmlydHVhbC50cyBoYXMgYWxyZWFkeSBzZXQgdGhlIHNjcm9sbCBwb3NpdGlvbiBhbmQgY2FsY3VsYXRlZCB0aGUgdmlzaWJsZSByYW5nZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4ID4gMCB8fFxuICAgICAgICAgIChzZWxlY3RJZCAhPT0gdW5kZWZpbmVkICYmIHNlbGVjdElkICE9PSBudWxsKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBHZXQgdGhlIHZpc2libGUgcmFuZ2UgdGhhdCB3YXMgYWxyZWFkeSBjYWxjdWxhdGVkIGJ5IHZpcnR1YWwudHNcbiAgICAgICAgICAvLyBXZSBtaXNzZWQgdGhlIGluaXRpYWwgdmlld3BvcnQ6cmFuZ2UtY2hhbmdlZCBldmVudCBiZWNhdXNlIG91ciBsaXN0ZW5lciB3YXNuJ3QgcmVhZHkgeWV0XG4gICAgICAgICAgY29uc3QgdmlzaWJsZVJhbmdlID0gY29tcG9uZW50LnZpZXdwb3J0Py5nZXRWaXNpYmxlUmFuZ2U/LigpO1xuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdmlzaWJsZVJhbmdlICYmXG4gICAgICAgICAgICAodmlzaWJsZVJhbmdlLnN0YXJ0ID4gMCB8fCB2aXNpYmxlUmFuZ2UuZW5kID4gMClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIFVzZSB0aGUgcHJlLWNhbGN1bGF0ZWQgdmlzaWJsZSByYW5nZSBmcm9tIHZpcnR1YWwudHNcbiAgICAgICAgICAgIGxvYWRNaXNzaW5nUmFuZ2VzKHZpc2libGVSYW5nZSwgXCJpbml0aWFsLXBvc2l0aW9uXCIpXG4gICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBoYXNDb21wbGV0ZWRJbml0aWFsUG9zaXRpb25Mb2FkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAvLyBFbWl0IGV2ZW50IHRvIHNlbGVjdCBpdGVtIGFmdGVyIGluaXRpYWwgbG9hZCBpZiBzZWxlY3RJZCBpcyBwcm92aWRlZFxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY29sbGVjdGlvbjppbml0aWFsLWxvYWQtY29tcGxldGVcIiwge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RJZCxcbiAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4LFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgIFwiW0NvbGxlY3Rpb25dIEZhaWxlZCB0byBsb2FkIGluaXRpYWwgcG9zaXRpb24gZGF0YTpcIixcbiAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCA9IHRydWU7IC8vIEFsbG93IG5vcm1hbCBsb2FkaW5nIGV2ZW4gb24gZXJyb3JcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZhbGxiYWNrOiBjYWxjdWxhdGUgcmFuZ2UgZnJvbSBpbml0aWFsU2Nyb2xsSW5kZXhcbiAgICAgICAgICAgIC8vIFRoaXMgaGFuZGxlcyBlZGdlIGNhc2VzIHdoZXJlIHZpc2libGVSYW5nZSB3YXNuJ3QgcmVhZHlcbiAgICAgICAgICAgIGNvbnN0IG92ZXJzY2FuID0gMjtcbiAgICAgICAgICAgIGNvbnN0IGVzdGltYXRlZFZpc2libGVDb3VudCA9IE1hdGguY2VpbCg2MDAgLyA1MCk7IC8vIH4xMiBpdGVtc1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1heCgwLCBpbml0aWFsU2Nyb2xsSW5kZXggLSBvdmVyc2Nhbik7XG4gICAgICAgICAgICBjb25zdCBlbmQgPSBpbml0aWFsU2Nyb2xsSW5kZXggKyBlc3RpbWF0ZWRWaXNpYmxlQ291bnQgKyBvdmVyc2NhbjtcblxuICAgICAgICAgICAgbG9hZE1pc3NpbmdSYW5nZXMoeyBzdGFydCwgZW5kIH0sIFwiaW5pdGlhbC1wb3NpdGlvbi1mYWxsYmFja1wiKVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgLy8gRW1pdCBldmVudCB0byBzZWxlY3QgaXRlbSBhZnRlciBpbml0aWFsIGxvYWQgaWYgc2VsZWN0SWQgaXMgcHJvdmlkZWRcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImNvbGxlY3Rpb246aW5pdGlhbC1sb2FkLWNvbXBsZXRlXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0SWQsXG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxTY3JvbGxJbmRleCxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICBcIltDb2xsZWN0aW9uXSBGYWlsZWQgdG8gbG9hZCBpbml0aWFsIHBvc2l0aW9uIGRhdGEgKGZhbGxiYWNrKTpcIixcbiAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCA9IHRydWU7IC8vIEFsbG93IG5vcm1hbCBsb2FkaW5nIGV2ZW4gb24gZXJyb3JcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vIGluaXRpYWwgc2Nyb2xsIGluZGV4IC0gbG9hZCBmcm9tIGJlZ2lubmluZyBhcyBub3JtYWxcbiAgICAgICAgbG9hZFJhbmdlKDAsIHJhbmdlU2l6ZSlcbiAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgYXV0b1NlbGVjdEZpcnN0IC0gZ2V0IGZpcnN0IGl0ZW0gSUQgYW5kIGVtaXQgc2VsZWN0aW9uIGV2ZW50XG4gICAgICAgICAgICBpZiAoYXV0b1NlbGVjdEZpcnN0ICYmIGl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgY29uc3QgZmlyc3RJdGVtID0gaXRlbXNbMF07XG4gICAgICAgICAgICAgIGNvbnN0IGZpcnN0SWQgPSBmaXJzdEl0ZW0/Ll9pZCB8fCBmaXJzdEl0ZW0/LmlkO1xuICAgICAgICAgICAgICBpZiAoZmlyc3RJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImNvbGxlY3Rpb246aW5pdGlhbC1sb2FkLWNvbXBsZXRlXCIsIHtcbiAgICAgICAgICAgICAgICAgIHNlbGVjdElkOiBmaXJzdElkLFxuICAgICAgICAgICAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4OiAwLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiW0NvbGxlY3Rpb25dIEZhaWxlZCB0byBsb2FkIGluaXRpYWwgZGF0YTpcIiwgZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICAvLyBBZGQgY29sbGVjdGlvbiBBUEkgdG8gdmlld3BvcnRcbiAgICBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbiA9IHtcbiAgICAgIGxvYWRSYW5nZTogKG9mZnNldDogbnVtYmVyLCBsaW1pdDogbnVtYmVyKSA9PiBsb2FkUmFuZ2Uob2Zmc2V0LCBsaW1pdCksXG4gICAgICBsb2FkTWlzc2luZ1JhbmdlczogKFxuICAgICAgICByYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9LFxuICAgICAgICBjYWxsZXI/OiBzdHJpbmcsXG4gICAgICApID0+IGxvYWRNaXNzaW5nUmFuZ2VzKHJhbmdlLCBjYWxsZXIgfHwgXCJ2aWV3cG9ydC5jb2xsZWN0aW9uXCIpLFxuICAgICAgZ2V0TG9hZGVkUmFuZ2VzOiAoKSA9PiBsb2FkZWRSYW5nZXMsXG4gICAgICBnZXRQZW5kaW5nUmFuZ2VzOiAoKSA9PiBwZW5kaW5nUmFuZ2VzLFxuICAgICAgY2xlYXJGYWlsZWRSYW5nZXM6ICgpID0+IGZhaWxlZFJhbmdlcy5jbGVhcigpLFxuICAgICAgcmV0cnlGYWlsZWRSYW5nZSxcbiAgICAgIHNldFRvdGFsSXRlbXMsXG4gICAgICBnZXRUb3RhbEl0ZW1zOiAoKSA9PiB0b3RhbEl0ZW1zLFxuICAgICAgLy8gQ3Vyc29yLXNwZWNpZmljIG1ldGhvZHNcbiAgICAgIGdldEN1cnJlbnRDdXJzb3I6ICgpID0+IGN1cnJlbnRDdXJzb3IsXG4gICAgICBnZXRDdXJzb3JGb3JQYWdlOiAocGFnZTogbnVtYmVyKSA9PiBjdXJzb3JNYXAuZ2V0KHBhZ2UpIHx8IG51bGwsXG4gICAgfTtcblxuICAgIC8vIEFkZCBjb2xsZWN0aW9uIGRhdGEgYWNjZXNzIHdpdGggZGlyZWN0IGFzc2lnbm1lbnRcbiAgICAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbiA9IHtcbiAgICAgIGl0ZW1zLFxuICAgICAgZ2V0SXRlbXM6ICgpID0+IGl0ZW1zLFxuICAgICAgZ2V0SXRlbTogKGluZGV4OiBudW1iZXIpID0+IGl0ZW1zW2luZGV4XSxcbiAgICAgIGxvYWRSYW5nZSxcbiAgICAgIGxvYWRNaXNzaW5nUmFuZ2VzOiAoXG4gICAgICAgIHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0sXG4gICAgICAgIGNhbGxlcj86IHN0cmluZyxcbiAgICAgICkgPT4gbG9hZE1pc3NpbmdSYW5nZXMocmFuZ2UsIGNhbGxlciB8fCBcImNvbXBvbmVudC5jb2xsZWN0aW9uXCIpLFxuICAgICAgZ2V0TG9hZGluZ1N0YXRzOiAoKSA9PiAoe1xuICAgICAgICBwZW5kaW5nUmVxdWVzdHM6IGFjdGl2ZUxvYWRDb3VudCxcbiAgICAgICAgY29tcGxldGVkUmVxdWVzdHM6IGNvbXBsZXRlZExvYWRzLFxuICAgICAgICBmYWlsZWRSZXF1ZXN0czogZmFpbGVkTG9hZHMsXG4gICAgICAgIGNhbmNlbGxlZFJlcXVlc3RzOiBjYW5jZWxsZWRMb2FkcyxcbiAgICAgICAgY3VycmVudFZlbG9jaXR5LFxuICAgICAgICBjYW5Mb2FkOiBjYW5Mb2FkKCksXG4gICAgICAgIHF1ZXVlZFJlcXVlc3RzOiBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCxcbiAgICAgIH0pLFxuICAgICAgLy8gVG90YWwgaXRlbXMgbWFuYWdlbWVudFxuICAgICAgZ2V0VG90YWxJdGVtczogKCkgPT4gdG90YWxJdGVtcyxcbiAgICAgIHNldFRvdGFsSXRlbXMsXG4gICAgICAvLyBDdXJzb3IgbWV0aG9kc1xuICAgICAgZ2V0Q3VycmVudEN1cnNvcjogKCkgPT4gY3VycmVudEN1cnNvcixcbiAgICAgIGdldEN1cnNvckZvclBhZ2U6IChwYWdlOiBudW1iZXIpID0+IGN1cnNvck1hcC5nZXQocGFnZSkgfHwgbnVsbCxcbiAgICB9O1xuXG4gICAgLy8gQWxzbyBlbnN1cmUgY29tcG9uZW50Lml0ZW1zIGlzIHVwZGF0ZWRcbiAgICBjb21wb25lbnQuaXRlbXMgPSBpdGVtcztcblxuICAgIC8vIENsZWFudXAgZnVuY3Rpb24gLSBjb21wcmVoZW5zaXZlIG1lbW9yeSBjbGVhbnVwXG4gICAgY29uc3QgZGVzdHJveSA9ICgpID0+IHtcbiAgICAgIGxvZ01lbW9yeVN0YXRzKFwiZGVzdHJveTpiZWZvcmVcIik7XG5cbiAgICAgIC8vIEFib3J0IGFsbCBpbi1mbGlnaHQgcmVxdWVzdHNcbiAgICAgIGFib3J0Q29udHJvbGxlcnMuZm9yRWFjaCgoY29udHJvbGxlcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIElnbm9yZSBhYm9ydCBlcnJvcnNcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBhYm9ydENvbnRyb2xsZXJzLmNsZWFyKCk7XG5cbiAgICAgIC8vIENsZWFyIGFsbCBkYXRhIHN0cnVjdHVyZXNcbiAgICAgIGl0ZW1zLmxlbmd0aCA9IDA7XG4gICAgICBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgICBsb2FkZWRSYW5nZXMuY2xlYXIoKTtcbiAgICAgIHBlbmRpbmdSYW5nZXMuY2xlYXIoKTtcbiAgICAgIGZhaWxlZFJhbmdlcy5jbGVhcigpO1xuICAgICAgYWN0aXZlTG9hZFJhbmdlcy5jbGVhcigpO1xuICAgICAgYWN0aXZlUmVxdWVzdHMuY2xlYXIoKTtcbiAgICAgIGN1cnNvck1hcC5jbGVhcigpO1xuICAgICAgcGFnZVRvT2Zmc2V0TWFwLmNsZWFyKCk7XG5cbiAgICAgIC8vIFJlc2V0IHN0YXRlXG4gICAgICB0b3RhbEl0ZW1zID0gMDtcbiAgICAgIGN1cnJlbnRDdXJzb3IgPSBudWxsO1xuICAgICAgaGlnaGVzdExvYWRlZFBhZ2UgPSAwO1xuICAgICAgZGlzY292ZXJlZFRvdGFsID0gbnVsbDtcbiAgICAgIGhhc1JlYWNoZWRFbmQgPSBmYWxzZTtcblxuICAgICAgLy8gQ2xlYXIgY29tcG9uZW50IHJlZmVyZW5jZVxuICAgICAgaWYgKGNvbXBvbmVudC5pdGVtcyA9PT0gaXRlbXMpIHtcbiAgICAgICAgY29tcG9uZW50Lml0ZW1zID0gW107XG4gICAgICB9XG5cbiAgICAgIGxvZ01lbW9yeVN0YXRzKFwiZGVzdHJveTphZnRlclwiKTtcbiAgICB9O1xuXG4gICAgLy8gV2lyZSBkZXN0cm95IGludG8gdGhlIGNvbXBvbmVudCdzIGRlc3Ryb3kgY2hhaW5cbiAgICB3cmFwRGVzdHJveShjb21wb25lbnQsIGRlc3Ryb3kpO1xuXG4gICAgLy8gUmV0dXJuIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBjb2xsZWN0aW9uOiB7XG4gICAgICAgIC8vIERhdGEgYWNjZXNzIG1ldGhvZHNcbiAgICAgICAgaXRlbXMsXG4gICAgICAgIGdldEl0ZW1zOiAoKSA9PiBpdGVtcyxcbiAgICAgICAgZ2V0SXRlbTogKGluZGV4OiBudW1iZXIpID0+IGl0ZW1zW2luZGV4XSxcbiAgICAgICAgLy8gTG9hZGluZyBtZXRob2RzXG4gICAgICAgIGxvYWRSYW5nZSxcbiAgICAgICAgbG9hZE1pc3NpbmdSYW5nZXM6IChcbiAgICAgICAgICByYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9LFxuICAgICAgICAgIGNhbGxlcj86IHN0cmluZyxcbiAgICAgICAgKSA9PiBsb2FkTWlzc2luZ1JhbmdlcyhyYW5nZSwgY2FsbGVyIHx8IFwicmV0dXJuLmNvbGxlY3Rpb25cIiksXG4gICAgICAgIGdldExvYWRlZFJhbmdlczogKCkgPT4gbG9hZGVkUmFuZ2VzLFxuICAgICAgICBnZXRQZW5kaW5nUmFuZ2VzOiAoKSA9PiBwZW5kaW5nUmFuZ2VzLFxuICAgICAgICBjbGVhckZhaWxlZFJhbmdlczogKCkgPT4gZmFpbGVkUmFuZ2VzLmNsZWFyKCksXG4gICAgICAgIHJldHJ5RmFpbGVkUmFuZ2UsXG4gICAgICAgIHNldFRvdGFsSXRlbXMsXG4gICAgICAgIGdldFRvdGFsSXRlbXM6ICgpID0+IHRvdGFsSXRlbXMsXG4gICAgICAgIC8vIEN1cnNvci1zcGVjaWZpYyBtZXRob2RzXG4gICAgICAgIGdldEN1cnJlbnRDdXJzb3I6ICgpID0+IGN1cnJlbnRDdXJzb3IsXG4gICAgICAgIGdldEN1cnNvckZvclBhZ2U6IChwYWdlOiBudW1iZXIpID0+IGN1cnNvck1hcC5nZXQocGFnZSkgfHwgbnVsbCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbn1cbiIsCiAgICAiLy8gc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvcGxhY2Vob2xkZXJzLnRzXG5cbi8qKlxuICogUGxhY2Vob2xkZXIgRmVhdHVyZSAtIFNtYXJ0IHBsYWNlaG9sZGVyIGdlbmVyYXRpb25cbiAqIEFuYWx5emVzIGZpcnN0IGxvYWRlZCBkYXRhIHRvIGdlbmVyYXRlIHJlYWxpc3RpYyBtYXNrZWQgcGxhY2Vob2xkZXJzXG4gKiBTaG93cyBwbGFjZWhvbGRlcnMgd2hpbGUgZGF0YSBpcyBsb2FkaW5nXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgQ29sbGVjdGlvbkNvbXBvbmVudCB9IGZyb20gXCIuL2NvbGxlY3Rpb25cIjtcbmltcG9ydCB7IFZJRVdQT1JUX0NPTlNUQU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBwbGFjZWhvbGRlciBmZWF0dXJlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGxhY2Vob2xkZXJDb25maWcge1xuICBlbmFibGVkPzogYm9vbGVhbjtcbiAgYW5hbHl6ZUZpcnN0TG9hZD86IGJvb2xlYW47XG4gIG1hc2tDaGFyYWN0ZXI/OiBzdHJpbmc7XG4gIHJhbmRvbUxlbmd0aFZhcmlhbmNlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBGaWVsZCBzdHJ1Y3R1cmUgZm9yIHBsYWNlaG9sZGVyIGdlbmVyYXRpb25cbiAqL1xuaW50ZXJmYWNlIEZpZWxkU3RydWN0dXJlIHtcbiAgbWluTGVuZ3RoOiBudW1iZXI7XG4gIG1heExlbmd0aDogbnVtYmVyO1xuICBhdmdMZW5ndGg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGFjZWhvbGRlckNvbXBvbmVudCB7XG4gIHBsYWNlaG9sZGVyczoge1xuICAgIGFuYWx5emVEYXRhU3RydWN0dXJlOiAoaXRlbXM6IGFueVtdKSA9PiB2b2lkO1xuICAgIGhhc0FuYWx5emVkU3RydWN0dXJlOiAoKSA9PiBib29sZWFuO1xuICAgIGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtOiAoaW5kZXg6IG51bWJlcikgPT4gYW55O1xuICAgIGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtczogKHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pID0+IGFueVtdO1xuICAgIHNob3dQbGFjZWhvbGRlcnM6IChyYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9KSA9PiB2b2lkO1xuICAgIGlzUGxhY2Vob2xkZXI6IChpdGVtOiBhbnkpID0+IGJvb2xlYW47XG4gICAgcmVwbGFjZVBsYWNlaG9sZGVyczogKGl0ZW1zOiBhbnlbXSwgb2Zmc2V0OiBudW1iZXIpID0+IHZvaWQ7XG4gICAgY2xlYXI6ICgpID0+IHZvaWQ7XG4gIH07XG59XG5cbi8qKlxuICogQWRkcyBwbGFjZWhvbGRlciBmdW5jdGlvbmFsaXR5IHRvIHZpZXdwb3J0IGNvbXBvbmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFBsYWNlaG9sZGVycyhjb25maWc6IFBsYWNlaG9sZGVyQ29uZmlnID0ge30pIHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgQ29sbGVjdGlvbkNvbXBvbmVudD4oXG4gICAgY29tcG9uZW50OiBUXG4gICk6IFQgJiBQbGFjZWhvbGRlckNvbXBvbmVudCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgZW5hYmxlZCA9IHRydWUsXG4gICAgICBhbmFseXplRmlyc3RMb2FkID0gdHJ1ZSxcbiAgICAgIG1hc2tDaGFyYWN0ZXIgPSBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuTUFTS19DSEFSQUNURVIsXG4gICAgICByYW5kb21MZW5ndGhWYXJpYW5jZSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUlxuICAgICAgICAuUkFORE9NX0xFTkdUSF9WQVJJQU5DRSxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gU3RhdGVcbiAgICBsZXQgZmllbGRTdHJ1Y3R1cmVzOiBNYXA8c3RyaW5nLCBGaWVsZFN0cnVjdHVyZT4gfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaGFzQW5hbHl6ZWQgPSBmYWxzZTtcbiAgICBsZXQgcGxhY2Vob2xkZXJJZENvdW50ZXIgPSAwO1xuXG4gICAgLyoqXG4gICAgICogQW5hbHl6ZSBkYXRhIHN0cnVjdHVyZSBmcm9tIGZpcnN0IGxvYWRlZCBpdGVtc1xuICAgICAqL1xuICAgIGNvbnN0IGFuYWx5emVEYXRhU3RydWN0dXJlID0gKGl0ZW1zOiBhbnlbXSk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFlbmFibGVkIHx8IGhhc0FuYWx5emVkIHx8ICFpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYPCflI0gW1BMQUNFSE9MREVSU10gQW5hbHl6aW5nIGRhdGEgc3RydWN0dXJlIGZyb20gJHtpdGVtcy5sZW5ndGh9IGl0ZW1zYFxuICAgICAgLy8gKTtcblxuICAgICAgY29uc3Qgc3RydWN0dXJlcyA9IG5ldyBNYXA8c3RyaW5nLCBGaWVsZFN0cnVjdHVyZT4oKTtcbiAgICAgIGNvbnN0IHNhbXBsZVNpemUgPSBNYXRoLm1pbihcbiAgICAgICAgaXRlbXMubGVuZ3RoLFxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuTUFYX1NBTVBMRV9TSVpFXG4gICAgICApO1xuXG4gICAgICAvLyBBbmFseXplIGVhY2ggZmllbGQgYWNyb3NzIGFsbCBzYW1wbGUgaXRlbXNcbiAgICAgIGNvbnN0IGZpZWxkU3RhdHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyW10+KCk7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2FtcGxlU2l6ZTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgICAgaWYgKCFpdGVtIHx8IHR5cGVvZiBpdGVtICE9PSBcIm9iamVjdFwiKSBjb250aW51ZTtcblxuICAgICAgICBPYmplY3Qua2V5cyhpdGVtKS5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgIC8vIFNraXAgaW50ZXJuYWwgZmllbGRzXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZmllbGQuc3RhcnRzV2l0aChcIl9cIikgfHxcbiAgICAgICAgICAgIGZpZWxkID09PSBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuUExBQ0VIT0xERVJfRkxBR1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gU3RyaW5nKGl0ZW1bZmllbGRdIHx8IFwiXCIpO1xuICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcblxuICAgICAgICAgIGlmICghZmllbGRTdGF0cy5oYXMoZmllbGQpKSB7XG4gICAgICAgICAgICBmaWVsZFN0YXRzLnNldChmaWVsZCwgW10pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmaWVsZFN0YXRzLmdldChmaWVsZCkhLnB1c2gobGVuZ3RoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBzdGF0aXN0aWNzIGZvciBlYWNoIGZpZWxkXG4gICAgICBmaWVsZFN0YXRzLmZvckVhY2goKGxlbmd0aHMsIGZpZWxkKSA9PiB7XG4gICAgICAgIGlmIChsZW5ndGhzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IG1pbkxlbmd0aCA9IE1hdGgubWluKC4uLmxlbmd0aHMpO1xuICAgICAgICBjb25zdCBtYXhMZW5ndGggPSBNYXRoLm1heCguLi5sZW5ndGhzKTtcbiAgICAgICAgY29uc3QgYXZnTGVuZ3RoID0gTWF0aC5yb3VuZChcbiAgICAgICAgICBsZW5ndGhzLnJlZHVjZSgoc3VtLCBsZW4pID0+IHN1bSArIGxlbiwgMCkgLyBsZW5ndGhzLmxlbmd0aFxuICAgICAgICApO1xuXG4gICAgICAgIHN0cnVjdHVyZXMuc2V0KGZpZWxkLCB7XG4gICAgICAgICAgbWluTGVuZ3RoLFxuICAgICAgICAgIG1heExlbmd0aCxcbiAgICAgICAgICBhdmdMZW5ndGgsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGZpZWxkU3RydWN0dXJlcyA9IHN0cnVjdHVyZXM7XG4gICAgICBoYXNBbmFseXplZCA9IHRydWU7XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBg4pyFIFtQTEFDRUhPTERFUlNdIFN0cnVjdHVyZSBhbmFseXplZDpgLFxuICAgICAgLy8gICBPYmplY3QuZnJvbUVudHJpZXMoc3RydWN0dXJlcylcbiAgICAgIC8vICk7XG5cbiAgICAgIC8vIEVtaXQgZXZlbnRcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpwbGFjZWhvbGRlcnMtc3RydWN0dXJlLWFuYWx5emVkXCIsIHtcbiAgICAgICAgc3RydWN0dXJlOiBPYmplY3QuZnJvbUVudHJpZXMoc3RydWN0dXJlcyksXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgYSBzaW5nbGUgcGxhY2Vob2xkZXIgaXRlbVxuICAgICAqL1xuICAgIGNvbnN0IGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtID0gKGluZGV4OiBudW1iZXIpOiBhbnkgPT4ge1xuICAgICAgY29uc3QgcGxhY2Vob2xkZXI6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICAgIGlkOiBgcGxhY2Vob2xkZXItJHtwbGFjZWhvbGRlcklkQ291bnRlcisrfWAsXG4gICAgICAgIFtWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuUExBQ0VIT0xERVJfRkxBR106IHRydWUsXG4gICAgICAgIF9pbmRleDogaW5kZXgsXG4gICAgICB9O1xuXG4gICAgICBpZiAoIWZpZWxkU3RydWN0dXJlcyB8fCBmaWVsZFN0cnVjdHVyZXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAvLyBObyBzdHJ1Y3R1cmUgYW5hbHl6ZWQgeWV0IC0gcmV0dXJuIGJhc2ljIHBsYWNlaG9sZGVyXG4gICAgICAgIHBsYWNlaG9sZGVyLmxhYmVsID0gbWFza0NoYXJhY3Rlci5yZXBlYXQoMTApO1xuICAgICAgICByZXR1cm4gcGxhY2Vob2xkZXI7XG4gICAgICB9XG5cbiAgICAgIC8vIEdlbmVyYXRlIGZpZWxkcyBiYXNlZCBvbiBhbmFseXplZCBzdHJ1Y3R1cmVcbiAgICAgIGZpZWxkU3RydWN0dXJlcy5mb3JFYWNoKChzdHJ1Y3R1cmUsIGZpZWxkKSA9PiB7XG4gICAgICAgIGxldCBsZW5ndGg6IG51bWJlcjtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgcmFuZG9tTGVuZ3RoVmFyaWFuY2UgJiZcbiAgICAgICAgICBzdHJ1Y3R1cmUubWluTGVuZ3RoICE9PSBzdHJ1Y3R1cmUubWF4TGVuZ3RoXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIFJhbmRvbSBsZW5ndGggd2l0aGluIHJhbmdlXG4gICAgICAgICAgbGVuZ3RoID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgIE1hdGgucmFuZG9tKCkgKiAoc3RydWN0dXJlLm1heExlbmd0aCAtIHN0cnVjdHVyZS5taW5MZW5ndGggKyAxKSArXG4gICAgICAgICAgICAgIHN0cnVjdHVyZS5taW5MZW5ndGhcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFVzZSBhdmVyYWdlIGxlbmd0aFxuICAgICAgICAgIGxlbmd0aCA9IHN0cnVjdHVyZS5hdmdMZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBzb21lIHZhcmlhdGlvbiB0byBtYWtlIGl0IGxvb2sgbW9yZSBuYXR1cmFsXG4gICAgICAgIGlmIChyYW5kb21MZW5ndGhWYXJpYW5jZSAmJiBNYXRoLnJhbmRvbSgpIDwgMC4zKSB7XG4gICAgICAgICAgbGVuZ3RoID0gTWF0aC5tYXgoMSwgbGVuZ3RoICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMykgLSAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBsYWNlaG9sZGVyW2ZpZWxkXSA9IG1hc2tDaGFyYWN0ZXIucmVwZWF0KGxlbmd0aCk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHBsYWNlaG9sZGVyO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSBtdWx0aXBsZSBwbGFjZWhvbGRlciBpdGVtc1xuICAgICAqL1xuICAgIGNvbnN0IGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtcyA9IChyYW5nZToge1xuICAgICAgc3RhcnQ6IG51bWJlcjtcbiAgICAgIGVuZDogbnVtYmVyO1xuICAgIH0pOiBhbnlbXSA9PiB7XG4gICAgICBjb25zdCBpdGVtczogYW55W10gPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSByYW5nZS5zdGFydDsgaSA8PSByYW5nZS5lbmQ7IGkrKykge1xuICAgICAgICBpdGVtcy5wdXNoKGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtKGkpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVtcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2hvdyBwbGFjZWhvbGRlcnMgZm9yIGEgcmFuZ2VcbiAgICAgKi9cbiAgICBjb25zdCBzaG93UGxhY2Vob2xkZXJzID0gKHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pOiB2b2lkID0+IHtcbiAgICAgIGlmICghZW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBwbGFjZWhvbGRlcnMgPSBnZW5lcmF0ZVBsYWNlaG9sZGVySXRlbXMocmFuZ2UpO1xuXG4gICAgICAvLyBVcGRhdGUgaXRlbXMgYXJyYXlcbiAgICAgIGlmIChjb21wb25lbnQuaXRlbXMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbGFjZWhvbGRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHJhbmdlLnN0YXJ0ICsgaTtcbiAgICAgICAgICBpZiAoIWNvbXBvbmVudC5pdGVtc1tpbmRleF0pIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5pdGVtc1tpbmRleF0gPSBwbGFjZWhvbGRlcnNbaV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBg8J+UhCBbUExBQ0VIT0xERVJTXSBTaG93aW5nICR7cGxhY2Vob2xkZXJzLmxlbmd0aH0gcGxhY2Vob2xkZXJzIGZvciByYW5nZSAke3JhbmdlLnN0YXJ0fS0ke3JhbmdlLmVuZH1gXG4gICAgICApO1xuXG4gICAgICAvLyBFbWl0IGV2ZW50XG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6cGxhY2Vob2xkZXJzLXNob3duXCIsIHtcbiAgICAgICAgcmFuZ2UsXG4gICAgICAgIGNvdW50OiBwbGFjZWhvbGRlcnMubGVuZ3RoLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGFuIGl0ZW0gaXMgYSBwbGFjZWhvbGRlclxuICAgICAqL1xuICAgIGNvbnN0IGlzUGxhY2Vob2xkZXIgPSAoaXRlbTogYW55KTogYm9vbGVhbiA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBpdGVtICYmXG4gICAgICAgIHR5cGVvZiBpdGVtID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIGl0ZW1bVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLlBMQUNFSE9MREVSX0ZMQUddID09PSB0cnVlXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXBsYWNlIHBsYWNlaG9sZGVycyB3aXRoIHJlYWwgZGF0YVxuICAgICAqL1xuICAgIGNvbnN0IHJlcGxhY2VQbGFjZWhvbGRlcnMgPSAoaXRlbXM6IGFueVtdLCBvZmZzZXQ6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFjb21wb25lbnQuaXRlbXMpIHJldHVybjtcblxuICAgICAgbGV0IHJlcGxhY2VkQ291bnQgPSAwO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gb2Zmc2V0ICsgaTtcbiAgICAgICAgY29uc3QgY3VycmVudEl0ZW0gPSBjb21wb25lbnQuaXRlbXNbaW5kZXhdO1xuXG4gICAgICAgIGlmIChpc1BsYWNlaG9sZGVyKGN1cnJlbnRJdGVtKSkge1xuICAgICAgICAgIGNvbXBvbmVudC5pdGVtc1tpbmRleF0gPSBpdGVtc1tpXTtcbiAgICAgICAgICByZXBsYWNlZENvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHJlcGxhY2VkQ291bnQgPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGDinKggW1BMQUNFSE9MREVSU10gUmVwbGFjZWQgJHtyZXBsYWNlZENvdW50fSBwbGFjZWhvbGRlcnMgYXQgb2Zmc2V0ICR7b2Zmc2V0fWBcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBFbWl0IGV2ZW50XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpwbGFjZWhvbGRlcnMtcmVwbGFjZWRcIiwge1xuICAgICAgICAgIG9mZnNldCxcbiAgICAgICAgICBjb3VudDogcmVwbGFjZWRDb3VudCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENsZWFyIGFsbCBwbGFjZWhvbGRlciBzdGF0ZVxuICAgICAqL1xuICAgIGNvbnN0IGNsZWFyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgZmllbGRTdHJ1Y3R1cmVzID0gbnVsbDtcbiAgICAgIGhhc0FuYWx5emVkID0gZmFsc2U7XG4gICAgICBwbGFjZWhvbGRlcklkQ291bnRlciA9IDA7XG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemUgZnVuY3Rpb25cbiAgICBjb25zdCBpbml0aWFsaXplID0gKCkgPT4ge1xuICAgICAgaWYgKCFlbmFibGVkKSByZXR1cm47XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgZmlyc3QgZGF0YSBsb2FkIHRvIGFuYWx5emUgc3RydWN0dXJlXG4gICAgICBpZiAoYW5hbHl6ZUZpcnN0TG9hZCkge1xuICAgICAgICBjb25zdCBoYW5kbGVSYW5nZUxvYWRlZCA9IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoIWhhc0FuYWx5emVkICYmIGRhdGEuaXRlbXMgJiYgZGF0YS5pdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhbmFseXplRGF0YVN0cnVjdHVyZShkYXRhLml0ZW1zKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSZXBsYWNlIGFueSBwbGFjZWhvbGRlcnMgd2l0aCByZWFsIGRhdGFcbiAgICAgICAgICByZXBsYWNlUGxhY2Vob2xkZXJzKGRhdGEuaXRlbXMsIGRhdGEub2Zmc2V0KTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCBoYW5kbGVSYW5nZUxvYWRlZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNob3cgaW5pdGlhbCBwbGFjZWhvbGRlcnMgaWYgY29uZmlndXJlZFxuICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGNvbXBvbmVudC5jb2xsZWN0aW9uPy5nZXRUb3RhbEl0ZW1zKCkgfHwgMDtcbiAgICAgIGlmICh0b3RhbEl0ZW1zID4gMCkge1xuICAgICAgICBjb25zdCBpbml0aWFsUmFuZ2UgPSB7XG4gICAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgICAgZW5kOiBNYXRoLm1pbihcbiAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVhfU0FNUExFX1NJWkUgLSAxLFxuICAgICAgICAgICAgdG90YWxJdGVtcyAtIDFcbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgICBzaG93UGxhY2Vob2xkZXJzKGluaXRpYWxSYW5nZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIENsZWFudXAgZnVuY3Rpb25cbiAgICBjb25zdCBkZXN0cm95ID0gKCkgPT4ge1xuICAgICAgY2xlYXIoKTtcbiAgICB9O1xuXG4gICAgLy8gU3RvcmUgZnVuY3Rpb25zIGZvciB2aWV3cG9ydCB0byBjYWxsXG4gICAgKGNvbXBvbmVudCBhcyBhbnkpLl9wbGFjZWhvbGRlcnNJbml0aWFsaXplID0gaW5pdGlhbGl6ZTtcbiAgICAoY29tcG9uZW50IGFzIGFueSkuX3BsYWNlaG9sZGVyc0Rlc3Ryb3kgPSBkZXN0cm95O1xuXG4gICAgLy8gUmV0dXJuIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBwbGFjZWhvbGRlcnM6IHtcbiAgICAgICAgYW5hbHl6ZURhdGFTdHJ1Y3R1cmUsXG4gICAgICAgIGhhc0FuYWx5emVkU3RydWN0dXJlOiAoKSA9PiBoYXNBbmFseXplZCxcbiAgICAgICAgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW0sXG4gICAgICAgIGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtcyxcbiAgICAgICAgc2hvd1BsYWNlaG9sZGVycyxcbiAgICAgICAgaXNQbGFjZWhvbGRlcixcbiAgICAgICAgcmVwbGFjZVBsYWNlaG9sZGVycyxcbiAgICAgICAgY2xlYXIsXG4gICAgICB9LFxuICAgIH07XG4gIH07XG59XG4iLAogICAgIi8qKlxuICogUmVuZGVyaW5nIEZlYXR1cmUgLSBJdGVtIHJlbmRlcmluZyBhbmQgcG9zaXRpb25pbmcgZm9yIHZpZXdwb3J0XG4gKiBIYW5kbGVzIERPTSBlbGVtZW50IGNyZWF0aW9uLCBwb3NpdGlvbmluZywgcmVjeWNsaW5nLCBhbmQgdXBkYXRlc1xuICovXG5cbmltcG9ydCB7IGFkZENsYXNzLCByZW1vdmVDbGFzcywgaGFzQ2xhc3MgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBWSUVXUE9SVF9DT05TVEFOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBpc1BsYWNlaG9sZGVyLFxuICBnZXRWaWV3cG9ydFN0YXRlLFxuICB3cmFwSW5pdGlhbGl6ZSxcbiAgd3JhcERlc3Ryb3ksXG59IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBjcmVhdGVMYXlvdXQgfSBmcm9tIFwiLi4vLi4vbGF5b3V0XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyaW5nQ29uZmlnIHtcbiAgdGVtcGxhdGU/OiAoXG4gICAgaXRlbTogYW55LFxuICAgIGluZGV4OiBudW1iZXIsXG4gICkgPT4gc3RyaW5nIHwgSFRNTEVsZW1lbnQgfCBhbnlbXSB8IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIG92ZXJzY2FuPzogbnVtYmVyO1xuICBtZWFzdXJlSXRlbXM/OiBib29sZWFuO1xuICBlbmFibGVSZWN5Y2xpbmc/OiBib29sZWFuO1xuICBtYXhQb29sU2l6ZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIE1haW50YWluIERPTSBvcmRlciB0byBtYXRjaCB2aXN1YWwgaW5kZXggb3JkZXIuXG4gICAqIEVuYWJsZXMgQ1NTIHNlbGVjdG9ycyBsaWtlIDpmaXJzdC1jaGlsZCwgOm50aC1jaGlsZCgpIHRvIHdvcmsgY29ycmVjdGx5LlxuICAgKiBEZWZhdWx0OiB0cnVlXG4gICAqL1xuICBtYWludGFpbkRvbU9yZGVyPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFZpZXdwb3J0U3RhdGUge1xuICBzY3JvbGxQb3NpdGlvbjogbnVtYmVyO1xuICB0b3RhbEl0ZW1zOiBudW1iZXI7XG4gIGl0ZW1TaXplOiBudW1iZXI7XG4gIGNvbnRhaW5lclNpemU6IG51bWJlcjtcbiAgdmlydHVhbFRvdGFsU2l6ZTogbnVtYmVyO1xuICB2aXNpYmxlUmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfTtcbiAgaXRlbXNDb250YWluZXI6IEhUTUxFbGVtZW50IHwgbnVsbDtcbn1cblxuLyoqXG4gKiBSZW5kZXJpbmcgZmVhdHVyZSBmb3Igdmlld3BvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhSZW5kZXJpbmcgPSAoY29uZmlnOiBSZW5kZXJpbmdDb25maWcgPSB7fSkgPT4ge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBWaWV3cG9ydENvbXBvbmVudD4oY29tcG9uZW50OiBUKTogVCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgdGVtcGxhdGUsXG4gICAgICBvdmVyc2NhbiA9IDUsXG4gICAgICBtZWFzdXJlSXRlbXMgPSBmYWxzZSxcbiAgICAgIGVuYWJsZVJlY3ljbGluZyA9IHRydWUsXG4gICAgICBtYXhQb29sU2l6ZSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5SRU5ERVJJTkcuREVGQVVMVF9NQVhfUE9PTF9TSVpFLFxuICAgICAgbWFpbnRhaW5Eb21PcmRlciA9IHRydWUsXG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIFN0YXRlXG4gICAgY29uc3QgcmVuZGVyZWRFbGVtZW50cyA9IG5ldyBNYXA8bnVtYmVyLCBIVE1MRWxlbWVudD4oKTtcbiAgICBjb25zdCBjb2xsZWN0aW9uSXRlbXM6IFJlY29yZDxudW1iZXIsIGFueT4gPSB7fTtcbiAgICBjb25zdCBlbGVtZW50UG9vbDogSFRNTEVsZW1lbnRbXSA9IFtdO1xuICAgIGNvbnN0IHBvb2xTdGF0cyA9IHsgY3JlYXRlZDogMCwgcmVjeWNsZWQ6IDAsIHBvb2xTaXplOiAwLCByZWxlYXNlZDogMCB9O1xuXG4gICAgLy8gU3RvcmUgbGF5b3V0IHJlc3VsdHMgZm9yIHByb3BlciBjbGVhbnVwIChwcmV2ZW50cyBtZW1vcnkgbGVhaylcbiAgICBjb25zdCBsYXlvdXRSZXN1bHRzID0gbmV3IFdlYWtNYXA8SFRNTEVsZW1lbnQsIHsgZGVzdHJveTogKCkgPT4gdm9pZCB9PigpO1xuXG4gICAgLy8gUmV1c2FibGUgdGVtcGxhdGUgZWxlbWVudCBmb3IgSFRNTCBzdHJpbmcgcGFyc2luZyAobW9yZSBlZmZpY2llbnQgdGhhbiBkaXYpXG4gICAgY29uc3QgdGVtcGxhdGVQYXJzZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG5cbiAgICBsZXQgdmlld3BvcnRTdGF0ZTogVmlld3BvcnRTdGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjdXJyZW50VmlzaWJsZVJhbmdlID0geyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgbGV0IGxhc3RSZW5kZXJUaW1lID0gMDtcbiAgICBsZXQgaXNSZW1vdmluZ0l0ZW0gPSBmYWxzZTtcblxuICAgIC8vIEVsZW1lbnQgcG9vbCBtYW5hZ2VtZW50XG4gICAgY29uc3QgZ2V0UG9vbGVkRWxlbWVudCA9ICgpOiBIVE1MRWxlbWVudCA9PiB7XG4gICAgICBpZiAoZW5hYmxlUmVjeWNsaW5nICYmIGVsZW1lbnRQb29sLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcG9vbFN0YXRzLnJlY3ljbGVkKys7XG4gICAgICAgIHJldHVybiBlbGVtZW50UG9vbC5wb3AoKSE7XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gXCJtdHJsLXZpZXdwb3J0LWl0ZW1cIjtcbiAgICAgIHBvb2xTdGF0cy5jcmVhdGVkKys7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVsZWFzZUVsZW1lbnQgPSAoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkID0+IHtcbiAgICAgIHBvb2xTdGF0cy5yZWxlYXNlZCsrO1xuXG4gICAgICAvLyBDUklUSUNBTDogQ2FsbCBkZXN0cm95IG9uIGxheW91dFJlc3VsdCB0byBjbGVhbiB1cCBjb21wb25lbnRzIGFuZCBldmVudCBsaXN0ZW5lcnNcbiAgICAgIC8vIFRoaXMgZml4ZXMgdGhlIG1lbW9yeSBsZWFrIHdoZW4gdXNpbmcgbGF5b3V0IHRlbXBsYXRlc1xuICAgICAgY29uc3QgbGF5b3V0UmVzdWx0ID0gbGF5b3V0UmVzdWx0cy5nZXQoZWxlbWVudCk7XG4gICAgICBpZiAobGF5b3V0UmVzdWx0ICYmIHR5cGVvZiBsYXlvdXRSZXN1bHQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGF5b3V0UmVzdWx0LmRlc3Ryb3koKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIElnbm9yZSBkZXN0cm95IGVycm9ycyAtIGVsZW1lbnQgbWF5IGFscmVhZHkgYmUgY2xlYW5lZCB1cFxuICAgICAgICB9XG4gICAgICAgIGxheW91dFJlc3VsdHMuZGVsZXRlKGVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVuYWJsZVJlY3ljbGluZykge1xuICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBDbGVhbiBlbGVtZW50IGZvciByZXVzZSAobm8gY2xvbmluZyAtIHJldXNlIHRoZSBhY3R1YWwgZWxlbWVudClcbiAgICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gXCJtdHJsLXZpZXdwb3J0LWl0ZW1cIjtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS1pbmRleFwiKTtcbiAgICAgIGVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9IFwiXCI7XG4gICAgICBlbGVtZW50LmlubmVySFRNTCA9IFwiXCI7XG5cbiAgICAgIC8vIFJlbW92ZSBmcm9tIERPTSBmaXJzdFxuICAgICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICBlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCB0byBwb29sIGlmIG5vdCBmdWxsXG4gICAgICBpZiAoZWxlbWVudFBvb2wubGVuZ3RoIDwgbWF4UG9vbFNpemUpIHtcbiAgICAgICAgZWxlbWVudFBvb2wucHVzaChlbGVtZW50KTtcbiAgICAgICAgcG9vbFN0YXRzLnBvb2xTaXplID0gZWxlbWVudFBvb2wubGVuZ3RoO1xuICAgICAgfVxuICAgICAgLy8gSWYgcG9vbCBpcyBmdWxsLCBlbGVtZW50IGlzIGp1c3QgZGVyZWZlcmVuY2VkIGFuZCBHQydkXG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemVcbiAgICB3cmFwSW5pdGlhbGl6ZShjb21wb25lbnQsICgpID0+IHtcbiAgICAgIHZpZXdwb3J0U3RhdGUgPSBnZXRWaWV3cG9ydFN0YXRlKGNvbXBvbmVudCkgYXMgVmlld3BvcnRTdGF0ZTtcblxuICAgICAgLy8gU2V0IGluaXRpYWwgaXRlbXMgY29udGFpbmVyIGhlaWdodCBmcm9tIGN1cnJlbnQgdmlydHVhbCBzaXplXG4gICAgICBpZiAodmlld3BvcnRTdGF0ZT8uaXRlbXNDb250YWluZXIgJiYgdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplID4gMCkge1xuICAgICAgICB2aWV3cG9ydFN0YXRlLml0ZW1zQ29udGFpbmVyLnN0eWxlLmhlaWdodCA9IGAke3ZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZX1weGA7XG4gICAgICB9XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgaXRlbSB1cGRhdGUgcmVxdWVzdHMgZnJvbSBBUElcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiaXRlbTp1cGRhdGUtcmVxdWVzdFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXgsIGl0ZW0sIHByZXZpb3VzSXRlbSB9ID0gZGF0YTtcblxuICAgICAgICAvLyBVcGRhdGUgdGhlIGl0ZW0gaW4gY29sbGVjdGlvbkl0ZW1zXG4gICAgICAgIGNvbGxlY3Rpb25JdGVtc1tpbmRleF0gPSBpdGVtO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXRlbSBpcyBjdXJyZW50bHkgcmVuZGVyZWRcbiAgICAgICAgY29uc3QgZXhpc3RpbmdFbGVtZW50ID0gcmVuZGVyZWRFbGVtZW50cy5nZXQoaW5kZXgpO1xuICAgICAgICBjb25zdCB3YXNWaXNpYmxlID0gISFleGlzdGluZ0VsZW1lbnQ7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgaXRlbSB3YXMgc2VsZWN0ZWQgYmVmb3JlIHVwZGF0ZVxuICAgICAgICBjb25zdCB3YXNTZWxlY3RlZCA9IGV4aXN0aW5nRWxlbWVudFxuICAgICAgICAgID8gaGFzQ2xhc3MoXG4gICAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudCxcbiAgICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlNFTEVDVElPTi5TRUxFQ1RFRF9DTEFTUyxcbiAgICAgICAgICAgICkgfHwgaGFzQ2xhc3MoZXhpc3RpbmdFbGVtZW50LCBcIm10cmwtdmlld3BvcnQtaXRlbS0tc2VsZWN0ZWRcIilcbiAgICAgICAgICA6IGZhbHNlO1xuXG4gICAgICAgIGlmIChleGlzdGluZ0VsZW1lbnQgJiYgZXhpc3RpbmdFbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAvLyBSZS1yZW5kZXIgdGhlIGl0ZW1cbiAgICAgICAgICBjb25zdCBuZXdFbGVtZW50ID0gcmVuZGVySXRlbShpdGVtLCBpbmRleCk7XG5cbiAgICAgICAgICBpZiAobmV3RWxlbWVudCkge1xuICAgICAgICAgICAgLy8gQ29weSBwb3NpdGlvbiBzdHlsZXMgZnJvbSBleGlzdGluZyBlbGVtZW50XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG5ld0VsZW1lbnQuc3R5bGUsIHtcbiAgICAgICAgICAgICAgcG9zaXRpb246IGV4aXN0aW5nRWxlbWVudC5zdHlsZS5wb3NpdGlvbixcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiBleGlzdGluZ0VsZW1lbnQuc3R5bGUudHJhbnNmb3JtLFxuICAgICAgICAgICAgICB3aWR0aDogZXhpc3RpbmdFbGVtZW50LnN0eWxlLndpZHRoLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIFByZXNlcnZlIHNlbGVjdGVkIHN0YXRlXG4gICAgICAgICAgICBpZiAod2FzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgYWRkQ2xhc3MobmV3RWxlbWVudCwgVklFV1BPUlRfQ09OU1RBTlRTLlNFTEVDVElPTi5TRUxFQ1RFRF9DTEFTUyk7XG4gICAgICAgICAgICAgIGFkZENsYXNzKG5ld0VsZW1lbnQsIFwibXRybC12aWV3cG9ydC1pdGVtLS1zZWxlY3RlZFwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRkIHVwZGF0ZSBhbmltYXRpb24gY2xhc3MgdG8gaW5uZXIgY29udGVudCBmb3IgdmlzaWJpbGl0eVxuICAgICAgICAgICAgYWRkQ2xhc3MobmV3RWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtLS11cGRhdGVkXCIpO1xuICAgICAgICAgICAgLy8gQWxzbyB0cnkgdG8gYWRkIHRvIGZpcnN0IGNoaWxkIGlmIGl0IGV4aXN0cyAodGhlIGFjdHVhbCBpdGVtIGNvbnRlbnQpXG4gICAgICAgICAgICBjb25zdCBpbm5lckl0ZW0gPSBuZXdFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgaWYgKGlubmVySXRlbSkge1xuICAgICAgICAgICAgICBhZGRDbGFzcyhpbm5lckl0ZW0sIFwiaXRlbS0tdXBkYXRlZFwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmVwbGFjZSBpbiBET01cbiAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChcbiAgICAgICAgICAgICAgbmV3RWxlbWVudCxcbiAgICAgICAgICAgICAgZXhpc3RpbmdFbGVtZW50LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2V0KGluZGV4LCBuZXdFbGVtZW50KTtcbiAgICAgICAgICAgIHJlbGVhc2VFbGVtZW50KGV4aXN0aW5nRWxlbWVudCk7XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgYW5pbWF0aW9uIGNsYXNzIGFmdGVyIHRyYW5zaXRpb25cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICByZW1vdmVDbGFzcyhuZXdFbGVtZW50LCBcInZpZXdwb3J0LWl0ZW0tLXVwZGF0ZWRcIik7XG4gICAgICAgICAgICAgIGlmIChpbm5lckl0ZW0pIHtcbiAgICAgICAgICAgICAgICByZW1vdmVDbGFzcyhpbm5lckl0ZW0sIFwiaXRlbS0tdXBkYXRlZFwiKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IGNvbXBsZXRpb24gZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW06dXBkYXRlZFwiLCB7XG4gICAgICAgICAgaXRlbSxcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBwcmV2aW91c0l0ZW0sXG4gICAgICAgICAgd2FzVmlzaWJsZSxcbiAgICAgICAgICB3YXNTZWxlY3RlZCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBpdGVtIHJlbW92ZSByZXF1ZXN0cyBmcm9tIEFQSVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJpdGVtOnJlbW92ZS1yZXF1ZXN0XCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgeyBpbmRleCwgaXRlbSB9ID0gZGF0YTtcbiAgICAgICAgaXNSZW1vdmluZ0l0ZW0gPSB0cnVlO1xuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAvLyAgIGBbUkVOREVSLUZJWF0gPT09PT09PT09PSBJVEVNIFJFTU9WRSBTVEFSVCAodjQpID09PT09PT09PT1gLFxuICAgICAgICAvLyApO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW1JFTkRFUi1GSVhdIFJlbW92aW5nIGluZGV4OiAke2luZGV4fWApO1xuXG4gICAgICAgIC8vIEdldCB0aGUgc291cmNlIG9mIHRydXRoIC0gY29sbGVjdGlvbi5pdGVtcyBoYXMgYWxyZWFkeSBiZWVuIHNwbGljZWQgYnkgYXBpLnRzXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb25JdGVtc1NvdXJjZSA9XG4gICAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24/Lml0ZW1zIHx8XG4gICAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLml0ZW1zIHx8XG4gICAgICAgICAgW107XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtSRU5ERVItRklYXSBjb2xsZWN0aW9uSXRlbXNTb3VyY2UubGVuZ3RoOiAke2NvbGxlY3Rpb25JdGVtc1NvdXJjZS5sZW5ndGh9YCxcbiAgICAgICAgLy8gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtSRU5ERVItRklYXSBjb2xsZWN0aW9uSXRlbXMgY2FjaGUgc2l6ZSBCRUZPUkU6ICR7T2JqZWN0LmtleXMoY29sbGVjdGlvbkl0ZW1zKS5sZW5ndGh9YCxcbiAgICAgICAgLy8gKTtcblxuICAgICAgICAvLyBTdHJhdGVneTogU2hpZnQgY29sbGVjdGlvbkl0ZW1zIGNhY2hlIGluZGljZXMgZG93biwgYnV0IHVzZSBhY3R1YWwgZGF0YVxuICAgICAgICAvLyBmcm9tIGNvbGxlY3Rpb24uaXRlbXMgKHdoaWNoIGhhcyBiZWVuIHNwbGljZWQpIGZvciB0aGUgbG9hZGVkIHJhbmdlLlxuICAgICAgICAvLyBGb3IgaW5kaWNlcyBiZXlvbmQgdGhlIGxvYWRlZCByYW5nZSwgc2hpZnQgdGhlIGNhY2hlZCBkYXRhLlxuXG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhjb2xsZWN0aW9uSXRlbXMpXG4gICAgICAgICAgLm1hcChOdW1iZXIpXG4gICAgICAgICAgLmZpbHRlcigoaykgPT4gIWlzTmFOKGspKVxuICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG5cbiAgICAgICAgLy8gRGVsZXRlIHRoZSByZW1vdmVkIGluZGV4XG4gICAgICAgIGRlbGV0ZSBjb2xsZWN0aW9uSXRlbXNbaW5kZXhdO1xuXG4gICAgICAgIC8vIFNoaWZ0IGFsbCBpbmRpY2VzIGFmdGVyIHRoZSByZW1vdmVkIG9uZSBkb3duIGJ5IDFcbiAgICAgICAgLy8gRm9yIGluZGljZXMgd2l0aGluIHRoZSBsb2FkZWQgcmFuZ2UsIHVzZSBkYXRhIGZyb20gY29sbGVjdGlvbi5pdGVtc1xuICAgICAgICAvLyBGb3IgaW5kaWNlcyBiZXlvbmQsIHNoaWZ0IHRoZSBleGlzdGluZyBjYWNoZWQgZGF0YVxuICAgICAgICBjb25zdCBsb2FkZWRMZW5ndGggPSBjb2xsZWN0aW9uSXRlbXNTb3VyY2UubGVuZ3RoO1xuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICBpZiAoa2V5ID4gaW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0luZGV4ID0ga2V5IC0gMTtcbiAgICAgICAgICAgIC8vIElmIG5ld0luZGV4IGlzIHdpdGhpbiBsb2FkZWQgZGF0YSwgdXNlIHNvdXJjZTsgb3RoZXJ3aXNlIHNoaWZ0IGNhY2hlXG4gICAgICAgICAgICBpZiAobmV3SW5kZXggPCBsb2FkZWRMZW5ndGggJiYgY29sbGVjdGlvbkl0ZW1zU291cmNlW25ld0luZGV4XSkge1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uSXRlbXNbbmV3SW5kZXhdID0gY29sbGVjdGlvbkl0ZW1zU291cmNlW25ld0luZGV4XTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFNoaWZ0IGNhY2hlZCBkYXRhIGZvciBpbmRpY2VzIGJleW9uZCBsb2FkZWQgcmFuZ2VcbiAgICAgICAgICAgICAgY29sbGVjdGlvbkl0ZW1zW25ld0luZGV4XSA9IGNvbGxlY3Rpb25JdGVtc1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZXRlIGNvbGxlY3Rpb25JdGVtc1trZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbmFsS2V5cyA9IE9iamVjdC5rZXlzKGNvbGxlY3Rpb25JdGVtcylcbiAgICAgICAgICAubWFwKE51bWJlcilcbiAgICAgICAgICAuZmlsdGVyKChrKSA9PiAhaXNOYU4oaykpXG4gICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtSRU5ERVItRklYXSBjb2xsZWN0aW9uSXRlbXMgY2FjaGUgc2l6ZSBBRlRFUjogJHtmaW5hbEtleXMubGVuZ3RofWAsXG4gICAgICAgIC8vICk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAvLyAgIGBbUkVOREVSLUZJWF0gY29sbGVjdGlvbkl0ZW1zIGtleXM6IFske2ZpbmFsS2V5cy5zbGljZSgwLCAxMCkuam9pbihcIiwgXCIpfSR7ZmluYWxLZXlzLmxlbmd0aCA+IDEwID8gXCIuLi5cIiA6IFwiXCJ9XWAsXG4gICAgICAgIC8vICk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAvLyAgIGBbUkVOREVSLUZJWF0gdmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zOiAke3ZpZXdwb3J0U3RhdGU/LnRvdGFsSXRlbXN9YCxcbiAgICAgICAgLy8gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtSRU5ERVItRklYXSB2aWV3cG9ydFN0YXRlLnZpc2libGVSYW5nZTogJHtKU09OLnN0cmluZ2lmeSh2aWV3cG9ydFN0YXRlPy52aXNpYmxlUmFuZ2UpfWAsXG4gICAgICAgIC8vICk7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGFueSB1bmRlZmluZWQvbnVsbCB2YWx1ZXMgaW4gZmlyc3QgMzAgaXRlbXNcbiAgICAgICAgY29uc3QgYmFkSW5kaWNlczogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXRoLm1pbigzMCwgZmluYWxLZXlzLmxlbmd0aCk7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGsgPSBmaW5hbEtleXNbaV07XG4gICAgICAgICAgaWYgKCFjb2xsZWN0aW9uSXRlbXNba10gfHwgY29sbGVjdGlvbkl0ZW1zW2tdLl9wbGFjZWhvbGRlcikge1xuICAgICAgICAgICAgYmFkSW5kaWNlcy5wdXNoKGspO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgcmVuZGVyZWQgZWxlbWVudCBhdCB0aGlzIGluZGV4XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuZ2V0KGluZGV4KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nRWxlbWVudCAmJiBleGlzdGluZ0VsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICAgIHJlbGVhc2VFbGVtZW50KGV4aXN0aW5nRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5kZWxldGUoaW5kZXgpO1xuXG4gICAgICAgIC8vIFNoaWZ0IHJlbmRlcmVkIGVsZW1lbnRzIGluZGljZXMgZG93blxuICAgICAgICBjb25zdCByZW5kZXJlZEtleXMgPSBBcnJheS5mcm9tKHJlbmRlcmVkRWxlbWVudHMua2V5cygpKS5zb3J0KFxuICAgICAgICAgIChhLCBiKSA9PiBhIC0gYixcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgbmV3UmVuZGVyZWRFbGVtZW50cyA9IG5ldyBNYXA8bnVtYmVyLCBIVE1MRWxlbWVudD4oKTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgcmVuZGVyZWRLZXlzKSB7XG4gICAgICAgICAgaWYgKGtleSA+IGluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVuZGVyZWRFbGVtZW50cy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgIC8vIFVwZGF0ZSBkYXRhLWluZGV4IGF0dHJpYnV0ZVxuICAgICAgICAgICAgICBlbGVtZW50LmRhdGFzZXQuaW5kZXggPSBTdHJpbmcoa2V5IC0gMSk7XG4gICAgICAgICAgICAgIG5ld1JlbmRlcmVkRWxlbWVudHMuc2V0KGtleSAtIDEsIGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoa2V5IDwgaW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSByZW5kZXJlZEVsZW1lbnRzLmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgbmV3UmVuZGVyZWRFbGVtZW50cy5zZXQoa2V5LCBlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGVsZW1lbnRdIG9mIG5ld1JlbmRlcmVkRWxlbWVudHMpIHtcbiAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNldChrZXksIGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVjcmVtZW50IHRvdGFsSXRlbXMgTk9XIHNvIHJlbmRlckl0ZW1zKCkgdXNlcyB0aGUgY29ycmVjdCBjb3VudFxuICAgICAgICAvLyBzZXRUb3RhbEl0ZW1zKCkgd2lsbCBiZSBjYWxsZWQgbGF0ZXIgYnkgdGhlIEFQSSwgd2hpY2ggd2lsbCBlbWl0XG4gICAgICAgIC8vIHZpZXdwb3J0OnRvdGFsLWl0ZW1zLWNoYW5nZWQgZm9yIHZpcnR1YWwgc2l6ZSByZWNhbGN1bGF0aW9uXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlICYmIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyA+IDApIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMtLTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc2V0IHZpc2libGUgcmFuZ2UgdG8gZm9yY2UgcmUtcmVuZGVyXG4gICAgICAgIGN1cnJlbnRWaXNpYmxlUmFuZ2UgPSB7IHN0YXJ0OiAtMSwgZW5kOiAtMSB9O1xuXG4gICAgICAgIC8vIEVtaXQgY29tcGxldGlvbiBldmVudFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiaXRlbTpyZW1vdmVkXCIsIHtcbiAgICAgICAgICBpdGVtLFxuICAgICAgICAgIGluZGV4LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBZnRlciBpdGVtIHJlbW92YWwsIGNsZWFyIEFMTCBsb2FkZWRSYW5nZXMgYW5kIGNvbGxlY3Rpb25JdGVtcyBjYWNoZVxuICAgICAgICAvLyBUaGlzIGZvcmNlcyBhIGNvbXBsZXRlIHJlbG9hZCB3aGljaCBpcyBtb3JlIHJlbGlhYmxlIHRoYW4gdHJ5aW5nIHRvXG4gICAgICAgIC8vIHRyYWNrIHNoaWZ0ZWQgaW5kaWNlcy4gVGhlIGl0ZW1zIGFycmF5IGhhcyBiZWVuIHNwbGljZWQgYW5kIGFsbCBpbmRpY2VzXG4gICAgICAgIC8vIGFyZSBub3cgZGlmZmVyZW50IGZyb20gd2hhdCBsb2FkZWRSYW5nZXMgdGhpbmtzIHRoZXkgYXJlLlxuICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpPy5jb2xsZWN0aW9uO1xuICAgICAgICBpZiAoY29sbGVjdGlvbj8uZ2V0TG9hZGVkUmFuZ2VzKSB7XG4gICAgICAgICAgY29uc3QgbG9hZGVkUmFuZ2VzID0gY29sbGVjdGlvbi5nZXRMb2FkZWRSYW5nZXMoKTtcbiAgICAgICAgICBsb2FkZWRSYW5nZXMuY2xlYXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsZWFyIHRoZSBlbnRpcmUgY29sbGVjdGlvbkl0ZW1zIGNhY2hlIC0gaXQncyBhbGwgc3RhbGUgYWZ0ZXIgcmVtb3ZhbFxuICAgICAgICAvLyBLZWVwIG9ubHkgdGhlIGl0ZW1zIHdlIGFjdHVhbGx5IGhhdmUgaW4gdGhlIHNvdXJjZSBhcnJheVxuICAgICAgICBjb25zdCBsb2FkZWRJdGVtc0NvdW50ID0gY29sbGVjdGlvbkl0ZW1zU291cmNlLmxlbmd0aDtcbiAgICAgICAgY29uc3QgY2FjaGVLZXlzID0gT2JqZWN0LmtleXMoY29sbGVjdGlvbkl0ZW1zKVxuICAgICAgICAgIC5tYXAoTnVtYmVyKVxuICAgICAgICAgIC5maWx0ZXIoKGspID0+ICFpc05hTihrKSk7XG4gICAgICAgIGNhY2hlS2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICBpZiAoa2V5ID49IGxvYWRlZEl0ZW1zQ291bnQpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjb2xsZWN0aW9uSXRlbXNba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFRyaWdnZXIgcmVsb2FkIG9mIHZpc2libGUgcmFuZ2VcbiAgICAgICAgY29uc3QgdmlzaWJsZVJhbmdlID0gY29tcG9uZW50LnZpZXdwb3J0Py5nZXRWaXNpYmxlUmFuZ2U/LigpO1xuICAgICAgICBpZiAodmlzaWJsZVJhbmdlICYmIGNvbGxlY3Rpb24/LmxvYWRNaXNzaW5nUmFuZ2VzKSB7XG4gICAgICAgICAgY29sbGVjdGlvbi5sb2FkTWlzc2luZ1JhbmdlcyhcbiAgICAgICAgICAgIHsgc3RhcnQ6IDAsIGVuZDogTWF0aC5tYXgodmlzaWJsZVJhbmdlLmVuZCwgbG9hZGVkSXRlbXNDb3VudCkgfSxcbiAgICAgICAgICAgIFwiaXRlbS1yZW1vdmFsXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyaWdnZXIgcmUtcmVuZGVyXG4gICAgICAgIHJlbmRlckl0ZW1zKCk7XG4gICAgICAgIGlzUmVtb3ZpbmdJdGVtID0gZmFsc2U7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBpdGVtcyBhZGQgcmVxdWVzdHMgZnJvbSBBUElcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiaXRlbXM6YWRkLXJlcXVlc3RcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB7IGl0ZW1zOiBuZXdJdGVtcywgcG9zaXRpb24sIHByZXZpb3VzQ291bnQgfSA9IGRhdGE7XG5cbiAgICAgICAgaWYgKCFuZXdJdGVtcyB8fCBuZXdJdGVtcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICAvLyBHZXQgdGhlIHNvdXJjZSBvZiB0cnV0aCAtIGNvbGxlY3Rpb24uaXRlbXMgaGFzIGFscmVhZHkgYmVlbiBtb2RpZmllZCBieSBhcGkudHNcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbkl0ZW1zU291cmNlID1cbiAgICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbj8uaXRlbXMgfHxcbiAgICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuaXRlbXMgfHxcbiAgICAgICAgICBbXTtcblxuICAgICAgICBjb25zdCBpdGVtc0FkZGVkID0gbmV3SXRlbXMubGVuZ3RoO1xuXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gXCJzdGFydFwiKSB7XG4gICAgICAgICAgLy8gSXRlbXMgd2VyZSBwcmVwZW5kZWQgLSBzaGlmdCBhbGwgZXhpc3RpbmcgaW5kaWNlcyB1cFxuICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhjb2xsZWN0aW9uSXRlbXMpXG4gICAgICAgICAgICAubWFwKE51bWJlcilcbiAgICAgICAgICAgIC5maWx0ZXIoKGspID0+ICFpc05hTihrKSlcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBiIC0gYSk7IC8vIFNvcnQgZGVzY2VuZGluZyB0byBhdm9pZCBvdmVyd3JpdGVzXG5cbiAgICAgICAgICAvLyBTaGlmdCBhbGwgZXhpc3RpbmcgaW5kaWNlcyB1cCBieSB0aGUgbnVtYmVyIG9mIGl0ZW1zIGFkZGVkXG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICAgICAgY29uc3QgbmV3SW5kZXggPSBrZXkgKyBpdGVtc0FkZGVkO1xuICAgICAgICAgICAgY29sbGVjdGlvbkl0ZW1zW25ld0luZGV4XSA9IGNvbGxlY3Rpb25JdGVtc1trZXldO1xuICAgICAgICAgICAgZGVsZXRlIGNvbGxlY3Rpb25JdGVtc1trZXldO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEFkZCB0aGUgbmV3IGl0ZW1zIGF0IHRoZSBzdGFydFxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXNBZGRlZDsgaSsrKSB7XG4gICAgICAgICAgICBjb2xsZWN0aW9uSXRlbXNbaV0gPSBuZXdJdGVtc1tpXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTaGlmdCByZW5kZXJlZCBlbGVtZW50cyBpbmRpY2VzIHVwXG4gICAgICAgICAgY29uc3QgcmVuZGVyZWRLZXlzID0gQXJyYXkuZnJvbShyZW5kZXJlZEVsZW1lbnRzLmtleXMoKSkuc29ydChcbiAgICAgICAgICAgIChhLCBiKSA9PiBiIC0gYSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IG5ld1JlbmRlcmVkRWxlbWVudHMgPSBuZXcgTWFwPG51bWJlciwgSFRNTEVsZW1lbnQ+KCk7XG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgcmVuZGVyZWRLZXlzKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVuZGVyZWRFbGVtZW50cy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgIGNvbnN0IG5ld0luZGV4ID0ga2V5ICsgaXRlbXNBZGRlZDtcbiAgICAgICAgICAgICAgZWxlbWVudC5kYXRhc2V0LmluZGV4ID0gU3RyaW5nKG5ld0luZGV4KTtcbiAgICAgICAgICAgICAgbmV3UmVuZGVyZWRFbGVtZW50cy5zZXQobmV3SW5kZXgsIGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLmNsZWFyKCk7XG4gICAgICAgICAgZm9yIChjb25zdCBba2V5LCBlbGVtZW50XSBvZiBuZXdSZW5kZXJlZEVsZW1lbnRzKSB7XG4gICAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNldChrZXksIGVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBJdGVtcyB3ZXJlIGFwcGVuZGVkIC0ganVzdCBhZGQgdGhlbSBhdCB0aGUgZW5kXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtc0FkZGVkOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcHJldmlvdXNDb3VudCArIGk7XG4gICAgICAgICAgICBjb2xsZWN0aW9uSXRlbXNbaW5kZXhdID0gbmV3SXRlbXNbaV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIHRvdGFsSXRlbXMgaW4gdmlld3BvcnRTdGF0ZVxuICAgICAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyA9XG4gICAgICAgICAgICAodmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zIHx8IDApICsgaXRlbXNBZGRlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc2V0IHZpc2libGUgcmFuZ2UgdG8gZm9yY2UgcmUtcmVuZGVyXG4gICAgICAgIGN1cnJlbnRWaXNpYmxlUmFuZ2UgPSB7IHN0YXJ0OiAtMSwgZW5kOiAtMSB9O1xuXG4gICAgICAgIC8vIENsZWFyIGxvYWRlZFJhbmdlcyB0byBlbnN1cmUgcHJvcGVyIHJlbG9hZCB0cmFja2luZ1xuICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpPy5jb2xsZWN0aW9uO1xuICAgICAgICBpZiAoY29sbGVjdGlvbj8uZ2V0TG9hZGVkUmFuZ2VzKSB7XG4gICAgICAgICAgY29uc3QgbG9hZGVkUmFuZ2VzID0gY29sbGVjdGlvbi5nZXRMb2FkZWRSYW5nZXMoKTtcbiAgICAgICAgICBsb2FkZWRSYW5nZXMuY2xlYXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyaWdnZXIgcmUtcmVuZGVyXG4gICAgICAgIHJlbmRlckl0ZW1zKCk7XG5cbiAgICAgICAgLy8gRW1pdCBjb21wbGV0aW9uIGV2ZW50XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtczpyZW5kZXItY29tcGxldGVcIiwge1xuICAgICAgICAgIGl0ZW1zOiBuZXdJdGVtcyxcbiAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICB0b3RhbDogdmlld3BvcnRTdGF0ZT8udG90YWxJdGVtcyB8fCAwLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGNvbGxlY3Rpb24gaXRlbXMgZXZpY3RlZCAtIGNsZWFuIHVwIG91ciBjYWNoZSB0b29cbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiY29sbGVjdGlvbjppdGVtcy1ldmljdGVkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgeyBrZWVwU3RhcnQsIGtlZXBFbmQsIGV2aWN0ZWRDb3VudCB9ID0gZGF0YTtcbiAgICAgICAgbGV0IGNsZWFuZWRDb3VudCA9IDA7XG5cbiAgICAgICAgLy8gUmVtb3ZlIGV2aWN0ZWQgaXRlbXMgZnJvbSBvdXIgY2FjaGVcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY29sbGVjdGlvbkl0ZW1zKSB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBwYXJzZUludChrZXksIDEwKTtcbiAgICAgICAgICBpZiAoaW5kZXggPCBrZWVwU3RhcnQgfHwgaW5kZXggPiBrZWVwRW5kKSB7XG4gICAgICAgICAgICBkZWxldGUgY29sbGVjdGlvbkl0ZW1zW2luZGV4XTtcbiAgICAgICAgICAgIGNsZWFuZWRDb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgY29sbGVjdGlvbiBkYXRhIGxvYWRlZFxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJjb2xsZWN0aW9uOnJhbmdlLWxvYWRlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmICghZGF0YS5pdGVtcz8ubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgICAgLy8gQW5hbHl6ZSBkYXRhIHN0cnVjdHVyZSBvbiBmaXJzdCBsb2FkXG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVycyA9IChjb21wb25lbnQgYXMgYW55KS5wbGFjZWhvbGRlcnM7XG4gICAgICAgIGlmIChwbGFjZWhvbGRlcnMgJiYgIXBsYWNlaG9sZGVycy5oYXNBbmFseXplZFN0cnVjdHVyZSgpKSB7XG4gICAgICAgICAgcGxhY2Vob2xkZXJzLmFuYWx5emVEYXRhU3RydWN0dXJlKGRhdGEuaXRlbXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIGNvbGxlY3Rpb24gaXRlbXMgYW5kIHJlcGxhY2UgcGxhY2Vob2xkZXJzXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAvLyAgIGBbUkVOREVSLUZJWF0gVXBkYXRpbmcgY29sbGVjdGlvbkl0ZW1zIGZvciBpbmRpY2VzICR7ZGF0YS5vZmZzZXR9IHRvICR7ZGF0YS5vZmZzZXQgKyBkYXRhLml0ZW1zLmxlbmd0aCAtIDF9YCxcbiAgICAgICAgLy8gKTtcbiAgICAgICAgbGV0IHNraXBwZWRDb3VudCA9IDA7XG4gICAgICAgIGRhdGEuaXRlbXMuZm9yRWFjaCgoaXRlbTogYW55LCBpOiBudW1iZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGRhdGEub2Zmc2V0ICsgaTtcbiAgICAgICAgICBjb25zdCBvbGRJdGVtID0gY29sbGVjdGlvbkl0ZW1zW2luZGV4XTtcbiAgICAgICAgICBjb2xsZWN0aW9uSXRlbXNbaW5kZXhdID0gaXRlbTtcblxuICAgICAgICAgIC8vIFJlcGxhY2UgcGxhY2Vob2xkZXIgaW4gRE9NIGlmIG5lZWRlZFxuICAgICAgICAgIGNvbnN0IHdhc1BsYWNlaG9sZGVyID0gb2xkSXRlbSAmJiBpc1BsYWNlaG9sZGVyKG9sZEl0ZW0pO1xuICAgICAgICAgIGNvbnN0IGhhc0VsZW1lbnQgPSByZW5kZXJlZEVsZW1lbnRzLmhhcyhpbmRleCk7XG4gICAgICAgICAgaWYgKHdhc1BsYWNlaG9sZGVyICYmIGhhc0VsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSByZW5kZXJlZEVsZW1lbnRzLmdldChpbmRleCk7XG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50ID0gcmVuZGVySXRlbShpdGVtLCBpbmRleCk7XG4gICAgICAgICAgICAgIGlmIChuZXdFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHBsYWNlaG9sZGVyIGNsYXNzZXMgZnJvbSB3cmFwcGVyXG4gICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MobmV3RWxlbWVudCwgVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLkNMQVNTKTtcbiAgICAgICAgICAgICAgICAvLyBBbHNvIHJlbW92ZSBmcm9tIGlubmVyIGVsZW1lbnQgKGZvciBzdHJpbmcgdGVtcGxhdGVzKVxuICAgICAgICAgICAgICAgIGlmIChuZXdFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICByZW1vdmVDbGFzcyhcbiAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCBhcyBIVE1MRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLkNMQVNTLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgcmVwbGFjZWQgY2xhc3MgZm9yIGZhZGUtaW4gYW5pbWF0aW9uXG4gICAgICAgICAgICAgICAgYWRkQ2xhc3MobmV3RWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtLS1yZXBsYWNlZFwiKTtcblxuICAgICAgICAgICAgICAgIC8vIENvcHkgcG9zaXRpb24gYW5kIHJlcGxhY2VcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKG5ld0VsZW1lbnQuc3R5bGUsIHtcbiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBlbGVtZW50LnN0eWxlLnBvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBlbGVtZW50LnN0eWxlLnRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiBlbGVtZW50LnN0eWxlLndpZHRoLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZT8ucmVwbGFjZUNoaWxkKG5ld0VsZW1lbnQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2V0KGluZGV4LCBuZXdFbGVtZW50KTtcbiAgICAgICAgICAgICAgICByZWxlYXNlRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgcmVwbGFjZWQgY2xhc3MgYWZ0ZXIgYW5pbWF0aW9uIGNvbXBsZXRlc1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MobmV3RWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtLS1yZXBsYWNlZFwiKTtcbiAgICAgICAgICAgICAgICB9LCAzMDApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHJlbmRlckl0ZW0gcmV0dXJuZWQgbnVsbCAtIHN0aWxsIHJlbGVhc2UgdGhlIG9sZCBlbGVtZW50XG4gICAgICAgICAgICAgICAgcmVsZWFzZUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5kZWxldGUoaW5kZXgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh3YXNQbGFjZWhvbGRlciAmJiAhaGFzRWxlbWVudCkge1xuICAgICAgICAgICAgc2tpcHBlZENvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJZiB3ZSBza2lwcGVkIGl0ZW1zIGJlY2F1c2Ugbm8gZWxlbWVudCwgdHJpZ2dlciBhIHJlbmRlciB0byBzaG93IHRoZW1cbiAgICAgICAgaWYgKHNraXBwZWRDb3VudCA+IDAgJiYgdmlld3BvcnRTdGF0ZT8udmlzaWJsZVJhbmdlKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSB2aWV3cG9ydFN0YXRlLnZpc2libGVSYW5nZTtcbiAgICAgICAgICBjb25zdCBsb2FkZWRTdGFydCA9IGRhdGEub2Zmc2V0O1xuICAgICAgICAgIGNvbnN0IGxvYWRlZEVuZCA9IGRhdGEub2Zmc2V0ICsgZGF0YS5pdGVtcy5sZW5ndGggLSAxO1xuICAgICAgICAgIC8vIENoZWNrIGlmIGxvYWRlZCBkYXRhIG92ZXJsYXBzIHdpdGggdmlzaWJsZSByYW5nZVxuICAgICAgICAgIGlmIChsb2FkZWRTdGFydCA8PSBlbmQgJiYgbG9hZGVkRW5kID49IHN0YXJ0KSB7XG4gICAgICAgICAgICByZW5kZXJJdGVtcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlIG5lZWQgdG8gcmVuZGVyXG4gICAgICAgIGNvbnN0IHsgdmlzaWJsZVJhbmdlIH0gPSB2aWV3cG9ydFN0YXRlIHx8IHt9O1xuICAgICAgICBpZiAodmlzaWJsZVJhbmdlKSB7XG4gICAgICAgICAgY29uc3QgcmVuZGVyU3RhcnQgPSBNYXRoLm1heCgwLCB2aXNpYmxlUmFuZ2Uuc3RhcnQgLSBvdmVyc2Nhbik7XG4gICAgICAgICAgY29uc3QgcmVuZGVyRW5kID0gTWF0aC5taW4oXG4gICAgICAgICAgICB2aWV3cG9ydFN0YXRlPy50b3RhbEl0ZW1zID8/IDAgLSAxLFxuICAgICAgICAgICAgdmlzaWJsZVJhbmdlLmVuZCArIG92ZXJzY2FuLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgbG9hZGVkU3RhcnQgPSBkYXRhLm9mZnNldDtcbiAgICAgICAgICBjb25zdCBsb2FkZWRFbmQgPSBkYXRhLm9mZnNldCArIGRhdGEuaXRlbXMubGVuZ3RoIC0gMTtcblxuICAgICAgICAgIC8vIENoZWNrIGZvciBwbGFjZWhvbGRlcnMgaW4gcmFuZ2VcbiAgICAgICAgICBjb25zdCBoYXNQbGFjZWhvbGRlcnNJblJhbmdlID0gQXJyYXkuZnJvbShcbiAgICAgICAgICAgIHsgbGVuZ3RoOiBNYXRoLm1pbihsb2FkZWRFbmQsIHJlbmRlckVuZCkgLSBsb2FkZWRTdGFydCArIDEgfSxcbiAgICAgICAgICAgIChfLCBpKSA9PiBjb2xsZWN0aW9uSXRlbXNbbG9hZGVkU3RhcnQgKyBpXSxcbiAgICAgICAgICApLnNvbWUoKGl0ZW0pID0+IGl0ZW0gJiYgaXNQbGFjZWhvbGRlcihpdGVtKSk7XG5cbiAgICAgICAgICBjb25zdCBuZWVkc1JlbmRlciA9XG4gICAgICAgICAgICAobG9hZGVkU3RhcnQgPD0gcmVuZGVyRW5kICYmXG4gICAgICAgICAgICAgIGxvYWRlZEVuZCA+PSByZW5kZXJTdGFydCAmJlxuICAgICAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNpemUgPCByZW5kZXJFbmQgLSByZW5kZXJTdGFydCArIDEpIHx8XG4gICAgICAgICAgICBoYXNQbGFjZWhvbGRlcnNJblJhbmdlO1xuXG4gICAgICAgICAgaWYgKG5lZWRzUmVuZGVyKSByZW5kZXJJdGVtcygpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBldmVudHNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6cmFuZ2UtY2hhbmdlZFwiLCByZW5kZXJJdGVtcyk7XG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnNjcm9sbFwiLCB1cGRhdGVJdGVtUG9zaXRpb25zKTtcblxuICAgICAgLy8gVXBkYXRlIGl0ZW1zIGNvbnRhaW5lciBoZWlnaHQgd2hlbiB2aXJ0dWFsIHNpemUgY2hhbmdlc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDp2aXJ0dWFsLXNpemUtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlPy5pdGVtc0NvbnRhaW5lciAmJlxuICAgICAgICAgIGRhdGEudG90YWxWaXJ0dWFsU2l6ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuaXRlbXNDb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gYCR7ZGF0YS50b3RhbFZpcnR1YWxTaXplfXB4YDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBUZW1wbGF0ZSBoZWxwZXJzXG4gICAgY29uc3QgZ2V0RGVmYXVsdFRlbXBsYXRlID0gKCkgPT4gKGl0ZW06IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgLy8gVXNlIGxheW91dCBzeXN0ZW0gZm9yIGRlZmF1bHQgdGVtcGxhdGVcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0YWc6IFwiZGl2XCIsXG4gICAgICAgICAgY2xhc3M6IFwidmlld3BvcnQtaXRlbVwiLFxuICAgICAgICAgIHRleHQ6XG4gICAgICAgICAgICB0eXBlb2YgaXRlbSA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgICAgICA/IGl0ZW0ubmFtZSB8fCBpdGVtLmxhYmVsIHx8IGl0ZW0udGV4dCB8fCBgSXRlbSAke2luZGV4fWBcbiAgICAgICAgICAgICAgOiBTdHJpbmcoaXRlbSksXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH07XG5cbiAgICAvLyBQcm9jZXNzIGxheW91dCBzY2hlbWEgd2l0aCBpdGVtIGRhdGEgc3Vic3RpdHV0aW9uXG4gICAgY29uc3QgcHJvY2Vzc0xheW91dFNjaGVtYSA9IChcbiAgICAgIHNjaGVtYTogYW55LFxuICAgICAgaXRlbTogYW55LFxuICAgICAgaW5kZXg6IG51bWJlcixcbiAgICApOiBhbnkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBzY2hlbWEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgLy8gSGFuZGxlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbiBsaWtlIHt7bmFtZX19LCB7e2luZGV4fX1cbiAgICAgICAgcmV0dXJuIHNjaGVtYS5yZXBsYWNlKC9cXHtcXHsoW159XSspXFx9XFx9L2csIChtYXRjaCwga2V5KSA9PiB7XG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJpbmRleFwiKSByZXR1cm4gU3RyaW5nKGluZGV4KTtcbiAgICAgICAgICBpZiAoa2V5ID09PSBcIml0ZW1cIikgcmV0dXJuIFN0cmluZyhpdGVtKTtcblxuICAgICAgICAgIC8vIEhhbmRsZSBuZXN0ZWQgcHJvcGVydGllcyBsaWtlIHt7dXNlci5uYW1lfX1cbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGtleS5zcGxpdChcIi5cIikucmVkdWNlKChvYmo6IGFueSwgcHJvcDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gb2JqPy5bcHJvcC50cmltKCldO1xuICAgICAgICAgIH0sIGl0ZW0pO1xuXG4gICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgPyBTdHJpbmcodmFsdWUpIDogbWF0Y2g7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEpKSB7XG4gICAgICAgIHJldHVybiBzY2hlbWEubWFwKChjaGlsZCkgPT4gcHJvY2Vzc0xheW91dFNjaGVtYShjaGlsZCwgaXRlbSwgaW5kZXgpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBzY2hlbWEgPT09IFwib2JqZWN0XCIgJiYgc2NoZW1hICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHByb2Nlc3NlZDogYW55ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNjaGVtYSkpIHtcbiAgICAgICAgICBwcm9jZXNzZWRba2V5XSA9IHByb2Nlc3NMYXlvdXRTY2hlbWEodmFsdWUsIGl0ZW0sIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvY2Vzc2VkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2NoZW1hO1xuICAgIH07XG5cbiAgICAvLyBQb3NpdGlvbiBjYWxjdWxhdGlvblxuICAgIGNvbnN0IGNhbGN1bGF0ZUl0ZW1Qb3NpdGlvbiA9IChcbiAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgICBzY3JvbGxQb3NpdGlvbjogbnVtYmVyLFxuICAgICAgdG90YWxJdGVtczogbnVtYmVyLFxuICAgICAgaXRlbVNpemU6IG51bWJlcixcbiAgICAgIHZpcnR1YWxUb3RhbFNpemU6IG51bWJlcixcbiAgICAgIGNvbnRhaW5lclNpemU6IG51bWJlcixcbiAgICAgIHRhcmdldFNjcm9sbEluZGV4PzogbnVtYmVyLFxuICAgICk6IG51bWJlciA9PiB7XG4gICAgICBjb25zdCBhY3R1YWxUb3RhbFNpemUgPSB0b3RhbEl0ZW1zICogaXRlbVNpemU7XG4gICAgICBjb25zdCBpc0NvbXByZXNzZWQgPVxuICAgICAgICBhY3R1YWxUb3RhbFNpemUgPiB2aXJ0dWFsVG90YWxTaXplICYmIHZpcnR1YWxUb3RhbFNpemUgPiAwO1xuXG4gICAgICAvLyBJZiB3ZSBoYXZlIGEgdGFyZ2V0U2Nyb2xsSW5kZXggKGZyb20gaW5pdGlhbFNjcm9sbEluZGV4KSwgdXNlIGl0IGRpcmVjdGx5XG4gICAgICAvLyBUaGlzIGVuc3VyZXMgaXRlbXMgYXJlIHBvc2l0aW9uZWQgY29ycmVjdGx5IGV2ZW4gd2l0aCBjb21wcmVzc2lvblxuICAgICAgaWYgKHRhcmdldFNjcm9sbEluZGV4ICE9PSB1bmRlZmluZWQgJiYgdGFyZ2V0U2Nyb2xsSW5kZXggPiAwKSB7XG4gICAgICAgIC8vIFBvc2l0aW9uIGl0ZW1zIHJlbGF0aXZlIHRvIHRoZSB0YXJnZXQgaW5kZXhcbiAgICAgICAgLy8gVGhlIHRhcmdldCBpbmRleCBzaG91bGQgYXBwZWFyIGF0IHRoZSB0b3Agb2YgdGhlIHZpZXdwb3J0XG4gICAgICAgIHJldHVybiAoaW5kZXggLSB0YXJnZXRTY3JvbGxJbmRleCkgKiBpdGVtU2l6ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc0NvbXByZXNzZWQgfHwgdG90YWxJdGVtcyA9PT0gMCkge1xuICAgICAgICByZXR1cm4gaW5kZXggKiBpdGVtU2l6ZSAtIHNjcm9sbFBvc2l0aW9uO1xuICAgICAgfVxuXG4gICAgICAvLyBDb21wcmVzc2VkIHNwYWNlIGhhbmRsaW5nXG4gICAgICBjb25zdCBtYXhTY3JvbGxQb3NpdGlvbiA9IHZpcnR1YWxUb3RhbFNpemUgLSBjb250YWluZXJTaXplO1xuICAgICAgY29uc3QgZGlzdGFuY2VGcm9tQm90dG9tID0gbWF4U2Nyb2xsUG9zaXRpb24gLSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgIGNvbnN0IG5lYXJCb3R0b21UaHJlc2hvbGQgPSBjb250YWluZXJTaXplO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGRpc3RhbmNlRnJvbUJvdHRvbSA8PSBuZWFyQm90dG9tVGhyZXNob2xkICYmXG4gICAgICAgIGRpc3RhbmNlRnJvbUJvdHRvbSA+PSAtMVxuICAgICAgKSB7XG4gICAgICAgIC8vIE5lYXIgYm90dG9tIGludGVycG9sYXRpb25cbiAgICAgICAgY29uc3QgaXRlbXNBdEJvdHRvbSA9IE1hdGguZmxvb3IoY29udGFpbmVyU2l6ZSAvIGl0ZW1TaXplKTtcbiAgICAgICAgY29uc3QgZmlyc3RWaXNpYmxlQXRCb3R0b20gPSBNYXRoLm1heCgwLCB0b3RhbEl0ZW1zIC0gaXRlbXNBdEJvdHRvbSk7XG4gICAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsVG90YWxTaXplO1xuICAgICAgICBjb25zdCBleGFjdFNjcm9sbEluZGV4ID0gc2Nyb2xsUmF0aW8gKiB0b3RhbEl0ZW1zO1xuICAgICAgICBjb25zdCBpbnRlcnBvbGF0aW9uID0gTWF0aC5tYXgoXG4gICAgICAgICAgMCxcbiAgICAgICAgICBNYXRoLm1pbigxLCAxIC0gZGlzdGFuY2VGcm9tQm90dG9tIC8gbmVhckJvdHRvbVRocmVzaG9sZCksXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgYm90dG9tUG9zaXRpb24gPSAoaW5kZXggLSBmaXJzdFZpc2libGVBdEJvdHRvbSkgKiBpdGVtU2l6ZTtcbiAgICAgICAgY29uc3Qgbm9ybWFsUG9zaXRpb24gPSAoaW5kZXggLSBleGFjdFNjcm9sbEluZGV4KSAqIGl0ZW1TaXplO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG5vcm1hbFBvc2l0aW9uICsgKGJvdHRvbVBvc2l0aW9uIC0gbm9ybWFsUG9zaXRpb24pICogaW50ZXJwb2xhdGlvblxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBOb3JtYWwgY29tcHJlc3NlZCBzY3JvbGxpbmdcbiAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsVG90YWxTaXplO1xuICAgICAgcmV0dXJuIChpbmRleCAtIHNjcm9sbFJhdGlvICogdG90YWxJdGVtcykgKiBpdGVtU2l6ZTtcbiAgICB9O1xuXG4gICAgLy8gUmVuZGVyIHNpbmdsZSBpdGVtXG4gICAgY29uc3QgcmVuZGVySXRlbSA9IChpdGVtOiBhbnksIGluZGV4OiBudW1iZXIpOiBIVE1MRWxlbWVudCB8IG51bGwgPT4ge1xuICAgICAgY29uc3QgaXRlbVRlbXBsYXRlID0gdGVtcGxhdGUgfHwgZ2V0RGVmYXVsdFRlbXBsYXRlKCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGl0ZW1UZW1wbGF0ZShpdGVtLCBpbmRleCk7XG4gICAgICAgIGxldCBlbGVtZW50OiBIVE1MRWxlbWVudDtcblxuICAgICAgICAvLyBDaGVjayBpZiByZXN1bHQgaXMgYSBsYXlvdXQgc2NoZW1hIChhcnJheSBvciBvYmplY3QpXG4gICAgICAgIGlmIChcbiAgICAgICAgICBBcnJheS5pc0FycmF5KHJlc3VsdCkgfHxcbiAgICAgICAgICAodHlwZW9mIHJlc3VsdCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgcmVzdWx0ICE9PSBudWxsICYmXG4gICAgICAgICAgICAhKHJlc3VsdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gUHJvY2VzcyBzY2hlbWEgdG8gc3Vic3RpdHV0ZSB2YXJpYWJsZXNcbiAgICAgICAgICBjb25zdCBwcm9jZXNzZWRTY2hlbWEgPSBwcm9jZXNzTGF5b3V0U2NoZW1hKHJlc3VsdCwgaXRlbSwgaW5kZXgpO1xuXG4gICAgICAgICAgLy8gVXNlIGxheW91dCBzeXN0ZW0gdG8gY3JlYXRlIGVsZW1lbnRcbiAgICAgICAgICBjb25zdCBsYXlvdXRSZXN1bHQgPSBjcmVhdGVMYXlvdXQocHJvY2Vzc2VkU2NoZW1hKTtcbiAgICAgICAgICBlbGVtZW50ID0gbGF5b3V0UmVzdWx0LmVsZW1lbnQ7XG5cbiAgICAgICAgICAvLyBJZiB0aGUgbGF5b3V0IGNyZWF0ZWQgYSB3cmFwcGVyLCB1c2UgaXQgZGlyZWN0bHlcbiAgICAgICAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAvLyBFbGVtZW50IGlzIGFscmVhZHkgY3JlYXRlZCBieSBsYXlvdXQgc3lzdGVtXG4gICAgICAgICAgICAvLyBTdG9yZSBsYXlvdXRSZXN1bHQgZm9yIGNsZWFudXAgd2hlbiBlbGVtZW50IGlzIHJlbGVhc2VkIChwcmV2ZW50cyBtZW1vcnkgbGVhaylcbiAgICAgICAgICAgIGxheW91dFJlc3VsdHMuc2V0KGVsZW1lbnQsIGxheW91dFJlc3VsdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZhbGxiYWNrIGlmIGxheW91dCBkaWRuJ3QgY3JlYXRlIGEgcHJvcGVyIGVsZW1lbnRcbiAgICAgICAgICAgIGVsZW1lbnQgPSBnZXRQb29sZWRFbGVtZW50KCk7XG4gICAgICAgICAgICBpZiAobGF5b3V0UmVzdWx0LmVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChsYXlvdXRSZXN1bHQuZWxlbWVudCk7XG4gICAgICAgICAgICAgIC8vIFN0b3JlIGxheW91dFJlc3VsdCBvbiB3cmFwcGVyIGVsZW1lbnQgZm9yIGNsZWFudXBcbiAgICAgICAgICAgICAgbGF5b3V0UmVzdWx0cy5zZXQoZWxlbWVudCwgbGF5b3V0UmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlc3VsdCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIC8vIFBhcnNlIEhUTUwgdXNpbmcgdGVtcGxhdGUgZWxlbWVudCAtIG9wdGltaXplZCBwYXRoXG4gICAgICAgICAgLy8gTW92ZSBub2RlcyBkaXJlY3RseSBpbnN0ZWFkIG9mIGNsb25pbmcgLSBtdWNoIGZhc3Rlciwgbm8gbWVtb3J5IG92ZXJoZWFkXG4gICAgICAgICAgdGVtcGxhdGVQYXJzZXIuaW5uZXJIVE1MID0gcmVzdWx0O1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSB0ZW1wbGF0ZVBhcnNlci5jb250ZW50O1xuXG4gICAgICAgICAgaWYgKGNvbnRlbnQuY2hpbGRyZW4ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAvLyBTaW5nbGUgcm9vdCBlbGVtZW50IC0gbW92ZSBkaXJlY3RseSAoZmFzdGVyIHRoYW4gY2xvbmVOb2RlKVxuICAgICAgICAgICAgZWxlbWVudCA9IGNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBjb250ZW50LnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xuICAgICAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgXCJtdHJsLXZpZXdwb3J0LWl0ZW1cIik7XG4gICAgICAgICAgICBpZiAoaXNQbGFjZWhvbGRlcihpdGVtKSkge1xuICAgICAgICAgICAgICBhZGRDbGFzcyhlbGVtZW50LCBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuQ0xBU1MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBNdWx0aXBsZSBjaGlsZHJlbiAtIG1vdmUgYWxsIGludG8gcG9vbGVkIGVsZW1lbnRcbiAgICAgICAgICAgIGVsZW1lbnQgPSBnZXRQb29sZWRFbGVtZW50KCk7XG4gICAgICAgICAgICB3aGlsZSAoY29udGVudC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY29udGVudC5maXJzdENoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgICBlbGVtZW50ID0gZ2V0UG9vbGVkRWxlbWVudCgpO1xuICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtSZW5kZXJpbmddIEludmFsaWQgdGVtcGxhdGUgcmVzdWx0IGZvciBpdGVtICR7aW5kZXh9YCk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgY2xhc3Nlc1xuICAgICAgICBpZiAoIWhhc0NsYXNzKGVsZW1lbnQsIFwidmlld3BvcnQtaXRlbVwiKSlcbiAgICAgICAgICBhZGRDbGFzcyhlbGVtZW50LCBcInZpZXdwb3J0LWl0ZW1cIik7XG4gICAgICAgIGlmIChpc1BsYWNlaG9sZGVyKGl0ZW0pKSB7XG4gICAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLkNMQVNTKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnQuZGF0YXNldC5pbmRleCA9IFN0cmluZyhpbmRleCk7XG5cbiAgICAgICAgLy8gQ29weSBkYXRhLWlkIGZyb20gaXRlbSB0byB2aWV3cG9ydCBlbGVtZW50IGZvciBzZWxlY3Rpb24gc3VwcG9ydFxuICAgICAgICBjb25zdCBpdGVtSWQgPSBpdGVtPy5faWQgfHwgaXRlbT8uaWQ7XG4gICAgICAgIGlmIChpdGVtSWQgIT09IHVuZGVmaW5lZCAmJiBpdGVtSWQgIT09IG51bGwpIHtcbiAgICAgICAgICBlbGVtZW50LmRhdGFzZXQuaWQgPSBTdHJpbmcoaXRlbUlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFtSZW5kZXJpbmddIEVycm9yIHJlbmRlcmluZyBpdGVtICR7aW5kZXh9OmAsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSBwb3NpdGlvbnNcbiAgICBjb25zdCB1cGRhdGVJdGVtUG9zaXRpb25zID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlIHx8IHJlbmRlcmVkRWxlbWVudHMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB7XG4gICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICBpdGVtU2l6ZTogaXRlbVNpemUsXG4gICAgICAgIHRvdGFsSXRlbXMsXG4gICAgICAgIHZpcnR1YWxUb3RhbFNpemUsXG4gICAgICAgIGNvbnRhaW5lclNpemUsXG4gICAgICB9ID0gdmlld3BvcnRTdGF0ZTtcbiAgICAgIGNvbnN0IGFjdHVhbFRvdGFsU2l6ZSA9IHRvdGFsSXRlbXMgKiBpdGVtU2l6ZTtcbiAgICAgIGNvbnN0IGlzQ29tcHJlc3NlZCA9XG4gICAgICAgIGFjdHVhbFRvdGFsU2l6ZSA+IHZpcnR1YWxUb3RhbFNpemUgJiYgdmlydHVhbFRvdGFsU2l6ZSA+IDA7XG5cbiAgICAgIGNvbnN0IHNvcnRlZEluZGljZXMgPSBBcnJheS5mcm9tKHJlbmRlcmVkRWxlbWVudHMua2V5cygpKS5zb3J0KFxuICAgICAgICAoYSwgYikgPT4gYSAtIGIsXG4gICAgICApO1xuICAgICAgaWYgKCFzb3J0ZWRJbmRpY2VzLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBmaXJzdEluZGV4ID0gc29ydGVkSW5kaWNlc1swXTtcbiAgICAgIGxldCBjdXJyZW50UG9zaXRpb24gPSAwO1xuXG4gICAgICBpZiAoaXNDb21wcmVzc2VkKSB7XG4gICAgICAgIGNvbnN0IG1heFNjcm9sbCA9IHZpcnR1YWxUb3RhbFNpemUgLSBjb250YWluZXJTaXplO1xuICAgICAgICBjb25zdCBkaXN0YW5jZUZyb21Cb3R0b20gPSBtYXhTY3JvbGwgLSBzY3JvbGxQb3NpdGlvbjtcblxuICAgICAgICBpZiAoZGlzdGFuY2VGcm9tQm90dG9tIDw9IGNvbnRhaW5lclNpemUgJiYgZGlzdGFuY2VGcm9tQm90dG9tID49IC0xKSB7XG4gICAgICAgICAgLy8gTmVhciBib3R0b20gaW50ZXJwb2xhdGlvblxuICAgICAgICAgIGNvbnN0IGl0ZW1zQXRCb3R0b20gPSBNYXRoLmZsb29yKGNvbnRhaW5lclNpemUgLyBpdGVtU2l6ZSk7XG4gICAgICAgICAgY29uc3QgZmlyc3RWaXNpYmxlQXRCb3R0b20gPSBNYXRoLm1heCgwLCB0b3RhbEl0ZW1zIC0gaXRlbXNBdEJvdHRvbSk7XG4gICAgICAgICAgY29uc3Qgc2Nyb2xsUmF0aW8gPSBzY3JvbGxQb3NpdGlvbiAvIHZpcnR1YWxUb3RhbFNpemU7XG4gICAgICAgICAgY29uc3QgZXhhY3RTY3JvbGxJbmRleCA9IHNjcm9sbFJhdGlvICogdG90YWxJdGVtcztcbiAgICAgICAgICBjb25zdCBpbnRlcnBvbGF0aW9uID0gTWF0aC5tYXgoXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgTWF0aC5taW4oMSwgMSAtIGRpc3RhbmNlRnJvbUJvdHRvbSAvIGNvbnRhaW5lclNpemUpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBib3R0b21Qb3MgPSAoZmlyc3RJbmRleCAtIGZpcnN0VmlzaWJsZUF0Qm90dG9tKSAqIGl0ZW1TaXplO1xuICAgICAgICAgIGNvbnN0IG5vcm1hbFBvcyA9IChmaXJzdEluZGV4IC0gZXhhY3RTY3JvbGxJbmRleCkgKiBpdGVtU2l6ZTtcbiAgICAgICAgICBjdXJyZW50UG9zaXRpb24gPSBub3JtYWxQb3MgKyAoYm90dG9tUG9zIC0gbm9ybWFsUG9zKSAqIGludGVycG9sYXRpb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgc2Nyb2xsUmF0aW8gPSBzY3JvbGxQb3NpdGlvbiAvIHZpcnR1YWxUb3RhbFNpemU7XG4gICAgICAgICAgY3VycmVudFBvc2l0aW9uID0gKGZpcnN0SW5kZXggLSBzY3JvbGxSYXRpbyAqIHRvdGFsSXRlbXMpICogaXRlbVNpemU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnRQb3NpdGlvbiA9IGZpcnN0SW5kZXggKiBpdGVtU2l6ZSAtIHNjcm9sbFBvc2l0aW9uO1xuICAgICAgfVxuXG4gICAgICAvLyBQb3NpdGlvbiBlYWNoIGl0ZW1cbiAgICAgIHNvcnRlZEluZGljZXMuZm9yRWFjaCgoaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuZ2V0KGluZGV4KTtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICBlbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKCR7TWF0aC5yb3VuZChcbiAgICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbixcbiAgICAgICAgICApfXB4KWA7XG5cbiAgICAgICAgICAvLyBTdHJhdGVnaWMgbG9nIGZvciBsYXN0IGl0ZW1zXG4gICAgICAgICAgLy8gaWYgKGluZGV4ID49IHRvdGFsSXRlbXMgLSA1KSB7XG4gICAgICAgICAgLy8gICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgICAgYFtSZW5kZXJpbmddIExhc3QgaXRlbSBwb3NpdGlvbmVkOiBpbmRleD0ke2luZGV4fSwgcG9zaXRpb249JHtNYXRoLnJvdW5kKFxuICAgICAgICAgIC8vICAgICAgIGN1cnJlbnRQb3NpdGlvblxuICAgICAgICAgIC8vICAgICApfXB4LCBpdGVtU2l6ZT0ke2l0ZW1TaXplfXB4LCB0b3RhbEl0ZW1zPSR7dG90YWxJdGVtc31gXG4gICAgICAgICAgLy8gICApO1xuICAgICAgICAgIC8vIH1cblxuICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbiArPSBpdGVtU2l6ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIE1haW4gcmVuZGVyIGZ1bmN0aW9uXG4gICAgY29uc3QgcmVuZGVySXRlbXMgPSAoKSA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGU/Lml0ZW1zQ29udGFpbmVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qge1xuICAgICAgICB2aXNpYmxlUmFuZ2UsXG4gICAgICAgIGl0ZW1zQ29udGFpbmVyLFxuICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICBpdGVtU2l6ZSxcbiAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgIGNvbnRhaW5lclNpemUsXG4gICAgICAgIHZpcnR1YWxUb3RhbFNpemUsXG4gICAgICB9ID0gdmlld3BvcnRTdGF0ZTtcblxuICAgICAgLy8gVmFsaWRhdGUgcmFuZ2UgLSBza2lwIHJlbmRlcmluZyBpZiBubyBpdGVtcyBvciByYW5nZSBpcyBpbnZhbGlkXG4gICAgICBpZiAoXG4gICAgICAgICF2aXNpYmxlUmFuZ2UgfHxcbiAgICAgICAgdG90YWxJdGVtcyA8PSAwIHx8XG4gICAgICAgIHZpc2libGVSYW5nZS5zdGFydCA8IDAgfHxcbiAgICAgICAgdmlzaWJsZVJhbmdlLnN0YXJ0ID49IHRvdGFsSXRlbXMgfHxcbiAgICAgICAgdmlzaWJsZVJhbmdlLmVuZCA8IHZpc2libGVSYW5nZS5zdGFydCB8fFxuICAgICAgICBpc05hTih2aXNpYmxlUmFuZ2Uuc3RhcnQpIHx8XG4gICAgICAgIGlzTmFOKHZpc2libGVSYW5nZS5lbmQpXG4gICAgICApIHtcbiAgICAgICAgLy8gSWYgdG90YWxJdGVtcyBpcyAwLCBjbGVhciBhbGwgcmVuZGVyZWQgZWxlbWVudHMgdG8gcmVtb3ZlIHN0YWxlIHBsYWNlaG9sZGVyc1xuICAgICAgICBpZiAodG90YWxJdGVtcyA8PSAwICYmIHJlbmRlcmVkRWxlbWVudHMuc2l6ZSA+IDApIHtcbiAgICAgICAgICBBcnJheS5mcm9tKHJlbmRlcmVkRWxlbWVudHMuZW50cmllcygpKS5mb3JFYWNoKChbaW5kZXgsIGVsZW1lbnRdKSA9PiB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5wYXJlbnROb2RlKSByZWxlYXNlRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuZGVsZXRlKGluZGV4KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjdXJyZW50VmlzaWJsZVJhbmdlID0geyBzdGFydDogLTEsIGVuZDogLTEgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHJhbmdlIGNoYW5nZWRcbiAgICAgIGlmIChcbiAgICAgICAgdmlzaWJsZVJhbmdlLnN0YXJ0ID09PSBjdXJyZW50VmlzaWJsZVJhbmdlLnN0YXJ0ICYmXG4gICAgICAgIHZpc2libGVSYW5nZS5lbmQgPT09IGN1cnJlbnRWaXNpYmxlUmFuZ2UuZW5kICYmXG4gICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2l6ZSA+IDBcbiAgICAgICkge1xuICAgICAgICB1cGRhdGVJdGVtUG9zaXRpb25zKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGFzdFJlbmRlclRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgcmVuZGVyU3RhcnQgPSBNYXRoLm1heCgwLCB2aXNpYmxlUmFuZ2Uuc3RhcnQgLSBvdmVyc2Nhbik7XG4gICAgICBjb25zdCByZW5kZXJFbmQgPSBNYXRoLm1pbih0b3RhbEl0ZW1zIC0gMSwgdmlzaWJsZVJhbmdlLmVuZCArIG92ZXJzY2FuKTtcblxuICAgICAgLy8gaWYgKGlzUmVtb3ZpbmdJdGVtKSB7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICAgIGBbUkVOREVSLUZJWF0gcmVuZGVySXRlbXMgY2FsYzogdmlzaWJsZVJhbmdlPSR7SlNPTi5zdHJpbmdpZnkodmlzaWJsZVJhbmdlKX0sIG92ZXJzY2FuPSR7b3ZlcnNjYW59LCB0b3RhbEl0ZW1zPSR7dG90YWxJdGVtc31gLFxuICAgICAgLy8gICApO1xuICAgICAgLy8gICBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgICBgW1JFTkRFUi1GSVhdIHJlbmRlckl0ZW1zIGNhbGM6IHJlbmRlclN0YXJ0PSR7cmVuZGVyU3RhcnR9LCByZW5kZXJFbmQ9JHtyZW5kZXJFbmR9YCxcbiAgICAgIC8vICAgKTtcbiAgICAgIC8vIH1cblxuICAgICAgLy8gUmVtb3ZlIGl0ZW1zIG91dHNpZGUgcmFuZ2VcbiAgICAgIEFycmF5LmZyb20ocmVuZGVyZWRFbGVtZW50cy5lbnRyaWVzKCkpXG4gICAgICAgIC5maWx0ZXIoKFtpbmRleF0pID0+IGluZGV4IDwgcmVuZGVyU3RhcnQgfHwgaW5kZXggPiByZW5kZXJFbmQpXG4gICAgICAgIC5mb3JFYWNoKChbaW5kZXgsIGVsZW1lbnRdKSA9PiB7XG4gICAgICAgICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSkgcmVsZWFzZUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5kZWxldGUoaW5kZXgpO1xuICAgICAgICB9KTtcblxuICAgICAgLy8gR2V0IGl0ZW1zIHNvdXJjZVxuICAgICAgY29uc3QgaGFzQ29sbGVjdGlvbkl0ZW1zID0gT2JqZWN0LmtleXMoY29sbGVjdGlvbkl0ZW1zKS5sZW5ndGggPiAwO1xuICAgICAgY29uc3QgaXRlbXMgPSBoYXNDb2xsZWN0aW9uSXRlbXNcbiAgICAgICAgPyBjb2xsZWN0aW9uSXRlbXNcbiAgICAgICAgOiBjb21wb25lbnQuaXRlbXMgfHwgW107XG4gICAgICBjb25zdCBtaXNzaW5nSXRlbXM6IG51bWJlcltdID0gW107XG5cbiAgICAgIC8vIENvbGxlY3QgbmV3IGVsZW1lbnRzIHRvIGluc2VydCAoaW5kZXggLT4gZWxlbWVudClcbiAgICAgIGNvbnN0IG5ld0VsZW1lbnRzOiBBcnJheTxbbnVtYmVyLCBIVE1MRWxlbWVudF0+ID0gW107XG5cbiAgICAgIC8vIFJlbmRlciBpdGVtcyBpbiByYW5nZVxuICAgICAgZm9yIChsZXQgaSA9IHJlbmRlclN0YXJ0OyBpIDw9IHJlbmRlckVuZDsgaSsrKSB7XG4gICAgICAgIGlmIChpIDwgMCB8fCBpID49IHRvdGFsSXRlbXMgfHwgcmVuZGVyZWRFbGVtZW50cy5oYXMoaSkpIGNvbnRpbnVlO1xuXG4gICAgICAgIGxldCBpdGVtID0gaXRlbXNbaV07XG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgIG1pc3NpbmdJdGVtcy5wdXNoKGkpO1xuICAgICAgICAgIC8vIEdlbmVyYXRlIHBsYWNlaG9sZGVyXG4gICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJzID0gKGNvbXBvbmVudCBhcyBhbnkpLnBsYWNlaG9sZGVycztcbiAgICAgICAgICBpdGVtID0gcGxhY2Vob2xkZXJzPy5nZW5lcmF0ZVBsYWNlaG9sZGVySXRlbShpKSB8fCB7XG4gICAgICAgICAgICBfcGxhY2Vob2xkZXI6IHRydWUsXG4gICAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICAgIGlkOiBgcGxhY2Vob2xkZXItJHtpfWAsXG4gICAgICAgICAgICBuYW1lOiBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuTUFTS19DSEFSQUNURVIucmVwZWF0KDE1KSxcbiAgICAgICAgICAgIHRleHQ6IFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVNLX0NIQVJBQ1RFUi5yZXBlYXQoMjUpLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVNLX0NIQVJBQ1RFUi5yZXBlYXQoNDApLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29sbGVjdGlvbkl0ZW1zW2ldID0gaXRlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSByZW5kZXJJdGVtKGl0ZW0sIGkpO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgIC8vIEdldCB0YXJnZXRTY3JvbGxJbmRleCBmcm9tIHZpZXdwb3J0U3RhdGUgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgY29uc3QgdGFyZ2V0U2Nyb2xsSW5kZXggPSAodmlld3BvcnRTdGF0ZSBhcyBhbnkpPy50YXJnZXRTY3JvbGxJbmRleDtcbiAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGNhbGN1bGF0ZUl0ZW1Qb3NpdGlvbihcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBzY3JvbGxQb3NpdGlvbixcbiAgICAgICAgICAgIHRvdGFsSXRlbXMsXG4gICAgICAgICAgICBpdGVtU2l6ZSxcbiAgICAgICAgICAgIHZpcnR1YWxUb3RhbFNpemUsXG4gICAgICAgICAgICBjb250YWluZXJTaXplLFxuICAgICAgICAgICAgdGFyZ2V0U2Nyb2xsSW5kZXgsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwge1xuICAgICAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZVkoJHtwb3NpdGlvbn1weClgLFxuICAgICAgICAgICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gQ29sbGVjdCBmb3IgYmF0Y2ggaW5zZXJ0aW9uIChpZiBtYWludGFpbmluZyBvcmRlcikgb3IganVzdCBhcHBlbmRcbiAgICAgICAgICBpZiAobWFpbnRhaW5Eb21PcmRlcikge1xuICAgICAgICAgICAgbmV3RWxlbWVudHMucHVzaChbaSwgZWxlbWVudF0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpdGVtc0NvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5zZXQoaSwgZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQmF0Y2ggaW5zZXJ0IG5ldyBlbGVtZW50cyBpbiBjb3JyZWN0IERPTSBvcmRlciAob25seSB3aGVuIG1haW50YWluRG9tT3JkZXIgaXMgZW5hYmxlZClcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBDU1Mgc2VsZWN0b3JzIGxpa2UgOmZpcnN0LWNoaWxkLCA6bnRoLWNoaWxkKCkgd29yayBjb3JyZWN0bHlcbiAgICAgIGlmIChtYWludGFpbkRvbU9yZGVyICYmIG5ld0VsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gU29ydCBuZXcgZWxlbWVudHMgYnkgaW5kZXhcbiAgICAgICAgbmV3RWxlbWVudHMuc29ydCgoW2FdLCBbYl0pID0+IGEgLSBiKTtcblxuICAgICAgICAvLyBHZXQgZXhpc3RpbmcgRE9NIGNoaWxkcmVuIHNvcnRlZCBieSB0aGVpciBkYXRhLWluZGV4XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQ2hpbGRyZW4gPSBBcnJheS5mcm9tKFxuICAgICAgICAgIGl0ZW1zQ29udGFpbmVyLmNoaWxkcmVuLFxuICAgICAgICApIGFzIEhUTUxFbGVtZW50W107XG5cbiAgICAgICAgLy8gTWVyZ2UgbmV3IGVsZW1lbnRzIGludG8gY29ycmVjdCBwb3NpdGlvbnNcbiAgICAgICAgbGV0IG5ld0lkeCA9IDA7XG4gICAgICAgIGxldCBleGlzdGluZ0lkeCA9IDA7XG5cbiAgICAgICAgd2hpbGUgKG5ld0lkeCA8IG5ld0VsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IFtuZXdJbmRleCwgbmV3RWxlbWVudF0gPSBuZXdFbGVtZW50c1tuZXdJZHhdO1xuXG4gICAgICAgICAgLy8gRmluZCB0aGUgZmlyc3QgZXhpc3RpbmcgY2hpbGQgd2l0aCBpbmRleCA+IG5ld0luZGV4XG4gICAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgZXhpc3RpbmdJZHggPCBleGlzdGluZ0NoaWxkcmVuLmxlbmd0aCAmJlxuICAgICAgICAgICAgcGFyc2VJbnQoZXhpc3RpbmdDaGlsZHJlbltleGlzdGluZ0lkeF0uZGF0YXNldC5pbmRleCB8fCBcIi0xXCIsIDEwKSA8XG4gICAgICAgICAgICAgIG5ld0luZGV4XG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBleGlzdGluZ0lkeCsrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChleGlzdGluZ0lkeCA8IGV4aXN0aW5nQ2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBJbnNlcnQgYmVmb3JlIHRoZSBleGlzdGluZyBjaGlsZFxuICAgICAgICAgICAgaXRlbXNDb250YWluZXIuaW5zZXJ0QmVmb3JlKFxuICAgICAgICAgICAgICBuZXdFbGVtZW50LFxuICAgICAgICAgICAgICBleGlzdGluZ0NoaWxkcmVuW2V4aXN0aW5nSWR4XSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEFwcGVuZCBhdCB0aGUgZW5kXG4gICAgICAgICAgICBpdGVtc0NvbnRhaW5lci5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbmV3SWR4Kys7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVxdWVzdCBtaXNzaW5nIGl0ZW1zXG4gICAgICBpZiAoXG4gICAgICAgIG1pc3NpbmdJdGVtcy5sZW5ndGggPiAwICYmXG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydD8uY29sbGVjdGlvbj8ubG9hZE1pc3NpbmdSYW5nZXNcbiAgICAgICkge1xuICAgICAgICBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5sb2FkTWlzc2luZ1JhbmdlcyhcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzdGFydDogTWF0aC5taW4oLi4ubWlzc2luZ0l0ZW1zKSxcbiAgICAgICAgICAgIGVuZDogTWF0aC5tYXgoLi4ubWlzc2luZ0l0ZW1zKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVuZGVyaW5nOm1pc3NpbmctaXRlbXNcIixcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudFZpc2libGVSYW5nZSA9IHZpc2libGVSYW5nZTtcblxuICAgICAgLy8gRW1pdCBpdGVtcyByZW5kZXJlZCBldmVudCB3aXRoIGVsZW1lbnRzIGZvciBzaXplIGNhbGN1bGF0aW9uXG4gICAgICBjb25zdCByZW5kZXJlZEVsZW1lbnRzQXJyYXkgPSBBcnJheS5mcm9tKHJlbmRlcmVkRWxlbWVudHMudmFsdWVzKCkpO1xuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0Oml0ZW1zLXJlbmRlcmVkXCIsIHtcbiAgICAgICAgZWxlbWVudHM6IHJlbmRlcmVkRWxlbWVudHNBcnJheSxcbiAgICAgICAgcmFuZ2U6IHZpc2libGVSYW5nZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6cmVuZGVyZWRcIiwge1xuICAgICAgICByYW5nZTogdmlzaWJsZVJhbmdlLFxuICAgICAgICByZW5kZXJlZENvdW50OiByZW5kZXJlZEVsZW1lbnRzLnNpemUsXG4gICAgICB9KTtcbiAgICAgIHVwZGF0ZUl0ZW1Qb3NpdGlvbnMoKTtcblxuICAgICAgLy8gTG9hZCBkYXRhIGlmIG5vIGl0ZW1zIHJlbmRlcmVkXG4gICAgICBpZiAoXG4gICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2l6ZSA9PT0gMCAmJlxuICAgICAgICB0b3RhbEl0ZW1zID4gMCAmJlxuICAgICAgICBjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb25cbiAgICAgICkge1xuICAgICAgICBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5sb2FkTWlzc2luZ1JhbmdlcyhcbiAgICAgICAgICB2aXNpYmxlUmFuZ2UsXG4gICAgICAgICAgXCJyZW5kZXJpbmc6bm8taXRlbXNcIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gRXh0ZW5kIHZpZXdwb3J0IEFQSVxuICAgIGNvbnN0IG9yaWdpbmFsUmVuZGVySXRlbXMgPSBjb21wb25lbnQudmlld3BvcnQucmVuZGVySXRlbXM7XG4gICAgY29tcG9uZW50LnZpZXdwb3J0LnJlbmRlckl0ZW1zID0gKCkgPT4ge1xuICAgICAgcmVuZGVySXRlbXMoKTtcbiAgICAgIG9yaWdpbmFsUmVuZGVySXRlbXM/LigpO1xuICAgIH07XG5cbiAgICAvLyBDbGVhbnVwXG4gICAgd3JhcERlc3Ryb3koY29tcG9uZW50LCAoKSA9PiB7XG4gICAgICAvLyBSZWxlYXNlIGFsbCByZW5kZXJlZCBlbGVtZW50cyAtIHVzZSByZWxlYXNlRWxlbWVudCB0byBwcm9wZXJseSBkZXN0cm95IGxheW91dFJlc3VsdHNcbiAgICAgIHJlbmRlcmVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICByZWxlYXNlRWxlbWVudChlbGVtZW50KTtcbiAgICAgIH0pO1xuICAgICAgcmVuZGVyZWRFbGVtZW50cy5jbGVhcigpO1xuXG4gICAgICAvLyBDbGVhciBlbGVtZW50IHBvb2xcbiAgICAgIGVsZW1lbnRQb29sLmxlbmd0aCA9IDA7XG5cbiAgICAgIC8vIENsZWFyIGNvbGxlY3Rpb24gaXRlbXMgY2FjaGUgLSB0aGlzIGlzIGNyaXRpY2FsIGZvciBtZW1vcnkhXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBjb2xsZWN0aW9uSXRlbXMpIHtcbiAgICAgICAgZGVsZXRlIGNvbGxlY3Rpb25JdGVtc1trZXldO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXNldCBzdGF0ZVxuICAgICAgY3VycmVudFZpc2libGVSYW5nZSA9IHsgc3RhcnQ6IC0xLCBlbmQ6IC0xIH07XG4gICAgICB2aWV3cG9ydFN0YXRlID0gbnVsbDtcbiAgICAgIGxhc3RSZW5kZXJUaW1lID0gMDtcblxuICAgICAgLy8gUmVzZXQgcG9vbCBzdGF0c1xuICAgICAgcG9vbFN0YXRzLmNyZWF0ZWQgPSAwO1xuICAgICAgcG9vbFN0YXRzLnJlY3ljbGVkID0gMDtcbiAgICAgIHBvb2xTdGF0cy5wb29sU2l6ZSA9IDA7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9O1xufTtcbiIsCiAgICAiLy8gc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvZXZlbnRzLnRzXG5cbi8qKlxuICogRXZlbnRzIEZlYXR1cmUgLSBDZW50cmFsaXplZCBldmVudCBzeXN0ZW0gZm9yIHZpZXdwb3J0XG4gKiBQcm92aWRlcyBldmVudCBlbWlzc2lvbiBhbmQgc3Vic2NyaXB0aW9uIGZvciBpbnRlci1mZWF0dXJlIGNvbW11bmljYXRpb25cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBFdmVudHNDb25maWcge1xuICBkZWJ1Zz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRXZlbnRzIGZlYXR1cmUgZm9yIHZpZXdwb3J0XG4gKiBDZW50cmFsaXplcyBhbGwgZXZlbnQgaGFuZGxpbmcgZm9yIHZpZXdwb3J0IGZlYXR1cmVzXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoRXZlbnRzID0gKGNvbmZpZzogRXZlbnRzQ29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KGNvbXBvbmVudDogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHsgZGVidWcgPSBmYWxzZSB9ID0gY29uZmlnO1xuXG4gICAgLy8gRXZlbnQgbGlzdGVuZXJzIG1hcFxuICAgIGNvbnN0IGxpc3RlbmVycyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8RnVuY3Rpb24+PigpO1xuXG4gICAgLy8gRW1pdCBhbiBldmVudFxuICAgIGNvbnN0IGVtaXQgPSAoZXZlbnQ6IHN0cmluZywgZGF0YT86IGFueSkgPT4ge1xuICAgICAgLy8gaWYgKGRlYnVnKSB7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKGBbRXZlbnRzXSBFbWl0OiAke2V2ZW50fWAsIGRhdGEpO1xuICAgICAgLy8gfVxuXG4gICAgICBjb25zdCBldmVudExpc3RlbmVycyA9IGxpc3RlbmVycy5nZXQoZXZlbnQpO1xuICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzKSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxpc3RlbmVyKGRhdGEpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBbRXZlbnRzXSBFcnJvciBpbiBsaXN0ZW5lciBmb3IgJHtldmVudH06YCwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFN1YnNjcmliZSB0byBhbiBldmVudFxuICAgIGNvbnN0IG9uID0gKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKTogKCgpID0+IHZvaWQpID0+IHtcbiAgICAgIGlmICghbGlzdGVuZXJzLmhhcyhldmVudCkpIHtcbiAgICAgICAgbGlzdGVuZXJzLnNldChldmVudCwgbmV3IFNldCgpKTtcbiAgICAgIH1cblxuICAgICAgbGlzdGVuZXJzLmdldChldmVudCkhLmFkZChoYW5kbGVyKTtcblxuICAgICAgLy8gaWYgKGRlYnVnKSB7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKGBbRXZlbnRzXSBTdWJzY3JpYmVkIHRvOiAke2V2ZW50fWApO1xuICAgICAgLy8gfVxuXG4gICAgICAvLyBSZXR1cm4gdW5zdWJzY3JpYmUgZnVuY3Rpb25cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzID0gbGlzdGVuZXJzLmdldChldmVudCk7XG4gICAgICAgIGlmIChldmVudExpc3RlbmVycykge1xuICAgICAgICAgIGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgICBpZiAoZXZlbnRMaXN0ZW5lcnMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG5cbiAgICAvLyBTdWJzY3JpYmUgdG8gYW4gZXZlbnQgb25jZVxuICAgIGNvbnN0IG9uY2UgPSAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb24pOiAoKCkgPT4gdm9pZCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlZEhhbmRsZXIgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGhhbmRsZXIoZGF0YSk7XG4gICAgICAgIG9mZihldmVudCwgd3JhcHBlZEhhbmRsZXIpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBvbihldmVudCwgd3JhcHBlZEhhbmRsZXIpO1xuICAgIH07XG5cbiAgICAvLyBVbnN1YnNjcmliZSBmcm9tIGFuIGV2ZW50XG4gICAgY29uc3Qgb2ZmID0gKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICBjb25zdCBldmVudExpc3RlbmVycyA9IGxpc3RlbmVycy5nZXQoZXZlbnQpO1xuICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzKSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzLnNpemUgPT09IDApIHtcbiAgICAgICAgICBsaXN0ZW5lcnMuZGVsZXRlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBDbGVhciBhbGwgbGlzdGVuZXJzIGZvciBhbiBldmVudFxuICAgIGNvbnN0IGNsZWFyID0gKGV2ZW50Pzogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShldmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaXN0ZW5lcnMuY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQWRkIGV2ZW50IG1ldGhvZHMgdG8gY29tcG9uZW50XG4gICAgY29tcG9uZW50LmVtaXQgPSBlbWl0O1xuICAgIGNvbXBvbmVudC5vbiA9IG9uO1xuICAgIGNvbXBvbmVudC5vbmNlID0gb25jZTtcbiAgICBjb21wb25lbnQub2ZmID0gb2ZmO1xuXG4gICAgLy8gQWRkIGV2ZW50cyBBUEkgdG8gdmlld3BvcnRcbiAgICAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuZXZlbnRzID0ge1xuICAgICAgZW1pdCxcbiAgICAgIG9uLFxuICAgICAgb25jZSxcbiAgICAgIG9mZixcbiAgICAgIGNsZWFyLFxuICAgICAgZ2V0TGlzdGVuZXJDb3VudDogKGV2ZW50Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgIHJldHVybiBsaXN0ZW5lcnMuZ2V0KGV2ZW50KT8uc2l6ZSB8fCAwO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0b3RhbCA9IDA7XG4gICAgICAgIGxpc3RlbmVycy5mb3JFYWNoKChzZXQpID0+ICh0b3RhbCArPSBzZXQuc2l6ZSkpO1xuICAgICAgICByZXR1cm4gdG90YWw7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBDbGVhbiB1cCBvbiBkZXN0cm95XG4gICAgaWYgKFwiZGVzdHJveVwiIGluIGNvbXBvbmVudCAmJiB0eXBlb2YgY29tcG9uZW50LmRlc3Ryb3kgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmRlc3Ryb3k7XG4gICAgICBjb21wb25lbnQuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgY2xlYXIoKTtcbiAgICAgICAgb3JpZ2luYWxEZXN0cm95Py4oKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL3ZsaXN0L3ZsaXN0LnRzXG5cbi8qKlxuICogVkxpc3QgQ29tcG9uZW50IC0gVmlydHVhbCBMaXN0IHdpdGggZGlyZWN0IHZpZXdwb3J0IGludGVncmF0aW9uXG4gKlxuICogQSBzaW1wbGlmaWVkIHZpcnR1YWwgbGlzdCB0aGF0IHVzZXMgdGhlIHZpZXdwb3J0IGZlYXR1cmUgZGlyZWN0bHlcbiAqIHdpdGhvdXQgdGhlIGxpc3QtbWFuYWdlciBhYnN0cmFjdGlvbiBsYXllci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZMaXN0Q29uZmlnLCBWTGlzdENvbXBvbmVudCwgVkxpc3RJdGVtIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLy8gSW1wb3J0IG10cmwgY29tcG9zZSBzeXN0ZW1cbmltcG9ydCB7IHBpcGUgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgY3JlYXRlQmFzZSwgd2l0aEVsZW1lbnQgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgd2l0aEV2ZW50cywgd2l0aExpZmVjeWNsZSB9IGZyb20gXCJtdHJsXCI7XG5cbi8vIEltcG9ydCB2aWV3cG9ydCBmZWF0dXJlXG5pbXBvcnQgeyB3aXRoVmlld3BvcnQgfSBmcm9tIFwiLi9mZWF0dXJlcy92aWV3cG9ydFwiO1xuaW1wb3J0IHsgd2l0aEFQSSB9IGZyb20gXCIuL2ZlYXR1cmVzL2FwaVwiO1xuaW1wb3J0IHsgd2l0aFNlbGVjdGlvbiB9IGZyb20gXCIuL2ZlYXR1cmVzL3NlbGVjdGlvblwiO1xuaW1wb3J0IHsgd2l0aEtleWJvYXJkIH0gZnJvbSBcIi4vZmVhdHVyZXMva2V5Ym9hcmRcIjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFZMaXN0IGNvbXBvbmVudCB1c2luZyBkaXJlY3Qgdmlld3BvcnQgaW50ZWdyYXRpb25cbiAqXG4gKiBAcGFyYW0ge1ZMaXN0Q29uZmlnfSBjb25maWcgLSBMaXN0IGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHJldHVybnMge1ZMaXN0Q29tcG9uZW50fSBBIGZ1bGx5IGNvbmZpZ3VyZWQgdmlydHVhbCBsaXN0IGNvbXBvbmVudFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCB2bGlzdCA9IGNyZWF0ZVZMaXN0KHtcbiAqICAgY29udGFpbmVyOiAnI215LWxpc3QnLFxuICogICBjb2xsZWN0aW9uOiBteUFkYXB0ZXIsXG4gKiAgIHJhbmdlU2l6ZTogMjAsXG4gKiAgIHBhZ2luYXRpb25TdHJhdGVneTogJ3BhZ2UnLFxuICogICB0ZW1wbGF0ZTogKGl0ZW0sIGluZGV4KSA9PiBbXG4gKiAgICAgeyBjbGFzczogJ3ZpZXdwb3J0LWl0ZW0nLCBhdHRyaWJ1dGVzOiB7ICdkYXRhLWlkJzogaXRlbS5pZCB9fSxcbiAqICAgICBbeyBjbGFzczogJ3ZpZXdwb3J0LWl0ZW1fX25hbWUnLCB0ZXh0OiBpdGVtLm5hbWUgfV0sXG4gKiAgICAgW3sgY2xhc3M6ICd2aWV3cG9ydC1pdGVtX192YWx1ZScsIHRleHQ6IGl0ZW0udmFsdWUgfV1cbiAqICAgXVxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVZMaXN0ID0gPFQgZXh0ZW5kcyBWTGlzdEl0ZW0gPSBWTGlzdEl0ZW0+KFxuICBjb25maWc6IFZMaXN0Q29uZmlnPFQ+ID0ge30sXG4pOiBWTGlzdENvbXBvbmVudDxUPiA9PiB7XG4gIHRyeSB7XG4gICAgLy8gY29uc29sZS5sb2coYPCfk4sgQ3JlYXRpbmcgVkxpc3QgY29tcG9uZW50IHdpdGggZGlyZWN0IHZpZXdwb3J0IGludGVncmF0aW9uYCk7XG5cbiAgICAvLyBOb3RlOiBUcmFuc2Zvcm0gc2hvdWxkIGJlIGFwcGxpZWQgYnkgdGhlIGNvbGxlY3Rpb24gZmVhdHVyZSBpbiB2aWV3cG9ydFxuICAgIC8vIFZMaXN0IHNob3VsZCBub3QgaW50ZXJjZXB0IGNvbGxlY3Rpb24gcmVhZHMgYXMgaXQgYnlwYXNzZXMgdGhlIGxvYWRpbmcgbWFuYWdlclxuXG4gICAgLy8gQ3JlYXRlIHRoZSBjb21wb25lbnQgdGhyb3VnaCBmdW5jdGlvbmFsIGNvbXBvc2l0aW9uXG4gICAgY29uc3QgZW5oYW5jZXJzID0gW1xuICAgICAgLy8gMS4gRm91bmRhdGlvbiBsYXllclxuICAgICAgY3JlYXRlQmFzZSxcbiAgICAgIHdpdGhFdmVudHMoKSxcbiAgICAgIHdpdGhFbGVtZW50KHtcbiAgICAgICAgdGFnOiBcImRpdlwiLFxuICAgICAgICBjbGFzc05hbWU6IGNvbmZpZy5jbGFzc05hbWUgfHwgXCJtdHJsLXZsaXN0XCIsXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICByb2xlOiBcImxpc3RcIixcbiAgICAgICAgICBcImFyaWEtbGFiZWxcIjogY29uZmlnLmFyaWFMYWJlbCB8fCBcIlZpcnR1YWwgTGlzdFwiLFxuICAgICAgICB9LFxuICAgICAgfSksXG5cbiAgICAgIC8vIDIuIFZpZXdwb3J0IGludGVncmF0aW9uXG4gICAgICAvLyBQYXNzIGF1dG9TZWxlY3RGaXJzdCBmcm9tIHNlbGVjdGlvbiBjb25maWcgdG8gdmlld3BvcnQgbGV2ZWxcbiAgICAgIHdpdGhWaWV3cG9ydCh7XG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgYXV0b1NlbGVjdEZpcnN0OiBjb25maWcuc2VsZWN0aW9uPy5hdXRvU2VsZWN0Rmlyc3QsXG4gICAgICB9KSxcblxuICAgICAgLy8gMy4gQ29tcG9uZW50IGxpZmVjeWNsZVxuICAgICAgd2l0aExpZmVjeWNsZSgpLFxuXG4gICAgICAvLyA0LiBQdWJsaWMgQVBJIGxheWVyXG4gICAgICB3aXRoQVBJKGNvbmZpZyksXG4gICAgXTtcblxuICAgIC8vIDQuNS4gU2VsZWN0aW9uIGNhcGFiaWxpdGllcyAoaWYgZW5hYmxlZCkgLSBtdXN0IGJlIGFmdGVyIEFQSVxuICAgIGlmIChjb25maWcuc2VsZWN0aW9uPy5lbmFibGVkKSB7XG4gICAgICBlbmhhbmNlcnMucHVzaCh3aXRoU2VsZWN0aW9uKGNvbmZpZykpO1xuICAgIH1cblxuICAgIC8vIDUuIEtleWJvYXJkIG5hdmlnYXRpb24gKGlmIHNlbGVjdGlvbiBlbmFibGVkIG9yIGV4cGxpY2l0bHkgY29uZmlndXJlZClcbiAgICBpZiAoY29uZmlnLnNlbGVjdGlvbj8uZW5hYmxlZCB8fCBjb25maWcua2V5Ym9hcmQ/LmVuYWJsZWQpIHtcbiAgICAgIGVuaGFuY2Vycy5wdXNoKHdpdGhLZXlib2FyZChjb25maWcpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wb25lbnQgPSBwaXBlKC4uLmVuaGFuY2Vycykoe1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgY29tcG9uZW50TmFtZTogXCJ2bGlzdFwiLFxuICAgICAgcHJlZml4OiBjb25maWcucHJlZml4IHx8IFwibXRybFwiLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudCBhcyBWTGlzdENvbXBvbmVudDxUPjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwi4p2MIFtWTElTVF0gRmFpbGVkIHRvIGNyZWF0ZSBWTGlzdCBjb21wb25lbnQ6XCIsIGVycm9yKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvdmxpc3QvZmVhdHVyZXMvdmlld3BvcnQudHNcblxuLyoqXG4gKiBWaWV3cG9ydCBmZWF0dXJlIGZvciBWTGlzdFxuICogSW50ZWdyYXRlcyB0aGUgY29yZSB2aWV3cG9ydCBmdW5jdGlvbmFsaXR5IHdpdGggVkxpc3QgY29tcG9uZW50XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWTGlzdENvbmZpZywgVkxpc3RJdGVtIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBjcmVhdGVWaWV3cG9ydCB9IGZyb20gXCIuLi8uLi8uLi9jb3JlL3ZpZXdwb3J0XCI7XG5cbi8qKlxuICogQWRkcyB2aWV3cG9ydCBmdW5jdGlvbmFsaXR5IHRvIFZMaXN0XG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoVmlld3BvcnQgPSA8VCBleHRlbmRzIFZMaXN0SXRlbSA9IFZMaXN0SXRlbT4oXG4gIGNvbmZpZzogVkxpc3RDb25maWc8VD4sXG4pID0+IHtcbiAgcmV0dXJuIChjb21wb25lbnQ6IGFueSkgPT4ge1xuICAgIC8vIFNldCBpbml0aWFsIGl0ZW1zIGlmIHByb3ZpZGVkXG4gICAgaWYgKGNvbmZpZy5pdGVtcykge1xuICAgICAgY29tcG9uZW50Lml0ZW1zID0gY29uZmlnLml0ZW1zO1xuICAgICAgY29tcG9uZW50LnRvdGFsSXRlbXMgPSBjb25maWcuaXRlbXMubGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIFNldCB0ZW1wbGF0ZSBpZiBwcm92aWRlZFxuICAgIGlmIChjb25maWcudGVtcGxhdGUpIHtcbiAgICAgIGNvbXBvbmVudC50ZW1wbGF0ZSA9IGNvbmZpZy50ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgdGhlIGVsZW1lbnQgaGFzIGJvdGggdmxpc3QgYW5kIHZpZXdwb3J0IGNsYXNzZXNcbiAgICBjb25zdCB2aWV3cG9ydENvbmZpZyA9IHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIGNsYXNzTmFtZTogXCJtdHJsLXZpZXdwb3J0XCIsIC8vIFRoaXMgd2lsbCBiZSBhZGRlZCBieSB2aWV3cG9ydCBiYXNlIGZlYXR1cmVcbiAgICB9O1xuXG4gICAgLy8gUGFzcyBWTGlzdCBjb25maWcgZGlyZWN0bHkgdG8gdmlld3BvcnRcbiAgICBjb25zdCB2aWV3cG9ydEVuaGFuY2VkID0gY3JlYXRlVmlld3BvcnQodmlld3BvcnRDb25maWcgYXMgYW55KShjb21wb25lbnQpO1xuXG4gICAgLy8gSGFuZGxlIHBhcmVudCBlbGVtZW50IGlmIHByb3ZpZGVkXG4gICAgaWYgKGNvbmZpZy5wYXJlbnQgfHwgY29uZmlnLmNvbnRhaW5lcikge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gY29uZmlnLnBhcmVudCB8fCBjb25maWcuY29udGFpbmVyO1xuICAgICAgY29uc3QgZWxlbWVudCA9XG4gICAgICAgIHR5cGVvZiBjb250YWluZXIgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY29udGFpbmVyKVxuICAgICAgICAgIDogY29udGFpbmVyO1xuXG4gICAgICBpZiAoZWxlbWVudCAmJiB2aWV3cG9ydEVuaGFuY2VkLmVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZCh2aWV3cG9ydEVuaGFuY2VkLmVsZW1lbnQpO1xuXG4gICAgICAgIC8vIEVuc3VyZSB2aWV3cG9ydCBpcyBpbml0aWFsaXplZCBhZnRlciBET00gYXR0YWNobWVudFxuICAgICAgICBpZiAodmlld3BvcnRFbmhhbmNlZC52aWV3cG9ydCAmJiB2aWV3cG9ydEVuaGFuY2VkLnZpZXdwb3J0LmluaXRpYWxpemUpIHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIvCfk4sgW1ZMaXN0XSBJbml0aWFsaXppbmcgdmlld3BvcnQgYWZ0ZXIgRE9NIGF0dGFjaG1lbnRcIik7XG4gICAgICAgICAgdmlld3BvcnRFbmhhbmNlZC52aWV3cG9ydC5pbml0aWFsaXplKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmlld3BvcnRFbmhhbmNlZDtcbiAgfTtcbn07XG4iLAogICAgIi8qKlxuICogQVBJIGZlYXR1cmUgZm9yIFZMaXN0XG4gKiBQcm92aWRlcyBhIGNsZWFuIHB1YmxpYyBBUEkgZm9yIHRoZSBWTGlzdCBjb21wb25lbnRcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZMaXN0Q29uZmlnLCBWTGlzdEl0ZW0sIFJlbW92ZUl0ZW1PcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8vIFJlLWV4cG9ydCBmb3IgY29udmVuaWVuY2VcbmV4cG9ydCB0eXBlIHsgUmVtb3ZlSXRlbU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IHdpdGhBUEkgPSA8VCBleHRlbmRzIFZMaXN0SXRlbSA9IFZMaXN0SXRlbT4oXG4gIGNvbmZpZzogVkxpc3RDb25maWc8VD4sXG4pID0+IHtcbiAgcmV0dXJuIChjb21wb25lbnQ6IGFueSkgPT4ge1xuICAgIC8vIEluaXRpYWxpemUgdmlld3BvcnQgb24gY3JlYXRpb25cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQgJiYgY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemUpIHtcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemUoKTtcbiAgICAgIH1cbiAgICB9LCAwKTtcblxuICAgIC8vIFRyYWNrIGxvYWRpbmcgc3RhdGVcbiAgICBsZXQgaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgbGV0IHNlbGVjdGVkSWRzID0gbmV3IFNldDxzdHJpbmcgfCBudW1iZXI+KCk7XG5cbiAgICAvLyBUcmFjayBwZW5kaW5nIHJlbW92YWxzIHRvIGZpbHRlciBvdXQgaXRlbXMgZnJvbSBzdGFsZSBzZXJ2ZXIgcmVzcG9uc2VzXG4gICAgLy8gVGhpcyBwcmV2ZW50cyByYWNlIGNvbmRpdGlvbnMgd2hlcmUgc2VydmVyIHJldHVybnMgb2xkIGRhdGEgYmVmb3JlIHVwZGF0ZXMgYXJlIGNvbW1pdHRlZFxuICAgIGNvbnN0IHBlbmRpbmdSZW1vdmFscyA9IG5ldyBTZXQ8c3RyaW5nIHwgbnVtYmVyPigpO1xuXG4gICAgLy8gTGlzdGVuIGZvciBjb2xsZWN0aW9uIGV2ZW50c1xuICAgIGNvbXBvbmVudC5vbj8uKFwiY29sbGVjdGlvbjpyYW5nZS1sb2FkZWRcIiwgKCkgPT4ge1xuICAgICAgaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgfSk7XG4gICAgY29tcG9uZW50Lm9uPy4oXCJjb2xsZWN0aW9uOnJhbmdlLWZhaWxlZFwiLCAoKSA9PiB7XG4gICAgICBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG5cbiAgICAgIC8vIERhdGEgb3BlcmF0aW9uc1xuICAgICAgc2V0SXRlbXMoaXRlbXM6IFRbXSkge1xuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uKSB7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uc2V0SXRlbXMoaXRlbXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbXBvbmVudC5pdGVtcyA9IGl0ZW1zO1xuICAgICAgICAgIGNvbXBvbmVudC50b3RhbEl0ZW1zID0gaXRlbXMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtczpzZXRcIiwgeyBpdGVtcywgdG90YWw6IGl0ZW1zLmxlbmd0aCB9KTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQWRkIGl0ZW1zIHRvIHRoZSBjb2xsZWN0aW9uIGF0IHRoZSBzdGFydCBvciBlbmRcbiAgICAgICAqIFVwZGF0ZXMgdG90YWxJdGVtcyBhbmQgdHJpZ2dlcnMgcmUtcmVuZGVyIG9mIHZpc2libGUgaXRlbXNcbiAgICAgICAqIEBwYXJhbSBuZXdJdGVtcyAtIEFycmF5IG9mIGl0ZW1zIHRvIGFkZFxuICAgICAgICogQHBhcmFtIHBvc2l0aW9uIC0gV2hlcmUgdG8gYWRkIGl0ZW1zOiBcInN0YXJ0XCIgKGRlZmF1bHQpIG9yIFwiZW5kXCJcbiAgICAgICAqL1xuICAgICAgYWRkSXRlbXMobmV3SXRlbXM6IFRbXSwgcG9zaXRpb246IFwic3RhcnRcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFuZXdJdGVtcyB8fCBuZXdJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXCJbVkxpc3RdIGFkZEl0ZW1zOiBubyBpdGVtcyBwcm92aWRlZFwiKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb247XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcblxuICAgICAgICAvLyBBZGQgaXRlbXMgdG8gdGhlIGNvbGxlY3Rpb24gaXRlbXMgYXJyYXlcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24/Lml0ZW1zKSB7XG4gICAgICAgICAgaWYgKHBvc2l0aW9uID09PSBcInN0YXJ0XCIpIHtcbiAgICAgICAgICAgIC8vIFByZXBlbmQgaXRlbXMgKG5ld2VzdCBmaXJzdClcbiAgICAgICAgICAgIGNvbGxlY3Rpb24uaXRlbXMudW5zaGlmdCguLi5uZXdJdGVtcyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEFwcGVuZCBpdGVtc1xuICAgICAgICAgICAgY29sbGVjdGlvbi5pdGVtcy5wdXNoKC4uLm5ld0l0ZW1zKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IGV2ZW50IEZJUlNUIHNvIHJlbmRlcmluZyBmZWF0dXJlIGNhbiByZWJ1aWxkIGNvbGxlY3Rpb25JdGVtc1xuICAgICAgICAvLyBCRUZPUkUgc2V0VG90YWxJdGVtcyB0cmlnZ2VycyBhIHJlbmRlclxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiaXRlbXM6YWRkLXJlcXVlc3RcIiwge1xuICAgICAgICAgIGl0ZW1zOiBuZXdJdGVtcyxcbiAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICBwcmV2aW91c0NvdW50OiBjdXJyZW50SXRlbXMubGVuZ3RoLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBVcGRhdGUgdG90YWxJdGVtcyAtIHRoaXMgdHJpZ2dlcnMgdmlld3BvcnQ6dG90YWwtaXRlbXMtY2hhbmdlZCB3aGljaCBjYWxscyByZW5kZXJJdGVtc1xuICAgICAgICBjb25zdCBpdGVtc0FkZGVkID0gbmV3SXRlbXMubGVuZ3RoO1xuICAgICAgICBpZiAoY29sbGVjdGlvbj8uZ2V0VG90YWxJdGVtcyAmJiBjb2xsZWN0aW9uPy5zZXRUb3RhbEl0ZW1zKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFRvdGFsID0gY29sbGVjdGlvbi5nZXRUb3RhbEl0ZW1zKCk7XG4gICAgICAgICAgY29sbGVjdGlvbi5zZXRUb3RhbEl0ZW1zKGN1cnJlbnRUb3RhbCArIGl0ZW1zQWRkZWQpO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uY29sbGVjdGlvbj8uc2V0VG90YWxJdGVtcykge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRUb3RhbCA9IGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmdldFRvdGFsSXRlbXMoKTtcbiAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5zZXRUb3RhbEl0ZW1zKFxuICAgICAgICAgICAgY3VycmVudFRvdGFsICsgaXRlbXNBZGRlZCxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChjb21wb25lbnQudG90YWxJdGVtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb21wb25lbnQudG90YWxJdGVtcyA9IGNvbXBvbmVudC50b3RhbEl0ZW1zICsgaXRlbXNBZGRlZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IGNvbXBsZXRpb24gZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW1zOmFkZGVkXCIsIHtcbiAgICAgICAgICBpdGVtczogbmV3SXRlbXMsXG4gICAgICAgICAgcG9zaXRpb24sXG4gICAgICAgICAgdG90YWw6IHRoaXMuZ2V0SXRlbUNvdW50KCksXG4gICAgICAgIH0pO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBBZGQgYSBzaW5nbGUgaXRlbSB0byB0aGUgY29sbGVjdGlvbiBhdCB0aGUgc3RhcnQgb3IgZW5kXG4gICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdGhhdCB3cmFwcyBhZGRJdGVtcyBmb3Igc2luZ2xlIGl0ZW0gdXNlIGNhc2VcbiAgICAgICAqIEBwYXJhbSBpdGVtIC0gSXRlbSB0byBhZGRcbiAgICAgICAqIEBwYXJhbSBwb3NpdGlvbiAtIFdoZXJlIHRvIGFkZCBpdGVtOiBcInN0YXJ0XCIgKGRlZmF1bHQpIG9yIFwiZW5kXCJcbiAgICAgICAqL1xuICAgICAgYWRkSXRlbShpdGVtOiBULCBwb3NpdGlvbjogXCJzdGFydFwiIHwgXCJlbmRcIiA9IFwic3RhcnRcIik6IHZvaWQge1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXCJbVkxpc3RdIGFkZEl0ZW06IG5vIGl0ZW0gcHJvdmlkZWRcIik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkSXRlbXMoW2l0ZW1dLCBwb3NpdGlvbik7XG4gICAgICB9LFxuXG4gICAgICBnZXRJdGVtcygpOiBUW10ge1xuICAgICAgICAvLyBDb2xsZWN0aW9uIGlzIGFkZGVkIGRpcmVjdGx5IHRvIGNvbXBvbmVudCwgbm90IHRvIHZpZXdwb3J0LmNvbGxlY3Rpb25cbiAgICAgICAgaWYgKChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uPy5nZXRJdGVtcykge1xuICAgICAgICAgIHJldHVybiAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbi5nZXRJdGVtcygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuaXRlbXMgfHwgW107XG4gICAgICB9LFxuXG4gICAgICBnZXRWaXNpYmxlSXRlbXMoKTogVFtdIHtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBjb21wb25lbnQudmlld3BvcnQ/LmdldFZpc2libGVSYW5nZSgpIHx8IHtcbiAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICBlbmQ6IDAsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgICAgICByZXR1cm4gaXRlbXMuc2xpY2UocmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCk7XG4gICAgICB9LFxuXG4gICAgICBnZXRJdGVtQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uY29sbGVjdGlvbikge1xuICAgICAgICAgIHJldHVybiBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5nZXRUb3RhbEl0ZW1zKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC50b3RhbEl0ZW1zIHx8IGNvbXBvbmVudC5pdGVtcz8ubGVuZ3RoIHx8IDA7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBpdGVtIGF0IGEgc3BlY2lmaWMgaW5kZXhcbiAgICAgICAqIEBwYXJhbSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZXRyaWV2ZVxuICAgICAgICogQHJldHVybnMgVGhlIGl0ZW0gYXQgdGhlIGluZGV4LCBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kXG4gICAgICAgKi9cbiAgICAgIGdldEl0ZW0oaW5kZXg6IG51bWJlcik6IFQgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAoKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24/LmdldEl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24uZ2V0SXRlbShpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgICAgIHJldHVybiBpdGVtc1tpbmRleF07XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFVwZGF0ZSBpdGVtIGF0IGEgc3BlY2lmaWMgaW5kZXhcbiAgICAgICAqIEBwYXJhbSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byB1cGRhdGVcbiAgICAgICAqIEBwYXJhbSBpdGVtIC0gVGhlIG5ldyBpdGVtIGRhdGEgKGZ1bGwgcmVwbGFjZW1lbnQpXG4gICAgICAgKi9cbiAgICAgIHVwZGF0ZUl0ZW0oaW5kZXg6IG51bWJlciwgaXRlbTogVCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcblxuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW1ZMaXN0XSB1cGRhdGVJdGVtOiBpbmRleCAke2luZGV4fSBvdXQgb2YgYm91bmRzYCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJldmlvdXNJdGVtID0gaXRlbXNbaW5kZXhdO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBpbiBjb2xsZWN0aW9uIGl0ZW1zIGFycmF5XG4gICAgICAgIGlmICgoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbj8uaXRlbXMpIHtcbiAgICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbi5pdGVtc1tpbmRleF0gPSBpdGVtO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBldmVudCBmb3IgcmVuZGVyaW5nIGZlYXR1cmUgdG8gaGFuZGxlIERPTSB1cGRhdGVcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW06dXBkYXRlLXJlcXVlc3RcIiwge1xuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgcHJldmlvdXNJdGVtLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogVXBkYXRlIGl0ZW0gYnkgSURcbiAgICAgICAqIEZpbmRzIHRoZSBpdGVtIGluIHRoZSBjb2xsZWN0aW9uIGJ5IGl0cyBJRCBhbmQgdXBkYXRlcyBpdCB3aXRoIG5ldyBkYXRhXG4gICAgICAgKiBSZS1yZW5kZXJzIHRoZSBpdGVtIGlmIGN1cnJlbnRseSB2aXNpYmxlIGluIHRoZSB2aWV3cG9ydFxuICAgICAgICogQHBhcmFtIGlkIC0gVGhlIGl0ZW0gSUQgdG8gZmluZFxuICAgICAgICogQHBhcmFtIGRhdGEgLSBQYXJ0aWFsIGRhdGEgdG8gbWVyZ2Ugd2l0aCBleGlzdGluZyBpdGVtLCBvciBmdWxsIGl0ZW0gcmVwbGFjZW1lbnRcbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVXBkYXRlIG9wdGlvbnNcbiAgICAgICAqIEByZXR1cm5zIHRydWUgaWYgaXRlbSB3YXMgZm91bmQgYW5kIHVwZGF0ZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgICAgICovXG4gICAgICB1cGRhdGVJdGVtQnlJZChcbiAgICAgICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICAgICAgZGF0YTogUGFydGlhbDxUPixcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIC8qKiBJZiB0cnVlLCByZXBsYWNlIHRoZSBlbnRpcmUgaXRlbSBpbnN0ZWFkIG9mIG1lcmdpbmcgKGRlZmF1bHQ6IGZhbHNlKSAqL1xuICAgICAgICAgIHJlcGxhY2U/OiBib29sZWFuO1xuICAgICAgICAgIC8qKiBJZiB0cnVlLCByZS1yZW5kZXIgZXZlbiBpZiBub3QgdmlzaWJsZSAoZGVmYXVsdDogZmFsc2UpICovXG4gICAgICAgICAgZm9yY2VSZW5kZXI/OiBib29sZWFuO1xuICAgICAgICB9ID0ge30sXG4gICAgICApOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgeyByZXBsYWNlID0gZmFsc2UgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuXG4gICAgICAgIC8vIEZpbmQgdGhlIGl0ZW0gYnkgSUQgKGhhbmRsZSBzcGFyc2UgYXJyYXlzIGZyb20gcGFnaW5hdGlvbilcbiAgICAgICAgLy8gQ2hlY2sgYWxsIHBvc3NpYmxlIElEIGZpZWxkcyBzaW5jZSBpdGVtcyBtYXkgaGF2ZSBkaWZmZXJlbnQgSUQgc3RydWN0dXJlc1xuICAgICAgICBjb25zdCBpbmRleCA9IGl0ZW1zLmZpbmRJbmRleCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKCFpdGVtKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgLy8gQ2hlY2sgYWxsIHBvc3NpYmxlIElEIGZpZWxkcyAtIHVzZXJfaWQgaXMgaW1wb3J0YW50IGZvciBwcm9maWxlL2NvbnRhY3QgaXRlbXNcbiAgICAgICAgICBjb25zdCBpZHNUb0NoZWNrID0gW2l0ZW0uaWQsIGl0ZW0uX2lkLCBpdGVtLnVzZXJfaWRdLmZpbHRlcihcbiAgICAgICAgICAgICh2KSA9PiB2ICE9PSB1bmRlZmluZWQgJiYgdiAhPT0gbnVsbCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBpZHNUb0NoZWNrLnNvbWUoXG4gICAgICAgICAgICAoaXRlbUlkKSA9PiBpdGVtSWQgPT09IGlkIHx8IFN0cmluZyhpdGVtSWQpID09PSBTdHJpbmcoaWQpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtWTGlzdF0gdXBkYXRlSXRlbUJ5SWQ6IGl0ZW0gd2l0aCBpZCAke2lkfSBub3QgZm91bmRgKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmV2aW91c0l0ZW0gPSBpdGVtc1tpbmRleF07XG5cbiAgICAgICAgLy8gQ3JlYXRlIHVwZGF0ZWQgaXRlbSAtIGVpdGhlciByZXBsYWNlIGVudGlyZWx5IG9yIG1lcmdlXG4gICAgICAgIGxldCB1cGRhdGVkSXRlbTogVDtcbiAgICAgICAgaWYgKHJlcGxhY2UpIHtcbiAgICAgICAgICB1cGRhdGVkSXRlbSA9IHsgLi4uZGF0YSwgaWQ6IHByZXZpb3VzSXRlbS5pZCA/PyBpZCB9IGFzIFQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gT25seSBtZXJnZSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBhY3R1YWwgdmFsdWVzIChub3QgdW5kZWZpbmVkKVxuICAgICAgICAgIC8vIFRoaXMgcHJldmVudHMgcGFydGlhbCB1cGRhdGVzIGZyb20gb3ZlcndyaXRpbmcgZXhpc3RpbmcgZGF0YVxuICAgICAgICAgIHVwZGF0ZWRJdGVtID0geyAuLi5wcmV2aW91c0l0ZW0gfSBhcyBUO1xuICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAodXBkYXRlZEl0ZW0gYXMgYW55KVtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIGluIGNvbGxlY3Rpb24gaXRlbXMgYXJyYXlcbiAgICAgICAgaWYgKChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uPy5pdGVtcykge1xuICAgICAgICAgIChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uLml0ZW1zW2luZGV4XSA9IHVwZGF0ZWRJdGVtO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBldmVudCBmb3IgcmVuZGVyaW5nIGZlYXR1cmUgdG8gaGFuZGxlIERPTSB1cGRhdGVcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW06dXBkYXRlLXJlcXVlc3RcIiwge1xuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIGl0ZW06IHVwZGF0ZWRJdGVtLFxuICAgICAgICAgIHByZXZpb3VzSXRlbSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBpdGVtIGF0IGEgc3BlY2lmaWMgaW5kZXhcbiAgICAgICAqIFJlbW92ZXMgdGhlIGl0ZW0gZnJvbSB0aGUgY29sbGVjdGlvbiwgdXBkYXRlcyB0b3RhbEl0ZW1zLCBhbmQgdHJpZ2dlcnMgcmUtcmVuZGVyXG4gICAgICAgKiBAcGFyYW0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gcmVtb3ZlXG4gICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGl0ZW0gd2FzIGZvdW5kIGFuZCByZW1vdmVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgICAqL1xuICAgICAgcmVtb3ZlSXRlbShpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb247XG5cbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtWTGlzdF0gcmVtb3ZlSXRlbTogaW5kZXggJHtpbmRleH0gb3V0IG9mIGJvdW5kc2ApO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlbW92ZWRJdGVtID0gaXRlbXNbaW5kZXhdO1xuXG4gICAgICAgIC8vIFJlbW92ZSBmcm9tIGNvbGxlY3Rpb24gaXRlbXMgYXJyYXkgKGNvbXBvbmVudC5jb2xsZWN0aW9uLml0ZW1zIGlzIHRoZSBhY3R1YWwgYXJyYXkpXG4gICAgICAgIGlmICgoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbj8uaXRlbXMpIHtcbiAgICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbi5pdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSU1QT1JUQU5UOiBFbWl0IGl0ZW06cmVtb3ZlLXJlcXVlc3QgRklSU1Qgc28gcmVuZGVyaW5nIGZlYXR1cmUgcmVidWlsZHMgY29sbGVjdGlvbkl0ZW1zXG4gICAgICAgIC8vIEJFRk9SRSBzZXRUb3RhbEl0ZW1zIHRyaWdnZXJzIGEgcmVuZGVyIHZpYSB2aWV3cG9ydDp0b3RhbC1pdGVtcy1jaGFuZ2VkXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtOnJlbW92ZS1yZXF1ZXN0XCIsIHtcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBpdGVtOiByZW1vdmVkSXRlbSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHRvdGFsSXRlbXMgLSB0aGlzIHdpbGwgdHJpZ2dlciB2aWV3cG9ydDp0b3RhbC1pdGVtcy1jaGFuZ2VkIHdoaWNoIGNhbGxzIHJlbmRlckl0ZW1zXG4gICAgICAgIC8vIEJ5IG5vdywgY29sbGVjdGlvbkl0ZW1zIGhhcyBiZWVuIHJlYnVpbHQgYnkgdGhlIGl0ZW06cmVtb3ZlLXJlcXVlc3QgaGFuZGxlclxuICAgICAgICBpZiAoY29sbGVjdGlvbj8uZ2V0VG90YWxJdGVtcyAmJiBjb2xsZWN0aW9uPy5zZXRUb3RhbEl0ZW1zKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFRvdGFsID0gY29sbGVjdGlvbi5nZXRUb3RhbEl0ZW1zKCk7XG4gICAgICAgICAgY29sbGVjdGlvbi5zZXRUb3RhbEl0ZW1zKE1hdGgubWF4KDAsIGN1cnJlbnRUb3RhbCAtIDEpKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24/LnNldFRvdGFsSXRlbXMpIHtcbiAgICAgICAgICAvLyBGYWxsYmFjayB0byB2aWV3cG9ydC5jb2xsZWN0aW9uIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIGNvbnN0IGN1cnJlbnRUb3RhbCA9IGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmdldFRvdGFsSXRlbXMoKTtcbiAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5zZXRUb3RhbEl0ZW1zKFxuICAgICAgICAgICAgTWF0aC5tYXgoMCwgY3VycmVudFRvdGFsIC0gMSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBMYXN0IHJlc29ydDogdXBkYXRlIGNvbXBvbmVudC50b3RhbEl0ZW1zIGRpcmVjdGx5XG4gICAgICAgICAgaWYgKGNvbXBvbmVudC50b3RhbEl0ZW1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC50b3RhbEl0ZW1zID0gTWF0aC5tYXgoMCwgY29tcG9uZW50LnRvdGFsSXRlbXMgLSAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlIGl0ZW0gYnkgSURcbiAgICAgICAqIEZpbmRzIHRoZSBpdGVtIGluIHRoZSBjb2xsZWN0aW9uIGJ5IGl0cyBJRCBhbmQgcmVtb3ZlcyBpdFxuICAgICAgICogVXBkYXRlcyB0b3RhbEl0ZW1zIGFuZCB0cmlnZ2VycyByZS1yZW5kZXIgb2YgdmlzaWJsZSBpdGVtc1xuICAgICAgICogT3B0aW9uYWxseSB0cmFja3MgYXMgcGVuZGluZyByZW1vdmFsIHRvIGZpbHRlciBmcm9tIGZ1dHVyZSBmZXRjaGVzXG4gICAgICAgKiBAcGFyYW0gaWQgLSBUaGUgaXRlbSBJRCB0byBmaW5kIGFuZCByZW1vdmVcbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gUmVtb3ZlIG9wdGlvbnMgKHRyYWNrUGVuZGluZywgcGVuZGluZ1RpbWVvdXQpXG4gICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGl0ZW0gd2FzIGZvdW5kIGFuZCByZW1vdmVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgICAqL1xuICAgICAgcmVtb3ZlSXRlbUJ5SWQoXG4gICAgICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgICAgIG9wdGlvbnM6IFJlbW92ZUl0ZW1PcHRpb25zID0ge30sXG4gICAgICApOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgeyB0cmFja1BlbmRpbmcgPSB0cnVlLCBwZW5kaW5nVGltZW91dCA9IDUwMDAgfSA9IG9wdGlvbnM7XG5cbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtWTGlzdF0gcmVtb3ZlSXRlbUJ5SWQ6IGludmFsaWQgaWRgKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgdG8gcGVuZGluZyByZW1vdmFscyB0byBmaWx0ZXIgZnJvbSBmdXR1cmUgc2VydmVyIHJlc3BvbnNlc1xuICAgICAgICBpZiAodHJhY2tQZW5kaW5nKSB7XG4gICAgICAgICAgcGVuZGluZ1JlbW92YWxzLmFkZChpZCk7XG5cbiAgICAgICAgICAvLyBDbGVhciBmcm9tIHBlbmRpbmcgcmVtb3ZhbHMgYWZ0ZXIgdGltZW91dCAoc2VydmVyIHNob3VsZCBoYXZlIHVwZGF0ZWQgYnkgdGhlbilcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHBlbmRpbmdSZW1vdmFscy5kZWxldGUoaWQpO1xuICAgICAgICAgIH0sIHBlbmRpbmdUaW1lb3V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuXG4gICAgICAgIC8vIEZpbmQgdGhlIGl0ZW0gYnkgSUQgKGhhbmRsZSBzcGFyc2UgYXJyYXlzIGZyb20gcGFnaW5hdGlvbilcbiAgICAgICAgLy8gQ2hlY2sgYWxsIHBvc3NpYmxlIElEIGZpZWxkcyBzaW5jZSBpdGVtcyBtYXkgaGF2ZSBkaWZmZXJlbnQgSUQgc3RydWN0dXJlc1xuICAgICAgICBjb25zdCBpbmRleCA9IGl0ZW1zLmZpbmRJbmRleCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKCFpdGVtKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgLy8gQ2hlY2sgYWxsIHBvc3NpYmxlIElEIGZpZWxkc1xuICAgICAgICAgIGNvbnN0IGlkc1RvQ2hlY2sgPSBbaXRlbS5pZCwgaXRlbS5faWQsIGl0ZW0udXNlcl9pZF0uZmlsdGVyKFxuICAgICAgICAgICAgKHYpID0+IHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSBudWxsLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIGlkc1RvQ2hlY2suc29tZShcbiAgICAgICAgICAgIChpdGVtSWQpID0+IGl0ZW1JZCA9PT0gaWQgfHwgU3RyaW5nKGl0ZW1JZCkgPT09IFN0cmluZyhpZCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnJlbW92ZUl0ZW0oaW5kZXgpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDaGVjayBpZiBhbiBpdGVtIElEIGlzIHBlbmRpbmcgcmVtb3ZhbFxuICAgICAgICogQHBhcmFtIGlkIC0gVGhlIGl0ZW0gSUQgdG8gY2hlY2tcbiAgICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGl0ZW0gaXMgcGVuZGluZyByZW1vdmFsXG4gICAgICAgKi9cbiAgICAgIGlzUGVuZGluZ1JlbW92YWwoaWQ6IHN0cmluZyB8IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gcGVuZGluZ1JlbW92YWxzLmhhcyhpZCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBhbGwgcGVuZGluZyByZW1vdmFsIElEc1xuICAgICAgICogQHJldHVybnMgU2V0IG9mIHBlbmRpbmcgcmVtb3ZhbCBJRHNcbiAgICAgICAqL1xuICAgICAgZ2V0UGVuZGluZ1JlbW92YWxzKCk6IFNldDxzdHJpbmcgfCBudW1iZXI+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXQocGVuZGluZ1JlbW92YWxzKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2xlYXIgYSBzcGVjaWZpYyBwZW5kaW5nIHJlbW92YWxcbiAgICAgICAqIEBwYXJhbSBpZCAtIFRoZSBpdGVtIElEIHRvIGNsZWFyIGZyb20gcGVuZGluZyByZW1vdmFsc1xuICAgICAgICovXG4gICAgICBjbGVhclBlbmRpbmdSZW1vdmFsKGlkOiBzdHJpbmcgfCBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgcGVuZGluZ1JlbW92YWxzLmRlbGV0ZShpZCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENsZWFyIGFsbCBwZW5kaW5nIHJlbW92YWxzXG4gICAgICAgKi9cbiAgICAgIGNsZWFyQWxsUGVuZGluZ1JlbW92YWxzKCk6IHZvaWQge1xuICAgICAgICBwZW5kaW5nUmVtb3ZhbHMuY2xlYXIoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRmlsdGVyIGl0ZW1zIGFycmF5IHRvIGV4Y2x1ZGUgcGVuZGluZyByZW1vdmFsc1xuICAgICAgICogVXRpbGl0eSBtZXRob2QgZm9yIHVzZSBpbiBjb2xsZWN0aW9uIGFkYXB0ZXJzXG4gICAgICAgKiBAcGFyYW0gaXRlbXMgLSBBcnJheSBvZiBpdGVtcyB0byBmaWx0ZXJcbiAgICAgICAqIEByZXR1cm5zIEZpbHRlcmVkIGFycmF5IHdpdGhvdXQgcGVuZGluZyByZW1vdmFsIGl0ZW1zXG4gICAgICAgKi9cbiAgICAgIGZpbHRlclBlbmRpbmdSZW1vdmFsczxJIGV4dGVuZHMgeyBpZD86IGFueTsgX2lkPzogYW55IH0+KFxuICAgICAgICBpdGVtczogSVtdLFxuICAgICAgKTogSVtdIHtcbiAgICAgICAgaWYgKHBlbmRpbmdSZW1vdmFscy5zaXplID09PSAwKSByZXR1cm4gaXRlbXM7XG5cbiAgICAgICAgcmV0dXJuIGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkID0gaXRlbS5faWQgfHwgaXRlbS5pZDtcbiAgICAgICAgICByZXR1cm4gIXBlbmRpbmdSZW1vdmFscy5oYXMoaWQpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIExvYWRpbmcgb3BlcmF0aW9uc1xuICAgICAgYXN5bmMgbG9hZFJhbmdlKFxuICAgICAgICBwYWdlOiBudW1iZXIsXG4gICAgICAgIGxpbWl0OiBudW1iZXIsXG4gICAgICAgIHN0cmF0ZWd5OiBzdHJpbmcgPSBcInBhZ2VcIixcbiAgICAgICAgYWxpZ25tZW50Pzogc3RyaW5nLFxuICAgICAgKSB7XG4gICAgICAgIGlzTG9hZGluZyA9IHRydWU7XG5cbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uY29sbGVjdGlvbikge1xuICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHN0cmF0ZWd5ID09PSBcInBhZ2VcIiA/IChwYWdlIC0gMSkgKiBsaW1pdCA6IHBhZ2U7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmxvYWRSYW5nZShvZmZzZXQsIGxpbWl0KTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJsb2FkXCIsIHsgcGFnZSwgbGltaXQsIHN0cmF0ZWd5IH0pO1xuXG4gICAgICAgICAgICAvLyBTY3JvbGwgdG8gdGhlIGxvYWRlZCByYW5nZSBpZiBhbGlnbm1lbnQgaXMgc3BlY2lmaWVkXG4gICAgICAgICAgICBpZiAoYWxpZ25tZW50KSB7XG4gICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gb2Zmc2V0O1xuICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvSW5kZXgoaW5kZXgsIGFsaWdubWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJlcnJvclwiLCB7IGVycm9yIH0pO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLy8gRGF0YSBsb2FkaW5nXG4gICAgICBsb2FkTmV4dDogYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgW1ZMaXN0XSBsb2FkTmV4dCgpYCk7XG5cbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uY29sbGVjdGlvbikge1xuICAgICAgICAgIGNvbnN0IHRvdGFsSXRlbXMgPSBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5nZXRUb3RhbEl0ZW1zKCk7XG4gICAgICAgICAgY29uc3QgbG9hZGVkUmFuZ2VzID0gY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uZ2V0TG9hZGVkUmFuZ2VzKCk7XG5cbiAgICAgICAgICAvLyBGaW5kIHRoZSBuZXh0IHVubG9hZGVkIHJhbmdlXG4gICAgICAgICAgbGV0IG5leHRPZmZzZXQgPSAwO1xuICAgICAgICAgIGZvciAoY29uc3QgcmFuZ2VJZCBvZiBsb2FkZWRSYW5nZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlRW5kID0gKHJhbmdlSWQgKyAxKSAqIChjb25maWcucGFnaW5hdGlvbj8ubGltaXQgfHwgMjApO1xuICAgICAgICAgICAgaWYgKHJhbmdlRW5kID4gbmV4dE9mZnNldCkge1xuICAgICAgICAgICAgICBuZXh0T2Zmc2V0ID0gcmFuZ2VFbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG5leHRPZmZzZXQgPCB0b3RhbEl0ZW1zKSB7XG4gICAgICAgICAgICBhd2FpdCBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5sb2FkUmFuZ2UoXG4gICAgICAgICAgICAgIG5leHRPZmZzZXQsXG4gICAgICAgICAgICAgIGNvbmZpZy5wYWdpbmF0aW9uPy5saW1pdCB8fCAyMCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfSxcblxuICAgICAgaXNMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gaXNMb2FkaW5nO1xuICAgICAgfSxcblxuICAgICAgaGFzTmV4dCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uY29sbGVjdGlvbikge1xuICAgICAgICAgIGNvbnN0IHRvdGFsID0gY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uZ2V0VG90YWxJdGVtcygpO1xuICAgICAgICAgIGNvbnN0IGl0ZW1zID0gY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uZ2V0SXRlbXMoKTtcbiAgICAgICAgICByZXR1cm4gaXRlbXMubGVuZ3RoIDwgdG90YWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSxcblxuICAgICAgLy8gTm90ZTogU2VsZWN0aW9uIG9wZXJhdGlvbnMgYXJlIGhhbmRsZWQgYnkgdGhlIHdpdGhTZWxlY3Rpb24gZmVhdHVyZVxuICAgICAgLy8gVGhlc2UgYXJlIGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYnV0IGRlbGVnYXRlIHRvIHNlbGVjdGlvbiBmZWF0dXJlIGlmIGF2YWlsYWJsZVxuICAgICAgZ2V0U2VsZWN0ZWRJZHMoKTogKHN0cmluZyB8IG51bWJlcilbXSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LmdldFNlbGVjdGVkSW5kaWNlcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gVXNlIHNlbGVjdGlvbiBmZWF0dXJlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgICAgICAgIGNvbnN0IGluZGljZXMgPSBjb21wb25lbnQuZ2V0U2VsZWN0ZWRJbmRpY2VzKCk7XG4gICAgICAgICAgcmV0dXJuIGluZGljZXMubWFwKChpZHg6IG51bWJlcikgPT4gKGl0ZW1zW2lkeF0gYXMgYW55KT8uaWQgfHwgaWR4KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGYWxsYmFjayB0byBsb2NhbCB0cmFja2luZ1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShzZWxlY3RlZElkcyk7XG4gICAgICB9LFxuXG4gICAgICBzZWxlY3RJdGVtKGlkOiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQuc2VsZWN0SXRlbXMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIFVzZSBzZWxlY3Rpb24gZmVhdHVyZSBpZiBhdmFpbGFibGVcbiAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGl0ZW1zLmZpbmRJbmRleCgoaXRlbTogYW55KSA9PiBpdGVtLmlkID09PSBpZCk7XG4gICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5zZWxlY3RJdGVtcyhbaW5kZXhdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gbG9jYWwgdHJhY2tpbmdcbiAgICAgICAgICBzZWxlY3RlZElkcy5hZGQoaWQpO1xuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJzZWxlY3Rpb246Y2hhbmdlXCIsIHtcbiAgICAgICAgICAgIHNlbGVjdGVkOiB0aGlzLmdldFNlbGVjdGVkSWRzKCksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGRlc2VsZWN0SXRlbShpZDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LmRlc2VsZWN0SXRlbXMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIFVzZSBzZWxlY3Rpb24gZmVhdHVyZSBpZiBhdmFpbGFibGVcbiAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGl0ZW1zLmZpbmRJbmRleCgoaXRlbTogYW55KSA9PiBpdGVtLmlkID09PSBpZCk7XG4gICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5kZXNlbGVjdEl0ZW1zKFtpbmRleF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBsb2NhbCB0cmFja2luZ1xuICAgICAgICAgIHNlbGVjdGVkSWRzLmRlbGV0ZShpZCk7XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInNlbGVjdGlvbjpjaGFuZ2VcIiwge1xuICAgICAgICAgICAgc2VsZWN0ZWQ6IHRoaXMuZ2V0U2VsZWN0ZWRJZHMoKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgY2xlYXJTZWxlY3Rpb24oKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LmNsZWFyU2VsZWN0aW9uID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAvLyBVc2Ugc2VsZWN0aW9uIGZlYXR1cmUgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgY29tcG9uZW50LmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gbG9jYWwgdHJhY2tpbmdcbiAgICAgICAgICBzZWxlY3RlZElkcy5jbGVhcigpO1xuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJzZWxlY3Rpb246Y2hhbmdlXCIsIHsgc2VsZWN0ZWQ6IFtdIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvLyBTY3JvbGxpbmcgbWV0aG9kc1xuICAgICAgc2Nyb2xsVG9JbmRleDogKFxuICAgICAgICBpbmRleDogbnVtYmVyLFxuICAgICAgICBhbGlnbm1lbnQ6IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiID0gXCJzdGFydFwiLFxuICAgICAgICBhbmltYXRlPzogYm9vbGVhbixcbiAgICAgICkgPT4ge1xuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0KSB7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbFRvSW5kZXgoaW5kZXgsIGFsaWdubWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTY3JvbGwgdG8gaW5kZXggYW5kIHNlbGVjdCBpdGVtIGFmdGVyIGRhdGEgbG9hZHNcbiAgICAgICAqIFVzZWZ1bCBmb3IgcnVudGltZSBzY3JvbGwrc2VsZWN0IHdoZW4gVkxpc3QgaXMgYWxyZWFkeSBjcmVhdGVkXG4gICAgICAgKi9cbiAgICAgIHNjcm9sbFRvSW5kZXhBbmRTZWxlY3Q6IGFzeW5jIGZ1bmN0aW9uIChcbiAgICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgICAgc2VsZWN0SWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICAgICAgYWxpZ25tZW50OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiA9IFwic3RhcnRcIixcbiAgICAgICkge1xuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0KSB7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbFRvSW5kZXgoaW5kZXgsIGFsaWdubWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMaXN0ZW4gZm9yIHJhbmdlIGxvYWQgdG8gY29tcGxldGUsIHRoZW4gc2VsZWN0XG4gICAgICAgIGNvbnN0IG9uUmFuZ2VMb2FkZWQgPSAoKSA9PiB7XG4gICAgICAgICAgY29tcG9uZW50Lm9mZj8uKFwidmlld3BvcnQ6cmFuZ2UtbG9hZGVkXCIsIG9uUmFuZ2VMb2FkZWQpO1xuICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50LnNlbGVjdEJ5SWQpIHtcbiAgICAgICAgICAgICAgY29tcG9uZW50LnNlbGVjdEJ5SWQoc2VsZWN0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6cmFuZ2UtbG9hZGVkXCIsIG9uUmFuZ2VMb2FkZWQpO1xuXG4gICAgICAgIC8vIEZhbGxiYWNrIHRpbWVvdXQgaW4gY2FzZSBldmVudCBkb2Vzbid0IGZpcmUgKGRhdGEgYWxyZWFkeSBsb2FkZWQpXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbXBvbmVudC5vZmY/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCBvblJhbmdlTG9hZGVkKTtcbiAgICAgICAgICBpZiAoY29tcG9uZW50LnNlbGVjdEJ5SWQpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5zZWxlY3RCeUlkKHNlbGVjdElkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDMwMCk7XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfSxcblxuICAgICAgc2Nyb2xsVG9JdGVtOiBhc3luYyBmdW5jdGlvbiAoXG4gICAgICAgIGl0ZW1JZDogc3RyaW5nLFxuICAgICAgICBhbGlnbm1lbnQ6IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiID0gXCJzdGFydFwiLFxuICAgICAgICBhbmltYXRlPzogYm9vbGVhbixcbiAgICAgICkge1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBpdGVtcy5maW5kSW5kZXgoXG4gICAgICAgICAgKGl0ZW06IGFueSkgPT4gU3RyaW5nKGl0ZW0uaWQpID09PSBTdHJpbmcoaXRlbUlkKSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNjcm9sbFRvSW5kZXgoaW5kZXgsIGFsaWdubWVudCwgYW5pbWF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLndhcm4oYEl0ZW0gJHtpdGVtSWR9IG5vdCBmb3VuZGApO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB9LFxuXG4gICAgICBzY3JvbGxUb1RvcDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxUb0luZGV4KDAsIFwic3RhcnRcIik7XG4gICAgICB9LFxuXG4gICAgICBzY3JvbGxUb0JvdHRvbTogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0b3RhbEl0ZW1zID0gdGhpcy5nZXRJdGVtQ291bnQoKTtcbiAgICAgICAgaWYgKHRvdGFsSXRlbXMgPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsVG9JbmRleCh0b3RhbEl0ZW1zIC0gMSwgXCJlbmRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfSxcblxuICAgICAgc2Nyb2xsVG9QYWdlOiBhc3luYyBmdW5jdGlvbiAoXG4gICAgICAgIHBhZ2VOdW06IG51bWJlcixcbiAgICAgICAgYWxpZ25tZW50OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiA9IFwic3RhcnRcIixcbiAgICAgICAgYW5pbWF0ZT86IGJvb2xlYW4sXG4gICAgICApIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtWTGlzdF0gc2Nyb2xsVG9QYWdlKCR7cGFnZU51bX0pYCk7XG5cbiAgICAgICAgLy8gR2V0IGxpbWl0IGZyb20gY29uZmlnIChyYW5nZVNpemUpIG9yIGRlZmF1bHRcbiAgICAgICAgY29uc3QgbGltaXQgPSBjb25maWcucGFnaW5hdGlvbj8ubGltaXQgfHwgMjA7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgd2UncmUgaW4gY3Vyc29yIG1vZGVcbiAgICAgICAgaWYgKGNvbmZpZy5wYWdpbmF0aW9uPy5zdHJhdGVneSA9PT0gXCJjdXJzb3JcIikge1xuICAgICAgICAgIC8vIEluIGN1cnNvciBtb2RlLCB3ZSBuZWVkIHRvIGhhbmRsZSBzZXF1ZW50aWFsIGxvYWRpbmdcbiAgICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpPy5jb2xsZWN0aW9uO1xuICAgICAgICAgIGlmIChjb2xsZWN0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBsb2FkZWRSYW5nZXMgPSBjb2xsZWN0aW9uLmdldExvYWRlZFJhbmdlcygpO1xuICAgICAgICAgICAgY29uc3QgaGlnaGVzdExvYWRlZFBhZ2UgPSBsb2FkZWRSYW5nZXMuc2l6ZTtcblxuICAgICAgICAgICAgaWYgKHBhZ2VOdW0gPiBoaWdoZXN0TG9hZGVkUGFnZSArIDEpIHtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgIGBbVkxpc3RdIENhbm5vdCBqdW1wIHRvIHBhZ2UgJHtwYWdlTnVtfSBpbiBjdXJzb3IgbW9kZS4gYCArXG4gICAgICAgICAgICAgICAgICBgTG9hZGluZyBwYWdlcyBzZXF1ZW50aWFsbHkgZnJvbSAke1xuICAgICAgICAgICAgICAgICAgICBoaWdoZXN0TG9hZGVkUGFnZSArIDFcbiAgICAgICAgICAgICAgICAgIH0gdG8gJHtwYWdlTnVtfWAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXNlIHZpZXdwb3J0J3Mgc2Nyb2xsVG9QYWdlIGlmIGF2YWlsYWJsZVxuICAgICAgICBpZiAoKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpPy5zY3JvbGxUb1BhZ2UpIHtcbiAgICAgICAgICAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc2Nyb2xsVG9QYWdlKHBhZ2VOdW0sIGxpbWl0LCBhbGlnbm1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIHNjcm9sbFRvSW5kZXhcbiAgICAgICAgICBjb25zdCB0YXJnZXRJbmRleCA9IChwYWdlTnVtIC0gMSkgKiBsaW1pdDtcbiAgICAgICAgICBhd2FpdCB0aGlzLnNjcm9sbFRvSW5kZXgodGFyZ2V0SW5kZXgsIGFsaWdubWVudCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGdldFNjcm9sbFBvc2l0aW9uOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQudmlld3BvcnQ/LmdldFNjcm9sbFBvc2l0aW9uKCkgfHwgMDtcbiAgICAgIH0sXG5cbiAgICAgIGdldEN1cnJlbnRDdXJzb3I6ICgpID0+IHtcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KT8uY29sbGVjdGlvbjtcbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24/LmdldEN1cnJlbnRDdXJzb3I/LigpIHx8IG51bGw7XG4gICAgICB9LFxuXG4gICAgICBzZXRTY3JvbGxBbmltYXRpb24oZW5hYmxlZDogYm9vbGVhbikge1xuICAgICAgICAvLyBTdG9yZSBhbmltYXRpb24gcHJlZmVyZW5jZSAod291bGQgYmUgdXNlZCBieSB2aWV3cG9ydCBzY3JvbGxpbmcgZmVhdHVyZSlcbiAgICAgICAgY29tcG9uZW50LnNjcm9sbEFuaW1hdGlvbiA9IGVuYWJsZWQ7XG4gICAgICB9LFxuXG4gICAgICAvLyBTdGF0ZVxuICAgICAgZ2V0U3RhdGUoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXRlbXM6IHRoaXMuZ2V0SXRlbXMoKSxcbiAgICAgICAgICB0b3RhbEl0ZW1zOiBjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb25cbiAgICAgICAgICAgID8gY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uZ2V0VG90YWxJdGVtcygpXG4gICAgICAgICAgICA6IGNvbXBvbmVudC50b3RhbEl0ZW1zIHx8IDAsXG4gICAgICAgICAgdmlzaWJsZVJhbmdlOiBjb21wb25lbnQudmlld3BvcnQ/LmdldFZpc2libGVSYW5nZSgpIHx8IHtcbiAgICAgICAgICAgIHN0YXJ0OiAwLFxuICAgICAgICAgICAgZW5kOiAwLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb246IGNvbXBvbmVudC52aWV3cG9ydD8uZ2V0U2Nyb2xsUG9zaXRpb24oKSB8fCAwLFxuICAgICAgICAgIHNlbGVjdGVkSWRzOiB0aGlzLmdldFNlbGVjdGVkSWRzKCksXG4gICAgICAgICAgaXNMb2FkaW5nOiB0aGlzLmlzTG9hZGluZygpLFxuICAgICAgICB9O1xuICAgICAgfSxcblxuICAgICAgLy8gTGlmZWN5Y2xlXG4gICAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0Py5kZXN0cm95KSB7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICBzZWxlY3RlZElkcy5jbGVhcigpO1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiZGVzdHJveWVkXCIpO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xufTtcbiIsCiAgICAiLyoqXG4gKiBtdHJsLWFkZG9ucyBMaXN0IENvbXBvbmVudCBDb25zdGFudHNcbiAqXG4gKiBDb25zdGFudHMgZm9yIHRoZSBhZGRvbnMgbGlzdCBjb21wb25lbnQuXG4gKiBOb3RlOiBCYXNlIG10cmwgbGlzdCBmdW5jdGlvbmFsaXR5IGlzIGhhbmRsZWQgYnkgbXRybCBjb3JlLlxuICogVGhlc2UgY29uc3RhbnRzIGFyZSBmb3IgYWRkb25zLXNwZWNpZmljIGZlYXR1cmVzIG9ubHkuXG4gKi9cblxuLyoqXG4gKiBDU1MgY2xhc3MgbmFtZXMgZm9yIFZMaXN0IGNvbXBvbmVudFxuICogRm9sbG93aW5nIEJFTSBjb252ZW50aW9uOiBjb21wb25lbnRfX2VsZW1lbnQtLW1vZGlmaWVyXG4gKiBOb3RlOiBtdHJsIHByZWZpeCBpcyBhZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvcmUgRE9NIGNsYXNzZXMgc3lzdGVtXG4gKi9cbmV4cG9ydCBjb25zdCBWTElTVF9DTEFTU0VTID0ge1xuICAvKiogTGlzdCBlbGVtZW50ICovXG4gIExJU1Q6IFwidmxpc3RcIixcbiAgLyoqIExpc3QgaXRlbSAqL1xuICBJVEVNOiBcInZpZXdwb3J0LWl0ZW1cIixcbiAgLyoqIFNlbGVjdGVkIGxpc3QgaXRlbSAqL1xuICBTRUxFQ1RFRDogXCJ2aWV3cG9ydC1pdGVtLS1zZWxlY3RlZFwiLFxuICAvKiogRW1wdHkgc3RhdGUgKi9cbiAgRU1QVFk6IFwidmxpc3QtLWVtcHR5XCIsXG4gIC8qKiBTY3JvbGxlZCBzdGF0ZSAtIGxpc3QgaXMgbm90IGF0IHRoZSB0b3AgKi9cbiAgU0NST0xMRUQ6IFwidmxpc3QtLXNjcm9sbGVkXCIsXG59IGFzIGNvbnN0O1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy92bGlzdC9mZWF0dXJlcy9zZWxlY3Rpb24udHNcblxuaW1wb3J0IHR5cGUgeyBWTGlzdENvbmZpZywgVkxpc3RDb21wb25lbnQsIFZMaXN0SXRlbSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVkxJU1RfQ0xBU1NFUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFBSRUZJWCwgYWRkQ2xhc3MsIHJlbW92ZUNsYXNzIH0gZnJvbSBcIm10cmxcIjtcblxuLyoqXG4gKiBTZWxlY3Rpb24gc3RhdGUgaW50ZXJmYWNlXG4gKi9cbmludGVyZmFjZSBTZWxlY3Rpb25TdGF0ZSB7XG4gIHNlbGVjdGVkSWRzOiBTZXQ8c3RyaW5nIHwgbnVtYmVyPjtcbiAgbW9kZTogXCJub25lXCIgfCBcInNpbmdsZVwiIHwgXCJtdWx0aXBsZVwiO1xuICBsYXN0U2VsZWN0ZWRJbmRleD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBHZXQgaXRlbSBJRCBmcm9tIGVsZW1lbnQgb3IgaXRlbSBkYXRhXG4gKi9cbmNvbnN0IGdldEl0ZW1JZCA9IChpdGVtOiBhbnkpOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoaXRlbT8uaWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGl0ZW0uaWQ7XG4gIGlmIChpdGVtPy5faWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGl0ZW0uX2lkO1xuICBpZiAodHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIGl0ZW0gPT09IFwibnVtYmVyXCIpIHJldHVybiBpdGVtO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBBZGRzIHNlbGVjdGlvbiBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcyB0byBWTGlzdCBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhTZWxlY3Rpb24gPSA8VCBleHRlbmRzIFZMaXN0SXRlbSA9IFZMaXN0SXRlbT4oXG4gIGNvbmZpZzogVkxpc3RDb25maWc8VD4sXG4pID0+IHtcbiAgcmV0dXJuIChjb21wb25lbnQ6IFZMaXN0Q29tcG9uZW50PFQ+KTogVkxpc3RDb21wb25lbnQ8VD4gPT4ge1xuICAgIGlmICghY29uZmlnLnNlbGVjdGlvbj8uZW5hYmxlZCB8fCBjb25maWcuc2VsZWN0aW9uPy5tb2RlID09PSBcIm5vbmVcIikge1xuICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0ZTogU2VsZWN0aW9uU3RhdGUgPSB7XG4gICAgICBzZWxlY3RlZElkczogbmV3IFNldCgpLFxuICAgICAgbW9kZTogY29uZmlnLnNlbGVjdGlvbj8ubW9kZSB8fCBcInNpbmdsZVwiLFxuICAgICAgbGFzdFNlbGVjdGVkSW5kZXg6IHVuZGVmaW5lZCxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVxdWlyZU1vZGlmaWVycyA9IGNvbmZpZy5zZWxlY3Rpb24/LnJlcXVpcmVNb2RpZmllcnMgPz8gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBBcHBseSBzZWxlY3Rpb24gY2xhc3MgdG8gcmVuZGVyZWQgZWxlbWVudHMgbWF0Y2hpbmcgc2VsZWN0ZWQgSURzXG4gICAgICovXG4gICAgY29uc3QgYXBwbHlTZWxlY3Rpb25Ub0VsZW1lbnRzID0gKCkgPT4ge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gY29tcG9uZW50LmVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIGAuJHtQUkVGSVh9LXZpZXdwb3J0LWl0ZW1zYCxcbiAgICAgICk7XG4gICAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuXG4gICAgICBjb25zdCBpdGVtcyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICBgLiR7UFJFRklYfS12aWV3cG9ydC1pdGVtW2RhdGEtaWRdYCxcbiAgICAgICk7XG5cbiAgICAgIGl0ZW1zLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBlbCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgaWQgPSBlbGVtZW50LmRhdGFzZXQuaWQ7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgYm90aCBzdHJpbmcgYW5kIG51bWJlciB2ZXJzaW9ucyBvZiB0aGUgSURcbiAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID1cbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmhhcyhpZCkgfHwgc3RhdGUuc2VsZWN0ZWRJZHMuaGFzKE51bWJlcihpZCkpO1xuICAgICAgICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICBhZGRDbGFzcyhlbGVtZW50LCBWTElTVF9DTEFTU0VTLlNFTEVDVEVEKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgVkxJU1RfQ0xBU1NFUy5TRUxFQ1RFRCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIGl0ZW0gY2xpY2sgZm9yIHNlbGVjdGlvblxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUl0ZW1DbGljayA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB2aWV3cG9ydEl0ZW0gPSAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXG4gICAgICAgIGAuJHtQUkVGSVh9LXZpZXdwb3J0LWl0ZW1bZGF0YS1pbmRleF1gLFxuICAgICAgKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGlmICghdmlld3BvcnRJdGVtKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQodmlld3BvcnRJdGVtLmRhdGFzZXQuaW5kZXggfHwgXCItMVwiKTtcbiAgICAgIGlmIChpbmRleCA8IDApIHJldHVybjtcblxuICAgICAgY29uc3QgZW5oYW5jZWRDb21wb25lbnQgPSBjb21wb25lbnQgYXMgYW55O1xuICAgICAgY29uc3QgaXRlbXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRJdGVtcz8uKCk7XG4gICAgICBjb25zdCBpdGVtID0gaXRlbXM/LltpbmRleF07XG4gICAgICBpZiAoIWl0ZW0pIHJldHVybjtcblxuICAgICAgY29uc3QgaXRlbUlkID0gZ2V0SXRlbUlkKGl0ZW0pO1xuICAgICAgaWYgKGl0ZW1JZCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHdhc1NlbGVjdGVkID0gc3RhdGUuc2VsZWN0ZWRJZHMuaGFzKGl0ZW1JZCk7XG5cbiAgICAgIGlmIChzdGF0ZS5tb2RlID09PSBcInNpbmdsZVwiKSB7XG4gICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmNsZWFyKCk7XG4gICAgICAgIGlmICghd2FzU2VsZWN0ZWQpIHtcbiAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5hZGQoaXRlbUlkKTtcbiAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9IGluZGV4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLm1vZGUgPT09IFwibXVsdGlwbGVcIikge1xuICAgICAgICBpZiAoZS5zaGlmdEtleSAmJiBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1pbihzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCwgaW5kZXgpO1xuICAgICAgICAgIGNvbnN0IGVuZCA9IE1hdGgubWF4KHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4LCBpbmRleCk7XG5cbiAgICAgICAgICBpZiAoIWUuY3RybEtleSAmJiAhZS5tZXRhS2V5KSB7XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5jbGVhcigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcmFuZ2VJdGVtID0gaXRlbXM/LltpXTtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlSXRlbUlkID0gZ2V0SXRlbUlkKHJhbmdlSXRlbSk7XG4gICAgICAgICAgICBpZiAocmFuZ2VJdGVtSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5hZGQocmFuZ2VJdGVtSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChlLmN0cmxLZXkgfHwgZS5tZXRhS2V5KSB7XG4gICAgICAgICAgaWYgKHdhc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5kZWxldGUoaXRlbUlkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuYWRkKGl0ZW1JZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ID0gaW5kZXg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHJlcXVpcmVNb2RpZmllcnMpIHtcbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmNsZWFyKCk7XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5hZGQoaXRlbUlkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHdhc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmRlbGV0ZShpdGVtSWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuYWRkKGl0ZW1JZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ID0gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXBwbHlTZWxlY3Rpb25Ub0VsZW1lbnRzKCk7XG4gICAgICBlbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEVtaXQgc2VsZWN0aW9uIGNoYW5nZSBldmVudFxuICAgICAqL1xuICAgIGNvbnN0IGVtaXRTZWxlY3Rpb25DaGFuZ2UgPSAoKSA9PiB7XG4gICAgICBjb25zdCBlbmhhbmNlZENvbXBvbmVudCA9IGNvbXBvbmVudCBhcyBhbnk7XG4gICAgICBjb25zdCBpdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1zPy4oKSB8fCBbXTtcblxuICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IGl0ZW1zLmZpbHRlcigoaXRlbTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGlkID0gZ2V0SXRlbUlkKGl0ZW0pO1xuICAgICAgICByZXR1cm4gaWQgIT09IHVuZGVmaW5lZCAmJiBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoaWQpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkSW5kaWNlcyA9IGl0ZW1zLnJlZHVjZShcbiAgICAgICAgKGFjYzogbnVtYmVyW10sIGl0ZW06IGFueSwgaWR4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBpZCA9IGdldEl0ZW1JZChpdGVtKTtcbiAgICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCAmJiBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoaWQpKSB7XG4gICAgICAgICAgICBhY2MucHVzaChpZHgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LFxuICAgICAgICBbXSBhcyBudW1iZXJbXSxcbiAgICAgICk7XG5cbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJzZWxlY3Rpb246Y2hhbmdlXCIsIHsgc2VsZWN0ZWRJdGVtcywgc2VsZWN0ZWRJbmRpY2VzIH0pO1xuXG4gICAgICBpZiAoY29uZmlnLnNlbGVjdGlvbj8ub25TZWxlY3Rpb25DaGFuZ2UpIHtcbiAgICAgICAgY29uZmlnLnNlbGVjdGlvbi5vblNlbGVjdGlvbkNoYW5nZShzZWxlY3RlZEl0ZW1zLCBzZWxlY3RlZEluZGljZXMpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBTZXR1cDogbGlzdGVuIGZvciByZW5kZXJzIGFuZCBjbGlja3NcbiAgICBjb25zdCBzZXR1cCA9ICgpID0+IHtcbiAgICAgIC8vIEFkZCBtb2RlIGNsYXNzIHRvIGNvbnRhaW5lclxuICAgICAgaWYgKGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICAgIGFkZENsYXNzKGNvbXBvbmVudC5lbGVtZW50LCBcInZsaXN0LS1zZWxlY3Rpb25cIik7XG4gICAgICAgIGFkZENsYXNzKGNvbXBvbmVudC5lbGVtZW50LCBgdmxpc3QtLXNlbGVjdGlvbi0ke3N0YXRlLm1vZGV9YCk7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVJdGVtQ2xpY2ssIHRydWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBzZWxlY3Rpb24gYWZ0ZXIgZWFjaCByZW5kZXJcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5vbj8uKFxuICAgICAgICBcInZpZXdwb3J0Oml0ZW1zLXJlbmRlcmVkXCIsXG4gICAgICAgIGFwcGx5U2VsZWN0aW9uVG9FbGVtZW50cyxcbiAgICAgICk7XG4gICAgICAoY29tcG9uZW50IGFzIGFueSkub24/LihcInZpZXdwb3J0OnJlbmRlcmVkXCIsIGFwcGx5U2VsZWN0aW9uVG9FbGVtZW50cyk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHNlbGVjdGlvbiB3aGVuIGl0ZW0gaXMgcmVtb3ZlZFxuICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLm9uPy4oXG4gICAgICAgIFwiaXRlbTpyZW1vdmVkXCIsXG4gICAgICAgIChkYXRhOiB7IGl0ZW06IGFueTsgaW5kZXg6IG51bWJlciB9KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXRlbUlkID0gZ2V0SXRlbUlkKGRhdGEuaXRlbSk7XG4gICAgICAgICAgaWYgKGl0ZW1JZCAhPT0gdW5kZWZpbmVkICYmIHN0YXRlLnNlbGVjdGVkSWRzLmhhcyhpdGVtSWQpKSB7XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5kZWxldGUoaXRlbUlkKTtcbiAgICAgICAgICAgIC8vIElmIHRoZSByZW1vdmVkIGl0ZW0gd2FzIHRoZSBsYXN0IHNlbGVjdGVkIGluZGV4LCBjbGVhciBpdFxuICAgICAgICAgICAgaWYgKHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ID09PSBkYXRhLmluZGV4KSB7XG4gICAgICAgICAgICAgIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA+IGRhdGEuaW5kZXhcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAvLyBBZGp1c3QgbGFzdFNlbGVjdGVkSW5kZXggc2luY2UgaXRlbXMgc2hpZnRlZCBkb3duXG4gICAgICAgICAgICAgIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4LS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBhZnRlciBjb21wb25lbnQgaXMgcmVhZHlcbiAgICBzZXRUaW1lb3V0KHNldHVwLCAwKTtcblxuICAgIC8vIExpc3RlbiBmb3IgaW5pdGlhbCBsb2FkIGNvbXBsZXRlIHRvIGF1dG8tc2VsZWN0IGl0ZW1cbiAgICAvLyBUaGlzIG11c3QgYmUgaW4gd2l0aFNlbGVjdGlvbiBiZWNhdXNlIHNlbGVjdEJ5SWQgaXMgZGVmaW5lZCBoZXJlXG4gICAgKGNvbXBvbmVudCBhcyBhbnkpLm9uPy4oXG4gICAgICBcImNvbGxlY3Rpb246aW5pdGlhbC1sb2FkLWNvbXBsZXRlXCIsXG4gICAgICAoZGF0YTogeyBzZWxlY3RJZDogc3RyaW5nIHwgbnVtYmVyIH0pID0+IHtcbiAgICAgICAgaWYgKGRhdGE/LnNlbGVjdElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBVc2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIHRvIGVuc3VyZSByZW5kZXJpbmcgaXMgY29tcGxldGVcbiAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IFwic2luZ2xlXCIpIHtcbiAgICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuY2xlYXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmFkZChkYXRhLnNlbGVjdElkKTtcbiAgICAgICAgICAgIGFwcGx5U2VsZWN0aW9uVG9FbGVtZW50cygpO1xuICAgICAgICAgICAgZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBDbGVhbnVwIG9uIGRlc3Ryb3lcbiAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQuZGVzdHJveTtcbiAgICBjb21wb25lbnQuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgIGNvbXBvbmVudC5lbGVtZW50Py5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlSXRlbUNsaWNrLCB0cnVlKTtcbiAgICAgIG9yaWdpbmFsRGVzdHJveT8uKCk7XG4gICAgfTtcblxuICAgIC8vIEVuaGFuY2VkIGNvbXBvbmVudCB3aXRoIHNlbGVjdGlvbiBBUElcbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tcG9uZW50LFxuXG4gICAgICBzZWxlY3RJdGVtcyhpbmRpY2VzOiBudW1iZXJbXSkge1xuICAgICAgICBjb25zdCBpdGVtcyA9ICh0aGlzIGFzIGFueSkuZ2V0SXRlbXM/LigpO1xuICAgICAgICBpZiAoIWl0ZW1zKSByZXR1cm47XG5cbiAgICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IFwic2luZ2xlXCIpIHtcbiAgICAgICAgICAvLyBJbiBzaW5nbGUgbW9kZSwgY2xlYXIgcHJldmlvdXMgc2VsZWN0aW9uIGJlZm9yZSBhZGRpbmcgbmV3IG9uZVxuICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmNsZWFyKCk7XG4gICAgICAgICAgaWYgKGluZGljZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgaW5kaWNlcyA9IFtpbmRpY2VzWzBdXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpbmRpY2VzLmZvckVhY2goKGluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXRlbUlkID0gZ2V0SXRlbUlkKGl0ZW1zW2luZGV4XSk7XG4gICAgICAgICAgaWYgKGl0ZW1JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5hZGQoaXRlbUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChpbmRpY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9IGluZGljZXNbaW5kaWNlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFwcGx5U2VsZWN0aW9uVG9FbGVtZW50cygpO1xuICAgICAgICBlbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgICB9LFxuXG4gICAgICBkZXNlbGVjdEl0ZW1zKGluZGljZXM6IG51bWJlcltdKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gKHRoaXMgYXMgYW55KS5nZXRJdGVtcz8uKCk7XG4gICAgICAgIGlmICghaXRlbXMpIHJldHVybjtcblxuICAgICAgICBpbmRpY2VzLmZvckVhY2goKGluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXRlbUlkID0gZ2V0SXRlbUlkKGl0ZW1zW2luZGV4XSk7XG4gICAgICAgICAgaWYgKGl0ZW1JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5kZWxldGUoaXRlbUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFwcGx5U2VsZWN0aW9uVG9FbGVtZW50cygpO1xuICAgICAgICBlbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgICB9LFxuXG4gICAgICBjbGVhclNlbGVjdGlvbigpIHtcbiAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuY2xlYXIoKTtcbiAgICAgICAgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggPSB1bmRlZmluZWQ7XG4gICAgICAgIGFwcGx5U2VsZWN0aW9uVG9FbGVtZW50cygpO1xuICAgICAgICBlbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgICB9LFxuXG4gICAgICBnZXRTZWxlY3RlZEl0ZW1zKCk6IFRbXSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gKHRoaXMgYXMgYW55KS5nZXRJdGVtcz8uKCkgfHwgW107XG4gICAgICAgIHJldHVybiBpdGVtcy5maWx0ZXIoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkID0gZ2V0SXRlbUlkKGl0ZW0pO1xuICAgICAgICAgIHJldHVybiBpZCAhPT0gdW5kZWZpbmVkICYmIHN0YXRlLnNlbGVjdGVkSWRzLmhhcyhpZCk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcblxuICAgICAgZ2V0U2VsZWN0ZWRJbmRpY2VzKCk6IG51bWJlcltdIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSAodGhpcyBhcyBhbnkpLmdldEl0ZW1zPy4oKSB8fCBbXTtcbiAgICAgICAgcmV0dXJuIGl0ZW1zLnJlZHVjZSgoYWNjOiBudW1iZXJbXSwgaXRlbTogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgY29uc3QgaWQgPSBnZXRJdGVtSWQoaXRlbSk7XG4gICAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQgJiYgc3RhdGUuc2VsZWN0ZWRJZHMuaGFzKGlkKSkge1xuICAgICAgICAgICAgYWNjLnB1c2goaW5kZXgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCBbXSBhcyBudW1iZXJbXSk7XG4gICAgICB9LFxuXG4gICAgICBpc1NlbGVjdGVkKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSAodGhpcyBhcyBhbnkpLmdldEl0ZW1zPy4oKTtcbiAgICAgICAgY29uc3QgaXRlbUlkID0gZ2V0SXRlbUlkKGl0ZW1zPy5baW5kZXhdKTtcbiAgICAgICAgcmV0dXJuIGl0ZW1JZCAhPT0gdW5kZWZpbmVkICYmIHN0YXRlLnNlbGVjdGVkSWRzLmhhcyhpdGVtSWQpO1xuICAgICAgfSxcblxuICAgICAgc2VsZWN0QnlJZChpZDogc3RyaW5nIHwgbnVtYmVyLCBzaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGlmIChzdGF0ZS5tb2RlID09PSBcInNpbmdsZVwiKSB7XG4gICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuY2xlYXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmFkZChpZCk7XG4gICAgICAgIGFwcGx5U2VsZWN0aW9uVG9FbGVtZW50cygpO1xuICAgICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICAgIGVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgYW4gaXRlbSBhdCBpbmRleCBpcyBmdWxseSB2aXNpYmxlIGluIHRoZSB2aWV3cG9ydFxuICAgICAgICogVXNlcyBET00gZWxlbWVudCBwb3NpdGlvbiBmb3IgcHJlY2lzZSBjaGVja2luZ1xuICAgICAgICovXG4gICAgICBpc0l0ZW1GdWxseVZpc2libGUoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSBjb21wb25lbnQuZWxlbWVudD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICBgLiR7UFJFRklYfS12aWV3cG9ydC1pdGVtc2AsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghY29udGFpbmVyKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3Qgdmlld3BvcnQgPSBjb21wb25lbnQuZWxlbWVudD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICBgLiR7UFJFRklYfS12aWV3cG9ydGAsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghdmlld3BvcnQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCBpdGVtRWxlbWVudCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgIGAuJHtQUkVGSVh9LXZpZXdwb3J0LWl0ZW1bZGF0YS1pbmRleD1cIiR7aW5kZXh9XCJdYCxcbiAgICAgICAgKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKCFpdGVtRWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0UmVjdCA9IHZpZXdwb3J0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBpdGVtUmVjdCA9IGl0ZW1FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGl0ZW0gaXMgZnVsbHkgd2l0aGluIHZpZXdwb3J0IGJvdW5kc1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIGl0ZW1SZWN0LnRvcCA+PSB2aWV3cG9ydFJlY3QudG9wICYmXG4gICAgICAgICAgaXRlbVJlY3QuYm90dG9tIDw9IHZpZXdwb3J0UmVjdC5ib3R0b21cbiAgICAgICAgKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2VsZWN0IGl0ZW0gYXQgaW5kZXgsIHNjcm9sbGluZyBhbmQgd2FpdGluZyBmb3IgZGF0YSBpZiBuZWVkZWRcbiAgICAgICAqIEhhbmRsZXMgdmlydHVhbCBzY3JvbGxpbmcgYnkgbG9hZGluZyBkYXRhIGJlZm9yZSBzZWxlY3RpbmdcbiAgICAgICAqIFVzZXMgcHJlY2lzZSBET00tYmFzZWQgdmlzaWJpbGl0eSBjaGVja1xuICAgICAgICovXG4gICAgICBhc3luYyBzZWxlY3RBdEluZGV4KGluZGV4OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgZW5oYW5jZWRDb21wb25lbnQgPSBjb21wb25lbnQgYXMgYW55O1xuICAgICAgICBjb25zdCB0b3RhbEl0ZW1zID0gZW5oYW5jZWRDb21wb25lbnQuZ2V0SXRlbUNvdW50Py4oKSB8fCAwO1xuXG4gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdG90YWxJdGVtcykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBjdXJyZW50IHNlbGVjdGlvbiB0byBkZXRlcm1pbmUgbmF2aWdhdGlvbiBkaXJlY3Rpb25cbiAgICAgICAgY29uc3QgY3VycmVudEluZGljZXMgPSB0aGlzLmdldFNlbGVjdGVkSW5kaWNlcygpO1xuICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSBjdXJyZW50SW5kaWNlcy5sZW5ndGggPiAwID8gY3VycmVudEluZGljZXNbMF0gOiAtMTtcbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gaW5kZXggPiBjdXJyZW50SW5kZXggPyBcImRvd25cIiA6IFwidXBcIjtcblxuICAgICAgICAvLyBDaGVjayBpZiBpdGVtIGlzIGZ1bGx5IHZpc2libGUgdXNpbmcgcHJlY2lzZSBET00gY2hlY2tcbiAgICAgICAgY29uc3QgaXNGdWxseVZpc2libGUgPSB0aGlzLmlzSXRlbUZ1bGx5VmlzaWJsZShpbmRleCk7XG5cbiAgICAgICAgaWYgKCFpc0Z1bGx5VmlzaWJsZSAmJiBlbmhhbmNlZENvbXBvbmVudC52aWV3cG9ydD8uc2Nyb2xsVG9JbmRleCkge1xuICAgICAgICAgIC8vIFNjcm9sbCB3aXRoIGFsaWdubWVudCBiYXNlZCBvbiBuYXZpZ2F0aW9uIGRpcmVjdGlvblxuICAgICAgICAgIC8vIERvd24gbmF2aWdhdGlvbjogYWxpZ24gdG8gZW5kIChpdGVtIGF0IGJvdHRvbSlcbiAgICAgICAgICAvLyBVcCBuYXZpZ2F0aW9uOiBhbGlnbiB0byBzdGFydCAoaXRlbSBhdCB0b3ApXG4gICAgICAgICAgY29uc3QgYWxpZ25tZW50ID0gZGlyZWN0aW9uID09PSBcImRvd25cIiA/IFwiZW5kXCIgOiBcInN0YXJ0XCI7XG4gICAgICAgICAgZW5oYW5jZWRDb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9JbmRleChpbmRleCwgYWxpZ25tZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyeSB0byBzZWxlY3QgaW1tZWRpYXRlbHkgLSB3b3JrcyBpZiBpdGVtIGlzIGFscmVhZHkgbG9hZGVkXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZW5oYW5jZWRDb21wb25lbnQuZ2V0SXRlbXM/LigpIHx8IFtdO1xuICAgICAgICBpZiAoaXRlbXNbaW5kZXhdKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RJdGVtcyhbaW5kZXhdKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEl0ZW0gbm90IGxvYWRlZCB5ZXQgLSB3YWl0IGZvciBkYXRhIHRvIGxvYWQgdGhlbiBzZWxlY3RcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgbGV0IHJlc29sdmVkID0gZmFsc2U7XG5cbiAgICAgICAgICBjb25zdCBvblJhbmdlTG9hZGVkID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm47XG4gICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICBjb21wb25lbnQub2ZmPy4oXCJ2aWV3cG9ydDpyYW5nZS1sb2FkZWRcIiwgb25SYW5nZUxvYWRlZCk7XG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW1zKFtpbmRleF0pO1xuICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6cmFuZ2UtbG9hZGVkXCIsIG9uUmFuZ2VMb2FkZWQpO1xuXG4gICAgICAgICAgLy8gRmFsbGJhY2sgdGltZW91dCBpbiBjYXNlIGV2ZW50IGRvZXNuJ3QgZmlyZSAoZGF0YSBhbHJlYWR5IGxvYWRlZClcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuO1xuICAgICAgICAgICAgcmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgICAgY29tcG9uZW50Lm9mZj8uKFwidmlld3BvcnQ6cmFuZ2UtbG9hZGVkXCIsIG9uUmFuZ2VMb2FkZWQpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtcyhbaW5kZXhdKTtcbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgfSwgMzAwKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNlbGVjdCBuZXh0IGl0ZW0gcmVsYXRpdmUgdG8gY3VycmVudCBzZWxlY3Rpb25cbiAgICAgICAqIEhhbmRsZXMgdmlydHVhbCBzY3JvbGxpbmcgYnkgbG9hZGluZyBkYXRhIGJlZm9yZSBzZWxlY3RpbmdcbiAgICAgICAqIFJlc3BlY3RzIGtleWJvYXJkLndyYXAgb3B0aW9uIGZvciB3cmFwcGluZyBhdCBsaXN0IGJvdW5kYXJpZXNcbiAgICAgICAqL1xuICAgICAgYXN5bmMgc2VsZWN0TmV4dCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgZW5oYW5jZWRDb21wb25lbnQgPSBjb21wb25lbnQgYXMgYW55O1xuICAgICAgICBjb25zdCBzZWxlY3RlZEluZGljZXMgPSB0aGlzLmdldFNlbGVjdGVkSW5kaWNlcygpO1xuICAgICAgICBjb25zdCB0b3RhbEl0ZW1zID0gZW5oYW5jZWRDb21wb25lbnQuZ2V0SXRlbUNvdW50Py4oKSB8fCAwO1xuICAgICAgICBjb25zdCB3cmFwID0gY29uZmlnLmtleWJvYXJkPy53cmFwID8/IHRydWU7IC8vIE1EMyBkZWZhdWx0IGlzIHRydWVcblxuICAgICAgICBpZiAoc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIC8vIFNlbGVjdCBmaXJzdCBpdGVtXG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0QXRJbmRleCgwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHNlbGVjdGVkSW5kaWNlc1swXTtcbiAgICAgICAgY29uc3QgbmV4dEluZGV4ID0gY3VycmVudEluZGV4ICsgMTtcblxuICAgICAgICBpZiAobmV4dEluZGV4IDwgdG90YWxJdGVtcykge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdEF0SW5kZXgobmV4dEluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEF0IHRoZSBlbmQgLSB3cmFwIHRvIGJlZ2lubmluZyBpZiBlbmFibGVkXG4gICAgICAgIGlmICh3cmFwICYmIHRvdGFsSXRlbXMgPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0QXRJbmRleCgwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2VsZWN0IHByZXZpb3VzIGl0ZW0gcmVsYXRpdmUgdG8gY3VycmVudCBzZWxlY3Rpb25cbiAgICAgICAqIEhhbmRsZXMgdmlydHVhbCBzY3JvbGxpbmcgYnkgbG9hZGluZyBkYXRhIGJlZm9yZSBzZWxlY3RpbmdcbiAgICAgICAqIFJlc3BlY3RzIGtleWJvYXJkLndyYXAgb3B0aW9uIGZvciB3cmFwcGluZyBhdCBsaXN0IGJvdW5kYXJpZXNcbiAgICAgICAqL1xuICAgICAgYXN5bmMgc2VsZWN0UHJldmlvdXMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGVuaGFuY2VkQ29tcG9uZW50ID0gY29tcG9uZW50IGFzIGFueTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJbmRpY2VzID0gdGhpcy5nZXRTZWxlY3RlZEluZGljZXMoKTtcbiAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1Db3VudD8uKCkgfHwgMDtcbiAgICAgICAgY29uc3Qgd3JhcCA9IGNvbmZpZy5rZXlib2FyZD8ud3JhcCA/PyB0cnVlOyAvLyBNRDMgZGVmYXVsdCBpcyB0cnVlXG5cbiAgICAgICAgaWYgKHNlbGVjdGVkSW5kaWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAvLyBJZiB3cmFwIGVuYWJsZWQsIHNlbGVjdCBsYXN0IGl0ZW07IG90aGVyd2lzZSBkbyBub3RoaW5nXG4gICAgICAgICAgaWYgKHdyYXAgJiYgdG90YWxJdGVtcyA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdEF0SW5kZXgodG90YWxJdGVtcyAtIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSBzZWxlY3RlZEluZGljZXNbMF07XG4gICAgICAgIGNvbnN0IHByZXZJbmRleCA9IGN1cnJlbnRJbmRleCAtIDE7XG5cbiAgICAgICAgaWYgKHByZXZJbmRleCA+PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0QXRJbmRleChwcmV2SW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXQgdGhlIHN0YXJ0IC0gd3JhcCB0byBlbmQgaWYgZW5hYmxlZFxuICAgICAgICBpZiAod3JhcCAmJiB0b3RhbEl0ZW1zID4gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdEF0SW5kZXgodG90YWxJdGVtcyAtIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgd2l0aFNlbGVjdGlvbjtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvdmxpc3QvZmVhdHVyZXMva2V5Ym9hcmQudHNcblxuLyoqXG4gKiBLZXlib2FyZCBOYXZpZ2F0aW9uIEZlYXR1cmUgZm9yIFZMaXN0XG4gKlxuICogSW1wbGVtZW50cyBNYXRlcmlhbCBEZXNpZ24gMyBhY2Nlc3NpYmlsaXR5IGd1aWRlbGluZXMgZm9yIGxpc3RzOlxuICogLSBBcnJvdyBrZXlzIChVcC9Eb3duL0xlZnQvUmlnaHQpIG5hdmlnYXRlIGJldHdlZW4gaXRlbXMgd2l0aCB3cmFwcGluZ1xuICogLSBTcGFjZS9FbnRlciBhY3RpdmF0ZXMvc2VsZWN0cyB0aGUgZm9jdXNlZCBpdGVtXG4gKiAtIFRhYiBtb3ZlcyBmb2N1cyB0by9mcm9tIHRoZSBsaXN0XG4gKiAtIEhvbWUvRW5kIGp1bXAgdG8gZmlyc3QvbGFzdCBpdGVtXG4gKiAtIFBhZ2UgVXAvRG93biBza2lwIG11bHRpcGxlIGl0ZW1zXG4gKlxuICogQHNlZSBodHRwczovL20zLm1hdGVyaWFsLmlvL2NvbXBvbmVudHMvbGlzdHMvYWNjZXNzaWJpbGl0eVxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgVkxpc3RDb25maWcsXG4gIFZMaXN0Q29tcG9uZW50LFxuICBWTGlzdEl0ZW0sXG4gIExpc3RLZXlib2FyZENvbmZpZyxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBQUkVGSVgsIGFkZENsYXNzLCByZW1vdmVDbGFzcyB9IGZyb20gXCJtdHJsXCI7XG5cbi8qKlxuICogQ2xhc3MgbmFtZSBmb3Iga2V5Ym9hcmQgZm9jdXMgc3R5bGluZ1xuICovXG5jb25zdCBLRVlCT0FSRF9GT0NVU19DTEFTUyA9IFwibXRybC12bGlzdC0ta2V5Ym9hcmQtZm9jdXNcIjtcblxuLyoqXG4gKiBBUklBIHJvbGVzIGFuZCBhdHRyaWJ1dGVzIGZvciBhY2Nlc3NpYmlsaXR5XG4gKiBGb2xsb3dpbmcgTUQzIFdlYiBpbXBsZW1lbnRhdGlvbjpcbiAqIC0gQ29udGFpbmVyIHJvbGU6IGxpc3Rib3hcbiAqIC0gTGlzdCBpdGVtIHJvbGU6IG9wdGlvblxuICogLSBTdGF0ZTogYXJpYS1zZWxlY3RlZFxuICovXG5jb25zdCBBUklBID0ge1xuICBST0xFX0xJU1RCT1g6IFwibGlzdGJveFwiLFxuICBST0xFX09QVElPTjogXCJvcHRpb25cIixcbiAgQVJJQV9BQ1RJVkVERVNDRU5EQU5UOiBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLFxuICBBUklBX1NFTEVDVEVEOiBcImFyaWEtc2VsZWN0ZWRcIixcbiAgQVJJQV9MQUJFTDogXCJhcmlhLWxhYmVsXCIsXG4gIEFSSUFfTVVMVElTRUxFQ1RBQkxFOiBcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCIsXG59O1xuXG4vKipcbiAqIEdldCB0aGUgdmlld3BvcnQgaXRlbXMgY29udGFpbmVyXG4gKi9cbmNvbnN0IGdldEl0ZW1zQ29udGFpbmVyID0gKFxuICBlbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCxcbik6IEhUTUxFbGVtZW50IHwgbnVsbCA9PiB7XG4gIHJldHVybiBlbGVtZW50Py5xdWVyeVNlbGVjdG9yKGAuJHtQUkVGSVh9LXZpZXdwb3J0LWl0ZW1zYCkgfHwgbnVsbDtcbn07XG5cbi8qKlxuICogR2V0IGFsbCByZW5kZXJlZCBpdGVtIGVsZW1lbnRzXG4gKi9cbmNvbnN0IGdldFJlbmRlcmVkSXRlbXMgPSAoY29udGFpbmVyOiBIVE1MRWxlbWVudCB8IG51bGwpOiBIVE1MRWxlbWVudFtdID0+IHtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybiBbXTtcbiAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoYC4ke1BSRUZJWH0tdmlld3BvcnQtaXRlbVtkYXRhLWluZGV4XWApLFxuICApO1xufTtcblxuLyoqXG4gKiBBZGRzIGtleWJvYXJkIG5hdmlnYXRpb24gYW5kIGFjY2Vzc2liaWxpdHkgdG8gVkxpc3QgY29tcG9uZW50XG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoS2V5Ym9hcmQgPSA8VCBleHRlbmRzIFZMaXN0SXRlbSA9IFZMaXN0SXRlbT4oXG4gIGNvbmZpZzogVkxpc3RDb25maWc8VD4sXG4pID0+IHtcbiAgcmV0dXJuIChjb21wb25lbnQ6IFZMaXN0Q29tcG9uZW50PFQ+KTogVkxpc3RDb21wb25lbnQ8VD4gPT4ge1xuICAgIC8vIE9ubHkgZW5hYmxlIGtleWJvYXJkIGlmIHNlbGVjdGlvbiBpcyBlbmFibGVkXG4gICAgY29uc3Qgc2VsZWN0aW9uRW5hYmxlZCA9XG4gICAgICBjb25maWcuc2VsZWN0aW9uPy5lbmFibGVkICYmIGNvbmZpZy5zZWxlY3Rpb24/Lm1vZGUgIT09IFwibm9uZVwiO1xuICAgIGNvbnN0IGtleWJvYXJkQ29uZmlnID0gY29uZmlnLmtleWJvYXJkIHx8IHt9O1xuICAgIGNvbnN0IGVuYWJsZWQgPSBrZXlib2FyZENvbmZpZy5lbmFibGVkID8/IHNlbGVjdGlvbkVuYWJsZWQ7XG5cbiAgICBpZiAoIWVuYWJsZWQpIHtcbiAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgfVxuXG4gICAgLy8gTUQzIHNwZWNpZmllcyB0aGF0IGFycm93IGtleXMgc2hvdWxkIHdyYXAgYnkgZGVmYXVsdFxuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBob21lRW5kOiBrZXlib2FyZENvbmZpZy5ob21lRW5kID8/IHRydWUsXG4gICAgICBwYWdlVXBEb3duOiBrZXlib2FyZENvbmZpZy5wYWdlVXBEb3duID8/IHRydWUsXG4gICAgICBwYWdlU2l6ZToga2V5Ym9hcmRDb25maWcucGFnZVNpemUgPz8gMTAsXG4gICAgICB0eXBlQWhlYWQ6IGtleWJvYXJkQ29uZmlnLnR5cGVBaGVhZCA/PyBmYWxzZSxcbiAgICAgIHR5cGVBaGVhZFRpbWVvdXQ6IGtleWJvYXJkQ29uZmlnLnR5cGVBaGVhZFRpbWVvdXQgPz8gNTAwLFxuICAgICAgd3JhcDoga2V5Ym9hcmRDb25maWcud3JhcCA/PyB0cnVlLCAvLyBNRDM6IHdyYXBzIHRvIHRvcC9ib3R0b21cbiAgICAgIG9uTmF2aWdhdGU6IGtleWJvYXJkQ29uZmlnLm9uTmF2aWdhdGUsXG4gICAgfTtcblxuICAgIC8vIFR5cGUtYWhlYWQgc3RhdGVcbiAgICBsZXQgdHlwZUFoZWFkQnVmZmVyID0gXCJcIjtcbiAgICBsZXQgdHlwZUFoZWFkVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgICAvLyBUcmFjayBpZiBsYXN0IGludGVyYWN0aW9uIHdhcyBtb3VzZSAoZm9yIGZvY3VzIHN0eWxpbmcpXG4gICAgbGV0IGxhc3RNb3VzZURvd25UaW1lID0gMDtcblxuICAgIC8qKlxuICAgICAqIFNldHVwIEFSSUEgYXR0cmlidXRlcyBmb3IgYWNjZXNzaWJpbGl0eVxuICAgICAqL1xuICAgIGNvbnN0IHNldHVwQWNjZXNzaWJpbGl0eSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBjb21wb25lbnQuZWxlbWVudDtcbiAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuO1xuXG4gICAgICAvLyBTZXQgbGlzdGJveCByb2xlIG9uIHRoZSBjb21wb25lbnRcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwicm9sZVwiLCBBUklBLlJPTEVfTElTVEJPWCk7XG5cbiAgICAgIC8vIFNldCBtdWx0aXNlbGVjdGFibGUgaWYgaW4gbXVsdGlwbGUgc2VsZWN0aW9uIG1vZGVcbiAgICAgIGlmIChjb25maWcuc2VsZWN0aW9uPy5tb2RlID09PSBcIm11bHRpcGxlXCIpIHtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoQVJJQS5BUklBX01VTFRJU0VMRUNUQUJMRSwgXCJ0cnVlXCIpO1xuICAgICAgfVxuXG4gICAgICAvLyBNYWtlIGZvY3VzYWJsZVxuICAgICAgaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZShcInRhYmluZGV4XCIpKSB7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCIwXCIpO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgYXJpYS1sYWJlbCBpZiBub3QgcHJlc2VudFxuICAgICAgaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZShBUklBLkFSSUFfTEFCRUwpKSB7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKEFSSUEuQVJJQV9MQUJFTCwgXCJMaXN0XCIpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgQVJJQSBhdHRyaWJ1dGVzIG9uIHJlbmRlcmVkIGl0ZW1zXG4gICAgICovXG4gICAgY29uc3QgdXBkYXRlSXRlbUFjY2Vzc2liaWxpdHkgPSAoKSA9PiB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBnZXRJdGVtc0NvbnRhaW5lcihjb21wb25lbnQuZWxlbWVudCk7XG4gICAgICBjb25zdCBpdGVtcyA9IGdldFJlbmRlcmVkSXRlbXMoY29udGFpbmVyKTtcbiAgICAgIGNvbnN0IGVuaGFuY2VkQ29tcG9uZW50ID0gY29tcG9uZW50IGFzIGFueTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkSW5kaWNlcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldFNlbGVjdGVkSW5kaWNlcz8uKCkgfHwgW107XG5cbiAgICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBwYXJzZUludChpdGVtLmRhdGFzZXQuaW5kZXggfHwgXCItMVwiLCAxMCk7XG4gICAgICAgIGlmIChpbmRleCA8IDApIHJldHVybjtcblxuICAgICAgICAvLyBTZXQgb3B0aW9uIHJvbGVcbiAgICAgICAgaXRlbS5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIEFSSUEuUk9MRV9PUFRJT04pO1xuXG4gICAgICAgIC8vIFNldCB1bmlxdWUgSUQgZm9yIGFyaWEtYWN0aXZlZGVzY2VuZGFudFxuICAgICAgICBjb25zdCBpdGVtSWQgPSBgJHtQUkVGSVh9LXZsaXN0LWl0ZW0tJHtpbmRleH1gO1xuICAgICAgICBpdGVtLmlkID0gaXRlbUlkO1xuXG4gICAgICAgIC8vIFNldCBzZWxlY3RlZCBzdGF0ZVxuICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gc2VsZWN0ZWRJbmRpY2VzLmluY2x1ZGVzKGluZGV4KTtcbiAgICAgICAgaXRlbS5zZXRBdHRyaWJ1dGUoQVJJQS5BUklBX1NFTEVDVEVELCBTdHJpbmcoaXNTZWxlY3RlZCkpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFVwZGF0ZSBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQgb24gY29udGFpbmVyXG4gICAgICBpZiAoc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aCA+IDAgJiYgY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgYWN0aXZlSWQgPSBgJHtQUkVGSVh9LXZsaXN0LWl0ZW0tJHtzZWxlY3RlZEluZGljZXNbMF19YDtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuc2V0QXR0cmlidXRlKEFSSUEuQVJJQV9BQ1RJVkVERVNDRU5EQU5ULCBhY3RpdmVJZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21wb25lbnQuZWxlbWVudD8ucmVtb3ZlQXR0cmlidXRlKEFSSUEuQVJJQV9BQ1RJVkVERVNDRU5EQU5UKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHR5cGUtYWhlYWQgc2VhcmNoXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlVHlwZUFoZWFkID0gKGNoYXI6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKCFvcHRpb25zLnR5cGVBaGVhZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBDbGVhciBwcmV2aW91cyB0aW1lclxuICAgICAgaWYgKHR5cGVBaGVhZFRpbWVyKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0eXBlQWhlYWRUaW1lcik7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBjaGFyYWN0ZXIgdG8gYnVmZmVyXG4gICAgICB0eXBlQWhlYWRCdWZmZXIgKz0gY2hhci50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAvLyBTZXQgdGltZXIgdG8gY2xlYXIgYnVmZmVyXG4gICAgICB0eXBlQWhlYWRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0eXBlQWhlYWRCdWZmZXIgPSBcIlwiO1xuICAgICAgfSwgb3B0aW9ucy50eXBlQWhlYWRUaW1lb3V0KTtcblxuICAgICAgLy8gU2VhcmNoIGZvciBtYXRjaGluZyBpdGVtXG4gICAgICBjb25zdCBlbmhhbmNlZENvbXBvbmVudCA9IGNvbXBvbmVudCBhcyBhbnk7XG4gICAgICBjb25zdCBpdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1zPy4oKSB8fCBbXTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkSW5kaWNlcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldFNlbGVjdGVkSW5kaWNlcz8uKCkgfHwgW107XG4gICAgICBjb25zdCBzdGFydEluZGV4ID1cbiAgICAgICAgc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aCA+IDAgPyBzZWxlY3RlZEluZGljZXNbMF0gKyAxIDogMDtcblxuICAgICAgLy8gU2VhcmNoIGZyb20gY3VycmVudCBwb3NpdGlvbiB0byBlbmQsIHRoZW4gd3JhcCB0byBiZWdpbm5pbmdcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSAoc3RhcnRJbmRleCArIGkpICUgaXRlbXMubGVuZ3RoO1xuICAgICAgICBjb25zdCBpdGVtID0gaXRlbXNbaW5kZXhdO1xuICAgICAgICBpZiAoIWl0ZW0pIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIEdldCBzZWFyY2hhYmxlIHRleHQgZnJvbSBpdGVtXG4gICAgICAgIGNvbnN0IHRleHQgPSBnZXRJdGVtVGV4dChpdGVtKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodGV4dC5zdGFydHNXaXRoKHR5cGVBaGVhZEJ1ZmZlcikpIHtcbiAgICAgICAgICBlbmhhbmNlZENvbXBvbmVudC5zZWxlY3RBdEluZGV4Py4oaW5kZXgpO1xuICAgICAgICAgIG9wdGlvbnMub25OYXZpZ2F0ZT8uKGluZGV4LCBcInR5cGVhaGVhZFwiKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldCBzZWFyY2hhYmxlIHRleHQgZnJvbSBhbiBpdGVtXG4gICAgICovXG4gICAgY29uc3QgZ2V0SXRlbVRleHQgPSAoaXRlbTogYW55KTogc3RyaW5nID0+IHtcbiAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGl0ZW07XG4gICAgICByZXR1cm4gaXRlbS50aXRsZSB8fCBpdGVtLm5hbWUgfHwgaXRlbS5sYWJlbCB8fCBpdGVtLnRleHQgfHwgXCJcIjtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIGtleWJvYXJkIGV2ZW50c1xuICAgICAqXG4gICAgICogTUQzIEtleWJvYXJkIE5hdmlnYXRpb246XG4gICAgICogLSBUYWI6IE1vdmUgZm9jdXMgdG8gZmlyc3QvbGFzdCBsaXN0IGl0ZW0gb3Igb3V0c2lkZVxuICAgICAqIC0gRG93bi9SaWdodDogTW92ZSB0byBuZXh0IGVsZW1lbnQ7IHdyYXBzIHRvIHRvcCBpZiBhdCBlbmRcbiAgICAgKiAtIFVwL0xlZnQ6IE1vdmUgdG8gcHJldmlvdXMgZWxlbWVudDsgd3JhcHMgdG8gYm90dG9tIGlmIGF0IHN0YXJ0XG4gICAgICogLSBTcGFjZS9FbnRlcjogU2VsZWN0IGEgbGlzdCBpdGVtXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlS2V5RG93biA9IGFzeW5jIChlOiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBlbmhhbmNlZENvbXBvbmVudCA9IGNvbXBvbmVudCBhcyBhbnk7XG4gICAgICBjb25zdCB0b3RhbEl0ZW1zID0gZW5oYW5jZWRDb21wb25lbnQuZ2V0SXRlbUNvdW50Py4oKSB8fCAwO1xuXG4gICAgICBpZiAodG90YWxJdGVtcyA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBzZWxlY3RlZEluZGljZXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRTZWxlY3RlZEluZGljZXM/LigpIHx8IFtdO1xuICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aCA+IDAgPyBzZWxlY3RlZEluZGljZXNbMF0gOiAtMTtcblxuICAgICAgbGV0IHRhcmdldEluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICAgIGxldCBoYW5kbGVkID0gZmFsc2U7XG5cbiAgICAgIC8vIEhlbHBlciB0byBtYXJrIGV2ZW50IGFzIGhhbmRsZWQgYW5kIHN0b3AgcHJvcGFnYXRpb25cbiAgICAgIGNvbnN0IG1hcmtIYW5kbGVkID0gKCkgPT4ge1xuICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgfTtcblxuICAgICAgc3dpdGNoIChlLmtleSkge1xuICAgICAgICAvLyBNRDM6IERvd24vUmlnaHQgbW92ZSB0byBuZXh0IGVsZW1lbnRcbiAgICAgICAgY2FzZSBcIkFycm93RG93blwiOlxuICAgICAgICBjYXNlIFwiQXJyb3dSaWdodFwiOlxuICAgICAgICAgIG1hcmtIYW5kbGVkKCk7XG4gICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA8IDApIHtcbiAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRJbmRleCA8IHRvdGFsSXRlbXMgLSAxKSB7XG4gICAgICAgICAgICB0YXJnZXRJbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XG4gICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLndyYXApIHtcbiAgICAgICAgICAgIC8vIE1EMzogd3JhcHMgdG8gdG9wIGlmIGF0IGVuZFxuICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICAvLyBNRDM6IFVwL0xlZnQgbW92ZSB0byBwcmV2aW91cyBlbGVtZW50XG4gICAgICAgIGNhc2UgXCJBcnJvd1VwXCI6XG4gICAgICAgIGNhc2UgXCJBcnJvd0xlZnRcIjpcbiAgICAgICAgICBtYXJrSGFuZGxlZCgpO1xuICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPCAwKSB7XG4gICAgICAgICAgICB0YXJnZXRJbmRleCA9IHRvdGFsSXRlbXMgLSAxO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudEluZGV4ID4gMCkge1xuICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBjdXJyZW50SW5kZXggLSAxO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy53cmFwKSB7XG4gICAgICAgICAgICAvLyBNRDM6IHdyYXBzIHRvIGJvdHRvbSBpZiBhdCBzdGFydFxuICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSB0b3RhbEl0ZW1zIC0gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcIkhvbWVcIjpcbiAgICAgICAgICBpZiAob3B0aW9ucy5ob21lRW5kKSB7XG4gICAgICAgICAgICBtYXJrSGFuZGxlZCgpO1xuICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiRW5kXCI6XG4gICAgICAgICAgaWYgKG9wdGlvbnMuaG9tZUVuZCkge1xuICAgICAgICAgICAgbWFya0hhbmRsZWQoKTtcbiAgICAgICAgICAgIHRhcmdldEluZGV4ID0gdG90YWxJdGVtcyAtIDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJQYWdlRG93blwiOlxuICAgICAgICAgIGlmIChvcHRpb25zLnBhZ2VVcERvd24pIHtcbiAgICAgICAgICAgIG1hcmtIYW5kbGVkKCk7XG4gICAgICAgICAgICBpZiAoY3VycmVudEluZGV4IDwgMCkge1xuICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IE1hdGgubWluKG9wdGlvbnMucGFnZVNpemUgLSAxLCB0b3RhbEl0ZW1zIC0gMSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0YXJnZXRJbmRleCA9IE1hdGgubWluKFxuICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleCArIG9wdGlvbnMucGFnZVNpemUsXG4gICAgICAgICAgICAgICAgdG90YWxJdGVtcyAtIDEsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJQYWdlVXBcIjpcbiAgICAgICAgICBpZiAob3B0aW9ucy5wYWdlVXBEb3duKSB7XG4gICAgICAgICAgICBtYXJrSGFuZGxlZCgpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA8IDApIHtcbiAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSAwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBNYXRoLm1heChjdXJyZW50SW5kZXggLSBvcHRpb25zLnBhZ2VTaXplLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgLy8gTUQzOiBTcGFjZS9FbnRlciBzZWxlY3QgYSBsaXN0IGl0ZW1cbiAgICAgICAgY2FzZSBcIiBcIjpcbiAgICAgICAgY2FzZSBcIkVudGVyXCI6XG4gICAgICAgICAgbWFya0hhbmRsZWQoKTtcbiAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID49IDApIHtcbiAgICAgICAgICAgIGlmIChjb25maWcuc2VsZWN0aW9uPy5tb2RlID09PSBcIm11bHRpcGxlXCIpIHtcbiAgICAgICAgICAgICAgLy8gSW4gbXVsdGlwbGUgbW9kZSwgdG9nZ2xlIHNlbGVjdGlvblxuICAgICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gZW5oYW5jZWRDb21wb25lbnQuaXNTZWxlY3RlZD8uKGN1cnJlbnRJbmRleCk7XG4gICAgICAgICAgICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgZW5oYW5jZWRDb21wb25lbnQuZGVzZWxlY3RJdGVtcz8uKFtjdXJyZW50SW5kZXhdKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbmhhbmNlZENvbXBvbmVudC5zZWxlY3RJdGVtcz8uKFtjdXJyZW50SW5kZXhdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gSW4gc2luZ2xlIG1vZGUsIGVuc3VyZSBpdGVtIGlzIHNlbGVjdGVkIGFuZCBlbWl0IGFjdGl2YXRpb24gZXZlbnRcbiAgICAgICAgICAgICAgZW5oYW5jZWRDb21wb25lbnQuc2VsZWN0SXRlbXM/LihbY3VycmVudEluZGV4XSk7XG4gICAgICAgICAgICAgIC8vIEVtaXQgYWN0aXZhdGUgZXZlbnQgZm9yIHNpbmdsZS1hY3Rpb24gbGlzdHNcbiAgICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW06YWN0aXZhdGVcIiwge1xuICAgICAgICAgICAgICAgIGluZGV4OiBjdXJyZW50SW5kZXgsXG4gICAgICAgICAgICAgICAgaXRlbTogZW5oYW5jZWRDb21wb25lbnQuZ2V0SXRlbXM/LigpPy5bY3VycmVudEluZGV4XSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJhXCI6XG4gICAgICAgIGNhc2UgXCJBXCI6XG4gICAgICAgICAgLy8gQ3RybCtBIC8gQ21kK0EgLSBzZWxlY3QgYWxsIGluIG11bHRpcGxlIG1vZGVcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAoZS5jdHJsS2V5IHx8IGUubWV0YUtleSkgJiZcbiAgICAgICAgICAgIGNvbmZpZy5zZWxlY3Rpb24/Lm1vZGUgPT09IFwibXVsdGlwbGVcIlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgbWFya0hhbmRsZWQoKTtcbiAgICAgICAgICAgIGNvbnN0IGFsbEluZGljZXMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiB0b3RhbEl0ZW1zIH0sIChfLCBpKSA9PiBpKTtcbiAgICAgICAgICAgIGVuaGFuY2VkQ29tcG9uZW50LnNlbGVjdEl0ZW1zPy4oYWxsSW5kaWNlcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJFc2NhcGVcIjpcbiAgICAgICAgICAvLyBDbGVhciBzZWxlY3Rpb25cbiAgICAgICAgICBtYXJrSGFuZGxlZCgpO1xuICAgICAgICAgIGVuaGFuY2VkQ29tcG9uZW50LmNsZWFyU2VsZWN0aW9uPy4oKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIFR5cGUtYWhlYWQgZm9yIHByaW50YWJsZSBjaGFyYWN0ZXJzXG4gICAgICAgICAgaWYgKGUua2V5Lmxlbmd0aCA9PT0gMSAmJiAhZS5jdHJsS2V5ICYmICFlLm1ldGFLZXkgJiYgIWUuYWx0S2V5KSB7XG4gICAgICAgICAgICBoYW5kbGVkID0gaGFuZGxlVHlwZUFoZWFkKGUua2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIE5hdmlnYXRlIHRvIHRhcmdldCBpbmRleFxuICAgICAgaWYgKHRhcmdldEluZGV4ICE9PSBudWxsICYmIHRhcmdldEluZGV4ICE9PSBjdXJyZW50SW5kZXgpIHtcbiAgICAgICAgLy8gSGFuZGxlIHNoaWZ0K2Fycm93IGZvciByYW5nZSBzZWxlY3Rpb24gaW4gbXVsdGlwbGUgbW9kZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgZS5zaGlmdEtleSAmJlxuICAgICAgICAgIGNvbmZpZy5zZWxlY3Rpb24/Lm1vZGUgPT09IFwibXVsdGlwbGVcIiAmJlxuICAgICAgICAgIGN1cnJlbnRJbmRleCA+PSAwXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5taW4oY3VycmVudEluZGV4LCB0YXJnZXRJbmRleCk7XG4gICAgICAgICAgY29uc3QgZW5kID0gTWF0aC5tYXgoY3VycmVudEluZGV4LCB0YXJnZXRJbmRleCk7XG4gICAgICAgICAgY29uc3QgcmFuZ2VJbmRpY2VzID0gQXJyYXkuZnJvbShcbiAgICAgICAgICAgIHsgbGVuZ3RoOiBlbmQgLSBzdGFydCArIDEgfSxcbiAgICAgICAgICAgIChfLCBpKSA9PiBzdGFydCArIGksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBlbmhhbmNlZENvbXBvbmVudC5zZWxlY3RJdGVtcz8uKHJhbmdlSW5kaWNlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQXdhaXQgc2VsZWN0QXRJbmRleCBmb3IgcHJvcGVyIHNjcm9sbGluZyBhbmQgZGF0YSBsb2FkaW5nXG4gICAgICAgICAgLy8gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIEhvbWUvRW5kL1BhZ2VVcC9QYWdlRG93biB3aGljaCBtYXkganVtcCB0byB1bmxvYWRlZCBpdGVtc1xuICAgICAgICAgIGF3YWl0IGVuaGFuY2VkQ29tcG9uZW50LnNlbGVjdEF0SW5kZXg/Lih0YXJnZXRJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucy5vbk5hdmlnYXRlPy4odGFyZ2V0SW5kZXgsIGUua2V5KTtcbiAgICAgIH1cblxuICAgICAgLy8gRW1pdCBrZXlib2FyZCBldmVudCBmb3IgZXh0ZXJuYWwgaGFuZGxpbmdcbiAgICAgIGlmIChoYW5kbGVkKSB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJrZXlib2FyZDpuYXZpZ2F0ZVwiLCB7XG4gICAgICAgICAga2V5OiBlLmtleSxcbiAgICAgICAgICBpbmRleDogdGFyZ2V0SW5kZXggPz8gY3VycmVudEluZGV4LFxuICAgICAgICAgIHNoaWZ0S2V5OiBlLnNoaWZ0S2V5LFxuICAgICAgICAgIGN0cmxLZXk6IGUuY3RybEtleSxcbiAgICAgICAgICBtZXRhS2V5OiBlLm1ldGFLZXksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgZm9jdXMgZXZlbnRcbiAgICAgKlxuICAgICAqIE1EMyBGb2N1cyBCZWhhdmlvciBmb3IgU2luZ2xlLUFjdGlvbiBMaXN0czpcbiAgICAgKiAtIFRoZSBmaXJzdCBlbGVtZW50IGluIGEgbGlzdCBzaG91bGQgcmVjZWl2ZSBmb2N1cyBieSBkZWZhdWx0XG4gICAgICogLSBJZiB0aGUgbGlzdCBoYXMgYSBzZWxlY3RlZCBlbGVtZW50LCBmb2N1cyBnb2VzIHRvIHRoZSBzZWxlY3RlZCBpdGVtIGluc3RlYWRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVGb2N1cyA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGVuaGFuY2VkQ29tcG9uZW50ID0gY29tcG9uZW50IGFzIGFueTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkSW5kaWNlcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldFNlbGVjdGVkSW5kaWNlcz8uKCkgfHwgW107XG4gICAgICBjb25zdCB0b3RhbEl0ZW1zID0gZW5oYW5jZWRDb21wb25lbnQuZ2V0SXRlbUNvdW50Py4oKSB8fCAwO1xuXG4gICAgICAvLyBBZGQga2V5Ym9hcmQgZm9jdXMgY2xhc3Mgb25seSBpZiBmb2N1cyB3YXMgTk9UIGZyb20gYSByZWNlbnQgbW91c2UgY2xpY2tcbiAgICAgIC8vIDEwMG1zIHRocmVzaG9sZCBhY2NvdW50cyBmb3IgdGhlIGRlbGF5IGJldHdlZW4gbW91c2Vkb3duIGFuZCBmb2N1c1xuICAgICAgY29uc3Qgd2FzTW91c2VDbGljayA9IERhdGUubm93KCkgLSBsYXN0TW91c2VEb3duVGltZSA8IDEwMDtcbiAgICAgIGlmICghd2FzTW91c2VDbGljayAmJiBjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICBhZGRDbGFzcyhjb21wb25lbnQuZWxlbWVudCwgS0VZQk9BUkRfRk9DVVNfQ0xBU1MpO1xuICAgICAgfVxuXG4gICAgICBpZiAodG90YWxJdGVtcyA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAvLyBNRDM6IElmIGxpc3QgaGFzIHNlbGVjdGVkIGVsZW1lbnQsIGZvY3VzIGdvZXMgdG8gc2VsZWN0ZWQgaXRlbVxuICAgICAgLy8gT3RoZXJ3aXNlLCBmaXJzdCBlbGVtZW50IHJlY2VpdmVzIGZvY3VzXG4gICAgICBpZiAoc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBlbmhhbmNlZENvbXBvbmVudC5zZWxlY3RBdEluZGV4Py4oMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBPbmx5IHNjcm9sbCB0byBzZWxlY3RlZCBpdGVtIGlmIGl0J3Mgbm90IGFscmVhZHkgZnVsbHkgdmlzaWJsZVxuICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHVud2FudGVkIHNjcm9sbGluZyB3aGVuIGNsaWNraW5nIG9uIGEgdmlzaWJsZSBpdGVtXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSW5kZXggPSBzZWxlY3RlZEluZGljZXNbMF07XG4gICAgICAgIGNvbnN0IGlzVmlzaWJsZSA9IGVuaGFuY2VkQ29tcG9uZW50LmlzSXRlbUZ1bGx5VmlzaWJsZT8uKHNlbGVjdGVkSW5kZXgpO1xuICAgICAgICBpZiAoIWlzVmlzaWJsZSAmJiBlbmhhbmNlZENvbXBvbmVudC52aWV3cG9ydD8uc2Nyb2xsVG9JbmRleCkge1xuICAgICAgICAgIGVuaGFuY2VkQ29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbFRvSW5kZXgoc2VsZWN0ZWRJbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcImtleWJvYXJkOmZvY3VzXCIpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgYmx1ciBldmVudFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUJsdXIgPSAoKSA9PiB7XG4gICAgICAvLyBSZW1vdmUga2V5Ym9hcmQgZm9jdXMgY2xhc3NcbiAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICByZW1vdmVDbGFzcyhjb21wb25lbnQuZWxlbWVudCwgS0VZQk9BUkRfRk9DVVNfQ0xBU1MpO1xuICAgICAgfVxuXG4gICAgICAvLyBDbGVhciB0eXBlLWFoZWFkIG9uIGJsdXJcbiAgICAgIHR5cGVBaGVhZEJ1ZmZlciA9IFwiXCI7XG4gICAgICBpZiAodHlwZUFoZWFkVGltZXIpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHR5cGVBaGVhZFRpbWVyKTtcbiAgICAgICAgdHlwZUFoZWFkVGltZXIgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwia2V5Ym9hcmQ6Ymx1clwiKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0dXAgZXZlbnQgbGlzdGVuZXJzXG4gICAgICovXG4gICAgY29uc3Qgc2V0dXAgPSAoKSA9PiB7XG4gICAgICBzZXR1cEFjY2Vzc2liaWxpdHkoKTtcblxuICAgICAgaWYgKGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGhhbmRsZUtleURvd24pO1xuICAgICAgICBjb21wb25lbnQuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgaGFuZGxlRm9jdXMpO1xuICAgICAgICBjb21wb25lbnQuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCBoYW5kbGVCbHVyKTtcblxuICAgICAgICAvLyBUcmFjayBtb3VzZSBjbGlja3MgdG8gZGlzdGluZ3Vpc2ggZnJvbSBrZXlib2FyZCBmb2N1c1xuICAgICAgICBjb21wb25lbnQuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsICgpID0+IHtcbiAgICAgICAgICBsYXN0TW91c2VEb3duVGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEFkZCBjbGljayBoYW5kbGVyIHRvIGZvY3VzIHRoZSBsaXN0IHdoZW4gY2xpY2tlZFxuICAgICAgICBjb21wb25lbnQuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgIGNvbXBvbmVudC5lbGVtZW50Py5mb2N1cygpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIEFSSUEgYXR0cmlidXRlcyB3aGVuIGl0ZW1zIGFyZSByZW5kZXJlZFxuICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLm9uPy4oXG4gICAgICAgIFwidmlld3BvcnQ6aXRlbXMtcmVuZGVyZWRcIixcbiAgICAgICAgdXBkYXRlSXRlbUFjY2Vzc2liaWxpdHksXG4gICAgICApO1xuICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLm9uPy4oXCJ2aWV3cG9ydDpyZW5kZXJlZFwiLCB1cGRhdGVJdGVtQWNjZXNzaWJpbGl0eSk7XG5cbiAgICAgIC8vIFVwZGF0ZSBBUklBIHdoZW4gc2VsZWN0aW9uIGNoYW5nZXNcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5vbj8uKFwic2VsZWN0aW9uOmNoYW5nZVwiLCB1cGRhdGVJdGVtQWNjZXNzaWJpbGl0eSk7XG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemUgYWZ0ZXIgY29tcG9uZW50IGlzIHJlYWR5XG4gICAgc2V0VGltZW91dChzZXR1cCwgMCk7XG5cbiAgICAvLyBDbGVhbnVwIG9uIGRlc3Ryb3lcbiAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQuZGVzdHJveTtcbiAgICBjb21wb25lbnQuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICBjb21wb25lbnQuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBoYW5kbGVLZXlEb3duKTtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIGhhbmRsZUZvY3VzKTtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgaGFuZGxlQmx1cik7XG4gICAgICB9XG4gICAgICBpZiAodHlwZUFoZWFkVGltZXIpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHR5cGVBaGVhZFRpbWVyKTtcbiAgICAgIH1cbiAgICAgIG9yaWdpbmFsRGVzdHJveT8uKCk7XG4gICAgfTtcblxuICAgIC8vIFJldHVybiBlbmhhbmNlZCBjb21wb25lbnQgd2l0aCBrZXlib2FyZCBBUElcbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tcG9uZW50LFxuXG4gICAgICAvKipcbiAgICAgICAqIEZvY3VzIHRoZSBsaXN0IGZvciBrZXlib2FyZCBuYXZpZ2F0aW9uXG4gICAgICAgKi9cbiAgICAgIGZvY3VzKCk6IHZvaWQge1xuICAgICAgICBjb21wb25lbnQuZWxlbWVudD8uZm9jdXMoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQmx1ciB0aGUgbGlzdFxuICAgICAgICovXG4gICAgICBibHVyKCk6IHZvaWQge1xuICAgICAgICBjb21wb25lbnQuZWxlbWVudD8uYmx1cigpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDaGVjayBpZiBsaXN0IGhhcyBmb2N1c1xuICAgICAgICovXG4gICAgICBoYXNGb2N1cygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGNvbXBvbmVudC5lbGVtZW50O1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTZWxlY3QgZmlyc3QgaXRlbVxuICAgICAgICovXG4gICAgICBhc3luYyBzZWxlY3RGaXJzdCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgZW5oYW5jZWRDb21wb25lbnQgPSBjb21wb25lbnQgYXMgYW55O1xuICAgICAgICBjb25zdCB0b3RhbEl0ZW1zID0gZW5oYW5jZWRDb21wb25lbnQuZ2V0SXRlbUNvdW50Py4oKSB8fCAwO1xuICAgICAgICBpZiAodG90YWxJdGVtcyA+IDApIHtcbiAgICAgICAgICByZXR1cm4gZW5oYW5jZWRDb21wb25lbnQuc2VsZWN0QXRJbmRleD8uKDApID8/IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2VsZWN0IGxhc3QgaXRlbVxuICAgICAgICovXG4gICAgICBhc3luYyBzZWxlY3RMYXN0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBlbmhhbmNlZENvbXBvbmVudCA9IGNvbXBvbmVudCBhcyBhbnk7XG4gICAgICAgIGNvbnN0IHRvdGFsSXRlbXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRJdGVtQ291bnQ/LigpIHx8IDA7XG4gICAgICAgIGlmICh0b3RhbEl0ZW1zID4gMCkge1xuICAgICAgICAgIHJldHVybiBlbmhhbmNlZENvbXBvbmVudC5zZWxlY3RBdEluZGV4Py4odG90YWxJdGVtcyAtIDEpID8/IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhLZXlib2FyZDtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9mb3JtLnRzXG5cbi8qKlxuICogRm9ybSBDb21wb25lbnQgLSBGdW5jdGlvbmFsIGZvcm0gYnVpbGRlciB3aXRoIG10cmwgY29tcG9zaXRpb25cbiAqXG4gKiBBIGZvcm0gY29tcG9uZW50IHRoYXQgdXNlcyB0aGUgbXRybC1hZGRvbnMgbGF5b3V0IHN5c3RlbSB0byBidWlsZFxuICogZm9ybXMgZnJvbSBzY2hlbWEgZGVmaW5pdGlvbnMsIHdpdGggYnVpbHQtaW4gZGF0YSBtYW5hZ2VtZW50LFxuICogdmFsaWRhdGlvbiwgYW5kIHN1Ym1pc3Npb24gaGFuZGxpbmcuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBGb3JtQ29uZmlnLCBGb3JtQ29tcG9uZW50IH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLy8gSW1wb3J0IG10cmwgY29tcG9zZSBzeXN0ZW1cbmltcG9ydCB7IHBpcGUgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgY3JlYXRlQmFzZSwgd2l0aEVsZW1lbnQgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgd2l0aEV2ZW50cywgd2l0aExpZmVjeWNsZSB9IGZyb20gXCJtdHJsXCI7XG5cbi8vIEltcG9ydCBmb3JtIGZlYXR1cmVzXG5pbXBvcnQge1xuICB3aXRoTGF5b3V0LFxuICB3aXRoRmllbGRzLFxuICB3aXRoRGF0YSxcbiAgd2l0aENvbnRyb2xsZXIsXG4gIHdpdGhTdWJtaXQsXG4gIHdpdGhQcm90ZWN0aW9uLFxuICB3aXRoQVBJLFxufSBmcm9tIFwiLi9mZWF0dXJlc1wiO1xuXG4vLyBJbXBvcnQgY29uZmlndXJhdGlvblxuaW1wb3J0IHsgY3JlYXRlQmFzZUNvbmZpZywgZ2V0RWxlbWVudENvbmZpZyB9IGZyb20gXCIuL2NvbmZpZ1wiO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgRm9ybSBjb21wb25lbnQgdXNpbmcgZnVuY3Rpb25hbCBjb21wb3NpdGlvblxuICpcbiAqIEBwYXJhbSB7Rm9ybUNvbmZpZ30gY29uZmlnIC0gRm9ybSBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtGb3JtQ29tcG9uZW50fSBBIGZ1bGx5IGNvbmZpZ3VyZWQgZm9ybSBjb21wb25lbnRcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgY3JlYXRlRm9ybSB9IGZyb20gJ210cmwtYWRkb25zJ1xuICogaW1wb3J0IHsgY3JlYXRlVGV4dGZpZWxkLCBjcmVhdGVTd2l0Y2gsIGNyZWF0ZUNoaXBzIH0gZnJvbSAnbXRybCdcbiAqXG4gKiBjb25zdCBmb3JtID0gY3JlYXRlRm9ybSh7XG4gKiAgIGNsYXNzOiAnYWNjb3VudC1mb3JtJyxcbiAqICAgYWN0aW9uOiAnL2FwaS91c2Vycy8nLFxuICogICBsYXlvdXQ6IFtcbiAqICAgICBbJ3NlY3Rpb24nLCB7IGNsYXNzOiAndXNlci1zZWN0aW9uJyB9LFxuICogICAgICAgWydkaXYnLCB7IGNsYXNzOiAnc2VjdGlvbi10aXRsZScsIHRleHQ6ICdVc2VyJyB9XSxcbiAqICAgICAgIFtjcmVhdGVUZXh0ZmllbGQsICdpbmZvLnVzZXJuYW1lJywgeyBsYWJlbDogJ1VzZXJuYW1lJyB9XSxcbiAqICAgICAgIFtjcmVhdGVDaGlwcywgJ2luZm8ucm9sZScsIHtcbiAqICAgICAgICAgbGFiZWw6ICdSb2xlJyxcbiAqICAgICAgICAgY2hpcHM6IFtcbiAqICAgICAgICAgICB7IHRleHQ6ICdyZWdpc3RlcmVkJywgdmFsdWU6ICdyZWdpc3RlcmVkJyB9LFxuICogICAgICAgICAgIHsgdGV4dDogJ2FkbWluJywgdmFsdWU6ICdhZG1pbicgfSxcbiAqICAgICAgICAgICB7IHRleHQ6ICdwcmVtaXVtJywgdmFsdWU6ICdwcmVtaXVtJyB9XG4gKiAgICAgICAgIF1cbiAqICAgICAgIH1dLFxuICogICAgICAgW2NyZWF0ZVN3aXRjaCwgJ2luZm8uZW5hYmxlZCcsIHsgbGFiZWw6ICdFbmFibGVkJyB9XVxuICogICAgIF1cbiAqICAgXSxcbiAqICAgb246IHtcbiAqICAgICBjaGFuZ2U6IChkYXRhKSA9PiBjb25zb2xlLmxvZygnRm9ybSBjaGFuZ2VkOicsIGRhdGEpLFxuICogICAgIHN1Ym1pdDogKGRhdGEpID0+IGNvbnNvbGUubG9nKCdGb3JtIHN1Ym1pdHRlZDonLCBkYXRhKVxuICogICB9XG4gKiB9KVxuICpcbiAqIC8vIEFwcGVuZCB0byBET01cbiAqIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZm9ybS5lbGVtZW50KVxuICpcbiAqIC8vIFNldCBkYXRhXG4gKiBmb3JtLnNldERhdGEoe1xuICogICB1c2VybmFtZTogJ2pvaG5fZG9lJyxcbiAqICAgcm9sZTogJ2FkbWluJyxcbiAqICAgZW5hYmxlZDogdHJ1ZVxuICogfSlcbiAqXG4gKiAvLyBHZXQgZGF0YVxuICogY29uc3QgZGF0YSA9IGZvcm0uZ2V0RGF0YSgpXG4gKlxuICogLy8gQ2hlY2sgaWYgbW9kaWZpZWRcbiAqIGlmIChmb3JtLmlzTW9kaWZpZWQoKSkge1xuICogICBhd2FpdCBmb3JtLnN1Ym1pdCgpXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUZvcm0gPSAoY29uZmlnOiBGb3JtQ29uZmlnID0ge30pOiBGb3JtQ29tcG9uZW50ID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBQcm9jZXNzIGNvbmZpZ3VyYXRpb24gd2l0aCBkZWZhdWx0c1xuICAgIGNvbnN0IGJhc2VDb25maWcgPSBjcmVhdGVCYXNlQ29uZmlnKGNvbmZpZyk7XG5cbiAgICAvLyBCdWlsZCB0aGUgZm9ybSB0aHJvdWdoIGZ1bmN0aW9uYWwgY29tcG9zaXRpb25cbiAgICAvLyBFYWNoIGZ1bmN0aW9uIGluIHRoZSBwaXBlIGFkZHMgc3BlY2lmaWMgY2FwYWJpbGl0aWVzXG4gICAgY29uc3QgY29tcG9uZW50ID0gcGlwZShcbiAgICAgIC8vIDEuIEZvdW5kYXRpb24gbGF5ZXIgLSBCYXNlIGNvbXBvbmVudCB3aXRoIGNvbmZpZ1xuICAgICAgY3JlYXRlQmFzZSxcblxuICAgICAgLy8gMi4gRXZlbnQgc3lzdGVtIC0gQWRkcyBvbi9vZmYvZW1pdCBtZXRob2RzXG4gICAgICB3aXRoRXZlbnRzKCksXG5cbiAgICAgIC8vIDMuIERPTSBlbGVtZW50IC0gQ3JlYXRlcyB0aGUgcm9vdCBjb250YWluZXIgZWxlbWVudFxuICAgICAgd2l0aEVsZW1lbnQoZ2V0RWxlbWVudENvbmZpZyhiYXNlQ29uZmlnKSksXG5cbiAgICAgIC8vIDQuIExheW91dCAtIENyZWF0ZXMgZm9ybSBlbGVtZW50IGFuZCBwcm9jZXNzZXMgbGF5b3V0IHNjaGVtYVxuICAgICAgd2l0aExheW91dChiYXNlQ29uZmlnKSxcblxuICAgICAgLy8gNS4gRmllbGRzIC0gRXh0cmFjdHMgZmllbGRzIGZyb20gbGF5b3V0IGFuZCBjcmVhdGVzIHJlZ2lzdHJ5XG4gICAgICB3aXRoRmllbGRzKGJhc2VDb25maWcpLFxuXG4gICAgICAvLyA2LiBEYXRhIC0gQWRkcyBkYXRhIG1hbmFnZW1lbnQgKGdldC9zZXQsIGNoYW5nZSB0cmFja2luZylcbiAgICAgIHdpdGhEYXRhKGJhc2VDb25maWcpLFxuXG4gICAgICAvLyA3LiBDb250cm9sbGVyIC0gQWRkcyBtb2RlIG1hbmFnZW1lbnQgKHJlYWQvY3JlYXRlL3VwZGF0ZSlcbiAgICAgIHdpdGhDb250cm9sbGVyKGJhc2VDb25maWcpLFxuXG4gICAgICAvLyA4LiBTdWJtaXQgLSBBZGRzIHZhbGlkYXRpb24gYW5kIHN1Ym1pc3Npb24gaGFuZGxpbmdcbiAgICAgIHdpdGhTdWJtaXQoYmFzZUNvbmZpZyksXG5cbiAgICAgIC8vIDkuIFByb3RlY3Rpb24gLSBBZGRzIGJsb2NraW5nIG92ZXJsYXkgd2hlbiBmb3JtIGhhcyB1bnNhdmVkIGNoYW5nZXNcbiAgICAgIHdpdGhQcm90ZWN0aW9uKGJhc2VDb25maWcpLFxuXG4gICAgICAvLyAxMC4gTGlmZWN5Y2xlIC0gQWRkcyBsaWZlY3ljbGUgbWFuYWdlbWVudCAoZGVzdHJveSlcbiAgICAgIHdpdGhMaWZlY3ljbGUoKSxcblxuICAgICAgLy8gMTEuIEFQSSAtIENyZWF0ZXMgY2xlYW4gcHVibGljIEFQSVxuICAgICAgd2l0aEFQSShiYXNlQ29uZmlnKSxcbiAgICApKGJhc2VDb25maWcpO1xuXG4gICAgLy8gQXBwZW5kIHRvIGNvbnRhaW5lciBpZiBwcm92aWRlZFxuICAgIGlmIChjb25maWcuY29udGFpbmVyICYmIGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICBjb25maWcuY29udGFpbmVyLmFwcGVuZENoaWxkKGNvbXBvbmVudC5lbGVtZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcG9uZW50IGFzIEZvcm1Db21wb25lbnQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkZvcm0gY3JlYXRpb24gZXJyb3I6XCIsIGVycm9yKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgZm9ybTogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUZvcm07XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL2Zvcm0vZmVhdHVyZXMvbGF5b3V0LnRzXG5cbi8qKlxuICogTGF5b3V0IGZlYXR1cmUgZm9yIEZvcm0gY29tcG9uZW50XG4gKiBCdWlsZHMgdGhlIGZvcm0gc3RydWN0dXJlIGZyb20gYSBsYXlvdXQgc2NoZW1hIHVzaW5nIG10cmwtYWRkb25zIGxheW91dCBzeXN0ZW1cbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVMYXlvdXQgfSBmcm9tIFwiLi4vLi4vLi4vY29yZS9sYXlvdXRcIjtcbmltcG9ydCB0eXBlIHsgRm9ybUNvbmZpZywgQmFzZUZvcm1Db21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IEZPUk1fREVGQVVMVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbi8vIFNjcm9sbCB0aHJlc2hvbGQgaW4gcGl4ZWxzXG5jb25zdCBTQ1JPTExFRF9USFJFU0hPTEQgPSAxO1xuXG4vLyBDU1MgY2xhc3MgbmFtZXNcbmNvbnN0IFNDUk9MTEVEX0NMQVNTID0gXCJtdHJsLWZvcm0tLXNjcm9sbGVkXCI7XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgZm9ybSBlbGVtZW50XG4gKi9cbmNvbnN0IGNyZWF0ZUZvcm1FbGVtZW50ID0gKGNvbmZpZzogRm9ybUNvbmZpZyk6IEhUTUxGb3JtRWxlbWVudCA9PiB7XG4gIGNvbnN0IGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZm9ybVwiKTtcblxuICBpZiAoY29uZmlnLm1ldGhvZCkge1xuICAgIGZvcm0uc2V0QXR0cmlidXRlKFwibWV0aG9kXCIsIGNvbmZpZy5tZXRob2QpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5hY3Rpb24pIHtcbiAgICBmb3JtLnNldEF0dHJpYnV0ZShcImFjdGlvblwiLCBjb25maWcuYWN0aW9uKTtcbiAgfVxuXG4gIGlmIChjb25maWcuYXV0b2NvbXBsZXRlKSB7XG4gICAgZm9ybS5zZXRBdHRyaWJ1dGUoXCJhdXRvY29tcGxldGVcIiwgY29uZmlnLmF1dG9jb21wbGV0ZSk7XG4gIH1cblxuICAvLyBQcmV2ZW50IGRlZmF1bHQgZm9ybSBzdWJtaXNzaW9uIC0gd2UgaGFuZGxlIGl0IHByb2dyYW1tYXRpY2FsbHlcbiAgZm9ybS5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIChlKSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9KTtcblxuICByZXR1cm4gZm9ybTtcbn07XG5cbi8qKlxuICogUHJvY2Vzc2VzIGxheW91dCBzY2hlbWEgYW5kIGV4dHJhY3RzIG5hbWVkIGNvbXBvbmVudHNcbiAqL1xuY29uc3QgcHJvY2Vzc0xheW91dFNjaGVtYSA9IChcbiAgc2NoZW1hOiB1bmtub3duW10sXG4gIGZvcm06IEhUTUxGb3JtRWxlbWVudCxcbiAgY29uZmlnOiBGb3JtQ29uZmlnLFxuKTogeyB1aTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGxheW91dFJlc3VsdDogdW5rbm93biB9ID0+IHtcbiAgaWYgKCFzY2hlbWEgfHwgIUFycmF5LmlzQXJyYXkoc2NoZW1hKSB8fCBzY2hlbWEubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHsgdWk6IHt9LCBsYXlvdXRSZXN1bHQ6IG51bGwgfTtcbiAgfVxuXG4gIC8vIFVzZSBtdHJsLWFkZG9ucyBjcmVhdGVMYXlvdXQgdG8gcHJvY2VzcyB0aGUgc2NoZW1hXG4gIGNvbnN0IGxheW91dFJlc3VsdCA9IGNyZWF0ZUxheW91dChzY2hlbWEsIGZvcm0sIHt9KTtcblxuICAvLyBFeHRyYWN0IG5hbWVkIGNvbXBvbmVudHMgZnJvbSBsYXlvdXQgcmVzdWx0XG4gIGNvbnN0IHVpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gIGlmIChsYXlvdXRSZXN1bHQgJiYgdHlwZW9mIGxheW91dFJlc3VsdCA9PT0gXCJvYmplY3RcIikge1xuICAgIC8vIFRoZSBsYXlvdXQgcmVzdWx0IGNvbnRhaW5zIGNvbXBvbmVudCByZWZlcmVuY2VzXG4gICAgY29uc3QgcmVzdWx0ID0gbGF5b3V0UmVzdWx0IGFzIHsgY29tcG9uZW50PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfTtcbiAgICBpZiAocmVzdWx0LmNvbXBvbmVudCkge1xuICAgICAgT2JqZWN0LmFzc2lnbih1aSwgcmVzdWx0LmNvbXBvbmVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgdWksIGxheW91dFJlc3VsdCB9O1xufTtcblxuLyoqXG4gKiBTZXRzIHVwIHNjcm9sbCBkZXRlY3Rpb24gb24gYm9keSBlbGVtZW50cyB0byB0b2dnbGUgLS1zY3JvbGxlZCBjbGFzcyBvbiBmb3JtIGNvbnRhaW5lclxuICovXG5jb25zdCBzZXR1cFNjcm9sbEluZGljYXRvciA9IChcbiAgZm9ybTogSFRNTEZvcm1FbGVtZW50LFxuICBmb3JtQ29udGFpbmVyOiBIVE1MRWxlbWVudCxcbik6ICgoKSA9PiB2b2lkKSA9PiB7XG4gIGNvbnN0IGNsZWFudXBGbnM6IEFycmF5PCgpID0+IHZvaWQ+ID0gW107XG5cbiAgLy8gRmluZCBib2R5IGVsZW1lbnQgdG8gY2FsY3VsYXRlIHNoYWRvdyBwb3NpdGlvblxuICBjb25zdCBib2R5RWxlbWVudCA9IGZvcm0ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oXCIubXRybC1ib2R5XCIpO1xuICBpZiAoYm9keUVsZW1lbnQpIHtcbiAgICAvLyBTZXQgQ1NTIHZhcmlhYmxlIGZvciBzaGFkb3cgcG9zaXRpb25pbmcgYXQgdG9wIG9mIGJvZHlcbiAgICBjb25zdCB1cGRhdGVCb2R5VG9wID0gKCkgPT4ge1xuICAgICAgY29uc3QgYm9keVRvcCA9IGJvZHlFbGVtZW50Lm9mZnNldFRvcDtcbiAgICAgIGZvcm1Db250YWluZXIuc3R5bGUuc2V0UHJvcGVydHkoXCItLW10cmwtZm9ybS1ib2R5LXRvcFwiLCBgJHtib2R5VG9wfXB4YCk7XG4gICAgfTtcbiAgICB1cGRhdGVCb2R5VG9wKCk7XG5cbiAgICAvLyBVcGRhdGUgb24gcmVzaXplXG4gICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIodXBkYXRlQm9keVRvcCk7XG4gICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShmb3JtKTtcblxuICAgIGNsZWFudXBGbnMucHVzaCgoKSA9PiB7XG4gICAgICByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICBmb3JtQ29udGFpbmVyLnN0eWxlLnJlbW92ZVByb3BlcnR5KFwiLS1tdHJsLWZvcm0tYm9keS10b3BcIik7XG4gICAgfSk7XG4gIH1cblxuICAvLyBGaW5kIGJvZHkgZWxlbWVudHMgKG10cmwtYm9keSBjbGFzcyBhZGRlZCBieSBsYXlvdXQgc3lzdGVtKVxuICBjb25zdCBib2R5RWxlbWVudHMgPSBmb3JtLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KFwiLm10cmwtYm9keVwiKTtcblxuICBib2R5RWxlbWVudHMuZm9yRWFjaCgoYm9keUVsZW1lbnQpID0+IHtcbiAgICBsZXQgaXNTY3JvbGxlZCA9IGZhbHNlO1xuXG4gICAgY29uc3QgaGFuZGxlU2Nyb2xsID0gKCkgPT4ge1xuICAgICAgY29uc3Qgc2hvdWxkQmVTY3JvbGxlZCA9IGJvZHlFbGVtZW50LnNjcm9sbFRvcCA+IFNDUk9MTEVEX1RIUkVTSE9MRDtcbiAgICAgIGlmIChzaG91bGRCZVNjcm9sbGVkICE9PSBpc1Njcm9sbGVkKSB7XG4gICAgICAgIGlzU2Nyb2xsZWQgPSBzaG91bGRCZVNjcm9sbGVkO1xuICAgICAgICBmb3JtQ29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUoU0NST0xMRURfQ0xBU1MsIHNob3VsZEJlU2Nyb2xsZWQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBJbml0aWFsIGNoZWNrXG4gICAgaGFuZGxlU2Nyb2xsKCk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIHNjcm9sbCBldmVudHNcbiAgICBib2R5RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIGhhbmRsZVNjcm9sbCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXG4gICAgY2xlYW51cEZucy5wdXNoKCgpID0+IHtcbiAgICAgIGJvZHlFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgaGFuZGxlU2Nyb2xsKTtcbiAgICAgIGZvcm1Db250YWluZXIuY2xhc3NMaXN0LnJlbW92ZShTQ1JPTExFRF9DTEFTUyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIFJldHVybiBjbGVhbnVwIGZ1bmN0aW9uXG4gIHJldHVybiAoKSA9PiB7XG4gICAgY2xlYW51cEZucy5mb3JFYWNoKChmbikgPT4gZm4oKSk7XG4gIH07XG59O1xuXG4vKipcbiAqIHdpdGhMYXlvdXQgZmVhdHVyZVxuICogQWRkcyBmb3JtIGVsZW1lbnQgY3JlYXRpb24gYW5kIGxheW91dCBwcm9jZXNzaW5nXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoTGF5b3V0ID0gKGNvbmZpZzogRm9ybUNvbmZpZykgPT4ge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBCYXNlRm9ybUNvbXBvbmVudD4oXG4gICAgY29tcG9uZW50OiBULFxuICApOiBUICYge1xuICAgIGZvcm06IEhUTUxGb3JtRWxlbWVudDtcbiAgICB1aTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgbGF5b3V0UmVzdWx0OiB1bmtub3duO1xuICAgIF9jbGVhbnVwU2Nyb2xsSW5kaWNhdG9yPzogKCkgPT4gdm9pZDtcbiAgfSA9PiB7XG4gICAgLy8gQ3JlYXRlIHRoZSBmb3JtIGVsZW1lbnRcbiAgICBjb25zdCBmb3JtID0gY3JlYXRlRm9ybUVsZW1lbnQoY29uZmlnKTtcblxuICAgIC8vIEFwcGVuZCBmb3JtIHRvIGNvbXBvbmVudCdzIHJvb3QgZWxlbWVudFxuICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgY29tcG9uZW50LmVsZW1lbnQuYXBwZW5kQ2hpbGQoZm9ybSk7XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyBsYXlvdXQgc2NoZW1hIGlmIHByb3ZpZGVkXG4gICAgY29uc3QgeyB1aSwgbGF5b3V0UmVzdWx0IH0gPSBjb25maWcubGF5b3V0XG4gICAgICA/IHByb2Nlc3NMYXlvdXRTY2hlbWEoY29uZmlnLmxheW91dCwgZm9ybSwgY29uZmlnKVxuICAgICAgOiB7IHVpOiB7fSwgbGF5b3V0UmVzdWx0OiBudWxsIH07XG5cbiAgICAvLyBTZXR1cCBzY3JvbGwgaW5kaWNhdG9yIG9uIGJvZHkgZWxlbWVudHNcbiAgICBjb25zdCBjbGVhbnVwU2Nyb2xsSW5kaWNhdG9yID0gc2V0dXBTY3JvbGxJbmRpY2F0b3IoXG4gICAgICBmb3JtLFxuICAgICAgY29tcG9uZW50LmVsZW1lbnQsXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBmb3JtLFxuICAgICAgdWksXG4gICAgICBsYXlvdXRSZXN1bHQsXG4gICAgICBfY2xlYW51cFNjcm9sbEluZGljYXRvcjogY2xlYW51cFNjcm9sbEluZGljYXRvcixcbiAgICB9O1xuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgd2l0aExheW91dDtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9jb25zdGFudHMudHNcblxuLyoqXG4gKiBEYXRhIHN0YXRlIGNvbnN0YW50c1xuICogVHJhY2tzIHdoZXRoZXIgZm9ybSBkYXRhIGhhcyBiZWVuIG1vZGlmaWVkIGZyb20gaW5pdGlhbCBzdGF0ZVxuICovXG5leHBvcnQgY29uc3QgREFUQV9TVEFURSA9IHtcbiAgLyoqIERhdGEgbWF0Y2hlcyBpbml0aWFsIHN0YXRlIC0gbm8gY2hhbmdlcyBtYWRlICovXG4gIFBSSVNUSU5FOiBcInByaXN0aW5lXCIsXG4gIC8qKiBEYXRhIGhhcyBiZWVuIG1vZGlmaWVkIGZyb20gaW5pdGlhbCBzdGF0ZSAqL1xuICBESVJUWTogXCJkaXJ0eVwiLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBGb3JtIGV2ZW50IGNvbnN0YW50c1xuICovXG5leHBvcnQgY29uc3QgRk9STV9FVkVOVFMgPSB7XG4gIC8qKiBGaXJlZCB3aGVuIGFueSBmaWVsZCB2YWx1ZSBjaGFuZ2VzICovXG4gIENIQU5HRTogXCJjaGFuZ2VcIixcbiAgLyoqIEZpcmVkIHdoZW4gZm9ybSBpcyBzdWJtaXR0ZWQgKi9cbiAgU1VCTUlUOiBcInN1Ym1pdFwiLFxuICAvKiogRmlyZWQgd2hlbiBkYXRhIHN0YXRlIGNoYW5nZXMgKHByaXN0aW5lIDwtPiBkaXJ0eSkgKi9cbiAgU1RBVEVfQ0hBTkdFOiBcInN0YXRlOmNoYW5nZVwiLFxuICAvKiogRmlyZWQgd2hlbiBkYXRhIGlzIHNldCBvbiB0aGUgZm9ybSAqL1xuICBEQVRBX1NFVDogXCJkYXRhOnNldFwiLFxuICAvKiogRmlyZWQgd2hlbiBkYXRhIGlzIHJldHJpZXZlZCBmcm9tIHRoZSBmb3JtICovXG4gIERBVEFfR0VUOiBcImRhdGE6Z2V0XCIsXG4gIC8qKiBGaXJlZCB3aGVuIGEgc3BlY2lmaWMgZmllbGQgY2hhbmdlcyAqL1xuICBGSUVMRF9DSEFOR0U6IFwiZmllbGQ6Y2hhbmdlXCIsXG4gIC8qKiBGaXJlZCB3aGVuIHZhbGlkYXRpb24gZmFpbHMgKi9cbiAgVkFMSURBVElPTl9FUlJPUjogXCJ2YWxpZGF0aW9uOmVycm9yXCIsXG4gIC8qKiBGaXJlZCB3aGVuIHN1Ym1pdCBzdWNjZWVkcyAqL1xuICBTVUJNSVRfU1VDQ0VTUzogXCJzdWJtaXQ6c3VjY2Vzc1wiLFxuICAvKiogRmlyZWQgd2hlbiBzdWJtaXQgZmFpbHMgKi9cbiAgU1VCTUlUX0VSUk9SOiBcInN1Ym1pdDplcnJvclwiLFxuICAvKiogRmlyZWQgd2hlbiBmb3JtIGlzIHJlc2V0IHRvIGluaXRpYWwgc3RhdGUgKi9cbiAgUkVTRVQ6IFwicmVzZXRcIixcbiAgLyoqIEZpcmVkIHdoZW4gc2V0RGF0YSBpcyBjYWxsZWQgd2l0aCB1bnNhdmVkIGNoYW5nZXMgKHByb3RlY3Rpb24gZW5hYmxlZCkgKi9cbiAgREFUQV9DT05GTElDVDogXCJkYXRhOmNvbmZsaWN0XCIsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIEZvcm0gQ1NTIGNsYXNzIG1vZGlmaWVyc1xuICovXG5leHBvcnQgY29uc3QgRk9STV9DTEFTU0VTID0ge1xuICAvKiogQXBwbGllZCB3aGVuIGRhdGEgaGFzIGJlZW4gbW9kaWZpZWQgKi9cbiAgTU9ESUZJRUQ6IFwibW9kaWZpZWRcIixcbiAgLyoqIEFwcGxpZWQgd2hlbiBmb3JtIGlzIHN1Ym1pdHRpbmcgKi9cbiAgU1VCTUlUVElORzogXCJzdWJtaXR0aW5nXCIsXG4gIC8qKiBBcHBsaWVkIHdoZW4gZm9ybSBpcyBkaXNhYmxlZCAqL1xuICBESVNBQkxFRDogXCJkaXNhYmxlZFwiLFxuICAvKiogQXBwbGllZCB3aGVuIGZvcm0gYm9keSBpcyBzY3JvbGxlZCBhd2F5IGZyb20gdG9wICovXG4gIFNDUk9MTEVEOiBcIm10cmwtZm9ybS0tc2Nyb2xsZWRcIixcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogRGVmYXVsdCBmb3JtIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IEZPUk1fREVGQVVMVFMgPSB7XG4gIHByZWZpeDogXCJtdHJsXCIsXG4gIGNvbXBvbmVudE5hbWU6IFwiZm9ybVwiLFxuICB0YWc6IFwiZGl2XCIsXG4gIGZvcm1UYWc6IFwiZm9ybVwiLFxuICBtZXRob2Q6IFwiUE9TVFwiLFxuICBhdXRvY29tcGxldGU6IFwib2ZmXCIsXG4gIHVzZUNoYW5nZXM6IHRydWUsXG4gIGNvbnRyb2xzOiBbXCJzdWJtaXRcIiwgXCJjYW5jZWxcIl0sXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIEZpZWxkIG5hbWUgcHJlZml4ZXMgdXNlZCBmb3IgZXh0cmFjdGlvblxuICovXG5leHBvcnQgY29uc3QgRklFTERfUFJFRklYRVMgPSB7XG4gIElORk86IFwiaW5mby5cIixcbiAgRklMRTogXCJmaWxlLlwiLFxuICBEQVRBOiBcImRhdGEuXCIsXG59IGFzIGNvbnN0O1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2NvbmZpZy50c1xuXG5pbXBvcnQgdHlwZSB7IEZvcm1Db25maWcsIEZvcm1TdGF0ZSwgRm9ybURhdGEgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRk9STV9ERUZBVUxUUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG4vLyBSZS1leHBvcnQgRk9STV9ERUZBVUxUUyBmb3IgdXNlIGluIG90aGVyIG1vZHVsZXNcbmV4cG9ydCB7IEZPUk1fREVGQVVMVFMgfTtcblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBiYXNlIGNvbmZpZ3VyYXRpb24gd2l0aCBkZWZhdWx0cyBhcHBsaWVkXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVCYXNlQ29uZmlnID0gKGNvbmZpZzogRm9ybUNvbmZpZyA9IHt9KTogRm9ybUNvbmZpZyA9PiB7XG4gIHJldHVybiB7XG4gICAgLi4uRk9STV9ERUZBVUxUUyxcbiAgICAuLi5jb25maWcsXG4gICAgcHJlZml4OiBjb25maWcucHJlZml4IHx8IEZPUk1fREVGQVVMVFMucHJlZml4LFxuICAgIGNvbXBvbmVudE5hbWU6IGNvbmZpZy5jb21wb25lbnROYW1lIHx8IEZPUk1fREVGQVVMVFMuY29tcG9uZW50TmFtZSxcbiAgICBjb250cm9sczpcbiAgICAgIGNvbmZpZy5jb250cm9scyAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gY29uZmlnLmNvbnRyb2xzXG4gICAgICAgIDogWy4uLkZPUk1fREVGQVVMVFMuY29udHJvbHNdLFxuICAgIHN5c2luZm86IGNvbmZpZy5zeXNpbmZvIHx8IFtdLFxuICAgIHZhbGlkYXRpb246IGNvbmZpZy52YWxpZGF0aW9uIHx8IFtdLFxuICAgIG9uOiBjb25maWcub24gfHwge30sXG4gIH07XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGluaXRpYWwgZm9ybSBzdGF0ZVxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlSW5pdGlhbFN0YXRlID0gKGNvbmZpZzogRm9ybUNvbmZpZyk6IEZvcm1TdGF0ZSA9PiB7XG4gIGNvbnN0IGluaXRpYWxEYXRhID0gY29uZmlnLmRhdGEgPyB7IC4uLmNvbmZpZy5kYXRhIH0gOiB7fTtcblxuICByZXR1cm4ge1xuICAgIG1vZGlmaWVkOiBmYWxzZSxcbiAgICBzdWJtaXR0aW5nOiBmYWxzZSxcbiAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgaW5pdGlhbERhdGEsXG4gICAgY3VycmVudERhdGE6IHsgLi4uaW5pdGlhbERhdGEgfSxcbiAgICBlcnJvcnM6IHt9LFxuICB9O1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBlbGVtZW50IGNvbmZpZ3VyYXRpb24gZm9yIHdpdGhFbGVtZW50XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFbGVtZW50Q29uZmlnID0gKGNvbmZpZzogRm9ybUNvbmZpZykgPT4ge1xuICBjb25zdCBwcmVmaXggPSBjb25maWcucHJlZml4IHx8IEZPUk1fREVGQVVMVFMucHJlZml4O1xuICBjb25zdCBjb21wb25lbnROYW1lID0gY29uZmlnLmNvbXBvbmVudE5hbWUgfHwgRk9STV9ERUZBVUxUUy5jb21wb25lbnROYW1lO1xuXG4gIGNvbnN0IGNsYXNzTmFtZXMgPSBbYCR7cHJlZml4fS0ke2NvbXBvbmVudE5hbWV9YF07XG5cbiAgaWYgKGNvbmZpZy5jbGFzcykge1xuICAgIGNsYXNzTmFtZXMucHVzaChjb25maWcuY2xhc3MpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0YWc6IFwiZGl2XCIsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzLmpvaW4oXCIgXCIpLFxuICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgIFwiZGF0YS1jb21wb25lbnRcIjogY29tcG9uZW50TmFtZSxcbiAgICB9LFxuICB9O1xufTtcblxuLyoqXG4gKiBFeHRyYWN0cyBmaWVsZCBuYW1lIGZyb20gYSBwcmVmaXhlZCBuYW1lIChlLmcuLCAnaW5mby51c2VybmFtZScgLT4gJ3VzZXJuYW1lJylcbiAqL1xuZXhwb3J0IGNvbnN0IGV4dHJhY3RGaWVsZE5hbWUgPSAocHJlZml4ZWROYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBwYXJ0cyA9IHByZWZpeGVkTmFtZS5zcGxpdChcIi5cIik7XG4gIHJldHVybiBwYXJ0cy5sZW5ndGggPiAxID8gcGFydHMuc2xpY2UoMSkuam9pbihcIi5cIikgOiBwcmVmaXhlZE5hbWU7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIGZ1bGwgZmllbGQgcGF0aCBpbmNsdWRpbmcgcHJlZml4XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRGaWVsZFBhdGggPSAobmFtZTogc3RyaW5nLCBwcmVmaXg6IHN0cmluZyA9IFwiaW5mb1wiKTogc3RyaW5nID0+IHtcbiAgaWYgKG5hbWUuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cbiAgcmV0dXJuIGAke3ByZWZpeH0uJHtuYW1lfWA7XG59O1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIG5hbWUgaXMgYSBmaWVsZCBuYW1lIChzdGFydHMgd2l0aCBpbmZvLiBvciBkYXRhLilcbiAqL1xuZXhwb3J0IGNvbnN0IGlzRmllbGROYW1lID0gKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gbmFtZS5zdGFydHNXaXRoKFwiaW5mby5cIikgfHwgbmFtZS5zdGFydHNXaXRoKFwiZGF0YS5cIik7XG59O1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIG5hbWUgaXMgYSBmaWxlIGZpZWxkIG5hbWVcbiAqL1xuZXhwb3J0IGNvbnN0IGlzRmlsZU5hbWUgPSAobmFtZTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiBuYW1lLnN0YXJ0c1dpdGgoXCJmaWxlLlwiKTtcbn07XG5cbi8qKlxuICogRGVlcCBjb21wYXJpc29uIG9mIHR3byB2YWx1ZXMgZm9yIGNoYW5nZSBkZXRlY3Rpb25cbiAqL1xuZXhwb3J0IGNvbnN0IGlzVmFsdWVFcXVhbCA9IChhOiB1bmtub3duLCBiOiB1bmtub3duKTogYm9vbGVhbiA9PiB7XG4gIC8vIEhhbmRsZSBudWxsL3VuZGVmaW5lZFxuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG4gIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gYSA9PSBiO1xuXG4gIC8vIEhhbmRsZSBhcnJheXNcbiAgaWYgKEFycmF5LmlzQXJyYXkoYSkgJiYgQXJyYXkuaXNBcnJheShiKSkge1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gYS5ldmVyeSgodmFsLCBpZHgpID0+IGlzVmFsdWVFcXVhbCh2YWwsIGJbaWR4XSkpO1xuICB9XG5cbiAgLy8gSGFuZGxlIG9iamVjdHNcbiAgaWYgKHR5cGVvZiBhID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBiID09PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3Qga2V5c0EgPSBPYmplY3Qua2V5cyhhIGFzIG9iamVjdCk7XG4gICAgY29uc3Qga2V5c0IgPSBPYmplY3Qua2V5cyhiIGFzIG9iamVjdCk7XG4gICAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGtleXNBLmV2ZXJ5KChrZXkpID0+XG4gICAgICBpc1ZhbHVlRXF1YWwoXG4gICAgICAgIChhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldLFxuICAgICAgICAoYiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBwcmltaXRpdmVzICh3aXRoIHR5cGUgY29lcmNpb24gZm9yIHN0cmluZy9udW1iZXIgY29tcGFyaXNvbilcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuICByZXR1cm4gYSA9PSBiO1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgZm9ybSBkYXRhIGhhcyBiZWVuIG1vZGlmaWVkIGZyb20gaW5pdGlhbCBzdGF0ZVxuICovXG5leHBvcnQgY29uc3QgaGFzRGF0YUNoYW5nZWQgPSAoXG4gIGluaXRpYWw6IEZvcm1EYXRhLFxuICBjdXJyZW50OiBGb3JtRGF0YSxcbik6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBhbGxLZXlzID0gbmV3IFNldChbLi4uT2JqZWN0LmtleXMoaW5pdGlhbCksIC4uLk9iamVjdC5rZXlzKGN1cnJlbnQpXSk7XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgYWxsS2V5cykge1xuICAgIGlmICghaXNWYWx1ZUVxdWFsKGluaXRpYWxba2V5XSwgY3VycmVudFtrZXldKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBHZXRzIG9ubHkgdGhlIG1vZGlmaWVkIGZpZWxkcyBiZXR3ZWVuIGluaXRpYWwgYW5kIGN1cnJlbnQgZGF0YVxuICovXG5leHBvcnQgY29uc3QgZ2V0TW9kaWZpZWRGaWVsZHMgPSAoXG4gIGluaXRpYWw6IEZvcm1EYXRhLFxuICBjdXJyZW50OiBGb3JtRGF0YSxcbik6IEZvcm1EYXRhID0+IHtcbiAgY29uc3QgbW9kaWZpZWQ6IEZvcm1EYXRhID0ge307XG4gIGNvbnN0IGFsbEtleXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhpbml0aWFsKSwgLi4uT2JqZWN0LmtleXMoY3VycmVudCldKTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBhbGxLZXlzKSB7XG4gICAgaWYgKCFpc1ZhbHVlRXF1YWwoaW5pdGlhbFtrZXldLCBjdXJyZW50W2tleV0pKSB7XG4gICAgICBtb2RpZmllZFtrZXldID0gY3VycmVudFtrZXldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtb2RpZmllZDtcbn07XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL2Zvcm0vZmVhdHVyZXMvZmllbGRzLnRzXG5cbi8qKlxuICogRmllbGRzIGZlYXR1cmUgZm9yIEZvcm0gY29tcG9uZW50XG4gKiBFeHRyYWN0cyBmaWVsZHMgZnJvbSBsYXlvdXQgYW5kIG1hbmFnZXMgdGhlIGZpZWxkIHJlZ2lzdHJ5XG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBGb3JtQ29uZmlnLFxuICBCYXNlRm9ybUNvbXBvbmVudCxcbiAgRm9ybUZpZWxkLFxuICBGb3JtRmllbGRSZWdpc3RyeSxcbiAgRmllbGRWYWx1ZSxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBpc0ZpZWxkTmFtZSwgaXNGaWxlTmFtZSwgZXh0cmFjdEZpZWxkTmFtZSB9IGZyb20gXCIuLi9jb25maWdcIjtcblxuLyoqXG4gKiBDaGVja3MgaWYgYW4gb2JqZWN0IGlzIGEgdmFsaWQgZm9ybSBmaWVsZCBjb21wb25lbnRcbiAqIEEgZm9ybSBmaWVsZCBtdXN0IGhhdmUgYXQgbGVhc3QgZ2V0VmFsdWUgb3Igc2V0VmFsdWUgbWV0aG9kXG4gKi9cbmNvbnN0IGlzRm9ybUZpZWxkID0gKG9iajogdW5rbm93bik6IG9iaiBpcyBGb3JtRmllbGQgPT4ge1xuICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgY2FuZGlkYXRlID0gb2JqIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8vIE11c3QgaGF2ZSBlbGVtZW50IHByb3BlcnR5XG4gIGlmICghY2FuZGlkYXRlLmVsZW1lbnQgfHwgIShjYW5kaWRhdGUuZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIE11c3QgaGF2ZSBnZXRWYWx1ZSBvciBzZXRWYWx1ZVxuICByZXR1cm4gKFxuICAgIHR5cGVvZiBjYW5kaWRhdGUuZ2V0VmFsdWUgPT09IFwiZnVuY3Rpb25cIiB8fFxuICAgIHR5cGVvZiBjYW5kaWRhdGUuc2V0VmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICApO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBmcm9tIGEgZmllbGQgY29tcG9uZW50XG4gKiBBbGwgbXRybCBjb21wb25lbnRzIG5vdyBoYXZlIHVuaWZpZWQgZ2V0VmFsdWUoKSBBUEk6XG4gKiAtIFRleHRmaWVsZDogcmV0dXJucyBzdHJpbmdcbiAqIC0gU2VsZWN0OiByZXR1cm5zIHN0cmluZyBvciBzdHJpbmdbXVxuICogLSBDaGlwczogcmV0dXJucyBzdHJpbmdbXVxuICogLSBTd2l0Y2gvQ2hlY2tib3g6IHJldHVybnMgYm9vbGVhbiAodXBkYXRlZCBpbiBtdHJsIGNvcmUpXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRGaWVsZFZhbHVlID0gKGZpZWxkOiBGb3JtRmllbGQpOiBGaWVsZFZhbHVlID0+IHtcbiAgaWYgKHR5cGVvZiBmaWVsZC5nZXRWYWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIGZpZWxkLmdldFZhbHVlKCk7XG4gIH1cblxuICAvLyBGYWxsYmFjazogY2hlY2sgZm9yIHZhbHVlIHByb3BlcnR5XG4gIGNvbnN0IGZpZWxkQW55ID0gZmllbGQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgaWYgKFwidmFsdWVcIiBpbiBmaWVsZEFueSkge1xuICAgIHJldHVybiBmaWVsZEFueS52YWx1ZSBhcyBGaWVsZFZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgdmFsdWUgb24gYSBmaWVsZCBjb21wb25lbnRcbiAqIEFsbCBtdHJsIGNvbXBvbmVudHMgbm93IGhhdmUgdW5pZmllZCBzZXRWYWx1ZSgpIEFQSTpcbiAqIC0gVGV4dGZpZWxkOiBhY2NlcHRzIHN0cmluZ1xuICogLSBTZWxlY3Q6IGFjY2VwdHMgc3RyaW5nIG9yIHN0cmluZ1tdXG4gKiAtIENoaXBzOiBhY2NlcHRzIHN0cmluZ1tdXG4gKiAtIFN3aXRjaC9DaGVja2JveDogYWNjZXB0cyBib29sZWFuIG9yIHN0cmluZyAoXCJ0cnVlXCIvXCJmYWxzZVwiKSAodXBkYXRlZCBpbiBtdHJsIGNvcmUpXG4gKlxuICogRm9yIHNpbGVudCB1cGRhdGVzIChubyBjaGFuZ2UgZXZlbnRzKSwgd2Ugc2V0IGRpcmVjdGx5IG9uIHRoZSBpbnB1dCBlbGVtZW50XG4gKi9cbmV4cG9ydCBjb25zdCBzZXRGaWVsZFZhbHVlID0gKFxuICBmaWVsZDogRm9ybUZpZWxkLFxuICB2YWx1ZTogRmllbGRWYWx1ZSxcbiAgc2lsZW50OiBib29sZWFuID0gZmFsc2UsXG4pOiB2b2lkID0+IHtcbiAgY29uc3QgZmllbGRBbnkgPSBmaWVsZCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBzZWxlY3QgY29tcG9uZW50IChoYXMgdGV4dGZpZWxkIHByb3BlcnR5KVxuICAvLyBTZWxlY3QgY29tcG9uZW50cyBtdXN0IGFsd2F5cyB1c2Ugc2V0VmFsdWUgdG8gdXBkYXRlIGludGVybmFsIHN0YXRlXG4gIGNvbnN0IGlzU2VsZWN0Q29tcG9uZW50ID0gXCJ0ZXh0ZmllbGRcIiBpbiBmaWVsZEFueSAmJiBcIm1lbnVcIiBpbiBmaWVsZEFueTtcblxuICBpZiAoc2lsZW50ICYmICFpc1NlbGVjdENvbXBvbmVudCkge1xuICAgIC8vIFNpbGVudCB1cGRhdGU6IHNldCBkaXJlY3RseSBvbiBpbnB1dCB0byBhdm9pZCB0cmlnZ2VyaW5nIGNoYW5nZSBldmVudHNcbiAgICAvLyBTa2lwIHRoaXMgZm9yIHNlbGVjdCBjb21wb25lbnRzIC0gdGhleSBuZWVkIHNldFZhbHVlIHRvIHVwZGF0ZSBpbnRlcm5hbCBzdGF0ZVxuICAgIGNvbnN0IGlucHV0ID0gZmllbGRBbnkuaW5wdXQgYXNcbiAgICAgIHwgSFRNTElucHV0RWxlbWVudFxuICAgICAgfCBIVE1MVGV4dEFyZWFFbGVtZW50XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBpZiAoaW5wdXQpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBjaGVja2JveC9zd2l0Y2ggKGhhcyBjaGVja2VkIHByb3BlcnR5KVxuICAgICAgLy8gTmVlZCB0byBuYXJyb3cgdHlwZSB0byBIVE1MSW5wdXRFbGVtZW50IGJlZm9yZSBhY2Nlc3NpbmcgY2hlY2tlZFxuICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiBpbnB1dC50eXBlID09PSBcImNoZWNrYm94XCIpIHtcbiAgICAgICAgY29uc3Qgc2hvdWxkQmVDaGVja2VkID1cbiAgICAgICAgICB2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gXCJ0cnVlXCIgfHwgdmFsdWUgPT09IDE7XG4gICAgICAgIGlucHV0LmNoZWNrZWQgPSBzaG91bGRCZUNoZWNrZWQ7XG4gICAgICAgIC8vIFVwZGF0ZSB2aXN1YWwgc3RhdGUgYnkgdG9nZ2xpbmcgdGhlIGNoZWNrZWQgY2xhc3NcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGZpZWxkQW55LmVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gQXJyYXkuZnJvbShlbGVtZW50LmNsYXNzTGlzdCk7XG4gICAgICAgICAgY29uc3QgYmFzZUNsYXNzID0gY2xhc3NMaXN0LmZpbmQoXG4gICAgICAgICAgICAoYykgPT4gYy5zdGFydHNXaXRoKFwibXRybC1cIikgJiYgIWMuaW5jbHVkZXMoXCItLVwiKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChiYXNlQ2xhc3MpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShgJHtiYXNlQ2xhc3N9LS1jaGVja2VkYCwgc2hvdWxkQmVDaGVja2VkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRleHQgaW5wdXQgLSBzZXQgdmFsdWUgZGlyZWN0bHlcbiAgICAgICAgaW5wdXQudmFsdWUgPSAodmFsdWUgYXMgc3RyaW5nKSA/PyBcIlwiO1xuICAgICAgICAvLyBVcGRhdGUgdmlzdWFsIHN0YXRlIC0gdG9nZ2xlIC0tZW1wdHkgY2xhc3MgYmFzZWQgb24gdmFsdWVcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGZpZWxkQW55LmVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gQXJyYXkuZnJvbShlbGVtZW50LmNsYXNzTGlzdCk7XG4gICAgICAgICAgY29uc3QgYmFzZUNsYXNzID0gY2xhc3NMaXN0LmZpbmQoXG4gICAgICAgICAgICAoYykgPT4gYy5zdGFydHNXaXRoKFwibXRybC1cIikgJiYgIWMuaW5jbHVkZXMoXCItLVwiKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChiYXNlQ2xhc3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzRW1wdHkgPSAhaW5wdXQudmFsdWU7XG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoYCR7YmFzZUNsYXNzfS0tZW1wdHlgLCBpc0VtcHR5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gRm9yIGNvbXBvbmVudHMgd2l0aG91dCBpbnB1dCAobGlrZSBjaGlwcywgc2VsZWN0KSwgZmFsbCB0aHJvdWdoIHRvIHNldFZhbHVlXG4gICAgLy8gYnV0IHN0aWxsIHVzZSBzaWxlbnQgbW9kZSBiZWhhdmlvciAobm8gZXZlbnRzIHRyaWdnZXJlZClcbiAgfVxuXG4gIC8vIE5vcm1hbCB1cGRhdGU6IHVzZSBjb21wb25lbnQncyBzZXRWYWx1ZSBtZXRob2RcbiAgaWYgKHR5cGVvZiBmaWVsZC5zZXRWYWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZmllbGQuc2V0VmFsdWUodmFsdWUpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrOiBzZXQgdmFsdWUgcHJvcGVydHkgZGlyZWN0bHlcbiAgaWYgKFwidmFsdWVcIiBpbiBmaWVsZEFueSkge1xuICAgIGZpZWxkQW55LnZhbHVlID0gdmFsdWU7XG4gIH1cbn07XG5cbi8qKlxuICogRXh0cmFjdHMgZmllbGRzIGZyb20gdGhlIFVJIGNvbXBvbmVudCByZWdpc3RyeVxuICogTG9va3MgZm9yIGNvbXBvbmVudHMgd2l0aCBuYW1lcyBzdGFydGluZyB3aXRoICdpbmZvLicgb3IgJ2RhdGEuJ1xuICovXG5jb25zdCBleHRyYWN0RmllbGRzID0gKFxuICB1aTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGNvbmZpZzogRm9ybUNvbmZpZyxcbik6IHsgZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeTsgZmlsZXM6IEZvcm1GaWVsZFJlZ2lzdHJ5IH0gPT4ge1xuICBjb25zdCBmaWVsZHM6IEZvcm1GaWVsZFJlZ2lzdHJ5ID0gbmV3IE1hcCgpO1xuICBjb25zdCBmaWxlczogRm9ybUZpZWxkUmVnaXN0cnkgPSBuZXcgTWFwKCk7XG5cbiAgaWYgKCF1aSkgcmV0dXJuIHsgZmllbGRzLCBmaWxlcyB9O1xuXG4gIGZvciAoY29uc3QgW25hbWUsIGNvbXBvbmVudF0gb2YgT2JqZWN0LmVudHJpZXModWkpKSB7XG4gICAgLy8gU2tpcCBub24tZmllbGQgY29tcG9uZW50c1xuICAgIGlmICghaXNGb3JtRmllbGQoY29tcG9uZW50KSkgY29udGludWU7XG5cbiAgICBpZiAoaXNGaWVsZE5hbWUobmFtZSkpIHtcbiAgICAgIC8vIEV4dHJhY3QgZmllbGQgbmFtZSB3aXRob3V0IHByZWZpeCAoaW5mby51c2VybmFtZSAtPiB1c2VybmFtZSlcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IGV4dHJhY3RGaWVsZE5hbWUobmFtZSk7XG4gICAgICBmaWVsZHMuc2V0KGZpZWxkTmFtZSwgY29tcG9uZW50KTtcbiAgICB9IGVsc2UgaWYgKGlzRmlsZU5hbWUobmFtZSkpIHtcbiAgICAgIC8vIEV4dHJhY3QgZmlsZSBuYW1lIHdpdGhvdXQgcHJlZml4IChmaWxlLmF2YXRhciAtPiBhdmF0YXIpXG4gICAgICBjb25zdCBmaWxlTmFtZSA9IGV4dHJhY3RGaWVsZE5hbWUobmFtZSk7XG4gICAgICBmaWxlcy5zZXQoZmlsZU5hbWUsIGNvbXBvbmVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgZmllbGRzLCBmaWxlcyB9O1xufTtcblxuLyoqXG4gKiBDb21wYXJlcyB0d28gZmllbGQgdmFsdWVzIGZvciBlcXVhbGl0eVxuICogSGFuZGxlcyBhcnJheXMgKGZvciBjaGlwcy9tdWx0aS1zZWxlY3QpIGFuZCBwcmltaXRpdmUgdmFsdWVzXG4gKi9cbmNvbnN0IHZhbHVlc0VxdWFsID0gKGE6IEZpZWxkVmFsdWUsIGI6IEZpZWxkVmFsdWUpOiBib29sZWFuID0+IHtcbiAgLy8gSGFuZGxlIG51bGwvdW5kZWZpbmVkXG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICAvLyBIYW5kbGUgYXJyYXlzIChjaGlwcywgbXVsdGktc2VsZWN0KVxuICBpZiAoQXJyYXkuaXNBcnJheShhKSAmJiBBcnJheS5pc0FycmF5KGIpKSB7XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBhLmV2ZXJ5KCh2YWwsIGkpID0+IHZhbCA9PT0gYltpXSk7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIEJpbmRzIGNoYW5nZSBhbmQgaW5wdXQgZXZlbnRzIHRvIGZpZWxkc1xuICogQ2FsbHMgdGhlIHByb3ZpZGVkIGNhbGxiYWNrIHdoZW4gYW55IGZpZWxkIGNoYW5nZXNcbiAqXG4gKiBMaXN0ZW5zIHRvIGJvdGggJ2lucHV0JyAoZm9yIGltbWVkaWF0ZSBmZWVkYmFjayB3aGlsZSB0eXBpbmcpXG4gKiBhbmQgJ2NoYW5nZScgKGZvciBjb21wb25lbnRzIHRoYXQgb25seSBlbWl0IG9uIGJsdXIvc2VsZWN0aW9uKVxuICpcbiAqIERlZHVwbGljYXRlcyBldmVudHMgdG8gcHJldmVudCBkb3VibGUtZmlyaW5nIHdoZW4gYm90aCBpbnB1dCBhbmQgY2hhbmdlXG4gKiBlbWl0IGZvciB0aGUgc2FtZSB2YWx1ZSAoZS5nLiwgdGV4dGZpZWxkIGlucHV0IGZvbGxvd2VkIGJ5IGJsdXIpXG4gKi9cbi8qKlxuICogVHJhY2tzIGxhc3QgZW1pdHRlZCB2YWx1ZXMgcGVyIGZpZWxkIGZvciBkZWR1cGxpY2F0aW9uXG4gKiBFeHBvc2VkIHNvIHRoYXQgc2V0RGF0YSBjYW4gdXBkYXRlIGl0IHdoZW4gc2V0dGluZyB2YWx1ZXMgc2lsZW50bHlcbiAqL1xubGV0IGZpZWxkVmFsdWVUcmFja2VyOiBNYXA8c3RyaW5nLCBGaWVsZFZhbHVlPiB8IG51bGwgPSBudWxsO1xuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIHRyYWNrZWQgdmFsdWUgZm9yIGEgZmllbGRcbiAqIENhbGxlZCB3aGVuIHNldERhdGEgaXMgdXNlZCB3aXRoIHNpbGVudD10cnVlIHRvIGtlZXAgZGVkdXBsaWNhdGlvbiBpbiBzeW5jXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVUcmFja2VkRmllbGRWYWx1ZSA9IChcbiAgbmFtZTogc3RyaW5nLFxuICB2YWx1ZTogRmllbGRWYWx1ZSxcbik6IHZvaWQgPT4ge1xuICBpZiAoZmllbGRWYWx1ZVRyYWNrZXIpIHtcbiAgICBmaWVsZFZhbHVlVHJhY2tlci5zZXQobmFtZSwgdmFsdWUpO1xuICB9XG59O1xuXG4vKipcbiAqIFVwZGF0ZXMgYWxsIHRyYWNrZWQgZmllbGQgdmFsdWVzIGZyb20gYSBmaWVsZHMgcmVnaXN0cnlcbiAqIENhbGxlZCBhZnRlciBzaWxlbnQgc2V0RGF0YSB0byBzeW5jIGRlZHVwbGljYXRpb24gc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IHN5bmNUcmFja2VkRmllbGRWYWx1ZXMgPSAoZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeSk6IHZvaWQgPT4ge1xuICBpZiAoZmllbGRWYWx1ZVRyYWNrZXIpIHtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBmaWVsZF0gb2YgZmllbGRzKSB7XG4gICAgICBmaWVsZFZhbHVlVHJhY2tlci5zZXQobmFtZSwgZ2V0RmllbGRWYWx1ZShmaWVsZCkpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBSZXNldHMgdGhlIGZpZWxkIHZhbHVlIHRyYWNrZXIgZm9yIGEgbmV3IGZvcm1cbiAqIFNob3VsZCBiZSBjYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIHdpdGhGaWVsZHMgYmVmb3JlIGJpbmRGaWVsZEV2ZW50c1xuICovXG5leHBvcnQgY29uc3QgcmVzZXRGaWVsZFZhbHVlVHJhY2tlciA9ICgpOiB2b2lkID0+IHtcbiAgZmllbGRWYWx1ZVRyYWNrZXIgPSBuZXcgTWFwPHN0cmluZywgRmllbGRWYWx1ZT4oKTtcbn07XG5cbmNvbnN0IGJpbmRGaWVsZEV2ZW50cyA9IChcbiAgZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeSxcbiAgb25GaWVsZENoYW5nZTogKG5hbWU6IHN0cmluZywgdmFsdWU6IEZpZWxkVmFsdWUpID0+IHZvaWQsXG4pOiB2b2lkID0+IHtcbiAgLy8gVXNlIHRoZSBzaGFyZWQgdHJhY2tlciAoc2hvdWxkIGJlIGluaXRpYWxpemVkIGJ5IHJlc2V0RmllbGRWYWx1ZVRyYWNrZXIgYmVmb3JlIHRoaXMpXG4gIGlmICghZmllbGRWYWx1ZVRyYWNrZXIpIHtcbiAgICBmaWVsZFZhbHVlVHJhY2tlciA9IG5ldyBNYXA8c3RyaW5nLCBGaWVsZFZhbHVlPigpO1xuICB9XG5cbiAgY29uc3QgbGFzdEVtaXR0ZWRWYWx1ZXMgPSBmaWVsZFZhbHVlVHJhY2tlcjtcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBmaWVsZF0gb2YgZmllbGRzKSB7XG4gICAgaWYgKHR5cGVvZiBmaWVsZC5vbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAvLyBJbml0aWFsaXplIHdpdGggY3VycmVudCB2YWx1ZVxuICAgICAgbGFzdEVtaXR0ZWRWYWx1ZXMuc2V0KG5hbWUsIGdldEZpZWxkVmFsdWUoZmllbGQpKTtcblxuICAgICAgLy8gSGFuZGxlciB0aGF0IGRlZHVwZXMgYmFzZWQgb24gdmFsdWVcbiAgICAgIGNvbnN0IGhhbmRsZUNoYW5nZSA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRGaWVsZFZhbHVlKGZpZWxkKTtcbiAgICAgICAgY29uc3QgbGFzdFZhbHVlID0gbGFzdEVtaXR0ZWRWYWx1ZXMuZ2V0KG5hbWUpO1xuXG4gICAgICAgIC8vIE9ubHkgZW1pdCBpZiB2YWx1ZSBhY3R1YWxseSBjaGFuZ2VkXG4gICAgICAgIGlmICghdmFsdWVzRXF1YWwodmFsdWUsIGxhc3RWYWx1ZSkpIHtcbiAgICAgICAgICBsYXN0RW1pdHRlZFZhbHVlcy5zZXQobmFtZSwgdmFsdWUpO1xuICAgICAgICAgIG9uRmllbGRDaGFuZ2UobmFtZSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBMaXN0ZW4gdG8gJ2lucHV0JyBmb3IgaW1tZWRpYXRlIGZlZWRiYWNrICh0ZXh0ZmllbGRzIGVtaXQgdGhpcyBvbiBldmVyeSBrZXlzdHJva2UpXG4gICAgICBmaWVsZC5vbihcImlucHV0XCIsIGhhbmRsZUNoYW5nZSk7XG5cbiAgICAgIC8vIEFsc28gbGlzdGVuIHRvICdjaGFuZ2UnIGZvciBjb21wb25lbnRzIHRoYXQgb25seSBlbWl0IG9uIGJsdXIvc2VsZWN0aW9uXG4gICAgICAvLyAoZS5nLiwgc2VsZWN0LCBjaGlwcywgc3dpdGNoKVxuICAgICAgZmllbGQub24oXCJjaGFuZ2VcIiwgaGFuZGxlQ2hhbmdlKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogd2l0aEZpZWxkcyBmZWF0dXJlXG4gKiBBZGRzIGZpZWxkIGV4dHJhY3Rpb24gYW5kIHJlZ2lzdHJ5IG1hbmFnZW1lbnQgdG8gdGhlIGZvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhGaWVsZHMgPSAoY29uZmlnOiBGb3JtQ29uZmlnKSA9PiB7XG4gIHJldHVybiA8VCBleHRlbmRzIEJhc2VGb3JtQ29tcG9uZW50PihcbiAgICBjb21wb25lbnQ6IFQsXG4gICk6IFQgJiB7XG4gICAgZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeTtcbiAgICBmaWxlczogRm9ybUZpZWxkUmVnaXN0cnk7XG4gICAgZ2V0RmllbGQ6IChuYW1lOiBzdHJpbmcpID0+IEZvcm1GaWVsZCB8IHVuZGVmaW5lZDtcbiAgICBnZXRGaWVsZE5hbWVzOiAoKSA9PiBzdHJpbmdbXTtcbiAgICBoYXNGaWVsZDogKG5hbWU6IHN0cmluZykgPT4gYm9vbGVhbjtcbiAgfSA9PiB7XG4gICAgLy8gRXh0cmFjdCBmaWVsZHMgZnJvbSBVSSByZWdpc3RyeVxuICAgIGNvbnN0IHsgZmllbGRzLCBmaWxlcyB9ID0gZXh0cmFjdEZpZWxkcyhjb21wb25lbnQudWkgfHwge30sIGNvbmZpZyk7XG5cbiAgICAvLyBSZXNldCB0cmFja2VyIGZvciB0aGlzIG5ldyBmb3JtIGluc3RhbmNlXG4gICAgLy8gVGhpcyBlbnN1cmVzIGVhY2ggZm9ybSBoYXMgaXRzIG93biB0cmFja2VyIGFuZCBwcmV2ZW50cyBjcm9zcy1mb3JtIGludGVyZmVyZW5jZVxuICAgIHJlc2V0RmllbGRWYWx1ZVRyYWNrZXIoKTtcblxuICAgIC8vIEJpbmQgY2hhbmdlIGV2ZW50cyBpZiBjb21wb25lbnQgaGFzIGVtaXRcbiAgICBpZiAoY29tcG9uZW50LmVtaXQpIHtcbiAgICAgIGJpbmRGaWVsZEV2ZW50cyhmaWVsZHMsIChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiZmllbGQ6Y2hhbmdlXCIsIHsgbmFtZSwgdmFsdWUgfSk7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJjaGFuZ2VcIiwgeyBuYW1lLCB2YWx1ZSB9KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBbHNvIGJpbmQgY2hhbmdlIGV2ZW50cyB0byBmaWxlIGZpZWxkc1xuICAgICAgYmluZEZpZWxkRXZlbnRzKGZpbGVzLCAobmFtZSwgdmFsdWUpID0+IHtcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImZpbGU6Y2hhbmdlXCIsIHsgbmFtZSwgdmFsdWUgfSk7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJjaGFuZ2VcIiwgeyBuYW1lLCB2YWx1ZSB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBmaWVsZHMsXG4gICAgICBmaWxlcyxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgYSBmaWVsZCBjb21wb25lbnQgYnkgbmFtZVxuICAgICAgICovXG4gICAgICBnZXRGaWVsZChuYW1lOiBzdHJpbmcpOiBGb3JtRmllbGQgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gZmllbGRzLmdldChuYW1lKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IGFsbCBmaWVsZCBuYW1lc1xuICAgICAgICovXG4gICAgICBnZXRGaWVsZE5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZmllbGRzLmtleXMoKSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENoZWNrIGlmIGEgZmllbGQgZXhpc3RzXG4gICAgICAgKi9cbiAgICAgIGhhc0ZpZWxkKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmllbGRzLmhhcyhuYW1lKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhGaWVsZHM7XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL2Zvcm0vZmVhdHVyZXMvZGF0YS50c1xuXG4vKipcbiAqIERhdGEgZmVhdHVyZSBmb3IgRm9ybSBjb21wb25lbnRcbiAqIEhhbmRsZXMgZm9ybSBkYXRhIG9wZXJhdGlvbnM6IGdldC9zZXQgZGF0YSwgY2hhbmdlIHRyYWNraW5nLCBzbmFwc2hvdHMsXG4gKiBhbmQgY2hhbmdlIHByb3RlY3Rpb24gKGJlZm9yZXVubG9hZCB3YXJuaW5nLCBkYXRhIGNvbmZsaWN0IGRldGVjdGlvbilcbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEZvcm1Db25maWcsXG4gIEJhc2VGb3JtQ29tcG9uZW50LFxuICBGb3JtRGF0YSxcbiAgRm9ybVN0YXRlLFxuICBGaWVsZFZhbHVlLFxuICBGb3JtRmllbGRSZWdpc3RyeSxcbiAgUHJvdGVjdENoYW5nZXNDb25maWcsXG4gIERhdGFDb25mbGljdEV2ZW50LFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZUluaXRpYWxTdGF0ZSxcbiAgaGFzRGF0YUNoYW5nZWQsXG4gIGdldE1vZGlmaWVkRmllbGRzLFxufSBmcm9tIFwiLi4vY29uZmlnXCI7XG5pbXBvcnQgeyBnZXRGaWVsZFZhbHVlLCBzZXRGaWVsZFZhbHVlLCBzeW5jVHJhY2tlZEZpZWxkVmFsdWVzIH0gZnJvbSBcIi4vZmllbGRzXCI7XG5pbXBvcnQgeyBGT1JNX0VWRU5UUywgREFUQV9TVEFURSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBDb2xsZWN0cyBjdXJyZW50IHZhbHVlcyBmcm9tIGFsbCBmaWVsZHNcbiAqL1xuY29uc3QgY29sbGVjdEZpZWxkRGF0YSA9IChmaWVsZHM6IEZvcm1GaWVsZFJlZ2lzdHJ5KTogRm9ybURhdGEgPT4ge1xuICBjb25zdCBkYXRhOiBGb3JtRGF0YSA9IHt9O1xuXG4gIGZvciAoY29uc3QgW25hbWUsIGZpZWxkXSBvZiBmaWVsZHMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGdldEZpZWxkVmFsdWUoZmllbGQpO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkYXRhW25hbWVdID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRhdGE7XG59O1xuXG4vKipcbiAqIFNldHMgdmFsdWVzIG9uIGZpZWxkcyBmcm9tIGEgZGF0YSBvYmplY3RcbiAqIFN1cHBvcnRzIGRvdCBub3RhdGlvbiBmb3IgbmVzdGVkIHZhbHVlcyAoZS5nLiwgeyAndXNlci5uYW1lJzogJ0pvaG4nIH0pXG4gKi9cbmNvbnN0IHNldEZpZWxkc0RhdGEgPSAoXG4gIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnksXG4gIGRhdGE6IEZvcm1EYXRhLFxuICBzaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSxcbik6IHZvaWQgPT4ge1xuICBmb3IgKGNvbnN0IFtuYW1lLCBmaWVsZF0gb2YgZmllbGRzKSB7XG4gICAgLy8gQ2hlY2sgZm9yIGV4YWN0IG1hdGNoIGZpcnN0XG4gICAgaWYgKG5hbWUgaW4gZGF0YSkge1xuICAgICAgc2V0RmllbGRWYWx1ZShmaWVsZCwgZGF0YVtuYW1lXSwgc2lsZW50KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBuZXN0ZWQgdmFsdWUgdXNpbmcgZG90IG5vdGF0aW9uXG4gICAgLy8gZS5nLiwgZmllbGQgbmFtZSAndXNlcm5hbWUnIG1pZ2h0IGJlIGluIGRhdGEgYXMgbmVzdGVkIHsgaW5mbzogeyB1c2VybmFtZTogJ3ZhbHVlJyB9IH1cbiAgICBjb25zdCB2YWx1ZSA9IGdldE5lc3RlZFZhbHVlKGRhdGEsIG5hbWUpO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzZXRGaWVsZFZhbHVlKGZpZWxkLCB2YWx1ZSBhcyBGaWVsZFZhbHVlLCBzaWxlbnQpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBHZXRzIGEgbmVzdGVkIHZhbHVlIGZyb20gYW4gb2JqZWN0IHVzaW5nIGRvdCBub3RhdGlvblxuICovXG5jb25zdCBnZXROZXN0ZWRWYWx1ZSA9IChcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgcGF0aDogc3RyaW5nLFxuKTogdW5rbm93biA9PiB7XG4gIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG4gIGxldCBjdXJyZW50OiB1bmtub3duID0gb2JqO1xuXG4gIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjdXJyZW50ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjdXJyZW50ID0gKGN1cnJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3BhcnRdO1xuICB9XG5cbiAgcmV0dXJuIGN1cnJlbnQ7XG59O1xuXG4vKipcbiAqIFNldHMgYSBuZXN0ZWQgdmFsdWUgaW4gYW4gb2JqZWN0IHVzaW5nIGRvdCBub3RhdGlvblxuICovXG5jb25zdCBzZXROZXN0ZWRWYWx1ZSA9IChcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgcGF0aDogc3RyaW5nLFxuICB2YWx1ZTogdW5rbm93bixcbik6IHZvaWQgPT4ge1xuICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIuXCIpO1xuICBsZXQgY3VycmVudCA9IG9iajtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTtcbiAgICBpZiAoIShwYXJ0IGluIGN1cnJlbnQpIHx8IHR5cGVvZiBjdXJyZW50W3BhcnRdICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICBjdXJyZW50W3BhcnRdID0ge307XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50W3BhcnRdIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9XG5cbiAgY3VycmVudFtwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXV0gPSB2YWx1ZTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgZmxhdCBmaWVsZCBkYXRhIHRvIG5lc3RlZCBvYmplY3Qgc3RydWN0dXJlXG4gKiBlLmcuLCB7ICd1c2VyLm5hbWUnOiAnSm9obicgfSAtPiB7IHVzZXI6IHsgbmFtZTogJ0pvaG4nIH0gfVxuICovXG5jb25zdCBmbGF0VG9OZXN0ZWQgPSAoZGF0YTogRm9ybURhdGEpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkYXRhKSkge1xuICAgIGlmIChrZXkuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICBzZXROZXN0ZWRWYWx1ZShyZXN1bHQsIGtleSwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIE5vcm1hbGl6ZXMgcHJvdGVjdGlvbiBjb25maWcgdG8gYSBjb25zaXN0ZW50IG9iamVjdCBmb3JtYXRcbiAqL1xuY29uc3Qgbm9ybWFsaXplUHJvdGVjdENvbmZpZyA9IChcbiAgY29uZmlnOiBib29sZWFuIHwgUHJvdGVjdENoYW5nZXNDb25maWcgfCB1bmRlZmluZWQsXG4pOiBQcm90ZWN0Q2hhbmdlc0NvbmZpZyA9PiB7XG4gIGlmICghY29uZmlnKSB7XG4gICAgcmV0dXJuIHsgYmVmb3JlVW5sb2FkOiBmYWxzZSwgb25EYXRhT3ZlcndyaXRlOiBmYWxzZSB9O1xuICB9XG4gIGlmIChjb25maWcgPT09IHRydWUpIHtcbiAgICByZXR1cm4geyBiZWZvcmVVbmxvYWQ6IHRydWUsIG9uRGF0YU92ZXJ3cml0ZTogdHJ1ZSB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgYmVmb3JlVW5sb2FkOiBjb25maWcuYmVmb3JlVW5sb2FkID8/IGZhbHNlLFxuICAgIG9uRGF0YU92ZXJ3cml0ZTogY29uZmlnLm9uRGF0YU92ZXJ3cml0ZSA/PyBmYWxzZSxcbiAgfTtcbn07XG5cbi8qKlxuICogd2l0aERhdGEgZmVhdHVyZVxuICogQWRkcyBkYXRhIG1hbmFnZW1lbnQgY2FwYWJpbGl0aWVzIHRvIHRoZSBmb3JtXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoRGF0YSA9IChjb25maWc6IEZvcm1Db25maWcpID0+IHtcbiAgcmV0dXJuIDxcbiAgICBUIGV4dGVuZHMgQmFzZUZvcm1Db21wb25lbnQgJiB7XG4gICAgICBmaWVsZHM6IEZvcm1GaWVsZFJlZ2lzdHJ5O1xuICAgICAgZW1pdD86IChldmVudDogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gdm9pZDtcbiAgICB9LFxuICA+KFxuICAgIGNvbXBvbmVudDogVCxcbiAgKTogVCAmIHtcbiAgICBzdGF0ZTogRm9ybVN0YXRlO1xuICAgIGdldERhdGE6ICgpID0+IEZvcm1EYXRhO1xuICAgIHNldERhdGE6IChkYXRhOiBGb3JtRGF0YSwgc2lsZW50PzogYm9vbGVhbikgPT4gdm9pZDtcbiAgICBnZXRGaWVsZFZhbHVlOiAobmFtZTogc3RyaW5nKSA9PiBGaWVsZFZhbHVlO1xuICAgIHNldEZpZWxkVmFsdWU6IChuYW1lOiBzdHJpbmcsIHZhbHVlOiBGaWVsZFZhbHVlLCBzaWxlbnQ/OiBib29sZWFuKSA9PiB2b2lkO1xuICAgIGlzTW9kaWZpZWQ6ICgpID0+IGJvb2xlYW47XG4gICAgZ2V0TW9kaWZpZWREYXRhOiAoKSA9PiBGb3JtRGF0YTtcbiAgICBzbmFwc2hvdDogKCkgPT4gdm9pZDtcbiAgICByZXNldDogKGZvcmNlPzogYm9vbGVhbikgPT4gYm9vbGVhbjtcbiAgICBjbGVhcjogKGZvcmNlPzogYm9vbGVhbikgPT4gYm9vbGVhbjtcbiAgfSA9PiB7XG4gICAgLy8gSW5pdGlhbGl6ZSBzdGF0ZVxuICAgIGNvbnN0IHN0YXRlID0gY3JlYXRlSW5pdGlhbFN0YXRlKGNvbmZpZyk7XG5cbiAgICAvLyBOb3JtYWxpemUgcHJvdGVjdGlvbiBjb25maWd1cmF0aW9uXG4gICAgY29uc3QgcHJvdGVjdENvbmZpZyA9IG5vcm1hbGl6ZVByb3RlY3RDb25maWcoY29uZmlnLnByb3RlY3RDaGFuZ2VzKTtcblxuICAgIC8vIFRyYWNrIHRoZSBiZWZvcmV1bmxvYWQgaGFuZGxlciBzbyB3ZSBjYW4gcmVtb3ZlIGl0XG4gICAgbGV0IGJlZm9yZVVubG9hZEhhbmRsZXI6ICgoZTogQmVmb3JlVW5sb2FkRXZlbnQpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBCZWZvcmV1bmxvYWQgaGFuZGxlciAtIHdhcm5zIHVzZXIgd2hlbiBsZWF2aW5nIHdpdGggdW5zYXZlZCBjaGFuZ2VzXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlQmVmb3JlVW5sb2FkID0gKGU6IEJlZm9yZVVubG9hZEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoc3RhdGUubW9kaWZpZWQpIHtcbiAgICAgICAgLy8gU3RhbmRhcmQgd2F5IHRvIHRyaWdnZXIgdGhlIGJyb3dzZXIncyBcInVuc2F2ZWQgY2hhbmdlc1wiIGRpYWxvZ1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIC8vIEZvciBvbGRlciBicm93c2VycyAtIHJldHVyblZhbHVlIG11c3QgYmUgc2V0XG4gICAgICAgIGUucmV0dXJuVmFsdWUgPSBcIlwiO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgdGhlIGJlZm9yZXVubG9hZCBoYW5kbGVyIGlmIHByb3RlY3Rpb24gaXMgZW5hYmxlZFxuICAgICAqL1xuICAgIGNvbnN0IHJlZ2lzdGVyQmVmb3JlVW5sb2FkID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKHByb3RlY3RDb25maWcuYmVmb3JlVW5sb2FkICYmICFiZWZvcmVVbmxvYWRIYW5kbGVyKSB7XG4gICAgICAgIGJlZm9yZVVubG9hZEhhbmRsZXIgPSBoYW5kbGVCZWZvcmVVbmxvYWQ7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsIGJlZm9yZVVubG9hZEhhbmRsZXIpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVbnJlZ2lzdGVycyB0aGUgYmVmb3JldW5sb2FkIGhhbmRsZXJcbiAgICAgKi9cbiAgICBjb25zdCB1bnJlZ2lzdGVyQmVmb3JlVW5sb2FkID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKGJlZm9yZVVubG9hZEhhbmRsZXIpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJiZWZvcmV1bmxvYWRcIiwgYmVmb3JlVW5sb2FkSGFuZGxlcik7XG4gICAgICAgIGJlZm9yZVVubG9hZEhhbmRsZXIgPSBudWxsO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIGJlZm9yZXVubG9hZCByZWdpc3RyYXRpb24gYmFzZWQgb24gbW9kaWZpZWQgc3RhdGVcbiAgICAgKi9cbiAgICBjb25zdCB1cGRhdGVCZWZvcmVVbmxvYWRTdGF0ZSA9IChtb2RpZmllZDogYm9vbGVhbik6IHZvaWQgPT4ge1xuICAgICAgaWYgKHByb3RlY3RDb25maWcuYmVmb3JlVW5sb2FkKSB7XG4gICAgICAgIGlmIChtb2RpZmllZCkge1xuICAgICAgICAgIHJlZ2lzdGVyQmVmb3JlVW5sb2FkKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2Uga2VlcCB0aGUgaGFuZGxlciByZWdpc3RlcmVkIGJ1dCBpdCBvbmx5IHByZXZlbnRzIHVubG9hZCB3aGVuIG1vZGlmaWVkXG4gICAgICAgIC8vIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBjb25zdGFudGx5IGFkZGluZy9yZW1vdmluZyB0aGUgbGlzdGVuZXJcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gSWYgaW5pdGlhbCBkYXRhIHdhcyBwcm92aWRlZCwgc2V0IGl0IG9uIGZpZWxkc1xuICAgIGlmIChjb25maWcuZGF0YSAmJiBjb21wb25lbnQuZmllbGRzKSB7XG4gICAgICBzZXRGaWVsZHNEYXRhKGNvbXBvbmVudC5maWVsZHMsIGNvbmZpZy5kYXRhLCB0cnVlKTtcbiAgICAgIHN0YXRlLmN1cnJlbnREYXRhID0gY29sbGVjdEZpZWxkRGF0YShjb21wb25lbnQuZmllbGRzKTtcbiAgICAgIHN0YXRlLmluaXRpYWxEYXRhID0geyAuLi5zdGF0ZS5jdXJyZW50RGF0YSB9O1xuICAgICAgLy8gU3luYyB0aGUgZmllbGQgdmFsdWUgdHJhY2tlciBmb3IgZXZlbnQgZGVkdXBsaWNhdGlvblxuICAgICAgLy8gVGhpcyBlbnN1cmVzIGNoYW5nZSBkZXRlY3Rpb24gd29ya3MgY29ycmVjdGx5IHdoZW4gZmllbGRzIGFyZSBtb2RpZmllZFxuICAgICAgc3luY1RyYWNrZWRGaWVsZFZhbHVlcyhjb21wb25lbnQuZmllbGRzKTtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIGJlZm9yZXVubG9hZCBwcm90ZWN0aW9uIGlmIGVuYWJsZWRcbiAgICBpZiAocHJvdGVjdENvbmZpZy5iZWZvcmVVbmxvYWQpIHtcbiAgICAgIHJlZ2lzdGVyQmVmb3JlVW5sb2FkKCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlciBmb3IgZmllbGQvZmlsZSBjaGFuZ2VzIHRvIHVwZGF0ZSBzdGF0ZVxuICAgIGNvbnN0IGhhbmRsZUNoYW5nZSA9IChldmVudDogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBGaWVsZFZhbHVlIH0pID0+IHtcbiAgICAgIHN0YXRlLmN1cnJlbnREYXRhW2V2ZW50Lm5hbWVdID0gZXZlbnQudmFsdWU7XG4gICAgICBjb25zdCB3YXNNb2RpZmllZCA9IHN0YXRlLm1vZGlmaWVkO1xuICAgICAgc3RhdGUubW9kaWZpZWQgPSBoYXNEYXRhQ2hhbmdlZChzdGF0ZS5pbml0aWFsRGF0YSwgc3RhdGUuY3VycmVudERhdGEpO1xuXG4gICAgICAvLyBVcGRhdGUgYmVmb3JldW5sb2FkIHN0YXRlIHdoZW4gbW9kaWZpZWQgY2hhbmdlc1xuICAgICAgaWYgKHdhc01vZGlmaWVkICE9PSBzdGF0ZS5tb2RpZmllZCkge1xuICAgICAgICB1cGRhdGVCZWZvcmVVbmxvYWRTdGF0ZShzdGF0ZS5tb2RpZmllZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVtaXQgc3RhdGU6Y2hhbmdlIGV2ZW50IHdoZW4gbW9kaWZpZWQgc3RhdGUgY2hhbmdlc1xuICAgICAgLy8gVGhpcyBhbGxvd3MgdGhlIGNvbnRyb2xsZXIgdG8gZW5hYmxlL2Rpc2FibGUgY29udHJvbHMgYWNjb3JkaW5nbHlcbiAgICAgIGlmICh3YXNNb2RpZmllZCAhPT0gc3RhdGUubW9kaWZpZWQpIHtcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5TVEFURV9DSEFOR0UsIHtcbiAgICAgICAgICBtb2RpZmllZDogc3RhdGUubW9kaWZpZWQsXG4gICAgICAgICAgc3RhdGU6IHN0YXRlLm1vZGlmaWVkID8gREFUQV9TVEFURS5ESVJUWSA6IERBVEFfU1RBVEUuUFJJU1RJTkUsXG4gICAgICAgICAgbmFtZTogZXZlbnQubmFtZSxcbiAgICAgICAgICB2YWx1ZTogZXZlbnQudmFsdWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBMaXN0ZW4gZm9yIGZpZWxkIGNoYW5nZXMgdG8gdXBkYXRlIHN0YXRlXG4gICAgaWYgKGNvbXBvbmVudC5vbikge1xuICAgICAgY29tcG9uZW50Lm9uKFwiZmllbGQ6Y2hhbmdlXCIsIGhhbmRsZUNoYW5nZSk7XG4gICAgICAvLyBBbHNvIGxpc3RlbiBmb3IgZmlsZSBjaGFuZ2VzXG4gICAgICBjb21wb25lbnQub24oXCJmaWxlOmNoYW5nZVwiLCBoYW5kbGVDaGFuZ2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEludGVybmFsIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdGhlIGFjdHVhbCBzZXREYXRhIG9wZXJhdGlvblxuICAgICAqL1xuICAgIGNvbnN0IHBlcmZvcm1TZXREYXRhID0gKGRhdGE6IEZvcm1EYXRhLCBzaWxlbnQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICAgIHNldEZpZWxkc0RhdGEoY29tcG9uZW50LmZpZWxkcywgZGF0YSwgc2lsZW50KTtcbiAgICAgIHN0YXRlLmN1cnJlbnREYXRhID0gY29sbGVjdEZpZWxkRGF0YShjb21wb25lbnQuZmllbGRzKTtcblxuICAgICAgaWYgKHNpbGVudCkge1xuICAgICAgICAvLyBXaGVuIHNldHRpbmcgZGF0YSBzaWxlbnRseSwgYWxzbyB1cGRhdGUgaW5pdGlhbCBkYXRhIHNuYXBzaG90XG4gICAgICAgIC8vIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgd2hlbiBsb2FkaW5nIGRhdGEgZnJvbSBzZXJ2ZXJcbiAgICAgICAgc3RhdGUuaW5pdGlhbERhdGEgPSB7IC4uLnN0YXRlLmN1cnJlbnREYXRhIH07XG4gICAgICAgIHN0YXRlLm1vZGlmaWVkID0gZmFsc2U7XG4gICAgICAgIC8vIFN5bmMgdGhlIGZpZWxkIHZhbHVlIHRyYWNrZXIgZm9yIGV2ZW50IGRlZHVwbGljYXRpb25cbiAgICAgICAgc3luY1RyYWNrZWRGaWVsZFZhbHVlcyhjb21wb25lbnQuZmllbGRzKTtcbiAgICAgICAgLy8gVXBkYXRlIGJlZm9yZXVubG9hZCBzdGF0ZSBzaW5jZSB3ZSdyZSBubyBsb25nZXIgbW9kaWZpZWRcbiAgICAgICAgdXBkYXRlQmVmb3JlVW5sb2FkU3RhdGUoZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5EQVRBX1NFVCwgc3RhdGUuY3VycmVudERhdGEpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBmdW5jdGlvbiB0byBwZXJmb3JtIHRoZSBhY3R1YWwgcmVzZXQgb3BlcmF0aW9uXG4gICAgICovXG4gICAgY29uc3QgcGVyZm9ybVJlc2V0ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgc2V0RmllbGRzRGF0YShjb21wb25lbnQuZmllbGRzLCBzdGF0ZS5pbml0aWFsRGF0YSwgdHJ1ZSk7XG4gICAgICBzdGF0ZS5jdXJyZW50RGF0YSA9IHsgLi4uc3RhdGUuaW5pdGlhbERhdGEgfTtcbiAgICAgIHN0YXRlLm1vZGlmaWVkID0gZmFsc2U7XG4gICAgICBzdGF0ZS5lcnJvcnMgPSB7fTtcbiAgICAgIC8vIFVwZGF0ZSBiZWZvcmV1bmxvYWQgc3RhdGUgc2luY2Ugd2UncmUgbm8gbG9uZ2VyIG1vZGlmaWVkXG4gICAgICB1cGRhdGVCZWZvcmVVbmxvYWRTdGF0ZShmYWxzZSk7XG4gICAgICAvLyBFbWl0IHN0YXRlOmNoYW5nZSBzbyBwcm90ZWN0aW9uIG92ZXJsYXkgZ2V0cyByZW1vdmVkXG4gICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLlNUQVRFX0NIQU5HRSwge1xuICAgICAgICBtb2RpZmllZDogZmFsc2UsXG4gICAgICAgIHN0YXRlOiBEQVRBX1NUQVRFLlBSSVNUSU5FLFxuICAgICAgfSk7XG4gICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLlJFU0VUKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgYWN0dWFsIGNsZWFyIG9wZXJhdGlvblxuICAgICAqL1xuICAgIGNvbnN0IHBlcmZvcm1DbGVhciA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGVtcHR5RGF0YTogRm9ybURhdGEgPSB7fTtcbiAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBjb21wb25lbnQuZmllbGRzLmtleXMoKSkge1xuICAgICAgICBlbXB0eURhdGFbbmFtZV0gPSBudWxsO1xuICAgICAgfVxuICAgICAgc2V0RmllbGRzRGF0YShjb21wb25lbnQuZmllbGRzLCBlbXB0eURhdGEsIHRydWUpO1xuICAgICAgc3RhdGUuY3VycmVudERhdGEgPSB7fTtcbiAgICAgIHN0YXRlLmluaXRpYWxEYXRhID0ge307XG4gICAgICBzdGF0ZS5tb2RpZmllZCA9IGZhbHNlO1xuICAgICAgLy8gVXBkYXRlIGJlZm9yZXVubG9hZCBzdGF0ZVxuICAgICAgdXBkYXRlQmVmb3JlVW5sb2FkU3RhdGUoZmFsc2UpO1xuICAgICAgLy8gRW1pdCBzdGF0ZTpjaGFuZ2Ugc28gcHJvdGVjdGlvbiBvdmVybGF5IGdldHMgcmVtb3ZlZFxuICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5TVEFURV9DSEFOR0UsIHtcbiAgICAgICAgbW9kaWZpZWQ6IGZhbHNlLFxuICAgICAgICBzdGF0ZTogREFUQV9TVEFURS5QUklTVElORSxcbiAgICAgIH0pO1xuICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5SRVNFVCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGVuaGFuY2VkID0ge1xuICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgc3RhdGUsXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IGFsbCBmb3JtIGRhdGFcbiAgICAgICAqL1xuICAgICAgZ2V0RGF0YSgpOiBGb3JtRGF0YSB7XG4gICAgICAgIC8vIEFsd2F5cyBjb2xsZWN0IGZyZXNoIGRhdGEgZnJvbSBmaWVsZHNcbiAgICAgICAgY29uc3QgZGF0YSA9IGNvbGxlY3RGaWVsZERhdGEoY29tcG9uZW50LmZpZWxkcyk7XG4gICAgICAgIHN0YXRlLmN1cnJlbnREYXRhID0gZGF0YTtcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5EQVRBX0dFVCwgZGF0YSk7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTZXQgZm9ybSBkYXRhXG4gICAgICAgKiBAcGFyYW0gZGF0YSAtIERhdGEgb2JqZWN0IHRvIHNldFxuICAgICAgICogQHBhcmFtIHNpbGVudCAtIElmIHRydWUsIGRvbid0IGVtaXQgY2hhbmdlIGV2ZW50cyBhbmQgdXBkYXRlIGluaXRpYWwgc3RhdGVcbiAgICAgICAqXG4gICAgICAgKiBXaGVuIHByb3RlY3RDaGFuZ2VzLm9uRGF0YU92ZXJ3cml0ZSBpcyBlbmFibGVkIGFuZCB0aGUgZm9ybSBoYXMgdW5zYXZlZCBjaGFuZ2VzLFxuICAgICAgICogdGhpcyB3aWxsIGVtaXQgYSAnZGF0YTpjb25mbGljdCcgZXZlbnQuIFRoZSBldmVudCBoYW5kbGVyIGNhbiBjYWxsIGNhbmNlbCgpXG4gICAgICAgKiB0byBwcmV2ZW50IHRoZSBkYXRhIGZyb20gYmVpbmcgc2V0LCBvciBsZXQgaXQgcHJvY2VlZCBieSBkZWZhdWx0LlxuICAgICAgICovXG4gICAgICBzZXREYXRhKGRhdGE6IEZvcm1EYXRhLCBzaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICAvLyBDaGVjayBmb3IgZGF0YSBjb25mbGljdCBwcm90ZWN0aW9uXG4gICAgICAgIC8vIE9ubHkgYXBwbGllcyB3aGVuOlxuICAgICAgICAvLyAtIFByb3RlY3Rpb24gaXMgZW5hYmxlZFxuICAgICAgICAvLyAtIEZvcm0gaGFzIGJlZW4gbW9kaWZpZWRcbiAgICAgICAgLy8gLSBOb3QgYSBzaWxlbnQgb3BlcmF0aW9uIChzaWxlbnQgaXMgZm9yIGxvYWRpbmcgZGF0YSlcbiAgICAgICAgaWYgKHByb3RlY3RDb25maWcub25EYXRhT3ZlcndyaXRlICYmIHN0YXRlLm1vZGlmaWVkICYmICFzaWxlbnQpIHtcbiAgICAgICAgICAvLyBDcmVhdGUgY29uZmxpY3QgZXZlbnRcbiAgICAgICAgICBsZXQgY2FuY2VsbGVkID0gZmFsc2U7XG4gICAgICAgICAgbGV0IHByb2NlZWRlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgY29uc3QgY29uZmxpY3RFdmVudDogRGF0YUNvbmZsaWN0RXZlbnQgPSB7XG4gICAgICAgICAgICBjdXJyZW50RGF0YTogeyAuLi5zdGF0ZS5jdXJyZW50RGF0YSB9LFxuICAgICAgICAgICAgbmV3RGF0YTogZGF0YSxcbiAgICAgICAgICAgIGNhbmNlbGxlZDogZmFsc2UsXG4gICAgICAgICAgICBjYW5jZWw6ICgpID0+IHtcbiAgICAgICAgICAgICAgY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgY29uZmxpY3RFdmVudC5jYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByb2NlZWQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgcHJvY2VlZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgcGVyZm9ybVNldERhdGEoZGF0YSwgc2lsZW50KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIEVtaXQgdGhlIGNvbmZsaWN0IGV2ZW50XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5EQVRBX0NPTkZMSUNULCBjb25mbGljdEV2ZW50KTtcblxuICAgICAgICAgIC8vIElmIGNhbmNlbGxlZCwgZG9uJ3Qgc2V0IHRoZSBkYXRhXG4gICAgICAgICAgaWYgKGNhbmNlbGxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElmIHByb2NlZWQoKSB3YXMgY2FsbGVkIGluIHRoZSBoYW5kbGVyLCBkYXRhIGlzIGFscmVhZHkgc2V0XG4gICAgICAgICAgaWYgKHByb2NlZWRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElmIG5laXRoZXIgY2FuY2VsKCkgbm9yIHByb2NlZWQoKSB3YXMgY2FsbGVkLCBwcm9jZWVkIGJ5IGRlZmF1bHRcbiAgICAgICAgICAvLyBUaGlzIG1haW50YWlucyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQZXJmb3JtIHRoZSBhY3R1YWwgc2V0RGF0YSBvcGVyYXRpb25cbiAgICAgICAgcGVyZm9ybVNldERhdGEoZGF0YSwgc2lsZW50KTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IGEgc3BlY2lmaWMgZmllbGQncyB2YWx1ZVxuICAgICAgICovXG4gICAgICBnZXRGaWVsZFZhbHVlKG5hbWU6IHN0cmluZyk6IEZpZWxkVmFsdWUge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGNvbXBvbmVudC5maWVsZHMuZ2V0KG5hbWUpO1xuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0RmllbGRWYWx1ZShmaWVsZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXRlLmN1cnJlbnREYXRhW25hbWVdO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTZXQgYSBzcGVjaWZpYyBmaWVsZCdzIHZhbHVlXG4gICAgICAgKi9cbiAgICAgIHNldEZpZWxkVmFsdWUoXG4gICAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgICAgdmFsdWU6IEZpZWxkVmFsdWUsXG4gICAgICAgIHNpbGVudDogYm9vbGVhbiA9IGZhbHNlLFxuICAgICAgKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gY29tcG9uZW50LmZpZWxkcy5nZXQobmFtZSk7XG4gICAgICAgIGlmIChmaWVsZCkge1xuICAgICAgICAgIHNldEZpZWxkVmFsdWUoZmllbGQsIHZhbHVlLCBzaWxlbnQpO1xuICAgICAgICAgIHN0YXRlLmN1cnJlbnREYXRhW25hbWVdID0gdmFsdWU7XG4gICAgICAgICAgc3RhdGUubW9kaWZpZWQgPSBoYXNEYXRhQ2hhbmdlZChzdGF0ZS5pbml0aWFsRGF0YSwgc3RhdGUuY3VycmVudERhdGEpO1xuXG4gICAgICAgICAgLy8gVXBkYXRlIGJlZm9yZXVubG9hZCBzdGF0ZVxuICAgICAgICAgIHVwZGF0ZUJlZm9yZVVubG9hZFN0YXRlKHN0YXRlLm1vZGlmaWVkKTtcblxuICAgICAgICAgIGlmICghc2lsZW50KSB7XG4gICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLkZJRUxEX0NIQU5HRSwgeyBuYW1lLCB2YWx1ZSB9KTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuQ0hBTkdFLCB7IG5hbWUsIHZhbHVlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDaGVjayBpZiBmb3JtIGhhcyBiZWVuIG1vZGlmaWVkIGZyb20gaW5pdGlhbCBzdGF0ZVxuICAgICAgICovXG4gICAgICBpc01vZGlmaWVkKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBjdXJyZW50RGF0YSA9IGNvbGxlY3RGaWVsZERhdGEoY29tcG9uZW50LmZpZWxkcyk7XG4gICAgICAgIHN0YXRlLm1vZGlmaWVkID0gaGFzRGF0YUNoYW5nZWQoc3RhdGUuaW5pdGlhbERhdGEsIGN1cnJlbnREYXRhKTtcbiAgICAgICAgcmV0dXJuIHN0YXRlLm1vZGlmaWVkO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgb25seSB0aGUgZmllbGRzIHRoYXQgaGF2ZSBiZWVuIG1vZGlmaWVkXG4gICAgICAgKi9cbiAgICAgIGdldE1vZGlmaWVkRGF0YSgpOiBGb3JtRGF0YSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnREYXRhID0gY29sbGVjdEZpZWxkRGF0YShjb21wb25lbnQuZmllbGRzKTtcbiAgICAgICAgcmV0dXJuIGdldE1vZGlmaWVkRmllbGRzKHN0YXRlLmluaXRpYWxEYXRhLCBjdXJyZW50RGF0YSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFRha2UgYSBzbmFwc2hvdCBvZiBjdXJyZW50IGRhdGEgYXMgdGhlIG5ldyBiYXNlbGluZVxuICAgICAgICogRnV0dXJlIGlzTW9kaWZpZWQoKSBjYWxscyB3aWxsIGNvbXBhcmUgYWdhaW5zdCB0aGlzIHNuYXBzaG90XG4gICAgICAgKi9cbiAgICAgIHNuYXBzaG90KCk6IHZvaWQge1xuICAgICAgICBzdGF0ZS5pbml0aWFsRGF0YSA9IHsgLi4uY29sbGVjdEZpZWxkRGF0YShjb21wb25lbnQuZmllbGRzKSB9O1xuICAgICAgICBzdGF0ZS5jdXJyZW50RGF0YSA9IHsgLi4uc3RhdGUuaW5pdGlhbERhdGEgfTtcbiAgICAgICAgc3RhdGUubW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgICAgLy8gVXBkYXRlIGJlZm9yZXVubG9hZCBzdGF0ZSBzaW5jZSB3ZSdyZSBubyBsb25nZXIgbW9kaWZpZWRcbiAgICAgICAgdXBkYXRlQmVmb3JlVW5sb2FkU3RhdGUoZmFsc2UpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBSZXNldCBmb3JtIHRvIGluaXRpYWwgZGF0YSBzdGF0ZVxuICAgICAgICpcbiAgICAgICAqIE5vdGU6IFByb3RlY3Rpb24gaXMgaGFuZGxlZCBieSB0aGUgYmxvY2tpbmcgb3ZlcmxheSBpbiB0aGUgcHJvdGVjdGlvbiBmZWF0dXJlLlxuICAgICAgICogcmVzZXQoKSBubyBsb25nZXIgZW1pdHMgZGF0YTpjb25mbGljdCBldmVudHMgLSBpdCBqdXN0IHJlc2V0cyB0aGUgZm9ybS5cbiAgICAgICAqIFVzZSBmb3JjZSBwYXJhbWV0ZXIgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IChpZ25vcmVkKS5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvcmNlIC0gSWdub3JlZCAoa2VwdCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpXG4gICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gQWx3YXlzIHJldHVybnMgdHJ1ZVxuICAgICAgICovXG4gICAgICByZXNldChmb3JjZTogYm9vbGVhbiA9IGZhbHNlKTogYm9vbGVhbiB7XG4gICAgICAgIHBlcmZvcm1SZXNldCgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2xlYXIgYWxsIGZvcm0gZmllbGRzXG4gICAgICAgKlxuICAgICAgICogTm90ZTogUHJvdGVjdGlvbiBpcyBoYW5kbGVkIGJ5IHRoZSBibG9ja2luZyBvdmVybGF5IGluIHRoZSBwcm90ZWN0aW9uIGZlYXR1cmUuXG4gICAgICAgKiBjbGVhcigpIG5vIGxvbmdlciBlbWl0cyBkYXRhOmNvbmZsaWN0IGV2ZW50cyAtIGl0IGp1c3QgY2xlYXJzIHRoZSBmb3JtLlxuICAgICAgICogVXNlIGZvcmNlIHBhcmFtZXRlciBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKGlnbm9yZWQpLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2UgLSBJZ25vcmVkIChrZXB0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSlcbiAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBBbHdheXMgcmV0dXJucyB0cnVlXG4gICAgICAgKi9cbiAgICAgIGNsZWFyKGZvcmNlOiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICAgICAgcGVyZm9ybUNsZWFyKCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8gUmVnaXN0ZXIgY2xlYW51cCBmb3IgYmVmb3JldW5sb2FkIGhhbmRsZXIgd2hlbiBjb21wb25lbnQgaXMgZGVzdHJveWVkXG4gICAgLy8gV2UgbmVlZCB0byBob29rIGludG8gdGhlIGxpZmVjeWNsZSBkZXN0cm95IG1lY2hhbmlzbVxuICAgIGNvbnN0IG9yaWdpbmFsTGlmZWN5Y2xlID0gY29tcG9uZW50LmxpZmVjeWNsZTtcbiAgICBpZiAob3JpZ2luYWxMaWZlY3ljbGUpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IG9yaWdpbmFsTGlmZWN5Y2xlLmRlc3Ryb3k7XG4gICAgICBvcmlnaW5hbExpZmVjeWNsZS5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAvLyBDbGVhbiB1cCBiZWZvcmV1bmxvYWQgaGFuZGxlclxuICAgICAgICB1bnJlZ2lzdGVyQmVmb3JlVW5sb2FkKCk7XG4gICAgICAgIC8vIENhbGwgb3JpZ2luYWwgZGVzdHJveVxuICAgICAgICBvcmlnaW5hbERlc3Ryb3k/LigpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW5oYW5jZWQ7XG4gIH07XG59O1xuXG5leHBvcnQgeyBmbGF0VG9OZXN0ZWQsIGdldE5lc3RlZFZhbHVlLCBzZXROZXN0ZWRWYWx1ZSB9O1xuZXhwb3J0IGRlZmF1bHQgd2l0aERhdGE7XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL2Zvcm0vZmVhdHVyZXMvY29udHJvbGxlci50c1xuXG4vKipcbiAqIENvbnRyb2xsZXIgZmVhdHVyZSBmb3IgRm9ybSBjb21wb25lbnRcbiAqIE1hbmFnZXMgY29udHJvbCBidXR0b25zIChzdWJtaXQvY2FuY2VsKSBiYXNlZCBvbiBkYXRhIHN0YXRlIChwcmlzdGluZS9kaXJ0eSlcbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEZvcm1Db25maWcsXG4gIEJhc2VGb3JtQ29tcG9uZW50LFxuICBGb3JtU3RhdGUsXG4gIEZvcm1GaWVsZFJlZ2lzdHJ5LFxuICBGb3JtRmllbGQsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgREFUQV9TVEFURSwgRk9STV9FVkVOVFMsIEZPUk1fQ0xBU1NFUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEZPUk1fREVGQVVMVFMgfSBmcm9tIFwiLi4vY29uZmlnXCI7XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgZm9ybSdzIHN0YXRlIENTUyBjbGFzc1xuICovXG5jb25zdCB1cGRhdGVTdGF0ZUNsYXNzID0gKFxuICBlbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgbW9kaWZpZWQ6IGJvb2xlYW4sXG4gIHByZWZpeDogc3RyaW5nLFxuICBjb21wb25lbnROYW1lOiBzdHJpbmcsXG4pOiB2b2lkID0+IHtcbiAgY29uc3QgbW9kaWZpZWRDbGFzcyA9IGAke3ByZWZpeH0tJHtjb21wb25lbnROYW1lfS0tJHtGT1JNX0NMQVNTRVMuTU9ESUZJRUR9YDtcbiAgZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKG1vZGlmaWVkQ2xhc3MsIG1vZGlmaWVkKTtcbn07XG5cbi8qKlxuICogRW5hYmxlcyBvciBkaXNhYmxlcyBhbGwgZm9ybSBmaWVsZHNcbiAqL1xuY29uc3Qgc2V0RmllbGRzRW5hYmxlZCA9IChcbiAgZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeSxcbiAgZW5hYmxlZDogYm9vbGVhbixcbik6IHZvaWQgPT4ge1xuICBmb3IgKGNvbnN0IFssIGZpZWxkXSBvZiBmaWVsZHMpIHtcbiAgICBpZiAoZW5hYmxlZCAmJiB0eXBlb2YgZmllbGQuZW5hYmxlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGZpZWxkLmVuYWJsZSgpO1xuICAgIH0gZWxzZSBpZiAoIWVuYWJsZWQgJiYgdHlwZW9mIGZpZWxkLmRpc2FibGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgZmllbGQuZGlzYWJsZSgpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBHZXRzIGNvbnRyb2wgYnV0dG9uIGNvbXBvbmVudHMgZnJvbSB0aGUgVUkgcmVnaXN0cnlcbiAqL1xuY29uc3QgZ2V0Q29udHJvbEJ1dHRvbnMgPSAoXG4gIHVpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgY29udHJvbE5hbWVzOiBzdHJpbmdbXSxcbik6IE1hcDxzdHJpbmcsIEZvcm1GaWVsZD4gPT4ge1xuICBjb25zdCBjb250cm9scyA9IG5ldyBNYXA8c3RyaW5nLCBGb3JtRmllbGQ+KCk7XG5cbiAgZm9yIChjb25zdCBuYW1lIG9mIGNvbnRyb2xOYW1lcykge1xuICAgIGNvbnN0IGNvbnRyb2wgPSB1aVtuYW1lXTtcbiAgICBpZiAoY29udHJvbCAmJiB0eXBlb2YgY29udHJvbCA9PT0gXCJvYmplY3RcIiAmJiBcImVsZW1lbnRcIiBpbiBjb250cm9sKSB7XG4gICAgICBjb250cm9scy5zZXQobmFtZSwgY29udHJvbCBhcyBGb3JtRmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb250cm9scztcbn07XG5cbi8qKlxuICogRW5hYmxlcyBvciBkaXNhYmxlcyBjb250cm9sIGJ1dHRvbnNcbiAqL1xuY29uc3Qgc2V0Q29udHJvbHNFbmFibGVkID0gKFxuICBjb250cm9sczogTWFwPHN0cmluZywgRm9ybUZpZWxkPixcbiAgZW5hYmxlZDogYm9vbGVhbixcbik6IHZvaWQgPT4ge1xuICBmb3IgKGNvbnN0IFssIGNvbnRyb2xdIG9mIGNvbnRyb2xzKSB7XG4gICAgaWYgKGVuYWJsZWQgJiYgdHlwZW9mIGNvbnRyb2wuZW5hYmxlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnRyb2wuZW5hYmxlKCk7XG4gICAgfSBlbHNlIGlmICghZW5hYmxlZCAmJiB0eXBlb2YgY29udHJvbC5kaXNhYmxlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnRyb2wuZGlzYWJsZSgpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiB3aXRoQ29udHJvbGxlciBmZWF0dXJlXG4gKiBBZGRzIGNvbnRyb2wgYnV0dG9uIGhhbmRsaW5nIGJhc2VkIG9uIGRhdGEgc3RhdGUgKHByaXN0aW5lL2RpcnR5KVxuICovXG5leHBvcnQgY29uc3Qgd2l0aENvbnRyb2xsZXIgPSAoY29uZmlnOiBGb3JtQ29uZmlnKSA9PiB7XG4gIHJldHVybiA8XG4gICAgVCBleHRlbmRzIEJhc2VGb3JtQ29tcG9uZW50ICYge1xuICAgICAgZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeTtcbiAgICAgIHN0YXRlOiBGb3JtU3RhdGU7XG4gICAgICBlbWl0PzogKGV2ZW50OiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiB2b2lkO1xuICAgICAgb24/OiAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb24pID0+IHZvaWQ7XG4gICAgfSxcbiAgPihcbiAgICBjb21wb25lbnQ6IFQsXG4gICk6IFQgJiB7XG4gICAgY29udHJvbHM6IE1hcDxzdHJpbmcsIEZvcm1GaWVsZD47XG4gICAgZ2V0RGF0YVN0YXRlOiAoKSA9PiBzdHJpbmc7XG4gICAgZW5hYmxlQ29udHJvbHM6ICgpID0+IHZvaWQ7XG4gICAgZGlzYWJsZUNvbnRyb2xzOiAoKSA9PiB2b2lkO1xuICAgIGVuYWJsZUZpZWxkczogKCkgPT4gdm9pZDtcbiAgICBkaXNhYmxlRmllbGRzOiAoKSA9PiB2b2lkO1xuICB9ID0+IHtcbiAgICBjb25zdCBwcmVmaXggPSBjb25maWcucHJlZml4IHx8IEZPUk1fREVGQVVMVFMucHJlZml4O1xuICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBjb25maWcuY29tcG9uZW50TmFtZSB8fCBGT1JNX0RFRkFVTFRTLmNvbXBvbmVudE5hbWU7XG4gICAgY29uc3QgY29udHJvbE5hbWVzID0gY29uZmlnLmNvbnRyb2xzXG4gICAgICA/IFsuLi5jb25maWcuY29udHJvbHNdXG4gICAgICA6IFsuLi5GT1JNX0RFRkFVTFRTLmNvbnRyb2xzXTtcblxuICAgIC8vIEdldCBjb250cm9sIGJ1dHRvbnMgZnJvbSBVSVxuICAgIGNvbnN0IGNvbnRyb2xzID0gY29udHJvbE5hbWVzXG4gICAgICA/IGdldENvbnRyb2xCdXR0b25zKGNvbXBvbmVudC51aSB8fCB7fSwgY29udHJvbE5hbWVzKVxuICAgICAgOiBuZXcgTWFwPHN0cmluZywgRm9ybUZpZWxkPigpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBjb250cm9scyBhcyBkaXNhYmxlZCAocHJpc3RpbmUgc3RhdGUpXG4gICAgaWYgKGNvbnRyb2xzLnNpemUgPiAwKSB7XG4gICAgICBzZXRDb250cm9sc0VuYWJsZWQoY29udHJvbHMsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbmhhbmNlZCA9IHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIGNvbnRyb2xzLFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBjdXJyZW50IGRhdGEgc3RhdGUgKHByaXN0aW5lIG9yIGRpcnR5KVxuICAgICAgICovXG4gICAgICBnZXREYXRhU3RhdGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5zdGF0ZS5tb2RpZmllZFxuICAgICAgICAgID8gREFUQV9TVEFURS5ESVJUWVxuICAgICAgICAgIDogREFUQV9TVEFURS5QUklTVElORTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRW5hYmxlIGNvbnRyb2wgYnV0dG9uc1xuICAgICAgICovXG4gICAgICBlbmFibGVDb250cm9scygpOiB2b2lkIHtcbiAgICAgICAgc2V0Q29udHJvbHNFbmFibGVkKGNvbnRyb2xzLCB0cnVlKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZSBjb250cm9sIGJ1dHRvbnNcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZUNvbnRyb2xzKCk6IHZvaWQge1xuICAgICAgICBzZXRDb250cm9sc0VuYWJsZWQoY29udHJvbHMsIGZhbHNlKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRW5hYmxlIGFsbCBmb3JtIGZpZWxkc1xuICAgICAgICovXG4gICAgICBlbmFibGVGaWVsZHMoKTogdm9pZCB7XG4gICAgICAgIHNldEZpZWxkc0VuYWJsZWQoY29tcG9uZW50LmZpZWxkcywgdHJ1ZSk7XG4gICAgICAgIGNvbXBvbmVudC5zdGF0ZS5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBEaXNhYmxlIGFsbCBmb3JtIGZpZWxkc1xuICAgICAgICovXG4gICAgICBkaXNhYmxlRmllbGRzKCk6IHZvaWQge1xuICAgICAgICBzZXRGaWVsZHNFbmFibGVkKGNvbXBvbmVudC5maWVsZHMsIGZhbHNlKTtcbiAgICAgICAgY29tcG9uZW50LnN0YXRlLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIExpc3RlbiBmb3Igc3RhdGUgY2hhbmdlcyB0byBlbmFibGUvZGlzYWJsZSBjb250cm9sc1xuICAgIGlmIChjb25maWcudXNlQ2hhbmdlcyAhPT0gZmFsc2UgJiYgY29tcG9uZW50Lm9uKSB7XG4gICAgICBjb21wb25lbnQub24oXG4gICAgICAgIEZPUk1fRVZFTlRTLlNUQVRFX0NIQU5HRSxcbiAgICAgICAgKGV2ZW50OiB7IG1vZGlmaWVkOiBib29sZWFuOyBzdGF0ZTogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgICBpZiAoZXZlbnQubW9kaWZpZWQpIHtcbiAgICAgICAgICAgIC8vIERhdGEgaXMgZGlydHkgLSBlbmFibGUgY29udHJvbHNcbiAgICAgICAgICAgIHNldENvbnRyb2xzRW5hYmxlZChjb250cm9scywgdHJ1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIERhdGEgaXMgcHJpc3RpbmUgLSBkaXNhYmxlIGNvbnRyb2xzXG4gICAgICAgICAgICBzZXRDb250cm9sc0VuYWJsZWQoY29udHJvbHMsIGZhbHNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBVcGRhdGUgQ1NTIGNsYXNzXG4gICAgICAgICAgaWYgKGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICAgICAgICB1cGRhdGVTdGF0ZUNsYXNzKFxuICAgICAgICAgICAgICBjb21wb25lbnQuZWxlbWVudCxcbiAgICAgICAgICAgICAgZXZlbnQubW9kaWZpZWQsXG4gICAgICAgICAgICAgIHByZWZpeCxcbiAgICAgICAgICAgICAgY29tcG9uZW50TmFtZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW5oYW5jZWQ7XG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCB3aXRoQ29udHJvbGxlcjtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9mZWF0dXJlcy9zdWJtaXQudHNcblxuLyoqXG4gKiBTdWJtaXQgZmVhdHVyZSBmb3IgRm9ybSBjb21wb25lbnRcbiAqIEhhbmRsZXMgZm9ybSB2YWxpZGF0aW9uIGFuZCBzdWJtaXNzaW9uIHdpdGggYXV0b21hdGljIGZpZWxkIGVycm9yIGRpc3BsYXlcbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEZvcm1Db25maWcsXG4gIEJhc2VGb3JtQ29tcG9uZW50LFxuICBGb3JtRGF0YSxcbiAgRm9ybVN0YXRlLFxuICBGb3JtRmllbGRSZWdpc3RyeSxcbiAgRm9ybUZpZWxkLFxuICBGb3JtVmFsaWRhdGlvblJ1bGUsXG4gIEZvcm1WYWxpZGF0aW9uUmVzdWx0LFxuICBGb3JtU3VibWl0T3B0aW9ucyxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBGT1JNX0VWRU5UUywgRk9STV9DTEFTU0VTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIERlZmF1bHQgaGVhZGVycyBmb3IgSlNPTiByZXF1ZXN0c1xuICovXG5jb25zdCBERUZBVUxUX0hFQURFUlM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgZm9ybSBkYXRhIGFnYWluc3QgdmFsaWRhdGlvbiBydWxlc1xuICovXG5jb25zdCB2YWxpZGF0ZURhdGEgPSAoXG4gIGRhdGE6IEZvcm1EYXRhLFxuICBydWxlczogRm9ybVZhbGlkYXRpb25SdWxlW10sXG4pOiBGb3JtVmFsaWRhdGlvblJlc3VsdCA9PiB7XG4gIGNvbnN0IGVycm9yczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBsZXQgdmFsaWQgPSB0cnVlO1xuXG4gIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykge1xuICAgIGNvbnN0IHZhbHVlID0gZGF0YVtydWxlLmZpZWxkXTtcbiAgICBjb25zdCByZXN1bHQgPSBydWxlLnZhbGlkYXRlKHZhbHVlLCBkYXRhKTtcblxuICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgZXJyb3JzW3J1bGUuZmllbGRdID0gcnVsZS5tZXNzYWdlIHx8IGAke3J1bGUuZmllbGR9IGlzIGludmFsaWRgO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlc3VsdCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgIGVycm9yc1tydWxlLmZpZWxkXSA9IHJlc3VsdDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyB2YWxpZCwgZXJyb3JzIH07XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyBhIHNpbmdsZSBmaWVsZCBhZ2FpbnN0IGl0cyB2YWxpZGF0aW9uIHJ1bGVzXG4gKi9cbmNvbnN0IHZhbGlkYXRlRmllbGQgPSAoXG4gIGZpZWxkTmFtZTogc3RyaW5nLFxuICBkYXRhOiBGb3JtRGF0YSxcbiAgcnVsZXM6IEZvcm1WYWxpZGF0aW9uUnVsZVtdLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgZmllbGRSdWxlcyA9IHJ1bGVzLmZpbHRlcigocnVsZSkgPT4gcnVsZS5maWVsZCA9PT0gZmllbGROYW1lKTtcblxuICBmb3IgKGNvbnN0IHJ1bGUgb2YgZmllbGRSdWxlcykge1xuICAgIGNvbnN0IHZhbHVlID0gZGF0YVtydWxlLmZpZWxkXTtcbiAgICBjb25zdCByZXN1bHQgPSBydWxlLnZhbGlkYXRlKHZhbHVlLCBkYXRhKTtcblxuICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gcnVsZS5tZXNzYWdlIHx8IGAke3J1bGUuZmllbGR9IGlzIGludmFsaWRgO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlc3VsdCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBQZXJmb3JtcyB0aGUgYWN0dWFsIEhUVFAgcmVxdWVzdFxuICovXG5jb25zdCBwZXJmb3JtUmVxdWVzdCA9IGFzeW5jIChcbiAgdXJsOiBzdHJpbmcsXG4gIGRhdGE6IEZvcm1EYXRhLFxuICBvcHRpb25zOiBGb3JtU3VibWl0T3B0aW9ucyxcbik6IFByb21pc2U8dW5rbm93bj4gPT4ge1xuICBjb25zdCBtZXRob2QgPSBvcHRpb25zLm1ldGhvZCB8fCBcIlBPU1RcIjtcbiAgY29uc3QgaGVhZGVycyA9IHsgLi4uREVGQVVMVF9IRUFERVJTLCAuLi5vcHRpb25zLmhlYWRlcnMgfTtcblxuICBjb25zdCBmZXRjaE9wdGlvbnM6IFJlcXVlc3RJbml0ID0ge1xuICAgIG1ldGhvZCxcbiAgICBoZWFkZXJzLFxuICB9O1xuXG4gIC8vIEFkZCBib2R5IGZvciBub24tR0VUIHJlcXVlc3RzXG4gIGlmIChtZXRob2QgIT09IFwiR0VUXCIpIHtcbiAgICBmZXRjaE9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICB9XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIGZldGNoT3B0aW9ucyk7XG5cbiAgLy8gUGFyc2UgcmVzcG9uc2VcbiAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKTtcbiAgbGV0IHJlc3VsdDogdW5rbm93bjtcblxuICBpZiAoY29udGVudFR5cGUgJiYgY29udGVudFR5cGUuaW5jbHVkZXMoXCJhcHBsaWNhdGlvbi9qc29uXCIpKSB7XG4gICAgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBIVFRQIGVycm9yc1xuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgLy8gVHJ5IHRvIGV4dHJhY3QgZXJyb3IgbWVzc2FnZSBmcm9tIHNlcnZlciByZXNwb25zZVxuICAgIGxldCBlcnJvck1lc3NhZ2UgPSBgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c306ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gO1xuICAgIGlmIChyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgY29uc3Qgc2VydmVyRXJyb3IgPSAocmVzdWx0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5lcnJvcjtcbiAgICAgIGlmICh0eXBlb2Ygc2VydmVyRXJyb3IgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgZXJyb3JNZXNzYWdlID0gc2VydmVyRXJyb3I7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgKGVycm9yIGFzIEVycm9yICYgeyByZXNwb25zZTogdW5rbm93biB9KS5yZXNwb25zZSA9IHJlc3VsdDtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIHdpdGhTdWJtaXQgZmVhdHVyZVxuICogQWRkcyB2YWxpZGF0aW9uIGFuZCBzdWJtaXNzaW9uIGNhcGFiaWxpdGllcyB0byB0aGUgZm9ybVxuICovXG5leHBvcnQgY29uc3Qgd2l0aFN1Ym1pdCA9IChjb25maWc6IEZvcm1Db25maWcpID0+IHtcbiAgcmV0dXJuIDxcbiAgICBUIGV4dGVuZHMgQmFzZUZvcm1Db21wb25lbnQgJiB7XG4gICAgICBmaWVsZHM6IEZvcm1GaWVsZFJlZ2lzdHJ5O1xuICAgICAgc3RhdGU6IEZvcm1TdGF0ZTtcbiAgICAgIGdldERhdGE6ICgpID0+IEZvcm1EYXRhO1xuICAgICAgZ2V0TW9kaWZpZWREYXRhOiAoKSA9PiBGb3JtRGF0YTtcbiAgICAgIGRpc2FibGVDb250cm9sczogKCkgPT4gdm9pZDtcbiAgICAgIHNuYXBzaG90OiAoKSA9PiB2b2lkO1xuICAgICAgZW1pdD86IChldmVudDogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gdm9pZDtcbiAgICAgIG9uPzogKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IChkYXRhOiB1bmtub3duKSA9PiB2b2lkKSA9PiB2b2lkO1xuICAgIH0sXG4gID4oXG4gICAgY29tcG9uZW50OiBULFxuICApOiBUICYge1xuICAgIHZhbGlkYXRlOiAoKSA9PiBGb3JtVmFsaWRhdGlvblJlc3VsdDtcbiAgICB2YWxpZGF0ZUZpZWxkOiAoZmllbGROYW1lOiBzdHJpbmcpID0+IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBzdWJtaXQ6IChvcHRpb25zPzogRm9ybVN1Ym1pdE9wdGlvbnMpID0+IFByb21pc2U8dW5rbm93bj47XG4gICAgc2V0VmFsaWRhdGlvblJ1bGVzOiAocnVsZXM6IEZvcm1WYWxpZGF0aW9uUnVsZVtdKSA9PiB2b2lkO1xuICAgIGNsZWFyRXJyb3JzOiAoKSA9PiB2b2lkO1xuICAgIGNsZWFyRmllbGRFcnJvcjogKGZpZWxkOiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgc2V0RmllbGRFcnJvcjogKGZpZWxkOiBzdHJpbmcsIGVycm9yOiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgZ2V0RmllbGRFcnJvcjogKGZpZWxkOiBzdHJpbmcpID0+IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgfSA9PiB7XG4gICAgLy8gVmFsaWRhdGlvbiBydWxlcyBjYW4gYmUgdXBkYXRlZCBhdCBydW50aW1lXG4gICAgbGV0IHZhbGlkYXRpb25SdWxlcyA9IGNvbmZpZy52YWxpZGF0aW9uIHx8IFtdO1xuXG4gICAgLy8gV2hldGhlciB0byBzaG93IGVycm9yIG1lc3NhZ2VzIGluIGZpZWxkIGhlbHBlciB0ZXh0IChkZWZhdWx0OiB0cnVlKVxuICAgIGNvbnN0IHNob3dNZXNzYWdlcyA9IGNvbmZpZy5zaG93RmllbGRFcnJvck1lc3NhZ2VzICE9PSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFNob3dzIG9yIGNsZWFycyBlcnJvciBvbiBhIGZpZWxkIGNvbXBvbmVudFxuICAgICAqL1xuICAgIGNvbnN0IHNob3dGaWVsZEVycm9yID0gKFxuICAgICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgICBlcnJvcjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgZmllbGQgPSBjb21wb25lbnQuZmllbGRzLmdldChmaWVsZE5hbWUpIGFzIEZvcm1GaWVsZCB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChmaWVsZCAmJiB0eXBlb2YgZmllbGQuc2V0RXJyb3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBPbmx5IHBhc3MgbWVzc2FnZSBpZiBzaG93RmllbGRFcnJvck1lc3NhZ2VzIGlzIGVuYWJsZWRcbiAgICAgICAgICBmaWVsZC5zZXRFcnJvcih0cnVlLCBzaG93TWVzc2FnZXMgPyBlcnJvciA6IHVuZGVmaW5lZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUGFzcyBlbXB0eSBzdHJpbmcgdG8gYWxzbyBjbGVhciB0aGUgaGVscGVyL3N1cHBvcnRpbmcgdGV4dCBtZXNzYWdlXG4gICAgICAgICAgZmllbGQuc2V0RXJyb3IoZmFsc2UsIFwiXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNob3dzIGVycm9ycyBvbiBhbGwgZmllbGQgY29tcG9uZW50c1xuICAgICAqL1xuICAgIGNvbnN0IHNob3dBbGxGaWVsZEVycm9ycyA9IChlcnJvcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiB2b2lkID0+IHtcbiAgICAgIC8vIENsZWFyIGFsbCBmaWVsZCBlcnJvcnMgZmlyc3RcbiAgICAgIGZvciAoY29uc3QgW2ZpZWxkTmFtZV0gb2YgY29tcG9uZW50LmZpZWxkcykge1xuICAgICAgICBzaG93RmllbGRFcnJvcihmaWVsZE5hbWUsIHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgICAvLyBTaG93IG5ldyBlcnJvcnNcbiAgICAgIGZvciAoY29uc3QgW2ZpZWxkTmFtZSwgZXJyb3JdIG9mIE9iamVjdC5lbnRyaWVzKGVycm9ycykpIHtcbiAgICAgICAgc2hvd0ZpZWxkRXJyb3IoZmllbGROYW1lLCBlcnJvcik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIExpc3RlbiBmb3IgZmllbGQgY2hhbmdlcyB0byBhdXRvLWNsZWFyL3JldmFsaWRhdGUgZXJyb3JzXG4gICAgaWYgKGNvbXBvbmVudC5vbikge1xuICAgICAgLy8gQ2xlYXIgdmlzdWFsIGVycm9ycyB3aGVuIGZvcm0gaXMgcmVzZXRcbiAgICAgIGNvbXBvbmVudC5vbihcInJlc2V0XCIsICgpID0+IHtcbiAgICAgICAgc2hvd0FsbEZpZWxkRXJyb3JzKHt9KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb21wb25lbnQub24oXCJmaWVsZDpjaGFuZ2VcIiwgKGV2ZW50OiB1bmtub3duKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgbmFtZSB9ID0gZXZlbnQgYXMgeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH07XG5cbiAgICAgICAgLy8gSWYgdGhpcyBmaWVsZCBoYWQgYW4gZXJyb3IsIHJlLXZhbGlkYXRlIGl0XG4gICAgICAgIGlmIChjb21wb25lbnQuc3RhdGUuZXJyb3JzW25hbWVdKSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IGNvbXBvbmVudC5nZXREYXRhKCk7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSB2YWxpZGF0ZUZpZWxkKG5hbWUsIGRhdGEsIHZhbGlkYXRpb25SdWxlcyk7XG5cbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIFN0aWxsIGhhcyBlcnJvciAtIHVwZGF0ZSBtZXNzYWdlXG4gICAgICAgICAgICBjb21wb25lbnQuc3RhdGUuZXJyb3JzW25hbWVdID0gZXJyb3I7XG4gICAgICAgICAgICBzaG93RmllbGRFcnJvcihuYW1lLCBlcnJvcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZpZWxkIGlzIG5vdyB2YWxpZCAtIGNsZWFyIGVycm9yXG4gICAgICAgICAgICBkZWxldGUgY29tcG9uZW50LnN0YXRlLmVycm9yc1tuYW1lXTtcbiAgICAgICAgICAgIHNob3dGaWVsZEVycm9yKG5hbWUsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBlbmhhbmNlZCA9IHtcbiAgICAgIC4uLmNvbXBvbmVudCxcblxuICAgICAgLyoqXG4gICAgICAgKiBWYWxpZGF0ZSBmb3JtIGRhdGEgYWdhaW5zdCBjb25maWd1cmVkIHJ1bGVzXG4gICAgICAgKiBBdXRvbWF0aWNhbGx5IHNob3dzIGVycm9ycyBvbiBmaWVsZCBjb21wb25lbnRzXG4gICAgICAgKiBAcmV0dXJucyBWYWxpZGF0aW9uIHJlc3VsdCB3aXRoIHZhbGlkIGZsYWcgYW5kIGVycm9ycyBvYmplY3RcbiAgICAgICAqL1xuICAgICAgdmFsaWRhdGUoKTogRm9ybVZhbGlkYXRpb25SZXN1bHQge1xuICAgICAgICBjb25zdCBkYXRhID0gY29tcG9uZW50LmdldERhdGEoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdmFsaWRhdGVEYXRhKGRhdGEsIHZhbGlkYXRpb25SdWxlcyk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHN0YXRlIHdpdGggdmFsaWRhdGlvbiBlcnJvcnNcbiAgICAgICAgY29tcG9uZW50LnN0YXRlLmVycm9ycyA9IHJlc3VsdC5lcnJvcnM7XG5cbiAgICAgICAgLy8gU2hvdyBlcnJvcnMgb24gZmllbGQgY29tcG9uZW50c1xuICAgICAgICBzaG93QWxsRmllbGRFcnJvcnMocmVzdWx0LmVycm9ycyk7XG5cbiAgICAgICAgLy8gRW1pdCB2YWxpZGF0aW9uIGV2ZW50IGlmIHRoZXJlIGFyZSBlcnJvcnNcbiAgICAgICAgaWYgKCFyZXN1bHQudmFsaWQpIHtcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLlZBTElEQVRJT05fRVJST1IsIHJlc3VsdC5lcnJvcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogVmFsaWRhdGUgYSBzaW5nbGUgZmllbGRcbiAgICAgICAqIEByZXR1cm5zIEVycm9yIG1lc3NhZ2UgaWYgaW52YWxpZCwgdW5kZWZpbmVkIGlmIHZhbGlkXG4gICAgICAgKi9cbiAgICAgIHZhbGlkYXRlRmllbGQoZmllbGROYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICBjb25zdCBkYXRhID0gY29tcG9uZW50LmdldERhdGEoKTtcbiAgICAgICAgY29uc3QgZXJyb3IgPSB2YWxpZGF0ZUZpZWxkKGZpZWxkTmFtZSwgZGF0YSwgdmFsaWRhdGlvblJ1bGVzKTtcblxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICBjb21wb25lbnQuc3RhdGUuZXJyb3JzW2ZpZWxkTmFtZV0gPSBlcnJvcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgY29tcG9uZW50LnN0YXRlLmVycm9yc1tmaWVsZE5hbWVdO1xuICAgICAgICB9XG5cbiAgICAgICAgc2hvd0ZpZWxkRXJyb3IoZmllbGROYW1lLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU3VibWl0IHRoZSBmb3JtXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHN1Ym1pdCBjb25maWd1cmF0aW9uXG4gICAgICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgc2VydmVyIHJlc3BvbnNlXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIHN1Ym1pdChvcHRpb25zOiBGb3JtU3VibWl0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIC8vIFByZXZlbnQgZG91YmxlIHN1Ym1pc3Npb25cbiAgICAgICAgaWYgKGNvbXBvbmVudC5zdGF0ZS5zdWJtaXR0aW5nKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkZvcm0gaXMgYWxyZWFkeSBzdWJtaXR0aW5nXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGlmIHJlcXVlc3RlZCAoZGVmYXVsdDogdHJ1ZSlcbiAgICAgICAgaWYgKG9wdGlvbnMudmFsaWRhdGUgIT09IGZhbHNlICYmIHZhbGlkYXRpb25SdWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHRoaXMudmFsaWRhdGUoKTtcbiAgICAgICAgICBpZiAoIXZhbGlkYXRpb24udmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJWYWxpZGF0aW9uIGZhaWxlZFwiKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFyayBhcyBzdWJtaXR0aW5nXG4gICAgICAgIGNvbXBvbmVudC5zdGF0ZS5zdWJtaXR0aW5nID0gdHJ1ZTtcblxuICAgICAgICAvLyBBZGQgc3VibWl0dGluZyBjbGFzcyB0byBlbGVtZW50XG4gICAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZy5wcmVmaXggfHwgXCJtdHJsXCI7XG4gICAgICAgICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGNvbmZpZy5jb21wb25lbnROYW1lIHx8IFwiZm9ybVwiO1xuICAgICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmNsYXNzTGlzdC5hZGQoXG4gICAgICAgICAgICBgJHtwcmVmaXh9LSR7Y29tcG9uZW50TmFtZX0tLSR7Rk9STV9DTEFTU0VTLlNVQk1JVFRJTkd9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBzdWJtaXQgZXZlbnRcbiAgICAgICAgY29uc3QgZGF0YSA9IGNvbXBvbmVudC5nZXREYXRhKCk7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuU1VCTUlULCBkYXRhKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGxldCByZXN1bHQ6IHVua25vd247XG5cbiAgICAgICAgICAvLyBVc2UgY3VzdG9tIGhhbmRsZXIgaWYgcHJvdmlkZWRcbiAgICAgICAgICBpZiAob3B0aW9ucy5oYW5kbGVyKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBhd2FpdCBvcHRpb25zLmhhbmRsZXIoXG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgIGNvbXBvbmVudCBhcyB1bmtub3duIGFzIGltcG9ydChcIi4uL3R5cGVzXCIpLkZvcm1Db21wb25lbnQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLmFjdGlvbikge1xuICAgICAgICAgICAgLy8gVXNlIGRlZmF1bHQgZmV0Y2hcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHBlcmZvcm1SZXF1ZXN0KGNvbmZpZy5hY3Rpb24sIGRhdGEsIHtcbiAgICAgICAgICAgICAgbWV0aG9kOiBvcHRpb25zLm1ldGhvZCB8fCBjb25maWcubWV0aG9kIHx8IFwiUE9TVFwiLFxuICAgICAgICAgICAgICBoZWFkZXJzOiBvcHRpb25zLmhlYWRlcnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTm8gYWN0aW9uIFVSTCwganVzdCByZXR1cm4gdGhlIGRhdGFcbiAgICAgICAgICAgIHJlc3VsdCA9IGRhdGE7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU3VjY2VzcyFcbiAgICAgICAgICBjb21wb25lbnQuc3RhdGUuc3VibWl0dGluZyA9IGZhbHNlO1xuICAgICAgICAgIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnMgPSB7fTtcblxuICAgICAgICAgIC8vIFJlbW92ZSBzdWJtaXR0aW5nIGNsYXNzXG4gICAgICAgICAgaWYgKGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWcucHJlZml4IHx8IFwibXRybFwiO1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGNvbmZpZy5jb21wb25lbnROYW1lIHx8IFwiZm9ybVwiO1xuICAgICAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcbiAgICAgICAgICAgICAgYCR7cHJlZml4fS0ke2NvbXBvbmVudE5hbWV9LS0ke0ZPUk1fQ0xBU1NFUy5TVUJNSVRUSU5HfWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFRha2Ugc25hcHNob3Qgb2YgY3VycmVudCBkYXRhIGFzIG5ldyBiYXNlbGluZVxuICAgICAgICAgIC8vIFRoaXMgcmVzZXRzIG1vZGlmaWVkIHN0YXRlIHRvIGZhbHNlLCB3aGljaCB3aWxsIHRyaWdnZXIgc3RhdGU6Y2hhbmdlXG4gICAgICAgICAgY29tcG9uZW50LnNuYXBzaG90KCk7XG5cbiAgICAgICAgICAvLyBEaXNhYmxlIGNvbnRyb2xzIChmb3JtIGlzIG5vdyBwcmlzdGluZSlcbiAgICAgICAgICBjb21wb25lbnQuZGlzYWJsZUNvbnRyb2xzKCk7XG5cbiAgICAgICAgICAvLyBFbWl0IHN1Y2Nlc3MgZXZlbnRcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLlNVQk1JVF9TVUNDRVNTLCByZXN1bHQpO1xuXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBFcnJvciFcbiAgICAgICAgICBjb21wb25lbnQuc3RhdGUuc3VibWl0dGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgLy8gUmVtb3ZlIHN1Ym1pdHRpbmcgY2xhc3NcbiAgICAgICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZy5wcmVmaXggfHwgXCJtdHJsXCI7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnROYW1lID0gY29uZmlnLmNvbXBvbmVudE5hbWUgfHwgXCJmb3JtXCI7XG4gICAgICAgICAgICBjb21wb25lbnQuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFxuICAgICAgICAgICAgICBgJHtwcmVmaXh9LSR7Y29tcG9uZW50TmFtZX0tLSR7Rk9STV9DTEFTU0VTLlNVQk1JVFRJTkd9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRW1pdCBlcnJvciBldmVudFxuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuU1VCTUlUX0VSUk9SLCBlcnJvcik7XG5cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTZXQgdmFsaWRhdGlvbiBydWxlcyBhdCBydW50aW1lXG4gICAgICAgKi9cbiAgICAgIHNldFZhbGlkYXRpb25SdWxlcyhydWxlczogRm9ybVZhbGlkYXRpb25SdWxlW10pOiB2b2lkIHtcbiAgICAgICAgdmFsaWRhdGlvblJ1bGVzID0gcnVsZXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENsZWFyIGFsbCB2YWxpZGF0aW9uIGVycm9ycyBhbmQgdmlzdWFsIGVycm9yIHN0YXRlc1xuICAgICAgICovXG4gICAgICBjbGVhckVycm9ycygpOiB2b2lkIHtcbiAgICAgICAgY29tcG9uZW50LnN0YXRlLmVycm9ycyA9IHt9O1xuICAgICAgICBzaG93QWxsRmllbGRFcnJvcnMoe30pO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDbGVhciBlcnJvciBmb3IgYSBzcGVjaWZpYyBmaWVsZFxuICAgICAgICovXG4gICAgICBjbGVhckZpZWxkRXJyb3IoZmllbGQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBkZWxldGUgY29tcG9uZW50LnN0YXRlLmVycm9yc1tmaWVsZF07XG4gICAgICAgIHNob3dGaWVsZEVycm9yKGZpZWxkLCB1bmRlZmluZWQpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTZXQgYW4gZXJyb3IgZm9yIGEgc3BlY2lmaWMgZmllbGQgKGFsc28gc2hvd3Mgb24gY29tcG9uZW50KVxuICAgICAgICovXG4gICAgICBzZXRGaWVsZEVycm9yKGZpZWxkOiBzdHJpbmcsIGVycm9yOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29tcG9uZW50LnN0YXRlLmVycm9yc1tmaWVsZF0gPSBlcnJvcjtcbiAgICAgICAgc2hvd0ZpZWxkRXJyb3IoZmllbGQsIGVycm9yKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IHRoZSBlcnJvciBmb3IgYSBzcGVjaWZpYyBmaWVsZFxuICAgICAgICovXG4gICAgICBnZXRGaWVsZEVycm9yKGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LnN0YXRlLmVycm9yc1tmaWVsZF07XG4gICAgICB9LFxuICAgIH07XG5cbiAgICByZXR1cm4gZW5oYW5jZWQ7XG4gIH07XG59O1xuXG5leHBvcnQgeyB2YWxpZGF0ZURhdGEsIHZhbGlkYXRlRmllbGQsIHBlcmZvcm1SZXF1ZXN0IH07XG5leHBvcnQgZGVmYXVsdCB3aXRoU3VibWl0O1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL3Byb3RlY3Rpb24udHNcblxuLyoqXG4gKiBQcm90ZWN0aW9uIGZlYXR1cmUgZm9yIEZvcm0gY29tcG9uZW50XG4gKiBIYW5kbGVzIGJsb2NraW5nIG92ZXJsYXkgdG8gcHJldmVudCBjbGlja3Mgb3V0c2lkZSB0aGUgZm9ybSB3aGVuIGl0IGhhcyB1bnNhdmVkIGNoYW5nZXNcbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEZvcm1Db25maWcsXG4gIEJhc2VGb3JtQ29tcG9uZW50LFxuICBGb3JtRGF0YSxcbiAgRm9ybVN0YXRlLFxuICBGb3JtRmllbGRSZWdpc3RyeSxcbiAgUHJvdGVjdENoYW5nZXNDb25maWcsXG4gIERhdGFDb25mbGljdEV2ZW50LFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IEZPUk1fRVZFTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIE5vcm1hbGl6ZXMgcHJvdGVjdGlvbiBjb25maWcgdG8gYSBjb25zaXN0ZW50IG9iamVjdCBmb3JtYXRcbiAqL1xuY29uc3Qgbm9ybWFsaXplUHJvdGVjdENvbmZpZyA9IChcbiAgY29uZmlnOiBib29sZWFuIHwgUHJvdGVjdENoYW5nZXNDb25maWcgfCB1bmRlZmluZWQsXG4pOiBQcm90ZWN0Q2hhbmdlc0NvbmZpZyA9PiB7XG4gIGlmICghY29uZmlnKSB7XG4gICAgcmV0dXJuIHsgYmVmb3JlVW5sb2FkOiBmYWxzZSwgb25EYXRhT3ZlcndyaXRlOiBmYWxzZSB9O1xuICB9XG4gIGlmIChjb25maWcgPT09IHRydWUpIHtcbiAgICByZXR1cm4geyBiZWZvcmVVbmxvYWQ6IHRydWUsIG9uRGF0YU92ZXJ3cml0ZTogdHJ1ZSB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgYmVmb3JlVW5sb2FkOiBjb25maWcuYmVmb3JlVW5sb2FkID8/IGZhbHNlLFxuICAgIG9uRGF0YU92ZXJ3cml0ZTogY29uZmlnLm9uRGF0YU92ZXJ3cml0ZSA/PyBmYWxzZSxcbiAgfTtcbn07XG5cbi8qKlxuICogd2l0aFByb3RlY3Rpb24gZmVhdHVyZVxuICogQWRkcyBibG9ja2luZyBvdmVybGF5IHByb3RlY3Rpb24gdG8gcHJldmVudCBjbGlja3Mgb3V0c2lkZSB0aGUgZm9ybSB3aGVuIG1vZGlmaWVkXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoUHJvdGVjdGlvbiA9IChjb25maWc6IEZvcm1Db25maWcpID0+IHtcbiAgcmV0dXJuIDxcbiAgICBUIGV4dGVuZHMgQmFzZUZvcm1Db21wb25lbnQgJiB7XG4gICAgICBmaWVsZHM6IEZvcm1GaWVsZFJlZ2lzdHJ5O1xuICAgICAgc3RhdGU6IEZvcm1TdGF0ZTtcbiAgICAgIGVtaXQ/OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG4gICAgICBvbj86IChldmVudDogc3RyaW5nLCBoYW5kbGVyOiBGdW5jdGlvbikgPT4gdm9pZDtcbiAgICAgIHJlc2V0PzogKGZvcmNlPzogYm9vbGVhbikgPT4gYm9vbGVhbjtcbiAgICAgIGNsZWFyRXJyb3JzPzogKCkgPT4gdm9pZDtcbiAgICAgIGRpc2FibGVDb250cm9scz86ICgpID0+IHZvaWQ7XG4gICAgfSxcbiAgPihcbiAgICBjb21wb25lbnQ6IFQsXG4gICk6IFQgPT4ge1xuICAgIC8vIE5vcm1hbGl6ZSBwcm90ZWN0aW9uIGNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCBwcm90ZWN0Q29uZmlnID0gbm9ybWFsaXplUHJvdGVjdENvbmZpZyhjb25maWcucHJvdGVjdENoYW5nZXMpO1xuXG4gICAgLy8gSWYgb3ZlcmxheSBwcm90ZWN0aW9uIGlzIG5vdCBlbmFibGVkLCByZXR1cm4gY29tcG9uZW50IHVuY2hhbmdlZFxuICAgIGlmICghcHJvdGVjdENvbmZpZy5vbkRhdGFPdmVyd3JpdGUpIHtcbiAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgfVxuXG4gICAgLy8gVHJhY2sgYmxvY2tpbmcgb3ZlcmxheSBlbGVtZW50cyAodG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0KVxuICAgIGxldCBibG9ja2luZ092ZXJsYXlzOiBIVE1MRWxlbWVudFtdID0gW107XG5cbiAgICAvLyBSZXNpemUvc2Nyb2xsIGhhbmRsZXIgZm9yIHVwZGF0aW5nIG92ZXJsYXkgcG9zaXRpb25zXG4gICAgbGV0IHJlc2l6ZUhhbmRsZXI6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gVHJhY2sgaWYgdXNlciBoYXMgaW50ZXJhY3RlZCB3aXRoIHRoZSBmb3JtIChtYWRlIGFjdHVhbCBjaGFuZ2VzKVxuICAgIC8vIFRoaXMgcHJldmVudHMgb3ZlcmxheXMgZnJvbSBzaG93aW5nIG9uIGluaXRpYWwgbG9hZFxuICAgIGxldCBoYXNVc2VySW50ZXJhY3RlZCA9IGZhbHNlO1xuXG4gICAgLy8gVHJhY2sgaWYgZGF0YSBoYXMgYmVlbiBsb2FkZWQgYXQgbGVhc3Qgb25jZVxuICAgIC8vIFRoaXMgaGVscHMgZGlzdGluZ3Vpc2ggYmV0d2VlbiBpbml0aWFsIGxvYWQgYW5kIHVzZXIgZWRpdHNcbiAgICBsZXQgZGF0YUhhc0JlZW5Mb2FkZWQgPSBmYWxzZTtcblxuICAgIC8vIFRyYWNrIGlmIHdlJ3JlIGN1cnJlbnRseSBsb2FkaW5nIGRhdGEgKGlnbm9yZSBmaWVsZDpjaGFuZ2UgZXZlbnRzIGR1cmluZyB0aGlzIHRpbWUpXG4gICAgbGV0IGlzTG9hZGluZ0RhdGEgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYmxvY2tpbmcgb3ZlcmxheSBlbGVtZW50cyBhcm91bmQgdGhlIGZvcm1cbiAgICAgKiBUaGVzZSBvdmVybGF5cyBwcmV2ZW50IGNsaWNrcyBvdXRzaWRlIHRoZSBmb3JtIHdoZW4gaXQgaGFzIHVuc2F2ZWQgY2hhbmdlc1xuICAgICAqL1xuICAgIGNvbnN0IGNyZWF0ZUJsb2NraW5nT3ZlcmxheXMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAoYmxvY2tpbmdPdmVybGF5cy5sZW5ndGggPiAwKSByZXR1cm47IC8vIEFscmVhZHkgY3JlYXRlZFxuXG4gICAgICBjb25zdCBmb3JtRWxlbWVudCA9IGNvbXBvbmVudC5lbGVtZW50O1xuICAgICAgaWYgKCFmb3JtRWxlbWVudCkgcmV0dXJuO1xuXG4gICAgICAvLyBHZXQgZm9ybSBwb3NpdGlvbiBhbmQgZGltZW5zaW9ucyAocmVsYXRpdmUgdG8gdmlld3BvcnQgZm9yIGZpeGVkIHBvc2l0aW9uaW5nKVxuICAgICAgY29uc3QgcmVjdCA9IGZvcm1FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAvLyBDb21tb24gb3ZlcmxheSBzdHlsZXMgLSB1c2luZyBmaXhlZCBwb3NpdGlvbmluZyBmb3Igdmlld3BvcnQtcmVsYXRpdmUgcGxhY2VtZW50XG4gICAgICAvLyB6LWluZGV4OiA5OTkgaXMgYmVsb3cgZGlhbG9nJ3MgbW9kYWwgei1pbmRleCAoMTAwMCkgc28gZGlhbG9ncyBhcHBlYXIgYWJvdmVcbiAgICAgIGNvbnN0IGJhc2VTdHlsZXMgPSBgXG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICAgIHotaW5kZXg6IDk5OTtcbiAgICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgICAgIGA7XG5cbiAgICAgIC8vIENyZWF0ZSB0b3Agb3ZlcmxheSAoZnJvbSB0b3Agb2Ygdmlld3BvcnQgdG8gdG9wIG9mIGZvcm0pXG4gICAgICBjb25zdCB0b3BPdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIHRvcE92ZXJsYXkuY2xhc3NOYW1lID1cbiAgICAgICAgXCJtdHJsLWZvcm0tYmxvY2tpbmctb3ZlcmxheSBtdHJsLWZvcm0tYmxvY2tpbmctb3ZlcmxheS0tdG9wXCI7XG4gICAgICB0b3BPdmVybGF5LnN0eWxlLmNzc1RleHQgPSBgJHtiYXNlU3R5bGVzfVxuICAgICAgICB0b3A6IDA7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHJpZ2h0OiAwO1xuICAgICAgICBoZWlnaHQ6ICR7cmVjdC50b3B9cHg7XG4gICAgICBgO1xuXG4gICAgICAvLyBDcmVhdGUgYm90dG9tIG92ZXJsYXkgKGZyb20gYm90dG9tIG9mIGZvcm0gdG8gYm90dG9tIG9mIHZpZXdwb3J0KVxuICAgICAgY29uc3QgYm90dG9tT3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBib3R0b21PdmVybGF5LmNsYXNzTmFtZSA9XG4gICAgICAgIFwibXRybC1mb3JtLWJsb2NraW5nLW92ZXJsYXkgbXRybC1mb3JtLWJsb2NraW5nLW92ZXJsYXktLWJvdHRvbVwiO1xuICAgICAgYm90dG9tT3ZlcmxheS5zdHlsZS5jc3NUZXh0ID0gYCR7YmFzZVN0eWxlc31cbiAgICAgICAgdG9wOiAke3JlY3QuYm90dG9tfXB4O1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgYm90dG9tOiAwO1xuICAgICAgYDtcblxuICAgICAgLy8gQ3JlYXRlIGxlZnQgb3ZlcmxheSAoZnJvbSBsZWZ0IG9mIHZpZXdwb3J0IHRvIGxlZnQgb2YgZm9ybSwgYmV0d2VlbiB0b3AgYW5kIGJvdHRvbSlcbiAgICAgIGNvbnN0IGxlZnRPdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGxlZnRPdmVybGF5LmNsYXNzTmFtZSA9XG4gICAgICAgIFwibXRybC1mb3JtLWJsb2NraW5nLW92ZXJsYXkgbXRybC1mb3JtLWJsb2NraW5nLW92ZXJsYXktLWxlZnRcIjtcbiAgICAgIGxlZnRPdmVybGF5LnN0eWxlLmNzc1RleHQgPSBgJHtiYXNlU3R5bGVzfVxuICAgICAgICB0b3A6ICR7cmVjdC50b3B9cHg7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHdpZHRoOiAke3JlY3QubGVmdH1weDtcbiAgICAgICAgaGVpZ2h0OiAke3JlY3QuaGVpZ2h0fXB4O1xuICAgICAgYDtcblxuICAgICAgLy8gQ3JlYXRlIHJpZ2h0IG92ZXJsYXkgKGZyb20gcmlnaHQgb2YgZm9ybSB0byByaWdodCBvZiB2aWV3cG9ydCwgYmV0d2VlbiB0b3AgYW5kIGJvdHRvbSlcbiAgICAgIGNvbnN0IHJpZ2h0T3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICByaWdodE92ZXJsYXkuY2xhc3NOYW1lID1cbiAgICAgICAgXCJtdHJsLWZvcm0tYmxvY2tpbmctb3ZlcmxheSBtdHJsLWZvcm0tYmxvY2tpbmctb3ZlcmxheS0tcmlnaHRcIjtcbiAgICAgIHJpZ2h0T3ZlcmxheS5zdHlsZS5jc3NUZXh0ID0gYCR7YmFzZVN0eWxlc31cbiAgICAgICAgdG9wOiAke3JlY3QudG9wfXB4O1xuICAgICAgICBsZWZ0OiAke3JlY3QucmlnaHR9cHg7XG4gICAgICAgIHJpZ2h0OiAwO1xuICAgICAgICBoZWlnaHQ6ICR7cmVjdC5oZWlnaHR9cHg7XG4gICAgICBgO1xuXG4gICAgICAvLyBBZGQgY2xpY2sgaGFuZGxlciB0byBzaG93IGRpYWxvZyB3aGVuIGNsaWNraW5nIG9uIG92ZXJsYXlcbiAgICAgIGNvbnN0IGhhbmRsZU92ZXJsYXlDbGljayA9IChlOiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICAvLyBFbWl0IGRhdGE6Y29uZmxpY3QgZXZlbnQgdG8gc2hvdyBkaWFsb2dcbiAgICAgICAgY29uc3QgY29uZmxpY3RFdmVudDogRGF0YUNvbmZsaWN0RXZlbnQgPSB7XG4gICAgICAgICAgY3VycmVudERhdGE6IHsgLi4uY29tcG9uZW50LnN0YXRlLmN1cnJlbnREYXRhIH0sXG4gICAgICAgICAgbmV3RGF0YToge30sXG4gICAgICAgICAgY2FuY2VsbGVkOiBmYWxzZSxcbiAgICAgICAgICBjYW5jZWw6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIFVzZXIgY2hvc2UgdG8ga2VlcCBlZGl0aW5nIC0gZG8gbm90aGluZywgb3ZlcmxheXMgc3RheVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcHJvY2VlZDogKCkgPT4ge1xuICAgICAgICAgICAgLy8gVXNlciBjaG9zZSB0byBkaXNjYXJkIC0gcmVzZXQgZm9ybSB0byBpbml0aWFsIHN0YXRlXG4gICAgICAgICAgICAvLyBTYW1lIGFzIGNhbmNlbCBidXR0b24gYmVoYXZpb3JcbiAgICAgICAgICAgIGhhc1VzZXJJbnRlcmFjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAvLyBSZXNldCBmb3JtIHRvIGluaXRpYWwgZGF0YSAoZm9yY2U9dHJ1ZSBieXBhc3NlcyBwcm90ZWN0aW9uKVxuICAgICAgICAgICAgY29tcG9uZW50LnJlc2V0Py4odHJ1ZSk7XG4gICAgICAgICAgICAvLyBDbGVhciBhbnkgdmFsaWRhdGlvbiBlcnJvcnNcbiAgICAgICAgICAgIGNvbXBvbmVudC5jbGVhckVycm9ycz8uKCk7XG4gICAgICAgICAgICAvLyBEaXNhYmxlIGNvbnRyb2xzIChmb3JtIGlzIG5vdyBwcmlzdGluZSlcbiAgICAgICAgICAgIGNvbXBvbmVudC5kaXNhYmxlQ29udHJvbHM/LigpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5EQVRBX0NPTkZMSUNULCBjb25mbGljdEV2ZW50KTtcbiAgICAgIH07XG5cbiAgICAgIFt0b3BPdmVybGF5LCBib3R0b21PdmVybGF5LCBsZWZ0T3ZlcmxheSwgcmlnaHRPdmVybGF5XS5mb3JFYWNoKFxuICAgICAgICAob3ZlcmxheSkgPT4ge1xuICAgICAgICAgIG92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZU92ZXJsYXlDbGljayk7XG4gICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChvdmVybGF5KTtcbiAgICAgICAgICBibG9ja2luZ092ZXJsYXlzLnB1c2gob3ZlcmxheSk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGJsb2NraW5nIG92ZXJsYXkgZWxlbWVudHNcbiAgICAgKi9cbiAgICBjb25zdCByZW1vdmVCbG9ja2luZ092ZXJsYXlzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKGJsb2NraW5nT3ZlcmxheXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIGJsb2NraW5nT3ZlcmxheXMuZm9yRWFjaCgob3ZlcmxheSkgPT4ge1xuICAgICAgICBvdmVybGF5LnJlbW92ZSgpO1xuICAgICAgfSk7XG4gICAgICBibG9ja2luZ092ZXJsYXlzID0gW107XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgYmxvY2tpbmcgb3ZlcmxheXMgcG9zaXRpb24gKGUuZy4sIG9uIHdpbmRvdyByZXNpemUpXG4gICAgICovXG4gICAgY29uc3QgdXBkYXRlQmxvY2tpbmdPdmVybGF5cyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChibG9ja2luZ092ZXJsYXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBmb3JtRWxlbWVudCA9IGNvbXBvbmVudC5lbGVtZW50O1xuICAgICAgaWYgKCFmb3JtRWxlbWVudCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCByZWN0ID0gZm9ybUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgIC8vIFVwZGF0ZSBlYWNoIG92ZXJsYXkgcG9zaXRpb24gKHVzaW5nIGZpeGVkIHBvc2l0aW9uaW5nLCBubyBzY3JvbGwgb2Zmc2V0IG5lZWRlZClcbiAgICAgIGNvbnN0IFt0b3BPdmVybGF5LCBib3R0b21PdmVybGF5LCBsZWZ0T3ZlcmxheSwgcmlnaHRPdmVybGF5XSA9XG4gICAgICAgIGJsb2NraW5nT3ZlcmxheXM7XG5cbiAgICAgIGlmICh0b3BPdmVybGF5KSB7XG4gICAgICAgIHRvcE92ZXJsYXkuc3R5bGUuaGVpZ2h0ID0gYCR7cmVjdC50b3B9cHhgO1xuICAgICAgfVxuICAgICAgaWYgKGJvdHRvbU92ZXJsYXkpIHtcbiAgICAgICAgYm90dG9tT3ZlcmxheS5zdHlsZS50b3AgPSBgJHtyZWN0LmJvdHRvbX1weGA7XG4gICAgICB9XG4gICAgICBpZiAobGVmdE92ZXJsYXkpIHtcbiAgICAgICAgbGVmdE92ZXJsYXkuc3R5bGUudG9wID0gYCR7cmVjdC50b3B9cHhgO1xuICAgICAgICBsZWZ0T3ZlcmxheS5zdHlsZS53aWR0aCA9IGAke3JlY3QubGVmdH1weGA7XG4gICAgICAgIGxlZnRPdmVybGF5LnN0eWxlLmhlaWdodCA9IGAke3JlY3QuaGVpZ2h0fXB4YDtcbiAgICAgIH1cbiAgICAgIGlmIChyaWdodE92ZXJsYXkpIHtcbiAgICAgICAgcmlnaHRPdmVybGF5LnN0eWxlLnRvcCA9IGAke3JlY3QudG9wfXB4YDtcbiAgICAgICAgcmlnaHRPdmVybGF5LnN0eWxlLmxlZnQgPSBgJHtyZWN0LnJpZ2h0fXB4YDtcbiAgICAgICAgcmlnaHRPdmVybGF5LnN0eWxlLmhlaWdodCA9IGAke3JlY3QuaGVpZ2h0fXB4YDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBibG9ja2luZyBvdmVybGF5cyBiYXNlZCBvbiBtb2RpZmllZCBzdGF0ZVxuICAgICAqL1xuICAgIGNvbnN0IHVwZGF0ZVByb3RlY3Rpb25TdGF0ZSA9IChtb2RpZmllZDogYm9vbGVhbik6IHZvaWQgPT4ge1xuICAgICAgaWYgKG1vZGlmaWVkICYmIGhhc1VzZXJJbnRlcmFjdGVkKSB7XG4gICAgICAgIGNyZWF0ZUJsb2NraW5nT3ZlcmxheXMoKTtcbiAgICAgICAgLy8gQWRkIHJlc2l6ZS9zY3JvbGwgbGlzdGVuZXJzIHRvIHVwZGF0ZSBvdmVybGF5IHBvc2l0aW9uc1xuICAgICAgICBpZiAoIXJlc2l6ZUhhbmRsZXIpIHtcbiAgICAgICAgICByZXNpemVIYW5kbGVyID0gdXBkYXRlQmxvY2tpbmdPdmVybGF5cztcbiAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCByZXNpemVIYW5kbGVyKTtcbiAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCByZXNpemVIYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVtb3ZlQmxvY2tpbmdPdmVybGF5cygpO1xuICAgICAgICAvLyBSZW1vdmUgcmVzaXplL3Njcm9sbCBsaXN0ZW5lcnNcbiAgICAgICAgaWYgKHJlc2l6ZUhhbmRsZXIpIHtcbiAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCByZXNpemVIYW5kbGVyKTtcbiAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCByZXNpemVIYW5kbGVyKTtcbiAgICAgICAgICByZXNpemVIYW5kbGVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBMaXN0ZW4gZm9yIGZpZWxkOmNoYW5nZSBldmVudHMgdG8gZGV0ZWN0IGFjdHVhbCB1c2VyIGVkaXRzXG4gICAgLy8gVGhpcyBpcyBtb3JlIHJlbGlhYmxlIHRoYW4gU1RBVEVfQ0hBTkdFIGJlY2F1c2UgaXQgZmlyZXMgb24gZXZlcnkgZmllbGQgZWRpdFxuICAgIGNvbXBvbmVudC5vbj8uKFwiZmllbGQ6Y2hhbmdlXCIsICgpID0+IHtcbiAgICAgIC8vIElnbm9yZSBmaWVsZDpjaGFuZ2UgZXZlbnRzIGR1cmluZyBkYXRhIGxvYWRpbmdcbiAgICAgIC8vIFRoaXMgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIGZyb20gcHJvZ3JhbW1hdGljIGZpZWxkIHVwZGF0ZXNcbiAgICAgIGlmIChpc0xvYWRpbmdEYXRhKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gT25seSBzZXQgaGFzVXNlckludGVyYWN0ZWQgaWYgZGF0YSBoYXMgYmVlbiBsb2FkZWRcbiAgICAgIC8vIFRoaXMgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIGR1cmluZyBpbml0aWFsIGZvcm0gc2V0dXBcbiAgICAgIGlmIChkYXRhSGFzQmVlbkxvYWRlZCAmJiAhaGFzVXNlckludGVyYWN0ZWQpIHtcbiAgICAgICAgaGFzVXNlckludGVyYWN0ZWQgPSB0cnVlO1xuICAgICAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIHNob3cgb3ZlcmxheXMgbm93XG4gICAgICAgIGlmIChjb21wb25lbnQuc3RhdGUubW9kaWZpZWQpIHtcbiAgICAgICAgICB1cGRhdGVQcm90ZWN0aW9uU3RhdGUodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIExpc3RlbiBmb3Igc3RhdGUgY2hhbmdlcyB0byBzaG93L2hpZGUgb3ZlcmxheXNcbiAgICBjb21wb25lbnQub24/LihGT1JNX0VWRU5UUy5TVEFURV9DSEFOR0UsIChldmVudDogeyBtb2RpZmllZDogYm9vbGVhbiB9KSA9PiB7XG4gICAgICAvLyBXaGVuIGZvcm0gYmVjb21lcyBwcmlzdGluZSAoZGF0YSBsb2FkZWQpLCByZXNldCB0aGUgaW50ZXJhY3Rpb24gZmxhZ1xuICAgICAgLy8gYW5kIG1hcmsgdGhhdCBkYXRhIGhhcyBiZWVuIGxvYWRlZFxuICAgICAgaWYgKCFldmVudC5tb2RpZmllZCkge1xuICAgICAgICBoYXNVc2VySW50ZXJhY3RlZCA9IGZhbHNlO1xuICAgICAgICBkYXRhSGFzQmVlbkxvYWRlZCA9IHRydWU7XG4gICAgICAgIGlzTG9hZGluZ0RhdGEgPSB0cnVlO1xuXG4gICAgICAgIC8vIENsZWFyIHRoZSBsb2FkaW5nIGZsYWcgYWZ0ZXIgYSBzaG9ydCBkZWxheSB0byBhbGxvdyBhbGwgcHJvZ3JhbW1hdGljXG4gICAgICAgIC8vIGZpZWxkIHVwZGF0ZXMgdG8gY29tcGxldGUgKGN1c3RvbSBmaWVsZHMgbWF5IHVwZGF0ZSBhc3luYylcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaXNMb2FkaW5nRGF0YSA9IGZhbHNlO1xuICAgICAgICB9LCAxMDApO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgcHJvdGVjdGlvbiBzdGF0ZVxuICAgICAgdXBkYXRlUHJvdGVjdGlvblN0YXRlKGV2ZW50Lm1vZGlmaWVkKTtcbiAgICB9KTtcblxuICAgIC8vIEFsc28gbGlzdGVuIGZvciByZXNldCBldmVudCB0byByZW1vdmUgb3ZlcmxheXNcbiAgICBjb21wb25lbnQub24/LihGT1JNX0VWRU5UUy5SRVNFVCwgKCkgPT4ge1xuICAgICAgdXBkYXRlUHJvdGVjdGlvblN0YXRlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIFJlZ2lzdGVyIGNsZWFudXAgd2hlbiBjb21wb25lbnQgaXMgZGVzdHJveWVkXG4gICAgY29uc3Qgb3JpZ2luYWxMaWZlY3ljbGUgPSBjb21wb25lbnQubGlmZWN5Y2xlO1xuICAgIGlmIChvcmlnaW5hbExpZmVjeWNsZSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gb3JpZ2luYWxMaWZlY3ljbGUuZGVzdHJveTtcbiAgICAgIG9yaWdpbmFsTGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGJsb2NraW5nIG92ZXJsYXlzXG4gICAgICAgIHJlbW92ZUJsb2NraW5nT3ZlcmxheXMoKTtcbiAgICAgICAgaWYgKHJlc2l6ZUhhbmRsZXIpIHtcbiAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCByZXNpemVIYW5kbGVyKTtcbiAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCByZXNpemVIYW5kbGVyKTtcbiAgICAgICAgICByZXNpemVIYW5kbGVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBDYWxsIG9yaWdpbmFsIGRlc3Ryb3lcbiAgICAgICAgb3JpZ2luYWxEZXN0cm95Py4oKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhQcm90ZWN0aW9uO1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2FwaS50c1xuXG4vKipcbiAqIEFQSSBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogUHJvdmlkZXMgYSBjbGVhbiwgdW5pZmllZCBwdWJsaWMgQVBJIGZvciB0aGUgZm9ybVxuICogQWxzbyB3aXJlcyB1cCBjb250cm9sIGJ1dHRvbiBjbGljayBoYW5kbGVycyAoc3VibWl0L2NhbmNlbClcbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEZvcm1Db25maWcsXG4gIEJhc2VGb3JtQ29tcG9uZW50LFxuICBGb3JtQ29tcG9uZW50LFxuICBGb3JtRGF0YSxcbiAgRGF0YVN0YXRlLFxuICBGb3JtU3RhdGUsXG4gIEZvcm1GaWVsZCxcbiAgRm9ybUZpZWxkUmVnaXN0cnksXG4gIEZvcm1WYWxpZGF0aW9uUmVzdWx0LFxuICBGb3JtU3VibWl0T3B0aW9ucyxcbiAgRmllbGRWYWx1ZSxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBGT1JNX0VWRU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBXaXJlcyB1cCBjbGljayBoYW5kbGVycyBmb3IgY29udHJvbCBidXR0b25zIChzdWJtaXQsIGNhbmNlbClcbiAqL1xuY29uc3Qgd2lyZUNvbnRyb2xCdXR0b25zID0gKFxuICBjb250cm9sczogTWFwPHN0cmluZywgRm9ybUZpZWxkPixcbiAgYXBpOiBGb3JtQ29tcG9uZW50LFxuICBjb25maWc6IEZvcm1Db25maWcsXG4pOiB2b2lkID0+IHtcbiAgLy8gV2lyZSBzdWJtaXQgYnV0dG9uXG4gIGNvbnN0IHN1Ym1pdEJ1dHRvbiA9IGNvbnRyb2xzLmdldChcInN1Ym1pdFwiKTtcbiAgaWYgKHN1Ym1pdEJ1dHRvbj8uZWxlbWVudCkge1xuICAgIHN1Ym1pdEJ1dHRvbi5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoY29uZmlnLm9uU3VibWl0KSB7XG4gICAgICAgIC8vIFVzZSBjdXN0b20gc3VibWl0IGhhbmRsZXJcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gYXBpLmdldERhdGEoKTtcbiAgICAgICAgICBhd2FpdCBjb25maWcub25TdWJtaXQoZGF0YSwgYXBpKTtcbiAgICAgICAgICAvLyBBZnRlciBzdWNjZXNzZnVsIHN1Ym1pdCwgZGlzYWJsZSBjb250cm9scyAoZm9ybSBpcyBub3cgcHJpc3RpbmUpXG4gICAgICAgICAgYXBpLmRpc2FibGVDb250cm9scygpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGb3JtIHN1Ym1pdCBlcnJvcjpcIiwgZXJyb3IpO1xuICAgICAgICAgIC8vIE9uIGVycm9yLCBhbHNvIGRpc2FibGUgY29udHJvbHMgdG8gcHJldmVudCByZXBlYXRlZCBjbGlja3NcbiAgICAgICAgICBhcGkuZGlzYWJsZUNvbnRyb2xzKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVzZSBkZWZhdWx0IGZvcm0gc3VibWl0IChoYW5kbGVzIGRpc2FibGluZyBpbnRlcm5hbGx5KVxuICAgICAgICBhd2FpdCBhcGkuc3VibWl0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBXaXJlIGNhbmNlbCBidXR0b25cbiAgY29uc3QgY2FuY2VsQnV0dG9uID0gY29udHJvbHMuZ2V0KFwiY2FuY2VsXCIpO1xuICBpZiAoY2FuY2VsQnV0dG9uPy5lbGVtZW50KSB7XG4gICAgY2FuY2VsQnV0dG9uLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgIGlmIChjb25maWcub25DYW5jZWwpIHtcbiAgICAgICAgLy8gVXNlIGN1c3RvbSBjYW5jZWwgaGFuZGxlclxuICAgICAgICBjb25maWcub25DYW5jZWwoYXBpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERlZmF1bHQ6IHJlc2V0IGZvcm0gdG8gaW5pdGlhbCBzdGF0ZVxuICAgICAgICAvLyBVc2UgZm9yY2U9dHJ1ZSB0byBieXBhc3MgcHJvdGVjdGlvbiBzaW5jZSB0aGlzIGlzIGFuIGludGVudGlvbmFsIHVzZXIgYWN0aW9uXG4gICAgICAgIGFwaS5yZXNldCh0cnVlKTtcbiAgICAgIH1cbiAgICAgIC8vIENsZWFyIGFueSB2YWxpZGF0aW9uIGVycm9ycyAodmlzdWFsIHN0YXRlIG9uIGZpZWxkcylcbiAgICAgIGFwaS5jbGVhckVycm9ycygpO1xuICAgICAgLy8gQWZ0ZXIgY2FuY2VsLCBkaXNhYmxlIGNvbnRyb2xzIChmb3JtIGlzIG5vdyBwcmlzdGluZSlcbiAgICAgIGFwaS5kaXNhYmxlQ29udHJvbHMoKTtcbiAgICB9KTtcbiAgfVxufTtcblxuLyoqXG4gKiBFeHRlbmRlZCBjb21wb25lbnQgaW50ZXJmYWNlIGJlZm9yZSBBUEkgaXMgYXBwbGllZFxuICovXG5pbnRlcmZhY2UgRW5oYW5jZWRGb3JtQ29tcG9uZW50IGV4dGVuZHMgQmFzZUZvcm1Db21wb25lbnQge1xuICBmb3JtOiBIVE1MRm9ybUVsZW1lbnQ7XG4gIHVpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeTtcbiAgZmlsZXM6IEZvcm1GaWVsZFJlZ2lzdHJ5O1xuICBzdGF0ZTogRm9ybVN0YXRlO1xuICBjb250cm9sczogTWFwPHN0cmluZywgRm9ybUZpZWxkPjtcblxuICAvLyBEYXRhIG1ldGhvZHNcbiAgZ2V0RGF0YTogKCkgPT4gRm9ybURhdGE7XG4gIHNldERhdGE6IChkYXRhOiBGb3JtRGF0YSwgc2lsZW50PzogYm9vbGVhbikgPT4gdm9pZDtcbiAgZ2V0RmllbGRWYWx1ZTogKG5hbWU6IHN0cmluZykgPT4gRmllbGRWYWx1ZTtcbiAgc2V0RmllbGRWYWx1ZTogKG5hbWU6IHN0cmluZywgdmFsdWU6IEZpZWxkVmFsdWUsIHNpbGVudD86IGJvb2xlYW4pID0+IHZvaWQ7XG4gIGlzTW9kaWZpZWQ6ICgpID0+IGJvb2xlYW47XG4gIGdldE1vZGlmaWVkRGF0YTogKCkgPT4gRm9ybURhdGE7XG4gIHNuYXBzaG90OiAoKSA9PiB2b2lkO1xuICByZXNldDogKGZvcmNlPzogYm9vbGVhbikgPT4gYm9vbGVhbjtcbiAgY2xlYXI6IChmb3JjZT86IGJvb2xlYW4pID0+IGJvb2xlYW47XG5cbiAgLy8gRmllbGQgbWV0aG9kc1xuICBnZXRGaWVsZDogKG5hbWU6IHN0cmluZykgPT4gRm9ybUZpZWxkIHwgdW5kZWZpbmVkO1xuICBnZXRGaWVsZE5hbWVzOiAoKSA9PiBzdHJpbmdbXTtcbiAgaGFzRmllbGQ6IChuYW1lOiBzdHJpbmcpID0+IGJvb2xlYW47XG5cbiAgLy8gQ29udHJvbGxlciBtZXRob2RzXG4gIGdldERhdGFTdGF0ZTogKCkgPT4gRGF0YVN0YXRlO1xuICBlbmFibGVDb250cm9sczogKCkgPT4gdm9pZDtcbiAgZGlzYWJsZUNvbnRyb2xzOiAoKSA9PiB2b2lkO1xuICBlbmFibGVGaWVsZHM6ICgpID0+IHZvaWQ7XG4gIGRpc2FibGVGaWVsZHM6ICgpID0+IHZvaWQ7XG5cbiAgLy8gU3VibWl0L1ZhbGlkYXRpb24gbWV0aG9kc1xuICB2YWxpZGF0ZTogKCkgPT4gRm9ybVZhbGlkYXRpb25SZXN1bHQ7XG4gIHZhbGlkYXRlRmllbGQ6IChmaWVsZE5hbWU6IHN0cmluZykgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBzdWJtaXQ6IChvcHRpb25zPzogRm9ybVN1Ym1pdE9wdGlvbnMpID0+IFByb21pc2U8dW5rbm93bj47XG4gIHNldFZhbGlkYXRpb25SdWxlczogKHJ1bGVzOiBpbXBvcnQoXCIuLi90eXBlc1wiKS5Gb3JtVmFsaWRhdGlvblJ1bGVbXSkgPT4gdm9pZDtcbiAgY2xlYXJFcnJvcnM6ICgpID0+IHZvaWQ7XG4gIGNsZWFyRmllbGRFcnJvcjogKGZpZWxkOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNldEZpZWxkRXJyb3I6IChmaWVsZDogc3RyaW5nLCBlcnJvcjogc3RyaW5nKSA9PiB2b2lkO1xuICBnZXRGaWVsZEVycm9yOiAoZmllbGQ6IHN0cmluZykgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8vIEV2ZW50IG1ldGhvZHNcbiAgb24/OiAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb24pID0+IHZvaWQ7XG4gIG9mZj86IChldmVudDogc3RyaW5nLCBoYW5kbGVyOiBGdW5jdGlvbikgPT4gdm9pZDtcbiAgZW1pdD86IChldmVudDogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gdm9pZDtcblxuICAvLyBMaWZlY3ljbGVcbiAgbGlmZWN5Y2xlPzoge1xuICAgIGRlc3Ryb3k6ICgpID0+IHZvaWQ7XG4gIH07XG59XG5cbi8qKlxuICogd2l0aEFQSSBmZWF0dXJlXG4gKiBDcmVhdGVzIGEgY2xlYW4gcHVibGljIEFQSSBmb3IgdGhlIGZvcm0gY29tcG9uZW50XG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoQVBJID0gKGNvbmZpZzogRm9ybUNvbmZpZykgPT4ge1xuICByZXR1cm4gKGNvbXBvbmVudDogRW5oYW5jZWRGb3JtQ29tcG9uZW50KTogRm9ybUNvbXBvbmVudCA9PiB7XG4gICAgLy8gUmVnaXN0ZXIgZXZlbnQgaGFuZGxlcnMgZnJvbSBjb25maWdcbiAgICBpZiAoY29uZmlnLm9uICYmIGNvbXBvbmVudC5vbikge1xuICAgICAgZm9yIChjb25zdCBbZXZlbnQsIGhhbmRsZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZy5vbikpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBjb21wb25lbnQub24oZXZlbnQsIGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBwdWJsaWMgQVBJXG4gICAgY29uc3QgYXBpOiBGb3JtQ29tcG9uZW50ID0ge1xuICAgICAgLy8gQ29yZSBwcm9wZXJ0aWVzXG4gICAgICBlbGVtZW50OiBjb21wb25lbnQuZWxlbWVudCxcbiAgICAgIGZvcm06IGNvbXBvbmVudC5mb3JtLFxuICAgICAgdWk6IGNvbXBvbmVudC51aSxcbiAgICAgIGZpZWxkczogY29tcG9uZW50LmZpZWxkcyxcbiAgICAgIHN0YXRlOiBjb21wb25lbnQuc3RhdGUsXG5cbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgLy8gRGF0YSBBUElcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBhbGwgZm9ybSBkYXRhIGFzIGEga2V5LXZhbHVlIG9iamVjdFxuICAgICAgICovXG4gICAgICBnZXREYXRhKCk6IEZvcm1EYXRhIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5nZXREYXRhKCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNldCBmb3JtIGRhdGEgZnJvbSBhIGtleS12YWx1ZSBvYmplY3RcbiAgICAgICAqIEBwYXJhbSBkYXRhIC0gRGF0YSB0byBzZXRcbiAgICAgICAqIEBwYXJhbSBzaWxlbnQgLSBJZiB0cnVlLCBkb24ndCBlbWl0IGNoYW5nZSBldmVudHNcbiAgICAgICAqL1xuICAgICAgc2V0RGF0YShkYXRhOiBGb3JtRGF0YSwgc2lsZW50PzogYm9vbGVhbik6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQuc2V0RGF0YShkYXRhLCBzaWxlbnQpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgYSBzcGVjaWZpYyBmaWVsZCdzIHZhbHVlXG4gICAgICAgKiBAcGFyYW0gbmFtZSAtIEZpZWxkIG5hbWVcbiAgICAgICAqL1xuICAgICAgZ2V0RmllbGRWYWx1ZShuYW1lOiBzdHJpbmcpOiBGaWVsZFZhbHVlIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5nZXRGaWVsZFZhbHVlKG5hbWUpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTZXQgYSBzcGVjaWZpYyBmaWVsZCdzIHZhbHVlXG4gICAgICAgKiBAcGFyYW0gbmFtZSAtIEZpZWxkIG5hbWVcbiAgICAgICAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIHNldFxuICAgICAgICogQHBhcmFtIHNpbGVudCAtIElmIHRydWUsIGRvbid0IGVtaXQgY2hhbmdlIGV2ZW50c1xuICAgICAgICovXG4gICAgICBzZXRGaWVsZFZhbHVlKFxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIHZhbHVlOiBGaWVsZFZhbHVlLFxuICAgICAgICBzaWxlbnQ/OiBib29sZWFuLFxuICAgICAgKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5zZXRGaWVsZFZhbHVlKG5hbWUsIHZhbHVlLCBzaWxlbnQpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgYSBmaWVsZCBjb21wb25lbnQgYnkgbmFtZVxuICAgICAgICogQHBhcmFtIG5hbWUgLSBGaWVsZCBuYW1lXG4gICAgICAgKi9cbiAgICAgIGdldEZpZWxkKG5hbWU6IHN0cmluZyk6IEZvcm1GaWVsZCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuZ2V0RmllbGQobmFtZSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBhbGwgZmllbGQgbmFtZXNcbiAgICAgICAqL1xuICAgICAgZ2V0RmllbGROYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuZ2V0RmllbGROYW1lcygpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDaGVjayBpZiBmb3JtIGhhcyBiZWVuIG1vZGlmaWVkIGZyb20gaW5pdGlhbC9zbmFwc2hvdCBzdGF0ZVxuICAgICAgICovXG4gICAgICBpc01vZGlmaWVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LmlzTW9kaWZpZWQoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgLy8gU3RhdGUgQVBJXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgdGhlIGN1cnJlbnQgZGF0YSBzdGF0ZSAocHJpc3RpbmUgb3IgZGlydHkpXG4gICAgICAgKi9cbiAgICAgIGdldERhdGFTdGF0ZSgpOiBEYXRhU3RhdGUge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LmdldERhdGFTdGF0ZSgpO1xuICAgICAgfSxcblxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAvLyBWYWxpZGF0aW9uIEFQSVxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAgIC8qKlxuICAgICAgICogVmFsaWRhdGUgdGhlIGZvcm0gYWdhaW5zdCBjb25maWd1cmVkIHJ1bGVzXG4gICAgICAgKiBBdXRvbWF0aWNhbGx5IHNob3dzIGVycm9ycyBvbiBmaWVsZCBjb21wb25lbnRzXG4gICAgICAgKiBAcmV0dXJucyBWYWxpZGF0aW9uIHJlc3VsdCB3aXRoIHZhbGlkIGZsYWcgYW5kIGVycm9yc1xuICAgICAgICovXG4gICAgICB2YWxpZGF0ZSgpOiBGb3JtVmFsaWRhdGlvblJlc3VsdCB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQudmFsaWRhdGUoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogVmFsaWRhdGUgYSBzaW5nbGUgZmllbGRcbiAgICAgICAqIEBwYXJhbSBmaWVsZE5hbWUgLSBGaWVsZCBuYW1lIHRvIHZhbGlkYXRlXG4gICAgICAgKiBAcmV0dXJucyBFcnJvciBtZXNzYWdlIGlmIGludmFsaWQsIHVuZGVmaW5lZCBpZiB2YWxpZFxuICAgICAgICovXG4gICAgICB2YWxpZGF0ZUZpZWxkKGZpZWxkTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC52YWxpZGF0ZUZpZWxkKGZpZWxkTmFtZSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENsZWFyIGFsbCB2YWxpZGF0aW9uIGVycm9yc1xuICAgICAgICovXG4gICAgICBjbGVhckVycm9ycygpOiBGb3JtQ29tcG9uZW50IHtcbiAgICAgICAgY29tcG9uZW50LmNsZWFyRXJyb3JzKCk7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENsZWFyIGVycm9yIGZvciBhIHNwZWNpZmljIGZpZWxkXG4gICAgICAgKiBAcGFyYW0gZmllbGQgLSBGaWVsZCBuYW1lXG4gICAgICAgKi9cbiAgICAgIGNsZWFyRmllbGRFcnJvcihmaWVsZDogc3RyaW5nKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5jbGVhckZpZWxkRXJyb3IoZmllbGQpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTZXQgZXJyb3IgZm9yIGEgc3BlY2lmaWMgZmllbGRcbiAgICAgICAqIEBwYXJhbSBmaWVsZCAtIEZpZWxkIG5hbWVcbiAgICAgICAqIEBwYXJhbSBlcnJvciAtIEVycm9yIG1lc3NhZ2VcbiAgICAgICAqL1xuICAgICAgc2V0RmllbGRFcnJvcihmaWVsZDogc3RyaW5nLCBlcnJvcjogc3RyaW5nKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5zZXRGaWVsZEVycm9yKGZpZWxkLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBlcnJvciBmb3IgYSBzcGVjaWZpYyBmaWVsZFxuICAgICAgICogQHBhcmFtIGZpZWxkIC0gRmllbGQgbmFtZVxuICAgICAgICogQHJldHVybnMgRXJyb3IgbWVzc2FnZSBvciB1bmRlZmluZWRcbiAgICAgICAqL1xuICAgICAgZ2V0RmllbGRFcnJvcihmaWVsZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5nZXRGaWVsZEVycm9yKGZpZWxkKTtcbiAgICAgIH0sXG5cbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgLy8gU3VibWl0IEFQSVxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAgIC8qKlxuICAgICAgICogU3VibWl0IHRoZSBmb3JtXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHN1Ym1pdCBjb25maWd1cmF0aW9uXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIHN1Ym1pdChvcHRpb25zPzogRm9ybVN1Ym1pdE9wdGlvbnMpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5zdWJtaXQob3B0aW9ucyk7XG4gICAgICB9LFxuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIC8vIFN0YXRlIE1hbmFnZW1lbnQgQVBJXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgICAgLyoqXG4gICAgICAgKiBSZXNldCBmb3JtIHRvIGluaXRpYWwvc25hcHNob3Qgc3RhdGVcbiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2UgLSBJZiB0cnVlLCBieXBhc3MgcHJvdGVjdGlvbiBhbmQgcmVzZXQgaW1tZWRpYXRlbHlcbiAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHJlc2V0IHdhcyBwZXJmb3JtZWQsIGZhbHNlIGlmIGNhbmNlbGxlZCBieSBwcm90ZWN0aW9uXG4gICAgICAgKi9cbiAgICAgIHJlc2V0KGZvcmNlPzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LnJlc2V0KGZvcmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2xlYXIgYWxsIGZvcm0gZmllbGRzXG4gICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvcmNlIC0gSWYgdHJ1ZSwgYnlwYXNzIHByb3RlY3Rpb24gYW5kIGNsZWFyIGltbWVkaWF0ZWx5XG4gICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBjbGVhciB3YXMgcGVyZm9ybWVkLCBmYWxzZSBpZiBjYW5jZWxsZWQgYnkgcHJvdGVjdGlvblxuICAgICAgICovXG4gICAgICBjbGVhcihmb3JjZT86IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5jbGVhcihmb3JjZSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEVuYWJsZSBhbGwgZm9ybSBmaWVsZHNcbiAgICAgICAqL1xuICAgICAgZW5hYmxlKCk6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQuZW5hYmxlRmllbGRzKCk7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIERpc2FibGUgYWxsIGZvcm0gZmllbGRzXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGUoKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5kaXNhYmxlRmllbGRzKCk7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEVuYWJsZSBjb250cm9sIGJ1dHRvbnMgKHN1Ym1pdCwgY2FuY2VsLCBldGMuKVxuICAgICAgICovXG4gICAgICBlbmFibGVDb250cm9scygpOiBGb3JtQ29tcG9uZW50IHtcbiAgICAgICAgY29tcG9uZW50LmVuYWJsZUNvbnRyb2xzKCk7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIERpc2FibGUgY29udHJvbCBidXR0b25zXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVDb250cm9scygpOiBGb3JtQ29tcG9uZW50IHtcbiAgICAgICAgY29tcG9uZW50LmRpc2FibGVDb250cm9scygpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAvLyBFdmVudCBBUElcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgICAvKipcbiAgICAgICAqIEFkZCBhbiBldmVudCBsaXN0ZW5lclxuICAgICAgICogQHBhcmFtIGV2ZW50IC0gRXZlbnQgbmFtZVxuICAgICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICAgKi9cbiAgICAgIG9uKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5vbj8uKGV2ZW50LCBoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyXG4gICAgICAgKiBAcGFyYW0gZXZlbnQgLSBFdmVudCBuYW1lXG4gICAgICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICAgICAqL1xuICAgICAgb2ZmKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5vZmY/LihldmVudCwgaGFuZGxlcik7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEVtaXQgYW4gZXZlbnRcbiAgICAgICAqIEBwYXJhbSBldmVudCAtIEV2ZW50IG5hbWVcbiAgICAgICAqIEBwYXJhbSBkYXRhIC0gRXZlbnQgZGF0YVxuICAgICAgICovXG4gICAgICBlbWl0KGV2ZW50OiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oZXZlbnQsIGRhdGEpO1xuICAgICAgfSxcblxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAvLyBMaWZlY3ljbGUgQVBJXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgICAgLyoqXG4gICAgICAgKiBEZXN0cm95IHRoZSBmb3JtIGFuZCBjbGVhbiB1cCByZXNvdXJjZXNcbiAgICAgICAqL1xuICAgICAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgLy8gQ2xlYXIgYWxsIGZpZWxkIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICBmb3IgKGNvbnN0IFssIGZpZWxkXSBvZiBjb21wb25lbnQuZmllbGRzKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGZpZWxkLmRlc3Ryb3koKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciBjb250cm9sIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICBmb3IgKGNvbnN0IFssIGNvbnRyb2xdIG9mIGNvbXBvbmVudC5jb250cm9scykge1xuICAgICAgICAgIGlmICh0eXBlb2YgY29udHJvbC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGNvbnRyb2wuZGVzdHJveSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbGwgbGlmZWN5Y2xlIGRlc3Ryb3kgaWYgYXZhaWxhYmxlXG4gICAgICAgIGlmIChjb21wb25lbnQubGlmZWN5Y2xlPy5kZXN0cm95KSB7XG4gICAgICAgICAgY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgZm9ybSBlbGVtZW50IGZyb20gRE9NXG4gICAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudD8ucGFyZW50Tm9kZSkge1xuICAgICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY29tcG9uZW50LmVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBkZXN0cm95IGV2ZW50XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuUkVTRVQpO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8gV2lyZSB1cCBjb250cm9sIGJ1dHRvbiBjbGljayBoYW5kbGVyc1xuICAgIHdpcmVDb250cm9sQnV0dG9ucyhjb21wb25lbnQuY29udHJvbHMsIGFwaSwgY29uZmlnKTtcblxuICAgIHJldHVybiBhcGk7XG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCB3aXRoQVBJO1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QSxRQUM5QixPQUFPO0FBQUE7QUFBQSxNQVFULElBQUksQ0FBQyxPQUFlLE1BQXNCO0FBQUEsUUFDeEMsV0FBVSxPQUFPLE9BQU8sSUFBSTtBQUFBO0FBQUEsTUFVOUIsT0FBTyxHQUFTO0FBQUEsUUFFZCxjQUFjLFVBQVUsV0FBVSxRQUFRO0FBQUEsVUFDeEMsSUFBSSxPQUFPLE1BQU0sWUFBWSxZQUFZO0FBQUEsWUFDdkMsTUFBTSxRQUFRO0FBQUEsVUFDaEI7QUFBQSxRQUNGO0FBQUEsUUFHQSxjQUFjLFlBQVksV0FBVSxVQUFVO0FBQUEsVUFDNUMsSUFBSSxPQUFPLFFBQVEsWUFBWSxZQUFZO0FBQUEsWUFDekMsUUFBUSxRQUFRO0FBQUEsVUFDbEI7QUFBQSxRQUNGO0FBQUEsUUFHQSxJQUFJLFdBQVUsV0FBVyxTQUFTO0FBQUEsVUFDaEMsV0FBVSxVQUFVLFFBQVE7QUFBQSxRQUM5QjtBQUFBLFFBR0EsSUFBSSxXQUFVLFNBQVMsWUFBWTtBQUFBLFVBQ2pDLFdBQVUsUUFBUSxXQUFXLFlBQVksV0FBVSxPQUFPO0FBQUEsUUFDNUQ7QUFBQSxRQUdBLFdBQVUsT0FBTyxZQUFZLEtBQUs7QUFBQTtBQUFBLElBRXRDO0FBQUEsSUFHQSxtQkFBbUIsV0FBVSxVQUFVLEtBQUssTUFBTTtBQUFBLElBRWxELE9BQU87QUFBQTtBQUFBOztBVHRWSixJQUFNLGFBQWEsQ0FBQyxTQUFxQixDQUFDLE1BQXFCO0FBQUEsRUFDcEUsSUFBSTtBQUFBLElBRUYsTUFBTSxhQUFhLGlCQUFpQixNQUFNO0FBQUEsSUFJMUMsTUFBTSxhQUFZLG1CQUVoQiwwQkFHQSx5QkFBVyxHQUdYLDBCQUFZLGlCQUFpQixVQUFVLENBQUMsR0FHeEMsV0FBVyxVQUFVLEdBR3JCLFdBQVcsVUFBVSxHQUdyQixTQUFTLFVBQVUsR0FHbkIsZUFBZSxVQUFVLEdBR3pCLFdBQVcsVUFBVSxHQUdyQixlQUFlLFVBQVUsR0FHekIsNEJBQWMsR0FHZCxTQUFRLFVBQVUsQ0FDcEIsRUFBRSxVQUFVO0FBQUEsSUFHWixJQUFJLE9BQU8sYUFBYSxXQUFVLFNBQVM7QUFBQSxNQUN6QyxPQUFPLFVBQVUsWUFBWSxXQUFVLE9BQU87QUFBQSxJQUNoRDtBQUFBLElBRUEsT0FBTztBQUFBLElBQ1AsT0FBTyxPQUFPO0FBQUEsSUFDZCxRQUFRLE1BQU0sd0JBQXdCLEtBQUs7QUFBQSxJQUMzQyxNQUFNLElBQUksTUFBTSwwQkFBMkIsTUFBZ0IsU0FBUztBQUFBO0FBQUE7IiwKICAiZGVidWdJZCI6ICIxOEE1QkQ3RkI0QUE4M0QxNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
|
|
7225
|
+
//# debugId=1895CC7D92289CA364756E2164756E21
|
|
7226
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvdXRpbHMudHMiLCAiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvdGFwLnRzIiwgIi4uL3NyYy9jb3JlL2dlc3R1cmVzL3N3aXBlLnRzIiwgIi4uL3NyYy9jb3JlL2dlc3R1cmVzL2xvbmdwcmVzcy50cyIsICIuLi9zcmMvY29yZS9nZXN0dXJlcy9wYW4udHMiLCAiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvcGluY2gudHMiLCAiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvcm90YXRlLnRzIiwgIi4uL3NyYy9jb3JlL2dlc3R1cmVzL21hbmFnZXIudHMiLCAiLi4vc3JjL2NvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlcy9pbmRleC50cyIsICIuLi9zcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3RhcC50cyIsICIuLi9zcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3N3aXBlLnRzIiwgIi4uL3NyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMvbG9uZ3ByZXNzLnRzIiwgIi4uL3NyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMvcGFuLnRzIiwgIi4uL3NyYy9jb3JlL2xheW91dC9zY2hlbWEudHMiLCAiLi4vc3JjL2NvcmUvbGF5b3V0L2NvbmZpZy50cyIsICIuLi9zcmMvY29yZS9sYXlvdXQvanN4LnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L3ZpZXdwb3J0LnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3V0aWxzLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL2Jhc2UudHMiLCAiLi4vc3JjL2NvcmUvdmlld3BvcnQvY29uc3RhbnRzLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3ZpcnR1YWwudHMiLCAiLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvc2Nyb2xsaW5nLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL21vbWVudHVtLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3Njcm9sbGJhci50cyIsICIuLi9zcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9jb2xsZWN0aW9uLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3BsYWNlaG9sZGVycy50cyIsICIuLi9zcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9yZW5kZXJpbmcudHMiLCAiLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvZXZlbnRzLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L3ZsaXN0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL3ZpZXdwb3J0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL2FwaS50cyIsICIuLi9zcmMvY29tcG9uZW50cy92bGlzdC9jb25zdGFudHMudHMiLCAiLi4vc3JjL2NvbXBvbmVudHMvdmxpc3QvZmVhdHVyZXMvc2VsZWN0aW9uLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL2tleWJvYXJkLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vZm9ybS50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2xheW91dC50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2NvbnN0YW50cy50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2NvbmZpZy50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2ZpZWxkcy50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2RhdGEudHMiLCAiLi4vc3JjL2NvbXBvbmVudHMvZm9ybS9mZWF0dXJlcy9jb250cm9sbGVyLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vZmVhdHVyZXMvc3VibWl0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vZmVhdHVyZXMvcHJvdGVjdGlvbi50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2FwaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy91dGlscy50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgZ2VzdHVyZSBkZXRlY3Rpb25cbiAqL1xuXG5pbXBvcnQgeyBHZXN0dXJlRXZlbnQsIEdlc3R1cmVTdGF0ZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQ2FsY3VsYXRlIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50c1xuICpcbiAqIEBwYXJhbSB4MSAtIFggY29vcmRpbmF0ZSBvZiBmaXJzdCBwb2ludFxuICogQHBhcmFtIHkxIC0gWSBjb29yZGluYXRlIG9mIGZpcnN0IHBvaW50XG4gKiBAcGFyYW0geDIgLSBYIGNvb3JkaW5hdGUgb2Ygc2Vjb25kIHBvaW50XG4gKiBAcGFyYW0geTIgLSBZIGNvb3JkaW5hdGUgb2Ygc2Vjb25kIHBvaW50XG4gKiBAcmV0dXJucyBEaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERpc3RhbmNlKFxuICB4MTogbnVtYmVyLFxuICB5MTogbnVtYmVyLFxuICB4MjogbnVtYmVyLFxuICB5MjogbnVtYmVyXG4pOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KHgyIC0geDEsIDIpICsgTWF0aC5wb3coeTIgLSB5MSwgMikpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBhbmdsZSBiZXR3ZWVuIHR3byBwb2ludHMgaW4gZGVncmVlcyAoMC0zNjApXG4gKlxuICogQHBhcmFtIHgxIC0gWCBjb29yZGluYXRlIG9mIGZpcnN0IHBvaW50XG4gKiBAcGFyYW0geTEgLSBZIGNvb3JkaW5hdGUgb2YgZmlyc3QgcG9pbnRcbiAqIEBwYXJhbSB4MiAtIFggY29vcmRpbmF0ZSBvZiBzZWNvbmQgcG9pbnRcbiAqIEBwYXJhbSB5MiAtIFkgY29vcmRpbmF0ZSBvZiBzZWNvbmQgcG9pbnRcbiAqIEByZXR1cm5zIEFuZ2xlIGluIGRlZ3JlZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFuZ2xlKFxuICB4MTogbnVtYmVyLFxuICB5MTogbnVtYmVyLFxuICB4MjogbnVtYmVyLFxuICB5MjogbnVtYmVyXG4pOiBudW1iZXIge1xuICBjb25zdCBhbmdsZSA9IChNYXRoLmF0YW4yKHkyIC0geTEsIHgyIC0geDEpICogMTgwKSAvIE1hdGguUEk7XG4gIHJldHVybiBhbmdsZSA8IDAgPyBhbmdsZSArIDM2MCA6IGFuZ2xlO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGJhc2UgZ2VzdHVyZSBldmVudFxuICpcbiAqIEBwYXJhbSB0eXBlIC0gVHlwZSBvZiBnZXN0dXJlXG4gKiBAcGFyYW0gb3JpZ2luYWxFdmVudCAtIE9yaWdpbmFsIERPTSBldmVudFxuICogQHBhcmFtIHN0YXRlIC0gQ3VycmVudCBnZXN0dXJlIHN0YXRlXG4gKiBAcmV0dXJucyBCYXNlIGdlc3R1cmUgZXZlbnQgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHZXN0dXJlRXZlbnQoXG4gIHR5cGU6IHN0cmluZyxcbiAgb3JpZ2luYWxFdmVudDogRXZlbnQsXG4gIHN0YXRlOiBHZXN0dXJlU3RhdGVcbik6IEdlc3R1cmVFdmVudCB7XG4gIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICBsZXQgZGVmYXVsdFByZXZlbnRlZCA9IGZhbHNlO1xuXG4gIGNvbnN0IGV2ZW50OiBHZXN0dXJlRXZlbnQgPSB7XG4gICAgdHlwZSxcbiAgICBvcmlnaW5hbEV2ZW50LFxuICAgIHRhcmdldDpcbiAgICAgIChzdGF0ZS50YXJnZXQgYXMgRXZlbnRUYXJnZXQpIHx8IChvcmlnaW5hbEV2ZW50LnRhcmdldCBhcyBFdmVudFRhcmdldCksXG4gICAgc3RhcnRUaW1lOiBzdGF0ZS5zdGFydFRpbWUsXG4gICAgZW5kVGltZSxcbiAgICBkdXJhdGlvbjogZW5kVGltZSAtIHN0YXRlLnN0YXJ0VGltZSxcbiAgICBkZWZhdWx0UHJldmVudGVkLFxuICAgIHByZXZlbnREZWZhdWx0OiAoKSA9PiB7XG4gICAgICBkZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICAgIGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgaWYgKG9yaWdpbmFsRXZlbnQuY2FuY2VsYWJsZSkge1xuICAgICAgICBvcmlnaW5hbEV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBzdG9wUHJvcGFnYXRpb246ICgpID0+IHtcbiAgICAgIG9yaWdpbmFsRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gZXZlbnQ7XG59XG5cbi8qKlxuICogRGV0ZWN0IGlmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgdG91Y2ggZXZlbnRzXG4gKlxuICogQHJldHVybnMgV2hldGhlciB0b3VjaCBpcyBzdXBwb3J0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1RvdWNoU3VwcG9ydCgpOiBib29sZWFuIHtcbiAgY29uc3QgbWF4UG9pbnRzID0gKG5hdmlnYXRvciBhcyBhbnkpLm1heFRvdWNoUG9pbnRzO1xuICByZXR1cm4gKFxuICAgIFwib250b3VjaHN0YXJ0XCIgaW4gd2luZG93IHx8ICh0eXBlb2YgbWF4UG9pbnRzID09PSBcIm51bWJlclwiICYmIG1heFBvaW50cyA+IDApXG4gICk7XG59XG5cbi8qKlxuICogRGV0ZWN0IGlmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgcG9pbnRlciBldmVudHNcbiAqXG4gKiBAcmV0dXJucyBXaGV0aGVyIHBvaW50ZXIgZXZlbnRzIGFyZSBzdXBwb3J0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1BvaW50ZXJTdXBwb3J0KCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISF3aW5kb3cuUG9pbnRlckV2ZW50O1xufVxuXG4vKipcbiAqIEV4dHJhY3Qgbm9ybWFsaXplZCB0b3VjaCBjb29yZGluYXRlcyBmcm9tIGFuIGV2ZW50XG4gKiBXb3JrcyB3aXRoIG1vdXNlIGV2ZW50cywgdG91Y2ggZXZlbnRzIGFuZCBwb2ludGVyIGV2ZW50c1xuICpcbiAqIEBwYXJhbSBlIC0gRE9NIGV2ZW50XG4gKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBjbGllbnRYIGFuZCBjbGllbnRZIGNvb3JkaW5hdGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUb3VjaENvb3JkaW5hdGVzKFxuICBlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCB8IFBvaW50ZXJFdmVudFxuKTogeyBjbGllbnRYOiBudW1iZXI7IGNsaWVudFk6IG51bWJlciB9IHtcbiAgaWYgKFwidG91Y2hlc1wiIGluIGUgJiYgQXJyYXkuaXNBcnJheShlLnRvdWNoZXMpICYmIGUudG91Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsaWVudFg6IGUudG91Y2hlc1swXS5jbGllbnRYLFxuICAgICAgY2xpZW50WTogZS50b3VjaGVzWzBdLmNsaWVudFksXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY2xpZW50WDogKGUgYXMgTW91c2VFdmVudCB8IFBvaW50ZXJFdmVudCkuY2xpZW50WCxcbiAgICBjbGllbnRZOiAoZSBhcyBNb3VzZUV2ZW50IHwgUG9pbnRlckV2ZW50KS5jbGllbnRZLFxuICB9O1xufVxuIiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy90YXAudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2dlc3R1cmVzXG4gKiBAZGVzY3JpcHRpb24gVGFwIGdlc3R1cmUgZGV0ZWN0aW9uXG4gKi9cblxuaW1wb3J0IHsgVGFwRXZlbnQsIEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0IH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVHZXN0dXJlRXZlbnQgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBEZXRlY3QgdGFwIGdlc3R1cmVcbiAqIFxuICogQHBhcmFtIGNvbnRleHQgLSBHZXN0dXJlIGRldGVjdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBUYXAgZXZlbnQgb3IgbnVsbCBpZiBubyB0YXAgZGV0ZWN0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdFRhcChjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCk6IFRhcEV2ZW50IHwgbnVsbCB7XG4gIGNvbnN0IHsgc3RhdGUsIG9wdGlvbnMsIG9yaWdpbmFsRXZlbnQgfSA9IGNvbnRleHQ7XG4gIFxuICAvLyBDYWxjdWxhdGUgZGlzdGFuY2UgYmV0d2VlbiBzdGFydCBhbmQgY3VycmVudCBwb3NpdGlvblxuICBjb25zdCBkZWx0YVggPSBzdGF0ZS5jdXJyZW50WCAtIHN0YXRlLnN0YXJ0WDtcbiAgY29uc3QgZGVsdGFZID0gc3RhdGUuY3VycmVudFkgLSBzdGF0ZS5zdGFydFk7XG4gIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG4gIFxuICAvLyBDaGVjayBpZiBtb3ZlbWVudCBpcyB3aXRoaW4gdGhyZXNob2xkXG4gIGlmIChkaXN0YW5jZSA8IG9wdGlvbnMudGFwRGlzdGFuY2VUaHJlc2hvbGQpIHtcbiAgICAvLyBDaGVjayBmb3IgZG91YmxlIHRhcFxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgaXNEb3VibGVUYXAgPSBub3cgLSBzdGF0ZS5sYXN0VGFwVGltZSA8IDMwMDtcbiAgICBcbiAgICBjb25zdCB0YXBDb3VudCA9IGlzRG91YmxlVGFwID8gc3RhdGUudGFwQ291bnQgKyAxIDogMTtcbiAgICBcbiAgICAvLyBDcmVhdGUgdGFwIGV2ZW50XG4gICAgY29uc3QgdGFwRXZlbnQ6IFRhcEV2ZW50ID0ge1xuICAgICAgLi4uY3JlYXRlR2VzdHVyZUV2ZW50KCd0YXAnLCBvcmlnaW5hbEV2ZW50LCBzdGF0ZSksXG4gICAgICB0eXBlOiAndGFwJyxcbiAgICAgIGNvdW50OiB0YXBDb3VudCxcbiAgICAgIHg6IHN0YXRlLmN1cnJlbnRYLFxuICAgICAgeTogc3RhdGUuY3VycmVudFlcbiAgICB9O1xuICAgIFxuICAgIHJldHVybiB0YXBFdmVudDtcbiAgfVxuICBcbiAgcmV0dXJuIG51bGw7XG59IiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy9zd2lwZS50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBTd2lwZSBnZXN0dXJlIGRldGVjdGlvblxuICovXG5cbmltcG9ydCB7IFN3aXBlRXZlbnQsIEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0LCBTV0lQRV9ESVJFQ1RJT05TIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVHZXN0dXJlRXZlbnQgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBEZXRlcm1pbmUgc3dpcGUgZGlyZWN0aW9uIGJhc2VkIG9uIGRlbHRhIFggYW5kIFlcbiAqIFxuICogQHBhcmFtIGRlbHRhWCAtIERpc3RhbmNlIG1vdmVkIGluIFggZGlyZWN0aW9uXG4gKiBAcGFyYW0gZGVsdGFZIC0gRGlzdGFuY2UgbW92ZWQgaW4gWSBkaXJlY3Rpb25cbiAqIEByZXR1cm5zIERpcmVjdGlvbiBvZiB0aGUgc3dpcGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN3aXBlRGlyZWN0aW9uKGRlbHRhWDogbnVtYmVyLCBkZWx0YVk6IG51bWJlcik6IFNXSVBFX0RJUkVDVElPTlMge1xuICBpZiAoTWF0aC5hYnMoZGVsdGFYKSA+IE1hdGguYWJzKGRlbHRhWSkpIHtcbiAgICByZXR1cm4gZGVsdGFYID4gMCA/IFNXSVBFX0RJUkVDVElPTlMuUklHSFQgOiBTV0lQRV9ESVJFQ1RJT05TLkxFRlQ7XG4gIH1cbiAgcmV0dXJuIGRlbHRhWSA+IDAgPyBTV0lQRV9ESVJFQ1RJT05TLkRPV04gOiBTV0lQRV9ESVJFQ1RJT05TLlVQO1xufVxuXG4vKipcbiAqIERldGVjdCBzd2lwZSBnZXN0dXJlXG4gKiBcbiAqIEBwYXJhbSBjb250ZXh0IC0gR2VzdHVyZSBkZXRlY3Rpb24gY29udGV4dFxuICogQHJldHVybnMgU3dpcGUgZXZlbnQgb3IgbnVsbCBpZiBubyBzd2lwZSBkZXRlY3RlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0U3dpcGUoY29udGV4dDogR2VzdHVyZURldGVjdGlvbkNvbnRleHQpOiBTd2lwZUV2ZW50IHwgbnVsbCB7XG4gIGNvbnN0IHsgc3RhdGUsIG9wdGlvbnMsIG9yaWdpbmFsRXZlbnQgfSA9IGNvbnRleHQ7XG4gIFxuICAvLyBDYWxjdWxhdGUgZGVsdGFzIGFuZCBkaXN0YW5jZVxuICBjb25zdCBkZWx0YVggPSBzdGF0ZS5jdXJyZW50WCAtIHN0YXRlLnN0YXJ0WDtcbiAgY29uc3QgZGVsdGFZID0gc3RhdGUuY3VycmVudFkgLSBzdGF0ZS5zdGFydFk7XG4gIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG4gIFxuICAvLyBDYWxjdWxhdGUgdGltZSBhbmQgdmVsb2NpdHlcbiAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gIGNvbnN0IGRlbHRhVGltZSA9IGVuZFRpbWUgLSBzdGF0ZS5zdGFydFRpbWU7XG4gIGNvbnN0IHZlbG9jaXR5ID0gZGlzdGFuY2UgLyBkZWx0YVRpbWU7XG4gIFxuICAvLyBDaGVjayBpZiBpdCdzIGEgc3dpcGVcbiAgaWYgKGRpc3RhbmNlID49IG9wdGlvbnMuc3dpcGVUaHJlc2hvbGQgJiYgZGVsdGFUaW1lIDw9IG9wdGlvbnMuc3dpcGVUaW1lVGhyZXNob2xkKSB7XG4gICAgY29uc3QgZGlyZWN0aW9uID0gZ2V0U3dpcGVEaXJlY3Rpb24oZGVsdGFYLCBkZWx0YVkpO1xuICAgIFxuICAgIC8vIENyZWF0ZSBzd2lwZSBldmVudFxuICAgIGNvbnN0IHN3aXBlRXZlbnQ6IFN3aXBlRXZlbnQgPSB7XG4gICAgICAuLi5jcmVhdGVHZXN0dXJlRXZlbnQoJ3N3aXBlJywgb3JpZ2luYWxFdmVudCwgc3RhdGUpLFxuICAgICAgdHlwZTogJ3N3aXBlJyxcbiAgICAgIGRpcmVjdGlvbixcbiAgICAgIGRlbHRhWCxcbiAgICAgIGRlbHRhWSxcbiAgICAgIGRpc3RhbmNlLFxuICAgICAgdmVsb2NpdHksXG4gICAgICBzdGFydFg6IHN0YXRlLnN0YXJ0WCxcbiAgICAgIHN0YXJ0WTogc3RhdGUuc3RhcnRZLFxuICAgICAgZW5kWDogc3RhdGUuY3VycmVudFgsXG4gICAgICBlbmRZOiBzdGF0ZS5jdXJyZW50WVxuICAgIH07XG4gICAgXG4gICAgcmV0dXJuIHN3aXBlRXZlbnQ7XG4gIH1cbiAgXG4gIHJldHVybiBudWxsO1xufSIsCiAgICAiLy8gc3JjL2NvcmUvZ2VzdHVyZXMvbG9uZ3ByZXNzLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIExvbmcgcHJlc3MgZ2VzdHVyZSBkZXRlY3Rpb25cbiAqL1xuXG5pbXBvcnQgeyBMb25nUHJlc3NFdmVudCwgR2VzdHVyZURldGVjdGlvbkNvbnRleHQgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZUdlc3R1cmVFdmVudCB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIERldGVjdCBsb25nIHByZXNzIGdlc3R1cmVcbiAqIFxuICogVGhpcyBpcyBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSBvdGhlciBnZXN0dXJlIGRldGVjdG9ycyBhcyBpdCBzZXRzIHVwIGEgdGltZXJcbiAqIGFuZCByZXR1cm5zIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSB0aW1lciBjb21wbGV0ZXMuXG4gKiBcbiAqIEBwYXJhbSBjb250ZXh0IC0gR2VzdHVyZSBkZXRlY3Rpb24gY29udGV4dFxuICogQHBhcmFtIGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gY2FsbCB3aGVuIGxvbmcgcHJlc3MgaXMgZGV0ZWN0ZWRcbiAqIEByZXR1cm5zIENsZWFudXAgZnVuY3Rpb24gdG8gY2FuY2VsIHRoZSBsb25nIHByZXNzIGRldGVjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0TG9uZ1ByZXNzKFxuICBjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCxcbiAgY2FsbGJhY2s6IChldmVudDogTG9uZ1ByZXNzRXZlbnQpID0+IHZvaWRcbik6ICgpID0+IHZvaWQge1xuICBjb25zdCB7IHN0YXRlLCBvcHRpb25zLCBvcmlnaW5hbEV2ZW50IH0gPSBjb250ZXh0O1xuICBcbiAgLy8gU2V0IGEgdGltZXIgZm9yIGxvbmcgcHJlc3MgZGV0ZWN0aW9uXG4gIGNvbnN0IHRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgIC8vIE9ubHkgdHJpZ2dlciBpZiBnZXN0dXJlIGlzIHN0aWxsIGFjdGl2ZVxuICAgIGlmIChzdGF0ZS5hY3RpdmUpIHtcbiAgICAgIC8vIENoZWNrIGlmIG1vdmVtZW50IGlzIHdpdGhpbiB0aHJlc2hvbGRcbiAgICAgIGNvbnN0IGRpZmZYID0gTWF0aC5hYnMoc3RhdGUuY3VycmVudFggLSBzdGF0ZS5zdGFydFgpO1xuICAgICAgY29uc3QgZGlmZlkgPSBNYXRoLmFicyhzdGF0ZS5jdXJyZW50WSAtIHN0YXRlLnN0YXJ0WSk7XG4gICAgICBcbiAgICAgIGlmIChkaWZmWCA8IG9wdGlvbnMudGFwRGlzdGFuY2VUaHJlc2hvbGQgJiYgZGlmZlkgPCBvcHRpb25zLnRhcERpc3RhbmNlVGhyZXNob2xkKSB7XG4gICAgICAgIC8vIENyZWF0ZSBsb25nIHByZXNzIGV2ZW50XG4gICAgICAgIGNvbnN0IGxvbmdQcmVzc0V2ZW50OiBMb25nUHJlc3NFdmVudCA9IHtcbiAgICAgICAgICAuLi5jcmVhdGVHZXN0dXJlRXZlbnQoJ2xvbmdwcmVzcycsIG9yaWdpbmFsRXZlbnQsIHN0YXRlKSxcbiAgICAgICAgICB0eXBlOiAnbG9uZ3ByZXNzJyxcbiAgICAgICAgICB4OiBzdGF0ZS5jdXJyZW50WCxcbiAgICAgICAgICB5OiBzdGF0ZS5jdXJyZW50WVxuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgLy8gVHJpZ2dlciBjYWxsYmFja1xuICAgICAgICBjYWxsYmFjayhsb25nUHJlc3NFdmVudCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBvcHRpb25zLmxvbmdQcmVzc1RpbWUpO1xuICBcbiAgLy8gUmV0dXJuIGNsZWFudXAgZnVuY3Rpb25cbiAgcmV0dXJuICgpID0+IHtcbiAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICB9O1xufVxuXG4vKipcbiAqIENoZWNrIGlmIG1vdmVtZW50IHdvdWxkIGNhbmNlbCBhIGxvbmcgcHJlc3NcbiAqIFxuICogQHBhcmFtIGNvbnRleHQgLSBHZXN0dXJlIGRldGVjdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsb25nIHByZXNzIHNob3VsZCBiZSBjYW5jZWxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkQ2FuY2VsTG9uZ1ByZXNzKGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0KTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgc3RhdGUsIG9wdGlvbnMgfSA9IGNvbnRleHQ7XG4gIFxuICBjb25zdCBkaWZmWCA9IE1hdGguYWJzKHN0YXRlLmN1cnJlbnRYIC0gc3RhdGUuc3RhcnRYKTtcbiAgY29uc3QgZGlmZlkgPSBNYXRoLmFicyhzdGF0ZS5jdXJyZW50WSAtIHN0YXRlLnN0YXJ0WSk7XG4gIFxuICByZXR1cm4gZGlmZlggPiBvcHRpb25zLnRhcERpc3RhbmNlVGhyZXNob2xkIHx8IGRpZmZZID4gb3B0aW9ucy50YXBEaXN0YW5jZVRocmVzaG9sZDtcbn0iLAogICAgIi8vIHNyYy9jb3JlL2dlc3R1cmVzL3Bhbi50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBQYW4gZ2VzdHVyZSBkZXRlY3Rpb25cbiAqL1xuXG5pbXBvcnQgeyBQYW5FdmVudCwgR2VzdHVyZURldGVjdGlvbkNvbnRleHQgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlR2VzdHVyZUV2ZW50IH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBEZXRlY3QgcGFuIGdlc3R1cmVcbiAqXG4gKiBAcGFyYW0gY29udGV4dCAtIEdlc3R1cmUgZGV0ZWN0aW9uIGNvbnRleHRcbiAqIEByZXR1cm5zIFBhbiBldmVudCBvciBudWxsIGlmIG5vIHNpZ25pZmljYW50IG1vdmVtZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RQYW4oY29udGV4dDogR2VzdHVyZURldGVjdGlvbkNvbnRleHQpOiBQYW5FdmVudCB8IG51bGwge1xuICBjb25zdCB7IHN0YXRlLCBvcmlnaW5hbEV2ZW50IH0gPSBjb250ZXh0O1xuXG4gIC8vIENhbGN1bGF0ZSBkZWx0YSBmcm9tIHN0YXJ0IHBvc2l0aW9uXG4gIGNvbnN0IGRlbHRhWCA9IHN0YXRlLmN1cnJlbnRYIC0gc3RhdGUuc3RhcnRYO1xuICBjb25zdCBkZWx0YVkgPSBzdGF0ZS5jdXJyZW50WSAtIHN0YXRlLnN0YXJ0WTtcblxuICAvLyBDYWxjdWxhdGUgZGVsdGEgZnJvbSBsYXN0IHBvc2l0aW9uIHRvIGRldGVybWluZSBpZiB0aGVyZSdzIHNpZ25pZmljYW50IG1vdmVtZW50XG4gIGNvbnN0IG1vdmVEZWx0YVggPSBzdGF0ZS5jdXJyZW50WCAtIHN0YXRlLmxhc3RYO1xuICBjb25zdCBtb3ZlRGVsdGFZID0gc3RhdGUuY3VycmVudFkgLSBzdGF0ZS5sYXN0WTtcbiAgY29uc3QgbW92ZURlbHRhID0gTWF0aC5zcXJ0KFxuICAgIG1vdmVEZWx0YVggKiBtb3ZlRGVsdGFYICsgbW92ZURlbHRhWSAqIG1vdmVEZWx0YVlcbiAgKTtcblxuICAvLyBDaGVjayBpZiBtb3ZlbWVudCBpcyBzaWduaWZpY2FudFxuICBpZiAobW92ZURlbHRhID4gMCkge1xuICAgIC8vIENyZWF0ZSBwYW4gZXZlbnRcbiAgICBjb25zdCBwYW5FdmVudDogUGFuRXZlbnQgPSB7XG4gICAgICAuLi5jcmVhdGVHZXN0dXJlRXZlbnQoXCJwYW5cIiwgb3JpZ2luYWxFdmVudCwgc3RhdGUpLFxuICAgICAgdHlwZTogXCJwYW5cIixcbiAgICAgIGRlbHRhWCxcbiAgICAgIGRlbHRhWSxcbiAgICAgIHN0YXJ0WDogc3RhdGUuc3RhcnRYLFxuICAgICAgc3RhcnRZOiBzdGF0ZS5zdGFydFksXG4gICAgICBjdXJyZW50WDogc3RhdGUuY3VycmVudFgsXG4gICAgICBjdXJyZW50WTogc3RhdGUuY3VycmVudFksXG4gICAgfTtcblxuICAgIHJldHVybiBwYW5FdmVudDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy9waW5jaC50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBQaW5jaCBnZXN0dXJlIGRldGVjdGlvblxuICovXG5cbmltcG9ydCB7IFBpbmNoRXZlbnQsIEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUdlc3R1cmVFdmVudCwgZ2V0RGlzdGFuY2UgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIERldGVjdCBwaW5jaCBnZXN0dXJlXG4gKlxuICogQHBhcmFtIGNvbnRleHQgLSBHZXN0dXJlIGRldGVjdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0gdG91Y2gxIC0gRmlyc3QgdG91Y2ggcG9pbnRcbiAqIEBwYXJhbSB0b3VjaDIgLSBTZWNvbmQgdG91Y2ggcG9pbnRcbiAqIEByZXR1cm5zIFBpbmNoIGV2ZW50IG9yIG51bGwgaWYgbm8gcGluY2ggZGV0ZWN0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdFBpbmNoKFxuICBjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCxcbiAgdG91Y2gxOiBUb3VjaCxcbiAgdG91Y2gyOiBUb3VjaFxuKTogUGluY2hFdmVudCB8IG51bGwge1xuICBjb25zdCB7IHN0YXRlLCBvcmlnaW5hbEV2ZW50IH0gPSBjb250ZXh0O1xuXG4gIC8vIENhbGN1bGF0ZSBjdXJyZW50IGRpc3RhbmNlIGJldHdlZW4gdG91Y2ggcG9pbnRzXG4gIGNvbnN0IGN1cnJlbnREaXN0YW5jZSA9IGdldERpc3RhbmNlKFxuICAgIHRvdWNoMS5jbGllbnRYLFxuICAgIHRvdWNoMS5jbGllbnRZLFxuICAgIHRvdWNoMi5jbGllbnRYLFxuICAgIHRvdWNoMi5jbGllbnRZXG4gICk7XG5cbiAgLy8gTWluaW11bSBtb3ZlbWVudCB0aHJlc2hvbGQgZm9yIHBpbmNoIGRldGVjdGlvblxuICBjb25zdCBQSU5DSF9USFJFU0hPTEQgPSAxMDtcblxuICAvLyBDaGVjayBpZiB0aGUgZGlzdGFuY2UgY2hhbmdlIGlzIHNpZ25pZmljYW50XG4gIGlmIChNYXRoLmFicyhjdXJyZW50RGlzdGFuY2UgLSBzdGF0ZS5zdGFydERpc3RhbmNlKSA+IFBJTkNIX1RIUkVTSE9MRCkge1xuICAgIC8vIENhbGN1bGF0ZSBzY2FsZSBmYWN0b3JcbiAgICBjb25zdCBzY2FsZSA9IGN1cnJlbnREaXN0YW5jZSAvIHN0YXRlLnN0YXJ0RGlzdGFuY2U7XG5cbiAgICAvLyBDYWxjdWxhdGUgY2VudGVyIHBvaW50XG4gICAgY29uc3QgY2VudGVyWCA9ICh0b3VjaDEuY2xpZW50WCArIHRvdWNoMi5jbGllbnRYKSAvIDI7XG4gICAgY29uc3QgY2VudGVyWSA9ICh0b3VjaDEuY2xpZW50WSArIHRvdWNoMi5jbGllbnRZKSAvIDI7XG5cbiAgICAvLyBDcmVhdGUgcGluY2ggZXZlbnRcbiAgICBjb25zdCBwaW5jaEV2ZW50OiBQaW5jaEV2ZW50ID0ge1xuICAgICAgLi4uY3JlYXRlR2VzdHVyZUV2ZW50KFwicGluY2hcIiwgb3JpZ2luYWxFdmVudCwgc3RhdGUpLFxuICAgICAgdHlwZTogXCJwaW5jaFwiLFxuICAgICAgc2NhbGUsXG4gICAgICBjZW50ZXJYLFxuICAgICAgY2VudGVyWSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHBpbmNoRXZlbnQ7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsCiAgICAiLy8gc3JjL2NvcmUvZ2VzdHVyZXMvcm90YXRlLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIFJvdGF0ZSBnZXN0dXJlIGRldGVjdGlvblxuICovXG5cbmltcG9ydCB7IFJvdGF0ZUV2ZW50LCBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBjcmVhdGVHZXN0dXJlRXZlbnQsIGdldEFuZ2xlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBEZXRlY3Qgcm90YXRlIGdlc3R1cmVcbiAqXG4gKiBAcGFyYW0gY29udGV4dCAtIEdlc3R1cmUgZGV0ZWN0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSB0b3VjaDEgLSBGaXJzdCB0b3VjaCBwb2ludFxuICogQHBhcmFtIHRvdWNoMiAtIFNlY29uZCB0b3VjaCBwb2ludFxuICogQHJldHVybnMgUm90YXRlIGV2ZW50IG9yIG51bGwgaWYgbm8gcm90YXRpb24gZGV0ZWN0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdFJvdGF0ZShcbiAgY29udGV4dDogR2VzdHVyZURldGVjdGlvbkNvbnRleHQsXG4gIHRvdWNoMTogVG91Y2gsXG4gIHRvdWNoMjogVG91Y2hcbik6IFJvdGF0ZUV2ZW50IHwgbnVsbCB7XG4gIGNvbnN0IHsgc3RhdGUsIG9yaWdpbmFsRXZlbnQgfSA9IGNvbnRleHQ7XG5cbiAgLy8gQ2FsY3VsYXRlIGN1cnJlbnQgYW5nbGUgYmV0d2VlbiB0b3VjaCBwb2ludHNcbiAgY29uc3QgY3VycmVudEFuZ2xlID0gZ2V0QW5nbGUoXG4gICAgdG91Y2gxLmNsaWVudFgsXG4gICAgdG91Y2gxLmNsaWVudFksXG4gICAgdG91Y2gyLmNsaWVudFgsXG4gICAgdG91Y2gyLmNsaWVudFlcbiAgKTtcblxuICAvLyBNaW5pbXVtIHJvdGF0aW9uIHRocmVzaG9sZCBmb3IgZGV0ZWN0aW9uXG4gIGNvbnN0IFJPVEFUSU9OX1RIUkVTSE9MRCA9IDEwO1xuXG4gIC8vIENhbGN1bGF0ZSByb3RhdGlvbiBkaWZmZXJlbmNlXG4gIGNvbnN0IHJvdGF0aW9uRGlmZiA9IGN1cnJlbnRBbmdsZSAtIHN0YXRlLnN0YXJ0QW5nbGU7XG5cbiAgLy8gQ2hlY2sgaWYgcm90YXRpb24gaXMgc2lnbmlmaWNhbnRcbiAgaWYgKE1hdGguYWJzKHJvdGF0aW9uRGlmZikgPiBST1RBVElPTl9USFJFU0hPTEQpIHtcbiAgICAvLyBDYWxjdWxhdGUgY2VudGVyIHBvaW50XG4gICAgY29uc3QgY2VudGVyWCA9ICh0b3VjaDEuY2xpZW50WCArIHRvdWNoMi5jbGllbnRYKSAvIDI7XG4gICAgY29uc3QgY2VudGVyWSA9ICh0b3VjaDEuY2xpZW50WSArIHRvdWNoMi5jbGllbnRZKSAvIDI7XG5cbiAgICAvLyBDcmVhdGUgcm90YXRlIGV2ZW50XG4gICAgY29uc3Qgcm90YXRlRXZlbnQ6IFJvdGF0ZUV2ZW50ID0ge1xuICAgICAgLi4uY3JlYXRlR2VzdHVyZUV2ZW50KFwicm90YXRlXCIsIG9yaWdpbmFsRXZlbnQsIHN0YXRlKSxcbiAgICAgIHR5cGU6IFwicm90YXRlXCIsXG4gICAgICByb3RhdGlvbjogcm90YXRpb25EaWZmLFxuICAgICAgY2VudGVyWCxcbiAgICAgIGNlbnRlclksXG4gICAgfTtcblxuICAgIHJldHVybiByb3RhdGVFdmVudDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy9tYW5hZ2VyLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIEdlc3R1cmUgbWFuYWdlbWVudCBzeXN0ZW0gZm9yIGhhbmRsaW5nIHRvdWNoIGFuZCBtb3VzZSBpbnRlcmFjdGlvbnNcbiAqL1xuXG5pbXBvcnQgeyBcbiAgR2VzdHVyZUNvbmZpZyxcbiAgR2VzdHVyZU1hbmFnZXIsXG4gIEdlc3R1cmVTdGF0ZSxcbiAgR2VzdHVyZUhhbmRsZXIsXG4gIEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0LFxuICBBbnlHZXN0dXJlRXZlbnQsXG4gIEdFU1RVUkVfVFlQRVMsXG4gIFNXSVBFX0RJUkVDVElPTlNcbn0gZnJvbSAnLi90eXBlcyc7XG5cbmltcG9ydCB7IGRldGVjdFRhcCB9IGZyb20gJy4vdGFwJztcbmltcG9ydCB7IGRldGVjdFN3aXBlIH0gZnJvbSAnLi9zd2lwZSc7XG5pbXBvcnQgeyBkZXRlY3RMb25nUHJlc3MsIHNob3VsZENhbmNlbExvbmdQcmVzcyB9IGZyb20gJy4vbG9uZ3ByZXNzJztcbmltcG9ydCB7IGRldGVjdFBhbiB9IGZyb20gJy4vcGFuJztcbmltcG9ydCB7IGRldGVjdFBpbmNoIH0gZnJvbSAnLi9waW5jaCc7XG5pbXBvcnQgeyBkZXRlY3RSb3RhdGUgfSBmcm9tICcuL3JvdGF0ZSc7XG5pbXBvcnQgeyBoYXNUb3VjaFN1cHBvcnQsIGhhc1BvaW50ZXJTdXBwb3J0LCBnZXRUb3VjaENvb3JkaW5hdGVzIH0gZnJvbSAnLi91dGlscyc7XG5cbi8vIFJlLWV4cG9ydCB0eXBlcyBhbmQgY29uc3RhbnRzXG5leHBvcnQgeyBHRVNUVVJFX1RZUEVTLCBTV0lQRV9ESVJFQ1RJT05TIH07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGdlc3R1cmUgbWFuYWdlciBmb3IgaGFuZGxpbmcgdG91Y2ggYW5kIG1vdXNlIGludGVyYWN0aW9uc1xuICogXG4gKiBAcGFyYW0gZWxlbWVudCAtIERPTSBlbGVtZW50IHRvIGF0dGFjaCBnZXN0dXJlIHJlY29nbml0aW9uIHRvXG4gKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiBAcmV0dXJucyBHZXN0dXJlIG1hbmFnZXIgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUdlc3R1cmVNYW5hZ2VyID0gKFxuICBlbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgY29uZmlnOiBHZXN0dXJlQ29uZmlnID0ge31cbik6IEdlc3R1cmVNYW5hZ2VyID0+IHtcbiAgLy8gRGVmYXVsdCBjb25maWd1cmF0aW9uXG4gIGNvbnN0IG9wdGlvbnM6IFJlcXVpcmVkPEdlc3R1cmVDb25maWc+ID0ge1xuICAgIHN3aXBlVGhyZXNob2xkOiAzMCxcbiAgICBzd2lwZVRpbWVUaHJlc2hvbGQ6IDMwMCxcbiAgICBsb25nUHJlc3NUaW1lOiA1MDAsXG4gICAgdGFwRGlzdGFuY2VUaHJlc2hvbGQ6IDEwLFxuICAgIHByZXZlbnREZWZhdWx0OiB0cnVlLFxuICAgIHN0b3BQcm9wYWdhdGlvbjogZmFsc2UsXG4gICAgLi4uY29uZmlnXG4gIH07XG4gIFxuICAvLyBFdmVudCBoYW5kbGVycyBzdG9yYWdlXG4gIGNvbnN0IGhhbmRsZXJzOiBNYXA8c3RyaW5nLCBTZXQ8R2VzdHVyZUhhbmRsZXI+PiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIEdlc3R1cmUgc3RhdGVcbiAgY29uc3Qgc3RhdGU6IEdlc3R1cmVTdGF0ZSA9IHtcbiAgICBhY3RpdmU6IGZhbHNlLFxuICAgIHN0YXJ0VGltZTogMCxcbiAgICBzdGFydFg6IDAsXG4gICAgc3RhcnRZOiAwLFxuICAgIGxhc3RYOiAwLFxuICAgIGxhc3RZOiAwLFxuICAgIGN1cnJlbnRYOiAwLFxuICAgIGN1cnJlbnRZOiAwLFxuICAgIHRvdWNoQ291bnQ6IDAsXG4gICAgbG9uZ1ByZXNzVGltZXI6IG51bGwsXG4gICAgc3RhcnREaXN0YW5jZTogMCxcbiAgICBzdGFydEFuZ2xlOiAwLFxuICAgIGxhc3RUYXBUaW1lOiAwLFxuICAgIHRhcENvdW50OiAwLFxuICAgIHRhcmdldDogbnVsbFxuICB9O1xuICBcbiAgLy8gRGV0ZWN0IGZlYXR1cmUgc3VwcG9ydFxuICBjb25zdCBzdXBwb3J0VG91Y2ggPSBoYXNUb3VjaFN1cHBvcnQoKTtcbiAgY29uc3Qgc3VwcG9ydFBvaW50ZXIgPSBoYXNQb2ludGVyU3VwcG9ydCgpO1xuICAgIFxuICBjb25zdCBnZXN0dXJlU3VwcG9ydCA9IHtcbiAgICB0YXA6IHRydWUsXG4gICAgc3dpcGU6IHRydWUsXG4gICAgc3dpcGVsZWZ0OiB0cnVlLFxuICAgIHN3aXBlcmlnaHQ6IHRydWUsXG4gICAgc3dpcGV1cDogdHJ1ZSxcbiAgICBzd2lwZWRvd246IHRydWUsXG4gICAgbG9uZ3ByZXNzOiB0cnVlLFxuICAgIHBhbjogdHJ1ZSxcbiAgICBwaW5jaDogc3VwcG9ydFRvdWNoIHx8IHN1cHBvcnRQb2ludGVyLFxuICAgIHJvdGF0ZTogc3VwcG9ydFRvdWNoIHx8IHN1cHBvcnRQb2ludGVyXG4gIH07XG4gIFxuICAvKipcbiAgICogRGlzcGF0Y2ggYSBnZXN0dXJlIGV2ZW50XG4gICAqL1xuICBjb25zdCBkaXNwYXRjaEdlc3R1cmUgPSAoZXZlbnQ6IEFueUdlc3R1cmVFdmVudCk6IHZvaWQgPT4ge1xuICAgIC8vIEdldCBoYW5kbGVycyBmb3IgdGhpcyBldmVudCB0eXBlXG4gICAgY29uc3QgZXZlbnRIYW5kbGVycyA9IGhhbmRsZXJzLmdldChldmVudC50eXBlKTtcbiAgICBpZiAoIWV2ZW50SGFuZGxlcnMpIHJldHVybjtcbiAgICBcbiAgICAvLyBDYWxsIGVhY2ggaGFuZGxlclxuICAgIGV2ZW50SGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhbmRsZXIoZXZlbnQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgaW4gZ2VzdHVyZSBoYW5kbGVyIGZvciAke2V2ZW50LnR5cGV9OmAsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvLyBGb3Igc3dpcGUsIGFsc28gZGlzcGF0Y2ggZGlyZWN0aW9uLXNwZWNpZmljIGV2ZW50c1xuICAgIGlmIChldmVudC50eXBlID09PSAnc3dpcGUnICYmICdkaXJlY3Rpb24nIGluIGV2ZW50KSB7XG4gICAgICBjb25zdCBkaXJlY3Rpb25FdmVudCA9IHsgLi4uZXZlbnQsIHR5cGU6IGBzd2lwZSR7ZXZlbnQuZGlyZWN0aW9ufWAgYXMgYW55IH07XG4gICAgICBkaXNwYXRjaEdlc3R1cmUoZGlyZWN0aW9uRXZlbnQgYXMgYW55KTtcbiAgICB9XG4gICAgXG4gICAgLy8gQXBwbHkgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciBwcmV2ZW50RGVmYXVsdCBhbmQgc3RvcFByb3BhZ2F0aW9uXG4gICAgaWYgKG9wdGlvbnMucHJldmVudERlZmF1bHQgJiYgIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIFxuICAgIGlmIChvcHRpb25zLnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICB9O1xuICBcbiAgLy8gUmVmZXJlbmNlIHRvIHRoZSBsb25ncHJlc3MgY2xlYW51cCBmdW5jdGlvblxuICBsZXQgbG9uZ1ByZXNzQ2xlYW51cDogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIFxuICAvKipcbiAgICogSGFuZGxlIHRvdWNoL21vdXNlIHN0YXJ0XG4gICAqL1xuICBjb25zdCBoYW5kbGVTdGFydCA9IChlOiBUb3VjaEV2ZW50IHwgTW91c2VFdmVudCB8IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHRvdWNoID0gZ2V0VG91Y2hDb29yZGluYXRlcyhlKTtcbiAgICBjb25zdCB0b3VjaENvdW50ID0gJ3RvdWNoZXMnIGluIGUgPyBlLnRvdWNoZXMubGVuZ3RoIDogMTtcbiAgICBcbiAgICAvLyBTdG9yZSBnZXN0dXJlIHN0YXRlXG4gICAgc3RhdGUuYWN0aXZlID0gdHJ1ZTtcbiAgICBzdGF0ZS5zdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHN0YXRlLnN0YXJ0WCA9IHN0YXRlLmxhc3RYID0gc3RhdGUuY3VycmVudFggPSB0b3VjaC5jbGllbnRYO1xuICAgIHN0YXRlLnN0YXJ0WSA9IHN0YXRlLmxhc3RZID0gc3RhdGUuY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuICAgIHN0YXRlLnRvdWNoQ291bnQgPSB0b3VjaENvdW50O1xuICAgIHN0YXRlLnRhcmdldCA9IGUudGFyZ2V0O1xuICAgIFxuICAgIC8vIEhhbmRsZSBtdWx0aS10b3VjaCBnZXN0dXJlc1xuICAgIGlmICh0b3VjaENvdW50ID09PSAyICYmICd0b3VjaGVzJyBpbiBlKSB7XG4gICAgICBjb25zdCB0b3VjaDEgPSBlLnRvdWNoZXNbMF07XG4gICAgICBjb25zdCB0b3VjaDIgPSBlLnRvdWNoZXNbMV07XG4gICAgICBcbiAgICAgIC8vIFNldCBpbml0aWFsIHZhbHVlcyBmb3IgcGluY2ggYW5kIHJvdGF0ZVxuICAgICAgc3RhdGUuc3RhcnREaXN0YW5jZSA9IE1hdGguc3FydChcbiAgICAgICAgTWF0aC5wb3codG91Y2gyLmNsaWVudFggLSB0b3VjaDEuY2xpZW50WCwgMikgKyBcbiAgICAgICAgTWF0aC5wb3codG91Y2gyLmNsaWVudFkgLSB0b3VjaDEuY2xpZW50WSwgMilcbiAgICAgICk7XG4gICAgICBcbiAgICAgIHN0YXRlLnN0YXJ0QW5nbGUgPSBNYXRoLmF0YW4yKFxuICAgICAgICB0b3VjaDIuY2xpZW50WSAtIHRvdWNoMS5jbGllbnRZLFxuICAgICAgICB0b3VjaDIuY2xpZW50WCAtIHRvdWNoMS5jbGllbnRYXG4gICAgICApICogMTgwIC8gTWF0aC5QSTtcbiAgICAgIFxuICAgICAgaWYgKHN0YXRlLnN0YXJ0QW5nbGUgPCAwKSBzdGF0ZS5zdGFydEFuZ2xlICs9IDM2MDtcbiAgICB9XG4gICAgXG4gICAgLy8gU2V0dXAgY29udGV4dCBmb3IgZ2VzdHVyZSBkZXRlY3Rpb25cbiAgICBjb25zdCBjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCA9IHtcbiAgICAgIHN0YXRlLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGVcbiAgICB9O1xuICAgIFxuICAgIC8vIFN0YXJ0IGxvbmcgcHJlc3MgZGV0ZWN0aW9uXG4gICAgaWYgKGxvbmdQcmVzc0NsZWFudXApIHtcbiAgICAgIGxvbmdQcmVzc0NsZWFudXAoKTtcbiAgICB9XG4gICAgXG4gICAgbG9uZ1ByZXNzQ2xlYW51cCA9IGRldGVjdExvbmdQcmVzcyhjb250ZXh0LCAobG9uZ1ByZXNzRXZlbnQpID0+IHtcbiAgICAgIGRpc3BhdGNoR2VzdHVyZShsb25nUHJlc3NFdmVudCk7XG4gICAgfSk7XG4gIH07XG4gIFxuICAvKipcbiAgICogSGFuZGxlIHRvdWNoL21vdXNlIG1vdmVcbiAgICovXG4gIGNvbnN0IGhhbmRsZU1vdmUgPSAoZTogVG91Y2hFdmVudCB8IE1vdXNlRXZlbnQgfCBQb2ludGVyRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoIXN0YXRlLmFjdGl2ZSkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IHRvdWNoID0gZ2V0VG91Y2hDb29yZGluYXRlcyhlKTtcbiAgICBjb25zdCB0b3VjaENvdW50ID0gJ3RvdWNoZXMnIGluIGUgPyBlLnRvdWNoZXMubGVuZ3RoIDogMTtcbiAgICBcbiAgICAvLyBVcGRhdGUgcG9zaXRpb25zXG4gICAgc3RhdGUubGFzdFggPSBzdGF0ZS5jdXJyZW50WDtcbiAgICBzdGF0ZS5sYXN0WSA9IHN0YXRlLmN1cnJlbnRZO1xuICAgIHN0YXRlLmN1cnJlbnRYID0gdG91Y2guY2xpZW50WDtcbiAgICBzdGF0ZS5jdXJyZW50WSA9IHRvdWNoLmNsaWVudFk7XG4gICAgXG4gICAgLy8gU2V0dXAgY29udGV4dCBmb3IgZ2VzdHVyZSBkZXRlY3Rpb25cbiAgICBjb25zdCBjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCA9IHtcbiAgICAgIHN0YXRlLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGVcbiAgICB9O1xuICAgIFxuICAgIC8vIENoZWNrIGlmIHdlIHNob3VsZCBjYW5jZWwgbG9uZ3ByZXNzXG4gICAgaWYgKHNob3VsZENhbmNlbExvbmdQcmVzcyhjb250ZXh0KSAmJiBsb25nUHJlc3NDbGVhbnVwKSB7XG4gICAgICBsb25nUHJlc3NDbGVhbnVwKCk7XG4gICAgICBsb25nUHJlc3NDbGVhbnVwID0gbnVsbDtcbiAgICB9XG4gICAgXG4gICAgLy8gRGV0ZWN0IHBhbiBnZXN0dXJlXG4gICAgY29uc3QgcGFuRXZlbnQgPSBkZXRlY3RQYW4oY29udGV4dCk7XG4gICAgaWYgKHBhbkV2ZW50KSB7XG4gICAgICBkaXNwYXRjaEdlc3R1cmUocGFuRXZlbnQpO1xuICAgIH1cbiAgICBcbiAgICAvLyBNdWx0aS10b3VjaCBnZXN0dXJlc1xuICAgIGlmICh0b3VjaENvdW50ID09PSAyICYmICd0b3VjaGVzJyBpbiBlKSB7XG4gICAgICBjb25zdCB0b3VjaDEgPSBlLnRvdWNoZXNbMF07XG4gICAgICBjb25zdCB0b3VjaDIgPSBlLnRvdWNoZXNbMV07XG4gICAgICBcbiAgICAgIC8vIERldGVjdCBwaW5jaFxuICAgICAgY29uc3QgcGluY2hFdmVudCA9IGRldGVjdFBpbmNoKGNvbnRleHQsIHRvdWNoMSwgdG91Y2gyKTtcbiAgICAgIGlmIChwaW5jaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoR2VzdHVyZShwaW5jaEV2ZW50KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRGV0ZWN0IHJvdGF0ZVxuICAgICAgY29uc3Qgcm90YXRlRXZlbnQgPSBkZXRlY3RSb3RhdGUoY29udGV4dCwgdG91Y2gxLCB0b3VjaDIpO1xuICAgICAgaWYgKHJvdGF0ZUV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoR2VzdHVyZShyb3RhdGVFdmVudCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBcbiAgLyoqXG4gICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBlbmRcbiAgICovXG4gIGNvbnN0IGhhbmRsZUVuZCA9IChlOiBUb3VjaEV2ZW50IHwgTW91c2VFdmVudCB8IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgIGlmICghc3RhdGUuYWN0aXZlKSByZXR1cm47XG4gICAgXG4gICAgLy8gQ2FuY2VsIGFueSBvbmdvaW5nIGxvbmcgcHJlc3MgZGV0ZWN0aW9uXG4gICAgaWYgKGxvbmdQcmVzc0NsZWFudXApIHtcbiAgICAgIGxvbmdQcmVzc0NsZWFudXAoKTtcbiAgICAgIGxvbmdQcmVzc0NsZWFudXAgPSBudWxsO1xuICAgIH1cbiAgICBcbiAgICAvLyBTZXR1cCBjb250ZXh0IGZvciBnZXN0dXJlIGRldGVjdGlvblxuICAgIGNvbnN0IGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0ID0ge1xuICAgICAgc3RhdGUsXG4gICAgICBvcHRpb25zLFxuICAgICAgb3JpZ2luYWxFdmVudDogZVxuICAgIH07XG4gICAgXG4gICAgLy8gRGV0ZWN0IHRhcFxuICAgIGNvbnN0IHRhcEV2ZW50ID0gZGV0ZWN0VGFwKGNvbnRleHQpO1xuICAgIGlmICh0YXBFdmVudCkge1xuICAgICAgLy8gVXBkYXRlIHRhcCBjb3VudCBmb3IgbmV4dCB0YXBcbiAgICAgIHN0YXRlLmxhc3RUYXBUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIHN0YXRlLnRhcENvdW50ID0gdGFwRXZlbnQuY291bnQ7XG4gICAgICBcbiAgICAgIGRpc3BhdGNoR2VzdHVyZSh0YXBFdmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERldGVjdCBzd2lwZVxuICAgICAgY29uc3Qgc3dpcGVFdmVudCA9IGRldGVjdFN3aXBlKGNvbnRleHQpO1xuICAgICAgaWYgKHN3aXBlRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hHZXN0dXJlKHN3aXBlRXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBSZXNldCBzdGF0ZVxuICAgIHN0YXRlLmFjdGl2ZSA9IGZhbHNlO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBjYW5jZWxcbiAgICovXG4gIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpOiB2b2lkID0+IHtcbiAgICAvLyBDYW5jZWwgbG9uZyBwcmVzcyBkZXRlY3Rpb25cbiAgICBpZiAobG9uZ1ByZXNzQ2xlYW51cCkge1xuICAgICAgbG9uZ1ByZXNzQ2xlYW51cCgpO1xuICAgICAgbG9uZ1ByZXNzQ2xlYW51cCA9IG51bGw7XG4gICAgfVxuICAgIFxuICAgIC8vIFJlc2V0IHN0YXRlXG4gICAgc3RhdGUuYWN0aXZlID0gZmFsc2U7XG4gIH07XG4gIFxuICAvLyBFdmVudCBsaXN0ZW5lciByZWZlcmVuY2VzXG4gIGxldCBldmVudExpc3RlbmVyczogeyBcbiAgICBbZXZlbnQ6IHN0cmluZ106IEV2ZW50TGlzdGVuZXIgXG4gIH0gPSB7fTtcbiAgXG4gIC8qKlxuICAgKiBTZXQgdXAgZXZlbnQgbGlzdGVuZXJzIGJhc2VkIG9uIGF2YWlsYWJsZSBBUElzXG4gICAqL1xuICBjb25zdCBzZXR1cEV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChzdXBwb3J0UG9pbnRlcikge1xuICAgICAgLy8gVXNlIFBvaW50ZXIgRXZlbnRzIEFQSVxuICAgICAgZXZlbnRMaXN0ZW5lcnMgPSB7XG4gICAgICAgIHBvaW50ZXJkb3duOiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICBwb2ludGVybW92ZTogaGFuZGxlTW92ZSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICBwb2ludGVydXA6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICBwb2ludGVyY2FuY2VsOiBoYW5kbGVDYW5jZWwgYXMgRXZlbnRMaXN0ZW5lclxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnRUb3VjaCkge1xuICAgICAgLy8gVXNlIFRvdWNoIEV2ZW50cyBBUElcbiAgICAgIGV2ZW50TGlzdGVuZXJzID0ge1xuICAgICAgICB0b3VjaHN0YXJ0OiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICB0b3VjaG1vdmU6IGhhbmRsZU1vdmUgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgICAgdG91Y2hlbmQ6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICB0b3VjaGNhbmNlbDogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXJcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZhbGwgYmFjayB0byBNb3VzZSBFdmVudHMgQVBJXG4gICAgICBldmVudExpc3RlbmVycyA9IHtcbiAgICAgICAgbW91c2Vkb3duOiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICBtb3VzZW1vdmU6IGhhbmRsZU1vdmUgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgICAgbW91c2V1cDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICAgIG1vdXNlbGVhdmU6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyXG4gICAgICB9O1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgbGlzdGVuZXJzIHRvIGVsZW1lbnRcbiAgICBPYmplY3QuZW50cmllcyhldmVudExpc3RlbmVycykuZm9yRWFjaCgoW2V2ZW50LCBsaXN0ZW5lcl0pID0+IHtcbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIHsgcGFzc2l2ZTogIW9wdGlvbnMucHJldmVudERlZmF1bHQgfSk7XG4gICAgfSk7XG4gIH07XG4gIFxuICAvKipcbiAgICogUmVtb3ZlIGFsbCBldmVudCBsaXN0ZW5lcnNcbiAgICovXG4gIGNvbnN0IHJlbW92ZUV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgIC8vIFJlbW92ZSBhbGwgbGlzdGVuZXJzIGZyb20gZWxlbWVudFxuICAgIE9iamVjdC5lbnRyaWVzKGV2ZW50TGlzdGVuZXJzKS5mb3JFYWNoKChbZXZlbnQsIGxpc3RlbmVyXSkgPT4ge1xuICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgfSk7XG4gICAgXG4gICAgLy8gQ2xlYXIgZXZlbnRMaXN0ZW5lcnMgb2JqZWN0XG4gICAgZXZlbnRMaXN0ZW5lcnMgPSB7fTtcbiAgfTtcbiAgXG4gIC8vIEluaXRpYWxpemUgZXZlbnQgbGlzdGVuZXJzXG4gIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgXG4gIHJldHVybiB7XG4gICAgLyoqXG4gICAgICogQWRkIGEgZ2VzdHVyZSBldmVudCBsaXN0ZW5lclxuICAgICAqIEBwYXJhbSBldmVudFR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgdG8gbGlzdGVuIGZvclxuICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAqIEByZXR1cm5zIEdlc3R1cmUgbWFuYWdlciBmb3IgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBvbihldmVudFR5cGU6IHN0cmluZywgaGFuZGxlcjogR2VzdHVyZUhhbmRsZXIpOiBHZXN0dXJlTWFuYWdlciB7XG4gICAgICBpZiAoIWhhbmRsZXJzLmhhcyhldmVudFR5cGUpKSB7XG4gICAgICAgIGhhbmRsZXJzLnNldChldmVudFR5cGUsIG5ldyBTZXQoKSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGhhbmRsZXJzLmdldChldmVudFR5cGUpIS5hZGQoaGFuZGxlcik7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIFxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIGdlc3R1cmUgZXZlbnQgbGlzdGVuZXJcbiAgICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gVHlwZSBvZiBnZXN0dXJlXG4gICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIHRvIHJlbW92ZVxuICAgICAqIEByZXR1cm5zIEdlc3R1cmUgbWFuYWdlciBmb3IgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBvZmYoZXZlbnRUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IEdlc3R1cmVIYW5kbGVyKTogR2VzdHVyZU1hbmFnZXIge1xuICAgICAgY29uc3QgZXZlbnRIYW5kbGVycyA9IGhhbmRsZXJzLmdldChldmVudFR5cGUpO1xuICAgICAgaWYgKGV2ZW50SGFuZGxlcnMpIHtcbiAgICAgICAgZXZlbnRIYW5kbGVycy5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIFxuICAgICAgICBpZiAoZXZlbnRIYW5kbGVycy5zaXplID09PSAwKSB7XG4gICAgICAgICAgaGFuZGxlcnMuZGVsZXRlKGV2ZW50VHlwZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYSBnZXN0dXJlIGlzIHN1cHBvcnRlZCBvbiB0aGUgY3VycmVudCBkZXZpY2VcbiAgICAgKiBAcGFyYW0gZ2VzdHVyZVR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgdG8gY2hlY2tcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBnZXN0dXJlIGlzIHN1cHBvcnRlZFxuICAgICAqL1xuICAgIGlzU3VwcG9ydGVkKGdlc3R1cmVUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBnZXN0dXJlVHlwZSBpbiBnZXN0dXJlU3VwcG9ydCAmJiBnZXN0dXJlU3VwcG9ydFtnZXN0dXJlVHlwZSBhcyBrZXlvZiB0eXBlb2YgZ2VzdHVyZVN1cHBvcnRdO1xuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogRW5hYmxlIGdlc3R1cmUgcmVjb2duaXRpb24gYnkgYWRkaW5nIGV2ZW50IGxpc3RlbmVyc1xuICAgICAqIEByZXR1cm5zIEdlc3R1cmUgbWFuYWdlciBmb3IgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBlbmFibGUoKTogR2VzdHVyZU1hbmFnZXIge1xuICAgICAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBcbiAgICAvKipcbiAgICAgKiBEaXNhYmxlIGdlc3R1cmUgcmVjb2duaXRpb24gYnkgcmVtb3ZpbmcgZXZlbnQgbGlzdGVuZXJzXG4gICAgICogQHJldHVybnMgR2VzdHVyZSBtYW5hZ2VyIGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIGRpc2FibGUoKTogR2VzdHVyZU1hbmFnZXIge1xuICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogQ2xlYW4gdXAgZXZlbnQgbGlzdGVuZXJzIGFuZCB0aW1lcnNcbiAgICAgKi9cbiAgICBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgLy8gQ2xlYW4gdXAgbGlzdGVuZXJzXG4gICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgICAgXG4gICAgICAvLyBDbGVhciBsb25nIHByZXNzIHRpbWVyXG4gICAgICBpZiAobG9uZ1ByZXNzQ2xlYW51cCkge1xuICAgICAgICBsb25nUHJlc3NDbGVhbnVwKCk7XG4gICAgICAgIGxvbmdQcmVzc0NsZWFudXAgPSBudWxsO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDbGVhciBoYW5kbGVyIHJlZmVyZW5jZXNcbiAgICAgIGhhbmRsZXJzLmNsZWFyKCk7XG4gICAgfVxuICB9O1xufTsiLAogICAgIi8vIHNyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2NvbXBvc2UvZmVhdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBBZGRzIGdlc3R1cmUgcmVjb2duaXRpb24gY2FwYWJpbGl0aWVzIHRvIGNvbXBvbmVudHNcbiAqL1xuXG5pbXBvcnQgeyBCYXNlQ29tcG9uZW50LCBFbGVtZW50Q29tcG9uZW50IH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZUdlc3R1cmVNYW5hZ2VyLFxuICBHZXN0dXJlTWFuYWdlcixcbiAgR2VzdHVyZUNvbmZpZyxcbiAgR2VzdHVyZUhhbmRsZXIsXG4gIEFueUdlc3R1cmVFdmVudCxcbn0gZnJvbSBcIi4uLy4uLy4uL2dlc3R1cmVzXCI7XG5pbXBvcnQgeyBoYXNMaWZlY3ljbGUsIGhhc0VtaXQgfSBmcm9tIFwibXRybFwiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGdlc3R1cmVzIGZlYXR1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXN0dXJlc0ZlYXR1cmVDb25maWcgZXh0ZW5kcyBHZXN0dXJlQ29uZmlnIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIGdlc3R1cmUgcmVjb2duaXRpb24gaW1tZWRpYXRlbHlcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlR2VzdHVyZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsIGdlc3R1cmUgZXZlbnQgaGFuZGxlcnNcbiAgICovXG4gIGdlc3R1cmVIYW5kbGVycz86IFJlY29yZDxzdHJpbmcsIEdlc3R1cmVIYW5kbGVyPjtcblxuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IHdpdGggZ2VzdHVyZSByZWNvZ25pdGlvbiBjYXBhYmlsaXRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXN0dXJlc0NvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvKipcbiAgICogR2VzdHVyZSBtYW5hZ2VyIGluc3RhbmNlXG4gICAqL1xuICBnZXN0dXJlczogR2VzdHVyZU1hbmFnZXI7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGdlc3R1cmUgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gVHlwZSBvZiBnZXN0dXJlIGV2ZW50XG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uR2VzdHVyZTogKGV2ZW50VHlwZTogc3RyaW5nLCBoYW5kbGVyOiBHZXN0dXJlSGFuZGxlcikgPT4gR2VzdHVyZXNDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGdlc3R1cmUgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gVHlwZSBvZiBnZXN0dXJlIGV2ZW50XG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZkdlc3R1cmU6IChldmVudFR5cGU6IHN0cmluZywgaGFuZGxlcjogR2VzdHVyZUhhbmRsZXIpID0+IEdlc3R1cmVzQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIGdlc3R1cmUgdHlwZSBpcyBzdXBwb3J0ZWQgb24gdGhlIGN1cnJlbnQgZGV2aWNlXG4gICAqIEBwYXJhbSBnZXN0dXJlVHlwZSAtIFR5cGUgb2YgZ2VzdHVyZSB0byBjaGVja1xuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBnZXN0dXJlIGlzIHN1cHBvcnRlZFxuICAgKi9cbiAgaXNHZXN0dXJlU3VwcG9ydGVkOiAoZ2VzdHVyZVR5cGU6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlIGdlc3R1cmUgcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgR2VzdHVyZXNDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBlbmFibGVHZXN0dXJlczogKCkgPT4gR2VzdHVyZXNDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIERpc2FibGUgZ2VzdHVyZSByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGRpc2FibGVHZXN0dXJlczogKCkgPT4gR2VzdHVyZXNDb21wb25lbnQ7XG59XG5cbi8qKlxuICogQWRkcyBnZXN0dXJlIHJlY29nbml0aW9uIGNhcGFiaWxpdGllcyB0byBhIGNvbXBvbmVudC5cbiAqIFRoaXMgaXMgYSBjb21wcmVoZW5zaXZlIGdlc3R1cmUgZmVhdHVyZSB0aGF0IGFkZHMgc3VwcG9ydCBmb3IgYWxsIGdlc3R1cmUgdHlwZXMuXG4gKiBGb3IgbW9yZSBsaWdodHdlaWdodCwgc3BlY2lmaWMgZ2VzdHVyZXMsIHVzZSB0aGUgaW5kaXZpZHVhbCBnZXN0dXJlIGZlYXR1cmVzLlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9iamVjdCBjb250YWluaW5nIGdlc3R1cmUgc2V0dGluZ3NcbiAqIEByZXR1cm5zIEZ1bmN0aW9uIHRoYXQgZW5oYW5jZXMgYSBjb21wb25lbnQgd2l0aCBnZXN0dXJlIGNhcGFiaWxpdGllc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gQWRkIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnRcbiAqIGNvbnN0IGNvbXBvbmVudCA9IHBpcGUoXG4gKiAgIGNyZWF0ZUJhc2UsXG4gKiAgIHdpdGhFbGVtZW50KC4uLiksXG4gKiAgIHdpdGhHZXN0dXJlcyh7XG4gKiAgICAgc3dpcGVUaHJlc2hvbGQ6IDUwLFxuICogICAgIGdlc3R1cmVIYW5kbGVyczoge1xuICogICAgICAgJ3RhcCc6IChlKSA9PiBoYW5kbGVUYXAoZSksXG4gKiAgICAgICAnc3dpcGVsZWZ0JzogKGUpID0+IG5hdmlnYXRlRm9yd2FyZChlKSxcbiAqICAgICAgICdzd2lwZXJpZ2h0JzogKGUpID0+IG5hdmlnYXRlQmFjayhlKVxuICogICAgIH1cbiAqICAgfSlcbiAqICkoY29uZmlnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgd2l0aEdlc3R1cmVzID1cbiAgKGNvbmZpZzogR2VzdHVyZXNGZWF0dXJlQ29uZmlnID0ge30pID0+XG4gIDxDIGV4dGVuZHMgRWxlbWVudENvbXBvbmVudD4oY29tcG9uZW50OiBDKTogQyAmIEdlc3R1cmVzQ29tcG9uZW50ID0+IHtcbiAgICBpZiAoIWNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJDYW5ub3QgYWRkIGdlc3R1cmUgcmVjb2duaXRpb246IG1pc3NpbmcgZWxlbWVudFwiKTtcbiAgICAgIHJldHVybiBjb21wb25lbnQgYXMgQyAmIEdlc3R1cmVzQ29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIGVuYWJsZUdlc3R1cmVzID0gdHJ1ZSxcbiAgICAgIGdlc3R1cmVIYW5kbGVycyA9IHt9LFxuICAgICAgLi4uZ2VzdHVyZUNvbmZpZ1xuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBDcmVhdGUgZ2VzdHVyZSBtYW5hZ2VyXG4gICAgY29uc3QgZ2VzdHVyZU1hbmFnZXIgPSBjcmVhdGVHZXN0dXJlTWFuYWdlcihcbiAgICAgIGNvbXBvbmVudC5lbGVtZW50LFxuICAgICAgZ2VzdHVyZUNvbmZpZ1xuICAgICk7XG5cbiAgICAvLyBBZGQgaW5pdGlhbCBnZXN0dXJlIGhhbmRsZXJzXG4gICAgT2JqZWN0LmVudHJpZXMoZ2VzdHVyZUhhbmRsZXJzKS5mb3JFYWNoKChbZXZlbnRUeXBlLCBoYW5kbGVyXSkgPT4ge1xuICAgICAgZ2VzdHVyZU1hbmFnZXIub24oZXZlbnRUeXBlLCBoYW5kbGVyKTtcbiAgICB9KTtcblxuICAgIC8vIEVuYWJsZS9kaXNhYmxlIGJhc2VkIG9uIGNvbmZpZ1xuICAgIGlmICghZW5hYmxlR2VzdHVyZXMpIHtcbiAgICAgIGdlc3R1cmVNYW5hZ2VyLmRpc2FibGUoKTtcbiAgICB9XG5cbiAgICAvLyBDb25uZWN0IHdpdGggZXhpc3RpbmcgZXZlbnQgc3lzdGVtIGlmIGF2YWlsYWJsZVxuICAgIGlmIChoYXNFbWl0KGNvbXBvbmVudCkpIHtcbiAgICAgIC8vIEZvcndhcmQgZ2VzdHVyZSBldmVudHMgdG8gdGhlIGNvbXBvbmVudCdzIGV2ZW50IHN5c3RlbVxuICAgICAgY29uc3QgZm9yd2FyZEdlc3R1cmVFdmVudHMgPSAoZXZlbnQ6IEFueUdlc3R1cmVFdmVudCkgPT4ge1xuICAgICAgICBjb21wb25lbnQuZW1pdChldmVudC50eXBlLCBldmVudCk7XG4gICAgICB9O1xuXG4gICAgICAvLyBSZWdpc3RlciBmb3J3YXJkZXIgZm9yIGNvbW1vbiBnZXN0dXJlIHR5cGVzXG4gICAgICBbXG4gICAgICAgIFwidGFwXCIsXG4gICAgICAgIFwic3dpcGVcIixcbiAgICAgICAgXCJzd2lwZWxlZnRcIixcbiAgICAgICAgXCJzd2lwZXJpZ2h0XCIsXG4gICAgICAgIFwic3dpcGV1cFwiLFxuICAgICAgICBcInN3aXBlZG93blwiLFxuICAgICAgICBcImxvbmdwcmVzc1wiLFxuICAgICAgICBcInBpbmNoXCIsXG4gICAgICAgIFwicm90YXRlXCIsXG4gICAgICAgIFwicGFuXCIsXG4gICAgICBdLmZvckVhY2goKHR5cGUpID0+IHtcbiAgICAgICAgZ2VzdHVyZU1hbmFnZXIub24odHlwZSwgZm9yd2FyZEdlc3R1cmVFdmVudHMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGxpZmVjeWNsZSBpbnRlZ3JhdGlvblxuICAgIGlmIChoYXNMaWZlY3ljbGUoY29tcG9uZW50KSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95O1xuXG4gICAgICBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGdlc3R1cmUgbWFuYWdlclxuICAgICAgICBnZXN0dXJlTWFuYWdlci5kZXN0cm95KCk7XG5cbiAgICAgICAgLy8gQ2FsbCBvcmlnaW5hbCBkZXN0cm95IG1ldGhvZFxuICAgICAgICBvcmlnaW5hbERlc3Ryb3kuY2FsbChjb21wb25lbnQubGlmZWN5Y2xlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBnZXN0dXJlczogZ2VzdHVyZU1hbmFnZXIsXG5cbiAgICAgIC8qKlxuICAgICAgICogQWRkIGEgZ2VzdHVyZSBldmVudCBoYW5kbGVyXG4gICAgICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gVHlwZSBvZiBnZXN0dXJlIGV2ZW50XG4gICAgICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICAgICAqIEByZXR1cm5zIEdlc3R1cmVzQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgICAgICovXG4gICAgICBvbkdlc3R1cmUoZXZlbnRUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IEdlc3R1cmVIYW5kbGVyKSB7XG4gICAgICAgIGdlc3R1cmVNYW5hZ2VyLm9uKGV2ZW50VHlwZSwgaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBSZW1vdmUgYSBnZXN0dXJlIGV2ZW50IGhhbmRsZXJcbiAgICAgICAqIEBwYXJhbSBldmVudFR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgZXZlbnRcbiAgICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICogQHJldHVybnMgR2VzdHVyZXNDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIG9mZkdlc3R1cmUoZXZlbnRUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IEdlc3R1cmVIYW5kbGVyKSB7XG4gICAgICAgIGdlc3R1cmVNYW5hZ2VyLm9mZihldmVudFR5cGUsIGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgYSBnZXN0dXJlIHR5cGUgaXMgc3VwcG9ydGVkIG9uIHRoZSBjdXJyZW50IGRldmljZVxuICAgICAgICogQHBhcmFtIGdlc3R1cmVUeXBlIC0gVHlwZSBvZiBnZXN0dXJlIHRvIGNoZWNrXG4gICAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBnZXN0dXJlIGlzIHN1cHBvcnRlZFxuICAgICAgICovXG4gICAgICBpc0dlc3R1cmVTdXBwb3J0ZWQoZ2VzdHVyZVR5cGU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gZ2VzdHVyZU1hbmFnZXIuaXNTdXBwb3J0ZWQoZ2VzdHVyZVR5cGUpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBFbmFibGUgZ2VzdHVyZSByZWNvZ25pdGlvblxuICAgICAgICogQHJldHVybnMgR2VzdHVyZXNDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZUdlc3R1cmVzKCkge1xuICAgICAgICBnZXN0dXJlTWFuYWdlci5lbmFibGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIERpc2FibGUgZ2VzdHVyZSByZWNvZ25pdGlvblxuICAgICAgICogQHJldHVybnMgR2VzdHVyZXNDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVHZXN0dXJlcygpIHtcbiAgICAgICAgZ2VzdHVyZU1hbmFnZXIuZGlzYWJsZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbiIsCiAgICAiLy8gc3JjL2NvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlcy90YXAudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBBZGRzIHRhcCBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGNvbXBvbmVudHNcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEJhc2VDb21wb25lbnQsIEVsZW1lbnRDb21wb25lbnQgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgVGFwRXZlbnQsIEdlc3R1cmVIYW5kbGVyIH0gZnJvbSBcIi4uLy4uLy4uL2dlc3R1cmVzXCI7XG5pbXBvcnQgeyBoYXNMaWZlY3ljbGUsIGhhc0VtaXQgfSBmcm9tIFwibXRybFwiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRhcCBnZXN0dXJlIGZlYXR1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXBHZXN0dXJlQ29uZmlnIHtcbiAgLyoqXG4gICAqIERpc3RhbmNlIHRocmVzaG9sZCAoaW4gcGl4ZWxzKSBmb3IgdGFwIHJlY29nbml0aW9uXG4gICAqIEBkZWZhdWx0IDEwXG4gICAqL1xuICB0YXBEaXN0YW5jZVRocmVzaG9sZD86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBwcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3JzIG9uIHRvdWNoIGV2ZW50c1xuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBwcmV2ZW50RGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIHRhcCBnZXN0dXJlXG4gICAqL1xuICBvblRhcD86IEdlc3R1cmVIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVuYWJsZSB0YXAgcmVjb2duaXRpb24gaW1tZWRpYXRlbHlcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vKipcbiAqIENvbXBvbmVudCB3aXRoIHRhcCBnZXN0dXJlIHJlY29nbml0aW9uIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhcEdlc3R1cmVDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIEFkZCBhIHRhcCBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblRhcDogKGhhbmRsZXI6IChldmVudDogVGFwRXZlbnQpID0+IHZvaWQpID0+IFRhcEdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHRhcCBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZUYXA6IChoYW5kbGVyOiAoZXZlbnQ6IFRhcEV2ZW50KSA9PiB2b2lkKSA9PiBUYXBHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBFbmFibGUgdGFwIHJlY29nbml0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGVuYWJsZVRhcDogKCkgPT4gVGFwR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogRGlzYWJsZSB0YXAgcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZGlzYWJsZVRhcDogKCkgPT4gVGFwR2VzdHVyZUNvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBBZGRzIHRhcCBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50LlxuICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IGFsdGVybmF0aXZlIHRvIHRoZSBmdWxsIGdlc3R1cmUgc3lzdGVtLFxuICogZm9jdXNlZCBvbmx5IG9uIHRhcCBkZXRlY3Rpb24uXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0IGNvbnRhaW5pbmcgdGFwIHNldHRpbmdzXG4gKiBAcmV0dXJucyBGdW5jdGlvbiB0aGF0IGVuaGFuY2VzIGEgY29tcG9uZW50IHdpdGggdGFwIGNhcGFiaWxpdGllc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gQWRkIHRhcCBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50XG4gKiBjb25zdCBjb21wb25lbnQgPSBwaXBlKFxuICogICBjcmVhdGVCYXNlLFxuICogICB3aXRoRWxlbWVudCguLi4pLFxuICogICB3aXRoVGFwR2VzdHVyZSh7XG4gKiAgICAgb25UYXA6IChlKSA9PiBjb25zb2xlLmxvZygnVGFwcGVkIGF0JywgZS54LCBlLnkpXG4gKiAgIH0pXG4gKiApKGNvbmZpZyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhUYXBHZXN0dXJlID1cbiAgKGNvbmZpZzogVGFwR2VzdHVyZUNvbmZpZyA9IHt9KSA9PlxuICA8QyBleHRlbmRzIEVsZW1lbnRDb21wb25lbnQ+KGNvbXBvbmVudDogQyk6IEMgJiBUYXBHZXN0dXJlQ29tcG9uZW50ID0+IHtcbiAgICBpZiAoIWNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJDYW5ub3QgYWRkIHRhcCBnZXN0dXJlIHJlY29nbml0aW9uOiBtaXNzaW5nIGVsZW1lbnRcIik7XG4gICAgICByZXR1cm4gY29tcG9uZW50IGFzIEMgJiBUYXBHZXN0dXJlQ29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIHRhcERpc3RhbmNlVGhyZXNob2xkID0gMTAsXG4gICAgICBwcmV2ZW50RGVmYXVsdCA9IHRydWUsXG4gICAgICBvblRhcCxcbiAgICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBFdmVudCBoYW5kbGVycyBzdG9yYWdlXG4gICAgY29uc3QgaGFuZGxlcnM6IFNldDwoZXZlbnQ6IFRhcEV2ZW50KSA9PiB2b2lkPiA9IG5ldyBTZXQoKTtcblxuICAgIC8vIElmIGluaXRpYWwgaGFuZGxlciBwcm92aWRlZCwgYWRkIGl0XG4gICAgaWYgKG9uVGFwKSB7XG4gICAgICBoYW5kbGVycy5hZGQob25UYXAgYXMgKGV2ZW50OiBUYXBFdmVudCkgPT4gdm9pZCk7XG4gICAgfVxuXG4gICAgLy8gR2VzdHVyZSBzdGF0ZSBmb3IgdHJhY2tpbmdcbiAgICBsZXQgc3RhcnRYID0gMDtcbiAgICBsZXQgc3RhcnRZID0gMDtcbiAgICBsZXQgYWN0aXZlID0gZmFsc2U7XG4gICAgbGV0IHN0YXJ0VGltZSA9IDA7XG4gICAgbGV0IGxhc3RUYXBUaW1lID0gMDtcbiAgICBsZXQgdGFwQ291bnQgPSAwO1xuICAgIGxldCBpc0VuYWJsZWQgPSBlbmFibGVkO1xuXG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2ggYSB0YXAgZXZlbnQgdG8gYWxsIGhhbmRsZXJzXG4gICAgICovXG4gICAgY29uc3QgZGlzcGF0Y2hUYXAgPSAoXG4gICAgICBlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCxcbiAgICAgIHg6IG51bWJlcixcbiAgICAgIHk6IG51bWJlclxuICAgICk6IHZvaWQgPT4ge1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGlzRG91YmxlVGFwID0gbm93IC0gbGFzdFRhcFRpbWUgPCAzMDA7XG5cbiAgICAgIGlmIChpc0RvdWJsZVRhcCkge1xuICAgICAgICB0YXBDb3VudCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFwQ291bnQgPSAxO1xuICAgICAgfVxuXG4gICAgICBsYXN0VGFwVGltZSA9IG5vdztcblxuICAgICAgLy8gQ3JlYXRlIHRoZSB0YXAgZXZlbnRcbiAgICAgIGNvbnN0IHRhcEV2ZW50OiBUYXBFdmVudCA9IHtcbiAgICAgICAgdHlwZTogXCJ0YXBcIixcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgdGFyZ2V0OiBlLnRhcmdldCEsXG4gICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgZW5kVGltZTogbm93LFxuICAgICAgICBkdXJhdGlvbjogbm93IC0gc3RhcnRUaW1lLFxuICAgICAgICBkZWZhdWx0UHJldmVudGVkOiBmYWxzZSxcbiAgICAgICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgICB0YXBFdmVudC5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZS5jYW5jZWxhYmxlKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzdG9wUHJvcGFnYXRpb246ICgpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9LFxuICAgICAgICBjb3VudDogdGFwQ291bnQsXG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICB9O1xuXG4gICAgICAvLyBDYWxsIGVhY2ggaGFuZGxlclxuICAgICAgaGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGhhbmRsZXIodGFwRXZlbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBpbiB0YXAgaGFuZGxlcjpcIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gRm9yd2FyZCB0byBjb21wb25lbnQncyBldmVudCBzeXN0ZW0gaWYgYXZhaWxhYmxlXG4gICAgICBpZiAoaGFzRW1pdChjb21wb25lbnQpKSB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0KFwidGFwXCIsIHRhcEV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgcHJldmVudERlZmF1bHQgaWYgY29uZmlndXJlZFxuICAgICAgaWYgKHByZXZlbnREZWZhdWx0ICYmICF0YXBFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgIHRhcEV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBzdGFydFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZVN0YXJ0ID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWlzRW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0b3VjaCA9IFwidG91Y2hlc1wiIGluIGUgPyBlLnRvdWNoZXNbMF0gOiBlO1xuXG4gICAgICBzdGFydFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgc3RhcnRZID0gdG91Y2guY2xpZW50WTtcbiAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBhY3RpdmUgPSB0cnVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgZW5kXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlRW5kID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWFjdGl2ZSB8fCAhaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRvdWNoID1cbiAgICAgICAgXCJjaGFuZ2VkVG91Y2hlc1wiIGluIGUgJiYgZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggPiAwXG4gICAgICAgICAgPyBlLmNoYW5nZWRUb3VjaGVzWzBdXG4gICAgICAgICAgOiAoZSBhcyBNb3VzZUV2ZW50KTtcblxuICAgICAgY29uc3QgZW5kWCA9IHRvdWNoLmNsaWVudFg7XG4gICAgICBjb25zdCBlbmRZID0gdG91Y2guY2xpZW50WTtcblxuICAgICAgLy8gQ2FsY3VsYXRlIGRpc3RhbmNlIG1vdmVkXG4gICAgICBjb25zdCBkZWx0YVggPSBlbmRYIC0gc3RhcnRYO1xuICAgICAgY29uc3QgZGVsdGFZID0gZW5kWSAtIHN0YXJ0WTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIG1vdmVtZW50IGlzIHdpdGhpbiB0aHJlc2hvbGRcbiAgICAgIGlmIChkaXN0YW5jZSA8IHRhcERpc3RhbmNlVGhyZXNob2xkKSB7XG4gICAgICAgIGRpc3BhdGNoVGFwKGUsIGVuZFgsIGVuZFkpO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIGNhbmNlbFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvLyBFdmVudCBsaXN0ZW5lcnMgZGljdGlvbmFyeVxuICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzOiBSZWNvcmQ8c3RyaW5nLCBFdmVudExpc3RlbmVyPiA9IHtcbiAgICAgIG1vdXNlZG93bjogaGFuZGxlU3RhcnQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNldXA6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2VsZWF2ZTogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaHN0YXJ0OiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hlbmQ6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hjYW5jZWw6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGQgZXZlbnQgbGlzdGVuZXJzIHRvIGVsZW1lbnRcbiAgICAgKi9cbiAgICBjb25zdCBzZXR1cEV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCB7XG4gICAgICAgICAgcGFzc2l2ZTogIXByZXZlbnREZWZhdWx0LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGZyb20gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHJlbW92ZUV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBTZXR1cCBsaXN0ZW5lcnMgaWYgaW5pdGlhbGx5IGVuYWJsZWRcbiAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGxpZmVjeWNsZSBpbnRlZ3JhdGlvblxuICAgIGlmIChoYXNMaWZlY3ljbGUoY29tcG9uZW50KSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95O1xuXG4gICAgICBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuXG4gICAgICAgIC8vIENsZWFyIGhhbmRsZXJzXG4gICAgICAgIGhhbmRsZXJzLmNsZWFyKCk7XG5cbiAgICAgICAgLy8gQ2FsbCBvcmlnaW5hbCBkZXN0cm95IG1ldGhvZFxuICAgICAgICBvcmlnaW5hbERlc3Ryb3kuY2FsbChjb21wb25lbnQubGlmZWN5Y2xlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG5cbiAgICAgIC8qKlxuICAgICAgICogQWRkIGEgdGFwIGV2ZW50IGhhbmRsZXJcbiAgICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgICAgICovXG4gICAgICBvblRhcChoYW5kbGVyOiAoZXZlbnQ6IFRhcEV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBhIHRhcCBldmVudCBoYW5kbGVyXG4gICAgICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICAgICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgb2ZmVGFwKGhhbmRsZXI6IChldmVudDogVGFwRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRW5hYmxlIHRhcCByZWNvZ25pdGlvblxuICAgICAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgICAgICovXG4gICAgICBlbmFibGVUYXAoKSB7XG4gICAgICAgIGlmICghaXNFbmFibGVkKSB7XG4gICAgICAgICAgaXNFbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIERpc2FibGUgdGFwIHJlY29nbml0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVUYXAoKSB7XG4gICAgICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvLyBzcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3N3aXBlLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzXG4gKiBAZGVzY3JpcHRpb24gQWRkcyBzd2lwZSBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGNvbXBvbmVudHNcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEJhc2VDb21wb25lbnQsIEVsZW1lbnRDb21wb25lbnQgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHtcbiAgU3dpcGVFdmVudCxcbiAgU1dJUEVfRElSRUNUSU9OUyxcbiAgR2VzdHVyZUhhbmRsZXIsXG59IGZyb20gXCIuLi8uLi8uLi9nZXN0dXJlc1wiO1xuaW1wb3J0IHsgaGFzTGlmZWN5Y2xlLCBoYXNFbWl0IH0gZnJvbSBcIm10cmxcIjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBzd2lwZSBnZXN0dXJlIGZlYXR1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTd2lwZUdlc3R1cmVDb25maWcge1xuICAvKipcbiAgICogTWluaW11bSBkaXN0YW5jZSAoaW4gcGl4ZWxzKSB0byByZWNvZ25pemUgYSBzd2lwZVxuICAgKiBAZGVmYXVsdCAzMFxuICAgKi9cbiAgc3dpcGVUaHJlc2hvbGQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gdGltZSAoaW4gbXMpIGluIHdoaWNoIGEgc3dpcGUgbXVzdCBiZSBjb21wbGV0ZWRcbiAgICogQGRlZmF1bHQgMzAwXG4gICAqL1xuICBzd2lwZVRpbWVUaHJlc2hvbGQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcHJldmVudCBkZWZhdWx0IGJlaGF2aW9ycyBvbiB0b3VjaCBldmVudHNcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcHJldmVudERlZmF1bHQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVyIGZvciBhbnkgc3dpcGUgZGlyZWN0aW9uXG4gICAqL1xuICBvblN3aXBlPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciBsZWZ0IHN3aXBlc1xuICAgKi9cbiAgb25Td2lwZUxlZnQ/OiBHZXN0dXJlSGFuZGxlcjtcblxuICAvKipcbiAgICogSGFuZGxlciBzcGVjaWZpY2FsbHkgZm9yIHJpZ2h0IHN3aXBlc1xuICAgKi9cbiAgb25Td2lwZVJpZ2h0PzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciB1cCBzd2lwZXNcbiAgICovXG4gIG9uU3dpcGVVcD86IEdlc3R1cmVIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVyIHNwZWNpZmljYWxseSBmb3IgZG93biBzd2lwZXNcbiAgICovXG4gIG9uU3dpcGVEb3duPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIHN3aXBlIHJlY29nbml0aW9uIGltbWVkaWF0ZWx5XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgd2l0aCBzd2lwZSBnZXN0dXJlIHJlY29nbml0aW9uIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFN3aXBlR2VzdHVyZUNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvKipcbiAgICogQWRkIGEgaGFuZGxlciBmb3IgYW55IHN3aXBlIGRpcmVjdGlvblxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb25Td2lwZTogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBoYW5kbGVyIHNwZWNpZmljYWxseSBmb3IgbGVmdCBzd2lwZXNcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uU3dpcGVMZWZ0OiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciByaWdodCBzd2lwZXNcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uU3dpcGVSaWdodDogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBoYW5kbGVyIHNwZWNpZmljYWxseSBmb3IgdXAgc3dpcGVzXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblN3aXBlVXA6IChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpID0+IFN3aXBlR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogQWRkIGEgaGFuZGxlciBzcGVjaWZpY2FsbHkgZm9yIGRvd24gc3dpcGVzXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblN3aXBlRG93bjogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBzd2lwZSBldmVudCBoYW5kbGVyIGZvciBhbnkgZGlyZWN0aW9uXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZTd2lwZTogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBsZWZ0IHN3aXBlIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlN3aXBlTGVmdDogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSByaWdodCBzd2lwZSBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZTd2lwZVJpZ2h0OiAoXG4gICAgaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkXG4gICkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gdXAgc3dpcGUgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmU3dpcGVVcDogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBkb3duIHN3aXBlIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlN3aXBlRG93bjogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBFbmFibGUgc3dpcGUgcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZW5hYmxlU3dpcGU6ICgpID0+IFN3aXBlR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogRGlzYWJsZSBzd2lwZSByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBkaXNhYmxlU3dpcGU6ICgpID0+IFN3aXBlR2VzdHVyZUNvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgc3dpcGUgZGlyZWN0aW9uIGJhc2VkIG9uIGRlbHRhIFggYW5kIFlcbiAqXG4gKiBAcGFyYW0gZGVsdGFYIC0gRGlzdGFuY2UgbW92ZWQgaW4gWCBkaXJlY3Rpb25cbiAqIEBwYXJhbSBkZWx0YVkgLSBEaXN0YW5jZSBtb3ZlZCBpbiBZIGRpcmVjdGlvblxuICogQHJldHVybnMgRGlyZWN0aW9uIG9mIHRoZSBzd2lwZVxuICovXG5mdW5jdGlvbiBnZXRTd2lwZURpcmVjdGlvbihkZWx0YVg6IG51bWJlciwgZGVsdGFZOiBudW1iZXIpOiBTV0lQRV9ESVJFQ1RJT05TIHtcbiAgaWYgKE1hdGguYWJzKGRlbHRhWCkgPiBNYXRoLmFicyhkZWx0YVkpKSB7XG4gICAgcmV0dXJuIGRlbHRhWCA+IDAgPyBTV0lQRV9ESVJFQ1RJT05TLlJJR0hUIDogU1dJUEVfRElSRUNUSU9OUy5MRUZUO1xuICB9XG4gIHJldHVybiBkZWx0YVkgPiAwID8gU1dJUEVfRElSRUNUSU9OUy5ET1dOIDogU1dJUEVfRElSRUNUSU9OUy5VUDtcbn1cblxuLyoqXG4gKiBBZGRzIHN3aXBlIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnQuXG4gKiBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQgYWx0ZXJuYXRpdmUgdG8gdGhlIGZ1bGwgZ2VzdHVyZSBzeXN0ZW0sXG4gKiBmb2N1c2VkIG9ubHkgb24gc3dpcGUgZGV0ZWN0aW9uLlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9iamVjdCBjb250YWluaW5nIHN3aXBlIHNldHRpbmdzXG4gKiBAcmV0dXJucyBGdW5jdGlvbiB0aGF0IGVuaGFuY2VzIGEgY29tcG9uZW50IHdpdGggc3dpcGUgY2FwYWJpbGl0aWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBBZGQgc3dpcGUgZ2VzdHVyZSByZWNvZ25pdGlvbiB0byBhIGNvbXBvbmVudFxuICogY29uc3QgY29tcG9uZW50ID0gcGlwZShcbiAqICAgY3JlYXRlQmFzZSxcbiAqICAgd2l0aEVsZW1lbnQoLi4uKSxcbiAqICAgd2l0aFN3aXBlR2VzdHVyZSh7XG4gKiAgICAgb25Td2lwZUxlZnQ6ICgpID0+IHNob3dOZXh0UGFnZSgpLFxuICogICAgIG9uU3dpcGVSaWdodDogKCkgPT4gc2hvd1ByZXZpb3VzUGFnZSgpXG4gKiAgIH0pXG4gKiApKGNvbmZpZyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhTd2lwZUdlc3R1cmUgPVxuICAoY29uZmlnOiBTd2lwZUdlc3R1cmVDb25maWcgPSB7fSkgPT5cbiAgPEMgZXh0ZW5kcyBFbGVtZW50Q29tcG9uZW50Pihjb21wb25lbnQ6IEMpOiBDICYgU3dpcGVHZXN0dXJlQ29tcG9uZW50ID0+IHtcbiAgICBpZiAoIWNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJDYW5ub3QgYWRkIHN3aXBlIGdlc3R1cmUgcmVjb2duaXRpb246IG1pc3NpbmcgZWxlbWVudFwiKTtcbiAgICAgIHJldHVybiBjb21wb25lbnQgYXMgQyAmIFN3aXBlR2VzdHVyZUNvbXBvbmVudDtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IGNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCB7XG4gICAgICBzd2lwZVRocmVzaG9sZCA9IDMwLFxuICAgICAgc3dpcGVUaW1lVGhyZXNob2xkID0gMzAwLFxuICAgICAgcHJldmVudERlZmF1bHQgPSB0cnVlLFxuICAgICAgb25Td2lwZSxcbiAgICAgIG9uU3dpcGVMZWZ0LFxuICAgICAgb25Td2lwZVJpZ2h0LFxuICAgICAgb25Td2lwZVVwLFxuICAgICAgb25Td2lwZURvd24sXG4gICAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gRXZlbnQgaGFuZGxlcnMgc3RvcmFnZSBieSBkaXJlY3Rpb25cbiAgICBjb25zdCBoYW5kbGVycyA9IHtcbiAgICAgIHN3aXBlOiBuZXcgU2V0PChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZD4oKSxcbiAgICAgIHN3aXBlbGVmdDogbmV3IFNldDwoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQ+KCksXG4gICAgICBzd2lwZXJpZ2h0OiBuZXcgU2V0PChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZD4oKSxcbiAgICAgIHN3aXBldXA6IG5ldyBTZXQ8KGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkPigpLFxuICAgICAgc3dpcGVkb3duOiBuZXcgU2V0PChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZD4oKSxcbiAgICB9O1xuXG4gICAgLy8gQWRkIGluaXRpYWwgaGFuZGxlcnMgaWYgcHJvdmlkZWRcbiAgICBpZiAob25Td2lwZSkgaGFuZGxlcnMuc3dpcGUuYWRkKG9uU3dpcGUgYXMgKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKTtcbiAgICBpZiAob25Td2lwZUxlZnQpXG4gICAgICBoYW5kbGVycy5zd2lwZWxlZnQuYWRkKG9uU3dpcGVMZWZ0IGFzIChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCk7XG4gICAgaWYgKG9uU3dpcGVSaWdodClcbiAgICAgIGhhbmRsZXJzLnN3aXBlcmlnaHQuYWRkKG9uU3dpcGVSaWdodCBhcyAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpO1xuICAgIGlmIChvblN3aXBlVXApXG4gICAgICBoYW5kbGVycy5zd2lwZXVwLmFkZChvblN3aXBlVXAgYXMgKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKTtcbiAgICBpZiAob25Td2lwZURvd24pXG4gICAgICBoYW5kbGVycy5zd2lwZWRvd24uYWRkKG9uU3dpcGVEb3duIGFzIChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCk7XG5cbiAgICAvLyBHZXN0dXJlIHN0YXRlIGZvciB0cmFja2luZ1xuICAgIGxldCBzdGFydFggPSAwO1xuICAgIGxldCBzdGFydFkgPSAwO1xuICAgIGxldCBhY3RpdmUgPSBmYWxzZTtcbiAgICBsZXQgc3RhcnRUaW1lID0gMDtcbiAgICBsZXQgaXNFbmFibGVkID0gZW5hYmxlZDtcblxuICAgIC8qKlxuICAgICAqIERpc3BhdGNoIGEgc3dpcGUgZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgaGFuZGxlcnNcbiAgICAgKi9cbiAgICBjb25zdCBkaXNwYXRjaFN3aXBlID0gKFxuICAgICAgZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQsXG4gICAgICBlbmRYOiBudW1iZXIsXG4gICAgICBlbmRZOiBudW1iZXJcbiAgICApOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGRlbHRhWCA9IGVuZFggLSBzdGFydFg7XG4gICAgICBjb25zdCBkZWx0YVkgPSBlbmRZIC0gc3RhcnRZO1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcbiAgICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgZHVyYXRpb24gPSBlbmRUaW1lIC0gc3RhcnRUaW1lO1xuICAgICAgY29uc3QgdmVsb2NpdHkgPSBkaXN0YW5jZSAvIGR1cmF0aW9uO1xuICAgICAgY29uc3QgZGlyZWN0aW9uID0gZ2V0U3dpcGVEaXJlY3Rpb24oZGVsdGFYLCBkZWx0YVkpO1xuXG4gICAgICAvLyBDcmVhdGUgdGhlIHN3aXBlIGV2ZW50XG4gICAgICBjb25zdCBzd2lwZUV2ZW50OiBTd2lwZUV2ZW50ID0ge1xuICAgICAgICB0eXBlOiBcInN3aXBlXCIsXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHRhcmdldDogZS50YXJnZXQhLFxuICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgIGVuZFRpbWUsXG4gICAgICAgIGR1cmF0aW9uLFxuICAgICAgICBkZWZhdWx0UHJldmVudGVkOiBmYWxzZSxcbiAgICAgICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgICBzd2lwZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChlLmNhbmNlbGFibGUpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHN0b3BQcm9wYWdhdGlvbjogKCkgPT4ge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgZGVsdGFYLFxuICAgICAgICBkZWx0YVksXG4gICAgICAgIGRpc3RhbmNlLFxuICAgICAgICB2ZWxvY2l0eSxcbiAgICAgICAgc3RhcnRYLFxuICAgICAgICBzdGFydFksXG4gICAgICAgIGVuZFgsXG4gICAgICAgIGVuZFksXG4gICAgICB9O1xuXG4gICAgICAvLyBGaXJzdCB0cmlnZ2VyIGdlbmVyaWMgc3dpcGUgaGFuZGxlcnNcbiAgICAgIGhhbmRsZXJzLnN3aXBlLmZvckVhY2goKGhhbmRsZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBoYW5kbGVyKHN3aXBlRXZlbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBpbiBzd2lwZSBoYW5kbGVyOlwiLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBUaGVuIHRyaWdnZXIgZGlyZWN0aW9uLXNwZWNpZmljIGhhbmRsZXJzXG4gICAgICBjb25zdCBkaXJlY3Rpb25LZXkgPSBgc3dpcGUke2RpcmVjdGlvbn1gIGFzIGtleW9mIHR5cGVvZiBoYW5kbGVycztcbiAgICAgIGhhbmRsZXJzW2RpcmVjdGlvbktleV0uZm9yRWFjaCgoaGFuZGxlcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGhhbmRsZXIoeyAuLi5zd2lwZUV2ZW50LCB0eXBlOiBkaXJlY3Rpb25LZXkgfSBhcyBTd2lwZUV2ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBpbiAke2RpcmVjdGlvbktleX0gaGFuZGxlcjpgLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBGb3J3YXJkIHRvIGNvbXBvbmVudCdzIGV2ZW50IHN5c3RlbSBpZiBhdmFpbGFibGVcbiAgICAgIGlmIChoYXNFbWl0KGNvbXBvbmVudCkpIHtcbiAgICAgICAgY29tcG9uZW50LmVtaXQoXCJzd2lwZVwiLCBzd2lwZUV2ZW50KTtcbiAgICAgICAgY29tcG9uZW50LmVtaXQoZGlyZWN0aW9uS2V5LCBzd2lwZUV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgcHJldmVudERlZmF1bHQgaWYgY29uZmlndXJlZFxuICAgICAgaWYgKHByZXZlbnREZWZhdWx0ICYmICFzd2lwZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgc3dpcGVFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2Ugc3RhcnRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVTdGFydCA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgdG91Y2ggPSBcInRvdWNoZXNcIiBpbiBlID8gZS50b3VjaGVzWzBdIDogZTtcblxuICAgICAgc3RhcnRYID0gdG91Y2guY2xpZW50WDtcbiAgICAgIHN0YXJ0WSA9IHRvdWNoLmNsaWVudFk7XG4gICAgICBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgYWN0aXZlID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIGVuZFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUVuZCA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFhY3RpdmUgfHwgIWlzRW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0b3VjaCA9XG4gICAgICAgIFwiY2hhbmdlZFRvdWNoZXNcIiBpbiBlICYmIGUuY2hhbmdlZFRvdWNoZXMubGVuZ3RoID4gMFxuICAgICAgICAgID8gZS5jaGFuZ2VkVG91Y2hlc1swXVxuICAgICAgICAgIDogKGUgYXMgTW91c2VFdmVudCk7XG5cbiAgICAgIGNvbnN0IGVuZFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgY29uc3QgZW5kWSA9IHRvdWNoLmNsaWVudFk7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBzd2lwZSBwcm9wZXJ0aWVzXG4gICAgICBjb25zdCBkZWx0YVggPSBlbmRYIC0gc3RhcnRYO1xuICAgICAgY29uc3QgZGVsdGFZID0gZW5kWSAtIHN0YXJ0WTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG5cbiAgICAgIC8vIENoZWNrIGlmIGl0J3MgYSBzd2lwZVxuICAgICAgaWYgKGRpc3RhbmNlID49IHN3aXBlVGhyZXNob2xkICYmIGR1cmF0aW9uIDw9IHN3aXBlVGltZVRocmVzaG9sZCkge1xuICAgICAgICBkaXNwYXRjaFN3aXBlKGUsIGVuZFgsIGVuZFkpO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIGNhbmNlbFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvLyBFdmVudCBsaXN0ZW5lcnMgZGljdGlvbmFyeVxuICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzOiBSZWNvcmQ8c3RyaW5nLCBFdmVudExpc3RlbmVyPiA9IHtcbiAgICAgIG1vdXNlZG93bjogaGFuZGxlU3RhcnQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNldXA6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2VsZWF2ZTogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaHN0YXJ0OiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hlbmQ6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hjYW5jZWw6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGQgZXZlbnQgbGlzdGVuZXJzIHRvIGVsZW1lbnRcbiAgICAgKi9cbiAgICBjb25zdCBzZXR1cEV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCB7XG4gICAgICAgICAgcGFzc2l2ZTogIXByZXZlbnREZWZhdWx0LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGZyb20gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHJlbW92ZUV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBTZXR1cCBsaXN0ZW5lcnMgaWYgaW5pdGlhbGx5IGVuYWJsZWRcbiAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGxpZmVjeWNsZSBpbnRlZ3JhdGlvblxuICAgIGlmIChoYXNMaWZlY3ljbGUoY29tcG9uZW50KSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95O1xuXG4gICAgICBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuXG4gICAgICAgIC8vIENsZWFyIGhhbmRsZXJzXG4gICAgICAgIE9iamVjdC52YWx1ZXMoaGFuZGxlcnMpLmZvckVhY2goKGhhbmRsZXJTZXQpID0+IGhhbmRsZXJTZXQuY2xlYXIoKSk7XG5cbiAgICAgICAgLy8gQ2FsbCBvcmlnaW5hbCBkZXN0cm95IG1ldGhvZFxuICAgICAgICBvcmlnaW5hbERlc3Ryb3kuY2FsbChjb21wb25lbnQubGlmZWN5Y2xlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG5cbiAgICAgIC8vIEFkZCBoYW5kbGVyIG1ldGhvZHNcbiAgICAgIG9uU3dpcGUoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvblN3aXBlTGVmdChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGVsZWZ0LmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvblN3aXBlUmlnaHQoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlcmlnaHQuYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9uU3dpcGVVcChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGV1cC5hZGQoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb25Td2lwZURvd24oaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlZG93bi5hZGQoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLy8gUmVtb3ZlIGhhbmRsZXIgbWV0aG9kc1xuICAgICAgb2ZmU3dpcGUoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvZmZTd2lwZUxlZnQoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlbGVmdC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb2ZmU3dpcGVSaWdodChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGVyaWdodC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb2ZmU3dpcGVVcChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGV1cC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb2ZmU3dpcGVEb3duKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5zd2lwZWRvd24uZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8vIEVuYWJsZS9kaXNhYmxlIG1ldGhvZHNcbiAgICAgIGVuYWJsZVN3aXBlKCkge1xuICAgICAgICBpZiAoIWlzRW5hYmxlZCkge1xuICAgICAgICAgIGlzRW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgZGlzYWJsZVN3aXBlKCkge1xuICAgICAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICAgICAgaXNFbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbiIsCiAgICAiLy8gc3JjL2NvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlcy9sb25ncHJlc3MudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBBZGRzIGxvbmcgcHJlc3MgZ2VzdHVyZSByZWNvZ25pdGlvbiB0byBjb21wb25lbnRzXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBCYXNlQ29tcG9uZW50LCBFbGVtZW50Q29tcG9uZW50IH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IExvbmdQcmVzc0V2ZW50LCBHZXN0dXJlSGFuZGxlciB9IGZyb20gXCIuLi8uLi8uLi9nZXN0dXJlc1wiO1xuaW1wb3J0IHsgaGFzTGlmZWN5Y2xlLCBoYXNFbWl0IH0gZnJvbSBcIm10cmxcIjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBsb25nIHByZXNzIGdlc3R1cmUgZmVhdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvbmdQcmVzc0dlc3R1cmVDb25maWcge1xuICAvKipcbiAgICogVGltZSAoaW4gbXMpIHRvIHJlY29nbml6ZSBhIGxvbmcgcHJlc3NcbiAgICogQGRlZmF1bHQgNTAwXG4gICAqL1xuICBsb25nUHJlc3NUaW1lPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEaXN0YW5jZSB0aHJlc2hvbGQgKGluIHBpeGVscykgZm9yIG1vdmVtZW50IHRoYXQgY2FuY2VscyBsb25nIHByZXNzXG4gICAqIEBkZWZhdWx0IDEwXG4gICAqL1xuICBtb3ZlVGhyZXNob2xkPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHByZXZlbnQgZGVmYXVsdCBiZWhhdmlvcnMgb24gdG91Y2ggZXZlbnRzXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHByZXZlbnREZWZhdWx0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgbG9uZyBwcmVzcyBnZXN0dXJlXG4gICAqL1xuICBvbkxvbmdQcmVzcz86IEdlc3R1cmVIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBsb25nIHByZXNzIHJlY29nbml0aW9uIGltbWVkaWF0ZWx5XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgd2l0aCBsb25nIHByZXNzIGdlc3R1cmUgcmVjb2duaXRpb24gY2FwYWJpbGl0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9uZ1ByZXNzR2VzdHVyZUNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvKipcbiAgICogQWRkIGEgbG9uZyBwcmVzcyBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvbkxvbmdQcmVzczogKFxuICAgIGhhbmRsZXI6IChldmVudDogTG9uZ1ByZXNzRXZlbnQpID0+IHZvaWRcbiAgKSA9PiBMb25nUHJlc3NHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBsb25nIHByZXNzIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZkxvbmdQcmVzczogKFxuICAgIGhhbmRsZXI6IChldmVudDogTG9uZ1ByZXNzRXZlbnQpID0+IHZvaWRcbiAgKSA9PiBMb25nUHJlc3NHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBFbmFibGUgbG9uZyBwcmVzcyByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBlbmFibGVMb25nUHJlc3M6ICgpID0+IExvbmdQcmVzc0dlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIERpc2FibGUgbG9uZyBwcmVzcyByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBkaXNhYmxlTG9uZ1ByZXNzOiAoKSA9PiBMb25nUHJlc3NHZXN0dXJlQ29tcG9uZW50O1xufVxuXG4vKipcbiAqIEFkZHMgbG9uZyBwcmVzcyBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50LlxuICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IGFsdGVybmF0aXZlIHRvIHRoZSBmdWxsIGdlc3R1cmUgc3lzdGVtLFxuICogZm9jdXNlZCBvbmx5IG9uIGxvbmcgcHJlc3MgZGV0ZWN0aW9uLlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9iamVjdCBjb250YWluaW5nIGxvbmcgcHJlc3Mgc2V0dGluZ3NcbiAqIEByZXR1cm5zIEZ1bmN0aW9uIHRoYXQgZW5oYW5jZXMgYSBjb21wb25lbnQgd2l0aCBsb25nIHByZXNzIGNhcGFiaWxpdGllc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gQWRkIGxvbmcgcHJlc3MgZ2VzdHVyZSByZWNvZ25pdGlvbiB0byBhIGNvbXBvbmVudFxuICogY29uc3QgY29tcG9uZW50ID0gcGlwZShcbiAqICAgY3JlYXRlQmFzZSxcbiAqICAgd2l0aEVsZW1lbnQoLi4uKSxcbiAqICAgd2l0aExvbmdQcmVzc0dlc3R1cmUoe1xuICogICAgIGxvbmdQcmVzc1RpbWU6IDgwMCxcbiAqICAgICBvbkxvbmdQcmVzczogKGUpID0+IHNob3dDb250ZXh0TWVudShlLngsIGUueSlcbiAqICAgfSlcbiAqICkoY29uZmlnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgd2l0aExvbmdQcmVzc0dlc3R1cmUgPVxuICAoY29uZmlnOiBMb25nUHJlc3NHZXN0dXJlQ29uZmlnID0ge30pID0+XG4gIDxDIGV4dGVuZHMgRWxlbWVudENvbXBvbmVudD4oY29tcG9uZW50OiBDKTogQyAmIExvbmdQcmVzc0dlc3R1cmVDb21wb25lbnQgPT4ge1xuICAgIGlmICghY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJDYW5ub3QgYWRkIGxvbmcgcHJlc3MgZ2VzdHVyZSByZWNvZ25pdGlvbjogbWlzc2luZyBlbGVtZW50XCJcbiAgICAgICk7XG4gICAgICByZXR1cm4gY29tcG9uZW50IGFzIEMgJiBMb25nUHJlc3NHZXN0dXJlQ29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIGxvbmdQcmVzc1RpbWUgPSA1MDAsXG4gICAgICBtb3ZlVGhyZXNob2xkID0gMTAsXG4gICAgICBwcmV2ZW50RGVmYXVsdCA9IHRydWUsXG4gICAgICBvbkxvbmdQcmVzcyxcbiAgICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBFdmVudCBoYW5kbGVycyBzdG9yYWdlXG4gICAgY29uc3QgaGFuZGxlcnM6IFNldDwoZXZlbnQ6IExvbmdQcmVzc0V2ZW50KSA9PiB2b2lkPiA9IG5ldyBTZXQoKTtcblxuICAgIC8vIElmIGluaXRpYWwgaGFuZGxlciBwcm92aWRlZCwgYWRkIGl0XG4gICAgaWYgKG9uTG9uZ1ByZXNzKSB7XG4gICAgICBoYW5kbGVycy5hZGQob25Mb25nUHJlc3MgYXMgKGV2ZW50OiBMb25nUHJlc3NFdmVudCkgPT4gdm9pZCk7XG4gICAgfVxuXG4gICAgLy8gR2VzdHVyZSBzdGF0ZSBmb3IgdHJhY2tpbmdcbiAgICBsZXQgc3RhcnRYID0gMDtcbiAgICBsZXQgc3RhcnRZID0gMDtcbiAgICBsZXQgY3VycmVudFggPSAwO1xuICAgIGxldCBjdXJyZW50WSA9IDA7XG4gICAgbGV0IGFjdGl2ZSA9IGZhbHNlO1xuICAgIGxldCBzdGFydFRpbWUgPSAwO1xuICAgIGxldCBsb25nUHJlc3NUaW1lcjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGlzRW5hYmxlZCA9IGVuYWJsZWQ7XG5cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaCBhIGxvbmcgcHJlc3MgZXZlbnQgdG8gYWxsIGhhbmRsZXJzXG4gICAgICovXG4gICAgY29uc3QgZGlzcGF0Y2hMb25nUHJlc3MgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIC8vIENyZWF0ZSB0aGUgbG9uZyBwcmVzcyBldmVudFxuICAgICAgY29uc3QgbG9uZ1ByZXNzRXZlbnQ6IExvbmdQcmVzc0V2ZW50ID0ge1xuICAgICAgICB0eXBlOiBcImxvbmdwcmVzc1wiLFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICB0YXJnZXQ6IGUudGFyZ2V0ISxcbiAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICBlbmRUaW1lOiBEYXRlLm5vdygpLFxuICAgICAgICBkdXJhdGlvbjogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSxcbiAgICAgICAgZGVmYXVsdFByZXZlbnRlZDogZmFsc2UsXG4gICAgICAgIHByZXZlbnREZWZhdWx0OiAoKSA9PiB7XG4gICAgICAgICAgbG9uZ1ByZXNzRXZlbnQuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSxcbiAgICAgICAgeDogY3VycmVudFgsXG4gICAgICAgIHk6IGN1cnJlbnRZLFxuICAgICAgfTtcblxuICAgICAgLy8gQ2FsbCBlYWNoIGhhbmRsZXJcbiAgICAgIGhhbmRsZXJzLmZvckVhY2goKGhhbmRsZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBoYW5kbGVyKGxvbmdQcmVzc0V2ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgaW4gbG9uZyBwcmVzcyBoYW5kbGVyOlwiLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBGb3J3YXJkIHRvIGNvbXBvbmVudCdzIGV2ZW50IHN5c3RlbSBpZiBhdmFpbGFibGVcbiAgICAgIGlmIChoYXNFbWl0KGNvbXBvbmVudCkpIHtcbiAgICAgICAgY29tcG9uZW50LmVtaXQoXCJsb25ncHJlc3NcIiwgbG9uZ1ByZXNzRXZlbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBwcmV2ZW50RGVmYXVsdCBpZiBjb25maWd1cmVkXG4gICAgICBpZiAocHJldmVudERlZmF1bHQgJiYgIWxvbmdQcmVzc0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgbG9uZ1ByZXNzRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIHN0YXJ0XG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlU3RhcnQgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRvdWNoID0gXCJ0b3VjaGVzXCIgaW4gZSA/IGUudG91Y2hlc1swXSA6IGU7XG5cbiAgICAgIHN0YXJ0WCA9IGN1cnJlbnRYID0gdG91Y2guY2xpZW50WDtcbiAgICAgIHN0YXJ0WSA9IGN1cnJlbnRZID0gdG91Y2guY2xpZW50WTtcbiAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBhY3RpdmUgPSB0cnVlO1xuXG4gICAgICAvLyBDYW5jZWwgYW55IGV4aXN0aW5nIHRpbWVyXG4gICAgICBpZiAobG9uZ1ByZXNzVGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB1cCBsb25nIHByZXNzIHRpbWVyXG4gICAgICBsb25nUHJlc3NUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICAgIC8vIENoZWNrIGlmIG1vdmVtZW50IHdhcyB3aXRoaW4gdGhyZXNob2xkXG4gICAgICAgICAgY29uc3QgZGVsdGFYID0gY3VycmVudFggLSBzdGFydFg7XG4gICAgICAgICAgY29uc3QgZGVsdGFZID0gY3VycmVudFkgLSBzdGFydFk7XG4gICAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcblxuICAgICAgICAgIGlmIChkaXN0YW5jZSA8IG1vdmVUaHJlc2hvbGQpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoTG9uZ1ByZXNzKGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxvbmdQcmVzc1RpbWVyID0gbnVsbDtcbiAgICAgIH0sIGxvbmdQcmVzc1RpbWUpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgbW92ZVxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZU1vdmUgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghYWN0aXZlIHx8ICFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgdG91Y2ggPSBcInRvdWNoZXNcIiBpbiBlID8gZS50b3VjaGVzWzBdIDogZTtcblxuICAgICAgY3VycmVudFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuXG4gICAgICAvLyBDaGVjayBpZiBtb3ZlbWVudCBleGNlZWRzIHRocmVzaG9sZFxuICAgICAgY29uc3QgZGVsdGFYID0gY3VycmVudFggLSBzdGFydFg7XG4gICAgICBjb25zdCBkZWx0YVkgPSBjdXJyZW50WSAtIHN0YXJ0WTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG5cbiAgICAgIGlmIChkaXN0YW5jZSA+IG1vdmVUaHJlc2hvbGQpIHtcbiAgICAgICAgLy8gQ2FuY2VsIGxvbmcgcHJlc3MgaWYgbW92ZWQgdG9vIG11Y2hcbiAgICAgICAgaWYgKGxvbmdQcmVzc1RpbWVyICE9PSBudWxsKSB7XG4gICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICAgICAgbG9uZ1ByZXNzVGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBlbmRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVFbmQgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAobG9uZ1ByZXNzVGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICAgIGxvbmdQcmVzc1RpbWVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBjYW5jZWxcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVDYW5jZWwgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAobG9uZ1ByZXNzVGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICAgIGxvbmdQcmVzc1RpbWVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8vIEV2ZW50IGxpc3RlbmVycyBkaWN0aW9uYXJ5XG4gICAgY29uc3QgZXZlbnRMaXN0ZW5lcnM6IFJlY29yZDxzdHJpbmcsIEV2ZW50TGlzdGVuZXI+ID0ge1xuICAgICAgbW91c2Vkb3duOiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2Vtb3ZlOiBoYW5kbGVNb3ZlIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICBtb3VzZXVwOiBoYW5kbGVFbmQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNlbGVhdmU6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hzdGFydDogaGFuZGxlU3RhcnQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNobW92ZTogaGFuZGxlTW92ZSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hlbmQ6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hjYW5jZWw6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGQgZXZlbnQgbGlzdGVuZXJzIHRvIGVsZW1lbnRcbiAgICAgKi9cbiAgICBjb25zdCBzZXR1cEV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCB7XG4gICAgICAgICAgcGFzc2l2ZTogIXByZXZlbnREZWZhdWx0LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGZyb20gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHJlbW92ZUV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBTZXR1cCBsaXN0ZW5lcnMgaWYgaW5pdGlhbGx5IGVuYWJsZWRcbiAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGxpZmVjeWNsZSBpbnRlZ3JhdGlvblxuICAgIGlmIChoYXNMaWZlY3ljbGUoY29tcG9uZW50KSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95O1xuXG4gICAgICBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuXG4gICAgICAgIC8vIENsZWFyIGFueSB0aW1lcnNcbiAgICAgICAgaWYgKGxvbmdQcmVzc1RpbWVyICE9PSBudWxsKSB7XG4gICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICAgICAgbG9uZ1ByZXNzVGltZXIgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgaGFuZGxlcnNcbiAgICAgICAgaGFuZGxlcnMuY2xlYXIoKTtcblxuICAgICAgICAvLyBDYWxsIG9yaWdpbmFsIGRlc3Ryb3kgbWV0aG9kXG4gICAgICAgIG9yaWdpbmFsRGVzdHJveS5jYWxsKGNvbXBvbmVudC5saWZlY3ljbGUpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcblxuICAgICAgLyoqXG4gICAgICAgKiBBZGQgYSBsb25nIHByZXNzIGV2ZW50IGhhbmRsZXJcbiAgICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgICAgICovXG4gICAgICBvbkxvbmdQcmVzcyhoYW5kbGVyOiAoZXZlbnQ6IExvbmdQcmVzc0V2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBhIGxvbmcgcHJlc3MgZXZlbnQgaGFuZGxlclxuICAgICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIG9mZkxvbmdQcmVzcyhoYW5kbGVyOiAoZXZlbnQ6IExvbmdQcmVzc0V2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEVuYWJsZSBsb25nIHByZXNzIHJlY29nbml0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZUxvbmdQcmVzcygpIHtcbiAgICAgICAgaWYgKCFpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZSBsb25nIHByZXNzIHJlY29nbml0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVMb25nUHJlc3MoKSB7XG4gICAgICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuXG4gICAgICAgICAgLy8gQ2xlYXIgYW55IHRpbWVyc1xuICAgICAgICAgIGlmIChsb25nUHJlc3NUaW1lciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICAgICAgICBsb25nUHJlc3NUaW1lciA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvLyBzcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3Bhbi50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIEFkZHMgcGFuIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gY29tcG9uZW50c1xuICovXG5cbmltcG9ydCB0eXBlIHsgQmFzZUNvbXBvbmVudCwgRWxlbWVudENvbXBvbmVudCB9IGZyb20gXCJtdHJsXCI7XG5pbXBvcnQgeyBQYW5FdmVudCwgR2VzdHVyZUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vLi4vZ2VzdHVyZXNcIjtcbmltcG9ydCB7IGhhc0xpZmVjeWNsZSwgaGFzRW1pdCB9IGZyb20gXCJtdHJsXCI7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgcGFuIGdlc3R1cmUgZmVhdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhbkdlc3R1cmVDb25maWcge1xuICAvKipcbiAgICogV2hldGhlciB0byBwcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3JzIG9uIHRvdWNoIGV2ZW50c1xuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBwcmV2ZW50RGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIHBhbiBzdGFydCAoZmlyc3QgbW92ZW1lbnQpXG4gICAqL1xuICBvblBhblN0YXJ0PzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIHBhbiBtb3ZlIChjb250aW51b3VzIHVwZGF0ZXMgZHVyaW5nIHBhbilcbiAgICovXG4gIG9uUGFuPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIHBhbiBlbmQgKHRvdWNoL21vdXNlIHJlbGVhc2UpXG4gICAqL1xuICBvblBhbkVuZD86IEdlc3R1cmVIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBwYW4gcmVjb2duaXRpb24gaW1tZWRpYXRlbHlcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vKipcbiAqIEV4dGVuZCB0aGUgUGFuRXZlbnQgaW50ZXJmYWNlIHRvIHN1cHBvcnQgb3VyIGN1c3RvbSBldmVudCB0eXBlc1xuICovXG5pbnRlcmZhY2UgRXh0ZW5kZWRQYW5FdmVudCBleHRlbmRzIE9taXQ8UGFuRXZlbnQsIFwidHlwZVwiPiB7XG4gIHR5cGU6IFwicGFuXCIgfCBcInBhbnN0YXJ0XCIgfCBcInBhbmVuZFwiO1xufVxuXG4vKipcbiAqIENvbXBvbmVudCB3aXRoIHBhbiBnZXN0dXJlIHJlY29nbml0aW9uIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhbkdlc3R1cmVDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgZm9yIHBhbiBzdGFydFxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb25QYW5TdGFydDogKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpID0+IFBhbkdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgZm9yIHBhbiBtb3ZlIChjb250aW51b3VzIHVwZGF0ZXMpXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblBhbjogKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpID0+IFBhbkdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgZm9yIHBhbiBlbmRcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uUGFuRW5kOiAoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgcGFuIHN0YXJ0IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlBhblN0YXJ0OiAoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgcGFuIG1vdmUgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmUGFuOiAoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgcGFuIGVuZCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZQYW5FbmQ6IChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSA9PiBQYW5HZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBFbmFibGUgcGFuIHJlY29nbml0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGVuYWJsZVBhbjogKCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogRGlzYWJsZSBwYW4gcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZGlzYWJsZVBhbjogKCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBBZGRzIHBhbiBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50LlxuICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IGFsdGVybmF0aXZlIHRvIHRoZSBmdWxsIGdlc3R1cmUgc3lzdGVtLFxuICogZm9jdXNlZCBvbmx5IG9uIHBhbiBkZXRlY3Rpb24uXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0IGNvbnRhaW5pbmcgcGFuIHNldHRpbmdzXG4gKiBAcmV0dXJucyBGdW5jdGlvbiB0aGF0IGVuaGFuY2VzIGEgY29tcG9uZW50IHdpdGggcGFuIGNhcGFiaWxpdGllc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gQWRkIHBhbiBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50XG4gKiBjb25zdCBjb21wb25lbnQgPSBwaXBlKFxuICogICBjcmVhdGVCYXNlLFxuICogICB3aXRoRWxlbWVudCguLi4pLFxuICogICB3aXRoUGFuR2VzdHVyZSh7XG4gKiAgICAgb25QYW5TdGFydDogKGUpID0+IHN0YXJ0RHJhZyhlKSxcbiAqICAgICBvblBhbjogKGUpID0+IHVwZGF0ZURyYWdQb3NpdGlvbihlKSxcbiAqICAgICBvblBhbkVuZDogKGUpID0+IGVuZERyYWcoZSlcbiAqICAgfSlcbiAqICkoY29uZmlnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgd2l0aFBhbkdlc3R1cmUgPVxuICAoY29uZmlnOiBQYW5HZXN0dXJlQ29uZmlnID0ge30pID0+XG4gIDxDIGV4dGVuZHMgRWxlbWVudENvbXBvbmVudD4oY29tcG9uZW50OiBDKTogQyAmIFBhbkdlc3R1cmVDb21wb25lbnQgPT4ge1xuICAgIGlmICghY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkNhbm5vdCBhZGQgcGFuIGdlc3R1cmUgcmVjb2duaXRpb246IG1pc3NpbmcgZWxlbWVudFwiKTtcbiAgICAgIHJldHVybiBjb21wb25lbnQgYXMgQyAmIFBhbkdlc3R1cmVDb21wb25lbnQ7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCBjb25maWd1cmF0aW9uXG4gICAgY29uc3Qge1xuICAgICAgcHJldmVudERlZmF1bHQgPSB0cnVlLFxuICAgICAgb25QYW5TdGFydCxcbiAgICAgIG9uUGFuLFxuICAgICAgb25QYW5FbmQsXG4gICAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gRXZlbnQgaGFuZGxlcnMgc3RvcmFnZSBieSBwYW4gcGhhc2VcbiAgICBjb25zdCBoYW5kbGVycyA9IHtcbiAgICAgIHBhbnN0YXJ0OiBuZXcgU2V0PChldmVudDogUGFuRXZlbnQpID0+IHZvaWQ+KCksXG4gICAgICBwYW46IG5ldyBTZXQ8KGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZD4oKSxcbiAgICAgIHBhbmVuZDogbmV3IFNldDwoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkPigpLFxuICAgIH07XG5cbiAgICAvLyBBZGQgaW5pdGlhbCBoYW5kbGVycyBpZiBwcm92aWRlZFxuICAgIGlmIChvblBhblN0YXJ0KVxuICAgICAgaGFuZGxlcnMucGFuc3RhcnQuYWRkKG9uUGFuU3RhcnQgYXMgKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCk7XG4gICAgaWYgKG9uUGFuKSBoYW5kbGVycy5wYW4uYWRkKG9uUGFuIGFzIChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpO1xuICAgIGlmIChvblBhbkVuZCkgaGFuZGxlcnMucGFuZW5kLmFkZChvblBhbkVuZCBhcyAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKTtcblxuICAgIC8vIEdlc3R1cmUgc3RhdGUgZm9yIHRyYWNraW5nXG4gICAgbGV0IHN0YXJ0WCA9IDA7XG4gICAgbGV0IHN0YXJ0WSA9IDA7XG4gICAgbGV0IGxhc3RYID0gMDtcbiAgICBsZXQgbGFzdFkgPSAwO1xuICAgIGxldCBjdXJyZW50WCA9IDA7XG4gICAgbGV0IGN1cnJlbnRZID0gMDtcbiAgICBsZXQgYWN0aXZlID0gZmFsc2U7XG4gICAgbGV0IGlzUGFubmluZyA9IGZhbHNlO1xuICAgIGxldCBzdGFydFRpbWUgPSAwO1xuICAgIGxldCBpc0VuYWJsZWQgPSBlbmFibGVkO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgcGFuIGV2ZW50IHdpdGggdGhlIGN1cnJlbnQgc3RhdGVcbiAgICAgKi9cbiAgICBjb25zdCBjcmVhdGVQYW5FdmVudCA9IChcbiAgICAgIGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50LFxuICAgICAgdHlwZTogXCJwYW5zdGFydFwiIHwgXCJwYW5cIiB8IFwicGFuZW5kXCJcbiAgICApOiBFeHRlbmRlZFBhbkV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IGV2ZW50OiBFeHRlbmRlZFBhbkV2ZW50ID0ge1xuICAgICAgICB0eXBlLFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICB0YXJnZXQ6IGUudGFyZ2V0ISxcbiAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICBlbmRUaW1lOiBEYXRlLm5vdygpLFxuICAgICAgICBkdXJhdGlvbjogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSxcbiAgICAgICAgZGVmYXVsdFByZXZlbnRlZDogZmFsc2UsXG4gICAgICAgIHByZXZlbnREZWZhdWx0OiAoKSA9PiB7XG4gICAgICAgICAgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGVsdGFYOiBjdXJyZW50WCAtIHN0YXJ0WCxcbiAgICAgICAgZGVsdGFZOiBjdXJyZW50WSAtIHN0YXJ0WSxcbiAgICAgICAgc3RhcnRYLFxuICAgICAgICBzdGFydFksXG4gICAgICAgIGN1cnJlbnRYLFxuICAgICAgICBjdXJyZW50WSxcbiAgICAgIH07XG4gICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERpc3BhdGNoIGEgcGFuIGV2ZW50IHRvIGFsbCByZWdpc3RlcmVkIGhhbmRsZXJzXG4gICAgICovXG4gICAgY29uc3QgZGlzcGF0Y2hQYW4gPSAoXG4gICAgICBlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCxcbiAgICAgIHR5cGU6IFwicGFuc3RhcnRcIiB8IFwicGFuXCIgfCBcInBhbmVuZFwiXG4gICAgKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBleHRlbmRlZFBhbkV2ZW50ID0gY3JlYXRlUGFuRXZlbnQoZSwgdHlwZSk7XG5cbiAgICAgIC8vIENhbGwgZWFjaCBoYW5kbGVyIGZvciB0aGlzIHBoYXNlXG4gICAgICBoYW5kbGVyc1t0eXBlXS5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVHlwZSBhc3NlcnRpb24gZm9yIHRoZSBoYW5kbGVyIGNhbGwgLSB3ZSdyZSBkZWxpYmVyYXRlbHkgcGFzc2luZyBvdXIgZXh0ZW5kZWQgZXZlbnRcbiAgICAgICAgICBoYW5kbGVyKGV4dGVuZGVkUGFuRXZlbnQgYXMgdW5rbm93biBhcyBQYW5FdmVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgaW4gJHt0eXBlfSBoYW5kbGVyOmAsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEZvcndhcmQgdG8gY29tcG9uZW50J3MgZXZlbnQgc3lzdGVtIGlmIGF2YWlsYWJsZVxuICAgICAgaWYgKGhhc0VtaXQoY29tcG9uZW50KSkge1xuICAgICAgICBjb21wb25lbnQuZW1pdCh0eXBlLCBleHRlbmRlZFBhbkV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgcHJldmVudERlZmF1bHQgaWYgY29uZmlndXJlZFxuICAgICAgaWYgKHByZXZlbnREZWZhdWx0ICYmICFleHRlbmRlZFBhbkV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgZXh0ZW5kZWRQYW5FdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2Ugc3RhcnRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVTdGFydCA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgdG91Y2ggPSBcInRvdWNoZXNcIiBpbiBlID8gZS50b3VjaGVzWzBdIDogZTtcblxuICAgICAgc3RhcnRYID0gbGFzdFggPSBjdXJyZW50WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgICBzdGFydFkgPSBsYXN0WSA9IGN1cnJlbnRZID0gdG91Y2guY2xpZW50WTtcbiAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBhY3RpdmUgPSB0cnVlO1xuICAgICAgaXNQYW5uaW5nID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBtb3ZlXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlTW92ZSA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFhY3RpdmUgfHwgIWlzRW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0b3VjaCA9IFwidG91Y2hlc1wiIGluIGUgPyBlLnRvdWNoZXNbMF0gOiBlO1xuXG4gICAgICAvLyBVcGRhdGUgcG9zaXRpb25cbiAgICAgIGxhc3RYID0gY3VycmVudFg7XG4gICAgICBsYXN0WSA9IGN1cnJlbnRZO1xuICAgICAgY3VycmVudFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgbW92ZW1lbnQgZGVsdGFcbiAgICAgIGNvbnN0IG1vdmVEZWx0YVggPSBjdXJyZW50WCAtIGxhc3RYO1xuICAgICAgY29uc3QgbW92ZURlbHRhWSA9IGN1cnJlbnRZIC0gbGFzdFk7XG4gICAgICBjb25zdCBtb3ZlRGVsdGEgPSBNYXRoLnNxcnQoXG4gICAgICAgIG1vdmVEZWx0YVggKiBtb3ZlRGVsdGFYICsgbW92ZURlbHRhWSAqIG1vdmVEZWx0YVlcbiAgICAgICk7XG5cbiAgICAgIC8vIERldGVjdCBzaWduaWZpY2FudCBtb3ZlbWVudFxuICAgICAgaWYgKG1vdmVEZWx0YSA+IDApIHtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3Qgc2lnbmlmaWNhbnQgbW92ZW1lbnQsIHRyaWdnZXIgcGFuc3RhcnRcbiAgICAgICAgaWYgKCFpc1Bhbm5pbmcpIHtcbiAgICAgICAgICBpc1Bhbm5pbmcgPSB0cnVlO1xuICAgICAgICAgIGRpc3BhdGNoUGFuKGUsIFwicGFuc3RhcnRcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGVuIHRyaWdnZXIgdGhlIGNvbnRpbnVvdXMgcGFuIGV2ZW50XG4gICAgICAgIGRpc3BhdGNoUGFuKGUsIFwicGFuXCIpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgZW5kXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlRW5kID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWFjdGl2ZSB8fCAhaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIC8vIElmIHdlIHdlcmUgcGFubmluZywgdHJpZ2dlciB0aGUgcGFuZW5kIGV2ZW50XG4gICAgICBpZiAoaXNQYW5uaW5nKSB7XG4gICAgICAgIGRpc3BhdGNoUGFuKGUsIFwicGFuZW5kXCIpO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICAgIGlzUGFubmluZyA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgY2FuY2VsXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWFjdGl2ZSB8fCAhaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIC8vIElmIHdlIHdlcmUgcGFubmluZywgdHJpZ2dlciB0aGUgcGFuZW5kIGV2ZW50XG4gICAgICBpZiAoaXNQYW5uaW5nKSB7XG4gICAgICAgIGRpc3BhdGNoUGFuKGUsIFwicGFuZW5kXCIpO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICAgIGlzUGFubmluZyA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvLyBFdmVudCBsaXN0ZW5lcnMgZGljdGlvbmFyeVxuICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzOiBSZWNvcmQ8c3RyaW5nLCBFdmVudExpc3RlbmVyPiA9IHtcbiAgICAgIG1vdXNlZG93bjogaGFuZGxlU3RhcnQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNlbW92ZTogaGFuZGxlTW92ZSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2V1cDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICBtb3VzZWxlYXZlOiBoYW5kbGVDYW5jZWwgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNoc3RhcnQ6IGhhbmRsZVN0YXJ0IGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaG1vdmU6IGhhbmRsZU1vdmUgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNoZW5kOiBoYW5kbGVFbmQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNoY2FuY2VsOiBoYW5kbGVDYW5jZWwgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQWRkIGV2ZW50IGxpc3RlbmVycyB0byBlbGVtZW50XG4gICAgICovXG4gICAgY29uc3Qgc2V0dXBFdmVudExpc3RlbmVycyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKGV2ZW50TGlzdGVuZXJzKS5mb3JFYWNoKChbZXZlbnQsIGxpc3RlbmVyXSkgPT4ge1xuICAgICAgICBjb21wb25lbnQuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lciwge1xuICAgICAgICAgIHBhc3NpdmU6ICFwcmV2ZW50RGVmYXVsdCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGV2ZW50IGxpc3RlbmVycyBmcm9tIGVsZW1lbnRcbiAgICAgKi9cbiAgICBjb25zdCByZW1vdmVFdmVudExpc3RlbmVycyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKGV2ZW50TGlzdGVuZXJzKS5mb3JFYWNoKChbZXZlbnQsIGxpc3RlbmVyXSkgPT4ge1xuICAgICAgICBjb21wb25lbnQuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gU2V0dXAgbGlzdGVuZXJzIGlmIGluaXRpYWxseSBlbmFibGVkXG4gICAgaWYgKGlzRW5hYmxlZCkge1xuICAgICAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBsaWZlY3ljbGUgaW50ZWdyYXRpb25cbiAgICBpZiAoaGFzTGlmZWN5Y2xlKGNvbXBvbmVudCkpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IGNvbXBvbmVudC5saWZlY3ljbGUuZGVzdHJveTtcblxuICAgICAgY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAvLyBDbGVhbiB1cCBldmVudCBsaXN0ZW5lcnNcbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcblxuICAgICAgICAvLyBDbGVhciBoYW5kbGVyc1xuICAgICAgICBPYmplY3QudmFsdWVzKGhhbmRsZXJzKS5mb3JFYWNoKChoYW5kbGVyU2V0KSA9PiBoYW5kbGVyU2V0LmNsZWFyKCkpO1xuXG4gICAgICAgIC8vIENhbGwgb3JpZ2luYWwgZGVzdHJveSBtZXRob2RcbiAgICAgICAgb3JpZ2luYWxEZXN0cm95LmNhbGwoY29tcG9uZW50LmxpZmVjeWNsZSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBlbmhhbmNlZCBjb21wb25lbnRcbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tcG9uZW50LFxuXG4gICAgICAvLyBBZGQgaGFuZGxlciBtZXRob2RzXG4gICAgICBvblBhblN0YXJ0KGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMucGFuc3RhcnQuYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9uUGFuKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMucGFuLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvblBhbkVuZChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnBhbmVuZC5hZGQoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLy8gUmVtb3ZlIGhhbmRsZXIgbWV0aG9kc1xuICAgICAgb2ZmUGFuU3RhcnQoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5wYW5zdGFydC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb2ZmUGFuKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMucGFuLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvZmZQYW5FbmQoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5wYW5lbmQuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8vIEVuYWJsZS9kaXNhYmxlIG1ldGhvZHNcbiAgICAgIGVuYWJsZVBhbigpIHtcbiAgICAgICAgaWYgKCFpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIGRpc2FibGVQYW4oKSB7XG4gICAgICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvKipcbiAqIEBtb2R1bGUgY29yZS9sYXlvdXQvc2NoZW1hXG4gKiBAZGVzY3JpcHRpb24gVW5pZmllZCBsYXlvdXQgc2NoZW1hIHByb2Nlc3NvciB3aXRoIGludGVncmF0ZWQgb3B0aW1pemF0aW9uc1xuICogQ29uc29saWRhdGVzIGFycmF5LCBvYmplY3QsIEpTWCwgYW5kIHRlbXBsYXRlIHByb2Nlc3Npbmcgd2l0aCBidWlsdC1pbiBwZXJmb3JtYW5jZSBlbmhhbmNlbWVudHNcbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUWVBFUyAoRXNzZW50aWFsIG9ubHkpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0Q29uZmlnIHtcbiAgLyoqIEJhc2UgbGF5b3V0IHR5cGUgKi9cbiAgdHlwZT86IFwic3RhY2tcIiB8IFwicm93XCIgfCBcImdyaWRcIiB8IHN0cmluZztcbiAgLyoqIFNwYWNpbmcgYmV0d2VlbiBlbGVtZW50cyAqL1xuICBnYXA/OiBudW1iZXIgfCBzdHJpbmc7XG4gIC8qKiBBZGRpdGlvbmFsIENTUyBjbGFzc2VzICovXG4gIGNsYXNzPzogc3RyaW5nO1xuICAvKiogQWxpZ25tZW50IG9mIGl0ZW1zIGFsb25nIHRoZSBjcm9zcyBheGlzICovXG4gIGFsaWduPzogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgfCBcInN0cmV0Y2hcIjtcbiAgLyoqIEFsaWdubWVudCBvZiBpdGVtcyBhbG9uZyB0aGUgbWFpbiBheGlzICovXG4gIGp1c3RpZnk/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiB8IFwiYmV0d2VlblwiIHwgXCJhcm91bmRcIiB8IFwiZXZlbmx5XCI7XG4gIC8qKiBXaGV0aGVyIGFuZCBob3cgaXRlbXMgc2hvdWxkIHdyYXAgKi9cbiAgd3JhcD86IGJvb2xlYW4gfCBcInJldmVyc2VcIiB8IFwibm93cmFwXCI7XG4gIC8qKiBXaGV0aGVyIHJvdyBpdGVtcyBzaG91bGQgc3RhY2sgdmVydGljYWxseSBvbiBtb2JpbGUgKi9cbiAgbW9iaWxlU3RhY2s/OiBib29sZWFuO1xuICAvKiogV2hldGhlciByb3cgaXRlbXMgc2hvdWxkIHNjcm9sbCBob3Jpem9udGFsbHkgb24gbW9iaWxlICovXG4gIG1vYmlsZVNjcm9sbD86IGJvb2xlYW47XG4gIC8qKiBOdW1iZXIgb2YgY29sdW1ucyBvciBhdXRvbWF0aWMgc2l6aW5nIG1ldGhvZCAqL1xuICBjb2x1bW5zPzogbnVtYmVyIHwgXCJhdXRvLWZpdFwiIHwgXCJhdXRvLWZpbGxcIjtcbiAgLyoqIFdoZXRoZXIgdG8gdXNlIGRlbnNlIHBhY2tpbmcgYWxnb3JpdGhtIGZvciBncmlkICovXG4gIGRlbnNlPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgZ3JpZCBpdGVtcyBzaG91bGQgYWRqdXN0IGhlaWdodCBhdXRvbWF0aWNhbGx5ICovXG4gIGF1dG9IZWlnaHQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExheW91dEl0ZW1Db25maWcge1xuICAvKiogQ29sdW1uIHdpZHRoIGluIGEgMTItY29sdW1uIGdyaWQgKi9cbiAgd2lkdGg/OiBudW1iZXI7XG4gIC8qKiBXaWR0aCBvbiBzbWFsbCBzY3JlZW5zICovXG4gIHNtPzogbnVtYmVyO1xuICAvKiogV2lkdGggb24gbWVkaXVtIHNjcmVlbnMgKi9cbiAgbWQ/OiBudW1iZXI7XG4gIC8qKiBXaWR0aCBvbiBsYXJnZSBzY3JlZW5zICovXG4gIGxnPzogbnVtYmVyO1xuICAvKiogV2lkdGggb24gZXh0cmEtbGFyZ2Ugc2NyZWVucyAqL1xuICB4bD86IG51bWJlcjtcbiAgLyoqIE51bWJlciBvZiBncmlkIGNvbHVtbnMgdG8gc3BhbiAqL1xuICBzcGFuPzogbnVtYmVyO1xuICAvKiogTnVtYmVyIG9mIGdyaWQgcm93cyB0byBzcGFuICovXG4gIHJvd1NwYW4/OiBudW1iZXI7XG4gIC8qKiBEaXNwbGF5IG9yZGVyICovXG4gIG9yZGVyPzogbnVtYmVyIHwgXCJmaXJzdFwiIHwgXCJsYXN0XCI7XG4gIC8qKiBTZWxmLWFsaWdubWVudCB3aXRoaW4gY29udGFpbmVyICovXG4gIGFsaWduPzogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgfCBcInN0cmV0Y2hcIjtcbiAgLyoqIFdoZXRoZXIgaXRlbSBzaG91bGQgYXV0b21hdGljYWxseSBzaXplICovXG4gIGF1dG8/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExheW91dE9wdGlvbnMge1xuICAvKiogRGVmYXVsdCBjcmVhdG9yIGZ1bmN0aW9uIHRvIHVzZSBpZiBub3Qgc3BlY2lmaWVkIGluIHNjaGVtYSAqL1xuICBjcmVhdG9yPzogRnVuY3Rpb247XG4gIC8qKiBXaGV0aGVyIHRvIGFwcGx5IENTUyBjbGFzcyBwcmVmaXggQGRlZmF1bHQgdHJ1ZSAqL1xuICBwcmVmaXg/OiBib29sZWFuO1xuICAvKiogQWRkaXRpb25hbCBvcHRpb25zICovXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMYXlvdXRSZXN1bHQge1xuICAvKiogVGhlIHJhdyBsYXlvdXQgb2JqZWN0IHdpdGggYWxsIGNvbXBvbmVudHMgKi9cbiAgbGF5b3V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAvKiogUmVmZXJlbmNlIHRvIHRoZSByb290IGVsZW1lbnQgZm9yIGNvbnZlbmllbmNlICovXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgYW55O1xuICAvKiogRmxhdHRlbmVkIGNvbXBvbmVudCBtYXAgKi9cbiAgY29tcG9uZW50OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAvKiogR2V0cyBhIGNvbXBvbmVudCBieSBuYW1lICovXG4gIGdldChuYW1lOiBzdHJpbmcpOiBhbnk7XG4gIC8qKiBHZXRzIGFsbCBjb21wb25lbnRzIGluIGEgZmxhdHRlbmVkIG1hcCAqL1xuICBnZXRBbGwoKTogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgLyoqIERlc3Ryb3lzIHRoZSBsYXlvdXQsIGNsZWFuaW5nIHVwIGFsbCBjb21wb25lbnRzICovXG4gIGRlc3Ryb3koKTogdm9pZDtcbn1cblxudHlwZSBDb21wb25lbnRMaWtlID0geyBlbGVtZW50OiBIVE1MRWxlbWVudDsgW2tleTogc3RyaW5nXTogYW55IH07XG50eXBlIFNjaGVtYUl0ZW0gPSBGdW5jdGlvbiB8IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIGFueT4gfCBTY2hlbWFJdGVtW107XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJVSUxULUlOIE9QVElNSVpBVElPTlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBGcmFnbWVudCBQb29sIGZvciBlZmZpY2llbnQgRG9jdW1lbnRGcmFnbWVudCByZXVzZVxuICogUmVkdWNlcyBHQyBwcmVzc3VyZSBpbiBoaWdoLWZyZXF1ZW5jeSBsYXlvdXQgY3JlYXRpb24gc2NlbmFyaW9zXG4gKi9cbmNsYXNzIEZyYWdtZW50UG9vbCB7XG4gIHByaXZhdGUgcG9vbDogRG9jdW1lbnRGcmFnbWVudFtdID0gW107XG4gIHByaXZhdGUgbWF4U2l6ZSA9IDg7IC8vIE9wdGltaXplZCBzaXplIGZvciBtZW1vcnkgZWZmaWNpZW5jeVxuXG4gIGdldCgpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICByZXR1cm4gdGhpcy5wb29sLnBvcCgpIHx8IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgfVxuXG4gIHJlbGVhc2UoZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wb29sLmxlbmd0aCA8IHRoaXMubWF4U2l6ZSAmJiBmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5wb29sLnB1c2goZnJhZ21lbnQpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMucG9vbC5sZW5ndGggPSAwO1xuICB9XG59XG5cbmNvbnN0IGZyYWdtZW50UG9vbCA9IG5ldyBGcmFnbWVudFBvb2woKTtcblxuLyoqXG4gKiBDbGFzcyBuYW1lIGNhY2hlIGZvciBsYXlvdXQgY29uZmlndXJhdGlvbnNcbiAqIFJlZHVjZXMgc3RyaW5nIG9wZXJhdGlvbnMgYnkgY2FjaGluZyBnZW5lcmF0ZWQgY2xhc3MgbmFtZXNcbiAqL1xuY29uc3QgY2xhc3NDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbi8vIENvbmZpZ3VyYXRpb24gY29uc3RhbnRzXG5jb25zdCBQUkVGSVggPSBcIm10cmxcIjsgLy8gVE9ETzogTWFrZSB0aGlzIGNvbmZpZ3VyYWJsZVxuY29uc3QgUFJFRklYX1dJVEhfREFTSCA9IGAke1BSRUZJWH0tYDtcblxuLyoqXG4gKiBHZXRzIGEgY2FjaGVkIGNsYXNzIG5hbWUgZm9yIGxheW91dCBjb25maWd1cmF0aW9uXG4gKiBPcHRpbWl6ZWQgZm9yIGRpZmZlcmVudCBjbGFzcyBuYW1pbmcgcGF0dGVybnNcbiAqL1xuZnVuY3Rpb24gZ2V0Q2FjaGVkQ2xhc3NOYW1lKFxuICB0eXBlOiBzdHJpbmcsXG4gIHByb3BlcnR5OiBzdHJpbmcsXG4gIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIsXG4pOiBzdHJpbmcge1xuICBjb25zdCBrZXkgPSBgJHt0eXBlfS0ke3Byb3BlcnR5fS0ke3ZhbHVlfWA7XG4gIGlmICghY2xhc3NDYWNoZS5oYXMoa2V5KSkge1xuICAgIGlmICh0eXBlID09PSBcIml0ZW1cIikge1xuICAgICAgY2xhc3NDYWNoZS5zZXQoXG4gICAgICAgIGtleSxcbiAgICAgICAgcHJvcGVydHkgPT09IFwiXCJcbiAgICAgICAgICA/IGBsYXlvdXRfX2l0ZW0tLSR7dmFsdWV9YFxuICAgICAgICAgIDogYGxheW91dF9faXRlbS0tJHtwcm9wZXJ0eX0tJHt2YWx1ZX1gLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yIGxheW91dCBjbGFzc2VzLCBhbGlnbiB1c2VzIGxheW91dC0te3R5cGV9LXt2YWx1ZX1cbiAgICAgIC8vIGJ1dCBqdXN0aWZ5IGFuZCBvdGhlcnMgdXNlIGxheW91dC0te3R5cGV9LXtwcm9wZXJ0eX0te3ZhbHVlfVxuICAgICAgaWYgKHByb3BlcnR5ID09PSBcImFsaWduXCIpIHtcbiAgICAgICAgY2xhc3NDYWNoZS5zZXQoa2V5LCBgbGF5b3V0LS0ke3R5cGV9LSR7dmFsdWV9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGFzc0NhY2hlLnNldChrZXksIGBsYXlvdXQtLSR7dHlwZX0tJHtwcm9wZXJ0eX0tJHt2YWx1ZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNsYXNzQ2FjaGUuZ2V0KGtleSkhO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBPUFRJTUlaRUQgVVRJTElUSUVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgdmFsdWUgaXMgYSBjb21wb25lbnQgb2JqZWN0IChoYXMgYW4gZWxlbWVudCBwcm9wZXJ0eSlcbiAqL1xuZnVuY3Rpb24gaXNDb21wb25lbnQodmFsdWU6IGFueSk6IHZhbHVlIGlzIENvbXBvbmVudExpa2Uge1xuICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIFwiZWxlbWVudFwiIGluIHZhbHVlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkb2N1bWVudCBmcmFnbWVudCB1c2luZyBwb29saW5nIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAqL1xuZnVuY3Rpb24gY3JlYXRlRnJhZ21lbnQoKTogRG9jdW1lbnRGcmFnbWVudCB7XG4gIHJldHVybiBmcmFnbWVudFBvb2wuZ2V0KCk7XG59XG5cbi8qKlxuICogUmVsZWFzZXMgYSBmcmFnbWVudCBiYWNrIHRvIHRoZSBwb29sIGZvciByZXVzZVxuICovXG5mdW5jdGlvbiByZWxlYXNlRnJhZ21lbnQoZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpOiB2b2lkIHtcbiAgZnJhZ21lbnRQb29sLnJlbGVhc2UoZnJhZ21lbnQpO1xufVxuXG4vKipcbiAqIE9wdGltaXplZCBjbGFzcyBwcm9jZXNzaW5nIHdpdGggbWluaW1hbCBzdHJpbmcgb3BlcmF0aW9uc1xuICogSGFuZGxlcyBhcnJheXMsIHN0cmluZ3MsIGNsYXNzTmFtZSBhbGlhc2VzLCBhbmQgcmF3Q2xhc3MgZWZmaWNpZW50bHlcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0NsYXNzTmFtZXMoXG4gIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIHNraXBQcmVmaXggPSBmYWxzZSxcbik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICBpZiAoIW9wdGlvbnMpIHJldHVybiBvcHRpb25zO1xuXG4gIGNvbnN0IGhhc1Jhd0NsYXNzID0gb3B0aW9ucy5yYXdDbGFzcztcbiAgY29uc3QgaGFzUmVndWxhckNsYXNzID0gb3B0aW9ucy5jbGFzcyB8fCBvcHRpb25zLmNsYXNzTmFtZTtcblxuICAvLyBGYXN0IHBhdGg6IG5vIGNsYXNzIHByb3BlcnRpZXMgYXQgYWxsXG4gIGlmICghaGFzUmF3Q2xhc3MgJiYgIWhhc1JlZ3VsYXJDbGFzcykgcmV0dXJuIG9wdGlvbnM7XG5cbiAgLy8gRmFzdCBwYXRoOiBvbmx5IHJhd0NsYXNzIGFuZCBza2lwcGluZyBwcmVmaXggKG1vc3QgY29tbW9uIHJhd0NsYXNzIHNjZW5hcmlvKVxuICBpZiAoaGFzUmF3Q2xhc3MgJiYgIWhhc1JlZ3VsYXJDbGFzcyAmJiBza2lwUHJlZml4KSB7XG4gICAgY29uc3QgcHJvY2Vzc2VkID0geyAuLi5vcHRpb25zIH07XG4gICAgZGVsZXRlIHByb2Nlc3NlZC5yYXdDbGFzcztcblxuICAgIC8vIERpcmVjdCBhc3NpZ25tZW50IGZvciBzaW1wbGUgc3RyaW5nXG4gICAgaWYgKHR5cGVvZiBoYXNSYXdDbGFzcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcHJvY2Vzc2VkLmNsYXNzID0gaGFzUmF3Q2xhc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEhhbmRsZSBhcnJheSBjYXNlXG4gICAgICBwcm9jZXNzZWQuY2xhc3MgPSBoYXNSYXdDbGFzcy5qb2luKFwiIFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb2Nlc3NlZDtcbiAgfVxuXG4gIC8vIEZ1bGwgcHJvY2Vzc2luZyBwYXRoIChvbmx5IHdoZW4gbmVlZGVkKVxuICBjb25zdCBwcm9jZXNzZWQgPSB7IC4uLm9wdGlvbnMgfTtcbiAgbGV0IGZpbmFsQ2xhc3NlcyA9IFwiXCI7XG5cbiAgLy8gSGFuZGxlIHByZWZpeGVkIGNsYXNzZXMgb25seSBpZiBub3Qgc2tpcHBpbmcgcHJlZml4XG4gIGlmICghc2tpcFByZWZpeCAmJiBoYXNSZWd1bGFyQ2xhc3MpIHtcbiAgICBsZXQgcHJlZml4ZWRTdHJpbmcgPSBcIlwiO1xuXG4gICAgaWYgKHByb2Nlc3NlZC5jbGFzcykge1xuICAgICAgcHJlZml4ZWRTdHJpbmcgKz0gQXJyYXkuaXNBcnJheShwcm9jZXNzZWQuY2xhc3MpXG4gICAgICAgID8gcHJvY2Vzc2VkLmNsYXNzLmpvaW4oXCIgXCIpXG4gICAgICAgIDogcHJvY2Vzc2VkLmNsYXNzO1xuICAgIH1cbiAgICBpZiAocHJvY2Vzc2VkLmNsYXNzTmFtZSkge1xuICAgICAgcHJlZml4ZWRTdHJpbmcgKz0gKHByZWZpeGVkU3RyaW5nID8gXCIgXCIgOiBcIlwiKSArIHByb2Nlc3NlZC5jbGFzc05hbWU7XG4gICAgfVxuXG4gICAgaWYgKHByZWZpeGVkU3RyaW5nKSB7XG4gICAgICBmaW5hbENsYXNzZXMgPSBwcmVmaXhlZFN0cmluZ1xuICAgICAgICAuc3BsaXQoL1xccysvKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5tYXAoKGNscykgPT5cbiAgICAgICAgICBjbHMuc3RhcnRzV2l0aChQUkVGSVhfV0lUSF9EQVNIKSA/IGNscyA6IFBSRUZJWF9XSVRIX0RBU0ggKyBjbHMsXG4gICAgICAgIClcbiAgICAgICAgLmpvaW4oXCIgXCIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSByYXdDbGFzcyAoYWx3YXlzIHByb2Nlc3NlZCB3aGVuIHByZXNlbnQpXG4gIGlmIChoYXNSYXdDbGFzcykge1xuICAgIGNvbnN0IHJhd1N0cmluZyA9IEFycmF5LmlzQXJyYXkoaGFzUmF3Q2xhc3MpXG4gICAgICA/IGhhc1Jhd0NsYXNzLmZpbHRlcihCb29sZWFuKS5qb2luKFwiIFwiKVxuICAgICAgOiBoYXNSYXdDbGFzcztcblxuICAgIGZpbmFsQ2xhc3NlcyArPSAoZmluYWxDbGFzc2VzID8gXCIgXCIgOiBcIlwiKSArIHJhd1N0cmluZztcbiAgfVxuXG4gIGlmIChmaW5hbENsYXNzZXMpIHtcbiAgICBwcm9jZXNzZWQuY2xhc3MgPSBmaW5hbENsYXNzZXM7XG4gIH1cblxuICAvLyBDbGVhbiB1cCBpbiBvbmUgb3BlcmF0aW9uXG4gIGRlbGV0ZSBwcm9jZXNzZWQuY2xhc3NOYW1lO1xuICBkZWxldGUgcHJvY2Vzc2VkLnJhd0NsYXNzO1xuXG4gIHJldHVybiBwcm9jZXNzZWQ7XG59XG5cbi8qKlxuICogT3B0aW1pemVkIHBhcmFtZXRlciBleHRyYWN0aW9uIGZvciBhcnJheSBzY2hlbWFzXG4gKiBSZWR1Y2VzIG11bHRpcGxlIGFycmF5IGxvb2t1cHMgd2l0aCBiYXRjaCBwcm9jZXNzaW5nXG4gKi9cbmludGVyZmFjZSBFeHRyYWN0ZWRQYXJhbWV0ZXJzIHtcbiAgY3JlYXRvcjogRnVuY3Rpb247XG4gIG5hbWU/OiBzdHJpbmc7XG4gIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIGNvbnN1bWVkOiBudW1iZXI7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RQYXJhbWV0ZXJzKFxuICBzY2hlbWE6IFNjaGVtYUl0ZW1bXSxcbiAgc3RhcnRJbmRleDogbnVtYmVyLFxuICBkZWZhdWx0Q3JlYXRvcjogRnVuY3Rpb24sXG4pOiBFeHRyYWN0ZWRQYXJhbWV0ZXJzIHtcbiAgY29uc3QgaXRlbXMgPSBzY2hlbWEuc2xpY2Uoc3RhcnRJbmRleCwgc3RhcnRJbmRleCArIDMpO1xuICBsZXQgY3JlYXRvciwgbmFtZSwgb3B0aW9ucztcbiAgbGV0IGNvbnN1bWVkID0gMTtcblxuICBjb25zdCBbZmlyc3QsIHNlY29uZCwgdGhpcmRdID0gaXRlbXM7XG5cbiAgaWYgKHR5cGVvZiBmaXJzdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY3JlYXRvciA9IGZpcnN0O1xuICAgIGlmICh0eXBlb2Ygc2Vjb25kID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBuYW1lID0gc2Vjb25kO1xuICAgICAgY29uc3VtZWQgPSAyO1xuICAgICAgaWYgKGlzT2JqZWN0KHRoaXJkKSkge1xuICAgICAgICBvcHRpb25zID0gdGhpcmQ7XG4gICAgICAgIGNvbnN1bWVkID0gMztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHNlY29uZCkpIHtcbiAgICAgIG9wdGlvbnMgPSBzZWNvbmQ7XG4gICAgICBjb25zdW1lZCA9IDI7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBmaXJzdCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNyZWF0b3IgPSBkZWZhdWx0Q3JlYXRvcjtcbiAgICBuYW1lID0gZmlyc3Q7XG4gICAgaWYgKGlzT2JqZWN0KHNlY29uZCkpIHtcbiAgICAgIG9wdGlvbnMgPSBzZWNvbmQ7XG4gICAgICBjb25zdW1lZCA9IDI7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGZpcnN0KSkge1xuICAgIGNyZWF0b3IgPSBkZWZhdWx0Q3JlYXRvcjtcbiAgICBvcHRpb25zID0gZmlyc3Q7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNyZWF0b3I6IGNyZWF0b3IgfHwgZGVmYXVsdENyZWF0b3IsXG4gICAgbmFtZSxcbiAgICBvcHRpb25zOiAob3B0aW9ucyB8fCB7fSkgYXMgUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBjb25zdW1lZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBTaW1wbGUgb2JqZWN0IHR5cGUgY2hlY2tcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRE9NIFVUSUxJVElFUyAoU2ltcGxpZmllZClcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBTaW1wbGUgRE9NIGVsZW1lbnQgY3JlYXRpb25cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRWxlbWVudChvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30pOiBIVE1MRWxlbWVudCB7XG4gIGNvbnN0IHRhZyA9IG9wdGlvbnMudGFnIHx8IFwiZGl2XCI7XG4gIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XG5cbiAgaWYgKG9wdGlvbnMuY2xhc3MpIHtcbiAgICBlbGVtZW50LmNsYXNzTmFtZSA9IG9wdGlvbnMuY2xhc3M7XG4gIH1cblxuICBpZiAob3B0aW9ucy5zdHlsZSkge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5zdHlsZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBvcHRpb25zLnN0eWxlKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zLnN0eWxlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIG9wdGlvbnMuc3R5bGUpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRpb25zLnRleHRDb250ZW50KSB7XG4gICAgZWxlbWVudC50ZXh0Q29udGVudCA9IG9wdGlvbnMudGV4dENvbnRlbnQ7XG4gIH1cblxuICBpZiAob3B0aW9ucy50ZXh0KSB7XG4gICAgZWxlbWVudC50ZXh0Q29udGVudCA9IG9wdGlvbnMudGV4dDtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxuXG4vKipcbiAqIEFkZHMgYSBDU1MgY2xhc3MgdG8gYW4gZWxlbWVudFxuICovXG5mdW5jdGlvbiBhZGRDbGFzcyhlbGVtZW50OiBIVE1MRWxlbWVudCwgY2xhc3NOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGVsZW1lbnQgJiYgY2xhc3NOYW1lKSB7XG4gICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgZWxlbWVudCBoYXMgYSBDU1MgY2xhc3NcbiAqL1xuZnVuY3Rpb24gaGFzQ2xhc3MoZWxlbWVudDogSFRNTEVsZW1lbnQsIGNsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBlbGVtZW50ICYmIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFVOSUZJRUQgQ09NUE9ORU5UIENSRUFUSU9OICh3aXRoIGRlc3RydWN0dXJpbmcgb3B0aW1pemF0aW9uKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENyZWF0ZXMgYSBjb21wb25lbnQgaW5zdGFuY2Ugd2l0aCBvcHRpbWl6ZWQgb3B0aW9uIHByb2Nlc3NpbmdcbiAqIFVzZXMgZGVzdHJ1Y3R1cmluZyBmb3IgY2xlYW5lciBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKFxuICBDb21wb25lbnQ6IGFueSxcbiAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuKTogYW55IHtcbiAgdHJ5IHtcbiAgICAvLyBEZXN0cnVjdHVyZSBzcGVjaWFsIGNvbmZpZ3MgaW4gb25lIG9wZXJhdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIGxheW91dDogbGF5b3V0Q29uZmlnLFxuICAgICAgbGF5b3V0SXRlbTogbGF5b3V0SXRlbUNvbmZpZyxcbiAgICAgIHN0eWxlOiBzdHlsZUNvbmZpZyxcbiAgICAgIGF0dHJpYnV0ZXM6IGF0dHJpYnV0ZXNDb25maWcsXG4gICAgICBldmVudHM6IGV2ZW50c0NvbmZpZyxcbiAgICAgIGV2ZW50LCAvLyBMZWdhY3kgc3VwcG9ydFxuICAgICAgLi4uY2xlYW5PcHRpb25zXG4gICAgfSA9IG9wdGlvbnM7XG5cbiAgICAvLyBVc2UgZXZlbnRzIG92ZXIgZXZlbnQgKGV2ZW50cyBpcyBwcmVmZXJyZWQpXG4gICAgY29uc3QgZmluYWxFdmVudHNDb25maWcgPSBldmVudHNDb25maWcgfHwgZXZlbnQ7XG5cbiAgICAvLyBJZiBzdHlsZSBpcyBhIHN0cmluZywgYWx3YXlzIHBhc3MgaXQgdGhyb3VnaCB0byB0aGUgY29tcG9uZW50XG4gICAgaWYgKHN0eWxlQ29uZmlnICYmIHR5cGVvZiBzdHlsZUNvbmZpZyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY2xlYW5PcHRpb25zLnN0eWxlID0gc3R5bGVDb25maWc7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGNvbXBvbmVudFxuICAgIGNvbnN0IGlzQ2xhc3MgPVxuICAgICAgdHlwZW9mIENvbXBvbmVudCA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKENvbXBvbmVudCwgXCJwcm90b3R5cGVcIik/LndyaXRhYmxlID09PVxuICAgICAgICBmYWxzZTtcblxuICAgIGNvbnN0IGNvbXBvbmVudCA9IGlzQ2xhc3NcbiAgICAgID8gbmV3IENvbXBvbmVudChjbGVhbk9wdGlvbnMpXG4gICAgICA6IENvbXBvbmVudChjbGVhbk9wdGlvbnMpO1xuXG4gICAgLy8gQXBwbHkgY29uZmlndXJhdGlvbnMgaWYgY29tcG9uZW50IGhhcyBlbGVtZW50XG4gICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgY29uc3QgZWxlbWVudCA9XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50IHx8XG4gICAgICAgIChjb21wb25lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IGNvbXBvbmVudCA6IG51bGwpO1xuICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgLy8gQXBwbHkgbGF5b3V0IGNsYXNzZXNcbiAgICAgICAgaWYgKGxheW91dENvbmZpZykgYXBwbHlMYXlvdXRDbGFzc2VzKGVsZW1lbnQsIGxheW91dENvbmZpZyk7XG5cbiAgICAgICAgLy8gQXBwbHkgbGF5b3V0IGl0ZW0gY2xhc3Nlc1xuICAgICAgICBpZiAobGF5b3V0SXRlbUNvbmZpZykgYXBwbHlMYXlvdXRJdGVtQ2xhc3NlcyhlbGVtZW50LCBsYXlvdXRJdGVtQ29uZmlnKTtcblxuICAgICAgICAvLyBBcHBseSBzdHlsZVxuICAgICAgICBpZiAoc3R5bGVDb25maWcgJiYgdHlwZW9mIHN0eWxlQ29uZmlnID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCBzdHlsZUNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBhdHRyaWJ1dGVzXG4gICAgICAgIGlmIChhdHRyaWJ1dGVzQ29uZmlnICYmIHR5cGVvZiBhdHRyaWJ1dGVzQ29uZmlnID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlc0NvbmZpZykpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwbHkgZXZlbnRzXG4gICAgICAgIGlmIChmaW5hbEV2ZW50c0NvbmZpZyAmJiB0eXBlb2YgZmluYWxFdmVudHNDb25maWcgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaW5hbEV2ZW50c0NvbmZpZykpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZXZlbnREZWYgb2YgZmluYWxFdmVudHNDb25maWcpIHtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXZlbnREZWYpICYmIGV2ZW50RGVmLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW2V2ZW50TmFtZSwgaGFuZGxlcl0gPSBldmVudERlZjtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICB0eXBlb2YgZXZlbnROYW1lID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgICAgICB0eXBlb2YgaGFuZGxlciA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbZXZlbnROYW1lLCBoYW5kbGVyXSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgICAgICAgICAgZmluYWxFdmVudHNDb25maWcsXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBjcmVhdGluZyBjb21wb25lbnQgaW5zdGFuY2U6XCIsIGVycm9yKTtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBJTlRFR1JBVEVEIExBWU9VVCBDT05GSUdVUkFUSU9OICh3aXRoIGNhY2hpbmcpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQXBwbGllcyBsYXlvdXQgY2xhc3NlcyBiYXNlZCBvbiBjb25maWd1cmF0aW9uXG4gKiBVc2VzIGludGVncmF0ZWQgY2FjaGluZyBmb3Igb3B0aW1hbCBwZXJmb3JtYW5jZVxuICovXG5mdW5jdGlvbiBhcHBseUxheW91dENsYXNzZXMoXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICBsYXlvdXRDb25maWc6IExheW91dENvbmZpZyxcbik6IHZvaWQge1xuICBpZiAoIWVsZW1lbnQgfHwgIWxheW91dENvbmZpZykgcmV0dXJuO1xuXG4gIC8vIEFwcGx5IGJhc2UgbGF5b3V0IHR5cGVcbiAgaWYgKGxheW91dENvbmZpZy50eXBlKSB7XG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLSR7bGF5b3V0Q29uZmlnLnR5cGV9YCk7XG4gIH1cblxuICAvLyBBcHBseSBwcm9wZXJ0aWVzIHdpdGggY2FjaGluZ1xuICBjb25zdCBsYXlvdXRUeXBlID0gbGF5b3V0Q29uZmlnLnR5cGUgfHwgZ2V0TGF5b3V0VHlwZShlbGVtZW50KTtcbiAgaWYgKGxheW91dFR5cGUpIHtcbiAgICBpZiAobGF5b3V0Q29uZmlnLmdhcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgUFJFRklYX1dJVEhfREFTSCArXG4gICAgICAgICAgZ2V0Q2FjaGVkQ2xhc3NOYW1lKGxheW91dFR5cGUsIFwiZ2FwXCIsIGxheW91dENvbmZpZy5nYXApLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGxheW91dENvbmZpZy5hbGlnbikge1xuICAgICAgYWRkQ2xhc3MoXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIFBSRUZJWF9XSVRIX0RBU0ggK1xuICAgICAgICAgIGdldENhY2hlZENsYXNzTmFtZShsYXlvdXRUeXBlLCBcImFsaWduXCIsIGxheW91dENvbmZpZy5hbGlnbiksXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobGF5b3V0Q29uZmlnLmp1c3RpZnkpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICtcbiAgICAgICAgICBnZXRDYWNoZWRDbGFzc05hbWUobGF5b3V0VHlwZSwgXCJqdXN0aWZ5XCIsIGxheW91dENvbmZpZy5qdXN0aWZ5KSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gR3JpZC1zcGVjaWZpYyBwcm9wZXJ0aWVzXG4gIGlmIChsYXlvdXRDb25maWcudHlwZSA9PT0gXCJncmlkXCIgfHwgZ2V0TGF5b3V0VHlwZShlbGVtZW50KSA9PT0gXCJncmlkXCIpIHtcbiAgICBpZiAodHlwZW9mIGxheW91dENvbmZpZy5jb2x1bW5zID09PSBcIm51bWJlclwiKSB7XG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgUFJFRklYX1dJVEhfREFTSCArXG4gICAgICAgICAgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiZ3JpZFwiLCBcImNvbHNcIiwgbGF5b3V0Q29uZmlnLmNvbHVtbnMpLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGxheW91dENvbmZpZy5jb2x1bW5zID09PSBcImF1dG8tZmlsbFwiKSB7XG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcImdyaWRcIiwgXCJmaWxsXCIsIFwiYXV0b1wiKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChsYXlvdXRDb25maWcuY29sdW1ucyA9PT0gXCJhdXRvLWZpdFwiKSB7XG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcImdyaWRcIiwgXCJjb2xzXCIsIFwiYXV0by1maXRcIiksXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobGF5b3V0Q29uZmlnLmRlbnNlKVxuICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLWdyaWQtZGVuc2VgKTtcbiAgICBpZiAobGF5b3V0Q29uZmlnLmF1dG9IZWlnaHQpXG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tZ3JpZC1hdXRvLWhlaWdodGApO1xuICB9XG5cbiAgLy8gUm93LXNwZWNpZmljIHByb3BlcnRpZXNcbiAgaWYgKGxheW91dENvbmZpZy50eXBlID09PSBcInJvd1wiIHx8IGdldExheW91dFR5cGUoZWxlbWVudCkgPT09IFwicm93XCIpIHtcbiAgICBpZiAobGF5b3V0Q29uZmlnLndyYXAgPT09IGZhbHNlIHx8IGxheW91dENvbmZpZy53cmFwID09PSBcIm5vd3JhcFwiKSB7XG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tcm93LW5vd3JhcGApO1xuICAgIH0gZWxzZSBpZiAobGF5b3V0Q29uZmlnLndyYXAgPT09IFwicmV2ZXJzZVwiKSB7XG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tcm93LXdyYXAtcmV2ZXJzZWApO1xuICAgIH1cbiAgICBpZiAobGF5b3V0Q29uZmlnLm1vYmlsZVN0YWNrKVxuICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLXJvdy1tb2JpbGUtc3RhY2tgKTtcbiAgICBpZiAobGF5b3V0Q29uZmlnLm1vYmlsZVNjcm9sbClcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3ctbW9iaWxlLXNjcm9sbGApO1xuICB9XG5cbiAgLy8gQ3VzdG9tIGNsYXNzZXNcbiAgaWYgKGxheW91dENvbmZpZy5jbGFzcykge1xuICAgIGxheW91dENvbmZpZy5jbGFzc1xuICAgICAgLnNwbGl0KFwiIFwiKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLmZvckVhY2goKGNscykgPT4gZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNscykpO1xuICB9XG59XG5cbi8qKlxuICogQXBwbGllcyBsYXlvdXQgaXRlbSBjbGFzc2VzIGJhc2VkIG9uIGNvbmZpZ3VyYXRpb25cbiAqIFVzZXMgaW50ZWdyYXRlZCBjYWNoaW5nIGZvciBvcHRpbWFsIHBlcmZvcm1hbmNlXG4gKi9cbmZ1bmN0aW9uIGFwcGx5TGF5b3V0SXRlbUNsYXNzZXMoXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICBpdGVtQ29uZmlnOiBMYXlvdXRJdGVtQ29uZmlnLFxuKTogdm9pZCB7XG4gIGlmICghZWxlbWVudCB8fCAhaXRlbUNvbmZpZykgcmV0dXJuO1xuXG4gIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0X19pdGVtYCk7XG5cbiAgLy8gV2lkdGggYW5kIHJlc3BvbnNpdmUgY2xhc3NlcyB3aXRoIGNhY2hpbmdcbiAgaWYgKGl0ZW1Db25maWcud2lkdGggJiYgaXRlbUNvbmZpZy53aWR0aCA+PSAxICYmIGl0ZW1Db25maWcud2lkdGggPD0gMTIpIHtcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcIlwiLCBpdGVtQ29uZmlnLndpZHRoKSxcbiAgICApO1xuICB9XG4gIGlmIChpdGVtQ29uZmlnLnNtKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwic21cIiwgaXRlbUNvbmZpZy5zbSksXG4gICAgKTtcbiAgaWYgKGl0ZW1Db25maWcubWQpXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJtZFwiLCBpdGVtQ29uZmlnLm1kKSxcbiAgICApO1xuICBpZiAoaXRlbUNvbmZpZy5sZylcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcImxnXCIsIGl0ZW1Db25maWcubGcpLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLnhsKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwieGxcIiwgaXRlbUNvbmZpZy54bCksXG4gICAgKTtcblxuICAvLyBHcmlkIHNwYW4gY2xhc3Nlc1xuICBpZiAoaXRlbUNvbmZpZy5zcGFuKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwic3BhblwiLCBpdGVtQ29uZmlnLnNwYW4pLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLnJvd1NwYW4pXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArXG4gICAgICAgIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJyb3ctc3BhblwiLCBpdGVtQ29uZmlnLnJvd1NwYW4pLFxuICAgICk7XG5cbiAgLy8gT3JkZXIgYW5kIGFsaWdubWVudFxuICBpZiAoaXRlbUNvbmZpZy5vcmRlcilcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcIm9yZGVyXCIsIGl0ZW1Db25maWcub3JkZXIpLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLmFsaWduKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwic2VsZlwiLCBpdGVtQ29uZmlnLmFsaWduKSxcbiAgICApO1xuICBpZiAoaXRlbUNvbmZpZy5hdXRvKVxuICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0X19pdGVtLS1hdXRvYCk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgbGF5b3V0IHR5cGUgZnJvbSBlbGVtZW50IGNsYXNzZXNcbiAqL1xuZnVuY3Rpb24gZ2V0TGF5b3V0VHlwZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IHN0cmluZyB7XG4gIHJldHVybiBoYXNDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tc3RhY2tgKVxuICAgID8gXCJzdGFja1wiXG4gICAgOiBoYXNDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tcm93YClcbiAgICAgID8gXCJyb3dcIlxuICAgICAgOiBoYXNDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tZ3JpZGApXG4gICAgICAgID8gXCJncmlkXCJcbiAgICAgICAgOiBcIlwiO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBVTklGSUVEIFNDSEVNQSBQUk9DRVNTT1JTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUHJvY2Vzc2VzIGFycmF5LWJhc2VkIHNjaGVtYSBkZWZpbml0aW9uc1xuICogT3B0aW1pemVkIHdpdGggcGFyYW1ldGVyIGV4dHJhY3Rpb24gYW5kIGludGVncmF0ZWQgY29uZmlndXJhdGlvblxuICovXG5mdW5jdGlvbiBwcm9jZXNzQXJyYXlTY2hlbWEoXG4gIHNjaGVtYTogU2NoZW1hSXRlbVtdIHwgYW55LFxuICBwYXJlbnRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsLFxuICBsZXZlbDogbnVtYmVyID0gMCxcbiAgb3B0aW9uczogTGF5b3V0T3B0aW9ucyA9IHt9LFxuKTogTGF5b3V0UmVzdWx0IHtcbiAgbGV2ZWwrKztcbiAgY29uc3QgbGF5b3V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIGNvbnN0IGNvbXBvbmVudHM6IEFycmF5PFtzdHJpbmcsIGFueV0+ID0gW107XG4gIGNvbnN0IGZyYWdtZW50ID0gY3JlYXRlRnJhZ21lbnQoKTtcbiAgbGV0IGNvbXBvbmVudCA9IG51bGw7XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KHNjaGVtYSkpIHtcbiAgICByZXR1cm4gY3JlYXRlTGF5b3V0UmVzdWx0KGxheW91dCk7XG4gIH1cblxuICBjb25zdCBkZWZhdWx0Q3JlYXRvciA9IChvcHRpb25zIGFzIGFueSkuY3JlYXRvciB8fCBjcmVhdGVFbGVtZW50O1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgaXRlbSA9IHNjaGVtYVtpXTtcbiAgICBpZiAoIWl0ZW0pIGNvbnRpbnVlO1xuXG4gICAgLy8gSGFuZGxlIG5lc3RlZCBhcnJheXNcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gY29tcG9uZW50IHx8IHBhcmVudEVsZW1lbnQ7XG4gICAgICBjb25zdCByZXN1bHQgPSBwcm9jZXNzQXJyYXlTY2hlbWEoaXRlbSwgY29udGFpbmVyLCBsZXZlbCwgb3B0aW9ucyk7XG4gICAgICAvLyBNZXJnZSBuZXN0ZWQgY29tcG9uZW50cyBhcnJheSBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQubGF5b3V0LmNvbXBvbmVudHMpKSB7XG4gICAgICAgIGNvbXBvbmVudHMucHVzaCguLi5yZXN1bHQubGF5b3V0LmNvbXBvbmVudHMpO1xuICAgICAgICBkZWxldGUgcmVzdWx0LmxheW91dC5jb21wb25lbnRzO1xuICAgICAgfVxuICAgICAgT2JqZWN0LmFzc2lnbihsYXlvdXQsIHJlc3VsdC5sYXlvdXQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gVXNlIG9wdGltaXplZCBwYXJhbWV0ZXIgZXh0cmFjdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIGNyZWF0b3IsXG4gICAgICBuYW1lLFxuICAgICAgb3B0aW9uczogaXRlbU9wdGlvbnMsXG4gICAgICBjb25zdW1lZCxcbiAgICB9ID0gZXh0cmFjdFBhcmFtZXRlcnMoc2NoZW1hLCBpLCBkZWZhdWx0Q3JlYXRvcik7XG5cbiAgICBpZiAoIWNyZWF0b3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIlNraXBwaW5nIHVuc3VwcG9ydGVkIGl0ZW0gdHlwZTpcIiwgaXRlbSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IHRvIGRpdiBmb3IgY3JlYXRlRWxlbWVudFxuICAgIGlmIChjcmVhdG9yID09PSBjcmVhdGVFbGVtZW50ICYmICEoXCJ0YWdcIiBpbiBpdGVtT3B0aW9ucykpIHtcbiAgICAgIGl0ZW1PcHRpb25zLnRhZyA9IFwiZGl2XCI7XG4gICAgfVxuXG4gICAgLy8gQWR2YW5jZSBpbmRleCBieSBjb25zdW1lZCBpdGVtcyBtaW51cyAxIChsb29wIGluY3JlbWVudCBoYW5kbGVzIHRoZSArMSlcbiAgICBpICs9IGNvbnN1bWVkIC0gMTtcblxuICAgIC8vIFByb2Nlc3Mgb3B0aW9ucyB3aXRoIHByZWZpeCAtIG9wdGltaXplZCBkZWNpc2lvbiBsb2dpY1xuICAgIGNvbnN0IHNob3VsZEFwcGx5UHJlZml4ID1cbiAgICAgIFwicHJlZml4XCIgaW4gaXRlbU9wdGlvbnMgPyBpdGVtT3B0aW9ucy5wcmVmaXggOiBvcHRpb25zLnByZWZpeCAhPT0gZmFsc2U7XG5cbiAgICAvLyBGYXN0IHBhdGg6IHByb2Nlc3Mgb25seSB3aGVuIG5lZWRlZFxuICAgIGNvbnN0IHByb2Nlc3NlZE9wdGlvbnMgPVxuICAgICAgc2hvdWxkQXBwbHlQcmVmaXggfHwgaXRlbU9wdGlvbnMucmF3Q2xhc3NcbiAgICAgICAgPyBwcm9jZXNzQ2xhc3NOYW1lcyhpdGVtT3B0aW9ucywgIXNob3VsZEFwcGx5UHJlZml4KVxuICAgICAgICA6IGl0ZW1PcHRpb25zOyAvLyBObyBjb3B5IG5lZWRlZCBpZiBubyBwcm9jZXNzaW5nXG5cbiAgICAvLyBBZGQgbmFtZSB0byBvcHRpb25zIGlmIG5lZWRlZFxuICAgIGlmIChcbiAgICAgIG5hbWUgJiZcbiAgICAgICEoXCJuYW1lXCIgaW4gcHJvY2Vzc2VkT3B0aW9ucykgJiZcbiAgICAgICEoY3JlYXRvciA9PT0gY3JlYXRlRWxlbWVudCB8fCAoY3JlYXRvciBhcyBhbnkpLmlzRWxlbWVudClcbiAgICApIHtcbiAgICAgIHByb2Nlc3NlZE9wdGlvbnMubmFtZSA9IG5hbWU7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGNvbXBvbmVudFxuICAgIGNvbXBvbmVudCA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGNyZWF0b3IsIHByb2Nlc3NlZE9wdGlvbnMpO1xuICAgIGNvbnN0IGVsZW1lbnQgPSBpc0NvbXBvbmVudChjb21wb25lbnQpID8gY29tcG9uZW50LmVsZW1lbnQgOiBjb21wb25lbnQ7XG5cbiAgICBpZiAobGV2ZWwgPT09IDEpIGxheW91dC5lbGVtZW50ID0gZWxlbWVudDtcbiAgICBpZiAobmFtZSkge1xuICAgICAgbGF5b3V0W25hbWVdID0gY29tcG9uZW50O1xuICAgICAgY29tcG9uZW50cy5wdXNoKFtuYW1lLCBjb21wb25lbnRdKTtcbiAgICB9XG5cbiAgICAvLyBBcHBlbmQgdG8gRE9NXG4gICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgaWYgKFwiaW5zZXJ0XCIgaW4gY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQuaW5zZXJ0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY29tcG9uZW50Lmluc2VydChmcmFnbWVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgY29tcG9uZW50Ll9jb250YWluZXIgPSBwYXJlbnRFbGVtZW50O1xuICAgICAgICBpZiAoXG4gICAgICAgICAgXCJvbkluc2VydGVkXCIgaW4gY29tcG9uZW50ICYmXG4gICAgICAgICAgdHlwZW9mIGNvbXBvbmVudC5vbkluc2VydGVkID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29tcG9uZW50Lm9uSW5zZXJ0ZWQocGFyZW50RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBBcHBlbmQgZnJhZ21lbnQgdG8gcGFyZW50XG4gIGlmIChwYXJlbnRFbGVtZW50ICYmIGZyYWdtZW50Lmhhc0NoaWxkTm9kZXMoKSkge1xuICAgIGNvbnN0IHdyYXBwZXIgPSBpc0NvbXBvbmVudChwYXJlbnRFbGVtZW50KVxuICAgICAgPyBwYXJlbnRFbGVtZW50LmVsZW1lbnRcbiAgICAgIDogcGFyZW50RWxlbWVudDtcbiAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGZyYWdtZW50KTtcbiAgfVxuXG4gIC8vIFJlbGVhc2UgZnJhZ21lbnQgYmFjayB0byBwb29sXG4gIHJlbGVhc2VGcmFnbWVudChmcmFnbWVudCk7XG5cbiAgbGF5b3V0LmNvbXBvbmVudHMgPSBjb21wb25lbnRzO1xuICByZXR1cm4gY3JlYXRlTGF5b3V0UmVzdWx0KGxheW91dCk7XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIG9iamVjdC1iYXNlZCBzY2hlbWEgZGVmaW5pdGlvbnNcbiAqIFNpbXBsaWZpZWQgYW5kIG9wdGltaXplZCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NPYmplY3RTY2hlbWEoXG4gIHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB8IHN0cmluZyxcbiAgcGFyZW50RWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbCxcbiAgb3B0aW9uczogTGF5b3V0T3B0aW9ucyA9IHt9LFxuKTogTGF5b3V0UmVzdWx0IHtcbiAgY29uc3QgbGF5b3V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIGNvbnN0IGRlZmF1bHRDcmVhdG9yID0gb3B0aW9ucy5jcmVhdG9yIHx8IGNyZWF0ZUVsZW1lbnQ7XG5cbiAgLy8gSGFuZGxlIHJvb3QgZWxlbWVudCBjcmVhdGlvblxuICBpZiAoKHNjaGVtYSBhcyBhbnkpLmVsZW1lbnQgJiYgIXBhcmVudEVsZW1lbnQpIHtcbiAgICBjb25zdCBlbGVtZW50RGVmID0gKHNjaGVtYSBhcyBhbnkpLmVsZW1lbnQ7XG4gICAgY29uc3QgY3JlYXRlRWxlbWVudEZuID0gZWxlbWVudERlZi5jcmVhdG9yIHx8IGRlZmF1bHRDcmVhdG9yO1xuXG4gICAgY29uc3QgZWxlbWVudE9wdGlvbnMgPSBlbGVtZW50RGVmLm9wdGlvbnMgfHwge307XG4gICAgY29uc3QgcHJvY2Vzc2VkT3B0aW9ucyA9XG4gICAgICBvcHRpb25zLnByZWZpeCAhPT0gZmFsc2VcbiAgICAgICAgPyBwcm9jZXNzQ2xhc3NOYW1lcyhlbGVtZW50T3B0aW9ucylcbiAgICAgICAgOiB7IC4uLmVsZW1lbnRPcHRpb25zIH07XG5cbiAgICBjb25zdCByb290Q29tcG9uZW50ID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoXG4gICAgICBjcmVhdGVFbGVtZW50Rm4sXG4gICAgICBwcm9jZXNzZWRPcHRpb25zLFxuICAgICk7XG4gICAgbGF5b3V0LmVsZW1lbnQgPSByb290Q29tcG9uZW50O1xuICAgIGlmIChlbGVtZW50RGVmLm5hbWUpIGxheW91dFtlbGVtZW50RGVmLm5hbWVdID0gcm9vdENvbXBvbmVudDtcblxuICAgIC8vIFByb2Nlc3MgY2hpbGRyZW5cbiAgICBpZiAoZWxlbWVudERlZi5jaGlsZHJlbikge1xuICAgICAgY29uc3Qgcm9vdEVsZW1lbnQgPSBpc0NvbXBvbmVudChyb290Q29tcG9uZW50KVxuICAgICAgICA/IHJvb3RDb21wb25lbnQuZWxlbWVudFxuICAgICAgICA6IHJvb3RDb21wb25lbnQ7XG4gICAgICBjb25zdCBjaGlsZFJlc3VsdCA9IHByb2Nlc3NPYmplY3RTY2hlbWEoXG4gICAgICAgIGVsZW1lbnREZWYuY2hpbGRyZW4sXG4gICAgICAgIHJvb3RFbGVtZW50LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5hc3NpZ24obGF5b3V0LCBjaGlsZFJlc3VsdC5sYXlvdXQpO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbiAgfVxuXG4gIC8vIFByb2Nlc3Mgbm9ybWFsIHNjaGVtYSBlbGVtZW50c1xuICBjb25zdCBmcmFnbWVudCA9IHBhcmVudEVsZW1lbnQgPyBjcmVhdGVGcmFnbWVudCgpIDogbnVsbDtcblxuICBmb3IgKGNvbnN0IGtleSBpbiBzY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIGNvbnN0IGRlZiA9IChzY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgYW55Pilba2V5XTtcbiAgICBpZiAoIWRlZikgY29udGludWU7XG5cbiAgICBjb25zdCBlbGVtZW50Q3JlYXRvciA9IGRlZi5jcmVhdG9yIHx8IGRlZmF1bHRDcmVhdG9yO1xuICAgIGNvbnN0IGVsZW1lbnRPcHRpb25zID0gZGVmLm9wdGlvbnMgfHwge307XG4gICAgY29uc3Qgc2hvdWxkQXBwbHlQcmVmaXggPVxuICAgICAgXCJwcmVmaXhcIiBpbiBlbGVtZW50T3B0aW9uc1xuICAgICAgICA/IGVsZW1lbnRPcHRpb25zLnByZWZpeFxuICAgICAgICA6IG9wdGlvbnMucHJlZml4ICE9PSBmYWxzZTtcbiAgICBjb25zdCBwcm9jZXNzZWRPcHRpb25zID0gc2hvdWxkQXBwbHlQcmVmaXhcbiAgICAgID8gcHJvY2Vzc0NsYXNzTmFtZXMoZWxlbWVudE9wdGlvbnMpXG4gICAgICA6IHsgLi4uZWxlbWVudE9wdGlvbnMgfTtcblxuICAgIGlmICghZGVmLm5hbWUgJiYga2V5ICE9PSBcImVsZW1lbnRcIikge1xuICAgICAgZGVmLm5hbWUgPSBrZXk7XG4gICAgfVxuXG4gICAgY29uc3QgY3JlYXRlZCA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGVsZW1lbnRDcmVhdG9yLCBwcm9jZXNzZWRPcHRpb25zKTtcbiAgICBsYXlvdXRba2V5XSA9IGNyZWF0ZWQ7XG4gICAgaWYgKGRlZi5uYW1lICYmIGRlZi5uYW1lICE9PSBrZXkpIGxheW91dFtkZWYubmFtZV0gPSBjcmVhdGVkO1xuXG4gICAgY29uc3QgZWxlbWVudCA9IGlzQ29tcG9uZW50KGNyZWF0ZWQpID8gY3JlYXRlZC5lbGVtZW50IDogY3JlYXRlZDtcbiAgICBpZiAoZnJhZ21lbnQpIGZyYWdtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuXG4gICAgLy8gUHJvY2VzcyBjaGlsZHJlblxuICAgIGlmIChkZWYuY2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IGNoaWxkUmVzdWx0ID0gcHJvY2Vzc09iamVjdFNjaGVtYShkZWYuY2hpbGRyZW4sIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgT2JqZWN0LmFzc2lnbihsYXlvdXQsIGNoaWxkUmVzdWx0LmxheW91dCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQXBwZW5kIHRvIHBhcmVudFxuICBpZiAocGFyZW50RWxlbWVudCAmJiBmcmFnbWVudCkge1xuICAgIGNvbnN0IHBhcmVudERvbSA9IGlzQ29tcG9uZW50KHBhcmVudEVsZW1lbnQpXG4gICAgICA/IHBhcmVudEVsZW1lbnQuZWxlbWVudFxuICAgICAgOiBwYXJlbnRFbGVtZW50O1xuICAgIHBhcmVudERvbS5hcHBlbmRDaGlsZChmcmFnbWVudCk7XG4gICAgcmVsZWFzZUZyYWdtZW50KGZyYWdtZW50KTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gTEFZT1VUIFJFU1VMVCBDUkVBVElPTlxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEZsYXR0ZW5zIGEgbmVzdGVkIGxheW91dCBpbnRvIGEgc2ltcGxlIG9iamVjdCB3aXRoIGVsZW1lbnQgYW5kIGNvbXBvbmVudCByZWZlcmVuY2VzXG4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW5MYXlvdXQobGF5b3V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIGNvbnN0IGZsYXR0ZW5lZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gIGlmICghbGF5b3V0IHx8IHR5cGVvZiBsYXlvdXQgIT09IFwib2JqZWN0XCIpIHJldHVybiBmbGF0dGVuZWQ7XG5cbiAgZm9yIChjb25zdCBrZXkgaW4gbGF5b3V0KSB7XG4gICAgY29uc3QgdmFsdWUgPSBsYXlvdXRba2V5XTtcbiAgICBpZiAoXG4gICAgICB2YWx1ZSAmJlxuICAgICAgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICh2YWx1ZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8XG4gICAgICAgICh0eXBlb2YgU1ZHRWxlbWVudCAhPT0gXCJ1bmRlZmluZWRcIiAmJiB2YWx1ZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpIHx8XG4gICAgICAgIGlzQ29tcG9uZW50KHZhbHVlKSlcbiAgICApIHtcbiAgICAgIGZsYXR0ZW5lZFtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZsYXR0ZW5lZDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbGF5b3V0IHJlc3VsdCBvYmplY3Qgd2l0aCB1dGlsaXR5IGZ1bmN0aW9uc1xuICovXG5mdW5jdGlvbiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogTGF5b3V0UmVzdWx0IHtcbiAgY29uc3QgZmxhdHRlbmVkQ29tcG9uZW50cyA9IGZsYXR0ZW5MYXlvdXQobGF5b3V0KTtcblxuICByZXR1cm4ge1xuICAgIGxheW91dCxcbiAgICBlbGVtZW50OiBsYXlvdXQuZWxlbWVudCxcbiAgICBjb21wb25lbnQ6IGZsYXR0ZW5lZENvbXBvbmVudHMsXG5cbiAgICBnZXQobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICAgIHJldHVybiBsYXlvdXRbbmFtZV0gPz8gbnVsbDtcbiAgICB9LFxuXG4gICAgZ2V0QWxsKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgcmV0dXJuIGZsYXR0ZW5lZENvbXBvbmVudHM7XG4gICAgfSxcblxuICAgIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAvLyBUcmFjayBkZXN0cm95ZWQgY29tcG9uZW50cyB0byBhdm9pZCBkb3VibGUtZGVzdHJveVxuICAgICAgY29uc3QgZGVzdHJveWVkID0gbmV3IFNldDxhbnk+KCk7XG5cbiAgICAgIC8vIEhlbHBlciB0byBzYWZlbHkgZGVzdHJveSBhIGNvbXBvbmVudFxuICAgICAgY29uc3QgZGVzdHJveUNvbXBvbmVudCA9IChjb21wb25lbnQ6IGFueSk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoIWNvbXBvbmVudCB8fCBkZXN0cm95ZWQuaGFzKGNvbXBvbmVudCkpIHJldHVybjtcblxuICAgICAgICAvLyBTa2lwIHBsYWluIEhUTUwgZWxlbWVudHMgYW5kIG5vbi1vYmplY3RzXG4gICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCB0eXBlb2YgY29tcG9uZW50ICE9PSBcIm9iamVjdFwiKVxuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAvLyBDaGVjayBpZiBpdCdzIGEgY29tcG9uZW50IHdpdGggZGVzdHJveSBtZXRob2RcbiAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgZGVzdHJveWVkLmFkZChjb21wb25lbnQpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21wb25lbnQuZGVzdHJveSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBkZXN0cm95IGVycm9ycyAtIGNvbXBvbmVudCBtYXkgYWxyZWFkeSBiZSBjbGVhbmVkIHVwXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBGaXJzdCBkZXN0cm95IGNvbXBvbmVudHMgZnJvbSB0aGUgY29tcG9uZW50cyBhcnJheSAoaWYgcHJlc2VudClcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBhbGwgbmFtZWQgY29tcG9uZW50cyBhcmUgZGVzdHJveWVkIGV2ZW4gaWYgbmVzdGVkXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShsYXlvdXQuY29tcG9uZW50cykpIHtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgY29tcG9uZW50XSBvZiBsYXlvdXQuY29tcG9uZW50cykge1xuICAgICAgICAgIGRlc3Ryb3lDb21wb25lbnQoY29tcG9uZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGVuIGl0ZXJhdGUgb3ZlciBhbGwgbGF5b3V0IGtleXMgZm9yIGFueSBtaXNzZWQgY29tcG9uZW50c1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gbGF5b3V0KSB7XG4gICAgICAgIGlmIChrZXkgPT09IFwiZWxlbWVudFwiIHx8IGtleSA9PT0gXCJjb21wb25lbnRzXCIpIGNvbnRpbnVlO1xuICAgICAgICBkZXN0cm95Q29tcG9uZW50KGxheW91dFtrZXldKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYXIgdGhlIGNvbXBvbmVudHMgYXJyYXlcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGxheW91dC5jb21wb25lbnRzKSkge1xuICAgICAgICBsYXlvdXQuY29tcG9uZW50cy5sZW5ndGggPSAwO1xuICAgICAgfVxuXG4gICAgICAvLyBSZW1vdmUgcm9vdCBlbGVtZW50IGZyb20gRE9NXG4gICAgICBpZiAobGF5b3V0LmVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGlzQ29tcG9uZW50KGxheW91dC5lbGVtZW50KVxuICAgICAgICAgID8gbGF5b3V0LmVsZW1lbnQuZWxlbWVudFxuICAgICAgICAgIDogbGF5b3V0LmVsZW1lbnQ7XG4gICAgICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDbGVhciByZWZlcmVuY2VzIHRvIGhlbHAgR0NcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGxheW91dCkge1xuICAgICAgICBkZWxldGUgbGF5b3V0W2tleV07XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVU5JRklFRCBFTlRSWSBQT0lOVFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsYXlvdXQgZnJvbSB2YXJpb3VzIHNjaGVtYSBmb3JtYXRzXG4gKiBVbmlmaWVkIHByb2Nlc3NvciBmb3IgYXJyYXlzLCBvYmplY3RzLCBKU1gsIGFuZCBIVE1MIHN0cmluZ3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxheW91dChcbiAgc2NoZW1hOiBhbnksXG4gIHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGwsXG4gIG9wdGlvbnM6IExheW91dE9wdGlvbnMgPSB7fSxcbik6IExheW91dFJlc3VsdCB7XG4gIC8vIEhhbmRsZSBmdW5jdGlvbiBzY2hlbWFzXG4gIGlmICh0eXBlb2Ygc2NoZW1hID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBzY2hlbWEgPSBzY2hlbWEoKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBIVE1MIHN0cmluZyBzY2hlbWFzXG4gIGlmICh0eXBlb2Ygc2NoZW1hID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG4gICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gc2NoZW1hLnRyaW0oKTtcbiAgICBjb25zdCBmcmFnbWVudCA9IHRlbXBsYXRlLmNvbnRlbnQ7XG5cbiAgICBpZiAocGFyZW50RWxlbWVudCAmJiBmcmFnbWVudC5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICAgIHBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IGxheW91dCA9IHsgZWxlbWVudDogZnJhZ21lbnQuZmlyc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQgfTtcbiAgICByZXR1cm4gY3JlYXRlTGF5b3V0UmVzdWx0KGxheW91dCk7XG4gIH1cblxuICAvLyBIYW5kbGUgSlNYLWxpa2Ugc2NoZW1hcyAoYXJyYXkgd2l0aCBmdW5jdGlvbiwgc3RyaW5nLCBvYmplY3QgcGF0dGVybilcbiAgaWYgKFxuICAgIEFycmF5LmlzQXJyYXkoc2NoZW1hKSAmJlxuICAgIHNjaGVtYS5sZW5ndGggPj0gMyAmJlxuICAgIHR5cGVvZiBzY2hlbWFbMF0gPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIHR5cGVvZiBzY2hlbWFbMV0gPT09IFwic3RyaW5nXCIgJiZcbiAgICBpc09iamVjdChzY2hlbWFbMl0pXG4gICkge1xuICAgIHJldHVybiBwcm9jZXNzQXJyYXlTY2hlbWEoc2NoZW1hLCBwYXJlbnRFbGVtZW50LCAwLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8vIFJvdXRlIHRvIGFwcHJvcHJpYXRlIHByb2Nlc3NvclxuICByZXR1cm4gQXJyYXkuaXNBcnJheShzY2hlbWEpXG4gICAgPyBwcm9jZXNzQXJyYXlTY2hlbWEoc2NoZW1hLCBwYXJlbnRFbGVtZW50LCAwLCBvcHRpb25zKVxuICAgIDogcHJvY2Vzc09iamVjdFNjaGVtYShzY2hlbWEsIHBhcmVudEVsZW1lbnQsIG9wdGlvbnMpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFWFBPUlRTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIENsZWFyIGZ1bmN0aW9ucyBmb3IgdGhlIHVuaWZpZWQgc3lzdGVtXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJDbGFzc0NhY2hlKCk6IHZvaWQge1xuICBjbGFzc0NhY2hlLmNsZWFyKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckZyYWdtZW50UG9vbCgpOiB2b2lkIHtcbiAgZnJhZ21lbnRQb29sLmNsZWFyKCk7XG59XG5cbmV4cG9ydCB7XG4gIHByb2Nlc3NDbGFzc05hbWVzLFxuICBpc0NvbXBvbmVudCxcbiAgZmxhdHRlbkxheW91dCxcbiAgYXBwbHlMYXlvdXRDbGFzc2VzLFxuICBhcHBseUxheW91dEl0ZW1DbGFzc2VzLFxuICBjcmVhdGVMYXlvdXRSZXN1bHQsXG59O1xuIiwKICAgICIvKipcbiAqIEBtb2R1bGUgY29yZS9sYXlvdXQvY29uZmlnXG4gKiBAZGVzY3JpcHRpb24gRXNzZW50aWFsIGxheW91dCBjb25maWd1cmF0aW9uIHV0aWxpdGllc1xuICogQ29yZSBmdW5jdGlvbmFsaXR5IGlzIGludGVncmF0ZWQgaW50byBzY2hlbWEudHMgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICovXG5cbi8vIENvbmZpZ3VyYXRpb24gY29uc3RhbnRzXG5jb25zdCBQUkVGSVggPSBcIm10cmxcIjsgLy8gVE9ETzogTWFrZSB0aGlzIGNvbmZpZ3VyYWJsZSBmcm9tIG1haW4gbXRybCBjb25maWdcbmNvbnN0IFBSRUZJWF9XSVRIX0RBU0ggPSBgJHtQUkVGSVh9LWA7XG5cbi8qKlxuICogU2ltcGxlIERPTSB1dGlsaXRpZXNcbiAqL1xuZnVuY3Rpb24gYWRkQ2xhc3MoZWxlbWVudDogYW55LCBjbGFzc05hbWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZWxlbWVudCAmJiBjbGFzc05hbWUgJiYgZWxlbWVudC5jbGFzc0xpc3QpIHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNDbGFzcyhlbGVtZW50OiBhbnksIGNsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBlbGVtZW50ICYmIGVsZW1lbnQuY2xhc3NMaXN0ICYmIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSk7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGNsZWFuIHVwIHByZXZpb3VzIGxheW91dCBjbGFzc2VzIGZyb20gYW4gZWxlbWVudFxuICogVXNlZnVsIGZvciBkeW5hbWljIGNsYXNzIG1hbmFnZW1lbnRcbiAqXG4gKiBAcGFyYW0gZWxlbWVudCAtIEVsZW1lbnQgdG8gY2xlYW4gbGF5b3V0IGNsYXNzZXMgZnJvbVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYW51cExheW91dENsYXNzZXMoZWxlbWVudDogYW55KTogdm9pZCB7XG4gIGlmICghZWxlbWVudCB8fCAhZWxlbWVudC5jbGFzc0xpc3QpIHJldHVybjtcblxuICAvLyBHZXQgYWxsIGNsYXNzZXMgZnJvbSB0aGUgZWxlbWVudFxuICBjb25zdCBjbGFzc0xpc3QgPSBBcnJheS5mcm9tKGVsZW1lbnQuY2xhc3NMaXN0KSBhcyBzdHJpbmdbXTtcblxuICAvLyBGaW5kIGFuZCByZW1vdmUgbGF5b3V0LXJlbGF0ZWQgY2xhc3Nlc1xuICBjb25zdCBsYXlvdXRDbGFzc2VzID0gY2xhc3NMaXN0LmZpbHRlcihcbiAgICAoY2xzOiBzdHJpbmcpID0+XG4gICAgICBjbHMuc3RhcnRzV2l0aChgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tYCkgfHxcbiAgICAgIGNscy5pbmNsdWRlcyhgLSR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLWApXG4gICk7XG5cbiAgLy8gUmVtb3ZlIGVhY2ggbGF5b3V0IGNsYXNzXG4gIGxheW91dENsYXNzZXMuZm9yRWFjaCgoY2xzOiBzdHJpbmcpID0+IHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoY2xzKTtcbiAgfSk7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgbGF5b3V0IHR5cGUgZnJvbSBlbGVtZW50IGNsYXNzZXNcbiAqXG4gKiBAcGFyYW0gZWxlbWVudCAtIEVsZW1lbnQgdG8gY2hlY2tcbiAqIEByZXR1cm5zIExheW91dCB0eXBlIGlmIGZvdW5kLCBlbXB0eSBzdHJpbmcgb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXlvdXRUeXBlKGVsZW1lbnQ6IGFueSk6IHN0cmluZyB7XG4gIHJldHVybiBoYXNDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tc3RhY2tgKVxuICAgID8gXCJzdGFja1wiXG4gICAgOiBoYXNDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tcm93YClcbiAgICA/IFwicm93XCJcbiAgICA6IGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1ncmlkYClcbiAgICA/IFwiZ3JpZFwiXG4gICAgOiBcIlwiO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGNvbmZpZ3VyZWQgcHJlZml4IGZvciB0aGUgbGF5b3V0IHN5c3RlbVxuICogQHJldHVybnMgQ3VycmVudCBwcmVmaXggd2l0aCBkYXNoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXlvdXRQcmVmaXgoKTogc3RyaW5nIHtcbiAgcmV0dXJuIFBSRUZJWF9XSVRIX0RBU0g7XG59XG5cbi8qKlxuICogU2V0cyBsYXlvdXQgY2xhc3NlcyBvbiBhbiBlbGVtZW50IGR5bmFtaWNhbGx5XG4gKiBVc2VmdWwgZm9yIHByb2dyYW1tYXRpYyBsYXlvdXQgdXBkYXRlc1xuICpcbiAqIEBwYXJhbSBlbGVtZW50IC0gVGFyZ2V0IGVsZW1lbnRcbiAqIEBwYXJhbSBsYXlvdXRUeXBlIC0gTGF5b3V0IHR5cGUgdG8gYXBwbHlcbiAqIEBwYXJhbSBjbGFzc2VzIC0gQWRkaXRpb25hbCBjbGFzc2VzIHRvIGFwcGx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRMYXlvdXRDbGFzc2VzKFxuICBlbGVtZW50OiBhbnksXG4gIGxheW91dFR5cGU6IHN0cmluZyxcbiAgY2xhc3Nlczogc3RyaW5nW10gPSBbXVxuKTogdm9pZCB7XG4gIGlmICghZWxlbWVudCB8fCAhbGF5b3V0VHlwZSkgcmV0dXJuO1xuXG4gIC8vIENsZWFuIHVwIGV4aXN0aW5nIGxheW91dCBjbGFzc2VzIGZpcnN0XG4gIGNsZWFudXBMYXlvdXRDbGFzc2VzKGVsZW1lbnQpO1xuXG4gIC8vIEFwcGx5IGJhc2UgbGF5b3V0IHR5cGVcbiAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLSR7bGF5b3V0VHlwZX1gKTtcblxuICAvLyBBcHBseSBhZGRpdGlvbmFsIGNsYXNzZXNcbiAgY2xhc3Nlcy5mb3JFYWNoKChjbHMpID0+IHtcbiAgICBpZiAoY2xzLnN0YXJ0c1dpdGgoXCJsYXlvdXQtLVwiKSB8fCBjbHMuc3RhcnRzV2l0aChcImxheW91dF9fXCIpKSB7XG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfSR7Y2xzfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBjbHMpO1xuICAgIH1cbiAgfSk7XG59XG4iLAogICAgIi8qKlxuICogQG1vZHVsZSBjb3JlL2xheW91dC9qc3hcbiAqIEBkZXNjcmlwdGlvbiBKU1gtbGlrZSBzeW50YXggc3VwcG9ydCBmb3IgbGF5b3V0IGNyZWF0aW9uXG4gKiBQcm92aWRlcyBhIHNpbXBsZSBoKCkgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGVsZW1lbnRzIHdpdGhvdXQgUmVhY3QgZGVwZW5kZW5jeVxuICovXG5cbmltcG9ydCB0eXBlIHsgTGF5b3V0UmVzdWx0IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUxheW91dCB9IGZyb20gXCIuL3NjaGVtYVwiO1xuXG4vKipcbiAqIEZyYWdtZW50IHN5bWJvbCBmb3IgSlNYIGZyYWdtZW50c1xuICovXG5leHBvcnQgY29uc3QgRnJhZ21lbnQgPSBTeW1ib2woXCJGcmFnbWVudFwiKTtcblxuLyoqXG4gKiBKU1gtbGlrZSBoeXBlcnNjcmlwdCBmdW5jdGlvblxuICogQ3JlYXRlcyBlbGVtZW50cyBpbiBhIFJlYWN0LWxpa2Ugc3ludGF4IHdpdGhvdXQgUmVhY3QgZGVwZW5kZW5jeVxuICpcbiAqIEBwYXJhbSB0YWcgLSBIVE1MIHRhZyBuYW1lLCBjb21wb25lbnQgZnVuY3Rpb24sIG9yIEZyYWdtZW50XG4gKiBAcGFyYW0gcHJvcHMgLSBFbGVtZW50IHByb3BlcnRpZXMgYW5kIGF0dHJpYnV0ZXNcbiAqIEBwYXJhbSBjaGlsZHJlbiAtIENoaWxkIGVsZW1lbnRzXG4gKiBAcmV0dXJucyBET00gZWxlbWVudCBvciBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGgoXG4gIHRhZzogc3RyaW5nIHwgRnVuY3Rpb24gfCB0eXBlb2YgRnJhZ21lbnQsXG4gIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwsXG4gIC4uLmNoaWxkcmVuOiBhbnlbXVxuKTogYW55IHtcbiAgLy8gSGFuZGxlIEZyYWdtZW50XG4gIGlmICh0YWcgPT09IEZyYWdtZW50KSB7XG4gICAgY29uc3QgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgIGlmIChjaGlsZCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPVxuICAgICAgICAgIHR5cGVvZiBjaGlsZCA9PT0gXCJzdHJpbmdcIiA/IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNoaWxkKSA6IGNoaWxkO1xuICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZnJhZ21lbnQ7XG4gIH1cblxuICAvLyBIYW5kbGUgc3RyaW5nIHRhZ3MgKEhUTUwgZWxlbWVudHMpXG4gIGlmICh0eXBlb2YgdGFnID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcblxuICAgIC8vIEFwcGx5IHByb3BzXG4gICAgaWYgKHByb3BzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9wcykpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJjbGFzc05hbWVcIiB8fCBrZXkgPT09IFwiY2xhc3NcIikge1xuICAgICAgICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5LnN0YXJ0c1dpdGgoXCJvblwiKSAmJiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIEV2ZW50IGhhbmRsZXJcbiAgICAgICAgICBjb25zdCBldmVudE5hbWUgPSBrZXkuc2xpY2UoMikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcInN0eWxlXCIgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgLy8gU3R5bGUgb2JqZWN0XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCIpIHtcbiAgICAgICAgICAvLyBIVE1MIGNvbnRlbnRcbiAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IHZhbHVlLl9faHRtbCB8fCBcIlwiO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBSZWd1bGFyIGF0dHJpYnV0ZVxuICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBcHBlbmQgY2hpbGRyZW5cbiAgICBjaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgaWYgKGNoaWxkICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjaGlsZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY2hpbGQpKTtcbiAgICAgICAgfSBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIE5vZGUpIHtcbiAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZyhjaGlsZCkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICAvLyBIYW5kbGUgY29tcG9uZW50IGZ1bmN0aW9uc1xuICBpZiAodHlwZW9mIHRhZyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc3QgYWxsUHJvcHMgPSBwcm9wcyB8fCB7fTtcbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgYWxsUHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICB9XG4gICAgcmV0dXJuIHRhZyhhbGxQcm9wcyk7XG4gIH1cblxuICAvLyBGYWxsYmFjayB0byBkaXZcbiAgcmV0dXJuIGgoXCJkaXZcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbGF5b3V0IHVzaW5nIEpTWC1saWtlIHN5bnRheFxuICogUHJvdmlkZXMgYSBicmlkZ2UgYmV0d2VlbiBKU1ggYW5kIHRoZSBsYXlvdXQgc3lzdGVtXG4gKlxuICogQHBhcmFtIGpzeEVsZW1lbnQgLSBKU1ggZWxlbWVudCBjcmVhdGVkIHdpdGggaCgpXG4gKiBAcGFyYW0gcGFyZW50RWxlbWVudCAtIFBhcmVudCBlbGVtZW50IHRvIGF0dGFjaCB0b1xuICogQHJldHVybnMgTGF5b3V0IHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSnN4TGF5b3V0KFxuICBqc3hFbGVtZW50OiBhbnksXG4gIHBhcmVudEVsZW1lbnQ/OiBhbnlcbik6IExheW91dFJlc3VsdCB7XG4gIC8vIENvbnZlcnQgSlNYIGVsZW1lbnQgdG8gbGF5b3V0IHNjaGVtYVxuICBjb25zdCBzY2hlbWEgPSBqc3hFbGVtZW50O1xuXG4gIC8vIENyZWF0ZSBsYXlvdXQgdXNpbmcgdGhlIHN0YW5kYXJkIGNyZWF0ZUxheW91dCBmdW5jdGlvblxuICByZXR1cm4gY3JlYXRlTGF5b3V0KHNjaGVtYSwgcGFyZW50RWxlbWVudCk7XG59XG5cbi8qKlxuICogVXRpbGl0eSB0byBjcmVhdGUgYSBzaW1wbGUgY29tcG9uZW50IGZyb20gYSBmdW5jdGlvblxuICogVXNlZnVsIGZvciBjcmVhdGluZyByZXVzYWJsZSBKU1ggY29tcG9uZW50c1xuICpcbiAqIEBwYXJhbSBmbiAtIENvbXBvbmVudCBmdW5jdGlvblxuICogQHJldHVybnMgQ29tcG9uZW50IHRoYXQgY2FuIGJlIHVzZWQgaW4gSlNYXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb25lbnQoZm46IChwcm9wczogUmVjb3JkPHN0cmluZywgYW55PikgPT4gYW55KTogRnVuY3Rpb24ge1xuICByZXR1cm4gZnVuY3Rpb24gKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogYW55IHtcbiAgICByZXR1cm4gZm4ocHJvcHMgfHwge30pO1xuICB9O1xufVxuXG4vKipcbiAqIFV0aWxpdHkgdG8gcmVuZGVyIG11bHRpcGxlIEpTWCBlbGVtZW50c1xuICogVXNlZnVsIGZvciBjcmVhdGluZyBsaXN0cyBvciBjb2xsZWN0aW9uc1xuICpcbiAqIEBwYXJhbSBlbGVtZW50cyAtIEFycmF5IG9mIEpTWCBlbGVtZW50c1xuICogQHBhcmFtIHBhcmVudEVsZW1lbnQgLSBQYXJlbnQgZWxlbWVudCB0byBhdHRhY2ggdG9cbiAqIEByZXR1cm5zIEFycmF5IG9mIGxheW91dCByZXN1bHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJFbGVtZW50cyhcbiAgZWxlbWVudHM6IGFueVtdLFxuICBwYXJlbnRFbGVtZW50PzogYW55XG4pOiBMYXlvdXRSZXN1bHRbXSB7XG4gIHJldHVybiBlbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IGNyZWF0ZUpzeExheW91dChlbGVtZW50LCBwYXJlbnRFbGVtZW50KSk7XG59XG5cbi8qKlxuICogQ29tbW9uIEpTWCBlbGVtZW50IGNyZWF0b3JzIGZvciBjb252ZW5pZW5jZVxuICovXG5leHBvcnQgY29uc3QganN4ID0ge1xuICBkaXY6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwiZGl2XCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIHNwYW46IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwic3BhblwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxuICBwOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcInBcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgYnV0dG9uOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcImJ1dHRvblwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxuICBpbnB1dDogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PikgPT4gaChcImlucHV0XCIsIHByb3BzKSxcbiAgaW1nOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBoKFwiaW1nXCIsIHByb3BzKSxcbiAgYTogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJhXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIHVsOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcInVsXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIGxpOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcImxpXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIHNlY3Rpb246IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwic2VjdGlvblwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxuICBoZWFkZXI6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwiaGVhZGVyXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIGZvb3RlcjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJmb290ZXJcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgbWFpbjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJtYWluXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIGFydGljbGU6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwiYXJ0aWNsZVwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxufTtcbiIsCiAgICAiLyoqXG4gKiBWaWV3cG9ydCAtIENvcmUgdmlydHVhbCBzY3JvbGxpbmcgZW5naW5lXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBWaWV3cG9ydENvbmZpZyxcbiAgVmlld3BvcnRDb250ZXh0LFxuICBWaWV3cG9ydENvbXBvbmVudCxcbiAgSXRlbVJhbmdlLFxuICBWaWV3cG9ydEluZm8sXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBwaXBlIH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IHdpdGhCYXNlIH0gZnJvbSBcIi4vZmVhdHVyZXMvYmFzZVwiO1xuaW1wb3J0IHsgd2l0aFZpcnR1YWwgfSBmcm9tIFwiLi9mZWF0dXJlcy92aXJ0dWFsXCI7XG5pbXBvcnQgeyB3aXRoU2Nyb2xsaW5nIH0gZnJvbSBcIi4vZmVhdHVyZXMvc2Nyb2xsaW5nXCI7XG5pbXBvcnQgeyB3aXRoTW9tZW50dW0gfSBmcm9tIFwiLi9mZWF0dXJlcy9tb21lbnR1bVwiO1xuaW1wb3J0IHsgd2l0aFNjcm9sbGJhciB9IGZyb20gXCIuL2ZlYXR1cmVzL3Njcm9sbGJhclwiO1xuaW1wb3J0IHsgd2l0aENvbGxlY3Rpb24gfSBmcm9tIFwiLi9mZWF0dXJlcy9jb2xsZWN0aW9uXCI7XG5pbXBvcnQgeyB3aXRoUGxhY2Vob2xkZXJzIH0gZnJvbSBcIi4vZmVhdHVyZXMvcGxhY2Vob2xkZXJzXCI7XG5pbXBvcnQgeyB3aXRoUmVuZGVyaW5nIH0gZnJvbSBcIi4vZmVhdHVyZXMvcmVuZGVyaW5nXCI7XG5pbXBvcnQgeyB3aXRoRXZlbnRzIH0gZnJvbSBcIi4vZmVhdHVyZXMvZXZlbnRzXCI7XG5cbi8vIEludGVybmFsIHZpZXdwb3J0IHN0YXRlXG5pbnRlcmZhY2UgVmlld3BvcnRTdGF0ZSB7XG4gIHNjcm9sbFBvc2l0aW9uOiBudW1iZXI7XG4gIHRvdGFsSXRlbXM6IG51bWJlcjtcbiAgaXRlbVNpemU6IG51bWJlcjtcbiAgY29udGFpbmVyU2l6ZTogbnVtYmVyO1xuICB2aXJ0dWFsVG90YWxTaXplOiBudW1iZXI7XG4gIHZpc2libGVSYW5nZTogSXRlbVJhbmdlO1xuICBpdGVtc0NvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsO1xuICB2ZWxvY2l0eTogbnVtYmVyO1xuICBzY3JvbGxEaXJlY3Rpb246IFwiZm9yd2FyZFwiIHwgXCJiYWNrd2FyZFwiO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB2aWV3cG9ydC1lbmhhbmNlZCBjb21wb25lbnQgdXNpbmcgY29tcG9zaXRpb25cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gVmlld3BvcnQgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgRnVuY3Rpb24gdGhhdCBlbmhhbmNlcyBhIGNvbXBvbmVudCB3aXRoIHZpZXdwb3J0IGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgY29uc3QgY3JlYXRlVmlld3BvcnQgPSAoY29uZmlnOiBWaWV3cG9ydENvbmZpZyA9IHt9KSA9PiB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dD4oY29tcG9uZW50OiBUKTogVCAmIFZpZXdwb3J0Q29tcG9uZW50ID0+IHtcbiAgICAvLyBUcmFjayBpZiB2aWV3cG9ydCBoYXMgYmVlbiBpbml0aWFsaXplZCB0byBwcmV2ZW50IG11bHRpcGxlIGluaXRpYWxpemF0aW9uc1xuICAgIGxldCBpc0luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgICAvLyBObyBub3JtYWxpemF0aW9uIG5lZWRlZCAtIHdlJ2xsIHVzZSB0aGUgbmVzdGVkIHN0cnVjdHVyZSBkaXJlY3RseVxuXG4gICAgLy8gQ3JlYXRlIHNoYXJlZCB2aWV3cG9ydCBzdGF0ZVxuICAgIGNvbnN0IHN0YXRlOiBWaWV3cG9ydFN0YXRlID0ge1xuICAgICAgc2Nyb2xsUG9zaXRpb246IDAsXG4gICAgICB0b3RhbEl0ZW1zOiBjb21wb25lbnQudG90YWxJdGVtcyB8fCAwLFxuICAgICAgaXRlbVNpemU6IGNvbmZpZy52aXJ0dWFsPy5pdGVtU2l6ZSB8fCA1MCxcbiAgICAgIGNvbnRhaW5lclNpemU6IDAsXG4gICAgICB2aXJ0dWFsVG90YWxTaXplOiAwLFxuICAgICAgdmlzaWJsZVJhbmdlOiB7IHN0YXJ0OiAwLCBlbmQ6IDAgfSxcbiAgICAgIGl0ZW1zQ29udGFpbmVyOiBudWxsLFxuICAgICAgdmVsb2NpdHk6IDAsXG4gICAgICBzY3JvbGxEaXJlY3Rpb246IFwiZm9yd2FyZFwiLFxuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgYmFzZSB2aWV3cG9ydCBBUElcbiAgICBjb25zdCB2aWV3cG9ydEFQSSA9IHtcbiAgICAgIC8vIENvcmUgQVBJXG4gICAgICBpbml0aWFsaXplOiAoKSA9PiB7XG4gICAgICAgIC8vIFByZXZlbnQgbXVsdGlwbGUgaW5pdGlhbGl6YXRpb25zXG4gICAgICAgIGlmIChpc0luaXRpYWxpemVkKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1ZpZXdwb3J0XSBJbml0aWFsaXppbmcgd2l0aCBzdGF0ZTpcIiwge1xuICAgICAgICAvLyAgIGVsZW1lbnQ6ICEhY29tcG9uZW50LmVsZW1lbnQsXG4gICAgICAgIC8vICAgdG90YWxJdGVtczogY29tcG9uZW50LnRvdGFsSXRlbXMsXG4gICAgICAgIC8vICAgaXRlbVNpemU6IGNvbmZpZy52aXJ0dWFsPy5pdGVtU2l6ZSxcbiAgICAgICAgLy8gfSk7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBjb250YWluZXIgc2l6ZVxuICAgICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgICBzdGF0ZS5jb250YWluZXJTaXplID1cbiAgICAgICAgICAgIGNvbmZpZy5zY3JvbGxpbmc/Lm9yaWVudGF0aW9uID09PSBcImhvcml6b250YWxcIlxuICAgICAgICAgICAgICA/IGNvbXBvbmVudC5lbGVtZW50Lm9mZnNldFdpZHRoXG4gICAgICAgICAgICAgIDogY29tcG9uZW50LmVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCJbVmlld3BvcnRdIENvbnRhaW5lciBzaXplOlwiLCBzdGF0ZS5jb250YWluZXJTaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBpbml0aWFsIHZpcnR1YWwgc2l6ZVxuICAgICAgICBzdGF0ZS52aXJ0dWFsVG90YWxTaXplID0gc3RhdGUudG90YWxJdGVtcyAqIHN0YXRlLml0ZW1TaXplO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBpbml0aWFsIHZpc2libGUgcmFuZ2VcbiAgICAgICAgc3RhdGUudmlzaWJsZVJhbmdlID0gY2FsY3VsYXRlVmlzaWJsZVJhbmdlKHN0YXRlLnNjcm9sbFBvc2l0aW9uKTtcblxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltWaWV3cG9ydF0gSW5pdGlhbCBzdGF0ZTpcIiwge1xuICAgICAgICAvLyAgIGNvbnRhaW5lclNpemU6IHN0YXRlLmNvbnRhaW5lclNpemUsXG4gICAgICAgIC8vICAgdmlydHVhbFRvdGFsU2l6ZTogc3RhdGUudmlydHVhbFRvdGFsU2l6ZSxcbiAgICAgICAgLy8gICB2aXNpYmxlUmFuZ2U6IHN0YXRlLnZpc2libGVSYW5nZSxcbiAgICAgICAgLy8gfSk7XG4gICAgICB9LFxuXG4gICAgICBkZXN0cm95OiAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFudXAgd2lsbCBiZSBoYW5kbGVkIGJ5IGZlYXR1cmVzXG4gICAgICB9LFxuXG4gICAgICB1cGRhdGVWaWV3cG9ydDogKCkgPT4ge1xuICAgICAgICAvLyBXaWxsIGJlIGltcGxlbWVudGVkIGJ5IHJlbmRlcmluZyBmZWF0dXJlXG4gICAgICB9LFxuXG4gICAgICAvLyBDaGVjayBpZiBhbHJlYWR5IGluaXRpYWxpemVkXG4gICAgICBpc0luaXRpYWxpemVkOiAoKSA9PiBpc0luaXRpYWxpemVkLFxuXG4gICAgICAvLyBSZXNldCBpbml0aWFsaXphdGlvbiBzdGF0ZSAoZm9yIHJlbG9hZCBmdW5jdGlvbmFsaXR5KVxuICAgICAgcmVzZXRJbml0aWFsaXphdGlvbjogKCkgPT4ge1xuICAgICAgICBpc0luaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICB9LFxuXG4gICAgICAvLyBBbGxvdyBmZWF0dXJlcyB0byBjaGVjayBpZiBpbml0IHNob3VsZCBwcm9jZWVkXG4gICAgICBfc2hvdWxkSW5pdDogKCkgPT4gIWlzSW5pdGlhbGl6ZWQsXG5cbiAgICAgIC8vIFNjcm9sbGluZyBBUEkgKHdpbGwgYmUgb3ZlcnJpZGRlbiBieSBzY3JvbGxpbmcgZmVhdHVyZSlcbiAgICAgIHNjcm9sbFRvSW5kZXg6IChcbiAgICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgICAgYWxpZ25tZW50PzogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIsXG4gICAgICApID0+IHtcbiAgICAgICAgLy8gUGxhY2Vob2xkZXIgLSB3aWxsIGJlIGltcGxlbWVudGVkIGJ5IHNjcm9sbGluZyBmZWF0dXJlXG4gICAgICB9LFxuXG4gICAgICBzY3JvbGxUb1Bvc2l0aW9uOiAocG9zaXRpb246IG51bWJlcikgPT4ge1xuICAgICAgICAvLyBXaWxsIGJlIGltcGxlbWVudGVkIGJ5IHNjcm9sbGluZyBmZWF0dXJlXG4gICAgICB9LFxuXG4gICAgICBnZXRTY3JvbGxQb3NpdGlvbjogKCkgPT4gc3RhdGUuc2Nyb2xsUG9zaXRpb24sXG5cbiAgICAgIC8vIEluZm8gQVBJXG4gICAgICBnZXRWaXNpYmxlUmFuZ2U6ICgpID0+IHN0YXRlLnZpc2libGVSYW5nZSxcblxuICAgICAgZ2V0Vmlld3BvcnRJbmZvOiAoKTogVmlld3BvcnRJbmZvID0+ICh7XG4gICAgICAgIGNvbnRhaW5lclNpemU6IHN0YXRlLmNvbnRhaW5lclNpemUsXG4gICAgICAgIHRvdGFsVmlydHVhbFNpemU6IHN0YXRlLnZpcnR1YWxUb3RhbFNpemUsXG4gICAgICAgIHZpc2libGVSYW5nZTogc3RhdGUudmlzaWJsZVJhbmdlLFxuICAgICAgICB2aXJ0dWFsU2Nyb2xsUG9zaXRpb246IHN0YXRlLnNjcm9sbFBvc2l0aW9uLFxuICAgICAgfSksXG5cbiAgICAgIC8vIFJlbmRlcmluZyBBUElcbiAgICAgIHJlbmRlckl0ZW1zOiAoKSA9PiB7XG4gICAgICAgIC8vIFdpbGwgYmUgaW1wbGVtZW50ZWQgYnkgcmVuZGVyaW5nIGZlYXR1cmVcbiAgICAgIH0sXG5cbiAgICAgIC8vIEludGVybmFsIHN0YXRlIChmb3IgZmVhdHVyZXMgdG8gYWNjZXNzKVxuICAgICAgc3RhdGUsXG4gICAgfTtcblxuICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjYWxjdWxhdGUgdmlzaWJsZSByYW5nZVxuICAgIGNvbnN0IGNhbGN1bGF0ZVZpc2libGVSYW5nZSA9IChzY3JvbGxQb3M6IG51bWJlcik6IEl0ZW1SYW5nZSA9PiB7XG4gICAgICBjb25zdCBpdGVtU2l6ZSA9IHN0YXRlLml0ZW1TaXplO1xuICAgICAgY29uc3Qgc3RhcnQgPSBNYXRoLmZsb29yKHNjcm9sbFBvcyAvIGl0ZW1TaXplKTtcbiAgICAgIGNvbnN0IHZpc2libGVDb3VudCA9IE1hdGguY2VpbChzdGF0ZS5jb250YWluZXJTaXplIC8gaXRlbVNpemUpO1xuICAgICAgY29uc3QgZW5kID0gTWF0aC5taW4oc3RhcnQgKyB2aXNpYmxlQ291bnQsIHN0YXRlLnRvdGFsSXRlbXMgLSAxKTtcblxuICAgICAgcmV0dXJuIHsgc3RhcnQ6IE1hdGgubWF4KDAsIHN0YXJ0KSwgZW5kOiBNYXRoLm1heCgwLCBlbmQpIH07XG4gICAgfTtcblxuICAgIC8vIEFkZCB2aWV3cG9ydCBBUEkgdG8gY29tcG9uZW50XG4gICAgY29uc3QgYmFzZUNvbXBvbmVudCA9IHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIHZpZXdwb3J0OiB2aWV3cG9ydEFQSSxcbiAgICB9O1xuXG4gICAgLy8gQnVpbGQgdGhlIGVuaGFuY2VtZW50IHBpcGVsaW5lXG4gICAgY29uc3QgZW5oYW5jZXJzOiBBcnJheTwoYzogYW55KSA9PiBhbnk+ID0gW107XG5cbiAgICAvLyBFdmVudHMgc3lzdGVtIChhbHdheXMgZmlyc3QgLSBwcm92aWRlcyBjb21tdW5pY2F0aW9uIGZvciBvdGhlciBmZWF0dXJlcylcbiAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgIHdpdGhFdmVudHMoe1xuICAgICAgICBkZWJ1ZzogY29uZmlnLmRlYnVnLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIEJhc2Ugc2V0dXAgKGNyZWF0ZXMgRE9NIHN0cnVjdHVyZSlcbiAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgIHdpdGhCYXNlKHtcbiAgICAgICAgY2xhc3NOYW1lOiBjb25maWcuY2xhc3NOYW1lLFxuICAgICAgICBvcmllbnRhdGlvbjogY29uZmlnLnNjcm9sbGluZz8ub3JpZW50YXRpb24sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gVmlydHVhbCBzY3JvbGxpbmcgKHJlcXVpcmVkIGZvciBtb3N0IGZlYXR1cmVzKVxuICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgd2l0aFZpcnR1YWwoe1xuICAgICAgICBpdGVtU2l6ZTogY29uZmlnLnZpcnR1YWw/Lml0ZW1TaXplLFxuICAgICAgICBvdmVyc2NhbjogY29uZmlnLnZpcnR1YWw/Lm92ZXJzY2FuLFxuICAgICAgICBvcmllbnRhdGlvbjogY29uZmlnLnNjcm9sbGluZz8ub3JpZW50YXRpb24sXG4gICAgICAgIGF1dG9EZXRlY3RJdGVtU2l6ZTogY29uZmlnLnZpcnR1YWw/LmF1dG9EZXRlY3RJdGVtU2l6ZSxcbiAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4OiAoY29uZmlnIGFzIGFueSkuaW5pdGlhbFNjcm9sbEluZGV4LFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIFNjcm9sbGluZyBiZWhhdmlvclxuICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgd2l0aFNjcm9sbGluZyh7XG4gICAgICAgIG9yaWVudGF0aW9uOiBjb25maWcuc2Nyb2xsaW5nPy5vcmllbnRhdGlvbixcbiAgICAgICAgc2Vuc2l0aXZpdHk6IGNvbmZpZy5zY3JvbGxpbmc/LnNlbnNpdGl2aXR5LFxuICAgICAgICBzbW9vdGhpbmc6IGNvbmZpZy5zY3JvbGxpbmc/LmFuaW1hdGlvbixcbiAgICAgICAgc3RvcE9uQ2xpY2s6IGNvbmZpZy5zY3JvbGxpbmc/LnN0b3BPbkNsaWNrLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIE1vbWVudHVtIHNjcm9sbGluZyAodG91Y2gvZHJhZyBzdXBwb3J0IGZvciBtb2JpbGUpXG4gICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICB3aXRoTW9tZW50dW0oe1xuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICBzdG9wT25DbGljazogY29uZmlnLnNjcm9sbGluZz8uc3RvcE9uQ2xpY2ssXG4gICAgICAgIGRlY2VsZXJhdGlvbjogY29uZmlnLnNjcm9sbGluZz8ubW9tZW50dW0/LmRlY2VsZXJhdGlvbixcbiAgICAgICAgbWluVmVsb2NpdHk6IGNvbmZpZy5zY3JvbGxpbmc/Lm1vbWVudHVtPy5taW5WZWxvY2l0eSxcbiAgICAgICAgbWluRHVyYXRpb246IGNvbmZpZy5zY3JvbGxpbmc/Lm1vbWVudHVtPy5tYXhEdXJhdGlvbixcbiAgICAgICAgbWluVmVsb2NpdHlUaHJlc2hvbGQ6IGNvbmZpZy5zY3JvbGxpbmc/Lm1vbWVudHVtPy52ZWxvY2l0eVRocmVzaG9sZCxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBTY3JvbGxiYXIgKG9wdGlvbmFsKVxuICAgIGlmIChjb25maWcuc2Nyb2xsYmFyPy5lbmFibGVkICE9PSBmYWxzZSkge1xuICAgICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICAgIHdpdGhTY3JvbGxiYXIoe1xuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgYXV0b0hpZGU6IGNvbmZpZy5zY3JvbGxiYXI/LmF1dG9IaWRlLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGNvbGxlY3Rpb24gaWYgY29uZmlndXJlZFxuICAgIGlmIChjb25maWcuY29sbGVjdGlvbj8uYWRhcHRlcikge1xuICAgICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICAgIHdpdGhDb2xsZWN0aW9uKHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiBjb25maWcuY29sbGVjdGlvbi5hZGFwdGVyLFxuICAgICAgICAgIHJhbmdlU2l6ZTogY29uZmlnLnBhZ2luYXRpb24/LmxpbWl0LFxuICAgICAgICAgIHN0cmF0ZWd5OiBjb25maWcucGFnaW5hdGlvbj8uc3RyYXRlZ3kgYXNcbiAgICAgICAgICAgIHwgXCJvZmZzZXRcIlxuICAgICAgICAgICAgfCBcInBhZ2VcIlxuICAgICAgICAgICAgfCBcImN1cnNvclwiXG4gICAgICAgICAgICB8IHVuZGVmaW5lZCxcbiAgICAgICAgICB0cmFuc2Zvcm06IGNvbmZpZy5jb2xsZWN0aW9uPy50cmFuc2Zvcm0sXG4gICAgICAgICAgY2FuY2VsTG9hZFRocmVzaG9sZDogY29uZmlnLnBlcmZvcm1hbmNlPy5jYW5jZWxMb2FkVGhyZXNob2xkLFxuICAgICAgICAgIG1heENvbmN1cnJlbnRSZXF1ZXN0czogY29uZmlnLnBlcmZvcm1hbmNlPy5tYXhDb25jdXJyZW50UmVxdWVzdHMsXG4gICAgICAgICAgZW5hYmxlUmVxdWVzdFF1ZXVlOiBjb25maWcucGVyZm9ybWFuY2U/LmVuYWJsZVJlcXVlc3RRdWV1ZSAhPT0gZmFsc2UsXG4gICAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4OiAoY29uZmlnIGFzIGFueSkuaW5pdGlhbFNjcm9sbEluZGV4LFxuICAgICAgICAgIHNlbGVjdElkOiAoY29uZmlnIGFzIGFueSkuc2VsZWN0SWQsXG4gICAgICAgICAgYXV0b0xvYWQ6IChjb25maWcgYXMgYW55KS5hdXRvTG9hZCAhPT0gZmFsc2UsXG4gICAgICAgICAgYXV0b1NlbGVjdEZpcnN0OiAoY29uZmlnIGFzIGFueSkuYXV0b1NlbGVjdEZpcnN0LFxuICAgICAgICAgIG1heENhY2hlZEl0ZW1zOiBjb25maWcuY2FjaGU/Lm1heEl0ZW1zLFxuICAgICAgICAgIGV2aWN0aW9uQnVmZmVyOiBjb25maWcuY2FjaGU/LmV2aWN0aW9uQnVmZmVyLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gUGxhY2Vob2xkZXJzIChvcHRpb25hbCwgcmVxdWlyZXMgY29sbGVjdGlvbilcbiAgICBpZiAoY29uZmlnLmNvbGxlY3Rpb24/LmFkYXB0ZXIgJiYgY29uZmlnLnBsYWNlaG9sZGVycz8uZW5hYmxlZCAhPT0gZmFsc2UpIHtcbiAgICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgICB3aXRoUGxhY2Vob2xkZXJzKHtcbiAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgIGFuYWx5emVGaXJzdExvYWQ6IGNvbmZpZy5wbGFjZWhvbGRlcnM/LmFuYWx5emVGaXJzdExvYWQgPz8gdHJ1ZSxcbiAgICAgICAgICBtYXNrQ2hhcmFjdGVyOiBjb25maWcucGxhY2Vob2xkZXJzPy5tYXNrQ2hhcmFjdGVyLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gUmVuZGVyaW5nIChhbHdheXMgbGFzdCB0byBoYXZlIGFjY2VzcyB0byBhbGwgZmVhdHVyZXMpXG4gICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICB3aXRoUmVuZGVyaW5nKHtcbiAgICAgICAgdGVtcGxhdGU6IGNvbmZpZy50ZW1wbGF0ZSxcbiAgICAgICAgb3ZlcnNjYW46IGNvbmZpZy52aXJ0dWFsPy5vdmVyc2NhbixcbiAgICAgICAgbWFpbnRhaW5Eb21PcmRlcjogY29uZmlnLnJlbmRlcmluZz8ubWFpbnRhaW5Eb21PcmRlcixcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBDb21wb3NlIGFsbCBlbmhhbmNlcnNcbiAgICBjb25zdCBlbmhhbmNlID0gcGlwZSguLi5lbmhhbmNlcnMpO1xuXG4gICAgLy8gQXBwbHkgZW5oYW5jZW1lbnRzXG4gICAgY29uc3QgZW5oYW5jZWQgPSBlbmhhbmNlKGJhc2VDb21wb25lbnQpO1xuXG4gICAgLy8gQXV0by1pbml0aWFsaXplIGlmIGVsZW1lbnQgaXMgcHJvdmlkZWRcbiAgICBpZiAoZW5oYW5jZWQuZWxlbWVudCkge1xuICAgICAgZW5oYW5jZWQudmlld3BvcnQuaW5pdGlhbGl6ZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBlbmhhbmNlZCBhcyBUICYgVmlld3BvcnRDb21wb25lbnQ7XG4gIH07XG59O1xuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy91dGlscy50c1xuXG4vKipcbiAqIFNoYXJlZCB1dGlsaXRpZXMgZm9yIHZpZXdwb3J0IGZlYXR1cmVzXG4gKiBFbGltaW5hdGVzIGNvZGUgZHVwbGljYXRpb24gYWNyb3NzIGZlYXR1cmVzXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogV3JhcHMgdmlld3BvcnQgaW5pdGlhbGl6YXRpb24gd2l0aCBmZWF0dXJlLXNwZWNpZmljIGxvZ2ljXG4gKiBFbGltaW5hdGVzIHRoZSByZXBlYXRlZCBpbml0aWFsaXphdGlvbiBob29rIHBhdHRlcm5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBJbml0aWFsaXplPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBWaWV3cG9ydENvbXBvbmVudD4oXG4gIGNvbXBvbmVudDogVCxcbiAgZmVhdHVyZUluaXQ6ICgpID0+IHZvaWQsXG4pOiB2b2lkIHtcbiAgY29uc3Qgb3JpZ2luYWxJbml0aWFsaXplID0gY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemU7XG4gIGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplID0gKCkgPT4ge1xuICAgIC8vIENoZWNrIGlmIGFscmVhZHkgaW5pdGlhbGl6ZWQgKHJldHVybnMgZmFsc2UgaWYgYWxyZWFkeSBkb25lKVxuICAgIGNvbnN0IHJlc3VsdCA9IG9yaWdpbmFsSW5pdGlhbGl6ZSgpO1xuICAgIC8vIE9ubHkgcnVuIGZlYXR1cmUgaW5pdCBpZiBiYXNlIGluaXQgYWN0dWFsbHkgcmFuIChkaWRuJ3QgcmV0dXJuIGZhbHNlKVxuICAgIGlmIChyZXN1bHQgIT09IGZhbHNlKSB7XG4gICAgICBmZWF0dXJlSW5pdCgpO1xuICAgIH1cbiAgICAvLyBQcm9wYWdhdGUgdGhlIHJlc3VsdCB0aHJvdWdoIHRoZSBjaGFpbiBzbyBvdXRlciB3cmFwcGVycyBrbm93IHRvIHNraXBcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG4vKipcbiAqIFdyYXBzIGNvbXBvbmVudCBkZXN0cm95IHdpdGggY2xlYW51cCBsb2dpY1xuICogRWxpbWluYXRlcyB0aGUgcmVwZWF0ZWQgZGVzdHJveSBob29rIHBhdHRlcm5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBEZXN0cm95PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgY29tcG9uZW50OiBULFxuICBjbGVhbnVwOiAoKSA9PiB2b2lkLFxuKTogdm9pZCB7XG4gIGlmIChcImRlc3Ryb3lcIiBpbiBjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQuZGVzdHJveTtcbiAgICAoY29tcG9uZW50IGFzIGFueSkuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgIGNsZWFudXAoKTtcbiAgICAgIG9yaWdpbmFsRGVzdHJveT8uKCk7XG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgdmlld3BvcnQgc3RhdGUgd2l0aCBwcm9wZXIgdHlwaW5nXG4gKiBFbGltaW5hdGVzIHJlcGVhdGVkIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Vmlld3BvcnRTdGF0ZShjb21wb25lbnQ6IFZpZXdwb3J0Q29tcG9uZW50KTogYW55IHtcbiAgcmV0dXJuIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zdGF0ZTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYW4gaXRlbSBpcyBhIHBsYWNlaG9sZGVyXG4gKiBFbGltaW5hdGVzIGR1cGxpY2F0ZWQgcGxhY2Vob2xkZXIgZGV0ZWN0aW9uIGxvZ2ljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BsYWNlaG9sZGVyKGl0ZW06IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGl0ZW0gJiZcbiAgICB0eXBlb2YgaXRlbSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIChpdGVtLl9wbGFjZWhvbGRlciA9PT0gdHJ1ZSB8fCBpdGVtW1wiX3BsYWNlaG9sZGVyXCJdID09PSB0cnVlKSAvLyBTdXBwb3J0IGJvdGggYWNjZXNzIHBhdHRlcm5zXG4gICk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJhbmdlIGtleSBmb3IgZGVkdXBsaWNhdGlvblxuICogVXNlZCBieSBtdWx0aXBsZSBmZWF0dXJlcyBmb3IgdHJhY2tpbmcgcmFuZ2VzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSYW5nZUtleShyYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3JhbmdlLnN0YXJ0fS0ke3JhbmdlLmVuZH1gO1xufVxuXG4vKipcbiAqIENsYW1wcyBhIHZhbHVlIGJldHdlZW4gbWluIGFuZCBtYXhcbiAqIFVzZWQgYnkgbXVsdGlwbGUgZmVhdHVyZXMgZm9yIGJvdW5kYXJ5IGNoZWNraW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFtcCh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbihtYXgsIHZhbHVlKSk7XG59XG5cbi8qKlxuICogU3RvcmVzIGEgZnVuY3Rpb24gcmVmZXJlbmNlIG9uIHRoZSBjb21wb25lbnQgZm9yIGxhdGVyIGFjY2Vzc1xuICogRWxpbWluYXRlcyBwYXR0ZXJuIGxpa2UgKGNvbXBvbmVudCBhcyBhbnkpLl9mZWF0dXJlRnVuY3Rpb24gPSBmblxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RvcmVGZWF0dXJlRnVuY3Rpb248VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KFxuICBjb21wb25lbnQ6IFQsXG4gIG5hbWU6IHN0cmluZyxcbiAgZm46IEZ1bmN0aW9uLFxuKTogdm9pZCB7XG4gIChjb21wb25lbnQgYXMgYW55KVtuYW1lXSA9IGZuO1xufVxuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9iYXNlLnRzXG5cbi8qKlxuICogQmFzZSBWaWV3cG9ydCBGZWF0dXJlIC0gU2V0cyB1cCBjb3JlIHZpZXdwb3J0IHN0cnVjdHVyZVxuICogUHJvdmlkZXMgdGhlIGZvdW5kYXRpb24gZm9yIG90aGVyIHZpZXdwb3J0IGZlYXR1cmVzXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyB3cmFwSW5pdGlhbGl6ZSwgZ2V0Vmlld3BvcnRTdGF0ZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZUNvbmZpZyB7XG4gIGNsYXNzTmFtZT86IHN0cmluZztcbiAgb3JpZW50YXRpb24/OiBcInZlcnRpY2FsXCIgfCBcImhvcml6b250YWxcIjtcbn1cblxuLyoqXG4gKiBCYXNlIGZlYXR1cmUgZm9yIHZpZXdwb3J0XG4gKiBTZXRzIHVwIHRoZSBET00gc3RydWN0dXJlIGFuZCBjb3JlIHN0eWxlc1xuICovXG5leHBvcnQgY29uc3Qgd2l0aEJhc2UgPSAoY29uZmlnOiBCYXNlQ29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KGNvbXBvbmVudDogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHsgY2xhc3NOYW1lID0gXCJtdHJsLXZpZXdwb3J0XCIsIG9yaWVudGF0aW9uID0gXCJ2ZXJ0aWNhbFwiIH0gPSBjb25maWc7XG5cbiAgICAvLyBVc2UgdGhlIHNoYXJlZCB3cmFwcGVyIHV0aWxpdHlcbiAgICB3cmFwSW5pdGlhbGl6ZShjb21wb25lbnQsICgpID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBjb21wb25lbnQuZWxlbWVudDtcbiAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuO1xuXG4gICAgICAvLyBDcmVhdGUgdmlld3BvcnQgc3RydWN0dXJlXG4gICAgICBsZXQgdmlld3BvcnRFbGVtZW50ID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBcIi5tdHJsLXZpZXdwb3J0XCJcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgIGlmICghdmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5jbGFzc05hbWUgPSBjbGFzc05hbWU7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gYFxuICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgYDtcblxuICAgICAgICAvLyBTZXQgb3JpZW50YXRpb25cbiAgICAgICAgdmlld3BvcnRFbGVtZW50LnNldEF0dHJpYnV0ZShcImRhdGEtb3JpZW50YXRpb25cIiwgb3JpZW50YXRpb24pO1xuXG4gICAgICAgIC8vIENyZWF0ZSBpdGVtcyBjb250YWluZXJcbiAgICAgICAgY29uc3QgaXRlbXNDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBpdGVtc0NvbnRhaW5lci5jbGFzc05hbWUgPSBcIm10cmwtdmlld3BvcnQtaXRlbXNcIjtcbiAgICAgICAgaXRlbXNDb250YWluZXIuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGA7XG5cbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFwcGVuZENoaWxkKGl0ZW1zQ29udGFpbmVyKTtcbiAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZCh2aWV3cG9ydEVsZW1lbnQpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSB2aWV3cG9ydCBzdGF0ZSB3aXRoIGNvbnRhaW5lcnMgdXNpbmcgdXRpbGl0eVxuICAgICAgICBjb25zdCBzdGF0ZSA9IGdldFZpZXdwb3J0U3RhdGUoY29tcG9uZW50KTtcbiAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgc3RhdGUudmlld3BvcnRFbGVtZW50ID0gdmlld3BvcnRFbGVtZW50O1xuICAgICAgICAgIHN0YXRlLml0ZW1zQ29udGFpbmVyID0gaXRlbXNDb250YWluZXI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdG9yZSByZWZlcmVuY2VzIG9uIGNvbXBvbmVudFxuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkudmlld3BvcnRFbGVtZW50ID0gdmlld3BvcnRFbGVtZW50O1xuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuaXRlbXNDb250YWluZXIgPSBpdGVtc0NvbnRhaW5lcjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH07XG59O1xuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9jb25zdGFudHMudHNcblxuLyoqXG4gKiBWaWV3cG9ydCBDb25zdGFudHNcbiAqIENlbnRyYWxpemVkIGNvbnN0YW50cyBmb3IgYWxsIHZpZXdwb3J0IGZ1bmN0aW9uYWxpdHlcbiAqIENvbnNvbGlkYXRlZCBmcm9tIHZpZXdwb3J0LCB2aWV3cG9ydC9mZWF0dXJlcywgYW5kIGxpc3QtbWFuYWdlciBjb25zdGFudHNcbiAqL1xuXG5leHBvcnQgY29uc3QgVklFV1BPUlRfQ09OU1RBTlRTID0ge1xuICAvLyBWaXJ0dWFsIHNjcm9sbGluZyBkZWZhdWx0c1xuICBWSVJUVUFMX1NDUk9MTDoge1xuICAgIERFRkFVTFRfSVRFTV9TSVpFOiA0OCxcbiAgICBPVkVSU0NBTl9CVUZGRVI6IDIsXG4gICAgU0NST0xMX1NFTlNJVElWSVRZOiAwLjcsXG4gICAgTUFYX1ZJUlRVQUxfU0laRTogMTAwICogMTAwMCAqIDEwMDAsIC8vIDEwME0gcGl4ZWxzIC0gbW9kZXJuIGJyb3dzZXJzIGNhbiBoYW5kbGUgdGhpc1xuICAgIEFVVE9fREVURUNUX0lURU1fU0laRTogdHJ1ZSwgLy8gRW5hYmxlIGF1dG9tYXRpYyBpdGVtIHNpemUgZGV0ZWN0aW9uXG4gIH0sXG5cbiAgLy8gU2Nyb2xsaW5nIHNldHRpbmdzXG4gIFNDUk9MTElORzoge1xuICAgIE9WRVJTQ0FOOiAxLCAvLyBGcm9tIGZlYXR1cmVzL2NvbnN0YW50c1xuICB9LFxuXG4gIC8vIFJlbmRlcmluZyBzZXR0aW5nc1xuICBSRU5ERVJJTkc6IHtcbiAgICAvLyBFbGVtZW50IHJlY3ljbGluZ1xuICAgIERFRkFVTFRfTUFYX1BPT0xfU0laRTogMTAwLFxuICAgIENMQVNTRVM6IHtcbiAgICAgIElURU06IFwidmlld3BvcnQtaXRlbVwiLFxuICAgIH0sXG4gIH0sXG5cbiAgLy8gTG9hZGluZyBzZXR0aW5nc1xuICBMT0FESU5HOiB7XG4gICAgQ0FOQ0VMX1RIUkVTSE9MRDogMjUsIC8vIHB4L21zIC0gdmVsb2NpdHkgYWJvdmUgd2hpY2ggbG9hZHMgY2FuY2VsXG4gICAgTUFYX0NPTkNVUlJFTlRfUkVRVUVTVFM6IDEsIC8vIFBhcmFsbGVsIHJlcXVlc3RzIGFsbG93ZWRcbiAgICBERUZBVUxUX1JBTkdFX1NJWkU6IDIwLCAvLyBJdGVtcyBwZXIgcmVxdWVzdFxuICAgIERFQk9VTkNFX0xPQURJTkc6IDE1MCwgLy8gRGVib3VuY2UgZGVsYXkgKG1zKVxuICAgIE1JTl9SQU5HRV9TSVpFOiAxMCwgLy8gTWluaW11bSBpdGVtcyBwZXIgbG9hZFxuICAgIE1BWF9SQU5HRV9TSVpFOiAxMDAsIC8vIE1heGltdW0gaXRlbXMgcGVyIGxvYWRcbiAgICBSRVFVRVNUX1RJTUVPVVQ6IDUwMDAsIC8vIFJlcXVlc3QgdGltZW91dCAobXMpXG4gICAgUkVUUllfQVRURU1QVFM6IDIsIC8vIEZhaWxlZCByZXF1ZXN0IHJldHJpZXNcbiAgICBSRVRSWV9ERUxBWTogMTAwMCwgLy8gRGVsYXkgYmV0d2VlbiByZXRyaWVzIChtcylcbiAgfSxcblxuICAvLyBSZXF1ZXN0IHF1ZXVlIGNvbmZpZ3VyYXRpb24gKGZyb20gZmVhdHVyZXMvY29uc3RhbnRzKVxuICBSRVFVRVNUX1FVRVVFOiB7XG4gICAgRU5BQkxFRDogdHJ1ZSwgLy8gRW5hYmxlIHJlcXVlc3QgcXVldWluZ1xuICAgIE1BWF9RVUVVRV9TSVpFOiAxLCAvLyBNYXggcXVldWVkIHJlcXVlc3RzXG4gICAgTUFYX0FDVElWRV9SRVFVRVNUUzogMiwgLy8gTWF4IGNvbmN1cnJlbnQgYWN0aXZlIHJlcXVlc3RzXG4gIH0sXG5cbiAgLy8gUGxhY2Vob2xkZXIgc2V0dGluZ3NcbiAgUExBQ0VIT0xERVI6IHtcbiAgICBNQVNLX0NIQVJBQ1RFUjogXCJYXCIsIC8vIFVwZGF0ZWQgZnJvbSBsaXN0LW1hbmFnZXJcbiAgICBDTEFTUzogXCJ2aWV3cG9ydC1pdGVtLS1wbGFjZWhvbGRlclwiLFxuICAgIE1BWF9TQU1QTEVfU0laRTogMjAsXG4gICAgUExBQ0VIT0xERVJfRkxBRzogXCJfcGxhY2Vob2xkZXJcIixcbiAgICBSQU5ET01fTEVOR1RIX1ZBUklBTkNFOiB0cnVlLFxuICB9LFxuXG4gIC8vIFNwZWVkIHRyYWNraW5nIChmcm9tIGxpc3QtbWFuYWdlcilcbiAgU1BFRURfVFJBQ0tJTkc6IHtcbiAgICAvLyBWZWxvY2l0eSBjYWxjdWxhdGlvblxuICAgIERFQ0VMRVJBVElPTl9GQUNUT1I6IDAuODUsIC8vIHZlbG9jaXR5IGRlY2F5IHBlciBmcmFtZVxuICB9LFxuXG4gIC8vIE1vbWVudHVtIHNldHRpbmdzXG4gIE1PTUVOVFVNOiB7XG4gICAgRU5BQkxFRDogZmFsc2UsIC8vIEVuYWJsZSBtb21lbnR1bSBieSBkZWZhdWx0XG4gICAgREVDRUxFUkFUSU9OX0ZBQ1RPUjogMC45NSwgLy8gSG93IHF1aWNrbHkgdmVsb2NpdHkgZGVjcmVhc2VzIHBlciBmcmFtZSAoaGlnaGVyID0gbG9uZ2VyIGNvYXN0KVxuICAgIE1JTl9WRUxPQ0lUWTogMC4xLCAvLyBNaW5pbXVtIHZlbG9jaXR5IGJlZm9yZSBzdG9wcGluZyAocHgvbXMpXG4gICAgTUlOX0RVUkFUSU9OOiA3NTAsIC8vIE1heGltdW0gZ2VzdHVyZSBkdXJhdGlvbiB0byB0cmlnZ2VyIG1vbWVudHVtIChtcylcbiAgICBNSU5fVkVMT0NJVFlfVEhSRVNIT0xEOiAwLjQsIC8vIE1pbmltdW0gdmVsb2NpdHkgdG8gdHJpZ2dlciBtb21lbnR1bSAocHgvbXMpXG4gICAgRlJBTUVfVElNRTogMTYsIC8vIEFzc3VtZWQgZnJhbWUgdGltZSBmb3IgY2FsY3VsYXRpb25zIChtcylcbiAgfSxcblxuICAvLyBJbml0aWFsIGxvYWQgY29uZmlndXJhdGlvbiAoZnJvbSBsaXN0LW1hbmFnZXIpXG4gIElOSVRJQUxfTE9BRDoge1xuICAgIFNUUkFURUdZOiBcInBsYWNlaG9sZGVyc1wiLCAvLyBcInBsYWNlaG9sZGVyc1wiIHwgXCJkaXJlY3RcIiB8IFwicHJvZ3Jlc3NpdmVcIlxuICAgIFZJRVdQT1JUX01VTFRJUExJRVI6IDEuNSwgLy8gbG9hZCAxLjV4IHZpZXdwb3J0IGNhcGFjaXR5XG4gICAgTUlOX0lURU1TOiAxMCxcbiAgICBNQVhfSVRFTVM6IDEwMCxcbiAgICBQTEFDRUhPTERFUl9DT1VOVDogMjAsIC8vIGRlZmF1bHQgcGxhY2Vob2xkZXIgY291bnRcbiAgICBTSE9XX0xPQURJTkdfU1RBVEU6IHRydWUsXG4gICAgTE9BRElOR19ERUxBWTogMTAwLCAvLyBtcyAtIGRlbGF5IGJlZm9yZSBzaG93aW5nIGxvYWRpbmcgc3RhdGVcbiAgfSxcblxuICAvLyBTZWxlY3Rpb24gc2V0dGluZ3NcbiAgU0VMRUNUSU9OOiB7XG4gICAgU0VMRUNURURfQ0xBU1M6IFwidmlld3BvcnQtaXRlbS0tc2VsZWN0ZWRcIixcbiAgfSxcblxuICAvLyBTY3JvbGxiYXIgc2V0dGluZ3MgKGZyb20gbGlzdC1tYW5hZ2VyKVxuICBTQ1JPTExCQVI6IHtcbiAgICAvLyBDU1MgY2xhc3Nlc1xuICAgIENMQVNTRVM6IHtcbiAgICAgIFNDUk9MTEJBUjogXCJ2aWV3cG9ydF9fc2Nyb2xsYmFyXCIsXG4gICAgICBTQ1JPTExCQVJfVFJBQ0s6IFwidmlld3BvcnRfX3Njcm9sbGJhci10cmFja1wiLFxuICAgICAgU0NST0xMQkFSX1RIVU1COiBcInZpZXdwb3J0X19zY3JvbGxiYXItdGh1bWJcIixcbiAgICAgIFNDUk9MTEJBUl9WSVNJQkxFOiBcInZpZXdwb3J0X19zY3JvbGxiYXItLXZpc2libGVcIixcbiAgICAgIFNDUk9MTEJBUl9EUkFHR0lORzogXCJ2aWV3cG9ydF9fc2Nyb2xsYmFyLS1kcmFnZ2luZ1wiLFxuICAgICAgU0NST0xMQkFSX1RIVU1CX0RSQUdHSU5HOiBcInZpZXdwb3J0X19zY3JvbGxiYXItdGh1bWItLWRyYWdnaW5nXCIsXG4gICAgfSxcbiAgfSxcblxuICAvLyBPcmllbnRhdGlvbiAoZnJvbSBsaXN0LW1hbmFnZXIpXG4gIE9SSUVOVEFUSU9OOiB7XG4gICAgREVGQVVMVF9PUklFTlRBVElPTjogXCJ2ZXJ0aWNhbFwiLFxuICAgIERFRkFVTFRfQ1JPU1NfQVhJU19BTElHTk1FTlQ6IFwic3RyZXRjaFwiLFxuICAgIFJFVkVSU0VfRElSRUNUSU9OOiBmYWxzZSxcbiAgfSxcblxuICBQQUdJTkFUSU9OOiB7XG4gICAgREVGQVVMVF9TVFJBVEVHWTogXCJvZmZzZXRcIiBhcyBcIm9mZnNldFwiIHwgXCJwYWdlXCIgfCBcImN1cnNvclwiLFxuICAgIERFRkFVTFRfTElNSVQ6IDIwLFxuICAgIFNUUkFURUdJRVM6IHtcbiAgICAgIFBBR0U6IFwicGFnZVwiIGFzIGNvbnN0LFxuICAgICAgT0ZGU0VUOiBcIm9mZnNldFwiIGFzIGNvbnN0LFxuICAgICAgQ1VSU09SOiBcImN1cnNvclwiIGFzIGNvbnN0LFxuICAgIH0sXG4gICAgQ1VSU09SX0NMRUFOVVBfSU5URVJWQUw6IDYwMDAwLCAvLyBDbGVhbiB1cCBvbGQgY3Vyc29ycyBldmVyeSBtaW51dGVcbiAgICBNQVhfQ1VSU09SX01BUF9TSVpFOiAxMDAwLCAvLyBNYXhpbXVtIG51bWJlciBvZiBjdXJzb3JzIHRvIGtlZXAgaW4gbWVtb3J5XG4gICAgLy8gQ3Vyc29yLXNwZWNpZmljIHZpcnR1YWwgc2l6aW5nXG4gICAgQ1VSU09SX1NDUk9MTF9NQVJHSU5fTVVMVElQTElFUjogMywgLy8gTXVsdGlwbHkgcmFuZ2VTaXplIGJ5IHRoaXMgZm9yIHNjcm9sbCBtYXJnaW5cbiAgICBDVVJTT1JfTUlOX1ZJUlRVQUxfU0laRV9NVUxUSVBMSUVSOiAzLCAvLyBNaW5pbXVtIHZpcnR1YWwgc2l6ZSBhcyBtdWx0aXBsaWVyIG9mIHJhbmdlU2l6ZVxuICB9LFxufTtcblxuLyoqXG4gKiBUeXBlIGZvciBvdmVycmlkaW5nIGNvbnN0YW50cyBhdCBydW50aW1lXG4gKi9cbmV4cG9ydCB0eXBlIFZpZXdwb3J0Q29uc3RhbnRzID0gdHlwZW9mIFZJRVdQT1JUX0NPTlNUQU5UUztcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gbWVyZ2UgdXNlciBjb25zdGFudHMgd2l0aCBkZWZhdWx0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VDb25zdGFudHMoXG4gIHVzZXJDb25zdGFudHM6IFBhcnRpYWw8Vmlld3BvcnRDb25zdGFudHM+ID0ge30sXG4pOiBWaWV3cG9ydENvbnN0YW50cyB7XG4gIHJldHVybiB7XG4gICAgLi4uVklFV1BPUlRfQ09OU1RBTlRTLFxuICAgIC4uLnVzZXJDb25zdGFudHMsXG4gIH07XG59XG4iLAogICAgIi8qKlxuICogVmlydHVhbCBGZWF0dXJlIC0gQ29yZSB2aXJ0dWFsIHNjcm9sbGluZyBjYWxjdWxhdGlvbnNcbiAqIEhhbmRsZXMgdmlzaWJsZSByYW5nZSBjYWxjdWxhdGlvbiBhbmQgdG90YWwgdmlydHVhbCBzaXplIG1hbmFnZW1lbnRcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZJRVdQT1JUX0NPTlNUQU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHdyYXBJbml0aWFsaXplLCBnZXRWaWV3cG9ydFN0YXRlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBWaXJ0dWFsQ29uZmlnIHtcbiAgaXRlbVNpemU/OiBudW1iZXI7XG4gIG92ZXJzY2FuPzogbnVtYmVyO1xuICBvcmllbnRhdGlvbj86IFwidmVydGljYWxcIiB8IFwiaG9yaXpvbnRhbFwiO1xuICBhdXRvRGV0ZWN0SXRlbVNpemU/OiBib29sZWFuO1xuICBkZWJ1Zz86IGJvb2xlYW47XG4gIGluaXRpYWxTY3JvbGxJbmRleD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBWaXJ0dWFsIHNjcm9sbGluZyBmZWF0dXJlIGZvciB2aWV3cG9ydFxuICogSGFuZGxlcyB2aXNpYmxlIHJhbmdlIGNhbGN1bGF0aW9ucyB3aXRoIGNvbXByZXNzaW9uIGZvciBsYXJnZSBkYXRhc2V0c1xuICovXG5leHBvcnQgY29uc3Qgd2l0aFZpcnR1YWwgPSAoY29uZmlnOiBWaXJ0dWFsQ29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KGNvbXBvbmVudDogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGl0ZW1TaXplLFxuICAgICAgb3ZlcnNjYW4gPSBWSUVXUE9SVF9DT05TVEFOVFMuVklSVFVBTF9TQ1JPTEwuT1ZFUlNDQU5fQlVGRkVSLFxuICAgICAgb3JpZW50YXRpb24gPSBcInZlcnRpY2FsXCIsXG4gICAgICBhdXRvRGV0ZWN0SXRlbVNpemUgPSBpdGVtU2l6ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gVklFV1BPUlRfQ09OU1RBTlRTLlZJUlRVQUxfU0NST0xMLkFVVE9fREVURUNUX0lURU1fU0laRVxuICAgICAgICA6IGZhbHNlLFxuICAgICAgZGVidWcgPSBmYWxzZSxcbiAgICAgIGluaXRpYWxTY3JvbGxJbmRleCA9IDAsXG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIFVzZSBwcm92aWRlZCBpdGVtU2l6ZSBvciBkZWZhdWx0LCBidXQgbWFyayBpZiB3ZSBzaG91bGQgYXV0by1kZXRlY3RcbiAgICBjb25zdCBpbml0aWFsSXRlbVNpemUgPVxuICAgICAgaXRlbVNpemUgfHwgVklFV1BPUlRfQ09OU1RBTlRTLlZJUlRVQUxfU0NST0xMLkRFRkFVTFRfSVRFTV9TSVpFO1xuXG4gICAgY29uc3QgTUFYX1ZJUlRVQUxfU0laRSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5WSVJUVUFMX1NDUk9MTC5NQVhfVklSVFVBTF9TSVpFO1xuICAgIGxldCB2aWV3cG9ydFN0YXRlOiBhbnk7XG4gICAgbGV0IGhhc0NhbGN1bGF0ZWRJdGVtU2l6ZSA9IGZhbHNlO1xuICAgIGxldCBoYXNSZWNhbGN1bGF0ZWRTY3JvbGxGb3JDb21wcmVzc2lvbiA9IGZhbHNlOyAvLyBUcmFjayBpZiB3ZSd2ZSByZWNhbGN1bGF0ZWQgc2Nyb2xsIHBvc2l0aW9uIGZvciBjb21wcmVzc2lvblxuXG4gICAgLy8gSW5pdGlhbGl6ZSB1c2luZyBzaGFyZWQgd3JhcHBlclxuICAgIHdyYXBJbml0aWFsaXplKGNvbXBvbmVudCwgKCkgPT4ge1xuICAgICAgdmlld3BvcnRTdGF0ZSA9IGdldFZpZXdwb3J0U3RhdGUoY29tcG9uZW50KTtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSkgcmV0dXJuO1xuXG4gICAgICBPYmplY3QuYXNzaWduKHZpZXdwb3J0U3RhdGUsIHtcbiAgICAgICAgaXRlbVNpemU6IGluaXRpYWxJdGVtU2l6ZSxcbiAgICAgICAgb3ZlcnNjYW4sXG4gICAgICAgIGNvbnRhaW5lclNpemU6XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS52aWV3cG9ydEVsZW1lbnQ/LltcbiAgICAgICAgICAgIG9yaWVudGF0aW9uID09PSBcImhvcml6b250YWxcIiA/IFwib2Zmc2V0V2lkdGhcIiA6IFwib2Zmc2V0SGVpZ2h0XCJcbiAgICAgICAgICBdIHx8IDYwMCxcbiAgICAgIH0pO1xuXG4gICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplKHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyk7XG5cbiAgICAgIC8vIElmIHdlIGhhdmUgYW4gaW5pdGlhbCBzY3JvbGwgaW5kZXgsIGNhbGN1bGF0ZSBpbml0aWFsIHNjcm9sbCBwb3NpdGlvblxuICAgICAgLy8gTm90ZTogV2Ugc3RvcmUgdGhlIGluaXRpYWxTY3JvbGxJbmRleCB0byB1c2UgZGlyZWN0bHkgaW4gcmFuZ2UgY2FsY3VsYXRpb25zXG4gICAgICAvLyBiZWNhdXNlIHNjcm9sbCBwb3NpdGlvbiBtYXkgYmUgY29tcHJlc3NlZCBmb3IgbGFyZ2UgbGlzdHNcbiAgICAgIGxldCBpbml0aWFsU2Nyb2xsUG9zaXRpb24gPSB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uIHx8IDA7XG5cbiAgICAgIGlmIChpbml0aWFsU2Nyb2xsSW5kZXggPiAwKSB7XG4gICAgICAgIC8vIFN0b3JlIHRoZSB0YXJnZXQgaW5kZXggZm9yIHVzZSBpbiByYW5nZSBjYWxjdWxhdGlvbnNcbiAgICAgICAgKHZpZXdwb3J0U3RhdGUgYXMgYW55KS50YXJnZXRTY3JvbGxJbmRleCA9IGluaXRpYWxTY3JvbGxJbmRleDtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgc2Nyb2xsIHBvc2l0aW9uIChtYXkgYmUgY29tcHJlc3NlZCBmb3IgbGFyZ2UgbGlzdHMpXG4gICAgICAgIGluaXRpYWxTY3JvbGxQb3NpdGlvbiA9XG4gICAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4ICogKHZpZXdwb3J0U3RhdGUuaXRlbVNpemUgfHwgaW5pdGlhbEl0ZW1TaXplKTtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiA9IGluaXRpYWxTY3JvbGxQb3NpdGlvbjtcblxuICAgICAgICAvLyBOb3RpZnkgc2Nyb2xsaW5nIGZlYXR1cmUgdG8gc3luYyBpdHMgbG9jYWwgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgIC8vIFVzZSBzZXRUaW1lb3V0IHRvIGVuc3VyZSBzY3JvbGxpbmcgZmVhdHVyZSBoYXMgaW5pdGlhbGl6ZWRcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnNjcm9sbC1wb3NpdGlvbi1zeW5jXCIsIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBpbml0aWFsU2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgICBzb3VyY2U6IFwiaW5pdGlhbC1zY3JvbGwtaW5kZXhcIixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZVZpc2libGVSYW5nZShpbml0aWFsU2Nyb2xsUG9zaXRpb24pO1xuXG4gICAgICAvLyBFbnN1cmUgY29udGFpbmVyIHNpemUgaXMgbWVhc3VyZWQgYWZ0ZXIgRE9NIGlzIHJlYWR5XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICB1cGRhdGVDb250YWluZXJTaXplKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIEhlbHBlciBmdW5jdGlvbnNcbiAgICBjb25zdCBnZXRDb21wcmVzc2lvblJhdGlvID0gKCk6IG51bWJlciA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGU/LnZpcnR1YWxUb3RhbFNpemUpIHJldHVybiAxO1xuICAgICAgY29uc3QgYWN0dWFsU2l6ZSA9IHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyAqIHZpZXdwb3J0U3RhdGUuaXRlbVNpemU7XG4gICAgICByZXR1cm4gYWN0dWFsU2l6ZSA8PSBNQVhfVklSVFVBTF9TSVpFID8gMSA6IE1BWF9WSVJUVUFMX1NJWkUgLyBhY3R1YWxTaXplO1xuICAgIH07XG5cbiAgICBjb25zdCBsb2cgPSAobWVzc2FnZTogc3RyaW5nLCBkYXRhPzogYW55KSA9PiB7XG4gICAgICBpZiAoZGVidWcpIGNvbnNvbGUubG9nKGBbVmlydHVhbF0gJHttZXNzYWdlfWAsIGRhdGEpO1xuICAgIH07XG5cbiAgICAvLyBDYWxjdWxhdGUgdmlzaWJsZSByYW5nZVxuICAgIGNvbnN0IGNhbGN1bGF0ZVZpc2libGVSYW5nZSA9IChcbiAgICAgIHNjcm9sbFBvc2l0aW9uOiBudW1iZXIsXG4gICAgKTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9ID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJbVmlydHVhbF0gTm8gdmlld3BvcnQgc3RhdGUsIHJldHVybmluZyBlbXB0eSByYW5nZVwiKTtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IDAsIGVuZDogMCB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGNvbnRhaW5lclNpemUsIHRvdGFsSXRlbXMgfSA9IHZpZXdwb3J0U3RhdGU7XG5cbiAgICAgIC8vIEVhcmx5IHJldHVybnMgZm9yIGludmFsaWQgc3RhdGVzXG4gICAgICBpZiAoXG4gICAgICAgICFjb250YWluZXJTaXplIHx8XG4gICAgICAgIGNvbnRhaW5lclNpemUgPD0gMCB8fFxuICAgICAgICAhdG90YWxJdGVtcyB8fFxuICAgICAgICB0b3RhbEl0ZW1zIDw9IDBcbiAgICAgICkge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIGFuIGluaXRpYWxTY3JvbGxJbmRleCwgdXNlIGl0IHRvIGNhbGN1bGF0ZSB0aGUgcmFuZ2VcbiAgICAgICAgLy8gZXZlbiB3aGVuIHRvdGFsSXRlbXMgaXMgMCAobm90IHlldCBsb2FkZWQgZnJvbSBBUEkpXG4gICAgICAgIGlmIChpbml0aWFsU2Nyb2xsSW5kZXggPiAwKSB7XG4gICAgICAgICAgY29uc3QgdmlzaWJsZUNvdW50ID0gTWF0aC5jZWlsKFxuICAgICAgICAgICAgKGNvbnRhaW5lclNpemUgfHwgNjAwKSAvXG4gICAgICAgICAgICAgICh2aWV3cG9ydFN0YXRlLml0ZW1TaXplIHx8IGluaXRpYWxJdGVtU2l6ZSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBzdGFydCA9IE1hdGgubWF4KDAsIGluaXRpYWxTY3JvbGxJbmRleCAtIG92ZXJzY2FuKTtcbiAgICAgICAgICBjb25zdCBlbmQgPSBpbml0aWFsU2Nyb2xsSW5kZXggKyB2aXNpYmxlQ291bnQgKyBvdmVyc2NhbjtcbiAgICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgICAgIH1cbiAgICAgICAgbG9nKGBJbnZhbGlkIHN0YXRlOiBjb250YWluZXI9JHtjb250YWluZXJTaXplfSwgaXRlbXM9JHt0b3RhbEl0ZW1zfWApO1xuICAgICAgICByZXR1cm4geyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZpcnR1YWxTaXplID1cbiAgICAgICAgdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplIHx8IHRvdGFsSXRlbXMgKiB2aWV3cG9ydFN0YXRlLml0ZW1TaXplO1xuICAgICAgY29uc3QgdmlzaWJsZUNvdW50ID0gTWF0aC5jZWlsKGNvbnRhaW5lclNpemUgLyB2aWV3cG9ydFN0YXRlLml0ZW1TaXplKTtcbiAgICAgIGNvbnN0IGNvbXByZXNzaW9uUmF0aW8gPSBnZXRDb21wcmVzc2lvblJhdGlvKCk7XG5cbiAgICAgIGxldCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcjtcblxuICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIHRhcmdldCBzY3JvbGwgaW5kZXggKGZvciBpbml0aWFsU2Nyb2xsSW5kZXggd2l0aCBjb21wcmVzc2lvbilcbiAgICAgIGNvbnN0IHRhcmdldFNjcm9sbEluZGV4ID0gKHZpZXdwb3J0U3RhdGUgYXMgYW55KS50YXJnZXRTY3JvbGxJbmRleDtcblxuICAgICAgaWYgKGNvbXByZXNzaW9uUmF0aW8gPCAxKSB7XG4gICAgICAgIC8vIENvbXByZXNzZWQgc3BhY2UgY2FsY3VsYXRpb25cbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHRhcmdldFNjcm9sbEluZGV4LCB1c2UgaXQgZGlyZWN0bHkgaW5zdGVhZCBvZiBjYWxjdWxhdGluZyBmcm9tIHNjcm9sbCBwb3NpdGlvblxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgd2Ugc2hvdyB0aGUgY29ycmVjdCBpdGVtcyBldmVuIHdoZW4gdmlydHVhbCBzcGFjZSBpcyBjb21wcmVzc2VkXG4gICAgICAgIGlmICh0YXJnZXRTY3JvbGxJbmRleCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldFNjcm9sbEluZGV4ID4gMCkge1xuICAgICAgICAgIHN0YXJ0ID0gTWF0aC5tYXgoMCwgdGFyZ2V0U2Nyb2xsSW5kZXggLSBvdmVyc2Nhbik7XG4gICAgICAgICAgZW5kID0gTWF0aC5taW4oXG4gICAgICAgICAgICB0b3RhbEl0ZW1zIC0gMSxcbiAgICAgICAgICAgIHRhcmdldFNjcm9sbEluZGV4ICsgdmlzaWJsZUNvdW50ICsgb3ZlcnNjYW4sXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBDbGVhciB0YXJnZXRTY3JvbGxJbmRleCBhZnRlciBmaXJzdCB1c2Ugc28gbm9ybWFsIHNjcm9sbGluZyB3b3Jrc1xuICAgICAgICAgIGRlbGV0ZSAodmlld3BvcnRTdGF0ZSBhcyBhbnkpLnRhcmdldFNjcm9sbEluZGV4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsU2l6ZTtcbiAgICAgICAgICBjb25zdCBleGFjdEluZGV4ID0gc2Nyb2xsUmF0aW8gKiB0b3RhbEl0ZW1zO1xuICAgICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihleGFjdEluZGV4KTtcbiAgICAgICAgICBlbmQgPSBNYXRoLmNlaWwoZXhhY3RJbmRleCkgKyB2aXNpYmxlQ291bnQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOZWFyLWJvdHRvbSBoYW5kbGluZ1xuICAgICAgICBjb25zdCBtYXhTY3JvbGwgPSB2aXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemU7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlRnJvbUJvdHRvbSA9IG1heFNjcm9sbCAtIHNjcm9sbFBvc2l0aW9uO1xuXG4gICAgICAgIGlmIChkaXN0YW5jZUZyb21Cb3R0b20gPD0gY29udGFpbmVyU2l6ZSAmJiBkaXN0YW5jZUZyb21Cb3R0b20gPj0gLTEpIHtcbiAgICAgICAgICBjb25zdCBpdGVtc0F0Qm90dG9tID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgIGNvbnRhaW5lclNpemUgLyB2aWV3cG9ydFN0YXRlLml0ZW1TaXplLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgZmlyc3RWaXNpYmxlQXRCb3R0b20gPSBNYXRoLm1heCgwLCB0b3RhbEl0ZW1zIC0gaXRlbXNBdEJvdHRvbSk7XG4gICAgICAgICAgY29uc3QgaW50ZXJwb2xhdGlvbiA9IE1hdGgubWF4KFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIE1hdGgubWluKDEsIDEgLSBkaXN0YW5jZUZyb21Cb3R0b20gLyBjb250YWluZXJTaXplKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgc3RhcnQgPSBNYXRoLmZsb29yKFxuICAgICAgICAgICAgc3RhcnQgKyAoZmlyc3RWaXNpYmxlQXRCb3R0b20gLSBzdGFydCkgKiBpbnRlcnBvbGF0aW9uLFxuICAgICAgICAgICk7XG4gICAgICAgICAgZW5kID1cbiAgICAgICAgICAgIGRpc3RhbmNlRnJvbUJvdHRvbSA8PSAxXG4gICAgICAgICAgICAgID8gdG90YWxJdGVtcyAtIDFcbiAgICAgICAgICAgICAgOiBNYXRoLm1pbih0b3RhbEl0ZW1zIC0gMSwgc3RhcnQgKyB2aXNpYmxlQ291bnQgKyBvdmVyc2Nhbik7XG5cbiAgICAgICAgICBsb2coXCJOZWFyIGJvdHRvbSBjYWxjdWxhdGlvbjpcIiwge1xuICAgICAgICAgICAgZGlzdGFuY2VGcm9tQm90dG9tLFxuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbixcbiAgICAgICAgICAgIHN0YXJ0LFxuICAgICAgICAgICAgZW5kLFxuICAgICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwbHkgb3ZlcnNjYW5cbiAgICAgICAgc3RhcnQgPSBNYXRoLm1heCgwLCBzdGFydCAtIG92ZXJzY2FuKTtcbiAgICAgICAgZW5kID0gTWF0aC5taW4odG90YWxJdGVtcyAtIDEsIGVuZCArIG92ZXJzY2FuKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpcmVjdCBjYWxjdWxhdGlvblxuICAgICAgICBzdGFydCA9IE1hdGgubWF4KFxuICAgICAgICAgIDAsXG4gICAgICAgICAgTWF0aC5mbG9vcihzY3JvbGxQb3NpdGlvbiAvIHZpZXdwb3J0U3RhdGUuaXRlbVNpemUpIC0gb3ZlcnNjYW4sXG4gICAgICAgICk7XG4gICAgICAgIGVuZCA9IE1hdGgubWluKHRvdGFsSXRlbXMgLSAxLCBzdGFydCArIHZpc2libGVDb3VudCArIG92ZXJzY2FuICogMik7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIG91dHB1dFxuICAgICAgaWYgKGlzTmFOKHN0YXJ0KSB8fCBpc05hTihlbmQpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbVmlydHVhbF0gTmFOIGluIHJhbmdlIGNhbGN1bGF0aW9uOlwiLCB7XG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgY29udGFpbmVyU2l6ZSxcbiAgICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICAgIGl0ZW1TaXplOiB2aWV3cG9ydFN0YXRlLml0ZW1TaXplLFxuICAgICAgICAgIGNvbXByZXNzaW9uUmF0aW8sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgICB9XG5cbiAgICAgIC8vIGxvZyhgUmFuZ2U6ICR7c3RhcnR9LSR7ZW5kfSAoc2Nyb2xsOiAke3Njcm9sbFBvc2l0aW9ufSlgKTtcblxuICAgICAgLy8gU3RyYXRlZ2ljIGxvZyBmb3IgbGFzdCByYW5nZVxuICAgICAgLy8gaWYgKGVuZCA+PSB0b3RhbEl0ZW1zIC0gMTApIHtcbiAgICAgIC8vICAgY29uc29sZS5sb2coXG4gICAgICAvLyAgICAgYFtWaXJ0dWFsXSBOZWFyIGVuZCByYW5nZTogJHtzdGFydH0tJHtlbmR9LCB0b3RhbEl0ZW1zPSR7dG90YWxJdGVtc30sIGxhc3RJdGVtUG9zPSR7XG4gICAgICAvLyAgICAgICBlbmQgKiB2aWV3cG9ydFN0YXRlLml0ZW1TaXplXG4gICAgICAvLyAgICAgfXB4LCB2aXJ0dWFsU2l6ZT0ke3ZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZX1weGBcbiAgICAgIC8vICAgKTtcbiAgICAgIC8vIH1cblxuICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICAgIH07XG5cbiAgICAvLyBDYWxjdWxhdGUgYWN0dWFsIHZpc2libGUgcmFuZ2UgKHdpdGhvdXQgb3ZlcnNjYW4gYnVmZmVyKVxuICAgIGNvbnN0IGNhbGN1bGF0ZUFjdHVhbFZpc2libGVSYW5nZSA9IChzY3JvbGxQb3NpdGlvbjogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUpIHJldHVybiB7IHN0YXJ0OiAwLCBlbmQ6IDAgfTtcblxuICAgICAgY29uc3QgeyBjb250YWluZXJTaXplLCB0b3RhbEl0ZW1zIH0gPSB2aWV3cG9ydFN0YXRlO1xuICAgICAgaWYgKCFjb250YWluZXJTaXplIHx8ICF0b3RhbEl0ZW1zKSByZXR1cm4geyBzdGFydDogMCwgZW5kOiAwIH07XG5cbiAgICAgIGNvbnN0IGl0ZW1TaXplID0gdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZTtcbiAgICAgIGNvbnN0IHZpc2libGVDb3VudCA9IE1hdGguY2VpbChjb250YWluZXJTaXplIC8gaXRlbVNpemUpO1xuICAgICAgY29uc3QgY29tcHJlc3Npb25SYXRpbyA9IHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZVxuICAgICAgICA/ICh0b3RhbEl0ZW1zICogaXRlbVNpemUpIC8gdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplXG4gICAgICAgIDogMTtcblxuICAgICAgbGV0IHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyO1xuXG4gICAgICBpZiAoY29tcHJlc3Npb25SYXRpbyA8IDEpIHtcbiAgICAgICAgLy8gQ29tcHJlc3NlZCBzcGFjZSAtIGNhbGN1bGF0ZSBiYXNlZCBvbiBzY3JvbGwgcmF0aW9cbiAgICAgICAgY29uc3QgdmlydHVhbFNpemUgPVxuICAgICAgICAgIHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZSB8fCB0b3RhbEl0ZW1zICogaXRlbVNpemU7XG4gICAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsU2l6ZTtcbiAgICAgICAgc3RhcnQgPSBNYXRoLmZsb29yKHNjcm9sbFJhdGlvICogdG90YWxJdGVtcyk7XG4gICAgICAgIGVuZCA9IE1hdGgubWluKHRvdGFsSXRlbXMgLSAxLCBzdGFydCArIHZpc2libGVDb3VudCAtIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRGlyZWN0IGNhbGN1bGF0aW9uXG4gICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihzY3JvbGxQb3NpdGlvbiAvIGl0ZW1TaXplKTtcbiAgICAgICAgZW5kID0gTWF0aC5taW4odG90YWxJdGVtcyAtIDEsIHN0YXJ0ICsgdmlzaWJsZUNvdW50IC0gMSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVuc3VyZSB2YWxpZCByYW5nZVxuICAgICAgc3RhcnQgPSBNYXRoLm1heCgwLCBzdGFydCk7XG4gICAgICBlbmQgPSBNYXRoLm1heChzdGFydCwgZW5kKTtcblxuICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICAgIH07XG5cbiAgICAvLyBVcGRhdGUgZnVuY3Rpb25zXG4gICAgY29uc3QgdXBkYXRlVmlzaWJsZVJhbmdlID0gKHNjcm9sbFBvc2l0aW9uOiBudW1iZXIpID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSkgcmV0dXJuO1xuICAgICAgdmlld3BvcnRTdGF0ZS52aXNpYmxlUmFuZ2UgPSBjYWxjdWxhdGVWaXNpYmxlUmFuZ2Uoc2Nyb2xsUG9zaXRpb24pO1xuXG4gICAgICAvLyBERUJVRzogTG9nIHdobyBjYWxscyB1cGRhdGVWaXNpYmxlUmFuZ2Ugd2l0aCAwIHdoZW4gaXQgc2hvdWxkIGJlIG5vbi16ZXJvXG5cbiAgICAgIC8vIENhbGN1bGF0ZSBhY3R1YWwgdmlzaWJsZSByYW5nZSAod2l0aG91dCBvdmVyc2NhbikgZm9yIFVJIGRpc3BsYXlcbiAgICAgIGNvbnN0IGFjdHVhbFZpc2libGVSYW5nZSA9IGNhbGN1bGF0ZUFjdHVhbFZpc2libGVSYW5nZShzY3JvbGxQb3NpdGlvbik7XG5cbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgcmFuZ2U6IHZpZXdwb3J0U3RhdGUudmlzaWJsZVJhbmdlLFxuICAgICAgICB2aXNpYmxlUmFuZ2U6IGFjdHVhbFZpc2libGVSYW5nZSxcbiAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIHRvdGFsIHZpcnR1YWwgc2l6ZVxuICAgIGNvbnN0IHVwZGF0ZVRvdGFsVmlydHVhbFNpemUgPSAodG90YWxJdGVtczogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUpIHJldHVybjtcblxuICAgICAgY29uc3Qgb2xkU2l6ZSA9IHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZTtcbiAgICAgIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyA9IHRvdGFsSXRlbXM7XG4gICAgICBjb25zdCBhY3R1YWxTaXplID0gdG90YWxJdGVtcyAqIHZpZXdwb3J0U3RhdGUuaXRlbVNpemU7XG5cbiAgICAgIC8vIEdldCBwYWRkaW5nIGZyb20gdGhlIGl0ZW1zIGNvbnRhaW5lciBpZiBhdmFpbGFibGVcbiAgICAgIGxldCB0b3RhbFBhZGRpbmcgPSAwO1xuICAgICAgaWYgKHZpZXdwb3J0U3RhdGUuaXRlbXNDb250YWluZXIpIHtcbiAgICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKFxuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuaXRlbXNDb250YWluZXIsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdUb3AgPSBwYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUucGFkZGluZ1RvcCkgfHwgMDtcbiAgICAgICAgY29uc3QgcGFkZGluZ0JvdHRvbSA9IHBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5wYWRkaW5nQm90dG9tKSB8fCAwO1xuICAgICAgICB0b3RhbFBhZGRpbmcgPSBwYWRkaW5nVG9wICsgcGFkZGluZ0JvdHRvbTtcbiAgICAgIH1cblxuICAgICAgLy8gSW5jbHVkZSBwYWRkaW5nIGluIHRoZSB2aXJ0dWFsIHNpemVcbiAgICAgIHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZSA9IE1hdGgubWluKFxuICAgICAgICBhY3R1YWxTaXplICsgdG90YWxQYWRkaW5nLFxuICAgICAgICBNQVhfVklSVFVBTF9TSVpFLFxuICAgICAgKTtcblxuICAgICAgLy8gU3RyYXRlZ2ljIGxvZyBmb3IgZGVidWdnaW5nIGdhcCBpc3N1ZVxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbVmlydHVhbF0gVG90YWwgc2l6ZSB1cGRhdGU6IGl0ZW1zPSR7dG90YWxJdGVtc30sIGl0ZW1TaXplPSR7dmlld3BvcnRTdGF0ZS5pdGVtU2l6ZX1weCwgcGFkZGluZz0ke3RvdGFsUGFkZGluZ31weCwgdmlydHVhbFNpemU9JHt2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemV9cHggKHdhcyAke29sZFNpemV9cHgpYFxuICAgICAgLy8gKTtcblxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnZpcnR1YWwtc2l6ZS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZTogdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplLFxuICAgICAgICB0b3RhbEl0ZW1zOiB0b3RhbEl0ZW1zLFxuICAgICAgICBjb21wcmVzc2lvblJhdGlvOiBnZXRDb21wcmVzc2lvblJhdGlvKCksXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIGNvbnRhaW5lciBzaXplXG4gICAgY29uc3QgdXBkYXRlQ29udGFpbmVyU2l6ZSA9ICgpID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSB8fCAhdmlld3BvcnRTdGF0ZS52aWV3cG9ydEVsZW1lbnQpIHJldHVybjtcblxuICAgICAgY29uc3Qgc2l6ZSA9XG4gICAgICAgIHZpZXdwb3J0U3RhdGUudmlld3BvcnRFbGVtZW50W1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUub3JpZW50YXRpb24gPT09IFwiaG9yaXpvbnRhbFwiXG4gICAgICAgICAgICA/IFwib2Zmc2V0V2lkdGhcIlxuICAgICAgICAgICAgOiBcIm9mZnNldEhlaWdodFwiXG4gICAgICAgIF07XG5cbiAgICAgIC8vIExvZyB0aGUgYWN0dWFsIG1lYXN1cmVtZW50XG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtWaXJ0dWFsXSBDb250YWluZXIgc2l6ZSBtZWFzdXJlZDogJHtzaXplfXB4IGZyb20gdmlld3BvcnQgZWxlbWVudGBcbiAgICAgIC8vICk7XG5cbiAgICAgIGlmIChzaXplICE9PSB2aWV3cG9ydFN0YXRlLmNvbnRhaW5lclNpemUpIHtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS5jb250YWluZXJTaXplID0gc2l6ZTtcbiAgICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG4gICAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUodmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zKTsgLy8gQWxzbyB1cGRhdGUgdmlydHVhbCBzaXplXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpjb250YWluZXItc2l6ZS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgICBjb250YWluZXJTaXplOiBzaXplLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gT3ZlcnJpZGUgdmlld3BvcnQgbWV0aG9kc1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5nZXRWaXNpYmxlUmFuZ2UgPSAoKSA9PlxuICAgICAgdmlld3BvcnRTdGF0ZT8udmlzaWJsZVJhbmdlIHx8XG4gICAgICBjYWxjdWxhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZT8uc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG5cbiAgICAvLyBFdmVudCBsaXN0ZW5lcnNcbiAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnNjcm9sbFwiLCAoZGF0YTogYW55KSA9PlxuICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKGRhdGEucG9zaXRpb24pLFxuICAgICk7XG5cbiAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0Oml0ZW1zLWNoYW5nZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKGRhdGEudG90YWxJdGVtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUoZGF0YS50b3RhbEl0ZW1zKTtcbiAgICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGU/LnNjcm9sbFBvc2l0aW9uIHx8IDApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gTGlzdGVuIGZvciB0b3RhbCBpdGVtcyBjaGFuZ2VzIChpbXBvcnRhbnQgZm9yIGN1cnNvciBwYWdpbmF0aW9uKVxuICAgIC8vIE5vdGU6IHNldFRvdGFsSXRlbXMoKSB1cGRhdGVzIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyBCRUZPUkUgZW1pdHRpbmcgdGhpcyBldmVudCxcbiAgICAvLyBzbyB3ZSBjYW4ndCByZWx5IG9uIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyB0byBkZXRlY3QgdGhlIGZpcnN0IHRvdGFsLlxuICAgIC8vIEluc3RlYWQgd2UgdXNlIHRoZSBoYXNSZWNhbGN1bGF0ZWRTY3JvbGxGb3JDb21wcmVzc2lvbiBmbGFnLlxuICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6dG90YWwtaXRlbXMtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICBpZiAoZGF0YS50b3RhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICAgIC8vIEZJWDogV2hlbiB3ZSBmaXJzdCByZWNlaXZlIHRvdGFsSXRlbXMgd2l0aCBpbml0aWFsU2Nyb2xsSW5kZXggYW5kIGNvbXByZXNzaW9uLFxuICAgICAgLy8gcmVjYWxjdWxhdGUgc2Nyb2xsIHBvc2l0aW9uIHRvIGFjY291bnQgZm9yIGNvbXByZXNzaW9uLlxuICAgICAgLy8gV2l0aG91dCB0aGlzLCBpbml0aWFsU2Nyb2xsSW5kZXggY2FsY3VsYXRlcyBwb3NpdGlvbiBhcyBpbmRleCAqIGl0ZW1TaXplLFxuICAgICAgLy8gYnV0IHJlbmRlcmluZyB1c2VzIGNvbXByZXNzZWQgc3BhY2UsIGNhdXNpbmcgaXRlbXMgdG8gYXBwZWFyIG9mZi1zY3JlZW4uXG4gICAgICAvL1xuICAgICAgLy8gV2UgY2hlY2sgdGhpcyBCRUZPUkUgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZSBiZWNhdXNlIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGVcbiAgICAgIC8vIHNjcm9sbCBwb3NpdGlvbiBiYXNlZCBvbiB0aGUgbmV3IHRvdGFsLCBhbmQgdGhlIGZsYWcgZW5zdXJlcyB3ZSBvbmx5IGRvIHRoaXMgb25jZS5cbiAgICAgIGlmIChcbiAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4ID4gMCAmJlxuICAgICAgICAhaGFzUmVjYWxjdWxhdGVkU2Nyb2xsRm9yQ29tcHJlc3Npb24gJiZcbiAgICAgICAgZGF0YS50b3RhbCA+IDBcbiAgICAgICkge1xuICAgICAgICBjb25zdCBhY3R1YWxUb3RhbFNpemUgPSBkYXRhLnRvdGFsICogdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZTtcbiAgICAgICAgY29uc3QgaXNDb21wcmVzc2VkID0gYWN0dWFsVG90YWxTaXplID4gTUFYX1ZJUlRVQUxfU0laRTtcblxuICAgICAgICBpZiAoaXNDb21wcmVzc2VkKSB7XG4gICAgICAgICAgLy8gUmVjYWxjdWxhdGUgc2Nyb2xsIHBvc2l0aW9uIHVzaW5nIGNvbXByZXNzaW9uLWF3YXJlIGZvcm11bGFcbiAgICAgICAgICAvLyBTYW1lIGZvcm11bGEgdXNlZCBpbiBzY3JvbGxUb0luZGV4XG4gICAgICAgICAgY29uc3QgcmF0aW8gPSBpbml0aWFsU2Nyb2xsSW5kZXggLyBkYXRhLnRvdGFsO1xuICAgICAgICAgIGNvbnN0IGNvbXByZXNzZWRQb3NpdGlvbiA9IHJhdGlvICogTUFYX1ZJUlRVQUxfU0laRTtcblxuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPSBjb21wcmVzc2VkUG9zaXRpb247XG5cbiAgICAgICAgICAvLyBOb3RpZnkgc2Nyb2xsaW5nIGZlYXR1cmUgdG8gc3luYyBpdHMgbG9jYWwgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnNjcm9sbC1wb3NpdGlvbi1zeW5jXCIsIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBjb21wcmVzc2VkUG9zaXRpb24sXG4gICAgICAgICAgICBzb3VyY2U6IFwiY29tcHJlc3Npb24tcmVjYWxjdWxhdGlvblwiLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gQ2xlYXIgdGFyZ2V0U2Nyb2xsSW5kZXggc2luY2Ugd2UndmUgbm93IGNvcnJlY3RseSBjYWxjdWxhdGVkIHRoZSBzY3JvbGwgcG9zaXRpb25cbiAgICAgICAgICAvLyBUaGUgbm9ybWFsIGNvbXByZXNzZWQgc2Nyb2xsaW5nIGZvcm11bGEgd2lsbCBub3cgd29yayBjb3JyZWN0bHlcbiAgICAgICAgICBkZWxldGUgKHZpZXdwb3J0U3RhdGUgYXMgYW55KS50YXJnZXRTY3JvbGxJbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hcmsgYXMgZG9uZSBldmVuIGlmIG5vdCBjb21wcmVzc2VkIC0gd2Ugb25seSB3YW50IHRvIGRvIHRoaXMgY2hlY2sgb25jZVxuICAgICAgICBoYXNSZWNhbGN1bGF0ZWRTY3JvbGxGb3JDb21wcmVzc2lvbiA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUoZGF0YS50b3RhbCk7XG4gICAgICB1cGRhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZT8uc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG5cbiAgICAgIC8vIFRyaWdnZXIgYSByZW5kZXIgdG8gdXBkYXRlIHRoZSB2aWV3XG4gICAgICBjb21wb25lbnQudmlld3BvcnQ/LnJlbmRlckl0ZW1zPy4oKTtcbiAgICB9KTtcblxuICAgIC8vIExpc3RlbiBmb3IgY29udGFpbmVyIHNpemUgY2hhbmdlcyB0byByZWNhbGN1bGF0ZSB2aXJ0dWFsIHNpemVcbiAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OmNvbnRhaW5lci1zaXplLWNoYW5nZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKHZpZXdwb3J0U3RhdGUgJiYgZGF0YS5jb250YWluZXJTaXplICE9PSB2aWV3cG9ydFN0YXRlLmNvbnRhaW5lclNpemUpIHtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS5jb250YWluZXJTaXplID0gZGF0YS5jb250YWluZXJTaXplO1xuICAgICAgICAvLyBSZWNhbGN1bGF0ZSB2aXJ0dWFsIHNpemUgd2l0aCBuZXcgY29udGFpbmVyIHNpemVcbiAgICAgICAgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZSh2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMpO1xuICAgICAgICB1cGRhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiB8fCAwKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbXBvbmVudC5vbj8uKFwiY29sbGVjdGlvbjpyYW5nZS1sb2FkZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBkYXRhLnRvdGFsICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgZGF0YS50b3RhbCAhPT0gdmlld3BvcnRTdGF0ZT8udG90YWxJdGVtc1xuICAgICAgKSB7XG4gICAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUoZGF0YS50b3RhbCk7XG4gICAgICB9XG4gICAgICB1cGRhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZT8uc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG4gICAgICBjb21wb25lbnQudmlld3BvcnQ/LnJlbmRlckl0ZW1zPy4oKTtcbiAgICB9KTtcblxuICAgIC8vIExpc3RlbiBmb3IgZmlyc3QgaXRlbXMgcmVuZGVyZWQgdG8gY2FsY3VsYXRlIGl0ZW0gc2l6ZSAoaWYgYXV0by1kZXRlY3Rpb24gaXMgZW5hYmxlZClcbiAgICBpZiAoYXV0b0RldGVjdEl0ZW1TaXplKSB7XG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0Oml0ZW1zLXJlbmRlcmVkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFoYXNDYWxjdWxhdGVkSXRlbVNpemUgJiZcbiAgICAgICAgICBkYXRhLmVsZW1lbnRzPy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgdmlld3BvcnRTdGF0ZVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBDYWxjdWxhdGUgYXZlcmFnZSBpdGVtIHNpemUgZnJvbSBmaXJzdCByZW5kZXJlZCBiYXRjaFxuICAgICAgICAgIGNvbnN0IHNpemVzOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICAgIGNvbnN0IHNpemVQcm9wZXJ0eSA9XG4gICAgICAgICAgICBvcmllbnRhdGlvbiA9PT0gXCJob3Jpem9udGFsXCIgPyBcIm9mZnNldFdpZHRoXCIgOiBcIm9mZnNldEhlaWdodFwiO1xuXG4gICAgICAgICAgZGF0YS5lbGVtZW50cy5mb3JFYWNoKChlbGVtZW50OiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IGVsZW1lbnRbc2l6ZVByb3BlcnR5XTtcbiAgICAgICAgICAgIGlmIChzaXplID4gMCkge1xuICAgICAgICAgICAgICBzaXplcy5wdXNoKHNpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHNpemVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGF2Z1NpemUgPSBNYXRoLnJvdW5kKFxuICAgICAgICAgICAgICBzaXplcy5yZWR1Y2UoKHN1bSwgc2l6ZSkgPT4gc3VtICsgc2l6ZSwgMCkgLyBzaXplcy5sZW5ndGgsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNJdGVtU2l6ZSA9IHZpZXdwb3J0U3RhdGUuaXRlbVNpemU7XG4gICAgICAgICAgICB2aWV3cG9ydFN0YXRlLml0ZW1TaXplID0gYXZnU2l6ZTtcblxuICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBpbml0aWFsU2Nyb2xsSW5kZXgsIHJlY2FsY3VsYXRlIHNjcm9sbCBwb3NpdGlvblxuICAgICAgICAgICAgLy8gYmFzZWQgb24gdGhlIG5ld2x5IGRldGVjdGVkIGl0ZW0gc2l6ZVxuICAgICAgICAgICAgaWYgKGluaXRpYWxTY3JvbGxJbmRleCA+IDAgJiYgYXZnU2l6ZSAhPT0gcHJldmlvdXNJdGVtU2l6ZSkge1xuICAgICAgICAgICAgICBjb25zdCBuZXdTY3JvbGxQb3NpdGlvbiA9IGluaXRpYWxTY3JvbGxJbmRleCAqIGF2Z1NpemU7XG4gICAgICAgICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPSBuZXdTY3JvbGxQb3NpdGlvbjtcblxuICAgICAgICAgICAgICAvLyBOb3RpZnkgc2Nyb2xsaW5nIGZlYXR1cmUgdG8gc3luYyBpdHMgbG9jYWwgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpzY3JvbGwtcG9zaXRpb24tc3luY1wiLCB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IG5ld1Njcm9sbFBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogXCJpdGVtLXNpemUtZGV0ZWN0ZWRcIixcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlY2FsY3VsYXRlIGV2ZXJ5dGhpbmcgd2l0aCBuZXcgc2l6ZVxuICAgICAgICAgICAgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZSh2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMpO1xuICAgICAgICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG5cbiAgICAgICAgICAgIC8vIFJlLXJlbmRlciB0byBhZGp1c3QgcG9zaXRpb25zXG4gICAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQ/LnJlbmRlckl0ZW1zPy4oKTtcblxuICAgICAgICAgICAgLy8gRW1pdCBldmVudCBmb3Igc2l6ZSBjaGFuZ2VcbiAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDppdGVtLXNpemUtZGV0ZWN0ZWRcIiwge1xuICAgICAgICAgICAgICBwcmV2aW91c1NpemU6IGluaXRpYWxJdGVtU2l6ZSxcbiAgICAgICAgICAgICAgZGV0ZWN0ZWRTaXplOiBhdmdTaXplLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGhhc0NhbGN1bGF0ZWRJdGVtU2l6ZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBFeHBvc2UgdmlydHVhbCBBUElcbiAgICBjb25zdCBjb21wcmVzc2lvblJhdGlvID0gZ2V0Q29tcHJlc3Npb25SYXRpbygpO1xuICAgIChjb21wb25lbnQgYXMgYW55KS52aXJ0dWFsID0ge1xuICAgICAgY2FsY3VsYXRlVmlzaWJsZVJhbmdlLFxuICAgICAgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZSxcbiAgICAgIGdldFRvdGFsVmlydHVhbFNpemU6ICgpID0+IHZpZXdwb3J0U3RhdGU/LnZpcnR1YWxUb3RhbFNpemUgfHwgMCxcbiAgICAgIGdldENvbnRhaW5lclNpemU6ICgpID0+IHZpZXdwb3J0U3RhdGU/LmNvbnRhaW5lclNpemUgfHwgMCxcbiAgICAgIHVwZGF0ZUNvbnRhaW5lclNpemU6IChzaXplOiBudW1iZXIpID0+IHtcbiAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLmNvbnRhaW5lclNpemUgPSBzaXplO1xuICAgICAgICAgIHVwZGF0ZVZpc2libGVSYW5nZSh2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uIHx8IDApO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZ2V0SXRlbVNpemU6ICgpID0+IHZpZXdwb3J0U3RhdGU/Lml0ZW1TaXplIHx8IGluaXRpYWxJdGVtU2l6ZSxcbiAgICAgIGNhbGN1bGF0ZUluZGV4RnJvbVBvc2l0aW9uOiAocG9zaXRpb246IG51bWJlcikgPT5cbiAgICAgICAgTWF0aC5mbG9vcihcbiAgICAgICAgICBwb3NpdGlvbiAvXG4gICAgICAgICAgICAoKHZpZXdwb3J0U3RhdGU/Lml0ZW1TaXplIHx8IGluaXRpYWxJdGVtU2l6ZSkgKiBjb21wcmVzc2lvblJhdGlvKSxcbiAgICAgICAgKSxcbiAgICAgIGNhbGN1bGF0ZVBvc2l0aW9uRm9ySW5kZXg6IChpbmRleDogbnVtYmVyKSA9PlxuICAgICAgICBpbmRleCAqICh2aWV3cG9ydFN0YXRlPy5pdGVtU2l6ZSB8fCBpbml0aWFsSXRlbVNpemUpICogY29tcHJlc3Npb25SYXRpbyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8qKlxuICogU2Nyb2xsaW5nIEZlYXR1cmUgLSBWaXJ0dWFsIHNjcm9sbGluZyB3aXRoIGludGVncmF0ZWQgdmVsb2NpdHkgdHJhY2tpbmdcbiAqIEhhbmRsZXMgd2hlZWwgZXZlbnRzLCB0b3VjaC9tb3VzZSBldmVudHMsIHNjcm9sbCBwb3NpdGlvbiBtYW5hZ2VtZW50LCB2ZWxvY2l0eSBtZWFzdXJlbWVudCwgYW5kIG1vbWVudHVtIHNjcm9sbGluZ1xuICovXG5cbmltcG9ydCB0eXBlIHsgVmlld3BvcnRDb250ZXh0LCBWaWV3cG9ydENvbXBvbmVudCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVklFV1BPUlRfQ09OU1RBTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgd3JhcEluaXRpYWxpemUsIGdldFZpZXdwb3J0U3RhdGUsIGNsYW1wIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTY3JvbGxpbmdDb25maWcge1xuICBvcmllbnRhdGlvbj86IFwidmVydGljYWxcIiB8IFwiaG9yaXpvbnRhbFwiO1xuICBzZW5zaXRpdml0eT86IG51bWJlcjtcbiAgc21vb3RoaW5nPzogYm9vbGVhbjtcbiAgaWRsZVRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKiBTdG9wIHNjcm9sbGluZyB3aGVuIGNsaWNraW5nIG9uIHRoZSB2aWV3cG9ydCAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgc3RvcE9uQ2xpY2s/OiBib29sZWFuO1xufVxuXG4vLyBTcGVlZCB0cmFja2VyIGludGVyZmFjZVxuaW50ZXJmYWNlIFNwZWVkVHJhY2tlciB7XG4gIHZlbG9jaXR5OiBudW1iZXI7XG4gIGxhc3RQb3NpdGlvbjogbnVtYmVyO1xuICBsYXN0VGltZTogbnVtYmVyO1xuICBkaXJlY3Rpb246IFwiZm9yd2FyZFwiIHwgXCJiYWNrd2FyZFwiO1xuICBzYW1wbGVzOiBBcnJheTx7IHBvc2l0aW9uOiBudW1iZXI7IHRpbWU6IG51bWJlciB9Pjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHNwZWVkIHRyYWNrZXJcbiAqL1xuY29uc3QgY3JlYXRlU3BlZWRUcmFja2VyID0gKCk6IFNwZWVkVHJhY2tlciA9PiAoe1xuICB2ZWxvY2l0eTogMCxcbiAgbGFzdFBvc2l0aW9uOiAwLFxuICBsYXN0VGltZTogRGF0ZS5ub3coKSxcbiAgZGlyZWN0aW9uOiBcImZvcndhcmRcIixcbiAgc2FtcGxlczogW10sXG59KTtcblxuLyoqXG4gKiBVcGRhdGVzIHNwZWVkIHRyYWNrZXIgd2l0aCBuZXcgcG9zaXRpb25cbiAqL1xuY29uc3QgdXBkYXRlU3BlZWRUcmFja2VyID0gKFxuICB0cmFja2VyOiBTcGVlZFRyYWNrZXIsXG4gIG5ld1Bvc2l0aW9uOiBudW1iZXIsXG4gIHByZXZpb3VzUG9zaXRpb246IG51bWJlcixcbik6IFNwZWVkVHJhY2tlciA9PiB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGNvbnN0IHRpbWVEZWx0YSA9IG5vdyAtIHRyYWNrZXIubGFzdFRpbWU7XG5cbiAgaWYgKHRpbWVEZWx0YSA9PT0gMCkgcmV0dXJuIHRyYWNrZXI7XG5cbiAgY29uc3QgcG9zaXRpb25EZWx0YSA9IG5ld1Bvc2l0aW9uIC0gcHJldmlvdXNQb3NpdGlvbjtcbiAgLy8gS2VlcCB2ZWxvY2l0eSBzaWduZWQgKHBvc2l0aXZlID0gZm9yd2FyZC9kb3duLCBuZWdhdGl2ZSA9IGJhY2t3YXJkL3VwKVxuICBjb25zdCBpbnN0YW50VmVsb2NpdHkgPSBwb3NpdGlvbkRlbHRhIC8gdGltZURlbHRhO1xuXG4gIC8vIEFkZCBuZXcgc2FtcGxlXG4gIGNvbnN0IHNhbXBsZXMgPSBbLi4udHJhY2tlci5zYW1wbGVzLCB7IHBvc2l0aW9uOiBuZXdQb3NpdGlvbiwgdGltZTogbm93IH1dO1xuXG4gIC8vIEtlZXAgb25seSByZWNlbnQgc2FtcGxlcyAobGFzdCAxMDBtcylcbiAgY29uc3QgcmVjZW50U2FtcGxlcyA9IHNhbXBsZXMuZmlsdGVyKChzKSA9PiBub3cgLSBzLnRpbWUgPCAxMDApO1xuXG4gIC8vIENhbGN1bGF0ZSBhdmVyYWdlIHZlbG9jaXR5IGZyb20gcmVjZW50IHNhbXBsZXMgKHByZXNlcnZpbmcgc2lnbi9kaXJlY3Rpb24pXG4gIGxldCBhdmdWZWxvY2l0eSA9IGluc3RhbnRWZWxvY2l0eTtcbiAgaWYgKHJlY2VudFNhbXBsZXMubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IG9sZGVzdFNhbXBsZSA9IHJlY2VudFNhbXBsZXNbMF07XG4gICAgY29uc3QgdG90YWxEaXN0YW5jZSA9IG5ld1Bvc2l0aW9uIC0gb2xkZXN0U2FtcGxlLnBvc2l0aW9uOyAvLyBTaWduZWQgZGlzdGFuY2VcbiAgICBjb25zdCB0b3RhbFRpbWUgPSBub3cgLSBvbGRlc3RTYW1wbGUudGltZTtcbiAgICBhdmdWZWxvY2l0eSA9IHRvdGFsVGltZSA+IDAgPyB0b3RhbERpc3RhbmNlIC8gdG90YWxUaW1lIDogaW5zdGFudFZlbG9jaXR5O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB2ZWxvY2l0eTogYXZnVmVsb2NpdHksXG4gICAgbGFzdFBvc2l0aW9uOiBuZXdQb3NpdGlvbixcbiAgICBsYXN0VGltZTogbm93LFxuICAgIGRpcmVjdGlvbjogcG9zaXRpb25EZWx0YSA+PSAwID8gXCJmb3J3YXJkXCIgOiBcImJhY2t3YXJkXCIsXG4gICAgc2FtcGxlczogcmVjZW50U2FtcGxlcyxcbiAgfTtcbn07XG5cbi8qKlxuICogU2Nyb2xsaW5nIGZlYXR1cmUgZm9yIHZpZXdwb3J0XG4gKiBIYW5kbGVzIHdoZWVsIGV2ZW50cywgdmVsb2NpdHkgdHJhY2tpbmcsIGFuZCBpZGxlIGRldGVjdGlvblxuICovXG5leHBvcnQgY29uc3Qgd2l0aFNjcm9sbGluZyA9IChjb25maWc6IFNjcm9sbGluZ0NvbmZpZyA9IHt9KSA9PiB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50Pihjb21wb25lbnQ6IFQpOiBUID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBvcmllbnRhdGlvbiA9IFwidmVydGljYWxcIixcbiAgICAgIHNlbnNpdGl2aXR5ID0gVklFV1BPUlRfQ09OU1RBTlRTLlZJUlRVQUxfU0NST0xMLlNDUk9MTF9TRU5TSVRJVklUWSxcbiAgICAgIHNtb290aGluZyA9IGZhbHNlLFxuICAgICAgaWRsZVRpbWVvdXQgPSAxMDAsIC8vIERlZmF1bHQgaWRsZSB0aW1lb3V0IGluIG1zXG4gICAgICBzdG9wT25DbGljayA9IHRydWUsIC8vIFN0b3Agc2Nyb2xsaW5nIG9uIGNsaWNrIGJ5IGRlZmF1bHRcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gU3RhdGVcbiAgICBsZXQgc2Nyb2xsUG9zaXRpb24gPSAwO1xuICAgIGxldCB0b3RhbFZpcnR1YWxTaXplID0gMDtcbiAgICBsZXQgY29udGFpbmVyU2l6ZSA9IDA7XG4gICAgbGV0IGlzU2Nyb2xsaW5nID0gZmFsc2U7XG4gICAgbGV0IGlzU2Nyb2xsZWRGcm9tVG9wID0gZmFsc2U7IC8vIFRyYWNrIGlmIHNjcm9sbGVkIGF3YXkgZnJvbSB0b3BcbiAgICBsZXQgbGFzdFNjcm9sbFRpbWUgPSAwO1xuICAgIGxldCBzcGVlZFRyYWNrZXIgPSBjcmVhdGVTcGVlZFRyYWNrZXIoKTtcbiAgICBsZXQgaWRsZVRpbWVvdXRJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGlkbGVDaGVja0ZyYW1lOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgbGFzdElkbGVDaGVja1Bvc2l0aW9uID0gMDtcbiAgICBsZXQgaGFzRW1pdHRlZElkbGUgPSBmYWxzZTsgLy8gVHJhY2sgaWYgd2UndmUgYWxyZWFkeSBlbWl0dGVkIGlkbGVcbiAgICBsZXQgYW5jaG9yUG9zaXRpb246IG51bWJlciB8IG51bGwgPSBudWxsOyAvLyBBbmNob3IgcG9zaXRpb24gdG8gbWFpbnRhaW4gb24gY2xpY2sgKGZvciBzdG9wT25DbGljaylcbiAgICBsZXQgYW5jaG9yVGltZSA9IDA7IC8vIFRpbWVzdGFtcCB3aGVuIGFuY2hvciB3YXMgc2V0XG4gICAgbGV0IGxhc3RXaGVlbFRpbWUgPSAwOyAvLyBUaW1lc3RhbXAgb2YgbGFzdCB3aGVlbCBldmVudCAoZm9yIGRldGVjdGluZyBnYXBzKVxuICAgIGxldCBhbmNob3JJbml0aWFsRGVsdGEgPSAwOyAvLyBJbml0aWFsIHdoZWVsIGRlbHRhIHdoZW4gYW5jaG9yIHdhcyBzZXQgKHRvIGRldGVjdCBkZWNheSlcbiAgICBsZXQgYW5jaG9yTGFzdERlbHRhID0gMDsgLy8gUHJldmlvdXMgd2hlZWwgZGVsdGEgKHRvIGRldGVjdCBpbmNyZWFzaW5nIGRlbHRhID0gbmV3IHNjcm9sbClcbiAgICBsZXQgYW5jaG9yTWluRGVsdGEgPSBJbmZpbml0eTsgLy8gTWluaW11bSBkZWx0YSBzZWVuIHNpbmNlIGFuY2hvciAodG8gZGV0ZWN0IHJlYWNjZWxlcmF0aW9uKVxuICAgIGxldCBjb25zZWN1dGl2ZUluY3JlYXNlcyA9IDA7IC8vIENvdW50IG9mIGNvbnNlY3V0aXZlIGRlbHRhIGluY3JlYXNlcyAodG8gZGV0ZWN0IHN1c3RhaW5lZCBuZXcgc2Nyb2xsaW5nKVxuICAgIGxldCBzdXN0YWluZWRIaWdoQ291bnQgPSAwOyAvLyBDb3VudCBvZiBldmVudHMgd2hlcmUgZGVsdGEgaXMgc2lnbmlmaWNhbnRseSBhYm92ZSBtaW5pbXVtIChzdXN0YWluZWQgbmV3IHNjcm9sbGluZylcblxuICAgIC8vIGNvbnNvbGUubG9nKGBbU2Nyb2xsaW5nXSBJbml0aWFsIHN0YXRlIC0gcG9zaXRpb246ICR7c2Nyb2xsUG9zaXRpb259YCk7XG5cbiAgICAvLyBUaHJlc2hvbGQgZm9yIGNvbnNpZGVyaW5nIHRoZSBsaXN0IFwic2Nyb2xsZWRcIiAoaW4gcGl4ZWxzKVxuICAgIGNvbnN0IFNDUk9MTEVEX1RIUkVTSE9MRCA9IDE7XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBzY3JvbGxlZCBzdGF0ZSBjbGFzcyBvbiB0aGUgdmxpc3QgY29udGFpbmVyXG4gICAgICogQWRkcyAtLXNjcm9sbGVkIG1vZGlmaWVyIHdoZW4gbGlzdCBpcyBub3QgYXQgdGhlIHRvcFxuICAgICAqL1xuICAgIGNvbnN0IHVwZGF0ZVNjcm9sbGVkU3RhdGUgPSAoXG4gICAgICB2aWV3cG9ydEVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgICAgcG9zaXRpb246IG51bWJlcixcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHNob3VsZEJlU2Nyb2xsZWQgPSBwb3NpdGlvbiA+IFNDUk9MTEVEX1RIUkVTSE9MRDtcbiAgICAgIGlmIChzaG91bGRCZVNjcm9sbGVkICE9PSBpc1Njcm9sbGVkRnJvbVRvcCkge1xuICAgICAgICBpc1Njcm9sbGVkRnJvbVRvcCA9IHNob3VsZEJlU2Nyb2xsZWQ7XG4gICAgICAgIC8vIEZpbmQgdGhlIHZsaXN0IGNvbnRhaW5lciAocGFyZW50IG9mIHZpZXdwb3J0KVxuICAgICAgICBjb25zdCB2bGlzdENvbnRhaW5lciA9IHZpZXdwb3J0RWxlbWVudC5jbG9zZXN0KFwiLm10cmwtdmxpc3RcIik7XG4gICAgICAgIGlmICh2bGlzdENvbnRhaW5lcikge1xuICAgICAgICAgIHZsaXN0Q29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUoXG4gICAgICAgICAgICBcIm10cmwtdmxpc3QtLXNjcm9sbGVkXCIsXG4gICAgICAgICAgICBzaG91bGRCZVNjcm9sbGVkLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gR2V0IHZpZXdwb3J0IHN0YXRlXG4gICAgbGV0IHZpZXdwb3J0U3RhdGU6IGFueTtcblxuICAgIC8vIFVzZSBzaGFyZWQgaW5pdGlhbGl6YXRpb24gd3JhcHBlclxuICAgIHdyYXBJbml0aWFsaXplKGNvbXBvbmVudCwgKCkgPT4ge1xuICAgICAgdmlld3BvcnRTdGF0ZSA9IGdldFZpZXdwb3J0U3RhdGUoY29tcG9uZW50KTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBzdGF0ZSB2YWx1ZXNcbiAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgIHRvdGFsVmlydHVhbFNpemUgPSB2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemUgfHwgMDtcbiAgICAgICAgY29udGFpbmVyU2l6ZSA9IHZpZXdwb3J0U3RhdGUuY29udGFpbmVyU2l6ZSB8fCAwO1xuICAgICAgICAvLyBTeW5jIHNjcm9sbFBvc2l0aW9uIGZyb20gdmlld3BvcnRTdGF0ZSAoaW1wb3J0YW50IGZvciBpbml0aWFsU2Nyb2xsSW5kZXgpXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID4gMCkge1xuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uID0gdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBMaXN0ZW4gZm9yIHZpcnR1YWwgc2l6ZSBjaGFuZ2VzXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnZpcnR1YWwtc2l6ZS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJbU2Nyb2xsaW5nXSBWaXJ0dWFsIHNpemUgY2hhbmdlZDpcIiwgZGF0YSk7XG4gICAgICAgIHVwZGF0ZVNjcm9sbEJvdW5kcyhkYXRhLnRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3Igc2Nyb2xsIHBvc2l0aW9uIGNoYW5nZXMgZnJvbSBvdGhlciBmZWF0dXJlcyAoZS5nLiwgdmlydHVhbC50cyBhZnRlciBpdGVtIHNpemUgZGV0ZWN0aW9uKVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpzY3JvbGwtcG9zaXRpb24tc3luY1wiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChkYXRhLnBvc2l0aW9uICE9PSB1bmRlZmluZWQgJiYgZGF0YS5wb3NpdGlvbiAhPT0gc2Nyb2xsUG9zaXRpb24pIHtcbiAgICAgICAgICBzY3JvbGxQb3NpdGlvbiA9IGRhdGEucG9zaXRpb247XG4gICAgICAgICAgLy8gQWxzbyB1cGRhdGUgbG9jYWwgdHJhY2tpbmcgdmFyc1xuICAgICAgICAgIHRvdGFsVmlydHVhbFNpemUgPVxuICAgICAgICAgICAgdmlld3BvcnRTdGF0ZT8udmlydHVhbFRvdGFsU2l6ZSB8fCB0b3RhbFZpcnR1YWxTaXplO1xuICAgICAgICAgIGNvbnRhaW5lclNpemUgPSB2aWV3cG9ydFN0YXRlPy5jb250YWluZXJTaXplIHx8IGNvbnRhaW5lclNpemU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGNvbnRhaW5lciBzaXplIGNoYW5nZXNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6Y29udGFpbmVyLXNpemUtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChkYXRhLmNvbnRhaW5lclNpemUpIHtcbiAgICAgICAgICBjb250YWluZXJTaXplID0gZGF0YS5jb250YWluZXJTaXplO1xuICAgICAgICAgIHVwZGF0ZVNjcm9sbEJvdW5kcyh0b3RhbFZpcnR1YWxTaXplLCBjb250YWluZXJTaXplKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEF0dGFjaCB3aGVlbCBldmVudCBsaXN0ZW5lciB0byB2aWV3cG9ydCBlbGVtZW50XG4gICAgICBjb25zdCB2aWV3cG9ydEVsZW1lbnQgPVxuICAgICAgICB2aWV3cG9ydFN0YXRlPy52aWV3cG9ydEVsZW1lbnQgfHwgKGNvbXBvbmVudCBhcyBhbnkpLnZpZXdwb3J0RWxlbWVudDtcbiAgICAgIGlmICh2aWV3cG9ydEVsZW1lbnQpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtTY3JvbGxpbmddIEF0dGFjaGluZyB3aGVlbCBldmVudCB0byB2aWV3cG9ydCBlbGVtZW50YCk7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwid2hlZWxcIiwgaGFuZGxlV2hlZWwsIHtcbiAgICAgICAgICBwYXNzaXZlOiBmYWxzZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBzY3JvbGxlZCBzdGF0ZSBiYXNlZCBvbiBjdXJyZW50IHNjcm9sbCBwb3NpdGlvblxuICAgICAgICB1cGRhdGVTY3JvbGxlZFN0YXRlKHZpZXdwb3J0RWxlbWVudCwgc2Nyb2xsUG9zaXRpb24pO1xuXG4gICAgICAgIC8vIEFkZCBtb3VzZWRvd24gbGlzdGVuZXIgdG8gc3RvcCBzY3JvbGxpbmcgb24gY2xpY2tcbiAgICAgICAgaWYgKHN0b3BPbkNsaWNrKSB7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgaGFuZGxlTW91c2VEb3duKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0b3JlIHJlZmVyZW5jZSBmb3IgY2xlYW51cFxuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuX3Njcm9sbGluZ1ZpZXdwb3J0RWxlbWVudCA9IHZpZXdwb3J0RWxlbWVudDtcbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLl9zY3JvbGxpbmdTdG9wT25DbGljayA9IHN0b3BPbkNsaWNrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbU2Nyb2xsaW5nXSBObyB2aWV3cG9ydCBlbGVtZW50IGZvdW5kIGZvciB3aGVlbCBldmVudHNgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFVzZSBjbGFtcCBmcm9tIHV0aWxzXG5cbiAgICAvLyBTdGFydCBpZGxlIGRldGVjdGlvblxuICAgIGNvbnN0IHN0YXJ0SWRsZURldGVjdGlvbiA9ICgpID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1Njcm9sbGluZ10gU3RhcnRpbmcgaWRsZSBkZXRlY3Rpb25cIik7XG5cbiAgICAgIC8vIFN0b3AgYW55IGV4aXN0aW5nIGlkbGUgZGV0ZWN0aW9uIGZpcnN0XG4gICAgICBpZiAoaWRsZUNoZWNrRnJhbWUgIT09IG51bGwpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWRsZUNoZWNrRnJhbWUpO1xuICAgICAgICBpZGxlQ2hlY2tGcmFtZSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGhhc0VtaXR0ZWRJZGxlID0gZmFsc2U7IC8vIFJlc2V0IGlkbGUgZW1pc3Npb24gZmxhZ1xuICAgICAgY29uc3QgY2hlY2tJZGxlID0gKCkgPT4ge1xuICAgICAgICBpZiAoc2Nyb2xsUG9zaXRpb24gPT09IGxhc3RJZGxlQ2hlY2tQb3NpdGlvbikge1xuICAgICAgICAgIC8vIFBvc2l0aW9uIGhhc24ndCBjaGFuZ2VkIC0gd2UncmUgaWRsZVxuICAgICAgICAgIGlmICghaGFzRW1pdHRlZElkbGUgJiYgKHNwZWVkVHJhY2tlci52ZWxvY2l0eSA+IDAgfHwgaXNTY3JvbGxpbmcpKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgXCJbU2Nyb2xsaW5nXSBJZGxlIGRldGVjdGVkIC0gcG9zaXRpb24gc3RhYmxlLCBzZXR0aW5nIHZlbG9jaXR5IHRvIHplcm9cIlxuICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgIGhhc0VtaXR0ZWRJZGxlID0gdHJ1ZTsgLy8gTWFyayB0aGF0IHdlJ3ZlIGVtaXR0ZWQgaWRsZVxuICAgICAgICAgICAgc2V0VmVsb2NpdHlUb1plcm8oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUG9zaXRpb24gY2hhbmdlZCwgcmVzZXQgdGhlIGZsYWdcbiAgICAgICAgICBoYXNFbWl0dGVkSWRsZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RJZGxlQ2hlY2tQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgICBpZGxlQ2hlY2tGcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShjaGVja0lkbGUpO1xuICAgICAgfTtcbiAgICAgIGlkbGVDaGVja0ZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNoZWNrSWRsZSk7XG4gICAgfTtcblxuICAgIC8vIFN0b3AgaWRsZSBkZXRlY3Rpb25cbiAgICBjb25zdCBzdG9wSWRsZURldGVjdGlvbiA9ICgpID0+IHtcbiAgICAgIGlmIChpZGxlQ2hlY2tGcmFtZSkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltTY3JvbGxpbmddIFN0b3BwaW5nIGlkbGUgZGV0ZWN0aW9uXCIpO1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShpZGxlQ2hlY2tGcmFtZSk7XG4gICAgICAgIGlkbGVDaGVja0ZyYW1lID0gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gU2V0IHZlbG9jaXR5IHRvIHplcm8gYW5kIGVtaXQgaWRsZSBldmVudFxuICAgIGNvbnN0IHNldFZlbG9jaXR5VG9aZXJvID0gKCkgPT4ge1xuICAgICAgLy8gU3RvcCBpZGxlIGRldGVjdGlvbiBzaW5jZSB3ZSdyZSBub3cgaWRsZVxuICAgICAgc3RvcElkbGVEZXRlY3Rpb24oKTtcblxuICAgICAgc3BlZWRUcmFja2VyID0gY3JlYXRlU3BlZWRUcmFja2VyKCk7XG4gICAgICBpc1Njcm9sbGluZyA9IGZhbHNlOyAvLyBSZXNldCBzY3JvbGxpbmcgc3RhdGVcblxuICAgICAgLy8gRW1pdCB2ZWxvY2l0eSBjaGFuZ2VcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDp2ZWxvY2l0eS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgdmVsb2NpdHk6IDAsXG4gICAgICAgIGRpcmVjdGlvbjogc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgIH0pO1xuXG4gICAgICAvLyBFbWl0IGlkbGUgc3RhdGVcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDppZGxlXCIsIHtcbiAgICAgICAgcG9zaXRpb246IHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICBsYXN0U2Nyb2xsVGltZSxcbiAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gVXBkYXRlIGNvbnRhaW5lciBwb3NpdGlvblxuICAgIGNvbnN0IHVwZGF0ZUNvbnRhaW5lclBvc2l0aW9uID0gKCkgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlIHx8ICF2aWV3cG9ydFN0YXRlLml0ZW1zQ29udGFpbmVyKSByZXR1cm47XG5cbiAgICAgIC8vIEl0ZW1zIGNvbnRhaW5lciBkb2Vzbid0IG1vdmUgLSBpdGVtcyBpbnNpZGUgaXQgYXJlIHBvc2l0aW9uZWRcbiAgICAgIC8vIFRoaXMgaXMgaGFuZGxlZCBieSB0aGUgcmVuZGVyaW5nIGZlYXR1cmVcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIG1vdXNlZG93biB0byBzdG9wIHNjcm9sbGluZyBvbiBjbGlja1xuICAgIGNvbnN0IGhhbmRsZU1vdXNlRG93biA9IChfZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgLy8gQW5jaG9yIHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbiAtIGFueSB3aGVlbCBldmVudHMgd2lsbCBiZSBmb3JjZWQgYmFjayB0byB0aGlzIHBvc2l0aW9uXG4gICAgICAvLyBUaGlzIGVsZWdhbnRseSBoYW5kbGVzIG1vdXNlIHdoZWVscyB3aXRoIHBoeXNpY2FsIGluZXJ0aWEgKGxpa2UgTG9naXRlY2ggZnJlZS1zcGluKVxuICAgICAgYW5jaG9yUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgIGFuY2hvclRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgYW5jaG9ySW5pdGlhbERlbHRhID0gMDsgLy8gV2lsbCBiZSBzZXQgYnkgZmlyc3Qgd2hlZWwgZXZlbnRcbiAgICAgIGFuY2hvckxhc3REZWx0YSA9IDA7XG4gICAgICBhbmNob3JNaW5EZWx0YSA9IEluZmluaXR5O1xuICAgICAgY29uc2VjdXRpdmVJbmNyZWFzZXMgPSAwO1xuICAgICAgc3VzdGFpbmVkSGlnaENvdW50ID0gMDtcblxuICAgICAgLy8gT25seSBzdG9wIGlmIHdlJ3JlIGN1cnJlbnRseSBzY3JvbGxpbmdcbiAgICAgIGlmIChpc1Njcm9sbGluZyB8fCBzcGVlZFRyYWNrZXIudmVsb2NpdHkgPiAwKSB7XG4gICAgICAgIHNldFZlbG9jaXR5VG9aZXJvKCk7XG4gICAgICB9XG4gICAgICAvLyBBbHNvIHN0b3AgbW9tZW50dW0gYW5pbWF0aW9uIGlmIGFjdGl2ZVxuICAgICAgY29uc3QgbW9tZW50dW1TdGF0ZSA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5tb21lbnR1bVN0YXRlO1xuICAgICAgaWYgKG1vbWVudHVtU3RhdGU/LnN0b3BNb21lbnR1bSkge1xuICAgICAgICBtb21lbnR1bVN0YXRlLnN0b3BNb21lbnR1bSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgd2hlZWwgZXZlbnRcbiAgICBjb25zdCBoYW5kbGVXaGVlbCA9IChldmVudDogV2hlZWxFdmVudCkgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgY29uc3QgZGVsdGEgPSBvcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiID8gZXZlbnQuZGVsdGFZIDogZXZlbnQuZGVsdGFYO1xuICAgICAgY29uc3Qgc2Nyb2xsRGVsdGEgPSBkZWx0YSAqIHNlbnNpdGl2aXR5O1xuXG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgdGltZVNpbmNlTGFzdFdoZWVsID0gbm93IC0gbGFzdFdoZWVsVGltZTtcbiAgICAgIGxhc3RXaGVlbFRpbWUgPSBub3c7XG5cbiAgICAgIC8vIElmIHdlIGhhdmUgYW4gYW5jaG9yIHBvc2l0aW9uICh1c2VyIGNsaWNrZWQgdG8gc3RvcCBzY3JvbGxpbmcpLFxuICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyBpbnRlbnRpb25hbCBuZXcgc2Nyb2xsaW5nIG9yIHJlc2lkdWFsIHdoZWVsIGluZXJ0aWFcbiAgICAgIGlmIChhbmNob3JQb3NpdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCB0aW1lU2luY2VBbmNob3IgPSBub3cgLSBhbmNob3JUaW1lO1xuICAgICAgICBjb25zdCB3aGVlbERlbHRhTWFnbml0dWRlID0gTWF0aC5hYnMoc2Nyb2xsRGVsdGEpO1xuXG4gICAgICAgIC8vIFRyYWNrIGluaXRpYWwgZGVsdGEgdG8gZGV0ZWN0IHdoZW4gaW5lcnRpYSBoYXMgZGVjYXllZFxuICAgICAgICBpZiAoYW5jaG9ySW5pdGlhbERlbHRhID09PSAwKSB7XG4gICAgICAgICAgYW5jaG9ySW5pdGlhbERlbHRhID0gd2hlZWxEZWx0YU1hZ25pdHVkZTtcbiAgICAgICAgICBhbmNob3JMYXN0RGVsdGEgPSB3aGVlbERlbHRhTWFnbml0dWRlO1xuICAgICAgICAgIGFuY2hvck1pbkRlbHRhID0gd2hlZWxEZWx0YU1hZ25pdHVkZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyYWNrIG1pbmltdW0gZGVsdGEgdG8gZGV0ZWN0IHJlYWNjZWxlcmF0aW9uICh1c2VyIHN0YXJ0ZWQgc2Nyb2xsaW5nIGFnYWluKVxuICAgICAgICBhbmNob3JNaW5EZWx0YSA9IE1hdGgubWluKGFuY2hvck1pbkRlbHRhLCB3aGVlbERlbHRhTWFnbml0dWRlKTtcblxuICAgICAgICAvLyBEZXRlY3QgaWYgZGVsdGEgaXMgaW5jcmVhc2luZyAodXNlciBzdGFydGVkIG5ldyBzY3JvbGwpXG4gICAgICAgIC8vIEluZXJ0aWEgb25seSBkZWNheXMsIHNvIGluY3JlYXNpbmcgZGVsdGEgPSBpbnRlbnRpb25hbCBuZXcgc2Nyb2xsaW5nXG4gICAgICAgIC8vIEJVVDogZmlsdGVyIG91dCBiYXRjaGVkIGV2ZW50cyB3aGVyZSBkZWx0YSBpcyB+MnggdGhlIGxhc3QgKGJyb3dzZXIgYmF0Y2hpbmcsIG5vdCByZWFsIGluY3JlYXNlKVxuICAgICAgICBjb25zdCBpc0JhdGNoZWRFdmVudCA9XG4gICAgICAgICAgd2hlZWxEZWx0YU1hZ25pdHVkZSA+IGFuY2hvckxhc3REZWx0YSAqIDEuOCAmJlxuICAgICAgICAgIHdoZWVsRGVsdGFNYWduaXR1ZGUgPCBhbmNob3JMYXN0RGVsdGEgKiAyLjI7XG5cbiAgICAgICAgLy8gVHJhY2sgY29uc2VjdXRpdmUgaW5jcmVhc2VzIC0gc3VzdGFpbmVkIGluY3JlYXNlcyBpbmRpY2F0ZSBuZXcgc2Nyb2xsaW5nXG4gICAgICAgIC8vIFVzZSAxJSB0aHJlc2hvbGQgdG8gY2F0Y2ggZ3JhZHVhbCBhY2NlbGVyYXRpb25cbiAgICAgICAgaWYgKCFpc0JhdGNoZWRFdmVudCAmJiB3aGVlbERlbHRhTWFnbml0dWRlID4gYW5jaG9yTGFzdERlbHRhICogMS4wMSkge1xuICAgICAgICAgIGNvbnNlY3V0aXZlSW5jcmVhc2VzKys7XG4gICAgICAgIH0gZWxzZSBpZiAod2hlZWxEZWx0YU1hZ25pdHVkZSA8IGFuY2hvckxhc3REZWx0YSAqIDAuOTkpIHtcbiAgICAgICAgICAvLyBEZWx0YSBkZWNyZWFzaW5nIC0gcmVzZXQgY291bnRlclxuICAgICAgICAgIGNvbnNlY3V0aXZlSW5jcmVhc2VzID0gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBkZWx0YSBpcyByb3VnaGx5IHRoZSBzYW1lICh3aXRoaW4gMSUpLCBkb24ndCBjaGFuZ2UgdGhlIGNvdW50ZXJcblxuICAgICAgICAvLyBUcmFjayBzdXN0YWluZWQgaGlnaCBkZWx0YSAoZGVsdGEgc2lnbmlmaWNhbnRseSBhYm92ZSBtaW5pbXVtIGZvciBtdWx0aXBsZSBldmVudHMpXG4gICAgICAgIC8vIFRoaXMgY2F0Y2hlcyB3aGVuIHVzZXIgc3RhcnRzIHNjcm9sbGluZyBidXQgZGVsdGEgcGxhdGVhdXMgaW5zdGVhZCBvZiBzdHJpY3RseSBpbmNyZWFzaW5nXG4gICAgICAgIGlmICghaXNCYXRjaGVkRXZlbnQgJiYgd2hlZWxEZWx0YU1hZ25pdHVkZSA+IGFuY2hvck1pbkRlbHRhICogMS4wNSkge1xuICAgICAgICAgIHN1c3RhaW5lZEhpZ2hDb3VudCsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN1c3RhaW5lZEhpZ2hDb3VudCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWxlYXNlIGlmOiAzKyBjb25zZWN1dGl2ZSBpbmNyZWFzZXMsIE9SIHN1c3RhaW5lZCBoaWdoIGRlbHRhLCBPUiBzaWduaWZpY2FudCBzaW5nbGUgaW5jcmVhc2VcbiAgICAgICAgY29uc3Qgc3VzdGFpbmVkSW5jcmVhc2UgPSBjb25zZWN1dGl2ZUluY3JlYXNlcyA+PSAzO1xuICAgICAgICBjb25zdCBzdXN0YWluZWRIaWdoID0gc3VzdGFpbmVkSGlnaENvdW50ID49IDU7IC8vIDUrIGV2ZW50cyBhdCA1JSsgYWJvdmUgbWluaW11bVxuICAgICAgICBjb25zdCBzaWduaWZpY2FudEluY3JlYXNlID1cbiAgICAgICAgICAhaXNCYXRjaGVkRXZlbnQgJiZcbiAgICAgICAgICB3aGVlbERlbHRhTWFnbml0dWRlID4gYW5jaG9yTWluRGVsdGEgKiAxLjE1ICYmIC8vIDE1JSBpbmNyZWFzZSBmcm9tIG1pbmltdW1cbiAgICAgICAgICB3aGVlbERlbHRhTWFnbml0dWRlID4gYW5jaG9yTGFzdERlbHRhICogMS4wODsgLy8gYW5kIDglIGluY3JlYXNpbmcgZnJvbSBsYXN0XG4gICAgICAgIGNvbnN0IGRlbHRhSW5jcmVhc2luZyA9XG4gICAgICAgICAgc3VzdGFpbmVkSW5jcmVhc2UgfHwgc3VzdGFpbmVkSGlnaCB8fCBzaWduaWZpY2FudEluY3JlYXNlO1xuXG4gICAgICAgIC8vIFJlbGVhc2UgYW5jaG9yIGlmOlxuICAgICAgICAvLyAxLiBUaGVyZSB3YXMgYSBnYXAgaW4gd2hlZWwgZXZlbnRzICg+IDIwMG1zKSAtIHVzZXIgc3RvcHBlZCBhbmQgc3RhcnRlZCBuZXcgc2Nyb2xsXG4gICAgICAgIC8vIDIuIERlbHRhIGlzIGluY3JlYXNpbmcgZnJvbSBtaW5pbXVtIC0gdXNlciBzdGFydGVkIHNjcm9sbGluZyBhZ2FpbiBkdXJpbmcgaW5lcnRpYVxuICAgICAgICAvLyAzLiBEZWx0YSBoYXMgZGVjYXllZCBzaWduaWZpY2FudGx5ICg8IDMwJSBvZiBpbml0aWFsKSAtIGluZXJ0aWEgaXMgd2luZGluZyBkb3duXG4gICAgICAgIC8vIDQuIExvdyBhYnNvbHV0ZSBkZWx0YSAoPCAzMCkgLSBnZW50bGUgaW50ZW50aW9uYWwgc2Nyb2xsXG4gICAgICAgIGNvbnN0IGhhc1doZWVsR2FwID0gdGltZVNpbmNlTGFzdFdoZWVsID4gMjAwO1xuICAgICAgICBjb25zdCBkZWx0YURlY2F5ZWQgPSB3aGVlbERlbHRhTWFnbml0dWRlIDwgYW5jaG9ySW5pdGlhbERlbHRhICogMC4zO1xuICAgICAgICBjb25zdCBpc0xvd0RlbHRhID0gd2hlZWxEZWx0YU1hZ25pdHVkZSA8IDMwO1xuXG4gICAgICAgIGlmIChoYXNXaGVlbEdhcCkge1xuICAgICAgICAgIC8vIFRpbWUgZ2FwIC0gdXNlciBzdG9wcGVkIGFuZCBzdGFydGVkIG5ldyBzY3JvbGxcbiAgICAgICAgICBhbmNob3JQb3NpdGlvbiA9IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoZGVsdGFJbmNyZWFzaW5nICYmIHRpbWVTaW5jZUFuY2hvciA+IDEwMCkge1xuICAgICAgICAgIC8vIERlbHRhIGluY3JlYXNpbmcgLSB1c2VyIHN0YXJ0ZWQgc2Nyb2xsaW5nIGFnYWluXG4gICAgICAgICAgYW5jaG9yUG9zaXRpb24gPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKGlzTG93RGVsdGEpIHtcbiAgICAgICAgICAvLyBWZXJ5IGxvdyBkZWx0YSAtIGdlbnRsZSBpbnRlbnRpb25hbCBzY3JvbGxcbiAgICAgICAgICBhbmNob3JQb3NpdGlvbiA9IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoZGVsdGFEZWNheWVkICYmIHRpbWVTaW5jZUFuY2hvciA+IDMwMCkge1xuICAgICAgICAgIC8vIERlbHRhIGhhcyBkZWNheWVkIGFuZCBzb21lIHRpbWUgcGFzc2VkIC0gaW5lcnRpYSBpcyBkb25lXG4gICAgICAgICAgYW5jaG9yUG9zaXRpb24gPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFN0aWxsIGluIGluZXJ0aWEgcGhhc2UgLSBzdGF5IGFuY2hvcmVkXG4gICAgICAgICAgaWYgKHNjcm9sbFBvc2l0aW9uICE9PSBhbmNob3JQb3NpdGlvbikge1xuICAgICAgICAgICAgc2Nyb2xsUG9zaXRpb24gPSBhbmNob3JQb3NpdGlvbjtcbiAgICAgICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBVcGRhdGUgbGFzdCBkZWx0YSBmb3IgbmV4dCBjb21wYXJpc29uXG4gICAgICAgICAgYW5jaG9yTGFzdERlbHRhID0gd2hlZWxEZWx0YU1hZ25pdHVkZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgbGFzdCBkZWx0YSBmb3IgbmV4dCBjb21wYXJpc29uXG4gICAgICAgIGFuY2hvckxhc3REZWx0YSA9IHdoZWVsRGVsdGFNYWduaXR1ZGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByZXZpb3VzUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgIGNvbnN0IG1heFNjcm9sbCA9IE1hdGgubWF4KDAsIHRvdGFsVmlydHVhbFNpemUgLSBjb250YWluZXJTaXplKTtcblxuICAgICAgbGV0IG5ld1Bvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb24gKyBzY3JvbGxEZWx0YTtcblxuICAgICAgLy8gQXBwbHkgc21vb3RoaW5nIGlmIGVuYWJsZWRcbiAgICAgIGlmIChzbW9vdGhpbmcpIHtcbiAgICAgICAgY29uc3Qgc21vb3RoaW5nRmFjdG9yID0gMC4zO1xuICAgICAgICBuZXdQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uICsgc2Nyb2xsRGVsdGEgKiBzbW9vdGhpbmdGYWN0b3I7XG4gICAgICB9XG5cbiAgICAgIG5ld1Bvc2l0aW9uID0gY2xhbXAobmV3UG9zaXRpb24sIDAsIG1heFNjcm9sbCk7XG5cbiAgICAgIGlmIChuZXdQb3NpdGlvbiAhPT0gc2Nyb2xsUG9zaXRpb24pIHtcbiAgICAgICAgc2Nyb2xsUG9zaXRpb24gPSBuZXdQb3NpdGlvbjtcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcblxuICAgICAgICAvLyBVcGRhdGUgc2Nyb2xsIHN0YXRlXG4gICAgICAgIGlmICghaXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICBpc1Njcm9sbGluZyA9IHRydWU7XG4gICAgICAgICAgLy8gU3RvcCBhbnkgZXhpc3RpbmcgaWRsZSBkZXRlY3Rpb24gYmVmb3JlIHN0YXJ0aW5nIG5ldyBvbmVcbiAgICAgICAgICBzdG9wSWRsZURldGVjdGlvbigpO1xuICAgICAgICAgIHN0YXJ0SWRsZURldGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RTY3JvbGxUaW1lID0gbm93O1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzcGVlZCB0cmFja2VyXG4gICAgICAgIHNwZWVkVHJhY2tlciA9IHVwZGF0ZVNwZWVkVHJhY2tlcihcbiAgICAgICAgICBzcGVlZFRyYWNrZXIsXG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgcHJldmlvdXNQb3NpdGlvbixcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBVcGRhdGUgdmlld3BvcnQgc3RhdGVcbiAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS52ZWxvY2l0eSA9IHNwZWVkVHJhY2tlci52ZWxvY2l0eTtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbERpcmVjdGlvbiA9IHNwZWVkVHJhY2tlci5kaXJlY3Rpb247XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgc2Nyb2xsZWQgc3RhdGUgY2xhc3NcbiAgICAgICAgY29uc3Qgdmlld3BvcnRFbCA9XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZT8udmlld3BvcnRFbGVtZW50IHx8IChjb21wb25lbnQgYXMgYW55KS52aWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgIGlmICh2aWV3cG9ydEVsKSB7XG4gICAgICAgICAgdXBkYXRlU2Nyb2xsZWRTdGF0ZSh2aWV3cG9ydEVsLCBzY3JvbGxQb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IGV2ZW50c1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6c2Nyb2xsXCIsIHtcbiAgICAgICAgICBwb3NpdGlvbjogc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgZGlyZWN0aW9uOiBzcGVlZFRyYWNrZXIuZGlyZWN0aW9uLFxuICAgICAgICAgIHByZXZpb3VzUG9zaXRpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDp2ZWxvY2l0eS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgICB2ZWxvY2l0eTogc3BlZWRUcmFja2VyLnZlbG9jaXR5LFxuICAgICAgICAgIGRpcmVjdGlvbjogc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVHJpZ2dlciByZW5kZXJcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnJlbmRlckl0ZW1zKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFNjcm9sbCB0byBwb3NpdGlvblxuICAgIGNvbnN0IHNjcm9sbFRvUG9zaXRpb24gPSAocG9zaXRpb246IG51bWJlciwgc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBtYXhTY3JvbGwgPSBNYXRoLm1heCgwLCB0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZSk7XG4gICAgICBjb25zdCBjbGFtcGVkUG9zaXRpb24gPSBjbGFtcChwb3NpdGlvbiwgMCwgbWF4U2Nyb2xsKTtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbU2Nyb2xsaW5nXSBzY3JvbGxUb1Bvc2l0aW9uOiBwb3M9JHtwb3NpdGlvbn0gLT4gJHtjbGFtcGVkUG9zaXRpb259LCBzb3VyY2U9JHtzb3VyY2V9LCBjdXJyZW50UG9zPSR7c2Nyb2xsUG9zaXRpb259LCB2ZWxvY2l0eT0ke3NwZWVkVHJhY2tlci52ZWxvY2l0eS50b0ZpeGVkKFxuICAgICAgLy8gICAgIDNcbiAgICAgIC8vICAgKX1gXG4gICAgICAvLyApO1xuXG4gICAgICBpZiAoY2xhbXBlZFBvc2l0aW9uICE9PSBzY3JvbGxQb3NpdGlvbikge1xuICAgICAgICBjb25zdCBwcmV2aW91c1Bvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICAgIHNjcm9sbFBvc2l0aW9uID0gY2xhbXBlZFBvc2l0aW9uO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzcGVlZCB0cmFja2VyIHRvIGNhbGN1bGF0ZSB2ZWxvY2l0eVxuICAgICAgICBzcGVlZFRyYWNrZXIgPSB1cGRhdGVTcGVlZFRyYWNrZXIoXG4gICAgICAgICAgc3BlZWRUcmFja2VyLFxuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgIHByZXZpb3VzUG9zaXRpb24sXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHZpZXdwb3J0IHN0YXRlXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUudmVsb2NpdHkgPSBzcGVlZFRyYWNrZXIudmVsb2NpdHk7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxEaXJlY3Rpb24gPSBzcGVlZFRyYWNrZXIuZGlyZWN0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID1cbiAgICAgICAgICBjbGFtcGVkUG9zaXRpb24gPiBwcmV2aW91c1Bvc2l0aW9uID8gXCJmb3J3YXJkXCIgOiBcImJhY2t3YXJkXCI7XG5cbiAgICAgICAgLy8gVXBkYXRlIHNjcm9sbGVkIHN0YXRlIGNsYXNzXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0RWwgPVxuICAgICAgICAgIHZpZXdwb3J0U3RhdGU/LnZpZXdwb3J0RWxlbWVudCB8fCAoY29tcG9uZW50IGFzIGFueSkudmlld3BvcnRFbGVtZW50O1xuICAgICAgICBpZiAodmlld3BvcnRFbCkge1xuICAgICAgICAgIHVwZGF0ZVNjcm9sbGVkU3RhdGUodmlld3BvcnRFbCwgc2Nyb2xsUG9zaXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBzY3JvbGwgZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnNjcm9sbFwiLCB7XG4gICAgICAgICAgcG9zaXRpb246IHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgICBwcmV2aW91c1Bvc2l0aW9uLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBFbWl0IHZlbG9jaXR5IGNoYW5nZSBldmVudCBzbyBjb2xsZWN0aW9uIGNhbiB0cmFjayBpdFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6dmVsb2NpdHktY2hhbmdlZFwiLCB7XG4gICAgICAgICAgdmVsb2NpdHk6IHNwZWVkVHJhY2tlci52ZWxvY2l0eSxcbiAgICAgICAgICBkaXJlY3Rpb246IHNwZWVkVHJhY2tlci5kaXJlY3Rpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzY3JvbGwgc3RhdGUgYW5kIGlkbGUgZGV0ZWN0aW9uXG4gICAgICAgIGlmICghaXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICBpc1Njcm9sbGluZyA9IHRydWU7XG4gICAgICAgICAgc3RhcnRJZGxlRGV0ZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFNjcm9sbFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIC8vIFRyaWdnZXIgcmVuZGVyXG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtTY3JvbGxpbmddIFBvc2l0aW9uIHVuY2hhbmdlZDogJHtzY3JvbGxQb3NpdGlvbn1gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtTY3JvbGxpbmddIFBvc2l0aW9uIHVuY2hhbmdlZDogJHtzY3JvbGxQb3NpdGlvbn0sIG5vdCByZXNldHRpbmcgaWRsZSB0aW1lb3V0YFxuICAgICAgICAvLyApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBTY3JvbGwgdG8gaW5kZXhcbiAgICBjb25zdCBzY3JvbGxUb0luZGV4ID0gKFxuICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgIGFsaWdubWVudDogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIsXG4gICAgKSA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtTY3JvbGxpbmddIHNjcm9sbFRvSW5kZXggY2FsbGVkOiBpbmRleD0ke2luZGV4fSwgYWxpZ25tZW50PSR7YWxpZ25tZW50fWBcbiAgICAgIC8vICk7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhgW1Njcm9sbGluZ10gc2Nyb2xsVG9JbmRleCBhYm9ydGVkOiBubyB2aWV3cG9ydCBzdGF0ZWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGl0ZW1TaXplID0gdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZSB8fCA1MDtcbiAgICAgIGNvbnN0IHRvdGFsSXRlbXMgPSB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgfHwgMDtcbiAgICAgIGNvbnN0IGFjdHVhbFRvdGFsU2l6ZSA9IHRvdGFsSXRlbXMgKiBpdGVtU2l6ZTtcbiAgICAgIGNvbnN0IE1BWF9WSVJUVUFMX1NJWkUgPVxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuVklSVFVBTF9TQ1JPTEwuTUFYX1ZJUlRVQUxfU0laRTtcbiAgICAgIGNvbnN0IGlzQ29tcHJlc3NlZCA9IGFjdHVhbFRvdGFsU2l6ZSA+IE1BWF9WSVJUVUFMX1NJWkU7XG5cbiAgICAgIGxldCB0YXJnZXRQb3NpdGlvbjogbnVtYmVyO1xuXG4gICAgICBpZiAoaXNDb21wcmVzc2VkKSB7XG4gICAgICAgIC8vIEluIGNvbXByZXNzZWQgc3BhY2UsIG1hcCBpbmRleCB0byB2aXJ0dWFsIHBvc2l0aW9uXG4gICAgICAgIGNvbnN0IHJhdGlvID0gaW5kZXggLyB0b3RhbEl0ZW1zO1xuICAgICAgICB0YXJnZXRQb3NpdGlvbiA9IHJhdGlvICogTWF0aC5taW4oYWN0dWFsVG90YWxTaXplLCBNQVhfVklSVFVBTF9TSVpFKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpcmVjdCBjYWxjdWxhdGlvbiB3aGVuIG5vdCBjb21wcmVzc2VkXG4gICAgICAgIHRhcmdldFBvc2l0aW9uID0gaW5kZXggKiBpdGVtU2l6ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRqdXN0IHBvc2l0aW9uIGJhc2VkIG9uIGFsaWdubWVudFxuICAgICAgc3dpdGNoIChhbGlnbm1lbnQpIHtcbiAgICAgICAgY2FzZSBcImNlbnRlclwiOlxuICAgICAgICAgIHRhcmdldFBvc2l0aW9uIC09IGNvbnRhaW5lclNpemUgLyAyIC0gaXRlbVNpemUgLyAyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgdGFyZ2V0UG9zaXRpb24gLT0gY29udGFpbmVyU2l6ZSAtIGl0ZW1TaXplO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtTY3JvbGxpbmddIFRhcmdldCBwb3NpdGlvbjogJHt0YXJnZXRQb3NpdGlvbn0sIGlzQ29tcHJlc3NlZDogJHtpc0NvbXByZXNzZWR9YFxuICAgICAgLy8gKTtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbU2Nyb2xsaW5nXSBTY3JvbGxUb0luZGV4OiBpbmRleD0ke2luZGV4fSwgcG9zaXRpb249JHt0YXJnZXRQb3NpdGlvbn0sIGFsaWdubWVudD0ke2FsaWdubWVudH1gXG4gICAgICAvLyApO1xuXG4gICAgICBzY3JvbGxUb1Bvc2l0aW9uKHRhcmdldFBvc2l0aW9uLCBcInNjcm9sbFRvSW5kZXhcIik7XG4gICAgfTtcblxuICAgIC8vIFNjcm9sbCB0byBhIHNwZWNpZmljIHBhZ2VcbiAgICBjb25zdCBzY3JvbGxUb1BhZ2UgPSAoXG4gICAgICBwYWdlOiBudW1iZXIsXG4gICAgICBsaW1pdDogbnVtYmVyID0gMjAsXG4gICAgICBhbGlnbm1lbnQ6IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiID0gXCJzdGFydFwiLFxuICAgICkgPT4ge1xuICAgICAgLy8gVmFsaWRhdGUgYWxpZ25tZW50IHBhcmFtZXRlclxuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgYWxpZ25tZW50ICE9PSBcInN0cmluZ1wiIHx8XG4gICAgICAgICFbXCJzdGFydFwiLCBcImNlbnRlclwiLCBcImVuZFwiXS5pbmNsdWRlcyhhbGlnbm1lbnQpXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbU2Nyb2xsaW5nXSBJbnZhbGlkIGFsaWdubWVudCBcIiR7YWxpZ25tZW50fVwiLCB1c2luZyBcInN0YXJ0XCJgLFxuICAgICAgICApO1xuICAgICAgICBhbGlnbm1lbnQgPSBcInN0YXJ0XCI7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGluIGN1cnNvciBtb2RlXG4gICAgICBjb25zdCB2aWV3cG9ydENvbmZpZyA9IChjb21wb25lbnQgYXMgYW55KS5jb25maWc7XG4gICAgICBjb25zdCBpc0N1cnNvck1vZGUgPSB2aWV3cG9ydENvbmZpZz8ucGFnaW5hdGlvbj8uc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCI7XG5cbiAgICAgIGlmIChpc0N1cnNvck1vZGUpIHtcbiAgICAgICAgLy8gSW4gY3Vyc29yIG1vZGUsIGNoZWNrIGlmIHdlIGNhbiBzY3JvbGwgdG8gdGhpcyBwYWdlXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuY29sbGVjdGlvbjtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24pIHtcbiAgICAgICAgICBjb25zdCBoaWdoZXN0TG9hZGVkUGFnZSA9IE1hdGguZmxvb3IoXG4gICAgICAgICAgICBjb2xsZWN0aW9uLmdldExvYWRlZFJhbmdlcygpLnNpemUsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChwYWdlID4gaGlnaGVzdExvYWRlZFBhZ2UgKyAxKSB7XG4gICAgICAgICAgICAvLyBMaW1pdCBob3cgbWFueSBwYWdlcyB3ZSdsbCBsb2FkIGF0IG9uY2UgdG8gcHJldmVudCBleGNlc3NpdmUgQVBJIGNhbGxzXG4gICAgICAgICAgICBjb25zdCBtYXhQYWdlc1RvTG9hZCA9IDEwOyAvLyBSZWFzb25hYmxlIGxpbWl0XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRQYWdlID0gTWF0aC5taW4oXG4gICAgICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgICAgIGhpZ2hlc3RMb2FkZWRQYWdlICsgbWF4UGFnZXNUb0xvYWQsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIGBbU2Nyb2xsaW5nXSBDYW5ub3QganVtcCBkaXJlY3RseSB0byBwYWdlICR7cGFnZX0gaW4gY3Vyc29yIG1vZGUuIGAgK1xuICAgICAgICAgICAgICAgIGBQYWdlcyBtdXN0IGJlIGxvYWRlZCBzZXF1ZW50aWFsbHkuIEN1cnJlbnQgaGlnaGVzdCBwYWdlOiAke2hpZ2hlc3RMb2FkZWRQYWdlfS4gYCArXG4gICAgICAgICAgICAgICAgYFdpbGwgbG9hZCB1cCB0byBwYWdlICR7dGFyZ2V0UGFnZX1gLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gVHJpZ2dlciBzZXF1ZW50aWFsIGxvYWRpbmcgdG8gdGhlIHRhcmdldCBwYWdlIChsaW1pdGVkKVxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0T2Zmc2V0ID0gKHRhcmdldFBhZ2UgLSAxKSAqIGxpbWl0O1xuICAgICAgICAgICAgY29uc3QgY3VycmVudE9mZnNldCA9IGhpZ2hlc3RMb2FkZWRQYWdlICogbGltaXQ7XG5cbiAgICAgICAgICAgIC8vIExvYWQgcGFnZXMgc2VxdWVudGlhbGx5IHVwIHRvIHRoZSBsaW1pdGVkIHRhcmdldFxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIGBbU2Nyb2xsaW5nXSBJbml0aWF0aW5nIHNlcXVlbnRpYWwgbG9hZCBmcm9tIHBhZ2UgJHtcbiAgICAgICAgICAgIC8vICAgICBoaWdoZXN0TG9hZGVkUGFnZSArIDFcbiAgICAgICAgICAgIC8vICAgfSB0byAke3RhcmdldFBhZ2V9YCxcbiAgICAgICAgICAgIC8vICk7XG5cbiAgICAgICAgICAgIC8vIFNjcm9sbCB0byB0aGUgbGFzdCBsb2FkZWQgcG9zaXRpb24gZmlyc3RcbiAgICAgICAgICAgIGNvbnN0IGxhc3RMb2FkZWRJbmRleCA9IGhpZ2hlc3RMb2FkZWRQYWdlICogbGltaXQ7XG4gICAgICAgICAgICBzY3JvbGxUb0luZGV4KGxhc3RMb2FkZWRJbmRleCwgYWxpZ25tZW50KTtcblxuICAgICAgICAgICAgLy8gVGhlIGNvbGxlY3Rpb24gZmVhdHVyZSB3aWxsIGhhbmRsZSBzZXF1ZW50aWFsIGxvYWRpbmdcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ29udmVydCBwYWdlIHRvIGluZGV4IChwYWdlIDEgPSBpbmRleCAwKVxuICAgICAgY29uc3QgaW5kZXggPSAocGFnZSAtIDEpICogbGltaXQ7XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGluZ10gU2Nyb2xsVG9QYWdlOiBwYWdlPSR7cGFnZX0sIGxpbWl0PSR7bGltaXR9LCB0YXJnZXRJbmRleD0ke2luZGV4fSwgYWxpZ25tZW50PSR7YWxpZ25tZW50fWBcbiAgICAgIC8vICk7XG5cbiAgICAgIC8vIEp1c3Qgc2Nyb2xsIHRvIHRoZSBpbmRleCAtIGxldCB0aGUgbm9ybWFsIHJlbmRlcmluZyBmbG93IGhhbmRsZSBkYXRhIGxvYWRpbmcgYW5kIHBsYWNlaG9sZGVyc1xuICAgICAgc2Nyb2xsVG9JbmRleChpbmRleCwgYWxpZ25tZW50KTtcbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIHNjcm9sbCBib3VuZHNcbiAgICBjb25zdCB1cGRhdGVTY3JvbGxCb3VuZHMgPSAoXG4gICAgICBuZXdUb3RhbFNpemU6IG51bWJlcixcbiAgICAgIG5ld0NvbnRhaW5lclNpemU6IG51bWJlcixcbiAgICApID0+IHtcbiAgICAgIHRvdGFsVmlydHVhbFNpemUgPSBuZXdUb3RhbFNpemU7XG4gICAgICBjb250YWluZXJTaXplID0gbmV3Q29udGFpbmVyU2l6ZTtcblxuICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplID0gbmV3VG90YWxTaXplO1xuICAgICAgICB2aWV3cG9ydFN0YXRlLmNvbnRhaW5lclNpemUgPSBuZXdDb250YWluZXJTaXplO1xuICAgICAgfVxuXG4gICAgICAvLyBEb24ndCBjbGFtcCBzY3JvbGwgcG9zaXRpb24gdW50aWwgd2UgaGF2ZSByZWFsIGRhdGEgbG9hZGVkXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIHJlc2V0dGluZyBpbml0aWFsU2Nyb2xsSW5kZXggcG9zaXRpb24gYmVmb3JlIGRhdGEgYXJyaXZlc1xuICAgICAgLy8gQ2hlY2sgdG90YWxJdGVtcyBpbnN0ZWFkIG9mIHRvdGFsVmlydHVhbFNpemUgc2luY2UgdmlydHVhbFNpemUgY2FuIGJlIG5vbi16ZXJvIGZyb20gcGFkZGluZ1xuICAgICAgY29uc3QgdG90YWxJdGVtcyA9IHZpZXdwb3J0U3RhdGU/LnRvdGFsSXRlbXMgfHwgMDtcbiAgICAgIGlmICh0b3RhbEl0ZW1zIDw9IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDbGFtcCBjdXJyZW50IHBvc2l0aW9uIHRvIG5ldyBib3VuZHNcbiAgICAgIGNvbnN0IG1heFNjcm9sbCA9IE1hdGgubWF4KDAsIHRvdGFsVmlydHVhbFNpemUgLSBjb250YWluZXJTaXplKTtcbiAgICAgIGlmIChzY3JvbGxQb3NpdGlvbiA+IG1heFNjcm9sbCkge1xuICAgICAgICBzY3JvbGxUb1Bvc2l0aW9uKG1heFNjcm9sbCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEV4dGVuZCB2aWV3cG9ydCBBUElcbiAgICBjb25zdCBvcmlnaW5hbFNjcm9sbFRvSW5kZXggPSBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9JbmRleDtcbiAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9JbmRleCA9IChcbiAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgICBhbGlnbm1lbnQ/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIixcbiAgICApID0+IHtcbiAgICAgIHNjcm9sbFRvSW5kZXgoaW5kZXgsIGFsaWdubWVudCk7XG4gICAgICBvcmlnaW5hbFNjcm9sbFRvSW5kZXg/LihpbmRleCwgYWxpZ25tZW50KTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIHNjcm9sbFRvUGFnZSB0byB2aWV3cG9ydCBBUEkgKG5ldyBtZXRob2QsIG5vIG9yaWdpbmFsIHRvIHByZXNlcnZlKVxuICAgIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zY3JvbGxUb1BhZ2UgPSAoXG4gICAgICBwYWdlOiBudW1iZXIsXG4gICAgICBsaW1pdD86IG51bWJlcixcbiAgICAgIGFsaWdubWVudD86IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiLFxuICAgICkgPT4ge1xuICAgICAgc2Nyb2xsVG9QYWdlKHBhZ2UsIGxpbWl0LCBhbGlnbm1lbnQpO1xuICAgIH07XG5cbiAgICBjb25zdCBvcmlnaW5hbFNjcm9sbFRvUG9zaXRpb24gPSBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9Qb3NpdGlvbjtcbiAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9Qb3NpdGlvbiA9IChwb3NpdGlvbjogbnVtYmVyKSA9PiB7XG4gICAgICBzY3JvbGxUb1Bvc2l0aW9uKHBvc2l0aW9uLCBcImFwaVwiKTtcbiAgICAgIG9yaWdpbmFsU2Nyb2xsVG9Qb3NpdGlvbj8uKHBvc2l0aW9uKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb3JpZ2luYWxHZXRTY3JvbGxQb3NpdGlvbiA9IGNvbXBvbmVudC52aWV3cG9ydC5nZXRTY3JvbGxQb3NpdGlvbjtcbiAgICBjb21wb25lbnQudmlld3BvcnQuZ2V0U2Nyb2xsUG9zaXRpb24gPSAoKSA9PiB7XG4gICAgICByZXR1cm4gc2Nyb2xsUG9zaXRpb247XG4gICAgfTtcblxuICAgIC8vIEFkZCB3aGVlbCBldmVudCBsaXN0ZW5lciBvbiBpbml0aWFsaXphdGlvblxuICAgIC8vIFRoaXMgYmxvY2sgaXMgcmVtb3ZlZCBhcyBwZXIgdGhlIGVkaXQgaGludC5cblxuICAgIC8vIENsZWFuIHVwIG9uIGRlc3Ryb3lcbiAgICBpZiAoXCJkZXN0cm95XCIgaW4gY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQuZGVzdHJveTtcbiAgICAgIGNvbXBvbmVudC5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAvLyBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0RWxlbWVudCA9IChjb21wb25lbnQgYXMgYW55KS5fc2Nyb2xsaW5nVmlld3BvcnRFbGVtZW50O1xuICAgICAgICBpZiAodmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLCBoYW5kbGVXaGVlbCk7XG4gICAgICAgICAgaWYgKChjb21wb25lbnQgYXMgYW55KS5fc2Nyb2xsaW5nU3RvcE9uQ2xpY2spIHtcbiAgICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGhhbmRsZU1vdXNlRG93bik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgdGltZW91dHNcbiAgICAgICAgaWYgKGlkbGVUaW1lb3V0SWQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoaWRsZVRpbWVvdXRJZCk7XG4gICAgICAgIH1cblxuICAgICAgICBzdG9wSWRsZURldGVjdGlvbigpO1xuICAgICAgICBvcmlnaW5hbERlc3Ryb3k/LigpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBBZGQgc2Nyb2xsQnkgbWV0aG9kXG4gICAgY29uc3Qgc2Nyb2xsQnkgPSAoZGVsdGE6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgcHJldmlvdXNQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgY29uc3QgbWF4U2Nyb2xsID0gTWF0aC5tYXgoMCwgdG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuICAgICAgY29uc3QgbmV3UG9zaXRpb24gPSBjbGFtcChzY3JvbGxQb3NpdGlvbiArIGRlbHRhLCAwLCBtYXhTY3JvbGwpO1xuXG4gICAgICBpZiAobmV3UG9zaXRpb24gIT09IHByZXZpb3VzUG9zaXRpb24pIHtcbiAgICAgICAgc2Nyb2xsUG9zaXRpb24gPSBuZXdQb3NpdGlvbjtcblxuICAgICAgICAvLyBVcGRhdGUgc3BlZWQgdHJhY2tlclxuICAgICAgICBzcGVlZFRyYWNrZXIgPSB1cGRhdGVTcGVlZFRyYWNrZXIoXG4gICAgICAgICAgc3BlZWRUcmFja2VyLFxuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgIHByZXZpb3VzUG9zaXRpb24sXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHZpZXdwb3J0IHN0YXRlXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUudmVsb2NpdHkgPSBzcGVlZFRyYWNrZXIudmVsb2NpdHk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgc2Nyb2xsZWQgc3RhdGUgY2xhc3NcbiAgICAgICAgY29uc3Qgdmlld3BvcnRFbCA9XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZT8udmlld3BvcnRFbGVtZW50IHx8IChjb21wb25lbnQgYXMgYW55KS52aWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgIGlmICh2aWV3cG9ydEVsKSB7XG4gICAgICAgICAgdXBkYXRlU2Nyb2xsZWRTdGF0ZSh2aWV3cG9ydEVsLCBzY3JvbGxQb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IHNjcm9sbCBldmVudFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6c2Nyb2xsXCIsIHtcbiAgICAgICAgICBwb3NpdGlvbjogc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgdmVsb2NpdHk6IHNwZWVkVHJhY2tlci52ZWxvY2l0eSxcbiAgICAgICAgICBkaXJlY3Rpb246IHNwZWVkVHJhY2tlci5kaXJlY3Rpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFRyaWdnZXIgcmVuZGVyXG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcz8uKCk7XG5cbiAgICAgICAgLy8gU3RhcnQgaWRsZSBkZXRlY3Rpb24gaWYgbm90IHNjcm9sbGluZ1xuICAgICAgICBpZiAoIWlzU2Nyb2xsaW5nKSB7XG4gICAgICAgICAgaXNTY3JvbGxpbmcgPSB0cnVlO1xuICAgICAgICAgIHN0YXJ0SWRsZURldGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RTY3JvbGxUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gRXhwb3NlIHNjcm9sbGluZyBzdGF0ZSBmb3Igb3RoZXIgZmVhdHVyZXNcbiAgICAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc2Nyb2xsaW5nU3RhdGUgPSB7XG4gICAgICBzZXRWZWxvY2l0eVRvWmVybyxcbiAgICB9O1xuXG4gICAgLy8gQWRkIHNjcm9sbEJ5IHRvIHZpZXdwb3J0IEFQSVxuICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxCeSA9IHNjcm9sbEJ5O1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5nZXRWZWxvY2l0eSA9ICgpID0+IHNwZWVkVHJhY2tlci52ZWxvY2l0eTtcblxuICAgIC8vIEV4cG9zZSBzY3JvbGxpbmcgQVBJXG4gICAgKGNvbXBvbmVudCBhcyBhbnkpLnNjcm9sbGluZyA9IHtcbiAgICAgIGhhbmRsZVdoZWVsLFxuICAgICAgc2Nyb2xsVG9Qb3NpdGlvbixcbiAgICAgIHNjcm9sbFRvSW5kZXgsXG4gICAgICBzY3JvbGxUb1BhZ2UsXG4gICAgICBzY3JvbGxCeSxcbiAgICAgIGdldFNjcm9sbFBvc2l0aW9uOiAoKSA9PiBzY3JvbGxQb3NpdGlvbixcbiAgICAgIHVwZGF0ZVNjcm9sbEJvdW5kcyxcbiAgICAgIGdldFZlbG9jaXR5OiAoKSA9PiBzcGVlZFRyYWNrZXIudmVsb2NpdHksXG4gICAgICBnZXREaXJlY3Rpb246ICgpID0+IHNwZWVkVHJhY2tlci5kaXJlY3Rpb24sXG4gICAgICBpc1Njcm9sbGluZzogKCkgPT4gaXNTY3JvbGxpbmcsXG4gICAgfTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH07XG59O1xuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9tb21lbnR1bS50c1xuXG4vKipcbiAqIE1vbWVudHVtIEZlYXR1cmUgLSBBZGRzIGluZXJ0aWFsIHNjcm9sbGluZyB0byB2aWV3cG9ydFxuICogUHJvdmlkZXMgc21vb3RoIGRlY2VsZXJhdGlvbiBhZnRlciB0b3VjaC9tb3VzZSBkcmFnIGdlc3R1cmVzXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbXBvbmVudCwgVmlld3BvcnRDb250ZXh0IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBWSUVXUE9SVF9DT05TVEFOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbmludGVyZmFjZSBNb21lbnR1bUNvbmZpZyB7XG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuICBkZWNlbGVyYXRpb24/OiBudW1iZXI7XG4gIG1pblZlbG9jaXR5PzogbnVtYmVyO1xuICBtaW5EdXJhdGlvbj86IG51bWJlcjtcbiAgbWluVmVsb2NpdHlUaHJlc2hvbGQ/OiBudW1iZXI7XG4gIC8qKiBTdG9wIG1vbWVudHVtIHdoZW4gY2xpY2tpbmcgb24gdGhlIHZpZXdwb3J0IChkZWZhdWx0OiB0cnVlKSAqL1xuICBzdG9wT25DbGljaz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQWRkcyBtb21lbnR1bSBzY3JvbGxpbmcgdG8gdmlld3BvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhNb21lbnR1bSA9IChjb25maWc6IE1vbWVudHVtQ29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KGNvbXBvbmVudDogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGVuYWJsZWQgPSBWSUVXUE9SVF9DT05TVEFOVFMuTU9NRU5UVU0uRU5BQkxFRCxcbiAgICAgIGRlY2VsZXJhdGlvbiA9IFZJRVdQT1JUX0NPTlNUQU5UUy5NT01FTlRVTS5ERUNFTEVSQVRJT05fRkFDVE9SLFxuICAgICAgbWluVmVsb2NpdHkgPSBWSUVXUE9SVF9DT05TVEFOVFMuTU9NRU5UVU0uTUlOX1ZFTE9DSVRZLFxuICAgICAgbWluRHVyYXRpb24gPSBWSUVXUE9SVF9DT05TVEFOVFMuTU9NRU5UVU0uTUlOX0RVUkFUSU9OLFxuICAgICAgbWluVmVsb2NpdHlUaHJlc2hvbGQgPSBWSUVXUE9SVF9DT05TVEFOVFMuTU9NRU5UVU0uTUlOX1ZFTE9DSVRZX1RIUkVTSE9MRCxcbiAgICAgIHN0b3BPbkNsaWNrID0gdHJ1ZSwgLy8gU3RvcCBtb21lbnR1bSBvbiBjbGljayBieSBkZWZhdWx0XG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIEFsd2F5cyBhcHBseSB0aGUgZmVhdHVyZSwgYnV0IGNoZWNrIGlzRW5hYmxlZCBhdCBydW50aW1lXG5cbiAgICAvLyBNb21lbnR1bSBzdGF0ZVxuICAgIGxldCBtb21lbnR1bUFuaW1hdGlvbklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaXNUb3VjaGluZyA9IGZhbHNlO1xuICAgIGxldCBpc01vdXNlRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICBsZXQgbGFzdFRvdWNoUG9zaXRpb24gPSAwO1xuICAgIGxldCBsYXN0TW91c2VQb3NpdGlvbiA9IDA7XG4gICAgbGV0IHRvdWNoU3RhcnRUaW1lID0gMDtcbiAgICBsZXQgdmlld3BvcnRTdGF0ZTogYW55O1xuICAgIGxldCBzY3JvbGxpbmdTdGF0ZTogYW55O1xuICAgIGxldCBpc0VuYWJsZWQgPSBlbmFibGVkOyAvLyBUcmFjayBjdXJyZW50IGVuYWJsZWQgc3RhdGVcblxuICAgIC8vIEdldCByZWZlcmVuY2VzIGFmdGVyIGluaXRpYWxpemF0aW9uXG4gICAgY29uc3Qgb3JpZ2luYWxJbml0aWFsaXplID0gY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemU7XG4gICAgY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBvcmlnaW5hbEluaXRpYWxpemUoKTtcbiAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBpbml0aWFsaXplZFxuICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBHZXQgdmlld3BvcnQgYW5kIHNjcm9sbGluZyBzdGF0ZXNcbiAgICAgIHZpZXdwb3J0U3RhdGUgPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU7XG4gICAgICBzY3JvbGxpbmdTdGF0ZSA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zY3JvbGxpbmdTdGF0ZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIC8vIFN0b3AgbW9tZW50dW0gYW5pbWF0aW9uIChjYW4gYmUgY2FsbGVkIGV4dGVybmFsbHkpXG4gICAgY29uc3Qgc3RvcE1vbWVudHVtID0gKCkgPT4ge1xuICAgICAgaWYgKG1vbWVudHVtQW5pbWF0aW9uSWQpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUobW9tZW50dW1BbmltYXRpb25JZCk7XG4gICAgICAgIG1vbWVudHVtQW5pbWF0aW9uSWQgPSBudWxsO1xuICAgICAgICAvLyBSZXNldCB2ZWxvY2l0eSBpbiBzY3JvbGxpbmcgZmVhdHVyZVxuICAgICAgICBpZiAoc2Nyb2xsaW5nU3RhdGUpIHtcbiAgICAgICAgICBzY3JvbGxpbmdTdGF0ZS5zZXRWZWxvY2l0eVRvWmVybz8uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gU3RhcnQgbW9tZW50dW0gYW5pbWF0aW9uXG4gICAgY29uc3Qgc3RhcnRNb21lbnR1bSA9IChpbml0aWFsVmVsb2NpdHk6IG51bWJlcikgPT4ge1xuICAgICAgLy8gQ2FuY2VsIGFueSBleGlzdGluZyBtb21lbnR1bVxuICAgICAgaWYgKG1vbWVudHVtQW5pbWF0aW9uSWQpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUobW9tZW50dW1BbmltYXRpb25JZCk7XG4gICAgICB9XG5cbiAgICAgIGxldCB2ZWxvY2l0eSA9IGluaXRpYWxWZWxvY2l0eTtcblxuICAgICAgY29uc3QgYW5pbWF0ZSA9ICgpID0+IHtcbiAgICAgICAgLy8gQXBwbHkgZGVjZWxlcmF0aW9uXG4gICAgICAgIHZlbG9jaXR5ICo9IGRlY2VsZXJhdGlvbjtcblxuICAgICAgICAvLyBTdG9wIGlmIHZlbG9jaXR5IGlzIHRvbyBzbWFsbFxuICAgICAgICBpZiAoTWF0aC5hYnModmVsb2NpdHkpIDwgbWluVmVsb2NpdHkpIHtcbiAgICAgICAgICBtb21lbnR1bUFuaW1hdGlvbklkID0gbnVsbDtcbiAgICAgICAgICAvLyBSZXNldCB2ZWxvY2l0eSBpbiBzY3JvbGxpbmcgZmVhdHVyZVxuICAgICAgICAgIGlmIChzY3JvbGxpbmdTdGF0ZSkge1xuICAgICAgICAgICAgc2Nyb2xsaW5nU3RhdGUuc2V0VmVsb2NpdHlUb1plcm8/LigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxjdWxhdGUgc2Nyb2xsIGRlbHRhICh2ZWxvY2l0eSBpcyBpbiBweC9tcywgc28gbXVsdGlwbHkgYnkgZnJhbWUgdGltZSlcbiAgICAgICAgY29uc3QgZnJhbWVEZWx0YSA9IHZlbG9jaXR5ICogVklFV1BPUlRfQ09OU1RBTlRTLk1PTUVOVFVNLkZSQU1FX1RJTUU7XG5cbiAgICAgICAgLy8gVXNlIHNjcm9sbGluZyBmZWF0dXJlJ3MgQVBJIHRvIHVwZGF0ZSBwb3NpdGlvblxuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5KSB7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5KGZyYW1lRGVsdGEpO1xuXG4gICAgICAgICAgLy8gQ29udGludWUgYW5pbWF0aW9uXG4gICAgICAgICAgbW9tZW50dW1BbmltYXRpb25JZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShhbmltYXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBObyBzY3JvbGxCeSBtZXRob2QsIHN0b3AgbW9tZW50dW1cbiAgICAgICAgICBtb21lbnR1bUFuaW1hdGlvbklkID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgbW9tZW50dW1BbmltYXRpb25JZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShhbmltYXRlKTtcbiAgICB9O1xuXG4gICAgLy8gVG91Y2ggZXZlbnQgaGFuZGxlcnNcbiAgICBjb25zdCBoYW5kbGVUb3VjaFN0YXJ0ID0gKGU6IFRvdWNoRXZlbnQpID0+IHtcbiAgICAgIGlzVG91Y2hpbmcgPSB0cnVlO1xuICAgICAgY29uc3QgdG91Y2ggPSBlLnRvdWNoZXNbMF07XG4gICAgICBjb25zdCBvcmllbnRhdGlvbiA9IHZpZXdwb3J0U3RhdGU/Lm9yaWVudGF0aW9uIHx8IFwidmVydGljYWxcIjtcbiAgICAgIGxhc3RUb3VjaFBvc2l0aW9uID1cbiAgICAgICAgb3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIiA/IHRvdWNoLmNsaWVudFkgOiB0b3VjaC5jbGllbnRYO1xuICAgICAgdG91Y2hTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAvLyBDYW5jZWwgYW55IG9uZ29pbmcgbW9tZW50dW1cbiAgICAgIGlmIChtb21lbnR1bUFuaW1hdGlvbklkKSB7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKG1vbWVudHVtQW5pbWF0aW9uSWQpO1xuICAgICAgICBtb21lbnR1bUFuaW1hdGlvbklkID0gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlVG91Y2hNb3ZlID0gKGU6IFRvdWNoRXZlbnQpID0+IHtcbiAgICAgIGlmICghaXNUb3VjaGluZykgcmV0dXJuO1xuXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7IC8vIFByZXZlbnQgbmF0aXZlIHNjcm9sbGluZ1xuXG4gICAgICBjb25zdCB0b3VjaCA9IGUudG91Y2hlc1swXTtcbiAgICAgIGNvbnN0IG9yaWVudGF0aW9uID0gdmlld3BvcnRTdGF0ZT8ub3JpZW50YXRpb24gfHwgXCJ2ZXJ0aWNhbFwiO1xuICAgICAgY29uc3QgY3VycmVudFBvc2l0aW9uID1cbiAgICAgICAgb3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIiA/IHRvdWNoLmNsaWVudFkgOiB0b3VjaC5jbGllbnRYO1xuICAgICAgY29uc3QgZGVsdGEgPSBsYXN0VG91Y2hQb3NpdGlvbiAtIGN1cnJlbnRQb3NpdGlvbjsgLy8gSW52ZXJ0ZWQgZm9yIG5hdHVyYWwgc2Nyb2xsaW5nXG4gICAgICBsYXN0VG91Y2hQb3NpdGlvbiA9IGN1cnJlbnRQb3NpdGlvbjtcblxuICAgICAgLy8gVXNlIHNjcm9sbGluZyBmZWF0dXJlJ3MgQVBJICgxOjEgdG91Y2gtdG8tc2Nyb2xsIGZvciBuYXR1cmFsIGZlZWwpXG4gICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5KSB7XG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxCeShkZWx0YSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZVRvdWNoRW5kID0gKCkgPT4ge1xuICAgICAgaWYgKCFpc1RvdWNoaW5nKSByZXR1cm47XG4gICAgICBpc1RvdWNoaW5nID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IHRvdWNoRW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB0b3VjaER1cmF0aW9uID0gdG91Y2hFbmRUaW1lIC0gdG91Y2hTdGFydFRpbWU7XG5cbiAgICAgIC8vIEdldCBjdXJyZW50IHZlbG9jaXR5IGZyb20gc2Nyb2xsaW5nIGZlYXR1cmVcbiAgICAgIGNvbnN0IHZlbG9jaXR5ID0gY29tcG9uZW50LnZpZXdwb3J0LmdldFZlbG9jaXR5Py4oKSB8fCAwO1xuXG4gICAgICAvLyBPbmx5IHN0YXJ0IG1vbWVudHVtIGlmIHRoZSB0b3VjaCB3YXMgcXVpY2sgZW5vdWdoIGFuZCB3ZSBoYXZlIHZlbG9jaXR5XG4gICAgICBpZiAoXG4gICAgICAgIHRvdWNoRHVyYXRpb24gPCBtaW5EdXJhdGlvbiAmJlxuICAgICAgICBNYXRoLmFicyh2ZWxvY2l0eSkgPiBtaW5WZWxvY2l0eVRocmVzaG9sZFxuICAgICAgKSB7XG4gICAgICAgIHN0YXJ0TW9tZW50dW0odmVsb2NpdHkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgY2xpY2sgdG8gc3RvcCBtb21lbnR1bSAod2l0aG91dCBwcmV2ZW50aW5nIHNlbGVjdGlvbilcbiAgICBjb25zdCBoYW5kbGVDbGljayA9IChfZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgc3RvcE1vbWVudHVtKCk7XG4gICAgfTtcblxuICAgIC8vIE1vdXNlIGV2ZW50IGhhbmRsZXJzIGZvciBkZXNrdG9wXG4gICAgY29uc3QgaGFuZGxlTW91c2VEb3duID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlzTW91c2VEcmFnZ2luZyA9IHRydWU7XG4gICAgICBjb25zdCBvcmllbnRhdGlvbiA9IHZpZXdwb3J0U3RhdGU/Lm9yaWVudGF0aW9uIHx8IFwidmVydGljYWxcIjtcbiAgICAgIGxhc3RNb3VzZVBvc2l0aW9uID0gb3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIiA/IGUuY2xpZW50WSA6IGUuY2xpZW50WDtcbiAgICAgIHRvdWNoU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgICAgLy8gQ2FuY2VsIGFueSBvbmdvaW5nIG1vbWVudHVtXG4gICAgICBzdG9wTW9tZW50dW0oKTtcblxuICAgICAgLy8gUHJldmVudCB0ZXh0IHNlbGVjdGlvblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZU1vdmUgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgaWYgKCFpc01vdXNlRHJhZ2dpbmcpIHJldHVybjtcblxuICAgICAgY29uc3Qgb3JpZW50YXRpb24gPSB2aWV3cG9ydFN0YXRlPy5vcmllbnRhdGlvbiB8fCBcInZlcnRpY2FsXCI7XG4gICAgICBjb25zdCBjdXJyZW50UG9zaXRpb24gPVxuICAgICAgICBvcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiID8gZS5jbGllbnRZIDogZS5jbGllbnRYO1xuICAgICAgY29uc3QgZGVsdGEgPSBsYXN0TW91c2VQb3NpdGlvbiAtIGN1cnJlbnRQb3NpdGlvbjtcbiAgICAgIGxhc3RNb3VzZVBvc2l0aW9uID0gY3VycmVudFBvc2l0aW9uO1xuXG4gICAgICAvLyBVc2Ugc2Nyb2xsaW5nIGZlYXR1cmUncyBBUEkgKDE6MSBkcmFnLXRvLXNjcm9sbCBmb3IgbmF0dXJhbCBmZWVsKVxuICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxCeSkge1xuICAgICAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsQnkoZGVsdGEpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZVVwID0gKCkgPT4ge1xuICAgICAgaWYgKCFpc01vdXNlRHJhZ2dpbmcpIHJldHVybjtcbiAgICAgIGlzTW91c2VEcmFnZ2luZyA9IGZhbHNlO1xuXG4gICAgICBjb25zdCBtb3VzZVVwVGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBkcmFnRHVyYXRpb24gPSBtb3VzZVVwVGltZSAtIHRvdWNoU3RhcnRUaW1lO1xuXG4gICAgICAvLyBHZXQgY3VycmVudCB2ZWxvY2l0eSBmcm9tIHNjcm9sbGluZyBmZWF0dXJlXG4gICAgICBjb25zdCB2ZWxvY2l0eSA9IGNvbXBvbmVudC52aWV3cG9ydC5nZXRWZWxvY2l0eT8uKCkgfHwgMDtcblxuICAgICAgLy8gU3RhcnQgbW9tZW50dW0gZm9yIHF1aWNrIGRyYWdzXG4gICAgICBpZiAoXG4gICAgICAgIGRyYWdEdXJhdGlvbiA8IG1pbkR1cmF0aW9uICYmXG4gICAgICAgIE1hdGguYWJzKHZlbG9jaXR5KSA+IG1pblZlbG9jaXR5VGhyZXNob2xkXG4gICAgICApIHtcbiAgICAgICAgc3RhcnRNb21lbnR1bSh2ZWxvY2l0eSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIE92ZXJyaWRlIGluaXRpYWxpemUgdG8gYWRkIGV2ZW50IGxpc3RlbmVyc1xuICAgIGNvbnN0IG9yaWdpbmFsSW5pdCA9IGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplO1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplID0gKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gb3JpZ2luYWxJbml0KCk7XG4gICAgICAvLyBTa2lwIGlmIGFscmVhZHkgaW5pdGlhbGl6ZWRcbiAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgdmlld3BvcnRFbGVtZW50ID1cbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLnZpZXdwb3J0RWxlbWVudCB8fFxuICAgICAgICAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU/LnZpZXdwb3J0RWxlbWVudDtcblxuICAgICAgaWYgKHZpZXdwb3J0RWxlbWVudCkge1xuICAgICAgICAvLyBUb3VjaCBldmVudHNcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaHN0YXJ0XCIsIGhhbmRsZVRvdWNoU3RhcnQsIHtcbiAgICAgICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgaGFuZGxlVG91Y2hNb3ZlLCB7XG4gICAgICAgICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsIGhhbmRsZVRvdWNoRW5kLCB7XG4gICAgICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTW91c2UgZXZlbnRzIGZvciBkZXNrdG9wIGRyYWdnaW5nXG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGhhbmRsZU1vdXNlRG93bik7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBoYW5kbGVNb3VzZVVwKTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIGhhbmRsZU1vdXNlVXApO1xuXG4gICAgICAgIC8vIEFkZCBjbGljayBsaXN0ZW5lciB0byBzdG9wIG1vbWVudHVtIG9uIGNsaWNrICh3aXRob3V0IGJsb2NraW5nIHNlbGVjdGlvbilcbiAgICAgICAgaWYgKHN0b3BPbkNsaWNrKSB7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVDbGljayk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdG9yZSByZWZlcmVuY2UgZm9yIGNsZWFudXBcbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLl9tb21lbnR1bVZpZXdwb3J0RWxlbWVudCA9IHZpZXdwb3J0RWxlbWVudDtcbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLl9tb21lbnR1bVN0b3BPbkNsaWNrID0gc3RvcE9uQ2xpY2s7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIENsZWFuIHVwIG9uIGRlc3Ryb3lcbiAgICBpZiAoXCJkZXN0cm95XCIgaW4gY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQuZGVzdHJveTtcbiAgICAgIGNvbXBvbmVudC5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAvLyBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0RWxlbWVudCA9IChjb21wb25lbnQgYXMgYW55KS5fbW9tZW50dW1WaWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgIGlmICh2aWV3cG9ydEVsZW1lbnQpIHtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgaGFuZGxlVG91Y2hTdGFydCk7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgaGFuZGxlVG91Y2hNb3ZlKTtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsIGhhbmRsZVRvdWNoRW5kKTtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBoYW5kbGVNb3VzZURvd24pO1xuICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGhhbmRsZU1vdXNlVXApO1xuICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCBoYW5kbGVNb3VzZVVwKTtcbiAgICAgICAgICBpZiAoKGNvbXBvbmVudCBhcyBhbnkpLl9tb21lbnR1bVN0b3BPbkNsaWNrKSB7XG4gICAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNsaWNrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYW5jZWwgbW9tZW50dW0gYW5pbWF0aW9uXG4gICAgICAgIHN0b3BNb21lbnR1bSgpO1xuXG4gICAgICAgIG9yaWdpbmFsRGVzdHJveSgpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBFeHBvc2UgbW9tZW50dW0gc3RhdGUgZm9yIG90aGVyIGZlYXR1cmVzXG4gICAgKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLm1vbWVudHVtU3RhdGUgPSB7XG4gICAgICBzdG9wTW9tZW50dW0sXG4gICAgfTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH07XG59O1xuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9zY3JvbGxiYXIudHNcblxuLyoqXG4gKiBTY3JvbGxiYXIgRmVhdHVyZSAtIEN1c3RvbSBzY3JvbGxiYXIgaW1wbGVtZW50YXRpb25cbiAqIFByb3ZpZGVzIHZpc3VhbCBzY3JvbGwgaW5kaWNhdGlvbiBhbmQgZHJhZy10by1zY3JvbGwgZnVuY3Rpb25hbGl0eVxuICovXG5cbmltcG9ydCB0eXBlIHsgVmlld3BvcnRDb250ZXh0LCBWaWV3cG9ydENvbXBvbmVudCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVklFV1BPUlRfQ09OU1RBTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgd3JhcEluaXRpYWxpemUsIHdyYXBEZXN0cm95LCBzdG9yZUZlYXR1cmVGdW5jdGlvbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBQUkVGSVgsIGFkZENsYXNzLCByZW1vdmVDbGFzcyB9IGZyb20gXCJtdHJsXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Nyb2xsYmFyQ29uZmlnIHtcbiAgZW5hYmxlZD86IGJvb2xlYW47XG4gIGF1dG9IaWRlPzogYm9vbGVhbjtcbiAgdGh1bWJNaW5IZWlnaHQ/OiBudW1iZXI7XG4gIHRodW1iQ29sb3I/OiBzdHJpbmc7XG4gIHRyYWNrQ29sb3I/OiBzdHJpbmc7XG4gIGJvcmRlclJhZGl1cz86IG51bWJlcjtcbiAgZmFkZVRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Nyb2xsYmFyQ29tcG9uZW50IHtcbiAgc2Nyb2xsYmFyOiB7XG4gICAgc2hvdzogKCkgPT4gdm9pZDtcbiAgICBoaWRlOiAoKSA9PiB2b2lkO1xuICAgIHVwZGF0ZUJvdW5kczogKHRvdGFsVmlydHVhbFNpemU6IG51bWJlciwgY29udGFpbmVyU2l6ZTogbnVtYmVyKSA9PiB2b2lkO1xuICAgIHVwZGF0ZVBvc2l0aW9uOiAoc2Nyb2xsUG9zaXRpb246IG51bWJlcikgPT4gdm9pZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBBZGRzIHNjcm9sbGJhciBmdW5jdGlvbmFsaXR5IHRvIHZpZXdwb3J0IGNvbXBvbmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFNjcm9sbGJhcihjb25maWc6IFNjcm9sbGJhckNvbmZpZyA9IHt9KSB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50PihcbiAgICBjb21wb25lbnQ6IFRcbiAgKTogVCAmIFNjcm9sbGJhckNvbXBvbmVudCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgZW5hYmxlZCA9IHRydWUsXG4gICAgICBhdXRvSGlkZSA9IHRydWUsXG4gICAgICB0aHVtYk1pbkhlaWdodCA9IDI1LFxuICAgICAgYm9yZGVyUmFkaXVzID0gNCxcbiAgICAgIGZhZGVUaW1lb3V0ID0gMTAwMCxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gUmV0dXJuIG5vLW9wIGlmIGRpc2FibGVkXG4gICAgaWYgKCFlbmFibGVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jb21wb25lbnQsXG4gICAgICAgIHNjcm9sbGJhcjoge1xuICAgICAgICAgIHNob3c6ICgpID0+IHt9LFxuICAgICAgICAgIGhpZGU6ICgpID0+IHt9LFxuICAgICAgICAgIHVwZGF0ZUJvdW5kczogKCkgPT4ge30sXG4gICAgICAgICAgdXBkYXRlUG9zaXRpb246ICgpID0+IHt9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBTdGF0ZVxuICAgIGxldCB2aWV3cG9ydEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IHNjcm9sbGJhclRyYWNrOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIGxldCBzY3JvbGxiYXJUaHVtYjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIGxldCBpc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgbGV0IGRyYWdTdGFydFkgPSAwO1xuICAgIGxldCBkcmFnU3RhcnRTY3JvbGxQb3NpdGlvbiA9IDA7XG4gICAgbGV0IGhpZGVUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICAgIGxldCB0b3RhbFZpcnR1YWxTaXplID0gMDtcbiAgICBsZXQgY29udGFpbmVyU2l6ZSA9IDA7XG4gICAgbGV0IHRodW1iSGVpZ2h0ID0gMDtcbiAgICBsZXQgYW5pbWF0aW9uRnJhbWVJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGlzQ3Vyc29yTW9kZSA9IGZhbHNlO1xuICAgIGxldCBsb2FkZWRJdGVtc0NvdW50ID0gMDtcblxuICAgIC8vIENyZWF0ZSBzY3JvbGxiYXIgZWxlbWVudHNcbiAgICBjb25zdCBjcmVhdGVTY3JvbGxiYXJFbGVtZW50cyA9ICgpID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRFbGVtZW50KSByZXR1cm47XG5cbiAgICAgIHNjcm9sbGJhclRyYWNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGFkZENsYXNzKHNjcm9sbGJhclRyYWNrLCBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSKTtcbiAgICAgIHNjcm9sbGJhclRyYWNrLnN0eWxlLmNzc1RleHQgPSBgXG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICB6LWluZGV4OiAxMDtcbiAgICAgIGA7XG5cbiAgICAgIHNjcm9sbGJhclRodW1iID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAgICAgYWRkQ2xhc3MoXG4gICAgICAgIHNjcm9sbGJhclRodW1iLFxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSX1RIVU1CXG4gICAgICApO1xuXG4gICAgICBzY3JvbGxiYXJUcmFjay5hcHBlbmRDaGlsZChzY3JvbGxiYXJUaHVtYik7XG4gICAgICB2aWV3cG9ydEVsZW1lbnQuYXBwZW5kQ2hpbGQoc2Nyb2xsYmFyVHJhY2spO1xuICAgIH07XG5cbiAgICAvLyBTaG93L2hpZGUgZnVuY3Rpb25zXG4gICAgY29uc3Qgc2hvdyA9ICgpID0+IHtcbiAgICAgIGlmICghc2Nyb2xsYmFyVHJhY2sgfHwgdG90YWxWaXJ0dWFsU2l6ZSA8PSBjb250YWluZXJTaXplKSByZXR1cm47XG5cbiAgICAgIGlmIChoaWRlVGltZW91dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQoaGlkZVRpbWVvdXQpO1xuICAgICAgICBoaWRlVGltZW91dCA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBzY3JvbGxiYXJUcmFjayxcbiAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlNDUk9MTEJBUi5DTEFTU0VTLlNDUk9MTEJBUl9WSVNJQkxFXG4gICAgICApO1xuXG4gICAgICBpZiAoYXV0b0hpZGUgJiYgIWlzRHJhZ2dpbmcpIHtcbiAgICAgICAgaGlkZVRpbWVvdXQgPSBzZXRUaW1lb3V0KGhpZGUsIGZhZGVUaW1lb3V0KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGlkZSA9ICgpID0+IHtcbiAgICAgIGlmICghc2Nyb2xsYmFyVHJhY2sgfHwgaXNEcmFnZ2luZykgcmV0dXJuO1xuICAgICAgcmVtb3ZlQ2xhc3MoXG4gICAgICAgIHNjcm9sbGJhclRyYWNrLFxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSX1ZJU0lCTEVcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSBzY3JvbGxiYXIgYm91bmRzXG4gICAgY29uc3QgdXBkYXRlQm91bmRzID0gKG5ld1RvdGFsU2l6ZTogbnVtYmVyLCBuZXdDb250YWluZXJTaXplOiBudW1iZXIpID0+IHtcbiAgICAgIHRvdGFsVmlydHVhbFNpemUgPSBuZXdUb3RhbFNpemU7XG4gICAgICBjb250YWluZXJTaXplID0gbmV3Q29udGFpbmVyU2l6ZTtcblxuICAgICAgaWYgKCFzY3JvbGxiYXJUcmFjayB8fCAhc2Nyb2xsYmFyVGh1bWIpIHJldHVybjtcblxuICAgICAgY29uc3QgbmVlZHNTY3JvbGxiYXIgPSB0b3RhbFZpcnR1YWxTaXplID4gY29udGFpbmVyU2l6ZTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGJhcl0gdXBkYXRlQm91bmRzOiB0b3RhbFNpemU9JHt0b3RhbFZpcnR1YWxTaXplfSwgY29udGFpbmVyU2l6ZT0ke2NvbnRhaW5lclNpemV9LCBuZWVkc1Njcm9sbGJhcj0ke25lZWRzU2Nyb2xsYmFyfWBcbiAgICAgIC8vICk7XG4gICAgICBzY3JvbGxiYXJUcmFjay5zdHlsZS5kaXNwbGF5ID0gbmVlZHNTY3JvbGxiYXIgPyBcImJsb2NrXCIgOiBcIm5vbmVcIjtcblxuICAgICAgaWYgKG5lZWRzU2Nyb2xsYmFyKSB7XG4gICAgICAgIGxldCBzY3JvbGxSYXRpbzogbnVtYmVyO1xuXG4gICAgICAgIGlmIChpc0N1cnNvck1vZGUgJiYgbG9hZGVkSXRlbXNDb3VudCA+IDApIHtcbiAgICAgICAgICAvLyBGb3IgY3Vyc29yIG1vZGUsIHRodW1iIHNpemUgcmVwcmVzZW50cyBsb2FkZWQgY29udGVudCB2cyBlc3RpbWF0ZWQgdG90YWxcbiAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBrbm93IHRvdGFsLCB1c2UgbG9hZGVkIGl0ZW1zICogMiBhcyBlc3RpbWF0ZVxuICAgICAgICAgIGNvbnN0IGVzdGltYXRlZFRvdGFsID1cbiAgICAgICAgICAgIHRvdGFsVmlydHVhbFNpemUgPiAwID8gdG90YWxWaXJ0dWFsU2l6ZSA6IGxvYWRlZEl0ZW1zQ291bnQgKiAyO1xuICAgICAgICAgIHNjcm9sbFJhdGlvID1cbiAgICAgICAgICAgIGNvbnRhaW5lclNpemUgL1xuICAgICAgICAgICAgTWF0aC5tYXgoZXN0aW1hdGVkVG90YWwsIGxvYWRlZEl0ZW1zQ291bnQgKyBjb250YWluZXJTaXplKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBOb3JtYWwgY2FsY3VsYXRpb24gZm9yIG9mZnNldC9wYWdlIHN0cmF0ZWdpZXNcbiAgICAgICAgICBzY3JvbGxSYXRpbyA9IGNvbnRhaW5lclNpemUgLyB0b3RhbFZpcnR1YWxTaXplO1xuICAgICAgICB9XG5cbiAgICAgICAgdGh1bWJIZWlnaHQgPSBNYXRoLm1heCh0aHVtYk1pbkhlaWdodCwgc2Nyb2xsUmF0aW8gKiBjb250YWluZXJTaXplKTtcbiAgICAgICAgc2Nyb2xsYmFyVGh1bWIuc3R5bGUuaGVpZ2h0ID0gYCR7dGh1bWJIZWlnaHR9cHhgO1xuICAgICAgICB1cGRhdGVQb3NpdGlvbihjb21wb25lbnQudmlld3BvcnQ/LmdldFNjcm9sbFBvc2l0aW9uKCkgfHwgMCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSB0aHVtYiBwb3NpdGlvblxuICAgIGNvbnN0IHVwZGF0ZVBvc2l0aW9uID0gKHNjcm9sbFBvczogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoIXNjcm9sbGJhclRodW1iIHx8ICFzY3JvbGxiYXJUcmFjaykgcmV0dXJuO1xuXG4gICAgICBjb25zdCBzY3JvbGxhYmxlRGlzdGFuY2UgPSB0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZTtcbiAgICAgIGlmIChzY3JvbGxhYmxlRGlzdGFuY2UgPD0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IE1hdGgubWluKFxuICAgICAgICAxLFxuICAgICAgICBNYXRoLm1heCgwLCBzY3JvbGxQb3MgLyBzY3JvbGxhYmxlRGlzdGFuY2UpXG4gICAgICApO1xuICAgICAgY29uc3QgbWF4VGh1bWJQb3NpdGlvbiA9XG4gICAgICAgIHNjcm9sbGJhclRyYWNrLmNsaWVudEhlaWdodCAtIHNjcm9sbGJhclRodW1iLmNsaWVudEhlaWdodDtcbiAgICAgIGNvbnN0IHRodW1iUG9zaXRpb24gPSBzY3JvbGxSYXRpbyAqIG1heFRodW1iUG9zaXRpb247XG5cbiAgICAgIHNjcm9sbGJhclRodW1iLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKCR7dGh1bWJQb3NpdGlvbn1weClgO1xuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgdHJhY2sgY2xpY2tcbiAgICBjb25zdCBoYW5kbGVUcmFja0NsaWNrID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmICghc2Nyb2xsYmFyVHJhY2sgfHwgIXNjcm9sbGJhclRodW1iIHx8IGUudGFyZ2V0ID09PSBzY3JvbGxiYXJUaHVtYilcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0cmFja1JlY3QgPSBzY3JvbGxiYXJUcmFjay5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IGNsaWNrWSA9IGUuY2xpZW50WSAtIHRyYWNrUmVjdC50b3A7XG4gICAgICBjb25zdCB0aHVtYkNlbnRlclkgPSBjbGlja1kgLSB0aHVtYkhlaWdodCAvIDI7XG4gICAgICBjb25zdCBtYXhUaHVtYlBvc2l0aW9uID0gY29udGFpbmVyU2l6ZSAtIHRodW1iSGVpZ2h0O1xuICAgICAgY29uc3QgdGh1bWJQb3NpdGlvbiA9IE1hdGgubWF4KFxuICAgICAgICAwLFxuICAgICAgICBNYXRoLm1pbih0aHVtYkNlbnRlclksIG1heFRodW1iUG9zaXRpb24pXG4gICAgICApO1xuICAgICAgY29uc3Qgc2Nyb2xsUmF0aW8gPSB0aHVtYlBvc2l0aW9uIC8gbWF4VGh1bWJQb3NpdGlvbjtcbiAgICAgIGNvbnN0IHRhcmdldFNjcm9sbFBvc2l0aW9uID1cbiAgICAgICAgc2Nyb2xsUmF0aW8gKiAodG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuXG4gICAgICBjb21wb25lbnQudmlld3BvcnQ/LnNjcm9sbFRvUG9zaXRpb24odGFyZ2V0U2Nyb2xsUG9zaXRpb24pO1xuICAgIH07XG5cbiAgICAvLyBNb3VzZSBldmVudCBoYW5kbGVyc1xuICAgIGNvbnN0IGhhbmRsZVRodW1iTW91c2VEb3duID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIGlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgZHJhZ1N0YXJ0WSA9IGUuY2xpZW50WTtcbiAgICAgIGRyYWdTdGFydFNjcm9sbFBvc2l0aW9uID0gY29tcG9uZW50LnZpZXdwb3J0Py5nZXRTY3JvbGxQb3NpdGlvbigpIHx8IDA7XG5cbiAgICAgIGlmIChzY3JvbGxiYXJUcmFjaykge1xuICAgICAgICBhZGRDbGFzcyhcbiAgICAgICAgICBzY3JvbGxiYXJUcmFjayxcbiAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSX0RSQUdHSU5HXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVtaXQgZHJhZyBzdGFydCBldmVudCB0byBub3RpZnkgdmlld3BvcnRcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpkcmFnLXN0YXJ0XCIsIHtcbiAgICAgICAgc291cmNlOiBcInNjcm9sbGJhclwiLFxuICAgICAgICBzdGFydFBvc2l0aW9uOiBkcmFnU3RhcnRTY3JvbGxQb3NpdGlvbixcbiAgICAgIH0pO1xuXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBoYW5kbGVNb3VzZVVwKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlTW91c2VNb3ZlID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmICghaXNEcmFnZ2luZyB8fCAhc2Nyb2xsYmFyVHJhY2sgfHwgIXNjcm9sbGJhclRodW1iKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGRlbHRhWSA9IGUuY2xpZW50WSAtIGRyYWdTdGFydFk7XG4gICAgICBjb25zdCB0cmFja0hlaWdodCA9IHNjcm9sbGJhclRyYWNrLmNsaWVudEhlaWdodDtcbiAgICAgIGNvbnN0IHRodW1iSGVpZ2h0ID0gc2Nyb2xsYmFyVGh1bWIuY2xpZW50SGVpZ2h0O1xuICAgICAgY29uc3QgbWF4VGh1bWJUcmF2ZWwgPSB0cmFja0hlaWdodCAtIHRodW1iSGVpZ2h0O1xuXG4gICAgICBpZiAobWF4VGh1bWJUcmF2ZWwgPD0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBkZWx0YVJhdGlvID0gZGVsdGFZIC8gbWF4VGh1bWJUcmF2ZWw7XG4gICAgICBjb25zdCBkcmFnU3RhcnRTY3JvbGxSYXRpbyA9XG4gICAgICAgIGRyYWdTdGFydFNjcm9sbFBvc2l0aW9uIC8gKHRvdGFsVmlydHVhbFNpemUgLSBjb250YWluZXJTaXplKTtcbiAgICAgIGNvbnN0IG5ld1Njcm9sbFJhdGlvID0gTWF0aC5tYXgoXG4gICAgICAgIDAsXG4gICAgICAgIE1hdGgubWluKDEsIGRyYWdTdGFydFNjcm9sbFJhdGlvICsgZGVsdGFSYXRpbylcbiAgICAgICk7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aHVtYiBwb3NpdGlvbiBpbW1lZGlhdGVseVxuICAgICAgY29uc3QgdGh1bWJQb3NpdGlvbiA9IG5ld1Njcm9sbFJhdGlvICogbWF4VGh1bWJUcmF2ZWw7XG4gICAgICBzY3JvbGxiYXJUaHVtYi5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgke3RodW1iUG9zaXRpb259cHgpYDtcblxuICAgICAgLy8gQ2FsY3VsYXRlIG5ldyBzY3JvbGwgcG9zaXRpb25cbiAgICAgIGNvbnN0IG5ld1Bvc2l0aW9uID0gbmV3U2Nyb2xsUmF0aW8gKiAodG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuICAgICAgbGFzdFJlcXVlc3RlZFNjcm9sbFBvc2l0aW9uID0gbmV3UG9zaXRpb247XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGJhcl0gTW91c2UgbW92ZTogbmV3UG9zPSR7bmV3UG9zaXRpb24udG9GaXhlZChcbiAgICAgIC8vICAgICAwXG4gICAgICAvLyAgICl9LCBhbmltYXRpb25GcmFtZUlkPSR7YW5pbWF0aW9uRnJhbWVJZH1gXG4gICAgICAvLyApO1xuXG4gICAgICAvLyBUaHJvdHRsZSB2aWV3cG9ydCB1cGRhdGVzXG4gICAgICBpZiAoYW5pbWF0aW9uRnJhbWVJZCA9PT0gbnVsbCAmJiBjb21wb25lbnQudmlld3BvcnQpIHtcbiAgICAgICAgYW5pbWF0aW9uRnJhbWVJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW1Njcm9sbGJhcl0gUkFGIGNhbGxiYWNrOiBzY3JvbGxpbmcgdG8gJHtsYXN0UmVxdWVzdGVkU2Nyb2xsUG9zaXRpb259YFxuICAgICAgICAgIC8vICk7XG4gICAgICAgICAgaWYgKGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbiAhPT0gbnVsbCAmJiBjb21wb25lbnQudmlld3BvcnQpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb1Bvc2l0aW9uKGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFuaW1hdGlvbkZyYW1lSWQgPSBudWxsO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlTW91c2VVcCA9ICgpID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1Njcm9sbGJhcl0gTW91c2UgdXAgLSBlbmRpbmcgZHJhZ1wiKTtcbiAgICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTtcblxuICAgICAgaWYgKGFuaW1hdGlvbkZyYW1lSWQgIT09IG51bGwpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoYW5pbWF0aW9uRnJhbWVJZCk7XG4gICAgICAgIGFuaW1hdGlvbkZyYW1lSWQgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAobGFzdFJlcXVlc3RlZFNjcm9sbFBvc2l0aW9uICE9PSBudWxsICYmIGNvbXBvbmVudC52aWV3cG9ydCkge1xuICAgICAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9Qb3NpdGlvbihsYXN0UmVxdWVzdGVkU2Nyb2xsUG9zaXRpb24pO1xuICAgICAgICBsYXN0UmVxdWVzdGVkU2Nyb2xsUG9zaXRpb24gPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2Nyb2xsYmFyVHJhY2spIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3MoXG4gICAgICAgICAgc2Nyb2xsYmFyVHJhY2ssXG4gICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlNDUk9MTEJBUi5DTEFTU0VTLlNDUk9MTEJBUl9EUkFHR0lOR1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBFbWl0IGRyYWcgZW5kIGV2ZW50XG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6ZHJhZy1lbmRcIiwge1xuICAgICAgICBzb3VyY2U6IFwic2Nyb2xsYmFyXCIsXG4gICAgICAgIGVuZFBvc2l0aW9uOiBjb21wb25lbnQudmlld3BvcnQ/LmdldFNjcm9sbFBvc2l0aW9uKCkgfHwgMCxcbiAgICAgIH0pO1xuXG4gICAgICBoaWRlKCk7XG5cbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgaGFuZGxlTW91c2VNb3ZlKTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGhhbmRsZU1vdXNlVXApO1xuICAgIH07XG5cbiAgICAvLyBJbml0aWFsaXplIGZ1bmN0aW9uXG4gICAgY29uc3QgaW5pdGlhbGl6ZSA9ICgpID0+IHtcbiAgICAgIGlmIChpc0luaXRpYWxpemVkKSByZXR1cm47XG5cbiAgICAgIHZpZXdwb3J0RWxlbWVudCA9IGNvbXBvbmVudC5lbGVtZW50Py5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBgLiR7UFJFRklYfS12aWV3cG9ydGBcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgIGlmICghdmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIltTY3JvbGxiYXJdIE5vIHZpZXdwb3J0IGVsZW1lbnQgZm91bmRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICB2aWV3cG9ydEVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICBgLiR7UFJFRklYfS0ke1ZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVJ9YFxuICAgICAgICApXG4gICAgICApXG4gICAgICAgIHJldHVybjtcblxuICAgICAgY3JlYXRlU2Nyb2xsYmFyRWxlbWVudHMoKTtcbiAgICAgIGlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgICBpZiAoc2Nyb2xsYmFyVHJhY2sgJiYgdmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgIHNjcm9sbGJhclRyYWNrLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVUcmFja0NsaWNrKTtcblxuICAgICAgICBpZiAoc2Nyb2xsYmFyVGh1bWIpIHtcbiAgICAgICAgICBzY3JvbGxiYXJUaHVtYi5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGhhbmRsZVRodW1iTW91c2VEb3duKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2VlbnRlclwiLCBzaG93LCB7IHBhc3NpdmU6IHRydWUgfSk7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgIFwibW91c2VsZWF2ZVwiLFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIGlmICghaXNEcmFnZ2luZykgaGlkZSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBwYXNzaXZlOiB0cnVlIH1cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIGN1cnJlbnQgdmlld3BvcnQgc3RhdGVcbiAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQpIHtcbiAgICAgICAgY29uc3QgaW5mbyA9IGNvbXBvbmVudC52aWV3cG9ydC5nZXRWaWV3cG9ydEluZm8oKTtcbiAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9IGluZm8udG90YWxWaXJ0dWFsU2l6ZTtcbiAgICAgICAgY29udGFpbmVyU2l6ZSA9IGluZm8uY29udGFpbmVyU2l6ZTtcblxuICAgICAgICAvLyBDaGVjayBpZiB3ZSdyZSBpbiBjdXJzb3IgbW9kZVxuICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb247XG4gICAgICAgIGNvbnN0IHZpZXdwb3J0Q29uZmlnID0gKGNvbXBvbmVudCBhcyBhbnkpLmNvbmZpZztcbiAgICAgICAgaXNDdXJzb3JNb2RlID0gdmlld3BvcnRDb25maWc/LnBhZ2luYXRpb24/LnN0cmF0ZWd5ID09PSBcImN1cnNvclwiO1xuXG4gICAgICAgIHVwZGF0ZUJvdW5kcyh0b3RhbFZpcnR1YWxTaXplLCBjb250YWluZXJTaXplKTtcbiAgICAgICAgdXBkYXRlUG9zaXRpb24oY29tcG9uZW50LnZpZXdwb3J0LmdldFNjcm9sbFBvc2l0aW9uKCkpO1xuICAgICAgfVxuXG4gICAgICAvLyBFdmVudCBsaXN0ZW5lcnNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6c2Nyb2xsXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFpc0RyYWdnaW5nKSB7XG4gICAgICAgICAgdXBkYXRlUG9zaXRpb24oZGF0YS5wb3NpdGlvbik7XG4gICAgICAgICAgc2hvdygpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDp2aXJ0dWFsLXNpemUtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRvdGFsVmlydHVhbFNpemUgPSBkYXRhLnRvdGFsVmlydHVhbFNpemU7XG4gICAgICAgIHVwZGF0ZUJvdW5kcyhkYXRhLnRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6Y29udGFpbmVyLXNpemUtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnRhaW5lclNpemUgPSBkYXRhLmNvbnRhaW5lclNpemU7XG4gICAgICAgIHVwZGF0ZUJvdW5kcyh0b3RhbFZpcnR1YWxTaXplLCBkYXRhLmNvbnRhaW5lclNpemUpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgaXRlbXMgbG9hZGVkIHRvIHVwZGF0ZSBzY3JvbGxiYXIgaW4gY3Vyc29yIG1vZGVcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6aXRlbXMtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChpc0N1cnNvck1vZGUpIHtcbiAgICAgICAgICBsb2FkZWRJdGVtc0NvdW50ID0gZGF0YS5sb2FkZWRDb3VudCB8fCAwO1xuICAgICAgICAgIHVwZGF0ZUJvdW5kcyh0b3RhbFZpcnR1YWxTaXplLCBjb250YWluZXJTaXplKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgdG90YWwgaXRlbXMgY2hhbmdlcyAoaW1wb3J0YW50IGZvciBjdXJzb3IgbW9kZSlcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6dG90YWwtaXRlbXMtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChpc0N1cnNvck1vZGUgJiYgZGF0YS50b3RhbCkge1xuICAgICAgICAgIC8vIEluIGN1cnNvciBtb2RlLCB0aGUgdG90YWwgaXMgZHluYW1pY1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYFtTY3JvbGxiYXJdIEN1cnNvciBtb2RlOiB1cGRhdGluZyBib3VuZHMgZm9yIG5ldyB0b3RhbCAke2RhdGEudG90YWx9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgdXBkYXRlQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gU3RvcmUgaW5pdGlhbGl6ZSBmdW5jdGlvblxuICAgIHN0b3JlRmVhdHVyZUZ1bmN0aW9uKGNvbXBvbmVudCwgXCJfc2Nyb2xsYmFySW5pdGlhbGl6ZVwiLCBpbml0aWFsaXplKTtcblxuICAgIC8vIEhvb2sgaW50byB2aWV3cG9ydCBpbml0aWFsaXphdGlvblxuICAgIHdyYXBJbml0aWFsaXplKGNvbXBvbmVudCwgaW5pdGlhbGl6ZSk7XG5cbiAgICAvLyBDbGVhbnVwXG4gICAgY29uc3QgZGVzdHJveSA9ICgpID0+IHtcbiAgICAgIGlmIChzY3JvbGxiYXJUcmFjaykge1xuICAgICAgICBzY3JvbGxiYXJUcmFjay5yZW1vdmUoKTtcbiAgICAgICAgc2Nyb2xsYmFyVHJhY2sgPSBudWxsO1xuICAgICAgfVxuICAgICAgc2Nyb2xsYmFyVGh1bWIgPSBudWxsO1xuICAgICAgdmlld3BvcnRFbGVtZW50ID0gbnVsbDtcbiAgICAgIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAgICAgaWYgKGhpZGVUaW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dChoaWRlVGltZW91dCk7XG4gICAgICAgIGhpZGVUaW1lb3V0ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgaGFuZGxlTW91c2VVcCk7XG4gICAgfTtcblxuICAgIHN0b3JlRmVhdHVyZUZ1bmN0aW9uKGNvbXBvbmVudCwgXCJfc2Nyb2xsYmFyRGVzdHJveVwiLCBkZXN0cm95KTtcbiAgICB3cmFwRGVzdHJveShjb21wb25lbnQsIGRlc3Ryb3kpO1xuXG4gICAgLy8gUmV0dXJuIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBzY3JvbGxiYXI6IHsgc2hvdywgaGlkZSwgdXBkYXRlQm91bmRzLCB1cGRhdGVQb3NpdGlvbiB9LFxuICAgIH07XG4gIH07XG59XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL2NvbGxlY3Rpb24udHNcblxuLyoqXG4gKiBDb2xsZWN0aW9uIEZlYXR1cmUgLSBEYXRhIG1hbmFnZW1lbnQgYW5kIHJhbmdlIGxvYWRpbmdcbiAqIEhhbmRsZXMgY29sbGVjdGlvbiBpbnRlZ3JhdGlvbiwgcGFnaW5hdGlvbiwgYW5kIGRhdGEgZmV0Y2hpbmdcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZJRVdQT1JUX0NPTlNUQU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHdyYXBEZXN0cm95IH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0aW9uQ29uZmlnIHtcbiAgY29sbGVjdGlvbj86IGFueTsgLy8gQ29sbGVjdGlvbiBhZGFwdGVyXG4gIHJhbmdlU2l6ZT86IG51bWJlcjsgLy8gRGVmYXVsdCByYW5nZSBzaXplIGZvciBsb2FkaW5nXG4gIHN0cmF0ZWd5PzogXCJvZmZzZXRcIiB8IFwicGFnZVwiIHwgXCJjdXJzb3JcIjsgLy8gTG9hZGluZyBzdHJhdGVneVxuICB0cmFuc2Zvcm0/OiAoaXRlbTogYW55KSA9PiBhbnk7IC8vIEl0ZW0gdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25cbiAgY2FuY2VsTG9hZFRocmVzaG9sZD86IG51bWJlcjsgLy8gVmVsb2NpdHkgdGhyZXNob2xkIGZvciBjYW5jZWxsaW5nIGxvYWRzXG4gIG1heENvbmN1cnJlbnRSZXF1ZXN0cz86IG51bWJlcjtcbiAgZW5hYmxlUmVxdWVzdFF1ZXVlPzogYm9vbGVhbjtcbiAgbWF4UXVldWVTaXplPzogbnVtYmVyO1xuICBsb2FkT25EcmFnRW5kPzogYm9vbGVhbjsgLy8gRW5hYmxlIGxvYWRpbmcgd2hlbiBkcmFnIGVuZHMgKHNhZmV0eSBtZWFzdXJlKVxuICBpbml0aWFsU2Nyb2xsSW5kZXg/OiBudW1iZXI7IC8vIEluaXRpYWwgc2Nyb2xsIHBvc2l0aW9uICgwLWJhc2VkIGluZGV4KVxuICBzZWxlY3RJZD86IHN0cmluZyB8IG51bWJlcjsgLy8gSUQgb2YgaXRlbSB0byBzZWxlY3QgYWZ0ZXIgaW5pdGlhbCBsb2FkIGNvbXBsZXRlc1xuICBhdXRvTG9hZD86IGJvb2xlYW47IC8vIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBsb2FkIGRhdGEgb24gaW5pdGlhbGl6YXRpb24gKGRlZmF1bHQ6IHRydWUpXG4gIGF1dG9TZWxlY3RGaXJzdD86IGJvb2xlYW47IC8vIEF1dG9tYXRpY2FsbHkgc2VsZWN0IGZpcnN0IGl0ZW0gYWZ0ZXIgaW5pdGlhbCBsb2FkIChkZWZhdWx0OiBmYWxzZSlcbiAgLyoqIE1heGltdW0gaXRlbXMgdG8ga2VlcCBpbiBtZW1vcnkgKGRlZmF1bHQ6IDEwMDApICovXG4gIG1heENhY2hlZEl0ZW1zPzogbnVtYmVyO1xuICAvKiogRXh0cmEgaXRlbXMgdG8ga2VlcCBhcm91bmQgdmlzaWJsZSByYW5nZSBkdXJpbmcgZXZpY3Rpb24gKGRlZmF1bHQ6IDE1MCkgKi9cbiAgZXZpY3Rpb25CdWZmZXI/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGlvbkNvbXBvbmVudCB7XG4gIGNvbGxlY3Rpb246IHtcbiAgICBsb2FkUmFuZ2U6IChvZmZzZXQ6IG51bWJlciwgbGltaXQ6IG51bWJlcikgPT4gUHJvbWlzZTxhbnlbXT47XG4gICAgbG9hZE1pc3NpbmdSYW5nZXM6IChcbiAgICAgIHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0sXG4gICAgICBjYWxsZXI/OiBzdHJpbmcsXG4gICAgKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIGdldExvYWRlZFJhbmdlczogKCkgPT4gU2V0PG51bWJlcj47XG4gICAgZ2V0UGVuZGluZ1JhbmdlczogKCkgPT4gU2V0PG51bWJlcj47XG4gICAgY2xlYXJGYWlsZWRSYW5nZXM6ICgpID0+IHZvaWQ7XG4gICAgcmV0cnlGYWlsZWRSYW5nZTogKHJhbmdlSWQ6IG51bWJlcikgPT4gUHJvbWlzZTxhbnlbXT47XG4gICAgc2V0VG90YWxJdGVtczogKHRvdGFsOiBudW1iZXIpID0+IHZvaWQ7XG4gICAgZ2V0VG90YWxJdGVtczogKCkgPT4gbnVtYmVyO1xuICAgIC8vIEN1cnNvci1zcGVjaWZpYyBtZXRob2RzXG4gICAgZ2V0Q3VycmVudEN1cnNvcjogKCkgPT4gc3RyaW5nIHwgbnVsbDtcbiAgICBnZXRDdXJzb3JGb3JQYWdlOiAocGFnZTogbnVtYmVyKSA9PiBzdHJpbmcgfCBudWxsO1xuICAgIC8vIFJlc2V0IG1ldGhvZCBmb3IgcmVsb2FkIGZ1bmN0aW9uYWxpdHlcbiAgICByZXNldDogKCkgPT4gdm9pZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBBZGRzIGNvbGxlY3Rpb24gZnVuY3Rpb25hbGl0eSB0byB2aWV3cG9ydCBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhDb2xsZWN0aW9uKGNvbmZpZzogQ29sbGVjdGlvbkNvbmZpZyA9IHt9KSB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50PihcbiAgICBjb21wb25lbnQ6IFQsXG4gICk6IFQgJiBDb2xsZWN0aW9uQ29tcG9uZW50ID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBjb2xsZWN0aW9uLFxuICAgICAgcmFuZ2VTaXplID0gVklFV1BPUlRfQ09OU1RBTlRTLkxPQURJTkcuREVGQVVMVF9SQU5HRV9TSVpFLFxuICAgICAgc3RyYXRlZ3kgPSBcIm9mZnNldFwiLFxuICAgICAgdHJhbnNmb3JtLFxuICAgICAgY2FuY2VsTG9hZFRocmVzaG9sZCA9IFZJRVdQT1JUX0NPTlNUQU5UUy5MT0FESU5HLkNBTkNFTF9USFJFU0hPTEQsXG4gICAgICBtYXhDb25jdXJyZW50UmVxdWVzdHMgPSBWSUVXUE9SVF9DT05TVEFOVFMuTE9BRElOR1xuICAgICAgICAuTUFYX0NPTkNVUlJFTlRfUkVRVUVTVFMsXG4gICAgICBlbmFibGVSZXF1ZXN0UXVldWUgPSBWSUVXUE9SVF9DT05TVEFOVFMuUkVRVUVTVF9RVUVVRS5FTkFCTEVELFxuICAgICAgbWF4UXVldWVTaXplID0gVklFV1BPUlRfQ09OU1RBTlRTLlJFUVVFU1RfUVVFVUUuTUFYX1FVRVVFX1NJWkUsXG4gICAgICBsb2FkT25EcmFnRW5kID0gdHJ1ZSwgLy8gRGVmYXVsdCB0byB0cnVlIGFzIHNhZmV0eSBtZWFzdXJlXG4gICAgICBpbml0aWFsU2Nyb2xsSW5kZXggPSAwLCAvLyBTdGFydCBmcm9tIGJlZ2lubmluZyBieSBkZWZhdWx0XG4gICAgICBzZWxlY3RJZCwgLy8gSUQgb2YgaXRlbSB0byBzZWxlY3QgYWZ0ZXIgaW5pdGlhbCBsb2FkXG4gICAgICBhdXRvTG9hZCA9IHRydWUsIC8vIEF1dG8tbG9hZCBpbml0aWFsIGRhdGEgYnkgZGVmYXVsdFxuICAgICAgYXV0b1NlbGVjdEZpcnN0ID0gZmFsc2UsIC8vIEF1dG9tYXRpY2FsbHkgc2VsZWN0IGZpcnN0IGl0ZW0gYWZ0ZXIgaW5pdGlhbCBsb2FkXG4gICAgICBtYXhDYWNoZWRJdGVtcyA9IDEwMDAsIC8vIE1heGltdW0gaXRlbXMgdG8ga2VlcCBpbiBtZW1vcnlcbiAgICAgIGV2aWN0aW9uQnVmZmVyID0gMTUwLCAvLyBFeHRyYSBpdGVtcyB0byBrZWVwIGFyb3VuZCB2aXNpYmxlIHJhbmdlXG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIFRyYWNrIGlmIHdlJ3ZlIGNvbXBsZXRlZCB0aGUgaW5pdGlhbCBsb2FkIGZvciBpbml0aWFsU2Nyb2xsSW5kZXhcbiAgICAvLyBUaGlzIHByZXZlbnRzIHRoZSB2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkIGxpc3RlbmVyIGZyb20gbG9hZGluZyBwYWdlIDFcbiAgICBsZXQgaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCA9IGZhbHNlO1xuICAgIGNvbnN0IGhhc0luaXRpYWxTY3JvbGxJbmRleCA9IGluaXRpYWxTY3JvbGxJbmRleCA+IDA7XG5cbiAgICAvLyBjb25zb2xlLmxvZyhcIltWaWV3cG9ydCBDb2xsZWN0aW9uXSBJbml0aWFsaXplZCB3aXRoIGNvbmZpZzpcIiwge1xuICAgIC8vICAgc3RyYXRlZ3ksXG4gICAgLy8gICByYW5nZVNpemUsXG4gICAgLy8gICBpbml0aWFsU2Nyb2xsSW5kZXgsXG4gICAgLy8gfSk7XG5cbiAgICAvLyBMb2FkaW5nIG1hbmFnZXIgc3RhdGVcbiAgICBpbnRlcmZhY2UgUXVldWVkUmVxdWVzdCB7XG4gICAgICByYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9O1xuICAgICAgcHJpb3JpdHk6IFwiaGlnaFwiIHwgXCJub3JtYWxcIiB8IFwibG93XCI7XG4gICAgICB0aW1lc3RhbXA6IG51bWJlcjtcbiAgICAgIHJlc29sdmU6ICgpID0+IHZvaWQ7XG4gICAgICByZWplY3Q6IChlcnJvcjogYW55KSA9PiB2b2lkO1xuICAgICAgY2FsbGVyPzogc3RyaW5nO1xuICAgIH1cblxuICAgIC8vIFN0YXRlIHRyYWNraW5nXG4gICAgbGV0IGN1cnJlbnRWZWxvY2l0eSA9IDA7XG4gICAgbGV0IGFjdGl2ZUxvYWRDb3VudCA9IDA7XG4gICAgbGV0IGNvbXBsZXRlZExvYWRzID0gMDtcbiAgICBsZXQgZmFpbGVkTG9hZHMgPSAwO1xuICAgIGxldCBjYW5jZWxsZWRMb2FkcyA9IDA7XG4gICAgbGV0IGlzRHJhZ2dpbmcgPSBmYWxzZTsgLy8gVHJhY2sgZHJhZyBzdGF0ZVxuXG4gICAgLy8gQ2FjaGUgZXZpY3Rpb24gY29uZmlndXJhdGlvbiAoZnJvbSBjb25maWcpXG4gICAgY29uc3QgTUFYX0NBQ0hFRF9JVEVNUyA9IG1heENhY2hlZEl0ZW1zO1xuICAgIGNvbnN0IEVWSUNUSU9OX0JVRkZFUiA9IGV2aWN0aW9uQnVmZmVyO1xuXG4gICAgLy8gTWVtb3J5IGRpYWdub3N0aWNzXG4gICAgY29uc3QgbG9nTWVtb3J5U3RhdHMgPSAoY2FsbGVyOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1Db3VudCA9IGl0ZW1zLmZpbHRlcihCb29sZWFuKS5sZW5ndGg7XG4gICAgICBjb25zdCBsb2FkZWRSYW5nZUNvdW50ID0gbG9hZGVkUmFuZ2VzLnNpemU7XG4gICAgICBjb25zdCBwZW5kaW5nUmFuZ2VDb3VudCA9IHBlbmRpbmdSYW5nZXMuc2l6ZTtcbiAgICAgIGNvbnN0IGFib3J0Q29udHJvbGxlckNvdW50ID0gYWJvcnRDb250cm9sbGVycy5zaXplO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBFdmljdCBpdGVtcyBmYXIgZnJvbSB0aGUgY3VycmVudCB2aXNpYmxlIHJhbmdlIHRvIHByZXZlbnQgbWVtb3J5IGJsb2F0XG4gICAgICogS2VlcHMgaXRlbXMgd2l0aGluIEVWSUNUSU9OX0JVRkZFUiBvZiB0aGUgdmlzaWJsZSByYW5nZVxuICAgICAqL1xuICAgIGNvbnN0IGV2aWN0RGlzdGFudEl0ZW1zID0gKHZpc2libGVTdGFydDogbnVtYmVyLCB2aXNpYmxlRW5kOiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1Db3VudCA9IGl0ZW1zLmZpbHRlcihCb29sZWFuKS5sZW5ndGg7XG5cbiAgICAgIC8vIE9ubHkgZXZpY3QgaWYgd2UgaGF2ZSBtb3JlIHRoYW4gTUFYX0NBQ0hFRF9JVEVNU1xuICAgICAgaWYgKGl0ZW1Db3VudCA8PSBNQVhfQ0FDSEVEX0lURU1TKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2VlcFN0YXJ0ID0gTWF0aC5tYXgoMCwgdmlzaWJsZVN0YXJ0IC0gRVZJQ1RJT05fQlVGRkVSKTtcbiAgICAgIGNvbnN0IGtlZXBFbmQgPSB2aXNpYmxlRW5kICsgRVZJQ1RJT05fQlVGRkVSO1xuXG4gICAgICBsZXQgZXZpY3RlZENvdW50ID0gMDtcbiAgICAgIGNvbnN0IHJhbmdlc1RvUmVtb3ZlID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgICAgIC8vIEZpbmQgaXRlbXMgdG8gZXZpY3QgYW5kIHRyYWNrIHdoaWNoIHJhbmdlcyBhcmUgYWZmZWN0ZWRcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGl0ZW1zW2ldICE9PSB1bmRlZmluZWQgJiYgKGkgPCBrZWVwU3RhcnQgfHwgaSA+IGtlZXBFbmQpKSB7XG4gICAgICAgICAgZGVsZXRlIGl0ZW1zW2ldO1xuICAgICAgICAgIGV2aWN0ZWRDb3VudCsrO1xuICAgICAgICAgIC8vIE1hcmsgdGhlIHJhbmdlIGNvbnRhaW5pbmcgdGhpcyBpdGVtIGZvciByZW1vdmFsIGZyb20gbG9hZGVkUmFuZ2VzXG4gICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoZSByYW5nZSB3aWxsIGJlIHJlbG9hZGVkIHdoZW4gc2Nyb2xsaW5nIGJhY2tcbiAgICAgICAgICBjb25zdCBhZmZlY3RlZFJhbmdlSWQgPSBNYXRoLmZsb29yKGkgLyByYW5nZVNpemUpO1xuICAgICAgICAgIHJhbmdlc1RvUmVtb3ZlLmFkZChhZmZlY3RlZFJhbmdlSWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSBhbGwgcmFuZ2VzIHRoYXQgaGFkIGFueSBpdGVtcyBldmljdGVkXG4gICAgICAvLyBUaGlzIGlzIGNyaXRpY2FsOiBldmVuIGlmIG9ubHkgcGFydCBvZiBhIHJhbmdlIHdhcyBldmljdGVkLFxuICAgICAgLy8gd2UgbXVzdCByZW1vdmUgaXQgZnJvbSBsb2FkZWRSYW5nZXMgc28gaXQgZ2V0cyByZWxvYWRlZFxuICAgICAgLy8gQWxzbyByZW1vdmUgZnJvbSBwZW5kaW5nUmFuZ2VzIC0gaWYgYSBzbG93IHJlcXVlc3QgY29tcGxldGVzIGZvciBhbiBldmljdGVkIHJhbmdlLFxuICAgICAgLy8gd2UgZG9uJ3Qgd2FudCBpdCB0byBibG9jayBmdXR1cmUgbG9hZHMgd2hlbiB1c2VyIHNjcm9sbHMgYmFja1xuICAgICAgcmFuZ2VzVG9SZW1vdmUuZm9yRWFjaCgocmFuZ2VJZCkgPT4ge1xuICAgICAgICBsb2FkZWRSYW5nZXMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICBwZW5kaW5nUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgLy8gQ2xlYW4gdXAgYWN0aXZlIHJlcXVlc3RzIHRyYWNraW5nXG4gICAgICAgIGFjdGl2ZVJlcXVlc3RzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgLy8gQWxzbyBhYm9ydCBhbnkgaW4tZmxpZ2h0IHJlcXVlc3QgZm9yIHRoaXMgcmFuZ2UgdG8gZnJlZSB1cCBuZXR3b3JrIHJlc291cmNlc1xuICAgICAgICBjb25zdCBjb250cm9sbGVyID0gYWJvcnRDb250cm9sbGVycy5nZXQocmFuZ2VJZCk7XG4gICAgICAgIGlmIChjb250cm9sbGVyKSB7XG4gICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgIGFib3J0Q29udHJvbGxlcnMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKGV2aWN0ZWRDb3VudCA+IDApIHtcbiAgICAgICAgLy8gRW1pdCBldmVudCBmb3IgcmVuZGVyaW5nIHRvIGFsc28gY2xlYW4gdXBcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImNvbGxlY3Rpb246aXRlbXMtZXZpY3RlZFwiLCB7XG4gICAgICAgICAga2VlcFN0YXJ0LFxuICAgICAgICAgIGtlZXBFbmQsXG4gICAgICAgICAgZXZpY3RlZENvdW50LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgYWN0aXZlTG9hZFJhbmdlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGxldCBsb2FkUmVxdWVzdFF1ZXVlOiBRdWV1ZWRSZXF1ZXN0W10gPSBbXTtcblxuICAgIC8vIEFib3J0Q29udHJvbGxlciBtYXAgZm9yIGNhbmNlbGxpbmcgaW4tZmxpZ2h0IHJlcXVlc3RzXG4gICAgY29uc3QgYWJvcnRDb250cm9sbGVycyA9IG5ldyBNYXA8bnVtYmVyLCBBYm9ydENvbnRyb2xsZXI+KCk7XG5cbiAgICAvLyBTdGF0ZVxuICAgIGxldCBpdGVtczogYW55W10gPSBbXTtcbiAgICBsZXQgdG90YWxJdGVtcyA9IDA7XG4gICAgbGV0IGxvYWRlZFJhbmdlcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgIGxldCBwZW5kaW5nUmFuZ2VzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgbGV0IGZhaWxlZFJhbmdlcyA9IG5ldyBNYXA8XG4gICAgICBudW1iZXIsXG4gICAgICB7XG4gICAgICAgIGF0dGVtcHRzOiBudW1iZXI7XG4gICAgICAgIGxhc3RFcnJvcjogRXJyb3I7XG4gICAgICAgIHRpbWVzdGFtcDogbnVtYmVyO1xuICAgICAgfVxuICAgID4oKTtcbiAgICBsZXQgYWN0aXZlUmVxdWVzdHMgPSBuZXcgTWFwPG51bWJlciwgUHJvbWlzZTxhbnlbXT4+KCk7XG5cbiAgICAvLyBDdXJzb3IgcGFnaW5hdGlvbiBzdGF0ZVxuICAgIGxldCBjdXJyZW50Q3Vyc29yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgY3Vyc29yTWFwID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTsgLy8gTWFwIHBhZ2UgbnVtYmVyIHRvIGN1cnNvclxuICAgIGxldCBwYWdlVG9PZmZzZXRNYXAgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpOyAvLyBNYXAgcGFnZSB0byBhY3R1YWwgb2Zmc2V0XG4gICAgbGV0IGhpZ2hlc3RMb2FkZWRQYWdlID0gMDtcbiAgICBsZXQgZGlzY292ZXJlZFRvdGFsOiBudW1iZXIgfCBudWxsID0gbnVsbDsgLy8gVHJhY2sgZGlzY292ZXJlZCB0b3RhbCBmcm9tIEFQSVxuICAgIGxldCBoYXNSZWFjaGVkRW5kID0gZmFsc2U7IC8vIFRyYWNrIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiBkYXRhXG5cbiAgICAvLyBTaGFyZSBpdGVtcyBhcnJheSB3aXRoIGNvbXBvbmVudFxuICAgIGNvbXBvbmVudC5pdGVtcyA9IGl0ZW1zO1xuXG4gICAgLyoqXG4gICAgICogR2V0IGEgdW5pcXVlIElEIGZvciBhIHJhbmdlIGJhc2VkIG9uIG9mZnNldCBhbmQgdGhlIGJhc2UgcmFuZ2Ugc2l6ZVxuICAgICAqL1xuICAgIGNvbnN0IGdldFJhbmdlSWQgPSAob2Zmc2V0OiBudW1iZXIsIGxpbWl0OiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgICAgLy8gQWx3YXlzIHVzZSB0aGUgYmFzZSByYW5nZVNpemUgZm9yIGNvbnNpc3RlbnQgSURzXG4gICAgICAvLyBUaGlzIGVuc3VyZXMgbWVyZ2VkIHJhbmdlcyBjYW4gYmUgdHJhY2tlZCBwcm9wZXJseVxuICAgICAgcmV0dXJuIE1hdGguZmxvb3Iob2Zmc2V0IC8gcmFuZ2VTaXplKTtcbiAgICB9O1xuXG4gICAgLy8gTG9hZGluZyBtYW5hZ2VyIGhlbHBlcnNcbiAgICBjb25zdCBnZXRSYW5nZUtleSA9IChyYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9KTogc3RyaW5nID0+IHtcbiAgICAgIHJldHVybiBgJHtyYW5nZS5zdGFydH0tJHtyYW5nZS5lbmR9YDtcbiAgICB9O1xuXG4gICAgY29uc3QgY2FuTG9hZCA9ICgpOiBib29sZWFuID0+IHtcbiAgICAgIHJldHVybiBjdXJyZW50VmVsb2NpdHkgPD0gY2FuY2VsTG9hZFRocmVzaG9sZDtcbiAgICB9O1xuXG4gICAgY29uc3QgcHJvY2Vzc1F1ZXVlID0gKCkgPT4ge1xuICAgICAgaWYgKCFlbmFibGVSZXF1ZXN0UXVldWUgfHwgbG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgLy8gU29ydCBxdWV1ZSBieSBwcmlvcml0eSBhbmQgdGltZXN0YW1wXG4gICAgICBsb2FkUmVxdWVzdFF1ZXVlLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgcHJpb3JpdHlPcmRlciA9IHsgaGlnaDogMCwgbm9ybWFsOiAxLCBsb3c6IDIgfTtcbiAgICAgICAgY29uc3QgcHJpb3JpdHlEaWZmID1cbiAgICAgICAgICBwcmlvcml0eU9yZGVyW2EucHJpb3JpdHldIC0gcHJpb3JpdHlPcmRlcltiLnByaW9yaXR5XTtcbiAgICAgICAgcmV0dXJuIHByaW9yaXR5RGlmZiAhPT0gMCA/IHByaW9yaXR5RGlmZiA6IGEudGltZXN0YW1wIC0gYi50aW1lc3RhbXA7XG4gICAgICB9KTtcblxuICAgICAgLy8gUHJvY2VzcyByZXF1ZXN0cyB1cCB0byBjYXBhY2l0eVxuICAgICAgd2hpbGUgKFxuICAgICAgICBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgYWN0aXZlTG9hZENvdW50IDwgbWF4Q29uY3VycmVudFJlcXVlc3RzXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IGxvYWRSZXF1ZXN0UXVldWUuc2hpZnQoKTtcbiAgICAgICAgaWYgKHJlcXVlc3QpIHtcbiAgICAgICAgICBleGVjdXRlUXVldWVkTG9hZChyZXF1ZXN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBleGVjdXRlUXVldWVkTG9hZCA9IChyZXF1ZXN0OiBRdWV1ZWRSZXF1ZXN0KSA9PiB7XG4gICAgICBhY3RpdmVMb2FkQ291bnQrKztcbiAgICAgIGFjdGl2ZUxvYWRSYW5nZXMuYWRkKGdldFJhbmdlS2V5KHJlcXVlc3QucmFuZ2UpKTtcblxuICAgICAgLy8gQ2FsbCB0aGUgYWN0dWFsIGxvYWRNaXNzaW5nUmFuZ2VzIGZ1bmN0aW9uXG4gICAgICBsb2FkTWlzc2luZ1Jhbmdlc0ludGVybmFsKHJlcXVlc3QucmFuZ2UsIHJlcXVlc3QuY2FsbGVyKVxuICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmVxdWVzdC5yZXNvbHZlKCk7XG4gICAgICAgICAgY29tcGxldGVkTG9hZHMrKztcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICByZXF1ZXN0LnJlamVjdChlcnJvcik7XG4gICAgICAgICAgZmFpbGVkTG9hZHMrKztcbiAgICAgICAgfSlcbiAgICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgIGFjdGl2ZUxvYWRDb3VudC0tO1xuICAgICAgICAgIGFjdGl2ZUxvYWRSYW5nZXMuZGVsZXRlKGdldFJhbmdlS2V5KHJlcXVlc3QucmFuZ2UpKTtcbiAgICAgICAgICBwcm9jZXNzUXVldWUoKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybSBpdGVtcyBpZiB0cmFuc2Zvcm0gZnVuY3Rpb24gcHJvdmlkZWRcbiAgICAgKi9cbiAgICBjb25zdCB0cmFuc2Zvcm1JdGVtcyA9IChyYXdJdGVtczogYW55W10pOiBhbnlbXSA9PiB7XG4gICAgICBpZiAoIXRyYW5zZm9ybSkgcmV0dXJuIHJhd0l0ZW1zO1xuICAgICAgcmV0dXJuIHJhd0l0ZW1zLm1hcCh0cmFuc2Zvcm0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGEgcmFuZ2Ugb2YgZGF0YVxuICAgICAqL1xuICAgIGNvbnN0IGxvYWRSYW5nZSA9IGFzeW5jIChvZmZzZXQ6IG51bWJlciwgbGltaXQ6IG51bWJlcik6IFByb21pc2U8YW55W10+ID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIGxvYWRSYW5nZSBjYWxsZWQ6IG9mZnNldD0ke29mZnNldH0sIGxpbWl0PSR7bGltaXR9YCxcbiAgICAgIC8vICk7XG5cbiAgICAgIGlmICghY29sbGVjdGlvbikge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJbQ29sbGVjdGlvbl0gTm8gY29sbGVjdGlvbiBhZGFwdGVyIGNvbmZpZ3VyZWRcIik7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmFuZ2VJZCA9IGdldFJhbmdlSWQob2Zmc2V0LCBsaW1pdCk7XG4gICAgICAvLyBjb25zb2xlLmxvZyhgW0NvbGxlY3Rpb25dIFJhbmdlIElEOiAke3JhbmdlSWR9YCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIGFscmVhZHkgbG9hZGVkXG4gICAgICBpZiAobG9hZGVkUmFuZ2VzLmhhcyhyYW5nZUlkKSkge1xuICAgICAgICByZXR1cm4gaXRlbXMuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBsaW1pdCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGFscmVhZHkgcGVuZGluZ1xuICAgICAgaWYgKHBlbmRpbmdSYW5nZXMuaGFzKHJhbmdlSWQpKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nUmVxdWVzdCA9IGFjdGl2ZVJlcXVlc3RzLmdldChyYW5nZUlkKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nUmVxdWVzdCkge1xuICAgICAgICAgIHJldHVybiBleGlzdGluZ1JlcXVlc3Q7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTWFyayBhcyBwZW5kaW5nXG4gICAgICBwZW5kaW5nUmFuZ2VzLmFkZChyYW5nZUlkKTtcblxuICAgICAgLy8gQ3JlYXRlIEFib3J0Q29udHJvbGxlciBmb3IgdGhpcyByZXF1ZXN0XG4gICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICBhYm9ydENvbnRyb2xsZXJzLnNldChyYW5nZUlkLCBhYm9ydENvbnRyb2xsZXIpO1xuXG4gICAgICAvLyBDcmVhdGUgcmVxdWVzdCBwcm9taXNlXG4gICAgICBjb25zdCByZXF1ZXN0UHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gQ2FsbCBjb2xsZWN0aW9uIGFkYXB0ZXIgd2l0aCBhcHByb3ByaWF0ZSBwYXJhbWV0ZXJzXG4gICAgICAgICAgY29uc3QgcGFnZSA9IE1hdGguZmxvb3Iob2Zmc2V0IC8gbGltaXQpICsgMTtcbiAgICAgICAgICBsZXQgcGFyYW1zOiBhbnk7XG5cbiAgICAgICAgICBpZiAoc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIpIHtcbiAgICAgICAgICAgIC8vIEZvciBjdXJzb3IgcGFnaW5hdGlvblxuICAgICAgICAgICAgaWYgKHBhZ2UgPT09IDEpIHtcbiAgICAgICAgICAgICAgLy8gRmlyc3QgcGFnZSAtIG5vIGN1cnNvclxuICAgICAgICAgICAgICBwYXJhbXMgPSB7IGxpbWl0IH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGN1cnNvciBmb3IgcHJldmlvdXMgcGFnZVxuICAgICAgICAgICAgICBjb25zdCBwcmV2UGFnZUN1cnNvciA9IGN1cnNvck1hcC5nZXQocGFnZSAtIDEpO1xuICAgICAgICAgICAgICBpZiAoIXByZXZQYWdlQ3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2FuJ3QgbG9hZCB0aGlzIHBhZ2Ugd2l0aG91dCBwcmV2aW91cyBjdXJzb3JcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICBgW0NvbGxlY3Rpb25dIENhbm5vdCBsb2FkIHBhZ2UgJHtwYWdlfSB3aXRob3V0IGN1cnNvciBmb3IgcGFnZSAke1xuICAgICAgICAgICAgICAgICAgICBwYWdlIC0gMVxuICAgICAgICAgICAgICAgICAgfWAsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICBgU2VxdWVudGlhbCBsb2FkaW5nIHJlcXVpcmVkIC0gbWlzc2luZyBjdXJzb3IgZm9yIHBhZ2UgJHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZSAtIDFcbiAgICAgICAgICAgICAgICAgIH1gLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcGFyYW1zID0geyBjdXJzb3I6IHByZXZQYWdlQ3Vyc29yLCBsaW1pdCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RyYXRlZ3kgPT09IFwicGFnZVwiKSB7XG4gICAgICAgICAgICBwYXJhbXMgPSB7IHBhZ2UsIGxpbWl0IH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG9mZnNldCBzdHJhdGVneVxuICAgICAgICAgICAgcGFyYW1zID0geyBvZmZzZXQsIGxpbWl0IH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW1ZpZXdwb3J0IENvbGxlY3Rpb25dIExvYWRpbmcgcmFuZ2Ugb2Zmc2V0PSR7b2Zmc2V0fSwgbGltaXQ9JHtsaW1pdH0sIHN0cmF0ZWd5PSR7c3RyYXRlZ3l9LCBjYWxjdWxhdGVkIHBhZ2U9JHtwYWdlfSwgcGFyYW1zOmAsXG4gICAgICAgICAgLy8gICBKU09OLnN0cmluZ2lmeShwYXJhbXMpXG4gICAgICAgICAgLy8gKTtcblxuICAgICAgICAgIC8vIFBhc3MgYWJvcnQgc2lnbmFsIHRvIHRoZSBhZGFwdGVyIGlmIGl0IHN1cHBvcnRzIGl0XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjb2xsZWN0aW9uLnJlYWQoe1xuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRXh0cmFjdCBpdGVtcyBhbmQgdG90YWxcbiAgICAgICAgICBjb25zdCByYXdJdGVtcyA9IHJlc3BvbnNlLmRhdGEgfHwgcmVzcG9uc2UuaXRlbXMgfHwgcmVzcG9uc2U7XG4gICAgICAgICAgY29uc3QgbWV0YSA9IHJlc3BvbnNlLm1ldGEgfHwge307XG5cbiAgICAgICAgICAvLyBGb3IgY3Vyc29yIHBhZ2luYXRpb24sIHRyYWNrIHRoZSBjdXJzb3IgKGNoZWNrIGJvdGggY3Vyc29yIGFuZCBuZXh0Q3Vyc29yKVxuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlQ3Vyc29yID0gbWV0YS5jdXJzb3IgfHwgbWV0YS5uZXh0Q3Vyc29yO1xuICAgICAgICAgIGlmIChzdHJhdGVneSA9PT0gXCJjdXJzb3JcIiAmJiByZXNwb25zZUN1cnNvcikge1xuICAgICAgICAgICAgY3VycmVudEN1cnNvciA9IHJlc3BvbnNlQ3Vyc29yO1xuICAgICAgICAgICAgY3Vyc29yTWFwLnNldChwYWdlLCByZXNwb25zZUN1cnNvcik7XG4gICAgICAgICAgICBwYWdlVG9PZmZzZXRNYXAuc2V0KHBhZ2UsIG9mZnNldCk7XG4gICAgICAgICAgICBoaWdoZXN0TG9hZGVkUGFnZSA9IE1hdGgubWF4KGhpZ2hlc3RMb2FkZWRQYWdlLCBwYWdlKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFN0b3JlZCBjdXJzb3IgZm9yIHBhZ2UgJHtwYWdlfTogJHtyZXNwb25zZUN1cnNvcn1gLFxuICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB3ZSd2ZSByZWFjaGVkIHRoZSBlbmRcbiAgICAgICAgICBpZiAoc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIgJiYgbWV0YS5oYXNOZXh0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgaGFzUmVhY2hlZEVuZCA9IHRydWU7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBSZWFjaGVkIGVuZCBvZiBjdXJzb3IgcGFnaW5hdGlvbiBhdCBwYWdlICR7cGFnZX1gLFxuICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBVcGRhdGUgZGlzY292ZXJlZCB0b3RhbCBpZiBwcm92aWRlZFxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBtZXRhLnRvdGFsOiAke21ldGEudG90YWx9LCBkaXNjb3ZlcmVkVG90YWwgYmVmb3JlOiAke2Rpc2NvdmVyZWRUb3RhbH1gLFxuICAgICAgICAgIC8vICk7XG4gICAgICAgICAgaWYgKG1ldGEudG90YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGlzY292ZXJlZFRvdGFsID0gbWV0YS50b3RhbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coYFtDb2xsZWN0aW9uXSBkaXNjb3ZlcmVkVG90YWwgYWZ0ZXI6ICR7ZGlzY292ZXJlZFRvdGFsfWApO1xuXG4gICAgICAgICAgLy8gVHJhbnNmb3JtIGl0ZW1zXG4gICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRJdGVtcyA9IHRyYW5zZm9ybUl0ZW1zKHJhd0l0ZW1zKTtcblxuICAgICAgICAgIC8vIEFkZCBpdGVtcyB0byBhcnJheVxuICAgICAgICAgIHRyYW5zZm9ybWVkSXRlbXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGl0ZW1zW29mZnNldCArIGluZGV4XSA9IGl0ZW07XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBGb3IgY3Vyc29yIHN0cmF0ZWd5LCBjYWxjdWxhdGUgZHluYW1pYyB0b3RhbCBiYXNlZCBvbiBsb2FkZWQgZGF0YVxuICAgICAgICAgIC8vIFVzZSBudWxsaXNoIGNvYWxlc2NpbmcgKD8/KSBpbnN0ZWFkIG9mIHx8IHRvIGhhbmRsZSBkaXNjb3ZlcmVkVG90YWwgPSAwIGNvcnJlY3RseVxuICAgICAgICAgIGxldCBuZXdUb3RhbCA9IGRpc2NvdmVyZWRUb3RhbCA/PyB0b3RhbEl0ZW1zO1xuXG4gICAgICAgICAgLy8gQ1JJVElDQUwgRklYOiBXaGVuIEFQSSByZXR1cm5zIDAgaXRlbXMgb24gcGFnZSAxIChvZmZzZXQgMCksIHRoZSBsaXN0IGlzIGVtcHR5LlxuICAgICAgICAgIC8vIFdlIG11c3Qgc2V0IHRvdGFsSXRlbXMgdG8gMCByZWdhcmRsZXNzIG9mIG1ldGEudG90YWwgYmVpbmcgdW5kZWZpbmVkLlxuICAgICAgICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBjb3VudD1mYWxzZSBpcyBzZW50IGJ1dCB0aGUgbGlzdCBpcyBhY3R1YWxseSBlbXB0eS5cbiAgICAgICAgICBpZiAob2Zmc2V0ID09PSAwICYmIHRyYW5zZm9ybWVkSXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBFbXB0eSByZXN1bHQgb24gcGFnZSAxIC0gZm9yY2luZyB0b3RhbEl0ZW1zIHRvIDBgLFxuICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgIG5ld1RvdGFsID0gMDtcbiAgICAgICAgICAgIGRpc2NvdmVyZWRUb3RhbCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBuZXdUb3RhbCBpbml0aWFsOiAke25ld1RvdGFsfSwgdG90YWxJdGVtczogJHt0b3RhbEl0ZW1zfSwgc3RyYXRlZ3k6ICR7c3RyYXRlZ3l9YCxcbiAgICAgICAgICAvLyApO1xuXG4gICAgICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImN1cnNvclwiKSB7XG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdG90YWwgYmFzZWQgb24gbG9hZGVkIGl0ZW1zICsgbWFyZ2luXG4gICAgICAgICAgICBjb25zdCBsb2FkZWRJdGVtc0NvdW50ID0gaXRlbXMuZmlsdGVyKFxuICAgICAgICAgICAgICAoaXRlbSkgPT4gaXRlbSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgKS5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBtYXJnaW5JdGVtcyA9IGhhc1JlYWNoZWRFbmRcbiAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgIDogcmFuZ2VTaXplICpcbiAgICAgICAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUEFHSU5BVElPTi5DVVJTT1JfU0NST0xMX01BUkdJTl9NVUxUSVBMSUVSO1xuICAgICAgICAgICAgY29uc3QgbWluVmlydHVhbEl0ZW1zID1cbiAgICAgICAgICAgICAgcmFuZ2VTaXplICpcbiAgICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlBBR0lOQVRJT04uQ1VSU09SX01JTl9WSVJUVUFMX1NJWkVfTVVMVElQTElFUjtcblxuICAgICAgICAgICAgLy8gRHluYW1pYyB0b3RhbDogbG9hZGVkIGl0ZW1zICsgbWFyZ2luICh1bmxlc3Mgd2UndmUgcmVhY2hlZCB0aGUgZW5kKVxuICAgICAgICAgICAgbmV3VG90YWwgPSBNYXRoLm1heChcbiAgICAgICAgICAgICAgbG9hZGVkSXRlbXNDb3VudCArIG1hcmdpbkl0ZW1zLFxuICAgICAgICAgICAgICBtaW5WaXJ0dWFsSXRlbXMsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBDdXJzb3IgbW9kZSB2aXJ0dWFsIHNpemU6IGxvYWRlZD0ke2xvYWRlZEl0ZW1zQ291bnR9LCBtYXJnaW49JHttYXJnaW5JdGVtc30sIHRvdGFsPSR7bmV3VG90YWx9LCBoYXNSZWFjaGVkRW5kPSR7aGFzUmVhY2hlZEVuZH1gLFxuICAgICAgICAgICAgLy8gKTtcblxuICAgICAgICAgICAgLy8gVXBkYXRlIHRvdGFsIGlmIGl0IGhhcyBncm93blxuICAgICAgICAgICAgaWYgKG5ld1RvdGFsID4gdG90YWxJdGVtcykge1xuICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFVwZGF0aW5nIGN1cnNvciB2aXJ0dWFsIHNpemUgZnJvbSAke3RvdGFsSXRlbXN9IHRvICR7bmV3VG90YWx9YCxcbiAgICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgICAgdG90YWxJdGVtcyA9IG5ld1RvdGFsO1xuICAgICAgICAgICAgICBzZXRUb3RhbEl0ZW1zKG5ld1RvdGFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRm9yIG90aGVyIHN0cmF0ZWdpZXMsIHVzZSBkaXNjb3ZlcmVkIHRvdGFsIG9yIGN1cnJlbnQgdG90YWxcbiAgICAgICAgICAgIC8vIFVzZSBudWxsaXNoIGNvYWxlc2NpbmcgKD8/KSBpbnN0ZWFkIG9mIHx8IHRvIGhhbmRsZSBkaXNjb3ZlcmVkVG90YWwgPSAwIGNvcnJlY3RseVxuICAgICAgICAgICAgbmV3VG90YWwgPSBkaXNjb3ZlcmVkVG90YWwgPz8gdG90YWxJdGVtcztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBVcGRhdGUgc3RhdGVcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gQmVmb3JlIHN0YXRlIHVwZGF0ZTogbmV3VG90YWw9JHtuZXdUb3RhbH0sIHRvdGFsSXRlbXM9JHt0b3RhbEl0ZW1zfSwgd2lsbCB1cGRhdGU6ICR7bmV3VG90YWwgIT09IHRvdGFsSXRlbXN9YCxcbiAgICAgICAgICAvLyApO1xuICAgICAgICAgIGlmIChuZXdUb3RhbCAhPT0gdG90YWxJdGVtcykge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coYFtDb2xsZWN0aW9uXSBDYWxsaW5nIHNldFRvdGFsSXRlbXMoJHtuZXdUb3RhbH0pYCk7XG4gICAgICAgICAgICB0b3RhbEl0ZW1zID0gbmV3VG90YWw7XG4gICAgICAgICAgICBzZXRUb3RhbEl0ZW1zKG5ld1RvdGFsKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBVcGRhdGUgY29tcG9uZW50IGl0ZW1zIHJlZmVyZW5jZVxuICAgICAgICAgIGNvbXBvbmVudC5pdGVtcyA9IGl0ZW1zO1xuXG4gICAgICAgICAgLy8gRW1pdCBpdGVtcyBjaGFuZ2VkIGV2ZW50XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0Oml0ZW1zLWNoYW5nZWRcIiwge1xuICAgICAgICAgICAgdG90YWxJdGVtczogbmV3VG90YWwsXG4gICAgICAgICAgICBsb2FkZWRDb3VudDogaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSB1bmRlZmluZWQpLmxlbmd0aCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIFVwZGF0ZSB2aWV3cG9ydCBzdGF0ZVxuICAgICAgICAgIGNvbnN0IHZpZXdwb3J0U3RhdGUgPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU7XG4gICAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgICAgIC8vIFVzZSBudWxsaXNoIGNvYWxlc2NpbmcgKD8/KSBpbnN0ZWFkIG9mIHx8IHRvIGhhbmRsZSBuZXdUb3RhbCA9IDAgY29ycmVjdGx5XG4gICAgICAgICAgICB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgPSBuZXdUb3RhbCA/PyBpdGVtcy5sZW5ndGg7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVmVyaWZ5IGl0ZW1zIGFyZSBhY3R1YWxseSBzdGlsbCBpbiB0aGUgYXJyYXkgYmVmb3JlIG1hcmtpbmcgYXMgbG9hZGVkXG4gICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBhIHJhY2UgY29uZGl0aW9uIHdoZXJlIGV2aWN0aW9uIGhhcHBlbnMgZHVyaW5nIGFzeW5jIGxvYWQ6XG4gICAgICAgICAgLy8gMS4gTG9hZCBzdGFydHMgZm9yIHJhbmdlIEFcbiAgICAgICAgICAvLyAyLiBVc2VyIHNjcm9sbHMgdG8gcmFuZ2UgQlxuICAgICAgICAgIC8vIDMuIEV2aWN0aW9uIHJlbW92ZXMgaXRlbXMgZnJvbSByYW5nZSBBIGFuZCByZW1vdmVzIGZyb20gbG9hZGVkUmFuZ2VzXG4gICAgICAgICAgLy8gNC4gTG9hZCBmb3IgcmFuZ2UgQSBjb21wbGV0ZXMsIHdvdWxkIHJlLWFkZCB0byBsb2FkZWRSYW5nZXNcbiAgICAgICAgICAvLyA1LiBVc2VyIHNjcm9sbHMgYmFjayB0byBBLCBsb2FkZWRSYW5nZXMgc2F5cyBsb2FkZWQgYnV0IGl0ZW1zIGFyZSBnb25lXG4gICAgICAgICAgY29uc3QgaXRlbXNBY3R1YWxseVN0b3JlZCA9XG4gICAgICAgICAgICB0cmFuc2Zvcm1lZEl0ZW1zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgIHRyYW5zZm9ybWVkSXRlbXMuZXZlcnkoXG4gICAgICAgICAgICAgIChfLCBpZHgpID0+IGl0ZW1zW29mZnNldCArIGlkeF0gIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoaXRlbXNBY3R1YWxseVN0b3JlZCkge1xuICAgICAgICAgICAgLy8gTWFyayBhcyBsb2FkZWQgb25seSBpZiBpdGVtcyBhcmUgYWN0dWFsbHkgcHJlc2VudFxuICAgICAgICAgICAgbG9hZGVkUmFuZ2VzLmFkZChyYW5nZUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQWx3YXlzIGNsZWFuIHVwIHBlbmRpbmcvZmFpbGVkIHN0YXRlXG4gICAgICAgICAgcGVuZGluZ1Jhbmdlcy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgICAgZmFpbGVkUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcblxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBSYW5nZSAke3JhbmdlSWR9IGxvYWRlZCBzdWNjZXNzZnVsbHkgd2l0aCAke3RyYW5zZm9ybWVkSXRlbXMubGVuZ3RofSBpdGVtc2BcbiAgICAgICAgICAvLyApO1xuXG4gICAgICAgICAgLy8gTG9nIG1lbW9yeSBzdGF0cyBwZXJpb2RpY2FsbHkgKGV2ZXJ5IDUgbG9hZHMpXG4gICAgICAgICAgaWYgKGNvbXBsZXRlZExvYWRzICUgNSA9PT0gMCkge1xuICAgICAgICAgICAgbG9nTWVtb3J5U3RhdHMoYGxvYWQ6JHtjb21wbGV0ZWRMb2Fkc31gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBFbWl0IGV2ZW50c1xuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpyYW5nZS1sb2FkZWRcIiwge1xuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgICAgICBpdGVtczogdHJhbnNmb3JtZWRJdGVtcyxcbiAgICAgICAgICAgIHRvdGFsOiBuZXdUb3RhbCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEVtaXQgY29sbGVjdGlvbiBsb2FkZWQgZXZlbnQgd2l0aCBtb3JlIGRldGFpbHNcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY29sbGVjdGlvbjpyYW5nZS1sb2FkZWRcIiwge1xuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgICAgICBpdGVtczogdHJhbnNmb3JtZWRJdGVtcyxcbiAgICAgICAgICAgIHRvdGFsOiBuZXdUb3RhbCxcbiAgICAgICAgICAgIHJhbmdlSWQsXG4gICAgICAgICAgICBpdGVtc0luTWVtb3J5OiBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gIT09IHVuZGVmaW5lZCkubGVuZ3RoLFxuICAgICAgICAgICAgY3Vyc29yOiBzdHJhdGVneSA9PT0gXCJjdXJzb3JcIiA/IGN1cnJlbnRDdXJzb3IgOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBUcmlnZ2VyIHZpZXdwb3J0IHVwZGF0ZVxuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydD8udXBkYXRlVmlld3BvcnQ/LigpO1xuXG4gICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkSXRlbXM7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gSGFuZGxlIEFib3J0RXJyb3IgYW5kIFwiRmFpbGVkIHRvIGZldGNoXCIgKHdoaWNoIGNhbiBvY2N1ciBvbiBhYm9ydCkgZ3JhY2VmdWxseVxuICAgICAgICAgIGNvbnN0IGlzQWJvcnRFcnJvciA9XG4gICAgICAgICAgICAoZXJyb3IgYXMgRXJyb3IpLm5hbWUgPT09IFwiQWJvcnRFcnJvclwiIHx8XG4gICAgICAgICAgICAoKGVycm9yIGFzIEVycm9yKS5tZXNzYWdlID09PSBcIkZhaWxlZCB0byBmZXRjaFwiICYmXG4gICAgICAgICAgICAgIGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCk7XG5cbiAgICAgICAgICBpZiAoaXNBYm9ydEVycm9yKSB7XG4gICAgICAgICAgICBwZW5kaW5nUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgICAgIGNhbmNlbGxlZExvYWRzKys7XG4gICAgICAgICAgICAvLyBEb24ndCB0aHJvdywganVzdCByZXR1cm4gZW1wdHkgYXJyYXlcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBIYW5kbGUgb3RoZXIgZXJyb3JzXG4gICAgICAgICAgcGVuZGluZ1Jhbmdlcy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgICAgZmFpbGVkTG9hZHMrKztcblxuICAgICAgICAgIGNvbnN0IGF0dGVtcHRzID0gKGZhaWxlZFJhbmdlcy5nZXQocmFuZ2VJZCk/LmF0dGVtcHRzIHx8IDApICsgMTtcbiAgICAgICAgICBmYWlsZWRSYW5nZXMuc2V0KHJhbmdlSWQsIHtcbiAgICAgICAgICAgIGF0dGVtcHRzLFxuICAgICAgICAgICAgbGFzdEVycm9yOiBlcnJvciBhcyBFcnJvcixcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEVtaXQgZXJyb3IgZXZlbnRcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6cmFuZ2UtZXJyb3JcIiwge1xuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgIGF0dGVtcHRzLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgYWN0aXZlUmVxdWVzdHMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICAgIGFib3J0Q29udHJvbGxlcnMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuXG4gICAgICBhY3RpdmVSZXF1ZXN0cy5zZXQocmFuZ2VJZCwgcmVxdWVzdFByb21pc2UpO1xuICAgICAgcmV0dXJuIHJlcXVlc3RQcm9taXNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIG1pc3NpbmcgcmFuZ2VzIGZyb20gY29sbGVjdGlvblxuICAgICAqL1xuICAgIGNvbnN0IGxvYWRNaXNzaW5nUmFuZ2VzSW50ZXJuYWwgPSBhc3luYyAoXG4gICAgICByYW5nZToge1xuICAgICAgICBzdGFydDogbnVtYmVyO1xuICAgICAgICBlbmQ6IG51bWJlcjtcbiAgICAgIH0sXG4gICAgICBjYWxsZXI/OiBzdHJpbmcsXG4gICAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBpZiAoIWNvbGxlY3Rpb24pIHJldHVybjtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gbG9hZE1pc3NpbmdSYW5nZXNJbnRlcm5hbCAtIHJhbmdlOiAke3N0YXJ0fS0ke2VuZH0sIHN0cmF0ZWd5OiAke3N0cmF0ZWd5fWAsXG4gICAgICAvLyApO1xuXG4gICAgICAvLyBGb3IgY3Vyc29yIHBhZ2luYXRpb24sIHdlIG5lZWQgdG8gbG9hZCBzZXF1ZW50aWFsbHlcbiAgICAgIGlmIChzdHJhdGVneSA9PT0gXCJjdXJzb3JcIikge1xuICAgICAgICBjb25zdCBzdGFydFBhZ2UgPSBNYXRoLmZsb29yKHJhbmdlLnN0YXJ0IC8gcmFuZ2VTaXplKSArIDE7XG4gICAgICAgIGNvbnN0IGVuZFBhZ2UgPSBNYXRoLmZsb29yKHJhbmdlLmVuZCAvIHJhbmdlU2l6ZSkgKyAxO1xuXG4gICAgICAgIC8vIExpbWl0IGhvdyBtYW55IHBhZ2VzIHdlJ2xsIGxvYWQgYXQgb25jZVxuICAgICAgICBjb25zdCBtYXhQYWdlc1RvTG9hZCA9IDEwO1xuICAgICAgICBjb25zdCBjdXJyZW50SGlnaGVzdFBhZ2UgPSBoaWdoZXN0TG9hZGVkUGFnZSB8fCAwO1xuICAgICAgICBjb25zdCBsaW1pdGVkRW5kUGFnZSA9IE1hdGgubWluKFxuICAgICAgICAgIGVuZFBhZ2UsXG4gICAgICAgICAgY3VycmVudEhpZ2hlc3RQYWdlICsgbWF4UGFnZXNUb0xvYWQsXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBDdXJzb3IgbW9kZTogbmVlZCB0byBsb2FkIHBhZ2VzICR7c3RhcnRQYWdlfSB0byAke2VuZFBhZ2V9LCBsaW1pdGVkIHRvICR7bGltaXRlZEVuZFBhZ2V9YCxcbiAgICAgICAgLy8gKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIGxvYWQgcGFnZXMgc2VxdWVudGlhbGx5XG4gICAgICAgIGZvciAobGV0IHBhZ2UgPSBzdGFydFBhZ2U7IHBhZ2UgPD0gbGltaXRlZEVuZFBhZ2U7IHBhZ2UrKykge1xuICAgICAgICAgIGNvbnN0IHJhbmdlSWQgPSBwYWdlIC0gMTsgLy8gQ29udmVydCB0byAwLWJhc2VkIHJhbmdlSWRcbiAgICAgICAgICBjb25zdCBvZmZzZXQgPSByYW5nZUlkICogcmFuZ2VTaXplO1xuXG4gICAgICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IGJlaW5nIGxvYWRlZFxuICAgICAgICAgIGlmIChwZW5kaW5nUmFuZ2VzLmhhcyhyYW5nZUlkKSkge1xuICAgICAgICAgICAgLy8gUmFuZ2UgYWxyZWFkeSBiZWluZyBsb2FkZWRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWxvYWRlZFJhbmdlcy5oYXMocmFuZ2VJZCkgJiYgIXBlbmRpbmdSYW5nZXMuaGFzKHJhbmdlSWQpKSB7XG4gICAgICAgICAgICAvLyBGb3IgY3Vyc29yIHBhZ2luYXRpb24sIHdlIG11c3QgbG9hZCBzZXF1ZW50aWFsbHlcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYWxsIHByZXZpb3VzIHBhZ2VzIGxvYWRlZFxuICAgICAgICAgICAgaWYgKHBhZ2UgPiAxKSB7XG4gICAgICAgICAgICAgIGxldCBjYW5Mb2FkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgcHJldlBhZ2UgPSAxOyBwcmV2UGFnZSA8IHBhZ2U7IHByZXZQYWdlKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2UmFuZ2VJZCA9IHByZXZQYWdlIC0gMTtcbiAgICAgICAgICAgICAgICBpZiAoIWxvYWRlZFJhbmdlcy5oYXMocHJldlJhbmdlSWQpKSB7XG4gICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBDYW5ub3QgbG9hZCBwYWdlICR7cGFnZX0gLSBuZWVkIHRvIGxvYWQgcGFnZSAke3ByZXZQYWdlfSBmaXJzdGAsXG4gICAgICAgICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgICAgICAgY2FuTG9hZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAvLyBUcnkgdG8gbG9hZCB0aGUgbWlzc2luZyBwYWdlXG4gICAgICAgICAgICAgICAgICBpZiAoIXBlbmRpbmdSYW5nZXMuaGFzKHByZXZSYW5nZUlkKSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGxvYWRSYW5nZShwcmV2UmFuZ2VJZCAqIHJhbmdlU2l6ZSwgcmFuZ2VTaXplKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgYFtDb2xsZWN0aW9uXSBGYWlsZWQgdG8gbG9hZCBwcmVyZXF1aXNpdGUgcGFnZSAke3ByZXZQYWdlfTpgLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIFN0b3AgdHJ5aW5nIHRvIGxvYWQgZnVydGhlciBwYWdlc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoIWNhbkxvYWQpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gU2tpcCB0aGlzIHBhZ2UgZm9yIG5vd1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGF3YWl0IGxvYWRSYW5nZShvZmZzZXQsIHJhbmdlU2l6ZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBbQ29sbGVjdGlvbl0gRmFpbGVkIHRvIGxvYWQgcGFnZSAke3BhZ2V9OmAsIGVycm9yKTtcbiAgICAgICAgICAgICAgYnJlYWs7IC8vIFN0b3Agc2VxdWVudGlhbCBsb2FkaW5nIG9uIGVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVuZFBhZ2UgPiBsaW1pdGVkRW5kUGFnZSkge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBTdG9wcGVkIGF0IHBhZ2UgJHtsaW1pdGVkRW5kUGFnZX0gdG8gcHJldmVudCBleGNlc3NpdmUgbG9hZGluZyAocmVxdWVzdGVkIHVwIHRvICR7ZW5kUGFnZX0pYCxcbiAgICAgICAgICAvLyApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBPcmlnaW5hbCBsb2dpYyBmb3Igb2Zmc2V0L3BhZ2Ugc3RyYXRlZ2llc1xuICAgICAgLy8gQ2FsY3VsYXRlIHJhbmdlIGJvdW5kYXJpZXNcbiAgICAgIGNvbnN0IHN0YXJ0UmFuZ2UgPSBNYXRoLmZsb29yKHJhbmdlLnN0YXJ0IC8gcmFuZ2VTaXplKTtcbiAgICAgIGNvbnN0IGVuZFJhbmdlID0gTWF0aC5mbG9vcihyYW5nZS5lbmQgLyByYW5nZVNpemUpO1xuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBwYWdlIHN0cmF0ZWd5IC0gc3RhcnRSYW5nZTogJHtzdGFydFJhbmdlfSwgZW5kUmFuZ2U6ICR7ZW5kUmFuZ2V9LCBsb2FkZWRSYW5nZXM6IFske0FycmF5LmZyb20obG9hZGVkUmFuZ2VzKS5qb2luKFwiLCBcIil9XWAsXG4gICAgICAvLyApO1xuXG4gICAgICAvLyBDb2xsZWN0IHJhbmdlcyB0aGF0IG5lZWQgbG9hZGluZ1xuICAgICAgY29uc3QgcmFuZ2VzVG9Mb2FkOiBudW1iZXJbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgcmFuZ2VJZCA9IHN0YXJ0UmFuZ2U7IHJhbmdlSWQgPD0gZW5kUmFuZ2U7IHJhbmdlSWQrKykge1xuICAgICAgICBpZiAoIWxvYWRlZFJhbmdlcy5oYXMocmFuZ2VJZCkgJiYgIXBlbmRpbmdSYW5nZXMuaGFzKHJhbmdlSWQpKSB7XG4gICAgICAgICAgcmFuZ2VzVG9Mb2FkLnB1c2gocmFuZ2VJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHJhbmdlc1RvTG9hZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gQWxsIHJhbmdlcyBhcmUgYWxyZWFkeSBsb2FkZWQgb3IgcGVuZGluZ1xuICAgICAgICAvLyBCdXQgdmVyaWZ5IHRoZSBkYXRhIGFjdHVhbGx5IGV4aXN0cyBpbiBpdGVtcyBhcnJheSAoZGVmZW5zaXZlIGNoZWNrKVxuICAgICAgICBmb3IgKGxldCByYW5nZUlkID0gc3RhcnRSYW5nZTsgcmFuZ2VJZCA8PSBlbmRSYW5nZTsgcmFuZ2VJZCsrKSB7XG4gICAgICAgICAgaWYgKGxvYWRlZFJhbmdlcy5oYXMocmFuZ2VJZCkpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgcmFuZ2UgYWN0dWFsbHkgaGFzIGRhdGFcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlU3RhcnQgPSByYW5nZUlkICogcmFuZ2VTaXplO1xuICAgICAgICAgICAgY29uc3QgaGFzRGF0YSA9IGl0ZW1zXG4gICAgICAgICAgICAgIC5zbGljZShyYW5nZVN0YXJ0LCByYW5nZVN0YXJ0ICsgcmFuZ2VTaXplKVxuICAgICAgICAgICAgICAuc29tZSgoaXRlbSkgPT4gaXRlbSAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIGlmICghaGFzRGF0YSkge1xuICAgICAgICAgICAgICAvLyBSYW5nZSBtYXJrZWQgbG9hZGVkIGJ1dCBubyBkYXRhIC0gZm9yY2UgcmVsb2FkXG4gICAgICAgICAgICAgIGxvYWRlZFJhbmdlcy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgICAgICAgIHJhbmdlc1RvTG9hZC5wdXNoKHJhbmdlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgcXVldWVkIHJlcXVlc3RzIHdlIHNob3VsZCBwcm9jZXNzXG4gICAgICAgIGlmIChcbiAgICAgICAgICByYW5nZXNUb0xvYWQubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggPiAwICYmXG4gICAgICAgICAgYWN0aXZlTG9hZENvdW50IDwgbWF4Q29uY3VycmVudFJlcXVlc3RzXG4gICAgICAgICkge1xuICAgICAgICAgIHByb2Nlc3NRdWV1ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyYW5nZXNUb0xvYWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIExvYWRpbmcgJHtyYW5nZXNUb0xvYWQubGVuZ3RofSByYW5nZXM6IFske3Jhbmdlc1RvTG9hZC5qb2luKFwiLCBcIil9XWAsXG4gICAgICAvLyApO1xuXG4gICAgICAvLyBMb2FkIHJhbmdlcyBpbmRpdmlkdWFsbHkgLSBubyBtZXJnaW5nIHRvIGF2b2lkIGxvYWRpbmcgb2xkIHJhbmdlc1xuICAgICAgY29uc3QgcHJvbWlzZXMgPSByYW5nZXNUb0xvYWQubWFwKChyYW5nZUlkKSA9PlxuICAgICAgICBsb2FkUmFuZ2UocmFuZ2VJZCAqIHJhbmdlU2l6ZSwgcmFuZ2VTaXplKSxcbiAgICAgICk7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQocHJvbWlzZXMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBWZWxvY2l0eS1hd2FyZSB3cmFwcGVyIGZvciBsb2FkTWlzc2luZ1Jhbmdlc1xuICAgICAqL1xuICAgIGNvbnN0IGxvYWRNaXNzaW5nUmFuZ2VzID0gKFxuICAgICAgcmFuZ2U6IHtcbiAgICAgICAgc3RhcnQ6IG51bWJlcjtcbiAgICAgICAgZW5kOiBudW1iZXI7XG4gICAgICB9LFxuICAgICAgY2FsbGVyPzogc3RyaW5nLFxuICAgICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcmFuZ2VLZXkgPSBnZXRSYW5nZUtleShyYW5nZSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBsb2FkaW5nXG4gICAgICAgIGlmIChhY3RpdmVMb2FkUmFuZ2VzLmhhcyhyYW5nZUtleSkpIHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCBpZiBkcmFnZ2luZyB3aXRoIGxvdyB2ZWxvY2l0eSAoYnV0IG5vdCBpZiB3ZSdyZSBpZGxlKVxuICAgICAgICBpZiAoaXNEcmFnZ2luZyAmJiBjdXJyZW50VmVsb2NpdHkgPCAwLjUgJiYgY3VycmVudFZlbG9jaXR5ID4gMCkge1xuICAgICAgICAgIGNhbmNlbGxlZExvYWRzKys7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHZlbG9jaXR5IC0gaWYgdG9vIGhpZ2gsIGNhbmNlbCB0aGUgcmVxdWVzdCBlbnRpcmVseVxuICAgICAgICBpZiAoIWNhbkxvYWQoKSkge1xuICAgICAgICAgIGNhbmNlbGxlZExvYWRzKys7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGNhcGFjaXR5XG4gICAgICAgIGlmIChhY3RpdmVMb2FkQ291bnQgPCBtYXhDb25jdXJyZW50UmVxdWVzdHMpIHtcbiAgICAgICAgICAvLyBFeGVjdXRlIGltbWVkaWF0ZWx5XG4gICAgICAgICAgZXhlY3V0ZVF1ZXVlZExvYWQoe1xuICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICBwcmlvcml0eTogXCJub3JtYWxcIixcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgICBjYWxsZXIsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgZW5hYmxlUmVxdWVzdFF1ZXVlICYmXG4gICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggPCBtYXhRdWV1ZVNpemVcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gUXVldWUgdGhlIHJlcXVlc3RcbiAgICAgICAgICBsb2FkUmVxdWVzdFF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICBwcmlvcml0eTogXCJub3JtYWxcIixcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgICBjYWxsZXIsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0xvYWRpbmdNYW5hZ2VyXSBRdWV1ZWQgcmVxdWVzdCAoYXQgY2FwYWNpdHkpLCBxdWV1ZSBzaXplOiAke2xvYWRSZXF1ZXN0UXVldWUubGVuZ3RofWBcbiAgICAgICAgICAvLyApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFF1ZXVlIGlzIGZ1bGwgLSBidXQgZG9uJ3QgZHJvcCBpZGxlL3JhbmdlLWNoYW5nZWQgcmVxdWVzdHMsIHRoZXkncmUgY3JpdGljYWwhXG4gICAgICAgICAgLy8gSW5zdGVhZCwgY2xlYXIgb2xkIHF1ZXVlZCByZXF1ZXN0cyBhbmQgYWRkIHRoZSBuZXcgb25lXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgY2FsbGVyID09PSBcInZpZXdwb3J0OmlkbGVcIiB8fFxuICAgICAgICAgICAgY2FsbGVyID09PSBcInZpZXdwb3J0OnJhbmdlLWNoYW5nZWRcIlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gQ2xlYXIgb2xkIHF1ZXVlZCByZXF1ZXN0cyAtIHRoZXkncmUgZm9yIHJhbmdlcyB1c2VyIHNjcm9sbGVkIHBhc3RcbiAgICAgICAgICAgIGxvYWRSZXF1ZXN0UXVldWUuZm9yRWFjaCgocikgPT4ge1xuICAgICAgICAgICAgICBjYW5jZWxsZWRMb2FkcysrO1xuICAgICAgICAgICAgICByLnJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggPSAwO1xuICAgICAgICAgICAgLy8gUXVldWUgdGhpcyBwcmlvcml0eSByZXF1ZXN0XG4gICAgICAgICAgICBsb2FkUmVxdWVzdFF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgICByYW5nZSxcbiAgICAgICAgICAgICAgcHJpb3JpdHk6IFwiaGlnaFwiLFxuICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICAgICAgY2FsbGVyLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFF1ZXVlIG92ZXJmbG93IC0gcmVzb2x2ZSB0byBhdm9pZCBlcnJvcnNcbiAgICAgICAgICAgIGlmIChsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCA+PSBtYXhRdWV1ZVNpemUpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGxvYWRSZXF1ZXN0UXVldWUuc3BsaWNlKFxuICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggLSBtYXhRdWV1ZVNpemUsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJlbW92ZWQuZm9yRWFjaCgocikgPT4ge1xuICAgICAgICAgICAgICAgIGNhbmNlbGxlZExvYWRzKys7XG4gICAgICAgICAgICAgICAgci5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHJ5IGEgZmFpbGVkIHJhbmdlXG4gICAgICovXG4gICAgY29uc3QgcmV0cnlGYWlsZWRSYW5nZSA9IGFzeW5jIChyYW5nZUlkOiBudW1iZXIpOiBQcm9taXNlPGFueVtdPiA9PiB7XG4gICAgICBmYWlsZWRSYW5nZXMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gcmFuZ2VJZCAqIHJhbmdlU2l6ZTtcbiAgICAgIHJldHVybiBsb2FkUmFuZ2Uob2Zmc2V0LCByYW5nZVNpemUpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdG90YWwgaXRlbXMgY291bnRcbiAgICAgKi9cbiAgICBjb25zdCBzZXRUb3RhbEl0ZW1zID0gKHRvdGFsOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgIHRvdGFsSXRlbXMgPSB0b3RhbDtcblxuICAgICAgLy8gVXBkYXRlIHZpZXdwb3J0IHN0YXRlJ3MgdG90YWwgaXRlbXNcbiAgICAgIGNvbnN0IHZpZXdwb3J0U3RhdGUgPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU7XG4gICAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgICB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgPSB0b3RhbDtcbiAgICAgIH1cblxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnRvdGFsLWl0ZW1zLWNoYW5nZWRcIiwgeyB0b3RhbCB9KTtcbiAgICB9O1xuXG4gICAgLy8gSG9vayBpbnRvIHZpZXdwb3J0IGluaXRpYWxpemF0aW9uXG4gICAgY29uc3Qgb3JpZ2luYWxJbml0aWFsaXplID0gY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemU7XG4gICAgY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBvcmlnaW5hbEluaXRpYWxpemUoKTtcbiAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBpbml0aWFsaXplZFxuICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgaW5pdGlhbCB0b3RhbCBpZiBwcm92aWRlZFxuICAgICAgaWYgKGNvbXBvbmVudC50b3RhbEl0ZW1zKSB7XG4gICAgICAgIHRvdGFsSXRlbXMgPSBjb21wb25lbnQudG90YWxJdGVtcztcbiAgICAgIH1cblxuICAgICAgLy8gTGlzdGVuIGZvciBkcmFnIGV2ZW50c1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpkcmFnLXN0YXJ0XCIsICgpID0+IHtcbiAgICAgICAgaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpkcmFnLWVuZFwiLCAoKSA9PiB7XG4gICAgICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgLy8gUHJvY2VzcyBhbnkgcXVldWVkIHJlcXVlc3RzIGFmdGVyIGRyYWcgZW5kcyAoc2FmZXR5IG1lYXN1cmUpXG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyBwbGFjZWhvbGRlcnMgYXJlIHJlcGxhY2VkIGV2ZW4gaWYgaWRsZSBkZXRlY3Rpb24gZmFpbHNcbiAgICAgICAgaWYgKGxvYWRPbkRyYWdFbmQpIHtcbiAgICAgICAgICBwcm9jZXNzUXVldWUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgcmFuZ2UgY2hhbmdlc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkXCIsIGFzeW5jIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgLy8gRG9uJ3QgbG9hZCBkdXJpbmcgZmFzdCBzY3JvbGxpbmcgLSBsb2FkTWlzc2luZ1JhbmdlcyB3aWxsIGhhbmRsZSB2ZWxvY2l0eSBjaGVja1xuXG4gICAgICAgIC8vIEV4dHJhY3QgcmFuZ2UgZnJvbSBldmVudCBkYXRhIC0gdmlydHVhbCBmZWF0dXJlIGVtaXRzIHsgcmFuZ2U6IHsgc3RhcnQsIGVuZCB9LCBzY3JvbGxQb3NpdGlvbiB9XG4gICAgICAgIGNvbnN0IHJhbmdlID0gZGF0YS5yYW5nZSB8fCBkYXRhO1xuICAgICAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHJhbmdlO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHJhbmdlIGJlZm9yZSBsb2FkaW5nXG4gICAgICAgIGlmICh0eXBlb2Ygc3RhcnQgIT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIGVuZCAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIFwiW0NvbGxlY3Rpb25dIEludmFsaWQgcmFuZ2UgaW4gdmlld3BvcnQ6cmFuZ2UtY2hhbmdlZCBldmVudDpcIixcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTa2lwIGxvYWRpbmcgcGFnZSAxIGlmIHdlIGhhdmUgYW4gaW5pdGlhbFNjcm9sbEluZGV4IGFuZCBoYXZlbid0IGNvbXBsZXRlZCBpbml0aWFsIGxvYWQgeWV0XG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgdGhlIHJlcXVlc3RBbmltYXRpb25GcmFtZSBpbiB2aXJ0dWFsLnRzIGZyb20gdHJpZ2dlcmluZyBhIHBhZ2UgMSBsb2FkXG4gICAgICAgIC8vIGFmdGVyIHdlJ3ZlIGFscmVhZHkgc3RhcnRlZCBsb2FkaW5nIHRoZSBjb3JyZWN0IGluaXRpYWwgcGFnZVxuICAgICAgICBpZiAoaGFzSW5pdGlhbFNjcm9sbEluZGV4ICYmICFoYXNDb21wbGV0ZWRJbml0aWFsUG9zaXRpb25Mb2FkKSB7XG4gICAgICAgICAgY29uc3QgcGFnZTFFbmRJbmRleCA9IHJhbmdlU2l6ZSAtIDE7IC8vIGUuZy4sIDI5IGZvciByYW5nZVNpemU9MzBcbiAgICAgICAgICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kIDw9IHBhZ2UxRW5kSW5kZXgpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSByZXF1ZXN0IGZvciBwYWdlIDEsIHNraXAgaXRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb2FkIG1pc3NpbmcgcmFuZ2VzIGlmIG5lZWRlZFxuICAgICAgICBhd2FpdCBsb2FkTWlzc2luZ1Jhbmdlcyh7IHN0YXJ0LCBlbmQgfSwgXCJ2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkXCIpO1xuXG4gICAgICAgIC8vIEV2aWN0IGRpc3RhbnQgaXRlbXMgdG8gcHJldmVudCBtZW1vcnkgYmxvYXRcbiAgICAgICAgZXZpY3REaXN0YW50SXRlbXMoc3RhcnQsIGVuZCk7XG5cbiAgICAgICAgLy8gRm9yIGN1cnNvciBtb2RlLCBjaGVjayBpZiB3ZSBuZWVkIHRvIHVwZGF0ZSB2aXJ0dWFsIHNpemVcbiAgICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImN1cnNvclwiICYmICFoYXNSZWFjaGVkRW5kKSB7XG4gICAgICAgICAgY29uc3QgbG9hZGVkSXRlbXNDb3VudCA9IGl0ZW1zLmZpbHRlcihcbiAgICAgICAgICAgIChpdGVtKSA9PiBpdGVtICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgKS5sZW5ndGg7XG4gICAgICAgICAgY29uc3QgbWFyZ2luSXRlbXMgPVxuICAgICAgICAgICAgcmFuZ2VTaXplICpcbiAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QQUdJTkFUSU9OLkNVUlNPUl9TQ1JPTExfTUFSR0lOX01VTFRJUExJRVI7XG4gICAgICAgICAgY29uc3QgbWluVmlydHVhbEl0ZW1zID1cbiAgICAgICAgICAgIHJhbmdlU2l6ZSAqXG4gICAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUEFHSU5BVElPTi5DVVJTT1JfTUlOX1ZJUlRVQUxfU0laRV9NVUxUSVBMSUVSO1xuICAgICAgICAgIGNvbnN0IGR5bmFtaWNUb3RhbCA9IE1hdGgubWF4KFxuICAgICAgICAgICAgbG9hZGVkSXRlbXNDb3VudCArIG1hcmdpbkl0ZW1zLFxuICAgICAgICAgICAgbWluVmlydHVhbEl0ZW1zLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoZHluYW1pY1RvdGFsICE9PSB0b3RhbEl0ZW1zKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBVcGRhdGluZyBjdXJzb3IgdmlydHVhbCBzaXplIGZyb20gJHt0b3RhbEl0ZW1zfSB0byAke2R5bmFtaWNUb3RhbH1gLFxuICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgIHNldFRvdGFsSXRlbXMoZHluYW1pY1RvdGFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIHZlbG9jaXR5IGNoYW5nZXNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6dmVsb2NpdHktY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmVsb2NpdHkgPSBjdXJyZW50VmVsb2NpdHk7XG4gICAgICAgIGN1cnJlbnRWZWxvY2l0eSA9IE1hdGguYWJzKGRhdGEudmVsb2NpdHkgfHwgMCk7XG5cbiAgICAgICAgLy8gV2hlbiB2ZWxvY2l0eSBkcm9wcyBiZWxvdyB0aHJlc2hvbGQsIHByb2Nlc3MgcXVldWVcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByZXZpb3VzVmVsb2NpdHkgPiBjYW5jZWxMb2FkVGhyZXNob2xkICYmXG4gICAgICAgICAgY3VycmVudFZlbG9jaXR5IDw9IGNhbmNlbExvYWRUaHJlc2hvbGRcbiAgICAgICAgKSB7XG4gICAgICAgICAgcHJvY2Vzc1F1ZXVlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGlkbGUgc3RhdGUgdG8gcHJvY2VzcyBxdWV1ZVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDppZGxlXCIsIGFzeW5jIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY3VycmVudFZlbG9jaXR5ID0gMDtcblxuICAgICAgICAvLyBSZXNldCBkcmFnZ2luZyBzdGF0ZSBvbiBpZGxlIHNpbmNlIHVzZXIgaGFzIHN0b3BwZWQgbW92aW5nXG4gICAgICAgIGlmIChpc0RyYWdnaW5nKSB7XG4gICAgICAgICAgaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGN1cnJlbnQgdmlzaWJsZSByYW5nZSBmcm9tIHZpZXdwb3J0XG4gICAgICAgIGNvbnN0IHZpZXdwb3J0U3RhdGUgPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU7XG4gICAgICAgIGNvbnN0IHZpc2libGVSYW5nZSA9IHZpZXdwb3J0U3RhdGU/LnZpc2libGVSYW5nZTtcblxuICAgICAgICBpZiAodmlzaWJsZVJhbmdlKSB7XG4gICAgICAgICAgLy8gQ2xlYXIgc3RhbGUgcmVxdWVzdHMgZnJvbSBxdWV1ZSB0aGF0IGFyZSBmYXIgZnJvbSBjdXJyZW50IHZpc2libGUgcmFuZ2VcbiAgICAgICAgICBjb25zdCBidWZmZXIgPSByYW5nZVNpemUgKiAyOyAvLyBBbGxvdyBzb21lIGJ1ZmZlclxuICAgICAgICAgIGxvYWRSZXF1ZXN0UXVldWUgPSBsb2FkUmVxdWVzdFF1ZXVlLmZpbHRlcigocmVxdWVzdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdEVuZCA9IHJlcXVlc3QucmFuZ2UuZW5kO1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdFN0YXJ0ID0gcmVxdWVzdC5yYW5nZS5zdGFydDtcbiAgICAgICAgICAgIGNvbnN0IGlzUmVsZXZhbnQgPVxuICAgICAgICAgICAgICByZXF1ZXN0RW5kID49IHZpc2libGVSYW5nZS5zdGFydCAtIGJ1ZmZlciAmJlxuICAgICAgICAgICAgICByZXF1ZXN0U3RhcnQgPD0gdmlzaWJsZVJhbmdlLmVuZCArIGJ1ZmZlcjtcblxuICAgICAgICAgICAgaWYgKCFpc1JlbGV2YW50KSB7XG4gICAgICAgICAgICAgIHJlcXVlc3QucmVzb2x2ZSgpOyAvLyBSZXNvbHZlIHRvIGF2b2lkIGhhbmdpbmcgcHJvbWlzZXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpc1JlbGV2YW50O1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gTG9hZCB0aGUgY3VycmVudCB2aXNpYmxlIHJhbmdlIGlmIG5lZWRlZFxuICAgICAgICAgIGF3YWl0IGxvYWRNaXNzaW5nUmFuZ2VzKHZpc2libGVSYW5nZSwgXCJ2aWV3cG9ydDppZGxlXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxzbyBwcm9jZXNzIGFueSBxdWV1ZWQgcmVxdWVzdHNcbiAgICAgICAgcHJvY2Vzc1F1ZXVlKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBpdGVtIHJlbW92YWwgLSBET04nVCBjbGVhciBsb2FkZWRSYW5nZXMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZWxvYWRcbiAgICAgIC8vIFRoZSBkYXRhIGlzIGFscmVhZHkgc2hpZnRlZCBsb2NhbGx5IGluIGFwaS50cyBhbmQgcmVuZGVyaW5nLnRzXG4gICAgICAvLyBSZWxvYWRpbmcgd291bGQgY2F1c2UgcmFjZSBjb25kaXRpb25zIGFuZCBvdmVyd3JpdGUgdGhlIGNvcnJlY3QgdG90YWxJdGVtc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJpdGVtOnJlbW92ZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW0NvbGxlY3Rpb25dIGl0ZW06cmVtb3ZlZCBldmVudCAtIGluZGV4OiAke2RhdGEuaW5kZXh9YCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBbQ29sbGVjdGlvbl0gaXRlbXMubGVuZ3RoOiAke2l0ZW1zLmxlbmd0aH1gKTtcblxuICAgICAgICAvLyBVcGRhdGUgZGlzY292ZXJlZFRvdGFsIHRvIG1hdGNoIHRoZSBuZXcgY291bnRcbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBzdGFsZSBkaXNjb3ZlcmVkVG90YWwgZnJvbSBiZWluZyB1c2VkIG9uIG5leHQgbG9hZFxuICAgICAgICBpZiAoZGlzY292ZXJlZFRvdGFsICE9PSBudWxsICYmIGRpc2NvdmVyZWRUb3RhbCA+IDApIHtcbiAgICAgICAgICBkaXNjb3ZlcmVkVG90YWwgPSBkaXNjb3ZlcmVkVG90YWwgLSAxO1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBVcGRhdGVkIGRpc2NvdmVyZWRUb3RhbCB0bzogJHtkaXNjb3ZlcmVkVG90YWx9YCxcbiAgICAgICAgICAvLyApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTk9URTogRG8gTk9UIGRlY3JlbWVudCB0b3RhbEl0ZW1zIGhlcmUhXG4gICAgICAgIC8vIGFwaS50cyBhbHJlYWR5IGNhbGxzIHNldFRvdGFsSXRlbXMoKSBhZnRlciBlbWl0dGluZyBpdGVtOnJlbW92ZS1yZXF1ZXN0LFxuICAgICAgICAvLyB3aGljaCBwcm9wZXJseSB1cGRhdGVzIHRvdGFsSXRlbXMuIERlY3JlbWVudGluZyBoZXJlIHdvdWxkIGNhdXNlIGEgZG91YmxlLWRlY3JlbWVudC5cblxuICAgICAgICAvLyBET04nVCBjbGVhciBsb2FkZWRSYW5nZXMgLSB3ZSB3YW50IHRvIGtlZXAgdXNpbmcgdGhlIGxvY2FsIGRhdGFcbiAgICAgICAgLy8gVGhlIGRhdGEgaGFzIGJlZW4gc2hpZnRlZCBsb2NhbGx5IGFuZCBpcyBzdGlsbCB2YWxpZFxuICAgICAgICAvLyBDbGVhcmluZyB3b3VsZCB0cmlnZ2VyIGEgcmVsb2FkIHdoaWNoIGNhdXNlcyByYWNlIGNvbmRpdGlvbnNcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBLZWVwaW5nIGxvYWRlZFJhbmdlcyBpbnRhY3Q6YCxcbiAgICAgICAgLy8gICBBcnJheS5mcm9tKGxvYWRlZFJhbmdlcyksXG4gICAgICAgIC8vICk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTG9hZCBpbml0aWFsIGRhdGEgaWYgY29sbGVjdGlvbiBpcyBhdmFpbGFibGUgYW5kIGF1dG9Mb2FkIGlzIGVuYWJsZWRcbiAgICAgIGlmIChjb2xsZWN0aW9uICYmIGF1dG9Mb2FkKSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgYW4gaW5pdGlhbCBzY3JvbGwgaW5kZXggT1IgYSBzZWxlY3RJZCwgbG9hZCBkYXRhIGZvciB0aGF0IHBvc2l0aW9uIGRpcmVjdGx5XG4gICAgICAgIC8vIERvbid0IHVzZSBzY3JvbGxUb0luZGV4KCkgYXMgaXQgdHJpZ2dlcnMgYW5pbWF0aW9uL3ZlbG9jaXR5IHRyYWNraW5nXG4gICAgICAgIC8vIHZpcnR1YWwudHMgaGFzIGFscmVhZHkgc2V0IHRoZSBzY3JvbGwgcG9zaXRpb24gYW5kIGNhbGN1bGF0ZWQgdGhlIHZpc2libGUgcmFuZ2VcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGluaXRpYWxTY3JvbGxJbmRleCA+IDAgfHxcbiAgICAgICAgICAoc2VsZWN0SWQgIT09IHVuZGVmaW5lZCAmJiBzZWxlY3RJZCAhPT0gbnVsbClcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gR2V0IHRoZSB2aXNpYmxlIHJhbmdlIHRoYXQgd2FzIGFscmVhZHkgY2FsY3VsYXRlZCBieSB2aXJ0dWFsLnRzXG4gICAgICAgICAgLy8gV2UgbWlzc2VkIHRoZSBpbml0aWFsIHZpZXdwb3J0OnJhbmdlLWNoYW5nZWQgZXZlbnQgYmVjYXVzZSBvdXIgbGlzdGVuZXIgd2Fzbid0IHJlYWR5IHlldFxuICAgICAgICAgIGNvbnN0IHZpc2libGVSYW5nZSA9IGNvbXBvbmVudC52aWV3cG9ydD8uZ2V0VmlzaWJsZVJhbmdlPy4oKTtcblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHZpc2libGVSYW5nZSAmJlxuICAgICAgICAgICAgKHZpc2libGVSYW5nZS5zdGFydCA+IDAgfHwgdmlzaWJsZVJhbmdlLmVuZCA+IDApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBVc2UgdGhlIHByZS1jYWxjdWxhdGVkIHZpc2libGUgcmFuZ2UgZnJvbSB2aXJ0dWFsLnRzXG4gICAgICAgICAgICBsb2FkTWlzc2luZ1Jhbmdlcyh2aXNpYmxlUmFuZ2UsIFwiaW5pdGlhbC1wb3NpdGlvblwiKVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgLy8gRW1pdCBldmVudCB0byBzZWxlY3QgaXRlbSBhZnRlciBpbml0aWFsIGxvYWQgaWYgc2VsZWN0SWQgaXMgcHJvdmlkZWRcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImNvbGxlY3Rpb246aW5pdGlhbC1sb2FkLWNvbXBsZXRlXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0SWQsXG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxTY3JvbGxJbmRleCxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICBcIltDb2xsZWN0aW9uXSBGYWlsZWQgdG8gbG9hZCBpbml0aWFsIHBvc2l0aW9uIGRhdGE6XCIsXG4gICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQgPSB0cnVlOyAvLyBBbGxvdyBub3JtYWwgbG9hZGluZyBldmVuIG9uIGVycm9yXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGYWxsYmFjazogY2FsY3VsYXRlIHJhbmdlIGZyb20gaW5pdGlhbFNjcm9sbEluZGV4XG4gICAgICAgICAgICAvLyBUaGlzIGhhbmRsZXMgZWRnZSBjYXNlcyB3aGVyZSB2aXNpYmxlUmFuZ2Ugd2Fzbid0IHJlYWR5XG4gICAgICAgICAgICBjb25zdCBvdmVyc2NhbiA9IDI7XG4gICAgICAgICAgICBjb25zdCBlc3RpbWF0ZWRWaXNpYmxlQ291bnQgPSBNYXRoLmNlaWwoNjAwIC8gNTApOyAvLyB+MTIgaXRlbXNcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoMCwgaW5pdGlhbFNjcm9sbEluZGV4IC0gb3ZlcnNjYW4pO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gaW5pdGlhbFNjcm9sbEluZGV4ICsgZXN0aW1hdGVkVmlzaWJsZUNvdW50ICsgb3ZlcnNjYW47XG5cbiAgICAgICAgICAgIGxvYWRNaXNzaW5nUmFuZ2VzKHsgc3RhcnQsIGVuZCB9LCBcImluaXRpYWwtcG9zaXRpb24tZmFsbGJhY2tcIilcbiAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vIEVtaXQgZXZlbnQgdG8gc2VsZWN0IGl0ZW0gYWZ0ZXIgaW5pdGlhbCBsb2FkIGlmIHNlbGVjdElkIGlzIHByb3ZpZGVkXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJjb2xsZWN0aW9uOmluaXRpYWwtbG9hZC1jb21wbGV0ZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdElkLFxuICAgICAgICAgICAgICAgICAgICBpbml0aWFsU2Nyb2xsSW5kZXgsXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgXCJbQ29sbGVjdGlvbl0gRmFpbGVkIHRvIGxvYWQgaW5pdGlhbCBwb3NpdGlvbiBkYXRhIChmYWxsYmFjayk6XCIsXG4gICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQgPSB0cnVlOyAvLyBBbGxvdyBub3JtYWwgbG9hZGluZyBldmVuIG9uIGVycm9yXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyBpbml0aWFsIHNjcm9sbCBpbmRleCAtIGxvYWQgZnJvbSBiZWdpbm5pbmcgYXMgbm9ybWFsXG4gICAgICAgIGxvYWRSYW5nZSgwLCByYW5nZVNpemUpXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gSGFuZGxlIGF1dG9TZWxlY3RGaXJzdCAtIGdldCBmaXJzdCBpdGVtIElEIGFuZCBlbWl0IHNlbGVjdGlvbiBldmVudFxuICAgICAgICAgICAgaWYgKGF1dG9TZWxlY3RGaXJzdCAmJiBpdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZpcnN0SXRlbSA9IGl0ZW1zWzBdO1xuICAgICAgICAgICAgICBjb25zdCBmaXJzdElkID0gZmlyc3RJdGVtPy5faWQgfHwgZmlyc3RJdGVtPy5pZDtcbiAgICAgICAgICAgICAgaWYgKGZpcnN0SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJjb2xsZWN0aW9uOmluaXRpYWwtbG9hZC1jb21wbGV0ZVwiLCB7XG4gICAgICAgICAgICAgICAgICBzZWxlY3RJZDogZmlyc3RJZCxcbiAgICAgICAgICAgICAgICAgIGluaXRpYWxTY3JvbGxJbmRleDogMCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIltDb2xsZWN0aW9uXSBGYWlsZWQgdG8gbG9hZCBpbml0aWFsIGRhdGE6XCIsIGVycm9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVzZXQgY29sbGVjdGlvbiBzdGF0ZSB3aXRob3V0IGRlc3Ryb3lpbmcgdGhlIGNvbXBvbmVudFxuICAgICAqIENsZWFycyBhbGwgbG9hZGVkIGRhdGEgYW5kIHByZXBhcmVzIGZvciBmcmVzaCBsb2FkXG4gICAgICovXG4gICAgY29uc3QgcmVzZXQgPSAoKSA9PiB7XG4gICAgICBsb2dNZW1vcnlTdGF0cyhcInJlc2V0OmJlZm9yZVwiKTtcblxuICAgICAgLy8gQWJvcnQgYWxsIGluLWZsaWdodCByZXF1ZXN0c1xuICAgICAgYWJvcnRDb250cm9sbGVycy5mb3JFYWNoKChjb250cm9sbGVyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gSWdub3JlIGFib3J0IGVycm9yc1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGFib3J0Q29udHJvbGxlcnMuY2xlYXIoKTtcblxuICAgICAgLy8gQ2xlYXIgYWxsIGRhdGEgc3RydWN0dXJlc1xuICAgICAgaXRlbXMubGVuZ3RoID0gMDtcbiAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoID0gMDtcbiAgICAgIGxvYWRlZFJhbmdlcy5jbGVhcigpO1xuICAgICAgcGVuZGluZ1Jhbmdlcy5jbGVhcigpO1xuICAgICAgZmFpbGVkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICBhY3RpdmVMb2FkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICBhY3RpdmVSZXF1ZXN0cy5jbGVhcigpO1xuICAgICAgY3Vyc29yTWFwLmNsZWFyKCk7XG4gICAgICBwYWdlVG9PZmZzZXRNYXAuY2xlYXIoKTtcblxuICAgICAgLy8gUmVzZXQgc3RhdGVcbiAgICAgIHRvdGFsSXRlbXMgPSAwO1xuICAgICAgY3VycmVudEN1cnNvciA9IG51bGw7XG4gICAgICBoaWdoZXN0TG9hZGVkUGFnZSA9IDA7XG4gICAgICBkaXNjb3ZlcmVkVG90YWwgPSBudWxsO1xuICAgICAgaGFzUmVhY2hlZEVuZCA9IGZhbHNlO1xuICAgICAgaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCA9IGZhbHNlO1xuXG4gICAgICAvLyBSZXNldCBjb3VudGVyc1xuICAgICAgYWN0aXZlTG9hZENvdW50ID0gMDtcbiAgICAgIGNvbXBsZXRlZExvYWRzID0gMDtcbiAgICAgIGZhaWxlZExvYWRzID0gMDtcbiAgICAgIGNhbmNlbGxlZExvYWRzID0gMDtcblxuICAgICAgLy8gVXBkYXRlIGNvbXBvbmVudCByZWZlcmVuY2VcbiAgICAgIGNvbXBvbmVudC5pdGVtcyA9IGl0ZW1zO1xuICAgICAgY29tcG9uZW50LnRvdGFsSXRlbXMgPSAwO1xuXG4gICAgICBsb2dNZW1vcnlTdGF0cyhcInJlc2V0OmFmdGVyXCIpO1xuXG4gICAgICAvLyBFbWl0IHJlc2V0IGV2ZW50XG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwiY29sbGVjdGlvbjpyZXNldFwiKTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIGNvbGxlY3Rpb24gQVBJIHRvIHZpZXdwb3J0XG4gICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24gPSB7XG4gICAgICBsb2FkUmFuZ2U6IChvZmZzZXQ6IG51bWJlciwgbGltaXQ6IG51bWJlcikgPT4gbG9hZFJhbmdlKG9mZnNldCwgbGltaXQpLFxuICAgICAgbG9hZE1pc3NpbmdSYW5nZXM6IChcbiAgICAgICAgcmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSxcbiAgICAgICAgY2FsbGVyPzogc3RyaW5nLFxuICAgICAgKSA9PiBsb2FkTWlzc2luZ1JhbmdlcyhyYW5nZSwgY2FsbGVyIHx8IFwidmlld3BvcnQuY29sbGVjdGlvblwiKSxcbiAgICAgIGdldExvYWRlZFJhbmdlczogKCkgPT4gbG9hZGVkUmFuZ2VzLFxuICAgICAgZ2V0UGVuZGluZ1JhbmdlczogKCkgPT4gcGVuZGluZ1JhbmdlcyxcbiAgICAgIGNsZWFyRmFpbGVkUmFuZ2VzOiAoKSA9PiBmYWlsZWRSYW5nZXMuY2xlYXIoKSxcbiAgICAgIHJldHJ5RmFpbGVkUmFuZ2UsXG4gICAgICBzZXRUb3RhbEl0ZW1zLFxuICAgICAgZ2V0VG90YWxJdGVtczogKCkgPT4gdG90YWxJdGVtcyxcbiAgICAgIC8vIEN1cnNvci1zcGVjaWZpYyBtZXRob2RzXG4gICAgICBnZXRDdXJyZW50Q3Vyc29yOiAoKSA9PiBjdXJyZW50Q3Vyc29yLFxuICAgICAgZ2V0Q3Vyc29yRm9yUGFnZTogKHBhZ2U6IG51bWJlcikgPT4gY3Vyc29yTWFwLmdldChwYWdlKSB8fCBudWxsLFxuICAgICAgLy8gUmVzZXQgbWV0aG9kIGZvciByZWxvYWQgZnVuY3Rpb25hbGl0eVxuICAgICAgcmVzZXQsXG4gICAgfTtcblxuICAgIC8vIEFkZCBjb2xsZWN0aW9uIGRhdGEgYWNjZXNzIHdpdGggZGlyZWN0IGFzc2lnbm1lbnRcbiAgICAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbiA9IHtcbiAgICAgIGl0ZW1zLFxuICAgICAgZ2V0SXRlbXM6ICgpID0+IGl0ZW1zLFxuICAgICAgZ2V0SXRlbTogKGluZGV4OiBudW1iZXIpID0+IGl0ZW1zW2luZGV4XSxcbiAgICAgIGxvYWRSYW5nZSxcbiAgICAgIGxvYWRNaXNzaW5nUmFuZ2VzOiAoXG4gICAgICAgIHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0sXG4gICAgICAgIGNhbGxlcj86IHN0cmluZyxcbiAgICAgICkgPT4gbG9hZE1pc3NpbmdSYW5nZXMocmFuZ2UsIGNhbGxlciB8fCBcImNvbXBvbmVudC5jb2xsZWN0aW9uXCIpLFxuICAgICAgZ2V0TG9hZGluZ1N0YXRzOiAoKSA9PiAoe1xuICAgICAgICBwZW5kaW5nUmVxdWVzdHM6IGFjdGl2ZUxvYWRDb3VudCxcbiAgICAgICAgY29tcGxldGVkUmVxdWVzdHM6IGNvbXBsZXRlZExvYWRzLFxuICAgICAgICBmYWlsZWRSZXF1ZXN0czogZmFpbGVkTG9hZHMsXG4gICAgICAgIGNhbmNlbGxlZFJlcXVlc3RzOiBjYW5jZWxsZWRMb2FkcyxcbiAgICAgICAgY3VycmVudFZlbG9jaXR5LFxuICAgICAgICBjYW5Mb2FkOiBjYW5Mb2FkKCksXG4gICAgICAgIHF1ZXVlZFJlcXVlc3RzOiBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCxcbiAgICAgIH0pLFxuICAgICAgLy8gVG90YWwgaXRlbXMgbWFuYWdlbWVudFxuICAgICAgZ2V0VG90YWxJdGVtczogKCkgPT4gdG90YWxJdGVtcyxcbiAgICAgIHNldFRvdGFsSXRlbXMsXG4gICAgICAvLyBDdXJzb3IgbWV0aG9kc1xuICAgICAgZ2V0Q3VycmVudEN1cnNvcjogKCkgPT4gY3VycmVudEN1cnNvcixcbiAgICAgIGdldEN1cnNvckZvclBhZ2U6IChwYWdlOiBudW1iZXIpID0+IGN1cnNvck1hcC5nZXQocGFnZSkgfHwgbnVsbCxcbiAgICAgIC8vIFJlc2V0IG1ldGhvZCBmb3IgcmVsb2FkIGZ1bmN0aW9uYWxpdHlcbiAgICAgIHJlc2V0LFxuICAgIH07XG5cbiAgICAvLyBBbHNvIGVuc3VyZSBjb21wb25lbnQuaXRlbXMgaXMgdXBkYXRlZFxuICAgIGNvbXBvbmVudC5pdGVtcyA9IGl0ZW1zO1xuXG4gICAgLy8gQ2xlYW51cCBmdW5jdGlvbiAtIGNvbXByZWhlbnNpdmUgbWVtb3J5IGNsZWFudXBcbiAgICBjb25zdCBkZXN0cm95ID0gKCkgPT4ge1xuICAgICAgbG9nTWVtb3J5U3RhdHMoXCJkZXN0cm95OmJlZm9yZVwiKTtcblxuICAgICAgLy8gQWJvcnQgYWxsIGluLWZsaWdodCByZXF1ZXN0c1xuICAgICAgYWJvcnRDb250cm9sbGVycy5mb3JFYWNoKChjb250cm9sbGVyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gSWdub3JlIGFib3J0IGVycm9yc1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGFib3J0Q29udHJvbGxlcnMuY2xlYXIoKTtcblxuICAgICAgLy8gQ2xlYXIgYWxsIGRhdGEgc3RydWN0dXJlc1xuICAgICAgaXRlbXMubGVuZ3RoID0gMDtcbiAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoID0gMDtcbiAgICAgIGxvYWRlZFJhbmdlcy5jbGVhcigpO1xuICAgICAgcGVuZGluZ1Jhbmdlcy5jbGVhcigpO1xuICAgICAgZmFpbGVkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICBhY3RpdmVMb2FkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICBhY3RpdmVSZXF1ZXN0cy5jbGVhcigpO1xuICAgICAgY3Vyc29yTWFwLmNsZWFyKCk7XG4gICAgICBwYWdlVG9PZmZzZXRNYXAuY2xlYXIoKTtcblxuICAgICAgLy8gUmVzZXQgc3RhdGVcbiAgICAgIHRvdGFsSXRlbXMgPSAwO1xuICAgICAgY3VycmVudEN1cnNvciA9IG51bGw7XG4gICAgICBoaWdoZXN0TG9hZGVkUGFnZSA9IDA7XG4gICAgICBkaXNjb3ZlcmVkVG90YWwgPSBudWxsO1xuICAgICAgaGFzUmVhY2hlZEVuZCA9IGZhbHNlO1xuXG4gICAgICAvLyBDbGVhciBjb21wb25lbnQgcmVmZXJlbmNlXG4gICAgICBpZiAoY29tcG9uZW50Lml0ZW1zID09PSBpdGVtcykge1xuICAgICAgICBjb21wb25lbnQuaXRlbXMgPSBbXTtcbiAgICAgIH1cblxuICAgICAgbG9nTWVtb3J5U3RhdHMoXCJkZXN0cm95OmFmdGVyXCIpO1xuICAgIH07XG5cbiAgICAvLyBXaXJlIGRlc3Ryb3kgaW50byB0aGUgY29tcG9uZW50J3MgZGVzdHJveSBjaGFpblxuICAgIHdyYXBEZXN0cm95KGNvbXBvbmVudCwgZGVzdHJveSk7XG5cbiAgICAvLyBSZXR1cm4gZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIGNvbGxlY3Rpb246IHtcbiAgICAgICAgLy8gRGF0YSBhY2Nlc3MgbWV0aG9kc1xuICAgICAgICBpdGVtcyxcbiAgICAgICAgZ2V0SXRlbXM6ICgpID0+IGl0ZW1zLFxuICAgICAgICBnZXRJdGVtOiAoaW5kZXg6IG51bWJlcikgPT4gaXRlbXNbaW5kZXhdLFxuICAgICAgICAvLyBMb2FkaW5nIG1ldGhvZHNcbiAgICAgICAgbG9hZFJhbmdlLFxuICAgICAgICBsb2FkTWlzc2luZ1JhbmdlczogKFxuICAgICAgICAgIHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0sXG4gICAgICAgICAgY2FsbGVyPzogc3RyaW5nLFxuICAgICAgICApID0+IGxvYWRNaXNzaW5nUmFuZ2VzKHJhbmdlLCBjYWxsZXIgfHwgXCJyZXR1cm4uY29sbGVjdGlvblwiKSxcbiAgICAgICAgZ2V0TG9hZGVkUmFuZ2VzOiAoKSA9PiBsb2FkZWRSYW5nZXMsXG4gICAgICAgIGdldFBlbmRpbmdSYW5nZXM6ICgpID0+IHBlbmRpbmdSYW5nZXMsXG4gICAgICAgIGNsZWFyRmFpbGVkUmFuZ2VzOiAoKSA9PiBmYWlsZWRSYW5nZXMuY2xlYXIoKSxcbiAgICAgICAgcmV0cnlGYWlsZWRSYW5nZSxcbiAgICAgICAgc2V0VG90YWxJdGVtcyxcbiAgICAgICAgZ2V0VG90YWxJdGVtczogKCkgPT4gdG90YWxJdGVtcyxcbiAgICAgICAgLy8gQ3Vyc29yLXNwZWNpZmljIG1ldGhvZHNcbiAgICAgICAgZ2V0Q3VycmVudEN1cnNvcjogKCkgPT4gY3VycmVudEN1cnNvcixcbiAgICAgICAgZ2V0Q3Vyc29yRm9yUGFnZTogKHBhZ2U6IG51bWJlcikgPT4gY3Vyc29yTWFwLmdldChwYWdlKSB8fCBudWxsLFxuICAgICAgICAvLyBSZXNldCBtZXRob2QgZm9yIHJlbG9hZCBmdW5jdGlvbmFsaXR5XG4gICAgICAgIHJlc2V0LFxuICAgICAgfSxcbiAgICB9O1xuICB9O1xufVxuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9wbGFjZWhvbGRlcnMudHNcblxuLyoqXG4gKiBQbGFjZWhvbGRlciBGZWF0dXJlIC0gU21hcnQgcGxhY2Vob2xkZXIgZ2VuZXJhdGlvblxuICogQW5hbHl6ZXMgZmlyc3QgbG9hZGVkIGRhdGEgdG8gZ2VuZXJhdGUgcmVhbGlzdGljIG1hc2tlZCBwbGFjZWhvbGRlcnNcbiAqIFNob3dzIHBsYWNlaG9sZGVycyB3aGlsZSBkYXRhIGlzIGxvYWRpbmdcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2xsZWN0aW9uQ29tcG9uZW50IH0gZnJvbSBcIi4vY29sbGVjdGlvblwiO1xuaW1wb3J0IHsgVklFV1BPUlRfQ09OU1RBTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHBsYWNlaG9sZGVyIGZlYXR1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGFjZWhvbGRlckNvbmZpZyB7XG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuICBhbmFseXplRmlyc3RMb2FkPzogYm9vbGVhbjtcbiAgbWFza0NoYXJhY3Rlcj86IHN0cmluZztcbiAgcmFuZG9tTGVuZ3RoVmFyaWFuY2U/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEZpZWxkIHN0cnVjdHVyZSBmb3IgcGxhY2Vob2xkZXIgZ2VuZXJhdGlvblxuICovXG5pbnRlcmZhY2UgRmllbGRTdHJ1Y3R1cmUge1xuICBtaW5MZW5ndGg6IG51bWJlcjtcbiAgbWF4TGVuZ3RoOiBudW1iZXI7XG4gIGF2Z0xlbmd0aDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYWNlaG9sZGVyQ29tcG9uZW50IHtcbiAgcGxhY2Vob2xkZXJzOiB7XG4gICAgYW5hbHl6ZURhdGFTdHJ1Y3R1cmU6IChpdGVtczogYW55W10pID0+IHZvaWQ7XG4gICAgaGFzQW5hbHl6ZWRTdHJ1Y3R1cmU6ICgpID0+IGJvb2xlYW47XG4gICAgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW06IChpbmRleDogbnVtYmVyKSA9PiBhbnk7XG4gICAgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW1zOiAocmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSkgPT4gYW55W107XG4gICAgc2hvd1BsYWNlaG9sZGVyczogKHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pID0+IHZvaWQ7XG4gICAgaXNQbGFjZWhvbGRlcjogKGl0ZW06IGFueSkgPT4gYm9vbGVhbjtcbiAgICByZXBsYWNlUGxhY2Vob2xkZXJzOiAoaXRlbXM6IGFueVtdLCBvZmZzZXQ6IG51bWJlcikgPT4gdm9pZDtcbiAgICBjbGVhcjogKCkgPT4gdm9pZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBBZGRzIHBsYWNlaG9sZGVyIGZ1bmN0aW9uYWxpdHkgdG8gdmlld3BvcnQgY29tcG9uZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoUGxhY2Vob2xkZXJzKGNvbmZpZzogUGxhY2Vob2xkZXJDb25maWcgPSB7fSkge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBDb2xsZWN0aW9uQ29tcG9uZW50PihcbiAgICBjb21wb25lbnQ6IFRcbiAgKTogVCAmIFBsYWNlaG9sZGVyQ29tcG9uZW50ID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICAgIGFuYWx5emVGaXJzdExvYWQgPSB0cnVlLFxuICAgICAgbWFza0NoYXJhY3RlciA9IFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVNLX0NIQVJBQ1RFUixcbiAgICAgIHJhbmRvbUxlbmd0aFZhcmlhbmNlID0gVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSXG4gICAgICAgIC5SQU5ET01fTEVOR1RIX1ZBUklBTkNFLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBTdGF0ZVxuICAgIGxldCBmaWVsZFN0cnVjdHVyZXM6IE1hcDxzdHJpbmcsIEZpZWxkU3RydWN0dXJlPiB8IG51bGwgPSBudWxsO1xuICAgIGxldCBoYXNBbmFseXplZCA9IGZhbHNlO1xuICAgIGxldCBwbGFjZWhvbGRlcklkQ291bnRlciA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBBbmFseXplIGRhdGEgc3RydWN0dXJlIGZyb20gZmlyc3QgbG9hZGVkIGl0ZW1zXG4gICAgICovXG4gICAgY29uc3QgYW5hbHl6ZURhdGFTdHJ1Y3R1cmUgPSAoaXRlbXM6IGFueVtdKTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWVuYWJsZWQgfHwgaGFzQW5hbHl6ZWQgfHwgIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBg8J+UjSBbUExBQ0VIT0xERVJTXSBBbmFseXppbmcgZGF0YSBzdHJ1Y3R1cmUgZnJvbSAke2l0ZW1zLmxlbmd0aH0gaXRlbXNgXG4gICAgICAvLyApO1xuXG4gICAgICBjb25zdCBzdHJ1Y3R1cmVzID0gbmV3IE1hcDxzdHJpbmcsIEZpZWxkU3RydWN0dXJlPigpO1xuICAgICAgY29uc3Qgc2FtcGxlU2l6ZSA9IE1hdGgubWluKFxuICAgICAgICBpdGVtcy5sZW5ndGgsXG4gICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVhfU0FNUExFX1NJWkVcbiAgICAgICk7XG5cbiAgICAgIC8vIEFuYWx5emUgZWFjaCBmaWVsZCBhY3Jvc3MgYWxsIHNhbXBsZSBpdGVtc1xuICAgICAgY29uc3QgZmllbGRTdGF0cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXJbXT4oKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzYW1wbGVTaXplOyBpKyspIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zW2ldO1xuICAgICAgICBpZiAoIWl0ZW0gfHwgdHlwZW9mIGl0ZW0gIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuXG4gICAgICAgIE9iamVjdC5rZXlzKGl0ZW0pLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgLy8gU2tpcCBpbnRlcm5hbCBmaWVsZHNcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBmaWVsZC5zdGFydHNXaXRoKFwiX1wiKSB8fFxuICAgICAgICAgICAgZmllbGQgPT09IFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5QTEFDRUhPTERFUl9GTEFHXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBTdHJpbmcoaXRlbVtmaWVsZF0gfHwgXCJcIik7XG4gICAgICAgICAgY29uc3QgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuXG4gICAgICAgICAgaWYgKCFmaWVsZFN0YXRzLmhhcyhmaWVsZCkpIHtcbiAgICAgICAgICAgIGZpZWxkU3RhdHMuc2V0KGZpZWxkLCBbXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZpZWxkU3RhdHMuZ2V0KGZpZWxkKSEucHVzaChsZW5ndGgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FsY3VsYXRlIHN0YXRpc3RpY3MgZm9yIGVhY2ggZmllbGRcbiAgICAgIGZpZWxkU3RhdHMuZm9yRWFjaCgobGVuZ3RocywgZmllbGQpID0+IHtcbiAgICAgICAgaWYgKGxlbmd0aHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgbWluTGVuZ3RoID0gTWF0aC5taW4oLi4ubGVuZ3Rocyk7XG4gICAgICAgIGNvbnN0IG1heExlbmd0aCA9IE1hdGgubWF4KC4uLmxlbmd0aHMpO1xuICAgICAgICBjb25zdCBhdmdMZW5ndGggPSBNYXRoLnJvdW5kKFxuICAgICAgICAgIGxlbmd0aHMucmVkdWNlKChzdW0sIGxlbikgPT4gc3VtICsgbGVuLCAwKSAvIGxlbmd0aHMubGVuZ3RoXG4gICAgICAgICk7XG5cbiAgICAgICAgc3RydWN0dXJlcy5zZXQoZmllbGQsIHtcbiAgICAgICAgICBtaW5MZW5ndGgsXG4gICAgICAgICAgbWF4TGVuZ3RoLFxuICAgICAgICAgIGF2Z0xlbmd0aCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZmllbGRTdHJ1Y3R1cmVzID0gc3RydWN0dXJlcztcbiAgICAgIGhhc0FuYWx5emVkID0gdHJ1ZTtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGDinIUgW1BMQUNFSE9MREVSU10gU3RydWN0dXJlIGFuYWx5emVkOmAsXG4gICAgICAvLyAgIE9iamVjdC5mcm9tRW50cmllcyhzdHJ1Y3R1cmVzKVxuICAgICAgLy8gKTtcblxuICAgICAgLy8gRW1pdCBldmVudFxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnBsYWNlaG9sZGVycy1zdHJ1Y3R1cmUtYW5hbHl6ZWRcIiwge1xuICAgICAgICBzdHJ1Y3R1cmU6IE9iamVjdC5mcm9tRW50cmllcyhzdHJ1Y3R1cmVzKSxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSBhIHNpbmdsZSBwbGFjZWhvbGRlciBpdGVtXG4gICAgICovXG4gICAgY29uc3QgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW0gPSAoaW5kZXg6IG51bWJlcik6IGFueSA9PiB7XG4gICAgICBjb25zdCBwbGFjZWhvbGRlcjogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgICAgaWQ6IGBwbGFjZWhvbGRlci0ke3BsYWNlaG9sZGVySWRDb3VudGVyKyt9YCxcbiAgICAgICAgW1ZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5QTEFDRUhPTERFUl9GTEFHXTogdHJ1ZSxcbiAgICAgICAgX2luZGV4OiBpbmRleCxcbiAgICAgIH07XG5cbiAgICAgIGlmICghZmllbGRTdHJ1Y3R1cmVzIHx8IGZpZWxkU3RydWN0dXJlcy5zaXplID09PSAwKSB7XG4gICAgICAgIC8vIE5vIHN0cnVjdHVyZSBhbmFseXplZCB5ZXQgLSByZXR1cm4gYmFzaWMgcGxhY2Vob2xkZXJcbiAgICAgICAgcGxhY2Vob2xkZXIubGFiZWwgPSBtYXNrQ2hhcmFjdGVyLnJlcGVhdCgxMCk7XG4gICAgICAgIHJldHVybiBwbGFjZWhvbGRlcjtcbiAgICAgIH1cblxuICAgICAgLy8gR2VuZXJhdGUgZmllbGRzIGJhc2VkIG9uIGFuYWx5emVkIHN0cnVjdHVyZVxuICAgICAgZmllbGRTdHJ1Y3R1cmVzLmZvckVhY2goKHN0cnVjdHVyZSwgZmllbGQpID0+IHtcbiAgICAgICAgbGV0IGxlbmd0aDogbnVtYmVyO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICByYW5kb21MZW5ndGhWYXJpYW5jZSAmJlxuICAgICAgICAgIHN0cnVjdHVyZS5taW5MZW5ndGggIT09IHN0cnVjdHVyZS5tYXhMZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gUmFuZG9tIGxlbmd0aCB3aXRoaW4gcmFuZ2VcbiAgICAgICAgICBsZW5ndGggPSBNYXRoLmZsb29yKFxuICAgICAgICAgICAgTWF0aC5yYW5kb20oKSAqIChzdHJ1Y3R1cmUubWF4TGVuZ3RoIC0gc3RydWN0dXJlLm1pbkxlbmd0aCArIDEpICtcbiAgICAgICAgICAgICAgc3RydWN0dXJlLm1pbkxlbmd0aFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVXNlIGF2ZXJhZ2UgbGVuZ3RoXG4gICAgICAgICAgbGVuZ3RoID0gc3RydWN0dXJlLmF2Z0xlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGx5IHNvbWUgdmFyaWF0aW9uIHRvIG1ha2UgaXQgbG9vayBtb3JlIG5hdHVyYWxcbiAgICAgICAgaWYgKHJhbmRvbUxlbmd0aFZhcmlhbmNlICYmIE1hdGgucmFuZG9tKCkgPCAwLjMpIHtcbiAgICAgICAgICBsZW5ndGggPSBNYXRoLm1heCgxLCBsZW5ndGggKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAzKSAtIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcGxhY2Vob2xkZXJbZmllbGRdID0gbWFza0NoYXJhY3Rlci5yZXBlYXQobGVuZ3RoKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcGxhY2Vob2xkZXI7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIG11bHRpcGxlIHBsYWNlaG9sZGVyIGl0ZW1zXG4gICAgICovXG4gICAgY29uc3QgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW1zID0gKHJhbmdlOiB7XG4gICAgICBzdGFydDogbnVtYmVyO1xuICAgICAgZW5kOiBudW1iZXI7XG4gICAgfSk6IGFueVtdID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1zOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IHJhbmdlLnN0YXJ0OyBpIDw9IHJhbmdlLmVuZDsgaSsrKSB7XG4gICAgICAgIGl0ZW1zLnB1c2goZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW0oaSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTaG93IHBsYWNlaG9sZGVycyBmb3IgYSByYW5nZVxuICAgICAqL1xuICAgIGNvbnN0IHNob3dQbGFjZWhvbGRlcnMgPSAocmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFlbmFibGVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVycyA9IGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtcyhyYW5nZSk7XG5cbiAgICAgIC8vIFVwZGF0ZSBpdGVtcyBhcnJheVxuICAgICAgaWYgKGNvbXBvbmVudC5pdGVtcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsYWNlaG9sZGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gcmFuZ2Uuc3RhcnQgKyBpO1xuICAgICAgICAgIGlmICghY29tcG9uZW50Lml0ZW1zW2luZGV4XSkge1xuICAgICAgICAgICAgY29tcG9uZW50Lml0ZW1zW2luZGV4XSA9IHBsYWNlaG9sZGVyc1tpXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGDwn5SEIFtQTEFDRUhPTERFUlNdIFNob3dpbmcgJHtwbGFjZWhvbGRlcnMubGVuZ3RofSBwbGFjZWhvbGRlcnMgZm9yIHJhbmdlICR7cmFuZ2Uuc3RhcnR9LSR7cmFuZ2UuZW5kfWBcbiAgICAgICk7XG5cbiAgICAgIC8vIEVtaXQgZXZlbnRcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpwbGFjZWhvbGRlcnMtc2hvd25cIiwge1xuICAgICAgICByYW5nZSxcbiAgICAgICAgY291bnQ6IHBsYWNlaG9sZGVycy5sZW5ndGgsXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYW4gaXRlbSBpcyBhIHBsYWNlaG9sZGVyXG4gICAgICovXG4gICAgY29uc3QgaXNQbGFjZWhvbGRlciA9IChpdGVtOiBhbnkpOiBib29sZWFuID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGl0ZW0gJiZcbiAgICAgICAgdHlwZW9mIGl0ZW0gPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgaXRlbVtWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuUExBQ0VIT0xERVJfRkxBR10gPT09IHRydWVcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlcGxhY2UgcGxhY2Vob2xkZXJzIHdpdGggcmVhbCBkYXRhXG4gICAgICovXG4gICAgY29uc3QgcmVwbGFjZVBsYWNlaG9sZGVycyA9IChpdGVtczogYW55W10sIG9mZnNldDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWNvbXBvbmVudC5pdGVtcykgcmV0dXJuO1xuXG4gICAgICBsZXQgcmVwbGFjZWRDb3VudCA9IDA7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBvZmZzZXQgKyBpO1xuICAgICAgICBjb25zdCBjdXJyZW50SXRlbSA9IGNvbXBvbmVudC5pdGVtc1tpbmRleF07XG5cbiAgICAgICAgaWYgKGlzUGxhY2Vob2xkZXIoY3VycmVudEl0ZW0pKSB7XG4gICAgICAgICAgY29tcG9uZW50Lml0ZW1zW2luZGV4XSA9IGl0ZW1zW2ldO1xuICAgICAgICAgIHJlcGxhY2VkQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocmVwbGFjZWRDb3VudCA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYOKcqCBbUExBQ0VIT0xERVJTXSBSZXBsYWNlZCAke3JlcGxhY2VkQ291bnR9IHBsYWNlaG9sZGVycyBhdCBvZmZzZXQgJHtvZmZzZXR9YFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEVtaXQgZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnBsYWNlaG9sZGVycy1yZXBsYWNlZFwiLCB7XG4gICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgIGNvdW50OiByZXBsYWNlZENvdW50LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgYWxsIHBsYWNlaG9sZGVyIHN0YXRlXG4gICAgICovXG4gICAgY29uc3QgY2xlYXIgPSAoKTogdm9pZCA9PiB7XG4gICAgICBmaWVsZFN0cnVjdHVyZXMgPSBudWxsO1xuICAgICAgaGFzQW5hbHl6ZWQgPSBmYWxzZTtcbiAgICAgIHBsYWNlaG9sZGVySWRDb3VudGVyID0gMDtcbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBmdW5jdGlvblxuICAgIGNvbnN0IGluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgICBpZiAoIWVuYWJsZWQpIHJldHVybjtcblxuICAgICAgLy8gTGlzdGVuIGZvciBmaXJzdCBkYXRhIGxvYWQgdG8gYW5hbHl6ZSBzdHJ1Y3R1cmVcbiAgICAgIGlmIChhbmFseXplRmlyc3RMb2FkKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZVJhbmdlTG9hZGVkID0gKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgIGlmICghaGFzQW5hbHl6ZWQgJiYgZGF0YS5pdGVtcyAmJiBkYXRhLml0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFuYWx5emVEYXRhU3RydWN0dXJlKGRhdGEuaXRlbXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJlcGxhY2UgYW55IHBsYWNlaG9sZGVycyB3aXRoIHJlYWwgZGF0YVxuICAgICAgICAgIHJlcGxhY2VQbGFjZWhvbGRlcnMoZGF0YS5pdGVtcywgZGF0YS5vZmZzZXQpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6cmFuZ2UtbG9hZGVkXCIsIGhhbmRsZVJhbmdlTG9hZGVkKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2hvdyBpbml0aWFsIHBsYWNlaG9sZGVycyBpZiBjb25maWd1cmVkXG4gICAgICBjb25zdCB0b3RhbEl0ZW1zID0gY29tcG9uZW50LmNvbGxlY3Rpb24/LmdldFRvdGFsSXRlbXMoKSB8fCAwO1xuICAgICAgaWYgKHRvdGFsSXRlbXMgPiAwKSB7XG4gICAgICAgIGNvbnN0IGluaXRpYWxSYW5nZSA9IHtcbiAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICBlbmQ6IE1hdGgubWluKFxuICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLk1BWF9TQU1QTEVfU0laRSAtIDEsXG4gICAgICAgICAgICB0b3RhbEl0ZW1zIC0gMVxuICAgICAgICAgICksXG4gICAgICAgIH07XG4gICAgICAgIHNob3dQbGFjZWhvbGRlcnMoaW5pdGlhbFJhbmdlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQ2xlYW51cCBmdW5jdGlvblxuICAgIGNvbnN0IGRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICBjbGVhcigpO1xuICAgIH07XG5cbiAgICAvLyBTdG9yZSBmdW5jdGlvbnMgZm9yIHZpZXdwb3J0IHRvIGNhbGxcbiAgICAoY29tcG9uZW50IGFzIGFueSkuX3BsYWNlaG9sZGVyc0luaXRpYWxpemUgPSBpbml0aWFsaXplO1xuICAgIChjb21wb25lbnQgYXMgYW55KS5fcGxhY2Vob2xkZXJzRGVzdHJveSA9IGRlc3Ryb3k7XG5cbiAgICAvLyBSZXR1cm4gZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIHBsYWNlaG9sZGVyczoge1xuICAgICAgICBhbmFseXplRGF0YVN0cnVjdHVyZSxcbiAgICAgICAgaGFzQW5hbHl6ZWRTdHJ1Y3R1cmU6ICgpID0+IGhhc0FuYWx5emVkLFxuICAgICAgICBnZW5lcmF0ZVBsYWNlaG9sZGVySXRlbSxcbiAgICAgICAgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW1zLFxuICAgICAgICBzaG93UGxhY2Vob2xkZXJzLFxuICAgICAgICBpc1BsYWNlaG9sZGVyLFxuICAgICAgICByZXBsYWNlUGxhY2Vob2xkZXJzLFxuICAgICAgICBjbGVhcixcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbn1cbiIsCiAgICAiLyoqXG4gKiBSZW5kZXJpbmcgRmVhdHVyZSAtIEl0ZW0gcmVuZGVyaW5nIGFuZCBwb3NpdGlvbmluZyBmb3Igdmlld3BvcnRcbiAqIEhhbmRsZXMgRE9NIGVsZW1lbnQgY3JlYXRpb24sIHBvc2l0aW9uaW5nLCByZWN5Y2xpbmcsIGFuZCB1cGRhdGVzXG4gKi9cblxuaW1wb3J0IHsgYWRkQ2xhc3MsIHJlbW92ZUNsYXNzLCBoYXNDbGFzcyB9IGZyb20gXCJtdHJsXCI7XG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZJRVdQT1JUX0NPTlNUQU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIGlzUGxhY2Vob2xkZXIsXG4gIGdldFZpZXdwb3J0U3RhdGUsXG4gIHdyYXBJbml0aWFsaXplLFxuICB3cmFwRGVzdHJveSxcbn0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IGNyZWF0ZUxheW91dCB9IGZyb20gXCIuLi8uLi9sYXlvdXRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJpbmdDb25maWcge1xuICB0ZW1wbGF0ZT86IChcbiAgICBpdGVtOiBhbnksXG4gICAgaW5kZXg6IG51bWJlcixcbiAgKSA9PiBzdHJpbmcgfCBIVE1MRWxlbWVudCB8IGFueVtdIHwgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgb3ZlcnNjYW4/OiBudW1iZXI7XG4gIG1lYXN1cmVJdGVtcz86IGJvb2xlYW47XG4gIGVuYWJsZVJlY3ljbGluZz86IGJvb2xlYW47XG4gIG1heFBvb2xTaXplPzogbnVtYmVyO1xuICAvKipcbiAgICogTWFpbnRhaW4gRE9NIG9yZGVyIHRvIG1hdGNoIHZpc3VhbCBpbmRleCBvcmRlci5cbiAgICogRW5hYmxlcyBDU1Mgc2VsZWN0b3JzIGxpa2UgOmZpcnN0LWNoaWxkLCA6bnRoLWNoaWxkKCkgdG8gd29yayBjb3JyZWN0bHkuXG4gICAqIERlZmF1bHQ6IHRydWVcbiAgICovXG4gIG1haW50YWluRG9tT3JkZXI/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgVmlld3BvcnRTdGF0ZSB7XG4gIHNjcm9sbFBvc2l0aW9uOiBudW1iZXI7XG4gIHRvdGFsSXRlbXM6IG51bWJlcjtcbiAgaXRlbVNpemU6IG51bWJlcjtcbiAgY29udGFpbmVyU2l6ZTogbnVtYmVyO1xuICB2aXJ0dWFsVG90YWxTaXplOiBudW1iZXI7XG4gIHZpc2libGVSYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9O1xuICBpdGVtc0NvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsO1xufVxuXG4vKipcbiAqIFJlbmRlcmluZyBmZWF0dXJlIGZvciB2aWV3cG9ydFxuICovXG5leHBvcnQgY29uc3Qgd2l0aFJlbmRlcmluZyA9IChjb25maWc6IFJlbmRlcmluZ0NvbmZpZyA9IHt9KSA9PiB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50Pihjb21wb25lbnQ6IFQpOiBUID0+IHtcbiAgICBjb25zdCB7XG4gICAgICB0ZW1wbGF0ZSxcbiAgICAgIG92ZXJzY2FuID0gNSxcbiAgICAgIG1lYXN1cmVJdGVtcyA9IGZhbHNlLFxuICAgICAgZW5hYmxlUmVjeWNsaW5nID0gdHJ1ZSxcbiAgICAgIG1heFBvb2xTaXplID0gVklFV1BPUlRfQ09OU1RBTlRTLlJFTkRFUklORy5ERUZBVUxUX01BWF9QT09MX1NJWkUsXG4gICAgICBtYWludGFpbkRvbU9yZGVyID0gdHJ1ZSxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gSGVscGVyIHRvIGdldCBpdGVtcyBmcm9tIGNvbGxlY3Rpb24gKHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGgpXG4gICAgY29uc3QgZ2V0Q29sbGVjdGlvbkl0ZW1zID0gKCk6IGFueVtdID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uPy5pdGVtcyB8fCAoY29tcG9uZW50IGFzIGFueSkuaXRlbXMgfHwgW11cbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8vIFN0YXRlXG4gICAgY29uc3QgcmVuZGVyZWRFbGVtZW50cyA9IG5ldyBNYXA8bnVtYmVyLCBIVE1MRWxlbWVudD4oKTtcbiAgICBjb25zdCBlbGVtZW50UG9vbDogSFRNTEVsZW1lbnRbXSA9IFtdO1xuICAgIGNvbnN0IHBvb2xTdGF0cyA9IHsgY3JlYXRlZDogMCwgcmVjeWNsZWQ6IDAsIHBvb2xTaXplOiAwLCByZWxlYXNlZDogMCB9O1xuXG4gICAgLy8gU3RvcmUgbGF5b3V0IHJlc3VsdHMgZm9yIHByb3BlciBjbGVhbnVwIChwcmV2ZW50cyBtZW1vcnkgbGVhaylcbiAgICBjb25zdCBsYXlvdXRSZXN1bHRzID0gbmV3IFdlYWtNYXA8SFRNTEVsZW1lbnQsIHsgZGVzdHJveTogKCkgPT4gdm9pZCB9PigpO1xuXG4gICAgLy8gUmV1c2FibGUgdGVtcGxhdGUgZWxlbWVudCBmb3IgSFRNTCBzdHJpbmcgcGFyc2luZyAobW9yZSBlZmZpY2llbnQgdGhhbiBkaXYpXG4gICAgY29uc3QgdGVtcGxhdGVQYXJzZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG5cbiAgICBsZXQgdmlld3BvcnRTdGF0ZTogVmlld3BvcnRTdGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjdXJyZW50VmlzaWJsZVJhbmdlID0geyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgbGV0IGxhc3RSZW5kZXJUaW1lID0gMDtcbiAgICBsZXQgaXNSZW1vdmluZ0l0ZW0gPSBmYWxzZTtcblxuICAgIC8vIEVsZW1lbnQgcG9vbCBtYW5hZ2VtZW50XG4gICAgY29uc3QgZ2V0UG9vbGVkRWxlbWVudCA9ICgpOiBIVE1MRWxlbWVudCA9PiB7XG4gICAgICBpZiAoZW5hYmxlUmVjeWNsaW5nICYmIGVsZW1lbnRQb29sLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcG9vbFN0YXRzLnJlY3ljbGVkKys7XG4gICAgICAgIHJldHVybiBlbGVtZW50UG9vbC5wb3AoKSE7XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gXCJtdHJsLXZpZXdwb3J0LWl0ZW1cIjtcbiAgICAgIHBvb2xTdGF0cy5jcmVhdGVkKys7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVsZWFzZUVsZW1lbnQgPSAoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkID0+IHtcbiAgICAgIHBvb2xTdGF0cy5yZWxlYXNlZCsrO1xuXG4gICAgICAvLyBDUklUSUNBTDogQ2FsbCBkZXN0cm95IG9uIGxheW91dFJlc3VsdCB0byBjbGVhbiB1cCBjb21wb25lbnRzIGFuZCBldmVudCBsaXN0ZW5lcnNcbiAgICAgIC8vIFRoaXMgZml4ZXMgdGhlIG1lbW9yeSBsZWFrIHdoZW4gdXNpbmcgbGF5b3V0IHRlbXBsYXRlc1xuICAgICAgY29uc3QgbGF5b3V0UmVzdWx0ID0gbGF5b3V0UmVzdWx0cy5nZXQoZWxlbWVudCk7XG4gICAgICBpZiAobGF5b3V0UmVzdWx0ICYmIHR5cGVvZiBsYXlvdXRSZXN1bHQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGF5b3V0UmVzdWx0LmRlc3Ryb3koKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIElnbm9yZSBkZXN0cm95IGVycm9ycyAtIGVsZW1lbnQgbWF5IGFscmVhZHkgYmUgY2xlYW5lZCB1cFxuICAgICAgICB9XG4gICAgICAgIGxheW91dFJlc3VsdHMuZGVsZXRlKGVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVuYWJsZVJlY3ljbGluZykge1xuICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBDbGVhbiBlbGVtZW50IGZvciByZXVzZSAobm8gY2xvbmluZyAtIHJldXNlIHRoZSBhY3R1YWwgZWxlbWVudClcbiAgICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gXCJtdHJsLXZpZXdwb3J0LWl0ZW1cIjtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS1pbmRleFwiKTtcbiAgICAgIGVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9IFwiXCI7XG4gICAgICBlbGVtZW50LmlubmVySFRNTCA9IFwiXCI7XG5cbiAgICAgIC8vIFJlbW92ZSBmcm9tIERPTSBmaXJzdFxuICAgICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICBlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCB0byBwb29sIGlmIG5vdCBmdWxsXG4gICAgICBpZiAoZWxlbWVudFBvb2wubGVuZ3RoIDwgbWF4UG9vbFNpemUpIHtcbiAgICAgICAgZWxlbWVudFBvb2wucHVzaChlbGVtZW50KTtcbiAgICAgICAgcG9vbFN0YXRzLnBvb2xTaXplID0gZWxlbWVudFBvb2wubGVuZ3RoO1xuICAgICAgfVxuICAgICAgLy8gSWYgcG9vbCBpcyBmdWxsLCBlbGVtZW50IGlzIGp1c3QgZGVyZWZlcmVuY2VkIGFuZCBHQydkXG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemVcbiAgICB3cmFwSW5pdGlhbGl6ZShjb21wb25lbnQsICgpID0+IHtcbiAgICAgIHZpZXdwb3J0U3RhdGUgPSBnZXRWaWV3cG9ydFN0YXRlKGNvbXBvbmVudCkgYXMgVmlld3BvcnRTdGF0ZTtcblxuICAgICAgLy8gU2V0IGluaXRpYWwgaXRlbXMgY29udGFpbmVyIGhlaWdodCBmcm9tIGN1cnJlbnQgdmlydHVhbCBzaXplXG4gICAgICBpZiAodmlld3BvcnRTdGF0ZT8uaXRlbXNDb250YWluZXIgJiYgdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplID4gMCkge1xuICAgICAgICB2aWV3cG9ydFN0YXRlLml0ZW1zQ29udGFpbmVyLnN0eWxlLmhlaWdodCA9IGAke3ZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZX1weGA7XG4gICAgICB9XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgaXRlbSB1cGRhdGUgcmVxdWVzdHMgZnJvbSBBUElcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiaXRlbTp1cGRhdGUtcmVxdWVzdFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXgsIGl0ZW0sIHByZXZpb3VzSXRlbSB9ID0gZGF0YTtcblxuICAgICAgICAvLyBJdGVtIGlzIGFscmVhZHkgdXBkYXRlZCBpbiBjb2xsZWN0aW9uLml0ZW1zIGJ5IGFwaS50c1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXRlbSBpcyBjdXJyZW50bHkgcmVuZGVyZWRcbiAgICAgICAgY29uc3QgZXhpc3RpbmdFbGVtZW50ID0gcmVuZGVyZWRFbGVtZW50cy5nZXQoaW5kZXgpO1xuICAgICAgICBjb25zdCB3YXNWaXNpYmxlID0gISFleGlzdGluZ0VsZW1lbnQ7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgaXRlbSB3YXMgc2VsZWN0ZWQgYmVmb3JlIHVwZGF0ZVxuICAgICAgICBjb25zdCB3YXNTZWxlY3RlZCA9IGV4aXN0aW5nRWxlbWVudFxuICAgICAgICAgID8gaGFzQ2xhc3MoXG4gICAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudCxcbiAgICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlNFTEVDVElPTi5TRUxFQ1RFRF9DTEFTUyxcbiAgICAgICAgICAgICkgfHwgaGFzQ2xhc3MoZXhpc3RpbmdFbGVtZW50LCBcIm10cmwtdmlld3BvcnQtaXRlbS0tc2VsZWN0ZWRcIilcbiAgICAgICAgICA6IGZhbHNlO1xuXG4gICAgICAgIGlmIChleGlzdGluZ0VsZW1lbnQgJiYgZXhpc3RpbmdFbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAvLyBSZS1yZW5kZXIgdGhlIGl0ZW1cbiAgICAgICAgICBjb25zdCBuZXdFbGVtZW50ID0gcmVuZGVySXRlbShpdGVtLCBpbmRleCk7XG5cbiAgICAgICAgICBpZiAobmV3RWxlbWVudCkge1xuICAgICAgICAgICAgLy8gQ29weSBwb3NpdGlvbiBzdHlsZXMgZnJvbSBleGlzdGluZyBlbGVtZW50XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG5ld0VsZW1lbnQuc3R5bGUsIHtcbiAgICAgICAgICAgICAgcG9zaXRpb246IGV4aXN0aW5nRWxlbWVudC5zdHlsZS5wb3NpdGlvbixcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiBleGlzdGluZ0VsZW1lbnQuc3R5bGUudHJhbnNmb3JtLFxuICAgICAgICAgICAgICB3aWR0aDogZXhpc3RpbmdFbGVtZW50LnN0eWxlLndpZHRoLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIFByZXNlcnZlIHNlbGVjdGVkIHN0YXRlXG4gICAgICAgICAgICBpZiAod2FzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgYWRkQ2xhc3MobmV3RWxlbWVudCwgVklFV1BPUlRfQ09OU1RBTlRTLlNFTEVDVElPTi5TRUxFQ1RFRF9DTEFTUyk7XG4gICAgICAgICAgICAgIGFkZENsYXNzKG5ld0VsZW1lbnQsIFwibXRybC12aWV3cG9ydC1pdGVtLS1zZWxlY3RlZFwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRkIHVwZGF0ZSBhbmltYXRpb24gY2xhc3MgdG8gaW5uZXIgY29udGVudCBmb3IgdmlzaWJpbGl0eVxuICAgICAgICAgICAgYWRkQ2xhc3MobmV3RWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtLS11cGRhdGVkXCIpO1xuICAgICAgICAgICAgLy8gQWxzbyB0cnkgdG8gYWRkIHRvIGZpcnN0IGNoaWxkIGlmIGl0IGV4aXN0cyAodGhlIGFjdHVhbCBpdGVtIGNvbnRlbnQpXG4gICAgICAgICAgICBjb25zdCBpbm5lckl0ZW0gPSBuZXdFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgaWYgKGlubmVySXRlbSkge1xuICAgICAgICAgICAgICBhZGRDbGFzcyhpbm5lckl0ZW0sIFwiaXRlbS0tdXBkYXRlZFwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmVwbGFjZSBpbiBET01cbiAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChcbiAgICAgICAgICAgICAgbmV3RWxlbWVudCxcbiAgICAgICAgICAgICAgZXhpc3RpbmdFbGVtZW50LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2V0KGluZGV4LCBuZXdFbGVtZW50KTtcbiAgICAgICAgICAgIHJlbGVhc2VFbGVtZW50KGV4aXN0aW5nRWxlbWVudCk7XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgYW5pbWF0aW9uIGNsYXNzIGFmdGVyIHRyYW5zaXRpb25cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICByZW1vdmVDbGFzcyhuZXdFbGVtZW50LCBcInZpZXdwb3J0LWl0ZW0tLXVwZGF0ZWRcIik7XG4gICAgICAgICAgICAgIGlmIChpbm5lckl0ZW0pIHtcbiAgICAgICAgICAgICAgICByZW1vdmVDbGFzcyhpbm5lckl0ZW0sIFwiaXRlbS0tdXBkYXRlZFwiKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IGNvbXBsZXRpb24gZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW06dXBkYXRlZFwiLCB7XG4gICAgICAgICAgaXRlbSxcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBwcmV2aW91c0l0ZW0sXG4gICAgICAgICAgd2FzVmlzaWJsZSxcbiAgICAgICAgICB3YXNTZWxlY3RlZCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBpdGVtIHJlbW92ZSByZXF1ZXN0cyBmcm9tIEFQSVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJpdGVtOnJlbW92ZS1yZXF1ZXN0XCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgeyBpbmRleCwgaXRlbSB9ID0gZGF0YTtcbiAgICAgICAgaXNSZW1vdmluZ0l0ZW0gPSB0cnVlO1xuXG4gICAgICAgIC8vIEl0ZW0gaXMgYWxyZWFkeSByZW1vdmVkIGZyb20gY29sbGVjdGlvbi5pdGVtcyBieSBhcGkudHNcbiAgICAgICAgLy8gV2UganVzdCBuZWVkIHRvIHVwZGF0ZSByZW5kZXJlZCBlbGVtZW50c1xuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgcmVuZGVyZWQgZWxlbWVudCBhdCB0aGlzIGluZGV4XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuZ2V0KGluZGV4KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nRWxlbWVudCAmJiBleGlzdGluZ0VsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICAgIHJlbGVhc2VFbGVtZW50KGV4aXN0aW5nRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5kZWxldGUoaW5kZXgpO1xuXG4gICAgICAgIC8vIFNoaWZ0IHJlbmRlcmVkIGVsZW1lbnRzIGluZGljZXMgZG93blxuICAgICAgICBjb25zdCByZW5kZXJlZEtleXMgPSBBcnJheS5mcm9tKHJlbmRlcmVkRWxlbWVudHMua2V5cygpKS5zb3J0KFxuICAgICAgICAgIChhLCBiKSA9PiBhIC0gYixcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgbmV3UmVuZGVyZWRFbGVtZW50cyA9IG5ldyBNYXA8bnVtYmVyLCBIVE1MRWxlbWVudD4oKTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgcmVuZGVyZWRLZXlzKSB7XG4gICAgICAgICAgaWYgKGtleSA+IGluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVuZGVyZWRFbGVtZW50cy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgIC8vIFVwZGF0ZSBkYXRhLWluZGV4IGF0dHJpYnV0ZVxuICAgICAgICAgICAgICBlbGVtZW50LmRhdGFzZXQuaW5kZXggPSBTdHJpbmcoa2V5IC0gMSk7XG4gICAgICAgICAgICAgIG5ld1JlbmRlcmVkRWxlbWVudHMuc2V0KGtleSAtIDEsIGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoa2V5IDwgaW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSByZW5kZXJlZEVsZW1lbnRzLmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgbmV3UmVuZGVyZWRFbGVtZW50cy5zZXQoa2V5LCBlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGVsZW1lbnRdIG9mIG5ld1JlbmRlcmVkRWxlbWVudHMpIHtcbiAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNldChrZXksIGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVjcmVtZW50IHRvdGFsSXRlbXMgTk9XIHNvIHJlbmRlckl0ZW1zKCkgdXNlcyB0aGUgY29ycmVjdCBjb3VudFxuICAgICAgICAvLyBzZXRUb3RhbEl0ZW1zKCkgd2lsbCBiZSBjYWxsZWQgbGF0ZXIgYnkgdGhlIEFQSSwgd2hpY2ggd2lsbCBlbWl0XG4gICAgICAgIC8vIHZpZXdwb3J0OnRvdGFsLWl0ZW1zLWNoYW5nZWQgZm9yIHZpcnR1YWwgc2l6ZSByZWNhbGN1bGF0aW9uXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlICYmIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyA+IDApIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMtLTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc2V0IHZpc2libGUgcmFuZ2UgdG8gZm9yY2UgcmUtcmVuZGVyXG4gICAgICAgIGN1cnJlbnRWaXNpYmxlUmFuZ2UgPSB7IHN0YXJ0OiAtMSwgZW5kOiAtMSB9O1xuXG4gICAgICAgIC8vIEVtaXQgY29tcGxldGlvbiBldmVudFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiaXRlbTpyZW1vdmVkXCIsIHtcbiAgICAgICAgICBpdGVtLFxuICAgICAgICAgIGluZGV4LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBZnRlciBpdGVtIHJlbW92YWwsIGNsZWFyIEFMTCBsb2FkZWRSYW5nZXNcbiAgICAgICAgLy8gVGhpcyBmb3JjZXMgYSBjb21wbGV0ZSByZWxvYWQgd2hpY2ggaXMgbW9yZSByZWxpYWJsZSB0aGFuIHRyeWluZyB0b1xuICAgICAgICAvLyB0cmFjayBzaGlmdGVkIGluZGljZXMuIFRoZSBpdGVtcyBhcnJheSBoYXMgYmVlbiBzcGxpY2VkIGFuZCBhbGwgaW5kaWNlc1xuICAgICAgICAvLyBhcmUgbm93IGRpZmZlcmVudCBmcm9tIHdoYXQgbG9hZGVkUmFuZ2VzIHRoaW5rcyB0aGV5IGFyZS5cbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KT8uY29sbGVjdGlvbjtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24/LmdldExvYWRlZFJhbmdlcykge1xuICAgICAgICAgIGNvbnN0IGxvYWRlZFJhbmdlcyA9IGNvbGxlY3Rpb24uZ2V0TG9hZGVkUmFuZ2VzKCk7XG4gICAgICAgICAgbG9hZGVkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmlnZ2VyIHJlbG9hZCBvZiB2aXNpYmxlIHJhbmdlXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb25JdGVtc0FyciA9IGdldENvbGxlY3Rpb25JdGVtcygpO1xuICAgICAgICBjb25zdCBsb2FkZWRJdGVtc0NvdW50ID0gY29sbGVjdGlvbkl0ZW1zQXJyLmxlbmd0aDtcbiAgICAgICAgY29uc3QgdmlzaWJsZVJhbmdlID0gY29tcG9uZW50LnZpZXdwb3J0Py5nZXRWaXNpYmxlUmFuZ2U/LigpO1xuICAgICAgICBpZiAodmlzaWJsZVJhbmdlICYmIGNvbGxlY3Rpb24/LmxvYWRNaXNzaW5nUmFuZ2VzKSB7XG4gICAgICAgICAgY29sbGVjdGlvbi5sb2FkTWlzc2luZ1JhbmdlcyhcbiAgICAgICAgICAgIHsgc3RhcnQ6IDAsIGVuZDogTWF0aC5tYXgodmlzaWJsZVJhbmdlLmVuZCwgbG9hZGVkSXRlbXNDb3VudCkgfSxcbiAgICAgICAgICAgIFwiaXRlbS1yZW1vdmFsXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyaWdnZXIgcmUtcmVuZGVyXG4gICAgICAgIHJlbmRlckl0ZW1zKCk7XG4gICAgICAgIGlzUmVtb3ZpbmdJdGVtID0gZmFsc2U7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBpdGVtcyBhZGQgcmVxdWVzdHMgZnJvbSBBUElcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiaXRlbXM6YWRkLXJlcXVlc3RcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB7IGl0ZW1zOiBuZXdJdGVtcywgcG9zaXRpb24sIHByZXZpb3VzQ291bnQgfSA9IGRhdGE7XG5cbiAgICAgICAgaWYgKCFuZXdJdGVtcyB8fCBuZXdJdGVtcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICAvLyBJdGVtcyBhcmUgYWxyZWFkeSBhZGRlZCB0byBjb2xsZWN0aW9uLml0ZW1zIGJ5IGFwaS50c1xuICAgICAgICAvLyBXZSBqdXN0IG5lZWQgdG8gdXBkYXRlIHJlbmRlcmVkIGVsZW1lbnRzIGluZGljZXMgaWYgcHJlcGVuZGluZ1xuXG4gICAgICAgIGNvbnN0IGl0ZW1zQWRkZWQgPSBuZXdJdGVtcy5sZW5ndGg7XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSBcInN0YXJ0XCIpIHtcbiAgICAgICAgICAvLyBJdGVtcyB3ZXJlIHByZXBlbmRlZCAtIHNoaWZ0IHJlbmRlcmVkIGVsZW1lbnQgaW5kaWNlc1xuICAgICAgICAgIGNvbnN0IHJlbmRlcmVkS2V5cyA9IEFycmF5LmZyb20ocmVuZGVyZWRFbGVtZW50cy5rZXlzKCkpLnNvcnQoXG4gICAgICAgICAgICAoYSwgYikgPT4gYiAtIGEsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBuZXdSZW5kZXJlZEVsZW1lbnRzID0gbmV3IE1hcDxudW1iZXIsIEhUTUxFbGVtZW50PigpO1xuICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHJlbmRlcmVkS2V5cykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuZ2V0KGtleSkhO1xuICAgICAgICAgICAgY29uc3QgbmV3SW5kZXggPSBrZXkgKyBpdGVtc0FkZGVkO1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWluZGV4XCIsIFN0cmluZyhuZXdJbmRleCkpO1xuICAgICAgICAgICAgbmV3UmVuZGVyZWRFbGVtZW50cy5zZXQobmV3SW5kZXgsIGVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLmNsZWFyKCk7XG4gICAgICAgICAgbmV3UmVuZGVyZWRFbGVtZW50cy5mb3JFYWNoKChlbCwgaWR4KSA9PlxuICAgICAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5zZXQoaWR4LCBlbCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3IgYXBwZW5kLCBubyBpbmRleCBzaGlmdGluZyBuZWVkZWRcblxuICAgICAgICAvLyBVcGRhdGUgdG90YWxJdGVtcyBpbiB2aWV3cG9ydFN0YXRlXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zID1cbiAgICAgICAgICAgICh2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgfHwgMCkgKyBpdGVtc0FkZGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzZXQgdmlzaWJsZSByYW5nZSB0byBmb3JjZSByZS1yZW5kZXJcbiAgICAgICAgY3VycmVudFZpc2libGVSYW5nZSA9IHsgc3RhcnQ6IC0xLCBlbmQ6IC0xIH07XG5cbiAgICAgICAgLy8gQ2xlYXIgbG9hZGVkUmFuZ2VzIHRvIGVuc3VyZSBwcm9wZXIgcmVsb2FkIHRyYWNraW5nXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSk/LmNvbGxlY3Rpb247XG4gICAgICAgIGlmIChjb2xsZWN0aW9uPy5nZXRMb2FkZWRSYW5nZXMpIHtcbiAgICAgICAgICBjb25zdCBsb2FkZWRSYW5nZXMgPSBjb2xsZWN0aW9uLmdldExvYWRlZFJhbmdlcygpO1xuICAgICAgICAgIGxvYWRlZFJhbmdlcy5jbGVhcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJpZ2dlciByZS1yZW5kZXJcbiAgICAgICAgcmVuZGVySXRlbXMoKTtcblxuICAgICAgICAvLyBFbWl0IGNvbXBsZXRpb24gZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW1zOnJlbmRlci1jb21wbGV0ZVwiLCB7XG4gICAgICAgICAgaXRlbXM6IG5ld0l0ZW1zLFxuICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgIHRvdGFsOiB2aWV3cG9ydFN0YXRlPy50b3RhbEl0ZW1zIHx8IDAsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgY29sbGVjdGlvbiBpdGVtcyBldmljdGVkIC0gY2xlYW4gdXAgcmVuZGVyZWQgZWxlbWVudHNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiY29sbGVjdGlvbjppdGVtcy1ldmljdGVkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgeyBrZWVwU3RhcnQsIGtlZXBFbmQgfSA9IGRhdGE7XG5cbiAgICAgICAgLy8gUmVsZWFzZSByZW5kZXJlZCBlbGVtZW50cyBvdXRzaWRlIHRoZSBrZWVwIHJhbmdlXG4gICAgICAgIHJlbmRlcmVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAoaW5kZXggPCBrZWVwU3RhcnQgfHwgaW5kZXggPiBrZWVwRW5kKSB7XG4gICAgICAgICAgICByZWxlYXNlRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuZGVsZXRlKGluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgY29sbGVjdGlvbiByZXNldCB0byBjbGVhciByZW5kZXJpbmcgc3RhdGVcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiY29sbGVjdGlvbjpyZXNldFwiLCAoKSA9PiB7XG4gICAgICAgIC8vIFJlbGVhc2UgYW5kIGNsZWFyIGFsbCByZW5kZXJlZCBlbGVtZW50c1xuICAgICAgICByZW5kZXJlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICByZWxlYXNlRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlbmRlcmVkRWxlbWVudHMuY2xlYXIoKTtcblxuICAgICAgICAvLyBSZXNldCB2aXNpYmxlIHJhbmdlIHRyYWNraW5nXG4gICAgICAgIGN1cnJlbnRWaXNpYmxlUmFuZ2UgPSB7IHN0YXJ0OiAtMSwgZW5kOiAtMSB9O1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgY29sbGVjdGlvbiBkYXRhIGxvYWRlZFxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJjb2xsZWN0aW9uOnJhbmdlLWxvYWRlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmICghZGF0YS5pdGVtcz8ubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgICAgLy8gQW5hbHl6ZSBkYXRhIHN0cnVjdHVyZSBvbiBmaXJzdCBsb2FkXG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVycyA9IChjb21wb25lbnQgYXMgYW55KS5wbGFjZWhvbGRlcnM7XG4gICAgICAgIGlmIChwbGFjZWhvbGRlcnMgJiYgIXBsYWNlaG9sZGVycy5oYXNBbmFseXplZFN0cnVjdHVyZSgpKSB7XG4gICAgICAgICAgcGxhY2Vob2xkZXJzLmFuYWx5emVEYXRhU3RydWN0dXJlKGRhdGEuaXRlbXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXRlbXMgYXJlIGFscmVhZHkgaW4gY29sbGVjdGlvbi5pdGVtcyAtIHJlcGxhY2UgYW55IHBsYWNlaG9sZGVyIERPTSBlbGVtZW50c1xuICAgICAgICBkYXRhLml0ZW1zLmZvckVhY2goKGl0ZW06IGFueSwgaTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBkYXRhLm9mZnNldCArIGk7XG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuZ2V0KGluZGV4KTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIGN1cnJlbnQgcmVuZGVyZWQgZWxlbWVudCBpcyBhIHBsYWNlaG9sZGVyIHRoYXQgbmVlZHMgcmVwbGFjaW5nXG4gICAgICAgICAgLy8gTm90ZTogVGhlIGFjdHVhbCBjbGFzcyBoYXMgJ210cmwtJyBwcmVmaXgsIHNvIGNoZWNrIGZvciBib3RoXG4gICAgICAgICAgY29uc3QgaXNQbGFjZWhvbGRlckVsZW1lbnQgPVxuICAgICAgICAgICAgZWxlbWVudD8uY2xhc3NMaXN0LmNvbnRhaW5zKFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5DTEFTUykgfHxcbiAgICAgICAgICAgIGVsZW1lbnQ/LmNsYXNzTGlzdC5jb250YWlucyhcbiAgICAgICAgICAgICAgYG10cmwtJHtWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuQ0xBU1N9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGlzUGxhY2Vob2xkZXJFbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50ID0gcmVuZGVySXRlbShpdGVtLCBpbmRleCk7XG4gICAgICAgICAgICBpZiAobmV3RWxlbWVudCkge1xuICAgICAgICAgICAgICAvLyBSZW1vdmUgcGxhY2Vob2xkZXIgY2xhc3NlcyBmcm9tIHdyYXBwZXJcbiAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MobmV3RWxlbWVudCwgVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLkNMQVNTKTtcbiAgICAgICAgICAgICAgLy8gQWxzbyByZW1vdmUgZnJvbSBpbm5lciBlbGVtZW50IChmb3Igc3RyaW5nIHRlbXBsYXRlcylcbiAgICAgICAgICAgICAgaWYgKG5ld0VsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICByZW1vdmVDbGFzcyhcbiAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuQ0xBU1MsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIEFkZCByZXBsYWNlZCBjbGFzcyBmb3IgZmFkZS1pbiBhbmltYXRpb25cbiAgICAgICAgICAgICAgYWRkQ2xhc3MobmV3RWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtLS1yZXBsYWNlZFwiKTtcblxuICAgICAgICAgICAgICAvLyBDb3B5IHBvc2l0aW9uIGFuZCByZXBsYWNlXG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obmV3RWxlbWVudC5zdHlsZSwge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBlbGVtZW50LnN0eWxlLnBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgd2lkdGg6IGVsZW1lbnQuc3R5bGUud2lkdGgsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBlbGVtZW50LnBhcmVudE5vZGU/LnJlcGxhY2VDaGlsZChuZXdFbGVtZW50LCBlbGVtZW50KTtcbiAgICAgICAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5zZXQoaW5kZXgsIG5ld0VsZW1lbnQpO1xuICAgICAgICAgICAgICByZWxlYXNlRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHJlcGxhY2VkIGNsYXNzIGFmdGVyIGFuaW1hdGlvbiBjb21wbGV0ZXNcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MobmV3RWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtLS1yZXBsYWNlZFwiKTtcbiAgICAgICAgICAgICAgfSwgMzAwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIHJlbmRlckl0ZW0gcmV0dXJuZWQgbnVsbCAtIHN0aWxsIHJlbGVhc2UgdGhlIG9sZCBlbGVtZW50XG4gICAgICAgICAgICAgIHJlbGVhc2VFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLmRlbGV0ZShpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIHJlbmRlciBuZXcgaXRlbXMgKGl0ZW1zIHRoYXQgd2VyZW4ndCByZW5kZXJlZCBhdCBhbGwpXG4gICAgICAgIGNvbnN0IHsgdmlzaWJsZVJhbmdlIH0gPSB2aWV3cG9ydFN0YXRlIHx8IHt9O1xuICAgICAgICBpZiAodmlzaWJsZVJhbmdlKSB7XG4gICAgICAgICAgY29uc3QgcmVuZGVyU3RhcnQgPSBNYXRoLm1heCgwLCB2aXNpYmxlUmFuZ2Uuc3RhcnQgLSBvdmVyc2Nhbik7XG4gICAgICAgICAgY29uc3QgcmVuZGVyRW5kID0gTWF0aC5taW4oXG4gICAgICAgICAgICB2aWV3cG9ydFN0YXRlPy50b3RhbEl0ZW1zID8/IDAgLSAxLFxuICAgICAgICAgICAgdmlzaWJsZVJhbmdlLmVuZCArIG92ZXJzY2FuLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgbG9hZGVkU3RhcnQgPSBkYXRhLm9mZnNldDtcbiAgICAgICAgICBjb25zdCBsb2FkZWRFbmQgPSBkYXRhLm9mZnNldCArIGRhdGEuaXRlbXMubGVuZ3RoIC0gMTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIGxvYWRlZCBkYXRhIG92ZXJsYXBzIHdpdGggcmVuZGVyIHJhbmdlIGFuZCB3ZSdyZSBtaXNzaW5nIHJlbmRlcmVkIGVsZW1lbnRzXG4gICAgICAgICAgY29uc3QgbmVlZHNSZW5kZXIgPVxuICAgICAgICAgICAgbG9hZGVkU3RhcnQgPD0gcmVuZGVyRW5kICYmXG4gICAgICAgICAgICBsb2FkZWRFbmQgPj0gcmVuZGVyU3RhcnQgJiZcbiAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2l6ZSA8IHJlbmRlckVuZCAtIHJlbmRlclN0YXJ0ICsgMTtcblxuICAgICAgICAgIGlmIChuZWVkc1JlbmRlcikgcmVuZGVySXRlbXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgZXZlbnRzXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnJhbmdlLWNoYW5nZWRcIiwgcmVuZGVySXRlbXMpO1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpzY3JvbGxcIiwgdXBkYXRlSXRlbVBvc2l0aW9ucyk7XG5cbiAgICAgIC8vIFVwZGF0ZSBpdGVtcyBjb250YWluZXIgaGVpZ2h0IHdoZW4gdmlydHVhbCBzaXplIGNoYW5nZXNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6dmlydHVhbC1zaXplLWNoYW5nZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdmlld3BvcnRTdGF0ZT8uaXRlbXNDb250YWluZXIgJiZcbiAgICAgICAgICBkYXRhLnRvdGFsVmlydHVhbFNpemUgIT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLml0ZW1zQ29udGFpbmVyLnN0eWxlLmhlaWdodCA9IGAke2RhdGEudG90YWxWaXJ0dWFsU2l6ZX1weGA7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVtcGxhdGUgaGVscGVyc1xuICAgIGNvbnN0IGdldERlZmF1bHRUZW1wbGF0ZSA9ICgpID0+IChpdGVtOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIC8vIFVzZSBsYXlvdXQgc3lzdGVtIGZvciBkZWZhdWx0IHRlbXBsYXRlXG4gICAgICByZXR1cm4gW1xuICAgICAgICB7XG4gICAgICAgICAgdGFnOiBcImRpdlwiLFxuICAgICAgICAgIGNsYXNzOiBcInZpZXdwb3J0LWl0ZW1cIixcbiAgICAgICAgICB0ZXh0OlxuICAgICAgICAgICAgdHlwZW9mIGl0ZW0gPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgPyBpdGVtLm5hbWUgfHwgaXRlbS5sYWJlbCB8fCBpdGVtLnRleHQgfHwgYEl0ZW0gJHtpbmRleH1gXG4gICAgICAgICAgICAgIDogU3RyaW5nKGl0ZW0pLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9O1xuXG4gICAgLy8gUHJvY2VzcyBsYXlvdXQgc2NoZW1hIHdpdGggaXRlbSBkYXRhIHN1YnN0aXR1dGlvblxuICAgIGNvbnN0IHByb2Nlc3NMYXlvdXRTY2hlbWEgPSAoXG4gICAgICBzY2hlbWE6IGFueSxcbiAgICAgIGl0ZW06IGFueSxcbiAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgKTogYW55ID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygc2NoZW1hID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIC8vIEhhbmRsZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24gbGlrZSB7e25hbWV9fSwge3tpbmRleH19XG4gICAgICAgIHJldHVybiBzY2hlbWEucmVwbGFjZSgvXFx7XFx7KFtefV0rKVxcfVxcfS9nLCAobWF0Y2gsIGtleSkgPT4ge1xuICAgICAgICAgIGlmIChrZXkgPT09IFwiaW5kZXhcIikgcmV0dXJuIFN0cmluZyhpbmRleCk7XG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJpdGVtXCIpIHJldHVybiBTdHJpbmcoaXRlbSk7XG5cbiAgICAgICAgICAvLyBIYW5kbGUgbmVzdGVkIHByb3BlcnRpZXMgbGlrZSB7e3VzZXIubmFtZX19XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBrZXkuc3BsaXQoXCIuXCIpLnJlZHVjZSgob2JqOiBhbnksIHByb3A6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG9iaj8uW3Byb3AudHJpbSgpXTtcbiAgICAgICAgICB9LCBpdGVtKTtcblxuICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKHZhbHVlKSA6IG1hdGNoO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hKSkge1xuICAgICAgICByZXR1cm4gc2NoZW1hLm1hcCgoY2hpbGQpID0+IHByb2Nlc3NMYXlvdXRTY2hlbWEoY2hpbGQsIGl0ZW0sIGluZGV4KSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc2NoZW1hID09PSBcIm9iamVjdFwiICYmIHNjaGVtYSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBwcm9jZXNzZWQ6IGFueSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzY2hlbWEpKSB7XG4gICAgICAgICAgcHJvY2Vzc2VkW2tleV0gPSBwcm9jZXNzTGF5b3V0U2NoZW1hKHZhbHVlLCBpdGVtLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb2Nlc3NlZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNjaGVtYTtcbiAgICB9O1xuXG4gICAgLy8gUG9zaXRpb24gY2FsY3VsYXRpb25cbiAgICBjb25zdCBjYWxjdWxhdGVJdGVtUG9zaXRpb24gPSAoXG4gICAgICBpbmRleDogbnVtYmVyLFxuICAgICAgc2Nyb2xsUG9zaXRpb246IG51bWJlcixcbiAgICAgIHRvdGFsSXRlbXM6IG51bWJlcixcbiAgICAgIGl0ZW1TaXplOiBudW1iZXIsXG4gICAgICB2aXJ0dWFsVG90YWxTaXplOiBudW1iZXIsXG4gICAgICBjb250YWluZXJTaXplOiBudW1iZXIsXG4gICAgICB0YXJnZXRTY3JvbGxJbmRleD86IG51bWJlcixcbiAgICApOiBudW1iZXIgPT4ge1xuICAgICAgY29uc3QgYWN0dWFsVG90YWxTaXplID0gdG90YWxJdGVtcyAqIGl0ZW1TaXplO1xuICAgICAgY29uc3QgaXNDb21wcmVzc2VkID1cbiAgICAgICAgYWN0dWFsVG90YWxTaXplID4gdmlydHVhbFRvdGFsU2l6ZSAmJiB2aXJ0dWFsVG90YWxTaXplID4gMDtcblxuICAgICAgLy8gSWYgd2UgaGF2ZSBhIHRhcmdldFNjcm9sbEluZGV4IChmcm9tIGluaXRpYWxTY3JvbGxJbmRleCksIHVzZSBpdCBkaXJlY3RseVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIGl0ZW1zIGFyZSBwb3NpdGlvbmVkIGNvcnJlY3RseSBldmVuIHdpdGggY29tcHJlc3Npb25cbiAgICAgIGlmICh0YXJnZXRTY3JvbGxJbmRleCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldFNjcm9sbEluZGV4ID4gMCkge1xuICAgICAgICAvLyBQb3NpdGlvbiBpdGVtcyByZWxhdGl2ZSB0byB0aGUgdGFyZ2V0IGluZGV4XG4gICAgICAgIC8vIFRoZSB0YXJnZXQgaW5kZXggc2hvdWxkIGFwcGVhciBhdCB0aGUgdG9wIG9mIHRoZSB2aWV3cG9ydFxuICAgICAgICByZXR1cm4gKGluZGV4IC0gdGFyZ2V0U2Nyb2xsSW5kZXgpICogaXRlbVNpemU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNDb21wcmVzc2VkIHx8IHRvdGFsSXRlbXMgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGluZGV4ICogaXRlbVNpemUgLSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgIH1cblxuICAgICAgLy8gQ29tcHJlc3NlZCBzcGFjZSBoYW5kbGluZ1xuICAgICAgY29uc3QgbWF4U2Nyb2xsUG9zaXRpb24gPSB2aXJ0dWFsVG90YWxTaXplIC0gY29udGFpbmVyU2l6ZTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlRnJvbUJvdHRvbSA9IG1heFNjcm9sbFBvc2l0aW9uIC0gc2Nyb2xsUG9zaXRpb247XG4gICAgICBjb25zdCBuZWFyQm90dG9tVGhyZXNob2xkID0gY29udGFpbmVyU2l6ZTtcblxuICAgICAgaWYgKFxuICAgICAgICBkaXN0YW5jZUZyb21Cb3R0b20gPD0gbmVhckJvdHRvbVRocmVzaG9sZCAmJlxuICAgICAgICBkaXN0YW5jZUZyb21Cb3R0b20gPj0gLTFcbiAgICAgICkge1xuICAgICAgICAvLyBOZWFyIGJvdHRvbSBpbnRlcnBvbGF0aW9uXG4gICAgICAgIGNvbnN0IGl0ZW1zQXRCb3R0b20gPSBNYXRoLmZsb29yKGNvbnRhaW5lclNpemUgLyBpdGVtU2l6ZSk7XG4gICAgICAgIGNvbnN0IGZpcnN0VmlzaWJsZUF0Qm90dG9tID0gTWF0aC5tYXgoMCwgdG90YWxJdGVtcyAtIGl0ZW1zQXRCb3R0b20pO1xuICAgICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IHNjcm9sbFBvc2l0aW9uIC8gdmlydHVhbFRvdGFsU2l6ZTtcbiAgICAgICAgY29uc3QgZXhhY3RTY3JvbGxJbmRleCA9IHNjcm9sbFJhdGlvICogdG90YWxJdGVtcztcbiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGlvbiA9IE1hdGgubWF4KFxuICAgICAgICAgIDAsXG4gICAgICAgICAgTWF0aC5taW4oMSwgMSAtIGRpc3RhbmNlRnJvbUJvdHRvbSAvIG5lYXJCb3R0b21UaHJlc2hvbGQpLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGJvdHRvbVBvc2l0aW9uID0gKGluZGV4IC0gZmlyc3RWaXNpYmxlQXRCb3R0b20pICogaXRlbVNpemU7XG4gICAgICAgIGNvbnN0IG5vcm1hbFBvc2l0aW9uID0gKGluZGV4IC0gZXhhY3RTY3JvbGxJbmRleCkgKiBpdGVtU2l6ZTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBub3JtYWxQb3NpdGlvbiArIChib3R0b21Qb3NpdGlvbiAtIG5vcm1hbFBvc2l0aW9uKSAqIGludGVycG9sYXRpb25cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gTm9ybWFsIGNvbXByZXNzZWQgc2Nyb2xsaW5nXG4gICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IHNjcm9sbFBvc2l0aW9uIC8gdmlydHVhbFRvdGFsU2l6ZTtcbiAgICAgIHJldHVybiAoaW5kZXggLSBzY3JvbGxSYXRpbyAqIHRvdGFsSXRlbXMpICogaXRlbVNpemU7XG4gICAgfTtcblxuICAgIC8vIFJlbmRlciBzaW5nbGUgaXRlbVxuICAgIGNvbnN0IHJlbmRlckl0ZW0gPSAoaXRlbTogYW55LCBpbmRleDogbnVtYmVyKTogSFRNTEVsZW1lbnQgfCBudWxsID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1UZW1wbGF0ZSA9IHRlbXBsYXRlIHx8IGdldERlZmF1bHRUZW1wbGF0ZSgpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBpdGVtVGVtcGxhdGUoaXRlbSwgaW5kZXgpO1xuICAgICAgICBsZXQgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgcmVzdWx0IGlzIGEgbGF5b3V0IHNjaGVtYSAoYXJyYXkgb3Igb2JqZWN0KVxuICAgICAgICBpZiAoXG4gICAgICAgICAgQXJyYXkuaXNBcnJheShyZXN1bHQpIHx8XG4gICAgICAgICAgKHR5cGVvZiByZXN1bHQgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIHJlc3VsdCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgIShyZXN1bHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIFByb2Nlc3Mgc2NoZW1hIHRvIHN1YnN0aXR1dGUgdmFyaWFibGVzXG4gICAgICAgICAgY29uc3QgcHJvY2Vzc2VkU2NoZW1hID0gcHJvY2Vzc0xheW91dFNjaGVtYShyZXN1bHQsIGl0ZW0sIGluZGV4KTtcblxuICAgICAgICAgIC8vIFVzZSBsYXlvdXQgc3lzdGVtIHRvIGNyZWF0ZSBlbGVtZW50XG4gICAgICAgICAgY29uc3QgbGF5b3V0UmVzdWx0ID0gY3JlYXRlTGF5b3V0KHByb2Nlc3NlZFNjaGVtYSk7XG4gICAgICAgICAgZWxlbWVudCA9IGxheW91dFJlc3VsdC5lbGVtZW50O1xuXG4gICAgICAgICAgLy8gSWYgdGhlIGxheW91dCBjcmVhdGVkIGEgd3JhcHBlciwgdXNlIGl0IGRpcmVjdGx5XG4gICAgICAgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgLy8gRWxlbWVudCBpcyBhbHJlYWR5IGNyZWF0ZWQgYnkgbGF5b3V0IHN5c3RlbVxuICAgICAgICAgICAgLy8gU3RvcmUgbGF5b3V0UmVzdWx0IGZvciBjbGVhbnVwIHdoZW4gZWxlbWVudCBpcyByZWxlYXNlZCAocHJldmVudHMgbWVtb3J5IGxlYWspXG4gICAgICAgICAgICBsYXlvdXRSZXN1bHRzLnNldChlbGVtZW50LCBsYXlvdXRSZXN1bHQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGYWxsYmFjayBpZiBsYXlvdXQgZGlkbid0IGNyZWF0ZSBhIHByb3BlciBlbGVtZW50XG4gICAgICAgICAgICBlbGVtZW50ID0gZ2V0UG9vbGVkRWxlbWVudCgpO1xuICAgICAgICAgICAgaWYgKGxheW91dFJlc3VsdC5lbGVtZW50KSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQobGF5b3V0UmVzdWx0LmVsZW1lbnQpO1xuICAgICAgICAgICAgICAvLyBTdG9yZSBsYXlvdXRSZXN1bHQgb24gd3JhcHBlciBlbGVtZW50IGZvciBjbGVhbnVwXG4gICAgICAgICAgICAgIGxheW91dFJlc3VsdHMuc2V0KGVsZW1lbnQsIGxheW91dFJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAvLyBQYXJzZSBIVE1MIHVzaW5nIHRlbXBsYXRlIGVsZW1lbnQgLSBvcHRpbWl6ZWQgcGF0aFxuICAgICAgICAgIC8vIE1vdmUgbm9kZXMgZGlyZWN0bHkgaW5zdGVhZCBvZiBjbG9uaW5nIC0gbXVjaCBmYXN0ZXIsIG5vIG1lbW9yeSBvdmVyaGVhZFxuICAgICAgICAgIHRlbXBsYXRlUGFyc2VyLmlubmVySFRNTCA9IHJlc3VsdDtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gdGVtcGxhdGVQYXJzZXIuY29udGVudDtcblxuICAgICAgICAgIGlmIChjb250ZW50LmNoaWxkcmVuLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgLy8gU2luZ2xlIHJvb3QgZWxlbWVudCAtIG1vdmUgZGlyZWN0bHkgKGZhc3RlciB0aGFuIGNsb25lTm9kZSlcbiAgICAgICAgICAgIGVsZW1lbnQgPSBjb250ZW50LmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgY29udGVudC5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgICAgICAgICAgIGFkZENsYXNzKGVsZW1lbnQsIFwibXRybC12aWV3cG9ydC1pdGVtXCIpO1xuICAgICAgICAgICAgaWYgKGlzUGxhY2Vob2xkZXIoaXRlbSkpIHtcbiAgICAgICAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLkNMQVNTKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTXVsdGlwbGUgY2hpbGRyZW4gLSBtb3ZlIGFsbCBpbnRvIHBvb2xlZCBlbGVtZW50XG4gICAgICAgICAgICBlbGVtZW50ID0gZ2V0UG9vbGVkRWxlbWVudCgpO1xuICAgICAgICAgICAgd2hpbGUgKGNvbnRlbnQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNvbnRlbnQuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgZWxlbWVudCA9IGdldFBvb2xlZEVsZW1lbnQoKTtcbiAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbUmVuZGVyaW5nXSBJbnZhbGlkIHRlbXBsYXRlIHJlc3VsdCBmb3IgaXRlbSAke2luZGV4fWApO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIGNsYXNzZXNcbiAgICAgICAgaWYgKCFoYXNDbGFzcyhlbGVtZW50LCBcInZpZXdwb3J0LWl0ZW1cIikpXG4gICAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtXCIpO1xuICAgICAgICBpZiAoaXNQbGFjZWhvbGRlcihpdGVtKSkge1xuICAgICAgICAgIGFkZENsYXNzKGVsZW1lbnQsIFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5DTEFTUyk7XG4gICAgICAgIH1cblxuICAgICAgICBlbGVtZW50LmRhdGFzZXQuaW5kZXggPSBTdHJpbmcoaW5kZXgpO1xuXG4gICAgICAgIC8vIENvcHkgZGF0YS1pZCBmcm9tIGl0ZW0gdG8gdmlld3BvcnQgZWxlbWVudCBmb3Igc2VsZWN0aW9uIHN1cHBvcnRcbiAgICAgICAgY29uc3QgaXRlbUlkID0gaXRlbT8uX2lkIHx8IGl0ZW0/LmlkO1xuICAgICAgICBpZiAoaXRlbUlkICE9PSB1bmRlZmluZWQgJiYgaXRlbUlkICE9PSBudWxsKSB7XG4gICAgICAgICAgZWxlbWVudC5kYXRhc2V0LmlkID0gU3RyaW5nKGl0ZW1JZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBbUmVuZGVyaW5nXSBFcnJvciByZW5kZXJpbmcgaXRlbSAke2luZGV4fTpgLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBVcGRhdGUgcG9zaXRpb25zXG4gICAgY29uc3QgdXBkYXRlSXRlbVBvc2l0aW9ucyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSB8fCByZW5kZXJlZEVsZW1lbnRzLnNpemUgPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3Qge1xuICAgICAgICBzY3JvbGxQb3NpdGlvbixcbiAgICAgICAgaXRlbVNpemU6IGl0ZW1TaXplLFxuICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICB2aXJ0dWFsVG90YWxTaXplLFxuICAgICAgICBjb250YWluZXJTaXplLFxuICAgICAgfSA9IHZpZXdwb3J0U3RhdGU7XG4gICAgICBjb25zdCBhY3R1YWxUb3RhbFNpemUgPSB0b3RhbEl0ZW1zICogaXRlbVNpemU7XG4gICAgICBjb25zdCBpc0NvbXByZXNzZWQgPVxuICAgICAgICBhY3R1YWxUb3RhbFNpemUgPiB2aXJ0dWFsVG90YWxTaXplICYmIHZpcnR1YWxUb3RhbFNpemUgPiAwO1xuXG4gICAgICBjb25zdCBzb3J0ZWRJbmRpY2VzID0gQXJyYXkuZnJvbShyZW5kZXJlZEVsZW1lbnRzLmtleXMoKSkuc29ydChcbiAgICAgICAgKGEsIGIpID0+IGEgLSBiLFxuICAgICAgKTtcbiAgICAgIGlmICghc29ydGVkSW5kaWNlcy5sZW5ndGgpIHJldHVybjtcblxuICAgICAgY29uc3QgZmlyc3RJbmRleCA9IHNvcnRlZEluZGljZXNbMF07XG4gICAgICBsZXQgY3VycmVudFBvc2l0aW9uID0gMDtcblxuICAgICAgaWYgKGlzQ29tcHJlc3NlZCkge1xuICAgICAgICBjb25zdCBtYXhTY3JvbGwgPSB2aXJ0dWFsVG90YWxTaXplIC0gY29udGFpbmVyU2l6ZTtcbiAgICAgICAgY29uc3QgZGlzdGFuY2VGcm9tQm90dG9tID0gbWF4U2Nyb2xsIC0gc2Nyb2xsUG9zaXRpb247XG5cbiAgICAgICAgaWYgKGRpc3RhbmNlRnJvbUJvdHRvbSA8PSBjb250YWluZXJTaXplICYmIGRpc3RhbmNlRnJvbUJvdHRvbSA+PSAtMSkge1xuICAgICAgICAgIC8vIE5lYXIgYm90dG9tIGludGVycG9sYXRpb25cbiAgICAgICAgICBjb25zdCBpdGVtc0F0Qm90dG9tID0gTWF0aC5mbG9vcihjb250YWluZXJTaXplIC8gaXRlbVNpemUpO1xuICAgICAgICAgIGNvbnN0IGZpcnN0VmlzaWJsZUF0Qm90dG9tID0gTWF0aC5tYXgoMCwgdG90YWxJdGVtcyAtIGl0ZW1zQXRCb3R0b20pO1xuICAgICAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsVG90YWxTaXplO1xuICAgICAgICAgIGNvbnN0IGV4YWN0U2Nyb2xsSW5kZXggPSBzY3JvbGxSYXRpbyAqIHRvdGFsSXRlbXM7XG4gICAgICAgICAgY29uc3QgaW50ZXJwb2xhdGlvbiA9IE1hdGgubWF4KFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIE1hdGgubWluKDEsIDEgLSBkaXN0YW5jZUZyb21Cb3R0b20gLyBjb250YWluZXJTaXplKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY29uc3QgYm90dG9tUG9zID0gKGZpcnN0SW5kZXggLSBmaXJzdFZpc2libGVBdEJvdHRvbSkgKiBpdGVtU2l6ZTtcbiAgICAgICAgICBjb25zdCBub3JtYWxQb3MgPSAoZmlyc3RJbmRleCAtIGV4YWN0U2Nyb2xsSW5kZXgpICogaXRlbVNpemU7XG4gICAgICAgICAgY3VycmVudFBvc2l0aW9uID0gbm9ybWFsUG9zICsgKGJvdHRvbVBvcyAtIG5vcm1hbFBvcykgKiBpbnRlcnBvbGF0aW9uO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsVG90YWxTaXplO1xuICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbiA9IChmaXJzdEluZGV4IC0gc2Nyb2xsUmF0aW8gKiB0b3RhbEl0ZW1zKSAqIGl0ZW1TaXplO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50UG9zaXRpb24gPSBmaXJzdEluZGV4ICogaXRlbVNpemUgLSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgIH1cblxuICAgICAgLy8gUG9zaXRpb24gZWFjaCBpdGVtXG4gICAgICBzb3J0ZWRJbmRpY2VzLmZvckVhY2goKGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSByZW5kZXJlZEVsZW1lbnRzLmdldChpbmRleCk7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgke01hdGgucm91bmQoXG4gICAgICAgICAgICBjdXJyZW50UG9zaXRpb24sXG4gICAgICAgICAgKX1weClgO1xuXG4gICAgICAgICAgLy8gU3RyYXRlZ2ljIGxvZyBmb3IgbGFzdCBpdGVtc1xuICAgICAgICAgIC8vIGlmIChpbmRleCA+PSB0b3RhbEl0ZW1zIC0gNSkge1xuICAgICAgICAgIC8vICAgY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICAgIGBbUmVuZGVyaW5nXSBMYXN0IGl0ZW0gcG9zaXRpb25lZDogaW5kZXg9JHtpbmRleH0sIHBvc2l0aW9uPSR7TWF0aC5yb3VuZChcbiAgICAgICAgICAvLyAgICAgICBjdXJyZW50UG9zaXRpb25cbiAgICAgICAgICAvLyAgICAgKX1weCwgaXRlbVNpemU9JHtpdGVtU2l6ZX1weCwgdG90YWxJdGVtcz0ke3RvdGFsSXRlbXN9YFxuICAgICAgICAgIC8vICAgKTtcbiAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICBjdXJyZW50UG9zaXRpb24gKz0gaXRlbVNpemU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBNYWluIHJlbmRlciBmdW5jdGlvblxuICAgIGNvbnN0IHJlbmRlckl0ZW1zID0gKCkgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlPy5pdGVtc0NvbnRhaW5lcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdmlzaWJsZVJhbmdlLFxuICAgICAgICBpdGVtc0NvbnRhaW5lcixcbiAgICAgICAgdG90YWxJdGVtcyxcbiAgICAgICAgaXRlbVNpemUsXG4gICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICBjb250YWluZXJTaXplLFxuICAgICAgICB2aXJ0dWFsVG90YWxTaXplLFxuICAgICAgfSA9IHZpZXdwb3J0U3RhdGU7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHJhbmdlIC0gc2tpcCByZW5kZXJpbmcgaWYgbm8gaXRlbXMgb3IgcmFuZ2UgaXMgaW52YWxpZFxuICAgICAgaWYgKFxuICAgICAgICAhdmlzaWJsZVJhbmdlIHx8XG4gICAgICAgIHRvdGFsSXRlbXMgPD0gMCB8fFxuICAgICAgICB2aXNpYmxlUmFuZ2Uuc3RhcnQgPCAwIHx8XG4gICAgICAgIHZpc2libGVSYW5nZS5zdGFydCA+PSB0b3RhbEl0ZW1zIHx8XG4gICAgICAgIHZpc2libGVSYW5nZS5lbmQgPCB2aXNpYmxlUmFuZ2Uuc3RhcnQgfHxcbiAgICAgICAgaXNOYU4odmlzaWJsZVJhbmdlLnN0YXJ0KSB8fFxuICAgICAgICBpc05hTih2aXNpYmxlUmFuZ2UuZW5kKVxuICAgICAgKSB7XG4gICAgICAgIC8vIElmIHRvdGFsSXRlbXMgaXMgMCwgY2xlYXIgYWxsIHJlbmRlcmVkIGVsZW1lbnRzIHRvIHJlbW92ZSBzdGFsZSBwbGFjZWhvbGRlcnNcbiAgICAgICAgaWYgKHRvdGFsSXRlbXMgPD0gMCAmJiByZW5kZXJlZEVsZW1lbnRzLnNpemUgPiAwKSB7XG4gICAgICAgICAgQXJyYXkuZnJvbShyZW5kZXJlZEVsZW1lbnRzLmVudHJpZXMoKSkuZm9yRWFjaCgoW2luZGV4LCBlbGVtZW50XSkgPT4ge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSkgcmVsZWFzZUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLmRlbGV0ZShpbmRleCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY3VycmVudFZpc2libGVSYW5nZSA9IHsgc3RhcnQ6IC0xLCBlbmQ6IC0xIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiByYW5nZSBjaGFuZ2VkXG4gICAgICBpZiAoXG4gICAgICAgIHZpc2libGVSYW5nZS5zdGFydCA9PT0gY3VycmVudFZpc2libGVSYW5nZS5zdGFydCAmJlxuICAgICAgICB2aXNpYmxlUmFuZ2UuZW5kID09PSBjdXJyZW50VmlzaWJsZVJhbmdlLmVuZCAmJlxuICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNpemUgPiAwXG4gICAgICApIHtcbiAgICAgICAgdXBkYXRlSXRlbVBvc2l0aW9ucygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxhc3RSZW5kZXJUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHJlbmRlclN0YXJ0ID0gTWF0aC5tYXgoMCwgdmlzaWJsZVJhbmdlLnN0YXJ0IC0gb3ZlcnNjYW4pO1xuICAgICAgY29uc3QgcmVuZGVyRW5kID0gTWF0aC5taW4odG90YWxJdGVtcyAtIDEsIHZpc2libGVSYW5nZS5lbmQgKyBvdmVyc2Nhbik7XG5cbiAgICAgIC8vIGlmIChpc1JlbW92aW5nSXRlbSkge1xuICAgICAgLy8gICBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgICBgW1JFTkRFUi1GSVhdIHJlbmRlckl0ZW1zIGNhbGM6IHZpc2libGVSYW5nZT0ke0pTT04uc3RyaW5naWZ5KHZpc2libGVSYW5nZSl9LCBvdmVyc2Nhbj0ke292ZXJzY2FufSwgdG90YWxJdGVtcz0ke3RvdGFsSXRlbXN9YCxcbiAgICAgIC8vICAgKTtcbiAgICAgIC8vICAgY29uc29sZS5sb2coXG4gICAgICAvLyAgICAgYFtSRU5ERVItRklYXSByZW5kZXJJdGVtcyBjYWxjOiByZW5kZXJTdGFydD0ke3JlbmRlclN0YXJ0fSwgcmVuZGVyRW5kPSR7cmVuZGVyRW5kfWAsXG4gICAgICAvLyAgICk7XG4gICAgICAvLyB9XG5cbiAgICAgIC8vIFJlbW92ZSBpdGVtcyBvdXRzaWRlIHJhbmdlXG4gICAgICBBcnJheS5mcm9tKHJlbmRlcmVkRWxlbWVudHMuZW50cmllcygpKVxuICAgICAgICAuZmlsdGVyKChbaW5kZXhdKSA9PiBpbmRleCA8IHJlbmRlclN0YXJ0IHx8IGluZGV4ID4gcmVuZGVyRW5kKVxuICAgICAgICAuZm9yRWFjaCgoW2luZGV4LCBlbGVtZW50XSkgPT4ge1xuICAgICAgICAgIGlmIChlbGVtZW50LnBhcmVudE5vZGUpIHJlbGVhc2VFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuZGVsZXRlKGluZGV4KTtcbiAgICAgICAgfSk7XG5cbiAgICAgIC8vIEdldCBpdGVtcyBmcm9tIGNvbGxlY3Rpb24gKHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGgpXG4gICAgICBjb25zdCBpdGVtcyA9IGdldENvbGxlY3Rpb25JdGVtcygpO1xuICAgICAgY29uc3QgbWlzc2luZ0l0ZW1zOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgICAvLyBDb2xsZWN0IG5ldyBlbGVtZW50cyB0byBpbnNlcnQgKGluZGV4IC0+IGVsZW1lbnQpXG4gICAgICBjb25zdCBuZXdFbGVtZW50czogQXJyYXk8W251bWJlciwgSFRNTEVsZW1lbnRdPiA9IFtdO1xuXG4gICAgICAvLyBSZW5kZXIgaXRlbXMgaW4gcmFuZ2VcbiAgICAgIGZvciAobGV0IGkgPSByZW5kZXJTdGFydDsgaSA8PSByZW5kZXJFbmQ7IGkrKykge1xuICAgICAgICBpZiAoaSA8IDAgfHwgaSA+PSB0b3RhbEl0ZW1zIHx8IHJlbmRlcmVkRWxlbWVudHMuaGFzKGkpKSBjb250aW51ZTtcblxuICAgICAgICBsZXQgaXRlbSA9IGl0ZW1zW2ldO1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICBtaXNzaW5nSXRlbXMucHVzaChpKTtcbiAgICAgICAgICAvLyBHZW5lcmF0ZSBwbGFjZWhvbGRlciAocmVuZGVyZWQgZHluYW1pY2FsbHksIG5vdCBzdG9yZWQpXG4gICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJzID0gKGNvbXBvbmVudCBhcyBhbnkpLnBsYWNlaG9sZGVycztcbiAgICAgICAgICBpdGVtID0gcGxhY2Vob2xkZXJzPy5nZW5lcmF0ZVBsYWNlaG9sZGVySXRlbShpKSB8fCB7XG4gICAgICAgICAgICBfcGxhY2Vob2xkZXI6IHRydWUsXG4gICAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICAgIGlkOiBgcGxhY2Vob2xkZXItJHtpfWAsXG4gICAgICAgICAgICBuYW1lOiBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuTUFTS19DSEFSQUNURVIucmVwZWF0KDE1KSxcbiAgICAgICAgICAgIHRleHQ6IFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVNLX0NIQVJBQ1RFUi5yZXBlYXQoMjUpLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVNLX0NIQVJBQ1RFUi5yZXBlYXQoNDApLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVuZGVySXRlbShpdGVtLCBpKTtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAvLyBHZXQgdGFyZ2V0U2Nyb2xsSW5kZXggZnJvbSB2aWV3cG9ydFN0YXRlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIGNvbnN0IHRhcmdldFNjcm9sbEluZGV4ID0gKHZpZXdwb3J0U3RhdGUgYXMgYW55KT8udGFyZ2V0U2Nyb2xsSW5kZXg7XG4gICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBjYWxjdWxhdGVJdGVtUG9zaXRpb24oXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICAgICAgaXRlbVNpemUsXG4gICAgICAgICAgICB2aXJ0dWFsVG90YWxTaXplLFxuICAgICAgICAgICAgY29udGFpbmVyU2l6ZSxcbiAgICAgICAgICAgIHRhcmdldFNjcm9sbEluZGV4LFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGVZKCR7cG9zaXRpb259cHgpYCxcbiAgICAgICAgICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIENvbGxlY3QgZm9yIGJhdGNoIGluc2VydGlvbiAoaWYgbWFpbnRhaW5pbmcgb3JkZXIpIG9yIGp1c3QgYXBwZW5kXG4gICAgICAgICAgaWYgKG1haW50YWluRG9tT3JkZXIpIHtcbiAgICAgICAgICAgIG5ld0VsZW1lbnRzLnB1c2goW2ksIGVsZW1lbnRdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaXRlbXNDb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2V0KGksIGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEJhdGNoIGluc2VydCBuZXcgZWxlbWVudHMgaW4gY29ycmVjdCBET00gb3JkZXIgKG9ubHkgd2hlbiBtYWludGFpbkRvbU9yZGVyIGlzIGVuYWJsZWQpXG4gICAgICAvLyBUaGlzIGVuc3VyZXMgQ1NTIHNlbGVjdG9ycyBsaWtlIDpmaXJzdC1jaGlsZCwgOm50aC1jaGlsZCgpIHdvcmsgY29ycmVjdGx5XG4gICAgICBpZiAobWFpbnRhaW5Eb21PcmRlciAmJiBuZXdFbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIFNvcnQgbmV3IGVsZW1lbnRzIGJ5IGluZGV4XG4gICAgICAgIG5ld0VsZW1lbnRzLnNvcnQoKFthXSwgW2JdKSA9PiBhIC0gYik7XG5cbiAgICAgICAgLy8gR2V0IGV4aXN0aW5nIERPTSBjaGlsZHJlbiBzb3J0ZWQgYnkgdGhlaXIgZGF0YS1pbmRleFxuICAgICAgICBjb25zdCBleGlzdGluZ0NoaWxkcmVuID0gQXJyYXkuZnJvbShcbiAgICAgICAgICBpdGVtc0NvbnRhaW5lci5jaGlsZHJlbixcbiAgICAgICAgKSBhcyBIVE1MRWxlbWVudFtdO1xuXG4gICAgICAgIC8vIE1lcmdlIG5ldyBlbGVtZW50cyBpbnRvIGNvcnJlY3QgcG9zaXRpb25zXG4gICAgICAgIGxldCBuZXdJZHggPSAwO1xuICAgICAgICBsZXQgZXhpc3RpbmdJZHggPSAwO1xuXG4gICAgICAgIHdoaWxlIChuZXdJZHggPCBuZXdFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBbbmV3SW5kZXgsIG5ld0VsZW1lbnRdID0gbmV3RWxlbWVudHNbbmV3SWR4XTtcblxuICAgICAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IGV4aXN0aW5nIGNoaWxkIHdpdGggaW5kZXggPiBuZXdJbmRleFxuICAgICAgICAgIHdoaWxlIChcbiAgICAgICAgICAgIGV4aXN0aW5nSWR4IDwgZXhpc3RpbmdDaGlsZHJlbi5sZW5ndGggJiZcbiAgICAgICAgICAgIHBhcnNlSW50KGV4aXN0aW5nQ2hpbGRyZW5bZXhpc3RpbmdJZHhdLmRhdGFzZXQuaW5kZXggfHwgXCItMVwiLCAxMCkgPFxuICAgICAgICAgICAgICBuZXdJbmRleFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZXhpc3RpbmdJZHgrKztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZXhpc3RpbmdJZHggPCBleGlzdGluZ0NoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gSW5zZXJ0IGJlZm9yZSB0aGUgZXhpc3RpbmcgY2hpbGRcbiAgICAgICAgICAgIGl0ZW1zQ29udGFpbmVyLmluc2VydEJlZm9yZShcbiAgICAgICAgICAgICAgbmV3RWxlbWVudCxcbiAgICAgICAgICAgICAgZXhpc3RpbmdDaGlsZHJlbltleGlzdGluZ0lkeF0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBcHBlbmQgYXQgdGhlIGVuZFxuICAgICAgICAgICAgaXRlbXNDb250YWluZXIuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5ld0lkeCsrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlcXVlc3QgbWlzc2luZyBpdGVtc1xuICAgICAgaWYgKFxuICAgICAgICBtaXNzaW5nSXRlbXMubGVuZ3RoID4gMCAmJlxuICAgICAgICBjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24/LmxvYWRNaXNzaW5nUmFuZ2VzXG4gICAgICApIHtcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24ubG9hZE1pc3NpbmdSYW5nZXMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3RhcnQ6IE1hdGgubWluKC4uLm1pc3NpbmdJdGVtcyksXG4gICAgICAgICAgICBlbmQ6IE1hdGgubWF4KC4uLm1pc3NpbmdJdGVtcyksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlbmRlcmluZzptaXNzaW5nLWl0ZW1zXCIsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRWaXNpYmxlUmFuZ2UgPSB2aXNpYmxlUmFuZ2U7XG5cbiAgICAgIC8vIEVtaXQgaXRlbXMgcmVuZGVyZWQgZXZlbnQgd2l0aCBlbGVtZW50cyBmb3Igc2l6ZSBjYWxjdWxhdGlvblxuICAgICAgY29uc3QgcmVuZGVyZWRFbGVtZW50c0FycmF5ID0gQXJyYXkuZnJvbShyZW5kZXJlZEVsZW1lbnRzLnZhbHVlcygpKTtcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDppdGVtcy1yZW5kZXJlZFwiLCB7XG4gICAgICAgIGVsZW1lbnRzOiByZW5kZXJlZEVsZW1lbnRzQXJyYXksXG4gICAgICAgIHJhbmdlOiB2aXNpYmxlUmFuZ2UsXG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnJlbmRlcmVkXCIsIHtcbiAgICAgICAgcmFuZ2U6IHZpc2libGVSYW5nZSxcbiAgICAgICAgcmVuZGVyZWRDb3VudDogcmVuZGVyZWRFbGVtZW50cy5zaXplLFxuICAgICAgfSk7XG4gICAgICB1cGRhdGVJdGVtUG9zaXRpb25zKCk7XG5cbiAgICAgIC8vIExvYWQgZGF0YSBpZiBubyBpdGVtcyByZW5kZXJlZFxuICAgICAgaWYgKFxuICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNpemUgPT09IDAgJiZcbiAgICAgICAgdG90YWxJdGVtcyA+IDAgJiZcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uXG4gICAgICApIHtcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24ubG9hZE1pc3NpbmdSYW5nZXMoXG4gICAgICAgICAgdmlzaWJsZVJhbmdlLFxuICAgICAgICAgIFwicmVuZGVyaW5nOm5vLWl0ZW1zXCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEV4dGVuZCB2aWV3cG9ydCBBUElcbiAgICBjb25zdCBvcmlnaW5hbFJlbmRlckl0ZW1zID0gY29tcG9uZW50LnZpZXdwb3J0LnJlbmRlckl0ZW1zO1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcyA9ICgpID0+IHtcbiAgICAgIHJlbmRlckl0ZW1zKCk7XG4gICAgICBvcmlnaW5hbFJlbmRlckl0ZW1zPy4oKTtcbiAgICB9O1xuXG4gICAgLy8gQ2xlYW51cFxuICAgIHdyYXBEZXN0cm95KGNvbXBvbmVudCwgKCkgPT4ge1xuICAgICAgLy8gUmVsZWFzZSBhbGwgcmVuZGVyZWQgZWxlbWVudHMgLSB1c2UgcmVsZWFzZUVsZW1lbnQgdG8gcHJvcGVybHkgZGVzdHJveSBsYXlvdXRSZXN1bHRzXG4gICAgICByZW5kZXJlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgcmVsZWFzZUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICB9KTtcbiAgICAgIHJlbmRlcmVkRWxlbWVudHMuY2xlYXIoKTtcblxuICAgICAgLy8gQ2xlYXIgZWxlbWVudCBwb29sXG4gICAgICBlbGVtZW50UG9vbC5sZW5ndGggPSAwO1xuXG4gICAgICAvLyBSZXNldCBzdGF0ZVxuICAgICAgY3VycmVudFZpc2libGVSYW5nZSA9IHsgc3RhcnQ6IC0xLCBlbmQ6IC0xIH07XG4gICAgICB2aWV3cG9ydFN0YXRlID0gbnVsbDtcbiAgICAgIGxhc3RSZW5kZXJUaW1lID0gMDtcblxuICAgICAgLy8gUmVzZXQgcG9vbCBzdGF0c1xuICAgICAgcG9vbFN0YXRzLmNyZWF0ZWQgPSAwO1xuICAgICAgcG9vbFN0YXRzLnJlY3ljbGVkID0gMDtcbiAgICAgIHBvb2xTdGF0cy5wb29sU2l6ZSA9IDA7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9O1xufTtcbiIsCiAgICAiLy8gc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvZXZlbnRzLnRzXG5cbi8qKlxuICogRXZlbnRzIEZlYXR1cmUgLSBDZW50cmFsaXplZCBldmVudCBzeXN0ZW0gZm9yIHZpZXdwb3J0XG4gKiBQcm92aWRlcyBldmVudCBlbWlzc2lvbiBhbmQgc3Vic2NyaXB0aW9uIGZvciBpbnRlci1mZWF0dXJlIGNvbW11bmljYXRpb25cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBFdmVudHNDb25maWcge1xuICBkZWJ1Zz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRXZlbnRzIGZlYXR1cmUgZm9yIHZpZXdwb3J0XG4gKiBDZW50cmFsaXplcyBhbGwgZXZlbnQgaGFuZGxpbmcgZm9yIHZpZXdwb3J0IGZlYXR1cmVzXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoRXZlbnRzID0gKGNvbmZpZzogRXZlbnRzQ29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KGNvbXBvbmVudDogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHsgZGVidWcgPSBmYWxzZSB9ID0gY29uZmlnO1xuXG4gICAgLy8gRXZlbnQgbGlzdGVuZXJzIG1hcFxuICAgIGNvbnN0IGxpc3RlbmVycyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8RnVuY3Rpb24+PigpO1xuXG4gICAgLy8gRW1pdCBhbiBldmVudFxuICAgIGNvbnN0IGVtaXQgPSAoZXZlbnQ6IHN0cmluZywgZGF0YT86IGFueSkgPT4ge1xuICAgICAgLy8gaWYgKGRlYnVnKSB7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKGBbRXZlbnRzXSBFbWl0OiAke2V2ZW50fWAsIGRhdGEpO1xuICAgICAgLy8gfVxuXG4gICAgICBjb25zdCBldmVudExpc3RlbmVycyA9IGxpc3RlbmVycy5nZXQoZXZlbnQpO1xuICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzKSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxpc3RlbmVyKGRhdGEpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBbRXZlbnRzXSBFcnJvciBpbiBsaXN0ZW5lciBmb3IgJHtldmVudH06YCwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFN1YnNjcmliZSB0byBhbiBldmVudFxuICAgIGNvbnN0IG9uID0gKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKTogKCgpID0+IHZvaWQpID0+IHtcbiAgICAgIGlmICghbGlzdGVuZXJzLmhhcyhldmVudCkpIHtcbiAgICAgICAgbGlzdGVuZXJzLnNldChldmVudCwgbmV3IFNldCgpKTtcbiAgICAgIH1cblxuICAgICAgbGlzdGVuZXJzLmdldChldmVudCkhLmFkZChoYW5kbGVyKTtcblxuICAgICAgLy8gaWYgKGRlYnVnKSB7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKGBbRXZlbnRzXSBTdWJzY3JpYmVkIHRvOiAke2V2ZW50fWApO1xuICAgICAgLy8gfVxuXG4gICAgICAvLyBSZXR1cm4gdW5zdWJzY3JpYmUgZnVuY3Rpb25cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzID0gbGlzdGVuZXJzLmdldChldmVudCk7XG4gICAgICAgIGlmIChldmVudExpc3RlbmVycykge1xuICAgICAgICAgIGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgICBpZiAoZXZlbnRMaXN0ZW5lcnMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG5cbiAgICAvLyBTdWJzY3JpYmUgdG8gYW4gZXZlbnQgb25jZVxuICAgIGNvbnN0IG9uY2UgPSAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb24pOiAoKCkgPT4gdm9pZCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlZEhhbmRsZXIgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGhhbmRsZXIoZGF0YSk7XG4gICAgICAgIG9mZihldmVudCwgd3JhcHBlZEhhbmRsZXIpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBvbihldmVudCwgd3JhcHBlZEhhbmRsZXIpO1xuICAgIH07XG5cbiAgICAvLyBVbnN1YnNjcmliZSBmcm9tIGFuIGV2ZW50XG4gICAgY29uc3Qgb2ZmID0gKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICBjb25zdCBldmVudExpc3RlbmVycyA9IGxpc3RlbmVycy5nZXQoZXZlbnQpO1xuICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzKSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzLnNpemUgPT09IDApIHtcbiAgICAgICAgICBsaXN0ZW5lcnMuZGVsZXRlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBDbGVhciBhbGwgbGlzdGVuZXJzIGZvciBhbiBldmVudFxuICAgIGNvbnN0IGNsZWFyID0gKGV2ZW50Pzogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShldmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaXN0ZW5lcnMuY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQWRkIGV2ZW50IG1ldGhvZHMgdG8gY29tcG9uZW50XG4gICAgY29tcG9uZW50LmVtaXQgPSBlbWl0O1xuICAgIGNvbXBvbmVudC5vbiA9IG9uO1xuICAgIGNvbXBvbmVudC5vbmNlID0gb25jZTtcbiAgICBjb21wb25lbnQub2ZmID0gb2ZmO1xuXG4gICAgLy8gQWRkIGV2ZW50cyBBUEkgdG8gdmlld3BvcnRcbiAgICAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuZXZlbnRzID0ge1xuICAgICAgZW1pdCxcbiAgICAgIG9uLFxuICAgICAgb25jZSxcbiAgICAgIG9mZixcbiAgICAgIGNsZWFyLFxuICAgICAgZ2V0TGlzdGVuZXJDb3VudDogKGV2ZW50Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgIHJldHVybiBsaXN0ZW5lcnMuZ2V0KGV2ZW50KT8uc2l6ZSB8fCAwO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0b3RhbCA9IDA7XG4gICAgICAgIGxpc3RlbmVycy5mb3JFYWNoKChzZXQpID0+ICh0b3RhbCArPSBzZXQuc2l6ZSkpO1xuICAgICAgICByZXR1cm4gdG90YWw7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBDbGVhbiB1cCBvbiBkZXN0cm95XG4gICAgaWYgKFwiZGVzdHJveVwiIGluIGNvbXBvbmVudCAmJiB0eXBlb2YgY29tcG9uZW50LmRlc3Ryb3kgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmRlc3Ryb3k7XG4gICAgICBjb21wb25lbnQuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgY2xlYXIoKTtcbiAgICAgICAgb3JpZ2luYWxEZXN0cm95Py4oKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL3ZsaXN0L3ZsaXN0LnRzXG5cbi8qKlxuICogVkxpc3QgQ29tcG9uZW50IC0gVmlydHVhbCBMaXN0IHdpdGggZGlyZWN0IHZpZXdwb3J0IGludGVncmF0aW9uXG4gKlxuICogQSBzaW1wbGlmaWVkIHZpcnR1YWwgbGlzdCB0aGF0IHVzZXMgdGhlIHZpZXdwb3J0IGZlYXR1cmUgZGlyZWN0bHlcbiAqIHdpdGhvdXQgdGhlIGxpc3QtbWFuYWdlciBhYnN0cmFjdGlvbiBsYXllci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZMaXN0Q29uZmlnLCBWTGlzdENvbXBvbmVudCwgVkxpc3RJdGVtIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLy8gSW1wb3J0IG10cmwgY29tcG9zZSBzeXN0ZW1cbmltcG9ydCB7IHBpcGUgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgY3JlYXRlQmFzZSwgd2l0aEVsZW1lbnQgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgd2l0aEV2ZW50cywgd2l0aExpZmVjeWNsZSB9IGZyb20gXCJtdHJsXCI7XG5cbi8vIEltcG9ydCB2aWV3cG9ydCBmZWF0dXJlXG5pbXBvcnQgeyB3aXRoVmlld3BvcnQgfSBmcm9tIFwiLi9mZWF0dXJlcy92aWV3cG9ydFwiO1xuaW1wb3J0IHsgd2l0aEFQSSB9IGZyb20gXCIuL2ZlYXR1cmVzL2FwaVwiO1xuaW1wb3J0IHsgd2l0aFNlbGVjdGlvbiB9IGZyb20gXCIuL2ZlYXR1cmVzL3NlbGVjdGlvblwiO1xuaW1wb3J0IHsgd2l0aEtleWJvYXJkIH0gZnJvbSBcIi4vZmVhdHVyZXMva2V5Ym9hcmRcIjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFZMaXN0IGNvbXBvbmVudCB1c2luZyBkaXJlY3Qgdmlld3BvcnQgaW50ZWdyYXRpb25cbiAqXG4gKiBAcGFyYW0ge1ZMaXN0Q29uZmlnfSBjb25maWcgLSBMaXN0IGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHJldHVybnMge1ZMaXN0Q29tcG9uZW50fSBBIGZ1bGx5IGNvbmZpZ3VyZWQgdmlydHVhbCBsaXN0IGNvbXBvbmVudFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCB2bGlzdCA9IGNyZWF0ZVZMaXN0KHtcbiAqICAgY29udGFpbmVyOiAnI215LWxpc3QnLFxuICogICBjb2xsZWN0aW9uOiBteUFkYXB0ZXIsXG4gKiAgIHJhbmdlU2l6ZTogMjAsXG4gKiAgIHBhZ2luYXRpb25TdHJhdGVneTogJ3BhZ2UnLFxuICogICB0ZW1wbGF0ZTogKGl0ZW0sIGluZGV4KSA9PiBbXG4gKiAgICAgeyBjbGFzczogJ3ZpZXdwb3J0LWl0ZW0nLCBhdHRyaWJ1dGVzOiB7ICdkYXRhLWlkJzogaXRlbS5pZCB9fSxcbiAqICAgICBbeyBjbGFzczogJ3ZpZXdwb3J0LWl0ZW1fX25hbWUnLCB0ZXh0OiBpdGVtLm5hbWUgfV0sXG4gKiAgICAgW3sgY2xhc3M6ICd2aWV3cG9ydC1pdGVtX192YWx1ZScsIHRleHQ6IGl0ZW0udmFsdWUgfV1cbiAqICAgXVxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVZMaXN0ID0gPFQgZXh0ZW5kcyBWTGlzdEl0ZW0gPSBWTGlzdEl0ZW0+KFxuICBjb25maWc6IFZMaXN0Q29uZmlnPFQ+ID0ge30sXG4pOiBWTGlzdENvbXBvbmVudDxUPiA9PiB7XG4gIHRyeSB7XG4gICAgLy8gY29uc29sZS5sb2coYPCfk4sgQ3JlYXRpbmcgVkxpc3QgY29tcG9uZW50IHdpdGggZGlyZWN0IHZpZXdwb3J0IGludGVncmF0aW9uYCk7XG5cbiAgICAvLyBOb3RlOiBUcmFuc2Zvcm0gc2hvdWxkIGJlIGFwcGxpZWQgYnkgdGhlIGNvbGxlY3Rpb24gZmVhdHVyZSBpbiB2aWV3cG9ydFxuICAgIC8vIFZMaXN0IHNob3VsZCBub3QgaW50ZXJjZXB0IGNvbGxlY3Rpb24gcmVhZHMgYXMgaXQgYnlwYXNzZXMgdGhlIGxvYWRpbmcgbWFuYWdlclxuXG4gICAgLy8gQ3JlYXRlIHRoZSBjb21wb25lbnQgdGhyb3VnaCBmdW5jdGlvbmFsIGNvbXBvc2l0aW9uXG4gICAgY29uc3QgZW5oYW5jZXJzID0gW1xuICAgICAgLy8gMS4gRm91bmRhdGlvbiBsYXllclxuICAgICAgY3JlYXRlQmFzZSxcbiAgICAgIHdpdGhFdmVudHMoKSxcbiAgICAgIHdpdGhFbGVtZW50KHtcbiAgICAgICAgdGFnOiBcImRpdlwiLFxuICAgICAgICBjbGFzc05hbWU6IGNvbmZpZy5jbGFzc05hbWUgfHwgXCJtdHJsLXZsaXN0XCIsXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICByb2xlOiBcImxpc3RcIixcbiAgICAgICAgICBcImFyaWEtbGFiZWxcIjogY29uZmlnLmFyaWFMYWJlbCB8fCBcIlZpcnR1YWwgTGlzdFwiLFxuICAgICAgICB9LFxuICAgICAgfSksXG5cbiAgICAgIC8vIDIuIFZpZXdwb3J0IGludGVncmF0aW9uXG4gICAgICAvLyBQYXNzIGF1dG9TZWxlY3RGaXJzdCBmcm9tIHNlbGVjdGlvbiBjb25maWcgdG8gdmlld3BvcnQgbGV2ZWxcbiAgICAgIHdpdGhWaWV3cG9ydCh7XG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgYXV0b1NlbGVjdEZpcnN0OiBjb25maWcuc2VsZWN0aW9uPy5hdXRvU2VsZWN0Rmlyc3QsXG4gICAgICB9KSxcblxuICAgICAgLy8gMy4gQ29tcG9uZW50IGxpZmVjeWNsZVxuICAgICAgd2l0aExpZmVjeWNsZSgpLFxuXG4gICAgICAvLyA0LiBQdWJsaWMgQVBJIGxheWVyXG4gICAgICB3aXRoQVBJKGNvbmZpZyksXG4gICAgXTtcblxuICAgIC8vIDQuNS4gU2VsZWN0aW9uIGNhcGFiaWxpdGllcyAoaWYgZW5hYmxlZCkgLSBtdXN0IGJlIGFmdGVyIEFQSVxuICAgIGlmIChjb25maWcuc2VsZWN0aW9uPy5lbmFibGVkKSB7XG4gICAgICBlbmhhbmNlcnMucHVzaCh3aXRoU2VsZWN0aW9uKGNvbmZpZykpO1xuICAgIH1cblxuICAgIC8vIDUuIEtleWJvYXJkIG5hdmlnYXRpb24gKGlmIHNlbGVjdGlvbiBlbmFibGVkIG9yIGV4cGxpY2l0bHkgY29uZmlndXJlZClcbiAgICBpZiAoY29uZmlnLnNlbGVjdGlvbj8uZW5hYmxlZCB8fCBjb25maWcua2V5Ym9hcmQ/LmVuYWJsZWQpIHtcbiAgICAgIGVuaGFuY2Vycy5wdXNoKHdpdGhLZXlib2FyZChjb25maWcpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wb25lbnQgPSBwaXBlKC4uLmVuaGFuY2Vycykoe1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgY29tcG9uZW50TmFtZTogXCJ2bGlzdFwiLFxuICAgICAgcHJlZml4OiBjb25maWcucHJlZml4IHx8IFwibXRybFwiLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudCBhcyBWTGlzdENvbXBvbmVudDxUPjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwi4p2MIFtWTElTVF0gRmFpbGVkIHRvIGNyZWF0ZSBWTGlzdCBjb21wb25lbnQ6XCIsIGVycm9yKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvdmxpc3QvZmVhdHVyZXMvdmlld3BvcnQudHNcblxuLyoqXG4gKiBWaWV3cG9ydCBmZWF0dXJlIGZvciBWTGlzdFxuICogSW50ZWdyYXRlcyB0aGUgY29yZSB2aWV3cG9ydCBmdW5jdGlvbmFsaXR5IHdpdGggVkxpc3QgY29tcG9uZW50XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWTGlzdENvbmZpZywgVkxpc3RJdGVtIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBjcmVhdGVWaWV3cG9ydCB9IGZyb20gXCIuLi8uLi8uLi9jb3JlL3ZpZXdwb3J0XCI7XG5cbi8qKlxuICogQWRkcyB2aWV3cG9ydCBmdW5jdGlvbmFsaXR5IHRvIFZMaXN0XG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoVmlld3BvcnQgPSA8VCBleHRlbmRzIFZMaXN0SXRlbSA9IFZMaXN0SXRlbT4oXG4gIGNvbmZpZzogVkxpc3RDb25maWc8VD4sXG4pID0+IHtcbiAgcmV0dXJuIChjb21wb25lbnQ6IGFueSkgPT4ge1xuICAgIC8vIFNldCBpbml0aWFsIGl0ZW1zIGlmIHByb3ZpZGVkXG4gICAgaWYgKGNvbmZpZy5pdGVtcykge1xuICAgICAgY29tcG9uZW50Lml0ZW1zID0gY29uZmlnLml0ZW1zO1xuICAgICAgY29tcG9uZW50LnRvdGFsSXRlbXMgPSBjb25maWcuaXRlbXMubGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIFNldCB0ZW1wbGF0ZSBpZiBwcm92aWRlZFxuICAgIGlmIChjb25maWcudGVtcGxhdGUpIHtcbiAgICAgIGNvbXBvbmVudC50ZW1wbGF0ZSA9IGNvbmZpZy50ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgdGhlIGVsZW1lbnQgaGFzIGJvdGggdmxpc3QgYW5kIHZpZXdwb3J0IGNsYXNzZXNcbiAgICBjb25zdCB2aWV3cG9ydENvbmZpZyA9IHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIGNsYXNzTmFtZTogXCJtdHJsLXZpZXdwb3J0XCIsIC8vIFRoaXMgd2lsbCBiZSBhZGRlZCBieSB2aWV3cG9ydCBiYXNlIGZlYXR1cmVcbiAgICB9O1xuXG4gICAgLy8gUGFzcyBWTGlzdCBjb25maWcgZGlyZWN0bHkgdG8gdmlld3BvcnRcbiAgICBjb25zdCB2aWV3cG9ydEVuaGFuY2VkID0gY3JlYXRlVmlld3BvcnQodmlld3BvcnRDb25maWcgYXMgYW55KShjb21wb25lbnQpO1xuXG4gICAgLy8gSGFuZGxlIHBhcmVudCBlbGVtZW50IGlmIHByb3ZpZGVkXG4gICAgaWYgKGNvbmZpZy5wYXJlbnQgfHwgY29uZmlnLmNvbnRhaW5lcikge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gY29uZmlnLnBhcmVudCB8fCBjb25maWcuY29udGFpbmVyO1xuICAgICAgY29uc3QgZWxlbWVudCA9XG4gICAgICAgIHR5cGVvZiBjb250YWluZXIgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY29udGFpbmVyKVxuICAgICAgICAgIDogY29udGFpbmVyO1xuXG4gICAgICBpZiAoZWxlbWVudCAmJiB2aWV3cG9ydEVuaGFuY2VkLmVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZCh2aWV3cG9ydEVuaGFuY2VkLmVsZW1lbnQpO1xuXG4gICAgICAgIC8vIEVuc3VyZSB2aWV3cG9ydCBpcyBpbml0aWFsaXplZCBhZnRlciBET00gYXR0YWNobWVudFxuICAgICAgICBpZiAodmlld3BvcnRFbmhhbmNlZC52aWV3cG9ydCAmJiB2aWV3cG9ydEVuaGFuY2VkLnZpZXdwb3J0LmluaXRpYWxpemUpIHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIvCfk4sgW1ZMaXN0XSBJbml0aWFsaXppbmcgdmlld3BvcnQgYWZ0ZXIgRE9NIGF0dGFjaG1lbnRcIik7XG4gICAgICAgICAgdmlld3BvcnRFbmhhbmNlZC52aWV3cG9ydC5pbml0aWFsaXplKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmlld3BvcnRFbmhhbmNlZDtcbiAgfTtcbn07XG4iLAogICAgIi8qKlxuICogQVBJIGZlYXR1cmUgZm9yIFZMaXN0XG4gKiBQcm92aWRlcyBhIGNsZWFuIHB1YmxpYyBBUEkgZm9yIHRoZSBWTGlzdCBjb21wb25lbnRcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZMaXN0Q29uZmlnLCBWTGlzdEl0ZW0sIFJlbW92ZUl0ZW1PcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8vIFJlLWV4cG9ydCBmb3IgY29udmVuaWVuY2VcbmV4cG9ydCB0eXBlIHsgUmVtb3ZlSXRlbU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IHdpdGhBUEkgPSA8VCBleHRlbmRzIFZMaXN0SXRlbSA9IFZMaXN0SXRlbT4oXG4gIGNvbmZpZzogVkxpc3RDb25maWc8VD4sXG4pID0+IHtcbiAgcmV0dXJuIChjb21wb25lbnQ6IGFueSkgPT4ge1xuICAgIC8vIEluaXRpYWxpemUgdmlld3BvcnQgb24gY3JlYXRpb25cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQgJiYgY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemUpIHtcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemUoKTtcbiAgICAgIH1cbiAgICB9LCAwKTtcblxuICAgIC8vIFRyYWNrIGxvYWRpbmcgc3RhdGVcbiAgICBsZXQgaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgbGV0IHNlbGVjdGVkSWRzID0gbmV3IFNldDxzdHJpbmcgfCBudW1iZXI+KCk7XG5cbiAgICAvLyBUcmFjayBwZW5kaW5nIHJlbW92YWxzIHRvIGZpbHRlciBvdXQgaXRlbXMgZnJvbSBzdGFsZSBzZXJ2ZXIgcmVzcG9uc2VzXG4gICAgLy8gVGhpcyBwcmV2ZW50cyByYWNlIGNvbmRpdGlvbnMgd2hlcmUgc2VydmVyIHJldHVybnMgb2xkIGRhdGEgYmVmb3JlIHVwZGF0ZXMgYXJlIGNvbW1pdHRlZFxuICAgIGNvbnN0IHBlbmRpbmdSZW1vdmFscyA9IG5ldyBTZXQ8c3RyaW5nIHwgbnVtYmVyPigpO1xuXG4gICAgLy8gTGlzdGVuIGZvciBjb2xsZWN0aW9uIGV2ZW50c1xuICAgIGNvbXBvbmVudC5vbj8uKFwiY29sbGVjdGlvbjpyYW5nZS1sb2FkZWRcIiwgKCkgPT4ge1xuICAgICAgaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgfSk7XG4gICAgY29tcG9uZW50Lm9uPy4oXCJjb2xsZWN0aW9uOnJhbmdlLWZhaWxlZFwiLCAoKSA9PiB7XG4gICAgICBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG5cbiAgICAgIC8vIERhdGEgb3BlcmF0aW9uc1xuXG4gICAgICAvKipcbiAgICAgICAqIFJlbG9hZCB0aGUgbGlzdCAtIGNsZWFycyBhbGwgZGF0YSBhbmQgZmV0Y2hlcyBmcmVzaCBmcm9tIHRoZSBhZGFwdGVyXG4gICAgICAgKiBUaGlzIGlzIG11Y2ggbW9yZSBlZmZpY2llbnQgdGhhbiBkZXN0cm95aW5nIGFuZCByZWNyZWF0aW5nIHRoZSBWTGlzdFxuICAgICAgICovXG4gICAgICBhc3luYyByZWxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIFJlc2V0IHRoZSBjb2xsZWN0aW9uIHN0YXRlXG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24/LnJlc2V0KSB7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24ucmVzZXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc2V0IHNjcm9sbCBwb3NpdGlvbiB0byB0b3BcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uc2Nyb2xsVG8pIHtcbiAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG8oMCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciByZW5kZXJlZCBET00gY29udGVudCAoaXRlbXMgY29udGFpbmVyKVxuICAgICAgICBjb25zdCBpdGVtc0NvbnRhaW5lciA9IGNvbXBvbmVudC5lbGVtZW50Py5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgIFwiLm10cmwtdmlld3BvcnQtaXRlbXNcIixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGl0ZW1zQ29udGFpbmVyKSB7XG4gICAgICAgICAgaXRlbXNDb250YWluZXIuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc2V0IGluaXRpYWxpemF0aW9uIHN0YXRlIHNvIGluaXRpYWxpemUoKSB3aWxsIHJ1biBhZ2FpblxuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0Py5yZXNldEluaXRpYWxpemF0aW9uKSB7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnJlc2V0SW5pdGlhbGl6YXRpb24oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlLWluaXRpYWxpemUgdG8gdHJpZ2dlciBmcmVzaCBkYXRhIGxvYWRcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uaW5pdGlhbGl6ZSkge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwicmVsb2FkZWRcIik7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENsZWFyIGFsbCBkYXRhIHdpdGhvdXQgcmVsb2FkaW5nXG4gICAgICAgKi9cbiAgICAgIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICAvLyBSZXNldCB0aGUgY29sbGVjdGlvbiBzdGF0ZVxuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uPy5yZXNldCkge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLnJlc2V0KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXNldCBzY3JvbGwgcG9zaXRpb24gdG8gdG9wXG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LnNjcm9sbFRvKSB7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbFRvKDApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgcmVuZGVyZWQgRE9NIGNvbnRlbnQgKGl0ZW1zIGNvbnRhaW5lcilcbiAgICAgICAgY29uc3QgaXRlbXNDb250YWluZXIgPSBjb21wb25lbnQuZWxlbWVudD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICBcIi5tdHJsLXZpZXdwb3J0LWl0ZW1zXCIsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpdGVtc0NvbnRhaW5lcikge1xuICAgICAgICAgIGl0ZW1zQ29udGFpbmVyLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY2xlYXJlZFwiKTtcbiAgICAgIH0sXG5cbiAgICAgIHNldEl0ZW1zKGl0ZW1zOiBUW10pIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uY29sbGVjdGlvbikge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLnNldEl0ZW1zKGl0ZW1zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21wb25lbnQuaXRlbXMgPSBpdGVtcztcbiAgICAgICAgICBjb21wb25lbnQudG90YWxJdGVtcyA9IGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiaXRlbXM6c2V0XCIsIHsgaXRlbXMsIHRvdGFsOiBpdGVtcy5sZW5ndGggfSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEFkZCBpdGVtcyB0byB0aGUgY29sbGVjdGlvbiBhdCB0aGUgc3RhcnQgb3IgZW5kXG4gICAgICAgKiBVcGRhdGVzIHRvdGFsSXRlbXMgYW5kIHRyaWdnZXJzIHJlLXJlbmRlciBvZiB2aXNpYmxlIGl0ZW1zXG4gICAgICAgKiBAcGFyYW0gbmV3SXRlbXMgLSBBcnJheSBvZiBpdGVtcyB0byBhZGRcbiAgICAgICAqIEBwYXJhbSBwb3NpdGlvbiAtIFdoZXJlIHRvIGFkZCBpdGVtczogXCJzdGFydFwiIChkZWZhdWx0KSBvciBcImVuZFwiXG4gICAgICAgKi9cbiAgICAgIGFkZEl0ZW1zKG5ld0l0ZW1zOiBUW10sIHBvc2l0aW9uOiBcInN0YXJ0XCIgfCBcImVuZFwiID0gXCJzdGFydFwiKTogdm9pZCB7XG4gICAgICAgIGlmICghbmV3SXRlbXMgfHwgbmV3SXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFwiW1ZMaXN0XSBhZGRJdGVtczogbm8gaXRlbXMgcHJvdmlkZWRcIik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uO1xuICAgICAgICBjb25zdCBjdXJyZW50SXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG5cbiAgICAgICAgLy8gQWRkIGl0ZW1zIHRvIHRoZSBjb2xsZWN0aW9uIGl0ZW1zIGFycmF5XG4gICAgICAgIGlmIChjb2xsZWN0aW9uPy5pdGVtcykge1xuICAgICAgICAgIGlmIChwb3NpdGlvbiA9PT0gXCJzdGFydFwiKSB7XG4gICAgICAgICAgICAvLyBQcmVwZW5kIGl0ZW1zIChuZXdlc3QgZmlyc3QpXG4gICAgICAgICAgICBjb2xsZWN0aW9uLml0ZW1zLnVuc2hpZnQoLi4ubmV3SXRlbXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBcHBlbmQgaXRlbXNcbiAgICAgICAgICAgIGNvbGxlY3Rpb24uaXRlbXMucHVzaCguLi5uZXdJdGVtcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBldmVudCBGSVJTVCBzbyByZW5kZXJpbmcgZmVhdHVyZSBjYW4gcmVidWlsZCBjb2xsZWN0aW9uSXRlbXNcbiAgICAgICAgLy8gQkVGT1JFIHNldFRvdGFsSXRlbXMgdHJpZ2dlcnMgYSByZW5kZXJcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW1zOmFkZC1yZXF1ZXN0XCIsIHtcbiAgICAgICAgICBpdGVtczogbmV3SXRlbXMsXG4gICAgICAgICAgcG9zaXRpb24sXG4gICAgICAgICAgcHJldmlvdXNDb3VudDogY3VycmVudEl0ZW1zLmxlbmd0aCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHRvdGFsSXRlbXMgLSB0aGlzIHRyaWdnZXJzIHZpZXdwb3J0OnRvdGFsLWl0ZW1zLWNoYW5nZWQgd2hpY2ggY2FsbHMgcmVuZGVySXRlbXNcbiAgICAgICAgY29uc3QgaXRlbXNBZGRlZCA9IG5ld0l0ZW1zLmxlbmd0aDtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24/LmdldFRvdGFsSXRlbXMgJiYgY29sbGVjdGlvbj8uc2V0VG90YWxJdGVtcykge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRUb3RhbCA9IGNvbGxlY3Rpb24uZ2V0VG90YWxJdGVtcygpO1xuICAgICAgICAgIGNvbGxlY3Rpb24uc2V0VG90YWxJdGVtcyhjdXJyZW50VG90YWwgKyBpdGVtc0FkZGVkKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24/LnNldFRvdGFsSXRlbXMpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50VG90YWwgPSBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5nZXRUb3RhbEl0ZW1zKCk7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uc2V0VG90YWxJdGVtcyhcbiAgICAgICAgICAgIGN1cnJlbnRUb3RhbCArIGl0ZW1zQWRkZWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoY29tcG9uZW50LnRvdGFsSXRlbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29tcG9uZW50LnRvdGFsSXRlbXMgPSBjb21wb25lbnQudG90YWxJdGVtcyArIGl0ZW1zQWRkZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBjb21wbGV0aW9uIGV2ZW50XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtczphZGRlZFwiLCB7XG4gICAgICAgICAgaXRlbXM6IG5ld0l0ZW1zLFxuICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgIHRvdGFsOiB0aGlzLmdldEl0ZW1Db3VudCgpLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQWRkIGEgc2luZ2xlIGl0ZW0gdG8gdGhlIGNvbGxlY3Rpb24gYXQgdGhlIHN0YXJ0IG9yIGVuZFxuICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgd3JhcHMgYWRkSXRlbXMgZm9yIHNpbmdsZSBpdGVtIHVzZSBjYXNlXG4gICAgICAgKiBAcGFyYW0gaXRlbSAtIEl0ZW0gdG8gYWRkXG4gICAgICAgKiBAcGFyYW0gcG9zaXRpb24gLSBXaGVyZSB0byBhZGQgaXRlbTogXCJzdGFydFwiIChkZWZhdWx0KSBvciBcImVuZFwiXG4gICAgICAgKi9cbiAgICAgIGFkZEl0ZW0oaXRlbTogVCwgcG9zaXRpb246IFwic3RhcnRcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFwiW1ZMaXN0XSBhZGRJdGVtOiBubyBpdGVtIHByb3ZpZGVkXCIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZEl0ZW1zKFtpdGVtXSwgcG9zaXRpb24pO1xuICAgICAgfSxcblxuICAgICAgZ2V0SXRlbXMoKTogVFtdIHtcbiAgICAgICAgLy8gQ29sbGVjdGlvbiBpcyBhZGRlZCBkaXJlY3RseSB0byBjb21wb25lbnQsIG5vdCB0byB2aWV3cG9ydC5jb2xsZWN0aW9uXG4gICAgICAgIGlmICgoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbj8uZ2V0SXRlbXMpIHtcbiAgICAgICAgICByZXR1cm4gKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24uZ2V0SXRlbXMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50Lml0ZW1zIHx8IFtdO1xuICAgICAgfSxcblxuICAgICAgZ2V0VmlzaWJsZUl0ZW1zKCk6IFRbXSB7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gY29tcG9uZW50LnZpZXdwb3J0Py5nZXRWaXNpYmxlUmFuZ2UoKSB8fCB7XG4gICAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgICAgZW5kOiAwLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICAgICAgcmV0dXJuIGl0ZW1zLnNsaWNlKHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpO1xuICAgICAgfSxcblxuICAgICAgZ2V0SXRlbUNvdW50KCk6IG51bWJlciB7XG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24pIHtcbiAgICAgICAgICByZXR1cm4gY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uZ2V0VG90YWxJdGVtcygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb25lbnQudG90YWxJdGVtcyB8fCBjb21wb25lbnQuaXRlbXM/Lmxlbmd0aCB8fCAwO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgaXRlbSBhdCBhIHNwZWNpZmljIGluZGV4XG4gICAgICAgKiBAcGFyYW0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gcmV0cmlldmVcbiAgICAgICAqIEByZXR1cm5zIFRoZSBpdGVtIGF0IHRoZSBpbmRleCwgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZFxuICAgICAgICovXG4gICAgICBnZXRJdGVtKGluZGV4OiBudW1iZXIpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uPy5nZXRJdGVtKSB7XG4gICAgICAgICAgcmV0dXJuIChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uLmdldEl0ZW0oaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgICAgICByZXR1cm4gaXRlbXNbaW5kZXhdO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBVcGRhdGUgaXRlbSBhdCBhIHNwZWNpZmljIGluZGV4XG4gICAgICAgKiBAcGFyYW0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gdXBkYXRlXG4gICAgICAgKiBAcGFyYW0gaXRlbSAtIFRoZSBuZXcgaXRlbSBkYXRhIChmdWxsIHJlcGxhY2VtZW50KVxuICAgICAgICovXG4gICAgICB1cGRhdGVJdGVtKGluZGV4OiBudW1iZXIsIGl0ZW06IFQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG5cbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtWTGlzdF0gdXBkYXRlSXRlbTogaW5kZXggJHtpbmRleH0gb3V0IG9mIGJvdW5kc2ApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZXZpb3VzSXRlbSA9IGl0ZW1zW2luZGV4XTtcblxuICAgICAgICAvLyBVcGRhdGUgaW4gY29sbGVjdGlvbiBpdGVtcyBhcnJheVxuICAgICAgICBpZiAoKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24/Lml0ZW1zKSB7XG4gICAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24uaXRlbXNbaW5kZXhdID0gaXRlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtaXQgZXZlbnQgZm9yIHJlbmRlcmluZyBmZWF0dXJlIHRvIGhhbmRsZSBET00gdXBkYXRlXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtOnVwZGF0ZS1yZXF1ZXN0XCIsIHtcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBpdGVtLFxuICAgICAgICAgIHByZXZpb3VzSXRlbSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFVwZGF0ZSBpdGVtIGJ5IElEXG4gICAgICAgKiBGaW5kcyB0aGUgaXRlbSBpbiB0aGUgY29sbGVjdGlvbiBieSBpdHMgSUQgYW5kIHVwZGF0ZXMgaXQgd2l0aCBuZXcgZGF0YVxuICAgICAgICogUmUtcmVuZGVycyB0aGUgaXRlbSBpZiBjdXJyZW50bHkgdmlzaWJsZSBpbiB0aGUgdmlld3BvcnRcbiAgICAgICAqIEBwYXJhbSBpZCAtIFRoZSBpdGVtIElEIHRvIGZpbmRcbiAgICAgICAqIEBwYXJhbSBkYXRhIC0gUGFydGlhbCBkYXRhIHRvIG1lcmdlIHdpdGggZXhpc3RpbmcgaXRlbSwgb3IgZnVsbCBpdGVtIHJlcGxhY2VtZW50XG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFVwZGF0ZSBvcHRpb25zXG4gICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGl0ZW0gd2FzIGZvdW5kIGFuZCB1cGRhdGVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgICAqL1xuICAgICAgdXBkYXRlSXRlbUJ5SWQoXG4gICAgICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgICAgIGRhdGE6IFBhcnRpYWw8VD4sXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAvKiogSWYgdHJ1ZSwgcmVwbGFjZSB0aGUgZW50aXJlIGl0ZW0gaW5zdGVhZCBvZiBtZXJnaW5nIChkZWZhdWx0OiBmYWxzZSkgKi9cbiAgICAgICAgICByZXBsYWNlPzogYm9vbGVhbjtcbiAgICAgICAgICAvKiogSWYgdHJ1ZSwgcmUtcmVuZGVyIGV2ZW4gaWYgbm90IHZpc2libGUgKGRlZmF1bHQ6IGZhbHNlKSAqL1xuICAgICAgICAgIGZvcmNlUmVuZGVyPzogYm9vbGVhbjtcbiAgICAgICAgfSA9IHt9LFxuICAgICAgKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHsgcmVwbGFjZSA9IGZhbHNlIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcblxuICAgICAgICAvLyBGaW5kIHRoZSBpdGVtIGJ5IElEIChoYW5kbGUgc3BhcnNlIGFycmF5cyBmcm9tIHBhZ2luYXRpb24pXG4gICAgICAgIC8vIENoZWNrIGFsbCBwb3NzaWJsZSBJRCBmaWVsZHMgc2luY2UgaXRlbXMgbWF5IGhhdmUgZGlmZmVyZW50IElEIHN0cnVjdHVyZXNcbiAgICAgICAgY29uc3QgaW5kZXggPSBpdGVtcy5maW5kSW5kZXgoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgIGlmICghaXRlbSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIC8vIENoZWNrIGFsbCBwb3NzaWJsZSBJRCBmaWVsZHMgLSB1c2VyX2lkIGlzIGltcG9ydGFudCBmb3IgcHJvZmlsZS9jb250YWN0IGl0ZW1zXG4gICAgICAgICAgY29uc3QgaWRzVG9DaGVjayA9IFtpdGVtLmlkLCBpdGVtLl9pZCwgaXRlbS51c2VyX2lkXS5maWx0ZXIoXG4gICAgICAgICAgICAodikgPT4gdiAhPT0gdW5kZWZpbmVkICYmIHYgIT09IG51bGwsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gaWRzVG9DaGVjay5zb21lKFxuICAgICAgICAgICAgKGl0ZW1JZCkgPT4gaXRlbUlkID09PSBpZCB8fCBTdHJpbmcoaXRlbUlkKSA9PT0gU3RyaW5nKGlkKSxcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbVkxpc3RdIHVwZGF0ZUl0ZW1CeUlkOiBpdGVtIHdpdGggaWQgJHtpZH0gbm90IGZvdW5kYCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJldmlvdXNJdGVtID0gaXRlbXNbaW5kZXhdO1xuXG4gICAgICAgIC8vIENyZWF0ZSB1cGRhdGVkIGl0ZW0gLSBlaXRoZXIgcmVwbGFjZSBlbnRpcmVseSBvciBtZXJnZVxuICAgICAgICBsZXQgdXBkYXRlZEl0ZW06IFQ7XG4gICAgICAgIGlmIChyZXBsYWNlKSB7XG4gICAgICAgICAgdXBkYXRlZEl0ZW0gPSB7IC4uLmRhdGEsIGlkOiBwcmV2aW91c0l0ZW0uaWQgPz8gaWQgfSBhcyBUO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE9ubHkgbWVyZ2UgcHJvcGVydGllcyB0aGF0IGhhdmUgYWN0dWFsIHZhbHVlcyAobm90IHVuZGVmaW5lZClcbiAgICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHBhcnRpYWwgdXBkYXRlcyBmcm9tIG92ZXJ3cml0aW5nIGV4aXN0aW5nIGRhdGFcbiAgICAgICAgICB1cGRhdGVkSXRlbSA9IHsgLi4ucHJldmlvdXNJdGVtIH0gYXMgVDtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkYXRhKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgKHVwZGF0ZWRJdGVtIGFzIGFueSlba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBpbiBjb2xsZWN0aW9uIGl0ZW1zIGFycmF5XG4gICAgICAgIGlmICgoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbj8uaXRlbXMpIHtcbiAgICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbi5pdGVtc1tpbmRleF0gPSB1cGRhdGVkSXRlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtaXQgZXZlbnQgZm9yIHJlbmRlcmluZyBmZWF0dXJlIHRvIGhhbmRsZSBET00gdXBkYXRlXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtOnVwZGF0ZS1yZXF1ZXN0XCIsIHtcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBpdGVtOiB1cGRhdGVkSXRlbSxcbiAgICAgICAgICBwcmV2aW91c0l0ZW0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBSZW1vdmUgaXRlbSBhdCBhIHNwZWNpZmljIGluZGV4XG4gICAgICAgKiBSZW1vdmVzIHRoZSBpdGVtIGZyb20gdGhlIGNvbGxlY3Rpb24sIHVwZGF0ZXMgdG90YWxJdGVtcywgYW5kIHRyaWdnZXJzIHJlLXJlbmRlclxuICAgICAgICogQHBhcmFtIGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHJlbW92ZVxuICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiBpdGVtIHdhcyBmb3VuZCBhbmQgcmVtb3ZlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICAgKi9cbiAgICAgIHJlbW92ZUl0ZW0oaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uO1xuXG4gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbVkxpc3RdIHJlbW92ZUl0ZW06IGluZGV4ICR7aW5kZXh9IG91dCBvZiBib3VuZHNgKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZW1vdmVkSXRlbSA9IGl0ZW1zW2luZGV4XTtcblxuICAgICAgICAvLyBSZW1vdmUgZnJvbSBjb2xsZWN0aW9uIGl0ZW1zIGFycmF5IChjb21wb25lbnQuY29sbGVjdGlvbi5pdGVtcyBpcyB0aGUgYWN0dWFsIGFycmF5KVxuICAgICAgICBpZiAoKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24/Lml0ZW1zKSB7XG4gICAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24uaXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElNUE9SVEFOVDogRW1pdCBpdGVtOnJlbW92ZS1yZXF1ZXN0IEZJUlNUIHNvIHJlbmRlcmluZyBmZWF0dXJlIHJlYnVpbGRzIGNvbGxlY3Rpb25JdGVtc1xuICAgICAgICAvLyBCRUZPUkUgc2V0VG90YWxJdGVtcyB0cmlnZ2VycyBhIHJlbmRlciB2aWEgdmlld3BvcnQ6dG90YWwtaXRlbXMtY2hhbmdlZFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiaXRlbTpyZW1vdmUtcmVxdWVzdFwiLCB7XG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgaXRlbTogcmVtb3ZlZEl0ZW0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0b3RhbEl0ZW1zIC0gdGhpcyB3aWxsIHRyaWdnZXIgdmlld3BvcnQ6dG90YWwtaXRlbXMtY2hhbmdlZCB3aGljaCBjYWxscyByZW5kZXJJdGVtc1xuICAgICAgICAvLyBCeSBub3csIGNvbGxlY3Rpb25JdGVtcyBoYXMgYmVlbiByZWJ1aWx0IGJ5IHRoZSBpdGVtOnJlbW92ZS1yZXF1ZXN0IGhhbmRsZXJcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24/LmdldFRvdGFsSXRlbXMgJiYgY29sbGVjdGlvbj8uc2V0VG90YWxJdGVtcykge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRUb3RhbCA9IGNvbGxlY3Rpb24uZ2V0VG90YWxJdGVtcygpO1xuICAgICAgICAgIGNvbGxlY3Rpb24uc2V0VG90YWxJdGVtcyhNYXRoLm1heCgwLCBjdXJyZW50VG90YWwgLSAxKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uPy5zZXRUb3RhbEl0ZW1zKSB7XG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gdmlld3BvcnQuY29sbGVjdGlvbiBpZiBhdmFpbGFibGVcbiAgICAgICAgICBjb25zdCBjdXJyZW50VG90YWwgPSBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5nZXRUb3RhbEl0ZW1zKCk7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uc2V0VG90YWxJdGVtcyhcbiAgICAgICAgICAgIE1hdGgubWF4KDAsIGN1cnJlbnRUb3RhbCAtIDEpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTGFzdCByZXNvcnQ6IHVwZGF0ZSBjb21wb25lbnQudG90YWxJdGVtcyBkaXJlY3RseVxuICAgICAgICAgIGlmIChjb21wb25lbnQudG90YWxJdGVtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb21wb25lbnQudG90YWxJdGVtcyA9IE1hdGgubWF4KDAsIGNvbXBvbmVudC50b3RhbEl0ZW1zIC0gMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBpdGVtIGJ5IElEXG4gICAgICAgKiBGaW5kcyB0aGUgaXRlbSBpbiB0aGUgY29sbGVjdGlvbiBieSBpdHMgSUQgYW5kIHJlbW92ZXMgaXRcbiAgICAgICAqIFVwZGF0ZXMgdG90YWxJdGVtcyBhbmQgdHJpZ2dlcnMgcmUtcmVuZGVyIG9mIHZpc2libGUgaXRlbXNcbiAgICAgICAqIE9wdGlvbmFsbHkgdHJhY2tzIGFzIHBlbmRpbmcgcmVtb3ZhbCB0byBmaWx0ZXIgZnJvbSBmdXR1cmUgZmV0Y2hlc1xuICAgICAgICogQHBhcmFtIGlkIC0gVGhlIGl0ZW0gSUQgdG8gZmluZCBhbmQgcmVtb3ZlXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFJlbW92ZSBvcHRpb25zICh0cmFja1BlbmRpbmcsIHBlbmRpbmdUaW1lb3V0KVxuICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiBpdGVtIHdhcyBmb3VuZCBhbmQgcmVtb3ZlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICAgKi9cbiAgICAgIHJlbW92ZUl0ZW1CeUlkKFxuICAgICAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgICAgICBvcHRpb25zOiBSZW1vdmVJdGVtT3B0aW9ucyA9IHt9LFxuICAgICAgKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHsgdHJhY2tQZW5kaW5nID0gdHJ1ZSwgcGVuZGluZ1RpbWVvdXQgPSA1MDAwIH0gPSBvcHRpb25zO1xuXG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbVkxpc3RdIHJlbW92ZUl0ZW1CeUlkOiBpbnZhbGlkIGlkYCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIHRvIHBlbmRpbmcgcmVtb3ZhbHMgdG8gZmlsdGVyIGZyb20gZnV0dXJlIHNlcnZlciByZXNwb25zZXNcbiAgICAgICAgaWYgKHRyYWNrUGVuZGluZykge1xuICAgICAgICAgIHBlbmRpbmdSZW1vdmFscy5hZGQoaWQpO1xuXG4gICAgICAgICAgLy8gQ2xlYXIgZnJvbSBwZW5kaW5nIHJlbW92YWxzIGFmdGVyIHRpbWVvdXQgKHNlcnZlciBzaG91bGQgaGF2ZSB1cGRhdGVkIGJ5IHRoZW4pXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBwZW5kaW5nUmVtb3ZhbHMuZGVsZXRlKGlkKTtcbiAgICAgICAgICB9LCBwZW5kaW5nVGltZW91dCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcblxuICAgICAgICAvLyBGaW5kIHRoZSBpdGVtIGJ5IElEIChoYW5kbGUgc3BhcnNlIGFycmF5cyBmcm9tIHBhZ2luYXRpb24pXG4gICAgICAgIC8vIENoZWNrIGFsbCBwb3NzaWJsZSBJRCBmaWVsZHMgc2luY2UgaXRlbXMgbWF5IGhhdmUgZGlmZmVyZW50IElEIHN0cnVjdHVyZXNcbiAgICAgICAgY29uc3QgaW5kZXggPSBpdGVtcy5maW5kSW5kZXgoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgIGlmICghaXRlbSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIC8vIENoZWNrIGFsbCBwb3NzaWJsZSBJRCBmaWVsZHNcbiAgICAgICAgICBjb25zdCBpZHNUb0NoZWNrID0gW2l0ZW0uaWQsIGl0ZW0uX2lkLCBpdGVtLnVzZXJfaWRdLmZpbHRlcihcbiAgICAgICAgICAgICh2KSA9PiB2ICE9PSB1bmRlZmluZWQgJiYgdiAhPT0gbnVsbCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBpZHNUb0NoZWNrLnNvbWUoXG4gICAgICAgICAgICAoaXRlbUlkKSA9PiBpdGVtSWQgPT09IGlkIHx8IFN0cmluZyhpdGVtSWQpID09PSBTdHJpbmcoaWQpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVJdGVtKGluZGV4KTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgYW4gaXRlbSBJRCBpcyBwZW5kaW5nIHJlbW92YWxcbiAgICAgICAqIEBwYXJhbSBpZCAtIFRoZSBpdGVtIElEIHRvIGNoZWNrXG4gICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpdGVtIGlzIHBlbmRpbmcgcmVtb3ZhbFxuICAgICAgICovXG4gICAgICBpc1BlbmRpbmdSZW1vdmFsKGlkOiBzdHJpbmcgfCBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHBlbmRpbmdSZW1vdmFscy5oYXMoaWQpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgYWxsIHBlbmRpbmcgcmVtb3ZhbCBJRHNcbiAgICAgICAqIEByZXR1cm5zIFNldCBvZiBwZW5kaW5nIHJlbW92YWwgSURzXG4gICAgICAgKi9cbiAgICAgIGdldFBlbmRpbmdSZW1vdmFscygpOiBTZXQ8c3RyaW5nIHwgbnVtYmVyPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2V0KHBlbmRpbmdSZW1vdmFscyk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENsZWFyIGEgc3BlY2lmaWMgcGVuZGluZyByZW1vdmFsXG4gICAgICAgKiBAcGFyYW0gaWQgLSBUaGUgaXRlbSBJRCB0byBjbGVhciBmcm9tIHBlbmRpbmcgcmVtb3ZhbHNcbiAgICAgICAqL1xuICAgICAgY2xlYXJQZW5kaW5nUmVtb3ZhbChpZDogc3RyaW5nIHwgbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHBlbmRpbmdSZW1vdmFscy5kZWxldGUoaWQpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDbGVhciBhbGwgcGVuZGluZyByZW1vdmFsc1xuICAgICAgICovXG4gICAgICBjbGVhckFsbFBlbmRpbmdSZW1vdmFscygpOiB2b2lkIHtcbiAgICAgICAgcGVuZGluZ1JlbW92YWxzLmNsZWFyKCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEZpbHRlciBpdGVtcyBhcnJheSB0byBleGNsdWRlIHBlbmRpbmcgcmVtb3ZhbHNcbiAgICAgICAqIFV0aWxpdHkgbWV0aG9kIGZvciB1c2UgaW4gY29sbGVjdGlvbiBhZGFwdGVyc1xuICAgICAgICogQHBhcmFtIGl0ZW1zIC0gQXJyYXkgb2YgaXRlbXMgdG8gZmlsdGVyXG4gICAgICAgKiBAcmV0dXJucyBGaWx0ZXJlZCBhcnJheSB3aXRob3V0IHBlbmRpbmcgcmVtb3ZhbCBpdGVtc1xuICAgICAgICovXG4gICAgICBmaWx0ZXJQZW5kaW5nUmVtb3ZhbHM8SSBleHRlbmRzIHsgaWQ/OiBhbnk7IF9pZD86IGFueSB9PihcbiAgICAgICAgaXRlbXM6IElbXSxcbiAgICAgICk6IElbXSB7XG4gICAgICAgIGlmIChwZW5kaW5nUmVtb3ZhbHMuc2l6ZSA9PT0gMCkgcmV0dXJuIGl0ZW1zO1xuXG4gICAgICAgIHJldHVybiBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgICBjb25zdCBpZCA9IGl0ZW0uX2lkIHx8IGl0ZW0uaWQ7XG4gICAgICAgICAgcmV0dXJuICFwZW5kaW5nUmVtb3ZhbHMuaGFzKGlkKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuXG4gICAgICAvLyBMb2FkaW5nIG9wZXJhdGlvbnNcbiAgICAgIGFzeW5jIGxvYWRSYW5nZShcbiAgICAgICAgcGFnZTogbnVtYmVyLFxuICAgICAgICBsaW1pdDogbnVtYmVyLFxuICAgICAgICBzdHJhdGVneTogc3RyaW5nID0gXCJwYWdlXCIsXG4gICAgICAgIGFsaWdubWVudD86IHN0cmluZyxcbiAgICAgICkge1xuICAgICAgICBpc0xvYWRpbmcgPSB0cnVlO1xuXG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24pIHtcbiAgICAgICAgICBjb25zdCBvZmZzZXQgPSBzdHJhdGVneSA9PT0gXCJwYWdlXCIgPyAocGFnZSAtIDEpICogbGltaXQgOiBwYWdlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5sb2FkUmFuZ2Uob2Zmc2V0LCBsaW1pdCk7XG4gICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwibG9hZFwiLCB7IHBhZ2UsIGxpbWl0LCBzdHJhdGVneSB9KTtcblxuICAgICAgICAgICAgLy8gU2Nyb2xsIHRvIHRoZSBsb2FkZWQgcmFuZ2UgaWYgYWxpZ25tZW50IGlzIHNwZWNpZmllZFxuICAgICAgICAgICAgaWYgKGFsaWdubWVudCkge1xuICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IG9mZnNldDtcbiAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0luZGV4KGluZGV4LCBhbGlnbm1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiZXJyb3JcIiwgeyBlcnJvciB9KTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8vIERhdGEgbG9hZGluZ1xuICAgICAgbG9hZE5leHQ6IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFtWTGlzdF0gbG9hZE5leHQoKWApO1xuXG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24pIHtcbiAgICAgICAgICBjb25zdCB0b3RhbEl0ZW1zID0gY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uZ2V0VG90YWxJdGVtcygpO1xuICAgICAgICAgIGNvbnN0IGxvYWRlZFJhbmdlcyA9IGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmdldExvYWRlZFJhbmdlcygpO1xuXG4gICAgICAgICAgLy8gRmluZCB0aGUgbmV4dCB1bmxvYWRlZCByYW5nZVxuICAgICAgICAgIGxldCBuZXh0T2Zmc2V0ID0gMDtcbiAgICAgICAgICBmb3IgKGNvbnN0IHJhbmdlSWQgb2YgbG9hZGVkUmFuZ2VzKSB7XG4gICAgICAgICAgICBjb25zdCByYW5nZUVuZCA9IChyYW5nZUlkICsgMSkgKiAoY29uZmlnLnBhZ2luYXRpb24/LmxpbWl0IHx8IDIwKTtcbiAgICAgICAgICAgIGlmIChyYW5nZUVuZCA+IG5leHRPZmZzZXQpIHtcbiAgICAgICAgICAgICAgbmV4dE9mZnNldCA9IHJhbmdlRW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChuZXh0T2Zmc2V0IDwgdG90YWxJdGVtcykge1xuICAgICAgICAgICAgYXdhaXQgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24ubG9hZFJhbmdlKFxuICAgICAgICAgICAgICBuZXh0T2Zmc2V0LFxuICAgICAgICAgICAgICBjb25maWcucGFnaW5hdGlvbj8ubGltaXQgfHwgMjAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH0sXG5cbiAgICAgIGlzTG9hZGluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGlzTG9hZGluZztcbiAgICAgIH0sXG5cbiAgICAgIGhhc05leHQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24pIHtcbiAgICAgICAgICBjb25zdCB0b3RhbCA9IGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmdldFRvdGFsSXRlbXMoKTtcbiAgICAgICAgICBjb25zdCBpdGVtcyA9IGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmdldEl0ZW1zKCk7XG4gICAgICAgICAgcmV0dXJuIGl0ZW1zLmxlbmd0aCA8IHRvdGFsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIE5vdGU6IFNlbGVjdGlvbiBvcGVyYXRpb25zIGFyZSBoYW5kbGVkIGJ5IHRoZSB3aXRoU2VsZWN0aW9uIGZlYXR1cmVcbiAgICAgIC8vIFRoZXNlIGFyZSBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGJ1dCBkZWxlZ2F0ZSB0byBzZWxlY3Rpb24gZmVhdHVyZSBpZiBhdmFpbGFibGVcbiAgICAgIGdldFNlbGVjdGVkSWRzKCk6IChzdHJpbmcgfCBudW1iZXIpW10ge1xuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5nZXRTZWxlY3RlZEluZGljZXMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIFVzZSBzZWxlY3Rpb24gZmVhdHVyZSBpZiBhdmFpbGFibGVcbiAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICAgICAgICBjb25zdCBpbmRpY2VzID0gY29tcG9uZW50LmdldFNlbGVjdGVkSW5kaWNlcygpO1xuICAgICAgICAgIHJldHVybiBpbmRpY2VzLm1hcCgoaWR4OiBudW1iZXIpID0+IChpdGVtc1tpZHhdIGFzIGFueSk/LmlkIHx8IGlkeCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmFsbGJhY2sgdG8gbG9jYWwgdHJhY2tpbmdcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oc2VsZWN0ZWRJZHMpO1xuICAgICAgfSxcblxuICAgICAgc2VsZWN0SXRlbShpZDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LnNlbGVjdEl0ZW1zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAvLyBVc2Ugc2VsZWN0aW9uIGZlYXR1cmUgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBpdGVtcy5maW5kSW5kZXgoKGl0ZW06IGFueSkgPT4gaXRlbS5pZCA9PT0gaWQpO1xuICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuc2VsZWN0SXRlbXMoW2luZGV4XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIGxvY2FsIHRyYWNraW5nXG4gICAgICAgICAgc2VsZWN0ZWRJZHMuYWRkKGlkKTtcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwic2VsZWN0aW9uOmNoYW5nZVwiLCB7XG4gICAgICAgICAgICBzZWxlY3RlZDogdGhpcy5nZXRTZWxlY3RlZElkcygpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBkZXNlbGVjdEl0ZW0oaWQ6IHN0cmluZyB8IG51bWJlcikge1xuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5kZXNlbGVjdEl0ZW1zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAvLyBVc2Ugc2VsZWN0aW9uIGZlYXR1cmUgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBpdGVtcy5maW5kSW5kZXgoKGl0ZW06IGFueSkgPT4gaXRlbS5pZCA9PT0gaWQpO1xuICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuZGVzZWxlY3RJdGVtcyhbaW5kZXhdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gbG9jYWwgdHJhY2tpbmdcbiAgICAgICAgICBzZWxlY3RlZElkcy5kZWxldGUoaWQpO1xuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJzZWxlY3Rpb246Y2hhbmdlXCIsIHtcbiAgICAgICAgICAgIHNlbGVjdGVkOiB0aGlzLmdldFNlbGVjdGVkSWRzKCksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGNsZWFyU2VsZWN0aW9uKCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5jbGVhclNlbGVjdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gVXNlIHNlbGVjdGlvbiBmZWF0dXJlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIGNvbXBvbmVudC5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIGxvY2FsIHRyYWNraW5nXG4gICAgICAgICAgc2VsZWN0ZWRJZHMuY2xlYXIoKTtcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwic2VsZWN0aW9uOmNoYW5nZVwiLCB7IHNlbGVjdGVkOiBbXSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLy8gU2Nyb2xsaW5nIG1ldGhvZHNcbiAgICAgIHNjcm9sbFRvSW5kZXg6IChcbiAgICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgICAgYWxpZ25tZW50OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiA9IFwic3RhcnRcIixcbiAgICAgICAgYW5pbWF0ZT86IGJvb2xlYW4sXG4gICAgICApID0+IHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydCkge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb0luZGV4KGluZGV4LCBhbGlnbm1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2Nyb2xsIHRvIGluZGV4IGFuZCBzZWxlY3QgaXRlbSBhZnRlciBkYXRhIGxvYWRzXG4gICAgICAgKiBVc2VmdWwgZm9yIHJ1bnRpbWUgc2Nyb2xsK3NlbGVjdCB3aGVuIFZMaXN0IGlzIGFscmVhZHkgY3JlYXRlZFxuICAgICAgICovXG4gICAgICBzY3JvbGxUb0luZGV4QW5kU2VsZWN0OiBhc3luYyBmdW5jdGlvbiAoXG4gICAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgICAgIHNlbGVjdElkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgICAgIGFsaWdubWVudDogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIsXG4gICAgICApIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydCkge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb0luZGV4KGluZGV4LCBhbGlnbm1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTGlzdGVuIGZvciByYW5nZSBsb2FkIHRvIGNvbXBsZXRlLCB0aGVuIHNlbGVjdFxuICAgICAgICBjb25zdCBvblJhbmdlTG9hZGVkID0gKCkgPT4ge1xuICAgICAgICAgIGNvbXBvbmVudC5vZmY/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCBvblJhbmdlTG9hZGVkKTtcbiAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5zZWxlY3RCeUlkKSB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudC5zZWxlY3RCeUlkKHNlbGVjdElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCBvblJhbmdlTG9hZGVkKTtcblxuICAgICAgICAvLyBGYWxsYmFjayB0aW1lb3V0IGluIGNhc2UgZXZlbnQgZG9lc24ndCBmaXJlIChkYXRhIGFscmVhZHkgbG9hZGVkKVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb21wb25lbnQub2ZmPy4oXCJ2aWV3cG9ydDpyYW5nZS1sb2FkZWRcIiwgb25SYW5nZUxvYWRlZCk7XG4gICAgICAgICAgaWYgKGNvbXBvbmVudC5zZWxlY3RCeUlkKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuc2VsZWN0QnlJZChzZWxlY3RJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAzMDApO1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH0sXG5cbiAgICAgIHNjcm9sbFRvSXRlbTogYXN5bmMgZnVuY3Rpb24gKFxuICAgICAgICBpdGVtSWQ6IHN0cmluZyxcbiAgICAgICAgYWxpZ25tZW50OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiA9IFwic3RhcnRcIixcbiAgICAgICAgYW5pbWF0ZT86IGJvb2xlYW4sXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gaXRlbXMuZmluZEluZGV4KFxuICAgICAgICAgIChpdGVtOiBhbnkpID0+IFN0cmluZyhpdGVtLmlkKSA9PT0gU3RyaW5nKGl0ZW1JZCksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxUb0luZGV4KGluZGV4LCBhbGlnbm1lbnQsIGFuaW1hdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS53YXJuKGBJdGVtICR7aXRlbUlkfSBub3QgZm91bmRgKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfSxcblxuICAgICAgc2Nyb2xsVG9Ub3A6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsVG9JbmRleCgwLCBcInN0YXJ0XCIpO1xuICAgICAgfSxcblxuICAgICAgc2Nyb2xsVG9Cb3R0b206IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9IHRoaXMuZ2V0SXRlbUNvdW50KCk7XG4gICAgICAgIGlmICh0b3RhbEl0ZW1zID4gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNjcm9sbFRvSW5kZXgodG90YWxJdGVtcyAtIDEsIFwiZW5kXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH0sXG5cbiAgICAgIHNjcm9sbFRvUGFnZTogYXN5bmMgZnVuY3Rpb24gKFxuICAgICAgICBwYWdlTnVtOiBudW1iZXIsXG4gICAgICAgIGFsaWdubWVudDogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIsXG4gICAgICAgIGFuaW1hdGU/OiBib29sZWFuLFxuICAgICAgKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBbVkxpc3RdIHNjcm9sbFRvUGFnZSgke3BhZ2VOdW19KWApO1xuXG4gICAgICAgIC8vIEdldCBsaW1pdCBmcm9tIGNvbmZpZyAocmFuZ2VTaXplKSBvciBkZWZhdWx0XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gY29uZmlnLnBhZ2luYXRpb24/LmxpbWl0IHx8IDIwO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGluIGN1cnNvciBtb2RlXG4gICAgICAgIGlmIChjb25maWcucGFnaW5hdGlvbj8uc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIpIHtcbiAgICAgICAgICAvLyBJbiBjdXJzb3IgbW9kZSwgd2UgbmVlZCB0byBoYW5kbGUgc2VxdWVudGlhbCBsb2FkaW5nXG4gICAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KT8uY29sbGVjdGlvbjtcbiAgICAgICAgICBpZiAoY29sbGVjdGlvbikge1xuICAgICAgICAgICAgY29uc3QgbG9hZGVkUmFuZ2VzID0gY29sbGVjdGlvbi5nZXRMb2FkZWRSYW5nZXMoKTtcbiAgICAgICAgICAgIGNvbnN0IGhpZ2hlc3RMb2FkZWRQYWdlID0gbG9hZGVkUmFuZ2VzLnNpemU7XG5cbiAgICAgICAgICAgIGlmIChwYWdlTnVtID4gaGlnaGVzdExvYWRlZFBhZ2UgKyAxKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICBgW1ZMaXN0XSBDYW5ub3QganVtcCB0byBwYWdlICR7cGFnZU51bX0gaW4gY3Vyc29yIG1vZGUuIGAgK1xuICAgICAgICAgICAgICAgICAgYExvYWRpbmcgcGFnZXMgc2VxdWVudGlhbGx5IGZyb20gJHtcbiAgICAgICAgICAgICAgICAgICAgaGlnaGVzdExvYWRlZFBhZ2UgKyAxXG4gICAgICAgICAgICAgICAgICB9IHRvICR7cGFnZU51bX1gLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVzZSB2aWV3cG9ydCdzIHNjcm9sbFRvUGFnZSBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KT8uc2Nyb2xsVG9QYWdlKSB7XG4gICAgICAgICAgKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLnNjcm9sbFRvUGFnZShwYWdlTnVtLCBsaW1pdCwgYWxpZ25tZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBzY3JvbGxUb0luZGV4XG4gICAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSAocGFnZU51bSAtIDEpICogbGltaXQ7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxUb0luZGV4KHRhcmdldEluZGV4LCBhbGlnbm1lbnQpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBnZXRTY3JvbGxQb3NpdGlvbjogKCkgPT4ge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LnZpZXdwb3J0Py5nZXRTY3JvbGxQb3NpdGlvbigpIHx8IDA7XG4gICAgICB9LFxuXG4gICAgICBnZXRDdXJyZW50Q3Vyc29yOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSk/LmNvbGxlY3Rpb247XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uPy5nZXRDdXJyZW50Q3Vyc29yPy4oKSB8fCBudWxsO1xuICAgICAgfSxcblxuICAgICAgc2V0U2Nyb2xsQW5pbWF0aW9uKGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgLy8gU3RvcmUgYW5pbWF0aW9uIHByZWZlcmVuY2UgKHdvdWxkIGJlIHVzZWQgYnkgdmlld3BvcnQgc2Nyb2xsaW5nIGZlYXR1cmUpXG4gICAgICAgIGNvbXBvbmVudC5zY3JvbGxBbmltYXRpb24gPSBlbmFibGVkO1xuICAgICAgfSxcblxuICAgICAgLy8gU3RhdGVcbiAgICAgIGdldFN0YXRlKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGl0ZW1zOiB0aGlzLmdldEl0ZW1zKCksXG4gICAgICAgICAgdG90YWxJdGVtczogY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uXG4gICAgICAgICAgICA/IGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmdldFRvdGFsSXRlbXMoKVxuICAgICAgICAgICAgOiBjb21wb25lbnQudG90YWxJdGVtcyB8fCAwLFxuICAgICAgICAgIHZpc2libGVSYW5nZTogY29tcG9uZW50LnZpZXdwb3J0Py5nZXRWaXNpYmxlUmFuZ2UoKSB8fCB7XG4gICAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICAgIGVuZDogMCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uOiBjb21wb25lbnQudmlld3BvcnQ/LmdldFNjcm9sbFBvc2l0aW9uKCkgfHwgMCxcbiAgICAgICAgICBzZWxlY3RlZElkczogdGhpcy5nZXRTZWxlY3RlZElkcygpLFxuICAgICAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmcoKSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIExpZmVjeWNsZVxuICAgICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uZGVzdHJveSkge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgc2VsZWN0ZWRJZHMuY2xlYXIoKTtcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImRlc3Ryb3llZFwiKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbn07XG4iLAogICAgIi8qKlxuICogbXRybC1hZGRvbnMgTGlzdCBDb21wb25lbnQgQ29uc3RhbnRzXG4gKlxuICogQ29uc3RhbnRzIGZvciB0aGUgYWRkb25zIGxpc3QgY29tcG9uZW50LlxuICogTm90ZTogQmFzZSBtdHJsIGxpc3QgZnVuY3Rpb25hbGl0eSBpcyBoYW5kbGVkIGJ5IG10cmwgY29yZS5cbiAqIFRoZXNlIGNvbnN0YW50cyBhcmUgZm9yIGFkZG9ucy1zcGVjaWZpYyBmZWF0dXJlcyBvbmx5LlxuICovXG5cbi8qKlxuICogQ1NTIGNsYXNzIG5hbWVzIGZvciBWTGlzdCBjb21wb25lbnRcbiAqIEZvbGxvd2luZyBCRU0gY29udmVudGlvbjogY29tcG9uZW50X19lbGVtZW50LS1tb2RpZmllclxuICogTm90ZTogbXRybCBwcmVmaXggaXMgYWRkZWQgYXV0b21hdGljYWxseSBieSBjb3JlIERPTSBjbGFzc2VzIHN5c3RlbVxuICovXG5leHBvcnQgY29uc3QgVkxJU1RfQ0xBU1NFUyA9IHtcbiAgLyoqIExpc3QgZWxlbWVudCAqL1xuICBMSVNUOiBcInZsaXN0XCIsXG4gIC8qKiBMaXN0IGl0ZW0gKi9cbiAgSVRFTTogXCJ2aWV3cG9ydC1pdGVtXCIsXG4gIC8qKiBTZWxlY3RlZCBsaXN0IGl0ZW0gKi9cbiAgU0VMRUNURUQ6IFwidmlld3BvcnQtaXRlbS0tc2VsZWN0ZWRcIixcbiAgLyoqIEVtcHR5IHN0YXRlICovXG4gIEVNUFRZOiBcInZsaXN0LS1lbXB0eVwiLFxuICAvKiogU2Nyb2xsZWQgc3RhdGUgLSBsaXN0IGlzIG5vdCBhdCB0aGUgdG9wICovXG4gIFNDUk9MTEVEOiBcInZsaXN0LS1zY3JvbGxlZFwiLFxufSBhcyBjb25zdDtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvdmxpc3QvZmVhdHVyZXMvc2VsZWN0aW9uLnRzXG5cbmltcG9ydCB0eXBlIHsgVkxpc3RDb25maWcsIFZMaXN0Q29tcG9uZW50LCBWTGlzdEl0ZW0gfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZMSVNUX0NMQVNTRVMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBQUkVGSVgsIGFkZENsYXNzLCByZW1vdmVDbGFzcyB9IGZyb20gXCJtdHJsXCI7XG5cbi8qKlxuICogU2VsZWN0aW9uIHN0YXRlIGludGVyZmFjZVxuICovXG5pbnRlcmZhY2UgU2VsZWN0aW9uU3RhdGUge1xuICBzZWxlY3RlZElkczogU2V0PHN0cmluZyB8IG51bWJlcj47XG4gIG1vZGU6IFwibm9uZVwiIHwgXCJzaW5nbGVcIiB8IFwibXVsdGlwbGVcIjtcbiAgbGFzdFNlbGVjdGVkSW5kZXg/OiBudW1iZXI7XG59XG5cbi8qKlxuICogR2V0IGl0ZW0gSUQgZnJvbSBlbGVtZW50IG9yIGl0ZW0gZGF0YVxuICovXG5jb25zdCBnZXRJdGVtSWQgPSAoaXRlbTogYW55KTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKGl0ZW0/LmlkICE9PSB1bmRlZmluZWQpIHJldHVybiBpdGVtLmlkO1xuICBpZiAoaXRlbT8uX2lkICE9PSB1bmRlZmluZWQpIHJldHVybiBpdGVtLl9pZDtcbiAgaWYgKHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBpdGVtID09PSBcIm51bWJlclwiKSByZXR1cm4gaXRlbTtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbi8qKlxuICogQWRkcyBzZWxlY3Rpb24gbWFuYWdlbWVudCBjYXBhYmlsaXRpZXMgdG8gVkxpc3QgY29tcG9uZW50XG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoU2VsZWN0aW9uID0gPFQgZXh0ZW5kcyBWTGlzdEl0ZW0gPSBWTGlzdEl0ZW0+KFxuICBjb25maWc6IFZMaXN0Q29uZmlnPFQ+LFxuKSA9PiB7XG4gIHJldHVybiAoY29tcG9uZW50OiBWTGlzdENvbXBvbmVudDxUPik6IFZMaXN0Q29tcG9uZW50PFQ+ID0+IHtcbiAgICBpZiAoIWNvbmZpZy5zZWxlY3Rpb24/LmVuYWJsZWQgfHwgY29uZmlnLnNlbGVjdGlvbj8ubW9kZSA9PT0gXCJub25lXCIpIHtcbiAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdGU6IFNlbGVjdGlvblN0YXRlID0ge1xuICAgICAgc2VsZWN0ZWRJZHM6IG5ldyBTZXQoKSxcbiAgICAgIG1vZGU6IGNvbmZpZy5zZWxlY3Rpb24/Lm1vZGUgfHwgXCJzaW5nbGVcIixcbiAgICAgIGxhc3RTZWxlY3RlZEluZGV4OiB1bmRlZmluZWQsXG4gICAgfTtcblxuICAgIGNvbnN0IHJlcXVpcmVNb2RpZmllcnMgPSBjb25maWcuc2VsZWN0aW9uPy5yZXF1aXJlTW9kaWZpZXJzID8/IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQXBwbHkgc2VsZWN0aW9uIGNsYXNzIHRvIHJlbmRlcmVkIGVsZW1lbnRzIG1hdGNoaW5nIHNlbGVjdGVkIElEc1xuICAgICAqL1xuICAgIGNvbnN0IGFwcGx5U2VsZWN0aW9uVG9FbGVtZW50cyA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGNvbXBvbmVudC5lbGVtZW50Py5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBgLiR7UFJFRklYfS12aWV3cG9ydC1pdGVtc2AsXG4gICAgICApO1xuICAgICAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICAgICAgY29uc3QgaXRlbXMgPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgYC4ke1BSRUZJWH0tdmlld3BvcnQtaXRlbVtkYXRhLWlkXWAsXG4gICAgICApO1xuXG4gICAgICBpdGVtcy5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gZWwgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGlkID0gZWxlbWVudC5kYXRhc2V0LmlkO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIENoZWNrIGJvdGggc3RyaW5nIGFuZCBudW1iZXIgdmVyc2lvbnMgb2YgdGhlIElEXG4gICAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoaWQpIHx8IHN0YXRlLnNlbGVjdGVkSWRzLmhhcyhOdW1iZXIoaWQpKTtcbiAgICAgICAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgVkxJU1RfQ0xBU1NFUy5TRUxFQ1RFRCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIFZMSVNUX0NMQVNTRVMuU0VMRUNURUQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBpdGVtIGNsaWNrIGZvciBzZWxlY3Rpb25cbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVJdGVtQ2xpY2sgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgY29uc3Qgdmlld3BvcnRJdGVtID0gKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFxuICAgICAgICBgLiR7UFJFRklYfS12aWV3cG9ydC1pdGVtW2RhdGEtaW5kZXhdYCxcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBpZiAoIXZpZXdwb3J0SXRlbSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KHZpZXdwb3J0SXRlbS5kYXRhc2V0LmluZGV4IHx8IFwiLTFcIik7XG4gICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGVuaGFuY2VkQ29tcG9uZW50ID0gY29tcG9uZW50IGFzIGFueTtcbiAgICAgIGNvbnN0IGl0ZW1zID0gZW5oYW5jZWRDb21wb25lbnQuZ2V0SXRlbXM/LigpO1xuICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zPy5baW5kZXhdO1xuICAgICAgaWYgKCFpdGVtKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGl0ZW1JZCA9IGdldEl0ZW1JZChpdGVtKTtcbiAgICAgIGlmIChpdGVtSWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB3YXNTZWxlY3RlZCA9IHN0YXRlLnNlbGVjdGVkSWRzLmhhcyhpdGVtSWQpO1xuXG4gICAgICBpZiAoc3RhdGUubW9kZSA9PT0gXCJzaW5nbGVcIikge1xuICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5jbGVhcigpO1xuICAgICAgICBpZiAoIXdhc1NlbGVjdGVkKSB7XG4gICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuYWRkKGl0ZW1JZCk7XG4gICAgICAgICAgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggPSBpbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5tb2RlID09PSBcIm11bHRpcGxlXCIpIHtcbiAgICAgICAgaWYgKGUuc2hpZnRLZXkgJiYgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5taW4oc3RhdGUubGFzdFNlbGVjdGVkSW5kZXgsIGluZGV4KTtcbiAgICAgICAgICBjb25zdCBlbmQgPSBNYXRoLm1heChzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCwgaW5kZXgpO1xuXG4gICAgICAgICAgaWYgKCFlLmN0cmxLZXkgJiYgIWUubWV0YUtleSkge1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuY2xlYXIoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlSXRlbSA9IGl0ZW1zPy5baV07XG4gICAgICAgICAgICBjb25zdCByYW5nZUl0ZW1JZCA9IGdldEl0ZW1JZChyYW5nZUl0ZW0pO1xuICAgICAgICAgICAgaWYgKHJhbmdlSXRlbUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuYWRkKHJhbmdlSXRlbUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZS5jdHJsS2V5IHx8IGUubWV0YUtleSkge1xuICAgICAgICAgIGlmICh3YXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuZGVsZXRlKGl0ZW1JZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmFkZChpdGVtSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9IGluZGV4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChyZXF1aXJlTW9kaWZpZXJzKSB7XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5jbGVhcigpO1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuYWRkKGl0ZW1JZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh3YXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5kZWxldGUoaXRlbUlkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmFkZChpdGVtSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9IGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGFwcGx5U2VsZWN0aW9uVG9FbGVtZW50cygpO1xuICAgICAgZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBFbWl0IHNlbGVjdGlvbiBjaGFuZ2UgZXZlbnRcbiAgICAgKi9cbiAgICBjb25zdCBlbWl0U2VsZWN0aW9uQ2hhbmdlID0gKCkgPT4ge1xuICAgICAgY29uc3QgZW5oYW5jZWRDb21wb25lbnQgPSBjb21wb25lbnQgYXMgYW55O1xuICAgICAgY29uc3QgaXRlbXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRJdGVtcz8uKCkgfHwgW107XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbXMgPSBpdGVtcy5maWx0ZXIoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IGdldEl0ZW1JZChpdGVtKTtcbiAgICAgICAgcmV0dXJuIGlkICE9PSB1bmRlZmluZWQgJiYgc3RhdGUuc2VsZWN0ZWRJZHMuaGFzKGlkKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzZWxlY3RlZEluZGljZXMgPSBpdGVtcy5yZWR1Y2UoXG4gICAgICAgIChhY2M6IG51bWJlcltdLCBpdGVtOiBhbnksIGlkeDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgY29uc3QgaWQgPSBnZXRJdGVtSWQoaXRlbSk7XG4gICAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQgJiYgc3RhdGUuc2VsZWN0ZWRJZHMuaGFzKGlkKSkge1xuICAgICAgICAgICAgYWNjLnB1c2goaWR4KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSxcbiAgICAgICAgW10gYXMgbnVtYmVyW10sXG4gICAgICApO1xuXG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwic2VsZWN0aW9uOmNoYW5nZVwiLCB7IHNlbGVjdGVkSXRlbXMsIHNlbGVjdGVkSW5kaWNlcyB9KTtcblxuICAgICAgaWYgKGNvbmZpZy5zZWxlY3Rpb24/Lm9uU2VsZWN0aW9uQ2hhbmdlKSB7XG4gICAgICAgIGNvbmZpZy5zZWxlY3Rpb24ub25TZWxlY3Rpb25DaGFuZ2Uoc2VsZWN0ZWRJdGVtcywgc2VsZWN0ZWRJbmRpY2VzKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gU2V0dXA6IGxpc3RlbiBmb3IgcmVuZGVycyBhbmQgY2xpY2tzXG4gICAgY29uc3Qgc2V0dXAgPSAoKSA9PiB7XG4gICAgICAvLyBBZGQgbW9kZSBjbGFzcyB0byBjb250YWluZXJcbiAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICBhZGRDbGFzcyhjb21wb25lbnQuZWxlbWVudCwgXCJ2bGlzdC0tc2VsZWN0aW9uXCIpO1xuICAgICAgICBhZGRDbGFzcyhjb21wb25lbnQuZWxlbWVudCwgYHZsaXN0LS1zZWxlY3Rpb24tJHtzdGF0ZS5tb2RlfWApO1xuICAgICAgICBjb21wb25lbnQuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlSXRlbUNsaWNrLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgc2VsZWN0aW9uIGFmdGVyIGVhY2ggcmVuZGVyXG4gICAgICAoY29tcG9uZW50IGFzIGFueSkub24/LihcbiAgICAgICAgXCJ2aWV3cG9ydDppdGVtcy1yZW5kZXJlZFwiLFxuICAgICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMsXG4gICAgICApO1xuICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLm9uPy4oXCJ2aWV3cG9ydDpyZW5kZXJlZFwiLCBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMpO1xuXG4gICAgICAvLyBDbGVhbiB1cCBzZWxlY3Rpb24gd2hlbiBpdGVtIGlzIHJlbW92ZWRcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5vbj8uKFxuICAgICAgICBcIml0ZW06cmVtb3ZlZFwiLFxuICAgICAgICAoZGF0YTogeyBpdGVtOiBhbnk7IGluZGV4OiBudW1iZXIgfSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGl0ZW1JZCA9IGdldEl0ZW1JZChkYXRhLml0ZW0pO1xuICAgICAgICAgIGlmIChpdGVtSWQgIT09IHVuZGVmaW5lZCAmJiBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoaXRlbUlkKSkge1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuZGVsZXRlKGl0ZW1JZCk7XG4gICAgICAgICAgICAvLyBJZiB0aGUgcmVtb3ZlZCBpdGVtIHdhcyB0aGUgbGFzdCBzZWxlY3RlZCBpbmRleCwgY2xlYXIgaXRcbiAgICAgICAgICAgIGlmIChzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9PT0gZGF0YS5pbmRleCkge1xuICAgICAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggPiBkYXRhLmluZGV4XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgLy8gQWRqdXN0IGxhc3RTZWxlY3RlZEluZGV4IHNpbmNlIGl0ZW1zIHNoaWZ0ZWQgZG93blxuICAgICAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleC0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemUgYWZ0ZXIgY29tcG9uZW50IGlzIHJlYWR5XG4gICAgc2V0VGltZW91dChzZXR1cCwgMCk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIGluaXRpYWwgbG9hZCBjb21wbGV0ZSB0byBhdXRvLXNlbGVjdCBpdGVtXG4gICAgLy8gVGhpcyBtdXN0IGJlIGluIHdpdGhTZWxlY3Rpb24gYmVjYXVzZSBzZWxlY3RCeUlkIGlzIGRlZmluZWQgaGVyZVxuICAgIChjb21wb25lbnQgYXMgYW55KS5vbj8uKFxuICAgICAgXCJjb2xsZWN0aW9uOmluaXRpYWwtbG9hZC1jb21wbGV0ZVwiLFxuICAgICAgKGRhdGE6IHsgc2VsZWN0SWQ6IHN0cmluZyB8IG51bWJlciB9KSA9PiB7XG4gICAgICAgIGlmIChkYXRhPy5zZWxlY3RJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gVXNlIHJlcXVlc3RBbmltYXRpb25GcmFtZSB0byBlbnN1cmUgcmVuZGVyaW5nIGlzIGNvbXBsZXRlXG4gICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5tb2RlID09PSBcInNpbmdsZVwiKSB7XG4gICAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmNsZWFyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5hZGQoZGF0YS5zZWxlY3RJZCk7XG4gICAgICAgICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMoKTtcbiAgICAgICAgICAgIGVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gQ2xlYW51cCBvbiBkZXN0cm95XG4gICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmRlc3Ryb3k7XG4gICAgY29tcG9uZW50LmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICBjb21wb25lbnQuZWxlbWVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUl0ZW1DbGljaywgdHJ1ZSk7XG4gICAgICBvcmlnaW5hbERlc3Ryb3k/LigpO1xuICAgIH07XG5cbiAgICAvLyBFbmhhbmNlZCBjb21wb25lbnQgd2l0aCBzZWxlY3Rpb24gQVBJXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcblxuICAgICAgc2VsZWN0SXRlbXMoaW5kaWNlczogbnVtYmVyW10pIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSAodGhpcyBhcyBhbnkpLmdldEl0ZW1zPy4oKTtcbiAgICAgICAgaWYgKCFpdGVtcykgcmV0dXJuO1xuXG4gICAgICAgIGlmIChzdGF0ZS5tb2RlID09PSBcInNpbmdsZVwiKSB7XG4gICAgICAgICAgLy8gSW4gc2luZ2xlIG1vZGUsIGNsZWFyIHByZXZpb3VzIHNlbGVjdGlvbiBiZWZvcmUgYWRkaW5nIG5ldyBvbmVcbiAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5jbGVhcigpO1xuICAgICAgICAgIGlmIChpbmRpY2VzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGluZGljZXMgPSBbaW5kaWNlc1swXV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaW5kaWNlcy5mb3JFYWNoKChpbmRleCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGl0ZW1JZCA9IGdldEl0ZW1JZChpdGVtc1tpbmRleF0pO1xuICAgICAgICAgIGlmIChpdGVtSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuYWRkKGl0ZW1JZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaW5kaWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggPSBpbmRpY2VzW2luZGljZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIH1cblxuICAgICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMoKTtcbiAgICAgICAgZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgfSxcblxuICAgICAgZGVzZWxlY3RJdGVtcyhpbmRpY2VzOiBudW1iZXJbXSkge1xuICAgICAgICBjb25zdCBpdGVtcyA9ICh0aGlzIGFzIGFueSkuZ2V0SXRlbXM/LigpO1xuICAgICAgICBpZiAoIWl0ZW1zKSByZXR1cm47XG5cbiAgICAgICAgaW5kaWNlcy5mb3JFYWNoKChpbmRleCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGl0ZW1JZCA9IGdldEl0ZW1JZChpdGVtc1tpbmRleF0pO1xuICAgICAgICAgIGlmIChpdGVtSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuZGVsZXRlKGl0ZW1JZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMoKTtcbiAgICAgICAgZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgfSxcblxuICAgICAgY2xlYXJTZWxlY3Rpb24oKSB7XG4gICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmNsZWFyKCk7XG4gICAgICAgIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ID0gdW5kZWZpbmVkO1xuICAgICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMoKTtcbiAgICAgICAgZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgfSxcblxuICAgICAgZ2V0U2VsZWN0ZWRJdGVtcygpOiBUW10ge1xuICAgICAgICBjb25zdCBpdGVtcyA9ICh0aGlzIGFzIGFueSkuZ2V0SXRlbXM/LigpIHx8IFtdO1xuICAgICAgICByZXR1cm4gaXRlbXMuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBpZCA9IGdldEl0ZW1JZChpdGVtKTtcbiAgICAgICAgICByZXR1cm4gaWQgIT09IHVuZGVmaW5lZCAmJiBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoaWQpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG5cbiAgICAgIGdldFNlbGVjdGVkSW5kaWNlcygpOiBudW1iZXJbXSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gKHRoaXMgYXMgYW55KS5nZXRJdGVtcz8uKCkgfHwgW107XG4gICAgICAgIHJldHVybiBpdGVtcy5yZWR1Y2UoKGFjYzogbnVtYmVyW10sIGl0ZW06IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkID0gZ2V0SXRlbUlkKGl0ZW0pO1xuICAgICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkICYmIHN0YXRlLnNlbGVjdGVkSWRzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKGluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwgW10gYXMgbnVtYmVyW10pO1xuICAgICAgfSxcblxuICAgICAgaXNTZWxlY3RlZChpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gKHRoaXMgYXMgYW55KS5nZXRJdGVtcz8uKCk7XG4gICAgICAgIGNvbnN0IGl0ZW1JZCA9IGdldEl0ZW1JZChpdGVtcz8uW2luZGV4XSk7XG4gICAgICAgIHJldHVybiBpdGVtSWQgIT09IHVuZGVmaW5lZCAmJiBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoaXRlbUlkKTtcbiAgICAgIH0sXG5cbiAgICAgIHNlbGVjdEJ5SWQoaWQ6IHN0cmluZyB8IG51bWJlciwgc2lsZW50OiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAoc3RhdGUubW9kZSA9PT0gXCJzaW5nbGVcIikge1xuICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmNsZWFyKCk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5hZGQoaWQpO1xuICAgICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMoKTtcbiAgICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgICBlbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENoZWNrIGlmIGFuIGl0ZW0gYXQgaW5kZXggaXMgZnVsbHkgdmlzaWJsZSBpbiB0aGUgdmlld3BvcnRcbiAgICAgICAqIFVzZXMgRE9NIGVsZW1lbnQgcG9zaXRpb24gZm9yIHByZWNpc2UgY2hlY2tpbmdcbiAgICAgICAqL1xuICAgICAgaXNJdGVtRnVsbHlWaXNpYmxlKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gY29tcG9uZW50LmVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgYC4ke1BSRUZJWH0tdmlld3BvcnQtaXRlbXNgLFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0ID0gY29tcG9uZW50LmVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgYC4ke1BSRUZJWH0tdmlld3BvcnRgLFxuICAgICAgICApO1xuICAgICAgICBpZiAoIXZpZXdwb3J0KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgaXRlbUVsZW1lbnQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICBgLiR7UFJFRklYfS12aWV3cG9ydC1pdGVtW2RhdGEtaW5kZXg9XCIke2luZGV4fVwiXWAsXG4gICAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICghaXRlbUVsZW1lbnQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCB2aWV3cG9ydFJlY3QgPSB2aWV3cG9ydC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgaXRlbVJlY3QgPSBpdGVtRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAvLyBDaGVjayBpZiBpdGVtIGlzIGZ1bGx5IHdpdGhpbiB2aWV3cG9ydCBib3VuZHNcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBpdGVtUmVjdC50b3AgPj0gdmlld3BvcnRSZWN0LnRvcCAmJlxuICAgICAgICAgIGl0ZW1SZWN0LmJvdHRvbSA8PSB2aWV3cG9ydFJlY3QuYm90dG9tXG4gICAgICAgICk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNlbGVjdCBpdGVtIGF0IGluZGV4LCBzY3JvbGxpbmcgYW5kIHdhaXRpbmcgZm9yIGRhdGEgaWYgbmVlZGVkXG4gICAgICAgKiBIYW5kbGVzIHZpcnR1YWwgc2Nyb2xsaW5nIGJ5IGxvYWRpbmcgZGF0YSBiZWZvcmUgc2VsZWN0aW5nXG4gICAgICAgKiBVc2VzIHByZWNpc2UgRE9NLWJhc2VkIHZpc2liaWxpdHkgY2hlY2tcbiAgICAgICAqL1xuICAgICAgYXN5bmMgc2VsZWN0QXRJbmRleChpbmRleDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGVuaGFuY2VkQ29tcG9uZW50ID0gY29tcG9uZW50IGFzIGFueTtcbiAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1Db3VudD8uKCkgfHwgMDtcblxuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRvdGFsSXRlbXMpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgY3VycmVudCBzZWxlY3Rpb24gdG8gZGV0ZXJtaW5lIG5hdmlnYXRpb24gZGlyZWN0aW9uXG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRpY2VzID0gdGhpcy5nZXRTZWxlY3RlZEluZGljZXMoKTtcbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gY3VycmVudEluZGljZXMubGVuZ3RoID4gMCA/IGN1cnJlbnRJbmRpY2VzWzBdIDogLTE7XG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGluZGV4ID4gY3VycmVudEluZGV4ID8gXCJkb3duXCIgOiBcInVwXCI7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgaXRlbSBpcyBmdWxseSB2aXNpYmxlIHVzaW5nIHByZWNpc2UgRE9NIGNoZWNrXG4gICAgICAgIGNvbnN0IGlzRnVsbHlWaXNpYmxlID0gdGhpcy5pc0l0ZW1GdWxseVZpc2libGUoaW5kZXgpO1xuXG4gICAgICAgIGlmICghaXNGdWxseVZpc2libGUgJiYgZW5oYW5jZWRDb21wb25lbnQudmlld3BvcnQ/LnNjcm9sbFRvSW5kZXgpIHtcbiAgICAgICAgICAvLyBTY3JvbGwgd2l0aCBhbGlnbm1lbnQgYmFzZWQgb24gbmF2aWdhdGlvbiBkaXJlY3Rpb25cbiAgICAgICAgICAvLyBEb3duIG5hdmlnYXRpb246IGFsaWduIHRvIGVuZCAoaXRlbSBhdCBib3R0b20pXG4gICAgICAgICAgLy8gVXAgbmF2aWdhdGlvbjogYWxpZ24gdG8gc3RhcnQgKGl0ZW0gYXQgdG9wKVxuICAgICAgICAgIGNvbnN0IGFsaWdubWVudCA9IGRpcmVjdGlvbiA9PT0gXCJkb3duXCIgPyBcImVuZFwiIDogXCJzdGFydFwiO1xuICAgICAgICAgIGVuaGFuY2VkQ29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbFRvSW5kZXgoaW5kZXgsIGFsaWdubWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcnkgdG8gc2VsZWN0IGltbWVkaWF0ZWx5IC0gd29ya3MgaWYgaXRlbSBpcyBhbHJlYWR5IGxvYWRlZFxuICAgICAgICBjb25zdCBpdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1zPy4oKSB8fCBbXTtcbiAgICAgICAgaWYgKGl0ZW1zW2luZGV4XSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbXMoW2luZGV4XSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJdGVtIG5vdCBsb2FkZWQgeWV0IC0gd2FpdCBmb3IgZGF0YSB0byBsb2FkIHRoZW4gc2VsZWN0XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIGxldCByZXNvbHZlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgY29uc3Qgb25SYW5nZUxvYWRlZCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuO1xuICAgICAgICAgICAgcmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgICAgY29tcG9uZW50Lm9mZj8uKFwidmlld3BvcnQ6cmFuZ2UtbG9hZGVkXCIsIG9uUmFuZ2VMb2FkZWQpO1xuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtcyhbaW5kZXhdKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCBvblJhbmdlTG9hZGVkKTtcblxuICAgICAgICAgIC8vIEZhbGxiYWNrIHRpbWVvdXQgaW4gY2FzZSBldmVudCBkb2Vzbid0IGZpcmUgKGRhdGEgYWxyZWFkeSBsb2FkZWQpXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzb2x2ZWQpIHJldHVybjtcbiAgICAgICAgICAgIHJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5vZmY/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCBvblJhbmdlTG9hZGVkKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbXMoW2luZGV4XSk7XG4gICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgIH0sIDMwMCk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTZWxlY3QgbmV4dCBpdGVtIHJlbGF0aXZlIHRvIGN1cnJlbnQgc2VsZWN0aW9uXG4gICAgICAgKiBIYW5kbGVzIHZpcnR1YWwgc2Nyb2xsaW5nIGJ5IGxvYWRpbmcgZGF0YSBiZWZvcmUgc2VsZWN0aW5nXG4gICAgICAgKiBSZXNwZWN0cyBrZXlib2FyZC53cmFwIG9wdGlvbiBmb3Igd3JhcHBpbmcgYXQgbGlzdCBib3VuZGFyaWVzXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIHNlbGVjdE5leHQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGVuaGFuY2VkQ29tcG9uZW50ID0gY29tcG9uZW50IGFzIGFueTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJbmRpY2VzID0gdGhpcy5nZXRTZWxlY3RlZEluZGljZXMoKTtcbiAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1Db3VudD8uKCkgfHwgMDtcbiAgICAgICAgY29uc3Qgd3JhcCA9IGNvbmZpZy5rZXlib2FyZD8ud3JhcCA/PyB0cnVlOyAvLyBNRDMgZGVmYXVsdCBpcyB0cnVlXG5cbiAgICAgICAgaWYgKHNlbGVjdGVkSW5kaWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAvLyBTZWxlY3QgZmlyc3QgaXRlbVxuICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdEF0SW5kZXgoMCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSBzZWxlY3RlZEluZGljZXNbMF07XG4gICAgICAgIGNvbnN0IG5leHRJbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XG5cbiAgICAgICAgaWYgKG5leHRJbmRleCA8IHRvdGFsSXRlbXMpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RBdEluZGV4KG5leHRJbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBdCB0aGUgZW5kIC0gd3JhcCB0byBiZWdpbm5pbmcgaWYgZW5hYmxlZFxuICAgICAgICBpZiAod3JhcCAmJiB0b3RhbEl0ZW1zID4gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdEF0SW5kZXgoMCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNlbGVjdCBwcmV2aW91cyBpdGVtIHJlbGF0aXZlIHRvIGN1cnJlbnQgc2VsZWN0aW9uXG4gICAgICAgKiBIYW5kbGVzIHZpcnR1YWwgc2Nyb2xsaW5nIGJ5IGxvYWRpbmcgZGF0YSBiZWZvcmUgc2VsZWN0aW5nXG4gICAgICAgKiBSZXNwZWN0cyBrZXlib2FyZC53cmFwIG9wdGlvbiBmb3Igd3JhcHBpbmcgYXQgbGlzdCBib3VuZGFyaWVzXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIHNlbGVjdFByZXZpb3VzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBlbmhhbmNlZENvbXBvbmVudCA9IGNvbXBvbmVudCBhcyBhbnk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSW5kaWNlcyA9IHRoaXMuZ2V0U2VsZWN0ZWRJbmRpY2VzKCk7XG4gICAgICAgIGNvbnN0IHRvdGFsSXRlbXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRJdGVtQ291bnQ/LigpIHx8IDA7XG4gICAgICAgIGNvbnN0IHdyYXAgPSBjb25maWcua2V5Ym9hcmQ/LndyYXAgPz8gdHJ1ZTsgLy8gTUQzIGRlZmF1bHQgaXMgdHJ1ZVxuXG4gICAgICAgIGlmIChzZWxlY3RlZEluZGljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgLy8gSWYgd3JhcCBlbmFibGVkLCBzZWxlY3QgbGFzdCBpdGVtOyBvdGhlcndpc2UgZG8gbm90aGluZ1xuICAgICAgICAgIGlmICh3cmFwICYmIHRvdGFsSXRlbXMgPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RBdEluZGV4KHRvdGFsSXRlbXMgLSAxKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gc2VsZWN0ZWRJbmRpY2VzWzBdO1xuICAgICAgICBjb25zdCBwcmV2SW5kZXggPSBjdXJyZW50SW5kZXggLSAxO1xuXG4gICAgICAgIGlmIChwcmV2SW5kZXggPj0gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdEF0SW5kZXgocHJldkluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEF0IHRoZSBzdGFydCAtIHdyYXAgdG8gZW5kIGlmIGVuYWJsZWRcbiAgICAgICAgaWYgKHdyYXAgJiYgdG90YWxJdGVtcyA+IDApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RBdEluZGV4KHRvdGFsSXRlbXMgLSAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhTZWxlY3Rpb247XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL2tleWJvYXJkLnRzXG5cbi8qKlxuICogS2V5Ym9hcmQgTmF2aWdhdGlvbiBGZWF0dXJlIGZvciBWTGlzdFxuICpcbiAqIEltcGxlbWVudHMgTWF0ZXJpYWwgRGVzaWduIDMgYWNjZXNzaWJpbGl0eSBndWlkZWxpbmVzIGZvciBsaXN0czpcbiAqIC0gQXJyb3cga2V5cyAoVXAvRG93bi9MZWZ0L1JpZ2h0KSBuYXZpZ2F0ZSBiZXR3ZWVuIGl0ZW1zIHdpdGggd3JhcHBpbmdcbiAqIC0gU3BhY2UvRW50ZXIgYWN0aXZhdGVzL3NlbGVjdHMgdGhlIGZvY3VzZWQgaXRlbVxuICogLSBUYWIgbW92ZXMgZm9jdXMgdG8vZnJvbSB0aGUgbGlzdFxuICogLSBIb21lL0VuZCBqdW1wIHRvIGZpcnN0L2xhc3QgaXRlbVxuICogLSBQYWdlIFVwL0Rvd24gc2tpcCBtdWx0aXBsZSBpdGVtc1xuICpcbiAqIEBzZWUgaHR0cHM6Ly9tMy5tYXRlcmlhbC5pby9jb21wb25lbnRzL2xpc3RzL2FjY2Vzc2liaWxpdHlcbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIFZMaXN0Q29uZmlnLFxuICBWTGlzdENvbXBvbmVudCxcbiAgVkxpc3RJdGVtLFxuICBMaXN0S2V5Ym9hcmRDb25maWcsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUFJFRklYLCBhZGRDbGFzcywgcmVtb3ZlQ2xhc3MgfSBmcm9tIFwibXRybFwiO1xuXG4vKipcbiAqIENsYXNzIG5hbWUgZm9yIGtleWJvYXJkIGZvY3VzIHN0eWxpbmdcbiAqL1xuY29uc3QgS0VZQk9BUkRfRk9DVVNfQ0xBU1MgPSBcIm10cmwtdmxpc3QtLWtleWJvYXJkLWZvY3VzXCI7XG5cbi8qKlxuICogQVJJQSByb2xlcyBhbmQgYXR0cmlidXRlcyBmb3IgYWNjZXNzaWJpbGl0eVxuICogRm9sbG93aW5nIE1EMyBXZWIgaW1wbGVtZW50YXRpb246XG4gKiAtIENvbnRhaW5lciByb2xlOiBsaXN0Ym94XG4gKiAtIExpc3QgaXRlbSByb2xlOiBvcHRpb25cbiAqIC0gU3RhdGU6IGFyaWEtc2VsZWN0ZWRcbiAqL1xuY29uc3QgQVJJQSA9IHtcbiAgUk9MRV9MSVNUQk9YOiBcImxpc3Rib3hcIixcbiAgUk9MRV9PUFRJT046IFwib3B0aW9uXCIsXG4gIEFSSUFfQUNUSVZFREVTQ0VOREFOVDogXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIixcbiAgQVJJQV9TRUxFQ1RFRDogXCJhcmlhLXNlbGVjdGVkXCIsXG4gIEFSSUFfTEFCRUw6IFwiYXJpYS1sYWJlbFwiLFxuICBBUklBX01VTFRJU0VMRUNUQUJMRTogXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiLFxufTtcblxuLyoqXG4gKiBHZXQgdGhlIHZpZXdwb3J0IGl0ZW1zIGNvbnRhaW5lclxuICovXG5jb25zdCBnZXRJdGVtc0NvbnRhaW5lciA9IChcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQsXG4pOiBIVE1MRWxlbWVudCB8IG51bGwgPT4ge1xuICByZXR1cm4gZWxlbWVudD8ucXVlcnlTZWxlY3RvcihgLiR7UFJFRklYfS12aWV3cG9ydC1pdGVtc2ApIHx8IG51bGw7XG59O1xuXG4vKipcbiAqIEdldCBhbGwgcmVuZGVyZWQgaXRlbSBlbGVtZW50c1xuICovXG5jb25zdCBnZXRSZW5kZXJlZEl0ZW1zID0gKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsKTogSFRNTEVsZW1lbnRbXSA9PiB7XG4gIGlmICghY29udGFpbmVyKSByZXR1cm4gW107XG4gIHJldHVybiBBcnJheS5mcm9tKFxuICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKGAuJHtQUkVGSVh9LXZpZXdwb3J0LWl0ZW1bZGF0YS1pbmRleF1gKSxcbiAgKTtcbn07XG5cbi8qKlxuICogQWRkcyBrZXlib2FyZCBuYXZpZ2F0aW9uIGFuZCBhY2Nlc3NpYmlsaXR5IHRvIFZMaXN0IGNvbXBvbmVudFxuICovXG5leHBvcnQgY29uc3Qgd2l0aEtleWJvYXJkID0gPFQgZXh0ZW5kcyBWTGlzdEl0ZW0gPSBWTGlzdEl0ZW0+KFxuICBjb25maWc6IFZMaXN0Q29uZmlnPFQ+LFxuKSA9PiB7XG4gIHJldHVybiAoY29tcG9uZW50OiBWTGlzdENvbXBvbmVudDxUPik6IFZMaXN0Q29tcG9uZW50PFQ+ID0+IHtcbiAgICAvLyBPbmx5IGVuYWJsZSBrZXlib2FyZCBpZiBzZWxlY3Rpb24gaXMgZW5hYmxlZFxuICAgIGNvbnN0IHNlbGVjdGlvbkVuYWJsZWQgPVxuICAgICAgY29uZmlnLnNlbGVjdGlvbj8uZW5hYmxlZCAmJiBjb25maWcuc2VsZWN0aW9uPy5tb2RlICE9PSBcIm5vbmVcIjtcbiAgICBjb25zdCBrZXlib2FyZENvbmZpZyA9IGNvbmZpZy5rZXlib2FyZCB8fCB7fTtcbiAgICBjb25zdCBlbmFibGVkID0ga2V5Ym9hcmRDb25maWcuZW5hYmxlZCA/PyBzZWxlY3Rpb25FbmFibGVkO1xuXG4gICAgaWYgKCFlbmFibGVkKSB7XG4gICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIE1EMyBzcGVjaWZpZXMgdGhhdCBhcnJvdyBrZXlzIHNob3VsZCB3cmFwIGJ5IGRlZmF1bHRcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgaG9tZUVuZDoga2V5Ym9hcmRDb25maWcuaG9tZUVuZCA/PyB0cnVlLFxuICAgICAgcGFnZVVwRG93bjoga2V5Ym9hcmRDb25maWcucGFnZVVwRG93biA/PyB0cnVlLFxuICAgICAgcGFnZVNpemU6IGtleWJvYXJkQ29uZmlnLnBhZ2VTaXplID8/IDEwLFxuICAgICAgdHlwZUFoZWFkOiBrZXlib2FyZENvbmZpZy50eXBlQWhlYWQgPz8gZmFsc2UsXG4gICAgICB0eXBlQWhlYWRUaW1lb3V0OiBrZXlib2FyZENvbmZpZy50eXBlQWhlYWRUaW1lb3V0ID8/IDUwMCxcbiAgICAgIHdyYXA6IGtleWJvYXJkQ29uZmlnLndyYXAgPz8gdHJ1ZSwgLy8gTUQzOiB3cmFwcyB0byB0b3AvYm90dG9tXG4gICAgICBvbk5hdmlnYXRlOiBrZXlib2FyZENvbmZpZy5vbk5hdmlnYXRlLFxuICAgIH07XG5cbiAgICAvLyBUeXBlLWFoZWFkIHN0YXRlXG4gICAgbGV0IHR5cGVBaGVhZEJ1ZmZlciA9IFwiXCI7XG4gICAgbGV0IHR5cGVBaGVhZFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gVHJhY2sgaWYgbGFzdCBpbnRlcmFjdGlvbiB3YXMgbW91c2UgKGZvciBmb2N1cyBzdHlsaW5nKVxuICAgIGxldCBsYXN0TW91c2VEb3duVGltZSA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBTZXR1cCBBUklBIGF0dHJpYnV0ZXMgZm9yIGFjY2Vzc2liaWxpdHlcbiAgICAgKi9cbiAgICBjb25zdCBzZXR1cEFjY2Vzc2liaWxpdHkgPSAoKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gY29tcG9uZW50LmVsZW1lbnQ7XG4gICAgICBpZiAoIWVsZW1lbnQpIHJldHVybjtcblxuICAgICAgLy8gU2V0IGxpc3Rib3ggcm9sZSBvbiB0aGUgY29tcG9uZW50XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcInJvbGVcIiwgQVJJQS5ST0xFX0xJU1RCT1gpO1xuXG4gICAgICAvLyBTZXQgbXVsdGlzZWxlY3RhYmxlIGlmIGluIG11bHRpcGxlIHNlbGVjdGlvbiBtb2RlXG4gICAgICBpZiAoY29uZmlnLnNlbGVjdGlvbj8ubW9kZSA9PT0gXCJtdWx0aXBsZVwiKSB7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKEFSSUEuQVJJQV9NVUxUSVNFTEVDVEFCTEUsIFwidHJ1ZVwiKTtcbiAgICAgIH1cblxuICAgICAgLy8gTWFrZSBmb2N1c2FibGVcbiAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIFwiMFwiKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IGFyaWEtbGFiZWwgaWYgbm90IHByZXNlbnRcbiAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoQVJJQS5BUklBX0xBQkVMKSkge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShBUklBLkFSSUFfTEFCRUwsIFwiTGlzdFwiKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIEFSSUEgYXR0cmlidXRlcyBvbiByZW5kZXJlZCBpdGVtc1xuICAgICAqL1xuICAgIGNvbnN0IHVwZGF0ZUl0ZW1BY2Nlc3NpYmlsaXR5ID0gKCkgPT4ge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gZ2V0SXRlbXNDb250YWluZXIoY29tcG9uZW50LmVsZW1lbnQpO1xuICAgICAgY29uc3QgaXRlbXMgPSBnZXRSZW5kZXJlZEl0ZW1zKGNvbnRhaW5lcik7XG4gICAgICBjb25zdCBlbmhhbmNlZENvbXBvbmVudCA9IGNvbXBvbmVudCBhcyBhbnk7XG4gICAgICBjb25zdCBzZWxlY3RlZEluZGljZXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRTZWxlY3RlZEluZGljZXM/LigpIHx8IFtdO1xuXG4gICAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoaXRlbS5kYXRhc2V0LmluZGV4IHx8IFwiLTFcIiwgMTApO1xuICAgICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm47XG5cbiAgICAgICAgLy8gU2V0IG9wdGlvbiByb2xlXG4gICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKFwicm9sZVwiLCBBUklBLlJPTEVfT1BUSU9OKTtcblxuICAgICAgICAvLyBTZXQgdW5pcXVlIElEIGZvciBhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcbiAgICAgICAgY29uc3QgaXRlbUlkID0gYCR7UFJFRklYfS12bGlzdC1pdGVtLSR7aW5kZXh9YDtcbiAgICAgICAgaXRlbS5pZCA9IGl0ZW1JZDtcblxuICAgICAgICAvLyBTZXQgc2VsZWN0ZWQgc3RhdGVcbiAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IHNlbGVjdGVkSW5kaWNlcy5pbmNsdWRlcyhpbmRleCk7XG4gICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKEFSSUEuQVJJQV9TRUxFQ1RFRCwgU3RyaW5nKGlzU2VsZWN0ZWQpKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBVcGRhdGUgYXJpYS1hY3RpdmVkZXNjZW5kYW50IG9uIGNvbnRhaW5lclxuICAgICAgaWYgKHNlbGVjdGVkSW5kaWNlcy5sZW5ndGggPiAwICYmIGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZUlkID0gYCR7UFJFRklYfS12bGlzdC1pdGVtLSR7c2VsZWN0ZWRJbmRpY2VzWzBdfWA7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnNldEF0dHJpYnV0ZShBUklBLkFSSUFfQUNUSVZFREVTQ0VOREFOVCwgYWN0aXZlSWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQ/LnJlbW92ZUF0dHJpYnV0ZShBUklBLkFSSUFfQUNUSVZFREVTQ0VOREFOVCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0eXBlLWFoZWFkIHNlYXJjaFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZVR5cGVBaGVhZCA9IChjaGFyOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghb3B0aW9ucy50eXBlQWhlYWQpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gQ2xlYXIgcHJldmlvdXMgdGltZXJcbiAgICAgIGlmICh0eXBlQWhlYWRUaW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQodHlwZUFoZWFkVGltZXIpO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgY2hhcmFjdGVyIHRvIGJ1ZmZlclxuICAgICAgdHlwZUFoZWFkQnVmZmVyICs9IGNoYXIudG9Mb3dlckNhc2UoKTtcblxuICAgICAgLy8gU2V0IHRpbWVyIHRvIGNsZWFyIGJ1ZmZlclxuICAgICAgdHlwZUFoZWFkVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdHlwZUFoZWFkQnVmZmVyID0gXCJcIjtcbiAgICAgIH0sIG9wdGlvbnMudHlwZUFoZWFkVGltZW91dCk7XG5cbiAgICAgIC8vIFNlYXJjaCBmb3IgbWF0Y2hpbmcgaXRlbVxuICAgICAgY29uc3QgZW5oYW5jZWRDb21wb25lbnQgPSBjb21wb25lbnQgYXMgYW55O1xuICAgICAgY29uc3QgaXRlbXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRJdGVtcz8uKCkgfHwgW107XG4gICAgICBjb25zdCBzZWxlY3RlZEluZGljZXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRTZWxlY3RlZEluZGljZXM/LigpIHx8IFtdO1xuICAgICAgY29uc3Qgc3RhcnRJbmRleCA9XG4gICAgICAgIHNlbGVjdGVkSW5kaWNlcy5sZW5ndGggPiAwID8gc2VsZWN0ZWRJbmRpY2VzWzBdICsgMSA6IDA7XG5cbiAgICAgIC8vIFNlYXJjaCBmcm9tIGN1cnJlbnQgcG9zaXRpb24gdG8gZW5kLCB0aGVuIHdyYXAgdG8gYmVnaW5uaW5nXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gKHN0YXJ0SW5kZXggKyBpKSAlIGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zW2luZGV4XTtcbiAgICAgICAgaWYgKCFpdGVtKSBjb250aW51ZTtcblxuICAgICAgICAvLyBHZXQgc2VhcmNoYWJsZSB0ZXh0IGZyb20gaXRlbVxuICAgICAgICBjb25zdCB0ZXh0ID0gZ2V0SXRlbVRleHQoaXRlbSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKHRleHQuc3RhcnRzV2l0aCh0eXBlQWhlYWRCdWZmZXIpKSB7XG4gICAgICAgICAgZW5oYW5jZWRDb21wb25lbnQuc2VsZWN0QXRJbmRleD8uKGluZGV4KTtcbiAgICAgICAgICBvcHRpb25zLm9uTmF2aWdhdGU/LihpbmRleCwgXCJ0eXBlYWhlYWRcIik7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc2VhcmNoYWJsZSB0ZXh0IGZyb20gYW4gaXRlbVxuICAgICAqL1xuICAgIGNvbnN0IGdldEl0ZW1UZXh0ID0gKGl0ZW06IGFueSk6IHN0cmluZyA9PiB7XG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIpIHJldHVybiBpdGVtO1xuICAgICAgcmV0dXJuIGl0ZW0udGl0bGUgfHwgaXRlbS5uYW1lIHx8IGl0ZW0ubGFiZWwgfHwgaXRlbS50ZXh0IHx8IFwiXCI7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBrZXlib2FyZCBldmVudHNcbiAgICAgKlxuICAgICAqIE1EMyBLZXlib2FyZCBOYXZpZ2F0aW9uOlxuICAgICAqIC0gVGFiOiBNb3ZlIGZvY3VzIHRvIGZpcnN0L2xhc3QgbGlzdCBpdGVtIG9yIG91dHNpZGVcbiAgICAgKiAtIERvd24vUmlnaHQ6IE1vdmUgdG8gbmV4dCBlbGVtZW50OyB3cmFwcyB0byB0b3AgaWYgYXQgZW5kXG4gICAgICogLSBVcC9MZWZ0OiBNb3ZlIHRvIHByZXZpb3VzIGVsZW1lbnQ7IHdyYXBzIHRvIGJvdHRvbSBpZiBhdCBzdGFydFxuICAgICAqIC0gU3BhY2UvRW50ZXI6IFNlbGVjdCBhIGxpc3QgaXRlbVxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUtleURvd24gPSBhc3luYyAoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgY29uc3QgZW5oYW5jZWRDb21wb25lbnQgPSBjb21wb25lbnQgYXMgYW55O1xuICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1Db3VudD8uKCkgfHwgMDtcblxuICAgICAgaWYgKHRvdGFsSXRlbXMgPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3Qgc2VsZWN0ZWRJbmRpY2VzID0gZW5oYW5jZWRDb21wb25lbnQuZ2V0U2VsZWN0ZWRJbmRpY2VzPy4oKSB8fCBbXTtcbiAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHNlbGVjdGVkSW5kaWNlcy5sZW5ndGggPiAwID8gc2VsZWN0ZWRJbmRpY2VzWzBdIDogLTE7XG5cbiAgICAgIGxldCB0YXJnZXRJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgICBsZXQgaGFuZGxlZCA9IGZhbHNlO1xuXG4gICAgICAvLyBIZWxwZXIgdG8gbWFyayBldmVudCBhcyBoYW5kbGVkIGFuZCBzdG9wIHByb3BhZ2F0aW9uXG4gICAgICBjb25zdCBtYXJrSGFuZGxlZCA9ICgpID0+IHtcbiAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgIH07XG5cbiAgICAgIHN3aXRjaCAoZS5rZXkpIHtcbiAgICAgICAgLy8gTUQzOiBEb3duL1JpZ2h0IG1vdmUgdG8gbmV4dCBlbGVtZW50XG4gICAgICAgIGNhc2UgXCJBcnJvd0Rvd25cIjpcbiAgICAgICAgY2FzZSBcIkFycm93UmlnaHRcIjpcbiAgICAgICAgICBtYXJrSGFuZGxlZCgpO1xuICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPCAwKSB7XG4gICAgICAgICAgICB0YXJnZXRJbmRleCA9IDA7XG4gICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50SW5kZXggPCB0b3RhbEl0ZW1zIC0gMSkge1xuICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBjdXJyZW50SW5kZXggKyAxO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy53cmFwKSB7XG4gICAgICAgICAgICAvLyBNRDM6IHdyYXBzIHRvIHRvcCBpZiBhdCBlbmRcbiAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgLy8gTUQzOiBVcC9MZWZ0IG1vdmUgdG8gcHJldmlvdXMgZWxlbWVudFxuICAgICAgICBjYXNlIFwiQXJyb3dVcFwiOlxuICAgICAgICBjYXNlIFwiQXJyb3dMZWZ0XCI6XG4gICAgICAgICAgbWFya0hhbmRsZWQoKTtcbiAgICAgICAgICBpZiAoY3VycmVudEluZGV4IDwgMCkge1xuICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSB0b3RhbEl0ZW1zIC0gMTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRJbmRleCA+IDApIHtcbiAgICAgICAgICAgIHRhcmdldEluZGV4ID0gY3VycmVudEluZGV4IC0gMTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMud3JhcCkge1xuICAgICAgICAgICAgLy8gTUQzOiB3cmFwcyB0byBib3R0b20gaWYgYXQgc3RhcnRcbiAgICAgICAgICAgIHRhcmdldEluZGV4ID0gdG90YWxJdGVtcyAtIDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJIb21lXCI6XG4gICAgICAgICAgaWYgKG9wdGlvbnMuaG9tZUVuZCkge1xuICAgICAgICAgICAgbWFya0hhbmRsZWQoKTtcbiAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcIkVuZFwiOlxuICAgICAgICAgIGlmIChvcHRpb25zLmhvbWVFbmQpIHtcbiAgICAgICAgICAgIG1hcmtIYW5kbGVkKCk7XG4gICAgICAgICAgICB0YXJnZXRJbmRleCA9IHRvdGFsSXRlbXMgLSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiUGFnZURvd25cIjpcbiAgICAgICAgICBpZiAob3B0aW9ucy5wYWdlVXBEb3duKSB7XG4gICAgICAgICAgICBtYXJrSGFuZGxlZCgpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA8IDApIHtcbiAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBNYXRoLm1pbihvcHRpb25zLnBhZ2VTaXplIC0gMSwgdG90YWxJdGVtcyAtIDEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBNYXRoLm1pbihcbiAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggKyBvcHRpb25zLnBhZ2VTaXplLFxuICAgICAgICAgICAgICAgIHRvdGFsSXRlbXMgLSAxLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiUGFnZVVwXCI6XG4gICAgICAgICAgaWYgKG9wdGlvbnMucGFnZVVwRG93bikge1xuICAgICAgICAgICAgbWFya0hhbmRsZWQoKTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPCAwKSB7XG4gICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gTWF0aC5tYXgoY3VycmVudEluZGV4IC0gb3B0aW9ucy5wYWdlU2l6ZSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIC8vIE1EMzogU3BhY2UvRW50ZXIgc2VsZWN0IGEgbGlzdCBpdGVtXG4gICAgICAgIGNhc2UgXCIgXCI6XG4gICAgICAgIGNhc2UgXCJFbnRlclwiOlxuICAgICAgICAgIG1hcmtIYW5kbGVkKCk7XG4gICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBpZiAoY29uZmlnLnNlbGVjdGlvbj8ubW9kZSA9PT0gXCJtdWx0aXBsZVwiKSB7XG4gICAgICAgICAgICAgIC8vIEluIG11bHRpcGxlIG1vZGUsIHRvZ2dsZSBzZWxlY3Rpb25cbiAgICAgICAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IGVuaGFuY2VkQ29tcG9uZW50LmlzU2VsZWN0ZWQ/LihjdXJyZW50SW5kZXgpO1xuICAgICAgICAgICAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIGVuaGFuY2VkQ29tcG9uZW50LmRlc2VsZWN0SXRlbXM/LihbY3VycmVudEluZGV4XSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZW5oYW5jZWRDb21wb25lbnQuc2VsZWN0SXRlbXM/LihbY3VycmVudEluZGV4XSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIEluIHNpbmdsZSBtb2RlLCBlbnN1cmUgaXRlbSBpcyBzZWxlY3RlZCBhbmQgZW1pdCBhY3RpdmF0aW9uIGV2ZW50XG4gICAgICAgICAgICAgIGVuaGFuY2VkQ29tcG9uZW50LnNlbGVjdEl0ZW1zPy4oW2N1cnJlbnRJbmRleF0pO1xuICAgICAgICAgICAgICAvLyBFbWl0IGFjdGl2YXRlIGV2ZW50IGZvciBzaW5nbGUtYWN0aW9uIGxpc3RzXG4gICAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtOmFjdGl2YXRlXCIsIHtcbiAgICAgICAgICAgICAgICBpbmRleDogY3VycmVudEluZGV4LFxuICAgICAgICAgICAgICAgIGl0ZW06IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1zPy4oKT8uW2N1cnJlbnRJbmRleF0sXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiYVwiOlxuICAgICAgICBjYXNlIFwiQVwiOlxuICAgICAgICAgIC8vIEN0cmwrQSAvIENtZCtBIC0gc2VsZWN0IGFsbCBpbiBtdWx0aXBsZSBtb2RlXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgKGUuY3RybEtleSB8fCBlLm1ldGFLZXkpICYmXG4gICAgICAgICAgICBjb25maWcuc2VsZWN0aW9uPy5tb2RlID09PSBcIm11bHRpcGxlXCJcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG1hcmtIYW5kbGVkKCk7XG4gICAgICAgICAgICBjb25zdCBhbGxJbmRpY2VzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogdG90YWxJdGVtcyB9LCAoXywgaSkgPT4gaSk7XG4gICAgICAgICAgICBlbmhhbmNlZENvbXBvbmVudC5zZWxlY3RJdGVtcz8uKGFsbEluZGljZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiRXNjYXBlXCI6XG4gICAgICAgICAgLy8gQ2xlYXIgc2VsZWN0aW9uXG4gICAgICAgICAgbWFya0hhbmRsZWQoKTtcbiAgICAgICAgICBlbmhhbmNlZENvbXBvbmVudC5jbGVhclNlbGVjdGlvbj8uKCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBUeXBlLWFoZWFkIGZvciBwcmludGFibGUgY2hhcmFjdGVyc1xuICAgICAgICAgIGlmIChlLmtleS5sZW5ndGggPT09IDEgJiYgIWUuY3RybEtleSAmJiAhZS5tZXRhS2V5ICYmICFlLmFsdEtleSkge1xuICAgICAgICAgICAgaGFuZGxlZCA9IGhhbmRsZVR5cGVBaGVhZChlLmtleSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBOYXZpZ2F0ZSB0byB0YXJnZXQgaW5kZXhcbiAgICAgIGlmICh0YXJnZXRJbmRleCAhPT0gbnVsbCAmJiB0YXJnZXRJbmRleCAhPT0gY3VycmVudEluZGV4KSB7XG4gICAgICAgIC8vIEhhbmRsZSBzaGlmdCthcnJvdyBmb3IgcmFuZ2Ugc2VsZWN0aW9uIGluIG11bHRpcGxlIG1vZGVcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGUuc2hpZnRLZXkgJiZcbiAgICAgICAgICBjb25maWcuc2VsZWN0aW9uPy5tb2RlID09PSBcIm11bHRpcGxlXCIgJiZcbiAgICAgICAgICBjdXJyZW50SW5kZXggPj0gMFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBzdGFydCA9IE1hdGgubWluKGN1cnJlbnRJbmRleCwgdGFyZ2V0SW5kZXgpO1xuICAgICAgICAgIGNvbnN0IGVuZCA9IE1hdGgubWF4KGN1cnJlbnRJbmRleCwgdGFyZ2V0SW5kZXgpO1xuICAgICAgICAgIGNvbnN0IHJhbmdlSW5kaWNlcyA9IEFycmF5LmZyb20oXG4gICAgICAgICAgICB7IGxlbmd0aDogZW5kIC0gc3RhcnQgKyAxIH0sXG4gICAgICAgICAgICAoXywgaSkgPT4gc3RhcnQgKyBpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgZW5oYW5jZWRDb21wb25lbnQuc2VsZWN0SXRlbXM/LihyYW5nZUluZGljZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEF3YWl0IHNlbGVjdEF0SW5kZXggZm9yIHByb3BlciBzY3JvbGxpbmcgYW5kIGRhdGEgbG9hZGluZ1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IGZvciBIb21lL0VuZC9QYWdlVXAvUGFnZURvd24gd2hpY2ggbWF5IGp1bXAgdG8gdW5sb2FkZWQgaXRlbXNcbiAgICAgICAgICBhd2FpdCBlbmhhbmNlZENvbXBvbmVudC5zZWxlY3RBdEluZGV4Py4odGFyZ2V0SW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIG9wdGlvbnMub25OYXZpZ2F0ZT8uKHRhcmdldEluZGV4LCBlLmtleSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVtaXQga2V5Ym9hcmQgZXZlbnQgZm9yIGV4dGVybmFsIGhhbmRsaW5nXG4gICAgICBpZiAoaGFuZGxlZCkge1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwia2V5Ym9hcmQ6bmF2aWdhdGVcIiwge1xuICAgICAgICAgIGtleTogZS5rZXksXG4gICAgICAgICAgaW5kZXg6IHRhcmdldEluZGV4ID8/IGN1cnJlbnRJbmRleCxcbiAgICAgICAgICBzaGlmdEtleTogZS5zaGlmdEtleSxcbiAgICAgICAgICBjdHJsS2V5OiBlLmN0cmxLZXksXG4gICAgICAgICAgbWV0YUtleTogZS5tZXRhS2V5LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIGZvY3VzIGV2ZW50XG4gICAgICpcbiAgICAgKiBNRDMgRm9jdXMgQmVoYXZpb3IgZm9yIFNpbmdsZS1BY3Rpb24gTGlzdHM6XG4gICAgICogLSBUaGUgZmlyc3QgZWxlbWVudCBpbiBhIGxpc3Qgc2hvdWxkIHJlY2VpdmUgZm9jdXMgYnkgZGVmYXVsdFxuICAgICAqIC0gSWYgdGhlIGxpc3QgaGFzIGEgc2VsZWN0ZWQgZWxlbWVudCwgZm9jdXMgZ29lcyB0byB0aGUgc2VsZWN0ZWQgaXRlbSBpbnN0ZWFkXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlRm9jdXMgPSAoKSA9PiB7XG4gICAgICBjb25zdCBlbmhhbmNlZENvbXBvbmVudCA9IGNvbXBvbmVudCBhcyBhbnk7XG4gICAgICBjb25zdCBzZWxlY3RlZEluZGljZXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRTZWxlY3RlZEluZGljZXM/LigpIHx8IFtdO1xuICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1Db3VudD8uKCkgfHwgMDtcblxuICAgICAgLy8gQWRkIGtleWJvYXJkIGZvY3VzIGNsYXNzIG9ubHkgaWYgZm9jdXMgd2FzIE5PVCBmcm9tIGEgcmVjZW50IG1vdXNlIGNsaWNrXG4gICAgICAvLyAxMDBtcyB0aHJlc2hvbGQgYWNjb3VudHMgZm9yIHRoZSBkZWxheSBiZXR3ZWVuIG1vdXNlZG93biBhbmQgZm9jdXNcbiAgICAgIGNvbnN0IHdhc01vdXNlQ2xpY2sgPSBEYXRlLm5vdygpIC0gbGFzdE1vdXNlRG93blRpbWUgPCAxMDA7XG4gICAgICBpZiAoIXdhc01vdXNlQ2xpY2sgJiYgY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgYWRkQ2xhc3MoY29tcG9uZW50LmVsZW1lbnQsIEtFWUJPQVJEX0ZPQ1VTX0NMQVNTKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRvdGFsSXRlbXMgPT09IDApIHJldHVybjtcblxuICAgICAgLy8gTUQzOiBJZiBsaXN0IGhhcyBzZWxlY3RlZCBlbGVtZW50LCBmb2N1cyBnb2VzIHRvIHNlbGVjdGVkIGl0ZW1cbiAgICAgIC8vIE90aGVyd2lzZSwgZmlyc3QgZWxlbWVudCByZWNlaXZlcyBmb2N1c1xuICAgICAgaWYgKHNlbGVjdGVkSW5kaWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZW5oYW5jZWRDb21wb25lbnQuc2VsZWN0QXRJbmRleD8uKDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gT25seSBzY3JvbGwgdG8gc2VsZWN0ZWQgaXRlbSBpZiBpdCdzIG5vdCBhbHJlYWR5IGZ1bGx5IHZpc2libGVcbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyB1bndhbnRlZCBzY3JvbGxpbmcgd2hlbiBjbGlja2luZyBvbiBhIHZpc2libGUgaXRlbVxuICAgICAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gc2VsZWN0ZWRJbmRpY2VzWzBdO1xuICAgICAgICBjb25zdCBpc1Zpc2libGUgPSBlbmhhbmNlZENvbXBvbmVudC5pc0l0ZW1GdWxseVZpc2libGU/LihzZWxlY3RlZEluZGV4KTtcbiAgICAgICAgaWYgKCFpc1Zpc2libGUgJiYgZW5oYW5jZWRDb21wb25lbnQudmlld3BvcnQ/LnNjcm9sbFRvSW5kZXgpIHtcbiAgICAgICAgICBlbmhhbmNlZENvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb0luZGV4KHNlbGVjdGVkSW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJrZXlib2FyZDpmb2N1c1wiKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIGJsdXIgZXZlbnRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVCbHVyID0gKCkgPT4ge1xuICAgICAgLy8gUmVtb3ZlIGtleWJvYXJkIGZvY3VzIGNsYXNzXG4gICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3MoY29tcG9uZW50LmVsZW1lbnQsIEtFWUJPQVJEX0ZPQ1VTX0NMQVNTKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYXIgdHlwZS1haGVhZCBvbiBibHVyXG4gICAgICB0eXBlQWhlYWRCdWZmZXIgPSBcIlwiO1xuICAgICAgaWYgKHR5cGVBaGVhZFRpbWVyKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0eXBlQWhlYWRUaW1lcik7XG4gICAgICAgIHR5cGVBaGVhZFRpbWVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcImtleWJvYXJkOmJsdXJcIik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgICAqL1xuICAgIGNvbnN0IHNldHVwID0gKCkgPT4ge1xuICAgICAgc2V0dXBBY2Nlc3NpYmlsaXR5KCk7XG5cbiAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICBjb21wb25lbnQuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBoYW5kbGVLZXlEb3duKTtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIGhhbmRsZUZvY3VzKTtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgaGFuZGxlQmx1cik7XG5cbiAgICAgICAgLy8gVHJhY2sgbW91c2UgY2xpY2tzIHRvIGRpc3Rpbmd1aXNoIGZyb20ga2V5Ym9hcmQgZm9jdXNcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCAoKSA9PiB7XG4gICAgICAgICAgbGFzdE1vdXNlRG93blRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBZGQgY2xpY2sgaGFuZGxlciB0byBmb2N1cyB0aGUgbGlzdCB3aGVuIGNsaWNrZWRcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICBjb21wb25lbnQuZWxlbWVudD8uZm9jdXMoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBBUklBIGF0dHJpYnV0ZXMgd2hlbiBpdGVtcyBhcmUgcmVuZGVyZWRcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5vbj8uKFxuICAgICAgICBcInZpZXdwb3J0Oml0ZW1zLXJlbmRlcmVkXCIsXG4gICAgICAgIHVwZGF0ZUl0ZW1BY2Nlc3NpYmlsaXR5LFxuICAgICAgKTtcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5vbj8uKFwidmlld3BvcnQ6cmVuZGVyZWRcIiwgdXBkYXRlSXRlbUFjY2Vzc2liaWxpdHkpO1xuXG4gICAgICAvLyBVcGRhdGUgQVJJQSB3aGVuIHNlbGVjdGlvbiBjaGFuZ2VzXG4gICAgICAoY29tcG9uZW50IGFzIGFueSkub24/LihcInNlbGVjdGlvbjpjaGFuZ2VcIiwgdXBkYXRlSXRlbUFjY2Vzc2liaWxpdHkpO1xuICAgIH07XG5cbiAgICAvLyBJbml0aWFsaXplIGFmdGVyIGNvbXBvbmVudCBpcyByZWFkeVxuICAgIHNldFRpbWVvdXQoc2V0dXAsIDApO1xuXG4gICAgLy8gQ2xlYW51cCBvbiBkZXN0cm95XG4gICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmRlc3Ryb3k7XG4gICAgY29tcG9uZW50LmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgaGFuZGxlS2V5RG93bik7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCBoYW5kbGVGb2N1cyk7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGhhbmRsZUJsdXIpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVBaGVhZFRpbWVyKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0eXBlQWhlYWRUaW1lcik7XG4gICAgICB9XG4gICAgICBvcmlnaW5hbERlc3Ryb3k/LigpO1xuICAgIH07XG5cbiAgICAvLyBSZXR1cm4gZW5oYW5jZWQgY29tcG9uZW50IHdpdGgga2V5Ym9hcmQgQVBJXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcblxuICAgICAgLyoqXG4gICAgICAgKiBGb2N1cyB0aGUgbGlzdCBmb3Iga2V5Ym9hcmQgbmF2aWdhdGlvblxuICAgICAgICovXG4gICAgICBmb2N1cygpOiB2b2lkIHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQ/LmZvY3VzKCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEJsdXIgdGhlIGxpc3RcbiAgICAgICAqL1xuICAgICAgYmx1cigpOiB2b2lkIHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQ/LmJsdXIoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgbGlzdCBoYXMgZm9jdXNcbiAgICAgICAqL1xuICAgICAgaGFzRm9jdXMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBjb21wb25lbnQuZWxlbWVudDtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2VsZWN0IGZpcnN0IGl0ZW1cbiAgICAgICAqL1xuICAgICAgYXN5bmMgc2VsZWN0Rmlyc3QoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGVuaGFuY2VkQ29tcG9uZW50ID0gY29tcG9uZW50IGFzIGFueTtcbiAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1Db3VudD8uKCkgfHwgMDtcbiAgICAgICAgaWYgKHRvdGFsSXRlbXMgPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIGVuaGFuY2VkQ29tcG9uZW50LnNlbGVjdEF0SW5kZXg/LigwKSA/PyBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNlbGVjdCBsYXN0IGl0ZW1cbiAgICAgICAqL1xuICAgICAgYXN5bmMgc2VsZWN0TGFzdCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgZW5oYW5jZWRDb21wb25lbnQgPSBjb21wb25lbnQgYXMgYW55O1xuICAgICAgICBjb25zdCB0b3RhbEl0ZW1zID0gZW5oYW5jZWRDb21wb25lbnQuZ2V0SXRlbUNvdW50Py4oKSB8fCAwO1xuICAgICAgICBpZiAodG90YWxJdGVtcyA+IDApIHtcbiAgICAgICAgICByZXR1cm4gZW5oYW5jZWRDb21wb25lbnQuc2VsZWN0QXRJbmRleD8uKHRvdGFsSXRlbXMgLSAxKSA/PyBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9LFxuICAgIH07XG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCB3aXRoS2V5Ym9hcmQ7XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL2Zvcm0vZm9ybS50c1xuXG4vKipcbiAqIEZvcm0gQ29tcG9uZW50IC0gRnVuY3Rpb25hbCBmb3JtIGJ1aWxkZXIgd2l0aCBtdHJsIGNvbXBvc2l0aW9uXG4gKlxuICogQSBmb3JtIGNvbXBvbmVudCB0aGF0IHVzZXMgdGhlIG10cmwtYWRkb25zIGxheW91dCBzeXN0ZW0gdG8gYnVpbGRcbiAqIGZvcm1zIGZyb20gc2NoZW1hIGRlZmluaXRpb25zLCB3aXRoIGJ1aWx0LWluIGRhdGEgbWFuYWdlbWVudCxcbiAqIHZhbGlkYXRpb24sIGFuZCBzdWJtaXNzaW9uIGhhbmRsaW5nLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRm9ybUNvbmZpZywgRm9ybUNvbXBvbmVudCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8vIEltcG9ydCBtdHJsIGNvbXBvc2Ugc3lzdGVtXG5pbXBvcnQgeyBwaXBlIH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IGNyZWF0ZUJhc2UsIHdpdGhFbGVtZW50IH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IHdpdGhFdmVudHMsIHdpdGhMaWZlY3ljbGUgfSBmcm9tIFwibXRybFwiO1xuXG4vLyBJbXBvcnQgZm9ybSBmZWF0dXJlc1xuaW1wb3J0IHtcbiAgd2l0aExheW91dCxcbiAgd2l0aEZpZWxkcyxcbiAgd2l0aERhdGEsXG4gIHdpdGhDb250cm9sbGVyLFxuICB3aXRoU3VibWl0LFxuICB3aXRoUHJvdGVjdGlvbixcbiAgd2l0aEFQSSxcbn0gZnJvbSBcIi4vZmVhdHVyZXNcIjtcblxuLy8gSW1wb3J0IGNvbmZpZ3VyYXRpb25cbmltcG9ydCB7IGNyZWF0ZUJhc2VDb25maWcsIGdldEVsZW1lbnRDb25maWcgfSBmcm9tIFwiLi9jb25maWdcIjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IEZvcm0gY29tcG9uZW50IHVzaW5nIGZ1bmN0aW9uYWwgY29tcG9zaXRpb25cbiAqXG4gKiBAcGFyYW0ge0Zvcm1Db25maWd9IGNvbmZpZyAtIEZvcm0gY29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiBAcmV0dXJucyB7Rm9ybUNvbXBvbmVudH0gQSBmdWxseSBjb25maWd1cmVkIGZvcm0gY29tcG9uZW50XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IGNyZWF0ZUZvcm0gfSBmcm9tICdtdHJsLWFkZG9ucydcbiAqIGltcG9ydCB7IGNyZWF0ZVRleHRmaWVsZCwgY3JlYXRlU3dpdGNoLCBjcmVhdGVDaGlwcyB9IGZyb20gJ210cmwnXG4gKlxuICogY29uc3QgZm9ybSA9IGNyZWF0ZUZvcm0oe1xuICogICBjbGFzczogJ2FjY291bnQtZm9ybScsXG4gKiAgIGFjdGlvbjogJy9hcGkvdXNlcnMvJyxcbiAqICAgbGF5b3V0OiBbXG4gKiAgICAgWydzZWN0aW9uJywgeyBjbGFzczogJ3VzZXItc2VjdGlvbicgfSxcbiAqICAgICAgIFsnZGl2JywgeyBjbGFzczogJ3NlY3Rpb24tdGl0bGUnLCB0ZXh0OiAnVXNlcicgfV0sXG4gKiAgICAgICBbY3JlYXRlVGV4dGZpZWxkLCAnaW5mby51c2VybmFtZScsIHsgbGFiZWw6ICdVc2VybmFtZScgfV0sXG4gKiAgICAgICBbY3JlYXRlQ2hpcHMsICdpbmZvLnJvbGUnLCB7XG4gKiAgICAgICAgIGxhYmVsOiAnUm9sZScsXG4gKiAgICAgICAgIGNoaXBzOiBbXG4gKiAgICAgICAgICAgeyB0ZXh0OiAncmVnaXN0ZXJlZCcsIHZhbHVlOiAncmVnaXN0ZXJlZCcgfSxcbiAqICAgICAgICAgICB7IHRleHQ6ICdhZG1pbicsIHZhbHVlOiAnYWRtaW4nIH0sXG4gKiAgICAgICAgICAgeyB0ZXh0OiAncHJlbWl1bScsIHZhbHVlOiAncHJlbWl1bScgfVxuICogICAgICAgICBdXG4gKiAgICAgICB9XSxcbiAqICAgICAgIFtjcmVhdGVTd2l0Y2gsICdpbmZvLmVuYWJsZWQnLCB7IGxhYmVsOiAnRW5hYmxlZCcgfV1cbiAqICAgICBdXG4gKiAgIF0sXG4gKiAgIG9uOiB7XG4gKiAgICAgY2hhbmdlOiAoZGF0YSkgPT4gY29uc29sZS5sb2coJ0Zvcm0gY2hhbmdlZDonLCBkYXRhKSxcbiAqICAgICBzdWJtaXQ6IChkYXRhKSA9PiBjb25zb2xlLmxvZygnRm9ybSBzdWJtaXR0ZWQ6JywgZGF0YSlcbiAqICAgfVxuICogfSlcbiAqXG4gKiAvLyBBcHBlbmQgdG8gRE9NXG4gKiBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGZvcm0uZWxlbWVudClcbiAqXG4gKiAvLyBTZXQgZGF0YVxuICogZm9ybS5zZXREYXRhKHtcbiAqICAgdXNlcm5hbWU6ICdqb2huX2RvZScsXG4gKiAgIHJvbGU6ICdhZG1pbicsXG4gKiAgIGVuYWJsZWQ6IHRydWVcbiAqIH0pXG4gKlxuICogLy8gR2V0IGRhdGFcbiAqIGNvbnN0IGRhdGEgPSBmb3JtLmdldERhdGEoKVxuICpcbiAqIC8vIENoZWNrIGlmIG1vZGlmaWVkXG4gKiBpZiAoZm9ybS5pc01vZGlmaWVkKCkpIHtcbiAqICAgYXdhaXQgZm9ybS5zdWJtaXQoKVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVGb3JtID0gKGNvbmZpZzogRm9ybUNvbmZpZyA9IHt9KTogRm9ybUNvbXBvbmVudCA9PiB7XG4gIHRyeSB7XG4gICAgLy8gUHJvY2VzcyBjb25maWd1cmF0aW9uIHdpdGggZGVmYXVsdHNcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gY3JlYXRlQmFzZUNvbmZpZyhjb25maWcpO1xuXG4gICAgLy8gQnVpbGQgdGhlIGZvcm0gdGhyb3VnaCBmdW5jdGlvbmFsIGNvbXBvc2l0aW9uXG4gICAgLy8gRWFjaCBmdW5jdGlvbiBpbiB0aGUgcGlwZSBhZGRzIHNwZWNpZmljIGNhcGFiaWxpdGllc1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IHBpcGUoXG4gICAgICAvLyAxLiBGb3VuZGF0aW9uIGxheWVyIC0gQmFzZSBjb21wb25lbnQgd2l0aCBjb25maWdcbiAgICAgIGNyZWF0ZUJhc2UsXG5cbiAgICAgIC8vIDIuIEV2ZW50IHN5c3RlbSAtIEFkZHMgb24vb2ZmL2VtaXQgbWV0aG9kc1xuICAgICAgd2l0aEV2ZW50cygpLFxuXG4gICAgICAvLyAzLiBET00gZWxlbWVudCAtIENyZWF0ZXMgdGhlIHJvb3QgY29udGFpbmVyIGVsZW1lbnRcbiAgICAgIHdpdGhFbGVtZW50KGdldEVsZW1lbnRDb25maWcoYmFzZUNvbmZpZykpLFxuXG4gICAgICAvLyA0LiBMYXlvdXQgLSBDcmVhdGVzIGZvcm0gZWxlbWVudCBhbmQgcHJvY2Vzc2VzIGxheW91dCBzY2hlbWFcbiAgICAgIHdpdGhMYXlvdXQoYmFzZUNvbmZpZyksXG5cbiAgICAgIC8vIDUuIEZpZWxkcyAtIEV4dHJhY3RzIGZpZWxkcyBmcm9tIGxheW91dCBhbmQgY3JlYXRlcyByZWdpc3RyeVxuICAgICAgd2l0aEZpZWxkcyhiYXNlQ29uZmlnKSxcblxuICAgICAgLy8gNi4gRGF0YSAtIEFkZHMgZGF0YSBtYW5hZ2VtZW50IChnZXQvc2V0LCBjaGFuZ2UgdHJhY2tpbmcpXG4gICAgICB3aXRoRGF0YShiYXNlQ29uZmlnKSxcblxuICAgICAgLy8gNy4gQ29udHJvbGxlciAtIEFkZHMgbW9kZSBtYW5hZ2VtZW50IChyZWFkL2NyZWF0ZS91cGRhdGUpXG4gICAgICB3aXRoQ29udHJvbGxlcihiYXNlQ29uZmlnKSxcblxuICAgICAgLy8gOC4gU3VibWl0IC0gQWRkcyB2YWxpZGF0aW9uIGFuZCBzdWJtaXNzaW9uIGhhbmRsaW5nXG4gICAgICB3aXRoU3VibWl0KGJhc2VDb25maWcpLFxuXG4gICAgICAvLyA5LiBQcm90ZWN0aW9uIC0gQWRkcyBibG9ja2luZyBvdmVybGF5IHdoZW4gZm9ybSBoYXMgdW5zYXZlZCBjaGFuZ2VzXG4gICAgICB3aXRoUHJvdGVjdGlvbihiYXNlQ29uZmlnKSxcblxuICAgICAgLy8gMTAuIExpZmVjeWNsZSAtIEFkZHMgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgKGRlc3Ryb3kpXG4gICAgICB3aXRoTGlmZWN5Y2xlKCksXG5cbiAgICAgIC8vIDExLiBBUEkgLSBDcmVhdGVzIGNsZWFuIHB1YmxpYyBBUElcbiAgICAgIHdpdGhBUEkoYmFzZUNvbmZpZyksXG4gICAgKShiYXNlQ29uZmlnKTtcblxuICAgIC8vIEFwcGVuZCB0byBjb250YWluZXIgaWYgcHJvdmlkZWRcbiAgICBpZiAoY29uZmlnLmNvbnRhaW5lciAmJiBjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgY29uZmlnLmNvbnRhaW5lci5hcHBlbmRDaGlsZChjb21wb25lbnQuZWxlbWVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBvbmVudCBhcyBGb3JtQ29tcG9uZW50O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJGb3JtIGNyZWF0aW9uIGVycm9yOlwiLCBlcnJvcik7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIGZvcm06ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVGb3JtO1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2xheW91dC50c1xuXG4vKipcbiAqIExheW91dCBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogQnVpbGRzIHRoZSBmb3JtIHN0cnVjdHVyZSBmcm9tIGEgbGF5b3V0IHNjaGVtYSB1c2luZyBtdHJsLWFkZG9ucyBsYXlvdXQgc3lzdGVtXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlTGF5b3V0IH0gZnJvbSBcIi4uLy4uLy4uL2NvcmUvbGF5b3V0XCI7XG5pbXBvcnQgdHlwZSB7IEZvcm1Db25maWcsIEJhc2VGb3JtQ29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBGT1JNX0RFRkFVTFRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG4vLyBTY3JvbGwgdGhyZXNob2xkIGluIHBpeGVsc1xuY29uc3QgU0NST0xMRURfVEhSRVNIT0xEID0gMTtcblxuLy8gQ1NTIGNsYXNzIG5hbWVzXG5jb25zdCBTQ1JPTExFRF9DTEFTUyA9IFwibXRybC1mb3JtLS1zY3JvbGxlZFwiO1xuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGZvcm0gZWxlbWVudFxuICovXG5jb25zdCBjcmVhdGVGb3JtRWxlbWVudCA9IChjb25maWc6IEZvcm1Db25maWcpOiBIVE1MRm9ybUVsZW1lbnQgPT4ge1xuICBjb25zdCBmb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImZvcm1cIik7XG5cbiAgaWYgKGNvbmZpZy5tZXRob2QpIHtcbiAgICBmb3JtLnNldEF0dHJpYnV0ZShcIm1ldGhvZFwiLCBjb25maWcubWV0aG9kKTtcbiAgfVxuXG4gIGlmIChjb25maWcuYWN0aW9uKSB7XG4gICAgZm9ybS5zZXRBdHRyaWJ1dGUoXCJhY3Rpb25cIiwgY29uZmlnLmFjdGlvbik7XG4gIH1cblxuICBpZiAoY29uZmlnLmF1dG9jb21wbGV0ZSkge1xuICAgIGZvcm0uc2V0QXR0cmlidXRlKFwiYXV0b2NvbXBsZXRlXCIsIGNvbmZpZy5hdXRvY29tcGxldGUpO1xuICB9XG5cbiAgLy8gUHJldmVudCBkZWZhdWx0IGZvcm0gc3VibWlzc2lvbiAtIHdlIGhhbmRsZSBpdCBwcm9ncmFtbWF0aWNhbGx5XG4gIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGZvcm07XG59O1xuXG4vKipcbiAqIFByb2Nlc3NlcyBsYXlvdXQgc2NoZW1hIGFuZCBleHRyYWN0cyBuYW1lZCBjb21wb25lbnRzXG4gKi9cbmNvbnN0IHByb2Nlc3NMYXlvdXRTY2hlbWEgPSAoXG4gIHNjaGVtYTogdW5rbm93bltdLFxuICBmb3JtOiBIVE1MRm9ybUVsZW1lbnQsXG4gIGNvbmZpZzogRm9ybUNvbmZpZyxcbik6IHsgdWk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBsYXlvdXRSZXN1bHQ6IHVua25vd24gfSA9PiB7XG4gIGlmICghc2NoZW1hIHx8ICFBcnJheS5pc0FycmF5KHNjaGVtYSkgfHwgc2NoZW1hLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB7IHVpOiB7fSwgbGF5b3V0UmVzdWx0OiBudWxsIH07XG4gIH1cblxuICAvLyBVc2UgbXRybC1hZGRvbnMgY3JlYXRlTGF5b3V0IHRvIHByb2Nlc3MgdGhlIHNjaGVtYVxuICBjb25zdCBsYXlvdXRSZXN1bHQgPSBjcmVhdGVMYXlvdXQoc2NoZW1hLCBmb3JtLCB7fSk7XG5cbiAgLy8gRXh0cmFjdCBuYW1lZCBjb21wb25lbnRzIGZyb20gbGF5b3V0IHJlc3VsdFxuICBjb25zdCB1aTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICBpZiAobGF5b3V0UmVzdWx0ICYmIHR5cGVvZiBsYXlvdXRSZXN1bHQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAvLyBUaGUgbGF5b3V0IHJlc3VsdCBjb250YWlucyBjb21wb25lbnQgcmVmZXJlbmNlc1xuICAgIGNvbnN0IHJlc3VsdCA9IGxheW91dFJlc3VsdCBhcyB7IGNvbXBvbmVudD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH07XG4gICAgaWYgKHJlc3VsdC5jb21wb25lbnQpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odWksIHJlc3VsdC5jb21wb25lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IHVpLCBsYXlvdXRSZXN1bHQgfTtcbn07XG5cbi8qKlxuICogU2V0cyB1cCBzY3JvbGwgZGV0ZWN0aW9uIG9uIGJvZHkgZWxlbWVudHMgdG8gdG9nZ2xlIC0tc2Nyb2xsZWQgY2xhc3Mgb24gZm9ybSBjb250YWluZXJcbiAqL1xuY29uc3Qgc2V0dXBTY3JvbGxJbmRpY2F0b3IgPSAoXG4gIGZvcm06IEhUTUxGb3JtRWxlbWVudCxcbiAgZm9ybUNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4pOiAoKCkgPT4gdm9pZCkgPT4ge1xuICBjb25zdCBjbGVhbnVwRm5zOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdO1xuXG4gIC8vIEZpbmQgYm9keSBlbGVtZW50IHRvIGNhbGN1bGF0ZSBzaGFkb3cgcG9zaXRpb25cbiAgY29uc3QgYm9keUVsZW1lbnQgPSBmb3JtLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFwiLm10cmwtYm9keVwiKTtcbiAgaWYgKGJvZHlFbGVtZW50KSB7XG4gICAgLy8gU2V0IENTUyB2YXJpYWJsZSBmb3Igc2hhZG93IHBvc2l0aW9uaW5nIGF0IHRvcCBvZiBib2R5XG4gICAgY29uc3QgdXBkYXRlQm9keVRvcCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGJvZHlUb3AgPSBib2R5RWxlbWVudC5vZmZzZXRUb3A7XG4gICAgICBmb3JtQ29udGFpbmVyLnN0eWxlLnNldFByb3BlcnR5KFwiLS1tdHJsLWZvcm0tYm9keS10b3BcIiwgYCR7Ym9keVRvcH1weGApO1xuICAgIH07XG4gICAgdXBkYXRlQm9keVRvcCgpO1xuXG4gICAgLy8gVXBkYXRlIG9uIHJlc2l6ZVxuICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKHVwZGF0ZUJvZHlUb3ApO1xuICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZm9ybSk7XG5cbiAgICBjbGVhbnVwRm5zLnB1c2goKCkgPT4ge1xuICAgICAgcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgZm9ybUNvbnRhaW5lci5zdHlsZS5yZW1vdmVQcm9wZXJ0eShcIi0tbXRybC1mb3JtLWJvZHktdG9wXCIpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gRmluZCBib2R5IGVsZW1lbnRzIChtdHJsLWJvZHkgY2xhc3MgYWRkZWQgYnkgbGF5b3V0IHN5c3RlbSlcbiAgY29uc3QgYm9keUVsZW1lbnRzID0gZm9ybS5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihcIi5tdHJsLWJvZHlcIik7XG5cbiAgYm9keUVsZW1lbnRzLmZvckVhY2goKGJvZHlFbGVtZW50KSA9PiB7XG4gICAgbGV0IGlzU2Nyb2xsZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IGhhbmRsZVNjcm9sbCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHNob3VsZEJlU2Nyb2xsZWQgPSBib2R5RWxlbWVudC5zY3JvbGxUb3AgPiBTQ1JPTExFRF9USFJFU0hPTEQ7XG4gICAgICBpZiAoc2hvdWxkQmVTY3JvbGxlZCAhPT0gaXNTY3JvbGxlZCkge1xuICAgICAgICBpc1Njcm9sbGVkID0gc2hvdWxkQmVTY3JvbGxlZDtcbiAgICAgICAgZm9ybUNvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKFNDUk9MTEVEX0NMQVNTLCBzaG91bGRCZVNjcm9sbGVkKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbCBjaGVja1xuICAgIGhhbmRsZVNjcm9sbCgpO1xuXG4gICAgLy8gTGlzdGVuIGZvciBzY3JvbGwgZXZlbnRzXG4gICAgYm9keUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCBoYW5kbGVTY3JvbGwsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNsZWFudXBGbnMucHVzaCgoKSA9PiB7XG4gICAgICBib2R5RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIGhhbmRsZVNjcm9sbCk7XG4gICAgICBmb3JtQ29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoU0NST0xMRURfQ0xBU1MpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBSZXR1cm4gY2xlYW51cCBmdW5jdGlvblxuICByZXR1cm4gKCkgPT4ge1xuICAgIGNsZWFudXBGbnMuZm9yRWFjaCgoZm4pID0+IGZuKCkpO1xuICB9O1xufTtcblxuLyoqXG4gKiB3aXRoTGF5b3V0IGZlYXR1cmVcbiAqIEFkZHMgZm9ybSBlbGVtZW50IGNyZWF0aW9uIGFuZCBsYXlvdXQgcHJvY2Vzc2luZ1xuICovXG5leHBvcnQgY29uc3Qgd2l0aExheW91dCA9IChjb25maWc6IEZvcm1Db25maWcpID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgQmFzZUZvcm1Db21wb25lbnQ+KFxuICAgIGNvbXBvbmVudDogVCxcbiAgKTogVCAmIHtcbiAgICBmb3JtOiBIVE1MRm9ybUVsZW1lbnQ7XG4gICAgdWk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGxheW91dFJlc3VsdDogdW5rbm93bjtcbiAgICBfY2xlYW51cFNjcm9sbEluZGljYXRvcj86ICgpID0+IHZvaWQ7XG4gIH0gPT4ge1xuICAgIC8vIENyZWF0ZSB0aGUgZm9ybSBlbGVtZW50XG4gICAgY29uc3QgZm9ybSA9IGNyZWF0ZUZvcm1FbGVtZW50KGNvbmZpZyk7XG5cbiAgICAvLyBBcHBlbmQgZm9ybSB0byBjb21wb25lbnQncyByb290IGVsZW1lbnRcbiAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFwcGVuZENoaWxkKGZvcm0pO1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3MgbGF5b3V0IHNjaGVtYSBpZiBwcm92aWRlZFxuICAgIGNvbnN0IHsgdWksIGxheW91dFJlc3VsdCB9ID0gY29uZmlnLmxheW91dFxuICAgICAgPyBwcm9jZXNzTGF5b3V0U2NoZW1hKGNvbmZpZy5sYXlvdXQsIGZvcm0sIGNvbmZpZylcbiAgICAgIDogeyB1aToge30sIGxheW91dFJlc3VsdDogbnVsbCB9O1xuXG4gICAgLy8gU2V0dXAgc2Nyb2xsIGluZGljYXRvciBvbiBib2R5IGVsZW1lbnRzXG4gICAgY29uc3QgY2xlYW51cFNjcm9sbEluZGljYXRvciA9IHNldHVwU2Nyb2xsSW5kaWNhdG9yKFxuICAgICAgZm9ybSxcbiAgICAgIGNvbXBvbmVudC5lbGVtZW50LFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgZm9ybSxcbiAgICAgIHVpLFxuICAgICAgbGF5b3V0UmVzdWx0LFxuICAgICAgX2NsZWFudXBTY3JvbGxJbmRpY2F0b3I6IGNsZWFudXBTY3JvbGxJbmRpY2F0b3IsXG4gICAgfTtcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhMYXlvdXQ7XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL2Zvcm0vY29uc3RhbnRzLnRzXG5cbi8qKlxuICogRGF0YSBzdGF0ZSBjb25zdGFudHNcbiAqIFRyYWNrcyB3aGV0aGVyIGZvcm0gZGF0YSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGluaXRpYWwgc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IERBVEFfU1RBVEUgPSB7XG4gIC8qKiBEYXRhIG1hdGNoZXMgaW5pdGlhbCBzdGF0ZSAtIG5vIGNoYW5nZXMgbWFkZSAqL1xuICBQUklTVElORTogXCJwcmlzdGluZVwiLFxuICAvKiogRGF0YSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGluaXRpYWwgc3RhdGUgKi9cbiAgRElSVFk6IFwiZGlydHlcIixcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogRm9ybSBldmVudCBjb25zdGFudHNcbiAqL1xuZXhwb3J0IGNvbnN0IEZPUk1fRVZFTlRTID0ge1xuICAvKiogRmlyZWQgd2hlbiBhbnkgZmllbGQgdmFsdWUgY2hhbmdlcyAqL1xuICBDSEFOR0U6IFwiY2hhbmdlXCIsXG4gIC8qKiBGaXJlZCB3aGVuIGZvcm0gaXMgc3VibWl0dGVkICovXG4gIFNVQk1JVDogXCJzdWJtaXRcIixcbiAgLyoqIEZpcmVkIHdoZW4gZGF0YSBzdGF0ZSBjaGFuZ2VzIChwcmlzdGluZSA8LT4gZGlydHkpICovXG4gIFNUQVRFX0NIQU5HRTogXCJzdGF0ZTpjaGFuZ2VcIixcbiAgLyoqIEZpcmVkIHdoZW4gZGF0YSBpcyBzZXQgb24gdGhlIGZvcm0gKi9cbiAgREFUQV9TRVQ6IFwiZGF0YTpzZXRcIixcbiAgLyoqIEZpcmVkIHdoZW4gZGF0YSBpcyByZXRyaWV2ZWQgZnJvbSB0aGUgZm9ybSAqL1xuICBEQVRBX0dFVDogXCJkYXRhOmdldFwiLFxuICAvKiogRmlyZWQgd2hlbiBhIHNwZWNpZmljIGZpZWxkIGNoYW5nZXMgKi9cbiAgRklFTERfQ0hBTkdFOiBcImZpZWxkOmNoYW5nZVwiLFxuICAvKiogRmlyZWQgd2hlbiB2YWxpZGF0aW9uIGZhaWxzICovXG4gIFZBTElEQVRJT05fRVJST1I6IFwidmFsaWRhdGlvbjplcnJvclwiLFxuICAvKiogRmlyZWQgd2hlbiBzdWJtaXQgc3VjY2VlZHMgKi9cbiAgU1VCTUlUX1NVQ0NFU1M6IFwic3VibWl0OnN1Y2Nlc3NcIixcbiAgLyoqIEZpcmVkIHdoZW4gc3VibWl0IGZhaWxzICovXG4gIFNVQk1JVF9FUlJPUjogXCJzdWJtaXQ6ZXJyb3JcIixcbiAgLyoqIEZpcmVkIHdoZW4gZm9ybSBpcyByZXNldCB0byBpbml0aWFsIHN0YXRlICovXG4gIFJFU0VUOiBcInJlc2V0XCIsXG4gIC8qKiBGaXJlZCB3aGVuIHNldERhdGEgaXMgY2FsbGVkIHdpdGggdW5zYXZlZCBjaGFuZ2VzIChwcm90ZWN0aW9uIGVuYWJsZWQpICovXG4gIERBVEFfQ09ORkxJQ1Q6IFwiZGF0YTpjb25mbGljdFwiLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBGb3JtIENTUyBjbGFzcyBtb2RpZmllcnNcbiAqL1xuZXhwb3J0IGNvbnN0IEZPUk1fQ0xBU1NFUyA9IHtcbiAgLyoqIEFwcGxpZWQgd2hlbiBkYXRhIGhhcyBiZWVuIG1vZGlmaWVkICovXG4gIE1PRElGSUVEOiBcIm1vZGlmaWVkXCIsXG4gIC8qKiBBcHBsaWVkIHdoZW4gZm9ybSBpcyBzdWJtaXR0aW5nICovXG4gIFNVQk1JVFRJTkc6IFwic3VibWl0dGluZ1wiLFxuICAvKiogQXBwbGllZCB3aGVuIGZvcm0gaXMgZGlzYWJsZWQgKi9cbiAgRElTQUJMRUQ6IFwiZGlzYWJsZWRcIixcbiAgLyoqIEFwcGxpZWQgd2hlbiBmb3JtIGJvZHkgaXMgc2Nyb2xsZWQgYXdheSBmcm9tIHRvcCAqL1xuICBTQ1JPTExFRDogXCJtdHJsLWZvcm0tLXNjcm9sbGVkXCIsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIERlZmF1bHQgZm9ybSBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBGT1JNX0RFRkFVTFRTID0ge1xuICBwcmVmaXg6IFwibXRybFwiLFxuICBjb21wb25lbnROYW1lOiBcImZvcm1cIixcbiAgdGFnOiBcImRpdlwiLFxuICBmb3JtVGFnOiBcImZvcm1cIixcbiAgbWV0aG9kOiBcIlBPU1RcIixcbiAgYXV0b2NvbXBsZXRlOiBcIm9mZlwiLFxuICB1c2VDaGFuZ2VzOiB0cnVlLFxuICBjb250cm9sczogW1wic3VibWl0XCIsIFwiY2FuY2VsXCJdLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBGaWVsZCBuYW1lIHByZWZpeGVzIHVzZWQgZm9yIGV4dHJhY3Rpb25cbiAqL1xuZXhwb3J0IGNvbnN0IEZJRUxEX1BSRUZJWEVTID0ge1xuICBJTkZPOiBcImluZm8uXCIsXG4gIEZJTEU6IFwiZmlsZS5cIixcbiAgREFUQTogXCJkYXRhLlwiLFxufSBhcyBjb25zdDtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9jb25maWcudHNcblxuaW1wb3J0IHR5cGUgeyBGb3JtQ29uZmlnLCBGb3JtU3RhdGUsIEZvcm1EYXRhIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IEZPUk1fREVGQVVMVFMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuLy8gUmUtZXhwb3J0IEZPUk1fREVGQVVMVFMgZm9yIHVzZSBpbiBvdGhlciBtb2R1bGVzXG5leHBvcnQgeyBGT1JNX0RFRkFVTFRTIH07XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgYmFzZSBjb25maWd1cmF0aW9uIHdpdGggZGVmYXVsdHMgYXBwbGllZFxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlQmFzZUNvbmZpZyA9IChjb25maWc6IEZvcm1Db25maWcgPSB7fSk6IEZvcm1Db25maWcgPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLkZPUk1fREVGQVVMVFMsXG4gICAgLi4uY29uZmlnLFxuICAgIHByZWZpeDogY29uZmlnLnByZWZpeCB8fCBGT1JNX0RFRkFVTFRTLnByZWZpeCxcbiAgICBjb21wb25lbnROYW1lOiBjb25maWcuY29tcG9uZW50TmFtZSB8fCBGT1JNX0RFRkFVTFRTLmNvbXBvbmVudE5hbWUsXG4gICAgY29udHJvbHM6XG4gICAgICBjb25maWcuY29udHJvbHMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IGNvbmZpZy5jb250cm9sc1xuICAgICAgICA6IFsuLi5GT1JNX0RFRkFVTFRTLmNvbnRyb2xzXSxcbiAgICBzeXNpbmZvOiBjb25maWcuc3lzaW5mbyB8fCBbXSxcbiAgICB2YWxpZGF0aW9uOiBjb25maWcudmFsaWRhdGlvbiB8fCBbXSxcbiAgICBvbjogY29uZmlnLm9uIHx8IHt9LFxuICB9O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBpbml0aWFsIGZvcm0gc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUluaXRpYWxTdGF0ZSA9IChjb25maWc6IEZvcm1Db25maWcpOiBGb3JtU3RhdGUgPT4ge1xuICBjb25zdCBpbml0aWFsRGF0YSA9IGNvbmZpZy5kYXRhID8geyAuLi5jb25maWcuZGF0YSB9IDoge307XG5cbiAgcmV0dXJuIHtcbiAgICBtb2RpZmllZDogZmFsc2UsXG4gICAgc3VibWl0dGluZzogZmFsc2UsXG4gICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgIGluaXRpYWxEYXRhLFxuICAgIGN1cnJlbnREYXRhOiB7IC4uLmluaXRpYWxEYXRhIH0sXG4gICAgZXJyb3JzOiB7fSxcbiAgfTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgZWxlbWVudCBjb25maWd1cmF0aW9uIGZvciB3aXRoRWxlbWVudFxuICovXG5leHBvcnQgY29uc3QgZ2V0RWxlbWVudENvbmZpZyA9IChjb25maWc6IEZvcm1Db25maWcpID0+IHtcbiAgY29uc3QgcHJlZml4ID0gY29uZmlnLnByZWZpeCB8fCBGT1JNX0RFRkFVTFRTLnByZWZpeDtcbiAgY29uc3QgY29tcG9uZW50TmFtZSA9IGNvbmZpZy5jb21wb25lbnROYW1lIHx8IEZPUk1fREVGQVVMVFMuY29tcG9uZW50TmFtZTtcblxuICBjb25zdCBjbGFzc05hbWVzID0gW2Ake3ByZWZpeH0tJHtjb21wb25lbnROYW1lfWBdO1xuXG4gIGlmIChjb25maWcuY2xhc3MpIHtcbiAgICBjbGFzc05hbWVzLnB1c2goY29uZmlnLmNsYXNzKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdGFnOiBcImRpdlwiLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcy5qb2luKFwiIFwiKSxcbiAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICBcImRhdGEtY29tcG9uZW50XCI6IGNvbXBvbmVudE5hbWUsXG4gICAgfSxcbiAgfTtcbn07XG5cbi8qKlxuICogRXh0cmFjdHMgZmllbGQgbmFtZSBmcm9tIGEgcHJlZml4ZWQgbmFtZSAoZS5nLiwgJ2luZm8udXNlcm5hbWUnIC0+ICd1c2VybmFtZScpXG4gKi9cbmV4cG9ydCBjb25zdCBleHRyYWN0RmllbGROYW1lID0gKHByZWZpeGVkTmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgcGFydHMgPSBwcmVmaXhlZE5hbWUuc3BsaXQoXCIuXCIpO1xuICByZXR1cm4gcGFydHMubGVuZ3RoID4gMSA/IHBhcnRzLnNsaWNlKDEpLmpvaW4oXCIuXCIpIDogcHJlZml4ZWROYW1lO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBmdWxsIGZpZWxkIHBhdGggaW5jbHVkaW5nIHByZWZpeFxuICovXG5leHBvcnQgY29uc3QgZ2V0RmllbGRQYXRoID0gKG5hbWU6IHN0cmluZywgcHJlZml4OiBzdHJpbmcgPSBcImluZm9cIik6IHN0cmluZyA9PiB7XG4gIGlmIChuYW1lLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgIHJldHVybiBuYW1lO1xuICB9XG4gIHJldHVybiBgJHtwcmVmaXh9LiR7bmFtZX1gO1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBuYW1lIGlzIGEgZmllbGQgbmFtZSAoc3RhcnRzIHdpdGggaW5mby4gb3IgZGF0YS4pXG4gKi9cbmV4cG9ydCBjb25zdCBpc0ZpZWxkTmFtZSA9IChuYW1lOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgcmV0dXJuIG5hbWUuc3RhcnRzV2l0aChcImluZm8uXCIpIHx8IG5hbWUuc3RhcnRzV2l0aChcImRhdGEuXCIpO1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBuYW1lIGlzIGEgZmlsZSBmaWVsZCBuYW1lXG4gKi9cbmV4cG9ydCBjb25zdCBpc0ZpbGVOYW1lID0gKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gbmFtZS5zdGFydHNXaXRoKFwiZmlsZS5cIik7XG59O1xuXG4vKipcbiAqIERlZXAgY29tcGFyaXNvbiBvZiB0d28gdmFsdWVzIGZvciBjaGFuZ2UgZGV0ZWN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBpc1ZhbHVlRXF1YWwgPSAoYTogdW5rbm93biwgYjogdW5rbm93bik6IGJvb2xlYW4gPT4ge1xuICAvLyBIYW5kbGUgbnVsbC91bmRlZmluZWRcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgcmV0dXJuIGEgPT0gYjtcblxuICAvLyBIYW5kbGUgYXJyYXlzXG4gIGlmIChBcnJheS5pc0FycmF5KGEpICYmIEFycmF5LmlzQXJyYXkoYikpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGEuZXZlcnkoKHZhbCwgaWR4KSA9PiBpc1ZhbHVlRXF1YWwodmFsLCBiW2lkeF0pKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBvYmplY3RzXG4gIGlmICh0eXBlb2YgYSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgYiA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IGtleXNBID0gT2JqZWN0LmtleXMoYSBhcyBvYmplY3QpO1xuICAgIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMoYiBhcyBvYmplY3QpO1xuICAgIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBrZXlzQS5ldmVyeSgoa2V5KSA9PlxuICAgICAgaXNWYWx1ZUVxdWFsKFxuICAgICAgICAoYSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSxcbiAgICAgICAgKGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0sXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvLyBIYW5kbGUgcHJpbWl0aXZlcyAod2l0aCB0eXBlIGNvZXJjaW9uIGZvciBzdHJpbmcvbnVtYmVyIGNvbXBhcmlzb24pXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcbiAgcmV0dXJuIGEgPT0gYjtcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIGZvcm0gZGF0YSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGluaXRpYWwgc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IGhhc0RhdGFDaGFuZ2VkID0gKFxuICBpbml0aWFsOiBGb3JtRGF0YSxcbiAgY3VycmVudDogRm9ybURhdGEsXG4pOiBib29sZWFuID0+IHtcbiAgY29uc3QgYWxsS2V5cyA9IG5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGluaXRpYWwpLCAuLi5PYmplY3Qua2V5cyhjdXJyZW50KV0pO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIGFsbEtleXMpIHtcbiAgICBpZiAoIWlzVmFsdWVFcXVhbChpbml0aWFsW2tleV0sIGN1cnJlbnRba2V5XSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogR2V0cyBvbmx5IHRoZSBtb2RpZmllZCBmaWVsZHMgYmV0d2VlbiBpbml0aWFsIGFuZCBjdXJyZW50IGRhdGFcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE1vZGlmaWVkRmllbGRzID0gKFxuICBpbml0aWFsOiBGb3JtRGF0YSxcbiAgY3VycmVudDogRm9ybURhdGEsXG4pOiBGb3JtRGF0YSA9PiB7XG4gIGNvbnN0IG1vZGlmaWVkOiBGb3JtRGF0YSA9IHt9O1xuICBjb25zdCBhbGxLZXlzID0gbmV3IFNldChbLi4uT2JqZWN0LmtleXMoaW5pdGlhbCksIC4uLk9iamVjdC5rZXlzKGN1cnJlbnQpXSk7XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgYWxsS2V5cykge1xuICAgIGlmICghaXNWYWx1ZUVxdWFsKGluaXRpYWxba2V5XSwgY3VycmVudFtrZXldKSkge1xuICAgICAgbW9kaWZpZWRba2V5XSA9IGN1cnJlbnRba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbW9kaWZpZWQ7XG59O1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2ZpZWxkcy50c1xuXG4vKipcbiAqIEZpZWxkcyBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogRXh0cmFjdHMgZmllbGRzIGZyb20gbGF5b3V0IGFuZCBtYW5hZ2VzIHRoZSBmaWVsZCByZWdpc3RyeVxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRm9ybUNvbmZpZyxcbiAgQmFzZUZvcm1Db21wb25lbnQsXG4gIEZvcm1GaWVsZCxcbiAgRm9ybUZpZWxkUmVnaXN0cnksXG4gIEZpZWxkVmFsdWUsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgaXNGaWVsZE5hbWUsIGlzRmlsZU5hbWUsIGV4dHJhY3RGaWVsZE5hbWUgfSBmcm9tIFwiLi4vY29uZmlnXCI7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIG9iamVjdCBpcyBhIHZhbGlkIGZvcm0gZmllbGQgY29tcG9uZW50XG4gKiBBIGZvcm0gZmllbGQgbXVzdCBoYXZlIGF0IGxlYXN0IGdldFZhbHVlIG9yIHNldFZhbHVlIG1ldGhvZFxuICovXG5jb25zdCBpc0Zvcm1GaWVsZCA9IChvYmo6IHVua25vd24pOiBvYmogaXMgRm9ybUZpZWxkID0+IHtcbiAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGNhbmRpZGF0ZSA9IG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvLyBNdXN0IGhhdmUgZWxlbWVudCBwcm9wZXJ0eVxuICBpZiAoIWNhbmRpZGF0ZS5lbGVtZW50IHx8ICEoY2FuZGlkYXRlLmVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBNdXN0IGhhdmUgZ2V0VmFsdWUgb3Igc2V0VmFsdWVcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgY2FuZGlkYXRlLmdldFZhbHVlID09PSBcImZ1bmN0aW9uXCIgfHxcbiAgICB0eXBlb2YgY2FuZGlkYXRlLnNldFZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgKTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgdmFsdWUgZnJvbSBhIGZpZWxkIGNvbXBvbmVudFxuICogQWxsIG10cmwgY29tcG9uZW50cyBub3cgaGF2ZSB1bmlmaWVkIGdldFZhbHVlKCkgQVBJOlxuICogLSBUZXh0ZmllbGQ6IHJldHVybnMgc3RyaW5nXG4gKiAtIFNlbGVjdDogcmV0dXJucyBzdHJpbmcgb3Igc3RyaW5nW11cbiAqIC0gQ2hpcHM6IHJldHVybnMgc3RyaW5nW11cbiAqIC0gU3dpdGNoL0NoZWNrYm94OiByZXR1cm5zIGJvb2xlYW4gKHVwZGF0ZWQgaW4gbXRybCBjb3JlKVxuICovXG5leHBvcnQgY29uc3QgZ2V0RmllbGRWYWx1ZSA9IChmaWVsZDogRm9ybUZpZWxkKTogRmllbGRWYWx1ZSA9PiB7XG4gIGlmICh0eXBlb2YgZmllbGQuZ2V0VmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBmaWVsZC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLy8gRmFsbGJhY2s6IGNoZWNrIGZvciB2YWx1ZSBwcm9wZXJ0eVxuICBjb25zdCBmaWVsZEFueSA9IGZpZWxkIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlmIChcInZhbHVlXCIgaW4gZmllbGRBbnkpIHtcbiAgICByZXR1cm4gZmllbGRBbnkudmFsdWUgYXMgRmllbGRWYWx1ZTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIG9uIGEgZmllbGQgY29tcG9uZW50XG4gKiBBbGwgbXRybCBjb21wb25lbnRzIG5vdyBoYXZlIHVuaWZpZWQgc2V0VmFsdWUoKSBBUEk6XG4gKiAtIFRleHRmaWVsZDogYWNjZXB0cyBzdHJpbmdcbiAqIC0gU2VsZWN0OiBhY2NlcHRzIHN0cmluZyBvciBzdHJpbmdbXVxuICogLSBDaGlwczogYWNjZXB0cyBzdHJpbmdbXVxuICogLSBTd2l0Y2gvQ2hlY2tib3g6IGFjY2VwdHMgYm9vbGVhbiBvciBzdHJpbmcgKFwidHJ1ZVwiL1wiZmFsc2VcIikgKHVwZGF0ZWQgaW4gbXRybCBjb3JlKVxuICpcbiAqIEZvciBzaWxlbnQgdXBkYXRlcyAobm8gY2hhbmdlIGV2ZW50cyksIHdlIHNldCBkaXJlY3RseSBvbiB0aGUgaW5wdXQgZWxlbWVudFxuICovXG5leHBvcnQgY29uc3Qgc2V0RmllbGRWYWx1ZSA9IChcbiAgZmllbGQ6IEZvcm1GaWVsZCxcbiAgdmFsdWU6IEZpZWxkVmFsdWUsXG4gIHNpbGVudDogYm9vbGVhbiA9IGZhbHNlLFxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IGZpZWxkQW55ID0gZmllbGQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgc2VsZWN0IGNvbXBvbmVudCAoaGFzIHRleHRmaWVsZCBwcm9wZXJ0eSlcbiAgLy8gU2VsZWN0IGNvbXBvbmVudHMgbXVzdCBhbHdheXMgdXNlIHNldFZhbHVlIHRvIHVwZGF0ZSBpbnRlcm5hbCBzdGF0ZVxuICBjb25zdCBpc1NlbGVjdENvbXBvbmVudCA9IFwidGV4dGZpZWxkXCIgaW4gZmllbGRBbnkgJiYgXCJtZW51XCIgaW4gZmllbGRBbnk7XG5cbiAgaWYgKHNpbGVudCAmJiAhaXNTZWxlY3RDb21wb25lbnQpIHtcbiAgICAvLyBTaWxlbnQgdXBkYXRlOiBzZXQgZGlyZWN0bHkgb24gaW5wdXQgdG8gYXZvaWQgdHJpZ2dlcmluZyBjaGFuZ2UgZXZlbnRzXG4gICAgLy8gU2tpcCB0aGlzIGZvciBzZWxlY3QgY29tcG9uZW50cyAtIHRoZXkgbmVlZCBzZXRWYWx1ZSB0byB1cGRhdGUgaW50ZXJuYWwgc3RhdGVcbiAgICBjb25zdCBpbnB1dCA9IGZpZWxkQW55LmlucHV0IGFzXG4gICAgICB8IEhUTUxJbnB1dEVsZW1lbnRcbiAgICAgIHwgSFRNTFRleHRBcmVhRWxlbWVudFxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlucHV0KSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgY2hlY2tib3gvc3dpdGNoIChoYXMgY2hlY2tlZCBwcm9wZXJ0eSlcbiAgICAgIC8vIE5lZWQgdG8gbmFycm93IHR5cGUgdG8gSFRNTElucHV0RWxlbWVudCBiZWZvcmUgYWNjZXNzaW5nIGNoZWNrZWRcbiAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgaW5wdXQudHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XG4gICAgICAgIGNvbnN0IHNob3VsZEJlQ2hlY2tlZCA9XG4gICAgICAgICAgdmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IFwidHJ1ZVwiIHx8IHZhbHVlID09PSAxO1xuICAgICAgICBpbnB1dC5jaGVja2VkID0gc2hvdWxkQmVDaGVja2VkO1xuICAgICAgICAvLyBVcGRhdGUgdmlzdWFsIHN0YXRlIGJ5IHRvZ2dsaW5nIHRoZSBjaGVja2VkIGNsYXNzXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBmaWVsZEFueS5lbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IEFycmF5LmZyb20oZWxlbWVudC5jbGFzc0xpc3QpO1xuICAgICAgICAgIGNvbnN0IGJhc2VDbGFzcyA9IGNsYXNzTGlzdC5maW5kKFxuICAgICAgICAgICAgKGMpID0+IGMuc3RhcnRzV2l0aChcIm10cmwtXCIpICYmICFjLmluY2x1ZGVzKFwiLS1cIiksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoYmFzZUNsYXNzKSB7XG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoYCR7YmFzZUNsYXNzfS0tY2hlY2tlZGAsIHNob3VsZEJlQ2hlY2tlZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUZXh0IGlucHV0IC0gc2V0IHZhbHVlIGRpcmVjdGx5XG4gICAgICAgIGlucHV0LnZhbHVlID0gKHZhbHVlIGFzIHN0cmluZykgPz8gXCJcIjtcbiAgICAgICAgLy8gVXBkYXRlIHZpc3VhbCBzdGF0ZSAtIHRvZ2dsZSAtLWVtcHR5IGNsYXNzIGJhc2VkIG9uIHZhbHVlXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBmaWVsZEFueS5lbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IEFycmF5LmZyb20oZWxlbWVudC5jbGFzc0xpc3QpO1xuICAgICAgICAgIGNvbnN0IGJhc2VDbGFzcyA9IGNsYXNzTGlzdC5maW5kKFxuICAgICAgICAgICAgKGMpID0+IGMuc3RhcnRzV2l0aChcIm10cmwtXCIpICYmICFjLmluY2x1ZGVzKFwiLS1cIiksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoYmFzZUNsYXNzKSB7XG4gICAgICAgICAgICBjb25zdCBpc0VtcHR5ID0gIWlucHV0LnZhbHVlO1xuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKGAke2Jhc2VDbGFzc30tLWVtcHR5YCwgaXNFbXB0eSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEZvciBjb21wb25lbnRzIHdpdGhvdXQgaW5wdXQgKGxpa2UgY2hpcHMsIHNlbGVjdCksIGZhbGwgdGhyb3VnaCB0byBzZXRWYWx1ZVxuICAgIC8vIGJ1dCBzdGlsbCB1c2Ugc2lsZW50IG1vZGUgYmVoYXZpb3IgKG5vIGV2ZW50cyB0cmlnZ2VyZWQpXG4gIH1cblxuICAvLyBOb3JtYWwgdXBkYXRlOiB1c2UgY29tcG9uZW50J3Mgc2V0VmFsdWUgbWV0aG9kXG4gIGlmICh0eXBlb2YgZmllbGQuc2V0VmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGZpZWxkLnNldFZhbHVlKHZhbHVlKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBGYWxsYmFjazogc2V0IHZhbHVlIHByb3BlcnR5IGRpcmVjdGx5XG4gIGlmIChcInZhbHVlXCIgaW4gZmllbGRBbnkpIHtcbiAgICBmaWVsZEFueS52YWx1ZSA9IHZhbHVlO1xuICB9XG59O1xuXG4vKipcbiAqIEV4dHJhY3RzIGZpZWxkcyBmcm9tIHRoZSBVSSBjb21wb25lbnQgcmVnaXN0cnlcbiAqIExvb2tzIGZvciBjb21wb25lbnRzIHdpdGggbmFtZXMgc3RhcnRpbmcgd2l0aCAnaW5mby4nIG9yICdkYXRhLidcbiAqL1xuY29uc3QgZXh0cmFjdEZpZWxkcyA9IChcbiAgdWk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBjb25maWc6IEZvcm1Db25maWcsXG4pOiB7IGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnk7IGZpbGVzOiBGb3JtRmllbGRSZWdpc3RyeSB9ID0+IHtcbiAgY29uc3QgZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeSA9IG5ldyBNYXAoKTtcbiAgY29uc3QgZmlsZXM6IEZvcm1GaWVsZFJlZ2lzdHJ5ID0gbmV3IE1hcCgpO1xuXG4gIGlmICghdWkpIHJldHVybiB7IGZpZWxkcywgZmlsZXMgfTtcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBjb21wb25lbnRdIG9mIE9iamVjdC5lbnRyaWVzKHVpKSkge1xuICAgIC8vIFNraXAgbm9uLWZpZWxkIGNvbXBvbmVudHNcbiAgICBpZiAoIWlzRm9ybUZpZWxkKGNvbXBvbmVudCkpIGNvbnRpbnVlO1xuXG4gICAgaWYgKGlzRmllbGROYW1lKG5hbWUpKSB7XG4gICAgICAvLyBFeHRyYWN0IGZpZWxkIG5hbWUgd2l0aG91dCBwcmVmaXggKGluZm8udXNlcm5hbWUgLT4gdXNlcm5hbWUpXG4gICAgICBjb25zdCBmaWVsZE5hbWUgPSBleHRyYWN0RmllbGROYW1lKG5hbWUpO1xuICAgICAgZmllbGRzLnNldChmaWVsZE5hbWUsIGNvbXBvbmVudCk7XG4gICAgfSBlbHNlIGlmIChpc0ZpbGVOYW1lKG5hbWUpKSB7XG4gICAgICAvLyBFeHRyYWN0IGZpbGUgbmFtZSB3aXRob3V0IHByZWZpeCAoZmlsZS5hdmF0YXIgLT4gYXZhdGFyKVxuICAgICAgY29uc3QgZmlsZU5hbWUgPSBleHRyYWN0RmllbGROYW1lKG5hbWUpO1xuICAgICAgZmlsZXMuc2V0KGZpbGVOYW1lLCBjb21wb25lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGZpZWxkcywgZmlsZXMgfTtcbn07XG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIGZpZWxkIHZhbHVlcyBmb3IgZXF1YWxpdHlcbiAqIEhhbmRsZXMgYXJyYXlzIChmb3IgY2hpcHMvbXVsdGktc2VsZWN0KSBhbmQgcHJpbWl0aXZlIHZhbHVlc1xuICovXG5jb25zdCB2YWx1ZXNFcXVhbCA9IChhOiBGaWVsZFZhbHVlLCBiOiBGaWVsZFZhbHVlKTogYm9vbGVhbiA9PiB7XG4gIC8vIEhhbmRsZSBudWxsL3VuZGVmaW5lZFxuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG4gIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gSGFuZGxlIGFycmF5cyAoY2hpcHMsIG11bHRpLXNlbGVjdClcbiAgaWYgKEFycmF5LmlzQXJyYXkoYSkgJiYgQXJyYXkuaXNBcnJheShiKSkge1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gYS5ldmVyeSgodmFsLCBpKSA9PiB2YWwgPT09IGJbaV0pO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBCaW5kcyBjaGFuZ2UgYW5kIGlucHV0IGV2ZW50cyB0byBmaWVsZHNcbiAqIENhbGxzIHRoZSBwcm92aWRlZCBjYWxsYmFjayB3aGVuIGFueSBmaWVsZCBjaGFuZ2VzXG4gKlxuICogTGlzdGVucyB0byBib3RoICdpbnB1dCcgKGZvciBpbW1lZGlhdGUgZmVlZGJhY2sgd2hpbGUgdHlwaW5nKVxuICogYW5kICdjaGFuZ2UnIChmb3IgY29tcG9uZW50cyB0aGF0IG9ubHkgZW1pdCBvbiBibHVyL3NlbGVjdGlvbilcbiAqXG4gKiBEZWR1cGxpY2F0ZXMgZXZlbnRzIHRvIHByZXZlbnQgZG91YmxlLWZpcmluZyB3aGVuIGJvdGggaW5wdXQgYW5kIGNoYW5nZVxuICogZW1pdCBmb3IgdGhlIHNhbWUgdmFsdWUgKGUuZy4sIHRleHRmaWVsZCBpbnB1dCBmb2xsb3dlZCBieSBibHVyKVxuICovXG4vKipcbiAqIFRyYWNrcyBsYXN0IGVtaXR0ZWQgdmFsdWVzIHBlciBmaWVsZCBmb3IgZGVkdXBsaWNhdGlvblxuICogRXhwb3NlZCBzbyB0aGF0IHNldERhdGEgY2FuIHVwZGF0ZSBpdCB3aGVuIHNldHRpbmcgdmFsdWVzIHNpbGVudGx5XG4gKi9cbmxldCBmaWVsZFZhbHVlVHJhY2tlcjogTWFwPHN0cmluZywgRmllbGRWYWx1ZT4gfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBVcGRhdGVzIHRoZSB0cmFja2VkIHZhbHVlIGZvciBhIGZpZWxkXG4gKiBDYWxsZWQgd2hlbiBzZXREYXRhIGlzIHVzZWQgd2l0aCBzaWxlbnQ9dHJ1ZSB0byBrZWVwIGRlZHVwbGljYXRpb24gaW4gc3luY1xuICovXG5leHBvcnQgY29uc3QgdXBkYXRlVHJhY2tlZEZpZWxkVmFsdWUgPSAoXG4gIG5hbWU6IHN0cmluZyxcbiAgdmFsdWU6IEZpZWxkVmFsdWUsXG4pOiB2b2lkID0+IHtcbiAgaWYgKGZpZWxkVmFsdWVUcmFja2VyKSB7XG4gICAgZmllbGRWYWx1ZVRyYWNrZXIuc2V0KG5hbWUsIHZhbHVlKTtcbiAgfVxufTtcblxuLyoqXG4gKiBVcGRhdGVzIGFsbCB0cmFja2VkIGZpZWxkIHZhbHVlcyBmcm9tIGEgZmllbGRzIHJlZ2lzdHJ5XG4gKiBDYWxsZWQgYWZ0ZXIgc2lsZW50IHNldERhdGEgdG8gc3luYyBkZWR1cGxpY2F0aW9uIHN0YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBzeW5jVHJhY2tlZEZpZWxkVmFsdWVzID0gKGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnkpOiB2b2lkID0+IHtcbiAgaWYgKGZpZWxkVmFsdWVUcmFja2VyKSB7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgZmllbGRdIG9mIGZpZWxkcykge1xuICAgICAgZmllbGRWYWx1ZVRyYWNrZXIuc2V0KG5hbWUsIGdldEZpZWxkVmFsdWUoZmllbGQpKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogUmVzZXRzIHRoZSBmaWVsZCB2YWx1ZSB0cmFja2VyIGZvciBhIG5ldyBmb3JtXG4gKiBTaG91bGQgYmUgY2FsbGVkIGF0IHRoZSBzdGFydCBvZiB3aXRoRmllbGRzIGJlZm9yZSBiaW5kRmllbGRFdmVudHNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlc2V0RmllbGRWYWx1ZVRyYWNrZXIgPSAoKTogdm9pZCA9PiB7XG4gIGZpZWxkVmFsdWVUcmFja2VyID0gbmV3IE1hcDxzdHJpbmcsIEZpZWxkVmFsdWU+KCk7XG59O1xuXG5jb25zdCBiaW5kRmllbGRFdmVudHMgPSAoXG4gIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnksXG4gIG9uRmllbGRDaGFuZ2U6IChuYW1lOiBzdHJpbmcsIHZhbHVlOiBGaWVsZFZhbHVlKSA9PiB2b2lkLFxuKTogdm9pZCA9PiB7XG4gIC8vIFVzZSB0aGUgc2hhcmVkIHRyYWNrZXIgKHNob3VsZCBiZSBpbml0aWFsaXplZCBieSByZXNldEZpZWxkVmFsdWVUcmFja2VyIGJlZm9yZSB0aGlzKVxuICBpZiAoIWZpZWxkVmFsdWVUcmFja2VyKSB7XG4gICAgZmllbGRWYWx1ZVRyYWNrZXIgPSBuZXcgTWFwPHN0cmluZywgRmllbGRWYWx1ZT4oKTtcbiAgfVxuXG4gIGNvbnN0IGxhc3RFbWl0dGVkVmFsdWVzID0gZmllbGRWYWx1ZVRyYWNrZXI7XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgZmllbGRdIG9mIGZpZWxkcykge1xuICAgIGlmICh0eXBlb2YgZmllbGQub24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIGN1cnJlbnQgdmFsdWVcbiAgICAgIGxhc3RFbWl0dGVkVmFsdWVzLnNldChuYW1lLCBnZXRGaWVsZFZhbHVlKGZpZWxkKSk7XG5cbiAgICAgIC8vIEhhbmRsZXIgdGhhdCBkZWR1cGVzIGJhc2VkIG9uIHZhbHVlXG4gICAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0RmllbGRWYWx1ZShmaWVsZCk7XG4gICAgICAgIGNvbnN0IGxhc3RWYWx1ZSA9IGxhc3RFbWl0dGVkVmFsdWVzLmdldChuYW1lKTtcblxuICAgICAgICAvLyBPbmx5IGVtaXQgaWYgdmFsdWUgYWN0dWFsbHkgY2hhbmdlZFxuICAgICAgICBpZiAoIXZhbHVlc0VxdWFsKHZhbHVlLCBsYXN0VmFsdWUpKSB7XG4gICAgICAgICAgbGFzdEVtaXR0ZWRWYWx1ZXMuc2V0KG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICBvbkZpZWxkQ2hhbmdlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8gTGlzdGVuIHRvICdpbnB1dCcgZm9yIGltbWVkaWF0ZSBmZWVkYmFjayAodGV4dGZpZWxkcyBlbWl0IHRoaXMgb24gZXZlcnkga2V5c3Ryb2tlKVxuICAgICAgZmllbGQub24oXCJpbnB1dFwiLCBoYW5kbGVDaGFuZ2UpO1xuXG4gICAgICAvLyBBbHNvIGxpc3RlbiB0byAnY2hhbmdlJyBmb3IgY29tcG9uZW50cyB0aGF0IG9ubHkgZW1pdCBvbiBibHVyL3NlbGVjdGlvblxuICAgICAgLy8gKGUuZy4sIHNlbGVjdCwgY2hpcHMsIHN3aXRjaClcbiAgICAgIGZpZWxkLm9uKFwiY2hhbmdlXCIsIGhhbmRsZUNoYW5nZSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIHdpdGhGaWVsZHMgZmVhdHVyZVxuICogQWRkcyBmaWVsZCBleHRyYWN0aW9uIGFuZCByZWdpc3RyeSBtYW5hZ2VtZW50IHRvIHRoZSBmb3JtXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoRmllbGRzID0gKGNvbmZpZzogRm9ybUNvbmZpZykgPT4ge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBCYXNlRm9ybUNvbXBvbmVudD4oXG4gICAgY29tcG9uZW50OiBULFxuICApOiBUICYge1xuICAgIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnk7XG4gICAgZmlsZXM6IEZvcm1GaWVsZFJlZ2lzdHJ5O1xuICAgIGdldEZpZWxkOiAobmFtZTogc3RyaW5nKSA9PiBGb3JtRmllbGQgfCB1bmRlZmluZWQ7XG4gICAgZ2V0RmllbGROYW1lczogKCkgPT4gc3RyaW5nW107XG4gICAgaGFzRmllbGQ6IChuYW1lOiBzdHJpbmcpID0+IGJvb2xlYW47XG4gIH0gPT4ge1xuICAgIC8vIEV4dHJhY3QgZmllbGRzIGZyb20gVUkgcmVnaXN0cnlcbiAgICBjb25zdCB7IGZpZWxkcywgZmlsZXMgfSA9IGV4dHJhY3RGaWVsZHMoY29tcG9uZW50LnVpIHx8IHt9LCBjb25maWcpO1xuXG4gICAgLy8gUmVzZXQgdHJhY2tlciBmb3IgdGhpcyBuZXcgZm9ybSBpbnN0YW5jZVxuICAgIC8vIFRoaXMgZW5zdXJlcyBlYWNoIGZvcm0gaGFzIGl0cyBvd24gdHJhY2tlciBhbmQgcHJldmVudHMgY3Jvc3MtZm9ybSBpbnRlcmZlcmVuY2VcbiAgICByZXNldEZpZWxkVmFsdWVUcmFja2VyKCk7XG5cbiAgICAvLyBCaW5kIGNoYW5nZSBldmVudHMgaWYgY29tcG9uZW50IGhhcyBlbWl0XG4gICAgaWYgKGNvbXBvbmVudC5lbWl0KSB7XG4gICAgICBiaW5kRmllbGRFdmVudHMoZmllbGRzLCAobmFtZSwgdmFsdWUpID0+IHtcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImZpZWxkOmNoYW5nZVwiLCB7IG5hbWUsIHZhbHVlIH0pO1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY2hhbmdlXCIsIHsgbmFtZSwgdmFsdWUgfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gQWxzbyBiaW5kIGNoYW5nZSBldmVudHMgdG8gZmlsZSBmaWVsZHNcbiAgICAgIGJpbmRGaWVsZEV2ZW50cyhmaWxlcywgKG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJmaWxlOmNoYW5nZVwiLCB7IG5hbWUsIHZhbHVlIH0pO1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY2hhbmdlXCIsIHsgbmFtZSwgdmFsdWUgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgZmllbGRzLFxuICAgICAgZmlsZXMsXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IGEgZmllbGQgY29tcG9uZW50IGJ5IG5hbWVcbiAgICAgICAqL1xuICAgICAgZ2V0RmllbGQobmFtZTogc3RyaW5nKTogRm9ybUZpZWxkIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkcy5nZXQobmFtZSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBhbGwgZmllbGQgbmFtZXNcbiAgICAgICAqL1xuICAgICAgZ2V0RmllbGROYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKGZpZWxkcy5rZXlzKCkpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDaGVjayBpZiBhIGZpZWxkIGV4aXN0c1xuICAgICAgICovXG4gICAgICBoYXNGaWVsZChuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkcy5oYXMobmFtZSk7XG4gICAgICB9LFxuICAgIH07XG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCB3aXRoRmllbGRzO1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2RhdGEudHNcblxuLyoqXG4gKiBEYXRhIGZlYXR1cmUgZm9yIEZvcm0gY29tcG9uZW50XG4gKiBIYW5kbGVzIGZvcm0gZGF0YSBvcGVyYXRpb25zOiBnZXQvc2V0IGRhdGEsIGNoYW5nZSB0cmFja2luZywgc25hcHNob3RzLFxuICogYW5kIGNoYW5nZSBwcm90ZWN0aW9uIChiZWZvcmV1bmxvYWQgd2FybmluZywgZGF0YSBjb25mbGljdCBkZXRlY3Rpb24pXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBGb3JtQ29uZmlnLFxuICBCYXNlRm9ybUNvbXBvbmVudCxcbiAgRm9ybURhdGEsXG4gIEZvcm1TdGF0ZSxcbiAgRmllbGRWYWx1ZSxcbiAgRm9ybUZpZWxkUmVnaXN0cnksXG4gIFByb3RlY3RDaGFuZ2VzQ29uZmlnLFxuICBEYXRhQ29uZmxpY3RFdmVudCxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQge1xuICBjcmVhdGVJbml0aWFsU3RhdGUsXG4gIGhhc0RhdGFDaGFuZ2VkLFxuICBnZXRNb2RpZmllZEZpZWxkcyxcbn0gZnJvbSBcIi4uL2NvbmZpZ1wiO1xuaW1wb3J0IHsgZ2V0RmllbGRWYWx1ZSwgc2V0RmllbGRWYWx1ZSwgc3luY1RyYWNrZWRGaWVsZFZhbHVlcyB9IGZyb20gXCIuL2ZpZWxkc1wiO1xuaW1wb3J0IHsgRk9STV9FVkVOVFMsIERBVEFfU1RBVEUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQ29sbGVjdHMgY3VycmVudCB2YWx1ZXMgZnJvbSBhbGwgZmllbGRzXG4gKi9cbmNvbnN0IGNvbGxlY3RGaWVsZERhdGEgPSAoZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeSk6IEZvcm1EYXRhID0+IHtcbiAgY29uc3QgZGF0YTogRm9ybURhdGEgPSB7fTtcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBmaWVsZF0gb2YgZmllbGRzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBnZXRGaWVsZFZhbHVlKGZpZWxkKTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZGF0YVtuYW1lXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufTtcblxuLyoqXG4gKiBTZXRzIHZhbHVlcyBvbiBmaWVsZHMgZnJvbSBhIGRhdGEgb2JqZWN0XG4gKiBTdXBwb3J0cyBkb3Qgbm90YXRpb24gZm9yIG5lc3RlZCB2YWx1ZXMgKGUuZy4sIHsgJ3VzZXIubmFtZSc6ICdKb2huJyB9KVxuICovXG5jb25zdCBzZXRGaWVsZHNEYXRhID0gKFxuICBmaWVsZHM6IEZvcm1GaWVsZFJlZ2lzdHJ5LFxuICBkYXRhOiBGb3JtRGF0YSxcbiAgc2lsZW50OiBib29sZWFuID0gZmFsc2UsXG4pOiB2b2lkID0+IHtcbiAgZm9yIChjb25zdCBbbmFtZSwgZmllbGRdIG9mIGZpZWxkcykge1xuICAgIC8vIENoZWNrIGZvciBleGFjdCBtYXRjaCBmaXJzdFxuICAgIGlmIChuYW1lIGluIGRhdGEpIHtcbiAgICAgIHNldEZpZWxkVmFsdWUoZmllbGQsIGRhdGFbbmFtZV0sIHNpbGVudCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgbmVzdGVkIHZhbHVlIHVzaW5nIGRvdCBub3RhdGlvblxuICAgIC8vIGUuZy4sIGZpZWxkIG5hbWUgJ3VzZXJuYW1lJyBtaWdodCBiZSBpbiBkYXRhIGFzIG5lc3RlZCB7IGluZm86IHsgdXNlcm5hbWU6ICd2YWx1ZScgfSB9XG4gICAgY29uc3QgdmFsdWUgPSBnZXROZXN0ZWRWYWx1ZShkYXRhLCBuYW1lKTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2V0RmllbGRWYWx1ZShmaWVsZCwgdmFsdWUgYXMgRmllbGRWYWx1ZSwgc2lsZW50KTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogR2V0cyBhIG5lc3RlZCB2YWx1ZSBmcm9tIGFuIG9iamVjdCB1c2luZyBkb3Qgbm90YXRpb25cbiAqL1xuY29uc3QgZ2V0TmVzdGVkVmFsdWUgPSAoXG4gIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHBhdGg6IHN0cmluZyxcbik6IHVua25vd24gPT4ge1xuICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIuXCIpO1xuICBsZXQgY3VycmVudDogdW5rbm93biA9IG9iajtcblxuICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY3VycmVudCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY3VycmVudCA9IChjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtwYXJ0XTtcbiAgfVxuXG4gIHJldHVybiBjdXJyZW50O1xufTtcblxuLyoqXG4gKiBTZXRzIGEgbmVzdGVkIHZhbHVlIGluIGFuIG9iamVjdCB1c2luZyBkb3Qgbm90YXRpb25cbiAqL1xuY29uc3Qgc2V0TmVzdGVkVmFsdWUgPSAoXG4gIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHBhdGg6IHN0cmluZyxcbiAgdmFsdWU6IHVua25vd24sXG4pOiB2b2lkID0+IHtcbiAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiLlwiKTtcbiAgbGV0IGN1cnJlbnQgPSBvYmo7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XG4gICAgaWYgKCEocGFydCBpbiBjdXJyZW50KSB8fCB0eXBlb2YgY3VycmVudFtwYXJ0XSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgY3VycmVudFtwYXJ0XSA9IHt9O1xuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0XSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIGN1cnJlbnRbcGFydHNbcGFydHMubGVuZ3RoIC0gMV1dID0gdmFsdWU7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGZsYXQgZmllbGQgZGF0YSB0byBuZXN0ZWQgb2JqZWN0IHN0cnVjdHVyZVxuICogZS5nLiwgeyAndXNlci5uYW1lJzogJ0pvaG4nIH0gLT4geyB1c2VyOiB7IG5hbWU6ICdKb2huJyB9IH1cbiAqL1xuY29uc3QgZmxhdFRvTmVzdGVkID0gKGRhdGE6IEZvcm1EYXRhKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGF0YSkpIHtcbiAgICBpZiAoa2V5LmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgc2V0TmVzdGVkVmFsdWUocmVzdWx0LCBrZXksIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBOb3JtYWxpemVzIHByb3RlY3Rpb24gY29uZmlnIHRvIGEgY29uc2lzdGVudCBvYmplY3QgZm9ybWF0XG4gKi9cbmNvbnN0IG5vcm1hbGl6ZVByb3RlY3RDb25maWcgPSAoXG4gIGNvbmZpZzogYm9vbGVhbiB8IFByb3RlY3RDaGFuZ2VzQ29uZmlnIHwgdW5kZWZpbmVkLFxuKTogUHJvdGVjdENoYW5nZXNDb25maWcgPT4ge1xuICBpZiAoIWNvbmZpZykge1xuICAgIHJldHVybiB7IGJlZm9yZVVubG9hZDogZmFsc2UsIG9uRGF0YU92ZXJ3cml0ZTogZmFsc2UgfTtcbiAgfVxuICBpZiAoY29uZmlnID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHsgYmVmb3JlVW5sb2FkOiB0cnVlLCBvbkRhdGFPdmVyd3JpdGU6IHRydWUgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGJlZm9yZVVubG9hZDogY29uZmlnLmJlZm9yZVVubG9hZCA/PyBmYWxzZSxcbiAgICBvbkRhdGFPdmVyd3JpdGU6IGNvbmZpZy5vbkRhdGFPdmVyd3JpdGUgPz8gZmFsc2UsXG4gIH07XG59O1xuXG4vKipcbiAqIHdpdGhEYXRhIGZlYXR1cmVcbiAqIEFkZHMgZGF0YSBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcyB0byB0aGUgZm9ybVxuICovXG5leHBvcnQgY29uc3Qgd2l0aERhdGEgPSAoY29uZmlnOiBGb3JtQ29uZmlnKSA9PiB7XG4gIHJldHVybiA8XG4gICAgVCBleHRlbmRzIEJhc2VGb3JtQ29tcG9uZW50ICYge1xuICAgICAgZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeTtcbiAgICAgIGVtaXQ/OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG4gICAgfSxcbiAgPihcbiAgICBjb21wb25lbnQ6IFQsXG4gICk6IFQgJiB7XG4gICAgc3RhdGU6IEZvcm1TdGF0ZTtcbiAgICBnZXREYXRhOiAoKSA9PiBGb3JtRGF0YTtcbiAgICBzZXREYXRhOiAoZGF0YTogRm9ybURhdGEsIHNpbGVudD86IGJvb2xlYW4pID0+IHZvaWQ7XG4gICAgZ2V0RmllbGRWYWx1ZTogKG5hbWU6IHN0cmluZykgPT4gRmllbGRWYWx1ZTtcbiAgICBzZXRGaWVsZFZhbHVlOiAobmFtZTogc3RyaW5nLCB2YWx1ZTogRmllbGRWYWx1ZSwgc2lsZW50PzogYm9vbGVhbikgPT4gdm9pZDtcbiAgICBpc01vZGlmaWVkOiAoKSA9PiBib29sZWFuO1xuICAgIGdldE1vZGlmaWVkRGF0YTogKCkgPT4gRm9ybURhdGE7XG4gICAgc25hcHNob3Q6ICgpID0+IHZvaWQ7XG4gICAgcmVzZXQ6IChmb3JjZT86IGJvb2xlYW4pID0+IGJvb2xlYW47XG4gICAgY2xlYXI6IChmb3JjZT86IGJvb2xlYW4pID0+IGJvb2xlYW47XG4gIH0gPT4ge1xuICAgIC8vIEluaXRpYWxpemUgc3RhdGVcbiAgICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUluaXRpYWxTdGF0ZShjb25maWcpO1xuXG4gICAgLy8gTm9ybWFsaXplIHByb3RlY3Rpb24gY29uZmlndXJhdGlvblxuICAgIGNvbnN0IHByb3RlY3RDb25maWcgPSBub3JtYWxpemVQcm90ZWN0Q29uZmlnKGNvbmZpZy5wcm90ZWN0Q2hhbmdlcyk7XG5cbiAgICAvLyBUcmFjayB0aGUgYmVmb3JldW5sb2FkIGhhbmRsZXIgc28gd2UgY2FuIHJlbW92ZSBpdFxuICAgIGxldCBiZWZvcmVVbmxvYWRIYW5kbGVyOiAoKGU6IEJlZm9yZVVubG9hZEV2ZW50KSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogQmVmb3JldW5sb2FkIGhhbmRsZXIgLSB3YXJucyB1c2VyIHdoZW4gbGVhdmluZyB3aXRoIHVuc2F2ZWQgY2hhbmdlc1xuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUJlZm9yZVVubG9hZCA9IChlOiBCZWZvcmVVbmxvYWRFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKHN0YXRlLm1vZGlmaWVkKSB7XG4gICAgICAgIC8vIFN0YW5kYXJkIHdheSB0byB0cmlnZ2VyIHRoZSBicm93c2VyJ3MgXCJ1bnNhdmVkIGNoYW5nZXNcIiBkaWFsb2dcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAvLyBGb3Igb2xkZXIgYnJvd3NlcnMgLSByZXR1cm5WYWx1ZSBtdXN0IGJlIHNldFxuICAgICAgICBlLnJldHVyblZhbHVlID0gXCJcIjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIHRoZSBiZWZvcmV1bmxvYWQgaGFuZGxlciBpZiBwcm90ZWN0aW9uIGlzIGVuYWJsZWRcbiAgICAgKi9cbiAgICBjb25zdCByZWdpc3RlckJlZm9yZVVubG9hZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChwcm90ZWN0Q29uZmlnLmJlZm9yZVVubG9hZCAmJiAhYmVmb3JlVW5sb2FkSGFuZGxlcikge1xuICAgICAgICBiZWZvcmVVbmxvYWRIYW5kbGVyID0gaGFuZGxlQmVmb3JlVW5sb2FkO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJlZm9yZXVubG9hZFwiLCBiZWZvcmVVbmxvYWRIYW5kbGVyKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVW5yZWdpc3RlcnMgdGhlIGJlZm9yZXVubG9hZCBoYW5kbGVyXG4gICAgICovXG4gICAgY29uc3QgdW5yZWdpc3RlckJlZm9yZVVubG9hZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChiZWZvcmVVbmxvYWRIYW5kbGVyKSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsIGJlZm9yZVVubG9hZEhhbmRsZXIpO1xuICAgICAgICBiZWZvcmVVbmxvYWRIYW5kbGVyID0gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBiZWZvcmV1bmxvYWQgcmVnaXN0cmF0aW9uIGJhc2VkIG9uIG1vZGlmaWVkIHN0YXRlXG4gICAgICovXG4gICAgY29uc3QgdXBkYXRlQmVmb3JlVW5sb2FkU3RhdGUgPSAobW9kaWZpZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICAgIGlmIChwcm90ZWN0Q29uZmlnLmJlZm9yZVVubG9hZCkge1xuICAgICAgICBpZiAobW9kaWZpZWQpIHtcbiAgICAgICAgICByZWdpc3RlckJlZm9yZVVubG9hZCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIGtlZXAgdGhlIGhhbmRsZXIgcmVnaXN0ZXJlZCBidXQgaXQgb25seSBwcmV2ZW50cyB1bmxvYWQgd2hlbiBtb2RpZmllZFxuICAgICAgICAvLyBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gY29uc3RhbnRseSBhZGRpbmcvcmVtb3ZpbmcgdGhlIGxpc3RlbmVyXG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIElmIGluaXRpYWwgZGF0YSB3YXMgcHJvdmlkZWQsIHNldCBpdCBvbiBmaWVsZHNcbiAgICBpZiAoY29uZmlnLmRhdGEgJiYgY29tcG9uZW50LmZpZWxkcykge1xuICAgICAgc2V0RmllbGRzRGF0YShjb21wb25lbnQuZmllbGRzLCBjb25maWcuZGF0YSwgdHJ1ZSk7XG4gICAgICBzdGF0ZS5jdXJyZW50RGF0YSA9IGNvbGxlY3RGaWVsZERhdGEoY29tcG9uZW50LmZpZWxkcyk7XG4gICAgICBzdGF0ZS5pbml0aWFsRGF0YSA9IHsgLi4uc3RhdGUuY3VycmVudERhdGEgfTtcbiAgICAgIC8vIFN5bmMgdGhlIGZpZWxkIHZhbHVlIHRyYWNrZXIgZm9yIGV2ZW50IGRlZHVwbGljYXRpb25cbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBjaGFuZ2UgZGV0ZWN0aW9uIHdvcmtzIGNvcnJlY3RseSB3aGVuIGZpZWxkcyBhcmUgbW9kaWZpZWRcbiAgICAgIHN5bmNUcmFja2VkRmllbGRWYWx1ZXMoY29tcG9uZW50LmZpZWxkcyk7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBiZWZvcmV1bmxvYWQgcHJvdGVjdGlvbiBpZiBlbmFibGVkXG4gICAgaWYgKHByb3RlY3RDb25maWcuYmVmb3JlVW5sb2FkKSB7XG4gICAgICByZWdpc3RlckJlZm9yZVVubG9hZCgpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZXIgZm9yIGZpZWxkL2ZpbGUgY2hhbmdlcyB0byB1cGRhdGUgc3RhdGVcbiAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoZXZlbnQ6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogRmllbGRWYWx1ZSB9KSA9PiB7XG4gICAgICBzdGF0ZS5jdXJyZW50RGF0YVtldmVudC5uYW1lXSA9IGV2ZW50LnZhbHVlO1xuICAgICAgY29uc3Qgd2FzTW9kaWZpZWQgPSBzdGF0ZS5tb2RpZmllZDtcbiAgICAgIHN0YXRlLm1vZGlmaWVkID0gaGFzRGF0YUNoYW5nZWQoc3RhdGUuaW5pdGlhbERhdGEsIHN0YXRlLmN1cnJlbnREYXRhKTtcblxuICAgICAgLy8gVXBkYXRlIGJlZm9yZXVubG9hZCBzdGF0ZSB3aGVuIG1vZGlmaWVkIGNoYW5nZXNcbiAgICAgIGlmICh3YXNNb2RpZmllZCAhPT0gc3RhdGUubW9kaWZpZWQpIHtcbiAgICAgICAgdXBkYXRlQmVmb3JlVW5sb2FkU3RhdGUoc3RhdGUubW9kaWZpZWQpO1xuICAgICAgfVxuXG4gICAgICAvLyBFbWl0IHN0YXRlOmNoYW5nZSBldmVudCB3aGVuIG1vZGlmaWVkIHN0YXRlIGNoYW5nZXNcbiAgICAgIC8vIFRoaXMgYWxsb3dzIHRoZSBjb250cm9sbGVyIHRvIGVuYWJsZS9kaXNhYmxlIGNvbnRyb2xzIGFjY29yZGluZ2x5XG4gICAgICBpZiAod2FzTW9kaWZpZWQgIT09IHN0YXRlLm1vZGlmaWVkKSB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuU1RBVEVfQ0hBTkdFLCB7XG4gICAgICAgICAgbW9kaWZpZWQ6IHN0YXRlLm1vZGlmaWVkLFxuICAgICAgICAgIHN0YXRlOiBzdGF0ZS5tb2RpZmllZCA/IERBVEFfU1RBVEUuRElSVFkgOiBEQVRBX1NUQVRFLlBSSVNUSU5FLFxuICAgICAgICAgIG5hbWU6IGV2ZW50Lm5hbWUsXG4gICAgICAgICAgdmFsdWU6IGV2ZW50LnZhbHVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gTGlzdGVuIGZvciBmaWVsZCBjaGFuZ2VzIHRvIHVwZGF0ZSBzdGF0ZVxuICAgIGlmIChjb21wb25lbnQub24pIHtcbiAgICAgIGNvbXBvbmVudC5vbihcImZpZWxkOmNoYW5nZVwiLCBoYW5kbGVDaGFuZ2UpO1xuICAgICAgLy8gQWxzbyBsaXN0ZW4gZm9yIGZpbGUgY2hhbmdlc1xuICAgICAgY29tcG9uZW50Lm9uKFwiZmlsZTpjaGFuZ2VcIiwgaGFuZGxlQ2hhbmdlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBmdW5jdGlvbiB0byBwZXJmb3JtIHRoZSBhY3R1YWwgc2V0RGF0YSBvcGVyYXRpb25cbiAgICAgKi9cbiAgICBjb25zdCBwZXJmb3JtU2V0RGF0YSA9IChkYXRhOiBGb3JtRGF0YSwgc2lsZW50OiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgICBzZXRGaWVsZHNEYXRhKGNvbXBvbmVudC5maWVsZHMsIGRhdGEsIHNpbGVudCk7XG4gICAgICBzdGF0ZS5jdXJyZW50RGF0YSA9IGNvbGxlY3RGaWVsZERhdGEoY29tcG9uZW50LmZpZWxkcyk7XG5cbiAgICAgIGlmIChzaWxlbnQpIHtcbiAgICAgICAgLy8gV2hlbiBzZXR0aW5nIGRhdGEgc2lsZW50bHksIGFsc28gdXBkYXRlIGluaXRpYWwgZGF0YSBzbmFwc2hvdFxuICAgICAgICAvLyBUaGlzIGlzIHR5cGljYWxseSB1c2VkIHdoZW4gbG9hZGluZyBkYXRhIGZyb20gc2VydmVyXG4gICAgICAgIHN0YXRlLmluaXRpYWxEYXRhID0geyAuLi5zdGF0ZS5jdXJyZW50RGF0YSB9O1xuICAgICAgICBzdGF0ZS5tb2RpZmllZCA9IGZhbHNlO1xuICAgICAgICAvLyBTeW5jIHRoZSBmaWVsZCB2YWx1ZSB0cmFja2VyIGZvciBldmVudCBkZWR1cGxpY2F0aW9uXG4gICAgICAgIHN5bmNUcmFja2VkRmllbGRWYWx1ZXMoY29tcG9uZW50LmZpZWxkcyk7XG4gICAgICAgIC8vIFVwZGF0ZSBiZWZvcmV1bmxvYWQgc3RhdGUgc2luY2Ugd2UncmUgbm8gbG9uZ2VyIG1vZGlmaWVkXG4gICAgICAgIHVwZGF0ZUJlZm9yZVVubG9hZFN0YXRlKGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuREFUQV9TRVQsIHN0YXRlLmN1cnJlbnREYXRhKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgYWN0dWFsIHJlc2V0IG9wZXJhdGlvblxuICAgICAqL1xuICAgIGNvbnN0IHBlcmZvcm1SZXNldCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIHNldEZpZWxkc0RhdGEoY29tcG9uZW50LmZpZWxkcywgc3RhdGUuaW5pdGlhbERhdGEsIHRydWUpO1xuICAgICAgc3RhdGUuY3VycmVudERhdGEgPSB7IC4uLnN0YXRlLmluaXRpYWxEYXRhIH07XG4gICAgICBzdGF0ZS5tb2RpZmllZCA9IGZhbHNlO1xuICAgICAgc3RhdGUuZXJyb3JzID0ge307XG4gICAgICAvLyBVcGRhdGUgYmVmb3JldW5sb2FkIHN0YXRlIHNpbmNlIHdlJ3JlIG5vIGxvbmdlciBtb2RpZmllZFxuICAgICAgdXBkYXRlQmVmb3JlVW5sb2FkU3RhdGUoZmFsc2UpO1xuICAgICAgLy8gRW1pdCBzdGF0ZTpjaGFuZ2Ugc28gcHJvdGVjdGlvbiBvdmVybGF5IGdldHMgcmVtb3ZlZFxuICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5TVEFURV9DSEFOR0UsIHtcbiAgICAgICAgbW9kaWZpZWQ6IGZhbHNlLFxuICAgICAgICBzdGF0ZTogREFUQV9TVEFURS5QUklTVElORSxcbiAgICAgIH0pO1xuICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5SRVNFVCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEludGVybmFsIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdGhlIGFjdHVhbCBjbGVhciBvcGVyYXRpb25cbiAgICAgKi9cbiAgICBjb25zdCBwZXJmb3JtQ2xlYXIgPSAoKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBlbXB0eURhdGE6IEZvcm1EYXRhID0ge307XG4gICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgY29tcG9uZW50LmZpZWxkcy5rZXlzKCkpIHtcbiAgICAgICAgZW1wdHlEYXRhW25hbWVdID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHNldEZpZWxkc0RhdGEoY29tcG9uZW50LmZpZWxkcywgZW1wdHlEYXRhLCB0cnVlKTtcbiAgICAgIHN0YXRlLmN1cnJlbnREYXRhID0ge307XG4gICAgICBzdGF0ZS5pbml0aWFsRGF0YSA9IHt9O1xuICAgICAgc3RhdGUubW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgIC8vIFVwZGF0ZSBiZWZvcmV1bmxvYWQgc3RhdGVcbiAgICAgIHVwZGF0ZUJlZm9yZVVubG9hZFN0YXRlKGZhbHNlKTtcbiAgICAgIC8vIEVtaXQgc3RhdGU6Y2hhbmdlIHNvIHByb3RlY3Rpb24gb3ZlcmxheSBnZXRzIHJlbW92ZWRcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuU1RBVEVfQ0hBTkdFLCB7XG4gICAgICAgIG1vZGlmaWVkOiBmYWxzZSxcbiAgICAgICAgc3RhdGU6IERBVEFfU1RBVEUuUFJJU1RJTkUsXG4gICAgICB9KTtcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuUkVTRVQpO1xuICAgIH07XG5cbiAgICBjb25zdCBlbmhhbmNlZCA9IHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIHN0YXRlLFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBhbGwgZm9ybSBkYXRhXG4gICAgICAgKi9cbiAgICAgIGdldERhdGEoKTogRm9ybURhdGEge1xuICAgICAgICAvLyBBbHdheXMgY29sbGVjdCBmcmVzaCBkYXRhIGZyb20gZmllbGRzXG4gICAgICAgIGNvbnN0IGRhdGEgPSBjb2xsZWN0RmllbGREYXRhKGNvbXBvbmVudC5maWVsZHMpO1xuICAgICAgICBzdGF0ZS5jdXJyZW50RGF0YSA9IGRhdGE7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuREFUQV9HRVQsIGRhdGEpO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IGZvcm0gZGF0YVxuICAgICAgICogQHBhcmFtIGRhdGEgLSBEYXRhIG9iamVjdCB0byBzZXRcbiAgICAgICAqIEBwYXJhbSBzaWxlbnQgLSBJZiB0cnVlLCBkb24ndCBlbWl0IGNoYW5nZSBldmVudHMgYW5kIHVwZGF0ZSBpbml0aWFsIHN0YXRlXG4gICAgICAgKlxuICAgICAgICogV2hlbiBwcm90ZWN0Q2hhbmdlcy5vbkRhdGFPdmVyd3JpdGUgaXMgZW5hYmxlZCBhbmQgdGhlIGZvcm0gaGFzIHVuc2F2ZWQgY2hhbmdlcyxcbiAgICAgICAqIHRoaXMgd2lsbCBlbWl0IGEgJ2RhdGE6Y29uZmxpY3QnIGV2ZW50LiBUaGUgZXZlbnQgaGFuZGxlciBjYW4gY2FsbCBjYW5jZWwoKVxuICAgICAgICogdG8gcHJldmVudCB0aGUgZGF0YSBmcm9tIGJlaW5nIHNldCwgb3IgbGV0IGl0IHByb2NlZWQgYnkgZGVmYXVsdC5cbiAgICAgICAqL1xuICAgICAgc2V0RGF0YShkYXRhOiBGb3JtRGF0YSwgc2lsZW50OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGRhdGEgY29uZmxpY3QgcHJvdGVjdGlvblxuICAgICAgICAvLyBPbmx5IGFwcGxpZXMgd2hlbjpcbiAgICAgICAgLy8gLSBQcm90ZWN0aW9uIGlzIGVuYWJsZWRcbiAgICAgICAgLy8gLSBGb3JtIGhhcyBiZWVuIG1vZGlmaWVkXG4gICAgICAgIC8vIC0gTm90IGEgc2lsZW50IG9wZXJhdGlvbiAoc2lsZW50IGlzIGZvciBsb2FkaW5nIGRhdGEpXG4gICAgICAgIGlmIChwcm90ZWN0Q29uZmlnLm9uRGF0YU92ZXJ3cml0ZSAmJiBzdGF0ZS5tb2RpZmllZCAmJiAhc2lsZW50KSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIGNvbmZsaWN0IGV2ZW50XG4gICAgICAgICAgbGV0IGNhbmNlbGxlZCA9IGZhbHNlO1xuICAgICAgICAgIGxldCBwcm9jZWVkZWQgPSBmYWxzZTtcblxuICAgICAgICAgIGNvbnN0IGNvbmZsaWN0RXZlbnQ6IERhdGFDb25mbGljdEV2ZW50ID0ge1xuICAgICAgICAgICAgY3VycmVudERhdGE6IHsgLi4uc3RhdGUuY3VycmVudERhdGEgfSxcbiAgICAgICAgICAgIG5ld0RhdGE6IGRhdGEsXG4gICAgICAgICAgICBjYW5jZWxsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgY2FuY2VsOiAoKSA9PiB7XG4gICAgICAgICAgICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGNvbmZsaWN0RXZlbnQuY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcm9jZWVkOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHByb2NlZWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgIHBlcmZvcm1TZXREYXRhKGRhdGEsIHNpbGVudCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICAvLyBFbWl0IHRoZSBjb25mbGljdCBldmVudFxuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuREFUQV9DT05GTElDVCwgY29uZmxpY3RFdmVudCk7XG5cbiAgICAgICAgICAvLyBJZiBjYW5jZWxsZWQsIGRvbid0IHNldCB0aGUgZGF0YVxuICAgICAgICAgIGlmIChjYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiBwcm9jZWVkKCkgd2FzIGNhbGxlZCBpbiB0aGUgaGFuZGxlciwgZGF0YSBpcyBhbHJlYWR5IHNldFxuICAgICAgICAgIGlmIChwcm9jZWVkZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiBuZWl0aGVyIGNhbmNlbCgpIG5vciBwcm9jZWVkKCkgd2FzIGNhbGxlZCwgcHJvY2VlZCBieSBkZWZhdWx0XG4gICAgICAgICAgLy8gVGhpcyBtYWludGFpbnMgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGVyZm9ybSB0aGUgYWN0dWFsIHNldERhdGEgb3BlcmF0aW9uXG4gICAgICAgIHBlcmZvcm1TZXREYXRhKGRhdGEsIHNpbGVudCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBhIHNwZWNpZmljIGZpZWxkJ3MgdmFsdWVcbiAgICAgICAqL1xuICAgICAgZ2V0RmllbGRWYWx1ZShuYW1lOiBzdHJpbmcpOiBGaWVsZFZhbHVlIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBjb21wb25lbnQuZmllbGRzLmdldChuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkKSB7XG4gICAgICAgICAgcmV0dXJuIGdldEZpZWxkVmFsdWUoZmllbGQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0ZS5jdXJyZW50RGF0YVtuYW1lXTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IGEgc3BlY2lmaWMgZmllbGQncyB2YWx1ZVxuICAgICAgICovXG4gICAgICBzZXRGaWVsZFZhbHVlKFxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIHZhbHVlOiBGaWVsZFZhbHVlLFxuICAgICAgICBzaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICAgICk6IHZvaWQge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGNvbXBvbmVudC5maWVsZHMuZ2V0KG5hbWUpO1xuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICBzZXRGaWVsZFZhbHVlKGZpZWxkLCB2YWx1ZSwgc2lsZW50KTtcbiAgICAgICAgICBzdGF0ZS5jdXJyZW50RGF0YVtuYW1lXSA9IHZhbHVlO1xuICAgICAgICAgIHN0YXRlLm1vZGlmaWVkID0gaGFzRGF0YUNoYW5nZWQoc3RhdGUuaW5pdGlhbERhdGEsIHN0YXRlLmN1cnJlbnREYXRhKTtcblxuICAgICAgICAgIC8vIFVwZGF0ZSBiZWZvcmV1bmxvYWQgc3RhdGVcbiAgICAgICAgICB1cGRhdGVCZWZvcmVVbmxvYWRTdGF0ZShzdGF0ZS5tb2RpZmllZCk7XG5cbiAgICAgICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5GSUVMRF9DSEFOR0UsIHsgbmFtZSwgdmFsdWUgfSk7XG4gICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLkNIQU5HRSwgeyBuYW1lLCB2YWx1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgZm9ybSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGluaXRpYWwgc3RhdGVcbiAgICAgICAqL1xuICAgICAgaXNNb2RpZmllZCgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY3VycmVudERhdGEgPSBjb2xsZWN0RmllbGREYXRhKGNvbXBvbmVudC5maWVsZHMpO1xuICAgICAgICBzdGF0ZS5tb2RpZmllZCA9IGhhc0RhdGFDaGFuZ2VkKHN0YXRlLmluaXRpYWxEYXRhLCBjdXJyZW50RGF0YSk7XG4gICAgICAgIHJldHVybiBzdGF0ZS5tb2RpZmllZDtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IG9ubHkgdGhlIGZpZWxkcyB0aGF0IGhhdmUgYmVlbiBtb2RpZmllZFxuICAgICAgICovXG4gICAgICBnZXRNb2RpZmllZERhdGEoKTogRm9ybURhdGEge1xuICAgICAgICBjb25zdCBjdXJyZW50RGF0YSA9IGNvbGxlY3RGaWVsZERhdGEoY29tcG9uZW50LmZpZWxkcyk7XG4gICAgICAgIHJldHVybiBnZXRNb2RpZmllZEZpZWxkcyhzdGF0ZS5pbml0aWFsRGF0YSwgY3VycmVudERhdGEpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBUYWtlIGEgc25hcHNob3Qgb2YgY3VycmVudCBkYXRhIGFzIHRoZSBuZXcgYmFzZWxpbmVcbiAgICAgICAqIEZ1dHVyZSBpc01vZGlmaWVkKCkgY2FsbHMgd2lsbCBjb21wYXJlIGFnYWluc3QgdGhpcyBzbmFwc2hvdFxuICAgICAgICovXG4gICAgICBzbmFwc2hvdCgpOiB2b2lkIHtcbiAgICAgICAgc3RhdGUuaW5pdGlhbERhdGEgPSB7IC4uLmNvbGxlY3RGaWVsZERhdGEoY29tcG9uZW50LmZpZWxkcykgfTtcbiAgICAgICAgc3RhdGUuY3VycmVudERhdGEgPSB7IC4uLnN0YXRlLmluaXRpYWxEYXRhIH07XG4gICAgICAgIHN0YXRlLm1vZGlmaWVkID0gZmFsc2U7XG4gICAgICAgIC8vIFVwZGF0ZSBiZWZvcmV1bmxvYWQgc3RhdGUgc2luY2Ugd2UncmUgbm8gbG9uZ2VyIG1vZGlmaWVkXG4gICAgICAgIHVwZGF0ZUJlZm9yZVVubG9hZFN0YXRlKGZhbHNlKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogUmVzZXQgZm9ybSB0byBpbml0aWFsIGRhdGEgc3RhdGVcbiAgICAgICAqXG4gICAgICAgKiBOb3RlOiBQcm90ZWN0aW9uIGlzIGhhbmRsZWQgYnkgdGhlIGJsb2NraW5nIG92ZXJsYXkgaW4gdGhlIHByb3RlY3Rpb24gZmVhdHVyZS5cbiAgICAgICAqIHJlc2V0KCkgbm8gbG9uZ2VyIGVtaXRzIGRhdGE6Y29uZmxpY3QgZXZlbnRzIC0gaXQganVzdCByZXNldHMgdGhlIGZvcm0uXG4gICAgICAgKiBVc2UgZm9yY2UgcGFyYW1ldGVyIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAoaWdub3JlZCkuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtib29sZWFufSBmb3JjZSAtIElnbm9yZWQgKGtlcHQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KVxuICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IEFsd2F5cyByZXR1cm5zIHRydWVcbiAgICAgICAqL1xuICAgICAgcmVzZXQoZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgICAgICBwZXJmb3JtUmVzZXQoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENsZWFyIGFsbCBmb3JtIGZpZWxkc1xuICAgICAgICpcbiAgICAgICAqIE5vdGU6IFByb3RlY3Rpb24gaXMgaGFuZGxlZCBieSB0aGUgYmxvY2tpbmcgb3ZlcmxheSBpbiB0aGUgcHJvdGVjdGlvbiBmZWF0dXJlLlxuICAgICAgICogY2xlYXIoKSBubyBsb25nZXIgZW1pdHMgZGF0YTpjb25mbGljdCBldmVudHMgLSBpdCBqdXN0IGNsZWFycyB0aGUgZm9ybS5cbiAgICAgICAqIFVzZSBmb3JjZSBwYXJhbWV0ZXIgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IChpZ25vcmVkKS5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvcmNlIC0gSWdub3JlZCAoa2VwdCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpXG4gICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gQWx3YXlzIHJldHVybnMgdHJ1ZVxuICAgICAgICovXG4gICAgICBjbGVhcihmb3JjZTogYm9vbGVhbiA9IGZhbHNlKTogYm9vbGVhbiB7XG4gICAgICAgIHBlcmZvcm1DbGVhcigpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIFJlZ2lzdGVyIGNsZWFudXAgZm9yIGJlZm9yZXVubG9hZCBoYW5kbGVyIHdoZW4gY29tcG9uZW50IGlzIGRlc3Ryb3llZFxuICAgIC8vIFdlIG5lZWQgdG8gaG9vayBpbnRvIHRoZSBsaWZlY3ljbGUgZGVzdHJveSBtZWNoYW5pc21cbiAgICBjb25zdCBvcmlnaW5hbExpZmVjeWNsZSA9IGNvbXBvbmVudC5saWZlY3ljbGU7XG4gICAgaWYgKG9yaWdpbmFsTGlmZWN5Y2xlKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBvcmlnaW5hbExpZmVjeWNsZS5kZXN0cm95O1xuICAgICAgb3JpZ2luYWxMaWZlY3ljbGUuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgYmVmb3JldW5sb2FkIGhhbmRsZXJcbiAgICAgICAgdW5yZWdpc3RlckJlZm9yZVVubG9hZCgpO1xuICAgICAgICAvLyBDYWxsIG9yaWdpbmFsIGRlc3Ryb3lcbiAgICAgICAgb3JpZ2luYWxEZXN0cm95Py4oKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGVuaGFuY2VkO1xuICB9O1xufTtcblxuZXhwb3J0IHsgZmxhdFRvTmVzdGVkLCBnZXROZXN0ZWRWYWx1ZSwgc2V0TmVzdGVkVmFsdWUgfTtcbmV4cG9ydCBkZWZhdWx0IHdpdGhEYXRhO1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2NvbnRyb2xsZXIudHNcblxuLyoqXG4gKiBDb250cm9sbGVyIGZlYXR1cmUgZm9yIEZvcm0gY29tcG9uZW50XG4gKiBNYW5hZ2VzIGNvbnRyb2wgYnV0dG9ucyAoc3VibWl0L2NhbmNlbCkgYmFzZWQgb24gZGF0YSBzdGF0ZSAocHJpc3RpbmUvZGlydHkpXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBGb3JtQ29uZmlnLFxuICBCYXNlRm9ybUNvbXBvbmVudCxcbiAgRm9ybVN0YXRlLFxuICBGb3JtRmllbGRSZWdpc3RyeSxcbiAgRm9ybUZpZWxkLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERBVEFfU1RBVEUsIEZPUk1fRVZFTlRTLCBGT1JNX0NMQVNTRVMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBGT1JNX0RFRkFVTFRTIH0gZnJvbSBcIi4uL2NvbmZpZ1wiO1xuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGZvcm0ncyBzdGF0ZSBDU1MgY2xhc3NcbiAqL1xuY29uc3QgdXBkYXRlU3RhdGVDbGFzcyA9IChcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gIG1vZGlmaWVkOiBib29sZWFuLFxuICBwcmVmaXg6IHN0cmluZyxcbiAgY29tcG9uZW50TmFtZTogc3RyaW5nLFxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IG1vZGlmaWVkQ2xhc3MgPSBgJHtwcmVmaXh9LSR7Y29tcG9uZW50TmFtZX0tLSR7Rk9STV9DTEFTU0VTLk1PRElGSUVEfWA7XG4gIGVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShtb2RpZmllZENsYXNzLCBtb2RpZmllZCk7XG59O1xuXG4vKipcbiAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgYWxsIGZvcm0gZmllbGRzXG4gKi9cbmNvbnN0IHNldEZpZWxkc0VuYWJsZWQgPSAoXG4gIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnksXG4gIGVuYWJsZWQ6IGJvb2xlYW4sXG4pOiB2b2lkID0+IHtcbiAgZm9yIChjb25zdCBbLCBmaWVsZF0gb2YgZmllbGRzKSB7XG4gICAgaWYgKGVuYWJsZWQgJiYgdHlwZW9mIGZpZWxkLmVuYWJsZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBmaWVsZC5lbmFibGUoKTtcbiAgICB9IGVsc2UgaWYgKCFlbmFibGVkICYmIHR5cGVvZiBmaWVsZC5kaXNhYmxlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGZpZWxkLmRpc2FibGUoKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogR2V0cyBjb250cm9sIGJ1dHRvbiBjb21wb25lbnRzIGZyb20gdGhlIFVJIHJlZ2lzdHJ5XG4gKi9cbmNvbnN0IGdldENvbnRyb2xCdXR0b25zID0gKFxuICB1aTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGNvbnRyb2xOYW1lczogc3RyaW5nW10sXG4pOiBNYXA8c3RyaW5nLCBGb3JtRmllbGQ+ID0+IHtcbiAgY29uc3QgY29udHJvbHMgPSBuZXcgTWFwPHN0cmluZywgRm9ybUZpZWxkPigpO1xuXG4gIGZvciAoY29uc3QgbmFtZSBvZiBjb250cm9sTmFtZXMpIHtcbiAgICBjb25zdCBjb250cm9sID0gdWlbbmFtZV07XG4gICAgaWYgKGNvbnRyb2wgJiYgdHlwZW9mIGNvbnRyb2wgPT09IFwib2JqZWN0XCIgJiYgXCJlbGVtZW50XCIgaW4gY29udHJvbCkge1xuICAgICAgY29udHJvbHMuc2V0KG5hbWUsIGNvbnRyb2wgYXMgRm9ybUZpZWxkKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29udHJvbHM7XG59O1xuXG4vKipcbiAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgY29udHJvbCBidXR0b25zXG4gKi9cbmNvbnN0IHNldENvbnRyb2xzRW5hYmxlZCA9IChcbiAgY29udHJvbHM6IE1hcDxzdHJpbmcsIEZvcm1GaWVsZD4sXG4gIGVuYWJsZWQ6IGJvb2xlYW4sXG4pOiB2b2lkID0+IHtcbiAgZm9yIChjb25zdCBbLCBjb250cm9sXSBvZiBjb250cm9scykge1xuICAgIGlmIChlbmFibGVkICYmIHR5cGVvZiBjb250cm9sLmVuYWJsZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb250cm9sLmVuYWJsZSgpO1xuICAgIH0gZWxzZSBpZiAoIWVuYWJsZWQgJiYgdHlwZW9mIGNvbnRyb2wuZGlzYWJsZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb250cm9sLmRpc2FibGUoKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogd2l0aENvbnRyb2xsZXIgZmVhdHVyZVxuICogQWRkcyBjb250cm9sIGJ1dHRvbiBoYW5kbGluZyBiYXNlZCBvbiBkYXRhIHN0YXRlIChwcmlzdGluZS9kaXJ0eSlcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhDb250cm9sbGVyID0gKGNvbmZpZzogRm9ybUNvbmZpZykgPT4ge1xuICByZXR1cm4gPFxuICAgIFQgZXh0ZW5kcyBCYXNlRm9ybUNvbXBvbmVudCAmIHtcbiAgICAgIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnk7XG4gICAgICBzdGF0ZTogRm9ybVN0YXRlO1xuICAgICAgZW1pdD86IChldmVudDogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gdm9pZDtcbiAgICAgIG9uPzogKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKSA9PiB2b2lkO1xuICAgIH0sXG4gID4oXG4gICAgY29tcG9uZW50OiBULFxuICApOiBUICYge1xuICAgIGNvbnRyb2xzOiBNYXA8c3RyaW5nLCBGb3JtRmllbGQ+O1xuICAgIGdldERhdGFTdGF0ZTogKCkgPT4gc3RyaW5nO1xuICAgIGVuYWJsZUNvbnRyb2xzOiAoKSA9PiB2b2lkO1xuICAgIGRpc2FibGVDb250cm9sczogKCkgPT4gdm9pZDtcbiAgICBlbmFibGVGaWVsZHM6ICgpID0+IHZvaWQ7XG4gICAgZGlzYWJsZUZpZWxkczogKCkgPT4gdm9pZDtcbiAgfSA9PiB7XG4gICAgY29uc3QgcHJlZml4ID0gY29uZmlnLnByZWZpeCB8fCBGT1JNX0RFRkFVTFRTLnByZWZpeDtcbiAgICBjb25zdCBjb21wb25lbnROYW1lID0gY29uZmlnLmNvbXBvbmVudE5hbWUgfHwgRk9STV9ERUZBVUxUUy5jb21wb25lbnROYW1lO1xuICAgIGNvbnN0IGNvbnRyb2xOYW1lcyA9IGNvbmZpZy5jb250cm9sc1xuICAgICAgPyBbLi4uY29uZmlnLmNvbnRyb2xzXVxuICAgICAgOiBbLi4uRk9STV9ERUZBVUxUUy5jb250cm9sc107XG5cbiAgICAvLyBHZXQgY29udHJvbCBidXR0b25zIGZyb20gVUlcbiAgICBjb25zdCBjb250cm9scyA9IGNvbnRyb2xOYW1lc1xuICAgICAgPyBnZXRDb250cm9sQnV0dG9ucyhjb21wb25lbnQudWkgfHwge30sIGNvbnRyb2xOYW1lcylcbiAgICAgIDogbmV3IE1hcDxzdHJpbmcsIEZvcm1GaWVsZD4oKTtcblxuICAgIC8vIEluaXRpYWxpemUgY29udHJvbHMgYXMgZGlzYWJsZWQgKHByaXN0aW5lIHN0YXRlKVxuICAgIGlmIChjb250cm9scy5zaXplID4gMCkge1xuICAgICAgc2V0Q29udHJvbHNFbmFibGVkKGNvbnRyb2xzLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5oYW5jZWQgPSB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBjb250cm9scyxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgY3VycmVudCBkYXRhIHN0YXRlIChwcmlzdGluZSBvciBkaXJ0eSlcbiAgICAgICAqL1xuICAgICAgZ2V0RGF0YVN0YXRlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuc3RhdGUubW9kaWZpZWRcbiAgICAgICAgICA/IERBVEFfU1RBVEUuRElSVFlcbiAgICAgICAgICA6IERBVEFfU1RBVEUuUFJJU1RJTkU7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEVuYWJsZSBjb250cm9sIGJ1dHRvbnNcbiAgICAgICAqL1xuICAgICAgZW5hYmxlQ29udHJvbHMoKTogdm9pZCB7XG4gICAgICAgIHNldENvbnRyb2xzRW5hYmxlZChjb250cm9scywgdHJ1ZSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIERpc2FibGUgY29udHJvbCBidXR0b25zXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVDb250cm9scygpOiB2b2lkIHtcbiAgICAgICAgc2V0Q29udHJvbHNFbmFibGVkKGNvbnRyb2xzLCBmYWxzZSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEVuYWJsZSBhbGwgZm9ybSBmaWVsZHNcbiAgICAgICAqL1xuICAgICAgZW5hYmxlRmllbGRzKCk6IHZvaWQge1xuICAgICAgICBzZXRGaWVsZHNFbmFibGVkKGNvbXBvbmVudC5maWVsZHMsIHRydWUpO1xuICAgICAgICBjb21wb25lbnQuc3RhdGUuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZSBhbGwgZm9ybSBmaWVsZHNcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZUZpZWxkcygpOiB2b2lkIHtcbiAgICAgICAgc2V0RmllbGRzRW5hYmxlZChjb21wb25lbnQuZmllbGRzLCBmYWxzZSk7XG4gICAgICAgIGNvbXBvbmVudC5zdGF0ZS5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBMaXN0ZW4gZm9yIHN0YXRlIGNoYW5nZXMgdG8gZW5hYmxlL2Rpc2FibGUgY29udHJvbHNcbiAgICBpZiAoY29uZmlnLnVzZUNoYW5nZXMgIT09IGZhbHNlICYmIGNvbXBvbmVudC5vbikge1xuICAgICAgY29tcG9uZW50Lm9uKFxuICAgICAgICBGT1JNX0VWRU5UUy5TVEFURV9DSEFOR0UsXG4gICAgICAgIChldmVudDogeyBtb2RpZmllZDogYm9vbGVhbjsgc3RhdGU6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgICAgaWYgKGV2ZW50Lm1vZGlmaWVkKSB7XG4gICAgICAgICAgICAvLyBEYXRhIGlzIGRpcnR5IC0gZW5hYmxlIGNvbnRyb2xzXG4gICAgICAgICAgICBzZXRDb250cm9sc0VuYWJsZWQoY29udHJvbHMsIHRydWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBEYXRhIGlzIHByaXN0aW5lIC0gZGlzYWJsZSBjb250cm9sc1xuICAgICAgICAgICAgc2V0Q29udHJvbHNFbmFibGVkKGNvbnRyb2xzLCBmYWxzZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVXBkYXRlIENTUyBjbGFzc1xuICAgICAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICAgICAgdXBkYXRlU3RhdGVDbGFzcyhcbiAgICAgICAgICAgICAgY29tcG9uZW50LmVsZW1lbnQsXG4gICAgICAgICAgICAgIGV2ZW50Lm1vZGlmaWVkLFxuICAgICAgICAgICAgICBwcmVmaXgsXG4gICAgICAgICAgICAgIGNvbXBvbmVudE5hbWUsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVuaGFuY2VkO1xuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgd2l0aENvbnRyb2xsZXI7XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL2Zvcm0vZmVhdHVyZXMvc3VibWl0LnRzXG5cbi8qKlxuICogU3VibWl0IGZlYXR1cmUgZm9yIEZvcm0gY29tcG9uZW50XG4gKiBIYW5kbGVzIGZvcm0gdmFsaWRhdGlvbiBhbmQgc3VibWlzc2lvbiB3aXRoIGF1dG9tYXRpYyBmaWVsZCBlcnJvciBkaXNwbGF5XG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBGb3JtQ29uZmlnLFxuICBCYXNlRm9ybUNvbXBvbmVudCxcbiAgRm9ybURhdGEsXG4gIEZvcm1TdGF0ZSxcbiAgRm9ybUZpZWxkUmVnaXN0cnksXG4gIEZvcm1GaWVsZCxcbiAgRm9ybVZhbGlkYXRpb25SdWxlLFxuICBGb3JtVmFsaWRhdGlvblJlc3VsdCxcbiAgRm9ybVN1Ym1pdE9wdGlvbnMsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgRk9STV9FVkVOVFMsIEZPUk1fQ0xBU1NFUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBEZWZhdWx0IGhlYWRlcnMgZm9yIEpTT04gcmVxdWVzdHNcbiAqL1xuY29uc3QgREVGQVVMVF9IRUFERVJTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIGZvcm0gZGF0YSBhZ2FpbnN0IHZhbGlkYXRpb24gcnVsZXNcbiAqL1xuY29uc3QgdmFsaWRhdGVEYXRhID0gKFxuICBkYXRhOiBGb3JtRGF0YSxcbiAgcnVsZXM6IEZvcm1WYWxpZGF0aW9uUnVsZVtdLFxuKTogRm9ybVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBjb25zdCBlcnJvcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgbGV0IHZhbGlkID0gdHJ1ZTtcblxuICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGRhdGFbcnVsZS5maWVsZF07XG4gICAgY29uc3QgcmVzdWx0ID0gcnVsZS52YWxpZGF0ZSh2YWx1ZSwgZGF0YSk7XG5cbiAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgIGVycm9yc1tydWxlLmZpZWxkXSA9IHJ1bGUubWVzc2FnZSB8fCBgJHtydWxlLmZpZWxkfSBpcyBpbnZhbGlkYDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICBlcnJvcnNbcnVsZS5maWVsZF0gPSByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgdmFsaWQsIGVycm9ycyB9O1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgYSBzaW5nbGUgZmllbGQgYWdhaW5zdCBpdHMgdmFsaWRhdGlvbiBydWxlc1xuICovXG5jb25zdCB2YWxpZGF0ZUZpZWxkID0gKFxuICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgZGF0YTogRm9ybURhdGEsXG4gIHJ1bGVzOiBGb3JtVmFsaWRhdGlvblJ1bGVbXSxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IGZpZWxkUnVsZXMgPSBydWxlcy5maWx0ZXIoKHJ1bGUpID0+IHJ1bGUuZmllbGQgPT09IGZpZWxkTmFtZSk7XG5cbiAgZm9yIChjb25zdCBydWxlIG9mIGZpZWxkUnVsZXMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGRhdGFbcnVsZS5maWVsZF07XG4gICAgY29uc3QgcmVzdWx0ID0gcnVsZS52YWxpZGF0ZSh2YWx1ZSwgZGF0YSk7XG5cbiAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHJ1bGUubWVzc2FnZSB8fCBgJHtydWxlLmZpZWxkfSBpcyBpbnZhbGlkYDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbi8qKlxuICogUGVyZm9ybXMgdGhlIGFjdHVhbCBIVFRQIHJlcXVlc3RcbiAqL1xuY29uc3QgcGVyZm9ybVJlcXVlc3QgPSBhc3luYyAoXG4gIHVybDogc3RyaW5nLFxuICBkYXRhOiBGb3JtRGF0YSxcbiAgb3B0aW9uczogRm9ybVN1Ym1pdE9wdGlvbnMsXG4pOiBQcm9taXNlPHVua25vd24+ID0+IHtcbiAgY29uc3QgbWV0aG9kID0gb3B0aW9ucy5tZXRob2QgfHwgXCJQT1NUXCI7XG4gIGNvbnN0IGhlYWRlcnMgPSB7IC4uLkRFRkFVTFRfSEVBREVSUywgLi4ub3B0aW9ucy5oZWFkZXJzIH07XG5cbiAgY29uc3QgZmV0Y2hPcHRpb25zOiBSZXF1ZXN0SW5pdCA9IHtcbiAgICBtZXRob2QsXG4gICAgaGVhZGVycyxcbiAgfTtcblxuICAvLyBBZGQgYm9keSBmb3Igbm9uLUdFVCByZXF1ZXN0c1xuICBpZiAobWV0aG9kICE9PSBcIkdFVFwiKSB7XG4gICAgZmV0Y2hPcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCBmZXRjaE9wdGlvbnMpO1xuXG4gIC8vIFBhcnNlIHJlc3BvbnNlXG4gIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIik7XG4gIGxldCByZXN1bHQ6IHVua25vd247XG5cbiAgaWYgKGNvbnRlbnRUeXBlICYmIGNvbnRlbnRUeXBlLmluY2x1ZGVzKFwiYXBwbGljYXRpb24vanNvblwiKSkge1xuICAgIHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gIH1cblxuICAvLyBDaGVjayBmb3IgSFRUUCBlcnJvcnNcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIC8vIFRyeSB0byBleHRyYWN0IGVycm9yIG1lc3NhZ2UgZnJvbSBzZXJ2ZXIgcmVzcG9uc2VcbiAgICBsZXQgZXJyb3JNZXNzYWdlID0gYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9OiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YDtcbiAgICBpZiAocmVzdWx0ICYmIHR5cGVvZiByZXN1bHQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGNvbnN0IHNlcnZlckVycm9yID0gKHJlc3VsdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuZXJyb3I7XG4gICAgICBpZiAodHlwZW9mIHNlcnZlckVycm9yID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGVycm9yTWVzc2FnZSA9IHNlcnZlckVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgIChlcnJvciBhcyBFcnJvciAmIHsgcmVzcG9uc2U6IHVua25vd24gfSkucmVzcG9uc2UgPSByZXN1bHQ7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiB3aXRoU3VibWl0IGZlYXR1cmVcbiAqIEFkZHMgdmFsaWRhdGlvbiBhbmQgc3VibWlzc2lvbiBjYXBhYmlsaXRpZXMgdG8gdGhlIGZvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhTdWJtaXQgPSAoY29uZmlnOiBGb3JtQ29uZmlnKSA9PiB7XG4gIHJldHVybiA8XG4gICAgVCBleHRlbmRzIEJhc2VGb3JtQ29tcG9uZW50ICYge1xuICAgICAgZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeTtcbiAgICAgIHN0YXRlOiBGb3JtU3RhdGU7XG4gICAgICBnZXREYXRhOiAoKSA9PiBGb3JtRGF0YTtcbiAgICAgIGdldE1vZGlmaWVkRGF0YTogKCkgPT4gRm9ybURhdGE7XG4gICAgICBkaXNhYmxlQ29udHJvbHM6ICgpID0+IHZvaWQ7XG4gICAgICBzbmFwc2hvdDogKCkgPT4gdm9pZDtcbiAgICAgIGVtaXQ/OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG4gICAgICBvbj86IChldmVudDogc3RyaW5nLCBoYW5kbGVyOiAoZGF0YTogdW5rbm93bikgPT4gdm9pZCkgPT4gdm9pZDtcbiAgICB9LFxuICA+KFxuICAgIGNvbXBvbmVudDogVCxcbiAgKTogVCAmIHtcbiAgICB2YWxpZGF0ZTogKCkgPT4gRm9ybVZhbGlkYXRpb25SZXN1bHQ7XG4gICAgdmFsaWRhdGVGaWVsZDogKGZpZWxkTmFtZTogc3RyaW5nKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgc3VibWl0OiAob3B0aW9ucz86IEZvcm1TdWJtaXRPcHRpb25zKSA9PiBQcm9taXNlPHVua25vd24+O1xuICAgIHNldFZhbGlkYXRpb25SdWxlczogKHJ1bGVzOiBGb3JtVmFsaWRhdGlvblJ1bGVbXSkgPT4gdm9pZDtcbiAgICBjbGVhckVycm9yczogKCkgPT4gdm9pZDtcbiAgICBjbGVhckZpZWxkRXJyb3I6IChmaWVsZDogc3RyaW5nKSA9PiB2b2lkO1xuICAgIHNldEZpZWxkRXJyb3I6IChmaWVsZDogc3RyaW5nLCBlcnJvcjogc3RyaW5nKSA9PiB2b2lkO1xuICAgIGdldEZpZWxkRXJyb3I6IChmaWVsZDogc3RyaW5nKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIH0gPT4ge1xuICAgIC8vIFZhbGlkYXRpb24gcnVsZXMgY2FuIGJlIHVwZGF0ZWQgYXQgcnVudGltZVxuICAgIGxldCB2YWxpZGF0aW9uUnVsZXMgPSBjb25maWcudmFsaWRhdGlvbiB8fCBbXTtcblxuICAgIC8vIFdoZXRoZXIgdG8gc2hvdyBlcnJvciBtZXNzYWdlcyBpbiBmaWVsZCBoZWxwZXIgdGV4dCAoZGVmYXVsdDogdHJ1ZSlcbiAgICBjb25zdCBzaG93TWVzc2FnZXMgPSBjb25maWcuc2hvd0ZpZWxkRXJyb3JNZXNzYWdlcyAhPT0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyBvciBjbGVhcnMgZXJyb3Igb24gYSBmaWVsZCBjb21wb25lbnRcbiAgICAgKi9cbiAgICBjb25zdCBzaG93RmllbGRFcnJvciA9IChcbiAgICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgICAgZXJyb3I6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICApOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkID0gY29tcG9uZW50LmZpZWxkcy5nZXQoZmllbGROYW1lKSBhcyBGb3JtRmllbGQgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoZmllbGQgJiYgdHlwZW9mIGZpZWxkLnNldEVycm9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgLy8gT25seSBwYXNzIG1lc3NhZ2UgaWYgc2hvd0ZpZWxkRXJyb3JNZXNzYWdlcyBpcyBlbmFibGVkXG4gICAgICAgICAgZmllbGQuc2V0RXJyb3IodHJ1ZSwgc2hvd01lc3NhZ2VzID8gZXJyb3IgOiB1bmRlZmluZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFBhc3MgZW1wdHkgc3RyaW5nIHRvIGFsc28gY2xlYXIgdGhlIGhlbHBlci9zdXBwb3J0aW5nIHRleHQgbWVzc2FnZVxuICAgICAgICAgIGZpZWxkLnNldEVycm9yKGZhbHNlLCBcIlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyBlcnJvcnMgb24gYWxsIGZpZWxkIGNvbXBvbmVudHNcbiAgICAgKi9cbiAgICBjb25zdCBzaG93QWxsRmllbGRFcnJvcnMgPSAoZXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogdm9pZCA9PiB7XG4gICAgICAvLyBDbGVhciBhbGwgZmllbGQgZXJyb3JzIGZpcnN0XG4gICAgICBmb3IgKGNvbnN0IFtmaWVsZE5hbWVdIG9mIGNvbXBvbmVudC5maWVsZHMpIHtcbiAgICAgICAgc2hvd0ZpZWxkRXJyb3IoZmllbGROYW1lLCB1bmRlZmluZWQpO1xuICAgICAgfVxuICAgICAgLy8gU2hvdyBuZXcgZXJyb3JzXG4gICAgICBmb3IgKGNvbnN0IFtmaWVsZE5hbWUsIGVycm9yXSBvZiBPYmplY3QuZW50cmllcyhlcnJvcnMpKSB7XG4gICAgICAgIHNob3dGaWVsZEVycm9yKGZpZWxkTmFtZSwgZXJyb3IpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBMaXN0ZW4gZm9yIGZpZWxkIGNoYW5nZXMgdG8gYXV0by1jbGVhci9yZXZhbGlkYXRlIGVycm9yc1xuICAgIGlmIChjb21wb25lbnQub24pIHtcbiAgICAgIC8vIENsZWFyIHZpc3VhbCBlcnJvcnMgd2hlbiBmb3JtIGlzIHJlc2V0XG4gICAgICBjb21wb25lbnQub24oXCJyZXNldFwiLCAoKSA9PiB7XG4gICAgICAgIHNob3dBbGxGaWVsZEVycm9ycyh7fSk7XG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50Lm9uKFwiZmllbGQ6Y2hhbmdlXCIsIChldmVudDogdW5rbm93bikgPT4ge1xuICAgICAgICBjb25zdCB7IG5hbWUgfSA9IGV2ZW50IGFzIHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9O1xuXG4gICAgICAgIC8vIElmIHRoaXMgZmllbGQgaGFkIGFuIGVycm9yLCByZS12YWxpZGF0ZSBpdFxuICAgICAgICBpZiAoY29tcG9uZW50LnN0YXRlLmVycm9yc1tuYW1lXSkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBjb21wb25lbnQuZ2V0RGF0YSgpO1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gdmFsaWRhdGVGaWVsZChuYW1lLCBkYXRhLCB2YWxpZGF0aW9uUnVsZXMpO1xuXG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBTdGlsbCBoYXMgZXJyb3IgLSB1cGRhdGUgbWVzc2FnZVxuICAgICAgICAgICAgY29tcG9uZW50LnN0YXRlLmVycm9yc1tuYW1lXSA9IGVycm9yO1xuICAgICAgICAgICAgc2hvd0ZpZWxkRXJyb3IobmFtZSwgZXJyb3IpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGaWVsZCBpcyBub3cgdmFsaWQgLSBjbGVhciBlcnJvclxuICAgICAgICAgICAgZGVsZXRlIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnNbbmFtZV07XG4gICAgICAgICAgICBzaG93RmllbGRFcnJvcihuYW1lLCB1bmRlZmluZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5oYW5jZWQgPSB7XG4gICAgICAuLi5jb21wb25lbnQsXG5cbiAgICAgIC8qKlxuICAgICAgICogVmFsaWRhdGUgZm9ybSBkYXRhIGFnYWluc3QgY29uZmlndXJlZCBydWxlc1xuICAgICAgICogQXV0b21hdGljYWxseSBzaG93cyBlcnJvcnMgb24gZmllbGQgY29tcG9uZW50c1xuICAgICAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHQgd2l0aCB2YWxpZCBmbGFnIGFuZCBlcnJvcnMgb2JqZWN0XG4gICAgICAgKi9cbiAgICAgIHZhbGlkYXRlKCk6IEZvcm1WYWxpZGF0aW9uUmVzdWx0IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGNvbXBvbmVudC5nZXREYXRhKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHZhbGlkYXRlRGF0YShkYXRhLCB2YWxpZGF0aW9uUnVsZXMpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzdGF0ZSB3aXRoIHZhbGlkYXRpb24gZXJyb3JzXG4gICAgICAgIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnMgPSByZXN1bHQuZXJyb3JzO1xuXG4gICAgICAgIC8vIFNob3cgZXJyb3JzIG9uIGZpZWxkIGNvbXBvbmVudHNcbiAgICAgICAgc2hvd0FsbEZpZWxkRXJyb3JzKHJlc3VsdC5lcnJvcnMpO1xuXG4gICAgICAgIC8vIEVtaXQgdmFsaWRhdGlvbiBldmVudCBpZiB0aGVyZSBhcmUgZXJyb3JzXG4gICAgICAgIGlmICghcmVzdWx0LnZhbGlkKSB7XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5WQUxJREFUSU9OX0VSUk9SLCByZXN1bHQuZXJyb3JzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFZhbGlkYXRlIGEgc2luZ2xlIGZpZWxkXG4gICAgICAgKiBAcmV0dXJucyBFcnJvciBtZXNzYWdlIGlmIGludmFsaWQsIHVuZGVmaW5lZCBpZiB2YWxpZFxuICAgICAgICovXG4gICAgICB2YWxpZGF0ZUZpZWxkKGZpZWxkTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGNvbXBvbmVudC5nZXREYXRhKCk7XG4gICAgICAgIGNvbnN0IGVycm9yID0gdmFsaWRhdGVGaWVsZChmaWVsZE5hbWUsIGRhdGEsIHZhbGlkYXRpb25SdWxlcyk7XG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgY29tcG9uZW50LnN0YXRlLmVycm9yc1tmaWVsZE5hbWVdID0gZXJyb3I7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnNbZmllbGROYW1lXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNob3dGaWVsZEVycm9yKGZpZWxkTmFtZSwgZXJyb3IpO1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFN1Ym1pdCB0aGUgZm9ybVxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBzdWJtaXQgY29uZmlndXJhdGlvblxuICAgICAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHNlcnZlciByZXNwb25zZVxuICAgICAgICovXG4gICAgICBhc3luYyBzdWJtaXQob3B0aW9uczogRm9ybVN1Ym1pdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICAvLyBQcmV2ZW50IGRvdWJsZSBzdWJtaXNzaW9uXG4gICAgICAgIGlmIChjb21wb25lbnQuc3RhdGUuc3VibWl0dGluZykge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJGb3JtIGlzIGFscmVhZHkgc3VibWl0dGluZ1wiKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGF0ZSBpZiByZXF1ZXN0ZWQgKGRlZmF1bHQ6IHRydWUpXG4gICAgICAgIGlmIChvcHRpb25zLnZhbGlkYXRlICE9PSBmYWxzZSAmJiB2YWxpZGF0aW9uUnVsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICAgICAgaWYgKCF2YWxpZGF0aW9uLnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiVmFsaWRhdGlvbiBmYWlsZWRcIikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hcmsgYXMgc3VibWl0dGluZ1xuICAgICAgICBjb21wb25lbnQuc3RhdGUuc3VibWl0dGluZyA9IHRydWU7XG5cbiAgICAgICAgLy8gQWRkIHN1Ym1pdHRpbmcgY2xhc3MgdG8gZWxlbWVudFxuICAgICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWcucHJlZml4IHx8IFwibXRybFwiO1xuICAgICAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBjb25maWcuY29tcG9uZW50TmFtZSB8fCBcImZvcm1cIjtcbiAgICAgICAgICBjb21wb25lbnQuZWxlbWVudC5jbGFzc0xpc3QuYWRkKFxuICAgICAgICAgICAgYCR7cHJlZml4fS0ke2NvbXBvbmVudE5hbWV9LS0ke0ZPUk1fQ0xBU1NFUy5TVUJNSVRUSU5HfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtaXQgc3VibWl0IGV2ZW50XG4gICAgICAgIGNvbnN0IGRhdGEgPSBjb21wb25lbnQuZ2V0RGF0YSgpO1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLlNVQk1JVCwgZGF0YSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsZXQgcmVzdWx0OiB1bmtub3duO1xuXG4gICAgICAgICAgLy8gVXNlIGN1c3RvbSBoYW5kbGVyIGlmIHByb3ZpZGVkXG4gICAgICAgICAgaWYgKG9wdGlvbnMuaGFuZGxlcikge1xuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgb3B0aW9ucy5oYW5kbGVyKFxuICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICBjb21wb25lbnQgYXMgdW5rbm93biBhcyBpbXBvcnQoXCIuLi90eXBlc1wiKS5Gb3JtQ29tcG9uZW50LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5hY3Rpb24pIHtcbiAgICAgICAgICAgIC8vIFVzZSBkZWZhdWx0IGZldGNoXG4gICAgICAgICAgICByZXN1bHQgPSBhd2FpdCBwZXJmb3JtUmVxdWVzdChjb25maWcuYWN0aW9uLCBkYXRhLCB7XG4gICAgICAgICAgICAgIG1ldGhvZDogb3B0aW9ucy5tZXRob2QgfHwgY29uZmlnLm1ldGhvZCB8fCBcIlBPU1RcIixcbiAgICAgICAgICAgICAgaGVhZGVyczogb3B0aW9ucy5oZWFkZXJzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vIGFjdGlvbiBVUkwsIGp1c3QgcmV0dXJuIHRoZSBkYXRhXG4gICAgICAgICAgICByZXN1bHQgPSBkYXRhO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFN1Y2Nlc3MhXG4gICAgICAgICAgY29tcG9uZW50LnN0YXRlLnN1Ym1pdHRpbmcgPSBmYWxzZTtcbiAgICAgICAgICBjb21wb25lbnQuc3RhdGUuZXJyb3JzID0ge307XG5cbiAgICAgICAgICAvLyBSZW1vdmUgc3VibWl0dGluZyBjbGFzc1xuICAgICAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlnLnByZWZpeCB8fCBcIm10cmxcIjtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBjb25maWcuY29tcG9uZW50TmFtZSB8fCBcImZvcm1cIjtcbiAgICAgICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXG4gICAgICAgICAgICAgIGAke3ByZWZpeH0tJHtjb21wb25lbnROYW1lfS0tJHtGT1JNX0NMQVNTRVMuU1VCTUlUVElOR31gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUYWtlIHNuYXBzaG90IG9mIGN1cnJlbnQgZGF0YSBhcyBuZXcgYmFzZWxpbmVcbiAgICAgICAgICAvLyBUaGlzIHJlc2V0cyBtb2RpZmllZCBzdGF0ZSB0byBmYWxzZSwgd2hpY2ggd2lsbCB0cmlnZ2VyIHN0YXRlOmNoYW5nZVxuICAgICAgICAgIGNvbXBvbmVudC5zbmFwc2hvdCgpO1xuXG4gICAgICAgICAgLy8gRGlzYWJsZSBjb250cm9scyAoZm9ybSBpcyBub3cgcHJpc3RpbmUpXG4gICAgICAgICAgY29tcG9uZW50LmRpc2FibGVDb250cm9scygpO1xuXG4gICAgICAgICAgLy8gRW1pdCBzdWNjZXNzIGV2ZW50XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5TVUJNSVRfU1VDQ0VTUywgcmVzdWx0KTtcblxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gRXJyb3IhXG4gICAgICAgICAgY29tcG9uZW50LnN0YXRlLnN1Ym1pdHRpbmcgPSBmYWxzZTtcblxuICAgICAgICAgIC8vIFJlbW92ZSBzdWJtaXR0aW5nIGNsYXNzXG4gICAgICAgICAgaWYgKGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWcucHJlZml4IHx8IFwibXRybFwiO1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGNvbmZpZy5jb21wb25lbnROYW1lIHx8IFwiZm9ybVwiO1xuICAgICAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcbiAgICAgICAgICAgICAgYCR7cHJlZml4fS0ke2NvbXBvbmVudE5hbWV9LS0ke0ZPUk1fQ0xBU1NFUy5TVUJNSVRUSU5HfWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEVtaXQgZXJyb3IgZXZlbnRcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLlNVQk1JVF9FUlJPUiwgZXJyb3IpO1xuXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IHZhbGlkYXRpb24gcnVsZXMgYXQgcnVudGltZVxuICAgICAgICovXG4gICAgICBzZXRWYWxpZGF0aW9uUnVsZXMocnVsZXM6IEZvcm1WYWxpZGF0aW9uUnVsZVtdKTogdm9pZCB7XG4gICAgICAgIHZhbGlkYXRpb25SdWxlcyA9IHJ1bGVzO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDbGVhciBhbGwgdmFsaWRhdGlvbiBlcnJvcnMgYW5kIHZpc3VhbCBlcnJvciBzdGF0ZXNcbiAgICAgICAqL1xuICAgICAgY2xlYXJFcnJvcnMoKTogdm9pZCB7XG4gICAgICAgIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnMgPSB7fTtcbiAgICAgICAgc2hvd0FsbEZpZWxkRXJyb3JzKHt9KTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2xlYXIgZXJyb3IgZm9yIGEgc3BlY2lmaWMgZmllbGRcbiAgICAgICAqL1xuICAgICAgY2xlYXJGaWVsZEVycm9yKGZpZWxkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgZGVsZXRlIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnNbZmllbGRdO1xuICAgICAgICBzaG93RmllbGRFcnJvcihmaWVsZCwgdW5kZWZpbmVkKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IGFuIGVycm9yIGZvciBhIHNwZWNpZmljIGZpZWxkIChhbHNvIHNob3dzIG9uIGNvbXBvbmVudClcbiAgICAgICAqL1xuICAgICAgc2V0RmllbGRFcnJvcihmaWVsZDogc3RyaW5nLCBlcnJvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnNbZmllbGRdID0gZXJyb3I7XG4gICAgICAgIHNob3dGaWVsZEVycm9yKGZpZWxkLCBlcnJvcik7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCB0aGUgZXJyb3IgZm9yIGEgc3BlY2lmaWMgZmllbGRcbiAgICAgICAqL1xuICAgICAgZ2V0RmllbGRFcnJvcihmaWVsZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnNbZmllbGRdO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGVuaGFuY2VkO1xuICB9O1xufTtcblxuZXhwb3J0IHsgdmFsaWRhdGVEYXRhLCB2YWxpZGF0ZUZpZWxkLCBwZXJmb3JtUmVxdWVzdCB9O1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN1Ym1pdDtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9mZWF0dXJlcy9wcm90ZWN0aW9uLnRzXG5cbi8qKlxuICogUHJvdGVjdGlvbiBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogSGFuZGxlcyBibG9ja2luZyBvdmVybGF5IHRvIHByZXZlbnQgY2xpY2tzIG91dHNpZGUgdGhlIGZvcm0gd2hlbiBpdCBoYXMgdW5zYXZlZCBjaGFuZ2VzXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBGb3JtQ29uZmlnLFxuICBCYXNlRm9ybUNvbXBvbmVudCxcbiAgRm9ybURhdGEsXG4gIEZvcm1TdGF0ZSxcbiAgRm9ybUZpZWxkUmVnaXN0cnksXG4gIFByb3RlY3RDaGFuZ2VzQ29uZmlnLFxuICBEYXRhQ29uZmxpY3RFdmVudCxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBGT1JNX0VWRU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBOb3JtYWxpemVzIHByb3RlY3Rpb24gY29uZmlnIHRvIGEgY29uc2lzdGVudCBvYmplY3QgZm9ybWF0XG4gKi9cbmNvbnN0IG5vcm1hbGl6ZVByb3RlY3RDb25maWcgPSAoXG4gIGNvbmZpZzogYm9vbGVhbiB8IFByb3RlY3RDaGFuZ2VzQ29uZmlnIHwgdW5kZWZpbmVkLFxuKTogUHJvdGVjdENoYW5nZXNDb25maWcgPT4ge1xuICBpZiAoIWNvbmZpZykge1xuICAgIHJldHVybiB7IGJlZm9yZVVubG9hZDogZmFsc2UsIG9uRGF0YU92ZXJ3cml0ZTogZmFsc2UgfTtcbiAgfVxuICBpZiAoY29uZmlnID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHsgYmVmb3JlVW5sb2FkOiB0cnVlLCBvbkRhdGFPdmVyd3JpdGU6IHRydWUgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGJlZm9yZVVubG9hZDogY29uZmlnLmJlZm9yZVVubG9hZCA/PyBmYWxzZSxcbiAgICBvbkRhdGFPdmVyd3JpdGU6IGNvbmZpZy5vbkRhdGFPdmVyd3JpdGUgPz8gZmFsc2UsXG4gIH07XG59O1xuXG4vKipcbiAqIHdpdGhQcm90ZWN0aW9uIGZlYXR1cmVcbiAqIEFkZHMgYmxvY2tpbmcgb3ZlcmxheSBwcm90ZWN0aW9uIHRvIHByZXZlbnQgY2xpY2tzIG91dHNpZGUgdGhlIGZvcm0gd2hlbiBtb2RpZmllZFxuICovXG5leHBvcnQgY29uc3Qgd2l0aFByb3RlY3Rpb24gPSAoY29uZmlnOiBGb3JtQ29uZmlnKSA9PiB7XG4gIHJldHVybiA8XG4gICAgVCBleHRlbmRzIEJhc2VGb3JtQ29tcG9uZW50ICYge1xuICAgICAgZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeTtcbiAgICAgIHN0YXRlOiBGb3JtU3RhdGU7XG4gICAgICBlbWl0PzogKGV2ZW50OiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiB2b2lkO1xuICAgICAgb24/OiAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb24pID0+IHZvaWQ7XG4gICAgICByZXNldD86IChmb3JjZT86IGJvb2xlYW4pID0+IGJvb2xlYW47XG4gICAgICBjbGVhckVycm9ycz86ICgpID0+IHZvaWQ7XG4gICAgICBkaXNhYmxlQ29udHJvbHM/OiAoKSA9PiB2b2lkO1xuICAgIH0sXG4gID4oXG4gICAgY29tcG9uZW50OiBULFxuICApOiBUID0+IHtcbiAgICAvLyBOb3JtYWxpemUgcHJvdGVjdGlvbiBjb25maWd1cmF0aW9uXG4gICAgY29uc3QgcHJvdGVjdENvbmZpZyA9IG5vcm1hbGl6ZVByb3RlY3RDb25maWcoY29uZmlnLnByb3RlY3RDaGFuZ2VzKTtcblxuICAgIC8vIElmIG92ZXJsYXkgcHJvdGVjdGlvbiBpcyBub3QgZW5hYmxlZCwgcmV0dXJuIGNvbXBvbmVudCB1bmNoYW5nZWRcbiAgICBpZiAoIXByb3RlY3RDb25maWcub25EYXRhT3ZlcndyaXRlKSB7XG4gICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIFRyYWNrIGJsb2NraW5nIG92ZXJsYXkgZWxlbWVudHMgKHRvcCwgYm90dG9tLCBsZWZ0LCByaWdodClcbiAgICBsZXQgYmxvY2tpbmdPdmVybGF5czogSFRNTEVsZW1lbnRbXSA9IFtdO1xuXG4gICAgLy8gUmVzaXplL3Njcm9sbCBoYW5kbGVyIGZvciB1cGRhdGluZyBvdmVybGF5IHBvc2l0aW9uc1xuICAgIGxldCByZXNpemVIYW5kbGVyOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICAgIC8vIFRyYWNrIGlmIHVzZXIgaGFzIGludGVyYWN0ZWQgd2l0aCB0aGUgZm9ybSAobWFkZSBhY3R1YWwgY2hhbmdlcylcbiAgICAvLyBUaGlzIHByZXZlbnRzIG92ZXJsYXlzIGZyb20gc2hvd2luZyBvbiBpbml0aWFsIGxvYWRcbiAgICBsZXQgaGFzVXNlckludGVyYWN0ZWQgPSBmYWxzZTtcblxuICAgIC8vIFRyYWNrIGlmIGRhdGEgaGFzIGJlZW4gbG9hZGVkIGF0IGxlYXN0IG9uY2VcbiAgICAvLyBUaGlzIGhlbHBzIGRpc3Rpbmd1aXNoIGJldHdlZW4gaW5pdGlhbCBsb2FkIGFuZCB1c2VyIGVkaXRzXG4gICAgbGV0IGRhdGFIYXNCZWVuTG9hZGVkID0gZmFsc2U7XG5cbiAgICAvLyBUcmFjayBpZiB3ZSdyZSBjdXJyZW50bHkgbG9hZGluZyBkYXRhIChpZ25vcmUgZmllbGQ6Y2hhbmdlIGV2ZW50cyBkdXJpbmcgdGhpcyB0aW1lKVxuICAgIGxldCBpc0xvYWRpbmdEYXRhID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGJsb2NraW5nIG92ZXJsYXkgZWxlbWVudHMgYXJvdW5kIHRoZSBmb3JtXG4gICAgICogVGhlc2Ugb3ZlcmxheXMgcHJldmVudCBjbGlja3Mgb3V0c2lkZSB0aGUgZm9ybSB3aGVuIGl0IGhhcyB1bnNhdmVkIGNoYW5nZXNcbiAgICAgKi9cbiAgICBjb25zdCBjcmVhdGVCbG9ja2luZ092ZXJsYXlzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKGJsb2NraW5nT3ZlcmxheXMubGVuZ3RoID4gMCkgcmV0dXJuOyAvLyBBbHJlYWR5IGNyZWF0ZWRcblxuICAgICAgY29uc3QgZm9ybUVsZW1lbnQgPSBjb21wb25lbnQuZWxlbWVudDtcbiAgICAgIGlmICghZm9ybUVsZW1lbnQpIHJldHVybjtcblxuICAgICAgLy8gR2V0IGZvcm0gcG9zaXRpb24gYW5kIGRpbWVuc2lvbnMgKHJlbGF0aXZlIHRvIHZpZXdwb3J0IGZvciBmaXhlZCBwb3NpdGlvbmluZylcbiAgICAgIGNvbnN0IHJlY3QgPSBmb3JtRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgLy8gQ29tbW9uIG92ZXJsYXkgc3R5bGVzIC0gdXNpbmcgZml4ZWQgcG9zaXRpb25pbmcgZm9yIHZpZXdwb3J0LXJlbGF0aXZlIHBsYWNlbWVudFxuICAgICAgLy8gei1pbmRleDogOTk5IGlzIGJlbG93IGRpYWxvZydzIG1vZGFsIHotaW5kZXggKDEwMDApIHNvIGRpYWxvZ3MgYXBwZWFyIGFib3ZlXG4gICAgICBjb25zdCBiYXNlU3R5bGVzID0gYFxuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgICB6LWluZGV4OiA5OTk7XG4gICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gICAgICBgO1xuXG4gICAgICAvLyBDcmVhdGUgdG9wIG92ZXJsYXkgKGZyb20gdG9wIG9mIHZpZXdwb3J0IHRvIHRvcCBvZiBmb3JtKVxuICAgICAgY29uc3QgdG9wT3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICB0b3BPdmVybGF5LmNsYXNzTmFtZSA9XG4gICAgICAgIFwibXRybC1mb3JtLWJsb2NraW5nLW92ZXJsYXkgbXRybC1mb3JtLWJsb2NraW5nLW92ZXJsYXktLXRvcFwiO1xuICAgICAgdG9wT3ZlcmxheS5zdHlsZS5jc3NUZXh0ID0gYCR7YmFzZVN0eWxlc31cbiAgICAgICAgdG9wOiAwO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgaGVpZ2h0OiAke3JlY3QudG9wfXB4O1xuICAgICAgYDtcblxuICAgICAgLy8gQ3JlYXRlIGJvdHRvbSBvdmVybGF5IChmcm9tIGJvdHRvbSBvZiBmb3JtIHRvIGJvdHRvbSBvZiB2aWV3cG9ydClcbiAgICAgIGNvbnN0IGJvdHRvbU92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgYm90dG9tT3ZlcmxheS5jbGFzc05hbWUgPVxuICAgICAgICBcIm10cmwtZm9ybS1ibG9ja2luZy1vdmVybGF5IG10cmwtZm9ybS1ibG9ja2luZy1vdmVybGF5LS1ib3R0b21cIjtcbiAgICAgIGJvdHRvbU92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9IGAke2Jhc2VTdHlsZXN9XG4gICAgICAgIHRvcDogJHtyZWN0LmJvdHRvbX1weDtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgcmlnaHQ6IDA7XG4gICAgICAgIGJvdHRvbTogMDtcbiAgICAgIGA7XG5cbiAgICAgIC8vIENyZWF0ZSBsZWZ0IG92ZXJsYXkgKGZyb20gbGVmdCBvZiB2aWV3cG9ydCB0byBsZWZ0IG9mIGZvcm0sIGJldHdlZW4gdG9wIGFuZCBib3R0b20pXG4gICAgICBjb25zdCBsZWZ0T3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBsZWZ0T3ZlcmxheS5jbGFzc05hbWUgPVxuICAgICAgICBcIm10cmwtZm9ybS1ibG9ja2luZy1vdmVybGF5IG10cmwtZm9ybS1ibG9ja2luZy1vdmVybGF5LS1sZWZ0XCI7XG4gICAgICBsZWZ0T3ZlcmxheS5zdHlsZS5jc3NUZXh0ID0gYCR7YmFzZVN0eWxlc31cbiAgICAgICAgdG9wOiAke3JlY3QudG9wfXB4O1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICB3aWR0aDogJHtyZWN0LmxlZnR9cHg7XG4gICAgICAgIGhlaWdodDogJHtyZWN0LmhlaWdodH1weDtcbiAgICAgIGA7XG5cbiAgICAgIC8vIENyZWF0ZSByaWdodCBvdmVybGF5IChmcm9tIHJpZ2h0IG9mIGZvcm0gdG8gcmlnaHQgb2Ygdmlld3BvcnQsIGJldHdlZW4gdG9wIGFuZCBib3R0b20pXG4gICAgICBjb25zdCByaWdodE92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgcmlnaHRPdmVybGF5LmNsYXNzTmFtZSA9XG4gICAgICAgIFwibXRybC1mb3JtLWJsb2NraW5nLW92ZXJsYXkgbXRybC1mb3JtLWJsb2NraW5nLW92ZXJsYXktLXJpZ2h0XCI7XG4gICAgICByaWdodE92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9IGAke2Jhc2VTdHlsZXN9XG4gICAgICAgIHRvcDogJHtyZWN0LnRvcH1weDtcbiAgICAgICAgbGVmdDogJHtyZWN0LnJpZ2h0fXB4O1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgaGVpZ2h0OiAke3JlY3QuaGVpZ2h0fXB4O1xuICAgICAgYDtcblxuICAgICAgLy8gQWRkIGNsaWNrIGhhbmRsZXIgdG8gc2hvdyBkaWFsb2cgd2hlbiBjbGlja2luZyBvbiBvdmVybGF5XG4gICAgICBjb25zdCBoYW5kbGVPdmVybGF5Q2xpY2sgPSAoZTogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgLy8gRW1pdCBkYXRhOmNvbmZsaWN0IGV2ZW50IHRvIHNob3cgZGlhbG9nXG4gICAgICAgIGNvbnN0IGNvbmZsaWN0RXZlbnQ6IERhdGFDb25mbGljdEV2ZW50ID0ge1xuICAgICAgICAgIGN1cnJlbnREYXRhOiB7IC4uLmNvbXBvbmVudC5zdGF0ZS5jdXJyZW50RGF0YSB9LFxuICAgICAgICAgIG5ld0RhdGE6IHt9LFxuICAgICAgICAgIGNhbmNlbGxlZDogZmFsc2UsXG4gICAgICAgICAgY2FuY2VsOiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBVc2VyIGNob3NlIHRvIGtlZXAgZWRpdGluZyAtIGRvIG5vdGhpbmcsIG92ZXJsYXlzIHN0YXlcbiAgICAgICAgICB9LFxuICAgICAgICAgIHByb2NlZWQ6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIFVzZXIgY2hvc2UgdG8gZGlzY2FyZCAtIHJlc2V0IGZvcm0gdG8gaW5pdGlhbCBzdGF0ZVxuICAgICAgICAgICAgLy8gU2FtZSBhcyBjYW5jZWwgYnV0dG9uIGJlaGF2aW9yXG4gICAgICAgICAgICBoYXNVc2VySW50ZXJhY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gUmVzZXQgZm9ybSB0byBpbml0aWFsIGRhdGEgKGZvcmNlPXRydWUgYnlwYXNzZXMgcHJvdGVjdGlvbilcbiAgICAgICAgICAgIGNvbXBvbmVudC5yZXNldD8uKHRydWUpO1xuICAgICAgICAgICAgLy8gQ2xlYXIgYW55IHZhbGlkYXRpb24gZXJyb3JzXG4gICAgICAgICAgICBjb21wb25lbnQuY2xlYXJFcnJvcnM/LigpO1xuICAgICAgICAgICAgLy8gRGlzYWJsZSBjb250cm9scyAoZm9ybSBpcyBub3cgcHJpc3RpbmUpXG4gICAgICAgICAgICBjb21wb25lbnQuZGlzYWJsZUNvbnRyb2xzPy4oKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuREFUQV9DT05GTElDVCwgY29uZmxpY3RFdmVudCk7XG4gICAgICB9O1xuXG4gICAgICBbdG9wT3ZlcmxheSwgYm90dG9tT3ZlcmxheSwgbGVmdE92ZXJsYXksIHJpZ2h0T3ZlcmxheV0uZm9yRWFjaChcbiAgICAgICAgKG92ZXJsYXkpID0+IHtcbiAgICAgICAgICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVPdmVybGF5Q2xpY2spO1xuICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3ZlcmxheSk7XG4gICAgICAgICAgYmxvY2tpbmdPdmVybGF5cy5wdXNoKG92ZXJsYXkpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBibG9ja2luZyBvdmVybGF5IGVsZW1lbnRzXG4gICAgICovXG4gICAgY29uc3QgcmVtb3ZlQmxvY2tpbmdPdmVybGF5cyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChibG9ja2luZ092ZXJsYXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBibG9ja2luZ092ZXJsYXlzLmZvckVhY2goKG92ZXJsYXkpID0+IHtcbiAgICAgICAgb3ZlcmxheS5yZW1vdmUoKTtcbiAgICAgIH0pO1xuICAgICAgYmxvY2tpbmdPdmVybGF5cyA9IFtdO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIGJsb2NraW5nIG92ZXJsYXlzIHBvc2l0aW9uIChlLmcuLCBvbiB3aW5kb3cgcmVzaXplKVxuICAgICAqL1xuICAgIGNvbnN0IHVwZGF0ZUJsb2NraW5nT3ZlcmxheXMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAoYmxvY2tpbmdPdmVybGF5cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgZm9ybUVsZW1lbnQgPSBjb21wb25lbnQuZWxlbWVudDtcbiAgICAgIGlmICghZm9ybUVsZW1lbnQpIHJldHVybjtcblxuICAgICAgY29uc3QgcmVjdCA9IGZvcm1FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAvLyBVcGRhdGUgZWFjaCBvdmVybGF5IHBvc2l0aW9uICh1c2luZyBmaXhlZCBwb3NpdGlvbmluZywgbm8gc2Nyb2xsIG9mZnNldCBuZWVkZWQpXG4gICAgICBjb25zdCBbdG9wT3ZlcmxheSwgYm90dG9tT3ZlcmxheSwgbGVmdE92ZXJsYXksIHJpZ2h0T3ZlcmxheV0gPVxuICAgICAgICBibG9ja2luZ092ZXJsYXlzO1xuXG4gICAgICBpZiAodG9wT3ZlcmxheSkge1xuICAgICAgICB0b3BPdmVybGF5LnN0eWxlLmhlaWdodCA9IGAke3JlY3QudG9wfXB4YDtcbiAgICAgIH1cbiAgICAgIGlmIChib3R0b21PdmVybGF5KSB7XG4gICAgICAgIGJvdHRvbU92ZXJsYXkuc3R5bGUudG9wID0gYCR7cmVjdC5ib3R0b219cHhgO1xuICAgICAgfVxuICAgICAgaWYgKGxlZnRPdmVybGF5KSB7XG4gICAgICAgIGxlZnRPdmVybGF5LnN0eWxlLnRvcCA9IGAke3JlY3QudG9wfXB4YDtcbiAgICAgICAgbGVmdE92ZXJsYXkuc3R5bGUud2lkdGggPSBgJHtyZWN0LmxlZnR9cHhgO1xuICAgICAgICBsZWZ0T3ZlcmxheS5zdHlsZS5oZWlnaHQgPSBgJHtyZWN0LmhlaWdodH1weGA7XG4gICAgICB9XG4gICAgICBpZiAocmlnaHRPdmVybGF5KSB7XG4gICAgICAgIHJpZ2h0T3ZlcmxheS5zdHlsZS50b3AgPSBgJHtyZWN0LnRvcH1weGA7XG4gICAgICAgIHJpZ2h0T3ZlcmxheS5zdHlsZS5sZWZ0ID0gYCR7cmVjdC5yaWdodH1weGA7XG4gICAgICAgIHJpZ2h0T3ZlcmxheS5zdHlsZS5oZWlnaHQgPSBgJHtyZWN0LmhlaWdodH1weGA7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgYmxvY2tpbmcgb3ZlcmxheXMgYmFzZWQgb24gbW9kaWZpZWQgc3RhdGVcbiAgICAgKi9cbiAgICBjb25zdCB1cGRhdGVQcm90ZWN0aW9uU3RhdGUgPSAobW9kaWZpZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICAgIGlmIChtb2RpZmllZCAmJiBoYXNVc2VySW50ZXJhY3RlZCkge1xuICAgICAgICBjcmVhdGVCbG9ja2luZ092ZXJsYXlzKCk7XG4gICAgICAgIC8vIEFkZCByZXNpemUvc2Nyb2xsIGxpc3RlbmVycyB0byB1cGRhdGUgb3ZlcmxheSBwb3NpdGlvbnNcbiAgICAgICAgaWYgKCFyZXNpemVIYW5kbGVyKSB7XG4gICAgICAgICAgcmVzaXplSGFuZGxlciA9IHVwZGF0ZUJsb2NraW5nT3ZlcmxheXM7XG4gICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgcmVzaXplSGFuZGxlcik7XG4gICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgcmVzaXplSGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlbW92ZUJsb2NraW5nT3ZlcmxheXMoKTtcbiAgICAgICAgLy8gUmVtb3ZlIHJlc2l6ZS9zY3JvbGwgbGlzdGVuZXJzXG4gICAgICAgIGlmIChyZXNpemVIYW5kbGVyKSB7XG4gICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgcmVzaXplSGFuZGxlcik7XG4gICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgcmVzaXplSGFuZGxlcik7XG4gICAgICAgICAgcmVzaXplSGFuZGxlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gTGlzdGVuIGZvciBmaWVsZDpjaGFuZ2UgZXZlbnRzIHRvIGRldGVjdCBhY3R1YWwgdXNlciBlZGl0c1xuICAgIC8vIFRoaXMgaXMgbW9yZSByZWxpYWJsZSB0aGFuIFNUQVRFX0NIQU5HRSBiZWNhdXNlIGl0IGZpcmVzIG9uIGV2ZXJ5IGZpZWxkIGVkaXRcbiAgICBjb21wb25lbnQub24/LihcImZpZWxkOmNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICAvLyBJZ25vcmUgZmllbGQ6Y2hhbmdlIGV2ZW50cyBkdXJpbmcgZGF0YSBsb2FkaW5nXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBmcm9tIHByb2dyYW1tYXRpYyBmaWVsZCB1cGRhdGVzXG4gICAgICBpZiAoaXNMb2FkaW5nRGF0YSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIE9ubHkgc2V0IGhhc1VzZXJJbnRlcmFjdGVkIGlmIGRhdGEgaGFzIGJlZW4gbG9hZGVkXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBkdXJpbmcgaW5pdGlhbCBmb3JtIHNldHVwXG4gICAgICBpZiAoZGF0YUhhc0JlZW5Mb2FkZWQgJiYgIWhhc1VzZXJJbnRlcmFjdGVkKSB7XG4gICAgICAgIGhhc1VzZXJJbnRlcmFjdGVkID0gdHJ1ZTtcbiAgICAgICAgLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byBzaG93IG92ZXJsYXlzIG5vd1xuICAgICAgICBpZiAoY29tcG9uZW50LnN0YXRlLm1vZGlmaWVkKSB7XG4gICAgICAgICAgdXBkYXRlUHJvdGVjdGlvblN0YXRlKHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIHN0YXRlIGNoYW5nZXMgdG8gc2hvdy9oaWRlIG92ZXJsYXlzXG4gICAgY29tcG9uZW50Lm9uPy4oRk9STV9FVkVOVFMuU1RBVEVfQ0hBTkdFLCAoZXZlbnQ6IHsgbW9kaWZpZWQ6IGJvb2xlYW4gfSkgPT4ge1xuICAgICAgLy8gV2hlbiBmb3JtIGJlY29tZXMgcHJpc3RpbmUgKGRhdGEgbG9hZGVkKSwgcmVzZXQgdGhlIGludGVyYWN0aW9uIGZsYWdcbiAgICAgIC8vIGFuZCBtYXJrIHRoYXQgZGF0YSBoYXMgYmVlbiBsb2FkZWRcbiAgICAgIGlmICghZXZlbnQubW9kaWZpZWQpIHtcbiAgICAgICAgaGFzVXNlckludGVyYWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgZGF0YUhhc0JlZW5Mb2FkZWQgPSB0cnVlO1xuICAgICAgICBpc0xvYWRpbmdEYXRhID0gdHJ1ZTtcblxuICAgICAgICAvLyBDbGVhciB0aGUgbG9hZGluZyBmbGFnIGFmdGVyIGEgc2hvcnQgZGVsYXkgdG8gYWxsb3cgYWxsIHByb2dyYW1tYXRpY1xuICAgICAgICAvLyBmaWVsZCB1cGRhdGVzIHRvIGNvbXBsZXRlIChjdXN0b20gZmllbGRzIG1heSB1cGRhdGUgYXN5bmMpXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlzTG9hZGluZ0RhdGEgPSBmYWxzZTtcbiAgICAgICAgfSwgMTAwKTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIHByb3RlY3Rpb24gc3RhdGVcbiAgICAgIHVwZGF0ZVByb3RlY3Rpb25TdGF0ZShldmVudC5tb2RpZmllZCk7XG4gICAgfSk7XG5cbiAgICAvLyBBbHNvIGxpc3RlbiBmb3IgcmVzZXQgZXZlbnQgdG8gcmVtb3ZlIG92ZXJsYXlzXG4gICAgY29tcG9uZW50Lm9uPy4oRk9STV9FVkVOVFMuUkVTRVQsICgpID0+IHtcbiAgICAgIHVwZGF0ZVByb3RlY3Rpb25TdGF0ZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBSZWdpc3RlciBjbGVhbnVwIHdoZW4gY29tcG9uZW50IGlzIGRlc3Ryb3llZFxuICAgIGNvbnN0IG9yaWdpbmFsTGlmZWN5Y2xlID0gY29tcG9uZW50LmxpZmVjeWNsZTtcbiAgICBpZiAob3JpZ2luYWxMaWZlY3ljbGUpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IG9yaWdpbmFsTGlmZWN5Y2xlLmRlc3Ryb3k7XG4gICAgICBvcmlnaW5hbExpZmVjeWNsZS5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAvLyBDbGVhbiB1cCBibG9ja2luZyBvdmVybGF5c1xuICAgICAgICByZW1vdmVCbG9ja2luZ092ZXJsYXlzKCk7XG4gICAgICAgIGlmIChyZXNpemVIYW5kbGVyKSB7XG4gICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgcmVzaXplSGFuZGxlcik7XG4gICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgcmVzaXplSGFuZGxlcik7XG4gICAgICAgICAgcmVzaXplSGFuZGxlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2FsbCBvcmlnaW5hbCBkZXN0cm95XG4gICAgICAgIG9yaWdpbmFsRGVzdHJveT8uKCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCB3aXRoUHJvdGVjdGlvbjtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9mZWF0dXJlcy9hcGkudHNcblxuLyoqXG4gKiBBUEkgZmVhdHVyZSBmb3IgRm9ybSBjb21wb25lbnRcbiAqIFByb3ZpZGVzIGEgY2xlYW4sIHVuaWZpZWQgcHVibGljIEFQSSBmb3IgdGhlIGZvcm1cbiAqIEFsc28gd2lyZXMgdXAgY29udHJvbCBidXR0b24gY2xpY2sgaGFuZGxlcnMgKHN1Ym1pdC9jYW5jZWwpXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBGb3JtQ29uZmlnLFxuICBCYXNlRm9ybUNvbXBvbmVudCxcbiAgRm9ybUNvbXBvbmVudCxcbiAgRm9ybURhdGEsXG4gIERhdGFTdGF0ZSxcbiAgRm9ybVN0YXRlLFxuICBGb3JtRmllbGQsXG4gIEZvcm1GaWVsZFJlZ2lzdHJ5LFxuICBGb3JtVmFsaWRhdGlvblJlc3VsdCxcbiAgRm9ybVN1Ym1pdE9wdGlvbnMsXG4gIEZpZWxkVmFsdWUsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgRk9STV9FVkVOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogV2lyZXMgdXAgY2xpY2sgaGFuZGxlcnMgZm9yIGNvbnRyb2wgYnV0dG9ucyAoc3VibWl0LCBjYW5jZWwpXG4gKi9cbmNvbnN0IHdpcmVDb250cm9sQnV0dG9ucyA9IChcbiAgY29udHJvbHM6IE1hcDxzdHJpbmcsIEZvcm1GaWVsZD4sXG4gIGFwaTogRm9ybUNvbXBvbmVudCxcbiAgY29uZmlnOiBGb3JtQ29uZmlnLFxuKTogdm9pZCA9PiB7XG4gIC8vIFdpcmUgc3VibWl0IGJ1dHRvblxuICBjb25zdCBzdWJtaXRCdXR0b24gPSBjb250cm9scy5nZXQoXCJzdWJtaXRcIik7XG4gIGlmIChzdWJtaXRCdXR0b24/LmVsZW1lbnQpIHtcbiAgICBzdWJtaXRCdXR0b24uZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKGNvbmZpZy5vblN1Ym1pdCkge1xuICAgICAgICAvLyBVc2UgY3VzdG9tIHN1Ym1pdCBoYW5kbGVyXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IGFwaS5nZXREYXRhKCk7XG4gICAgICAgICAgYXdhaXQgY29uZmlnLm9uU3VibWl0KGRhdGEsIGFwaSk7XG4gICAgICAgICAgLy8gQWZ0ZXIgc3VjY2Vzc2Z1bCBzdWJtaXQsIGRpc2FibGUgY29udHJvbHMgKGZvcm0gaXMgbm93IHByaXN0aW5lKVxuICAgICAgICAgIGFwaS5kaXNhYmxlQ29udHJvbHMoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRm9ybSBzdWJtaXQgZXJyb3I6XCIsIGVycm9yKTtcbiAgICAgICAgICAvLyBPbiBlcnJvciwgYWxzbyBkaXNhYmxlIGNvbnRyb2xzIHRvIHByZXZlbnQgcmVwZWF0ZWQgY2xpY2tzXG4gICAgICAgICAgYXBpLmRpc2FibGVDb250cm9scygpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVc2UgZGVmYXVsdCBmb3JtIHN1Ym1pdCAoaGFuZGxlcyBkaXNhYmxpbmcgaW50ZXJuYWxseSlcbiAgICAgICAgYXdhaXQgYXBpLnN1Ym1pdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gV2lyZSBjYW5jZWwgYnV0dG9uXG4gIGNvbnN0IGNhbmNlbEJ1dHRvbiA9IGNvbnRyb2xzLmdldChcImNhbmNlbFwiKTtcbiAgaWYgKGNhbmNlbEJ1dHRvbj8uZWxlbWVudCkge1xuICAgIGNhbmNlbEJ1dHRvbi5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICBpZiAoY29uZmlnLm9uQ2FuY2VsKSB7XG4gICAgICAgIC8vIFVzZSBjdXN0b20gY2FuY2VsIGhhbmRsZXJcbiAgICAgICAgY29uZmlnLm9uQ2FuY2VsKGFwaSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEZWZhdWx0OiByZXNldCBmb3JtIHRvIGluaXRpYWwgc3RhdGVcbiAgICAgICAgLy8gVXNlIGZvcmNlPXRydWUgdG8gYnlwYXNzIHByb3RlY3Rpb24gc2luY2UgdGhpcyBpcyBhbiBpbnRlbnRpb25hbCB1c2VyIGFjdGlvblxuICAgICAgICBhcGkucmVzZXQodHJ1ZSk7XG4gICAgICB9XG4gICAgICAvLyBDbGVhciBhbnkgdmFsaWRhdGlvbiBlcnJvcnMgKHZpc3VhbCBzdGF0ZSBvbiBmaWVsZHMpXG4gICAgICBhcGkuY2xlYXJFcnJvcnMoKTtcbiAgICAgIC8vIEFmdGVyIGNhbmNlbCwgZGlzYWJsZSBjb250cm9scyAoZm9ybSBpcyBub3cgcHJpc3RpbmUpXG4gICAgICBhcGkuZGlzYWJsZUNvbnRyb2xzKCk7XG4gICAgfSk7XG4gIH1cbn07XG5cbi8qKlxuICogRXh0ZW5kZWQgY29tcG9uZW50IGludGVyZmFjZSBiZWZvcmUgQVBJIGlzIGFwcGxpZWRcbiAqL1xuaW50ZXJmYWNlIEVuaGFuY2VkRm9ybUNvbXBvbmVudCBleHRlbmRzIEJhc2VGb3JtQ29tcG9uZW50IHtcbiAgZm9ybTogSFRNTEZvcm1FbGVtZW50O1xuICB1aTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnk7XG4gIGZpbGVzOiBGb3JtRmllbGRSZWdpc3RyeTtcbiAgc3RhdGU6IEZvcm1TdGF0ZTtcbiAgY29udHJvbHM6IE1hcDxzdHJpbmcsIEZvcm1GaWVsZD47XG5cbiAgLy8gRGF0YSBtZXRob2RzXG4gIGdldERhdGE6ICgpID0+IEZvcm1EYXRhO1xuICBzZXREYXRhOiAoZGF0YTogRm9ybURhdGEsIHNpbGVudD86IGJvb2xlYW4pID0+IHZvaWQ7XG4gIGdldEZpZWxkVmFsdWU6IChuYW1lOiBzdHJpbmcpID0+IEZpZWxkVmFsdWU7XG4gIHNldEZpZWxkVmFsdWU6IChuYW1lOiBzdHJpbmcsIHZhbHVlOiBGaWVsZFZhbHVlLCBzaWxlbnQ/OiBib29sZWFuKSA9PiB2b2lkO1xuICBpc01vZGlmaWVkOiAoKSA9PiBib29sZWFuO1xuICBnZXRNb2RpZmllZERhdGE6ICgpID0+IEZvcm1EYXRhO1xuICBzbmFwc2hvdDogKCkgPT4gdm9pZDtcbiAgcmVzZXQ6IChmb3JjZT86IGJvb2xlYW4pID0+IGJvb2xlYW47XG4gIGNsZWFyOiAoZm9yY2U/OiBib29sZWFuKSA9PiBib29sZWFuO1xuXG4gIC8vIEZpZWxkIG1ldGhvZHNcbiAgZ2V0RmllbGQ6IChuYW1lOiBzdHJpbmcpID0+IEZvcm1GaWVsZCB8IHVuZGVmaW5lZDtcbiAgZ2V0RmllbGROYW1lczogKCkgPT4gc3RyaW5nW107XG4gIGhhc0ZpZWxkOiAobmFtZTogc3RyaW5nKSA9PiBib29sZWFuO1xuXG4gIC8vIENvbnRyb2xsZXIgbWV0aG9kc1xuICBnZXREYXRhU3RhdGU6ICgpID0+IERhdGFTdGF0ZTtcbiAgZW5hYmxlQ29udHJvbHM6ICgpID0+IHZvaWQ7XG4gIGRpc2FibGVDb250cm9sczogKCkgPT4gdm9pZDtcbiAgZW5hYmxlRmllbGRzOiAoKSA9PiB2b2lkO1xuICBkaXNhYmxlRmllbGRzOiAoKSA9PiB2b2lkO1xuXG4gIC8vIFN1Ym1pdC9WYWxpZGF0aW9uIG1ldGhvZHNcbiAgdmFsaWRhdGU6ICgpID0+IEZvcm1WYWxpZGF0aW9uUmVzdWx0O1xuICB2YWxpZGF0ZUZpZWxkOiAoZmllbGROYW1lOiBzdHJpbmcpID0+IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgc3VibWl0OiAob3B0aW9ucz86IEZvcm1TdWJtaXRPcHRpb25zKSA9PiBQcm9taXNlPHVua25vd24+O1xuICBzZXRWYWxpZGF0aW9uUnVsZXM6IChydWxlczogaW1wb3J0KFwiLi4vdHlwZXNcIikuRm9ybVZhbGlkYXRpb25SdWxlW10pID0+IHZvaWQ7XG4gIGNsZWFyRXJyb3JzOiAoKSA9PiB2b2lkO1xuICBjbGVhckZpZWxkRXJyb3I6IChmaWVsZDogc3RyaW5nKSA9PiB2b2lkO1xuICBzZXRGaWVsZEVycm9yOiAoZmllbGQ6IHN0cmluZywgZXJyb3I6IHN0cmluZykgPT4gdm9pZDtcbiAgZ2V0RmllbGRFcnJvcjogKGZpZWxkOiBzdHJpbmcpID0+IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvLyBFdmVudCBtZXRob2RzXG4gIG9uPzogKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKSA9PiB2b2lkO1xuICBvZmY/OiAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb24pID0+IHZvaWQ7XG4gIGVtaXQ/OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG5cbiAgLy8gTGlmZWN5Y2xlXG4gIGxpZmVjeWNsZT86IHtcbiAgICBkZXN0cm95OiAoKSA9PiB2b2lkO1xuICB9O1xufVxuXG4vKipcbiAqIHdpdGhBUEkgZmVhdHVyZVxuICogQ3JlYXRlcyBhIGNsZWFuIHB1YmxpYyBBUEkgZm9yIHRoZSBmb3JtIGNvbXBvbmVudFxuICovXG5leHBvcnQgY29uc3Qgd2l0aEFQSSA9IChjb25maWc6IEZvcm1Db25maWcpID0+IHtcbiAgcmV0dXJuIChjb21wb25lbnQ6IEVuaGFuY2VkRm9ybUNvbXBvbmVudCk6IEZvcm1Db21wb25lbnQgPT4ge1xuICAgIC8vIFJlZ2lzdGVyIGV2ZW50IGhhbmRsZXJzIGZyb20gY29uZmlnXG4gICAgaWYgKGNvbmZpZy5vbiAmJiBjb21wb25lbnQub24pIHtcbiAgICAgIGZvciAoY29uc3QgW2V2ZW50LCBoYW5kbGVyXSBvZiBPYmplY3QuZW50cmllcyhjb25maWcub24pKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgY29tcG9uZW50Lm9uKGV2ZW50LCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgcHVibGljIEFQSVxuICAgIGNvbnN0IGFwaTogRm9ybUNvbXBvbmVudCA9IHtcbiAgICAgIC8vIENvcmUgcHJvcGVydGllc1xuICAgICAgZWxlbWVudDogY29tcG9uZW50LmVsZW1lbnQsXG4gICAgICBmb3JtOiBjb21wb25lbnQuZm9ybSxcbiAgICAgIHVpOiBjb21wb25lbnQudWksXG4gICAgICBmaWVsZHM6IGNvbXBvbmVudC5maWVsZHMsXG4gICAgICBzdGF0ZTogY29tcG9uZW50LnN0YXRlLFxuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIC8vIERhdGEgQVBJXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgYWxsIGZvcm0gZGF0YSBhcyBhIGtleS12YWx1ZSBvYmplY3RcbiAgICAgICAqL1xuICAgICAgZ2V0RGF0YSgpOiBGb3JtRGF0YSB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuZ2V0RGF0YSgpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTZXQgZm9ybSBkYXRhIGZyb20gYSBrZXktdmFsdWUgb2JqZWN0XG4gICAgICAgKiBAcGFyYW0gZGF0YSAtIERhdGEgdG8gc2V0XG4gICAgICAgKiBAcGFyYW0gc2lsZW50IC0gSWYgdHJ1ZSwgZG9uJ3QgZW1pdCBjaGFuZ2UgZXZlbnRzXG4gICAgICAgKi9cbiAgICAgIHNldERhdGEoZGF0YTogRm9ybURhdGEsIHNpbGVudD86IGJvb2xlYW4pOiBGb3JtQ29tcG9uZW50IHtcbiAgICAgICAgY29tcG9uZW50LnNldERhdGEoZGF0YSwgc2lsZW50KTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IGEgc3BlY2lmaWMgZmllbGQncyB2YWx1ZVxuICAgICAgICogQHBhcmFtIG5hbWUgLSBGaWVsZCBuYW1lXG4gICAgICAgKi9cbiAgICAgIGdldEZpZWxkVmFsdWUobmFtZTogc3RyaW5nKTogRmllbGRWYWx1ZSB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuZ2V0RmllbGRWYWx1ZShuYW1lKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IGEgc3BlY2lmaWMgZmllbGQncyB2YWx1ZVxuICAgICAgICogQHBhcmFtIG5hbWUgLSBGaWVsZCBuYW1lXG4gICAgICAgKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byBzZXRcbiAgICAgICAqIEBwYXJhbSBzaWxlbnQgLSBJZiB0cnVlLCBkb24ndCBlbWl0IGNoYW5nZSBldmVudHNcbiAgICAgICAqL1xuICAgICAgc2V0RmllbGRWYWx1ZShcbiAgICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgICB2YWx1ZTogRmllbGRWYWx1ZSxcbiAgICAgICAgc2lsZW50PzogYm9vbGVhbixcbiAgICAgICk6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQuc2V0RmllbGRWYWx1ZShuYW1lLCB2YWx1ZSwgc2lsZW50KTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IGEgZmllbGQgY29tcG9uZW50IGJ5IG5hbWVcbiAgICAgICAqIEBwYXJhbSBuYW1lIC0gRmllbGQgbmFtZVxuICAgICAgICovXG4gICAgICBnZXRGaWVsZChuYW1lOiBzdHJpbmcpOiBGb3JtRmllbGQgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LmdldEZpZWxkKG5hbWUpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgYWxsIGZpZWxkIG5hbWVzXG4gICAgICAgKi9cbiAgICAgIGdldEZpZWxkTmFtZXMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LmdldEZpZWxkTmFtZXMoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgZm9ybSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGluaXRpYWwvc25hcHNob3Qgc3RhdGVcbiAgICAgICAqL1xuICAgICAgaXNNb2RpZmllZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5pc01vZGlmaWVkKCk7XG4gICAgICB9LFxuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIC8vIFN0YXRlIEFQSVxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IHRoZSBjdXJyZW50IGRhdGEgc3RhdGUgKHByaXN0aW5lIG9yIGRpcnR5KVxuICAgICAgICovXG4gICAgICBnZXREYXRhU3RhdGUoKTogRGF0YVN0YXRlIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5nZXREYXRhU3RhdGUoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgLy8gVmFsaWRhdGlvbiBBUElcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgICAvKipcbiAgICAgICAqIFZhbGlkYXRlIHRoZSBmb3JtIGFnYWluc3QgY29uZmlndXJlZCBydWxlc1xuICAgICAgICogQXV0b21hdGljYWxseSBzaG93cyBlcnJvcnMgb24gZmllbGQgY29tcG9uZW50c1xuICAgICAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHQgd2l0aCB2YWxpZCBmbGFnIGFuZCBlcnJvcnNcbiAgICAgICAqL1xuICAgICAgdmFsaWRhdGUoKTogRm9ybVZhbGlkYXRpb25SZXN1bHQge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LnZhbGlkYXRlKCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFZhbGlkYXRlIGEgc2luZ2xlIGZpZWxkXG4gICAgICAgKiBAcGFyYW0gZmllbGROYW1lIC0gRmllbGQgbmFtZSB0byB2YWxpZGF0ZVxuICAgICAgICogQHJldHVybnMgRXJyb3IgbWVzc2FnZSBpZiBpbnZhbGlkLCB1bmRlZmluZWQgaWYgdmFsaWRcbiAgICAgICAqL1xuICAgICAgdmFsaWRhdGVGaWVsZChmaWVsZE5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQudmFsaWRhdGVGaWVsZChmaWVsZE5hbWUpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDbGVhciBhbGwgdmFsaWRhdGlvbiBlcnJvcnNcbiAgICAgICAqL1xuICAgICAgY2xlYXJFcnJvcnMoKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5jbGVhckVycm9ycygpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDbGVhciBlcnJvciBmb3IgYSBzcGVjaWZpYyBmaWVsZFxuICAgICAgICogQHBhcmFtIGZpZWxkIC0gRmllbGQgbmFtZVxuICAgICAgICovXG4gICAgICBjbGVhckZpZWxkRXJyb3IoZmllbGQ6IHN0cmluZyk6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQuY2xlYXJGaWVsZEVycm9yKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IGVycm9yIGZvciBhIHNwZWNpZmljIGZpZWxkXG4gICAgICAgKiBAcGFyYW0gZmllbGQgLSBGaWVsZCBuYW1lXG4gICAgICAgKiBAcGFyYW0gZXJyb3IgLSBFcnJvciBtZXNzYWdlXG4gICAgICAgKi9cbiAgICAgIHNldEZpZWxkRXJyb3IoZmllbGQ6IHN0cmluZywgZXJyb3I6IHN0cmluZyk6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQuc2V0RmllbGRFcnJvcihmaWVsZCwgZXJyb3IpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgZXJyb3IgZm9yIGEgc3BlY2lmaWMgZmllbGRcbiAgICAgICAqIEBwYXJhbSBmaWVsZCAtIEZpZWxkIG5hbWVcbiAgICAgICAqIEByZXR1cm5zIEVycm9yIG1lc3NhZ2Ugb3IgdW5kZWZpbmVkXG4gICAgICAgKi9cbiAgICAgIGdldEZpZWxkRXJyb3IoZmllbGQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuZ2V0RmllbGRFcnJvcihmaWVsZCk7XG4gICAgICB9LFxuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIC8vIFN1Ym1pdCBBUElcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgICAvKipcbiAgICAgICAqIFN1Ym1pdCB0aGUgZm9ybVxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBzdWJtaXQgY29uZmlndXJhdGlvblxuICAgICAgICovXG4gICAgICBhc3luYyBzdWJtaXQob3B0aW9ucz86IEZvcm1TdWJtaXRPcHRpb25zKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuc3VibWl0KG9wdGlvbnMpO1xuICAgICAgfSxcblxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAvLyBTdGF0ZSBNYW5hZ2VtZW50IEFQSVxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAgIC8qKlxuICAgICAgICogUmVzZXQgZm9ybSB0byBpbml0aWFsL3NuYXBzaG90IHN0YXRlXG4gICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvcmNlIC0gSWYgdHJ1ZSwgYnlwYXNzIHByb3RlY3Rpb24gYW5kIHJlc2V0IGltbWVkaWF0ZWx5XG4gICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiByZXNldCB3YXMgcGVyZm9ybWVkLCBmYWxzZSBpZiBjYW5jZWxsZWQgYnkgcHJvdGVjdGlvblxuICAgICAgICovXG4gICAgICByZXNldChmb3JjZT86IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5yZXNldChmb3JjZSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENsZWFyIGFsbCBmb3JtIGZpZWxkc1xuICAgICAgICogQHBhcmFtIHtib29sZWFufSBmb3JjZSAtIElmIHRydWUsIGJ5cGFzcyBwcm90ZWN0aW9uIGFuZCBjbGVhciBpbW1lZGlhdGVseVxuICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgY2xlYXIgd2FzIHBlcmZvcm1lZCwgZmFsc2UgaWYgY2FuY2VsbGVkIGJ5IHByb3RlY3Rpb25cbiAgICAgICAqL1xuICAgICAgY2xlYXIoZm9yY2U/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuY2xlYXIoZm9yY2UpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBFbmFibGUgYWxsIGZvcm0gZmllbGRzXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZSgpOiBGb3JtQ29tcG9uZW50IHtcbiAgICAgICAgY29tcG9uZW50LmVuYWJsZUZpZWxkcygpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBEaXNhYmxlIGFsbCBmb3JtIGZpZWxkc1xuICAgICAgICovXG4gICAgICBkaXNhYmxlKCk6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQuZGlzYWJsZUZpZWxkcygpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBFbmFibGUgY29udHJvbCBidXR0b25zIChzdWJtaXQsIGNhbmNlbCwgZXRjLilcbiAgICAgICAqL1xuICAgICAgZW5hYmxlQ29udHJvbHMoKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5lbmFibGVDb250cm9scygpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBEaXNhYmxlIGNvbnRyb2wgYnV0dG9uc1xuICAgICAgICovXG4gICAgICBkaXNhYmxlQ29udHJvbHMoKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5kaXNhYmxlQ29udHJvbHMoKTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgLy8gRXZlbnQgQVBJXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgICAgLyoqXG4gICAgICAgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXJcbiAgICAgICAqIEBwYXJhbSBldmVudCAtIEV2ZW50IG5hbWVcbiAgICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICovXG4gICAgICBvbihldmVudDogc3RyaW5nLCBoYW5kbGVyOiBGdW5jdGlvbik6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQub24/LihldmVudCwgaGFuZGxlcik7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBhbiBldmVudCBsaXN0ZW5lclxuICAgICAgICogQHBhcmFtIGV2ZW50IC0gRXZlbnQgbmFtZVxuICAgICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICAgKi9cbiAgICAgIG9mZihldmVudDogc3RyaW5nLCBoYW5kbGVyOiBGdW5jdGlvbik6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQub2ZmPy4oZXZlbnQsIGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBFbWl0IGFuIGV2ZW50XG4gICAgICAgKiBAcGFyYW0gZXZlbnQgLSBFdmVudCBuYW1lXG4gICAgICAgKiBAcGFyYW0gZGF0YSAtIEV2ZW50IGRhdGFcbiAgICAgICAqL1xuICAgICAgZW1pdChldmVudDogc3RyaW5nLCBkYXRhPzogdW5rbm93bik6IHZvaWQge1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKGV2ZW50LCBkYXRhKTtcbiAgICAgIH0sXG5cbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgLy8gTGlmZWN5Y2xlIEFQSVxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAgIC8qKlxuICAgICAgICogRGVzdHJveSB0aGUgZm9ybSBhbmQgY2xlYW4gdXAgcmVzb3VyY2VzXG4gICAgICAgKi9cbiAgICAgIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIC8vIENsZWFyIGFsbCBmaWVsZCBldmVudCBsaXN0ZW5lcnNcbiAgICAgICAgZm9yIChjb25zdCBbLCBmaWVsZF0gb2YgY29tcG9uZW50LmZpZWxkcykge1xuICAgICAgICAgIGlmICh0eXBlb2YgZmllbGQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBmaWVsZC5kZXN0cm95KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgY29udHJvbCBldmVudCBsaXN0ZW5lcnNcbiAgICAgICAgZm9yIChjb25zdCBbLCBjb250cm9sXSBvZiBjb21wb25lbnQuY29udHJvbHMpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNvbnRyb2wuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBjb250cm9sLmRlc3Ryb3koKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxsIGxpZmVjeWNsZSBkZXN0cm95IGlmIGF2YWlsYWJsZVxuICAgICAgICBpZiAoY29tcG9uZW50LmxpZmVjeWNsZT8uZGVzdHJveSkge1xuICAgICAgICAgIGNvbXBvbmVudC5saWZlY3ljbGUuZGVzdHJveSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIGZvcm0gZWxlbWVudCBmcm9tIERPTVxuICAgICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQ/LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICBjb21wb25lbnQuZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNvbXBvbmVudC5lbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtaXQgZGVzdHJveSBldmVudFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLlJFU0VUKTtcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIFdpcmUgdXAgY29udHJvbCBidXR0b24gY2xpY2sgaGFuZGxlcnNcbiAgICB3aXJlQ29udHJvbEJ1dHRvbnMoY29tcG9uZW50LmNvbnRyb2xzLCBhcGksIGNvbmZpZyk7XG5cbiAgICByZXR1cm4gYXBpO1xuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgd2l0aEFQSTtcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlCTyxTQUFTLFdBQVcsQ0FDekIsSUFDQSxJQUNBLElBQ0EsSUFDUTtBQUFBLEVBQ1IsT0FBTyxLQUFLLEtBQUssS0FBSyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7QUFBQTtBQVl2RCxTQUFTLFFBQVEsQ0FDdEIsSUFDQSxJQUNBLElBQ0EsSUFDUTtBQUFBLEVBQ1IsTUFBTSxRQUFTLEtBQUssTUFBTSxLQUFLLElBQUksS0FBSyxFQUFFLElBQUksTUFBTyxLQUFLO0FBQUEsRUFDMUQsT0FBTyxRQUFRLElBQUksUUFBUSxNQUFNO0FBQUE7QUFXNUIsU0FBUyxrQkFBa0IsQ0FDaEMsTUFDQSxlQUNBLE9BQ2M7QUFBQSxFQUNkLE1BQU0sVUFBVSxLQUFLLElBQUk7QUFBQSxFQUN6QixJQUFJLG1CQUFtQjtBQUFBLEVBRXZCLE1BQU0sUUFBc0I7QUFBQSxJQUMxQjtBQUFBLElBQ0E7QUFBQSxJQUNBLFFBQ0csTUFBTSxVQUEyQixjQUFjO0FBQUEsSUFDbEQsV0FBVyxNQUFNO0FBQUEsSUFDakI7QUFBQSxJ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
|