@archont561/qgis-sdk 0.3.0 → 0.5.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/dist/react.d.ts CHANGED
@@ -1,116 +1,26 @@
1
+ import { WireTransport2, BridgeClientOptions2, BridgeClient2 } from "./shared/chunk-wtv4vt4q.js";
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";
5
+ import { QgisSdkError2 } from "./shared/chunk-pdj2fxjb.js";
1
6
  import { ReactElement, ReactNode } from "react";
2
- /**
3
- * Base class for expected SDK errors across the bridge boundary.
4
- */
5
- declare class QgisSdkError extends Error {
6
- readonly code: string;
7
- constructor(message: string, code?: string);
8
- }
9
- /** The kinds of event a stream may carry; only `progress` may be coalesced. */
10
- type StreamEventKind2 = "data" | "progress" | "state";
11
- /** Why a subscription stopped. */
12
- type StreamTerminalKind = "complete" | "error" | "cancelled" | "gap" | "disposed";
13
- /** One event on a subscription. */
14
- interface BridgeStreamEvent {
15
- readonly kind: StreamEventKind2;
16
- readonly payload: unknown;
17
- }
18
- /** The end of a subscription, as the host described it. */
19
- interface BridgeStreamTerminal {
20
- readonly kind: StreamTerminalKind;
21
- readonly message?: string;
22
- readonly dropped?: number;
23
- }
24
- /** The transport a client speaks through; a QWebChannel adapter or a script. */
25
- interface WireTransport {
26
- send(message: unknown): void;
27
- subscribe(listener: (message: unknown) => void): () => void;
28
- }
29
- /** Options for {@link BridgeClient}. */
30
- interface BridgeClientOptions {
31
- readonly timeoutMs?: number;
32
- }
33
- /** Options for one invocation. */
34
- interface InvokeOptions {
35
- readonly signal?: AbortSignal;
36
- }
37
- /** Callbacks a subscription reports through. */
38
- interface SubscriptionHandlers {
39
- readonly onEvent?: (event: BridgeStreamEvent) => void;
40
- readonly onTerminal?: (terminal: BridgeStreamTerminal) => void;
41
- }
42
- /** A live subscription, as the caller holds it. */
43
- interface BridgeSubscription {
44
- readonly id: string;
45
- readonly closed: boolean;
46
- close(): void;
47
- }
48
- /**
49
- * Correlate invocations with replies over an injected transport.
50
- *
51
- * The client never retries: a timeout, an abort and a closed client are three
52
- * different answers, and each is reported as itself.
53
- */
54
- declare class BridgeClient {
55
- private readonly transport;
56
- private readonly timeoutMs;
57
- private readonly pending;
58
- private readonly subscriptions;
59
- private readonly disposals;
60
- private readonly unsubscribe;
61
- private counter;
62
- private closed;
63
- private unmatched;
64
- private breaks;
65
- private lastProtocolError;
66
- constructor(transport: WireTransport, options?: BridgeClientOptions);
67
- /** Whether {@link close} has run; a closed client answers nothing. */
68
- get isClosed(): boolean;
69
- /** Replies that named no pending call: a late duplicate, or a stray message. */
70
- get unmatchedReplies(): number;
71
- /** Number of calls still waiting for a reply. */
72
- get pendingCalls(): number;
73
- /**
74
- * Invoke one operation and settle with its value or with a typed failure.
75
- */
76
- invoke(operation: string, payload?: Readonly<Record<string, unknown>>, options?: InvokeOptions): Promise<unknown>;
77
- /**
78
- * Open a subscription and resolve once the host has acknowledged it.
79
- *
80
- * Frames are matched to the subscription by id and by sequence; a frame that
81
- * does not continue the sequence ends the subscription instead of being
82
- * delivered out of order.
83
- */
84
- subscribe(operation: string, payload?: Readonly<Record<string, unknown>>, handlers?: SubscriptionHandlers, options?: InvokeOptions): Promise<BridgeSubscription>;
85
- /** Subscriptions still open; a leak check for callers and tests. */
86
- get activeSubscriptions(): readonly string[];
87
- /** Frames that did not continue their subscription's sequence. */
88
- get sequenceBreaks(): number;
89
- private send;
90
- /**
91
- * Refuse further calls, reject what is still pending, and stop listening.
92
- */
93
- close(): void;
94
- private settle;
95
- private handle;
96
- private handleFrame;
97
- private endSubscription;
98
- private disposeSubscription;
99
- /** The last malformed message this client refused, if any. */
100
- get protocolError(): Error | null;
101
- }
102
7
  /** A hook or provider was used outside the shape it needs. */
