@datagrok-libraries/utils 0.2.9 → 0.3.9

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.
Files changed (41) hide show
  1. package/.eslintrc.json +2 -1
  2. package/package.json +5 -4
  3. package/src/computation-view/common/inject-tokens.d.ts +10 -0
  4. package/src/computation-view/common/inject-tokens.d.ts.map +1 -0
  5. package/src/computation-view/common/inject-tokens.js +10 -0
  6. package/src/computation-view/common/service-interfaces.d.ts +40 -0
  7. package/src/computation-view/common/service-interfaces.d.ts.map +1 -0
  8. package/src/computation-view/common/service-interfaces.js +2 -0
  9. package/src/computation-view/computation-view.d.ts +30 -0
  10. package/src/computation-view/computation-view.d.ts.map +1 -0
  11. package/src/computation-view/computation-view.js +61 -0
  12. package/src/computation-view/default-components/export-component.d.ts +9 -0
  13. package/src/computation-view/default-components/export-component.d.ts.map +1 -0
  14. package/src/computation-view/default-components/export-component.js +26 -0
  15. package/src/computation-view/default-components/historical-run-load-component.d.ts +9 -0
  16. package/src/computation-view/default-components/historical-run-load-component.d.ts.map +1 -0
  17. package/src/computation-view/default-components/historical-run-load-component.js +37 -0
  18. package/src/computation-view/default-components/input-panel-component.d.ts +14 -0
  19. package/src/computation-view/default-components/input-panel-component.d.ts.map +1 -0
  20. package/src/computation-view/default-components/input-panel-component.js +40 -0
  21. package/src/computation-view/default-components/output-panel-component.d.ts +9 -0
  22. package/src/computation-view/default-components/output-panel-component.d.ts.map +1 -0
  23. package/src/computation-view/default-components/output-panel-component.js +23 -0
  24. package/src/computation-view/default-services/export-service.d.ts +16 -0
  25. package/src/computation-view/default-services/export-service.d.ts.map +1 -0
  26. package/src/computation-view/default-services/export-service.js +116 -0
  27. package/src/computation-view/default-services/historical-run-service.d.ts +8 -0
  28. package/src/computation-view/default-services/historical-run-service.d.ts.map +1 -0
  29. package/src/computation-view/default-services/historical-run-service.js +15 -0
  30. package/src/computation-view/default-services/state-service.d.ts +16 -0
  31. package/src/computation-view/default-services/state-service.d.ts.map +1 -0
  32. package/src/computation-view/default-services/state-service.js +40 -0
  33. package/src/function-view.d.ts +2 -2
  34. package/src/function-view.d.ts.map +1 -1
  35. package/src/function-view.js +1 -1
  36. package/src/similarity-metrics.d.ts +17 -0
  37. package/src/similarity-metrics.d.ts.map +1 -1
  38. package/src/similarity-metrics.js +59 -5
  39. package/src/computation-view.d.ts +0 -70
  40. package/src/computation-view.d.ts.map +0 -1
  41. package/src/computation-view.js +0 -135
