@jax-data-science/sci-image-visualizer 0.2.11 → 0.2.13

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/esm2022/index.mjs CHANGED
@@ -25,6 +25,7 @@ export * from './lib/contracts/cell-segmenter.contract';
25
25
  export { CellposeSegmenterService } from './lib/toolbar/segmentation/cellpose-segmenter.service';
26
26
  export * from './lib/contracts/instance-segmenter.contract';
27
27
  export { YoloSegmenterService } from './lib/toolbar/segmentation/yolo-segmenter.service';
28
+ export { YoloDetectToolService } from './lib/toolbar/segmentation/yolo-detect-tool.service';
28
29
  // ── Generic client-side image utilities (shared with the host's pipeline) ──
29
30
  export { ProcessingImage } from './lib/processing/processing-image';
30
31
  export { cropImage } from './lib/processing/image-crop';
@@ -53,4 +54,4 @@ export { VisualizerComponent } from './lib/visualizer.component';
53
54
  export { RegionEditorComponent } from './lib/region-editor/region-editor.component';
54
55
  export { HexColorPickerComponent } from './lib/hex-color-picker/hex-color-picker.component';
55
56
  export { ChannelHistogramComponent } from './lib/channel-histogram/channel-histogram.component';
56
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsNEVBQTRFO0FBQzVFLGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYyw0Q0FBNEMsQ0FBQztBQUMzRCxjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELGNBQWMsd0NBQXdDLENBQUM7QUFDdkQsY0FBYyxzQ0FBc0MsQ0FBQztBQUNyRCxjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELGNBQWMsZ0RBQWdELENBQUM7QUFDL0QsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLGdDQUFnQyxDQUFDO0FBQy9DLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLHVDQUF1QyxDQUFDO0FBQ3RELGNBQWMseUNBQXlDLENBQUM7QUFDeEQsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMseUNBQXlDLENBQUM7QUFDeEQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDakcsY0FBYyw2Q0FBNkMsQ0FBQztBQUM1RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUV6Riw4RUFBOEU7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxTQUFTLEVBQW9CLE1BQU0sNkJBQTZCLENBQUM7QUFDMUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFFakYsNkVBQTZFO0FBQzdFLE9BQU8sRUFDTCxVQUFVLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQy9FLGtCQUFrQixFQUFFLG9CQUFvQixHQUN6QyxNQUFNLCtDQUErQyxDQUFDO0FBRXZELDZFQUE2RTtBQUM3RSxPQUFPLEVBQ0wsV0FBVyxFQUFFLHFCQUFxQixFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFDcEYsbUJBQW1CLEVBQUUscUJBQXFCLEdBQzNDLE1BQU0sZ0RBQWdELENBQUM7QUFFeEQsOEVBQThFO0FBQzlFLE9BQU8sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFFL0YsNEVBQTRFO0FBQzVFLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFcEQsNEVBQTRFO0FBQzVFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQzVFLDZFQUE2RTtBQUM3RSxtRUFBbUU7QUFDbkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFbkUsNkVBQTZFO0FBQzdFLDBFQUEwRTtBQUMxRSw4RUFBOEU7QUFDOUUsNkRBQTZEO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQzVGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHFEQUFxRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQdWJsaWMgQVBJIG9mIHRoZSBqYXgtaW1hZ2UtdmlzdWFsaXphdGlvbiBsaWJyYXJ5LiBFeHRlcm5hbCBjb25zdW1lcnMgaW1wb3J0XG4gKiBPTkxZIGZyb20gaGVyZSAoYEBqYXgtZGF0YS1zY2llbmNlL3NjaS1pbWFnZS12aXN1YWxpemVyYCk7IGV2ZXJ5dGhpbmcgZWxzZSB1bmRlciBgbGliL2AgaXNcbiAqIGludGVybmFsLiBUaGUgc3VyZmFjZSBpcyBjb250cmFjdHMgKyB0b2tlbnMgKyBuZXV0cmFsIG1vZGVscyArIHRoZSBBbmd1bGFyXG4gKiBtb2R1bGUsIHBsdXMgdGhlIHJvdXRpbmcgc2VydmljZSB0aGUgaG9zdCdzIGNvbXBvc2l0aW9uIHJvb3QgYmluZHMgdGhlIHRva2Vuc1xuICogdG8gKGB1c2VFeGlzdGluZ2ApLlxuICovXG5cbi8vIOKUgOKUgCBDb250cmFjdHMgJiBESSB0b2tlbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvcmVnaW9uLWVkaXRvci1hcGkuY29udHJhY3QnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3BvcnRzL2ltYWdlLXN0YXRlLnBvcnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3BvcnRzL3RpbGUtYWNjZXNzLnBvcnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3BvcnRzL3JlZ2lvbi1pby5wb3J0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9wb3J0cy9wcmVmZXJlbmNlcy5wb3J0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3Zpei1jb25maWcnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9wbG90LXR5cGUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3Rvb2xiYXItY29uZmlnJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9jYXBhYmlsaXRpZXMuY29udHJhY3QnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3JlZ2lvbi1vdmVybGF5LmNvbnRyYWN0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9zYW0uY29udHJhY3QnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL2NlbGwtc2VnbWVudGVyLmNvbnRyYWN0JztcbmV4cG9ydCB7IENlbGxwb3NlU2VnbWVudGVyU2VydmljZSB9IGZyb20gJy4vbGliL3Rvb2xiYXIvc2VnbWVudGF0aW9uL2NlbGxwb3NlLXNlZ21lbnRlci5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9pbnN0YW5jZS1zZWdtZW50ZXIuY29udHJhY3QnO1xuZXhwb3J0IHsgWW9sb1NlZ21lbnRlclNlcnZpY2UgfSBmcm9tICcuL2xpYi90b29sYmFyL3NlZ21lbnRhdGlvbi95b2xvLXNlZ21lbnRlci5zZXJ2aWNlJztcblxuLy8g4pSA4pSAIEdlbmVyaWMgY2xpZW50LXNpZGUgaW1hZ2UgdXRpbGl0aWVzIChzaGFyZWQgd2l0aCB0aGUgaG9zdCdzIHBpcGVsaW5lKSDilIDilIBcbmV4cG9ydCB7IFByb2Nlc3NpbmdJbWFnZSB9IGZyb20gJy4vbGliL3Byb2Nlc3NpbmcvcHJvY2Vzc2luZy1pbWFnZSc7XG5leHBvcnQgeyBjcm9wSW1hZ2UsIENyb3BJbWFnZU9wdGlvbnMgfSBmcm9tICcuL2xpYi9wcm9jZXNzaW5nL2ltYWdlLWNyb3AnO1xuZXhwb3J0IHsgSW1hZ2VDb252ZXJ0ZXJTZXJ2aWNlIH0gZnJvbSAnLi9saWIvcHJvY2Vzc2luZy9pbWFnZS1jb252ZXJ0ZXIuc2VydmljZSc7XG5cbi8vIOKUgOKUgCBTQU0gbW9kZWwgcmVnaXN0cnkgKGhvc3QgY29uZmlndXJlcyBob3N0ZWQgT05OWCBVUkxzIG9uY2UgYXZhaWxhYmxlKSDilIDilIBcbmV4cG9ydCB7XG4gIFNBTV9NT0RFTFMsIERFRkFVTFRfU0FNX01PREVMX0lELCBnZXRTYW1Nb2RlbCwgaXNTYW1Nb2RlbFJlYWR5LCBzZXRTYW1Nb2RlbFVybHMsXG4gIHNldERlZmF1bHRTYW1Nb2RlbCwgZ2V0RGVmYXVsdFNhbU1vZGVsSWQsXG59IGZyb20gJy4vbGliL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS1tb2RlbC1yZWdpc3RyeSc7XG5cbi8vIOKUgOKUgCBZT0xPIGluc3RhbmNlLXNlZ21lbnRhdGlvbiBtb2RlbCByZWdpc3RyeSAoc2FtZSByZXBvaW50aW5nIHN0b3J5KSDilIDilIDilIDilIDilIBcbmV4cG9ydCB7XG4gIFlPTE9fTU9ERUxTLCBERUZBVUxUX1lPTE9fTU9ERUxfSUQsIGdldFlvbG9Nb2RlbCwgaXNZb2xvTW9kZWxSZWFkeSwgc2V0WW9sb01vZGVsVXJscyxcbiAgc2V0RGVmYXVsdFlvbG9Nb2RlbCwgZ2V0RGVmYXVsdFlvbG9Nb2RlbElkLCBZb2xvTW9kZWxEZWYsXG59IGZyb20gJy4vbGliL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3lvbG8tbW9kZWwtcmVnaXN0cnknO1xuXG4vLyDilIDilIAgb25ueHJ1bnRpbWUtd2ViIFdBU00gbG9jYXRpb24gKGhvc3Qgb3ZlcnJpZGVzIG9uY2UsIGF0IGFwcCBpbml0KSDilIDilIDilIDilIDilIDilIDilIBcbmV4cG9ydCB7IHNldE9ydFdhc21CYXNlLCBnZXRPcnRXYXNtQmFzZSB9IGZyb20gJy4vbGliL3Rvb2xiYXIvc2VnbWVudGF0aW9uL29ydC1ydW50aW1lLWNvbmZpZyc7XG5cbi8vIOKUgOKUgCBOZXV0cmFsIGRhdGEgbW9kZWxzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kZWxzL3JlZ2lvbic7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2RlbHMvY2xhc3MtcHJlc2V0JztcbmV4cG9ydCB7IFNoYXBlU2VsZWN0aW9uIH0gZnJvbSAnLi9saWIvbW9kZWxzL3NoYXBlJztcblxuLy8g4pSA4pSAIEFuZ3VsYXIgbW9kdWxlICsgY29tcG9zaXRpb24tcm9vdCBzZXJ2aWNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuZXhwb3J0IHsgVmlzdWFsaXphdGlvbk1vZHVsZSB9IGZyb20gJy4vbGliL3Zpc3VhbGl6YXRpb24ubW9kdWxlJztcbmV4cG9ydCB7IFJvdXRpbmdWaXN1YWxpemVyU2VydmljZSB9IGZyb20gJy4vbGliL3JvdXRpbmctdmlzdWFsaXplci5zZXJ2aWNlJztcbi8vIFByb3ZpZGVyIGZhY3RvcnkgZm9yIGFuIGlzb2xhdGVkLCBjb21wb25lbnQtc2NvcGVkIHZpZXdlciBpbnN0YW5jZSAoZS5nLiBhXG4vLyBtb2RhbCB0aGF0IG11c3Qgbm90IHNoYXJlIHRoZSBtYWluIHZpZXdlcidzIHJlZ2lvbi9pbWFnZSBzdGF0ZSkuXG5leHBvcnQgeyBwcm92aWRlVmlzdWFsaXphdGlvbiB9IGZyb20gJy4vbGliL3Byb3ZpZGUtdmlzdWFsaXphdGlvbic7XG5cbi8vIOKUgOKUgCBQdWJsaWMgY29tcG9uZW50cyAoZXhwb3J0ZWQgYnkgVmlzdWFsaXphdGlvbk1vZHVsZSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBuZy1wYWNrYWdyIHJlcXVpcmVzIG1vZHVsZS1leHBvcnRlZCBjb21wb25lbnRzIHRvIGJlIHJlYWNoYWJsZSBmcm9tIHRoZVxuLy8gZW50cnkgcG9pbnQgc28gY29uc3VtZXJzIGdldCB0aGVpciB0eXBlczsgdGhlc2UgYXJlIHRoZSBlbWJlZGRhYmxlIGVsZW1lbnRzXG4vLyAoYDx2aXN1YWxpemVyPmAsIGA8cmVnaW9uLWVkaXRvcj5gLCBgPGhleC1jb2xvci1waWNrZXI+YCkuXG5leHBvcnQgeyBWaXN1YWxpemVyQ29tcG9uZW50IH0gZnJvbSAnLi9saWIvdmlzdWFsaXplci5jb21wb25lbnQnO1xuZXhwb3J0IHsgUmVnaW9uRWRpdG9yQ29tcG9uZW50IH0gZnJvbSAnLi9saWIvcmVnaW9uLWVkaXRvci9yZWdpb24tZWRpdG9yLmNvbXBvbmVudCc7XG5leHBvcnQgeyBIZXhDb2xvclBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4vbGliL2hleC1jb2xvci1waWNrZXIvaGV4LWNvbG9yLXBpY2tlci5jb21wb25lbnQnO1xuZXhwb3J0IHsgQ2hhbm5lbEhpc3RvZ3JhbUNvbXBvbmVudCB9IGZyb20gJy4vbGliL2NoYW5uZWwtaGlzdG9ncmFtL2NoYW5uZWwtaGlzdG9ncmFtLmNvbXBvbmVudCc7XG4iXX0=
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsNEVBQTRFO0FBQzVFLGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYyw0Q0FBNEMsQ0FBQztBQUMzRCxjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELGNBQWMsd0NBQXdDLENBQUM7QUFDdkQsY0FBYyxzQ0FBc0MsQ0FBQztBQUNyRCxjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELGNBQWMsZ0RBQWdELENBQUM7QUFDL0QsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLGdDQUFnQyxDQUFDO0FBQy9DLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLHVDQUF1QyxDQUFDO0FBQ3RELGNBQWMseUNBQXlDLENBQUM7QUFDeEQsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMseUNBQXlDLENBQUM7QUFDeEQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDakcsY0FBYyw2Q0FBNkMsQ0FBQztBQUM1RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUN6RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUU1Riw4RUFBOEU7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxTQUFTLEVBQW9CLE1BQU0sNkJBQTZCLENBQUM7QUFDMUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFFakYsNkVBQTZFO0FBQzdFLE9BQU8sRUFDTCxVQUFVLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQy9FLGtCQUFrQixFQUFFLG9CQUFvQixHQUN6QyxNQUFNLCtDQUErQyxDQUFDO0FBRXZELDZFQUE2RTtBQUM3RSxPQUFPLEVBQ0wsV0FBVyxFQUFFLHFCQUFxQixFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFDcEYsbUJBQW1CLEVBQUUscUJBQXFCLEdBQzNDLE1BQU0sZ0RBQWdELENBQUM7QUFFeEQsOEVBQThFO0FBQzlFLE9BQU8sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFFL0YsNEVBQTRFO0FBQzVFLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFcEQsNEVBQTRFO0FBQzVFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQzVFLDZFQUE2RTtBQUM3RSxtRUFBbUU7QUFDbkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFbkUsNkVBQTZFO0FBQzdFLDBFQUEwRTtBQUMxRSw4RUFBOEU7QUFDOUUsNkRBQTZEO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQzVGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHFEQUFxRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQdWJsaWMgQVBJIG9mIHRoZSBqYXgtaW1hZ2UtdmlzdWFsaXphdGlvbiBsaWJyYXJ5LiBFeHRlcm5hbCBjb25zdW1lcnMgaW1wb3J0XG4gKiBPTkxZIGZyb20gaGVyZSAoYEBqYXgtZGF0YS1zY2llbmNlL3NjaS1pbWFnZS12aXN1YWxpemVyYCk7IGV2ZXJ5dGhpbmcgZWxzZSB1bmRlciBgbGliL2AgaXNcbiAqIGludGVybmFsLiBUaGUgc3VyZmFjZSBpcyBjb250cmFjdHMgKyB0b2tlbnMgKyBuZXV0cmFsIG1vZGVscyArIHRoZSBBbmd1bGFyXG4gKiBtb2R1bGUsIHBsdXMgdGhlIHJvdXRpbmcgc2VydmljZSB0aGUgaG9zdCdzIGNvbXBvc2l0aW9uIHJvb3QgYmluZHMgdGhlIHRva2Vuc1xuICogdG8gKGB1c2VFeGlzdGluZ2ApLlxuICovXG5cbi8vIOKUgOKUgCBDb250cmFjdHMgJiBESSB0b2tlbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvcmVnaW9uLWVkaXRvci1hcGkuY29udHJhY3QnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3BvcnRzL2ltYWdlLXN0YXRlLnBvcnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3BvcnRzL3RpbGUtYWNjZXNzLnBvcnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3BvcnRzL3JlZ2lvbi1pby5wb3J0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9wb3J0cy9wcmVmZXJlbmNlcy5wb3J0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3Zpei1jb25maWcnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9wbG90LXR5cGUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3Rvb2xiYXItY29uZmlnJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9jYXBhYmlsaXRpZXMuY29udHJhY3QnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3JlZ2lvbi1vdmVybGF5LmNvbnRyYWN0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9zYW0uY29udHJhY3QnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL2NlbGwtc2VnbWVudGVyLmNvbnRyYWN0JztcbmV4cG9ydCB7IENlbGxwb3NlU2VnbWVudGVyU2VydmljZSB9IGZyb20gJy4vbGliL3Rvb2xiYXIvc2VnbWVudGF0aW9uL2NlbGxwb3NlLXNlZ21lbnRlci5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9pbnN0YW5jZS1zZWdtZW50ZXIuY29udHJhY3QnO1xuZXhwb3J0IHsgWW9sb1NlZ21lbnRlclNlcnZpY2UgfSBmcm9tICcuL2xpYi90b29sYmFyL3NlZ21lbnRhdGlvbi95b2xvLXNlZ21lbnRlci5zZXJ2aWNlJztcbmV4cG9ydCB7IFlvbG9EZXRlY3RUb29sU2VydmljZSB9IGZyb20gJy4vbGliL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3lvbG8tZGV0ZWN0LXRvb2wuc2VydmljZSc7XG5cbi8vIOKUgOKUgCBHZW5lcmljIGNsaWVudC1zaWRlIGltYWdlIHV0aWxpdGllcyAoc2hhcmVkIHdpdGggdGhlIGhvc3QncyBwaXBlbGluZSkg4pSA4pSAXG5leHBvcnQgeyBQcm9jZXNzaW5nSW1hZ2UgfSBmcm9tICcuL2xpYi9wcm9jZXNzaW5nL3Byb2Nlc3NpbmctaW1hZ2UnO1xuZXhwb3J0IHsgY3JvcEltYWdlLCBDcm9wSW1hZ2VPcHRpb25zIH0gZnJvbSAnLi9saWIvcHJvY2Vzc2luZy9pbWFnZS1jcm9wJztcbmV4cG9ydCB7IEltYWdlQ29udmVydGVyU2VydmljZSB9IGZyb20gJy4vbGliL3Byb2Nlc3NpbmcvaW1hZ2UtY29udmVydGVyLnNlcnZpY2UnO1xuXG4vLyDilIDilIAgU0FNIG1vZGVsIHJlZ2lzdHJ5IChob3N0IGNvbmZpZ3VyZXMgaG9zdGVkIE9OTlggVVJMcyBvbmNlIGF2YWlsYWJsZSkg4pSA4pSAXG5leHBvcnQge1xuICBTQU1fTU9ERUxTLCBERUZBVUxUX1NBTV9NT0RFTF9JRCwgZ2V0U2FtTW9kZWwsIGlzU2FtTW9kZWxSZWFkeSwgc2V0U2FtTW9kZWxVcmxzLFxuICBzZXREZWZhdWx0U2FtTW9kZWwsIGdldERlZmF1bHRTYW1Nb2RlbElkLFxufSBmcm9tICcuL2xpYi90b29sYmFyL3NlZ21lbnRhdGlvbi9zYW0tbW9kZWwtcmVnaXN0cnknO1xuXG4vLyDilIDilIAgWU9MTyBpbnN0YW5jZS1zZWdtZW50YXRpb24gbW9kZWwgcmVnaXN0cnkgKHNhbWUgcmVwb2ludGluZyBzdG9yeSkg4pSA4pSA4pSA4pSA4pSAXG5leHBvcnQge1xuICBZT0xPX01PREVMUywgREVGQVVMVF9ZT0xPX01PREVMX0lELCBnZXRZb2xvTW9kZWwsIGlzWW9sb01vZGVsUmVhZHksIHNldFlvbG9Nb2RlbFVybHMsXG4gIHNldERlZmF1bHRZb2xvTW9kZWwsIGdldERlZmF1bHRZb2xvTW9kZWxJZCwgWW9sb01vZGVsRGVmLFxufSBmcm9tICcuL2xpYi90b29sYmFyL3NlZ21lbnRhdGlvbi95b2xvLW1vZGVsLXJlZ2lzdHJ5JztcblxuLy8g4pSA4pSAIG9ubnhydW50aW1lLXdlYiBXQVNNIGxvY2F0aW9uIChob3N0IG92ZXJyaWRlcyBvbmNlLCBhdCBhcHAgaW5pdCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5leHBvcnQgeyBzZXRPcnRXYXNtQmFzZSwgZ2V0T3J0V2FzbUJhc2UgfSBmcm9tICcuL2xpYi90b29sYmFyL3NlZ21lbnRhdGlvbi9vcnQtcnVudGltZS1jb25maWcnO1xuXG4vLyDilIDilIAgTmV1dHJhbCBkYXRhIG1vZGVscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy9yZWdpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kZWxzL2NsYXNzLXByZXNldCc7XG5leHBvcnQgeyBTaGFwZVNlbGVjdGlvbiB9IGZyb20gJy4vbGliL21vZGVscy9zaGFwZSc7XG5cbi8vIOKUgOKUgCBBbmd1bGFyIG1vZHVsZSArIGNvbXBvc2l0aW9uLXJvb3Qgc2VydmljZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbmV4cG9ydCB7IFZpc3VhbGl6YXRpb25Nb2R1bGUgfSBmcm9tICcuL2xpYi92aXN1YWxpemF0aW9uLm1vZHVsZSc7XG5leHBvcnQgeyBSb3V0aW5nVmlzdWFsaXplclNlcnZpY2UgfSBmcm9tICcuL2xpYi9yb3V0aW5nLXZpc3VhbGl6ZXIuc2VydmljZSc7XG4vLyBQcm92aWRlciBmYWN0b3J5IGZvciBhbiBpc29sYXRlZCwgY29tcG9uZW50LXNjb3BlZCB2aWV3ZXIgaW5zdGFuY2UgKGUuZy4gYVxuLy8gbW9kYWwgdGhhdCBtdXN0IG5vdCBzaGFyZSB0aGUgbWFpbiB2aWV3ZXIncyByZWdpb24vaW1hZ2Ugc3RhdGUpLlxuZXhwb3J0IHsgcHJvdmlkZVZpc3VhbGl6YXRpb24gfSBmcm9tICcuL2xpYi9wcm92aWRlLXZpc3VhbGl6YXRpb24nO1xuXG4vLyDilIDilIAgUHVibGljIGNvbXBvbmVudHMgKGV4cG9ydGVkIGJ5IFZpc3VhbGl6YXRpb25Nb2R1bGUpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gbmctcGFja2FnciByZXF1aXJlcyBtb2R1bGUtZXhwb3J0ZWQgY29tcG9uZW50cyB0byBiZSByZWFjaGFibGUgZnJvbSB0aGVcbi8vIGVudHJ5IHBvaW50IHNvIGNvbnN1bWVycyBnZXQgdGhlaXIgdHlwZXM7IHRoZXNlIGFyZSB0aGUgZW1iZWRkYWJsZSBlbGVtZW50c1xuLy8gKGA8dmlzdWFsaXplcj5gLCBgPHJlZ2lvbi1lZGl0b3I+YCwgYDxoZXgtY29sb3ItcGlja2VyPmApLlxuZXhwb3J0IHsgVmlzdWFsaXplckNvbXBvbmVudCB9IGZyb20gJy4vbGliL3Zpc3VhbGl6ZXIuY29tcG9uZW50JztcbmV4cG9ydCB7IFJlZ2lvbkVkaXRvckNvbXBvbmVudCB9IGZyb20gJy4vbGliL3JlZ2lvbi1lZGl0b3IvcmVnaW9uLWVkaXRvci5jb21wb25lbnQnO1xuZXhwb3J0IHsgSGV4Q29sb3JQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuL2xpYi9oZXgtY29sb3ItcGlja2VyL2hleC1jb2xvci1waWNrZXIuY29tcG9uZW50JztcbmV4cG9ydCB7IENoYW5uZWxIaXN0b2dyYW1Db21wb25lbnQgfSBmcm9tICcuL2xpYi9jaGFubmVsLWhpc3RvZ3JhbS9jaGFubmVsLWhpc3RvZ3JhbS5jb21wb25lbnQnO1xuIl19
@@ -9,4 +9,4 @@ export const INSTANCE_SEGMENTER = new InjectionToken('INSTANCE_SEGMENTER', {
9
9
  providedIn: 'root',
10
10
  factory: () => inject(YoloSegmenterService),
11
11
  });
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFuY2Utc2VnbWVudGVyLmNvbnRyYWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jb250cmFjdHMvaW5zdGFuY2Utc2VnbWVudGVyLmNvbnRyYWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBK0h0Rjs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxjQUFjLENBQXFCLG9CQUFvQixFQUFFO0lBQzdGLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUM7Q0FDNUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4sIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBZb2xvU2VnbWVudGVyU2VydmljZSB9IGZyb20gJy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3lvbG8tc2VnbWVudGVyLnNlcnZpY2UnO1xuXG4vKipcbiAqIFBvcnQgZm9yIGFuIGF1dG9tYXRpYyAqKmluc3RhbmNlKiogc2VnbWVudGVyIOKAlCBvbmUgdGhhdCByZXR1cm5zIGRpc2NyZXRlLFxuICogY2xhc3NpZmllZCBvYmplY3RzIHJhdGhlciB0aGFuIGEgcGVyLXBpeGVsIGxhYmVsIG1hcC5cbiAqXG4gKiBUaGlzIGlzIGEgc2libGluZyBvZiB7QGxpbmsgSUNlbGxTZWdtZW50ZXJ9LCBub3QgYSByZXBsYWNlbWVudC4gQ2VsbHBvc2Utc3R5bGVcbiAqIHNlZ21lbnRlcnMgcHJvZHVjZSBvbmUgZXhjbHVzaXZlIGxhYmVsIHBlciBwaXhlbCwgd2hpY2ggaXMgZXhhY3RseSByaWdodCBmb3JcbiAqIGRlbnNlbHkgcGFja2VkIGNlbGxzOyBhIGRldGVjdG9yIGxpa2UgWU9MTyBwcm9kdWNlcyBvdmVybGFwcGluZyBpbnN0YW5jZXMsXG4gKiBlYWNoIHdpdGggaXRzIG93biBjbGFzcyBhbmQgY29uZmlkZW5jZSwgYW5kIGZsYXR0ZW5pbmcgdGhvc2UgaW50byBhIGxhYmVsIG1hcFxuICogd291bGQgc2lsZW50bHkgZGlzY2FyZCBib3RoIHRoZSBvdmVybGFwIGFuZCB0aGUgY2xhc3NpZmljYXRpb24uIFRoZSB0d29cbiAqIG91dHB1dHMgYXJlIGdlbnVpbmVseSBkaWZmZXJlbnQgc2hhcGVzLCBzbyB0aGV5IGdldCBkaWZmZXJlbnQgcG9ydHMuXG4gKlxuICogR2VvbWV0cnkgaXMgcmV0dXJuZWQgYXMgcG9seWdvbiByaW5ncyBpbiAqKmltYWdlIHBpeGVscyoqLCByZWFkeSB0byBiZWNvbWVcbiAqIHtAbGluayBSZWdpb259cyB3aXRob3V0IGEgc2Vjb25kIGNvbnZlcnNpb24gc3RlcC5cbiAqL1xuXG4vKiogQSBjbG9zZWQgcmluZzsgdGhlIGxhc3QgcG9pbnQgaXMgTk9UIGEgcmVwZWF0IG9mIHRoZSBmaXJzdC4gKi9cbmV4cG9ydCB0eXBlIEluc3RhbmNlUmluZyA9IEFycmF5PFtudW1iZXIsIG51bWJlcl0+O1xuXG4vKiogT25lIHBvbHlnb24gd2l0aCBvcHRpb25hbCBpbnRlcmlvciByaW5ncyAoZG9udXQgaG9sZXMpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0YW5jZVBvbHlnb24ge1xuICBleHRlcmlvcjogSW5zdGFuY2VSaW5nO1xuICBob2xlczogSW5zdGFuY2VSaW5nW107XG59XG5cbi8qKiBPbmUgZGV0ZWN0ZWQgb2JqZWN0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0YW5jZURldGVjdGlvbiB7XG4gIC8qKlxuICAgKiBPdXRsaW5lKHMpIG9mIHRoaXMgaW5zdGFuY2UuIFVzdWFsbHkgb25lLCBidXQgYSBtYXNrIHRoYXQgc3BsaXRzIHVuZGVyXG4gICAqIHRocmVzaG9sZGluZyB5aWVsZHMgc2V2ZXJhbCDigJQgdGhleSBhbGwgYmVsb25nIHRvIHRoZSBzYW1lIGRldGVjdGlvbi5cbiAgICovXG4gIHBvbHlnb25zOiBJbnN0YW5jZVBvbHlnb25bXTtcbiAgLyoqIGBbeDEsIHkxLCB4MiwgeTJdYCBpbiBpbWFnZSBwaXhlbHMuICovXG4gIGJveDogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gIC8qKiBNb2RlbCBjb25maWRlbmNlLCAwLi4xLiAqL1xuICBzY29yZTogbnVtYmVyO1xuICBjbGFzc0lkOiBudW1iZXI7XG4gIGNsYXNzTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEluc3RhbmNlU2VnbWVudGF0aW9uIHtcbiAgZGV0ZWN0aW9uczogSW5zdGFuY2VEZXRlY3Rpb25bXTtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIC8qKiBDbGFzcyBuYW1lcyBpbmRleGVkIGJ5IGNsYXNzIGlkLCBmcm9tIHRoZSBtb2RlbCdzIG93biBtZXRhZGF0YS4gKi9cbiAgY2xhc3NOYW1lczogc3RyaW5nW107XG59XG5cbi8qKlxuICogVHVuYWJsZXMgZm9yIG9uZSBydW4uXG4gKlxuICogVGhyZWUgc2VwYXJhdGUgdGhyZXNob2xkcyBhcmUgaW4gcGxheSBhbmQgdGhleSBhcmUgZWFzeSB0byBjb25mbGF0ZTpcbiAqIGBjb25maWRlbmNlYCBhbmQgYGlvdVRocmVzaG9sZGAgYWN0IHBlciB0aWxlLCB3aGlsZSBgbWVyZ2VUaHJlc2hvbGRgIGdvdmVybnNcbiAqIHRoZSBjcm9zcy10aWxlIHJlY29uY2lsaWF0aW9uLiBUaGV5IGNvbWUgZnJvbSBkaWZmZXJlbnQgc3RhZ2VzIG9mIHRoZVxuICogcGlwZWxpbmUgYW5kIGFyZSBub3QgaW50ZXJjaGFuZ2VhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RhbmNlU2VnbWVudE9wdGlvbnMge1xuICAvKiogV2hpY2ggcmVnaXN0ZXJlZCBtb2RlbCB0byBydW4uIERlZmF1bHRzIHRvIHRoZSByZWdpc3RyeSdzIGRlZmF1bHQuICovXG4gIG1vZGVsSWQ/OiBzdHJpbmc7XG4gIC8qKiBNaW5pbXVtIGRldGVjdGlvbiBjb25maWRlbmNlLCBwZXIgdGlsZS4gKi9cbiAgY29uZmlkZW5jZT86IG51bWJlcjtcbiAgLyoqIE5NUyBJb1Ugd2l0aGluIGEgc2luZ2xlIHRpbGUuICovXG4gIGlvdVRocmVzaG9sZD86IG51bWJlcjtcbiAgLyoqIEludGVyc2VjdGlvbi1vdmVyLXNtYWxsZXIgdGhyZXNob2xkIGZvciBtZXJnaW5nIGFjcm9zcyB0aWxlIHNlYW1zLiAqL1xuICBtZXJnZVRocmVzaG9sZD86IG51bWJlcjtcbiAgLyoqIFRpbGUgb3ZlcmxhcCwgcGVyY2VudC4gKi9cbiAgb3ZlcmxhcFg/OiBudW1iZXI7XG4gIG92ZXJsYXBZPzogbnVtYmVyO1xuICAvKiogUHJvYmFiaWxpdHkgYXQgd2hpY2ggYSBtYXNrIHBpeGVsIGNvdW50cyBhcyBpbnNpZGUuICovXG4gIG1hc2tUaHJlc2hvbGQ/OiBudW1iZXI7XG4gIC8qKiBDYXAgb24gZGV0ZWN0aW9ucyBwZXIgdGlsZS4gKi9cbiAgbWF4RGV0ZWN0aW9ucz86IG51bWJlcjtcbiAgLyoqIEtlZXAgb25seSB0aGVzZSBjbGFzcyBpZHM7IG9taXQgZm9yIGFsbCBjbGFzc2VzIHRoZSBtb2RlbCBkZWNsYXJlcy4gKi9cbiAgY2xhc3NGaWx0ZXI/OiBudW1iZXJbXTtcbiAgLyoqIERvdWdsYXMtUGV1Y2tlciB0b2xlcmFuY2UgaW4gcGl4ZWxzIGZvciBvdXRsaW5lIHNpbXBsaWZpY2F0aW9uOyAwIGRpc2FibGVzLiAqL1xuICBzaW1wbGlmeVRvbGVyYW5jZT86IG51bWJlcjtcbiAgLyoqIERyb3AgaW5zdGFuY2VzIHdob3NlIG91dGxpbmUgYXJlYSBpcyBiZWxvdyB0aGlzLCBpbiBzcXVhcmUgcGl4ZWxzLiAqL1xuICBtaW5BcmVhPzogbnVtYmVyO1xuICAvKipcbiAgICogU2V0IGZhbHNlIHRvIGRldGVjdCBib3hlcyB3aXRob3V0IGFzc2VtYmxpbmcgbWFza3Mg4oCUIHN1YnN0YW50aWFsbHkgZmFzdGVyLFxuICAgKiBzaW5jZSBtYXNrIGFzc2VtYmx5IGRvbWluYXRlcyB0aGUgY29zdCBvZiBhIHJ1bi4gRGV0ZWN0aW9ucyB0aGVuIGNhcnJ5IGFcbiAgICogYm94IGFuZCBjbGFzcyBidXQgbm8gb3V0bGluZSwgc28gbm90aGluZyBjYW4gYmUgY29tbWl0dGVkIGFzIGEgcmVnaW9uLlxuICAgKi9cbiAgd2l0aE1hc2tzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEFib3J0IGFuIGluLXByb2dyZXNzIHJ1bi5cbiAgICpcbiAgICogQ2FuY2VsbGF0aW9uIGlzIGNvb3BlcmF0aXZlIGFuZCBjaGVja2VkIGF0IHRpbGUgYm91bmRhcmllcywgc28gaXQgdGFrZXNcbiAgICogZWZmZWN0IHdpdGhpbiByb3VnaGx5IG9uZSB0aWxlIHJhdGhlciB0aGFuIGluc3RhbnRseSDigJQgYSBgc2Vzc2lvbi5ydW4oKWBcbiAgICogYWxyZWFkeSBpbiBmbGlnaHQgY2Fubm90IGJlIGludGVycnVwdGVkLlxuICAgKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKlxuICogUHJvZ3Jlc3Mvc3RhdHVzIGNhbGxiYWNrcyAoYWxsIG9wdGlvbmFsKS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgbWlycm9ycyB7QGxpbmsgQ2VsbFNlZ21lbnRQcm9ncmVzc30gaW4gc2hhcGUgcmF0aGVyIHRoYW4gaW1wb3J0aW5nXG4gKiBpdCDigJQgdGhlIHR3byBjb250cmFjdHMgc3RheSBpbmRlcGVuZGVudGx5IHZlcnNpb25hYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RhbmNlU2VnbWVudFByb2dyZXNzIHtcbiAgLyoqIE1vZGVsLWRvd25sb2FkIHByb2dyZXNzLCAwLi4xIChmaXJzdCBydW4gb25seSkuICovXG4gIG9uUHJvZ3Jlc3M/OiAoZnJhY3Rpb246IG51bWJlcikgPT4gdm9pZDtcbiAgLyoqXG4gICAqIFJhdyBkb3dubG9hZCBieXRlIGNvdW50cywgZm9yIGhvc3RzIHRoYXQgcmVuZGVyIGEgc2l6ZSAoXCIxNDIgLyAyODcgTUJcIilcbiAgICogcmF0aGVyIHRoYW4gYSBiYXJlIHBlcmNlbnRhZ2UuIGB0b3RhbGAgaXMgbnVsbCB3aGVuIHRoZSByZXNwb25zZSBjYXJyaWVkIG5vXG4gICAqIENvbnRlbnQtTGVuZ3RoLlxuICAgKlxuICAgKiBBIGZyYWN0aW9uIGFsb25lIGNhbm5vdCBiZSB0dXJuZWQgYmFjayBpbnRvIGJ5dGVzLCBzbyBhIGhvc3QgZ2l2ZW4gb25seVxuICAgKiB7QGxpbmsgb25Qcm9ncmVzc30gaGFzIHRvIGludmVudCB0aGUgbnVtYmVycyDigJQgd2hpY2ggcmVhZHMgYXMgXCIwIE1CIC8gMCBNQlwiXG4gICAqIHRoZSBtb21lbnQgaXQgZG9lcy5cbiAgICovXG4gIG9uQnl0ZXM/OiAobG9hZGVkOiBudW1iZXIsIHRvdGFsOiBudW1iZXIgfCBudWxsKSA9PiB2b2lkO1xuICAvKiogSHVtYW4tcmVhZGFibGUgcGhhc2UsIGUuZy4gJ1J1bm5pbmcgaW5mZXJlbmNlICh0aWxlIDMvOCnigKYnLiAqL1xuICBvblN0YXR1cz86IChzdGF0dXM6IHN0cmluZykgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJSW5zdGFuY2VTZWdtZW50ZXIge1xuICAvKiogRGV0ZWN0IGFuZCBvdXRsaW5lIGFsbCBpbnN0YW5jZXMgaW4gYW4gUkdCQSBpbWFnZS4gKi9cbiAgc2VnbWVudEluc3RhbmNlcyhcbiAgICBpbWFnZTogeyBkYXRhOiBVaW50OENsYW1wZWRBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSxcbiAgICBvcHRzPzogSW5zdGFuY2VTZWdtZW50T3B0aW9ucyxcbiAgICBwcm9ncmVzcz86IEluc3RhbmNlU2VnbWVudFByb2dyZXNzLFxuICApOiBQcm9taXNlPEluc3RhbmNlU2VnbWVudGF0aW9uPjtcbn1cblxuLyoqXG4gKiBESSB0b2tlbiBmb3IgdGhlIGF1dG9tYXRpYyBpbnN0YW5jZSBzZWdtZW50ZXIuIERlZmF1bHRzIHRvIHRoZSBpbi1saWJyYXJ5XG4gKiB7QGxpbmsgWW9sb1NlZ21lbnRlclNlcnZpY2V9ICh5b2xvLXNlZ2RldGVjdC1qcywgbGF6eS1sb2FkZWQpOyBvdmVycmlkZSBpdCBpblxuICogdGhlIGhvc3QgdG8gc3dhcCBpbXBsZW1lbnRhdGlvbnMg4oCUIGZvciBleGFtcGxlIHRvIGRlbGVnYXRlIHRvIHRoZSBzZXJ2ZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBJTlNUQU5DRV9TRUdNRU5URVIgPSBuZXcgSW5qZWN0aW9uVG9rZW48SUluc3RhbmNlU2VnbWVudGVyPignSU5TVEFOQ0VfU0VHTUVOVEVSJywge1xuICBwcm92aWRlZEluOiAncm9vdCcsXG4gIGZhY3Rvcnk6ICgpID0+IGluamVjdChZb2xvU2VnbWVudGVyU2VydmljZSksXG59KTtcbiJdfQ==
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFuY2Utc2VnbWVudGVyLmNvbnRyYWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jb250cmFjdHMvaW5zdGFuY2Utc2VnbWVudGVyLmNvbnRyYWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBMEl0Rjs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxjQUFjLENBQXFCLG9CQUFvQixFQUFFO0lBQzdGLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUM7Q0FDNUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4sIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBZb2xvU2VnbWVudGVyU2VydmljZSB9IGZyb20gJy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3lvbG8tc2VnbWVudGVyLnNlcnZpY2UnO1xuXG4vKipcbiAqIFBvcnQgZm9yIGFuIGF1dG9tYXRpYyAqKmluc3RhbmNlKiogc2VnbWVudGVyIOKAlCBvbmUgdGhhdCByZXR1cm5zIGRpc2NyZXRlLFxuICogY2xhc3NpZmllZCBvYmplY3RzIHJhdGhlciB0aGFuIGEgcGVyLXBpeGVsIGxhYmVsIG1hcC5cbiAqXG4gKiBUaGlzIGlzIGEgc2libGluZyBvZiB7QGxpbmsgSUNlbGxTZWdtZW50ZXJ9LCBub3QgYSByZXBsYWNlbWVudC4gQ2VsbHBvc2Utc3R5bGVcbiAqIHNlZ21lbnRlcnMgcHJvZHVjZSBvbmUgZXhjbHVzaXZlIGxhYmVsIHBlciBwaXhlbCwgd2hpY2ggaXMgZXhhY3RseSByaWdodCBmb3JcbiAqIGRlbnNlbHkgcGFja2VkIGNlbGxzOyBhIGRldGVjdG9yIGxpa2UgWU9MTyBwcm9kdWNlcyBvdmVybGFwcGluZyBpbnN0YW5jZXMsXG4gKiBlYWNoIHdpdGggaXRzIG93biBjbGFzcyBhbmQgY29uZmlkZW5jZSwgYW5kIGZsYXR0ZW5pbmcgdGhvc2UgaW50byBhIGxhYmVsIG1hcFxuICogd291bGQgc2lsZW50bHkgZGlzY2FyZCBib3RoIHRoZSBvdmVybGFwIGFuZCB0aGUgY2xhc3NpZmljYXRpb24uIFRoZSB0d29cbiAqIG91dHB1dHMgYXJlIGdlbnVpbmVseSBkaWZmZXJlbnQgc2hhcGVzLCBzbyB0aGV5IGdldCBkaWZmZXJlbnQgcG9ydHMuXG4gKlxuICogR2VvbWV0cnkgaXMgcmV0dXJuZWQgYXMgcG9seWdvbiByaW5ncyBpbiAqKmltYWdlIHBpeGVscyoqLCByZWFkeSB0byBiZWNvbWVcbiAqIHtAbGluayBSZWdpb259cyB3aXRob3V0IGEgc2Vjb25kIGNvbnZlcnNpb24gc3RlcC5cbiAqL1xuXG4vKiogQSBjbG9zZWQgcmluZzsgdGhlIGxhc3QgcG9pbnQgaXMgTk9UIGEgcmVwZWF0IG9mIHRoZSBmaXJzdC4gKi9cbmV4cG9ydCB0eXBlIEluc3RhbmNlUmluZyA9IEFycmF5PFtudW1iZXIsIG51bWJlcl0+O1xuXG4vKiogT25lIHBvbHlnb24gd2l0aCBvcHRpb25hbCBpbnRlcmlvciByaW5ncyAoZG9udXQgaG9sZXMpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0YW5jZVBvbHlnb24ge1xuICBleHRlcmlvcjogSW5zdGFuY2VSaW5nO1xuICBob2xlczogSW5zdGFuY2VSaW5nW107XG59XG5cbi8qKiBPbmUgZGV0ZWN0ZWQgb2JqZWN0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0YW5jZURldGVjdGlvbiB7XG4gIC8qKlxuICAgKiBPdXRsaW5lKHMpIG9mIHRoaXMgaW5zdGFuY2UuIFVzdWFsbHkgb25lLCBidXQgYSBtYXNrIHRoYXQgc3BsaXRzIHVuZGVyXG4gICAqIHRocmVzaG9sZGluZyB5aWVsZHMgc2V2ZXJhbCDigJQgdGhleSBhbGwgYmVsb25nIHRvIHRoZSBzYW1lIGRldGVjdGlvbi5cbiAgICovXG4gIHBvbHlnb25zOiBJbnN0YW5jZVBvbHlnb25bXTtcbiAgLyoqIGBbeDEsIHkxLCB4MiwgeTJdYCBpbiBpbWFnZSBwaXhlbHMuICovXG4gIGJveDogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gIC8qKiBNb2RlbCBjb25maWRlbmNlLCAwLi4xLiAqL1xuICBzY29yZTogbnVtYmVyO1xuICBjbGFzc0lkOiBudW1iZXI7XG4gIGNsYXNzTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEluc3RhbmNlU2VnbWVudGF0aW9uIHtcbiAgZGV0ZWN0aW9uczogSW5zdGFuY2VEZXRlY3Rpb25bXTtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIC8qKiBDbGFzcyBuYW1lcyBpbmRleGVkIGJ5IGNsYXNzIGlkLCBmcm9tIHRoZSBtb2RlbCdzIG93biBtZXRhZGF0YS4gKi9cbiAgY2xhc3NOYW1lczogc3RyaW5nW107XG59XG5cbi8qKlxuICogVHVuYWJsZXMgZm9yIG9uZSBydW4uXG4gKlxuICogVGhyZWUgc2VwYXJhdGUgdGhyZXNob2xkcyBhcmUgaW4gcGxheSBhbmQgdGhleSBhcmUgZWFzeSB0byBjb25mbGF0ZTpcbiAqIGBjb25maWRlbmNlYCBhbmQgYGlvdVRocmVzaG9sZGAgYWN0IHBlciB0aWxlLCB3aGlsZSBgbWVyZ2VUaHJlc2hvbGRgIGdvdmVybnNcbiAqIHRoZSBjcm9zcy10aWxlIHJlY29uY2lsaWF0aW9uLiBUaGV5IGNvbWUgZnJvbSBkaWZmZXJlbnQgc3RhZ2VzIG9mIHRoZVxuICogcGlwZWxpbmUgYW5kIGFyZSBub3QgaW50ZXJjaGFuZ2VhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RhbmNlU2VnbWVudE9wdGlvbnMge1xuICAvKiogV2hpY2ggcmVnaXN0ZXJlZCBtb2RlbCB0byBydW4uIERlZmF1bHRzIHRvIHRoZSByZWdpc3RyeSdzIGRlZmF1bHQuICovXG4gIG1vZGVsSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTY2FsZSB0byBydW4gYXQsIGFzIGEgZGl2aXNvciBvZiBmdWxsIHJlc29sdXRpb24g4oCUIHRoZSBzYW1lIG1lYW5pbmcgdGhlXG4gICAqIHNlcnZlciBnaXZlcyBpdC5cbiAgICpcbiAgICogVGhpcyBpcyB3aGF0IHB1dHMgb2JqZWN0cyBhdCB0aGUgc2l6ZSB0aGUgY2hlY2twb2ludCB3YXMgdHJhaW5lZCBvbiwgYW5kIGl0XG4gICAqIG1hdHRlcnMgbW9yZSB0aGFuIGFueSB0aHJlc2hvbGQ6IHJ1biBhIGRldGVjdG9yIGF0IHRoZSB3cm9uZyBvYmplY3Qgc2NhbGVcbiAgICogYW5kIGl0IGZpbmRzIG5vdGhpbmcuIEEgY2FsbGVyIHRoYXQgY2FuIHJlLWNyb3AgdGhlIHNvdXJjZSAoYSB0aWxlLWJhY2tlZFxuICAgKiB2aWV3ZXIpIHNob3VsZCBob25vdXIgaXQgcmF0aGVyIHRoYW4gYWNjZXB0aW5nIHdoYXRldmVyIHRoZSBkaXNwbGF5IGhhcHBlbnNcbiAgICogdG8gc2hvdy5cbiAgICovXG4gIGRvd25zYW1wbGluZ0ZhY3Rvcj86IG51bWJlcjtcbiAgLyoqIE1pbmltdW0gZGV0ZWN0aW9uIGNvbmZpZGVuY2UsIHBlciB0aWxlLiAqL1xuICBjb25maWRlbmNlPzogbnVtYmVyO1xuICAvKiogTk1TIElvVSB3aXRoaW4gYSBzaW5nbGUgdGlsZS4gKi9cbiAgaW91VGhyZXNob2xkPzogbnVtYmVyO1xuICAvKiogSW50ZXJzZWN0aW9uLW92ZXItc21hbGxlciB0aHJlc2hvbGQgZm9yIG1lcmdpbmcgYWNyb3NzIHRpbGUgc2VhbXMuICovXG4gIG1lcmdlVGhyZXNob2xkPzogbnVtYmVyO1xuICAvKiogVGlsZSBvdmVybGFwLCBwZXJjZW50LiAqL1xuICBvdmVybGFwWD86IG51bWJlcjtcbiAgb3ZlcmxhcFk/OiBudW1iZXI7XG4gIC8qKiBQcm9iYWJpbGl0eSBhdCB3aGljaCBhIG1hc2sgcGl4ZWwgY291bnRzIGFzIGluc2lkZS4gKi9cbiAgbWFza1RocmVzaG9sZD86IG51bWJlcjtcbiAgLyoqIENhcCBvbiBkZXRlY3Rpb25zIHBlciB0aWxlLiAqL1xuICBtYXhEZXRlY3Rpb25zPzogbnVtYmVyO1xuICAvKiogS2VlcCBvbmx5IHRoZXNlIGNsYXNzIGlkczsgb21pdCBmb3IgYWxsIGNsYXNzZXMgdGhlIG1vZGVsIGRlY2xhcmVzLiAqL1xuICBjbGFzc0ZpbHRlcj86IG51bWJlcltdO1xuICAvKiogRG91Z2xhcy1QZXVja2VyIHRvbGVyYW5jZSBpbiBwaXhlbHMgZm9yIG91dGxpbmUgc2ltcGxpZmljYXRpb247IDAgZGlzYWJsZXMuICovXG4gIHNpbXBsaWZ5VG9sZXJhbmNlPzogbnVtYmVyO1xuICAvKiogRHJvcCBpbnN0YW5jZXMgd2hvc2Ugb3V0bGluZSBhcmVhIGlzIGJlbG93IHRoaXMsIGluIHNxdWFyZSBwaXhlbHMuICovXG4gIG1pbkFyZWE/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBTZXQgZmFsc2UgdG8gZGV0ZWN0IGJveGVzIHdpdGhvdXQgYXNzZW1ibGluZyBtYXNrcyDigJQgc3Vic3RhbnRpYWxseSBmYXN0ZXIsXG4gICAqIHNpbmNlIG1hc2sgYXNzZW1ibHkgZG9taW5hdGVzIHRoZSBjb3N0IG9mIGEgcnVuLiBEZXRlY3Rpb25zIHRoZW4gY2FycnkgYVxuICAgKiBib3ggYW5kIGNsYXNzIGJ1dCBubyBvdXRsaW5lLCBzbyBub3RoaW5nIGNhbiBiZSBjb21taXR0ZWQgYXMgYSByZWdpb24uXG4gICAqL1xuICB3aXRoTWFza3M/OiBib29sZWFuO1xuICAvKipcbiAgICogQWJvcnQgYW4gaW4tcHJvZ3Jlc3MgcnVuLlxuICAgKlxuICAgKiBDYW5jZWxsYXRpb24gaXMgY29vcGVyYXRpdmUgYW5kIGNoZWNrZWQgYXQgdGlsZSBib3VuZGFyaWVzLCBzbyBpdCB0YWtlc1xuICAgKiBlZmZlY3Qgd2l0aGluIHJvdWdobHkgb25lIHRpbGUgcmF0aGVyIHRoYW4gaW5zdGFudGx5IOKAlCBhIGBzZXNzaW9uLnJ1bigpYFxuICAgKiBhbHJlYWR5IGluIGZsaWdodCBjYW5ub3QgYmUgaW50ZXJydXB0ZWQuXG4gICAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqXG4gKiBQcm9ncmVzcy9zdGF0dXMgY2FsbGJhY2tzIChhbGwgb3B0aW9uYWwpLlxuICpcbiAqIERlbGliZXJhdGVseSBtaXJyb3JzIHtAbGluayBDZWxsU2VnbWVudFByb2dyZXNzfSBpbiBzaGFwZSByYXRoZXIgdGhhbiBpbXBvcnRpbmdcbiAqIGl0IOKAlCB0aGUgdHdvIGNvbnRyYWN0cyBzdGF5IGluZGVwZW5kZW50bHkgdmVyc2lvbmFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGFuY2VTZWdtZW50UHJvZ3Jlc3Mge1xuICAvKiogTW9kZWwtZG93bmxvYWQgcHJvZ3Jlc3MsIDAuLjEgKGZpcnN0IHJ1biBvbmx5KS4gKi9cbiAgb25Qcm9ncmVzcz86IChmcmFjdGlvbjogbnVtYmVyKSA9PiB2b2lkO1xuICAvKipcbiAgICogUmF3IGRvd25sb2FkIGJ5dGUgY291bnRzLCBmb3IgaG9zdHMgdGhhdCByZW5kZXIgYSBzaXplIChcIjE0MiAvIDI4NyBNQlwiKVxuICAgKiByYXRoZXIgdGhhbiBhIGJhcmUgcGVyY2VudGFnZS4gYHRvdGFsYCBpcyBudWxsIHdoZW4gdGhlIHJlc3BvbnNlIGNhcnJpZWQgbm9cbiAgICogQ29udGVudC1MZW5ndGguXG4gICAqXG4gICAqIEEgZnJhY3Rpb24gYWxvbmUgY2Fubm90IGJlIHR1cm5lZCBiYWNrIGludG8gYnl0ZXMsIHNvIGEgaG9zdCBnaXZlbiBvbmx5XG4gICAqIHtAbGluayBvblByb2dyZXNzfSBoYXMgdG8gaW52ZW50IHRoZSBudW1iZXJzIOKAlCB3aGljaCByZWFkcyBhcyBcIjAgTUIgLyAwIE1CXCJcbiAgICogdGhlIG1vbWVudCBpdCBkb2VzLlxuICAgKi9cbiAgb25CeXRlcz86IChsb2FkZWQ6IG51bWJlciwgdG90YWw6IG51bWJlciB8IG51bGwpID0+IHZvaWQ7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBwaGFzZSwgZS5nLiAnUnVubmluZyBpbmZlcmVuY2UgKHRpbGUgMy84KeKApicuICovXG4gIG9uU3RhdHVzPzogKHN0YXR1czogc3RyaW5nKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElJbnN0YW5jZVNlZ21lbnRlciB7XG4gIC8qKiBEZXRlY3QgYW5kIG91dGxpbmUgYWxsIGluc3RhbmNlcyBpbiBhbiBSR0JBIGltYWdlLiAqL1xuICBzZWdtZW50SW5zdGFuY2VzKFxuICAgIGltYWdlOiB7IGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9LFxuICAgIG9wdHM/OiBJbnN0YW5jZVNlZ21lbnRPcHRpb25zLFxuICAgIHByb2dyZXNzPzogSW5zdGFuY2VTZWdtZW50UHJvZ3Jlc3MsXG4gICk6IFByb21pc2U8SW5zdGFuY2VTZWdtZW50YXRpb24+O1xufVxuXG4vKipcbiAqIERJIHRva2VuIGZvciB0aGUgYXV0b21hdGljIGluc3RhbmNlIHNlZ21lbnRlci4gRGVmYXVsdHMgdG8gdGhlIGluLWxpYnJhcnlcbiAqIHtAbGluayBZb2xvU2VnbWVudGVyU2VydmljZX0gKHlvbG8tc2VnZGV0ZWN0LWpzLCBsYXp5LWxvYWRlZCk7IG92ZXJyaWRlIGl0IGluXG4gKiB0aGUgaG9zdCB0byBzd2FwIGltcGxlbWVudGF0aW9ucyDigJQgZm9yIGV4YW1wbGUgdG8gZGVsZWdhdGUgdG8gdGhlIHNlcnZlci5cbiAqL1xuZXhwb3J0IGNvbnN0IElOU1RBTkNFX1NFR01FTlRFUiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxJSW5zdGFuY2VTZWdtZW50ZXI+KCdJTlNUQU5DRV9TRUdNRU5URVInLCB7XG4gIHByb3ZpZGVkSW46ICdyb290JyxcbiAgZmFjdG9yeTogKCkgPT4gaW5qZWN0KFlvbG9TZWdtZW50ZXJTZXJ2aWNlKSxcbn0pO1xuIl19
@@ -0,0 +1,180 @@
1
+ import { Inject, Injectable, Optional } from '@angular/core';
2
+ import { BehaviorSubject, firstValueFrom } from 'rxjs';
3
+ import { Region, Polygon } from '../../models/region';
4
+ import { TILE_ACCESS_PORT } from '../../contracts/ports/tile-access.port';
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ * YOLO object detection over the current view.
8
+ *
9
+ * The complement to {@link CellSegmentToolService}: cellpose auto-segments cells
10
+ * inside a box you draw, whereas a detector is meant to find objects across a
11
+ * field. So this takes no prompt — it runs on whatever is on screen and turns
12
+ * every detection into a region.
13
+ *
14
+ * Detections come back in the displayed image's pixels; they are mapped onto
15
+ * the full-resolution image through the viewer's own source rect, so the regions
16
+ * land where the objects actually are rather than at view-local coordinates.
17
+ *
18
+ * Exposes the same `status$` / `busy$` / `progress$` surface as the cellpose
19
+ * tool so the host's shared segmentation toast drives it unchanged.
20
+ */
21
+ export class YoloDetectToolService {
22
+ constructor(
23
+ /** Server-side crop, so detection can run at the model's scale rather than
24
+ * the viewer's. Optional: without it the tool falls back to the displayed
25
+ * pixels, which is correct but scale-dependent. */
26
+ tileAccess = null) {
27
+ this.tileAccess = tileAccess;
28
+ this.status$ = new BehaviorSubject('');
29
+ this.busy$ = new BehaviorSubject(false);
30
+ this.progress$ = new BehaviorSubject(-1);
31
+ }
32
+ /**
33
+ * Detect in the current view and append the results as regions.
34
+ *
35
+ * @returns the number of regions added.
36
+ */
37
+ async detectInView(viz, segmenter, opts = {}) {
38
+ const pixels = viz.getDisplayedPixelData?.();
39
+ if (!pixels || pixels.width === 0 || pixels.height === 0) {
40
+ this.status$.next('No image on screen to detect in.');
41
+ return 0;
42
+ }
43
+ this.busy$.next(true);
44
+ this.progress$.next(-1);
45
+ try {
46
+ const rect = viz.getDisplayedSourceRect?.() ?? null;
47
+ const target = Number(opts.downsamplingFactor ?? 0) || 0;
48
+ const viewFactor = rect && pixels.width > 0 ? rect.width / pixels.width : 1;
49
+ // Re-crop at the model's scale when the view is coarser than it wants.
50
+ // The image is tile-backed, so that detail exists server-side even though
51
+ // the displayed pixels have discarded it.
52
+ let source = { data: pixels.data, width: pixels.width, height: pixels.height };
53
+ if (rect && target > 0 && target < viewFactor * 0.98) {
54
+ this.status$.next('Fetching image at model resolution…');
55
+ const hi = await this.fetchCropAtScale(rect, target);
56
+ if (hi)
57
+ source = hi;
58
+ }
59
+ const result = await segmenter.segmentInstances(source, opts, {
60
+ onProgress: (f) => this.progress$.next(f),
61
+ onStatus: (s) => this.status$.next(s),
62
+ });
63
+ // View pixels -> full-resolution image pixels. Without this every region
64
+ // would sit at view-local coordinates, i.e. the wrong place on the slide
65
+ // for any zoomed or panned view.
66
+ const offsetX = rect ? rect.x : 0;
67
+ const offsetY = rect ? rect.y : 0;
68
+ // Against the pixels actually inferred on, which may be the re-crop.
69
+ const ratioX = rect && source.width > 0 ? rect.width / source.width : 1;
70
+ const ratioY = rect && source.height > 0 ? rect.height / source.height : 1;
71
+ const added = [];
72
+ for (const det of result.detections) {
73
+ if (det.polygons.length > 0) {
74
+ for (const poly of det.polygons) {
75
+ if (poly.exterior.length < 3)
76
+ continue;
77
+ added.push(this.makeRegion(poly.exterior.map(([x]) => Math.round(offsetX + x * ratioX)), poly.exterior.map(([, y]) => Math.round(offsetY + y * ratioY)), det.className));
78
+ }
79
+ continue;
80
+ }
81
+ // Detection mode yields no outline; the box is still the result, and
82
+ // matches what the server writes as a "detection" feature.
83
+ const [x1, y1, x2, y2] = det.box;
84
+ if (x2 - x1 <= 0 || y2 - y1 <= 0)
85
+ continue;
86
+ added.push(this.makeRegion([x1, x2, x2, x1].map((x) => Math.round(offsetX + x * ratioX)), [y1, y1, y2, y2].map((y) => Math.round(offsetY + y * ratioY)), det.className));
87
+ }
88
+ if (added.length === 0) {
89
+ this.status$.next('No objects detected.');
90
+ return 0;
91
+ }
92
+ // Append. A detection run must not discard annotations drawn by hand or
93
+ // produced by another tool.
94
+ viz.setRegions([...(viz.getRegions() ?? []), ...added]);
95
+ this.status$.next(`Added ${added.length} region(s).`);
96
+ return added.length;
97
+ }
98
+ catch (err) {
99
+ this.status$.next(err instanceof Error ? err.message : 'YOLO detection failed.');
100
+ return 0;
101
+ }
102
+ finally {
103
+ this.busy$.next(false);
104
+ this.progress$.next(-1);
105
+ }
106
+ }
107
+ /**
108
+ * Re-crop `rect` at `1/target` of full resolution. Returns null on any
109
+ * failure, so the caller falls back to the displayed pixels — a coarser crop
110
+ * beats a failed run.
111
+ */
112
+ async fetchCropAtScale(rect, target) {
113
+ if (!this.tileAccess)
114
+ return null;
115
+ let w = Math.round(rect.width / target);
116
+ let h = Math.round(rect.height / target);
117
+ // A factor of 1 over a whole-slide ROI would ask for hundreds of megapixels.
118
+ const MAX_PIXELS = 16_777_216; // 4096²
119
+ const pixels = w * h;
120
+ if (pixels > MAX_PIXELS) {
121
+ const k = Math.sqrt(MAX_PIXELS / pixels);
122
+ w = Math.round(w * k);
123
+ h = Math.round(h * k);
124
+ }
125
+ if (w < 64 || h < 64)
126
+ return null;
127
+ try {
128
+ const roi = {
129
+ x: Math.round(rect.x),
130
+ y: Math.round(rect.y),
131
+ width: Math.round(rect.width),
132
+ height: Math.round(rect.height),
133
+ };
134
+ const screen = { x: 0, y: 0, width: w, height: h };
135
+ const bytes = await firstValueFrom(this.tileAccess.zoomOnRegion(roi, screen, 0));
136
+ if (!bytes || bytes.byteLength === 0)
137
+ return null;
138
+ const bitmap = await createImageBitmap(new Blob([bytes]));
139
+ const canvas = document.createElement('canvas');
140
+ canvas.width = bitmap.width;
141
+ canvas.height = bitmap.height;
142
+ const ctx = canvas.getContext('2d');
143
+ if (!ctx)
144
+ return null;
145
+ ctx.drawImage(bitmap, 0, 0);
146
+ const out = ctx.getImageData(0, 0, bitmap.width, bitmap.height);
147
+ bitmap.close?.();
148
+ return { data: out.data, width: bitmap.width, height: bitmap.height };
149
+ }
150
+ catch {
151
+ return null;
152
+ }
153
+ }
154
+ makeRegion(xs, ys, className) {
155
+ const poly = new Polygon();
156
+ poly.npoints = xs.length;
157
+ poly.xpoints = xs;
158
+ poly.ypoints = ys;
159
+ poly.coordinates = xs.map((x, i) => [x, ys[i]]);
160
+ poly.closed = true;
161
+ const region = new Region();
162
+ region.bounds = poly;
163
+ // The class name drives preset colour resolution; leaving `color` unset lets
164
+ // an existing preset for this class win.
165
+ region.label = className;
166
+ return region;
167
+ }
168
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: YoloDetectToolService, deps: [{ token: TILE_ACCESS_PORT, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
169
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: YoloDetectToolService, providedIn: 'root' }); }
170
+ }
171
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: YoloDetectToolService, decorators: [{
172
+ type: Injectable,
173
+ args: [{ providedIn: 'root' }]
174
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
175
+ type: Optional
176
+ }, {
177
+ type: Inject,
178
+ args: [TILE_ACCESS_PORT]
179
+ }] }] });
180
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieW9sby1kZXRlY3QtdG9vbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90b29sYmFyL3NlZ21lbnRhdGlvbi95b2xvLWRldGVjdC10b29sLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXZELE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFhLE1BQU0scUJBQXFCLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUF1QixNQUFNLHdDQUF3QyxDQUFDOztBQUkvRjs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE1BQU0sT0FBTyxxQkFBcUI7SUFLaEM7SUFDRTs7d0RBRW9EO0lBQ04sYUFBb0MsSUFBSTtRQUF4QyxlQUFVLEdBQVYsVUFBVSxDQUE4QjtRQVIvRSxZQUFPLEdBQUcsSUFBSSxlQUFlLENBQVMsRUFBRSxDQUFDLENBQUM7UUFDMUMsVUFBSyxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQzVDLGNBQVMsR0FBRyxJQUFJLGVBQWUsQ0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBT2xELENBQUM7SUFFSjs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLFlBQVksQ0FDaEIsR0FBZ0IsRUFDaEIsU0FBNkIsRUFDN0IsT0FBK0IsRUFBRTtRQUVqQyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMscUJBQXFCLEVBQUUsRUFBRSxDQUFDO1FBQzdDLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6RCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FB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WSxFQUFFLFNBQWlCO1FBQzlELE1BQU0sSUFBSSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFFbkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUM1QixNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNyQiw2RUFBNkU7UUFDN0UseUNBQXlDO1FBQ3pDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO1FBQ3pCLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7OEdBektVLHFCQUFxQixrQkFTVixnQkFBZ0I7a0hBVDNCLHFCQUFxQixjQURSLE1BQU07OzJGQUNuQixxQkFBcUI7a0JBRGpDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkFVN0IsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFJlZ2lvbiwgUG9seWdvbiwgUmVjdGFuZ2xlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3JlZ2lvbic7XG5pbXBvcnQgeyBUSUxFX0FDQ0VTU19QT1JULCB0eXBlIFRpbGVBY2Nlc3NQb3J0IH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3BvcnRzL3RpbGUtYWNjZXNzLnBvcnQnO1xuaW1wb3J0IHR5cGUgeyBJVmlzdWFsaXplciB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB0eXBlIHsgSUluc3RhbmNlU2VnbWVudGVyLCBJbnN0YW5jZVNlZ21lbnRPcHRpb25zIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2luc3RhbmNlLXNlZ21lbnRlci5jb250cmFjdCc7XG5cbi8qKlxuICogWU9MTyBvYmplY3QgZGV0ZWN0aW9uIG92ZXIgdGhlIGN1cnJlbnQgdmlldy5cbiAqXG4gKiBUaGUgY29tcGxlbWVudCB0byB7QGxpbmsgQ2VsbFNlZ21lbnRUb29sU2VydmljZX06IGNlbGxwb3NlIGF1dG8tc2VnbWVudHMgY2VsbHNcbiAqIGluc2lkZSBhIGJveCB5b3UgZHJhdywgd2hlcmVhcyBhIGRldGVjdG9yIGlzIG1lYW50IHRvIGZpbmQgb2JqZWN0cyBhY3Jvc3MgYVxuICogZmllbGQuIFNvIHRoaXMgdGFrZXMgbm8gcHJvbXB0IOKAlCBpdCBydW5zIG9uIHdoYXRldmVyIGlzIG9uIHNjcmVlbiBhbmQgdHVybnNcbiAqIGV2ZXJ5IGRldGVjdGlvbiBpbnRvIGEgcmVnaW9uLlxuICpcbiAqIERldGVjdGlvbnMgY29tZSBiYWNrIGluIHRoZSBkaXNwbGF5ZWQgaW1hZ2UncyBwaXhlbHM7IHRoZXkgYXJlIG1hcHBlZCBvbnRvXG4gKiB0aGUgZnVsbC1yZXNvbHV0aW9uIGltYWdlIHRocm91Z2ggdGhlIHZpZXdlcidzIG93biBzb3VyY2UgcmVjdCwgc28gdGhlIHJlZ2lvbnNcbiAqIGxhbmQgd2hlcmUgdGhlIG9iamVjdHMgYWN0dWFsbHkgYXJlIHJhdGhlciB0aGFuIGF0IHZpZXctbG9jYWwgY29vcmRpbmF0ZXMuXG4gKlxuICogRXhwb3NlcyB0aGUgc2FtZSBgc3RhdHVzJGAgLyBgYnVzeSRgIC8gYHByb2dyZXNzJGAgc3VyZmFjZSBhcyB0aGUgY2VsbHBvc2VcbiAqIHRvb2wgc28gdGhlIGhvc3QncyBzaGFyZWQgc2VnbWVudGF0aW9uIHRvYXN0IGRyaXZlcyBpdCB1bmNoYW5nZWQuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgWW9sb0RldGVjdFRvb2xTZXJ2aWNlIHtcbiAgcmVhZG9ubHkgc3RhdHVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJyk7XG4gIHJlYWRvbmx5IGJ1c3kkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IHByb2dyZXNzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigtMSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgLyoqIFNlcnZlci1zaWRlIGNyb3AsIHNvIGRldGVjdGlvbiBjYW4gcnVuIGF0IHRoZSBtb2RlbCdzIHNjYWxlIHJhdGhlciB0aGFuXG4gICAgICogIHRoZSB2aWV3ZXIncy4gT3B0aW9uYWw6IHdpdGhvdXQgaXQgdGhlIHRvb2wgZmFsbHMgYmFjayB0byB0aGUgZGlzcGxheWVkXG4gICAgICogIHBpeGVscywgd2hpY2ggaXMgY29ycmVjdCBidXQgc2NhbGUtZGVwZW5kZW50LiAqL1xuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoVElMRV9BQ0NFU1NfUE9SVCkgcHJpdmF0ZSB0aWxlQWNjZXNzOiBUaWxlQWNjZXNzUG9ydCB8IG51bGwgPSBudWxsLFxuICApIHt9XG5cbiAgLyoqXG4gICAqIERldGVjdCBpbiB0aGUgY3VycmVudCB2aWV3IGFuZCBhcHBlbmQgdGhlIHJlc3VsdHMgYXMgcmVnaW9ucy5cbiAgICpcbiAgICogQHJldHVybnMgdGhlIG51bWJlciBvZiByZWdpb25zIGFkZGVkLlxuICAgKi9cbiAgYXN5bmMgZGV0ZWN0SW5WaWV3KFxuICAgIHZpejogSVZpc3VhbGl6ZXIsXG4gICAgc2VnbWVudGVyOiBJSW5zdGFuY2VTZWdtZW50ZXIsXG4gICAgb3B0czogSW5zdGFuY2VTZWdtZW50T3B0aW9ucyA9IHt9LFxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHBpeGVscyA9IHZpei5nZXREaXNwbGF5ZWRQaXhlbERhdGE/LigpO1xuICAgIGlmICghcGl4ZWxzIHx8IHBpeGVscy53aWR0aCA9PT0gMCB8fCBwaXhlbHMuaGVpZ2h0ID09PSAwKSB7XG4gICAgICB0aGlzLnN0YXR1cyQubmV4dCgnTm8gaW1hZ2Ugb24gc2NyZWVuIHRvIGRldGVjdCBpbi4nKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHRoaXMuYnVzeSQubmV4dCh0cnVlKTtcbiAgICB0aGlzLnByb2dyZXNzJC5uZXh0KC0xKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVjdCA9IHZpei5nZXREaXNwbGF5ZWRTb3VyY2VSZWN0Py4oKSA/PyBudWxsO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gTnVtYmVyKG9wdHMuZG93bnNhbXBsaW5nRmFjdG9yID8/IDApIHx8IDA7XG4gICAgICBjb25zdCB2aWV3RmFjdG9yID0gcmVjdCAmJiBwaXhlbHMud2lkdGggPiAwID8gcmVjdC53aWR0aCAvIHBpeGVscy53aWR0aCA6IDE7XG5cbiAgICAgIC8vIFJlLWNyb3AgYXQgdGhlIG1vZGVsJ3Mgc2NhbGUgd2hlbiB0aGUgdmlldyBpcyBjb2Fyc2VyIHRoYW4gaXQgd2FudHMuXG4gICAgICAvLyBUaGUgaW1hZ2UgaXMgdGlsZS1iYWNrZWQsIHNvIHRoYXQgZGV0YWlsIGV4aXN0cyBzZXJ2ZXItc2lkZSBldmVuIHRob3VnaFxuICAgICAgLy8gdGhlIGRpc3BsYXllZCBwaXhlbHMgaGF2ZSBkaXNjYXJkZWQgaXQuXG4gICAgICBsZXQgc291cmNlID0geyBkYXRhOiBwaXhlbHMuZGF0YSwgd2lkdGg6IHBpeGVscy53aWR0aCwgaGVpZ2h0OiBwaXhlbHMuaGVpZ2h0IH07XG4gICAgICBpZiAocmVjdCAmJiB0YXJnZXQgPiAwICYmIHRhcmdldCA8IHZpZXdGYWN0b3IgKiAwLjk4KSB7XG4gICAgICAgIHRoaXMuc3RhdHVzJC5uZXh0KCdGZXRjaGluZyBpbWFnZSBhdCBtb2RlbCByZXNvbHV0aW9u4oCmJyk7XG4gICAgICAgIGNvbnN0IGhpID0gYXdhaXQgdGhpcy5mZXRjaENyb3BBdFNjYWxlKHJlY3QsIHRhcmdldCk7XG4gICAgICAgIGlmIChoaSkgc291cmNlID0gaGk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlZ21lbnRlci5zZWdtZW50SW5zdGFuY2VzKHNvdXJjZSwgb3B0cywge1xuICAgICAgICBvblByb2dyZXNzOiAoZikgPT4gdGhpcy5wcm9ncmVzcyQubmV4dChmKSxcbiAgICAgICAgb25TdGF0dXM6IChzKSA9PiB0aGlzLnN0YXR1cyQubmV4dChzKSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBWaWV3IHBpeGVscyAtPiBmdWxsLXJlc29sdXRpb24gaW1hZ2UgcGl4ZWxzLiBXaXRob3V0IHRoaXMgZXZlcnkgcmVnaW9uXG4gICAgICAvLyB3b3VsZCBzaXQgYXQgdmlldy1sb2NhbCBjb29yZGluYXRlcywgaS5lLiB0aGUgd3JvbmcgcGxhY2Ugb24gdGhlIHNsaWRlXG4gICAgICAvLyBmb3IgYW55IHpvb21lZCBvciBwYW5uZWQgdmlldy5cbiAgICAgIGNvbnN0IG9mZnNldFggPSByZWN0ID8gcmVjdC54IDogMDtcbiAgICAgIGNvbnN0IG9mZnNldFkgPSByZWN0ID8gcmVjdC55IDogMDtcbiAgICAgIC8vIEFnYWluc3QgdGhlIHBpeGVscyBhY3R1YWxseSBpbmZlcnJlZCBvbiwgd2hpY2ggbWF5IGJlIHRoZSByZS1jcm9wLlxuICAgICAgY29uc3QgcmF0aW9YID0gcmVjdCAmJiBzb3VyY2Uud2lkdGggPiAwID8gcmVjdC53aWR0aCAvIHNvdXJjZS53aWR0aCA6IDE7XG4gICAgICBjb25zdCByYXRpb1kgPSByZWN0ICYmIHNvdXJjZS5oZWlnaHQgPiAwID8gcmVjdC5oZWlnaHQgLyBzb3VyY2UuaGVpZ2h0IDogMTtcblxuICAgICAgY29uc3QgYWRkZWQ6IFJlZ2lvbltdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGRldCBvZiByZXN1bHQuZGV0ZWN0aW9ucykge1xuICAgICAgICBpZiAoZGV0LnBvbHlnb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHBvbHkgb2YgZGV0LnBvbHlnb25zKSB7XG4gICAgICAgICAgICBpZiAocG9seS5leHRlcmlvci5sZW5ndGggPCAzKSBjb250aW51ZTtcbiAgICAgICAgICAgIGFkZGVkLnB1c2goXG4gICAgICAgICAgICAgIHRoaXMubWFrZVJlZ2lvbihcbiAgICAgICAgICAgICAgICBwb2x5LmV4dGVyaW9yLm1hcCgoW3hdKSA9PiBNYXRoLnJvdW5kKG9mZnNldFggKyB4ICogcmF0aW9YKSksXG4gICAgICAgICAgICAgICAgcG9seS5leHRlcmlvci5tYXAoKFssIHldKSA9PiBNYXRoLnJvdW5kKG9mZnNldFkgKyB5ICogcmF0aW9ZKSksXG4gICAgICAgICAgICAgICAgZGV0LmNsYXNzTmFtZSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIERldGVjdGlvbiBtb2RlIHlpZWxkcyBubyBvdXRsaW5lOyB0aGUgYm94IGlzIHN0aWxsIHRoZSByZXN1bHQsIGFuZFxuICAgICAgICAvLyBtYXRjaGVzIHdoYXQgdGhlIHNlcnZlciB3cml0ZXMgYXMgYSBcImRldGVjdGlvblwiIGZlYXR1cmUuXG4gICAgICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBkZXQuYm94O1xuICAgICAgICBpZiAoeDIgLSB4MSA8PSAwIHx8IHkyIC0geTEgPD0gMCkgY29udGludWU7XG4gICAgICAgIGFkZGVkLnB1c2goXG4gICAgICAgICAgdGhpcy5tYWtlUmVnaW9uKFxuICAgICAgICAgICAgW3gxLCB4MiwgeDIsIHgxXS5tYXAoKHgpID0+IE1hdGgucm91bmQob2Zmc2V0WCArIHggKiByYXRpb1gpKSxcbiAgICAgICAgICAgIFt5MSwgeTEsIHkyLCB5Ml0ubWFwKCh5KSA9PiBNYXRoLnJvdW5kKG9mZnNldFkgKyB5ICogcmF0aW9ZKSksXG4gICAgICAgICAgICBkZXQuY2xhc3NOYW1lLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhZGRlZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5zdGF0dXMkLm5leHQoJ05vIG9iamVjdHMgZGV0ZWN0ZWQuJyk7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBlbmQuIEEgZGV0ZWN0aW9uIHJ1biBtdXN0IG5vdCBkaXNjYXJkIGFubm90YXRpb25zIGRyYXduIGJ5IGhhbmQgb3JcbiAgICAgIC8vIHByb2R1Y2VkIGJ5IGFub3RoZXIgdG9vbC5cbiAgICAgIHZpei5zZXRSZWdpb25zKFsuLi4odml6LmdldFJlZ2lvbnMoKSA/PyBbXSksIC4uLmFkZGVkXSk7XG4gICAgICB0aGlzLnN0YXR1cyQubmV4dChgQWRkZWQgJHthZGRlZC5sZW5ndGh9IHJlZ2lvbihzKS5gKTtcbiAgICAgIHJldHVybiBhZGRlZC5sZW5ndGg7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLnN0YXR1cyQubmV4dChlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ1lPTE8gZGV0ZWN0aW9uIGZhaWxlZC4nKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmJ1c3kkLm5leHQoZmFsc2UpO1xuICAgICAgdGhpcy5wcm9ncmVzcyQubmV4dCgtMSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlLWNyb3AgYHJlY3RgIGF0IGAxL3RhcmdldGAgb2YgZnVsbCByZXNvbHV0aW9uLiBSZXR1cm5zIG51bGwgb24gYW55XG4gICAqIGZhaWx1cmUsIHNvIHRoZSBjYWxsZXIgZmFsbHMgYmFjayB0byB0aGUgZGlzcGxheWVkIHBpeGVscyDigJQgYSBjb2Fyc2VyIGNyb3BcbiAgICogYmVhdHMgYSBmYWlsZWQgcnVuLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaENyb3BBdFNjYWxlKFxuICAgIHJlY3Q6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0sXG4gICAgdGFyZ2V0OiBudW1iZXIsXG4gICk6IFByb21pc2U8eyBkYXRhOiBVaW50OENsYW1wZWRBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGw+IHtcbiAgICBpZiAoIXRoaXMudGlsZUFjY2VzcykgcmV0dXJuIG51bGw7XG4gICAgbGV0IHcgPSBNYXRoLnJvdW5kKHJlY3Qud2lkdGggLyB0YXJnZXQpO1xuICAgIGxldCBoID0gTWF0aC5yb3VuZChyZWN0LmhlaWdodCAvIHRhcmdldCk7XG5cbiAgICAvLyBBIGZhY3RvciBvZiAxIG92ZXIgYSB3aG9sZS1zbGlkZSBST0kgd291bGQgYXNrIGZvciBodW5kcmVkcyBvZiBtZWdhcGl4ZWxzLlxuICAgIGNvbnN0IE1BWF9QSVhFTFMgPSAxNl83NzdfMjE2OyAvLyA0MDk2wrJcbiAgICBjb25zdCBwaXhlbHMgPSB3ICogaDtcbiAgICBpZiAocGl4ZWxzID4gTUFYX1BJWEVMUykge1xuICAgICAgY29uc3QgayA9IE1hdGguc3FydChNQVhfUElYRUxTIC8gcGl4ZWxzKTtcbiAgICAgIHcgPSBNYXRoLnJvdW5kKHcgKiBrKTtcbiAgICAgIGggPSBNYXRoLnJvdW5kKGggKiBrKTtcbiAgICB9XG4gICAgaWYgKHcgPCA2NCB8fCBoIDwgNjQpIHJldHVybiBudWxsO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJvaSA9IHtcbiAgICAgICAgeDogTWF0aC5yb3VuZChyZWN0LngpLFxuICAgICAgICB5OiBNYXRoLnJvdW5kKHJlY3QueSksXG4gICAgICAgIHdpZHRoOiBNYXRoLnJvdW5kKHJlY3Qud2lkdGgpLFxuICAgICAgICBoZWlnaHQ6IE1hdGgucm91bmQocmVjdC5oZWlnaHQpLFxuICAgICAgfSBhcyBSZWN0YW5nbGU7XG4gICAgICBjb25zdCBzY3JlZW4gPSB7IHg6IDAsIHk6IDAsIHdpZHRoOiB3LCBoZWlnaHQ6IGggfSBhcyBSZWN0YW5nbGU7XG4gICAgICBjb25zdCBieXRlcyA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMudGlsZUFjY2Vzcy56b29tT25SZWdpb24ocm9pLCBzY3JlZW4sIDApKTtcbiAgICAgIGlmICghYnl0ZXMgfHwgYnl0ZXMuYnl0ZUxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgICAgIGNvbnN0IGJpdG1hcCA9IGF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKG5ldyBCbG9iKFtieXRlc10pKTtcbiAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgY2FudmFzLndpZHRoID0gYml0bWFwLndpZHRoO1xuICAgICAgY2FudmFzLmhlaWdodCA9IGJpdG1hcC5oZWlnaHQ7XG4gICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgIGlmICghY3R4KSByZXR1cm4gbnVsbDtcbiAgICAgIGN0eC5kcmF3SW1hZ2UoYml0bWFwLCAwLCAwKTtcbiAgICAgIGNvbnN0IG91dCA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgYml0bWFwLndpZHRoLCBiaXRtYXAuaGVpZ2h0KTtcbiAgICAgIGJpdG1hcC5jbG9zZT8uKCk7XG4gICAgICByZXR1cm4geyBkYXRhOiBvdXQuZGF0YSwgd2lkdGg6IGJpdG1hcC53aWR0aCwgaGVpZ2h0OiBiaXRtYXAuaGVpZ2h0IH07XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1ha2VSZWdpb24oeHM6IG51bWJlcltdLCB5czogbnVtYmVyW10sIGNsYXNzTmFtZTogc3RyaW5nKTogUmVnaW9uIHtcbiAgICBjb25zdCBwb2x5ID0gbmV3IFBvbHlnb24oKTtcbiAgICBwb2x5Lm5wb2ludHMgPSB4cy5sZW5ndGg7XG4gICAgcG9seS54cG9pbnRzID0geHM7XG4gICAgcG9seS55cG9pbnRzID0geXM7XG4gICAgcG9seS5jb29yZGluYXRlcyA9IHhzLm1hcCgoeCwgaSkgPT4gW3gsIHlzW2ldXSk7XG4gICAgcG9seS5jbG9zZWQgPSB0cnVlO1xuXG4gICAgY29uc3QgcmVnaW9uID0gbmV3IFJlZ2lvbigpO1xuICAgIHJlZ2lvbi5ib3VuZHMgPSBwb2x5O1xuICAgIC8vIFRoZSBjbGFzcyBuYW1lIGRyaXZlcyBwcmVzZXQgY29sb3VyIHJlc29sdXRpb247IGxlYXZpbmcgYGNvbG9yYCB1bnNldCBsZXRzXG4gICAgLy8gYW4gZXhpc3RpbmcgcHJlc2V0IGZvciB0aGlzIGNsYXNzIHdpbi5cbiAgICByZWdpb24ubGFiZWwgPSBjbGFzc05hbWU7XG4gICAgcmV0dXJuIHJlZ2lvbjtcbiAgfVxufVxuIl19
@@ -58,24 +58,24 @@ export class YoloSegmenterService {
58
58
  // status from tile counts here would just fight it.
59
59
  onStatus: (s) => progress?.onStatus?.(s),
60
60
  });
