@dbx-tools/appkit-mastra 0.9.60 → 0.9.61

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -771,8 +771,12 @@ Mastra's own `mastra.agent_run.*` attributes sit on a child span that the view
771
771
  never reads. Text-only turns use raw prompt and answer previews, while
772
772
  `appkit.mastra.chat.messages` and `appkit.mastra.chat.response` retain the
773
773
  serialized envelopes. `appkit.mastra.identity.mode` records `obo` versus
774
- `service-principal`; `appkit.mastra.genie.used` records Genie activity. These
775
- custom values are searchable span attributes, not MLflow trace tags.
774
+ `service-principal`. The experiment UI's User and Tags columns read the OTel
775
+ attributes Databricks documents for inbound traces: `user.id` (forwarded email
776
+ or user id), `session.id` (Mastra thread id), `mlflow.spanType` (`AGENT` on the
777
+ root, `GENIE` on `ask_genie`), and `mlflow.trace.tag.genie=true` when the turn
778
+ called Genie. `appkit.mastra.genie.used` remains as a searchable custom
779
+ attribute.
776
780
 
777
781
  ```ts
778
782
  mastra({
@@ -782,7 +786,10 @@ mastra({
782
786
  ```
783
787
 
784
788
  `mlflow.logFeedback()` logs a human assessment against the active MLflow trace.
785
- The response header name and request/response schemas live in
789
+ On Apps UC traces it reads the experiment's
790
+ `mlflow.experiment.databricksTraceDestinationPath` tag (or the spans-table tag)
791
+ so the assessment URI matches the row the experiment UI shows. The response
792
+ header name and request/response schemas live in
786
793
  [`@dbx-tools/shared-mastra`](../../shared/mastra).
787
794
 
788
795
  ### Databricks Apps -> Unity Catalog (the supported path)
@@ -937,7 +944,8 @@ needs no extra wiring.
937
944
  | `MASTRA_GENIE_IDENTITY` | `user` (default, OBO), `service-principal`, or `auto` for the agents' Databricks calls. |
938
945
  | `OTEL_EXPORTER_OTLP_ENDPOINT`, `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` | Presence of either turns Mastra tracing on when `observability` is unset. On Apps, the telemetry sidecar injects these. |
939
946
  | `OTEL_PROPAGATORS` | Set to `none` on Databricks Apps. The plugin disables extraction and injection before serving requests while retaining local async span parenting. |
940
- | `MLFLOW_EXPERIMENT_ID`, `MLFLOW_EXPERIMENT_NAME` | With an OTLP endpoint, turns MLflow feedback on when `feedback` is unset. |
947
+ | `MLFLOW_EXPERIMENT_ID`, `MLFLOW_EXPERIMENT_NAME` | With an OTLP endpoint, turns MLflow feedback on when `feedback` is unset. Assessments read the experiment's UC trace destination tag. |
948
+ | `MLFLOW_UC_TRACE_PREFIX` | Optional override for the UC table prefix. Omit to use the experiment tag. |
941
949
 
942
950
  ## Configuration Reference
943
951
 
package/index.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-mastra";
6
- export const PACKAGE_VERSION = "0.9.60";
6
+ export const PACKAGE_VERSION = "0.9.61";
7
7
  export * as agents from "./src/agents.ts";
8
8
  export * as chart from "./src/chart.ts";
9
9
  export * as chat from "./src/chat.ts";
@@ -74,7 +74,7 @@ export { STATEMENT_ROW_CAP } from "./src/statement.ts";
74
74
  export { TYPOGRAPHY_RULE } from "./src/style.ts";
75
75
  export { TITLE_INSTRUCTIONS } from "./src/summarize.ts";
76
76
  export type { SummarizeOptions } from "./src/summarize.ts";
77
- export { TRACE_IO_LIMIT, MLFLOW_SPAN_INPUTS_ATTR, MLFLOW_SPAN_OUTPUTS_ATTR, CHAT_MESSAGES_ATTR, CHAT_RESPONSE_ATTR, CHAT_IDENTITY_ATTR, CHAT_GENIE_USED_ATTR } from "./src/telemetry.ts";
77
+ export { TRACE_IO_LIMIT, MLFLOW_SPAN_INPUTS_ATTR, MLFLOW_SPAN_OUTPUTS_ATTR, CHAT_MESSAGES_ATTR, CHAT_RESPONSE_ATTR, CHAT_IDENTITY_ATTR, CHAT_GENIE_USED_ATTR, MLFLOW_SPAN_TYPE_ATTR, GEN_AI_OPERATION_NAME_ATTR, MLFLOW_USER_ATTR, MLFLOW_SESSION_ATTR, MLFLOW_TRACE_TAG_PREFIX, MLFLOW_GENIE_TAG, MLFLOW_SPAN_TYPE_AGENT, MLFLOW_SPAN_TYPE_GENIE, MLFLOW_GENIE_TAG_ATTR } from "./src/telemetry.ts";
78
78
  export type { ChatTurnTelemetryOptions } from "./src/telemetry.ts";
79
79
  export type { SchemaIssues } from "./src/validation.ts";
80
80
  export { DEFAULT_SKILL_FOLDERS } from "./src/workspaces.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-mastra";
2
- export declare const PACKAGE_VERSION = "0.9.60";
2
+ export declare const PACKAGE_VERSION = "0.9.61";
3
3
  export * as agents from "./src/agents.ts";
4
4
  export * as chart from "./src/chart.ts";
5
5
  export * as chat from "./src/chat.ts";
@@ -70,7 +70,7 @@ export { STATEMENT_ROW_CAP } from "./src/statement.ts";
70
70
  export { TYPOGRAPHY_RULE } from "./src/style.ts";
71
71
  export { TITLE_INSTRUCTIONS } from "./src/summarize.ts";
72
72
  export type { SummarizeOptions } from "./src/summarize.ts";
73
- export { TRACE_IO_LIMIT, MLFLOW_SPAN_INPUTS_ATTR, MLFLOW_SPAN_OUTPUTS_ATTR, CHAT_MESSAGES_ATTR, CHAT_RESPONSE_ATTR, CHAT_IDENTITY_ATTR, CHAT_GENIE_USED_ATTR } from "./src/telemetry.ts";
73
+ export { TRACE_IO_LIMIT, MLFLOW_SPAN_INPUTS_ATTR, MLFLOW_SPAN_OUTPUTS_ATTR, CHAT_MESSAGES_ATTR, CHAT_RESPONSE_ATTR, CHAT_IDENTITY_ATTR, CHAT_GENIE_USED_ATTR, MLFLOW_SPAN_TYPE_ATTR, GEN_AI_OPERATION_NAME_ATTR, MLFLOW_USER_ATTR, MLFLOW_SESSION_ATTR, MLFLOW_TRACE_TAG_PREFIX, MLFLOW_GENIE_TAG, MLFLOW_SPAN_TYPE_AGENT, MLFLOW_SPAN_TYPE_GENIE, MLFLOW_GENIE_TAG_ATTR } from "./src/telemetry.ts";
74
74
  export type { ChatTurnTelemetryOptions } from "./src/telemetry.ts";
75
75
  export type { SchemaIssues } from "./src/validation.ts";
76
76
  export { DEFAULT_SKILL_FOLDERS } from "./src/workspaces.ts";
package/lib/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-mastra";
5
- export const PACKAGE_VERSION = "0.9.60";
5
+ export const PACKAGE_VERSION = "0.9.61";
6
6
  export * as agents from "./src/agents.js";
7
7
  export * as chart from "./src/chart.js";
8
8
  export * as chat from "./src/chat.js";
@@ -55,6 +55,6 @@ export { ASSISTANT_SHARED_SKILLS_PATH } from "./src/skill-paths.js";
55
55
  export { STATEMENT_ROW_CAP } from "./src/statement.js";
56
56
  export { TYPOGRAPHY_RULE } from "./src/style.js";
57
57
  export { TITLE_INSTRUCTIONS } from "./src/summarize.js";
58
- export { TRACE_IO_LIMIT, MLFLOW_SPAN_INPUTS_ATTR, MLFLOW_SPAN_OUTPUTS_ATTR, CHAT_MESSAGES_ATTR, CHAT_RESPONSE_ATTR, CHAT_IDENTITY_ATTR, CHAT_GENIE_USED_ATTR } from "./src/telemetry.js";
58
+ export { TRACE_IO_LIMIT, MLFLOW_SPAN_INPUTS_ATTR, MLFLOW_SPAN_OUTPUTS_ATTR, CHAT_MESSAGES_ATTR, CHAT_RESPONSE_ATTR, CHAT_IDENTITY_ATTR, CHAT_GENIE_USED_ATTR, MLFLOW_SPAN_TYPE_ATTR, GEN_AI_OPERATION_NAME_ATTR, MLFLOW_USER_ATTR, MLFLOW_SESSION_ATTR, MLFLOW_TRACE_TAG_PREFIX, MLFLOW_GENIE_TAG, MLFLOW_SPAN_TYPE_AGENT, MLFLOW_SPAN_TYPE_GENIE, MLFLOW_GENIE_TAG_ATTR } from "./src/telemetry.js";
59
59
  export { DEFAULT_SKILL_FOLDERS } from "./src/workspaces.js";
60
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRywwQkFBMEIsQ0FBQztBQUM3RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLFVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEtBQUssV0FBVyxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssWUFBWSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxhQUFhLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssVUFBVSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxZQUFZLE1BQU0sd0JBQXdCLENBQUM7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LE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuNjBcIjtcbmV4cG9ydCAqIGFzIGFnZW50cyBmcm9tIFwiLi9zcmMvYWdlbnRzLnRzXCI7XG5leHBvcnQgKiBhcyBjaGFydCBmcm9tIFwiLi9zcmMvY2hhcnQudHNcIjtcbmV4cG9ydCAqIGFzIGNoYXQgZnJvbSBcIi4vc3JjL2NoYXQudHNcIjtcbmV4cG9ydCAqIGFzIGNvbmZpZyBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgKiBhcyBkZWZhdWx0cyBmcm9tIFwiLi9zcmMvZGVmYXVsdHMudHNcIjtcbmV4cG9ydCAqIGFzIGV2YWx1YXRpb24gZnJvbSBcIi4vc3JjL2V2YWx1YXRpb24udHNcIjtcbmV4cG9ydCAqIGFzIGZpbGVzeXN0ZW1zIGZyb20gXCIuL3NyYy9maWxlc3lzdGVtcy50c1wiO1xuZXhwb3J0ICogYXMgZ2VuaWUgZnJvbSBcIi4vc3JjL2dlbmllLnRzXCI7XG5leHBvcnQgKiBhcyBpZGVudGl0eSBmcm9tIFwiLi9zcmMvaWRlbnRpdHkudHNcIjtcbmV4cG9ydCAqIGFzIG1jcCBmcm9tIFwiLi9zcmMvbWNwLnRzXCI7XG5leHBvcnQgKiBhcyBtZW1vcnkgZnJvbSBcIi4vc3JjL21lbW9yeS50c1wiO1xuZXhwb3J0ICogYXMgbWxmbG93IGZyb20gXCIuL3NyYy9tbGZsb3cudHNcIjtcbmV4cG9ydCAqIGFzIG1vZGVsIGZyb20gXCIuL3NyYy9tb2RlbC50c1wiO1xuZXhwb3J0ICogYXMgbW9udHlTYW5kYm94IGZyb20gXCIuL3NyYy9tb250eS1zYW5kYm94LnRzXCI7XG5leHBvcnQgKiBhcyBvYnNlcnZhYmlsaXR5IGZyb20gXCIuL3NyYy9vYnNlcnZhYmlsaXR5LnRzXCI7XG5leHBvcnQgKiBhcyBwbHVnaW4gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0ICogYXMgcHJvY2Vzc29ycyBmcm9tIFwiLi9zcmMvcHJvY2Vzc29ycy50c1wiO1xuZXhwb3J0ICogYXMgcmVtb3RlU2tpbGxzIGZyb20gXCIuL3NyYy9yZW1vdGUtc2tpbGxzLnRzXCI7XG5leHBvcnQgKiBhcyByZXN0IGZyb20gXCIuL3NyYy9yZXN0LnRzXCI7XG5leHBvcnQgKiBhcyBzYW5kYm94IGZyb20gXCIuL3NyYy9zYW5kYm94LnRzXCI7XG5leHBvcnQgKiBhcyBzZXJ2ZXIgZnJvbSBcIi4vc3JjL3NlcnZlci50c1wiO1xuZXhwb3J0ICogYXMgc2VydmluZyBmcm9tIFwiLi9zcmMvc2VydmluZy50c1wiO1xuZXhwb3J0ICogYXMgc2VydmluZ1Nhbml0aXplIGZyb20gXCIuL3NyYy9zZXJ2aW5nLXNhbml0aXplLnRzXCI7XG5leHBvcnQgKiBhcyBza2lsbFBhdGhzIGZyb20gXCIuL3NyYy9za2lsbC1wYXRocy50c1wiO1xuZXhwb3J0ICogYXMgc3RhdGVtZW50IGZyb20gXCIuL3NyYy9zdGF0ZW1lbnQudHNcIjtcbmV4cG9ydCAqIGFzIHN0b3JhZ2VTY2hlbWEgZnJvbSBcIi4vc3JjL3N0b3JhZ2Utc2NoZW1hLnRzXCI7XG5leHBvcnQgKiBhcyBzdHlsZSBmcm9tIFwiLi9zcmMvc3R5bGUudHNcIjtcbmV4cG9ydCAqIGFzIHN1bW1hcml6ZSBmcm9tIFwiLi9zcmMvc3VtbWFyaXplLnRzXCI7XG5leHBvcnQgKiBhcyB0ZWxlbWV0cnkgZnJvbSBcIi4vc3JjL3RlbGVtZXRyeS50c1wiO1xuZXhwb3J0ICogYXMgdmFsaWRhdGlvbiBmcm9tIFwiLi9zcmMvdmFsaWRhdGlvbi50c1wiO1xuZXhwb3J0ICogYXMgd29ya3NwYWNlcyBmcm9tIFwiLi9zcmMvd29ya3NwYWNlcy50c1wiO1xuZXhwb3J0ICogYXMgd3JpdGVyIGZyb20gXCIuL3NyYy93cml0ZXIudHNcIjtcbmV4cG9ydCB7IEZBTExCQUNLX0FHRU5UX0lELCBERUZBVUxUX0FHRU5UX01BWF9TVEVQUywgREVGQVVMVF9TVFlMRV9JTlNUUlVDVElPTlMgfSBmcm9tIFwiLi9zcmMvYWdlbnRzLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1hc3RyYVRvb2xzLCBBcHBLaXRUb29sT3B0aW9ucywgVG9vbGtpdE9wdGlvbnMsIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlciwgTWFzdHJhUGx1Z2lucywgTWFzdHJhVG9vbHNGbiwgTWFzdHJhQWdlbnRXb3Jrc3BhY2VSZXNvbHZlciwgTWFzdHJhQWdlbnREZWZpbml0aW9uLCBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24sIE1hc3RyYVN0b3JhZ2VDb25maWdPdmVycmlkZSwgTWFzdHJhTWVtb3J5Q29uZmlnT3ZlcnJpZGUsIEFnZW50RGVmYXVsdE1vZGVsLCBCdWlsdEFnZW50cyB9IGZyb20gXCIuL3NyYy9hZ2VudHMudHNcIjtcbmV4cG9ydCB7IGNoYXJ0UGxhblNjaGVtYSwgY2hhcnRQbGFubmVyUmVxdWVzdFNjaGVtYSwgY2hhcnRUb29sT3V0cHV0U2NoZW1hIH0gZnJvbSBcIi4vc3JjL2NoYXJ0LnRzXCI7XG5leHBvcnQgdHlwZSB7IENoYXJ0UGxhbm5lclJlcXVlc3QsIENoYXJ0VG9vbE91dHB1dCwgUHJlcGFyZUNoYXJ0T3B0aW9ucywgRmV0Y2hDaGFydE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvY2hhcnQudHNcIjtcbmV4cG9ydCB7IE1BU1RSQV9VU0VSX0tFWSwgTUFTVFJBX1VTRVJfTkFNRV9LRVksIE1BU1RSQV9VU0VSX0VNQUlMX0tFWSwgTUFTVFJBX1JFUVVFU1RfSURfS0VZLCBNQVNUUkFfU0NPUEVTX0tFWSwgVFJBQ0VfUkVRVUVTVF9DT05URVhUX0tFWVMsIE1BU1RSQV9DT05GSUdfU0NIRU1BIH0gZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0IHR5cGUgeyBVc2VyLCBNYXN0cmFNZW1vcnlDb25maWcsIE1hc3RyYU1jcENvbmZpZywgTWFzdHJhUGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0IHsgbW9kZWxDYXRhbG9ndWVEZWZhdWx0cywgZ2VuaWVTdWdnZXN0aW9uRGVmYXVsdHMsIHN0YXRlbWVudERhdGFEZWZhdWx0cywgY2hhcnRGZXRjaERlZmF1bHRzLCBmZWVkYmFja1dyaXRlRGVmYXVsdHMgfSBmcm9tIFwiLi9zcmMvZGVmYXVsdHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgTWFzdHJhRXZhbERyaXZlck9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZXZhbHVhdGlvbi50c1wiO1xuZXhwb3J0IHsgTWFzdHJhRmlsZVN5c3RlbUFkYXB0ZXIgfSBmcm9tIFwiLi9zcmMvZmlsZXN5c3RlbXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgTWFzdHJhRmlsZVN5c3RlbUFkYXB0ZXJPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2ZpbGVzeXN0ZW1zLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX0dFTklFX0FMSUFTLCBHRU5JRV9JTlNUUlVDVElPTlMgfSBmcm9tIFwiLi9zcmMvZ2VuaWUudHNcIjtcbmV4cG9ydCB0eXBlIHsgR2VuaWVTcGFjZUNvbmZpZywgR2VuaWVTcGFjZXNDb25maWcgfSBmcm9tIFwiLi9zcmMvZ2VuaWUudHNcIjtcbmV4cG9ydCB7IElERU5USVRZX0VOViwgSURFTlRJVFlfTU9ERVMsIERFRkFVTFRfSURFTlRJVFlfTU9ERSwgVVNFUl9JRF9IRUFERVIsIFVTRVJfRU1BSUxfSEVBREVSLCByZXF1ZXN0VXNlcklkLCByZXF1ZXN0VXNlckVtYWlsLCB1c2VTZXJ2aWNlUHJpbmNpcGFsIH0gZnJvbSBcIi4vc3JjL2lkZW50aXR5LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1hc3RyYUlkZW50aXR5TW9kZSB9IGZyb20gXCIuL3NyYy9pZGVudGl0eS50c1wiO1xuZXhwb3J0IHR5cGUgeyBSZXNvbHZlZE1jcCB9IGZyb20gXCIuL3NyYy9tY3AudHNcIjtcbmV4cG9ydCB7IE1lbW9yeUJ1aWxkZXIgfSBmcm9tIFwiLi9zcmMvbWVtb3J5LnRzXCI7XG5leHBvcnQgdHlwZSB7IExvZ0ZlZWRiYWNrUGFyYW1zIH0gZnJvbSBcIi4vc3JjL21sZmxvdy50c1wiO1xuZXhwb3J0IHsgUkVTUE9OU0VTX1BST1ZJREVSX09QVElPTlMgfSBmcm9tIFwiLi9zcmMvbW9kZWwudHNcIjtcbmV4cG9ydCB0eXBlIHsgQnVpbGRNb2RlbE92ZXJyaWRlcyB9IGZyb20gXCIuL3NyYy9tb2RlbC50c1wiO1xuZXhwb3J0IHsgTW9udHlTYW5kYm94IH0gZnJvbSBcIi4vc3JjL21vbnR5LXNhbmRib3gudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9udHlTYW5kYm94T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9tb250eS1zYW5kYm94LnRzXCI7XG5leHBvcnQgdHlwZSB7IEJ1aWxkT2JzZXJ2YWJpbGl0eU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvb2JzZXJ2YWJpbGl0eS50c1wiO1xuZXhwb3J0IHsgTWFzdHJhUGx1Z2luLCBtYXN0cmEgfSBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgeyBzdHJpcFN0YWxlQ2hhcnRzUHJvY2Vzc29yIH0gZnJvbSBcIi4vc3JjL3Byb2Nlc3NvcnMudHNcIjtcbmV4cG9ydCB7IEFJVE9PTFNfU09VUkNFIH0gZnJvbSBcIi4vc3JjL3JlbW90ZS1za2lsbHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgQWlUb29sc1NvdXJjZSwgUmVtb3RlU2tpbGxTb3VyY2VPcHRpb25zLCBSZW1vdGVTa2lsbFNvdXJjZSwgUmVtb3RlU2tpbGxzT3B0aW9uLCBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLCBQcm92aXNpb25lZFJlbW90ZVNraWxscywgUmVtb3RlU2tpbGxDYWNoZUVudHJ5LCBSZW1vdGVTa2lsbHNNZXRhZGF0YSB9IGZyb20gXCIuL3NyYy9yZW1vdGUtc2tpbGxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NGZXRjaEluaXQgfSBmcm9tIFwiLi9zcmMvcmVzdC50c1wiO1xuZXhwb3J0IHsgRGF0YWJyaWNrc1NhbmRib3ggfSBmcm9tIFwiLi9zcmMvc2FuZGJveC50c1wiO1xuZXhwb3J0IHR5cGUgeyBEYXRhYnJpY2tzU2FuZGJveE9wdGlvbnMsIERhdGFicmlja3NXb3Jrc3BhY2VTYW5kYm94T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9zYW5kYm94LnRzXCI7XG5leHBvcnQgeyBNYXN0cmFTZXJ2ZXIgfSBmcm9tIFwiLi9zcmMvc2VydmVyLnRzXCI7XG5leHBvcnQgdHlwZSB7IEF0dHJpYnV0ZWRJZGVudGl0eSwgTWFzdHJhQXBpR2F0ZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvc2VydmVyLnRzXCI7XG5leHBvcnQgeyBNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZIH0gZnJvbSBcIi4vc3JjL3NlcnZpbmcudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxPdmVycmlkZVJlcXVlc3QgfSBmcm9tIFwiLi9zcmMvc2VydmluZy50c1wiO1xuZXhwb3J0IHsgQVNTSVNUQU5UX1NIQVJFRF9TS0lMTFNfUEFUSCB9IGZyb20gXCIuL3NyYy9za2lsbC1wYXRocy50c1wiO1xuZXhwb3J0IHsgU1RBVEVNRU5UX1JPV19DQVAgfSBmcm9tIFwiLi9zcmMvc3RhdGVtZW50LnRzXCI7XG5leHBvcnQgeyBUWVBPR1JBUEhZX1JVTEUgfSBmcm9tIFwiLi9zcmMvc3R5bGUudHNcIjtcbmV4cG9ydCB7IFRJVExFX0lOU1RSVUNUSU9OUyB9IGZyb20gXCIuL3NyYy9zdW1tYXJpemUudHNcIjtcbmV4cG9ydCB0eXBlIHsgU3VtbWFyaXplT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9zdW1tYXJpemUudHNcIjtcbmV4cG9ydCB7IFRSQUNFX0lPX0xJTUlULCBNTEZMT1dfU1BBTl9JTlBVVFNfQVRUUiwgTUxGTE9XX1NQQU5fT1VUUFVUU19BVFRSLCBDSEFUX01FU1NBR0VTX0FUVFIsIENIQVRfUkVTUE9OU0VfQVRUUiwgQ0hBVF9JREVOVElUWV9BVFRSLCBDSEFUX0dFTklFX1VTRURfQVRUUiB9IGZyb20gXCIuL3NyYy90ZWxlbWV0cnkudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ2hhdFR1cm5UZWxlbWV0cnlPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3RlbGVtZXRyeS50c1wiO1xuZXhwb3J0IHR5cGUgeyBTY2hlbWFJc3N1ZXMgfSBmcm9tIFwiLi9zcmMvdmFsaWRhdGlvbi50c1wiO1xuZXhwb3J0IHsgREVGQVVMVF9TS0lMTF9GT0xERVJTIH0gZnJvbSBcIi4vc3JjL3dvcmtzcGFjZXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgV29ya3NwYWNlTW91bnRDb250ZXh0LCBTa2lsbEZvbGRlclZhbHVlLCBTa2lsbEZvbGRlck9wdGlvbnMsIFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uLCBXb3Jrc3BhY2VNb3VudFJlc29sdmVyLCBEZWZhdWx0U2tpbGxGb2xkZXJOYW1lLCBXb3Jrc3BhY2VTYW5kYm94U2VsZWN0aW9uLCBDcmVhdGVXb3Jrc3BhY2VPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3dvcmtzcGFjZXMudHNcIjtcbiJdfQ==
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRywwQkFBMEIsQ0FBQztBQUM3RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLFVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEtBQUssV0FBVyxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssWUFBWSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxhQUFhLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssVUFBVSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxZQUFZLE1BQU0sd0JBQXdCLENBQUM7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RSxnQkFBZ0IsRUFBRSxtQkFBbUIsRUFBRSx1QkFBdUIsRUFBRSxnQkFBZ0IsRUFBRSxzQkFBc0IsRUFBRSxzQkFBc0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBR3JZLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuNjFcIjtcbmV4cG9ydCAqIGFzIGFnZW50cyBmcm9tIFwiLi9zcmMvYWdlbnRzLnRzXCI7XG5leHBvcnQgKiBhcyBjaGFydCBmcm9tIFwiLi9zcmMvY2hhcnQudHNcIjtcbmV4cG9ydCAqIGFzIGNoYXQgZnJvbSBcIi4vc3JjL2NoYXQudHNcIjtcbmV4cG9ydCAqIGFzIGNvbmZpZyBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgKiBhcyBkZWZhdWx0cyBmcm9tIFwiLi9zcmMvZGVmYXVsdHMudHNcIjtcbmV4cG9ydCAqIGFzIGV2YWx1YXRpb24gZnJvbSBcIi4vc3JjL2V2YWx1YXRpb24udHNcIjtcbmV4cG9ydCAqIGFzIGZpbGVzeXN0ZW1zIGZyb20gXCIuL3NyYy9maWxlc3lzdGVtcy50c1wiO1xuZXhwb3J0ICogYXMgZ2VuaWUgZnJvbSBcIi4vc3JjL2dlbmllLnRzXCI7XG5leHBvcnQgKiBhcyBpZGVudGl0eSBmcm9tIFwiLi9zcmMvaWRlbnRpdHkudHNcIjtcbmV4cG9ydCAqIGFzIG1jcCBmcm9tIFwiLi9zcmMvbWNwLnRzXCI7XG5leHBvcnQgKiBhcyBtZW1vcnkgZnJvbSBcIi4vc3JjL21lbW9yeS50c1wiO1xuZXhwb3J0ICogYXMgbWxmbG93IGZyb20gXCIuL3NyYy9tbGZsb3cudHNcIjtcbmV4cG9ydCAqIGFzIG1vZGVsIGZyb20gXCIuL3NyYy9tb2RlbC50c1wiO1xuZXhwb3J0ICogYXMgbW9udHlTYW5kYm94IGZyb20gXCIuL3NyYy9tb250eS1zYW5kYm94LnRzXCI7XG5leHBvcnQgKiBhcyBvYnNlcnZhYmlsaXR5IGZyb20gXCIuL3NyYy9vYnNlcnZhYmlsaXR5LnRzXCI7XG5leHBvcnQgKiBhcyBwbHVnaW4gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0ICogYXMgcHJvY2Vzc29ycyBmcm9tIFwiLi9zcmMvcHJvY2Vzc29ycy50c1wiO1xuZXhwb3J0ICogYXMgcmVtb3RlU2tpbGxzIGZyb20gXCIuL3NyYy9yZW1vdGUtc2tpbGxzLnRzXCI7XG5leHBvcnQgKiBhcyByZXN0IGZyb20gXCIuL3NyYy9yZXN0LnRzXCI7XG5leHBvcnQgKiBhcyBzYW5kYm94IGZyb20gXCIuL3NyYy9zYW5kYm94LnRzXCI7XG5leHBvcnQgKiBhcyBzZXJ2ZXIgZnJvbSBcIi4vc3JjL3NlcnZlci50c1wiO1xuZXhwb3J0ICogYXMgc2VydmluZyBmcm9tIFwiLi9zcmMvc2VydmluZy50c1wiO1xuZXhwb3J0ICogYXMgc2VydmluZ1Nhbml0aXplIGZyb20gXCIuL3NyYy9zZXJ2aW5nLXNhbml0aXplLnRzXCI7XG5leHBvcnQgKiBhcyBza2lsbFBhdGhzIGZyb20gXCIuL3NyYy9za2lsbC1wYXRocy50c1wiO1xuZXhwb3J0ICogYXMgc3RhdGVtZW50IGZyb20gXCIuL3NyYy9zdGF0ZW1lbnQudHNcIjtcbmV4cG9ydCAqIGFzIHN0b3JhZ2VTY2hlbWEgZnJvbSBcIi4vc3JjL3N0b3JhZ2Utc2NoZW1hLnRzXCI7XG5leHBvcnQgKiBhcyBzdHlsZSBmcm9tIFwiLi9zcmMvc3R5bGUudHNcIjtcbmV4cG9ydCAqIGFzIHN1bW1hcml6ZSBmcm9tIFwiLi9zcmMvc3VtbWFyaXplLnRzXCI7XG5leHBvcnQgKiBhcyB0ZWxlbWV0cnkgZnJvbSBcIi4vc3JjL3RlbGVtZXRyeS50c1wiO1xuZXhwb3J0ICogYXMgdmFsaWRhdGlvbiBmcm9tIFwiLi9zcmMvdmFsaWRhdGlvbi50c1wiO1xuZXhwb3J0ICogYXMgd29ya3NwYWNlcyBmcm9tIFwiLi9zcmMvd29ya3NwYWNlcy50c1wiO1xuZXhwb3J0ICogYXMgd3JpdGVyIGZyb20gXCIuL3NyYy93cml0ZXIudHNcIjtcbmV4cG9ydCB7IEZBTExCQUNLX0FHRU5UX0lELCBERUZBVUxUX0FHRU5UX01BWF9TVEVQUywgREVGQVVMVF9TVFlMRV9JTlNUUlVDVElPTlMgfSBmcm9tIFwiLi9zcmMvYWdlbnRzLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1hc3RyYVRvb2xzLCBBcHBLaXRUb29sT3B0aW9ucywgVG9vbGtpdE9wdGlvbnMsIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlciwgTWFzdHJhUGx1Z2lucywgTWFzdHJhVG9vbHNGbiwgTWFzdHJhQWdlbnRXb3Jrc3BhY2VSZXNvbHZlciwgTWFzdHJhQWdlbnREZWZpbml0aW9uLCBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24sIE1hc3RyYVN0b3JhZ2VDb25maWdPdmVycmlkZSwgTWFzdHJhTWVtb3J5Q29uZmlnT3ZlcnJpZGUsIEFnZW50RGVmYXVsdE1vZGVsLCBCdWlsdEFnZW50cyB9IGZyb20gXCIuL3NyYy9hZ2VudHMudHNcIjtcbmV4cG9ydCB7IGNoYXJ0UGxhblNjaGVtYSwgY2hhcnRQbGFubmVyUmVxdWVzdFNjaGVtYSwgY2hhcnRUb29sT3V0cHV0U2NoZW1hIH0gZnJvbSBcIi4vc3JjL2NoYXJ0LnRzXCI7XG5leHBvcnQgdHlwZSB7IENoYXJ0UGxhbm5lclJlcXVlc3QsIENoYXJ0VG9vbE91dHB1dCwgUHJlcGFyZUNoYXJ0T3B0aW9ucywgRmV0Y2hDaGFydE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvY2hhcnQudHNcIjtcbmV4cG9ydCB7IE1BU1RSQV9VU0VSX0tFWSwgTUFTVFJBX1VTRVJfTkFNRV9LRVksIE1BU1RSQV9VU0VSX0VNQUlMX0tFWSwgTUFTVFJBX1JFUVVFU1RfSURfS0VZLCBNQVNUUkFfU0NPUEVTX0tFWSwgVFJBQ0VfUkVRVUVTVF9DT05URVhUX0tFWVMsIE1BU1RSQV9DT05GSUdfU0NIRU1BIH0gZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0IHR5cGUgeyBVc2VyLCBNYXN0cmFNZW1vcnlDb25maWcsIE1hc3RyYU1jcENvbmZpZywgTWFzdHJhUGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0IHsgbW9kZWxDYXRhbG9ndWVEZWZhdWx0cywgZ2VuaWVTdWdnZXN0aW9uRGVmYXVsdHMsIHN0YXRlbWVudERhdGFEZWZhdWx0cywgY2hhcnRGZXRjaERlZmF1bHRzLCBmZWVkYmFja1dyaXRlRGVmYXVsdHMgfSBmcm9tIFwiLi9zcmMvZGVmYXVsdHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgTWFzdHJhRXZhbERyaXZlck9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZXZhbHVhdGlvbi50c1wiO1xuZXhwb3J0IHsgTWFzdHJhRmlsZVN5c3RlbUFkYXB0ZXIgfSBmcm9tIFwiLi9zcmMvZmlsZXN5c3RlbXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgTWFzdHJhRmlsZVN5c3RlbUFkYXB0ZXJPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2ZpbGVzeXN0ZW1zLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX0dFTklFX0FMSUFTLCBHRU5JRV9JTlNUUlVDVElPTlMgfSBmcm9tIFwiLi9zcmMvZ2VuaWUudHNcIjtcbmV4cG9ydCB0eXBlIHsgR2VuaWVTcGFjZUNvbmZpZywgR2VuaWVTcGFjZXNDb25maWcgfSBmcm9tIFwiLi9zcmMvZ2VuaWUudHNcIjtcbmV4cG9ydCB7IElERU5USVRZX0VOViwgSURFTlRJVFlfTU9ERVMsIERFRkFVTFRfSURFTlRJVFlfTU9ERSwgVVNFUl9JRF9IRUFERVIsIFVTRVJfRU1BSUxfSEVBREVSLCByZXF1ZXN0VXNlcklkLCByZXF1ZXN0VXNlckVtYWlsLCB1c2VTZXJ2aWNlUHJpbmNpcGFsIH0gZnJvbSBcIi4vc3JjL2lkZW50aXR5LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1hc3RyYUlkZW50aXR5TW9kZSB9IGZyb20gXCIuL3NyYy9pZGVudGl0eS50c1wiO1xuZXhwb3J0IHR5cGUgeyBSZXNvbHZlZE1jcCB9IGZyb20gXCIuL3NyYy9tY3AudHNcIjtcbmV4cG9ydCB7IE1lbW9yeUJ1aWxkZXIgfSBmcm9tIFwiLi9zcmMvbWVtb3J5LnRzXCI7XG5leHBvcnQgdHlwZSB7IExvZ0ZlZWRiYWNrUGFyYW1zIH0gZnJvbSBcIi4vc3JjL21sZmxvdy50c1wiO1xuZXhwb3J0IHsgUkVTUE9OU0VTX1BST1ZJREVSX09QVElPTlMgfSBmcm9tIFwiLi9zcmMvbW9kZWwudHNcIjtcbmV4cG9ydCB0eXBlIHsgQnVpbGRNb2RlbE92ZXJyaWRlcyB9IGZyb20gXCIuL3NyYy9tb2RlbC50c1wiO1xuZXhwb3J0IHsgTW9udHlTYW5kYm94IH0gZnJvbSBcIi4vc3JjL21vbnR5LXNhbmRib3gudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9udHlTYW5kYm94T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9tb250eS1zYW5kYm94LnRzXCI7XG5leHBvcnQgdHlwZSB7IEJ1aWxkT2JzZXJ2YWJpbGl0eU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvb2JzZXJ2YWJpbGl0eS50c1wiO1xuZXhwb3J0IHsgTWFzdHJhUGx1Z2luLCBtYXN0cmEgfSBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgeyBzdHJpcFN0YWxlQ2hhcnRzUHJvY2Vzc29yIH0gZnJvbSBcIi4vc3JjL3Byb2Nlc3NvcnMudHNcIjtcbmV4cG9ydCB7IEFJVE9PTFNfU09VUkNFIH0gZnJvbSBcIi4vc3JjL3JlbW90ZS1za2lsbHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgQWlUb29sc1NvdXJjZSwgUmVtb3RlU2tpbGxTb3VyY2VPcHRpb25zLCBSZW1vdGVTa2lsbFNvdXJjZSwgUmVtb3RlU2tpbGxzT3B0aW9uLCBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLCBQcm92aXNpb25lZFJlbW90ZVNraWxscywgUmVtb3RlU2tpbGxDYWNoZUVudHJ5LCBSZW1vdGVTa2lsbHNNZXRhZGF0YSB9IGZyb20gXCIuL3NyYy9yZW1vdGUtc2tpbGxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NGZXRjaEluaXQgfSBmcm9tIFwiLi9zcmMvcmVzdC50c1wiO1xuZXhwb3J0IHsgRGF0YWJyaWNrc1NhbmRib3ggfSBmcm9tIFwiLi9zcmMvc2FuZGJveC50c1wiO1xuZXhwb3J0IHR5cGUgeyBEYXRhYnJpY2tzU2FuZGJveE9wdGlvbnMsIERhdGFicmlja3NXb3Jrc3BhY2VTYW5kYm94T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9zYW5kYm94LnRzXCI7XG5leHBvcnQgeyBNYXN0cmFTZXJ2ZXIgfSBmcm9tIFwiLi9zcmMvc2VydmVyLnRzXCI7XG5leHBvcnQgdHlwZSB7IEF0dHJpYnV0ZWRJZGVudGl0eSwgTWFzdHJhQXBpR2F0ZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvc2VydmVyLnRzXCI7XG5leHBvcnQgeyBNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZIH0gZnJvbSBcIi4vc3JjL3NlcnZpbmcudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxPdmVycmlkZVJlcXVlc3QgfSBmcm9tIFwiLi9zcmMvc2VydmluZy50c1wiO1xuZXhwb3J0IHsgQVNTSVNUQU5UX1NIQVJFRF9TS0lMTFNfUEFUSCB9IGZyb20gXCIuL3NyYy9za2lsbC1wYXRocy50c1wiO1xuZXhwb3J0IHsgU1RBVEVNRU5UX1JPV19DQVAgfSBmcm9tIFwiLi9zcmMvc3RhdGVtZW50LnRzXCI7XG5leHBvcnQgeyBUWVBPR1JBUEhZX1JVTEUgfSBmcm9tIFwiLi9zcmMvc3R5bGUudHNcIjtcbmV4cG9ydCB7IFRJVExFX0lOU1RSVUNUSU9OUyB9IGZyb20gXCIuL3NyYy9zdW1tYXJpemUudHNcIjtcbmV4cG9ydCB0eXBlIHsgU3VtbWFyaXplT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9zdW1tYXJpemUudHNcIjtcbmV4cG9ydCB7IFRSQUNFX0lPX0xJTUlULCBNTEZMT1dfU1BBTl9JTlBVVFNfQVRUUiwgTUxGTE9XX1NQQU5fT1VUUFVUU19BVFRSLCBDSEFUX01FU1NBR0VTX0FUVFIsIENIQVRfUkVTUE9OU0VfQVRUUiwgQ0hBVF9JREVOVElUWV9BVFRSLCBDSEFUX0dFTklFX1VTRURfQVRUUiwgTUxGTE9XX1NQQU5fVFlQRV9BVFRSLCBHRU5fQUlfT1BFUkFUSU9OX05BTUVfQVRUUiwgTUxGTE9XX1VTRVJfQVRUUiwgTUxGTE9XX1NFU1NJT05fQVRUUiwgTUxGTE9XX1RSQUNFX1RBR19QUkVGSVgsIE1MRkxPV19HRU5JRV9UQUcsIE1MRkxPV19TUEFOX1RZUEVfQUdFTlQsIE1MRkxPV19TUEFOX1RZUEVfR0VOSUUsIE1MRkxPV19HRU5JRV9UQUdfQVRUUiB9IGZyb20gXCIuL3NyYy90ZWxlbWV0cnkudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ2hhdFR1cm5UZWxlbWV0cnlPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3RlbGVtZXRyeS50c1wiO1xuZXhwb3J0IHR5cGUgeyBTY2hlbWFJc3N1ZXMgfSBmcm9tIFwiLi9zcmMvdmFsaWRhdGlvbi50c1wiO1xuZXhwb3J0IHsgREVGQVVMVF9TS0lMTF9GT0xERVJTIH0gZnJvbSBcIi4vc3JjL3dvcmtzcGFjZXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgV29ya3NwYWNlTW91bnRDb250ZXh0LCBTa2lsbEZvbGRlclZhbHVlLCBTa2lsbEZvbGRlck9wdGlvbnMsIFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uLCBXb3Jrc3BhY2VNb3VudFJlc29sdmVyLCBEZWZhdWx0U2tpbGxGb2xkZXJOYW1lLCBXb3Jrc3BhY2VTYW5kYm94U2VsZWN0aW9uLCBDcmVhdGVXb3Jrc3BhY2VPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3dvcmtzcGFjZXMudHNcIjtcbiJdfQ==
package/lib/src/genie.js CHANGED
@@ -46,6 +46,7 @@ import { z } from "zod";
46
46
  import { chartPlannerRequestSchema, chartToolOutputSchema, prepareChart } from "./chart.js";
