@dynatrace/rum-javascript-sdk 1.333.12 → 1.335.1

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 (31) hide show
  1. package/dist/api/interactions.d.ts +22 -0
  2. package/dist/api/interactions.js +48 -0
  3. package/dist/api/promises/interactions.d.ts +15 -0
  4. package/dist/api/promises/interactions.js +19 -0
  5. package/dist/api/promises/wait-for-interactions.d.ts +9 -0
  6. package/dist/api/promises/wait-for-interactions.js +18 -0
  7. package/dist/testing/index.d.ts +3 -1
  8. package/dist/testing/index.js +1 -1
  9. package/dist/testing/install.js +1 -1
  10. package/dist/testing/test.d.ts +1 -119
  11. package/dist/testing/test.js +12 -11
  12. package/dist/testing/types/dynatrace-config.d.ts +36 -0
  13. package/dist/testing/types/dynatrace-config.js +2 -0
  14. package/dist/testing/types/dynatrace-testing-fixtures.d.ts +24 -0
  15. package/dist/testing/types/dynatrace-testing-fixtures.js +2 -0
  16. package/dist/testing/types/dynatrace-testing.d.ts +66 -0
  17. package/dist/testing/types/dynatrace-testing.js +2 -0
  18. package/dist/types/api/dynatrace-api-types.d.ts +91 -1
  19. package/dist/types/api/dynatrace-api-types.js +1 -1
  20. package/dist/types/rum-events/json-event.d.ts +1 -1
  21. package/dist/types/rum-events/json-event.js +1 -1
  22. package/dist/types/rum-events/rum-internal-selfmonitoring-event.d.ts +4 -0
  23. package/dist/types/rum-events/rum-internal-selfmonitoring-event.js +5 -1
  24. package/dist/types/rum-events/rum-user-interaction-event.d.ts +17 -0
  25. package/dist/types/rum-events/rum-user-interaction-event.js +19 -1
  26. package/docs/1-overview.md +41 -0
  27. package/docs/2-testing.md +3 -3
  28. package/docs/3-types.md +1 -0
  29. package/docs/4-useractions.md +1 -1
  30. package/docs/5-interactions.md +60 -0
  31. package/package.json +19 -3
@@ -0,0 +1,22 @@
1
+ import type { SendUserInteractionFields } from "../types/index.js";
2
+ /**
3
+ * Safe wrapper for {@link dynatrace.interactions.sendKeyPressEvent} which reverts to a noop if RUM JavaScript or the
4
+ * interactions module is not available.
5
+ *
6
+ * @param fields The interaction fields. Must contain a `keys` array with at least one key.
7
+ * The fields object must be JSON-serializable. Optional `ui_element.custom_name` and
8
+ * `event_properties.*` entries are allowed. See {@link SendUserInteractionFields} for details.
9
+ * @param elementOrEvent An optional {@link Element} or {@link KeyboardEvent} used to auto-generate UI element fields.
10
+ * When a {@link KeyboardEvent} is provided, the target element is resolved from the event.
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * import * as interactions from "@dynatrace/rum-javascript-sdk/api/interactions";
15
+ * import { UserInteractionSpecialKey } from "@dynatrace/rum-javascript-sdk/types/rum-events";
16
+ *
17
+ * interactions.sendKeyPressEvent({
18
+ * keys: [UserInteractionSpecialKey.CTRL, "S"]
19
+ * });
20
+ * ```
21
+ */
22
+ export declare function sendKeyPressEvent(fields: SendUserInteractionFields, elementOrEvent?: Element | Event): void;
@@ -0,0 +1,48 @@
1
+ import { getGlobal } from "./global-adapter.js";
2
+ import { isValidAgent } from "./type-guards/is-valid-agent.js";
3
+ import { log } from "./logging.js";
4
+ /**
5
+ * Safe wrapper for {@link dynatrace.interactions.sendKeyPressEvent} which reverts to a noop if RUM JavaScript or the
6
+ * interactions module is not available.
7
+ *
8
+ * @param fields The interaction fields. Must contain a `keys` array with at least one key.
9
+ * The fields object must be JSON-serializable. Optional `ui_element.custom_name` and
10
+ * `event_properties.*` entries are allowed. See {@link SendUserInteractionFields} for details.
11
+ * @param elementOrEvent An optional {@link Element} or {@link KeyboardEvent} used to auto-generate UI element fields.
12
+ * When a {@link KeyboardEvent} is provided, the target element is resolved from the event.
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * import * as interactions from "@dynatrace/rum-javascript-sdk/api/interactions";
17
+ * import { UserInteractionSpecialKey } from "@dynatrace/rum-javascript-sdk/types/rum-events";
18
+ *
19
+ * interactions.sendKeyPressEvent({
20
+ * keys: [UserInteractionSpecialKey.CTRL, "S"]
21
+ * });
22
+ * ```
23
+ */
24
+ export function sendKeyPressEvent(fields, elementOrEvent) {
25
+ guardInteractions((interactions) => {
26
+ interactions.sendKeyPressEvent(fields, elementOrEvent);
27
+ });
28
+ }
29
+ /**
30
+ * Safe wrapper for various interactions API functions which reverts to a noop if RUM JavaScript or the
31
+ * interactions module is not available.
32
+ *
33
+ * @param fn The function to be executed if the interactions module is available.
34
+ * @returns The result of the provided function call if the interactions module is available, otherwise undefined.
35
+ */
36
+ function guardInteractions(fn) {
37
+ const globalDt = getGlobal("dynatrace");
38
+ if (!isValidAgent(globalDt)) {
39
+ log("dynatrace is not available");
40
+ return void 0;
41
+ }
42
+ if (!globalDt.interactions) {
43
+ log("dynatrace.interactions module is not available");
44
+ return void 0;
45
+ }
46
+ return fn(globalDt.interactions);
47
+ }
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJhY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2FwaS9pbnRlcmFjdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRW5DOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLE1BQWlDLEVBQUUsY0FBZ0M7SUFDakcsaUJBQWlCLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRTtRQUMvQixZQUFZLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQzNELENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsaUJBQWlCLENBQWdELEVBQUs7SUFDM0UsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3hDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUMxQixHQUFHLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUNsQyxPQUFPLEtBQUssQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3pCLEdBQUcsQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO1FBQ3RELE9BQU8sS0FBSyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUVELE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuICAgIEludGVyYWN0aW9ucyxcbiAgICBTZW5kVXNlckludGVyYWN0aW9uRmllbGRzXG59IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZ2V0R2xvYmFsIH0gZnJvbSBcIi4vZ2xvYmFsLWFkYXB0ZXIuanNcIjtcbmltcG9ydCB7IGlzVmFsaWRBZ2VudCB9IGZyb20gXCIuL3R5cGUtZ3VhcmRzL2lzLXZhbGlkLWFnZW50LmpzXCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiLi9sb2dnaW5nLmpzXCI7XG5cbi8qKlxuICogU2FmZSB3cmFwcGVyIGZvciB7QGxpbmsgZHluYXRyYWNlLmludGVyYWN0aW9ucy5zZW5kS2V5UHJlc3NFdmVudH0gd2hpY2ggcmV2ZXJ0cyB0byBhIG5vb3AgaWYgUlVNIEphdmFTY3JpcHQgb3IgdGhlXG4gKiBpbnRlcmFjdGlvbnMgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUuXG4gKlxuICogQHBhcmFtIGZpZWxkcyAgICAgICAgIFRoZSBpbnRlcmFjdGlvbiBmaWVsZHMuIE11c3QgY29udGFpbiBhIGBrZXlzYCBhcnJheSB3aXRoIGF0IGxlYXN0IG9uZSBrZXkuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgVGhlIGZpZWxkcyBvYmplY3QgbXVzdCBiZSBKU09OLXNlcmlhbGl6YWJsZS4gT3B0aW9uYWwgYHVpX2VsZW1lbnQuY3VzdG9tX25hbWVgIGFuZFxuICogICAgICAgICAgICAgICAgICAgICAgIGBldmVudF9wcm9wZXJ0aWVzLipgIGVudHJpZXMgYXJlIGFsbG93ZWQuIFNlZSB7QGxpbmsgU2VuZFVzZXJJbnRlcmFjdGlvbkZpZWxkc30gZm9yIGRldGFpbHMuXG4gKiBAcGFyYW0gZWxlbWVudE9yRXZlbnQgQW4gb3B0aW9uYWwge0BsaW5rIEVsZW1lbnR9IG9yIHtAbGluayBLZXlib2FyZEV2ZW50fSB1c2VkIHRvIGF1dG8tZ2VuZXJhdGUgVUkgZWxlbWVudCBmaWVsZHMuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgV2hlbiBhIHtAbGluayBLZXlib2FyZEV2ZW50fSBpcyBwcm92aWRlZCwgdGhlIHRhcmdldCBlbGVtZW50IGlzIHJlc29sdmVkIGZyb20gdGhlIGV2ZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgKiBhcyBpbnRlcmFjdGlvbnMgZnJvbSBcIkBkeW5hdHJhY2UvcnVtLWphdmFzY3JpcHQtc2RrL2FwaS9pbnRlcmFjdGlvbnNcIjtcbiAqIGltcG9ydCB7IFVzZXJJbnRlcmFjdGlvblNwZWNpYWxLZXkgfSBmcm9tIFwiQGR5bmF0cmFjZS9ydW0tamF2YXNjcmlwdC1zZGsvdHlwZXMvcnVtLWV2ZW50c1wiO1xuICpcbiAqIGludGVyYWN0aW9ucy5zZW5kS2V5UHJlc3NFdmVudCh7XG4gKiAgICAga2V5czogW1VzZXJJbnRlcmFjdGlvblNwZWNpYWxLZXkuQ1RSTCwgXCJTXCJdXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VuZEtleVByZXNzRXZlbnQoZmllbGRzOiBTZW5kVXNlckludGVyYWN0aW9uRmllbGRzLCBlbGVtZW50T3JFdmVudD86IEVsZW1lbnQgfCBFdmVudCk6IHZvaWQge1xuICAgIGd1YXJkSW50ZXJhY3Rpb25zKChpbnRlcmFjdGlvbnMpID0+IHtcbiAgICAgICAgaW50ZXJhY3Rpb25zLnNlbmRLZXlQcmVzc0V2ZW50KGZpZWxkcywgZWxlbWVudE9yRXZlbnQpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIFNhZmUgd3JhcHBlciBmb3IgdmFyaW91cyBpbnRlcmFjdGlvbnMgQVBJIGZ1bmN0aW9ucyB3aGljaCByZXZlcnRzIHRvIGEgbm9vcCBpZiBSVU0gSmF2YVNjcmlwdCBvciB0aGVcbiAqIGludGVyYWN0aW9ucyBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZS5cbiAqXG4gKiBAcGFyYW0gZm4gVGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGlmIHRoZSBpbnRlcmFjdGlvbnMgbW9kdWxlIGlzIGF2YWlsYWJsZS5cbiAqIEByZXR1cm5zICBUaGUgcmVzdWx0IG9mIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBjYWxsIGlmIHRoZSBpbnRlcmFjdGlvbnMgbW9kdWxlIGlzIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHVuZGVmaW5lZC5cbiAqL1xuZnVuY3Rpb24gZ3VhcmRJbnRlcmFjdGlvbnM8VCBleHRlbmRzIChpbnRlcmFjdGlvbnM6IEludGVyYWN0aW9ucykgPT4gYW55PihmbjogVCk6IFJldHVyblR5cGU8VD4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGdsb2JhbER0ID0gZ2V0R2xvYmFsKFwiZHluYXRyYWNlXCIpO1xuICAgIGlmICghaXNWYWxpZEFnZW50KGdsb2JhbER0KSkge1xuICAgICAgICBsb2coXCJkeW5hdHJhY2UgaXMgbm90IGF2YWlsYWJsZVwiKTtcbiAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICB9XG5cbiAgICBpZiAoIWdsb2JhbER0LmludGVyYWN0aW9ucykge1xuICAgICAgICBsb2coXCJkeW5hdHJhY2UuaW50ZXJhY3Rpb25zIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlXCIpO1xuICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cblxuICAgIHJldHVybiBmbihnbG9iYWxEdC5pbnRlcmFjdGlvbnMpO1xufVxuIl19
@@ -0,0 +1,15 @@
1
+ import type { SendUserInteractionFields } from "../../types/index.js";
2
+ /**
3
+ * Async wrapper for {@link dynatrace.interactions.sendKeyPressEvent}.
4
+ * This function is only available if the User Interaction module is enabled.
5
+ *
6
+ * @param fields The interaction fields. Must contain a `keys` array with at least one key.
7
+ * The fields object must be JSON-serializable. Optional `ui_element.custom_name` and
8
+ * `event_properties.*` entries are allowed. See {@link SendUserInteractionFields} for details.
9
+ * @param elementOrEvent An optional {@link Element} or {@link KeyboardEvent} used to auto-generate UI element fields.
10
+ * When a {@link KeyboardEvent} is provided, the target element is resolved from the event.
11
+ * @param timeout Timeout in milliseconds to wait for the RUM JavaScript to be available (default: 10000)
12
+ * @throws A {@link DynatraceError} if the RUM JavaScript or User Interaction module is not available
13
+ * within the timeout, or the namespace is overridden with an incompatible object
14
+ */
15
+ export declare function sendKeyPressEvent(fields: SendUserInteractionFields, elementOrEvent?: Element | Event, timeout?: number): Promise<void>;
@@ -0,0 +1,19 @@
1
+ import { waitForInteractions } from "./wait-for-interactions.js";
2
+ /**
3
+ * Async wrapper for {@link dynatrace.interactions.sendKeyPressEvent}.
4
+ * This function is only available if the User Interaction module is enabled.
5
+ *
6
+ * @param fields The interaction fields. Must contain a `keys` array with at least one key.
7
+ * The fields object must be JSON-serializable. Optional `ui_element.custom_name` and
8
+ * `event_properties.*` entries are allowed. See {@link SendUserInteractionFields} for details.
9
+ * @param elementOrEvent An optional {@link Element} or {@link KeyboardEvent} used to auto-generate UI element fields.
10
+ * When a {@link KeyboardEvent} is provided, the target element is resolved from the event.
11
+ * @param timeout Timeout in milliseconds to wait for the RUM JavaScript to be available (default: 10000)
12
+ * @throws A {@link DynatraceError} if the RUM JavaScript or User Interaction module is not available
13
+ * within the timeout, or the namespace is overridden with an incompatible object
14
+ */
15
+ export async function sendKeyPressEvent(fields, elementOrEvent, timeout = 10_000) {
16
+ const interactions = await waitForInteractions(timeout);
17
+ interactions.sendKeyPressEvent(fields, elementOrEvent);
18
+ }
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJhY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc291cmNlL2FwaS9wcm9taXNlcy9pbnRlcmFjdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFakU7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxpQkFBaUIsQ0FDbkMsTUFBaUMsRUFDakMsY0FBZ0MsRUFDaEMsVUFBa0IsTUFBTTtJQUV4QixNQUFNLFlBQVksR0FBRyxNQUFNLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hELFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDM0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU2VuZFVzZXJJbnRlcmFjdGlvbkZpZWxkcyB9IGZyb20gXCIuLi8uLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgd2FpdEZvckludGVyYWN0aW9ucyB9IGZyb20gXCIuL3dhaXQtZm9yLWludGVyYWN0aW9ucy5qc1wiO1xuXG4vKipcbiAqIEFzeW5jIHdyYXBwZXIgZm9yIHtAbGluayBkeW5hdHJhY2UuaW50ZXJhY3Rpb25zLnNlbmRLZXlQcmVzc0V2ZW50fS5cbiAqIFRoaXMgZnVuY3Rpb24gaXMgb25seSBhdmFpbGFibGUgaWYgdGhlIFVzZXIgSW50ZXJhY3Rpb24gbW9kdWxlIGlzIGVuYWJsZWQuXG4gKlxuICogQHBhcmFtIGZpZWxkcyAgICAgICAgIFRoZSBpbnRlcmFjdGlvbiBmaWVsZHMuIE11c3QgY29udGFpbiBhIGBrZXlzYCBhcnJheSB3aXRoIGF0IGxlYXN0IG9uZSBrZXkuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgVGhlIGZpZWxkcyBvYmplY3QgbXVzdCBiZSBKU09OLXNlcmlhbGl6YWJsZS4gT3B0aW9uYWwgYHVpX2VsZW1lbnQuY3VzdG9tX25hbWVgIGFuZFxuICogICAgICAgICAgICAgICAgICAgICAgIGBldmVudF9wcm9wZXJ0aWVzLipgIGVudHJpZXMgYXJlIGFsbG93ZWQuIFNlZSB7QGxpbmsgU2VuZFVzZXJJbnRlcmFjdGlvbkZpZWxkc30gZm9yIGRldGFpbHMuXG4gKiBAcGFyYW0gZWxlbWVudE9yRXZlbnQgQW4gb3B0aW9uYWwge0BsaW5rIEVsZW1lbnR9IG9yIHtAbGluayBLZXlib2FyZEV2ZW50fSB1c2VkIHRvIGF1dG8tZ2VuZXJhdGUgVUkgZWxlbWVudCBmaWVsZHMuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgV2hlbiBhIHtAbGluayBLZXlib2FyZEV2ZW50fSBpcyBwcm92aWRlZCwgdGhlIHRhcmdldCBlbGVtZW50IGlzIHJlc29sdmVkIGZyb20gdGhlIGV2ZW50LlxuICogQHBhcmFtIHRpbWVvdXQgICAgICAgIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgZm9yIHRoZSBSVU0gSmF2YVNjcmlwdCB0byBiZSBhdmFpbGFibGUgKGRlZmF1bHQ6IDEwMDAwKVxuICogQHRocm93cyAgICAgICAgICAgICAgICBBIHtAbGluayBEeW5hdHJhY2VFcnJvcn0gaWYgdGhlIFJVTSBKYXZhU2NyaXB0IG9yIFVzZXIgSW50ZXJhY3Rpb24gbW9kdWxlIGlzIG5vdCBhdmFpbGFibGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgd2l0aGluIHRoZSB0aW1lb3V0LCBvciB0aGUgbmFtZXNwYWNlIGlzIG92ZXJyaWRkZW4gd2l0aCBhbiBpbmNvbXBhdGlibGUgb2JqZWN0XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kS2V5UHJlc3NFdmVudChcbiAgICBmaWVsZHM6IFNlbmRVc2VySW50ZXJhY3Rpb25GaWVsZHMsXG4gICAgZWxlbWVudE9yRXZlbnQ/OiBFbGVtZW50IHwgRXZlbnQsXG4gICAgdGltZW91dDogbnVtYmVyID0gMTBfMDAwXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbnRlcmFjdGlvbnMgPSBhd2FpdCB3YWl0Rm9ySW50ZXJhY3Rpb25zKHRpbWVvdXQpO1xuICAgIGludGVyYWN0aW9ucy5zZW5kS2V5UHJlc3NFdmVudChmaWVsZHMsIGVsZW1lbnRPckV2ZW50KTtcbn1cbiJdfQ==
@@ -0,0 +1,9 @@
1
+ import type { Interactions } from "../../types/index.js";
2
+ /**
3
+ * Waits for the RUM JavaScript and interactions module to become available.
4
+ *
5
+ * @param timeout Timeout in milliseconds to wait for the interactions module to be available (default: 10000)
6
+ * @returns A promise that resolves to the interactions module
7
+ * @throws A {@link DynatraceError} if the RUM JavaScript or interactions module is not available within the timeout
8
+ */
9
+ export declare function waitForInteractions(timeout?: number): Promise<Interactions>;
@@ -0,0 +1,18 @@
1
+ import { DynatraceError } from "../dynatrace-error.js";
2
+ import { waitForAgent } from "./wait-for-agent.js";
3
+ /**
4
+ * Waits for the RUM JavaScript and interactions module to become available.
5
+ *
6
+ * @param timeout Timeout in milliseconds to wait for the interactions module to be available (default: 10000)
7
+ * @returns A promise that resolves to the interactions module
8
+ * @throws A {@link DynatraceError} if the RUM JavaScript or interactions module is not available within the timeout
9
+ */
10
+ export async function waitForInteractions(timeout = 10_000) {
11
+ const dynatrace = await waitForAgent(timeout);
12
+ if (dynatrace.interactions) {
13
+ return dynatrace.interactions;
14
+ }
15
+ // If not immediately available, it means the module is disabled
16
+ throw new DynatraceError("The `dynatrace.interactions` module is not available. Ensure the User Interaction module is enabled in your RUM configuration.");
17
+ }
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FpdC1mb3ItaW50ZXJhY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc291cmNlL2FwaS9wcm9taXNlcy93YWl0LWZvci1pbnRlcmFjdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVuRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLG1CQUFtQixDQUFDLFVBQWtCLE1BQU07SUFDOUQsTUFBTSxTQUFTLEdBQUcsTUFBTSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFOUMsSUFBSSxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDekIsT0FBTyxTQUFTLENBQUMsWUFBWSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxnRUFBZ0U7SUFDaEUsTUFBTSxJQUFJLGNBQWMsQ0FBQyxnSUFBZ0ksQ0FBQyxDQUFDO0FBQy9KLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEludGVyYWN0aW9ucyB9IGZyb20gXCIuLi8uLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgRHluYXRyYWNlRXJyb3IgfSBmcm9tIFwiLi4vZHluYXRyYWNlLWVycm9yLmpzXCI7XG5pbXBvcnQgeyB3YWl0Rm9yQWdlbnQgfSBmcm9tIFwiLi93YWl0LWZvci1hZ2VudC5qc1wiO1xuXG4vKipcbiAqIFdhaXRzIGZvciB0aGUgUlVNIEphdmFTY3JpcHQgYW5kIGludGVyYWN0aW9ucyBtb2R1bGUgdG8gYmVjb21lIGF2YWlsYWJsZS5cbiAqXG4gKiBAcGFyYW0gdGltZW91dCBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciB0aGUgaW50ZXJhY3Rpb25zIG1vZHVsZSB0byBiZSBhdmFpbGFibGUgKGRlZmF1bHQ6IDEwMDAwKVxuICogQHJldHVybnMgICAgICAgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGludGVyYWN0aW9ucyBtb2R1bGVcbiAqIEB0aHJvd3MgICAgICAgIEEge0BsaW5rIER5bmF0cmFjZUVycm9yfSBpZiB0aGUgUlVNIEphdmFTY3JpcHQgb3IgaW50ZXJhY3Rpb25zIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlIHdpdGhpbiB0aGUgdGltZW91dFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2FpdEZvckludGVyYWN0aW9ucyh0aW1lb3V0OiBudW1iZXIgPSAxMF8wMDApOiBQcm9taXNlPEludGVyYWN0aW9ucz4ge1xuICAgIGNvbnN0IGR5bmF0cmFjZSA9IGF3YWl0IHdhaXRGb3JBZ2VudCh0aW1lb3V0KTtcblxuICAgIGlmIChkeW5hdHJhY2UuaW50ZXJhY3Rpb25zKSB7XG4gICAgICAgIHJldHVybiBkeW5hdHJhY2UuaW50ZXJhY3Rpb25zO1xuICAgIH1cblxuICAgIC8vIElmIG5vdCBpbW1lZGlhdGVseSBhdmFpbGFibGUsIGl0IG1lYW5zIHRoZSBtb2R1bGUgaXMgZGlzYWJsZWRcbiAgICB0aHJvdyBuZXcgRHluYXRyYWNlRXJyb3IoXCJUaGUgYGR5bmF0cmFjZS5pbnRlcmFjdGlvbnNgIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlLiBFbnN1cmUgdGhlIFVzZXIgSW50ZXJhY3Rpb24gbW9kdWxlIGlzIGVuYWJsZWQgaW4geW91ciBSVU0gY29uZmlndXJhdGlvbi5cIik7XG59XG4iXX0=
@@ -1,4 +1,6 @@
1
1
  export type { SnapshotOptions, EventIgnorePattern } from "./snapshot.js";