61
- // Detections without geometry are dropped rather than surfaced as empty
62
- // regions — a detection whose mask vanished under thresholding has nothing
63
- // meaningful to draw or edit.
64
- const detections = [];
65
- for (const d of result.detections) {
66
- if (!d.polygons || d.polygons.length === 0)
67
- continue;
68
- detections.push({
69
- polygons: d.polygons.map((p) => ({
70
- exterior: p.exterior.map(([x, y]) => [x, y]),
71
- holes: p.holes.map((h) => h.map(([x, y]) => [x, y])),
72
- })),
73
- box: [d.box[0], d.box[1], d.box[2], d.box[3]],
74
- score: d.score,
75
- classId: d.classId,
76
- className: d.className ?? `class${d.classId}`,
77
- });
78
- }
61
+ // A detection without an outline is still a detection.
62
+ //
63
+ // These used to be dropped, which quietly emptied the entire result in
64
+ // detection mode: no masks means no polygons, so every object was
65
+ // discarded and the caller saw nothing at all. The server does not work
66
+ // that way either — it always writes a box feature and only *adds*
67
+ // segmentation outlines when asked. Callers get the box and decide what to
68
+ // do with it.
69
+ const detections = result.detections.map((d) => ({
70
+ polygons: (d.polygons ?? []).map((p) => ({
71
+ exterior: p.exterior.map(([x, y]) => [x, y]),
72
+ holes: p.holes.map((h) => h.map(([x, y]) => [x, y])),
73
+ })),
74
+ box: [d.box[0], d.box[1], d.box[2], d.box[3]],
75
+ score: d.score,
76
+ classId: d.classId,
77
+ className: d.className ?? `class${d.classId}`,
78
+ }));
79
79
  return {
80
80
  detections,
81
81
  width: result.width,
@@ -169,4 +169,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
169
169
  type: Injectable,
170
170
  args: [{ providedIn: 'root' }]
171
171
  }] });