103
- declare class QgisSdkBridgeReactError extends QgisSdkError {
8
+ declare class QgisSdkBridgeReactError extends QgisSdkError2 {
104
9
  constructor(message: string);
105
10
  }
106
- /** Props for {@link BridgeProvider}: exactly one of `client` or `transport`. */
11
+ /** Props for {@link BridgeProvider}: exactly one of `qgis`, `client` or `transport`. */
107
12
  interface BridgeProviderProps {
13
+ /**
14
+ * A `QgisSdk` the page built, whatever its schema; the provider shares it
15
+ * and never closes it. `useQgisSdk` hands it back under the page's types.
16
+ */
17
+ readonly qgis?: QgisSdkCore2<unknown, unknown>;
108
18
  /** A client the caller owns; the provider never closes it. */
109
- readonly client?: BridgeClient;
19
+ readonly client?: BridgeClient2;
110
20
  /** A transport the provider builds and owns a client for. */
111
- readonly transport?: WireTransport;
21
+ readonly transport?: WireTransport2;
112
22
  /** Options for the owned client; ignored when `client` is given. */
113
- readonly options?: BridgeClientOptions;
23
+ readonly options?: BridgeClientOptions2;
114
24
  readonly children?: ReactNode;
115
25
  }
116
26
  /**
@@ -126,23 +36,21 @@ interface BridgeProviderProps {
126
36
  */
127
37
  declare function BridgeProvider(props: BridgeProviderProps): ReactElement;
128
38
  /** The client of the nearest {@link BridgeProvider}. */
129
- declare function useBridgeClient(): BridgeClient;
39
+ declare function useBridgeClient(): BridgeClient2;
40
+ /**
41
+ * The `QgisSdk` of the nearest {@link BridgeProvider}.
42
+ *
43
+ * The type parameters name the generated `Operations` and `Streams`; they are
44
+ * the caller's claim, the same way the provider's `qgis` prop was the page's.
45
+ */
46
+ declare function useQgisSdk<
47
+ O = OperationMap2,
48
+ S = StreamMap2
49
+ >(): QgisSdk2<O, S>;
130
50
  /**
131
51
  * Build a generated operation map once per client: `useOperations(createOperations)`.
132
52
  */
133
- declare function useOperations<T>(create: (client: BridgeClient) => T): T;
134
- /** Where one invocation stands. */
135
- type OperationState<R> = {
136
- readonly status: "idle";
137
- } | {
138
- readonly status: "pending";
139
- } | {
140
- readonly status: "ok";
141
- readonly value: R;
142
- } | {
143
- readonly status: "error";
144
- readonly error: Error;
145
- };
53
+ declare function useOperations<T>(create: (client: BridgeClient2) => T): T;
146
54
  /** Controls beyond running: abort what is in flight, or forget the outcome. */
147
55
  interface OperationControls {
148
56
  /** Abort the in-flight call locally; the host may still run it. */
@@ -150,13 +58,8 @@ interface OperationControls {
150
58
  /** Back to `idle`, aborting anything in flight. */
151
59
  reset(): void;
152
60
  }
153
- /** An operation member of a generated map: input, optional signal, promise. */
154
- type Operation<
155
- I,
156
- R
157
- > = (input: I, options?: {
158
- readonly signal?: AbortSignal;
159
- }) => Promise<R>;
61
+ /** Read any store from a component; the snapshot is the render's value. */
62
+ declare function useStore<T>(store: Store2<T>): T;
160
63
  /**
161
64
  * Run a generated operation from a component.
162
65
  *
@@ -168,39 +71,7 @@ type Operation<
168
71
  declare function useOperation<
169
72
  I,
170
73
  R
171
- >(operation: Operation<I, R>): readonly [OperationState<R>, (input: I) => Promise<R | undefined>, OperationControls];
172
- /** How a stream ended, as the generated module reports it. */
173
- interface StreamTerminalLike {
174
- readonly kind: string;
175
- readonly message?: string;
176
- readonly dropped?: number;
177
- }
178
- /** The handle a generated stream member resolves with. */
179
- interface StreamHandleLike {
180
- readonly id: string;
181
- readonly closed: boolean;
182
- close(): void;
183
- }
184
- /** Handlers for a stream, as a generated module types them. */
185
- interface StreamHandlersLike<E> {
186
- readonly onEvent?: (event: E) => void;
187
- readonly onTerminal?: (terminal: StreamTerminalLike) => void;
188
- }
189
- /** A stream member of a generated map. */
190
- type Stream<
191
- I,
192
- E
193
- > = (input: I, handlers: StreamHandlersLike<E>, options?: {
194
- readonly signal?: AbortSignal;
195
- }) => Promise<StreamHandleLike>;
196
- /** Where one subscription stands. */
197
- interface StreamState<E> {
198
- /** `idle` with a null input, `failed` when the host refused to open it. */
199
- readonly status: "idle" | "opening" | "open" | "ended" | "failed";
200
- readonly lastEvent: E | null;
201
- readonly terminal: StreamTerminalLike | null;
202
- readonly error: Error | null;
203
- }
74
+ >(operation: Operation2<I, R>): readonly [OperationState2<R>, (input: I) => Promise<R | undefined>, OperationControls];
204
75
  /**
205
76
  * Hold a generated stream open while a component is mounted.
206
77
  *
@@ -213,5 +84,34 @@ interface StreamState<E> {
213
84
  declare function useStream<
214
85
  I,
215
86
  E
216
- >(open: Stream<I, E>, input: I | null, handlers?: StreamHandlersLike<E>): StreamState<E>;
217
- export { BridgeProvider, BridgeProviderProps, Operation, OperationControls, OperationState, QgisSdkBridgeReactError, Stream, StreamHandleLike, StreamHandlersLike, StreamState, StreamTerminalLike, useBridgeClient, useOperation, useOperations, useStream };
87
+ >(open: Stream2<I, E>, input: I | null, handlers?: StreamHandlersLike2<E>): StreamState2<E>;
88
+ /**
89
+ * The form of one declared action: `qgis.<id>` with its fields, values,
90
+ * issues and submission. The store is built once per `qgis` and `id` - the
91
+ * options are read on the first render only, like `useState`'s initial value
92
+ * - and unmounting aborts a submission in flight.
93
+ */
94
+ declare function useForm<
95
+ O,
96
+ K extends keyof O & string
97
+ >(qgis: QgisSdkCore2<O, unknown>, id: K, options?: FormOptions2): readonly [FormState2<ResultOf<O, K>>, FormStore2<RequestOf<O, K> & object, ResultOf<O, K>>];
98
+ /**
99
+ * Read a host query store: `useHostQuery(layersQuery(qgis))` for a layer
100
+ * picker. `refresh` runs once on mount when `auto` is not `false`.
101
+ */
102
+ declare function useHostQuery<T>(store: HostQueryStore2<T>, options?: {
103
+ readonly auto?: boolean;
104
+ }): readonly [HostQueryState2<T>, HostQueryStore2<T>];
105
+ type RequestOf<
106
+ O,
107
+ K extends keyof O
108
+ > = O[K] extends {
109
+ readonly request: infer Req;
110
+ } ? Req : never;
111
+ type ResultOf<
112
+ O,
113
+ K extends keyof O
114
+ > = O[K] extends {
115
+ readonly result: infer Res;
116
+ } ? Res : never;
117
+ export { BridgeProvider, BridgeProviderProps, Operation2 as Operation, OperationControls, OperationState2 as OperationState, QgisSdkBridgeReactError, Stream2 as Stream, StreamHandleLike2 as StreamHandleLike, StreamHandlersLike2 as StreamHandlersLike, StreamState2 as StreamState, StreamTerminalLike2 as StreamTerminalLike, useBridgeClient, useForm, useHostQuery, useOperation, useOperations, useQgisSdk, useStore, useStream };
package/dist/react.js CHANGED
@@ -1,22 +1,24 @@
1
1
  import {
2
- QgisSdkError2,
3
- isPlainRecord2
4
- } from "./shared/chunk-0fknax6w.js";
5
- import {
6
- QgisSdkBridgeAbortedError2,
7
2
  BridgeClient2
8
- } from "./shared/chunk-a7bjgeve.js";
3
+ } from "./shared/chunk-8gawbn19.js";
4
+ import {
5
+ OperationStore2,
6
+ StreamStore2,
7
+ FormStore2
8
+ } from "./shared/chunk-t1vpt5yq.js";
9
+ import {
10
+ QgisSdkError2
11
+ } from "./shared/chunk-2hwva3a3.js";
9
12
 
10
13
  // src/react.ts
11
14
  import {
12
15
  createContext,
13
16
  createElement,
14
- useCallback,
15
17
  useContext,
16
18
  useEffect,
17
19
  useMemo,
18
- useRef,
19
- useState
20
+ useState,
21
+ useSyncExternalStore
20
22
  } from "react";
21
23
  class QgisSdkBridgeReactError extends QgisSdkError2 {
22
24
  constructor(message) {
@@ -25,9 +27,10 @@ class QgisSdkBridgeReactError extends QgisSdkError2 {
25
27
  }
26
28
  var ClientContext = createContext(null);
27
29
  function BridgeProvider(props) {
28
- const { client, transport, options, children } = props;
29
- if (client === undefined === (transport === undefined)) {
30
- throw new QgisSdkBridgeReactError("BridgeProvider needs exactly one of client or transport");
30
+ const { qgis, client, transport, options, children } = props;
31
+ const given = [qgis, client, transport].filter((source) => source !== undefined).length;
32
+ if (given !== 1) {
33
+ throw new QgisSdkBridgeReactError("BridgeProvider needs exactly one of qgis, client or transport");
31
34
  }
32
35
  const timeoutMs = options?.timeoutMs;
33
36
  const [owned, setOwned] = useState(null);
@@ -42,155 +45,83 @@ function BridgeProvider(props) {
42
45
  setOwned((current) => current === live ? null : current);
43
46
  };
44
47
  }, [transport, timeoutMs]);
45
- const value = client ?? owned;
48
+ const value = useMemo(() => {
49
+ if (qgis !== undefined) {
50
+ return { client: qgis.client, qgis };
51
+ }
52
+ const live = client ?? owned;
53
+ return live === null ? null : { client: live, qgis: null };
54
+ }, [qgis, client, owned]);
46
55
  return createElement(ClientContext.Provider, { value }, value === null ? null : children);
47
56
  }
57
+ function useShared(hook) {
58
+ const shared = useContext(ClientContext);
59
+ if (shared === null) {
60
+ throw new QgisSdkBridgeReactError(`${hook} needs a BridgeProvider above it`);
61
+ }
62
+ return shared;
63
+ }
48
64
  function useBridgeClient() {
49
- const client = useContext(ClientContext);
50
- if (client === null) {
51
- throw new QgisSdkBridgeReactError("useBridgeClient needs a BridgeProvider above it");
65
+ return useShared("useBridgeClient").client;
66
+ }
67
+ function useQgisSdk() {
68
+ const shared = useShared("useQgisSdk");
69
+ if (shared.qgis === null) {
70
+ throw new QgisSdkBridgeReactError("useQgisSdk needs a BridgeProvider given a qgis instance");
52
71
  }
53
- return client;
72
+ return shared.qgis;
54
73
  }
55
74
  function useOperations(create) {
56
75
  const client = useBridgeClient();
57
76
  return useMemo(() => create(client), [create, client]);
58
77
  }
59
- var IDLE = Object.freeze({ status: "idle" });
60
- var PENDING = Object.freeze({ status: "pending" });
78
+ function useStore(store) {
79
+ return useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot);
80
+ }
61
81
  function useOperation(operation) {
62
- const [state, setState] = useState(IDLE);
63
- const generation = useRef(0);
64
- const controller = useRef(null);
65
- const mounted = useRef(true);
66
- const abort = useCallback(() => {
67
- generation.current += 1;
68
- controller.current?.abort();
69
- controller.current = null;
70
- }, []);
82
+ const store = useMemo(() => new OperationStore2(operation), [operation]);
83
+ useEffect(() => () => store.abort(), [store]);
84
+ const state = useStore(store);
85
+ const controls = useMemo(() => ({ abort: store.abort, reset: store.reset }), [store]);
86
+ return [state, store.run, controls];
87
+ }
88
+ function useStream(open, input, handlers = {}) {
89
+ const store = useMemo(() => new StreamStore2(open), [open]);
90
+ store.setHandlers(handlers);
71
91
  useEffect(() => {
72
- mounted.current = true;
73
- return () => {
74
- mounted.current = false;
75
- abort();
76
- };
77
- }, [abort]);
78
- const run = useCallback(async (input) => {
79
- abort();
80
- const mine = generation.current;
81
- const signal = new AbortController;
82
- controller.current = signal;
83
- setState(PENDING);
84
- try {
85
- const value = await operation(input, { signal: signal.signal });
86
- if (generation.current !== mine || !mounted.current) {
87
- return;
88
- }
89
- setState({ status: "ok", value });
90
- return value;
91
- } catch (error) {
92
- if (generation.current !== mine || !mounted.current) {
93
- return;
94
- }
95
- if (error instanceof QgisSdkBridgeAbortedError2) {
96
- return;
97
- }
98
- setState({
99
- status: "error",
100
- error: error instanceof Error ? error : new Error(String(error))
101
- });
102
- return;
103
- } finally {
104
- if (controller.current === signal) {
105
- controller.current = null;
106
- }
107
- }
108
- }, [operation, abort]);
109
- const reset = useCallback(() => {
110
- abort();
111
- setState(IDLE);
112
- }, [abort]);
113
- const controls = useMemo(() => ({ abort, reset }), [abort, reset]);
114
- return [state, run, controls];
92
+ store.setInput(input);
93
+ });
94
+ useEffect(() => () => store.close(), [store]);
95
+ return useStore(store);
115
96
  }