@@ -1,135 +0,0 @@
1
- /* eslint-disable */
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- import * as grok from 'datagrok-api/grok';
12
- import * as rxjs from 'rxjs';
13
- import * as ui from 'datagrok-api/ui';
14
- import * as DG from 'datagrok-api/dg';
15
- import { FunctionView } from './function-view';
16
- /**
17
- * Base class for handling Compute models (see https://github.com/datagrok-ai/public/blob/master/help/compute/compute.md).
18
- * In most cases, the computation is a simple {@link Func}
19
- * Extend it in cases where a behavior or UI not supported by the {@link FunctionView} is needed.
20
- *
21
- * It provides the following functionality out-of-the-box, where each section could be customized:
22
- * - a structured way to represent input and output parameters: {@link parameters}
23
- * - generic way to generate UI for inputs, outputs, and interactivity (running the model, etc)
24
- * - persisting historical results to the db (via {@link parameters})
25
- * - export (to Excel and PDF): {@link export}
26
- * - easy loading of historical runs
27
- * - routing
28
- * - entering the real, measured (as opposed to predicted) values manually
29
- * - notifications for changing inputs, completion of computations, etc: {@link onInputChanged}
30
- * */
31
- export class ComputationView extends FunctionView {
32
- constructor(func) {
33
- super(func);
34
- this._inputFields = new Map();
35
- this.onViewInitialized = new rxjs.Subject();
36
- this.onInputChanged = new rxjs.Subject();
37
- this.onComputationStarted = new rxjs.Subject();
38
- this.onComputationCompleted = new rxjs.Subject();
39
- this.onComputationSucceeded = new rxjs.Subject();
40
- this.onComputationError = new rxjs.Subject();
41
- if (func != null)
42
- this.init(func).then((_) => {
43
- this.root.appendChild(this.build());
44
- this.initTopMenu(this.ribbonMenu);
45
- this.initRibbonPanels();
46
- return this.onViewInitialized.next();
47
- });
48
- }
49
- /** All inputs that are bound to fields */
50
- get inputFields() { return this._inputFields; }
51
- /** Saves the computation results to the historical results, returns its id. See also {@link loadRun}. */
52
- saveRun(call) {
53
- return __awaiter(this, void 0, void 0, function* () { return 'xxx'; /* await grok.dapi.functions.calls.save(call);*/ });
54
- }
55
- /** Loads the specified historical results. See also {@link saveRun}. */
56
- loadRun(runId) {
57
- return __awaiter(this, void 0, void 0, function* () { });
58
- }
59
- /** The actual computation function. */
60
- compute(call) {
61
- return __awaiter(this, void 0, void 0, function* () { yield call.call(); });
62
- }
63
- /** Maps inputs to parameters, computes, and maps output parameters to the UI. */
64
- run() {
65
- return __awaiter(this, void 0, void 0, function* () {
66
- this.lastCall = this.call.clone();
67
- this.inputFieldsToParameters(this.lastCall);
68
- try {
69
- yield this.compute(this.lastCall);
70
- }
71
- catch (e) {
72
- this.onComputationError.next(this.lastCall);
73
- }
74
- this.outputParametersToView(this.lastCall);
75
- });
76
- }
77
- /** Override to provide custom initialization. {@link onViewInitialized} gets fired after that. */
78
- init(func) {
79
- const _super = Object.create(null, {
80
- init: { get: () => super.init }
81
- });
82
- return __awaiter(this, void 0, void 0, function* () { yield _super.init.call(this, func); });
83
- }
84
- /** Override to customize top menu*/
85
- initTopMenu(menu) {
86
- menu
87
- .group(this.func.friendlyName)
88
- .item('Run', () => this.run());
89
- }
90
- /** Override to customize ribbon panels */
91
- initRibbonPanels() {
92
- this.setRibbonPanels([[
93
- ui.bigButton('RUN', () => this.run()),
94
- ui.comboPopup(ui.icons.save(null, 'Export'), this.supportedExportFormats, (format) => __awaiter(this, void 0, void 0, function* () { return DG.Utils.download('output.csv', yield this.export(format)); })),
95
- ]]);
96
- }
97
- /** Builds the complete view. Override it if completely custom implementation is needed,
98
- * otherwise consider overriding {@link buildInputBlock} and/or {@link buildOutputBlock} */
99
- build() { return ui.splitH([this.buildInputBlock(), this.buildOutputBlock()]); }
100
- /** Override to build completely custom input block (the one with inputs, usually on the left).
101
- * If only specific field, consider overriding {@link buildCustomInputs}. */
102
- buildInputBlock() {
103
- return super.buildInputBlock();
104
- }
105
- /** Custom inputs for the specified fields. Inputs for these fields will not be created by {@link buildInputBlock}. */
106
- buildCustomInputs() { return new Map(); }
107
- /** Override to create output block. */
108
- buildOutputBlock() { return super.buildOutputBlock(); }
109
- /** Override to create a custom input control. */
110
- buildRibbonPanel() {
111
- return ui.divH([
112
- ui.button('RUN', () => { }),
113
- ui.comboPopup('Export', this.supportedExportFormats, (format) => this.export(format))
114
- ]);
115
- }
116
- /** Creates function parameters based on the data entered by the user. */
117
- inputFieldsToParameters(call) { super.inputFieldsToParameters(call); }
118
- /** Visualizes computation results */
119
- outputParametersToView(call) { super.outputParametersToView(call); }
120
- /** Override to provide custom computation error handling. */
121
- processComputationError(call) { grok.shell.error(call.errorMessage); }
122
- /** Override to provide supported export formats.
123
- * These formats are available under the "Export" popup on the ribbon panel. */
124
- get supportedExportFormats() { return ['Excel', 'PDF', 'CSV']; }
125
- /** Override to provide custom export. */
126
- export(format) {
127
- var _a;
128
- return __awaiter(this, void 0, void 0, function* () {
129
- if (format == 'CSV')
130
- return new Blob([((_a = this.lastCall) === null || _a === void 0 ? void 0 : _a.getOutputParamValue()).toCsv()]);
131
- throw `Format "${format}" is not supported.`;
132
- });
133
- }
134
- }
135
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHV0YXRpb24tdmlldy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvbXB1dGF0aW9uLXZpZXcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9COzs7Ozs7Ozs7O0FBRXBCLE9BQU8sS0FBSyxJQUFJLE1BQU0sbUJBQW1CLENBQUM7QUFDMUMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUU3Qzs7Ozs7Ozs7Ozs7Ozs7S0FjSztBQUNMLE1BQU0sT0FBTyxlQUFnQixTQUFRLFlBQVk7SUFZL0MsWUFBWSxJQUFhO1FBQ3ZCLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQVZkLGlCQUFZLEdBQThCLElBQUksR0FBRyxFQUF3QixDQUFDO1FBRTFFLHNCQUFpQixHQUF1QixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMzRCxtQkFBYyxHQUF1QixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN4RCx5QkFBb0IsR0FBMkIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbEUsMkJBQXNCLEdBQTJCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BFLDJCQUFzQixHQUEyQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNwRSx1QkFBa0IsR0FBMkIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFLOUQsSUFBSSxJQUFJLElBQUksSUFBSTtZQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUks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Iiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgKi9cblxuaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgKiBhcyByeGpzIGZyb20gJ3J4anMnO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQge0RhdGFGcmFtZSwgRnVuY0NhbGx9IGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQge0Z1bmN0aW9uVmlld30gZnJvbSAnLi9mdW5jdGlvbi12aWV3JztcblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBoYW5kbGluZyBDb21wdXRlIG1vZGVscyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRhZ3Jvay1haS9wdWJsaWMvYmxvYi9tYXN0ZXIvaGVscC9jb21wdXRlL2NvbXB1dGUubWQpLlxuICogSW4gbW9zdCBjYXNlcywgdGhlIGNvbXB1dGF0aW9uIGlzIGEgc2ltcGxlIHtAbGluayBGdW5jfVxuICogRXh0ZW5kIGl0IGluIGNhc2VzIHdoZXJlIGEgYmVoYXZpb3Igb3IgVUkgbm90IHN1cHBvcnRlZCBieSB0aGUge0BsaW5rIEZ1bmN0aW9uVmlld30gaXMgbmVlZGVkLlxuICpcbiAqIEl0IHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25hbGl0eSBvdXQtb2YtdGhlLWJveCwgd2hlcmUgZWFjaCBzZWN0aW9uIGNvdWxkIGJlIGN1c3RvbWl6ZWQ6XG4gKiAtIGEgc3RydWN0dXJlZCB3YXkgdG8gcmVwcmVzZW50IGlucHV0IGFuZCBvdXRwdXQgcGFyYW1ldGVyczoge0BsaW5rIHBhcmFtZXRlcnN9XG4gKiAtIGdlbmVyaWMgd2F5IHRvIGdlbmVyYXRlIFVJIGZvciBpbnB1dHMsIG91dHB1dHMsIGFuZCBpbnRlcmFjdGl2aXR5IChydW5uaW5nIHRoZSBtb2RlbCwgZXRjKVxuICogICAtIHBlcnNpc3RpbmcgaGlzdG9yaWNhbCByZXN1bHRzIHRvIHRoZSBkYiAodmlhIHtAbGluayBwYXJhbWV0ZXJzfSlcbiAqIC0gZXhwb3J0ICh0byBFeGNlbCBhbmQgUERGKToge0BsaW5rIGV4cG9ydH1cbiAqIC0gZWFzeSBsb2FkaW5nIG9mIGhpc3RvcmljYWwgcnVuc1xuICogLSByb3V0aW5nXG4gKiAtIGVudGVyaW5nIHRoZSByZWFsLCBtZWFzdXJlZCAoYXMgb3Bwb3NlZCB0byBwcmVkaWN0ZWQpIHZhbHVlcyBtYW51YWxseVxuICogLSBub3RpZmljYXRpb25zIGZvciBjaGFuZ2luZyBpbnB1dHMsIGNvbXBsZXRpb24gb2YgY29tcHV0YXRpb25zLCBldGM6IHtAbGluayBvbklucHV0Q2hhbmdlZH1cbiAqICovXG5leHBvcnQgY2xhc3MgQ29tcHV0YXRpb25WaWV3IGV4dGVuZHMgRnVuY3Rpb25WaWV3IHtcblxuICBsYXN0Q2FsbD86IERHLkZ1bmNDYWxsO1xuICBfaW5wdXRGaWVsZHM6IE1hcDxzdHJpbmcsIERHLklucHV0QmFzZT4gPSBuZXcgTWFwPHN0cmluZywgREcuSW5wdXRCYXNlPigpO1xuXG4gIG9uVmlld0luaXRpYWxpemVkOiByeGpzLlN1YmplY3Q8dm9pZD4gPSBuZXcgcnhqcy5TdWJqZWN0KCk7XG4gIG9uSW5wdXRDaGFuZ2VkOiByeGpzLlN1YmplY3Q8dm9pZD4gPSBuZXcgcnhqcy5TdWJqZWN0KCk7XG4gIG9uQ29tcHV0YXRpb25TdGFydGVkOiByeGpzLlN1YmplY3Q8RnVuY0NhbGw+ID0gbmV3IHJ4anMuU3ViamVjdCgpO1xuICBvbkNvbXB1dGF0aW9uQ29tcGxldGVkOiByeGpzLlN1YmplY3Q8RnVuY0NhbGw+ID0gbmV3IHJ4anMuU3ViamVjdCgpO1xuICBvbkNvbXB1dGF0aW9uU3VjY2VlZGVkOiByeGpzLlN1YmplY3Q8RnVuY0NhbGw+ID0gbmV3IHJ4anMuU3ViamVjdCgpO1xuICBvbkNvbXB1dGF0aW9uRXJyb3I6IHJ4anMuU3ViamVjdDxGdW5jQ2FsbD4gPSBuZXcgcnhqcy5TdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IoZnVuYzogREcuRnVuYykge1xuICAgIHN1cGVyKGZ1bmMpO1xuXG4gICAgaWYgKGZ1bmMgIT0gbnVsbClcbiAgICAgIHRoaXMuaW5pdChmdW5jKS50aGVuKChfKSA9PiB7XG4gICAgICAgIHRoaXMucm9vdC5hcHBlbmRDaGlsZCh0aGlzLmJ1aWxkKCkpO1xuICAgICAgICB0aGlzLmluaXRUb3BNZW51KHRoaXMucmliYm9uTWVudSk7XG4gICAgICAgIHRoaXMuaW5pdFJpYmJvblBhbmVscygpO1xuICAgICAgICByZXR1cm4gdGhpcy5vblZpZXdJbml0aWFsaXplZC5uZXh0KCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKiBBbGwgaW5wdXRzIHRoYXQgYXJlIGJvdW5kIHRvIGZpZWxkcyAqL1xuICBnZXQgaW5wdXRGaWVsZHMoKTogTWFwPHN0cmluZywgREcuSW5wdXRCYXNlPiB7IHJldHVybiB0aGlzLl9pbnB1dEZpZWxkczsgfVxuXG4gIC8qKiBTYXZlcyB0aGUgY29tcHV0YXRpb24gcmVzdWx0cyB0byB0aGUgaGlzdG9yaWNhbCByZXN1bHRzLCByZXR1cm5zIGl0cyBpZC4gU2VlIGFsc28ge0BsaW5rIGxvYWRSdW59LiAqL1xuICBhc3luYyBzYXZlUnVuKGNhbGw6IEZ1bmNDYWxsKTogUHJvbWlzZTxzdHJpbmc+IHsgcmV0dXJuICd4eHgnOyAvKiBhd2FpdCBncm9rLmRhcGkuZnVuY3Rpb25zLmNhbGxzLnNhdmUoY2FsbCk7Ki8gfVxuXG4gIC8qKiBMb2FkcyB0aGUgc3BlY2lmaWVkIGhpc3RvcmljYWwgcmVzdWx0cy4gU2VlIGFsc28ge0BsaW5rIHNhdmVSdW59LiAqL1xuICBhc3luYyBsb2FkUnVuKHJ1bklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHsgLyogYXdhaXQgZ3Jvay5kYXBpLmZ1bmN0aW9ucy5jYWxscy5maW5kKGNhbGwuaWQpOyovfVxuXG4gIC8qKiBUaGUgYWN0dWFsIGNvbXB1dGF0aW9uIGZ1bmN0aW9uLiAqL1xuICBhc3luYyBjb21wdXRlKGNhbGw6IEZ1bmNDYWxsKTogUHJvbWlzZTx2b2lkPiB7IGF3YWl0IGNhbGwuY2FsbCgpOyB9XG5cbiAgLyoqIE1hcHMgaW5wdXRzIHRvIHBhcmFtZXRlcnMsIGNvbXB1dGVzLCBhbmQgbWFwcyBvdXRwdXQgcGFyYW1ldGVycyB0byB0aGUgVUkuICovXG4gIGFzeW5jIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxhc3RDYWxsID0gdGhpcy5jYWxsIS5jbG9uZSgpO1xuICAgIHRoaXMuaW5wdXRGaWVsZHNUb1BhcmFtZXRlcnModGhpcy5sYXN0Q2FsbCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jb21wdXRlKHRoaXMubGFzdENhbGwpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5vbkNvbXB1dGF0aW9uRXJyb3IubmV4dCh0aGlzLmxhc3RDYWxsKTtcbiAgICB9XG5cbiAgICB0aGlzLm91dHB1dFBhcmFtZXRlcnNUb1ZpZXcodGhpcy5sYXN0Q2FsbCk7XG4gIH1cblxuICAvKiogT3ZlcnJpZGUgdG8gcHJvdmlkZSBjdXN0b20gaW5pdGlhbGl6YXRpb24uIHtAbGluayBvblZpZXdJbml0aWFsaXplZH0gZ2V0cyBmaXJlZCBhZnRlciB0aGF0LiAqL1xuICBhc3luYyBpbml0KGZ1bmM6IERHLkZ1bmMpOiBQcm9taXNlPHZvaWQ+IHsgYXdhaXQgc3VwZXIuaW5pdChmdW5jKTsgfVxuXG4gIC8qKiBPdmVycmlkZSB0byBjdXN0b21pemUgdG9wIG1lbnUqL1xuICBpbml0VG9wTWVudShtZW51OiBERy5NZW51KSB7XG4gICAgbWVudVxuICAgICAgLmdyb3VwKHRoaXMuZnVuYy5mcmllbmRseU5hbWUpXG4gICAgICAuaXRlbSgnUnVuJywgKCkgPT4gdGhpcy5ydW4oKSk7XG4gIH1cblxuICAvKiogT3ZlcnJpZGUgdG8gY3VzdG9taXplIHJpYmJvbiBwYW5lbHMgKi9cbiAgaW5pdFJpYmJvblBhbmVscygpIHtcbiAgICB0aGlzLnNldFJpYmJvblBhbmVscyhbW1xuICAgICAgdWkuYmlnQnV0dG9uKCdSVU4nLCAoKSA9PiB0aGlzLnJ1bigpKSxcbiAgICAgIHVpLmNvbWJvUG9wdXAoXG4gICAgICAgIHVpLmljb25zLnNhdmUobnVsbCwgJ0V4cG9ydCcpLFxuICAgICAgICB0aGlzLnN1cHBvcnRlZEV4cG9ydEZvcm1hdHMsXG4gICAgICAgIGFzeW5jIChmb3JtYXQpID0+IERHLlV0aWxzLmRvd25sb2FkKCdvdXRwdXQuY3N2JywgYXdhaXQgdGhpcy5leHBvcnQoZm9ybWF0KSksXG4gICAgICApLFxuICAgIF1dKTtcbiAgfVxuXG4gIC8qKiBCdWlsZHMgdGhlIGNvbXBsZXRlIHZpZXcuIE92ZXJyaWRlIGl0IGlmIGNvbXBsZXRlbHkgY3VzdG9tIGltcGxlbWVudGF0aW9uIGlzIG5lZWRlZCxcbiAgICogb3RoZXJ3aXNlIGNvbnNpZGVyIG92ZXJyaWRpbmcge0BsaW5rIGJ1aWxkSW5wdXRCbG9ja30gYW5kL29yIHtAbGluayBidWlsZE91dHB1dEJsb2NrfSAqL1xuICBidWlsZCgpOiBIVE1MRWxlbWVudCB7cmV0dXJuIHVpLnNwbGl0SChbdGhpcy5idWlsZElucHV0QmxvY2soKSwgdGhpcy5idWlsZE91dHB1dEJsb2NrKCldKTt9XG5cbiAgLyoqIE92ZXJyaWRlIHRvIGJ1aWxkIGNvbXBsZXRlbHkgY3VzdG9tIGlucHV0IGJsb2NrICh0aGUgb25lIHdpdGggaW5wdXRzLCB1c3VhbGx5IG9uIHRoZSBsZWZ0KS5cbiAgICogSWYgb25seSBzcGVjaWZpYyBmaWVsZCwgY29uc2lkZXIgb3ZlcnJpZGluZyB7QGxpbmsgYnVpbGRDdXN0b21JbnB1dHN9LiAqL1xuICBidWlsZElucHV0QmxvY2soKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiBzdXBlci5idWlsZElucHV0QmxvY2soKTtcbiAgfVxuXG4gIC8qKiBDdXN0b20gaW5wdXRzIGZvciB0aGUgc3BlY2lmaWVkIGZpZWxkcy4gSW5wdXRzIGZvciB0aGVzZSBmaWVsZHMgd2lsbCBub3QgYmUgY3JlYXRlZCBieSB7QGxpbmsgYnVpbGRJbnB1dEJsb2NrfS4gKi9cbiAgYnVpbGRDdXN0b21JbnB1dHMoKTogTWFwPFN0cmluZywgREcuSW5wdXRCYXNlPiB7IHJldHVybiBuZXcgTWFwKCk7IH1cblxuICAvKiogT3ZlcnJpZGUgdG8gY3JlYXRlIG91dHB1dCBibG9jay4gKi9cbiAgYnVpbGRPdXRwdXRCbG9jaygpOiBIVE1MRWxlbWVudCB7IHJldHVybiBzdXBlci5idWlsZE91dHB1dEJsb2NrKCk7IH1cblxuICAvKiogT3ZlcnJpZGUgdG8gY3JlYXRlIGEgY3VzdG9tIGlucHV0IGNvbnRyb2wuICovXG4gIGJ1aWxkUmliYm9uUGFuZWwoKTogSFRNTEVsZW1lbnQgeyByZXR1cm4gdWkuZGl2SChbXG4gICAgdWkuYnV0dG9uKCdSVU4nLCAoKSA9PiB7fSksXG4gICAgdWkuY29tYm9Qb3B1cCgnRXhwb3J0JywgdGhpcy5zdXBwb3J0ZWRFeHBvcnRGb3JtYXRzLCAoZm9ybWF0KSA9PiB0aGlzLmV4cG9ydChmb3JtYXQpKV0pO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgZnVuY3Rpb24gcGFyYW1ldGVycyBiYXNlZCBvbiB0aGUgZGF0YSBlbnRlcmVkIGJ5IHRoZSB1c2VyLiAqL1xuICBpbnB1dEZpZWxkc1RvUGFyYW1ldGVycyhjYWxsOiBGdW5jQ2FsbCk6IHZvaWQgeyBzdXBlci5pbnB1dEZpZWxkc1RvUGFyYW1ldGVycyhjYWxsKTsgfVxuXG4gIC8qKiBWaXN1YWxpemVzIGNvbXB1dGF0aW9uIHJlc3VsdHMgKi9cbiAgb3V0cHV0UGFyYW1ldGVyc1RvVmlldyhjYWxsOiBGdW5jQ2FsbCk6IHZvaWQgeyBzdXBlci5vdXRwdXRQYXJhbWV0ZXJzVG9WaWV3KGNhbGwpOyB9XG5cbiAgLyoqIE92ZXJyaWRlIHRvIHByb3ZpZGUgY3VzdG9tIGNvbXB1dGF0aW9uIGVycm9yIGhhbmRsaW5nLiAqL1xuICBwcm9jZXNzQ29tcHV0YXRpb25FcnJvcihjYWxsOiBGdW5jQ2FsbCkgeyBncm9rLnNoZWxsLmVycm9yKGNhbGwuZXJyb3JNZXNzYWdlISk7ICB9XG5cbiAgLyoqIE92ZXJyaWRlIHRvIHByb3ZpZGUgc3VwcG9ydGVkIGV4cG9ydCBmb3JtYXRzLlxuICAgKiBUaGVzZSBmb3JtYXRzIGFyZSBhdmFpbGFibGUgdW5kZXIgdGhlIFwiRXhwb3J0XCIgcG9wdXAgb24gdGhlIHJpYmJvbiBwYW5lbC4gKi9cbiAgZ2V0IHN1cHBvcnRlZEV4cG9ydEZvcm1hdHMoKTogc3RyaW5nW10geyByZXR1cm4gWydFeGNlbCcsICdQREYnLCAnQ1NWJ107IH1cblxuICAvKiogT3ZlcnJpZGUgdG8gcHJvdmlkZSBjdXN0b20gZXhwb3J0LiAqL1xuICBhc3luYyBleHBvcnQoZm9ybWF0OiBzdHJpbmcpOiBQcm9taXNlPEJsb2I+IHtcbiAgICBpZiAoZm9ybWF0ID09ICdDU1YnKVxuICAgICAgcmV0dXJuIG5ldyBCbG9iKFsodGhpcy5sYXN0Q2FsbD8uZ2V0T3V0cHV0UGFyYW1WYWx1ZSgpIGFzIERhdGFGcmFtZSkudG9Dc3YoKV0pO1xuICAgIHRocm93IGBGb3JtYXQgXCIke2Zvcm1hdH1cIiBpcyBub3Qgc3VwcG9ydGVkLmA7XG4gIH1cbn0iXX0=