@netgrif/components-core 6.0.3 → 6.0.4
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/bundles/netgrif-components-core.umd.js +166 -61
- package/bundles/netgrif-components-core.umd.js.map +1 -1
- package/bundles/netgrif-components-core.umd.min.js +2 -2
- package/bundles/netgrif-components-core.umd.min.js.map +1 -1
- package/esm2015/lib/data-fields/file-field/abstract-file-field.component.js +2 -2
- package/esm2015/lib/groups/services/next-group.service.js +3 -2
- package/esm2015/lib/resources/abstract-endpoint/abstract-resource.service.js +3 -2
- package/esm2015/lib/resources/engine-endpoint/public/public-task-resource.service.js +1 -1
- package/esm2015/lib/search/models/category/case/case-dataset.js +3 -6
- package/esm2015/lib/search/models/category/case/case-simple-dataset.js +3 -3
- package/esm2015/lib/search/models/category/case/case-title.js +13 -3
- package/esm2015/lib/search/models/category/case/case-visual-id.js +13 -3
- package/esm2015/lib/search/models/category/category.js +10 -2
- package/esm2015/lib/search/models/operator/substring.js +3 -3
- package/esm2015/lib/search/search-keyword-resolver-service/search-index-resolver.service.js +18 -3
- package/esm2015/lib/search/search-service/search.service.js +3 -2
- package/esm2015/lib/side-menu/content-components/new-case/abstract-new-case.component.js +6 -1
- package/esm2015/lib/task/services/finish-task.service.js +18 -13
- package/esm2015/lib/task/services/task-data.service.js +2 -1
- package/esm2015/lib/user/services/user-list.service.js +4 -3
- package/esm2015/lib/utility/pagination/load-all-pages.js +4 -3
- package/esm2015/lib/utility/pagination/pagination-params.js +19 -0
- package/esm2015/lib/utility/pagination/pagination-sort.js +17 -0
- package/esm2015/lib/utility/public-api.js +3 -1
- package/esm2015/lib/utility/tests/mocks/mock-endpoint.js +4 -3
- package/esm2015/lib/view/abstract/sortable-view.js +4 -3
- package/esm2015/lib/view/case-view/service/case-view-service.js +6 -4
- package/esm2015/lib/view/public-api.js +3 -1
- package/esm2015/lib/view/task-view/service/task-view.service.js +6 -4
- package/esm2015/lib/view/tree-case-view/tree-component/case-tree.service.js +19 -5
- package/esm2015/lib/view/tree-case-view/tree-component/model/tree-case-view-configuration.js +2 -0
- package/esm2015/lib/view/tree-case-view/tree-component/model/tree-configuration-injection-token.js +3 -0
- package/esm2015/lib/view/workflow-view/workflow-view.service.js +4 -11
- package/esm5/lib/data-fields/file-field/abstract-file-field.component.js +2 -2
- package/esm5/lib/groups/services/next-group.service.js +3 -2
- package/esm5/lib/resources/abstract-endpoint/abstract-resource.service.js +3 -2
- package/esm5/lib/resources/engine-endpoint/public/public-task-resource.service.js +1 -1
- package/esm5/lib/search/models/category/case/case-dataset.js +3 -6
- package/esm5/lib/search/models/category/case/case-simple-dataset.js +3 -3
- package/esm5/lib/search/models/category/case/case-title.js +19 -4
- package/esm5/lib/search/models/category/case/case-visual-id.js +19 -4
- package/esm5/lib/search/models/category/category.js +10 -2
- package/esm5/lib/search/models/operator/substring.js +3 -3
- package/esm5/lib/search/search-keyword-resolver-service/search-index-resolver.service.js +17 -2
- package/esm5/lib/search/search-service/search.service.js +3 -2
- package/esm5/lib/side-menu/content-components/new-case/abstract-new-case.component.js +6 -1
- package/esm5/lib/task/services/finish-task.service.js +18 -13
- package/esm5/lib/task/services/task-data.service.js +2 -1
- package/esm5/lib/user/services/user-list.service.js +4 -3
- package/esm5/lib/utility/pagination/load-all-pages.js +4 -3
- package/esm5/lib/utility/pagination/pagination-params.js +19 -0
- package/esm5/lib/utility/pagination/pagination-sort.js +17 -0
- package/esm5/lib/utility/public-api.js +3 -1
- package/esm5/lib/utility/tests/mocks/mock-endpoint.js +4 -3
- package/esm5/lib/view/abstract/sortable-view.js +4 -3
- package/esm5/lib/view/case-view/service/case-view-service.js +6 -4
- package/esm5/lib/view/public-api.js +3 -1
- package/esm5/lib/view/task-view/service/task-view.service.js +6 -4
- package/esm5/lib/view/tree-case-view/tree-component/case-tree.service.js +19 -5
- package/esm5/lib/view/tree-case-view/tree-component/model/tree-case-view-configuration.js +2 -0
- package/esm5/lib/view/tree-case-view/tree-component/model/tree-configuration-injection-token.js +3 -0
- package/esm5/lib/view/workflow-view/workflow-view.service.js +4 -11
- package/fesm2015/netgrif-components-core.js +154 -61
- package/fesm2015/netgrif-components-core.js.map +1 -1
- package/fesm5/netgrif-components-core.js +165 -62
- package/fesm5/netgrif-components-core.js.map +1 -1
- package/lib/search/models/category/case/case-dataset.d.ts +0 -2
- package/lib/search/models/category/case/case-title.d.ts +4 -1
- package/lib/search/models/category/case/case-visual-id.d.ts +4 -1
- package/lib/search/models/category/category.d.ts +7 -0
- package/lib/search/search-keyword-resolver-service/search-index-resolver.service.d.ts +12 -0
- package/lib/side-menu/content-components/new-case/abstract-new-case.component.d.ts +1 -0
- package/lib/task/services/finish-task.service.d.ts +5 -0
- package/lib/utility/pagination/pagination-params.d.ts +17 -0
- package/lib/utility/pagination/pagination-sort.d.ts +13 -0
- package/lib/utility/public-api.d.ts +2 -0
- package/lib/view/public-api.d.ts +2 -0
- package/lib/view/tree-case-view/tree-component/case-tree.service.d.ts +4 -1
- package/lib/view/tree-case-view/tree-component/model/tree-case-view-configuration.d.ts +9 -0
- package/lib/view/tree-case-view/tree-component/model/tree-configuration-injection-token.d.ts +3 -0
- package/lib/view/workflow-view/workflow-view.service.d.ts +0 -1
- package/netgrif-components-core.metadata.json +1 -1
- package/package.json +2 -2
- package/schematics/collection.json +0 -3
|
@@ -232,7 +232,7 @@ export class Category {
|
|
|
232
232
|
if (!this.isOperatorSelected()) {
|
|
233
233
|
throw new Error('Category cannot generate a Query if no Operator is selected');
|
|
234
234
|
}
|
|
235
|
-
return this._operatorFormControl.value.createQuery(this.
|
|
235
|
+
return this._operatorFormControl.value.createQuery(this.elasticKeywords, userInput);
|
|
236
236
|
}
|
|
237
237
|
/**
|
|
238
238
|
* Calls the [generateQuery]{@link Category#generateQuery} method and creates an {@link ElementaryPredicate} with the result.
|
|
@@ -516,9 +516,17 @@ export class Category {
|
|
|
516
516
|
}
|
|
517
517
|
return { segment, bold: true };
|
|
518
518
|
}
|
|
519
|
+
/**
|
|
520
|
+
* Checks for selected operator
|
|
521
|
+
* @param operatorClass the operator to be checked
|
|
522
|
+
* @return boolean of the statement
|
|
523
|
+
*/
|
|
524
|
+
isSelectedOperator(operatorClass) {
|
|
525
|
+
return this.selectedOperator === this._operatorService.getOperator(operatorClass);
|
|
526
|
+
}
|
|
519
527
|
}
|
|
520
528
|
/**
|
|
521
529
|
* The {@link CategoryMetadataConfiguration} key for this Category's {@link Operator}
|
|
522
530
|
*/
|
|
523
531
|
Category.OPERATOR_METADATA = 'operator';
|
|
524
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F0ZWdvcnkuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbmV0Z3JpZi9jb21wb25lbnRzLWNvcmUvIiwic291cmNlcyI6WyJsaWIvc2VhcmNoL21vZGVscy9jYXRlZ29yeS9jYXRlZ29yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFHOUMsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDdEUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUMsZUFBZSxFQUFFLFFBQVEsRUFBYyxFQUFFLEVBQUUsYUFBYSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzlFLE9BQU8sRUFBQyxZQUFZLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2pFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQy9ELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBQzFFLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBSzFELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUVoRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUV6Rjs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sT0FBZ0IsUUFBUTtJQTZDMUI7Ozs7Ozs7Ozs7T0FVRztJQUNILFlBQXlDLGdCQUErQixFQUMvQixpQkFBdUMsRUFDMUMsZUFBdUIsRUFDcEIsVUFBMkIsRUFDcEMsSUFBbUIsRUFDbkIsZ0JBQWlDO1FBTHhCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBZTtRQUMvQixzQkFBaUIsR0FBakIsaUJB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O0lBQ08sOEJBQThCLENBQUMsWUFBb0I7UUFDekQsSUFBSSxPQUFPLENBQUM7UUFDWixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsWUFBWSxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQy9ELFFBQVEsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNwQixLQUFLLGVBQWUsQ0FBQyxZQUFZO2dCQUM3QixPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDdkIsTUFBTTtZQUNWLEtBQUssZUFBZSxDQUFDLElBQUk7Z0JBQ3JCLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBQzdDLE1BQU07WUFDVixLQUFLLGVBQWUsQ0FBQyxTQUFTO2dCQUMxQixPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO2dCQUNsRCxNQUFNO1lBQ1Y7Z0JBQ0ksT0FBTyxHQUFHLE9BQU8sQ0FBQztnQkFDbEIsTUFBTTtTQUNiO1FBQ0QsT0FBTyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFDLENBQUM7SUFDakMsQ0FBQzs7QUF0bkJEOztHQUVHO0FBQ3VCLDBCQUFpQixHQUFHLFVBQVUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7T3BlcmF0b3J9IGZyb20gJy4uL29wZXJhdG9yL29wZXJhdG9yJztcbmltcG9ydCB7TG9nZ2VyU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vbG9nZ2VyL3NlcnZpY2VzL2xvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7UXVlcnl9IGZyb20gJy4uL3F1ZXJ5L3F1ZXJ5JztcbmltcG9ydCB7RWxlbWVudGFyeVByZWRpY2F0ZX0gZnJvbSAnLi4vcHJlZGljYXRlL2VsZW1lbnRhcnktcHJlZGljYXRlJztcbmltcG9ydCB7U2VhcmNoSW5wdXRUeXBlfSBmcm9tICcuL3NlYXJjaC1pbnB1dC10eXBlJztcbmltcG9ydCB7Rm9ybUNvbnRyb2x9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgb2YsIFJlcGxheVN1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIGRlZmF1bHRJZkVtcHR5LCBtYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7T3BlcmF0b3JUZW1wbGF0ZVBhcnR9IGZyb20gJy4uL29wZXJhdG9yLXRlbXBsYXRlLXBhcnQnO1xuaW1wb3J0IHtJbmNyZW1lbnRpbmdDb3VudGVyfSBmcm9tICcuLi8uLi8uLi91dGlsaXR5L2luY3JlbWVudGluZy1jb3VudGVyJztcbmltcG9ydCB7Q29uZmlndXJhdGlvbklucHV0fSBmcm9tICcuLi9jb25maWd1cmF0aW9uLWlucHV0JztcbmltcG9ydCB7Q2F0ZWdvcnlHZW5lcmF0b3JNZXRhZGF0YSwgQ2F0ZWdvcnlNZXRhZGF0YUNvbmZpZ3VyYXRpb259IGZyb20gJy4uL3BlcnNpc3RhbmNlL2dlbmVyYXRvci1tZXRhZGF0YSc7XG5pbXBvcnQge0NhdGVnb3JpZXN9IGZyb20gJy4vY2F0ZWdvcmllcyc7XG5pbXBvcnQge09wZXJhdG9yU2VydmljZX0gZnJvbSAnLi4vLi4vb3BlcmF0b3Itc2VydmljZS9vcGVyYXRvci5zZXJ2aWNlJztcbmltcG9ydCB7T3BlcmF0b3JzfSBmcm9tICcuLi9vcGVyYXRvci9vcGVyYXRvcnMnO1xuaW1wb3J0IHtvZlZvaWR9IGZyb20gJy4uLy4uLy4uL3V0aWxpdHkvb2Ytdm9pZCc7XG5pbXBvcnQge0ZpbHRlclRleHRTZWdtZW50fSBmcm9tICcuLi9wZXJzaXN0YW5jZS9maWx0ZXItdGV4dC1zZWdtZW50JztcbmltcG9ydCB7REFURV9GT1JNQVRfU1RSSU5HLCBEQVRFX1RJTUVfRk9STUFUX1NUUklOR30gZnJvbSAnLi4vLi4vLi4vbW9tZW50L3RpbWUtZm9ybWF0cyc7XG5cbi8qKlxuICogVGhlIHRvcCBsZXZlbCBvZiBhYnN0cmFjdGlvbiBpbiBzZWFyY2ggcXVlcnkgZ2VuZXJhdGlvbi4gUmVwcmVzZW50cyBhIHNldCBvZiBpbmRleGVkIGZpZWxkcyB0aGF0IGNhbiBiZSBzZWFyY2hlZC5cbiAqIEVuY2Fwc3VsYXRlcyB0aGUgdGhlIHN0YXRlIGFuZCBsb2dpYyBvZiB0aGUgcXVlcnkgY29uc3RydWN0aW9uIHByb2Nlc3MuXG4gKlxuICogQXMgb3Bwb3NlZCB0byB7QGxpbmsgT3BlcmF0b3J9cyBDYXRlZ29yaWVzIGFyZSBub3Qgc3RhdGVsZXNzIGFuZCBzaG91bGRuJ3QgYmUgc2hhcmVkLlxuICogQSBzaW5nbGUgQ2F0ZWdvcnkgaW5zdGFuY2UgaXMgY2FwYWJsZSBvZiBob2xkaW5nIHRoZSBzdGF0ZSBvZiBvbmUge0BsaW5rIEVkaXRhYmxlUHJlZGljYXRlfSxcbiAqIG9yIGNhbiBiZSB1c2VkIGFzIGEgYnVpbGRlciB0byBmb3JtIGFuIHVubGltaXRlZCBhbW91bnQgb2YgW0VsZW1lbnRhcnlQcmVkaWNhdGVzXXtAbGluayBFbGVtZW50YXJ5UHJlZGljYXRlfS5cbiAqXG4gKiBZb3UgY2FuIHVzZSB7QGxpbmsgQ2F0ZWdvcnlGYWN0b3J5fSB0byBnZXQgaW5zdGFuY2VzIG9mIENhdGVnb3J5IGNsYXNzZXMuXG4gKiBBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gdXNlIHRoZSBbY2xvbmUoKV17QExpbmsgQ2F0ZWdvcnkjY2xvbmV9IG1ldGhvZCB0byBkdXBsaWNhdGUgYW4gZXhpc3RpbmcgaW5zdGFuY2UuXG4gKlxuICogSWYgeW91IHdhbnQgdG8gbWFrZSB5b3VyIG93biBDYXRlZ29yeSBjbGFzcyB5b3UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY29uc3RydWN0b3IgdGFrZXMge0BsaW5rIE9wZXJhdG9yU2VydmljZX0gYXMgaXQncyBmaXJzdFxuICogYXJndW1lbnQgYW5kIHtAbGluayBMb2dnZXJTZXJ2aWNlfSBhcyBpdCdzIHNlY29uZCBhcmd1bWVudC4gQWx0ZXJuYXRpdmVseSB5b3UgY2FuIG1ha2UgeW91ciBvd24gaW1wbGVtZW50YXRpb24gb2YgdGhlXG4gKiB7QGxpbmsgQ2F0ZWdvcnlGYWN0b3J5fSBzbywgdGhhdCB5b3VyIHN0eWxlIG9mIGNvbnN0cnVjdG9ycyBpcyBzdXBwb3J0ZWQuXG4gKlxuICogQHR5cGVwYXJhbSBUIHR5cGUgb2Ygb2JqZWN0cyB0aGUgY2F0ZWdvcnkgZXhwZWN0cyB0byBnZW5lcmF0ZSBxdWVyaWVzIGZyb21cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENhdGVnb3J5PFQ+IHtcblxuICAgIC8qKlxuICAgICAqIFRoZSB7QGxpbmsgQ2F0ZWdvcnlNZXRhZGF0YUNvbmZpZ3VyYXRpb259IGtleSBmb3IgdGhpcyBDYXRlZ29yeSdzIHtAbGluayBPcGVyYXRvcn1cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc3RhdGljIHJlYWRvbmx5IE9QRVJBVE9SX01FVEFEQVRBID0gJ29wZXJhdG9yJztcblxuICAgIC8qKlxuICAgICAqIENvbnRhaW5zIHRoZSBgRm9ybUNvbnRyb2xgIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gZHJpdmUgdGhlIG9wZXJhdG9yIHNlbGVjdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSBjYXRlZ29yeSBjYW4gc3Vic2NyaWJlIHRvIGl0IGlmIGl0IHdpc2hlcyB0byByZWFjdCB0byB0aGUgc2VsZWN0aW9uIGNoYW5nZSBieSB0aGUgdXNlci5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX29wZXJhdG9yRm9ybUNvbnRyb2w6IEZvcm1Db250cm9sO1xuXG4gICAgLyoqXG4gICAgICogU3RvcmVzIHRoZSBgRm9ybUNvbnRyb2xgIG9iamVjdHMgdGhhdCBhcmUgcHVzaGVkIGludG8gdGhlIG9ic2VydmFibGUgd2hlbiB0aGUgbnVtYmVyIG9mIG9wZXJhbmRzIGNoYW5nZXMuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9vcGVyYW5kc0Zvcm1Db250cm9sczogQXJyYXk8Rm9ybUNvbnRyb2w+O1xuXG4gICAgLyoqXG4gICAgICogQ29udGFpbnMgdGhlIGBGb3JtQ29udHJvbGAgb2JqZWN0cyB0aGF0IGNhbiBiZSB1c2VkIHRvIGlucHV0IHNlYXJjaCBhcmd1bWVudHMuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9vcGVyYW5kc0Zvcm1Db250cm9scyQ6IFJlcGxheVN1YmplY3Q8QXJyYXk8Rm9ybUNvbnRyb2w+IHwgdW5kZWZpbmVkPjtcblxuICAgIC8qKlxuICAgICAqIENvbnRhaW5zIHRoZSBvcGVyYXRvciB0ZW1wbGF0ZSBwYXJ0cyB0aGF0IG1ha2UgdXAgdGhlIG9wZXJhbmRzIEdVSS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX29wZXJhdG9yVGVtcGxhdGUkOiBCZWhhdmlvclN1YmplY3Q8QXJyYXk8T3BlcmF0b3JUZW1wbGF0ZVBhcnQ+IHwgdW5kZWZpbmVkPjtcblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBJRHMgZm9yIHRlbXBsYXRlIHBhcnRzIHN1cHBsaWVkIHRvIG5nIGZvci5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3RyYWNrQnlJZEdlbmVyYXRvcjogSW5jcmVtZW50aW5nQ291bnRlcjtcblxuICAgIC8qKlxuICAgICAqIEVtaXQgYSBuZXcgYFByZWRpY2F0ZWAgaWYgdGhlIGBDYXRlZ29yeWAgaXMgaW4gYSBzdGF0ZSB0aGF0IGl0IGNhbiBiZSBjcmVhdGVkLlxuICAgICAqIEVtaXRzIGB1bmRlZmluZWRgIGlmIHRoZSBgQ2F0ZWdvcnlgIGlzIG5vdCBpbiBzdWNoIHN0YXRlLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZ2VuZXJhdGVkUHJlZGljYXRlJDogQmVoYXZpb3JTdWJqZWN0PEVsZW1lbnRhcnlQcmVkaWNhdGUgfCB1bmRlZmluZWQ+O1xuXG4gICAgLyoqXG4gICAgICogVXRpbGl0eSB2YXJpYWJsZSB0aGF0IGNhbiBiZSB1c2VkIGFzIHZhbHVlIGZvciB0aGUgW2NvbmZpZ3VyYXRpb25JbnB1dHMkXXtAbGluayBDYXRlZ29yeSNjb25maWd1cmF0aW9uSW5wdXRzJH0gYE9ic2VydmFibGVgLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfT1BFUkFUT1JfSU5QVVQ6IENvbmZpZ3VyYXRpb25JbnB1dDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjb25zdHJ1Y3RvciBmaWxscyB0aGUgdmFsdWVzIG9mIGFsbCBwcm90ZWN0ZWQgZmllbGRzIGFuZCB0aGVuIGNhbGxzIHRoZSBbaW5pdGlhbGl6ZUNhdGVnb3J5KClde0BsaW5rIENhdGVnb3J5I2luaXRpYWxpemVDYXRlZ29yeX1cbiAgICAgKiBtZXRob2QuIElmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSBjYXRlZ29yeSBjcmVhdGlvbiBiZWhhdmlvciBvdmVycmlkZSB0aGF0IG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBfZWxhc3RpY0tleXdvcmRzIEVsYXN0aWNzZWFyY2gga2V5d29yZHMgdGhhdCBzaG91bGQgYmUgcXVlcmllZCBieSBxdWVyaWVzIGdlbmVyYXRlZCB3aXRoIHRoaXMgY2F0ZWdvcnlcbiAgICAgKiBAcGFyYW0gX2FsbG93ZWRPcGVyYXRvcnMgT3BlcmF0b3JzIHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGVkIHF1ZXJpZXMgb24gdGhlIGFib3ZlIGtleXdvcmRzXG4gICAgICogQHBhcmFtIHRyYW5zbGF0aW9uUGF0aCBwYXRoIHRvIHRoZSB0cmFuc2xhdGlvbiBzdHJpbmdcbiAgICAgKiBAcGFyYW0gX2lucHV0VHlwZSBpbnB1dCBmaWVsZCB0eXBlIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gZW50ZXIgb3BlcmF0b3IgYXJndW1lbnRzIGZvciB0aGlzIGNhdGVnb3J5XG4gICAgICogQHBhcmFtIF9sb2cgdXNlZCB0byByZWNvcmQgaW5mb3JtYXRpb24gYWJvdXQgaW5jb3JyZWN0IHVzZSBvZiB0aGlzIGNsYXNzXG4gICAgICogQHBhcmFtIF9vcGVyYXRvclNlcnZpY2UgdXNlZCB0byByZXNvbHZlIHNlcmlhbGl6ZWQgb3BlcmF0b3JzIGR1cmluZyBkZXNlcmlhbGl6YXRpb25cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IF9lbGFzdGljS2V5d29yZHM6IEFycmF5PHN0cmluZz4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCByZWFkb25seSBfYWxsb3dlZE9wZXJhdG9yczogQXJyYXk8T3BlcmF0b3I8YW55Pj4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyByZWFkb25seSB0cmFuc2xhdGlvblBhdGg6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9pbnB1dFR5cGU6IFNlYXJjaElucHV0VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9sb2c6IExvZ2dlclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfb3BlcmF0b3JTZXJ2aWNlOiBPcGVyYXRvclNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5fT1BFUkFUT1JfSU5QVVQgPSBuZXcgQ29uZmlndXJhdGlvbklucHV0KFxuICAgICAgICAgICAgU2VhcmNoSW5wdXRUeXBlLk9QRVJBVE9SLFxuICAgICAgICAgICAgJ3NlYXJjaC5vcGVyYXRvci5uYW1lJyxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgbmV3IE1hcDxzdHJpbmcsIEFycmF5PHVua25vd24+PigpLFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29uZmlndXJhdGlvbklucHV0IG9mIHR5cGUgT1BFUkFUT1IgaXMgYSBwbGFjZWhvbGRlciEnXG4gICAgICAgICAgICAgICAgICAgICsgJyBVc2Ugb3BlcmF0b3IgcmVsYXRlZCBtZXRob2RzIGZyb20gdGhlIENhdGVnb3J5IGNsYXNzIGluc3RlYWQuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5fb3BlcmF0b3JGb3JtQ29udHJvbCA9IHRoaXMuX09QRVJBVE9SX0lOUFVULmZvcm1Db250cm9sO1xuICAgICAgICB0aGlzLl9vcGVyYW5kc0Zvcm1Db250cm9scyQgPSBuZXcgUmVwbGF5U3ViamVjdDxBcnJheTxGb3JtQ29udHJvbD4gfCB1bmRlZmluZWQ+KDEpO1xuICAgICAgICB0aGlzLl9vcGVyYXRvclRlbXBsYXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXJyYXk8T3BlcmF0b3JUZW1wbGF0ZVBhcnQ+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLl9vcGVyYW5kc0Zvcm1Db250cm9scyA9IFtdO1xuICAgICAgICB0aGlzLl90cmFja0J5SWRHZW5lcmF0b3IgPSBuZXcgSW5jcmVtZW50aW5nQ291bnRlcigpO1xuICAgICAgICB0aGlzLl9nZW5lcmF0ZWRQcmVkaWNhdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxFbGVtZW50YXJ5UHJlZGljYXRlIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVDYXRlZ29yeSgpO1xuXG4gICAgICAgIHRoaXMub3BlcmFuZHNGb3JtQ29udHJvbHMkLnBpcGUoXG4gICAgICAgICAgICBtYXAoZm9ybUNvbnRyb2xzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWZvcm1Db250cm9scykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gdGhpcy5zZWxlY3RlZE9wZXJhdG9yLmdldE9wZXJhdG9yTmFtZVRlbXBsYXRlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmNzID0gWy4uLmZvcm1Db250cm9sc107XG4gICAgICAgICAgICAgICAgbGV0IGZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFydHMubWFwKHBhcnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IG5ldyBPcGVyYXRvclRlbXBsYXRlUGFydChwYXJ0ID8gcGFydCA6IGZjcy5zaGlmdCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhY2tCeUlkR2VuZXJhdG9yLm5leHQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQgPyB1bmRlZmluZWQgOiBmaXJzdCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApLnN1YnNjcmliZSh0ZW1wbGF0ZSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9vcGVyYXRvclRlbXBsYXRlJC5uZXh0KHRlbXBsYXRlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYW5zIHVwIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgb2JqZWN0IGJlZm9yZSBpdHMgZGVzdHJ1Y3Rpb24uXG4gICAgICpcbiAgICAgKiBUaGUgZGV2ZWxvcGVyIG11c3QgY2FsbCB0aGlzIG1ldGhvZCBhdCBhbiBhcHByb3ByaWF0ZSBtb21lbnQsIGFzIHRoaXMgb2JqZWN0IGNhbm5vdCBob29rIGludG8gdGhlIEFuZ3VsYXIgbGlmZWN5Y2xlLlxuICAgICAqL1xuICAgIHB1YmxpYyBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vcGVyYW5kc0Zvcm1Db250cm9scyQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5fb3BlcmF0b3JUZW1wbGF0ZSQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5fZ2VuZXJhdGVkUHJlZGljYXRlJC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyYXRpb24gaW5wdXQgcmVwcmVzZW50IHRoZSBzdGVwcyB0aGF0IGFyZSBuZWNlc3NhcnkgdG8gY29uZmlndXJlIHRoZSBjYXRlZ29yeS5cbiAgICAgKiBUaGUgbGFzdCBpbnB1dCBtdXN0IGFsd2F5cyBiZSBvZiB0eXBlIFtPUEVSQVRPUl17QGxpbmsgU2VhcmNoSW5wdXRUeXBlI09QRVJBVE9SfS5cbiAgICAgKiBTZWxlY3RpbmcgdGhlIG9wZXJhdG9yIGNvbXBsZXRlcyB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgY2F0ZWdvcnkgYW5kIHRoZSBhcmd1bWVudHMgaW5wdXRzXG4gICAgICogKGJhc2VkIG9uIGNhdGVnb3J5IGlucHV0IHR5cGUgYW5kIG9wZXJhdG9yIGFyaXR5KSBhcmUgZGlzcGxheWVkLlxuICAgICAqXG4gICAgICogQmV3YXJlIHRoYXQgd2hpbGUgbW9zdCBjYXRlZ29yaWVzIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgY29uc3RhbnQgaXQgbXVzdCBub3QgYWx3YXlzIGJlIHRoZSBjYXNlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgdGhlIHJlcXVpcmVkIGlucHV0IHR5cGUgZm9yIGNvbmZpZ3VyYXRpb24gc3RlcHMgb2YgdGhpcyBjYXRlZ29yeVxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXQgY29uZmlndXJhdGlvbklucHV0cyQoKTogT2JzZXJ2YWJsZTxBcnJheTxDb25maWd1cmF0aW9uSW5wdXQ+PjtcblxuICAgIC8qKlxuICAgICAqIElmIHlvdSB1c2UgdGhlIGBDYXRlZ29yeWAgY2xhc3MgYXMgYSBzb3J0IG9mIFByZWRpY2F0ZUJ1aWxkZXIsIHRoZW4geW91IHdhbnQgdG8gdXNlIHRoZVxuICAgICAqIFtnZW5lcmF0ZVByZWRpY2F0ZSgpXXtAbGluayBDYXRlZ29yeSNnZW5lcmF0ZVByZWRpY2F0ZX0gbWV0aG9kIGluc3RlYWQuXG4gICAgICpcbiAgICAgKiBUaGlzIHN0cmVhbSBwdWJsaXNoZXMgZWl0aGVyIGEgbmV3IGBQcmVkaWNhdGVgIG9iamVjdCBvciBgdW5kZWZpbmVkYCBiYXNlZCBvbiBjaGFuZ2VzIHRvIHRoZSBgRm9ybUNvbnRyb2xzYCB0aGF0IGFyZVxuICAgICAqIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4gSWYgKGJhc2VkIG9uIHVzZXIgaW5wdXQpIHRoZSBgQ2F0ZWdvcnlgIHJlYWNoZXMgYSBzdGF0ZSB3aGVuIGNvbnN0cnVjdGlvbiBvZiBhIGBQcmVkaWNhdGVgIGlzIHBvc3NpYmxlXG4gICAgICogaXQgd2lsbCBlbWl0IHRoaXMgYFByZWRpY2F0ZWAuIElmIGl0IHJlYWNoZXMgYSBzdGF0ZSB3aGVuIHRoZSBgUHJlZGljYXRlYCBjYW4gbm90IGxvbmdlciBiZSBjcmVhdGVkIGB1bmRlZmluZWRgIGlzIGVtaXR0ZWQuXG4gICAgICovXG4gICAgcHVibGljIGdldCBnZW5lcmF0ZWRQcmVkaWNhdGUkKCk6IE9ic2VydmFibGU8RWxlbWVudGFyeVByZWRpY2F0ZSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2VuZXJhdGVkUHJlZGljYXRlJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgUHJlZGljYXRlfSBjdXJyZW50bHkgZ2VuZXJhdGVkIGJ5IHRoZSBDYXRlZ29yeS5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSBbZ2VuZXJhdGVkUHJlZGljYXRlJF17QGxpbmsgQ2F0ZWdvcnkjZ2VuZXJhdGVkUHJlZGljYXRlJH0uXG4gICAgICovXG4gICAgcHVibGljIGdldCBnZW5lcmF0ZWRQcmVkaWNhdGUoKTogRWxlbWVudGFyeVByZWRpY2F0ZSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZW5lcmF0ZWRQcmVkaWNhdGUkLmdldFZhbHVlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQmV3YXJlIHRoYXQgd2hpbGUgbW9zdCBjYXRlZ29yaWVzIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgY29uc3RhbnQgaXQgaXMgbm90IGEgcmVxdWlyZW1lbnQuXG4gICAgICogQW4gZXhhbXBsZSBmb3Igc3VjaCBiZWhhdmlvciBpcyB0aGUge0BsaW5rIENhc2VEYXRhc2V0fSBjYXRlZ29yeSwgd2hlcmUgdGhlIGFyZ3VtZW50IGlucHV0IHR5cGUgZGVwZW5kc1xuICAgICAqIG9uIHRoZSBzZWxlY3RlZCBkYXRhIGZpZWxkIHR5cGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB0aGUgcmVxdWlyZWQgaW5wdXQgdHlwZSBmb3IgYXJndW1lbnRzIGZvciB0aGlzIGNhdGVnb3J5XG4gICAgICovXG4gICAgcHVibGljIGdldCBpbnB1dFR5cGUoKTogU2VhcmNoSW5wdXRUeXBlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lucHV0VHlwZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB0aGUgc2V0IG9mIE9wZXJhdG9ycyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggdGhpcyBjYXRlZ29yeS4gSXRlcmF0aW9uIG9yZGVyIGRldGVybWluZXMgdGhlIGRpc3BsYXkgb3JkZXIuXG4gICAgICovXG4gICAgcHVibGljIGdldCBhbGxvd2VkT3BlcmF0b3JzKCk6IEFycmF5PE9wZXJhdG9yPGFueT4+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIHJlc3VsdC5wdXNoKC4uLnRoaXMuX2FsbG93ZWRPcGVyYXRvcnMpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgb3BlcmF0b3Igb3IgYHVuZGVmaW5lZGAgaWYgbm8gb3BlcmF0b3IgaXMgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgcHVibGljIGdldCBzZWxlY3RlZE9wZXJhdG9yKCk6IE9wZXJhdG9yPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3BlcmF0b3JGb3JtQ29udHJvbC52YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBhbiBhcnJheSBvZiBgRm9ybUNvbnRyb2xgIG9iamVjdHMgdGhhdCBjb250YWlucyBhcyBtYW55IGNvbnRyb2xzIGFzIGlzIHRoZSBhcml0eSBvZiB0aGUgc2VsZWN0ZWQgb3BlcmF0b3IuXG4gICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBtdWx0aXBsZSB0aW1lcyB3aWxsIHJldHVybiB0aGUgc2FtZSBgRm9ybUNvbnRyb2xgIGluc3RhbmNlcy5cbiAgICAgKiBXaGVuIG5vIG9wZXJhdG9yIGlzIHNlbGVjdGVkIGB1bmRlZmluZWRgIGlzIGVtaXR0ZWQuXG4gICAgICovXG4gICAgcHVibGljIGdldCBvcGVyYW5kc0Zvcm1Db250cm9scyQoKTogT2JzZXJ2YWJsZTxBcnJheTxGb3JtQ29udHJvbD4gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wZXJhbmRzRm9ybUNvbnRyb2xzJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIG5ldyB2YWx1ZSBpcyBlbWl0dGVkIHdoZW5ldmVyIHRoZSBzZWxlY3RlZCBvcGVyYXRvciBjaGFuZ2VzLiBgdW5kZWZpbmVkYCBpcyBlbWl0dGVkIGlmIG5vIG9wZXJhdG9yIGlzIHNlbGVjdGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgW29wZXJhdG9ycyB0ZW1wbGF0ZV17QGxpbmsgT3BlcmF0b3IjZ2V0T3BlcmF0b3JOYW1lVGVtcGxhdGV9IGluIHByb2Nlc3NlZCBmb3JtIGZpdCBmb3IgR1VJIHJlbmRlcmluZ1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgb3BlcmF0b3JUZW1wbGF0ZSQoKTogT2JzZXJ2YWJsZTxBcnJheTxPcGVyYXRvclRlbXBsYXRlUGFydD4gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wZXJhdG9yVGVtcGxhdGUkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHdoZXRoZXIgdGhlIGNhdGVnb3J5IGlzIGZ1bGx5IGNvbmZpZ3VyZWQgYW5kIHJlcHJlc2VudHMgYSB2YWxpZCBwcmVkaWNhdGUgb3Igbm90XG4gICAgICovXG4gICAgcHVibGljIGdldCBwcm92aWRlc1ByZWRpY2F0ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZ2VuZXJhdGVkUHJlZGljYXRlJC5nZXRWYWx1ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHRoZSBzZXQgb2YgRWxhc3RpY3NlYXJjaCBrZXl3b3JkcyB0aGF0IHNob3VsZCBiZSBxdWVyaWVkIGJ5IHF1ZXJpZXMgZ2VuZXJhdGVkIHdpdGggdGhpcyBjYXRlZ29yeS5cbiAgICAgKiBUaGUgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGlmIHRoZSBrZXl3b3JkcyBhcmUgbm90IHN0YXRpYyBhbmQgY2hhbmdlIGJhc2VkIG9uIHNvbWUgYWRkaXRpb25hbCBzZWxlY3Rpb24gKGVnLiBEYXRhIGZpZWxkcylcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0IGVsYXN0aWNLZXl3b3JkcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIHJlc3VsdC5wdXNoKC4uLnRoaXMuX2VsYXN0aWNLZXl3b3Jkcyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgdGhlIGFyaXR5IG9mIHRoZSBzZWxlY3RlZCBvcGVyYXRvci4gVGhyb3dzIGFuIGVycm9yIGlmIG5vIG9wZXJhdG9yIGlzIHNlbGVjdGVkLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXQgc2VsZWN0ZWRPcGVyYXRvckFyaXR5KCk6IG51bWJlciB7XG4gICAgICAgIGlmICghdGhpcy5pc09wZXJhdG9yU2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbiBvcGVyYXRvciBtdXMgYmUgc2VsZWN0ZWQgYmVmb3JlIGl0cyBhcml0eSBjYW4gYmUgcmVzb2x2ZWQhJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRPcGVyYXRvci5udW1iZXJPZk9wZXJhbmRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIHN0YXRlIG9mIHRoZSBDYXRlZ29yeS4gQ2F0ZWdvcnkgY2FuIGNyZWF0ZSBxdWVyaWVzIHdoZW4gYW4ge0BsaW5rIE9wZXJhdG9yfSBpcyBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIENhdGVnb3J5IGNsYXNzIGFzIHByZWRpY2F0ZSBidWlsZGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wZXJhdG9ySW5kZXggaW5kZXggaW4gdGhlIFthbGxvd2VkT3BlcmF0b3JzXXtAbGluayBDYXRlZ29yeSNhbGxvd2VkT3BlcmF0b3JzfSBhcnJheSBvZiB0aGUge0BsaW5rIE9wZXJhdG9yfSB0aGF0XG4gICAgICogc2hvdWxkIGJlIHNlbGVjdGVkXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdE9wZXJhdG9yKG9wZXJhdG9ySW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBvcGVyYXRvcnMgPSB0aGlzLmFsbG93ZWRPcGVyYXRvcnM7XG4gICAgICAgIGlmIChvcGVyYXRvckluZGV4IDwgMCB8fCBvcGVyYXRvckluZGV4ID49IG9wZXJhdG9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZy53YXJuKGBUaGUgcHJvdmlkZWQgJ29wZXJhdG9ySW5kZXgnIGlzIG91dCBvZiByYW5nZS5gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vcGVyYXRvckZvcm1Db250cm9sLnNldFZhbHVlKG9wZXJhdG9yc1tvcGVyYXRvckluZGV4XSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyB0aGUgc3RhdGUgb2YgdGhlIENhdGVnb3J5IGFuZCBnZW5lcmF0ZXMgYSBxdWVyeSBpZiBhbGwgbmVjZXNzYXJ5IG9wZXJhbmRzIHdlcmUgc2V0LlxuICAgICAqXG4gICAgICogSWYgeW91IGFyZSB1c2luZyB0aGUgY2F0ZWdvcnkgYXMgYSBidWlsZGVyLiBDb25zaWRlciB1c2luZyB0aGUgW2dlbmVyYXRlUHJlZGljYXRlKClde0BsaW5rIENhdGVnb3J5I2dlbmVyYXRlUHJlZGljYXRlfVxuICAgICAqIG1ldGhvZCBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHVzZXJJbnB1dCB2YWx1ZXMgZW50ZXJlZCBieSB0aGUgdXNlci4gVGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkgc2hvdWxkIG1hdGNoIHRoZVxuICAgICAqIFthcml0eV17QGxpbmsgT3BlcmF0b3IjX251bWJlck9mT3BlcmFuZHN9IG9mIHRoZSBzZWxlY3RlZCBPcGVyYXRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0T3BlcmFuZHModXNlcklucHV0OiBBcnJheTxUPik6IHZvaWQge1xuICAgICAgICBjb25zdCByYW5nZSA9IE1hdGgubWluKHVzZXJJbnB1dC5sZW5ndGgsIHRoaXMuX29wZXJhbmRzRm9ybUNvbnRyb2xzLmxlbmd0aCk7XG4gICAgICAgIGlmIChyYW5nZSA8IHVzZXJJbnB1dC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZy53YXJuKGAke3VzZXJJbnB1dC5sZW5ndGh9IG9wZXJhbmRzIGFyZSBiZWluZyBzZXQsIGJ1dCBvbmx5ICR7cmFuZ2V9IGlucHV0cyBhcmUgYXZhaWxhYmxlIWBcbiAgICAgICAgICAgICAgICArICcgRXh0cmEgb3BlcmFuZHMgd2lsbCBiZSBpZ25vcmVkLicpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2U7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5fb3BlcmFuZHNGb3JtQ29udHJvbHNbaV0uc2V0VmFsdWUodXNlcklucHV0W2ldKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmFuZ2UgIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMub3BlcmFuZFZhbHVlQ2hhbmdlcyhyYW5nZSAtIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSBzdGF0ZSBvZiB0aGUgQ2F0ZWdvcnksIGRlc2VsZWN0aW5nIGFueSBzZWxlY3RlZCBjYXRlZ29yeSBhbmQgcmVtb3Zpbmcgb3RoZXIgc3RhdGVcbiAgICAgKiBpbmZvcm1hdGlvbiBpZiB0aGUgQ2F0ZWdvcnkgZGVmaW5lcyB0aGVtLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gcmVzZXQgdGhlIHN0YXRlIG9mIHRoZSBjYXRlZ29yeSBhZnRlciBlYWNoIHByZWRpY2F0ZSBjb25zdHJ1Y3RlZCxcbiAgICAgKiBlZmZlY3RpdmVseSB0dXJuaW5nIHRoZSBjYXRlZ29yeSBpbnN0YW5jZSBpbnRvIGEgcHJlZGljYXRlIGJ1aWxkZXIuXG4gICAgICovXG4gICAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNsZWFyT3BlcmF0b3JTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5fb3BlcmFuZHNGb3JtQ29udHJvbHMuZm9yRWFjaChmYyA9PiB7XG4gICAgICAgICAgICBmYy5zZXRWYWx1ZSh1bmRlZmluZWQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxscyB0aGUgW2NyZWF0ZVF1ZXJ5XXtAbGluayBPcGVyYXRvciNjcmVhdGVRdWVyeX0gbWV0aG9kIG9uIHRoZSBzZWxlY3RlZCBPcGVyYXRvci5cbiAgICAgKlxuICAgICAqIFRocm93cyBhbiBFcnJvciBpZiBubyBPcGVyYXRvciBpcyBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZSBxdWVyeSBzaG91bGQgYmUgZ2VuZXJhdGVkIGluIHNvbWUgb3RoZXIgd2F5LlxuICAgICAqIEBwYXJhbSB1c2VySW5wdXQgdmFsdWVzIGVudGVyZWQgYnkgdGhlIHVzZXIuIFRoZSBsZW5ndGggb2YgdGhlIGFycmF5IHNob3VsZCBtYXRjaCB0aGVcbiAgICAgKiBbYXJpdHlde0BsaW5rIE9wZXJhdG9yI19udW1iZXJPZk9wZXJhbmRzfSBvZiB0aGUgc2VsZWN0ZWQgT3BlcmF0b3IuXG4gICAgICogQHJldHVybnMgdGhlIFF1ZXJ5IGdlbmVyYXRlZCBieSB0aGUgc2VsZWN0ZWQgT3BlcmF0b3JcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2VuZXJhdGVRdWVyeSh1c2VySW5wdXQ6IEFycmF5PFQ+KTogUXVlcnkge1xuICAgICAgICBpZiAoIXRoaXMuaXNPcGVyYXRvclNlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2F0ZWdvcnkgY2Fubm90IGdlbmVyYXRlIGEgUXVlcnkgaWYgbm8gT3BlcmF0b3IgaXMgc2VsZWN0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fb3BlcmF0b3JGb3JtQ29udHJvbC52YWx1ZS5jcmVhdGVRdWVyeSh0aGlzLl9lbGFzdGljS2V5d29yZHMsIHVzZXJJbnB1dCBhcyB1bmtub3duIGFzIEFycmF5PHN0cmluZz4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxzIHRoZSBbZ2VuZXJhdGVRdWVyeV17QGxpbmsgQ2F0ZWdvcnkjZ2VuZXJhdGVRdWVyeX0gbWV0aG9kIGFuZCBjcmVhdGVzIGFuIHtAbGluayBFbGVtZW50YXJ5UHJlZGljYXRlfSB3aXRoIHRoZSByZXN1bHQuXG4gICAgICogQHBhcmFtIHVzZXJJbnB1dCB2YWx1ZXMgZW50ZXJlZCBieSB0aGUgdXNlci4gVGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkgc2hvdWxkIG1hdGNoIHRoZVxuICAgICAqIFthcml0eV17QGxpbmsgT3BlcmF0b3IjX251bWJlck9mT3BlcmFuZHN9IG9mIHRoZSBzZWxlY3RlZCBPcGVyYXRvci5cbiAgICAgKiBAcmV0dXJucyBQcmVkaWNhdGUgd2l0aCB7QGxpbmsgUXVlcnl9IGdlbmVyYXRlZCBieSB0aGlzIG9iamVjdCdzIFtnZW5lcmF0ZVF1ZXJ5XXtAbGluayBDYXRlZ29yeSNnZW5lcmF0ZVF1ZXJ5fSBtZXRob2RcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2VuZXJhdGVQcmVkaWNhdGUodXNlcklucHV0OiBBcnJheTxUPik6IEVsZW1lbnRhcnlQcmVkaWNhdGUge1xuICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnRhcnlQcmVkaWNhdGUodGhpcy5nZW5lcmF0ZVF1ZXJ5KHVzZXJJbnB1dCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbGVjdHMgdGhlIGRlZmF1bHQgb3BlcmF0b3IgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgcXVlcnkgZ2VuZXJhdGlvbiwgd2hlbiBubyBPcGVyYXRvciBzZWxlY3Rpb24gaXMgcHJvdmlkZWQgdG8gdGhlIHVzZXIuXG4gICAgICpcbiAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzZWxlY3RzIHRoZSBmaXJzdCBvcGVyYXRvciBpbiB0aGUgW19hbGxvd2VkT3BlcmF0b3JzXXtAbGluayBDYXRlZ29yeSNhbGxvd2VkT3BlcmF0b3JzfSBhcnJheS5cbiAgICAgKlxuICAgICAqIFNlZSBbc2VsZWN0T3BlcmF0b3IoKV17QGxpbmsgQ2F0ZWdvcnkjc2VsZWN0T3BlcmF0b3J9IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3REZWZhdWx0T3BlcmF0b3IoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VsZWN0T3BlcmF0b3IoMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgdGhlIHRyYW5zbGF0aW9uIHN0cmluZyBwYXRoIGZvciB0aGUgdGV4dCB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIGlucHV0IHBsYWNlaG9sZGVyXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGdldCBpbnB1dFBsYWNlaG9sZGVyKCk6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHdoZXRoZXIgdGhlIGNhdGVnb3J5IHRleHQgc2hvdWxkIGJlIHJlbmRlcmVkIHdpdGggYm9sZCB0ZXh0IHdoZW4gc2VsZWN0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0IGRpc3BsYXlCb2xkKCk6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB3aGV0aGVyIGFuIG9wZXJhdG9yIGlzIGN1cnJlbnRseSBzZWxlY3RlZCBvciBub3QuXG4gICAgICovXG4gICAgcHVibGljIGlzT3BlcmF0b3JTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fb3BlcmF0b3JGb3JtQ29udHJvbC52YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXNlbGVjdHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvcGVyYXRvciAoaWYgYW55KVxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhck9wZXJhdG9yU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vcGVyYXRvckZvcm1Db250cm9sLnNldFZhbHVlKHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGR1cGxpY2F0ZSBvZiB0aGUgY3VycmVudCBjYXRlZ29yeSBvYmplY3QuIE5vdGUgdGhhdCBhIGR1cGxpY2F0ZSBpcyBOT1QgYSBjbG9uZS5cbiAgICAgKiBUaGUgc3RhdGUgb2YgdGhlIHJldHVybmVkIGNhdGVnb3J5IGlzIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgc3RhdGUgb2YgdGhpcyBjYXRlZ29yeS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGEgY2F0ZWdvcnkgaW5zdGFuY2Ugb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGlzIGNhdGVnb3J5IGluIGl0cyBpbml0aWFsIHN0YXRlLlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBkdXBsaWNhdGUoKTogQ2F0ZWdvcnk8VD47XG5cbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGZvciB0aGUgc2VyaWFsaXNhdGlvbiBvZiB0aGlzIGNhdGVnb3J5J3Mgc3RhdGUuXG4gICAgICpcbiAgICAgKiBOb3QgZXZlcnkgc3RhdGUgbXVzdCBiZSBwcmVzZXJ2YWJsZS4gVGhlIGRlZmF1bHQgbGlicmFyeSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBwcmVzZXJ2YXRpb24gb2YgdGhlIGZpbmFsIHN0YXRlIHdoZW4gdGhlXG4gICAgICogQ2F0ZWdvcnkgaXMgZ2VuZXJhdGluZyBhIHByZWRpY2F0ZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBhbiBvYmplY3QgY29udGFpbmluZyBhbGwgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmb3IgdGhlIHJlY29uc3RydWN0aW9uIG9mIHRoaXMgY2F0ZWdvcnkncyBzdGF0ZSxcbiAgICAgKiBiYXJyaW5nIGluZm9ybWF0aW9uIGFib3V0IGFsbG93ZWQgbmV0cy4gUmV0dXJucyBgdW5kZWZpbmVkYCBpZiB0aGUgY2F0ZWdvcnkgaXMgbm90IGluIGEgc3RhdGUgdGhhdCBnZW5lcmF0ZXMgYSBwcmVkaWNhdGUuXG4gICAgICogU2VlIFtwcm92aWRlc1ByZWRpY2F0ZSgpXXtAbGluayBDYXRlZ29yeSNwcm92aWRlc1ByZWRpY2F0ZX0uXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZU1ldGFkYXRhKCk6IENhdGVnb3J5R2VuZXJhdG9yTWV0YWRhdGEgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAoIXRoaXMucHJvdmlkZXNQcmVkaWNhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNhdGVnb3J5OiB0aGlzLnNlcmlhbGl6ZUNsYXNzKCksXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNyZWF0ZU1ldGFkYXRhQ29uZmlndXJhdGlvbigpLFxuICAgICAgICAgICAgdmFsdWVzOiB0aGlzLmNyZWF0ZU1ldGFkYXRhVmFsdWVzKClcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN0b3JlcyB0aGUgc2F2ZWQgc3RhdGUgY29udGFpbmVkIGluIHRoZSBwcm92aWRlZCBtZXRhZGF0YS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtZXRhZGF0YSB0aGUgbWV0YWRhdGEgY3JlYXRlZCBieSBjYWxsaW5nIHRoZSBbY3JlYXRlTWV0YWRhdGEoKV17QGxpbmsgQ2F0ZWdvcnkjY3JlYXRlTWV0YWRhdGF9IG1ldGhvZFxuICAgICAqXG4gICAgICogQHJldHVybnMgYW4gT2JzZXJ2YWJsZS4gV2hlbiB0aGUgT2JzZXJ2YWJsZSBlbWl0cyB0aGUgY2F0ZWdvcnkgaGFzIGZpbmlzaGVkIHJlc3RvcmluZyBpdHMgc3RhdGUuXG4gICAgICovXG4gICAgcHVibGljIGxvYWRGcm9tTWV0YWRhdGEobWV0YWRhdGE6IENhdGVnb3J5R2VuZXJhdG9yTWV0YWRhdGEpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0JCA9IG5ldyBSZXBsYXlTdWJqZWN0PHZvaWQ+KDEpO1xuICAgICAgICB0aGlzLmxvYWRDb25maWd1cmF0aW9uRnJvbU1ldGFkYXRhKG1ldGFkYXRhLmNvbmZpZ3VyYXRpb24pLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvYWRWYWx1ZXNGcm9tTWV0YWRhdGEobWV0YWRhdGEudmFsdWVzKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc3VsdCQubmV4dCgpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCQuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGUgaW4gdGhlIGNvbnN0cnVjdG9yLiBBcGFydCBmcm9tIGNhbGxpbmcgdGhpcyBtZXRob2QsIHRoZSBjb25zdHJ1Y3RvciBvbmx5IGNyZWF0ZXMgaW5zdGFuY2VzIHRvIGZpbGwgdGhlIHByb3RlY3RlZFxuICAgICAqIGZpZWxkcyBvZiB0aGlzIGNsYXNzLlxuICAgICAqXG4gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gbWFuYWdlcyBjcmVhdGlvbiBvZiBvcGVyYW5kIGBGb3JtQ29udHJvbGAgaW5zdGFuY2VzIGFuZCBtYW5hZ2VzIHN1YnNjcmlwdGlvbnMgdG8gdGhlbS5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY2hhbmdlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB5b3VyIGNhdGVnb3J5IHdpdGhvdXQgaGF2aW5nIHRvIHJld3JpdGUgdGhlIGJhc2VcbiAgICAgKiBjb25zdHJ1Y3RvciBmcm9tIHNjcmF0Y2guXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGluaXRpYWxpemVDYXRlZ29yeSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb3BlcmF0b3JGb3JtQ29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKChuZXdPcGVyYXRvcjogT3BlcmF0b3I8YW55PikgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb3BlcmFuZHNGb3JtQ29udHJvbHMuZm9yRWFjaChmYyA9PiB7XG4gICAgICAgICAgICAgICAgZmMuc2V0VmFsdWUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoIW5ld09wZXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgLy8gdW5kZWZpbmVkIGlzIG5leHQtZWQgaW50byB0aGUgc3RyZWFtLiBNYXJrZWQgYXMgY29kZSBzbWVsbCBieSBzb25hciB3aGVuIGV4cGxpY2l0bHkgc3RhdGVkXG4gICAgICAgICAgICAgICAgdGhpcy5fb3BlcmFuZHNGb3JtQ29udHJvbHMkLm5leHQoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fb3BlcmFuZHNGb3JtQ29udHJvbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dlbmVyYXRlZFByZWRpY2F0ZSQubmV4dCh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChuZXdPcGVyYXRvci5udW1iZXJPZk9wZXJhbmRzID4gdGhpcy5fb3BlcmFuZHNGb3JtQ29udHJvbHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuX29wZXJhbmRzRm9ybUNvbnRyb2xzLmxlbmd0aCA8IG5ld09wZXJhdG9yLm51bWJlck9mT3BlcmFuZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmMgPSBuZXcgRm9ybUNvbnRyb2woKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudExlbmd0aCA9IHRoaXMuX29wZXJhbmRzRm9ybUNvbnRyb2xzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgZmMudmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDYwMCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZXJhbmRWYWx1ZUNoYW5nZXMoY3VycmVudExlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vcGVyYW5kc0Zvcm1Db250cm9scy5wdXNoKGZjKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX29wZXJhbmRzRm9ybUNvbnRyb2xzJC5uZXh0KHRoaXMuX29wZXJhbmRzRm9ybUNvbnRyb2xzLnNsaWNlKDAsIG5ld09wZXJhdG9yLm51bWJlck9mT3BlcmFuZHMpKTtcblxuICAgICAgICAgICAgaWYgKG5ld09wZXJhdG9yLm51bWJlck9mT3BlcmFuZHMgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW5lcmF0ZWRQcmVkaWNhdGUkLm5leHQodGhpcy5nZW5lcmF0ZVByZWRpY2F0ZShbXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWV0aG9kIHRoYXQgaXMgKGJ5IGRlZmF1bHQpIGNhbGxlZCB3aGVuZXZlciBhbiBvcGVyYW5kIGBGb3JtQ29udHJvbGAgY2hhbmdlcyBpdHMgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3BlcmFuZEluZGV4IHRoZSBpbmRleCBvZiB0aGUgb3BlcmFuZCB0aGF0IGNoYW5nZWQgaXRzIHZhbHVlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG9wZXJhbmRWYWx1ZUNoYW5nZXMob3BlcmFuZEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzT3BlcmF0b3JTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9nZW5lcmF0ZWRQcmVkaWNhdGUkLm5leHQodW5kZWZpbmVkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3BlcmFuZEluZGV4ID49IHRoaXMuc2VsZWN0ZWRPcGVyYXRvckFyaXR5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRPcGVyYXRvckFyaXR5OyBpKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc09wZXJhbmRWYWx1ZVNlbGVjdGVkKHRoaXMuX29wZXJhbmRzRm9ybUNvbnRyb2xzW2ldLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9nZW5lcmF0ZWRQcmVkaWNhdGUkLmdldFZhbHVlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2VuZXJhdGVkUHJlZGljYXRlJC5uZXh0KHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2dlbmVyYXRlZFByZWRpY2F0ZSQubmV4dCh0aGlzLmdlbmVyYXRlUHJlZGljYXRlKHRoaXMuX29wZXJhbmRzRm9ybUNvbnRyb2xzLm1hcChmYyA9PiB0aGlzLnRyYW5zZm9ybUNhdGVnb3J5VmFsdWUoZmMudmFsdWUpKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHRoZSBjYXRlZ29yeSBjbGFzcyBpbiBhIHNlcmlhbGl6YWJsZSBmb3JtXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZCBpbiA1LjYuMCAtIENhdGVnb3J5IHNlcmlhbGlzYXRpb24gc2hvdWxkIGJlIGRvbmUgYnkgdXRpbGlzaW5nIHRoZSB7QGxpbmsgQ2F0ZWdvcnlSZXNvbHZlclNlcnZpY2V9IGluc3RlYWRcbiAgICAgKi9cbiAgICBhYnN0cmFjdCBzZXJpYWxpemVDbGFzcygpOiBDYXRlZ29yaWVzIHwgc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2VyaWFsaXplcyBvbmx5IHRoZSBvcGVyYXRvci5cbiAgICAgKiBJZiB0aGUgY2F0ZWdvcnkgY29udGFpbnMgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uLCB0aGlzIG1ldGhvZCBtdXN0IGJlIGV4dGVuZGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZm9yIHRoZSByZWNvbnN0cnVjdGlvbiBvZiB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGlzIGNhdGVnb3J5IGluc3RhbmNlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNyZWF0ZU1ldGFkYXRhQ29uZmlndXJhdGlvbigpOiBDYXRlZ29yeU1ldGFkYXRhQ29uZmlndXJhdGlvbiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBbQ2F0ZWdvcnkuT1BFUkFUT1JfTUVUQURBVEFdOiB0aGlzLnNlbGVjdGVkT3BlcmF0b3Iuc2VyaWFsaXplKClcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRoZSB2YWx1ZSBvZiBhbGwgb3BlcmFuZCBmb3JtIGNvbnRyb2wgb2JqZWN0cyB1cCB0byB0aGUgY3VycmVudCBudW1iZXIgb2Ygb3BlcmFuZHMuXG4gICAgICogVG8gc2VyaWFsaXplIHZhbHVlIG9mIGVhY2ggb3BlcmFuZCB0aGUgW3NlcmlhbGl6ZU9wZXJhbmRWYWx1ZSgpXXtAbGluayBDYXRlZ29yeSNzZXJpYWxpemVPcGVyYW5kVmFsdWV9IG1ldGhvZCBpcyB1c2VkLlxuICAgICAqXG4gICAgICogSWYgdGhlIHZhbHVlcyB1c2VkIGJ5IHRoaXMgY2F0ZWdvcnkgYXJlIG5vdCBzZXJpYWxpemFibGUsIHRoZW4gZWl0aGVyIHRoaXMgbWV0aG9kLCBvciB0aGUgYHNlcmlhbGl6ZU9wZXJhbmRWYWx1ZWAgbWV0aG9kLFxuICAgICAqIG11c3QgYmUgb3ZlcnJpZGRlbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdmFsdWVzIGlucHV0IGJ5IHRoZSB1c2VyIGluIGEgc2VyaWFsaXphYmxlIGZvcm1cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY3JlYXRlTWV0YWRhdGFWYWx1ZXMoKTogQXJyYXk8dW5rbm93bj4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkT3BlcmF0b3JBcml0eTsgaSsrKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLnNlcmlhbGl6ZU9wZXJhbmRWYWx1ZSh0aGlzLl9vcGVyYW5kc0Zvcm1Db250cm9sc1tpXSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHZhbHVlRm9ybUNvbnRyb2wgRm9ybUNvbnRyb2wgb2JqZWN0IG9mIG9uZSBvcGVyYW5kXG4gICAgICogQHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBvcGVyYW5kIGluIGEgc2VyaWFsaXplZCBmb3JtLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRoZSBGb3JtQ29udHJvbHMgYHZhbHVlYCBhdHRyaWJ1dGUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHNlcmlhbGl6ZU9wZXJhbmRWYWx1ZSh2YWx1ZUZvcm1Db250cm9sOiBGb3JtQ29udHJvbCk6IHVua25vd24ge1xuICAgICAgICByZXR1cm4gdmFsdWVGb3JtQ29udHJvbC52YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN0b3JlZCB0aGUgc2F2ZWQgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBtZXRhZGF0YSBjcmVhdGVkIGJ5IHRoZVxuICAgICAqIFtjcmVhdGVNZXRhZGF0YUNvbmZpZ3VyYXRpb24oKV17QGxpbmsgQ2F0ZWdvcnkjY3JlYXRlTWV0YWRhdGFDb25maWd1cmF0aW9ufSBtZXRob2QuXG4gICAgICpcbiAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXN0b3JlcyBvbmx5IHRoZSBzYXZlZCBvcGVyYXRvci5cbiAgICAgKlxuICAgICAqIElmIHRoZSBDYXRlZ29yeSBvdmVycmlkZXMgdGhlIHNlcmlhbGl6YXRpb24gbWV0aG9kLCBpdCBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIHdlbGwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbiB0aGUgc2VyaWFsaXplZCBjb25maWd1cmF0aW9uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBhbiBPYnNlcnZhYmxlLiBXaGVuIHRoZSBPYnNlcnZhYmxlIGVtaXRzIHRoZSBjYXRlZ29yeSBoYXMgZmluaXNoZWQgbG9hZGluZyBpdHMgY29uZmlndXJhdGlvbi5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbG9hZENvbmZpZ3VyYXRpb25Gcm9tTWV0YWRhdGEoY29uZmlndXJhdGlvbjogQ2F0ZWdvcnlNZXRhZGF0YUNvbmZpZ3VyYXRpb24pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRPcGVyYXRvciA9IHRoaXMuX29wZXJhdG9yU2VydmljZS5nZXRGcm9tTWV0YWRhdGEoY29uZmlndXJhdGlvbltDYXRlZ29yeS5PUEVSQVRPUl9NRVRBREFUQV0gYXMgT3BlcmF0b3JzIHwgc3RyaW5nKTtcbiAgICAgICAgdGhpcy5zZWxlY3RPcGVyYXRvcih0aGlzLmFsbG93ZWRPcGVyYXRvcnMuZmluZEluZGV4KG9wID0+IG9wID09PSByZXNvbHZlZE9wZXJhdG9yKSk7XG4gICAgICAgIHJldHVybiBvZlZvaWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzZXRzIHRoZSBwcm92aWRlZCB2YWx1ZXMgaW50byB0aGlzIENhdGVnb3J5J3Mgb3BlcmFuZCBmb3JtIGNvbnRyb2xzLlxuICAgICAqXG4gICAgICogQW4gb3BlcmF0b3IgbXVzdCBiZSBzZXQgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QhIE90aGVyd2lzZSBhbiBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAgICAgKlxuICAgICAqIElmIHRoZSBudW1iZXIgb2YgdmFsdWVzIGRvZXNuJ3QgbWF0Y2ggdGhlIGFyaXR5IG9mIHRoZSBzZWxlY3RlZCBvcGVyYXRvciBhbiBlcnJvciB3aWxsIGJlIHRocm93biFcbiAgICAgKlxuICAgICAqIElmIHRoaXMgQ2F0ZWdvcnkgb3ZlcnJpZGVzIHRoZSBbc2VyaWFsaXplT3BlcmFuZFZhbHVlKClde0BsaW5rIENhdGVnb3J5I3NlcmlhbGl6ZU9wZXJhbmRWYWx1ZX0sIGl0IG11c3QgYWxzb1xuICAgICAqIG92ZXJyaWRlIGl0cyBkZXNlcmlhbGl6YXRpb24gY291bnRlcnBhcnQgLSBbZGVzZXJpYWxpemVPcGVyYW5kVmFsdWUoKV17QGxpbmsgI0NhdGVnb3J5I2Rlc2VyaWFsaXplT3BlcmFuZFZhbHVlfSFcbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZXMgdGhlIHNlcmlhbGl6ZWQgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIGxvYWRlZCBpbnRvIHRoaXMgQ2F0ZWdvcnkgaW5zdGFuY2VcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGFuIE9ic2VydmFibGUuIFdoZW4gdGhlIE9ic2VydmFibGUgZW1pdHMgdGhlIGNhdGVnb3J5IGhhcyBmaW5pc2hlZCBsb2FkaW5nIGl0cyB2YWx1ZXMuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGxvYWRWYWx1ZXNGcm9tTWV0YWRhdGEodmFsdWVzOiBBcnJheTx1bmtub3duPik6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuaXNPcGVyYXRvclNlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQW4gb3BlcmF0b3IgbXVzdCBiZSBzZWxlY3RlZCBiZWZvcmUgQ2F0ZWdvcnkgdmFsdWVzIGNhbiBiZSByZXNvbHZlZCBmcm9tIG1ldGFkYXRhIScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkT3BlcmF0b3JBcml0eSAhPT0gdmFsdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgYXJpdHkgb2YgdGhlIHNlbGVjdGVkIG9wZXJhdG9yICgke3RoaXMuc2VsZWN0ZWRPcGVyYXRvckFyaXR5XG4gICAgICAgICAgICB9KSBkb2Vzbid0IG1hdGNoIHRoZSBudW1iZXIgb2YgdGhlIHByb3ZpZGVkIHZhbHVlcyAoJHt2YWx1ZXMubGVuZ3RofSkhYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVzZXJpYWxpemVkVmFsdWVzT2JzZXJ2YWJsZXMgPSB2YWx1ZXMubWFwKHYgPT4gdGhpcy5kZXNlcmlhbGl6ZU9wZXJhbmRWYWx1ZSh2KSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCQgPSBuZXcgUmVwbGF5U3ViamVjdDx2b2lkPigxKTtcbiAgICAgICAgZm9ya0pvaW4oZGVzZXJpYWxpemVkVmFsdWVzT2JzZXJ2YWJsZXMpLnBpcGUoZGVmYXVsdElmRW1wdHkoW10pKS5zdWJzY3JpYmUoZGVzZXJpYWxpemVkVmFsdWVzID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0T3BlcmFuZHMoZGVzZXJpYWxpemVkVmFsdWVzKTtcbiAgICAgICAgICAgIHJlc3VsdCQubmV4dCgpO1xuICAgICAgICAgICAgcmVzdWx0JC5jb21wbGV0ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHZhbHVlIHRoZSBzZXJpYWxpemVkIG91dHB1dCBvZiB0aGUgW3NlcmlhbGl6ZU9wZXJhbmRWYWx1ZSgpXXtAbGluayBDYXRlZ29yeSNzZXJpYWxpemVPcGVyYW5kVmFsdWV9IG1ldGhvZFxuICAgICAqIEByZXR1cm5zIGFuIGBPYnNlcnZhYmxlYCB0aGF0IGVtaXRzIHRoZSBkZXNlcmlhbGl6ZWQgdmFsdWUsIHRoYXQgY2FuIGJlIHNldCBhcyBGb3JtQ29udHJvbCB2YWx1ZSBhbmQgdGhlbiBjb21wbGV0ZXNcbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIG1heSB0aHJvdyBuYSBlcnJvciBpZiB0aGUgdmFsdWUgY2Fubm90IGJlIGRlc2VyaWFsaXplZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZGVzZXJpYWxpemVPcGVyYW5kVmFsdWUodmFsdWU6IHVua25vd24pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICByZXR1cm4gb2YodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgdmFsdWUgb2YgdGhlIGBGb3JtQ29udHJvbGAgb2JqZWN0IHRoYXQgd2Ugd2FudCB0byB0ZXN0XG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBuZXdseSBzZWxlY3RlZCB2YWx1ZSBpcyBhIHZhbGlkIHZhbHVlLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgaXNPcGVyYW5kVmFsdWVTZWxlY3RlZChuZXdWYWx1ZTogYW55KTogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGBGb3JtQ29udHJvbGAgdmFsdWUgYmVmb3JlIHBhc3NpbmcgaXQgaW50byB0aGUgc2VsZWN0ZWQgYE9wZXJhdG9yYCBmb3IgcXVlcnkgZ2VuZXJhdGlvbi5cbiAgICAgKiBJdCBpcyBtb3N0bHkgdXNlZnVsIG9ubHkgZm9yIEF1dG9jb21wbGV0ZUNhdGVnb3JpZXMsIHdoZXJlIHRoZSBzZWxlY3RlZCB2YWx1ZSBvZiB0aGUgRm9ybUNvbnRyb2wgaXMgYW4gb2JqZWN0LlxuICAgICAqXG4gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcGVyZm9ybXMgYW4gaWRlbnRpdHkgdHJhbnNmb3JtYXRpb24gLSByZXR1cm5zIHRoZSBpbnB1dC5cbiAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIEZvcm1Db250cm9sVmFsdWVcbiAgICAgKiBAcmV0dXJucyB0aGUgdmFsdWUgdXNlZCBmb3IgcXVlcnkgZ2VuZXJhdGlvblxuICAgICAqL1xuICAgIHByb3RlY3RlZCB0cmFuc2Zvcm1DYXRlZ29yeVZhbHVlKHZhbHVlOiBhbnkpOiBUIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIGFuIEFycmF5IGNvbnRhaW5pbmcgdGV4dCBzZWdtZW50cyByZXByZXNlbnRpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIHByZWRpY2F0ZSBnZW5lcmF0ZWQgYnkgdGhpcyBjYXRlZ29yeVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVGaWx0ZXJUZXh0U2VnbWVudHMoKTogQXJyYXk8RmlsdGVyVGV4dFNlZ21lbnQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLnByb3ZpZGVzUHJlZGljYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHtzZWdtZW50OiB0aGlzLnRyYW5zbGF0aW9uUGF0aCwgYm9sZDogdGhpcy5kaXNwbGF5Qm9sZH0sXG4gICAgICAgICAgICAuLi50aGlzLmNyZWF0ZUNvbmZpZ3VyYXRpb25GaWx0ZXJUZXh0U2VnbWVudHMoKSxcbiAgICAgICAgICAgIC4uLnRoaXMuY3JlYXRlT3BlcmF0b3JGaWx0ZXJUZXh0U2VnbWVudHMoKVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIGFuIEFycmF5IGNvbnRhaW5pbmcgdGV4dCBzZWdtZW50cyByZXByZXNlbnRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gaW5wdXRzIG9mIHRoaXMgY2F0ZWdvcnlcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgY3JlYXRlQ29uZmlndXJhdGlvbkZpbHRlclRleHRTZWdtZW50cygpOiBBcnJheTxGaWx0ZXJUZXh0U2VnbWVudD47XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBhbiBBcnJheSBjb250YWluaW5nIHRleHQgc2VnbWVudHMgcmVwcmVzZW50aW5nIHRoZSBvcGVyYXRvcnMgd2l0aCBvcGVyYW5kcyBvZiB0aGlzIGNhdGVnb3J5XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNyZWF0ZU9wZXJhdG9yRmlsdGVyVGV4dFNlZ21lbnRzKCk6IEFycmF5PEZpbHRlclRleHRTZWdtZW50PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogQXJyYXk8RmlsdGVyVGV4dFNlZ21lbnQ+ID0gW107XG4gICAgICAgIGxldCBvcGVyYW5kSW5kZXggPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgdGhpcy5zZWxlY3RlZE9wZXJhdG9yLmdldE9wZXJhdG9yTmFtZVRlbXBsYXRlKCkpIHtcbiAgICAgICAgICAgIGlmIChzZWdtZW50ID09PSBPcGVyYXRvci5JTlBVVF9QTEFDRUhPTERFUikge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuY3JlYXRlT3BlcmFuZEZpbHRlclRleHRTZWdtZW50KG9wZXJhbmRJbmRleCkpO1xuICAgICAgICAgICAgICAgIG9wZXJhbmRJbmRleCsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7c2VnbWVudH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgZmlsdGVyIHRleHQgc2VnbWVudCByZXByZXNlbnRpbmcgdGhlIG9wZXJhbmQgdmFsdWUgYXQgdGhlIHNwZWNpZmllZCBpbmRleFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGVPcGVyYW5kRmlsdGVyVGV4dFNlZ21lbnQob3BlcmFuZEluZGV4OiBudW1iZXIpOiBGaWx0ZXJUZXh0U2VnbWVudCB7XG4gICAgICAgIGxldCBzZWdtZW50O1xuICAgICAgICBjb25zdCBvcGVyYW5kID0gdGhpcy5fb3BlcmFuZHNGb3JtQ29udHJvbHNbb3BlcmFuZEluZGV4XS52YWx1ZTtcbiAgICAgICAgc3dpdGNoICh0aGlzLmlucHV0VHlwZSkge1xuICAgICAgICAgICAgY2FzZSBTZWFyY2hJbnB1dFR5cGUuQVVUT0NPTVBMRVRFOlxuICAgICAgICAgICAgICAgIHNlZ21lbnQgPSBvcGVyYW5kLnRleHQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNlYXJjaElucHV0VHlwZS5EQVRFOlxuICAgICAgICAgICAgICAgIHNlZ21lbnQgPSBvcGVyYW5kLmZvcm1hdChEQVRFX0ZPUk1BVF9TVFJJTkcpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTZWFyY2hJbnB1dFR5cGUuREFURV9USU1FOlxuICAgICAgICAgICAgICAgIHNlZ21lbnQgPSBvcGVyYW5kLmZvcm1hdChEQVRFX1RJTUVfRk9STUFUX1NUUklORyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHNlZ21lbnQgPSBvcGVyYW5kO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7c2VnbWVudCwgYm9sZDogdHJ1ZX07XG4gICAgfVxufVxuIl19
|
|
532
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F0ZWdvcnkuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbmV0Z3JpZi9jb21wb25lbnRzLWNvcmUvIiwic291cmNlcyI6WyJsaWIvc2VhcmNoL21vZGVscy9jYXRlZ29yeS9jYXRlZ29yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFHOUMsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDdEUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUMsZUFBZSxFQUFFLFFBQVEsRUFBYyxFQUFFLEVBQUUsYUFBYSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzlFLE9BQU8sRUFBQyxZQUFZLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2pFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQy9ELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBQzFFLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBSzFELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUVoRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUd6Rjs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sT0FBZ0IsUUFBUTtJQTZDMUI7Ozs7Ozs7Ozs7T0FVRztJQUNILFlBQXlDLGdCQUErQixFQUMvQixpQkFBdUMsRUFDMUMsZUFBdUIsRUFDcEIsVUFBMkIsRUFDcEMsSUFBbUIsRUFDbkIsZ0JBQWlDO1FBTHhCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBZTtRQUMvQixzQkFBaUIsR0FBakIsaUJB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QUNPLDhCQUE4QixDQUFDLFlBQW9CO1FBQ3pELElBQUksT0FBTyxDQUFDO1FBQ1osTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUMvRCxRQUFRLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDcEIsS0FBSyxlQUFlLENBQUMsWUFBWTtnQkFDN0IsT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ3ZCLE1BQU07WUFDVixLQUFLLGVBQWUsQ0FBQyxJQUFJO2dCQUNyQixPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUM3QyxNQUFNO1lBQ1YsS0FBSyxlQUFlLENBQUMsU0FBUztnQkFDMUIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBQztnQkFDbEQsTUFBTTtZQUNWO2dCQUNJLE9BQU8sR0FBRyxPQUFPLENBQUM7Z0JBQ2xCLE1BQU07U0FDYjtRQUNELE9BQU8sRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ08sa0JBQWtCLENBQUMsYUFBd0I7UUFDakQsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN0RixDQUFDOztBQS9uQkQ7O0dBRUc7QUFDdUIsMEJBQWlCLEdBQUcsVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtPcGVyYXRvcn0gZnJvbSAnLi4vb3BlcmF0b3Ivb3BlcmF0b3InO1xuaW1wb3J0IHtMb2dnZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9sb2dnZXIvc2VydmljZXMvbG9nZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHtRdWVyeX0gZnJvbSAnLi4vcXVlcnkvcXVlcnknO1xuaW1wb3J0IHtFbGVtZW50YXJ5UHJlZGljYXRlfSBmcm9tICcuLi9wcmVkaWNhdGUvZWxlbWVudGFyeS1wcmVkaWNhdGUnO1xuaW1wb3J0IHtTZWFyY2hJbnB1dFR5cGV9IGZyb20gJy4vc2VhcmNoLWlucHV0LXR5cGUnO1xuaW1wb3J0IHtGb3JtQ29udHJvbH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIGZvcmtKb2luLCBPYnNlcnZhYmxlLCBvZiwgUmVwbGF5U3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2RlYm91bmNlVGltZSwgZGVmYXVsdElmRW1wdHksIG1hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtPcGVyYXRvclRlbXBsYXRlUGFydH0gZnJvbSAnLi4vb3BlcmF0b3ItdGVtcGxhdGUtcGFydCc7XG5pbXBvcnQge0luY3JlbWVudGluZ0NvdW50ZXJ9IGZyb20gJy4uLy4uLy4uL3V0aWxpdHkvaW5jcmVtZW50aW5nLWNvdW50ZXInO1xuaW1wb3J0IHtDb25maWd1cmF0aW9uSW5wdXR9IGZyb20gJy4uL2NvbmZpZ3VyYXRpb24taW5wdXQnO1xuaW1wb3J0IHtDYXRlZ29yeUdlbmVyYXRvck1ldGFkYXRhLCBDYXRlZ29yeU1ldGFkYXRhQ29uZmlndXJhdGlvbn0gZnJvbSAnLi4vcGVyc2lzdGFuY2UvZ2VuZXJhdG9yLW1ldGFkYXRhJztcbmltcG9ydCB7Q2F0ZWdvcmllc30gZnJvbSAnLi9jYXRlZ29yaWVzJztcbmltcG9ydCB7T3BlcmF0b3JTZXJ2aWNlfSBmcm9tICcuLi8uLi9vcGVyYXRvci1zZXJ2aWNlL29wZXJhdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHtPcGVyYXRvcnN9IGZyb20gJy4uL29wZXJhdG9yL29wZXJhdG9ycyc7XG5pbXBvcnQge29mVm9pZH0gZnJvbSAnLi4vLi4vLi4vdXRpbGl0eS9vZi12b2lkJztcbmltcG9ydCB7RmlsdGVyVGV4dFNlZ21lbnR9IGZyb20gJy4uL3BlcnNpc3RhbmNlL2ZpbHRlci10ZXh0LXNlZ21lbnQnO1xuaW1wb3J0IHtEQVRFX0ZPUk1BVF9TVFJJTkcsIERBVEVfVElNRV9GT1JNQVRfU1RSSU5HfSBmcm9tICcuLi8uLi8uLi9tb21lbnQvdGltZS1mb3JtYXRzJztcbmltcG9ydCB7VHlwZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKlxuICogVGhlIHRvcCBsZXZlbCBvZiBhYnN0cmFjdGlvbiBpbiBzZWFyY2ggcXVlcnkgZ2VuZXJhdGlvbi4gUmVwcmVzZW50cyBhIHNldCBvZiBpbmRleGVkIGZpZWxkcyB0aGF0IGNhbiBiZSBzZWFyY2hlZC5cbiAqIEVuY2Fwc3VsYXRlcyB0aGUgdGhlIHN0YXRlIGFuZCBsb2dpYyBvZiB0aGUgcXVlcnkgY29uc3RydWN0aW9uIHByb2Nlc3MuXG4gKlxuICogQXMgb3Bwb3NlZCB0byB7QGxpbmsgT3BlcmF0b3J9cyBDYXRlZ29yaWVzIGFyZSBub3Qgc3RhdGVsZXNzIGFuZCBzaG91bGRuJ3QgYmUgc2hhcmVkLlxuICogQSBzaW5nbGUgQ2F0ZWdvcnkgaW5zdGFuY2UgaXMgY2FwYWJsZSBvZiBob2xkaW5nIHRoZSBzdGF0ZSBvZiBvbmUge0BsaW5rIEVkaXRhYmxlUHJlZGljYXRlfSxcbiAqIG9yIGNhbiBiZSB1c2VkIGFzIGEgYnVpbGRlciB0byBmb3JtIGFuIHVubGltaXRlZCBhbW91bnQgb2YgW0VsZW1lbnRhcnlQcmVkaWNhdGVzXXtAbGluayBFbGVtZW50YXJ5UHJlZGljYXRlfS5cbiAqXG4gKiBZb3UgY2FuIHVzZSB7QGxpbmsgQ2F0ZWdvcnlGYWN0b3J5fSB0byBnZXQgaW5zdGFuY2VzIG9mIENhdGVnb3J5IGNsYXNzZXMuXG4gKiBBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gdXNlIHRoZSBbY2xvbmUoKV17QExpbmsgQ2F0ZWdvcnkjY2xvbmV9IG1ldGhvZCB0byBkdXBsaWNhdGUgYW4gZXhpc3RpbmcgaW5zdGFuY2UuXG4gKlxuICogSWYgeW91IHdhbnQgdG8gbWFrZSB5b3VyIG93biBDYXRlZ29yeSBjbGFzcyB5b3UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY29uc3RydWN0b3IgdGFrZXMge0BsaW5rIE9wZXJhdG9yU2VydmljZX0gYXMgaXQncyBmaXJzdFxuICogYXJndW1lbnQgYW5kIHtAbGluayBMb2dnZXJTZXJ2aWNlfSBhcyBpdCdzIHNlY29uZCBhcmd1bWVudC4gQWx0ZXJuYXRpdmVseSB5b3UgY2FuIG1ha2UgeW91ciBvd24gaW1wbGVtZW50YXRpb24gb2YgdGhlXG4gKiB7QGxpbmsgQ2F0ZWdvcnlGYWN0b3J5fSBzbywgdGhhdCB5b3VyIHN0eWxlIG9mIGNvbnN0cnVjdG9ycyBpcyBzdXBwb3J0ZWQuXG4gKlxuICogQHR5cGVwYXJhbSBUIHR5cGUgb2Ygb2JqZWN0cyB0aGUgY2F0ZWdvcnkgZXhwZWN0cyB0byBnZW5lcmF0ZSBxdWVyaWVzIGZyb21cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENhdGVnb3J5PFQ+IHtcblxuICAgIC8qKlxuICAgICAqIFRoZSB7QGxpbmsgQ2F0ZWdvcnlNZXRhZGF0YUNvbmZpZ3VyYXRpb259IGtleSBmb3IgdGhpcyBDYXRlZ29yeSdzIHtAbGluayBPcGVyYXRvcn1cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc3RhdGljIHJlYWRvbmx5IE9QRVJBVE9SX01FVEFEQVRBID0gJ29wZXJhdG9yJztcblxuICAgIC8qKlxuICAgICAqIENvbnRhaW5zIHRoZSBgRm9ybUNvbnRyb2xgIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gZHJpdmUgdGhlIG9wZXJhdG9yIHNlbGVjdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSBjYXRlZ29yeSBjYW4gc3Vic2NyaWJlIHRvIGl0IGlmIGl0IHdpc2hlcyB0byByZWFjdCB0byB0aGUgc2VsZWN0aW9uIGNoYW5nZSBieSB0aGUgdXNlci5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX29wZXJhdG9yRm9ybUNvbnRyb2w6IEZvcm1Db250cm9sO1xuXG4gICAgLyoqXG4gICAgICogU3RvcmVzIHRoZSBgRm9ybUNvbnRyb2xgIG9iamVjdHMgdGhhdCBhcmUgcHVzaGVkIGludG8gdGhlIG9ic2VydmFibGUgd2hlbiB0aGUgbnVtYmVyIG9mIG9wZXJhbmRzIGNoYW5nZXMuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9vcGVyYW5kc0Zvcm1Db250cm9sczogQXJyYXk8Rm9ybUNvbnRyb2w+O1xuXG4gICAgLyoqXG4gICAgICogQ29udGFpbnMgdGhlIGBGb3JtQ29udHJvbGAgb2JqZWN0cyB0aGF0IGNhbiBiZSB1c2VkIHRvIGlucHV0IHNlYXJjaCBhcmd1bWVudHMuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9vcGVyYW5kc0Zvcm1Db250cm9scyQ6IFJlcGxheVN1YmplY3Q8QXJyYXk8Rm9ybUNvbnRyb2w+IHwgdW5kZWZpbmVkPjtcblxuICAgIC8qKlxuICAgICAqIENvbnRhaW5zIHRoZSBvcGVyYXRvciB0ZW1wbGF0ZSBwYXJ0cyB0aGF0IG1ha2UgdXAgdGhlIG9wZXJhbmRzIEdVSS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX29wZXJhdG9yVGVtcGxhdGUkOiBCZWhhdmlvclN1YmplY3Q8QXJyYXk8T3BlcmF0b3JUZW1wbGF0ZVBhcnQ+IHwgdW5kZWZpbmVkPjtcblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBJRHMgZm9yIHRlbXBsYXRlIHBhcnRzIHN1cHBsaWVkIHRvIG5nIGZvci5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3RyYWNrQnlJZEdlbmVyYXRvcjogSW5jcmVtZW50aW5nQ291bnRlcjtcblxuICAgIC8qKlxuICAgICAqIEVtaXQgYSBuZXcgYFByZWRpY2F0ZWAgaWYgdGhlIGBDYXRlZ29yeWAgaXMgaW4gYSBzdGF0ZSB0aGF0IGl0IGNhbiBiZSBjcmVhdGVkLlxuICAgICAqIEVtaXRzIGB1bmRlZmluZWRgIGlmIHRoZSBgQ2F0ZWdvcnlgIGlzIG5vdCBpbiBzdWNoIHN0YXRlLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZ2VuZXJhdGVkUHJlZGljYXRlJDogQmVoYXZpb3JTdWJqZWN0PEVsZW1lbnRhcnlQcmVkaWNhdGUgfCB1bmRlZmluZWQ+O1xuXG4gICAgLyoqXG4gICAgICogVXRpbGl0eSB2YXJpYWJsZSB0aGF0IGNhbiBiZSB1c2VkIGFzIHZhbHVlIGZvciB0aGUgW2NvbmZpZ3VyYXRpb25JbnB1dHMkXXtAbGluayBDYXRlZ29yeSNjb25maWd1cmF0aW9uSW5wdXRzJH0gYE9ic2VydmFibGVgLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfT1BFUkFUT1JfSU5QVVQ6IENvbmZpZ3VyYXRpb25JbnB1dDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjb25zdHJ1Y3RvciBmaWxscyB0aGUgdmFsdWVzIG9mIGFsbCBwcm90ZWN0ZWQgZmllbGRzIGFuZCB0aGVuIGNhbGxzIHRoZSBbaW5pdGlhbGl6ZUNhdGVnb3J5KClde0BsaW5rIENhdGVnb3J5I2luaXRpYWxpemVDYXRlZ29yeX1cbiAgICAgKiBtZXRob2QuIElmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSBjYXRlZ29yeSBjcmVhdGlvbiBiZWhhdmlvciBvdmVycmlkZSB0aGF0IG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBfZWxhc3RpY0tleXdvcmRzIEVsYXN0aWNzZWFyY2gga2V5d29yZHMgdGhhdCBzaG91bGQgYmUgcXVlcmllZCBieSBxdWVyaWVzIGdlbmVyYXRlZCB3aXRoIHRoaXMgY2F0ZWdvcnlcbiAgICAgKiBAcGFyYW0gX2FsbG93ZWRPcGVyYXRvcnMgT3BlcmF0b3JzIHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGVkIHF1ZXJpZXMgb24gdGhlIGFib3ZlIGtleXdvcmRzXG4gICAgICogQHBhcmFtIHRyYW5zbGF0aW9uUGF0aCBwYXRoIHRvIHRoZSB0cmFuc2xhdGlvbiBzdHJpbmdcbiAgICAgKiBAcGFyYW0gX2lucHV0VHlwZSBpbnB1dCBmaWVsZCB0eXBlIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gZW50ZXIgb3BlcmF0b3IgYXJndW1lbnRzIGZvciB0aGlzIGNhdGVnb3J5XG4gICAgICogQHBhcmFtIF9sb2cgdXNlZCB0byByZWNvcmQgaW5mb3JtYXRpb24gYWJvdXQgaW5jb3JyZWN0IHVzZSBvZiB0aGlzIGNsYXNzXG4gICAgICogQHBhcmFtIF9vcGVyYXRvclNlcnZpY2UgdXNlZCB0byByZXNvbHZlIHNlcmlhbGl6ZWQgb3BlcmF0b3JzIGR1cmluZyBkZXNlcmlhbGl6YXRpb25cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IF9lbGFzdGljS2V5d29yZHM6IEFycmF5PHN0cmluZz4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCByZWFkb25seSBfYWxsb3dlZE9wZXJhdG9yczogQXJyYXk8T3BlcmF0b3I8YW55Pj4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyByZWFkb25seSB0cmFuc2xhdGlvblBhdGg6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9pbnB1dFR5cGU6IFNlYXJjaElucHV0VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9sb2c6IExvZ2dlclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfb3BlcmF0b3JTZXJ2aWNlOiBPcGVyYXRvclNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5fT1BFUkFUT1JfSU5QVVQgPSBuZXcgQ29uZmlndXJhdGlvbklucHV0KFxuICAgICAgICAgICAgU2VhcmNoSW5wdXRUeXBlLk9QRVJBVE9SLFxuICAgICAgICAgICAgJ3NlYXJjaC5vcGVyYXRvci5uYW1lJyxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgbmV3IE1hcDxzdHJpbmcsIEFycmF5PHVua25vd24+PigpLFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29uZmlndXJhdGlvbklucHV0IG9mIHR5cGUgT1BFUkFUT1IgaXMgYSBwbGFjZWhvbGRlciEnXG4gICAgICAgICAgICAgICAgICAgICsgJyBVc2Ugb3BlcmF0b3IgcmVsYXRlZCBtZXRob2RzIGZyb20gdGhlIENhdGVnb3J5IGNsYXNzIGluc3RlYWQuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5fb3BlcmF0b3JGb3JtQ29udHJvbCA9IHRoaXMuX09QRVJBVE9SX0lOUFVULmZvcm1Db250cm9sO1xuICAgICAgICB0aGlzLl9vcGVyYW5kc0Zvcm1Db250cm9scyQgPSBuZXcgUmVwbGF5U3ViamVjdDxBcnJheTxGb3JtQ29udHJvbD4gfCB1bmRlZmluZWQ+KDEpO1xuICAgICAgICB0aGlzLl9vcGVyYXRvclRlbXBsYXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXJyYXk8T3BlcmF0b3JUZW1wbGF0ZVBhcnQ+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLl9vcGVyYW5kc0Zvcm1Db250cm9scyA9IFtdO1xuICAgICAgICB0aGlzLl90cmFja0J5SWRHZW5lcmF0b3IgPSBuZXcgSW5jcmVtZW50aW5nQ291bnRlcigpO1xuICAgICAgICB0aGlzLl9nZW5lcmF0ZWRQcmVkaWNhdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxFbGVtZW50YXJ5UHJlZGljYXRlIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVDYXRlZ29yeSgpO1xuXG4gICAgICAgIHRoaXMub3BlcmFuZHNGb3JtQ29udHJvbHMkLnBpcGUoXG4gICAgICAgICAgICBtYXAoZm9ybUNvbnRyb2xzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWZvcm1Db250cm9scykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gdGhpcy5zZWxlY3RlZE9wZXJhdG9yLmdldE9wZXJhdG9yTmFtZVRlbXBsYXRlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmNzID0gWy4uLmZvcm1Db250cm9sc107XG4gICAgICAgICAgICAgICAgbGV0IGZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFydHMubWFwKHBhcnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IG5ldyBPcGVyYXRvclRlbXBsYXRlUGFydChwYXJ0ID8gcGFydCA6IGZjcy5zaGlmdCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhY2tCeUlkR2VuZXJhdG9yLm5leHQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQgPyB1bmRlZmluZWQgOiBmaXJzdCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApLnN1YnNjcmliZSh0ZW1wbGF0ZSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9vcGVyYXRvclRlbXBsYXRlJC5uZXh0KHRlbXBsYXRlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYW5zIHVwIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgb2JqZWN0IGJlZm9yZSBpdHMgZGVzdHJ1Y3Rpb24uXG4gICAgICpcbiAgICAgKiBUaGUgZGV2ZWxvcGVyIG11c3QgY2FsbCB0aGlzIG1ldGhvZCBhdCBhbiBhcHByb3ByaWF0ZSBtb21lbnQsIGFzIHRoaXMgb2JqZWN0IGNhbm5vdCBob29rIGludG8gdGhlIEFuZ3VsYXIgbGlmZWN5Y2xlLlxuICAgICAqL1xuICAgIHB1YmxpYyBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vcGVyYW5kc0Zvcm1Db250cm9scyQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5fb3BlcmF0b3JUZW1wbGF0ZSQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5fZ2VuZXJhdGVkUHJlZGljYXRlJC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyYXRpb24gaW5wdXQgcmVwcmVzZW50IHRoZSBzdGVwcyB0aGF0IGFyZSBuZWNlc3NhcnkgdG8gY29uZmlndXJlIHRoZSBjYXRlZ29yeS5cbiAgICAgKiBUaGUgbGFzdCBpbnB1dCBtdXN0IGFsd2F5cyBiZSBvZiB0eXBlIFtPUEVSQVRPUl17QGxpbmsgU2VhcmNoSW5wdXRUeXBlI09QRVJBVE9SfS5cbiAgICAgKiBTZWxlY3RpbmcgdGhlIG9wZXJhdG9yIGNvbXBsZXRlcyB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgY2F0ZWdvcnkgYW5kIHRoZSBhcmd1bWVudHMgaW5wdXRzXG4gICAgICogKGJhc2VkIG9uIGNhdGVnb3J5IGlucHV0IHR5cGUgYW5kIG9wZXJhdG9yIGFyaXR5KSBhcmUgZGlzcGxheWVkLlxuICAgICAqXG4gICAgICogQmV3YXJlIHRoYXQgd2hpbGUgbW9zdCBjYXRlZ29yaWVzIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgY29uc3RhbnQgaXQgbXVzdCBub3QgYWx3YXlzIGJlIHRoZSBjYXNlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgdGhlIHJlcXVpcmVkIGlucHV0IHR5cGUgZm9yIGNvbmZpZ3VyYXRpb24gc3RlcHMgb2YgdGhpcyBjYXRlZ29yeVxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXQgY29uZmlndXJhdGlvbklucHV0cyQoKTogT2JzZXJ2YWJsZTxBcnJheTxDb25maWd1cmF0aW9uSW5wdXQ+PjtcblxuICAgIC8qKlxuICAgICAqIElmIHlvdSB1c2UgdGhlIGBDYXRlZ29yeWAgY2xhc3MgYXMgYSBzb3J0IG9mIFByZWRpY2F0ZUJ1aWxkZXIsIHRoZW4geW91IHdhbnQgdG8gdXNlIHRoZVxuICAgICAqIFtnZW5lcmF0ZVByZWRpY2F0ZSgpXXtAbGluayBDYXRlZ29yeSNnZW5lcmF0ZVByZWRpY2F0ZX0gbWV0aG9kIGluc3RlYWQuXG4gICAgICpcbiAgICAgKiBUaGlzIHN0cmVhbSBwdWJsaXNoZXMgZWl0aGVyIGEgbmV3IGBQcmVkaWNhdGVgIG9iamVjdCBvciBgdW5kZWZpbmVkYCBiYXNlZCBvbiBjaGFuZ2VzIHRvIHRoZSBgRm9ybUNvbnRyb2xzYCB0aGF0IGFyZVxuICAgICAqIG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4gSWYgKGJhc2VkIG9uIHVzZXIgaW5wdXQpIHRoZSBgQ2F0ZWdvcnlgIHJlYWNoZXMgYSBzdGF0ZSB3aGVuIGNvbnN0cnVjdGlvbiBvZiBhIGBQcmVkaWNhdGVgIGlzIHBvc3NpYmxlXG4gICAgICogaXQgd2lsbCBlbWl0IHRoaXMgYFByZWRpY2F0ZWAuIElmIGl0IHJlYWNoZXMgYSBzdGF0ZSB3aGVuIHRoZSBgUHJlZGljYXRlYCBjYW4gbm90IGxvbmdlciBiZSBjcmVhdGVkIGB1bmRlZmluZWRgIGlzIGVtaXR0ZWQuXG4gICAgICovXG4gICAgcHVibGljIGdldCBnZW5lcmF0ZWRQcmVkaWNhdGUkKCk6IE9ic2VydmFibGU8RWxlbWVudGFyeVByZWRpY2F0ZSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2VuZXJhdGVkUHJlZGljYXRlJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgUHJlZGljYXRlfSBjdXJyZW50bHkgZ2VuZXJhdGVkIGJ5IHRoZSBDYXRlZ29yeS5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSBbZ2VuZXJhdGVkUHJlZGljYXRlJF17QGxpbmsgQ2F0ZWdvcnkjZ2VuZXJhdGVkUHJlZGljYXRlJH0uXG4gICAgICovXG4gICAgcHVibGljIGdldCBnZW5lcmF0ZWRQcmVkaWNhdGUoKTogRWxlbWVudGFyeVByZWRpY2F0ZSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZW5lcmF0ZWRQcmVkaWNhdGUkLmdldFZhbHVlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQmV3YXJlIHRoYXQgd2hpbGUgbW9zdCBjYXRlZ29yaWVzIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgY29uc3RhbnQgaXQgaXMgbm90IGEgcmVxdWlyZW1lbnQuXG4gICAgICogQW4gZXhhbXBsZSBmb3Igc3VjaCBiZWhhdmlvciBpcyB0aGUge0BsaW5rIENhc2VEYXRhc2V0fSBjYXRlZ29yeSwgd2hlcmUgdGhlIGFyZ3VtZW50IGlucHV0IHR5cGUgZGVwZW5kc1xuICAgICAqIG9uIHRoZSBzZWxlY3RlZCBkYXRhIGZpZWxkIHR5cGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB0aGUgcmVxdWlyZWQgaW5wdXQgdHlwZSBmb3IgYXJndW1lbnRzIGZvciB0aGlzIGNhdGVnb3J5XG4gICAgICovXG4gICAgcHVibGljIGdldCBpbnB1dFR5cGUoKTogU2VhcmNoSW5wdXRUeXBlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lucHV0VHlwZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB0aGUgc2V0IG9mIE9wZXJhdG9ycyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggdGhpcyBjYXRlZ29yeS4gSXRlcmF0aW9uIG9yZGVyIGRldGVybWluZXMgdGhlIGRpc3BsYXkgb3JkZXIuXG4gICAgICovXG4gICAgcHVibGljIGdldCBhbGxvd2VkT3BlcmF0b3JzKCk6IEFycmF5PE9wZXJhdG9yPGFueT4+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIHJlc3VsdC5wdXNoKC4uLnRoaXMuX2FsbG93ZWRPcGVyYXRvcnMpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgb3BlcmF0b3Igb3IgYHVuZGVmaW5lZGAgaWYgbm8gb3BlcmF0b3IgaXMgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgcHVibGljIGdldCBzZWxlY3RlZE9wZXJhdG9yKCk6IE9wZXJhdG9yPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3BlcmF0b3JGb3JtQ29udHJvbC52YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBhbiBhcnJheSBvZiBgRm9ybUNvbnRyb2xgIG9iamVjdHMgdGhhdCBjb250YWlucyBhcyBtYW55IGNvbnRyb2xzIGFzIGlzIHRoZSBhcml0eSBvZiB0aGUgc2VsZWN0ZWQgb3BlcmF0b3IuXG4gICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBtdWx0aXBsZSB0aW1lcyB3aWxsIHJldHVybiB0aGUgc2FtZSBgRm9ybUNvbnRyb2xgIGluc3RhbmNlcy5cbiAgICAgKiBXaGVuIG5vIG9wZXJhdG9yIGlzIHNlbGVjdGVkIGB1bmRlZmluZWRgIGlzIGVtaXR0ZWQuXG4gICAgICovXG4gICAgcHVibGljIGdldCBvcGVyYW5kc0Zvcm1Db250cm9scyQoKTogT2JzZXJ2YWJsZTxBcnJheTxGb3JtQ29udHJvbD4gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wZXJhbmRzRm9ybUNvbnRyb2xzJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIG5ldyB2YWx1ZSBpcyBlbWl0dGVkIHdoZW5ldmVyIHRoZSBzZWxlY3RlZCBvcGVyYXRvciBjaGFuZ2VzLiBgdW5kZWZpbmVkYCBpcyBlbWl0dGVkIGlmIG5vIG9wZXJhdG9yIGlzIHNlbGVjdGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgW29wZXJhdG9ycyB0ZW1wbGF0ZV17QGxpbmsgT3BlcmF0b3IjZ2V0T3BlcmF0b3JOYW1lVGVtcGxhdGV9IGluIHByb2Nlc3NlZCBmb3JtIGZpdCBmb3IgR1VJIHJlbmRlcmluZ1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgb3BlcmF0b3JUZW1wbGF0ZSQoKTogT2JzZXJ2YWJsZTxBcnJheTxPcGVyYXRvclRlbXBsYXRlUGFydD4gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wZXJhdG9yVGVtcGxhdGUkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHdoZXRoZXIgdGhlIGNhdGVnb3J5IGlzIGZ1bGx5IGNvbmZpZ3VyZWQgYW5kIHJlcHJlc2VudHMgYSB2YWxpZCBwcmVkaWNhdGUgb3Igbm90XG4gICAgICovXG4gICAgcHVibGljIGdldCBwcm92aWRlc1ByZWRpY2F0ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZ2VuZXJhdGVkUHJlZGljYXRlJC5nZXRWYWx1ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHRoZSBzZXQgb2YgRWxhc3RpY3NlYXJjaCBrZXl3b3JkcyB0aGF0IHNob3VsZCBiZSBxdWVyaWVkIGJ5IHF1ZXJpZXMgZ2VuZXJhdGVkIHdpdGggdGhpcyBjYXRlZ29yeS5cbiAgICAgKiBUaGUgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGlmIHRoZSBrZXl3b3JkcyBhcmUgbm90IHN0YXRpYyBhbmQgY2hhbmdlIGJhc2VkIG9uIHNvbWUgYWRkaXRpb25hbCBzZWxlY3Rpb24gKGVnLiBEYXRhIGZpZWxkcylcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0IGVsYXN0aWNLZXl3b3JkcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIHJlc3VsdC5wdXNoKC4uLnRoaXMuX2VsYXN0aWNLZXl3b3Jkcyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgdGhlIGFyaXR5IG9mIHRoZSBzZWxlY3RlZCBvcGVyYXRvci4gVGhyb3dzIGFuIGVycm9yIGlmIG5vIG9wZXJhdG9yIGlzIHNlbGVjdGVkLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXQgc2VsZWN0ZWRPcGVyYXRvckFyaXR5KCk6IG51bWJlciB7XG4gICAgICAgIGlmICghdGhpcy5pc09wZXJhdG9yU2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbiBvcGVyYXRvciBtdXMgYmUgc2VsZWN0ZWQgYmVmb3JlIGl0cyBhcml0eSBjYW4gYmUgcmVzb2x2ZWQhJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRPcGVyYXRvci5udW1iZXJPZk9wZXJhbmRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIHN0YXRlIG9mIHRoZSBDYXRlZ29yeS4gQ2F0ZWdvcnkgY2FuIGNyZWF0ZSBxdWVyaWVzIHdoZW4gYW4ge0BsaW5rIE9wZXJhdG9yfSBpcyBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIENhdGVnb3J5IGNsYXNzIGFzIHByZWRpY2F0ZSBidWlsZGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wZXJhdG9ySW5kZXggaW5kZXggaW4gdGhlIFthbGxvd2VkT3BlcmF0b3JzXXtAbGluayBDYXRlZ29yeSNhbGxvd2VkT3BlcmF0b3JzfSBhcnJheSBvZiB0aGUge0BsaW5rIE9wZXJhdG9yfSB0aGF0XG4gICAgICogc2hvdWxkIGJlIHNlbGVjdGVkXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdE9wZXJhdG9yKG9wZXJhdG9ySW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBvcGVyYXRvcnMgPSB0aGlzLmFsbG93ZWRPcGVyYXRvcnM7XG4gICAgICAgIGlmIChvcGVyYXRvckluZGV4IDwgMCB8fCBvcGVyYXRvckluZGV4ID49IG9wZXJhdG9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZy53YXJuKGBUaGUgcHJvdmlkZWQgJ29wZXJhdG9ySW5kZXgnIGlzIG91dCBvZiByYW5nZS5gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vcGVyYXRvckZvcm1Db250cm9sLnNldFZhbHVlKG9wZXJhdG9yc1tvcGVyYXRvckluZGV4XSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyB0aGUgc3RhdGUgb2YgdGhlIENhdGVnb3J5IGFuZCBnZW5lcmF0ZXMgYSBxdWVyeSBpZiBhbGwgbmVjZXNzYXJ5IG9wZXJhbmRzIHdlcmUgc2V0LlxuICAgICAqXG4gICAgICogSWYgeW91IGFyZSB1c2luZyB0aGUgY2F0ZWdvcnkgYXMgYSBidWlsZGVyLiBDb25zaWRlciB1c2luZyB0aGUgW2dlbmVyYXRlUHJlZGljYXRlKClde0BsaW5rIENhdGVnb3J5I2dlbmVyYXRlUHJlZGljYXRlfVxuICAgICAqIG1ldGhvZCBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHVzZXJJbnB1dCB2YWx1ZXMgZW50ZXJlZCBieSB0aGUgdXNlci4gVGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkgc2hvdWxkIG1hdGNoIHRoZVxuICAgICAqIFthcml0eV17QGxpbmsgT3BlcmF0b3IjX251bWJlck9mT3BlcmFuZHN9IG9mIHRoZSBzZWxlY3RlZCBPcGVyYXRvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0T3BlcmFuZHModXNlcklucHV0OiBBcnJheTxUPik6IHZvaWQge1xuICAgICAgICBjb25zdCByYW5nZSA9IE1hdGgubWluKHVzZXJJbnB1dC5sZW5ndGgsIHRoaXMuX29wZXJhbmRzRm9ybUNvbnRyb2xzLmxlbmd0aCk7XG4gICAgICAgIGlmIChyYW5nZSA8IHVzZXJJbnB1dC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZy53YXJuKGAke3VzZXJJbnB1dC5sZW5ndGh9IG9wZXJhbmRzIGFyZSBiZWluZyBzZXQsIGJ1dCBvbmx5ICR7cmFuZ2V9IGlucHV0cyBhcmUgYXZhaWxhYmxlIWBcbiAgICAgICAgICAgICAgICArICcgRXh0cmEgb3BlcmFuZHMgd2lsbCBiZSBpZ25vcmVkLicpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2U7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5fb3BlcmFuZHNGb3JtQ29udHJvbHNbaV0uc2V0VmFsdWUodXNlcklucHV0W2ldKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmFuZ2UgIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMub3BlcmFuZFZhbHVlQ2hhbmdlcyhyYW5nZSAtIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSBzdGF0ZSBvZiB0aGUgQ2F0ZWdvcnksIGRlc2VsZWN0aW5nIGFueSBzZWxlY3RlZCBjYXRlZ29yeSBhbmQgcmVtb3Zpbmcgb3RoZXIgc3RhdGVcbiAgICAgKiBpbmZvcm1hdGlvbiBpZiB0aGUgQ2F0ZWdvcnkgZGVmaW5lcyB0aGVtLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gcmVzZXQgdGhlIHN0YXRlIG9mIHRoZSBjYXRlZ29yeSBhZnRlciBlYWNoIHByZWRpY2F0ZSBjb25zdHJ1Y3RlZCxcbiAgICAgKiBlZmZlY3RpdmVseSB0dXJuaW5nIHRoZSBjYXRlZ29yeSBpbnN0YW5jZSBpbnRvIGEgcHJlZGljYXRlIGJ1aWxkZXIuXG4gICAgICovXG4gICAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNsZWFyT3BlcmF0b3JTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5fb3BlcmFuZHNGb3JtQ29udHJvbHMuZm9yRWFjaChmYyA9PiB7XG4gICAgICAgICAgICBmYy5zZXRWYWx1ZSh1bmRlZmluZWQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxscyB0aGUgW2NyZWF0ZVF1ZXJ5XXtAbGluayBPcGVyYXRvciNjcmVhdGVRdWVyeX0gbWV0aG9kIG9uIHRoZSBzZWxlY3RlZCBPcGVyYXRvci5cbiAgICAgKlxuICAgICAqIFRocm93cyBhbiBFcnJvciBpZiBubyBPcGVyYXRvciBpcyBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZSBxdWVyeSBzaG91bGQgYmUgZ2VuZXJhdGVkIGluIHNvbWUgb3RoZXIgd2F5LlxuICAgICAqIEBwYXJhbSB1c2VySW5wdXQgdmFsdWVzIGVudGVyZWQgYnkgdGhlIHVzZXIuIFRoZSBsZW5ndGggb2YgdGhlIGFycmF5IHNob3VsZCBtYXRjaCB0aGVcbiAgICAgKiBbYXJpdHlde0BsaW5rIE9wZXJhdG9yI19udW1iZXJPZk9wZXJhbmRzfSBvZiB0aGUgc2VsZWN0ZWQgT3BlcmF0b3IuXG4gICAgICogQHJldHVybnMgdGhlIFF1ZXJ5IGdlbmVyYXRlZCBieSB0aGUgc2VsZWN0ZWQgT3BlcmF0b3JcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2VuZXJhdGVRdWVyeSh1c2VySW5wdXQ6IEFycmF5PFQ+KTogUXVlcnkge1xuICAgICAgICBpZiAoIXRoaXMuaXNPcGVyYXRvclNlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2F0ZWdvcnkgY2Fubm90IGdlbmVyYXRlIGEgUXVlcnkgaWYgbm8gT3BlcmF0b3IgaXMgc2VsZWN0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fb3BlcmF0b3JGb3JtQ29udHJvbC52YWx1ZS5jcmVhdGVRdWVyeSh0aGlzLmVsYXN0aWNLZXl3b3JkcywgdXNlcklucHV0IGFzIHVua25vd24gYXMgQXJyYXk8c3RyaW5nPik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbHMgdGhlIFtnZW5lcmF0ZVF1ZXJ5XXtAbGluayBDYXRlZ29yeSNnZW5lcmF0ZVF1ZXJ5fSBtZXRob2QgYW5kIGNyZWF0ZXMgYW4ge0BsaW5rIEVsZW1lbnRhcnlQcmVkaWNhdGV9IHdpdGggdGhlIHJlc3VsdC5cbiAgICAgKiBAcGFyYW0gdXNlcklucHV0IHZhbHVlcyBlbnRlcmVkIGJ5IHRoZSB1c2VyLiBUaGUgbGVuZ3RoIG9mIHRoZSBhcnJheSBzaG91bGQgbWF0Y2ggdGhlXG4gICAgICogW2FyaXR5XXtAbGluayBPcGVyYXRvciNfbnVtYmVyT2ZPcGVyYW5kc30gb2YgdGhlIHNlbGVjdGVkIE9wZXJhdG9yLlxuICAgICAqIEByZXR1cm5zIFByZWRpY2F0ZSB3aXRoIHtAbGluayBRdWVyeX0gZ2VuZXJhdGVkIGJ5IHRoaXMgb2JqZWN0J3MgW2dlbmVyYXRlUXVlcnlde0BsaW5rIENhdGVnb3J5I2dlbmVyYXRlUXVlcnl9IG1ldGhvZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZW5lcmF0ZVByZWRpY2F0ZSh1c2VySW5wdXQ6IEFycmF5PFQ+KTogRWxlbWVudGFyeVByZWRpY2F0ZSB7XG4gICAgICAgIHJldHVybiBuZXcgRWxlbWVudGFyeVByZWRpY2F0ZSh0aGlzLmdlbmVyYXRlUXVlcnkodXNlcklucHV0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWN0cyB0aGUgZGVmYXVsdCBvcGVyYXRvciB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBxdWVyeSBnZW5lcmF0aW9uLCB3aGVuIG5vIE9wZXJhdG9yIHNlbGVjdGlvbiBpcyBwcm92aWRlZCB0byB0aGUgdXNlci5cbiAgICAgKlxuICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNlbGVjdHMgdGhlIGZpcnN0IG9wZXJhdG9yIGluIHRoZSBbX2FsbG93ZWRPcGVyYXRvcnNde0BsaW5rIENhdGVnb3J5I2FsbG93ZWRPcGVyYXRvcnN9IGFycmF5LlxuICAgICAqXG4gICAgICogU2VlIFtzZWxlY3RPcGVyYXRvcigpXXtAbGluayBDYXRlZ29yeSNzZWxlY3RPcGVyYXRvcn0gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdERlZmF1bHRPcGVyYXRvcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWxlY3RPcGVyYXRvcigwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB0aGUgdHJhbnNsYXRpb24gc3RyaW5nIHBhdGggZm9yIHRoZSB0ZXh0IHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiB0aGUgaW5wdXQgcGxhY2Vob2xkZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0IGlucHV0UGxhY2Vob2xkZXIoKTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgd2hldGhlciB0aGUgY2F0ZWdvcnkgdGV4dCBzaG91bGQgYmUgcmVuZGVyZWQgd2l0aCBib2xkIHRleHQgd2hlbiBzZWxlY3RlZFxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXQgZGlzcGxheUJvbGQoKTogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHdoZXRoZXIgYW4gb3BlcmF0b3IgaXMgY3VycmVudGx5IHNlbGVjdGVkIG9yIG5vdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNPcGVyYXRvclNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9vcGVyYXRvckZvcm1Db250cm9sLnZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc2VsZWN0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG9wZXJhdG9yIChpZiBhbnkpXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyT3BlcmF0b3JTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29wZXJhdG9yRm9ybUNvbnRyb2wuc2V0VmFsdWUodW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZHVwbGljYXRlIG9mIHRoZSBjdXJyZW50IGNhdGVnb3J5IG9iamVjdC4gTm90ZSB0aGF0IGEgZHVwbGljYXRlIGlzIE5PVCBhIGNsb25lLlxuICAgICAqIFRoZSBzdGF0ZSBvZiB0aGUgcmV0dXJuZWQgY2F0ZWdvcnkgaXMgbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBzdGF0ZSBvZiB0aGlzIGNhdGVnb3J5LlxuICAgICAqXG4gICAgICogQHJldHVybnMgYSBjYXRlZ29yeSBpbnN0YW5jZSBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoaXMgY2F0ZWdvcnkgaW4gaXRzIGluaXRpYWwgc3RhdGUuXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGR1cGxpY2F0ZSgpOiBDYXRlZ29yeTxUPjtcblxuICAgIC8qKlxuICAgICAqIFByb3ZpZGVzIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZm9yIHRoZSBzZXJpYWxpc2F0aW9uIG9mIHRoaXMgY2F0ZWdvcnkncyBzdGF0ZS5cbiAgICAgKlxuICAgICAqIE5vdCBldmVyeSBzdGF0ZSBtdXN0IGJlIHByZXNlcnZhYmxlLiBUaGUgZGVmYXVsdCBsaWJyYXJ5IGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIHByZXNlcnZhdGlvbiBvZiB0aGUgZmluYWwgc3RhdGUgd2hlbiB0aGVcbiAgICAgKiBDYXRlZ29yeSBpcyBnZW5lcmF0aW5nIGEgcHJlZGljYXRlIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGFuIG9iamVjdCBjb250YWluaW5nIGFsbCB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGZvciB0aGUgcmVjb25zdHJ1Y3Rpb24gb2YgdGhpcyBjYXRlZ29yeSdzIHN0YXRlLFxuICAgICAqIGJhcnJpbmcgaW5mb3JtYXRpb24gYWJvdXQgYWxsb3dlZCBuZXRzLiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoZSBjYXRlZ29yeSBpcyBub3QgaW4gYSBzdGF0ZSB0aGF0IGdlbmVyYXRlcyBhIHByZWRpY2F0ZS5cbiAgICAgKiBTZWUgW3Byb3ZpZGVzUHJlZGljYXRlKClde0BsaW5rIENhdGVnb3J5I3Byb3ZpZGVzUHJlZGljYXRlfS5cbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlTWV0YWRhdGEoKTogQ2F0ZWdvcnlHZW5lcmF0b3JNZXRhZGF0YSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICghdGhpcy5wcm92aWRlc1ByZWRpY2F0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2F0ZWdvcnk6IHRoaXMuc2VyaWFsaXplQ2xhc3MoKSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY3JlYXRlTWV0YWRhdGFDb25maWd1cmF0aW9uKCksXG4gICAgICAgICAgICB2YWx1ZXM6IHRoaXMuY3JlYXRlTWV0YWRhdGFWYWx1ZXMoKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc3RvcmVzIHRoZSBzYXZlZCBzdGF0ZSBjb250YWluZWQgaW4gdGhlIHByb3ZpZGVkIG1ldGFkYXRhLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1ldGFkYXRhIHRoZSBtZXRhZGF0YSBjcmVhdGVkIGJ5IGNhbGxpbmcgdGhlIFtjcmVhdGVNZXRhZGF0YSgpXXtAbGluayBDYXRlZ29yeSNjcmVhdGVNZXRhZGF0YX0gbWV0aG9kXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBhbiBPYnNlcnZhYmxlLiBXaGVuIHRoZSBPYnNlcnZhYmxlIGVtaXRzIHRoZSBjYXRlZ29yeSBoYXMgZmluaXNoZWQgcmVzdG9yaW5nIGl0cyBzdGF0ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgbG9hZEZyb21NZXRhZGF0YShtZXRhZGF0YTogQ2F0ZWdvcnlHZW5lcmF0b3JNZXRhZGF0YSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBjb25zdCByZXN1bHQkID0gbmV3IFJlcGxheVN1YmplY3Q8dm9pZD4oMSk7XG4gICAgICAgIHRoaXMubG9hZENvbmZpZ3VyYXRpb25Gcm9tTWV0YWRhdGEobWV0YWRhdGEuY29uZmlndXJhdGlvbikuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9hZFZhbHVlc0Zyb21NZXRhZGF0YShtZXRhZGF0YS52YWx1ZXMpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzdWx0JC5uZXh0KCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0JC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0JC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZSBpbiB0aGUgY29uc3RydWN0b3IuIEFwYXJ0IGZyb20gY2FsbGluZyB0aGlzIG1ldGhvZCwgdGhlIGNvbnN0cnVjdG9yIG9ubHkgY3JlYXRlcyBpbnN0YW5jZXMgdG8gZmlsbCB0aGUgcHJvdGVjdGVkXG4gICAgICogZmllbGRzIG9mIHRoaXMgY2xhc3MuXG4gICAgICpcbiAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBtYW5hZ2VzIGNyZWF0aW9uIG9mIG9wZXJhbmQgYEZvcm1Db250cm9sYCBpbnN0YW5jZXMgYW5kIG1hbmFnZXMgc3Vic2NyaXB0aW9ucyB0byB0aGVtLlxuICAgICAqXG4gICAgICogWW91IGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjaGFuZ2UgdGhlIGluaXRpYWxpemF0aW9uIG9mIHlvdXIgY2F0ZWdvcnkgd2l0aG91dCBoYXZpbmcgdG8gcmV3cml0ZSB0aGUgYmFzZVxuICAgICAqIGNvbnN0cnVjdG9yIGZyb20gc2NyYXRjaC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgaW5pdGlhbGl6ZUNhdGVnb3J5KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vcGVyYXRvckZvcm1Db250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKG5ld09wZXJhdG9yOiBPcGVyYXRvcjxhbnk+KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9vcGVyYW5kc0Zvcm1Db250cm9scy5mb3JFYWNoKGZjID0+IHtcbiAgICAgICAgICAgICAgICBmYy5zZXRWYWx1ZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICghbmV3T3BlcmF0b3IpIHtcbiAgICAgICAgICAgICAgICAvLyB1bmRlZmluZWQgaXMgbmV4dC1lZCBpbnRvIHRoZSBzdHJlYW0uIE1hcmtlZCBhcyBjb2RlIHNtZWxsIGJ5IHNvbmFyIHdoZW4gZXhwbGljaXRseSBzdGF0ZWRcbiAgICAgICAgICAgICAgICB0aGlzLl9vcGVyYW5kc0Zvcm1Db250cm9scyQubmV4dCgpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcGVyYW5kc0Zvcm1Db250cm9scy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2VuZXJhdGVkUHJlZGljYXRlJC5uZXh0KHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG5ld09wZXJhdG9yLm51bWJlck9mT3BlcmFuZHMgPiB0aGlzLl9vcGVyYW5kc0Zvcm1Db250cm9scy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5fb3BlcmFuZHNGb3JtQ29udHJvbHMubGVuZ3RoIDwgbmV3T3BlcmF0b3IubnVtYmVyT2ZPcGVyYW5kcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmYyA9IG5ldyBGb3JtQ29udHJvbCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TGVuZ3RoID0gdGhpcy5fb3BlcmFuZHNGb3JtQ29udHJvbHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBmYy52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoNjAwKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3BlcmFuZFZhbHVlQ2hhbmdlcyhjdXJyZW50TGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29wZXJhbmRzRm9ybUNvbnRyb2xzLnB1c2goZmMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fb3BlcmFuZHNGb3JtQ29udHJvbHMkLm5leHQodGhpcy5fb3BlcmFuZHNGb3JtQ29udHJvbHMuc2xpY2UoMCwgbmV3T3BlcmF0b3IubnVtYmVyT2ZPcGVyYW5kcykpO1xuXG4gICAgICAgICAgICBpZiAobmV3T3BlcmF0b3IubnVtYmVyT2ZPcGVyYW5kcyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlbmVyYXRlZFByZWRpY2F0ZSQubmV4dCh0aGlzLmdlbmVyYXRlUHJlZGljYXRlKFtdKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBtZXRob2QgdGhhdCBpcyAoYnkgZGVmYXVsdCkgY2FsbGVkIHdoZW5ldmVyIGFuIG9wZXJhbmQgYEZvcm1Db250cm9sYCBjaGFuZ2VzIGl0cyB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcGVyYW5kSW5kZXggdGhlIGluZGV4IG9mIHRoZSBvcGVyYW5kIHRoYXQgY2hhbmdlZCBpdHMgdmFsdWVcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgb3BlcmFuZFZhbHVlQ2hhbmdlcyhvcGVyYW5kSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNPcGVyYXRvclNlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2dlbmVyYXRlZFByZWRpY2F0ZSQubmV4dCh1bmRlZmluZWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcGVyYW5kSW5kZXggPj0gdGhpcy5zZWxlY3RlZE9wZXJhdG9yQXJpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWxlY3RlZE9wZXJhdG9yQXJpdHk7IGkrKykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzT3BlcmFuZFZhbHVlU2VsZWN0ZWQodGhpcy5fb3BlcmFuZHNGb3JtQ29udHJvbHNbaV0udmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2dlbmVyYXRlZFByZWRpY2F0ZSQuZ2V0VmFsdWUoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9nZW5lcmF0ZWRQcmVkaWNhdGUkLm5leHQodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZ2VuZXJhdGVkUHJlZGljYXRlJC5uZXh0KHRoaXMuZ2VuZXJhdGVQcmVkaWNhdGUodGhpcy5fb3BlcmFuZHNGb3JtQ29udHJvbHMubWFwKGZjID0+IHRoaXMudHJhbnNmb3JtQ2F0ZWdvcnlWYWx1ZShmYy52YWx1ZSkpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgdGhlIGNhdGVnb3J5IGNsYXNzIGluIGEgc2VyaWFsaXphYmxlIGZvcm1cbiAgICAgKlxuICAgICAqIEBkZXByZWNhdGVkIGluIDUuNi4wIC0gQ2F0ZWdvcnkgc2VyaWFsaXNhdGlvbiBzaG91bGQgYmUgZG9uZSBieSB1dGlsaXNpbmcgdGhlIHtAbGluayBDYXRlZ29yeVJlc29sdmVyU2VydmljZX0gaW5zdGVhZFxuICAgICAqL1xuICAgIGFic3RyYWN0IHNlcmlhbGl6ZUNsYXNzKCk6IENhdGVnb3JpZXMgfCBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzZXJpYWxpemVzIG9ubHkgdGhlIG9wZXJhdG9yLlxuICAgICAqIElmIHRoZSBjYXRlZ29yeSBjb250YWlucyBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24sIHRoaXMgbWV0aG9kIG11c3QgYmUgZXh0ZW5kZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBhbiBvYmplY3QgY29udGFpbmluZyBhbGwgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmb3IgdGhlIHJlY29uc3RydWN0aW9uIG9mIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoaXMgY2F0ZWdvcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY3JlYXRlTWV0YWRhdGFDb25maWd1cmF0aW9uKCk6IENhdGVnb3J5TWV0YWRhdGFDb25maWd1cmF0aW9uIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIFtDYXRlZ29yeS5PUEVSQVRPUl9NRVRBREFUQV06IHRoaXMuc2VsZWN0ZWRPcGVyYXRvci5zZXJpYWxpemUoKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgdGhlIHZhbHVlIG9mIGFsbCBvcGVyYW5kIGZvcm0gY29udHJvbCBvYmplY3RzIHVwIHRvIHRoZSBjdXJyZW50IG51bWJlciBvZiBvcGVyYW5kcy5cbiAgICAgKiBUbyBzZXJpYWxpemUgdmFsdWUgb2YgZWFjaCBvcGVyYW5kIHRoZSBbc2VyaWFsaXplT3BlcmFuZFZhbHVlKClde0BsaW5rIENhdGVnb3J5I3NlcmlhbGl6ZU9wZXJhbmRWYWx1ZX0gbWV0aG9kIGlzIHVzZWQuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgdmFsdWVzIHVzZWQgYnkgdGhpcyBjYXRlZ29yeSBhcmUgbm90IHNlcmlhbGl6YWJsZSwgdGhlbiBlaXRoZXIgdGhpcyBtZXRob2QsIG9yIHRoZSBgc2VyaWFsaXplT3BlcmFuZFZhbHVlYCBtZXRob2QsXG4gICAgICogbXVzdCBiZSBvdmVycmlkZGVuLlxuICAgICAqXG4gICAgICogQHJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB2YWx1ZXMgaW5wdXQgYnkgdGhlIHVzZXIgaW4gYSBzZXJpYWxpemFibGUgZm9ybVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGVNZXRhZGF0YVZhbHVlcygpOiBBcnJheTx1bmtub3duPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRPcGVyYXRvckFyaXR5OyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuc2VyaWFsaXplT3BlcmFuZFZhbHVlKHRoaXMuX29wZXJhbmRzRm9ybUNvbnRyb2xzW2ldKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdmFsdWVGb3JtQ29udHJvbCBGb3JtQ29udHJvbCBvYmplY3Qgb2Ygb25lIG9wZXJhbmRcbiAgICAgKiBAcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIG9wZXJhbmQgaW4gYSBzZXJpYWxpemVkIGZvcm0uIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgdGhlIEZvcm1Db250cm9scyBgdmFsdWVgIGF0dHJpYnV0ZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc2VyaWFsaXplT3BlcmFuZFZhbHVlKHZhbHVlRm9ybUNvbnRyb2w6IEZvcm1Db250cm9sKTogdW5rbm93biB7XG4gICAgICAgIHJldHVybiB2YWx1ZUZvcm1Db250cm9sLnZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc3RvcmVkIHRoZSBzYXZlZCBjb25maWd1cmF0aW9uIGZyb20gdGhlIG1ldGFkYXRhIGNyZWF0ZWQgYnkgdGhlXG4gICAgICogW2NyZWF0ZU1ldGFkYXRhQ29uZmlndXJhdGlvbigpXXtAbGluayBDYXRlZ29yeSNjcmVhdGVNZXRhZGF0YUNvbmZpZ3VyYXRpb259IG1ldGhvZC5cbiAgICAgKlxuICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJlc3RvcmVzIG9ubHkgdGhlIHNhdmVkIG9wZXJhdG9yLlxuICAgICAqXG4gICAgICogSWYgdGhlIENhdGVnb3J5IG92ZXJyaWRlcyB0aGUgc2VyaWFsaXphdGlvbiBtZXRob2QsIGl0IG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgd2VsbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIHRoZSBzZXJpYWxpemVkIGNvbmZpZ3VyYXRpb25cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGFuIE9ic2VydmFibGUuIFdoZW4gdGhlIE9ic2VydmFibGUgZW1pdHMgdGhlIGNhdGVnb3J5IGhhcyBmaW5pc2hlZCBsb2FkaW5nIGl0cyBjb25maWd1cmF0aW9uLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBsb2FkQ29uZmlndXJhdGlvbkZyb21NZXRhZGF0YShjb25maWd1cmF0aW9uOiBDYXRlZ29yeU1ldGFkYXRhQ29uZmlndXJhdGlvbik6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBjb25zdCByZXNvbHZlZE9wZXJhdG9yID0gdGhpcy5fb3BlcmF0b3JTZXJ2aWNlLmdldEZyb21NZXRhZGF0YShjb25maWd1cmF0aW9uW0NhdGVnb3J5Lk9QRVJBVE9SX01FVEFEQVRBXSBhcyBPcGVyYXRvcnMgfCBzdHJpbmcpO1xuICAgICAgICB0aGlzLnNlbGVjdE9wZXJhdG9yKHRoaXMuYWxsb3dlZE9wZXJhdG9ycy5maW5kSW5kZXgob3AgPT4gb3AgPT09IHJlc29sdmVkT3BlcmF0b3IpKTtcbiAgICAgICAgcmV0dXJuIG9mVm9pZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNldHMgdGhlIHByb3ZpZGVkIHZhbHVlcyBpbnRvIHRoaXMgQ2F0ZWdvcnkncyBvcGVyYW5kIGZvcm0gY29udHJvbHMuXG4gICAgICpcbiAgICAgKiBBbiBvcGVyYXRvciBtdXN0IGJlIHNldCBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZCEgT3RoZXJ3aXNlIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuICAgICAqXG4gICAgICogSWYgdGhlIG51bWJlciBvZiB2YWx1ZXMgZG9lc24ndCBtYXRjaCB0aGUgYXJpdHkgb2YgdGhlIHNlbGVjdGVkIG9wZXJhdG9yIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duIVxuICAgICAqXG4gICAgICogSWYgdGhpcyBDYXRlZ29yeSBvdmVycmlkZXMgdGhlIFtzZXJpYWxpemVPcGVyYW5kVmFsdWUoKV17QGxpbmsgQ2F0ZWdvcnkjc2VyaWFsaXplT3BlcmFuZFZhbHVlfSwgaXQgbXVzdCBhbHNvXG4gICAgICogb3ZlcnJpZGUgaXRzIGRlc2VyaWFsaXphdGlvbiBjb3VudGVycGFydCAtIFtkZXNlcmlhbGl6ZU9wZXJhbmRWYWx1ZSgpXXtAbGluayAjQ2F0ZWdvcnkjZGVzZXJpYWxpemVPcGVyYW5kVmFsdWV9IVxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlcyB0aGUgc2VyaWFsaXplZCB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgbG9hZGVkIGludG8gdGhpcyBDYXRlZ29yeSBpbnN0YW5jZVxuICAgICAqXG4gICAgICogQHJldHVybnMgYW4gT2JzZXJ2YWJsZS4gV2hlbiB0aGUgT2JzZXJ2YWJsZSBlbWl0cyB0aGUgY2F0ZWdvcnkgaGFzIGZpbmlzaGVkIGxvYWRpbmcgaXRzIHZhbHVlcy5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbG9hZFZhbHVlc0Zyb21NZXRhZGF0YSh2YWx1ZXM6IEFycmF5PHVua25vd24+KTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy5pc09wZXJhdG9yU2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbiBvcGVyYXRvciBtdXN0IGJlIHNlbGVjdGVkIGJlZm9yZSBDYXRlZ29yeSB2YWx1ZXMgY2FuIGJlIHJlc29sdmVkIGZyb20gbWV0YWRhdGEhJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRPcGVyYXRvckFyaXR5ICE9PSB2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBhcml0eSBvZiB0aGUgc2VsZWN0ZWQgb3BlcmF0b3IgKCR7dGhpcy5zZWxlY3RlZE9wZXJhdG9yQXJpdHlcbiAgICAgICAgICAgIH0pIGRvZXNuJ3QgbWF0Y2ggdGhlIG51bWJlciBvZiB0aGUgcHJvdmlkZWQgdmFsdWVzICgke3ZhbHVlcy5sZW5ndGh9KSFgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZXNlcmlhbGl6ZWRWYWx1ZXNPYnNlcnZhYmxlcyA9IHZhbHVlcy5tYXAodiA9PiB0aGlzLmRlc2VyaWFsaXplT3BlcmFuZFZhbHVlKHYpKTtcbiAgICAgICAgY29uc3QgcmVzdWx0JCA9IG5ldyBSZXBsYXlTdWJqZWN0PHZvaWQ+KDEpO1xuICAgICAgICBmb3JrSm9pbihkZXNlcmlhbGl6ZWRWYWx1ZXNPYnNlcnZhYmxlcykucGlwZShkZWZhdWx0SWZFbXB0eShbXSkpLnN1YnNjcmliZShkZXNlcmlhbGl6ZWRWYWx1ZXMgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRPcGVyYW5kcyhkZXNlcmlhbGl6ZWRWYWx1ZXMpO1xuICAgICAgICAgICAgcmVzdWx0JC5uZXh0KCk7XG4gICAgICAgICAgICByZXN1bHQkLmNvbXBsZXRlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0JC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHNlcmlhbGl6ZWQgb3V0cHV0IG9mIHRoZSBbc2VyaWFsaXplT3BlcmFuZFZhbHVlKClde0BsaW5rIENhdGVnb3J5I3NlcmlhbGl6ZU9wZXJhbmRWYWx1ZX0gbWV0aG9kXG4gICAgICogQHJldHVybnMgYW4gYE9ic2VydmFibGVgIHRoYXQgZW1pdHMgdGhlIGRlc2VyaWFsaXplZCB2YWx1ZSwgdGhhdCBjYW4gYmUgc2V0IGFzIEZvcm1Db250cm9sIHZhbHVlIGFuZCB0aGVuIGNvbXBsZXRlc1xuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgbWF5IHRocm93IG5hIGVycm9yIGlmIHRoZSB2YWx1ZSBjYW5ub3QgYmUgZGVzZXJpYWxpemVkLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBkZXNlcmlhbGl6ZU9wZXJhbmRWYWx1ZSh2YWx1ZTogdW5rbm93bik6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIHJldHVybiBvZih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIG5ld1ZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgYEZvcm1Db250cm9sYCBvYmplY3QgdGhhdCB3ZSB3YW50IHRvIHRlc3RcbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5ld2x5IHNlbGVjdGVkIHZhbHVlIGlzIGEgdmFsaWQgdmFsdWUsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhYnN0cmFjdCBpc09wZXJhbmRWYWx1ZVNlbGVjdGVkKG5ld1ZhbHVlOiBhbnkpOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYSB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgYEZvcm1Db250cm9sYCB2YWx1ZSBiZWZvcmUgcGFzc2luZyBpdCBpbnRvIHRoZSBzZWxlY3RlZCBgT3BlcmF0b3JgIGZvciBxdWVyeSBnZW5lcmF0aW9uLlxuICAgICAqIEl0IGlzIG1vc3RseSB1c2VmdWwgb25seSBmb3IgQXV0b2NvbXBsZXRlQ2F0ZWdvcmllcywgd2hlcmUgdGhlIHNlbGVjdGVkIHZhbHVlIG9mIHRoZSBGb3JtQ29udHJvbCBpcyBhbiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwZXJmb3JtcyBhbiBpZGVudGl0eSB0cmFuc2Zvcm1hdGlvbiAtIHJldHVybnMgdGhlIGlucHV0LlxuICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgRm9ybUNvbnRyb2xWYWx1ZVxuICAgICAqIEByZXR1cm5zIHRoZSB2YWx1ZSB1c2VkIGZvciBxdWVyeSBnZW5lcmF0aW9uXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHRyYW5zZm9ybUNhdGVnb3J5VmFsdWUodmFsdWU6IGFueSk6IFQge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgYW4gQXJyYXkgY29udGFpbmluZyB0ZXh0IHNlZ21lbnRzIHJlcHJlc2VudGluZyB0aGUgY29udGVudCBvZiB0aGUgcHJlZGljYXRlIGdlbmVyYXRlZCBieSB0aGlzIGNhdGVnb3J5XG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZUZpbHRlclRleHRTZWdtZW50cygpOiBBcnJheTxGaWx0ZXJUZXh0U2VnbWVudD4ge1xuICAgICAgICBpZiAoIXRoaXMucHJvdmlkZXNQcmVkaWNhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAge3NlZ21lbnQ6IHRoaXMudHJhbnNsYXRpb25QYXRoLCBib2xkOiB0aGlzLmRpc3BsYXlCb2xkfSxcbiAgICAgICAgICAgIC4uLnRoaXMuY3JlYXRlQ29uZmlndXJhdGlvbkZpbHRlclRleHRTZWdtZW50cygpLFxuICAgICAgICAgICAgLi4udGhpcy5jcmVhdGVPcGVyYXRvckZpbHRlclRleHRTZWdtZW50cygpXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgYW4gQXJyYXkgY29udGFpbmluZyB0ZXh0IHNlZ21lbnRzIHJlcHJlc2VudGluZyB0aGUgY29uZmlndXJhdGlvbiBpbnB1dHMgb2YgdGhpcyBjYXRlZ29yeVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhYnN0cmFjdCBjcmVhdGVDb25maWd1cmF0aW9uRmlsdGVyVGV4dFNlZ21lbnRzKCk6IEFycmF5PEZpbHRlclRleHRTZWdtZW50PjtcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIGFuIEFycmF5IGNvbnRhaW5pbmcgdGV4dCBzZWdtZW50cyByZXByZXNlbnRpbmcgdGhlIG9wZXJhdG9ycyB3aXRoIG9wZXJhbmRzIG9mIHRoaXMgY2F0ZWdvcnlcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY3JlYXRlT3BlcmF0b3JGaWx0ZXJUZXh0U2VnbWVudHMoKTogQXJyYXk8RmlsdGVyVGV4dFNlZ21lbnQ+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBBcnJheTxGaWx0ZXJUZXh0U2VnbWVudD4gPSBbXTtcbiAgICAgICAgbGV0IG9wZXJhbmRJbmRleCA9IDA7XG4gICAgICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiB0aGlzLnNlbGVjdGVkT3BlcmF0b3IuZ2V0T3BlcmF0b3JOYW1lVGVtcGxhdGUoKSkge1xuICAgICAgICAgICAgaWYgKHNlZ21lbnQgPT09IE9wZXJhdG9yLklOUFVUX1BMQUNFSE9MREVSKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5jcmVhdGVPcGVyYW5kRmlsdGVyVGV4dFNlZ21lbnQob3BlcmFuZEluZGV4KSk7XG4gICAgICAgICAgICAgICAgb3BlcmFuZEluZGV4Kys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHtzZWdtZW50fSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBmaWx0ZXIgdGV4dCBzZWdtZW50IHJlcHJlc2VudGluZyB0aGUgb3BlcmFuZCB2YWx1ZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNyZWF0ZU9wZXJhbmRGaWx0ZXJUZXh0U2VnbWVudChvcGVyYW5kSW5kZXg6IG51bWJlcik6IEZpbHRlclRleHRTZWdtZW50IHtcbiAgICAgICAgbGV0IHNlZ21lbnQ7XG4gICAgICAgIGNvbnN0IG9wZXJhbmQgPSB0aGlzLl9vcGVyYW5kc0Zvcm1Db250cm9sc1tvcGVyYW5kSW5kZXhdLnZhbHVlO1xuICAgICAgICBzd2l0Y2ggKHRoaXMuaW5wdXRUeXBlKSB7XG4gICAgICAgICAgICBjYXNlIFNlYXJjaElucHV0VHlwZS5BVVRPQ09NUExFVEU6XG4gICAgICAgICAgICAgICAgc2VnbWVudCA9IG9wZXJhbmQudGV4dDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2VhcmNoSW5wdXRUeXBlLkRBVEU6XG4gICAgICAgICAgICAgICAgc2VnbWVudCA9IG9wZXJhbmQuZm9ybWF0KERBVEVfRk9STUFUX1NUUklORyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNlYXJjaElucHV0VHlwZS5EQVRFX1RJTUU6XG4gICAgICAgICAgICAgICAgc2VnbWVudCA9IG9wZXJhbmQuZm9ybWF0KERBVEVfVElNRV9GT1JNQVRfU1RSSU5HKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgc2VnbWVudCA9IG9wZXJhbmQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtzZWdtZW50LCBib2xkOiB0cnVlfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgZm9yIHNlbGVjdGVkIG9wZXJhdG9yXG4gICAgICogQHBhcmFtIG9wZXJhdG9yQ2xhc3MgdGhlIG9wZXJhdG9yIHRvIGJlIGNoZWNrZWRcbiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gb2YgdGhlIHN0YXRlbWVudFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBpc1NlbGVjdGVkT3BlcmF0b3Iob3BlcmF0b3JDbGFzczogVHlwZTxhbnk+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkT3BlcmF0b3IgPT09IHRoaXMuX29wZXJhdG9yU2VydmljZS5nZXRPcGVyYXRvcihvcGVyYXRvckNsYXNzKTtcbiAgICB9XG59XG4iXX0=
|
|
@@ -14,8 +14,8 @@ export class Substring extends Operator {
|
|
|
14
14
|
// TODO IMPROVEMENT 27.4.2020 - we could use regular expressions to search for substrings which would solve the unintuitive
|
|
15
15
|
// behavior that occurs when we search for strings that contain spaces. We need to escape the input string in a special way
|
|
16
16
|
// if we choose to do this
|
|
17
|
-
const escapedValue = Operator.escapeInput(args[0]).value;
|
|
18
|
-
return Operator.forEachKeyword(elasticKeywords, keyword => new Query(`(${keyword}
|
|
17
|
+
const escapedValue = Operator.escapeInput(args[0]).value.replace(' ', '\\ ');
|
|
18
|
+
return Operator.forEachKeyword(elasticKeywords, keyword => new Query(`(${keyword}:*${escapedValue}*)`));
|
|
19
19
|
}
|
|
20
20
|
getOperatorNameTemplate() {
|
|
21
21
|
return ['search.operator.substring', Operator.INPUT_PLACEHOLDER];
|
|
@@ -24,4 +24,4 @@ export class Substring extends Operator {
|
|
|
24
24
|
return Operators.SUBSTRING;
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Vic3RyaW5nLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG5ldGdyaWYvY29tcG9uZW50cy1jb3JlLyIsInNvdXJjZXMiOlsibGliL3NlYXJjaC9tb2RlbHMvb3BlcmF0b3Ivc3Vic3RyaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFdEM7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLFNBQVUsU0FBUSxRQUFnQjtJQUMzQztRQUNJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNiLENBQUM7SUFFRCxXQUFXLENBQUMsZUFBOEIsRUFBRSxJQUFtQjtRQUMzRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsMkhBQTJIO1FBQzNILDRIQUE0SDtRQUM1SCwyQkFBMkI7UUFDM0IsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3RSxPQUFPLFFBQVEsQ0FBQyxjQUFjLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxPQUFPLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzVHLENBQUM7SUFFRCx1QkFBdUI7UUFDbkIsT0FBTyxDQUFDLDJCQUEyQixFQUFFLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRCxTQUFTO1FBQ0wsT0FBTyxTQUFTLENBQUMsU0FBUyxDQUFDO0lBQy9CLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7T3BlcmF0b3J9IGZyb20gJy4vb3BlcmF0b3InO1xuaW1wb3J0IHtRdWVyeX0gZnJvbSAnLi4vcXVlcnkvcXVlcnknO1xuaW1wb3J0IHtPcGVyYXRvcnN9IGZyb20gJy4vb3BlcmF0b3JzJztcblxuLyoqXG4gKiBPcGVyYXRvciB0aGF0IG1hdGNoZXMgaWYgdGhlIGlucHV0IGlzIGEgc3Vic3RyaW5nIG9mIHNvbWUgdmFsdWUuXG4gKiBDYW4gb25seSBiZSB1c2VkIG9uIGZpZWxkcyB0aGF0IGFyZSB0ZXh0cyBhbmQgYXJlIG5vdCBpbmRleGVkIGFzIGtleXdvcmRzLlxuICovXG5leHBvcnQgY2xhc3MgU3Vic3RyaW5nIGV4dGVuZHMgT3BlcmF0b3I8c3RyaW5nPiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKDEpO1xuICAgIH1cblxuICAgIGNyZWF0ZVF1ZXJ5KGVsYXN0aWNLZXl3b3JkczogQXJyYXk8c3RyaW5nPiwgYXJnczogQXJyYXk8c3RyaW5nPik6IFF1ZXJ5IHtcbiAgICAgICAgdGhpcy5jaGVja0FyZ3VtZW50c0NvdW50KGFyZ3MpO1xuICAgICAgICAvLyBUT0RPIElNUFJPVkVNRU5UIDI3LjQuMjAyMCAtIHdlIGNvdWxkIHVzZSByZWd1bGFyIGV4cHJlc3Npb25zIHRvIHNlYXJjaCBmb3Igc3Vic3RyaW5ncyB3aGljaCB3b3VsZCBzb2x2ZSB0aGUgdW5pbnR1aXRpdmVcbiAgICAgICAgLy8gIGJlaGF2aW9yIHRoYXQgb2NjdXJzIHdoZW4gd2Ugc2VhcmNoIGZvciBzdHJpbmdzIHRoYXQgY29udGFpbiBzcGFjZXMuIFdlIG5lZWQgdG8gZXNjYXBlIHRoZSBpbnB1dCBzdHJpbmcgaW4gYSBzcGVjaWFsIHdheVxuICAgICAgICAvLyAgaWYgd2UgY2hvb3NlIHRvIGRvIHRoaXNcbiAgICAgICAgY29uc3QgZXNjYXBlZFZhbHVlID0gT3BlcmF0b3IuZXNjYXBlSW5wdXQoYXJnc1swXSkudmFsdWUucmVwbGFjZSgnICcsICdcXFxcICcpO1xuICAgICAgICByZXR1cm4gT3BlcmF0b3IuZm9yRWFjaEtleXdvcmQoZWxhc3RpY0tleXdvcmRzLCBrZXl3b3JkID0+IG5ldyBRdWVyeShgKCR7a2V5d29yZH06KiR7ZXNjYXBlZFZhbHVlfSopYCkpO1xuICAgIH1cblxuICAgIGdldE9wZXJhdG9yTmFtZVRlbXBsYXRlKCk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gWydzZWFyY2gub3BlcmF0b3Iuc3Vic3RyaW5nJywgT3BlcmF0b3IuSU5QVVRfUExBQ0VIT0xERVJdO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBPcGVyYXRvcnMgfCBzdHJpbmcge1xuICAgICAgICByZXR1cm4gT3BlcmF0b3JzLlNVQlNUUklORztcbiAgICB9XG59XG4iXX0=
|
|
@@ -10,7 +10,9 @@ import * as i0 from "@angular/core";
|
|
|
10
10
|
* default mapping don't affect your existing code.
|
|
11
11
|
*/
|
|
12
12
|
export class SearchIndexResolverService {
|
|
13
|
-
constructor() {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.KEYWORD = '.keyword';
|
|
15
|
+
}
|
|
14
16
|
/**
|
|
15
17
|
* Constructs the index name for the specified field.
|
|
16
18
|
*
|
|
@@ -23,7 +25,20 @@ export class SearchIndexResolverService {
|
|
|
23
25
|
* @returns the full name of the specified index
|
|
24
26
|
*/
|
|
25
27
|
getIndex(dataFieldIdentifier, index, keyword = false) {
|
|
26
|
-
return `dataSet.${dataFieldIdentifier}.${index}${keyword ?
|
|
28
|
+
return `dataSet.${dataFieldIdentifier}.${index}${keyword ? this.KEYWORD : ''}`;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Constructs the index name for the specified core field.
|
|
32
|
+
*
|
|
33
|
+
* Note that almost all combinations are valid and will not throw an error when used to query the database, but not all combinations are
|
|
34
|
+
* used by the application engine. The {@link SearchIndex} class has some information about which field types map to which indices, but
|
|
35
|
+
* you should consult the backend documentation for more reliable information.
|
|
36
|
+
* @param index the queried index
|
|
37
|
+
* @param keyword whether the keyword of a TEXT index should be queried
|
|
38
|
+
* @returns the full name of the specified index
|
|
39
|
+
*/
|
|
40
|
+
getCoreIndex(index, keyword = false) {
|
|
41
|
+
return `${index}${keyword ? this.KEYWORD : ''}`;
|
|
27
42
|
}
|
|
28
43
|
}
|
|
29
44
|
SearchIndexResolverService.ɵprov = i0.ɵɵdefineInjectable({ factory: function SearchIndexResolverService_Factory() { return new SearchIndexResolverService(); }, token: SearchIndexResolverService, providedIn: "root" });
|
|
@@ -33,4 +48,4 @@ SearchIndexResolverService.decorators = [
|
|
|
33
48
|
},] }
|
|
34
49
|
];
|
|
35
50
|
SearchIndexResolverService.ctorParameters = () => [];
|
|
36
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWluZGV4LXJlc29sdmVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbmV0Z3JpZi9jb21wb25lbnRzLWNvcmUvIiwic291cmNlcyI6WyJsaWIvc2VhcmNoL3NlYXJjaC1rZXl3b3JkLXJlc29sdmVyLXNlcnZpY2Uvc2VhcmNoLWluZGV4LXJlc29sdmVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQzs7QUFHekM7Ozs7Ozs7O0dBUUc7QUFJSCxNQUFNLE9BQU8sMEJBQTBCO0lBSW5DO1FBRmdCLFlBQU8sR0FBRyxVQUFVLENBQUM7SUFFckIsQ0FBQztJQUVqQjs7Ozs7Ozs7OztPQVVHO0lBQ0UsUUFBUSxDQUFDLG1CQUEyQixFQUFFLEtBQWtCLEVBQUUsT0FBTyxHQUFHLEtBQUs7UUFDNUUsT0FBTyxXQUFXLG1CQUFtQixJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQ25GLENBQUM7SUFFQzs7Ozs7Ozs7O09BU0c7SUFDRSxZQUFZLENBQUMsS0FBYSxFQUFFLE9BQU8sR0FBRyxLQUFLO1FBQzlDLE9BQU8sR0FBRyxLQUFLLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUNwRCxDQUFDOzs7O1lBcENGLFVBQVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1NlYXJjaEluZGV4fSBmcm9tICcuLi9tb2RlbHMvc2VhcmNoLWluZGV4JztcblxuLyoqXG4gKiBBIHV0aWxpdHkgc2VydmljZSB0aGF0IGFpbXMgdG8gcHJvdmlkZSBlbGFzdGljc2VhcmNoIHF1ZXJ5IHN0cmluZyBxdWVyeSBpbmRleCBuYW1lcyBmb3IgZGF0YSBzZXQgcXVlcmllcy5cbiAqXG4gKiBJZiB5b3VyIGFwcCB1c2VzIGEgY3VzdG9taXNlZCBlbGFzdGljc2VhcmNoIGRhdGFiYXNlIG1hcHBpbmcgZm9yIENhc2Ugb2JqZWN0cywgdGhhdCBhZmZlY3RzIHRoZSB3YXkgZGF0YSBmaWVsZHMgYXJlIGluZGV4ZWQgeW91IG11c3RcbiAqIHByb3ZpZGUgYW4gdXBkYXRlZCB2ZXJzaW9uIG9mIHRoaXMgc2VydmljZSwgc28gdGhhdCBzZWFyY2ggY2FuIGdlbmVyYXRlIGNvcnJlY3QgcXVlcmllcy5cbiAqXG4gKiBZb3UgYXJlIGVuY291cmFnZWQgdG8gdXNlIHRoaXMgc2VydmljZSB3aGVuIGNyZWF0aW5nIHtAbGluayBGaWx0ZXJ9cywgd2l0aCBlbGFzdGljIHF1ZXJ5IHN0cmluZyBxdWVyaWVzLCBzbyB0aGF0IGZ1dHVyZSBjaGFuZ2VzIHRvIHRoZVxuICogZGVmYXVsdCBtYXBwaW5nIGRvbid0IGFmZmVjdCB5b3VyIGV4aXN0aW5nIGNvZGUuXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFNlYXJjaEluZGV4UmVzb2x2ZXJTZXJ2aWNlIHtcblxuICAgIHB1YmxpYyByZWFkb25seSBLRVlXT1JEID0gJy5rZXl3b3JkJztcblxuICAgIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIHRoZSBpbmRleCBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIGZpZWxkLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IGFsbW9zdCBhbGwgY29tYmluYXRpb25zIGFyZSB2YWxpZCBhbmQgd2lsbCBub3QgdGhyb3cgYW4gZXJyb3Igd2hlbiB1c2VkIHRvIHF1ZXJ5IHRoZSBkYXRhYmFzZSwgYnV0IG5vdCBhbGwgY29tYmluYXRpb25zIGFyZVxuICAgICAqIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGVuZ2luZS4gVGhlIHtAbGluayBTZWFyY2hJbmRleH0gY2xhc3MgaGFzIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgd2hpY2ggZmllbGQgdHlwZXMgbWFwIHRvIHdoaWNoIGluZGljZXMsIGJ1dFxuICAgICAqIHlvdSBzaG91bGQgY29uc3VsdCB0aGUgYmFja2VuZCBkb2N1bWVudGF0aW9uIGZvciBtb3JlIHJlbGlhYmxlIGluZm9ybWF0aW9uLlxuICAgICAqIEBwYXJhbSBkYXRhRmllbGRJZGVudGlmaWVyIGltcG9ydCBJRCBvZiB0aGUgcXVlcmllZCBkYXRhIGZpZWxkXG4gICAgICogQHBhcmFtIGluZGV4IHRoZSBxdWVyaWVkIGluZGV4XG4gICAgICogQHBhcmFtIGtleXdvcmQgd2hldGhlciB0aGUga2V5d29yZCBvZiBhIFRFWFQgaW5kZXggc2hvdWxkIGJlIHF1ZXJpZWRcbiAgICAgKiBAcmV0dXJucyB0aGUgZnVsbCBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgaW5kZXhcbiAgICAgKi9cbiAgcHVibGljIGdldEluZGV4KGRhdGFGaWVsZElkZW50aWZpZXI6IHN0cmluZywgaW5kZXg6IFNlYXJjaEluZGV4LCBrZXl3b3JkID0gZmFsc2UpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIGBkYXRhU2V0LiR7ZGF0YUZpZWxkSWRlbnRpZmllcn0uJHtpbmRleH0ke2tleXdvcmQgPyB0aGlzLktFWVdPUkQgOiAnJ31gO1xuICB9XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIHRoZSBpbmRleCBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIGNvcmUgZmllbGQuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgYWxtb3N0IGFsbCBjb21iaW5hdGlvbnMgYXJlIHZhbGlkIGFuZCB3aWxsIG5vdCB0aHJvdyBhbiBlcnJvciB3aGVuIHVzZWQgdG8gcXVlcnkgdGhlIGRhdGFiYXNlLCBidXQgbm90IGFsbCBjb21iaW5hdGlvbnMgYXJlXG4gICAgICogdXNlZCBieSB0aGUgYXBwbGljYXRpb24gZW5naW5lLiBUaGUge0BsaW5rIFNlYXJjaEluZGV4fSBjbGFzcyBoYXMgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB3aGljaCBmaWVsZCB0eXBlcyBtYXAgdG8gd2hpY2ggaW5kaWNlcywgYnV0XG4gICAgICogeW91IHNob3VsZCBjb25zdWx0IHRoZSBiYWNrZW5kIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgcmVsaWFibGUgaW5mb3JtYXRpb24uXG4gICAgICogQHBhcmFtIGluZGV4IHRoZSBxdWVyaWVkIGluZGV4XG4gICAgICogQHBhcmFtIGtleXdvcmQgd2hldGhlciB0aGUga2V5d29yZCBvZiBhIFRFWFQgaW5kZXggc2hvdWxkIGJlIHF1ZXJpZWRcbiAgICAgKiBAcmV0dXJucyB0aGUgZnVsbCBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgaW5kZXhcbiAgICAgKi9cbiAgcHVibGljIGdldENvcmVJbmRleChpbmRleDogc3RyaW5nLCBrZXl3b3JkID0gZmFsc2UpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIGAke2luZGV4fSR7a2V5d29yZCA/IHRoaXMuS0VZV09SRCA6ICcnfWA7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -195,7 +195,8 @@ export class SearchService {
|
|
|
195
195
|
* @param searchedSubstring value that should be searched on all full text fields
|
|
196
196
|
*/
|
|
197
197
|
setFullTextFilter(searchedSubstring) {
|
|
198
|
-
|
|
198
|
+
const whiteSpacedSubstring = searchedSubstring.replace(' ', '\\ ');
|
|
199
|
+
this._fullTextFilter = new SimpleFilter('', this._baseFilter.type, { fullText: whiteSpacedSubstring });
|
|
199
200
|
this.updateActiveFilter();
|
|
200
201
|
}
|
|
201
202
|
/**
|
|
@@ -303,4 +304,4 @@ SearchService.ctorParameters = () => [
|
|
|
303
304
|
{ type: CategoryFactory, decorators: [{ type: Optional }] },
|
|
304
305
|
{ type: undefined, decorators: [{ type: Inject, args: [NAE_BASE_FILTER,] }] }
|
|
305
306
|
];
|
|
306
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbmV0Z3JpZi9jb21wb25lbnRzLWNvcmUvIiwic291cmNlcyI6WyJsaWIvc2VhcmNoL3NlYXJjaC1zZXJ2aWNlL3NlYXJjaC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFhLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN0RSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ2xELE9BQU8sRUFBQyxlQUFlLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFFbEYsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBQy9ELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUdqRSxPQUFPLEVBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzlELE9BQU8sRUFBQyxxQ0FBcUMsRUFBQyxNQUFNLCtEQUErRCxDQUFDO0FBR3BILE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUV0RSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFDbkUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBRXJFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUk3RDs7R0FFRztBQUVILE1BQU0sT0FBTyxhQUFhO0lBNkJ0Qjs7Ozs7OztPQU9HO0lBQ0gsWUFBc0IsSUFBbUIsRUFDUCxnQkFBaUMsRUFDOUIsVUFBc0I7UUFGckMsU0FBSSxHQUFKLElBQUksQ0FBZTtRQUNQLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBaUI7UUFFL0QsSUFBSSxVQUFVLENBQUMsTUFBTSxZQUFZLE1BQU0sRUFBRTtZQUNyQyxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDaEQ7YUFBTSxJQUFJLFVBQVUsQ0FBQyxNQUFNLFlBQVksVUFBVSxFQUFFO1lBQ2hELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxZQUFZLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxVQUFVLEVBQUUsRUFBQyxPQUFPLEVBQUUsRUFBQyxVQUFVLEVBQUUsV0FBVyxFQUFDLEVBQUMsQ0FBQyxDQUFDO1NBQ3hHO2FBQU07WUFDSCxNQUFNLElBQUksS0FBSyxDQUFDLHdHQUF3RyxDQUFDLENBQUM7U0FDN0g7UUFFRCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUNuRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUkscUNBQXFDLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BJLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxlQUFlLENBQVMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLE9BQU8sRUFBeUIsQ0FBQztRQUMvRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUVsRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLFlBQVksVUFBVSxFQUFFO1lBQ3pDLElBQUksQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDcEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzlCLENBQUMsQ0FBQyxDQUFDO1NBQ047UUFFRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUN2QyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3hDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ2hDO1FBQ0QsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxZQUFZO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLGFBQWE7UUFDcEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFXLHdCQUF3QjtRQUMvQixPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ3hFLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFXLG9CQUFvQjtRQUMzQixLQUFLLE1BQU0sU0FBUyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDcEUsSUFBSSxTQUFTLENBQUMsU0FBUyxFQUFFO2dCQUNyQixPQUFPLElBQUksQ0FBQzthQUNmO1NBQ0o7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLFVBQVU7UUFDakIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsaUJBQWlCO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsYUFBYTtRQUNwQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDL0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxVQUFVO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFXLG1CQUFtQjtRQUMxQixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUM7SUFDNUMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsSUFBVyxvQkFBb0I7UUFDM0IsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDckQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBYyxzQkFBc0I7UUFDaEMsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUNuRCxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFDcEMsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUNsRSxDQUFDO0lBQ04sQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ksWUFBWSxDQUFDLFlBQXVCO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0kseUJBQXlCLENBQUMsU0FBd0I7UUFDckQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3RGLE1BQU0sTUFBTSxHQUNSLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLG1CQUFtQixFQUMxRSxDQUFDO1FBQ0YsTUFBTSxDQUFDLDRCQUE0QixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9DLE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLGVBQWUsQ0FBQyxLQUFhLEVBQUUsVUFBVSxHQUFHLElBQUk7UUFDbkQsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM1QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUMsS0FBSyxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUM7U0FDckQ7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGVBQWUsQ0FBQyxXQUFXLEdBQUcsS0FBSztRQUN0QyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRTtZQUNoRCxLQUFLLE1BQU0sQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDM0UsSUFBSSxXQUFXLElBQUksU0FBUyxDQUFDLFNBQVMsRUFBRTtvQkFDcEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDNUI7YUFDSjtZQUNELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1NBQzdCO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxpQkFBaUIsQ0FBQyxpQkFBeUI7UUFDOUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLFlBQVksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsRUFBQyxRQUFRLEVBQUUsaUJBQWlCLEVBQUMsQ0FBQyxDQUFDO1FBQ2xHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRDs7T0FFRztJQUNJLG1CQUFtQjtRQUN0QixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsZUFBZSxLQUFLLFNBQVMsQ0FBQztRQUMxRCxJQUFJLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQztRQUNqQyxJQUFJLGNBQWMsRUFBRTtZQUNoQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztTQUM3QjtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSSxJQUFJLENBQUMsWUFBMkI7UUFDbkMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVEOzs7T0FHRztJQUNPLGtCQUFrQjtRQUN4QixJQUFJLGdCQUF3QixDQUFDO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUU7WUFDcEMsZ0JBQWdCLEdBQUcsSUFBSSxZQUFZLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEVBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBQyxDQUFDLENBQUM7U0FDNUc7UUFDRCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDdEIsSUFBSSxnQkFBZ0IsRUFBRTtnQkFDbEIsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3RGO2lCQUFNO2dCQUNILGdCQUFnQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7YUFDM0M7U0FDSjtRQUNELElBQUksZ0JBQWdCLEVBQUU7WUFDbEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDeEY7YUFBTTtZQUNILElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUNyRDtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSSx1QkFBdUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLHVCQUF1QixFQUEyQixDQUFDO0lBQ2xGLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNJLGdCQUFnQixDQUFDLFFBQXdCO1FBQzVDLElBQUksSUFBSSxDQUFDLGdCQUFnQixLQUFLLElBQUksRUFBRTtZQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxtRUFBbUU7a0JBQzdFLG9FQUFvRSxDQUFDLENBQUM7WUFDNUUsT0FBTztTQUNWO1FBRUQsSUFBSSxRQUFRLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDekMsTUFBTSxLQUFLLENBQUMsNkNBQTZDLFFBQVEsQ0FBQyxVQUNsRSwyREFBMkQsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUM7U0FDbkY7UUFFRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUVoQyxNQUFNLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztRQUVoQyxLQUFLLE1BQU0sTUFBTSxJQUFJLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRTtZQUM3QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMvRSxNQUFNLGVBQWUsR0FDakIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO2lCQUM5QyxtQkFBbUIsRUFDM0IsQ0FBQztZQUNGLEtBQUssTUFBTSxTQUFTLElBQUksTUFBTSxFQUFFO2dCQUM1QixNQUFNLG9CQUFvQixHQUFHLGVBQWUsQ0FBQztnQkFDN0Msb0JBQW9CLENBQUMsSUFBSSxDQUNyQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUU7b0JBQ2xFLG9CQUFvQixDQUFDLDRCQUE0QixDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNqRSxDQUFDLENBQUMsQ0FBQyxDQUNOLENBQUM7YUFDTDtTQUNKO1FBRUQsUUFBUSxDQUFDLG9CQUFvQixDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUMxQyxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7O09BRUc7SUFDSSx3QkFBd0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDMUQsQ0FBQzs7O1lBL1MyQixhQUFhO1lBQ1csZUFBZSx1QkFBdEQsUUFBUTs0Q0FDUixNQUFNLFNBQUMsZUFBZTs7O1lBeEN0QyxVQUFVOzs7WUFWSCxhQUFhO1lBQ2IsZUFBZSx1QkFnRE4sUUFBUTs0Q0FDUixNQUFNLFNBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIE9wdGlvbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Qm9vbGVhbk9wZXJhdG9yfSBmcm9tICcuLi9tb2RlbHMvYm9vbGVhbi1vcGVyYXRvcic7XG5pbXBvcnQge0ZpbHRlcn0gZnJvbSAnLi4vLi4vZmlsdGVyL21vZGVscy9maWx0ZXInO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIGZvcmtKb2luLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtQcmVkaWNhdGV9IGZyb20gJy4uL21vZGVscy9wcmVkaWNhdGUvcHJlZGljYXRlJztcbmltcG9ydCB7U2ltcGxlRmlsdGVyfSBmcm9tICcuLi8uLi9maWx0ZXIvbW9kZWxzL3NpbXBsZS1maWx0ZXInO1xuaW1wb3J0IHtNZXJnZU9wZXJhdG9yfSBmcm9tICcuLi8uLi9maWx0ZXIvbW9kZWxzL21lcmdlLW9wZXJhdG9yJztcbmltcG9ydCB7UHJlZGljYXRlUmVtb3ZhbEV2ZW50fSBmcm9tICcuLi9tb2RlbHMvcHJlZGljYXRlLXJlbW92YWwtZXZlbnQnO1xuaW1wb3J0IHtRdWVyeX0gZnJvbSAnLi4vbW9kZWxzL3F1ZXJ5L3F1ZXJ5JztcbmltcG9ydCB7ZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgdGFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0VkaXRhYmxlQ2xhdXNlUHJlZGljYXRlV2l0aEdlbmVyYXRvcnN9IGZyb20gJy4uL21vZGVscy9wcmVkaWNhdGUvZWRpdGFibGUtY2xhdXNlLXByZWRpY2F0ZS13aXRoLWdlbmVyYXRvcnMnO1xuaW1wb3J0IHtDYXRlZ29yeX0gZnJvbSAnLi4vbW9kZWxzL2NhdGVnb3J5L2NhdGVnb3J5JztcbmltcG9ydCB7UHJlZGljYXRlVHJlZU1ldGFkYXRhfSBmcm9tICcuLi9tb2RlbHMvcGVyc2lzdGFuY2UvZ2VuZXJhdG9yLW1ldGFkYXRhJztcbmltcG9ydCB7TkFFX0JBU0VfRklMVEVSfSBmcm9tICcuLi9tb2RlbHMvYmFzZS1maWx0ZXItaW5qZWN0aW9uLXRva2VuJztcbmltcG9ydCB7QmFzZUZpbHRlcn0gZnJvbSAnLi4vbW9kZWxzL2Jhc2UtZmlsdGVyJztcbmltcG9ydCB7TG9nZ2VyU2VydmljZX0gZnJvbSAnLi4vLi4vbG9nZ2VyL3NlcnZpY2VzL2xvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7Q2F0ZWdvcnlGYWN0b3J5fSBmcm9tICcuLi9jYXRlZ29yeS1mYWN0b3J5L2NhdGVnb3J5LWZhY3RvcnknO1xuaW1wb3J0IHtGaWx0ZXJUeXBlfSBmcm9tICcuLi8uLi9maWx0ZXIvbW9kZWxzL2ZpbHRlci10eXBlJztcbmltcG9ydCB7TG9hZGluZ0VtaXR0ZXJ9IGZyb20gJy4uLy4uL3V0aWxpdHkvbG9hZGluZy1lbWl0dGVyJztcbmltcG9ydCB7RmlsdGVyTWV0YWRhdGF9IGZyb20gJy4uL21vZGVscy9wZXJzaXN0YW5jZS9maWx0ZXItbWV0YWRhdGEnO1xuaW1wb3J0IHtGaWx0ZXJUZXh0U2VnbWVudH0gZnJvbSAnLi4vbW9kZWxzL3BlcnNpc3RhbmNlL2ZpbHRlci10ZXh0LXNlZ21lbnQnO1xuXG4vKipcbiAqIEhvbGRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmaWx0ZXIgdGhhdCBpcyBjdXJyZW50bHkgYXBwbGllZCB0byB0aGUgdmlldyBjb21wb25lbnQsIHRoYXQgcHJvdmlkZXMgdGhpcyBzZXJ2aWNlcy5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFNlYXJjaFNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gICAgLyoqXG4gICAgICoge0BsaW5rIEZpbHRlcn0gdGhhdCBpcyBhcHBsaWVkIHRvIHRoZSB2aWV3LCBldmVuIGlmIHRoZSB1c2VyIGRvZXNuJ3Qgc2VhcmNoIGFueXRoaW5nLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfYmFzZUZpbHRlcjogRmlsdGVyO1xuICAgIC8qKlxuICAgICAqIEhvbGRzIHRoZSB7QGxpbmsgUHJlZGljYXRlfSB0cmVlIHJvb3QgZm9yIHVzZXIgc2VhcmNoIHF1ZXJpZXMuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9yb290UHJlZGljYXRlOiBFZGl0YWJsZUNsYXVzZVByZWRpY2F0ZVdpdGhHZW5lcmF0b3JzO1xuICAgIC8qKlxuICAgICAqIEhvbGRzIHRoZSB7QGxpbmsgRmlsdGVyfSB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyBhcHBsaWVkIHRvIHRoZSB2aWV3LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfYWN0aXZlRmlsdGVyOiBCZWhhdmlvclN1YmplY3Q8RmlsdGVyPjtcbiAgICAvKipcbiAgICAgKiBIb2xkcyB0aGUgZnVsbCB0ZXh0IHtAbGluayBGaWx0ZXJ9IGlmIHNldCwgYHVuZGVmaW5lZGAgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZnVsbFRleHRGaWx0ZXI6IFNpbXBsZUZpbHRlciB8IHVuZGVmaW5lZDtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5kZXggb2YgYSByZW1vdmVkIHtAbGluayBQcmVkaWNhdGV9IGlzIGVtbWl0ZWQgaW50byB0aGlzIHN0cmVhbVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfcHJlZGljYXRlUmVtb3ZlZCQ6IFN1YmplY3Q8UHJlZGljYXRlUmVtb3ZhbEV2ZW50PjtcbiAgICBwcm90ZWN0ZWQgX2xvYWRpbmdGcm9tTWV0YWRhdGEkOiBMb2FkaW5nRW1pdHRlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYHJvb3RQcmVkaWNhdGVgIHVzZXMgdGhpcyBzdHJlYW0gdG8gbm90aWZ5IHRoZSBzZWFyY2ggc2VydmljZSBhYm91dCBjaGFuZ2VzIHRvIHRoZSBoZWxkIHF1ZXJ5XG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcHJlZGljYXRlUXVlcnlDaGFuZ2VkJDogU3ViamVjdDx2b2lkPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN1YkZpbHRlcjogU3Vic2NyaXB0aW9uO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHtAbGluayBQcmVkaWNhdGV9IHRyZWUgcm9vdCB1c2VzIGFuIFtBTkRde0BsaW5rIEJvb2xlYW5PcGVyYXRvciNBTkR9IG9wZXJhdG9yIHRvIGNvbWJpbmUgdGhlIFByZWRpY2F0ZXMuXG4gICAgICogQHBhcmFtIF9sb2cge0BsaW5rIExvZ2dlclNlcnZpY2V9XG4gICAgICogQHBhcmFtIF9jYXRlZ29yeUZhY3RvcnkgYSB7QGxpbmsgQ2F0ZWdvcnlGYWN0b3J5fSBpbnN0YW5jZS4gVGhpcyBkZXBlbmRlbmN5IGlzIG9wdGlvbmFsLlxuICAgICAqIEl0IGlzIHJlcXVpcmVkIGlmIHdlIHdhbnQgdG8gbG9hZCBwcmVkaWNhdGUgZmlsdGVyIGZyb20gc2F2ZWQgbWV0YWRhdGFcbiAgICAgKiBAcGFyYW0gYmFzZUZpbHRlciBGaWx0ZXIgdGhhdCBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgdmlldyB3aGVuIG5vIHNlYXJjaGluZyBpcyBiZWluZyBwZXJmb3JtZWQuXG4gICAgICogSW5qZWN0ZWQgdHJvdWdoIHRoZSB7QGxpbmsgTkFFX0JBU0VfRklMVEVSfSBpbmplY3Rpb24gdG9rZW4uXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9sb2c6IExvZ2dlclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgcHJvdGVjdGVkIF9jYXRlZ29yeUZhY3Rvcnk6IENhdGVnb3J5RmFjdG9yeSxcbiAgICAgICAgICAgICAgICBASW5qZWN0KE5BRV9CQVNFX0ZJTFRFUikgYmFzZUZpbHRlcjogQmFzZUZpbHRlcikge1xuICAgICAgICBpZiAoYmFzZUZpbHRlci5maWx0ZXIgaW5zdGFuY2VvZiBGaWx0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2Jhc2VGaWx0ZXIgPSBiYXNlRmlsdGVyLmZpbHRlci5jbG9uZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKGJhc2VGaWx0ZXIuZmlsdGVyIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgICAgICAgdGhpcy5fYmFzZUZpbHRlciA9IG5ldyBTaW1wbGVGaWx0ZXIoJycsIGJhc2VGaWx0ZXIuZmlsdGVyVHlwZSwge3Byb2Nlc3M6IHtpZGVudGlmaWVyOiAnX19FTVBUWV9fJ319KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgQmFzZUZpbHRlciBpbnB1dCEgWW91IG11c3QgcHJvdmlkZSB0aGUgTkFFX0JBU0VfRklMVEVSIGluamVjdGlvbiB0b2tlbiB3aXRoIHByb3BlciB2YWx1ZXMhJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9wcmVkaWNhdGVRdWVyeUNoYW5nZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICAgICAgdGhpcy5fcm9vdFByZWRpY2F0ZSA9IG5ldyBFZGl0YWJsZUNsYXVzZVByZWRpY2F0ZVdpdGhHZW5lcmF0b3JzKEJvb2xlYW5PcGVyYXRvci5BTkQsIHRoaXMuX3ByZWRpY2F0ZVF1ZXJ5Q2hhbmdlZCQsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZUZpbHRlciA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RmlsdGVyPih0aGlzLl9iYXNlRmlsdGVyKTtcbiAgICAgICAgdGhpcy5fcHJlZGljYXRlUmVtb3ZlZCQgPSBuZXcgU3ViamVjdDxQcmVkaWNhdGVSZW1vdmFsRXZlbnQ+KCk7XG4gICAgICAgIHRoaXMuX2xvYWRpbmdGcm9tTWV0YWRhdGEkID0gbmV3IExvYWRpbmdFbWl0dGVyKCk7XG5cbiAgICAgICAgaWYgKGJhc2VGaWx0ZXIuZmlsdGVyIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgICAgICAgdGhpcy5zdWJGaWx0ZXIgPSBiYXNlRmlsdGVyLmZpbHRlci5zdWJzY3JpYmUoKGZpbHRlcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Jhc2VGaWx0ZXIgPSBmaWx0ZXIuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZUZpbHRlcigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnByZWRpY2F0ZVF1ZXJ5Q2hhbmdlZCQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQWN0aXZlRmlsdGVyKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9wcmVkaWNhdGVSZW1vdmVkJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLl9hY3RpdmVGaWx0ZXIuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5fcHJlZGljYXRlUXVlcnlDaGFuZ2VkJC5jb21wbGV0ZSgpO1xuICAgICAgICBpZiAodGhpcy5zdWJGaWx0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuc3ViRmlsdGVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbG9hZGluZ0Zyb21NZXRhZGF0YSQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5fcm9vdFByZWRpY2F0ZS5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgdGhlIEZpbHRlciB0aGF0IGlzIGN1cnJlbnRseSBhcHBsaWVkIHRvIHRoZSB2aWV3XG4gICAgICovXG4gICAgcHVibGljIGdldCBhY3RpdmVGaWx0ZXIoKTogRmlsdGVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZUZpbHRlci5nZXRWYWx1ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIGFuIGBPYnNlcnZhYmxlYCB0aGF0IHVwZGF0ZXMgZXZlcnkgdGltZSB0aGUgYWN0aXZlIEZpbHRlciBjaGFuZ2VzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgYWN0aXZlRmlsdGVyJCgpOiBPYnNlcnZhYmxlPEZpbHRlcj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlRmlsdGVyLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiBhIGZpbHRlciBvdGhlciB0aGFuIHRoZSBiYXNlIGZpbHRlciBpcyBjdXJyZW50bHkgYXBwbGllZC5cbiAgICAgKiBSZXR1cm5zIGBmYWxzZWAgaWYgb25seSB0aGUgYmFzZSBmaWx0ZXIgaXMgY3VycmVudGx5IGFwcGxpZWQuXG4gICAgICovXG4gICAgcHVibGljIGdldCBhZGRpdGlvbmFsRmlsdGVyc0FwcGxpZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fcm9vdFByZWRpY2F0ZS5xdWVyeS5pc0VtcHR5IHx8ICEhdGhpcy5fZnVsbFRleHRGaWx0ZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIGFueSB2aXNpYmxlIHByZWRpY2F0ZXMgYXJlIGFwcGxpZWQuXG4gICAgICogUmV0dXJucyBgZmFsc2VgIGlmIHRoZXJlIGFyZSBubyBwcmVkaWNhdGVzLCBvciBpZiB0aGVyZSBhcmUgb25seSBoaWRkZW4gcHJlZGljYXRlcyBhcHBsaWVkXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNWaXNpYmxlUHJlZGljYXRlcygpOiBib29sZWFuIHtcbiAgICAgICAgZm9yIChjb25zdCBwcmVkaWNhdGUgb2YgdGhpcy5fcm9vdFByZWRpY2F0ZS5nZXRQcmVkaWNhdGVNYXAoKS52YWx1ZXMoKSkge1xuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZS5pc1Zpc2libGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgYSBjb3B5IG9mIHRoZSBiYXNlIGZpbHRlclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgYmFzZUZpbHRlcigpOiBGaWx0ZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmFzZUZpbHRlci5jbG9uZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIGFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgaW5kZXggb2YgdGhlIHJlbW92ZWQgcHJlZGljYXRlIHdoZW5ldmVyIGEgcHJlZGljYXRlIGlzIHJlbW92ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHByZWRpY2F0ZVJlbW92ZWQkKCk6IE9ic2VydmFibGU8UHJlZGljYXRlUmVtb3ZhbEV2ZW50PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcmVkaWNhdGVSZW1vdmVkJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB0aGUgcm9vdCBwcmVkaWNhdGUgb2YgdGhlIHNlYXJjaCBzZXJ2aWNlLCB0aGF0IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIHNlYXJjaCByZXF1ZXN0cyB3aXRoIGN1c3RvbSBxdWVyaWVzXG4gICAgICovXG4gICAgcHVibGljIGdldCByb290UHJlZGljYXRlKCk6IEVkaXRhYmxlQ2xhdXNlUHJlZGljYXRlV2l0aEdlbmVyYXRvcnMge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm9vdFByZWRpY2F0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgZmlsdGVyIGhlbGQgaW4gdGhpcyBzZWFyY2ggc2VydmljZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZmlsdGVyVHlwZSgpOiBGaWx0ZXJUeXBlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZUZpbHRlci50eXBlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHdoZXRoZXIgdGhlIHNlYXJjaCBzZXJ2aWNlIGlzIGN1cnJlbnRseSBsb2FkaW5nIGl0cyBzdGF0ZSBmcm9tIG1ldGFkYXRhIG9yIG5vdC5cbiAgICAgKlxuICAgICAqIFNlZSBbbG9hZEZyb21NZXRhZGF0YSgpXXtAbGluayBTZWFyY2hTZXJ2aWNlI2xvYWRGcm9tTWV0YWRhdGF9XG4gICAgICovXG4gICAgcHVibGljIGdldCBsb2FkaW5nRnJvbU1ldGFkYXRhKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZGluZ0Zyb21NZXRhZGF0YSQudmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgYW4gYE9ic2VydmFibGVgIHRoYXQgZW1pdHMgYHRydWVgIGlmIHRoZSBzZWFyY2ggc2VydmljZSBpcyBjdXJyZW50bHkgbG9hZGluZyBpdHMgc3RhdGUgZnJvbSBtZXRhZGF0YSxcbiAgICAgKiBlbWl0cyBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKlxuICAgICAqIFNlZSBbbG9hZEZyb21NZXRhZGF0YSgpXXtAbGluayBTZWFyY2hTZXJ2aWNlI2xvYWRGcm9tTWV0YWRhdGF9XG4gICAgICovXG4gICAgcHVibGljIGdldCBsb2FkaW5nRnJvbU1ldGFkYXRhJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRpbmdGcm9tTWV0YWRhdGEkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIGFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyB3aGVuZXZlciB0aGUgcm9vdCBwcmVkaWNhdGVzIHF1ZXJ5IGNoYW5nZXNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0IHByZWRpY2F0ZVF1ZXJ5Q2hhbmdlZCQoKTogT2JzZXJ2YWJsZTxRdWVyeT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJlZGljYXRlUXVlcnlDaGFuZ2VkJC5hc09ic2VydmFibGUoKS5waXBlKFxuICAgICAgICAgICAgbWFwKCgpID0+IHRoaXMuX3Jvb3RQcmVkaWNhdGUucXVlcnkpLFxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHByZXYsIGN1cnIpID0+IHByZXYgJiYgcHJldi5lcXVhbHMoY3VycikpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIHtAbGluayBQcmVkaWNhdGV9IHRvIHRoZSBQcmVkaWNhdGUgcm9vdCBhbmQgdXBkYXRlcyB0aGUgYWN0aXZlIEZpbHRlci5cbiAgICAgKlxuICAgICAqIFByZWRpY2F0ZXMgYWRkZWQgdGhpcyB3YXkgd2lsbCBub3QgYmUgdmlzaWJsZSBpbiB0aGUgc2VhcmNoIEdVSS5cbiAgICAgKiBJZiB5b3Ugd2FudCB0byBtYWtlIHN1cmUgeW91ciBwcmVkaWNhdGVzIGFyZSB2aXNpYmxlIChhbmQgZWRpdGFibGUpXG4gICAgICogdXNlIHRoZSBbYWRkR2VuZXJhdGVkTGVhZlByZWRpY2F0ZSgpXXtAbGluayBTZWFyY2hTZXJ2aWNlI2FkZEdlbmVyYXRlZExlYWZQcmVkaWNhdGV9IG1ldGhvZCBpbnN0ZWFkLlxuICAgICAqIEBwYXJhbSBuZXdQcmVkaWNhdGUgUHJlZGljYXRlIHRoYXQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBzZWFyY2ggcXVlcmllcy5cbiAgICAgKiBAcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGFkZGVkIFByZWRpY2F0ZVxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRQcmVkaWNhdGUobmV3UHJlZGljYXRlOiBQcmVkaWNhdGUpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm9vdFByZWRpY2F0ZS5hZGRQcmVkaWNhdGUobmV3UHJlZGljYXRlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIG5ldyBoaWRkZW4gYnJhbmNoIG9mIHRoZSBwcmVkaWNhdGUgdHJlZSB3aXRoIGEgc2luZ3VsYXIgbGVhZiBub2RlIGNvbnRhaW5pbmcgdGhlIHByb3ZpZGVkIFF1ZXJ5LlxuICAgICAqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBhZGQgcHJlZGljYXRlcyB0byB0aGUgc2VhcmNoIHRyZWUgKHRoaW5rIGhlYWRlciBzZWFyY2gpLFxuICAgICAqIHdoaWNoIGNhbiBiZSBtYWRlIHZpc2libGUgYW5kIGVkaXRhYmxlIGluIHRoZSBzZWFyY2ggR1VJIGxhdGVyLlxuICAgICAqIEBwYXJhbSBnZW5lcmF0b3IgdGhlIGdlbmVyYXRvciB0aGF0IGlzIGluIHN1Y2ggc3RhdGUsIHRoYXQgaXQgZ2VuZXJhdGVzIHRoZSBRdWVyeSwgdGhhdCBzaG91bGQgYmUgYWRkZWQgYXMgYnJhbmNoL2xlYWYuXG4gICAgICogSWYgdGhlIGdlbmVyYXRvciBkb2Vzbid0IGN1cnJlbnRseSBnZW5lcmF0ZSBhIHF1ZXJ5IGEgbm9kZSB3aXRoIGFuIGVtcHR5IHF1ZXJ5IHdpbGwgYmUgYWRkZWQuXG4gICAgICovXG4gICAgcHVibGljIGFkZEdlbmVyYXRlZExlYWZQcmVkaWNhdGUoZ2VuZXJhdG9yOiBDYXRlZ29yeTxhbnk+KTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgYnJhbmNoSWQgPSB0aGlzLl9yb290UHJlZGljYXRlLmFkZE5ld0NsYXVzZVByZWRpY2F0ZShCb29sZWFuT3BlcmF0b3IuT1IsIGZhbHNlKTtcbiAgICAgICAgY29uc3QgYnJhbmNoID0gKFxuICAgICAgICAgICAgdGhpcy5fcm9vdFByZWRpY2F0ZS5nZXRQcmVkaWNhdGVNYXAoKS5nZXQoYnJhbmNoSWQpLmdldFdyYXBwZWRQcmVkaWNhdGUoKSBhcyB1bmtub3duIGFzIEVkaXRhYmxlQ2xhdXNlUHJlZGljYXRlV2l0aEdlbmVyYXRvcnNcbiAgICAgICAgKTtcbiAgICAgICAgYnJhbmNoLmFkZE5ld1ByZWRpY2F0ZUZyb21HZW5lcmF0b3IoZ2VuZXJhdG9yKTtcbiAgICAgICAgcmV0dXJuIGJyYW5jaElkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIHtAbGluayBQcmVkaWNhdGV9IG9iamVjdCBmcm9tIHRoZSBwcm92aWRlZCBpbmRleC4gSWYgdGhlIGluZGV4IGlzIGludmFsaWQgZG9lcyBub3RoaW5nLlxuICAgICAqIFVwZGF0ZXMgdGhlIHRoZSBhY3RpdmUgRmlsdGVyIGlmIHRoZSBQcmVkaWNhdGUgdHJlZSB3YXMgYWZmZWN0ZWQuXG4gICAgICogQHBhcmFtIGluZGV4IGluZGV4IG9mIHRoZSBQcmVkaWNhdGUgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZFxuICAgICAqIEBwYXJhbSBjbGVhcklucHV0IHdoZXRoZXIgdGhlIGlucHV0LCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBwcmVkaWNhdGUgc2hvdWxkIGJlIGNsZWFyZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlUHJlZGljYXRlKGluZGV4OiBudW1iZXIsIGNsZWFySW5wdXQgPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9yb290UHJlZGljYXRlLnJlbW92ZVByZWRpY2F0ZShpbmRleCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3ByZWRpY2F0ZVJlbW92ZWQkLm5leHQoe2luZGV4LCBjbGVhcklucHV0fSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCB7QGxpbmsgUHJlZGljYXRlfSBvYmplY3RzIHRoYXQgY29udHJpYnV0ZSB0byB0aGUgc2VhcmNoLiBVcGRhdGVzIHRoZSBhY3RpdmUgRmlsdGVyIGlmIGl0IHdhcyBhZmZlY3RlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjbGVhckhpZGRlbiB3aGV0aGVyIHRoZSBoaWRkZW4gcHJlZGljYXRlcyBzaG91bGQgYmUgY2xlYXJlZCBhcyB3ZWxsXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyUHJlZGljYXRlcyhjbGVhckhpZGRlbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9yb290UHJlZGljYXRlLmdldFByZWRpY2F0ZU1hcCgpLnNpemUgPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtpZCwgcHJlZGljYXRlXSBvZiB0aGlzLl9yb290UHJlZGljYXRlLmdldFByZWRpY2F0ZU1hcCgpLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgIGlmIChjbGVhckhpZGRlbiB8fCBwcmVkaWNhdGUuaXNWaXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlUHJlZGljYXRlKGlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZUZpbHRlcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIHtAbGluayBGaWx0ZXJ9IHdpdGggdGhlIFtmdWxsVGV4dF17QGxpbmsgQ2FzZVNlYXJjaFJlcXVlc3RCb2R5I2Z1bGxUZXh0fSBhdHRyaWJ1dGUgc2V0IHRvIHRoZSBwcm92aWRlZCB2YWx1ZS5cbiAgICAgKiBJZiBmdWxsIHRleHQgZmlsdGVyIGlzIGFscmVhZHkgc2V0LCBpdCB3aWxsIGJlIHJlcGxhY2VkLlxuICAgICAqIEBwYXJhbSBzZWFyY2hlZFN1YnN0cmluZyB2YWx1ZSB0aGF0IHNob3VsZCBiZSBzZWFyY2hlZCBvbiBhbGwgZnVsbCB0ZXh0IGZpZWxkc1xuICAgICAqL1xuICAgIHB1YmxpYyBzZXRGdWxsVGV4dEZpbHRlcihzZWFyY2hlZFN1YnN0cmluZzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2Z1bGxUZXh0RmlsdGVyID0gbmV3IFNpbXBsZUZpbHRlcignJywgdGhpcy5fYmFzZUZpbHRlci50eXBlLCB7ZnVsbFRleHQ6IHNlYXJjaGVkU3Vic3RyaW5nfSk7XG4gICAgICAgIHRoaXMudXBkYXRlQWN0aXZlRmlsdGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSBmdWxsIHRleHQgZmlsdGVyIChpZiBzZXQpLiBJZiB0aGUgZnVsbCB0ZXh0IGZpbHRlciBpcyBub3Qgc2V0LCBkb2VzIG5vdGhpbmcuXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyRnVsbFRleHRGaWx0ZXIoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHdhc0Z1bGx0ZXh0U2V0ID0gdGhpcy5fZnVsbFRleHRGaWx0ZXIgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fZnVsbFRleHRGaWx0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh3YXNGdWxsdGV4dFNldCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVGaWx0ZXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3dzIHRoZSBwcmVkaWNhdGVzIHdpdGggdGhlIGdpdmVuIGlkcy4gU2tpcHMgaWRzIHRoYXQgZG9uJ3QgZXhpc3QuXG4gICAgICogQHBhcmFtIHByZWRpY2F0ZUlkcyB0aGUgaWRzIG9mIHRoZSBwcmVkaWNhdGVzIHRoYXQgc2hvdWxkIGJlIHNob3duLlxuICAgICAqL1xuICAgIHB1YmxpYyBzaG93KHByZWRpY2F0ZUlkczogQXJyYXk8bnVtYmVyPik6IHZvaWQge1xuICAgICAgICB0aGlzLl9yb290UHJlZGljYXRlLnNob3dQcmVkaWNhdGVzKHByZWRpY2F0ZUlkcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVhZHMgdGhlIGN1cnJlbnQgcXVlcnkgZnJvbSB0aGUgcHJlZGljYXRlIHRyZWUsIGNvbWJpbmVzIGl0IHdpdGggdGhlIGJhc2UgRmlsdGVyIGFuZCBmdWxsIHRleHQgRmlsdGVyIChpZiBzZXQpXG4gICAgICogYW5kIHVwZGF0ZXMgdGhlIGFjdGl2ZSBGaWx0ZXIuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHVwZGF0ZUFjdGl2ZUZpbHRlcigpOiB2b2lkIHtcbiAgICAgICAgbGV0IGFkZGl0aW9uYWxGaWx0ZXI6IEZpbHRlcjtcbiAgICAgICAgaWYgKCF0aGlzLl9yb290UHJlZGljYXRlLnF1ZXJ5LmlzRW1wdHkpIHtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxGaWx0ZXIgPSBuZXcgU2ltcGxlRmlsdGVyKCcnLCB0aGlzLl9iYXNlRmlsdGVyLnR5cGUsIHtxdWVyeTogdGhpcy5fcm9vdFByZWRpY2F0ZS5xdWVyeS52YWx1ZX0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9mdWxsVGV4dEZpbHRlcikge1xuICAgICAgICAgICAgaWYgKGFkZGl0aW9uYWxGaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICBhZGRpdGlvbmFsRmlsdGVyID0gYWRkaXRpb25hbEZpbHRlci5tZXJnZSh0aGlzLl9mdWxsVGV4dEZpbHRlciwgTWVyZ2VPcGVyYXRvci5BTkQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhZGRpdGlvbmFsRmlsdGVyID0gdGhpcy5fZnVsbFRleHRGaWx0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFkZGl0aW9uYWxGaWx0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZUZpbHRlci5uZXh0KHRoaXMuX2Jhc2VGaWx0ZXIubWVyZ2UoYWRkaXRpb25hbEZpbHRlciwgTWVyZ2VPcGVyYXRvci5BTkQpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZUZpbHRlci5uZXh0KHRoaXMuX2Jhc2VGaWx0ZXIuY2xvbmUoKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBgdW5kZWZpbmVkYCBpZiB0aGUgcHJlZGljYXRlIHRyZWUgY29udGFpbnMgbm8gY29tcGxldGUgcXVlcnkuXG4gICAgICogT3RoZXJ3aXNlIHJldHVybnMgdGhlIHNlcmlhbGl6ZWQgZm9ybSBvZiB0aGUgY29tcGxldGVkIHF1ZXJpZXMgaW4gdGhlIHByZWRpY2F0ZSB0cmVlLlxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVQcmVkaWNhdGVNZXRhZGF0YSgpOiBQcmVkaWNhdGVUcmVlTWV0YWRhdGEgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm9vdFByZWRpY2F0ZS5jcmVhdGVHZW5lcmF0b3JNZXRhZGF0YSgpIGFzIFByZWRpY2F0ZVRyZWVNZXRhZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXBsYWNlcyB0aGUgY3VycmVudCBwcmVkaWNhdGUgZmlsdGVyIGJ5IHRoZSBvbmUgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvdmlkZWQgZ2VuZXJhdG9yIG1ldGFkYXRhLlxuICAgICAqXG4gICAgICogVGhlIHtAbGluayBDYXRlZ29yeUZhY3Rvcnl9IGluc3RhbmNlIG11c3QgYmUgcHJvdmlkZWQgZm9yIHRoaXMgc2VydmljZSBpZiB3ZSB3YW50IHRvIHVzZSB0aGlzIG1ldGhvZC4gTG9ncyBhbiBlcnJvciBhbmQgZG9lcyBub3RoaW5nLlxuICAgICAqXG4gICAgICogVGhlIGBmaWx0ZXJUeXBlYCBvZiB0aGlzIHNlYXJjaCBzZXJ2aWNlIG11c3QgbWF0Y2ggdGhlIGBmaWx0ZXJUeXBlYCBvZiB0aGUgcHJvdmlkZWQgbWV0YWRhdGEuIE90aGVyd2lzZSBhbiBlcnJvciBpcyB0aHJvd24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWV0YWRhdGEgdGhlIHNlcmlhbGl6ZWQgc3RhdGUgb2YgdGhlIHByZWRpY2F0ZSB0cmVlIHRoYXQgc2hvdWxkIGJlIHJlc3RvcmVkIHRvIHRoaXMgc2VhcmNoIHNlcnZpY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgbG9hZEZyb21NZXRhZGF0YShtZXRhZGF0YTogRmlsdGVyTWV0YWRhdGEpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhdGVnb3J5RmFjdG9yeSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fbG9nLmVycm9yKCdBIENhdGVnb3J5RmFjdG9yeSBpbnN0YW5jZSBtdXN0IGJlIHByb3ZpZGVkIGZvciB0aGUgU2VhcmNoU2VydmljZSdcbiAgICAgICAgICAgICAgICArICcgaWYgeW91IHdhbnQgdG8gcmVjb25zdHJ1Y3QgYSBwcmVkaWNhdGUgZmlsdGVyIGZyb20gc2F2ZWQgbWV0YWRhdGEnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXRhZGF0YS5maWx0ZXJUeXBlICE9PSB0aGlzLmZpbHRlclR5cGUpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBUaGUgZmlsdGVyIHR5cGUgb2YgdGhlIHByb3ZpZGVkIG1ldGFkYXRhICgke21ldGFkYXRhLmZpbHRlclR5cGVcbiAgICAgICAgICAgIH0pIGRvZXMgbm90IG1hdGNoIHRoZSBmaWx0ZXIgdHlwZSBvZiB0aGUgc2VhcmNoIHNlcnZpY2UgKCR7dGhpcy5maWx0ZXJUeXBlfSkhYCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNsZWFyUHJlZGljYXRlcyh0cnVlKTtcbiAgICAgICAgdGhpcy5fbG9hZGluZ0Zyb21NZXRhZGF0YSQub24oKTtcblxuICAgICAgICBjb25zdCBnZW5lcmF0b3JPYnNlcnZhYmxlcyA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgY2xhdXNlIG9mIG1ldGFkYXRhLnByZWRpY2F0ZU1ldGFkYXRhKSB7XG4gICAgICAgICAgICBjb25zdCBicmFuY2hJZCA9IHRoaXMuX3Jvb3RQcmVkaWNhdGUuYWRkTmV3Q2xhdXNlUHJlZGljYXRlKEJvb2xlYW5PcGVyYXRvci5PUik7XG4gICAgICAgICAgICBjb25zdCBicmFuY2hQcmVkaWNhdGUgPSAoXG4gICAgICAgICAgICAgICAgdGhpcy5fcm9vdFByZWRpY2F0ZS5nZXRQcmVkaWNhdGVNYXAoKS5nZXQoYnJhbmNoSWQpXG4gICAgICAgICAgICAgICAgICAgIC5nZXRXcmFwcGVkUHJlZGljYXRlKCkgYXMgdW5rbm93biBhcyBFZGl0YWJsZUNsYXVzZVByZWRpY2F0ZVdpdGhHZW5lcmF0b3JzXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwcmVkaWNhdGUgb2YgY2xhdXNlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9jYWxCcmFuY2hSZWZlcmVuY2UgPSBicmFuY2hQcmVkaWNhdGU7XG4gICAgICAgICAgICAgICAgZ2VuZXJhdG9yT2JzZXJ2YWJsZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2F0ZWdvcnlGYWN0b3J5LmdldEZyb21NZXRhZGF0YShwcmVkaWNhdGUpLnBpcGUodGFwKGdlbmVyYXRvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbEJyYW5jaFJlZmVyZW5jZS5hZGROZXdQcmVkaWNhdGVGcm9tR2VuZXJhdG9yKGdlbmVyYXRvcik7XG4gICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3JrSm9pbihnZW5lcmF0b3JPYnNlcnZhYmxlcykuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRpbmdGcm9tTWV0YWRhdGEkLm9mZigpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVGaWx0ZXIoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgYW4gQXJyYXkgb2YgZmlsdGVyIHRleHQgc2VnbWVudHMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIGNvbXBsZXRlZCBwcmVkaWNhdGVzXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZUZpbHRlclRleHRTZWdtZW50cygpOiBBcnJheTxGaWx0ZXJUZXh0U2VnbWVudD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm9vdFByZWRpY2F0ZS5jcmVhdGVGaWx0ZXJUZXh0U2VnbWVudHMoKTtcbiAgICB9XG59XG4iXX0=
|
|
307
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbmV0Z3JpZi9jb21wb25lbnRzLWNvcmUvIiwic291cmNlcyI6WyJsaWIvc2VhcmNoL3NlYXJjaC1zZXJ2aWNlL3NlYXJjaC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFhLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN0RSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ2xELE9BQU8sRUFBQyxlQUFlLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFFbEYsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBQy9ELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUdqRSxPQUFPLEVBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzlELE9BQU8sRUFBQyxxQ0FBcUMsRUFBQyxNQUFNLCtEQUErRCxDQUFDO0FBR3BILE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUV0RSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFDbkUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBRXJFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUk3RDs7R0FFRztBQUVILE1BQU0sT0FBTyxhQUFhO0lBNkJ0Qjs7Ozs7OztPQU9HO0lBQ0gsWUFBc0IsSUFBbUIsRUFDUCxnQkFBaUMsRUFDOUIsVUFBc0I7UUFGckMsU0FBSSxHQUFKLElBQUksQ0FBZTtRQUNQLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBaUI7UUFFL0QsSUFBSSxVQUFVLENBQUMsTUFBTSxZQUFZLE1BQU0sRUFBRTtZQUNyQyxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDaEQ7YUFBTSxJQUFJLFVBQVUsQ0FBQyxNQUFNLFlBQVksVUFBVSxFQUFFO1lBQ2hELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxZQUFZLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxVQUFVLEVBQUUsRUFBQyxPQUFPLEVBQUUsRUFBQyxVQUFVLEVBQUUsV0FBVyxFQUFDLEVBQUMsQ0FBQyxDQUFDO1NBQ3hHO2FBQU07WUFDSCxNQUFNLElBQUksS0FBSyxDQUFDLHdHQUF3RyxDQUFDLENBQUM7U0FDN0g7UUFFRCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUNuRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUkscUNBQXFDLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BJLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxlQUFlLENBQVMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLE9BQU8sRUFBeUIsQ0FBQztRQUMvRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUVsRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLFlBQVksVUFBVSxFQUFFO1lBQ3pDLElBQUksQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDcEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzlCLENBQUMsQ0FBQyxDQUFDO1NBQ047UUFFRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUN2QyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3hDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ2hDO1FBQ0QsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxZQUFZO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLGFBQWE7UUFDcEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFXLHdCQUF3QjtRQUMvQixPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ3hFLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFXLG9CQUFvQjtRQUMzQixLQUFLLE1BQU0sU0FBUyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDcEUsSUFBSSxTQUFTLENBQUMsU0FBUyxFQUFFO2dCQUNyQixPQUFPLElBQUksQ0FBQzthQUNmO1NBQ0o7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLFVBQVU7UUFDakIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsaUJBQWlCO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsYUFBYTtRQUNwQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDL0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxVQUFVO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFXLG1CQUFtQjtRQUMxQixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUM7SUFDNUMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsSUFBVyxvQkFBb0I7UUFDM0IsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDckQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBYyxzQkFBc0I7UUFDaEMsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUNuRCxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFDcEMsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUNsRSxDQUFDO0lBQ04sQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ksWUFBWSxDQUFDLFlBQXVCO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0kseUJBQXlCLENBQUMsU0FBd0I7UUFDckQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3RGLE1BQU0sTUFBTSxHQUNSLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLG1CQUFtQixFQUMxRSxDQUFDO1FBQ0YsTUFBTSxDQUFDLDRCQUE0QixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9DLE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLGVBQWUsQ0FBQyxLQUFhLEVBQUUsVUFBVSxHQUFHLElBQUk7UUFDbkQsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM1QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUMsS0FBSyxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUM7U0FDckQ7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGVBQWUsQ0FBQyxXQUFXLEdBQUcsS0FBSztRQUN0QyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRTtZQUNoRCxLQUFLLE1BQU0sQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDM0UsSUFBSSxXQUFXLElBQUksU0FBUyxDQUFDLFNBQVMsRUFBRTtvQkFDcEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDNUI7YUFDSjtZQUNELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1NBQzdCO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxpQkFBaUIsQ0FBQyxpQkFBeUI7UUFDOUMsTUFBTSxvQkFBb0IsR0FBRyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxZQUFZLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEVBQUMsUUFBUSxFQUFFLG9CQUFvQixFQUFDLENBQUMsQ0FBQztRQUNyRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxtQkFBbUI7UUFDdEIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGVBQWUsS0FBSyxTQUFTLENBQUM7UUFDMUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUM7UUFDakMsSUFBSSxjQUFjLEVBQUU7WUFDaEIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7U0FDN0I7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksSUFBSSxDQUFDLFlBQTJCO1FBQ25DLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7O09BR0c7SUFDTyxrQkFBa0I7UUFDeEIsSUFBSSxnQkFBd0IsQ0FBQztRQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFO1lBQ3BDLGdCQUFnQixHQUFHLElBQUksWUFBWSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxFQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDO1NBQzVHO1FBQ0QsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3RCLElBQUksZ0JBQWdCLEVBQUU7Z0JBQ2xCLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUN0RjtpQkFBTTtnQkFDSCxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO2FBQzNDO1NBQ0o7UUFDRCxJQUFJLGdCQUFnQixFQUFFO1lBQ2xCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3hGO2FBQU07WUFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDckQ7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksdUJBQXVCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyx1QkFBdUIsRUFBMkIsQ0FBQztJQUNsRixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSSxnQkFBZ0IsQ0FBQyxRQUF3QjtRQUM1QyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxJQUFJLEVBQUU7WUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsbUVBQW1FO2tCQUM3RSxvRUFBb0UsQ0FBQyxDQUFDO1lBQzVFLE9BQU87U0FDVjtRQUVELElBQUksUUFBUSxDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3pDLE1BQU0sS0FBSyxDQUFDLDZDQUE2QyxRQUFRLENBQUMsVUFDbEUsMkRBQTJELElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDO1NBQ25GO1FBRUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMscUJBQXFCLENBQUMsRUFBRSxFQUFFLENBQUM7UUFFaEMsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLENBQUM7UUFFaEMsS0FBSyxNQUFNLE1BQU0sSUFBSSxRQUFRLENBQUMsaUJBQWlCLEVBQUU7WUFDN0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0UsTUFBTSxlQUFlLEdBQ2pCLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztpQkFDOUMsbUJBQW1CLEVBQzNCLENBQUM7WUFDRixLQUFLLE1BQU0sU0FBUyxJQUFJLE1BQU0sRUFBRTtnQkFDNUIsTUFBTSxvQkFBb0IsR0FBRyxlQUFlLENBQUM7Z0JBQzdDLG9CQUFvQixDQUFDLElBQUksQ0FDckIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFO29CQUNsRSxvQkFBb0IsQ0FBQyw0QkFBNEIsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDakUsQ0FBQyxDQUFDLENBQUMsQ0FDTixDQUFDO2FBQ0w7U0FDSjtRQUVELFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDMUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOztPQUVHO0lBQ0ksd0JBQXdCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0lBQzFELENBQUM7OztZQWhUMkIsYUFBYTtZQUNXLGVBQWUsdUJBQXRELFFBQVE7NENBQ1IsTUFBTSxTQUFDLGVBQWU7OztZQXhDdEMsVUFBVTs7O1lBVkgsYUFBYTtZQUNiLGVBQWUsdUJBZ0ROLFFBQVE7NENBQ1IsTUFBTSxTQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZSwgT25EZXN0cm95LCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Jvb2xlYW5PcGVyYXRvcn0gZnJvbSAnLi4vbW9kZWxzL2Jvb2xlYW4tb3BlcmF0b3InO1xuaW1wb3J0IHtGaWx0ZXJ9IGZyb20gJy4uLy4uL2ZpbHRlci9tb2RlbHMvZmlsdGVyJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7UHJlZGljYXRlfSBmcm9tICcuLi9tb2RlbHMvcHJlZGljYXRlL3ByZWRpY2F0ZSc7XG5pbXBvcnQge1NpbXBsZUZpbHRlcn0gZnJvbSAnLi4vLi4vZmlsdGVyL21vZGVscy9zaW1wbGUtZmlsdGVyJztcbmltcG9ydCB7TWVyZ2VPcGVyYXRvcn0gZnJvbSAnLi4vLi4vZmlsdGVyL21vZGVscy9tZXJnZS1vcGVyYXRvcic7XG5pbXBvcnQge1ByZWRpY2F0ZVJlbW92YWxFdmVudH0gZnJvbSAnLi4vbW9kZWxzL3ByZWRpY2F0ZS1yZW1vdmFsLWV2ZW50JztcbmltcG9ydCB7UXVlcnl9IGZyb20gJy4uL21vZGVscy9xdWVyeS9xdWVyeSc7XG5pbXBvcnQge2Rpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIHRhcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtFZGl0YWJsZUNsYXVzZVByZWRpY2F0ZVdpdGhHZW5lcmF0b3JzfSBmcm9tICcuLi9tb2RlbHMvcHJlZGljYXRlL2VkaXRhYmxlLWNsYXVzZS1wcmVkaWNhdGUtd2l0aC1nZW5lcmF0b3JzJztcbmltcG9ydCB7Q2F0ZWdvcnl9IGZyb20gJy4uL21vZGVscy9jYXRlZ29yeS9jYXRlZ29yeSc7XG5pbXBvcnQge1ByZWRpY2F0ZVRyZWVNZXRhZGF0YX0gZnJvbSAnLi4vbW9kZWxzL3BlcnNpc3RhbmNlL2dlbmVyYXRvci1tZXRhZGF0YSc7XG5pbXBvcnQge05BRV9CQVNFX0ZJTFRFUn0gZnJvbSAnLi4vbW9kZWxzL2Jhc2UtZmlsdGVyLWluamVjdGlvbi10b2tlbic7XG5pbXBvcnQge0Jhc2VGaWx0ZXJ9IGZyb20gJy4uL21vZGVscy9iYXNlLWZpbHRlcic7XG5pbXBvcnQge0xvZ2dlclNlcnZpY2V9IGZyb20gJy4uLy4uL2xvZ2dlci9zZXJ2aWNlcy9sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQge0NhdGVnb3J5RmFjdG9yeX0gZnJvbSAnLi4vY2F0ZWdvcnktZmFjdG9yeS9jYXRlZ29yeS1mYWN0b3J5JztcbmltcG9ydCB7RmlsdGVyVHlwZX0gZnJvbSAnLi4vLi4vZmlsdGVyL21vZGVscy9maWx0ZXItdHlwZSc7XG5pbXBvcnQge0xvYWRpbmdFbWl0dGVyfSBmcm9tICcuLi8uLi91dGlsaXR5L2xvYWRpbmctZW1pdHRlcic7XG5pbXBvcnQge0ZpbHRlck1ldGFkYXRhfSBmcm9tICcuLi9tb2RlbHMvcGVyc2lzdGFuY2UvZmlsdGVyLW1ldGFkYXRhJztcbmltcG9ydCB7RmlsdGVyVGV4dFNlZ21lbnR9IGZyb20gJy4uL21vZGVscy9wZXJzaXN0YW5jZS9maWx0ZXItdGV4dC1zZWdtZW50JztcblxuLyoqXG4gKiBIb2xkcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmlsdGVyIHRoYXQgaXMgY3VycmVudGx5IGFwcGxpZWQgdG8gdGhlIHZpZXcgY29tcG9uZW50LCB0aGF0IHByb3ZpZGVzIHRoaXMgc2VydmljZXMuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTZWFyY2hTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcblxuICAgIC8qKlxuICAgICAqIHtAbGluayBGaWx0ZXJ9IHRoYXQgaXMgYXBwbGllZCB0byB0aGUgdmlldywgZXZlbiBpZiB0aGUgdXNlciBkb2Vzbid0IHNlYXJjaCBhbnl0aGluZy5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2Jhc2VGaWx0ZXI6IEZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBIb2xkcyB0aGUge0BsaW5rIFByZWRpY2F0ZX0gdHJlZSByb290IGZvciB1c2VyIHNlYXJjaCBxdWVyaWVzLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfcm9vdFByZWRpY2F0ZTogRWRpdGFibGVDbGF1c2VQcmVkaWNhdGVXaXRoR2VuZXJhdG9ycztcbiAgICAvKipcbiAgICAgKiBIb2xkcyB0aGUge0BsaW5rIEZpbHRlcn0gdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgYXBwbGllZCB0byB0aGUgdmlldy5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2FjdGl2ZUZpbHRlcjogQmVoYXZpb3JTdWJqZWN0PEZpbHRlcj47XG4gICAgLyoqXG4gICAgICogSG9sZHMgdGhlIGZ1bGwgdGV4dCB7QGxpbmsgRmlsdGVyfSBpZiBzZXQsIGB1bmRlZmluZWRgIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2Z1bGxUZXh0RmlsdGVyOiBTaW1wbGVGaWx0ZXIgfCB1bmRlZmluZWQ7XG4gICAgLyoqXG4gICAgICogVGhlIGluZGV4IG9mIGEgcmVtb3ZlZCB7QGxpbmsgUHJlZGljYXRlfSBpcyBlbW1pdGVkIGludG8gdGhpcyBzdHJlYW1cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3ByZWRpY2F0ZVJlbW92ZWQkOiBTdWJqZWN0PFByZWRpY2F0ZVJlbW92YWxFdmVudD47XG4gICAgcHJvdGVjdGVkIF9sb2FkaW5nRnJvbU1ldGFkYXRhJDogTG9hZGluZ0VtaXR0ZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGByb290UHJlZGljYXRlYCB1c2VzIHRoaXMgc3RyZWFtIHRvIG5vdGlmeSB0aGUgc2VhcmNoIHNlcnZpY2UgYWJvdXQgY2hhbmdlcyB0byB0aGUgaGVsZCBxdWVyeVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3ByZWRpY2F0ZVF1ZXJ5Q2hhbmdlZCQ6IFN1YmplY3Q8dm9pZD47XG4gICAgcHJpdmF0ZSByZWFkb25seSBzdWJGaWx0ZXI6IFN1YnNjcmlwdGlvbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB7QGxpbmsgUHJlZGljYXRlfSB0cmVlIHJvb3QgdXNlcyBhbiBbQU5EXXtAbGluayBCb29sZWFuT3BlcmF0b3IjQU5EfSBvcGVyYXRvciB0byBjb21iaW5lIHRoZSBQcmVkaWNhdGVzLlxuICAgICAqIEBwYXJhbSBfbG9nIHtAbGluayBMb2dnZXJTZXJ2aWNlfVxuICAgICAqIEBwYXJhbSBfY2F0ZWdvcnlGYWN0b3J5IGEge0BsaW5rIENhdGVnb3J5RmFjdG9yeX0gaW5zdGFuY2UuIFRoaXMgZGVwZW5kZW5jeSBpcyBvcHRpb25hbC5cbiAgICAgKiBJdCBpcyByZXF1aXJlZCBpZiB3ZSB3YW50IHRvIGxvYWQgcHJlZGljYXRlIGZpbHRlciBmcm9tIHNhdmVkIG1ldGFkYXRhXG4gICAgICogQHBhcmFtIGJhc2VGaWx0ZXIgRmlsdGVyIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIHZpZXcgd2hlbiBubyBzZWFyY2hpbmcgaXMgYmVpbmcgcGVyZm9ybWVkLlxuICAgICAqIEluamVjdGVkIHRyb3VnaCB0aGUge0BsaW5rIE5BRV9CQVNFX0ZJTFRFUn0gaW5qZWN0aW9uIHRva2VuLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfbG9nOiBMb2dnZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIHByb3RlY3RlZCBfY2F0ZWdvcnlGYWN0b3J5OiBDYXRlZ29yeUZhY3RvcnksXG4gICAgICAgICAgICAgICAgQEluamVjdChOQUVfQkFTRV9GSUxURVIpIGJhc2VGaWx0ZXI6IEJhc2VGaWx0ZXIpIHtcbiAgICAgICAgaWYgKGJhc2VGaWx0ZXIuZmlsdGVyIGluc3RhbmNlb2YgRmlsdGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9iYXNlRmlsdGVyID0gYmFzZUZpbHRlci5maWx0ZXIuY2xvbmUoKTtcbiAgICAgICAgfSBlbHNlIGlmIChiYXNlRmlsdGVyLmZpbHRlciBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2Jhc2VGaWx0ZXIgPSBuZXcgU2ltcGxlRmlsdGVyKCcnLCBiYXNlRmlsdGVyLmZpbHRlclR5cGUsIHtwcm9jZXNzOiB7aWRlbnRpZmllcjogJ19fRU1QVFlfXyd9fSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIEJhc2VGaWx0ZXIgaW5wdXQhIFlvdSBtdXN0IHByb3ZpZGUgdGhlIE5BRV9CQVNFX0ZJTFRFUiBpbmplY3Rpb24gdG9rZW4gd2l0aCBwcm9wZXIgdmFsdWVzIScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcHJlZGljYXRlUXVlcnlDaGFuZ2VkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgICAgIHRoaXMuX3Jvb3RQcmVkaWNhdGUgPSBuZXcgRWRpdGFibGVDbGF1c2VQcmVkaWNhdGVXaXRoR2VuZXJhdG9ycyhCb29sZWFuT3BlcmF0b3IuQU5ELCB0aGlzLl9wcmVkaWNhdGVRdWVyeUNoYW5nZWQkLCB1bmRlZmluZWQsIHRydWUpO1xuICAgICAgICB0aGlzLl9hY3RpdmVGaWx0ZXIgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEZpbHRlcj4odGhpcy5fYmFzZUZpbHRlcik7XG4gICAgICAgIHRoaXMuX3ByZWRpY2F0ZVJlbW92ZWQkID0gbmV3IFN1YmplY3Q8UHJlZGljYXRlUmVtb3ZhbEV2ZW50PigpO1xuICAgICAgICB0aGlzLl9sb2FkaW5nRnJvbU1ldGFkYXRhJCA9IG5ldyBMb2FkaW5nRW1pdHRlcigpO1xuXG4gICAgICAgIGlmIChiYXNlRmlsdGVyLmZpbHRlciBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgICAgICAgIHRoaXMuc3ViRmlsdGVyID0gYmFzZUZpbHRlci5maWx0ZXIuc3Vic2NyaWJlKChmaWx0ZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9iYXNlRmlsdGVyID0gZmlsdGVyLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVGaWx0ZXIoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wcmVkaWNhdGVRdWVyeUNoYW5nZWQkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZUZpbHRlcigpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcHJlZGljYXRlUmVtb3ZlZCQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5fYWN0aXZlRmlsdGVyLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuX3ByZWRpY2F0ZVF1ZXJ5Q2hhbmdlZCQuY29tcGxldGUoKTtcbiAgICAgICAgaWYgKHRoaXMuc3ViRmlsdGVyKSB7XG4gICAgICAgICAgICB0aGlzLnN1YkZpbHRlci51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2xvYWRpbmdGcm9tTWV0YWRhdGEkLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuX3Jvb3RQcmVkaWNhdGUuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHRoZSBGaWx0ZXIgdGhhdCBpcyBjdXJyZW50bHkgYXBwbGllZCB0byB0aGUgdmlld1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgYWN0aXZlRmlsdGVyKCk6IEZpbHRlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hY3RpdmVGaWx0ZXIuZ2V0VmFsdWUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBhbiBgT2JzZXJ2YWJsZWAgdGhhdCB1cGRhdGVzIGV2ZXJ5IHRpbWUgdGhlIGFjdGl2ZSBGaWx0ZXIgY2hhbmdlcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGFjdGl2ZUZpbHRlciQoKTogT2JzZXJ2YWJsZTxGaWx0ZXI+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZUZpbHRlci5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYSBmaWx0ZXIgb3RoZXIgdGhhbiB0aGUgYmFzZSBmaWx0ZXIgaXMgY3VycmVudGx5IGFwcGxpZWQuXG4gICAgICogUmV0dXJucyBgZmFsc2VgIGlmIG9ubHkgdGhlIGJhc2UgZmlsdGVyIGlzIGN1cnJlbnRseSBhcHBsaWVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgYWRkaXRpb25hbEZpbHRlcnNBcHBsaWVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuX3Jvb3RQcmVkaWNhdGUucXVlcnkuaXNFbXB0eSB8fCAhIXRoaXMuX2Z1bGxUZXh0RmlsdGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiBhbnkgdmlzaWJsZSBwcmVkaWNhdGVzIGFyZSBhcHBsaWVkLlxuICAgICAqIFJldHVybnMgYGZhbHNlYCBpZiB0aGVyZSBhcmUgbm8gcHJlZGljYXRlcywgb3IgaWYgdGhlcmUgYXJlIG9ubHkgaGlkZGVuIHByZWRpY2F0ZXMgYXBwbGllZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzVmlzaWJsZVByZWRpY2F0ZXMoKTogYm9vbGVhbiB7XG4gICAgICAgIGZvciAoY29uc3QgcHJlZGljYXRlIG9mIHRoaXMuX3Jvb3RQcmVkaWNhdGUuZ2V0UHJlZGljYXRlTWFwKCkudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUuaXNWaXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIGEgY29weSBvZiB0aGUgYmFzZSBmaWx0ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGJhc2VGaWx0ZXIoKTogRmlsdGVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Jhc2VGaWx0ZXIuY2xvbmUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBhbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIGluZGV4IG9mIHRoZSByZW1vdmVkIHByZWRpY2F0ZSB3aGVuZXZlciBhIHByZWRpY2F0ZSBpcyByZW1vdmVkXG4gICAgICovXG4gICAgcHVibGljIGdldCBwcmVkaWNhdGVSZW1vdmVkJCgpOiBPYnNlcnZhYmxlPFByZWRpY2F0ZVJlbW92YWxFdmVudD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJlZGljYXRlUmVtb3ZlZCQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgdGhlIHJvb3QgcHJlZGljYXRlIG9mIHRoZSBzZWFyY2ggc2VydmljZSwgdGhhdCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBzZWFyY2ggcmVxdWVzdHMgd2l0aCBjdXN0b20gcXVlcmllc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcm9vdFByZWRpY2F0ZSgpOiBFZGl0YWJsZUNsYXVzZVByZWRpY2F0ZVdpdGhHZW5lcmF0b3JzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvb3RQcmVkaWNhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGZpbHRlciBoZWxkIGluIHRoaXMgc2VhcmNoIHNlcnZpY2UgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZpbHRlclR5cGUoKTogRmlsdGVyVHlwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJhc2VGaWx0ZXIudHlwZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB3aGV0aGVyIHRoZSBzZWFyY2ggc2VydmljZSBpcyBjdXJyZW50bHkgbG9hZGluZyBpdHMgc3RhdGUgZnJvbSBtZXRhZGF0YSBvciBub3QuXG4gICAgICpcbiAgICAgKiBTZWUgW2xvYWRGcm9tTWV0YWRhdGEoKV17QGxpbmsgU2VhcmNoU2VydmljZSNsb2FkRnJvbU1ldGFkYXRhfVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbG9hZGluZ0Zyb21NZXRhZGF0YSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRpbmdGcm9tTWV0YWRhdGEkLnZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIGFuIGBPYnNlcnZhYmxlYCB0aGF0IGVtaXRzIGB0cnVlYCBpZiB0aGUgc2VhcmNoIHNlcnZpY2UgaXMgY3VycmVudGx5IGxvYWRpbmcgaXRzIHN0YXRlIGZyb20gbWV0YWRhdGEsXG4gICAgICogZW1pdHMgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICpcbiAgICAgKiBTZWUgW2xvYWRGcm9tTWV0YWRhdGEoKV17QGxpbmsgU2VhcmNoU2VydmljZSNsb2FkRnJvbU1ldGFkYXRhfVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbG9hZGluZ0Zyb21NZXRhZGF0YSQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkaW5nRnJvbU1ldGFkYXRhJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBhbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgd2hlbmV2ZXIgdGhlIHJvb3QgcHJlZGljYXRlcyBxdWVyeSBjaGFuZ2VzXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldCBwcmVkaWNhdGVRdWVyeUNoYW5nZWQkKCk6IE9ic2VydmFibGU8UXVlcnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ByZWRpY2F0ZVF1ZXJ5Q2hhbmdlZCQuYXNPYnNlcnZhYmxlKCkucGlwZShcbiAgICAgICAgICAgIG1hcCgoKSA9PiB0aGlzLl9yb290UHJlZGljYXRlLnF1ZXJ5KSxcbiAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwcmV2LCBjdXJyKSA9PiBwcmV2ICYmIHByZXYuZXF1YWxzKGN1cnIpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSB7QGxpbmsgUHJlZGljYXRlfSB0byB0aGUgUHJlZGljYXRlIHJvb3QgYW5kIHVwZGF0ZXMgdGhlIGFjdGl2ZSBGaWx0ZXIuXG4gICAgICpcbiAgICAgKiBQcmVkaWNhdGVzIGFkZGVkIHRoaXMgd2F5IHdpbGwgbm90IGJlIHZpc2libGUgaW4gdGhlIHNlYXJjaCBHVUkuXG4gICAgICogSWYgeW91IHdhbnQgdG8gbWFrZSBzdXJlIHlvdXIgcHJlZGljYXRlcyBhcmUgdmlzaWJsZSAoYW5kIGVkaXRhYmxlKVxuICAgICAqIHVzZSB0aGUgW2FkZEdlbmVyYXRlZExlYWZQcmVkaWNhdGUoKV17QGxpbmsgU2VhcmNoU2VydmljZSNhZGRHZW5lcmF0ZWRMZWFmUHJlZGljYXRlfSBtZXRob2QgaW5zdGVhZC5cbiAgICAgKiBAcGFyYW0gbmV3UHJlZGljYXRlIFByZWRpY2F0ZSB0aGF0IHNob3VsZCBiZSBhZGRlZCB0byB0aGUgc2VhcmNoIHF1ZXJpZXMuXG4gICAgICogQHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBhZGRlZCBQcmVkaWNhdGVcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkUHJlZGljYXRlKG5ld1ByZWRpY2F0ZTogUHJlZGljYXRlKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvb3RQcmVkaWNhdGUuYWRkUHJlZGljYXRlKG5ld1ByZWRpY2F0ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBuZXcgaGlkZGVuIGJyYW5jaCBvZiB0aGUgcHJlZGljYXRlIHRyZWUgd2l0aCBhIHNpbmd1bGFyIGxlYWYgbm9kZSBjb250YWluaW5nIHRoZSBwcm92aWRlZCBRdWVyeS5cbiAgICAgKlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gYWRkIHByZWRpY2F0ZXMgdG8gdGhlIHNlYXJjaCB0cmVlICh0aGluayBoZWFkZXIgc2VhcmNoKSxcbiAgICAgKiB3aGljaCBjYW4gYmUgbWFkZSB2aXNpYmxlIGFuZCBlZGl0YWJsZSBpbiB0aGUgc2VhcmNoIEdVSSBsYXRlci5cbiAgICAgKiBAcGFyYW0gZ2VuZXJhdG9yIHRoZSBnZW5lcmF0b3IgdGhhdCBpcyBpbiBzdWNoIHN0YXRlLCB0aGF0IGl0IGdlbmVyYXRlcyB0aGUgUXVlcnksIHRoYXQgc2hvdWxkIGJlIGFkZGVkIGFzIGJyYW5jaC9sZWFmLlxuICAgICAqIElmIHRoZSBnZW5lcmF0b3IgZG9lc24ndCBjdXJyZW50bHkgZ2VuZXJhdGUgYSBxdWVyeSBhIG5vZGUgd2l0aCBhbiBlbXB0eSBxdWVyeSB3aWxsIGJlIGFkZGVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRHZW5lcmF0ZWRMZWFmUHJlZGljYXRlKGdlbmVyYXRvcjogQ2F0ZWdvcnk8YW55Pik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGJyYW5jaElkID0gdGhpcy5fcm9vdFByZWRpY2F0ZS5hZGROZXdDbGF1c2VQcmVkaWNhdGUoQm9vbGVhbk9wZXJhdG9yLk9SLCBmYWxzZSk7XG4gICAgICAgIGNvbnN0IGJyYW5jaCA9IChcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RQcmVkaWNhdGUuZ2V0UHJlZGljYXRlTWFwKCkuZ2V0KGJyYW5jaElkKS5nZXRXcmFwcGVkUHJlZGljYXRlKCkgYXMgdW5rbm93biBhcyBFZGl0YWJsZUNsYXVzZVByZWRpY2F0ZVdpdGhHZW5lcmF0b3JzXG4gICAgICAgICk7XG4gICAgICAgIGJyYW5jaC5hZGROZXdQcmVkaWNhdGVGcm9tR2VuZXJhdG9yKGdlbmVyYXRvcik7XG4gICAgICAgIHJldHVybiBicmFuY2hJZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSB7QGxpbmsgUHJlZGljYXRlfSBvYmplY3QgZnJvbSB0aGUgcHJvdmlkZWQgaW5kZXguIElmIHRoZSBpbmRleCBpcyBpbnZhbGlkIGRvZXMgbm90aGluZy5cbiAgICAgKiBVcGRhdGVzIHRoZSB0aGUgYWN0aXZlIEZpbHRlciBpZiB0aGUgUHJlZGljYXRlIHRyZWUgd2FzIGFmZmVjdGVkLlxuICAgICAqIEBwYXJhbSBpbmRleCBpbmRleCBvZiB0aGUgUHJlZGljYXRlIHRoYXQgc2hvdWxkIGJlIHJlbW92ZWRcbiAgICAgKiBAcGFyYW0gY2xlYXJJbnB1dCB3aGV0aGVyIHRoZSBpbnB1dCwgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgcHJlZGljYXRlIHNob3VsZCBiZSBjbGVhcmVkXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZVByZWRpY2F0ZShpbmRleDogbnVtYmVyLCBjbGVhcklucHV0ID0gdHJ1ZSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fcm9vdFByZWRpY2F0ZS5yZW1vdmVQcmVkaWNhdGUoaW5kZXgpKSB7XG4gICAgICAgICAgICB0aGlzLl9wcmVkaWNhdGVSZW1vdmVkJC5uZXh0KHtpbmRleCwgY2xlYXJJbnB1dH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwge0BsaW5rIFByZWRpY2F0ZX0gb2JqZWN0cyB0aGF0IGNvbnRyaWJ1dGUgdG8gdGhlIHNlYXJjaC4gVXBkYXRlcyB0aGUgYWN0aXZlIEZpbHRlciBpZiBpdCB3YXMgYWZmZWN0ZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2xlYXJIaWRkZW4gd2hldGhlciB0aGUgaGlkZGVuIHByZWRpY2F0ZXMgc2hvdWxkIGJlIGNsZWFyZWQgYXMgd2VsbFxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhclByZWRpY2F0ZXMoY2xlYXJIaWRkZW4gPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fcm9vdFByZWRpY2F0ZS5nZXRQcmVkaWNhdGVNYXAoKS5zaXplID4gMCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbaWQsIHByZWRpY2F0ZV0gb2YgdGhpcy5fcm9vdFByZWRpY2F0ZS5nZXRQcmVkaWNhdGVNYXAoKS5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2xlYXJIaWRkZW4gfHwgcHJlZGljYXRlLmlzVmlzaWJsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZVByZWRpY2F0ZShpZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVGaWx0ZXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSB7QGxpbmsgRmlsdGVyfSB3aXRoIHRoZSBbZnVsbFRleHRde0BsaW5rIENhc2VTZWFyY2hSZXF1ZXN0Qm9keSNmdWxsVGV4dH0gYXR0cmlidXRlIHNldCB0byB0aGUgcHJvdmlkZWQgdmFsdWUuXG4gICAgICogSWYgZnVsbCB0ZXh0IGZpbHRlciBpcyBhbHJlYWR5IHNldCwgaXQgd2lsbCBiZSByZXBsYWNlZC5cbiAgICAgKiBAcGFyYW0gc2VhcmNoZWRTdWJzdHJpbmcgdmFsdWUgdGhhdCBzaG91bGQgYmUgc2VhcmNoZWQgb24gYWxsIGZ1bGwgdGV4dCBmaWVsZHNcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RnVsbFRleHRGaWx0ZXIoc2VhcmNoZWRTdWJzdHJpbmc6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCB3aGl0ZVNwYWNlZFN1YnN0cmluZyA9IHNlYXJjaGVkU3Vic3RyaW5nLnJlcGxhY2UoJyAnLCAnXFxcXCAnKTtcbiAgICAgICAgdGhpcy5fZnVsbFRleHRGaWx0ZXIgPSBuZXcgU2ltcGxlRmlsdGVyKCcnLCB0aGlzLl9iYXNlRmlsdGVyLnR5cGUsIHtmdWxsVGV4dDogd2hpdGVTcGFjZWRTdWJzdHJpbmd9KTtcbiAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVGaWx0ZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhlIGZ1bGwgdGV4dCBmaWx0ZXIgKGlmIHNldCkuIElmIHRoZSBmdWxsIHRleHQgZmlsdGVyIGlzIG5vdCBzZXQsIGRvZXMgbm90aGluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXJGdWxsVGV4dEZpbHRlcigpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgd2FzRnVsbHRleHRTZXQgPSB0aGlzLl9mdWxsVGV4dEZpbHRlciAhPT0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9mdWxsVGV4dEZpbHRlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHdhc0Z1bGx0ZXh0U2V0KSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZUZpbHRlcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvd3MgdGhlIHByZWRpY2F0ZXMgd2l0aCB0aGUgZ2l2ZW4gaWRzLiBTa2lwcyBpZHMgdGhhdCBkb24ndCBleGlzdC5cbiAgICAgKiBAcGFyYW0gcHJlZGljYXRlSWRzIHRoZSBpZHMgb2YgdGhlIHByZWRpY2F0ZXMgdGhhdCBzaG91bGQgYmUgc2hvd24uXG4gICAgICovXG4gICAgcHVibGljIHNob3cocHJlZGljYXRlSWRzOiBBcnJheTxudW1iZXI+KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3Jvb3RQcmVkaWNhdGUuc2hvd1ByZWRpY2F0ZXMocHJlZGljYXRlSWRzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWFkcyB0aGUgY3VycmVudCBxdWVyeSBmcm9tIHRoZSBwcmVkaWNhdGUgdHJlZSwgY29tYmluZXMgaXQgd2l0aCB0aGUgYmFzZSBGaWx0ZXIgYW5kIGZ1bGwgdGV4dCBGaWx0ZXIgKGlmIHNldClcbiAgICAgKiBhbmQgdXBkYXRlcyB0aGUgYWN0aXZlIEZpbHRlci5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgdXBkYXRlQWN0aXZlRmlsdGVyKCk6IHZvaWQge1xuICAgICAgICBsZXQgYWRkaXRpb25hbEZpbHRlcjogRmlsdGVyO1xuICAgICAgICBpZiAoIXRoaXMuX3Jvb3RQcmVkaWNhdGUucXVlcnkuaXNFbXB0eSkge1xuICAgICAgICAgICAgYWRkaXRpb25hbEZpbHRlciA9IG5ldyBTaW1wbGVGaWx0ZXIoJycsIHRoaXMuX2Jhc2VGaWx0ZXIudHlwZSwge3F1ZXJ5OiB0aGlzLl9yb290UHJlZGljYXRlLnF1ZXJ5LnZhbHVlfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2Z1bGxUZXh0RmlsdGVyKSB7XG4gICAgICAgICAgICBpZiAoYWRkaXRpb25hbEZpbHRlcikge1xuICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxGaWx0ZXIgPSBhZGRpdGlvbmFsRmlsdGVyLm1lcmdlKHRoaXMuX2Z1bGxUZXh0RmlsdGVyLCBNZXJnZU9wZXJhdG9yLkFORCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxGaWx0ZXIgPSB0aGlzLl9mdWxsVGV4dEZpbHRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYWRkaXRpb25hbEZpbHRlcikge1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlRmlsdGVyLm5leHQodGhpcy5fYmFzZUZpbHRlci5tZXJnZShhZGRpdGlvbmFsRmlsdGVyLCBNZXJnZU9wZXJhdG9yLkFORCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlRmlsdGVyLm5leHQodGhpcy5fYmFzZUZpbHRlci5jbG9uZSgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoZSBwcmVkaWNhdGUgdHJlZSBjb250YWlucyBubyBjb21wbGV0ZSBxdWVyeS5cbiAgICAgKiBPdGhlcndpc2UgcmV0dXJucyB0aGUgc2VyaWFsaXplZCBmb3JtIG9mIHRoZSBjb21wbGV0ZWQgcXVlcmllcyBpbiB0aGUgcHJlZGljYXRlIHRyZWUuXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZVByZWRpY2F0ZU1ldGFkYXRhKCk6IFByZWRpY2F0ZVRyZWVNZXRhZGF0YSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb290UHJlZGljYXRlLmNyZWF0ZUdlbmVyYXRvck1ldGFkYXRhKCkgYXMgUHJlZGljYXRlVHJlZU1ldGFkYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGxhY2VzIHRoZSBjdXJyZW50IHByZWRpY2F0ZSBmaWx0ZXIgYnkgdGhlIG9uZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm92aWRlZCBnZW5lcmF0b3IgbWV0YWRhdGEuXG4gICAgICpcbiAgICAgKiBUaGUge0BsaW5rIENhdGVnb3J5RmFjdG9yeX0gaW5zdGFuY2UgbXVzdCBiZSBwcm92aWRlZCBmb3IgdGhpcyBzZXJ2aWNlIGlmIHdlIHdhbnQgdG8gdXNlIHRoaXMgbWV0aG9kLiBMb2dzIGFuIGVycm9yIGFuZCBkb2VzIG5vdGhpbmcuXG4gICAgICpcbiAgICAgKiBUaGUgYGZpbHRlclR5cGVgIG9mIHRoaXMgc2VhcmNoIHNlcnZpY2UgbXVzdCBtYXRjaCB0aGUgYGZpbHRlclR5cGVgIG9mIHRoZSBwcm92aWRlZCBtZXRhZGF0YS4gT3RoZXJ3aXNlIGFuIGVycm9yIGlzIHRocm93bi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtZXRhZGF0YSB0aGUgc2VyaWFsaXplZCBzdGF0ZSBvZiB0aGUgcHJlZGljYXRlIHRyZWUgdGhhdCBzaG91bGQgYmUgcmVzdG9yZWQgdG8gdGhpcyBzZWFyY2ggc2VydmljZVxuICAgICAqL1xuICAgIHB1YmxpYyBsb2FkRnJvbU1ldGFkYXRhKG1ldGFkYXRhOiBGaWx0ZXJNZXRhZGF0YSkge1xuICAgICAgICBpZiAodGhpcy5fY2F0ZWdvcnlGYWN0b3J5ID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2cuZXJyb3IoJ0EgQ2F0ZWdvcnlGYWN0b3J5IGluc3RhbmNlIG11c3QgYmUgcHJvdmlkZWQgZm9yIHRoZSBTZWFyY2hTZXJ2aWNlJ1xuICAgICAgICAgICAgICAgICsgJyBpZiB5b3Ugd2FudCB0byByZWNvbnN0cnVjdCBhIHByZWRpY2F0ZSBmaWx0ZXIgZnJvbSBzYXZlZCBtZXRhZGF0YScpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1ldGFkYXRhLmZpbHRlclR5cGUgIT09IHRoaXMuZmlsdGVyVHlwZSkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYFRoZSBmaWx0ZXIgdHlwZSBvZiB0aGUgcHJvdmlkZWQgbWV0YWRhdGEgKCR7bWV0YWRhdGEuZmlsdGVyVHlwZVxuICAgICAgICAgICAgfSkgZG9lcyBub3QgbWF0Y2ggdGhlIGZpbHRlciB0eXBlIG9mIHRoZSBzZWFyY2ggc2VydmljZSAoJHt0aGlzLmZpbHRlclR5cGV9KSFgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xlYXJQcmVkaWNhdGVzKHRydWUpO1xuICAgICAgICB0aGlzLl9sb2FkaW5nRnJvbU1ldGFkYXRhJC5vbigpO1xuXG4gICAgICAgIGNvbnN0IGdlbmVyYXRvck9ic2VydmFibGVzID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBjbGF1c2Ugb2YgbWV0YWRhdGEucHJlZGljYXRlTWV0YWRhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IGJyYW5jaElkID0gdGhpcy5fcm9vdFByZWRpY2F0ZS5hZGROZXdDbGF1c2VQcmVkaWNhdGUoQm9vbGVhbk9wZXJhdG9yLk9SKTtcbiAgICAgICAgICAgIGNvbnN0IGJyYW5jaFByZWRpY2F0ZSA9IChcbiAgICAgICAgICAgICAgICB0aGlzLl9yb290UHJlZGljYXRlLmdldFByZWRpY2F0ZU1hcCgpLmdldChicmFuY2hJZClcbiAgICAgICAgICAgICAgICAgICAgLmdldFdyYXBwZWRQcmVkaWNhdGUoKSBhcyB1bmtub3duIGFzIEVkaXRhYmxlQ2xhdXNlUHJlZGljYXRlV2l0aEdlbmVyYXRvcnNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByZWRpY2F0ZSBvZiBjbGF1c2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2NhbEJyYW5jaFJlZmVyZW5jZSA9IGJyYW5jaFByZWRpY2F0ZTtcbiAgICAgICAgICAgICAgICBnZW5lcmF0b3JPYnNlcnZhYmxlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYXRlZ29yeUZhY3RvcnkuZ2V0RnJvbU1ldGFkYXRhKHByZWRpY2F0ZSkucGlwZSh0YXAoZ2VuZXJhdG9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsQnJhbmNoUmVmZXJlbmNlLmFkZE5ld1ByZWRpY2F0ZUZyb21HZW5lcmF0b3IoZ2VuZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvcmtKb2luKGdlbmVyYXRvck9ic2VydmFibGVzKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fbG9hZGluZ0Zyb21NZXRhZGF0YSQub2ZmKCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZUZpbHRlcigpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBhbiBBcnJheSBvZiBmaWx0ZXIgdGV4dCBzZWdtZW50cyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgY29tcGxldGVkIHByZWRpY2F0ZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlRmlsdGVyVGV4dFNlZ21lbnRzKCk6IEFycmF5PEZpbHRlclRleHRTZWdtZW50PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb290UHJlZGljYXRlLmNyZWF0ZUZpbHRlclRleHRTZWdtZW50cygpO1xuICAgIH1cbn1cbiJdfQ==
|