116
- var IDLE_STREAM = Object.freeze({
117
- status: "idle",
118
- lastEvent: null,
119
- terminal: null,
120
- error: null
121
- });
122
- function stableKey(value) {
123
- return JSON.stringify(value, (_key, item) => isPlainRecord2(item) ? Object.fromEntries(Object.entries(item).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0)) : item);
97
+ function useForm(qgis, id, options) {
98
+ const [first] = useState(() => options ?? {});
99
+ const store = useMemo(() => new FormStore2(qgis, id, first), [qgis, id, first]);
100
+ useEffect(() => () => store.abort(), [store]);
101
+ return [useStore(store), store];
124
102
  }
125
- function useStream(open, input, handlers = {}) {
126
- const [state, setState] = useState(IDLE_STREAM);
127
- const latest = useRef(handlers);
128
- latest.current = handlers;
129
- const key = input === null ? null : stableKey(input);
130
- const inputRef = useRef(input);
131
- inputRef.current = input;
103
+ function useHostQuery(store, options = {}) {
104
+ const auto = options.auto !== false;
132
105
  useEffect(() => {
133
- if (key === null) {
134
- setState(IDLE_STREAM);
135
- return;
106
+ if (auto) {
107
+ store.refresh();
136
108
  }
137
- const current = inputRef.current;
138
- let cancelled = false;
139
- let handle = null;
140
- setState({
141
- status: "opening",
142
- lastEvent: null,
143
- terminal: null,
144
- error: null
145
- });
146
- open(current, {
147
- onEvent: (event) => {
148
- if (cancelled) {
149
- return;
150
- }
151
- latest.current.onEvent?.(event);
152
- setState((previous) => ({ ...previous, lastEvent: event }));
153
- },
154
- onTerminal: (terminal) => {
155
- if (cancelled) {
156
- return;
157
- }
158
- latest.current.onTerminal?.(terminal);
159
- setState((previous) => ({ ...previous, status: "ended", terminal }));
160
- }
161
- }).then((opened) => {
162
- if (cancelled) {
163
- opened.close();
164
- return;
165
- }
166
- handle = opened;
167
- setState((previous) => previous.status === "ended" ? previous : { ...previous, status: "open" });
168
- }, (error) => {
169
- if (cancelled) {
170
- return;
171
- }
172
- setState({
173
- status: "failed",
174
- lastEvent: null,
175
- terminal: null,
176
- error: error instanceof Error ? error : new Error(String(error))
177
- });
178
- });
179
- return () => {
180
- cancelled = true;
181
- handle?.close();
182
- };
183
- }, [open, key]);
184
- return state;
109
+ return () => store.abort();
110
+ }, [store, auto]);
111
+ return [useStore(store), store];
185
112
  }
186
113
  export {
187
114
  BridgeProvider,
188
115
  QgisSdkBridgeReactError,
189
116
  useBridgeClient,
117
+ useForm,
118
+ useHostQuery,
190
119
  useOperation,
191
120
  useOperations,
121
+ useQgisSdk,
122
+ useStore,
192
123
  useStream
193
124
  };
194
125
 