172
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieW9sby1zZWdtZW50ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdG9vbGJhci9zZWdtZW50YXRpb24veW9sby1zZWdtZW50ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsWUFBWSxFQUFxQixNQUFNLHVCQUF1QixDQUFDOztBQVcvRjs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE1BQU0sT0FBTyxvQkFBb0I7SUFEakM7UUFFbUIsY0FBUyxHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO1FBQzdDLFlBQU8sR0FBRyxJQUFJLEdBQUcsRUFBa0MsQ0FBQztLQWtLdEU7SUFoS0MsS0FBSyxDQUFDLGdCQUFnQixDQUNwQixLQUFpRSxFQUNqRSxPQUErQixFQUFFLEVBQ2pDLFFBQWtDO1FBRWxDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUkscUJBQXFCLEVBQUUsQ0FBQztRQUN4RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXZDLElBQUksaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQzlCLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FDN0IsT0FBTyxFQUNQLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2hCLElBQUksS0FBSztnQkFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDO1lBQ2xELFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbkMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxJQUFJ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QUMsZUFBZSxPQUFPLDhDQUE4QyxDQUFDLENBQUM7UUFDeEYsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQzs4R0FuS1Usb0JBQW9CO2tIQUFwQixvQkFBb0IsY0FEUCxNQUFNOzsyRkFDbkIsb0JBQW9CO2tCQURoQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGdldE9ydFdhc21CYXNlIH0gZnJvbSAnLi9vcnQtcnVudGltZS1jb25maWcnO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdFlvbG9Nb2RlbElkLCBnZXRZb2xvTW9kZWwsIHR5cGUgWW9sb01vZGVsRGVmIH0gZnJvbSAnLi95b2xvLW1vZGVsLXJlZ2lzdHJ5JztcblxuaW1wb3J0IHR5cGUge1xuICBJSW5zdGFuY2VTZWdtZW50ZXIsXG4gIEluc3RhbmNlRGV0ZWN0aW9uLFxuICBJbnN0YW5jZVNlZ21lbnRhdGlvbixcbiAgSW5zdGFuY2VTZWdtZW50T3B0aW9ucyxcbiAgSW5zdGFuY2VTZWdtZW50UHJvZ3Jlc3MsXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9pbnN0YW5jZS1zZWdtZW50ZXIuY29udHJhY3QnO1xuaW1wb3J0IHR5cGUgeyBZb2xvU2VnbWVudGVyIH0gZnJvbSAneW9sby1zZWdkZXRlY3QtanMnO1xuXG4vKipcbiAqIERlZmF1bHQgaW4tbGlicmFyeSB7QGxpbmsgSUluc3RhbmNlU2VnbWVudGVyfSwgYmFja2VkIGJ5IHlvbG8tc2VnZGV0ZWN0LWpzXG4gKiAoWU9MT3Y4LXNlZyBvbiBXZWJHUFUsIGZhbGxpbmcgYmFjayB0byBXQVNNKS5cbiAqXG4gKiBgeW9sby1zZWdkZXRlY3QtanNgIGlzIGEgcmVndWxhciBkZXBlbmRlbmN5IGJ1dCBpcyAqKmxhenktaW1wb3J0ZWQqKiBvbiBmaXJzdFxuICogdXNlLCBzbyBhcHBzIHRoYXQgbmV2ZXIgcnVuIFlPTE8gcGF5IG5vdGhpbmcgZm9yIGl0IOKAlCBvciBmb3Igb25ueHJ1bnRpbWUtd2ViIOKAlFxuICogaW4gdGhlaXIgaW5pdGlhbCBidW5kbGUuIFRoaXMgbWlycm9ycyB7QGxpbmsgQ2VsbHBvc2VTZWdtZW50ZXJTZXJ2aWNlfS5cbiAqXG4gKiBUaGUgb25lIHN0cnVjdHVyYWwgZGlmZmVyZW5jZSBmcm9tIHRoZSBDZWxscG9zZSBzZXJ2aWNlOiB0aGVyZSBhcmUgZm91ciBZT0xPXG4gKiBjaGVja3BvaW50cywgbm90IG9uZSwgc28gaW5zdGFuY2VzIGFyZSBjYWNoZWQgKipwZXIgbW9kZWwgaWQqKiByYXRoZXIgdGhhbiBhc1xuICogYSBzaW5nbGUgc2luZ2xldG9uLiBFYWNoIGVudHJ5IG93bnMgaXRzIG93biB3b3JrZXIgYW5kIE9SVCBzZXNzaW9uLCBzbyBhIGhvc3RcbiAqIHRoYXQgc3dpdGNoZXMgbW9kZWxzIHBheXMgYSBzZWNvbmQgbG9hZCBidXQga2VlcHMgdGhlIGZpcnN0IG9uZSB3YXJtLiBOb3RoaW5nXG4gKiBldmljdHMgYXV0b21hdGljYWxseSDigJQgdGhlc2UgYXJlIH4xNDQgTUIgZWFjaCwgc28gYSBob3N0IHRoYXQgY3ljbGVzIHRocm91Z2hcbiAqIGFsbCBmb3VyIHNob3VsZCBjYWxsIHtAbGluayBkaXNwb3NlfSBmb3IgdGhlIG9uZXMgaXQgaXMgZG9uZSB3aXRoLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFlvbG9TZWdtZW50ZXJTZXJ2aWNlIGltcGxlbWVudHMgSUluc3RhbmNlU2VnbWVudGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnN0YW5jZXMgPSBuZXcgTWFwPHN0cmluZywgWW9sb1NlZ21lbnRlcj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkaW5nID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8WW9sb1NlZ21lbnRlcj4+KCk7XG5cbiAgYXN5bmMgc2VnbWVudEluc3RhbmNlcyhcbiAgICBpbWFnZTogeyBkYXRhOiBVaW50OENsYW1wZWRBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSxcbiAgICBvcHRzOiBJbnN0YW5jZVNlZ21lbnRPcHRpb25zID0ge30sXG4gICAgcHJvZ3Jlc3M/OiBJbnN0YW5jZVNlZ21lbnRQcm9ncmVzcyxcbiAgKTogUHJvbWlzZTxJbnN0YW5jZVNlZ21lbnRhdGlvbj4ge1xuICAgIGNvbnN0IG1vZGVsSWQgPSBvcHRzLm1vZGVsSWQgPz8gZ2V0RGVmYXVsdFlvbG9Nb2RlbElkKCk7XG4gICAgY29uc3QgZGVmID0gdGhpcy5yZXF1aXJlTW9kZWwobW9kZWxJZCk7XG5cbiAgICBsZXQgYW5ub3VuY2VkRG93bmxvYWQgPSBmYWxzZTtcbiAgICBjb25zdCBzZWcgPSBhd2FpdCB0aGlzLmdldE1vZGVsKFxuICAgICAgbW9kZWxJZCxcbiAgICAgIChsb2FkZWQsIHRvdGFsKSA9PiB7XG4gICAgICAgIGlmICh0b3RhbCkgcHJvZ3Jlc3M/Lm9uUHJvZ3Jlc3M/Lihsb2FkZWQgLyB0b3RhbCk7XG4gICAgICAgIHByb2dyZXNzPy5vbkJ5dGVzPy4obG9hZGVkLCB0b3RhbCk7XG4gICAgICAgIGlmIChsb2FkZWQgPiAwICYmICFhbm5vdW5jZWREb3dubG9hZCkge1xuICAgICAgICAgIGFubm91bmNlZERvd25sb2FkID0gdHJ1ZTtcbiAgICAgICAgICBwcm9ncmVzcz8ub25TdGF0dXM/LihgRG93bmxvYWRpbmcgJHtkZWYubGFiZWx9IG1vZGVs4oCmYCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAoc3RhdHVzKSA9PiBwcm9ncmVzcz8ub25TdGF0dXM/LihzdGF0dXMpLFxuICAgICk7XG5cbiAgICBwcm9ncmVzcz8ub25TdGF0dXM/LignUnVubmluZyBpbmZlcmVuY2XigKYnKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZWcuc2VnbWVudChcbiAgICAgIHsgZGF0YTogaW1hZ2UuZGF0YSwgd2lkdGg6IGltYWdlLndpZHRoLCBoZWlnaHQ6IGltYWdlLmhlaWdodCB9LFxuICAgICAge1xuICAgICAgICBjb25mVGhyZXNob2xkOiBvcHRzLmNvbmZpZGVuY2UgPz8gZGVmLmRlZmF1bHRzLmNvbmZpZGVuY2UsXG4gICAgICAgIGlvdVRocmVzaG9sZDogb3B0cy5pb3VUaHJlc2hvbGQgPz8gZGVmLmRlZmF1bHRzLmlvdVRocmVzaG9sZCxcbiAgICAgICAgdGhyZXNob2xkOiBvcHRzLm1lcmdlVGhyZXNob2xkID8/IGRlZi5kZWZhdWx0cy5tZXJnZVRocmVzaG9sZCxcbiAgICAgICAgb3ZlcmxhcFg6IG9wdHMub3ZlcmxhcFggPz8gZGVmLmRlZmF1bHRzLm92ZXJsYXBYLFxuICAgICAgICBvdmVybGFwWTogb3B0cy5vdmVybGFwWSA/PyBkZWYuZGVmYXVsdHMub3ZlcmxhcFksXG4gICAgICAgIC4uLihvcHRzLm1hc2tUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCA/IHsgbWFza1RocmVzaG9sZDogb3B0cy5tYXNrVGhyZXNob2xkIH0gOiB7fSksXG4gICAgICAgIC4uLihvcHRzLm1heERldGVjdGlvbnMgIT09IHVuZGVmaW5lZCA/IHsgbWF4RGV0ZWN0aW9uczogb3B0cy5tYXhEZXRlY3Rpb25zIH0gOiB7fSksXG4gICAgICAgIC4uLihvcHRzLmNsYXNzRmlsdGVyID8geyBjbGFzc0ZpbHRlcjogb3B0cy5jbGFzc0ZpbHRlciB9IDoge30pLFxuICAgICAgICAuLi4ob3B0cy53aXRoTWFza3MgIT09IHVuZGVmaW5lZCA/IHsgd2l0aE1hc2tzOiBvcHRzLndpdGhNYXNrcyB9IDoge30pLFxuICAgICAgICAuLi4ob3B0cy5zaWduYWwgPyB7IHNpZ25hbDogb3B0cy5zaWduYWwgfSA6IHt9KSxcbiAgICAgICAgLy8gT25seSB3b3J0aCB0cmFjaW5nIHdoZW4gdGhlcmUgYXJlIG1hc2tzIHRvIHRyYWNlLlxuICAgICAgICB0cmFjZVBvbHlnb25zOiBvcHRzLndpdGhNYXNrcyAhPT0gZmFsc2UsXG4gICAgICAgIHRyYWNlT3B0aW9uczoge1xuICAgICAgICAgIC4uLihvcHRzLnNpbXBsaWZ5VG9sZXJhbmNlICE9PSB1bmRlZmluZWQgPyB7IHNpbXBsaWZ5VG9sZXJhbmNlOiBvcHRzLnNpbXBsaWZ5VG9sZXJhbmNlIH0gOiB7fSksXG4gICAgICAgICAgLi4uKG9wdHMubWluQXJlYSAhPT0gdW5kZWZpbmVkID8geyBtaW5BcmVhOiBvcHRzLm1pbkFyZWEgfSA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgICAgLy8gVGhlIHdvcmtlciBuYXJyYXRlcyBpdHMgb3duIHBoYXNlcyDigJQgc2hhZGVyIHdhcm0tdXAsIHBlciB0aWxlLCBtZXJnZSxcbiAgICAgICAgLy8gdHJhY2luZyDigJQgYmVjYXVzZSBvbmx5IGl0IGtub3dzIHdoaWNoIG9uZSBpdCBpcyBpbi4gRGVyaXZpbmcgYSBzZWNvbmRcbiAgICAgICAgLy8gc3RhdHVzIGZyb20gdGlsZSBjb3VudHMgaGVyZSB3b3VsZCBqdXN0IGZpZ2h0IGl0LlxuICAgICAgICBvblN0YXR1czogKHMpID0+IHByb2dyZXNzPy5vblN0YXR1cz8uKHMpLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gRGV0ZWN0aW9ucyB3aXRob3V0IGdlb21ldHJ5IGFyZSBkcm9wcGVkIHJhdGhlciB0aGFuIHN1cmZhY2VkIGFzIGVtcHR5XG4gICAgLy8gcmVnaW9ucyDigJQgYSBkZXRlY3Rpb24gd2hvc2UgbWFzayB2YW5pc2hlZCB1bmRlciB0aHJlc2hvbGRpbmcgaGFzIG5vdGhpbmdcbiAgICAvLyBtZWFuaW5nZnVsIHRvIGRyYXcgb3IgZWRpdC5cbiAgICBjb25zdCBkZXRlY3Rpb25zOiBJbnN0YW5jZURldGVjdGlvbltdID0gW107XG4gICAgZm9yIChjb25zdCBkIG9mIHJlc3VsdC5kZXRlY3Rpb25zKSB7XG4gICAgICBpZiAoIWQucG9seWdvbnMgfHwgZC5wb2x5Z29ucy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuICAgICAgZGV0ZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgcG9seWdvbnM6IGQucG9seWdvbnMubWFwKChwKSA9PiAoe1xuICAgICAgICAgIGV4dGVyaW9yOiBwLmV4dGVyaW9yLm1hcCgoW3gsIHldKTogW251bWJlciwgbnVtYmVyXSA9PiBbeCwgeV0pLFxuICAgICAgICAgIGhvbGVzOiBwLmhvbGVzLm1hcCgoaCkgPT4gaC5tYXAoKFt4LCB5XSk6IFtudW1iZXIsIG51bWJlcl0gPT4gW3gsIHldKSksXG4gICAgICAgIH0pKSxcbiAgICAgICAgYm94OiBbZC5ib3hbMF0sIGQuYm94WzFdLCBkLmJveFsyXSwgZC5ib3hbM11dLFxuICAgICAgICBzY29yZTogZC5zY29yZSxcbiAgICAgICAgY2xhc3NJZDogZC5jbGFzc0lkLFxuICAgICAgICBjbGFzc05hbWU6IGQuY2xhc3NOYW1lID8/IGBjbGFzcyR7ZC5jbGFzc0lkfWAsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGV0ZWN0aW9ucyxcbiAgICAgIHdpZHRoOiByZXN1bHQud2lkdGgsXG4gICAgICBoZWlnaHQ6IHJlc3VsdC5oZWlnaHQsXG4gICAgICBjbGFzc05hbWVzOiByZXN1bHQuY2xhc3NOYW1lcyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzaGFyZWQgc2VnbWVudGVyIGZvciBhIG1vZGVsIGlkLCBjcmVhdGVkIG9uIGZpcnN0IHVzZSBhbmQgcmV1c2VkXG4gICAqIHRoZXJlYWZ0ZXIgKGRlZHVwZWQgYWNyb3NzIGNvbmN1cnJlbnQgY2FsbGVycykuIEV4cG9zZWQgc28gYSBob3N0J3NcbiAgICogcHJvY2Vzc2luZyBwaXBlbGluZSBjYW4gZHJpdmUgcmljaGVyIGBzZWdtZW50KClgIG9wdGlvbnMgb24gdGhlIHNhbWUgbG9hZGVkXG4gICAqIHNlc3Npb24gaW5zdGVhZCBvZiBsb2FkaW5nIHRoZSBtb2RlbCB0d2ljZS5cbiAgICovXG4gIGdldE1vZGVsKFxuICAgIG1vZGVsSWQ6IHN0cmluZyA9IGdldERlZmF1bHRZb2xvTW9kZWxJZCgpLFxuICAgIG9uUHJvZ3Jlc3M/OiAobG9hZGVkOiBudW1iZXIsIHRvdGFsOiBudW1iZXIgfCBudWxsKSA9PiB2b2lkLFxuICAgIG9uU3RhdHVzPzogKHN0YXR1czogc3RyaW5nKSA9PiB2b2lkLFxuICApOiBQcm9taXNlPFlvbG9TZWdtZW50ZXI+IHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuaW5zdGFuY2VzLmdldChtb2RlbElkKTtcbiAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBQcm9taXNlLnJlc29sdmUoZXhpc3RpbmcpO1xuXG4gICAgY29uc3QgaW5GbGlnaHQgPSB0aGlzLmxvYWRpbmcuZ2V0KG1vZGVsSWQpO1xuICAgIGlmIChpbkZsaWdodCkgcmV0dXJuIGluRmxpZ2h0O1xuXG4gICAgY29uc3QgZGVmID0gdGhpcy5yZXF1aXJlTW9kZWwobW9kZWxJZCk7XG4gICAgY29uc3QgbG9hZCA9IChhc3luYyAoKSA9PiB7XG4gICAgICAvLyBMYXp5OiBrZWVwIHlvbG8tc2VnZGV0ZWN0LWpzICsgaXRzIE9SVCBydW50aW1lIG91dCBvZiB0aGUgaW5pdGlhbCBidW5kbGUuXG4gICAgICBjb25zdCB7IFlvbG9TZWdtZW50ZXIsIGNvbmZpZ3VyZU9ydCB9ID0gYXdhaXQgaW1wb3J0KCd5b2xvLXNlZ2RldGVjdC1qcycpO1xuICAgICAgY29uZmlndXJlT3J0KHsgd2FzbVBhdGhzOiBnZXRPcnRXYXNtQmFzZSgpIH0pO1xuICAgICAgY29uc3Qgc2VnID0gYXdhaXQgWW9sb1NlZ21lbnRlci5mcm9tUHJldHJhaW5lZChkZWYubW9kZWxVcmwsIHtcbiAgICAgICAgcHJlbG9hZDogdHJ1ZSxcbiAgICAgICAgLi4uKGRlZi5tZXRhVXJsID8geyBtZXRhVXJsOiBkZWYubWV0YVVybCB9IDoge30pLFxuICAgICAgICBvblByb2dyZXNzOiAoeyBsb2FkZWQsIHRvdGFsIH0pID0+IG9uUHJvZ3Jlc3M/Lihsb2FkZWQsIHRvdGFsKSxcbiAgICAgICAgb25TdGF0dXM6IChzKSA9PiBvblN0YXR1cz8uKHMpLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmluc3RhbmNlcy5zZXQobW9kZWxJZCwgc2VnKTtcbiAgICAgIHJldHVybiBzZWc7XG4gICAgfSkoKTtcblxuICAgIHRoaXMubG9hZGluZy5zZXQobW9kZWxJZCwgbG9hZCk7XG4gICAgLy8gQSBmYWlsZWQgbG9hZCBtdXN0IG5vdCBwb2lzb24gdGhlIGNhY2hlIOKAlCB0aGUgbmV4dCBjYWxsZXIgc2hvdWxkIHJldHJ5XG4gICAgLy8gcmF0aGVyIHRoYW4gaW5oZXJpdCB0aGUgcmVqZWN0ZWQgcHJvbWlzZSBmb3JldmVyLlxuICAgIGxvYWQuY2F0Y2goKCkgPT4gdGhpcy5sb2FkaW5nLmRlbGV0ZShtb2RlbElkKSk7XG4gICAgcmV0dXJuIGxvYWQ7XG4gIH1cblxuICAvKiogV2hldGhlciBhIG1vZGVsIGlzIGFscmVhZHkgbG9hZGVkICh3YXJtKS4gKi9cbiAgaXNMb2FkZWQobW9kZWxJZDogc3RyaW5nID0gZ2V0RGVmYXVsdFlvbG9Nb2RlbElkKCkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW5jZXMuaGFzKG1vZGVsSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2Ugb25lIG1vZGVsLCBvciBhbGwgb2YgdGhlbS4gU2FmZSB0byBjYWxsIG9uIGEgbW9kZWwgbmV2ZXIgbG9hZGVkLlxuICAgKlxuICAgKiBJbi1mbGlnaHQgbG9hZHMgYXJlIHRvcm4gZG93biB0b28sIG5vdCBqdXN0IHdhcm0gb25lcy4gU2ltcGx5IGRyb3BwaW5nIHRoZVxuICAgKiBwZW5kaW5nIHByb21pc2UgYW5kIHJldHVybmluZyB3b3VsZCBsZXQgdGhlIGxvYWQgZmluaXNoIGFmdGVyd2FyZHMsXG4gICAqIHJlLXBvcHVsYXRlIHtAbGluayBpbnN0YW5jZXN9LCBhbmQgc3RyYW5kIGEgbGl2ZSB3b3JrZXIgYW5kIE9SVCBzZXNzaW9uIHRoYXRcbiAgICogbm90aGluZyBvd25zIOKAlCBkaXNwb3NhbCB3b3VsZCBoYXZlIHJlcG9ydGVkIHN1Y2Nlc3Mgd2hpbGUgbGVha2luZy4gU28gYSBsb2FkXG4gICAqIHRoYXQgaXMgc3RpbGwgcnVubmluZyBpcyBhd2FpdGVkIGFuZCB0aGVuIHJlbGVhc2VkLlxuICAgKi9cbiAgYXN5bmMgZGlzcG9zZShtb2RlbElkPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaWRzID0gbW9kZWxJZCA/IFttb2RlbElkXSA6IFsuLi5uZXcgU2V0KFsuLi50aGlzLmluc3RhbmNlcy5rZXlzKCksIC4uLnRoaXMubG9hZGluZy5rZXlzKCldKV07XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoaWRzLm1hcCgoaWQpID0+IHRoaXMuZGlzcG9zZU9uZShpZCkpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZGlzcG9zZU9uZShpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGVuZGluZyA9IHRoaXMubG9hZGluZy5nZXQoaWQpO1xuICAgIGNvbnN0IGxvYWRlZCA9IHRoaXMuaW5zdGFuY2VzLmdldChpZCk7XG4gICAgdGhpcy5pbnN0YW5jZXMuZGVsZXRlKGlkKTtcbiAgICB0aGlzLmxvYWRpbmcuZGVsZXRlKGlkKTtcblxuICAgIGlmIChsb2FkZWQpIGF3YWl0IGxvYWRlZC5kaXNwb3NlKCk7XG4gICAgaWYgKCFwZW5kaW5nKSByZXR1cm47XG5cbiAgICAvLyBBIHBlbmRpbmcgbG9hZCBhc3NpZ25zIGluc3RhbmNlc1tpZF0gYmVmb3JlIGl0cyBwcm9taXNlIHJlc29sdmVzLCBzbyBieVxuICAgIC8vIHRoZSB0aW1lIHRoaXMgYXdhaXQgcmV0dXJucyB0aGUgZW50cnkgaXMgYmFjay4gQ2xlYXIgaXQgb25seSBpZiBpdCBzdGlsbFxuICAgIC8vIHBvaW50cyBhdCB3aGF0ICp0aGlzKiBsb2FkIHByb2R1Y2VkIOKAlCBhIG5ld2VyIGxvYWQgc3RhcnRlZCBpbiB0aGVcbiAgICAvLyBtZWFudGltZSBvd25zIGl0cyBvd24gZW50cnkgYW5kIG11c3Qgbm90IGJlIGV2aWN0ZWQuXG4gICAgY29uc3Qgc2VnID0gYXdhaXQgcGVuZGluZy5jYXRjaCgoKSA9PiBudWxsKTtcbiAgICBpZiAoIXNlZyB8fCBzZWcgPT09IGxvYWRlZCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmluc3RhbmNlcy5nZXQoaWQpID09PSBzZWcpIHRoaXMuaW5zdGFuY2VzLmRlbGV0ZShpZCk7XG4gICAgYXdhaXQgc2VnLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVxdWlyZU1vZGVsKG1vZGVsSWQ6IHN0cmluZyk6IFlvbG9Nb2RlbERlZiB7XG4gICAgY29uc3QgZGVmID0gZ2V0WW9sb01vZGVsKG1vZGVsSWQpO1xuICAgIGlmICghZGVmKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gWU9MTyBtb2RlbCBpZCBcIiR7bW9kZWxJZH1cIi5gKTtcbiAgICBpZiAoIWRlZi5tb2RlbFVybC50cmltKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgWU9MTyBtb2RlbCBcIiR7bW9kZWxJZH1cIiBpcyBub3QgY29uZmlndXJlZCDigJQgaXRzIG1vZGVsVXJsIGlzIGVtcHR5LmApO1xuICAgIH1cbiAgICByZXR1cm4gZGVmO1xuICB9XG59XG4iXX0=
172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieW9sby1zZWdtZW50ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdG9vbGJhci9zZWdtZW50YXRpb24veW9sby1zZWdtZW50ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsWUFBWSxFQUFxQixNQUFNLHVCQUF1QixDQUFDOztBQVcvRjs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE1BQU0sT0FBTyxvQkFBb0I7SUFEakM7UUFFbUIsY0FBUyxHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO1FBQzdDLFlBQU8sR0FBRyxJQUFJLEdBQUcsRUFBa0MsQ0FBQztLQW1LdEU7SUFqS0MsS0FBSyxDQUFDLGdCQUFnQixDQUNwQixLQUFpRSxFQUNqRSxPQUErQixFQUFFLEVBQ2pDLFFBQWtDO1FBRWxDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUkscUJBQXFCLEVBQUUsQ0FBQztRQUN4RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXZDLElBQUksaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQzlCLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FDN0IsT0FBTyxFQUNQLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2hCLElBQUksS0FBSztnQkFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDO1lBQ2xELFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbkMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxJQUFJ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QztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQzs4R0FwS1Usb0JBQW9CO2tIQUFwQixvQkFBb0IsY0FEUCxNQUFNOzsyRkFDbkIsb0JBQW9CO2tCQURoQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGdldE9ydFdhc21CYXNlIH0gZnJvbSAnLi9vcnQtcnVudGltZS1jb25maWcnO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdFlvbG9Nb2RlbElkLCBnZXRZb2xvTW9kZWwsIHR5cGUgWW9sb01vZGVsRGVmIH0gZnJvbSAnLi95b2xvLW1vZGVsLXJlZ2lzdHJ5JztcblxuaW1wb3J0IHR5cGUge1xuICBJSW5zdGFuY2VTZWdtZW50ZXIsXG4gIEluc3RhbmNlRGV0ZWN0aW9uLFxuICBJbnN0YW5jZVNlZ21lbnRhdGlvbixcbiAgSW5zdGFuY2VTZWdtZW50T3B0aW9ucyxcbiAgSW5zdGFuY2VTZWdtZW50UHJvZ3Jlc3MsXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9pbnN0YW5jZS1zZWdtZW50ZXIuY29udHJhY3QnO1xuaW1wb3J0IHR5cGUgeyBZb2xvU2VnbWVudGVyIH0gZnJvbSAneW9sby1zZWdkZXRlY3QtanMnO1xuXG4vKipcbiAqIERlZmF1bHQgaW4tbGlicmFyeSB7QGxpbmsgSUluc3RhbmNlU2VnbWVudGVyfSwgYmFja2VkIGJ5IHlvbG8tc2VnZGV0ZWN0LWpzXG4gKiAoWU9MT3Y4LXNlZyBvbiBXZWJHUFUsIGZhbGxpbmcgYmFjayB0byBXQVNNKS5cbiAqXG4gKiBgeW9sby1zZWdkZXRlY3QtanNgIGlzIGEgcmVndWxhciBkZXBlbmRlbmN5IGJ1dCBpcyAqKmxhenktaW1wb3J0ZWQqKiBvbiBmaXJzdFxuICogdXNlLCBzbyBhcHBzIHRoYXQgbmV2ZXIgcnVuIFlPTE8gcGF5IG5vdGhpbmcgZm9yIGl0IOKAlCBvciBmb3Igb25ueHJ1bnRpbWUtd2ViIOKAlFxuICogaW4gdGhlaXIgaW5pdGlhbCBidW5kbGUuIFRoaXMgbWlycm9ycyB7QGxpbmsgQ2VsbHBvc2VTZWdtZW50ZXJTZXJ2aWNlfS5cbiAqXG4gKiBUaGUgb25lIHN0cnVjdHVyYWwgZGlmZmVyZW5jZSBmcm9tIHRoZSBDZWxscG9zZSBzZXJ2aWNlOiB0aGVyZSBhcmUgZm91ciBZT0xPXG4gKiBjaGVja3BvaW50cywgbm90IG9uZSwgc28gaW5zdGFuY2VzIGFyZSBjYWNoZWQgKipwZXIgbW9kZWwgaWQqKiByYXRoZXIgdGhhbiBhc1xuICogYSBzaW5nbGUgc2luZ2xldG9uLiBFYWNoIGVudHJ5IG93bnMgaXRzIG93biB3b3JrZXIgYW5kIE9SVCBzZXNzaW9uLCBzbyBhIGhvc3RcbiAqIHRoYXQgc3dpdGNoZXMgbW9kZWxzIHBheXMgYSBzZWNvbmQgbG9hZCBidXQga2VlcHMgdGhlIGZpcnN0IG9uZSB3YXJtLiBOb3RoaW5nXG4gKiBldmljdHMgYXV0b21hdGljYWxseSDigJQgdGhlc2UgYXJlIH4xNDQgTUIgZWFjaCwgc28gYSBob3N0IHRoYXQgY3ljbGVzIHRocm91Z2hcbiAqIGFsbCBmb3VyIHNob3VsZCBjYWxsIHtAbGluayBkaXNwb3NlfSBmb3IgdGhlIG9uZXMgaXQgaXMgZG9uZSB3aXRoLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFlvbG9TZWdtZW50ZXJTZXJ2aWNlIGltcGxlbWVudHMgSUluc3RhbmNlU2VnbWVudGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnN0YW5jZXMgPSBuZXcgTWFwPHN0cmluZywgWW9sb1NlZ21lbnRlcj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkaW5nID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8WW9sb1NlZ21lbnRlcj4+KCk7XG5cbiAgYXN5bmMgc2VnbWVudEluc3RhbmNlcyhcbiAgICBpbWFnZTogeyBkYXRhOiBVaW50OENsYW1wZWRBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSxcbiAgICBvcHRzOiBJbnN0YW5jZVNlZ21lbnRPcHRpb25zID0ge30sXG4gICAgcHJvZ3Jlc3M/OiBJbnN0YW5jZVNlZ21lbnRQcm9ncmVzcyxcbiAgKTogUHJvbWlzZTxJbnN0YW5jZVNlZ21lbnRhdGlvbj4ge1xuICAgIGNvbnN0IG1vZGVsSWQgPSBvcHRzLm1vZGVsSWQgPz8gZ2V0RGVmYXVsdFlvbG9Nb2RlbElkKCk7XG4gICAgY29uc3QgZGVmID0gdGhpcy5yZXF1aXJlTW9kZWwobW9kZWxJZCk7XG5cbiAgICBsZXQgYW5ub3VuY2VkRG93bmxvYWQgPSBmYWxzZTtcbiAgICBjb25zdCBzZWcgPSBhd2FpdCB0aGlzLmdldE1vZGVsKFxuICAgICAgbW9kZWxJZCxcbiAgICAgIChsb2FkZWQsIHRvdGFsKSA9PiB7XG4gICAgICAgIGlmICh0b3RhbCkgcHJvZ3Jlc3M/Lm9uUHJvZ3Jlc3M/Lihsb2FkZWQgLyB0b3RhbCk7XG4gICAgICAgIHByb2dyZXNzPy5vbkJ5dGVzPy4obG9hZGVkLCB0b3RhbCk7XG4gICAgICAgIGlmIChsb2FkZWQgPiAwICYmICFhbm5vdW5jZWREb3dubG9hZCkge1xuICAgICAgICAgIGFubm91bmNlZERvd25sb2FkID0gdHJ1ZTtcbiAgICAgICAgICBwcm9ncmVzcz8ub25TdGF0dXM/LihgRG93bmxvYWRpbmcgJHtkZWYubGFiZWx9IG1vZGVs4oCmYCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAoc3RhdHVzKSA9PiBwcm9ncmVzcz8ub25TdGF0dXM/LihzdGF0dXMpLFxuICAgICk7XG5cbiAgICBwcm9ncmVzcz8ub25TdGF0dXM/LignUnVubmluZyBpbmZlcmVuY2XigKYnKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZWcuc2VnbWVudChcbiAgICAgIHsgZGF0YTogaW1hZ2UuZGF0YSwgd2lkdGg6IGltYWdlLndpZHRoLCBoZWlnaHQ6IGltYWdlLmhlaWdodCB9LFxuICAgICAge1xuICAgICAgICBjb25mVGhyZXNob2xkOiBvcHRzLmNvbmZpZGVuY2UgPz8gZGVmLmRlZmF1bHRzLmNvbmZpZGVuY2UsXG4gICAgICAgIGlvdVRocmVzaG9sZDogb3B0cy5pb3VUaHJlc2hvbGQgPz8gZGVmLmRlZmF1bHRzLmlvdVRocmVzaG9sZCxcbiAgICAgICAgdGhyZXNob2xkOiBvcHRzLm1lcmdlVGhyZXNob2xkID8/IGRlZi5kZWZhdWx0cy5tZXJnZVRocmVzaG9sZCxcbiAgICAgICAgb3ZlcmxhcFg6IG9wdHMub3ZlcmxhcFggPz8gZGVmLmRlZmF1bHRzLm92ZXJsYXBYLFxuICAgICAgICBvdmVybGFwWTogb3B0cy5vdmVybGFwWSA/PyBkZWYuZGVmYXVsdHMub3ZlcmxhcFksXG4gICAgICAgIC4uLihvcHRzLm1hc2tUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCA/IHsgbWFza1RocmVzaG9sZDogb3B0cy5tYXNrVGhyZXNob2xkIH0gOiB7fSksXG4gICAgICAgIC4uLihvcHRzLm1heERldGVjdGlvbnMgIT09IHVuZGVmaW5lZCA/IHsgbWF4RGV0ZWN0aW9uczogb3B0cy5tYXhEZXRlY3Rpb25zIH0gOiB7fSksXG4gICAgICAgIC4uLihvcHRzLmNsYXNzRmlsdGVyID8geyBjbGFzc0ZpbHRlcjogb3B0cy5jbGFzc0ZpbHRlciB9IDoge30pLFxuICAgICAgICAuLi4ob3B0cy53aXRoTWFza3MgIT09IHVuZGVmaW5lZCA/IHsgd2l0aE1hc2tzOiBvcHRzLndpdGhNYXNrcyB9IDoge30pLFxuICAgICAgICAuLi4ob3B0cy5zaWduYWwgPyB7IHNpZ25hbDogb3B0cy5zaWduYWwgfSA6IHt9KSxcbiAgICAgICAgLy8gT25seSB3b3J0aCB0cmFjaW5nIHdoZW4gdGhlcmUgYXJlIG1hc2tzIHRvIHRyYWNlLlxuICAgICAgICB0cmFjZVBvbHlnb25zOiBvcHRzLndpdGhNYXNrcyAhPT0gZmFsc2UsXG4gICAgICAgIHRyYWNlT3B0aW9uczoge1xuICAgICAgICAgIC4uLihvcHRzLnNpbXBsaWZ5VG9sZXJhbmNlICE9PSB1bmRlZmluZWQgPyB7IHNpbXBsaWZ5VG9sZXJhbmNlOiBvcHRzLnNpbXBsaWZ5VG9sZXJhbmNlIH0gOiB7fSksXG4gICAgICAgICAgLi4uKG9wdHMubWluQXJlYSAhPT0gdW5kZWZpbmVkID8geyBtaW5BcmVhOiBvcHRzLm1pbkFyZWEgfSA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgICAgLy8gVGhlIHdvcmtlciBuYXJyYXRlcyBpdHMgb3duIHBoYXNlcyDigJQgc2hhZGVyIHdhcm0tdXAsIHBlciB0aWxlLCBtZXJnZSxcbiAgICAgICAgLy8gdHJhY2luZyDigJQgYmVjYXVzZSBvbmx5IGl0IGtub3dzIHdoaWNoIG9uZSBpdCBpcyBpbi4gRGVyaXZpbmcgYSBzZWNvbmRcbiAgICAgICAgLy8gc3RhdHVzIGZyb20gdGlsZSBjb3VudHMgaGVyZSB3b3VsZCBqdXN0IGZpZ2h0IGl0LlxuICAgICAgICBvblN0YXR1czogKHMpID0+IHByb2dyZXNzPy5vblN0YXR1cz8uKHMpLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gQSBkZXRlY3Rpb24gd2l0aG91dCBhbiBvdXRsaW5lIGlzIHN0aWxsIGEgZGV0ZWN0aW9uLlxuICAgIC8vXG4gICAgLy8gVGhlc2UgdXNlZCB0byBiZSBkcm9wcGVkLCB3aGljaCBxdWlldGx5IGVtcHRpZWQgdGhlIGVudGlyZSByZXN1bHQgaW5cbiAgICAvLyBkZXRlY3Rpb24gbW9kZTogbm8gbWFza3MgbWVhbnMgbm8gcG9seWdvbnMsIHNvIGV2ZXJ5IG9iamVjdCB3YXNcbiAgICAvLyBkaXNjYXJkZWQgYW5kIHRoZSBjYWxsZXIgc2F3IG5vdGhpbmcgYXQgYWxsLiBUaGUgc2VydmVyIGRvZXMgbm90IHdvcmtcbiAgICAvLyB0aGF0IHdheSBlaXRoZXIg4oCUIGl0IGFsd2F5cyB3cml0ZXMgYSBib3ggZmVhdHVyZSBhbmQgb25seSAqYWRkcypcbiAgICAvLyBzZWdtZW50YXRpb24gb3V0bGluZXMgd2hlbiBhc2tlZC4gQ2FsbGVycyBnZXQgdGhlIGJveCBhbmQgZGVjaWRlIHdoYXQgdG9cbiAgICAvLyBkbyB3aXRoIGl0LlxuICAgIGNvbnN0IGRldGVjdGlvbnM6IEluc3RhbmNlRGV0ZWN0aW9uW10gPSByZXN1bHQuZGV0ZWN0aW9ucy5tYXAoKGQpID0+ICh7XG4gICAgICBwb2x5Z29uczogKGQucG9seWdvbnMgPz8gW10pLm1hcCgocCkgPT4gKHtcbiAgICAgICAgZXh0ZXJpb3I6IHAuZXh0ZXJpb3IubWFwKChbeCwgeV0pOiBbbnVtYmVyLCBudW1iZXJdID0+IFt4LCB5XSksXG4gICAgICAgIGhvbGVzOiBwLmhvbGVzLm1hcCgoaCkgPT4gaC5tYXAoKFt4LCB5XSk6IFtudW1iZXIsIG51bWJlcl0gPT4gW3gsIHldKSksXG4gICAgICB9KSksXG4gICAgICBib3g6IFtkLmJveFswXSwgZC5ib3hbMV0sIGQuYm94WzJdLCBkLmJveFszXV0gYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBzY29yZTogZC5zY29yZSxcbiAgICAgIGNsYXNzSWQ6IGQuY2xhc3NJZCxcbiAgICAgIGNsYXNzTmFtZTogZC5jbGFzc05hbWUgPz8gYGNsYXNzJHtkLmNsYXNzSWR9YCxcbiAgICB9KSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGV0ZWN0aW9ucyxcbiAgICAgIHdpZHRoOiByZXN1bHQud2lkdGgsXG4gICAgICBoZWlnaHQ6IHJlc3VsdC5oZWlnaHQsXG4gICAgICBjbGFzc05hbWVzOiByZXN1bHQuY2xhc3NOYW1lcyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzaGFyZWQgc2VnbWVudGVyIGZvciBhIG1vZGVsIGlkLCBjcmVhdGVkIG9uIGZpcnN0IHVzZSBhbmQgcmV1c2VkXG4gICAqIHRoZXJlYWZ0ZXIgKGRlZHVwZWQgYWNyb3NzIGNvbmN1cnJlbnQgY2FsbGVycykuIEV4cG9zZWQgc28gYSBob3N0J3NcbiAgICogcHJvY2Vzc2luZyBwaXBlbGluZSBjYW4gZHJpdmUgcmljaGVyIGBzZWdtZW50KClgIG9wdGlvbnMgb24gdGhlIHNhbWUgbG9hZGVkXG4gICAqIHNlc3Npb24gaW5zdGVhZCBvZiBsb2FkaW5nIHRoZSBtb2RlbCB0d2ljZS5cbiAgICovXG4gIGdldE1vZGVsKFxuICAgIG1vZGVsSWQ6IHN0cmluZyA9IGdldERlZmF1bHRZb2xvTW9kZWxJZCgpLFxuICAgIG9uUHJvZ3Jlc3M/OiAobG9hZGVkOiBudW1iZXIsIHRvdGFsOiBudW1iZXIgfCBudWxsKSA9PiB2b2lkLFxuICAgIG9uU3RhdHVzPzogKHN0YXR1czogc3RyaW5nKSA9PiB2b2lkLFxuICApOiBQcm9taXNlPFlvbG9TZWdtZW50ZXI+IHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuaW5zdGFuY2VzLmdldChtb2RlbElkKTtcbiAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBQcm9taXNlLnJlc29sdmUoZXhpc3RpbmcpO1xuXG4gICAgY29uc3QgaW5GbGlnaHQgPSB0aGlzLmxvYWRpbmcuZ2V0KG1vZGVsSWQpO1xuICAgIGlmIChpbkZsaWdodCkgcmV0dXJuIGluRmxpZ2h0O1xuXG4gICAgY29uc3QgZGVmID0gdGhpcy5yZXF1aXJlTW9kZWwobW9kZWxJZCk7XG4gICAgY29uc3QgbG9hZCA9IChhc3luYyAoKSA9PiB7XG4gICAgICAvLyBMYXp5OiBrZWVwIHlvbG8tc2VnZGV0ZWN0LWpzICsgaXRzIE9SVCBydW50aW1lIG91dCBvZiB0aGUgaW5pdGlhbCBidW5kbGUuXG4gICAgICBjb25zdCB7IFlvbG9TZWdtZW50ZXIsIGNvbmZpZ3VyZU9ydCB9ID0gYXdhaXQgaW1wb3J0KCd5b2xvLXNlZ2RldGVjdC1qcycpO1xuICAgICAgY29uZmlndXJlT3J0KHsgd2FzbVBhdGhzOiBnZXRPcnRXYXNtQmFzZSgpIH0pO1xuICAgICAgY29uc3Qgc2VnID0gYXdhaXQgWW9sb1NlZ21lbnRlci5mcm9tUHJldHJhaW5lZChkZWYubW9kZWxVcmwsIHtcbiAgICAgICAgcHJlbG9hZDogdHJ1ZSxcbiAgICAgICAgLi4uKGRlZi5tZXRhVXJsID8geyBtZXRhVXJsOiBkZWYubWV0YVVybCB9IDoge30pLFxuICAgICAgICBvblByb2dyZXNzOiAoeyBsb2FkZWQsIHRvdGFsIH0pID0+IG9uUHJvZ3Jlc3M/Lihsb2FkZWQsIHRvdGFsKSxcbiAgICAgICAgb25TdGF0dXM6IChzKSA9PiBvblN0YXR1cz8uKHMpLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmluc3RhbmNlcy5zZXQobW9kZWxJZCwgc2VnKTtcbiAgICAgIHJldHVybiBzZWc7XG4gICAgfSkoKTtcblxuICAgIHRoaXMubG9hZGluZy5zZXQobW9kZWxJZCwgbG9hZCk7XG4gICAgLy8gQSBmYWlsZWQgbG9hZCBtdXN0IG5vdCBwb2lzb24gdGhlIGNhY2hlIOKAlCB0aGUgbmV4dCBjYWxsZXIgc2hvdWxkIHJldHJ5XG4gICAgLy8gcmF0aGVyIHRoYW4gaW5oZXJpdCB0aGUgcmVqZWN0ZWQgcHJvbWlzZSBmb3JldmVyLlxuICAgIGxvYWQuY2F0Y2goKCkgPT4gdGhpcy5sb2FkaW5nLmRlbGV0ZShtb2RlbElkKSk7XG4gICAgcmV0dXJuIGxvYWQ7XG4gIH1cblxuICAvKiogV2hldGhlciBhIG1vZGVsIGlzIGFscmVhZHkgbG9hZGVkICh3YXJtKS4gKi9cbiAgaXNMb2FkZWQobW9kZWxJZDogc3RyaW5nID0gZ2V0RGVmYXVsdFlvbG9Nb2RlbElkKCkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW5jZXMuaGFzKG1vZGVsSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2Ugb25lIG1vZGVsLCBvciBhbGwgb2YgdGhlbS4gU2FmZSB0byBjYWxsIG9uIGEgbW9kZWwgbmV2ZXIgbG9hZGVkLlxuICAgKlxuICAgKiBJbi1mbGlnaHQgbG9hZHMgYXJlIHRvcm4gZG93biB0b28sIG5vdCBqdXN0IHdhcm0gb25lcy4gU2ltcGx5IGRyb3BwaW5nIHRoZVxuICAgKiBwZW5kaW5nIHByb21pc2UgYW5kIHJldHVybmluZyB3b3VsZCBsZXQgdGhlIGxvYWQgZmluaXNoIGFmdGVyd2FyZHMsXG4gICAqIHJlLXBvcHVsYXRlIHtAbGluayBpbnN0YW5jZXN9LCBhbmQgc3RyYW5kIGEgbGl2ZSB3b3JrZXIgYW5kIE9SVCBzZXNzaW9uIHRoYXRcbiAgICogbm90aGluZyBvd25zIOKAlCBkaXNwb3NhbCB3b3VsZCBoYXZlIHJlcG9ydGVkIHN1Y2Nlc3Mgd2hpbGUgbGVha2luZy4gU28gYSBsb2FkXG4gICAqIHRoYXQgaXMgc3RpbGwgcnVubmluZyBpcyBhd2FpdGVkIGFuZCB0aGVuIHJlbGVhc2VkLlxuICAgKi9cbiAgYXN5bmMgZGlzcG9zZShtb2RlbElkPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaWRzID0gbW9kZWxJZCA/IFttb2RlbElkXSA6IFsuLi5uZXcgU2V0KFsuLi50aGlzLmluc3RhbmNlcy5rZXlzKCksIC4uLnRoaXMubG9hZGluZy5rZXlzKCldKV07XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoaWRzLm1hcCgoaWQpID0+IHRoaXMuZGlzcG9zZU9uZShpZCkpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZGlzcG9zZU9uZShpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGVuZGluZyA9IHRoaXMubG9hZGluZy5nZXQoaWQpO1xuICAgIGNvbnN0IGxvYWRlZCA9IHRoaXMuaW5zdGFuY2VzLmdldChpZCk7XG4gICAgdGhpcy5pbnN0YW5jZXMuZGVsZXRlKGlkKTtcbiAgICB0aGlzLmxvYWRpbmcuZGVsZXRlKGlkKTtcblxuICAgIGlmIChsb2FkZWQpIGF3YWl0IGxvYWRlZC5kaXNwb3NlKCk7XG4gICAgaWYgKCFwZW5kaW5nKSByZXR1cm47XG5cbiAgICAvLyBBIHBlbmRpbmcgbG9hZCBhc3NpZ25zIGluc3RhbmNlc1tpZF0gYmVmb3JlIGl0cyBwcm9taXNlIHJlc29sdmVzLCBzbyBieVxuICAgIC8vIHRoZSB0aW1lIHRoaXMgYXdhaXQgcmV0dXJucyB0aGUgZW50cnkgaXMgYmFjay4gQ2xlYXIgaXQgb25seSBpZiBpdCBzdGlsbFxuICAgIC8vIHBvaW50cyBhdCB3aGF0ICp0aGlzKiBsb2FkIHByb2R1Y2VkIOKAlCBhIG5ld2VyIGxvYWQgc3RhcnRlZCBpbiB0aGVcbiAgICAvLyBtZWFudGltZSBvd25zIGl0cyBvd24gZW50cnkgYW5kIG11c3Qgbm90IGJlIGV2aWN0ZWQuXG4gICAgY29uc3Qgc2VnID0gYXdhaXQgcGVuZGluZy5jYXRjaCgoKSA9PiBudWxsKTtcbiAgICBpZiAoIXNlZyB8fCBzZWcgPT09IGxvYWRlZCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmluc3RhbmNlcy5nZXQoaWQpID09PSBzZWcpIHRoaXMuaW5zdGFuY2VzLmRlbGV0ZShpZCk7XG4gICAgYXdhaXQgc2VnLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVxdWlyZU1vZGVsKG1vZGVsSWQ6IHN0cmluZyk6IFlvbG9Nb2RlbERlZiB7XG4gICAgY29uc3QgZGVmID0gZ2V0WW9sb01vZGVsKG1vZGVsSWQpO1xuICAgIGlmICghZGVmKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gWU9MTyBtb2RlbCBpZCBcIiR7bW9kZWxJZH1cIi5gKTtcbiAgICBpZiAoIWRlZi5tb2RlbFVybC50cmltKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgWU9MTyBtb2RlbCBcIiR7bW9kZWxJZH1cIiBpcyBub3QgY29uZmlndXJlZCDigJQgaXRzIG1vZGVsVXJsIGlzIGVtcHR5LmApO1xuICAgIH1cbiAgICByZXR1cm4gZGVmO1xuICB9XG59XG4iXX0=