@archont561/qgis-sdk 0.5.0 → 0.6.0

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
@@ -1,17 +1,13 @@
1
1
  # @archont561/qgis-sdk
2
2
 
3
- **The TypeScript SDK for QGIS plugin interfaces hosted in `QWebEngineView`:
4
- one typed object over the plugin's own declarations.**
5
-
6
- The page side of [`qgis-sdk`](https://pypi.org/project/qgis-sdk/). A page
7
- builds `QgisSdk` from the schema `qgis-sdk bridge generate` renders from the
8
- plugin's Python declarations and gets one typed method per action and
9
- stream, the curated host namespaces (`layers`, `project`, `files`,
10
- `algorithms`, ...), framework-free stores and React, Vue and Svelte
11
- bindings over them, and a scripted harness for tests. Every exported error
12
- begins with `QgisSdk` and carries a stable wire `code`.
13
-
14
- > Status: `0.5.0`, experimental `0.x`. Published as
3
+ **Bring typed QGIS plugin actions to your web UI.**
4
+
5
+ Build a `QgisSdk` client from your Python plugin's generated schema, call
6
+ its actions and streams, and use granted host services. Framework-free stores
7
+ and React, Vue and Svelte bindings help build interfaces in `QWebEngineView`;
8
+ a scripted host lets you test them without QGIS.
9
+
10
+ > Status: `0.6.0`, experimental `0.x`. Published as
15
11
  > `@archont561/qgis-sdk-bridge` through `0.2.0`; this name continues from
16
12
  > `0.3.0`, and `qgis-sdk` on npm is its unscoped alias. `./host`, `./react`,
17
13
  > `./vue`, `./svelte` and `./testing` are opt-in entry points.
@@ -44,13 +40,13 @@ composables and the Svelte stores; `./testing` scripts a host without QGIS.
44
40
 
45
41
  ## Documentation
46
42
 
47
- - [TypeScript package guide](https://github.com/Archont561/qgis-sdk/blob/main/backlog/docs/guides/doc-13%20-%20qgis-sdk-TypeScript-package-guide.md) -
43
+ - [TypeScript package guide](https://archont561.github.io/qgis-sdk/typescript/) -
48
44
  exports, `QgisSdk`, the transport client, host namespaces, streams, the
49
45
  stores, the React, Vue and Svelte bindings, Processing from a page and
50
46
  testing against a scripted host.
51
47
  - [`@archont561/qgis-sdk-ui`](https://github.com/Archont561/qgis-sdk/tree/main/packages/qgis-sdk-ui) -
52
48
  the web components on these stores.
53
- - [Python package guide](https://github.com/Archont561/qgis-sdk/blob/main/backlog/docs/guides/doc-12%20-%20qgis-sdk-Python-package-guide.md) -
49
+ - [Python package guide](https://archont561.github.io/qgis-sdk/python/) -
54
50
  the host half of every surface above.
55
51
 
56
52
  ## License
package/dist/bridge.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { StreamEventKind2, BRIDGE_PROTOCOL_VERSION2, MAX_CALL_ID_LENGTH2, BridgeFailure2, InvokeReply2, StreamTerminalKind2, BridgeStreamEvent2, BridgeStreamTerminal2, BridgeEventFrame2, BridgeTerminalFrame2, BridgeStreamFrame2, WireTransport2, BridgeClientOptions2, InvokeOptions2, QgisSdkBridgeProtocolError2, QgisSdkBridgeTimeoutError2, QgisSdkBridgeAbortedError2, QgisSdkBridgeClosedError2, QgisSdkBridgeSequenceError2, QgisSdkBridgeStreamEndedError2, QgisSdkBridgeRemoteError2, parseInvokeReply2, parseStreamFrame2, SubscriptionHandlers2, BridgeSubscription2, BridgeClient2 } from "./shared/chunk-wtv4vt4q.js";
2
- export { BRIDGE_PROTOCOL_VERSION2 as BRIDGE_PROTOCOL_VERSION, BridgeClient2 as BridgeClient, BridgeClientOptions2 as BridgeClientOptions, BridgeEventFrame2 as BridgeEventFrame, BridgeFailure2 as BridgeFailure, BridgeStreamEvent2 as BridgeStreamEvent, BridgeStreamFrame2 as BridgeStreamFrame, BridgeStreamTerminal2 as BridgeStreamTerminal, BridgeSubscription2 as BridgeSubscription, BridgeTerminalFrame2 as BridgeTerminalFrame, InvokeOptions2 as InvokeOptions, InvokeReply2 as InvokeReply, MAX_CALL_ID_LENGTH2 as MAX_CALL_ID_LENGTH, QgisSdkBridgeAbortedError2 as QgisSdkBridgeAbortedError, QgisSdkBridgeClosedError2 as QgisSdkBridgeClosedError, QgisSdkBridgeProtocolError2 as QgisSdkBridgeProtocolError, QgisSdkBridgeRemoteError2 as QgisSdkBridgeRemoteError, QgisSdkBridgeSequenceError2 as QgisSdkBridgeSequenceError, QgisSdkBridgeStreamEndedError2 as QgisSdkBridgeStreamEndedError, QgisSdkBridgeTimeoutError2 as QgisSdkBridgeTimeoutError, StreamEventKind2 as StreamEventKind, StreamTerminalKind2 as StreamTerminalKind, SubscriptionHandlers2 as SubscriptionHandlers, WireTransport2 as WireTransport, parseInvokeReply2 as parseInvokeReply, parseStreamFrame2 as parseStreamFrame };
1
+ import { StreamEventKind2, BRIDGE_PROTOCOL_VERSION2, MAX_CALL_ID_LENGTH2, BridgeFailure2, InvokeReply2, StreamTerminalKind2, BridgeStreamEvent2, BridgeStreamTerminal2, BridgeEventFrame2, BridgeTerminalFrame2, BridgeStreamFrame2, WireTransport2, BridgeClientOptions2, InvokeOptions2, SubscriptionHandlers2, BridgeSubscription2, BridgeClient2, QgisSdkBridgeProtocolError2, QgisSdkBridgeTimeoutError2, QgisSdkBridgeAbortedError2, QgisSdkBridgeClosedError2, QgisSdkBridgeRemoteError2, parseInvokeReply2, parseStreamFrame2 } from "./shared/chunk-8c12nwme.js";
2
+ export { BRIDGE_PROTOCOL_VERSION2 as BRIDGE_PROTOCOL_VERSION, BridgeClient2 as BridgeClient, BridgeClientOptions2 as BridgeClientOptions, BridgeEventFrame2 as BridgeEventFrame, BridgeFailure2 as BridgeFailure, BridgeStreamEvent2 as BridgeStreamEvent, BridgeStreamFrame2 as BridgeStreamFrame, BridgeStreamTerminal2 as BridgeStreamTerminal, BridgeSubscription2 as BridgeSubscription, BridgeTerminalFrame2 as BridgeTerminalFrame, InvokeOptions2 as InvokeOptions, InvokeReply2 as InvokeReply, MAX_CALL_ID_LENGTH2 as MAX_CALL_ID_LENGTH, QgisSdkBridgeAbortedError2 as QgisSdkBridgeAbortedError, QgisSdkBridgeClosedError2 as QgisSdkBridgeClosedError, QgisSdkBridgeProtocolError2 as QgisSdkBridgeProtocolError, QgisSdkBridgeRemoteError2 as QgisSdkBridgeRemoteError, QgisSdkBridgeTimeoutError2 as QgisSdkBridgeTimeoutError, StreamEventKind2 as StreamEventKind, StreamTerminalKind2 as StreamTerminalKind, SubscriptionHandlers2 as SubscriptionHandlers, WireTransport2 as WireTransport, parseInvokeReply2 as parseInvokeReply, parseStreamFrame2 as parseStreamFrame };
package/dist/bridge.js CHANGED
@@ -1,17 +1,15 @@
1
1
  import {
2
- BRIDGE_PROTOCOL_VERSION2,
3
- MAX_CALL_ID_LENGTH2,
4
2
  QgisSdkBridgeProtocolError2,
5
3
  QgisSdkBridgeTimeoutError2,
6
4
  QgisSdkBridgeAbortedError2,
7
5
  QgisSdkBridgeClosedError2,
8
- QgisSdkBridgeSequenceError2,
9
- QgisSdkBridgeStreamEndedError2,
10
6
  QgisSdkBridgeRemoteError2,
7
+ BRIDGE_PROTOCOL_VERSION2,
8
+ MAX_CALL_ID_LENGTH2,
11
9
  parseInvokeReply2,
12
10
  parseStreamFrame2,
13
11
  BridgeClient2
14
- } from "./shared/chunk-8gawbn19.js";
12
+ } from "./shared/chunk-xg5ntw1c.js";
15
13
  export {
16
14
  BRIDGE_PROTOCOL_VERSION2 as BRIDGE_PROTOCOL_VERSION,
17
15
  BridgeClient2 as BridgeClient,
@@ -20,12 +18,10 @@ export {
20
18
  QgisSdkBridgeClosedError2 as QgisSdkBridgeClosedError,
21
19
  QgisSdkBridgeProtocolError2 as QgisSdkBridgeProtocolError,
22
20
  QgisSdkBridgeRemoteError2 as QgisSdkBridgeRemoteError,
23
- QgisSdkBridgeSequenceError2 as QgisSdkBridgeSequenceError,
24
- QgisSdkBridgeStreamEndedError2 as QgisSdkBridgeStreamEndedError,
25
21
  QgisSdkBridgeTimeoutError2 as QgisSdkBridgeTimeoutError,
26
22
  parseInvokeReply2 as parseInvokeReply,
27
23
  parseStreamFrame2 as parseStreamFrame
28
24
  };
29
25
 
30
- //# debugId=40AA08F7CCD69E0B64756E2164756E21
31
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFtdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICBdLAogICJtYXBwaW5ncyI6ICIiLAogICJkZWJ1Z0lkIjogIjQwQUEwOEY3Q0NENjlFMEI2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
26
+ //# debugId=F6EF9BE921B582CA64756E2164756E21
27
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFtdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICBdLAogICJtYXBwaW5ncyI6ICIiLAogICJkZWJ1Z0lkIjogIkY2RUY5QkU5MjFCNTgyQ0E2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { MAX_SAFE_INTEGER2, MIN_SAFE_INTEGER2, PLUGIN_DESCRIPTION_SCHEMA_VERSION2, ValidationDirection2, SerializedValidationIssue2, SerializedContractValidationError2, ActionDescription2, StreamEventKind2, StreamDescription2, PluginDescription2, isSafeJsonInteger2, QgisSdkDeclarationError2, QgisSdkValidationIssue2, QgisSdkContractValidationError2, parsePluginDescription2, BRIDGE_PROTOCOL_VERSION2, MAX_CALL_ID_LENGTH2, BridgeFailure2, InvokeReply2, StreamTerminalKind2, BridgeStreamEvent2, BridgeStreamTerminal2, BridgeEventFrame2, BridgeTerminalFrame2, BridgeStreamFrame2, WireTransport2, BridgeClientOptions2, InvokeOptions2, QgisSdkBridgeProtocolError2, QgisSdkBridgeTimeoutError2, QgisSdkBridgeAbortedError2, QgisSdkBridgeClosedError2, QgisSdkBridgeSequenceError2, QgisSdkBridgeStreamEndedError2, QgisSdkBridgeRemoteError2, parseInvokeReply2, parseStreamFrame2, SubscriptionHandlers2, BridgeSubscription2, BridgeClient2 } from "./shared/chunk-wtv4vt4q.js";
1
+ import { MAX_SAFE_INTEGER2, MIN_SAFE_INTEGER2, PLUGIN_DESCRIPTION_SCHEMA_VERSION2, ValidationDirection2, SerializedValidationIssue2, SerializedContractValidationError2, ActionDescription2, StreamEventKind2, StreamDescription2, PluginDescription2, isSafeJsonInteger2, QgisSdkDeclarationError2, QgisSdkValidationIssue2, QgisSdkContractValidationError2, parsePluginDescription2, BRIDGE_PROTOCOL_VERSION2, MAX_CALL_ID_LENGTH2, BridgeFailure2, InvokeReply2, StreamTerminalKind2, BridgeStreamEvent2, BridgeStreamTerminal2, BridgeEventFrame2, BridgeTerminalFrame2, BridgeStreamFrame2, WireTransport2, BridgeClientOptions2, InvokeOptions2, SubscriptionHandlers2, BridgeSubscription2, BridgeClient2, QgisSdkBridgeProtocolError2, QgisSdkBridgeTimeoutError2, QgisSdkBridgeAbortedError2, QgisSdkBridgeClosedError2, QgisSdkBridgeRemoteError2, parseInvokeReply2, parseStreamFrame2 } from "./shared/chunk-8c12nwme.js";
2
2
  import { HostInvokeOptions2, AlgorithmInfo2, AlgorithmSummary2, FileRef2, OutputInfo2, ParameterInfo2, ProviderInfo2, RunOutput2, RunResult2, VectorLayerInfo2, HostOperations2 } from "./shared/chunk-7tgzmz0m.js";
3
- import { OperationShape2, StreamShape2, OperationMap2, StreamMap2, BridgeSchema2, OperationsOf2, StreamsOf2, defineBridgeSchema2, QgisSdkOptions2, StreamHandlers2, StreamHandle2, OperationMethod2, StreamMethod2, QgisSdkHostTheme2, QgisSdkHost2, QgisSdkCore2, OperationTree2, StreamTree2, QGIS_SDK_MEMBERS2, QgisSdk2 } from "./shared/chunk-a33y575v.js";
4
- import { DeclaredSchema2, ValidateOptions2, ContractDirection2, SerializedContractError2, QgisSdkContractError2, validateAgainstSchema2, QgisSdkStoreError2, StoreListener2, Store2, OperationState2, Operation2, OperationStore2, StreamTerminalLike2, StreamHandleLike2, StreamHandlersLike2, Stream2, StreamState2, stableKey2, StreamStore2, FormFieldKind2, FormField2, labelFor2, schemaFields2, FormValues2, FormState2, FormOptions2, FormStore2, formStore2, HostQueryState2, HostQueryLoader2, HostQueryStore2, LayersQueryOptions2, layersQuery2, layerFieldsQuery2 } from "./shared/chunk-3zscfm3y.js";
3
+ import { OperationShape2, StreamShape2, OperationMap2, StreamMap2, BridgeSchema2, OperationsOf2, StreamsOf2, defineBridgeSchema2, QgisSdkOptions2, StreamHandlers2, StreamHandle2, OperationMethod2, StreamMethod2, QgisSdkHostTheme2, QgisSdkHost2, QgisSdkCore2, OperationTree2, StreamTree2, QGIS_SDK_MEMBERS2, QgisSdk2 } from "./shared/chunk-nwz8n14x.js";
4
+ import { QgisSdkStoreError2, StoreListener2, Store2, DeclaredSchema2, ValidateOptions2, ContractDirection2, SerializedContractError2, QgisSdkContractError2, validateAgainstSchema2, OperationState2, Operation2, OperationStore2, FormFieldKind2, FormField2, labelFor2, schemaFields2, FormValues2, FormState2, FormOptions2, FormStore2, formStore2, HostQueryState2, HostQueryLoader2, HostQueryStore2, LayersQueryOptions2, layersQuery2, layerFieldsQuery2, StreamTerminalLike2, StreamHandleLike2, StreamHandlersLike2, Stream2, StreamState2, stableKey2, StreamStore2 } from "./shared/chunk-b11znjn6.js";
5
5
  import { QgisSdkError2 } from "./shared/chunk-pdj2fxjb.js";
6
6
  /** A layer input: the id of a layer the host owns, or a ref the view holds. */
7
7
  type LayerRef = string | FileRef2;
@@ -70,4 +70,4 @@ declare function insideQgis(): boolean;
70
70
  * dropped) when the host registered no object under that name.
71
71
  */
72
72
  declare function createWebChannelTransport(objectName?: string): WebChannelTransport;
73
- export { ActionDescription2 as ActionDescription, AlgorithmHost, AlgorithmInfo2 as AlgorithmInfo, AlgorithmRegistryLike, AlgorithmRun, AlgorithmSummary2 as AlgorithmSummary, BRIDGE_PROTOCOL_VERSION2 as BRIDGE_PROTOCOL_VERSION, BridgeClient2 as BridgeClient, BridgeClientOptions2 as BridgeClientOptions, BridgeEventFrame2 as BridgeEventFrame, BridgeFailure2 as BridgeFailure, BridgeSchema2 as BridgeSchema, BridgeStreamEvent2 as BridgeStreamEvent, BridgeStreamFrame2 as BridgeStreamFrame, BridgeStreamTerminal2 as BridgeStreamTerminal, BridgeSubscription2 as BridgeSubscription, BridgeTerminalFrame2 as BridgeTerminalFrame, ContractDirection2 as ContractDirection, DeclaredSchema2 as DeclaredSchema, Destination, Extent, FileRef2 as FileRef, FormField2 as FormField, FormFieldKind2 as FormFieldKind, FormOptions2 as FormOptions, FormState2 as FormState, FormStore2 as FormStore, FormValues2 as FormValues, HostInvokeOptions2 as HostInvokeOptions, HostQueryLoader2 as HostQueryLoader, HostQueryState2 as HostQueryState, HostQueryStore2 as HostQueryStore, InvokeOptions2 as InvokeOptions, InvokeReply2 as InvokeReply, LayerRef, LayersQueryOptions2 as LayersQueryOptions, MAX_CALL_ID_LENGTH2 as MAX_CALL_ID_LENGTH, MAX_SAFE_INTEGER2 as MAX_SAFE_INTEGER, MIN_SAFE_INTEGER2 as MIN_SAFE_INTEGER, Operation2 as Operation, OperationMap2 as OperationMap, OperationMethod2 as OperationMethod, OperationShape2 as OperationShape, OperationState2 as OperationState, OperationStore2 as OperationStore, OperationTree2 as OperationTree, OperationsOf2 as OperationsOf, OutputInfo2 as OutputInfo, PLUGIN_DESCRIPTION_SCHEMA_VERSION2 as PLUGIN_DESCRIPTION_SCHEMA_VERSION, ParameterInfo2 as ParameterInfo, PluginDescription2 as PluginDescription, PointValue, ProviderInfo2 as ProviderInfo, QGIS_SDK_MEMBERS2 as QGIS_SDK_MEMBERS, QgisSdk2 as QgisSdk, QgisSdkBridgeAbortedError2 as QgisSdkBridgeAbortedError, QgisSdkBridgeClosedError2 as QgisSdkBridgeClosedError, QgisSdkBridgeProtocolError2 as QgisSdkBridgeProtocolError, QgisSdkBridgeRemoteError2 as QgisSdkBridgeRemoteError, QgisSdkBridgeSequenceError2 as QgisSdkBridgeSequenceError, QgisSdkBridgeStreamEndedError2 as QgisSdkBridgeStreamEndedError, QgisSdkBridgeTimeoutError2 as QgisSdkBridgeTimeoutError, QgisSdkContractError2 as QgisSdkContractError, QgisSdkContractValidationError2 as QgisSdkContractValidationError, QgisSdkCore2 as QgisSdkCore, QgisSdkDeclarationError2 as QgisSdkDeclarationError, QgisSdkError2 as QgisSdkError, QgisSdkHost2 as QgisSdkHost, QgisSdkHostTheme2 as QgisSdkHostTheme, QgisSdkOptions2 as QgisSdkOptions, QgisSdkStoreError2 as QgisSdkStoreError, QgisSdkValidationIssue2 as QgisSdkValidationIssue, QgisSdkWebChannelError, RangeValue, RunOutput2 as RunOutput, RunResult2 as RunResult, SerializedContractError2 as SerializedContractError, SerializedContractValidationError2 as SerializedContractValidationError, SerializedValidationIssue2 as SerializedValidationIssue, Store2 as Store, StoreListener2 as StoreListener, Stream2 as Stream, StreamDescription2 as StreamDescription, StreamEventKind2 as StreamEventKind, StreamHandle2 as StreamHandle, StreamHandleLike2 as StreamHandleLike, StreamHandlers2 as StreamHandlers, StreamHandlersLike2 as StreamHandlersLike, StreamMap2 as StreamMap, StreamMethod2 as StreamMethod, StreamShape2 as StreamShape, StreamState2 as StreamState, StreamStore2 as StreamStore, StreamTerminalKind2 as StreamTerminalKind, StreamTerminalLike2 as StreamTerminalLike, StreamTree2 as StreamTree, StreamsOf2 as StreamsOf, SubscriptionHandlers2 as SubscriptionHandlers, ValidateOptions2 as ValidateOptions, ValidationDirection2 as ValidationDirection, VectorLayerInfo2 as VectorLayerInfo, WebChannelTransport, WireTransport2 as WireTransport, createWebChannelTransport, defineBridgeSchema2 as defineBridgeSchema, formStore2 as formStore, insideQgis, isSafeJsonInteger2 as isSafeJsonInteger, labelFor2 as labelFor, layerFieldsQuery2 as layerFieldsQuery, layersQuery2 as layersQuery, outputsByName, parseInvokeReply2 as parseInvokeReply, parsePluginDescription2 as parsePluginDescription, parseStreamFrame2 as parseStreamFrame, runAlgorithm, schemaFields2 as schemaFields, stableKey2 as stableKey, validateAgainstSchema2 as validateAgainstSchema };
73
+ export { ActionDescription2 as ActionDescription, AlgorithmHost, AlgorithmInfo2 as AlgorithmInfo, AlgorithmRegistryLike, AlgorithmRun, AlgorithmSummary2 as AlgorithmSummary, BRIDGE_PROTOCOL_VERSION2 as BRIDGE_PROTOCOL_VERSION, BridgeClient2 as BridgeClient, BridgeClientOptions2 as BridgeClientOptions, BridgeEventFrame2 as BridgeEventFrame, BridgeFailure2 as BridgeFailure, BridgeSchema2 as BridgeSchema, BridgeStreamEvent2 as BridgeStreamEvent, BridgeStreamFrame2 as BridgeStreamFrame, BridgeStreamTerminal2 as BridgeStreamTerminal, BridgeSubscription2 as BridgeSubscription, BridgeTerminalFrame2 as BridgeTerminalFrame, ContractDirection2 as ContractDirection, DeclaredSchema2 as DeclaredSchema, Destination, Extent, FileRef2 as FileRef, FormField2 as FormField, FormFieldKind2 as FormFieldKind, FormOptions2 as FormOptions, FormState2 as FormState, FormStore2 as FormStore, FormValues2 as FormValues, HostInvokeOptions2 as HostInvokeOptions, HostQueryLoader2 as HostQueryLoader, HostQueryState2 as HostQueryState, HostQueryStore2 as HostQueryStore, InvokeOptions2 as InvokeOptions, InvokeReply2 as InvokeReply, LayerRef, LayersQueryOptions2 as LayersQueryOptions, MAX_CALL_ID_LENGTH2 as MAX_CALL_ID_LENGTH, MAX_SAFE_INTEGER2 as MAX_SAFE_INTEGER, MIN_SAFE_INTEGER2 as MIN_SAFE_INTEGER, Operation2 as Operation, OperationMap2 as OperationMap, OperationMethod2 as OperationMethod, OperationShape2 as OperationShape, OperationState2 as OperationState, OperationStore2 as OperationStore, OperationTree2 as OperationTree, OperationsOf2 as OperationsOf, OutputInfo2 as OutputInfo, PLUGIN_DESCRIPTION_SCHEMA_VERSION2 as PLUGIN_DESCRIPTION_SCHEMA_VERSION, ParameterInfo2 as ParameterInfo, PluginDescription2 as PluginDescription, PointValue, ProviderInfo2 as ProviderInfo, QGIS_SDK_MEMBERS2 as QGIS_SDK_MEMBERS, QgisSdk2 as QgisSdk, QgisSdkBridgeAbortedError2 as QgisSdkBridgeAbortedError, QgisSdkBridgeClosedError2 as QgisSdkBridgeClosedError, QgisSdkBridgeProtocolError2 as QgisSdkBridgeProtocolError, QgisSdkBridgeRemoteError2 as QgisSdkBridgeRemoteError, QgisSdkBridgeTimeoutError2 as QgisSdkBridgeTimeoutError, QgisSdkContractError2 as QgisSdkContractError, QgisSdkContractValidationError2 as QgisSdkContractValidationError, QgisSdkCore2 as QgisSdkCore, QgisSdkDeclarationError2 as QgisSdkDeclarationError, QgisSdkError2 as QgisSdkError, QgisSdkHost2 as QgisSdkHost, QgisSdkHostTheme2 as QgisSdkHostTheme, QgisSdkOptions2 as QgisSdkOptions, QgisSdkStoreError2 as QgisSdkStoreError, QgisSdkValidationIssue2 as QgisSdkValidationIssue, QgisSdkWebChannelError, RangeValue, RunOutput2 as RunOutput, RunResult2 as RunResult, SerializedContractError2 as SerializedContractError, SerializedContractValidationError2 as SerializedContractValidationError, SerializedValidationIssue2 as SerializedValidationIssue, Store2 as Store, StoreListener2 as StoreListener, Stream2 as Stream, StreamDescription2 as StreamDescription, StreamEventKind2 as StreamEventKind, StreamHandle2 as StreamHandle, StreamHandleLike2 as StreamHandleLike, StreamHandlers2 as StreamHandlers, StreamHandlersLike2 as StreamHandlersLike, StreamMap2 as StreamMap, StreamMethod2 as StreamMethod, StreamShape2 as StreamShape, StreamState2 as StreamState, StreamStore2 as StreamStore, StreamTerminalKind2 as StreamTerminalKind, StreamTerminalLike2 as StreamTerminalLike, StreamTree2 as StreamTree, StreamsOf2 as StreamsOf, SubscriptionHandlers2 as SubscriptionHandlers, ValidateOptions2 as ValidateOptions, ValidationDirection2 as ValidationDirection, VectorLayerInfo2 as VectorLayerInfo, WebChannelTransport, WireTransport2 as WireTransport, createWebChannelTransport, defineBridgeSchema2 as defineBridgeSchema, formStore2 as formStore, insideQgis, isSafeJsonInteger2 as isSafeJsonInteger, labelFor2 as labelFor, layerFieldsQuery2 as layerFieldsQuery, layersQuery2 as layersQuery, outputsByName, parseInvokeReply2 as parseInvokeReply, parsePluginDescription2 as parsePluginDescription, parseStreamFrame2 as parseStreamFrame, runAlgorithm, schemaFields2 as schemaFields, stableKey2 as stableKey, validateAgainstSchema2 as validateAgainstSchema };
package/dist/index.js CHANGED
@@ -1,18 +1,16 @@
1
1
  import {
2
2
  isPlainRecord,
3
- BRIDGE_PROTOCOL_VERSION2,
4
- MAX_CALL_ID_LENGTH2,
5
3
  QgisSdkBridgeProtocolError2,
6
4
  QgisSdkBridgeTimeoutError2,
7
5
  QgisSdkBridgeAbortedError2,
8
6
  QgisSdkBridgeClosedError2,
9
- QgisSdkBridgeSequenceError2,
10
- QgisSdkBridgeStreamEndedError2,
11
7
  QgisSdkBridgeRemoteError2,
8
+ BRIDGE_PROTOCOL_VERSION2,
9
+ MAX_CALL_ID_LENGTH2,
12
10
  parseInvokeReply2,
13
11
  parseStreamFrame2,
14
12
  BridgeClient2
15
- } from "./shared/chunk-8gawbn19.js";
13
+ } from "./shared/chunk-xg5ntw1c.js";
16
14
  import {
17
15
  MAX_SAFE_INTEGER2,
18
16
  MIN_SAFE_INTEGER2,
@@ -26,16 +24,16 @@ import {
26
24
  validateAgainstSchema2,
27
25
  QgisSdkStoreError2,
28
26
  OperationStore2,
29
- stableKey2,
30
- StreamStore2,
31
27
  labelFor2,
32
28
  schemaFields2,
33
29
  FormStore2,
34
30
  formStore2,
35
31
  HostQueryStore2,
36
32
  layersQuery2,
37
- layerFieldsQuery2
38
- } from "./shared/chunk-t1vpt5yq.js";
33
+ layerFieldsQuery2,
34
+ stableKey2,
35
+ StreamStore2
36
+ } from "./shared/chunk-72sjmz60.js";
39
37
  import {
40
38
  HOST_OPERATIONS2,
41
39
  createHost2
@@ -385,8 +383,6 @@ export {
385
383
  QgisSdkBridgeClosedError2 as QgisSdkBridgeClosedError,
386
384
  QgisSdkBridgeProtocolError2 as QgisSdkBridgeProtocolError,
387
385
  QgisSdkBridgeRemoteError2 as QgisSdkBridgeRemoteError,
388
- QgisSdkBridgeSequenceError2 as QgisSdkBridgeSequenceError,
389
- QgisSdkBridgeStreamEndedError2 as QgisSdkBridgeStreamEndedError,
390
386
  QgisSdkBridgeTimeoutError2 as QgisSdkBridgeTimeoutError,
391
387
  QgisSdkContractError2 as QgisSdkContractError,
392
388
  QgisSdkContractValidationError2 as QgisSdkContractValidationError,
@@ -414,5 +410,5 @@ export {
414
410
  validateAgainstSchema2 as validateAgainstSchema
415
411
  };
416
412
 
417
- //# debugId=507C47A54A87BD1B64756E2164756E21
418
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL3Byb2Nlc3NpbmcudHMiLCAic3JjL3dlYmNoYW5uZWwudHMiLCAic3JjL3FnaXMtc2RrLnRzIiwgInNyYy9zY2hlbWEudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiLyoqXG4gKiBQcm9jZXNzaW5nIGZyb20gYSBwYWdlIChkZWNpc2lvbi02NCk6IHRoZSB2YWx1ZSBhbGlhc2VzIGEgZ2VuZXJhdGVkXG4gKiBgcHJvY2Vzc2luZy5zY2hlbWEudHNgIGFubm90YXRlcyB3aXRoLCBhbmQgYHJ1bkFsZ29yaXRobWAsIHdoaWNoIHNlbmRzIG9uZVxuICogYGFsZ29yaXRobXMucnVuYCBhbmQgcmVzaGFwZXMgdGhlIHRhZ2dlZCBvdXRwdXRzIGludG8gdGhlIHJlc3VsdCBvYmplY3QgdGhlXG4gKiBnZW5lcmF0ZWQgYDxQcm92aWRlcj48QWxnb3JpdGhtPlJlc3VsdGAgdHlwZSBzcGVsbHMuXG4gKlxuICogVGhlIHR5cGluZyBsaXZlcyBpbiB0aGUgZ2VuZXJhdGVkIG1vZHVsZSwgbm90IGhlcmU6IGBxZ2lzLXNkayBwcm9jZXNzaW5nXG4gKiBnZW5lcmF0ZWAgZW1pdHMgYW4gYEFsZ29yaXRobVJlZ2lzdHJ5YCBmb3IgdGhlIHByb3ZpZGVycyB0aGUgcHJvamVjdCBhc2tlZFxuICogZm9yIGFuZCBhIGBydW5BbGdvcml0aG1gIGJvdW5kIHRvIGl0LiBUaGlzIG1vZHVsZSBpcyBnZW5lcmljIG92ZXIgYW55IHN1Y2hcbiAqIHJlZ2lzdHJ5IHNvIHRoZSBicmlkZ2UgaXRzZWxmIHNoaXBzIG5vIGNhdGFsb2d1ZSAoZGVjaXNpb24tNDc6IHplcm8gcnVudGltZVxuICogZGF0YSB0aGF0IGdvZXMgc3RhbGUgd2l0aCBhIFFHSVMgcmVsZWFzZSkuXG4gKlxuICogVGhlIGhvc3QgdmFsaWRhdGVzIHRoZSBwYXJhbWV0ZXJzIGFnYWluc3QgdGhlIGFsZ29yaXRobSdzIG93biBkZXNjcmlwdGlvblxuICogYmVmb3JlIGFueXRoaW5nIHJ1bnM7IGEgbGF5ZXIgaW5wdXQgaXMgYW4gb3duZWQgbGF5ZXIgaWQsIGEgZmlsZSBpbnB1dCBpcyBhXG4gKiByZWYgdGhlIGhvc3QgbWludGVkIGZvciB0aGlzIHZpZXcsIGFuZCBhbiBvbWl0dGVkIGRlc3RpbmF0aW9uIGNvbWVzIGJhY2sgYXNcbiAqIGFuIG93bmVkIGxheWVyIG9yIGEgcmVhZGFibGUgcmVmLlxuICovXG5cbmltcG9ydCB0eXBlIHtcblx0RmlsZVJlZixcblx0SG9zdEludm9rZU9wdGlvbnMsXG5cdEhvc3RPcGVyYXRpb25zLFxuXHRSdW5PdXRwdXQsXG5cdFJ1blJlc3VsdCxcblx0VmVjdG9yTGF5ZXJJbmZvLFxufSBmcm9tIFwiLi9nZW5lcmF0ZWQvaG9zdFwiO1xuXG5leHBvcnQgdHlwZSB7XG5cdEFsZ29yaXRobUluZm8sXG5cdEFsZ29yaXRobVN1bW1hcnksXG5cdEZpbGVSZWYsXG5cdEhvc3RJbnZva2VPcHRpb25zLFxuXHRPdXRwdXRJbmZvLFxuXHRQYXJhbWV0ZXJJbmZvLFxuXHRQcm92aWRlckluZm8sXG5cdFJ1bk91dHB1dCxcblx0UnVuUmVzdWx0LFxuXHRWZWN0b3JMYXllckluZm8sXG59IGZyb20gXCIuL2dlbmVyYXRlZC9ob3N0XCI7XG5cbi8qKiBBIGxheWVyIGlucHV0OiB0aGUgaWQgb2YgYSBsYXllciB0aGUgaG9zdCBvd25zLCBvciBhIHJlZiB0aGUgdmlldyBob2xkcy4gKi9cbmV4cG9ydCB0eXBlIExheWVyUmVmID0gc3RyaW5nIHwgRmlsZVJlZjtcbi8qKiBXaGVyZSBhbiBvdXRwdXQgZ29lczogYSB3cml0YWJsZSByZWYsIG9yIGBudWxsYCB0byBsZXQgdGhlIGhvc3QgYWxsb2NhdGUgb25lLiAqL1xuZXhwb3J0IHR5cGUgRGVzdGluYXRpb24gPSBGaWxlUmVmIHwgbnVsbDtcbi8qKiBgXCJ4bWluLHhtYXgseW1pbix5bWF4IFtjcnNdXCJgIGFzIFFHSVMgd3JpdGVzIGl0LCBvciB0aGUgZm91ciBudW1iZXJzLiAqL1xuZXhwb3J0IHR5cGUgRXh0ZW50ID0gc3RyaW5nIHwgcmVhZG9ubHkgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4vKiogYFwieCx5IFtjcnNdXCJgIG9yIHRoZSB0d28gbnVtYmVycy4gKi9cbmV4cG9ydCB0eXBlIFBvaW50VmFsdWUgPSBzdHJpbmcgfCByZWFkb25seSBbbnVtYmVyLCBudW1iZXJdO1xuLyoqIGBbbG93ZXIsIHVwcGVyXWAuICovXG5leHBvcnQgdHlwZSBSYW5nZVZhbHVlID0gcmVhZG9ubHkgW251bWJlciwgbnVtYmVyXTtcblxuLyoqXG4gKiBXaGF0IGEgZ2VuZXJhdGVkIGBBbGdvcml0aG1SZWdpc3RyeWAgaXM6IHBhcmFtcyBhbmQgcmVzdWx0IHBlciBhbGdvcml0aG0gaWQuXG4gKiBTcGVsbGVkIGFzIGEgbWFwcGVkIGNvbnN0cmFpbnQgb3ZlciB0aGUgcmVnaXN0cnkgaXRzZWxmIHNvIGFuIGBpbnRlcmZhY2VgXG4gKiAod2hpY2ggaGFzIG5vIGltcGxpY2l0IGluZGV4IHNpZ25hdHVyZSkgc2F0aXNmaWVzIGl0LlxuICovXG5leHBvcnQgdHlwZSBBbGdvcml0aG1SZWdpc3RyeUxpa2U8Uj4gPSB7XG5cdHJlYWRvbmx5IFtLIGluIGtleW9mIFJdOiB7IHJlYWRvbmx5IHBhcmFtczogb2JqZWN0OyByZWFkb25seSByZXN1bHQ6IG9iamVjdCB9O1xufTtcblxuLyoqIFRoZSBwYXJ0IG9mIGEgYFFnaXNTZGtgIChvciBhbnl0aGluZyBlbHNlKSBgcnVuQWxnb3JpdGhtYCBuZWVkcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWxnb3JpdGhtSG9zdCB7XG5cdHJlYWRvbmx5IGhvc3Q6IFBpY2s8SG9zdE9wZXJhdGlvbnMsIFwiYWxnb3JpdGhtc1wiPjtcbn1cblxuLyoqIE9uZSBydW4gYXMgdGhlIHBhZ2Ugc2VlcyBpdDogdGhlIG91dHB1dHMgYnkgbmFtZSwgcGx1cyB0aGUgcmVwbHkgYXMgaXQgY3Jvc3NlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWxnb3JpdGhtUnVuPFJlc3VsdCBleHRlbmRzIG9iamVjdD4ge1xuXHRyZWFkb25seSBhbGdvcml0aG06IHN0cmluZztcblx0cmVhZG9ubHkgb3V0cHV0czogUmVzdWx0O1xuXHRyZWFkb25seSByYXc6IFJ1blJlc3VsdDtcbn1cblxuLyoqXG4gKiBSdW4gYGlkYCB3aXRoIGBwYXJhbXNgIHRocm91Z2ggYHFnaXMuaG9zdC5hbGdvcml0aG1zLnJ1bmAgYW5kIHJlc2hhcGUgdGhlXG4gKiByZXBseTogYSBgdmVjdG9yYCBvdXRwdXQgYmVjb21lcyBpdHMgYFZlY3RvckxheWVySW5mb2AsIGEgYGZpbGVgIG91dHB1dCBpdHNcbiAqIGBGaWxlUmVmYCwgYSBgdmFsdWVgIG91dHB1dCB0aGUgc2NhbGFyIC0ga2V5ZWQgYnkgb3V0cHV0IG5hbWUsIHdoaWNoIGlzIHdoYXRcbiAqIHRoZSBnZW5lcmF0ZWQgYC4uLlJlc3VsdGAgaW50ZXJmYWNlcyBkZWNsYXJlLlxuICpcbiAqIEJvdGggdHlwZSBwYXJhbWV0ZXJzIGFyZSBtZWFudCB0byBiZSBib3VuZCBieSB0aGUgZ2VuZXJhdGVkIG1vZHVsZSdzIG93blxuICogYHJ1bkFsZ29yaXRobWA7IGNhbGxpbmcgdGhpcyBvbmUgZGlyZWN0bHkgbmVlZHMgdGhlbSBzcGVsbGVkIG91dC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkFsZ29yaXRobTxcblx0UiBleHRlbmRzIEFsZ29yaXRobVJlZ2lzdHJ5TGlrZTxSPixcblx0SyBleHRlbmRzIGtleW9mIFIgJiBzdHJpbmcsXG4+KFxuXHRxZ2lzOiBBbGdvcml0aG1Ib3N0LFxuXHRpZDogSyxcblx0cGFyYW1zOiBSW0tdW1wicGFyYW1zXCJdLFxuXHRvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMsXG4pOiBQcm9taXNlPEFsZ29yaXRobVJ1bjxSW0tdW1wicmVzdWx0XCJdPj4ge1xuXHRjb25zdCByYXcgPSBhd2FpdCBxZ2lzLmhvc3QuYWxnb3JpdGhtcy5ydW4oXG5cdFx0eyBhbGdvcml0aG1faWQ6IGlkLCBwYXJhbXM6IHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9LFxuXHRcdG9wdGlvbnMsXG5cdCk7XG5cdHJldHVybiB7XG5cdFx0YWxnb3JpdGhtOiByYXcuYWxnb3JpdGhtLFxuXHRcdG91dHB1dHM6IG91dHB1dHNCeU5hbWUocmF3Lm91dHB1dHMpIGFzIFJbS11bXCJyZXN1bHRcIl0sXG5cdFx0cmF3LFxuXHR9O1xufVxuXG4vKiogVW53cmFwIGEgdGFnZ2VkIG91dHB1dCBsaXN0IGludG8gYHsgW25hbWVdOiBsYXllciB8IHJlZiB8IHZhbHVlIH1gLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG91dHB1dHNCeU5hbWUoXG5cdG91dHB1dHM6IHJlYWRvbmx5IFJ1bk91dHB1dFtdLFxuKTogUmVjb3JkPFxuXHRzdHJpbmcsXG5cdFZlY3RvckxheWVySW5mbyB8IEZpbGVSZWYgfCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZFxuPiB7XG5cdGNvbnN0IHJlc3VsdDogUmVjb3JkPFxuXHRcdHN0cmluZyxcblx0XHRWZWN0b3JMYXllckluZm8gfCBGaWxlUmVmIHwgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWRcblx0PiA9IHt9O1xuXHRmb3IgKGNvbnN0IG91dHB1dCBvZiBvdXRwdXRzKSB7XG5cdFx0aWYgKG91dHB1dC5raW5kID09PSBcInZlY3RvclwiKSByZXN1bHRbb3V0cHV0Lm5hbWVdID0gb3V0cHV0LmxheWVyO1xuXHRcdGVsc2UgaWYgKG91dHB1dC5raW5kID09PSBcImZpbGVcIikgcmVzdWx0W291dHB1dC5uYW1lXSA9IG91dHB1dC5maWxlO1xuXHRcdGVsc2UgcmVzdWx0W291dHB1dC5uYW1lXSA9IG91dHB1dC52YWx1ZTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufVxuIiwKICAgICIvKipcbiAqIFRoZSBkZWZhdWx0IHRyYW5zcG9ydDogUXQncyBXZWJDaGFubmVsLCBhcyBhIFFHSVMgd2ViIHZpZXcgaW5qZWN0cyBpdC5cbiAqXG4gKiBRR0lTIHJlZ2lzdGVycyBvbmUgb2JqZWN0IG9uIHRoZSBjaGFubmVsICh0aGUgZXhhbXBsZSBuYW1lcyBpdCBcImJyaWRnZVwiO1xuICogc2VlIGBjcmVhdGVfY2hhbm5lbF9vYmplY3RgIGluIHRoZSBQeXRob24gcnVudGltZSkuIEl0cyBgcmVjZWl2ZWAgc2xvdCB0YWtlc1xuICogYSBKU09OIGVudmVsb3BlIGFuZCBpdHMgYG1lc3NhZ2VgIHNpZ25hbCBjYXJyaWVzIGV2ZXJ5IHJlcGx5IGFuZCBzdHJlYW1cbiAqIGZyYW1lIGJhY2suIFRoZSBjaGFubmVsIGJlY29tZXMgcmVhZHkgb24gYSBsYXRlciB0dXJuLCBzbyB0aGlzIHRyYW5zcG9ydFxuICogaXMgbGF6eTogYSBgUWdpc1Nka2AgYnVpbHQgaW4gdGhlIGZpcnN0IHN0YXRlbWVudCBvZiBhIHBhZ2UgY2FuIHNlbmQgYXRcbiAqIG9uY2UsIGFuZCB3aGF0IGl0IHNlbnQgaXMgZGVsaXZlcmVkIHdoZW4gdGhlIGNoYW5uZWwgcmVwb3J0cyByZWFkeS5cbiAqXG4gKiBUaGlzIGlzIHRoZSBvbmUgbW9kdWxlIG9mIHRoZSByb290IGVudHJ5IHBvaW50IHRoYXQgcmVhZHMgYSBicm93c2VyIGdsb2JhbCxcbiAqIGFuZCBpdCBvbmx5IGRvZXMgc28gd2hlbiBjYWxsZWQ6IGltcG9ydGluZyBpdCB0b3VjaGVzIG5vdGhpbmcsIGFuZCBhIHBhZ2VcbiAqIHRoYXQgaXMgbm90IGluc2lkZSBRR0lTIGdldHMgYSBzeW5jaHJvbm91cywgbmFtZWQgcmVmdXNhbCBpbnN0ZWFkIG9mIGEgaGFuZy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFdpcmVUcmFuc3BvcnQgfSBmcm9tIFwiLi9icmlkZ2VcIjtcbmltcG9ydCB7IFFnaXNTZGtFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuXG5pbnRlcmZhY2UgQ2hhbm5lbE9iamVjdCB7XG5cdHJlY2VpdmUodGV4dDogc3RyaW5nKTogdm9pZDtcblx0cmVhZG9ubHkgbWVzc2FnZToge1xuXHRcdGNvbm5lY3QobGlzdGVuZXI6ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkO1xuXHRcdGRpc2Nvbm5lY3QobGlzdGVuZXI6ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkO1xuXHR9O1xufVxuXG5pbnRlcmZhY2UgQ2hhbm5lbCB7XG5cdHJlYWRvbmx5IG9iamVjdHM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIENoYW5uZWxPYmplY3QgfCB1bmRlZmluZWQ+Pjtcbn1cblxuaW50ZXJmYWNlIFF0U2NvcGUge1xuXHRyZWFkb25seSBxdD86IHsgcmVhZG9ubHkgd2ViQ2hhbm5lbFRyYW5zcG9ydDogdW5rbm93biB9O1xuXHRyZWFkb25seSBRV2ViQ2hhbm5lbD86IG5ldyAoXG5cdFx0dHJhbnNwb3J0OiB1bmtub3duLFxuXHRcdHJlYWR5OiAoY2hhbm5lbDogQ2hhbm5lbCkgPT4gdm9pZCxcblx0KSA9PiB1bmtub3duO1xufVxuXG4vKiogVGhlIHdlYiB2aWV3IGRpZCBub3QgcHJvdmlkZSBhIHVzYWJsZSBjaGFubmVsLiAqL1xuZXhwb3J0IGNsYXNzIFFnaXNTZGtXZWJDaGFubmVsRXJyb3IgZXh0ZW5kcyBRZ2lzU2RrRXJyb3Ige1xuXHRwdWJsaWMgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG5cdFx0c3VwZXIobWVzc2FnZSwgXCJub193ZWJfY2hhbm5lbFwiKTtcblx0fVxufVxuXG4vKiogVGhlIHRyYW5zcG9ydCB7QGxpbmsgY3JlYXRlV2ViQ2hhbm5lbFRyYW5zcG9ydH0gcmV0dXJucy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViQ2hhbm5lbFRyYW5zcG9ydCBleHRlbmRzIFdpcmVUcmFuc3BvcnQge1xuXHQvKiogUmVzb2x2ZXMgb25jZSB0aGUgY2hhbm5lbCBvYmplY3QgYW5zd2VyZWQ7IHJlamVjdHMgd2hlbiBpdCBuZXZlciB3aWxsLiAqL1xuXHRyZWFkb25seSByZWFkeTogUHJvbWlzZTx2b2lkPjtcblx0LyoqIFN0b3AgZm9yd2FyZGluZyBtZXNzYWdlczsgc2VuZHMgYWZ0ZXIgdGhpcyB0aHJvdy4gKi9cblx0Y2xvc2UoKTogdm9pZDtcbn1cblxuZnVuY3Rpb24gc2NvcGUoKTogUXRTY29wZSB7XG5cdHJldHVybiBnbG9iYWxUaGlzIGFzIHVua25vd24gYXMgUXRTY29wZTtcbn1cblxuLyoqIFRydWUgaW5zaWRlIGEgUUdJUyB3ZWIgdmlldywgd2hlcmUgUXQgaW5qZWN0ZWQgaXRzIHRyYW5zcG9ydCBhbmQgc2NyaXB0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc2lkZVFnaXMoKTogYm9vbGVhbiB7XG5cdGNvbnN0IHBhZ2UgPSBzY29wZSgpO1xuXHRyZXR1cm4gcGFnZS5xdCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBwYWdlLlFXZWJDaGFubmVsID09PSBcImZ1bmN0aW9uXCI7XG59XG5cbi8qKlxuICogQ29ubmVjdCB0byB0aGUgY2hhbm5lbCBvYmplY3QgYG9iamVjdE5hbWVgIGFuZCByZXR1cm4gYSB0cmFuc3BvcnQgb24gaXQuXG4gKlxuICogVGhyb3dzIHtAbGluayBRZ2lzU2RrV2ViQ2hhbm5lbEVycm9yfSBzeW5jaHJvbm91c2x5IG91dHNpZGUgYSBRR0lTIHdlYiB2aWV3LFxuICogc28gYSBwYWdlIGxlYXJucyBpbiBpdHMgZmlyc3Qgc3RhdGVtZW50IHRoYXQgaXQgaGFzIG5vIGhvc3QgdG8gdGFsayB0by5cbiAqIEluc2lkZSBvbmUsIG1lc3NhZ2VzIHNlbnQgYmVmb3JlIHRoZSBjaGFubmVsIGlzIHJlYWR5IGFyZSBxdWV1ZWQgYW5kXG4gKiBkZWxpdmVyZWQgaW4gb3JkZXIgb25jZSBpdCBpczsgYHJlYWR5YCByZWplY3RzIChhbmQgcXVldWVkIHNlbmRzIGFyZVxuICogZHJvcHBlZCkgd2hlbiB0aGUgaG9zdCByZWdpc3RlcmVkIG5vIG9iamVjdCB1bmRlciB0aGF0IG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXZWJDaGFubmVsVHJhbnNwb3J0KFxuXHRvYmplY3ROYW1lID0gXCJicmlkZ2VcIixcbik6IFdlYkNoYW5uZWxUcmFuc3BvcnQge1xuXHRjb25zdCBwYWdlID0gc2NvcGUoKTtcblx0Y29uc3QgcXQgPSBwYWdlLnF0O1xuXHRjb25zdCBRV2ViQ2hhbm5lbCA9IHBhZ2UuUVdlYkNoYW5uZWw7XG5cdGlmIChxdCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBRV2ViQ2hhbm5lbCAhPT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0dGhyb3cgbmV3IFFnaXNTZGtXZWJDaGFubmVsRXJyb3IoXG5cdFx0XHRcIm5vdCBpbnNpZGUgYSBRR0lTIHdlYiB2aWV3OiB3aW5kb3cucXQgaXMgbWlzc2luZ1wiLFxuXHRcdCk7XG5cdH1cblx0Y29uc3QgbGlzdGVuZXJzID0gbmV3IFNldDwobWVzc2FnZTogdW5rbm93bikgPT4gdm9pZD4oKTtcblx0Y29uc3QgcXVldWU6IHN0cmluZ1tdID0gW107XG5cdGxldCBvYmplY3Q6IENoYW5uZWxPYmplY3QgfCBudWxsID0gbnVsbDtcblx0bGV0IGZhaWx1cmU6IFFnaXNTZGtXZWJDaGFubmVsRXJyb3IgfCBudWxsID0gbnVsbDtcblx0bGV0IGNsb3NlZCA9IGZhbHNlO1xuXHRjb25zdCBmb3J3YXJkID0gKHRleHQ6IHN0cmluZyk6IHZvaWQgPT4ge1xuXHRcdGlmIChjbG9zZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0bGV0IHBhcnNlZDogdW5rbm93bjtcblx0XHR0cnkge1xuXHRcdFx0cGFyc2VkID0gSlNPTi5wYXJzZSh0ZXh0KTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Zm9yIChjb25zdCBsaXN0ZW5lciBvZiBbLi4ubGlzdGVuZXJzXSkge1xuXHRcdFx0bGlzdGVuZXIocGFyc2VkKTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IHJlYWR5ID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdG5ldyBRV2ViQ2hhbm5lbChxdC53ZWJDaGFubmVsVHJhbnNwb3J0LCAoY2hhbm5lbCkgPT4ge1xuXHRcdFx0Y29uc3QgZm91bmQgPSBjaGFubmVsLm9iamVjdHNbb2JqZWN0TmFtZV07XG5cdFx0XHRpZiAoZm91bmQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRmYWlsdXJlID0gbmV3IFFnaXNTZGtXZWJDaGFubmVsRXJyb3IoXG5cdFx0XHRcdFx0YHRoZSBob3N0IHJlZ2lzdGVyZWQgbm8gJHtKU09OLnN0cmluZ2lmeShvYmplY3ROYW1lKX0gY2hhbm5lbCBvYmplY3RgLFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRxdWV1ZS5sZW5ndGggPSAwO1xuXHRcdFx0XHRyZWplY3QoZmFpbHVyZSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmIChjbG9zZWQpIHtcblx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRvYmplY3QgPSBmb3VuZDtcblx0XHRcdGZvdW5kLm1lc3NhZ2UuY29ubmVjdChmb3J3YXJkKTtcblx0XHRcdGZvciAoY29uc3QgdGV4dCBvZiBxdWV1ZS5zcGxpY2UoMCkpIHtcblx0XHRcdFx0Zm91bmQucmVjZWl2ZSh0ZXh0KTtcblx0XHRcdH1cblx0XHRcdHJlc29sdmUoKTtcblx0XHR9KTtcblx0fSk7XG5cdHJldHVybiB7XG5cdFx0cmVhZHksXG5cdFx0c2VuZChtZXNzYWdlOiB1bmtub3duKTogdm9pZCB7XG5cdFx0XHRpZiAoY2xvc2VkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBRZ2lzU2RrV2ViQ2hhbm5lbEVycm9yKFwidGhlIHdlYiBjaGFubmVsIHRyYW5zcG9ydCBpcyBjbG9zZWRcIik7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZmFpbHVyZSAhPT0gbnVsbCkge1xuXHRcdFx0XHR0aHJvdyBmYWlsdXJlO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgdGV4dCA9IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpO1xuXHRcdFx0aWYgKG9iamVjdCA9PT0gbnVsbCkge1xuXHRcdFx0XHRxdWV1ZS5wdXNoKHRleHQpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRvYmplY3QucmVjZWl2ZSh0ZXh0KTtcblx0XHR9LFxuXHRcdHN1YnNjcmliZShsaXN0ZW5lcjogKG1lc3NhZ2U6IHVua25vd24pID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcblx0XHRcdGxpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuXHRcdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdFx0bGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0Y2xvc2UoKTogdm9pZCB7XG5cdFx0XHRpZiAoY2xvc2VkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNsb3NlZCA9IHRydWU7XG5cdFx0XHRxdWV1ZS5sZW5ndGggPSAwO1xuXHRcdFx0bGlzdGVuZXJzLmNsZWFyKCk7XG5cdFx0XHRvYmplY3Q/Lm1lc3NhZ2UuZGlzY29ubmVjdChmb3J3YXJkKTtcblx0XHR9LFxuXHR9O1xufVxuIiwKICAgICIvKipcbiAqIGBRZ2lzU2RrYDogdGhlIHBhZ2Utc2lkZSBvYmplY3QgYSBwbHVnaW4ncyB3ZWIgdmlldyB0YWxrcyB0byBRR0lTIHRocm91Z2guXG4gKlxuICogVGhyZWUgc3RhdGVtZW50cyBjb25uZWN0IGEgcGFnZSAoZGVjaXNpb24tNDQpOlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgc2NoZW1hIGZyb20gXCIuL2JyaWRnZS5zY2hlbWFcIjtcbiAqIGNvbnN0IHFnaXMgPSBRZ2lzU2RrLmZyb21CcmlkZ2VTY2hlbWEoc2NoZW1hKTtcbiAqIGF3YWl0IHFnaXMuc2l0ZXMuc3VtbWFyeSh7IGxheWVyX2lkIH0pO1xuICogYGBgXG4gKlxuICogVGhlIHNjaGVtYSBpcyB0aGUgZ2VuZXJhdGVkIGBicmlkZ2Uuc2NoZW1hLnRzYDogdGhlIHBsdWdpbiBkZXNjcmlwdGlvbiBwbHVzXG4gKiBpdHMgYE9wZXJhdGlvbnNgIGFuZCBgU3RyZWFtc2AgdHlwZXMuIEZyb20gdGhlIGRlc2NyaXB0aW9uIHRoZSBTREsgYnVpbGRzXG4gKiBvbmUgbWV0aG9kIHBlciBkZWNsYXJlZCBhY3Rpb24gYW5kIHN0cmVhbSwgbmVzdGVkIHVuZGVyIHRoZSBzZWdtZW50cyBvZiBpdHNcbiAqIGlkIChgc2l0ZXMuc3VtbWFyeWAgaXMgYHFnaXMuc2l0ZXMuc3VtbWFyeWAsIGBidWZmZXJgIGlzIGBxZ2lzLmJ1ZmZlcmApLFxuICogYW5kIGNoZWNrcyBldmVyeSBhcmd1bWVudCwgcmVwbHkgYW5kIGV2ZW50IGFnYWluc3QgdGhlIGRlY2xhcmVkIHNjaGVtYXNcbiAqIHdpdGggdGhlIHNhbWUgcnVsZXMgdGhlIGhvc3QgYXBwbGllcyAoYHZhbGlkYXRlLnRzYCkuIEZyb20gdGhlIHR5cGVzIGl0IGdpdmVzIHRob3NlXG4gKiBtZXRob2RzIHRoZWlyIHNpZ25hdHVyZXMsIHNvIGEgd3JvbmcgYXJndW1lbnQgc2hhcGUgb3IgYW4gdW5rbm93biBvcGVyYXRpb25cbiAqIGlzIGEgY29tcGlsZSBlcnJvciBhbmQgYSB2YWx1ZSBvdXRzaWRlIHRoZSBzY2hlbWEgYXQgcnVuIHRpbWUgaXMgYVxuICoge0BsaW5rIFFnaXNTZGtDb250cmFjdEVycm9yfS5cbiAqXG4gKiBgaG9zdGAgaXMgdGhlIGN1cmF0ZWQgaG9zdCBzdXJmYWNlIG9mIGRlY2lzaW9uLTI3LCBidWlsdCBvbiB0aGUgc2FtZSBjbGllbnQsXG4gKiBwbHVzIGBncmFudGVkYDogdGhlIGhvc3Qgb3BlcmF0aW9uIGlkcyB0aGUgaGFuZHNoYWtlIGFkdmVydGlzZWQgZm9yIHRoaXNcbiAqIHZpZXcuIEEgY2FsbCBvdXRzaWRlIHRoZSBncmFudHMgaXMgbm90IHJlZnVzZWQgaGVyZSAtIHRoZSBob3N0IHJlZnVzZXMgaXQsXG4gKiBhbmQgdGhlIHBhZ2Ugc2VlcyB0aGUgaG9zdCdzIGBub3RfYXV0aG9yaXplZGAgLSBidXQgYSBwYWdlIGNhbiByZWFkIGBncmFudGVkYFxuICogYWZ0ZXIgYHJlYWR5YCB0byBoaWRlIHdoYXQgaXQgbWF5IG5vdCB1c2UuXG4gKi9cblxuaW1wb3J0IHtcblx0QnJpZGdlQ2xpZW50LFxuXHR0eXBlIEJyaWRnZVN0cmVhbVRlcm1pbmFsLFxuXHR0eXBlIEJyaWRnZVN1YnNjcmlwdGlvbixcblx0dHlwZSBJbnZva2VPcHRpb25zLFxuXHRRZ2lzU2RrQnJpZGdlUHJvdG9jb2xFcnJvcixcblx0dHlwZSBXaXJlVHJhbnNwb3J0LFxufSBmcm9tIFwiLi9icmlkZ2VcIjtcbmltcG9ydCB7XG5cdHR5cGUgQWN0aW9uRGVzY3JpcHRpb24sXG5cdFFnaXNTZGtEZWNsYXJhdGlvbkVycm9yLFxuXHR0eXBlIFN0cmVhbURlc2NyaXB0aW9uLFxufSBmcm9tIFwiLi9kZWNsYXJhdGlvbnNcIjtcbmltcG9ydCB7XG5cdGNyZWF0ZUhvc3QsXG5cdEhPU1RfT1BFUkFUSU9OUyxcblx0dHlwZSBIb3N0T3BlcmF0aW9uSWQsXG5cdHR5cGUgSG9zdE9wZXJhdGlvbnMsXG59IGZyb20gXCIuL2dlbmVyYXRlZC9ob3N0XCI7XG5pbXBvcnQgeyBpc1BsYWluUmVjb3JkIH0gZnJvbSBcIi4vaW50ZXJuYWxcIjtcbmltcG9ydCB0eXBlIHtcblx0QnJpZGdlU2NoZW1hLFxuXHRPcGVyYXRpb25NYXAsXG5cdE9wZXJhdGlvblNoYXBlLFxuXHRTdHJlYW1NYXAsXG5cdFN0cmVhbVNoYXBlLFxufSBmcm9tIFwiLi9zY2hlbWFcIjtcbmltcG9ydCB7IFFnaXNTZGtDb250cmFjdEVycm9yLCB2YWxpZGF0ZUFnYWluc3RTY2hlbWEgfSBmcm9tIFwiLi92YWxpZGF0ZVwiO1xuaW1wb3J0IHsgY3JlYXRlV2ViQ2hhbm5lbFRyYW5zcG9ydCB9IGZyb20gXCIuL3dlYmNoYW5uZWxcIjtcblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBRZ2lzU2RrLmZyb21CcmlkZ2VTY2hlbWF9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBRZ2lzU2RrT3B0aW9ucyB7XG5cdC8qKiBBIHRyYW5zcG9ydCB0byBzcGVhayB0aHJvdWdoOyBkZWZhdWx0cyB0byB0aGUgcGFnZSdzIFFXZWJDaGFubmVsLiAqL1xuXHRyZWFkb25seSB0cmFuc3BvcnQ/OiBXaXJlVHJhbnNwb3J0O1xuXHQvKiogQSBjbGllbnQgdGhlIGNhbGxlciBvd25zOyBgY2xvc2UoKWAgbGVhdmVzIGl0IG9wZW4uIEV4Y2x1ZGVzIGB0cmFuc3BvcnRgLiAqL1xuXHRyZWFkb25seSBjbGllbnQ/OiBCcmlkZ2VDbGllbnQ7XG5cdC8qKiBQZXItY2FsbCB0aW1lb3V0IGZvciBhbiBvd25lZCBjbGllbnQuICovXG5cdHJlYWRvbmx5IHRpbWVvdXRNcz86IG51bWJlcjtcblx0LyoqIFRoZSBjaGFubmVsIG9iamVjdCdzIG5hbWUgd2hlbiB0aGUgZGVmYXVsdCB0cmFuc3BvcnQgaXMgdXNlZC4gKi9cblx0cmVhZG9ubHkgY2hhbm5lbE9iamVjdD86IHN0cmluZztcbn1cblxuLyoqIEhhbmRsZXJzIGZvciBhIHR5cGVkIHN0cmVhbTogZXZlbnRzIGFzIGRlY2xhcmVkLCB0aGVuIGV4YWN0bHkgb25lIGVuZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RyZWFtSGFuZGxlcnM8RT4ge1xuXHRyZWFkb25seSBvbkV2ZW50PzogKGV2ZW50OiBFKSA9PiB2b2lkO1xuXHRyZWFkb25seSBvblRlcm1pbmFsPzogKHRlcm1pbmFsOiBCcmlkZ2VTdHJlYW1UZXJtaW5hbCkgPT4gdm9pZDtcbn1cblxuLyoqIEEgbGl2ZSBzdHJlYW0sIGFzIHRoZSBjYWxsZXIgaG9sZHMgaXQuICovXG5leHBvcnQgdHlwZSBTdHJlYW1IYW5kbGUgPSBCcmlkZ2VTdWJzY3JpcHRpb247XG5cbi8qKiBUaGUgbWV0aG9kIG9uZSBkZWNsYXJlZCBhY3Rpb24gYmVjb21lczsgYW4gZW1wdHkgcmVxdWVzdCBtYXkgYmUgb21pdHRlZC4gKi9cbmV4cG9ydCB0eXBlIE9wZXJhdGlvbk1ldGhvZDxPcCBleHRlbmRzIE9wZXJhdGlvblNoYXBlPiA9XG5cdC8vIGJpb21lLWlnbm9yZSBsaW50L2NvbXBsZXhpdHkvbm9CYW5uZWRUeXBlczogYHt9YCBpcyB0aGUgdGVzdCBmb3IgXCJub3RoaW5nIHJlcXVpcmVkXCJcblx0e30gZXh0ZW5kcyBPcFtcInJlcXVlc3RcIl1cblx0XHQ/IChcblx0XHRcdFx0cmVxdWVzdD86IE9wW1wicmVxdWVzdFwiXSxcblx0XHRcdFx0b3B0aW9ucz86IEludm9rZU9wdGlvbnMsXG5cdFx0XHQpID0+IFByb21pc2U8T3BbXCJyZXN1bHRcIl0+XG5cdFx0OiAoXG5cdFx0XHRcdHJlcXVlc3Q6IE9wW1wicmVxdWVzdFwiXSxcblx0XHRcdFx0b3B0aW9ucz86IEludm9rZU9wdGlvbnMsXG5cdFx0XHQpID0+IFByb21pc2U8T3BbXCJyZXN1bHRcIl0+O1xuXG4vKiogVGhlIG1ldGhvZCBvbmUgZGVjbGFyZWQgc3RyZWFtIGJlY29tZXMuICovXG5leHBvcnQgdHlwZSBTdHJlYW1NZXRob2Q8U3QgZXh0ZW5kcyBTdHJlYW1TaGFwZT4gPSAoXG5cdHJlcXVlc3Q6IFN0W1wicmVxdWVzdFwiXSxcblx0aGFuZGxlcnM6IFN0cmVhbUhhbmRsZXJzPFN0W1wiZXZlbnRcIl0+LFxuXHRvcHRpb25zPzogSW52b2tlT3B0aW9ucyxcbikgPT4gUHJvbWlzZTxTdHJlYW1IYW5kbGU+O1xuXG4vKipcbiAqIFRoZSBydW5uaW5nIHBhbGV0dGUsIHdoZW4gdGhlIGhhbmRzaGFrZSBjYXJyaWVkIG9uZSAoZGVjaXNpb24tMTYpOiB0aGVcbiAqIGBRUGFsZXR0ZWAgY29sb3VyIHJvbGVzIHRoZSBob3N0IHJlYWQsIGFzIENTUyBoZXggKGAjcnJnZ2JiYCBvclxuICogYCNycmdnYmJhYWApIGJ5IHRoZWlyIGNhbWVsLWNhc2VkIHJvbGUgbmFtZSwgYW5kIHdoZXRoZXIgdGhlIHdpbmRvdyBjb2xvdXJcbiAqIGlzIGRhcmsuIGBxZ2lzLXNkay11aWAgdHVybnMgaXQgaW50byB0aGUgYC0tcWdpcy1zZGstKmAgY3VzdG9tIHByb3BlcnRpZXM7XG4gKiBhIHBhZ2Ugb3V0c2lkZSBRR0lTIHNlZXMgYG51bGxgIGFuZCBrZWVwcyB0aGUgZG9jdW1lbnRlZCBkZWZhdWx0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRZ2lzU2RrSG9zdFRoZW1lIHtcblx0cmVhZG9ubHkgcGFsZXR0ZTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG5cdHJlYWRvbmx5IGRhcms6IGJvb2xlYW47XG59XG5cbi8qKiBXaGF0IHRoZSBoYW5kc2hha2UgdG9sZCB0aGlzIHBhZ2UgYWJvdXQgdGhlIGhvc3QgKGRlY2lzaW9uLTI3KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUWdpc1Nka0hvc3QgZXh0ZW5kcyBIb3N0T3BlcmF0aW9ucyB7XG5cdC8qKlxuXHQgKiBUaGUgaG9zdCBvcGVyYXRpb24gaWRzIHRoZSBoYW5kc2hha2UgYWR2ZXJ0aXNlZCBmb3IgdGhpcyB2aWV3OyBlbXB0eVxuXHQgKiB1bnRpbCB7QGxpbmsgUWdpc1Nka0NvcmUucmVhZHl9IGhhcyByZXNvbHZlZC5cblx0ICovXG5cdHJlYWRvbmx5IGdyYW50ZWQ6IHJlYWRvbmx5IEhvc3RPcGVyYXRpb25JZFtdO1xuXHQvKipcblx0ICogVGhlIGhvc3QncyBwYWxldHRlLCBgbnVsbGAgdW50aWwge0BsaW5rIFFnaXNTZGtDb3JlLnJlYWR5fSBoYXMgcmVzb2x2ZWRcblx0ICogYW5kIHdoZW4gdGhlIGhvc3Qgc2VudCBub25lLlxuXHQgKi9cblx0cmVhZG9ubHkgdGhlbWU6IFFnaXNTZGtIb3N0VGhlbWUgfCBudWxsO1xufVxuXG4vKiogVGhlIG1lbWJlcnMgZXZlcnkgYFFnaXNTZGtgIGhhcywgd2hhdGV2ZXIgaXRzIHNjaGVtYSBkZWNsYXJlcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUWdpc1Nka0NvcmU8TyA9IE9wZXJhdGlvbk1hcCwgUyA9IFN0cmVhbU1hcD4ge1xuXHQvKiogVGhlIHNjaGVtYSB0aGlzIGluc3RhbmNlIHdhcyBidWlsdCBmcm9tLiAqL1xuXHRyZWFkb25seSBzY2hlbWE6IEJyaWRnZVNjaGVtYTxPLCBTPjtcblx0LyoqIFRoZSBjbGllbnQgdW5kZXIgdGhlIG1ldGhvZHMsIGZvciB3aGF0IGEgbWV0aG9kIGRvZXMgbm90IGNvdmVyLiAqL1xuXHRyZWFkb25seSBjbGllbnQ6IEJyaWRnZUNsaWVudDtcblx0LyoqIFRoZSBjdXJhdGVkIGhvc3Qgc3VyZmFjZSwgYW5kIHdoYXQgdGhpcyB2aWV3IHdhcyBncmFudGVkIG9mIGl0LiAqL1xuXHRyZWFkb25seSBob3N0OiBRZ2lzU2RrSG9zdDtcblx0LyoqIFJlc29sdmVzIG9uY2UgdGhlIGhhbmRzaGFrZSBhbnN3ZXJlZDsgcmVqZWN0cyB3aGVuIHRoZSBob3N0IHJlZnVzZWQgaXQuICovXG5cdHJlYWRvbmx5IHJlYWR5OiBQcm9taXNlPHZvaWQ+O1xuXHQvKiogQ2xvc2UgYW4gb3duZWQgY2xpZW50OyBhIGNsaWVudCB0aGUgY2FsbGVyIHBhc3NlZCBpbiBpcyBsZWZ0IGFsb25lLiAqL1xuXHRjbG9zZSgpOiB2b2lkO1xufVxuXG4vKiogVGhlIGZpcnN0IHNlZ21lbnQgb2YgYSBkb3R0ZWQgaWQsIG9yIHRoZSB3aG9sZSBpZCB3aGVuIGl0IGhhcyBub25lLiAqL1xudHlwZSBIZWFkPEsgZXh0ZW5kcyBzdHJpbmc+ID0gSyBleHRlbmRzIGAke2luZmVyIEh9LiR7c3RyaW5nfWAgPyBIIDogSztcblxuLyoqIFRoZSBtZW1iZXJzIG9mIGBNYCB1bmRlciBvbmUgaGVhZCwga2V5ZWQgYnkgdGhlIHJlc3Qgb2YgdGhlaXIgaWRzLiAqL1xudHlwZSBVbmRlcjxNLCBIIGV4dGVuZHMgc3RyaW5nPiA9IHtcblx0W0sgaW4ga2V5b2YgTSAmIHN0cmluZyBhcyBLIGV4dGVuZHMgYCR7SH0uJHtpbmZlciBSZXN0fWBcblx0XHQ/IFJlc3Rcblx0XHQ6IG5ldmVyXTogTVtLXTtcbn07XG5cbi8qKlxuICogVGhlIGRlY2xhcmVkIGFjdGlvbnMgYXMgYSB0cmVlOiBhIHBsYWluIGlkIGlzIGEgbWV0aG9kLCBhIGRvdHRlZCBpZCBuZXN0c1xuICogb25lIG9iamVjdCBwZXIgc2VnbWVudC4gQW4gaWQgdGhhdCBpcyBib3RoIGEgbGVhZiBhbmQgYSBwcmVmaXggb2YgYW5vdGhlclxuICogaXMgcmVmdXNlZCBhdCBydW4gdGltZSwgc28gdGhlIHR5cGUgbmVlZCBub3Qgc2F5IHdoYXQgaXQgd291bGQgbWVhbi5cbiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0aW9uVHJlZTxPPiA9IHtcblx0cmVhZG9ubHkgW0ggaW4gSGVhZDxrZXlvZiBPICYgc3RyaW5nPl06IEggZXh0ZW5kcyBrZXlvZiBPXG5cdFx0PyBPW0hdIGV4dGVuZHMgT3BlcmF0aW9uU2hhcGVcblx0XHRcdD8gT3BlcmF0aW9uTWV0aG9kPE9bSF0+XG5cdFx0XHQ6IG5ldmVyXG5cdFx0OiBPcGVyYXRpb25UcmVlPFVuZGVyPE8sIEg+Pjtcbn07XG5cbi8qKiBUaGUgZGVjbGFyZWQgc3RyZWFtcyBhcyB0aGUgc2FtZSB0cmVlLCB3aXRoIGEgc3RyZWFtIG1ldGhvZCBhdCBlYWNoIGxlYWYuICovXG5leHBvcnQgdHlwZSBTdHJlYW1UcmVlPFM+ID0ge1xuXHRyZWFkb25seSBbSCBpbiBIZWFkPGtleW9mIFMgJiBzdHJpbmc+XTogSCBleHRlbmRzIGtleW9mIFNcblx0XHQ/IFNbSF0gZXh0ZW5kcyBTdHJlYW1TaGFwZVxuXHRcdFx0PyBTdHJlYW1NZXRob2Q8U1tIXT5cblx0XHRcdDogbmV2ZXJcblx0XHQ6IFN0cmVhbVRyZWU8VW5kZXI8UywgSD4+O1xufTtcblxuLyoqXG4gKiBBIHBhZ2UncyBoYW5kbGUgb24gUUdJUzogdGhlIGNvcmUsIHBsdXMgb25lIG1ldGhvZCBwZXIgZGVjbGFyZWQgb3BlcmF0aW9uXG4gKiBuZXN0ZWQgdW5kZXIgdGhlIHNlZ21lbnRzIG9mIGl0cyBpZC5cbiAqL1xuZXhwb3J0IHR5cGUgUWdpc1NkazxPID0gT3BlcmF0aW9uTWFwLCBTID0gU3RyZWFtTWFwPiA9IFFnaXNTZGtDb3JlPE8sIFM+ICZcblx0T3BlcmF0aW9uVHJlZTxPPiAmXG5cdFN0cmVhbVRyZWU8Uz47XG5cbi8qKiBOYW1lcyB7QGxpbmsgUWdpc1Nka0NvcmV9IGtlZXBzOyBhIGRlY2xhcmVkIGlkIG1heSBub3Qgc3RhcnQgd2l0aCBvbmUuICovXG5leHBvcnQgY29uc3QgUUdJU19TREtfTUVNQkVSUzogcmVhZG9ubHkgc3RyaW5nW10gPSBPYmplY3QuZnJlZXplKFtcblx0XCJjbGllbnRcIixcblx0XCJob3N0XCIsXG5cdFwic2NoZW1hXCIsXG5cdFwicmVhZHlcIixcblx0XCJjbG9zZVwiLFxuXSk7XG5cbmNvbnN0IEhPU1RfSURTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldDxzdHJpbmc+KEhPU1RfT1BFUkFUSU9OUyk7XG5cbi8qKiBUaGUgaGFuZHNoYWtlLCBhcyBmYXIgYXMgdGhpcyBtb2R1bGUgcmVhZHMgaXQuICovXG5pbnRlcmZhY2UgSGFuZHNoYWtlIHtcblx0cmVhZG9ubHkgb3BlcmF0aW9uczogcmVhZG9ubHkgc3RyaW5nW107XG5cdHJlYWRvbmx5IGdyYW50ZWQ6IHJlYWRvbmx5IEhvc3RPcGVyYXRpb25JZFtdO1xuXHRyZWFkb25seSB0aGVtZTogUWdpc1Nka0hvc3RUaGVtZSB8IG51bGw7XG59XG5cbmZ1bmN0aW9uIHBhcnNlSGFuZHNoYWtlKHZhbHVlOiB1bmtub3duKTogSGFuZHNoYWtlIHtcblx0aWYgKCFpc1BsYWluUmVjb3JkKHZhbHVlKSB8fCAhQXJyYXkuaXNBcnJheSh2YWx1ZS5vcGVyYXRpb25zKSkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlUHJvdG9jb2xFcnJvcihcblx0XHRcdFwiVGhlIGhhbmRzaGFrZSByZXBseSBjYXJyaWVzIG5vIG9wZXJhdGlvbnMgbGlzdFwiLFxuXHRcdCk7XG5cdH1cblx0Y29uc3Qgb3BlcmF0aW9uczogc3RyaW5nW10gPSBbXTtcblx0Zm9yIChjb25zdCBvcGVyYXRpb24gb2YgdmFsdWUub3BlcmF0aW9ucykge1xuXHRcdGlmIChpc1BsYWluUmVjb3JkKG9wZXJhdGlvbikgJiYgdHlwZW9mIG9wZXJhdGlvbi5pZCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0b3BlcmF0aW9ucy5wdXNoKG9wZXJhdGlvbi5pZCk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB7XG5cdFx0b3BlcmF0aW9ucyxcblx0XHRncmFudGVkOiBPYmplY3QuZnJlZXplKFxuXHRcdFx0b3BlcmF0aW9ucy5maWx0ZXIoKGlkKTogaWQgaXMgSG9zdE9wZXJhdGlvbklkID0+IEhPU1RfSURTLmhhcyhpZCkpLFxuXHRcdCksXG5cdFx0dGhlbWU6IHBhcnNlVGhlbWUodmFsdWUudGhlbWUpLFxuXHR9O1xufVxuXG4vKipcbiAqIFRoZSBgdGhlbWVgIG9mIGEgaGFuZHNoYWtlLCBvciBgbnVsbGAgd2hlbiBhYnNlbnQgb3IgbWFsZm9ybWVkOiBhIHBhbGV0dGVcbiAqIHRoYXQgY2Fubm90IGJlIHJlYWQgaXMgbm8gcmVhc29uIHRvIHJlZnVzZSB0aGUgaG9zdCwgdGhlIHBhZ2UganVzdCBrZWVwc1xuICogaXRzIGRlZmF1bHRzLiBPbmx5IHN0cmluZyBjb2xvdXJzIGFyZSBrZXB0LlxuICovXG5mdW5jdGlvbiBwYXJzZVRoZW1lKHZhbHVlOiB1bmtub3duKTogUWdpc1Nka0hvc3RUaGVtZSB8IG51bGwge1xuXHRpZiAoIWlzUGxhaW5SZWNvcmQodmFsdWUpIHx8ICFpc1BsYWluUmVjb3JkKHZhbHVlLnBhbGV0dGUpKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblx0Y29uc3QgcGFsZXR0ZTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXHRmb3IgKGNvbnN0IFtyb2xlLCBjb2xvdXJdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlLnBhbGV0dGUpKSB7XG5cdFx0aWYgKHR5cGVvZiBjb2xvdXIgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdHBhbGV0dGVbcm9sZV0gPSBjb2xvdXI7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBPYmplY3QuZnJlZXplKHtcblx0XHRwYWxldHRlOiBPYmplY3QuZnJlZXplKHBhbGV0dGUpLFxuXHRcdGRhcms6IHZhbHVlLmRhcmsgPT09IHRydWUsXG5cdH0pO1xufVxuXG5mdW5jdGlvbiB1bndyYXBSZXF1ZXN0KFxuXHRvcGVyYXRpb246IHN0cmluZyxcblx0cmVxdWVzdDogdW5rbm93bixcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcblx0aWYgKHJlcXVlc3QgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiB7fTtcblx0fVxuXHRpZiAoIWlzUGxhaW5SZWNvcmQocmVxdWVzdCkpIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0NvbnRyYWN0RXJyb3Iob3BlcmF0aW9uLCBcInJlcXVlc3RcIiwgW1xuXHRcdFx0Li4udmFsaWRhdGVBZ2FpbnN0U2NoZW1hKHJlcXVlc3QsIHsgdHlwZTogXCJvYmplY3RcIiB9KSxcblx0XHRdKTtcblx0fVxuXHRyZXR1cm4gcmVxdWVzdDtcbn1cblxuZnVuY3Rpb24gY2hlY2tlZFJlcXVlc3QoXG5cdGRlc2NyaXB0aW9uOiBBY3Rpb25EZXNjcmlwdGlvbiB8IFN0cmVhbURlc2NyaXB0aW9uLFxuXHRyZXF1ZXN0OiB1bmtub3duLFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuXHRjb25zdCBwYXlsb2FkID0gdW53cmFwUmVxdWVzdChkZXNjcmlwdGlvbi5pZCwgcmVxdWVzdCk7XG5cdGNvbnN0IGlzc3VlcyA9IHZhbGlkYXRlQWdhaW5zdFNjaGVtYShwYXlsb2FkLCBkZXNjcmlwdGlvbi5yZXF1ZXN0KTtcblx0aWYgKGlzc3Vlcy5sZW5ndGggPiAwKSB7XG5cdFx0dGhyb3cgbmV3IFFnaXNTZGtDb250cmFjdEVycm9yKGRlc2NyaXB0aW9uLmlkLCBcInJlcXVlc3RcIiwgaXNzdWVzKTtcblx0fVxuXHRyZXR1cm4gcGF5bG9hZDtcbn1cblxuZnVuY3Rpb24gb3BlcmF0aW9uTWV0aG9kKFxuXHRjbGllbnQ6IEJyaWRnZUNsaWVudCxcblx0YWN0aW9uOiBBY3Rpb25EZXNjcmlwdGlvbixcbik6IChyZXF1ZXN0PzogdW5rbm93biwgb3B0aW9ucz86IEludm9rZU9wdGlvbnMpID0+IFByb21pc2U8dW5rbm93bj4ge1xuXHRyZXR1cm4gYXN5bmMgKHJlcXVlc3QsIG9wdGlvbnMpID0+IHtcblx0XHRjb25zdCBwYXlsb2FkID0gY2hlY2tlZFJlcXVlc3QoYWN0aW9uLCByZXF1ZXN0KTtcblx0XHRjb25zdCB2YWx1ZSA9IGF3YWl0IGNsaWVudC5pbnZva2UoYWN0aW9uLmlkLCBwYXlsb2FkLCBvcHRpb25zKTtcblx0XHRjb25zdCBpc3N1ZXMgPSB2YWxpZGF0ZUFnYWluc3RTY2hlbWEodmFsdWUsIGFjdGlvbi5yZXN1bHQsIHtcblx0XHRcdGFsbG93VW5rbm93bjogdHJ1ZSxcblx0XHR9KTtcblx0XHRpZiAoaXNzdWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdHRocm93IG5ldyBRZ2lzU2RrQ29udHJhY3RFcnJvcihhY3Rpb24uaWQsIFwicmVzdWx0XCIsIGlzc3Vlcyk7XG5cdFx0fVxuXHRcdHJldHVybiB2YWx1ZTtcblx0fTtcbn1cblxuZnVuY3Rpb24gc3RyZWFtTWV0aG9kKFxuXHRjbGllbnQ6IEJyaWRnZUNsaWVudCxcblx0c3RyZWFtOiBTdHJlYW1EZXNjcmlwdGlvbixcbik6IChcblx0cmVxdWVzdDogdW5rbm93bixcblx0aGFuZGxlcnM6IFN0cmVhbUhhbmRsZXJzPHVua25vd24+LFxuXHRvcHRpb25zPzogSW52b2tlT3B0aW9ucyxcbikgPT4gUHJvbWlzZTxTdHJlYW1IYW5kbGU+IHtcblx0cmV0dXJuIGFzeW5jIChyZXF1ZXN0LCBoYW5kbGVycywgb3B0aW9ucykgPT4ge1xuXHRcdGNvbnN0IHBheWxvYWQgPSBjaGVja2VkUmVxdWVzdChzdHJlYW0sIHJlcXVlc3QpO1xuXHRcdC8vIFRoZSB0eXBlZCBzdHJlYW0gZW5kcyBleGFjdGx5IG9uY2UsIGxpa2UgdGhlIHN1YnNjcmlwdGlvbiB1bmRlciBpdDogYVxuXHRcdC8vIGNvbnRyYWN0IHZpb2xhdGlvbiBlbmRzIGl0IGhlcmUsIGNsb3NlcyB0aGUgc3Vic2NyaXB0aW9uLCBhbmQgdGhlXG5cdFx0Ly8gYGRpc3Bvc2VkYCB0aGUgY2xpZW50IHRoZW4gcmVwb3J0cyBpcyBub3QgZGVsaXZlcmVkIGEgc2Vjb25kIHRpbWUuXG5cdFx0bGV0IGVuZGVkID0gZmFsc2U7XG5cdFx0bGV0IHZpb2xhdGVkID0gZmFsc2U7XG5cdFx0bGV0IGhhbmRsZTogU3RyZWFtSGFuZGxlIHwgbnVsbCA9IG51bGw7XG5cdFx0Y29uc3QgZW5kID0gKHRlcm1pbmFsOiBCcmlkZ2VTdHJlYW1UZXJtaW5hbCk6IHZvaWQgPT4ge1xuXHRcdFx0aWYgKGVuZGVkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGVuZGVkID0gdHJ1ZTtcblx0XHRcdGhhbmRsZXJzLm9uVGVybWluYWw/Lih0ZXJtaW5hbCk7XG5cdFx0fTtcblx0XHRoYW5kbGUgPSBhd2FpdCBjbGllbnQuc3Vic2NyaWJlKFxuXHRcdFx0c3RyZWFtLmlkLFxuXHRcdFx0cGF5bG9hZCxcblx0XHRcdHtcblx0XHRcdFx0b25FdmVudDogKGV2ZW50KSA9PiB7XG5cdFx0XHRcdFx0aWYgKGVuZGVkKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IGRlY2xhcmVkID0gc3RyZWFtLmV2ZW50c1tldmVudC5raW5kXTtcblx0XHRcdFx0XHRjb25zdCBpc3N1ZXMgPVxuXHRcdFx0XHRcdFx0ZGVjbGFyZWQgPT09IHVuZGVmaW5lZFxuXHRcdFx0XHRcdFx0XHQ/IHVuZGVmaW5lZFxuXHRcdFx0XHRcdFx0XHQ6IHZhbGlkYXRlQWdhaW5zdFNjaGVtYShldmVudC5wYXlsb2FkLCBkZWNsYXJlZCwge1xuXHRcdFx0XHRcdFx0XHRcdFx0YWxsb3dVbmtub3duOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0cGF0aDogW1wicGF5bG9hZFwiXSxcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRpZiAoaXNzdWVzICE9PSB1bmRlZmluZWQgJiYgaXNzdWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0aGFuZGxlcnMub25FdmVudD8uKGV2ZW50KTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgZXJyb3IgPSBuZXcgUWdpc1Nka0NvbnRyYWN0RXJyb3IoXG5cdFx0XHRcdFx0XHRzdHJlYW0uaWQsXG5cdFx0XHRcdFx0XHRcImV2ZW50XCIsXG5cdFx0XHRcdFx0XHRpc3N1ZXMgPz8gW10sXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRlbmQoeyBraW5kOiBcImVycm9yXCIsIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfSk7XG5cdFx0XHRcdFx0aWYgKGhhbmRsZSA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0dmlvbGF0ZWQgPSB0cnVlO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRoYW5kbGUuY2xvc2UoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdG9uVGVybWluYWw6IGVuZCxcblx0XHRcdH0sXG5cdFx0XHRvcHRpb25zLFxuXHRcdCk7XG5cdFx0aWYgKHZpb2xhdGVkKSB7XG5cdFx0XHRoYW5kbGUuY2xvc2UoKTtcblx0XHR9XG5cdFx0cmV0dXJuIGhhbmRsZTtcblx0fTtcbn1cblxuZnVuY3Rpb24gYnVpbGRIb3N0KFxuXHRjbGllbnQ6IEJyaWRnZUNsaWVudCxcblx0aGFuZHNoYWtlOiAoKSA9PiBIYW5kc2hha2UgfCBudWxsLFxuKTogUWdpc1Nka0hvc3Qge1xuXHRjb25zdCBob3N0ID0gY3JlYXRlSG9zdChjbGllbnQpO1xuXHRyZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG5cdFx0Li4uaG9zdCxcblx0XHRnZXQgZ3JhbnRlZCgpOiByZWFkb25seSBIb3N0T3BlcmF0aW9uSWRbXSB7XG5cdFx0XHRyZXR1cm4gZ3JhbnRlZChoYW5kc2hha2UoKSk7XG5cdFx0fSxcblx0XHRnZXQgdGhlbWUoKTogUWdpc1Nka0hvc3RUaGVtZSB8IG51bGwge1xuXHRcdFx0cmV0dXJuIGhhbmRzaGFrZSgpPy50aGVtZSA/PyBudWxsO1xuXHRcdH0sXG5cdH0pO1xufVxuXG5jb25zdCBOT19HUkFOVFM6IHJlYWRvbmx5IEhvc3RPcGVyYXRpb25JZFtdID0gT2JqZWN0LmZyZWV6ZShbXSk7XG5cbmZ1bmN0aW9uIGdyYW50ZWQoaGFuZHNoYWtlOiBIYW5kc2hha2UgfCBudWxsKTogcmVhZG9ubHkgSG9zdE9wZXJhdGlvbklkW10ge1xuXHRyZXR1cm4gaGFuZHNoYWtlID09PSBudWxsID8gTk9fR1JBTlRTIDogaGFuZHNoYWtlLmdyYW50ZWQ7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkPE8sIFM+KFxuXHRzY2hlbWE6IEJyaWRnZVNjaGVtYTxPLCBTPixcblx0b3B0aW9uczogUWdpc1Nka09wdGlvbnMsXG4pOiBRZ2lzU2RrPE8sIFM+IHtcblx0aWYgKG9wdGlvbnMuY2xpZW50ICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy50cmFuc3BvcnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrRGVjbGFyYXRpb25FcnJvcihcblx0XHRcdFwiUWdpc1Nkay5mcm9tQnJpZGdlU2NoZW1hIHRha2VzIGEgY2xpZW50IG9yIGEgdHJhbnNwb3J0LCBub3QgYm90aFwiLFxuXHRcdCk7XG5cdH1cblx0Y29uc3Qgb3duZWQgPSBvcHRpb25zLmNsaWVudCA9PT0gdW5kZWZpbmVkO1xuXHRjb25zdCB0cmFuc3BvcnQgPVxuXHRcdG9wdGlvbnMudHJhbnNwb3J0ID8/XG5cdFx0KG9wdGlvbnMuY2xpZW50ID09PSB1bmRlZmluZWRcblx0XHRcdD8gY3JlYXRlV2ViQ2hhbm5lbFRyYW5zcG9ydChvcHRpb25zLmNoYW5uZWxPYmplY3QgPz8gXCJicmlkZ2VcIilcblx0XHRcdDogdW5kZWZpbmVkKTtcblx0Y29uc3QgY2xpZW50ID1cblx0XHRvcHRpb25zLmNsaWVudCA/P1xuXHRcdG5ldyBCcmlkZ2VDbGllbnQoXG5cdFx0XHR0cmFuc3BvcnQgYXMgV2lyZVRyYW5zcG9ydCxcblx0XHRcdG9wdGlvbnMudGltZW91dE1zID09PSB1bmRlZmluZWQgPyB7fSA6IHsgdGltZW91dE1zOiBvcHRpb25zLnRpbWVvdXRNcyB9LFxuXHRcdCk7XG5cdGxldCBoYW5kc2hha2U6IEhhbmRzaGFrZSB8IG51bGwgPSBudWxsO1xuXHRjb25zdCByZWFkeSA9IGNsaWVudC5oYW5kc2hha2UoKS50aGVuKCh2YWx1ZSkgPT4ge1xuXHRcdGhhbmRzaGFrZSA9IHBhcnNlSGFuZHNoYWtlKHZhbHVlKTtcblx0fSk7XG5cdC8vIEEgcGFnZSB0aGF0IG5ldmVyIGF3YWl0cyBgcmVhZHlgIHN0aWxsIHNlZXMgZXZlcnkgY2FsbCBmYWlsIG9uIGl0cyBvd247XG5cdC8vIHRoZSByZWplY3Rpb24gaXMgbm90IGxlZnQgdW5vYnNlcnZlZCBvbiB0b3Agb2YgdGhhdC5cblx0cmVhZHkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcblx0Y29uc3QgbWVtYmVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG5cdFx0c2NoZW1hLFxuXHRcdGNsaWVudCxcblx0XHRob3N0OiBidWlsZEhvc3QoY2xpZW50LCAoKSA9PiBoYW5kc2hha2UpLFxuXHRcdHJlYWR5LFxuXHRcdGNsb3NlOiAoKTogdm9pZCA9PiB7XG5cdFx0XHRpZiAob3duZWQpIHtcblx0XHRcdFx0Y2xpZW50LmNsb3NlKCk7XG5cdFx0XHR9XG5cdFx0fSxcblx0fTtcblx0Y29uc3QgbmFtZXNwYWNlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xuXHRmb3IgKGNvbnN0IGFjdGlvbiBvZiBzY2hlbWEuYWN0aW9ucykge1xuXHRcdHBsYWNlKG1lbWJlcnMsIG5hbWVzcGFjZXMsIGFjdGlvbi5pZCwgb3BlcmF0aW9uTWV0aG9kKGNsaWVudCwgYWN0aW9uKSk7XG5cdH1cblx0Zm9yIChjb25zdCBzdHJlYW0gb2Ygc2NoZW1hLnN0cmVhbXMpIHtcblx0XHRwbGFjZShtZW1iZXJzLCBuYW1lc3BhY2VzLCBzdHJlYW0uaWQsIHN0cmVhbU1ldGhvZChjbGllbnQsIHN0cmVhbSkpO1xuXHR9XG5cdGZvciAoY29uc3QgbmFtZXNwYWNlIG9mIG5hbWVzcGFjZXMpIHtcblx0XHRPYmplY3QuZnJlZXplKG5hbWVzcGFjZSk7XG5cdH1cblx0cmV0dXJuIE9iamVjdC5mcmVlemUobWVtYmVycykgYXMgdW5rbm93biBhcyBRZ2lzU2RrPE8sIFM+O1xufVxuXG4vKipcbiAqIFB1dCBvbmUgbWV0aG9kIHdoZXJlIGl0cyBpZCBzYXlzOiBgYS5iLmNgIGJlY29tZXMgYG1lbWJlcnMuYS5iLmNgLCBidWlsZGluZ1xuICogdGhlIG9iamVjdHMgb24gdGhlIHdheS4gVHdvIGlkcyBjYW5ub3QgYm90aCBiZSBob25lc3Qgd2hlbiBvbmUgaXMgYSBwcmVmaXhcbiAqIG9mIHRoZSBvdGhlciAtIGBzaXRlc2AgY2Fubm90IGJlIGEgbWV0aG9kIGFuZCBob2xkIGBzaXRlcy5zdW1tYXJ5YCAtIGFuZCBhXG4gKiBmaXJzdCBzZWdtZW50IHRoYXQgaXMgYSBjb3JlIG1lbWJlciB3b3VsZCBoaWRlIGl0LCBzbyBib3RoIGFyZSByZWZ1c2VkLlxuICovXG5mdW5jdGlvbiBwbGFjZShcblx0bWVtYmVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdG5hbWVzcGFjZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10sXG5cdGlkOiBzdHJpbmcsXG5cdG1ldGhvZDogdW5rbm93bixcbik6IHZvaWQge1xuXHRjb25zdCBzZWdtZW50cyA9IGlkLnNwbGl0KFwiLlwiKTtcblx0aWYgKHNlZ21lbnRzLnNvbWUoKHNlZ21lbnQpID0+IHNlZ21lbnQgPT09IFwiXCIpKSB7XG5cdFx0dGhyb3cgbmV3IFFnaXNTZGtEZWNsYXJhdGlvbkVycm9yKFxuXHRcdFx0YCR7aWR9OiBhbiBvcGVyYXRpb24gaWQgbWF5IG5vdCBoYXZlIGFuIGVtcHR5IHNlZ21lbnRgLFxuXHRcdCk7XG5cdH1cblx0Y29uc3QgaGVhZCA9IHNlZ21lbnRzWzBdIGFzIHN0cmluZztcblx0aWYgKFFHSVNfU0RLX01FTUJFUlMuaW5jbHVkZXMoaGVhZCkpIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0RlY2xhcmF0aW9uRXJyb3IoXG5cdFx0XHRgJHtpZH06IGFuIG9wZXJhdGlvbiBpZCBtYXkgbm90IHN0YXJ0IHdpdGggYSBRZ2lzU2RrIG1lbWJlciAoJHtRR0lTX1NES19NRU1CRVJTLmpvaW4oXCIsIFwiKX0pYCxcblx0XHQpO1xuXHR9XG5cdGxldCBub2RlID0gbWVtYmVycztcblx0Zm9yIChjb25zdCBbaW5kZXgsIHNlZ21lbnRdIG9mIHNlZ21lbnRzLmVudHJpZXMoKSkge1xuXHRcdGNvbnN0IHByZWZpeCA9IHNlZ21lbnRzLnNsaWNlKDAsIGluZGV4ICsgMSkuam9pbihcIi5cIik7XG5cdFx0Y29uc3QgZXhpc3RpbmcgPSBub2RlW3NlZ21lbnRdO1xuXHRcdGlmIChpbmRleCA9PT0gc2VnbWVudHMubGVuZ3RoIC0gMSkge1xuXHRcdFx0aWYgKGV4aXN0aW5nICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFFnaXNTZGtEZWNsYXJhdGlvbkVycm9yKFxuXHRcdFx0XHRcdHR5cGVvZiBleGlzdGluZyA9PT0gXCJmdW5jdGlvblwiXG5cdFx0XHRcdFx0XHQ/IGAke2lkfTogZHVwbGljYXRlIG9wZXJhdGlvbiBpZGBcblx0XHRcdFx0XHRcdDogYCR7aWR9OiBhbiBvcGVyYXRpb24gaWQgbWF5IG5vdCBiZSBhIHByZWZpeCBvZiBhbm90aGVyIGRlY2xhcmVkIGlkYCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdG5vZGVbc2VnbWVudF0gPSBtZXRob2Q7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChleGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBuYW1lc3BhY2U6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cdFx0XHRuYW1lc3BhY2VzLnB1c2gobmFtZXNwYWNlKTtcblx0XHRcdG5vZGVbc2VnbWVudF0gPSBuYW1lc3BhY2U7XG5cdFx0XHRub2RlID0gbmFtZXNwYWNlO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIGV4aXN0aW5nID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdHRocm93IG5ldyBRZ2lzU2RrRGVjbGFyYXRpb25FcnJvcihcblx0XHRcdFx0YCR7aWR9OiAke3ByZWZpeH0gaXMgYWxyZWFkeSBhbiBvcGVyYXRpb24gaWQ7IGFuIGlkIG1heSBub3QgZXh0ZW5kIGFub3RoZXJgLFxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bm9kZSA9IGV4aXN0aW5nIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIFRoZSBlbnRyeSBwb2ludDogYFFnaXNTZGsuZnJvbUJyaWRnZVNjaGVtYShzY2hlbWEpYC5cbiAqXG4gKiBBIG5hbWVzcGFjZSByYXRoZXIgdGhhbiBhIGNvbnN0YW50IHNvIHRoZSB2YWx1ZSBhbmQgdGhlIGluc3RhbmNlIHR5cGUgc2hhcmVcbiAqIG9uZSBuYW1lIHRocm91Z2ggZXZlcnkgZGVjbGFyYXRpb24gYnVuZGxlci5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBRZ2lzU2RrIHtcblx0LyoqXG5cdCAqIEJ1aWxkIGEgYFFnaXNTZGtgIG9uIGEgZ2VuZXJhdGVkIHNjaGVtYS5cblx0ICpcblx0ICogV2l0aG91dCBvcHRpb25zIGl0IGNvbm5lY3RzIHRvIHRoZSBwYWdlJ3MgUVdlYkNoYW5uZWwgb2JqZWN0IG5hbWVkXG5cdCAqIFwiYnJpZGdlXCIsIHdoaWNoIGlzIHdoYXQgdGhlIFB5dGhvbiBydW50aW1lIHJlZ2lzdGVyczsgYSB0ZXN0IHBhc3NlcyB0aGVcblx0ICogaGFybmVzcyBmcm9tIGBAYXJjaG9udDU2MS9xZ2lzLXNkay90ZXN0aW5nYCBhcyBgdHJhbnNwb3J0YCBpbnN0ZWFkLlxuXHQgKi9cblx0ZXhwb3J0IGZ1bmN0aW9uIGZyb21CcmlkZ2VTY2hlbWE8XG5cdFx0TyBleHRlbmRzIFJlY29yZDxrZXlvZiBPLCBPcGVyYXRpb25TaGFwZT4sXG5cdFx0UyBleHRlbmRzIFJlY29yZDxrZXlvZiBTLCBTdHJlYW1TaGFwZT4sXG5cdD4oc2NoZW1hOiBCcmlkZ2VTY2hlbWE8TywgUz4sIG9wdGlvbnM6IFFnaXNTZGtPcHRpb25zID0ge30pOiBRZ2lzU2RrPE8sIFM+IHtcblx0XHRyZXR1cm4gYnVpbGQoc2NoZW1hLCBvcHRpb25zKTtcblx0fVxufVxuIiwKICAgICIvKipcbiAqIFRoZSBicmlkZ2Ugc2NoZW1hOiBhIHBsdWdpbiBkZXNjcmlwdGlvbiB0aGF0IGFsc28gY2FycmllcyBpdHMgdHlwZXMuXG4gKlxuICogYHFnaXMtc2RrIGJyaWRnZSBnZW5lcmF0ZWAgd3JpdGVzIG9uZSBgYnJpZGdlLnNjaGVtYS50c2AgcGVyIHBsdWdpblxuICogKGRlY2lzaW9uLTQ0KS4gVGhhdCBtb2R1bGUgaGFzIG5vIGNvZGUgb2YgaXRzIG93bjogaXQgZGVjbGFyZXMgdGhlIHZhbHVlXG4gKiBpbnRlcmZhY2VzLCB0d28gbWFwcyAtIGBPcGVyYXRpb25zYCBhbmQgYFN0cmVhbXNgLCBrZXllZCBieSBvcGVyYXRpb24gaWQgLVxuICogYW5kIGVuZHMgaW4gYGRlZmluZUJyaWRnZVNjaGVtYTxPcGVyYXRpb25zLCBTdHJlYW1zPih7IC4uLmRlc2NyaXB0aW9uIH0pYC5cbiAqIFRoZSB0d28gdHlwZSBwYXJhbWV0ZXJzIG5ldmVyIGV4aXN0IGF0IHJ1biB0aW1lOyB0aGV5IHJpZGUgb24gdGhlIHJldHVybmVkXG4gKiBvYmplY3Qgc28gYFFnaXNTZGsuZnJvbUJyaWRnZVNjaGVtYShzY2hlbWEpYCBjYW4gaW5mZXIgdGhlbSwgYW5kIHRoZVxuICogZGVzY3JpcHRpb24gaXRzZWxmIGlzIHdoYXQgdGhlIFNESyB2YWxpZGF0ZXMgYWdhaW5zdC5cbiAqL1xuXG5pbXBvcnQgeyB0eXBlIFBsdWdpbkRlc2NyaXB0aW9uLCBwYXJzZVBsdWdpbkRlc2NyaXB0aW9uIH0gZnJvbSBcIi4vZGVjbGFyYXRpb25zXCI7XG5cbi8qKiBXaGF0IG9uZSBkZWNsYXJlZCBhY3Rpb24gcHJvbWlzZXM6IGFuIG9iamVjdCBpbiwgYSB2YWx1ZSBvdXQuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZXJhdGlvblNoYXBlIHtcblx0cmVhZG9ubHkgcmVxdWVzdDogb2JqZWN0O1xuXHRyZWFkb25seSByZXN1bHQ6IHVua25vd247XG59XG5cbi8qKiBXaGF0IG9uZSBkZWNsYXJlZCBzdHJlYW0gcHJvbWlzZXM6IGFuIG9iamVjdCBpbiwgZGlzY3JpbWluYXRlZCBldmVudHMgb3V0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHJlYW1TaGFwZSB7XG5cdHJlYWRvbmx5IHJlcXVlc3Q6IG9iamVjdDtcblx0cmVhZG9ubHkgZXZlbnQ6IHsgcmVhZG9ubHkga2luZDogc3RyaW5nOyByZWFkb25seSBwYXlsb2FkOiB1bmtub3duIH07XG59XG5cbi8qKiBUaGUgZGVmYXVsdCwgdW50eXBlZCBtYXA6IGFueSBpZCwgYW55IHNoYXBlLiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0aW9uTWFwID0geyByZWFkb25seSBbaWQ6IHN0cmluZ106IE9wZXJhdGlvblNoYXBlIH07XG5cbi8qKiBUaGUgZGVmYXVsdCwgdW50eXBlZCBtYXA6IGFueSBpZCwgYW55IHNoYXBlLiAqL1xuZXhwb3J0IHR5cGUgU3RyZWFtTWFwID0geyByZWFkb25seSBbaWQ6IHN0cmluZ106IFN0cmVhbVNoYXBlIH07XG5cbi8qKlxuICogQSBwYXJzZWQgcGx1Z2luIGRlc2NyaXB0aW9uIGNhcnJ5aW5nIGl0cyBgT3BlcmF0aW9uc2AgYW5kIGBTdHJlYW1zYCB0eXBlcy5cbiAqXG4gKiBUaGUgYFwifnR5cGVzXCJgIG1lbWJlciBpcyBjb21waWxlLXRpbWUgb25seTogaXQgaXMgbmV2ZXIgc2V0LCBhbmQgYSBzY2hlbWEgaXNcbiAqIGEgZnJvemVuIHtAbGluayBQbHVnaW5EZXNjcmlwdGlvbn0gYW5kIG5vdGhpbmcgbW9yZSBhdCBydW4gdGltZS4gSXQgaXMgYVxuICogc3RyaW5nIGtleSwgbm90IGEgdW5pcXVlIHN5bWJvbCwgc28gdGhlIHR5cGUgc3RheXMgc3RydWN0dXJhbGx5IHRoZSBzYW1lXG4gKiBhY3Jvc3MgdGhlIHBhY2thZ2UncyBlbnRyeSBwb2ludHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJpZGdlU2NoZW1hPE8gPSBPcGVyYXRpb25NYXAsIFMgPSBTdHJlYW1NYXA+XG5cdGV4dGVuZHMgUGx1Z2luRGVzY3JpcHRpb24ge1xuXHRyZWFkb25seSBcIn50eXBlc1wiPzoge1xuXHRcdHJlYWRvbmx5IG9wZXJhdGlvbnM6IE87XG5cdFx0cmVhZG9ubHkgc3RyZWFtczogUztcblx0fTtcbn1cblxuLyoqIFRoZSBgT3BlcmF0aW9uc2AgbWFwIGEgc2NoZW1hIGNhcnJpZXMuICovXG5leHBvcnQgdHlwZSBPcGVyYXRpb25zT2Y8U2NoZW1hPiA9XG5cdFNjaGVtYSBleHRlbmRzIEJyaWRnZVNjaGVtYTxpbmZlciBPLCB1bmtub3duPiA/IE8gOiBuZXZlcjtcblxuLyoqIFRoZSBgU3RyZWFtc2AgbWFwIGEgc2NoZW1hIGNhcnJpZXMuICovXG5leHBvcnQgdHlwZSBTdHJlYW1zT2Y8U2NoZW1hPiA9XG5cdFNjaGVtYSBleHRlbmRzIEJyaWRnZVNjaGVtYTx1bmtub3duLCBpbmZlciBTPiA/IFMgOiBuZXZlcjtcblxuLyoqXG4gKiBQYXJzZSBhIGRlc2NyaXB0aW9uIGFuZCB0eXBlIGl0OyB0aGUgZ2VuZXJhdGVkIG1vZHVsZSBpcyB0aGUgb25seSBjYWxsZXIuXG4gKlxuICogVGhlIGRlc2NyaXB0aW9uIGlzIGNoZWNrZWQgdGhlIHdheSBhbnkgZGVzY3JpcHRpb24gaXMgKGBzY2hlbWFfdmVyc2lvbmAsXG4gKiBpZHMsIGhhbmRsZXJzLCBkZWNsYXJlZCBzdHJlYW1zKSwgc28gYSBoYW5kLWVkaXRlZCBvciBzdGFsZSBtb2R1bGUgZmFpbHNcbiAqIGhlcmUsIGF0IGltcG9ydCwgcmF0aGVyIHRoYW4gb24gdGhlIGZpcnN0IGNhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVCcmlkZ2VTY2hlbWE8XG5cdE8gZXh0ZW5kcyBSZWNvcmQ8a2V5b2YgTywgT3BlcmF0aW9uU2hhcGU+LFxuXHRTIGV4dGVuZHMgUmVjb3JkPGtleW9mIFMsIFN0cmVhbVNoYXBlPixcbj4oaW5wdXQ6IHN0cmluZyB8IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pik6IEJyaWRnZVNjaGVtYTxPLCBTPiB7XG5cdHJldHVybiBwYXJzZVBsdWdpbkRlc2NyaXB0aW9uKGlucHV0KSBhcyBCcmlkZ2VT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RUFDbkU7QUFBQSxFQUNBLFdBQVcsYUFBYSxZQUFZO0FBQUEsSUFDbkMsT0FBTyxPQUFPLFNBQVM7QUFBQSxFQUN4QjtBQUFBLEVBQ0EsT0FBTyxPQUFPLE9BQU8sT0FBTztBQUFBO0FBUzdCLFNBQVMsS0FBSyxDQUNiLFNBQ0EsWUFDQSxJQUNBLFFBQ087QUFBQSxFQUNQLE1BQU0sV0FBVyxHQUFHLE1BQU0sR0FBRztBQUFBLEVBQzdCLElBQUksU0FBUyxLQUFLLENBQUMsWUFBWSxZQUFZLEVBQUUsR0FBRztBQUFBLElBQy9DLE1BQU0sSUFBSSx5QkFDVCxHQUFHLG1EQUNKO0FBQUEsRUFDRDtBQUFBLEVBQ0EsTUFBTSxPQUFPLFNBQVM7QUFBQSxFQUN0QixJQUFJLGlCQUFpQixTQUFTLElBQUksR0FBRztBQUFBLElBQ3BDLE1BQU0sSUFBSSx5QkFDVCxHQUFHLDREQUE0RCxpQkFBaUIsS0FBSyxJQUFJLElBQzFGO0FBQUEsRUFDRDtBQUFBLEVBQ0EsSUFBSSxPQUFPO0FBQUEsRUFDWCxZQUFZLE9BQU8sWUFBWSxTQUFTLFFBQVEsR0FBRztBQUFBLElBQ2xELE1BQU0sU0FBUyxTQUFTLE1BQU0sR0FBRyxRQUFRLENBQUMsRUFBRSxLQUFLLEdBQUc7QUFBQSxJQUNwRCxNQUFNLFdBQVcsS0FBSztBQUFBLElBQ3RCLElBQUksVUFBVSxTQUFTLFNBQVMsR0FBRztBQUFBLE1BQ2xDLElBQUksYUFBYSxXQUFXO0FBQUEsUUFDM0IsTUFBTSxJQUFJLHlCQUNULE9BQU8sYUFBYSxhQUNqQixHQUFHLCtCQUNILEdBQUcsZ0VBQ1A7QUFBQSxNQUNEO0FBQUEsTUFDQSxLQUFLLFdBQVc7QUFBQSxNQUNoQjtBQUFBLElBQ0Q7QUFBQSxJQUNBLElBQUksYUFBYSxXQUFXO0FBQUEsTUFDM0IsTUFBTSxZQUFxQyxDQUFDO0FBQUEsTUFDNUMsV0FBVyxLQUFLLFNBQVM7QUFBQSxNQUN6QixLQUFLLFdBQVc7QUFBQSxNQUNoQixPQUFPO0FBQUEsSUFDUixFQUFPLFNBQUksT0FBTyxhQUFhLFlBQVk7QUFBQSxNQUMxQyxNQUFNLElBQUkseUJBQ1QsR0FBRyxPQUFPLGlFQUNYO0FBQUEsSUFDRCxFQUFPO0FBQUEsTUFDTixPQUFPO0FBQUE7QUFBQSxFQUVUO0FBQUE7QUFTTSxJQUFVO0FBQUEsQ0FBVixDQUFVLFlBQVY7QUFBQSxFQVFDLFNBQVMsZ0JBR2YsQ0FBQyxRQUE0QixVQUEwQixDQUFDLEdBQWtCO0FBQUEsSUFDMUUsT0FBTyxNQUFNLFFBQVEsT0FBTztBQUFBO0FBQUEsRUFKdEIsUUFBUztBQUFBLEdBUkE7O0FDcGFWLFNBQVMsa0JBR2YsQ0FBQyxPQUF1RTtBQUFBLEVBQ3hFLE9BQU8sd0JBQXVCLEtBQUs7QUFBQTsiLAogICJkZWJ1Z0lkIjogIjUwN0M0N0E1NEE4N0JEMUI2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
413
+ //# debugId=C0D3B90FCB2E494864756E2164756E21
414
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL3Byb2Nlc3NpbmcudHMiLCAic3JjL3dlYmNoYW5uZWwudHMiLCAic3JjL3FnaXMtc2RrLnRzIiwgInNyYy9zY2hlbWEudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiLyoqXG4gKiBQcm9jZXNzaW5nIGZyb20gYSBwYWdlIChkZWNpc2lvbi02NCk6IHRoZSB2YWx1ZSBhbGlhc2VzIGEgZ2VuZXJhdGVkXG4gKiBgcHJvY2Vzc2luZy5zY2hlbWEudHNgIGFubm90YXRlcyB3aXRoLCBhbmQgYHJ1bkFsZ29yaXRobWAsIHdoaWNoIHNlbmRzIG9uZVxuICogYGFsZ29yaXRobXMucnVuYCBhbmQgcmVzaGFwZXMgdGhlIHRhZ2dlZCBvdXRwdXRzIGludG8gdGhlIHJlc3VsdCBvYmplY3QgdGhlXG4gKiBnZW5lcmF0ZWQgYDxQcm92aWRlcj48QWxnb3JpdGhtPlJlc3VsdGAgdHlwZSBzcGVsbHMuXG4gKlxuICogVGhlIHR5cGluZyBsaXZlcyBpbiB0aGUgZ2VuZXJhdGVkIG1vZHVsZSwgbm90IGhlcmU6IGBxZ2lzLXNkayBwcm9jZXNzaW5nXG4gKiBnZW5lcmF0ZWAgZW1pdHMgYW4gYEFsZ29yaXRobVJlZ2lzdHJ5YCBmb3IgdGhlIHByb3ZpZGVycyB0aGUgcHJvamVjdCBhc2tlZFxuICogZm9yIGFuZCBhIGBydW5BbGdvcml0aG1gIGJvdW5kIHRvIGl0LiBUaGlzIG1vZHVsZSBpcyBnZW5lcmljIG92ZXIgYW55IHN1Y2hcbiAqIHJlZ2lzdHJ5IHNvIHRoZSBicmlkZ2UgaXRzZWxmIHNoaXBzIG5vIGNhdGFsb2d1ZSAoZGVjaXNpb24tNDc6IHplcm8gcnVudGltZVxuICogZGF0YSB0aGF0IGdvZXMgc3RhbGUgd2l0aCBhIFFHSVMgcmVsZWFzZSkuXG4gKlxuICogVGhlIGhvc3QgdmFsaWRhdGVzIHRoZSBwYXJhbWV0ZXJzIGFnYWluc3QgdGhlIGFsZ29yaXRobSdzIG93biBkZXNjcmlwdGlvblxuICogYmVmb3JlIGFueXRoaW5nIHJ1bnM7IGEgbGF5ZXIgaW5wdXQgaXMgYW4gb3duZWQgbGF5ZXIgaWQsIGEgZmlsZSBpbnB1dCBpcyBhXG4gKiByZWYgdGhlIGhvc3QgbWludGVkIGZvciB0aGlzIHZpZXcsIGFuZCBhbiBvbWl0dGVkIGRlc3RpbmF0aW9uIGNvbWVzIGJhY2sgYXNcbiAqIGFuIG93bmVkIGxheWVyIG9yIGEgcmVhZGFibGUgcmVmLlxuICovXG5cbmltcG9ydCB0eXBlIHtcblx0RmlsZVJlZixcblx0SG9zdEludm9rZU9wdGlvbnMsXG5cdEhvc3RPcGVyYXRpb25zLFxuXHRSdW5PdXRwdXQsXG5cdFJ1blJlc3VsdCxcblx0VmVjdG9yTGF5ZXJJbmZvLFxufSBmcm9tIFwiLi9nZW5lcmF0ZWQvaG9zdFwiO1xuXG5leHBvcnQgdHlwZSB7XG5cdEFsZ29yaXRobUluZm8sXG5cdEFsZ29yaXRobVN1bW1hcnksXG5cdEZpbGVSZWYsXG5cdEhvc3RJbnZva2VPcHRpb25zLFxuXHRPdXRwdXRJbmZvLFxuXHRQYXJhbWV0ZXJJbmZvLFxuXHRQcm92aWRlckluZm8sXG5cdFJ1bk91dHB1dCxcblx0UnVuUmVzdWx0LFxuXHRWZWN0b3JMYXllckluZm8sXG59IGZyb20gXCIuL2dlbmVyYXRlZC9ob3N0XCI7XG5cbi8qKiBBIGxheWVyIGlucHV0OiB0aGUgaWQgb2YgYSBsYXllciB0aGUgaG9zdCBvd25zLCBvciBhIHJlZiB0aGUgdmlldyBob2xkcy4gKi9cbmV4cG9ydCB0eXBlIExheWVyUmVmID0gc3RyaW5nIHwgRmlsZVJlZjtcbi8qKiBXaGVyZSBhbiBvdXRwdXQgZ29lczogYSB3cml0YWJsZSByZWYsIG9yIGBudWxsYCB0byBsZXQgdGhlIGhvc3QgYWxsb2NhdGUgb25lLiAqL1xuZXhwb3J0IHR5cGUgRGVzdGluYXRpb24gPSBGaWxlUmVmIHwgbnVsbDtcbi8qKiBgXCJ4bWluLHhtYXgseW1pbix5bWF4IFtjcnNdXCJgIGFzIFFHSVMgd3JpdGVzIGl0LCBvciB0aGUgZm91ciBudW1iZXJzLiAqL1xuZXhwb3J0IHR5cGUgRXh0ZW50ID0gc3RyaW5nIHwgcmVhZG9ubHkgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4vKiogYFwieCx5IFtjcnNdXCJgIG9yIHRoZSB0d28gbnVtYmVycy4gKi9cbmV4cG9ydCB0eXBlIFBvaW50VmFsdWUgPSBzdHJpbmcgfCByZWFkb25seSBbbnVtYmVyLCBudW1iZXJdO1xuLyoqIGBbbG93ZXIsIHVwcGVyXWAuICovXG5leHBvcnQgdHlwZSBSYW5nZVZhbHVlID0gcmVhZG9ubHkgW251bWJlciwgbnVtYmVyXTtcblxuLyoqXG4gKiBXaGF0IGEgZ2VuZXJhdGVkIGBBbGdvcml0aG1SZWdpc3RyeWAgaXM6IHBhcmFtcyBhbmQgcmVzdWx0IHBlciBhbGdvcml0aG0gaWQuXG4gKiBTcGVsbGVkIGFzIGEgbWFwcGVkIGNvbnN0cmFpbnQgb3ZlciB0aGUgcmVnaXN0cnkgaXRzZWxmIHNvIGFuIGBpbnRlcmZhY2VgXG4gKiAod2hpY2ggaGFzIG5vIGltcGxpY2l0IGluZGV4IHNpZ25hdHVyZSkgc2F0aXNmaWVzIGl0LlxuICovXG5leHBvcnQgdHlwZSBBbGdvcml0aG1SZWdpc3RyeUxpa2U8Uj4gPSB7XG5cdHJlYWRvbmx5IFtLIGluIGtleW9mIFJdOiB7IHJlYWRvbmx5IHBhcmFtczogb2JqZWN0OyByZWFkb25seSByZXN1bHQ6IG9iamVjdCB9O1xufTtcblxuLyoqIFRoZSBwYXJ0IG9mIGEgYFFnaXNTZGtgIChvciBhbnl0aGluZyBlbHNlKSBgcnVuQWxnb3JpdGhtYCBuZWVkcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWxnb3JpdGhtSG9zdCB7XG5cdHJlYWRvbmx5IGhvc3Q6IFBpY2s8SG9zdE9wZXJhdGlvbnMsIFwiYWxnb3JpdGhtc1wiPjtcbn1cblxuLyoqIE9uZSBydW4gYXMgdGhlIHBhZ2Ugc2VlcyBpdDogdGhlIG91dHB1dHMgYnkgbmFtZSwgcGx1cyB0aGUgcmVwbHkgYXMgaXQgY3Jvc3NlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWxnb3JpdGhtUnVuPFJlc3VsdCBleHRlbmRzIG9iamVjdD4ge1xuXHRyZWFkb25seSBhbGdvcml0aG06IHN0cmluZztcblx0cmVhZG9ubHkgb3V0cHV0czogUmVzdWx0O1xuXHRyZWFkb25seSByYXc6IFJ1blJlc3VsdDtcbn1cblxuLyoqXG4gKiBSdW4gYGlkYCB3aXRoIGBwYXJhbXNgIHRocm91Z2ggYHFnaXMuaG9zdC5hbGdvcml0aG1zLnJ1bmAgYW5kIHJlc2hhcGUgdGhlXG4gKiByZXBseTogYSBgdmVjdG9yYCBvdXRwdXQgYmVjb21lcyBpdHMgYFZlY3RvckxheWVySW5mb2AsIGEgYGZpbGVgIG91dHB1dCBpdHNcbiAqIGBGaWxlUmVmYCwgYSBgdmFsdWVgIG91dHB1dCB0aGUgc2NhbGFyIC0ga2V5ZWQgYnkgb3V0cHV0IG5hbWUsIHdoaWNoIGlzIHdoYXRcbiAqIHRoZSBnZW5lcmF0ZWQgYC4uLlJlc3VsdGAgaW50ZXJmYWNlcyBkZWNsYXJlLlxuICpcbiAqIEJvdGggdHlwZSBwYXJhbWV0ZXJzIGFyZSBtZWFudCB0byBiZSBib3VuZCBieSB0aGUgZ2VuZXJhdGVkIG1vZHVsZSdzIG93blxuICogYHJ1bkFsZ29yaXRobWA7IGNhbGxpbmcgdGhpcyBvbmUgZGlyZWN0bHkgbmVlZHMgdGhlbSBzcGVsbGVkIG91dC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkFsZ29yaXRobTxcblx0UiBleHRlbmRzIEFsZ29yaXRobVJlZ2lzdHJ5TGlrZTxSPixcblx0SyBleHRlbmRzIGtleW9mIFIgJiBzdHJpbmcsXG4+KFxuXHRxZ2lzOiBBbGdvcml0aG1Ib3N0LFxuXHRpZDogSyxcblx0cGFyYW1zOiBSW0tdW1wicGFyYW1zXCJdLFxuXHRvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMsXG4pOiBQcm9taXNlPEFsZ29yaXRobVJ1bjxSW0tdW1wicmVzdWx0XCJdPj4ge1xuXHRjb25zdCByYXcgPSBhd2FpdCBxZ2lzLmhvc3QuYWxnb3JpdGhtcy5ydW4oXG5cdFx0eyBhbGdvcml0aG1faWQ6IGlkLCBwYXJhbXM6IHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9LFxuXHRcdG9wdGlvbnMsXG5cdCk7XG5cdHJldHVybiB7XG5cdFx0YWxnb3JpdGhtOiByYXcuYWxnb3JpdGhtLFxuXHRcdG91dHB1dHM6IG91dHB1dHNCeU5hbWUocmF3Lm91dHB1dHMpIGFzIFJbS11bXCJyZXN1bHRcIl0sXG5cdFx0cmF3LFxuXHR9O1xufVxuXG4vKiogVW53cmFwIGEgdGFnZ2VkIG91dHB1dCBsaXN0IGludG8gYHsgW25hbWVdOiBsYXllciB8IHJlZiB8IHZhbHVlIH1gLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG91dHB1dHNCeU5hbWUoXG5cdG91dHB1dHM6IHJlYWRvbmx5IFJ1bk91dHB1dFtdLFxuKTogUmVjb3JkPFxuXHRzdHJpbmcsXG5cdFZlY3RvckxheWVySW5mbyB8IEZpbGVSZWYgfCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZFxuPiB7XG5cdGNvbnN0IHJlc3VsdDogUmVjb3JkPFxuXHRcdHN0cmluZyxcblx0XHRWZWN0b3JMYXllckluZm8gfCBGaWxlUmVmIHwgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWRcblx0PiA9IHt9O1xuXHRmb3IgKGNvbnN0IG91dHB1dCBvZiBvdXRwdXRzKSB7XG5cdFx0aWYgKG91dHB1dC5raW5kID09PSBcInZlY3RvclwiKSByZXN1bHRbb3V0cHV0Lm5hbWVdID0gb3V0cHV0LmxheWVyO1xuXHRcdGVsc2UgaWYgKG91dHB1dC5raW5kID09PSBcImZpbGVcIikgcmVzdWx0W291dHB1dC5uYW1lXSA9IG91dHB1dC5maWxlO1xuXHRcdGVsc2UgcmVzdWx0W291dHB1dC5uYW1lXSA9IG91dHB1dC52YWx1ZTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufVxuIiwKICAgICIvKipcbiAqIFRoZSBkZWZhdWx0IHRyYW5zcG9ydDogUXQncyBXZWJDaGFubmVsLCBhcyBhIFFHSVMgd2ViIHZpZXcgaW5qZWN0cyBpdC5cbiAqXG4gKiBRR0lTIHJlZ2lzdGVycyBvbmUgb2JqZWN0IG9uIHRoZSBjaGFubmVsICh0aGUgZXhhbXBsZSBuYW1lcyBpdCBcImJyaWRnZVwiO1xuICogc2VlIGBjcmVhdGVfY2hhbm5lbF9vYmplY3RgIGluIHRoZSBQeXRob24gcnVudGltZSkuIEl0cyBgcmVjZWl2ZWAgc2xvdCB0YWtlc1xuICogYSBKU09OIGVudmVsb3BlIGFuZCBpdHMgYG1lc3NhZ2VgIHNpZ25hbCBjYXJyaWVzIGV2ZXJ5IHJlcGx5IGFuZCBzdHJlYW1cbiAqIGZyYW1lIGJhY2suIFRoZSBjaGFubmVsIGJlY29tZXMgcmVhZHkgb24gYSBsYXRlciB0dXJuLCBzbyB0aGlzIHRyYW5zcG9ydFxuICogaXMgbGF6eTogYSBgUWdpc1Nka2AgYnVpbHQgaW4gdGhlIGZpcnN0IHN0YXRlbWVudCBvZiBhIHBhZ2UgY2FuIHNlbmQgYXRcbiAqIG9uY2UsIGFuZCB3aGF0IGl0IHNlbnQgaXMgZGVsaXZlcmVkIHdoZW4gdGhlIGNoYW5uZWwgcmVwb3J0cyByZWFkeS5cbiAqXG4gKiBUaGlzIGlzIHRoZSBvbmUgbW9kdWxlIG9mIHRoZSByb290IGVudHJ5IHBvaW50IHRoYXQgcmVhZHMgYSBicm93c2VyIGdsb2JhbCxcbiAqIGFuZCBpdCBvbmx5IGRvZXMgc28gd2hlbiBjYWxsZWQ6IGltcG9ydGluZyBpdCB0b3VjaGVzIG5vdGhpbmcsIGFuZCBhIHBhZ2VcbiAqIHRoYXQgaXMgbm90IGluc2lkZSBRR0lTIGdldHMgYSBzeW5jaHJvbm91cywgbmFtZWQgcmVmdXNhbCBpbnN0ZWFkIG9mIGEgaGFuZy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFdpcmVUcmFuc3BvcnQgfSBmcm9tIFwiLi9icmlkZ2VcIjtcbmltcG9ydCB7IFFnaXNTZGtFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuXG5pbnRlcmZhY2UgQ2hhbm5lbE9iamVjdCB7XG5cdHJlY2VpdmUodGV4dDogc3RyaW5nKTogdm9pZDtcblx0cmVhZG9ubHkgbWVzc2FnZToge1xuXHRcdGNvbm5lY3QobGlzdGVuZXI6ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkO1xuXHRcdGRpc2Nvbm5lY3QobGlzdGVuZXI6ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkO1xuXHR9O1xufVxuXG5pbnRlcmZhY2UgQ2hhbm5lbCB7XG5cdHJlYWRvbmx5IG9iamVjdHM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIENoYW5uZWxPYmplY3QgfCB1bmRlZmluZWQ+Pjtcbn1cblxuaW50ZXJmYWNlIFF0U2NvcGUge1xuXHRyZWFkb25seSBxdD86IHsgcmVhZG9ubHkgd2ViQ2hhbm5lbFRyYW5zcG9ydDogdW5rbm93biB9O1xuXHRyZWFkb25seSBRV2ViQ2hhbm5lbD86IG5ldyAoXG5cdFx0dHJhbnNwb3J0OiB1bmtub3duLFxuXHRcdHJlYWR5OiAoY2hhbm5lbDogQ2hhbm5lbCkgPT4gdm9pZCxcblx0KSA9PiB1bmtub3duO1xufVxuXG4vKiogVGhlIHdlYiB2aWV3IGRpZCBub3QgcHJvdmlkZSBhIHVzYWJsZSBjaGFubmVsLiAqL1xuZXhwb3J0IGNsYXNzIFFnaXNTZGtXZWJDaGFubmVsRXJyb3IgZXh0ZW5kcyBRZ2lzU2RrRXJyb3Ige1xuXHRwdWJsaWMgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG5cdFx0c3VwZXIobWVzc2FnZSwgXCJub193ZWJfY2hhbm5lbFwiKTtcblx0fVxufVxuXG4vKiogVGhlIHRyYW5zcG9ydCB7QGxpbmsgY3JlYXRlV2ViQ2hhbm5lbFRyYW5zcG9ydH0gcmV0dXJucy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViQ2hhbm5lbFRyYW5zcG9ydCBleHRlbmRzIFdpcmVUcmFuc3BvcnQge1xuXHQvKiogUmVzb2x2ZXMgb25jZSB0aGUgY2hhbm5lbCBvYmplY3QgYW5zd2VyZWQ7IHJlamVjdHMgd2hlbiBpdCBuZXZlciB3aWxsLiAqL1xuXHRyZWFkb25seSByZWFkeTogUHJvbWlzZTx2b2lkPjtcblx0LyoqIFN0b3AgZm9yd2FyZGluZyBtZXNzYWdlczsgc2VuZHMgYWZ0ZXIgdGhpcyB0aHJvdy4gKi9cblx0Y2xvc2UoKTogdm9pZDtcbn1cblxuZnVuY3Rpb24gc2NvcGUoKTogUXRTY29wZSB7XG5cdHJldHVybiBnbG9iYWxUaGlzIGFzIHVua25vd24gYXMgUXRTY29wZTtcbn1cblxuLyoqIFRydWUgaW5zaWRlIGEgUUdJUyB3ZWIgdmlldywgd2hlcmUgUXQgaW5qZWN0ZWQgaXRzIHRyYW5zcG9ydCBhbmQgc2NyaXB0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc2lkZVFnaXMoKTogYm9vbGVhbiB7XG5cdGNvbnN0IHBhZ2UgPSBzY29wZSgpO1xuXHRyZXR1cm4gcGFnZS5xdCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBwYWdlLlFXZWJDaGFubmVsID09PSBcImZ1bmN0aW9uXCI7XG59XG5cbi8qKlxuICogQ29ubmVjdCB0byB0aGUgY2hhbm5lbCBvYmplY3QgYG9iamVjdE5hbWVgIGFuZCByZXR1cm4gYSB0cmFuc3BvcnQgb24gaXQuXG4gKlxuICogVGhyb3dzIHtAbGluayBRZ2lzU2RrV2ViQ2hhbm5lbEVycm9yfSBzeW5jaHJvbm91c2x5IG91dHNpZGUgYSBRR0lTIHdlYiB2aWV3LFxuICogc28gYSBwYWdlIGxlYXJucyBpbiBpdHMgZmlyc3Qgc3RhdGVtZW50IHRoYXQgaXQgaGFzIG5vIGhvc3QgdG8gdGFsayB0by5cbiAqIEluc2lkZSBvbmUsIG1lc3NhZ2VzIHNlbnQgYmVmb3JlIHRoZSBjaGFubmVsIGlzIHJlYWR5IGFyZSBxdWV1ZWQgYW5kXG4gKiBkZWxpdmVyZWQgaW4gb3JkZXIgb25jZSBpdCBpczsgYHJlYWR5YCByZWplY3RzIChhbmQgcXVldWVkIHNlbmRzIGFyZVxuICogZHJvcHBlZCkgd2hlbiB0aGUgaG9zdCByZWdpc3RlcmVkIG5vIG9iamVjdCB1bmRlciB0aGF0IG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXZWJDaGFubmVsVHJhbnNwb3J0KFxuXHRvYmplY3ROYW1lID0gXCJicmlkZ2VcIixcbik6IFdlYkNoYW5uZWxUcmFuc3BvcnQge1xuXHRjb25zdCBwYWdlID0gc2NvcGUoKTtcblx0Y29uc3QgcXQgPSBwYWdlLnF0O1xuXHRjb25zdCBRV2ViQ2hhbm5lbCA9IHBhZ2UuUVdlYkNoYW5uZWw7XG5cdGlmIChxdCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBRV2ViQ2hhbm5lbCAhPT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0dGhyb3cgbmV3IFFnaXNTZGtXZWJDaGFubmVsRXJyb3IoXG5cdFx0XHRcIm5vdCBpbnNpZGUgYSBRR0lTIHdlYiB2aWV3OiB3aW5kb3cucXQgaXMgbWlzc2luZ1wiLFxuXHRcdCk7XG5cdH1cblx0Y29uc3QgbGlzdGVuZXJzID0gbmV3IFNldDwobWVzc2FnZTogdW5rbm93bikgPT4gdm9pZD4oKTtcblx0Y29uc3QgcXVldWU6IHN0cmluZ1tdID0gW107XG5cdGxldCBvYmplY3Q6IENoYW5uZWxPYmplY3QgfCBudWxsID0gbnVsbDtcblx0bGV0IGZhaWx1cmU6IFFnaXNTZGtXZWJDaGFubmVsRXJyb3IgfCBudWxsID0gbnVsbDtcblx0bGV0IGNsb3NlZCA9IGZhbHNlO1xuXHRjb25zdCBmb3J3YXJkID0gKHRleHQ6IHN0cmluZyk6IHZvaWQgPT4ge1xuXHRcdGlmIChjbG9zZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0bGV0IHBhcnNlZDogdW5rbm93bjtcblx0XHR0cnkge1xuXHRcdFx0cGFyc2VkID0gSlNPTi5wYXJzZSh0ZXh0KTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Zm9yIChjb25zdCBsaXN0ZW5lciBvZiBbLi4ubGlzdGVuZXJzXSkge1xuXHRcdFx0bGlzdGVuZXIocGFyc2VkKTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IHJlYWR5ID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdG5ldyBRV2ViQ2hhbm5lbChxdC53ZWJDaGFubmVsVHJhbnNwb3J0LCAoY2hhbm5lbCkgPT4ge1xuXHRcdFx0Y29uc3QgZm91bmQgPSBjaGFubmVsLm9iamVjdHNbb2JqZWN0TmFtZV07XG5cdFx0XHRpZiAoZm91bmQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRmYWlsdXJlID0gbmV3IFFnaXNTZGtXZWJDaGFubmVsRXJyb3IoXG5cdFx0XHRcdFx0YHRoZSBob3N0IHJlZ2lzdGVyZWQgbm8gJHtKU09OLnN0cmluZ2lmeShvYmplY3ROYW1lKX0gY2hhbm5lbCBvYmplY3RgLFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRxdWV1ZS5sZW5ndGggPSAwO1xuXHRcdFx0XHRyZWplY3QoZmFpbHVyZSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmIChjbG9zZWQpIHtcblx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRvYmplY3QgPSBmb3VuZDtcblx0XHRcdGZvdW5kLm1lc3NhZ2UuY29ubmVjdChmb3J3YXJkKTtcblx0XHRcdGZvciAoY29uc3QgdGV4dCBvZiBxdWV1ZS5zcGxpY2UoMCkpIHtcblx0XHRcdFx0Zm91bmQucmVjZWl2ZSh0ZXh0KTtcblx0XHRcdH1cblx0XHRcdHJlc29sdmUoKTtcblx0XHR9KTtcblx0fSk7XG5cdHJldHVybiB7XG5cdFx0cmVhZHksXG5cdFx0c2VuZChtZXNzYWdlOiB1bmtub3duKTogdm9pZCB7XG5cdFx0XHRpZiAoY2xvc2VkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBRZ2lzU2RrV2ViQ2hhbm5lbEVycm9yKFwidGhlIHdlYiBjaGFubmVsIHRyYW5zcG9ydCBpcyBjbG9zZWRcIik7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZmFpbHVyZSAhPT0gbnVsbCkge1xuXHRcdFx0XHR0aHJvdyBmYWlsdXJlO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgdGV4dCA9IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpO1xuXHRcdFx0aWYgKG9iamVjdCA9PT0gbnVsbCkge1xuXHRcdFx0XHRxdWV1ZS5wdXNoKHRleHQpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRvYmplY3QucmVjZWl2ZSh0ZXh0KTtcblx0XHR9LFxuXHRcdHN1YnNjcmliZShsaXN0ZW5lcjogKG1lc3NhZ2U6IHVua25vd24pID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcblx0XHRcdGxpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuXHRcdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdFx0bGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0Y2xvc2UoKTogdm9pZCB7XG5cdFx0XHRpZiAoY2xvc2VkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNsb3NlZCA9IHRydWU7XG5cdFx0XHRxdWV1ZS5sZW5ndGggPSAwO1xuXHRcdFx0bGlzdGVuZXJzLmNsZWFyKCk7XG5cdFx0XHRvYmplY3Q/Lm1lc3NhZ2UuZGlzY29ubmVjdChmb3J3YXJkKTtcblx0XHR9LFxuXHR9O1xufVxuIiwKICAgICIvKipcbiAqIGBRZ2lzU2RrYDogdGhlIHBhZ2Utc2lkZSBvYmplY3QgYSBwbHVnaW4ncyB3ZWIgdmlldyB0YWxrcyB0byBRR0lTIHRocm91Z2guXG4gKlxuICogVGhyZWUgc3RhdGVtZW50cyBjb25uZWN0IGEgcGFnZSAoZGVjaXNpb24tNDQpOlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgc2NoZW1hIGZyb20gXCIuL2JyaWRnZS5zY2hlbWFcIjtcbiAqIGNvbnN0IHFnaXMgPSBRZ2lzU2RrLmZyb21CcmlkZ2VTY2hlbWEoc2NoZW1hKTtcbiAqIGF3YWl0IHFnaXMuc2l0ZXMuc3VtbWFyeSh7IGxheWVyX2lkIH0pO1xuICogYGBgXG4gKlxuICogVGhlIHNjaGVtYSBpcyB0aGUgZ2VuZXJhdGVkIGBicmlkZ2Uuc2NoZW1hLnRzYDogdGhlIHBsdWdpbiBkZXNjcmlwdGlvbiBwbHVzXG4gKiBpdHMgYE9wZXJhdGlvbnNgIGFuZCBgU3RyZWFtc2AgdHlwZXMuIEZyb20gdGhlIGRlc2NyaXB0aW9uIHRoZSBTREsgYnVpbGRzXG4gKiBvbmUgbWV0aG9kIHBlciBkZWNsYXJlZCBhY3Rpb24gYW5kIHN0cmVhbSwgbmVzdGVkIHVuZGVyIHRoZSBzZWdtZW50cyBvZiBpdHNcbiAqIGlkIChgc2l0ZXMuc3VtbWFyeWAgaXMgYHFnaXMuc2l0ZXMuc3VtbWFyeWAsIGBidWZmZXJgIGlzIGBxZ2lzLmJ1ZmZlcmApLFxuICogYW5kIGNoZWNrcyBldmVyeSBhcmd1bWVudCwgcmVwbHkgYW5kIGV2ZW50IGFnYWluc3QgdGhlIGRlY2xhcmVkIHNjaGVtYXNcbiAqIHdpdGggdGhlIHNhbWUgcnVsZXMgdGhlIGhvc3QgYXBwbGllcyAoYHZhbGlkYXRlLnRzYCkuIEZyb20gdGhlIHR5cGVzIGl0IGdpdmVzIHRob3NlXG4gKiBtZXRob2RzIHRoZWlyIHNpZ25hdHVyZXMsIHNvIGEgd3JvbmcgYXJndW1lbnQgc2hhcGUgb3IgYW4gdW5rbm93biBvcGVyYXRpb25cbiAqIGlzIGEgY29tcGlsZSBlcnJvciBhbmQgYSB2YWx1ZSBvdXRzaWRlIHRoZSBzY2hlbWEgYXQgcnVuIHRpbWUgaXMgYVxuICoge0BsaW5rIFFnaXNTZGtDb250cmFjdEVycm9yfS5cbiAqXG4gKiBgaG9zdGAgaXMgdGhlIGN1cmF0ZWQgaG9zdCBzdXJmYWNlIG9mIGRlY2lzaW9uLTI3LCBidWlsdCBvbiB0aGUgc2FtZSBjbGllbnQsXG4gKiBwbHVzIGBncmFudGVkYDogdGhlIGhvc3Qgb3BlcmF0aW9uIGlkcyB0aGUgaGFuZHNoYWtlIGFkdmVydGlzZWQgZm9yIHRoaXNcbiAqIHZpZXcuIEEgY2FsbCBvdXRzaWRlIHRoZSBncmFudHMgaXMgbm90IHJlZnVzZWQgaGVyZSAtIHRoZSBob3N0IHJlZnVzZXMgaXQsXG4gKiBhbmQgdGhlIHBhZ2Ugc2VlcyB0aGUgaG9zdCdzIGBub3RfYXV0aG9yaXplZGAgLSBidXQgYSBwYWdlIGNhbiByZWFkIGBncmFudGVkYFxuICogYWZ0ZXIgYHJlYWR5YCB0byBoaWRlIHdoYXQgaXQgbWF5IG5vdCB1c2UuXG4gKi9cblxuaW1wb3J0IHtcblx0QnJpZGdlQ2xpZW50LFxuXHR0eXBlIEJyaWRnZVN0cmVhbVRlcm1pbmFsLFxuXHR0eXBlIEJyaWRnZVN1YnNjcmlwdGlvbixcblx0dHlwZSBJbnZva2VPcHRpb25zLFxuXHRRZ2lzU2RrQnJpZGdlUHJvdG9jb2xFcnJvcixcblx0dHlwZSBXaXJlVHJhbnNwb3J0LFxufSBmcm9tIFwiLi9icmlkZ2VcIjtcbmltcG9ydCB7XG5cdHR5cGUgQWN0aW9uRGVzY3JpcHRpb24sXG5cdFFnaXNTZGtEZWNsYXJhdGlvbkVycm9yLFxuXHR0eXBlIFN0cmVhbURlc2NyaXB0aW9uLFxufSBmcm9tIFwiLi9kZWNsYXJhdGlvbnNcIjtcbmltcG9ydCB7XG5cdGNyZWF0ZUhvc3QsXG5cdEhPU1RfT1BFUkFUSU9OUyxcblx0dHlwZSBIb3N0T3BlcmF0aW9uSWQsXG5cdHR5cGUgSG9zdE9wZXJhdGlvbnMsXG59IGZyb20gXCIuL2dlbmVyYXRlZC9ob3N0XCI7XG5pbXBvcnQgeyBpc1BsYWluUmVjb3JkIH0gZnJvbSBcIi4vaW50ZXJuYWxcIjtcbmltcG9ydCB0eXBlIHtcblx0QnJpZGdlU2NoZW1hLFxuXHRPcGVyYXRpb25NYXAsXG5cdE9wZXJhdGlvblNoYXBlLFxuXHRTdHJlYW1NYXAsXG5cdFN0cmVhbVNoYXBlLFxufSBmcm9tIFwiLi9zY2hlbWFcIjtcbmltcG9ydCB7IFFnaXNTZGtDb250cmFjdEVycm9yLCB2YWxpZGF0ZUFnYWluc3RTY2hlbWEgfSBmcm9tIFwiLi92YWxpZGF0ZVwiO1xuaW1wb3J0IHsgY3JlYXRlV2ViQ2hhbm5lbFRyYW5zcG9ydCB9IGZyb20gXCIuL3dlYmNoYW5uZWxcIjtcblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBRZ2lzU2RrLmZyb21CcmlkZ2VTY2hlbWF9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBRZ2lzU2RrT3B0aW9ucyB7XG5cdC8qKiBBIHRyYW5zcG9ydCB0byBzcGVhayB0aHJvdWdoOyBkZWZhdWx0cyB0byB0aGUgcGFnZSdzIFFXZWJDaGFubmVsLiAqL1xuXHRyZWFkb25seSB0cmFuc3BvcnQ/OiBXaXJlVHJhbnNwb3J0O1xuXHQvKiogQSBjbGllbnQgdGhlIGNhbGxlciBvd25zOyBgY2xvc2UoKWAgbGVhdmVzIGl0IG9wZW4uIEV4Y2x1ZGVzIGB0cmFuc3BvcnRgLiAqL1xuXHRyZWFkb25seSBjbGllbnQ/OiBCcmlkZ2VDbGllbnQ7XG5cdC8qKiBQZXItY2FsbCB0aW1lb3V0IGZvciBhbiBvd25lZCBjbGllbnQuICovXG5cdHJlYWRvbmx5IHRpbWVvdXRNcz86IG51bWJlcjtcblx0LyoqIFRoZSBjaGFubmVsIG9iamVjdCdzIG5hbWUgd2hlbiB0aGUgZGVmYXVsdCB0cmFuc3BvcnQgaXMgdXNlZC4gKi9cblx0cmVhZG9ubHkgY2hhbm5lbE9iamVjdD86IHN0cmluZztcbn1cblxuLyoqIEhhbmRsZXJzIGZvciBhIHR5cGVkIHN0cmVhbTogZXZlbnRzIGFzIGRlY2xhcmVkLCB0aGVuIGV4YWN0bHkgb25lIGVuZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RyZWFtSGFuZGxlcnM8RT4ge1xuXHRyZWFkb25seSBvbkV2ZW50PzogKGV2ZW50OiBFKSA9PiB2b2lkO1xuXHRyZWFkb25seSBvblRlcm1pbmFsPzogKHRlcm1pbmFsOiBCcmlkZ2VTdHJlYW1UZXJtaW5hbCkgPT4gdm9pZDtcbn1cblxuLyoqIEEgbGl2ZSBzdHJlYW0sIGFzIHRoZSBjYWxsZXIgaG9sZHMgaXQuICovXG5leHBvcnQgdHlwZSBTdHJlYW1IYW5kbGUgPSBCcmlkZ2VTdWJzY3JpcHRpb247XG5cbi8qKiBUaGUgbWV0aG9kIG9uZSBkZWNsYXJlZCBhY3Rpb24gYmVjb21lczsgYW4gZW1wdHkgcmVxdWVzdCBtYXkgYmUgb21pdHRlZC4gKi9cbmV4cG9ydCB0eXBlIE9wZXJhdGlvbk1ldGhvZDxPcCBleHRlbmRzIE9wZXJhdGlvblNoYXBlPiA9XG5cdC8vIGJpb21lLWlnbm9yZSBsaW50L2NvbXBsZXhpdHkvbm9CYW5uZWRUeXBlczogYHt9YCBpcyB0aGUgdGVzdCBmb3IgXCJub3RoaW5nIHJlcXVpcmVkXCJcblx0e30gZXh0ZW5kcyBPcFtcInJlcXVlc3RcIl1cblx0XHQ/IChcblx0XHRcdFx0cmVxdWVzdD86IE9wW1wicmVxdWVzdFwiXSxcblx0XHRcdFx0b3B0aW9ucz86IEludm9rZU9wdGlvbnMsXG5cdFx0XHQpID0+IFByb21pc2U8T3BbXCJyZXN1bHRcIl0+XG5cdFx0OiAoXG5cdFx0XHRcdHJlcXVlc3Q6IE9wW1wicmVxdWVzdFwiXSxcblx0XHRcdFx0b3B0aW9ucz86IEludm9rZU9wdGlvbnMsXG5cdFx0XHQpID0+IFByb21pc2U8T3BbXCJyZXN1bHRcIl0+O1xuXG4vKiogVGhlIG1ldGhvZCBvbmUgZGVjbGFyZWQgc3RyZWFtIGJlY29tZXMuICovXG5leHBvcnQgdHlwZSBTdHJlYW1NZXRob2Q8U3QgZXh0ZW5kcyBTdHJlYW1TaGFwZT4gPSAoXG5cdHJlcXVlc3Q6IFN0W1wicmVxdWVzdFwiXSxcblx0aGFuZGxlcnM6IFN0cmVhbUhhbmRsZXJzPFN0W1wiZXZlbnRcIl0+LFxuXHRvcHRpb25zPzogSW52b2tlT3B0aW9ucyxcbikgPT4gUHJvbWlzZTxTdHJlYW1IYW5kbGU+O1xuXG4vKipcbiAqIFRoZSBydW5uaW5nIHBhbGV0dGUsIHdoZW4gdGhlIGhhbmRzaGFrZSBjYXJyaWVkIG9uZSAoZGVjaXNpb24tMTYpOiB0aGVcbiAqIGBRUGFsZXR0ZWAgY29sb3VyIHJvbGVzIHRoZSBob3N0IHJlYWQsIGFzIENTUyBoZXggKGAjcnJnZ2JiYCBvclxuICogYCNycmdnYmJhYWApIGJ5IHRoZWlyIGNhbWVsLWNhc2VkIHJvbGUgbmFtZSwgYW5kIHdoZXRoZXIgdGhlIHdpbmRvdyBjb2xvdXJcbiAqIGlzIGRhcmsuIGBxZ2lzLXNkay11aWAgdHVybnMgaXQgaW50byB0aGUgYC0tcWdpcy1zZGstKmAgY3VzdG9tIHByb3BlcnRpZXM7XG4gKiBhIHBhZ2Ugb3V0c2lkZSBRR0lTIHNlZXMgYG51bGxgIGFuZCBrZWVwcyB0aGUgZG9jdW1lbnRlZCBkZWZhdWx0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRZ2lzU2RrSG9zdFRoZW1lIHtcblx0cmVhZG9ubHkgcGFsZXR0ZTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG5cdHJlYWRvbmx5IGRhcms6IGJvb2xlYW47XG59XG5cbi8qKiBXaGF0IHRoZSBoYW5kc2hha2UgdG9sZCB0aGlzIHBhZ2UgYWJvdXQgdGhlIGhvc3QgKGRlY2lzaW9uLTI3KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUWdpc1Nka0hvc3QgZXh0ZW5kcyBIb3N0T3BlcmF0aW9ucyB7XG5cdC8qKlxuXHQgKiBUaGUgaG9zdCBvcGVyYXRpb24gaWRzIHRoZSBoYW5kc2hha2UgYWR2ZXJ0aXNlZCBmb3IgdGhpcyB2aWV3OyBlbXB0eVxuXHQgKiB1bnRpbCB7QGxpbmsgUWdpc1Nka0NvcmUucmVhZHl9IGhhcyByZXNvbHZlZC5cblx0ICovXG5cdHJlYWRvbmx5IGdyYW50ZWQ6IHJlYWRvbmx5IEhvc3RPcGVyYXRpb25JZFtdO1xuXHQvKipcblx0ICogVGhlIGhvc3QncyBwYWxldHRlLCBgbnVsbGAgdW50aWwge0BsaW5rIFFnaXNTZGtDb3JlLnJlYWR5fSBoYXMgcmVzb2x2ZWRcblx0ICogYW5kIHdoZW4gdGhlIGhvc3Qgc2VudCBub25lLlxuXHQgKi9cblx0cmVhZG9ubHkgdGhlbWU6IFFnaXNTZGtIb3N0VGhlbWUgfCBudWxsO1xufVxuXG4vKiogVGhlIG1lbWJlcnMgZXZlcnkgYFFnaXNTZGtgIGhhcywgd2hhdGV2ZXIgaXRzIHNjaGVtYSBkZWNsYXJlcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUWdpc1Nka0NvcmU8TyA9IE9wZXJhdGlvbk1hcCwgUyA9IFN0cmVhbU1hcD4ge1xuXHQvKiogVGhlIHNjaGVtYSB0aGlzIGluc3RhbmNlIHdhcyBidWlsdCBmcm9tLiAqL1xuXHRyZWFkb25seSBzY2hlbWE6IEJyaWRnZVNjaGVtYTxPLCBTPjtcblx0LyoqIFRoZSBjbGllbnQgdW5kZXIgdGhlIG1ldGhvZHMsIGZvciB3aGF0IGEgbWV0aG9kIGRvZXMgbm90IGNvdmVyLiAqL1xuXHRyZWFkb25seSBjbGllbnQ6IEJyaWRnZUNsaWVudDtcblx0LyoqIFRoZSBjdXJhdGVkIGhvc3Qgc3VyZmFjZSwgYW5kIHdoYXQgdGhpcyB2aWV3IHdhcyBncmFudGVkIG9mIGl0LiAqL1xuXHRyZWFkb25seSBob3N0OiBRZ2lzU2RrSG9zdDtcblx0LyoqIFJlc29sdmVzIG9uY2UgdGhlIGhhbmRzaGFrZSBhbnN3ZXJlZDsgcmVqZWN0cyB3aGVuIHRoZSBob3N0IHJlZnVzZWQgaXQuICovXG5cdHJlYWRvbmx5IHJlYWR5OiBQcm9taXNlPHZvaWQ+O1xuXHQvKiogQ2xvc2UgYW4gb3duZWQgY2xpZW50OyBhIGNsaWVudCB0aGUgY2FsbGVyIHBhc3NlZCBpbiBpcyBsZWZ0IGFsb25lLiAqL1xuXHRjbG9zZSgpOiB2b2lkO1xufVxuXG4vKiogVGhlIGZpcnN0IHNlZ21lbnQgb2YgYSBkb3R0ZWQgaWQsIG9yIHRoZSB3aG9sZSBpZCB3aGVuIGl0IGhhcyBub25lLiAqL1xudHlwZSBIZWFkPEsgZXh0ZW5kcyBzdHJpbmc+ID0gSyBleHRlbmRzIGAke2luZmVyIEh9LiR7c3RyaW5nfWAgPyBIIDogSztcblxuLyoqIFRoZSBtZW1iZXJzIG9mIGBNYCB1bmRlciBvbmUgaGVhZCwga2V5ZWQgYnkgdGhlIHJlc3Qgb2YgdGhlaXIgaWRzLiAqL1xudHlwZSBVbmRlcjxNLCBIIGV4dGVuZHMgc3RyaW5nPiA9IHtcblx0W0sgaW4ga2V5b2YgTSAmIHN0cmluZyBhcyBLIGV4dGVuZHMgYCR7SH0uJHtpbmZlciBSZXN0fWBcblx0XHQ/IFJlc3Rcblx0XHQ6IG5ldmVyXTogTVtLXTtcbn07XG5cbi8qKlxuICogVGhlIGRlY2xhcmVkIGFjdGlvbnMgYXMgYSB0cmVlOiBhIHBsYWluIGlkIGlzIGEgbWV0aG9kLCBhIGRvdHRlZCBpZCBuZXN0c1xuICogb25lIG9iamVjdCBwZXIgc2VnbWVudC4gQW4gaWQgdGhhdCBpcyBib3RoIGEgbGVhZiBhbmQgYSBwcmVmaXggb2YgYW5vdGhlclxuICogaXMgcmVmdXNlZCBhdCBydW4gdGltZSwgc28gdGhlIHR5cGUgbmVlZCBub3Qgc2F5IHdoYXQgaXQgd291bGQgbWVhbi5cbiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0aW9uVHJlZTxPPiA9IHtcblx0cmVhZG9ubHkgW0ggaW4gSGVhZDxrZXlvZiBPICYgc3RyaW5nPl06IEggZXh0ZW5kcyBrZXlvZiBPXG5cdFx0PyBPW0hdIGV4dGVuZHMgT3BlcmF0aW9uU2hhcGVcblx0XHRcdD8gT3BlcmF0aW9uTWV0aG9kPE9bSF0+XG5cdFx0XHQ6IG5ldmVyXG5cdFx0OiBPcGVyYXRpb25UcmVlPFVuZGVyPE8sIEg+Pjtcbn07XG5cbi8qKiBUaGUgZGVjbGFyZWQgc3RyZWFtcyBhcyB0aGUgc2FtZSB0cmVlLCB3aXRoIGEgc3RyZWFtIG1ldGhvZCBhdCBlYWNoIGxlYWYuICovXG5leHBvcnQgdHlwZSBTdHJlYW1UcmVlPFM+ID0ge1xuXHRyZWFkb25seSBbSCBpbiBIZWFkPGtleW9mIFMgJiBzdHJpbmc+XTogSCBleHRlbmRzIGtleW9mIFNcblx0XHQ/IFNbSF0gZXh0ZW5kcyBTdHJlYW1TaGFwZVxuXHRcdFx0PyBTdHJlYW1NZXRob2Q8U1tIXT5cblx0XHRcdDogbmV2ZXJcblx0XHQ6IFN0cmVhbVRyZWU8VW5kZXI8UywgSD4+O1xufTtcblxuLyoqXG4gKiBBIHBhZ2UncyBoYW5kbGUgb24gUUdJUzogdGhlIGNvcmUsIHBsdXMgb25lIG1ldGhvZCBwZXIgZGVjbGFyZWQgb3BlcmF0aW9uXG4gKiBuZXN0ZWQgdW5kZXIgdGhlIHNlZ21lbnRzIG9mIGl0cyBpZC5cbiAqL1xuZXhwb3J0IHR5cGUgUWdpc1NkazxPID0gT3BlcmF0aW9uTWFwLCBTID0gU3RyZWFtTWFwPiA9IFFnaXNTZGtDb3JlPE8sIFM+ICZcblx0T3BlcmF0aW9uVHJlZTxPPiAmXG5cdFN0cmVhbVRyZWU8Uz47XG5cbi8qKiBOYW1lcyB7QGxpbmsgUWdpc1Nka0NvcmV9IGtlZXBzOyBhIGRlY2xhcmVkIGlkIG1heSBub3Qgc3RhcnQgd2l0aCBvbmUuICovXG5leHBvcnQgY29uc3QgUUdJU19TREtfTUVNQkVSUzogcmVhZG9ubHkgc3RyaW5nW10gPSBPYmplY3QuZnJlZXplKFtcblx0XCJjbGllbnRcIixcblx0XCJob3N0XCIsXG5cdFwic2NoZW1hXCIsXG5cdFwicmVhZHlcIixcblx0XCJjbG9zZVwiLFxuXSk7XG5cbmNvbnN0IEhPU1RfSURTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldDxzdHJpbmc+KEhPU1RfT1BFUkFUSU9OUyk7XG5cbi8qKiBUaGUgaGFuZHNoYWtlLCBhcyBmYXIgYXMgdGhpcyBtb2R1bGUgcmVhZHMgaXQuICovXG5pbnRlcmZhY2UgSGFuZHNoYWtlIHtcblx0cmVhZG9ubHkgb3BlcmF0aW9uczogcmVhZG9ubHkgc3RyaW5nW107XG5cdHJlYWRvbmx5IGdyYW50ZWQ6IHJlYWRvbmx5IEhvc3RPcGVyYXRpb25JZFtdO1xuXHRyZWFkb25seSB0aGVtZTogUWdpc1Nka0hvc3RUaGVtZSB8IG51bGw7XG59XG5cbmZ1bmN0aW9uIHBhcnNlSGFuZHNoYWtlKHZhbHVlOiB1bmtub3duKTogSGFuZHNoYWtlIHtcblx0aWYgKCFpc1BsYWluUmVjb3JkKHZhbHVlKSB8fCAhQXJyYXkuaXNBcnJheSh2YWx1ZS5vcGVyYXRpb25zKSkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlUHJvdG9jb2xFcnJvcihcblx0XHRcdFwiVGhlIGhhbmRzaGFrZSByZXBseSBjYXJyaWVzIG5vIG9wZXJhdGlvbnMgbGlzdFwiLFxuXHRcdCk7XG5cdH1cblx0Y29uc3Qgb3BlcmF0aW9uczogc3RyaW5nW10gPSBbXTtcblx0Zm9yIChjb25zdCBvcGVyYXRpb24gb2YgdmFsdWUub3BlcmF0aW9ucykge1xuXHRcdGlmIChpc1BsYWluUmVjb3JkKG9wZXJhdGlvbikgJiYgdHlwZW9mIG9wZXJhdGlvbi5pZCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0b3BlcmF0aW9ucy5wdXNoKG9wZXJhdGlvbi5pZCk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB7XG5cdFx0b3BlcmF0aW9ucyxcblx0XHRncmFudGVkOiBPYmplY3QuZnJlZXplKFxuXHRcdFx0b3BlcmF0aW9ucy5maWx0ZXIoKGlkKTogaWQgaXMgSG9zdE9wZXJhdGlvbklkID0+IEhPU1RfSURTLmhhcyhpZCkpLFxuXHRcdCksXG5cdFx0dGhlbWU6IHBhcnNlVGhlbWUodmFsdWUudGhlbWUpLFxuXHR9O1xufVxuXG4vKipcbiAqIFRoZSBgdGhlbWVgIG9mIGEgaGFuZHNoYWtlLCBvciBgbnVsbGAgd2hlbiBhYnNlbnQgb3IgbWFsZm9ybWVkOiBhIHBhbGV0dGVcbiAqIHRoYXQgY2Fubm90IGJlIHJlYWQgaXMgbm8gcmVhc29uIHRvIHJlZnVzZSB0aGUgaG9zdCwgdGhlIHBhZ2UganVzdCBrZWVwc1xuICogaXRzIGRlZmF1bHRzLiBPbmx5IHN0cmluZyBjb2xvdXJzIGFyZSBrZXB0LlxuICovXG5mdW5jdGlvbiBwYXJzZVRoZW1lKHZhbHVlOiB1bmtub3duKTogUWdpc1Nka0hvc3RUaGVtZSB8IG51bGwge1xuXHRpZiAoIWlzUGxhaW5SZWNvcmQodmFsdWUpIHx8ICFpc1BsYWluUmVjb3JkKHZhbHVlLnBhbGV0dGUpKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblx0Y29uc3QgcGFsZXR0ZTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXHRmb3IgKGNvbnN0IFtyb2xlLCBjb2xvdXJdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlLnBhbGV0dGUpKSB7XG5cdFx0aWYgKHR5cGVvZiBjb2xvdXIgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdHBhbGV0dGVbcm9sZV0gPSBjb2xvdXI7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBPYmplY3QuZnJlZXplKHtcblx0XHRwYWxldHRlOiBPYmplY3QuZnJlZXplKHBhbGV0dGUpLFxuXHRcdGRhcms6IHZhbHVlLmRhcmsgPT09IHRydWUsXG5cdH0pO1xufVxuXG5mdW5jdGlvbiB1bndyYXBSZXF1ZXN0KFxuXHRvcGVyYXRpb246IHN0cmluZyxcblx0cmVxdWVzdDogdW5rbm93bixcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcblx0aWYgKHJlcXVlc3QgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiB7fTtcblx0fVxuXHRpZiAoIWlzUGxhaW5SZWNvcmQocmVxdWVzdCkpIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0NvbnRyYWN0RXJyb3Iob3BlcmF0aW9uLCBcInJlcXVlc3RcIiwgW1xuXHRcdFx0Li4udmFsaWRhdGVBZ2FpbnN0U2NoZW1hKHJlcXVlc3QsIHsgdHlwZTogXCJvYmplY3RcIiB9KSxcblx0XHRdKTtcblx0fVxuXHRyZXR1cm4gcmVxdWVzdDtcbn1cblxuZnVuY3Rpb24gY2hlY2tlZFJlcXVlc3QoXG5cdGRlc2NyaXB0aW9uOiBBY3Rpb25EZXNjcmlwdGlvbiB8IFN0cmVhbURlc2NyaXB0aW9uLFxuXHRyZXF1ZXN0OiB1bmtub3duLFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuXHRjb25zdCBwYXlsb2FkID0gdW53cmFwUmVxdWVzdChkZXNjcmlwdGlvbi5pZCwgcmVxdWVzdCk7XG5cdGNvbnN0IGlzc3VlcyA9IHZhbGlkYXRlQWdhaW5zdFNjaGVtYShwYXlsb2FkLCBkZXNjcmlwdGlvbi5yZXF1ZXN0KTtcblx0aWYgKGlzc3Vlcy5sZW5ndGggPiAwKSB7XG5cdFx0dGhyb3cgbmV3IFFnaXNTZGtDb250cmFjdEVycm9yKGRlc2NyaXB0aW9uLmlkLCBcInJlcXVlc3RcIiwgaXNzdWVzKTtcblx0fVxuXHRyZXR1cm4gcGF5bG9hZDtcbn1cblxuZnVuY3Rpb24gb3BlcmF0aW9uTWV0aG9kKFxuXHRjbGllbnQ6IEJyaWRnZUNsaWVudCxcblx0YWN0aW9uOiBBY3Rpb25EZXNjcmlwdGlvbixcbik6IChyZXF1ZXN0PzogdW5rbm93biwgb3B0aW9ucz86IEludm9rZU9wdGlvbnMpID0+IFByb21pc2U8dW5rbm93bj4ge1xuXHRyZXR1cm4gYXN5bmMgKHJlcXVlc3QsIG9wdGlvbnMpID0+IHtcblx0XHRjb25zdCBwYXlsb2FkID0gY2hlY2tlZFJlcXVlc3QoYWN0aW9uLCByZXF1ZXN0KTtcblx0XHRjb25zdCB2YWx1ZSA9IGF3YWl0IGNsaWVudC5pbnZva2UoYWN0aW9uLmlkLCBwYXlsb2FkLCBvcHRpb25zKTtcblx0XHRjb25zdCBpc3N1ZXMgPSB2YWxpZGF0ZUFnYWluc3RTY2hlbWEodmFsdWUsIGFjdGlvbi5yZXN1bHQsIHtcblx0XHRcdGFsbG93VW5rbm93bjogdHJ1ZSxcblx0XHR9KTtcblx0XHRpZiAoaXNzdWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdHRocm93IG5ldyBRZ2lzU2RrQ29udHJhY3RFcnJvcihhY3Rpb24uaWQsIFwicmVzdWx0XCIsIGlzc3Vlcyk7XG5cdFx0fVxuXHRcdHJldHVybiB2YWx1ZTtcblx0fTtcbn1cblxuZnVuY3Rpb24gc3RyZWFtTWV0aG9kKFxuXHRjbGllbnQ6IEJyaWRnZUNsaWVudCxcblx0c3RyZWFtOiBTdHJlYW1EZXNjcmlwdGlvbixcbik6IChcblx0cmVxdWVzdDogdW5rbm93bixcblx0aGFuZGxlcnM6IFN0cmVhbUhhbmRsZXJzPHVua25vd24+LFxuXHRvcHRpb25zPzogSW52b2tlT3B0aW9ucyxcbikgPT4gUHJvbWlzZTxTdHJlYW1IYW5kbGU+IHtcblx0cmV0dXJuIGFzeW5jIChyZXF1ZXN0LCBoYW5kbGVycywgb3B0aW9ucykgPT4ge1xuXHRcdGNvbnN0IHBheWxvYWQgPSBjaGVja2VkUmVxdWVzdChzdHJlYW0sIHJlcXVlc3QpO1xuXHRcdC8vIFRoZSB0eXBlZCBzdHJlYW0gZW5kcyBleGFjdGx5IG9uY2UsIGxpa2UgdGhlIHN1YnNjcmlwdGlvbiB1bmRlciBpdDogYVxuXHRcdC8vIGNvbnRyYWN0IHZpb2xhdGlvbiBlbmRzIGl0IGhlcmUsIGNsb3NlcyB0aGUgc3Vic2NyaXB0aW9uLCBhbmQgdGhlXG5cdFx0Ly8gYGRpc3Bvc2VkYCB0aGUgY2xpZW50IHRoZW4gcmVwb3J0cyBpcyBub3QgZGVsaXZlcmVkIGEgc2Vjb25kIHRpbWUuXG5cdFx0bGV0IGVuZGVkID0gZmFsc2U7XG5cdFx0bGV0IHZpb2xhdGVkID0gZmFsc2U7XG5cdFx0bGV0IGhhbmRsZTogU3RyZWFtSGFuZGxlIHwgbnVsbCA9IG51bGw7XG5cdFx0Y29uc3QgZW5kID0gKHRlcm1pbmFsOiBCcmlkZ2VTdHJlYW1UZXJtaW5hbCk6IHZvaWQgPT4ge1xuXHRcdFx0aWYgKGVuZGVkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGVuZGVkID0gdHJ1ZTtcblx0XHRcdGhhbmRsZXJzLm9uVGVybWluYWw/Lih0ZXJtaW5hbCk7XG5cdFx0fTtcblx0XHRoYW5kbGUgPSBhd2FpdCBjbGllbnQuc3Vic2NyaWJlKFxuXHRcdFx0c3RyZWFtLmlkLFxuXHRcdFx0cGF5bG9hZCxcblx0XHRcdHtcblx0XHRcdFx0b25FdmVudDogKGV2ZW50KSA9PiB7XG5cdFx0XHRcdFx0aWYgKGVuZGVkKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IGRlY2xhcmVkID0gc3RyZWFtLmV2ZW50c1tldmVudC5raW5kXTtcblx0XHRcdFx0XHRjb25zdCBpc3N1ZXMgPVxuXHRcdFx0XHRcdFx0ZGVjbGFyZWQgPT09IHVuZGVmaW5lZFxuXHRcdFx0XHRcdFx0XHQ/IHVuZGVmaW5lZFxuXHRcdFx0XHRcdFx0XHQ6IHZhbGlkYXRlQWdhaW5zdFNjaGVtYShldmVudC5wYXlsb2FkLCBkZWNsYXJlZCwge1xuXHRcdFx0XHRcdFx0XHRcdFx0YWxsb3dVbmtub3duOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0cGF0aDogW1wicGF5bG9hZFwiXSxcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRpZiAoaXNzdWVzICE9PSB1bmRlZmluZWQgJiYgaXNzdWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0aGFuZGxlcnMub25FdmVudD8uKGV2ZW50KTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgZXJyb3IgPSBuZXcgUWdpc1Nka0NvbnRyYWN0RXJyb3IoXG5cdFx0XHRcdFx0XHRzdHJlYW0uaWQsXG5cdFx0XHRcdFx0XHRcImV2ZW50XCIsXG5cdFx0XHRcdFx0XHRpc3N1ZXMgPz8gW10sXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRlbmQoeyBraW5kOiBcImVycm9yXCIsIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfSk7XG5cdFx0XHRcdFx0aWYgKGhhbmRsZSA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0dmlvbGF0ZWQgPSB0cnVlO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRoYW5kbGUuY2xvc2UoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdG9uVGVybWluYWw6IGVuZCxcblx0XHRcdH0sXG5cdFx0XHRvcHRpb25zLFxuXHRcdCk7XG5cdFx0aWYgKHZpb2xhdGVkKSB7XG5cdFx0XHRoYW5kbGUuY2xvc2UoKTtcblx0XHR9XG5cdFx0cmV0dXJuIGhhbmRsZTtcblx0fTtcbn1cblxuZnVuY3Rpb24gYnVpbGRIb3N0KFxuXHRjbGllbnQ6IEJyaWRnZUNsaWVudCxcblx0aGFuZHNoYWtlOiAoKSA9PiBIYW5kc2hha2UgfCBudWxsLFxuKTogUWdpc1Nka0hvc3Qge1xuXHRjb25zdCBob3N0ID0gY3JlYXRlSG9zdChjbGllbnQpO1xuXHRyZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG5cdFx0Li4uaG9zdCxcblx0XHRnZXQgZ3JhbnRlZCgpOiByZWFkb25seSBIb3N0T3BlcmF0aW9uSWRbXSB7XG5cdFx0XHRyZXR1cm4gZ3JhbnRlZChoYW5kc2hha2UoKSk7XG5cdFx0fSxcblx0XHRnZXQgdGhlbWUoKTogUWdpc1Nka0hvc3RUaGVtZSB8IG51bGwge1xuXHRcdFx0cmV0dXJuIGhhbmRzaGFrZSgpPy50aGVtZSA/PyBudWxsO1xuXHRcdH0sXG5cdH0pO1xufVxuXG5jb25zdCBOT19HUkFOVFM6IHJlYWRvbmx5IEhvc3RPcGVyYXRpb25JZFtdID0gT2JqZWN0LmZyZWV6ZShbXSk7XG5cbmZ1bmN0aW9uIGdyYW50ZWQoaGFuZHNoYWtlOiBIYW5kc2hha2UgfCBudWxsKTogcmVhZG9ubHkgSG9zdE9wZXJhdGlvbklkW10ge1xuXHRyZXR1cm4gaGFuZHNoYWtlID09PSBudWxsID8gTk9fR1JBTlRTIDogaGFuZHNoYWtlLmdyYW50ZWQ7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkPE8sIFM+KFxuXHRzY2hlbWE6IEJyaWRnZVNjaGVtYTxPLCBTPixcblx0b3B0aW9uczogUWdpc1Nka09wdGlvbnMsXG4pOiBRZ2lzU2RrPE8sIFM+IHtcblx0aWYgKG9wdGlvbnMuY2xpZW50ICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy50cmFuc3BvcnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrRGVjbGFyYXRpb25FcnJvcihcblx0XHRcdFwiUWdpc1Nkay5mcm9tQnJpZGdlU2NoZW1hIHRha2VzIGEgY2xpZW50IG9yIGEgdHJhbnNwb3J0LCBub3QgYm90aFwiLFxuXHRcdCk7XG5cdH1cblx0Y29uc3Qgb3duZWQgPSBvcHRpb25zLmNsaWVudCA9PT0gdW5kZWZpbmVkO1xuXHRjb25zdCB0cmFuc3BvcnQgPVxuXHRcdG9wdGlvbnMudHJhbnNwb3J0ID8/XG5cdFx0KG9wdGlvbnMuY2xpZW50ID09PSB1bmRlZmluZWRcblx0XHRcdD8gY3JlYXRlV2ViQ2hhbm5lbFRyYW5zcG9ydChvcHRpb25zLmNoYW5uZWxPYmplY3QgPz8gXCJicmlkZ2VcIilcblx0XHRcdDogdW5kZWZpbmVkKTtcblx0Y29uc3QgY2xpZW50ID1cblx0XHRvcHRpb25zLmNsaWVudCA/P1xuXHRcdG5ldyBCcmlkZ2VDbGllbnQoXG5cdFx0XHR0cmFuc3BvcnQgYXMgV2lyZVRyYW5zcG9ydCxcblx0XHRcdG9wdGlvbnMudGltZW91dE1zID09PSB1bmRlZmluZWQgPyB7fSA6IHsgdGltZW91dE1zOiBvcHRpb25zLnRpbWVvdXRNcyB9LFxuXHRcdCk7XG5cdGxldCBoYW5kc2hha2U6IEhhbmRzaGFrZSB8IG51bGwgPSBudWxsO1xuXHRjb25zdCByZWFkeSA9IGNsaWVudC5oYW5kc2hha2UoKS50aGVuKCh2YWx1ZSkgPT4ge1xuXHRcdGhhbmRzaGFrZSA9IHBhcnNlSGFuZHNoYWtlKHZhbHVlKTtcblx0fSk7XG5cdC8vIEEgcGFnZSB0aGF0IG5ldmVyIGF3YWl0cyBgcmVhZHlgIHN0aWxsIHNlZXMgZXZlcnkgY2FsbCBmYWlsIG9uIGl0cyBvd247XG5cdC8vIHRoZSByZWplY3Rpb24gaXMgbm90IGxlZnQgdW5vYnNlcnZlZCBvbiB0b3Agb2YgdGhhdC5cblx0cmVhZHkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcblx0Y29uc3QgbWVtYmVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG5cdFx0c2NoZW1hLFxuXHRcdGNsaWVudCxcblx0XHRob3N0OiBidWlsZEhvc3QoY2xpZW50LCAoKSA9PiBoYW5kc2hha2UpLFxuXHRcdHJlYWR5LFxuXHRcdGNsb3NlOiAoKTogdm9pZCA9PiB7XG5cdFx0XHRpZiAob3duZWQpIHtcblx0XHRcdFx0Y2xpZW50LmNsb3NlKCk7XG5cdFx0XHR9XG5cdFx0fSxcblx0fTtcblx0Y29uc3QgbmFtZXNwYWNlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xuXHRmb3IgKGNvbnN0IGFjdGlvbiBvZiBzY2hlbWEuYWN0aW9ucykge1xuXHRcdHBsYWNlKG1lbWJlcnMsIG5hbWVzcGFjZXMsIGFjdGlvbi5pZCwgb3BlcmF0aW9uTWV0aG9kKGNsaWVudCwgYWN0aW9uKSk7XG5cdH1cblx0Zm9yIChjb25zdCBzdHJlYW0gb2Ygc2NoZW1hLnN0cmVhbXMpIHtcblx0XHRwbGFjZShtZW1iZXJzLCBuYW1lc3BhY2VzLCBzdHJlYW0uaWQsIHN0cmVhbU1ldGhvZChjbGllbnQsIHN0cmVhbSkpO1xuXHR9XG5cdGZvciAoY29uc3QgbmFtZXNwYWNlIG9mIG5hbWVzcGFjZXMpIHtcblx0XHRPYmplY3QuZnJlZXplKG5hbWVzcGFjZSk7XG5cdH1cblx0cmV0dXJuIE9iamVjdC5mcmVlemUobWVtYmVycykgYXMgdW5rbm93biBhcyBRZ2lzU2RrPE8sIFM+O1xufVxuXG4vKipcbiAqIFB1dCBvbmUgbWV0aG9kIHdoZXJlIGl0cyBpZCBzYXlzOiBgYS5iLmNgIGJlY29tZXMgYG1lbWJlcnMuYS5iLmNgLCBidWlsZGluZ1xuICogdGhlIG9iamVjdHMgb24gdGhlIHdheS4gVHdvIGlkcyBjYW5ub3QgYm90aCBiZSBob25lc3Qgd2hlbiBvbmUgaXMgYSBwcmVmaXhcbiAqIG9mIHRoZSBvdGhlciAtIGBzaXRlc2AgY2Fubm90IGJlIGEgbWV0aG9kIGFuZCBob2xkIGBzaXRlcy5zdW1tYXJ5YCAtIGFuZCBhXG4gKiBmaXJzdCBzZWdtZW50IHRoYXQgaXMgYSBjb3JlIG1lbWJlciB3b3VsZCBoaWRlIGl0LCBzbyBib3RoIGFyZSByZWZ1c2VkLlxuICovXG5mdW5jdGlvbiBwbGFjZShcblx0bWVtYmVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdG5hbWVzcGFjZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10sXG5cdGlkOiBzdHJpbmcsXG5cdG1ldGhvZDogdW5rbm93bixcbik6IHZvaWQge1xuXHRjb25zdCBzZWdtZW50cyA9IGlkLnNwbGl0KFwiLlwiKTtcblx0aWYgKHNlZ21lbnRzLnNvbWUoKHNlZ21lbnQpID0+IHNlZ21lbnQgPT09IFwiXCIpKSB7XG5cdFx0dGhyb3cgbmV3IFFnaXNTZGtEZWNsYXJhdGlvbkVycm9yKFxuXHRcdFx0YCR7aWR9OiBhbiBvcGVyYXRpb24gaWQgbWF5IG5vdCBoYXZlIGFuIGVtcHR5IHNlZ21lbnRgLFxuXHRcdCk7XG5cdH1cblx0Y29uc3QgaGVhZCA9IHNlZ21lbnRzWzBdIGFzIHN0cmluZztcblx0aWYgKFFHSVNfU0RLX01FTUJFUlMuaW5jbHVkZXMoaGVhZCkpIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0RlY2xhcmF0aW9uRXJyb3IoXG5cdFx0XHRgJHtpZH06IGFuIG9wZXJhdGlvbiBpZCBtYXkgbm90IHN0YXJ0IHdpdGggYSBRZ2lzU2RrIG1lbWJlciAoJHtRR0lTX1NES19NRU1CRVJTLmpvaW4oXCIsIFwiKX0pYCxcblx0XHQpO1xuXHR9XG5cdGxldCBub2RlID0gbWVtYmVycztcblx0Zm9yIChjb25zdCBbaW5kZXgsIHNlZ21lbnRdIG9mIHNlZ21lbnRzLmVudHJpZXMoKSkge1xuXHRcdGNvbnN0IHByZWZpeCA9IHNlZ21lbnRzLnNsaWNlKDAsIGluZGV4ICsgMSkuam9pbihcIi5cIik7XG5cdFx0Y29uc3QgZXhpc3RpbmcgPSBub2RlW3NlZ21lbnRdO1xuXHRcdGlmIChpbmRleCA9PT0gc2VnbWVudHMubGVuZ3RoIC0gMSkge1xuXHRcdFx0aWYgKGV4aXN0aW5nICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFFnaXNTZGtEZWNsYXJhdGlvbkVycm9yKFxuXHRcdFx0XHRcdHR5cGVvZiBleGlzdGluZyA9PT0gXCJmdW5jdGlvblwiXG5cdFx0XHRcdFx0XHQ/IGAke2lkfTogZHVwbGljYXRlIG9wZXJhdGlvbiBpZGBcblx0XHRcdFx0XHRcdDogYCR7aWR9OiBhbiBvcGVyYXRpb24gaWQgbWF5IG5vdCBiZSBhIHByZWZpeCBvZiBhbm90aGVyIGRlY2xhcmVkIGlkYCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdG5vZGVbc2VnbWVudF0gPSBtZXRob2Q7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChleGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBuYW1lc3BhY2U6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cdFx0XHRuYW1lc3BhY2VzLnB1c2gobmFtZXNwYWNlKTtcblx0XHRcdG5vZGVbc2VnbWVudF0gPSBuYW1lc3BhY2U7XG5cdFx0XHRub2RlID0gbmFtZXNwYWNlO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIGV4aXN0aW5nID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdHRocm93IG5ldyBRZ2lzU2RrRGVjbGFyYXRpb25FcnJvcihcblx0XHRcdFx0YCR7aWR9OiAke3ByZWZpeH0gaXMgYWxyZWFkeSBhbiBvcGVyYXRpb24gaWQ7IGFuIGlkIG1heSBub3QgZXh0ZW5kIGFub3RoZXJgLFxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bm9kZSA9IGV4aXN0aW5nIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIFRoZSBlbnRyeSBwb2ludDogYFFnaXNTZGsuZnJvbUJyaWRnZVNjaGVtYShzY2hlbWEpYC5cbiAqXG4gKiBBIG5hbWVzcGFjZSByYXRoZXIgdGhhbiBhIGNvbnN0YW50IHNvIHRoZSB2YWx1ZSBhbmQgdGhlIGluc3RhbmNlIHR5cGUgc2hhcmVcbiAqIG9uZSBuYW1lIHRocm91Z2ggZXZlcnkgZGVjbGFyYXRpb24gYnVuZGxlci5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBRZ2lzU2RrIHtcblx0LyoqXG5cdCAqIEJ1aWxkIGEgYFFnaXNTZGtgIG9uIGEgZ2VuZXJhdGVkIHNjaGVtYS5cblx0ICpcblx0ICogV2l0aG91dCBvcHRpb25zIGl0IGNvbm5lY3RzIHRvIHRoZSBwYWdlJ3MgUVdlYkNoYW5uZWwgb2JqZWN0IG5hbWVkXG5cdCAqIFwiYnJpZGdlXCIsIHdoaWNoIGlzIHdoYXQgdGhlIFB5dGhvbiBydW50aW1lIHJlZ2lzdGVyczsgYSB0ZXN0IHBhc3NlcyB0aGVcblx0ICogaGFybmVzcyBmcm9tIGBAYXJjaG9udDU2MS9xZ2lzLXNkay90ZXN0aW5nYCBhcyBgdHJhbnNwb3J0YCBpbnN0ZWFkLlxuXHQgKi9cblx0ZXhwb3J0IGZ1bmN0aW9uIGZyb21CcmlkZ2VTY2hlbWE8XG5cdFx0TyBleHRlbmRzIFJlY29yZDxrZXlvZiBPLCBPcGVyYXRpb25TaGFwZT4sXG5cdFx0UyBleHRlbmRzIFJlY29yZDxrZXlvZiBTLCBTdHJlYW1TaGFwZT4sXG5cdD4oc2NoZW1hOiBCcmlkZ2VTY2hlbWE8TywgUz4sIG9wdGlvbnM6IFFnaXNTZGtPcHRpb25zID0ge30pOiBRZ2lzU2RrPE8sIFM+IHtcblx0XHRyZXR1cm4gYnVpbGQoc2NoZW1hLCBvcHRpb25zKTtcblx0fVxufVxuIiwKICAgICIvKipcbiAqIFRoZSBicmlkZ2Ugc2NoZW1hOiBhIHBsdWdpbiBkZXNjcmlwdGlvbiB0aGF0IGFsc28gY2FycmllcyBpdHMgdHlwZXMuXG4gKlxuICogYHFnaXMtc2RrIGJyaWRnZSBnZW5lcmF0ZWAgd3JpdGVzIG9uZSBgYnJpZGdlLnNjaGVtYS50c2AgcGVyIHBsdWdpblxuICogKGRlY2lzaW9uLTQ0KS4gVGhhdCBtb2R1bGUgaGFzIG5vIGNvZGUgb2YgaXRzIG93bjogaXQgZGVjbGFyZXMgdGhlIHZhbHVlXG4gKiBpbnRlcmZhY2VzLCB0d28gbWFwcyAtIGBPcGVyYXRpb25zYCBhbmQgYFN0cmVhbXNgLCBrZXllZCBieSBvcGVyYXRpb24gaWQgLVxuICogYW5kIGVuZHMgaW4gYGRlZmluZUJyaWRnZVNjaGVtYTxPcGVyYXRpb25zLCBTdHJlYW1zPih7IC4uLmRlc2NyaXB0aW9uIH0pYC5cbiAqIFRoZSB0d28gdHlwZSBwYXJhbWV0ZXJzIG5ldmVyIGV4aXN0IGF0IHJ1biB0aW1lOyB0aGV5IHJpZGUgb24gdGhlIHJldHVybmVkXG4gKiBvYmplY3Qgc28gYFFnaXNTZGsuZnJvbUJyaWRnZVNjaGVtYShzY2hlbWEpYCBjYW4gaW5mZXIgdGhlbSwgYW5kIHRoZVxuICogZGVzY3JpcHRpb24gaXRzZWxmIGlzIHdoYXQgdGhlIFNESyB2YWxpZGF0ZXMgYWdhaW5zdC5cbiAqL1xuXG5pbXBvcnQgeyB0eXBlIFBsdWdpbkRlc2NyaXB0aW9uLCBwYXJzZVBsdWdpbkRlc2NyaXB0aW9uIH0gZnJvbSBcIi4vZGVjbGFyYXRpb25zXCI7XG5cbi8qKiBXaGF0IG9uZSBkZWNsYXJlZCBhY3Rpb24gcHJvbWlzZXM6IGFuIG9iamVjdCBpbiwgYSB2YWx1ZSBvdXQuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZXJhdGlvblNoYXBlIHtcblx0cmVhZG9ubHkgcmVxdWVzdDogb2JqZWN0O1xuXHRyZWFkb25seSByZXN1bHQ6IHVua25vd247XG59XG5cbi8qKiBXaGF0IG9uZSBkZWNsYXJlZCBzdHJlYW0gcHJvbWlzZXM6IGFuIG9iamVjdCBpbiwgZGlzY3JpbWluYXRlZCBldmVudHMgb3V0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHJlYW1TaGFwZSB7XG5cdHJlYWRvbmx5IHJlcXVlc3Q6IG9iamVjdDtcblx0cmVhZG9ubHkgZXZlbnQ6IHsgcmVhZG9ubHkga2luZDogc3RyaW5nOyByZWFkb25seSBwYXlsb2FkOiB1bmtub3duIH07XG59XG5cbi8qKiBUaGUgZGVmYXVsdCwgdW50eXBlZCBtYXA6IGFueSBpZCwgYW55IHNoYXBlLiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0aW9uTWFwID0geyByZWFkb25seSBbaWQ6IHN0cmluZ106IE9wZXJhdGlvblNoYXBlIH07XG5cbi8qKiBUaGUgZGVmYXVsdCwgdW50eXBlZCBtYXA6IGFueSBpZCwgYW55IHNoYXBlLiAqL1xuZXhwb3J0IHR5cGUgU3RyZWFtTWFwID0geyByZWFkb25seSBbaWQ6IHN0cmluZ106IFN0cmVhbVNoYXBlIH07XG5cbi8qKlxuICogQSBwYXJzZWQgcGx1Z2luIGRlc2NyaXB0aW9uIGNhcnJ5aW5nIGl0cyBgT3BlcmF0aW9uc2AgYW5kIGBTdHJlYW1zYCB0eXBlcy5cbiAqXG4gKiBUaGUgYFwifnR5cGVzXCJgIG1lbWJlciBpcyBjb21waWxlLXRpbWUgb25seTogaXQgaXMgbmV2ZXIgc2V0LCBhbmQgYSBzY2hlbWEgaXNcbiAqIGEgZnJvemVuIHtAbGluayBQbHVnaW5EZXNjcmlwdGlvbn0gYW5kIG5vdGhpbmcgbW9yZSBhdCBydW4gdGltZS4gSXQgaXMgYVxuICogc3RyaW5nIGtleSwgbm90IGEgdW5pcXVlIHN5bWJvbCwgc28gdGhlIHR5cGUgc3RheXMgc3RydWN0dXJhbGx5IHRoZSBzYW1lXG4gKiBhY3Jvc3MgdGhlIHBhY2thZ2UncyBlbnRyeSBwb2ludHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJpZGdlU2NoZW1hPE8gPSBPcGVyYXRpb25NYXAsIFMgPSBTdHJlYW1NYXA+XG5cdGV4dGVuZHMgUGx1Z2luRGVzY3JpcHRpb24ge1xuXHRyZWFkb25seSBcIn50eXBlc1wiPzoge1xuXHRcdHJlYWRvbmx5IG9wZXJhdGlvbnM6IE87XG5cdFx0cmVhZG9ubHkgc3RyZWFtczogUztcblx0fTtcbn1cblxuLyoqIFRoZSBgT3BlcmF0aW9uc2AgbWFwIGEgc2NoZW1hIGNhcnJpZXMuICovXG5leHBvcnQgdHlwZSBPcGVyYXRpb25zT2Y8U2NoZW1hPiA9XG5cdFNjaGVtYSBleHRlbmRzIEJyaWRnZVNjaGVtYTxpbmZlciBPLCB1bmtub3duPiA/IE8gOiBuZXZlcjtcblxuLyoqIFRoZSBgU3RyZWFtc2AgbWFwIGEgc2NoZW1hIGNhcnJpZXMuICovXG5leHBvcnQgdHlwZSBTdHJlYW1zT2Y8U2NoZW1hPiA9XG5cdFNjaGVtYSBleHRlbmRzIEJyaWRnZVNjaGVtYTx1bmtub3duLCBpbmZlciBTPiA/IFMgOiBuZXZlcjtcblxuLyoqXG4gKiBQYXJzZSBhIGRlc2NyaXB0aW9uIGFuZCB0eXBlIGl0OyB0aGUgZ2VuZXJhdGVkIG1vZHVsZSBpcyB0aGUgb25seSBjYWxsZXIuXG4gKlxuICogVGhlIGRlc2NyaXB0aW9uIGlzIGNoZWNrZWQgdGhlIHdheSBhbnkgZGVzY3JpcHRpb24gaXMgKGBzY2hlbWFfdmVyc2lvbmAsXG4gKiBpZHMsIGhhbmRsZXJzLCBkZWNsYXJlZCBzdHJlYW1zKSwgc28gYSBoYW5kLWVkaXRlZCBvciBzdGFsZSBtb2R1bGUgZmFpbHNcbiAqIGhlcmUsIGF0IGltcG9ydCwgcmF0aGVyIHRoYW4gb24gdGhlIGZpcnN0IGNhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVCcmlkZ2VTY2hlbWE8XG5cdE8gZXh0ZW5kcyBSZWNvcmQ8a2V5b2YgTywgT3BlcmF0aW9uU2hhcGU+LFxuXHRTIGV4dGVuZHMgUmVjb3JkPGtleW9mIFMsIFN0cmVhbVNoYXBlPixcbj4oaW5wdXQ6IHN0cmluZyB8IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pik6IEJyaWRnZVNjaGVtYTxPLCBTPiB7XG5cdHJldHVybiBwYXJzZVBsdWdpbkRlc2NyaXB0aW9uKGlucHV0KSBhcyBCcmlkZ2VT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Q25FO0FBQUEsRUFDQSxXQUFXLGFBQWEsWUFBWTtBQUFBLElBQ25DLE9BQU8sT0FBTyxTQUFTO0FBQUEsRUFDeEI7QUFBQSxFQUNBLE9BQU8sT0FBTyxPQUFPLE9BQU87QUFBQTtBQVM3QixTQUFTLEtBQUssQ0FDYixTQUNBLFlBQ0EsSUFDQSxRQUNPO0FBQUEsRUFDUCxNQUFNLFdBQVcsR0FBRyxNQUFNLEdBQUc7QUFBQSxFQUM3QixJQUFJLFNBQVMsS0FBSyxDQUFDLFlBQVksWUFBWSxFQUFFLEdBQUc7QUFBQSxJQUMvQyxNQUFNLElBQUkseUJBQ1QsR0FBRyxtREFDSjtBQUFBLEVBQ0Q7QUFBQSxFQUNBLE1BQU0sT0FBTyxTQUFTO0FBQUEsRUFDdEIsSUFBSSxpQkFBaUIsU0FBUyxJQUFJLEdBQUc7QUFBQSxJQUNwQyxNQUFNLElBQUkseUJBQ1QsR0FBRyw0REFBNEQsaUJBQWlCLEtBQUssSUFBSSxJQUMxRjtBQUFBLEVBQ0Q7QUFBQSxFQUNBLElBQUksT0FBTztBQUFBLEVBQ1gsWUFBWSxPQUFPLFlBQVksU0FBUyxRQUFRLEdBQUc7QUFBQSxJQUNsRCxNQUFNLFNBQVMsU0FBUyxNQUFNLEdBQUcsUUFBUSxDQUFDLEVBQUUsS0FBSyxHQUFHO0FBQUEsSUFDcEQsTUFBTSxXQUFXLEtBQUs7QUFBQSxJQUN0QixJQUFJLFVBQVUsU0FBUyxTQUFTLEdBQUc7QUFBQSxNQUNsQyxJQUFJLGFBQWEsV0FBVztBQUFBLFFBQzNCLE1BQU0sSUFBSSx5QkFDVCxPQUFPLGFBQWEsYUFDakIsR0FBRywrQkFDSCxHQUFHLGdFQUNQO0FBQUEsTUFDRDtBQUFBLE1BQ0EsS0FBSyxXQUFXO0FBQUEsTUFDaEI7QUFBQSxJQUNEO0FBQUEsSUFDQSxJQUFJLGFBQWEsV0FBVztBQUFBLE1BQzNCLE1BQU0sWUFBcUMsQ0FBQztBQUFBLE1BQzVDLFdBQVcsS0FBSyxTQUFTO0FBQUEsTUFDekIsS0FBSyxXQUFXO0FBQUEsTUFDaEIsT0FBTztBQUFBLElBQ1IsRUFBTyxTQUFJLE9BQU8sYUFBYSxZQUFZO0FBQUEsTUFDMUMsTUFBTSxJQUFJLHlCQUNULEdBQUcsT0FBTyxpRUFDWDtBQUFBLElBQ0QsRUFBTztBQUFBLE1BQ04sT0FBTztBQUFBO0FBQUEsRUFFVDtBQUFBO0FBU00sSUFBVTtBQUFBLENBQVYsQ0FBVSxZQUFWO0FBQUEsRUFRQyxTQUFTLGdCQUdmLENBQUMsUUFBNEIsVUFBMEIsQ0FBQyxHQUFrQjtBQUFBLElBQzFFLE9BQU8sTUFBTSxRQUFRLE9BQU87QUFBQTtBQUFBLEVBSnRCLFFBQVM7QUFBQSxHQVJBOztBQ3BhVixTQUFTLGtCQUdmLENBQUMsT0FBdUU7QUFBQSxFQUN4RSxPQUFPLHdCQUF1QixLQUFLO0FBQUE7IiwKICAiZGVidWdJZCI6ICJDMEQzQjkwRkNCMkU0OTQ4NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
package/dist/react.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { WireTransport2, BridgeClientOptions2, BridgeClient2 } from "./shared/chunk-wtv4vt4q.js";
1
+ import { WireTransport2, BridgeClientOptions2, BridgeClient2 } from "./shared/chunk-8c12nwme.js";
2
2
  import "./shared/chunk-7tgzmz0m.js";
3
- import { OperationMap2, StreamMap2, QgisSdkCore2, QgisSdk2 } from "./shared/chunk-a33y575v.js";
4
- import { Store2, OperationState2, Operation2, StreamTerminalLike2, StreamHandleLike2, StreamHandlersLike2, Stream2, StreamState2, FormState2, FormOptions2, FormStore2, HostQueryState2, HostQueryStore2 } from "./shared/chunk-3zscfm3y.js";
3
+ import { OperationMap2, StreamMap2, QgisSdkCore2, QgisSdk2 } from "./shared/chunk-nwz8n14x.js";
4
+ import { Store2, OperationState2, Operation2, FormState2, FormOptions2, FormStore2, HostQueryState2, HostQueryStore2, StreamTerminalLike2, StreamHandleLike2, StreamHandlersLike2, Stream2, StreamState2 } from "./shared/chunk-b11znjn6.js";
5
5
  import { QgisSdkError2 } from "./shared/chunk-pdj2fxjb.js";
6
6
  import { ReactElement, ReactNode } from "react";
7
7
  /** A hook or provider was used outside the shape it needs. */
package/dist/react.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  BridgeClient2
3
- } from "./shared/chunk-8gawbn19.js";
3
+ } from "./shared/chunk-xg5ntw1c.js";
4
4
  import {
5
5
  OperationStore2,
6
- StreamStore2,
7
- FormStore2
8
- } from "./shared/chunk-t1vpt5yq.js";
6
+ FormStore2,
7
+ StreamStore2
8
+ } from "./shared/chunk-72sjmz60.js";
9
9
  import {
10
10
  QgisSdkError2
11
11
  } from "./shared/chunk-2hwva3a3.js";
@@ -123,5 +123,5 @@ export {
123
123
  useStream
124
124
  };
125
125
 
126
- //# debugId=AF402B9327384C7B64756E2164756E21
127
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL3JlYWN0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIi8qKlxuICogVGhpbiBSZWFjdCBiaW5kaW5ncyBvdmVyIHRoZSBzdG9yZSBjb3JlIChkZWNpc2lvbi0xOCwgZGVjaXNpb24tNDcpLlxuICpcbiAqIFRoaXMgZW50cnkgcG9pbnQgaXMgb3B0aW9uYWwgYW5kIGlzIHRoZSBvbmx5IG9uZSB0aGF0IGltcG9ydHMgUmVhY3QuIEl0IGFkZHNcbiAqIG5vIHNlY29uZCBjbGllbnQ6IGEgY29tcG9uZW50IHJlYWNoZXMgdGhlIHNhbWUgYFFnaXNTZGtgIG9yIGBCcmlkZ2VDbGllbnRgIGFcbiAqIHZhbmlsbGEgcGFnZSB3b3VsZCBidWlsZCwgdGhyb3VnaCBhIHByb3ZpZGVyIHRoYXQgaXMgaGFuZGVkIGEgYFFnaXNTZGtgXG4gKiAoYW5kIGxlYXZlcyBpdCBhbG9uZSksIGlzIGhhbmRlZCBhIGNsaWVudCAoc2FtZSksIG9yIG93bnMgYSBjbGllbnQgYnVpbHQgb25cbiAqIGEgdHJhbnNwb3J0IChhbmQgY2xvc2VzIGl0IG9uIHVubW91bnQpLiBUaGUgaG9va3MgdGFrZSB0aGUgbWV0aG9kcyBhXG4gKiBgUWdpc1Nka2AgYWxyZWFkeSBoYXMgLSBgcWdpcy5zaXRlcy5zdW1tYXJ5YCwgYHFnaXMuc2l0ZXMud2F0Y2hgIC0gc29cbiAqIHRoZSB0eXBlZCBjb250cmFjdCBpcyB0aGUgZ2VuZXJhdGVkIG9uZSwgbm90IGEgUmVhY3QgY29weSBvZiBpdC5cbiAqXG4gKiBUaGUgYmVoYXZpb3VyIGxpdmVzIGluIGAuL3N0b3Jlc2A6IGB1c2VPcGVyYXRpb25gIGlzIGFuIGBPcGVyYXRpb25TdG9yZWBcbiAqIHJlYWQgdGhyb3VnaCBgdXNlU3luY0V4dGVybmFsU3RvcmVgLCBgdXNlU3RyZWFtYCBhIGBTdHJlYW1TdG9yZWAsIGB1c2VGb3JtYFxuICogYSBgRm9ybVN0b3JlYCBhbmQgYHVzZUhvc3RRdWVyeWAgYSBgSG9zdFF1ZXJ5U3RvcmVgLiBXaGF0IHRoZSBob29rcyBhZGQgaXNcbiAqIGxpZmV0aW1lOiBhIGNhbGwgYWJvcnRlZCB3aGVuIGl0cyBjb21wb25lbnQgdW5tb3VudHMsIGEgc3RyZWFtIGNsb3NlZCBvblxuICogdW5tb3VudCBvciB3aGVuIGl0cyBpbnB1dCBjaGFuZ2VzLCBhbmQgYSBzaW11bGF0ZWQgU3RyaWN0TW9kZSByZW1vdW50IHRoYXRcbiAqIGxlYXZlcyBleGFjdGx5IG9uZSBvZiBlYWNoLlxuICovXG5cbmltcG9ydCB7XG5cdGNyZWF0ZUNvbnRleHQsXG5cdGNyZWF0ZUVsZW1lbnQsXG5cdHR5cGUgUmVhY3RFbGVtZW50LFxuXHR0eXBlIFJlYWN0Tm9kZSxcblx0dXNlQ29udGV4dCxcblx0dXNlRWZmZWN0LFxuXHR1c2VNZW1vLFxuXHR1c2VTdGF0ZSxcblx0dXNlU3luY0V4dGVybmFsU3RvcmUsXG59IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHtcblx0QnJpZGdlQ2xpZW50LFxuXHR0eXBlIEJyaWRnZUNsaWVudE9wdGlvbnMsXG5cdHR5cGUgV2lyZVRyYW5zcG9ydCxcbn0gZnJvbSBcIi4vYnJpZGdlXCI7XG5pbXBvcnQgeyBRZ2lzU2RrRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB0eXBlIHsgUWdpc1NkaywgUWdpc1Nka0NvcmUgfSBmcm9tIFwiLi9xZ2lzLXNka1wiO1xuaW1wb3J0IHR5cGUgeyBPcGVyYXRpb25NYXAsIFN0cmVhbU1hcCB9IGZyb20gXCIuL3NjaGVtYVwiO1xuaW1wb3J0IHtcblx0dHlwZSBGb3JtT3B0aW9ucyxcblx0dHlwZSBGb3JtU3RhdGUsXG5cdEZvcm1TdG9yZSxcblx0dHlwZSBIb3N0UXVlcnlTdGF0ZSxcblx0dHlwZSBIb3N0UXVlcnlTdG9yZSxcblx0dHlwZSBPcGVyYXRpb24sXG5cdHR5cGUgT3BlcmF0aW9uU3RhdGUsXG5cdE9wZXJhdGlvblN0b3JlLFxuXHR0eXBlIFN0b3JlLFxuXHR0eXBlIFN0cmVhbSxcblx0dHlwZSBTdHJlYW1IYW5kbGVyc0xpa2UsXG5cdHR5cGUgU3RyZWFtU3RhdGUsXG5cdFN0cmVhbVN0b3JlLFxufSBmcm9tIFwiLi9zdG9yZXNcIjtcblxuZXhwb3J0IHR5cGUge1xuXHRPcGVyYXRpb24sXG5cdE9wZXJhdGlvblN0YXRlLFxuXHRTdHJlYW0sXG5cdFN0cmVhbUhhbmRsZUxpa2UsXG5cdFN0cmVhbUhhbmRsZXJzTGlrZSxcblx0U3RyZWFtU3RhdGUsXG5cdFN0cmVhbVRlcm1pbmFsTGlrZSxcbn0gZnJvbSBcIi4vc3RvcmVzXCI7XG5cbi8qKiBBIGhvb2sgb3IgcHJvdmlkZXIgd2FzIHVzZWQgb3V0c2lkZSB0aGUgc2hhcGUgaXQgbmVlZHMuICovXG5leHBvcnQgY2xhc3MgUWdpc1Nka0JyaWRnZVJlYWN0RXJyb3IgZXh0ZW5kcyBRZ2lzU2RrRXJyb3Ige1xuXHRwdWJsaWMgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG5cdFx0c3VwZXIobWVzc2FnZSwgXCJyZWFjdF9iaW5kaW5nXCIpO1xuXHR9XG59XG5cbmludGVyZmFjZSBTaGFyZWQge1xuXHRyZWFkb25seSBjbGllbnQ6IEJyaWRnZUNsaWVudDtcblx0cmVhZG9ubHkgcWdpczogUWdpc1Nka0NvcmU8dW5rbm93biwgdW5rbm93bj4gfCBudWxsO1xufVxuXG5jb25zdCBDbGllbnRDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxTaGFyZWQgfCBudWxsPihudWxsKTtcblxuLyoqIFByb3BzIGZvciB7QGxpbmsgQnJpZGdlUHJvdmlkZXJ9OiBleGFjdGx5IG9uZSBvZiBgcWdpc2AsIGBjbGllbnRgIG9yIGB0cmFuc3BvcnRgLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCcmlkZ2VQcm92aWRlclByb3BzIHtcblx0LyoqXG5cdCAqIEEgYFFnaXNTZGtgIHRoZSBwYWdlIGJ1aWx0LCB3aGF0ZXZlciBpdHMgc2NoZW1hOyB0aGUgcHJvdmlkZXIgc2hhcmVzIGl0XG5cdCAqIGFuZCBuZXZlciBjbG9zZXMgaXQuIGB1c2VRZ2lzU2RrYCBoYW5kcyBpdCBiYWNrIHVuZGVyIHRoZSBwYWdlJ3MgdHlwZXMuXG5cdCAqL1xuXHRyZWFkb25seSBxZ2lzPzogUWdpc1Nka0NvcmU8dW5rbm93biwgdW5rbm93bj47XG5cdC8qKiBBIGNsaWVudCB0aGUgY2FsbGVyIG93bnM7IHRoZSBwcm92aWRlciBuZXZlciBjbG9zZXMgaXQuICovXG5cdHJlYWRvbmx5IGNsaWVudD86IEJyaWRnZUNsaWVudDtcblx0LyoqIEEgdHJhbnNwb3J0IHRoZSBwcm92aWRlciBidWlsZHMgYW5kIG93bnMgYSBjbGllbnQgZm9yLiAqL1xuXHRyZWFkb25seSB0cmFuc3BvcnQ/OiBXaXJlVHJhbnNwb3J0O1xuXHQvKiogT3B0aW9ucyBmb3IgdGhlIG93bmVkIGNsaWVudDsgaWdub3JlZCB3aGVuIGBjbGllbnRgIGlzIGdpdmVuLiAqL1xuXHRyZWFkb25seSBvcHRpb25zPzogQnJpZGdlQ2xpZW50T3B0aW9ucztcblx0cmVhZG9ubHkgY2hpbGRyZW4/OiBSZWFjdE5vZGU7XG59XG5cbi8qKlxuICogU2hhcmUgb25lIGNsaWVudCB3aXRoIGEgc3VidHJlZS5cbiAqXG4gKiBBbiBvd25lZCBjbGllbnQgaXMgY3JlYXRlZCBpbiBhbiBlZmZlY3QsIG5ldmVyIGR1cmluZyByZW5kZXIsIGJlY2F1c2VcbiAqIFN0cmljdE1vZGUgcmVuZGVycyB0d2ljZSBhbmQgYSBjbGllbnQgbWFkZSBpbiByZW5kZXIgd291bGQgbGVhdmUgYSBzZWNvbmRcbiAqIGxpc3RlbmVyIG9uIHRoZSB0cmFuc3BvcnQuIFVudGlsIHRoYXQgZWZmZWN0IGhhcyBydW4gdGhlIHN1YnRyZWUgaXMgbm90XG4gKiByZW5kZXJlZCwgd2hpY2ggaXMgb25lIHRpY2suIFN0cmljdE1vZGUncyBzaW11bGF0ZWQgdW5tb3VudCBjbG9zZXMgdGhlXG4gKiBvd25lZCBjbGllbnQgYW5kIHRoZSBlZmZlY3QgdGhhdCBmb2xsb3dzIG1ha2VzIGEgbmV3IG9uZSwgc28gdGhlIHN1YnRyZWVcbiAqIG5ldmVyIGhvbGRzIGEgZGVhZCBjbGllbnQuIFRoZSB0cmFuc3BvcnQgbXVzdCBiZSBzdGFibGUgYWNyb3NzIHJlbmRlcnM7IHRvXG4gKiBzd2FwIGl0LCBjaGFuZ2UgdGhlIHByb3ZpZGVyJ3MgYGtleWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBCcmlkZ2VQcm92aWRlcihwcm9wczogQnJpZGdlUHJvdmlkZXJQcm9wcyk6IFJlYWN0RWxlbWVudCB7XG5cdGNvbnN0IHsgcWdpcywgY2xpZW50LCB0cmFuc3BvcnQsIG9wdGlvbnMsIGNoaWxkcmVuIH0gPSBwcm9wcztcblx0Y29uc3QgZ2l2ZW4gPSBbcWdpcywgY2xpZW50LCB0cmFuc3BvcnRdLmZpbHRlcihcblx0XHQoc291cmNlKSA9PiBzb3VyY2UgIT09IHVuZGVmaW5lZCxcblx0KS5sZW5ndGg7XG5cdGlmIChnaXZlbiAhPT0gMSkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlUmVhY3RFcnJvcihcblx0XHRcdFwiQnJpZGdlUHJvdmlkZXIgbmVlZHMgZXhhY3RseSBvbmUgb2YgcWdpcywgY2xpZW50IG9yIHRyYW5zcG9ydFwiLFxuXHRcdCk7XG5cdH1cblx0Y29uc3QgdGltZW91dE1zID0gb3B0aW9ucz8udGltZW91dE1zO1xuXHRjb25zdCBbb3duZWQsIHNldE93bmVkXSA9IHVzZVN0YXRlPEJyaWRnZUNsaWVudCB8IG51bGw+KG51bGwpO1xuXHR1c2VFZmZlY3QoKCkgPT4ge1xuXHRcdGlmICh0cmFuc3BvcnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Y29uc3QgbGl2ZSA9IG5ldyBCcmlkZ2VDbGllbnQoXG5cdFx0XHR0cmFuc3BvcnQsXG5cdFx0XHR0aW1lb3V0TXMgPT09IHVuZGVmaW5lZCA/IHt9IDogeyB0aW1lb3V0TXMgfSxcblx0XHQpO1xuXHRcdHNldE93bmVkKGxpdmUpO1xuXHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRsaXZlLmNsb3NlKCk7XG5cdFx0XHRzZXRPd25lZCgoY3VycmVudCkgPT4gKGN1cnJlbnQgPT09IGxpdmUgPyBudWxsIDogY3VycmVudCkpO1xuXHRcdH07XG5cdH0sIFt0cmFuc3BvcnQsIHRpbWVvdXRNc10pO1xuXHRjb25zdCB2YWx1ZSA9IHVzZU1lbW8oKCk6IFNoYXJlZCB8IG51bGwgPT4ge1xuXHRcdGlmIChxZ2lzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB7IGNsaWVudDogcWdpcy5jbGllbnQsIHFnaXMgfTtcblx0XHR9XG5cdFx0Y29uc3QgbGl2ZSA9IGNsaWVudCA/PyBvd25lZDtcblx0XHRyZXR1cm4gbGl2ZSA9PT0gbnVsbCA/IG51bGwgOiB7IGNsaWVudDogbGl2ZSwgcWdpczogbnVsbCB9O1xuXHR9LCBbcWdpcywgY2xpZW50LCBvd25lZF0pO1xuXHRyZXR1cm4gY3JlYXRlRWxlbWVudChcblx0XHRDbGllbnRDb250ZXh0LlByb3ZpZGVyLFxuXHRcdHsgdmFsdWUgfSxcblx0XHR2YWx1ZSA9PT0gbnVsbCA/IG51bGwgOiBjaGlsZHJlbixcblx0KTtcbn1cblxuZnVuY3Rpb24gdXNlU2hhcmVkKGhvb2s6IHN0cmluZyk6IFNoYXJlZCB7XG5cdGNvbnN0IHNoYXJlZCA9IHVzZUNvbnRleHQoQ2xpZW50Q29udGV4dCk7XG5cdGlmIChzaGFyZWQgPT09IG51bGwpIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0JyaWRnZVJlYWN0RXJyb3IoXG5cdFx0XHRgJHtob29rfSBuZWVkcyBhIEJyaWRnZVByb3ZpZGVyIGFib3ZlIGl0YCxcblx0XHQpO1xuXHR9XG5cdHJldHVybiBzaGFyZWQ7XG59XG5cbi8qKiBUaGUgY2xpZW50IG9mIHRoZSBuZWFyZXN0IHtAbGluayBCcmlkZ2VQcm92aWRlcn0uICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQnJpZGdlQ2xpZW50KCk6IEJyaWRnZUNsaWVudCB7XG5cdHJldHVybiB1c2VTaGFyZWQoXCJ1c2VCcmlkZ2VDbGllbnRcIikuY2xpZW50O1xufVxuXG4vKipcbiAqIFRoZSBgUWdpc1Nka2Agb2YgdGhlIG5lYXJlc3Qge0BsaW5rIEJyaWRnZVByb3ZpZGVyfS5cbiAqXG4gKiBUaGUgdHlwZSBwYXJhbWV0ZXJzIG5hbWUgdGhlIGdlbmVyYXRlZCBgT3BlcmF0aW9uc2AgYW5kIGBTdHJlYW1zYDsgdGhleSBhcmVcbiAqIHRoZSBjYWxsZXIncyBjbGFpbSwgdGhlIHNhbWUgd2F5IHRoZSBwcm92aWRlcidzIGBxZ2lzYCBwcm9wIHdhcyB0aGUgcGFnZSdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlUWdpc1NkazxPID0gT3BlcmF0aW9uTWFwLCBTID0gU3RyZWFtTWFwPigpOiBRZ2lzU2RrPE8sIFM+IHtcblx0Y29uc3Qgc2hhcmVkID0gdXNlU2hhcmVkKFwidXNlUWdpc1Nka1wiKTtcblx0aWYgKHNoYXJlZC5xZ2lzID09PSBudWxsKSB7XG5cdFx0dGhyb3cgbmV3IFFnaXNTZGtCcmlkZ2VSZWFjdEVycm9yKFxuXHRcdFx0XCJ1c2VRZ2lzU2RrIG5lZWRzIGEgQnJpZGdlUHJvdmlkZXIgZ2l2ZW4gYSBxZ2lzIGluc3RhbmNlXCIsXG5cdFx0KTtcblx0fVxuXHRyZXR1cm4gc2hhcmVkLnFnaXMgYXMgdW5rbm93biBhcyBRZ2lzU2RrPE8sIFM+O1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgZ2VuZXJhdGVkIG9wZXJhdGlvbiBtYXAgb25jZSBwZXIgY2xpZW50OiBgdXNlT3BlcmF0aW9ucyhjcmVhdGVPcGVyYXRpb25zKWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VPcGVyYXRpb25zPFQ+KGNyZWF0ZTogKGNsaWVudDogQnJpZGdlQ2xpZW50KSA9PiBUKTogVCB7XG5cdGNvbnN0IGNsaWVudCA9IHVzZUJyaWRnZUNsaWVudCgpO1xuXHRyZXR1cm4gdXNlTWVtbygoKSA9PiBjcmVhdGUoY2xpZW50KSwgW2NyZWF0ZSwgY2xpZW50XSk7XG59XG5cbi8qKiBDb250cm9scyBiZXlvbmQgcnVubmluZzogYWJvcnQgd2hhdCBpcyBpbiBmbGlnaHQsIG9yIGZvcmdldCB0aGUgb3V0Y29tZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3BlcmF0aW9uQ29udHJvbHMge1xuXHQvKiogQWJvcnQgdGhlIGluLWZsaWdodCBjYWxsIGxvY2FsbHk7IHRoZSBob3N0IG1heSBzdGlsbCBydW4gaXQuICovXG5cdGFib3J0KCk6IHZvaWQ7XG5cdC8qKiBCYWNrIHRvIGBpZGxlYCwgYWJvcnRpbmcgYW55dGhpbmcgaW4gZmxpZ2h0LiAqL1xuXHRyZXNldCgpOiB2b2lkO1xufVxuXG4vKiogUmVhZCBhbnkgc3RvcmUgZnJvbSBhIGNvbXBvbmVudDsgdGhlIHNuYXBzaG90IGlzIHRoZSByZW5kZXIncyB2YWx1ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VTdG9yZTxUPihzdG9yZTogU3RvcmU8VD4pOiBUIHtcblx0cmV0dXJuIHVzZVN5bmNFeHRlcm5hbFN0b3JlKFxuXHRcdHN0b3JlLnN1YnNjcmliZSxcblx0XHRzdG9yZS5nZXRTbmFwc2hvdCxcblx0XHRzdG9yZS5nZXRTbmFwc2hvdCxcblx0KTtcbn1cblxuLyoqXG4gKiBSdW4gYSBnZW5lcmF0ZWQgb3BlcmF0aW9uIGZyb20gYSBjb21wb25lbnQuXG4gKlxuICogYHJ1bmAgcmVzb2x2ZXMgd2l0aCB0aGUgdmFsdWUsIG9yIHdpdGggYHVuZGVmaW5lZGAgd2hlbiB0aGUgY2FsbCBmYWlsZWQsIHdhc1xuICogYWJvcnRlZCBvciB3YXMgc3VwZXJzZWRlZCBieSBhIGxhdGVyIHJ1biAtIHRoZSBzdGF0ZSBjYXJyaWVzIHRoZSBlcnJvciwgc29cbiAqIHRoZSBwcm9taXNlIG5ldmVyIHJlamVjdHMgaW50byBhbiBldmVudCBoYW5kbGVyLiBPbmx5IHRoZSBsYXRlc3QgcnVuIGNhblxuICogY2hhbmdlIHRoZSBzdGF0ZTsgdW5tb3VudGluZyBhYm9ydHMgd2hhdGV2ZXIgaXMgaW4gZmxpZ2h0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlT3BlcmF0aW9uPEksIFI+KFxuXHRvcGVyYXRpb246IE9wZXJhdGlvbjxJLCBSPixcbik6IHJlYWRvbmx5IFtcblx0T3BlcmF0aW9uU3RhdGU8Uj4sXG5cdChpbnB1dDogSSkgPT4gUHJvbWlzZTxSIHwgdW5kZWZpbmVkPixcblx0T3BlcmF0aW9uQ29udHJvbHMsXG5dIHtcblx0Y29uc3Qgc3RvcmUgPSB1c2VNZW1vKCgpID0+IG5ldyBPcGVyYXRpb25TdG9yZShvcGVyYXRpb24pLCBbb3BlcmF0aW9uXSk7XG5cdHVzZUVmZmVjdCgoKSA9PiAoKSA9PiBzdG9yZS5hYm9ydCgpLCBbc3RvcmVdKTtcblx0Y29uc3Qgc3RhdGUgPSB1c2VTdG9yZShzdG9yZSk7XG5cdGNvbnN0IGNvbnRyb2xzID0gdXNlTWVtbyhcblx0XHQoKSA9PiAoeyBhYm9ydDogc3RvcmUuYWJvcnQsIHJlc2V0OiBzdG9yZS5yZXNldCB9KSxcblx0XHRbc3RvcmVdLFxuXHQpO1xuXHRyZXR1cm4gW3N0YXRlLCBzdG9yZS5ydW4sIGNvbnRyb2xzXTtcbn1cblxuLyoqXG4gKiBIb2xkIGEgZ2VuZXJhdGVkIHN0cmVhbSBvcGVuIHdoaWxlIGEgY29tcG9uZW50IGlzIG1vdW50ZWQuXG4gKlxuICogVGhlIHN1YnNjcmlwdGlvbiBmb2xsb3dzIGBvcGVuYCBhbmQgdGhlICpjb250ZW50KiBvZiBgaW5wdXRgOiBhIG5ldyBvYmplY3RcbiAqIHdpdGggdGhlIHNhbWUgZmllbGRzIGRvZXMgbm90IHJlb3BlbiBpdCwgYSBkaWZmZXJlbnQgb25lIGNsb3NlcyB0aGUgb2xkXG4gKiBzdHJlYW0gYW5kIG9wZW5zIGEgbmV3IG9uZSwgYW5kIGBudWxsYCBjbG9zZXMgaXQuIEhhbmRsZXJzIGFyZSByZWFkIGZyZXNoXG4gKiBvbiBldmVyeSBmcmFtZSwgc28gYSBuZXcgY2xvc3VyZSBkb2VzIG5vdCByZW9wZW4gYW55dGhpbmcgZWl0aGVyLiBVbm1vdW50XG4gKiBjbG9zZXMgdGhlIHN0cmVhbSwgZXZlbiBpZiB0aGUgaG9zdCBoYXMgbm90IHlldCBhY2tub3dsZWRnZWQgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VTdHJlYW08SSwgRT4oXG5cdG9wZW46IFN0cmVhbTxJLCBFPixcblx0aW5wdXQ6IEkgfCBudWxsLFxuXHRoYW5kbGVyczogU3RyZWFtSGFuZGxlcnNMaWtlPEU+ID0ge30sXG4pOiBTdHJlYW1TdGF0ZTxFPiB7XG5cdGNvbnN0IHN0b3JlID0gdXNlTWVtbygoKSA9PiBuZXcgU3RyZWFtU3RvcmUob3BlbiksIFtvcGVuXSk7XG5cdHN0b3JlLnNldEhhbmRsZXJzKGhhbmRsZXJzKTtcblx0Ly8gVGhlIHN0b3JlIGtleXMgdGhlIGlucHV0IGJ5IGNvbnRlbnQsIHNvIGFuIGVmZmVjdCBwZXIgcmVuZGVyIGlzIGNoZWFwXG5cdC8vIGFuZCBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgc2FtZSBmaWVsZHMgcmVvcGVucyBub3RoaW5nLlxuXHR1c2VFZmZlY3QoKCkgPT4ge1xuXHRcdHN0b3JlLnNldElucHV0KGlucHV0KTtcblx0fSk7XG5cdHVzZUVmZmVjdCgoKSA9PiAoKSA9PiBzdG9yZS5jbG9zZSgpLCBbc3RvcmVdKTtcblx0cmV0dXJuIHVzZVN0b3JlKHN0b3JlKTtcbn1cblxuLyoqXG4gKiBUaGUgZm9ybSBvZiBvbmUgZGVjbGFyZWQgYWN0aW9uOiBgcWdpcy48aWQ+YCB3aXRoIGl0cyBmaWVsZHMsIHZhbHVlcyxcbiAqIGlzc3VlcyBhbmQgc3VibWlzc2lvbi4gVGhlIHN0b3JlIGlzIGJ1aWx0IG9uY2UgcGVyIGBxZ2lzYCBhbmQgYGlkYCAtIHRoZVxuICogb3B0aW9ucyBhcmUgcmVhZCBvbiB0aGUgZmlyc3QgcmVuZGVyIG9ubHksIGxpa2UgYHVzZVN0YXRlYCdzIGluaXRpYWwgdmFsdWVcbiAqIC0gYW5kIHVubW91bnRpbmcgYWJvcnRzIGEgc3VibWlzc2lvbiBpbiBmbGlnaHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VGb3JtPE8sIEsgZXh0ZW5kcyBrZXlvZiBPICYgc3RyaW5nPihcblx0cWdpczogUWdpc1Nka0NvcmU8TywgdW5rbm93bj4sXG5cdGlkOiBLLFxuXHRvcHRpb25zPzogRm9ybU9wdGlvbnMsXG4pOiByZWFkb25seSBbXG5cdEZvcm1TdGF0ZTxSZXN1bHRPZjxPLCBLPj4sXG5cdEZvcm1TdG9yZTxSZXF1ZXN0T2Y8TywgSz4gJiBvYmplY3QsIFJlc3VsdE9mPE8sIEs+Pixcbl0ge1xuXHRjb25zdCBbZmlyc3RdID0gdXNlU3RhdGUoKCkgPT4gb3B0aW9ucyA/PyB7fSk7XG5cdGNvbnN0IHN0b3JlID0gdXNlTWVtbyhcblx0XHQoKSA9PlxuXHRcdFx0bmV3IEZvcm1TdG9yZTxSZXF1ZXN0T2Y8TywgSz4gJiBvYmplY3QsIFJlc3VsdE9mPE8sIEs+Pihcblx0XHRcdFx0cWdpcyBhcyBRZ2lzU2RrQ29yZTx1bmtub3duLCB1bmtub3duPixcblx0XHRcdFx0aWQsXG5cdFx0XHRcdGZpcnN0LFxuXHRcdFx0KSxcblx0XHRbcWdpcywgaWQsIGZpcnN0XSxcblx0KTtcblx0Ly8gQWJvcnQsIG5vdCBkaXNwb3NlOiBTdHJpY3RNb2RlJ3Mgc2ltdWxhdGVkIHVubW91bnQga2VlcHMgdGhlIHN0b3JlLlxuXHR1c2VFZmZlY3QoKCkgPT4gKCkgPT4gc3RvcmUuYWJvcnQoKSwgW3N0b3JlXSk7XG5cdHJldHVybiBbdXNlU3RvcmUoc3RvcmUpLCBzdG9yZV07XG59XG5cbi8qKlxuICogUmVhZCBhIGhvc3QgcXVlcnkgc3RvcmU6IGB1c2VIb3N0UXVlcnkobGF5ZXJzUXVlcnkocWdpcykpYCBmb3IgYSBsYXllclxuICogcGlja2VyLiBgcmVmcmVzaGAgcnVucyBvbmNlIG9uIG1vdW50IHdoZW4gYGF1dG9gIGlzIG5vdCBgZmFsc2VgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlSG9zdFF1ZXJ5PFQ+KFxuXHRzdG9yZTogSG9zdFF1ZXJ5U3RvcmU8VD4sXG5cdG9wdGlvbnM6IHsgcmVhZG9ubHkgYXV0bz86IGJvb2xlYW4gfSA9IHt9LFxuKTogcmVhZG9ubHkgW0hvc3RRdWVyeVN0YXRlPFQ+LCBIb3N0UXVlcnlTdG9yZTxUPl0ge1xuXHRjb25zdCBhdXRvID0gb3B0aW9ucy5hdXRvICE9PSBmYWxzZTtcblx0dXNlRWZmZWN0KCgpID0+IHtcblx0XHRpZiAoYXV0bykge1xuXHRcdFx0dm9pZCBzdG9yZS5yZWZyZXNoKCk7XG5cdFx0fVxuXHRcdHJldHVybiAoKSA9PiBzdG9yZS5hYm9ydCgpO1xuXHR9LCBbc3RvcmUsIGF1dG9dKTtcblx0cmV0dXJuIFt1c2VTdG9yZShzdG9yZSksIHN0b3JlXTtcbn1cblxudHlwZSBSZXF1ZXN0T2Y8TywgSyBleHRlbmRzIGtleW9mIE8+ID0gT1tLXSBleHRlbmRzIHtcblx0cmVhZG9ubHkgcmVxdWVzdDogaW5mZXIgUmVxO1xufVxuXHQ/IFJlcVxuXHQ6IG5ldmVyO1xudHlwZSBSZXN1bHRPZjxPLCBLIGV4dGVuZHMga2V5b2YgTz4gPSBPW0tdIGV4dGVuZHMge1xuXHRyZWFkb25seSByZXN1bHQ6IGluZmVyIFJlcztcbn1cblx0PyBSZXNcblx0OiBuZXZlcjtcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7QUFtQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBOENPLE1BQU0sZ0NBQWdDLGNBQWE7QUFBQSxFQUNsRCxXQUFXLENBQUMsU0FBaUI7QUFBQSxJQUNuQyxNQUFNLFNBQVMsZUFBZTtBQUFBO0FBRWhDO0FBT0EsSUFBTSxnQkFBZ0IsY0FBNkIsSUFBSTtBQTZCaEQsU0FBUyxjQUFjLENBQUMsT0FBMEM7QUFBQSxFQUN4RSxRQUFRLE1BQU0sUUFBUSxXQUFXLFNBQVMsYUFBYTtBQUFBLEVBQ3ZELE1BQU0sUUFBUSxDQUFDLE1BQU0sUUFBUSxTQUFTLEVBQUUsT0FDdkMsQ0FBQyxXQUFXLFdBQVcsU0FDeEIsRUFBRTtBQUFBLEVBQ0YsSUFBSSxVQUFVLEdBQUc7QUFBQSxJQUNoQixNQUFNLElBQUksd0JBQ1QsK0RBQ0Q7QUFBQSxFQUNEO0FBQUEsRUFDQSxNQUFNLFlBQVksU0FBUztBQUFBLEVBQzNCLE9BQU8sT0FBTyxZQUFZLFNBQThCLElBQUk7QUFBQSxFQUM1RCxVQUFVLE1BQU07QUFBQSxJQUNmLElBQUksY0FBYyxXQUFXO0FBQUEsTUFDNUI7QUFBQSxJQUNEO0FBQUEsSUFDQSxNQUFNLE9BQU8sSUFBSSxjQUNoQixXQUNBLGNBQWMsWUFBWSxDQUFDLElBQUksRUFBRSxVQUFVLENBQzVDO0FBQUEsSUFDQSxTQUFTLElBQUk7QUFBQSxJQUNiLE9BQU8sTUFBTTtBQUFBLE1BQ1osS0FBSyxNQUFNO0FBQUEsTUFDWCxTQUFTLENBQUMsWUFBYSxZQUFZLE9BQU8sT0FBTyxPQUFRO0FBQUE7QUFBQSxLQUV4RCxDQUFDLFdBQVcsU0FBUyxDQUFDO0FBQUEsRUFDekIsTUFBTSxRQUFRLFFBQVEsTUFBcUI7QUFBQSxJQUMxQyxJQUFJLFNBQVMsV0FBVztBQUFBLE1BQ3ZCLE9BQU8sRUFBRSxRQUFRLEtBQUssUUFBUSxLQUFLO0FBQUEsSUFDcEM7QUFBQSxJQUNBLE1BQU0sT0FBTyxVQUFVO0FBQUEsSUFDdkIsT0FBTyxTQUFTLE9BQU8sT0FBTyxFQUFFLFFBQVEsTUFBTSxNQUFNLEtBQUs7QUFBQSxLQUN2RCxDQUFDLE1BQU0sUUFBUSxLQUFLLENBQUM7QUFBQSxFQUN4QixPQUFPLGNBQ04sY0FBYyxVQUNkLEVBQUUsTUFBTSxHQUNSLFVBQVUsT0FBTyxPQUFPLFFBQ3pCO0FBQUE7QUFHRCxTQUFTLFNBQVMsQ0FBQyxNQUFzQjtBQUFBLEVBQ3hDLE1BQU0sU0FBUyxXQUFXLGFBQWE7QUFBQSxFQUN2QyxJQUFJLFdBQVcsTUFBTTtBQUFBLElBQ3BCLE1BQU0sSUFBSSx3QkFDVCxHQUFHLHNDQUNKO0FBQUEsRUFDRDtBQUFBLEVBQ0EsT0FBTztBQUFBO0FBSUQsU0FBUyxlQUFlLEdBQWlCO0FBQUEsRUFDL0MsT0FBTyxVQUFVLGlCQUFpQixFQUFFO0FBQUE7QUFTOUIsU0FBUyxVQUEyQyxHQUFrQjtBQUFBLEVBQzVFLE1BQU0sU0FBUyxVQUFVLFlBQVk7QUFBQSxFQUNyQyxJQUFJLE9BQU8sU0FBUyxNQUFNO0FBQUEsSUFDekIsTUFBTSxJQUFJLHdCQUNULHlEQUNEO0FBQUEsRUFDRDtBQUFBLEVBQ0EsT0FBTyxPQUFPO0FBQUE7QUFNUixTQUFTLGFBQWdCLENBQUMsUUFBd0M7QUFBQSxFQUN4RSxNQUFNLFNBQVMsZ0JBQWdCO0FBQUEsRUFDL0IsT0FBTyxRQUFRLE1BQU0sT0FBTyxNQUFNLEdBQUcsQ0FBQyxRQUFRLE1BQU0sQ0FBQztBQUFBO0FBWS9DLFNBQVMsUUFBVyxDQUFDLE9BQW9CO0FBQUEsRUFDL0MsT0FBTyxxQkFDTixNQUFNLFdBQ04sTUFBTSxhQUNOLE1BQU0sV0FDUDtBQUFBO0FBV00sU0FBUyxZQUFrQixDQUNqQyxXQUtDO0FBQUEsRUFDRCxNQUFNLFFBQVEsUUFBUSxNQUFNLElBQUksZ0JBQWUsU0FBUyxHQUFHLENBQUMsU0FBUyxDQUFDO0FBQUEsRUFDdEUsVUFBVSxNQUFNLE1BQU0sTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUM7QUFBQSxFQUM1QyxNQUFNLFFBQVEsU0FBUyxLQUFLO0FBQUEsRUFDNUIsTUFBTSxXQUFXLFFBQ2hCLE9BQU8sRUFBRSxPQUFPLE1BQU0sT0FBTyxPQUFPLE1BQU0sTUFBTSxJQUNoRCxDQUFDLEtBQUssQ0FDUDtBQUFBLEVBQ0EsT0FBTyxDQUFDLE9BQU8sTUFBTSxLQUFLLFFBQVE7QUFBQTtBQVk1QixTQUFTLFNBQWUsQ0FDOUIsTUFDQSxPQUNBLFdBQWtDLENBQUMsR0FDbEI7QUFBQSxFQUNqQixNQUFNLFFBQVEsUUFBUSxNQUFNLElBQUksYUFBWSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFBQSxFQUN6RCxNQUFNLFlBQVksUUFBUTtBQUFBLEVBRzFCLFVBQVUsTUFBTTtBQUFBLElBQ2YsTUFBTSxTQUFTLEtBQUs7QUFBQSxHQUNwQjtBQUFBLEVBQ0QsVUFBVSxNQUFNLE1BQU0sTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUM7QUFBQSxFQUM1QyxPQUFPLFNBQVMsS0FBSztBQUFBO0FBU2YsU0FBUyxPQUFzQyxDQUNyRCxNQUNBLElBQ0EsU0FJQztBQUFBLEVBQ0QsT0FBTyxTQUFTLFNBQVMsTUFBTSxXQUFXLENBQUMsQ0FBQztBQUFBLEVBQzVDLE1BQU0sUUFBUSxRQUNiLE1BQ0MsSUFBSSxXQUNILE1BQ0EsSUFDQSxLQUNELEdBQ0QsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUNqQjtBQUFBLEVBRUEsVUFBVSxNQUFNLE1BQU0sTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUM7QUFBQSxFQUM1QyxPQUFPLENBQUMsU0FBUyxLQUFLLEdBQUcsS0FBSztBQUFBO0FBT3hCLFNBQVMsWUFBZSxDQUM5QixPQUNBLFVBQXVDLENBQUMsR0FDVTtBQUFBLEVBQ2xELE1BQU0sT0FBTyxRQUFRLFNBQVM7QUFBQSxFQUM5QixVQUFVLE1BQU07QUFBQSxJQUNmLElBQUksTUFBTTtBQUFBLE1BQ0osTUFBTSxRQUFRO0FBQUEsSUFDcEI7QUFBQSxJQUNBLE9BQU8sTUFBTSxNQUFNLE1BQU07QUFBQSxLQUN2QixDQUFDLE9BQU8sSUFBSSxDQUFDO0FBQUEsRUFDaEIsT0FBTyxDQUFDLFNBQVMsS0FBSyxHQUFHLEtBQUs7QUFBQTsiLAogICJkZWJ1Z0lkIjogIkFGNDAyQjkzMjczODRDN0I2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
126
+ //# debugId=D0E9055FFB20961164756E2164756E21
127
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL3JlYWN0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIi8qKlxuICogVGhpbiBSZWFjdCBiaW5kaW5ncyBvdmVyIHRoZSBzdG9yZSBjb3JlIChkZWNpc2lvbi0xOCwgZGVjaXNpb24tNDcpLlxuICpcbiAqIFRoaXMgZW50cnkgcG9pbnQgaXMgb3B0aW9uYWwgYW5kIGlzIHRoZSBvbmx5IG9uZSB0aGF0IGltcG9ydHMgUmVhY3QuIEl0IGFkZHNcbiAqIG5vIHNlY29uZCBjbGllbnQ6IGEgY29tcG9uZW50IHJlYWNoZXMgdGhlIHNhbWUgYFFnaXNTZGtgIG9yIGBCcmlkZ2VDbGllbnRgIGFcbiAqIHZhbmlsbGEgcGFnZSB3b3VsZCBidWlsZCwgdGhyb3VnaCBhIHByb3ZpZGVyIHRoYXQgaXMgaGFuZGVkIGEgYFFnaXNTZGtgXG4gKiAoYW5kIGxlYXZlcyBpdCBhbG9uZSksIGlzIGhhbmRlZCBhIGNsaWVudCAoc2FtZSksIG9yIG93bnMgYSBjbGllbnQgYnVpbHQgb25cbiAqIGEgdHJhbnNwb3J0IChhbmQgY2xvc2VzIGl0IG9uIHVubW91bnQpLiBUaGUgaG9va3MgdGFrZSB0aGUgbWV0aG9kcyBhXG4gKiBgUWdpc1Nka2AgYWxyZWFkeSBoYXMgLSBgcWdpcy5zaXRlcy5zdW1tYXJ5YCwgYHFnaXMuc2l0ZXMud2F0Y2hgIC0gc29cbiAqIHRoZSB0eXBlZCBjb250cmFjdCBpcyB0aGUgZ2VuZXJhdGVkIG9uZSwgbm90IGEgUmVhY3QgY29weSBvZiBpdC5cbiAqXG4gKiBUaGUgYmVoYXZpb3VyIGxpdmVzIGluIGAuL3N0b3Jlc2A6IGB1c2VPcGVyYXRpb25gIGlzIGFuIGBPcGVyYXRpb25TdG9yZWBcbiAqIHJlYWQgdGhyb3VnaCBgdXNlU3luY0V4dGVybmFsU3RvcmVgLCBgdXNlU3RyZWFtYCBhIGBTdHJlYW1TdG9yZWAsIGB1c2VGb3JtYFxuICogYSBgRm9ybVN0b3JlYCBhbmQgYHVzZUhvc3RRdWVyeWAgYSBgSG9zdFF1ZXJ5U3RvcmVgLiBXaGF0IHRoZSBob29rcyBhZGQgaXNcbiAqIGxpZmV0aW1lOiBhIGNhbGwgYWJvcnRlZCB3aGVuIGl0cyBjb21wb25lbnQgdW5tb3VudHMsIGEgc3RyZWFtIGNsb3NlZCBvblxuICogdW5tb3VudCBvciB3aGVuIGl0cyBpbnB1dCBjaGFuZ2VzLCBhbmQgYSBzaW11bGF0ZWQgU3RyaWN0TW9kZSByZW1vdW50IHRoYXRcbiAqIGxlYXZlcyBleGFjdGx5IG9uZSBvZiBlYWNoLlxuICovXG5cbmltcG9ydCB7XG5cdGNyZWF0ZUNvbnRleHQsXG5cdGNyZWF0ZUVsZW1lbnQsXG5cdHR5cGUgUmVhY3RFbGVtZW50LFxuXHR0eXBlIFJlYWN0Tm9kZSxcblx0dXNlQ29udGV4dCxcblx0dXNlRWZmZWN0LFxuXHR1c2VNZW1vLFxuXHR1c2VTdGF0ZSxcblx0dXNlU3luY0V4dGVybmFsU3RvcmUsXG59IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHtcblx0QnJpZGdlQ2xpZW50LFxuXHR0eXBlIEJyaWRnZUNsaWVudE9wdGlvbnMsXG5cdHR5cGUgV2lyZVRyYW5zcG9ydCxcbn0gZnJvbSBcIi4vYnJpZGdlXCI7XG5pbXBvcnQgeyBRZ2lzU2RrRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB0eXBlIHsgUWdpc1NkaywgUWdpc1Nka0NvcmUgfSBmcm9tIFwiLi9xZ2lzLXNka1wiO1xuaW1wb3J0IHR5cGUgeyBPcGVyYXRpb25NYXAsIFN0cmVhbU1hcCB9IGZyb20gXCIuL3NjaGVtYVwiO1xuaW1wb3J0IHtcblx0dHlwZSBGb3JtT3B0aW9ucyxcblx0dHlwZSBGb3JtU3RhdGUsXG5cdEZvcm1TdG9yZSxcblx0dHlwZSBIb3N0UXVlcnlTdGF0ZSxcblx0dHlwZSBIb3N0UXVlcnlTdG9yZSxcblx0dHlwZSBPcGVyYXRpb24sXG5cdHR5cGUgT3BlcmF0aW9uU3RhdGUsXG5cdE9wZXJhdGlvblN0b3JlLFxuXHR0eXBlIFN0b3JlLFxuXHR0eXBlIFN0cmVhbSxcblx0dHlwZSBTdHJlYW1IYW5kbGVyc0xpa2UsXG5cdHR5cGUgU3RyZWFtU3RhdGUsXG5cdFN0cmVhbVN0b3JlLFxufSBmcm9tIFwiLi9zdG9yZXNcIjtcblxuZXhwb3J0IHR5cGUge1xuXHRPcGVyYXRpb24sXG5cdE9wZXJhdGlvblN0YXRlLFxuXHRTdHJlYW0sXG5cdFN0cmVhbUhhbmRsZUxpa2UsXG5cdFN0cmVhbUhhbmRsZXJzTGlrZSxcblx0U3RyZWFtU3RhdGUsXG5cdFN0cmVhbVRlcm1pbmFsTGlrZSxcbn0gZnJvbSBcIi4vc3RvcmVzXCI7XG5cbi8qKiBBIGhvb2sgb3IgcHJvdmlkZXIgd2FzIHVzZWQgb3V0c2lkZSB0aGUgc2hhcGUgaXQgbmVlZHMuICovXG5leHBvcnQgY2xhc3MgUWdpc1Nka0JyaWRnZVJlYWN0RXJyb3IgZXh0ZW5kcyBRZ2lzU2RrRXJyb3Ige1xuXHRwdWJsaWMgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG5cdFx0c3VwZXIobWVzc2FnZSwgXCJyZWFjdF9iaW5kaW5nXCIpO1xuXHR9XG59XG5cbmludGVyZmFjZSBTaGFyZWQge1xuXHRyZWFkb25seSBjbGllbnQ6IEJyaWRnZUNsaWVudDtcblx0cmVhZG9ubHkgcWdpczogUWdpc1Nka0NvcmU8dW5rbm93biwgdW5rbm93bj4gfCBudWxsO1xufVxuXG5jb25zdCBDbGllbnRDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxTaGFyZWQgfCBudWxsPihudWxsKTtcblxuLyoqIFByb3BzIGZvciB7QGxpbmsgQnJpZGdlUHJvdmlkZXJ9OiBleGFjdGx5IG9uZSBvZiBgcWdpc2AsIGBjbGllbnRgIG9yIGB0cmFuc3BvcnRgLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCcmlkZ2VQcm92aWRlclByb3BzIHtcblx0LyoqXG5cdCAqIEEgYFFnaXNTZGtgIHRoZSBwYWdlIGJ1aWx0LCB3aGF0ZXZlciBpdHMgc2NoZW1hOyB0aGUgcHJvdmlkZXIgc2hhcmVzIGl0XG5cdCAqIGFuZCBuZXZlciBjbG9zZXMgaXQuIGB1c2VRZ2lzU2RrYCBoYW5kcyBpdCBiYWNrIHVuZGVyIHRoZSBwYWdlJ3MgdHlwZXMuXG5cdCAqL1xuXHRyZWFkb25seSBxZ2lzPzogUWdpc1Nka0NvcmU8dW5rbm93biwgdW5rbm93bj47XG5cdC8qKiBBIGNsaWVudCB0aGUgY2FsbGVyIG93bnM7IHRoZSBwcm92aWRlciBuZXZlciBjbG9zZXMgaXQuICovXG5cdHJlYWRvbmx5IGNsaWVudD86IEJyaWRnZUNsaWVudDtcblx0LyoqIEEgdHJhbnNwb3J0IHRoZSBwcm92aWRlciBidWlsZHMgYW5kIG93bnMgYSBjbGllbnQgZm9yLiAqL1xuXHRyZWFkb25seSB0cmFuc3BvcnQ/OiBXaXJlVHJhbnNwb3J0O1xuXHQvKiogT3B0aW9ucyBmb3IgdGhlIG93bmVkIGNsaWVudDsgaWdub3JlZCB3aGVuIGBjbGllbnRgIGlzIGdpdmVuLiAqL1xuXHRyZWFkb25seSBvcHRpb25zPzogQnJpZGdlQ2xpZW50T3B0aW9ucztcblx0cmVhZG9ubHkgY2hpbGRyZW4/OiBSZWFjdE5vZGU7XG59XG5cbi8qKlxuICogU2hhcmUgb25lIGNsaWVudCB3aXRoIGEgc3VidHJlZS5cbiAqXG4gKiBBbiBvd25lZCBjbGllbnQgaXMgY3JlYXRlZCBpbiBhbiBlZmZlY3QsIG5ldmVyIGR1cmluZyByZW5kZXIsIGJlY2F1c2VcbiAqIFN0cmljdE1vZGUgcmVuZGVycyB0d2ljZSBhbmQgYSBjbGllbnQgbWFkZSBpbiByZW5kZXIgd291bGQgbGVhdmUgYSBzZWNvbmRcbiAqIGxpc3RlbmVyIG9uIHRoZSB0cmFuc3BvcnQuIFVudGlsIHRoYXQgZWZmZWN0IGhhcyBydW4gdGhlIHN1YnRyZWUgaXMgbm90XG4gKiByZW5kZXJlZCwgd2hpY2ggaXMgb25lIHRpY2suIFN0cmljdE1vZGUncyBzaW11bGF0ZWQgdW5tb3VudCBjbG9zZXMgdGhlXG4gKiBvd25lZCBjbGllbnQgYW5kIHRoZSBlZmZlY3QgdGhhdCBmb2xsb3dzIG1ha2VzIGEgbmV3IG9uZSwgc28gdGhlIHN1YnRyZWVcbiAqIG5ldmVyIGhvbGRzIGEgZGVhZCBjbGllbnQuIFRoZSB0cmFuc3BvcnQgbXVzdCBiZSBzdGFibGUgYWNyb3NzIHJlbmRlcnM7IHRvXG4gKiBzd2FwIGl0LCBjaGFuZ2UgdGhlIHByb3ZpZGVyJ3MgYGtleWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBCcmlkZ2VQcm92aWRlcihwcm9wczogQnJpZGdlUHJvdmlkZXJQcm9wcyk6IFJlYWN0RWxlbWVudCB7XG5cdGNvbnN0IHsgcWdpcywgY2xpZW50LCB0cmFuc3BvcnQsIG9wdGlvbnMsIGNoaWxkcmVuIH0gPSBwcm9wcztcblx0Y29uc3QgZ2l2ZW4gPSBbcWdpcywgY2xpZW50LCB0cmFuc3BvcnRdLmZpbHRlcihcblx0XHQoc291cmNlKSA9PiBzb3VyY2UgIT09IHVuZGVmaW5lZCxcblx0KS5sZW5ndGg7XG5cdGlmIChnaXZlbiAhPT0gMSkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlUmVhY3RFcnJvcihcblx0XHRcdFwiQnJpZGdlUHJvdmlkZXIgbmVlZHMgZXhhY3RseSBvbmUgb2YgcWdpcywgY2xpZW50IG9yIHRyYW5zcG9ydFwiLFxuXHRcdCk7XG5cdH1cblx0Y29uc3QgdGltZW91dE1zID0gb3B0aW9ucz8udGltZW91dE1zO1xuXHRjb25zdCBbb3duZWQsIHNldE93bmVkXSA9IHVzZVN0YXRlPEJyaWRnZUNsaWVudCB8IG51bGw+KG51bGwpO1xuXHR1c2VFZmZlY3QoKCkgPT4ge1xuXHRcdGlmICh0cmFuc3BvcnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Y29uc3QgbGl2ZSA9IG5ldyBCcmlkZ2VDbGllbnQoXG5cdFx0XHR0cmFuc3BvcnQsXG5cdFx0XHR0aW1lb3V0TXMgPT09IHVuZGVmaW5lZCA/IHt9IDogeyB0aW1lb3V0TXMgfSxcblx0XHQpO1xuXHRcdHNldE93bmVkKGxpdmUpO1xuXHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRsaXZlLmNsb3NlKCk7XG5cdFx0XHRzZXRPd25lZCgoY3VycmVudCkgPT4gKGN1cnJlbnQgPT09IGxpdmUgPyBudWxsIDogY3VycmVudCkpO1xuXHRcdH07XG5cdH0sIFt0cmFuc3BvcnQsIHRpbWVvdXRNc10pO1xuXHRjb25zdCB2YWx1ZSA9IHVzZU1lbW8oKCk6IFNoYXJlZCB8IG51bGwgPT4ge1xuXHRcdGlmIChxZ2lzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB7IGNsaWVudDogcWdpcy5jbGllbnQsIHFnaXMgfTtcblx0XHR9XG5cdFx0Y29uc3QgbGl2ZSA9IGNsaWVudCA/PyBvd25lZDtcblx0XHRyZXR1cm4gbGl2ZSA9PT0gbnVsbCA/IG51bGwgOiB7IGNsaWVudDogbGl2ZSwgcWdpczogbnVsbCB9O1xuXHR9LCBbcWdpcywgY2xpZW50LCBvd25lZF0pO1xuXHRyZXR1cm4gY3JlYXRlRWxlbWVudChcblx0XHRDbGllbnRDb250ZXh0LlByb3ZpZGVyLFxuXHRcdHsgdmFsdWUgfSxcblx0XHR2YWx1ZSA9PT0gbnVsbCA/IG51bGwgOiBjaGlsZHJlbixcblx0KTtcbn1cblxuZnVuY3Rpb24gdXNlU2hhcmVkKGhvb2s6IHN0cmluZyk6IFNoYXJlZCB7XG5cdGNvbnN0IHNoYXJlZCA9IHVzZUNvbnRleHQoQ2xpZW50Q29udGV4dCk7XG5cdGlmIChzaGFyZWQgPT09IG51bGwpIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0JyaWRnZVJlYWN0RXJyb3IoXG5cdFx0XHRgJHtob29rfSBuZWVkcyBhIEJyaWRnZVByb3ZpZGVyIGFib3ZlIGl0YCxcblx0XHQpO1xuXHR9XG5cdHJldHVybiBzaGFyZWQ7XG59XG5cbi8qKiBUaGUgY2xpZW50IG9mIHRoZSBuZWFyZXN0IHtAbGluayBCcmlkZ2VQcm92aWRlcn0uICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQnJpZGdlQ2xpZW50KCk6IEJyaWRnZUNsaWVudCB7XG5cdHJldHVybiB1c2VTaGFyZWQoXCJ1c2VCcmlkZ2VDbGllbnRcIikuY2xpZW50O1xufVxuXG4vKipcbiAqIFRoZSBgUWdpc1Nka2Agb2YgdGhlIG5lYXJlc3Qge0BsaW5rIEJyaWRnZVByb3ZpZGVyfS5cbiAqXG4gKiBUaGUgdHlwZSBwYXJhbWV0ZXJzIG5hbWUgdGhlIGdlbmVyYXRlZCBgT3BlcmF0aW9uc2AgYW5kIGBTdHJlYW1zYDsgdGhleSBhcmVcbiAqIHRoZSBjYWxsZXIncyBjbGFpbSwgdGhlIHNhbWUgd2F5IHRoZSBwcm92aWRlcidzIGBxZ2lzYCBwcm9wIHdhcyB0aGUgcGFnZSdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlUWdpc1NkazxPID0gT3BlcmF0aW9uTWFwLCBTID0gU3RyZWFtTWFwPigpOiBRZ2lzU2RrPE8sIFM+IHtcblx0Y29uc3Qgc2hhcmVkID0gdXNlU2hhcmVkKFwidXNlUWdpc1Nka1wiKTtcblx0aWYgKHNoYXJlZC5xZ2lzID09PSBudWxsKSB7XG5cdFx0dGhyb3cgbmV3IFFnaXNTZGtCcmlkZ2VSZWFjdEVycm9yKFxuXHRcdFx0XCJ1c2VRZ2lzU2RrIG5lZWRzIGEgQnJpZGdlUHJvdmlkZXIgZ2l2ZW4gYSBxZ2lzIGluc3RhbmNlXCIsXG5cdFx0KTtcblx0fVxuXHRyZXR1cm4gc2hhcmVkLnFnaXMgYXMgdW5rbm93biBhcyBRZ2lzU2RrPE8sIFM+O1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgZ2VuZXJhdGVkIG9wZXJhdGlvbiBtYXAgb25jZSBwZXIgY2xpZW50OiBgdXNlT3BlcmF0aW9ucyhjcmVhdGVPcGVyYXRpb25zKWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VPcGVyYXRpb25zPFQ+KGNyZWF0ZTogKGNsaWVudDogQnJpZGdlQ2xpZW50KSA9PiBUKTogVCB7XG5cdGNvbnN0IGNsaWVudCA9IHVzZUJyaWRnZUNsaWVudCgpO1xuXHRyZXR1cm4gdXNlTWVtbygoKSA9PiBjcmVhdGUoY2xpZW50KSwgW2NyZWF0ZSwgY2xpZW50XSk7XG59XG5cbi8qKiBDb250cm9scyBiZXlvbmQgcnVubmluZzogYWJvcnQgd2hhdCBpcyBpbiBmbGlnaHQsIG9yIGZvcmdldCB0aGUgb3V0Y29tZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3BlcmF0aW9uQ29udHJvbHMge1xuXHQvKiogQWJvcnQgdGhlIGluLWZsaWdodCBjYWxsIGxvY2FsbHk7IHRoZSBob3N0IG1heSBzdGlsbCBydW4gaXQuICovXG5cdGFib3J0KCk6IHZvaWQ7XG5cdC8qKiBCYWNrIHRvIGBpZGxlYCwgYWJvcnRpbmcgYW55dGhpbmcgaW4gZmxpZ2h0LiAqL1xuXHRyZXNldCgpOiB2b2lkO1xufVxuXG4vKiogUmVhZCBhbnkgc3RvcmUgZnJvbSBhIGNvbXBvbmVudDsgdGhlIHNuYXBzaG90IGlzIHRoZSByZW5kZXIncyB2YWx1ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VTdG9yZTxUPihzdG9yZTogU3RvcmU8VD4pOiBUIHtcblx0cmV0dXJuIHVzZVN5bmNFeHRlcm5hbFN0b3JlKFxuXHRcdHN0b3JlLnN1YnNjcmliZSxcblx0XHRzdG9yZS5nZXRTbmFwc2hvdCxcblx0XHRzdG9yZS5nZXRTbmFwc2hvdCxcblx0KTtcbn1cblxuLyoqXG4gKiBSdW4gYSBnZW5lcmF0ZWQgb3BlcmF0aW9uIGZyb20gYSBjb21wb25lbnQuXG4gKlxuICogYHJ1bmAgcmVzb2x2ZXMgd2l0aCB0aGUgdmFsdWUsIG9yIHdpdGggYHVuZGVmaW5lZGAgd2hlbiB0aGUgY2FsbCBmYWlsZWQsIHdhc1xuICogYWJvcnRlZCBvciB3YXMgc3VwZXJzZWRlZCBieSBhIGxhdGVyIHJ1biAtIHRoZSBzdGF0ZSBjYXJyaWVzIHRoZSBlcnJvciwgc29cbiAqIHRoZSBwcm9taXNlIG5ldmVyIHJlamVjdHMgaW50byBhbiBldmVudCBoYW5kbGVyLiBPbmx5IHRoZSBsYXRlc3QgcnVuIGNhblxuICogY2hhbmdlIHRoZSBzdGF0ZTsgdW5tb3VudGluZyBhYm9ydHMgd2hhdGV2ZXIgaXMgaW4gZmxpZ2h0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlT3BlcmF0aW9uPEksIFI+KFxuXHRvcGVyYXRpb246IE9wZXJhdGlvbjxJLCBSPixcbik6IHJlYWRvbmx5IFtcblx0T3BlcmF0aW9uU3RhdGU8Uj4sXG5cdChpbnB1dDogSSkgPT4gUHJvbWlzZTxSIHwgdW5kZWZpbmVkPixcblx0T3BlcmF0aW9uQ29udHJvbHMsXG5dIHtcblx0Y29uc3Qgc3RvcmUgPSB1c2VNZW1vKCgpID0+IG5ldyBPcGVyYXRpb25TdG9yZShvcGVyYXRpb24pLCBbb3BlcmF0aW9uXSk7XG5cdHVzZUVmZmVjdCgoKSA9PiAoKSA9PiBzdG9yZS5hYm9ydCgpLCBbc3RvcmVdKTtcblx0Y29uc3Qgc3RhdGUgPSB1c2VTdG9yZShzdG9yZSk7XG5cdGNvbnN0IGNvbnRyb2xzID0gdXNlTWVtbyhcblx0XHQoKSA9PiAoeyBhYm9ydDogc3RvcmUuYWJvcnQsIHJlc2V0OiBzdG9yZS5yZXNldCB9KSxcblx0XHRbc3RvcmVdLFxuXHQpO1xuXHRyZXR1cm4gW3N0YXRlLCBzdG9yZS5ydW4sIGNvbnRyb2xzXTtcbn1cblxuLyoqXG4gKiBIb2xkIGEgZ2VuZXJhdGVkIHN0cmVhbSBvcGVuIHdoaWxlIGEgY29tcG9uZW50IGlzIG1vdW50ZWQuXG4gKlxuICogVGhlIHN1YnNjcmlwdGlvbiBmb2xsb3dzIGBvcGVuYCBhbmQgdGhlICpjb250ZW50KiBvZiBgaW5wdXRgOiBhIG5ldyBvYmplY3RcbiAqIHdpdGggdGhlIHNhbWUgZmllbGRzIGRvZXMgbm90IHJlb3BlbiBpdCwgYSBkaWZmZXJlbnQgb25lIGNsb3NlcyB0aGUgb2xkXG4gKiBzdHJlYW0gYW5kIG9wZW5zIGEgbmV3IG9uZSwgYW5kIGBudWxsYCBjbG9zZXMgaXQuIEhhbmRsZXJzIGFyZSByZWFkIGZyZXNoXG4gKiBvbiBldmVyeSBmcmFtZSwgc28gYSBuZXcgY2xvc3VyZSBkb2VzIG5vdCByZW9wZW4gYW55dGhpbmcgZWl0aGVyLiBVbm1vdW50XG4gKiBjbG9zZXMgdGhlIHN0cmVhbSwgZXZlbiBpZiB0aGUgaG9zdCBoYXMgbm90IHlldCBhY2tub3dsZWRnZWQgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VTdHJlYW08SSwgRT4oXG5cdG9wZW46IFN0cmVhbTxJLCBFPixcblx0aW5wdXQ6IEkgfCBudWxsLFxuXHRoYW5kbGVyczogU3RyZWFtSGFuZGxlcnNMaWtlPEU+ID0ge30sXG4pOiBTdHJlYW1TdGF0ZTxFPiB7XG5cdGNvbnN0IHN0b3JlID0gdXNlTWVtbygoKSA9PiBuZXcgU3RyZWFtU3RvcmUob3BlbiksIFtvcGVuXSk7XG5cdHN0b3JlLnNldEhhbmRsZXJzKGhhbmRsZXJzKTtcblx0Ly8gVGhlIHN0b3JlIGtleXMgdGhlIGlucHV0IGJ5IGNvbnRlbnQsIHNvIGFuIGVmZmVjdCBwZXIgcmVuZGVyIGlzIGNoZWFwXG5cdC8vIGFuZCBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgc2FtZSBmaWVsZHMgcmVvcGVucyBub3RoaW5nLlxuXHR1c2VFZmZlY3QoKCkgPT4ge1xuXHRcdHN0b3JlLnNldElucHV0KGlucHV0KTtcblx0fSk7XG5cdHVzZUVmZmVjdCgoKSA9PiAoKSA9PiBzdG9yZS5jbG9zZSgpLCBbc3RvcmVdKTtcblx0cmV0dXJuIHVzZVN0b3JlKHN0b3JlKTtcbn1cblxuLyoqXG4gKiBUaGUgZm9ybSBvZiBvbmUgZGVjbGFyZWQgYWN0aW9uOiBgcWdpcy48aWQ+YCB3aXRoIGl0cyBmaWVsZHMsIHZhbHVlcyxcbiAqIGlzc3VlcyBhbmQgc3VibWlzc2lvbi4gVGhlIHN0b3JlIGlzIGJ1aWx0IG9uY2UgcGVyIGBxZ2lzYCBhbmQgYGlkYCAtIHRoZVxuICogb3B0aW9ucyBhcmUgcmVhZCBvbiB0aGUgZmlyc3QgcmVuZGVyIG9ubHksIGxpa2UgYHVzZVN0YXRlYCdzIGluaXRpYWwgdmFsdWVcbiAqIC0gYW5kIHVubW91bnRpbmcgYWJvcnRzIGEgc3VibWlzc2lvbiBpbiBmbGlnaHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VGb3JtPE8sIEsgZXh0ZW5kcyBrZXlvZiBPICYgc3RyaW5nPihcblx0cWdpczogUWdpc1Nka0NvcmU8TywgdW5rbm93bj4sXG5cdGlkOiBLLFxuXHRvcHRpb25zPzogRm9ybU9wdGlvbnMsXG4pOiByZWFkb25seSBbXG5cdEZvcm1TdGF0ZTxSZXN1bHRPZjxPLCBLPj4sXG5cdEZvcm1TdG9yZTxSZXF1ZXN0T2Y8TywgSz4gJiBvYmplY3QsIFJlc3VsdE9mPE8sIEs+Pixcbl0ge1xuXHRjb25zdCBbZmlyc3RdID0gdXNlU3RhdGUoKCkgPT4gb3B0aW9ucyA/PyB7fSk7XG5cdGNvbnN0IHN0b3JlID0gdXNlTWVtbyhcblx0XHQoKSA9PlxuXHRcdFx0bmV3IEZvcm1TdG9yZTxSZXF1ZXN0T2Y8TywgSz4gJiBvYmplY3QsIFJlc3VsdE9mPE8sIEs+Pihcblx0XHRcdFx0cWdpcyBhcyBRZ2lzU2RrQ29yZTx1bmtub3duLCB1bmtub3duPixcblx0XHRcdFx0aWQsXG5cdFx0XHRcdGZpcnN0LFxuXHRcdFx0KSxcblx0XHRbcWdpcywgaWQsIGZpcnN0XSxcblx0KTtcblx0Ly8gQWJvcnQsIG5vdCBkaXNwb3NlOiBTdHJpY3RNb2RlJ3Mgc2ltdWxhdGVkIHVubW91bnQga2VlcHMgdGhlIHN0b3JlLlxuXHR1c2VFZmZlY3QoKCkgPT4gKCkgPT4gc3RvcmUuYWJvcnQoKSwgW3N0b3JlXSk7XG5cdHJldHVybiBbdXNlU3RvcmUoc3RvcmUpLCBzdG9yZV07XG59XG5cbi8qKlxuICogUmVhZCBhIGhvc3QgcXVlcnkgc3RvcmU6IGB1c2VIb3N0UXVlcnkobGF5ZXJzUXVlcnkocWdpcykpYCBmb3IgYSBsYXllclxuICogcGlja2VyLiBgcmVmcmVzaGAgcnVucyBvbmNlIG9uIG1vdW50IHdoZW4gYGF1dG9gIGlzIG5vdCBgZmFsc2VgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlSG9zdFF1ZXJ5PFQ+KFxuXHRzdG9yZTogSG9zdFF1ZXJ5U3RvcmU8VD4sXG5cdG9wdGlvbnM6IHsgcmVhZG9ubHkgYXV0bz86IGJvb2xlYW4gfSA9IHt9LFxuKTogcmVhZG9ubHkgW0hvc3RRdWVyeVN0YXRlPFQ+LCBIb3N0UXVlcnlTdG9yZTxUPl0ge1xuXHRjb25zdCBhdXRvID0gb3B0aW9ucy5hdXRvICE9PSBmYWxzZTtcblx0dXNlRWZmZWN0KCgpID0+IHtcblx0XHRpZiAoYXV0bykge1xuXHRcdFx0dm9pZCBzdG9yZS5yZWZyZXNoKCk7XG5cdFx0fVxuXHRcdHJldHVybiAoKSA9PiBzdG9yZS5hYm9ydCgpO1xuXHR9LCBbc3RvcmUsIGF1dG9dKTtcblx0cmV0dXJuIFt1c2VTdG9yZShzdG9yZSksIHN0b3JlXTtcbn1cblxudHlwZSBSZXF1ZXN0T2Y8TywgSyBleHRlbmRzIGtleW9mIE8+ID0gT1tLXSBleHRlbmRzIHtcblx0cmVhZG9ubHkgcmVxdWVzdDogaW5mZXIgUmVxO1xufVxuXHQ/IFJlcVxuXHQ6IG5ldmVyO1xudHlwZSBSZXN1bHRPZjxPLCBLIGV4dGVuZHMga2V5b2YgTz4gPSBPW0tdIGV4dGVuZHMge1xuXHRyZWFkb25seSByZXN1bHQ6IGluZmVyIFJlcztcbn1cblx0PyBSZXNcblx0OiBuZXZlcjtcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7QUFtQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBOENPLE1BQU0sZ0NBQWdDLGNBQWE7QUFBQSxFQUNsRCxXQUFXLENBQUMsU0FBaUI7QUFBQSxJQUNuQyxNQUFNLFNBQVMsZUFBZTtBQUFBO0FBRWhDO0FBT0EsSUFBTSxnQkFBZ0IsY0FBNkIsSUFBSTtBQTZCaEQsU0FBUyxjQUFjLENBQUMsT0FBMEM7QUFBQSxFQUN4RSxRQUFRLE1BQU0sUUFBUSxXQUFXLFNBQVMsYUFBYTtBQUFBLEVBQ3ZELE1BQU0sUUFBUSxDQUFDLE1BQU0sUUFBUSxTQUFTLEVBQUUsT0FDdkMsQ0FBQyxXQUFXLFdBQVcsU0FDeEIsRUFBRTtBQUFBLEVBQ0YsSUFBSSxVQUFVLEdBQUc7QUFBQSxJQUNoQixNQUFNLElBQUksd0JBQ1QsK0RBQ0Q7QUFBQSxFQUNEO0FBQUEsRUFDQSxNQUFNLFlBQVksU0FBUztBQUFBLEVBQzNCLE9BQU8sT0FBTyxZQUFZLFNBQThCLElBQUk7QUFBQSxFQUM1RCxVQUFVLE1BQU07QUFBQSxJQUNmLElBQUksY0FBYyxXQUFXO0FBQUEsTUFDNUI7QUFBQSxJQUNEO0FBQUEsSUFDQSxNQUFNLE9BQU8sSUFBSSxjQUNoQixXQUNBLGNBQWMsWUFBWSxDQUFDLElBQUksRUFBRSxVQUFVLENBQzVDO0FBQUEsSUFDQSxTQUFTLElBQUk7QUFBQSxJQUNiLE9BQU8sTUFBTTtBQUFBLE1BQ1osS0FBSyxNQUFNO0FBQUEsTUFDWCxTQUFTLENBQUMsWUFBYSxZQUFZLE9BQU8sT0FBTyxPQUFRO0FBQUE7QUFBQSxLQUV4RCxDQUFDLFdBQVcsU0FBUyxDQUFDO0FBQUEsRUFDekIsTUFBTSxRQUFRLFFBQVEsTUFBcUI7QUFBQSxJQUMxQyxJQUFJLFNBQVMsV0FBVztBQUFBLE1BQ3ZCLE9BQU8sRUFBRSxRQUFRLEtBQUssUUFBUSxLQUFLO0FBQUEsSUFDcEM7QUFBQSxJQUNBLE1BQU0sT0FBTyxVQUFVO0FBQUEsSUFDdkIsT0FBTyxTQUFTLE9BQU8sT0FBTyxFQUFFLFFBQVEsTUFBTSxNQUFNLEtBQUs7QUFBQSxLQUN2RCxDQUFDLE1BQU0sUUFBUSxLQUFLLENBQUM7QUFBQSxFQUN4QixPQUFPLGNBQ04sY0FBYyxVQUNkLEVBQUUsTUFBTSxHQUNSLFVBQVUsT0FBTyxPQUFPLFFBQ3pCO0FBQUE7QUFHRCxTQUFTLFNBQVMsQ0FBQyxNQUFzQjtBQUFBLEVBQ3hDLE1BQU0sU0FBUyxXQUFXLGFBQWE7QUFBQSxFQUN2QyxJQUFJLFdBQVcsTUFBTTtBQUFBLElBQ3BCLE1BQU0sSUFBSSx3QkFDVCxHQUFHLHNDQUNKO0FBQUEsRUFDRDtBQUFBLEVBQ0EsT0FBTztBQUFBO0FBSUQsU0FBUyxlQUFlLEdBQWlCO0FBQUEsRUFDL0MsT0FBTyxVQUFVLGlCQUFpQixFQUFFO0FBQUE7QUFTOUIsU0FBUyxVQUEyQyxHQUFrQjtBQUFBLEVBQzVFLE1BQU0sU0FBUyxVQUFVLFlBQVk7QUFBQSxFQUNyQyxJQUFJLE9BQU8sU0FBUyxNQUFNO0FBQUEsSUFDekIsTUFBTSxJQUFJLHdCQUNULHlEQUNEO0FBQUEsRUFDRDtBQUFBLEVBQ0EsT0FBTyxPQUFPO0FBQUE7QUFNUixTQUFTLGFBQWdCLENBQUMsUUFBd0M7QUFBQSxFQUN4RSxNQUFNLFNBQVMsZ0JBQWdCO0FBQUEsRUFDL0IsT0FBTyxRQUFRLE1BQU0sT0FBTyxNQUFNLEdBQUcsQ0FBQyxRQUFRLE1BQU0sQ0FBQztBQUFBO0FBWS9DLFNBQVMsUUFBVyxDQUFDLE9BQW9CO0FBQUEsRUFDL0MsT0FBTyxxQkFDTixNQUFNLFdBQ04sTUFBTSxhQUNOLE1BQU0sV0FDUDtBQUFBO0FBV00sU0FBUyxZQUFrQixDQUNqQyxXQUtDO0FBQUEsRUFDRCxNQUFNLFFBQVEsUUFBUSxNQUFNLElBQUksZ0JBQWUsU0FBUyxHQUFHLENBQUMsU0FBUyxDQUFDO0FBQUEsRUFDdEUsVUFBVSxNQUFNLE1BQU0sTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUM7QUFBQSxFQUM1QyxNQUFNLFFBQVEsU0FBUyxLQUFLO0FBQUEsRUFDNUIsTUFBTSxXQUFXLFFBQ2hCLE9BQU8sRUFBRSxPQUFPLE1BQU0sT0FBTyxPQUFPLE1BQU0sTUFBTSxJQUNoRCxDQUFDLEtBQUssQ0FDUDtBQUFBLEVBQ0EsT0FBTyxDQUFDLE9BQU8sTUFBTSxLQUFLLFFBQVE7QUFBQTtBQVk1QixTQUFTLFNBQWUsQ0FDOUIsTUFDQSxPQUNBLFdBQWtDLENBQUMsR0FDbEI7QUFBQSxFQUNqQixNQUFNLFFBQVEsUUFBUSxNQUFNLElBQUksYUFBWSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFBQSxFQUN6RCxNQUFNLFlBQVksUUFBUTtBQUFBLEVBRzFCLFVBQVUsTUFBTTtBQUFBLElBQ2YsTUFBTSxTQUFTLEtBQUs7QUFBQSxHQUNwQjtBQUFBLEVBQ0QsVUFBVSxNQUFNLE1BQU0sTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUM7QUFBQSxFQUM1QyxPQUFPLFNBQVMsS0FBSztBQUFBO0FBU2YsU0FBUyxPQUFzQyxDQUNyRCxNQUNBLElBQ0EsU0FJQztBQUFBLEVBQ0QsT0FBTyxTQUFTLFNBQVMsTUFBTSxXQUFXLENBQUMsQ0FBQztBQUFBLEVBQzVDLE1BQU0sUUFBUSxRQUNiLE1BQ0MsSUFBSSxXQUNILE1BQ0EsSUFDQSxLQUNELEdBQ0QsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUNqQjtBQUFBLEVBRUEsVUFBVSxNQUFNLE1BQU0sTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUM7QUFBQSxFQUM1QyxPQUFPLENBQUMsU0FBUyxLQUFLLEdBQUcsS0FBSztBQUFBO0FBT3hCLFNBQVMsWUFBZSxDQUM5QixPQUNBLFVBQXVDLENBQUMsR0FDVTtBQUFBLEVBQ2xELE1BQU0sT0FBTyxRQUFRLFNBQVM7QUFBQSxFQUM5QixVQUFVLE1BQU07QUFBQSxJQUNmLElBQUksTUFBTTtBQUFBLE1BQ0osTUFBTSxRQUFRO0FBQUEsSUFDcEI7QUFBQSxJQUNBLE9BQU8sTUFBTSxNQUFNLE1BQU07QUFBQSxLQUN2QixDQUFDLE9BQU8sSUFBSSxDQUFDO0FBQUEsRUFDaEIsT0FBTyxDQUFDLFNBQVMsS0FBSyxHQUFHLEtBQUs7QUFBQTsiLAogICJkZWJ1Z0lkIjogIkQwRTkwNTVGRkIyMDk2MTE2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9