195
- //# debugId=B9173116D0A8AD4364756E2164756E21
196
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL3JlYWN0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIi8qKlxuICogVGhpbiBSZWFjdCBiaW5kaW5ncyBvdmVyIHRoZSBicmlkZ2UgY2xpZW50IChUQVNLLTE4LCBkZWNpc2lvbi0xOCkuXG4gKlxuICogVGhpcyBlbnRyeSBwb2ludCBpcyBvcHRpb25hbCBhbmQgaXMgdGhlIG9ubHkgb25lIHRoYXQgaW1wb3J0cyBSZWFjdC4gSXQgYWRkc1xuICogbm8gc2Vjb25kIGNsaWVudDogYSBjb21wb25lbnQgcmVhY2hlcyB0aGUgc2FtZSBgQnJpZGdlQ2xpZW50YCBhIHZhbmlsbGEgcGFnZVxuICogd291bGQgYnVpbGQsIHRocm91Z2ggYSBwcm92aWRlciB0aGF0IGVpdGhlciBvd25zIG9uZSAoYW5kIGNsb3NlcyBpdCBvblxuICogdW5tb3VudCkgb3IgaXMgaGFuZGVkIG9uZSAoYW5kIGxlYXZlcyBpdCBhbG9uZSkuIFRoZSBob29rcyB0YWtlIHRoZVxuICogZnVuY3Rpb25zIGEgZ2VuZXJhdGVkIG1vZHVsZSBhbHJlYWR5IGV4cG9ydHMgLSBgb3BlcmF0aW9ucy5zaXRlcy5zdW1tYXJ5YCxcbiAqIGBvcGVyYXRpb25zLnNpdGVzLndhdGNoYCAtIHNvIHRoZSB0eXBlZCBjb250cmFjdCBpcyB0aGUgZ2VuZXJhdGVkIG9uZSwgbm90IGFcbiAqIFJlYWN0IGNvcHkgb2YgaXQuXG4gKlxuICogV2hhdCB0aGUgaG9va3MgYWRkIGlzIGxpZmV0aW1lOiBhIGNhbGwgYWJvcnRlZCB3aGVuIGl0cyBjb21wb25lbnQgdW5tb3VudHMsXG4gKiBhIHN0YWxlIHJlcGx5IGlnbm9yZWQsIGEgc3RyZWFtIGNsb3NlZCBvbiB1bm1vdW50IG9yIHdoZW4gaXRzIGlucHV0IGNoYW5nZXMsXG4gKiBhbmQgYSBzaW11bGF0ZWQgU3RyaWN0TW9kZSByZW1vdW50IHRoYXQgbGVhdmVzIGV4YWN0bHkgb25lIG9mIGVhY2guXG4gKi9cblxuaW1wb3J0IHtcblx0Y3JlYXRlQ29udGV4dCxcblx0Y3JlYXRlRWxlbWVudCxcblx0dHlwZSBSZWFjdEVsZW1lbnQsXG5cdHR5cGUgUmVhY3ROb2RlLFxuXHR1c2VDYWxsYmFjayxcblx0dXNlQ29udGV4dCxcblx0dXNlRWZmZWN0LFxuXHR1c2VNZW1vLFxuXHR1c2VSZWYsXG5cdHVzZVN0YXRlLFxufSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7XG5cdEJyaWRnZUNsaWVudCxcblx0dHlwZSBCcmlkZ2VDbGllbnRPcHRpb25zLFxuXHRRZ2lzU2RrQnJpZGdlQWJvcnRlZEVycm9yLFxuXHR0eXBlIFdpcmVUcmFuc3BvcnQsXG59IGZyb20gXCIuL2JyaWRnZVwiO1xuaW1wb3J0IHsgaXNQbGFpblJlY29yZCwgUWdpc1Nka0Vycm9yIH0gZnJvbSBcIi4vaW5kZXhcIjtcblxuLyoqIEEgaG9vayBvciBwcm92aWRlciB3YXMgdXNlZCBvdXRzaWRlIHRoZSBzaGFwZSBpdCBuZWVkcy4gKi9cbmV4cG9ydCBjbGFzcyBRZ2lzU2RrQnJpZGdlUmVhY3RFcnJvciBleHRlbmRzIFFnaXNTZGtFcnJvciB7XG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcblx0XHRzdXBlcihtZXNzYWdlLCBcInJlYWN0X2JpbmRpbmdcIik7XG5cdH1cbn1cblxuY29uc3QgQ2xpZW50Q29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8QnJpZGdlQ2xpZW50IHwgbnVsbD4obnVsbCk7XG5cbi8qKiBQcm9wcyBmb3Ige0BsaW5rIEJyaWRnZVByb3ZpZGVyfTogZXhhY3RseSBvbmUgb2YgYGNsaWVudGAgb3IgYHRyYW5zcG9ydGAuICovXG5leHBvcnQgaW50ZXJmYWNlIEJyaWRnZVByb3ZpZGVyUHJvcHMge1xuXHQvKiogQSBjbGllbnQgdGhlIGNhbGxlciBvd25zOyB0aGUgcHJvdmlkZXIgbmV2ZXIgY2xvc2VzIGl0LiAqL1xuXHRyZWFkb25seSBjbGllbnQ/OiBCcmlkZ2VDbGllbnQ7XG5cdC8qKiBBIHRyYW5zcG9ydCB0aGUgcHJvdmlkZXIgYnVpbGRzIGFuZCBvd25zIGEgY2xpZW50IGZvci4gKi9cblx0cmVhZG9ubHkgdHJhbnNwb3J0PzogV2lyZVRyYW5zcG9ydDtcblx0LyoqIE9wdGlvbnMgZm9yIHRoZSBvd25lZCBjbGllbnQ7IGlnbm9yZWQgd2hlbiBgY2xpZW50YCBpcyBnaXZlbi4gKi9cblx0cmVhZG9ubHkgb3B0aW9ucz86IEJyaWRnZUNsaWVudE9wdGlvbnM7XG5cdHJlYWRvbmx5IGNoaWxkcmVuPzogUmVhY3ROb2RlO1xufVxuXG4vKipcbiAqIFNoYXJlIG9uZSBjbGllbnQgd2l0aCBhIHN1YnRyZWUuXG4gKlxuICogQW4gb3duZWQgY2xpZW50IGlzIGNyZWF0ZWQgaW4gYW4gZWZmZWN0LCBuZXZlciBkdXJpbmcgcmVuZGVyLCBiZWNhdXNlXG4gKiBTdHJpY3RNb2RlIHJlbmRlcnMgdHdpY2UgYW5kIGEgY2xpZW50IG1hZGUgaW4gcmVuZGVyIHdvdWxkIGxlYXZlIGEgc2Vjb25kXG4gKiBsaXN0ZW5lciBvbiB0aGUgdHJhbnNwb3J0LiBVbnRpbCB0aGF0IGVmZmVjdCBoYXMgcnVuIHRoZSBzdWJ0cmVlIGlzIG5vdFxuICogcmVuZGVyZWQsIHdoaWNoIGlzIG9uZSB0aWNrLiBTdHJpY3RNb2RlJ3Mgc2ltdWxhdGVkIHVubW91bnQgY2xvc2VzIHRoZVxuICogb3duZWQgY2xpZW50IGFuZCB0aGUgZWZmZWN0IHRoYXQgZm9sbG93cyBtYWtlcyBhIG5ldyBvbmUsIHNvIHRoZSBzdWJ0cmVlXG4gKiBuZXZlciBob2xkcyBhIGRlYWQgY2xpZW50LiBUaGUgdHJhbnNwb3J0IG11c3QgYmUgc3RhYmxlIGFjcm9zcyByZW5kZXJzOyB0b1xuICogc3dhcCBpdCwgY2hhbmdlIHRoZSBwcm92aWRlcidzIGBrZXlgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQnJpZGdlUHJvdmlkZXIocHJvcHM6IEJyaWRnZVByb3ZpZGVyUHJvcHMpOiBSZWFjdEVsZW1lbnQge1xuXHRjb25zdCB7IGNsaWVudCwgdHJhbnNwb3J0LCBvcHRpb25zLCBjaGlsZHJlbiB9ID0gcHJvcHM7XG5cdGlmICgoY2xpZW50ID09PSB1bmRlZmluZWQpID09PSAodHJhbnNwb3J0ID09PSB1bmRlZmluZWQpKSB7XG5cdFx0dGhyb3cgbmV3IFFnaXNTZGtCcmlkZ2VSZWFjdEVycm9yKFxuXHRcdFx0XCJCcmlkZ2VQcm92aWRlciBuZWVkcyBleGFjdGx5IG9uZSBvZiBjbGllbnQgb3IgdHJhbnNwb3J0XCIsXG5cdFx0KTtcblx0fVxuXHRjb25zdCB0aW1lb3V0TXMgPSBvcHRpb25zPy50aW1lb3V0TXM7XG5cdGNvbnN0IFtvd25lZCwgc2V0T3duZWRdID0gdXNlU3RhdGU8QnJpZGdlQ2xpZW50IHwgbnVsbD4obnVsbCk7XG5cdHVzZUVmZmVjdCgoKSA9PiB7XG5cdFx0aWYgKHRyYW5zcG9ydCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRjb25zdCBsaXZlID0gbmV3IEJyaWRnZUNsaWVudChcblx0XHRcdHRyYW5zcG9ydCxcblx0XHRcdHRpbWVvdXRNcyA9PT0gdW5kZWZpbmVkID8ge30gOiB7IHRpbWVvdXRNcyB9LFxuXHRcdCk7XG5cdFx0c2V0T3duZWQobGl2ZSk7XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdGxpdmUuY2xvc2UoKTtcblx0XHRcdHNldE93bmVkKChjdXJyZW50KSA9PiAoY3VycmVudCA9PT0gbGl2ZSA/IG51bGwgOiBjdXJyZW50KSk7XG5cdFx0fTtcblx0fSwgW3RyYW5zcG9ydCwgdGltZW91dE1zXSk7XG5cdGNvbnN0IHZhbHVlID0gY2xpZW50ID8/IG93bmVkO1xuXHRyZXR1cm4gY3JlYXRlRWxlbWVudChcblx0XHRDbGllbnRDb250ZXh0LlByb3ZpZGVyLFxuXHRcdHsgdmFsdWUgfSxcblx0XHR2YWx1ZSA9PT0gbnVsbCA/IG51bGwgOiBjaGlsZHJlbixcblx0KTtcbn1cblxuLyoqIFRoZSBjbGllbnQgb2YgdGhlIG5lYXJlc3Qge0BsaW5rIEJyaWRnZVByb3ZpZGVyfS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VCcmlkZ2VDbGllbnQoKTogQnJpZGdlQ2xpZW50IHtcblx0Y29uc3QgY2xpZW50ID0gdXNlQ29udGV4dChDbGllbnRDb250ZXh0KTtcblx0aWYgKGNsaWVudCA9PT0gbnVsbCkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlUmVhY3RFcnJvcihcblx0XHRcdFwidXNlQnJpZGdlQ2xpZW50IG5lZWRzIGEgQnJpZGdlUHJvdmlkZXIgYWJvdmUgaXRcIixcblx0XHQpO1xuXHR9XG5cdHJldHVybiBjbGllbnQ7XG59XG5cbi8qKlxuICogQnVpbGQgYSBnZW5lcmF0ZWQgb3BlcmF0aW9uIG1hcCBvbmNlIHBlciBjbGllbnQ6IGB1c2VPcGVyYXRpb25zKGNyZWF0ZU9wZXJhdGlvbnMpYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU9wZXJhdGlvbnM8VD4oY3JlYXRlOiAoY2xpZW50OiBCcmlkZ2VDbGllbnQpID0+IFQpOiBUIHtcblx0Y29uc3QgY2xpZW50ID0gdXNlQnJpZGdlQ2xpZW50KCk7XG5cdHJldHVybiB1c2VNZW1vKCgpID0+IGNyZWF0ZShjbGllbnQpLCBbY3JlYXRlLCBjbGllbnRdKTtcbn1cblxuLyoqIFdoZXJlIG9uZSBpbnZvY2F0aW9uIHN0YW5kcy4gKi9cbmV4cG9ydCB0eXBlIE9wZXJhdGlvblN0YXRlPFI+ID1cblx0fCB7IHJlYWRvbmx5IHN0YXR1czogXCJpZGxlXCIgfVxuXHR8IHsgcmVhZG9ubHkgc3RhdHVzOiBcInBlbmRpbmdcIiB9XG5cdHwgeyByZWFkb25seSBzdGF0dXM6IFwib2tcIjsgcmVhZG9ubHkgdmFsdWU6IFIgfVxuXHR8IHsgcmVhZG9ubHkgc3RhdHVzOiBcImVycm9yXCI7IHJlYWRvbmx5IGVycm9yOiBFcnJvciB9O1xuXG4vKiogQ29udHJvbHMgYmV5b25kIHJ1bm5pbmc6IGFib3J0IHdoYXQgaXMgaW4gZmxpZ2h0LCBvciBmb3JnZXQgdGhlIG91dGNvbWUuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZXJhdGlvbkNvbnRyb2xzIHtcblx0LyoqIEFib3J0IHRoZSBpbi1mbGlnaHQgY2FsbCBsb2NhbGx5OyB0aGUgaG9zdCBtYXkgc3RpbGwgcnVuIGl0LiAqL1xuXHRhYm9ydCgpOiB2b2lkO1xuXHQvKiogQmFjayB0byBgaWRsZWAsIGFib3J0aW5nIGFueXRoaW5nIGluIGZsaWdodC4gKi9cblx0cmVzZXQoKTogdm9pZDtcbn1cblxuLyoqIEFuIG9wZXJhdGlvbiBtZW1iZXIgb2YgYSBnZW5lcmF0ZWQgbWFwOiBpbnB1dCwgb3B0aW9uYWwgc2lnbmFsLCBwcm9taXNlLiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0aW9uPEksIFI+ID0gKFxuXHRpbnB1dDogSSxcblx0b3B0aW9ucz86IHsgcmVhZG9ubHkgc2lnbmFsPzogQWJvcnRTaWduYWwgfSxcbikgPT4gUHJvbWlzZTxSPjtcblxuY29uc3QgSURMRTogT3BlcmF0aW9uU3RhdGU8bmV2ZXI+ID0gT2JqZWN0LmZyZWV6ZSh7IHN0YXR1czogXCJpZGxlXCIgfSk7XG5jb25zdCBQRU5ESU5HOiBPcGVyYXRpb25TdGF0ZTxuZXZlcj4gPSBPYmplY3QuZnJlZXplKHsgc3RhdHVzOiBcInBlbmRpbmdcIiB9KTtcblxuLyoqXG4gKiBSdW4gYSBnZW5lcmF0ZWQgb3BlcmF0aW9uIGZyb20gYSBjb21wb25lbnQuXG4gKlxuICogYHJ1bmAgcmVzb2x2ZXMgd2l0aCB0aGUgdmFsdWUsIG9yIHdpdGggYHVuZGVmaW5lZGAgd2hlbiB0aGUgY2FsbCBmYWlsZWQsIHdhc1xuICogYWJvcnRlZCBvciB3YXMgc3VwZXJzZWRlZCBieSBhIGxhdGVyIHJ1biAtIHRoZSBzdGF0ZSBjYXJyaWVzIHRoZSBlcnJvciwgc29cbiAqIHRoZSBwcm9taXNlIG5ldmVyIHJlamVjdHMgaW50byBhbiBldmVudCBoYW5kbGVyLiBPbmx5IHRoZSBsYXRlc3QgcnVuIGNhblxuICogY2hhbmdlIHRoZSBzdGF0ZTsgdW5tb3VudGluZyBhYm9ydHMgd2hhdGV2ZXIgaXMgaW4gZmxpZ2h0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlT3BlcmF0aW9uPEksIFI+KFxuXHRvcGVyYXRpb246IE9wZXJhdGlvbjxJLCBSPixcbik6IHJlYWRvbmx5IFtcblx0T3BlcmF0aW9uU3RhdGU8Uj4sXG5cdChpbnB1dDogSSkgPT4gUHJvbWlzZTxSIHwgdW5kZWZpbmVkPixcblx0T3BlcmF0aW9uQ29udHJvbHMsXG5dIHtcblx0Y29uc3QgW3N0YXRlLCBzZXRTdGF0ZV0gPSB1c2VTdGF0ZTxPcGVyYXRpb25TdGF0ZTxSPj4oSURMRSk7XG5cdGNvbnN0IGdlbmVyYXRpb24gPSB1c2VSZWYoMCk7XG5cdGNvbnN0IGNvbnRyb2xsZXIgPSB1c2VSZWY8QWJvcnRDb250cm9sbGVyIHwgbnVsbD4obnVsbCk7XG5cdGNvbnN0IG1vdW50ZWQgPSB1c2VSZWYodHJ1ZSk7XG5cblx0Y29uc3QgYWJvcnQgPSB1c2VDYWxsYmFjaygoKTogdm9pZCA9PiB7XG5cdFx0Z2VuZXJhdGlvbi5jdXJyZW50ICs9IDE7XG5cdFx0Y29udHJvbGxlci5jdXJyZW50Py5hYm9ydCgpO1xuXHRcdGNvbnRyb2xsZXIuY3VycmVudCA9IG51bGw7XG5cdH0sIFtdKTtcblxuXHR1c2VFZmZlY3QoKCkgPT4ge1xuXHRcdG1vdW50ZWQuY3VycmVudCA9IHRydWU7XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdG1vdW50ZWQuY3VycmVudCA9IGZhbHNlO1xuXHRcdFx0YWJvcnQoKTtcblx0XHR9O1xuXHR9LCBbYWJvcnRdKTtcblxuXHRjb25zdCBydW4gPSB1c2VDYWxsYmFjayhcblx0XHRhc3luYyAoaW5wdXQ6IEkpOiBQcm9taXNlPFIgfCB1bmRlZmluZWQ+ID0+IHtcblx0XHRcdGFib3J0KCk7XG5cdFx0XHRjb25zdCBtaW5lID0gZ2VuZXJhdGlvbi5jdXJyZW50O1xuXHRcdFx0Y29uc3Qgc2lnbmFsID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXHRcdFx0Y29udHJvbGxlci5jdXJyZW50ID0gc2lnbmFsO1xuXHRcdFx0c2V0U3RhdGUoUEVORElORyk7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCB2YWx1ZSA9IGF3YWl0IG9wZXJhdGlvbihpbnB1dCwgeyBzaWduYWw6IHNpZ25hbC5zaWduYWwgfSk7XG5cdFx0XHRcdGlmIChnZW5lcmF0aW9uLmN1cnJlbnQgIT09IG1pbmUgfHwgIW1vdW50ZWQuY3VycmVudCkge1xuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0c2V0U3RhdGUoeyBzdGF0dXM6IFwib2tcIiwgdmFsdWUgfSk7XG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdGlmIChnZW5lcmF0aW9uLmN1cnJlbnQgIT09IG1pbmUgfHwgIW1vdW50ZWQuY3VycmVudCkge1xuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGVycm9yIGluc3RhbmNlb2YgUWdpc1Nka0JyaWRnZUFib3J0ZWRFcnJvcikge1xuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0c2V0U3RhdGUoe1xuXHRcdFx0XHRcdHN0YXR1czogXCJlcnJvclwiLFxuXHRcdFx0XHRcdGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSksXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0aWYgKGNvbnRyb2xsZXIuY3VycmVudCA9PT0gc2lnbmFsKSB7XG5cdFx0XHRcdFx0Y29udHJvbGxlci5jdXJyZW50ID0gbnVsbDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0W29wZXJhdGlvbiwgYWJvcnRdLFxuXHQpO1xuXG5cdGNvbnN0IHJlc2V0ID0gdXNlQ2FsbGJhY2soKCk6IHZvaWQgPT4ge1xuXHRcdGFib3J0KCk7XG5cdFx0c2V0U3RhdGUoSURMRSk7XG5cdH0sIFthYm9ydF0pO1xuXG5cdGNvbnN0IGNvbnRyb2xzID0gdXNlTWVtbygoKSA9PiAoeyBhYm9ydCwgcmVzZXQgfSksIFthYm9ydCwgcmVzZXRdKTtcblx0cmV0dXJuIFtzdGF0ZSwgcnVuLCBjb250cm9sc107XG59XG5cbi8qKiBIb3cgYSBzdHJlYW0gZW5kZWQsIGFzIHRoZSBnZW5lcmF0ZWQgbW9kdWxlIHJlcG9ydHMgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0cmVhbVRlcm1pbmFsTGlrZSB7XG5cdHJlYWRvbmx5IGtpbmQ6IHN0cmluZztcblx0cmVhZG9ubHkgbWVzc2FnZT86IHN0cmluZztcblx0cmVhZG9ubHkgZHJvcHBlZD86IG51bWJlcjtcbn1cblxuLyoqIFRoZSBoYW5kbGUgYSBnZW5lcmF0ZWQgc3RyZWFtIG1lbWJlciByZXNvbHZlcyB3aXRoLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHJlYW1IYW5kbGVMaWtlIHtcblx0cmVhZG9ubHkgaWQ6IHN0cmluZztcblx0cmVhZG9ubHkgY2xvc2VkOiBib29sZWFuO1xuXHRjbG9zZSgpOiB2b2lkO1xufVxuXG4vKiogSGFuZGxlcnMgZm9yIGEgc3RyZWFtLCBhcyBhIGdlbmVyYXRlZCBtb2R1bGUgdHlwZXMgdGhlbS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RyZWFtSGFuZGxlcnNMaWtlPEU+IHtcblx0cmVhZG9ubHkgb25FdmVudD86IChldmVudDogRSkgPT4gdm9pZDtcblx0cmVhZG9ubHkgb25UZXJtaW5hbD86ICh0ZXJtaW5hbDogU3RyZWFtVGVybWluYWxMaWtlKSA9PiB2b2lkO1xufVxuXG4vKiogQSBzdHJlYW0gbWVtYmVyIG9mIGEgZ2VuZXJhdGVkIG1hcC4gKi9cbmV4cG9ydCB0eXBlIFN0cmVhbTxJLCBFPiA9IChcblx0aW5wdXQ6IEksXG5cdGhhbmRsZXJzOiBTdHJlYW1IYW5kbGVyc0xpa2U8RT4sXG5cdG9wdGlvbnM/OiB7IHJlYWRvbmx5IHNpZ25hbD86IEFib3J0U2lnbmFsIH0sXG4pID0+IFByb21pc2U8U3RyZWFtSGFuZGxlTGlrZT47XG5cbi8qKiBXaGVyZSBvbmUgc3Vic2NyaXB0aW9uIHN0YW5kcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RyZWFtU3RhdGU8RT4ge1xuXHQvKiogYGlkbGVgIHdpdGggYSBudWxsIGlucHV0LCBgZmFpbGVkYCB3aGVuIHRoZSBob3N0IHJlZnVzZWQgdG8gb3BlbiBpdC4gKi9cblx0cmVhZG9ubHkgc3RhdHVzOiBcImlkbGVcIiB8IFwib3BlbmluZ1wiIHwgXCJvcGVuXCIgfCBcImVuZGVkXCIgfCBcImZhaWxlZFwiO1xuXHRyZWFkb25seSBsYXN0RXZlbnQ6IEUgfCBudWxsO1xuXHRyZWFkb25seSB0ZXJtaW5hbDogU3RyZWFtVGVybWluYWxMaWtlIHwgbnVsbDtcblx0cmVhZG9ubHkgZXJyb3I6IEVycm9yIHwgbnVsbDtcbn1cblxuY29uc3QgSURMRV9TVFJFQU06IFN0cmVhbVN0YXRlPG5ldmVyPiA9IE9iamVjdC5mcmVlemUoe1xuXHRzdGF0dXM6IFwiaWRsZVwiLFxuXHRsYXN0RXZlbnQ6IG51bGwsXG5cdHRlcm1pbmFsOiBudWxsLFxuXHRlcnJvcjogbnVsbCxcbn0pO1xuXG5mdW5jdGlvbiBzdGFibGVLZXkodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuXHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUsIChfa2V5LCBpdGVtOiB1bmtub3duKSA9PlxuXHRcdGlzUGxhaW5SZWNvcmQoaXRlbSlcblx0XHRcdD8gT2JqZWN0LmZyb21FbnRyaWVzKFxuXHRcdFx0XHRcdE9iamVjdC5lbnRyaWVzKGl0ZW0pLnNvcnQoKFthXSwgW2JdKSA9PiAoYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDApKSxcblx0XHRcdFx0KVxuXHRcdFx0OiBpdGVtLFxuXHQpO1xufVxuXG4vKipcbiAqIEhvbGQgYSBnZW5lcmF0ZWQgc3RyZWFtIG9wZW4gd2hpbGUgYSBjb21wb25lbnQgaXMgbW91bnRlZC5cbiAqXG4gKiBUaGUgc3Vic2NyaXB0aW9uIGZvbGxvd3MgYG9wZW5gIGFuZCB0aGUgKmNvbnRlbnQqIG9mIGBpbnB1dGA6IGEgbmV3IG9iamVjdFxuICogd2l0aCB0aGUgc2FtZSBmaWVsZHMgZG9lcyBub3QgcmVvcGVuIGl0LCBhIGRpZmZlcmVudCBvbmUgY2xvc2VzIHRoZSBvbGRcbiAqIHN0cmVhbSBhbmQgb3BlbnMgYSBuZXcgb25lLCBhbmQgYG51bGxgIGNsb3NlcyBpdC4gSGFuZGxlcnMgYXJlIHJlYWQgZnJlc2hcbiAqIG9uIGV2ZXJ5IGZyYW1lLCBzbyBhIG5ldyBjbG9zdXJlIGRvZXMgbm90IHJlb3BlbiBhbnl0aGluZyBlaXRoZXIuIFVubW91bnRcbiAqIGNsb3NlcyB0aGUgc3RyZWFtLCBldmVuIGlmIHRoZSBob3N0IGhhcyBub3QgeWV0IGFja25vd2xlZGdlZCBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVN0cmVhbTxJLCBFPihcblx0b3BlbjogU3RyZWFtPEksIEU+LFxuXHRpbnB1dDogSSB8IG51bGwsXG5cdGhhbmRsZXJzOiBTdHJlYW1IYW5kbGVyc0xpa2U8RT4gPSB7fSxcbik6IFN0cmVhbVN0YXRlPEU+IHtcblx0Y29uc3QgW3N0YXRlLCBzZXRTdGF0ZV0gPSB1c2VTdGF0ZTxTdHJlYW1TdGF0ZTxFPj4oSURMRV9TVFJFQU0pO1xuXHRjb25zdCBsYXRlc3QgPSB1c2VSZWYoaGFuZGxlcnMpO1xuXHRsYXRlc3QuY3VycmVudCA9IGhhbmRsZXJzO1xuXHRjb25zdCBrZXkgPSBpbnB1dCA9PT0gbnVsbCA/IG51bGwgOiBzdGFibGVLZXkoaW5wdXQpO1xuXHQvLyBgaW5wdXRgIGlzIGRlbGliZXJhdGVseSByZWFkIHRocm91Z2ggYGtleWA6IHR3byBvYmplY3RzIHdpdGggdGhlIHNhbWVcblx0Ly8gZmllbGRzIGFyZSB0aGUgc2FtZSBzdWJzY3JpcHRpb24uXG5cdGNvbnN0IGlucHV0UmVmID0gdXNlUmVmKGlucHV0KTtcblx0aW5wdXRSZWYuY3VycmVudCA9IGlucHV0O1xuXG5cdHVzZUVmZmVjdCgoKSA9PiB7XG5cdFx0aWYgKGtleSA9PT0gbnVsbCkge1xuXHRcdFx0c2V0U3RhdGUoSURMRV9TVFJFQU0pO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Y29uc3QgY3VycmVudCA9IGlucHV0UmVmLmN1cnJlbnQgYXMgSTtcblx0XHRsZXQgY2FuY2VsbGVkID0gZmFsc2U7XG5cdFx0bGV0IGhhbmRsZTogU3RyZWFtSGFuZGxlTGlrZSB8IG51bGwgPSBudWxsO1xuXHRcdHNldFN0YXRlKHtcblx0XHRcdHN0YXR1czogXCJvcGVuaW5nXCIsXG5cdFx0XHRsYXN0RXZlbnQ6IG51bGwsXG5cdFx0XHR0ZXJtaW5hbDogbnVsbCxcblx0XHRcdGVycm9yOiBudWxsLFxuXHRcdH0pO1xuXHRcdG9wZW4oY3VycmVudCwge1xuXHRcdFx0b25FdmVudDogKGV2ZW50KSA9PiB7XG5cdFx0XHRcdGlmIChjYW5jZWxsZWQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0bGF0ZXN0LmN1cnJlbnQub25FdmVudD8uKGV2ZW50KTtcblx0XHRcdFx0c2V0U3RhdGUoKHByZXZpb3VzKSA9PiAoeyAuLi5wcmV2aW91cywgbGFzdEV2ZW50OiBldmVudCB9KSk7XG5cdFx0XHR9LFxuXHRcdFx0b25UZXJtaW5hbDogKHRlcm1pbmFsKSA9PiB7XG5cdFx0XHRcdGlmIChjYW5jZWxsZWQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0bGF0ZXN0LmN1cnJlbnQub25UZXJtaW5hbD8uKHRlcm1pbmFsKTtcblx0XHRcdFx0c2V0U3RhdGUoKHByZXZpb3VzKSA9PiAoeyAuLi5wcmV2aW91cywgc3RhdHVzOiBcImVuZGVkXCIsIHRlcm1pbmFsIH0pKTtcblx0XHRcdH0sXG5cdFx0fSkudGhlbihcblx0XHRcdChvcGVuZWQpID0+IHtcblx0XHRcdFx0aWYgKGNhbmNlbGxlZCkge1xuXHRcdFx0XHRcdG9wZW5lZC5jbG9zZSgpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRoYW5kbGUgPSBvcGVuZWQ7XG5cdFx0XHRcdHNldFN0YXRlKChwcmV2aW91cykgPT5cblx0XHRcdFx0XHRwcmV2aW91cy5zdGF0dXMgPT09IFwiZW5kZWRcIlxuXHRcdFx0XHRcdFx0PyBwcmV2aW91c1xuXHRcdFx0XHRcdFx0OiB7IC4uLnByZXZpb3VzLCBzdGF0dXM6IFwib3BlblwiIH0sXG5cdFx0XHRcdCk7XG5cdFx0XHR9LFxuXHRcdFx0KGVycm9yOiB1bmtub3duKSA9PiB7XG5cdFx0XHRcdGlmIChjYW5jZWxsZWQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0c2V0U3RhdGUoe1xuXHRcdFx0XHRcdHN0YXR1czogXCJmYWlsZWRcIixcblx0XHRcdFx0XHRsYXN0RXZlbnQ6IG51bGwsXG5cdFx0XHRcdFx0dGVybWluYWw6IG51bGwsXG5cdFx0XHRcdFx0ZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSxcblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdCk7XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdGNhbmNlbGxlZCA9IHRydWU7XG5cdFx0XHRoYW5kbGU/LmNsb3NlKCk7XG5cdFx0fTtcblx0fSwgW29wZW4sIGtleV0pO1xuXG5cdHJldHVybiBzdGF0ZTtcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7QUFnQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFxQk8sTUFBTSxnQ0FBZ0MsY0FBYTtBQUFBLEVBQ2xELFdBQVcsQ0FBQyxTQUFpQjtBQUFBLElBQ25DLE1BQU0sU0FBUyxlQUFlO0FBQUE7QUFFaEM7QUFFQSxJQUFNLGdCQUFnQixjQUFtQyxJQUFJO0FBd0J0RCxTQUFTLGNBQWMsQ0FBQyxPQUEwQztBQUFBLEVBQ3hFLFFBQVEsUUFBUSxXQUFXLFNBQVMsYUFBYTtBQUFBLEVBQ2pELElBQUssV0FBVyxlQUFnQixjQUFjLFlBQVk7QUFBQSxJQUN6RCxNQUFNLElBQUks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O0FBQUEsTUFDakIsU0FBUyxXQUFXO0FBQUEsTUFDcEI7QUFBQSxJQUNEO0FBQUEsSUFDQSxNQUFNLFVBQVUsU0FBUztBQUFBLElBQ3pCLElBQUksWUFBWTtBQUFBLElBQ2hCLElBQUksU0FBa0M7QUFBQSxJQUN0QyxTQUFTO0FBQUEsTUFDUixRQUFRO0FBQUEsTUFDUixXQUFXO0FBQUEsTUFDWCxVQUFVO0FBQUEsTUFDVixPQUFPO0FBQUEsSUFDUixDQUFDO0FBQUEsSUFDRCxLQUFLLFNBQVM7QUFBQSxNQUNiLFNBQVMsQ0FBQyxVQUFVO0FBQUEsUUFDbkIsSUFBSSxXQUFXO0FBQUEsVUFDZDtBQUFBLFFBQ0Q7QUFBQSxRQUNBLE9BQU8sUUFBUSxVQUFVLEtBQUs7QUFBQSxRQUM5QixTQUFTLENBQUMsY0FBYyxLQUFLLFVBQVUsV0FBVyxNQUFNLEVBQUU7QUFBQTtBQUFBLE1BRTNELFlBQVksQ0FBQyxhQUFhO0FBQUEsUUFDekIsSUFBSSxXQUFXO0FBQUEsVUFDZDtBQUFBLFFBQ0Q7QUFBQSxRQUNBLE9BQU8sUUFBUSxhQUFhLFFBQVE7QUFBQSxRQUNwQyxTQUFTLENBQUMsY0FBYyxLQUFLLFVBQVUsUUFBUSxTQUFTLFNBQVMsRUFBRTtBQUFBO0FBQUEsSUFFckUsQ0FBQyxFQUFFLEtBQ0YsQ0FBQyxXQUFXO0FBQUEsTUFDWCxJQUFJLFdBQVc7QUFBQSxRQUNkLE9BQU8sTUFBTTtBQUFBLFFBQ2I7QUFBQSxNQUNEO0FBQUEsTUFDQSxTQUFTO0FBQUEsTUFDVCxTQUFTLENBQUMsYUFDVCxTQUFTLFdBQVcsVUFDakIsV0FDQSxLQUFLLFVBQVUsUUFBUSxPQUFPLENBQ2xDO0FBQUEsT0FFRCxDQUFDLFVBQW1CO0FBQUEsTUFDbkIsSUFBSSxXQUFXO0FBQUEsUUFDZDtBQUFBLE1BQ0Q7QUFBQSxNQUNBLFNBQVM7QUFBQSxRQUNSLFFBQVE7QUFBQSxRQUNSLFdBQVc7QUFBQSxRQUNYLFVBQVU7QUFBQSxRQUNWLE9BQU8saUJBQWlCLFFBQVEsUUFBUSxJQUFJLE1BQU0sT0FBTyxLQUFLLENBQUM7QUFBQSxNQUNoRSxDQUFDO0FBQUEsS0FFSDtBQUFBLElBQ0EsT0FBTyxNQUFNO0FBQUEsTUFDWixZQUFZO0FBQUEsTUFDWixRQUFRLE1BQU07QUFBQTtBQUFBLEtBRWIsQ0FBQyxNQUFNLEdBQUcsQ0FBQztBQUFBLEVBRWQsT0FBTztBQUFBOyIsCiAgImRlYnVnSWQiOiAiQjkxNzMxMTZEMEE4QUQ0MzY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
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
@@ -0,0 +1,14 @@
1
+ // src/errors.ts
2
+ class QgisSdkError2 extends Error {
3
+ code;
4
+ constructor(message, code = "sdk_error") {
5
+ super(message);
6
+ this.name = new.target.name;
7
+ this.code = code;
8
+ }
9
+ }
10
+
11
+ export { QgisSdkError2 };
12
+
13
+ //# debugId=87B5084359C9044664756E2164756E21
14
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2Vycm9ycy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIvKipcbiAqIFRoZSBvbmUgZXJyb3Igcm9vdCBvZiBgQGFyY2hvbnQ1NjEvcWdpcy1zZGtgLlxuICpcbiAqIEV2ZXJ5IGVycm9yIHRoaXMgcGFja2FnZSByYWlzZXMgLSB0cmFuc3BvcnQsIGhvc3QgY29udHJhY3QsIFJlYWN0IGJpbmRpbmcsXG4gKiB0ZXN0IGhhcm5lc3MgLSBleHRlbmRzIGBRZ2lzU2RrRXJyb3JgLCBzbyBhIHBhZ2UgY2FuIGNhdGNoIHRoZSBmYW1pbHkgaW4gb25lXG4gKiBgaW5zdGFuY2VvZmAgYW5kIHN3aXRjaCBvbiB0aGUgc3RhYmxlIHdpcmUgYGNvZGVgIHJhdGhlciB0aGFuIG9uIGNsYXNzIG5hbWVzXG4gKiBvciBtZXNzYWdlIHRleHQuIFRoZSBjbGFzcyBsaXZlcyBpbiBpdHMgb3duIG1vZHVsZSBzbyB0aGUgZW50cnkgcG9pbnRzIGNhblxuICogc2hhcmUgaXQgd2l0aG91dCBpbXBvcnRpbmcgZWFjaCBvdGhlci5cbiAqL1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGV4cGVjdGVkIFNESyBlcnJvcnMgYWNyb3NzIHRoZSBicmlkZ2UgYm91bmRhcnkuXG4gKi9cbmV4cG9ydCBjbGFzcyBRZ2lzU2RrRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG5cdHB1YmxpYyByZWFkb25seSBjb2RlOiBzdHJpbmc7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgY29kZTogc3RyaW5nID0gXCJzZGtfZXJyb3JcIikge1xuXHRcdHN1cGVyKG1lc3NhZ2UpO1xuXHRcdHRoaXMubmFtZSA9IG5ldy50YXJnZXQubmFtZTtcblx0XHR0aGlzLmNvZGUgPSBjb2RlO1xuXHR9XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiO0FBYU8sTUFBTSxzQkFBcUIsTUFBTTtBQUFBLEVBQ3ZCO0FBQUEsRUFFVCxXQUFXLENBQUMsU0FBaUIsT0FBZSxhQUFhO0FBQUEsSUFDL0QsTUFBTSxPQUFPO0FBQUEsSUFDYixLQUFLLE9BQU8sV0FBVztBQUFBLElBQ3ZCLEtBQUssT0FBTztBQUFBO0FBRWQ7IiwKICAiZGVidWdJZCI6ICI4N0I1MDg0MzU5QzkwNDQ2NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==