@smarterplan/ngx-smarterplan-core 1.4.21 → 1.4.22
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/README.md +24 -24
- package/esm2022/lib/components/csv-export/csv-export.component.mjs +3 -3
- package/esm2022/lib/components/loader/loader.component.mjs +3 -3
- package/esm2022/lib/components/menu-bar/avatar/avatar.component.mjs +1 -1
- package/esm2022/lib/components/menu-bar/menu-bar.component.mjs +3 -3
- package/esm2022/lib/components/menu-bar/navigation-bar/navigation-bar.component.mjs +3 -3
- package/esm2022/lib/components/modal-switch-visit/modal-switch-visit.component.mjs +3 -3
- package/esm2022/lib/components/search-bar/search-bar.component.mjs +3 -3
- package/esm2022/lib/components/splat-viewer/splat-viewer.component.mjs +361 -0
- package/esm2022/lib/components/support-modal/support-modal.component.mjs +3 -3
- package/esm2022/lib/config.mjs +1 -1
- package/esm2022/lib/helpers.service.mjs +1 -1
- package/esm2022/lib/matterport-extensions/nest-thermostat/CanvasImage.mjs +1 -1
- package/esm2022/lib/matterport-extensions/nest-thermostat/CanvasRenderer.mjs +1 -1
- package/esm2022/lib/matterport-extensions/nest-thermostat/NestThermostat.mjs +1 -1
- package/esm2022/lib/matterport-extensions/nest-thermostat/PlaneRenderer.mjs +1 -1
- package/esm2022/lib/matterport-extensions/scene-component/SceneComponent.mjs +1 -1
- package/esm2022/lib/matterport-extensions/security-camera/SecurityCamera.mjs +22 -22
- package/esm2022/lib/matterport-extensions/tv-player/TvPlayer.mjs +1 -1
- package/esm2022/lib/matterport-extensions/view-frustum-mesh/ViewFrustumMesh.mjs +22 -22
- package/esm2022/lib/mattertagData.mjs +1 -1
- package/esm2022/lib/ngx-smarterplan-core.module.mjs +9 -4
- package/esm2022/lib/ngx-smarterplan-core.service.mjs +1 -1
- package/esm2022/lib/pipes/duration-to-string.pipe.mjs +1 -1
- package/esm2022/lib/pipes/format-date-number-to-digits.pipe.mjs +1 -1
- package/esm2022/lib/pipes/hashtag-from-id.pipe.mjs +1 -1
- package/esm2022/lib/pipes/safe-url.pipe.mjs +1 -1
- package/esm2022/lib/pipes/time-date-to-local-string.pipe.mjs +1 -1
- package/esm2022/lib/pipes/username-from-id.pipe.mjs +1 -1
- package/esm2022/lib/services/amplify-cache.service.mjs +1 -1
- package/esm2022/lib/services/base-tab.service.mjs +1 -1
- package/esm2022/lib/services/baseVisibility.service.mjs +1 -1
- package/esm2022/lib/services/content.service.mjs +1 -1
- package/esm2022/lib/services/filter.service.mjs +1 -1
- package/esm2022/lib/services/intervention.service.mjs +1 -1
- package/esm2022/lib/services/locale.service.mjs +1 -1
- package/esm2022/lib/services/matterport-import.service.mjs +1 -1
- package/esm2022/lib/services/matterport-measurement.service.mjs +1 -1
- package/esm2022/lib/services/matterport-navigation.service.mjs +1 -1
- package/esm2022/lib/services/matterport-pointer.service.mjs +6 -6
- package/esm2022/lib/services/matterport-tag-copy.service.mjs +1 -1
- package/esm2022/lib/services/matterport-tag.service.mjs +12 -7
- package/esm2022/lib/services/matterport.service.mjs +17 -17
- package/esm2022/lib/services/models/affectation.service.mjs +1 -1
- package/esm2022/lib/services/models/base-object.service.mjs +1 -1
- package/esm2022/lib/services/models/capture.service.mjs +1 -1
- package/esm2022/lib/services/models/comment.service.mjs +1 -1
- package/esm2022/lib/services/models/domain.service.mjs +1 -1
- package/esm2022/lib/services/models/equipment.service.mjs +1 -1
- package/esm2022/lib/services/models/event.service.mjs +1 -1
- package/esm2022/lib/services/models/feature.service.mjs +1 -1
- package/esm2022/lib/services/models/hashtag.service.mjs +1 -1
- package/esm2022/lib/services/models/layer.service.mjs +1 -1
- package/esm2022/lib/services/models/measurement.service.mjs +1 -1
- package/esm2022/lib/services/models/mission.service.mjs +1 -1
- package/esm2022/lib/services/models/navigation.service.mjs +1 -1
- package/esm2022/lib/services/models/node.service.mjs +1 -1
- package/esm2022/lib/services/models/object3D.service.mjs +1 -1
- package/esm2022/lib/services/models/operation.service.mjs +1 -1
- package/esm2022/lib/services/models/organisation.service.mjs +1 -1
- package/esm2022/lib/services/models/plan.service.mjs +1 -1
- package/esm2022/lib/services/models/poi.service.mjs +27 -27
- package/esm2022/lib/services/models/profile.service.mjs +1 -1
- package/esm2022/lib/services/models/property.service.mjs +1 -1
- package/esm2022/lib/services/models/space.service.mjs +1 -1
- package/esm2022/lib/services/models/template.service.mjs +1 -1
- package/esm2022/lib/services/models/ticket.service.mjs +1 -1
- package/esm2022/lib/services/models/visit.service.mjs +1 -1
- package/esm2022/lib/services/models/zone.service.mjs +1 -1
- package/esm2022/lib/services/navigator.service.mjs +1 -1
- package/esm2022/lib/services/obj-to-glb.mjs +649 -0
- package/esm2022/lib/services/s3.service.mjs +43 -3
- package/esm2022/lib/services/search.service.mjs +1 -1
- package/esm2022/lib/services/support.service.mjs +1 -1
- package/esm2022/lib/services/sweep-locator.service.mjs +1 -1
- package/esm2022/lib/services/tag.service.mjs +16 -16
- package/esm2022/lib/services/threejs-import.service.mjs +6 -4
- package/esm2022/lib/services/threejs.service.mjs +867 -95
- package/esm2022/lib/services/user.service.mjs +1 -1
- package/esm2022/lib/services/utils/matterport-transform.util.mjs +1 -1
- package/esm2022/lib/services/validators.service.mjs +1 -1
- package/esm2022/lib/services/viewer.service.mjs +189 -7
- package/esm2022/lib/services/zone-drawer.service.mjs +1 -1
- package/esm2022/lib/services/zoneChange.service.mjs +1 -1
- package/esm2022/lib/tokens/matterport-sdk-key.token.mjs +1 -1
- package/esm2022/lib/validators/email.directive.mjs +1 -1
- package/esm2022/lib/validators/no-empty.directive.mjs +1 -1
- package/esm2022/lib/validators/number.directive.mjs +1 -1
- package/esm2022/lib/validators/text.directive.mjs +1 -1
- package/esm2022/public-api.mjs +3 -1
- package/fesm2022/smarterplan-ngx-smarterplan-core.mjs +2239 -233
- package/fesm2022/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
- package/lib/components/splat-viewer/splat-viewer.component.d.ts +98 -0
- package/lib/ngx-smarterplan-core.module.d.ts +7 -6
- package/lib/services/matterport-tag.service.d.ts +5 -5
- package/lib/services/obj-to-glb.d.ts +66 -0
- package/lib/services/s3.service.d.ts +7 -0
- package/lib/services/threejs.service.d.ts +336 -16
- package/lib/services/viewer.service.d.ts +110 -8
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
- package/src/assets/viewers/splat/chunk-BYLI4YBI.js +17037 -0
- package/src/assets/viewers/splat/chunk-LDV6YPMG.js +1 -0
- package/src/assets/viewers/splat/chunk-WZ5Z4TU3.js +105719 -0
- package/src/assets/viewers/splat/convert-4DRLH77X.js +1 -0
- package/src/assets/viewers/splat/convert.html +11 -0
- package/src/assets/viewers/splat/converter-SLBB5MHG.js +1 -0
- package/src/assets/viewers/splat/index.html +90 -0
- package/src/assets/viewers/splat/spz-DEYRea_v-QE6YSGIB.js +5292 -0
- package/src/assets/viewers/splat/viewer-W4X3FWQJ.js +2704 -0
- package/src/assets/viewers/splat/viewer.css +1096 -0
- package/src/assets/viewers/splat/webp.wasm +0 -0
- package/src/assets/viewers/splat/worker.mjs +1383 -0
- package/src/assets/vs-app.json +67 -67
|
@@ -364,11 +364,11 @@ export class MatterportTagService {
|
|
|
364
364
|
* floor and room context. Must be called after each sweep, floor or mode change.
|
|
365
365
|
*
|
|
366
366
|
* Rules:
|
|
367
|
-
* -
|
|
368
|
-
*
|
|
369
|
-
*
|
|
370
|
-
*
|
|
371
|
-
* -
|
|
367
|
+
* - A tag shows when its sweep is on the floor being displayed, in every mode. Tags on
|
|
368
|
+
* other floors are hidden (opacity 0) and cannot be opened.
|
|
369
|
+
* - While all floors are displayed - the usual state of DOLLHOUSE and FLOORPLAN - every
|
|
370
|
+
* tag shows.
|
|
371
|
+
* - A tag with no sweep belongs to no floor and always shows.
|
|
372
372
|
*
|
|
373
373
|
* @param sdk Matterport SDK instance.
|
|
374
374
|
* @param poseCamera Current camera pose.
|
|
@@ -380,7 +380,12 @@ export class MatterportTagService {
|
|
|
380
380
|
if (!sdk || this.dictionnaryTags.size === 0)
|
|
381
381
|
return;
|
|
382
382
|
const isInteriorMode = currentCameraMode === CameraMode.INSIDE;
|
|
383
|
-
|
|
383
|
+
// The SDK reports sequence -1 while all floors are displayed, which is the dollhouse's and the
|
|
384
|
+
// floor plan's normal state. That is "no floor in particular", not a floor that no tag is on:
|
|
385
|
+
// read as a floor id, it matched nothing and hid every tag that has a sweep.
|
|
386
|
+
const currentFloorId = currentFloorSequence !== null && currentFloorSequence >= 0
|
|
387
|
+
? currentFloorSequence.toString()
|
|
388
|
+
: null;
|
|
384
389
|
const promises = [];
|
|
385
390
|
for (const [tagId, mattertagData] of this.dictionnaryTags) {
|
|
386
391
|
if (tagId === mattertagToFollow)
|
|
@@ -680,4 +685,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
680
685
|
providedIn: 'root',
|
|
681
686
|
}]
|
|
682
687
|
}], ctorParameters: () => [{ type: i1.MatterportNavigationService }] });
|
|
683
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0dGVycG9ydC10YWcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1jb3JlL3NyYy9saWIvc2VydmljZXMvbWF0dGVycG9ydC10YWcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQWtELFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV6RyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7OztBQU0xQyxNQUFNLE9BQU8sb0JBQW9CO0lBdUNyQjtJQXRDVixvRUFBb0U7SUFDNUQsTUFBTSxDQUFVLHFCQUFxQixHQUFHLHlCQUF5QixDQUFDO0lBRW5FLGVBQWUsR0FBK0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUN4RCxXQUFXLEdBQWlCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM5QyxpQkFBaUIsR0FBa0IsSUFBSSxDQUFDO0lBQ3hDLFNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO0lBQ2xDLFlBQVksR0FBa0IsRUFBRSxDQUFDO0lBQ2pDLGVBQWUsR0FBVyxFQUFFLENBQUM7SUFDN0IsY0FBYyxHQUFZLEtBQUssQ0FBQztJQUNoQyxVQUFVLEdBQTBCLElBQUksQ0FBQztJQUN4QyxrQkFBa0IsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNwRCxrQkFBa0IsR0FBeUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUM3RCwrRUFBK0U7SUFDdkUsZUFBZSxHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ3pELHlHQUF5RztJQUNq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b0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQzlCLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLDJFQUEyRTtRQUMzRSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO0lBQ3BDLENBQUM7d0dBdnRCVSxvQkFBb0I7NEdBQXBCLG9CQUFvQixjQUZuQixNQUFNOzs0RkFFUCxvQkFBb0I7a0JBSGhDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNEZXZNb2RlLCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgTWF0dGVydGFnRGF0YSB9IGZyb20gJy4uL21hdHRlcnRhZ0RhdGEnO1xyXG5pbXBvcnQgeyBQb2lUeXBlLCBEYk9iamVjdFR5cGUsIFBPSSwgVmlld2VySW50ZXJhY3Rpb25zLCBUYWdBY3Rpb24sIENhbWVyYU1vZGUgfSBmcm9tICcuLi90eXBlcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWF0dGVycG9ydE5hdmlnYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9tYXR0ZXJwb3J0LW5hdmlnYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IHdhaXQgfSBmcm9tICcuLi9oZWxwZXJzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYXNlVGFnU2VydmljZSB9IGZyb20gJy4vdGFnLnNlcnZpY2UnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIE1hdHRlcnBvcnRUYWdTZXJ2aWNlIHtcclxuICAvKiogTmFtZSBvZiB0aGUgY29tbW9uIGxheWVyIGV2ZXJ5IFNtYXJ0ZXJwbGFuIHRhZyBpcyBjcmVhdGVkIGluLiAqL1xyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNIQVJFRF9UQUdfTEFZRVJfTkFNRSA9ICdzbWFydGVycGxhbi1zaGFyZWQtdGFncyc7XHJcblxyXG4gIHB1YmxpYyBkaWN0aW9ubmFyeVRhZ3M6IE1hcDxzdHJpbmcsIE1hdHRlcnRhZ0RhdGE+ID0gbmV3IE1hcCgpO1xyXG4gIHB1YmxpYyB0YWdBZGRRdWV1ZTogUHJvbWlzZTxhbnk+ID0gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgcHVibGljIG1hdHRlcnRhZ1RvRm9sbG93OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBwdWJsaWMgb25Hb1RvVGFnID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xyXG4gIHB1YmxpYyBtYXR0ZXJ0YWdJRHM6IEFycmF5PHN0cmluZz4gPSBbXTtcclxuICBwdWJsaWMgdGFnc0F0dGFjaG1lbnRzOiBPYmplY3QgPSB7fTtcclxuICBwdWJsaWMgdGFnTWVzc2VuZ2VyT246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgdGFnU2VydmljZTogQmFzZVRhZ1NlcnZpY2UgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHRhZ3NDdXJyZW50T3BhY2l0eTogTWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXAoKTtcclxuICBwcml2YXRlIHRhZ3NDdXJyZW50RW5hYmxlZDogTWFwPHN0cmluZywgYm9vbGVhbj4gPSBuZXcgTWFwKCk7XHJcbiAgLyoqIHRhZ0lkIC0+IGljb24gbmFtZSBsYXN0IGFwcGxpZWQsIHNvIGFuIHVuY2hhbmdlZCBpY29uIGlzIG5vdCByZS1hcHBsaWVkLiAqL1xyXG4gIHByaXZhdGUgdGFnc0N1cnJlbnRJY29uOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xyXG4gIC8qKiBJZHMgb2YgdGhlIGdsb2JhbCBTREsgVGFnIGNvbGxlY3Rpb24sIGFuZCB0aGUgdGFncyB3YWl0aW5nIHRvIGFwcGVhciBpbiBpdCwgc2VlIHdhaXRGb3JUYWdJblNkaygpLiAqL1xyXG4gIHByaXZhdGUgc2RrVGFnSWRzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcclxuICBwcml2YXRlIHNka1RhZ1dhaXRlcnM6IE1hcDxzdHJpbmcsIEFycmF5PCgpID0+IHZvaWQ+PiA9IG5ldyBNYXAoKTtcclxuICBwcml2YXRlIHNka1RhZ1N1YnNjcmlwdGlvbjogYW55ID0gbnVsbDtcclxuICBwcml2YXRlIHNka1RhZ1N1YnNjcmlwdGlvblNkazogYW55ID0gbnVsbDtcclxuICAvKipcclxuICAgKiBTaW5nbGUgbGF5ZXIgaG9sZGluZyBldmVyeSBTbWFydGVycGxhbiB0YWcsIGFkZGVkIHRvIGV2ZXJ5IHZpZXcgb2YgdGhlIHNwYWNlIHNvIGFcclxuICAgKiB0YWcgc3RheXMgaW4gcGxhY2Ug4oCUIHNhbWUgc2lkLCBzYW1lIGNvbnRlbnQg4oCUIHdoZW4gdGhlIHVzZXIgc3dpdGNoZXMgYmV0d2VlbiB0aGVcclxuICAgKiBmdXJuaXNoZWQgYW5kIHRoZSBEZWZ1cm5pc2hlZCB2aWV3LiBUYWdzIGFkZGVkIHRvIHRoZSBnbG9iYWwgc2RrLlRhZyAob3IgdG8gYVxyXG4gICAqIHZpZXcncyBvd24gbGF5ZXIpIGJlbG9uZyB0byB0aGF0IHZpZXcgb25seSwgd2hpY2ggaXMgd2hhdCBtYWRlIHRoZW0gcG9wIGluIGFuZCBvdXRcclxuICAgKiBvbiBldmVyeSB2aWV3IGNoYW5nZS5cclxuICAgKlxyXG4gICAqIERlbGliZXJhdGVseSBOT1QgY3JlYXRlZCB3aXRoIGB7IGNvbW1vbjogdHJ1ZSB9YDogaW4gU0RLIDI2LjcuNSBhIGNvbW1vbiBsYXllciBpc1xyXG4gICAqIHB1c2hlZCBpbnRvIGBnZXRPcmRlcmVkTW9kZWxWaWV3cygpYCBhdCBjcmVhdGlvbiB0aW1lLCBhbmQgdGhhdCBjYWxsIGRlZmF1bHRzIHRvXHJcbiAgICogYGluY2x1ZGVEZWZ1cm5pc2g6IGZhbHNlYCwgc28gdGhlIERlZnVybmlzaGVkIHZpZXcgbmV2ZXIgcmVjZWl2ZXMgaXQg4oCUIHdoaWxlXHJcbiAgICogYFZpZXcuYWRkTGF5ZXIoKWAgcmVmdXNlcyB0byByZXBhaXIgaXQgKFwiTGF5ZXIgaXMgY29tbW9uLiBObyBuZWVkIHRvIGFkZC5cIikuIEFcclxuICAgKiBwbGFpbiBsYXllciB3ZSBhdHRhY2ggdG8gZWFjaCB2aWV3IG91cnNlbHZlcyByZWFjaGVzIGV2ZXJ5IHZpZXcsIERlZnVybmlzaGVkXHJcbiAgICogaW5jbHVkZWQuIFNlZSBhdHRhY2hTaGFyZWRUYWdMYXllclRvVmlld3MoKS5cclxuICAgKi9cclxuICBwcml2YXRlIHNoYXJlZFRhZ0xheWVyOiBhbnkgPSBudWxsO1xyXG4gIHByaXZhdGUgc2hhcmVkVGFnTGF5ZXJQcm9taXNlOiBQcm9taXNlPGFueT4gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIG5hdmlnYXRpb25TZXJ2aWNlOiBNYXR0ZXJwb3J0TmF2aWdhdGlvblNlcnZpY2VcclxuICApIHsgfVxyXG5cclxuICBzZXRUYWdTZXJ2aWNlKHNlcnZpY2U6IEJhc2VUYWdTZXJ2aWNlKTogdm9pZCB7XHJcbiAgICB0aGlzLnRhZ1NlcnZpY2UgPSBzZXJ2aWNlO1xyXG4gIH1cclxuXHJcbiAgLyoqIE9wZW5zIGEgc3BlY2lmaWMgdGFnIGluIHRoZSBNYXR0ZXJwb3J0IHZpZXdlciBieSBpdHMgSUQuICovXHJcbiAgYXN5bmMgZ29Ub1RhZyhzZGs6IGFueSwgc2lkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgaWYgKCFzZGspIHJldHVybjtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMub25Hb1RvVGFnLm5leHQoc2lkKTtcclxuICAgICAgLy8gYG9wZW5gIG9ubHkgZXhpc3RzIG9uIHRoZSBnbG9iYWwgVGFnIG1vZHVsZSwgbmV2ZXIgb24gYSBsYXllci1zY29wZWQgb25lLlxyXG4gICAgICBhd2FpdCBzZGsuVGFnLm9wZW4oc2lkKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0Nhbm5vdCBvcGVuIHRhZycsIHNpZCwgZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBTREsgVGFnIG1vZHVsZSB0byB1c2UgZm9yIGFuIG9wZXJhdGlvbiBhZGRyZXNzaW5nIGFuIGV4aXN0aW5nIHRhZyBieSBJRFxyXG4gICAqIChpY29uLCBvcGFjaXR5LCBwb3NpdGlvbiwgYXR0YWNobWVudHMsIHJlbW92YWwuLi4pOiBhbHdheXMgdGhlIGdsb2JhbCBzZGsuVGFnLlxyXG4gICAqXHJcbiAgICogQSBsYXllci1zY29wZWQgVGFnIG1vZHVsZSBvbmx5IGV4cG9zZXMgdGhlICpyZXBsYXlhYmxlKiBtdXRhdGlvbnMsIG1lYW50IHRvIGJ1aWxkXHJcbiAgICogdGhlIGxheWVyJ3Mgb3duIGNvbnRlbnQ7IGFwcGx5aW5nIHRoZW0gdG8gYW4gYWxyZWFkeS1jcmVhdGVkIHRhZyBzaWxlbnRseSBkb2VzXHJcbiAgICogbm90aGluZyDigJQgd2hpY2ggaXMgd2hhdCBsZWZ0IGV2ZXJ5IHBpbiB3aGl0ZSBpbnN0ZWFkIG9mIGNhcnJ5aW5nIGl0cyBpY29uLiBPbmx5XHJcbiAgICogYGFkZGAgaGFzIHRvIGdvIHRocm91Z2ggdGhlIGxheWVyLCBzZWUgZ2V0VGFnQ3JlYXRpb25Nb2R1bGUoKS4gVGhlIGdsb2JhbCBtb2R1bGVcclxuICAgKiBvbmx5IGtub3dzIGEgbGF5ZXItY3JlYXRlZCBwaW4gb25jZSBpdCBpcyByZW5kZXJlZDogc2VlIHdhaXRGb3JUYWdJblNkaygpLlxyXG4gICAqL1xyXG4gIGdldFRhZ01vZHVsZShzZGs6IGFueSwgdGFnSWQ6IHN0cmluZyk6IGFueSB7XHJcbiAgICByZXR1cm4gc2RrPy5UYWc7XHJcbiAgfVxyXG5cclxuICAvKiogSWNvbiBuYW1lIGxhc3QgYXBwbGllZCB0byBhIHRhZywgaWYgYW55LiAqL1xyXG4gIGdldENhY2hlZFRhZ0ljb24odGFnSWQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy50YWdzQ3VycmVudEljb24uZ2V0KHRhZ0lkKTtcclxuICB9XHJcblxyXG4gIC8qKiBBcHBsaWVzIGFuIGljb24gdG8gYSB0YWcgdGhyb3VnaCBpdHMgb3duIG1vZHVsZSBhbmQgcmVtZW1iZXJzIGl0IG9uIHN1Y2Nlc3MuICovXHJcbiAgYXN5bmMgZWRpdFRhZ0ljb24oc2RrOiBhbnksIHRhZ0lkOiBzdHJpbmcsIGljb25OYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuZ2V0VGFnTW9kdWxlKHNkaywgdGFnSWQpLmVkaXRJY29uKHRhZ0lkLCBpY29uTmFtZSk7XHJcbiAgICB0aGlzLnRhZ3NDdXJyZW50SWNvbi5zZXQodGFnSWQsIGljb25OYW1lKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc29sdmVzIG9uY2UgdGhlIGdsb2JhbCBTREsgVGFnIGNvbGxlY3Rpb24g4oCUIHRoZSBvbmUgZWRpdHMgZ28gdGhyb3VnaCDigJQgY29udGFpbnMgdGhlXHJcbiAgICogdGFnLCBzbyBlZGl0cyBkbyBub3QgaGl0IGEgcGluIHRoYXQgaXMgbm90IHJlbmRlcmVkIHlldCAoXCJzZXRQaW5SZW5kZXJPdmVycmlkZXMgb24gYSBwaW5cclxuICAgKiB0aGF0IGRvZXNuJ3QgZXhpc3RcIikuIEdpdmVzIHVwIGFmdGVyIGB0aW1lb3V0TXNgIGFuZCByZXNvbHZlcyBhbnl3YXk7IGZhbGxzIGJhY2sgdG8gYVxyXG4gICAqIHNob3J0IHdhaXQgd2hlbiB0aGUgY29sbGVjdGlvbiBjYW5ub3QgYmUgb2JzZXJ2ZWQuIE9uZSBzdWJzY3JpcHRpb24gaXMgc2hhcmVkIGJ5IGV2ZXJ5XHJcbiAgICogd2FpdGluZyB0YWc6IGEgc3BhY2UgbG9hZHMgaHVuZHJlZHMgb2YgdGhlbS5cclxuICAgKi9cclxuICBwcml2YXRlIHdhaXRGb3JUYWdJblNkayhzZGs6IGFueSwgdGFnSWQ6IHN0cmluZywgdGltZW91dE1zID0gMTUwMCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF0YWdJZCB8fCAhdGhpcy5vYnNlcnZlU2RrVGFncyhzZGspKSByZXR1cm4gd2FpdCgxMDApO1xyXG4gICAgaWYgKHRoaXMuc2RrVGFnSWRzLmhhcyh0YWdJZCkpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcclxuICAgICAgY29uc3Qgd2FpdGVycyA9IHRoaXMuc2RrVGFnV2FpdGVycy5nZXQodGFnSWQpIHx8IFtdO1xyXG4gICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlbWFpbmluZyA9ICh0aGlzLnNka1RhZ1dhaXRlcnMuZ2V0KHRhZ0lkKSB8fCBbXSkuZmlsdGVyKHdhaXRlciA9PiB3YWl0ZXIgIT09IGRvbmUpO1xyXG4gICAgICAgIGlmIChyZW1haW5pbmcubGVuZ3RoKSB0aGlzLnNka1RhZ1dhaXRlcnMuc2V0KHRhZ0lkLCByZW1haW5pbmcpO1xyXG4gICAgICAgIGVsc2UgdGhpcy5zZGtUYWdXYWl0ZXJzLmRlbGV0ZSh0YWdJZCk7XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9LCB0aW1lb3V0TXMpO1xyXG4gICAgICBjb25zdCBkb25lID0gKCkgPT4geyBjbGVhclRpbWVvdXQodGltZXIpOyByZXNvbHZlKCk7IH07XHJcbiAgICAgIHdhaXRlcnMucHVzaChkb25lKTtcclxuICAgICAgdGhpcy5zZGtUYWdXYWl0ZXJzLnNldCh0YWdJZCwgd2FpdGVycyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBLZWVwcyBzZGtUYWdJZHMgaW4gc3luYyB3aXRoIHRoZSBnbG9iYWwgU0RLIFRhZyBjb2xsZWN0aW9uOyBmYWxzZSB3aGVuIGl0IGNhbm5vdCBiZSBvYnNlcnZlZC4gKi9cclxuICBwcml2YXRlIG9ic2VydmVTZGtUYWdzKHNkazogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5zZGtUYWdTdWJzY3JpcHRpb24gJiYgdGhpcy5zZGtUYWdTdWJzY3JpcHRpb25TZGsgPT09IHNkaykgcmV0dXJuIHRydWU7XHJcbiAgICBjb25zdCBkYXRhID0gc2RrPy5UYWc/LmRhdGE7XHJcbiAgICBpZiAodHlwZW9mIGRhdGE/LnN1YnNjcmliZSAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIHRoaXMuc3RvcE9ic2VydmluZ1Nka1RhZ3MoKTtcclxuICAgIGNvbnN0IG1hcmtQcmVzZW50ID0gKGlkOiBzdHJpbmcpID0+IHtcclxuICAgICAgdGhpcy5zZGtUYWdJZHMuYWRkKGlkKTtcclxuICAgICAgY29uc3Qgd2FpdGVycyA9IHRoaXMuc2RrVGFnV2FpdGVycy5nZXQoaWQpO1xyXG4gICAgICBpZiAod2FpdGVycykge1xyXG4gICAgICAgIHRoaXMuc2RrVGFnV2FpdGVycy5kZWxldGUoaWQpO1xyXG4gICAgICAgIHdhaXRlcnMuZm9yRWFjaCh3YWl0ZXIgPT4gd2FpdGVyKCkpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5zZGtUYWdTdWJzY3JpcHRpb25TZGsgPSBzZGs7XHJcbiAgICAgIHRoaXMuc2RrVGFnU3Vic2NyaXB0aW9uID0gZGF0YS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG9uQWRkZWQ6IChpZDogc3RyaW5nKSA9PiBtYXJrUHJlc2VudChpZCksXHJcbiAgICAgICAgb25SZW1vdmVkOiAoaWQ6IHN0cmluZykgPT4gdGhpcy5zZGtUYWdJZHMuZGVsZXRlKGlkKSxcclxuICAgICAgICBvbkNvbGxlY3Rpb25VcGRhdGVkOiAoY29sbGVjdGlvbjogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpZHM6IHN0cmluZ1tdID0gdHlwZW9mIGNvbGxlY3Rpb24/LmtleXMgPT09ICdmdW5jdGlvbidcclxuICAgICAgICAgICAgPyBBcnJheS5mcm9tKGNvbGxlY3Rpb24ua2V5cygpKSA6IE9iamVjdC5rZXlzKGNvbGxlY3Rpb24gfHwge30pO1xyXG4gICAgICAgICAgdGhpcy5zZGtUYWdJZHMgPSBuZXcgU2V0KGlkcyk7XHJcbiAgICAgICAgICBpZHMuZm9yRWFjaChpZCA9PiB0aGlzLnNka1RhZ1dhaXRlcnMuaGFzKGlkKSAmJiBtYXJrUHJlc2VudChpZCkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICB0aGlzLnNka1RhZ1N1YnNjcmlwdGlvblNkayA9IG51bGw7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RvcE9ic2VydmluZ1Nka1RhZ3MoKTogdm9pZCB7XHJcbiAgICB0cnkgeyB0aGlzLnNka1RhZ1N1YnNjcmlwdGlvbj8uY2FuY2VsPy4oKTsgfSBjYXRjaCB7IH1cclxuICAgIHRoaXMuc2RrVGFnU3Vic2NyaXB0aW9uID0gbnVsbDtcclxuICAgIHRoaXMuc2RrVGFnU3Vic2NyaXB0aW9uU2RrID0gbnVsbDtcclxuICAgIHRoaXMuc2RrVGFnSWRzLmNsZWFyKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBUYWcgbW9kdWxlIGV2ZXJ5IG5ldyB0YWcgbXVzdCBiZSBjcmVhdGVkIHRocm91Z2g6IHRoZSBzaGFyZWQgbGF5ZXJcclxuICAgKiB3aGVuIHRoZSBWaWV3IEFQSSBpcyBhdmFpbGFibGUsIHRoZSBnbG9iYWwgc2RrLlRhZyBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0VGFnQ3JlYXRpb25Nb2R1bGUoc2RrOiBhbnkpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgbGF5ZXIgPSBhd2FpdCB0aGlzLmVuc3VyZVNoYXJlZFRhZ0xheWVyKHNkayk7XHJcbiAgICByZXR1cm4gbGF5ZXI/LlRhZyB8fCBzZGs/LlRhZztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgKG9uY2UgcGVyIFNESyBzZXNzaW9uKSBhbmQgcmV0dXJucyB0aGUgc2hhcmVkIHRhZyBsYXllci5cclxuICAgKiBSZXNvbHZlcyB0byBudWxsIHdoZW4gdGhlIFZpZXcgQVBJIGlzIHVuYXZhaWxhYmxlLCBzbyBjYWxsZXJzIHRyYW5zcGFyZW50bHkgZmFsbFxyXG4gICAqIGJhY2sgdG8gdGhlIGdsb2JhbCBzZGsuVGFnLlxyXG4gICAqL1xyXG4gIGFzeW5jIGVuc3VyZVNoYXJlZFRhZ0xheWVyKHNkazogYW55KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGlmICh0aGlzLnNoYXJlZFRhZ0xheWVyKSByZXR1cm4gdGhpcy5zaGFyZWRUYWdMYXllcjtcclxuICAgIGlmICghc2RrPy5WaWV3Py5jcmVhdGVMYXllcikgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgaWYgKCF0aGlzLnNoYXJlZFRhZ0xheWVyUHJvbWlzZSkge1xyXG4gICAgICB0aGlzLnNoYXJlZFRhZ0xheWVyUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShcclxuICAgICAgICBzZGsuVmlldy5jcmVhdGVMYXllcihNYXR0ZXJwb3J0VGFnU2VydmljZS5TSEFSRURfVEFHX0xBWUVSX05BTUUpXHJcbiAgICAgIClcclxuICAgICAgICAudGhlbihhc3luYyAobGF5ZXI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zaGFyZWRUYWdMYXllciA9IGxheWVyO1xyXG4gICAgICAgICAgLy8gQSBmcmVzaGx5IGNyZWF0ZWQgbGF5ZXIgY2FuIGNvbWUgYmFjayB0b2dnbGVkIG9mZiwgd2hpY2ggaGlkZXMgaXRzIHRhZ3MuXHJcbiAgICAgICAgICBpZiAobGF5ZXIgJiYgbGF5ZXIudG9nZ2xlZCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgYXdhaXQgbGF5ZXIudG9nZ2xlKHRydWUpLmNhdGNoKCgpID0+IHsgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gbGF5ZXI7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuY2F0Y2goKGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgLy8gQWxsb3cgYSBsYXRlciByZXRyeSAoZS5nLiB0aGUgU0RLIHdhcyBub3QgZnVsbHkgcmVhZHkgeWV0KS5cclxuICAgICAgICAgIHRoaXMuc2hhcmVkVGFnTGF5ZXJQcm9taXNlID0gbnVsbDtcclxuICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIENvdWxkIG5vdCBjcmVhdGUgdGhlIHNoYXJlZCB0YWcgbGF5ZXInLCBlKTtcclxuICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLnNoYXJlZFRhZ0xheWVyUHJvbWlzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ha2VzIHN1cmUgdGhlIHNoYXJlZCBsYXllciBpcyBwYXJ0IG9mIGV2ZXJ5IHZpZXcgb2YgdGhlIHNwYWNlLCBEZWZ1cm5pc2hlZFxyXG4gICAqIGluY2x1ZGVkLiBUaGlzIGlzIHdoYXQgYWN0dWFsbHkgc2hhcmVzIHRoZSB0YWdzIGFjcm9zcyB2aWV3cywgYW5kIHRoZSByZWFzb24gdGhlXHJcbiAgICogbGF5ZXIgbXVzdCBub3QgYmUgYSBjb21tb24gb25lOiB0aGUgU0RLIG9ubHkgcGVyZm9ybXMgdGhlIGF0dGFjaG1lbnQgZm9yXHJcbiAgICogbm9uLWNvbW1vbiBsYXllcnMuIElkZW1wb3RlbnQsIHNvIGl0IGNhbiBydW4gb24gZXZlcnkgdmlldyBjb2xsZWN0aW9uIHVwZGF0ZS5cclxuICAgKi9cclxuICBhc3luYyBhdHRhY2hTaGFyZWRUYWdMYXllclRvVmlld3Moc2RrOiBhbnksIHZpZXdzOiBJdGVyYWJsZTxhbnk+KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBsYXllciA9IGF3YWl0IHRoaXMuZW5zdXJlU2hhcmVkVGFnTGF5ZXIoc2RrKTtcclxuICAgIGlmICghbGF5ZXIpIHJldHVybjtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHZpZXcgb2Ygdmlld3MpIHtcclxuICAgICAgaWYgKCF2aWV3Py5hZGRMYXllciB8fCB2aWV3Lmhhc0xheWVyPy4obGF5ZXIpKSBjb250aW51ZTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBhd2FpdCB2aWV3LmFkZExheWVyKGxheWVyKTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIENhbm5vdCBhZGQgdGhlIHNoYXJlZCB0YWcgbGF5ZXIgdG8gdmlldycsIHZpZXc/LmlkLCBlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkcyBhIHRhZyB0aHJvdWdoIHRoZSBzaGFyZWQgbGF5ZXIgc28gaXQgZXhpc3RzIGluIGV2ZXJ5IHZpZXcuIEZhbGxzIGJhY2tcclxuICAgKiB0byB0aGUgZ2xvYmFsIHNkay5UYWcgd2hlbiB0aGUgVmlldyBBUEkgaXMgdW5hdmFpbGFibGU7IHRoYXQgY2FsbCBpcyByYWNlZCBhZ2FpbnN0XHJcbiAgICogYSB0aW1lb3V0IGFzIGEgc2FmZXR5IG5ldCwgc2luY2UgaXQgbmV2ZXIgcmVzb2x2ZXMgd2hpbGUgYSBEZWZ1cm5pc2hlZCB2aWV3IGlzXHJcbiAgICogYWN0aXZlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgYWRkVGFnVG9TZGsoc2RrOiBhbnksIGRlc2NyaXB0b3I6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcclxuICAgIGNvbnN0IHNoYXJlZFRhZ01vZHVsZSA9IGF3YWl0IHRoaXMuZ2V0VGFnQ3JlYXRpb25Nb2R1bGUoc2RrKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBzaWRMaXN0ID0gKGF3YWl0IFByb21pc2UucmFjZShbXHJcbiAgICAgICAgc2hhcmVkVGFnTW9kdWxlLmFkZChkZXNjcmlwdG9yKSxcclxuICAgICAgICBuZXcgUHJvbWlzZTxuZXZlcj4oKF8sIHJlamVjdCkgPT5cclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG5ldyBFcnJvcignVGFnLmFkZCB0aW1lZCBvdXQnKSksIDQwMDApXHJcbiAgICAgICAgKSxcclxuICAgICAgXSkpIGFzIHN0cmluZ1tdO1xyXG4gICAgICBpZiAoc2lkTGlzdD8ubGVuZ3RoKSByZXR1cm4gc2lkTGlzdFswXTtcclxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuICAgICAgaWYgKGVycm9yPy5tZXNzYWdlPy5pbmNsdWRlcygnYWxyZWFkeSBpbiB1c2UnKSkgdGhyb3cgZXJyb3I7XHJcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIFRhZy5hZGQgZmFpbGVkL3RpbWVkIG91dCcsIGVycm9yPy5tZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKiBPcGVucyB0aGUgbW9zdCByZWNlbnRseSBjcmVhdGVkIHRhZyBpbiB0aGUgdmlld2VyLiAqL1xyXG4gIGFzeW5jIGdvVG9MYXN0VGFnKHNkazogYW55KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGlmICghc2RrIHx8IHRoaXMubWF0dGVydGFnSURzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG4gICAgY29uc3QgbGFzdFNpZCA9IHRoaXMubWF0dGVydGFnSURzW3RoaXMubWF0dGVydGFnSURzLmxlbmd0aCAtIDFdO1xyXG4gICAgcmV0dXJuIHRoaXMuZ29Ub1RhZyhzZGssIGxhc3RTaWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkcyBhIE1hdHRlcnRhZyB0byB0aGUgdmlld2VyLCBzZXJpYWxpemluZyBjYWxscyB0byBwcmV2ZW50IFNESyByYWNlIGNvbmRpdGlvbnMuXHJcbiAgICogUmV1c2VzIGV4aXN0aW5nIElEcyBpZiB0aGUgdGFnIGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgc2Vzc2lvbi5cclxuICAgKi9cclxuICBhc3luYyBhZGRNYXR0ZXJ0YWdUb1ZpZXdlcihzZGs6IGFueSwgbWF0dGVydGFnRGF0YTogTWF0dGVydGFnRGF0YSk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xyXG4gICAgaWYgKCFzZGspIHJldHVybiBudWxsO1xyXG5cclxuICAgIHRoaXMudGFnQWRkUXVldWUgPSB0aGlzLnRhZ0FkZFF1ZXVlXHJcbiAgICAgIC50aGVuKGFzeW5jICgpID0+IHtcclxuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gbWF0dGVydGFnRGF0YS5nZXRNYXR0ZXJ0YWdEZXNjcmlwdG9yKClbMF07XHJcbiAgICAgICAgY29uc3QgZXhpc3RpbmdJZCA9IGRlc2NyaXB0b3I/LmlkIHx8IG51bGw7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCBzaWQgPSBhd2FpdCB0aGlzLmFkZFRhZ1RvU2RrKHNkaywgZGVzY3JpcHRvcik7XHJcbiAgICAgICAgICBpZiAoc2lkKSB7XHJcbiAgICAgICAgICAgIG1hdHRlcnRhZ0RhdGEuc2V0TWF0dGVycG9ydFNpZChzaWQpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMubWF0dGVydGFnSURzLmluY2x1ZGVzKHNpZCkpIHtcclxuICAgICAgICAgICAgICB0aGlzLm1hdHRlcnRhZ0lEcy5wdXNoKHNpZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3Muc2V0KHNpZCwgbWF0dGVydGFnRGF0YSk7XHJcbiAgICAgICAgICAgIHJldHVybiBzaWQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignW01hdHRlcnBvcnRUYWdTZXJ2aWNlXSBUYWcuYWRkIHJldHVybmVkIG5vIHNpZCcsIGRlc2NyaXB0b3IpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuICAgICAgICAgIGlmIChlcnJvcj8ubWVzc2FnZT8uaW5jbHVkZXMoJ2FscmVhZHkgaW4gdXNlJykgJiYgZXhpc3RpbmdJZCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZGljdGlvbm5hcnlUYWdzLmhhcyhleGlzdGluZ0lkKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMubWF0dGVydGFnSURzLnB1c2goZXhpc3RpbmdJZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3Muc2V0KGV4aXN0aW5nSWQsIG1hdHRlcnRhZ0RhdGEpO1xyXG4gICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdJZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIGFkZE1hdHRlcnRhZ1RvVmlld2VyIGZhaWxlZCcsIGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIHRhZ0FkZFF1ZXVlIHJlamVjdGVkJywgZSk7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB0aGlzLnRhZ0FkZFF1ZXVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGFkZCBhbmQgY29uZmlndXJlIGEgTWF0dGVydGFnIHdpdGggaWNvbiwgb3BhY2l0eSwgYW5kIEhUTUwgY29udGVudC5cclxuICAgKiBIYW5kbGVzIGV4aXN0aW5nIHRhZ3MgZ3JhY2VmdWxseSBhbmQgcXVldWVzIG9wZXJhdGlvbnMgdG8gYXZvaWQgU0RLIGNvbmZsaWN0cy5cclxuICAgKi9cclxuICBhc3luYyBfZG9BZGRNYXR0ZXJ0YWcoXHJcbiAgICBzZGs6IGFueSxcclxuICAgIG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEsXHJcbiAgICBzZXRUYWdJY29uQW5kT3BhY2l0eTogKHNpZDogc3RyaW5nLCBtdDogTWF0dGVydGFnRGF0YSkgPT4gUHJvbWlzZTx2b2lkPixcclxuICAgIGluamVjdEh0bWxJblRhZzogKHR5cGU6IFBvaVR5cGUsIG9iajogRGJPYmplY3RUeXBlLCBzaWQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxyXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gbWF0dGVydGFnRGF0YS5nZXRNYXR0ZXJ0YWdEZXNjcmlwdG9yKCk7XHJcbiAgICAvL2NvbnNvbGUubG9nKCdkZXNjcmlwdG9yJywgZGVzY3JpcHRvcik7XHJcbiAgICBjb25zdCBzaWQgPSBkZXNjcmlwdG9yWzBdWydpZCddO1xyXG5cclxuICAgIGlmIChzaWQgJiYgdGhpcy5kaWN0aW9ubmFyeVRhZ3MuaGFzKHNpZCkpIHtcclxuICAgICAgYXdhaXQgc2V0VGFnSWNvbkFuZE9wYWNpdHkoc2lkLCBtYXR0ZXJ0YWdEYXRhKTtcclxuICAgICAgYXdhaXQgaW5qZWN0SHRtbEluVGFnKG1hdHRlcnRhZ0RhdGEuZ2V0VHlwZSgpLCBtYXR0ZXJ0YWdEYXRhLmdldE9iamVjdCgpLCBzaWQpO1xyXG4gICAgICByZXR1cm4gc2lkO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudGFnQWRkUXVldWUgPSB0aGlzLnRhZ0FkZFF1ZXVlLnRoZW4oYXN5bmMgKCkgPT4ge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHRhZ01vZHVsZSA9IGF3YWl0IHRoaXMuZ2V0VGFnQ3JlYXRpb25Nb2R1bGUoc2RrKTtcclxuICAgICAgICBjb25zdCBbY3JlYXRlZFNpZF0gPSBhd2FpdCB0YWdNb2R1bGUuYWRkKC4uLmRlc2NyaXB0b3IpO1xyXG5cclxuICAgICAgICB0aGlzLm1hdHRlcnRhZ0lEcy5wdXNoKGNyZWF0ZWRTaWQpO1xyXG4gICAgICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLnNldChjcmVhdGVkU2lkLCBtYXR0ZXJ0YWdEYXRhKTtcclxuXHJcbiAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yVGFnSW5TZGsoc2RrLCBjcmVhdGVkU2lkKTtcclxuICAgICAgICBhd2FpdCBzZXRUYWdJY29uQW5kT3BhY2l0eShjcmVhdGVkU2lkLCBtYXR0ZXJ0YWdEYXRhKTtcclxuXHJcbiAgICAgICAgaW5qZWN0SHRtbEluVGFnKG1hdHRlcnRhZ0RhdGEuZ2V0VHlwZSgpLCBtYXR0ZXJ0YWdEYXRhLmdldE9iamVjdCgpLCBjcmVhdGVkU2lkKS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0hUTUwgaW5qZWN0aW9uIGZhaWxlZCBmb3InLCBjcmVhdGVkU2lkLCBlcnIpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gY3JlYXRlZFNpZDtcclxuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgICAgaWYgKGU/Lm1lc3NhZ2U/LmluY2x1ZGVzKCdhbHJlYWR5IGluIHVzZScpICYmIHNpZCkge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmRpY3Rpb25uYXJ5VGFncy5oYXMoc2lkKSkge1xyXG4gICAgICAgICAgICB0aGlzLm1hdHRlcnRhZ0lEcy5wdXNoKHNpZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLnNldChzaWQsIG1hdHRlcnRhZ0RhdGEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYXdhaXQgc2V0VGFnSWNvbkFuZE9wYWNpdHkoc2lkLCBtYXR0ZXJ0YWdEYXRhKTtcclxuICAgICAgICAgIGF3YWl0IGluamVjdEh0bWxJblRhZyhtYXR0ZXJ0YWdEYXRhLmdldFR5cGUoKSwgbWF0dGVydGFnRGF0YS5nZXRPYmplY3QoKSwgc2lkKTtcclxuICAgICAgICAgIHJldHVybiBzaWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IGU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB0aGlzLnRhZ0FkZFF1ZXVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGlzdGFuY2UocDE6IGFueSwgcDI6IGFueSk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KHAyLnggLSBwMS54LCAyKSArIE1hdGgucG93KHAyLnkgLSBwMS55LCAyKSArIE1hdGgucG93KHAyLnogLSBwMS56LCAyKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVja3MgaWYgYSB0YWcgaXMgd2l0aGluIHRoZSBib3VuZGluZyBib3ggb2YgYW55IGFjdGl2ZSByb29tIChhZGRpbmcgYSBzbGlnaHQgbWFyZ2luIHRvIGFjY291bnQgZm9yIHdhbGwtbW91bnRlZCB0YWdzKS5cclxuICAgKiBJZiB0aGVyZSBhcmUgbm8gYWN0aXZlIHJvb21zIChlLmcuLCBoYWxsd2F5KSwgZmFsbHMgYmFjayB0byByZXR1cm5pbmcgdHJ1ZS5cclxuICAgKi9cclxuICBpc1RhZ0luUm9vbXMobWF0dGVydGFnRGF0YTogTWF0dGVydGFnRGF0YSwgcm9vbXM6IGFueVtdKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXJvb21zIHx8IHJvb21zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGNvbnN0IHRhZ1BvcyA9IG1hdHRlcnRhZ0RhdGEuZ2V0UG9zaXRpb24oKTtcclxuICAgIGNvbnN0IG1hcmdpbiA9IDEuNTtcclxuXHJcbiAgICByZXR1cm4gcm9vbXMuc29tZSgocm9vbSkgPT4ge1xyXG4gICAgICBpZiAoIXJvb20uYm91bmRzKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGNvbnN0IHsgbWluLCBtYXggfSA9IHJvb20uYm91bmRzO1xyXG5cclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICB0YWdQb3MueCA+PSBtaW4ueCAtIG1hcmdpbiAmJiB0YWdQb3MueCA8PSBtYXgueCArIG1hcmdpbiAmJlxyXG4gICAgICAgIHRhZ1Bvcy55ID49IG1pbi55IC0gbWFyZ2luICYmIHRhZ1Bvcy55IDw9IG1heC55ICsgbWFyZ2luICYmXHJcbiAgICAgICAgdGFnUG9zLnogPj0gbWluLnogLSBtYXJnaW4gJiYgdGFnUG9zLnogPD0gbWF4LnogKyBtYXJnaW5cclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJldHVybnMgdGhlIElEIG9mIHRoZSBtb3N0IHJlY2VudGx5IGFkZGVkIHRhZy4gKi9cclxuICBnZXRMYXN0VGFnKCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgaWYgKHRoaXMubWF0dGVydGFnSURzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XHJcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJ0YWdJRHNbdGhpcy5tYXR0ZXJ0YWdJRHMubGVuZ3RoIC0gMV07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIHRoZSB2aXNpYmlsaXR5IChvcGFjaXR5KSBvZiBhbGwgdGFncyBiYXNlZCBvbiB0aGUgY3VycmVudCBjYW1lcmEgbW9kZSxcclxuICAgKiBmbG9vciBhbmQgcm9vbSBjb250ZXh0LiBNdXN0IGJlIGNhbGxlZCBhZnRlciBlYWNoIHN3ZWVwLCBmbG9vciBvciBtb2RlIGNoYW5nZS5cclxuICAgKlxyXG4gICAqIFJ1bGVzOlxyXG4gICAqICAtIERPTExIT1VTRSAvIEZMT09SUExBTiDihpIgYWxsIHRhZ3MgaGlkZGVuIChvcGFjaXR5IDApLlxyXG4gICAqICAtIElOU0lERSDihpIgb25seSB0YWdzIHdob3NlIHN3ZWVwIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgZmxvb3IgYXJlIHNob3duO1xyXG4gICAqICAgIHByb3hpbWl0eS1iYXNlZCBvcGFjaXR5IGlzIGFwcGxpZWQgdmlhIGNvbXB1dGVUYWdPcGFjaXR5KCkuXHJcbiAgICogICAgVGFncyBvbiBvdGhlciBmbG9vcnMgYXJlIGhpZGRlbiAob3BhY2l0eSAwKS5cclxuICAgKiAgLSBUUkFOU0lUSU9OSU5HIOKGkiBubyBjaGFuZ2UgKHNraXAgdXBkYXRlIHRvIGF2b2lkIGZsaWNrZXJpbmcpLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHNkayAgICAgICAgICBNYXR0ZXJwb3J0IFNESyBpbnN0YW5jZS5cclxuICAgKiBAcGFyYW0gcG9zZUNhbWVyYSAgIEN1cnJlbnQgY2FtZXJhIHBvc2UuXHJcbiAgICogQHBhcmFtIHN3ZWVwQ29sbGVjdGlvbiAgRnVsbCBjb2xsZWN0aW9uIG9mIHN3ZWVwcy5cclxuICAgKiBAcGFyYW0gY3VycmVudENhbWVyYU1vZGUgIEN1cnJlbnQgY2FtZXJhIG1vZGUuXHJcbiAgICogQHBhcmFtIG1hdHRlcnRhZ1RvRm9sbG93ICBJRCBvZiB0aGUgY3Vyc29yIHRhZyAobmV2ZXIgdG91Y2hlZCkuXHJcbiAgICovXHJcbiAgYXN5bmMgdXBkYXRlVGFnc1Zpc2liaWxpdHlGb3JDb250ZXh0KFxyXG4gICAgc2RrOiBhbnksXHJcbiAgICBzd2VlcENvbGxlY3Rpb246IGFueSxcclxuICAgIGN1cnJlbnRDYW1lcmFNb2RlOiBDYW1lcmFNb2RlLFxyXG4gICAgbWF0dGVydGFnVG9Gb2xsb3c6IHN0cmluZyB8IG51bGwsXHJcbiAgICBjdXJyZW50Rmxvb3JTZXF1ZW5jZTogbnVtYmVyIHwgbnVsbCA9IG51bGwsXHJcbiAgICBjdXJyZW50Um9vbXM6IGFueVtdID0gW11cclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghc2RrIHx8IHRoaXMuZGljdGlvbm5hcnlUYWdzLnNpemUgPT09IDApIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBpc0ludGVyaW9yTW9kZSA9IGN1cnJlbnRDYW1lcmFNb2RlID09PSBDYW1lcmFNb2RlLklOU0lERTtcclxuICAgIGNvbnN0IGN1cnJlbnRGbG9vcklkID0gY3VycmVudEZsb29yU2VxdWVuY2UgIT09IG51bGwgPyBjdXJyZW50Rmxvb3JTZXF1ZW5jZS50b1N0cmluZygpIDogbnVsbDtcclxuICAgIGNvbnN0IHByb21pc2VzID0gW107XHJcblxyXG4gICAgZm9yIChjb25zdCBbdGFnSWQsIG1hdHRlcnRhZ0RhdGFdIG9mIHRoaXMuZGljdGlvbm5hcnlUYWdzKSB7XHJcbiAgICAgIGlmICh0YWdJZCA9PT0gbWF0dGVydGFnVG9Gb2xsb3cpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgY29uc3QgdGFnRmxvb3JJZCA9IHRoaXMuZ2V0Rmxvb3JJZEZvclRhZyhtYXR0ZXJ0YWdEYXRhLCBzd2VlcENvbGxlY3Rpb24pO1xyXG4gICAgICBjb25zdCBpc09uQ3VycmVudEZsb29yID0gIXRhZ0Zsb29ySWQgfHwgIWN1cnJlbnRGbG9vcklkIHx8IHRhZ0Zsb29ySWQgPT09IGN1cnJlbnRGbG9vcklkO1xyXG5cclxuICAgICAgbGV0IHRhcmdldE9wYWNpdHkgPSAwO1xyXG4gICAgICBsZXQgc2hvdWxkQmVFbmFibGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAvLyBDYWxjdWxhdGlvbiBvZiBvcGFjaXR5IGFuZCBlbmFibGUgc3RhdHVzXHJcbiAgICAgIGlmIChpc09uQ3VycmVudEZsb29yKSB7XHJcbiAgICAgICAgaWYgKCFpc0ludGVyaW9yTW9kZSkge1xyXG4gICAgICAgICAgdGFyZ2V0T3BhY2l0eSA9IDE7XHJcbiAgICAgICAgICBzaG91bGRCZUVuYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0YXJnZXRPcGFjaXR5ID0gMC45O1xyXG4gICAgICAgICAgc2hvdWxkQmVFbmFibGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gQXBwbHkgY2hhbmdlc1xyXG5cclxuICAgICAgLy8gVG9vbHRpcCBhbmQgY2xpY2sgbWFuYWdlbWVudFxyXG4gICAgICBjb25zdCB0YWdNb2R1bGUgPSB0aGlzLmdldFRhZ01vZHVsZShzZGssIHRhZ0lkKTtcclxuICAgICAgY29uc3QgbGFzdEVuYWJsZWQgPSB0aGlzLnRhZ3NDdXJyZW50RW5hYmxlZC5nZXQodGFnSWQpO1xyXG4gICAgICBpZiAobGFzdEVuYWJsZWQgIT09IHNob3VsZEJlRW5hYmxlZCkge1xyXG4gICAgICAgIHRoaXMudGFnc0N1cnJlbnRFbmFibGVkLnNldCh0YWdJZCwgc2hvdWxkQmVFbmFibGVkKTtcclxuICAgICAgICBwcm9taXNlcy5wdXNoKHRhZ01vZHVsZS5hbGxvd0FjdGlvbih0YWdJZCwge1xyXG4gICAgICAgICAgb3BlbmluZzogc2hvdWxkQmVFbmFibGVkLFxyXG4gICAgICAgICAgbmF2aWdhdGluZzogc2hvdWxkQmVFbmFibGVkLFxyXG4gICAgICAgICAgZG9ja2luZzogZmFsc2VcclxuICAgICAgICB9KS5jYXRjaCgoKSA9PiB7IH0pKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBPcGFjaXR5IG1hbmFnZW1lbnRcclxuICAgICAgY29uc3QgbGFzdE9wYWNpdHkgPSB0aGlzLnRhZ3NDdXJyZW50T3BhY2l0eS5nZXQodGFnSWQpID8/IC0xO1xyXG4gICAgICBpZiAoTWF0aC5hYnMobGFzdE9wYWNpdHkgLSB0YXJnZXRPcGFjaXR5KSA+IDAuMDUpIHtcclxuICAgICAgICB0aGlzLnRhZ3NDdXJyZW50T3BhY2l0eS5zZXQodGFnSWQsIHRhcmdldE9wYWNpdHkpO1xyXG4gICAgICAgIHByb21pc2VzLnB1c2godGFnTW9kdWxlLmVkaXRPcGFjaXR5KHRhZ0lkLCB0YXJnZXRPcGFjaXR5KS5jYXRjaCgoKSA9PiB7IH0pKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERyb3BzIHRoZSBtZW1vaXplZCBvcGFjaXR5L2VuYWJsZWQgc3RhdGUgc28gdGhlIG5leHQgdmlzaWJpbGl0eSBwYXNzIHJlLWFwcGxpZXMgaXRcclxuICAgKiB0byBldmVyeSB0YWcuIE5lZWRlZCBhZnRlciBhIHZpZXcgc3dpdGNoIChmdXJuaXNoZWQgPC0+IGRlZnVybmlzaGVkKTogdGhlIFNES1xyXG4gICAqIHJlLXJlbmRlcnMgdGhlIHNoYXJlZCBsYXllcidzIHRhZ3MgYW5kIHRoZSBjYWNoZWQgdmFsdWVzIHdvdWxkIG90aGVyd2lzZSBtYWtlXHJcbiAgICogdXBkYXRlVGFnc1Zpc2liaWxpdHlGb3JDb250ZXh0KCkgc2tpcCB0aGVtLCBsZWF2aW5nIHRhZ3Mgc3R1Y2sgaW52aXNpYmxlLlxyXG4gICAqL1xyXG4gIHJlc2V0VmlzaWJpbGl0eUNhY2hlKCk6IHZvaWQge1xyXG4gICAgdGhpcy50YWdzQ3VycmVudE9wYWNpdHkuY2xlYXIoKTtcclxuICAgIHRoaXMudGFnc0N1cnJlbnRFbmFibGVkLmNsZWFyKCk7XHJcbiAgICB0aGlzLnRhZ3NDdXJyZW50SWNvbi5jbGVhcigpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJlbW92ZXMgYSBzcGVjaWZpYyB0YWcgZnJvbSB0aGUgdmlld2VyIGFuZCBsb2NhbCBkaWN0aW9uYXJpZXMuICovXHJcbiAgYXN5bmMgZGVsZXRlTWF0dGVydGFnRnJvbUlkKHNkazogYW55LCBtYXR0ZXJ0YWdJRDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAoc2RrKSBhd2FpdCB0aGlzLmdldFRhZ01vZHVsZShzZGssIG1hdHRlcnRhZ0lEKS5yZW1vdmUobWF0dGVydGFnSUQpO1xyXG4gICAgICB0aGlzLmRpY3Rpb25uYXJ5VGFncy5kZWxldGUobWF0dGVydGFnSUQpO1xyXG4gICAgICB0aGlzLnRhZ3NDdXJyZW50SWNvbi5kZWxldGUobWF0dGVydGFnSUQpO1xyXG4gICAgICB0aGlzLnRhZ3NDdXJyZW50T3BhY2l0eS5kZWxldGUobWF0dGVydGFnSUQpO1xyXG4gICAgICB0aGlzLnRhZ3NDdXJyZW50RW5hYmxlZC5kZWxldGUobWF0dGVydGFnSUQpO1xyXG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMubWF0dGVydGFnSURzLmluZGV4T2YobWF0dGVydGFnSUQpO1xyXG4gICAgICBpZiAoaW5kZXggPiAtMSkgdGhpcy5tYXR0ZXJ0YWdJRHMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignQ2Fubm90IGRlbGV0ZSB0YWcnLCBtYXR0ZXJ0YWdJRCwgZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogUmVtb3ZlcyB0aGUgbGFzdCBhZGRlZCB0YWcgZnJvbSB0aGUgdmlld2VyLiAqL1xyXG4gIGFzeW5jIGRlbGV0ZUxhc3RNYXR0ZXJ0YWcoc2RrOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGxhc3RTaWQgPSB0aGlzLmdldExhc3RUYWcoKTtcclxuICAgIGlmIChsYXN0U2lkKSBhd2FpdCB0aGlzLmRlbGV0ZU1hdHRlcnRhZ0Zyb21JZChzZGssIGxhc3RTaWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqIENsZWFycyBhbGwgdGFncyBmcm9tIHRoZSB2aWV3ZXIgYW5kIHJlc2V0cyBsb2NhbCBzdGF0ZS4gKi9cclxuICBhc3luYyBhY3Rpb25fZGVsZXRlX2FsbF9tYXR0ZXJ0YWdzKHNkazogYW55KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoc2RrKSB7XHJcbiAgICAgIGNvbnN0IHNpZHNUb1JlbW92ZSA9IFsuLi50aGlzLm1hdHRlcnRhZ0lEc107XHJcbiAgICAgIGZvciAoY29uc3Qgc2lkIG9mIHNpZHNUb1JlbW92ZSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmdldFRhZ01vZHVsZShzZGssIHNpZCkucmVtb3ZlKHNpZCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuY2xlYXIoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYW5kIGNvbmZpZ3VyZXMgYSBNYXR0ZXJ0YWcgZnJvbSBhIFBPSSwgaGFuZGxpbmcgY29vcmRpbmF0ZXMsIG5vcm1hbHMsIGFuZCBzd2VlcCBJRC5cclxuICAgKiBTa2lwcyBjcmVhdGlvbiBpZiBhIHRhZyBmb3IgdGhlIG9iamVjdCBhbHJlYWR5IGV4aXN0cy5cclxuICAgKi9cclxuICBhc3luYyBjcmVhdGVNYXR0ZXJ0YWdGcm9tUE9JKFxyXG4gICAgc2RrOiBhbnksXHJcbiAgICB0YWdUeXBlOiBQb2lUeXBlLFxyXG4gICAgb2JqZWN0OiBEYk9iamVjdFR5cGUsXHJcbiAgICBwb2k6IFBPSSxcclxuICAgIGdldFRhZ0Zyb21FbGVtZW50SWQ6IChpZDogc3RyaW5nKSA9PiB7IHRhZzogc3RyaW5nOyBzd2VlcDogc3RyaW5nIH0sXHJcbiAgICBzZXRUYWdJY29uQW5kT3BhY2l0eTogKHNpZDogc3RyaW5nLCBtdDogTWF0dGVydGFnRGF0YSkgPT4gUHJvbWlzZTx2b2lkPixcclxuICAgIGluamVjdEh0bWxJblRhZzogKHR5cGU6IFBvaVR5cGUsIG9iajogRGJPYmplY3RUeXBlLCBzaWQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxyXG4gICk6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCB7IHRhZyB9ID0gZ2V0VGFnRnJvbUVsZW1lbnRJZChvYmplY3QuaWQpO1xyXG4gICAgaWYgKHRhZykgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEgPSBuZXcgTWF0dGVydGFnRGF0YSh0YWdUeXBlKTtcclxuICAgIG1hdHRlcnRhZ0RhdGEuc2V0T2JqZWN0KG9iamVjdCwgdGFnVHlwZSk7XHJcblxyXG4gICAgaWYgKHBvaS5jb29yZGluYXRlKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgbWF0dGVydGFnRGF0YS5zZXRQb3NpdGlvbihKU09OLnBhcnNlKHBvaS5jb29yZGluYXRlKSk7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignRXJyb3IgcGFyc2luZyBQT0kgY29vcmRpbmF0ZXMnLCBwb2kuY29vcmRpbmF0ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAocG9pLm1ldGFkYXRhKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgdGFnTWV0YWRhdGEgPSBKU09OLnBhcnNlKHBvaS5tZXRhZGF0YSk7XHJcbiAgICAgICAgbWF0dGVydGFnRGF0YS5zZXROb3JtYWwodGFnTWV0YWRhdGEubm9ybWFsIHx8IHsgeDogMCwgeTogLTAuMTUsIHo6IDAgfSk7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBtYXR0ZXJ0YWdEYXRhLnNldE5vcm1hbCh7IHg6IDAsIHk6IC0wLjE1LCB6OiAwIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHBvaS5tYXR0ZXJwb3J0U3dlZXBJRCkge1xyXG4gICAgICBtYXR0ZXJ0YWdEYXRhLnNldFN3ZWVwSUQocG9pLm1hdHRlcnBvcnRTd2VlcElEKTtcclxuICAgIH1cclxuICAgIG1hdHRlcnRhZ0RhdGEuc2V0UG9pKHBvaSk7XHJcblxyXG4gICAgY29uc3QgY3JlYXRlZFRhZ0lEID0gYXdhaXQgdGhpcy5hZGRNYXR0ZXJ0YWdUb1ZpZXdlcihzZGssIG1hdHRlcnRhZ0RhdGEpO1xyXG5cclxuICAgIGlmIChjcmVhdGVkVGFnSUQgJiYgc2RrKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMud2FpdEZvclRhZ0luU2RrKHNkaywgY3JlYXRlZFRhZ0lEKTtcclxuICAgICAgYXdhaXQgc2V0VGFnSWNvbkFuZE9wYWNpdHkoY3JlYXRlZFRhZ0lELCBtYXR0ZXJ0YWdEYXRhKTtcclxuICAgICAgaW5qZWN0SHRtbEluVGFnKHRhZ1R5cGUsIG9iamVjdCwgY3JlYXRlZFRhZ0lEKS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdIVE1MIGluamVjdGlvbiBmYWlsZWQgZm9yJywgY3JlYXRlZFRhZ0lELCBlcnIpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY3JlYXRlZFRhZ0lEO1xyXG4gIH1cclxuXHJcbiAgLyoqIFVwZGF0ZXMgdGhlIGljb24sIG9wYWNpdHksIGFuZCBIVE1MIGNvbnRlbnQgb2YgYW4gZXhpc3RpbmcgdGFnLiAqL1xyXG4gIGFzeW5jIHVwZGF0ZU1hdHRlclRhZ0NvbnRlbnRGb3JUYWdJRChcclxuICAgIHNkazogYW55LFxyXG4gICAgbWF0dGVydGFnSUQ6IHN0cmluZyxcclxuICAgIG9iamVjdDogRGJPYmplY3RUeXBlLFxyXG4gICAgcG9pVHlwZTogUG9pVHlwZSxcclxuICAgIHNldFRhZ0ljb25BbmRPcGFjaXR5OiAoc2lkOiBzdHJpbmcsIG10OiBNYXR0ZXJ0YWdEYXRhKSA9PiBQcm9taXNlPHZvaWQ+LFxyXG4gICAgaW5qZWN0SHRtbEluVGFnOiAodHlwZTogUG9pVHlwZSwgb2JqOiBEYk9iamVjdFR5cGUsIHNpZDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XHJcbiAgKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IG1hdHRlcnRhZ0RhdGEgPSB0aGlzLmRpY3Rpb25uYXJ5VGFncy5nZXQobWF0dGVydGFnSUQpO1xyXG4gICAgaWYgKCFtYXR0ZXJ0YWdEYXRhKSByZXR1cm47XHJcblxyXG4gICAgaWYgKG9iamVjdCkge1xyXG4gICAgICBtYXR0ZXJ0YWdEYXRhLnNldE9iamVjdChvYmplY3QsIHBvaVR5cGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGF3YWl0IHNldFRhZ0ljb25BbmRPcGFjaXR5KG1hdHRlcnRhZ0lELCBtYXR0ZXJ0YWdEYXRhKTtcclxuICAgIGF3YWl0IGluamVjdEh0bWxJblRhZyhwb2lUeXBlLCBvYmplY3QsIG1hdHRlcnRhZ0lEKTtcclxuICB9XHJcblxyXG4gIC8qKiBSZWdpc3RlcnMgYSBjdXN0b20gdGV4dHVyZSBhbmQgYXBwbGllcyBpdCB0byBhIHRhZywgb3B0aW9uYWxseSBhZGp1c3Rpbmcgb3BhY2l0eS4gKi9cclxuICBhc3luYyBhZGROZXdJY29uQW5kU2V0Rm9yVGFnKFxyXG4gICAgc2RrOiBhbnksXHJcbiAgICBtYXR0ZXJ0YWdJRDogc3RyaW5nLFxyXG4gICAgaWNvblBhdGg6IHN0cmluZyxcclxuICAgIGFwcGx5T3BhY2l0eTogYm9vbGVhbixcclxuICAgIG9wYWNpdHk6IG51bWJlclxyXG4gICkge1xyXG4gICAgaWYgKCFzZGspIHJldHVybjtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGljb25OYW1lID0gYGN1c3RvbS1pY29uLSR7bWF0dGVydGFnSUR9YDtcclxuICAgICAgY29uc3QgdGFnTW9kdWxlID0gdGhpcy5nZXRUYWdNb2R1bGUoc2RrLCBtYXR0ZXJ0YWdJRCk7XHJcbiAgICAgIGF3YWl0IHNkay5Bc3NldC5yZWdpc3RlclRleHR1cmUoaWNvbk5hbWUsIGljb25QYXRoKTtcclxuICAgICAgYXdhaXQgdGFnTW9kdWxlLmVkaXRJY29uKG1hdHRlcnRhZ0lELCBpY29uTmFtZSk7XHJcbiAgICAgIHRoaXMudGFnc0N1cnJlbnRJY29uLnNldChtYXR0ZXJ0YWdJRCwgaWNvbk5hbWUpO1xyXG5cclxuICAgICAgaWYgKGFwcGx5T3BhY2l0eSkge1xyXG4gICAgICAgIGF3YWl0IHRhZ01vZHVsZS5lZGl0T3BhY2l0eShtYXR0ZXJ0YWdJRCwgb3BhY2l0eSk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdFcnJvciBzZXR0aW5nIGN1c3RvbSBpY29uIG9yIG9wYWNpdHknLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogRmluZHMgdGhlIHRhZyBJRCBhbmQgc3dlZXAgSUQgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgZWxlbWVudCBJRC4gKi9cclxuICBnZXRUYWdGcm9tRWxlbWVudElkKGVsZW1lbnRJRDogc3RyaW5nLCBzd2VlcHM6IHN0cmluZ1tdIHwgbnVsbCk6IHsgdGFnOiBzdHJpbmcgfCBudWxsOyBzd2VlcDogc3RyaW5nIHwgbnVsbCB9IHtcclxuICAgIGxldCB0YWdJRCA9IG51bGw7XHJcbiAgICBsZXQgc3dlZXBJRCA9IG51bGw7XHJcbiAgICBmb3IgKGxldCBbbWF0dGVydGFnSUQsIG1hdHRlcnRhZ0RhdGFdIG9mIHRoaXMuZGljdGlvbm5hcnlUYWdzKSB7XHJcbiAgICAgIGlmIChtYXR0ZXJ0YWdEYXRhLmVsZW1lbnRJRCA9PT0gZWxlbWVudElEKSB7XHJcbiAgICAgICAgdGFnSUQgPSBtYXR0ZXJ0YWdJRDtcclxuICAgICAgICBjb25zdCBzd2VlcCA9IG1hdHRlcnRhZ0RhdGEuZ2V0U3dlZXBJRCgpO1xyXG4gICAgICAgIGlmIChzd2VlcCAmJiBzd2VlcHMpIHtcclxuICAgICAgICAgIC8vIHN3ZWVwIGlzIGEgdXVpZDsgc3dlZXBzIGFycmF5IGNvbnRhaW5zIHNpZHMg4oCTIGNoZWNrIGJvdGggZm9ybWF0c1xyXG4gICAgICAgICAgY29uc3QgcmVzb2x2ZWRTaWQgPSB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnJlc29sdmVTd2VlcFNpZChzd2VlcCk7XHJcbiAgICAgICAgICBpZiAoc3dlZXBzLmluY2x1ZGVzKHN3ZWVwKSB8fCBzd2VlcHMuaW5jbHVkZXMocmVzb2x2ZWRTaWQpKSB7XHJcbiAgICAgICAgICAgIHN3ZWVwSUQgPSBzd2VlcDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB7IHRhZzogdGFnSUQsIHN3ZWVwOiBzd2VlcElEIH07XHJcbiAgfVxyXG5cclxuICAvKiogUmV0cmlldmVzIHRoZSBmbG9vciBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCBhIHRhZyBiYXNlZCBvbiBpdHMgc3dlZXAgZGF0YS5cclxuICAgKiAgSGFuZGxlcyBib3RoIHRoZSBvYmplY3QgZm9ybSAoeyBmbG9vckluZm86IHsgaWQsIHNlcXVlbmNlIH0sIGZsb29yOiB7IGlkIH0gfSlcclxuICAgKiAgYW5kIHRoZSBwcmltaXRpdmUgZm9ybSAoZmxvb3I6IG51bWJlcikgdXNlZCBieSBNYXR0ZXJwb3J0IFNESyB2My5cclxuICAgKi9cclxuICBnZXRGbG9vcklkRm9yVGFnKG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEsIHN3ZWVwQ29sbGVjdGlvbjogYW55KTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBjb25zdCBzd2VlcElkID0gbWF0dGVydGFnRGF0YS5nZXRTd2VlcElEKCk7XHJcbiAgICBpZiAoIXN3ZWVwSWQgfHwgIXN3ZWVwQ29sbGVjdGlvbikgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgY29uc3Qgc3dlZXBEYXRhID0gc3dlZXBDb2xsZWN0aW9uW3N3ZWVwSWRdO1xyXG4gICAgaWYgKCFzd2VlcERhdGEpIHJldHVybiBudWxsO1xyXG5cclxuICAgIC8vIFNESyB2Mzogc3dlZXAuZmxvb3IgaXMgYSBwcmltaXRpdmUgbnVtYmVyICh0aGUgc2VxdWVuY2UgaW5kZXgpXHJcbiAgICBpZiAodHlwZW9mIHN3ZWVwRGF0YS5mbG9vciA9PT0gJ251bWJlcicpIHtcclxuICAgICAgcmV0dXJuIHN3ZWVwRGF0YS5mbG9vci50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE9sZGVyIC8gZXh0ZW5kZWQgZm9ybWF0c1xyXG4gICAgcmV0dXJuIHN3ZWVwRGF0YT8uZmxvb3JJbmZvPy5pZFxyXG4gICAgICA/PyBzd2VlcERhdGE/LmZsb29ySW5mbz8uc2VxdWVuY2U/LnRvU3RyaW5nKClcclxuICAgICAgPz8gc3dlZXBEYXRhPy5mbG9vcklkXHJcbiAgICAgID8/IHN3ZWVwRGF0YT8uZmxvb3I/LmlkXHJcbiAgICAgID8/IHN3ZWVwRGF0YT8uZmxvb3I/LnNlcXVlbmNlPy50b1N0cmluZygpXHJcbiAgICAgID8/IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbmplY3RzIGN1c3RvbSBIVE1MIG9yIGZhbGxiYWNrIGJpbGxib2FyZCBtZWRpYSBpbnRvIGEgTWF0dGVydGFnIHNhbmRib3guXHJcbiAgICogQXR0YWNoZXMgZXZlbnQgbGlzdGVuZXJzIGZvciBpbnRlcmFjdGl2ZSBlbGVtZW50cyB3aXRoaW4gdGhlIHRhZy5cclxuICAgKi9cclxuICBhc3luYyBpbmplY3RIdG1sSW5UYWcoc2RrOiBhbnksIHRhZ1R5cGU6IFBvaVR5cGUsIG9iamVjdDogRGJPYmplY3RUeXBlLCB0YWdJRDogc3RyaW5nKSB7XHJcbiAgICBpZiAoIXRoaXMudGFnU2VydmljZSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIHRhZ1NlcnZpY2UgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgaHRtbCA9IGF3YWl0IHRoaXMudGFnU2VydmljZS5nZXRIdG1sVG9JbmplY3QodGFnVHlwZSwgb2JqZWN0KTtcclxuXHJcbiAgICAgIGlmIChodG1sICYmIGh0bWwudHJpbSgpLmxlbmd0aCA+IDAgJiYgc2RrKSB7XHJcbiAgICAgICAgY29uc3Qgc2NyaXB0VGFnID0gdGhpcy50YWdTZXJ2aWNlLmdldFNjcmlwdEZvclRhZyhvYmplY3QsIHRhZ1R5cGUpO1xyXG4gICAgICAgIGh0bWwgKz0gYCR7c2NyaXB0VGFnfWA7XHJcblxyXG4gICAgICAgIGNvbnN0IHRhZ01vZHVsZSA9IHRoaXMuZ2V0VGFnTW9kdWxlKHNkaywgdGFnSUQpO1xyXG4gICAgICAgIGNvbnN0IFtzYW5kYm94SWQsIG1lc3Nlbmdlcl0gPSBhd2FpdCBzZGsuVGFnLnJlZ2lzdGVyU2FuZGJveChodG1sKTtcclxuXHJcbiAgICAgICAgY29uc3QgYXR0YWNobWVudElEID0gdGhpcy50YWdzQXR0YWNobWVudHNbdGFnSURdO1xyXG4gICAgICAgIGlmIChhdHRhY2htZW50SUQpIHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRhZ01vZHVsZS5kZXRhY2godGFnSUQsIGF0dGFjaG1lbnRJRCk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlKSB7IH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudGFnc0F0dGFjaG1lbnRzW3RhZ0lEXSA9IHNhbmRib3hJZDtcclxuICAgICAgICBhd2FpdCB0YWdNb2R1bGUuYXR0YWNoKHRhZ0lELCBzYW5kYm94SWQpO1xyXG5cclxuICAgICAgICAvLyBBdHRhY2ggdGhlIFwiVmlldyBpbmZvcm1hdGlvbnNcIiBoYW5kbGVyIGluIHRvb2x0aXBcclxuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLkRFVEFJTF9DTElDSywgdGhpcy50YWdTZXJ2aWNlLm9uQWN0aW9uRGV0YWlsQ2xpY2suYmluZCh0aGlzLnRhZ1NlcnZpY2UpKTtcclxuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLlRJQ0tFVF9DTElDSywgdGhpcy50YWdTZXJ2aWNlLm9uQWN0aW9uRGV0YWlsQ2xpY2suYmluZCh0aGlzLnRhZ1NlcnZpY2UpKTtcclxuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLkFVRElPX0NMSUNLLCAoYXVkaW9Db21tZW50SUQ6IHN0cmluZykgPT4gdGhpcy50YWdTZXJ2aWNlLm9uQWN0aW9uQXVkaW9DbGljayhhdWRpb0NvbW1lbnRJRCkpO1xyXG4gICAgICAgIG1lc3Nlbmdlci5vbihUYWdBY3Rpb24uVklERU9fQ0xJQ0ssICh2aWRlb1VybDogc3RyaW5nKSA9PiB0aGlzLnRhZ1NlcnZpY2Uub25BY3Rpb25WaWRlb0NsaWNrKHZpZGVvVXJsKSk7XHJcbiAgICAgICAgbWVzc2VuZ2VyLm9uKFRhZ0FjdGlvbi5JTUFHRV9DTElDSywgKGltYWdlQ29tbWVudElEOiBzdHJpbmcpID0+IHRoaXMudGFnU2VydmljZS5vbkFjdGlvbkltYWdlQ2xpY2soaW1hZ2VDb21tZW50SUQpKTtcclxuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLkRPQ19DTElDSywgKGRvY1VybDogc3RyaW5nKSA9PiB0aGlzLnRhZ1NlcnZpY2Uub25BY3Rpb25Eb2NDbGljayhkb2NVcmwpKTtcclxuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLllPVVRVQkVfQ0xJQ0ssICh5b3V0dWJlVXJsOiBzdHJpbmcpID0+IHRoaXMudGFnU2VydmljZS5vbkFjdGlvbllvdXR1YmVDbGljayh5b3V0dWJlVXJsKSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoc2RrKSB7XHJcbiAgICAgICAgY29uc3QgeyBjb21tZW50LCB0YWdEZXNjcmlwdGlvbiB9ID0gdGhpcy50YWdTZXJ2aWNlLmdldEJpbGxib2FyZE1lZGlhVG9FbWJlZChvYmplY3QpO1xyXG5cclxuICAgICAgICBpZiAoY29tbWVudCkge1xyXG4gICAgICAgICAgY29uc3QgdGFnTW9kdWxlID0gdGhpcy5nZXRUYWdNb2R1bGUoc2RrLCB0YWdJRCk7XHJcbiAgICAgICAgICAvLyAxKSBSZWdpc3RlciB0aGUgbWVkaWEgYXR0YWNobWVudCBieSBwYXNzaW5nIHRoZSBVUkwgc3RyaW5nKHMpLlxyXG4gICAgICAgICAgLy8gICAgcmVnaXN0ZXJBdHRhY2htZW50IHJldHVybnMgYW4gYXJyYXkgb2YgYXR0YWNobWVudCBJRHMuXHJcbiAgICAgICAgICBjb25zdCBbYXR0YWNobWVudElEXSA9IGF3YWl0IHNkay5UYWcucmVnaXN0ZXJBdHRhY2htZW50KGNvbW1lbnQuZXh0ZXJuYWxMaW5rKTtcclxuXHJcbiAgICAgICAgICAvLyAyKSBBdHRhY2ggdGhlIHJlZ2lzdGVyZWQgbWVkaWEgdG8gdGhlIHRhZy5cclxuICAgICAgICAgIGF3YWl0IHRhZ01vZHVsZS5hdHRhY2godGFnSUQsIGF0dGFjaG1lbnRJRCk7XHJcblxyXG4gICAgICAgICAgLy8gMykgRGV0ZXJtaW5lIG1lZGlhIHR5cGUgZm9yIHRoZSBiaWxsYm9hcmQgKFBIT1RPIG9yIFZJREVPKS5cclxuICAgICAgICAgIC8vICAgIFVzZSBhIHNpbXBsZSBoZXVyaXN0aWM6IFlvdVR1YmUvVmltZW8gLT4gVklERU8sIG90aGVyd2lzZSBQSE9UTy5cclxuICAgICAgICAgIC8vICAgIFRoZSBTREsgZXhwb3NlcyBNZWRpYVR5cGUgb24gdGhlIFRhZyBuYW1lc3BhY2UuXHJcbiAgICAgICAgICBjb25zdCBpc1ZpZGVvID0gL3lvdXR1YmVcXC5jb218eW91dHVcXC5iZXx2aW1lb1xcLmNvbS9pLnRlc3QoY29tbWVudC5leHRlcm5hbExpbmspO1xyXG4gICAgICAgICAgY29uc3QgbWVkaWFUeXBlID0gaXNWaWRlbyA/IHNkay5NYXR0ZXJ0YWcuTWVkaWFUeXBlLlZJREVPIDogc2RrLk1hdHRlcnRhZy5NZWRpYVR5cGUuUEhPVE87XHJcblxyXG4gICAgICAgICAgLy8gNCkgVXBkYXRlIHRoZSBiaWxsYm9hcmQgdGV4dCBhbmQgbWVkaWEgdXNpbmcgZWRpdEJpbGxib2FyZC5cclxuICAgICAgICAgIC8vICAgIGVkaXRCaWxsYm9hcmQgYWNjZXB0cyBQYXJ0aWFsPFRhZy5FZGl0YWJsZVByb3BlcnRpZXM+IHN1Y2ggYXMgbGFiZWwsIGRlc2NyaXB0aW9uLCBtZWRpYS5cclxuICAgICAgICAgIGF3YWl0IHRhZ01vZHVsZS5lZGl0QmlsbGJvYXJkKHRhZ0lELCB7XHJcbiAgICAgICAgICAgIGxhYmVsOiBvYmplY3QudGl0bGUgfHwgJ01lZGlhJyxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHRhZ0Rlc2NyaXB0aW9uIHx8ICcnLFxyXG4gICAgICAgICAgICBtZWRpYToge1xyXG4gICAgICAgICAgICAgIHR5cGU6IG1lZGlhVHlwZSxcclxuICAgICAgICAgICAgICBzcmM6IGNvbW1lbnQuZXh0ZXJuYWxMaW5rLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgLy8gNSkgS2VlcCBhIGxvY2FsIHJlZmVyZW5jZVxyXG4gICAgICAgICAgdGhpcy50YWdzQXR0YWNobWVudHNbdGFnSURdID0ge1xyXG4gICAgICAgICAgICBhdHRhY2htZW50SUQsXHJcbiAgICAgICAgICAgIHRpdGxlOiBvYmplY3QudGl0bGUgfHwgJ01lZGlhJyxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHRhZ0Rlc2NyaXB0aW9uIHx8ICcnLFxyXG4gICAgICAgICAgICBtZWRpYVNyYzogY29tbWVudC5leHRlcm5hbExpbmssXHJcbiAgICAgICAgICAgIG1lZGlhVHlwZSxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIEVycm9yIGluIGluamVjdEh0bWxJblRhZzonLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogQ2xlYXJzIGFsbCBsb2NhbCB0YWcgZGF0YSBhbmQgcmVzZXRzIHRoZSBhZGRpdGlvbiBxdWV1ZS4gKi9cclxuICBjbGVhcigpIHtcclxuICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLmNsZWFyKCk7XHJcbiAgICB0aGlzLnRhZ3NDdXJyZW50T3BhY2l0eS5jbGVhcigpO1xyXG4gICAgdGhpcy50YWdzQ3VycmVudEVuYWJsZWQuY2xlYXIoKTtcclxuICAgIHRoaXMudGFnc0N1cnJlbnRJY29uLmNsZWFyKCk7XHJcbiAgICB0aGlzLnN0b3BPYnNlcnZpbmdTZGtUYWdzKCk7XHJcbiAgICB0aGlzLnRhZ0FkZFF1ZXVlID0gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93ID0gbnVsbDtcclxuICAgIHRoaXMubWF0dGVydGFnSURzID0gW107XHJcbiAgICAvLyBBIG5ldyBzcGFjZSBtZWFucyBhIG5ldyBTREsgc2Vzc2lvbiwgaGVuY2UgYSBuZXcgc2hhcmVkIGxheWVyIHRvIGNyZWF0ZS5cclxuICAgIHRoaXMuc2hhcmVkVGFnTGF5ZXIgPSBudWxsO1xyXG4gICAgdGhpcy5zaGFyZWRUYWdMYXllclByb21pc2UgPSBudWxsO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
688
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0dGVycG9ydC10YWcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1jb3JlL3NyYy9saWIvc2VydmljZXMvbWF0dGVycG9ydC10YWcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQWtELFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV6RyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7OztBQU0xQyxNQUFNLE9BQU8sb0JBQW9CO0lBdUNyQjtJQXRDVixvRUFBb0U7SUFDNUQsTUFBTSxDQUFVLHFCQUFxQixHQUFHLHlCQUF5QixDQUFDO0lBRW5FLGVBQWUsR0FBK0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUN4RCxXQUFXLEdBQWlCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM5QyxpQkFBaUIsR0FBa0IsSUFBSSxDQUFDO0lBQ3hDLFNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO0lBQ2xDLFlBQVksR0FBa0IsRUFBRSxDQUFDO0lBQ2pDLGVBQWUsR0FBVyxFQUFFLENBQUM7SUFDN0IsY0FBYyxHQUFZLEtBQUssQ0FBQztJQUNoQyxVQUFVLEdBQTBCLElBQUksQ0FBQztJQUN4QyxrQkFBa0IsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNwRCxrQkFBa0IsR0FBeUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUM3RCwrRUFBK0U7SUFDdkUsZUFBZSxHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ3pELHlHQUF5RztJQUNq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Q0FBQztRQUNoQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDOUIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsMkVBQTJFO1FBQzNFLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzNCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7SUFDcEMsQ0FBQzt3R0E1dEJVLG9CQUFvQjs0R0FBcEIsb0JBQW9CLGNBRm5CLE1BQU07OzRGQUVQLG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc0Rldk1vZGUsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE1hdHRlcnRhZ0RhdGEgfSBmcm9tICcuLi9tYXR0ZXJ0YWdEYXRhJztcbmltcG9ydCB7IFBvaVR5cGUsIERiT2JqZWN0VHlwZSwgUE9JLCBWaWV3ZXJJbnRlcmFjdGlvbnMsIFRhZ0FjdGlvbiwgQ2FtZXJhTW9kZSB9IGZyb20gJy4uL3R5cGVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWF0dGVycG9ydE5hdmlnYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9tYXR0ZXJwb3J0LW5hdmlnYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyB3YWl0IH0gZnJvbSAnLi4vaGVscGVycy5zZXJ2aWNlJztcbmltcG9ydCB7IEJhc2VUYWdTZXJ2aWNlIH0gZnJvbSAnLi90YWcuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBNYXR0ZXJwb3J0VGFnU2VydmljZSB7XG4gIC8qKiBOYW1lIG9mIHRoZSBjb21tb24gbGF5ZXIgZXZlcnkgU21hcnRlcnBsYW4gdGFnIGlzIGNyZWF0ZWQgaW4uICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNIQVJFRF9UQUdfTEFZRVJfTkFNRSA9ICdzbWFydGVycGxhbi1zaGFyZWQtdGFncyc7XG5cbiAgcHVibGljIGRpY3Rpb25uYXJ5VGFnczogTWFwPHN0cmluZywgTWF0dGVydGFnRGF0YT4gPSBuZXcgTWFwKCk7XG4gIHB1YmxpYyB0YWdBZGRRdWV1ZTogUHJvbWlzZTxhbnk+ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIHB1YmxpYyBtYXR0ZXJ0YWdUb0ZvbGxvdzogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBvbkdvVG9UYWcgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gIHB1YmxpYyBtYXR0ZXJ0YWdJRHM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgcHVibGljIHRhZ3NBdHRhY2htZW50czogT2JqZWN0ID0ge307XG4gIHB1YmxpYyB0YWdNZXNzZW5nZXJPbjogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgdGFnU2VydmljZTogQmFzZVRhZ1NlcnZpY2UgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB0YWdzQ3VycmVudE9wYWNpdHk6IE1hcDxzdHJpbmcsIG51bWJlcj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgdGFnc0N1cnJlbnRFbmFibGVkOiBNYXA8c3RyaW5nLCBib29sZWFuPiA9IG5ldyBNYXAoKTtcbiAgLyoqIHRhZ0lkIC0+IGljb24gbmFtZSBsYXN0IGFwcGxpZWQsIHNvIGFuIHVuY2hhbmdlZCBpY29uIGlzIG5vdCByZS1hcHBsaWVkLiAqL1xuICBwcml2YXRlIHRhZ3NDdXJyZW50SWNvbjogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKTtcbiAgLyoqIElkcyBvZiB0aGUgZ2xvYmFsIFNESyBUYWcgY29sbGVjdGlvbiwgYW5kIHRoZSB0YWdzIHdhaXRpbmcgdG8gYXBwZWFyIGluIGl0LCBzZWUgd2FpdEZvclRhZ0luU2RrKCkuICovXG4gIHByaXZhdGUgc2RrVGFnSWRzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgcHJpdmF0ZSBzZGtUYWdXYWl0ZXJzOiBNYXA8c3RyaW5nLCBBcnJheTwoKSA9PiB2b2lkPj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgc2RrVGFnU3Vic2NyaXB0aW9uOiBhbnkgPSBudWxsO1xuICBwcml2YXRlIHNka1RhZ1N1YnNjcmlwdGlvblNkazogYW55ID0gbnVsbDtcbiAgLyoqXG4gICAqIFNpbmdsZSBsYXllciBob2xkaW5nIGV2ZXJ5IFNtYXJ0ZXJwbGFuIHRhZywgYWRkZWQgdG8gZXZlcnkgdmlldyBvZiB0aGUgc3BhY2Ugc28gYVxuICAgKiB0YWcgc3RheXMgaW4gcGxhY2Ug4oCUIHNhbWUgc2lkLCBzYW1lIGNvbnRlbnQg4oCUIHdoZW4gdGhlIHVzZXIgc3dpdGNoZXMgYmV0d2VlbiB0aGVcbiAgICogZnVybmlzaGVkIGFuZCB0aGUgRGVmdXJuaXNoZWQgdmlldy4gVGFncyBhZGRlZCB0byB0aGUgZ2xvYmFsIHNkay5UYWcgKG9yIHRvIGFcbiAgICogdmlldydzIG93biBsYXllcikgYmVsb25nIHRvIHRoYXQgdmlldyBvbmx5LCB3aGljaCBpcyB3aGF0IG1hZGUgdGhlbSBwb3AgaW4gYW5kIG91dFxuICAgKiBvbiBldmVyeSB2aWV3IGNoYW5nZS5cbiAgICpcbiAgICogRGVsaWJlcmF0ZWx5IE5PVCBjcmVhdGVkIHdpdGggYHsgY29tbW9uOiB0cnVlIH1gOiBpbiBTREsgMjYuNy41IGEgY29tbW9uIGxheWVyIGlzXG4gICAqIHB1c2hlZCBpbnRvIGBnZXRPcmRlcmVkTW9kZWxWaWV3cygpYCBhdCBjcmVhdGlvbiB0aW1lLCBhbmQgdGhhdCBjYWxsIGRlZmF1bHRzIHRvXG4gICAqIGBpbmNsdWRlRGVmdXJuaXNoOiBmYWxzZWAsIHNvIHRoZSBEZWZ1cm5pc2hlZCB2aWV3IG5ldmVyIHJlY2VpdmVzIGl0IOKAlCB3aGlsZVxuICAgKiBgVmlldy5hZGRMYXllcigpYCByZWZ1c2VzIHRvIHJlcGFpciBpdCAoXCJMYXllciBpcyBjb21tb24uIE5vIG5lZWQgdG8gYWRkLlwiKS4gQVxuICAgKiBwbGFpbiBsYXllciB3ZSBhdHRhY2ggdG8gZWFjaCB2aWV3IG91cnNlbHZlcyByZWFjaGVzIGV2ZXJ5IHZpZXcsIERlZnVybmlzaGVkXG4gICAqIGluY2x1ZGVkLiBTZWUgYXR0YWNoU2hhcmVkVGFnTGF5ZXJUb1ZpZXdzKCkuXG4gICAqL1xuICBwcml2YXRlIHNoYXJlZFRhZ0xheWVyOiBhbnkgPSBudWxsO1xuICBwcml2YXRlIHNoYXJlZFRhZ0xheWVyUHJvbWlzZTogUHJvbWlzZTxhbnk+IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBuYXZpZ2F0aW9uU2VydmljZTogTWF0dGVycG9ydE5hdmlnYXRpb25TZXJ2aWNlXG4gICkgeyB9XG5cbiAgc2V0VGFnU2VydmljZShzZXJ2aWNlOiBCYXNlVGFnU2VydmljZSk6IHZvaWQge1xuICAgIHRoaXMudGFnU2VydmljZSA9IHNlcnZpY2U7XG4gIH1cblxuICAvKiogT3BlbnMgYSBzcGVjaWZpYyB0YWcgaW4gdGhlIE1hdHRlcnBvcnQgdmlld2VyIGJ5IGl0cyBJRC4gKi9cbiAgYXN5bmMgZ29Ub1RhZyhzZGs6IGFueSwgc2lkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghc2RrKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMub25Hb1RvVGFnLm5leHQoc2lkKTtcbiAgICAgIC8vIGBvcGVuYCBvbmx5IGV4aXN0cyBvbiB0aGUgZ2xvYmFsIFRhZyBtb2R1bGUsIG5ldmVyIG9uIGEgbGF5ZXItc2NvcGVkIG9uZS5cbiAgICAgIGF3YWl0IHNkay5UYWcub3BlbihzaWQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdDYW5ub3Qgb3BlbiB0YWcnLCBzaWQsIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBTREsgVGFnIG1vZHVsZSB0byB1c2UgZm9yIGFuIG9wZXJhdGlvbiBhZGRyZXNzaW5nIGFuIGV4aXN0aW5nIHRhZyBieSBJRFxuICAgKiAoaWNvbiwgb3BhY2l0eSwgcG9zaXRpb24sIGF0dGFjaG1lbnRzLCByZW1vdmFsLi4uKTogYWx3YXlzIHRoZSBnbG9iYWwgc2RrLlRhZy5cbiAgICpcbiAgICogQSBsYXllci1zY29wZWQgVGFnIG1vZHVsZSBvbmx5IGV4cG9zZXMgdGhlICpyZXBsYXlhYmxlKiBtdXRhdGlvbnMsIG1lYW50IHRvIGJ1aWxkXG4gICAqIHRoZSBsYXllcidzIG93biBjb250ZW50OyBhcHBseWluZyB0aGVtIHRvIGFuIGFscmVhZHktY3JlYXRlZCB0YWcgc2lsZW50bHkgZG9lc1xuICAgKiBub3RoaW5nIOKAlCB3aGljaCBpcyB3aGF0IGxlZnQgZXZlcnkgcGluIHdoaXRlIGluc3RlYWQgb2YgY2FycnlpbmcgaXRzIGljb24uIE9ubHlcbiAgICogYGFkZGAgaGFzIHRvIGdvIHRocm91Z2ggdGhlIGxheWVyLCBzZWUgZ2V0VGFnQ3JlYXRpb25Nb2R1bGUoKS4gVGhlIGdsb2JhbCBtb2R1bGVcbiAgICogb25seSBrbm93cyBhIGxheWVyLWNyZWF0ZWQgcGluIG9uY2UgaXQgaXMgcmVuZGVyZWQ6IHNlZSB3YWl0Rm9yVGFnSW5TZGsoKS5cbiAgICovXG4gIGdldFRhZ01vZHVsZShzZGs6IGFueSwgdGFnSWQ6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHNkaz8uVGFnO1xuICB9XG5cbiAgLyoqIEljb24gbmFtZSBsYXN0IGFwcGxpZWQgdG8gYSB0YWcsIGlmIGFueS4gKi9cbiAgZ2V0Q2FjaGVkVGFnSWNvbih0YWdJZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50YWdzQ3VycmVudEljb24uZ2V0KHRhZ0lkKTtcbiAgfVxuXG4gIC8qKiBBcHBsaWVzIGFuIGljb24gdG8gYSB0YWcgdGhyb3VnaCBpdHMgb3duIG1vZHVsZSBhbmQgcmVtZW1iZXJzIGl0IG9uIHN1Y2Nlc3MuICovXG4gIGFzeW5jIGVkaXRUYWdJY29uKHNkazogYW55LCB0YWdJZDogc3RyaW5nLCBpY29uTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5nZXRUYWdNb2R1bGUoc2RrLCB0YWdJZCkuZWRpdEljb24odGFnSWQsIGljb25OYW1lKTtcbiAgICB0aGlzLnRhZ3NDdXJyZW50SWNvbi5zZXQodGFnSWQsIGljb25OYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBvbmNlIHRoZSBnbG9iYWwgU0RLIFRhZyBjb2xsZWN0aW9uIOKAlCB0aGUgb25lIGVkaXRzIGdvIHRocm91Z2gg4oCUIGNvbnRhaW5zIHRoZVxuICAgKiB0YWcsIHNvIGVkaXRzIGRvIG5vdCBoaXQgYSBwaW4gdGhhdCBpcyBub3QgcmVuZGVyZWQgeWV0IChcInNldFBpblJlbmRlck92ZXJyaWRlcyBvbiBhIHBpblxuICAgKiB0aGF0IGRvZXNuJ3QgZXhpc3RcIikuIEdpdmVzIHVwIGFmdGVyIGB0aW1lb3V0TXNgIGFuZCByZXNvbHZlcyBhbnl3YXk7IGZhbGxzIGJhY2sgdG8gYVxuICAgKiBzaG9ydCB3YWl0IHdoZW4gdGhlIGNvbGxlY3Rpb24gY2Fubm90IGJlIG9ic2VydmVkLiBPbmUgc3Vic2NyaXB0aW9uIGlzIHNoYXJlZCBieSBldmVyeVxuICAgKiB3YWl0aW5nIHRhZzogYSBzcGFjZSBsb2FkcyBodW5kcmVkcyBvZiB0aGVtLlxuICAgKi9cbiAgcHJpdmF0ZSB3YWl0Rm9yVGFnSW5TZGsoc2RrOiBhbnksIHRhZ0lkOiBzdHJpbmcsIHRpbWVvdXRNcyA9IDE1MDApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRhZ0lkIHx8ICF0aGlzLm9ic2VydmVTZGtUYWdzKHNkaykpIHJldHVybiB3YWl0KDEwMCk7XG4gICAgaWYgKHRoaXMuc2RrVGFnSWRzLmhhcyh0YWdJZCkpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3Qgd2FpdGVycyA9IHRoaXMuc2RrVGFnV2FpdGVycy5nZXQodGFnSWQpIHx8IFtdO1xuICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29uc3QgcmVtYWluaW5nID0gKHRoaXMuc2RrVGFnV2FpdGVycy5nZXQodGFnSWQpIHx8IFtdKS5maWx0ZXIod2FpdGVyID0+IHdhaXRlciAhPT0gZG9uZSk7XG4gICAgICAgIGlmIChyZW1haW5pbmcubGVuZ3RoKSB0aGlzLnNka1RhZ1dhaXRlcnMuc2V0KHRhZ0lkLCByZW1haW5pbmcpO1xuICAgICAgICBlbHNlIHRoaXMuc2RrVGFnV2FpdGVycy5kZWxldGUodGFnSWQpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9LCB0aW1lb3V0TXMpO1xuICAgICAgY29uc3QgZG9uZSA9ICgpID0+IHsgY2xlYXJUaW1lb3V0KHRpbWVyKTsgcmVzb2x2ZSgpOyB9O1xuICAgICAgd2FpdGVycy5wdXNoKGRvbmUpO1xuICAgICAgdGhpcy5zZGtUYWdXYWl0ZXJzLnNldCh0YWdJZCwgd2FpdGVycyk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogS2VlcHMgc2RrVGFnSWRzIGluIHN5bmMgd2l0aCB0aGUgZ2xvYmFsIFNESyBUYWcgY29sbGVjdGlvbjsgZmFsc2Ugd2hlbiBpdCBjYW5ub3QgYmUgb2JzZXJ2ZWQuICovXG4gIHByaXZhdGUgb2JzZXJ2ZVNka1RhZ3Moc2RrOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5zZGtUYWdTdWJzY3JpcHRpb24gJiYgdGhpcy5zZGtUYWdTdWJzY3JpcHRpb25TZGsgPT09IHNkaykgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgZGF0YSA9IHNkaz8uVGFnPy5kYXRhO1xuICAgIGlmICh0eXBlb2YgZGF0YT8uc3Vic2NyaWJlICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG5cbiAgICB0aGlzLnN0b3BPYnNlcnZpbmdTZGtUYWdzKCk7XG4gICAgY29uc3QgbWFya1ByZXNlbnQgPSAoaWQ6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5zZGtUYWdJZHMuYWRkKGlkKTtcbiAgICAgIGNvbnN0IHdhaXRlcnMgPSB0aGlzLnNka1RhZ1dhaXRlcnMuZ2V0KGlkKTtcbiAgICAgIGlmICh3YWl0ZXJzKSB7XG4gICAgICAgIHRoaXMuc2RrVGFnV2FpdGVycy5kZWxldGUoaWQpO1xuICAgICAgICB3YWl0ZXJzLmZvckVhY2god2FpdGVyID0+IHdhaXRlcigpKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnNka1RhZ1N1YnNjcmlwdGlvblNkayA9IHNkaztcbiAgICAgIHRoaXMuc2RrVGFnU3Vic2NyaXB0aW9uID0gZGF0YS5zdWJzY3JpYmUoe1xuICAgICAgICBvbkFkZGVkOiAoaWQ6IHN0cmluZykgPT4gbWFya1ByZXNlbnQoaWQpLFxuICAgICAgICBvblJlbW92ZWQ6IChpZDogc3RyaW5nKSA9PiB0aGlzLnNka1RhZ0lkcy5kZWxldGUoaWQpLFxuICAgICAgICBvbkNvbGxlY3Rpb25VcGRhdGVkOiAoY29sbGVjdGlvbjogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgaWRzOiBzdHJpbmdbXSA9IHR5cGVvZiBjb2xsZWN0aW9uPy5rZXlzID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IEFycmF5LmZyb20oY29sbGVjdGlvbi5rZXlzKCkpIDogT2JqZWN0LmtleXMoY29sbGVjdGlvbiB8fCB7fSk7XG4gICAgICAgICAgdGhpcy5zZGtUYWdJZHMgPSBuZXcgU2V0KGlkcyk7XG4gICAgICAgICAgaWRzLmZvckVhY2goaWQgPT4gdGhpcy5zZGtUYWdXYWl0ZXJzLmhhcyhpZCkgJiYgbWFya1ByZXNlbnQoaWQpKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLnNka1RhZ1N1YnNjcmlwdGlvblNkayA9IG51bGw7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdG9wT2JzZXJ2aW5nU2RrVGFncygpOiB2b2lkIHtcbiAgICB0cnkgeyB0aGlzLnNka1RhZ1N1YnNjcmlwdGlvbj8uY2FuY2VsPy4oKTsgfSBjYXRjaCB7IH1cbiAgICB0aGlzLnNka1RhZ1N1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgdGhpcy5zZGtUYWdTdWJzY3JpcHRpb25TZGsgPSBudWxsO1xuICAgIHRoaXMuc2RrVGFnSWRzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgVGFnIG1vZHVsZSBldmVyeSBuZXcgdGFnIG11c3QgYmUgY3JlYXRlZCB0aHJvdWdoOiB0aGUgc2hhcmVkIGxheWVyXG4gICAqIHdoZW4gdGhlIFZpZXcgQVBJIGlzIGF2YWlsYWJsZSwgdGhlIGdsb2JhbCBzZGsuVGFnIG90aGVyd2lzZS5cbiAgICovXG4gIGFzeW5jIGdldFRhZ0NyZWF0aW9uTW9kdWxlKHNkazogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBsYXllciA9IGF3YWl0IHRoaXMuZW5zdXJlU2hhcmVkVGFnTGF5ZXIoc2RrKTtcbiAgICByZXR1cm4gbGF5ZXI/LlRhZyB8fCBzZGs/LlRhZztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIChvbmNlIHBlciBTREsgc2Vzc2lvbikgYW5kIHJldHVybnMgdGhlIHNoYXJlZCB0YWcgbGF5ZXIuXG4gICAqIFJlc29sdmVzIHRvIG51bGwgd2hlbiB0aGUgVmlldyBBUEkgaXMgdW5hdmFpbGFibGUsIHNvIGNhbGxlcnMgdHJhbnNwYXJlbnRseSBmYWxsXG4gICAqIGJhY2sgdG8gdGhlIGdsb2JhbCBzZGsuVGFnLlxuICAgKi9cbiAgYXN5bmMgZW5zdXJlU2hhcmVkVGFnTGF5ZXIoc2RrOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLnNoYXJlZFRhZ0xheWVyKSByZXR1cm4gdGhpcy5zaGFyZWRUYWdMYXllcjtcbiAgICBpZiAoIXNkaz8uVmlldz8uY3JlYXRlTGF5ZXIpIHJldHVybiBudWxsO1xuXG4gICAgaWYgKCF0aGlzLnNoYXJlZFRhZ0xheWVyUHJvbWlzZSkge1xuICAgICAgdGhpcy5zaGFyZWRUYWdMYXllclByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoXG4gICAgICAgIHNkay5WaWV3LmNyZWF0ZUxheWVyKE1hdHRlcnBvcnRUYWdTZXJ2aWNlLlNIQVJFRF9UQUdfTEFZRVJfTkFNRSlcbiAgICAgIClcbiAgICAgICAgLnRoZW4oYXN5bmMgKGxheWVyOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnNoYXJlZFRhZ0xheWVyID0gbGF5ZXI7XG4gICAgICAgICAgLy8gQSBmcmVzaGx5IGNyZWF0ZWQgbGF5ZXIgY2FuIGNvbWUgYmFjayB0b2dnbGVkIG9mZiwgd2hpY2ggaGlkZXMgaXRzIHRhZ3MuXG4gICAgICAgICAgaWYgKGxheWVyICYmIGxheWVyLnRvZ2dsZWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBhd2FpdCBsYXllci50b2dnbGUodHJ1ZSkuY2F0Y2goKCkgPT4geyB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGxheWVyO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGU6IGFueSkgPT4ge1xuICAgICAgICAgIC8vIEFsbG93IGEgbGF0ZXIgcmV0cnkgKGUuZy4gdGhlIFNESyB3YXMgbm90IGZ1bGx5IHJlYWR5IHlldCkuXG4gICAgICAgICAgdGhpcy5zaGFyZWRUYWdMYXllclByb21pc2UgPSBudWxsO1xuICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIENvdWxkIG5vdCBjcmVhdGUgdGhlIHNoYXJlZCB0YWcgbGF5ZXInLCBlKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkVGFnTGF5ZXJQcm9taXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2VzIHN1cmUgdGhlIHNoYXJlZCBsYXllciBpcyBwYXJ0IG9mIGV2ZXJ5IHZpZXcgb2YgdGhlIHNwYWNlLCBEZWZ1cm5pc2hlZFxuICAgKiBpbmNsdWRlZC4gVGhpcyBpcyB3aGF0IGFjdHVhbGx5IHNoYXJlcyB0aGUgdGFncyBhY3Jvc3Mgdmlld3MsIGFuZCB0aGUgcmVhc29uIHRoZVxuICAgKiBsYXllciBtdXN0IG5vdCBiZSBhIGNvbW1vbiBvbmU6IHRoZSBTREsgb25seSBwZXJmb3JtcyB0aGUgYXR0YWNobWVudCBmb3JcbiAgICogbm9uLWNvbW1vbiBsYXllcnMuIElkZW1wb3RlbnQsIHNvIGl0IGNhbiBydW4gb24gZXZlcnkgdmlldyBjb2xsZWN0aW9uIHVwZGF0ZS5cbiAgICovXG4gIGFzeW5jIGF0dGFjaFNoYXJlZFRhZ0xheWVyVG9WaWV3cyhzZGs6IGFueSwgdmlld3M6IEl0ZXJhYmxlPGFueT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsYXllciA9IGF3YWl0IHRoaXMuZW5zdXJlU2hhcmVkVGFnTGF5ZXIoc2RrKTtcbiAgICBpZiAoIWxheWVyKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IHZpZXcgb2Ygdmlld3MpIHtcbiAgICAgIGlmICghdmlldz8uYWRkTGF5ZXIgfHwgdmlldy5oYXNMYXllcj8uKGxheWVyKSkgY29udGludWU7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB2aWV3LmFkZExheWVyKGxheWVyKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ1tNYXR0ZXJwb3J0VGFnU2VydmljZV0gQ2Fubm90IGFkZCB0aGUgc2hhcmVkIHRhZyBsYXllciB0byB2aWV3Jywgdmlldz8uaWQsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgdGFnIHRocm91Z2ggdGhlIHNoYXJlZCBsYXllciBzbyBpdCBleGlzdHMgaW4gZXZlcnkgdmlldy4gRmFsbHMgYmFja1xuICAgKiB0byB0aGUgZ2xvYmFsIHNkay5UYWcgd2hlbiB0aGUgVmlldyBBUEkgaXMgdW5hdmFpbGFibGU7IHRoYXQgY2FsbCBpcyByYWNlZCBhZ2FpbnN0XG4gICAqIGEgdGltZW91dCBhcyBhIHNhZmV0eSBuZXQsIHNpbmNlIGl0IG5ldmVyIHJlc29sdmVzIHdoaWxlIGEgRGVmdXJuaXNoZWQgdmlldyBpc1xuICAgKiBhY3RpdmUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFkZFRhZ1RvU2RrKHNkazogYW55LCBkZXNjcmlwdG9yOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgY29uc3Qgc2hhcmVkVGFnTW9kdWxlID0gYXdhaXQgdGhpcy5nZXRUYWdDcmVhdGlvbk1vZHVsZShzZGspO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNpZExpc3QgPSAoYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgc2hhcmVkVGFnTW9kdWxlLmFkZChkZXNjcmlwdG9yKSxcbiAgICAgICAgbmV3IFByb21pc2U8bmV2ZXI+KChfLCByZWplY3QpID0+XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiByZWplY3QobmV3IEVycm9yKCdUYWcuYWRkIHRpbWVkIG91dCcpKSwgNDAwMClcbiAgICAgICAgKSxcbiAgICAgIF0pKSBhcyBzdHJpbmdbXTtcbiAgICAgIGlmIChzaWRMaXN0Py5sZW5ndGgpIHJldHVybiBzaWRMaXN0WzBdO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmIChlcnJvcj8ubWVzc2FnZT8uaW5jbHVkZXMoJ2FscmVhZHkgaW4gdXNlJykpIHRocm93IGVycm9yO1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ1tNYXR0ZXJwb3J0VGFnU2VydmljZV0gVGFnLmFkZCBmYWlsZWQvdGltZWQgb3V0JywgZXJyb3I/Lm1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqIE9wZW5zIHRoZSBtb3N0IHJlY2VudGx5IGNyZWF0ZWQgdGFnIGluIHRoZSB2aWV3ZXIuICovXG4gIGFzeW5jIGdvVG9MYXN0VGFnKHNkazogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIXNkayB8fCB0aGlzLm1hdHRlcnRhZ0lEcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCBsYXN0U2lkID0gdGhpcy5tYXR0ZXJ0YWdJRHNbdGhpcy5tYXR0ZXJ0YWdJRHMubGVuZ3RoIC0gMV07XG4gICAgcmV0dXJuIHRoaXMuZ29Ub1RhZyhzZGssIGxhc3RTaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBNYXR0ZXJ0YWcgdG8gdGhlIHZpZXdlciwgc2VyaWFsaXppbmcgY2FsbHMgdG8gcHJldmVudCBTREsgcmFjZSBjb25kaXRpb25zLlxuICAgKiBSZXVzZXMgZXhpc3RpbmcgSURzIGlmIHRoZSB0YWcgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBzZXNzaW9uLlxuICAgKi9cbiAgYXN5bmMgYWRkTWF0dGVydGFnVG9WaWV3ZXIoc2RrOiBhbnksIG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBpZiAoIXNkaykgcmV0dXJuIG51bGw7XG5cbiAgICB0aGlzLnRhZ0FkZFF1ZXVlID0gdGhpcy50YWdBZGRRdWV1ZVxuICAgICAgLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gbWF0dGVydGFnRGF0YS5nZXRNYXR0ZXJ0YWdEZXNjcmlwdG9yKClbMF07XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nSWQgPSBkZXNjcmlwdG9yPy5pZCB8fCBudWxsO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgc2lkID0gYXdhaXQgdGhpcy5hZGRUYWdUb1NkayhzZGssIGRlc2NyaXB0b3IpO1xuICAgICAgICAgIGlmIChzaWQpIHtcbiAgICAgICAgICAgIG1hdHRlcnRhZ0RhdGEuc2V0TWF0dGVycG9ydFNpZChzaWQpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLm1hdHRlcnRhZ0lEcy5pbmNsdWRlcyhzaWQpKSB7XG4gICAgICAgICAgICAgIHRoaXMubWF0dGVydGFnSURzLnB1c2goc2lkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLnNldChzaWQsIG1hdHRlcnRhZ0RhdGEpO1xuICAgICAgICAgICAgcmV0dXJuIHNpZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ1tNYXR0ZXJwb3J0VGFnU2VydmljZV0gVGFnLmFkZCByZXR1cm5lZCBubyBzaWQnLCBkZXNjcmlwdG9yKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgIGlmIChlcnJvcj8ubWVzc2FnZT8uaW5jbHVkZXMoJ2FscmVhZHkgaW4gdXNlJykgJiYgZXhpc3RpbmdJZCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRpY3Rpb25uYXJ5VGFncy5oYXMoZXhpc3RpbmdJZCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5tYXR0ZXJ0YWdJRHMucHVzaChleGlzdGluZ0lkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLnNldChleGlzdGluZ0lkLCBtYXR0ZXJ0YWdEYXRhKTtcbiAgICAgICAgICAgIHJldHVybiBleGlzdGluZ0lkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignW01hdHRlcnBvcnRUYWdTZXJ2aWNlXSBhZGRNYXR0ZXJ0YWdUb1ZpZXdlciBmYWlsZWQnLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIHRhZ0FkZFF1ZXVlIHJlamVjdGVkJywgZSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy50YWdBZGRRdWV1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gYWRkIGFuZCBjb25maWd1cmUgYSBNYXR0ZXJ0YWcgd2l0aCBpY29uLCBvcGFjaXR5LCBhbmQgSFRNTCBjb250ZW50LlxuICAgKiBIYW5kbGVzIGV4aXN0aW5nIHRhZ3MgZ3JhY2VmdWxseSBhbmQgcXVldWVzIG9wZXJhdGlvbnMgdG8gYXZvaWQgU0RLIGNvbmZsaWN0cy5cbiAgICovXG4gIGFzeW5jIF9kb0FkZE1hdHRlcnRhZyhcbiAgICBzZGs6IGFueSxcbiAgICBtYXR0ZXJ0YWdEYXRhOiBNYXR0ZXJ0YWdEYXRhLFxuICAgIHNldFRhZ0ljb25BbmRPcGFjaXR5OiAoc2lkOiBzdHJpbmcsIG10OiBNYXR0ZXJ0YWdEYXRhKSA9PiBQcm9taXNlPHZvaWQ+LFxuICAgIGluamVjdEh0bWxJblRhZzogKHR5cGU6IFBvaVR5cGUsIG9iajogRGJPYmplY3RUeXBlLCBzaWQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBtYXR0ZXJ0YWdEYXRhLmdldE1hdHRlcnRhZ0Rlc2NyaXB0b3IoKTtcbiAgICAvL2NvbnNvbGUubG9nKCdkZXNjcmlwdG9yJywgZGVzY3JpcHRvcik7XG4gICAgY29uc3Qgc2lkID0gZGVzY3JpcHRvclswXVsnaWQnXTtcblxuICAgIGlmIChzaWQgJiYgdGhpcy5kaWN0aW9ubmFyeVRhZ3MuaGFzKHNpZCkpIHtcbiAgICAgIGF3YWl0IHNldFRhZ0ljb25BbmRPcGFjaXR5KHNpZCwgbWF0dGVydGFnRGF0YSk7XG4gICAgICBhd2FpdCBpbmplY3RIdG1sSW5UYWcobWF0dGVydGFnRGF0YS5nZXRUeXBlKCksIG1hdHRlcnRhZ0RhdGEuZ2V0T2JqZWN0KCksIHNpZCk7XG4gICAgICByZXR1cm4gc2lkO1xuICAgIH1cblxuICAgIHRoaXMudGFnQWRkUXVldWUgPSB0aGlzLnRhZ0FkZFF1ZXVlLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGFnTW9kdWxlID0gYXdhaXQgdGhpcy5nZXRUYWdDcmVhdGlvbk1vZHVsZShzZGspO1xuICAgICAgICBjb25zdCBbY3JlYXRlZFNpZF0gPSBhd2FpdCB0YWdNb2R1bGUuYWRkKC4uLmRlc2NyaXB0b3IpO1xuXG4gICAgICAgIHRoaXMubWF0dGVydGFnSURzLnB1c2goY3JlYXRlZFNpZCk7XG4gICAgICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLnNldChjcmVhdGVkU2lkLCBtYXR0ZXJ0YWdEYXRhKTtcblxuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JUYWdJblNkayhzZGssIGNyZWF0ZWRTaWQpO1xuICAgICAgICBhd2FpdCBzZXRUYWdJY29uQW5kT3BhY2l0eShjcmVhdGVkU2lkLCBtYXR0ZXJ0YWdEYXRhKTtcblxuICAgICAgICBpbmplY3RIdG1sSW5UYWcobWF0dGVydGFnRGF0YS5nZXRUeXBlKCksIG1hdHRlcnRhZ0RhdGEuZ2V0T2JqZWN0KCksIGNyZWF0ZWRTaWQpLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0hUTUwgaW5qZWN0aW9uIGZhaWxlZCBmb3InLCBjcmVhdGVkU2lkLCBlcnIpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gY3JlYXRlZFNpZDtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBpZiAoZT8ubWVzc2FnZT8uaW5jbHVkZXMoJ2FscmVhZHkgaW4gdXNlJykgJiYgc2lkKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmRpY3Rpb25uYXJ5VGFncy5oYXMoc2lkKSkge1xuICAgICAgICAgICAgdGhpcy5tYXR0ZXJ0YWdJRHMucHVzaChzaWQpO1xuICAgICAgICAgICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3Muc2V0KHNpZCwgbWF0dGVydGFnRGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IHNldFRhZ0ljb25BbmRPcGFjaXR5KHNpZCwgbWF0dGVydGFnRGF0YSk7XG4gICAgICAgICAgYXdhaXQgaW5qZWN0SHRtbEluVGFnKG1hdHRlcnRhZ0RhdGEuZ2V0VHlwZSgpLCBtYXR0ZXJ0YWdEYXRhLmdldE9iamVjdCgpLCBzaWQpO1xuICAgICAgICAgIHJldHVybiBzaWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLnRhZ0FkZFF1ZXVlO1xuICB9XG5cbiAgZ2V0RGlzdGFuY2UocDE6IGFueSwgcDI6IGFueSk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhwMi54IC0gcDEueCwgMikgKyBNYXRoLnBvdyhwMi55IC0gcDEueSwgMikgKyBNYXRoLnBvdyhwMi56IC0gcDEueiwgMikpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIHRhZyBpcyB3aXRoaW4gdGhlIGJvdW5kaW5nIGJveCBvZiBhbnkgYWN0aXZlIHJvb20gKGFkZGluZyBhIHNsaWdodCBtYXJnaW4gdG8gYWNjb3VudCBmb3Igd2FsbC1tb3VudGVkIHRhZ3MpLlxuICAgKiBJZiB0aGVyZSBhcmUgbm8gYWN0aXZlIHJvb21zIChlLmcuLCBoYWxsd2F5KSwgZmFsbHMgYmFjayB0byByZXR1cm5pbmcgdHJ1ZS5cbiAgICovXG4gIGlzVGFnSW5Sb29tcyhtYXR0ZXJ0YWdEYXRhOiBNYXR0ZXJ0YWdEYXRhLCByb29tczogYW55W10pOiBib29sZWFuIHtcbiAgICBpZiAoIXJvb21zIHx8IHJvb21zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgdGFnUG9zID0gbWF0dGVydGFnRGF0YS5nZXRQb3NpdGlvbigpO1xuICAgIGNvbnN0IG1hcmdpbiA9IDEuNTtcblxuICAgIHJldHVybiByb29tcy5zb21lKChyb29tKSA9PiB7XG4gICAgICBpZiAoIXJvb20uYm91bmRzKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCB7IG1pbiwgbWF4IH0gPSByb29tLmJvdW5kcztcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGFnUG9zLnggPj0gbWluLnggLSBtYXJnaW4gJiYgdGFnUG9zLnggPD0gbWF4LnggKyBtYXJnaW4gJiZcbiAgICAgICAgdGFnUG9zLnkgPj0gbWluLnkgLSBtYXJnaW4gJiYgdGFnUG9zLnkgPD0gbWF4LnkgKyBtYXJnaW4gJiZcbiAgICAgICAgdGFnUG9zLnogPj0gbWluLnogLSBtYXJnaW4gJiYgdGFnUG9zLnogPD0gbWF4LnogKyBtYXJnaW5cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgSUQgb2YgdGhlIG1vc3QgcmVjZW50bHkgYWRkZWQgdGFnLiAqL1xuICBnZXRMYXN0VGFnKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0aGlzLm1hdHRlcnRhZ0lEcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLm1hdHRlcnRhZ0lEc1t0aGlzLm1hdHRlcnRhZ0lEcy5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSB2aXNpYmlsaXR5IChvcGFjaXR5KSBvZiBhbGwgdGFncyBiYXNlZCBvbiB0aGUgY3VycmVudCBjYW1lcmEgbW9kZSxcbiAgICogZmxvb3IgYW5kIHJvb20gY29udGV4dC4gTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgZWFjaCBzd2VlcCwgZmxvb3Igb3IgbW9kZSBjaGFuZ2UuXG4gICAqXG4gICAqIFJ1bGVzOlxuICAgKiAgLSBBIHRhZyBzaG93cyB3aGVuIGl0cyBzd2VlcCBpcyBvbiB0aGUgZmxvb3IgYmVpbmcgZGlzcGxheWVkLCBpbiBldmVyeSBtb2RlLiBUYWdzIG9uXG4gICAqICAgIG90aGVyIGZsb29ycyBhcmUgaGlkZGVuIChvcGFjaXR5IDApIGFuZCBjYW5ub3QgYmUgb3BlbmVkLlxuICAgKiAgLSBXaGlsZSBhbGwgZmxvb3JzIGFyZSBkaXNwbGF5ZWQgLSB0aGUgdXN1YWwgc3RhdGUgb2YgRE9MTEhPVVNFIGFuZCBGTE9PUlBMQU4gLSBldmVyeVxuICAgKiAgICB0YWcgc2hvd3MuXG4gICAqICAtIEEgdGFnIHdpdGggbm8gc3dlZXAgYmVsb25ncyB0byBubyBmbG9vciBhbmQgYWx3YXlzIHNob3dzLlxuICAgKlxuICAgKiBAcGFyYW0gc2RrICAgICAgICAgIE1hdHRlcnBvcnQgU0RLIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcG9zZUNhbWVyYSAgIEN1cnJlbnQgY2FtZXJhIHBvc2UuXG4gICAqIEBwYXJhbSBzd2VlcENvbGxlY3Rpb24gIEZ1bGwgY29sbGVjdGlvbiBvZiBzd2VlcHMuXG4gICAqIEBwYXJhbSBjdXJyZW50Q2FtZXJhTW9kZSAgQ3VycmVudCBjYW1lcmEgbW9kZS5cbiAgICogQHBhcmFtIG1hdHRlcnRhZ1RvRm9sbG93ICBJRCBvZiB0aGUgY3Vyc29yIHRhZyAobmV2ZXIgdG91Y2hlZCkuXG4gICAqL1xuICBhc3luYyB1cGRhdGVUYWdzVmlzaWJpbGl0eUZvckNvbnRleHQoXG4gICAgc2RrOiBhbnksXG4gICAgc3dlZXBDb2xsZWN0aW9uOiBhbnksXG4gICAgY3VycmVudENhbWVyYU1vZGU6IENhbWVyYU1vZGUsXG4gICAgbWF0dGVydGFnVG9Gb2xsb3c6IHN0cmluZyB8IG51bGwsXG4gICAgY3VycmVudEZsb29yU2VxdWVuY2U6IG51bWJlciB8IG51bGwgPSBudWxsLFxuICAgIGN1cnJlbnRSb29tczogYW55W10gPSBbXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXNkayB8fCB0aGlzLmRpY3Rpb25uYXJ5VGFncy5zaXplID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBpc0ludGVyaW9yTW9kZSA9IGN1cnJlbnRDYW1lcmFNb2RlID09PSBDYW1lcmFNb2RlLklOU0lERTtcbiAgICAvLyBUaGUgU0RLIHJlcG9ydHMgc2VxdWVuY2UgLTEgd2hpbGUgYWxsIGZsb29ycyBhcmUgZGlzcGxheWVkLCB3aGljaCBpcyB0aGUgZG9sbGhvdXNlJ3MgYW5kIHRoZVxuICAgIC8vIGZsb29yIHBsYW4ncyBub3JtYWwgc3RhdGUuIFRoYXQgaXMgXCJubyBmbG9vciBpbiBwYXJ0aWN1bGFyXCIsIG5vdCBhIGZsb29yIHRoYXQgbm8gdGFnIGlzIG9uOlxuICAgIC8vIHJlYWQgYXMgYSBmbG9vciBpZCwgaXQgbWF0Y2hlZCBub3RoaW5nIGFuZCBoaWQgZXZlcnkgdGFnIHRoYXQgaGFzIGEgc3dlZXAuXG4gICAgY29uc3QgY3VycmVudEZsb29ySWQgPSBjdXJyZW50Rmxvb3JTZXF1ZW5jZSAhPT0gbnVsbCAmJiBjdXJyZW50Rmxvb3JTZXF1ZW5jZSA+PSAwXG4gICAgICA/IGN1cnJlbnRGbG9vclNlcXVlbmNlLnRvU3RyaW5nKClcbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbdGFnSWQsIG1hdHRlcnRhZ0RhdGFdIG9mIHRoaXMuZGljdGlvbm5hcnlUYWdzKSB7XG4gICAgICBpZiAodGFnSWQgPT09IG1hdHRlcnRhZ1RvRm9sbG93KSBjb250aW51ZTtcblxuICAgICAgY29uc3QgdGFnRmxvb3JJZCA9IHRoaXMuZ2V0Rmxvb3JJZEZvclRhZyhtYXR0ZXJ0YWdEYXRhLCBzd2VlcENvbGxlY3Rpb24pO1xuICAgICAgY29uc3QgaXNPbkN1cnJlbnRGbG9vciA9ICF0YWdGbG9vcklkIHx8ICFjdXJyZW50Rmxvb3JJZCB8fCB0YWdGbG9vcklkID09PSBjdXJyZW50Rmxvb3JJZDtcblxuICAgICAgbGV0IHRhcmdldE9wYWNpdHkgPSAwO1xuICAgICAgbGV0IHNob3VsZEJlRW5hYmxlZCA9IGZhbHNlO1xuXG4gICAgICAvLyBDYWxjdWxhdGlvbiBvZiBvcGFjaXR5IGFuZCBlbmFibGUgc3RhdHVzXG4gICAgICBpZiAoaXNPbkN1cnJlbnRGbG9vcikge1xuICAgICAgICBpZiAoIWlzSW50ZXJpb3JNb2RlKSB7XG4gICAgICAgICAgdGFyZ2V0T3BhY2l0eSA9IDE7XG4gICAgICAgICAgc2hvdWxkQmVFbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXRPcGFjaXR5ID0gMC45O1xuICAgICAgICAgIHNob3VsZEJlRW5hYmxlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEFwcGx5IGNoYW5nZXNcblxuICAgICAgLy8gVG9vbHRpcCBhbmQgY2xpY2sgbWFuYWdlbWVudFxuICAgICAgY29uc3QgdGFnTW9kdWxlID0gdGhpcy5nZXRUYWdNb2R1bGUoc2RrLCB0YWdJZCk7XG4gICAgICBjb25zdCBsYXN0RW5hYmxlZCA9IHRoaXMudGFnc0N1cnJlbnRFbmFibGVkLmdldCh0YWdJZCk7XG4gICAgICBpZiAobGFzdEVuYWJsZWQgIT09IHNob3VsZEJlRW5hYmxlZCkge1xuICAgICAgICB0aGlzLnRhZ3NDdXJyZW50RW5hYmxlZC5zZXQodGFnSWQsIHNob3VsZEJlRW5hYmxlZCk7XG4gICAgICAgIHByb21pc2VzLnB1c2godGFnTW9kdWxlLmFsbG93QWN0aW9uKHRhZ0lkLCB7XG4gICAgICAgICAgb3BlbmluZzogc2hvdWxkQmVFbmFibGVkLFxuICAgICAgICAgIG5hdmlnYXRpbmc6IHNob3VsZEJlRW5hYmxlZCxcbiAgICAgICAgICBkb2NraW5nOiBmYWxzZVxuICAgICAgICB9KS5jYXRjaCgoKSA9PiB7IH0pKTtcbiAgICAgIH1cbiAgICAgIC8vIE9wYWNpdHkgbWFuYWdlbWVudFxuICAgICAgY29uc3QgbGFzdE9wYWNpdHkgPSB0aGlzLnRhZ3NDdXJyZW50T3BhY2l0eS5nZXQodGFnSWQpID8/IC0xO1xuICAgICAgaWYgKE1hdGguYWJzKGxhc3RPcGFjaXR5IC0gdGFyZ2V0T3BhY2l0eSkgPiAwLjA1KSB7XG4gICAgICAgIHRoaXMudGFnc0N1cnJlbnRPcGFjaXR5LnNldCh0YWdJZCwgdGFyZ2V0T3BhY2l0eSk7XG4gICAgICAgIHByb21pc2VzLnB1c2godGFnTW9kdWxlLmVkaXRPcGFjaXR5KHRhZ0lkLCB0YXJnZXRPcGFjaXR5KS5jYXRjaCgoKSA9PiB7IH0pKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH1cblxuICAvKipcbiAgICogRHJvcHMgdGhlIG1lbW9pemVkIG9wYWNpdHkvZW5hYmxlZCBzdGF0ZSBzbyB0aGUgbmV4dCB2aXNpYmlsaXR5IHBhc3MgcmUtYXBwbGllcyBpdFxuICAgKiB0byBldmVyeSB0YWcuIE5lZWRlZCBhZnRlciBhIHZpZXcgc3dpdGNoIChmdXJuaXNoZWQgPC0+IGRlZnVybmlzaGVkKTogdGhlIFNES1xuICAgKiByZS1yZW5kZXJzIHRoZSBzaGFyZWQgbGF5ZXIncyB0YWdzIGFuZCB0aGUgY2FjaGVkIHZhbHVlcyB3b3VsZCBvdGhlcndpc2UgbWFrZVxuICAgKiB1cGRhdGVUYWdzVmlzaWJpbGl0eUZvckNvbnRleHQoKSBza2lwIHRoZW0sIGxlYXZpbmcgdGFncyBzdHVjayBpbnZpc2libGUuXG4gICAqL1xuICByZXNldFZpc2liaWxpdHlDYWNoZSgpOiB2b2lkIHtcbiAgICB0aGlzLnRhZ3NDdXJyZW50T3BhY2l0eS5jbGVhcigpO1xuICAgIHRoaXMudGFnc0N1cnJlbnRFbmFibGVkLmNsZWFyKCk7XG4gICAgdGhpcy50YWdzQ3VycmVudEljb24uY2xlYXIoKTtcbiAgfVxuXG4gIC8qKiBSZW1vdmVzIGEgc3BlY2lmaWMgdGFnIGZyb20gdGhlIHZpZXdlciBhbmQgbG9jYWwgZGljdGlvbmFyaWVzLiAqL1xuICBhc3luYyBkZWxldGVNYXR0ZXJ0YWdGcm9tSWQoc2RrOiBhbnksIG1hdHRlcnRhZ0lEOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKHNkaykgYXdhaXQgdGhpcy5nZXRUYWdNb2R1bGUoc2RrLCBtYXR0ZXJ0YWdJRCkucmVtb3ZlKG1hdHRlcnRhZ0lEKTtcbiAgICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLmRlbGV0ZShtYXR0ZXJ0YWdJRCk7XG4gICAgICB0aGlzLnRhZ3NDdXJyZW50SWNvbi5kZWxldGUobWF0dGVydGFnSUQpO1xuICAgICAgdGhpcy50YWdzQ3VycmVudE9wYWNpdHkuZGVsZXRlKG1hdHRlcnRhZ0lEKTtcbiAgICAgIHRoaXMudGFnc0N1cnJlbnRFbmFibGVkLmRlbGV0ZShtYXR0ZXJ0YWdJRCk7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMubWF0dGVydGFnSURzLmluZGV4T2YobWF0dGVydGFnSUQpO1xuICAgICAgaWYgKGluZGV4ID4gLTEpIHRoaXMubWF0dGVydGFnSURzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignQ2Fubm90IGRlbGV0ZSB0YWcnLCBtYXR0ZXJ0YWdJRCwgZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlbW92ZXMgdGhlIGxhc3QgYWRkZWQgdGFnIGZyb20gdGhlIHZpZXdlci4gKi9cbiAgYXN5bmMgZGVsZXRlTGFzdE1hdHRlcnRhZyhzZGs6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxhc3RTaWQgPSB0aGlzLmdldExhc3RUYWcoKTtcbiAgICBpZiAobGFzdFNpZCkgYXdhaXQgdGhpcy5kZWxldGVNYXR0ZXJ0YWdGcm9tSWQoc2RrLCBsYXN0U2lkKTtcbiAgfVxuXG4gIC8qKiBDbGVhcnMgYWxsIHRhZ3MgZnJvbSB0aGUgdmlld2VyIGFuZCByZXNldHMgbG9jYWwgc3RhdGUuICovXG4gIGFzeW5jIGFjdGlvbl9kZWxldGVfYWxsX21hdHRlcnRhZ3Moc2RrOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoc2RrKSB7XG4gICAgICBjb25zdCBzaWRzVG9SZW1vdmUgPSBbLi4udGhpcy5tYXR0ZXJ0YWdJRHNdO1xuICAgICAgZm9yIChjb25zdCBzaWQgb2Ygc2lkc1RvUmVtb3ZlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5nZXRUYWdNb2R1bGUoc2RrLCBzaWQpLnJlbW92ZShzaWQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7IH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIGNvbmZpZ3VyZXMgYSBNYXR0ZXJ0YWcgZnJvbSBhIFBPSSwgaGFuZGxpbmcgY29vcmRpbmF0ZXMsIG5vcm1hbHMsIGFuZCBzd2VlcCBJRC5cbiAgICogU2tpcHMgY3JlYXRpb24gaWYgYSB0YWcgZm9yIHRoZSBvYmplY3QgYWxyZWFkeSBleGlzdHMuXG4gICAqL1xuICBhc3luYyBjcmVhdGVNYXR0ZXJ0YWdGcm9tUE9JKFxuICAgIHNkazogYW55LFxuICAgIHRhZ1R5cGU6IFBvaVR5cGUsXG4gICAgb2JqZWN0OiBEYk9iamVjdFR5cGUsXG4gICAgcG9pOiBQT0ksXG4gICAgZ2V0VGFnRnJvbUVsZW1lbnRJZDogKGlkOiBzdHJpbmcpID0+IHsgdGFnOiBzdHJpbmc7IHN3ZWVwOiBzdHJpbmcgfSxcbiAgICBzZXRUYWdJY29uQW5kT3BhY2l0eTogKHNpZDogc3RyaW5nLCBtdDogTWF0dGVydGFnRGF0YSkgPT4gUHJvbWlzZTx2b2lkPixcbiAgICBpbmplY3RIdG1sSW5UYWc6ICh0eXBlOiBQb2lUeXBlLCBvYmo6IERiT2JqZWN0VHlwZSwgc2lkOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCB7IHRhZyB9ID0gZ2V0VGFnRnJvbUVsZW1lbnRJZChvYmplY3QuaWQpO1xuICAgIGlmICh0YWcpIHJldHVybjtcblxuICAgIGNvbnN0IG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEgPSBuZXcgTWF0dGVydGFnRGF0YSh0YWdUeXBlKTtcbiAgICBtYXR0ZXJ0YWdEYXRhLnNldE9iamVjdChvYmplY3QsIHRhZ1R5cGUpO1xuXG4gICAgaWYgKHBvaS5jb29yZGluYXRlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBtYXR0ZXJ0YWdEYXRhLnNldFBvc2l0aW9uKEpTT04ucGFyc2UocG9pLmNvb3JkaW5hdGUpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0Vycm9yIHBhcnNpbmcgUE9JIGNvb3JkaW5hdGVzJywgcG9pLmNvb3JkaW5hdGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwb2kubWV0YWRhdGEpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRhZ01ldGFkYXRhID0gSlNPTi5wYXJzZShwb2kubWV0YWRhdGEpO1xuICAgICAgICBtYXR0ZXJ0YWdEYXRhLnNldE5vcm1hbCh0YWdNZXRhZGF0YS5ub3JtYWwgfHwgeyB4OiAwLCB5OiAtMC4xNSwgejogMCB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbWF0dGVydGFnRGF0YS5zZXROb3JtYWwoeyB4OiAwLCB5OiAtMC4xNSwgejogMCB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocG9pLm1hdHRlcnBvcnRTd2VlcElEKSB7XG4gICAgICBtYXR0ZXJ0YWdEYXRhLnNldFN3ZWVwSUQocG9pLm1hdHRlcnBvcnRTd2VlcElEKTtcbiAgICB9XG4gICAgbWF0dGVydGFnRGF0YS5zZXRQb2kocG9pKTtcblxuICAgIGNvbnN0IGNyZWF0ZWRUYWdJRCA9IGF3YWl0IHRoaXMuYWRkTWF0dGVydGFnVG9WaWV3ZXIoc2RrLCBtYXR0ZXJ0YWdEYXRhKTtcblxuICAgIGlmIChjcmVhdGVkVGFnSUQgJiYgc2RrKSB7XG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JUYWdJblNkayhzZGssIGNyZWF0ZWRUYWdJRCk7XG4gICAgICBhd2FpdCBzZXRUYWdJY29uQW5kT3BhY2l0eShjcmVhdGVkVGFnSUQsIG1hdHRlcnRhZ0RhdGEpO1xuICAgICAgaW5qZWN0SHRtbEluVGFnKHRhZ1R5cGUsIG9iamVjdCwgY3JlYXRlZFRhZ0lEKS5jYXRjaChlcnIgPT4ge1xuICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignSFRNTCBpbmplY3Rpb24gZmFpbGVkIGZvcicsIGNyZWF0ZWRUYWdJRCwgZXJyKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVkVGFnSUQ7XG4gIH1cblxuICAvKiogVXBkYXRlcyB0aGUgaWNvbiwgb3BhY2l0eSwgYW5kIEhUTUwgY29udGVudCBvZiBhbiBleGlzdGluZyB0YWcuICovXG4gIGFzeW5jIHVwZGF0ZU1hdHRlclRhZ0NvbnRlbnRGb3JUYWdJRChcbiAgICBzZGs6IGFueSxcbiAgICBtYXR0ZXJ0YWdJRDogc3RyaW5nLFxuICAgIG9iamVjdDogRGJPYmplY3RUeXBlLFxuICAgIHBvaVR5cGU6IFBvaVR5cGUsXG4gICAgc2V0VGFnSWNvbkFuZE9wYWNpdHk6IChzaWQ6IHN0cmluZywgbXQ6IE1hdHRlcnRhZ0RhdGEpID0+IFByb21pc2U8dm9pZD4sXG4gICAgaW5qZWN0SHRtbEluVGFnOiAodHlwZTogUG9pVHlwZSwgb2JqOiBEYk9iamVjdFR5cGUsIHNpZDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgbWF0dGVydGFnRGF0YSA9IHRoaXMuZGljdGlvbm5hcnlUYWdzLmdldChtYXR0ZXJ0YWdJRCk7XG4gICAgaWYgKCFtYXR0ZXJ0YWdEYXRhKSByZXR1cm47XG5cbiAgICBpZiAob2JqZWN0KSB7XG4gICAgICBtYXR0ZXJ0YWdEYXRhLnNldE9iamVjdChvYmplY3QsIHBvaVR5cGUpO1xuICAgIH1cblxuICAgIGF3YWl0IHNldFRhZ0ljb25BbmRPcGFjaXR5KG1hdHRlcnRhZ0lELCBtYXR0ZXJ0YWdEYXRhKTtcbiAgICBhd2FpdCBpbmplY3RIdG1sSW5UYWcocG9pVHlwZSwgb2JqZWN0LCBtYXR0ZXJ0YWdJRCk7XG4gIH1cblxuICAvKiogUmVnaXN0ZXJzIGEgY3VzdG9tIHRleHR1cmUgYW5kIGFwcGxpZXMgaXQgdG8gYSB0YWcsIG9wdGlvbmFsbHkgYWRqdXN0aW5nIG9wYWNpdHkuICovXG4gIGFzeW5jIGFkZE5ld0ljb25BbmRTZXRGb3JUYWcoXG4gICAgc2RrOiBhbnksXG4gICAgbWF0dGVydGFnSUQ6IHN0cmluZyxcbiAgICBpY29uUGF0aDogc3RyaW5nLFxuICAgIGFwcGx5T3BhY2l0eTogYm9vbGVhbixcbiAgICBvcGFjaXR5OiBudW1iZXJcbiAgKSB7XG4gICAgaWYgKCFzZGspIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaWNvbk5hbWUgPSBgY3VzdG9tLWljb24tJHttYXR0ZXJ0YWdJRH1gO1xuICAgICAgY29uc3QgdGFnTW9kdWxlID0gdGhpcy5nZXRUYWdNb2R1bGUoc2RrLCBtYXR0ZXJ0YWdJRCk7XG4gICAgICBhd2FpdCBzZGsuQXNzZXQucmVnaXN0ZXJUZXh0dXJlKGljb25OYW1lLCBpY29uUGF0aCk7XG4gICAgICBhd2FpdCB0YWdNb2R1bGUuZWRpdEljb24obWF0dGVydGFnSUQsIGljb25OYW1lKTtcbiAgICAgIHRoaXMudGFnc0N1cnJlbnRJY29uLnNldChtYXR0ZXJ0YWdJRCwgaWNvbk5hbWUpO1xuXG4gICAgICBpZiAoYXBwbHlPcGFjaXR5KSB7XG4gICAgICAgIGF3YWl0IHRhZ01vZHVsZS5lZGl0T3BhY2l0eShtYXR0ZXJ0YWdJRCwgb3BhY2l0eSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdFcnJvciBzZXR0aW5nIGN1c3RvbSBpY29uIG9yIG9wYWNpdHknLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqIEZpbmRzIHRoZSB0YWcgSUQgYW5kIHN3ZWVwIElEIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIGVsZW1lbnQgSUQuICovXG4gIGdldFRhZ0Zyb21FbGVtZW50SWQoZWxlbWVudElEOiBzdHJpbmcsIHN3ZWVwczogc3RyaW5nW10gfCBudWxsKTogeyB0YWc6IHN0cmluZyB8IG51bGw7IHN3ZWVwOiBzdHJpbmcgfCBudWxsIH0ge1xuICAgIGxldCB0YWdJRCA9IG51bGw7XG4gICAgbGV0IHN3ZWVwSUQgPSBudWxsO1xuICAgIGZvciAobGV0IFttYXR0ZXJ0YWdJRCwgbWF0dGVydGFnRGF0YV0gb2YgdGhpcy5kaWN0aW9ubmFyeVRhZ3MpIHtcbiAgICAgIGlmIChtYXR0ZXJ0YWdEYXRhLmVsZW1lbnRJRCA9PT0gZWxlbWVudElEKSB7XG4gICAgICAgIHRhZ0lEID0gbWF0dGVydGFnSUQ7XG4gICAgICAgIGNvbnN0IHN3ZWVwID0gbWF0dGVydGFnRGF0YS5nZXRTd2VlcElEKCk7XG4gICAgICAgIGlmIChzd2VlcCAmJiBzd2VlcHMpIHtcbiAgICAgICAgICAvLyBzd2VlcCBpcyBhIHV1aWQ7IHN3ZWVwcyBhcnJheSBjb250YWlucyBzaWRzIOKAkyBjaGVjayBib3RoIGZvcm1hdHNcbiAgICAgICAgICBjb25zdCByZXNvbHZlZFNpZCA9IHRoaXMubmF2aWdhdGlvblNlcnZpY2UucmVzb2x2ZVN3ZWVwU2lkKHN3ZWVwKTtcbiAgICAgICAgICBpZiAoc3dlZXBzLmluY2x1ZGVzKHN3ZWVwKSB8fCBzd2VlcHMuaW5jbHVkZXMocmVzb2x2ZWRTaWQpKSB7XG4gICAgICAgICAgICBzd2VlcElEID0gc3dlZXA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHRhZzogdGFnSUQsIHN3ZWVwOiBzd2VlcElEIH07XG4gIH1cblxuICAvKiogUmV0cmlldmVzIHRoZSBmbG9vciBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCBhIHRhZyBiYXNlZCBvbiBpdHMgc3dlZXAgZGF0YS5cbiAgICogIEhhbmRsZXMgYm90aCB0aGUgb2JqZWN0IGZvcm0gKHsgZmxvb3JJbmZvOiB7IGlkLCBzZXF1ZW5jZSB9LCBmbG9vcjogeyBpZCB9IH0pXG4gICAqICBhbmQgdGhlIHByaW1pdGl2ZSBmb3JtIChmbG9vcjogbnVtYmVyKSB1c2VkIGJ5IE1hdHRlcnBvcnQgU0RLIHYzLlxuICAgKi9cbiAgZ2V0Rmxvb3JJZEZvclRhZyhtYXR0ZXJ0YWdEYXRhOiBNYXR0ZXJ0YWdEYXRhLCBzd2VlcENvbGxlY3Rpb246IGFueSk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IHN3ZWVwSWQgPSBtYXR0ZXJ0YWdEYXRhLmdldFN3ZWVwSUQoKTtcbiAgICBpZiAoIXN3ZWVwSWQgfHwgIXN3ZWVwQ29sbGVjdGlvbikgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBzd2VlcERhdGEgPSBzd2VlcENvbGxlY3Rpb25bc3dlZXBJZF07XG4gICAgaWYgKCFzd2VlcERhdGEpIHJldHVybiBudWxsO1xuXG4gICAgLy8gU0RLIHYzOiBzd2VlcC5mbG9vciBpcyBhIHByaW1pdGl2ZSBudW1iZXIgKHRoZSBzZXF1ZW5jZSBpbmRleClcbiAgICBpZiAodHlwZW9mIHN3ZWVwRGF0YS5mbG9vciA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBzd2VlcERhdGEuZmxvb3IudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICAvLyBPbGRlciAvIGV4dGVuZGVkIGZvcm1hdHNcbiAgICByZXR1cm4gc3dlZXBEYXRhPy5mbG9vckluZm8/LmlkXG4gICAgICA/PyBzd2VlcERhdGE/LmZsb29ySW5mbz8uc2VxdWVuY2U/LnRvU3RyaW5nKClcbiAgICAgID8/IHN3ZWVwRGF0YT8uZmxvb3JJZFxuICAgICAgPz8gc3dlZXBEYXRhPy5mbG9vcj8uaWRcbiAgICAgID8/IHN3ZWVwRGF0YT8uZmxvb3I/LnNlcXVlbmNlPy50b1N0cmluZygpXG4gICAgICA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEluamVjdHMgY3VzdG9tIEhUTUwgb3IgZmFsbGJhY2sgYmlsbGJvYXJkIG1lZGlhIGludG8gYSBNYXR0ZXJ0YWcgc2FuZGJveC5cbiAgICogQXR0YWNoZXMgZXZlbnQgbGlzdGVuZXJzIGZvciBpbnRlcmFjdGl2ZSBlbGVtZW50cyB3aXRoaW4gdGhlIHRhZy5cbiAgICovXG4gIGFzeW5jIGluamVjdEh0bWxJblRhZyhzZGs6IGFueSwgdGFnVHlwZTogUG9pVHlwZSwgb2JqZWN0OiBEYk9iamVjdFR5cGUsIHRhZ0lEOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMudGFnU2VydmljZSkge1xuICAgICAgY29uc29sZS5lcnJvcignW01hdHRlcnBvcnRUYWdTZXJ2aWNlXSB0YWdTZXJ2aWNlIGlzIG5vdCBpbml0aWFsaXplZC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGxldCBodG1sID0gYXdhaXQgdGhpcy50YWdTZXJ2aWNlLmdldEh0bWxUb0luamVjdCh0YWdUeXBlLCBvYmplY3QpO1xuXG4gICAgICBpZiAoaHRtbCAmJiBodG1sLnRyaW0oKS5sZW5ndGggPiAwICYmIHNkaykge1xuICAgICAgICBjb25zdCBzY3JpcHRUYWcgPSB0aGlzLnRhZ1NlcnZpY2UuZ2V0U2NyaXB0Rm9yVGFnKG9iamVjdCwgdGFnVHlwZSk7XG4gICAgICAgIGh0bWwgKz0gYCR7c2NyaXB0VGFnfWA7XG5cbiAgICAgICAgY29uc3QgdGFnTW9kdWxlID0gdGhpcy5nZXRUYWdNb2R1bGUoc2RrLCB0YWdJRCk7XG4gICAgICAgIGNvbnN0IFtzYW5kYm94SWQsIG1lc3Nlbmdlcl0gPSBhd2FpdCBzZGsuVGFnLnJlZ2lzdGVyU2FuZGJveChodG1sKTtcblxuICAgICAgICBjb25zdCBhdHRhY2htZW50SUQgPSB0aGlzLnRhZ3NBdHRhY2htZW50c1t0YWdJRF07XG4gICAgICAgIGlmIChhdHRhY2htZW50SUQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGFnTW9kdWxlLmRldGFjaCh0YWdJRCwgYXR0YWNobWVudElEKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7IH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGFnc0F0dGFjaG1lbnRzW3RhZ0lEXSA9IHNhbmRib3hJZDtcbiAgICAgICAgYXdhaXQgdGFnTW9kdWxlLmF0dGFjaCh0YWdJRCwgc2FuZGJveElkKTtcblxuICAgICAgICAvLyBBdHRhY2ggdGhlIFwiVmlldyBpbmZvcm1hdGlvbnNcIiBoYW5kbGVyIGluIHRvb2x0aXBcbiAgICAgICAgbWVzc2VuZ2VyLm9uKFRhZ0FjdGlvbi5ERVRBSUxfQ0xJQ0ssIHRoaXMudGFnU2VydmljZS5vbkFjdGlvbkRldGFpbENsaWNrLmJpbmQodGhpcy50YWdTZXJ2aWNlKSk7XG4gICAgICAgIG1lc3Nlbmdlci5vbihUYWdBY3Rpb24uVElDS0VUX0NMSUNLLCB0aGlzLnRhZ1NlcnZpY2Uub25BY3Rpb25EZXRhaWxDbGljay5iaW5kKHRoaXMudGFnU2VydmljZSkpO1xuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLkFVRElPX0NMSUNLLCAoYXVkaW9Db21tZW50SUQ6IHN0cmluZykgPT4gdGhpcy50YWdTZXJ2aWNlLm9uQWN0aW9uQXVkaW9DbGljayhhdWRpb0NvbW1lbnRJRCkpO1xuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLlZJREVPX0NMSUNLLCAodmlkZW9Vcmw6IHN0cmluZykgPT4gdGhpcy50YWdTZXJ2aWNlLm9uQWN0aW9uVmlkZW9DbGljayh2aWRlb1VybCkpO1xuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLklNQUdFX0NMSUNLLCAoaW1hZ2VDb21tZW50SUQ6IHN0cmluZykgPT4gdGhpcy50YWdTZXJ2aWNlLm9uQWN0aW9uSW1hZ2VDbGljayhpbWFnZUNvbW1lbnRJRCkpO1xuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLkRPQ19DTElDSywgKGRvY1VybDogc3RyaW5nKSA9PiB0aGlzLnRhZ1NlcnZpY2Uub25BY3Rpb25Eb2NDbGljayhkb2NVcmwpKTtcbiAgICAgICAgbWVzc2VuZ2VyLm9uKFRhZ0FjdGlvbi5ZT1VUVUJFX0NMSUNLLCAoeW91dHViZVVybDogc3RyaW5nKSA9PiB0aGlzLnRhZ1NlcnZpY2Uub25BY3Rpb25Zb3V0dWJlQ2xpY2soeW91dHViZVVybCkpO1xuICAgICAgfSBlbHNlIGlmIChzZGspIHtcbiAgICAgICAgY29uc3QgeyBjb21tZW50LCB0YWdEZXNjcmlwdGlvbiB9ID0gdGhpcy50YWdTZXJ2aWNlLmdldEJpbGxib2FyZE1lZGlhVG9FbWJlZChvYmplY3QpO1xuXG4gICAgICAgIGlmIChjb21tZW50KSB7XG4gICAgICAgICAgY29uc3QgdGFnTW9kdWxlID0gdGhpcy5nZXRUYWdNb2R1bGUoc2RrLCB0YWdJRCk7XG4gICAgICAgICAgLy8gMSkgUmVnaXN0ZXIgdGhlIG1lZGlhIGF0dGFjaG1lbnQgYnkgcGFzc2luZyB0aGUgVVJMIHN0cmluZyhzKS5cbiAgICAgICAgICAvLyAgICByZWdpc3RlckF0dGFjaG1lbnQgcmV0dXJucyBhbiBhcnJheSBvZiBhdHRhY2htZW50IElEcy5cbiAgICAgICAgICBjb25zdCBbYXR0YWNobWVudElEXSA9IGF3YWl0IHNkay5UYWcucmVnaXN0ZXJBdHRhY2htZW50KGNvbW1lbnQuZXh0ZXJuYWxMaW5rKTtcblxuICAgICAgICAgIC8vIDIpIEF0dGFjaCB0aGUgcmVnaXN0ZXJlZCBtZWRpYSB0byB0aGUgdGFnLlxuICAgICAgICAgIGF3YWl0IHRhZ01vZHVsZS5hdHRhY2godGFnSUQsIGF0dGFjaG1lbnRJRCk7XG5cbiAgICAgICAgICAvLyAzKSBEZXRlcm1pbmUgbWVkaWEgdHlwZSBmb3IgdGhlIGJpbGxib2FyZCAoUEhPVE8gb3IgVklERU8pLlxuICAgICAgICAgIC8vICAgIFVzZSBhIHNpbXBsZSBoZXVyaXN0aWM6IFlvdVR1YmUvVmltZW8gLT4gVklERU8sIG90aGVyd2lzZSBQSE9UTy5cbiAgICAgICAgICAvLyAgICBUaGUgU0RLIGV4cG9zZXMgTWVkaWFUeXBlIG9uIHRoZSBUYWcgbmFtZXNwYWNlLlxuICAgICAgICAgIGNvbnN0IGlzVmlkZW8gPSAveW91dHViZVxcLmNvbXx5b3V0dVxcLmJlfHZpbWVvXFwuY29tL2kudGVzdChjb21tZW50LmV4dGVybmFsTGluayk7XG4gICAgICAgICAgY29uc3QgbWVkaWFUeXBlID0gaXNWaWRlbyA/IHNkay5NYXR0ZXJ0YWcuTWVkaWFUeXBlLlZJREVPIDogc2RrLk1hdHRlcnRhZy5NZWRpYVR5cGUuUEhPVE87XG5cbiAgICAgICAgICAvLyA0KSBVcGRhdGUgdGhlIGJpbGxib2FyZCB0ZXh0IGFuZCBtZWRpYSB1c2luZyBlZGl0QmlsbGJvYXJkLlxuICAgICAgICAgIC8vICAgIGVkaXRCaWxsYm9hcmQgYWNjZXB0cyBQYXJ0aWFsPFRhZy5FZGl0YWJsZVByb3BlcnRpZXM+IHN1Y2ggYXMgbGFiZWwsIGRlc2NyaXB0aW9uLCBtZWRpYS5cbiAgICAgICAgICBhd2FpdCB0YWdNb2R1bGUuZWRpdEJpbGxib2FyZCh0YWdJRCwge1xuICAgICAgICAgICAgbGFiZWw6IG9iamVjdC50aXRsZSB8fCAnTWVkaWEnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHRhZ0Rlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgICAgICAgbWVkaWE6IHtcbiAgICAgICAgICAgICAgdHlwZTogbWVkaWFUeXBlLFxuICAgICAgICAgICAgICBzcmM6IGNvbW1lbnQuZXh0ZXJuYWxMaW5rLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIDUpIEtlZXAgYSBsb2NhbCByZWZlcmVuY2VcbiAgICAgICAgICB0aGlzLnRhZ3NBdHRhY2htZW50c1t0YWdJRF0gPSB7XG4gICAgICAgICAgICBhdHRhY2htZW50SUQsXG4gICAgICAgICAgICB0aXRsZTogb2JqZWN0LnRpdGxlIHx8ICdNZWRpYScsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdGFnRGVzY3JpcHRpb24gfHwgJycsXG4gICAgICAgICAgICBtZWRpYVNyYzogY29tbWVudC5leHRlcm5hbExpbmssXG4gICAgICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIEVycm9yIGluIGluamVjdEh0bWxJblRhZzonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqIENsZWFycyBhbGwgbG9jYWwgdGFnIGRhdGEgYW5kIHJlc2V0cyB0aGUgYWRkaXRpb24gcXVldWUuICovXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLmNsZWFyKCk7XG4gICAgdGhpcy50YWdzQ3VycmVudE9wYWNpdHkuY2xlYXIoKTtcbiAgICB0aGlzLnRhZ3NDdXJyZW50RW5hYmxlZC5jbGVhcigpO1xuICAgIHRoaXMudGFnc0N1cnJlbnRJY29uLmNsZWFyKCk7XG4gICAgdGhpcy5zdG9wT2JzZXJ2aW5nU2RrVGFncygpO1xuICAgIHRoaXMudGFnQWRkUXVldWUgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93ID0gbnVsbDtcbiAgICB0aGlzLm1hdHRlcnRhZ0lEcyA9IFtdO1xuICAgIC8vIEEgbmV3IHNwYWNlIG1lYW5zIGEgbmV3IFNESyBzZXNzaW9uLCBoZW5jZSBhIG5ldyBzaGFyZWQgbGF5ZXIgdG8gY3JlYXRlLlxuICAgIHRoaXMuc2hhcmVkVGFnTGF5ZXIgPSBudWxsO1xuICAgIHRoaXMuc2hhcmVkVGFnTGF5ZXJQcm9taXNlID0gbnVsbDtcbiAgfVxufVxuIl19
|