2
2
  export { DEFAULT_IGNORED_EVENTS, DEFAULT_IGNORED_FIELDS, DEFAULT_REMOVED_FIELDS, IGNORED_PLACEHOLDER } from "./snapshot.js";
3
- export type { BeaconRequest, DynatraceConfig, DynatraceTesting, DynatraceTestingFixture, DynatraceTestingWorkerFixture, ExpectOptions, WaitForBeaconsOptions } from "./test.js";
3
+ export type { DynatraceConfig } from "./types/dynatrace-config.js";
4
+ export type { BeaconRequest, DynatraceTesting, ExpectOptions, WaitForBeaconsOptions } from "./types/dynatrace-testing.js";
5
+ export type { DynatraceTestingFixture, DynatraceTestingWorkerFixture } from "./types/dynatrace-testing-fixtures.js";
4
6
  export { test } from "./test.js";
@@ -1,3 +1,3 @@
1
1
  export { DEFAULT_IGNORED_EVENTS, DEFAULT_IGNORED_FIELDS, DEFAULT_REMOVED_FIELDS, IGNORED_PLACEHOLDER } from "./snapshot.js";
2
2
  export { test } from "./test.js";
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvdGVzdGluZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQ0gsc0JBQXNCLEVBQ3RCLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsbUJBQW1CLEVBQ3RCLE1BQU0sZUFBZSxDQUFDO0FBVXZCLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSB7IFNuYXBzaG90T3B0aW9ucywgRXZlbnRJZ25vcmVQYXR0ZXJuIH0gZnJvbSBcIi4vc25hcHNob3QuanNcIjtcbmV4cG9ydCB7XG4gICAgREVGQVVMVF9JR05PUkVEX0VWRU5UUyxcbiAgICBERUZBVUxUX0lHTk9SRURfRklFTERTLFxuICAgIERFRkFVTFRfUkVNT1ZFRF9GSUVMRFMsXG4gICAgSUdOT1JFRF9QTEFDRUhPTERFUlxufSBmcm9tIFwiLi9zbmFwc2hvdC5qc1wiO1xuZXhwb3J0IHR5cGUge1xuICAgIEJlYWNvblJlcXVlc3QsXG4gICAgRHluYXRyYWNlQ29uZmlnLFxuICAgIER5bmF0cmFjZVRlc3RpbmcsXG4gICAgRHluYXRyYWNlVGVzdGluZ0ZpeHR1cmUsXG4gICAgRHluYXRyYWNlVGVzdGluZ1dvcmtlckZpeHR1cmUsXG4gICAgRXhwZWN0T3B0aW9ucyxcbiAgICBXYWl0Rm9yQmVhY29uc09wdGlvbnNcbn0gZnJvbSBcIi4vdGVzdC5qc1wiO1xuZXhwb3J0IHsgdGVzdCB9IGZyb20gXCIuL3Rlc3QuanNcIjtcbiJdfQ==
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvdGVzdGluZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQ0gsc0JBQXNCLEVBQ3RCLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsbUJBQW1CLEVBQ3RCLE1BQU0sZUFBZSxDQUFDO0FBWXZCLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSB7IFNuYXBzaG90T3B0aW9ucywgRXZlbnRJZ25vcmVQYXR0ZXJuIH0gZnJvbSBcIi4vc25hcHNob3QuanNcIjtcbmV4cG9ydCB7XG4gICAgREVGQVVMVF9JR05PUkVEX0VWRU5UUyxcbiAgICBERUZBVUxUX0lHTk9SRURfRklFTERTLFxuICAgIERFRkFVTFRfUkVNT1ZFRF9GSUVMRFMsXG4gICAgSUdOT1JFRF9QTEFDRUhPTERFUlxufSBmcm9tIFwiLi9zbmFwc2hvdC5qc1wiO1xuZXhwb3J0IHR5cGUgeyBEeW5hdHJhY2VDb25maWcgfSBmcm9tIFwiLi90eXBlcy9keW5hdHJhY2UtY29uZmlnLmpzXCI7XG5leHBvcnQgdHlwZSB7XG4gICAgQmVhY29uUmVxdWVzdCxcbiAgICBEeW5hdHJhY2VUZXN0aW5nLFxuICAgIEV4cGVjdE9wdGlvbnMsXG4gICAgV2FpdEZvckJlYWNvbnNPcHRpb25zXG59IGZyb20gXCIuL3R5cGVzL2R5bmF0cmFjZS10ZXN0aW5nLmpzXCI7XG5leHBvcnQgdHlwZSB7XG4gICAgRHluYXRyYWNlVGVzdGluZ0ZpeHR1cmUsXG4gICAgRHluYXRyYWNlVGVzdGluZ1dvcmtlckZpeHR1cmVcbn0gZnJvbSBcIi4vdHlwZXMvZHluYXRyYWNlLXRlc3RpbmctZml4dHVyZXMuanNcIjtcbmV4cG9ydCB7IHRlc3QgfSBmcm9tIFwiLi90ZXN0LmpzXCI7XG4iXX0=
@@ -19,4 +19,4 @@ export async function fetchRumJavaScript(endpointUrl, appId, token) {
19
19
  }
20
20
  return response.text();
21
21
  }
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS90ZXN0aW5nL2luc3RhbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsa0JBQWtCLENBQUMsV0FBbUIsRUFBRSxLQUFhLEVBQUUsS0FBYTtJQUN0RixNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FDeEIsR0FBRyxXQUFXLDZCQUE2QixLQUFLLEVBQUUsRUFDbEQsRUFBRSxPQUFPLEVBQUUsRUFBRSxhQUFhLEVBQUUsYUFBYSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMxRCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0FBQzNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZldGNoZXMgdGhlIFJVTSBKYXZhU2NyaXB0IGZyb20gdGhlIGdpdmVuIGVudmlyb25tZW50LlxuICpcbiAqIEBwYXJhbSBlbmRwb2ludFVybCBUaGUgbG9jYXRpb24gdG8gZmV0Y2ggdGhlIHNjcmlwdCBmcm9tLCBlLmcuIFwiaHR0cHM6Ly97eW91ci1lbnZpcm9ubWVudC1pZH0ubGl2ZS5keW5hdHJhY2UuY29tXCIgb3IgXCJodHRwczovL3t5b3VyLWFjdGl2ZWdhdGUtZG9tYWlufTo5OTk5L2Uve3lvdXItZW52aXJvbm1lbnQtaWR9XCIuXG4gKiBAcGFyYW0gYXBwSWQgICAgICAgVGhlIFJVTSBhcHBsaWNhdGlvbiBJRCB0byBmZXRjaCB0aGUgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB0b2tlbiAgICAgICBUaGUgYXV0aGVudGljYXRpb24gdG9rZW4gdG8gYWNjZXNzIHRoZSBBUEkuXG4gKiBAcmV0dXJucyAgICAgICAgICAgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBhbiBIVE1MIHN0cmluZyBjb250YWluaW5nIHRoZSBSVU0gSmF2YVNjcmlwdCBmb3IgaW5zZXJ0aW9uIGludG8gYSBwYWdlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBydW1KYXZhU2NyaXB0SHRtbCA9IGF3YWl0IGZldGNoUnVtSmF2YVNjcmlwdChcImh0dHBzOi8vbXllbnYubGl2ZS5keW5hdHJhY2UuY29tXCIsXCJBUFBMSUNBVElPTi1FQTdDNEI1OUYyN0Q0M0VCXCIsIFwiZHQwYzAxLmFiY2QuZWZnaGlqa1wiKTtcbiAqIC8vIHVzZSB0aGUgcmVzdWx0IHRvIHdyaXRlIHlvdXIgamF2YXNjcmlwdCwgZS5nLiB3aXRoIGNoZWVyaW86XG4gKiBjb25zdCAkID0gY2hlZXJpby5sb2FkKG15SHRtbCk7XG4gKiAkKFwiaGVhZFwiKS5hcHBlbmQocnVtSmF2YVNjcmlwdEh0bWwpO1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hSdW1KYXZhU2NyaXB0KGVuZHBvaW50VXJsOiBzdHJpbmcsIGFwcElkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICAgIGAke2VuZHBvaW50VXJsfS9hcGkvdjIvcnVtL2phdmFTY3JpcHRUYWcvJHthcHBJZH1gLFxuICAgICAgICB7IGhlYWRlcnM6IHsgQXV0aG9yaXphdGlvbjogYEFwaS1Ub2tlbiAke3Rva2VufWAgfSB9KTtcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIFJVTSBKYXZhU2NyaXB0OiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZS50ZXh0KCk7XG59XG4iXX0=
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS90ZXN0aW5nL2luc3RhbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsa0JBQWtCLENBQ3BDLFdBQW1CLEVBQ25CLEtBQWEsRUFDYixLQUFhO0lBRWIsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQ3hCLEdBQUcsV0FBVyw2QkFBNkIsS0FBSyxFQUFFLEVBQ2xELEVBQUUsT0FBTyxFQUFFLEVBQUUsYUFBYSxFQUFFLGFBQWEsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUN2RCxDQUFDO0lBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUMzQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGZXRjaGVzIHRoZSBSVU0gSmF2YVNjcmlwdCBmcm9tIHRoZSBnaXZlbiBlbnZpcm9ubWVudC5cbiAqXG4gKiBAcGFyYW0gZW5kcG9pbnRVcmwgVGhlIGxvY2F0aW9uIHRvIGZldGNoIHRoZSBzY3JpcHQgZnJvbSwgZS5nLiBcImh0dHBzOi8ve3lvdXItZW52aXJvbm1lbnQtaWR9LmxpdmUuZHluYXRyYWNlLmNvbVwiIG9yIFwiaHR0cHM6Ly97eW91ci1hY3RpdmVnYXRlLWRvbWFpbn06OTk5OS9lL3t5b3VyLWVudmlyb25tZW50LWlkfVwiLlxuICogQHBhcmFtIGFwcElkICAgICAgIFRoZSBSVU0gYXBwbGljYXRpb24gSUQgdG8gZmV0Y2ggdGhlIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0gdG9rZW4gICAgICAgVGhlIGF1dGhlbnRpY2F0aW9uIHRva2VuIHRvIGFjY2VzcyB0aGUgQVBJLlxuICogQHJldHVybnMgICAgICAgICAgIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYW4gSFRNTCBzdHJpbmcgY29udGFpbmluZyB0aGUgUlVNIEphdmFTY3JpcHQgZm9yIGluc2VydGlvbiBpbnRvIGEgcGFnZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgcnVtSmF2YVNjcmlwdEh0bWwgPSBhd2FpdCBmZXRjaFJ1bUphdmFTY3JpcHQoXCJodHRwczovL215ZW52LmxpdmUuZHluYXRyYWNlLmNvbVwiLFwiQVBQTElDQVRJT04tRUE3QzRCNTlGMjdENDNFQlwiLCBcImR0MGMwMS5hYmNkLmVmZ2hpamtcIik7XG4gKiAvLyB1c2UgdGhlIHJlc3VsdCB0byB3cml0ZSB5b3VyIGphdmFzY3JpcHQsIGUuZy4gd2l0aCBjaGVlcmlvOlxuICogY29uc3QgJCA9IGNoZWVyaW8ubG9hZChteUh0bWwpO1xuICogJChcImhlYWRcIikuYXBwZW5kKHJ1bUphdmFTY3JpcHRIdG1sKTtcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoUnVtSmF2YVNjcmlwdChcbiAgICBlbmRwb2ludFVybDogc3RyaW5nLFxuICAgIGFwcElkOiBzdHJpbmcsXG4gICAgdG9rZW46IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICBgJHtlbmRwb2ludFVybH0vYXBpL3YyL3J1bS9qYXZhU2NyaXB0VGFnLyR7YXBwSWR9YCxcbiAgICAgICAgeyBoZWFkZXJzOiB7IEF1dGhvcml6YXRpb246IGBBcGktVG9rZW4gJHt0b2tlbn1gIH0gfVxuICAgICk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBSVU0gSmF2YVNjcmlwdDogJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xufVxuIl19
@@ -1,120 +1,2 @@
1
- import type { SnapshotOptions } from "./snapshot.js";
2
- export interface WaitForBeaconsOptions {
3
- /**
4
- * The minimum number of beacon requests to wait for
5
- */
6
- minCount?: number;
7
- /**
8
- * The maximum time to wait for beacon requests, in milliseconds - Default: 5_000
9
- */
10
- timeout?: number;
11
- }
12
- export interface ExpectOptions {
13
- /**
14
- * The maximum time to wait for the event to be sent, in milliseconds - Default: 5_000
15
- */
16
- timeout?: number;
17
- }
18
- export interface DynatraceTesting {
19
- /**
20
- * Waits for a specified number of beacon requests or until a timeout occurs.
21
- *
22
- * @param options Configuration options for waiting for beacons
23
- * @returns A promise that resolves with an array of beacon requests
24
- */
25
- waitForBeacons(options?: WaitForBeaconsOptions): Promise<BeaconRequest[]>;
26
- /**
27
- * Verifies that a specific event has been sent, optionally within a timeout period.
28
- *
29
- * @param event The event to check, represented as a key-value pair object. This uses Playwrights expect(event).toMatchObject.
30
- * @param options Configuration options for the verification
31
- * @returns A promise that resolves when the event is confirmed to have been sent
32
- */
33
- expectToHaveSentEvent(event: Record<string, unknown>, options?: ExpectOptions): Promise<void>;
34
- /**
35
- * Verifies that a specific event has been sent a specified number of times, optionally within a timeout period.
36
- *
37
- * @param event The event to check, represented as a key-value pair object. This uses Playwrights expect(event).toMatchObject.
38
- * @param times The exact number of times the event is expected to have been sent
39
- * @param options Configuration options for the verification
40
- * @returns A promise that resolves when the event is confirmed to have been sent the specified number of times
41
- */
42
- expectToHaveSentEventTimes(event: Record<string, unknown>, times: number, options?: ExpectOptions): Promise<void>;
43
- /**
44
- * Clears all events and beacons, allowing for subsequent expectations to ignore events that have been sent
45
- * in the past. Example:
46
- * ```
47
- * sendFooEvent();
48
- * await dynatraceTesting.expectToHaveSentEventTimes({ foo: "bar" }, 1);
49
- * dynatraceTesting.clearEvents();
50
- * await dynatraceTesting.expectToHaveSentEventTimes({ foo: "bar" }, 1);
51
- * ```
52
- */
53
- clearEvents(): void;
54
- /**
55
- * Compares captured events against a stored snapshot file.
56
- * On first run, creates the snapshot. On subsequent runs, compares and fails if different.
57
- * Volatile fields (timestamps, IDs, etc.) are masked by default to prevent flaky tests.
58
- *
59
- * @param options Configuration for snapshot comparison
60
- */
61
- toMatchEventSnapshot(options?: SnapshotOptions): Promise<void>;
62
- }
63
- export interface BeaconRequest {
64
- url: string;
65
- body: Record<string, unknown>;
66
- }
67
- export interface DynatraceTestingFixture {
68
- /**
69
- * The testing API providing expect methods.
70
- */
71
- dynatraceTesting: DynatraceTesting;
72
- /**
73
- * Configuration to enable Dynatrace testing with a given environment.
74
- */
75
- dynatraceConfig: DynatraceConfig;
76
- }
77
- export interface DynatraceConfig {
78
- /**
79
- * The URL of the Dynatrace API endpoint to connect to, see
80
- * [RUM manual insertion tags API](https://docs.dynatrace.com/docs/discover-dynatrace/references/dynatrace-api/environment-api/rum/rum-manual-insertion-tags)
81
- * for details. Example: https://{your-environment-id}.live.dynatrace.com or
82
- * https://{your-activegate-domain}/e/{your-environment-id}
83
- */
84
- endpointUrl: string;
85
- /**
86
- * The application ID to identify the correct RUM JavaScript to fetch. You can find
87
- * this in the URL if you open the Experience Vitals app and select the frontend you
88
- * want to test. Example: APPLICATION-ABCDEF0123456789
89
- */
90
- appId: string;
91
- /**
92
- * The authentication token for the installation. See
93
- * [Tokens and authentication](https://docs.dynatrace.com/docs/discover-dynatrace/references/dynatrace-api/basics/dynatrace-api-authentication).
94
- */
95
- token: string;
96
- /**
97
- * Accepts an array of regular expressions to match against Dynatrace-related warnings. By default, these warnings
98
- * trigger test fails. If you anticipate warnings and don't want your tests to fail, use this setting to ignore them
99
- * by message. Example:
100
- * ["invalid property my_app_data\.\\w+[0-9_]*"]
101
- */
102
- ignoreWarnings?: string[];
103
- /**
104
- * Dump the array of Dynatrace events into the console in case an assertion fails.
105
- */
106
- dumpEventsOnFail?: boolean;
107
- }
108
- /**
109
- * Worker-scoped fixtures for caching RUM JavaScript across tests in the same worker.
110
- * This improves performance by avoiding redundant network requests.
111
- */
112
- export interface DynatraceTestingWorkerFixture {
113
- /**
114
- * Cache for RUM JavaScript snippets, scoped to the worker.
115
- *
116
- * @internal
117
- */
118
- rumJavaScriptCache: Map<string, string>;
119
- }
1
+ import type { DynatraceTestingFixture, DynatraceTestingWorkerFixture } from "./types/dynatrace-testing-fixtures.js";
120
2
  export declare const test: import("@playwright/test").TestType<import("@playwright/test").PlaywrightTestArgs & import("@playwright/test").PlaywrightTestOptions & DynatraceTestingFixture, import("@playwright/test").PlaywrightWorkerArgs & import("@playwright/test").PlaywrightWorkerOptions & DynatraceTestingWorkerFixture>;