47
47
  import { MASTRA_USER_KEY, resolveUserKey } from "./config.js";
48
48
  import { fetchStatementData } from "./statement.js";
49
+ import { stampGenieToolSpan } from "./telemetry.js";
49
50
  import { safeWriteProgress } from "./writer.js";
50
51
  const logger = log.logger("mastra/genie");
51
52
  /** Default alias used when a single unnamed Genie space is wired up. */
@@ -329,6 +330,7 @@ function buildAskGenieTool(opts) {
329
330
  }),
330
331
  execute: async ({ question }, ctxRaw) => {
331
332
  const ctx = ctxRaw;
333
+ stampGenieToolSpan();
332
334
  const { client, requestContext } = requireClient(ctx, toolId);
333
335
  const writer = ctx?.writer;
334
336
  const toolCallId = ctx?.agent?.toolCallId;
@@ -994,4 +996,4 @@ export async function collectSpaceSuggestions(opts) {
994
996
  }
995
997
  return merged;
996
998
  }
997
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuaWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2VuaWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9DRztBQUVILE9BQU8sRUFDTCxZQUFZLEVBQ1osa0JBQWtCLEVBQ2xCLGNBQWMsRUFDZCxLQUFLLEVBQ0wsZUFBZSxHQUNoQixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssSUFBSSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsVUFBVSxFQUFxQixNQUFNLHlCQUF5QixDQUFDO0FBR3hFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxVQUFVLEVBQTZCLE1BQU0sb0JBQW9CLENBQUM7QUFDM0UsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUd4QixPQUFPLEVBQUUseUJBQXlCLEVBQUUscUJBQXFCLEVBQUUsWUFBWSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzVGLE9BQU8sRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTlELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVoRCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBRTFDLHdFQUF3RTtBQUN4RSxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxTQUFTLENBQUM7QUFrQzdD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T0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixNQUFNLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFO29CQUNyQyxPQUFPO29CQUNQLEtBQUssRUFBRSxVQUFVLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQztpQkFDcEMsQ0FBQyxDQUFDO2dCQUNILFNBQVMsR0FBRyxFQUFFLENBQUM7WUFDakIsQ0FBQztRQUNILENBQUM7UUFDRCxLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7Z0JBQUUsU0FBUztZQUNqQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ25CLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEIsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLEtBQUs7Z0JBQUUsT0FBTyxNQUFNLENBQUM7UUFDNUMsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5pZSB0b29scyBmb3IgTWFzdHJhLlxuICpcbiAqIFN1cmZhY2VzIGVhY2ggY29uZmlndXJlZCBHZW5pZSBzcGFjZSBhcyBhIHNtYWxsIHNldCBvZiBmbGF0IE1hc3RyYVxuICogdG9vbHMgdGhlIGNhbGxpbmcgYWdlbnQgZHJpdmVzIGRpcmVjdGx5IC0gbm8gaW5uZXIgb3JjaGVzdHJhdG9yXG4gKiBhZ2VudC4gVGhlIGNlbnRyYWwgYWdlbnQgZGVjb21wb3NlcyB1c2VyIHF1ZXN0aW9ucywgcGlja3Mgd2hpY2hcbiAqIHNwYWNlIHRvIGFzaywgc3RyZWFtcyB0aGUgcGVyLXR1cm4gd2lyZSBldmVudHMgKHN0YXR1cywgdGhpbmtpbmcsXG4gKiBzcWwsIHJvd3MpIHRocm91Z2ggYGN0eC53cml0ZXJgLCBhbmQgY29tcG9zZXMgdGhlIGZpbmFsIHJlcGx5LlxuICogUm93cyBhcmUgbmV2ZXIgZmV0Y2hlZCBlYWdlcmx5OiB0aGUgYWdlbnQgcmVhZHMgYSBzdGF0ZW1lbnQnc1xuICogdmFsdWVzIG9ubHkgd2hlbiBpdCBuZWVkcyB0byByZWFzb24gYWJvdXQgdGhlbSwgb3RoZXJ3aXNlIGl0IGVtYmVkc1xuICogYSBgW2RhdGE6PHN0YXRlbWVudF9pZD5dYCBtYXJrZXIgaW4gcHJvc2UgYW5kIGxldHMgdGhlIGhvc3QgVUlcbiAqIHJlc29sdmUgdGhlIGRhdGEuIENoYXJ0cyBhcmUgbWludGVkIGFzeW5jaHJvbm91c2x5IGFuZCByZWZlcmVuY2VkXG4gKiBieSBgW2NoYXJ0OjxjaGFydElkPl1gIG1hcmtlcnMgc28gcHJvc2UgaXNuJ3QgYmxvY2tlZCBvbiBjaGFydFxuICogZ2VuZXJhdGlvbjsgdGhlIGhvc3QgVUkgZmV0Y2hlcyB0aGUgY2FjaGVkIHNwZWMgYnkgaWQgb25jZSByZWFkeS5cbiAqIFNwYWNlIGRlc2NyaXB0aW9uIGFuZCBzZXJpYWxpemVkLXNwYWNlIGxvb2t1cHMgYXJlIGF2YWlsYWJsZSBmb3JcbiAqIGdyb3VuZGluZyB3aGVuIHRoZSBhZ2VudCBuZWVkcyBzY2hlbWEgY29udGV4dC5cbiAqXG4gKiBFYWNoIHRvb2wncyBgZXhlY3V0ZWAgcHVsbHMgdGhlIHBlci1yZXF1ZXN0XG4gKiB7QGxpbmsgV29ya3NwYWNlQ2xpZW50fSBvZmYgYGN0eC5yZXF1ZXN0Q29udGV4dGAgKHN0YW1wZWQgYnlcbiAqIGBNYXN0cmFTZXJ2ZXJgIHVuZGVyIHtAbGluayBNQVNUUkFfVVNFUl9LRVl9KSBhbmQgdGhlIHBlci1jYWxsXG4gKiBgd3JpdGVyYCAvIGBhYm9ydFNpZ25hbGAgb2ZmIGBjdHhgLCBzbyB0aGUgdG9vbHMgYXJlIHN0YXRlbGVzc1xuICogYWNyb3NzIHJlcXVlc3RzIGFuZCB0aGUgY2VudHJhbCBhZ2VudCBvd25zIHRoZSBsb29wLlxuICpcbiAqIFRoZSB0b29scyB0YWxrIHRvIEdlbmllIGRpcmVjdGx5IHZpYSBgQGRieC10b29scy9nZW5pZWBcbiAqIChgZ2VuaWVFdmVudENoYXRgKTsgc3RhdGVtZW50LXJvdyBmZXRjaGluZyBpcyBkZWxlZ2F0ZWQgdG9cbiAqIHtAbGluayBmZXRjaFN0YXRlbWVudERhdGF9IGZyb20gYC4vc3RhdGVtZW50LmpzYCwgd2hpY2ggd3JhcHNcbiAqIHRoZSB3b3Jrc3BhY2UgYHN0YXRlbWVudEV4ZWN1dGlvbi5nZXRTdGF0ZW1lbnRgIEFQSS4gQXBwS2l0J3NcbiAqIHN0b2NrIGBnZW5pZWAgcGx1Z2luIGlzIGhvbm9yZWQgb25seSBmb3IgaXRzIGBzcGFjZXNgIGNvbmZpZ1xuICogc28gZXhpc3RpbmcgQXBwS2l0LXN0eWxlIHdpcmluZyBrZWVwcyB3b3JraW5nIHdpdGhvdXQgY2hhbmdlLlxuICpcbiAqIFN1Z2dlc3RlZCBvcmNoZXN0cmF0aW9uIHByb21wdCBmb3IgdGhlIGNlbnRyYWwgYWdlbnQgbGl2ZXMgaW5cbiAqIHtAbGluayBHRU5JRV9JTlNUUlVDVElPTlN9OyBjb21wb3NlIGl0IGludG8gdGhlIGFnZW50J3Mgb3duXG4gKiBgaW5zdHJ1Y3Rpb25zYCB3aGVuIHlvdSB3YW50IHRoZSBjYW5vbmljYWwgXCJob3cgdG8gZHJpdmUgdGhlXG4gKiBHZW5pZSB0b29sc1wiIGd1aWRhbmNlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQge1xuICBDYWNoZU1hbmFnZXIsXG4gIENvbmZpZ3VyYXRpb25FcnJvcixcbiAgRXhlY3V0aW9uRXJyb3IsXG4gIGdlbmllLFxuICBWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgcGx1Z2luUmVnaXN0cnkgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGNoYXQsIHNwYWNlIGFzIGdlbmllU3BhY2UgfSBmcm9tIFwiQGRieC10b29scy9nZW5pZVwiO1xuaW1wb3J0IHsgZXJyb3JVdGlscywgbG9nLCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBnZW5pZU1vZGVsLCB0eXBlIEdlbmllTWVzc2FnZSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1nZW5pZVwiO1xuaW1wb3J0IHR5cGUgeyBTdGFydGVkRXZlbnQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbWFzdHJhXCI7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcbmltcG9ydCB7IE1BU1RSQV9USFJFQURfSURfS0VZIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcbmltcG9ydCB7IGNyZWF0ZVRvb2wsIHR5cGUgVG9vbEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3Rvb2xzXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgdHlwZSB7IE1hc3RyYVRvb2xzIH0gZnJvbSBcIi4vYWdlbnRzLnRzXCI7XG5pbXBvcnQgeyBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hLCBjaGFydFRvb2xPdXRwdXRTY2hlbWEsIHByZXBhcmVDaGFydCB9IGZyb20gXCIuL2NoYXJ0LnRzXCI7XG5pbXBvcnQgeyBNQVNUUkFfVVNFUl9LRVksIHJlc29sdmVVc2VyS2V5IH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgdHlwZSB7IE1hc3RyYVBsdWdpbkNvbmZpZywgVXNlciB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgZmV0Y2hTdGF0ZW1lbnREYXRhIH0gZnJvbSBcIi4vc3RhdGVtZW50LnRzXCI7XG5pbXBvcnQgeyBzYWZlV3JpdGVQcm9ncmVzcyB9IGZyb20gXCIuL3dyaXRlci50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL2dlbmllXCIpO1xuXG4vKiogRGVmYXVsdCBhbGlhcyB1c2VkIHdoZW4gYSBzaW5nbGUgdW5uYW1lZCBHZW5pZSBzcGFjZSBpcyB3aXJlZCB1cC4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0dFTklFX0FMSUFTID0gXCJkZWZhdWx0XCI7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb25maWcgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBQZXItc3BhY2UgR2VuaWUgYWdlbnQgY29uZmlndXJhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuaWVTcGFjZUNvbmZpZyB7XG4gIC8qKiBHZW5pZSBgc3BhY2VfaWRgLiBSZXF1aXJlZDsgcmVzb2x2ZXMgdmlhIGBjbGllbnQuZ2VuaWUuZ2V0U3BhY2VgLiAqL1xuICBzcGFjZUlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBhcHBlbmRlZCB0byB0aGUgcGVyLXNwYWNlXG4gICAqIHRvb2wgZGVzY3JpcHRpb25zIHNvIHRoZSBjYWxsaW5nIExMTSBoYXMgaGludHMgYWJvdXQgKndoYXRcbiAgICogZGF0YSogdGhpcyBzcGFjZSBjb3ZlcnMgKGUuZy4gXCJvcmRlcnMsIHJldHVybnMsXG4gICAqIGZ1bGZpbGxtZW50XCIpLiBXaGVuIG9taXR0ZWQsIG9ubHkgdGhlIHNwYWNlJ3Mgb3duXG4gICAqIGBkZXNjcmlwdGlvbmAgKGZldGNoZWQgb24gZmlyc3QgdXNlIG9mIGBnZXRfc3BhY2VfZGVzY3JpcHRpb25gKVxuICAgKiBpcyBzaG93bi5cbiAgICovXG4gIGhpbnQ/OiBzdHJpbmc7XG59XG5cbi8qKiBNYXAgb2YgYWxpYXMgLT4gc3BhY2UgY29uZmlnLiBBY2NlcHRzIGVpdGhlciBleHBsaWNpdCBvYmplY3RzIG9yIGJhcmUgc3BhY2UgaWRzLiAqL1xuZXhwb3J0IHR5cGUgR2VuaWVTcGFjZXNDb25maWcgPSBSZWNvcmQ8c3RyaW5nLCBHZW5pZVNwYWNlQ29uZmlnIHwgc3RyaW5nPjtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjdHggaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogTmFycm93IHZpZXcgb2YgdGhlIHNlY29uZCBhcmcgTWFzdHJhIHBhc3NlcyB0byBhIHRvb2wnc1xuICogYGV4ZWN1dGUoaW5wdXQsIGN0eClgLiBDYXB0dXJlcyB0aGUgZmllbGRzIHRoZSBHZW5pZSB0b29sc1xuICogYWN0dWFsbHkgcmVhZCAtIGByZXF1ZXN0Q29udGV4dGAgKGZvciB1c2VyIC8gY29udmVyc2F0aW9uXG4gKiBzdGF0ZSksIGB3cml0ZXJgIChmb3Igc3RyZWFtaW5nIGV2ZW50cyB0byB0aGUgaG9zdCBVSSksIGFuZFxuICogYGFib3J0U2lnbmFsYCAoZm9yIHBlci1jYWxsIGNhbmNlbGxhdGlvbikuXG4gKi9cbnR5cGUgVG9vbEV4ZWN1dGVDdHggPVxuICBQaWNrPFRvb2xFeGVjdXRpb25Db250ZXh0LCBcInJlcXVlc3RDb250ZXh0XCIgfCBcIndyaXRlclwiIHwgXCJhYm9ydFNpZ25hbFwiIHwgXCJhZ2VudFwiPiB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBQdWxsIHRoZSBwZXItcmVxdWVzdCB7QGxpbmsgV29ya3NwYWNlQ2xpZW50fSBvZmYgdGhlIGFjdGl2ZVxuICogYFJlcXVlc3RDb250ZXh0YC4gVGhlIE1hc3RyYSBwbHVnaW4ncyBzZXJ2ZXIgbWlkZGxld2FyZSBzdGFtcHNcbiAqIGEge0BsaW5rIFVzZXJ9IG9uIHRoZSBjb250ZXh0IHVuZGVyIHtAbGluayBNQVNUUkFfVVNFUl9LRVl9XG4gKiBmb3IgZXZlcnkgcmVxdWVzdDsgdG9vbHMgZmFpbCBsb3VkbHkgd2hlbiBpdCdzIG1pc3NpbmcgYmVjYXVzZVxuICogdGhhdCBtZWFucyB0aGUgTWFzdHJhIHBsdWdpbiBpc24ndCBydW5uaW5nIChlLmcuIGEgdG9vbCB3YXNcbiAqIGludm9rZWQgb3V0c2lkZSB0aGUgY2hhdCByb3V0ZSkuXG4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVDbGllbnQoXG4gIGN0eDogVG9vbEV4ZWN1dGVDdHgsXG4gIHRvb2xJZDogc3RyaW5nLFxuKToge1xuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudDtcbiAgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0O1xufSB7XG4gIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gY3R4Py5yZXF1ZXN0Q29udGV4dDtcbiAgaWYgKCFyZXF1ZXN0Q29udGV4dCkge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgYCR7dG9vbElkfSByZXF1ZXN0IGNvbnRleHRgLFxuICAgICAgXCJJbnZva2UgdGhlIHRvb2wgZnJvbSBhbiBhZ2VudCB0dXJuIHNlcnZlZCBieSB0aGUgbWFzdHJhIHBsdWdpbi5cIixcbiAgICApO1xuICB9XG4gIGNvbnN0IHVzZXIgPSByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfS0VZKSBhcyBVc2VyIHwgdW5kZWZpbmVkO1xuICBpZiAoIXVzZXIpIHtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IucmVzb3VyY2VOb3RGb3VuZChcbiAgICAgIGAke3Rvb2xJZH0gdXNlciBjb250ZXh0YCxcbiAgICAgIFwiSW52b2tlIHRoZSB0b29sIGZyb20gYW4gYWdlbnQgdHVybiBzZXJ2ZWQgYnkgdGhlIG1hc3RyYSBwbHVnaW4sIHdoaWNoIHN0YW1wcyB0aGUgQXBwS2l0IHVzZXIgb24gdGhlIE1hc3RyYSByZXF1ZXN0IGNvbnRleHQuXCIsXG4gICAgKTtcbiAgfVxuICByZXR1cm4geyBjbGllbnQ6IHVzZXIuZXhlY3V0aW9uQ29udGV4dC5jbGllbnQsIHJlcXVlc3RDb250ZXh0IH07XG59XG5cbi8qKlxuICogTG93ZXJjYXNlZCBwbGFjZWhvbGRlciBzdHJpbmdzIHdlIHJlamVjdCBhdCB0aGUgYGFza19nZW5pZWBcbiAqIGJvdW5kYXJ5IHNvIHRoZSBMTE0gZG9lc24ndCBzcGVuZCBhIEdlbmllIHJvdW5kLXRyaXAgb24gYVxuICogbm9uLXF1ZXN0aW9uLiBHZW5pZSBwb2xpdGVseSBhbnN3ZXJzIGFueSBvZiB0aGVzZSB3aXRoIFwiWW91clxuICogcmVxdWVzdCAnLi4uJyBkb2VzIG5vdCByZWxhdGUgdG8uLi5cIiB3aGljaCBpcyBwdXJlIFVJIG5vaXNlLlxuICogS2VwdCBuYXJyb3cgb24gcHVycG9zZSAtIHJlYWwgcXVlc3Rpb25zIHNvbWV0aW1lcyBzdGFydCB3aXRoXG4gKiBvbmUgb2YgdGhlc2UgdG9rZW5zLCBzbyB3ZSBvbmx5IG1hdGNoIHRoZSBGVUxMIHRyaW1tZWQgc3RyaW5nLlxuICovXG5jb25zdCBQTEFDRUhPTERFUl9RVUVTVElPTlMgPSBuZXcgU2V0KFtcbiAgXCJub29wXCIsXG4gIFwibm8tb3BcIixcbiAgXCJza2lwXCIsXG4gIFwibm9uZVwiLFxuICBcIm4vYVwiLFxuICBcIm5hXCIsXG4gIFwibnVsbFwiLFxuICBcInVuZGVmaW5lZFwiLFxuICBcInRlc3RcIixcbiAgXCJwbGFjZWhvbGRlclwiLFxuXSk7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNvbnZlcnNhdGlvbiBzdGF0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIEVzdGltYXRlZCBHZW5pZSBjb252ZXJzYXRpb24gbGlmZXRpbWUgaW4gc2Vjb25kcy4gRGF0YWJyaWNrc1xuICogcHVibGlzaGVzIG5vIG9mZmljaWFsIFRUTCBvbiB0aGUgY29udmVyc2F0aW9uIHJlc291cmNlIGl0c2VsZjtcbiAqIGNvbW11bml0eSBwcm9qZWN0cyAoZS5nLiB0aGUgb3Blbi1zb3VyY2UgRGF0YWJyaWNrcyBHZW5pZSBCb3QpXG4gKiBjb252ZXJnZSBvbiA0IGhvdXJzIG9mIGluYWN0aXZpdHkgYXMgYSBzYWZlIG9wZXJhdGluZyB3aW5kb3cuXG4gKiBUcmVhdCB0aGlzIGFzIGFuIGVzdGltYXRlIHRoYXQgZ2V0cyAqZXh0ZW5kZWQgb24gZXZlcnkgdXNlKiBieVxuICogcmUtc2V0dGluZyB0aGUgY2FjaGUgZW50cnkgYWZ0ZXIgZWFjaCBzdWNjZXNzZnVsIHR1cm4gKHNsaWRpbmdcbiAqIFRUTCB2aWEgcmUtYHNldGApLiBXaGVuIHRoZSBlc3RpbWF0ZSBlbmRzIHVwIHdyb25nIChjb252ZXJzYXRpb25cbiAqIGRlbGV0ZWQsIGV4cGlyZWQgdXBzdHJlYW0sIGNyb3NzLXNwYWNlIHJlZmVyZW5jZWQpLCBgYXNrX2dlbmllYFxuICogY2F0Y2hlcyB0aGUgU0RLJ3MgYFJFU09VUkNFX0RPRVNfTk9UX0VYSVNUYC80MDQgYW5kIHRyYW5zcGFyZW50bHlcbiAqIHN0YXJ0cyBhIGZyZXNoIGNvbnZlcnNhdGlvbi5cbiAqL1xuY29uc3QgQ09OVkVSU0FUSU9OX1RUTF9TRUMgPSA0ICogNjAgKiA2MDtcblxuLyoqIENhY2hlIG5hbWVzcGFjZSBwcmVmaXggc28gY29leGlzdGluZyBNYXN0cmEgY2FjaGVzIGRvbid0IGNvbGxpZGUuICovXG5jb25zdCBDT05WRVJTQVRJT05fQ0FDSEVfTkFNRVNQQUNFID0gXCJtYXN0cmE6Z2VuaWU6Y29udmVyc2F0aW9uXCI7XG5cbi8qKlxuICogUGVyLXJlcXVlc3Qgc3RhdGUgZm9yIG9uZSBHZW5pZSBzcGFjZS4gVGhlIHJldXNhYmxlIGNvbnZlcnNhdGlvbiBpcyByZXNlcnZlZFxuICogYnkgYXQgbW9zdCBvbmUgaW52b2NhdGlvbiBhdCBhIHRpbWUuIEFkZGl0aW9uYWwgY29uY3VycmVudCBpbnZvY2F0aW9ucyB1c2VcbiAqIGlzb2xhdGVkIGNvbnZlcnNhdGlvbnMgc28gTWFzdHJhIGNhbiBleGVjdXRlIHBhcmFsbGVsIHRvb2wgY2FsbHMgd2l0aG91dFxuICogYXBwZW5kaW5nIG11bHRpcGxlIGFjdGl2ZSBtZXNzYWdlcyB0byB0aGUgc2FtZSBHZW5pZSBjb252ZXJzYXRpb24uXG4gKi9cbmludGVyZmFjZSBDb252ZXJzYXRpb25TdGF0ZSB7XG4gIGNvbnZlcnNhdGlvbklkPzogc3RyaW5nO1xuICByZXVzYWJsZUNvbnZlcnNhdGlvbkluRmxpZ2h0OiBib29sZWFuO1xufVxuXG4vKiogQnVpbGQgdGhlIHBlci1yZXF1ZXN0IHtAbGluayBSZXF1ZXN0Q29udGV4dH0ga2V5IGZvciBvbmUgR2VuaWUgc3BhY2UuICovXG5jb25zdCBjb252ZXJzYXRpb25Db250ZXh0S2V5ID0gKHNwYWNlSWQ6IHN0cmluZyk6IHN0cmluZyA9PlxuICBgbWFzdHJhX19nZW5pZV9jb252ZXJzYXRpb25fXyR7c3BhY2VJZH1gO1xuXG4vKipcbiAqIFJlYWQgb3IgaW5pdGlhbGl6ZSB0aGUgcGVyLXNwYWNlIGNvbnZlcnNhdGlvbiBzdGF0ZS4gVGhlIHN0cmluZyBicmFuY2hcbiAqIHByZXNlcnZlcyBjb21wYXRpYmlsaXR5IHdpdGggYSBjb250ZXh0IHBvcHVsYXRlZCBieSBhbiBvbGRlciBwYWNrYWdlIGNvcHkuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnNhdGlvblN0YXRlKHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCwgc3BhY2VJZDogc3RyaW5nKTogQ29udmVyc2F0aW9uU3RhdGUge1xuICBjb25zdCBrZXkgPSBjb252ZXJzYXRpb25Db250ZXh0S2V5KHNwYWNlSWQpO1xuICBjb25zdCBjdXJyZW50ID0gcmVxdWVzdENvbnRleHQuZ2V0KGtleSkgYXMgQ29udmVyc2F0aW9uU3RhdGUgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlmIChjdXJyZW50ICYmIHR5cGVvZiBjdXJyZW50ID09PSBcIm9iamVjdFwiKSByZXR1cm4gY3VycmVudDtcbiAgY29uc3Qgc3RhdGU6IENvbnZlcnNhdGlvblN0YXRlID0ge1xuICAgIC4uLih0eXBlb2YgY3VycmVudCA9PT0gXCJzdHJpbmdcIiA/IHsgY29udmVyc2F0aW9uSWQ6IGN1cnJlbnQgfSA6IHt9KSxcbiAgICByZXVzYWJsZUNvbnZlcnNhdGlvbkluRmxpZ2h0OiBmYWxzZSxcbiAgfTtcbiAgcmVxdWVzdENvbnRleHQuc2V0KGtleSwgc3RhdGUpO1xuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogUmVzZXJ2ZSB0aGUgcmV1c2FibGUgY29udmVyc2F0aW9uIHdoZW4gaXQgaXMgaWRsZS4gQSBjYWxsZXIgdGhhdCBjYW5ub3RcbiAqIHJlc2VydmUgaXQgZ2V0cyBhbiBpc29sYXRlZCBjb252ZXJzYXRpb24gYW5kIG1heSBydW4gaW4gcGFyYWxsZWwuXG4gKi9cbmZ1bmN0aW9uIHJlc2VydmVDb252ZXJzYXRpb24oc3RhdGU6IENvbnZlcnNhdGlvblN0YXRlKTogYm9vbGVhbiB7XG4gIGlmIChzdGF0ZS5yZXVzYWJsZUNvbnZlcnNhdGlvbkluRmxpZ2h0KSByZXR1cm4gZmFsc2U7XG4gIHN0YXRlLnJldXNhYmxlQ29udmVyc2F0aW9uSW5GbGlnaHQgPSB0cnVlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgY2Fub25pY2FsIGNhY2hlIGtleSBmb3IgYSBgKHNwYWNlSWQsIHRocmVhZElkKWAgcGFpciwgb3duZWQgYnlcbiAqIGB1c2VyS2V5YC4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIGB0aHJlYWRJZGAgaXMgbWlzc2luZyAtIGNhbGxlcnMgc2hvdWxkXG4gKiBza2lwIGNhY2hpbmcgZW50aXJlbHkgaW4gdGhhdCBjYXNlIChubyBNYXN0cmEgbWVtb3J5IHdpcmVkIHVwKS5cbiAqXG4gKiBUaGUgaWRlbnRpdHkgaXMgcGFydCBvZiB0aGUga2V5IGJlY2F1c2UgYSBjbGllbnQgcGlja3MgaXRzIG93biBgdGhyZWFkSWRgXG4gKiAodGhlIHRocmVhZC1zZWxlY3Rpb24gaGVhZGVyIC8gYD90aHJlYWRJZD1gKSwgc28gdGhlIGlkIGFsb25lIGRvZXMgbm90XG4gKiBlc3RhYmxpc2ggd2hvIG93bnMgdGhlIEdlbmllIGNvbnZlcnNhdGlvbiBiZWhpbmQgaXQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbnZlcnNhdGlvbkNhY2hlS2V5KFxuICBzcGFjZUlkOiBzdHJpbmcsXG4gIHRocmVhZElkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHVzZXJLZXk6IHN0cmluZyxcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmICghdGhyZWFkSWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiAoYXdhaXQgQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlKCkpLmdlbmVyYXRlS2V5KFxuICAgIFtDT05WRVJTQVRJT05fQ0FDSEVfTkFNRVNQQUNFLCBzcGFjZUlkLCB0aHJlYWRJZF0sXG4gICAgdXNlcktleSxcbiAgKTtcbn1cblxuLyoqXG4gKiBSZWFkIHRoZSBjYWNoZWQgR2VuaWUgY29udmVyc2F0aW9uIGlkIGZvciBgKHNwYWNlSWQsIHRocmVhZElkKWAuXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIG9uIG1pc3MsIG9uIGV4cGlyeSwgb3Igd2hlbiB0aGUgY2FjaGUgbGF5ZXJcbiAqIGlzIHVuaGVhbHRoeSAtIG5ldmVyIHRocm93cy4gVGhlIFRUTCBpcyByZW5ld2VkIHZpYSByZS1gc2V0YFxuICogYWZ0ZXIgZWFjaCBzdWNjZXNzZnVsIHR1cm4gKHNlZSB7QGxpbmsgc2F2ZUNhY2hlZENvbnZlcnNhdGlvbklkfSkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRDYWNoZWRDb252ZXJzYXRpb25JZChjYWNoZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgaWYgKCFjYWNoZUtleSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBjb25zdCB2ID0gYXdhaXQgQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlU3luYygpLmdldDxzdHJpbmc+KGNhY2hlS2V5KTtcbiAgICByZXR1cm4gdiA/PyB1bmRlZmluZWQ7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwiY29udmVyc2F0aW9uLWNhY2hlOnJlYWQtZXJyb3JcIiwge1xuICAgICAgZXJyb3I6IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFBlcnNpc3QgdGhlIGFjdGl2ZSBjb252ZXJzYXRpb24gaWQgdW5kZXIgYGNhY2hlS2V5YCwgcmVmcmVzaGluZ1xuICogaXRzIFRUTC4gSWRlbXBvdGVudDsgbm8tb3Agd2hlbiBgY2FjaGVLZXlgIG9yIGBjb252ZXJzYXRpb25JZGBcbiAqIGlzIG1pc3NpbmcuIFJlLXNldHRpbmcgdGhlIHNhbWUga2V5IGFjdHMgYXMgYSBzbGlkaW5nIFRUTDogZXZlcnlcbiAqIHR1cm4gdGhhdCB1c2VzIHRoZSBjb252ZXJzYXRpb24gZXh0ZW5kcyB0aGUgd2luZG93IGJ5IGFub3RoZXJcbiAqIHtAbGluayBDT05WRVJTQVRJT05fVFRMX1NFQ30gc2Vjb25kcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2F2ZUNhY2hlZENvbnZlcnNhdGlvbklkKFxuICBjYWNoZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBjb252ZXJzYXRpb25JZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghY2FjaGVLZXkgfHwgIWNvbnZlcnNhdGlvbklkKSByZXR1cm47XG4gIHRyeSB7XG4gICAgYXdhaXQgQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlU3luYygpLnNldChjYWNoZUtleSwgY29udmVyc2F0aW9uSWQsIHtcbiAgICAgIHR0bDogQ09OVkVSU0FUSU9OX1RUTF9TRUMsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwiY29udmVyc2F0aW9uLWNhY2hlOndyaXRlLWVycm9yXCIsIHtcbiAgICAgIGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnIpLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKiBGb3JjZS1ldmljdCBhIGNhY2hlZCBjb252ZXJzYXRpb24gaWQuIFVzZWQgb24gdGhlIHN0YWxlLWlkIHJlY292ZXJ5IHBhdGguICovXG5hc3luYyBmdW5jdGlvbiBldmljdENhY2hlZENvbnZlcnNhdGlvbklkKGNhY2hlS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFjYWNoZUtleSkgcmV0dXJuO1xuICB0cnkge1xuICAgIGF3YWl0IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZVN5bmMoKS5kZWxldGUoY2FjaGVLZXkpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihcImNvbnZlcnNhdGlvbi1jYWNoZTpkZWxldGUtZXJyb3JcIiwge1xuICAgICAgZXJyb3I6IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBMYXp5LXNlZWQgdGhlIGFjdGl2ZSBHZW5pZSBgY29udmVyc2F0aW9uX2lkYCBmb3IgYHNwYWNlSWRgIGZyb21cbiAqIHRoZSBjcm9zcy1yZXF1ZXN0IGNhY2hlIG9udG8gdGhlIHBlci1yZXF1ZXN0IGBSZXF1ZXN0Q29udGV4dGAuXG4gKiBOby1vcCB3aGVuIHRoZSBzbG90IGlzIGFscmVhZHkgcG9wdWxhdGVkIChzdWJzZXF1ZW50XG4gKiBgYXNrX2dlbmllYCBjYWxscyBpbiB0aGUgc2FtZSB0dXJuKSBzbyB3ZSBoaXQgdGhlIGNhY2hlIGF0IG1vc3RcbiAqIG9uY2UgcGVyIHJlcXVlc3QgcGVyIHNwYWNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVDb252ZXJzYXRpb25TZWVkZWQoXG4gIHN0YXRlOiBDb252ZXJzYXRpb25TdGF0ZSxcbiAgY2FjaGVLZXk6IHN0cmluZyB8IHVuZGVmaW5lZCxcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoc3RhdGUuY29udmVyc2F0aW9uSWQpIHJldHVybjtcbiAgY29uc3QgY2FjaGVkID0gYXdhaXQgcmVhZENhY2hlZENvbnZlcnNhdGlvbklkKGNhY2hlS2V5KTtcbiAgaWYgKGNhY2hlZCkgc3RhdGUuY29udmVyc2F0aW9uSWQgPSBjYWNoZWQ7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwcmVwYXJlX2NoYXJ0IGlucHV0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIEFnZW50LWZhY2luZyBgcHJlcGFyZV9jaGFydGAgaW5wdXQgc2NoZW1hLiBSZXVzZXNcbiAqIHtAbGluayBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hfSAodGhlIGRhdGFzZXQtZHJpdmVuIHBsYW5uZXJcbiAqIGNvbnRyYWN0KSBidXQgc3dhcHMgdGhlIGlubGluZSBgZGF0YWAgZmllbGQgZm9yIGEgR2VuaWVcbiAqIGBzdGF0ZW1lbnRfaWRgIHRoZSB0b29sIHJlc29sdmVzIGludG8gcm93cyBzZXJ2ZXItc2lkZS5cbiAqIGB0aXRsZWAgaXMgbG9vc2VuZWQgdG8gb3B0aW9uYWwgLSB0aGUgcGxhbm5lciBmYWxscyBiYWNrIHRvIGFcbiAqIGdlbmVyaWMgcGxhY2Vob2xkZXIgd2hlbiB0aGUgYWdlbnQgZG9lc24ndCBzdXBwbHkgb25lLlxuICpcbiAqIFNoYXBlZCB0byBtYXRjaCBHZW5pZSdzIHdpcmUgZm9ybSAtIGBzdGF0ZW1lbnRfaWRgIChzbmFrZSlcbiAqIG1pcnJvcnMgYHF1ZXJ5X3Jlc3VsdC5zdGF0ZW1lbnRfaWRgIGFuZCB0aGUgYGdldF9zdGF0ZW1lbnRgXG4gKiB0b29sJ3MgaW5wdXQgZmllbGQgbmFtZSwgc28gdGhlIExMTSBvbmx5IGV2ZXIgc2VlcyBvbmVcbiAqIHNwZWxsaW5nIGZvciB0aGUgc2FtZSBpZGVudGlmaWVyLlxuICovXG5jb25zdCBwcmVwYXJlQ2hhcnRSZXF1ZXN0U2NoZW1hID0gY2hhcnRQbGFubmVyUmVxdWVzdFNjaGVtYVxuICAub21pdCh7IGRhdGE6IHRydWUsIHRpdGxlOiB0cnVlIH0pXG4gIC5leHRlbmQoe1xuICAgIHN0YXRlbWVudF9pZDogelxuICAgICAgLnN0cmluZygpXG4gICAgICAubWluKDEsIFwic3RhdGVtZW50X2lkIGlzIHJlcXVpcmVkXCIpXG4gICAgICAuZGVzY3JpYmUoXG4gICAgICAgIHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICAgIEdlbmllIFxcYHN0YXRlbWVudF9pZFxcYCB0byBjaGFydC4gUmVhZCBmcm9tXG4gICAgICAgICAgXFxgbWVzc2FnZS5xdWVyeV9yZXN1bHQuc3RhdGVtZW50X2lkXFxgIG9yXG4gICAgICAgICAgXFxgbWVzc2FnZS5hdHRhY2htZW50c1sqXS5xdWVyeS5zdGF0ZW1lbnRfaWRcXGAgcmV0dXJuZWQgYnlcbiAgICAgICAgICBcXGBhc2tfZ2VuaWVcXGAuXG4gICAgICAgIGApLFxuICAgICAgKSxcbiAgICB0aXRsZTogY2hhcnRQbGFubmVyUmVxdWVzdFNjaGVtYS5zaGFwZS50aXRsZS5vcHRpb25hbCgpLFxuICB9KTtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdG9vbCBpZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBTdWZmaXggYXBwZW5kZWQgdG8gcGVyLXNwYWNlIHRvb2wgaWRzIHdoZW4gdGhlIGFsaWFzIGlzbid0IHRoZVxuICogd2VsbC1rbm93biBgZGVmYXVsdGAuIFNpbmdsZS1zcGFjZSBkZXBsb3ltZW50cyBnZXQgdGhlIGJhcmVcbiAqIG5hbWVzIChgYXNrX2dlbmllYCwgYGdldF9zcGFjZV9kZXNjcmlwdGlvbmAsIC4uLik7IG11bHRpLXNwYWNlXG4gKiBkZXBsb3ltZW50cyBnZXQgYGFza19nZW5pZV88YWxpYXM+YCBldGMuIHNvIGVhY2ggc3BhY2UncyB0b29sc1xuICogc3RheSBkaXNhbWJpZ3VhdGVkIGluIHRoZSBjZW50cmFsIGFnZW50J3MgdG9vbCByZWdpc3RyeS5cbiAqL1xuZnVuY3Rpb24gYWxpYXNTdWZmaXgoYWxpYXM6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChhbGlhcyA9PT0gREVGQVVMVF9HRU5JRV9BTElBUykgcmV0dXJuIFwiXCI7XG4gIGNvbnN0IHNsdWcgPSBzdHJpbmdVdGlscy50b0lkZW50aWZpZXIoYWxpYXMpO1xuICByZXR1cm4gc2x1ZyA/IGBfJHtzbHVnfWAgOiBcIlwiO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGVyLXNwYWNlIHRvb2xzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIERyb3AgYHN1Z2dlc3RlZF9xdWVzdGlvbnNgIGF0dGFjaG1lbnRzIGZyb20gYSB7QGxpbmsgR2VuaWVNZXNzYWdlfVxuICogYmVmb3JlIGhhbmRpbmcgaXQgdG8gdGhlIGNlbnRyYWwgTExNLiBUaG9zZSBlbnRyaWVzIGFscmVhZHlcbiAqIHN1cmZhY2UgaW4gdGhlIFVJIGFzIG9uZS10YXAgcGlsbHMgdmlhIHRoZSB3cml0ZXInc1xuICogYHN1Z2dlc3RlZF9xdWVzdGlvbnNgIGV2ZW50cyAoc2VlIGBjb2xsZWN0U3VnZ2VzdGlvbnNgIG9uIHRoZVxuICogY2xpZW50KTsgaWYgd2UgbGV0IHRoZW0gcmlkZSBiYWNrIGluIHRoZSB0b29sIHJlc3VsdCB0aGUgTExNXG4gKiB0ZW5kcyB0byBxdW90ZSB0aGVtIGlubGluZSBpbiBpdHMgcHJvc2UsIGRvdWJsZS1zaG93aW5nIHRoZVxuICogc2FtZSBxdWVzdGlvbnMgYW5kIHN0ZXBwaW5nIG9uIHRoZSBkZWRpY2F0ZWQgc3VnZ2VzdGlvbiBVSS5cbiAqIFF1ZXJ5IC8gdGV4dCAvIHJvdyBhdHRhY2htZW50cyBhcmUgcHJlc2VydmVkIHNvIHRoZSBtb2RlbCBjYW5cbiAqIHN0aWxsIHJlYWQgYHN0YXRlbWVudF9pZGAsIFNRTCwgYW5kIHRoZSBhbnN3ZXIgdGV4dC5cbiAqL1xuZnVuY3Rpb24gc3RyaXBTdWdnZXN0ZWRRdWVzdGlvbnMobWVzc2FnZTogR2VuaWVNZXNzYWdlKTogR2VuaWVNZXNzYWdlIHtcbiAgY29uc3QgYXR0YWNobWVudHMgPSBtZXNzYWdlLmF0dGFjaG1lbnRzO1xuICBpZiAoIWF0dGFjaG1lbnRzIHx8IGF0dGFjaG1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG1lc3NhZ2U7XG4gIGNvbnN0IGZpbHRlcmVkID0gYXR0YWNobWVudHMuZmlsdGVyKChhdHQpID0+ICFhdHQuc3VnZ2VzdGVkX3F1ZXN0aW9ucyk7XG4gIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IGF0dGFjaG1lbnRzLmxlbmd0aCkgcmV0dXJuIG1lc3NhZ2U7XG4gIHJldHVybiB7IC4uLm1lc3NhZ2UsIGF0dGFjaG1lbnRzOiBmaWx0ZXJlZCB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEFza0dlbmllVG9vbChvcHRzOiB7XG4gIHNwYWNlSWQ6IHN0cmluZztcbiAgYWxpYXM6IHN0cmluZztcbiAgaGludD86IHN0cmluZztcbiAgYWdlbnRNb2RlPzogYm9vbGVhbjtcbn0pIHtcbiAgY29uc3QgeyBzcGFjZUlkLCBhbGlhcywgaGludCwgYWdlbnRNb2RlIH0gPSBvcHRzO1xuICBjb25zdCB0b29sSWQgPSBgYXNrX2dlbmllJHthbGlhc1N1ZmZpeChhbGlhcyl9YDtcbiAgY29uc3QgaGludExpbmUgPSBoaW50ID8gYCAoJHtoaW50fSlgIDogXCJcIjtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkOiB0b29sSWQsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oYFxuICAgICAgQXNrIHRoZSBHZW5pZSBzcGFjZSBcIiR7YWxpYXN9XCIke2hpbnRMaW5lfSBPTkUgZm9jdXNlZFxuICAgICAgbmF0dXJhbC1sYW5ndWFnZSBzdWItcXVlc3Rpb24gYW5kIHdhaXQgZm9yIHRoZSB0dXJuIHRvXG4gICAgICBjb21wbGV0ZS4gR2VuaWUgYW5zd2VycyBiZXN0IHdoZW4gZWFjaCBjYWxsIGNvdmVycyBhXG4gICAgICBzaW5nbGUgbWV0cmljIC8gZGltZW5zaW9uIC8gdGltZSB3aW5kb3csIHNvIGV4cGVjdCB0b1xuICAgICAgY2FsbCB0aGlzIHRvb2wgTVVMVElQTEUgVElNRVMgcGVyIHVzZXIgdHVybiAodHlwaWNhbGx5XG4gICAgICB0d28gdG8gc2l4KS4gSW5kZXBlbmRlbnQgc3ViLXF1ZXN0aW9ucyBtYXkgYmUgY2FsbGVkIGluXG4gICAgICBQQVJBTExFTDsgY2FsbHMgdGhhdCBkZXBlbmQgb24gYW4gZWFybGllciBhbnN3ZXIgc2hvdWxkIHN0YXlcbiAgICAgIHNlcXVlbnRpYWwuIFBhcmFsbGVsIGNhbGxzIHVzZSBpc29sYXRlZCBHZW5pZSBjb252ZXJzYXRpb25zLFxuICAgICAgd2hpbGUgc2VxdWVudGlhbCBjYWxscyByZXRhaW4gdGhlIHJldXNhYmxlIGNvbnZlcnNhdGlvbiBjb250ZXh0LlxuICAgICAgVGhpcyBpcyB0aGUgbm9ybWFsIHBhdHRlcm4sIG5vdCB0aGUgZXhjZXB0aW9uLlxuICAgICAgRG8gTk9UIHRyeSB0byBjcmFtIGEgbXVsdGktcGFydCBxdWVzdGlvbiBpbnRvIGEgc2luZ2xlXG4gICAgICBjYWxsOyBkZWNvbXBvc2UgZmlyc3QsIHRoZW4gYXNrIGVhY2ggcGllY2UuXG5cbiAgICAgIFJldHVybnMgdGhlIGZpbmFsIFxcYEdlbmllTWVzc2FnZVxcYC4gQWdlbnQgTW9kZSBpbmNsdWRlcyB0aGVcbiAgICAgIHN5bnRoZXNpemVkIGFuc3dlciBhbmQgY2FuIGluY2x1ZGUgU1FMIHJlc3VsdCB2YWx1ZXMgYXMgYVxuICAgICAgTWFya2Rvd24gdGV4dCBhdHRhY2htZW50LiBBZ2VudCBNb2RlIGhhcyBubyBcXGBzdGF0ZW1lbnRfaWRcXGA7XG4gICAgICB1c2UgXFxgcmVuZGVyX2RhdGFcXGAgd2l0aCBpdHMgaW5saW5lIHJvd3Mgd2hlbiBhIGNoYXJ0IGlzIG5lZWRlZC5cbiAgICAgIEEgbGVnYWN5IHBvbGxpbmcgcmVzdWx0IGluc3RlYWQgY2FycmllcyBhIFxcYHN0YXRlbWVudF9pZFxcYCAoYXRcbiAgICAgIFxcYG1lc3NhZ2UucXVlcnlfcmVzdWx0LnN0YXRlbWVudF9pZFxcYCBvciB0aGUgZmlyc3RcbiAgICAgIGF0dGFjaG1lbnQncyBcXGBxdWVyeS5zdGF0ZW1lbnRfaWRcXGApOyBjYWxsXG4gICAgICBcXGBnZXRfc3RhdGVtZW50XFxgIHdpdGggdGhhdCBpZCBvbmx5IHdoZW4geW91IG5lZWQgdG8gcmVhZFxuICAgICAgdGhlIHVuZGVybHlpbmcgdmFsdWVzIHRvIHJlYXNvbiBhYm91dCB0aGVtLiBJZiB5b3UganVzdCB3YW50XG4gICAgICB0byBkaXNwbGF5IGEgbGVnYWN5IHJlc3VsdCwgZW1iZWQgYVxuICAgICAgXFxgW2RhdGE6PHN0YXRlbWVudF9pZD5dXFxgIG1hcmtlciBpbiBwcm9zZS4gV2lyZSBldmVudHNcbiAgICAgIChzdGF0dXMsIHJlYXNvbmluZywgU1FMLCBxdWVyeSBvdXRwdXQsIGFuc3dlciB0ZXh0KSBzdHJlYW1cbiAgICAgIGF1dG9tYXRpY2FsbHkgd2hpbGUgdGhlIGNhbGwgaXMgaW4gZmxpZ2h0LlxuICAgIGApLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBxdWVzdGlvbjogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm1pbigxLCBcInF1ZXN0aW9uIGlzIHJlcXVpcmVkXCIpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBzdHJpbmdVdGlscy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgICAgIE9ORSBmb2N1c2VkIG5hdHVyYWwtbGFuZ3VhZ2UgcXVlc3Rpb24gYWJvdXQgdGhlIGRhdGEgaW4gdGhpc1xuICAgICAgICAgICAgc3BhY2UsIGNvdmVyaW5nIGEgc2luZ2xlIG1ldHJpYyAvIGRpbWVuc2lvbiAvIHRpbWUgd2luZG93XG4gICAgICAgICAgICAoZS5nLiBcIldoYXQgd2FzIFEzIHJldmVudWUgYnkgcmVnaW9uP1wiKS4gRGVjb21wb3NlIGFcbiAgICAgICAgICAgIG11bHRpLXBhcnQgYXNrIGludG8gc2VwYXJhdGUgY2FsbHMgcmF0aGVyIHRoYW4gY29tYmluaW5nIGl0XG4gICAgICAgICAgICBoZXJlLlxuICAgICAgICAgIGApLFxuICAgICAgICApLFxuICAgIH0pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgbWVzc2FnZTogZ2VuaWVNb2RlbC5HZW5pZU1lc3NhZ2VTY2hlbWEsXG4gICAgfSksXG4gICAgZXhlY3V0ZTogYXN5bmMgKHsgcXVlc3Rpb24gfSwgY3R4UmF3KSA9PiB7XG4gICAgICBjb25zdCBjdHggPSBjdHhSYXcgYXMgVG9vbEV4ZWN1dGVDdHg7XG4gICAgICBjb25zdCB7IGNsaWVudCwgcmVxdWVzdENvbnRleHQgfSA9IHJlcXVpcmVDbGllbnQoY3R4LCB0b29sSWQpO1xuICAgICAgY29uc3Qgd3JpdGVyID0gY3R4Py53cml0ZXI7XG4gICAgICBjb25zdCB0b29sQ2FsbElkID0gY3R4Py5hZ2VudD8udG9vbENhbGxJZDtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IGN0eD8uYWJvcnRTaWduYWw7XG4gICAgICBjb25zdCB0aHJlYWRJZCA9IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVEhSRUFEX0lEX0tFWSkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgICAvLyBCb3VuY2UgcGxhY2Vob2xkZXIgLyBuby1vcCBxdWVzdGlvbnMgQkVGT1JFIHNwZW5kaW5nIGEgR2VuaWVcbiAgICAgIC8vIHJvdW5kLXRyaXAgb24gdGhlbS4gR2VuaWUgYW5zd2VycyBhbnkgb2YgdGhlc2Ugd2l0aCBcIllvdXJcbiAgICAgIC8vIHJlcXVlc3QgJ25vb3AnIGRvZXMgbm90IHJlbGF0ZSB0by4uLlwiIC0gdXNlbGVzcyBub2lzZSB0aGF0XG4gICAgICAvLyBzaG93cyB1cCBpbiB0aGUgVUkgYW5kIGVhdHMgb25lIG9mIHRoZSB3b3Jrc3BhY2UncyA1XG4gICAgICAvLyBxdWVzdGlvbnMvbWludXRlLiBSZXR1cm5pbmcgYSBjbGVhciBlcnJvciBoZXJlIHN1cmZhY2VzIHRoZVxuICAgICAgLy8gaXNzdWUgdG8gdGhlIGFnZW50IGxvb3Agc28gdGhlIG1vZGVsIGNvcnJlY3RzIGNvdXJzZSBpbnN0ZWFkXG4gICAgICAvLyBvZiB3YXN0aW5nIGEgdHVybi5cbiAgICAgIGNvbnN0IHRyaW1tZWQgPSBxdWVzdGlvbi50cmltKCk7XG4gICAgICBpZiAodHJpbW1lZC5sZW5ndGggPT09IDAgfHwgUExBQ0VIT0xERVJfUVVFU1RJT05TLmhhcyh0cmltbWVkLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgIHRocm93IFZhbGlkYXRpb25FcnJvci5pbnZhbGlkVmFsdWUoXG4gICAgICAgICAgYCR7dG9vbElkfS5xdWVzdGlvbmAsXG4gICAgICAgICAgcXVlc3Rpb24sXG4gICAgICAgICAgXCJhIHJlYWwgbmF0dXJhbC1sYW5ndWFnZSBxdWVzdGlvbiwgbm90IGEgcGxhY2Vob2xkZXI7IHNraXAgdGhlIGNhbGwgaW5zdGVhZFwiLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdGF0ZSA9IGNvbnZlcnNhdGlvblN0YXRlKHJlcXVlc3RDb250ZXh0LCBzcGFjZUlkKTtcbiAgICAgIGNvbnN0IG93bnNSZXVzYWJsZUNvbnZlcnNhdGlvbiA9IHJlc2VydmVDb252ZXJzYXRpb24oc3RhdGUpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gT25seSB0aGUgcmVzZXJ2ZWQgbGFuZSBzZWVkcyBhbmQgdXBkYXRlcyB0aGUgdGhyZWFkJ3MgcmV1c2FibGVcbiAgICAgICAgLy8gY29udmVyc2F0aW9uLiBDb25jdXJyZW50IGxhbmVzIGRlbGliZXJhdGVseSBzdGFydCBmcmVzaCBjb252ZXJzYXRpb25zLlxuICAgICAgICBjb25zdCBjYWNoZUtleSA9IG93bnNSZXVzYWJsZUNvbnZlcnNhdGlvblxuICAgICAgICAgID8gYXdhaXQgY29udmVyc2F0aW9uQ2FjaGVLZXkoc3BhY2VJZCwgdGhyZWFkSWQsIHJlc29sdmVVc2VyS2V5KHJlcXVlc3RDb250ZXh0KSlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKG93bnNSZXVzYWJsZUNvbnZlcnNhdGlvbikge1xuICAgICAgICAgIGF3YWl0IGVuc3VyZUNvbnZlcnNhdGlvblNlZWRlZChzdGF0ZSwgY2FjaGVLZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRWFjaCBpbnZvY2F0aW9uIGtlZXBzIGl0cyBjb252ZXJzYXRpb24gaWQgbG9jYWxseS4gT25seSB0aGUgcmV1c2FibGVcbiAgICAgICAgLy8gbGFuZSBwdWJsaXNoZXMgdXBkYXRlcyB0byBzaGFyZWQgcmVxdWVzdCBhbmQgY3Jvc3MtcmVxdWVzdCBzdGF0ZS5cbiAgICAgICAgbGV0IGNvbnZlcnNhdGlvbklkID0gb3duc1JldXNhYmxlQ29udmVyc2F0aW9uID8gc3RhdGUuY29udmVyc2F0aW9uSWQgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgY29uc3Qgc3RhcnRlZEV2ZW50OiBTdGFydGVkRXZlbnQgPSB7XG4gICAgICAgICAgdHlwZTogXCJzdGFydGVkXCIsXG4gICAgICAgICAgc3BhY2VJZCxcbiAgICAgICAgICBjb250ZW50OiBxdWVzdGlvbixcbiAgICAgICAgfTtcbiAgICAgICAgYXdhaXQgc2FmZVdyaXRlUHJvZ3Jlc3MobG9nZ2VyLCB3cml0ZXIsIHRvb2xDYWxsSWQsIHN0YXJ0ZWRFdmVudCk7XG5cbiAgICAgICAgY29uc3QgcnVuVHVybiA9IGFzeW5jICgpOiBQcm9taXNlPEdlbmllTWVzc2FnZT4gPT4ge1xuICAgICAgICAgIGNvbnN0IHNlZWRDb252ZXJzYXRpb25JZCA9IGNvbnZlcnNhdGlvbklkO1xuICAgICAgICAgIGxldCBmaW5hbE1lc3NhZ2U6IEdlbmllTWVzc2FnZSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGV2ZW50IG9mIGNoYXQuZ2VuaWVFdmVudENoYXQoc3BhY2VJZCwgcXVlc3Rpb24sIHtcbiAgICAgICAgICAgIHdvcmtzcGFjZUNsaWVudDogY2xpZW50LFxuICAgICAgICAgICAgLi4uKGFnZW50TW9kZSAhPT0gdW5kZWZpbmVkID8geyBhZ2VudE1vZGUgfSA6IHt9KSxcbiAgICAgICAgICAgIC4uLihzZWVkQ29udmVyc2F0aW9uSWQgPyB7IGNvbnZlcnNhdGlvbklkOiBzZWVkQ29udmVyc2F0aW9uSWQgfSA6IHt9KSxcbiAgICAgICAgICAgIC4uLihzaWduYWwgPyB7IGNvbnRleHQ6IHNpZ25hbCB9IDoge30pLFxuICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQudHlwZSAhPT0gXCJtZXNzYWdlXCIpIHtcbiAgICAgICAgICAgICAgYXdhaXQgc2FmZVdyaXRlUHJvZ3Jlc3MobG9nZ2VyLCB3cml0ZXIsIHRvb2xDYWxsSWQsIGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGV2ZW50Q29udmVyc2F0aW9uSWQgPSBldmVudC5jb252ZXJzYXRpb25faWQ7XG4gICAgICAgICAgICBpZiAoZXZlbnRDb252ZXJzYXRpb25JZCkge1xuICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCA9IGV2ZW50Q29udmVyc2F0aW9uSWQ7XG4gICAgICAgICAgICAgIGlmIChvd25zUmV1c2FibGVDb252ZXJzYXRpb24pIHN0YXRlLmNvbnZlcnNhdGlvbklkID0gZXZlbnRDb252ZXJzYXRpb25JZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChldmVudC50eXBlID09PSBcInJlc3VsdFwiKSB7XG4gICAgICAgICAgICAgIGZpbmFsTWVzc2FnZSA9IGV2ZW50Lm1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghZmluYWxNZXNzYWdlKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGVjdXRpb25FcnJvci5taXNzaW5nRGF0YShcIkdlbmllIHJlc3VsdCBldmVudFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZpbmFsTWVzc2FnZTtcbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgZmluYWxNZXNzYWdlOiBHZW5pZU1lc3NhZ2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZmluYWxNZXNzYWdlID0gYXdhaXQgcnVuVHVybigpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAvLyBBIHJlamVjdGVkIGNvbnZlcnNhdGlvbiBpZCBpcyBzdGFsZSBvciBpbmFjY2Vzc2libGUuIFJlc2V0IHRoaXNcbiAgICAgICAgICAvLyBsYW5lIGFuZCByZXRyeSBvbmNlIHdpdGggYSBmcmVzaCBHZW5pZSBjb252ZXJzYXRpb24uXG4gICAgICAgICAgY29uc3QgcmVqZWN0ZWRDb252ZXJzYXRpb25JZCA9IGNvbnZlcnNhdGlvbklkO1xuICAgICAgICAgIGlmIChyZWplY3RlZENvbnZlcnNhdGlvbklkICYmIGVycm9yVXRpbHMuZXJyb3JDb250ZXh0KGVycikubm90QWNjZXNzaWJsZSkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJjb252ZXJzYXRpb24tY2FjaGU6c3RhbGUsIHJlc2V0dGluZ1wiLCB7XG4gICAgICAgICAgICAgIHNwYWNlSWQsXG4gICAgICAgICAgICAgIGNvbnZlcnNhdGlvbklkOiByZWplY3RlZENvbnZlcnNhdGlvbklkLFxuICAgICAgICAgICAgICBlcnJvcjogZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKG93bnNSZXVzYWJsZUNvbnZlcnNhdGlvbikge1xuICAgICAgICAgICAgICBhd2FpdCBldmljdENhY2hlZENvbnZlcnNhdGlvbklkKGNhY2hlS2V5KTtcbiAgICAgICAgICAgICAgc3RhdGUuY29udmVyc2F0aW9uSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb252ZXJzYXRpb25JZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGZpbmFsTWVzc2FnZSA9IGF3YWl0IHJ1blR1cm4oKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvd25zUmV1c2FibGVDb252ZXJzYXRpb24pIHtcbiAgICAgICAgICBhd2FpdCBzYXZlQ2FjaGVkQ29udmVyc2F0aW9uSWQoY2FjaGVLZXksIGNvbnZlcnNhdGlvbklkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IG1lc3NhZ2U6IHN0cmlwU3VnZ2VzdGVkUXVlc3Rpb25zKGZpbmFsTWVzc2FnZSkgfTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChvd25zUmV1c2FibGVDb252ZXJzYXRpb24pIHN0YXRlLnJldXNhYmxlQ29udmVyc2F0aW9uSW5GbGlnaHQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRTcGFjZURlc2NyaXB0aW9uVG9vbChvcHRzOiB7IHNwYWNlSWQ6IHN0cmluZzsgYWxpYXM6IHN0cmluZyB9KSB7XG4gIGNvbnN0IHsgc3BhY2VJZCwgYWxpYXMgfSA9IG9wdHM7XG4gIGNvbnN0IHRvb2xJZCA9IGBnZXRfc3BhY2VfZGVzY3JpcHRpb24ke2FsaWFzU3VmZml4KGFsaWFzKX1gO1xuICByZXR1cm4gY3JlYXRlVG9vbCh7XG4gICAgaWQ6IHRvb2xJZCxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gICAgICBSZXR1cm4gdGhlIEdlbmllIHNwYWNlIFwiJHthbGlhc31cIidzIHRpdGxlLCBkZXNjcmlwdGlvbiwgYW5kXG4gICAgICB3YXJlaG91c2UgaWQuIENoZWFwIChzaW5nbGUgUkVTVCBjYWxsLCBubyBMTE0gcm91bmQtdHJpcCkuXG4gICAgICBDYWxsIHRoaXMgRklSU1Qgb24gYW55IHVzZXIgdHVybiB0aGF0J3MgZ29pbmcgdG8gdG91Y2hcbiAgICAgIFxcYGFza19nZW5pZVxcYCwgdW5sZXNzIHRoZSBzYW1lIGRlc2NyaXB0aW9uIGFscmVhZHkgbGFuZGVkXG4gICAgICBlYXJsaWVyIGluIHRoaXMgY29udmVyc2F0aW9uIC0gdGhlIHRpdGxlICsgZGVzY3JpcHRpb24gdGVsbFxuICAgICAgeW91IHdoYXQgdGFibGVzLCBtZXRyaWNzLCBhbmQgdGltZSB3aW5kb3dzIHRoZSBzcGFjZVxuICAgICAgYWN0dWFsbHkgY292ZXJzLCB3aGljaCBpcyB3aGF0IGxldHMgeW91IGRlY29tcG9zZSB0aGVcbiAgICAgIHVzZXIncyBxdWVzdGlvbiBpbnRvIHRoZSByaWdodCBcXGBhc2tfZ2VuaWVcXGAgc3ViLXF1ZXN0aW9ucy5cbiAgICBgKSxcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe30pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgc3BhY2VJZDogei5zdHJpbmcoKSxcbiAgICAgIHRpdGxlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBkZXNjcmlwdGlvbjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgd2FyZWhvdXNlSWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgICBleGVjdXRlOiBhc3luYyAoX2lucHV0LCBjdHhSYXcpID0+IHtcbiAgICAgIGNvbnN0IGN0eCA9IGN0eFJhdyBhcyBUb29sRXhlY3V0ZUN0eDtcbiAgICAgIGNvbnN0IHsgY2xpZW50IH0gPSByZXF1aXJlQ2xpZW50KGN0eCwgdG9vbElkKTtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IGN0eD8uYWJvcnRTaWduYWw7XG4gICAgICAvLyBSb3V0ZSB0aHJvdWdoIHRoZSBwYWNrYWdlJ3MgY2VudHJhbCBHZW5pZSBzcGFjZSBmZXRjaC4gVGhlXG4gICAgICAvLyBkZXNjcmlwdGlvbiBzdXJmYWNlICh0aXRsZSAvIGRlc2NyaXB0aW9uIC8gd2FyZWhvdXNlIGlkKSBsaXZlc1xuICAgICAgLy8gb24gdGhlIGRpcmVjdG9yeS1saXN0aW5nIHNoYXBlLCBzbyBza2lwIHRoZSBsYXJnZXJcbiAgICAgIC8vIGBzZXJpYWxpemVkX3NwYWNlYCBwYXlsb2FkIGhlcmUuXG4gICAgICBjb25zdCBzcGFjZSA9IGF3YWl0IGdlbmllU3BhY2UuZ2V0R2VuaWVTcGFjZShzcGFjZUlkLCB7XG4gICAgICAgIHdvcmtzcGFjZUNsaWVudDogY2xpZW50LFxuICAgICAgICBzZXJpYWxpemVkOiBmYWxzZSxcbiAgICAgICAgLi4uKHNpZ25hbCA/IHsgY29udGV4dDogc2lnbmFsIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNwYWNlSWQsXG4gICAgICAgIC4uLihzcGFjZS50aXRsZSA/IHsgdGl0bGU6IHNwYWNlLnRpdGxlIH0gOiB7fSksXG4gICAgICAgIC4uLihzcGFjZS5kZXNjcmlwdGlvbiA/IHsgZGVzY3JpcHRpb246IHNwYWNlLmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAgIC4uLihzcGFjZS53YXJlaG91c2VfaWQgPyB7IHdhcmVob3VzZUlkOiBzcGFjZS53YXJlaG91c2VfaWQgfSA6IHt9KSxcbiAgICAgIH07XG4gICAgfSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU3BhY2VTZXJpYWxpemVkVG9vbChvcHRzOiB7IHNwYWNlSWQ6IHN0cmluZzsgYWxpYXM6IHN0cmluZyB9KSB7XG4gIGNvbnN0IHsgc3BhY2VJZCwgYWxpYXMgfSA9IG9wdHM7XG4gIGNvbnN0IHRvb2xJZCA9IGBnZXRfc3BhY2Vfc2VyaWFsaXplZCR7YWxpYXNTdWZmaXgoYWxpYXMpfWA7XG4gIHJldHVybiBjcmVhdGVUb29sKHtcbiAgICBpZDogdG9vbElkLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdVdGlscy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgIFJldHVybiB0aGUgZnVsbCBcXGBHZW5pZVNwYWNlXFxgIEpTT04gZm9yIHRoZSBcIiR7YWxpYXN9XCIgc3BhY2UuXG4gICAgICBVc2Ugb25seSB3aGVuIHlvdSBuZWVkIGV4YWN0IGNvbHVtbiAvIHRhYmxlIGlkZW50aWZpZXJzXG4gICAgICBcXGBnZXRfc3BhY2VfZGVzY3JpcHRpb25cXGAgZG9lc24ndCBleHBvc2UuIExhcmdlciBwYXlsb2FkLCBzb1xuICAgICAgcHJlZmVyIHRoZSBkZXNjcmlwdGlvbiB0b29sIHdoZW4gaXQncyBlbm91Z2guXG4gICAgYCksXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHt9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHsgc3BhY2U6IHoudW5rbm93bigpIH0pLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChfaW5wdXQsIGN0eFJhdykgPT4ge1xuICAgICAgY29uc3QgY3R4ID0gY3R4UmF3IGFzIFRvb2xFeGVjdXRlQ3R4O1xuICAgICAgY29uc3QgeyBjbGllbnQgfSA9IHJlcXVpcmVDbGllbnQoY3R4LCB0b29sSWQpO1xuICAgICAgY29uc3Qgc2lnbmFsID0gY3R4Py5hYm9ydFNpZ25hbDtcbiAgICAgIC8vIENlbnRyYWwgR2VuaWUgc3BhY2UgZmV0Y2ggd2l0aCB0aGUgb3B0LWluIGBzZXJpYWxpemVkX3NwYWNlYFxuICAgICAgLy8gYmxvYiAoY2F0YWxvZ3MsIHRhYmxlcywgc2FtcGxlIHF1ZXN0aW9ucywgcHJvbXB0cykgdGhhdCB0aGVcbiAgICAgIC8vIHR5cGVkIFNESyBgZ2V0U3BhY2VgIG9taXRzIC0gdGhlIHdob2xlIHBvaW50IG9mIHRoaXMgdG9vbC5cbiAgICAgIGNvbnN0IHNwYWNlID0gYXdhaXQgZ2VuaWVTcGFjZS5nZXRHZW5pZVNwYWNlKHNwYWNlSWQsIHtcbiAgICAgICAgd29ya3NwYWNlQ2xpZW50OiBjbGllbnQsXG4gICAgICAgIC4uLihzaWduYWwgPyB7IGNvbnRleHQ6IHNpZ25hbCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4geyBzcGFjZSB9O1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc2hhcmVkIHRvb2xzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIERlZmF1bHQgcm93IGNhcCBmb3Ige0BsaW5rIGJ1aWxkR2V0U3RhdGVtZW50VG9vbH0gd2hlbiB0aGUgYWdlbnRcbiAqIGRvZXNuJ3Qgc3VwcGx5IGEgYGxpbWl0YC4gU2l6ZWQgdG8ga2VlcCByZXN1bHQgc2V0cyBvdXQgb2YgdGhlXG4gKiBtb2RlbCBjb250ZXh0IHVubGVzcyB0aGUgYWdlbnQgZXhwbGljaXRseSBvcHRzIGludG8gbW9yZSByb3dzIC1cbiAqIHRoZSBjaGVhcCBzaGFwZSAoY29sdW1uIG5hbWVzICsgYSBoYW5kZnVsIG9mIHJlcHJlc2VudGF0aXZlXG4gKiByb3dzKSBpcyB1c3VhbGx5IGVub3VnaCB0byByZWFzb24gYWJvdXQgYSBxdWVyeS5cbiAqL1xuY29uc3QgREVGQVVMVF9TVEFURU1FTlRfTElNSVQgPSA1MDtcblxuZnVuY3Rpb24gYnVpbGRHZXRTdGF0ZW1lbnRUb29sKCkge1xuICBjb25zdCB0b29sSWQgPSBcImdldF9zdGF0ZW1lbnRcIjtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkOiB0b29sSWQsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oYFxuICAgICAgRmV0Y2ggdGhlIHJvd3Mgb2YgYSBHZW5pZSBzdGF0ZW1lbnQgYnkgaXRzIFxcYHN0YXRlbWVudF9pZFxcYCAodGhlXG4gICAgICB2YWx1ZSBhdCBcXGBtZXNzYWdlLnF1ZXJ5X3Jlc3VsdC5zdGF0ZW1lbnRfaWRcXGAgb3JcbiAgICAgIFxcYG1lc3NhZ2UuYXR0YWNobWVudHNbKl0ucXVlcnkuc3RhdGVtZW50X2lkXFxgIHJldHVybmVkIGZyb21cbiAgICAgIFxcYGFza19nZW5pZVxcYCkuIFVzZSB0aGlzIE9OTFkgd2hlbiB5b3UgbmVlZCB0byByZWFkIHRoZSB1bmRlcmx5aW5nXG4gICAgICB2YWx1ZXMgdG8gcmVhc29uIGFib3V0IHRoZW0gaW4geW91ciByZXBseSAtIGUuZy4gbmFtaW5nIHRoZVxuICAgICAgbGFyZ2VzdCByb3csIGNvbXB1dGluZyBhIGRlbHRhIHRoZSB2aXN1YWxpemF0aW9uIHdvdWxkbid0IGFscmVhZHlcbiAgICAgIGNvbnZleSwgb3IgZmlsdGVyaW5nIGRvd24gdG8gYSBzcGVjaWZpYyByZWNvcmQuIElmIHlvdSdkIGp1c3QgYmVcbiAgICAgIHJlY2l0aW5nIG51bWJlcnMgdGhlIHVzZXIgd2lsbCBzZWUgYW55d2F5LCBza2lwIHRoZSBjYWxsIGFuZFxuICAgICAgZW1iZWQgYSBcXGBbZGF0YTo8c3RhdGVtZW50X2lkPl1cXGAgbWFya2VyIGluIHlvdXIgcHJvc2UgaW5zdGVhZDtcbiAgICAgIHRoZSBob3N0IFVJIGZldGNoZXMgYW5kIHJlbmRlcnMgdGhlIHJvd3Mgb24gaXRzIG93bi4gXFxgbGltaXRcXGBcbiAgICAgIGNhcHMgdGhlIG51bWJlciBvZiByb3dzIHJldHVybmVkIChkZWZhdWx0cyB0b1xuICAgICAgJHtERUZBVUxUX1NUQVRFTUVOVF9MSU1JVH0pLiBcXGByb3dDb3VudFxcYCByZWZsZWN0cyB0aGUgZnVsbFxuICAgICAgdXBzdHJlYW0gdG90YWwgLSBjb21wYXJlIHRvIFxcYHJvd3MubGVuZ3RoXFxgIHRvIGRldGVjdCB0cnVuY2F0aW9uLlxuICAgIGApLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBzdGF0ZW1lbnRfaWQ6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5taW4oMSwgXCJzdGF0ZW1lbnRfaWQgaXMgcmVxdWlyZWRcIilcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICAgICAgR2VuaWUgXFxgc3RhdGVtZW50X2lkXFxgIHdob3NlIHJvd3MgdG8gcmVhZC4gVGFrZSBpdCBmcm9tXG4gICAgICAgICAgICBcXGBtZXNzYWdlLnF1ZXJ5X3Jlc3VsdC5zdGF0ZW1lbnRfaWRcXGAgb3JcbiAgICAgICAgICAgIFxcYG1lc3NhZ2UuYXR0YWNobWVudHNbKl0ucXVlcnkuc3RhdGVtZW50X2lkXFxgIG9uIGFuXG4gICAgICAgICAgICBcXGBhc2tfZ2VuaWVcXGAgcmVzdWx0OyBpdCBpcyBuZXZlciBhIHZhbHVlIHlvdSBjb25zdHJ1Y3QuXG4gICAgICAgICAgYCksXG4gICAgICAgICksXG4gICAgICBsaW1pdDogelxuICAgICAgICAubnVtYmVyKClcbiAgICAgICAgLmludCgpXG4gICAgICAgIC5ub25uZWdhdGl2ZSgpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIk1heCByb3dzIHRvIHJldHVybi4gRGVmYXVsdHMgdG8gYSBzbWFsbCBzYW1wbGU7IHJhaXNlIG9ubHkgd2hlbiBtb3JlIHJvd3MgYXJlIGdlbnVpbmVseSBuZWVkZWQuXCIsXG4gICAgICAgICksXG4gICAgfSksXG4gICAgb3V0cHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBjb2x1bW5zOiB6LmFycmF5KHouc3RyaW5nKCkpLFxuICAgICAgcm93czogei5hcnJheSh6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkpLFxuICAgICAgcm93Q291bnQ6IHoubnVtYmVyKCksXG4gICAgICB0cnVuY2F0ZWQ6IHouYm9vbGVhbigpLFxuICAgIH0pLFxuICAgIGV4ZWN1dGU6IGFzeW5jICh7IHN0YXRlbWVudF9pZCwgbGltaXQgfSwgY3R4UmF3KSA9PiB7XG4gICAgICBjb25zdCBjdHggPSBjdHhSYXcgYXMgVG9vbEV4ZWN1dGVDdHg7XG4gICAgICBjb25zdCB7IGNsaWVudCB9ID0gcmVxdWlyZUNsaWVudChjdHgsIHRvb2xJZCk7XG4gICAgICBjb25zdCBzaWduYWwgPSBjdHg/LmFib3J0U2lnbmFsO1xuICAgICAgY29uc3QgZWZmZWN0aXZlTGltaXQgPSBsaW1pdCA/PyBERUZBVUxUX1NUQVRFTUVOVF9MSU1JVDtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBmZXRjaFN0YXRlbWVudERhdGEoY2xpZW50LCBzdGF0ZW1lbnRfaWQsIHtcbiAgICAgICAgbGltaXQ6IGVmZmVjdGl2ZUxpbWl0LFxuICAgICAgICAuLi4oc2lnbmFsID8geyBzaWduYWwgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29sdW1uczogZGF0YS5jb2x1bW5zLFxuICAgICAgICByb3dzOiBkYXRhLnJvd3MsXG4gICAgICAgIHJvd0NvdW50OiBkYXRhLnJvd0NvdW50LFxuICAgICAgICB0cnVuY2F0ZWQ6IGRhdGEucm93cy5sZW5ndGggPCBkYXRhLnJvd0NvdW50LFxuICAgICAgfTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBgcHJlcGFyZV9jaGFydGAgTWFzdHJhIHRvb2wuIFRoaW4gd3JhcHBlciBvdmVyXG4gKiB7QGxpbmsgcHJlcGFyZUNoYXJ0fSB0aGF0IHJlc29sdmVzIHRoZSBkYXRhc2V0IGJ5IGZldGNoaW5nIHRoZVxuICogR2VuaWUgc3RhdGVtZW50J3Mgcm93cyBvbiBkZW1hbmQuIFRoZSB0b29sIG1pbnRzIGEgYGNoYXJ0SWRgXG4gKiBzeW5jaHJvbm91c2x5LCBjYWNoZXMgYW4gZW1wdHkgcGxhY2Vob2xkZXIsIGFuZCBraWNrcyBvZmYgdGhlXG4gKiBwbGFubmVyIGluIHRoZSBiYWNrZ3JvdW5kIHNvIHRoZSBhZ2VudCBsb29wIG5ldmVyIGJsb2Nrcy4gVGhlIHJlc3VsdCBjYXJyaWVzXG4gKiB0aGUgY29tcGxldGUgbWFya2VyIHRvIGNvcHk7IHRoZSBob3N0IFVJIHJlc29sdmVzIGl0IGJ5IHJlYWRpbmcgdGhlIGNhY2hlZFxuICoge0BsaW5rIENoYXJ0fSBlbnRyeSAoMWggVFRMKS5cbiAqXG4gKiBTcGFjZS1hZ25vc3RpYzogYSBHZW5pZSBgc3RhdGVtZW50X2lkYCBpcyB3b3Jrc3BhY2Utc2NvcGVkLCBzb1xuICogb25lIHNoYXJlZCBgcHJlcGFyZV9jaGFydGAgdG9vbCBjb3ZlcnMgZXZlcnkgd2lyZWQgR2VuaWUgc3BhY2UuXG4gKlxuICogQ2FuY2VsbGF0aW9uOiBkZWxpYmVyYXRlbHkgZG9lcyBOT1QgZm9yd2FyZCB0aGUgcGVyLWNhbGxcbiAqIGBhYm9ydFNpZ25hbGAgdG8ge0BsaW5rIHByZXBhcmVDaGFydH0uIFRoZSBwbGFubmVyIHRhc2sgaXNcbiAqIGZpcmUtYW5kLWZvcmdldCBiYWNrZ3JvdW5kIHdvcms7IHRoZSB0b29sJ3Mgb3duIGBleGVjdXRlYFxuICogcmVzb2x2ZXMgdGhlIG1vbWVudCB0aGUgYGNoYXJ0SWRgIGlzIG1pbnRlZCwgc28gdGhlIHBlci1jYWxsXG4gKiBzaWduYWwgYWJvcnRzIHRoZSBzZWNvbmQgdGhlIHRvb2wgcmV0dXJucy4gVGhlIDFoIGNhY2hlIFRUTFxuICogY2FwcyBhYmFuZG9uZWQgZW50cmllcy5cbiAqL1xuZnVuY3Rpb24gYnVpbGRQcmVwYXJlQ2hhcnRUb29sKG9wdHM6IHsgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcgfSkge1xuICBjb25zdCB7IGNvbmZpZyB9ID0gb3B0cztcbiAgY29uc3QgdG9vbElkID0gXCJwcmVwYXJlX2NoYXJ0XCI7XG4gIHJldHVybiBjcmVhdGVUb29sKHtcbiAgICBpZDogdG9vbElkLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdVdGlscy50b0Rlc2NyaXB0aW9uKFtcbiAgICAgIGBcbiAgICAgICAgUXVldWUgYSBjaGFydCBmb3IgdGhlIHJvd3Mgb2YgYSBHZW5pZSBzdGF0ZW1lbnQuIE1pbnRzIGFcbiAgICAgICAgXFxgY2hhcnRJZFxcYCBwbHVzIGl0cyBjb21wbGV0ZSBcXGBtYXJrZXJcXGAgc3luY2hyb25vdXNseSBhbmRcbiAgICAgICAga2lja3Mgb2ZmIGEgQkFDS0dST1VORFxuICAgICAgICB0YXNrIHRoYXQgZmV0Y2hlcyB0aGUgc3RhdGVtZW50J3Mgcm93cywgcnVucyB0aGVcbiAgICAgICAgY2hhcnQtcGxhbm5lciB0byBwaWNrIGEgY2hhcnQgdHlwZSBhbmQgRWNoYXJ0cyBzcGVjLCBhbmRcbiAgICAgICAgY2FjaGVzIHRoZSByZXN1bHQgdW5kZXIgdGhlIFxcYGNoYXJ0SWRcXGAgZm9yIG9uZSBob3VyLiBUaGVcbiAgICAgICAgaG9zdCBVSSBmZXRjaGVzIHRoZSBjYWNoZWQgY2hhcnQgb24gaXRzIG93biBvbmNlIGl0IGxhbmRzLlxuICAgICAgYCxcbiAgICAgIGBcbiAgICAgICAgVG8gZGlzcGxheSB0aGUgY2hhcnQgaW4geW91ciByZXBseSwgY29weSB0aGUgcmV0dXJuZWRcbiAgICAgICAgXFxgbWFya2VyXFxgIFZFUkJBVElNIG9udG8gaXRzIG93biBsaW5lIGF0IHRoZSBwb3NpdGlvbiB5b3VcbiAgICAgICAgd2FudCBpdCB0byBhcHBlYXIuIE5ldmVyIGNvbnN0cnVjdCwgYWx0ZXIsIG9yIGludmVudCBhXG4gICAgICAgIG1hcmtlciBmcm9tIFxcYGNoYXJ0SWRcXGAgKGFuZCBuZXZlciB1c2UgdGhlIFxcYHN0YXRlbWVudF9pZFxcYFxuICAgICAgICBvciBhbnkgdmFyaWF0aW9uIG9mIGl0KSAtIG9ubHkgdGhlIGNvbXBsZXRlIHZhbHVlIHJldHVybmVkXG4gICAgICAgIGJ5IHRoaXMgdG9vbCByZXNvbHZlcyB0byBhIHJlYWwgY2hhcnQuIFRoZSB0b29sIHJldHVybnNcbiAgICAgICAgaW1tZWRpYXRlbHkgLSBkbyBOT1Qgd2FpdCBvciBjYWxsIGl0IGFnYWluIHRvXG4gICAgICAgIFwiY2hlY2sgcHJvZ3Jlc3NcIjsgdGhlIGNoYXJ0IHJlc29sdmVzIGFzeW5jaHJvbm91c2x5IG9uIHRoZVxuICAgICAgICBob3N0IFVJJ3Mgc2lkZS5cbiAgICAgIGAsXG4gICAgICBgXG4gICAgICAgIFVzZSB0aGlzIG9ubHkgd2hlbiB0aGUgZGF0YSBoYXMgYSBzdG9yeSBhIGNoYXJ0IGNvbnZleXNcbiAgICAgICAgYmV0dGVyIHRoYW4gYSB0YWJsZSAodHJlbmRzLCByYW5raW5ncywgZGlzdHJpYnV0aW9ucyxcbiAgICAgICAgcGFydHMtb2YtYS13aG9sZSkuIEZvciByYXcgcm93cywgZW1iZWRcbiAgICAgICAgXFxgW2RhdGE6PHN0YXRlbWVudF9pZD5dXFxgIGluc3RlYWQgYW5kIHNraXAgdGhpcyB0b29sLlxuICAgICAgYCxcbiAgICBdKSxcbiAgICBpbnB1dFNjaGVtYTogcHJlcGFyZUNoYXJ0UmVxdWVzdFNjaGVtYSxcbiAgICBvdXRwdXRTY2hlbWE6IGNoYXJ0VG9vbE91dHB1dFNjaGVtYSxcbiAgICBleGVjdXRlOiBhc3luYyAocmVxdWVzdCwgY3R4UmF3KSA9PiB7XG4gICAgICBjb25zdCBjdHggPSBjdHhSYXcgYXMgVG9vbEV4ZWN1dGVDdHg7XG4gICAgICBjb25zdCB7IGNsaWVudCwgcmVxdWVzdENvbnRleHQgfSA9IHJlcXVpcmVDbGllbnQoY3R4LCB0b29sSWQpO1xuICAgICAgcmV0dXJuIHByZXBhcmVDaGFydCh7XG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgdXNlcktleTogcmVzb2x2ZVVzZXJLZXkocmVxdWVzdENvbnRleHQpLFxuICAgICAgICAuLi4ocmVxdWVzdC50aXRsZSA/IHsgdGl0bGU6IHJlcXVlc3QudGl0bGUgfSA6IHt9KSxcbiAgICAgICAgLi4uKHJlcXVlc3QuZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uOiByZXF1ZXN0LmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAgIHJlc29sdmVEYXRhOiAodGFza1NpZ25hbCkgPT5cbiAgICAgICAgICBmZXRjaFN0YXRlbWVudERhdGEoY2xpZW50LCByZXF1ZXN0LnN0YXRlbWVudF9pZCwge1xuICAgICAgICAgICAgLi4uKHRhc2tTaWduYWwgPyB7IHNpZ25hbDogdGFza1NpZ25hbCB9IDoge30pLFxuICAgICAgICAgIH0pLFxuICAgICAgICAuLi4oY3R4Py5yZXF1ZXN0Q29udGV4dCA/IHsgcmVxdWVzdENvbnRleHQ6IGN0eC5yZXF1ZXN0Q29udGV4dCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBvcmNoZXN0cmF0aW9uIHByb21wdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBTdWdnZXN0ZWQgb3JjaGVzdHJhdGlvbiBwcm9tcHQgZm9yIHRoZSBjZW50cmFsIGFnZW50IHRoYXQgb3duc1xuICogdGhlIEdlbmllIHRvb2xzLiBDb21wb3NlIGludG8geW91ciBhZ2VudCdzIGBpbnN0cnVjdGlvbnNgIHRvXG4gKiBnZXQgdGhlIGNhbm9uaWNhbCBcImRlY29tcG9zZSBxdWVzdGlvbnMsIGFzayBHZW5pZSBmb2N1c2VkXG4gKiBzdWItcXVlc3Rpb25zLCBwbGFjZSBkYXRhIC8gY2hhcnQgbWFya2VycyBpbiBwcm9zZVwiIGJlaGF2aW9yOlxuICpcbiAqIGBgYHRzXG4gKiBjcmVhdGVBZ2VudCh7XG4gKiAgIGluc3RydWN0aW9uczogYCR7bXlBZ2VudEluc3RydWN0aW9uc31cXG5cXG4ke0dFTklFX0lOU1RSVUNUSU9OU31gLFxuICogICBhc3luYyB0b29scyhwbHVnaW5zKSB7XG4gKiAgICAgcmV0dXJuIHsgLi4uKGF3YWl0IHBsdWdpbnMuZ2VuaWU/LnRvb2xraXQoKSkgfTtcbiAqICAgfSxcbiAqIH0pO1xuICogYGBgXG4gKlxuICogVGhlIHByb21wdCByZWZlcmVuY2VzIHRoZSBiYXJlIHRvb2wgbmFtZXMgKGBhc2tfZ2VuaWVgLFxuICogYGdldF9zcGFjZV9kZXNjcmlwdGlvbmAsIGBnZXRfc3BhY2Vfc2VyaWFsaXplZGAsXG4gKiBgZ2V0X3N0YXRlbWVudGAsIGBwcmVwYXJlX2NoYXJ0YCkgdXNlZCBmb3IgdGhlIHNpbmdsZS1zcGFjZVxuICogZGVmYXVsdCBhbGlhcy4gTXVsdGktc3BhY2UgZGVwbG95bWVudHMgc2hvdWxkIHdyaXRlIHRoZWlyIG93blxuICogdmFyaWFudCB0aGF0IG5hbWVzIHRoZSBzdWZmaXhlZCBwZXItc3BhY2UgdG9vbHNcbiAqIChlLmcuIGBhc2tfZ2VuaWVfc2FsZXNgKS5cbiAqL1xuZXhwb3J0IGNvbnN0IEdFTklFX0lOU1RSVUNUSU9OUyA9IHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oW1xuICBcIkdlbmllIG9yY2hlc3RyYXRpb24uIEZvciBldmVyeSB1c2VyIHF1ZXN0aW9uIHRoYXQgbmVlZHMgU1FMLWJhY2tlZCBkYXRhOlwiLFxuICB7XG4gICAgbnVtYmVyZWQ6IFtcbiAgICAgIGBcbiAgICAgICAgU3RhcnQgYnkgY2FsbGluZyBcXGBnZXRfc3BhY2VfZGVzY3JpcHRpb25cXGAgdG8gZ3JvdW5kIHlvdXJzZWxmXG4gICAgICAgIGluIHdoYXQgdGhlIHNwYWNlIGNvdmVycyAodGFibGVzLCBtZXRyaWNzLCB0aW1lIHdpbmRvd3MpLFxuICAgICAgICB1bmxlc3MgeW91IGFscmVhZHkgc2F3IHRoZSBzYW1lIGRlc2NyaXB0aW9uIGVhcmxpZXIgaW4gdGhpc1xuICAgICAgICBjb252ZXJzYXRpb24uIFJlYWNoIGZvciBcXGBnZXRfc3BhY2Vfc2VyaWFsaXplZFxcYCBvbmx5IHdoZW4geW91XG4gICAgICAgIG5lZWQgZXhhY3QgY29sdW1uIC8gdGFibGUgaWRlbnRpZmllcnMgdGhlIGRlc2NyaXB0aW9uIGRvZXNuJ3RcbiAgICAgICAgZXhwb3NlIC0gaXQncyBhIG11Y2ggbGFyZ2VyIHBheWxvYWQuXG4gICAgICBgLFxuICAgICAgYFxuICAgICAgICBEZWNvbXBvc2UgdGhlIHVzZXIncyBxdWVzdGlvbiBpbnRvIGZvY3VzZWQgc3ViLXF1ZXN0aW9uc1xuICAgICAgICBCRUZPUkUgYXNraW5nIEdlbmllIGFueXRoaW5nLiBPbmUgc3ViLXF1ZXN0aW9uIHBlciBkaXN0aW5jdFxuICAgICAgICBtZXRyaWMsIGRpbWVuc2lvbiwgb3IgdGltZSB3aW5kb3cuIFRoZW4gY2FsbCBcXGBhc2tfZ2VuaWVcXGBcbiAgICAgICAgb25jZSBwZXIgc3ViLXF1ZXN0aW9uIC0gdXN1YWxseSB0d28gdG8gc2l4IGNhbGxzIHBlciB0dXJuLlxuICAgICAgICBJc3N1ZSBpbmRlcGVuZGVudCBjYWxscyBpbiBwYXJhbGxlbCB0byByZWR1Y2UgbGF0ZW5jeS4gS2VlcFxuICAgICAgICBkZXBlbmRlbnQgY2FsbHMgc2VxdWVudGlhbCB3aGVuIGFuIGVhcmxpZXIgYW5zd2VyIGRldGVybWluZXNcbiAgICAgICAgdGhlIG5leHQgcXVlc3Rpb24uIFBhcmFsbGVsIGNhbGxzIHVzZSBpc29sYXRlZCBHZW5pZVxuICAgICAgICBjb252ZXJzYXRpb25zOyBzZXF1ZW50aWFsIGNhbGxzIHJldGFpbiBjb252ZXJzYXRpb24gY29udGV4dC5cbiAgICAgICAgQ3JhbW1pbmcgYSBtdWx0aS1wYXJ0IHF1ZXN0aW9uIGludG8gb25lIFxcYGFza19nZW5pZVxcYCBjYWxsXG4gICAgICAgIGFsbW9zdCBhbHdheXMgcHJvZHVjZXMgYSB3b3JzZSBhbnN3ZXIgdGhhbiBhc2tpbmcgdGhlIHBpZWNlc1xuICAgICAgICBzZXBhcmF0ZWx5LiBPbmx5IGNvbGxhcHNlIHRvIGEgc2luZ2xlIGNhbGwgd2hlbiB0aGUgcXVlc3Rpb25cbiAgICAgICAgaXMgZ2VudWluZWx5IGF0b21pYyAoXCJ3aGF0IHdhcyBRMyByZXZlbnVlP1wiKS5cblxuICAgICAgICBXb3JrZWQgZXhhbXBsZTogdXNlciBhc2tzIFwiSG93IGRpZCBTS1UgMTIzNCdzIHJldmVudWVcbiAgICAgICAgY29tcGFyZSB0byBpdHMgY2F0ZWdvcnkgYXZlcmFnZSBsYXN0IHF1YXJ0ZXIsIGFuZCB3aGljaFxuICAgICAgICByZWdpb25zIGRyb3ZlIHRoZSBnYXA/XCIgRGVjb21wb3NlcyB0bzogKGEpIFxcYGFza19nZW5pZVxcYFxuICAgICAgICBmb3IgU0tVIDEyMzQncyBRMyByZXZlbnVlLCAoYikgXFxgYXNrX2dlbmllXFxgIGZvciB0aGVcbiAgICAgICAgY2F0ZWdvcnktYXZlcmFnZSBRMyByZXZlbnVlLCAoYykgXFxgYXNrX2dlbmllXFxgIGZvciBTS1VcbiAgICAgICAgMTIzNCdzIFEzIHJldmVudWUgc3BsaXQgYnkgcmVnaW9uLiBUaGUgZmlyc3QgdHdvIGNhbGxzIGFyZVxuICAgICAgICBpbmRlcGVuZGVudCBhbmQgY2FuIHJ1biBpbiBwYXJhbGxlbDsgcnVuIHRoZSByZWdpb25hbCBjYWxsXG4gICAgICAgIGFmdGVyd2FyZCBvbmx5IGlmIGl0cyB3b3JkaW5nIGRlcGVuZHMgb24gdGhvc2UgcmVzdWx0cy5cbiAgICAgIGAsXG4gICAgICBgXG4gICAgICAgIEVhY2ggXFxgYXNrX2dlbmllXFxgIGNhbGwgcmV0dXJucyB0aGUgdGVybWluYWwgXFxgR2VuaWVNZXNzYWdlXFxgLlxuICAgICAgICBSZWFkIEFnZW50IE1vZGUncyBzeW50aGVzaXplZCBhbnN3ZXIgYW5kIE1hcmtkb3duIHF1ZXJ5IG91dHB1dFxuICAgICAgICBkaXJlY3RseSBmcm9tIGl0cyB0ZXh0IGF0dGFjaG1lbnRzLiBBZ2VudCBNb2RlIGRvZXMgTk9UIGV4cG9zZSBhXG4gICAgICAgIFxcYHN0YXRlbWVudF9pZFxcYC4gVG8gY2hhcnQgaXRzIHJlc3VsdCwgY2FsbCBcXGByZW5kZXJfZGF0YVxcYCB3aXRoXG4gICAgICAgIHJvd3MgY29waWVkIGZyb20gdGhlIE1hcmtkb3duIHRhYmxlIG9yIHN0cnVjdHVyZWQgdGFibGUgbWV0YWRhdGEsXG4gICAgICAgIHRoZW4gY29weSB0aGUgcmV0dXJuZWQgbWFya2VyLiBOZXZlciBwYXNzIGFuIEFnZW50IE1vZGUgcmVzcG9uc2UgaWQsXG4gICAgICAgIGNvbnZlcnNhdGlvbiBpZCwgZnVuY3Rpb24tY2FsbCBpZCwgb3IgYW55IG90aGVyIGlkZW50aWZpZXIgdG9cbiAgICAgICAgXFxgcHJlcGFyZV9jaGFydFxcYC5cblxuICAgICAgICBBIGxlZ2FjeSBwb2xsaW5nIHJlc3VsdCBtYXkgaW5zdGVhZCBleHBvc2UgYSBcXGBzdGF0ZW1lbnRfaWRcXGAgYXRcbiAgICAgICAgXFxgbWVzc2FnZS5xdWVyeV9yZXN1bHQuc3RhdGVtZW50X2lkXFxgIChvciB0aGUgZmlyc3RcbiAgICAgICAgYXR0YWNobWVudCdzIFxcYHF1ZXJ5LnN0YXRlbWVudF9pZFxcYCkuIE9ubHkgdGhhdCByZWFsIHN0YXRlbWVudCBpZFxuICAgICAgICBiZWxvbmdzIGluIFxcYHByZXBhcmVfY2hhcnRcXGAgb3IgYSBcXGBbZGF0YTo8c3RhdGVtZW50X2lkPl1cXGAgbWFya2VyLlxuICAgICAgYCxcbiAgICAgIFtcbiAgICAgICAgYFxuICAgICAgICAgIFRvIERJU1BMQVkgYSByZXN1bHQgc2V0IGluIHlvdXIgcmVwbHksIGVtYmVkIGEgbWFya2VyIG9uIGl0c1xuICAgICAgICAgIG93biBsaW5lIHdoZXJlIHRoZSB2aXN1YWxpemF0aW9uIHNob3VsZCBhcHBlYXIuIFR3byBtYXJrZXJcbiAgICAgICAgICBzaGFwZXM6XG4gICAgICAgIGAsXG4gICAgICAgIHtcbiAgICAgICAgICBidWxsZXRzOiBbXG4gICAgICAgICAgICBgXG4gICAgICAgICAgICAgIFxcYFtkYXRhOjxzdGF0ZW1lbnRfaWQ+XVxcYCAtIHJlbmRlciBsZWdhY3kgcG9sbGluZyByb3dzIGFzIGEgdGFibGUuXG4gICAgICAgICAgICAgIFVzZSB0aGlzIHdoZW4gdGhlcmUncyBubyBjbGVhciB2aXN1YWwgc3RvcnkgKGxvbmcgbGlzdHMsXG4gICAgICAgICAgICAgIHJlZmVyZW5jZSBkYXRhLCBzaW5nbGUtcm93IHJlc3VsdHMsIG9yIHRoZSB1c2VyIGp1c3RcbiAgICAgICAgICAgICAgd2FudHMgdG8gc2VlIHRoZSBkYXRhKS4gRW1iZWQgdGhlIG1hcmtlciBkaXJlY3RseSB3aGVuXG4gICAgICAgICAgICAgIFxcYGFza19nZW5pZVxcYCByZXR1cm5lZCBhIHJlYWwgXFxgc3RhdGVtZW50X2lkXFxgOyBBZ2VudCBNb2RlXG4gICAgICAgICAgICAgIGFscmVhZHkgY2FycmllcyBpdHMgcXVlcnkgb3V0cHV0IGlubGluZS5cbiAgICAgICAgICAgIGAsXG4gICAgICAgICAgICBgXG4gICAgICAgICAgICAgIFxcYFtjaGFydDo8Y2hhcnRJZD5dXFxgIC0gcmVuZGVyIHRoZSByb3dzIGFzIGEgY2hhcnQuIFRvXG4gICAgICAgICAgICAgIGdldCBvbmUgZnJvbSBBZ2VudCBNb2RlLCBjYWxsIFxcYHJlbmRlcl9kYXRhXFxgIHdpdGggdGhlXG4gICAgICAgICAgICAgIGlubGluZSByb3dzLiBUbyBnZXQgb25lIGZyb20gbGVnYWN5IHBvbGxpbmcsIGNhbGxcbiAgICAgICAgICAgICAgXFxgcHJlcGFyZV9jaGFydFxcYCB3aXRoIHRoZSByZWFsIHN0YXRlbWVudCBpZC4gQm90aCB0b29sc1xuICAgICAgICAgICAgICBhY2NlcHQgYW4gb3B0aW9uYWwgXFxgdGl0bGVcXGAgLyBvbmUtbGluZSBcXGBkZXNjcmlwdGlvblxcYFxuICAgICAgICAgICAgICBvZiB0aGUgaW5zaWdodCB0byBzdXJmYWNlLCByZXR1cm4gdGhlIGNvbXBsZXRlIFxcYG1hcmtlclxcYFxuICAgICAgICAgICAgICBzeW5jaHJvbm91c2x5LCBhbmQgcHJlcGFyZSB0aGUgY2hhcnQgc3BlYyBpbiB0aGVcbiAgICAgICAgICAgICAgYmFja2dyb3VuZC4gQ29weSB0aGF0IG1hcmtlciBWRVJCQVRJTSBvbnRvIGl0cyBvd24gbGluZVxuICAgICAgICAgICAgICB3aGVyZXZlciB0aGUgY2hhcnQgc2hvdWxkIGFwcGVhci4gVXNlIGEgY2hhcnQgd2hlbiB0aGVcbiAgICAgICAgICAgICAgZGF0YSBoYXMgYSBzdG9yeSBhIHZpc3VhbCBjb252ZXlzIGJldHRlciB0aGFuIGEgdGFibGVcbiAgICAgICAgICAgICAgKHRyZW5kcywgcmFua2luZ3MsIGRpc3RyaWJ1dGlvbnMsIHBhcnRzLW9mLWEtd2hvbGUpLlxuXG4gICAgICAgICAgICAgIE5FVkVSIGludmVudCBvciBoYW5kLWJ1aWxkIGEgbWFya2VyLiBBIHZhbGlkIG1hcmtlciBpc1xuICAgICAgICAgICAgICB0aGUgY29tcGxldGUgb3BhcXVlIHN0cmluZyBhIFxcYHJlbmRlcl9kYXRhXFxgIG9yXG4gICAgICAgICAgICAgIFxcYHByZXBhcmVfY2hhcnRcXGAgY2FsbCByZXR1cm5lZCB0byB5b3UgaW4gVEhJUyB0dXJuIC1cbiAgICAgICAgICAgICAgbm90aGluZyBlbHNlLiBJdHMgaWQgaXMgTk9UIGEgXFxgc3RhdGVtZW50X2lkXFxgLCBhbmQgaXQgaXMgTk9UIGFcbiAgICAgICAgICAgICAgXFxgc3RhdGVtZW50X2lkXFxgIHByZWZpeCB3aXRoIGEgbGFiZWwgYXBwZW5kZWQgKGUuZy5cbiAgICAgICAgICAgICAgXFxgMDFmMS4uLi1yZWdpb24tZmlsbFxcYCkuIElmIHlvdSBoYXZlIG5vdCBjYWxsZWRcbiAgICAgICAgICAgICAgb25lIG9mIHRob3NlIGNoYXJ0IHRvb2xzIGFuZCByZWNlaXZlZCBhbiBpZCBiYWNrLCBkbyBub3RcbiAgICAgICAgICAgICAgd3JpdGUgYSBcXGBbY2hhcnQ6Li4uXVxcYCBtYXJrZXIgYXQgYWxsLiBBIGZhYnJpY2F0ZWQgY2hhcnRcbiAgICAgICAgICAgICAgaWQgcmVuZGVycyBub3RoaW5nIGFuZCB3YXN0ZXMgYSByZXF1ZXN0LlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBgXG4gICAgICAgICAgVGhlIGhvc3QgVUkgcmVzb2x2ZXMgYm90aCBtYXJrZXJzIG9uIGl0cyBvd24gb25jZSBpdCBzZWVzXG4gICAgICAgICAgdGhlbSAtIHlvdSBkbyBOT1QgbmVlZCB0byBjYWxsIFxcYGdldF9zdGF0ZW1lbnRcXGAganVzdCB0b1xuICAgICAgICAgIGRpc3BsYXkgZGF0YSwgYW5kIHlvdSBkbyBOT1QgbmVlZCB0byB3YWl0IG9uXG4gICAgICAgICAgXFxgcmVuZGVyX2RhdGFcXGAgb3IgXFxgcHJlcGFyZV9jaGFydFxcYCAodGhleSByZXR1cm4gdGhlIGlkXG4gICAgICAgICAgaW1tZWRpYXRlbHkgYW5kIHRoZSBob3N0IFVJIGZldGNoZXMgdGhlIGNhY2hlZCBjaGFydCBsYXRlcikuXG4gICAgICAgICAgUGljayBhdCBtb3N0IG9uZSBtYXJrZXIgcGVyIHJlc3VsdDsgZG9uJ3QgY2hhcnQgQU5EIHRhYmxlIHRoZVxuICAgICAgICAgIHNhbWUgcmVzdWx0IHNpZGUgYnkgc2lkZS5cbiAgICAgICAgYCxcbiAgICAgIF0sXG4gICAgICBgXG4gICAgICAgIENhbGwgXFxgZ2V0X3N0YXRlbWVudChzdGF0ZW1lbnRfaWQsIGxpbWl0PylcXGAgT05MWSB3aGVuIHlvdSBuZWVkXG4gICAgICAgIHRvIHJlYWQgdGhlIGFjdHVhbCB2YWx1ZXMgdG8gcmVhc29uIGFib3V0IHRoZW0gKGUuZy4gbmFtaW5nIGFcbiAgICAgICAgc3BlY2lmaWMgcm93LCBjb21wdXRpbmcgYSBkZWx0YSB0aGUgdGFibGUgb3IgY2hhcnQgd291bGRuJ3RcbiAgICAgICAgc2hvdywgb3Igc2FuaXR5LWNoZWNraW5nIGEgcmVzdWx0IGJlZm9yZSBpbnRlcnByZXRpbmcgaXQpLiBJZlxuICAgICAgICB5b3UnZCBqdXN0IGJlIHJlY2l0aW5nIG51bWJlcnMgdGhlIHZpc3VhbGl6YXRpb24gYWxyZWFkeSBzaG93cyxcbiAgICAgICAgc2tpcCB0aGUgY2FsbCBhbmQgdXNlIGEgbWFya2VyIGluc3RlYWQuIFxcYGxpbWl0XFxgIGRlZmF1bHRzIHRvIGFcbiAgICAgICAgc21hbGwgc2FtcGxlOyByYWlzZSBpdCBvbmx5IHdoZW4geW91IGdlbnVpbmVseSBuZWVkIG1vcmUgcm93cy5cbiAgICAgIGAsXG4gICAgICBgXG4gICAgICAgIENvbXBvc2UgeW91ciBmaW5hbCByZXBseSBhcyBwbGFpbiBwcm9zZS4gSW50ZXJsZWF2ZSBwYXJhZ3JhcGhzXG4gICAgICAgIHdpdGggXFxgW2RhdGE6Li4uXVxcYCAvIFxcYFtjaGFydDouLi5dXFxgIG1hcmtlcnMgd2hlcmV2ZXIgYSByZXN1bHRcbiAgICAgICAgc2hvdWxkIHJlbmRlci4gRG9uJ3QgZHVtcCBhbGwgbWFya2VycyBhdCB0aGUgZW5kIC0gcGxhY2UgZWFjaFxuICAgICAgICBvbmUgbmV4dCB0byB0aGUgcHJvc2UgdGhhdCBpbnRlcnByZXRzIGl0LiBEb24ndCByZXN0YXRlIGV2ZXJ5XG4gICAgICAgIG51bWJlciB0aGUgdmlzdWFsaXphdGlvbiBhbHJlYWR5IHNob3dzOyBjYWxsIG91dCBkZWx0YXMsXG4gICAgICAgIGFub21hbGllcywgdGFrZWF3YXlzLlxuICAgICAgYCxcbiAgICBdLFxuICB9LFxuXSk7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtdWx0aS1hbGlhcyBzdXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIE5vcm1hbGl6ZSB0aGUge0BsaW5rIEdlbmllU3BhY2VzQ29uZmlnfSByZWNvcmQuIEJhcmUtc3RyaW5nXG4gKiBlbnRyaWVzIChgeyBkZWZhdWx0OiBcIjAxZWYuLi5cIiB9YCkgZ2V0IHdyYXBwZWQgYXNcbiAqIGB7IHNwYWNlSWQ6IFwiMDFlZi4uLlwiIH1gOyBvYmplY3QgZW50cmllcyBwYXNzIHRocm91Z2ggdW5jaGFuZ2VkLlxuICpcbiAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkVycm9yIHdoZW4gYW4gYWxpYXMgaXMgcHJlc2VudCBidXQgY2FycmllcyBubyBzcGFjZSBpZFxuICogICAoYHsgZGVmYXVsdDogcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRCB9YCB3aXRoIHRoZSB2YXJpYWJsZVxuICogICB1bnNldCkuIEFuIGFsaWFzIHRoYXQgcmVzb2x2ZXMgdG8gbm90aGluZyBpcyBhIHdpcmluZyBjb250cmFkaWN0aW9uOiB0aGVcbiAqICAgYWdlbnQgd291bGQgYWR2ZXJ0aXNlIG5vIEdlbmllIHRvb2wgZm9yIGEgc3BhY2UgdGhlIGRlcGxveW1lbnQgYmVsaWV2ZXMgaXRcbiAqICAgY29uZmlndXJlZCwgc28gaXQgZmFpbHMgYXQgY29uc3RydWN0aW9uIGluc3RlYWQgb2YgZ29pbmcgcXVpZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVHZW5pZVNwYWNlcyhcbiAgc3BhY2VzOiBHZW5pZVNwYWNlc0NvbmZpZyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IEdlbmllU3BhY2VDb25maWcgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkLFxuKTogUmVjb3JkPHN0cmluZywgR2VuaWVTcGFjZUNvbmZpZz4ge1xuICBpZiAoIXNwYWNlcykgcmV0dXJuIHt9O1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIEdlbmllU3BhY2VDb25maWc+ID0ge307XG4gIGZvciAoY29uc3QgW2FsaWFzLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc3BhY2VzKSkge1xuICAgIGNvbnN0IHNwYWNlSWQgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHZhbHVlPy5zcGFjZUlkO1xuICAgIGlmICghc3BhY2VJZCkgdGhyb3cgbWlzc2luZ1NwYWNlSWQoYWxpYXMpO1xuICAgIG91dFthbGlhc10gPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB7IHNwYWNlSWQgfSA6IHZhbHVlITtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKiogQ29uZmlnIGNvbnRyYWRpY3Rpb246IGFuIGFsaWFzIHByZXNlbnQgaW4gYGdlbmllU3BhY2VzYCB3aXRoIG5vIHNwYWNlIGlkLiAqL1xuZnVuY3Rpb24gbWlzc2luZ1NwYWNlSWQoYWxpYXM6IHN0cmluZyk6IENvbmZpZ3VyYXRpb25FcnJvciB7XG4gIGNvbnN0IGVudkhpbnQgPVxuICAgIGFsaWFzID09PSBERUZBVUxUX0dFTklFX0FMSUFTXG4gICAgICA/IFwiU2V0IERBVEFCUklDS1NfR0VOSUVfU1BBQ0VfSUQsIHBhc3MgdGhlIHNwYWNlIGlkIGlubGluZSwgb3IgZHJvcCB0aGUgYWxpYXMuXCJcbiAgICAgIDogYFBhc3MgdGhlIHNwYWNlIGlkIGlubGluZSAoREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRCBvbmx5IGJhY2tzIHRoZSBcIiR7REVGQVVMVF9HRU5JRV9BTElBU31cIiBhbGlhcykgb3IgZHJvcCB0aGUgYWxpYXMuYDtcbiAgcmV0dXJuIENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKGBnZW5pZVNwYWNlcy4ke2FsaWFzfSBzcGFjZSBpZGAsIGVudkhpbnQpO1xufVxuXG4vKipcbiAqIEFwcEtpdCBgZ2VuaWVgIHBsdWdpbidzIGNvbmZpZyBzaGFwZSwgZGVyaXZlZCBmcm9tIHRoZSBmYWN0b3J5XG4gKiBpdHNlbGYgc28gaXQgc3RheXMgaW4gbG9jay1zdGVwIHdpdGggdGhlIHVwc3RyZWFtIHR5cGUgd2l0aG91dFxuICogZGVlcC1pbXBvcnRpbmcgYElHZW5pZUNvbmZpZ2AgKHdoaWNoIHRoZSBwYWNrYWdlJ3MgdG9wLWxldmVsXG4gKiBiYXJyZWwgZG9lc24ndCBzdXJmYWNlKS4gVGhlIHBsdWdpbidzIGBjb25maWdgIGZpZWxkIGlzXG4gKiBgcHJvdGVjdGVkYCBpbiBUUyBvbmx5OyB0aGUgcnVudGltZSBsYXlvdXQgaXMgcGxhaW4gb2JqZWN0XG4gKiBwcm9wZXJ0eSBhY2Nlc3MsIHNvIHJlYWRpbmcgb2ZmIHRoZSBpbnN0YW5jZSB3aXRoIGEgc3RydWN0dXJhbFxuICogY2FzdCBpcyBzYWZlLlxuICovXG50eXBlIEFwcEtpdEdlbmllQ29uZmlnID0gTm9uTnVsbGFibGU8UGFyYW1ldGVyczx0eXBlb2YgZ2VuaWU+WzBdPjtcblxuLyoqXG4gKiBEaXNjb3ZlciBHZW5pZSBzcGFjZSBhbGlhc2VzIGZyb20gZXZlcnkgc3VwcG9ydGVkIHNvdXJjZSBhbmRcbiAqIG1lcmdlIHRoZW0gaW50byBhIHNpbmdsZSByZWNvcmQuIFByZWNlZGVuY2UgKGhpZ2hlc3QgZmlyc3QpOlxuICpcbiAqICAgMS4ge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5nZW5pZVNwYWNlc30gb24gdGhlIGBtYXN0cmEoLi4uKWBcbiAqICAgICAgY2FsbC4gRXhwbGljaXQgTWFzdHJhIHdpcmluZyBhbHdheXMgd2lucyBzbyB1c2VycyBjYW5cbiAqICAgICAgb3ZlcnJpZGUgQXBwS2l0J3MgZGVmYXVsdHMgcGVyLWFnZW50LlxuICogICAyLiBBcHBLaXQgYGdlbmllKHsgc3BhY2VzOiB7IC4uLiB9IH0pYCBwbHVnaW4gaW5zdGFuY2UuIExldHNcbiAqICAgICAgdXNlcnMga2VlcCB1c2luZyB0aGUgZXhpc3RpbmcgQXBwS2l0IGNvbmZpZyBmb3JtYXRcbiAqICAgICAgKGBnZW5pZSh7IHNwYWNlczogeyBzYWxlczogXCIuLi5cIiwgb3BzOiBcIi4uLlwiIH0gfSlgKVxuICogICAgICB3aXRob3V0IHJlc3RhdGluZyB0aGUgc2FtZSByZWNvcmQgb24gdGhlIE1hc3RyYSBwbHVnaW4uXG4gKiAgICAgIFJlYWQgb2ZmIHRoZSBsaXZlIHBsdWdpbiBpbnN0YW5jZSB2aWEgYSBzdHJ1Y3R1cmFsIGNhc3RcbiAqICAgICAgc2luY2UgYFBsdWdpbi5jb25maWdgIGlzIFRTLXByb3RlY3RlZCAobm90IHJ1bnRpbWUtcHJpdmF0ZSkuXG4gKiAgIDMuIGBEQVRBQlJJQ0tTX0dFTklFX1NQQUNFX0lEYCBlbnYgdmFyIChyZWdpc3RlcmVkIHVuZGVyIHRoZVxuICogICAgICB3ZWxsLWtub3duIGBkZWZhdWx0YCBhbGlhcykuIE1hdGNoZXMgdGhlIEFwcEtpdCBgZ2VuaWUoKWBcbiAqICAgICAgcGx1Z2luJ3MgZmFsbGJhY2sgYmVoYXZpb3Igc28gYSBiYXJlIGBtYXN0cmEoKWAgKyBgZ2VuaWUoKWBcbiAqICAgICAgcGFpciBqdXN0IHdvcmtzLlxuICpcbiAqIEFsaWFzZXMgY29sbGlkZSBjbGVhbmx5OiBhIGhpZ2hlci1wcmVjZWRlbmNlIHNvdXJjZSdzIHZhbHVlXG4gKiByZXBsYWNlcyBhIGxvd2VyIG9uZSdzIHdob2xlc2FsZS4gQSBzb3VyY2UgdGhhdCBjb250cmlidXRlcyB6ZXJvXG4gKiBhbGlhc2VzIGlzIHNraXBwZWQ7IGEgc291cmNlIHRoYXQgbmFtZXMgYW4gYWxpYXMgd2l0aG91dCBhIHNwYWNlXG4gKiBpZCBmYWlscyB0aHJvdWdoIHtAbGluayBub3JtYWxpemVHZW5pZVNwYWNlc30uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlR2VuaWVTcGFjZXMoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICBjb250ZXh0OiBwbHVnaW5SZWdpc3RyeS5QbHVnaW5Db250ZXh0TGlrZSB8IHVuZGVmaW5lZCxcbik6IFJlY29yZDxzdHJpbmcsIEdlbmllU3BhY2VDb25maWc+IHtcbiAgY29uc3QgbWVyZ2VkOiBSZWNvcmQ8c3RyaW5nLCBHZW5pZVNwYWNlQ29uZmlnPiA9IHt9O1xuXG4gIC8vIFNvdXJjZSAzIChsb3dlc3QgcHJlY2VkZW5jZSk6IGVudiB2YXIuXG4gIGNvbnN0IGVudlNwYWNlSWQgPSBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0dFTklFX1NQQUNFX0lEO1xuICBpZiAoZW52U3BhY2VJZCkge1xuICAgIG1lcmdlZFtERUZBVUxUX0dFTklFX0FMSUFTXSA9IHsgc3BhY2VJZDogZW52U3BhY2VJZCB9O1xuICB9XG5cbiAgLy8gU291cmNlIDI6IEFwcEtpdCBgZ2VuaWUoKWAgcGx1Z2luIGluc3RhbmNlIGNvbmZpZy4gVXNlIGFcbiAgLy8gc3RydWN0dXJhbCBjYXN0IC0gYFBsdWdpbi5jb25maWdgIGlzIGBwcm90ZWN0ZWRgIGluIFRTIG9ubHksXG4gIC8vIGFuZCB0aGUgcnVudGltZSBsYXlvdXQgaXMgcGxhaW4gb2JqZWN0IHByb3BlcnR5IGFjY2Vzcy5cbiAgY29uc3QgZ2VuaWVQbHVnaW4gPSBwbHVnaW5SZWdpc3RyeS5pbnN0YW5jZShjb250ZXh0LCBnZW5pZSk7XG4gIGlmIChnZW5pZVBsdWdpbikge1xuICAgIGNvbnN0IHBsdWdpblNwYWNlcyA9IChnZW5pZVBsdWdpbiBhcyB1bmtub3duIGFzIHsgY29uZmlnPzogQXBwS2l0R2VuaWVDb25maWcgfSkuY29uZmlnPy5zcGFjZXM7XG4gICAgaWYgKHBsdWdpblNwYWNlcykge1xuICAgICAgT2JqZWN0LmFzc2lnbihtZXJnZWQsIG5vcm1hbGl6ZUdlbmllU3BhY2VzKHBsdWdpblNwYWNlcykpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNvdXJjZSAxIChoaWdoZXN0IHByZWNlZGVuY2UpOiBleHBsaWNpdCBNYXN0cmEgd2lyaW5nLlxuICBpZiAoY29uZmlnLmdlbmllU3BhY2VzKSB7XG4gICAgT2JqZWN0LmFzc2lnbihtZXJnZWQsIG5vcm1hbGl6ZUdlbmllU3BhY2VzKGNvbmZpZy5nZW5pZVNwYWNlcykpO1xuICB9XG5cbiAgcmV0dXJuIG1lcmdlZDtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgZmxhdCBNYXN0cmEgdG9vbHMgcmVjb3JkIGZvciBldmVyeSBjb25maWd1cmVkIEdlbmllXG4gKiBzcGFjZS4gVHdvIHNoYXJlZCwgc3BhY2UtYWdub3N0aWMgdG9vbHMgKGBnZXRfc3RhdGVtZW50YCxcbiAqIGBwcmVwYXJlX2NoYXJ0YCkgYXJlIHJlZ2lzdGVyZWQgb25jZSByZWdhcmRsZXNzIG9mIGhvdyBtYW55XG4gKiBzcGFjZXMgYXJlIHdpcmVkOyB0aGUgcGVyLXNwYWNlIHRvb2xzIChgYXNrX2dlbmllYCxcbiAqIGBnZXRfc3BhY2VfZGVzY3JpcHRpb25gLCBgZ2V0X3NwYWNlX3NlcmlhbGl6ZWRgKSBhcmUgc3VmZml4ZWRcbiAqIHdpdGggYF88YWxpYXM+YCBmb3Igbm9uLWRlZmF1bHQgYWxpYXNlcyBzbyBtdWx0aS1zcGFjZVxuICogZGVwbG95bWVudHMgc3RheSBkaXNhbWJpZ3VhdGVkLlxuICpcbiAqIFJldHVybnMgYSByZWNvcmQga2V5ZWQgYnkgdG9vbCBpZCwgcmVhZHkgdG8gc3ByZWFkIGludG8gdGhlXG4gKiBjZW50cmFsIGBBZ2VudGAncyBgdG9vbHNgIG1hcCAob3Igc3VyZmFjZWQgdmlhIHRoZVxuICogYHBsdWdpbnMuZ2VuaWU/LnRvb2xraXQoKWAgY2FsbGJhY2spLiBSZXR1cm5zIGFuIGVtcHR5IHJlY29yZFxuICogd2hlbiBgc3BhY2VzYCByZXNvbHZlcyB0byB6ZXJvIGVudHJpZXMgc28gdGhlIGNhbGxlciBjYW4gc3ByZWFkXG4gKiBzYWZlbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEdlbmllVG9vbHMob3B0czoge1xuICBzcGFjZXM6IEdlbmllU3BhY2VzQ29uZmlnIHwgUmVjb3JkPHN0cmluZywgR2VuaWVTcGFjZUNvbmZpZz47XG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnO1xufSk6IE1hc3RyYVRvb2xzIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZUdlbmllU3BhY2VzKG9wdHMuc3BhY2VzKTtcbiAgY29uc3QgdG9vbHM6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVRvb2w+PiA9IHt9O1xuICBpZiAoT2JqZWN0LmtleXMobm9ybWFsaXplZCkubGVuZ3RoID09PSAwKSByZXR1cm4gdG9vbHM7XG5cbiAgLy8gU2hhcmVkLCBzcGFjZS1hZ25vc3RpYyB0b29scy5cbiAgdG9vbHMuZ2V0X3N0YXRlbWVudCA9IGJ1aWxkR2V0U3RhdGVtZW50VG9vbCgpO1xuICB0b29scy5wcmVwYXJlX2NoYXJ0ID0gYnVpbGRQcmVwYXJlQ2hhcnRUb29sKHsgY29uZmlnOiBvcHRzLmNvbmZpZyB9KTtcblxuICBmb3IgKGNvbnN0IFthbGlhcywgc3BhY2VdIG9mIE9iamVjdC5lbnRyaWVzKG5vcm1hbGl6ZWQpKSB7XG4gICAgY29uc3QgYXNrVG9vbCA9IGJ1aWxkQXNrR2VuaWVUb29sKHtcbiAgICAgIHNwYWNlSWQ6IHNwYWNlLnNwYWNlSWQsXG4gICAgICBhbGlhcyxcbiAgICAgIC4uLihvcHRzLmNvbmZpZy5nZW5pZUFnZW50TW9kZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8geyBhZ2VudE1vZGU6IG9wdHMuY29uZmlnLmdlbmllQWdlbnRNb2RlIH1cbiAgICAgICAgOiB7fSksXG4gICAgICAuLi4oc3BhY2UuaGludCA/IHsgaGludDogc3BhY2UuaGludCB9IDoge30pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRlc2NUb29sID0gYnVpbGRTcGFjZURlc2NyaXB0aW9uVG9vbCh7IHNwYWNlSWQ6IHNwYWNlLnNwYWNlSWQsIGFsaWFzIH0pO1xuICAgIGNvbnN0IHNlclRvb2wgPSBidWlsZFNwYWNlU2VyaWFsaXplZFRvb2woeyBzcGFjZUlkOiBzcGFjZS5zcGFjZUlkLCBhbGlhcyB9KTtcbiAgICB0b29sc1thc2tUb29sLmlkXSA9IGFza1Rvb2w7XG4gICAgdG9vbHNbZGVzY1Rvb2wuaWRdID0gZGVzY1Rvb2w7XG4gICAgdG9vbHNbc2VyVG9vbC5pZF0gPSBzZXJUb29sO1xuICB9XG4gIHJldHVybiB0b29scztcbn1cblxuLyoqXG4gKiBQbHVnaW4tdG9vbGtpdCBhZGFwdGVyIHNvIHRoZSBgcGx1Z2lucy5nZW5pZT8udG9vbGtpdCgpYCBsb29rdXBcbiAqIGluc2lkZSBhbiBhZ2VudCdzIGB0b29scyhwbHVnaW5zKWAgY2FsbGJhY2sgcmV0dXJucyB0aGVcbiAqIGZsYXQgR2VuaWUgdG9vbHMgcmVjb3JkIGluc3RlYWQgb2YgdGhyb3dpbmcgb24gbWlzc2luZyBwbHVnaW4uXG4gKiBNaXJyb3JzIEFwcEtpdCdzIGBQbHVnaW5Ub29sa2l0UHJvdmlkZXJgIHNoYXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRHZW5pZVRvb2xraXRQcm92aWRlcihvcHRzOiB7XG4gIHNwYWNlczogR2VuaWVTcGFjZXNDb25maWcgfCBSZWNvcmQ8c3RyaW5nLCBHZW5pZVNwYWNlQ29uZmlnPjtcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWc7XG59KToge1xuICB0b29sa2l0KG9wdHM/OiB1bmtub3duKTogTWFzdHJhVG9vbHM7XG59IHtcbiAgcmV0dXJuIHtcbiAgICB0b29sa2l0KF9vcHRzPzogdW5rbm93bikge1xuICAgICAgcmV0dXJuIGJ1aWxkR2VuaWVUb29scyhvcHRzKTtcbiAgICB9LFxuICB9O1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc3RhcnRlciBzdWdnZXN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBEZWZhdWx0IGNhcCBvbiBzdGFydGVyIHN1Z2dlc3Rpb25zIHN1cmZhY2VkIHRvIHRoZSBjaGF0IGVtcHR5XG4gKiBzdGF0ZS4gU2FtcGxlLXF1ZXN0aW9uIGxpc3RzIGNhbiBydW4gbG9uZyAoMTArIG9uIGEgY3VyYXRlZFxuICogc3BhY2UpOyBhIGhhbmRmdWwgb2Ygb25lLXRhcCBwcm9tcHRzIHJlYWRzIGJldHRlciB0aGFuIGEgd2FsbCBvZlxuICogYnV0dG9ucy5cbiAqL1xuY29uc3QgU1VHR0VTVElPTl9MSU1JVCA9IDY7XG5cbi8qKlxuICogSG93IGxvbmcgYSBzcGFjZSdzIHBhcnNlZCBzYW1wbGUgcXVlc3Rpb25zIHN0YXkgY2FjaGVkLiBUaGV5J3JlXG4gKiBhdXRob3JlZCBjb25maWcgdGhhdCBjaGFuZ2VzIHJhcmVseSwgYW5kIHRoZSBsb29rdXAgaXMgYW4gZXh0cmFcbiAqIFJFU1Qgcm91bmQtdHJpcCBwZXIgY2hhdCBtb3VudCwgc28gYSBmZXcgbWludXRlcyBvZiBjYWNoaW5nIGtlZXBzXG4gKiB0aGUgZW1wdHkgc3RhdGUgaW5zdGFudCBvbiByZWxvYWQgd2l0aG91dCBnb2luZyBzdGFsZSBmb3IgbG9uZy5cbiAqL1xuY29uc3QgU1VHR0VTVElPTl9DQUNIRV9UVExfTVMgPSAxMCAqIDYwXzAwMDtcblxuLyoqIFNwYWNlLWlkIC0+IGNhY2hlZCBzYW1wbGUgcXVlc3Rpb25zIHdpdGggYW4gYWJzb2x1dGUgZXhwaXJ5LiAqL1xuY29uc3QgX3N1Z2dlc3Rpb25DYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCB7IHF1ZXN0aW9uczogc3RyaW5nW107IGV4cGlyZXM6IG51bWJlciB9PigpO1xuXG4vKiogUmVhZCBhIHNwYWNlJ3MgY2FjaGVkIHF1ZXN0aW9ucywgb3IgYHVuZGVmaW5lZGAgb24gbWlzcyAvIGV4cGlyeS4gKi9cbmZ1bmN0aW9uIHJlYWRTdWdnZXN0aW9uQ2FjaGUoc3BhY2VJZDogc3RyaW5nKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICBjb25zdCBlbnRyeSA9IF9zdWdnZXN0aW9uQ2FjaGUuZ2V0KHNwYWNlSWQpO1xuICBpZiAoIWVudHJ5KSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoZW50cnkuZXhwaXJlcyA8PSBEYXRlLm5vdygpKSB7XG4gICAgX3N1Z2dlc3Rpb25DYWNoZS5kZWxldGUoc3BhY2VJZCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gZW50cnkucXVlc3Rpb25zO1xufVxuXG4vKiogQ2FjaGUgYSBzcGFjZSdzIHBhcnNlZCBxdWVzdGlvbnMgZm9yIHtAbGluayBTVUdHRVNUSU9OX0NBQ0hFX1RUTF9NU30uICovXG5mdW5jdGlvbiB3cml0ZVN1Z2dlc3Rpb25DYWNoZShzcGFjZUlkOiBzdHJpbmcsIHF1ZXN0aW9uczogc3RyaW5nW10pOiB2b2lkIHtcbiAgX3N1Z2dlc3Rpb25DYWNoZS5zZXQoc3BhY2VJZCwge1xuICAgIHF1ZXN0aW9ucyxcbiAgICBleHBpcmVzOiBEYXRlLm5vdygpICsgU1VHR0VTVElPTl9DQUNIRV9UVExfTVMsXG4gIH0pO1xufVxuXG4vKipcbiAqIENvbGxlY3QgdGhlIGN1cmF0ZWQgc3RhcnRlciBxdWVzdGlvbnMgYWNyb3NzIGV2ZXJ5IHJlc29sdmVkIEdlbmllXG4gKiBzcGFjZSwgZGVkdXBlZCBhbmQgY2FwcGVkLiBFYWNoIHNwYWNlJ3MgYHNhbXBsZV9xdWVzdGlvbnNgIGFyZVxuICogZmV0Y2hlZCBvbmNlIChjYWNoZWQgZm9yIHtAbGluayBTVUdHRVNUSU9OX0NBQ0hFX1RUTF9NU30pIHZpYVxuICoge0BsaW5rIGdldEdlbmllU3BhY2V9ICsge0BsaW5rIGdlbmllU2FtcGxlUXVlc3Rpb25zfSwgdGhlbiBtZXJnZWQgaW5cbiAqIGFsaWFzLWl0ZXJhdGlvbiBvcmRlciBzbyBhIHNpbmdsZS1zcGFjZSBhcHAgc3VyZmFjZXMgdGhhdCBzcGFjZSdzXG4gKiBxdWVzdGlvbnMgYW5kIGEgbXVsdGktc3BhY2UgYXBwIHJvdW5kLXRyaXBzIGJyZWFkdGgtZmlyc3QgdXAgdG8gdGhlXG4gKiBjYXAuIEEgcGVyLXNwYWNlIGZldGNoIGZhaWx1cmUgZGVncmFkZXMgdG8gXCJubyBxdWVzdGlvbnMgZm9yIHRoYXRcbiAqIHNwYWNlXCIgKGxvZ2dlZCwgbm90IHRocm93bikgc28gb25lIHVucmVhY2hhYmxlIHNwYWNlIG5ldmVyIGJsYW5rc1xuICogdGhlIHdob2xlIGxpc3QuIFJldHVybnMgYFtdYCB3aGVuIG5vIHNwYWNlcyBhcmUgY29uZmlndXJlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RTcGFjZVN1Z2dlc3Rpb25zKG9wdHM6IHtcbiAgc3BhY2VzOiBSZWNvcmQ8c3RyaW5nLCBHZW5pZVNwYWNlQ29uZmlnPjtcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQ7XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICBsaW1pdD86IG51bWJlcjtcbn0pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGxpbWl0ID0gb3B0cy5saW1pdCA/PyBTVUdHRVNUSU9OX0xJTUlUO1xuICBjb25zdCBtZXJnZWQ6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBmb3IgKGNvbnN0IHsgc3BhY2VJZCB9IG9mIE9iamVjdC52YWx1ZXMob3B0cy5zcGFjZXMpKSB7XG4gICAgbGV0IHF1ZXN0aW9ucyA9IHJlYWRTdWdnZXN0aW9uQ2FjaGUoc3BhY2VJZCk7XG4gICAgaWYgKCFxdWVzdGlvbnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNwYWNlID0gYXdhaXQgZ2VuaWVTcGFjZS5nZXRHZW5pZVNwYWNlKHNwYWNlSWQsIHtcbiAgICAgICAgICB3b3Jrc3BhY2VDbGllbnQ6IG9wdHMuY2xpZW50LFxuICAgICAgICAgIC4uLihvcHRzLnNpZ25hbCA/IHsgY29udGV4dDogb3B0cy5zaWduYWwgfSA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIHF1ZXN0aW9ucyA9IGdlbmllU3BhY2UuZ2VuaWVTYW1wbGVRdWVzdGlvbnMoc3BhY2UpO1xuICAgICAgICB3cml0ZVN1Z2dlc3Rpb25DYWNoZShzcGFjZUlkLCBxdWVzdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFwic3VnZ2VzdGlvbnM6ZmV0Y2gtZXJyb3JcIiwge1xuICAgICAgICAgIHNwYWNlSWQsXG4gICAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgICAgIH0pO1xuICAgICAgICBxdWVzdGlvbnMgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBxdWVzdGlvbiBvZiBxdWVzdGlvbnMpIHtcbiAgICAgIGlmIChzZWVuLmhhcyhxdWVzdGlvbikpIGNvbnRpbnVlO1xuICAgICAgc2Vlbi5hZGQocXVlc3Rpb24pO1xuICAgICAgbWVyZ2VkLnB1c2gocXVlc3Rpb24pO1xuICAgICAgaWYgKG1lcmdlZC5sZW5ndGggPj0gbGltaXQpIHJldHVybiBtZXJnZWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBtZXJnZWQ7XG59XG4iXX0=
999
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuaWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2VuaWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9DRztBQUVILE9BQU8sRUFDTCxZQUFZLEVBQ1osa0JBQWtCLEVBQ2xCLGNBQWMsRUFDZCxLQUFLLEVBQ0wsZUFBZSxHQUNoQixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssSUFBSSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsVUFBVSxFQUFxQixNQUFNLHlCQUF5QixDQUFDO0FBR3hFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxVQUFVLEVBQTZCLE1BQU0sb0JBQW9CLENBQUM7QUFDM0UsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUd4QixPQUFPLEVBQUUseUJBQXlCLEVBQUUscUJBQXFCLEVBQUUsWUFBWSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzVGLE9BQU8sRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTlELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVoRCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBRTFDLHdFQUF3RTtBQUN4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QUMsQ0FBQztnQkFDbkQsb0JBQW9CLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNDLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUU7b0JBQ3JDLE9BQU87b0JBQ1AsS0FBSyxFQUFFLFVBQVUsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDO2lCQUNwQyxDQUFDLENBQUM7Z0JBQ0gsU0FBUyxHQUFHLEVBQUUsQ0FBQztZQUNqQixDQUFDO1FBQ0gsQ0FBQztRQUNELEtBQUssTUFBTSxRQUFRLElBQUksU0FBUyxFQUFFLENBQUM7WUFDakMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztnQkFBRSxTQUFTO1lBQ2pDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbkIsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0QixJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksS0FBSztnQkFBRSxPQUFPLE1BQU0sQ0FBQztRQUM1QyxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmllIHRvb2xzIGZvciBNYXN0cmEuXG4gKlxuICogU3VyZmFjZXMgZWFjaCBjb25maWd1cmVkIEdlbmllIHNwYWNlIGFzIGEgc21hbGwgc2V0IG9mIGZsYXQgTWFzdHJhXG4gKiB0b29scyB0aGUgY2FsbGluZyBhZ2VudCBkcml2ZXMgZGlyZWN0bHkgLSBubyBpbm5lciBvcmNoZXN0cmF0b3JcbiAqIGFnZW50LiBUaGUgY2VudHJhbCBhZ2VudCBkZWNvbXBvc2VzIHVzZXIgcXVlc3Rpb25zLCBwaWNrcyB3aGljaFxuICogc3BhY2UgdG8gYXNrLCBzdHJlYW1zIHRoZSBwZXItdHVybiB3aXJlIGV2ZW50cyAoc3RhdHVzLCB0aGlua2luZyxcbiAqIHNxbCwgcm93cykgdGhyb3VnaCBgY3R4LndyaXRlcmAsIGFuZCBjb21wb3NlcyB0aGUgZmluYWwgcmVwbHkuXG4gKiBSb3dzIGFyZSBuZXZlciBmZXRjaGVkIGVhZ2VybHk6IHRoZSBhZ2VudCByZWFkcyBhIHN0YXRlbWVudCdzXG4gKiB2YWx1ZXMgb25seSB3aGVuIGl0IG5lZWRzIHRvIHJlYXNvbiBhYm91dCB0aGVtLCBvdGhlcndpc2UgaXQgZW1iZWRzXG4gKiBhIGBbZGF0YTo8c3RhdGVtZW50X2lkPl1gIG1hcmtlciBpbiBwcm9zZSBhbmQgbGV0cyB0aGUgaG9zdCBVSVxuICogcmVzb2x2ZSB0aGUgZGF0YS4gQ2hhcnRzIGFyZSBtaW50ZWQgYXN5bmNocm9ub3VzbHkgYW5kIHJlZmVyZW5jZWRcbiAqIGJ5IGBbY2hhcnQ6PGNoYXJ0SWQ+XWAgbWFya2VycyBzbyBwcm9zZSBpc24ndCBibG9ja2VkIG9uIGNoYXJ0XG4gKiBnZW5lcmF0aW9uOyB0aGUgaG9zdCBVSSBmZXRjaGVzIHRoZSBjYWNoZWQgc3BlYyBieSBpZCBvbmNlIHJlYWR5LlxuICogU3BhY2UgZGVzY3JpcHRpb24gYW5kIHNlcmlhbGl6ZWQtc3BhY2UgbG9va3VwcyBhcmUgYXZhaWxhYmxlIGZvclxuICogZ3JvdW5kaW5nIHdoZW4gdGhlIGFnZW50IG5lZWRzIHNjaGVtYSBjb250ZXh0LlxuICpcbiAqIEVhY2ggdG9vbCdzIGBleGVjdXRlYCBwdWxscyB0aGUgcGVyLXJlcXVlc3RcbiAqIHtAbGluayBXb3Jrc3BhY2VDbGllbnR9IG9mZiBgY3R4LnJlcXVlc3RDb250ZXh0YCAoc3RhbXBlZCBieVxuICogYE1hc3RyYVNlcnZlcmAgdW5kZXIge0BsaW5rIE1BU1RSQV9VU0VSX0tFWX0pIGFuZCB0aGUgcGVyLWNhbGxcbiAqIGB3cml0ZXJgIC8gYGFib3J0U2lnbmFsYCBvZmYgYGN0eGAsIHNvIHRoZSB0b29scyBhcmUgc3RhdGVsZXNzXG4gKiBhY3Jvc3MgcmVxdWVzdHMgYW5kIHRoZSBjZW50cmFsIGFnZW50IG93bnMgdGhlIGxvb3AuXG4gKlxuICogVGhlIHRvb2xzIHRhbGsgdG8gR2VuaWUgZGlyZWN0bHkgdmlhIGBAZGJ4LXRvb2xzL2dlbmllYFxuICogKGBnZW5pZUV2ZW50Q2hhdGApOyBzdGF0ZW1lbnQtcm93IGZldGNoaW5nIGlzIGRlbGVnYXRlZCB0b1xuICoge0BsaW5rIGZldGNoU3RhdGVtZW50RGF0YX0gZnJvbSBgLi9zdGF0ZW1lbnQuanNgLCB3aGljaCB3cmFwc1xuICogdGhlIHdvcmtzcGFjZSBgc3RhdGVtZW50RXhlY3V0aW9uLmdldFN0YXRlbWVudGAgQVBJLiBBcHBLaXQnc1xuICogc3RvY2sgYGdlbmllYCBwbHVnaW4gaXMgaG9ub3JlZCBvbmx5IGZvciBpdHMgYHNwYWNlc2AgY29uZmlnXG4gKiBzbyBleGlzdGluZyBBcHBLaXQtc3R5bGUgd2lyaW5nIGtlZXBzIHdvcmtpbmcgd2l0aG91dCBjaGFuZ2UuXG4gKlxuICogU3VnZ2VzdGVkIG9yY2hlc3RyYXRpb24gcHJvbXB0IGZvciB0aGUgY2VudHJhbCBhZ2VudCBsaXZlcyBpblxuICoge0BsaW5rIEdFTklFX0lOU1RSVUNUSU9OU307IGNvbXBvc2UgaXQgaW50byB0aGUgYWdlbnQncyBvd25cbiAqIGBpbnN0cnVjdGlvbnNgIHdoZW4geW91IHdhbnQgdGhlIGNhbm9uaWNhbCBcImhvdyB0byBkcml2ZSB0aGVcbiAqIEdlbmllIHRvb2xzXCIgZ3VpZGFuY2UuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIENhY2hlTWFuYWdlcixcbiAgQ29uZmlndXJhdGlvbkVycm9yLFxuICBFeGVjdXRpb25FcnJvcixcbiAgZ2VuaWUsXG4gIFZhbGlkYXRpb25FcnJvcixcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBwbHVnaW5SZWdpc3RyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgY2hhdCwgc3BhY2UgYXMgZ2VuaWVTcGFjZSB9IGZyb20gXCJAZGJ4LXRvb2xzL2dlbmllXCI7XG5pbXBvcnQgeyBlcnJvclV0aWxzLCBsb2csIHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IGdlbmllTW9kZWwsIHR5cGUgR2VuaWVNZXNzYWdlIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWdlbmllXCI7XG5pbXBvcnQgdHlwZSB7IFN0YXJ0ZWRFdmVudCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmFcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHsgTUFTVFJBX1RIUkVBRF9JRF9LRVkgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHsgY3JlYXRlVG9vbCwgdHlwZSBUb29sRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvdG9vbHNcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB0eXBlIHsgTWFzdHJhVG9vbHMgfSBmcm9tIFwiLi9hZ2VudHMudHNcIjtcbmltcG9ydCB7IGNoYXJ0UGxhbm5lclJlcXVlc3RTY2hlbWEsIGNoYXJ0VG9vbE91dHB1dFNjaGVtYSwgcHJlcGFyZUNoYXJ0IH0gZnJvbSBcIi4vY2hhcnQudHNcIjtcbmltcG9ydCB7IE1BU1RSQV9VU0VSX0tFWSwgcmVzb2x2ZVVzZXJLZXkgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB0eXBlIHsgTWFzdHJhUGx1Z2luQ29uZmlnLCBVc2VyIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyBmZXRjaFN0YXRlbWVudERhdGEgfSBmcm9tIFwiLi9zdGF0ZW1lbnQudHNcIjtcbmltcG9ydCB7IHN0YW1wR2VuaWVUb29sU3BhbiB9IGZyb20gXCIuL3RlbGVtZXRyeS50c1wiO1xuaW1wb3J0IHsgc2FmZVdyaXRlUHJvZ3Jlc3MgfSBmcm9tIFwiLi93cml0ZXIudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS9nZW5pZVwiKTtcblxuLyoqIERlZmF1bHQgYWxpYXMgdXNlZCB3aGVuIGEgc2luZ2xlIHVubmFtZWQgR2VuaWUgc3BhY2UgaXMgd2lyZWQgdXAuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9HRU5JRV9BTElBUyA9IFwiZGVmYXVsdFwiO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY29uZmlnIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiogUGVyLXNwYWNlIEdlbmllIGFnZW50IGNvbmZpZ3VyYXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmllU3BhY2VDb25maWcge1xuICAvKiogR2VuaWUgYHNwYWNlX2lkYC4gUmVxdWlyZWQ7IHJlc29sdmVzIHZpYSBgY2xpZW50LmdlbmllLmdldFNwYWNlYC4gKi9cbiAgc3BhY2VJZDogc3RyaW5nO1xuICAvKipcbiAgICogT3B0aW9uYWwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gYXBwZW5kZWQgdG8gdGhlIHBlci1zcGFjZVxuICAgKiB0b29sIGRlc2NyaXB0aW9ucyBzbyB0aGUgY2FsbGluZyBMTE0gaGFzIGhpbnRzIGFib3V0ICp3aGF0XG4gICAqIGRhdGEqIHRoaXMgc3BhY2UgY292ZXJzIChlLmcuIFwib3JkZXJzLCByZXR1cm5zLFxuICAgKiBmdWxmaWxsbWVudFwiKS4gV2hlbiBvbWl0dGVkLCBvbmx5IHRoZSBzcGFjZSdzIG93blxuICAgKiBgZGVzY3JpcHRpb25gIChmZXRjaGVkIG9uIGZpcnN0IHVzZSBvZiBgZ2V0X3NwYWNlX2Rlc2NyaXB0aW9uYClcbiAgICogaXMgc2hvd24uXG4gICAqL1xuICBoaW50Pzogc3RyaW5nO1xufVxuXG4vKiogTWFwIG9mIGFsaWFzIC0+IHNwYWNlIGNvbmZpZy4gQWNjZXB0cyBlaXRoZXIgZXhwbGljaXQgb2JqZWN0cyBvciBiYXJlIHNwYWNlIGlkcy4gKi9cbmV4cG9ydCB0eXBlIEdlbmllU3BhY2VzQ29uZmlnID0gUmVjb3JkPHN0cmluZywgR2VuaWVTcGFjZUNvbmZpZyB8IHN0cmluZz47XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY3R4IGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIE5hcnJvdyB2aWV3IG9mIHRoZSBzZWNvbmQgYXJnIE1hc3RyYSBwYXNzZXMgdG8gYSB0b29sJ3NcbiAqIGBleGVjdXRlKGlucHV0LCBjdHgpYC4gQ2FwdHVyZXMgdGhlIGZpZWxkcyB0aGUgR2VuaWUgdG9vbHNcbiAqIGFjdHVhbGx5IHJlYWQgLSBgcmVxdWVzdENvbnRleHRgIChmb3IgdXNlciAvIGNvbnZlcnNhdGlvblxuICogc3RhdGUpLCBgd3JpdGVyYCAoZm9yIHN0cmVhbWluZyBldmVudHMgdG8gdGhlIGhvc3QgVUkpLCBhbmRcbiAqIGBhYm9ydFNpZ25hbGAgKGZvciBwZXItY2FsbCBjYW5jZWxsYXRpb24pLlxuICovXG50eXBlIFRvb2xFeGVjdXRlQ3R4ID1cbiAgUGljazxUb29sRXhlY3V0aW9uQ29udGV4dCwgXCJyZXF1ZXN0Q29udGV4dFwiIHwgXCJ3cml0ZXJcIiB8IFwiYWJvcnRTaWduYWxcIiB8IFwiYWdlbnRcIj4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogUHVsbCB0aGUgcGVyLXJlcXVlc3Qge0BsaW5rIFdvcmtzcGFjZUNsaWVudH0gb2ZmIHRoZSBhY3RpdmVcbiAqIGBSZXF1ZXN0Q29udGV4dGAuIFRoZSBNYXN0cmEgcGx1Z2luJ3Mgc2VydmVyIG1pZGRsZXdhcmUgc3RhbXBzXG4gKiBhIHtAbGluayBVc2VyfSBvbiB0aGUgY29udGV4dCB1bmRlciB7QGxpbmsgTUFTVFJBX1VTRVJfS0VZfVxuICogZm9yIGV2ZXJ5IHJlcXVlc3Q7IHRvb2xzIGZhaWwgbG91ZGx5IHdoZW4gaXQncyBtaXNzaW5nIGJlY2F1c2VcbiAqIHRoYXQgbWVhbnMgdGhlIE1hc3RyYSBwbHVnaW4gaXNuJ3QgcnVubmluZyAoZS5nLiBhIHRvb2wgd2FzXG4gKiBpbnZva2VkIG91dHNpZGUgdGhlIGNoYXQgcm91dGUpLlxuICovXG5mdW5jdGlvbiByZXF1aXJlQ2xpZW50KFxuICBjdHg6IFRvb2xFeGVjdXRlQ3R4LFxuICB0b29sSWQ6IHN0cmluZyxcbik6IHtcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQ7XG4gIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dDtcbn0ge1xuICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IGN0eD8ucmVxdWVzdENvbnRleHQ7XG4gIGlmICghcmVxdWVzdENvbnRleHQpIHtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IucmVzb3VyY2VOb3RGb3VuZChcbiAgICAgIGAke3Rvb2xJZH0gcmVxdWVzdCBjb250ZXh0YCxcbiAgICAgIFwiSW52b2tlIHRoZSB0b29sIGZyb20gYW4gYWdlbnQgdHVybiBzZXJ2ZWQgYnkgdGhlIG1hc3RyYSBwbHVnaW4uXCIsXG4gICAgKTtcbiAgfVxuICBjb25zdCB1c2VyID0gcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9VU0VSX0tFWSkgYXMgVXNlciB8IHVuZGVmaW5lZDtcbiAgaWYgKCF1c2VyKSB7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICBgJHt0b29sSWR9IHVzZXIgY29udGV4dGAsXG4gICAgICBcIkludm9rZSB0aGUgdG9vbCBmcm9tIGFuIGFnZW50IHR1cm4gc2VydmVkIGJ5IHRoZSBtYXN0cmEgcGx1Z2luLCB3aGljaCBzdGFtcHMgdGhlIEFwcEtpdCB1c2VyIG9uIHRoZSBNYXN0cmEgcmVxdWVzdCBjb250ZXh0LlwiLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHsgY2xpZW50OiB1c2VyLmV4ZWN1dGlvbkNvbnRleHQuY2xpZW50LCByZXF1ZXN0Q29udGV4dCB9O1xufVxuXG4vKipcbiAqIExvd2VyY2FzZWQgcGxhY2Vob2xkZXIgc3RyaW5ncyB3ZSByZWplY3QgYXQgdGhlIGBhc2tfZ2VuaWVgXG4gKiBib3VuZGFyeSBzbyB0aGUgTExNIGRvZXNuJ3Qgc3BlbmQgYSBHZW5pZSByb3VuZC10cmlwIG9uIGFcbiAqIG5vbi1xdWVzdGlvbi4gR2VuaWUgcG9saXRlbHkgYW5zd2VycyBhbnkgb2YgdGhlc2Ugd2l0aCBcIllvdXJcbiAqIHJlcXVlc3QgJy4uLicgZG9lcyBub3QgcmVsYXRlIHRvLi4uXCIgd2hpY2ggaXMgcHVyZSBVSSBub2lzZS5cbiAqIEtlcHQgbmFycm93IG9uIHB1cnBvc2UgLSByZWFsIHF1ZXN0aW9ucyBzb21ldGltZXMgc3RhcnQgd2l0aFxuICogb25lIG9mIHRoZXNlIHRva2Vucywgc28gd2Ugb25seSBtYXRjaCB0aGUgRlVMTCB0cmltbWVkIHN0cmluZy5cbiAqL1xuY29uc3QgUExBQ0VIT0xERVJfUVVFU1RJT05TID0gbmV3IFNldChbXG4gIFwibm9vcFwiLFxuICBcIm5vLW9wXCIsXG4gIFwic2tpcFwiLFxuICBcIm5vbmVcIixcbiAgXCJuL2FcIixcbiAgXCJuYVwiLFxuICBcIm51bGxcIixcbiAgXCJ1bmRlZmluZWRcIixcbiAgXCJ0ZXN0XCIsXG4gIFwicGxhY2Vob2xkZXJcIixcbl0pO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb252ZXJzYXRpb24gc3RhdGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBFc3RpbWF0ZWQgR2VuaWUgY29udmVyc2F0aW9uIGxpZmV0aW1lIGluIHNlY29uZHMuIERhdGFicmlja3NcbiAqIHB1Ymxpc2hlcyBubyBvZmZpY2lhbCBUVEwgb24gdGhlIGNvbnZlcnNhdGlvbiByZXNvdXJjZSBpdHNlbGY7XG4gKiBjb21tdW5pdHkgcHJvamVjdHMgKGUuZy4gdGhlIG9wZW4tc291cmNlIERhdGFicmlja3MgR2VuaWUgQm90KVxuICogY29udmVyZ2Ugb24gNCBob3VycyBvZiBpbmFjdGl2aXR5IGFzIGEgc2FmZSBvcGVyYXRpbmcgd2luZG93LlxuICogVHJlYXQgdGhpcyBhcyBhbiBlc3RpbWF0ZSB0aGF0IGdldHMgKmV4dGVuZGVkIG9uIGV2ZXJ5IHVzZSogYnlcbiAqIHJlLXNldHRpbmcgdGhlIGNhY2hlIGVudHJ5IGFmdGVyIGVhY2ggc3VjY2Vzc2Z1bCB0dXJuIChzbGlkaW5nXG4gKiBUVEwgdmlhIHJlLWBzZXRgKS4gV2hlbiB0aGUgZXN0aW1hdGUgZW5kcyB1cCB3cm9uZyAoY29udmVyc2F0aW9uXG4gKiBkZWxldGVkLCBleHBpcmVkIHVwc3RyZWFtLCBjcm9zcy1zcGFjZSByZWZlcmVuY2VkKSwgYGFza19nZW5pZWBcbiAqIGNhdGNoZXMgdGhlIFNESydzIGBSRVNPVVJDRV9ET0VTX05PVF9FWElTVGAvNDA0IGFuZCB0cmFuc3BhcmVudGx5XG4gKiBzdGFydHMgYSBmcmVzaCBjb252ZXJzYXRpb24uXG4gKi9cbmNvbnN0IENPTlZFUlNBVElPTl9UVExfU0VDID0gNCAqIDYwICogNjA7XG5cbi8qKiBDYWNoZSBuYW1lc3BhY2UgcHJlZml4IHNvIGNvZXhpc3RpbmcgTWFzdHJhIGNhY2hlcyBkb24ndCBjb2xsaWRlLiAqL1xuY29uc3QgQ09OVkVSU0FUSU9OX0NBQ0hFX05BTUVTUEFDRSA9IFwibWFzdHJhOmdlbmllOmNvbnZlcnNhdGlvblwiO1xuXG4vKipcbiAqIFBlci1yZXF1ZXN0IHN0YXRlIGZvciBvbmUgR2VuaWUgc3BhY2UuIFRoZSByZXVzYWJsZSBjb252ZXJzYXRpb24gaXMgcmVzZXJ2ZWRcbiAqIGJ5IGF0IG1vc3Qgb25lIGludm9jYXRpb24gYXQgYSB0aW1lLiBBZGRpdGlvbmFsIGNvbmN1cnJlbnQgaW52b2NhdGlvbnMgdXNlXG4gKiBpc29sYXRlZCBjb252ZXJzYXRpb25zIHNvIE1hc3RyYSBjYW4gZXhlY3V0ZSBwYXJhbGxlbCB0b29sIGNhbGxzIHdpdGhvdXRcbiAqIGFwcGVuZGluZyBtdWx0aXBsZSBhY3RpdmUgbWVzc2FnZXMgdG8gdGhlIHNhbWUgR2VuaWUgY29udmVyc2F0aW9uLlxuICovXG5pbnRlcmZhY2UgQ29udmVyc2F0aW9uU3RhdGUge1xuICBjb252ZXJzYXRpb25JZD86IHN0cmluZztcbiAgcmV1c2FibGVDb252ZXJzYXRpb25JbkZsaWdodDogYm9vbGVhbjtcbn1cblxuLyoqIEJ1aWxkIHRoZSBwZXItcmVxdWVzdCB7QGxpbmsgUmVxdWVzdENvbnRleHR9IGtleSBmb3Igb25lIEdlbmllIHNwYWNlLiAqL1xuY29uc3QgY29udmVyc2F0aW9uQ29udGV4dEtleSA9IChzcGFjZUlkOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgYG1hc3RyYV9fZ2VuaWVfY29udmVyc2F0aW9uX18ke3NwYWNlSWR9YDtcblxuLyoqXG4gKiBSZWFkIG9yIGluaXRpYWxpemUgdGhlIHBlci1zcGFjZSBjb252ZXJzYXRpb24gc3RhdGUuIFRoZSBzdHJpbmcgYnJhbmNoXG4gKiBwcmVzZXJ2ZXMgY29tcGF0aWJpbGl0eSB3aXRoIGEgY29udGV4dCBwb3B1bGF0ZWQgYnkgYW4gb2xkZXIgcGFja2FnZSBjb3B5LlxuICovXG5mdW5jdGlvbiBjb252ZXJzYXRpb25TdGF0ZShyZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQsIHNwYWNlSWQ6IHN0cmluZyk6IENvbnZlcnNhdGlvblN0YXRlIHtcbiAgY29uc3Qga2V5ID0gY29udmVyc2F0aW9uQ29udGV4dEtleShzcGFjZUlkKTtcbiAgY29uc3QgY3VycmVudCA9IHJlcXVlc3RDb250ZXh0LmdldChrZXkpIGFzIENvbnZlcnNhdGlvblN0YXRlIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBpZiAoY3VycmVudCAmJiB0eXBlb2YgY3VycmVudCA9PT0gXCJvYmplY3RcIikgcmV0dXJuIGN1cnJlbnQ7XG4gIGNvbnN0IHN0YXRlOiBDb252ZXJzYXRpb25TdGF0ZSA9IHtcbiAgICAuLi4odHlwZW9mIGN1cnJlbnQgPT09IFwic3RyaW5nXCIgPyB7IGNvbnZlcnNhdGlvbklkOiBjdXJyZW50IH0gOiB7fSksXG4gICAgcmV1c2FibGVDb252ZXJzYXRpb25JbkZsaWdodDogZmFsc2UsXG4gIH07XG4gIHJlcXVlc3RDb250ZXh0LnNldChrZXksIHN0YXRlKTtcbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIFJlc2VydmUgdGhlIHJldXNhYmxlIGNvbnZlcnNhdGlvbiB3aGVuIGl0IGlzIGlkbGUuIEEgY2FsbGVyIHRoYXQgY2Fubm90XG4gKiByZXNlcnZlIGl0IGdldHMgYW4gaXNvbGF0ZWQgY29udmVyc2F0aW9uIGFuZCBtYXkgcnVuIGluIHBhcmFsbGVsLlxuICovXG5mdW5jdGlvbiByZXNlcnZlQ29udmVyc2F0aW9uKHN0YXRlOiBDb252ZXJzYXRpb25TdGF0ZSk6IGJvb2xlYW4ge1xuICBpZiAoc3RhdGUucmV1c2FibGVDb252ZXJzYXRpb25JbkZsaWdodCkgcmV0dXJuIGZhbHNlO1xuICBzdGF0ZS5yZXVzYWJsZUNvbnZlcnNhdGlvbkluRmxpZ2h0ID0gdHJ1ZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGNhbm9uaWNhbCBjYWNoZSBrZXkgZm9yIGEgYChzcGFjZUlkLCB0aHJlYWRJZClgIHBhaXIsIG93bmVkIGJ5XG4gKiBgdXNlcktleWAuIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiBgdGhyZWFkSWRgIGlzIG1pc3NpbmcgLSBjYWxsZXJzIHNob3VsZFxuICogc2tpcCBjYWNoaW5nIGVudGlyZWx5IGluIHRoYXQgY2FzZSAobm8gTWFzdHJhIG1lbW9yeSB3aXJlZCB1cCkuXG4gKlxuICogVGhlIGlkZW50aXR5IGlzIHBhcnQgb2YgdGhlIGtleSBiZWNhdXNlIGEgY2xpZW50IHBpY2tzIGl0cyBvd24gYHRocmVhZElkYFxuICogKHRoZSB0aHJlYWQtc2VsZWN0aW9uIGhlYWRlciAvIGA/dGhyZWFkSWQ9YCksIHNvIHRoZSBpZCBhbG9uZSBkb2VzIG5vdFxuICogZXN0YWJsaXNoIHdobyBvd25zIHRoZSBHZW5pZSBjb252ZXJzYXRpb24gYmVoaW5kIGl0LlxuICovXG5hc3luYyBmdW5jdGlvbiBjb252ZXJzYXRpb25DYWNoZUtleShcbiAgc3BhY2VJZDogc3RyaW5nLFxuICB0aHJlYWRJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB1c2VyS2V5OiBzdHJpbmcsXG4pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBpZiAoIXRocmVhZElkKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gKGF3YWl0IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZSgpKS5nZW5lcmF0ZUtleShcbiAgICBbQ09OVkVSU0FUSU9OX0NBQ0hFX05BTUVTUEFDRSwgc3BhY2VJZCwgdGhyZWFkSWRdLFxuICAgIHVzZXJLZXksXG4gICk7XG59XG5cbi8qKlxuICogUmVhZCB0aGUgY2FjaGVkIEdlbmllIGNvbnZlcnNhdGlvbiBpZCBmb3IgYChzcGFjZUlkLCB0aHJlYWRJZClgLlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCBvbiBtaXNzLCBvbiBleHBpcnksIG9yIHdoZW4gdGhlIGNhY2hlIGxheWVyXG4gKiBpcyB1bmhlYWx0aHkgLSBuZXZlciB0aHJvd3MuIFRoZSBUVEwgaXMgcmVuZXdlZCB2aWEgcmUtYHNldGBcbiAqIGFmdGVyIGVhY2ggc3VjY2Vzc2Z1bCB0dXJuIChzZWUge0BsaW5rIHNhdmVDYWNoZWRDb252ZXJzYXRpb25JZH0pLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkQ2FjaGVkQ29udmVyc2F0aW9uSWQoY2FjaGVLZXk6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmICghY2FjaGVLZXkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgdiA9IGF3YWl0IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZVN5bmMoKS5nZXQ8c3RyaW5nPihjYWNoZUtleSk7XG4gICAgcmV0dXJuIHYgPz8gdW5kZWZpbmVkO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihcImNvbnZlcnNhdGlvbi1jYWNoZTpyZWFkLWVycm9yXCIsIHtcbiAgICAgIGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnIpLFxuICAgIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBQZXJzaXN0IHRoZSBhY3RpdmUgY29udmVyc2F0aW9uIGlkIHVuZGVyIGBjYWNoZUtleWAsIHJlZnJlc2hpbmdcbiAqIGl0cyBUVEwuIElkZW1wb3RlbnQ7IG5vLW9wIHdoZW4gYGNhY2hlS2V5YCBvciBgY29udmVyc2F0aW9uSWRgXG4gKiBpcyBtaXNzaW5nLiBSZS1zZXR0aW5nIHRoZSBzYW1lIGtleSBhY3RzIGFzIGEgc2xpZGluZyBUVEw6IGV2ZXJ5XG4gKiB0dXJuIHRoYXQgdXNlcyB0aGUgY29udmVyc2F0aW9uIGV4dGVuZHMgdGhlIHdpbmRvdyBieSBhbm90aGVyXG4gKiB7QGxpbmsgQ09OVkVSU0FUSU9OX1RUTF9TRUN9IHNlY29uZHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNhdmVDYWNoZWRDb252ZXJzYXRpb25JZChcbiAgY2FjaGVLZXk6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgY29udmVyc2F0aW9uSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWNhY2hlS2V5IHx8ICFjb252ZXJzYXRpb25JZCkgcmV0dXJuO1xuICB0cnkge1xuICAgIGF3YWl0IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZVN5bmMoKS5zZXQoY2FjaGVLZXksIGNvbnZlcnNhdGlvbklkLCB7XG4gICAgICB0dGw6IENPTlZFUlNBVElPTl9UVExfU0VDLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihcImNvbnZlcnNhdGlvbi1jYWNoZTp3cml0ZS1lcnJvclwiLCB7XG4gICAgICBlcnJvcjogZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKiogRm9yY2UtZXZpY3QgYSBjYWNoZWQgY29udmVyc2F0aW9uIGlkLiBVc2VkIG9uIHRoZSBzdGFsZS1pZCByZWNvdmVyeSBwYXRoLiAqL1xuYXN5bmMgZnVuY3Rpb24gZXZpY3RDYWNoZWRDb252ZXJzYXRpb25JZChjYWNoZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghY2FjaGVLZXkpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBhd2FpdCBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2VTeW5jKCkuZGVsZXRlKGNhY2hlS2V5KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJjb252ZXJzYXRpb24tY2FjaGU6ZGVsZXRlLWVycm9yXCIsIHtcbiAgICAgIGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnIpLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogTGF6eS1zZWVkIHRoZSBhY3RpdmUgR2VuaWUgYGNvbnZlcnNhdGlvbl9pZGAgZm9yIGBzcGFjZUlkYCBmcm9tXG4gKiB0aGUgY3Jvc3MtcmVxdWVzdCBjYWNoZSBvbnRvIHRoZSBwZXItcmVxdWVzdCBgUmVxdWVzdENvbnRleHRgLlxuICogTm8tb3Agd2hlbiB0aGUgc2xvdCBpcyBhbHJlYWR5IHBvcHVsYXRlZCAoc3Vic2VxdWVudFxuICogYGFza19nZW5pZWAgY2FsbHMgaW4gdGhlIHNhbWUgdHVybikgc28gd2UgaGl0IHRoZSBjYWNoZSBhdCBtb3N0XG4gKiBvbmNlIHBlciByZXF1ZXN0IHBlciBzcGFjZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5zdXJlQ29udmVyc2F0aW9uU2VlZGVkKFxuICBzdGF0ZTogQ29udmVyc2F0aW9uU3RhdGUsXG4gIGNhY2hlS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHN0YXRlLmNvbnZlcnNhdGlvbklkKSByZXR1cm47XG4gIGNvbnN0IGNhY2hlZCA9IGF3YWl0IHJlYWRDYWNoZWRDb252ZXJzYXRpb25JZChjYWNoZUtleSk7XG4gIGlmIChjYWNoZWQpIHN0YXRlLmNvbnZlcnNhdGlvbklkID0gY2FjaGVkO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcHJlcGFyZV9jaGFydCBpbnB1dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBBZ2VudC1mYWNpbmcgYHByZXBhcmVfY2hhcnRgIGlucHV0IHNjaGVtYS4gUmV1c2VzXG4gKiB7QGxpbmsgY2hhcnRQbGFubmVyUmVxdWVzdFNjaGVtYX0gKHRoZSBkYXRhc2V0LWRyaXZlbiBwbGFubmVyXG4gKiBjb250cmFjdCkgYnV0IHN3YXBzIHRoZSBpbmxpbmUgYGRhdGFgIGZpZWxkIGZvciBhIEdlbmllXG4gKiBgc3RhdGVtZW50X2lkYCB0aGUgdG9vbCByZXNvbHZlcyBpbnRvIHJvd3Mgc2VydmVyLXNpZGUuXG4gKiBgdGl0bGVgIGlzIGxvb3NlbmVkIHRvIG9wdGlvbmFsIC0gdGhlIHBsYW5uZXIgZmFsbHMgYmFjayB0byBhXG4gKiBnZW5lcmljIHBsYWNlaG9sZGVyIHdoZW4gdGhlIGFnZW50IGRvZXNuJ3Qgc3VwcGx5IG9uZS5cbiAqXG4gKiBTaGFwZWQgdG8gbWF0Y2ggR2VuaWUncyB3aXJlIGZvcm0gLSBgc3RhdGVtZW50X2lkYCAoc25ha2UpXG4gKiBtaXJyb3JzIGBxdWVyeV9yZXN1bHQuc3RhdGVtZW50X2lkYCBhbmQgdGhlIGBnZXRfc3RhdGVtZW50YFxuICogdG9vbCdzIGlucHV0IGZpZWxkIG5hbWUsIHNvIHRoZSBMTE0gb25seSBldmVyIHNlZXMgb25lXG4gKiBzcGVsbGluZyBmb3IgdGhlIHNhbWUgaWRlbnRpZmllci5cbiAqL1xuY29uc3QgcHJlcGFyZUNoYXJ0UmVxdWVzdFNjaGVtYSA9IGNoYXJ0UGxhbm5lclJlcXVlc3RTY2hlbWFcbiAgLm9taXQoeyBkYXRhOiB0cnVlLCB0aXRsZTogdHJ1ZSB9KVxuICAuZXh0ZW5kKHtcbiAgICBzdGF0ZW1lbnRfaWQ6IHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLm1pbigxLCBcInN0YXRlbWVudF9pZCBpcyByZXF1aXJlZFwiKVxuICAgICAgLmRlc2NyaWJlKFxuICAgICAgICBzdHJpbmdVdGlscy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgICBHZW5pZSBcXGBzdGF0ZW1lbnRfaWRcXGAgdG8gY2hhcnQuIFJlYWQgZnJvbVxuICAgICAgICAgIFxcYG1lc3NhZ2UucXVlcnlfcmVzdWx0LnN0YXRlbWVudF9pZFxcYCBvclxuICAgICAgICAgIFxcYG1lc3NhZ2UuYXR0YWNobWVudHNbKl0ucXVlcnkuc3RhdGVtZW50X2lkXFxgIHJldHVybmVkIGJ5XG4gICAgICAgICAgXFxgYXNrX2dlbmllXFxgLlxuICAgICAgICBgKSxcbiAgICAgICksXG4gICAgdGl0bGU6IGNoYXJ0UGxhbm5lclJlcXVlc3RTY2hlbWEuc2hhcGUudGl0bGUub3B0aW9uYWwoKSxcbiAgfSk7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHRvb2wgaWRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogU3VmZml4IGFwcGVuZGVkIHRvIHBlci1zcGFjZSB0b29sIGlkcyB3aGVuIHRoZSBhbGlhcyBpc24ndCB0aGVcbiAqIHdlbGwta25vd24gYGRlZmF1bHRgLiBTaW5nbGUtc3BhY2UgZGVwbG95bWVudHMgZ2V0IHRoZSBiYXJlXG4gKiBuYW1lcyAoYGFza19nZW5pZWAsIGBnZXRfc3BhY2VfZGVzY3JpcHRpb25gLCAuLi4pOyBtdWx0aS1zcGFjZVxuICogZGVwbG95bWVudHMgZ2V0IGBhc2tfZ2VuaWVfPGFsaWFzPmAgZXRjLiBzbyBlYWNoIHNwYWNlJ3MgdG9vbHNcbiAqIHN0YXkgZGlzYW1iaWd1YXRlZCBpbiB0aGUgY2VudHJhbCBhZ2VudCdzIHRvb2wgcmVnaXN0cnkuXG4gKi9cbmZ1bmN0aW9uIGFsaWFzU3VmZml4KGFsaWFzOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoYWxpYXMgPT09IERFRkFVTFRfR0VOSUVfQUxJQVMpIHJldHVybiBcIlwiO1xuICBjb25zdCBzbHVnID0gc3RyaW5nVXRpbHMudG9JZGVudGlmaWVyKGFsaWFzKTtcbiAgcmV0dXJuIHNsdWcgPyBgXyR7c2x1Z31gIDogXCJcIjtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBlci1zcGFjZSB0b29scyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBEcm9wIGBzdWdnZXN0ZWRfcXVlc3Rpb25zYCBhdHRhY2htZW50cyBmcm9tIGEge0BsaW5rIEdlbmllTWVzc2FnZX1cbiAqIGJlZm9yZSBoYW5kaW5nIGl0IHRvIHRoZSBjZW50cmFsIExMTS4gVGhvc2UgZW50cmllcyBhbHJlYWR5XG4gKiBzdXJmYWNlIGluIHRoZSBVSSBhcyBvbmUtdGFwIHBpbGxzIHZpYSB0aGUgd3JpdGVyJ3NcbiAqIGBzdWdnZXN0ZWRfcXVlc3Rpb25zYCBldmVudHMgKHNlZSBgY29sbGVjdFN1Z2dlc3Rpb25zYCBvbiB0aGVcbiAqIGNsaWVudCk7IGlmIHdlIGxldCB0aGVtIHJpZGUgYmFjayBpbiB0aGUgdG9vbCByZXN1bHQgdGhlIExMTVxuICogdGVuZHMgdG8gcXVvdGUgdGhlbSBpbmxpbmUgaW4gaXRzIHByb3NlLCBkb3VibGUtc2hvd2luZyB0aGVcbiAqIHNhbWUgcXVlc3Rpb25zIGFuZCBzdGVwcGluZyBvbiB0aGUgZGVkaWNhdGVkIHN1Z2dlc3Rpb24gVUkuXG4gKiBRdWVyeSAvIHRleHQgLyByb3cgYXR0YWNobWVudHMgYXJlIHByZXNlcnZlZCBzbyB0aGUgbW9kZWwgY2FuXG4gKiBzdGlsbCByZWFkIGBzdGF0ZW1lbnRfaWRgLCBTUUwsIGFuZCB0aGUgYW5zd2VyIHRleHQuXG4gKi9cbmZ1bmN0aW9uIHN0cmlwU3VnZ2VzdGVkUXVlc3Rpb25zKG1lc3NhZ2U6IEdlbmllTWVzc2FnZSk6IEdlbmllTWVzc2FnZSB7XG4gIGNvbnN0IGF0dGFjaG1lbnRzID0gbWVzc2FnZS5hdHRhY2htZW50cztcbiAgaWYgKCFhdHRhY2htZW50cyB8fCBhdHRhY2htZW50cy5sZW5ndGggPT09IDApIHJldHVybiBtZXNzYWdlO1xuICBjb25zdCBmaWx0ZXJlZCA9IGF0dGFjaG1lbnRzLmZpbHRlcigoYXR0KSA9PiAhYXR0LnN1Z2dlc3RlZF9xdWVzdGlvbnMpO1xuICBpZiAoZmlsdGVyZWQubGVuZ3RoID09PSBhdHRhY2htZW50cy5sZW5ndGgpIHJldHVybiBtZXNzYWdlO1xuICByZXR1cm4geyAuLi5tZXNzYWdlLCBhdHRhY2htZW50czogZmlsdGVyZWQgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRBc2tHZW5pZVRvb2wob3B0czoge1xuICBzcGFjZUlkOiBzdHJpbmc7XG4gIGFsaWFzOiBzdHJpbmc7XG4gIGhpbnQ/OiBzdHJpbmc7XG4gIGFnZW50TW9kZT86IGJvb2xlYW47XG59KSB7XG4gIGNvbnN0IHsgc3BhY2VJZCwgYWxpYXMsIGhpbnQsIGFnZW50TW9kZSB9ID0gb3B0cztcbiAgY29uc3QgdG9vbElkID0gYGFza19nZW5pZSR7YWxpYXNTdWZmaXgoYWxpYXMpfWA7XG4gIGNvbnN0IGhpbnRMaW5lID0gaGludCA/IGAgKCR7aGludH0pYCA6IFwiXCI7XG4gIHJldHVybiBjcmVhdGVUb29sKHtcbiAgICBpZDogdG9vbElkLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdVdGlscy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgIEFzayB0aGUgR2VuaWUgc3BhY2UgXCIke2FsaWFzfVwiJHtoaW50TGluZX0gT05FIGZvY3VzZWRcbiAgICAgIG5hdHVyYWwtbGFuZ3VhZ2Ugc3ViLXF1ZXN0aW9uIGFuZCB3YWl0IGZvciB0aGUgdHVybiB0b1xuICAgICAgY29tcGxldGUuIEdlbmllIGFuc3dlcnMgYmVzdCB3aGVuIGVhY2ggY2FsbCBjb3ZlcnMgYVxuICAgICAgc2luZ2xlIG1ldHJpYyAvIGRpbWVuc2lvbiAvIHRpbWUgd2luZG93LCBzbyBleHBlY3QgdG9cbiAgICAgIGNhbGwgdGhpcyB0b29sIE1VTFRJUExFIFRJTUVTIHBlciB1c2VyIHR1cm4gKHR5cGljYWxseVxuICAgICAgdHdvIHRvIHNpeCkuIEluZGVwZW5kZW50IHN1Yi1xdWVzdGlvbnMgbWF5IGJlIGNhbGxlZCBpblxuICAgICAgUEFSQUxMRUw7IGNhbGxzIHRoYXQgZGVwZW5kIG9uIGFuIGVhcmxpZXIgYW5zd2VyIHNob3VsZCBzdGF5XG4gICAgICBzZXF1ZW50aWFsLiBQYXJhbGxlbCBjYWxscyB1c2UgaXNvbGF0ZWQgR2VuaWUgY29udmVyc2F0aW9ucyxcbiAgICAgIHdoaWxlIHNlcXVlbnRpYWwgY2FsbHMgcmV0YWluIHRoZSByZXVzYWJsZSBjb252ZXJzYXRpb24gY29udGV4dC5cbiAgICAgIFRoaXMgaXMgdGhlIG5vcm1hbCBwYXR0ZXJuLCBub3QgdGhlIGV4Y2VwdGlvbi5cbiAgICAgIERvIE5PVCB0cnkgdG8gY3JhbSBhIG11bHRpLXBhcnQgcXVlc3Rpb24gaW50byBhIHNpbmdsZVxuICAgICAgY2FsbDsgZGVjb21wb3NlIGZpcnN0LCB0aGVuIGFzayBlYWNoIHBpZWNlLlxuXG4gICAgICBSZXR1cm5zIHRoZSBmaW5hbCBcXGBHZW5pZU1lc3NhZ2VcXGAuIEFnZW50IE1vZGUgaW5jbHVkZXMgdGhlXG4gICAgICBzeW50aGVzaXplZCBhbnN3ZXIgYW5kIGNhbiBpbmNsdWRlIFNRTCByZXN1bHQgdmFsdWVzIGFzIGFcbiAgICAgIE1hcmtkb3duIHRleHQgYXR0YWNobWVudC4gQWdlbnQgTW9kZSBoYXMgbm8gXFxgc3RhdGVtZW50X2lkXFxgO1xuICAgICAgdXNlIFxcYHJlbmRlcl9kYXRhXFxgIHdpdGggaXRzIGlubGluZSByb3dzIHdoZW4gYSBjaGFydCBpcyBuZWVkZWQuXG4gICAgICBBIGxlZ2FjeSBwb2xsaW5nIHJlc3VsdCBpbnN0ZWFkIGNhcnJpZXMgYSBcXGBzdGF0ZW1lbnRfaWRcXGAgKGF0XG4gICAgICBcXGBtZXNzYWdlLnF1ZXJ5X3Jlc3VsdC5zdGF0ZW1lbnRfaWRcXGAgb3IgdGhlIGZpcnN0XG4gICAgICBhdHRhY2htZW50J3MgXFxgcXVlcnkuc3RhdGVtZW50X2lkXFxgKTsgY2FsbFxuICAgICAgXFxgZ2V0X3N0YXRlbWVudFxcYCB3aXRoIHRoYXQgaWQgb25seSB3aGVuIHlvdSBuZWVkIHRvIHJlYWRcbiAgICAgIHRoZSB1bmRlcmx5aW5nIHZhbHVlcyB0byByZWFzb24gYWJvdXQgdGhlbS4gSWYgeW91IGp1c3Qgd2FudFxuICAgICAgdG8gZGlzcGxheSBhIGxlZ2FjeSByZXN1bHQsIGVtYmVkIGFcbiAgICAgIFxcYFtkYXRhOjxzdGF0ZW1lbnRfaWQ+XVxcYCBtYXJrZXIgaW4gcHJvc2UuIFdpcmUgZXZlbnRzXG4gICAgICAoc3RhdHVzLCByZWFzb25pbmcsIFNRTCwgcXVlcnkgb3V0cHV0LCBhbnN3ZXIgdGV4dCkgc3RyZWFtXG4gICAgICBhdXRvbWF0aWNhbGx5IHdoaWxlIHRoZSBjYWxsIGlzIGluIGZsaWdodC5cbiAgICBgKSxcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgcXVlc3Rpb246IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5taW4oMSwgXCJxdWVzdGlvbiBpcyByZXF1aXJlZFwiKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gICAgICAgICAgICBPTkUgZm9jdXNlZCBuYXR1cmFsLWxhbmd1YWdlIHF1ZXN0aW9uIGFib3V0IHRoZSBkYXRhIGluIHRoaXNcbiAgICAgICAgICAgIHNwYWNlLCBjb3ZlcmluZyBhIHNpbmdsZSBtZXRyaWMgLyBkaW1lbnNpb24gLyB0aW1lIHdpbmRvd1xuICAgICAgICAgICAgKGUuZy4gXCJXaGF0IHdhcyBRMyByZXZlbnVlIGJ5IHJlZ2lvbj9cIikuIERlY29tcG9zZSBhXG4gICAgICAgICAgICBtdWx0aS1wYXJ0IGFzayBpbnRvIHNlcGFyYXRlIGNhbGxzIHJhdGhlciB0aGFuIGNvbWJpbmluZyBpdFxuICAgICAgICAgICAgaGVyZS5cbiAgICAgICAgICBgKSxcbiAgICAgICAgKSxcbiAgICB9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIG1lc3NhZ2U6IGdlbmllTW9kZWwuR2VuaWVNZXNzYWdlU2NoZW1hLFxuICAgIH0pLFxuICAgIGV4ZWN1dGU6IGFzeW5jICh7IHF1ZXN0aW9uIH0sIGN0eFJhdykgPT4ge1xuICAgICAgY29uc3QgY3R4ID0gY3R4UmF3IGFzIFRvb2xFeGVjdXRlQ3R4O1xuICAgICAgc3RhbXBHZW5pZVRvb2xTcGFuKCk7XG4gICAgICBjb25zdCB7IGNsaWVudCwgcmVxdWVzdENvbnRleHQgfSA9IHJlcXVpcmVDbGllbnQoY3R4LCB0b29sSWQpO1xuICAgICAgY29uc3Qgd3JpdGVyID0gY3R4Py53cml0ZXI7XG4gICAgICBjb25zdCB0b29sQ2FsbElkID0gY3R4Py5hZ2VudD8udG9vbENhbGxJZDtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IGN0eD8uYWJvcnRTaWduYWw7XG4gICAgICBjb25zdCB0aHJlYWRJZCA9IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVEhSRUFEX0lEX0tFWSkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgICAvLyBCb3VuY2UgcGxhY2Vob2xkZXIgLyBuby1vcCBxdWVzdGlvbnMgQkVGT1JFIHNwZW5kaW5nIGEgR2VuaWVcbiAgICAgIC8vIHJvdW5kLXRyaXAgb24gdGhlbS4gR2VuaWUgYW5zd2VycyBhbnkgb2YgdGhlc2Ugd2l0aCBcIllvdXJcbiAgICAgIC8vIHJlcXVlc3QgJ25vb3AnIGRvZXMgbm90IHJlbGF0ZSB0by4uLlwiIC0gdXNlbGVzcyBub2lzZSB0aGF0XG4gICAgICAvLyBzaG93cyB1cCBpbiB0aGUgVUkgYW5kIGVhdHMgb25lIG9mIHRoZSB3b3Jrc3BhY2UncyA1XG4gICAgICAvLyBxdWVzdGlvbnMvbWludXRlLiBSZXR1cm5pbmcgYSBjbGVhciBlcnJvciBoZXJlIHN1cmZhY2VzIHRoZVxuICAgICAgLy8gaXNzdWUgdG8gdGhlIGFnZW50IGxvb3Agc28gdGhlIG1vZGVsIGNvcnJlY3RzIGNvdXJzZSBpbnN0ZWFkXG4gICAgICAvLyBvZiB3YXN0aW5nIGEgdHVybi5cbiAgICAgIGNvbnN0IHRyaW1tZWQgPSBxdWVzdGlvbi50cmltKCk7XG4gICAgICBpZiAodHJpbW1lZC5sZW5ndGggPT09IDAgfHwgUExBQ0VIT0xERVJfUVVFU1RJT05TLmhhcyh0cmltbWVkLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgIHRocm93IFZhbGlkYXRpb25FcnJvci5pbnZhbGlkVmFsdWUoXG4gICAgICAgICAgYCR7dG9vbElkfS5xdWVzdGlvbmAsXG4gICAgICAgICAgcXVlc3Rpb24sXG4gICAgICAgICAgXCJhIHJlYWwgbmF0dXJhbC1sYW5ndWFnZSBxdWVzdGlvbiwgbm90IGEgcGxhY2Vob2xkZXI7IHNraXAgdGhlIGNhbGwgaW5zdGVhZFwiLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdGF0ZSA9IGNvbnZlcnNhdGlvblN0YXRlKHJlcXVlc3RDb250ZXh0LCBzcGFjZUlkKTtcbiAgICAgIGNvbnN0IG93bnNSZXVzYWJsZUNvbnZlcnNhdGlvbiA9IHJlc2VydmVDb252ZXJzYXRpb24oc3RhdGUpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gT25seSB0aGUgcmVzZXJ2ZWQgbGFuZSBzZWVkcyBhbmQgdXBkYXRlcyB0aGUgdGhyZWFkJ3MgcmV1c2FibGVcbiAgICAgICAgLy8gY29udmVyc2F0aW9uLiBDb25jdXJyZW50IGxhbmVzIGRlbGliZXJhdGVseSBzdGFydCBmcmVzaCBjb252ZXJzYXRpb25zLlxuICAgICAgICBjb25zdCBjYWNoZUtleSA9IG93bnNSZXVzYWJsZUNvbnZlcnNhdGlvblxuICAgICAgICAgID8gYXdhaXQgY29udmVyc2F0aW9uQ2FjaGVLZXkoc3BhY2VJZCwgdGhyZWFkSWQsIHJlc29sdmVVc2VyS2V5KHJlcXVlc3RDb250ZXh0KSlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKG93bnNSZXVzYWJsZUNvbnZlcnNhdGlvbikge1xuICAgICAgICAgIGF3YWl0IGVuc3VyZUNvbnZlcnNhdGlvblNlZWRlZChzdGF0ZSwgY2FjaGVLZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRWFjaCBpbnZvY2F0aW9uIGtlZXBzIGl0cyBjb252ZXJzYXRpb24gaWQgbG9jYWxseS4gT25seSB0aGUgcmV1c2FibGVcbiAgICAgICAgLy8gbGFuZSBwdWJsaXNoZXMgdXBkYXRlcyB0byBzaGFyZWQgcmVxdWVzdCBhbmQgY3Jvc3MtcmVxdWVzdCBzdGF0ZS5cbiAgICAgICAgbGV0IGNvbnZlcnNhdGlvbklkID0gb3duc1JldXNhYmxlQ29udmVyc2F0aW9uID8gc3RhdGUuY29udmVyc2F0aW9uSWQgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgY29uc3Qgc3RhcnRlZEV2ZW50OiBTdGFydGVkRXZlbnQgPSB7XG4gICAgICAgICAgdHlwZTogXCJzdGFydGVkXCIsXG4gICAgICAgICAgc3BhY2VJZCxcbiAgICAgICAgICBjb250ZW50OiBxdWVzdGlvbixcbiAgICAgICAgfTtcbiAgICAgICAgYXdhaXQgc2FmZVdyaXRlUHJvZ3Jlc3MobG9nZ2VyLCB3cml0ZXIsIHRvb2xDYWxsSWQsIHN0YXJ0ZWRFdmVudCk7XG5cbiAgICAgICAgY29uc3QgcnVuVHVybiA9IGFzeW5jICgpOiBQcm9taXNlPEdlbmllTWVzc2FnZT4gPT4ge1xuICAgICAgICAgIGNvbnN0IHNlZWRDb252ZXJzYXRpb25JZCA9IGNvbnZlcnNhdGlvbklkO1xuICAgICAgICAgIGxldCBmaW5hbE1lc3NhZ2U6IEdlbmllTWVzc2FnZSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGV2ZW50IG9mIGNoYXQuZ2VuaWVFdmVudENoYXQoc3BhY2VJZCwgcXVlc3Rpb24sIHtcbiAgICAgICAgICAgIHdvcmtzcGFjZUNsaWVudDogY2xpZW50LFxuICAgICAgICAgICAgLi4uKGFnZW50TW9kZSAhPT0gdW5kZWZpbmVkID8geyBhZ2VudE1vZGUgfSA6IHt9KSxcbiAgICAgICAgICAgIC4uLihzZWVkQ29udmVyc2F0aW9uSWQgPyB7IGNvbnZlcnNhdGlvbklkOiBzZWVkQ29udmVyc2F0aW9uSWQgfSA6IHt9KSxcbiAgICAgICAgICAgIC4uLihzaWduYWwgPyB7IGNvbnRleHQ6IHNpZ25hbCB9IDoge30pLFxuICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQudHlwZSAhPT0gXCJtZXNzYWdlXCIpIHtcbiAgICAgICAgICAgICAgYXdhaXQgc2FmZVdyaXRlUHJvZ3Jlc3MobG9nZ2VyLCB3cml0ZXIsIHRvb2xDYWxsSWQsIGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGV2ZW50Q29udmVyc2F0aW9uSWQgPSBldmVudC5jb252ZXJzYXRpb25faWQ7XG4gICAgICAgICAgICBpZiAoZXZlbnRDb252ZXJzYXRpb25JZCkge1xuICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCA9IGV2ZW50Q29udmVyc2F0aW9uSWQ7XG4gICAgICAgICAgICAgIGlmIChvd25zUmV1c2FibGVDb252ZXJzYXRpb24pIHN0YXRlLmNvbnZlcnNhdGlvbklkID0gZXZlbnRDb252ZXJzYXRpb25JZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChldmVudC50eXBlID09PSBcInJlc3VsdFwiKSB7XG4gICAgICAgICAgICAgIGZpbmFsTWVzc2FnZSA9IGV2ZW50Lm1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghZmluYWxNZXNzYWdlKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGVjdXRpb25FcnJvci5taXNzaW5nRGF0YShcIkdlbmllIHJlc3VsdCBldmVudFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZpbmFsTWVzc2FnZTtcbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgZmluYWxNZXNzYWdlOiBHZW5pZU1lc3NhZ2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZmluYWxNZXNzYWdlID0gYXdhaXQgcnVuVHVybigpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAvLyBBIHJlamVjdGVkIGNvbnZlcnNhdGlvbiBpZCBpcyBzdGFsZSBvciBpbmFjY2Vzc2libGUuIFJlc2V0IHRoaXNcbiAgICAgICAgICAvLyBsYW5lIGFuZCByZXRyeSBvbmNlIHdpdGggYSBmcmVzaCBHZW5pZSBjb252ZXJzYXRpb24uXG4gICAgICAgICAgY29uc3QgcmVqZWN0ZWRDb252ZXJzYXRpb25JZCA9IGNvbnZlcnNhdGlvbklkO1xuICAgICAgICAgIGlmIChyZWplY3RlZENvbnZlcnNhdGlvbklkICYmIGVycm9yVXRpbHMuZXJyb3JDb250ZXh0KGVycikubm90QWNjZXNzaWJsZSkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJjb252ZXJzYXRpb24tY2FjaGU6c3RhbGUsIHJlc2V0dGluZ1wiLCB7XG4gICAgICAgICAgICAgIHNwYWNlSWQsXG4gICAgICAgICAgICAgIGNvbnZlcnNhdGlvbklkOiByZWplY3RlZENvbnZlcnNhdGlvbklkLFxuICAgICAgICAgICAgICBlcnJvcjogZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKG93bnNSZXVzYWJsZUNvbnZlcnNhdGlvbikge1xuICAgICAgICAgICAgICBhd2FpdCBldmljdENhY2hlZENvbnZlcnNhdGlvbklkKGNhY2hlS2V5KTtcbiAgICAgICAgICAgICAgc3RhdGUuY29udmVyc2F0aW9uSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb252ZXJzYXRpb25JZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGZpbmFsTWVzc2FnZSA9IGF3YWl0IHJ1blR1cm4oKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvd25zUmV1c2FibGVDb252ZXJzYXRpb24pIHtcbiAgICAgICAgICBhd2FpdCBzYXZlQ2FjaGVkQ29udmVyc2F0aW9uSWQoY2FjaGVLZXksIGNvbnZlcnNhdGlvbklkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IG1lc3NhZ2U6IHN0cmlwU3VnZ2VzdGVkUXVlc3Rpb25zKGZpbmFsTWVzc2FnZSkgfTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChvd25zUmV1c2FibGVDb252ZXJzYXRpb24pIHN0YXRlLnJldXNhYmxlQ29udmVyc2F0aW9uSW5GbGlnaHQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRTcGFjZURlc2NyaXB0aW9uVG9vbChvcHRzOiB7IHNwYWNlSWQ6IHN0cmluZzsgYWxpYXM6IHN0cmluZyB9KSB7XG4gIGNvbnN0IHsgc3BhY2VJZCwgYWxpYXMgfSA9IG9wdHM7XG4gIGNvbnN0IHRvb2xJZCA9IGBnZXRfc3BhY2VfZGVzY3JpcHRpb24ke2FsaWFzU3VmZml4KGFsaWFzKX1gO1xuICByZXR1cm4gY3JlYXRlVG9vbCh7XG4gICAgaWQ6IHRvb2xJZCxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gICAgICBSZXR1cm4gdGhlIEdlbmllIHNwYWNlIFwiJHthbGlhc31cIidzIHRpdGxlLCBkZXNjcmlwdGlvbiwgYW5kXG4gICAgICB3YXJlaG91c2UgaWQuIENoZWFwIChzaW5nbGUgUkVTVCBjYWxsLCBubyBMTE0gcm91bmQtdHJpcCkuXG4gICAgICBDYWxsIHRoaXMgRklSU1Qgb24gYW55IHVzZXIgdHVybiB0aGF0J3MgZ29pbmcgdG8gdG91Y2hcbiAgICAgIFxcYGFza19nZW5pZVxcYCwgdW5sZXNzIHRoZSBzYW1lIGRlc2NyaXB0aW9uIGFscmVhZHkgbGFuZGVkXG4gICAgICBlYXJsaWVyIGluIHRoaXMgY29udmVyc2F0aW9uIC0gdGhlIHRpdGxlICsgZGVzY3JpcHRpb24gdGVsbFxuICAgICAgeW91IHdoYXQgdGFibGVzLCBtZXRyaWNzLCBhbmQgdGltZSB3aW5kb3dzIHRoZSBzcGFjZVxuICAgICAgYWN0dWFsbHkgY292ZXJzLCB3aGljaCBpcyB3aGF0IGxldHMgeW91IGRlY29tcG9zZSB0aGVcbiAgICAgIHVzZXIncyBxdWVzdGlvbiBpbnRvIHRoZSByaWdodCBcXGBhc2tfZ2VuaWVcXGAgc3ViLXF1ZXN0aW9ucy5cbiAgICBgKSxcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe30pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgc3BhY2VJZDogei5zdHJpbmcoKSxcbiAgICAgIHRpdGxlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBkZXNjcmlwdGlvbjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgd2FyZWhvdXNlSWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgICBleGVjdXRlOiBhc3luYyAoX2lucHV0LCBjdHhSYXcpID0+IHtcbiAgICAgIGNvbnN0IGN0eCA9IGN0eFJhdyBhcyBUb29sRXhlY3V0ZUN0eDtcbiAgICAgIGNvbnN0IHsgY2xpZW50IH0gPSByZXF1aXJlQ2xpZW50KGN0eCwgdG9vbElkKTtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IGN0eD8uYWJvcnRTaWduYWw7XG4gICAgICAvLyBSb3V0ZSB0aHJvdWdoIHRoZSBwYWNrYWdlJ3MgY2VudHJhbCBHZW5pZSBzcGFjZSBmZXRjaC4gVGhlXG4gICAgICAvLyBkZXNjcmlwdGlvbiBzdXJmYWNlICh0aXRsZSAvIGRlc2NyaXB0aW9uIC8gd2FyZWhvdXNlIGlkKSBsaXZlc1xuICAgICAgLy8gb24gdGhlIGRpcmVjdG9yeS1saXN0aW5nIHNoYXBlLCBzbyBza2lwIHRoZSBsYXJnZXJcbiAgICAgIC8vIGBzZXJpYWxpemVkX3NwYWNlYCBwYXlsb2FkIGhlcmUuXG4gICAgICBjb25zdCBzcGFjZSA9IGF3YWl0IGdlbmllU3BhY2UuZ2V0R2VuaWVTcGFjZShzcGFjZUlkLCB7XG4gICAgICAgIHdvcmtzcGFjZUNsaWVudDogY2xpZW50LFxuICAgICAgICBzZXJpYWxpemVkOiBmYWxzZSxcbiAgICAgICAgLi4uKHNpZ25hbCA/IHsgY29udGV4dDogc2lnbmFsIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNwYWNlSWQsXG4gICAgICAgIC4uLihzcGFjZS50aXRsZSA/IHsgdGl0bGU6IHNwYWNlLnRpdGxlIH0gOiB7fSksXG4gICAgICAgIC4uLihzcGFjZS5kZXNjcmlwdGlvbiA/IHsgZGVzY3JpcHRpb246IHNwYWNlLmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAgIC4uLihzcGFjZS53YXJlaG91c2VfaWQgPyB7IHdhcmVob3VzZUlkOiBzcGFjZS53YXJlaG91c2VfaWQgfSA6IHt9KSxcbiAgICAgIH07XG4gICAgfSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU3BhY2VTZXJpYWxpemVkVG9vbChvcHRzOiB7IHNwYWNlSWQ6IHN0cmluZzsgYWxpYXM6IHN0cmluZyB9KSB7XG4gIGNvbnN0IHsgc3BhY2VJZCwgYWxpYXMgfSA9IG9wdHM7XG4gIGNvbnN0IHRvb2xJZCA9IGBnZXRfc3BhY2Vfc2VyaWFsaXplZCR7YWxpYXNTdWZmaXgoYWxpYXMpfWA7XG4gIHJldHVybiBjcmVhdGVUb29sKHtcbiAgICBpZDogdG9vbElkLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdVdGlscy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgIFJldHVybiB0aGUgZnVsbCBcXGBHZW5pZVNwYWNlXFxgIEpTT04gZm9yIHRoZSBcIiR7YWxpYXN9XCIgc3BhY2UuXG4gICAgICBVc2Ugb25seSB3aGVuIHlvdSBuZWVkIGV4YWN0IGNvbHVtbiAvIHRhYmxlIGlkZW50aWZpZXJzXG4gICAgICBcXGBnZXRfc3BhY2VfZGVzY3JpcHRpb25cXGAgZG9lc24ndCBleHBvc2UuIExhcmdlciBwYXlsb2FkLCBzb1xuICAgICAgcHJlZmVyIHRoZSBkZXNjcmlwdGlvbiB0b29sIHdoZW4gaXQncyBlbm91Z2guXG4gICAgYCksXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHt9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHsgc3BhY2U6IHoudW5rbm93bigpIH0pLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChfaW5wdXQsIGN0eFJhdykgPT4ge1xuICAgICAgY29uc3QgY3R4ID0gY3R4UmF3IGFzIFRvb2xFeGVjdXRlQ3R4O1xuICAgICAgY29uc3QgeyBjbGllbnQgfSA9IHJlcXVpcmVDbGllbnQoY3R4LCB0b29sSWQpO1xuICAgICAgY29uc3Qgc2lnbmFsID0gY3R4Py5hYm9ydFNpZ25hbDtcbiAgICAgIC8vIENlbnRyYWwgR2VuaWUgc3BhY2UgZmV0Y2ggd2l0aCB0aGUgb3B0LWluIGBzZXJpYWxpemVkX3NwYWNlYFxuICAgICAgLy8gYmxvYiAoY2F0YWxvZ3MsIHRhYmxlcywgc2FtcGxlIHF1ZXN0aW9ucywgcHJvbXB0cykgdGhhdCB0aGVcbiAgICAgIC8vIHR5cGVkIFNESyBgZ2V0U3BhY2VgIG9taXRzIC0gdGhlIHdob2xlIHBvaW50IG9mIHRoaXMgdG9vbC5cbiAgICAgIGNvbnN0IHNwYWNlID0gYXdhaXQgZ2VuaWVTcGFjZS5nZXRHZW5pZVNwYWNlKHNwYWNlSWQsIHtcbiAgICAgICAgd29ya3NwYWNlQ2xpZW50OiBjbGllbnQsXG4gICAgICAgIC4uLihzaWduYWwgPyB7IGNvbnRleHQ6IHNpZ25hbCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4geyBzcGFjZSB9O1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc2hhcmVkIHRvb2xzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIERlZmF1bHQgcm93IGNhcCBmb3Ige0BsaW5rIGJ1aWxkR2V0U3RhdGVtZW50VG9vbH0gd2hlbiB0aGUgYWdlbnRcbiAqIGRvZXNuJ3Qgc3VwcGx5IGEgYGxpbWl0YC4gU2l6ZWQgdG8ga2VlcCByZXN1bHQgc2V0cyBvdXQgb2YgdGhlXG4gKiBtb2RlbCBjb250ZXh0IHVubGVzcyB0aGUgYWdlbnQgZXhwbGljaXRseSBvcHRzIGludG8gbW9yZSByb3dzIC1cbiAqIHRoZSBjaGVhcCBzaGFwZSAoY29sdW1uIG5hbWVzICsgYSBoYW5kZnVsIG9mIHJlcHJlc2VudGF0aXZlXG4gKiByb3dzKSBpcyB1c3VhbGx5IGVub3VnaCB0byByZWFzb24gYWJvdXQgYSBxdWVyeS5cbiAqL1xuY29uc3QgREVGQVVMVF9TVEFURU1FTlRfTElNSVQgPSA1MDtcblxuZnVuY3Rpb24gYnVpbGRHZXRTdGF0ZW1lbnRUb29sKCkge1xuICBjb25zdCB0b29sSWQgPSBcImdldF9zdGF0ZW1lbnRcIjtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkOiB0b29sSWQsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oYFxuICAgICAgRmV0Y2ggdGhlIHJvd3Mgb2YgYSBHZW5pZSBzdGF0ZW1lbnQgYnkgaXRzIFxcYHN0YXRlbWVudF9pZFxcYCAodGhlXG4gICAgICB2YWx1ZSBhdCBcXGBtZXNzYWdlLnF1ZXJ5X3Jlc3VsdC5zdGF0ZW1lbnRfaWRcXGAgb3JcbiAgICAgIFxcYG1lc3NhZ2UuYXR0YWNobWVudHNbKl0ucXVlcnkuc3RhdGVtZW50X2lkXFxgIHJldHVybmVkIGZyb21cbiAgICAgIFxcYGFza19nZW5pZVxcYCkuIFVzZSB0aGlzIE9OTFkgd2hlbiB5b3UgbmVlZCB0byByZWFkIHRoZSB1bmRlcmx5aW5nXG4gICAgICB2YWx1ZXMgdG8gcmVhc29uIGFib3V0IHRoZW0gaW4geW91ciByZXBseSAtIGUuZy4gbmFtaW5nIHRoZVxuICAgICAgbGFyZ2VzdCByb3csIGNvbXB1dGluZyBhIGRlbHRhIHRoZSB2aXN1YWxpemF0aW9uIHdvdWxkbid0IGFscmVhZHlcbiAgICAgIGNvbnZleSwgb3IgZmlsdGVyaW5nIGRvd24gdG8gYSBzcGVjaWZpYyByZWNvcmQuIElmIHlvdSdkIGp1c3QgYmVcbiAgICAgIHJlY2l0aW5nIG51bWJlcnMgdGhlIHVzZXIgd2lsbCBzZWUgYW55d2F5LCBza2lwIHRoZSBjYWxsIGFuZFxuICAgICAgZW1iZWQgYSBcXGBbZGF0YTo8c3RhdGVtZW50X2lkPl1cXGAgbWFya2VyIGluIHlvdXIgcHJvc2UgaW5zdGVhZDtcbiAgICAgIHRoZSBob3N0IFVJIGZldGNoZXMgYW5kIHJlbmRlcnMgdGhlIHJvd3Mgb24gaXRzIG93bi4gXFxgbGltaXRcXGBcbiAgICAgIGNhcHMgdGhlIG51bWJlciBvZiByb3dzIHJldHVybmVkIChkZWZhdWx0cyB0b1xuICAgICAgJHtERUZBVUxUX1NUQVRFTUVOVF9MSU1JVH0pLiBcXGByb3dDb3VudFxcYCByZWZsZWN0cyB0aGUgZnVsbFxuICAgICAgdXBzdHJlYW0gdG90YWwgLSBjb21wYXJlIHRvIFxcYHJvd3MubGVuZ3RoXFxgIHRvIGRldGVjdCB0cnVuY2F0aW9uLlxuICAgIGApLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBzdGF0ZW1lbnRfaWQ6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5taW4oMSwgXCJzdGF0ZW1lbnRfaWQgaXMgcmVxdWlyZWRcIilcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICAgICAgR2VuaWUgXFxgc3RhdGVtZW50X2lkXFxgIHdob3NlIHJvd3MgdG8gcmVhZC4gVGFrZSBpdCBmcm9tXG4gICAgICAgICAgICBcXGBtZXNzYWdlLnF1ZXJ5X3Jlc3VsdC5zdGF0ZW1lbnRfaWRcXGAgb3JcbiAgICAgICAgICAgIFxcYG1lc3NhZ2UuYXR0YWNobWVudHNbKl0ucXVlcnkuc3RhdGVtZW50X2lkXFxgIG9uIGFuXG4gICAgICAgICAgICBcXGBhc2tfZ2VuaWVcXGAgcmVzdWx0OyBpdCBpcyBuZXZlciBhIHZhbHVlIHlvdSBjb25zdHJ1Y3QuXG4gICAgICAgICAgYCksXG4gICAgICAgICksXG4gICAgICBsaW1pdDogelxuICAgICAgICAubnVtYmVyKClcbiAgICAgICAgLmludCgpXG4gICAgICAgIC5ub25uZWdhdGl2ZSgpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIk1heCByb3dzIHRvIHJldHVybi4gRGVmYXVsdHMgdG8gYSBzbWFsbCBzYW1wbGU7IHJhaXNlIG9ubHkgd2hlbiBtb3JlIHJvd3MgYXJlIGdlbnVpbmVseSBuZWVkZWQuXCIsXG4gICAgICAgICksXG4gICAgfSksXG4gICAgb3V0cHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBjb2x1bW5zOiB6LmFycmF5KHouc3RyaW5nKCkpLFxuICAgICAgcm93czogei5hcnJheSh6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkpLFxuICAgICAgcm93Q291bnQ6IHoubnVtYmVyKCksXG4gICAgICB0cnVuY2F0ZWQ6IHouYm9vbGVhbigpLFxuICAgIH0pLFxuICAgIGV4ZWN1dGU6IGFzeW5jICh7IHN0YXRlbWVudF9pZCwgbGltaXQgfSwgY3R4UmF3KSA9PiB7XG4gICAgICBjb25zdCBjdHggPSBjdHhSYXcgYXMgVG9vbEV4ZWN1dGVDdHg7XG4gICAgICBjb25zdCB7IGNsaWVudCB9ID0gcmVxdWlyZUNsaWVudChjdHgsIHRvb2xJZCk7XG4gICAgICBjb25zdCBzaWduYWwgPSBjdHg/LmFib3J0U2lnbmFsO1xuICAgICAgY29uc3QgZWZmZWN0aXZlTGltaXQgPSBsaW1pdCA/PyBERUZBVUxUX1NUQVRFTUVOVF9MSU1JVDtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBmZXRjaFN0YXRlbWVudERhdGEoY2xpZW50LCBzdGF0ZW1lbnRfaWQsIHtcbiAgICAgICAgbGltaXQ6IGVmZmVjdGl2ZUxpbWl0LFxuICAgICAgICAuLi4oc2lnbmFsID8geyBzaWduYWwgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29sdW1uczogZGF0YS5jb2x1bW5zLFxuICAgICAgICByb3dzOiBkYXRhLnJvd3MsXG4gICAgICAgIHJvd0NvdW50OiBkYXRhLnJvd0NvdW50LFxuICAgICAgICB0cnVuY2F0ZWQ6IGRhdGEucm93cy5sZW5ndGggPCBkYXRhLnJvd0NvdW50LFxuICAgICAgfTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBgcHJlcGFyZV9jaGFydGAgTWFzdHJhIHRvb2wuIFRoaW4gd3JhcHBlciBvdmVyXG4gKiB7QGxpbmsgcHJlcGFyZUNoYXJ0fSB0aGF0IHJlc29sdmVzIHRoZSBkYXRhc2V0IGJ5IGZldGNoaW5nIHRoZVxuICogR2VuaWUgc3RhdGVtZW50J3Mgcm93cyBvbiBkZW1hbmQuIFRoZSB0b29sIG1pbnRzIGEgYGNoYXJ0SWRgXG4gKiBzeW5jaHJvbm91c2x5LCBjYWNoZXMgYW4gZW1wdHkgcGxhY2Vob2xkZXIsIGFuZCBraWNrcyBvZmYgdGhlXG4gKiBwbGFubmVyIGluIHRoZSBiYWNrZ3JvdW5kIHNvIHRoZSBhZ2VudCBsb29wIG5ldmVyIGJsb2Nrcy4gVGhlIHJlc3VsdCBjYXJyaWVzXG4gKiB0aGUgY29tcGxldGUgbWFya2VyIHRvIGNvcHk7IHRoZSBob3N0IFVJIHJlc29sdmVzIGl0IGJ5IHJlYWRpbmcgdGhlIGNhY2hlZFxuICoge0BsaW5rIENoYXJ0fSBlbnRyeSAoMWggVFRMKS5cbiAqXG4gKiBTcGFjZS1hZ25vc3RpYzogYSBHZW5pZSBgc3RhdGVtZW50X2lkYCBpcyB3b3Jrc3BhY2Utc2NvcGVkLCBzb1xuICogb25lIHNoYXJlZCBgcHJlcGFyZV9jaGFydGAgdG9vbCBjb3ZlcnMgZXZlcnkgd2lyZWQgR2VuaWUgc3BhY2UuXG4gKlxuICogQ2FuY2VsbGF0aW9uOiBkZWxpYmVyYXRlbHkgZG9lcyBOT1QgZm9yd2FyZCB0aGUgcGVyLWNhbGxcbiAqIGBhYm9ydFNpZ25hbGAgdG8ge0BsaW5rIHByZXBhcmVDaGFydH0uIFRoZSBwbGFubmVyIHRhc2sgaXNcbiAqIGZpcmUtYW5kLWZvcmdldCBiYWNrZ3JvdW5kIHdvcms7IHRoZSB0b29sJ3Mgb3duIGBleGVjdXRlYFxuICogcmVzb2x2ZXMgdGhlIG1vbWVudCB0aGUgYGNoYXJ0SWRgIGlzIG1pbnRlZCwgc28gdGhlIHBlci1jYWxsXG4gKiBzaWduYWwgYWJvcnRzIHRoZSBzZWNvbmQgdGhlIHRvb2wgcmV0dXJucy4gVGhlIDFoIGNhY2hlIFRUTFxuICogY2FwcyBhYmFuZG9uZWQgZW50cmllcy5cbiAqL1xuZnVuY3Rpb24gYnVpbGRQcmVwYXJlQ2hhcnRUb29sKG9wdHM6IHsgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcgfSkge1xuICBjb25zdCB7IGNvbmZpZyB9ID0gb3B0cztcbiAgY29uc3QgdG9vbElkID0gXCJwcmVwYXJlX2NoYXJ0XCI7XG4gIHJldHVybiBjcmVhdGVUb29sKHtcbiAgICBpZDogdG9vbElkLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdVdGlscy50b0Rlc2NyaXB0aW9uKFtcbiAgICAgIGBcbiAgICAgICAgUXVldWUgYSBjaGFydCBmb3IgdGhlIHJvd3Mgb2YgYSBHZW5pZSBzdGF0ZW1lbnQuIE1pbnRzIGFcbiAgICAgICAgXFxgY2hhcnRJZFxcYCBwbHVzIGl0cyBjb21wbGV0ZSBcXGBtYXJrZXJcXGAgc3luY2hyb25vdXNseSBhbmRcbiAgICAgICAga2lja3Mgb2ZmIGEgQkFDS0dST1VORFxuICAgICAgICB0YXNrIHRoYXQgZmV0Y2hlcyB0aGUgc3RhdGVtZW50J3Mgcm93cywgcnVucyB0aGVcbiAgICAgICAgY2hhcnQtcGxhbm5lciB0byBwaWNrIGEgY2hhcnQgdHlwZSBhbmQgRWNoYXJ0cyBzcGVjLCBhbmRcbiAgICAgICAgY2FjaGVzIHRoZSByZXN1bHQgdW5kZXIgdGhlIFxcYGNoYXJ0SWRcXGAgZm9yIG9uZSBob3VyLiBUaGVcbiAgICAgICAgaG9zdCBVSSBmZXRjaGVzIHRoZSBjYWNoZWQgY2hhcnQgb24gaXRzIG93biBvbmNlIGl0IGxhbmRzLlxuICAgICAgYCxcbiAgICAgIGBcbiAgICAgICAgVG8gZGlzcGxheSB0aGUgY2hhcnQgaW4geW91ciByZXBseSwgY29weSB0aGUgcmV0dXJuZWRcbiAgICAgICAgXFxgbWFya2VyXFxgIFZFUkJBVElNIG9udG8gaXRzIG93biBsaW5lIGF0IHRoZSBwb3NpdGlvbiB5b3VcbiAgICAgICAgd2FudCBpdCB0byBhcHBlYXIuIE5ldmVyIGNvbnN0cnVjdCwgYWx0ZXIsIG9yIGludmVudCBhXG4gICAgICAgIG1hcmtlciBmcm9tIFxcYGNoYXJ0SWRcXGAgKGFuZCBuZXZlciB1c2UgdGhlIFxcYHN0YXRlbWVudF9pZFxcYFxuICAgICAgICBvciBhbnkgdmFyaWF0aW9uIG9mIGl0KSAtIG9ubHkgdGhlIGNvbXBsZXRlIHZhbHVlIHJldHVybmVkXG4gICAgICAgIGJ5IHRoaXMgdG9vbCByZXNvbHZlcyB0byBhIHJlYWwgY2hhcnQuIFRoZSB0b29sIHJldHVybnNcbiAgICAgICAgaW1tZWRpYXRlbHkgLSBkbyBOT1Qgd2FpdCBvciBjYWxsIGl0IGFnYWluIHRvXG4gICAgICAgIFwiY2hlY2sgcHJvZ3Jlc3NcIjsgdGhlIGNoYXJ0IHJlc29sdmVzIGFzeW5jaHJvbm91c2x5IG9uIHRoZVxuICAgICAgICBob3N0IFVJJ3Mgc2lkZS5cbiAgICAgIGAsXG4gICAgICBgXG4gICAgICAgIFVzZSB0aGlzIG9ubHkgd2hlbiB0aGUgZGF0YSBoYXMgYSBzdG9yeSBhIGNoYXJ0IGNvbnZleXNcbiAgICAgICAgYmV0dGVyIHRoYW4gYSB0YWJsZSAodHJlbmRzLCByYW5raW5ncywgZGlzdHJpYnV0aW9ucyxcbiAgICAgICAgcGFydHMtb2YtYS13aG9sZSkuIEZvciByYXcgcm93cywgZW1iZWRcbiAgICAgICAgXFxgW2RhdGE6PHN0YXRlbWVudF9pZD5dXFxgIGluc3RlYWQgYW5kIHNraXAgdGhpcyB0b29sLlxuICAgICAgYCxcbiAgICBdKSxcbiAgICBpbnB1dFNjaGVtYTogcHJlcGFyZUNoYXJ0UmVxdWVzdFNjaGVtYSxcbiAgICBvdXRwdXRTY2hlbWE6IGNoYXJ0VG9vbE91dHB1dFNjaGVtYSxcbiAgICBleGVjdXRlOiBhc3luYyAocmVxdWVzdCwgY3R4UmF3KSA9PiB7XG4gICAgICBjb25zdCBjdHggPSBjdHhSYXcgYXMgVG9vbEV4ZWN1dGVDdHg7XG4gICAgICBjb25zdCB7IGNsaWVudCwgcmVxdWVzdENvbnRleHQgfSA9IHJlcXVpcmVDbGllbnQoY3R4LCB0b29sSWQpO1xuICAgICAgcmV0dXJuIHByZXBhcmVDaGFydCh7XG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgdXNlcktleTogcmVzb2x2ZVVzZXJLZXkocmVxdWVzdENvbnRleHQpLFxuICAgICAgICAuLi4ocmVxdWVzdC50aXRsZSA/IHsgdGl0bGU6IHJlcXVlc3QudGl0bGUgfSA6IHt9KSxcbiAgICAgICAgLi4uKHJlcXVlc3QuZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uOiByZXF1ZXN0LmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAgIHJlc29sdmVEYXRhOiAodGFza1NpZ25hbCkgPT5cbiAgICAgICAgICBmZXRjaFN0YXRlbWVudERhdGEoY2xpZW50LCByZXF1ZXN0LnN0YXRlbWVudF9pZCwge1xuICAgICAgICAgICAgLi4uKHRhc2tTaWduYWwgPyB7IHNpZ25hbDogdGFza1NpZ25hbCB9IDoge30pLFxuICAgICAgICAgIH0pLFxuICAgICAgICAuLi4oY3R4Py5yZXF1ZXN0Q29udGV4dCA/IHsgcmVxdWVzdENvbnRleHQ6IGN0eC5yZXF1ZXN0Q29udGV4dCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBvcmNoZXN0cmF0aW9uIHByb21wdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBTdWdnZXN0ZWQgb3JjaGVzdHJhdGlvbiBwcm9tcHQgZm9yIHRoZSBjZW50cmFsIGFnZW50IHRoYXQgb3duc1xuICogdGhlIEdlbmllIHRvb2xzLiBDb21wb3NlIGludG8geW91ciBhZ2VudCdzIGBpbnN0cnVjdGlvbnNgIHRvXG4gKiBnZXQgdGhlIGNhbm9uaWNhbCBcImRlY29tcG9zZSBxdWVzdGlvbnMsIGFzayBHZW5pZSBmb2N1c2VkXG4gKiBzdWItcXVlc3Rpb25zLCBwbGFjZSBkYXRhIC8gY2hhcnQgbWFya2VycyBpbiBwcm9zZVwiIGJlaGF2aW9yOlxuICpcbiAqIGBgYHRzXG4gKiBjcmVhdGVBZ2VudCh7XG4gKiAgIGluc3RydWN0aW9uczogYCR7bXlBZ2VudEluc3RydWN0aW9uc31cXG5cXG4ke0dFTklFX0lOU1RSVUNUSU9OU31gLFxuICogICBhc3luYyB0b29scyhwbHVnaW5zKSB7XG4gKiAgICAgcmV0dXJuIHsgLi4uKGF3YWl0IHBsdWdpbnMuZ2VuaWU/LnRvb2xraXQoKSkgfTtcbiAqICAgfSxcbiAqIH0pO1xuICogYGBgXG4gKlxuICogVGhlIHByb21wdCByZWZlcmVuY2VzIHRoZSBiYXJlIHRvb2wgbmFtZXMgKGBhc2tfZ2VuaWVgLFxuICogYGdldF9zcGFjZV9kZXNjcmlwdGlvbmAsIGBnZXRfc3BhY2Vfc2VyaWFsaXplZGAsXG4gKiBgZ2V0X3N0YXRlbWVudGAsIGBwcmVwYXJlX2NoYXJ0YCkgdXNlZCBmb3IgdGhlIHNpbmdsZS1zcGFjZVxuICogZGVmYXVsdCBhbGlhcy4gTXVsdGktc3BhY2UgZGVwbG95bWVudHMgc2hvdWxkIHdyaXRlIHRoZWlyIG93blxuICogdmFyaWFudCB0aGF0IG5hbWVzIHRoZSBzdWZmaXhlZCBwZXItc3BhY2UgdG9vbHNcbiAqIChlLmcuIGBhc2tfZ2VuaWVfc2FsZXNgKS5cbiAqL1xuZXhwb3J0IGNvbnN0IEdFTklFX0lOU1RSVUNUSU9OUyA9IHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oW1xuICBcIkdlbmllIG9yY2hlc3RyYXRpb24uIEZvciBldmVyeSB1c2VyIHF1ZXN0aW9uIHRoYXQgbmVlZHMgU1FMLWJhY2tlZCBkYXRhOlwiLFxuICB7XG4gICAgbnVtYmVyZWQ6IFtcbiAgICAgIGBcbiAgICAgICAgU3RhcnQgYnkgY2FsbGluZyBcXGBnZXRfc3BhY2VfZGVzY3JpcHRpb25cXGAgdG8gZ3JvdW5kIHlvdXJzZWxmXG4gICAgICAgIGluIHdoYXQgdGhlIHNwYWNlIGNvdmVycyAodGFibGVzLCBtZXRyaWNzLCB0aW1lIHdpbmRvd3MpLFxuICAgICAgICB1bmxlc3MgeW91IGFscmVhZHkgc2F3IHRoZSBzYW1lIGRlc2NyaXB0aW9uIGVhcmxpZXIgaW4gdGhpc1xuICAgICAgICBjb252ZXJzYXRpb24uIFJlYWNoIGZvciBcXGBnZXRfc3BhY2Vfc2VyaWFsaXplZFxcYCBvbmx5IHdoZW4geW91XG4gICAgICAgIG5lZWQgZXhhY3QgY29sdW1uIC8gdGFibGUgaWRlbnRpZmllcnMgdGhlIGRlc2NyaXB0aW9uIGRvZXNuJ3RcbiAgICAgICAgZXhwb3NlIC0gaXQncyBhIG11Y2ggbGFyZ2VyIHBheWxvYWQuXG4gICAgICBgLFxuICAgICAgYFxuICAgICAgICBEZWNvbXBvc2UgdGhlIHVzZXIncyBxdWVzdGlvbiBpbnRvIGZvY3VzZWQgc3ViLXF1ZXN0aW9uc1xuICAgICAgICBCRUZPUkUgYXNraW5nIEdlbmllIGFueXRoaW5nLiBPbmUgc3ViLXF1ZXN0aW9uIHBlciBkaXN0aW5jdFxuICAgICAgICBtZXRyaWMsIGRpbWVuc2lvbiwgb3IgdGltZSB3aW5kb3cuIFRoZW4gY2FsbCBcXGBhc2tfZ2VuaWVcXGBcbiAgICAgICAgb25jZSBwZXIgc3ViLXF1ZXN0aW9uIC0gdXN1YWxseSB0d28gdG8gc2l4IGNhbGxzIHBlciB0dXJuLlxuICAgICAgICBJc3N1ZSBpbmRlcGVuZGVudCBjYWxscyBpbiBwYXJhbGxlbCB0byByZWR1Y2UgbGF0ZW5jeS4gS2VlcFxuICAgICAgICBkZXBlbmRlbnQgY2FsbHMgc2VxdWVudGlhbCB3aGVuIGFuIGVhcmxpZXIgYW5zd2VyIGRldGVybWluZXNcbiAgICAgICAgdGhlIG5leHQgcXVlc3Rpb24uIFBhcmFsbGVsIGNhbGxzIHVzZSBpc29sYXRlZCBHZW5pZVxuICAgICAgICBjb252ZXJzYXRpb25zOyBzZXF1ZW50aWFsIGNhbGxzIHJldGFpbiBjb252ZXJzYXRpb24gY29udGV4dC5cbiAgICAgICAgQ3JhbW1pbmcgYSBtdWx0aS1wYXJ0IHF1ZXN0aW9uIGludG8gb25lIFxcYGFza19nZW5pZVxcYCBjYWxsXG4gICAgICAgIGFsbW9zdCBhbHdheXMgcHJvZHVjZXMgYSB3b3JzZSBhbnN3ZXIgdGhhbiBhc2tpbmcgdGhlIHBpZWNlc1xuICAgICAgICBzZXBhcmF0ZWx5LiBPbmx5IGNvbGxhcHNlIHRvIGEgc2luZ2xlIGNhbGwgd2hlbiB0aGUgcXVlc3Rpb25cbiAgICAgICAgaXMgZ2VudWluZWx5IGF0b21pYyAoXCJ3aGF0IHdhcyBRMyByZXZlbnVlP1wiKS5cblxuICAgICAgICBXb3JrZWQgZXhhbXBsZTogdXNlciBhc2tzIFwiSG93IGRpZCBTS1UgMTIzNCdzIHJldmVudWVcbiAgICAgICAgY29tcGFyZSB0byBpdHMgY2F0ZWdvcnkgYXZlcmFnZSBsYXN0IHF1YXJ0ZXIsIGFuZCB3aGljaFxuICAgICAgICByZWdpb25zIGRyb3ZlIHRoZSBnYXA/XCIgRGVjb21wb3NlcyB0bzogKGEpIFxcYGFza19nZW5pZVxcYFxuICAgICAgICBmb3IgU0tVIDEyMzQncyBRMyByZXZlbnVlLCAoYikgXFxgYXNrX2dlbmllXFxgIGZvciB0aGVcbiAgICAgICAgY2F0ZWdvcnktYXZlcmFnZSBRMyByZXZlbnVlLCAoYykgXFxgYXNrX2dlbmllXFxgIGZvciBTS1VcbiAgICAgICAgMTIzNCdzIFEzIHJldmVudWUgc3BsaXQgYnkgcmVnaW9uLiBUaGUgZmlyc3QgdHdvIGNhbGxzIGFyZVxuICAgICAgICBpbmRlcGVuZGVudCBhbmQgY2FuIHJ1biBpbiBwYXJhbGxlbDsgcnVuIHRoZSByZWdpb25hbCBjYWxsXG4gICAgICAgIGFmdGVyd2FyZCBvbmx5IGlmIGl0cyB3b3JkaW5nIGRlcGVuZHMgb24gdGhvc2UgcmVzdWx0cy5cbiAgICAgIGAsXG4gICAgICBgXG4gICAgICAgIEVhY2ggXFxgYXNrX2dlbmllXFxgIGNhbGwgcmV0dXJucyB0aGUgdGVybWluYWwgXFxgR2VuaWVNZXNzYWdlXFxgLlxuICAgICAgICBSZWFkIEFnZW50IE1vZGUncyBzeW50aGVzaXplZCBhbnN3ZXIgYW5kIE1hcmtkb3duIHF1ZXJ5IG91dHB1dFxuICAgICAgICBkaXJlY3RseSBmcm9tIGl0cyB0ZXh0IGF0dGFjaG1lbnRzLiBBZ2VudCBNb2RlIGRvZXMgTk9UIGV4cG9zZSBhXG4gICAgICAgIFxcYHN0YXRlbWVudF9pZFxcYC4gVG8gY2hhcnQgaXRzIHJlc3VsdCwgY2FsbCBcXGByZW5kZXJfZGF0YVxcYCB3aXRoXG4gICAgICAgIHJvd3MgY29waWVkIGZyb20gdGhlIE1hcmtkb3duIHRhYmxlIG9yIHN0cnVjdHVyZWQgdGFibGUgbWV0YWRhdGEsXG4gICAgICAgIHRoZW4gY29weSB0aGUgcmV0dXJuZWQgbWFya2VyLiBOZXZlciBwYXNzIGFuIEFnZW50IE1vZGUgcmVzcG9uc2UgaWQsXG4gICAgICAgIGNvbnZlcnNhdGlvbiBpZCwgZnVuY3Rpb24tY2FsbCBpZCwgb3IgYW55IG90aGVyIGlkZW50aWZpZXIgdG9cbiAgICAgICAgXFxgcHJlcGFyZV9jaGFydFxcYC5cblxuICAgICAgICBBIGxlZ2FjeSBwb2xsaW5nIHJlc3VsdCBtYXkgaW5zdGVhZCBleHBvc2UgYSBcXGBzdGF0ZW1lbnRfaWRcXGAgYXRcbiAgICAgICAgXFxgbWVzc2FnZS5xdWVyeV9yZXN1bHQuc3RhdGVtZW50X2lkXFxgIChvciB0aGUgZmlyc3RcbiAgICAgICAgYXR0YWNobWVudCdzIFxcYHF1ZXJ5LnN0YXRlbWVudF9pZFxcYCkuIE9ubHkgdGhhdCByZWFsIHN0YXRlbWVudCBpZFxuICAgICAgICBiZWxvbmdzIGluIFxcYHByZXBhcmVfY2hhcnRcXGAgb3IgYSBcXGBbZGF0YTo8c3RhdGVtZW50X2lkPl1cXGAgbWFya2VyLlxuICAgICAgYCxcbiAgICAgIFtcbiAgICAgICAgYFxuICAgICAgICAgIFRvIERJU1BMQVkgYSByZXN1bHQgc2V0IGluIHlvdXIgcmVwbHksIGVtYmVkIGEgbWFya2VyIG9uIGl0c1xuICAgICAgICAgIG93biBsaW5lIHdoZXJlIHRoZSB2aXN1YWxpemF0aW9uIHNob3VsZCBhcHBlYXIuIFR3byBtYXJrZXJcbiAgICAgICAgICBzaGFwZXM6XG4gICAgICAgIGAsXG4gICAgICAgIHtcbiAgICAgICAgICBidWxsZXRzOiBbXG4gICAgICAgICAgICBgXG4gICAgICAgICAgICAgIFxcYFtkYXRhOjxzdGF0ZW1lbnRfaWQ+XVxcYCAtIHJlbmRlciBsZWdhY3kgcG9sbGluZyByb3dzIGFzIGEgdGFibGUuXG4gICAgICAgICAgICAgIFVzZSB0aGlzIHdoZW4gdGhlcmUncyBubyBjbGVhciB2aXN1YWwgc3RvcnkgKGxvbmcgbGlzdHMsXG4gICAgICAgICAgICAgIHJlZmVyZW5jZSBkYXRhLCBzaW5nbGUtcm93IHJlc3VsdHMsIG9yIHRoZSB1c2VyIGp1c3RcbiAgICAgICAgICAgICAgd2FudHMgdG8gc2VlIHRoZSBkYXRhKS4gRW1iZWQgdGhlIG1hcmtlciBkaXJlY3RseSB3aGVuXG4gICAgICAgICAgICAgIFxcYGFza19nZW5pZVxcYCByZXR1cm5lZCBhIHJlYWwgXFxgc3RhdGVtZW50X2lkXFxgOyBBZ2VudCBNb2RlXG4gICAgICAgICAgICAgIGFscmVhZHkgY2FycmllcyBpdHMgcXVlcnkgb3V0cHV0IGlubGluZS5cbiAgICAgICAgICAgIGAsXG4gICAgICAgICAgICBgXG4gICAgICAgICAgICAgIFxcYFtjaGFydDo8Y2hhcnRJZD5dXFxgIC0gcmVuZGVyIHRoZSByb3dzIGFzIGEgY2hhcnQuIFRvXG4gICAgICAgICAgICAgIGdldCBvbmUgZnJvbSBBZ2VudCBNb2RlLCBjYWxsIFxcYHJlbmRlcl9kYXRhXFxgIHdpdGggdGhlXG4gICAgICAgICAgICAgIGlubGluZSByb3dzLiBUbyBnZXQgb25lIGZyb20gbGVnYWN5IHBvbGxpbmcsIGNhbGxcbiAgICAgICAgICAgICAgXFxgcHJlcGFyZV9jaGFydFxcYCB3aXRoIHRoZSByZWFsIHN0YXRlbWVudCBpZC4gQm90aCB0b29sc1xuICAgICAgICAgICAgICBhY2NlcHQgYW4gb3B0aW9uYWwgXFxgdGl0bGVcXGAgLyBvbmUtbGluZSBcXGBkZXNjcmlwdGlvblxcYFxuICAgICAgICAgICAgICBvZiB0aGUgaW5zaWdodCB0byBzdXJmYWNlLCByZXR1cm4gdGhlIGNvbXBsZXRlIFxcYG1hcmtlclxcYFxuICAgICAgICAgICAgICBzeW5jaHJvbm91c2x5LCBhbmQgcHJlcGFyZSB0aGUgY2hhcnQgc3BlYyBpbiB0aGVcbiAgICAgICAgICAgICAgYmFja2dyb3VuZC4gQ29weSB0aGF0IG1hcmtlciBWRVJCQVRJTSBvbnRvIGl0cyBvd24gbGluZVxuICAgICAgICAgICAgICB3aGVyZXZlciB0aGUgY2hhcnQgc2hvdWxkIGFwcGVhci4gVXNlIGEgY2hhcnQgd2hlbiB0aGVcbiAgICAgICAgICAgICAgZGF0YSBoYXMgYSBzdG9yeSBhIHZpc3VhbCBjb252ZXlzIGJldHRlciB0aGFuIGEgdGFibGVcbiAgICAgICAgICAgICAgKHRyZW5kcywgcmFua2luZ3MsIGRpc3RyaWJ1dGlvbnMsIHBhcnRzLW9mLWEtd2hvbGUpLlxuXG4gICAgICAgICAgICAgIE5FVkVSIGludmVudCBvciBoYW5kLWJ1aWxkIGEgbWFya2VyLiBBIHZhbGlkIG1hcmtlciBpc1xuICAgICAgICAgICAgICB0aGUgY29tcGxldGUgb3BhcXVlIHN0cmluZyBhIFxcYHJlbmRlcl9kYXRhXFxgIG9yXG4gICAgICAgICAgICAgIFxcYHByZXBhcmVfY2hhcnRcXGAgY2FsbCByZXR1cm5lZCB0byB5b3UgaW4gVEhJUyB0dXJuIC1cbiAgICAgICAgICAgICAgbm90aGluZyBlbHNlLiBJdHMgaWQgaXMgTk9UIGEgXFxgc3RhdGVtZW50X2lkXFxgLCBhbmQgaXQgaXMgTk9UIGFcbiAgICAgICAgICAgICAgXFxgc3RhdGVtZW50X2lkXFxgIHByZWZpeCB3aXRoIGEgbGFiZWwgYXBwZW5kZWQgKGUuZy5cbiAgICAgICAgICAgICAgXFxgMDFmMS4uLi1yZWdpb24tZmlsbFxcYCkuIElmIHlvdSBoYXZlIG5vdCBjYWxsZWRcbiAgICAgICAgICAgICAgb25lIG9mIHRob3NlIGNoYXJ0IHRvb2xzIGFuZCByZWNlaXZlZCBhbiBpZCBiYWNrLCBkbyBub3RcbiAgICAgICAgICAgICAgd3JpdGUgYSBcXGBbY2hhcnQ6Li4uXVxcYCBtYXJrZXIgYXQgYWxsLiBBIGZhYnJpY2F0ZWQgY2hhcnRcbiAgICAgICAgICAgICAgaWQgcmVuZGVycyBub3RoaW5nIGFuZCB3YXN0ZXMgYSByZXF1ZXN0LlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBgXG4gICAgICAgICAgVGhlIGhvc3QgVUkgcmVzb2x2ZXMgYm90aCBtYXJrZXJzIG9uIGl0cyBvd24gb25jZSBpdCBzZWVzXG4gICAgICAgICAgdGhlbSAtIHlvdSBkbyBOT1QgbmVlZCB0byBjYWxsIFxcYGdldF9zdGF0ZW1lbnRcXGAganVzdCB0b1xuICAgICAgICAgIGRpc3BsYXkgZGF0YSwgYW5kIHlvdSBkbyBOT1QgbmVlZCB0byB3YWl0IG9uXG4gICAgICAgICAgXFxgcmVuZGVyX2RhdGFcXGAgb3IgXFxgcHJlcGFyZV9jaGFydFxcYCAodGhleSByZXR1cm4gdGhlIGlkXG4gICAgICAgICAgaW1tZWRpYXRlbHkgYW5kIHRoZSBob3N0IFVJIGZldGNoZXMgdGhlIGNhY2hlZCBjaGFydCBsYXRlcikuXG4gICAgICAgICAgUGljayBhdCBtb3N0IG9uZSBtYXJrZXIgcGVyIHJlc3VsdDsgZG9uJ3QgY2hhcnQgQU5EIHRhYmxlIHRoZVxuICAgICAgICAgIHNhbWUgcmVzdWx0IHNpZGUgYnkgc2lkZS5cbiAgICAgICAgYCxcbiAgICAgIF0sXG4gICAgICBgXG4gICAgICAgIENhbGwgXFxgZ2V0X3N0YXRlbWVudChzdGF0ZW1lbnRfaWQsIGxpbWl0PylcXGAgT05MWSB3aGVuIHlvdSBuZWVkXG4gICAgICAgIHRvIHJlYWQgdGhlIGFjdHVhbCB2YWx1ZXMgdG8gcmVhc29uIGFib3V0IHRoZW0gKGUuZy4gbmFtaW5nIGFcbiAgICAgICAgc3BlY2lmaWMgcm93LCBjb21wdXRpbmcgYSBkZWx0YSB0aGUgdGFibGUgb3IgY2hhcnQgd291bGRuJ3RcbiAgICAgICAgc2hvdywgb3Igc2FuaXR5LWNoZWNraW5nIGEgcmVzdWx0IGJlZm9yZSBpbnRlcnByZXRpbmcgaXQpLiBJZlxuICAgICAgICB5b3UnZCBqdXN0IGJlIHJlY2l0aW5nIG51bWJlcnMgdGhlIHZpc3VhbGl6YXRpb24gYWxyZWFkeSBzaG93cyxcbiAgICAgICAgc2tpcCB0aGUgY2FsbCBhbmQgdXNlIGEgbWFya2VyIGluc3RlYWQuIFxcYGxpbWl0XFxgIGRlZmF1bHRzIHRvIGFcbiAgICAgICAgc21hbGwgc2FtcGxlOyByYWlzZSBpdCBvbmx5IHdoZW4geW91IGdlbnVpbmVseSBuZWVkIG1vcmUgcm93cy5cbiAgICAgIGAsXG4gICAgICBgXG4gICAgICAgIENvbXBvc2UgeW91ciBmaW5hbCByZXBseSBhcyBwbGFpbiBwcm9zZS4gSW50ZXJsZWF2ZSBwYXJhZ3JhcGhzXG4gICAgICAgIHdpdGggXFxgW2RhdGE6Li4uXVxcYCAvIFxcYFtjaGFydDouLi5dXFxgIG1hcmtlcnMgd2hlcmV2ZXIgYSByZXN1bHRcbiAgICAgICAgc2hvdWxkIHJlbmRlci4gRG9uJ3QgZHVtcCBhbGwgbWFya2VycyBhdCB0aGUgZW5kIC0gcGxhY2UgZWFjaFxuICAgICAgICBvbmUgbmV4dCB0byB0aGUgcHJvc2UgdGhhdCBpbnRlcnByZXRzIGl0LiBEb24ndCByZXN0YXRlIGV2ZXJ5XG4gICAgICAgIG51bWJlciB0aGUgdmlzdWFsaXphdGlvbiBhbHJlYWR5IHNob3dzOyBjYWxsIG91dCBkZWx0YXMsXG4gICAgICAgIGFub21hbGllcywgdGFrZWF3YXlzLlxuICAgICAgYCxcbiAgICBdLFxuICB9LFxuXSk7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtdWx0aS1hbGlhcyBzdXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIE5vcm1hbGl6ZSB0aGUge0BsaW5rIEdlbmllU3BhY2VzQ29uZmlnfSByZWNvcmQuIEJhcmUtc3RyaW5nXG4gKiBlbnRyaWVzIChgeyBkZWZhdWx0OiBcIjAxZWYuLi5cIiB9YCkgZ2V0IHdyYXBwZWQgYXNcbiAqIGB7IHNwYWNlSWQ6IFwiMDFlZi4uLlwiIH1gOyBvYmplY3QgZW50cmllcyBwYXNzIHRocm91Z2ggdW5jaGFuZ2VkLlxuICpcbiAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkVycm9yIHdoZW4gYW4gYWxpYXMgaXMgcHJlc2VudCBidXQgY2FycmllcyBubyBzcGFjZSBpZFxuICogICAoYHsgZGVmYXVsdDogcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRCB9YCB3aXRoIHRoZSB2YXJpYWJsZVxuICogICB1bnNldCkuIEFuIGFsaWFzIHRoYXQgcmVzb2x2ZXMgdG8gbm90aGluZyBpcyBhIHdpcmluZyBjb250cmFkaWN0aW9uOiB0aGVcbiAqICAgYWdlbnQgd291bGQgYWR2ZXJ0aXNlIG5vIEdlbmllIHRvb2wgZm9yIGEgc3BhY2UgdGhlIGRlcGxveW1lbnQgYmVsaWV2ZXMgaXRcbiAqICAgY29uZmlndXJlZCwgc28gaXQgZmFpbHMgYXQgY29uc3RydWN0aW9uIGluc3RlYWQgb2YgZ29pbmcgcXVpZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVHZW5pZVNwYWNlcyhcbiAgc3BhY2VzOiBHZW5pZVNwYWNlc0NvbmZpZyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IEdlbmllU3BhY2VDb25maWcgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkLFxuKTogUmVjb3JkPHN0cmluZywgR2VuaWVTcGFjZUNvbmZpZz4ge1xuICBpZiAoIXNwYWNlcykgcmV0dXJuIHt9O1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIEdlbmllU3BhY2VDb25maWc+ID0ge307XG4gIGZvciAoY29uc3QgW2FsaWFzLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc3BhY2VzKSkge1xuICAgIGNvbnN0IHNwYWNlSWQgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHZhbHVlPy5zcGFjZUlkO1xuICAgIGlmICghc3BhY2VJZCkgdGhyb3cgbWlzc2luZ1NwYWNlSWQoYWxpYXMpO1xuICAgIG91dFthbGlhc10gPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB7IHNwYWNlSWQgfSA6IHZhbHVlITtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKiogQ29uZmlnIGNvbnRyYWRpY3Rpb246IGFuIGFsaWFzIHByZXNlbnQgaW4gYGdlbmllU3BhY2VzYCB3aXRoIG5vIHNwYWNlIGlkLiAqL1xuZnVuY3Rpb24gbWlzc2luZ1NwYWNlSWQoYWxpYXM6IHN0cmluZyk6IENvbmZpZ3VyYXRpb25FcnJvciB7XG4gIGNvbnN0IGVudkhpbnQgPVxuICAgIGFsaWFzID09PSBERUZBVUxUX0dFTklFX0FMSUFTXG4gICAgICA/IFwiU2V0IERBVEFCUklDS1NfR0VOSUVfU1BBQ0VfSUQsIHBhc3MgdGhlIHNwYWNlIGlkIGlubGluZSwgb3IgZHJvcCB0aGUgYWxpYXMuXCJcbiAgICAgIDogYFBhc3MgdGhlIHNwYWNlIGlkIGlubGluZSAoREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRCBvbmx5IGJhY2tzIHRoZSBcIiR7REVGQVVMVF9HRU5JRV9BTElBU31cIiBhbGlhcykgb3IgZHJvcCB0aGUgYWxpYXMuYDtcbiAgcmV0dXJuIENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKGBnZW5pZVNwYWNlcy4ke2FsaWFzfSBzcGFjZSBpZGAsIGVudkhpbnQpO1xufVxuXG4vKipcbiAqIEFwcEtpdCBgZ2VuaWVgIHBsdWdpbidzIGNvbmZpZyBzaGFwZSwgZGVyaXZlZCBmcm9tIHRoZSBmYWN0b3J5XG4gKiBpdHNlbGYgc28gaXQgc3RheXMgaW4gbG9jay1zdGVwIHdpdGggdGhlIHVwc3RyZWFtIHR5cGUgd2l0aG91dFxuICogZGVlcC1pbXBvcnRpbmcgYElHZW5pZUNvbmZpZ2AgKHdoaWNoIHRoZSBwYWNrYWdlJ3MgdG9wLWxldmVsXG4gKiBiYXJyZWwgZG9lc24ndCBzdXJmYWNlKS4gVGhlIHBsdWdpbidzIGBjb25maWdgIGZpZWxkIGlzXG4gKiBgcHJvdGVjdGVkYCBpbiBUUyBvbmx5OyB0aGUgcnVudGltZSBsYXlvdXQgaXMgcGxhaW4gb2JqZWN0XG4gKiBwcm9wZXJ0eSBhY2Nlc3MsIHNvIHJlYWRpbmcgb2ZmIHRoZSBpbnN0YW5jZSB3aXRoIGEgc3RydWN0dXJhbFxuICogY2FzdCBpcyBzYWZlLlxuICovXG50eXBlIEFwcEtpdEdlbmllQ29uZmlnID0gTm9uTnVsbGFibGU8UGFyYW1ldGVyczx0eXBlb2YgZ2VuaWU+WzBdPjtcblxuLyoqXG4gKiBEaXNjb3ZlciBHZW5pZSBzcGFjZSBhbGlhc2VzIGZyb20gZXZlcnkgc3VwcG9ydGVkIHNvdXJjZSBhbmRcbiAqIG1lcmdlIHRoZW0gaW50byBhIHNpbmdsZSByZWNvcmQuIFByZWNlZGVuY2UgKGhpZ2hlc3QgZmlyc3QpOlxuICpcbiAqICAgMS4ge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5nZW5pZVNwYWNlc30gb24gdGhlIGBtYXN0cmEoLi4uKWBcbiAqICAgICAgY2FsbC4gRXhwbGljaXQgTWFzdHJhIHdpcmluZyBhbHdheXMgd2lucyBzbyB1c2VycyBjYW5cbiAqICAgICAgb3ZlcnJpZGUgQXBwS2l0J3MgZGVmYXVsdHMgcGVyLWFnZW50LlxuICogICAyLiBBcHBLaXQgYGdlbmllKHsgc3BhY2VzOiB7IC4uLiB9IH0pYCBwbHVnaW4gaW5zdGFuY2UuIExldHNcbiAqICAgICAgdXNlcnMga2VlcCB1c2luZyB0aGUgZXhpc3RpbmcgQXBwS2l0IGNvbmZpZyBmb3JtYXRcbiAqICAgICAgKGBnZW5pZSh7IHNwYWNlczogeyBzYWxlczogXCIuLi5cIiwgb3BzOiBcIi4uLlwiIH0gfSlgKVxuICogICAgICB3aXRob3V0IHJlc3RhdGluZyB0aGUgc2FtZSByZWNvcmQgb24gdGhlIE1hc3RyYSBwbHVnaW4uXG4gKiAgICAgIFJlYWQgb2ZmIHRoZSBsaXZlIHBsdWdpbiBpbnN0YW5jZSB2aWEgYSBzdHJ1Y3R1cmFsIGNhc3RcbiAqICAgICAgc2luY2UgYFBsdWdpbi5jb25maWdgIGlzIFRTLXByb3RlY3RlZCAobm90IHJ1bnRpbWUtcHJpdmF0ZSkuXG4gKiAgIDMuIGBEQVRBQlJJQ0tTX0dFTklFX1NQQUNFX0lEYCBlbnYgdmFyIChyZWdpc3RlcmVkIHVuZGVyIHRoZVxuICogICAgICB3ZWxsLWtub3duIGBkZWZhdWx0YCBhbGlhcykuIE1hdGNoZXMgdGhlIEFwcEtpdCBgZ2VuaWUoKWBcbiAqICAgICAgcGx1Z2luJ3MgZmFsbGJhY2sgYmVoYXZpb3Igc28gYSBiYXJlIGBtYXN0cmEoKWAgKyBgZ2VuaWUoKWBcbiAqICAgICAgcGFpciBqdXN0IHdvcmtzLlxuICpcbiAqIEFsaWFzZXMgY29sbGlkZSBjbGVhbmx5OiBhIGhpZ2hlci1wcmVjZWRlbmNlIHNvdXJjZSdzIHZhbHVlXG4gKiByZXBsYWNlcyBhIGxvd2VyIG9uZSdzIHdob2xlc2FsZS4gQSBzb3VyY2UgdGhhdCBjb250cmlidXRlcyB6ZXJvXG4gKiBhbGlhc2VzIGlzIHNraXBwZWQ7IGEgc291cmNlIHRoYXQgbmFtZXMgYW4gYWxpYXMgd2l0aG91dCBhIHNwYWNlXG4gKiBpZCBmYWlscyB0aHJvdWdoIHtAbGluayBub3JtYWxpemVHZW5pZVNwYWNlc30uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlR2VuaWVTcGFjZXMoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICBjb250ZXh0OiBwbHVnaW5SZWdpc3RyeS5QbHVnaW5Db250ZXh0TGlrZSB8IHVuZGVmaW5lZCxcbik6IFJlY29yZDxzdHJpbmcsIEdlbmllU3BhY2VDb25maWc+IHtcbiAgY29uc3QgbWVyZ2VkOiBSZWNvcmQ8c3RyaW5nLCBHZW5pZVNwYWNlQ29uZmlnPiA9IHt9O1xuXG4gIC8vIFNvdXJjZSAzIChsb3dlc3QgcHJlY2VkZW5jZSk6IGVudiB2YXIuXG4gIGNvbnN0IGVudlNwYWNlSWQgPSBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0dFTklFX1NQQUNFX0lEO1xuICBpZiAoZW52U3BhY2VJZCkge1xuICAgIG1lcmdlZFtERUZBVUxUX0dFTklFX0FMSUFTXSA9IHsgc3BhY2VJZDogZW52U3BhY2VJZCB9O1xuICB9XG5cbiAgLy8gU291cmNlIDI6IEFwcEtpdCBgZ2VuaWUoKWAgcGx1Z2luIGluc3RhbmNlIGNvbmZpZy4gVXNlIGFcbiAgLy8gc3RydWN0dXJhbCBjYXN0IC0gYFBsdWdpbi5jb25maWdgIGlzIGBwcm90ZWN0ZWRgIGluIFRTIG9ubHksXG4gIC8vIGFuZCB0aGUgcnVudGltZSBsYXlvdXQgaXMgcGxhaW4gb2JqZWN0IHByb3BlcnR5IGFjY2Vzcy5cbiAgY29uc3QgZ2VuaWVQbHVnaW4gPSBwbHVnaW5SZWdpc3RyeS5pbnN0YW5jZShjb250ZXh0LCBnZW5pZSk7XG4gIGlmIChnZW5pZVBsdWdpbikge1xuICAgIGNvbnN0IHBsdWdpblNwYWNlcyA9IChnZW5pZVBsdWdpbiBhcyB1bmtub3duIGFzIHsgY29uZmlnPzogQXBwS2l0R2VuaWVDb25maWcgfSkuY29uZmlnPy5zcGFjZXM7XG4gICAgaWYgKHBsdWdpblNwYWNlcykge1xuICAgICAgT2JqZWN0LmFzc2lnbihtZXJnZWQsIG5vcm1hbGl6ZUdlbmllU3BhY2VzKHBsdWdpblNwYWNlcykpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNvdXJjZSAxIChoaWdoZXN0IHByZWNlZGVuY2UpOiBleHBsaWNpdCBNYXN0cmEgd2lyaW5nLlxuICBpZiAoY29uZmlnLmdlbmllU3BhY2VzKSB7XG4gICAgT2JqZWN0LmFzc2lnbihtZXJnZWQsIG5vcm1hbGl6ZUdlbmllU3BhY2VzKGNvbmZpZy5nZW5pZVNwYWNlcykpO1xuICB9XG5cbiAgcmV0dXJuIG1lcmdlZDtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgZmxhdCBNYXN0cmEgdG9vbHMgcmVjb3JkIGZvciBldmVyeSBjb25maWd1cmVkIEdlbmllXG4gKiBzcGFjZS4gVHdvIHNoYXJlZCwgc3BhY2UtYWdub3N0aWMgdG9vbHMgKGBnZXRfc3RhdGVtZW50YCxcbiAqIGBwcmVwYXJlX2NoYXJ0YCkgYXJlIHJlZ2lzdGVyZWQgb25jZSByZWdhcmRsZXNzIG9mIGhvdyBtYW55XG4gKiBzcGFjZXMgYXJlIHdpcmVkOyB0aGUgcGVyLXNwYWNlIHRvb2xzIChgYXNrX2dlbmllYCxcbiAqIGBnZXRfc3BhY2VfZGVzY3JpcHRpb25gLCBgZ2V0X3NwYWNlX3NlcmlhbGl6ZWRgKSBhcmUgc3VmZml4ZWRcbiAqIHdpdGggYF88YWxpYXM+YCBmb3Igbm9uLWRlZmF1bHQgYWxpYXNlcyBzbyBtdWx0aS1zcGFjZVxuICogZGVwbG95bWVudHMgc3RheSBkaXNhbWJpZ3VhdGVkLlxuICpcbiAqIFJldHVybnMgYSByZWNvcmQga2V5ZWQgYnkgdG9vbCBpZCwgcmVhZHkgdG8gc3ByZWFkIGludG8gdGhlXG4gKiBjZW50cmFsIGBBZ2VudGAncyBgdG9vbHNgIG1hcCAob3Igc3VyZmFjZWQgdmlhIHRoZVxuICogYHBsdWdpbnMuZ2VuaWU/LnRvb2xraXQoKWAgY2FsbGJhY2spLiBSZXR1cm5zIGFuIGVtcHR5IHJlY29yZFxuICogd2hlbiBgc3BhY2VzYCByZXNvbHZlcyB0byB6ZXJvIGVudHJpZXMgc28gdGhlIGNhbGxlciBjYW4gc3ByZWFkXG4gKiBzYWZlbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEdlbmllVG9vbHMob3B0czoge1xuICBzcGFjZXM6IEdlbmllU3BhY2VzQ29uZmlnIHwgUmVjb3JkPHN0cmluZywgR2VuaWVTcGFjZUNvbmZpZz47XG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnO1xufSk6IE1hc3RyYVRvb2xzIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZUdlbmllU3BhY2VzKG9wdHMuc3BhY2VzKTtcbiAgY29uc3QgdG9vbHM6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVRvb2w+PiA9IHt9O1xuICBpZiAoT2JqZWN0LmtleXMobm9ybWFsaXplZCkubGVuZ3RoID09PSAwKSByZXR1cm4gdG9vbHM7XG5cbiAgLy8gU2hhcmVkLCBzcGFjZS1hZ25vc3RpYyB0b29scy5cbiAgdG9vbHMuZ2V0X3N0YXRlbWVudCA9IGJ1aWxkR2V0U3RhdGVtZW50VG9vbCgpO1xuICB0b29scy5wcmVwYXJlX2NoYXJ0ID0gYnVpbGRQcmVwYXJlQ2hhcnRUb29sKHsgY29uZmlnOiBvcHRzLmNvbmZpZyB9KTtcblxuICBmb3IgKGNvbnN0IFthbGlhcywgc3BhY2VdIG9mIE9iamVjdC5lbnRyaWVzKG5vcm1hbGl6ZWQpKSB7XG4gICAgY29uc3QgYXNrVG9vbCA9IGJ1aWxkQXNrR2VuaWVUb29sKHtcbiAgICAgIHNwYWNlSWQ6IHNwYWNlLnNwYWNlSWQsXG4gICAgICBhbGlhcyxcbiAgICAgIC4uLihvcHRzLmNvbmZpZy5nZW5pZUFnZW50TW9kZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8geyBhZ2VudE1vZGU6IG9wdHMuY29uZmlnLmdlbmllQWdlbnRNb2RlIH1cbiAgICAgICAgOiB7fSksXG4gICAgICAuLi4oc3BhY2UuaGludCA/IHsgaGludDogc3BhY2UuaGludCB9IDoge30pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRlc2NUb29sID0gYnVpbGRTcGFjZURlc2NyaXB0aW9uVG9vbCh7IHNwYWNlSWQ6IHNwYWNlLnNwYWNlSWQsIGFsaWFzIH0pO1xuICAgIGNvbnN0IHNlclRvb2wgPSBidWlsZFNwYWNlU2VyaWFsaXplZFRvb2woeyBzcGFjZUlkOiBzcGFjZS5zcGFjZUlkLCBhbGlhcyB9KTtcbiAgICB0b29sc1thc2tUb29sLmlkXSA9IGFza1Rvb2w7XG4gICAgdG9vbHNbZGVzY1Rvb2wuaWRdID0gZGVzY1Rvb2w7XG4gICAgdG9vbHNbc2VyVG9vbC5pZF0gPSBzZXJUb29sO1xuICB9XG4gIHJldHVybiB0b29scztcbn1cblxuLyoqXG4gKiBQbHVnaW4tdG9vbGtpdCBhZGFwdGVyIHNvIHRoZSBgcGx1Z2lucy5nZW5pZT8udG9vbGtpdCgpYCBsb29rdXBcbiAqIGluc2lkZSBhbiBhZ2VudCdzIGB0b29scyhwbHVnaW5zKWAgY2FsbGJhY2sgcmV0dXJucyB0aGVcbiAqIGZsYXQgR2VuaWUgdG9vbHMgcmVjb3JkIGluc3RlYWQgb2YgdGhyb3dpbmcgb24gbWlzc2luZyBwbHVnaW4uXG4gKiBNaXJyb3JzIEFwcEtpdCdzIGBQbHVnaW5Ub29sa2l0UHJvdmlkZXJgIHNoYXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRHZW5pZVRvb2xraXRQcm92aWRlcihvcHRzOiB7XG4gIHNwYWNlczogR2VuaWVTcGFjZXNDb25maWcgfCBSZWNvcmQ8c3RyaW5nLCBHZW5pZVNwYWNlQ29uZmlnPjtcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWc7XG59KToge1xuICB0b29sa2l0KG9wdHM/OiB1bmtub3duKTogTWFzdHJhVG9vbHM7XG59IHtcbiAgcmV0dXJuIHtcbiAgICB0b29sa2l0KF9vcHRzPzogdW5rbm93bikge1xuICAgICAgcmV0dXJuIGJ1aWxkR2VuaWVUb29scyhvcHRzKTtcbiAgICB9LFxuICB9O1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc3RhcnRlciBzdWdnZXN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBEZWZhdWx0IGNhcCBvbiBzdGFydGVyIHN1Z2dlc3Rpb25zIHN1cmZhY2VkIHRvIHRoZSBjaGF0IGVtcHR5XG4gKiBzdGF0ZS4gU2FtcGxlLXF1ZXN0aW9uIGxpc3RzIGNhbiBydW4gbG9uZyAoMTArIG9uIGEgY3VyYXRlZFxuICogc3BhY2UpOyBhIGhhbmRmdWwgb2Ygb25lLXRhcCBwcm9tcHRzIHJlYWRzIGJldHRlciB0aGFuIGEgd2FsbCBvZlxuICogYnV0dG9ucy5cbiAqL1xuY29uc3QgU1VHR0VTVElPTl9MSU1JVCA9IDY7XG5cbi8qKlxuICogSG93IGxvbmcgYSBzcGFjZSdzIHBhcnNlZCBzYW1wbGUgcXVlc3Rpb25zIHN0YXkgY2FjaGVkLiBUaGV5J3JlXG4gKiBhdXRob3JlZCBjb25maWcgdGhhdCBjaGFuZ2VzIHJhcmVseSwgYW5kIHRoZSBsb29rdXAgaXMgYW4gZXh0cmFcbiAqIFJFU1Qgcm91bmQtdHJpcCBwZXIgY2hhdCBtb3VudCwgc28gYSBmZXcgbWludXRlcyBvZiBjYWNoaW5nIGtlZXBzXG4gKiB0aGUgZW1wdHkgc3RhdGUgaW5zdGFudCBvbiByZWxvYWQgd2l0aG91dCBnb2luZyBzdGFsZSBmb3IgbG9uZy5cbiAqL1xuY29uc3QgU1VHR0VTVElPTl9DQUNIRV9UVExfTVMgPSAxMCAqIDYwXzAwMDtcblxuLyoqIFNwYWNlLWlkIC0+IGNhY2hlZCBzYW1wbGUgcXVlc3Rpb25zIHdpdGggYW4gYWJzb2x1dGUgZXhwaXJ5LiAqL1xuY29uc3QgX3N1Z2dlc3Rpb25DYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCB7IHF1ZXN0aW9uczogc3RyaW5nW107IGV4cGlyZXM6IG51bWJlciB9PigpO1xuXG4vKiogUmVhZCBhIHNwYWNlJ3MgY2FjaGVkIHF1ZXN0aW9ucywgb3IgYHVuZGVmaW5lZGAgb24gbWlzcyAvIGV4cGlyeS4gKi9cbmZ1bmN0aW9uIHJlYWRTdWdnZXN0aW9uQ2FjaGUoc3BhY2VJZDogc3RyaW5nKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICBjb25zdCBlbnRyeSA9IF9zdWdnZXN0aW9uQ2FjaGUuZ2V0KHNwYWNlSWQpO1xuICBpZiAoIWVudHJ5KSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoZW50cnkuZXhwaXJlcyA8PSBEYXRlLm5vdygpKSB7XG4gICAgX3N1Z2dlc3Rpb25DYWNoZS5kZWxldGUoc3BhY2VJZCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gZW50cnkucXVlc3Rpb25zO1xufVxuXG4vKiogQ2FjaGUgYSBzcGFjZSdzIHBhcnNlZCBxdWVzdGlvbnMgZm9yIHtAbGluayBTVUdHRVNUSU9OX0NBQ0hFX1RUTF9NU30uICovXG5mdW5jdGlvbiB3cml0ZVN1Z2dlc3Rpb25DYWNoZShzcGFjZUlkOiBzdHJpbmcsIHF1ZXN0aW9uczogc3RyaW5nW10pOiB2b2lkIHtcbiAgX3N1Z2dlc3Rpb25DYWNoZS5zZXQoc3BhY2VJZCwge1xuICAgIHF1ZXN0aW9ucyxcbiAgICBleHBpcmVzOiBEYXRlLm5vdygpICsgU1VHR0VTVElPTl9DQUNIRV9UVExfTVMsXG4gIH0pO1xufVxuXG4vKipcbiAqIENvbGxlY3QgdGhlIGN1cmF0ZWQgc3RhcnRlciBxdWVzdGlvbnMgYWNyb3NzIGV2ZXJ5IHJlc29sdmVkIEdlbmllXG4gKiBzcGFjZSwgZGVkdXBlZCBhbmQgY2FwcGVkLiBFYWNoIHNwYWNlJ3MgYHNhbXBsZV9xdWVzdGlvbnNgIGFyZVxuICogZmV0Y2hlZCBvbmNlIChjYWNoZWQgZm9yIHtAbGluayBTVUdHRVNUSU9OX0NBQ0hFX1RUTF9NU30pIHZpYVxuICoge0BsaW5rIGdldEdlbmllU3BhY2V9ICsge0BsaW5rIGdlbmllU2FtcGxlUXVlc3Rpb25zfSwgdGhlbiBtZXJnZWQgaW5cbiAqIGFsaWFzLWl0ZXJhdGlvbiBvcmRlciBzbyBhIHNpbmdsZS1zcGFjZSBhcHAgc3VyZmFjZXMgdGhhdCBzcGFjZSdzXG4gKiBxdWVzdGlvbnMgYW5kIGEgbXVsdGktc3BhY2UgYXBwIHJvdW5kLXRyaXBzIGJyZWFkdGgtZmlyc3QgdXAgdG8gdGhlXG4gKiBjYXAuIEEgcGVyLXNwYWNlIGZldGNoIGZhaWx1cmUgZGVncmFkZXMgdG8gXCJubyBxdWVzdGlvbnMgZm9yIHRoYXRcbiAqIHNwYWNlXCIgKGxvZ2dlZCwgbm90IHRocm93bikgc28gb25lIHVucmVhY2hhYmxlIHNwYWNlIG5ldmVyIGJsYW5rc1xuICogdGhlIHdob2xlIGxpc3QuIFJldHVybnMgYFtdYCB3aGVuIG5vIHNwYWNlcyBhcmUgY29uZmlndXJlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RTcGFjZVN1Z2dlc3Rpb25zKG9wdHM6IHtcbiAgc3BhY2VzOiBSZWNvcmQ8c3RyaW5nLCBHZW5pZVNwYWNlQ29uZmlnPjtcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQ7XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICBsaW1pdD86IG51bWJlcjtcbn0pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGxpbWl0ID0gb3B0cy5saW1pdCA/PyBTVUdHRVNUSU9OX0xJTUlUO1xuICBjb25zdCBtZXJnZWQ6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBmb3IgKGNvbnN0IHsgc3BhY2VJZCB9IG9mIE9iamVjdC52YWx1ZXMob3B0cy5zcGFjZXMpKSB7XG4gICAgbGV0IHF1ZXN0aW9ucyA9IHJlYWRTdWdnZXN0aW9uQ2FjaGUoc3BhY2VJZCk7XG4gICAgaWYgKCFxdWVzdGlvbnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNwYWNlID0gYXdhaXQgZ2VuaWVTcGFjZS5nZXRHZW5pZVNwYWNlKHNwYWNlSWQsIHtcbiAgICAgICAgICB3b3Jrc3BhY2VDbGllbnQ6IG9wdHMuY2xpZW50LFxuICAgICAgICAgIC4uLihvcHRzLnNpZ25hbCA/IHsgY29udGV4dDogb3B0cy5zaWduYWwgfSA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIHF1ZXN0aW9ucyA9IGdlbmllU3BhY2UuZ2VuaWVTYW1wbGVRdWVzdGlvbnMoc3BhY2UpO1xuICAgICAgICB3cml0ZVN1Z2dlc3Rpb25DYWNoZShzcGFjZUlkLCBxdWVzdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFwic3VnZ2VzdGlvbnM6ZmV0Y2gtZXJyb3JcIiwge1xuICAgICAgICAgIHNwYWNlSWQsXG4gICAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgICAgIH0pO1xuICAgICAgICBxdWVzdGlvbnMgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBxdWVzdGlvbiBvZiBxdWVzdGlvbnMpIHtcbiAgICAgIGlmIChzZWVuLmhhcyhxdWVzdGlvbikpIGNvbnRpbnVlO1xuICAgICAgc2Vlbi5hZGQocXVlc3Rpb24pO1xuICAgICAgbWVyZ2VkLnB1c2gocXVlc3Rpb24pO1xuICAgICAgaWYgKG1lcmdlZC5sZW5ndGggPj0gbGltaXQpIHJldHVybiBtZXJnZWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBtZXJnZWQ7XG59XG4iXX0=