@smarterplan/ngx-smarterplan-core 1.4.17 → 1.4.18
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/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 +10 -1
- package/esm2022/lib/ngx-smarterplan-core.module.mjs +1 -1
- 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 +10 -3
- 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-object3d.service.mjs +1 -1
- package/esm2022/lib/services/matterport-pointer.service.mjs +6 -6
- package/esm2022/lib/services/matterport-tag-copy.service.mjs +455 -9
- package/esm2022/lib/services/matterport-tag.service.mjs +99 -10
- package/esm2022/lib/services/matterport.service.mjs +83 -48
- 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 +62 -50
- 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 +9 -5
- package/esm2022/lib/services/navigator.service.mjs +1 -1
- package/esm2022/lib/services/s3.service.mjs +1 -1
- package/esm2022/lib/services/search.service.mjs +1 -1
- package/esm2022/lib/services/support.service.mjs +1 -1
- package/esm2022/lib/services/tag.service.mjs +16 -16
- package/esm2022/lib/services/threejs-import.service.mjs +1 -1
- package/esm2022/lib/services/threejs.service.mjs +1 -1
- 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 +1 -1
- 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/types.service.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 +1 -1
- package/fesm2022/smarterplan-ngx-smarterplan-core.mjs +793 -193
- package/fesm2022/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
- package/lib/mattertagData.d.ts +4 -0
- package/lib/services/matterport-tag-copy.service.d.ts +128 -2
- package/lib/services/matterport-tag.service.d.ts +24 -1
- package/lib/services/matterport.service.d.ts +12 -3
- package/lib/services/models/poi.service.d.ts +1 -0
- package/package.json +1 -1
- package/src/assets/vs-app.json +67 -67
|
@@ -1584,4 +1584,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
1584
1584
|
providedIn: 'root'
|
|
1585
1585
|
}]
|
|
1586
1586
|
}], ctorParameters: () => [{ type: i0.NgZone }] });
|
|
1587
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyZWVqcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy90aHJlZWpzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDMUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUNuRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQW9EL0I7Ozs7OztHQU1HO0FBQ0gsU0FBUyxlQUFlLENBQUMsQ0FBZ0IsRUFBRSxDQUFnQixFQUFFLENBQWdCO0lBQzNFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUM7UUFDMUIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBRWYsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMs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QUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUIsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7d0dBeHBEVSxjQUFjOzRHQUFkLGNBQWMsY0FGYixNQUFNOzs0RkFFUCxjQUFjO2tCQUgxQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgT3JiaXRDb250cm9scyB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9jb250cm9scy9PcmJpdENvbnRyb2xzJztcbmltcG9ydCB7IE9CSkxvYWRlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL09CSkxvYWRlcic7XG5pbXBvcnQgeyBNVExMb2FkZXIgfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vbG9hZGVycy9NVExMb2FkZXInO1xuaW1wb3J0IHsgR0xURkxvYWRlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL0dMVEZMb2FkZXInO1xuaW1wb3J0IHsgS1RYMkxvYWRlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL0tUWDJMb2FkZXInO1xuaW1wb3J0IHsgTWVzaG9wdERlY29kZXIgfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vbGlicy9tZXNob3B0X2RlY29kZXIubW9kdWxlLmpzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRocmVlSnNBbGlnbm1lbnQgfSBmcm9tICcuLi9oZWxwZXJzLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9pVHlwZSB9IGZyb20gJy4uL3R5cGVzLnNlcnZpY2UnO1xuXG4vKipcbiAqIEEgdGFnIHRvIGRyYXcgaW4gdGhlIFRocmVlLmpzIHNjZW5lLCBtaXJyb3JpbmcgYSBNYXR0ZXJ0YWcuXG4gKlxuICogUG9zaXRpb25zIGFyZSBpbiB0aGUgbW9kZWwncyBvd24gY29vcmRpbmF0ZSBzcGFjZSAtIHRoZSBzYW1lIG51bWJlcnMgc3RvcmVkIGluIFBPSS5jb29yZGluYXRlIC1cbiAqIG5vdCBzY2VuZSBzcGFjZS4gVGhlIHNlcnZpY2UgcmVwYXJlbnRzIHRhZ3MgdW5kZXIgdGhlIG1vZGVsIHNvIHRoZXkgaW5oZXJpdCB0aGUgY2VudGVyaW5nIGFuZFxuICogc2NhbGluZyBhcHBsaWVkIGF0IGxvYWQsIHdoaWNoIG1lYW5zIGNhbGxlcnMgbmV2ZXIgZGVhbCB3aXRoIHRoYXQgdHJhbnNmb3JtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRocmVlSnNUYWcge1xuICAvKiogVGhlIHRhZ2dlZCBlbGVtZW50J3MgaWQgKFBPSS5lbGVtZW50SUQpLCB1c2VkIHRvIHVwZGF0ZSBvciByZW1vdmUgdGhlIHRhZyBsYXRlci4gKi9cbiAgaWQ6IHN0cmluZztcbiAgcG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xuICAvKiogRHJpdmVzIGJvdGggdGhlIGNsaWNrIHJvdXRlIGFuZCB0eXBlIGZpbHRlcmluZywgc28gaXQgdHJhdmVscyB3aXRoIHRoZSB0YWcuICovXG4gIHBvaVR5cGU/OiBQb2lUeXBlIHwgbnVsbDtcbiAgLyoqIFNob3duIG9uIGhvdmVyLiBBIG1hcmtlciB3aXRoIG5vIGlkZW50aXR5IGlzIGp1c3QgYSBkb3Qgb24gYSB3YWxsLiAqL1xuICBsYWJlbD86IHN0cmluZyB8IG51bGw7XG4gIC8qKiBJY29uIGRyYXduIG9uIHRoZSB0YWcuIEZhbGxzIGJhY2sgdG8gYSBwbGFpbiBkaXNjIHdoZW4gYWJzZW50IG9yIGl0IGZhaWxzIHRvIGxvYWQuICovXG4gIGljb25Vcmw/OiBzdHJpbmcgfCBudWxsO1xuICAvKiogVGludCBmb3IgdGhlIGZhbGxiYWNrIGRpc2MsIGFzIGEgQ1NTIGNvbG91ci4gKi9cbiAgY29sb3I/OiBzdHJpbmc7XG59XG5cbi8qKiBXaGF0IGEgY2xpY2sgb24gYSB0YWcgcmVwb3J0czogZW5vdWdoIHRvIHJvdXRlIHRvIHRoZSBlbGVtZW50J3MgZGV0YWlsIHBhZ2UuICovXG5leHBvcnQgaW50ZXJmYWNlIFRocmVlSnNUYWdDbGljayB7XG4gIGVsZW1lbnRJZDogc3RyaW5nO1xuICBwb2lUeXBlOiBQb2lUeXBlIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBBIHNwb3QgcGlja2VkIG9uIHRoZSBtb2RlbCBmb3IgYSBuZXcgdGFnLlxuICpcbiAqIEJvdGggdmVjdG9ycyBhcmUgaW4gdGhlIG1vZGVsJ3Mgb3duIGNvb3JkaW5hdGUgc3BhY2UsIHdoaWNoIGlzIHdoYXQgUE9JLmNvb3JkaW5hdGUgc3RvcmVzLiBTY2VuZVxuICogY29vcmRpbmF0ZXMgZGVsaWJlcmF0ZWx5IG5ldmVyIGxlYXZlIHRoaXMgc2VydmljZTogdGhlIG1vZGVsIGlzIHNjYWxlZCB0byBhIGZpeGVkIHNpemUgb24gbG9hZCwgc29cbiAqIGEgc2NlbmUtc3BhY2UgcG9zaXRpb24gd291bGQgc2lsZW50bHkgbWVhbiBzb21ld2hlcmUgZWxzZSB0aGUgbW9tZW50IHRoZSAuZ2xiIGlzIHJlLWV4cG9ydGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRocmVlSnNUYWdQbGFjZW1lbnQge1xuICBwb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XG4gIC8qKiBTdXJmYWNlIG5vcm1hbCBhdCB0aGUgcGlja2VkIHBvaW50IC0gTWF0dGVycG9ydCBzdG9yZXMgdGhlIHNhbWUgdGhpbmcgaW4gUE9JLm1ldGFkYXRhLiAqL1xuICBub3JtYWw6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xuICAvKiogV2hhdCB0aGUgcGxhY2VtZW50IHdhcyBhcm1lZCBmb3IsIHNvIHRoZSBjYWxsZXIga25vd3Mgd2hpY2ggY3JlYXRpb24gZm9ybSB0byBvcGVuLiAqL1xuICBwb2lUeXBlPzogUG9pVHlwZSB8IG51bGw7XG59XG5cbi8qKiBPbmUgdGFnIHNlZW4gaW4gYm90aCBzcGFjZXM6IHdoZXJlIGl0IGlzIHN0b3JlZCwgYW5kIHdoZXJlIGl0IHJlYWxseSBzaXRzIG9uIHRoZSBtb2RlbC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc0FsaWdubWVudFBhaXIge1xuICBzb3VyY2U6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xuICB0YXJnZXQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhbiBvcnRob25vcm1hbCBmcmFtZSBmcm9tIHRocmVlIHBvaW50cywgb3IgbnVsbCB3aGVuIHRoZXkgYXJlIChuZWFybHkpIGNvbGxpbmVhci5cbiAqXG4gKiBUaHJlZSBwb2ludHMgZGVmaW5lIGEgcGxhbmUsIGFuZCBhIHBsYW5lIHBsdXMgYW4gb3JpZ2luIGRlZmluZXMgYW4gb3JpZW50YXRpb24uIENvbGxpbmVhciBwb2ludHNcbiAqIGRvIG5vdDogdGhleSBsZWF2ZSB0aGUgcm90YXRpb24gYWJvdXQgdGhlaXIgY29tbW9uIGxpbmUgdW5kZXRlcm1pbmVkLCB3aGljaCBpcyB3aHkgdGhlIGNhbGxlciBoYXNcbiAqIHRvIHJlamVjdCB0aGVtIHJhdGhlciB0aGFuIHByb2R1Y2UgYSBjb25maWRlbnQgd3JvbmcgYW5zd2VyLlxuICovXG5mdW5jdGlvbiBmcmFtZUZyb21Qb2ludHMoYTogVEhSRUUuVmVjdG9yMywgYjogVEhSRUUuVmVjdG9yMywgYzogVEhSRUUuVmVjdG9yMyk6IFRIUkVFLk1hdHJpeDQgfCBudWxsIHtcbiAgY29uc3QgZTEgPSBiLmNsb25lKCkuc3ViKGEpO1xuICBpZiAoZTEubGVuZ3RoU3EoKSA8IDFlLTEyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZTEubm9ybWFsaXplKCk7XG5cbiAgY29uc3QgdG9DID0gYy5jbG9uZSgpLnN1YihhKTtcbiAgY29uc3QgZTIgPSB0b0MuY2xvbmUoKS5zdWIoZTEuY2xvbmUoKS5tdWx0aXBseVNjYWxhcih0b0MuZG90KGUxKSkpO1xuICBpZiAoZTIubGVuZ3RoU3EoKSA8IDFlLTEyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZTIubm9ybWFsaXplKCk7XG5cbiAgcmV0dXJuIG5ldyBUSFJFRS5NYXRyaXg0KCkubWFrZUJhc2lzKGUxLCBlMiwgZTEuY2xvbmUoKS5jcm9zcyhlMikpO1xufVxuXG4vKipcbiAqIFNvbHZlcyB0aGUgdHJhbnNmb3JtIHRoYXQgbWFwcyBzdG9yZWQgdGFnIGNvb3JkaW5hdGVzIG9udG8gdGhlIGxvYWRlZCBtb2RlbC5cbiAqXG4gKiBUYWtlcyBleGFjdGx5IHRoZSBjb3JyZXNwb25kZW5jZXMgYSBwZXJzb24gY2FuIHByb2R1Y2UgYnkgaGFuZDogdGhyZWUgdGFncywgZWFjaCBwb2ludGVkIGF0IHR3aWNlXG4gKiAtIG9uY2Ugd2hlcmUgaXQgY3VycmVudGx5IHNpdHMsIG9uY2Ugd2hlcmUgaXQgYmVsb25ncy4gVGhhdCBpcyB0aGUgbWluaW11bSB0aGF0IHBpbnMgZG93biBhbGxcbiAqIHRocmVlIHBhcnRzIG9mIHRoZSBhbnN3ZXIuIE9uZSBwYWlyIGZpeGVzIG9ubHkgdHJhbnNsYXRpb247IHR3byBsZWF2ZSB0aGUgcm90YXRpb24gYWJvdXQgdGhlIGxpbmVcbiAqIGJldHdlZW4gdGhlbSBmcmVlOyB0aHJlZSByZXNvbHZlIGl0LlxuICpcbiAqIFJldHVybnMgbnVsbCB3aGVuIHRoZSBwb2ludHMgYXJlIGNvbGxpbmVhciBvciBkZWdlbmVyYXRlLCBiZWNhdXNlIGEgd3JvbmcgYWxpZ25tZW50IGFwcGxpZWRcbiAqIHNpbGVudGx5IGlzIHdvcnNlIHRoYW4gbm9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvbHZlVGhyZWVKc0FsaWdubWVudChwYWlyczogVGhyZWVKc0FsaWdubWVudFBhaXJbXSk6IFRocmVlSnNBbGlnbm1lbnQgfCBudWxsIHtcbiAgaWYgKCFwYWlycyB8fCBwYWlycy5sZW5ndGggPCAzKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBzb3VyY2VzID0gcGFpcnMuc2xpY2UoMCwgMykubWFwKChwYWlyKSA9PiBuZXcgVEhSRUUuVmVjdG9yMyhwYWlyLnNvdXJjZS54LCBwYWlyLnNvdXJjZS55LCBwYWlyLnNvdXJjZS56KSk7XG4gIGNvbnN0IHRhcmdldHMgPSBwYWlycy5zbGljZSgwLCAzKS5tYXAoKHBhaXIpID0+IG5ldyBUSFJFRS5WZWN0b3IzKHBhaXIudGFyZ2V0LngsIHBhaXIudGFyZ2V0LnksIHBhaXIudGFyZ2V0LnopKTtcblxuICBjb25zdCBzb3VyY2VGcmFtZSA9IGZyYW1lRnJvbVBvaW50cyhzb3VyY2VzWzBdLCBzb3VyY2VzWzFdLCBzb3VyY2VzWzJdKTtcbiAgY29uc3QgdGFyZ2V0RnJhbWUgPSBmcmFtZUZyb21Qb2ludHModGFyZ2V0c1swXSwgdGFyZ2V0c1sxXSwgdGFyZ2V0c1syXSk7XG4gIGlmICghc291cmNlRnJhbWUgfHwgIXRhcmdldEZyYW1lKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBBIHJvdGF0aW9uJ3MgaW52ZXJzZSBpcyBpdHMgdHJhbnNwb3NlLCBzbyB0aGlzIGlzIHRoZSByb3RhdGlvbiBjYXJyeWluZyBvbmUgZnJhbWUgb250byB0aGUgb3RoZXIuXG4gIGNvbnN0IHJvdGF0aW9uID0gdGFyZ2V0RnJhbWUubXVsdGlwbHkoc291cmNlRnJhbWUuY2xvbmUoKS50cmFuc3Bvc2UoKSk7XG5cbiAgLy8gU2NhbGUgZnJvbSBob3cgZmFyIGFwYXJ0IHRoZSBwb2ludHMgYXJlIGluIGVhY2ggc3BhY2UsIGF2ZXJhZ2VkIG92ZXIgdGhlIHRocmVlIGVkZ2VzIHNvIGEgc2luZ2xlXG4gIC8vIHNsb3BweSBjbGljayBkb2VzIG5vdCBzZXQgaXQgb24gaXRzIG93bi5cbiAgY29uc3QgZWRnZXMgPSBbWzAsIDFdLCBbMSwgMl0sIFswLCAyXV07XG4gIGxldCByYXRpb1N1bSA9IDA7XG4gIGxldCByYXRpb0NvdW50ID0gMDtcbiAgZm9yIChjb25zdCBbaSwgal0gb2YgZWRnZXMpIHtcbiAgICBjb25zdCBzb3VyY2VMZW5ndGggPSBzb3VyY2VzW2ldLmRpc3RhbmNlVG8oc291cmNlc1tqXSk7XG4gICAgY29uc3QgdGFyZ2V0TGVuZ3RoID0gdGFyZ2V0c1tpXS5kaXN0YW5jZVRvKHRhcmdldHNbal0pO1xuICAgIGlmIChzb3VyY2VMZW5ndGggPiAxZS05KSB7XG4gICAgICByYXRpb1N1bSArPSB0YXJnZXRMZW5ndGggLyBzb3VyY2VMZW5ndGg7XG4gICAgICByYXRpb0NvdW50ICs9IDE7XG4gICAgfVxuICB9XG4gIGlmIChyYXRpb0NvdW50ID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3Qgc2NhbGUgPSByYXRpb1N1bSAvIHJhdGlvQ291bnQ7XG5cbiAgLy8gVGhlIGdyb3VwIGFwcGxpZXMgcG9zaXRpb24sIHRoZW4gcm90YXRpb24sIHRoZW4gc2NhbGUsIHNvIGEgcG9pbnQgbGFuZHMgYXQgdCArIHMqUipwLiBTb2x2aW5nXG4gIC8vIHRoYXQgZm9yIHQgYXQgdGhlIGNlbnRyb2lkcyBnaXZlcyB0aGUgdHJhbnNsYXRpb24uXG4gIGNvbnN0IHNvdXJjZUNlbnRyb2lkID0gc291cmNlcy5yZWR1Y2UoKHN1bSwgdikgPT4gc3VtLmFkZCh2KSwgbmV3IFRIUkVFLlZlY3RvcjMoKSkubXVsdGlwbHlTY2FsYXIoMSAvIDMpO1xuICBjb25zdCB0YXJnZXRDZW50cm9pZCA9IHRhcmdldHMucmVkdWNlKChzdW0sIHYpID0+IHN1bS5hZGQodiksIG5ldyBUSFJFRS5WZWN0b3IzKCkpLm11bHRpcGx5U2NhbGFyKDEgLyAzKTtcbiAgY29uc3QgdHJhbnNsYXRpb24gPSB0YXJnZXRDZW50cm9pZFxuICAgIC5jbG9uZSgpXG4gICAgLnN1Yihzb3VyY2VDZW50cm9pZC5jbG9uZSgpLmFwcGx5TWF0cml4NChyb3RhdGlvbikubXVsdGlwbHlTY2FsYXIoc2NhbGUpKTtcblxuICBjb25zdCBldWxlciA9IG5ldyBUSFJFRS5FdWxlcigpLnNldEZyb21Sb3RhdGlvbk1hdHJpeChyb3RhdGlvbik7XG5cbiAgcmV0dXJuIHtcbiAgICB0cmFuc2xhdGlvbjogeyB4OiB0cmFuc2xhdGlvbi54LCB5OiB0cmFuc2xhdGlvbi55LCB6OiB0cmFuc2xhdGlvbi56IH0sXG4gICAgcm90YXRpb246IHsgeDogZXVsZXIueCwgeTogZXVsZXIueSwgejogZXVsZXIueiB9LFxuICAgIHNjYWxlLFxuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9iakFkZGVkIHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBmaWxlOiBzdHJpbmc7IC8vIFRoZSBVUkwgdG8gdGhlIC5vYmogZmlsZVxuICBwb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XG4gIHJvdGF0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfTtcbiAgc2NhbGU6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xufVxuXG5pbnRlcmZhY2UgUGFyc2VkTWVzaEdyb3VwIHtcbiAgc3RhcnQ6IG51bWJlcjtcbiAgY291bnQ6IG51bWJlcjtcbiAgbWF0ZXJpYWxJbmRleDogbnVtYmVyO1xufVxuXG4vKiogUmF3IGdlb21ldHJ5IGRhdGEgZXh0cmFjdGVkIGZyb20gYSBwYXJzZWQgT0JKIG1lc2gsIHNlbnQgYmFjayBieSB0aGUgcGFyc2VyIHdvcmtlci4gKi9cbmludGVyZmFjZSBQYXJzZWRNZXNoRGF0YSB7XG4gIG5hbWU6IHN0cmluZztcbiAgLy8gT25lIG5hbWUgcGVyIG1hdGVyaWFsIHVzZWQgYnkgdGhpcyBtZXNoLiBBIHNpbmdsZS1tYXRlcmlhbCBtZXNoIGhhcyBvbmUgZW50cnk7XG4gIC8vIGEgbWVzaCB3aXRoIG11bHRpcGxlIHVzZW10bCBzd2l0Y2hlcyAoZ2VvbWV0cnkuZ3JvdXBzKSBoYXMgb25lIHBlciBncm91cC5cbiAgbWF0ZXJpYWxOYW1lczogc3RyaW5nW107XG4gIGdyb3VwczogUGFyc2VkTWVzaEdyb3VwW10gfCBudWxsO1xuICBwb3NpdGlvbjogRmxvYXQzMkFycmF5O1xuICBub3JtYWw6IEZsb2F0MzJBcnJheSB8IG51bGw7XG4gIHV2OiBGbG9hdDMyQXJyYXkgfCBudWxsO1xuICBpbmRleDogVWludDMyQXJyYXkgfCBudWxsO1xuICBib3VuZGluZ0JveD86IHsgbWluOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl07IG1heDogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIH07XG59XG5cbmludGVyZmFjZSBPYmpQYXJzZXJXb3JrZXJSZXNwb25zZSB7XG4gIHJlcXVlc3RJZDogc3RyaW5nO1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBtZXNoZXM/OiBQYXJzZWRNZXNoRGF0YVtdO1xuICBlcnJvcj86IHN0cmluZztcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgVGhyZWVKc1NlcnZpY2Uge1xuICBwcml2YXRlIHNjZW5lITogVEhSRUUuU2NlbmU7XG4gIHByaXZhdGUgY2FtZXJhITogVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmE7XG4gIHByaXZhdGUgcmVuZGVyZXIhOiBUSFJFRS5XZWJHTFJlbmRlcmVyO1xuICBwcml2YXRlIGNvbnRyb2xzITogT3JiaXRDb250cm9scztcbiAgcHJpdmF0ZSBhbmltYXRpb25GcmFtZUlkITogbnVtYmVyO1xuXG4gIC8vIFJheWNhc3RpbmcgYW5kIGludGVyYWN0aW9uXG4gIHByaXZhdGUgcmF5Y2FzdGVyID0gbmV3IFRIUkVFLlJheWNhc3RlcigpO1xuICBwcml2YXRlIG1vdXNlID0gbmV3IFRIUkVFLlZlY3RvcjIoKTtcbiAgcHJpdmF0ZSBpc0RyYWdnaW5nQ2FtZXJhOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgaXNEcmFnZ2luZ1RpbWVyOiBhbnk7XG4gIHByaXZhdGUgY2xpY2thYmxlT2JqZWN0czogVEhSRUUuT2JqZWN0M0RbXSA9IFtdO1xuXG4gIC8vIE9ic2VydmFibGVzIGZvciB0aGUgdmlld2VyIGNvbXBvbmVudFxuICBwdWJsaWMgb2JqZWN0SG92ZXJlZCQgPSBuZXcgU3ViamVjdDx7IGlkOiBzdHJpbmc7IGV2ZW50OiBNb3VzZUV2ZW50IH0gfCBudWxsPigpO1xuICBwdWJsaWMgb2JqZWN0Q2xpY2tlZCQgPSBuZXcgU3ViamVjdDxzdHJpbmcgfCBudWxsPigpO1xuXG4gIC8qKiBFbWl0cyB3aGVuIHRoZSB1c2VyIGNsaWNrcyBhIHRhZywgbWlycm9yaW5nIE1hdHRlcnBvcnQncyB0YWcgY2xpY2suICovXG4gIHB1YmxpYyB0YWdDbGlja2VkJCA9IG5ldyBTdWJqZWN0PFRocmVlSnNUYWdDbGljaz4oKTtcblxuICAvKiogRW1pdHMgYSB0YWcncyBsYWJlbCB3aGlsZSB0aGUgcG9pbnRlciBpcyBvdmVyIGl0LCBhbmQgbnVsbCB3aGVuIGl0IGxlYXZlcy4gKi9cbiAgcHVibGljIHRhZ0hvdmVyZWQkID0gbmV3IFN1YmplY3Q8eyBsYWJlbDogc3RyaW5nOyBldmVudDogTW91c2VFdmVudCB9IHwgbnVsbD4oKTtcblxuICAvLyBUYWdzIGxpdmUgdW5kZXIgdGhlIG1vZGVsIHJhdGhlciB0aGFuIHRoZSBzY2VuZSwgc28gdGhlIGNlbnRlcmluZyBhbmQgc2NhbGluZyBhcHBsaWVkIHdoZW4gdGhlXG4gIC8vIG1vZGVsIGlzIHBsYWNlZCBjYXJyaWVzIG92ZXIgYW5kIFBPSSBjb29yZGluYXRlcyBjYW4gc3RheSBpbiB0aGUgbW9kZWwncyBvd24gc3BhY2UuXG4gIHByaXZhdGUgdGFnR3JvdXAgPSBuZXcgVEhSRUUuR3JvdXAoKTtcbiAgcHJpdmF0ZSB0YWdTcHJpdGVzID0gbmV3IE1hcDxzdHJpbmcsIFRIUkVFLlNwcml0ZT4oKTtcblxuICBwcml2YXRlIGNhbnZhc1Jlc2l6ZU9ic2VydmVyPzogUmVzaXplT2JzZXJ2ZXI7XG5cbiAgLyoqIEFib3J0cyB0aGUgaW4tZmxpZ2h0IG1vZGVsIGRvd25sb2FkLiBQYXJzaW5nIGNhbm5vdCBiZSBpbnRlcnJ1cHRlZCwgb25seSBub3Qgc3RhcnRlZC4gKi9cbiAgcHJpdmF0ZSBsb2FkQWJvcnRDb250cm9sbGVyPzogQWJvcnRDb250cm9sbGVyO1xuXG4gIC8vIFRoZSBsb2FkZWQgYmFzZSBtb2RlbCwga2VwdCBzbyB0YWcgcGxhY2VtZW50IGNhbiByYXljYXN0IGFnYWluc3QgaXRzIGdlb21ldHJ5LlxuICBwcml2YXRlIG1vZGVsUm9vdD86IFRIUkVFLk9iamVjdDNEO1xuXG4gIC8qKiBUcnVlIHdoaWxlIHRoZSBuZXh0IGNsaWNrIG9uIHRoZSBtb2RlbCBwbGFjZXMgYSB0YWcgaW5zdGVhZCBvZiBvcmJpdGluZy4gKi9cbiAgcHJpdmF0ZSBwbGFjaW5nVGFnID0gZmFsc2U7XG5cbiAgLyoqIFdoYXQgdGhlIGFybWVkIHBsYWNlbWVudCBpcyBmb3IsIGVjaG9lZCBiYWNrIHdoZW4gdGhlIHNwb3QgaXMgcGlja2VkLiAqL1xuICBwcml2YXRlIHBsYWNlbWVudFBvaVR5cGU6IFBvaVR5cGUgfCBudWxsID0gbnVsbDtcblxuICAvKiogUG9zaXRpb24gYW5kIG5vcm1hbCBvZiB0aGUgbGFzdCBwbGFjZWQgdGFnLCBpbiBtb2RlbCBzcGFjZSwgYXdhaXRpbmcgY29tbWl0IHRvIGEgUE9JLiAqL1xuICBwcml2YXRlIHBlbmRpbmdUYWdQbGFjZW1lbnQ6IFRocmVlSnNUYWdQbGFjZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICAvKiogUG9pbnRlciBwb3NpdGlvbiB3YWl0aW5nIGZvciBhIHByZXZpZXcgcGljaywgY29hbGVzY2VkIHRvIG9uZSBwZXIgZnJhbWUuICovXG4gIHByaXZhdGUgcGVuZGluZ1ByZXZpZXdFdmVudDogTW91c2VFdmVudCB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBMYXllciBjYXJyeWluZyB0aGUgbW9kZWwgYWxvbmUsIHNvIHRoZSBkZXB0aCBwaWNrIGNhbiByZW5kZXIgaXQgd2l0aG91dCB0aGUgdGFncy5cbiAgICpcbiAgICogTGF5ZXJzIGFyZSB0ZXN0ZWQgcGVyIG9iamVjdCBhdCByZW5kZXIgdGltZSBhbmQgY2hpbGRyZW4gYXJlIHRyYXZlcnNlZCByZWdhcmRsZXNzIG9mIHdoZXRoZXJcbiAgICogdGhlaXIgcGFyZW50IHBhc3NlZCwgc28gbWFya2luZyB0aGUgbW9kZWwncyBvd24gbWVzaGVzIGlzIGVub3VnaCAtIG5vIHJlLXBhcmVudGluZy5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFBJQ0tfTEFZRVIgPSAxO1xuXG4gIC8qKiBDYWNoZSBTdG9yYWdlIGJ1Y2tldCBob2xkaW5nIGRvd25sb2FkZWQgbW9kZWxzLCBhbmQgaG93IG1hbnkgdG8ga2VlcC4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTU9ERUxfQ0FDSEUgPSAnc21hcnRlcnBsYW4tM2QtbW9kZWxzJztcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNT0RFTF9DQUNIRV9TSVpFID0gMztcblxuICBwcml2YXRlIHBpY2tUYXJnZXQ/OiBUSFJFRS5XZWJHTFJlbmRlclRhcmdldDtcblxuICBwcml2YXRlIHBpY2tDYW1lcmE/OiBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYTtcblxuICBwcml2YXRlIHBpY2tEZXB0aE1hdGVyaWFsPzogVEhSRUUuTWVzaERlcHRoTWF0ZXJpYWw7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwaWNrUGl4ZWwgPSBuZXcgVWludDhBcnJheSg0KTtcblxuICAvKiogRW1pdHMgb25jZSBhIHRhZyBpcyBkcm9wcGVkIG9uIHRoZSBtb2RlbCwgc28gdGhlIFVJIGNhbiBjb25maXJtIGFuZCBwZXJzaXN0IGl0LiAqL1xuICBwdWJsaWMgdGFnUGxhY2VkJCA9IG5ldyBTdWJqZWN0PFRocmVlSnNUYWdQbGFjZW1lbnQ+KCk7XG5cbiAgLyoqIEVtaXRzIHdoZW4gdGhlIGNhbGlicmF0aW9uIHdhbGt0aHJvdWdoIGlzIGFiYW5kb25lZCwgc28gdGhlIHBhbmVsIGRyaXZpbmcgaXQgY2FuIGNsb3NlLiAqL1xuICBwdWJsaWMgYWxpZ25tZW50Q2FuY2VsbGVkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLyoqIFRyYW5zbHVjZW50IG1hcmtlciBzaG93biB1bmRlciB0aGUgY3Vyc29yIHdoaWxlIHBsYWNpbmcuICovXG4gIHByaXZhdGUgcGxhY2VtZW50UHJldmlldz86IFRIUkVFLlNwcml0ZTtcblxuICBwcml2YXRlIGFsaWduaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgYWxpZ25tZW50UGFpcnM6IFRocmVlSnNBbGlnbm1lbnRQYWlyW10gPSBbXTtcbiAgcHJpdmF0ZSBhbGlnbm1lbnRTb3VyY2U6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIERyaXZlcyB0aGUgYWxpZ25tZW50IHdhbGt0aHJvdWdoJ3MgVUk6IGhvdyBtYW55IHBhaXJzIGFyZSBkb25lIGFuZCB3aGF0IGl0IHdhbnRzIG5leHQuICovXG4gIHB1YmxpYyBhbGlnbm1lbnRQcm9ncmVzcyQgPSBuZXcgU3ViamVjdDx7XG4gICAgcGFpcnM6IG51bWJlcjtcbiAgICBhd2FpdGluZzogJ3RhZycgfCAncG9pbnQnIHwgbnVsbDtcbiAgICB0YWdJZD86IHN0cmluZztcbiAgfT4oKTtcblxuICAvKiogSW4tZmxpZ2h0IGNhbWVyYSBtb3ZlIHN0YXJ0ZWQgYnkgZ29Ub1RhZywgYWR2YW5jZWQgYnkgdGhlIHJlbmRlciBsb29wLiAqL1xuICBwcml2YXRlIGNhbWVyYVR3ZWVuOiB7XG4gICAgZnJvbVBvc2l0aW9uOiBUSFJFRS5WZWN0b3IzO1xuICAgIHRvUG9zaXRpb246IFRIUkVFLlZlY3RvcjM7XG4gICAgZnJvbVRhcmdldDogVEhSRUUuVmVjdG9yMztcbiAgICB0b1RhcmdldDogVEhSRUUuVmVjdG9yMztcbiAgICBzdGFydGVkQXQ6IG51bWJlcjtcbiAgICBkdXJhdGlvbk1zOiBudW1iZXI7XG4gIH0gfCBudWxsID0gbnVsbDtcblxuICAvKiogRW1pdHMgdHJ1ZSB3aGlsZSBhIGhlYXZ5IE9CSiBmaWxlIGlzIGJlaW5nIHBhcnNlZCAoaW4gYSB3b3JrZXIsIHdoZW4gYXZhaWxhYmxlKSwgZmFsc2Ugb25jZSBkb25lLiAqL1xuICBwdWJsaWMgbW9kZWxMb2FkaW5nJCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG5cbiAgLyoqXG4gICAqIERvd25sb2FkIHByb2dyZXNzIGZvciBHTEIgbW9kZWxzLCBhcyBhIDAtMSBmcmFjdGlvbiwgb3IgbnVsbCB3aGVuIHRoZSB0b3RhbCBzaXplIGlzIHVua25vd24uXG4gICAqXG4gICAqIEEgbnVsbCBtZWFucyB0aGUgc2VydmVyIGRpZCBub3Qgc2VuZCBDb250ZW50LUxlbmd0aCAoY2h1bmtlZCByZXNwb25zZXMsIHNvbWUgcHJveGllcykgYW5kIG5vXG4gICAqIHBlcmNlbnRhZ2UgY2FuIGJlIGRlcml2ZWQ7IHNob3cgYW4gaW5kZXRlcm1pbmF0ZSBpbmRpY2F0b3IgcmF0aGVyIHRoYW4gZ3Vlc3NpbmcgYXQgb25lLlxuICAgKi9cbiAgcHVibGljIG1vZGVsTG9hZFByb2dyZXNzJCA9IG5ldyBTdWJqZWN0PG51bWJlciB8IG51bGw+KCk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIHdoZW4gYSBsb2FkIGFjdHVhbGx5IHN0b3BwZWQgc2hvcnQsIHdoaWNoIGlzIG5vdCB0aGUgc2FtZSBhcyBhc2tpbmcgaXQgdG8uXG4gICAqXG4gICAqIGNhbmNlbE1vZGVsTG9hZCgpIGNhbiBhcnJpdmUgYWZ0ZXIgcGFyc2UoKSBoYXMgdGFrZW4gdGhlIG1haW4gdGhyZWFkLCBhbmQgcGFyc2UgY2Fubm90IGJlXG4gICAqIGludGVycnVwdGVkIC0gdGhlIG1vZGVsIGZpbmlzaGVzIGxvYWRpbmcgcmVnYXJkbGVzcy4gT25seSB0aGlzIHRlbGxzIHRoZSBVSSB3aGljaCBvZiB0aGUgdHdvXG4gICAqIGhhcHBlbmVkLCBzbyBpdCBkb2VzIG5vdCBvZmZlciB0byByZWxvYWQgc29tZXRoaW5nIHRoYXQgaXMgYWxyZWFkeSBvbiBzY3JlZW4uXG4gICAqL1xuICBwdWJsaWMgbW9kZWxMb2FkQ2FuY2VsbGVkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLy8gQmFja2dyb3VuZCBwYXJzaW5nIG9mIGhlYXZ5IC5vYmogZmlsZXMsIHByb3ZpZGVkIGJ5IHRoZSBob3N0aW5nIGFwcCAoc2VlIHNldE9ialBhcnNlcldvcmtlcikuXG4gIC8vIEFuZ3VsYXIgbGlicmFyaWVzIGJ1aWx0IHdpdGggbmctcGFja2FnciBjYW4ndCBidW5kbGUgYG5ldyBXb3JrZXIobmV3IFVSTCguLi4pKWAgdGhlbXNlbHZlcyxcbiAgLy8gc28gdGhlIGFwcCBpbnN0YW50aWF0ZXMgdGhlIHdvcmtlciAoaXRzIGJ1aWxkIHBpcGVsaW5lIHN1cHBvcnRzIGl0KSBhbmQgaGFuZHMgaXQgb3ZlciBoZXJlLlxuICBwcml2YXRlIG9ialBhcnNlcldvcmtlcj86IFdvcmtlcjtcbiAgcHJpdmF0ZSBvYmpQYXJzZXJQZW5kaW5nUmVxdWVzdHMgPSBuZXcgTWFwPHN0cmluZywgeyByZXNvbHZlOiAobWVzaGVzOiBQYXJzZWRNZXNoRGF0YVtdKSA9PiB2b2lkOyByZWplY3Q6IChlcnJvcjogRXJyb3IpID0+IHZvaWQgfT4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG5nWm9uZTogTmdab25lKSB7IH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgV2ViIFdvcmtlciB1c2VkIHRvIHBhcnNlIGhlYXZ5IC5vYmogZmlsZXMgb2ZmIHRoZSBtYWluIHRocmVhZC5cbiAgICogTXVzdCBiZSBpbnN0YW50aWF0ZWQgYnkgdGhlIGNvbnN1bWluZyBhcHAgKGUuZy4gYG5ldyBXb3JrZXIobmV3IFVSTCgnLi9vYmotcGFyc2VyLndvcmtlcicsIGltcG9ydC5tZXRhLnVybCkpYCksXG4gICAqIHNpbmNlIGEgbGlicmFyeSBwYWNrYWdlZCB3aXRoIG5nLXBhY2thZ3IgY2Fubm90IGJ1bmRsZSB3b3JrZXIgZmlsZXMgaXRzZWxmLlxuICAgKiBXaGVuIG5vIHdvcmtlciBpcyBwcm92aWRlZCwgbG9hZE9iak1vZGVsIGZhbGxzIGJhY2sgdG8gcGFyc2luZyBvbiB0aGUgbWFpbiB0aHJlYWQuXG4gICAqL1xuICBzZXRPYmpQYXJzZXJXb3JrZXIod29ya2VyOiBXb3JrZXIpOiB2b2lkIHtcbiAgICB0aGlzLm9ialBhcnNlcldvcmtlciA9IHdvcmtlcjtcbiAgICB0aGlzLm9ialBhcnNlcldvcmtlci5vbm1lc3NhZ2UgPSAoeyBkYXRhIH06IE1lc3NhZ2VFdmVudDxPYmpQYXJzZXJXb3JrZXJSZXNwb25zZT4pID0+IHtcbiAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLm9ialBhcnNlclBlbmRpbmdSZXF1ZXN0cy5nZXQoZGF0YS5yZXF1ZXN0SWQpO1xuICAgICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMub2JqUGFyc2VyUGVuZGluZ1JlcXVlc3RzLmRlbGV0ZShkYXRhLnJlcXVlc3RJZCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzICYmIGRhdGEubWVzaGVzKSB7XG4gICAgICAgIHBlbmRpbmcucmVzb2x2ZShkYXRhLm1lc2hlcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZW5kaW5nLnJlamVjdChuZXcgRXJyb3IoZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvciB3aGlsZSBwYXJzaW5nIE9CSiBmaWxlIGluIHdvcmtlcicpKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSByZXF1ZXN0T2JqUGFyc2VJbldvcmtlcihvYmpVcmw6IHN0cmluZyk6IFByb21pc2U8UGFyc2VkTWVzaERhdGFbXT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0SWQgPSBgJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpfWA7XG4gICAgICB0aGlzLm9ialBhcnNlclBlbmRpbmdSZXF1ZXN0cy5zZXQocmVxdWVzdElkLCB7IHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgIHRoaXMub2JqUGFyc2VyV29ya2VyIS5wb3N0TWVzc2FnZSh7IHJlcXVlc3RJZCwgb2JqVXJsIH0pO1xuICAgICAgLy8gRGlhZ25vc3RpYyBvbmx5OiBsYXJnZSBtb2RlbHMgbGVnaXRpbWF0ZWx5IHRha2UgYSB3aGlsZSwgdGhpcyBpc24ndCBhIHRpbWVvdXQvYWJvcnQsXG4gICAgICAvLyBqdXN0IGEgc2lnbmFsIGluIGNhc2UgdGhlIHdvcmtlciB3ZW50IHNpbGVudCAoZS5nLiBpdCByYW4gb3V0IG9mIG1lbW9yeSBtaWQtcGFyc2UpLlxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLm9ialBhcnNlclBlbmRpbmdSZXF1ZXN0cy5oYXMocmVxdWVzdElkKSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgVGhyZWVKc1NlcnZpY2U6IG9iai1wYXJzZXIgd29ya2VyIGhhcyBub3QgcmVwbGllZCBhZnRlciA2MHMgZm9yIHJlcXVlc3QgJHtyZXF1ZXN0SWR9IChvYmpVcmw9JHtvYmpVcmx9KS4gU3RpbGwgd2FpdGluZyAtIGxhcmdlIGZpbGVzIGNhbiB0YWtlIGEgd2hpbGUsIGJ1dCB0aGlzIG1heSBhbHNvIG1lYW4gdGhlIHdvcmtlciBodW5nIG9yIHJhbiBvdXQgb2YgbWVtb3J5LmApO1xuICAgICAgICB9XG4gICAgICB9LCA2MDAwMCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVidWlsZHMgYSBUSFJFRS5NZXNoIGZyb20gdGhlIHJhdyB0eXBlZCBhcnJheXMgc2VudCBiYWNrIGJ5IHRoZSBwYXJzZXIgd29ya2VyLiAqL1xuICBwcml2YXRlIG1lc2hGcm9tUGFyc2VkRGF0YShkYXRhOiBQYXJzZWRNZXNoRGF0YSwgbWF0ZXJpYWxzPzogYW55KTogVEhSRUUuTWVzaCB7XG4gICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuQnVmZmVyR2VvbWV0cnkoKTtcbiAgICBnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoJ3Bvc2l0aW9uJywgbmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZShkYXRhLnBvc2l0aW9uLCAzKSk7XG4gICAgaWYgKGRhdGEudXYpIHtcbiAgICAgIGdlb21ldHJ5LnNldEF0dHJpYnV0ZSgndXYnLCBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKGRhdGEudXYsIDIpKTtcbiAgICB9XG4gICAgLy8gSW5kZXggaGFzIHRvIGJlIHNldCBiZWZvcmUgYW55IG5vcm1hbCBjb21wdXRhdGlvbiwgd2hpY2ggcmVhZHMgaXQgdG8gYXZlcmFnZSBzaGFyZWQgZmFjZXMuXG4gICAgaWYgKGRhdGEuaW5kZXgpIHtcbiAgICAgIGdlb21ldHJ5LnNldEluZGV4KG5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUoZGF0YS5pbmRleCwgMSkpO1xuICAgIH1cbiAgICBpZiAoZGF0YS5ub3JtYWwpIHtcbiAgICAgIGdlb21ldHJ5LnNldEF0dHJpYnV0ZSgnbm9ybWFsJywgbmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZShkYXRhLm5vcm1hbCwgMykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZW9tZXRyeS5jb21wdXRlVmVydGV4Tm9ybWFscygpO1xuICAgIH1cbiAgICAvLyBCb3gzLnNldEZyb21PYmplY3QoKSByZXVzZXMgYW4gYWxyZWFkeS1zZXQgYm91bmRpbmdCb3ggaW5zdGVhZCBvZiB3YWxraW5nIGV2ZXJ5IHZlcnRleCxcbiAgICAvLyBzbyBhZG9wdGluZyB0aGUgd29ya2VyJ3MgbWFrZXMgZnJhbWluZyB0aGUgY2FtZXJhIGNoZWFwIG5vIG1hdHRlciBob3cgZGVuc2UgdGhlIG1lc2ggaXMuXG4gICAgaWYgKGRhdGEuYm91bmRpbmdCb3gpIHtcbiAgICAgIGdlb21ldHJ5LmJvdW5kaW5nQm94ID0gbmV3IFRIUkVFLkJveDMoXG4gICAgICAgIG5ldyBUSFJFRS5WZWN0b3IzKC4uLmRhdGEuYm91bmRpbmdCb3gubWluKSxcbiAgICAgICAgbmV3IFRIUkVFLlZlY3RvcjMoLi4uZGF0YS5ib3VuZGluZ0JveC5tYXgpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlZE1hdGVyaWFscyA9IGRhdGEubWF0ZXJpYWxOYW1lcy5tYXAoKG5hbWUpID0+IHtcbiAgICAgIGNvbnN0IG1hdGVyaWFsID0gbWF0ZXJpYWxzICYmIG5hbWUgPyBtYXRlcmlhbHMuY3JlYXRlKG5hbWUpIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKCFtYXRlcmlhbCkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFRocmVlSnNTZXJ2aWNlOiBubyBNVEwgbWF0ZXJpYWwgbmFtZWQgXCIke25hbWV9XCIgZm9yIG1lc2ggXCIke2RhdGEubmFtZX1cIiwgdXNpbmcgYSBwbGFpbiBmYWxsYmFjayAobm8gdGV4dHVyZSkuYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWF0ZXJpYWwgfHwgbmV3IFRIUkVFLk1lc2hQaG9uZ01hdGVyaWFsKCk7XG4gICAgfSk7XG5cbiAgICBsZXQgbWVzaDogVEhSRUUuTWVzaDtcbiAgICBpZiAoZGF0YS5ncm91cHMgJiYgZGF0YS5ncm91cHMubGVuZ3RoID4gMCkge1xuICAgICAgZGF0YS5ncm91cHMuZm9yRWFjaCgoZ3JvdXApID0+IGdlb21ldHJ5LmFkZEdyb3VwKGdyb3VwLnN0YXJ0LCBncm91cC5jb3VudCwgZ3JvdXAubWF0ZXJpYWxJbmRleCkpO1xuICAgICAgbWVzaCA9IG5ldyBUSFJFRS5NZXNoKGdlb21ldHJ5LCByZXNvbHZlZE1hdGVyaWFscyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lc2ggPSBuZXcgVEhSRUUuTWVzaChnZW9tZXRyeSwgcmVzb2x2ZWRNYXRlcmlhbHNbMF0pO1xuICAgIH1cbiAgICBtZXNoLm5hbWUgPSBkYXRhLm5hbWU7XG4gICAgcmV0dXJuIG1lc2g7XG4gIH1cblxuICBpbml0KGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQpOiB2b2lkIHtcbiAgICAvLyBUaGlzIHNlcnZpY2UgaXMgYSBzaW5nbGV0b24gYnV0IHRoZSB2aWV3ZXIgY29tcG9uZW50IGlzIHJlYnVpbHQgb24gZXZlcnkgbmF2aWdhdGlvbiwgc28gc3RhdGVcbiAgICAvLyBmcm9tIHRoZSBwcmV2aW91cyBzY2VuZSBpcyBzdGlsbCBoZXJlLiBUd28gdGhpbmdzIG91dGxpdmUgaXQgYW5kIGhhdmUgdG8gZ28gZmlyc3Q6XG4gICAgLy9cbiAgICAvLyAgLSBBIGRvd25sb2FkIHN0aWxsIGluIGZsaWdodC4gSXRzIG9uTG9hZGVkIHJlc29sdmVzIGFnYWluc3Qgd2hhdGV2ZXIgYHRoaXMuc2NlbmVgIHBvaW50cyBhdFxuICAgIC8vICAgIGJ5IHRoZW4sIHNvIHRoZSBtb2RlbCBiZWluZyBhYmFuZG9uZWQgd291bGQgYmUgaGFuZGVkIHRvIHRoZSBzY2VuZSBidWlsdCBiZWxvdy5cbiAgICAvLyAgLSBUaGUgdGFnIGdyb3VwLCB3aGljaCBpcyBhIGZpZWxkIGFuZCBrZWVwcyBpdHMgc3ByaXRlcy4gVGhleSB3b3VsZCBiZSByZS1wYXJlbnRlZCB1bmRlciB0aGVcbiAgICAvLyAgICBuZXcgbW9kZWwgYW5kIHNob3cgdGhlIHByZXZpb3VzIHZpc2l0J3MgdGFncyBvbiBpdC5cbiAgICB0aGlzLmRpc2NhcmRDdXJyZW50TG9hZCgpO1xuICAgIHRoaXMuY2xlYXJUYWdzKCk7XG4gICAgdGhpcy5jYW1lcmFUd2VlbiA9IG51bGw7XG4gICAgdGhpcy5tb2RlbFJvb3QgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyAxLiBTZXR1cCBTY2VuZVxuICAgIHRoaXMuc2NlbmUgPSBuZXcgVEhSRUUuU2NlbmUoKTtcbiAgICB0aGlzLnNjZW5lLmJhY2tncm91bmQgPSBuZXcgVEhSRUUuQ29sb3IoMHhlMGY3ZmYpOyAvLyBmcm9tIFBPQ1xuXG4gICAgLy8gMi4gU2V0dXAgQ2FtZXJhXG4gICAgdGhpcy5jYW1lcmEgPSBuZXcgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEoNzUsIGNhbnZhcy5jbGllbnRXaWR0aCAvIGNhbnZhcy5jbGllbnRIZWlnaHQsIDAuMSwgMTAwMDApO1xuICAgIHRoaXMuY2FtZXJhLnBvc2l0aW9uLnNldCgwLCA1LCAxMCk7IC8vIHdpbGwgYmUgb3ZlcnJpZGRlbiBsYXRlciBpZiBwYXNzZWRcblxuICAgIC8vIDMuIFNldHVwIFdlYkdMIFJlbmRlcmVyXG4gICAgdGhpcy5yZW5kZXJlciA9IG5ldyBUSFJFRS5XZWJHTFJlbmRlcmVyKHsgY2FudmFzLCBhbnRpYWxpYXM6IHRydWUgfSk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTaXplKGNhbnZhcy5jbGllbnRXaWR0aCwgY2FudmFzLmNsaWVudEhlaWdodCk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRQaXhlbFJhdGlvKE1hdGgubWluKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLCAxLjUpKTtcbiAgICB0aGlzLm9ic2VydmVDYW52YXNSZXNpemUoY2FudmFzKTtcbiAgICBcbiAgICAvLyBGaXggZm9yIFRocmVlLmpzIHIxNDcgdnMgcjE1MisgY29sb3IgbWFuYWdlbWVudFxuICAgIGlmICgnb3V0cHV0Q29sb3JTcGFjZScgaW4gdGhpcy5yZW5kZXJlcikge1xuICAgICAgKHRoaXMucmVuZGVyZXIgYXMgYW55KS5vdXRwdXRDb2xvclNwYWNlID0gJ3NyZ2InOyAvLyBUSFJFRS5TUkdCQ29sb3JTcGFjZVxuICAgIH0gZWxzZSB7XG4gICAgICAodGhpcy5yZW5kZXJlciBhcyBhbnkpLm91dHB1dEVuY29kaW5nID0gMzAwMTsgLy8gVEhSRUUuc1JHQkVuY29kaW5nXG4gICAgfVxuXG4gICAgLy8gV2l0aG91dCB0b25lIG1hcHBpbmcgYW55dGhpbmcgYnJpZ2h0ZXIgdGhhbiAxLjAgaXMgc2ltcGx5IGN1dCBvZmYgdG8gcHVyZSB3aGl0ZS4gQ2FwdHVyZWRcbiAgICAvLyB0ZXh0dXJlcyBjYXJyeSBhIHNtYWxsIGZyYWN0aW9uIG9mIHZlcnkgYnJpZ2h0IHBpeGVscyAtIHNreSByZWZsZWN0ZWQgaW4gd2luZG93cywgc3VubGl0XG4gICAgLy8gcmVuZGVyIC0gYW5kIG9uY2UgbGlnaHRpbmcgcHVzaGVzIHRob3NlIHBhc3QgdGhlIGxpbWl0IHRoZXkgZmxhdHRlbiBpbnRvIHdoaXRlIHNwZWNrcyB3aXRoXG4gICAgLy8gbm8gZGV0YWlsIGxlZnQuIFJvbGxpbmcgdGhlIGhpZ2hsaWdodHMgb2ZmIGluc3RlYWQga2VlcHMgdGhhdCBkZXRhaWwgYW5kIGtlZXBzIGJyaWdodCBhcmVhc1xuICAgIC8vIHJlYWRpbmcgYXMgYnJpZ2h0IHJhdGhlciB0aGFuIGJsb3duLlxuICAgIHRoaXMucmVuZGVyZXIudG9uZU1hcHBpbmcgPSBUSFJFRS5BQ0VTRmlsbWljVG9uZU1hcHBpbmc7XG4gICAgdGhpcy5yZW5kZXJlci50b25lTWFwcGluZ0V4cG9zdXJlID0gMS4wO1xuXG4gICAgLy8gNC4gTGlnaHRpbmcsIGtlcHQgZGVsaWJlcmF0ZWx5IHJlc3RyYWluZWQgYW5kIG5ldXRyYWwuXG4gICAgLy9cbiAgICAvLyBDYXB0dXJlZC9waG90b2dyYW1tZXRyeSBtb2RlbHMgYWxyZWFkeSBoYXZlIGxpZ2h0aW5nIGJha2VkIGludG8gdGhlaXIgdGV4dHVyZXMgKHRoZSBzdW4gYW5kXG4gICAgLy8gc2hhZG93cyBjYW1lIHdpdGggdGhlIHBob3RvcyksIHNvIGxpZ2h0aW5nIHRoZW0gYWdhaW4gZGlzdG9ydHMgd2hhdCB0aGV5IGFjdHVhbGx5IGxvb2sgbGlrZS5cbiAgICAvLyBUaGUgaW50ZW5zaXRpZXMgYmVsb3cgYWRkIHVwIHRvIHJvdWdobHkgMS4wIG9uIGEgc3VyZmFjZSBmYWNpbmcgdGhlIHZpZXdlciwgd2hpY2ggcmVuZGVycyB0aGVcbiAgICAvLyB0ZXh0dXJlIGF0IGl0cyB0cnVlIHZhbHVlLiBBbnl0aGluZyBhYm92ZSAxLjAgaXMgY2xpcHBlZCB0byBwdXJlIHdoaXRlIGJ5IHRoZSByZW5kZXJlciwgd2hpY2hcbiAgICAvLyBpcyB3aGF0IHR1cm5zIGJyaWdodCBhcmVhcyBpbnRvIGZsYXQgd2hpdGUgcGF0Y2hlcyB3aXRoIG5vIGRldGFpbCBsZWZ0IGluIHRoZW0uXG4gICAgLy9cbiAgICAvLyBOZXV0cmFsIHdoaXRlIGlzIHVzZWQgcmF0aGVyIHRoYW4gYSB3YXJtIHRpbnQgZm9yIHRoZSBzYW1lIHJlYXNvbjogYSB0aW50ZWQgbGlnaHQgc2hpZnRzIGV2ZXJ5XG4gICAgLy8gY29sb3VyIGluIHRoZSBtb2RlbCBhd2F5IGZyb20gd2hhdCB3YXMgY2FwdHVyZWQuXG4gICAgY29uc3QgYW1iaWVudExpZ2h0ID0gbmV3IFRIUkVFLkFtYmllbnRMaWdodCgweGZmZmZmZiwgMC43KTtcbiAgICB0aGlzLnNjZW5lLmFkZChhbWJpZW50TGlnaHQpO1xuXG4gICAgLy8gSGVhZGxpZ2h0IHJhdGhlciB0aGFuIGEgZml4ZWQgc3VuOiBwYXJlbnRlZCB0byB0aGUgY2FtZXJhIHNvIGl0IGFsd2F5cyBwb2ludHMgYXQgd2hhdGV2ZXIgaXNcbiAgICAvLyBiZWluZyBsb29rZWQgYXQsIGdpdmluZyBzaGFwZSB0byBzdXJmYWNlcyB3aXRob3V0IGV2ZXIgbGVhdmluZyBhIGZhY2UgdW5saXQuIE5vIHNoYWRvdyBjYXN0aW5nXG4gICAgLy8gLSBzaGFkb3dzIHdvdWxkIGRvdWJsZSB1cCB3aXRoIHRoZSBvbmVzIGFscmVhZHkgYmFrZWQgaW50byB0aGUgdGV4dHVyZXMsIGFuZCB0aGUgc2hhZG93IG1hcFxuICAgIC8vIHdhcyBhIHJlYWwgY29zdCBwZXIgZnJhbWUuXG4gICAgY29uc3QgaGVhZExpZ2h0ID0gbmV3IFRIUkVFLkRpcmVjdGlvbmFsTGlnaHQoMHhmZmZmZmYsIDAuMzUpO1xuICAgIGhlYWRMaWdodC5wb3NpdGlvbi5zZXQoMCwgMCwgMSk7XG4gICAgdGhpcy5jYW1lcmEuYWRkKGhlYWRMaWdodCk7XG4gICAgLy8gQSBsaWdodCBvbmx5IGNvbnRyaWJ1dGVzIHdoaWxlIGl0IGlzIHBhcnQgb2YgdGhlIHNjZW5lIGdyYXBoLCBhbmQgdGhpcyBvbmUgaGFuZ3Mgb2ZmIHRoZSBjYW1lcmEuXG4gICAgdGhpcy5zY2VuZS5hZGQodGhpcy5jYW1lcmEpO1xuXG4gICAgLy8gNS4gU2V0dXAgQ29udHJvbHMgKGZyb20gUE9DKVxuICAgIHRoaXMuY29udHJvbHMgPSBuZXcgT3JiaXRDb250cm9scyh0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50KTtcbiAgICB0aGlzLmNvbnRyb2xzLnJvdGF0ZVNwZWVkID0gMS4wO1xuICAgIHRoaXMuY29udHJvbHMuZGFtcGluZ0ZhY3RvciA9IDAuMTtcbiAgICB0aGlzLmNvbnRyb2xzLmVuYWJsZURhbXBpbmcgPSB0cnVlO1xuICAgIHRoaXMuY29udHJvbHMubW91c2VCdXR0b25zID0ge1xuICAgICAgTEVGVDogVEhSRUUuTU9VU0UuUk9UQVRFLFxuICAgICAgTUlERExFOiBUSFJFRS5NT1VTRS5ET0xMWSxcbiAgICAgIFJJR0hUOiBUSFJFRS5NT1VTRS5QQU4sXG4gICAgfTtcbiAgICB0aGlzLmNvbnRyb2xzLnRhcmdldC5zZXQoMCwgMCwgMCk7XG5cbiAgICAvLyBFdmVudCBsaXN0ZW5lcnMgb24gY29udHJvbHMgdG8gZGlmZmVyZW50aWF0ZSBkcmFnZ2luZyB2cyBjbGlja2luZ1xuICAgIHRoaXMuY29udHJvbHMuYWRkRXZlbnRMaXN0ZW5lcignc3RhcnQnLCAoKSA9PiB7XG4gICAgICB0aGlzLmlzRHJhZ2dpbmdUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmdDYW1lcmEgPSB0cnVlO1xuICAgICAgfSwgMTUwKTtcbiAgICB9KTtcblxuICAgIHRoaXMuY29udHJvbHMuYWRkRXZlbnRMaXN0ZW5lcignZW5kJywgKCkgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaXNEcmFnZ2luZ1RpbWVyKTtcbiAgICAgIGlmICh0aGlzLmlzRHJhZ2dpbmdDYW1lcmEpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pc0RyYWdnaW5nQ2FtZXJhID0gZmFsc2U7XG4gICAgICAgIH0sIDI1MCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBJbnRlcmFjdGlvbiBFdmVudCBMaXN0ZW5lcnMgb24gY2FudmFzXG4gICAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vbk1vdXNlQ2xpY2suYmluZCh0aGlzKSwgZmFsc2UpO1xuICAgIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlLmJpbmQodGhpcyksIGZhbHNlKTtcblxuICAgIC8vIEVzY2FwZSBiYWNrcyBvdXQgb2YgcGxhY2VtZW50IGFuZCBjYWxpYnJhdGlvbi4gT24gdGhlIHdpbmRvdyByYXRoZXIgdGhhbiB0aGUgY2FudmFzLCB3aGljaFxuICAgIC8vIHdvdWxkIG5lZWQgZm9jdXMgdGhlIHVzZXIgaGFzIG5vIHJlYXNvbiB0byBoYXZlIGdpdmVuIGl0IC0gdGhleSBhcmUgYWltaW5nIHdpdGggdGhlIG1vdXNlLlxuICAgIC8vIFJlbW92ZWQgZmlyc3QgYmVjYXVzZSB0aGlzIHNlcnZpY2UgaXMgYSBzaW5nbGV0b246IGluaXQoKSBydW5zIGFnYWluIGZvciBldmVyeSBjYW52YXMsIGFuZFxuICAgIC8vIHRoZSBwcmV2aW91cyByZWdpc3RyYXRpb24gd291bGQgb3RoZXJ3aXNlIHN0aWxsIGJlIGF0dGFjaGVkLlxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5vbktleURvd24pO1xuICAgIHRoaXMucGlja1RhcmdldD8uZGlzcG9zZSgpO1xuICAgIHRoaXMucGlja1RhcmdldCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnBpY2tEZXB0aE1hdGVyaWFsPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5waWNrRGVwdGhNYXRlcmlhbCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnBpY2tDYW1lcmEgPSB1bmRlZmluZWQ7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLm9uS2V5RG93bik7XG5cbiAgICAvLyA2LiBTdGFydCB0aGUgcmVuZGVyIGxvb3BcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmFuaW1hdGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXRoIChzZXJ2ZWQgYnkgdGhlIGFwcCkgaG9sZGluZyBiYXNpc190cmFuc2NvZGVyLmpzLy53YXNtLCB3aGljaCBLVFgyTG9hZGVyIG5lZWRzIHRvIHR1cm5cbiAgICogQmFzaXMgVW5pdmVyc2FsIHRleHR1cmVzIGludG8gd2hhdGV2ZXIgY29tcHJlc3NlZCBmb3JtYXQgdGhlIGxvY2FsIEdQVSBhY3R1YWxseSBzdXBwb3J0cy5cbiAgICovXG4gIHByaXZhdGUga3R4MlRyYW5zY29kZXJQYXRoID0gJ2Fzc2V0cy9iYXNpcy8nO1xuXG4gIC8qKiBPdmVycmlkZXMgd2hlcmUgdGhlIEJhc2lzIHRyYW5zY29kZXIgZmlsZXMgYXJlIHNlcnZlZCBmcm9tLiAqL1xuICBzZXRLdHgyVHJhbnNjb2RlclBhdGgocGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5rdHgyVHJhbnNjb2RlclBhdGggPSBwYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIGEgYmFzZSAzRCBtb2RlbCBpbiBHTFRGL0dMQiBmb3JtYXQgLSB0aGUgcHJlZmVycmVkIGZvcm1hdCBmb3IgbGFyZ2UgbW9kZWxzLlxuICAgKiBVbmxpa2UgLm9iaiwgZ2VvbWV0cnkgYXJyaXZlcyBhcyBiaW5hcnkgdHlwZWQgYXJyYXlzIChubyB0ZXh0IHBhcnNpbmcgdG8gb2ZmbG9hZCB0byBhIHdvcmtlcilcbiAgICogYW5kIHN0YXlzIGluZGV4ZWQsIHNvIGZhciBsZXNzIGRhdGEgcmVhY2hlcyB0aGUgR1BVLiBLVFgyIHRleHR1cmVzIGFyZSBzdXBwb3J0ZWQgdG9vOiB0aGV5XG4gICAqIHN0YXkgY29tcHJlc3NlZCBpbiBWUkFNIGluc3RlYWQgb2YgYmVpbmcgZGVjb2RlZCB0byByYXcgcGl4ZWxzIGxpa2UgSlBFRy9QTkcuXG4gICAqL1xuICBsb2FkR0xURk1vZGVsKHVybDogc3RyaW5nLCBjYW1lcmFQb3NpdGlvbj86IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSwgcm90YXRpb24/OiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0sIGNhY2hlS2V5Pzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbG9hZGVyID0gbmV3IEdMVEZMb2FkZXIoKTtcblxuICAgIC8vIEtUWDIgbmVlZHMgdGhlIHJlbmRlcmVyIHRvIHJlcG9ydCB3aGljaCBjb21wcmVzc2VkIGZvcm1hdHMgdGhpcyBHUFUgYWNjZXB0cywgc28gdGhpcyBoYXMgdG9cbiAgICAvLyBoYXBwZW4gYWZ0ZXIgaW5pdCgpLiBHdWFyZGVkIHNvIGEgbW9kZWwgd2l0aG91dCBLVFgyIHRleHR1cmVzIHN0aWxsIGxvYWRzIGlmIGl0J3MgbWlzc2luZy5cbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qga3R4MkxvYWRlciA9IG5ldyBLVFgyTG9hZGVyKClcbiAgICAgICAgICAuc2V0VHJhbnNjb2RlclBhdGgodGhpcy5rdHgyVHJhbnNjb2RlclBhdGgpXG4gICAgICAgICAgLmRldGVjdFN1cHBvcnQodGhpcy5yZW5kZXJlcik7XG4gICAgICAgIGxvYWRlci5zZXRLVFgyTG9hZGVyKGt0eDJMb2FkZXIpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdUaHJlZUpzU2VydmljZTogY291bGQgbm90IHNldCB1cCBLVFgyIHRleHR1cmUgc3VwcG9ydCwgZmFsbGluZyBiYWNrIHRvIHVuY29tcHJlc3NlZCB0ZXh0dXJlcy4nLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIExldHMgZ2x0ZnBhY2svZ2x0Zi10cmFuc2Zvcm0gb3V0cHV0IHVzaW5nIEVYVF9tZXNob3B0X2NvbXByZXNzaW9uIGxvYWQgd2l0aG91dCBleHRyYSBzZXR1cC5cbiAgICBsb2FkZXIuc2V0TWVzaG9wdERlY29kZXIoTWVzaG9wdERlY29kZXIpO1xuXG4gICAgdGhpcy5tb2RlbExvYWRpbmckLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5tb2RlbExvYWRQcm9ncmVzcyQubmV4dCgwKTtcblxuICAgIC8vIE9yZGVyIG1hdHRlcnM6IG5vcm1hbHMgbXVzdCBleGlzdCBiZWZvcmUgYW5pc290cm9weSwgYW5kIHRoZSBQaG9uZyBjb252ZXJzaW9uIGhhcyB0byBydW5cbiAgICAvLyBiZWZvcmUgc2lkZS9mbGF0U2hhZGluZyBhcmUgdG91Y2hlZCBzbyB0aG9zZSBzZXR0aW5ncyBsYW5kIG9uIHRoZSBtYXRlcmlhbHMgd2Uga2VlcC5cbiAgICBjb25zdCBvbkxvYWRlZCA9IChnbHRmOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuY29udmVydFRvUGhvbmdNYXRlcmlhbHMoZ2x0Zi5zY2VuZSk7XG4gICAgICB0aGlzLmZvcmNlRG91YmxlU2lkZWRNYXRlcmlhbHMoZ2x0Zi5zY2VuZSk7XG4gICAgICB0aGlzLmVuc3VyZVZlcnRleE5vcm1hbHMoZ2x0Zi5zY2VuZSk7XG4gICAgICB0aGlzLnR1bmVUZXh0dXJlU2FtcGxpbmcoZ2x0Zi5zY2VuZSk7XG4gICAgICB0aGlzLnBsYWNlTG9hZGVkT2JqZWN0SW5TY2VuZShnbHRmLnNjZW5lLCBjYW1lcmFQb3NpdGlvbiwgcm90YXRpb24pO1xuICAgICAgdGhpcy5tb2RlbExvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgIH07XG4gICAgY29uc3Qgb25FcnJvciA9IChlcnJvcjogYW55KSA9PiB7XG4gICAgICAvLyBDYW5jZWxsaW5nIGlzIGEgZGVjaXNpb24sIG5vdCBhIGZhaWx1cmU6IGNsZWFyIHRoZSBvdmVybGF5IHdpdGhvdXQgYW4gZXJyb3IgaW4gdGhlIGNvbnNvbGUuXG4gICAgICBpZiAoZXJyb3I/Lm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICAvLyBPbmx5IGEgY2FuY2VsIG9mIHRoZSBsb2FkIHRoYXQgaXMgc3RpbGwgY3VycmVudCBjYW1lIGZyb20gdGhlIHVzZXI7IGFueXRoaW5nIGVsc2UgaXMgdGhpc1xuICAgICAgICAvLyBsb2FkIGhhdmluZyBiZWVuIHN1cGVyc2VkZWQgb3IgZGlzY2FyZGVkLlxuICAgICAgICBpZiAodGhpcy5sb2FkQWJvcnRDb250cm9sbGVyPy5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgIHRoaXMubW9kZWxMb2FkQ2FuY2VsbGVkJC5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgR0xURiBtb2RlbDonLCBlcnJvcik7XG4gICAgICB9XG4gICAgICB0aGlzLm1vZGVsTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICB0aGlzLm1vZGVsTG9hZFByb2dyZXNzJC5uZXh0KG51bGwpO1xuICAgIH07XG5cbiAgICAvLyBHTFRGTG9hZGVyIGRlY29kZXMgZW1iZWRkZWQgaW1hZ2VzIHdpdGggY3JlYXRlSW1hZ2VCaXRtYXAgd2hlbiB0aGUgYnJvd3NlciBvZmZlcnMgaXQsIGFuZCBvblxuICAgIC8vIGxhcmdlIHRleHR1cmUgYXRsYXNlcyB0aGF0IHBhdGggcmV0dXJucyB2aXNpYmx5IGNvcnJ1cHQgZGF0YSAtIHNjYXR0ZXJlZCB3aGl0ZSBibG9ja3MgYWNyb3NzXG4gICAgLy8gdGhlIG1vZGVsLiBUaGUgZXhhY3Qgc2FtZSBieXRlcyBkZWNvZGVkIHRocm91Z2ggYW4gSFRNTEltYWdlRWxlbWVudCwgd2hpY2ggaXMgd2hhdCB0aGUgLm9ialxuICAgIC8vIHBhdGggdXNlcyB2aWEgTVRMTG9hZGVyLCBjb21lIG91dCBjbGVhbi4gR0xURkxvYWRlciBhbHJlYWR5IGZhbGxzIGJhY2sgdG8gdGhhdCBkZWNvZGVyIGZvclxuICAgIC8vIFNhZmFyaSBhbmQgb2xkZXIgRmlyZWZveDsgdGhpcyBzaW1wbHkgZXh0ZW5kcyB0aGUgZmFsbGJhY2sgdG8gY292ZXIgdGhpcyBjYXNlIHRvby5cbiAgICAvL1xuICAgIC8vIFRoZSBkZWNvZGVyIGlzIGNob3NlbiB3aGlsZSBHTFRGUGFyc2VyIGlzIGJlaW5nIGNvbnN0cnVjdGVkLCB3aGljaCBoYXBwZW5zIHN5bmNocm9ub3VzbHlcbiAgICAvLyBpbnNpZGUgcGFyc2UoKSwgc28gaGlkaW5nIGNyZWF0ZUltYWdlQml0bWFwIG9ubHkgaGFzIHRvIGhvbGQgYWNyb3NzIHRoYXQgY2FsbCByYXRoZXIgdGhhblxuICAgIC8vIGZvciB0aGUgd2hvbGUgZG93bmxvYWQuXG4gICAgdGhpcy5mZXRjaFdpdGhQcm9ncmVzcyh1cmwsIGNhY2hlS2V5KVxuICAgICAgLy8gcGFyc2UoKSBob2xkcyB0aGUgbWFpbiB0aHJlYWQgZm9yIHNlY29uZHMgb24gYSBsYXJnZSBtb2RlbC4gWWllbGQgdW50aWwgdGhlIGJyb3dzZXIgaGFzXG4gICAgICAvLyBhY3R1YWxseSBwYWludGVkIGZpcnN0LCBvdGhlcndpc2UgdGhlIGZpbmFsIHByb2dyZXNzIHVwZGF0ZSBuZXZlciByZWFjaGVzIHRoZSBzY3JlZW4gYW5kXG4gICAgICAvLyB0aGUgYmFyIGFwcGVhcnMgdG8gc3RhbGwgc2hvcnQgb2YgdGhlIGVuZC5cbiAgICAgIC50aGVuKChidWZmZXIpID0+IHRoaXMuYWZ0ZXJOZXh0UGFpbnQoKS50aGVuKCgpID0+IGJ1ZmZlcikpXG4gICAgICAudGhlbigoYnVmZmVyKSA9PiB7XG4gICAgICAgIC8vIHBhcnNlKCkgY2Fubm90IGJlIGludGVycnVwdGVkLCBzbyBhIGNhbmNlbCB0aGF0IGxhbmRzIGR1cmluZyB0aGUgcGFpbnQgeWllbGQgaGFzIHRvIGJlXG4gICAgICAgIC8vIGNhdWdodCBoZXJlIC0gdGhlIGxhc3QgbW9tZW50IGJlZm9yZSB0aGUgbWFpbiB0aHJlYWQgaXMgY29tbWl0dGVkIGZvciBzZXZlcmFsIHNlY29uZHMuXG4gICAgICAgIGlmICh0aGlzLmxvYWRBYm9ydENvbnRyb2xsZXI/LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignTW9kZWwgbG9hZCBjYW5jZWxsZWQnLCAnQWJvcnRFcnJvcicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdsb2JhbFNjb3BlID0gZ2xvYmFsVGhpcyBhcyBhbnk7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsQ3JlYXRlSW1hZ2VCaXRtYXAgPSBnbG9iYWxTY29wZS5jcmVhdGVJbWFnZUJpdG1hcDtcbiAgICAgICAgZ2xvYmFsU2NvcGUuY3JlYXRlSW1hZ2VCaXRtYXAgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbG9hZGVyLnBhcnNlKGJ1ZmZlciwgdXJsLnN1YnN0cmluZygwLCB1cmwubGFzdEluZGV4T2YoJy8nKSArIDEpLCBvbkxvYWRlZCwgb25FcnJvcik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgZ2xvYmFsU2NvcGUuY3JlYXRlSW1hZ2VCaXRtYXAgPSBvcmlnaW5hbENyZWF0ZUltYWdlQml0bWFwO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmNhdGNoKG9uRXJyb3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIHRoZSBtb2RlbCBkb3dubG9hZCBpbiBwcm9ncmVzcywgaWYgYW55LlxuICAgKlxuICAgKiBPbmx5IHRoZSBkb3dubG9hZCBjYW4gYmUgaW50ZXJydXB0ZWQ6IHBhcnNlKCkgcnVucyBzeW5jaHJvbm91c2x5IGFuZCBob2xkcyB0aGUgbWFpbiB0aHJlYWQgdW50aWxcbiAgICogaXQgZmluaXNoZXMsIHNvIG9uY2UgaXQgaGFzIGJlZ3VuIHRoZXJlIGlzIG5vdGhpbmcgdG8gY2FuY2VsLiBJbiBwcmFjdGljZSB0aGUgZG93bmxvYWQgaXMgdGhlXG4gICAqIGxvbmcgcGFydCwgd2hpY2ggaXMgd2hlcmUgc29tZW9uZSByZWFjaGVzIGZvciB0aGlzLlxuICAgKi9cbiAgY2FuY2VsTW9kZWxMb2FkKCk6IHZvaWQge1xuICAgIHRoaXMubG9hZEFib3J0Q29udHJvbGxlcj8uYWJvcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBYmFuZG9ucyB0aGUgbG9hZCBpbiBwcm9ncmVzcyB3aXRob3V0IHJlcG9ydGluZyBpdCBhcyBjYW5jZWxsZWQuXG4gICAqXG4gICAqIERyb3BwaW5nIHRoZSBjb250cm9sbGVyIGlzIHdoYXQgbWFrZXMgdGhlIGRpZmZlcmVuY2U6IG9uRXJyb3IgdHJlYXRzIGFuIGFib3J0IGFzIHVzZXItaW5pdGlhdGVkXG4gICAqIG9ubHkgd2hpbGUgdGhlIGNvbnRyb2xsZXIgdGhhdCBhYm9ydGVkIGlzIHN0aWxsIHRoZSBjdXJyZW50IG9uZS4gVGVhcmluZyBkb3duIG9yIHJlYnVpbGRpbmcgdGhlXG4gICAqIHNjZW5lIGlzIG5vdCBzb21ldGhpbmcgdGhlIHBlcnNvbiBhc2tlZCBmb3IsIHNvIGl0IG11c3Qgbm90IHN1cmZhY2UgYXMgXCJsb2FkaW5nIGNhbmNlbGxlZFwiLlxuICAgKi9cbiAgcHJpdmF0ZSBkaXNjYXJkQ3VycmVudExvYWQoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkQWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xuICAgIHRoaXMubG9hZEFib3J0Q29udHJvbGxlciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBvbmNlIHRoZSBicm93c2VyIGhhcyBwYWludGVkIGF0IGxlYXN0IG9uZSBmcmFtZS5cbiAgICpcbiAgICogQSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgY2FsbGJhY2sgcnVucyAqYmVmb3JlKiB0aGF0IGZyYW1lIGlzIHBhaW50ZWQsIHNvIGEgc2luZ2xlIG9uZSBpcyBub3RcbiAgICogZW5vdWdoIHRvIGd1YXJhbnRlZSBwZW5kaW5nIERPTSBjaGFuZ2VzIGFyZSBvbiBzY3JlZW47IHRoZSBzZWNvbmQgZmlyZXMgYWZ0ZXIgdGhlIGZpcnN0IGZyYW1lXG4gICAqIGhhcyBnb25lIG91dC4gRmFsbHMgYmFjayB0byBhIHRpbWVvdXQgd2hlcmUgckFGIGlzbid0IGF2YWlsYWJsZSAoU1NSLCB0ZXN0cykuXG4gICAqL1xuICBwcml2YXRlIGFmdGVyTmV4dFBhaW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMCkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gcmVzb2x2ZSgpKSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRG93bmxvYWRzIGEgZmlsZSwgcmVwb3J0aW5nIHByb2dyZXNzIG9uIG1vZGVsTG9hZFByb2dyZXNzJCBhcyBpdCBhcnJpdmVzLlxuICAgKlxuICAgKiBHTFRGTG9hZGVyLmxvYWQoKSB3b3VsZCByZXBvcnQgcHJvZ3Jlc3MgdGhyb3VnaCBYSFIsIGJ1dCB0aGlzIHBhdGggZGVsaWJlcmF0ZWx5IHVzZXMgZmV0Y2goKSArXG4gICAqIHBhcnNlKCkgaW5zdGVhZCAoc2VlIGxvYWRHTFRGTW9kZWwgZm9yIHdoeSksIHNvIHByb2dyZXNzIGlzIHJlYWQgb2ZmIHRoZSByZXNwb25zZSBzdHJlYW0gaGVyZS5cbiAgICogVGhhdCBpcyBhbHNvIHRoZSBtb3JlIHVzZWZ1bCBudW1iZXI6IG9uIGEgbW9kZWwgb2YgdGhpcyBzaXplIHRoZSBkb3dubG9hZCBkb21pbmF0ZXMsIGFuZCB0aGVcbiAgICogc3RyZWFtIHJlcG9ydHMgaXQgYXMgaXQgaGFwcGVucyByYXRoZXIgdGhhbiBpbiBvbmUganVtcCBhdCB0aGUgZW5kLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFdpdGhQcm9ncmVzcyh1cmw6IHN0cmluZywgY2FjaGVLZXk/OiBzdHJpbmcpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB7XG4gICAgLy8gQSBsb2FkIGFscmVhZHkgcnVubmluZyBpcyByZXBsYWNlZCwgbm90IHJhY2VkOiB3aGljaGV2ZXIgZmluaXNoZWQgbGFzdCB3b3VsZCBvdGhlcndpc2Ugd2luLlxuICAgIHRoaXMubG9hZEFib3J0Q29udHJvbGxlcj8uYWJvcnQoKTtcbiAgICB0aGlzLmxvYWRBYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgY29uc3QgeyBzaWduYWwgfSA9IHRoaXMubG9hZEFib3J0Q29udHJvbGxlcjtcblxuICAgIGNvbnN0IGNhY2hlZCA9IGF3YWl0IHRoaXMucmVhZE1vZGVsRnJvbUNhY2hlKGNhY2hlS2V5KTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICB0aGlzLm1vZGVsTG9hZFByb2dyZXNzJC5uZXh0KDEpO1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgeyBzaWduYWwgfSk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggJHt1cmx9OiAke3Jlc3BvbnNlLnN0YXR1c30gJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRlbnRMZW5ndGggPSBOdW1iZXIocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtTGVuZ3RoJykpO1xuICAgIGNvbnN0IHRvdGFsID0gTnVtYmVyLmlzRmluaXRlKGNvbnRlbnRMZW5ndGgpICYmIGNvbnRlbnRMZW5ndGggPiAwID8gY29udGVudExlbmd0aCA6IDA7XG5cbiAgICAvLyBXaXRob3V0IGEgcmVhZGFibGUgc3RyZWFtIChvbGRlciBicm93c2Vycywgc29tZSBwb2x5ZmlsbHMpIHRoZXJlIGlzIG5vdGhpbmcgdG8gbWVhc3VyZSwgc29cbiAgICAvLyBmYWxsIGJhY2sgdG8gYSBwbGFpbiBidWZmZXJlZCByZWFkIGFuZCBsZXQgdGhlIFVJIHNob3cgYW4gaW5kZXRlcm1pbmF0ZSBpbmRpY2F0b3IuXG4gICAgaWYgKCFyZXNwb25zZS5ib2R5Py5nZXRSZWFkZXIpIHtcbiAgICAgIHRoaXMubW9kZWxMb2FkUHJvZ3Jlc3MkLm5leHQobnVsbCk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWFkZXIgPSByZXNwb25zZS5ib2R5LmdldFJlYWRlcigpO1xuXG4gICAgLy8gV2l0aCBhIGtub3duIHNpemUsIHdyaXRlIGNodW5rcyBzdHJhaWdodCBpbnRvIG9uZSBwcmUtYWxsb2NhdGVkIGJ1ZmZlci4gQ29sbGVjdGluZyB0aGVtIGluIGFuXG4gICAgLy8gYXJyYXkgYW5kIGNvbmNhdGVuYXRpbmcgYWZ0ZXJ3YXJkcyB3b3VsZCBob2xkIGJvdGggY29waWVzIGF0IG9uY2UgLSBvbiBhIDE2NCBNQiBtb2RlbCB0aGF0IGlzXG4gICAgLy8gYW4gYXZvaWRhYmxlIDMwMCsgTUIgcGVhay5cbiAgICBjb25zdCBidWZmZXIgPSB0b3RhbCA+IDAgPyBuZXcgVWludDhBcnJheSh0b3RhbCkgOiBudWxsO1xuICAgIGNvbnN0IGNodW5rczogVWludDhBcnJheVtdID0gW107XG4gICAgbGV0IHVzaW5nQnVmZmVyID0gYnVmZmVyICE9PSBudWxsO1xuICAgIGxldCByZWNlaXZlZCA9IDA7XG4gICAgLy8gQ2h1bmtzIGFycml2ZSBpbiB0ZW5zIG9mIGtpbG9ieXRlcywgc28gYSAxNjQgTUIgbW9kZWwgcHJvZHVjZXMgdGhvdXNhbmRzIG9mIHRoZW0uIEVtaXR0aW5nIG9uXG4gICAgLy8gZXZlcnkgb25lIHdvdWxkIHJ1biBjaGFuZ2UgZGV0ZWN0aW9uIGp1c3QgYXMgb2Z0ZW4gdG8gbW92ZSBhIGJhciB0aGF0IGlzIG1lYXN1cmVkIGluIHdob2xlXG4gICAgLy8gcGVyY2VudCwgc28gb25seSByZXBvcnQgd2hlbiB0aGUgZGlzcGxheWVkIHZhbHVlIHdvdWxkIGFjdHVhbGx5IGNoYW5nZS5cbiAgICBsZXQgbGFzdFJlcG9ydGVkID0gLTE7XG5cbiAgICBpZiAodG90YWwgPT09IDApIHtcbiAgICAgIHRoaXMubW9kZWxMb2FkUHJvZ3Jlc3MkLm5leHQobnVsbCk7XG4gICAgfVxuXG4gICAgZm9yICg7Oykge1xuICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICAgIGlmIChkb25lKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgIC8vIEZyZWUgdGhlIGNvbm5lY3Rpb24gcmF0aGVyIHRoYW4gbGVhdmluZyBpdCBkcmFpbmluZyBpbiB0aGUgYmFja2dyb3VuZC5cbiAgICAgICAgYXdhaXQgcmVhZGVyLmNhbmNlbCgpO1xuICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdNb2RlbCBsb2FkIGNhbmNlbGxlZCcsICdBYm9ydEVycm9yJyk7XG4gICAgICB9XG4gICAgICBpZiAodXNpbmdCdWZmZXIgJiYgcmVjZWl2ZWQgKyB2YWx1ZS5sZW5ndGggPiB0b3RhbCkge1xuICAgICAgICAvLyBDb250ZW50LUxlbmd0aCB1bmRlcnN0YXRlZCB0aGUgcmVhbCBzaXplLiBNb3ZlIHdoYXQgd2UgaGF2ZSBpbnRvIHRoZSBjaHVuayBsaXN0IGFuZCBzdGF5XG4gICAgICAgIC8vIHRoZXJlIGZvciB0aGUgcmVzdCBvZiB0aGUgcmVzcG9uc2UsIHJhdGhlciB0aGFuIHRydW5jYXRpbmcgdGhlIHRhaWwuXG4gICAgICAgIGNodW5rcy5wdXNoKGJ1ZmZlci5zbGljZSgwLCByZWNlaXZlZCkpO1xuICAgICAgICB1c2luZ0J1ZmZlciA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHVzaW5nQnVmZmVyKSB7XG4gICAgICAgIGJ1ZmZlci5zZXQodmFsdWUsIHJlY2VpdmVkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNodW5rcy5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJlY2VpdmVkICs9IHZhbHVlLmxlbmd0aDtcbiAgICAgIGlmICh0b3RhbCA+IDApIHtcbiAgICAgICAgY29uc3QgcGVyY2VudCA9IE1hdGgubWluKE1hdGgucm91bmQoKHJlY2VpdmVkIC8gdG90YWwpICogMTAwKSwgMTAwKTtcbiAgICAgICAgaWYgKHBlcmNlbnQgIT09IGxhc3RSZXBvcnRlZCkge1xuICAgICAgICAgIGxhc3RSZXBvcnRlZCA9IHBlcmNlbnQ7XG4gICAgICAgICAgdGhpcy5tb2RlbExvYWRQcm9ncmVzcyQubmV4dChwZXJjZW50IC8gMTAwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBzdHJlYW0gY2FuIGVuZCBiZWxvdyB0aGUgYWR2ZXJ0aXNlZCBzaXplIChvciB3aXRoIG5vIHNpemUgYXQgYWxsKS4gTGFuZCBvbiBhIGZ1bGwgYmFyXG4gICAgLy8gcmF0aGVyIHRoYW4gbGVhdmluZyBpdCBzdHVjayBhdCB3aGF0ZXZlciB0aGUgbGFzdCBjaHVuayBoYXBwZW5lZCB0byByZWFjaC5cbiAgICBpZiAodG90YWwgPiAwICYmIGxhc3RSZXBvcnRlZCAhPT0gMTAwKSB7XG4gICAgICB0aGlzLm1vZGVsTG9hZFByb2dyZXNzJC5uZXh0KDEpO1xuICAgIH1cblxuICAgIGxldCByZXN1bHQ6IEFycmF5QnVmZmVyO1xuICAgIGlmICh1c2luZ0J1ZmZlciAmJiByZWNlaXZlZCA9PT0gdG90YWwpIHtcbiAgICAgIHJlc3VsdCA9IGJ1ZmZlci5idWZmZXI7XG4gICAgfSBlbHNlIGlmICh1c2luZ0J1ZmZlcikge1xuICAgICAgLy8gRmV3ZXIgYnl0ZXMgdGhhbiBhZHZlcnRpc2VkOiBoYW5kIGJhY2sgZXhhY3RseSB3aGF0IGFycml2ZWQuXG4gICAgICByZXN1bHQgPSBidWZmZXIuYnVmZmVyLnNsaWNlKDAsIHJlY2VpdmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbWVyZ2VkID0gbmV3IFVpbnQ4QXJyYXkocmVjZWl2ZWQpO1xuICAgICAgbGV0IG9mZnNldCA9IDA7XG4gICAgICBjaHVua3MuZm9yRWFjaCgoY2h1bmspID0+IHtcbiAgICAgICAgbWVyZ2VkLnNldChjaHVuaywgb2Zmc2V0KTtcbiAgICAgICAgb2Zmc2V0ICs9IGNodW5rLmxlbmd0aDtcbiAgICAgIH0pO1xuICAgICAgcmVzdWx0ID0gbWVyZ2VkLmJ1ZmZlcjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLndyaXRlTW9kZWxUb0NhY2hlKGNhY2hlS2V5LCByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG1vZGVsIHN0b3JlLCBvciBudWxsIHdoZXJlIHRoZSBicm93c2VyIHdpbGwgbm90IGdpdmUgdXMgb25lLlxuICAgKlxuICAgKiBDYWNoZSBTdG9yYWdlIG5lZWRzIGEgc2VjdXJlIGNvbnRleHQsIHNvIGl0IGlzIGFic2VudCBvdmVyIHBsYWluIGh0dHAgYW5kIGluIHNvbWUgZW1iZWRkZWRcbiAgICogd2Vidmlld3MuIEV2ZXJ5IGNhbGxlciB0cmVhdHMgdGhhdCBhcyBhIG1pc3MgLSBjYWNoaW5nIGlzIGFuIG9wdGltaXNhdGlvbiwgbmV2ZXIgYSByZXF1aXJlbWVudC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgb3Blbk1vZGVsQ2FjaGUoKTogUHJvbWlzZTxDYWNoZSB8IG51bGw+IHtcbiAgICBpZiAodHlwZW9mIGNhY2hlcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGNhY2hlcy5vcGVuKFRocmVlSnNTZXJ2aWNlLk1PREVMX0NBQ0hFKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBIGNhY2hlZCBjb3B5IG9mIHRoaXMgbW9kZWwsIGlmIG9uZSB3YXMgc3RvcmVkLlxuICAgKlxuICAgKiBLZXllZCBieSB0aGUgUzMga2V5IHJhdGhlciB0aGFuIHRoZSBVUkwgaXQgaXMgZmV0Y2hlZCBmcm9tOiB0aGF0IFVSTCBpcyBzaWduZWQsIHNvIGl0IGNhcnJpZXMgYVxuICAgKiBmcmVzaCBzaWduYXR1cmUgYW5kIGV4cGlyeSBldmVyeSB0aW1lIGFuZCB3b3VsZCBuZXZlciBtYXRjaCB0d2ljZS4gVGhlIGJyb3dzZXIncyBvd24gSFRUUCBjYWNoZVxuICAgKiBtaXNzZXMgZm9yIHRoZSBzYW1lIHJlYXNvbiwgd2hpY2ggaXMgd2h5IHRoaXMgZXhpc3RzIGF0IGFsbC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVhZE1vZGVsRnJvbUNhY2hlKGNhY2hlS2V5Pzogc3RyaW5nKTogUHJvbWlzZTxBcnJheUJ1ZmZlciB8IG51bGw+IHtcbiAgICBpZiAoIWNhY2hlS2V5KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgdGhpcy5vcGVuTW9kZWxDYWNoZSgpO1xuICAgICAgY29uc3QgaGl0ID0gYXdhaXQgY2FjaGU/Lm1hdGNoKHRoaXMubW9kZWxDYWNoZVVybChjYWNoZUtleSkpO1xuICAgICAgcmV0dXJuIGhpdCA/IGF3YWl0IGhpdC5hcnJheUJ1ZmZlcigpIDogbnVsbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTdG9yZXMgYSBtb2RlbCBmb3IgbmV4dCB0aW1lLCBldmljdGluZyB0aGUgb2xkZXN0IG9uY2UgYSBmZXcgYXJlIGhlbGQuICovXG4gIHByaXZhdGUgYXN5bmMgd3JpdGVNb2RlbFRvQ2FjaGUoY2FjaGVLZXk6IHN0cmluZyB8IHVuZGVmaW5lZCwgbW9kZWw6IEFycmF5QnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFjYWNoZUtleSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgY2FjaGUgPSBhd2FpdCB0aGlzLm9wZW5Nb2RlbENhY2hlKCk7XG4gICAgICBpZiAoIWNhY2hlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGNhY2hlLnB1dCh0aGlzLm1vZGVsQ2FjaGVVcmwoY2FjaGVLZXkpLCBuZXcgUmVzcG9uc2UobW9kZWwpKTtcblxuICAgICAgLy8gTW9kZWxzIHJ1biB0byBodW5kcmVkcyBvZiBtZWdhYnl0ZXMsIHNvIHRoaXMgY2Fubm90IGdyb3cgd2l0aG91dCBsaW1pdC4gQ2FjaGUgU3RvcmFnZSBrZWVwc1xuICAgICAgLy8gaW5zZXJ0aW9uIG9yZGVyLCB3aGljaCBtYWtlcyB0aGUgZnJvbnQgb2YgdGhlIGxpc3QgdGhlIGxlYXN0IHJlY2VudGx5IHN0b3JlZC5cbiAgICAgIGNvbnN0IGtleXMgPSBhd2FpdCBjYWNoZS5rZXlzKCk7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAga2V5cy5zbGljZSgwLCBNYXRoLm1heCgwLCBrZXlzLmxlbmd0aCAtIFRocmVlSnNTZXJ2aWNlLk1PREVMX0NBQ0hFX1NJWkUpKVxuICAgICAgICAgIC5tYXAoKGtleSkgPT4gY2FjaGUuZGVsZXRlKGtleSkpXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gT3V0IG9mIHF1b3RhLCBwcml2YXRlIGJyb3dzaW5nLCBzdG9yYWdlIGRpc2FibGVkOiB0aGUgbW9kZWwgaXMgYWxyZWFkeSBsb2FkZWQgZWl0aGVyIHdheS5cbiAgICB9XG4gIH1cblxuICAvKiogQ2FjaGUgU3RvcmFnZSBrZXlzIG9uIGEgVVJMLCBzbyB0aGUgUzMga2V5IGlzIGV4cHJlc3NlZCBhcyBvbmUuIEl0IGlzIG5ldmVyIHJlcXVlc3RlZC4gKi9cbiAgcHJpdmF0ZSBtb2RlbENhY2hlVXJsKGNhY2hlS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgaHR0cHM6Ly8zZC1tb2RlbC1jYWNoZS5zbWFydGVycGxhbi5sb2NhbC8ke2VuY29kZVVSSUNvbXBvbmVudChjYWNoZUtleSl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXRzIHRoZSBjYW1lcmEncyBjbGlwcGluZyBwbGFuZXMgdG8gaG93IGJpZyB0aGUgbW9kZWwgYWN0dWFsbHkgaXMuXG4gICAqXG4gICAqIERlcHRoIHByZWNpc2lvbiBkZXBlbmRzIG9uIHRoZSBmYXIvbmVhciByYXRpbywgYW5kIHRoZSBmaXhlZCAwLjEgLyAxMDAwMCB0aGUgY2FtZXJhIHN0YXJ0cyB3aXRoXG4gICAqIGlzIGEgcmF0aW8gb2YgMTAwMDAwIGZvciBhIG1vZGVsIG9ubHkgfjEwIHVuaXRzIGFjcm9zcy4gVGhhdCB3YXN0ZXMgbW9zdCBvZiB0aGUgZGVwdGggYnVmZmVyIG9uXG4gICAqIGVtcHR5IHNwYWNlIGFuZCBsZXRzIG5lYXJseSBjb2luY2lkZW50IHN1cmZhY2VzIC0gd2hpY2ggY2FwdHVyZWQgbWVzaGVzIGhhdmUgZXZlcnl3aGVyZSAtXG4gICAqIGZsaWNrZXIgYWdhaW5zdCBlYWNoIG90aGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhZGp1c3RDbGlwcGluZ1BsYW5lcyhyYWRpdXM6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChyYWRpdXMgPCAxMCkge1xuICAgICAgdGhpcy5jYW1lcmEubmVhciA9IDAuMDE7XG4gICAgICB0aGlzLmNhbWVyYS5mYXIgPSAxMDA7XG4gICAgfSBlbHNlIGlmIChyYWRpdXMgPCAxMDApIHtcbiAgICAgIHRoaXMuY2FtZXJhLm5lYXIgPSAwLjE7XG4gICAgICB0aGlzLmNhbWVyYS5mYXIgPSAxMDAwO1xuICAgIH0gZWxzZSBpZiAocmFkaXVzIDwgMTAwMCkge1xuICAgICAgdGhpcy5jYW1lcmEubmVhciA9IDEwO1xuICAgICAgdGhpcy5jYW1lcmEuZmFyID0gMTAwMDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2FtZXJhLm5lYXIgPSAxMDA7XG4gICAgICB0aGlzLmNhbWVyYS5mYXIgPSAxMDAwMDAwO1xuICAgIH1cbiAgICB0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG4gIH1cblxuICAvKipcbiAgICogU3dhcHMgdGhlIFBCUiBtYXRlcmlhbHMgR0xURkxvYWRlciBidWlsZHMgZm9yIHRoZSBwbGFpbiBQaG9uZyBvbmVzIHRoZSAub2JqIHBhdGggcHJvZHVjZXMuXG4gICAqXG4gICAqIE1lc2hTdGFuZGFyZE1hdGVyaWFsIGtlZXBzIGEgc3BlY3VsYXIgcmVmbGVjdGlvbiBldmVuIGF0IG1ldGFsbmVzcyAwLCBzaW5jZSBldmVyeSBkaWVsZWN0cmljXG4gICAqIHJlZmxlY3RzIHNvbWUgbGlnaHQsIGFuZCBGcmVzbmVsIGRyaXZlcyB0aGF0IHJlZmxlY3Rpb24gdG93YXJkcyB3aGl0ZSBhcyBhIHN1cmZhY2UgdHVybnMgYXdheVxuICAgKiBmcm9tIHRoZSB2aWV3ZXIuIE9uIGFuIGFlcmlhbCB2aWV3IG9mIGEgZmFjYWRlIG1vc3Qgc3VyZmFjZXMgc2l0IGF0IGV4YWN0bHkgdGhvc2UgZ3JhemluZ1xuICAgKiBhbmdsZXMsIHdoaWNoIHBhaW50cyB3aGl0ZSBoaWdobGlnaHRzIG92ZXIgd2luZG93IGZyYW1lcyBhbmQgcm9vZiBlZGdlcyAtIHRoZSBzYW1lIG1vZGVsXG4gICAqIGxvYWRlZCBhcyAub2JqIG5ldmVyIHNob3dzIHRoZW0sIGJlY2F1c2UgTVRMTG9hZGVyIGJ1aWxkcyBQaG9uZyBtYXRlcmlhbHMgYW5kIE9CSkxvYWRlciB6ZXJvZXNcbiAgICogdGhlaXIgc3BlY3VsYXIgd2hlbiB0aGUgLm10bCBkZWNsYXJlcyBOcyAwLlxuICAgKlxuICAgKiBDYXB0dXJlZCBtb2RlbHMgY2FycnkgdGhlaXIgbGlnaHRpbmcgaW4gdGhlIHRleHR1cmUgYW5kIHdhbnQgbm8gc3BlY3VsYXIgcmVzcG9uc2UgYXQgYWxsLCBzb1xuICAgKiBtYXRjaGluZyB0aGUgLm9iaiBwYXRoIGhlcmUgaXMgYm90aCB0aGUgZml4IGFuZCB0aGUgbW9yZSBmYWl0aGZ1bCBjaG9pY2UuXG4gICAqL1xuICBwcml2YXRlIGNvbnZlcnRUb1Bob25nTWF0ZXJpYWxzKHJvb3Q6IFRIUkVFLk9iamVjdDNEKTogdm9pZCB7XG4gICAgY29uc3QgY29udmVydGVkID0gbmV3IE1hcDxhbnksIFRIUkVFLk1lc2hQaG9uZ01hdGVyaWFsPigpO1xuXG4gICAgcm9vdC50cmF2ZXJzZSgoY2hpbGQpID0+IHtcbiAgICAgIGNvbnN0IG1lc2ggPSBjaGlsZCBhcyBUSFJFRS5NZXNoO1xuICAgICAgaWYgKCEobWVzaCBhcyBhbnkpLmlzTWVzaCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbnZlcnQgPSAoc291cmNlOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgICBpZiAoIXNvdXJjZSB8fCAhKHNvdXJjZSBhcyBhbnkpLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwpIHtcbiAgICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY29udmVydGVkLmhhcyhzb3VyY2UpKSB7XG4gICAgICAgICAgY29uc3QgcGhvbmcgPSBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoe1xuICAgICAgICAgICAgbWFwOiBzb3VyY2UubWFwLFxuICAgICAgICAgICAgY29sb3I6IHNvdXJjZS5jb2xvcixcbiAgICAgICAgICAgIHRyYW5zcGFyZW50OiBzb3VyY2UudHJhbnNwYXJlbnQsXG4gICAgICAgICAgICBvcGFjaXR5OiBzb3VyY2Uub3BhY2l0eSxcbiAgICAgICAgICAgIGFscGhhVGVzdDogc291cmNlLmFscGhhVGVzdCxcbiAgICAgICAgICAgIHNpZGU6IHNvdXJjZS5zaWRlLFxuICAgICAgICAgICAgc3BlY3VsYXI6IG5ldyBUSFJFRS5Db2xvcigweDAwMDAwMCksXG4gICAgICAgICAgICBzaGluaW5lc3M6IDAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcGhvbmcubmFtZSA9IHNvdXJjZS5uYW1lO1xuICAgICAgICAgIGNvbnZlcnRlZC5zZXQoc291cmNlLCBwaG9uZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnZlcnRlZC5nZXQoc291cmNlKTtcbiAgICAgIH07XG5cbiAgICAgIG1lc2gubWF0ZXJpYWwgPSBBcnJheS5pc0FycmF5KG1lc2gubWF0ZXJpYWwpXG4gICAgICAgID8gbWVzaC5tYXRlcmlhbC5tYXAoY29udmVydClcbiAgICAgICAgOiBjb252ZXJ0KG1lc2gubWF0ZXJpYWwpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgZXZlcnkgbWF0ZXJpYWwgZG91YmxlLXNpZGVkLlxuICAgKlxuICAgKiBSZWFsaXR5IGNhcHR1cmUgbWVzaGVzIHJvdXRpbmVseSBjb250YWluIHRyaWFuZ2xlcyB3aXRoIHJldmVyc2VkIHdpbmRpbmcgLSBhbiBhcnRlZmFjdCBvZiB0aGVcbiAgICogcmVjb25zdHJ1Y3Rpb24sIG5vdCBvZiB0aGUgZmlsZS4gV2l0aCB0aGUgZGVmYXVsdCBGcm9udFNpZGUgdGhvc2UgdHJpYW5nbGVzIGFyZSBjdWxsZWQsIGxlYXZpbmdcbiAgICogc2NhdHRlcmVkIGhvbGVzIHRoYXQgc2hvdyB0aGUgc2NlbmUgYmFja2dyb3VuZCB0aHJvdWdoIHRoZSBtb2RlbC4gQWdhaW5zdCBhIGxpZ2h0IGJhY2tncm91bmRcbiAgICogdGhleSByZWFkIGFzIHdoaXRlIHNwZWNrcyB3aXRoIG5vIGRpc2Nlcm5pYmxlIHBhdHRlcm4uXG4gICAqXG4gICAqIERyYXdpbmcgYm90aCBzaWRlcyBjb3N0cyBhIGxpdHRsZSBmaWxsIHJhdGUgYnV0IGlzIHdoYXQgbWFrZXMgY2FwdHVyZWQgZ2VvbWV0cnkgcmVuZGVyIGFzXG4gICAqIHNvbGlkOyBvdGhlciB2aWV3ZXJzIG9mIHRoaXMga2luZCBvZiBjb250ZW50IGRvIHRoZSBzYW1lIHVuY29uZGl0aW9uYWxseS5cbiAgICovXG4gIHByaXZhdGUgZm9yY2VEb3VibGVTaWRlZE1hdGVyaWFscyhyb290OiBUSFJFRS5PYmplY3QzRCk6IHZvaWQge1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PGFueT4oKTtcbiAgICByb290LnRyYXZlcnNlKChjaGlsZCkgPT4ge1xuICAgICAgY29uc3QgbWVzaCA9IGNoaWxkIGFzIFRIUkVFLk1lc2g7XG4gICAgICBpZiAoIShtZXNoIGFzIGFueSkuaXNNZXNoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1hdGVyaWFscyA9IEFycmF5LmlzQXJyYXkobWVzaC5tYXRlcmlhbCkgPyBtZXNoLm1hdGVyaWFsIDogW21lc2gubWF0ZXJpYWxdO1xuICAgICAgbWF0ZXJpYWxzLmZvckVhY2goKG1hdGVyaWFsOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKG1hdGVyaWFsICYmICFzZWVuLmhhcyhtYXRlcmlhbCkpIHtcbiAgICAgICAgICBzZWVuLmFkZChtYXRlcmlhbCk7XG4gICAgICAgICAgbWF0ZXJpYWwuc2lkZSA9IFRIUkVFLkRvdWJsZVNpZGU7XG4gICAgICAgICAgbWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyByZWFsIHZlcnRleCBub3JtYWxzIGZvciBhbnkgZ2VvbWV0cnkgdGhhdCBhcnJpdmVkIHdpdGhvdXQgdGhlbS5cbiAgICpcbiAgICogQSBnbFRGIHdpdGhvdXQgYSBOT1JNQUwgYXR0cmlidXRlIGlzIHNwZWMtY29tcGxpYW50LCBhbmQgR0xURkxvYWRlciBoYW5kbGVzIGl0IGJ5IHN3aXRjaGluZyB0aGVcbiAgICogbWF0ZXJpYWwgdG8gZmxhdFNoYWRpbmcsIHdoaWNoIG1ha2VzIHRoZSBzaGFkZXIgZGVyaXZlIHRoZSBub3JtYWwgcGVyIHBpeGVsIGZyb20gc2NyZWVuLXNwYWNlXG4gICAqIGRlcml2YXRpdmVzLiBUaGF0IGRlcml2YXRpb24gY29sbGFwc2VzIG9uIHRoZSBkZWdlbmVyYXRlLCBuZWVkbGUtdGhpbiB0cmlhbmdsZXMgdGhhdCByZWFsaXR5XG4gICAqIGNhcHR1cmUgbWVzaGVzIGFyZSBmdWxsIG9mOiB0aGUgZmFjZSBoYXMgYWxtb3N0IG5vIGFyZWEsIHRoZSBkZXJpdmVkIG5vcm1hbCBpcyBtZWFuaW5nbGVzcywgYW5kXG4gICAqIGxpZ2h0aW5nIGJsb3dzIHRob3NlIGZyYWdtZW50cyBvdXQgdG8gd2hpdGUgc3BlY2tzIC0gZGVuc2VzdCBleGFjdGx5IHdoZXJlIGZpbmUgZGV0YWlsIGlzLlxuICAgKlxuICAgKiBDb21wdXRpbmcgbm9ybWFscyBmcm9tIHRoZSBnZW9tZXRyeSBpbnN0ZWFkIGlzIHJvYnVzdCB0byB0aG9zZSB0cmlhbmdsZXMsIHNpbmNlIGEgZGVnZW5lcmF0ZVxuICAgKiBmYWNlIGNvbnRyaWJ1dGVzIGFsbW9zdCBub3RoaW5nIHRvIHRoZSBhdmVyYWdlIGFuZCBpdHMgbmVpZ2hib3VycyBkb21pbmF0ZS5cbiAgICovXG4gIHByaXZhdGUgZW5zdXJlVmVydGV4Tm9ybWFscyhyb290OiBUSFJFRS5PYmplY3QzRCk6IHZvaWQge1xuICAgIHJvb3QudHJhdmVyc2UoKGNoaWxkKSA9PiB7XG4gICAgICBjb25zdCBtZXNoID0gY2hpbGQgYXMgVEhSRUUuTWVzaDtcbiAgICAgIGlmICghKG1lc2ggYXMgYW55KS5pc01lc2gpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZ2VvbWV0cnkgPSBtZXNoLmdlb21ldHJ5IGFzIFRIUkVFLkJ1ZmZlckdlb21ldHJ5O1xuICAgICAgaWYgKGdlb21ldHJ5LmdldEF0dHJpYnV0ZSgnbm9ybWFsJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBnZW9tZXRyeS5jb21wdXRlVmVydGV4Tm9ybWFscygpO1xuXG4gICAgICAvLyBHTFRGTG9hZGVyIGFscmVhZHkgc3dpdGNoZWQgdGhlc2UgbWF0ZXJpYWxzIHRvIGZsYXRTaGFkaW5nIGJlY2F1c2Ugbm9ybWFscyB3ZXJlIG1pc3Npbmc7XG4gICAgICAvLyBub3cgdGhhdCByZWFsIG9uZXMgZXhpc3QsIGxldCB0aGVtIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgZGVyaXZhdGl2ZSBmYWxsYmFjay5cbiAgICAgIGNvbnN0IG1hdGVyaWFscyA9IEFycmF5LmlzQXJyYXkobWVzaC5tYXRlcmlhbCkgPyBtZXNoLm1hdGVyaWFsIDogW21lc2gubWF0ZXJpYWxdO1xuICAgICAgbWF0ZXJpYWxzLmZvckVhY2goKG1hdGVyaWFsOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKG1hdGVyaWFsICYmIG1hdGVyaWFsLmZsYXRTaGFkaW5nKSB7XG4gICAgICAgICAgbWF0ZXJpYWwuZmxhdFNoYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICBtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZXMgaG93IGV2ZXJ5IHRleHR1cmUgaW4gYSBtb2RlbCBpcyBzYW1wbGVkOiBtYXhpbXVtIGFuaXNvdHJvcHksIGFuZCBubyBtaXBtYXBwaW5nLlxuICAgKlxuICAgKiBQaG90b2dyYW1tZXRyeSBhdGxhc2VzIHBhY2sgdGhlaXIgVVYgaXNsYW5kcyB3aXRoIHVudXNlZCBndXR0ZXIgcGl4ZWxzIGJldHdlZW4gdGhlbS4gTWlwbWFwcGluZ1xuICAgKiBhdmVyYWdlcyBuZWlnaGJvdXJpbmcgcGl4ZWxzIGF0IGVhY2ggbGV2ZWwsIHNvIHRob3NlIGd1dHRlcnMgYmxlZWQgZnVydGhlciBpbnRvIHRoZSBpc2xhbmRzIHRoZVxuICAgKiBzbWFsbGVyIHRoZSBsZXZlbCBnZXRzIC0gYW5kIHZpZXdpbmcgdGhlIHdob2xlIG1vZGVsIGF0IG9uY2UgdXNlcyB0aGUgc21hbGxlc3QgbGV2ZWxzLCBwYWludGluZ1xuICAgKiBicmlnaHQgZ3V0dGVyIHBpeGVscyBvdmVyIHRoZSBlZGdlcyBvZiBmaW5lIGRldGFpbC4gU2FtcGxpbmcgdGhlIGZ1bGwtcmVzb2x1dGlvbiBpbWFnZSBhdm9pZHNcbiAgICogdGhhdCwgYXQgdGhlIGNvc3Qgb2Ygc29tZSBzaGltbWVyIG9uIG1pbmlmaWVkIHN1cmZhY2VzLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgYW5pc290cm9weSBvbmx5IHRha2VzIGVmZmVjdCB3aGlsZSBtaXBtYXBwaW5nIGlzIG9uLCBzbyB3aXRoIHRoZSBzZXR0aW5ncyBiZWxvdyBpdCBpc1xuICAgKiBpbmVydDsgaXQgaXMgc2V0IGFueXdheSBzbyB0aGUgc2FtcGxpbmcgc3RheXMgY29ycmVjdCBmb3IgYW55b25lIHdobyByZS1lbmFibGVzIG1pcG1hcHMgaGVyZS5cbiAgICovXG4gIHByaXZhdGUgdHVuZVRleHR1cmVTYW1wbGluZyhyb290OiBUSFJFRS5PYmplY3QzRCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5yZW5kZXJlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtYXhBbmlzb3Ryb3B5ID0gdGhpcy5yZW5kZXJlci5jYXBhYmlsaXRpZXMuZ2V0TWF4QW5pc290cm9weSgpO1xuICAgIGlmICghbWF4QW5pc290cm9weSB8fCBtYXhBbmlzb3Ryb3B5IDw9IDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxhbnk+KCk7XG4gICAgcm9vdC50cmF2ZXJzZSgoY2hpbGQpID0+IHtcbiAgICAgIGNvbnN0IG1lc2ggPSBjaGlsZCBhcyBUSFJFRS5NZXNoO1xuICAgICAgaWYgKCEobWVzaCBhcyBhbnkpLmlzTWVzaCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBtYXRlcmlhbHMgPSBBcnJheS5pc0FycmF5KG1lc2gubWF0ZXJpYWwpID8gbWVzaC5tYXRlcmlhbCA6IFttZXNoLm1hdGVyaWFsXTtcbiAgICAgIG1hdGVyaWFscy5mb3JFYWNoKChtYXRlcmlhbDogYW55KSA9PiB7XG4gICAgICAgIGlmICghbWF0ZXJpYWwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2FtZSB0ZXh0dXJlIGlzIHJldXNlZCBhY3Jvc3MgdGhlIG1vZGVsJ3MgbWF0ZXJpYWxzOyBvbmx5IHRvdWNoIGVhY2ggb25lIG9uY2UuXG4gICAgICAgIFsnbWFwJywgJ25vcm1hbE1hcCcsICdyb3VnaG5lc3NNYXAnLCAnbWV0YWxuZXNzTWFwJywgJ2VtaXNzaXZlTWFwJywgJ2FvTWFwJ10uZm9yRWFjaCgoc2xvdCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHRleHR1cmUgPSBtYXRlcmlhbFtzbG90XTtcbiAgICAgICAgICBpZiAodGV4dHVyZSAmJiAhc2Vlbi5oYXModGV4dHVyZSkpIHtcbiAgICAgICAgICAgIHNlZW4uYWRkKHRleHR1cmUpO1xuICAgICAgICAgICAgdGV4dHVyZS5hbmlzb3Ryb3B5ID0gbWF4QW5pc290cm9weTtcbiAgICAgICAgICAgIHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG4gICAgICAgICAgICB0ZXh0dXJlLm1pbkZpbHRlciA9IFRIUkVFLkxpbmVhckZpbHRlcjtcbiAgICAgICAgICAgIHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhbiBPQkogbW9kZWwgd2l0aCBNVEwuXG4gICAqIFRoZSBoZWF2eSB0ZXh0LXBhcnNpbmcgc3RlcCBydW5zIGluIGEgV2ViIFdvcmtlciB3aGVuIG9uZSBoYXMgYmVlbiByZWdpc3RlcmVkIHZpYVxuICAgKiBzZXRPYmpQYXJzZXJXb3JrZXIgKHNlZSB0aGVyZSBmb3Igd2h5IHRoZSBhcHAsIG5vdCB0aGlzIGxpYnJhcnksIHByb3ZpZGVzIGl0KTsgdGhpcyBrZWVwc1xuICAgKiB0aGUgbWFpbiB0aHJlYWQgZnJlZSB3aGlsZSBsYXJnZSBhcmNoaXRlY3R1cmUgbW9kZWxzIChtaWxsaW9ucyBvZiB2ZXJ0aWNlcykgYXJlIHBhcnNlZC5cbiAgICogRmFsbHMgYmFjayB0byBwYXJzaW5nIG9uIHRoZSBtYWluIHRocmVhZCBvdGhlcndpc2UuXG4gICAqL1xuICBsb2FkT2JqTW9kZWwobXRsVXJsOiBzdHJpbmcsIG9ialVybDogc3RyaW5nLCBjYW1lcmFQb3NpdGlvbj86IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSwgcm90YXRpb24/OiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0pOiB2b2lkIHtcbiAgICBjb25zdCBtdGxMb2FkZXIgPSBuZXcgTVRMTG9hZGVyKCk7XG4gICAgY29uc3QgYmFzZVBhdGggPSBtdGxVcmwuc3Vic3RyaW5nKDAsIG10bFVybC5sYXN0SW5kZXhPZignLycpICsgMSk7XG4gICAgbXRsTG9hZGVyLnNldFBhdGgoYmFzZVBhdGgpO1xuICAgIGNvbnN0IG10bEZpbGVOYW1lID0gbXRsVXJsLnN1YnN0cmluZyhtdGxVcmwubGFzdEluZGV4T2YoJy8nKSArIDEpO1xuXG4gICAgdGhpcy5tb2RlbExvYWRpbmckLm5leHQodHJ1ZSk7XG5cbiAgICBtdGxMb2FkZXIubG9hZChtdGxGaWxlTmFtZSwgKG1hdGVyaWFscykgPT4ge1xuICAgICAgbWF0ZXJpYWxzLnByZWxvYWQoKTtcblxuICAgICAgaWYgKHRoaXMub2JqUGFyc2VyV29ya2VyKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdE9ialBhcnNlSW5Xb3JrZXIob2JqVXJsKVxuICAgICAgICAgIC50aGVuKChtZXNoZXMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gbmV3IFRIUkVFLkdyb3VwKCk7XG4gICAgICAgICAgICBtZXNoZXMuZm9yRWFjaCgobWVzaERhdGEpID0+IHtcbiAgICAgICAgICAgICAgZ3JvdXAuYWRkKHRoaXMubWVzaEZyb21QYXJzZWREYXRhKG1lc2hEYXRhLCBtYXRlcmlhbHMpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5wbGFjZUxvYWRlZE9iamVjdEluU2NlbmUoZ3JvdXAsIGNhbWVyYVBvc2l0aW9uLCByb3RhdGlvbik7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIE9CSiBtb2RlbCBpbiB3b3JrZXI6JywgZXJyb3IpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZpbmFsbHkoKCkgPT4gdGhpcy5tb2RlbExvYWRpbmckLm5leHQoZmFsc2UpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvYmpMb2FkZXIgPSBuZXcgT0JKTG9hZGVyKCk7XG4gICAgICBvYmpMb2FkZXIuc2V0TWF0ZXJpYWxzKG1hdGVyaWFscyk7XG5cbiAgICAgIG9iakxvYWRlci5sb2FkKG9ialVybCwgKG9iamVjdCkgPT4ge1xuICAgICAgICB0aGlzLnBsYWNlTG9hZGVkT2JqZWN0SW5TY2VuZShvYmplY3QsIGNhbWVyYVBvc2l0aW9uLCByb3RhdGlvbik7XG4gICAgICAgIHRoaXMubW9kZWxMb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgIH0sIHVuZGVmaW5lZCwgKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgT0JKIG1vZGVsOicsIGVycm9yKTtcbiAgICAgICAgdGhpcy5tb2RlbExvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgfSk7XG4gICAgfSwgdW5kZWZpbmVkLCAoZXJyb3IpID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgTVRMIGZpbGU6JywgZXJyb3IpO1xuICAgICAgdGhpcy5tb2RlbExvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIENlbnRlcnMsIHNjYWxlcyBhbmQgYWRkcyBhIGxvYWRlZCBvYmplY3QgdG8gdGhlIHNjZW5lLCB0aGVuIGZyYW1lcyB0aGUgY2FtZXJhIG9uIGl0LiAqL1xuICBwcml2YXRlIHBsYWNlTG9hZGVkT2JqZWN0SW5TY2VuZShvYmplY3Q6IFRIUkVFLk9iamVjdDNELCBjYW1lcmFQb3NpdGlvbj86IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSwgcm90YXRpb24/OiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0pOiB2b2lkIHtcbiAgICBjb25zdCBib3ggPSBuZXcgVEhSRUUuQm94MygpLnNldEZyb21PYmplY3Qob2JqZWN0KTtcbiAgICBjb25zdCBjZW50ZXIgPSBib3guZ2V0Q2VudGVyKG5ldyBUSFJFRS5WZWN0b3IzKCkpO1xuICAgIGNvbnN0IHNpemUgPSBib3guZ2V0U2l6ZShuZXcgVEhSRUUuVmVjdG9yMygpKTtcbiAgICBjb25zdCBtYXhEaW0gPSBNYXRoLm1heChzaXplLngsIHNpemUueSwgc2l6ZS56KTtcbiAgICBjb25zdCBzY2FsZSA9IG1heERpbSA+IDAgPyAxMCAvIG1heERpbSA6IDE7XG5cbiAgICAvLyBUd28gbmVzdGVkIGdyb3VwcyBzbyB0YWdzIGNhbiBzaGFyZSB0aGUgbW9kZWwncyBmcmFtZTogYGNlbnRlcmVkYCBjYXJyaWVzIHRoZSBvZmZzZXQgdGhhdFxuICAgIC8vIG1vdmVzIHRoZSBtb2RlbCdzIG93biBvcmlnaW4gdG8gdGhlIHNjZW5lIG9yaWdpbiwgYGdyb3VwYCBjYXJyaWVzIHRoZSBzY2FsZS4gQSB0YWcgcG9zaXRpb25lZFxuICAgIC8vIHdpdGggcmF3IFBPSSBjb29yZGluYXRlcyB0aGVuIGxhbmRzIGluIHRoZSBzYW1lIHBsYWNlIHRoZSBtb2RlbCdzIGdlb21ldHJ5IGRvZXMuXG4gICAgY29uc3QgZ3JvdXAgPSBuZXcgVEhSRUUuR3JvdXAoKTtcbiAgICBjb25zdCBjZW50ZXJlZCA9IG5ldyBUSFJFRS5Hcm91cCgpO1xuICAgIGNlbnRlcmVkLnBvc2l0aW9uLnN1YihjZW50ZXIpO1xuXG4gICAgaWYgKHJvdGF0aW9uKSB7XG4gICAgICBvYmplY3Qucm90YXRpb24uc2V0KHJvdGF0aW9uLngsIHJvdGF0aW9uLnksIHJvdGF0aW9uLnopO1xuICAgIH1cblxuICAgIHRoaXMubW9kZWxSb290ID0gb2JqZWN0O1xuICAgIC8vIE1hcmtzIHRoZSBtb2RlbCBmb3IgdGhlIGRlcHRoIHBpY2ssIHdoaWNoIHJlbmRlcnMgdGhpcyBsYXllciBhbG9uZSAtIHNvIHRhZ3MgYW5kIHRoZSBnaG9zdFxuICAgIC8vIGl0c2VsZiBjYW5ub3QgZW5kIHVwIGJlaW5nIHdoYXQgdGhlIGN1cnNvciByZXBvcnRzIGFzIHRoZSBzdXJmYWNlIHVuZGVyIGl0LlxuICAgIG9iamVjdC50cmF2ZXJzZSgoY2hpbGQpID0+IGNoaWxkLmxheWVycy5lbmFibGUoVGhyZWVKc1NlcnZpY2UuUElDS19MQVlFUikpO1xuICAgIGNlbnRlcmVkLmFkZChvYmplY3QpO1xuICAgIGNlbnRlcmVkLmFkZCh0aGlzLnRhZ0dyb3VwKTtcbiAgICBncm91cC5hZGQoY2VudGVyZWQpO1xuICAgIGdyb3VwLnNjYWxlLnNldFNjYWxhcihzY2FsZSk7XG5cbiAgICB0aGlzLnNjZW5lLmFkZChncm91cCk7XG5cbiAgICAvLyBUYWdzIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBtb2RlbCBmaW5pc2hlZCBsb2FkaW5nIHdlcmUgc2l6ZWQgYWdhaW5zdCB0aGUgb2xkIHNjYWxlLlxuICAgIHRoaXMudGFnU3ByaXRlcy5mb3JFYWNoKChzcHJpdGUpID0+IHRoaXMuc2NhbGVUYWdGb3JNb2RlbChzcHJpdGUpKTtcblxuICAgIHRoaXMuYWRqdXN0Q2xpcHBpbmdQbGFuZXMoKHNpemUubGVuZ3RoKCkgLyAyKSAqIHNjYWxlKTtcblxuICAgIGlmIChjYW1lcmFQb3NpdGlvbikge1xuICAgICAgdGhpcy5jYW1lcmEucG9zaXRpb24uc2V0KGNhbWVyYVBvc2l0aW9uLngsIGNhbWVyYVBvc2l0aW9uLnksIGNhbWVyYVBvc2l0aW9uLnopO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNhbWVyYS5wb3NpdGlvbi5zZXQoMCwgNSwgMTUpO1xuICAgIH1cbiAgICB0aGlzLmNvbnRyb2xzLnRhcmdldC5zZXQoMCwgMCwgMCk7XG4gICAgdGhpcy5jb250cm9scy51cGRhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBLZWVwcyB0aGUgZHJhd2luZyBidWZmZXIgYW5kIGNhbWVyYSBtYXRjaGVkIHRvIHRoZSBjYW52YXMgYXMgaXQgaXMgcmVzaXplZC5cbiAgICpcbiAgICogcmVuZGVyZXIuc2V0U2l6ZSgpIHdyaXRlcyBleHBsaWNpdCBwaXhlbCB3aWR0aC9oZWlnaHQgaW50byB0aGUgY2FudmFzJ3Mgc3R5bGUsIG92ZXJyaWRpbmcgdGhlXG4gICAqIDEwMCUvMTAwJSBpdCBzdGFydHMgd2l0aC4gV2l0aG91dCB0aGlzLCB0aGUgY2FudmFzIGtlZXBzIHdoYXRldmVyIHNpemUgaXQgaGFkIGF0IHN0YXJ0dXA6IGhpZGluZ1xuICAgKiB0aGUgdG9wIG1lbnUgZ3Jvd3MgdGhlIGNvbnRhaW5lciwgdGhlIGNhbnZhcyBkb2VzIG5vdCBmb2xsb3csIGFuZCB0aGUgc3RyaXAgdGhhdCBvcGVucyB1cCBzaG93c1xuICAgKiB0aGUgcGFnZSBiZWhpbmQgaXQgaW5zdGVhZCBvZiB0aGUgc2NlbmUuXG4gICAqXG4gICAqIFRoZSBwYXJlbnQgaXMgb2JzZXJ2ZWQgcmF0aGVyIHRoYW4gdGhlIGNhbnZhcywgYmVjYXVzZSByZXNpemluZyB0aGUgY2FudmFzIGlzIHdoYXQgdGhpcyByZWFjdHNcbiAgICogdG8gLSB3YXRjaGluZyB0aGUgZWxlbWVudCB3ZSByZXNpemUgd291bGQgcmV0cmlnZ2VyIHRoZSBvYnNlcnZlci5cbiAgICovXG4gIHByaXZhdGUgb2JzZXJ2ZUNhbnZhc1Jlc2l6ZShjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3QgY29udGFpbmVyID0gY2FudmFzLnBhcmVudEVsZW1lbnQ7XG4gICAgaWYgKCFjb250YWluZXIgfHwgdHlwZW9mIFJlc2l6ZU9ic2VydmVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY2FudmFzUmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgY29uc3Qgd2lkdGggPSBjb250YWluZXIuY2xpZW50V2lkdGg7XG4gICAgICBjb25zdCBoZWlnaHQgPSBjb250YWluZXIuY2xpZW50SGVpZ2h0O1xuICAgICAgaWYgKHdpZHRoID09PSAwIHx8IGhlaWdodCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmNhbWVyYS5hc3BlY3QgPSB3aWR0aCAvIGhlaWdodDtcbiAgICAgIHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICB9KTtcbiAgICB0aGlzLmNhbnZhc1Jlc2l6ZU9ic2VydmVyLm9ic2VydmUoY29udGFpbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIGFsaWdubWVudCB3YWxrdGhyb3VnaDogcGljayBhIHRhZywgdGhlbiBjbGljayB3aGVyZSBpdCByZWFsbHkgaXMsIHRocmVlIHRpbWVzLlxuICAgKlxuICAgKiBFeGlzdGluZyB0YWdzIGFyZSB0aGUgY29ycmVzcG9uZGVuY2VzIC0gdGhleSBhbHJlYWR5IGNhcnJ5IHRoZSBzdG9yZWQgY29vcmRpbmF0ZSwgc28gdGhlIHBlcnNvblxuICAgKiBvbmx5IGhhcyB0byBzdXBwbHkgdGhlIG1hdGNoaW5nIHNwb3Qgb24gdGhlIG1vZGVsLiBObyBuZXcgcmVjb3JkcyBhcmUgd3JpdHRlbjsgbm90aGluZyBpc1xuICAgKiBhcHBsaWVkIHVudGlsIHNvbHZlQWxpZ25tZW50RnJvbVBhaXJzKCkgc3VjY2VlZHMuXG4gICAqL1xuICBzdGFydFRhZ0FsaWdubWVudCgpOiB2b2lkIHtcbiAgICB0aGlzLmFsaWduaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmFsaWdubWVudFBhaXJzID0gW107XG4gICAgdGhpcy5hbGlnbm1lbnRTb3VyY2UgPSBudWxsO1xuICAgIGlmICh0aGlzLnJlbmRlcmVyKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2Nyb3NzaGFpcic7XG4gICAgfVxuICAgIHRoaXMuYWxpZ25tZW50UHJvZ3Jlc3MkLm5leHQoeyBwYWlyczogMCwgYXdhaXRpbmc6ICd0YWcnIH0pO1xuICB9XG5cbiAgY2FuY2VsVGFnQWxpZ25tZW50KCk6IHZvaWQge1xuICAgIGNvbnN0IHdhc0FsaWduaW5nID0gdGhpcy5hbGlnbmluZztcbiAgICB0aGlzLmFsaWduaW5nID0gZmFsc2U7XG4gICAgdGhpcy5hbGlnbm1lbnRQYWlycyA9IFtdO1xuICAgIHRoaXMuYWxpZ25tZW50U291cmNlID0gbnVsbDtcbiAgICB0aGlzLnBlbmRpbmdQcmV2aWV3RXZlbnQgPSBudWxsO1xuICAgIHRoaXMucmVtb3ZlUGxhY2VtZW50UHJldmlldygpO1xuICAgIGlmICh0aGlzLnJlbmRlcmVyKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2RlZmF1bHQnO1xuICAgIH1cbiAgICB0aGlzLmFsaWdubWVudFByb2dyZXNzJC5uZXh0KHsgcGFpcnM6IDAsIGF3YWl0aW5nOiBudWxsIH0pO1xuICAgIGlmICh3YXNBbGlnbmluZykge1xuICAgICAgdGhpcy5hbGlnbm1lbnRDYW5jZWxsZWQkLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICBpc0FsaWduaW5nVGFncygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hbGlnbmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwb2ludGVyIHNob3VsZCBiZSBzaG93aW5nIHRoZSBwbGFjZW1lbnQgZ2hvc3QuXG4gICAqXG4gICAqIFRydWUgd2hpbGUgcGxhY2luZyBhIHRhZywgYW5kIHdoaWxlIGNhbGlicmF0aW5nIG9uY2UgYSB0YWcgaGFzIGJlZW4gcGlja2VkIC0gdGhhdCBzZWNvbmQgY2xpY2tcbiAgICogaXMgdGhlIHNhbWUgcXVlc3Rpb24gKFwid2hlcmUgb24gdGhlIG1vZGVsP1wiKSBhbmQgZGVzZXJ2ZXMgdGhlIHNhbWUgYWltaW5nIGFpZC4gTm90IHRydWUgZm9yIHRoZVxuICAgKiBmaXJzdCBoYWxmIG9mIGEgcGFpciwgd2hpY2ggaXMgYSBjbGljayBvbiBhIHRhZywgbm90IG9uIHRoZSBtb2RlbC5cbiAgICovXG4gIHByaXZhdGUgaXNQcmV2aWV3aW5nUGxhY2VtZW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBsYWNpbmdUYWcgfHwgKHRoaXMuYWxpZ25pbmcgJiYgISF0aGlzLmFsaWdubWVudFNvdXJjZSk7XG4gIH1cblxuICAvKiogV2hldGhlciBhIHRhZyBpcyBjdXJyZW50bHkgcmVnaXN0ZXJlZCBmb3IgdGhpcyBlbGVtZW50LiAqL1xuICBoYXNUYWcoZWxlbWVudElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50YWdTcHJpdGVzLmhhcyhlbGVtZW50SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvbHZlcyBhbmQgYXBwbGllcyB0aGUgYWxpZ25tZW50IGNvbGxlY3RlZCBzbyBmYXIsIHJldHVybmluZyBpdCBzbyB0aGUgY2FsbGVyIGNhbiBwZXJzaXN0IGl0LlxuICAgKlxuICAgKiBSZXR1cm5zIG51bGwgd2hlbiB0aGUgdGhyZWUgdGFncyB0dXJuIG91dCB0byBiZSBjb2xsaW5lYXIsIGluIHdoaWNoIGNhc2Ugbm90aGluZyBpcyBhcHBsaWVkIGFuZFxuICAgKiB0aGUgd2Fsa3Rocm91Z2ggc3RheXMgb3BlbiBmb3IgdGhlIHBlcnNvbiB0byBwaWNrIGEgYmV0dGVyIHRoaXJkIHBvaW50LlxuICAgKi9cbiAgc29sdmVBbGlnbm1lbnRGcm9tUGFpcnMoKTogVGhyZWVKc0FsaWdubWVudCB8IG51bGwge1xuICAgIGNvbnN0IGFsaWdubWVudCA9IHNvbHZlVGhyZWVKc0FsaWdubWVudCh0aGlzLmFsaWdubWVudFBhaXJzKTtcbiAgICBpZiAoIWFsaWdubWVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRoaXMuc2V0VGFnQWxpZ25tZW50KGFsaWdubWVudCk7XG4gICAgdGhpcy5hbGlnbmluZyA9IGZhbHNlO1xuICAgIHRoaXMucGVuZGluZ1ByZXZpZXdFdmVudCA9IG51bGw7XG4gICAgdGhpcy5yZW1vdmVQbGFjZW1lbnRQcmV2aWV3KCk7XG4gICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdkZWZhdWx0JztcbiAgICB0aGlzLmFsaWdubWVudFByb2dyZXNzJC5uZXh0KHsgcGFpcnM6IHRoaXMuYWxpZ25tZW50UGFpcnMubGVuZ3RoLCBhd2FpdGluZzogbnVsbCB9KTtcbiAgICByZXR1cm4gYWxpZ25tZW50O1xuICB9XG5cbiAgLyoqIEhhbmRsZXMgYSBjbGljayB3aGlsZSB0aGUgYWxpZ25tZW50IHdhbGt0aHJvdWdoIGlzIHJ1bm5pbmcuICovXG4gIHByaXZhdGUgaGFuZGxlQWxpZ25tZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYWxpZ25tZW50U291cmNlKSB7XG4gICAgICAvLyBGaXJzdCBoYWxmIG9mIGEgcGFpcjogd2hpY2ggdGFnIGFyZSB3ZSB0YWxraW5nIGFib3V0P1xuICAgICAgY29uc3QgaGl0ID0gdGhpcy5yYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0cyh0aGlzLnRhZ0dyb3VwLmNoaWxkcmVuLCBmYWxzZSlbMF07XG4gICAgICBpZiAoIWhpdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBUaGUgc3ByaXRlJ3Mgb3duIHBvc2l0aW9uIGlzIHRoZSBzdG9yZWQgY29vcmRpbmF0ZSwgdW50b3VjaGVkIGJ5IGFueSBhbGlnbm1lbnQgYWxyZWFkeVxuICAgICAgLy8gYXBwbGllZCAtIHRoYXQgdHJhbnNmb3JtIGxpdmVzIG9uIHRoZSBncm91cCwgbm90IG9uIHRoZSBzcHJpdGUuXG4gICAgICBjb25zdCBzdG9yZWQgPSBoaXQub2JqZWN0LnBvc2l0aW9uO1xuICAgICAgdGhpcy5hbGlnbm1lbnRTb3VyY2UgPSB7IHg6IHN0b3JlZC54LCB5OiBzdG9yZWQueSwgejogc3RvcmVkLnogfTtcbiAgICAgIHRoaXMuYWxpZ25tZW50UHJvZ3Jlc3MkLm5leHQoe1xuICAgICAgICBwYWlyczogdGhpcy5hbGlnbm1lbnRQYWlycy5sZW5ndGgsXG4gICAgICAgIGF3YWl0aW5nOiAncG9pbnQnLFxuICAgICAgICB0YWdJZDogaGl0Lm9iamVjdC5uYW1lLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2Vjb25kIGhhbGY6IHdoZXJlIHRoYXQgdGFnIGFjdHVhbGx5IGJlbG9uZ3Mgb24gdGhlIG1vZGVsLlxuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMucGlja0FsaWdubWVudFRhcmdldChldmVudCk7XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hbGlnbm1lbnRQYWlycy5wdXNoKHsgc291cmNlOiB0aGlzLmFsaWdubWVudFNvdXJjZSwgdGFyZ2V0IH0pO1xuICAgIHRoaXMuYWxpZ25tZW50U291cmNlID0gbnVsbDtcbiAgICAvLyBUaGUgZ2hvc3QgYmVsb25ncyB0byB0aGUgY2xpY2sgdGhhdCBqdXN0IGhhcHBlbmVkOyB0aGUgbmV4dCBoYWxmIGlzIGEgY2xpY2sgb24gYSB0YWcuXG4gICAgdGhpcy5wZW5kaW5nUHJldmlld0V2ZW50ID0gbnVsbDtcbiAgICB0aGlzLnJlbW92ZVBsYWNlbWVudFByZXZpZXcoKTtcbiAgICB0aGlzLmFsaWdubWVudFByb2dyZXNzJC5uZXh0KHtcbiAgICAgIHBhaXJzOiB0aGlzLmFsaWdubWVudFBhaXJzLmxlbmd0aCxcbiAgICAgIGF3YWl0aW5nOiB0aGlzLmFsaWdubWVudFBhaXJzLmxlbmd0aCA+PSAzID8gbnVsbCA6ICd0YWcnLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEFybXMgdGFnIHBsYWNlbWVudDogdGhlIG5leHQgY2xpY2sgb24gdGhlIG1vZGVsIGRyb3BzIGEgdGFnIGluc3RlYWQgb2YgYmVpbmcgaWdub3JlZC4gKi9cbiAgc3RhcnRUYWdQbGFjZW1lbnQocG9pVHlwZTogUG9pVHlwZSB8IG51bGwgPSBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5wbGFjaW5nVGFnID0gdHJ1ZTtcbiAgICB0aGlzLnBsYWNlbWVudFBvaVR5cGUgPSBwb2lUeXBlO1xuICAgIHRoaXMucGVuZGluZ1RhZ1BsYWNlbWVudCA9IG51bGw7XG4gICAgaWYgKHRoaXMucmVuZGVyZXIpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnY3Jvc3NoYWlyJztcbiAgICB9XG4gIH1cblxuICAvKiogTGVhdmVzIHBsYWNlbWVudCBtb2RlIHdpdGhvdXQgcGxhY2luZyBhbnl0aGluZy4gKi9cbiAgY2FuY2VsVGFnUGxhY2VtZW50KCk6IHZvaWQge1xuICAgIHRoaXMucGxhY2luZ1RhZyA9IGZhbHNlO1xuICAgIHRoaXMucGVuZGluZ1RhZ1BsYWNlbWVudCA9IG51bGw7XG4gICAgdGhpcy5wZW5kaW5nUHJldmlld0V2ZW50ID0gbnVsbDtcbiAgICB0aGlzLnJlbW92ZVBsYWNlbWVudFByZXZpZXcoKTtcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xuICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdkZWZhdWx0JztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgYSB0cmFuc2x1Y2VudCB0YWcgdW5kZXIgdGhlIGN1cnNvciB3aGlsZSBwbGFjaW5nLCBzbyB0aGUgc3BvdCBpcyB2aXNpYmxlIGJlZm9yZSBjb21taXRpbmcuXG4gICAqXG4gICAqIE1hdHRlcnBvcnQgZG9lcyB0aGlzIHdpdGggYSB0YWcgdGhhdCBmb2xsb3dzIHRoZSBwb2ludGVyOyB0aGUgZXF1aXZhbGVudCBoZXJlIGlzIGEgcHJldmlld1xuICAgKiBzcHJpdGUgdGhhdCBnZXRzIHJlbW92ZWQgdGhlIG1vbWVudCB0aGUgcmVhbCB0YWcgdGFrZXMgaXRzIHBsYWNlLlxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVQbGFjZW1lbnRQcmV2aWV3KGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLnBpY2tQb2ludE9uR3B1KGV2ZW50KTtcbiAgICBpZiAoIXBvc2l0aW9uKSB7XG4gICAgICB0aGlzLnJlbW92ZVBsYWNlbWVudFByZXZpZXcoKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnbm90LWFsbG93ZWQnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnY3Jvc3NoYWlyJztcbiAgICBpZiAoIXRoaXMucGxhY2VtZW50UHJldmlldykge1xuICAgICAgdGhpcy5wbGFjZW1lbnRQcmV2aWV3ID0gbmV3IFRIUkVFLlNwcml0ZShcbiAgICAgICAgbmV3IFRIUkVFLlNwcml0ZU1hdGVyaWFsKHtcbiAgICAgICAgICBtYXA6IHRoaXMuY3JlYXRlVGFnVGV4dHVyZSgnIzlFOUU5RScpLFxuICAgICAgICAgIGRlcHRoVGVzdDogZmFsc2UsXG4gICAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgICAgICAgb3BhY2l0eTogMC42LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHRoaXMucGxhY2VtZW50UHJldmlldy5yZW5kZXJPcmRlciA9IDk5OTtcbiAgICAgIHRoaXMudGFnR3JvdXAuYWRkKHRoaXMucGxhY2VtZW50UHJldmlldyk7XG4gICAgICB0aGlzLnNjYWxlVGFnRm9yTW9kZWwodGhpcy5wbGFjZW1lbnRQcmV2aWV3KTtcbiAgICB9XG4gICAgdGhpcy5wbGFjZW1lbnRQcmV2aWV3LnBvc2l0aW9uLmNvcHkocG9zaXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwb2ludCB1bmRlciB0aGUgY3Vyc29yLCByZWFkIGZyb20gdGhlIGRlcHRoIGJ1ZmZlciBpbnN0ZWFkIG9mIHJheWNhc3QsIGluIHRhZyBzcGFjZS5cbiAgICpcbiAgICogQSByYXljYXN0IHdhbGtzIGV2ZXJ5IHRyaWFuZ2xlIG9mIHRoZSBtZXNoIGl0IGhpdHM6IG9uIGEgY2FwdHVyZWQgbW9kZWwgdGhhdCBpcyBtaWxsaW9ucyBvZlxuICAgKiB0aGVtLCB0ZW5zIG9mIG1pbGxpc2Vjb25kcywgZXZlcnkgdGltZSB0aGUgcG9pbnRlciBtb3Zlcy4gQ29hbGVzY2luZyB0byBvbmUgcGVyIGZyYW1lIGRpZCBub3RcbiAgICogaGVscCwgYmVjYXVzZSB0aGUgY29zdCBpcyB0aGUgcGljayBpdHNlbGYgLSBpdCBzaW1wbHkgYmVjYW1lIG9uZSBzbG93IGZyYW1lIGluc3RlYWQgb2Ygc2V2ZXJhbC5cbiAgICpcbiAgICogUmVuZGVyaW5nIHRoZSBtb2RlbCdzIGRlcHRoIGludG8gYSBzaW5nbGUgcGl4ZWwgdW5kZXIgdGhlIGN1cnNvciBhbnN3ZXJzIHRoZSBzYW1lIHF1ZXN0aW9uIG9uXG4gICAqIHRoZSBHUFUgaW4gY29uc3RhbnQgdGltZSwgd2hhdGV2ZXIgdGhlIG1vZGVsJ3Mgc2l6ZS4gVGhlIGNhbWVyYSdzIHZpZXcgb2Zmc2V0IGlzIHdoYXQgbmFycm93c1xuICAgKiB0aGUgd2hvbGUgaW1hZ2UgZG93biB0byB0aGF0IG9uZSBwaXhlbCwgc28gdGhlIHZhbHVlIHJlYWQgYmFjayBpcyB0aGUgZGVwdGggdGhlIGN1cnNvciBpcyBvdmVyLlxuICAgKlxuICAgKiBVc2VkIGZvciB0aGUgZ2hvc3Qgb25seS4gVGhlIGNsaWNrIHRoYXQgYWN0dWFsbHkgcGxhY2VzIGEgdGFnIHN0aWxsIHJheWNhc3RzOiBpdCBpcyBvbmUgcGljayxcbiAgICogaXRzIGNvc3QgZG9lcyBub3QgbWF0dGVyLCBhbmQgaXQgeWllbGRzIHRoZSBzdXJmYWNlIG5vcm1hbCwgd2hpY2ggZGVwdGggYWxvbmUgY2Fubm90IGdpdmUuXG4gICAqL1xuICBwcml2YXRlIHBpY2tQb2ludE9uR3B1KGV2ZW50OiBNb3VzZUV2ZW50KTogVEhSRUUuVmVjdG9yMyB8IG51bGwge1xuICAgIGlmICghdGhpcy5tb2RlbFJvb3QgfHwgIXRoaXMucmVuZGVyZXIgfHwgIXRoaXMuY2FtZXJhKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucGlja1RhcmdldCkge1xuICAgICAgdGhpcy5waWNrVGFyZ2V0ID0gbmV3IFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0KDEsIDEpO1xuICAgICAgdGhpcy5waWNrQ2FtZXJhID0gbmV3IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhKCk7XG4gICAgICB0aGlzLnBpY2tDYW1lcmEubGF5ZXJzLnNldChUaHJlZUpzU2VydmljZS5QSUNLX0xBWUVSKTtcbiAgICAgIHRoaXMucGlja0RlcHRoTWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaERlcHRoTWF0ZXJpYWwoe1xuICAgICAgICBkZXB0aFBhY2tpbmc6IFRIUkVFLlJHQkFEZXB0aFBhY2tpbmcsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZWN0ID0gdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHggPSBldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0O1xuICAgIGNvbnN0IHkgPSBldmVudC5jbGllbnRZIC0gcmVjdC50b3A7XG4gICAgaWYgKHggPCAwIHx8IHkgPCAwIHx8IHggPiByZWN0LndpZHRoIHx8IHkgPiByZWN0LmhlaWdodCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5waWNrQ2FtZXJhLmNvcHkodGhpcy5jYW1lcmEpO1xuICAgIHRoaXMucGlja0NhbWVyYS5sYXllcnMuc2V0KFRocmVlSnNTZXJ2aWNlLlBJQ0tfTEFZRVIpO1xuICAgIC8vIFJlbmRlcnMgdGhlIG9uZSBwaXhlbCB0aGUgY3Vyc29yIGlzIG92ZXIgYXMgaWYgaXQgd2VyZSB0aGUgd2hvbGUgaW1hZ2UgLSBvZmZzZXQgYnkgaGFsZiBhXG4gICAgLy8gcGl4ZWwgc28gdGhlIGN1cnNvciBzaXRzIGF0IHRoYXQgcGl4ZWwncyBjZW50cmUsIHdoaWNoIGlzIHdoZXJlIE5EQyAoMCwgMCkgbGFuZHMuXG4gICAgdGhpcy5waWNrQ2FtZXJhLnNldFZpZXdPZmZzZXQocmVjdC53aWR0aCwgcmVjdC5oZWlnaHQsIHggLSAwLjUsIHkgLSAwLjUsIDEsIDEpO1xuXG4gICAgLy8gV2hlcmUgdGhlIG1vZGVsIGlzIG5vdCwgdGhlIHBpeGVsIG11c3QgcmVhZCBhcyBcIm5vdGhpbmdcIiwgc28gaXQgaXMgY2xlYXJlZCB0byB3aGl0ZSAtIGEgdmFsdWVcbiAgICAvLyBubyByZWFsIGRlcHRoIHBhY2tzIHRvLiBUd28gdGhpbmdzIHdvdWxkIG90aGVyd2lzZSBwYWludCBvdmVyIHRoYXQ6IHRoZSBkZWZhdWx0IGJsYWNrIGNsZWFyLFxuICAgIC8vIHdoaWNoIGRlY29kZXMgYXMgZGVwdGggMCAoYSBoaXQgYWdhaW5zdCB0aGUgbGVucyksIGFuZCB0aGUgc2NlbmUgYmFja2dyb3VuZCwgd2hpY2ggdGhyZWUuanNcbiAgICAvLyBkcmF3cyBpbiBwbGFjZSBvZiB0aGUgY2xlYXIgY29sb3VyIHdoZW5ldmVyIG9uZSBpcyBzZXQuXG4gICAgY29uc3QgcHJldmlvdXNDbGVhckNvbG9yID0gdGhpcy5yZW5kZXJlci5nZXRDbGVhckNvbG9yKG5ldyBUSFJFRS5Db2xvcigpKTtcbiAgICBjb25zdCBwcmV2aW91c0NsZWFyQWxwaGEgPSB0aGlzLnJlbmRlcmVyLmdldENsZWFyQWxwaGEoKTtcbiAgICBjb25zdCBwcmV2aW91c1RhcmdldCA9IHRoaXMucmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7XG4gICAgY29uc3QgcHJldmlvdXNCYWNrZ3JvdW5kID0gdGhpcy5zY2VuZS5iYWNrZ3JvdW5kO1xuXG4gICAgdGhpcy5zY2VuZS5iYWNrZ3JvdW5kID0gbnVsbDtcbiAgICB0aGlzLnNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwgPSB0aGlzLnBpY2tEZXB0aE1hdGVyaWFsO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0Q2xlYXJDb2xvcigweGZmZmZmZiwgMSk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQodGhpcy5waWNrVGFyZ2V0KTtcbiAgICB0aGlzLnJlbmRlcmVyLmNsZWFyKCk7XG4gICAgdGhpcy5yZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5waWNrQ2FtZXJhKTtcblxuICAgIHRoaXMucmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVscyh0aGlzLnBpY2tUYXJnZXQsIDAsIDAsIDEsIDEsIHRoaXMucGlja1BpeGVsKTtcblxuICAgIHRoaXMucmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KHByZXZpb3VzVGFyZ2V0KTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldENsZWFyQ29sb3IocHJldmlvdXNDbGVhckNvbG9yLCBwcmV2aW91c0NsZWFyQWxwaGEpO1xuICAgIHRoaXMuc2NlbmUub3ZlcnJpZGVNYXRlcmlhbCA9IG51bGw7XG4gICAgdGhpcy5zY2VuZS5iYWNrZ3JvdW5kID0gcHJldmlvdXNCYWNrZ3JvdW5kO1xuXG4gICAgY29uc3QgW3IsIGcsIGIsIGFdID0gdGhpcy5waWNrUGl4ZWw7XG4gICAgaWYgKHIgPT09IDI1NSAmJiBnID09PSAyNTUgJiYgYiA9PT0gMjU1ICYmIGEgPT09IDI1NSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gVGhlIGludmVyc2Ugb2YgdGhyZWUncyBwYWNrRGVwdGhUb1JHQkEsIHdoaWNoIHN0b3JlcyB0aGUgdmFsdWUgaXRzZWxmIGluIGFscGhhIGFuZCBldmVyIGZpbmVyXG4gICAgLy8gZnJhY3Rpb25zIG9mIGl0IGluIGJsdWUsIGdyZWVuIGFuZCByZWQgLSBhbHBoYSBpcyB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlLCBub3QgcmVkLiBSZWFkIHRoZVxuICAgIC8vIG90aGVyIHdheSByb3VuZCwgdGhlIHJlc3VsdCBpcyBtb3N0bHkgdGhlIGxvdy1vcmRlciBub2lzZSwgb2Z0ZW4gbmVhciB6ZXJvLCB3aGljaCB1bnByb2plY3RzXG4gICAgLy8gb250byB0aGUgbmVhciBwbGFuZTogYSBnaG9zdCBwcmVzc2VkIGFnYWluc3QgdGhlIGxlbnMsIGZpbGxpbmcgdGhlIHdob2xlIHNjcmVlbi5cbiAgICBjb25zdCBkb3duc2NhbGUgPSAyNTUgLyAyNTY7XG4gICAgY29uc3QgZGVwdGggPVxuICAgICAgKHIgLyAyNTUpICogZG93bnNjYWxlIC8gKDI1NiAqIDI1NiAqIDI1NikgK1xuICAgICAgKGcgLyAyNTUpICogZG93bnNjYWxlIC8gKDI1NiAqIDI1NikgK1xuICAgICAgKGIgLyAyNTUpICogZG93bnNjYWxlIC8gMjU2ICtcbiAgICAgIChhIC8gMjU1KSAqIGRvd25zY2FsZTtcblxuICAgIC8vIE5EQyB4IGFuZCB5IGFyZSB6ZXJvIGJlY2F1c2UgdGhlIHBpeGVsIHJlYWQgaXMgdGhlIGNlbnRyZSBvZiB0aGF0IG9uZS1waXhlbCBpbWFnZSAtIHdoaWNoIG9ubHlcbiAgICAvLyBob2xkcyB3aGlsZSB0aGUgdmlldyBvZmZzZXQgaXMgaW4gZWZmZWN0LiBDbGVhcmluZyBpdCBmaXJzdCB3b3VsZCB1bnByb2plY3QgdGhyb3VnaCB0aGUgZnVsbFxuICAgIC8vIHZpZXcgaW5zdGVhZCwgbGFuZGluZyB0aGUgcG9pbnQgb24gdGhlIHJheSB0aHJvdWdoIHRoZSBtaWRkbGUgb2YgdGhlIHNjcmVlbi4gVGhlIG9mZnNldCBpc1xuICAgIC8vIHNpbXBseSByZXBsYWNlZCBieSB0aGUgbmV4dCBwaWNrLCBzbyBpdCBpcyBuZXZlciBjbGVhcmVkLlxuICAgIGNvbnN0IHdvcmxkID0gbmV3IFRIUkVFLlZlY3RvcjMoMCwgMCwgZGVwdGggKiAyIC0gMSkudW5wcm9qZWN0KHRoaXMucGlja0NhbWVyYSk7XG4gICAgdGhpcy50YWdHcm91cC51cGRhdGVXb3JsZE1hdHJpeCh0cnVlLCBmYWxzZSk7XG4gICAgcmV0dXJuIHRoaXMudGFnR3JvdXAud29ybGRUb0xvY2FsKHdvcmxkKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlUGxhY2VtZW50UHJldmlldygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGxhY2VtZW50UHJldmlldykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRhZ0dyb3VwLnJlbW92ZSh0aGlzLnBsYWNlbWVudFByZXZpZXcpO1xuICAgIHRoaXMucGxhY2VtZW50UHJldmlldy5tYXRlcmlhbC5tYXA/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLnBsYWNlbWVudFByZXZpZXcubWF0ZXJpYWwuZGlzcG9zZSgpO1xuICAgIHRoaXMucGxhY2VtZW50UHJldmlldyA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBTaG93cyBvciBoaWRlcyBvbmUgdGFnLCBsZWF2aW5nIGl0IHJlZ2lzdGVyZWQgc28gaXQgY2FuIGJlIGJyb3VnaHQgYmFjayB3aXRob3V0IHJlbG9hZGluZy4gKi9cbiAgc2V0VGFnVmlzaWJpbGl0eShlbGVtZW50SWQ6IHN0cmluZywgdmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IHNwcml0ZSA9IHRoaXMudGFnU3ByaXRlcy5nZXQoZWxlbWVudElkKTtcbiAgICBpZiAoc3ByaXRlKSB7XG4gICAgICBzcHJpdGUudmlzaWJsZSA9IHZpc2libGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIG9ubHkgdGFncyBvZiB0aGUgZ2l2ZW4gdHlwZXMsIGhpZGluZyB0aGUgcmVzdC5cbiAgICpcbiAgICogUGFzc2luZyBudWxsIHNob3dzIGV2ZXJ5dGhpbmcgLSB0aGUgXCJubyBmaWx0ZXJcIiBzdGF0ZSwgZGlzdGluY3QgZnJvbSBhbiBlbXB0eSBhcnJheSwgd2hpY2ggaXMgYVxuICAgKiBmaWx0ZXIgdGhhdCBoYXBwZW5zIHRvIG1hdGNoIG5vdGhpbmcuXG4gICAqL1xuICBzZXRWaXNpYmxlVGFnVHlwZXModHlwZXM6IFBvaVR5cGVbXSB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnRhZ1Nwcml0ZXMuZm9yRWFjaCgoc3ByaXRlKSA9PiB7XG4gICAgICBzcHJpdGUudmlzaWJsZSA9IHR5cGVzID09PSBudWxsIHx8IHR5cGVzLmluY2x1ZGVzKHNwcml0ZS51c2VyRGF0YS5wb2lUeXBlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyB0aGUgY2FtZXJhIHRvIGxvb2sgYXQgYSB0YWcsIG1pcnJvcmluZyBNYXR0ZXJwb3J0J3MgZ29Ub1RhZy5cbiAgICpcbiAgICogQW5pbWF0ZWQgcmF0aGVyIHRoYW4gdGVsZXBvcnRlZDoganVtcGluZyB0aGUgY2FtZXJhIGxvc2VzIHRoZSB2aWV3ZXIncyBzZW5zZSBvZiB3aGVyZSB0aGV5IHdlcmVcbiAgICogcmVsYXRpdmUgdG8gdGhlIG1vZGVsLiBUaGUgYXBwcm9hY2ggZGlzdGFuY2UgZm9sbG93cyB0aGUgbW9kZWwncyBzaXplIHNvIGl0IGZyYW1lcyBzZW5zaWJseVxuICAgKiB3aGF0ZXZlciB0aGUgdW5pdHMgYXJlLlxuICAgKi9cbiAgZ29Ub1RhZyhlbGVtZW50SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHNwcml0ZSA9IHRoaXMudGFnU3ByaXRlcy5nZXQoZWxlbWVudElkKTtcbiAgICBpZiAoIXNwcml0ZSB8fCAhdGhpcy5jYW1lcmEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXQgPSBzcHJpdGUuZ2V0V29ybGRQb3NpdGlvbihuZXcgVEhSRUUuVmVjdG9yMygpKTtcbiAgICBjb25zdCBkaXN0YW5jZSA9IHRoaXMubW9kZWxSb290XG4gICAgICA/IG5ldyBUSFJFRS5Cb3gzKCkuc2V0RnJvbU9iamVjdCh0aGlzLm1vZGVsUm9vdCkuZ2V0U2l6ZShuZXcgVEhSRUUuVmVjdG9yMygpKS5sZW5ndGgoKSAqIDAuMTVcbiAgICAgIDogNTtcblxuICAgIC8vIEFwcHJvYWNoIGFsb25nIHRoZSBjdXJyZW50IHZpZXdpbmcgZGlyZWN0aW9uLCBzbyB0aGUgY2FtZXJhIGNsb3NlcyBpbiByYXRoZXIgdGhhbiBzd2luZ2luZ1xuICAgIC8vIGFyb3VuZCB0byBhbiBhcmJpdHJhcnkgc2lkZS5cbiAgICBjb25zdCBkaXJlY3Rpb24gPSB0aGlzLmNhbWVyYS5wb3NpdGlvbi5jbG9uZSgpLnN1Yih0aGlzLmNvbnRyb2xzLnRhcmdldCkubm9ybWFsaXplKCk7XG4gICAgdGhpcy5jYW1lcmFUd2VlbiA9IHtcbiAgICAgIGZyb21Qb3NpdGlvbjogdGhpcy5jYW1lcmEucG9zaXRpb24uY2xvbmUoKSxcbiAgICAgIHRvUG9zaXRpb246IHRhcmdldC5jbG9uZSgpLmFkZChkaXJlY3Rpb24ubXVsdGlwbHlTY2FsYXIoZGlzdGFuY2UpKSxcbiAgICAgIGZyb21UYXJnZXQ6IHRoaXMuY29udHJvbHMudGFyZ2V0LmNsb25lKCksXG4gICAgICB0b1RhcmdldDogdGFyZ2V0LFxuICAgICAgc3RhcnRlZEF0OiBwZXJmb3JtYW5jZS5ub3coKSxcbiAgICAgIGR1cmF0aW9uTXM6IDYwMCxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEFkdmFuY2VzIHRoZSBjYW1lcmEgYW5pbWF0aW9uIHN0YXJ0ZWQgYnkgZ29Ub1RhZywgaWYgb25lIGlzIHJ1bm5pbmcuICovXG4gIHByaXZhdGUgc3RlcENhbWVyYVR3ZWVuKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW1lcmFUd2Vlbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IGZyb21Qb3NpdGlvbiwgdG9Qb3NpdGlvbiwgZnJvbVRhcmdldCwgdG9UYXJnZXQsIHN0YXJ0ZWRBdCwgZHVyYXRpb25NcyB9ID0gdGhpcy5jYW1lcmFUd2VlbjtcbiAgICBjb25zdCBsaW5lYXIgPSBNYXRoLm1pbigocGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydGVkQXQpIC8gZHVyYXRpb25NcywgMSk7XG4gICAgLy8gRWFzZSBvdXQsIHNvIHRoZSBtb3ZlIHNldHRsZXMgaW5zdGVhZCBvZiBzdG9wcGluZyBkZWFkLlxuICAgIGNvbnN0IHQgPSAxIC0gTWF0aC5wb3coMSAtIGxpbmVhciwgMyk7XG5cbiAgICB0aGlzLmNhbWVyYS5wb3NpdGlvbi5sZXJwVmVjdG9ycyhmcm9tUG9zaXRpb24sIHRvUG9zaXRpb24sIHQpO1xuICAgIHRoaXMuY29udHJvbHMudGFyZ2V0LmxlcnBWZWN0b3JzKGZyb21UYXJnZXQsIHRvVGFyZ2V0LCB0KTtcblxuICAgIGlmIChsaW5lYXIgPj0gMSkge1xuICAgICAgdGhpcy5jYW1lcmFUd2VlbiA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgaXNQbGFjaW5nVGFnKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBsYWNpbmdUYWc7XG4gIH1cblxuICAvKiogVGhlIHNwb3QgcGlja2VkIGJ5IHRoZSBsYXN0IHBsYWNlbWVudCwgZm9yIHdob2V2ZXIgY29tbWl0cyBpdCB0byBhIFBPSS4gKi9cbiAgZ2V0UGVuZGluZ1RhZ1BsYWNlbWVudCgpOiBUaHJlZUpzVGFnUGxhY2VtZW50IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucGVuZGluZ1RhZ1BsYWNlbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSYXljYXN0cyBhIGNsaWNrIGFnYWluc3QgdGhlIG1vZGVsJ3MgZ2VvbWV0cnkgYW5kIHJldHVybnMgdGhlIGhpdCwgaW4gd29ybGQgc3BhY2UuXG4gICAqXG4gICAqIFJldHVybnMgbnVsbCB3aGVuIHRoZSBjbGljayBtaXNzZWQsIHdoaWNoIGlzIGEgbm9ybWFsIG91dGNvbWUgLSB0aGUgdXNlciBjbGlja2VkIHRoZSBza3kgLSBhbmRcbiAgICogbGVhdmVzIHdoYXRldmVyIG1vZGUgaXMgYXJtZWQgc3RpbGwgYXJtZWQsIHNvIHRoZXkgY2FuIHNpbXBseSB0cnkgYWdhaW4uXG4gICAqL1xuICBwcml2YXRlIHJheWNhc3RNb2RlbChldmVudDogTW91c2VFdmVudCk6IFRIUkVFLkludGVyc2VjdGlvbiB8IG51bGwge1xuICAgIGlmICghdGhpcy5tb2RlbFJvb3QpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY3QgPSB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGhpcy5tb3VzZS54ID0gKChldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0KSAvIHJlY3Qud2lkdGgpICogMiAtIDE7XG4gICAgdGhpcy5tb3VzZS55ID0gLSgoZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wKSAvIHJlY3QuaGVpZ2h0KSAqIDIgKyAxO1xuICAgIHRoaXMucmF5Y2FzdGVyLnNldEZyb21DYW1lcmEodGhpcy5tb3VzZSwgdGhpcy5jYW1lcmEpO1xuXG4gICAgcmV0dXJuIHRoaXMucmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdCh0aGlzLm1vZGVsUm9vdCwgdHJ1ZSlbMF0gPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUdXJucyBhIGNsaWNrIGludG8gYSBwb2ludCBvbiB0aGUgbW9kZWwsIGluIHRoZSBmcmFtZSB0YWcgY29vcmRpbmF0ZXMgYXJlIHBlcnNpc3RlZCBpbi5cbiAgICpcbiAgICogVGhhdCBmcmFtZSBpcyB0aGUgdGFnIGdyb3VwJ3MsIG5vdCB0aGUgbW9kZWwncy4gQSBzdG9yZWQgY29vcmRpbmF0ZSBpcyByZWFkIGJhY2sgYXMgYSBzcHJpdGVcbiAgICogcG9zaXRpb24gaW5zaWRlIHRoYXQgZ3JvdXAsIHNvIGEgY29vcmRpbmF0ZSBjYXB0dXJlZCBpbiBhbnkgb3RoZXIgZnJhbWUgY29tZXMgYmFjayBkaXNwbGFjZWQgYnlcbiAgICogZXhhY3RseSBob3dldmVyIGZhciB0aGUgYWxpZ25tZW50IG1vdmVzIHRoZSBncm91cC4gVGhlIHR3byBmcmFtZXMgYWdyZWUgb25seSB3aGlsZSB0aGVcbiAgICogYWxpZ25tZW50IGlzIGlkZW50aXR5LCB3aGljaCBpcyB3aHkgdGhpcyBzdGF5ZWQgaW52aXNpYmxlIHVudGlsIGEgbW9kZWwgd2FzIGNhbGlicmF0ZWQuXG4gICAqL1xuICBwcml2YXRlIHBpY2tQbGFjZW1lbnRPbk1vZGVsKGV2ZW50OiBNb3VzZUV2ZW50KTogVGhyZWVKc1RhZ1BsYWNlbWVudCB8IG51bGwge1xuICAgIGNvbnN0IGhpdCA9IHRoaXMucmF5Y2FzdE1vZGVsKGV2ZW50KTtcbiAgICBpZiAoIWhpdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy50YWdHcm91cC51cGRhdGVXb3JsZE1hdHJpeCh0cnVlLCBmYWxzZSk7XG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLnRhZ0dyb3VwLndvcmxkVG9Mb2NhbChoaXQucG9pbnQuY2xvbmUoKSk7XG5cbiAgICAvLyBBIGZhY2Ugbm9ybWFsIGlzIGluIHRoZSBnZW9tZXRyeSdzIGxvY2FsIHNwYWNlIGFscmVhZHksIGJ1dCB0aGUgbWVzaCBpdCBiZWxvbmdzIHRvIG1heSBzaXRcbiAgICAvLyB1bmRlciB0cmFuc2Zvcm1zIG9mIGl0cyBvd24sIHNvIHRha2UgaXQgb3V0IHRocm91Z2ggdGhvc2UgYW5kIGJhY2sgaW50byB0aGUgdGFnIGZyYW1lLCBzbyBpdFxuICAgIC8vIGRlc2NyaWJlcyB0aGUgc2FtZSBvcmllbnRhdGlvbiB0aGUgcG9zaXRpb24gZG9lcy5cbiAgICBsZXQgbm9ybWFsID0gbmV3IFRIUkVFLlZlY3RvcjMoMCwgMSwgMCk7XG4gICAgaWYgKGhpdC5mYWNlKSB7XG4gICAgICBub3JtYWwgPSBoaXQuZmFjZS5ub3JtYWxcbiAgICAgICAgLmNsb25lKClcbiAgICAgICAgLnRyYW5zZm9ybURpcmVjdGlvbihoaXQub2JqZWN0Lm1hdHJpeFdvcmxkKVxuICAgICAgICAudHJhbnNmb3JtRGlyZWN0aW9uKG5ldyBUSFJFRS5NYXRyaXg0KCkuY29weSh0aGlzLnRhZ0dyb3VwLm1hdHJpeFdvcmxkKS5pbnZlcnQoKSlcbiAgICAgICAgLm5vcm1hbGl6ZSgpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwb3NpdGlvbjogeyB4OiBwb3NpdGlvbi54LCB5OiBwb3NpdGlvbi55LCB6OiBwb3NpdGlvbi56IH0sXG4gICAgICBub3JtYWw6IHsgeDogbm9ybWFsLngsIHk6IG5vcm1hbC55LCB6OiBub3JtYWwueiB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogV2hlcmUgdGhlIHVzZXIgc2F5cyBhIHRhZyByZWFsbHkgYmVsb25ncywgaW4gdGhlIHNwYWNlIHRoZSBzb2x2ZWQgYWxpZ25tZW50IG1hcHMgb250by5cbiAgICpcbiAgICogc2V0VGFnQWxpZ25tZW50IHdyaXRlcyB0aGUgc29sdXRpb24gdG8gdGhlIHRhZyBncm91cCdzIG93biB0cmFuc2Zvcm0sIHdoaWNoIGlzIGV4cHJlc3NlZFxuICAgKiByZWxhdGl2ZSB0byBpdHMgcGFyZW50IC0gc28gdGhlIHRhcmdldCBoYXMgdG8gYmUgaW4gdGhlIHBhcmVudCdzIGZyYW1lLiBNZWFzdXJpbmcgaXQgaW4gdGhlXG4gICAqIGdyb3VwJ3Mgb3duIGZyYW1lIGluc3RlYWQgd291bGQgZm9sZCB0aGUgY3VycmVudCBhbGlnbm1lbnQgaW50byB0aGUgYW5zd2VyLCBtYWtpbmcgZWFjaFxuICAgKiBjYWxpYnJhdGlvbiBkZXBlbmQgb24gdGhlIG9uZSBiZWZvcmUgaXQuXG4gICAqL1xuICBwcml2YXRlIHBpY2tBbGlnbm1lbnRUYXJnZXQoZXZlbnQ6IE1vdXNlRXZlbnQpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGNvbnN0IGhpdCA9IHRoaXMucmF5Y2FzdE1vZGVsKGV2ZW50KTtcbiAgICBpZiAoIWhpdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGZyYW1lID0gdGhpcy50YWdHcm91cC5wYXJlbnQgPz8gdGhpcy5zY2VuZTtcbiAgICBmcmFtZS51cGRhdGVXb3JsZE1hdHJpeCh0cnVlLCBmYWxzZSk7XG4gICAgY29uc3QgcG9pbnQgPSBmcmFtZS53b3JsZFRvTG9jYWwoaGl0LnBvaW50LmNsb25lKCkpO1xuICAgIHJldHVybiB7IHg6IHBvaW50LngsIHk6IHBvaW50LnksIHo6IHBvaW50LnogfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB0cmFuc2Zvcm0gbWFwcGluZyBjYXB0dXJlZCB0YWcgY29vcmRpbmF0ZXMgb250byB0aGlzIG1vZGVsJ3Mgc3BhY2UuXG4gICAqXG4gICAqIEV2ZXJ5IHRhZyBjb21lcyBmcm9tIHRoZSBzYW1lIHNvdXJjZSBzcGFjZSwgc28gdGhpcyBpcyBvbmUgdHJhbnNmb3JtIG9uIHRoZSBncm91cCByYXRoZXIgdGhhblxuICAgKiBwZXItdGFnIG1hdGhzIC0gd2hpY2ggYWxzbyBtZWFucyBpdCBhcHBsaWVzIHJldHJvYWN0aXZlbHkgdG8gdGFncyBhbHJlYWR5IHBsYWNlZCwgYW5kIGNhbiBiZVxuICAgKiBhZGp1c3RlZCBsaXZlIHdoaWxlIHNvbWVvbmUgZGlhbHMgdGhlIG51bWJlcnMgaW4uXG4gICAqXG4gICAqIFBhc3NpbmcgbnVsbCByZXNldHMgdG8gaWRlbnRpdHksIGkuZS4gdGFnIGNvb3JkaW5hdGVzIGFyZSBhbHJlYWR5IGluIG1vZGVsIHNwYWNlLlxuICAgKi9cbiAgc2V0VGFnQWxpZ25tZW50KGFsaWdubWVudDogVGhyZWVKc0FsaWdubWVudCB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCB7IHRyYW5zbGF0aW9uLCByb3RhdGlvbiwgc2NhbGUgfSA9IGFsaWdubWVudCA/PyB7fTtcbiAgICB0aGlzLnRhZ0dyb3VwLnBvc2l0aW9uLnNldCh0cmFuc2xhdGlvbj8ueCA/PyAwLCB0cmFuc2xhdGlvbj8ueSA/PyAwLCB0cmFuc2xhdGlvbj8ueiA/PyAwKTtcbiAgICB0aGlzLnRhZ0dyb3VwLnJvdGF0aW9uLnNldChyb3RhdGlvbj8ueCA/PyAwLCByb3RhdGlvbj8ueSA/PyAwLCByb3RhdGlvbj8ueiA/PyAwKTtcbiAgICB0aGlzLnRhZ0dyb3VwLnNjYWxlLnNldFNjYWxhcihzY2FsZSA/PyAxKTtcblxuICAgIC8vIFRhZyBzaXplIGlzIGRlcml2ZWQgZnJvbSB0aGUgd29ybGQgc2NhbGUgaXQgaW5oZXJpdHMsIHdoaWNoIHRoaXMgY2FsbCBqdXN0IGNoYW5nZWQuXG4gICAgdGhpcy50YWdTcHJpdGVzLmZvckVhY2goKHNwcml0ZSkgPT4gdGhpcy5zY2FsZVRhZ0Zvck1vZGVsKHNwcml0ZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSB0YWcsIG9yIG1vdmVzL3Jlc3R5bGVzIHRoZSBvbmUgYWxyZWFkeSByZWdpc3RlcmVkIGZvciB0aGlzIGVsZW1lbnQuXG4gICAqXG4gICAqIFVwc2VydCByYXRoZXIgdGhhbiBhIGRlY2xhcmF0aXZlIFwiaGVyZSBpcyB0aGUgZnVsbCBsaXN0XCIgY2FsbCwgYmVjYXVzZSB0YWdzIGFycml2ZSBwZXIgdHlwZVxuICAgKiAoZXF1aXBtZW50LCB0aGVuIHRpY2tldHMsIHRoZW4gbWVhc3VyZW1lbnRzLi4uKSBmcm9tIHNlcGFyYXRlIHN1YnNjcmlwdGlvbnMgLSByZXBsYWNpbmcgdGhlIHNldFxuICAgKiBvbiBlYWNoIG9mIHRob3NlIHdvdWxkIHdpcGUgdGhlIHR5cGVzIHRoYXQgY2FtZSBiZWZvcmUuXG4gICAqL1xuICB1cHNlcnRUYWcodGFnOiBUaHJlZUpzVGFnKTogdm9pZCB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLnRhZ1Nwcml0ZXMuZ2V0KHRhZy5pZCk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICBleGlzdGluZy5wb3NpdGlvbi5zZXQodGFnLnBvc2l0aW9uLngsIHRhZy5wb3NpdGlvbi55LCB0YWcucG9zaXRpb24ueik7XG4gICAgICBleGlzdGluZy51c2VyRGF0YS5wb2lUeXBlID0gdGFnLnBvaVR5cGUgPz8gZXhpc3RpbmcudXNlckRhdGEucG9pVHlwZTtcbiAgICAgIGV4aXN0aW5nLnVzZXJEYXRhLmxhYmVsID0gdGFnLmxhYmVsID8/IGV4aXN0aW5nLnVzZXJEYXRhLmxhYmVsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNwcml0ZSA9IG5ldyBUSFJFRS5TcHJpdGUoXG4gICAgICBuZXcgVEhSRUUuU3ByaXRlTWF0ZXJpYWwoe1xuICAgICAgICBtYXA6IHRoaXMuY3JlYXRlVGFnVGV4dHVyZSh0YWcuY29sb3IpLFxuICAgICAgICAvLyBUYWdzIHJlYWQgYXMgVUkgcmF0aGVyIHRoYW4gZ2VvbWV0cnksIHNvIHRoZXkgc3RheSB2aXNpYmxlIHRocm91Z2ggdGhlIG1vZGVsIGluc3RlYWQgb2ZcbiAgICAgICAgLy8gYmVpbmcgb2NjbHVkZWQgYnkgd2hhdGV2ZXIgd2FsbCBoYXBwZW5zIHRvIGJlIGJldHdlZW4gdGhlbSBhbmQgdGhlIGNhbWVyYS5cbiAgICAgICAgZGVwdGhUZXN0OiBmYWxzZSxcbiAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgICB9KVxuICAgICk7XG4gICAgc3ByaXRlLm5hbWUgPSB0YWcuaWQ7XG4gICAgc3ByaXRlLnVzZXJEYXRhLnBvaVR5cGUgPSB0YWcucG9pVHlwZSA/PyBudWxsO1xuICAgIHNwcml0ZS51c2VyRGF0YS5sYWJlbCA9IHRhZy5sYWJlbCA/PyBudWxsO1xuICAgIHNwcml0ZS5wb3NpdGlvbi5zZXQodGFnLnBvc2l0aW9uLngsIHRhZy5wb3NpdGlvbi55LCB0YWcucG9zaXRpb24ueik7XG4gICAgc3ByaXRlLnJlbmRlck9yZGVyID0gOTk5O1xuICAgIHRoaXMuc2NhbGVUYWdGb3JNb2RlbChzcHJpdGUpO1xuXG4gICAgdGhpcy50YWdHcm91cC5hZGQoc3ByaXRlKTtcbiAgICB0aGlzLnRhZ1Nwcml0ZXMuc2V0KHRhZy5pZCwgc3ByaXRlKTtcblxuICAgIGlmICh0YWcuaWNvblVybCkge1xuICAgICAgdGhpcy5hcHBseVRhZ0ljb24oc3ByaXRlLCB0YWcuaWNvblVybCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlbW92ZXMgdGhlIHRhZyByZWdpc3RlcmVkIGZvciBhbiBlbGVtZW50LCBpZiB0aGVyZSBpcyBvbmUuICovXG4gIHJlbW92ZVRhZyhlbGVtZW50SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHNwcml0ZSA9IHRoaXMudGFnU3ByaXRlcy5nZXQoZWxlbWVudElkKTtcbiAgICBpZiAoIXNwcml0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRhZ0dyb3VwLnJlbW92ZShzcHJpdGUpO1xuICAgIHNwcml0ZS5tYXRlcmlhbC5tYXA/LmRpc3Bvc2UoKTtcbiAgICBzcHJpdGUubWF0ZXJpYWwuZGlzcG9zZSgpO1xuICAgIHRoaXMudGFnU3ByaXRlcy5kZWxldGUoZWxlbWVudElkKTtcbiAgfVxuXG4gIC8qKiBSZW1vdmVzIGV2ZXJ5IHRhZyBmcm9tIHRoZSBzY2VuZS4gKi9cbiAgY2xlYXJUYWdzKCk6IHZvaWQge1xuICAgIFsuLi50aGlzLnRhZ1Nwcml0ZXMua2V5cygpXS5mb3JFYWNoKChpZCkgPT4gdGhpcy5yZW1vdmVUYWcoaWQpKTtcbiAgfVxuXG4gIC8qKiBMb2FkcyBhbiBpY29uIGludG8gYW4gZXhpc3RpbmcgdGFnLCBsZWF2aW5nIHRoZSBmYWxsYmFjayBkaXNjIGluIHBsYWNlIGlmIGl0IGZhaWxzLiAqL1xuICBwcml2YXRlIGFwcGx5VGFnSWNvbihzcHJpdGU6IFRIUkVFLlNwcml0ZSwgaWNvblVybDogc3RyaW5nKTogdm9pZCB7XG4gICAgbmV3IFRIUkVFLlRleHR1cmVMb2FkZXIoKS5sb2FkKFxuICAgICAgaWNvblVybCxcbiAgICAgICh0ZXh0dXJlKSA9PiB7XG4gICAgICAgIHNwcml0ZS5tYXRlcmlhbC5tYXA/LmRpc3Bvc2UoKTtcbiAgICAgICAgc3ByaXRlLm1hdGVyaWFsLm1hcCA9IHRleHR1cmU7XG4gICAgICAgIHNwcml0ZS5tYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgICB9LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgKCkgPT4gY29uc29sZS53YXJuKGBUaHJlZUpzU2VydmljZTogY291bGQgbm90IGxvYWQgdGFnIGljb24gXCIke2ljb25Vcmx9XCIsIGtlZXBpbmcgdGhlIGRlZmF1bHQgbWFya2VyLmApXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBEcmF3cyB0aGUgZGVmYXVsdCB0YWcgbWFya2VyOiBhIGZpbGxlZCBkaXNjIHdpdGggYSB3aGl0ZSByaW5nLCBzbyBpdCByZWFkcyBvbiBhbnkgYmFja2dyb3VuZC4gKi9cbiAgcHJpdmF0ZSBjcmVhdGVUYWdUZXh0dXJlKGNvbG9yID0gJyMxRTg4RTUnKTogVEhSRUUuQ2FudmFzVGV4dHVyZSB7XG4gICAgY29uc3Qgc2l6ZSA9IDEyODtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSBzaXplO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBzaXplO1xuICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcblxuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgY29udGV4dC5hcmMoc2l6ZSAvIDIsIHNpemUgLyAyLCBzaXplIC8gMiAtIDgsIDAsIE1hdGguUEkgKiAyKTtcbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGNvbG9yO1xuICAgIGNvbnRleHQuZmlsbCgpO1xuICAgIGNvbnRleHQubGluZVdpZHRoID0gODtcbiAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gJyNGRkZGRkYnO1xuICAgIGNvbnRleHQuc3Ryb2tlKCk7XG5cbiAgICByZXR1cm4gbmV3IFRIUkVFLkNhbnZhc1RleHR1cmUoY2FudmFzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaXplcyBhIHRhZyByZWxhdGl2ZSB0byB0aGUgbW9kZWwuXG4gICAqXG4gICAqIEEgc3ByaXRlIGluaGVyaXRzIHRoZSBtb2RlbCdzIHNjYWxlIGFuZCB0aGUgYWxpZ25tZW50J3MsIHNvIGEgZml4ZWQgc2l6ZSB3b3VsZCBjb21lIG91dCB0aW55IG9uXG4gICAqIGEgbGFyZ2UgbW9kZWwgYW5kIGh1Z2Ugb24gYSBzbWFsbCBvbmUuIERpdmlkaW5nIGJ5IHRoZSBncm91cCdzIHdvcmxkIHNjYWxlIGtlZXBzIHRhZ3MgdGhlIHNhbWVcbiAgICogc2l6ZSBvbiBzY3JlZW4gd2hhdGV2ZXIgdGhlIG1vZGVsJ3MgdW5pdHMgYXJlLlxuICAgKi9cbiAgcHJpdmF0ZSBzY2FsZVRhZ0Zvck1vZGVsKHNwcml0ZTogVEhSRUUuU3ByaXRlKTogdm9pZCB7XG4gICAgY29uc3Qgd29ybGRTY2FsZSA9IHRoaXMudGFnR3JvdXAuZ2V0V29ybGRTY2FsZShuZXcgVEhSRUUuVmVjdG9yMygpKS54IHx8IDE7XG4gICAgY29uc3Qgc2l6ZSA9IDAuNCAvIHdvcmxkU2NhbGU7XG4gICAgc3ByaXRlLnNjYWxlLnNldChzaXplLCBzaXplLCAxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHNlY29uZGFyeSBpbnRlcmFjdGl2ZSBvYmplY3RzIChlLmcuLCBQT0lzLCBzZW5zb3JzKSB0byB0aGUgc2NlbmUuXG4gICAqL1xuICB1cGRhdGVPYmpzVG9TY2VuZShvYmpzQWRkZWQ6IE9iakFkZGVkW10pOiB2b2lkIHtcbiAgICBjb25zdCBleGlzdGluZ0lkcyA9IHRoaXMuY2xpY2thYmxlT2JqZWN0cy5tYXAoKG9iaikgPT4gb2JqLm5hbWUpO1xuICAgIGNvbnN0IG9iakxvYWRlciA9IG5ldyBPQkpMb2FkZXIoKTtcblxuICAgIC8vIGRlbGV0ZSBvYmplY3RzIHRoYXQgYXJlIG5vdCBpbiB0aGUgcHJvdmlkZWQgYXJyYXlcbiAgICB0aGlzLmNsaWNrYWJsZU9iamVjdHMuZm9yRWFjaCgob2JqKSA9PiB7XG4gICAgICBpZiAoIW9ianNBZGRlZC5maW5kKChvYmpEYXRhKSA9PiBvYmpEYXRhLmlkID09PSBvYmoubmFtZSkpIHtcbiAgICAgICAgdGhpcy5zY2VuZS5yZW1vdmUob2JqKTtcbiAgICAgICAgdGhpcy5jbGlja2FibGVPYmplY3RzID0gdGhpcy5jbGlja2FibGVPYmplY3RzLmZpbHRlcihcbiAgICAgICAgICAob2JqZWN0KSA9PiBvYmplY3QubmFtZSAhPT0gb2JqLm5hbWVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIG9ianNBZGRlZC5mb3JFYWNoKChvYmplY3REYXRhOiBPYmpBZGRlZCkgPT4ge1xuICAgICAgaWYgKCFleGlzdGluZ0lkcy5pbmNsdWRlcyhvYmplY3REYXRhLmlkKSkge1xuICAgICAgICBvYmpMb2FkZXIubG9hZChvYmplY3REYXRhLmZpbGUsIChuZXdPYmplY3QpID0+IHtcbiAgICAgICAgICBuZXdPYmplY3QubmFtZSA9IG9iamVjdERhdGEuaWQ7XG5cbiAgICAgICAgICBuZXdPYmplY3QudHJhdmVyc2UoKGNoaWxkKSA9PiB7XG4gICAgICAgICAgICBpZiAoKGNoaWxkIGFzIFRIUkVFLk1lc2gpLmlzTWVzaCkge1xuICAgICAgICAgICAgICBjb25zdCBtZXNoID0gY2hpbGQgYXMgVEhSRUUuTWVzaDtcbiAgICAgICAgICAgICAgaWYgKG1lc2gubWF0ZXJpYWwgaW5zdGFuY2VvZiBUSFJFRS5NYXRlcmlhbCkge1xuICAgICAgICAgICAgICAgIG1lc2gubWF0ZXJpYWwudHJhbnNwYXJlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIG1lc2gubWF0ZXJpYWwub3BhY2l0eSA9IDAuODtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gc2V0IG9iamVjdCBwb3NpdGlvbiBhbmQgcm90YXRpb25cbiAgICAgICAgICBuZXdPYmplY3QucG9zaXRpb24uc2V0KFxuICAgICAgICAgICAgb2JqZWN0RGF0YS5wb3NpdGlvbi54LFxuICAgICAgICAgICAgb2JqZWN0RGF0YS5wb3NpdGlvbi55LFxuICAgICAgICAgICAgb2JqZWN0RGF0YS5wb3NpdGlvbi56XG4gICAgICAgICAgKTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBUaGUgSlNPTiBjb25maWd1cmF0aW9uIGhhcyByb3RhdGlvbiBhbHJlYWR5IGluIHJhZGlhbnMgKGUuZy4gMy4xNDE1Li4uKVxuICAgICAgICAgIG5ld09iamVjdC5yb3RhdGlvbi5zZXQoXG4gICAgICAgICAgICBvYmplY3REYXRhLnJvdGF0aW9uLngsXG4gICAgICAgICAgICBvYmplY3REYXRhLnJvdGF0aW9uLnksXG4gICAgICAgICAgICBvYmplY3REYXRhLnJvdGF0aW9uLnpcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgbmV3T2JqZWN0LnNjYWxlLnNldChvYmplY3REYXRhLnNjYWxlLngsIG9iamVjdERhdGEuc2NhbGUueSwgb2JqZWN0RGF0YS5zY2FsZS56KTtcblxuICAgICAgICAgIHRoaXMuc2NlbmUuYWRkKG5ld09iamVjdCk7XG4gICAgICAgICAgdGhpcy5jbGlja2FibGVPYmplY3RzLnB1c2gobmV3T2JqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG9uTW91c2VNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmdDYW1lcmEpIHtcbiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB0aGlzLm1vdXNlLnggPSAoKGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQpIC8gcmVjdC53aWR0aCkgKiAyIC0gMTtcbiAgICAgIHRoaXMubW91c2UueSA9IC0oKGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcCkgLyByZWN0LmhlaWdodCkgKiAyICsgMTtcblxuICAgICAgdGhpcy5yYXljYXN0ZXIuc2V0RnJvbUNhbWVyYSh0aGlzLm1vdXNlLCB0aGlzLmNhbWVyYSk7XG5cbiAgICAgIC8vIFdoaWxlIHRoZSBnaG9zdCBpcyB1cCBpdCBmb2xsb3dzIHRoZSBwb2ludGVyIGFuZCBub3RoaW5nIGVsc2Ugc2hvdWxkIHJlYWN0IHRvIGl0LiBUaGUgbW92ZVxuICAgICAgLy8gaXMgb25seSByZWNvcmRlZCBoZXJlOiBwb2ludGVyIGV2ZW50cyBmaXJlIGZhciBtb3JlIG9mdGVuIHRoYW4gZnJhbWVzLCBhbmQgcGlja2luZyBhIHBvaW50XG4gICAgICAvLyBjb3N0cyBhIHJheWNhc3QgYWdhaW5zdCB0aGUgd2hvbGUgbW9kZWwsIHNvIGRvaW5nIGl0IHBlciBldmVudCBpcyB3aGF0IG1hZGUgdGhlIGdob3N0IHRyYWlsXG4gICAgICAvLyBiZWhpbmQgdGhlIGN1cnNvci4gVGhlIHJlbmRlciBsb29wIHBpY2tzIHVwIHRoZSBsYXRlc3QgcG9zaXRpb24sIG9uY2UsIHBlciBmcmFtZS5cbiAgICAgIGlmICh0aGlzLmlzUHJldmlld2luZ1BsYWNlbWVudCgpKSB7XG4gICAgICAgIHRoaXMucGVuZGluZ1ByZXZpZXdFdmVudCA9IGV2ZW50O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIE5vdCBwcmV2aWV3aW5nIGFueSBtb3JlIChhIHBhaXIgd2FzIGp1c3QgY29tcGxldGVkLCBzYXkpOiBkcm9wIGEgZ2hvc3QgbGVmdCBvdmVyIGZyb20gaXQuXG4gICAgICB0aGlzLnJlbW92ZVBsYWNlbWVudFByZXZpZXcoKTtcblxuICAgICAgLy8gVGFncyBmaXJzdDogdGhleSBkcmF3IG9uIHRvcCBvZiB0aGUgbW9kZWwsIHNvIHRoZXkgaGF2ZSB0byBhbnN3ZXIgdGhlIHBvaW50ZXIgZmlyc3QgdG9vLlxuICAgICAgY29uc3QgaG92ZXJlZFRhZyA9IHRoaXMucmF5Y2FzdGVyXG4gICAgICAgIC5pbnRlcnNlY3RPYmplY3RzKHRoaXMudGFnR3JvdXAuY2hpbGRyZW4sIGZhbHNlKVxuICAgICAgICAuZmluZCgoaGl0KSA9PiBoaXQub2JqZWN0LnZpc2libGUpPy5vYmplY3Q7XG4gICAgICBpZiAoaG92ZXJlZFRhZykge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInO1xuICAgICAgICB0aGlzLm9iamVjdEhvdmVyZWQkLm5leHQobnVsbCk7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gaG92ZXJlZFRhZy51c2VyRGF0YS5sYWJlbDtcbiAgICAgICAgdGhpcy50YWdIb3ZlcmVkJC5uZXh0KGxhYmVsID8geyBsYWJlbCwgZXZlbnQgfSA6IG51bGwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnRhZ0hvdmVyZWQkLm5leHQobnVsbCk7XG5cbiAgICAgIGNvbnN0IGludGVyc2VjdHMgPSB0aGlzLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKHRoaXMuY2xpY2thYmxlT2JqZWN0cywgdHJ1ZSk7XG5cbiAgICAgIGlmIChpbnRlcnNlY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJztcbiAgICAgICAgY29uc3QgaW50ZXJzZWN0ZWRPYmplY3RJZCA9IGludGVyc2VjdHNbMF0ub2JqZWN0Py5wYXJlbnQ/Lm5hbWU7XG4gICAgICAgIGlmIChpbnRlcnNlY3RlZE9iamVjdElkKSB7XG4gICAgICAgICAgICB0aGlzLm9iamVjdEhvdmVyZWQkLm5leHQoeyBpZDogaW50ZXJzZWN0ZWRPYmplY3RJZCwgZXZlbnQgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XG4gICAgICAgIHRoaXMub2JqZWN0SG92ZXJlZCQubmV4dChudWxsKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdncmFiYmluZyc7XG4gICAgICB0aGlzLm9iamVjdEhvdmVyZWQkLm5leHQobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbk1vdXNlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZ0NhbWVyYSkge1xuICAgICAgY29uc3QgcmVjdCA9IHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHRoaXMubW91c2UueCA9ICgoZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoKSAqIDIgLSAxO1xuICAgICAgdGhpcy5tb3VzZS55ID0gLSgoZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wKSAvIHJlY3QuaGVpZ2h0KSAqIDIgKyAxO1xuXG4gICAgICAvLyBBbGlnbm1lbnQgYW5kIHBsYWNlbWVudCBib3RoIHRha2UgdGhlIGNsaWNrIGJlZm9yZSBhbnl0aGluZyBjYW4gYmUgb3BlbmVkIGJ5IGl0LlxuICAgICAgaWYgKHRoaXMuYWxpZ25pbmcpIHtcbiAgICAgICAgdGhpcy5yYXljYXN0ZXIuc2V0RnJvbUNhbWVyYSh0aGlzLm1vdXNlLCB0aGlzLmNhbWVyYSk7XG4gICAgICAgIHRoaXMuaGFuZGxlQWxpZ25tZW50Q2xpY2soZXZlbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFBsYWNlbWVudCB3aW5zIG92ZXIgZXZlcnl0aGluZzogd2hpbGUgYXJtZWQsIGEgY2xpY2sgbWVhbnMgXCJwdXQgaXQgaGVyZVwiLCBub3QgXCJvcGVuIHRoYXRcIi5cbiAgICAgIGlmICh0aGlzLnBsYWNpbmdUYWcpIHtcbiAgICAgICAgY29uc3QgcGxhY2VtZW50ID0gdGhpcy5waWNrUGxhY2VtZW50T25Nb2RlbChldmVudCk7XG4gICAgICAgIGlmIChwbGFjZW1lbnQpIHtcbiAgICAgICAgICBwbGFjZW1lbnQucG9pVHlwZSA9IHRoaXMucGxhY2VtZW50UG9pVHlwZTtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdUYWdQbGFjZW1lbnQgPSBwbGFjZW1lbnQ7XG4gICAgICAgICAgdGhpcy5wbGFjaW5nVGFnID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5yZW1vdmVQbGFjZW1lbnRQcmV2aWV3KCk7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdkZWZhdWx0JztcbiAgICAgICAgICB0aGlzLnRhZ1BsYWNlZCQubmV4dChwbGFjZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yYXljYXN0ZXIuc2V0RnJvbUNhbWVyYSh0aGlzLm1vdXNlLCB0aGlzLmNhbWVyYSk7XG5cbiAgICAgIC8vIFNhbWUgcHJlY2VkZW5jZSBhcyBob3ZlcjogYSB0YWcgZHJhd24gb3ZlciB0aGUgbW9kZWwgY2xhaW1zIHRoZSBjbGljay5cbiAgICAgIGNvbnN0IHRhZ0hpdHMgPSB0aGlzLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKHRoaXMudGFnR3JvdXAuY2hpbGRyZW4sIGZhbHNlKVxuICAgICAgICAuZmlsdGVyKChoaXQpID0+IGhpdC5vYmplY3QudmlzaWJsZSk7XG4gICAgICBpZiAodGFnSGl0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHRhZyA9IHRhZ0hpdHNbMF0ub2JqZWN0O1xuICAgICAgICB0aGlzLnRhZ0NsaWNrZWQkLm5leHQoeyBlbGVtZW50SWQ6IHRhZy5uYW1lLCBwb2lUeXBlOiB0YWcudXNlckRhdGEucG9pVHlwZSA/PyBudWxsIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGludGVyc2VjdHMgPSB0aGlzLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKHRoaXMuY2xpY2thYmxlT2JqZWN0cywgdHJ1ZSk7XG5cbiAgICAgIGlmIChpbnRlcnNlY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgY2xpY2tlZE9iamVjdCA9IGludGVyc2VjdHNbMF0ub2JqZWN0O1xuICAgICAgICBjb25zdCBpZCA9IGNsaWNrZWRPYmplY3Q/LnBhcmVudD8ubmFtZTtcbiAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICB0aGlzLm9iamVjdENsaWNrZWQkLm5leHQoaWQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9iamVjdENsaWNrZWQkLm5leHQobnVsbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVzY2FwZSBjYW5jZWxzIHdoYXRldmVyIHRoZSBwb2ludGVyIGlzIGN1cnJlbnRseSBjb21taXR0ZWQgdG8uXG4gICAqXG4gICAqIEVtaXRzIHRocm91Z2ggdGhlIHNhbWUgc3ViamVjdHMgdGhlIGV4cGxpY2l0IENhbmNlbCBidXR0b25zIHVzZSwgc28gdGhlIFVJIGRyaXZpbmcgdGhlbSBmb2xsb3dzXG4gICAqIGFsb25nIGluc3RlYWQgb2YgYmVpbmcgbGVmdCBzaG93aW5nIGEgbW9kZSB0aGF0IGlzIG5vIGxvbmdlciBhcm1lZC5cbiAgICovXG4gIHByaXZhdGUgb25LZXlEb3duID0gKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCA9PiB7XG4gICAgaWYgKGV2ZW50LmtleSAhPT0gJ0VzY2FwZScpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMucGxhY2luZ1RhZykge1xuICAgICAgLy8gTm90aGluZyBvdXRzaWRlIHRoZSBzY2VuZSB0cmFja3MgcGxhY2VtZW50LCBzbyBjbGVhcmluZyBpdCBoZXJlIGlzIHRoZSB3aG9sZSBvZiBpdC5cbiAgICAgIHRoaXMuY2FuY2VsVGFnUGxhY2VtZW50KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmFsaWduaW5nKSB7XG4gICAgICB0aGlzLmNhbmNlbFRhZ0FsaWdubWVudCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYW5pbWF0ZSA9ICgpOiB2b2lkID0+IHtcbiAgICB0aGlzLmFuaW1hdGlvbkZyYW1lSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5hbmltYXRlKTtcbiAgICB0aGlzLnN0ZXBDYW1lcmFUd2VlbigpO1xuICAgIHRoaXMuY29udHJvbHMudXBkYXRlKCk7XG5cbiAgICAvLyBPbmUgcGljayBwZXIgZnJhbWUsIGFnYWluc3QgdGhlIHBvaW50ZXIncyBsYXRlc3QgcG9zaXRpb24gLSBzZWUgb25Nb3VzZU1vdmUuXG4gICAgaWYgKHRoaXMucGVuZGluZ1ByZXZpZXdFdmVudCkge1xuICAgICAgY29uc3QgZXZlbnQgPSB0aGlzLnBlbmRpbmdQcmV2aWV3RXZlbnQ7XG4gICAgICB0aGlzLnBlbmRpbmdQcmV2aWV3RXZlbnQgPSBudWxsO1xuICAgICAgdGhpcy51cGRhdGVQbGFjZW1lbnRQcmV2aWV3KGV2ZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSk7XG4gIH1cblxuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFuaW1hdGlvbkZyYW1lSWQpIHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0aW9uRnJhbWVJZCk7XG4gICAgfVxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5vbktleURvd24pO1xuICAgIGlmICh0aGlzLmNhbnZhc1Jlc2l6ZU9ic2VydmVyKSB7XG4gICAgICB0aGlzLmNhbnZhc1Jlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgIHRoaXMuY2FudmFzUmVzaXplT2JzZXJ2ZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRoaXMuZGlzY2FyZEN1cnJlbnRMb2FkKCk7XG4gICAgdGhpcy5jbGVhclRhZ3MoKTtcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xuICAgICAgdGhpcy5yZW5kZXJlci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbnRyb2xzKSB7XG4gICAgICB0aGlzLmNvbnRyb2xzLmRpc3Bvc2UoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
1587
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyZWVqcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy90aHJlZWpzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDMUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUNuRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQW9EL0I7Ozs7OztHQU1HO0FBQ0gsU0FBUyxlQUFlLENBQUMsQ0FBZ0IsRUFBRSxDQUFnQixFQUFFLENBQWdCO0lBQzNFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUM7UUFDMUIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBRWYsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMs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QUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUIsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7d0dBeHBEVSxjQUFjOzRHQUFkLGNBQWMsY0FGYixNQUFNOzs0RkFFUCxjQUFjO2tCQUgxQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XHJcbmltcG9ydCB7IE9yYml0Q29udHJvbHMgfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vY29udHJvbHMvT3JiaXRDb250cm9scyc7XHJcbmltcG9ydCB7IE9CSkxvYWRlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL09CSkxvYWRlcic7XHJcbmltcG9ydCB7IE1UTExvYWRlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL01UTExvYWRlcic7XHJcbmltcG9ydCB7IEdMVEZMb2FkZXIgfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vbG9hZGVycy9HTFRGTG9hZGVyJztcclxuaW1wb3J0IHsgS1RYMkxvYWRlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL0tUWDJMb2FkZXInO1xyXG5pbXBvcnQgeyBNZXNob3B0RGVjb2RlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9saWJzL21lc2hvcHRfZGVjb2Rlci5tb2R1bGUuanMnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFRocmVlSnNBbGlnbm1lbnQgfSBmcm9tICcuLi9oZWxwZXJzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQb2lUeXBlIH0gZnJvbSAnLi4vdHlwZXMuc2VydmljZSc7XHJcblxyXG4vKipcclxuICogQSB0YWcgdG8gZHJhdyBpbiB0aGUgVGhyZWUuanMgc2NlbmUsIG1pcnJvcmluZyBhIE1hdHRlcnRhZy5cclxuICpcclxuICogUG9zaXRpb25zIGFyZSBpbiB0aGUgbW9kZWwncyBvd24gY29vcmRpbmF0ZSBzcGFjZSAtIHRoZSBzYW1lIG51bWJlcnMgc3RvcmVkIGluIFBPSS5jb29yZGluYXRlIC1cclxuICogbm90IHNjZW5lIHNwYWNlLiBUaGUgc2VydmljZSByZXBhcmVudHMgdGFncyB1bmRlciB0aGUgbW9kZWwgc28gdGhleSBpbmhlcml0IHRoZSBjZW50ZXJpbmcgYW5kXHJcbiAqIHNjYWxpbmcgYXBwbGllZCBhdCBsb2FkLCB3aGljaCBtZWFucyBjYWxsZXJzIG5ldmVyIGRlYWwgd2l0aCB0aGF0IHRyYW5zZm9ybS5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc1RhZyB7XHJcbiAgLyoqIFRoZSB0YWdnZWQgZWxlbWVudCdzIGlkIChQT0kuZWxlbWVudElEKSwgdXNlZCB0byB1cGRhdGUgb3IgcmVtb3ZlIHRoZSB0YWcgbGF0ZXIuICovXHJcbiAgaWQ6IHN0cmluZztcclxuICBwb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XHJcbiAgLyoqIERyaXZlcyBib3RoIHRoZSBjbGljayByb3V0ZSBhbmQgdHlwZSBmaWx0ZXJpbmcsIHNvIGl0IHRyYXZlbHMgd2l0aCB0aGUgdGFnLiAqL1xyXG4gIHBvaVR5cGU/OiBQb2lUeXBlIHwgbnVsbDtcclxuICAvKiogU2hvd24gb24gaG92ZXIuIEEgbWFya2VyIHdpdGggbm8gaWRlbnRpdHkgaXMganVzdCBhIGRvdCBvbiBhIHdhbGwuICovXHJcbiAgbGFiZWw/OiBzdHJpbmcgfCBudWxsO1xyXG4gIC8qKiBJY29uIGRyYXduIG9uIHRoZSB0YWcuIEZhbGxzIGJhY2sgdG8gYSBwbGFpbiBkaXNjIHdoZW4gYWJzZW50IG9yIGl0IGZhaWxzIHRvIGxvYWQuICovXHJcbiAgaWNvblVybD86IHN0cmluZyB8IG51bGw7XHJcbiAgLyoqIFRpbnQgZm9yIHRoZSBmYWxsYmFjayBkaXNjLCBhcyBhIENTUyBjb2xvdXIuICovXHJcbiAgY29sb3I/OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKiBXaGF0IGEgY2xpY2sgb24gYSB0YWcgcmVwb3J0czogZW5vdWdoIHRvIHJvdXRlIHRvIHRoZSBlbGVtZW50J3MgZGV0YWlsIHBhZ2UuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc1RhZ0NsaWNrIHtcclxuICBlbGVtZW50SWQ6IHN0cmluZztcclxuICBwb2lUeXBlOiBQb2lUeXBlIHwgbnVsbDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgc3BvdCBwaWNrZWQgb24gdGhlIG1vZGVsIGZvciBhIG5ldyB0YWcuXHJcbiAqXHJcbiAqIEJvdGggdmVjdG9ycyBhcmUgaW4gdGhlIG1vZGVsJ3Mgb3duIGNvb3JkaW5hdGUgc3BhY2UsIHdoaWNoIGlzIHdoYXQgUE9JLmNvb3JkaW5hdGUgc3RvcmVzLiBTY2VuZVxyXG4gKiBjb29yZGluYXRlcyBkZWxpYmVyYXRlbHkgbmV2ZXIgbGVhdmUgdGhpcyBzZXJ2aWNlOiB0aGUgbW9kZWwgaXMgc2NhbGVkIHRvIGEgZml4ZWQgc2l6ZSBvbiBsb2FkLCBzb1xyXG4gKiBhIHNjZW5lLXNwYWNlIHBvc2l0aW9uIHdvdWxkIHNpbGVudGx5IG1lYW4gc29tZXdoZXJlIGVsc2UgdGhlIG1vbWVudCB0aGUgLmdsYiBpcyByZS1leHBvcnRlZC5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc1RhZ1BsYWNlbWVudCB7XHJcbiAgcG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xyXG4gIC8qKiBTdXJmYWNlIG5vcm1hbCBhdCB0aGUgcGlja2VkIHBvaW50IC0gTWF0dGVycG9ydCBzdG9yZXMgdGhlIHNhbWUgdGhpbmcgaW4gUE9JLm1ldGFkYXRhLiAqL1xyXG4gIG5vcm1hbDogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XHJcbiAgLyoqIFdoYXQgdGhlIHBsYWNlbWVudCB3YXMgYXJtZWQgZm9yLCBzbyB0aGUgY2FsbGVyIGtub3dzIHdoaWNoIGNyZWF0aW9uIGZvcm0gdG8gb3Blbi4gKi9cclxuICBwb2lUeXBlPzogUG9pVHlwZSB8IG51bGw7XHJcbn1cclxuXHJcbi8qKiBPbmUgdGFnIHNlZW4gaW4gYm90aCBzcGFjZXM6IHdoZXJlIGl0IGlzIHN0b3JlZCwgYW5kIHdoZXJlIGl0IHJlYWxseSBzaXRzIG9uIHRoZSBtb2RlbC4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBUaHJlZUpzQWxpZ25tZW50UGFpciB7XHJcbiAgc291cmNlOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfTtcclxuICB0YXJnZXQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGFuIG9ydGhvbm9ybWFsIGZyYW1lIGZyb20gdGhyZWUgcG9pbnRzLCBvciBudWxsIHdoZW4gdGhleSBhcmUgKG5lYXJseSkgY29sbGluZWFyLlxyXG4gKlxyXG4gKiBUaHJlZSBwb2ludHMgZGVmaW5lIGEgcGxhbmUsIGFuZCBhIHBsYW5lIHBsdXMgYW4gb3JpZ2luIGRlZmluZXMgYW4gb3JpZW50YXRpb24uIENvbGxpbmVhciBwb2ludHNcclxuICogZG8gbm90OiB0aGV5IGxlYXZlIHRoZSByb3RhdGlvbiBhYm91dCB0aGVpciBjb21tb24gbGluZSB1bmRldGVybWluZWQsIHdoaWNoIGlzIHdoeSB0aGUgY2FsbGVyIGhhc1xyXG4gKiB0byByZWplY3QgdGhlbSByYXRoZXIgdGhhbiBwcm9kdWNlIGEgY29uZmlkZW50IHdyb25nIGFuc3dlci5cclxuICovXHJcbmZ1bmN0aW9uIGZyYW1lRnJvbVBvaW50cyhhOiBUSFJFRS5WZWN0b3IzLCBiOiBUSFJFRS5WZWN0b3IzLCBjOiBUSFJFRS5WZWN0b3IzKTogVEhSRUUuTWF0cml4NCB8IG51bGwge1xyXG4gIGNvbnN0IGUxID0gYi5jbG9uZSgpLnN1YihhKTtcclxuICBpZiAoZTEubGVuZ3RoU3EoKSA8IDFlLTEyKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbiAgZTEubm9ybWFsaXplKCk7XHJcblxyXG4gIGNvbnN0IHRvQyA9IGMuY2xvbmUoKS5zdWIoYSk7XHJcbiAgY29uc3QgZTIgPSB0b0MuY2xvbmUoKS5zdWIoZTEuY2xvbmUoKS5tdWx0aXBseVNjYWxhcih0b0MuZG90KGUxKSkpO1xyXG4gIGlmIChlMi5sZW5ndGhTcSgpIDwgMWUtMTIpIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuICBlMi5ub3JtYWxpemUoKTtcclxuXHJcbiAgcmV0dXJuIG5ldyBUSFJFRS5NYXRyaXg0KCkubWFrZUJhc2lzKGUxLCBlMiwgZTEuY2xvbmUoKS5jcm9zcyhlMikpO1xyXG59XHJcblxyXG4vKipcclxuICogU29sdmVzIHRoZSB0cmFuc2Zvcm0gdGhhdCBtYXBzIHN0b3JlZCB0YWcgY29vcmRpbmF0ZXMgb250byB0aGUgbG9hZGVkIG1vZGVsLlxyXG4gKlxyXG4gKiBUYWtlcyBleGFjdGx5IHRoZSBjb3JyZXNwb25kZW5jZXMgYSBwZXJzb24gY2FuIHByb2R1Y2UgYnkgaGFuZDogdGhyZWUgdGFncywgZWFjaCBwb2ludGVkIGF0IHR3aWNlXHJcbiAqIC0gb25jZSB3aGVyZSBpdCBjdXJyZW50bHkgc2l0cywgb25jZSB3aGVyZSBpdCBiZWxvbmdzLiBUaGF0IGlzIHRoZSBtaW5pbXVtIHRoYXQgcGlucyBkb3duIGFsbFxyXG4gKiB0aHJlZSBwYXJ0cyBvZiB0aGUgYW5zd2VyLiBPbmUgcGFpciBmaXhlcyBvbmx5IHRyYW5zbGF0aW9uOyB0d28gbGVhdmUgdGhlIHJvdGF0aW9uIGFib3V0IHRoZSBsaW5lXHJcbiAqIGJldHdlZW4gdGhlbSBmcmVlOyB0aHJlZSByZXNvbHZlIGl0LlxyXG4gKlxyXG4gKiBSZXR1cm5zIG51bGwgd2hlbiB0aGUgcG9pbnRzIGFyZSBjb2xsaW5lYXIgb3IgZGVnZW5lcmF0ZSwgYmVjYXVzZSBhIHdyb25nIGFsaWdubWVudCBhcHBsaWVkXHJcbiAqIHNpbGVudGx5IGlzIHdvcnNlIHRoYW4gbm9uZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBzb2x2ZVRocmVlSnNBbGlnbm1lbnQocGFpcnM6IFRocmVlSnNBbGlnbm1lbnRQYWlyW10pOiBUaHJlZUpzQWxpZ25tZW50IHwgbnVsbCB7XHJcbiAgaWYgKCFwYWlycyB8fCBwYWlycy5sZW5ndGggPCAzKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGNvbnN0IHNvdXJjZXMgPSBwYWlycy5zbGljZSgwLCAzKS5tYXAoKHBhaXIpID0+IG5ldyBUSFJFRS5WZWN0b3IzKHBhaXIuc291cmNlLngsIHBhaXIuc291cmNlLnksIHBhaXIuc291cmNlLnopKTtcclxuICBjb25zdCB0YXJnZXRzID0gcGFpcnMuc2xpY2UoMCwgMykubWFwKChwYWlyKSA9PiBuZXcgVEhSRUUuVmVjdG9yMyhwYWlyLnRhcmdldC54LCBwYWlyLnRhcmdldC55LCBwYWlyLnRhcmdldC56KSk7XHJcblxyXG4gIGNvbnN0IHNvdXJjZUZyYW1lID0gZnJhbWVGcm9tUG9pbnRzKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIHNvdXJjZXNbMl0pO1xyXG4gIGNvbnN0IHRhcmdldEZyYW1lID0gZnJhbWVGcm9tUG9pbnRzKHRhcmdldHNbMF0sIHRhcmdldHNbMV0sIHRhcmdldHNbMl0pO1xyXG4gIGlmICghc291cmNlRnJhbWUgfHwgIXRhcmdldEZyYW1lKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vIEEgcm90YXRpb24ncyBpbnZlcnNlIGlzIGl0cyB0cmFuc3Bvc2UsIHNvIHRoaXMgaXMgdGhlIHJvdGF0aW9uIGNhcnJ5aW5nIG9uZSBmcmFtZSBvbnRvIHRoZSBvdGhlci5cclxuICBjb25zdCByb3RhdGlvbiA9IHRhcmdldEZyYW1lLm11bHRpcGx5KHNvdXJjZUZyYW1lLmNsb25lKCkudHJhbnNwb3NlKCkpO1xyXG5cclxuICAvLyBTY2FsZSBmcm9tIGhvdyBmYXIgYXBhcnQgdGhlIHBvaW50cyBhcmUgaW4gZWFjaCBzcGFjZSwgYXZlcmFnZWQgb3ZlciB0aGUgdGhyZWUgZWRnZXMgc28gYSBzaW5nbGVcclxuICAvLyBzbG9wcHkgY2xpY2sgZG9lcyBub3Qgc2V0IGl0IG9uIGl0cyBvd24uXHJcbiAgY29uc3QgZWRnZXMgPSBbWzAsIDFdLCBbMSwgMl0sIFswLCAyXV07XHJcbiAgbGV0IHJhdGlvU3VtID0gMDtcclxuICBsZXQgcmF0aW9Db3VudCA9IDA7XHJcbiAgZm9yIChjb25zdCBbaSwgal0gb2YgZWRnZXMpIHtcclxuICAgIGNvbnN0IHNvdXJjZUxlbmd0aCA9IHNvdXJjZXNbaV0uZGlzdGFuY2VUbyhzb3VyY2VzW2pdKTtcclxuICAgIGNvbnN0IHRhcmdldExlbmd0aCA9IHRhcmdldHNbaV0uZGlzdGFuY2VUbyh0YXJnZXRzW2pdKTtcclxuICAgIGlmIChzb3VyY2VMZW5ndGggPiAxZS05KSB7XHJcbiAgICAgIHJhdGlvU3VtICs9IHRhcmdldExlbmd0aCAvIHNvdXJjZUxlbmd0aDtcclxuICAgICAgcmF0aW9Db3VudCArPSAxO1xyXG4gICAgfVxyXG4gIH1cclxuICBpZiAocmF0aW9Db3VudCA9PT0gMCkge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG4gIGNvbnN0IHNjYWxlID0gcmF0aW9TdW0gLyByYXRpb0NvdW50O1xyXG5cclxuICAvLyBUaGUgZ3JvdXAgYXBwbGllcyBwb3NpdGlvbiwgdGhlbiByb3RhdGlvbiwgdGhlbiBzY2FsZSwgc28gYSBwb2ludCBsYW5kcyBhdCB0ICsgcypSKnAuIFNvbHZpbmdcclxuICAvLyB0aGF0IGZvciB0IGF0IHRoZSBjZW50cm9pZHMgZ2l2ZXMgdGhlIHRyYW5zbGF0aW9uLlxyXG4gIGNvbnN0IHNvdXJjZUNlbnRyb2lkID0gc291cmNlcy5yZWR1Y2UoKHN1bSwgdikgPT4gc3VtLmFkZCh2KSwgbmV3IFRIUkVFLlZlY3RvcjMoKSkubXVsdGlwbHlTY2FsYXIoMSAvIDMpO1xyXG4gIGNvbnN0IHRhcmdldENlbnRyb2lkID0gdGFyZ2V0cy5yZWR1Y2UoKHN1bSwgdikgPT4gc3VtLmFkZCh2KSwgbmV3IFRIUkVFLlZlY3RvcjMoKSkubXVsdGlwbHlTY2FsYXIoMSAvIDMpO1xyXG4gIGNvbnN0IHRyYW5zbGF0aW9uID0gdGFyZ2V0Q2VudHJvaWRcclxuICAgIC5jbG9uZSgpXHJcbiAgICAuc3ViKHNvdXJjZUNlbnRyb2lkLmNsb25lKCkuYXBwbHlNYXRyaXg0KHJvdGF0aW9uKS5tdWx0aXBseVNjYWxhcihzY2FsZSkpO1xyXG5cclxuICBjb25zdCBldWxlciA9IG5ldyBUSFJFRS5FdWxlcigpLnNldEZyb21Sb3RhdGlvbk1hdHJpeChyb3RhdGlvbik7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICB0cmFuc2xhdGlvbjogeyB4OiB0cmFuc2xhdGlvbi54LCB5OiB0cmFuc2xhdGlvbi55LCB6OiB0cmFuc2xhdGlvbi56IH0sXHJcbiAgICByb3RhdGlvbjogeyB4OiBldWxlci54LCB5OiBldWxlci55LCB6OiBldWxlci56IH0sXHJcbiAgICBzY2FsZSxcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE9iakFkZGVkIHtcclxuICBpZDogc3RyaW5nO1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBmaWxlOiBzdHJpbmc7IC8vIFRoZSBVUkwgdG8gdGhlIC5vYmogZmlsZVxyXG4gIHBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfTtcclxuICByb3RhdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XHJcbiAgc2NhbGU6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgUGFyc2VkTWVzaEdyb3VwIHtcclxuICBzdGFydDogbnVtYmVyO1xyXG4gIGNvdW50OiBudW1iZXI7XHJcbiAgbWF0ZXJpYWxJbmRleDogbnVtYmVyO1xyXG59XHJcblxyXG4vKiogUmF3IGdlb21ldHJ5IGRhdGEgZXh0cmFjdGVkIGZyb20gYSBwYXJzZWQgT0JKIG1lc2gsIHNlbnQgYmFjayBieSB0aGUgcGFyc2VyIHdvcmtlci4gKi9cclxuaW50ZXJmYWNlIFBhcnNlZE1lc2hEYXRhIHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgLy8gT25lIG5hbWUgcGVyIG1hdGVyaWFsIHVzZWQgYnkgdGhpcyBtZXNoLiBBIHNpbmdsZS1tYXRlcmlhbCBtZXNoIGhhcyBvbmUgZW50cnk7XHJcbiAgLy8gYSBtZXNoIHdpdGggbXVsdGlwbGUgdXNlbXRsIHN3aXRjaGVzIChnZW9tZXRyeS5ncm91cHMpIGhhcyBvbmUgcGVyIGdyb3VwLlxyXG4gIG1hdGVyaWFsTmFtZXM6IHN0cmluZ1tdO1xyXG4gIGdyb3VwczogUGFyc2VkTWVzaEdyb3VwW10gfCBudWxsO1xyXG4gIHBvc2l0aW9uOiBGbG9hdDMyQXJyYXk7XHJcbiAgbm9ybWFsOiBGbG9hdDMyQXJyYXkgfCBudWxsO1xyXG4gIHV2OiBGbG9hdDMyQXJyYXkgfCBudWxsO1xyXG4gIGluZGV4OiBVaW50MzJBcnJheSB8IG51bGw7XHJcbiAgYm91bmRpbmdCb3g/OiB7IG1pbjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdOyBtYXg6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB9O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgT2JqUGFyc2VyV29ya2VyUmVzcG9uc2Uge1xyXG4gIHJlcXVlc3RJZDogc3RyaW5nO1xyXG4gIHN1Y2Nlc3M6IGJvb2xlYW47XHJcbiAgbWVzaGVzPzogUGFyc2VkTWVzaERhdGFbXTtcclxuICBlcnJvcj86IHN0cmluZztcclxufVxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVGhyZWVKc1NlcnZpY2Uge1xyXG4gIHByaXZhdGUgc2NlbmUhOiBUSFJFRS5TY2VuZTtcclxuICBwcml2YXRlIGNhbWVyYSE6IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhO1xyXG4gIHByaXZhdGUgcmVuZGVyZXIhOiBUSFJFRS5XZWJHTFJlbmRlcmVyO1xyXG4gIHByaXZhdGUgY29udHJvbHMhOiBPcmJpdENvbnRyb2xzO1xyXG4gIHByaXZhdGUgYW5pbWF0aW9uRnJhbWVJZCE6IG51bWJlcjtcclxuXHJcbiAgLy8gUmF5Y2FzdGluZyBhbmQgaW50ZXJhY3Rpb25cclxuICBwcml2YXRlIHJheWNhc3RlciA9IG5ldyBUSFJFRS5SYXljYXN0ZXIoKTtcclxuICBwcml2YXRlIG1vdXNlID0gbmV3IFRIUkVFLlZlY3RvcjIoKTtcclxuICBwcml2YXRlIGlzRHJhZ2dpbmdDYW1lcmE6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIGlzRHJhZ2dpbmdUaW1lcjogYW55O1xyXG4gIHByaXZhdGUgY2xpY2thYmxlT2JqZWN0czogVEhSRUUuT2JqZWN0M0RbXSA9IFtdO1xyXG5cclxuICAvLyBPYnNlcnZhYmxlcyBmb3IgdGhlIHZpZXdlciBjb21wb25lbnRcclxuICBwdWJsaWMgb2JqZWN0SG92ZXJlZCQgPSBuZXcgU3ViamVjdDx7IGlkOiBzdHJpbmc7IGV2ZW50OiBNb3VzZUV2ZW50IH0gfCBudWxsPigpO1xyXG4gIHB1YmxpYyBvYmplY3RDbGlja2VkJCA9IG5ldyBTdWJqZWN0PHN0cmluZyB8IG51bGw+KCk7XHJcblxyXG4gIC8qKiBFbWl0cyB3aGVuIHRoZSB1c2VyIGNsaWNrcyBhIHRhZywgbWlycm9yaW5nIE1hdHRlcnBvcnQncyB0YWcgY2xpY2suICovXHJcbiAgcHVibGljIHRhZ0NsaWNrZWQkID0gbmV3IFN1YmplY3Q8VGhyZWVKc1RhZ0NsaWNrPigpO1xyXG5cclxuICAvKiogRW1pdHMgYSB0YWcncyBsYWJlbCB3aGlsZSB0aGUgcG9pbnRlciBpcyBvdmVyIGl0LCBhbmQgbnVsbCB3aGVuIGl0IGxlYXZlcy4gKi9cclxuICBwdWJsaWMgdGFnSG92ZXJlZCQgPSBuZXcgU3ViamVjdDx7IGxhYmVsOiBzdHJpbmc7IGV2ZW50OiBNb3VzZUV2ZW50IH0gfCBudWxsPigpO1xyXG5cclxuICAvLyBUYWdzIGxpdmUgdW5kZXIgdGhlIG1vZGVsIHJhdGhlciB0aGFuIHRoZSBzY2VuZSwgc28gdGhlIGNlbnRlcmluZyBhbmQgc2NhbGluZyBhcHBsaWVkIHdoZW4gdGhlXHJcbiAgLy8gbW9kZWwgaXMgcGxhY2VkIGNhcnJpZXMgb3ZlciBhbmQgUE9JIGNvb3JkaW5hdGVzIGNhbiBzdGF5IGluIHRoZSBtb2RlbCdzIG93biBzcGFjZS5cclxuICBwcml2YXRlIHRhZ0dyb3VwID0gbmV3IFRIUkVFLkdyb3VwKCk7XHJcbiAgcHJpdmF0ZSB0YWdTcHJpdGVzID0gbmV3IE1hcDxzdHJpbmcsIFRIUkVFLlNwcml0ZT4oKTtcclxuXHJcbiAgcHJpdmF0ZSBjYW52YXNSZXNpemVPYnNlcnZlcj86IFJlc2l6ZU9ic2VydmVyO1xyXG5cclxuICAvKiogQWJvcnRzIHRoZSBpbi1mbGlnaHQgbW9kZWwgZG93bmxvYWQuIFBhcnNpbmcgY2Fubm90IGJlIGludGVycnVwdGVkLCBvbmx5IG5vdCBzdGFydGVkLiAqL1xyXG4gIHByaXZhdGUgbG9hZEFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlcjtcclxuXHJcbiAgLy8gVGhlIGxvYWRlZCBiYXNlIG1vZGVsLCBrZXB0IHNvIHRhZyBwbGFjZW1lbnQgY2FuIHJheWNhc3QgYWdhaW5zdCBpdHMgZ2VvbWV0cnkuXHJcbiAgcHJpdmF0ZSBtb2RlbFJvb3Q/OiBUSFJFRS5PYmplY3QzRDtcclxuXHJcbiAgLyoqIFRydWUgd2hpbGUgdGhlIG5leHQgY2xpY2sgb24gdGhlIG1vZGVsIHBsYWNlcyBhIHRhZyBpbnN0ZWFkIG9mIG9yYml0aW5nLiAqL1xyXG4gIHByaXZhdGUgcGxhY2luZ1RhZyA9IGZhbHNlO1xyXG5cclxuICAvKiogV2hhdCB0aGUgYXJtZWQgcGxhY2VtZW50IGlzIGZvciwgZWNob2VkIGJhY2sgd2hlbiB0aGUgc3BvdCBpcyBwaWNrZWQuICovXHJcbiAgcHJpdmF0ZSBwbGFjZW1lbnRQb2lUeXBlOiBQb2lUeXBlIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKiBQb3NpdGlvbiBhbmQgbm9ybWFsIG9mIHRoZSBsYXN0IHBsYWNlZCB0YWcsIGluIG1vZGVsIHNwYWNlLCBhd2FpdGluZyBjb21taXQgdG8gYSBQT0kuICovXHJcbiAgcHJpdmF0ZSBwZW5kaW5nVGFnUGxhY2VtZW50OiBUaHJlZUpzVGFnUGxhY2VtZW50IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKiBQb2ludGVyIHBvc2l0aW9uIHdhaXRpbmcgZm9yIGEgcHJldmlldyBwaWNrLCBjb2FsZXNjZWQgdG8gb25lIHBlciBmcmFtZS4gKi9cclxuICBwcml2YXRlIHBlbmRpbmdQcmV2aWV3RXZlbnQ6IE1vdXNlRXZlbnQgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogTGF5ZXIgY2FycnlpbmcgdGhlIG1vZGVsIGFsb25lLCBzbyB0aGUgZGVwdGggcGljayBjYW4gcmVuZGVyIGl0IHdpdGhvdXQgdGhlIHRhZ3MuXHJcbiAgICpcclxuICAgKiBMYXllcnMgYXJlIHRlc3RlZCBwZXIgb2JqZWN0IGF0IHJlbmRlciB0aW1lIGFuZCBjaGlsZHJlbiBhcmUgdHJhdmVyc2VkIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlclxyXG4gICAqIHRoZWlyIHBhcmVudCBwYXNzZWQsIHNvIG1hcmtpbmcgdGhlIG1vZGVsJ3Mgb3duIG1lc2hlcyBpcyBlbm91Z2ggLSBubyByZS1wYXJlbnRpbmcuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUElDS19MQVlFUiA9IDE7XHJcblxyXG4gIC8qKiBDYWNoZSBTdG9yYWdlIGJ1Y2tldCBob2xkaW5nIGRvd25sb2FkZWQgbW9kZWxzLCBhbmQgaG93IG1hbnkgdG8ga2VlcC4gKi9cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNT0RFTF9DQUNIRSA9ICdzbWFydGVycGxhbi0zZC1tb2RlbHMnO1xyXG5cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNT0RFTF9DQUNIRV9TSVpFID0gMztcclxuXHJcbiAgcHJpdmF0ZSBwaWNrVGFyZ2V0PzogVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ7XHJcblxyXG4gIHByaXZhdGUgcGlja0NhbWVyYT86IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhO1xyXG5cclxuICBwcml2YXRlIHBpY2tEZXB0aE1hdGVyaWFsPzogVEhSRUUuTWVzaERlcHRoTWF0ZXJpYWw7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgcGlja1BpeGVsID0gbmV3IFVpbnQ4QXJyYXkoNCk7XHJcblxyXG4gIC8qKiBFbWl0cyBvbmNlIGEgdGFnIGlzIGRyb3BwZWQgb24gdGhlIG1vZGVsLCBzbyB0aGUgVUkgY2FuIGNvbmZpcm0gYW5kIHBlcnNpc3QgaXQuICovXHJcbiAgcHVibGljIHRhZ1BsYWNlZCQgPSBuZXcgU3ViamVjdDxUaHJlZUpzVGFnUGxhY2VtZW50PigpO1xyXG5cclxuICAvKiogRW1pdHMgd2hlbiB0aGUgY2FsaWJyYXRpb24gd2Fsa3Rocm91Z2ggaXMgYWJhbmRvbmVkLCBzbyB0aGUgcGFuZWwgZHJpdmluZyBpdCBjYW4gY2xvc2UuICovXHJcbiAgcHVibGljIGFsaWdubWVudENhbmNlbGxlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAvKiogVHJhbnNsdWNlbnQgbWFya2VyIHNob3duIHVuZGVyIHRoZSBjdXJzb3Igd2hpbGUgcGxhY2luZy4gKi9cclxuICBwcml2YXRlIHBsYWNlbWVudFByZXZpZXc/OiBUSFJFRS5TcHJpdGU7XHJcblxyXG4gIHByaXZhdGUgYWxpZ25pbmcgPSBmYWxzZTtcclxuICBwcml2YXRlIGFsaWdubWVudFBhaXJzOiBUaHJlZUpzQWxpZ25tZW50UGFpcltdID0gW107XHJcbiAgcHJpdmF0ZSBhbGlnbm1lbnRTb3VyY2U6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKiBEcml2ZXMgdGhlIGFsaWdubWVudCB3YWxrdGhyb3VnaCdzIFVJOiBob3cgbWFueSBwYWlycyBhcmUgZG9uZSBhbmQgd2hhdCBpdCB3YW50cyBuZXh0LiAqL1xyXG4gIHB1YmxpYyBhbGlnbm1lbnRQcm9ncmVzcyQgPSBuZXcgU3ViamVjdDx7XHJcbiAgICBwYWlyczogbnVtYmVyO1xyXG4gICAgYXdhaXRpbmc6ICd0YWcnIHwgJ3BvaW50JyB8IG51bGw7XHJcbiAgICB0YWdJZD86IHN0cmluZztcclxuICB9PigpO1xyXG5cclxuICAvKiogSW4tZmxpZ2h0IGNhbWVyYSBtb3ZlIHN0YXJ0ZWQgYnkgZ29Ub1RhZywgYWR2YW5jZWQgYnkgdGhlIHJlbmRlciBsb29wLiAqL1xyXG4gIHByaXZhdGUgY2FtZXJhVHdlZW46IHtcclxuICAgIGZyb21Qb3NpdGlvbjogVEhSRUUuVmVjdG9yMztcclxuICAgIHRvUG9zaXRpb246IFRIUkVFLlZlY3RvcjM7XHJcbiAgICBmcm9tVGFyZ2V0OiBUSFJFRS5WZWN0b3IzO1xyXG4gICAgdG9UYXJnZXQ6IFRIUkVFLlZlY3RvcjM7XHJcbiAgICBzdGFydGVkQXQ6IG51bWJlcjtcclxuICAgIGR1cmF0aW9uTXM6IG51bWJlcjtcclxuICB9IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKiBFbWl0cyB0cnVlIHdoaWxlIGEgaGVhdnkgT0JKIGZpbGUgaXMgYmVpbmcgcGFyc2VkIChpbiBhIHdvcmtlciwgd2hlbiBhdmFpbGFibGUpLCBmYWxzZSBvbmNlIGRvbmUuICovXHJcbiAgcHVibGljIG1vZGVsTG9hZGluZyQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG5cclxuICAvKipcclxuICAgKiBEb3dubG9hZCBwcm9ncmVzcyBmb3IgR0xCIG1vZGVscywgYXMgYSAwLTEgZnJhY3Rpb24sIG9yIG51bGwgd2hlbiB0aGUgdG90YWwgc2l6ZSBpcyB1bmtub3duLlxyXG4gICAqXHJcbiAgICogQSBudWxsIG1lYW5zIHRoZSBzZXJ2ZXIgZGlkIG5vdCBzZW5kIENvbnRlbnQtTGVuZ3RoIChjaHVua2VkIHJlc3BvbnNlcywgc29tZSBwcm94aWVzKSBhbmQgbm9cclxuICAgKiBwZXJjZW50YWdlIGNhbiBiZSBkZXJpdmVkOyBzaG93IGFuIGluZGV0ZXJtaW5hdGUgaW5kaWNhdG9yIHJhdGhlciB0aGFuIGd1ZXNzaW5nIGF0IG9uZS5cclxuICAgKi9cclxuICBwdWJsaWMgbW9kZWxMb2FkUHJvZ3Jlc3MkID0gbmV3IFN1YmplY3Q8bnVtYmVyIHwgbnVsbD4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRW1pdHMgd2hlbiBhIGxvYWQgYWN0dWFsbHkgc3RvcHBlZCBzaG9ydCwgd2hpY2ggaXMgbm90IHRoZSBzYW1lIGFzIGFza2luZyBpdCB0by5cclxuICAgKlxyXG4gICAqIGNhbmNlbE1vZGVsTG9hZCgpIGNhbiBhcnJpdmUgYWZ0ZXIgcGFyc2UoKSBoYXMgdGFrZW4gdGhlIG1haW4gdGhyZWFkLCBhbmQgcGFyc2UgY2Fubm90IGJlXHJcbiAgICogaW50ZXJydXB0ZWQgLSB0aGUgbW9kZWwgZmluaXNoZXMgbG9hZGluZyByZWdhcmRsZXNzLiBPbmx5IHRoaXMgdGVsbHMgdGhlIFVJIHdoaWNoIG9mIHRoZSB0d29cclxuICAgKiBoYXBwZW5lZCwgc28gaXQgZG9lcyBub3Qgb2ZmZXIgdG8gcmVsb2FkIHNvbWV0aGluZyB0aGF0IGlzIGFscmVhZHkgb24gc2NyZWVuLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBtb2RlbExvYWRDYW5jZWxsZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgLy8gQmFja2dyb3VuZCBwYXJzaW5nIG9mIGhlYXZ5IC5vYmogZmlsZXMsIHByb3ZpZGVkIGJ5IHRoZSBob3N0aW5nIGFwcCAoc2VlIHNldE9ialBhcnNlcldvcmtlcikuXHJcbiAgLy8gQW5ndWxhciBsaWJyYXJpZXMgYnVpbHQgd2l0aCBuZy1wYWNrYWdyIGNhbid0IGJ1bmRsZSBgbmV3IFdvcmtlcihuZXcgVVJMKC4uLikpYCB0aGVtc2VsdmVzLFxyXG4gIC8vIHNvIHRoZSBhcHAgaW5zdGFudGlhdGVzIHRoZSB3b3JrZXIgKGl0cyBidWlsZCBwaXBlbGluZSBzdXBwb3J0cyBpdCkgYW5kIGhhbmRzIGl0IG92ZXIgaGVyZS5cclxuICBwcml2YXRlIG9ialBhcnNlcldvcmtlcj86IFdvcmtlcjtcclxuICBwcml2YXRlIG9ialBhcnNlclBlbmRpbmdSZXF1ZXN0cyA9IG5ldyBNYXA8c3RyaW5nLCB7IHJlc29sdmU6IChtZXNoZXM6IFBhcnNlZE1lc2hEYXRhW10pID0+IHZvaWQ7IHJlamVjdDogKGVycm9yOiBFcnJvcikgPT4gdm9pZCB9PigpO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG5nWm9uZTogTmdab25lKSB7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVnaXN0ZXJzIGEgV2ViIFdvcmtlciB1c2VkIHRvIHBhcnNlIGhlYXZ5IC5vYmogZmlsZXMgb2ZmIHRoZSBtYWluIHRocmVhZC5cclxuICAgKiBNdXN0IGJlIGluc3RhbnRpYXRlZCBieSB0aGUgY29uc3VtaW5nIGFwcCAoZS5nLiBgbmV3IFdvcmtlcihuZXcgVVJMKCcuL29iai1wYXJzZXIud29ya2VyJywgaW1wb3J0Lm1ldGEudXJsKSlgKSxcclxuICAgKiBzaW5jZSBhIGxpYnJhcnkgcGFja2FnZWQgd2l0aCBuZy1wYWNrYWdyIGNhbm5vdCBidW5kbGUgd29ya2VyIGZpbGVzIGl0c2VsZi5cclxuICAgKiBXaGVuIG5vIHdvcmtlciBpcyBwcm92aWRlZCwgbG9hZE9iak1vZGVsIGZhbGxzIGJhY2sgdG8gcGFyc2luZyBvbiB0aGUgbWFpbiB0aHJlYWQuXHJcbiAgICovXHJcbiAgc2V0T2JqUGFyc2VyV29ya2VyKHdvcmtlcjogV29ya2VyKTogdm9pZCB7XHJcbiAgICB0aGlzLm9ialBhcnNlcldvcmtlciA9IHdvcmtlcjtcclxuICAgIHRoaXMub2JqUGFyc2VyV29ya2VyLm9ubWVzc2FnZSA9ICh7IGRhdGEgfTogTWVzc2FnZUV2ZW50PE9ialBhcnNlcldvcmtlclJlc3BvbnNlPikgPT4ge1xyXG4gICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5vYmpQYXJzZXJQZW5kaW5nUmVxdWVzdHMuZ2V0KGRhdGEucmVxdWVzdElkKTtcclxuICAgICAgaWYgKCFwZW5kaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMub2JqUGFyc2VyUGVuZGluZ1JlcXVlc3RzLmRlbGV0ZShkYXRhLnJlcXVlc3RJZCk7XHJcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5tZXNoZXMpIHtcclxuICAgICAgICBwZW5kaW5nLnJlc29sdmUoZGF0YS5tZXNoZXMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHBlbmRpbmcucmVqZWN0KG5ldyBFcnJvcihkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yIHdoaWxlIHBhcnNpbmcgT0JKIGZpbGUgaW4gd29ya2VyJykpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXF1ZXN0T2JqUGFyc2VJbldvcmtlcihvYmpVcmw6IHN0cmluZyk6IFByb21pc2U8UGFyc2VkTWVzaERhdGFbXT4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgY29uc3QgcmVxdWVzdElkID0gYCR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKX1gO1xyXG4gICAgICB0aGlzLm9ialBhcnNlclBlbmRpbmdSZXF1ZXN0cy5zZXQocmVxdWVzdElkLCB7IHJlc29sdmUsIHJlamVjdCB9KTtcclxuICAgICAgdGhpcy5vYmpQYXJzZXJXb3JrZXIhLnBvc3RNZXNzYWdlKHsgcmVxdWVzdElkLCBvYmpVcmwgfSk7XHJcbiAgICAgIC8vIERpYWdub3N0aWMgb25seTogbGFyZ2UgbW9kZWxzIGxlZ2l0aW1hdGVseSB0YWtlIGEgd2hpbGUsIHRoaXMgaXNuJ3QgYSB0aW1lb3V0L2Fib3J0LFxyXG4gICAgICAvLyBqdXN0IGEgc2lnbmFsIGluIGNhc2UgdGhlIHdvcmtlciB3ZW50IHNpbGVudCAoZS5nLiBpdCByYW4gb3V0IG9mIG1lbW9yeSBtaWQtcGFyc2UpLlxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5vYmpQYXJzZXJQZW5kaW5nUmVxdWVzdHMuaGFzKHJlcXVlc3RJZCkpIHtcclxuICAgICAgICAgIGNvbnNvbGUud2FybihgVGhyZWVKc1NlcnZpY2U6IG9iai1wYXJzZXIgd29ya2VyIGhhcyBub3QgcmVwbGllZCBhZnRlciA2MHMgZm9yIHJlcXVlc3QgJHtyZXF1ZXN0SWR9IChvYmpVcmw9JHtvYmpVcmx9KS4gU3RpbGwgd2FpdGluZyAtIGxhcmdlIGZpbGVzIGNhbiB0YWtlIGEgd2hpbGUsIGJ1dCB0aGlzIG1heSBhbHNvIG1lYW4gdGhlIHdvcmtlciBodW5nIG9yIHJhbiBvdXQgb2YgbWVtb3J5LmApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwgNjAwMDApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogUmVidWlsZHMgYSBUSFJFRS5NZXNoIGZyb20gdGhlIHJhdyB0eXBlZCBhcnJheXMgc2VudCBiYWNrIGJ5IHRoZSBwYXJzZXIgd29ya2VyLiAqL1xyXG4gIHByaXZhdGUgbWVzaEZyb21QYXJzZWREYXRhKGRhdGE6IFBhcnNlZE1lc2hEYXRhLCBtYXRlcmlhbHM/OiBhbnkpOiBUSFJFRS5NZXNoIHtcclxuICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLkJ1ZmZlckdlb21ldHJ5KCk7XHJcbiAgICBnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoJ3Bvc2l0aW9uJywgbmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZShkYXRhLnBvc2l0aW9uLCAzKSk7XHJcbiAgICBpZiAoZGF0YS51dikge1xyXG4gICAgICBnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoJ3V2JywgbmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZShkYXRhLnV2LCAyKSk7XHJcbiAgICB9XHJcbiAgICAvLyBJbmRleCBoYXMgdG8gYmUgc2V0IGJlZm9yZSBhbnkgbm9ybWFsIGNvbXB1dGF0aW9uLCB3aGljaCByZWFkcyBpdCB0byBhdmVyYWdlIHNoYXJlZCBmYWNlcy5cclxuICAgIGlmIChkYXRhLmluZGV4KSB7XHJcbiAgICAgIGdlb21ldHJ5LnNldEluZGV4KG5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUoZGF0YS5pbmRleCwgMSkpO1xyXG4gICAgfVxyXG4gICAgaWYgKGRhdGEubm9ybWFsKSB7XHJcbiAgICAgIGdlb21ldHJ5LnNldEF0dHJpYnV0ZSgnbm9ybWFsJywgbmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZShkYXRhLm5vcm1hbCwgMykpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZ2VvbWV0cnkuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtcclxuICAgIH1cclxuICAgIC8vIEJveDMuc2V0RnJvbU9iamVjdCgpIHJldXNlcyBhbiBhbHJlYWR5LXNldCBib3VuZGluZ0JveCBpbnN0ZWFkIG9mIHdhbGtpbmcgZXZlcnkgdmVydGV4LFxyXG4gICAgLy8gc28gYWRvcHRpbmcgdGhlIHdvcmtlcidzIG1ha2VzIGZyYW1pbmcgdGhlIGNhbWVyYSBjaGVhcCBubyBtYXR0ZXIgaG93IGRlbnNlIHRoZSBtZXNoIGlzLlxyXG4gICAgaWYgKGRhdGEuYm91bmRpbmdCb3gpIHtcclxuICAgICAgZ2VvbWV0cnkuYm91bmRpbmdCb3ggPSBuZXcgVEhSRUUuQm94MyhcclxuICAgICAgICBuZXcgVEhSRUUuVmVjdG9yMyguLi5kYXRhLmJvdW5kaW5nQm94Lm1pbiksXHJcbiAgICAgICAgbmV3IFRIUkVFLlZlY3RvcjMoLi4uZGF0YS5ib3VuZGluZ0JveC5tYXgpLFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlc29sdmVkTWF0ZXJpYWxzID0gZGF0YS5tYXRlcmlhbE5hbWVzLm1hcCgobmFtZSkgPT4ge1xyXG4gICAgICBjb25zdCBtYXRlcmlhbCA9IG1hdGVyaWFscyAmJiBuYW1lID8gbWF0ZXJpYWxzLmNyZWF0ZShuYW1lKSA6IHVuZGVmaW5lZDtcclxuICAgICAgaWYgKCFtYXRlcmlhbCkge1xyXG4gICAgICAgIGNvbnNvbGUud2FybihgVGhyZWVKc1NlcnZpY2U6IG5vIE1UTCBtYXRlcmlhbCBuYW1lZCBcIiR7bmFtZX1cIiBmb3IgbWVzaCBcIiR7ZGF0YS5uYW1lfVwiLCB1c2luZyBhIHBsYWluIGZhbGxiYWNrIChubyB0ZXh0dXJlKS5gKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbWF0ZXJpYWwgfHwgbmV3IFRIUkVFLk1lc2hQaG9uZ01hdGVyaWFsKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBsZXQgbWVzaDogVEhSRUUuTWVzaDtcclxuICAgIGlmIChkYXRhLmdyb3VwcyAmJiBkYXRhLmdyb3Vwcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGRhdGEuZ3JvdXBzLmZvckVhY2goKGdyb3VwKSA9PiBnZW9tZXRyeS5hZGRHcm91cChncm91cC5zdGFydCwgZ3JvdXAuY291bnQsIGdyb3VwLm1hdGVyaWFsSW5kZXgpKTtcclxuICAgICAgbWVzaCA9IG5ldyBUSFJFRS5NZXNoKGdlb21ldHJ5LCByZXNvbHZlZE1hdGVyaWFscyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBtZXNoID0gbmV3IFRIUkVFLk1lc2goZ2VvbWV0cnksIHJlc29sdmVkTWF0ZXJpYWxzWzBdKTtcclxuICAgIH1cclxuICAgIG1lc2gubmFtZSA9IGRhdGEubmFtZTtcclxuICAgIHJldHVybiBtZXNoO1xyXG4gIH1cclxuXHJcbiAgaW5pdChjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50KTogdm9pZCB7XHJcbiAgICAvLyBUaGlzIHNlcnZpY2UgaXMgYSBzaW5nbGV0b24gYnV0IHRoZSB2aWV3ZXIgY29tcG9uZW50IGlzIHJlYnVpbHQgb24gZXZlcnkgbmF2aWdhdGlvbiwgc28gc3RhdGVcclxuICAgIC8vIGZyb20gdGhlIHByZXZpb3VzIHNjZW5lIGlzIHN0aWxsIGhlcmUuIFR3byB0aGluZ3Mgb3V0bGl2ZSBpdCBhbmQgaGF2ZSB0byBnbyBmaXJzdDpcclxuICAgIC8vXHJcbiAgICAvLyAgLSBBIGRvd25sb2FkIHN0aWxsIGluIGZsaWdodC4gSXRzIG9uTG9hZGVkIHJlc29sdmVzIGFnYWluc3Qgd2hhdGV2ZXIgYHRoaXMuc2NlbmVgIHBvaW50cyBhdFxyXG4gICAgLy8gICAgYnkgdGhlbiwgc28gdGhlIG1vZGVsIGJlaW5nIGFiYW5kb25lZCB3b3VsZCBiZSBoYW5kZWQgdG8gdGhlIHNjZW5lIGJ1aWx0IGJlbG93LlxyXG4gICAgLy8gIC0gVGhlIHRhZyBncm91cCwgd2hpY2ggaXMgYSBmaWVsZCBhbmQga2VlcHMgaXRzIHNwcml0ZXMuIFRoZXkgd291bGQgYmUgcmUtcGFyZW50ZWQgdW5kZXIgdGhlXHJcbiAgICAvLyAgICBuZXcgbW9kZWwgYW5kIHNob3cgdGhlIHByZXZpb3VzIHZpc2l0J3MgdGFncyBvbiBpdC5cclxuICAgIHRoaXMuZGlzY2FyZEN1cnJlbnRMb2FkKCk7XHJcbiAgICB0aGlzLmNsZWFyVGFncygpO1xyXG4gICAgdGhpcy5jYW1lcmFUd2VlbiA9IG51bGw7XHJcbiAgICB0aGlzLm1vZGVsUm9vdCA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAvLyAxLiBTZXR1cCBTY2VuZVxyXG4gICAgdGhpcy5zY2VuZSA9IG5ldyBUSFJFRS5TY2VuZSgpO1xyXG4gICAgdGhpcy5zY2VuZS5iYWNrZ3JvdW5kID0gbmV3IFRIUkVFLkNvbG9yKDB4ZTBmN2ZmKTsgLy8gZnJvbSBQT0NcclxuXHJcbiAgICAvLyAyLiBTZXR1cCBDYW1lcmFcclxuICAgIHRoaXMuY2FtZXJhID0gbmV3IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhKDc1LCBjYW52YXMuY2xpZW50V2lkdGggLyBjYW52YXMuY2xpZW50SGVpZ2h0LCAwLjEsIDEwMDAwKTtcclxuICAgIHRoaXMuY2FtZXJhLnBvc2l0aW9uLnNldCgwLCA1LCAxMCk7IC8vIHdpbGwgYmUgb3ZlcnJpZGRlbiBsYXRlciBpZiBwYXNzZWRcclxuXHJcbiAgICAvLyAzLiBTZXR1cCBXZWJHTCBSZW5kZXJlclxyXG4gICAgdGhpcy5yZW5kZXJlciA9IG5ldyBUSFJFRS5XZWJHTFJlbmRlcmVyKHsgY2FudmFzLCBhbnRpYWxpYXM6IHRydWUgfSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFNpemUoY2FudmFzLmNsaWVudFdpZHRoLCBjYW52YXMuY2xpZW50SGVpZ2h0KTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0UGl4ZWxSYXRpbyhNYXRoLm1pbih3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbywgMS41KSk7XHJcbiAgICB0aGlzLm9ic2VydmVDYW52YXNSZXNpemUoY2FudmFzKTtcclxuICAgIFxyXG4gICAgLy8gRml4IGZvciBUaHJlZS5qcyByMTQ3IHZzIHIxNTIrIGNvbG9yIG1hbmFnZW1lbnRcclxuICAgIGlmICgnb3V0cHV0Q29sb3JTcGFjZScgaW4gdGhpcy5yZW5kZXJlcikge1xyXG4gICAgICAodGhpcy5yZW5kZXJlciBhcyBhbnkpLm91dHB1dENvbG9yU3BhY2UgPSAnc3JnYic7IC8vIFRIUkVFLlNSR0JDb2xvclNwYWNlXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAodGhpcy5yZW5kZXJlciBhcyBhbnkpLm91dHB1dEVuY29kaW5nID0gMzAwMTsgLy8gVEhSRUUuc1JHQkVuY29kaW5nXHJcbiAgICB9XHJcblxyXG4gICAgLy8gV2l0aG91dCB0b25lIG1hcHBpbmcgYW55dGhpbmcgYnJpZ2h0ZXIgdGhhbiAxLjAgaXMgc2ltcGx5IGN1dCBvZmYgdG8gcHVyZSB3aGl0ZS4gQ2FwdHVyZWRcclxuICAgIC8vIHRleHR1cmVzIGNhcnJ5IGEgc21hbGwgZnJhY3Rpb24gb2YgdmVyeSBicmlnaHQgcGl4ZWxzIC0gc2t5IHJlZmxlY3RlZCBpbiB3aW5kb3dzLCBzdW5saXRcclxuICAgIC8vIHJlbmRlciAtIGFuZCBvbmNlIGxpZ2h0aW5nIHB1c2hlcyB0aG9zZSBwYXN0IHRoZSBsaW1pdCB0aGV5IGZsYXR0ZW4gaW50byB3aGl0ZSBzcGVja3Mgd2l0aFxyXG4gICAgLy8gbm8gZGV0YWlsIGxlZnQuIFJvbGxpbmcgdGhlIGhpZ2hsaWdodHMgb2ZmIGluc3RlYWQga2VlcHMgdGhhdCBkZXRhaWwgYW5kIGtlZXBzIGJyaWdodCBhcmVhc1xyXG4gICAgLy8gcmVhZGluZyBhcyBicmlnaHQgcmF0aGVyIHRoYW4gYmxvd24uXHJcbiAgICB0aGlzLnJlbmRlcmVyLnRvbmVNYXBwaW5nID0gVEhSRUUuQUNFU0ZpbG1pY1RvbmVNYXBwaW5nO1xyXG4gICAgdGhpcy5yZW5kZXJlci50b25lTWFwcGluZ0V4cG9zdXJlID0gMS4wO1xyXG5cclxuICAgIC8vIDQuIExpZ2h0aW5nLCBrZXB0IGRlbGliZXJhdGVseSByZXN0cmFpbmVkIGFuZCBuZXV0cmFsLlxyXG4gICAgLy9cclxuICAgIC8vIENhcHR1cmVkL3Bob3RvZ3JhbW1ldHJ5IG1vZGVscyBhbHJlYWR5IGhhdmUgbGlnaHRpbmcgYmFrZWQgaW50byB0aGVpciB0ZXh0dXJlcyAodGhlIHN1biBhbmRcclxuICAgIC8vIHNoYWRvd3MgY2FtZSB3aXRoIHRoZSBwaG90b3MpLCBzbyBsaWdodGluZyB0aGVtIGFnYWluIGRpc3RvcnRzIHdoYXQgdGhleSBhY3R1YWxseSBsb29rIGxpa2UuXHJcbiAgICAvLyBUaGUgaW50ZW5zaXRpZXMgYmVsb3cgYWRkIHVwIHRvIHJvdWdobHkgMS4wIG9uIGEgc3VyZmFjZSBmYWNpbmcgdGhlIHZpZXdlciwgd2hpY2ggcmVuZGVycyB0aGVcclxuICAgIC8vIHRleHR1cmUgYXQgaXRzIHRydWUgdmFsdWUuIEFueXRoaW5nIGFib3ZlIDEuMCBpcyBjbGlwcGVkIHRvIHB1cmUgd2hpdGUgYnkgdGhlIHJlbmRlcmVyLCB3aGljaFxyXG4gICAgLy8gaXMgd2hhdCB0dXJucyBicmlnaHQgYXJlYXMgaW50byBmbGF0IHdoaXRlIHBhdGNoZXMgd2l0aCBubyBkZXRhaWwgbGVmdCBpbiB0aGVtLlxyXG4gICAgLy9cclxuICAgIC8vIE5ldXRyYWwgd2hpdGUgaXMgdXNlZCByYXRoZXIgdGhhbiBhIHdhcm0gdGludCBmb3IgdGhlIHNhbWUgcmVhc29uOiBhIHRpbnRlZCBsaWdodCBzaGlmdHMgZXZlcnlcclxuICAgIC8vIGNvbG91ciBpbiB0aGUgbW9kZWwgYXdheSBmcm9tIHdoYXQgd2FzIGNhcHR1cmVkLlxyXG4gICAgY29uc3QgYW1iaWVudExpZ2h0ID0gbmV3IFRIUkVFLkFtYmllbnRMaWdodCgweGZmZmZmZiwgMC43KTtcclxuICAgIHRoaXMuc2NlbmUuYWRkKGFtYmllbnRMaWdodCk7XHJcblxyXG4gICAgLy8gSGVhZGxpZ2h0IHJhdGhlciB0aGFuIGEgZml4ZWQgc3VuOiBwYXJlbnRlZCB0byB0aGUgY2FtZXJhIHNvIGl0IGFsd2F5cyBwb2ludHMgYXQgd2hhdGV2ZXIgaXNcclxuICAgIC8vIGJlaW5nIGxvb2tlZCBhdCwgZ2l2aW5nIHNoYXBlIHRvIHN1cmZhY2VzIHdpdGhvdXQgZXZlciBsZWF2aW5nIGEgZmFjZSB1bmxpdC4gTm8gc2hhZG93IGNhc3RpbmdcclxuICAgIC8vIC0gc2hhZG93cyB3b3VsZCBkb3VibGUgdXAgd2l0aCB0aGUgb25lcyBhbHJlYWR5IGJha2VkIGludG8gdGhlIHRleHR1cmVzLCBhbmQgdGhlIHNoYWRvdyBtYXBcclxuICAgIC8vIHdhcyBhIHJlYWwgY29zdCBwZXIgZnJhbWUuXHJcbiAgICBjb25zdCBoZWFkTGlnaHQgPSBuZXcgVEhSRUUuRGlyZWN0aW9uYWxMaWdodCgweGZmZmZmZiwgMC4zNSk7XHJcbiAgICBoZWFkTGlnaHQucG9zaXRpb24uc2V0KDAsIDAsIDEpO1xyXG4gICAgdGhpcy5jYW1lcmEuYWRkKGhlYWRMaWdodCk7XHJcbiAgICAvLyBBIGxpZ2h0IG9ubHkgY29udHJpYnV0ZXMgd2hpbGUgaXQgaXMgcGFydCBvZiB0aGUgc2NlbmUgZ3JhcGgsIGFuZCB0aGlzIG9uZSBoYW5ncyBvZmYgdGhlIGNhbWVyYS5cclxuICAgIHRoaXMuc2NlbmUuYWRkKHRoaXMuY2FtZXJhKTtcclxuXHJcbiAgICAvLyA1LiBTZXR1cCBDb250cm9scyAoZnJvbSBQT0MpXHJcbiAgICB0aGlzLmNvbnRyb2xzID0gbmV3IE9yYml0Q29udHJvbHModGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudCk7XHJcbiAgICB0aGlzLmNvbnRyb2xzLnJvdGF0ZVNwZWVkID0gMS4wO1xyXG4gICAgdGhpcy5jb250cm9scy5kYW1waW5nRmFjdG9yID0gMC4xO1xyXG4gICAgdGhpcy5jb250cm9scy5lbmFibGVEYW1waW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuY29udHJvbHMubW91c2VCdXR0b25zID0ge1xyXG4gICAgICBMRUZUOiBUSFJFRS5NT1VTRS5ST1RBVEUsXHJcbiAgICAgIE1JRERMRTogVEhSRUUuTU9VU0UuRE9MTFksXHJcbiAgICAgIFJJR0hUOiBUSFJFRS5NT1VTRS5QQU4sXHJcbiAgICB9O1xyXG4gICAgdGhpcy5jb250cm9scy50YXJnZXQuc2V0KDAsIDAsIDApO1xyXG5cclxuICAgIC8vIEV2ZW50IGxpc3RlbmVycyBvbiBjb250cm9scyB0byBkaWZmZXJlbnRpYXRlIGRyYWdnaW5nIHZzIGNsaWNraW5nXHJcbiAgICB0aGlzLmNvbnRyb2xzLmFkZEV2ZW50TGlzdGVuZXIoJ3N0YXJ0JywgKCkgPT4ge1xyXG4gICAgICB0aGlzLmlzRHJhZ2dpbmdUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuaXNEcmFnZ2luZ0NhbWVyYSA9IHRydWU7XHJcbiAgICAgIH0sIDE1MCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNvbnRyb2xzLmFkZEV2ZW50TGlzdGVuZXIoJ2VuZCcsICgpID0+IHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaXNEcmFnZ2luZ1RpbWVyKTtcclxuICAgICAgaWYgKHRoaXMuaXNEcmFnZ2luZ0NhbWVyYSkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5pc0RyYWdnaW5nQ2FtZXJhID0gZmFsc2U7XHJcbiAgICAgICAgfSwgMjUwKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gSW50ZXJhY3Rpb24gRXZlbnQgTGlzdGVuZXJzIG9uIGNhbnZhc1xyXG4gICAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vbk1vdXNlQ2xpY2suYmluZCh0aGlzKSwgZmFsc2UpO1xyXG4gICAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25Nb3VzZU1vdmUuYmluZCh0aGlzKSwgZmFsc2UpO1xyXG5cclxuICAgIC8vIEVzY2FwZSBiYWNrcyBvdXQgb2YgcGxhY2VtZW50IGFuZCBjYWxpYnJhdGlvbi4gT24gdGhlIHdpbmRvdyByYXRoZXIgdGhhbiB0aGUgY2FudmFzLCB3aGljaFxyXG4gICAgLy8gd291bGQgbmVlZCBmb2N1cyB0aGUgdXNlciBoYXMgbm8gcmVhc29uIHRvIGhhdmUgZ2l2ZW4gaXQgLSB0aGV5IGFyZSBhaW1pbmcgd2l0aCB0aGUgbW91c2UuXHJcbiAgICAvLyBSZW1vdmVkIGZpcnN0IGJlY2F1c2UgdGhpcyBzZXJ2aWNlIGlzIGEgc2luZ2xldG9uOiBpbml0KCkgcnVucyBhZ2FpbiBmb3IgZXZlcnkgY2FudmFzLCBhbmRcclxuICAgIC8vIHRoZSBwcmV2aW91cyByZWdpc3RyYXRpb24gd291bGQgb3RoZXJ3aXNlIHN0aWxsIGJlIGF0dGFjaGVkLlxyXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLm9uS2V5RG93bik7XHJcbiAgICB0aGlzLnBpY2tUYXJnZXQ/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMucGlja1RhcmdldCA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMucGlja0RlcHRoTWF0ZXJpYWw/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMucGlja0RlcHRoTWF0ZXJpYWwgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnBpY2tDYW1lcmEgPSB1bmRlZmluZWQ7XHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMub25LZXlEb3duKTtcclxuXHJcbiAgICAvLyA2LiBTdGFydCB0aGUgcmVuZGVyIGxvb3BcclxuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgdGhpcy5hbmltYXRlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBhdGggKHNlcnZlZCBieSB0aGUgYXBwKSBob2xkaW5nIGJhc2lzX3RyYW5zY29kZXIuanMvLndhc20sIHdoaWNoIEtUWDJMb2FkZXIgbmVlZHMgdG8gdHVyblxyXG4gICAqIEJhc2lzIFVuaXZlcnNhbCB0ZXh0dXJlcyBpbnRvIHdoYXRldmVyIGNvbXByZXNzZWQgZm9ybWF0IHRoZSBsb2NhbCBHUFUgYWN0dWFsbHkgc3VwcG9ydHMuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBrdHgyVHJhbnNjb2RlclBhdGggPSAnYXNzZXRzL2Jhc2lzLyc7XHJcblxyXG4gIC8qKiBPdmVycmlkZXMgd2hlcmUgdGhlIEJhc2lzIHRyYW5zY29kZXIgZmlsZXMgYXJlIHNlcnZlZCBmcm9tLiAqL1xyXG4gIHNldEt0eDJUcmFuc2NvZGVyUGF0aChwYXRoOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMua3R4MlRyYW5zY29kZXJQYXRoID0gcGF0aDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvYWRzIGEgYmFzZSAzRCBtb2RlbCBpbiBHTFRGL0dMQiBmb3JtYXQgLSB0aGUgcHJlZmVycmVkIGZvcm1hdCBmb3IgbGFyZ2UgbW9kZWxzLlxyXG4gICAqIFVubGlrZSAub2JqLCBnZW9tZXRyeSBhcnJpdmVzIGFzIGJpbmFyeSB0eXBlZCBhcnJheXMgKG5vIHRleHQgcGFyc2luZyB0byBvZmZsb2FkIHRvIGEgd29ya2VyKVxyXG4gICAqIGFuZCBzdGF5cyBpbmRleGVkLCBzbyBmYXIgbGVzcyBkYXRhIHJlYWNoZXMgdGhlIEdQVS4gS1RYMiB0ZXh0dXJlcyBhcmUgc3VwcG9ydGVkIHRvbzogdGhleVxyXG4gICAqIHN0YXkgY29tcHJlc3NlZCBpbiBWUkFNIGluc3RlYWQgb2YgYmVpbmcgZGVjb2RlZCB0byByYXcgcGl4ZWxzIGxpa2UgSlBFRy9QTkcuXHJcbiAgICovXHJcbiAgbG9hZEdMVEZNb2RlbCh1cmw6IHN0cmluZywgY2FtZXJhUG9zaXRpb24/OiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0sIHJvdGF0aW9uPzoge3g6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXJ9LCBjYWNoZUtleT86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgbG9hZGVyID0gbmV3IEdMVEZMb2FkZXIoKTtcclxuXHJcbiAgICAvLyBLVFgyIG5lZWRzIHRoZSByZW5kZXJlciB0byByZXBvcnQgd2hpY2ggY29tcHJlc3NlZCBmb3JtYXRzIHRoaXMgR1BVIGFjY2VwdHMsIHNvIHRoaXMgaGFzIHRvXHJcbiAgICAvLyBoYXBwZW4gYWZ0ZXIgaW5pdCgpLiBHdWFyZGVkIHNvIGEgbW9kZWwgd2l0aG91dCBLVFgyIHRleHR1cmVzIHN0aWxsIGxvYWRzIGlmIGl0J3MgbWlzc2luZy5cclxuICAgIGlmICh0aGlzLnJlbmRlcmVyKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3Qga3R4MkxvYWRlciA9IG5ldyBLVFgyTG9hZGVyKClcclxuICAgICAgICAgIC5zZXRUcmFuc2NvZGVyUGF0aCh0aGlzLmt0eDJUcmFuc2NvZGVyUGF0aClcclxuICAgICAgICAgIC5kZXRlY3RTdXBwb3J0KHRoaXMucmVuZGVyZXIpO1xyXG4gICAgICAgIGxvYWRlci5zZXRLVFgyTG9hZGVyKGt0eDJMb2FkZXIpO1xyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignVGhyZWVKc1NlcnZpY2U6IGNvdWxkIG5vdCBzZXQgdXAgS1RYMiB0ZXh0dXJlIHN1cHBvcnQsIGZhbGxpbmcgYmFjayB0byB1bmNvbXByZXNzZWQgdGV4dHVyZXMuJywgZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBMZXRzIGdsdGZwYWNrL2dsdGYtdHJhbnNmb3JtIG91dHB1dCB1c2luZyBFWFRfbWVzaG9wdF9jb21wcmVzc2lvbiBsb2FkIHdpdGhvdXQgZXh0cmEgc2V0dXAuXHJcbiAgICBsb2FkZXIuc2V0TWVzaG9wdERlY29kZXIoTWVzaG9wdERlY29kZXIpO1xyXG5cclxuICAgIHRoaXMubW9kZWxMb2FkaW5nJC5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5tb2RlbExvYWRQcm9ncmVzcyQubmV4dCgwKTtcclxuXHJcbiAgICAvLyBPcmRlciBtYXR0ZXJzOiBub3JtYWxzIG11c3QgZXhpc3QgYmVmb3JlIGFuaXNvdHJvcHksIGFuZCB0aGUgUGhvbmcgY29udmVyc2lvbiBoYXMgdG8gcnVuXHJcbiAgICAvLyBiZWZvcmUgc2lkZS9mbGF0U2hhZGluZyBhcmUgdG91Y2hlZCBzbyB0aG9zZSBzZXR0aW5ncyBsYW5kIG9uIHRoZSBtYXRlcmlhbHMgd2Uga2VlcC5cclxuICAgIGNvbnN0IG9uTG9hZGVkID0gKGdsdGY6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLmNvbnZlcnRUb1Bob25nTWF0ZXJpYWxzKGdsdGYuc2NlbmUpO1xyXG4gICAgICB0aGlzLmZvcmNlRG91YmxlU2lkZWRNYXRlcmlhbHMoZ2x0Zi5zY2VuZSk7XHJcbiAgICAgIHRoaXMuZW5zdXJlVmVydGV4Tm9ybWFscyhnbHRmLnNjZW5lKTtcclxuICAgICAgdGhpcy50dW5lVGV4dHVyZVNhbXBsaW5nKGdsdGYuc2NlbmUpO1xyXG4gICAgICB0aGlzLnBsYWNlTG9hZGVkT2JqZWN0SW5TY2VuZShnbHRmLnNjZW5lLCBjYW1lcmFQb3NpdGlvbiwgcm90YXRpb24pO1xyXG4gICAgICB0aGlzLm1vZGVsTG9hZGluZyQubmV4dChmYWxzZSk7XHJcbiAgICB9O1xyXG4gICAgY29uc3Qgb25FcnJvciA9IChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgIC8vIENhbmNlbGxpbmcgaXMgYSBkZWNpc2lvbiwgbm90IGEgZmFpbHVyZTogY2xlYXIgdGhlIG92ZXJsYXkgd2l0aG91dCBhbiBlcnJvciBpbiB0aGUgY29uc29sZS5cclxuICAgICAgaWYgKGVycm9yPy5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcclxuICAgICAgICAvLyBPbmx5IGEgY2FuY2VsIG9mIHRoZSBsb2FkIHRoYXQgaXMgc3RpbGwgY3VycmVudCBjYW1lIGZyb20gdGhlIHVzZXI7IGFueXRoaW5nIGVsc2UgaXMgdGhpc1xyXG4gICAgICAgIC8vIGxvYWQgaGF2aW5nIGJlZW4gc3VwZXJzZWRlZCBvciBkaXNjYXJkZWQuXHJcbiAgICAgICAgaWYgKHRoaXMubG9hZEFib3J0Q29udHJvbGxlcj8uc2lnbmFsLmFib3J0ZWQpIHtcclxuICAgICAgICAgIHRoaXMubW9kZWxMb2FkQ2FuY2VsbGVkJC5uZXh0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgR0xURiBtb2RlbDonLCBlcnJvcik7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5tb2RlbExvYWRpbmckLm5leHQoZmFsc2UpO1xyXG4gICAgICB0aGlzLm1vZGVsTG9hZFByb2dyZXNzJC5uZXh0KG51bGwpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBHTFRGTG9hZGVyIGRlY29kZXMgZW1iZWRkZWQgaW1hZ2VzIHdpdGggY3JlYXRlSW1hZ2VCaXRtYXAgd2hlbiB0aGUgYnJvd3NlciBvZmZlcnMgaXQsIGFuZCBvblxyXG4gICAgLy8gbGFyZ2UgdGV4dHVyZSBhdGxhc2VzIHRoYXQgcGF0aCByZXR1cm5zIHZpc2libHkgY29ycnVwdCBkYXRhIC0gc2NhdHRlcmVkIHdoaXRlIGJsb2NrcyBhY3Jvc3NcclxuICAgIC8vIHRoZSBtb2RlbC4gVGhlIGV4YWN0IHNhbWUgYnl0ZXMgZGVjb2RlZCB0aHJvdWdoIGFuIEhUTUxJbWFnZUVsZW1lbnQsIHdoaWNoIGlzIHdoYXQgdGhlIC5vYmpcclxuICAgIC8vIHBhdGggdXNlcyB2aWEgTVRMTG9hZGVyLCBjb21lIG91dCBjbGVhbi4gR0xURkxvYWRlciBhbHJlYWR5IGZhbGxzIGJhY2sgdG8gdGhhdCBkZWNvZGVyIGZvclxyXG4gICAgLy8gU2FmYXJpIGFuZCBvbGRlciBGaXJlZm94OyB0aGlzIHNpbXBseSBleHRlbmRzIHRoZSBmYWxsYmFjayB0byBjb3ZlciB0aGlzIGNhc2UgdG9vLlxyXG4gICAgLy9cclxuICAgIC8vIFRoZSBkZWNvZGVyIGlzIGNob3NlbiB3aGlsZSBHTFRGUGFyc2VyIGlzIGJlaW5nIGNvbnN0cnVjdGVkLCB3aGljaCBoYXBwZW5zIHN5bmNocm9ub3VzbHlcclxuICAgIC8vIGluc2lkZSBwYXJzZSgpLCBzbyBoaWRpbmcgY3JlYXRlSW1hZ2VCaXRtYXAgb25seSBoYXMgdG8gaG9sZCBhY3Jvc3MgdGhhdCBjYWxsIHJhdGhlciB0aGFuXHJcbiAgICAvLyBmb3IgdGhlIHdob2xlIGRvd25sb2FkLlxyXG4gICAgdGhpcy5mZXRjaFdpdGhQcm9ncmVzcyh1cmwsIGNhY2hlS2V5KVxyXG4gICAgICAvLyBwYXJzZSgpIGhvbGRzIHRoZSBtYWluIHRocmVhZCBmb3Igc2Vjb25kcyBvbiBhIGxhcmdlIG1vZGVsLiBZaWVsZCB1bnRpbCB0aGUgYnJvd3NlciBoYXNcclxuICAgICAgLy8gYWN0dWFsbHkgcGFpbnRlZCBmaXJzdCwgb3RoZXJ3aXNlIHRoZSBmaW5hbCBwcm9ncmVzcyB1cGRhdGUgbmV2ZXIgcmVhY2hlcyB0aGUgc2NyZWVuIGFuZFxyXG4gICAgICAvLyB0aGUgYmFyIGFwcGVhcnMgdG8gc3RhbGwgc2hvcnQgb2YgdGhlIGVuZC5cclxuICAgICAgLnRoZW4oKGJ1ZmZlcikgPT4gdGhpcy5hZnRlck5leHRQYWludCgpLnRoZW4oKCkgPT4gYnVmZmVyKSlcclxuICAgICAgLnRoZW4oKGJ1ZmZlcikgPT4ge1xyXG4gICAgICAgIC8vIHBhcnNlKCkgY2Fubm90IGJlIGludGVycnVwdGVkLCBzbyBhIGNhbmNlbCB0aGF0IGxhbmRzIGR1cmluZyB0aGUgcGFpbnQgeWllbGQgaGFzIHRvIGJlXHJcbiAgICAgICAgLy8gY2F1Z2h0IGhlcmUgLSB0aGUgbGFzdCBtb21lbnQgYmVmb3JlIHRoZSBtYWluIHRocmVhZCBpcyBjb21taXR0ZWQgZm9yIHNldmVyYWwgc2Vjb25kcy5cclxuICAgICAgICBpZiAodGhpcy5sb2FkQWJvcnRDb250cm9sbGVyPy5zaWduYWwuYWJvcnRlZCkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignTW9kZWwgbG9hZCBjYW5jZWxsZWQnLCAnQWJvcnRFcnJvcicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBnbG9iYWxTY29wZSA9IGdsb2JhbFRoaXMgYXMgYW55O1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsQ3JlYXRlSW1hZ2VCaXRtYXAgPSBnbG9iYWxTY29wZS5jcmVhdGVJbWFnZUJpdG1hcDtcclxuICAgICAgICBnbG9iYWxTY29wZS5jcmVhdGVJbWFnZUJpdG1hcCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgbG9hZGVyLnBhcnNlKGJ1ZmZlciwgdXJsLnN1YnN0cmluZygwLCB1cmwubGFzdEluZGV4T2YoJy8nKSArIDEpLCBvbkxvYWRlZCwgb25FcnJvcik7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgIGdsb2JhbFNjb3BlLmNyZWF0ZUltYWdlQml0bWFwID0gb3JpZ2luYWxDcmVhdGVJbWFnZUJpdG1hcDtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaChvbkVycm9yKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0b3BzIHRoZSBtb2RlbCBkb3dubG9hZCBpbiBwcm9ncmVzcywgaWYgYW55LlxyXG4gICAqXHJcbiAgICogT25seSB0aGUgZG93bmxvYWQgY2FuIGJlIGludGVycnVwdGVkOiBwYXJzZSgpIHJ1bnMgc3luY2hyb25vdXNseSBhbmQgaG9sZHMgdGhlIG1haW4gdGhyZWFkIHVudGlsXHJcbiAgICogaXQgZmluaXNoZXMsIHNvIG9uY2UgaXQgaGFzIGJlZ3VuIHRoZXJlIGlzIG5vdGhpbmcgdG8gY2FuY2VsLiBJbiBwcmFjdGljZSB0aGUgZG93bmxvYWQgaXMgdGhlXHJcbiAgICogbG9uZyBwYXJ0LCB3aGljaCBpcyB3aGVyZSBzb21lb25lIHJlYWNoZXMgZm9yIHRoaXMuXHJcbiAgICovXHJcbiAgY2FuY2VsTW9kZWxMb2FkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkQWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWJhbmRvbnMgdGhlIGxvYWQgaW4gcHJvZ3Jlc3Mgd2l0aG91dCByZXBvcnRpbmcgaXQgYXMgY2FuY2VsbGVkLlxyXG4gICAqXHJcbiAgICogRHJvcHBpbmcgdGhlIGNvbnRyb2xsZXIgaXMgd2hhdCBtYWtlcyB0aGUgZGlmZmVyZW5jZTogb25FcnJvciB0cmVhdHMgYW4gYWJvcnQgYXMgdXNlci1pbml0aWF0ZWRcclxuICAgKiBvbmx5IHdoaWxlIHRoZSBjb250cm9sbGVyIHRoYXQgYWJvcnRlZCBpcyBzdGlsbCB0aGUgY3VycmVudCBvbmUuIFRlYXJpbmcgZG93biBvciByZWJ1aWxkaW5nIHRoZVxyXG4gICAqIHNjZW5lIGlzIG5vdCBzb21ldGhpbmcgdGhlIHBlcnNvbiBhc2tlZCBmb3IsIHNvIGl0IG11c3Qgbm90IHN1cmZhY2UgYXMgXCJsb2FkaW5nIGNhbmNlbGxlZFwiLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZGlzY2FyZEN1cnJlbnRMb2FkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkQWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xyXG4gICAgdGhpcy5sb2FkQWJvcnRDb250cm9sbGVyID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzb2x2ZXMgb25jZSB0aGUgYnJvd3NlciBoYXMgcGFpbnRlZCBhdCBsZWFzdCBvbmUgZnJhbWUuXHJcbiAgICpcclxuICAgKiBBIHJlcXVlc3RBbmltYXRpb25GcmFtZSBjYWxsYmFjayBydW5zICpiZWZvcmUqIHRoYXQgZnJhbWUgaXMgcGFpbnRlZCwgc28gYSBzaW5nbGUgb25lIGlzIG5vdFxyXG4gICAqIGVub3VnaCB0byBndWFyYW50ZWUgcGVuZGluZyBET00gY2hhbmdlcyBhcmUgb24gc2NyZWVuOyB0aGUgc2Vjb25kIGZpcmVzIGFmdGVyIHRoZSBmaXJzdCBmcmFtZVxyXG4gICAqIGhhcyBnb25lIG91dC4gRmFsbHMgYmFjayB0byBhIHRpbWVvdXQgd2hlcmUgckFGIGlzbid0IGF2YWlsYWJsZSAoU1NSLCB0ZXN0cykuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhZnRlck5leHRQYWludCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAwKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiByZXNvbHZlKCkpKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRG93bmxvYWRzIGEgZmlsZSwgcmVwb3J0aW5nIHByb2dyZXNzIG9uIG1vZGVsTG9hZFByb2dyZXNzJCBhcyBpdCBhcnJpdmVzLlxyXG4gICAqXHJcbiAgICogR0xURkxvYWRlci5sb2FkKCkgd291bGQgcmVwb3J0IHByb2dyZXNzIHRocm91Z2ggWEhSLCBidXQgdGhpcyBwYXRoIGRlbGliZXJhdGVseSB1c2VzIGZldGNoKCkgK1xyXG4gICAqIHBhcnNlKCkgaW5zdGVhZCAoc2VlIGxvYWRHTFRGTW9kZWwgZm9yIHdoeSksIHNvIHByb2dyZXNzIGlzIHJlYWQgb2ZmIHRoZSByZXNwb25zZSBzdHJlYW0gaGVyZS5cclxuICAgKiBUaGF0IGlzIGFsc28gdGhlIG1vcmUgdXNlZnVsIG51bWJlcjogb24gYSBtb2RlbCBvZiB0aGlzIHNpemUgdGhlIGRvd25sb2FkIGRvbWluYXRlcywgYW5kIHRoZVxyXG4gICAqIHN0cmVhbSByZXBvcnRzIGl0IGFzIGl0IGhhcHBlbnMgcmF0aGVyIHRoYW4gaW4gb25lIGp1bXAgYXQgdGhlIGVuZC5cclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGZldGNoV2l0aFByb2dyZXNzKHVybDogc3RyaW5nLCBjYWNoZUtleT86IHN0cmluZyk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcclxuICAgIC8vIEEgbG9hZCBhbHJlYWR5IHJ1bm5pbmcgaXMgcmVwbGFjZWQsIG5vdCByYWNlZDogd2hpY2hldmVyIGZpbmlzaGVkIGxhc3Qgd291bGQgb3RoZXJ3aXNlIHdpbi5cclxuICAgIHRoaXMubG9hZEFib3J0Q29udHJvbGxlcj8uYWJvcnQoKTtcclxuICAgIHRoaXMubG9hZEFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcclxuICAgIGNvbnN0IHsgc2lnbmFsIH0gPSB0aGlzLmxvYWRBYm9ydENvbnRyb2xsZXI7XHJcblxyXG4gICAgY29uc3QgY2FjaGVkID0gYXdhaXQgdGhpcy5yZWFkTW9kZWxGcm9tQ2FjaGUoY2FjaGVLZXkpO1xyXG4gICAgaWYgKGNhY2hlZCkge1xyXG4gICAgICB0aGlzLm1vZGVsTG9hZFByb2dyZXNzJC5uZXh0KDEpO1xyXG4gICAgICByZXR1cm4gY2FjaGVkO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7IHNpZ25hbCB9KTtcclxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggJHt1cmx9OiAke3Jlc3BvbnNlLnN0YXR1c30gJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbnRlbnRMZW5ndGggPSBOdW1iZXIocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtTGVuZ3RoJykpO1xyXG4gICAgY29uc3QgdG90YWwgPSBOdW1iZXIuaXNGaW5pdGUoY29udGVudExlbmd0aCkgJiYgY29udGVudExlbmd0aCA+IDAgPyBjb250ZW50TGVuZ3RoIDogMDtcclxuXHJcbiAgICAvLyBXaXRob3V0IGEgcmVhZGFibGUgc3RyZWFtIChvbGRlciBicm93c2Vycywgc29tZSBwb2x5ZmlsbHMpIHRoZXJlIGlzIG5vdGhpbmcgdG8gbWVhc3VyZSwgc29cclxuICAgIC8vIGZhbGwgYmFjayB0byBhIHBsYWluIGJ1ZmZlcmVkIHJlYWQgYW5kIGxldCB0aGUgVUkgc2hvdyBhbiBpbmRldGVybWluYXRlIGluZGljYXRvci5cclxuICAgIGlmICghcmVzcG9uc2UuYm9keT8uZ2V0UmVhZGVyKSB7XHJcbiAgICAgIHRoaXMubW9kZWxMb2FkUHJvZ3Jlc3MkLm5leHQobnVsbCk7XHJcbiAgICAgIHJldHVybiByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHkuZ2V0UmVhZGVyKCk7XHJcblxyXG4gICAgLy8gV2l0aCBhIGtub3duIHNpemUsIHdyaXRlIGNodW5rcyBzdHJhaWdodCBpbnRvIG9uZSBwcmUtYWxsb2NhdGVkIGJ1ZmZlci4gQ29sbGVjdGluZyB0aGVtIGluIGFuXHJcbiAgICAvLyBhcnJheSBhbmQgY29uY2F0ZW5hdGluZyBhZnRlcndhcmRzIHdvdWxkIGhvbGQgYm90aCBjb3BpZXMgYXQgb25jZSAtIG9uIGEgMTY0IE1CIG1vZGVsIHRoYXQgaXNcclxuICAgIC8vIGFuIGF2b2lkYWJsZSAzMDArIE1CIHBlYWsuXHJcbiAgICBjb25zdCBidWZmZXIgPSB0b3RhbCA+IDAgPyBuZXcgVWludDhBcnJheSh0b3RhbCkgOiBudWxsO1xyXG4gICAgY29uc3QgY2h1bmtzOiBVaW50OEFycmF5W10gPSBbXTtcclxuICAgIGxldCB1c2luZ0J1ZmZlciA9IGJ1ZmZlciAhPT0gbnVsbDtcclxuICAgIGxldCByZWNlaXZlZCA9IDA7XHJcbiAgICAvLyBDaHVua3MgYXJyaXZlIGluIHRlbnMgb2Yga2lsb2J5dGVzLCBzbyBhIDE2NCBNQiBtb2RlbCBwcm9kdWNlcyB0aG91c2FuZHMgb2YgdGhlbS4gRW1pdHRpbmcgb25cclxuICAgIC8vIGV2ZXJ5IG9uZSB3b3VsZCBydW4gY2hhbmdlIGRldGVjdGlvbiBqdXN0IGFzIG9mdGVuIHRvIG1vdmUgYSBiYXIgdGhhdCBpcyBtZWFzdXJlZCBpbiB3aG9sZVxyXG4gICAgLy8gcGVyY2VudCwgc28gb25seSByZXBvcnQgd2hlbiB0aGUgZGlzcGxheWVkIHZhbHVlIHdvdWxkIGFjdHVhbGx5IGNoYW5nZS5cclxuICAgIGxldCBsYXN0UmVwb3J0ZWQgPSAtMTtcclxuXHJcbiAgICBpZiAodG90YWwgPT09IDApIHtcclxuICAgICAgdGhpcy5tb2RlbExvYWRQcm9ncmVzcyQubmV4dChudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKDs7KSB7XHJcbiAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XHJcbiAgICAgIGlmIChkb25lKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XHJcbiAgICAgICAgLy8gRnJlZSB0aGUgY29ubmVjdGlvbiByYXRoZXIgdGhhbiBsZWF2aW5nIGl0IGRyYWluaW5nIGluIHRoZSBiYWNrZ3JvdW5kLlxyXG4gICAgICAgIGF3YWl0IHJlYWRlci5jYW5jZWwoKTtcclxuICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdNb2RlbCBsb2FkIGNhbmNlbGxlZCcsICdBYm9ydEVycm9yJyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHVzaW5nQnVmZmVyICYmIHJlY2VpdmVkICsgdmFsdWUubGVuZ3RoID4gdG90YWwpIHtcclxuICAgICAgICAvLyBDb250ZW50LUxlbmd0aCB1bmRlcnN0YXRlZCB0aGUgcmVhbCBzaXplLiBNb3ZlIHdoYXQgd2UgaGF2ZSBpbnRvIHRoZSBjaHVuayBsaXN0IGFuZCBzdGF5XHJcbiAgICAgICAgLy8gdGhlcmUgZm9yIHRoZSByZXN0IG9mIHRoZSByZXNwb25zZSwgcmF0aGVyIHRoYW4gdHJ1bmNhdGluZyB0aGUgdGFpbC5cclxuICAgICAgICBjaHVua3MucHVzaChidWZmZXIuc2xpY2UoMCwgcmVjZWl2ZWQpKTtcclxuICAgICAgICB1c2luZ0J1ZmZlciA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh1c2luZ0J1ZmZlcikge1xyXG4gICAgICAgIGJ1ZmZlci5zZXQodmFsdWUsIHJlY2VpdmVkKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjaHVua3MucHVzaCh2YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgcmVjZWl2ZWQgKz0gdmFsdWUubGVuZ3RoO1xyXG4gICAgICBpZiAodG90YWwgPiAwKSB7XHJcbiAgICAgICAgY29uc3QgcGVyY2VudCA9IE1hdGgubWluKE1hdGgucm91bmQoKHJlY2VpdmVkIC8gdG90YWwpICogMTAwKSwgMTAwKTtcclxuICAgICAgICBpZiAocGVyY2VudCAhPT0gbGFzdFJlcG9ydGVkKSB7XHJcbiAgICAgICAgICBsYXN0UmVwb3J0ZWQgPSBwZXJjZW50O1xyXG4gICAgICAgICAgdGhpcy5tb2RlbExvYWRQcm9ncmVzcyQubmV4dChwZXJjZW50IC8gMTAwKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBUaGUgc3RyZWFtIGNhbiBlbmQgYmVsb3cgdGhlIGFkdmVydGlzZWQgc2l6ZSAob3Igd2l0aCBubyBzaXplIGF0IGFsbCkuIExhbmQgb24gYSBmdWxsIGJhclxyXG4gICAgLy8gcmF0aGVyIHRoYW4gbGVhdmluZyBpdCBzdHVjayBhdCB3aGF0ZXZlciB0aGUgbGFzdCBjaHVuayBoYXBwZW5lZCB0byByZWFjaC5cclxuICAgIGlmICh0b3RhbCA+IDAgJiYgbGFzdFJlcG9ydGVkICE9PSAxMDApIHtcclxuICAgICAgdGhpcy5tb2RlbExvYWRQcm9ncmVzcyQubmV4dCgxKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVzdWx0OiBBcnJheUJ1ZmZlcjtcclxuICAgIGlmICh1c2luZ0J1ZmZlciAmJiByZWNlaXZlZCA9PT0gdG90YWwpIHtcclxuICAgICAgcmVzdWx0ID0gYnVmZmVyLmJ1ZmZlcjtcclxuICAgIH0gZWxzZSBpZiAodXNpbmdCdWZmZXIpIHtcclxuICAgICAgLy8gRmV3ZXIgYnl0ZXMgdGhhbiBhZHZlcnRpc2VkOiBoYW5kIGJhY2sgZXhhY3RseSB3aGF0IGFycml2ZWQuXHJcbiAgICAgIHJlc3VsdCA9IGJ1ZmZlci5idWZmZXIuc2xpY2UoMCwgcmVjZWl2ZWQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgbWVyZ2VkID0gbmV3IFVpbnQ4QXJyYXkocmVjZWl2ZWQpO1xyXG4gICAgICBsZXQgb2Zmc2V0ID0gMDtcclxuICAgICAgY2h1bmtzLmZvckVhY2goKGNodW5rKSA9PiB7XHJcbiAgICAgICAgbWVyZ2VkLnNldChjaHVuaywgb2Zmc2V0KTtcclxuICAgICAgICBvZmZzZXQgKz0gY2h1bmsubGVuZ3RoO1xyXG4gICAgICB9KTtcclxuICAgICAgcmVzdWx0ID0gbWVyZ2VkLmJ1ZmZlcjtcclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCB0aGlzLndyaXRlTW9kZWxUb0NhY2hlKGNhY2hlS2V5LCByZXN1bHQpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBtb2RlbCBzdG9yZSwgb3IgbnVsbCB3aGVyZSB0aGUgYnJvd3NlciB3aWxsIG5vdCBnaXZlIHVzIG9uZS5cclxuICAgKlxyXG4gICAqIENhY2hlIFN0b3JhZ2UgbmVlZHMgYSBzZWN1cmUgY29udGV4dCwgc28gaXQgaXMgYWJzZW50IG92ZXIgcGxhaW4gaHR0cCBhbmQgaW4gc29tZSBlbWJlZGRlZFxyXG4gICAqIHdlYnZpZXdzLiBFdmVyeSBjYWxsZXIgdHJlYXRzIHRoYXQgYXMgYSBtaXNzIC0gY2FjaGluZyBpcyBhbiBvcHRpbWlzYXRpb24sIG5ldmVyIGEgcmVxdWlyZW1lbnQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBvcGVuTW9kZWxDYWNoZSgpOiBQcm9taXNlPENhY2hlIHwgbnVsbD4ge1xyXG4gICAgaWYgKHR5cGVvZiBjYWNoZXMgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIGF3YWl0IGNhY2hlcy5vcGVuKFRocmVlSnNTZXJ2aWNlLk1PREVMX0NBQ0hFKTtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEEgY2FjaGVkIGNvcHkgb2YgdGhpcyBtb2RlbCwgaWYgb25lIHdhcyBzdG9yZWQuXHJcbiAgICpcclxuICAgKiBLZXllZCBieSB0aGUgUzMga2V5IHJhdGhlciB0aGFuIHRoZSBVUkwgaXQgaXMgZmV0Y2hlZCBmcm9tOiB0aGF0IFVSTCBpcyBzaWduZWQsIHNvIGl0IGNhcnJpZXMgYVxyXG4gICAqIGZyZXNoIHNpZ25hdHVyZSBhbmQgZXhwaXJ5IGV2ZXJ5IHRpbWUgYW5kIHdvdWxkIG5ldmVyIG1hdGNoIHR3aWNlLiBUaGUgYnJvd3NlcidzIG93biBIVFRQIGNhY2hlXHJcbiAgICogbWlzc2VzIGZvciB0aGUgc2FtZSByZWFzb24sIHdoaWNoIGlzIHdoeSB0aGlzIGV4aXN0cyBhdCBhbGwuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyByZWFkTW9kZWxGcm9tQ2FjaGUoY2FjaGVLZXk/OiBzdHJpbmcpOiBQcm9taXNlPEFycmF5QnVmZmVyIHwgbnVsbD4ge1xyXG4gICAgaWYgKCFjYWNoZUtleSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgdGhpcy5vcGVuTW9kZWxDYWNoZSgpO1xyXG4gICAgICBjb25zdCBoaXQgPSBhd2FpdCBjYWNoZT8ubWF0Y2godGhpcy5tb2RlbENhY2hlVXJsKGNhY2hlS2V5KSk7XHJcbiAgICAgIHJldHVybiBoaXQgPyBhd2FpdCBoaXQuYXJyYXlCdWZmZXIoKSA6IG51bGw7XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogU3RvcmVzIGEgbW9kZWwgZm9yIG5leHQgdGltZSwgZXZpY3RpbmcgdGhlIG9sZGVzdCBvbmNlIGEgZmV3IGFyZSBoZWxkLiAqL1xyXG4gIHByaXZhdGUgYXN5bmMgd3JpdGVNb2RlbFRvQ2FjaGUoY2FjaGVLZXk6IHN0cmluZyB8IHVuZGVmaW5lZCwgbW9kZWw6IEFycmF5QnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIWNhY2hlS2V5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgdGhpcy5vcGVuTW9kZWxDYWNoZSgpO1xyXG4gICAgICBpZiAoIWNhY2hlKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGF3YWl0IGNhY2hlLnB1dCh0aGlzLm1vZGVsQ2FjaGVVcmwoY2FjaGVLZXkpLCBuZXcgUmVzcG9uc2UobW9kZWwpKTtcclxuXHJcbiAgICAgIC8vIE1vZGVscyBydW4gdG8gaHVuZHJlZHMgb2YgbWVnYWJ5dGVzLCBzbyB0aGlzIGNhbm5vdCBncm93IHdpdGhvdXQgbGltaXQuIENhY2hlIFN0b3JhZ2Uga2VlcHNcclxuICAgICAgLy8gaW5zZXJ0aW9uIG9yZGVyLCB3aGljaCBtYWtlcyB0aGUgZnJvbnQgb2YgdGhlIGxpc3QgdGhlIGxlYXN0IHJlY2VudGx5IHN0b3JlZC5cclxuICAgICAgY29uc3Qga2V5cyA9IGF3YWl0IGNhY2hlLmtleXMoKTtcclxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAga2V5cy5zbGljZSgwLCBNYXRoLm1heCgwLCBrZXlzLmxlbmd0aCAtIFRocmVlSnNTZXJ2aWNlLk1PREVMX0NBQ0hFX1NJWkUpKVxyXG4gICAgICAgICAgLm1hcCgoa2V5KSA9PiBjYWNoZS5kZWxldGUoa2V5KSlcclxuICAgICAgKTtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICAvLyBPdXQgb2YgcXVvdGEsIHByaXZhdGUgYnJvd3NpbmcsIHN0b3JhZ2UgZGlzYWJsZWQ6IHRoZSBtb2RlbCBpcyBhbHJlYWR5IGxvYWRlZCBlaXRoZXIgd2F5LlxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIENhY2hlIFN0b3JhZ2Uga2V5cyBvbiBhIFVSTCwgc28gdGhlIFMzIGtleSBpcyBleHByZXNzZWQgYXMgb25lLiBJdCBpcyBuZXZlciByZXF1ZXN0ZWQuICovXHJcbiAgcHJpdmF0ZSBtb2RlbENhY2hlVXJsKGNhY2hlS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGBodHRwczovLzNkLW1vZGVsLWNhY2hlLnNtYXJ0ZXJwbGFuLmxvY2FsLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGNhY2hlS2V5KX1gO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRml0cyB0aGUgY2FtZXJhJ3MgY2xpcHBpbmcgcGxhbmVzIHRvIGhvdyBiaWcgdGhlIG1vZGVsIGFjdHVhbGx5IGlzLlxyXG4gICAqXHJcbiAgICogRGVwdGggcHJlY2lzaW9uIGRlcGVuZHMgb24gdGhlIGZhci9uZWFyIHJhdGlvLCBhbmQgdGhlIGZpeGVkIDAuMSAvIDEwMDAwIHRoZSBjYW1lcmEgc3RhcnRzIHdpdGhcclxuICAgKiBpcyBhIHJhdGlvIG9mIDEwMDAwMCBmb3IgYSBtb2RlbCBvbmx5IH4xMCB1bml0cyBhY3Jvc3MuIFRoYXQgd2FzdGVzIG1vc3Qgb2YgdGhlIGRlcHRoIGJ1ZmZlciBvblxyXG4gICAqIGVtcHR5IHNwYWNlIGFuZCBsZXRzIG5lYXJseSBjb2luY2lkZW50IHN1cmZhY2VzIC0gd2hpY2ggY2FwdHVyZWQgbWVzaGVzIGhhdmUgZXZlcnl3aGVyZSAtXHJcbiAgICogZmxpY2tlciBhZ2FpbnN0IGVhY2ggb3RoZXIuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhZGp1c3RDbGlwcGluZ1BsYW5lcyhyYWRpdXM6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHJhZGl1cyA8IDEwKSB7XHJcbiAgICAgIHRoaXMuY2FtZXJhLm5lYXIgPSAwLjAxO1xyXG4gICAgICB0aGlzLmNhbWVyYS5mYXIgPSAxMDA7XHJcbiAgICB9IGVsc2UgaWYgKHJhZGl1cyA8IDEwMCkge1xyXG4gICAgICB0aGlzLmNhbWVyYS5uZWFyID0gMC4xO1xyXG4gICAgICB0aGlzLmNhbWVyYS5mYXIgPSAxMDAwO1xyXG4gICAgfSBlbHNlIGlmIChyYWRpdXMgPCAxMDAwKSB7XHJcbiAgICAgIHRoaXMuY2FtZXJhLm5lYXIgPSAxMDtcclxuICAgICAgdGhpcy5jYW1lcmEuZmFyID0gMTAwMDA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNhbWVyYS5uZWFyID0gMTAwO1xyXG4gICAgICB0aGlzLmNhbWVyYS5mYXIgPSAxMDAwMDAwO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3dhcHMgdGhlIFBCUiBtYXRlcmlhbHMgR0xURkxvYWRlciBidWlsZHMgZm9yIHRoZSBwbGFpbiBQaG9uZyBvbmVzIHRoZSAub2JqIHBhdGggcHJvZHVjZXMuXHJcbiAgICpcclxuICAgKiBNZXNoU3RhbmRhcmRNYXRlcmlhbCBrZWVwcyBhIHNwZWN1bGFyIHJlZmxlY3Rpb24gZXZlbiBhdCBtZXRhbG5lc3MgMCwgc2luY2UgZXZlcnkgZGllbGVjdHJpY1xyXG4gICAqIHJlZmxlY3RzIHNvbWUgbGlnaHQsIGFuZCBGcmVzbmVsIGRyaXZlcyB0aGF0IHJlZmxlY3Rpb24gdG93YXJkcyB3aGl0ZSBhcyBhIHN1cmZhY2UgdHVybnMgYXdheVxyXG4gICAqIGZyb20gdGhlIHZpZXdlci4gT24gYW4gYWVyaWFsIHZpZXcgb2YgYSBmYWNhZGUgbW9zdCBzdXJmYWNlcyBzaXQgYXQgZXhhY3RseSB0aG9zZSBncmF6aW5nXHJcbiAgICogYW5nbGVzLCB3aGljaCBwYWludHMgd2hpdGUgaGlnaGxpZ2h0cyBvdmVyIHdpbmRvdyBmcmFtZXMgYW5kIHJvb2YgZWRnZXMgLSB0aGUgc2FtZSBtb2RlbFxyXG4gICAqIGxvYWRlZCBhcyAub2JqIG5ldmVyIHNob3dzIHRoZW0sIGJlY2F1c2UgTVRMTG9hZGVyIGJ1aWxkcyBQaG9uZyBtYXRlcmlhbHMgYW5kIE9CSkxvYWRlciB6ZXJvZXNcclxuICAgKiB0aGVpciBzcGVjdWxhciB3aGVuIHRoZSAubXRsIGRlY2xhcmVzIE5zIDAuXHJcbiAgICpcclxuICAgKiBDYXB0dXJlZCBtb2RlbHMgY2FycnkgdGhlaXIgbGlnaHRpbmcgaW4gdGhlIHRleHR1cmUgYW5kIHdhbnQgbm8gc3BlY3VsYXIgcmVzcG9uc2UgYXQgYWxsLCBzb1xyXG4gICAqIG1hdGNoaW5nIHRoZSAub2JqIHBhdGggaGVyZSBpcyBib3RoIHRoZSBmaXggYW5kIHRoZSBtb3JlIGZhaXRoZnVsIGNob2ljZS5cclxuICAgKi9cclxuICBwcml2YXRlIGNvbnZlcnRUb1Bob25nTWF0ZXJpYWxzKHJvb3Q6IFRIUkVFLk9iamVjdDNEKTogdm9pZCB7XHJcbiAgICBjb25zdCBjb252ZXJ0ZWQgPSBuZXcgTWFwPGFueSwgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWw+KCk7XHJcblxyXG4gICAgcm9vdC50cmF2ZXJzZSgoY2hpbGQpID0+IHtcclxuICAgICAgY29uc3QgbWVzaCA9IGNoaWxkIGFzIFRIUkVFLk1lc2g7XHJcbiAgICAgIGlmICghKG1lc2ggYXMgYW55KS5pc01lc2gpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGNvbnZlcnQgPSAoc291cmNlOiBhbnkpOiBhbnkgPT4ge1xyXG4gICAgICAgIGlmICghc291cmNlIHx8ICEoc291cmNlIGFzIGFueSkuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCkge1xyXG4gICAgICAgICAgcmV0dXJuIHNvdXJjZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjb252ZXJ0ZWQuaGFzKHNvdXJjZSkpIHtcclxuICAgICAgICAgIGNvbnN0IHBob25nID0gbmV3IFRIUkVFLk1lc2hQaG9uZ01hdGVyaWFsKHtcclxuICAgICAgICAgICAgbWFwOiBzb3VyY2UubWFwLFxyXG4gICAgICAgICAgICBjb2xvcjogc291cmNlLmNvbG9yLFxyXG4gICAgICAgICAgICB0cmFuc3BhcmVudDogc291cmNlLnRyYW5zcGFyZW50LFxyXG4gICAgICAgICAgICBvcGFjaXR5OiBzb3VyY2Uub3BhY2l0eSxcclxuICAgICAgICAgICAgYWxwaGFUZXN0OiBzb3VyY2UuYWxwaGFUZXN0LFxyXG4gICAgICAgICAgICBzaWRlOiBzb3VyY2Uuc2lkZSxcclxuICAgICAgICAgICAgc3BlY3VsYXI6IG5ldyBUSFJFRS5Db2xvcigweDAwMDAwMCksXHJcbiAgICAgICAgICAgIHNoaW5pbmVzczogMCxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgcGhvbmcubmFtZSA9IHNvdXJjZS5uYW1lO1xyXG4gICAgICAgICAgY29udmVydGVkLnNldChzb3VyY2UsIHBob25nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRlZC5nZXQoc291cmNlKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIG1lc2gubWF0ZXJpYWwgPSBBcnJheS5pc0FycmF5KG1lc2gubWF0ZXJpYWwpXHJcbiAgICAgICAgPyBtZXNoLm1hdGVyaWFsLm1hcChjb252ZXJ0KVxyXG4gICAgICAgIDogY29udmVydChtZXNoLm1hdGVyaWFsKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVuZGVycyBldmVyeSBtYXRlcmlhbCBkb3VibGUtc2lkZWQuXHJcbiAgICpcclxuICAgKiBSZWFsaXR5IGNhcHR1cmUgbWVzaGVzIHJvdXRpbmVseSBjb250YWluIHRyaWFuZ2xlcyB3aXRoIHJldmVyc2VkIHdpbmRpbmcgLSBhbiBhcnRlZmFjdCBvZiB0aGVcclxuICAgKiByZWNvbnN0cnVjdGlvbiwgbm90IG9mIHRoZSBmaWxlLiBXaXRoIHRoZSBkZWZhdWx0IEZyb250U2lkZSB0aG9zZSB0cmlhbmdsZXMgYXJlIGN1bGxlZCwgbGVhdmluZ1xyXG4gICAqIHNjYXR0ZXJlZCBob2xlcyB0aGF0IHNob3cgdGhlIHNjZW5lIGJhY2tncm91bmQgdGhyb3VnaCB0aGUgbW9kZWwuIEFnYWluc3QgYSBsaWdodCBiYWNrZ3JvdW5kXHJcbiAgICogdGhleSByZWFkIGFzIHdoaXRlIHNwZWNrcyB3aXRoIG5vIGRpc2Nlcm5pYmxlIHBhdHRlcm4uXHJcbiAgICpcclxuICAgKiBEcmF3aW5nIGJvdGggc2lkZXMgY29zdHMgYSBsaXR0bGUgZmlsbCByYXRlIGJ1dCBpcyB3aGF0IG1ha2VzIGNhcHR1cmVkIGdlb21ldHJ5IHJlbmRlciBhc1xyXG4gICAqIHNvbGlkOyBvdGhlciB2aWV3ZXJzIG9mIHRoaXMga2luZCBvZiBjb250ZW50IGRvIHRoZSBzYW1lIHVuY29uZGl0aW9uYWxseS5cclxuICAgKi9cclxuICBwcml2YXRlIGZvcmNlRG91YmxlU2lkZWRNYXRlcmlhbHMocm9vdDogVEhSRUUuT2JqZWN0M0QpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PGFueT4oKTtcclxuICAgIHJvb3QudHJhdmVyc2UoKGNoaWxkKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1lc2ggPSBjaGlsZCBhcyBUSFJFRS5NZXNoO1xyXG4gICAgICBpZiAoIShtZXNoIGFzIGFueSkuaXNNZXNoKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IG1hdGVyaWFscyA9IEFycmF5LmlzQXJyYXkobWVzaC5tYXRlcmlhbCkgPyBtZXNoLm1hdGVyaWFsIDogW21lc2gubWF0ZXJpYWxdO1xyXG4gICAgICBtYXRlcmlhbHMuZm9yRWFjaCgobWF0ZXJpYWw6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChtYXRlcmlhbCAmJiAhc2Vlbi5oYXMobWF0ZXJpYWwpKSB7XHJcbiAgICAgICAgICBzZWVuLmFkZChtYXRlcmlhbCk7XHJcbiAgICAgICAgICBtYXRlcmlhbC5zaWRlID0gVEhSRUUuRG91YmxlU2lkZTtcclxuICAgICAgICAgIG1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb21wdXRlcyByZWFsIHZlcnRleCBub3JtYWxzIGZvciBhbnkgZ2VvbWV0cnkgdGhhdCBhcnJpdmVkIHdpdGhvdXQgdGhlbS5cclxuICAgKlxyXG4gICAqIEEgZ2xURiB3aXRob3V0IGEgTk9STUFMIGF0dHJpYnV0ZSBpcyBzcGVjLWNvbXBsaWFudCwgYW5kIEdMVEZMb2FkZXIgaGFuZGxlcyBpdCBieSBzd2l0Y2hpbmcgdGhlXHJcbiAgICogbWF0ZXJpYWwgdG8gZmxhdFNoYWRpbmcsIHdoaWNoIG1ha2VzIHRoZSBzaGFkZXIgZGVyaXZlIHRoZSBub3JtYWwgcGVyIHBpeGVsIGZyb20gc2NyZWVuLXNwYWNlXHJcbiAgICogZGVyaXZhdGl2ZXMuIFRoYXQgZGVyaXZhdGlvbiBjb2xsYXBzZXMgb24gdGhlIGRlZ2VuZXJhdGUsIG5lZWRsZS10aGluIHRyaWFuZ2xlcyB0aGF0IHJlYWxpdHlcclxuICAgKiBjYXB0dXJlIG1lc2hlcyBhcmUgZnVsbCBvZjogdGhlIGZhY2UgaGFzIGFsbW9zdCBubyBhcmVhLCB0aGUgZGVyaXZlZCBub3JtYWwgaXMgbWVhbmluZ2xlc3MsIGFuZFxyXG4gICAqIGxpZ2h0aW5nIGJsb3dzIHRob3NlIGZyYWdtZW50cyBvdXQgdG8gd2hpdGUgc3BlY2tzIC0gZGVuc2VzdCBleGFjdGx5IHdoZXJlIGZpbmUgZGV0YWlsIGlzLlxyXG4gICAqXHJcbiAgICogQ29tcHV0aW5nIG5vcm1hbHMgZnJvbSB0aGUgZ2VvbWV0cnkgaW5zdGVhZCBpcyByb2J1c3QgdG8gdGhvc2UgdHJpYW5nbGVzLCBzaW5jZSBhIGRlZ2VuZXJhdGVcclxuICAgKiBmYWNlIGNvbnRyaWJ1dGVzIGFsbW9zdCBub3RoaW5nIHRvIHRoZSBhdmVyYWdlIGFuZCBpdHMgbmVpZ2hib3VycyBkb21pbmF0ZS5cclxuICAgKi9cclxuICBwcml2YXRlIGVuc3VyZVZlcnRleE5vcm1hbHMocm9vdDogVEhSRUUuT2JqZWN0M0QpOiB2b2lkIHtcclxuICAgIHJvb3QudHJhdmVyc2UoKGNoaWxkKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1lc2ggPSBjaGlsZCBhcyBUSFJFRS5NZXNoO1xyXG4gICAgICBpZiAoIShtZXNoIGFzIGFueSkuaXNNZXNoKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGdlb21ldHJ5ID0gbWVzaC5nZW9tZXRyeSBhcyBUSFJFRS5CdWZmZXJHZW9tZXRyeTtcclxuICAgICAgaWYgKGdlb21ldHJ5LmdldEF0dHJpYnV0ZSgnbm9ybWFsJykpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGdlb21ldHJ5LmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7XHJcblxyXG4gICAgICAvLyBHTFRGTG9hZGVyIGFscmVhZHkgc3dpdGNoZWQgdGhlc2UgbWF0ZXJpYWxzIHRvIGZsYXRTaGFkaW5nIGJlY2F1c2Ugbm9ybWFscyB3ZXJlIG1pc3Npbmc7XHJcbiAgICAgIC8vIG5vdyB0aGF0IHJlYWwgb25lcyBleGlzdCwgbGV0IHRoZW0gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBkZXJpdmF0aXZlIGZhbGxiYWNrLlxyXG4gICAgICBjb25zdCBtYXRlcmlhbHMgPSBBcnJheS5pc0FycmF5KG1lc2gubWF0ZXJpYWwpID8gbWVzaC5tYXRlcmlhbCA6IFttZXNoLm1hdGVyaWFsXTtcclxuICAgICAgbWF0ZXJpYWxzLmZvckVhY2goKG1hdGVyaWFsOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAobWF0ZXJpYWwgJiYgbWF0ZXJpYWwuZmxhdFNoYWRpbmcpIHtcclxuICAgICAgICAgIG1hdGVyaWFsLmZsYXRTaGFkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICBtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29uZmlndXJlcyBob3cgZXZlcnkgdGV4dHVyZSBpbiBhIG1vZGVsIGlzIHNhbXBsZWQ6IG1heGltdW0gYW5pc290cm9weSwgYW5kIG5vIG1pcG1hcHBpbmcuXHJcbiAgICpcclxuICAgKiBQaG90b2dyYW1tZXRyeSBhdGxhc2VzIHBhY2sgdGhlaXIgVVYgaXNsYW5kcyB3aXRoIHVudXNlZCBndXR0ZXIgcGl4ZWxzIGJldHdlZW4gdGhlbS4gTWlwbWFwcGluZ1xyXG4gICAqIGF2ZXJhZ2VzIG5laWdoYm91cmluZyBwaXhlbHMgYXQgZWFjaCBsZXZlbCwgc28gdGhvc2UgZ3V0dGVycyBibGVlZCBmdXJ0aGVyIGludG8gdGhlIGlzbGFuZHMgdGhlXHJcbiAgICogc21hbGxlciB0aGUgbGV2ZWwgZ2V0cyAtIGFuZCB2aWV3aW5nIHRoZSB3aG9sZSBtb2RlbCBhdCBvbmNlIHVzZXMgdGhlIHNtYWxsZXN0IGxldmVscywgcGFpbnRpbmdcclxuICAgKiBicmlnaHQgZ3V0dGVyIHBpeGVscyBvdmVyIHRoZSBlZGdlcyBvZiBmaW5lIGRldGFpbC4gU2FtcGxpbmcgdGhlIGZ1bGwtcmVzb2x1dGlvbiBpbWFnZSBhdm9pZHNcclxuICAgKiB0aGF0LCBhdCB0aGUgY29zdCBvZiBzb21lIHNoaW1tZXIgb24gbWluaWZpZWQgc3VyZmFjZXMuXHJcbiAgICpcclxuICAgKiBOb3RlIHRoYXQgYW5pc290cm9weSBvbmx5IHRha2VzIGVmZmVjdCB3aGlsZSBtaXBtYXBwaW5nIGlzIG9uLCBzbyB3aXRoIHRoZSBzZXR0aW5ncyBiZWxvdyBpdCBpc1xyXG4gICAqIGluZXJ0OyBpdCBpcyBzZXQgYW55d2F5IHNvIHRoZSBzYW1wbGluZyBzdGF5cyBjb3JyZWN0IGZvciBhbnlvbmUgd2hvIHJlLWVuYWJsZXMgbWlwbWFwcyBoZXJlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgdHVuZVRleHR1cmVTYW1wbGluZyhyb290OiBUSFJFRS5PYmplY3QzRCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnJlbmRlcmVyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IG1heEFuaXNvdHJvcHkgPSB0aGlzLnJlbmRlcmVyLmNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCk7XHJcbiAgICBpZiAoIW1heEFuaXNvdHJvcHkgfHwgbWF4QW5pc290cm9weSA8PSAxKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxhbnk+KCk7XHJcbiAgICByb290LnRyYXZlcnNlKChjaGlsZCkgPT4ge1xyXG4gICAgICBjb25zdCBtZXNoID0gY2hpbGQgYXMgVEhSRUUuTWVzaDtcclxuICAgICAgaWYgKCEobWVzaCBhcyBhbnkpLmlzTWVzaCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBtYXRlcmlhbHMgPSBBcnJheS5pc0FycmF5KG1lc2gubWF0ZXJpYWwpID8gbWVzaC5tYXRlcmlhbCA6IFttZXNoLm1hdGVyaWFsXTtcclxuICAgICAgbWF0ZXJpYWxzLmZvckVhY2goKG1hdGVyaWFsOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoIW1hdGVyaWFsKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFNhbWUgdGV4dHVyZSBpcyByZXVzZWQgYWNyb3NzIHRoZSBtb2RlbCdzIG1hdGVyaWFsczsgb25seSB0b3VjaCBlYWNoIG9uZSBvbmNlLlxyXG4gICAgICAgIFsnbWFwJywgJ25vcm1hbE1hcCcsICdyb3VnaG5lc3NNYXAnLCAnbWV0YWxuZXNzTWFwJywgJ2VtaXNzaXZlTWFwJywgJ2FvTWFwJ10uZm9yRWFjaCgoc2xvdCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdGV4dHVyZSA9IG1hdGVyaWFsW3Nsb3RdO1xyXG4gICAgICAgICAgaWYgKHRleHR1cmUgJiYgIXNlZW4uaGFzKHRleHR1cmUpKSB7XHJcbiAgICAgICAgICAgIHNlZW4uYWRkKHRleHR1cmUpO1xyXG4gICAgICAgICAgICB0ZXh0dXJlLmFuaXNvdHJvcHkgPSBtYXhBbmlzb3Ryb3B5O1xyXG4gICAgICAgICAgICB0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0ZXh0dXJlLm1pbkZpbHRlciA9IFRIUkVFLkxpbmVhckZpbHRlcjtcclxuICAgICAgICAgICAgdGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMb2FkcyBhbiBPQkogbW9kZWwgd2l0aCBNVEwuXHJcbiAgICogVGhlIGhlYXZ5IHRleHQtcGFyc2luZyBzdGVwIHJ1bnMgaW4gYSBXZWIgV29ya2VyIHdoZW4gb25lIGhhcyBiZWVuIHJlZ2lzdGVyZWQgdmlhXHJcbiAgICogc2V0T2JqUGFyc2VyV29ya2VyIChzZWUgdGhlcmUgZm9yIHdoeSB0aGUgYXBwLCBub3QgdGhpcyBsaWJyYXJ5LCBwcm92aWRlcyBpdCk7IHRoaXMga2VlcHNcclxuICAgKiB0aGUgbWFpbiB0aHJlYWQgZnJlZSB3aGlsZSBsYXJnZSBhcmNoaXRlY3R1cmUgbW9kZWxzIChtaWxsaW9ucyBvZiB2ZXJ0aWNlcykgYXJlIHBhcnNlZC5cclxuICAgKiBGYWxscyBiYWNrIHRvIHBhcnNpbmcgb24gdGhlIG1haW4gdGhyZWFkIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBsb2FkT2JqTW9kZWwobXRsVXJsOiBzdHJpbmcsIG9ialVybDogc3RyaW5nLCBjYW1lcmFQb3NpdGlvbj86IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSwgcm90YXRpb24/OiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0pOiB2b2lkIHtcclxuICAgIGNvbnN0IG10bExvYWRlciA9IG5ldyBNVExMb2FkZXIoKTtcclxuICAgIGNvbnN0IGJhc2VQYXRoID0gbXRsVXJsLnN1YnN0cmluZygwLCBtdGxVcmwubGFzdEluZGV4T2YoJy8nKSArIDEpO1xyXG4gICAgbXRsTG9hZGVyLnNldFBhdGgoYmFzZVBhdGgpO1xyXG4gICAgY29uc3QgbXRsRmlsZU5hbWUgPSBtdGxVcmwuc3Vic3RyaW5nKG10bFVybC5sYXN0SW5kZXhPZignLycpICsgMSk7XHJcblxyXG4gICAgdGhpcy5tb2RlbExvYWRpbmckLm5leHQodHJ1ZSk7XHJcblxyXG4gICAgbXRsTG9hZGVyLmxvYWQobXRsRmlsZU5hbWUsIChtYXRlcmlhbHMpID0+IHtcclxuICAgICAgbWF0ZXJpYWxzLnByZWxvYWQoKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLm9ialBhcnNlcldvcmtlcikge1xyXG4gICAgICAgIHRoaXMucmVxdWVzdE9ialBhcnNlSW5Xb3JrZXIob2JqVXJsKVxyXG4gICAgICAgICAgLnRoZW4oKG1lc2hlcykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBncm91cCA9IG5ldyBUSFJFRS5Hcm91cCgpO1xyXG4gICAgICAgICAgICBtZXNoZXMuZm9yRWFjaCgobWVzaERhdGEpID0+IHtcclxuICAgICAgICAgICAgICBncm91cC5hZGQodGhpcy5tZXNoRnJvbVBhcnNlZERhdGEobWVzaERhdGEsIG1hdGVyaWFscykpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5wbGFjZUxvYWRlZE9iamVjdEluU2NlbmUoZ3JvdXAsIGNhbWVyYVBvc2l0aW9uLCByb3RhdGlvbik7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIE9CSiBtb2RlbCBpbiB3b3JrZXI6JywgZXJyb3IpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIC5maW5hbGx5KCgpID0+IHRoaXMubW9kZWxMb2FkaW5nJC5uZXh0KGZhbHNlKSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBvYmpMb2FkZXIgPSBuZXcgT0JKTG9hZGVyKCk7XHJcbiAgICAgIG9iakxvYWRlci5zZXRNYXRlcmlhbHMobWF0ZXJpYWxzKTtcclxuXHJcbiAgICAgIG9iakxvYWRlci5sb2FkKG9ialVybCwgKG9iamVjdCkgPT4ge1xyXG4gICAgICAgIHRoaXMucGxhY2VMb2FkZWRPYmplY3RJblNjZW5lKG9iamVjdCwgY2FtZXJhUG9zaXRpb24sIHJvdGF0aW9uKTtcclxuICAgICAgICB0aGlzLm1vZGVsTG9hZGluZyQubmV4dChmYWxzZSk7XHJcbiAgICAgIH0sIHVuZGVmaW5lZCwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBPQkogbW9kZWw6JywgZXJyb3IpO1xyXG4gICAgICAgIHRoaXMubW9kZWxMb2FkaW5nJC5uZXh0KGZhbHNlKTtcclxuICAgICAgfSk7XHJcbiAgICB9LCB1bmRlZmluZWQsIChlcnJvcikgPT4ge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIE1UTCBmaWxlOicsIGVycm9yKTtcclxuICAgICAgdGhpcy5tb2RlbExvYWRpbmckLm5leHQoZmFsc2UpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogQ2VudGVycywgc2NhbGVzIGFuZCBhZGRzIGEgbG9hZGVkIG9iamVjdCB0byB0aGUgc2NlbmUsIHRoZW4gZnJhbWVzIHRoZSBjYW1lcmEgb24gaXQuICovXHJcbiAgcHJpdmF0ZSBwbGFjZUxvYWRlZE9iamVjdEluU2NlbmUob2JqZWN0OiBUSFJFRS5PYmplY3QzRCwgY2FtZXJhUG9zaXRpb24/OiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0sIHJvdGF0aW9uPzoge3g6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXJ9KTogdm9pZCB7XHJcbiAgICBjb25zdCBib3ggPSBuZXcgVEhSRUUuQm94MygpLnNldEZyb21PYmplY3Qob2JqZWN0KTtcclxuICAgIGNvbnN0IGNlbnRlciA9IGJveC5nZXRDZW50ZXIobmV3IFRIUkVFLlZlY3RvcjMoKSk7XHJcbiAgICBjb25zdCBzaXplID0gYm94LmdldFNpemUobmV3IFRIUkVFLlZlY3RvcjMoKSk7XHJcbiAgICBjb25zdCBtYXhEaW0gPSBNYXRoLm1heChzaXplLngsIHNpemUueSwgc2l6ZS56KTtcclxuICAgIGNvbnN0IHNjYWxlID0gbWF4RGltID4gMCA/IDEwIC8gbWF4RGltIDogMTtcclxuXHJcbiAgICAvLyBUd28gbmVzdGVkIGdyb3VwcyBzbyB0YWdzIGNhbiBzaGFyZSB0aGUgbW9kZWwncyBmcmFtZTogYGNlbnRlcmVkYCBjYXJyaWVzIHRoZSBvZmZzZXQgdGhhdFxyXG4gICAgLy8gbW92ZXMgdGhlIG1vZGVsJ3Mgb3duIG9yaWdpbiB0byB0aGUgc2NlbmUgb3JpZ2luLCBgZ3JvdXBgIGNhcnJpZXMgdGhlIHNjYWxlLiBBIHRhZyBwb3NpdGlvbmVkXHJcbiAgICAvLyB3aXRoIHJhdyBQT0kgY29vcmRpbmF0ZXMgdGhlbiBsYW5kcyBpbiB0aGUgc2FtZSBwbGFjZSB0aGUgbW9kZWwncyBnZW9tZXRyeSBkb2VzLlxyXG4gICAgY29uc3QgZ3JvdXAgPSBuZXcgVEhSRUUuR3JvdXAoKTtcclxuICAgIGNvbnN0IGNlbnRlcmVkID0gbmV3IFRIUkVFLkdyb3VwKCk7XHJcbiAgICBjZW50ZXJlZC5wb3NpdGlvbi5zdWIoY2VudGVyKTtcclxuXHJcbiAgICBpZiAocm90YXRpb24pIHtcclxuICAgICAgb2JqZWN0LnJvdGF0aW9uLnNldChyb3RhdGlvbi54LCByb3RhdGlvbi55LCByb3RhdGlvbi56KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm1vZGVsUm9vdCA9IG9iamVjdDtcclxuICAgIC8vIE1hcmtzIHRoZSBtb2RlbCBmb3IgdGhlIGRlcHRoIHBpY2ssIHdoaWNoIHJlbmRlcnMgdGhpcyBsYXllciBhbG9uZSAtIHNvIHRhZ3MgYW5kIHRoZSBnaG9zdFxyXG4gICAgLy8gaXRzZWxmIGNhbm5vdCBlbmQgdXAgYmVpbmcgd2hhdCB0aGUgY3Vyc29yIHJlcG9ydHMgYXMgdGhlIHN1cmZhY2UgdW5kZXIgaXQuXHJcbiAgICBvYmplY3QudHJhdmVyc2UoKGNoaWxkKSA9PiBjaGlsZC5sYXllcnMuZW5hYmxlKFRocmVlSnNTZXJ2aWNlLlBJQ0tfTEFZRVIpKTtcclxuICAgIGNlbnRlcmVkLmFkZChvYmplY3QpO1xyXG4gICAgY2VudGVyZWQuYWRkKHRoaXMudGFnR3JvdXApO1xyXG4gICAgZ3JvdXAuYWRkKGNlbnRlcmVkKTtcclxuICAgIGdyb3VwLnNjYWxlLnNldFNjYWxhcihzY2FsZSk7XHJcblxyXG4gICAgdGhpcy5zY2VuZS5hZGQoZ3JvdXApO1xyXG5cclxuICAgIC8vIFRhZ3MgcmVnaXN0ZXJlZCBiZWZvcmUgdGhlIG1vZGVsIGZpbmlzaGVkIGxvYWRpbmcgd2VyZSBzaXplZCBhZ2FpbnN0IHRoZSBvbGQgc2NhbGUuXHJcbiAgICB0aGlzLnRhZ1Nwcml0ZXMuZm9yRWFjaCgoc3ByaXRlKSA9PiB0aGlzLnNjYWxlVGFnRm9yTW9kZWwoc3ByaXRlKSk7XHJcblxyXG4gICAgdGhpcy5hZGp1c3RDbGlwcGluZ1BsYW5lcygoc2l6ZS5sZW5ndGgoKSAvIDIpICogc2NhbGUpO1xyXG5cclxuICAgIGlmIChjYW1lcmFQb3NpdGlvbikge1xyXG4gICAgICB0aGlzLmNhbWVyYS5wb3NpdGlvbi5zZXQoY2FtZXJhUG9zaXRpb24ueCwgY2FtZXJhUG9zaXRpb24ueSwgY2FtZXJhUG9zaXRpb24ueik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNhbWVyYS5wb3NpdGlvbi5zZXQoMCwgNSwgMTUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb250cm9scy50YXJnZXQuc2V0KDAsIDAsIDApO1xyXG4gICAgdGhpcy5jb250cm9scy51cGRhdGUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEtlZXBzIHRoZSBkcmF3aW5nIGJ1ZmZlciBhbmQgY2FtZXJhIG1hdGNoZWQgdG8gdGhlIGNhbnZhcyBhcyBpdCBpcyByZXNpemVkLlxyXG4gICAqXHJcbiAgICogcmVuZGVyZXIuc2V0U2l6ZSgpIHdyaXRlcyBleHBsaWNpdCBwaXhlbCB3aWR0aC9oZWlnaHQgaW50byB0aGUgY2FudmFzJ3Mgc3R5bGUsIG92ZXJyaWRpbmcgdGhlXHJcbiAgICogMTAwJS8xMDAlIGl0IHN0YXJ0cyB3aXRoLiBXaXRob3V0IHRoaXMsIHRoZSBjYW52YXMga2VlcHMgd2hhdGV2ZXIgc2l6ZSBpdCBoYWQgYXQgc3RhcnR1cDogaGlkaW5nXHJcbiAgICogdGhlIHRvcCBtZW51IGdyb3dzIHRoZSBjb250YWluZXIsIHRoZSBjYW52YXMgZG9lcyBub3QgZm9sbG93LCBhbmQgdGhlIHN0cmlwIHRoYXQgb3BlbnMgdXAgc2hvd3NcclxuICAgKiB0aGUgcGFnZSBiZWhpbmQgaXQgaW5zdGVhZCBvZiB0aGUgc2NlbmUuXHJcbiAgICpcclxuICAgKiBUaGUgcGFyZW50IGlzIG9ic2VydmVkIHJhdGhlciB0aGFuIHRoZSBjYW52YXMsIGJlY2F1c2UgcmVzaXppbmcgdGhlIGNhbnZhcyBpcyB3aGF0IHRoaXMgcmVhY3RzXHJcbiAgICogdG8gLSB3YXRjaGluZyB0aGUgZWxlbWVudCB3ZSByZXNpemUgd291bGQgcmV0cmlnZ2VyIHRoZSBvYnNlcnZlci5cclxuICAgKi9cclxuICBwcml2YXRlIG9ic2VydmVDYW52YXNSZXNpemUoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgY29udGFpbmVyID0gY2FudmFzLnBhcmVudEVsZW1lbnQ7XHJcbiAgICBpZiAoIWNvbnRhaW5lciB8fCB0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNhbnZhc1Jlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcclxuICAgICAgY29uc3Qgd2lkdGggPSBjb250YWluZXIuY2xpZW50V2lkdGg7XHJcbiAgICAgIGNvbnN0IGhlaWdodCA9IGNvbnRhaW5lci5jbGllbnRIZWlnaHQ7XHJcbiAgICAgIGlmICh3aWR0aCA9PT0gMCB8fCBoZWlnaHQgPT09IDApIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jYW1lcmEuYXNwZWN0ID0gd2lkdGggLyBoZWlnaHQ7XHJcbiAgICAgIHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNhbnZhc1Jlc2l6ZU9ic2VydmVyLm9ic2VydmUoY29udGFpbmVyKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0YXJ0cyB0aGUgYWxpZ25tZW50IHdhbGt0aHJvdWdoOiBwaWNrIGEgdGFnLCB0aGVuIGNsaWNrIHdoZXJlIGl0IHJlYWxseSBpcywgdGhyZWUgdGltZXMuXHJcbiAgICpcclxuICAgKiBFeGlzdGluZyB0YWdzIGFyZSB0aGUgY29ycmVzcG9uZGVuY2VzIC0gdGhleSBhbHJlYWR5IGNhcnJ5IHRoZSBzdG9yZWQgY29vcmRpbmF0ZSwgc28gdGhlIHBlcnNvblxyXG4gICAqIG9ubHkgaGFzIHRvIHN1cHBseSB0aGUgbWF0Y2hpbmcgc3BvdCBvbiB0aGUgbW9kZWwuIE5vIG5ldyByZWNvcmRzIGFyZSB3cml0dGVuOyBub3RoaW5nIGlzXHJcbiAgICogYXBwbGllZCB1bnRpbCBzb2x2ZUFsaWdubWVudEZyb21QYWlycygpIHN1Y2NlZWRzLlxyXG4gICAqL1xyXG4gIHN0YXJ0VGFnQWxpZ25tZW50KCk6IHZvaWQge1xyXG4gICAgdGhpcy5hbGlnbmluZyA9IHRydWU7XHJcbiAgICB0aGlzLmFsaWdubWVudFBhaXJzID0gW107XHJcbiAgICB0aGlzLmFsaWdubWVudFNvdXJjZSA9IG51bGw7XHJcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2Nyb3NzaGFpcic7XHJcbiAgICB9XHJcbiAgICB0aGlzLmFsaWdubWVudFByb2dyZXNzJC5uZXh0KHsgcGFpcnM6IDAsIGF3YWl0aW5nOiAndGFnJyB9KTtcclxuICB9XHJcblxyXG4gIGNhbmNlbFRhZ0FsaWdubWVudCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHdhc0FsaWduaW5nID0gdGhpcy5hbGlnbmluZztcclxuICAgIHRoaXMuYWxpZ25pbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuYWxpZ25tZW50UGFpcnMgPSBbXTtcclxuICAgIHRoaXMuYWxpZ25tZW50U291cmNlID0gbnVsbDtcclxuICAgIHRoaXMucGVuZGluZ1ByZXZpZXdFdmVudCA9IG51bGw7XHJcbiAgICB0aGlzLnJlbW92ZVBsYWNlbWVudFByZXZpZXcoKTtcclxuICAgIGlmICh0aGlzLnJlbmRlcmVyKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XHJcbiAgICB9XHJcbiAgICB0aGlzLmFsaWdubWVudFByb2dyZXNzJC5uZXh0KHsgcGFpcnM6IDAsIGF3YWl0aW5nOiBudWxsIH0pO1xyXG4gICAgaWYgKHdhc0FsaWduaW5nKSB7XHJcbiAgICAgIHRoaXMuYWxpZ25tZW50Q2FuY2VsbGVkJC5uZXh0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc0FsaWduaW5nVGFncygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmFsaWduaW5nO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgcG9pbnRlciBzaG91bGQgYmUgc2hvd2luZyB0aGUgcGxhY2VtZW50IGdob3N0LlxyXG4gICAqXHJcbiAgICogVHJ1ZSB3aGlsZSBwbGFjaW5nIGEgdGFnLCBhbmQgd2hpbGUgY2FsaWJyYXRpbmcgb25jZSBhIHRhZyBoYXMgYmVlbiBwaWNrZWQgLSB0aGF0IHNlY29uZCBjbGlja1xyXG4gICAqIGlzIHRoZSBzYW1lIHF1ZXN0aW9uIChcIndoZXJlIG9uIHRoZSBtb2RlbD9cIikgYW5kIGRlc2VydmVzIHRoZSBzYW1lIGFpbWluZyBhaWQuIE5vdCB0cnVlIGZvciB0aGVcclxuICAgKiBmaXJzdCBoYWxmIG9mIGEgcGFpciwgd2hpY2ggaXMgYSBjbGljayBvbiBhIHRhZywgbm90IG9uIHRoZSBtb2RlbC5cclxuICAgKi9cclxuICBwcml2YXRlIGlzUHJldmlld2luZ1BsYWNlbWVudCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnBsYWNpbmdUYWcgfHwgKHRoaXMuYWxpZ25pbmcgJiYgISF0aGlzLmFsaWdubWVudFNvdXJjZSk7XHJcbiAgfVxyXG5cclxuICAvKiogV2hldGhlciBhIHRhZyBpcyBjdXJyZW50bHkgcmVnaXN0ZXJlZCBmb3IgdGhpcyBlbGVtZW50LiAqL1xyXG4gIGhhc1RhZyhlbGVtZW50SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMudGFnU3ByaXRlcy5oYXMoZWxlbWVudElkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNvbHZlcyBhbmQgYXBwbGllcyB0aGUgYWxpZ25tZW50IGNvbGxlY3RlZCBzbyBmYXIsIHJldHVybmluZyBpdCBzbyB0aGUgY2FsbGVyIGNhbiBwZXJzaXN0IGl0LlxyXG4gICAqXHJcbiAgICogUmV0dXJucyBudWxsIHdoZW4gdGhlIHRocmVlIHRhZ3MgdHVybiBvdXQgdG8gYmUgY29sbGluZWFyLCBpbiB3aGljaCBjYXNlIG5vdGhpbmcgaXMgYXBwbGllZCBhbmRcclxuICAgKiB0aGUgd2Fsa3Rocm91Z2ggc3RheXMgb3BlbiBmb3IgdGhlIHBlcnNvbiB0byBwaWNrIGEgYmV0dGVyIHRoaXJkIHBvaW50LlxyXG4gICAqL1xyXG4gIHNvbHZlQWxpZ25tZW50RnJvbVBhaXJzKCk6IFRocmVlSnNBbGlnbm1lbnQgfCBudWxsIHtcclxuICAgIGNvbnN0IGFsaWdubWVudCA9IHNvbHZlVGhyZWVKc0FsaWdubWVudCh0aGlzLmFsaWdubWVudFBhaXJzKTtcclxuICAgIGlmICghYWxpZ25tZW50KSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZXRUYWdBbGlnbm1lbnQoYWxpZ25tZW50KTtcclxuICAgIHRoaXMuYWxpZ25pbmcgPSBmYWxzZTtcclxuICAgIHRoaXMucGVuZGluZ1ByZXZpZXdFdmVudCA9IG51bGw7XHJcbiAgICB0aGlzLnJlbW92ZVBsYWNlbWVudFByZXZpZXcoKTtcclxuICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XHJcbiAgICB0aGlzLmFsaWdubWVudFByb2dyZXNzJC5uZXh0KHsgcGFpcnM6IHRoaXMuYWxpZ25tZW50UGFpcnMubGVuZ3RoLCBhd2FpdGluZzogbnVsbCB9KTtcclxuICAgIHJldHVybiBhbGlnbm1lbnQ7XHJcbiAgfVxyXG5cclxuICAvKiogSGFuZGxlcyBhIGNsaWNrIHdoaWxlIHRoZSBhbGlnbm1lbnQgd2Fsa3Rocm91Z2ggaXMgcnVubmluZy4gKi9cclxuICBwcml2YXRlIGhhbmRsZUFsaWdubWVudENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuYWxpZ25tZW50U291cmNlKSB7XHJcbiAgICAgIC8vIEZpcnN0IGhhbGYgb2YgYSBwYWlyOiB3aGljaCB0YWcgYXJlIHdlIHRhbGtpbmcgYWJvdXQ/XHJcbiAgICAgIGNvbnN0IGhpdCA9IHRoaXMucmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdHModGhpcy50YWdHcm91cC5jaGlsZHJlbiwgZmFsc2UpWzBdO1xyXG4gICAgICBpZiAoIWhpdCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICAvLyBUaGUgc3ByaXRlJ3Mgb3duIHBvc2l0aW9uIGlzIHRoZSBzdG9yZWQgY29vcmRpbmF0ZSwgdW50b3VjaGVkIGJ5IGFueSBhbGlnbm1lbnQgYWxyZWFkeVxyXG4gICAgICAvLyBhcHBsaWVkIC0gdGhhdCB0cmFuc2Zvcm0gbGl2ZXMgb24gdGhlIGdyb3VwLCBub3Qgb24gdGhlIHNwcml0ZS5cclxuICAgICAgY29uc3Qgc3RvcmVkID0gaGl0Lm9iamVjdC5wb3NpdGlvbjtcclxuICAgICAgdGhpcy5hbGlnbm1lbnRTb3VyY2UgPSB7IHg6IHN0b3JlZC54LCB5OiBzdG9yZWQueSwgejogc3RvcmVkLnogfTtcclxuICAgICAgdGhpcy5hbGlnbm1lbnRQcm9ncmVzcyQubmV4dCh7XHJcbiAgICAgICAgcGFpcnM6IHRoaXMuYWxpZ25tZW50UGFpcnMubGVuZ3RoLFxyXG4gICAgICAgIGF3YWl0aW5nOiAncG9pbnQnLFxyXG4gICAgICAgIHRhZ0lkOiBoaXQub2JqZWN0Lm5hbWUsXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2Vjb25kIGhhbGY6IHdoZXJlIHRoYXQgdGFnIGFjdHVhbGx5IGJlbG9uZ3Mgb24gdGhlIG1vZGVsLlxyXG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5waWNrQWxpZ25tZW50VGFyZ2V0KGV2ZW50KTtcclxuICAgIGlmICghdGFyZ2V0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuYWxpZ25tZW50UGFpcnMucHVzaCh7IHNvdXJjZTogdGhpcy5hbGlnbm1lbnRTb3VyY2UsIHRhcmdldCB9KTtcclxuICAgIHRoaXMuYWxpZ25tZW50U291cmNlID0gbnVsbDtcclxuICAgIC8vIFRoZSBnaG9zdCBiZWxvbmdzIHRvIHRoZSBjbGljayB0aGF0IGp1c3QgaGFwcGVuZWQ7IHRoZSBuZXh0IGhhbGYgaXMgYSBjbGljayBvbiBhIHRhZy5cclxuICAgIHRoaXMucGVuZGluZ1ByZXZpZXdFdmVudCA9IG51bGw7XHJcbiAgICB0aGlzLnJlbW92ZVBsYWNlbWVudFByZXZpZXcoKTtcclxuICAgIHRoaXMuYWxpZ25tZW50UHJvZ3Jlc3MkLm5leHQoe1xyXG4gICAgICBwYWlyczogdGhpcy5hbGlnbm1lbnRQYWlycy5sZW5ndGgsXHJcbiAgICAgIGF3YWl0aW5nOiB0aGlzLmFsaWdubWVudFBhaXJzLmxlbmd0aCA+PSAzID8gbnVsbCA6ICd0YWcnLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogQXJtcyB0YWcgcGxhY2VtZW50OiB0aGUgbmV4dCBjbGljayBvbiB0aGUgbW9kZWwgZHJvcHMgYSB0YWcgaW5zdGVhZCBvZiBiZWluZyBpZ25vcmVkLiAqL1xyXG4gIHN0YXJ0VGFnUGxhY2VtZW50KHBvaVR5cGU6IFBvaVR5cGUgfCBudWxsID0gbnVsbCk6IHZvaWQge1xyXG4gICAgdGhpcy5wbGFjaW5nVGFnID0gdHJ1ZTtcclxuICAgIHRoaXMucGxhY2VtZW50UG9pVHlwZSA9IHBvaVR5cGU7XHJcbiAgICB0aGlzLnBlbmRpbmdUYWdQbGFjZW1lbnQgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMucmVuZGVyZXIpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdjcm9zc2hhaXInO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIExlYXZlcyBwbGFjZW1lbnQgbW9kZSB3aXRob3V0IHBsYWNpbmcgYW55dGhpbmcuICovXHJcbiAgY2FuY2VsVGFnUGxhY2VtZW50KCk6IHZvaWQge1xyXG4gICAgdGhpcy5wbGFjaW5nVGFnID0gZmFsc2U7XHJcbiAgICB0aGlzLnBlbmRpbmdUYWdQbGFjZW1lbnQgPSBudWxsO1xyXG4gICAgdGhpcy5wZW5kaW5nUHJldmlld0V2ZW50ID0gbnVsbDtcclxuICAgIHRoaXMucmVtb3ZlUGxhY2VtZW50UHJldmlldygpO1xyXG4gICAgaWYgKHRoaXMucmVuZGVyZXIpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdkZWZhdWx0JztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNob3dzIGEgdHJhbnNsdWNlbnQgdGFnIHVuZGVyIHRoZSBjdXJzb3Igd2hpbGUgcGxhY2luZywgc28gdGhlIHNwb3QgaXMgdmlzaWJsZSBiZWZvcmUgY29tbWl0aW5nLlxyXG4gICAqXHJcbiAgICogTWF0dGVycG9ydCBkb2VzIHRoaXMgd2l0aCBhIHRhZyB0aGF0IGZvbGxvd3MgdGhlIHBvaW50ZXI7IHRoZSBlcXVpdmFsZW50IGhlcmUgaXMgYSBwcmV2aWV3XHJcbiAgICogc3ByaXRlIHRoYXQgZ2V0cyByZW1vdmVkIHRoZSBtb21lbnQgdGhlIHJlYWwgdGFnIHRha2VzIGl0cyBwbGFjZS5cclxuICAgKi9cclxuICBwcml2YXRlIHVwZGF0ZVBsYWNlbWVudFByZXZpZXcoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5waWNrUG9pbnRPbkdwdShldmVudCk7XHJcbiAgICBpZiAoIXBvc2l0aW9uKSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlUGxhY2VtZW50UHJldmlldygpO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ25vdC1hbGxvd2VkJztcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnY3Jvc3NoYWlyJztcclxuICAgIGlmICghdGhpcy5wbGFjZW1lbnRQcmV2aWV3KSB7XHJcbiAgICAgIHRoaXMucGxhY2VtZW50UHJldmlldyA9IG5ldyBUSFJFRS5TcHJpdGUoXHJcbiAgICAgICAgbmV3IFRIUkVFLlNwcml0ZU1hdGVyaWFsKHtcclxuICAgICAgICAgIG1hcDogdGhpcy5jcmVhdGVUYWdUZXh0dXJlKCcjOUU5RTlFJyksXHJcbiAgICAgICAgICBkZXB0aFRlc3Q6IGZhbHNlLFxyXG4gICAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXHJcbiAgICAgICAgICBvcGFjaXR5OiAwLjYsXHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5wbGFjZW1lbnRQcmV2aWV3LnJlbmRlck9yZGVyID0gOTk5O1xyXG4gICAgICB0aGlzLnRhZ0dyb3VwLmFkZCh0aGlzLnBsYWNlbWVudFByZXZpZXcpO1xyXG4gICAgICB0aGlzLnNjYWxlVGFnRm9yTW9kZWwodGhpcy5wbGFjZW1lbnRQcmV2aWV3KTtcclxuICAgIH1cclxuICAgIHRoaXMucGxhY2VtZW50UHJldmlldy5wb3NpdGlvbi5jb3B5KHBvc2l0aW9uKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBwb2ludCB1bmRlciB0aGUgY3Vyc29yLCByZWFkIGZyb20gdGhlIGRlcHRoIGJ1ZmZlciBpbnN0ZWFkIG9mIHJheWNhc3QsIGluIHRhZyBzcGFjZS5cclxuICAgKlxyXG4gICAqIEEgcmF5Y2FzdCB3YWxrcyBldmVyeSB0cmlhbmdsZSBvZiB0aGUgbWVzaCBpdCBoaXRzOiBvbiBhIGNhcHR1cmVkIG1vZGVsIHRoYXQgaXMgbWlsbGlvbnMgb2ZcclxuICAgKiB0aGVtLCB0ZW5zIG9mIG1pbGxpc2Vjb25kcywgZXZlcnkgdGltZSB0aGUgcG9pbnRlciBtb3Zlcy4gQ29hbGVzY2luZyB0byBvbmUgcGVyIGZyYW1lIGRpZCBub3RcclxuICAgKiBoZWxwLCBiZWNhdXNlIHRoZSBjb3N0IGlzIHRoZSBwaWNrIGl0c2VsZiAtIGl0IHNpbXBseSBiZWNhbWUgb25lIHNsb3cgZnJhbWUgaW5zdGVhZCBvZiBzZXZlcmFsLlxyXG4gICAqXHJcbiAgICogUmVuZGVyaW5nIHRoZSBtb2RlbCdzIGRlcHRoIGludG8gYSBzaW5nbGUgcGl4ZWwgdW5kZXIgdGhlIGN1cnNvciBhbnN3ZXJzIHRoZSBzYW1lIHF1ZXN0aW9uIG9uXHJcbiAgICogdGhlIEdQVSBpbiBjb25zdGFudCB0aW1lLCB3aGF0ZXZlciB0aGUgbW9kZWwncyBzaXplLiBUaGUgY2FtZXJhJ3MgdmlldyBvZmZzZXQgaXMgd2hhdCBuYXJyb3dzXHJcbiAgICogdGhlIHdob2xlIGltYWdlIGRvd24gdG8gdGhhdCBvbmUgcGl4ZWwsIHNvIHRoZSB2YWx1ZSByZWFkIGJhY2sgaXMgdGhlIGRlcHRoIHRoZSBjdXJzb3IgaXMgb3Zlci5cclxuICAgKlxyXG4gICAqIFVzZWQgZm9yIHRoZSBnaG9zdCBvbmx5LiBUaGUgY2xpY2sgdGhhdCBhY3R1YWxseSBwbGFjZXMgYSB0YWcgc3RpbGwgcmF5Y2FzdHM6IGl0IGlzIG9uZSBwaWNrLFxyXG4gICAqIGl0cyBjb3N0IGRvZXMgbm90IG1hdHRlciwgYW5kIGl0IHlpZWxkcyB0aGUgc3VyZmFjZSBub3JtYWwsIHdoaWNoIGRlcHRoIGFsb25lIGNhbm5vdCBnaXZlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGlja1BvaW50T25HcHUoZXZlbnQ6IE1vdXNlRXZlbnQpOiBUSFJFRS5WZWN0b3IzIHwgbnVsbCB7XHJcbiAgICBpZiAoIXRoaXMubW9kZWxSb290IHx8ICF0aGlzLnJlbmRlcmVyIHx8ICF0aGlzLmNhbWVyYSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMucGlja1RhcmdldCkge1xyXG4gICAgICB0aGlzLnBpY2tUYXJnZXQgPSBuZXcgVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQoMSwgMSk7XHJcbiAgICAgIHRoaXMucGlja0NhbWVyYSA9IG5ldyBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYSgpO1xyXG4gICAgICB0aGlzLnBpY2tDYW1lcmEubGF5ZXJzLnNldChUaHJlZUpzU2VydmljZS5QSUNLX0xBWUVSKTtcclxuICAgICAgdGhpcy5waWNrRGVwdGhNYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoRGVwdGhNYXRlcmlhbCh7XHJcbiAgICAgICAgZGVwdGhQYWNraW5nOiBUSFJFRS5SR0JBRGVwdGhQYWNraW5nLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZWN0ID0gdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgY29uc3QgeCA9IGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQ7XHJcbiAgICBjb25zdCB5ID0gZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wO1xyXG4gICAgaWYgKHggPCAwIHx8IHkgPCAwIHx8IHggPiByZWN0LndpZHRoIHx8IHkgPiByZWN0LmhlaWdodCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnBpY2tDYW1lcmEuY29weSh0aGlzLmNhbWVyYSk7XHJcbiAgICB0aGlzLnBpY2tDYW1lcmEubGF5ZXJzLnNldChUaHJlZUpzU2VydmljZS5QSUNLX0xBWUVSKTtcclxuICAgIC8vIFJlbmRlcnMgdGhlIG9uZSBwaXhlbCB0aGUgY3Vyc29yIGlzIG92ZXIgYXMgaWYgaXQgd2VyZSB0aGUgd2hvbGUgaW1hZ2UgLSBvZmZzZXQgYnkgaGFsZiBhXHJcbiAgICAvLyBwaXhlbCBzbyB0aGUgY3Vyc29yIHNpdHMgYXQgdGhhdCBwaXhlbCdzIGNlbnRyZSwgd2hpY2ggaXMgd2hlcmUgTkRDICgwLCAwKSBsYW5kcy5cclxuICAgIHRoaXMucGlja0NhbWVyYS5zZXRWaWV3T2Zmc2V0KHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0LCB4IC0gMC41LCB5IC0gMC41LCAxLCAxKTtcclxuXHJcbiAgICAvLyBXaGVyZSB0aGUgbW9kZWwgaXMgbm90LCB0aGUgcGl4ZWwgbXVzdCByZWFkIGFzIFwibm90aGluZ1wiLCBzbyBpdCBpcyBjbGVhcmVkIHRvIHdoaXRlIC0gYSB2YWx1ZVxyXG4gICAgLy8gbm8gcmVhbCBkZXB0aCBwYWNrcyB0by4gVHdvIHRoaW5ncyB3b3VsZCBvdGhlcndpc2UgcGFpbnQgb3ZlciB0aGF0OiB0aGUgZGVmYXVsdCBibGFjayBjbGVhcixcclxuICAgIC8vIHdoaWNoIGRlY29kZXMgYXMgZGVwdGggMCAoYSBoaXQgYWdhaW5zdCB0aGUgbGVucyksIGFuZCB0aGUgc2NlbmUgYmFja2dyb3VuZCwgd2hpY2ggdGhyZWUuanNcclxuICAgIC8vIGRyYXdzIGluIHBsYWNlIG9mIHRoZSBjbGVhciBjb2xvdXIgd2hlbmV2ZXIgb25lIGlzIHNldC5cclxuICAgIGNvbnN0IHByZXZpb3VzQ2xlYXJDb2xvciA9IHRoaXMucmVuZGVyZXIuZ2V0Q2xlYXJDb2xvcihuZXcgVEhSRUUuQ29sb3IoKSk7XHJcbiAgICBjb25zdCBwcmV2aW91c0NsZWFyQWxwaGEgPSB0aGlzLnJlbmRlcmVyLmdldENsZWFyQWxwaGEoKTtcclxuICAgIGNvbnN0IHByZXZpb3VzVGFyZ2V0ID0gdGhpcy5yZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcclxuICAgIGNvbnN0IHByZXZpb3VzQmFja2dyb3VuZCA9IHRoaXMuc2NlbmUuYmFja2dyb3VuZDtcclxuXHJcbiAgICB0aGlzLnNjZW5lLmJhY2tncm91bmQgPSBudWxsO1xyXG4gICAgdGhpcy5zY2VuZS5vdmVycmlkZU1hdGVyaWFsID0gdGhpcy5waWNrRGVwdGhNYXRlcmlhbDtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0Q2xlYXJDb2xvcigweGZmZmZmZiwgMSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFJlbmRlclRhcmdldCh0aGlzLnBpY2tUYXJnZXQpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5jbGVhcigpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5waWNrQ2FtZXJhKTtcclxuXHJcbiAgICB0aGlzLnJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHModGhpcy5waWNrVGFyZ2V0LCAwLCAwLCAxLCAxLCB0aGlzLnBpY2tQaXhlbCk7XHJcblxyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQocHJldmlvdXNUYXJnZXQpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRDbGVhckNvbG9yKHByZXZpb3VzQ2xlYXJDb2xvciwgcHJldmlvdXNDbGVhckFscGhhKTtcclxuICAgIHRoaXMuc2NlbmUub3ZlcnJpZGVNYXRlcmlhbCA9IG51bGw7XHJcbiAgICB0aGlzLnNjZW5lLmJhY2tncm91bmQgPSBwcmV2aW91c0JhY2tncm91bmQ7XHJcblxyXG4gICAgY29uc3QgW3IsIGcsIGIsIGFdID0gdGhpcy5waWNrUGl4ZWw7XHJcbiAgICBpZiAociA9PT0gMjU1ICYmIGcgPT09IDI1NSAmJiBiID09PSAyNTUgJiYgYSA9PT0gMjU1KSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRoZSBpbnZlcnNlIG9mIHRocmVlJ3MgcGFja0RlcHRoVG9SR0JBLCB3aGljaCBzdG9yZXMgdGhlIHZhbHVlIGl0c2VsZiBpbiBhbHBoYSBhbmQgZXZlciBmaW5lclxyXG4gICAgLy8gZnJhY3Rpb25zIG9mIGl0IGluIGJsdWUsIGdyZWVuIGFuZCByZWQgLSBhbHBoYSBpcyB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlLCBub3QgcmVkLiBSZWFkIHRoZVxyXG4gICAgLy8gb3RoZXIgd2F5IHJvdW5kLCB0aGUgcmVzdWx0IGlzIG1vc3RseSB0aGUgbG93LW9yZGVyIG5vaXNlLCBvZnRlbiBuZWFyIHplcm8sIHdoaWNoIHVucHJvamVjdHNcclxuICAgIC8vIG9udG8gdGhlIG5lYXIgcGxhbmU6IGEgZ2hvc3QgcHJlc3NlZCBhZ2FpbnN0IHRoZSBsZW5zLCBmaWxsaW5nIHRoZSB3aG9sZSBzY3JlZW4uXHJcbiAgICBjb25zdCBkb3duc2NhbGUgPSAyNTUgLyAyNTY7XHJcbiAgICBjb25zdCBkZXB0aCA9XHJcbiAgICAgIChyIC8gMjU1KSAqIGRvd25zY2FsZSAvICgyNTYgKiAyNTYgKiAyNTYpICtcclxuICAgICAgKGcgLyAyNTUpICogZG93bnNjYWxlIC8gKDI1NiAqIDI1NikgK1xyXG4gICAgICAoYiAvIDI1NSkgKiBkb3duc2NhbGUgLyAyNTYgK1xyXG4gICAgICAoYSAvIDI1NSkgKiBkb3duc2NhbGU7XHJcblxyXG4gICAgLy8gTkRDIHggYW5kIHkgYXJlIHplcm8gYmVjYXVzZSB0aGUgcGl4ZWwgcmVhZCBpcyB0aGUgY2VudHJlIG9mIHRoYXQgb25lLXBpeGVsIGltYWdlIC0gd2hpY2ggb25seVxyXG4gICAgLy8gaG9sZHMgd2hpbGUgdGhlIHZpZXcgb2Zmc2V0IGlzIGluIGVmZmVjdC4gQ2xlYXJpbmcgaXQgZmlyc3Qgd291bGQgdW5wcm9qZWN0IHRocm91Z2ggdGhlIGZ1bGxcclxuICAgIC8vIHZpZXcgaW5zdGVhZCwgbGFuZGluZyB0aGUgcG9pbnQgb24gdGhlIHJheSB0aHJvdWdoIHRoZSBtaWRkbGUgb2YgdGhlIHNjcmVlbi4gVGhlIG9mZnNldCBpc1xyXG4gICAgLy8gc2ltcGx5IHJlcGxhY2VkIGJ5IHRoZSBuZXh0IHBpY2ssIHNvIGl0IGlzIG5ldmVyIGNsZWFyZWQuXHJcbiAgICBjb25zdCB3b3JsZCA9IG5ldyBUSFJFRS5WZWN0b3IzKDAsIDAsIGRlcHRoICogMiAtIDEpLnVucHJvamVjdCh0aGlzLnBpY2tDYW1lcmEpO1xyXG4gICAgdGhpcy50YWdHcm91cC51cGRhdGVXb3JsZE1hdHJpeCh0cnVlLCBmYWxzZSk7XHJcbiAgICByZXR1cm4gdGhpcy50YWdHcm91cC53b3JsZFRvTG9jYWwod29ybGQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVQbGFjZW1lbnRQcmV2aWV3KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnBsYWNlbWVudFByZXZpZXcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy50YWdHcm91cC5yZW1vdmUodGhpcy5wbGFjZW1lbnRQcmV2aWV3KTtcclxuICAgIHRoaXMucGxhY2VtZW50UHJldmlldy5tYXRlcmlhbC5tYXA/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMucGxhY2VtZW50UHJldmlldy5tYXRlcmlhbC5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnBsYWNlbWVudFByZXZpZXcgPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICAvKiogU2hvd3Mgb3IgaGlkZXMgb25lIHRhZywgbGVhdmluZyBpdCByZWdpc3RlcmVkIHNvIGl0IGNhbiBiZSBicm91Z2h0IGJhY2sgd2l0aG91dCByZWxvYWRpbmcuICovXHJcbiAgc2V0VGFnVmlzaWJpbGl0eShlbGVtZW50SWQ6IHN0cmluZywgdmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgY29uc3Qgc3ByaXRlID0gdGhpcy50YWdTcHJpdGVzLmdldChlbGVtZW50SWQpO1xyXG4gICAgaWYgKHNwcml0ZSkge1xyXG4gICAgICBzcHJpdGUudmlzaWJsZSA9IHZpc2libGU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTaG93cyBvbmx5IHRhZ3Mgb2YgdGhlIGdpdmVuIHR5cGVzLCBoaWRpbmcgdGhlIHJlc3QuXHJcbiAgICpcclxuICAgKiBQYXNzaW5nIG51bGwgc2hvd3MgZXZlcnl0aGluZyAtIHRoZSBcIm5vIGZpbHRlclwiIHN0YXRlLCBkaXN0aW5jdCBmcm9tIGFuIGVtcHR5IGFycmF5LCB3aGljaCBpcyBhXHJcbiAgICogZmlsdGVyIHRoYXQgaGFwcGVucyB0byBtYXRjaCBub3RoaW5nLlxyXG4gICAqL1xyXG4gIHNldFZpc2libGVUYWdUeXBlcyh0eXBlczogUG9pVHlwZVtdIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgdGhpcy50YWdTcHJpdGVzLmZvckVhY2goKHNwcml0ZSkgPT4ge1xyXG4gICAgICBzcHJpdGUudmlzaWJsZSA9IHR5cGVzID09PSBudWxsIHx8IHR5cGVzLmluY2x1ZGVzKHNwcml0ZS51c2VyRGF0YS5wb2lUeXBlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTW92ZXMgdGhlIGNhbWVyYSB0byBsb29rIGF0IGEgdGFnLCBtaXJyb3JpbmcgTWF0dGVycG9ydCdzIGdvVG9UYWcuXHJcbiAgICpcclxuICAgKiBBbmltYXRlZCByYXRoZXIgdGhhbiB0ZWxlcG9ydGVkOiBqdW1waW5nIHRoZSBjYW1lcmEgbG9zZXMgdGhlIHZpZXdlcidzIHNlbnNlIG9mIHdoZXJlIHRoZXkgd2VyZVxyXG4gICAqIHJlbGF0aXZlIHRvIHRoZSBtb2RlbC4gVGhlIGFwcHJvYWNoIGRpc3RhbmNlIGZvbGxvd3MgdGhlIG1vZGVsJ3Mgc2l6ZSBzbyBpdCBmcmFtZXMgc2Vuc2libHlcclxuICAgKiB3aGF0ZXZlciB0aGUgdW5pdHMgYXJlLlxyXG4gICAqL1xyXG4gIGdvVG9UYWcoZWxlbWVudElkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNwcml0ZSA9IHRoaXMudGFnU3ByaXRlcy5nZXQoZWxlbWVudElkKTtcclxuICAgIGlmICghc3ByaXRlIHx8ICF0aGlzLmNhbWVyYSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdGFyZ2V0ID0gc3ByaXRlLmdldFdvcmxkUG9zaXRpb24obmV3IFRIUkVFLlZlY3RvcjMoKSk7XHJcbiAgICBjb25zdCBkaXN0YW5jZSA9IHRoaXMubW9kZWxSb290XHJcbiAgICAgID8gbmV3IFRIUkVFLkJveDMoKS5zZXRGcm9tT2JqZWN0KHRoaXMubW9kZWxSb290KS5nZXRTaXplKG5ldyBUSFJFRS5WZWN0b3IzKCkpLmxlbmd0aCgpICogMC4xNVxyXG4gICAgICA6IDU7XHJcblxyXG4gICAgLy8gQXBwcm9hY2ggYWxvbmcgdGhlIGN1cnJlbnQgdmlld2luZyBkaXJlY3Rpb24sIHNvIHRoZSBjYW1lcmEgY2xvc2VzIGluIHJhdGhlciB0aGFuIHN3aW5naW5nXHJcbiAgICAvLyBhcm91bmQgdG8gYW4gYXJiaXRyYXJ5IHNpZGUuXHJcbiAgICBjb25zdCBkaXJlY3Rpb24gPSB0aGlzLmNhbWVyYS5wb3NpdGlvbi5jbG9uZSgpLnN1Yih0aGlzLmNvbnRyb2xzLnRhcmdldCkubm9ybWFsaXplKCk7XHJcbiAgICB0aGlzLmNhbWVyYVR3ZWVuID0ge1xyXG4gICAgICBmcm9tUG9zaXRpb246IHRoaXMuY2FtZXJhLnBvc2l0aW9uLmNsb25lKCksXHJcbiAgICAgIHRvUG9zaXRpb246IHRhcmdldC5jbG9uZSgpLmFkZChkaXJlY3Rpb24ubXVsdGlwbHlTY2FsYXIoZGlzdGFuY2UpKSxcclxuICAgICAgZnJvbVRhcmdldDogdGhpcy5jb250cm9scy50YXJnZXQuY2xvbmUoKSxcclxuICAgICAgdG9UYXJnZXQ6IHRhcmdldCxcclxuICAgICAgc3RhcnRlZEF0OiBwZXJmb3JtYW5jZS5ub3coKSxcclxuICAgICAgZHVyYXRpb25NczogNjAwLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKiBBZHZhbmNlcyB0aGUgY2FtZXJhIGFuaW1hdGlvbiBzdGFydGVkIGJ5IGdvVG9UYWcsIGlmIG9uZSBpcyBydW5uaW5nLiAqL1xyXG4gIHByaXZhdGUgc3RlcENhbWVyYVR3ZWVuKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmNhbWVyYVR3ZWVuKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHsgZnJvbVBvc2l0aW9uLCB0b1Bvc2l0aW9uLCBmcm9tVGFyZ2V0LCB0b1RhcmdldCwgc3RhcnRlZEF0LCBkdXJhdGlvbk1zIH0gPSB0aGlzLmNhbWVyYVR3ZWVuO1xyXG4gICAgY29uc3QgbGluZWFyID0gTWF0aC5taW4oKHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRlZEF0KSAvIGR1cmF0aW9uTXMsIDEpO1xyXG4gICAgLy8gRWFzZSBvdXQsIHNvIHRoZSBtb3ZlIHNldHRsZXMgaW5zdGVhZCBvZiBzdG9wcGluZyBkZWFkLlxyXG4gICAgY29uc3QgdCA9IDEgLSBNYXRoLnBvdygxIC0gbGluZWFyLCAzKTtcclxuXHJcbiAgICB0aGlzLmNhbWVyYS5wb3NpdGlvbi5sZXJwVmVjdG9ycyhmcm9tUG9zaXRpb24sIHRvUG9zaXRpb24sIHQpO1xyXG4gICAgdGhpcy5jb250cm9scy50YXJnZXQubGVycFZlY3RvcnMoZnJvbVRhcmdldCwgdG9UYXJnZXQsIHQpO1xyXG5cclxuICAgIGlmIChsaW5lYXIgPj0gMSkge1xyXG4gICAgICB0aGlzLmNhbWVyYVR3ZWVuID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzUGxhY2luZ1RhZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnBsYWNpbmdUYWc7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIHNwb3QgcGlja2VkIGJ5IHRoZSBsYXN0IHBsYWNlbWVudCwgZm9yIHdob2V2ZXIgY29tbWl0cyBpdCB0byBhIFBPSS4gKi9cclxuICBnZXRQZW5kaW5nVGFnUGxhY2VtZW50KCk6IFRocmVlSnNUYWdQbGFjZW1lbnQgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLnBlbmRpbmdUYWdQbGFjZW1lbnQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSYXljYXN0cyBhIGNsaWNrIGFnYWluc3QgdGhlIG1vZGVsJ3MgZ2VvbWV0cnkgYW5kIHJldHVybnMgdGhlIGhpdCwgaW4gd29ybGQgc3BhY2UuXHJcbiAgICpcclxuICAgKiBSZXR1cm5zIG51bGwgd2hlbiB0aGUgY2xpY2sgbWlzc2VkLCB3aGljaCBpcyBhIG5vcm1hbCBvdXRjb21lIC0gdGhlIHVzZXIgY2xpY2tlZCB0aGUgc2t5IC0gYW5kXHJcbiAgICogbGVhdmVzIHdoYXRldmVyIG1vZGUgaXMgYXJtZWQgc3RpbGwgYXJtZWQsIHNvIHRoZXkgY2FuIHNpbXBseSB0cnkgYWdhaW4uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByYXljYXN0TW9kZWwoZXZlbnQ6IE1vdXNlRXZlbnQpOiBUSFJFRS5JbnRlcnNlY3Rpb24gfCBudWxsIHtcclxuICAgIGlmICghdGhpcy5tb2RlbFJvb3QpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVjdCA9IHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIHRoaXMubW91c2UueCA9ICgoZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoKSAqIDIgLSAxO1xyXG4gICAgdGhpcy5tb3VzZS55ID0gLSgoZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wKSAvIHJlY3QuaGVpZ2h0KSAqIDIgKyAxO1xyXG4gICAgdGhpcy5yYXljYXN0ZXIuc2V0RnJvbUNhbWVyYSh0aGlzLm1vdXNlLCB0aGlzLmNhbWVyYSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMucmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdCh0aGlzLm1vZGVsUm9vdCwgdHJ1ZSlbMF0gPz8gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFR1cm5zIGEgY2xpY2sgaW50byBhIHBvaW50IG9uIHRoZSBtb2RlbCwgaW4gdGhlIGZyYW1lIHRhZyBjb29yZGluYXRlcyBhcmUgcGVyc2lzdGVkIGluLlxyXG4gICAqXHJcbiAgICogVGhhdCBmcmFtZSBpcyB0aGUgdGFnIGdyb3VwJ3MsIG5vdCB0aGUgbW9kZWwncy4gQSBzdG9yZWQgY29vcmRpbmF0ZSBpcyByZWFkIGJhY2sgYXMgYSBzcHJpdGVcclxuICAgKiBwb3NpdGlvbiBpbnNpZGUgdGhhdCBncm91cCwgc28gYSBjb29yZGluYXRlIGNhcHR1cmVkIGluIGFueSBvdGhlciBmcmFtZSBjb21lcyBiYWNrIGRpc3BsYWNlZCBieVxyXG4gICAqIGV4YWN0bHkgaG93ZXZlciBmYXIgdGhlIGFsaWdubWVudCBtb3ZlcyB0aGUgZ3JvdXAuIFRoZSB0d28gZnJhbWVzIGFncmVlIG9ubHkgd2hpbGUgdGhlXHJcbiAgICogYWxpZ25tZW50IGlzIGlkZW50aXR5LCB3aGljaCBpcyB3aHkgdGhpcyBzdGF5ZWQgaW52aXNpYmxlIHVudGlsIGEgbW9kZWwgd2FzIGNhbGlicmF0ZWQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwaWNrUGxhY2VtZW50T25Nb2RlbChldmVudDogTW91c2VFdmVudCk6IFRocmVlSnNUYWdQbGFjZW1lbnQgfCBudWxsIHtcclxuICAgIGNvbnN0IGhpdCA9IHRoaXMucmF5Y2FzdE1vZGVsKGV2ZW50KTtcclxuICAgIGlmICghaGl0KSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudGFnR3JvdXAudXBkYXRlV29ybGRNYXRyaXgodHJ1ZSwgZmFsc2UpO1xyXG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLnRhZ0dyb3VwLndvcmxkVG9Mb2NhbChoaXQucG9pbnQuY2xvbmUoKSk7XHJcblxyXG4gICAgLy8gQSBmYWNlIG5vcm1hbCBpcyBpbiB0aGUgZ2VvbWV0cnkncyBsb2NhbCBzcGFjZSBhbHJlYWR5LCBidXQgdGhlIG1lc2ggaXQgYmVsb25ncyB0byBtYXkgc2l0XHJcbiAgICAvLyB1bmRlciB0cmFuc2Zvcm1zIG9mIGl0cyBvd24sIHNvIHRha2UgaXQgb3V0IHRocm91Z2ggdGhvc2UgYW5kIGJhY2sgaW50byB0aGUgdGFnIGZyYW1lLCBzbyBpdFxyXG4gICAgLy8gZGVzY3JpYmVzIHRoZSBzYW1lIG9yaWVudGF0aW9uIHRoZSBwb3NpdGlvbiBkb2VzLlxyXG4gICAgbGV0IG5vcm1hbCA9IG5ldyBUSFJFRS5WZWN0b3IzKDAsIDEsIDApO1xyXG4gICAgaWYgKGhpdC5mYWNlKSB7XHJcbiAgICAgIG5vcm1hbCA9IGhpdC5mYWNlLm5vcm1hbFxyXG4gICAgICAgIC5jbG9uZSgpXHJcbiAgICAgICAgLnRyYW5zZm9ybURpcmVjdGlvbihoaXQub2JqZWN0Lm1hdHJpeFdvcmxkKVxyXG4gICAgICAgIC50cmFuc2Zvcm1EaXJlY3Rpb24obmV3IFRIUkVFLk1hdHJpeDQoKS5jb3B5KHRoaXMudGFnR3JvdXAubWF0cml4V29ybGQpLmludmVydCgpKVxyXG4gICAgICAgIC5ub3JtYWxpemUoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBwb3NpdGlvbjogeyB4OiBwb3NpdGlvbi54LCB5OiBwb3NpdGlvbi55LCB6OiBwb3NpdGlvbi56IH0sXHJcbiAgICAgIG5vcm1hbDogeyB4OiBub3JtYWwueCwgeTogbm9ybWFsLnksIHo6IG5vcm1hbC56IH0sXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hlcmUgdGhlIHVzZXIgc2F5cyBhIHRhZyByZWFsbHkgYmVsb25ncywgaW4gdGhlIHNwYWNlIHRoZSBzb2x2ZWQgYWxpZ25tZW50IG1hcHMgb250by5cclxuICAgKlxyXG4gICAqIHNldFRhZ0FsaWdubWVudCB3cml0ZXMgdGhlIHNvbHV0aW9uIHRvIHRoZSB0YWcgZ3JvdXAncyBvd24gdHJhbnNmb3JtLCB3aGljaCBpcyBleHByZXNzZWRcclxuICAgKiByZWxhdGl2ZSB0byBpdHMgcGFyZW50IC0gc28gdGhlIHRhcmdldCBoYXMgdG8gYmUgaW4gdGhlIHBhcmVudCdzIGZyYW1lLiBNZWFzdXJpbmcgaXQgaW4gdGhlXHJcbiAgICogZ3JvdXAncyBvd24gZnJhbWUgaW5zdGVhZCB3b3VsZCBmb2xkIHRoZSBjdXJyZW50IGFsaWdubWVudCBpbnRvIHRoZSBhbnN3ZXIsIG1ha2luZyBlYWNoXHJcbiAgICogY2FsaWJyYXRpb24gZGVwZW5kIG9uIHRoZSBvbmUgYmVmb3JlIGl0LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGlja0FsaWdubWVudFRhcmdldChldmVudDogTW91c2VFdmVudCk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9IHwgbnVsbCB7XHJcbiAgICBjb25zdCBoaXQgPSB0aGlzLnJheWNhc3RNb2RlbChldmVudCk7XHJcbiAgICBpZiAoIWhpdCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IGZyYW1lID0gdGhpcy50YWdHcm91cC5wYXJlbnQgPz8gdGhpcy5zY2VuZTtcclxuICAgIGZyYW1lLnVwZGF0ZVdvcmxkTWF0cml4KHRydWUsIGZhbHNlKTtcclxuICAgIGNvbnN0IHBvaW50ID0gZnJhbWUud29ybGRUb0xvY2FsKGhpdC5wb2ludC5jbG9uZSgpKTtcclxuICAgIHJldHVybiB7IHg6IHBvaW50LngsIHk6IHBvaW50LnksIHo6IHBvaW50LnogfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIHRyYW5zZm9ybSBtYXBwaW5nIGNhcHR1cmVkIHRhZyBjb29yZGluYXRlcyBvbnRvIHRoaXMgbW9kZWwncyBzcGFjZS5cclxuICAgKlxyXG4gICAqIEV2ZXJ5IHRhZyBjb21lcyBmcm9tIHRoZSBzYW1lIHNvdXJjZSBzcGFjZSwgc28gdGhpcyBpcyBvbmUgdHJhbnNmb3JtIG9uIHRoZSBncm91cCByYXRoZXIgdGhhblxyXG4gICAqIHBlci10YWcgbWF0aHMgLSB3aGljaCBhbHNvIG1lYW5zIGl0IGFwcGxpZXMgcmV0cm9hY3RpdmVseSB0byB0YWdzIGFscmVhZHkgcGxhY2VkLCBhbmQgY2FuIGJlXHJcbiAgICogYWRqdXN0ZWQgbGl2ZSB3aGlsZSBzb21lb25lIGRpYWxzIHRoZSBudW1iZXJzIGluLlxyXG4gICAqXHJcbiAgICogUGFzc2luZyBudWxsIHJlc2V0cyB0byBpZGVudGl0eSwgaS5lLiB0YWcgY29vcmRpbmF0ZXMgYXJlIGFscmVhZHkgaW4gbW9kZWwgc3BhY2UuXHJcbiAgICovXHJcbiAgc2V0VGFnQWxpZ25tZW50KGFsaWdubWVudDogVGhyZWVKc0FsaWdubWVudCB8IG51bGwpOiB2b2lkIHtcclxuICAgIGNvbnN0IHsgdHJhbnNsYXRpb24sIHJvdGF0aW9uLCBzY2FsZSB9ID0gYWxpZ25tZW50ID8/IHt9O1xyXG4gICAgdGhpcy50YWdHcm91cC5wb3NpdGlvbi5zZXQodHJhbnNsYXRpb24/LnggPz8gMCwgdHJhbnNsYXRpb24/LnkgPz8gMCwgdHJhbnNsYXRpb24/LnogPz8gMCk7XHJcbiAgICB0aGlzLnRhZ0dyb3VwLnJvdGF0aW9uLnNldChyb3RhdGlvbj8ueCA/PyAwLCByb3RhdGlvbj8ueSA/PyAwLCByb3RhdGlvbj8ueiA/PyAwKTtcclxuICAgIHRoaXMudGFnR3JvdXAuc2NhbGUuc2V0U2NhbGFyKHNjYWxlID8/IDEpO1xyXG5cclxuICAgIC8vIFRhZyBzaXplIGlzIGRlcml2ZWQgZnJvbSB0aGUgd29ybGQgc2NhbGUgaXQgaW5oZXJpdHMsIHdoaWNoIHRoaXMgY2FsbCBqdXN0IGNoYW5nZWQuXHJcbiAgICB0aGlzLnRhZ1Nwcml0ZXMuZm9yRWFjaCgoc3ByaXRlKSA9PiB0aGlzLnNjYWxlVGFnRm9yTW9kZWwoc3ByaXRlKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGRzIGEgdGFnLCBvciBtb3Zlcy9yZXN0eWxlcyB0aGUgb25lIGFscmVhZHkgcmVnaXN0ZXJlZCBmb3IgdGhpcyBlbGVtZW50LlxyXG4gICAqXHJcbiAgICogVXBzZXJ0IHJhdGhlciB0aGFuIGEgZGVjbGFyYXRpdmUgXCJoZXJlIGlzIHRoZSBmdWxsIGxpc3RcIiBjYWxsLCBiZWNhdXNlIHRhZ3MgYXJyaXZlIHBlciB0eXBlXHJcbiAgICogKGVxdWlwbWVudCwgdGhlbiB0aWNrZXRzLCB0aGVuIG1lYXN1cmVtZW50cy4uLikgZnJvbSBzZXBhcmF0ZSBzdWJzY3JpcHRpb25zIC0gcmVwbGFjaW5nIHRoZSBzZXRcclxuICAgKiBvbiBlYWNoIG9mIHRob3NlIHdvdWxkIHdpcGUgdGhlIHR5cGVzIHRoYXQgY2FtZSBiZWZvcmUuXHJcbiAgICovXHJcbiAgdXBzZXJ0VGFnKHRhZzogVGhyZWVKc1RhZyk6IHZvaWQge1xyXG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLnRhZ1Nwcml0ZXMuZ2V0KHRhZy5pZCk7XHJcbiAgICBpZiAoZXhpc3RpbmcpIHtcclxuICAgICAgZXhpc3RpbmcucG9zaXRpb24uc2V0KHRhZy5wb3NpdGlvbi54LCB0YWcucG9zaXRpb24ueSwgdGFnLnBvc2l0aW9uLnopO1xyXG4gICAgICBleGlzdGluZy51c2VyRGF0YS5wb2lUeXBlID0gdGFnLnBvaVR5cGUgPz8gZXhpc3RpbmcudXNlckRhdGEucG9pVHlwZTtcclxuICAgICAgZXhpc3RpbmcudXNlckRhdGEubGFiZWwgPSB0YWcubGFiZWwgPz8gZXhpc3RpbmcudXNlckRhdGEubGFiZWw7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzcHJpdGUgPSBuZXcgVEhSRUUuU3ByaXRlKFxyXG4gICAgICBuZXcgVEhSRUUuU3ByaXRlTWF0ZXJpYWwoe1xyXG4gICAgICAgIG1hcDogdGhpcy5jcmVhdGVUYWdUZXh0dXJlKHRhZy5jb2xvciksXHJcbiAgICAgICAgLy8gVGFncyByZWFkIGFzIFVJIHJhdGhlciB0aGFuIGdlb21ldHJ5LCBzbyB0aGV5IHN0YXkgdmlzaWJsZSB0aHJvdWdoIHRoZSBtb2RlbCBpbnN0ZWFkIG9mXHJcbiAgICAgICAgLy8gYmVpbmcgb2NjbHVkZWQgYnkgd2hhdGV2ZXIgd2FsbCBoYXBwZW5zIHRvIGJlIGJldHdlZW4gdGhlbSBhbmQgdGhlIGNhbWVyYS5cclxuICAgICAgICBkZXB0aFRlc3Q6IGZhbHNlLFxyXG4gICAgICAgIHRyYW5zcGFyZW50OiB0cnVlLFxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICAgIHNwcml0ZS5uYW1lID0gdGFnLmlkO1xyXG4gICAgc3ByaXRlLnVzZXJEYXRhLnBvaVR5cGUgPSB0YWcucG9pVHlwZSA/PyBudWxsO1xyXG4gICAgc3ByaXRlLnVzZXJEYXRhLmxhYmVsID0gdGFnLmxhYmVsID8/IG51bGw7XHJcbiAgICBzcHJpdGUucG9zaXRpb24uc2V0KHRhZy5wb3NpdGlvbi54LCB0YWcucG9zaXRpb24ueSwgdGFnLnBvc2l0aW9uLnopO1xyXG4gICAgc3ByaXRlLnJlbmRlck9yZGVyID0gOTk5O1xyXG4gICAgdGhpcy5zY2FsZVRhZ0Zvck1vZGVsKHNwcml0ZSk7XHJcblxyXG4gICAgdGhpcy50YWdHcm91cC5hZGQoc3ByaXRlKTtcclxuICAgIHRoaXMudGFnU3ByaXRlcy5zZXQodGFnLmlkLCBzcHJpdGUpO1xyXG5cclxuICAgIGlmICh0YWcuaWNvblVybCkge1xyXG4gICAgICB0aGlzLmFwcGx5VGFnSWNvbihzcHJpdGUsIHRhZy5pY29uVXJsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBSZW1vdmVzIHRoZSB0YWcgcmVnaXN0ZXJlZCBmb3IgYW4gZWxlbWVudCwgaWYgdGhlcmUgaXMgb25lLiAqL1xyXG4gIHJlbW92ZVRhZyhlbGVtZW50SWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3Qgc3ByaXRlID0gdGhpcy50YWdTcHJpdGVzLmdldChlbGVtZW50SWQpO1xyXG4gICAgaWYgKCFzcHJpdGUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy50YWdHcm91cC5yZW1vdmUoc3ByaXRlKTtcclxuICAgIHNwcml0ZS5tYXRlcmlhbC5tYXA/LmRpc3Bvc2UoKTtcclxuICAgIHNwcml0ZS5tYXRlcmlhbC5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnRhZ1Nwcml0ZXMuZGVsZXRlKGVsZW1lbnRJZCk7XHJcbiAgfVxyXG5cclxuICAvKiogUmVtb3ZlcyBldmVyeSB0YWcgZnJvbSB0aGUgc2NlbmUuICovXHJcbiAgY2xlYXJUYWdzKCk6IHZvaWQge1xyXG4gICAgWy4uLnRoaXMudGFnU3ByaXRlcy5rZXlzKCldLmZvckVhY2goKGlkKSA9PiB0aGlzLnJlbW92ZVRhZyhpZCkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIExvYWRzIGFuIGljb24gaW50byBhbiBleGlzdGluZyB0YWcsIGxlYXZpbmcgdGhlIGZhbGxiYWNrIGRpc2MgaW4gcGxhY2UgaWYgaXQgZmFpbHMuICovXHJcbiAgcHJpdmF0ZSBhcHBseVRhZ0ljb24oc3ByaXRlOiBUSFJFRS5TcHJpdGUsIGljb25Vcmw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbmV3IFRIUkVFLlRleHR1cmVMb2FkZXIoKS5sb2FkKFxyXG4gICAgICBpY29uVXJsLFxyXG4gICAgICAodGV4dHVyZSkgPT4ge1xyXG4gICAgICAgIHNwcml0ZS5tYXRlcmlhbC5tYXA/LmRpc3Bvc2UoKTtcclxuICAgICAgICBzcHJpdGUubWF0ZXJpYWwubWFwID0gdGV4dHVyZTtcclxuICAgICAgICBzcHJpdGUubWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICB9LFxyXG4gICAgICB1bmRlZmluZWQsXHJcbiAgICAgICgpID0+IGNvbnNvbGUud2FybihgVGhyZWVKc1NlcnZpY2U6IGNvdWxkIG5vdCBsb2FkIHRhZyBpY29uIFwiJHtpY29uVXJsfVwiLCBrZWVwaW5nIHRoZSBkZWZhdWx0IG1hcmtlci5gKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKiBEcmF3cyB0aGUgZGVmYXVsdCB0YWcgbWFya2VyOiBhIGZpbGxlZCBkaXNjIHdpdGggYSB3aGl0ZSByaW5nLCBzbyBpdCByZWFkcyBvbiBhbnkgYmFja2dyb3VuZC4gKi9cclxuICBwcml2YXRlIGNyZWF0ZVRhZ1RleHR1cmUoY29sb3IgPSAnIzFFODhFNScpOiBUSFJFRS5DYW52YXNUZXh0dXJlIHtcclxuICAgIGNvbnN0IHNpemUgPSAxMjg7XHJcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgIGNhbnZhcy53aWR0aCA9IHNpemU7XHJcbiAgICBjYW52YXMuaGVpZ2h0ID0gc2l6ZTtcclxuICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuXHJcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xyXG4gICAgY29udGV4dC5hcmMoc2l6ZSAvIDIsIHNpemUgLyAyLCBzaXplIC8gMiAtIDgsIDAsIE1hdGguUEkgKiAyKTtcclxuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gY29sb3I7XHJcbiAgICBjb250ZXh0LmZpbGwoKTtcclxuICAgIGNvbnRleHQubGluZVdpZHRoID0gODtcclxuICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAnI0ZGRkZGRic7XHJcbiAgICBjb250ZXh0LnN0cm9rZSgpO1xyXG5cclxuICAgIHJldHVybiBuZXcgVEhSRUUuQ2FudmFzVGV4dHVyZShjYW52YXMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2l6ZXMgYSB0YWcgcmVsYXRpdmUgdG8gdGhlIG1vZGVsLlxyXG4gICAqXHJcbiAgICogQSBzcHJpdGUgaW5oZXJpdHMgdGhlIG1vZGVsJ3Mgc2NhbGUgYW5kIHRoZSBhbGlnbm1lbnQncywgc28gYSBmaXhlZCBzaXplIHdvdWxkIGNvbWUgb3V0IHRpbnkgb25cclxuICAgKiBhIGxhcmdlIG1vZGVsIGFuZCBodWdlIG9uIGEgc21hbGwgb25lLiBEaXZpZGluZyBieSB0aGUgZ3JvdXAncyB3b3JsZCBzY2FsZSBrZWVwcyB0YWdzIHRoZSBzYW1lXHJcbiAgICogc2l6ZSBvbiBzY3JlZW4gd2hhdGV2ZXIgdGhlIG1vZGVsJ3MgdW5pdHMgYXJlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2NhbGVUYWdGb3JNb2RlbChzcHJpdGU6IFRIUkVFLlNwcml0ZSk6IHZvaWQge1xyXG4gICAgY29uc3Qgd29ybGRTY2FsZSA9IHRoaXMudGFnR3JvdXAuZ2V0V29ybGRTY2FsZShuZXcgVEhSRUUuVmVjdG9yMygpKS54IHx8IDE7XHJcbiAgICBjb25zdCBzaXplID0gMC40IC8gd29ybGRTY2FsZTtcclxuICAgIHNwcml0ZS5zY2FsZS5zZXQoc2l6ZSwgc2l6ZSwgMSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGRzIHNlY29uZGFyeSBpbnRlcmFjdGl2ZSBvYmplY3RzIChlLmcuLCBQT0lzLCBzZW5zb3JzKSB0byB0aGUgc2NlbmUuXHJcbiAgICovXHJcbiAgdXBkYXRlT2Jqc1RvU2NlbmUob2Jqc0FkZGVkOiBPYmpBZGRlZFtdKTogdm9pZCB7XHJcbiAgICBjb25zdCBleGlzdGluZ0lkcyA9IHRoaXMuY2xpY2thYmxlT2JqZWN0cy5tYXAoKG9iaikgPT4gb2JqLm5hbWUpO1xyXG4gICAgY29uc3Qgb2JqTG9hZGVyID0gbmV3IE9CSkxvYWRlcigpO1xyXG5cclxuICAgIC8vIGRlbGV0ZSBvYmplY3RzIHRoYXQgYXJlIG5vdCBpbiB0aGUgcHJvdmlkZWQgYXJyYXlcclxuICAgIHRoaXMuY2xpY2thYmxlT2JqZWN0cy5mb3JFYWNoKChvYmopID0+IHtcclxuICAgICAgaWYgKCFvYmpzQWRkZWQuZmluZCgob2JqRGF0YSkgPT4gb2JqRGF0YS5pZCA9PT0gb2JqLm5hbWUpKSB7XHJcbiAgICAgICAgdGhpcy5zY2VuZS5yZW1vdmUob2JqKTtcclxuICAgICAgICB0aGlzLmNsaWNrYWJsZU9iamVjdHMgPSB0aGlzLmNsaWNrYWJsZU9iamVjdHMuZmlsdGVyKFxyXG4gICAgICAgICAgKG9iamVjdCkgPT4gb2JqZWN0Lm5hbWUgIT09IG9iai5uYW1lXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgb2Jqc0FkZGVkLmZvckVhY2goKG9iamVjdERhdGE6IE9iakFkZGVkKSA9PiB7XHJcbiAgICAgIGlmICghZXhpc3RpbmdJZHMuaW5jbHVkZXMob2JqZWN0RGF0YS5pZCkpIHtcclxuICAgICAgICBvYmpMb2FkZXIubG9hZChvYmplY3REYXRhLmZpbGUsIChuZXdPYmplY3QpID0+IHtcclxuICAgICAgICAgIG5ld09iamVjdC5uYW1lID0gb2JqZWN0RGF0YS5pZDtcclxuXHJcbiAgICAgICAgICBuZXdPYmplY3QudHJhdmVyc2UoKGNoaWxkKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICgoY2hpbGQgYXMgVEhSRUUuTWVzaCkuaXNNZXNoKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgbWVzaCA9IGNoaWxkIGFzIFRIUkVFLk1lc2g7XHJcbiAgICAgICAgICAgICAgaWYgKG1lc2gubWF0ZXJpYWwgaW5zdGFuY2VvZiBUSFJFRS5NYXRlcmlhbCkge1xyXG4gICAgICAgICAgICAgICAgbWVzaC5tYXRlcmlhbC50cmFuc3BhcmVudCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBtZXNoLm1hdGVyaWFsLm9wYWNpdHkgPSAwLjg7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAvLyBzZXQgb2JqZWN0IHBvc2l0aW9uIGFuZCByb3RhdGlvblxyXG4gICAgICAgICAgbmV3T2JqZWN0LnBvc2l0aW9uLnNldChcclxuICAgICAgICAgICAgb2JqZWN0RGF0YS5wb3NpdGlvbi54LFxyXG4gICAgICAgICAgICBvYmplY3REYXRhLnBvc2l0aW9uLnksXHJcbiAgICAgICAgICAgIG9iamVjdERhdGEucG9zaXRpb24uelxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgLy8gVGhlIEpTT04gY29uZmlndXJhdGlvbiBoYXMgcm90YXRpb24gYWxyZWFkeSBpbiByYWRpYW5zIChlLmcuIDMuMTQxNS4uLilcclxuICAgICAgICAgIG5ld09iamVjdC5yb3RhdGlvbi5zZXQoXHJcbiAgICAgICAgICAgIG9iamVjdERhdGEucm90YXRpb24ueCxcclxuICAgICAgICAgICAgb2JqZWN0RGF0YS5yb3RhdGlvbi55LFxyXG4gICAgICAgICAgICBvYmplY3REYXRhLnJvdGF0aW9uLnpcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgbmV3T2JqZWN0LnNjYWxlLnNldChvYmplY3REYXRhLnNjYWxlLngsIG9iamVjdERhdGEuc2NhbGUueSwgb2JqZWN0RGF0YS5zY2FsZS56KTtcclxuXHJcbiAgICAgICAgICB0aGlzLnNjZW5lLmFkZChuZXdPYmplY3QpO1xyXG4gICAgICAgICAgdGhpcy5jbGlja2FibGVPYmplY3RzLnB1c2gobmV3T2JqZWN0KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uTW91c2VNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZ0NhbWVyYSkge1xyXG4gICAgICBjb25zdCByZWN0ID0gdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICB0aGlzLm1vdXNlLnggPSAoKGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQpIC8gcmVjdC53aWR0aCkgKiAyIC0gMTtcclxuICAgICAgdGhpcy5tb3VzZS55ID0gLSgoZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wKSAvIHJlY3QuaGVpZ2h0KSAqIDIgKyAxO1xyXG5cclxuICAgICAgdGhpcy5yYXljYXN0ZXIuc2V0RnJvbUNhbWVyYSh0aGlzLm1vdXNlLCB0aGlzLmNhbWVyYSk7XHJcblxyXG4gICAgICAvLyBXaGlsZSB0aGUgZ2hvc3QgaXMgdXAgaXQgZm9sbG93cyB0aGUgcG9pbnRlciBhbmQgbm90aGluZyBlbHNlIHNob3VsZCByZWFjdCB0byBpdC4gVGhlIG1vdmVcclxuICAgICAgLy8gaXMgb25seSByZWNvcmRlZCBoZXJlOiBwb2ludGVyIGV2ZW50cyBmaXJlIGZhciBtb3JlIG9mdGVuIHRoYW4gZnJhbWVzLCBhbmQgcGlja2luZyBhIHBvaW50XHJcbiAgICAgIC8vIGNvc3RzIGEgcmF5Y2FzdCBhZ2FpbnN0IHRoZSB3aG9sZSBtb2RlbCwgc28gZG9pbmcgaXQgcGVyIGV2ZW50IGlzIHdoYXQgbWFkZSB0aGUgZ2hvc3QgdHJhaWxcclxuICAgICAgLy8gYmVoaW5kIHRoZSBjdXJzb3IuIFRoZSByZW5kZXIgbG9vcCBwaWNrcyB1cCB0aGUgbGF0ZXN0IHBvc2l0aW9uLCBvbmNlLCBwZXIgZnJhbWUuXHJcbiAgICAgIGlmICh0aGlzLmlzUHJldmlld2luZ1BsYWNlbWVudCgpKSB7XHJcbiAgICAgICAgdGhpcy5wZW5kaW5nUHJldmlld0V2ZW50ID0gZXZlbnQ7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBOb3QgcHJldmlld2luZyBhbnkgbW9yZSAoYSBwYWlyIHdhcyBqdXN0IGNvbXBsZXRlZCwgc2F5KTogZHJvcCBhIGdob3N0IGxlZnQgb3ZlciBmcm9tIGl0LlxyXG4gICAgICB0aGlzLnJlbW92ZVBsYWNlbWVudFByZXZpZXcoKTtcclxuXHJcbiAgICAgIC8vIFRhZ3MgZmlyc3Q6IHRoZXkgZHJhdyBvbiB0b3Agb2YgdGhlIG1vZGVsLCBzbyB0aGV5IGhhdmUgdG8gYW5zd2VyIHRoZSBwb2ludGVyIGZpcnN0IHRvby5cclxuICAgICAgY29uc3QgaG92ZXJlZFRhZyA9IHRoaXMucmF5Y2FzdGVyXHJcbiAgICAgICAgLmludGVyc2VjdE9iamVjdHModGhpcy50YWdHcm91cC5jaGlsZHJlbiwgZmFsc2UpXHJcbiAgICAgICAgLmZpbmQoKGhpdCkgPT4gaGl0Lm9iamVjdC52aXNpYmxlKT8ub2JqZWN0O1xyXG4gICAgICBpZiAoaG92ZXJlZFRhZykge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XHJcbiAgICAgICAgdGhpcy5vYmplY3RIb3ZlcmVkJC5uZXh0KG51bGwpO1xyXG4gICAgICAgIGNvbnN0IGxhYmVsID0gaG92ZXJlZFRhZy51c2VyRGF0YS5sYWJlbDtcclxuICAgICAgICB0aGlzLnRhZ0hvdmVyZWQkLm5leHQobGFiZWwgPyB7IGxhYmVsLCBldmVudCB9IDogbnVsbCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudGFnSG92ZXJlZCQubmV4dChudWxsKTtcclxuXHJcbiAgICAgIGNvbnN0IGludGVyc2VjdHMgPSB0aGlzLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKHRoaXMuY2xpY2thYmxlT2JqZWN0cywgdHJ1ZSk7XHJcblxyXG4gICAgICBpZiAoaW50ZXJzZWN0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJztcclxuICAgICAgICBjb25zdCBpbnRlcnNlY3RlZE9iamVjdElkID0gaW50ZXJzZWN0c1swXS5vYmplY3Q/LnBhcmVudD8ubmFtZTtcclxuICAgICAgICBpZiAoaW50ZXJzZWN0ZWRPYmplY3RJZCkge1xyXG4gICAgICAgICAgICB0aGlzLm9iamVjdEhvdmVyZWQkLm5leHQoeyBpZDogaW50ZXJzZWN0ZWRPYmplY3RJZCwgZXZlbnQgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XHJcbiAgICAgICAgdGhpcy5vYmplY3RIb3ZlcmVkJC5uZXh0KG51bGwpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2dyYWJiaW5nJztcclxuICAgICAgdGhpcy5vYmplY3RIb3ZlcmVkJC5uZXh0KG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbk1vdXNlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc0RyYWdnaW5nQ2FtZXJhKSB7XHJcbiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIHRoaXMubW91c2UueCA9ICgoZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoKSAqIDIgLSAxO1xyXG4gICAgICB0aGlzLm1vdXNlLnkgPSAtKChldmVudC5jbGllbnRZIC0gcmVjdC50b3ApIC8gcmVjdC5oZWlnaHQpICogMiArIDE7XHJcblxyXG4gICAgICAvLyBBbGlnbm1lbnQgYW5kIHBsYWNlbWVudCBib3RoIHRha2UgdGhlIGNsaWNrIGJlZm9yZSBhbnl0aGluZyBjYW4gYmUgb3BlbmVkIGJ5IGl0LlxyXG4gICAgICBpZiAodGhpcy5hbGlnbmluZykge1xyXG4gICAgICAgIHRoaXMucmF5Y2FzdGVyLnNldEZyb21DYW1lcmEodGhpcy5tb3VzZSwgdGhpcy5jYW1lcmEpO1xyXG4gICAgICAgIHRoaXMuaGFuZGxlQWxpZ25tZW50Q2xpY2soZXZlbnQpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUGxhY2VtZW50IHdpbnMgb3ZlciBldmVyeXRoaW5nOiB3aGlsZSBhcm1lZCwgYSBjbGljayBtZWFucyBcInB1dCBpdCBoZXJlXCIsIG5vdCBcIm9wZW4gdGhhdFwiLlxyXG4gICAgICBpZiAodGhpcy5wbGFjaW5nVGFnKSB7XHJcbiAgICAgICAgY29uc3QgcGxhY2VtZW50ID0gdGhpcy5waWNrUGxhY2VtZW50T25Nb2RlbChldmVudCk7XHJcbiAgICAgICAgaWYgKHBsYWNlbWVudCkge1xyXG4gICAgICAgICAgcGxhY2VtZW50LnBvaVR5cGUgPSB0aGlzLnBsYWNlbWVudFBvaVR5cGU7XHJcbiAgICAgICAgICB0aGlzLnBlbmRpbmdUYWdQbGFjZW1lbnQgPSBwbGFjZW1lbnQ7XHJcbiAgICAgICAgICB0aGlzLnBsYWNpbmdUYWcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMucmVtb3ZlUGxhY2VtZW50UHJldmlldygpO1xyXG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdkZWZhdWx0JztcclxuICAgICAgICAgIHRoaXMudGFnUGxhY2VkJC5uZXh0KHBsYWNlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5yYXljYXN0ZXIuc2V0RnJvbUNhbWVyYSh0aGlzLm1vdXNlLCB0aGlzLmNhbWVyYSk7XHJcblxyXG4gICAgICAvLyBTYW1lIHByZWNlZGVuY2UgYXMgaG92ZXI6IGEgdGFnIGRyYXduIG92ZXIgdGhlIG1vZGVsIGNsYWltcyB0aGUgY2xpY2suXHJcbiAgICAgIGNvbnN0IHRhZ0hpdHMgPSB0aGlzLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKHRoaXMudGFnR3JvdXAuY2hpbGRyZW4sIGZhbHNlKVxyXG4gICAgICAgIC5maWx0ZXIoKGhpdCkgPT4gaGl0Lm9iamVjdC52aXNpYmxlKTtcclxuICAgICAgaWYgKHRhZ0hpdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNvbnN0IHRhZyA9IHRhZ0hpdHNbMF0ub2JqZWN0O1xyXG4gICAgICAgIHRoaXMudGFnQ2xpY2tlZCQubmV4dCh7IGVsZW1lbnRJZDogdGFnLm5hbWUsIHBvaVR5cGU6IHRhZy51c2VyRGF0YS5wb2lUeXBlID8/IG51bGwgfSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBpbnRlcnNlY3RzID0gdGhpcy5yYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0cyh0aGlzLmNsaWNrYWJsZU9iamVjdHMsIHRydWUpO1xyXG5cclxuICAgICAgaWYgKGludGVyc2VjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNvbnN0IGNsaWNrZWRPYmplY3QgPSBpbnRlcnNlY3RzWzBdLm9iamVjdDtcclxuICAgICAgICBjb25zdCBpZCA9IGNsaWNrZWRPYmplY3Q/LnBhcmVudD8ubmFtZTtcclxuICAgICAgICBpZiAoaWQpIHtcclxuICAgICAgICAgICAgdGhpcy5vYmplY3RDbGlja2VkJC5uZXh0KGlkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5vYmplY3RDbGlja2VkJC5uZXh0KG51bGwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2NhcGUgY2FuY2VscyB3aGF0ZXZlciB0aGUgcG9pbnRlciBpcyBjdXJyZW50bHkgY29tbWl0dGVkIHRvLlxyXG4gICAqXHJcbiAgICogRW1pdHMgdGhyb3VnaCB0aGUgc2FtZSBzdWJqZWN0cyB0aGUgZXhwbGljaXQgQ2FuY2VsIGJ1dHRvbnMgdXNlLCBzbyB0aGUgVUkgZHJpdmluZyB0aGVtIGZvbGxvd3NcclxuICAgKiBhbG9uZyBpbnN0ZWFkIG9mIGJlaW5nIGxlZnQgc2hvd2luZyBhIG1vZGUgdGhhdCBpcyBubyBsb25nZXIgYXJtZWQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBvbktleURvd24gPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkID0+IHtcclxuICAgIGlmIChldmVudC5rZXkgIT09ICdFc2NhcGUnKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnBsYWNpbmdUYWcpIHtcclxuICAgICAgLy8gTm90aGluZyBvdXRzaWRlIHRoZSBzY2VuZSB0cmFja3MgcGxhY2VtZW50LCBzbyBjbGVhcmluZyBpdCBoZXJlIGlzIHRoZSB3aG9sZSBvZiBpdC5cclxuICAgICAgdGhpcy5jYW5jZWxUYWdQbGFjZW1lbnQoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuYWxpZ25pbmcpIHtcclxuICAgICAgdGhpcy5jYW5jZWxUYWdBbGlnbm1lbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYW5pbWF0ZSA9ICgpOiB2b2lkID0+IHtcclxuICAgIHRoaXMuYW5pbWF0aW9uRnJhbWVJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGUpO1xyXG4gICAgdGhpcy5zdGVwQ2FtZXJhVHdlZW4oKTtcclxuICAgIHRoaXMuY29udHJvbHMudXBkYXRlKCk7XHJcblxyXG4gICAgLy8gT25lIHBpY2sgcGVyIGZyYW1lLCBhZ2FpbnN0IHRoZSBwb2ludGVyJ3MgbGF0ZXN0IHBvc2l0aW9uIC0gc2VlIG9uTW91c2VNb3ZlLlxyXG4gICAgaWYgKHRoaXMucGVuZGluZ1ByZXZpZXdFdmVudCkge1xyXG4gICAgICBjb25zdCBldmVudCA9IHRoaXMucGVuZGluZ1ByZXZpZXdFdmVudDtcclxuICAgICAgdGhpcy5wZW5kaW5nUHJldmlld0V2ZW50ID0gbnVsbDtcclxuICAgICAgdGhpcy51cGRhdGVQbGFjZW1lbnRQcmV2aWV3KGV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSk7XHJcbiAgfVxyXG5cclxuICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuYW5pbWF0aW9uRnJhbWVJZCkge1xyXG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGlvbkZyYW1lSWQpO1xyXG4gICAgfVxyXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLm9uS2V5RG93bik7XHJcbiAgICBpZiAodGhpcy5jYW52YXNSZXNpemVPYnNlcnZlcikge1xyXG4gICAgICB0aGlzLmNhbnZhc1Jlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgdGhpcy5jYW52YXNSZXNpemVPYnNlcnZlciA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICAgIHRoaXMuZGlzY2FyZEN1cnJlbnRMb2FkKCk7XHJcbiAgICB0aGlzLmNsZWFyVGFncygpO1xyXG4gICAgaWYgKHRoaXMucmVuZGVyZXIpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5kaXNwb3NlKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jb250cm9scykge1xyXG4gICAgICB0aGlzLmNvbnRyb2xzLmRpc3Bvc2UoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
|