@@ -81,11 +81,11 @@ function setupConsoleWarningListener(page, ignoreWarnings, context) {
81
81
  * @param context The testing context to store beacons and events
82
82
  */
83
83
  async function setupRumJavaScriptAndListeners(page, config, cache, context) {
84
- const { endpointUrl, appId, token } = config;
84
+ const { appId, endpointUrl } = config;
85
85
  const cacheKey = `${endpointUrl}:${appId}`;
86
86
  let rum = cache.get(cacheKey);
87
87
  if (!rum) {
88
- rum = await fetchRumJavaScriptContent(endpointUrl, appId, token);
88
+ rum = await fetchRumJavaScriptContent(config);
89
89
  const beaconUri = extractBeaconUri(rum);
90
90
  cache.set(cacheKey, rum);
91
91
  cache.set(`${cacheKey}:beaconUri`, beaconUri);
@@ -243,7 +243,7 @@ function createDynatraceTestingApi(context, testInfo) {
243
243
  const errorMessage = `[Dynatrace Testing] Snapshot mismatch for "${snapshotName}".\n\n`
244
244
  + `Snapshot path: ${snapshotPath}\n\n`
245
245
  + `${error instanceof Error ? error.message : String(error)}\n\n`
246
- + `To update the snapshot, run with --update-snapshots flag.`;
246
+ + `To update the snapshot, run with --update-snapshots=all flag.`;
247
247
  return Promise.reject(new Error(errorMessage));
248
248
  }
249
249
  }
@@ -331,15 +331,16 @@ function validateDynatraceConfig(config) {
331
331
  }
332
332
  }
333
333
  /**
334
- * Fetches the RUM JavaScript content from the Dynatrace API endpoint.
334
+ * Fetches the RUM JavaScript content from the Dynatrace API endpoint or filesystem if a provider exists
335
335
  *
336
- * @param endpointUrl The URL of the Dynatrace API endpoint
337
- * @param appId The application ID to identify the correct RUM JavaScript
338
- * @param token The authentication token for the installation
339
- * @returns A promise that resolves to the RUM JavaScript content
336
+ * @param config the Dynatrace configuration
337
+ * @returns A promise that resolves to the RUM JavaScript content
340
338
  */
341
- async function fetchRumJavaScriptContent(endpointUrl, appId, token) {
342
- const rumApiResult = await fetchRumJavaScript(endpointUrl, appId, token);
339
+ async function fetchRumJavaScriptContent(config) {
340
+ if (config.agentProvider) {
341
+ return Promise.resolve(config.agentProvider());
342
+ }
343
+ const rumApiResult = await fetchRumJavaScript(config.endpointUrl, config.appId, config.token);
343
344
  if (!rumApiResult.includes("_complete.js")) {
344
345
  throw new Error(`Dynatrace received unexpected RUM JavaScript when requesting the JavaScript Tag via API: ${rumApiResult}`);
345
346
  }
@@ -393,4 +394,4 @@ function extractBeaconBody(request, url) {
393
394
  }
394
395
  return request.postData();
395
396
  }
396
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS90ZXN0aW5nL3Rlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsT0FBTyxFQUNILE1BQU0sRUFDTixJQUFJLElBQUksSUFBSSxFQUNmLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNILHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsc0JBQXNCLEVBQ3RCLG1CQUFtQixFQUNuQixzQkFBc0IsRUFDdEIsWUFBWSxFQUNaLDJCQUEyQixFQUMzQixhQUFhLEVBQ2hCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBMkV0QyxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUM7QUFFOUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQXlFbEM7O0dBRUc7QUFDSCxNQUFNLGtCQUFrQixHQUEyQjtJQUMvQyxXQUFXLEVBQUUsK0VBQStFO0lBQzVGLEtBQUssRUFBRSxpRUFBaUU7SUFDeEUsS0FBSyxFQUFFLGtFQUFrRTtDQUM1RSxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQXlEO0lBQ3BGLGVBQWUsRUFBRSxDQUFDO1lBQ2QsS0FBSyxFQUFFLEVBQUU7WUFDVCxXQUFXLEVBQUUsRUFBRTtZQUNmLEtBQUssRUFBRSxFQUFFO1NBQ1osRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUVwQiw2SEFBNkg7SUFDN0gsa0JBQWtCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ3BDLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1lBQ3hDLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FB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RCxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUNELE9BQU8sY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsSUFBSSxDQUFDLElBQVk7SUFDdEIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzNCLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDOUIsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxPQUFnQixFQUFFLEdBQVc7SUFDcEQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hDLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUN0QyxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckMsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuICAgIFBhZ2UsXG4gICAgUmVxdWVzdCxcbiAgICBUZXN0SW5mb1xufSBmcm9tIFwiQHBsYXl3cmlnaHQvdGVzdFwiO1xuaW1wb3J0IHR5cGUgeyBTbmFwc2hvdE9wdGlvbnMgfSBmcm9tIFwiLi9zbmFwc2hvdC5qc1wiO1xuaW1wb3J0IHtcbiAgICBleHBlY3QsXG4gICAgdGVzdCBhcyBiYXNlXG59IGZyb20gXCJAcGxheXdyaWdodC90ZXN0XCI7XG5pbXBvcnQge1xuICAgIERFRkFVTFRfSUdOT1JFRF9FVkVOVFMsXG4gICAgREVGQVVMVF9JR05PUkVEX0ZJRUxEUyxcbiAgICBERUZBVUxUX1JFTU9WRURfRklFTERTLFxuICAgIGZpbHRlcklnbm9yZWRFdmVudHMsXG4gICAgcHJvY2Vzc0V2ZW50UHJvcGVydGllcyxcbiAgICByZWFkU25hcHNob3QsXG4gICAgc29ydEV2ZW50c0J5Q2hhcmFjdGVyaXN0aWNzLFxuICAgIHdyaXRlU25hcHNob3Rcbn0gZnJvbSBcIi4vc25hcHNob3QuanNcIjtcbmltcG9ydCB7IGZldGNoUnVtSmF2YVNjcmlwdCB9IGZyb20gXCIuL2luc3RhbGwuanNcIjtcbmltcG9ydCB7IHVuY29tcHJlc3MgfSBmcm9tIFwic25hcHB5anNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBXYWl0Rm9yQmVhY29uc09wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbXVtIG51bWJlciBvZiBiZWFjb24gcmVxdWVzdHMgdG8gd2FpdCBmb3JcbiAgICAgKi9cbiAgICBtaW5Db3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIGJlYWNvbiByZXF1ZXN0cywgaW4gbWlsbGlzZWNvbmRzIC0gRGVmYXVsdDogNV8wMDBcbiAgICAgKi9cbiAgICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4cGVjdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIHRpbWUgdG8gd2FpdCBmb3IgdGhlIGV2ZW50IHRvIGJlIHNlbnQsIGluIG1pbGxpc2Vjb25kcyAtIERlZmF1bHQ6IDVfMDAwXG4gICAgICovXG4gICAgdGltZW91dD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEeW5hdHJhY2VUZXN0aW5nIHtcbiAgICAvKipcbiAgICAgKiBXYWl0cyBmb3IgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJlYWNvbiByZXF1ZXN0cyBvciB1bnRpbCBhIHRpbWVvdXQgb2NjdXJzLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB3YWl0aW5nIGZvciBiZWFjb25zXG4gICAgICogQHJldHVybnMgICAgICAgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiBiZWFjb24gcmVxdWVzdHNcbiAgICAgKi9cbiAgICB3YWl0Rm9yQmVhY29ucyhvcHRpb25zPzogV2FpdEZvckJlYWNvbnNPcHRpb25zKTogUHJvbWlzZTxCZWFjb25SZXF1ZXN0W10+O1xuXG4gICAgLyoqXG4gICAgICogVmVyaWZpZXMgdGhhdCBhIHNwZWNpZmljIGV2ZW50IGhhcyBiZWVuIHNlbnQsIG9wdGlvbmFsbHkgd2l0aGluIGEgdGltZW91dCBwZXJpb2QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXZlbnQgICBUaGUgZXZlbnQgdG8gY2hlY2ssIHJlcHJlc2VudGVkIGFzIGEga2V5LXZhbHVlIHBhaXIgb2JqZWN0LiBUaGlzIHVzZXMgUGxheXdyaWdodHMgZXhwZWN0KGV2ZW50KS50b01hdGNoT2JqZWN0LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHZlcmlmaWNhdGlvblxuICAgICAqIEByZXR1cm5zICAgICAgIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGV2ZW50IGlzIGNvbmZpcm1lZCB0byBoYXZlIGJlZW4gc2VudFxuICAgICAqL1xuICAgIGV4cGVjdFRvSGF2ZVNlbnRFdmVudChldmVudDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG9wdGlvbnM/OiBFeHBlY3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIFZlcmlmaWVzIHRoYXQgYSBzcGVjaWZpYyBldmVudCBoYXMgYmVlbiBzZW50IGEgc3BlY2lmaWVkIG51bWJlciBvZiB0aW1lcywgb3B0aW9uYWxseSB3aXRoaW4gYSB0aW1lb3V0IHBlcmlvZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBldmVudCAgIFRoZSBldmVudCB0byBjaGVjaywgcmVwcmVzZW50ZWQgYXMgYSBrZXktdmFsdWUgcGFpciBvYmplY3QuIFRoaXMgdXNlcyBQbGF5d3JpZ2h0cyBleHBlY3QoZXZlbnQpLnRvTWF0Y2hPYmplY3QuXG4gICAgICogQHBhcmFtIHRpbWVzICAgVGhlIGV4YWN0IG51bWJlciBvZiB0aW1lcyB0aGUgZXZlbnQgaXMgZXhwZWN0ZWQgdG8gaGF2ZSBiZWVuIHNlbnRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcmV0dXJucyAgICAgICBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBldmVudCBpcyBjb25maXJtZWQgdG8gaGF2ZSBiZWVuIHNlbnQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdGltZXNcbiAgICAgKi9cbiAgICBleHBlY3RUb0hhdmVTZW50RXZlbnRUaW1lcyhldmVudDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHRpbWVzOiBudW1iZXIsIG9wdGlvbnM/OiBFeHBlY3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIENsZWFycyBhbGwgZXZlbnRzIGFuZCBiZWFjb25zLCBhbGxvd2luZyBmb3Igc3Vic2VxdWVudCBleHBlY3RhdGlvbnMgdG8gaWdub3JlIGV2ZW50cyB0aGF0IGhhdmUgYmVlbiBzZW50XG4gICAgICogaW4gdGhlIHBhc3QuIEV4YW1wbGU6XG4gICAgICogYGBgXG4gICAgICogc2VuZEZvb0V2ZW50KCk7XG4gICAgICogYXdhaXQgZHluYXRyYWNlVGVzdGluZy5leHBlY3RUb0hhdmVTZW50RXZlbnRUaW1lcyh7IGZvbzogXCJiYXJcIiB9LCAxKTtcbiAgICAgKiBkeW5hdHJhY2VUZXN0aW5nLmNsZWFyRXZlbnRzKCk7XG4gICAgICogYXdhaXQgZHluYXRyYWNlVGVzdGluZy5leHBlY3RUb0hhdmVTZW50RXZlbnRUaW1lcyh7IGZvbzogXCJiYXJcIiB9LCAxKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjbGVhckV2ZW50cygpOiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogQ29tcGFyZXMgY2FwdHVyZWQgZXZlbnRzIGFnYWluc3QgYSBzdG9yZWQgc25hcHNob3QgZmlsZS5cbiAgICAgKiBPbiBmaXJzdCBydW4sIGNyZWF0ZXMgdGhlIHNuYXBzaG90LiBPbiBzdWJzZXF1ZW50IHJ1bnMsIGNvbXBhcmVzIGFuZCBmYWlscyBpZiBkaWZmZXJlbnQuXG4gICAgICogVm9sYXRpbGUgZmllbGRzICh0aW1lc3RhbXBzLCBJRHMsIGV0Yy4pIGFyZSBtYXNrZWQgYnkgZGVmYXVsdCB0byBwcmV2ZW50IGZsYWt5IHRlc3RzLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgQ29uZmlndXJhdGlvbiBmb3Igc25hcHNob3QgY29tcGFyaXNvblxuICAgICAqL1xuICAgIHRvTWF0Y2hFdmVudFNuYXBzaG90KG9wdGlvbnM/OiBTbmFwc2hvdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcXVlc3Qge1xuICAgIHVybDogc3RyaW5nO1xuICAgIGJvZHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5jb25zdCBERUZBVUxUX1RJTUVPVVQgPSA1XzAwMDtcblxuY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKipcbiAqIEludGVybmFsIGNvbnRleHQgc2hhcmVkIGJldHdlZW4gdGVzdGluZyBBUEkgbWV0aG9kcy5cbiAqL1xuaW50ZXJmYWNlIFRlc3RpbmdDb250ZXh0IHtcbiAgICBldmVudHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG4gICAgYmVhY29uczogQmVhY29uUmVxdWVzdFtdO1xuICAgIHdhcm5pbmdzOiBzdHJpbmdbXTtcbiAgICBkdW1wRXZlbnRzT25GYWlsOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIER5bmF0cmFjZVRlc3RpbmdGaXh0dXJlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdGVzdGluZyBBUEkgcHJvdmlkaW5nIGV4cGVjdCBtZXRob2RzLlxuICAgICAqL1xuICAgIGR5bmF0cmFjZVRlc3Rpbmc6IER5bmF0cmFjZVRlc3Rpbmc7XG5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmF0aW9uIHRvIGVuYWJsZSBEeW5hdHJhY2UgdGVzdGluZyB3aXRoIGEgZ2l2ZW4gZW52aXJvbm1lbnQuXG4gICAgICovXG4gICAgZHluYXRyYWNlQ29uZmlnOiBEeW5hdHJhY2VDb25maWc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHluYXRyYWNlQ29uZmlnIHtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIG9mIHRoZSBEeW5hdHJhY2UgQVBJIGVuZHBvaW50IHRvIGNvbm5lY3QgdG8sIHNlZVxuICAgICAqIFtSVU0gbWFudWFsIGluc2VydGlvbiB0YWdzIEFQSV0oaHR0cHM6Ly9kb2NzLmR5bmF0cmFjZS5jb20vZG9jcy9kaXNjb3Zlci1keW5hdHJhY2UvcmVmZXJlbmNlcy9keW5hdHJhY2UtYXBpL2Vudmlyb25tZW50LWFwaS9ydW0vcnVtLW1hbnVhbC1pbnNlcnRpb24tdGFncylcbiAgICAgKiBmb3IgZGV0YWlscy4gRXhhbXBsZTogaHR0cHM6Ly97eW91ci1lbnZpcm9ubWVudC1pZH0ubGl2ZS5keW5hdHJhY2UuY29tIG9yXG4gICAgICogaHR0cHM6Ly97eW91ci1hY3RpdmVnYXRlLWRvbWFpbn0vZS97eW91ci1lbnZpcm9ubWVudC1pZH1cbiAgICAgKi9cbiAgICBlbmRwb2ludFVybDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFwcGxpY2F0aW9uIElEIHRvIGlkZW50aWZ5IHRoZSBjb3JyZWN0IFJVTSBKYXZhU2NyaXB0IHRvIGZldGNoLiBZb3UgY2FuIGZpbmRcbiAgICAgKiB0aGlzIGluIHRoZSBVUkwgaWYgeW91IG9wZW4gdGhlIEV4cGVyaWVuY2UgVml0YWxzIGFwcCBhbmQgc2VsZWN0IHRoZSBmcm9udGVuZCB5b3VcbiAgICAgKiB3YW50IHRvIHRlc3QuIEV4YW1wbGU6IEFQUExJQ0FUSU9OLUFCQ0RFRjAxMjM0NTY3ODlcbiAgICAgKi9cbiAgICBhcHBJZDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGF1dGhlbnRpY2F0aW9uIHRva2VuIGZvciB0aGUgaW5zdGFsbGF0aW9uLiBTZWVcbiAgICAgKiBbVG9rZW5zIGFuZCBhdXRoZW50aWNhdGlvbl0oaHR0cHM6Ly9kb2NzLmR5bmF0cmFjZS5jb20vZG9jcy9kaXNjb3Zlci1keW5hdHJhY2UvcmVmZXJlbmNlcy9keW5hdHJhY2UtYXBpL2Jhc2ljcy9keW5hdHJhY2UtYXBpLWF1dGhlbnRpY2F0aW9uKS5cbiAgICAgKi9cbiAgICB0b2tlbjogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQWNjZXB0cyBhbiBhcnJheSBvZiByZWd1bGFyIGV4cHJlc3Npb25zIHRvIG1hdGNoIGFnYWluc3QgRHluYXRyYWNlLXJlbGF0ZWQgd2FybmluZ3MuIEJ5IGRlZmF1bHQsIHRoZXNlIHdhcm5pbmdzXG4gICAgICogdHJpZ2dlciB0ZXN0IGZhaWxzLiBJZiB5b3UgYW50aWNpcGF0ZSB3YXJuaW5ncyBhbmQgZG9uJ3Qgd2FudCB5b3VyIHRlc3RzIHRvIGZhaWwsIHVzZSB0aGlzIHNldHRpbmcgdG8gaWdub3JlIHRoZW1cbiAgICAgKiBieSBtZXNzYWdlLiBFeGFtcGxlOlxuICAgICAqIFtcImludmFsaWQgcHJvcGVydHkgbXlfYXBwX2RhdGFcXC5cXFxcdytbMC05X10qXCJdXG4gICAgICovXG4gICAgaWdub3JlV2FybmluZ3M/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIER1bXAgdGhlIGFycmF5IG9mIER5bmF0cmFjZSBldmVudHMgaW50byB0aGUgY29uc29sZSBpbiBjYXNlIGFuIGFzc2VydGlvbiBmYWlscy5cbiAgICAgKi9cbiAgICBkdW1wRXZlbnRzT25GYWlsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBXb3JrZXItc2NvcGVkIGZpeHR1cmVzIGZvciBjYWNoaW5nIFJVTSBKYXZhU2NyaXB0IGFjcm9zcyB0ZXN0cyBpbiB0aGUgc2FtZSB3b3JrZXIuXG4gKiBUaGlzIGltcHJvdmVzIHBlcmZvcm1hbmNlIGJ5IGF2b2lkaW5nIHJlZHVuZGFudCBuZXR3b3JrIHJlcXVlc3RzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIER5bmF0cmFjZVRlc3RpbmdXb3JrZXJGaXh0dXJlIHtcbiAgICAvKipcbiAgICAgKiBDYWNoZSBmb3IgUlVNIEphdmFTY3JpcHQgc25pcHBldHMsIHNjb3BlZCB0byB0aGUgd29ya2VyLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcnVtSmF2YVNjcmlwdENhY2hlOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG4vKipcbiAqIEZpZWxkIGRlc2NyaXB0aW9ucyBmb3IgY29uZmlndXJhdGlvbiBlcnJvciBtZXNzYWdlcy5cbiAqL1xuY29uc3QgRklFTERfREVTQ1JJUFRJT05TOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIGVuZHBvaW50VXJsOiBcIlRoZSBEeW5hdHJhY2UgZW52aXJvbm1lbnQgVVJMIChlLmcuLCBcXFwiaHR0cHM6Ly9hYmMxMjM0NS5saXZlLmR5bmF0cmFjZS5jb21cXFwiKVwiLFxuICAgIGFwcElkOiBcIlRoZSBSVU0gYXBwbGljYXRpb24gSUQgKGUuZy4sIFxcXCJBUFBMSUNBVElPTi1BQkNERUYwMTIzNDU2Nzg5XFxcIilcIixcbiAgICB0b2tlbjogXCJUaGUgQVBJIHRva2VuIHdpdGggXFxcIlJlYWQgUlVNIG1hbnVhbCBpbnNlcnRpb24gdGFnc1xcXCIgcGVybWlzc2lvblwiXG59O1xuXG5leHBvcnQgY29uc3QgdGVzdCA9IGJhc2UuZXh0ZW5kPER5bmF0cmFjZVRlc3RpbmdGaXh0dXJlLCBEeW5hdHJhY2VUZXN0aW5nV29ya2VyRml4dHVyZT4oe1xuICAgIGR5bmF0cmFjZUNvbmZpZzogW3tcbiAgICAgICAgYXBwSWQ6IFwiXCIsXG4gICAgICAgIGVuZHBvaW50VXJsOiBcIlwiLFxuICAgICAgICB0b2tlbjogXCJcIlxuICAgIH0sIHsgb3B0aW9uOiB0cnVlIH1dLFxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5LXBhdHRlcm4gLS0gUGxheXdyaWdodCByZXF1aXJlcyBvYmplY3QgZGVzdHJ1Y3R1cmluZyBldmVuIHdoZW4gbm8gZGVwZW5kZW5jaWVzIGFyZSBuZWVkZWRcbiAgICBydW1KYXZhU2NyaXB0Q2FjaGU6IFthc3luYyAoeyB9LCB1c2UpID0+IHsgLy8gTk9TT05BUlxuICAgICAgICBjb25zdCBjYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgICAgIGF3YWl0IHVzZShjYWNoZSk7XG4gICAgfSwgeyBzY29wZTogXCJ3b3JrZXJcIiwgYXV0bzogdHJ1ZSwgYm94OiB0cnVlIH1dLFxuXG4gICAgZHluYXRyYWNlVGVzdGluZzogYXN5bmMgKFxuICAgICAgICB7IHBhZ2UsIGR5bmF0cmFjZUNvbmZpZywgcnVtSmF2YVNjcmlwdENhY2hlIH0sXG4gICAgICAgIHVzZSxcbiAgICAgICAgdGVzdEluZm86IFRlc3RJbmZvXG4gICAgKSA9PiB7XG4gICAgICAgIHZhbGlkYXRlRHluYXRyYWNlQ29uZmlnKGR5bmF0cmFjZUNvbmZpZyk7XG4gICAgICAgIHdhcm5JZlBhZ2VBbHJlYWR5TmF2aWdhdGVkKHBhZ2UpO1xuXG4gICAgICAgIGNvbnN0IHsgaWdub3JlV2FybmluZ3MgPSBbXSwgZHVtcEV2ZW50c09uRmFpbCA9IGZhbHNlIH0gPSBkeW5hdHJhY2VDb25maWc7XG4gICAgICAgIGNvbnN0IGNvbnRleHQ6IFRlc3RpbmdDb250ZXh0ID0ge1xuICAgICAgICAgICAgZXZlbnRzOiBbXSxcbiAgICAgICAgICAgIGJlYWNvbnM6IFtdLFxuICAgICAgICAgICAgd2FybmluZ3M6IFtdLFxuICAgICAgICAgICAgZHVtcEV2ZW50c09uRmFpbFxuICAgICAgICB9O1xuXG4gICAgICAgIHNldHVwQ29uc29sZVdhcm5pbmdMaXN0ZW5lcihwYWdlLCBpZ25vcmVXYXJuaW5ncywgY29udGV4dCk7XG4gICAgICAgIGF3YWl0IHNldHVwUnVtSmF2YVNjcmlwdEFuZExpc3RlbmVycyhwYWdlLCBkeW5hdHJhY2VDb25maWcsIHJ1bUphdmFTY3JpcHRDYWNoZSwgY29udGV4dCk7XG4gICAgICAgIGF3YWl0IHVzZShjcmVhdGVEeW5hdHJhY2VUZXN0aW5nQXBpKGNvbnRleHQsIHRlc3RJbmZvKSk7XG4gICAgfVxufSk7XG5cbi8qKlxuICogV2FybnMgaWYgdGhlIHBhZ2UgaGFzIGFscmVhZHkgbmF2aWdhdGVkIGF3YXkgZnJvbSBhYm91dDpibGFuay5cbiAqIFRoaXMgaW5kaWNhdGVzIHRoZSBmaXh0dXJlIG1heSBub3QgaW5qZWN0IFJVTSBKYXZhU2NyaXB0IGNvcnJlY3RseS5cbiAqXG4gKiBAcGFyYW0gcGFnZSBUaGUgUGxheXdyaWdodCBwYWdlIGluc3RhbmNlXG4gKi9cbmZ1bmN0aW9uIHdhcm5JZlBhZ2VBbHJlYWR5TmF2aWdhdGVkKHBhZ2U6IFBhZ2UpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50VXJsID0gcGFnZS51cmwoKTtcbiAgICBpZiAoY3VycmVudFVybCAhPT0gXCJhYm91dDpibGFua1wiKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBbRHluYXRyYWNlIFRlc3RpbmddIFdhcm5pbmc6IFBhZ2UgaGFzIGFscmVhZHkgbmF2aWdhdGVkIHRvIFwiJHtjdXJyZW50VXJsfVwiLlxuVGhlIFJVTSBKYXZhU2NyaXB0IG1heSBub3QgYmUgaW5qZWN0ZWQuIEVuc3VyZSBkeW5hdHJhY2VUZXN0aW5nIGlzIGRlc3RydWN0dXJlZFxuYmVmb3JlIGFueSBmaXh0dXJlcyB0aGF0IG5hdmlnYXRlIHRoZSBwYWdlLlxuXG5FeGFtcGxlIG9mIGNvcnJlY3QgZml4dHVyZSBvcmRlcjpcbiAgICB0ZXN0KFwibXkgdGVzdFwiLCBhc3luYyAoeyBkeW5hdHJhY2VUZXN0aW5nLCBteUN1c3RvbUZpeHR1cmUsIHBhZ2UgfSkgPT4geyAuLi4gfSk7XG5cblNlZSB0ZXN0aW5nLm1kIGZvciBtb3JlIGluZm9ybWF0aW9uLmBcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbi8qKlxuICogU2V0cyB1cCBhIGNvbnNvbGUgbGlzdGVuZXIgdG8gY2FwdHVyZSBEeW5hdHJhY2UtcmVsYXRlZCB3YXJuaW5ncy5cbiAqXG4gKiBAcGFyYW0gcGFnZSAgICAgICAgICAgVGhlIFBsYXl3cmlnaHQgcGFnZSBpbnN0YW5jZVxuICogQHBhcmFtIGlnbm9yZVdhcm5pbmdzIEFycmF5IG9mIHJlZ2V4IHBhdHRlcm5zIGZvciB3YXJuaW5ncyB0byBpZ25vcmVcbiAqIEBwYXJhbSBjb250ZXh0ICAgICAgICBUaGUgdGVzdGluZyBjb250ZXh0IHRvIHN0b3JlIHdhcm5pbmdzXG4gKi9cbmZ1bmN0aW9uIHNldHVwQ29uc29sZVdhcm5pbmdMaXN0ZW5lcihcbiAgICBwYWdlOiBQYWdlLFxuICAgIGlnbm9yZVdhcm5pbmdzOiBzdHJpbmdbXSxcbiAgICBjb250ZXh0OiBUZXN0aW5nQ29udGV4dFxuKTogdm9pZCB7XG4gICAgY29uc3QgaWdub3JlUmVnZXhlcyA9IGlnbm9yZVdhcm5pbmdzLm1hcCh4ID0+IG5ldyBSZWdFeHAoeCwgXCJpXCIpKTtcbiAgICBwYWdlLm9uKFwiY29uc29sZVwiLCAobXNnKSA9PiB7XG4gICAgICAgIGlmIChtc2cudGV4dCgpLmluY2x1ZGVzKFwieW5hdHJhY2VcIikgJiYgIWlnbm9yZVJlZ2V4ZXMuc29tZShyZWdleCA9PiByZWdleC50ZXN0KG1zZy50ZXh0KCkpKSkge1xuICAgICAgICAgICAgY29udGV4dC53YXJuaW5ncy5wdXNoKG1zZy50ZXh0KCkpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbi8qKlxuICogU2V0cyB1cCBSVU0gSmF2YVNjcmlwdCBpbmplY3Rpb24gYW5kIGJlYWNvbiByZXF1ZXN0IGxpc3RlbmVycy5cbiAqXG4gKiBAcGFyYW0gcGFnZSAgICBUaGUgUGxheXdyaWdodCBwYWdlIGluc3RhbmNlXG4gKiBAcGFyYW0gY29uZmlnICBUaGUgRHluYXRyYWNlIGNvbmZpZ3VyYXRpb25cbiAqIEBwYXJhbSBjYWNoZSAgIFRoZSB3b3JrZXItc2NvcGVkIGNhY2hlIGZvciBSVU0gSmF2YVNjcmlwdFxuICogQHBhcmFtIGNvbnRleHQgVGhlIHRlc3RpbmcgY29udGV4dCB0byBzdG9yZSBiZWFjb25zIGFuZCBldmVudHNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2V0dXBSdW1KYXZhU2NyaXB0QW5kTGlzdGVuZXJzKFxuICAgIHBhZ2U6IFBhZ2UsXG4gICAgY29uZmlnOiBEeW5hdHJhY2VDb25maWcsXG4gICAgY2FjaGU6IE1hcDxzdHJpbmcsIHN0cmluZz4sXG4gICAgY29udGV4dDogVGVzdGluZ0NvbnRleHRcbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZW5kcG9pbnRVcmwsIGFwcElkLCB0b2tlbiB9ID0gY29uZmlnO1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7ZW5kcG9pbnRVcmx9OiR7YXBwSWR9YDtcbiAgICBsZXQgcnVtID0gY2FjaGUuZ2V0KGNhY2hlS2V5KTtcblxuICAgIGlmICghcnVtKSB7XG4gICAgICAgIHJ1bSA9IGF3YWl0IGZldGNoUnVtSmF2YVNjcmlwdENvbnRlbnQoZW5kcG9pbnRVcmwsIGFwcElkLCB0b2tlbik7XG4gICAgICAgIGNvbnN0IGJlYWNvblVyaSA9IGV4dHJhY3RCZWFjb25VcmkocnVtKTtcbiAgICAgICAgY2FjaGUuc2V0KGNhY2hlS2V5LCBydW0pO1xuICAgICAgICBjYWNoZS5zZXQoYCR7Y2FjaGVLZXl9OmJlYWNvblVyaWAsIGJlYWNvblVyaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgYmVhY29uVXJpID0gY2FjaGUuZ2V0KGAke2NhY2hlS2V5fTpiZWFjb25VcmlgKTtcbiAgICAgICAgaWYgKCFiZWFjb25VcmkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byByZXRyaWV2ZSBiZWFjb25VcmkgZnJvbSBjYWNoZS5cIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwYWdlLm9uKFwicmVxdWVzdFwiLCAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB1cmwgPSByZXF1ZXN0LnVybCgpO1xuICAgICAgICAvLyBHZW4gMyBiZWFjb25zIHNob3VsZCBhbHdheXMgaGF2ZSB0eT1qc1xuICAgICAgICBpZiAoIXVybC5pbmNsdWRlcyhcInR5PWpzXCIpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmVhY29uQm9keVN0cmluZyA9IGV4dHJhY3RCZWFjb25Cb2R5KHJlcXVlc3QsIHVybCk7XG4gICAgICAgIGlmICghYmVhY29uQm9keVN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBiZWFjb25Cb2R5OiB7XG4gICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBldmVudHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gPSBKU09OLnBhcnNlKGJlYWNvbkJvZHlTdHJpbmcpO1xuICAgICAgICAgICAgY29udGV4dC5iZWFjb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgICAgIGJvZHk6IGJlYWNvbkJvZHlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29udGV4dC5ldmVudHMucHVzaCguLi5iZWFjb25Cb2R5LmRhdGEuZXZlbnRzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbRHluYXRyYWNlIFRlc3RpbmddIEZhaWxlZCB0byBwYXJzZSBiZWFjb24gYm9keTpcIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBhd2FpdCBwYWdlLmFkZEluaXRTY3JpcHQocnVtKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBEeW5hdHJhY2VUZXN0aW5nIEFQSSBvYmplY3Qgd2l0aCBhbGwgdGVzdGluZyBtZXRob2RzLlxuICpcbiAqIEBwYXJhbSBjb250ZXh0ICBUaGUgdGVzdGluZyBjb250ZXh0IGNvbnRhaW5pbmcgZXZlbnRzLCBiZWFjb25zLCBhbmQgd2FybmluZ3NcbiAqIEBwYXJhbSB0ZXN0SW5mbyBUaGUgUGxheXdyaWdodCB0ZXN0IGluZm8gZm9yIHNuYXBzaG90IHBhdGhzXG4gKiBAcmV0dXJucyAgICAgICAgVGhlIER5bmF0cmFjZVRlc3RpbmcgQVBJIG9iamVjdFxuICovXG5mdW5jdGlvbiBjcmVhdGVEeW5hdHJhY2VUZXN0aW5nQXBpKGNvbnRleHQ6IFRlc3RpbmdDb250ZXh0LCB0ZXN0SW5mbzogVGVzdEluZm8pOiBEeW5hdHJhY2VUZXN0aW5nIHtcbiAgICBjb25zdCB7IGV2ZW50cywgYmVhY29ucywgd2FybmluZ3MgfSA9IGNvbnRleHQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBhc3luYyB3YWl0Rm9yQmVhY29ucyhvcHRpb25zOiBXYWl0Rm9yQmVhY29uc09wdGlvbnMgPSB7fSk6IFByb21pc2U8QmVhY29uUmVxdWVzdFtdPiB7XG4gICAgICAgICAgICBjb25zdCB7IG1pbkNvdW50ID0gMCwgdGltZW91dCA9IERFRkFVTFRfVElNRU9VVCB9ID0gb3B0aW9ucztcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcblxuICAgICAgICAgICAgd2hpbGUgKGJlYWNvbnMubGVuZ3RoIDwgbWluQ291bnQgJiYgKERhdGUubm93KCkgLSBzdGFydCkgPD0gdGltZW91dCkge1xuICAgICAgICAgICAgICAgIGlmICh3YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93V2l0aEV2ZW50RHVtcChcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlVuZXhwZWN0ZWQgRHluYXRyYWNlIEFQSSB3YXJuaW5nczogXCIgKyB3YXJuaW5ncy5qb2luKFwiXFxuXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ3YWl0Rm9yQmVhY29ucyAtIHVuZXhwZWN0ZWQgd2FybmluZ3NcIlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhd2FpdCB3YWl0KDEwMCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChiZWFjb25zLmxlbmd0aCA8IG1pbkNvdW50KSB7XG4gICAgICAgICAgICAgICAgdGhyb3dXaXRoRXZlbnREdW1wKFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICBgRm91bmQgb25seSAke2JlYWNvbnMubGVuZ3RofSBEeW5hdHJhY2UgYmVhY29ucyBhZnRlciB0aW1lb3V0IG9mICR7dGltZW91dH1tcywgYnV0IGV4cGVjdGVkIGF0IGxlYXN0ICR7bWluQ291bnR9LmAsXG4gICAgICAgICAgICAgICAgICAgIFwid2FpdEZvckJlYWNvbnMgLSB0aW1lb3V0XCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gYmVhY29ucztcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBleHBlY3RUb0hhdmVTZW50RXZlbnQoXG4gICAgICAgICAgICBleHBlY3RlZEV2ZW50OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgICAgIG9wdGlvbnM6IEV4cGVjdE9wdGlvbnMgPSB7fVxuICAgICAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgdGltZW91dCA9IERFRkFVTFRfVElNRU9VVCB9ID0gb3B0aW9ucztcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGxldCBsYXN0Tm9uTWF0Y2g6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkID0gdm9pZCAwO1xuICAgICAgICAgICAgbGV0IG5leHRDaGVja0luZGV4ID0gMDtcblxuICAgICAgICAgICAgd2hpbGUgKChEYXRlLm5vdygpIC0gc3RhcnQpIDw9IHRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gbmV4dENoZWNrSW5kZXg7IGkgPCBldmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmVhY29uRXZlbnQgPSBldmVudHNbaV07XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QoYmVhY29uRXZlbnQpLnRvTWF0Y2hPYmplY3QoZXhwZWN0ZWRFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE5vbk1hdGNoID0gYmVhY29uRXZlbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbmV4dENoZWNrSW5kZXggPSBpICsgMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXdhaXQgd2FpdCgxMDApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWxhc3ROb25NYXRjaCkge1xuICAgICAgICAgICAgICAgIHRocm93V2l0aEV2ZW50RHVtcChcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgXCJEeW5hdHJhY2UgZGlkbid0IHNlbmQgYW55IGV2ZW50cy5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJleHBlY3RUb0hhdmVTZW50RXZlbnQgLSBubyBldmVudHNcIlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGR1bXBFdmVudHNJZkVuYWJsZWQoY29udGV4dCwgXCJleHBlY3RUb0hhdmVTZW50RXZlbnQgLSBubyBtYXRjaFwiKTtcbiAgICAgICAgICAgIGV4cGVjdChsYXN0Tm9uTWF0Y2gpLnRvTWF0Y2hPYmplY3QoZXhwZWN0ZWRFdmVudCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgZXhwZWN0VG9IYXZlU2VudEV2ZW50VGltZXMoXG4gICAgICAgICAgICBleHBlY3RlZEV2ZW50OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgICAgIHRpbWVzOiBudW1iZXIsXG4gICAgICAgICAgICBvcHRpb25zOiBFeHBlY3RPcHRpb25zID0ge31cbiAgICAgICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgICBjb25zdCB7IHRpbWVvdXQgPSBERUZBVUxUX1RJTUVPVVQgfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBsZXQgbGFzdE5vbk1hdGNoOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCA9IHZvaWQgMDtcbiAgICAgICAgICAgIGxldCBuZXh0Q2hlY2tJbmRleCA9IDA7XG4gICAgICAgICAgICBsZXQgZm91bmRUaW1lcyA9IDA7XG5cbiAgICAgICAgICAgIHdoaWxlICgoRGF0ZS5ub3coKSAtIHN0YXJ0KSA8PSB0aW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IG5leHRDaGVja0luZGV4OyBpIDwgZXZlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJlYWNvbkV2ZW50ID0gZXZlbnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGJlYWNvbkV2ZW50KS50b01hdGNoT2JqZWN0KGV4cGVjdGVkRXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRUaW1lcysrO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3ROb25NYXRjaCA9IGJlYWNvbkV2ZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG5leHRDaGVja0luZGV4ID0gaSArIDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChmb3VuZFRpbWVzID09PSB0aW1lcykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChmb3VuZFRpbWVzID4gdGltZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3dXaXRoRXZlbnREdW1wKFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGBFeHBlY3RlZCAke3RpbWVzfSBldmVudCBvY2N1cnJlbmNlcywgZm91bmQgJHtmb3VuZFRpbWVzfS5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJleHBlY3RUb0hhdmVTZW50RXZlbnRUaW1lcyAtIHRvbyBtYW55IG1hdGNoZXNcIlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhd2FpdCB3YWl0KDEwMCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghbGFzdE5vbk1hdGNoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3dXaXRoRXZlbnREdW1wKFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICBcIkR5bmF0cmFjZSBkaWRuJ3Qgc2VuZCBhbnkgZXZlbnRzXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZXhwZWN0VG9IYXZlU2VudEV2ZW50VGltZXMgLSBubyBldmVudHNcIlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmb3VuZFRpbWVzIDwgdGltZXMpIHtcbiAgICAgICAgICAgICAgICB0aHJvd1dpdGhFdmVudER1bXAoXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgIGBEaWRuJ3QgZmluZCB0aGUgZXhwZWN0ZWQgYW1vdW50IG9mICR7dGltZXN9IG1hdGNoaW5nIGV2ZW50cywgZm91bmQgJHtmb3VuZFRpbWVzfS5gLFxuICAgICAgICAgICAgICAgICAgICBcImV4cGVjdFRvSGF2ZVNlbnRFdmVudFRpbWVzIC0gY291bnQgbWlzbWF0Y2hcIlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGR1bXBFdmVudHNJZkVuYWJsZWQoY29udGV4dCwgXCJleHBlY3RUb0hhdmVTZW50RXZlbnRUaW1lcyAtIG5vIG1hdGNoXCIpO1xuICAgICAgICAgICAgZXhwZWN0KGxhc3ROb25NYXRjaCkudG9NYXRjaE9iamVjdChleHBlY3RlZEV2ZW50KTtcbiAgICAgICAgfSxcblxuICAgICAgICBjbGVhckV2ZW50cygpOiB2b2lkIHtcbiAgICAgICAgICAgIGV2ZW50cy5sZW5ndGggPSAwO1xuICAgICAgICAgICAgYmVhY29ucy5sZW5ndGggPSAwO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRvTWF0Y2hFdmVudFNuYXBzaG90KG9wdGlvbnM6IFNuYXBzaG90T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgaWdub3JlRXZlbnRzID0gWy4uLkRFRkFVTFRfSUdOT1JFRF9FVkVOVFNdLFxuICAgICAgICAgICAgICAgIGlnbm9yZWRGaWVsZHMgPSBbLi4uREVGQVVMVF9JR05PUkVEX0ZJRUxEU10sXG4gICAgICAgICAgICAgICAgcmVtb3ZlZEZpZWxkcyA9IFsuLi5ERUZBVUxUX1JFTU9WRURfRklFTERTXSxcbiAgICAgICAgICAgICAgICBuYW1lXG4gICAgICAgICAgICB9ID0gb3B0aW9ucztcblxuICAgICAgICAgICAgY29uc3Qgc25hcHNob3ROYW1lID0gbmFtZSA/PyBcImV2ZW50c1wiO1xuICAgICAgICAgICAgY29uc3Qgc25hcHNob3RQYXRoID0gdGVzdEluZm8uc25hcHNob3RQYXRoKGAke3NuYXBzaG90TmFtZX0uZXZlbnRzLnNuYXBgKTtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZVNuYXBzaG90cyA9IHRlc3RJbmZvLmNvbmZpZy51cGRhdGVTbmFwc2hvdHMgPT09IFwiYWxsXCI7XG5cbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkRXZlbnRzID0gZmlsdGVySWdub3JlZEV2ZW50cyhldmVudHMsIGlnbm9yZUV2ZW50cyk7XG4gICAgICAgICAgICBjb25zdCBwcm9jZXNzZWRFdmVudHMgPSBwcm9jZXNzRXZlbnRQcm9wZXJ0aWVzKGZpbHRlcmVkRXZlbnRzLCBpZ25vcmVkRmllbGRzLCByZW1vdmVkRmllbGRzKTtcbiAgICAgICAgICAgIGNvbnN0IHNuYXBzaG90UmVzdWx0ID0gcmVhZFNuYXBzaG90KHNuYXBzaG90UGF0aCk7XG5cbiAgICAgICAgICAgIGlmICghc25hcHNob3RSZXN1bHQuZXhpc3RzIHx8IHVwZGF0ZVNuYXBzaG90cykge1xuICAgICAgICAgICAgICAgIHdyaXRlU25hcHNob3Qoc25hcHNob3RQYXRoLCBwcm9jZXNzZWRFdmVudHMpO1xuICAgICAgICAgICAgICAgIGlmICghc25hcHNob3RSZXN1bHQuZXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBbRHluYXRyYWNlIFRlc3RpbmddIENyZWF0ZWQgbmV3IHNuYXBzaG90OiAke3NuYXBzaG90UGF0aH1gKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgW0R5bmF0cmFjZSBUZXN0aW5nXSBVcGRhdGVkIHNuYXBzaG90OiAke3NuYXBzaG90UGF0aH1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzbmFwc2hvdERhdGEgPSBzbmFwc2hvdFJlc3VsdC5kYXRhO1xuICAgICAgICAgICAgaWYgKCFzbmFwc2hvdERhdGEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiW0R5bmF0cmFjZSBUZXN0aW5nXSBTbmFwc2hvdCBmaWxlIGlzIGVtcHR5XCIpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU29ydCBib3RoIGFycmF5cyBieSBjaGFyYWN0ZXJpc3RpY3MgZm9yIG9yZGVyLWluZGVwZW5kZW50IGNvbXBhcmlzb25cbiAgICAgICAgICAgIGNvbnN0IHNvcnRlZEFjdHVhbCA9IHNvcnRFdmVudHNCeUNoYXJhY3RlcmlzdGljcyhwcm9jZXNzZWRFdmVudHMpO1xuICAgICAgICAgICAgY29uc3Qgc29ydGVkRXhwZWN0ZWQgPSBzb3J0RXZlbnRzQnlDaGFyYWN0ZXJpc3RpY3Moc25hcHNob3REYXRhKTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgUGxheXdyaWdodCdzIGV4cGVjdCBmb3IgY29tcGFyaXNvbiAtIHByb3ZpZGVzIGV4Y2VsbGVudCBkaWZmIG91dHB1dFxuICAgICAgICAgICAgICAgIGV4cGVjdChzb3J0ZWRBY3R1YWwpLnRvU3RyaWN0RXF1YWwoc29ydGVkRXhwZWN0ZWQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgZHVtcEV2ZW50c0lmRW5hYmxlZChjb250ZXh0LCBcInRvTWF0Y2hFdmVudFNuYXBzaG90IC0gbWlzbWF0Y2hcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYFtEeW5hdHJhY2UgVGVzdGluZ10gU25hcHNob3QgbWlzbWF0Y2ggZm9yIFwiJHtzbmFwc2hvdE5hbWV9XCIuXFxuXFxuYFxuICAgICAgICAgICAgICAgICAgICArIGBTbmFwc2hvdCBwYXRoOiAke3NuYXBzaG90UGF0aH1cXG5cXG5gXG4gICAgICAgICAgICAgICAgICAgICsgYCR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfVxcblxcbmBcbiAgICAgICAgICAgICAgICAgICAgKyBgVG8gdXBkYXRlIHRoZSBzbmFwc2hvdCwgcnVuIHdpdGggLS11cGRhdGUtc25hcHNob3RzIGZsYWcuYDtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGVycm9yTWVzc2FnZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn1cblxuLyoqXG4gKiBEdW1wcyByZWNlaXZlZCBldmVudHMgdG8gY29uc29sZSBpZiBkdW1wRXZlbnRzT25GYWlsIGlzIGVuYWJsZWQuXG4gKlxuICogQHBhcmFtIGNvbnRleHQgICAgIFRoZSB0ZXN0aW5nIGNvbnRleHQgY29udGFpbmluZyBldmVudHMgYW5kIGJlYWNvbnNcbiAqIEBwYXJhbSBkZXNjcmlwdGlvbiBBZGRpdGlvbmFsIGNvbnRleHQgYWJvdXQgd2h5IGV2ZW50cyBhcmUgYmVpbmcgZHVtcGVkXG4gKi9cbmZ1bmN0aW9uIGR1bXBFdmVudHNJZkVuYWJsZWQoY29udGV4dDogVGVzdGluZ0NvbnRleHQsIGRlc2NyaXB0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIWNvbnRleHQuZHVtcEV2ZW50c09uRmFpbCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coYFxcbltEeW5hdHJhY2UgVGVzdGluZ10gRXZlbnQgRHVtcCAoJHtkZXNjcmlwdGlvbn0pYCk7XG4gICAgY29uc29sZS5sb2coYFRvdGFsIGV2ZW50cyByZWNlaXZlZDogJHtjb250ZXh0LmV2ZW50cy5sZW5ndGh9YCk7XG4gICAgY29uc29sZS5sb2coYFRvdGFsIGJlYWNvbnMgcmVjZWl2ZWQ6ICR7Y29udGV4dC5iZWFjb25zLmxlbmd0aH1gKTtcblxuICAgIGlmIChjb250ZXh0LmV2ZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJObyBldmVudHMgd2VyZSByZWNlaXZlZC5cIik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJcXG5SZWNlaXZlZCBldmVudHM6XCIpO1xuICAgICAgICBjb250ZXh0LmV2ZW50cy5mb3JFYWNoKChldmVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBcXG5FdmVudCAke2luZGV4ICsgMX06YCwgSlNPTi5zdHJpbmdpZnkoZXZlbnQsIG51bGwsIDIpKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG4vKipcbiAqIFRocm93cyBhbiBlcnJvciB3aXRoIGEgY3VzdG9tIG1lc3NhZ2UuIElmIGV2ZW50IGR1bXBpbmcgaXMgZW5hYmxlZCwgbG9ncyB0aGUgcmVjZWl2ZWQgRHluYXRyYWNlIGV2ZW50cyBiZWZvcmVcbiAqIHRocm93aW5nIHRoZSBlcnJvci5cbiAqXG4gKiBAcGFyYW0gY29udGV4dCAgICAgVGhlIHRlc3RpbmcgY29udGV4dCBmb3IgZXZlbnQgZHVtcGluZ1xuICogQHBhcmFtIG1lc3NhZ2UgICAgIFRoZSBlcnJvciBtZXNzYWdlIHRvIGJlIHRocm93blxuICogQHBhcmFtIGRlc2NyaXB0aW9uIENvbnRleHQgYWJvdXQgdGhlIGZhaWx1cmUgZm9yIGV2ZW50IGR1bXBpbmdcbiAqL1xuZnVuY3Rpb24gdGhyb3dXaXRoRXZlbnREdW1wKGNvbnRleHQ6IFRlc3RpbmdDb250ZXh0LCBtZXNzYWdlOiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogbmV2ZXIge1xuICAgIGR1bXBFdmVudHNJZkVuYWJsZWQoY29udGV4dCwgZGVzY3JpcHRpb24gPz8gXCJhc3NlcnRpb24gZmFpbHVyZVwiKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGhlbHBmdWwgZXJyb3IgZm9yIG1pc3NpbmcgY29uZmlndXJhdGlvbiBmaWVsZHMuXG4gKlxuICogQHBhcmFtIG1pc3NpbmdGaWVsZHMgQXJyYXkgb2YgZmllbGQgbmFtZXMgdGhhdCBhcmUgbWlzc2luZyBvciBlbXB0eVxuICogQHJldHVybnMgICAgICAgICAgICAgRXJyb3Igd2l0aCBkZXRhaWxlZCBzZXR1cCBpbnN0cnVjdGlvbnNcbiAqL1xuZnVuY3Rpb24gY3JlYXRlTWlzc2luZ0NvbmZpZ0Vycm9yKG1pc3NpbmdGaWVsZHM6IHN0cmluZ1tdKTogRXJyb3Ige1xuICAgIGNvbnN0IG1pc3NpbmdEZXRhaWxzID0gbWlzc2luZ0ZpZWxkc1xuICAgICAgICAubWFwKGZpZWxkID0+IGAgICAgLSAke2ZpZWxkfTogJHtGSUVMRF9ERVNDUklQVElPTlNbZmllbGRdfWApXG4gICAgICAgIC5qb2luKFwiXFxuXCIpO1xuXG4gICAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICAgICAgYFtEeW5hdHJhY2UgVGVzdGluZ10gTWlzc2luZyByZXF1aXJlZCBjb25maWd1cmF0aW9uIGZpZWxkJHttaXNzaW5nRmllbGRzLmxlbmd0aCA+IDEgPyBcInNcIiA6IFwiXCJ9OiAke21pc3NpbmdGaWVsZHMuam9pbihcIiwgXCIpfVxuXG4ke21pc3NpbmdEZXRhaWxzfVxuXG5Db25maWd1cmUgdmlhIHRlc3QudXNlKCk6XG4gICAgdGVzdC51c2Uoe1xuICAgICAgICBkeW5hdHJhY2VDb25maWc6IHtcbiAgICAgICAgICAgIGVuZHBvaW50VXJsOiBwcm9jZXNzLmVudi5EVF9FTkRQT0lOVF9VUkwhLFxuICAgICAgICAgICAgYXBwSWQ6IHByb2Nlc3MuZW52LkRUX0FQUF9JRCEsXG4gICAgICAgICAgICB0b2tlbjogcHJvY2Vzcy5lbnYuRFRfVE9LRU4hXG4gICAgICAgIH1cbiAgICB9KTtcblxuU2VlIHRlc3RpbmcubWQgZm9yIGRldGFpbGVkIHNldHVwIGluc3RydWN0aW9ucy5gXG4gICAgKTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhlIER5bmF0cmFjZSBjb25maWd1cmF0aW9uIGFuZCB0aHJvd3MgYSBoZWxwZnVsIGVycm9yIGlmIGludmFsaWQuXG4gKlxuICogQHBhcmFtIGNvbmZpZyBUaGUgY29uZmlndXJhdGlvbiB0byB2YWxpZGF0ZVxuICogQHRocm93cyBFcnJvciB3aXRoIGRldGFpbGVkIHNldHVwIGluc3RydWN0aW9ucyBpZiBjb25maWd1cmF0aW9uIGlzIGludmFsaWRcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVEeW5hdHJhY2VDb25maWcoY29uZmlnOiBEeW5hdHJhY2VDb25maWcpOiB2b2lkIHtcbiAgICBjb25zdCBtaXNzaW5nRmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgaWYgKCFjb25maWcuZW5kcG9pbnRVcmwgfHwgY29uZmlnLmVuZHBvaW50VXJsLnRyaW0oKSA9PT0gXCJcIikge1xuICAgICAgICBtaXNzaW5nRmllbGRzLnB1c2goXCJlbmRwb2ludFVybFwiKTtcbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpZy5hcHBJZCB8fCBjb25maWcuYXBwSWQudHJpbSgpID09PSBcIlwiKSB7XG4gICAgICAgIG1pc3NpbmdGaWVsZHMucHVzaChcImFwcElkXCIpO1xuICAgIH1cblxuICAgIGlmICghY29uZmlnLnRva2VuIHx8IGNvbmZpZy50b2tlbi50cmltKCkgPT09IFwiXCIpIHtcbiAgICAgICAgbWlzc2luZ0ZpZWxkcy5wdXNoKFwidG9rZW5cIik7XG4gICAgfVxuXG4gICAgaWYgKG1pc3NpbmdGaWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBjcmVhdGVNaXNzaW5nQ29uZmlnRXJyb3IobWlzc2luZ0ZpZWxkcyk7XG4gICAgfVxufVxuXG4vKipcbiAqIEZldGNoZXMgdGhlIFJVTSBKYXZhU2NyaXB0IGNvbnRlbnQgZnJvbSB0aGUgRHluYXRyYWNlIEFQSSBlbmRwb2ludC5cbiAqXG4gKiBAcGFyYW0gZW5kcG9pbnRVcmwgVGhlIFVSTCBvZiB0aGUgRHluYXRyYWNlIEFQSSBlbmRwb2ludFxuICogQHBhcmFtIGFwcElkICAgICAgIFRoZSBhcHBsaWNhdGlvbiBJRCB0byBpZGVudGlmeSB0aGUgY29ycmVjdCBSVU0gSmF2YVNjcmlwdFxuICogQHBhcmFtIHRva2VuICAgICAgIFRoZSBhdXRoZW50aWNhdGlvbiB0b2tlbiBmb3IgdGhlIGluc3RhbGxhdGlvblxuICogQHJldHVybnMgICAgICAgICAgIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBSVU0gSmF2YVNjcmlwdCBjb250ZW50XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoUnVtSmF2YVNjcmlwdENvbnRlbnQoZW5kcG9pbnRVcmw6IHN0cmluZywgYXBwSWQ6IHN0cmluZywgdG9rZW46IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcnVtQXBpUmVzdWx0ID0gYXdhaXQgZmV0Y2hSdW1KYXZhU2NyaXB0KGVuZHBvaW50VXJsLCBhcHBJZCwgdG9rZW4pO1xuICAgIGlmICghcnVtQXBpUmVzdWx0LmluY2x1ZGVzKFwiX2NvbXBsZXRlLmpzXCIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRHluYXRyYWNlIHJlY2VpdmVkIHVuZXhwZWN0ZWQgUlVNIEphdmFTY3JpcHQgd2hlbiByZXF1ZXN0aW5nIHRoZSBKYXZhU2NyaXB0IFRhZyB2aWEgQVBJOiAke3J1bUFwaVJlc3VsdH1gKTtcbiAgICB9XG5cbiAgICAvLyBFeHRyYWN0IHRoZSBzcmMgVVJMIGZyb20gdGhlIHNjcmlwdCB0YWdcbiAgICBjb25zdCBzcmNNYXRjaCA9IHJ1bUFwaVJlc3VsdC5tYXRjaCgvc3JjPVwiKFteXCJdKylcIi8pO1xuICAgIGlmICghc3JjTWF0Y2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGV4dHJhY3Qgc3JjIFVSTCBmcm9tIFJVTSBKYXZhU2NyaXB0IHRhZy5cIik7XG4gICAgfVxuICAgIGNvbnN0IHNjcmlwdFVybCA9IHNyY01hdGNoWzFdO1xuXG4gICAgLy8gRmV0Y2ggdGhlIGFjdHVhbCBKYXZhU2NyaXB0IGNvbnRlbnRcbiAgICBjb25zdCBzY3JpcHRSZXNwb25zZSA9IGF3YWl0IGZldGNoKHNjcmlwdFVybCk7XG4gICAgcmV0dXJuIHNjcmlwdFJlc3BvbnNlLnRleHQoKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgYmVhY29uIFVSSSBmcm9tIHRoZSBSVU0gSmF2YVNjcmlwdCBjb250ZW50LlxuICpcbiAqIEBwYXJhbSBydW0gVGhlIFJVTSBKYXZhU2NyaXB0IGNvbnRlbnQgdG8gZXh0cmFjdCB0aGUgYmVhY29uIFVSSSBmcm9tXG4gKiBAcmV0dXJucyAgIFRoZSBleHRyYWN0ZWQgYmVhY29uIFVSSVxuICovXG5mdW5jdGlvbiBleHRyYWN0QmVhY29uVXJpKHJ1bTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBFeHRyYWN0IHRoZSBiZWFjb25VcmkgZnJvbSB0aGUgSmF2YVNjcmlwdCBjb250ZW50XG4gICAgY29uc3QgYmVhY29uVXJpTWF0Y2ggPSBydW0ubWF0Y2goL1wiYmVhY29uVXJpXCI6XCIoW15cIl0rKVwiLyk7XG4gICAgaWYgKCFiZWFjb25VcmlNYXRjaCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZXh0cmFjdCBiZWFjb25VcmkgZnJvbSBSVU0gSmF2YVNjcmlwdCBjb250ZW50LlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGJlYWNvblVyaU1hdGNoWzFdO1xufVxuXG4vKipcbiAqIFdhaXRzIGZvciBhIGdpdmVuIHRpbWUgYW5kIHJlc29sdmVzIHVwb24gdGltZW91dC5cbiAqXG4gKiBAcGFyYW0gdGltZSBUaGUgdGltZSB0byB3YWl0IGluIG1pbGxpc2Vjb25kc1xuICogQHJldHVybnMgICAgQSByZXNvbHZlZCBwcm9taXNlIHdoZW4gdGhlIHRpbWUgcmFuIG91dFxuICovXG5mdW5jdGlvbiB3YWl0KHRpbWU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIHRpbWUpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBib2R5IG9mIGEgYmVhY29uIHJlcXVlc3QsIG9wdGlvbmFsbHkgZGVjb21wcmVzc2luZyBpdCBpZiB0aGUgVVJMIGluZGljYXRlcyBjb21wcmVzc2VkIGRhdGEuXG4gKlxuICogQHBhcmFtIHJlcXVlc3QgVGhlIHJlcXVlc3Qgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGJlYWNvbiBkYXRhXG4gKiBAcGFyYW0gdXJsICAgICBUaGUgVVJMIG9mIHRoZSByZXF1ZXN0IHRvIGNoZWNrIGZvciBzcGVjaWZpYyBjb21wcmVzc2lvbiBpbmRpY2F0b3JzXG4gKiBAcmV0dXJucyAgICAgICBUaGUgZXh0cmFjdGVkIGJvZHkgb2YgdGhlIGJlYWNvbiByZXF1ZXN0LCBvciBudWxsIGlmIG5vIHJlcXVlc3QgYm9keSBpcyBwcmVzZW50XG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RCZWFjb25Cb2R5KHJlcXVlc3Q6IFJlcXVlc3QsIHVybDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgYnVmZmVyID0gcmVxdWVzdC5wb3N0RGF0YUJ1ZmZlcigpO1xuICAgIGlmICh1cmwuaW5jbHVkZXMoXCJjbz1zbmFwcHlcIikgJiYgYnVmZmVyKSB7XG4gICAgICAgIGNvbnN0IHVpbnQ4RGF0YSA9IHVuY29tcHJlc3MoYnVmZmVyKTtcbiAgICAgICAgcmV0dXJuIGRlY29kZXIuZGVjb2RlKHVpbnQ4RGF0YSk7XG4gICAgfVxuICAgIHJldHVybiByZXF1ZXN0LnBvc3REYXRhKCk7XG59XG4iXX0=
397
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS90ZXN0aW5nL3Rlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBaUJBLE9BQU8sRUFDSCxNQUFNLEVBQ04sSUFBSSxJQUFJLElBQUksRUFDZixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDSCxzQkFBc0IsRUFDdEIsc0JBQXNCLEVBQ3RCLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsc0JBQXNCLEVBQ3RCLFlBQVksRUFDWiwyQkFBMkIsRUFDM0IsYUFBYSxFQUNoQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUV0QyxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUM7QUFFOUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQVlsQzs7R0FFRztBQUNILE1BQU0sa0JBQWtCLEdBQTJCO0lBQy9DLFdBQVcsRUFBRSwrRUFBK0U7SUFDNUYsS0FBSyxFQUFFLGlFQUFpRTtJQUN4RSxLQUFLLEVBQUUsa0VBQWtFO0NBQzVFLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBeUQ7SUFDcEYsZUFBZSxFQUFFLENBQUM7WUFDZCxLQUFLLEVBQUUsRUFBRTtZQUNULFdBQVcsRUFBRSxFQUFFO1lBQ2YsS0FBSyxFQUFFLEVBQUU7U0FDWixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO0lBRXBCLDZIQUE2SDtJQUM3SCxrQkFBa0IsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDcEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7WUFDeEMsTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFD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Q0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQzFELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLDBEQUEwRCxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUNELE9BQU8sY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsSUFBSSxDQUFDLElBQVk7SUFDdEIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzNCLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDOUIsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxPQUFnQixFQUFFLEdBQVc7SUFDcEQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hDLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUN0QyxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckMsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuICAgIEJlYWNvblJlcXVlc3QsXG4gICAgRHluYXRyYWNlVGVzdGluZyxcbiAgICBFeHBlY3RPcHRpb25zLFxuICAgIFdhaXRGb3JCZWFjb25zT3B0aW9uc1xufSBmcm9tIFwiLi90eXBlcy9keW5hdHJhY2UtdGVzdGluZy5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICAgIER5bmF0cmFjZVRlc3RpbmdGaXh0dXJlLFxuICAgIER5bmF0cmFjZVRlc3RpbmdXb3JrZXJGaXh0dXJlXG59IGZyb20gXCIuL3R5cGVzL2R5bmF0cmFjZS10ZXN0aW5nLWZpeHR1cmVzLmpzXCI7XG5pbXBvcnQgdHlwZSB7XG4gICAgUGFnZSxcbiAgICBSZXF1ZXN0LFxuICAgIFRlc3RJbmZvXG59IGZyb20gXCJAcGxheXdyaWdodC90ZXN0XCI7XG5pbXBvcnQgdHlwZSB7IER5bmF0cmFjZUNvbmZpZyB9IGZyb20gXCIuL3R5cGVzL2R5bmF0cmFjZS1jb25maWcuanNcIjtcbmltcG9ydCB0eXBlIHsgU25hcHNob3RPcHRpb25zIH0gZnJvbSBcIi4vc25hcHNob3QuanNcIjtcbmltcG9ydCB7XG4gICAgZXhwZWN0LFxuICAgIHRlc3QgYXMgYmFzZVxufSBmcm9tIFwiQHBsYXl3cmlnaHQvdGVzdFwiO1xuaW1wb3J0IHtcbiAgICBERUZBVUxUX0lHTk9SRURfRVZFTlRTLFxuICAgIERFRkFVTFRfSUdOT1JFRF9GSUVMRFMsXG4gICAgREVGQVVMVF9SRU1PVkVEX0ZJRUxEUyxcbiAgICBmaWx0ZXJJZ25vcmVkRXZlbnRzLFxuICAgIHByb2Nlc3NFdmVudFByb3BlcnRpZXMsXG4gICAgcmVhZFNuYXBzaG90LFxuICAgIHNvcnRFdmVudHNCeUNoYXJhY3RlcmlzdGljcyxcbiAgICB3cml0ZVNuYXBzaG90XG59IGZyb20gXCIuL3NuYXBzaG90LmpzXCI7XG5pbXBvcnQgeyBmZXRjaFJ1bUphdmFTY3JpcHQgfSBmcm9tIFwiLi9pbnN0YWxsLmpzXCI7XG5pbXBvcnQgeyB1bmNvbXByZXNzIH0gZnJvbSBcInNuYXBweWpzXCI7XG5cbmNvbnN0IERFRkFVTFRfVElNRU9VVCA9IDVfMDAwO1xuXG5jb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG5cbi8qKlxuICogSW50ZXJuYWwgY29udGV4dCBzaGFyZWQgYmV0d2VlbiB0ZXN0aW5nIEFQSSBtZXRob2RzLlxuICovXG5pbnRlcmZhY2UgVGVzdGluZ0NvbnRleHQge1xuICAgIGV2ZW50czogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTtcbiAgICBiZWFjb25zOiBCZWFjb25SZXF1ZXN0W107XG4gICAgd2FybmluZ3M6IHN0cmluZ1tdO1xuICAgIGR1bXBFdmVudHNPbkZhaWw6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRmllbGQgZGVzY3JpcHRpb25zIGZvciBjb25maWd1cmF0aW9uIGVycm9yIG1lc3NhZ2VzLlxuICovXG5jb25zdCBGSUVMRF9ERVNDUklQVElPTlM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgZW5kcG9pbnRVcmw6IFwiVGhlIER5bmF0cmFjZSBlbnZpcm9ubWVudCBVUkwgKGUuZy4sIFxcXCJodHRwczovL2FiYzEyMzQ1LmxpdmUuZHluYXRyYWNlLmNvbVxcXCIpXCIsXG4gICAgYXBwSWQ6IFwiVGhlIFJVTSBhcHBsaWNhdGlvbiBJRCAoZS5nLiwgXFxcIkFQUExJQ0FUSU9OLUFCQ0RFRjAxMjM0NTY3ODlcXFwiKVwiLFxuICAgIHRva2VuOiBcIlRoZSBBUEkgdG9rZW4gd2l0aCBcXFwiUmVhZCBSVU0gbWFudWFsIGluc2VydGlvbiB0YWdzXFxcIiBwZXJtaXNzaW9uXCJcbn07XG5cbmV4cG9ydCBjb25zdCB0ZXN0ID0gYmFzZS5leHRlbmQ8RHluYXRyYWNlVGVzdGluZ0ZpeHR1cmUsIER5bmF0cmFjZVRlc3RpbmdXb3JrZXJGaXh0dXJlPih7XG4gICAgZHluYXRyYWNlQ29uZmlnOiBbe1xuICAgICAgICBhcHBJZDogXCJcIixcbiAgICAgICAgZW5kcG9pbnRVcmw6IFwiXCIsXG4gICAgICAgIHRva2VuOiBcIlwiXG4gICAgfSwgeyBvcHRpb246IHRydWUgfV0sXG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHktcGF0dGVybiAtLSBQbGF5d3JpZ2h0IHJlcXVpcmVzIG9iamVjdCBkZXN0cnVjdHVyaW5nIGV2ZW4gd2hlbiBubyBkZXBlbmRlbmNpZXMgYXJlIG5lZWRlZFxuICAgIHJ1bUphdmFTY3JpcHRDYWNoZTogW2FzeW5jICh7IH0sIHVzZSkgPT4geyAvLyBOT1NPTkFSXG4gICAgICAgIGNvbnN0IGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICAgICAgYXdhaXQgdXNlKGNhY2hlKTtcbiAgICB9LCB7IHNjb3BlOiBcIndvcmtlclwiLCBhdXRvOiB0cnVlLCBib3g6IHRydWUgfV0sXG5cbiAgICBkeW5hdHJhY2VUZXN0aW5nOiBhc3luYyAoXG4gICAgICAgIHsgcGFnZSwgZHluYXRyYWNlQ29uZmlnLCBydW1KYXZhU2NyaXB0Q2FjaGUgfSxcbiAgICAgICAgdXNlLFxuICAgICAgICB0ZXN0SW5mbzogVGVzdEluZm9cbiAgICApID0+IHtcbiAgICAgICAgdmFsaWRhdGVEeW5hdHJhY2VDb25maWcoZHluYXRyYWNlQ29uZmlnKTtcbiAgICAgICAgd2FybklmUGFnZUFscmVhZHlOYXZpZ2F0ZWQocGFnZSk7XG5cbiAgICAgICAgY29uc3QgeyBpZ25vcmVXYXJuaW5ncyA9IFtdLCBkdW1wRXZlbnRzT25GYWlsID0gZmFsc2UgfSA9IGR5bmF0cmFjZUNvbmZpZztcbiAgICAgICAgY29uc3QgY29udGV4dDogVGVzdGluZ0NvbnRleHQgPSB7XG4gICAgICAgICAgICBldmVudHM6IFtdLFxuICAgICAgICAgICAgYmVhY29uczogW10sXG4gICAgICAgICAgICB3YXJuaW5nczogW10sXG4gICAgICAgICAgICBkdW1wRXZlbnRzT25GYWlsXG4gICAgICAgIH07XG5cbiAgICAgICAgc2V0dXBDb25zb2xlV2FybmluZ0xpc3RlbmVyKHBhZ2UsIGlnbm9yZVdhcm5pbmdzLCBjb250ZXh0KTtcbiAgICAgICAgYXdhaXQgc2V0dXBSdW1KYXZhU2NyaXB0QW5kTGlzdGVuZXJzKHBhZ2UsIGR5bmF0cmFjZUNvbmZpZywgcnVtSmF2YVNjcmlwdENhY2hlLCBjb250ZXh0KTtcbiAgICAgICAgYXdhaXQgdXNlKGNyZWF0ZUR5bmF0cmFjZVRlc3RpbmdBcGkoY29udGV4dCwgdGVzdEluZm8pKTtcbiAgICB9XG59KTtcblxuLyoqXG4gKiBXYXJucyBpZiB0aGUgcGFnZSBoYXMgYWxyZWFkeSBuYXZpZ2F0ZWQgYXdheSBmcm9tIGFib3V0OmJsYW5rLlxuICogVGhpcyBpbmRpY2F0ZXMgdGhlIGZpeHR1cmUgbWF5IG5vdCBpbmplY3QgUlVNIEphdmFTY3JpcHQgY29ycmVjdGx5LlxuICpcbiAqIEBwYXJhbSBwYWdlIFRoZSBQbGF5d3JpZ2h0IHBhZ2UgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gd2FybklmUGFnZUFscmVhZHlOYXZpZ2F0ZWQocGFnZTogUGFnZSk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRVcmwgPSBwYWdlLnVybCgpO1xuICAgIGlmIChjdXJyZW50VXJsICE9PSBcImFib3V0OmJsYW5rXCIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFtEeW5hdHJhY2UgVGVzdGluZ10gV2FybmluZzogUGFnZSBoYXMgYWxyZWFkeSBuYXZpZ2F0ZWQgdG8gXCIke2N1cnJlbnRVcmx9XCIuXG5UaGUgUlVNIEphdmFTY3JpcHQgbWF5IG5vdCBiZSBpbmplY3RlZC4gRW5zdXJlIGR5bmF0cmFjZVRlc3RpbmcgaXMgZGVzdHJ1Y3R1cmVkXG5iZWZvcmUgYW55IGZpeHR1cmVzIHRoYXQgbmF2aWdhdGUgdGhlIHBhZ2UuXG5cbkV4YW1wbGUgb2YgY29ycmVjdCBmaXh0dXJlIG9yZGVyOlxuICAgIHRlc3QoXCJteSB0ZXN0XCIsIGFzeW5jICh7IGR5bmF0cmFjZVRlc3RpbmcsIG15Q3VzdG9tRml4dHVyZSwgcGFnZSB9KSA9PiB7IC4uLiB9KTtcblxuU2VlIHRlc3RpbmcubWQgZm9yIG1vcmUgaW5mb3JtYXRpb24uYFxuICAgICAgICApO1xuICAgIH1cbn1cblxuLyoqXG4gKiBTZXRzIHVwIGEgY29uc29sZSBsaXN0ZW5lciB0byBjYXB0dXJlIER5bmF0cmFjZS1yZWxhdGVkIHdhcm5pbmdzLlxuICpcbiAqIEBwYXJhbSBwYWdlICAgICAgICAgICBUaGUgUGxheXdyaWdodCBwYWdlIGluc3RhbmNlXG4gKiBAcGFyYW0gaWdub3JlV2FybmluZ3MgQXJyYXkgb2YgcmVnZXggcGF0dGVybnMgZm9yIHdhcm5pbmdzIHRvIGlnbm9yZVxuICogQHBhcmFtIGNvbnRleHQgICAgICAgIFRoZSB0ZXN0aW5nIGNvbnRleHQgdG8gc3RvcmUgd2FybmluZ3NcbiAqL1xuZnVuY3Rpb24gc2V0dXBDb25zb2xlV2FybmluZ0xpc3RlbmVyKFxuICAgIHBhZ2U6IFBhZ2UsXG4gICAgaWdub3JlV2FybmluZ3M6IHN0cmluZ1tdLFxuICAgIGNvbnRleHQ6IFRlc3RpbmdDb250ZXh0XG4pOiB2b2lkIHtcbiAgICBjb25zdCBpZ25vcmVSZWdleGVzID0gaWdub3JlV2FybmluZ3MubWFwKHggPT4gbmV3IFJlZ0V4cCh4LCBcImlcIikpO1xuICAgIHBhZ2Uub24oXCJjb25zb2xlXCIsIChtc2cpID0+IHtcbiAgICAgICAgaWYgKG1zZy50ZXh0KCkuaW5jbHVkZXMoXCJ5bmF0cmFjZVwiKSAmJiAhaWdub3JlUmVnZXhlcy5zb21lKHJlZ2V4ID0+IHJlZ2V4LnRlc3QobXNnLnRleHQoKSkpKSB7XG4gICAgICAgICAgICBjb250ZXh0Lndhcm5pbmdzLnB1c2gobXNnLnRleHQoKSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuLyoqXG4gKiBTZXRzIHVwIFJVTSBKYXZhU2NyaXB0IGluamVjdGlvbiBhbmQgYmVhY29uIHJlcXVlc3QgbGlzdGVuZXJzLlxuICpcbiAqIEBwYXJhbSBwYWdlICAgIFRoZSBQbGF5d3JpZ2h0IHBhZ2UgaW5zdGFuY2VcbiAqIEBwYXJhbSBjb25maWcgIFRoZSBEeW5hdHJhY2UgY29uZmlndXJhdGlvblxuICogQHBhcmFtIGNhY2hlICAgVGhlIHdvcmtlci1zY29wZWQgY2FjaGUgZm9yIFJVTSBKYXZhU2NyaXB0XG4gKiBAcGFyYW0gY29udGV4dCBUaGUgdGVzdGluZyBjb250ZXh0IHRvIHN0b3JlIGJlYWNvbnMgYW5kIGV2ZW50c1xuICovXG5hc3luYyBmdW5jdGlvbiBzZXR1cFJ1bUphdmFTY3JpcHRBbmRMaXN0ZW5lcnMoXG4gICAgcGFnZTogUGFnZSxcbiAgICBjb25maWc6IER5bmF0cmFjZUNvbmZpZyxcbiAgICBjYWNoZTogTWFwPHN0cmluZywgc3RyaW5nPixcbiAgICBjb250ZXh0OiBUZXN0aW5nQ29udGV4dFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBhcHBJZCwgZW5kcG9pbnRVcmwgfSA9IGNvbmZpZztcbiAgICBjb25zdCBjYWNoZUtleSA9IGAke2VuZHBvaW50VXJsfToke2FwcElkfWA7XG4gICAgbGV0IHJ1bSA9IGNhY2hlLmdldChjYWNoZUtleSk7XG5cbiAgICBpZiAoIXJ1bSkge1xuICAgICAgICBydW0gPSBhd2FpdCBmZXRjaFJ1bUphdmFTY3JpcHRDb250ZW50KGNvbmZpZyk7XG4gICAgICAgIGNvbnN0IGJlYWNvblVyaSA9IGV4dHJhY3RCZWFjb25VcmkocnVtKTtcbiAgICAgICAgY2FjaGUuc2V0KGNhY2hlS2V5LCBydW0pO1xuICAgICAgICBjYWNoZS5zZXQoYCR7Y2FjaGVLZXl9OmJlYWNvblVyaWAsIGJlYWNvblVyaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgYmVhY29uVXJpID0gY2FjaGUuZ2V0KGAke2NhY2hlS2V5fTpiZWFjb25VcmlgKTtcbiAgICAgICAgaWYgKCFiZWFjb25VcmkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byByZXRyaWV2ZSBiZWFjb25VcmkgZnJvbSBjYWNoZS5cIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwYWdlLm9uKFwicmVxdWVzdFwiLCAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB1cmwgPSByZXF1ZXN0LnVybCgpO1xuICAgICAgICAvLyBHZW4gMyBiZWFjb25zIHNob3VsZCBhbHdheXMgaGF2ZSB0eT1qc1xuICAgICAgICBpZiAoIXVybC5pbmNsdWRlcyhcInR5PWpzXCIpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmVhY29uQm9keVN0cmluZyA9IGV4dHJhY3RCZWFjb25Cb2R5KHJlcXVlc3QsIHVybCk7XG4gICAgICAgIGlmICghYmVhY29uQm9keVN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBiZWFjb25Cb2R5OiB7XG4gICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBldmVudHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gPSBKU09OLnBhcnNlKGJlYWNvbkJvZHlTdHJpbmcpO1xuICAgICAgICAgICAgY29udGV4dC5iZWFjb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgICAgIGJvZHk6IGJlYWNvbkJvZHlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29udGV4dC5ldmVudHMucHVzaCguLi5iZWFjb25Cb2R5LmRhdGEuZXZlbnRzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbRHluYXRyYWNlIFRlc3RpbmddIEZhaWxlZCB0byBwYXJzZSBiZWFjb24gYm9keTpcIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBhd2FpdCBwYWdlLmFkZEluaXRTY3JpcHQocnVtKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBEeW5hdHJhY2VUZXN0aW5nIEFQSSBvYmplY3Qgd2l0aCBhbGwgdGVzdGluZyBtZXRob2RzLlxuICpcbiAqIEBwYXJhbSBjb250ZXh0ICBUaGUgdGVzdGluZyBjb250ZXh0IGNvbnRhaW5pbmcgZXZlbnRzLCBiZWFjb25zLCBhbmQgd2FybmluZ3NcbiAqIEBwYXJhbSB0ZXN0SW5mbyBUaGUgUGxheXdyaWdodCB0ZXN0IGluZm8gZm9yIHNuYXBzaG90IHBhdGhzXG4gKiBAcmV0dXJucyAgICAgICAgVGhlIER5bmF0cmFjZVRlc3RpbmcgQVBJIG9iamVjdFxuICovXG5mdW5jdGlvbiBjcmVhdGVEeW5hdHJhY2VUZXN0aW5nQXBpKGNvbnRleHQ6IFRlc3RpbmdDb250ZXh0LCB0ZXN0SW5mbzogVGVzdEluZm8pOiBEeW5hdHJhY2VUZXN0aW5nIHtcbiAgICBjb25zdCB7IGV2ZW50cywgYmVhY29ucywgd2FybmluZ3MgfSA9IGNvbnRleHQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBhc3luYyB3YWl0Rm9yQmVhY29ucyhvcHRpb25zOiBXYWl0Rm9yQmVhY29uc09wdGlvbnMgPSB7fSk6IFByb21pc2U8QmVhY29uUmVxdWVzdFtdPiB7XG4gICAgICAgICAgICBjb25zdCB7IG1pbkNvdW50ID0gMCwgdGltZW91dCA9IERFRkFVTFRfVElNRU9VVCB9ID0gb3B0aW9ucztcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcblxuICAgICAgICAgICAgd2hpbGUgKGJlYWNvbnMubGVuZ3RoIDwgbWluQ291bnQgJiYgKERhdGUubm93KCkgLSBzdGFydCkgPD0gdGltZW91dCkge1xuICAgICAgICAgICAgICAgIGlmICh3YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93V2l0aEV2ZW50RHVtcChcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlVuZXhwZWN0ZWQgRHluYXRyYWNlIEFQSSB3YXJuaW5nczogXCIgKyB3YXJuaW5ncy5qb2luKFwiXFxuXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ3YWl0Rm9yQmVhY29ucyAtIHVuZXhwZWN0ZWQgd2FybmluZ3NcIlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhd2FpdCB3YWl0KDEwMCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChiZWFjb25zLmxlbmd0aCA8IG1pbkNvdW50KSB7XG4gICAgICAgICAgICAgICAgdGhyb3dXaXRoRXZlbnREdW1wKFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICBgRm91bmQgb25seSAke2JlYWNvbnMubGVuZ3RofSBEeW5hdHJhY2UgYmVhY29ucyBhZnRlciB0aW1lb3V0IG9mICR7dGltZW91dH1tcywgYnV0IGV4cGVjdGVkIGF0IGxlYXN0ICR7bWluQ291bnR9LmAsXG4gICAgICAgICAgICAgICAgICAgIFwid2FpdEZvckJlYWNvbnMgLSB0aW1lb3V0XCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gYmVhY29ucztcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBleHBlY3RUb0hhdmVTZW50RXZlbnQoXG4gICAgICAgICAgICBleHBlY3RlZEV2ZW50OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgICAgIG9wdGlvbnM6IEV4cGVjdE9wdGlvbnMgPSB7fVxuICAgICAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgdGltZW91dCA9IERFRkFVTFRfVElNRU9VVCB9ID0gb3B0aW9ucztcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGxldCBsYXN0Tm9uTWF0Y2g6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkID0gdm9pZCAwO1xuICAgICAgICAgICAgbGV0IG5leHRDaGVja0luZGV4ID0gMDtcblxuICAgICAgICAgICAgd2hpbGUgKChEYXRlLm5vdygpIC0gc3RhcnQpIDw9IHRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gbmV4dENoZWNrSW5kZXg7IGkgPCBldmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmVhY29uRXZlbnQgPSBldmVudHNbaV07XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QoYmVhY29uRXZlbnQpLnRvTWF0Y2hPYmplY3QoZXhwZWN0ZWRFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE5vbk1hdGNoID0gYmVhY29uRXZlbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbmV4dENoZWNrSW5kZXggPSBpICsgMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXdhaXQgd2FpdCgxMDApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWxhc3ROb25NYXRjaCkge1xuICAgICAgICAgICAgICAgIHRocm93V2l0aEV2ZW50RHVtcChcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgXCJEeW5hdHJhY2UgZGlkbid0IHNlbmQgYW55IGV2ZW50cy5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJleHBlY3RUb0hhdmVTZW50RXZlbnQgLSBubyBldmVudHNcIlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGR1bXBFdmVudHNJZkVuYWJsZWQoY29udGV4dCwgXCJleHBlY3RUb0hhdmVTZW50RXZlbnQgLSBubyBtYXRjaFwiKTtcbiAgICAgICAgICAgIGV4cGVjdChsYXN0Tm9uTWF0Y2gpLnRvTWF0Y2hPYmplY3QoZXhwZWN0ZWRFdmVudCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgZXhwZWN0VG9IYXZlU2VudEV2ZW50VGltZXMoXG4gICAgICAgICAgICBleHBlY3RlZEV2ZW50OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgICAgIHRpbWVzOiBudW1iZXIsXG4gICAgICAgICAgICBvcHRpb25zOiBFeHBlY3RPcHRpb25zID0ge31cbiAgICAgICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgICBjb25zdCB7IHRpbWVvdXQgPSBERUZBVUxUX1RJTUVPVVQgfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBsZXQgbGFzdE5vbk1hdGNoOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCA9IHZvaWQgMDtcbiAgICAgICAgICAgIGxldCBuZXh0Q2hlY2tJbmRleCA9IDA7XG4gICAgICAgICAgICBsZXQgZm91bmRUaW1lcyA9IDA7XG5cbiAgICAgICAgICAgIHdoaWxlICgoRGF0ZS5ub3coKSAtIHN0YXJ0KSA8PSB0aW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IG5leHRDaGVja0luZGV4OyBpIDwgZXZlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJlYWNvbkV2ZW50ID0gZXZlbnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGJlYWNvbkV2ZW50KS50b01hdGNoT2JqZWN0KGV4cGVjdGVkRXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRUaW1lcysrO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3ROb25NYXRjaCA9IGJlYWNvbkV2ZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG5leHRDaGVja0luZGV4ID0gaSArIDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChmb3VuZFRpbWVzID09PSB0aW1lcykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChmb3VuZFRpbWVzID4gdGltZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3dXaXRoRXZlbnREdW1wKFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGBFeHBlY3RlZCAke3RpbWVzfSBldmVudCBvY2N1cnJlbmNlcywgZm91bmQgJHtmb3VuZFRpbWVzfS5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJleHBlY3RUb0hhdmVTZW50RXZlbnRUaW1lcyAtIHRvbyBtYW55IG1hdGNoZXNcIlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhd2FpdCB3YWl0KDEwMCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghbGFzdE5vbk1hdGNoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3dXaXRoRXZlbnREdW1wKFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICBcIkR5bmF0cmFjZSBkaWRuJ3Qgc2VuZCBhbnkgZXZlbnRzXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZXhwZWN0VG9IYXZlU2VudEV2ZW50VGltZXMgLSBubyBldmVudHNcIlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmb3VuZFRpbWVzIDwgdGltZXMpIHtcbiAgICAgICAgICAgICAgICB0aHJvd1dpdGhFdmVudER1bXAoXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgIGBEaWRuJ3QgZmluZCB0aGUgZXhwZWN0ZWQgYW1vdW50IG9mICR7dGltZXN9IG1hdGNoaW5nIGV2ZW50cywgZm91bmQgJHtmb3VuZFRpbWVzfS5gLFxuICAgICAgICAgICAgICAgICAgICBcImV4cGVjdFRvSGF2ZVNlbnRFdmVudFRpbWVzIC0gY291bnQgbWlzbWF0Y2hcIlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGR1bXBFdmVudHNJZkVuYWJsZWQoY29udGV4dCwgXCJleHBlY3RUb0hhdmVTZW50RXZlbnRUaW1lcyAtIG5vIG1hdGNoXCIpO1xuICAgICAgICAgICAgZXhwZWN0KGxhc3ROb25NYXRjaCkudG9NYXRjaE9iamVjdChleHBlY3RlZEV2ZW50KTtcbiAgICAgICAgfSxcblxuICAgICAgICBjbGVhckV2ZW50cygpOiB2b2lkIHtcbiAgICAgICAgICAgIGV2ZW50cy5sZW5ndGggPSAwO1xuICAgICAgICAgICAgYmVhY29ucy5sZW5ndGggPSAwO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRvTWF0Y2hFdmVudFNuYXBzaG90KG9wdGlvbnM6IFNuYXBzaG90T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgaWdub3JlRXZlbnRzID0gWy4uLkRFRkFVTFRfSUdOT1JFRF9FVkVOVFNdLFxuICAgICAgICAgICAgICAgIGlnbm9yZWRGaWVsZHMgPSBbLi4uREVGQVVMVF9JR05PUkVEX0ZJRUxEU10sXG4gICAgICAgICAgICAgICAgcmVtb3ZlZEZpZWxkcyA9IFsuLi5ERUZBVUxUX1JFTU9WRURfRklFTERTXSxcbiAgICAgICAgICAgICAgICBuYW1lXG4gICAgICAgICAgICB9ID0gb3B0aW9ucztcblxuICAgICAgICAgICAgY29uc3Qgc25hcHNob3ROYW1lID0gbmFtZSA/PyBcImV2ZW50c1wiO1xuICAgICAgICAgICAgY29uc3Qgc25hcHNob3RQYXRoID0gdGVzdEluZm8uc25hcHNob3RQYXRoKGAke3NuYXBzaG90TmFtZX0uZXZlbnRzLnNuYXBgKTtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZVNuYXBzaG90cyA9IHRlc3RJbmZvLmNvbmZpZy51cGRhdGVTbmFwc2hvdHMgPT09IFwiYWxsXCI7XG5cbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkRXZlbnRzID0gZmlsdGVySWdub3JlZEV2ZW50cyhldmVudHMsIGlnbm9yZUV2ZW50cyk7XG4gICAgICAgICAgICBjb25zdCBwcm9jZXNzZWRFdmVudHMgPSBwcm9jZXNzRXZlbnRQcm9wZXJ0aWVzKGZpbHRlcmVkRXZlbnRzLCBpZ25vcmVkRmllbGRzLCByZW1vdmVkRmllbGRzKTtcbiAgICAgICAgICAgIGNvbnN0IHNuYXBzaG90UmVzdWx0ID0gcmVhZFNuYXBzaG90KHNuYXBzaG90UGF0aCk7XG5cbiAgICAgICAgICAgIGlmICghc25hcHNob3RSZXN1bHQuZXhpc3RzIHx8IHVwZGF0ZVNuYXBzaG90cykge1xuICAgICAgICAgICAgICAgIHdyaXRlU25hcHNob3Qoc25hcHNob3RQYXRoLCBwcm9jZXNzZWRFdmVudHMpO1xuICAgICAgICAgICAgICAgIGlmICghc25hcHNob3RSZXN1bHQuZXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBbRHluYXRyYWNlIFRlc3RpbmddIENyZWF0ZWQgbmV3IHNuYXBzaG90OiAke3NuYXBzaG90UGF0aH1gKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgW0R5bmF0cmFjZSBUZXN0aW5nXSBVcGRhdGVkIHNuYXBzaG90OiAke3NuYXBzaG90UGF0aH1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzbmFwc2hvdERhdGEgPSBzbmFwc2hvdFJlc3VsdC5kYXRhO1xuICAgICAgICAgICAgaWYgKCFzbmFwc2hvdERhdGEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiW0R5bmF0cmFjZSBUZXN0aW5nXSBTbmFwc2hvdCBmaWxlIGlzIGVtcHR5XCIpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU29ydCBib3RoIGFycmF5cyBieSBjaGFyYWN0ZXJpc3RpY3MgZm9yIG9yZGVyLWluZGVwZW5kZW50IGNvbXBhcmlzb25cbiAgICAgICAgICAgIGNvbnN0IHNvcnRlZEFjdHVhbCA9IHNvcnRFdmVudHNCeUNoYXJhY3RlcmlzdGljcyhwcm9jZXNzZWRFdmVudHMpO1xuICAgICAgICAgICAgY29uc3Qgc29ydGVkRXhwZWN0ZWQgPSBzb3J0RXZlbnRzQnlDaGFyYWN0ZXJpc3RpY3Moc25hcHNob3REYXRhKTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgUGxheXdyaWdodCdzIGV4cGVjdCBmb3IgY29tcGFyaXNvbiAtIHByb3ZpZGVzIGV4Y2VsbGVudCBkaWZmIG91dHB1dFxuICAgICAgICAgICAgICAgIGV4cGVjdChzb3J0ZWRBY3R1YWwpLnRvU3RyaWN0RXF1YWwoc29ydGVkRXhwZWN0ZWQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgZHVtcEV2ZW50c0lmRW5hYmxlZChjb250ZXh0LCBcInRvTWF0Y2hFdmVudFNuYXBzaG90IC0gbWlzbWF0Y2hcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYFtEeW5hdHJhY2UgVGVzdGluZ10gU25hcHNob3QgbWlzbWF0Y2ggZm9yIFwiJHtzbmFwc2hvdE5hbWV9XCIuXFxuXFxuYFxuICAgICAgICAgICAgICAgICAgICArIGBTbmFwc2hvdCBwYXRoOiAke3NuYXBzaG90UGF0aH1cXG5cXG5gXG4gICAgICAgICAgICAgICAgICAgICsgYCR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfVxcblxcbmBcbiAgICAgICAgICAgICAgICAgICAgKyBgVG8gdXBkYXRlIHRoZSBzbmFwc2hvdCwgcnVuIHdpdGggLS11cGRhdGUtc25hcHNob3RzPWFsbCBmbGFnLmA7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59XG5cbi8qKlxuICogRHVtcHMgcmVjZWl2ZWQgZXZlbnRzIHRvIGNvbnNvbGUgaWYgZHVtcEV2ZW50c09uRmFpbCBpcyBlbmFibGVkLlxuICpcbiAqIEBwYXJhbSBjb250ZXh0ICAgICBUaGUgdGVzdGluZyBjb250ZXh0IGNvbnRhaW5pbmcgZXZlbnRzIGFuZCBiZWFjb25zXG4gKiBAcGFyYW0gZGVzY3JpcHRpb24gQWRkaXRpb25hbCBjb250ZXh0IGFib3V0IHdoeSBldmVudHMgYXJlIGJlaW5nIGR1bXBlZFxuICovXG5mdW5jdGlvbiBkdW1wRXZlbnRzSWZFbmFibGVkKGNvbnRleHQ6IFRlc3RpbmdDb250ZXh0LCBkZXNjcmlwdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFjb250ZXh0LmR1bXBFdmVudHNPbkZhaWwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBcXG5bRHluYXRyYWNlIFRlc3RpbmddIEV2ZW50IER1bXAgKCR7ZGVzY3JpcHRpb259KWApO1xuICAgIGNvbnNvbGUubG9nKGBUb3RhbCBldmVudHMgcmVjZWl2ZWQ6ICR7Y29udGV4dC5ldmVudHMubGVuZ3RofWApO1xuICAgIGNvbnNvbGUubG9nKGBUb3RhbCBiZWFjb25zIHJlY2VpdmVkOiAke2NvbnRleHQuYmVhY29ucy5sZW5ndGh9YCk7XG5cbiAgICBpZiAoY29udGV4dC5ldmVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiTm8gZXZlbnRzIHdlcmUgcmVjZWl2ZWQuXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiXFxuUmVjZWl2ZWQgZXZlbnRzOlwiKTtcbiAgICAgICAgY29udGV4dC5ldmVudHMuZm9yRWFjaCgoZXZlbnQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgXFxuRXZlbnQgJHtpbmRleCArIDF9OmAsIEpTT04uc3RyaW5naWZ5KGV2ZW50LCBudWxsLCAyKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUaHJvd3MgYW4gZXJyb3Igd2l0aCBhIGN1c3RvbSBtZXNzYWdlLiBJZiBldmVudCBkdW1waW5nIGlzIGVuYWJsZWQsIGxvZ3MgdGhlIHJlY2VpdmVkIER5bmF0cmFjZSBldmVudHMgYmVmb3JlXG4gKiB0aHJvd2luZyB0aGUgZXJyb3IuXG4gKlxuICogQHBhcmFtIGNvbnRleHQgICAgIFRoZSB0ZXN0aW5nIGNvbnRleHQgZm9yIGV2ZW50IGR1bXBpbmdcbiAqIEBwYXJhbSBtZXNzYWdlICAgICBUaGUgZXJyb3IgbWVzc2FnZSB0byBiZSB0aHJvd25cbiAqIEBwYXJhbSBkZXNjcmlwdGlvbiBDb250ZXh0IGFib3V0IHRoZSBmYWlsdXJlIGZvciBldmVudCBkdW1waW5nXG4gKi9cbmZ1bmN0aW9uIHRocm93V2l0aEV2ZW50RHVtcChjb250ZXh0OiBUZXN0aW5nQ29udGV4dCwgbWVzc2FnZTogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IG5ldmVyIHtcbiAgICBkdW1wRXZlbnRzSWZFbmFibGVkKGNvbnRleHQsIGRlc2NyaXB0aW9uID8/IFwiYXNzZXJ0aW9uIGZhaWx1cmVcIik7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBoZWxwZnVsIGVycm9yIGZvciBtaXNzaW5nIGNvbmZpZ3VyYXRpb24gZmllbGRzLlxuICpcbiAqIEBwYXJhbSBtaXNzaW5nRmllbGRzIEFycmF5IG9mIGZpZWxkIG5hbWVzIHRoYXQgYXJlIG1pc3Npbmcgb3IgZW1wdHlcbiAqIEByZXR1cm5zICAgICAgICAgICAgIEVycm9yIHdpdGggZGV0YWlsZWQgc2V0dXAgaW5zdHJ1Y3Rpb25zXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU1pc3NpbmdDb25maWdFcnJvcihtaXNzaW5nRmllbGRzOiBzdHJpbmdbXSk6IEVycm9yIHtcbiAgICBjb25zdCBtaXNzaW5nRGV0YWlscyA9IG1pc3NpbmdGaWVsZHNcbiAgICAgICAgLm1hcChmaWVsZCA9PiBgICAgIC0gJHtmaWVsZH06ICR7RklFTERfREVTQ1JJUFRJT05TW2ZpZWxkXX1gKVxuICAgICAgICAuam9pbihcIlxcblwiKTtcblxuICAgIHJldHVybiBuZXcgRXJyb3IoXG4gICAgICAgIGBbRHluYXRyYWNlIFRlc3RpbmddIE1pc3NpbmcgcmVxdWlyZWQgY29uZmlndXJhdGlvbiBmaWVsZCR7bWlzc2luZ0ZpZWxkcy5sZW5ndGggPiAxID8gXCJzXCIgOiBcIlwifTogJHttaXNzaW5nRmllbGRzLmpvaW4oXCIsIFwiKX1cblxuJHttaXNzaW5nRGV0YWlsc31cblxuQ29uZmlndXJlIHZpYSB0ZXN0LnVzZSgpOlxuICAgIHRlc3QudXNlKHtcbiAgICAgICAgZHluYXRyYWNlQ29uZmlnOiB7XG4gICAgICAgICAgICBlbmRwb2ludFVybDogcHJvY2Vzcy5lbnYuRFRfRU5EUE9JTlRfVVJMISxcbiAgICAgICAgICAgIGFwcElkOiBwcm9jZXNzLmVudi5EVF9BUFBfSUQhLFxuICAgICAgICAgICAgdG9rZW46IHByb2Nlc3MuZW52LkRUX1RPS0VOIVxuICAgICAgICB9XG4gICAgfSk7XG5cblNlZSB0ZXN0aW5nLm1kIGZvciBkZXRhaWxlZCBzZXR1cCBpbnN0cnVjdGlvbnMuYFxuICAgICk7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoZSBEeW5hdHJhY2UgY29uZmlndXJhdGlvbiBhbmQgdGhyb3dzIGEgaGVscGZ1bCBlcnJvciBpZiBpbnZhbGlkLlxuICpcbiAqIEBwYXJhbSBjb25maWcgVGhlIGNvbmZpZ3VyYXRpb24gdG8gdmFsaWRhdGVcbiAqIEB0aHJvd3MgRXJyb3Igd2l0aCBkZXRhaWxlZCBzZXR1cCBpbnN0cnVjdGlvbnMgaWYgY29uZmlndXJhdGlvbiBpcyBpbnZhbGlkXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRHluYXRyYWNlQ29uZmlnKGNvbmZpZzogRHluYXRyYWNlQ29uZmlnKTogdm9pZCB7XG4gICAgY29uc3QgbWlzc2luZ0ZpZWxkczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAoIWNvbmZpZy5lbmRwb2ludFVybCB8fCBjb25maWcuZW5kcG9pbnRVcmwudHJpbSgpID09PSBcIlwiKSB7XG4gICAgICAgIG1pc3NpbmdGaWVsZHMucHVzaChcImVuZHBvaW50VXJsXCIpO1xuICAgIH1cblxuICAgIGlmICghY29uZmlnLmFwcElkIHx8IGNvbmZpZy5hcHBJZC50cmltKCkgPT09IFwiXCIpIHtcbiAgICAgICAgbWlzc2luZ0ZpZWxkcy5wdXNoKFwiYXBwSWRcIik7XG4gICAgfVxuXG4gICAgaWYgKCFjb25maWcudG9rZW4gfHwgY29uZmlnLnRva2VuLnRyaW0oKSA9PT0gXCJcIikge1xuICAgICAgICBtaXNzaW5nRmllbGRzLnB1c2goXCJ0b2tlblwiKTtcbiAgICB9XG5cbiAgICBpZiAobWlzc2luZ0ZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IGNyZWF0ZU1pc3NpbmdDb25maWdFcnJvcihtaXNzaW5nRmllbGRzKTtcbiAgICB9XG59XG5cbi8qKlxuICogRmV0Y2hlcyB0aGUgUlVNIEphdmFTY3JpcHQgY29udGVudCBmcm9tIHRoZSBEeW5hdHJhY2UgQVBJIGVuZHBvaW50IG9yIGZpbGVzeXN0ZW0gaWYgYSBwcm92aWRlciBleGlzdHNcbiAqXG4gKiBAcGFyYW0gY29uZmlnIHRoZSBEeW5hdHJhY2UgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgICAgICBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgUlVNIEphdmFTY3JpcHQgY29udGVudFxuICovXG5hc3luYyBmdW5jdGlvbiBmZXRjaFJ1bUphdmFTY3JpcHRDb250ZW50KGNvbmZpZzogRHluYXRyYWNlQ29uZmlnKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoY29uZmlnLmFnZW50UHJvdmlkZXIpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjb25maWcuYWdlbnRQcm92aWRlcigpKTtcbiAgICB9XG4gICAgY29uc3QgcnVtQXBpUmVzdWx0ID0gYXdhaXQgZmV0Y2hSdW1KYXZhU2NyaXB0KGNvbmZpZy5lbmRwb2ludFVybCwgY29uZmlnLmFwcElkLCBjb25maWcudG9rZW4pO1xuICAgIGlmICghcnVtQXBpUmVzdWx0LmluY2x1ZGVzKFwiX2NvbXBsZXRlLmpzXCIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRHluYXRyYWNlIHJlY2VpdmVkIHVuZXhwZWN0ZWQgUlVNIEphdmFTY3JpcHQgd2hlbiByZXF1ZXN0aW5nIHRoZSBKYXZhU2NyaXB0IFRhZyB2aWEgQVBJOiAke3J1bUFwaVJlc3VsdH1gKTtcbiAgICB9XG5cbiAgICAvLyBFeHRyYWN0IHRoZSBzcmMgVVJMIGZyb20gdGhlIHNjcmlwdCB0YWdcbiAgICBjb25zdCBzcmNNYXRjaCA9IHJ1bUFwaVJlc3VsdC5tYXRjaCgvc3JjPVwiKFteXCJdKylcIi8pO1xuICAgIGlmICghc3JjTWF0Y2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGV4dHJhY3Qgc3JjIFVSTCBmcm9tIFJVTSBKYXZhU2NyaXB0IHRhZy5cIik7XG4gICAgfVxuICAgIGNvbnN0IHNjcmlwdFVybCA9IHNyY01hdGNoWzFdO1xuXG4gICAgLy8gRmV0Y2ggdGhlIGFjdHVhbCBKYXZhU2NyaXB0IGNvbnRlbnRcbiAgICBjb25zdCBzY3JpcHRSZXNwb25zZSA9IGF3YWl0IGZldGNoKHNjcmlwdFVybCk7XG4gICAgcmV0dXJuIHNjcmlwdFJlc3BvbnNlLnRleHQoKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgYmVhY29uIFVSSSBmcm9tIHRoZSBSVU0gSmF2YVNjcmlwdCBjb250ZW50LlxuICpcbiAqIEBwYXJhbSBydW0gVGhlIFJVTSBKYXZhU2NyaXB0IGNvbnRlbnQgdG8gZXh0cmFjdCB0aGUgYmVhY29uIFVSSSBmcm9tXG4gKiBAcmV0dXJucyAgIFRoZSBleHRyYWN0ZWQgYmVhY29uIFVSSVxuICovXG5mdW5jdGlvbiBleHRyYWN0QmVhY29uVXJpKHJ1bTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBFeHRyYWN0IHRoZSBiZWFjb25VcmkgZnJvbSB0aGUgSmF2YVNjcmlwdCBjb250ZW50XG4gICAgY29uc3QgYmVhY29uVXJpTWF0Y2ggPSBydW0ubWF0Y2goL1wiYmVhY29uVXJpXCI6XCIoW15cIl0rKVwiLyk7XG4gICAgaWYgKCFiZWFjb25VcmlNYXRjaCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZXh0cmFjdCBiZWFjb25VcmkgZnJvbSBSVU0gSmF2YVNjcmlwdCBjb250ZW50LlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGJlYWNvblVyaU1hdGNoWzFdO1xufVxuXG4vKipcbiAqIFdhaXRzIGZvciBhIGdpdmVuIHRpbWUgYW5kIHJlc29sdmVzIHVwb24gdGltZW91dC5cbiAqXG4gKiBAcGFyYW0gdGltZSBUaGUgdGltZSB0byB3YWl0IGluIG1pbGxpc2Vjb25kc1xuICogQHJldHVybnMgICAgQSByZXNvbHZlZCBwcm9taXNlIHdoZW4gdGhlIHRpbWUgcmFuIG91dFxuICovXG5mdW5jdGlvbiB3YWl0KHRpbWU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIHRpbWUpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBib2R5IG9mIGEgYmVhY29uIHJlcXVlc3QsIG9wdGlvbmFsbHkgZGVjb21wcmVzc2luZyBpdCBpZiB0aGUgVVJMIGluZGljYXRlcyBjb21wcmVzc2VkIGRhdGEuXG4gKlxuICogQHBhcmFtIHJlcXVlc3QgVGhlIHJlcXVlc3Qgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGJlYWNvbiBkYXRhXG4gKiBAcGFyYW0gdXJsICAgICBUaGUgVVJMIG9mIHRoZSByZXF1ZXN0IHRvIGNoZWNrIGZvciBzcGVjaWZpYyBjb21wcmVzc2lvbiBpbmRpY2F0b3JzXG4gKiBAcmV0dXJucyAgICAgICBUaGUgZXh0cmFjdGVkIGJvZHkgb2YgdGhlIGJlYWNvbiByZXF1ZXN0LCBvciBudWxsIGlmIG5vIHJlcXVlc3QgYm9keSBpcyBwcmVzZW50XG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RCZWFjb25Cb2R5KHJlcXVlc3Q6IFJlcXVlc3QsIHVybDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgYnVmZmVyID0gcmVxdWVzdC5wb3N0RGF0YUJ1ZmZlcigpO1xuICAgIGlmICh1cmwuaW5jbHVkZXMoXCJjbz1zbmFwcHlcIikgJiYgYnVmZmVyKSB7XG4gICAgICAgIGNvbnN0IHVpbnQ4RGF0YSA9IHVuY29tcHJlc3MoYnVmZmVyKTtcbiAgICAgICAgcmV0dXJuIGRlY29kZXIuZGVjb2RlKHVpbnQ4RGF0YSk7XG4gICAgfVxuICAgIHJldHVybiByZXF1ZXN0LnBvc3REYXRhKCk7XG59XG4iXX0=
@@ -0,0 +1,36 @@
1
+ export interface DynatraceConfig {
2
+ /**
3
+ * The URL of the Dynatrace API endpoint to connect to, see
4
+ * [RUM manual insertion tags API](https://docs.dynatrace.com/docs/discover-dynatrace/references/dynatrace-api/environment-api/rum/rum-manual-insertion-tags)
5
+ * for details. Example: https://{your-environment-id}.live.dynatrace.com or
6
+ * https://{your-activegate-domain}/e/{your-environment-id}
7
+ */
8
+ endpointUrl: string;
9
+ /**
10
+ * The application ID to identify the correct RUM JavaScript to fetch. You can find
11
+ * this in the URL if you open the Experience Vitals app and select the frontend you
12
+ * want to test. Example: APPLICATION-ABCDEF0123456789
13
+ */
14
+ appId: string;
15
+ /**
16
+ * The authentication token for the installation. See
17
+ * [Tokens and authentication](https://docs.dynatrace.com/docs/discover-dynatrace/references/dynatrace-api/basics/dynatrace-api-authentication).
18
+ */
19
+ token: string;
20
+ /**
21
+ * Specify an optional function that returns a promise resolving to a string of JavaScript code representing the RUM agent.
22
+ * If provided, this function will be used instead of fetching the agent from the Dynatrace endpoint.
23
+ */
24
+ agentProvider?: () => string;
25
+ /**
26
+ * Accepts an array of regular expressions to match against Dynatrace-related warnings. By default, these warnings
27
+ * trigger test fails. If you anticipate warnings and don't want your tests to fail, use this setting to ignore them
28
+ * by message. Example:
29
+ * ["invalid property my_app_data\.\\w+[0-9_]*"]
30
+ */
31
+ ignoreWarnings?: string[];
32
+ /**
33
+ * Dump the array of Dynatrace events into the console in case an assertion fails.
34
+ */
35
+ dumpEventsOnFail?: boolean;
36
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYXRyYWNlLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NvdXJjZS90ZXN0aW5nL3R5cGVzL2R5bmF0cmFjZS1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgRHluYXRyYWNlQ29uZmlnIHtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIG9mIHRoZSBEeW5hdHJhY2UgQVBJIGVuZHBvaW50IHRvIGNvbm5lY3QgdG8sIHNlZVxuICAgICAqIFtSVU0gbWFudWFsIGluc2VydGlvbiB0YWdzIEFQSV0oaHR0cHM6Ly9kb2NzLmR5bmF0cmFjZS5jb20vZG9jcy9kaXNjb3Zlci1keW5hdHJhY2UvcmVmZXJlbmNlcy9keW5hdHJhY2UtYXBpL2Vudmlyb25tZW50LWFwaS9ydW0vcnVtLW1hbnVhbC1pbnNlcnRpb24tdGFncylcbiAgICAgKiBmb3IgZGV0YWlscy4gRXhhbXBsZTogaHR0cHM6Ly97eW91ci1lbnZpcm9ubWVudC1pZH0ubGl2ZS5keW5hdHJhY2UuY29tIG9yXG4gICAgICogaHR0cHM6Ly97eW91ci1hY3RpdmVnYXRlLWRvbWFpbn0vZS97eW91ci1lbnZpcm9ubWVudC1pZH1cbiAgICAgKi9cbiAgICBlbmRwb2ludFVybDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFwcGxpY2F0aW9uIElEIHRvIGlkZW50aWZ5IHRoZSBjb3JyZWN0IFJVTSBKYXZhU2NyaXB0IHRvIGZldGNoLiBZb3UgY2FuIGZpbmRcbiAgICAgKiB0aGlzIGluIHRoZSBVUkwgaWYgeW91IG9wZW4gdGhlIEV4cGVyaWVuY2UgVml0YWxzIGFwcCBhbmQgc2VsZWN0IHRoZSBmcm9udGVuZCB5b3VcbiAgICAgKiB3YW50IHRvIHRlc3QuIEV4YW1wbGU6IEFQUExJQ0FUSU9OLUFCQ0RFRjAxMjM0NTY3ODlcbiAgICAgKi9cbiAgICBhcHBJZDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGF1dGhlbnRpY2F0aW9uIHRva2VuIGZvciB0aGUgaW5zdGFsbGF0aW9uLiBTZWVcbiAgICAgKiBbVG9rZW5zIGFuZCBhdXRoZW50aWNhdGlvbl0oaHR0cHM6Ly9kb2NzLmR5bmF0cmFjZS5jb20vZG9jcy9kaXNjb3Zlci1keW5hdHJhY2UvcmVmZXJlbmNlcy9keW5hdHJhY2UtYXBpL2Jhc2ljcy9keW5hdHJhY2UtYXBpLWF1dGhlbnRpY2F0aW9uKS5cbiAgICAgKi9cbiAgICB0b2tlbjogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBhbiBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBwcm9taXNlIHJlc29sdmluZyB0byBhIHN0cmluZyBvZiBKYXZhU2NyaXB0IGNvZGUgcmVwcmVzZW50aW5nIHRoZSBSVU0gYWdlbnQuXG4gICAgICogSWYgcHJvdmlkZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgZmV0Y2hpbmcgdGhlIGFnZW50IGZyb20gdGhlIER5bmF0cmFjZSBlbmRwb2ludC5cbiAgICAgKi9cbiAgICBhZ2VudFByb3ZpZGVyPzogKCkgPT4gc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQWNjZXB0cyBhbiBhcnJheSBvZiByZWd1bGFyIGV4cHJlc3Npb25zIHRvIG1hdGNoIGFnYWluc3QgRHluYXRyYWNlLXJlbGF0ZWQgd2FybmluZ3MuIEJ5IGRlZmF1bHQsIHRoZXNlIHdhcm5pbmdzXG4gICAgICogdHJpZ2dlciB0ZXN0IGZhaWxzLiBJZiB5b3UgYW50aWNpcGF0ZSB3YXJuaW5ncyBhbmQgZG9uJ3Qgd2FudCB5b3VyIHRlc3RzIHRvIGZhaWwsIHVzZSB0aGlzIHNldHRpbmcgdG8gaWdub3JlIHRoZW1cbiAgICAgKiBieSBtZXNzYWdlLiBFeGFtcGxlOlxuICAgICAqIFtcImludmFsaWQgcHJvcGVydHkgbXlfYXBwX2RhdGFcXC5cXFxcdytbMC05X10qXCJdXG4gICAgICovXG4gICAgaWdub3JlV2FybmluZ3M/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIER1bXAgdGhlIGFycmF5IG9mIER5bmF0cmFjZSBldmVudHMgaW50byB0aGUgY29uc29sZSBpbiBjYXNlIGFuIGFzc2VydGlvbiBmYWlscy5cbiAgICAgKi9cbiAgICBkdW1wRXZlbnRzT25GYWlsPzogYm9vbGVhbjtcbn1cbiJdfQ==