PageSourceSearch

https://axis-fe.up.railway.app/node_modules/.vite/deps/chunk-WO3AQFYS.js?v=bf763330

js axis-fe.up.railway.app collected 2026-10-03 12:15:57 UTC 329,485 bytes, 3,053 lines download raw bytes

vendor: 5,496 bytes, lines 1-173
1import __buffer_polyfill from "/node_modules/.vite/deps/vite-plugin-node-polyfills_shims_buffer.js?v=bf763330";
2globalThis.Buffer = globalThis.Buffer || __buffer_polyfill;
3import __global_polyfill from "/node_modules/.vite/deps/vite-plugin-node-polyfills_shims_global.js?v=bf763330";
4globalThis.global = globalThis.global || __global_polyfill;
5import __process_polyfill from "/node_modules/.vite/deps/vite-plugin-node-polyfills_shims_process.js?v=bf763330";
6globalThis.process = globalThis.process || __process_polyfill;
7import {
8  SHOULD_AUTOBATCH,
9  applyPatches,
10  combineReducers,
11  createAction,
12  createAsyncThunk,
13  createSelector,
14  createSlice,
15  current,
16  enablePatches,
17  formatProdErrorMessage,
18  isAction,
19  isAllOf,
20  isAnyOf,
21  isAsyncThunkAction,
22  isDraft,
23  isDraftable,
24  isFulfilled,
25  isPending,
26  isPlainObject,
27  isRejected,
28  isRejectedWithValue,
29  nanoid,
30  original,
31  prepareAutoBatched,
32  produce,
33  produceWithPatches,
34  weakMapMemoize
35} from "/node_modules/.vite/deps/chunk-2ICND253.js?v=bf763330";
36import {
37  __publicField,
38  __toESM,
39  require_dist,
40  require_dist2,
41  require_dist3
42} from "/node_modules/.vite/deps/chunk-CURNFZRR.js?v=bf763330";
43var import_dist4 = __toESM(require_dist(), 1);
44var import_dist5 = __toESM(require_dist2(), 1);
45var import_dist6 = __toESM(require_dist3(), 1);
46var import_dist = __toESM(require_dist());
47var import_dist2 = __toESM(require_dist2());
48var import_dist3 = __toESM(require_dist3());
49var SchemaError = class extends Error {
50  /**
51   * Creates a schema error with useful information.
52   *
53   * @param issues The schema issues.
54   */
55  constructor(issues) {
56    super(issues[0].message);
57    __publicField(this, "issues");
58    this.name = "SchemaError";
59    this.issues = issues;
60  }
61};
62var QueryStatus = ((QueryStatus7) => {
63  QueryStatus7["uninitialized"] = "uninitialized";
64  QueryStatus7["pending"] = "pending";
65  QueryStatus7["fulfilled"] = "fulfilled";
66  QueryStatus7["rejected"] = "rejected";
67  return QueryStatus7;
68})(QueryStatus || {});
69var STATUS_UNINITIALIZED = "uninitialized";
70var STATUS_PENDING = "pending";
71var STATUS_FULFILLED = "fulfilled";
72var STATUS_REJECTED = "rejected";
73function getRequestStatusFlags(status) {
74  return {
75    status,
76    isUninitialized: status === STATUS_UNINITIALIZED,
77    isLoading: status === STATUS_PENDING,
78    isSuccess: status === STATUS_FULFILLED,
79    isError: status === STATUS_REJECTED
80  };
81}
82var isPlainObject2 = isPlainObject;
83function copyWithStructuralSharing(oldObj, newObj) {
84  if (oldObj === newObj || !(isPlainObject2(oldObj) && isPlainObject2(newObj) || Array.isArray(oldObj) && Array.isArray(newObj))) {
85    return newObj;
86  }
87  const newKeys = Object.keys(newObj);
88  const oldKeys = Object.keys(oldObj);
89  let isSameObject = newKeys.length === oldKeys.length;
90  const mergeObj = Array.isArray(newObj) ? [] : {};
91  for (const key of newKeys) {
92    mergeObj[key] = copyWithStructuralSharing(oldObj[key], newObj[key]);
93    if (isSameObject) isSameObject = oldObj[key] === mergeObj[key];
94  }
95  return isSameObject ? oldObj : mergeObj;
96}
97function filterMap(array, predicate, mapper) {
98  return array.reduce((acc, item, i) => {
99    if (predicate(item, i)) {
100      acc.push(mapper(item, i));
101    }
102    return acc;
103  }, []).flat();
104}
105function isAbsoluteUrl(url) {
106  return new RegExp(`(^|:)//`).test(url);
107}
108function isDocumentVisible() {
109  if (typeof document === "undefined") {
110    return true;
111  }
112  return document.visibilityState !== "hidden";
113}
114function isNotNullish(v) {
115  return v != null;
116}
117function filterNullishValues(map) {
118  return [...(map == null ? void 0 : map.values()) ?? []].filter(isNotNullish);
119}
120function isOnline() {
121  return typeof navigator === "undefined" ? true : navigator.onLine === void 0 ? true : navigator.onLine;
122}
123var withoutTrailingSlash = (url) => url.replace(/\/$/, "");
124var withoutLeadingSlash = (url) => url.replace(/^\//, "");
125function joinUrls(base, url) {
126  if (!base) {
127    return url;
128  }
129  if (!url) {
130    return base;
131  }
132  if (isAbsoluteUrl(url)) {
133    return url;
134  }
135  const delimiter = base.endsWith("/") || !url.startsWith("?") ? "/" : "";
136  base = withoutTrailingSlash(base);
137  url = withoutLeadingSlash(url);
138  return `${base}${delimiter}${url}`;
139}
140function getOrInsertComputed(map, key, compute) {
141  if (map.has(key)) return map.get(key);
142  return map.set(key, compute(key)).get(key);
143}
144var createNewMap = () => /* @__PURE__ */ new Map();
145var timeoutSignal = (milliseconds) => {
146  const abortController = new AbortController();
147  setTimeout(() => {
148    const message = "signal timed out";
149    const name = "TimeoutError";
150    abortController.abort(
151      // some environments (React Native, Node) don't have DOMException
152      typeof DOMException !== "undefined" ? new DOMException(message, name) : Object.assign(new Error(message), {
153        name
154      })
155    );
156  }, milliseconds);
157  return abortController.signal;
158};
159var anySignal = (...signals) => {
160  for (const signal of signals) if (signal.aborted) return AbortSignal.abort(signal.reason);
161  const abortController = new AbortController();
162  for (const signal of signals) {
163    signal.addEventListener("abort", () => abortController.abort(signal.reason), {
164      signal: abortController.signal,
165      once: true
166    });
167  }
168  return abortController.signal;
169};
170var defaultFetchFn = (...args) => fetch(...args);
171var defaultValidateStatus = (response) => response.status >= 200 && response.status <= 299;
172var defaultIsJsonContentType = (headers) => (
173  /*applicat*/
vendor: 7,277 bytes, lines 174-419
174  /ion\/(vnd\.api\+)?json/.test(headers.get("content-type") || "")
175);
176function stripUndefined(obj) {
177  if (!isPlainObject(obj)) {
178    return obj;
179  }
180  const copy = {
181    ...obj
182  };
183  for (const [k, v] of Object.entries(copy)) {
184    if (v === void 0) delete copy[k];
185  }
186  return copy;
187}
188var isJsonifiable = (body) => typeof body === "object" && (isPlainObject(body) || Array.isArray(body) || typeof body.toJSON === "function");
189function fetchBaseQuery({
190  baseUrl,
191  prepareHeaders = (x) => x,
192  fetchFn = defaultFetchFn,
193  paramsSerializer,
194  isJsonContentType = defaultIsJsonContentType,
195  jsonContentType = "application/json",
196  jsonReplacer,
197  timeout: defaultTimeout,
198  responseHandler: globalResponseHandler,
199  validateStatus: globalValidateStatus,
200  ...baseFetchOptions
201} = {}) {
202  if (typeof fetch === "undefined" && fetchFn === defaultFetchFn) {
203    console.warn("Warning: `fetch` is not available. Please supply a custom `fetchFn` property to use `fetchBaseQuery` on SSR environments.");
204  }
205  return async (arg, api, extraOptions) => {
206    const {
207      getState,
208      extra,
209      endpoint,
210      forced,
211      type
212    } = api;
213    let meta;
214    let {
215      url,
216      headers = new Headers(baseFetchOptions.headers),
217      params = void 0,
218      responseHandler = globalResponseHandler ?? "json",
219      validateStatus = globalValidateStatus ?? defaultValidateStatus,
220      timeout = defaultTimeout,
221      ...rest
222    } = typeof arg == "string" ? {
223      url: arg
224    } : arg;
225    let config = {
226      ...baseFetchOptions,
227      signal: timeout ? anySignal(api.signal, timeoutSignal(timeout)) : api.signal,
228      ...rest
229    };
230    headers = new Headers(stripUndefined(headers));
231    config.headers = await prepareHeaders(headers, {
232      getState,
233      arg,
234      extra,
235      endpoint,
236      forced,
237      type,
238      extraOptions
239    }) || headers;
240    const bodyIsJsonifiable = isJsonifiable(config.body);
241    if (config.body != null && !bodyIsJsonifiable && typeof config.body !== "string") {
242      config.headers.delete("content-type");
243    }
244    if (!config.headers.has("content-type") && bodyIsJsonifiable) {
245      config.headers.set("content-type", jsonContentType);
246    }
247    if (bodyIsJsonifiable && isJsonContentType(config.headers)) {
248      config.body = JSON.stringify(config.body, jsonReplacer);
249    }
250    if (!config.headers.has("accept")) {
251      if (responseHandler === "json") {
252        config.headers.set("accept", "application/json");
253      } else if (responseHandler === "text") {
254        config.headers.set("accept", "text/plain, text/html, */*");
255      }
256    }
257    if (params) {
258      const divider = ~url.indexOf("?") ? "&" : "?";
259      const query = paramsSerializer ? paramsSerializer(params) : new URLSearchParams(stripUndefined(params));
260      url += divider + query;
261    }
262    url = joinUrls(baseUrl, url);
263    const request = new Request(url, config);
264    const requestClone = new Request(url, config);
265    meta = {
266      request: requestClone
267    };
268    let response;
269    try {
270      response = await fetchFn(request);
271    } catch (e) {
272      return {
273        error: {
274          status: (e instanceof Error || typeof DOMException !== "undefined" && e instanceof DOMException) && e.name === "TimeoutError" ? "TIMEOUT_ERROR" : "FETCH_ERROR",
275          error: String(e)
276        },
277        meta
278      };
279    }
280    const responseClone = response.clone();
281    meta.response = responseClone;
282    let resultData;
283    let responseText = "";
284    try {
285      let handleResponseError;
286      await Promise.all([
287        handleResponse(response, responseHandler).then((r) => resultData = r, (e) => handleResponseError = e),
288        // see https://github.com/node-fetch/node-fetch/issues/665#issuecomment-538995182
289        // we *have* to "use up" both streams at the same time or they will stop running in node-fetch scenarios
290        responseClone.text().then((r) => responseText = r, () => {
291        })
292      ]);
293      if (handleResponseError) throw handleResponseError;
294    } catch (e) {
295      return {
296        error: {
297          status: "PARSING_ERROR",
298          originalStatus: response.status,
299          data: responseText,
300          error: String(e)
301        },
302        meta
303      };
304    }
305    return validateStatus(response, resultData) ? {
306      data: resultData,
307      meta
308    } : {
309      error: {
310        status: response.status,
311        data: resultData
312      },
313      meta
314    };
315  };
316  async function handleResponse(response, responseHandler) {
317    if (typeof responseHandler === "function") {
318      return responseHandler(response);
319    }
320    if (responseHandler === "content-type") {
321      responseHandler = isJsonContentType(response.headers) ? "json" : "text";
322    }
323    if (responseHandler === "json") {
324      const text = await response.text();
325      return text.length ? JSON.parse(text) : null;
326    }
327    return response.text();
328  }
329}
330var HandledError = class {
331  constructor(value, meta = void 0) {
332    this.value = value;
333    this.meta = meta;
334  }
335};
336async function defaultBackoff(attempt = 0, maxRetries = 5, signal) {
337  const attempts = Math.min(attempt, maxRetries);
338  const timeout = ~~((Math.random() + 0.4) * (300 << attempts));
339  await new Promise((resolve, reject) => {
340    const timeoutId = setTimeout(() => resolve(), timeout);
341    if (signal) {
342      const abortHandler = () => {
343        clearTimeout(timeoutId);
344        reject(new Error("Aborted"));
345      };
346      if (signal.aborted) {
347        clearTimeout(timeoutId);
348        reject(new Error("Aborted"));
349      } else {
350        signal.addEventListener("abort", abortHandler, {
351          once: true
352        });
353      }
354    }
355  });
356}
357function fail(error, meta) {
358  throw Object.assign(new HandledError({
359    error,
360    meta
361  }), {
362    throwImmediately: true
363  });
364}
365function failIfAborted(signal) {
366  if (signal.aborted) {
367    fail({
368      status: "CUSTOM_ERROR",
369      error: "Aborted"
370    });
371  }
372}
373var EMPTY_OPTIONS = {};
374var retryWithBackoff = (baseQuery, defaultOptions) => async (args, api, extraOptions) => {
375  const possibleMaxRetries = [5, (defaultOptions || EMPTY_OPTIONS).maxRetries, (extraOptions || EMPTY_OPTIONS).maxRetries].filter((x) => x !== void 0);
376  const [maxRetries] = possibleMaxRetries.slice(-1);
377  const defaultRetryCondition = (_, __, {
378    attempt
379  }) => attempt <= maxRetries;
380  const options = {
381    maxRetries,
382    backoff: defaultBackoff,
383    retryCondition: defaultRetryCondition,
384    ...defaultOptions,
385    ...extraOptions
386  };
387  let retry2 = 0;
388  while (true) {
389    failIfAborted(api.signal);
390    try {
391      const result = await baseQuery(args, api, extraOptions);
392      if (result.error) {
393        throw new HandledError(result);
394      }
395      return result;
396    } catch (e) {
397      retry2++;
398      if (e.throwImmediately) {
399        if (e instanceof HandledError) {
400          return e.value;
401        }
402        throw e;
403      }
404      if (e instanceof HandledError) {
405        if (!options.retryCondition(e.value.error, args, {
406          attempt: retry2,
407          baseQueryApi: api,
408          extraOptions
409        })) {
410          return e.value;
411        }
412      } else {
413        if (retry2 > options.maxRetries) {
414          return {
415            error: e
416          };
417        }
418      }
419      failIfAborted(api.signal);
vendor: 5,132 bytes, lines 420-582
420      try {
421        await options.backoff(retry2, options.maxRetries, api.signal);
422      } catch (backoffError) {
423        failIfAborted(api.signal);
424        throw backoffError;
425      }
426    }
427  }
428};
429var retry = Object.assign(retryWithBackoff, {
430  fail
431});
432var INTERNAL_PREFIX = "__rtkq/";
433var ONLINE = "online";
434var OFFLINE = "offline";
435var FOCUS = "focus";
436var FOCUSED = "focused";
437var VISIBILITYCHANGE = "visibilitychange";
438var onFocus = createAction(`${INTERNAL_PREFIX}${FOCUSED}`);
439var onFocusLost = createAction(`${INTERNAL_PREFIX}un${FOCUSED}`);
440var onOnline = createAction(`${INTERNAL_PREFIX}${ONLINE}`);
441var onOffline = createAction(`${INTERNAL_PREFIX}${OFFLINE}`);
442var actions = {
443  onFocus,
444  onFocusLost,
445  onOnline,
446  onOffline
447};
448var initialized = false;
449function setupListeners(dispatch, customHandler) {
450  function defaultHandler() {
451    const [handleFocus, handleFocusLost, handleOnline, handleOffline] = [onFocus, onFocusLost, onOnline, onOffline].map((action) => () => dispatch(action()));
452    const handleVisibilityChange = () => {
453      if (window.document.visibilityState === "visible") {
454        handleFocus();
455      } else {
456        handleFocusLost();
457      }
458    };
459    let unsubscribe = () => {
460      initialized = false;
461    };
462    if (!initialized) {
463      if (typeof window !== "undefined" && window.addEventListener) {
464        let updateListeners2 = function(add) {
465          Object.entries(handlers).forEach(([event, handler]) => {
466            if (add) {
467              window.addEventListener(event, handler, false);
468            } else {
469              window.removeEventListener(event, handler);
470            }
471          });
472        };
473        var updateListeners = updateListeners2;
474        const handlers = {
475          [FOCUS]: handleFocus,
476          [VISIBILITYCHANGE]: handleVisibilityChange,
477          [ONLINE]: handleOnline,
478          [OFFLINE]: handleOffline
479        };
480        updateListeners2(true);
481        initialized = true;
482        unsubscribe = () => {
483          updateListeners2(false);
484          initialized = false;
485        };
486      }
487    }
488    return unsubscribe;
489  }
490  return customHandler ? customHandler(dispatch, actions) : defaultHandler();
491}
492var ENDPOINT_QUERY = "query";
493var ENDPOINT_MUTATION = "mutation";
494var ENDPOINT_INFINITEQUERY = "infinitequery";
495function isQueryDefinition(e) {
496  return e.type === ENDPOINT_QUERY;
497}
498function isMutationDefinition(e) {
499  return e.type === ENDPOINT_MUTATION;
500}
501function isInfiniteQueryDefinition(e) {
502  return e.type === ENDPOINT_INFINITEQUERY;
503}
504function isAnyQueryDefinition(e) {
505  return isQueryDefinition(e) || isInfiniteQueryDefinition(e);
506}
507function calculateProvidedBy(description, result, error, queryArg, meta, assertTagTypes) {
508  const finalDescription = isFunction(description) ? description(result, error, queryArg, meta) : description;
509  if (finalDescription) {
510    return filterMap(finalDescription, isNotNullish, (tag) => assertTagTypes(expandTagDescription(tag)));
511  }
512  return [];
513}
514function isFunction(t) {
515  return typeof t === "function";
516}
517function expandTagDescription(description) {
518  return typeof description === "string" ? {
519    type: description
520  } : description;
521}
522function asSafePromise(promise, fallback) {
523  return promise.catch(fallback);
524}
525var getEndpointDefinition = (context, endpointName) => context.endpointDefinitions[endpointName];
526var forceQueryFnSymbol = Symbol("forceQueryFn");
527var isUpsertQuery = (arg) => typeof arg[forceQueryFnSymbol] === "function";
528function buildInitiate({
529  serializeQueryArgs,
530  queryThunk,
531  infiniteQueryThunk,
532  mutationThunk,
533  api,
534  context,
535  getInternalState
536}) {
537  const getRunningQueries = (dispatch) => {
538    var _a;
539    return (_a = getInternalState(dispatch)) == null ? void 0 : _a.runningQueries;
540  };
541  const getRunningMutations = (dispatch) => {
542    var _a;
543    return (_a = getInternalState(dispatch)) == null ? void 0 : _a.runningMutations;
544  };
545  const {
546    unsubscribeQueryResult,
547    removeMutationResult,
548    updateSubscriptionOptions
549  } = api.internalActions;
550  return {
551    buildInitiateQuery,
552    buildInitiateInfiniteQuery,
553    buildInitiateMutation,
554    getRunningQueryThunk,
555    getRunningMutationThunk,
556    getRunningQueriesThunk,
557    getRunningMutationsThunk
558  };
559  function getRunningQueryThunk(endpointName, queryArgs) {
560    return (dispatch) => {
561      var _a;
562      const endpointDefinition = getEndpointDefinition(context, endpointName);
563      const queryCacheKey = serializeQueryArgs({
564        queryArgs,
565        endpointDefinition,
566        endpointName
567      });
568      return (_a = getRunningQueries(dispatch)) == null ? void 0 : _a.get(queryCacheKey);
569    };
570  }
571  function getRunningMutationThunk(_endpointName, fixedCacheKeyOrRequestId) {
572    return (dispatch) => {
573      var _a;
574      return (_a = getRunningMutations(dispatch)) == null ? void 0 : _a.get(fixedCacheKeyOrRequestId);
575    };
576  }
577  function getRunningQueriesThunk() {
578    return (dispatch) => filterNullishValues(getRunningQueries(dispatch));
579  }
580  function getRunningMutationsThunk() {
581    return (dispatch) => filterNullishValues(getRunningMutations(dispatch));
582  }
vendor: 4,662 bytes, lines 583-712
583  function middlewareWarning(dispatch) {
584    if (true) {
585      if (middlewareWarning.triggered) return;
586      const returnedValue = dispatch(api.internalActions.internal_getRTKQSubscriptions());
587      middlewareWarning.triggered = true;
588      if (typeof returnedValue !== "object" || typeof (returnedValue == null ? void 0 : returnedValue.type) === "string") {
589        throw new Error(false ? formatProdErrorMessage(34) : `Warning: Middleware for RTK-Query API at reducerPath "${api.reducerPath}" has not been added to the store.
590You must add the middleware for RTK-Query to function correctly!`);
591      }
592    }
593  }
594  function buildInitiateAnyQuery(endpointName, endpointDefinition) {
595    const queryAction = (arg, {
596      subscribe = true,
597      forceRefetch,
598      subscriptionOptions,
599      [forceQueryFnSymbol]: forceQueryFn,
600      ...rest
601    } = {}) => (dispatch, getState) => {
602      var _a;
603      const queryCacheKey = serializeQueryArgs({
604        queryArgs: arg,
605        endpointDefinition,
606        endpointName
607      });
608      let thunk;
609      const commonThunkArgs = {
610        ...rest,
611        type: ENDPOINT_QUERY,
612        subscribe,
613        forceRefetch,
614        subscriptionOptions,
615        endpointName,
616        originalArgs: arg,
617        queryCacheKey,
618        [forceQueryFnSymbol]: forceQueryFn
619      };
620      if (isQueryDefinition(endpointDefinition)) {
621        thunk = queryThunk(commonThunkArgs);
622      } else {
623        const {
624          direction,
625          initialPageParam,
626          refetchCachedPages
627        } = rest;
628        thunk = infiniteQueryThunk({
629          ...commonThunkArgs,
630          // Supply these even if undefined. This helps with a field existence
631          // check over in `buildSlice.ts`
632          direction,
633          initialPageParam,
634          refetchCachedPages
635        });
636      }
637      const selector = api.endpoints[endpointName].select(arg);
638      const thunkResult = dispatch(thunk);
639      const stateAfter = selector(getState());
640      middlewareWarning(dispatch);
641      const {
642        requestId,
643        abort
644      } = thunkResult;
645      const skippedSynchronously = stateAfter.requestId !== requestId;
646      const runningQuery = (_a = getRunningQueries(dispatch)) == null ? void 0 : _a.get(queryCacheKey);
647      const selectFromState = () => selector(getState());
648      const statePromise = Object.assign(forceQueryFn ? (
649        // a query has been forced (upsertQueryData)
650        // -> we want to resolve it once data has been written with the data that will be written
651        thunkResult.then(selectFromState)
652      ) : skippedSynchronously && !runningQuery ? (
653        // a query has been skipped due to a condition and we do not have any currently running query
654        // -> we want to resolve it immediately with the current data
655        Promise.resolve(stateAfter)
656      ) : (
657        // query just started or one is already in flight
658        // -> wait for the running query, then resolve with data from after that
659        Promise.all([runningQuery, thunkResult]).then(selectFromState)
660      ), {
661        arg,
662        requestId,
663        subscriptionOptions,
664        queryCacheKey,
665        abort,
666        async unwrap() {
667          const result = await statePromise;
668          if (result.isError) {
669            throw result.error;
670          }
671          return result.data;
672        },
673        refetch: (options) => dispatch(queryAction(arg, {
674          subscribe: false,
675          forceRefetch: true,
676          ...options
677        })),
678        unsubscribe() {
679          if (subscribe) dispatch(unsubscribeQueryResult({
680            queryCacheKey,
681            requestId
682          }));
683        },
684        updateSubscriptionOptions(options) {
685          statePromise.subscriptionOptions = options;
686          dispatch(updateSubscriptionOptions({
687            endpointName,
688            requestId,
689            queryCacheKey,
690            options
691          }));
692        }
693      });
694      if (!runningQuery && !skippedSynchronously && !forceQueryFn) {
695        const runningQueries = getRunningQueries(dispatch);
696        runningQueries.set(queryCacheKey, statePromise);
697        statePromise.then(() => {
698          runningQueries.delete(queryCacheKey);
699        });
700      }
701      return statePromise;
702    };
703    return queryAction;
704  }
705  function buildInitiateQuery(endpointName, endpointDefinition) {
706    const queryAction = buildInitiateAnyQuery(endpointName, endpointDefinition);
707    return queryAction;
708  }
709  function buildInitiateInfiniteQuery(endpointName, endpointDefinition) {
710    const infiniteQueryAction = buildInitiateAnyQuery(endpointName, endpointDefinition);
711    return infiniteQueryAction;
712  }
vendor: 5,623 bytes, lines 713-901
713  function buildInitiateMutation(endpointName) {
714    return (arg, {
715      track = true,
716      fixedCacheKey
717    } = {}) => (dispatch, getState) => {
718      const thunk = mutationThunk({
719        type: "mutation",
720        endpointName,
721        originalArgs: arg,
722        track,
723        fixedCacheKey
724      });
725      const thunkResult = dispatch(thunk);
726      middlewareWarning(dispatch);
727      const {
728        requestId,
729        abort,
730        unwrap
731      } = thunkResult;
732      const returnValuePromise = asSafePromise(thunkResult.unwrap().then((data) => ({
733        data
734      })), (error) => ({
735        error
736      }));
737      const reset = () => {
738        dispatch(removeMutationResult({
739          requestId,
740          fixedCacheKey
741        }));
742      };
743      const ret = Object.assign(returnValuePromise, {
744        arg: thunkResult.arg,
745        requestId,
746        abort,
747        unwrap,
748        reset
749      });
750      const runningMutations = getRunningMutations(dispatch);
751      runningMutations.set(requestId, ret);
752      ret.then(() => {
753        runningMutations.delete(requestId);
754      });
755      if (fixedCacheKey) {
756        runningMutations.set(fixedCacheKey, ret);
757        ret.then(() => {
758          if (runningMutations.get(fixedCacheKey) === ret) {
759            runningMutations.delete(fixedCacheKey);
760          }
761        });
762      }
763      return ret;
764    };
765  }
766}
767var NamedSchemaError = class extends SchemaError {
768  constructor(issues, value, schemaName, _bqMeta) {
769    super(issues);
770    this.value = value;
771    this.schemaName = schemaName;
772    this._bqMeta = _bqMeta;
773  }
774};
775var shouldSkip = (skipSchemaValidation, schemaName) => Array.isArray(skipSchemaValidation) ? skipSchemaValidation.includes(schemaName) : !!skipSchemaValidation;
776async function parseWithSchema(schema, data, schemaName, bqMeta) {
777  const result = await schema["~standard"].validate(data);
778  if (result.issues) {
779    throw new NamedSchemaError(result.issues, data, schemaName, bqMeta);
780  }
781  return result.value;
782}
783function defaultTransformResponse(baseQueryReturnValue) {
784  return baseQueryReturnValue;
785}
786var addShouldAutoBatch = (arg = {}) => {
787  return {
788    ...arg,
789    [SHOULD_AUTOBATCH]: true
790  };
791};
792function buildThunks({
793  reducerPath,
794  baseQuery,
795  context: {
796    endpointDefinitions
797  },
798  serializeQueryArgs,
799  api,
800  assertTagType,
801  selectors,
802  onSchemaFailure,
803  catchSchemaFailure: globalCatchSchemaFailure,
804  skipSchemaValidation: globalSkipSchemaValidation
805}) {
806  const patchQueryData = (endpointName, arg, patches, updateProvided) => (dispatch, getState) => {
807    const endpointDefinition = endpointDefinitions[endpointName];
808    const queryCacheKey = serializeQueryArgs({
809      queryArgs: arg,
810      endpointDefinition,
811      endpointName
812    });
813    dispatch(api.internalActions.queryResultPatched({
814      queryCacheKey,
815      patches
816    }));
817    if (!updateProvided) {
818      return;
819    }
820    const newValue = api.endpoints[endpointName].select(arg)(
821      // Work around TS 4.1 mismatch
822      getState()
823    );
824    const providedTags = calculateProvidedBy(endpointDefinition.providesTags, newValue.data, void 0, arg, {}, assertTagType);
825    dispatch(api.internalActions.updateProvidedBy([{
826      queryCacheKey,
827      providedTags
828    }]));
829  };
830  function addToStart(items, item, max = 0) {
831    const newItems = [item, ...items];
832    return max && newItems.length > max ? newItems.slice(0, -1) : newItems;
833  }
834  function addToEnd(items, item, max = 0) {
835    const newItems = [...items, item];
836    return max && newItems.length > max ? newItems.slice(1) : newItems;
837  }
838  const updateQueryData = (endpointName, arg, updateRecipe, updateProvided = true) => (dispatch, getState) => {
839    const endpointDefinition = api.endpoints[endpointName];
840    const currentState = endpointDefinition.select(arg)(
841      // Work around TS 4.1 mismatch
842      getState()
843    );
844    const ret = {
845      patches: [],
846      inversePatches: [],
847      undo: () => dispatch(api.util.patchQueryData(endpointName, arg, ret.inversePatches, updateProvided))
848    };
849    if (currentState.status === STATUS_UNINITIALIZED) {
850      return ret;
851    }
852    let newValue;
853    if ("data" in currentState) {
854      if (isDraftable(currentState.data)) {
855        const [value, patches, inversePatches] = produceWithPatches(currentState.data, updateRecipe);
856        ret.patches.push(...patches);
857        ret.inversePatches.push(...inversePatches);
858        newValue = value;
859      } else {
860        newValue = updateRecipe(currentState.data);
861        ret.patches.push({
862          op: "replace",
863          path: [],
864          value: newValue
865        });
866        ret.inversePatches.push({
867          op: "replace",
868          path: [],
869          value: currentState.data
870        });
871      }
872    }
873    if (ret.patches.length === 0) {
874      return ret;
875    }
876    dispatch(api.util.patchQueryData(endpointName, arg, ret.patches, updateProvided));
877    return ret;
878  };
879  const upsertQueryData = (endpointName, arg, value) => (dispatch) => {
880    const res = dispatch(api.endpoints[endpointName].initiate(arg, {
881      subscribe: false,
882      forceRefetch: true,
883      [forceQueryFnSymbol]: () => ({
884        data: value
885      })
886    }));
887    return res;
888  };
889  const getTransformCallbackForEndpoint = (endpointDefinition, transformFieldName) => {
890    return endpointDefinition.query && endpointDefinition[transformFieldName] ? endpointDefinition[transformFieldName] : defaultTransformResponse;
891  };
892  const executeEndpoint = async (arg, {
893    signal,
894    abort,
895    rejectWithValue,
896    fulfillWithValue,
897    dispatch,
898    getState,
899    extra
900  }) => {
901    var _a, _b;
vendor: 4,946 bytes, lines 901-1023
901
902    const endpointDefinition = endpointDefinitions[arg.endpointName];
903    const {
904      metaSchema,
905      skipSchemaValidation = globalSkipSchemaValidation
906    } = endpointDefinition;
907    const isQuery = arg.type === ENDPOINT_QUERY;
908    try {
909      let transformResponse = defaultTransformResponse;
910      const baseQueryApi = {
911        signal,
912        abort,
913        dispatch,
914        getState,
915        extra,
916        endpoint: arg.endpointName,
917        type: arg.type,
918        forced: isQuery ? isForcedQuery(arg, getState()) : void 0,
919        queryCacheKey: isQuery ? arg.queryCacheKey : void 0
920      };
921      const forceQueryFn = isQuery ? arg[forceQueryFnSymbol] : void 0;
922      let finalQueryReturnValue;
923      const fetchPage = async (data, param, maxPages, previous) => {
924        if (param == null && data.pages.length) {
925          return Promise.resolve({
926            data
927          });
928        }
929        const finalQueryArg = {
930          queryArg: arg.originalArgs,
931          pageParam: param
932        };
933        const pageResponse = await executeRequest(finalQueryArg);
934        const addTo = previous ? addToStart : addToEnd;
935        return {
936          data: {
937            pages: addTo(data.pages, pageResponse.data, maxPages),
938            pageParams: addTo(data.pageParams, param, maxPages)
939          },
940          meta: pageResponse.meta
941        };
942      };
943      async function executeRequest(finalQueryArg) {
944        let result;
945        const {
946          extraOptions,
947          argSchema,
948          rawResponseSchema,
949          responseSchema
950        } = endpointDefinition;
951        if (argSchema && !shouldSkip(skipSchemaValidation, "arg")) {
952          finalQueryArg = await parseWithSchema(
953            argSchema,
954            finalQueryArg,
955            "argSchema",
956            {}
957            // we don't have a meta yet, so we can't pass it
958          );
959        }
960        if (forceQueryFn) {
961          result = forceQueryFn();
962        } else if (endpointDefinition.query) {
963          transformResponse = getTransformCallbackForEndpoint(endpointDefinition, "transformResponse");
964          result = await baseQuery(endpointDefinition.query(finalQueryArg), baseQueryApi, extraOptions);
965        } else {
966          result = await endpointDefinition.queryFn(finalQueryArg, baseQueryApi, extraOptions, (arg2) => baseQuery(arg2, baseQueryApi, extraOptions));
967        }
968        if (typeof process !== "undefined" && true) {
969          const what = endpointDefinition.query ? "`baseQuery`" : "`queryFn`";
970          let err;
971          if (!result) {
972            err = `${what} did not return anything.`;
973          } else if (typeof result !== "object") {
974            err = `${what} did not return an object.`;
975          } else if (result.error && result.data) {
976            err = `${what} returned an object containing both \`error\` and \`result\`.`;
977          } else if (result.error === void 0 && result.data === void 0) {
978            err = `${what} returned an object containing neither a valid \`error\` and \`result\`. At least one of them should not be \`undefined\``;
979          } else {
980            for (const key of Object.keys(result)) {
981              if (key !== "error" && key !== "data" && key !== "meta") {
982                err = `The object returned by ${what} has the unknown property ${key}.`;
983                break;
984              }
985            }
986          }
987          if (err) {
988            console.error(`Error encountered handling the endpoint ${arg.endpointName}.
989                  ${err}
990                  It needs to return an object with either the shape \`{ data: <value> }\` or \`{ error: <value> }\` that may contain an optional \`meta\` property.
991                  Object returned was:`, result);
992          }
993        }
994        if (result.error) throw new HandledError(result.error, result.meta);
995        let {
996          data
997        } = result;
998        if (rawResponseSchema && !shouldSkip(skipSchemaValidation, "rawResponse")) {
999          data = await parseWithSchema(rawResponseSchema, result.data, "rawResponseSchema", result.meta);
1000        }
1001        let transformedResponse = await transformResponse(data, result.meta, finalQueryArg);
1002        if (responseSchema && !shouldSkip(skipSchemaValidation, "response")) {
1003          transformedResponse = await parseWithSchema(responseSchema, transformedResponse, "responseSchema", result.meta);
1004        }
1005        return {
1006          ...result,
1007          data: transformedResponse
1008        };
1009      }
1010      if (isQuery && "infiniteQueryOptions" in endpointDefinition) {
1011        const {
1012          infiniteQueryOptions
1013        } = endpointDefinition;
1014        const {
1015          maxPages = Infinity
1016        } = infiniteQueryOptions;
1017        const refetchCachedPages = arg.refetchCachedPages ?? infiniteQueryOptions.refetchCachedPages ?? true;
1018        let result;
1019        const blankData = {
1020          pages: [],
1021          pageParams: []
1022        };
1023        const cachedData = 
vendor: 9,534 bytes, lines 1023-1259
1023(_a = selectors.selectQueryEntry(getState(), arg.queryCacheKey)) == null ? void 0 : _a.data;
1024        const isForcedQueryNeedingRefetch = (
1025          // arg.forceRefetch
1026          isForcedQuery(arg, getState()) && !arg.direction
1027        );
1028        const existingData = isForcedQueryNeedingRefetch || !cachedData ? blankData : cachedData;
1029        if ("direction" in arg && arg.direction && existingData.pages.length) {
1030          const previous = arg.direction === "backward";
1031          const pageParamFn = previous ? getPreviousPageParam : getNextPageParam;
1032          const param = pageParamFn(infiniteQueryOptions, existingData, arg.originalArgs);
1033          result = await fetchPage(existingData, param, maxPages, previous);
1034        } else {
1035          const {
1036            initialPageParam = infiniteQueryOptions.initialPageParam
1037          } = arg;
1038          const cachedPageParams = (cachedData == null ? void 0 : cachedData.pageParams) ?? [];
1039          const firstPageParam = cachedPageParams[0] ?? initialPageParam;
1040          const totalPages = cachedPageParams.length;
1041          result = await fetchPage(existingData, firstPageParam, maxPages);
1042          if (forceQueryFn) {
1043            result = {
1044              data: result.data.pages[0]
1045            };
1046          }
1047          if (refetchCachedPages) {
1048            for (let i = 1; i < totalPages; i++) {
1049              const param = getNextPageParam(infiniteQueryOptions, result.data, arg.originalArgs);
1050              result = await fetchPage(result.data, param, maxPages);
1051            }
1052          }
1053        }
1054        finalQueryReturnValue = result;
1055      } else {
1056        finalQueryReturnValue = await executeRequest(arg.originalArgs);
1057      }
1058      if (metaSchema && !shouldSkip(skipSchemaValidation, "meta") && finalQueryReturnValue.meta) {
1059        finalQueryReturnValue.meta = await parseWithSchema(metaSchema, finalQueryReturnValue.meta, "metaSchema", finalQueryReturnValue.meta);
1060      }
1061      return fulfillWithValue(finalQueryReturnValue.data, addShouldAutoBatch({
1062        fulfilledTimeStamp: Date.now(),
1063        baseQueryMeta: finalQueryReturnValue.meta
1064      }));
1065    } catch (error) {
1066      let caughtError = error;
1067      if (caughtError instanceof HandledError) {
1068        let transformErrorResponse = getTransformCallbackForEndpoint(endpointDefinition, "transformErrorResponse");
1069        const {
1070          rawErrorResponseSchema,
1071          errorResponseSchema
1072        } = endpointDefinition;
1073        let {
1074          value,
1075          meta
1076        } = caughtError;
1077        try {
1078          if (rawErrorResponseSchema && !shouldSkip(skipSchemaValidation, "rawErrorResponse")) {
1079            value = await parseWithSchema(rawErrorResponseSchema, value, "rawErrorResponseSchema", meta);
1080          }
1081          if (metaSchema && !shouldSkip(skipSchemaValidation, "meta")) {
1082            meta = await parseWithSchema(metaSchema, meta, "metaSchema", meta);
1083          }
1084          let transformedErrorResponse = await transformErrorResponse(value, meta, arg.originalArgs);
1085          if (errorResponseSchema && !shouldSkip(skipSchemaValidation, "errorResponse")) {
1086            transformedErrorResponse = await parseWithSchema(errorResponseSchema, transformedErrorResponse, "errorResponseSchema", meta);
1087          }
1088          return rejectWithValue(transformedErrorResponse, addShouldAutoBatch({
1089            baseQueryMeta: meta
1090          }));
1091        } catch (e) {
1092          caughtError = e;
1093        }
1094      }
1095      try {
1096        if (caughtError instanceof NamedSchemaError) {
1097          const info = {
1098            endpoint: arg.endpointName,
1099            arg: arg.originalArgs,
1100            type: arg.type,
1101            queryCacheKey: isQuery ? arg.queryCacheKey : void 0
1102          };
1103          (_b = endpointDefinition.onSchemaFailure) == null ? void 0 : _b.call(endpointDefinition, caughtError, info);
1104          onSchemaFailure == null ? void 0 : onSchemaFailure(caughtError, info);
1105          const {
1106            catchSchemaFailure = globalCatchSchemaFailure
1107          } = endpointDefinition;
1108          if (catchSchemaFailure) {
1109            return rejectWithValue(catchSchemaFailure(caughtError, info), addShouldAutoBatch({
1110              baseQueryMeta: caughtError._bqMeta
1111            }));
1112          }
1113        }
1114      } catch (e) {
1115        caughtError = e;
1116      }
1117      if (typeof process !== "undefined" && true) {
1118        console.error(`An unhandled error occurred processing a request for the endpoint "${arg.endpointName}".
1119In the case of an unhandled error, no tags will be "provided" or "invalidated".`, caughtError);
1120      } else {
1121        console.error(caughtError);
1122      }
1123      throw caughtError;
1124    }
1125  };
1126  function isForcedQuery(arg, state) {
1127    const requestState = selectors.selectQueryEntry(state, arg.queryCacheKey);
1128    const baseFetchOnMountOrArgChange = selectors.selectConfig(state).refetchOnMountOrArgChange;
1129    const fulfilledVal = requestState == null ? void 0 : requestState.fulfilledTimeStamp;
1130    const refetchVal = arg.forceRefetch ?? (arg.subscribe && baseFetchOnMountOrArgChange);
1131    if (refetchVal) {
1132      return refetchVal === true || (Number(/* @__PURE__ */ new Date()) - Number(fulfilledVal)) / 1e3 >= refetchVal;
1133    }
1134    return false;
1135  }
1136  const createQueryThunk = () => {
1137    const generatedQueryThunk = createAsyncThunk(`${reducerPath}/executeQuery`, executeEndpoint, {
1138      getPendingMeta({
1139        arg
1140      }) {
1141        const endpointDefinition = endpointDefinitions[arg.endpointName];
1142        return addShouldAutoBatch({
1143          startedTimeStamp: Date.now(),
1144          ...isInfiniteQueryDefinition(endpointDefinition) ? {
1145            direction: arg.direction
1146          } : {}
1147        });
1148      },
1149      condition(queryThunkArg, {
1150        getState
1151      }) {
1152        var _a;
1153        const state = getState();
1154        const requestState = selectors.selectQueryEntry(state, queryThunkArg.queryCacheKey);
1155        const fulfilledVal = requestState == null ? void 0 : requestState.fulfilledTimeStamp;
1156        const currentArg = queryThunkArg.originalArgs;
1157        const previousArg = requestState == null ? void 0 : requestState.originalArgs;
1158        const endpointDefinition = endpointDefinitions[queryThunkArg.endpointName];
1159        const direction = queryThunkArg.direction;
1160        if (isUpsertQuery(queryThunkArg)) {
1161          return true;
1162        }
1163        if ((requestState == null ? void 0 : requestState.status) === "pending") {
1164          return false;
1165        }
1166        if (isForcedQuery(queryThunkArg, state)) {
1167          return true;
1168        }
1169        if (isQueryDefinition(endpointDefinition) && ((_a = endpointDefinition == null ? void 0 : endpointDefinition.forceRefetch) == null ? void 0 : _a.call(endpointDefinition, {
1170          currentArg,
1171          previousArg,
1172          endpointState: requestState,
1173          state
1174        }))) {
1175          return true;
1176        }
1177        if (fulfilledVal && !direction) {
1178          return false;
1179        }
1180        return true;
1181      },
1182      dispatchConditionRejection: true
1183    });
1184    return generatedQueryThunk;
1185  };
1186  const queryThunk = createQueryThunk();
1187  const infiniteQueryThunk = createQueryThunk();
1188  const mutationThunk = createAsyncThunk(`${reducerPath}/executeMutation`, executeEndpoint, {
1189    getPendingMeta() {
1190      return addShouldAutoBatch({
1191        startedTimeStamp: Date.now()
1192      });
1193    }
1194  });
1195  const hasTheForce = (options) => "force" in options;
1196  const hasMaxAge = (options) => "ifOlderThan" in options;
1197  const prefetch = (endpointName, arg, options = {}) => (dispatch, getState) => {
1198    const force = hasTheForce(options) && options.force;
1199    const maxAge = hasMaxAge(options) && options.ifOlderThan;
1200    const queryAction = (force2 = true) => {
1201      const options2 = {
1202        forceRefetch: force2,
1203        subscribe: false
1204      };
1205      return api.endpoints[endpointName].initiate(arg, options2);
1206    };
1207    const latestStateValue = api.endpoints[endpointName].select(arg)(getState());
1208    if (force) {
1209      dispatch(queryAction());
1210    } else if (maxAge) {
1211      const lastFulfilledTs = latestStateValue == null ? void 0 : latestStateValue.fulfilledTimeStamp;
1212      if (!lastFulfilledTs) {
1213        dispatch(queryAction());
1214        return;
1215      }
1216      const shouldRetrigger = (Number(/* @__PURE__ */ new Date()) - Number(new Date(lastFulfilledTs))) / 1e3 >= maxAge;
1217      if (shouldRetrigger) {
1218        dispatch(queryAction());
1219      }
1220    } else {
1221      dispatch(queryAction(false));
1222    }
1223  };
1224  function matchesEndpoint(endpointName) {
1225    return (action) => {
1226      var _a, _b;
1227      return ((_b = (_a = action == null ? void 0 : action.meta) == null ? void 0 : _a.arg) == null ? void 0 : _b.endpointName) === endpointName;
1228    };
1229  }
1230  function buildMatchThunkActions(thunk, endpointName) {
1231    return {
1232      matchPending: isAllOf(isPending(thunk), matchesEndpoint(endpointName)),
1233      matchFulfilled: isAllOf(isFulfilled(thunk), matchesEndpoint(endpointName)),
1234      matchRejected: isAllOf(isRejected(thunk), matchesEndpoint(endpointName))
1235    };
1236  }
1237  return {
1238    queryThunk,
1239    mutationThunk,
1240    infiniteQueryThunk,
1241    prefetch,
1242    updateQueryData,
1243    upsertQueryData,
1244    patchQueryData,
1245    buildMatchThunkActions
1246  };
1247}
1248function getNextPageParam(options, {
1249  pages,
1250  pageParams
1251}, queryArg) {
1252  const lastIndex = pages.length - 1;
1253  return options.getNextPageParam(pages[lastIndex], pages, pageParams[lastIndex], pageParams, queryArg);
1254}
1255function getPreviousPageParam(options, {
1256  pages,
1257  pageParams
1258}, queryArg) {
1259  var _a;
vendor: 7,212 bytes, lines 1260-1484
1260  return (_a = options.getPreviousPageParam) == null ? void 0 : _a.call(options, pages[0], pages, pageParams[0], pageParams, queryArg);
1261}
1262function calculateProvidedByThunk(action, type, endpointDefinitions, assertTagType) {
1263  return calculateProvidedBy(endpointDefinitions[action.meta.arg.endpointName][type], isFulfilled(action) ? action.payload : void 0, isRejectedWithValue(action) ? action.payload : void 0, action.meta.arg.originalArgs, "baseQueryMeta" in action.meta ? action.meta.baseQueryMeta : void 0, assertTagType);
1264}
1265function getCurrent(value) {
1266  return isDraft(value) ? current(value) : value;
1267}
1268function updateQuerySubstateIfExists(state, queryCacheKey, update) {
1269  const substate = state[queryCacheKey];
1270  if (substate) {
1271    update(substate);
1272  }
1273}
1274function getMutationCacheKey(id) {
1275  return ("arg" in id ? id.arg.fixedCacheKey : id.fixedCacheKey) ?? id.requestId;
1276}
1277function updateMutationSubstateIfExists(state, id, update) {
1278  const substate = state[getMutationCacheKey(id)];
1279  if (substate) {
1280    update(substate);
1281  }
1282}
1283var initialState = {};
1284function buildSlice({
1285  reducerPath,
1286  queryThunk,
1287  mutationThunk,
1288  serializeQueryArgs,
1289  context: {
1290    endpointDefinitions: definitions,
1291    apiUid,
1292    extractRehydrationInfo,
1293    hasRehydrationInfo
1294  },
1295  assertTagType,
1296  config
1297}) {
1298  const resetApiState = createAction(`${reducerPath}/resetApiState`);
1299  function writePendingCacheEntry(draft, arg, upserting, meta) {
1300    var _a;
1301    draft[_a = arg.queryCacheKey] ?? (draft[_a] = {
1302      status: STATUS_UNINITIALIZED,
1303      endpointName: arg.endpointName
1304    });
1305    updateQuerySubstateIfExists(draft, arg.queryCacheKey, (substate) => {
1306      substate.status = STATUS_PENDING;
1307      substate.requestId = upserting && substate.requestId ? (
1308        // for `upsertQuery` **updates**, keep the current `requestId`
1309        substate.requestId
1310      ) : (
1311        // for normal queries or `upsertQuery` **inserts** always update the `requestId`
1312        meta.requestId
1313      );
1314      if (arg.originalArgs !== void 0) {
1315        substate.originalArgs = arg.originalArgs;
1316      }
1317      substate.startedTimeStamp = meta.startedTimeStamp;
1318      const endpointDefinition = definitions[meta.arg.endpointName];
1319      if (isInfiniteQueryDefinition(endpointDefinition) && "direction" in arg) {
1320        ;
1321        substate.direction = arg.direction;
1322      }
1323    });
1324  }
1325  function writeFulfilledCacheEntry(draft, meta, payload, upserting) {
1326    updateQuerySubstateIfExists(draft, meta.arg.queryCacheKey, (substate) => {
1327      if (substate.requestId !== meta.requestId && !upserting) return;
1328      const {
1329        merge
1330      } = definitions[meta.arg.endpointName];
1331      substate.status = STATUS_FULFILLED;
1332      if (merge) {
1333        if (substate.data !== void 0) {
1334          const {
1335            fulfilledTimeStamp,
1336            arg,
1337            baseQueryMeta,
1338            requestId
1339          } = meta;
1340          let newData = produce(substate.data, (draftSubstateData) => {
1341            return merge(draftSubstateData, payload, {
1342              arg: arg.originalArgs,
1343              baseQueryMeta,
1344              fulfilledTimeStamp,
1345              requestId
1346            });
1347          });
1348          substate.data = newData;
1349        } else {
1350          substate.data = payload;
1351        }
1352      } else {
1353        substate.data = definitions[meta.arg.endpointName].structuralSharing ?? true ? copyWithStructuralSharing(isDraft(substate.data) ? original(substate.data) : substate.data, payload) : payload;
1354      }
1355      delete substate.error;
1356      substate.fulfilledTimeStamp = meta.fulfilledTimeStamp;
1357    });
1358  }
1359  const querySlice = createSlice({
1360    name: `${reducerPath}/queries`,
1361    initialState,
1362    reducers: {
1363      removeQueryResult: {
1364        reducer(draft, {
1365          payload: {
1366            queryCacheKey
1367          }
1368        }) {
1369          delete draft[queryCacheKey];
1370        },
1371        prepare: prepareAutoBatched()
1372      },
1373      cacheEntriesUpserted: {
1374        reducer(draft, action) {
1375          for (const entry of action.payload) {
1376            const {
1377              queryDescription: arg,
1378              value
1379            } = entry;
1380            writePendingCacheEntry(draft, arg, true, {
1381              arg,
1382              requestId: action.meta.requestId,
1383              startedTimeStamp: action.meta.timestamp
1384            });
1385            writeFulfilledCacheEntry(
1386              draft,
1387              {
1388                arg,
1389                requestId: action.meta.requestId,
1390                fulfilledTimeStamp: action.meta.timestamp,
1391                baseQueryMeta: {}
1392              },
1393              value,
1394              // We know we're upserting here
1395              true
1396            );
1397          }
1398        },
1399        prepare: (payload) => {
1400          const queryDescriptions = payload.map((entry) => {
1401            const {
1402              endpointName,
1403              arg,
1404              value
1405            } = entry;
1406            const endpointDefinition = definitions[endpointName];
1407            const queryDescription = {
1408              type: ENDPOINT_QUERY,
1409              endpointName,
1410              originalArgs: entry.arg,
1411              queryCacheKey: serializeQueryArgs({
1412                queryArgs: arg,
1413                endpointDefinition,
1414                endpointName
1415              })
1416            };
1417            return {
1418              queryDescription,
1419              value
1420            };
1421          });
1422          const result = {
1423            payload: queryDescriptions,
1424            meta: {
1425              [SHOULD_AUTOBATCH]: true,
1426              requestId: nanoid(),
1427              timestamp: Date.now()
1428            }
1429          };
1430          return result;
1431        }
1432      },
1433      queryResultPatched: {
1434        reducer(draft, {
1435          payload: {
1436            queryCacheKey,
1437            patches
1438          }
1439        }) {
1440          updateQuerySubstateIfExists(draft, queryCacheKey, (substate) => {
1441            substate.data = applyPatches(substate.data, patches.concat());
1442          });
1443        },
1444        prepare: prepareAutoBatched()
1445      }
1446    },
1447    extraReducers(builder) {
1448      builder.addCase(queryThunk.pending, (draft, {
1449        meta,
1450        meta: {
1451          arg
1452        }
1453      }) => {
1454        const upserting = isUpsertQuery(arg);
1455        writePendingCacheEntry(draft, arg, upserting, meta);
1456      }).addCase(queryThunk.fulfilled, (draft, {
1457        meta,
1458        payload
1459      }) => {
1460        const upserting = isUpsertQuery(meta.arg);
1461        writeFulfilledCacheEntry(draft, meta, payload, upserting);
1462      }).addCase(queryThunk.rejected, (draft, {
1463        meta: {
1464          condition,
1465          arg,
1466          requestId
1467        },
1468        error,
1469        payload
1470      }) => {
1471        updateQuerySubstateIfExists(draft, arg.queryCacheKey, (substate) => {
1472          if (condition) {
1473          } else {
1474            if (substate.requestId !== requestId) return;
1475            substate.status = STATUS_REJECTED;
1476            substate.error = payload ?? error;
1477          }
1478        });
1479      }).addMatcher(hasRehydrationInfo, (draft, action) => {
1480        const {
1481          queries
1482        } = extractRehydrationInfo(action);
1483        for (const [key, entry] of Object.entries(queries)) {
1484          if (
vendor: 4,285 bytes, lines 1485-1610
1485            // do not rehydrate entries that were currently in flight.
1486            (entry == null ? void 0 : entry.status) === STATUS_FULFILLED || (entry == null ? void 0 : entry.status) === STATUS_REJECTED
1487          ) {
1488            draft[key] = entry;
1489          }
1490        }
1491      });
1492    }
1493  });
1494  const mutationSlice = createSlice({
1495    name: `${reducerPath}/mutations`,
1496    initialState,
1497    reducers: {
1498      removeMutationResult: {
1499        reducer(draft, {
1500          payload
1501        }) {
1502          const cacheKey = getMutationCacheKey(payload);
1503          if (cacheKey in draft) {
1504            delete draft[cacheKey];
1505          }
1506        },
1507        prepare: prepareAutoBatched()
1508      }
1509    },
1510    extraReducers(builder) {
1511      builder.addCase(mutationThunk.pending, (draft, {
1512        meta,
1513        meta: {
1514          requestId,
1515          arg,
1516          startedTimeStamp
1517        }
1518      }) => {
1519        if (!arg.track) return;
1520        draft[getMutationCacheKey(meta)] = {
1521          requestId,
1522          status: STATUS_PENDING,
1523          endpointName: arg.endpointName,
1524          startedTimeStamp
1525        };
1526      }).addCase(mutationThunk.fulfilled, (draft, {
1527        payload,
1528        meta
1529      }) => {
1530        if (!meta.arg.track) return;
1531        updateMutationSubstateIfExists(draft, meta, (substate) => {
1532          if (substate.requestId !== meta.requestId) return;
1533          substate.status = STATUS_FULFILLED;
1534          substate.data = payload;
1535          substate.fulfilledTimeStamp = meta.fulfilledTimeStamp;
1536        });
1537      }).addCase(mutationThunk.rejected, (draft, {
1538        payload,
1539        error,
1540        meta
1541      }) => {
1542        if (!meta.arg.track) return;
1543        updateMutationSubstateIfExists(draft, meta, (substate) => {
1544          if (substate.requestId !== meta.requestId) return;
1545          substate.status = STATUS_REJECTED;
1546          substate.error = payload ?? error;
1547        });
1548      }).addMatcher(hasRehydrationInfo, (draft, action) => {
1549        const {
1550          mutations
1551        } = extractRehydrationInfo(action);
1552        for (const [key, entry] of Object.entries(mutations)) {
1553          if (
1554            // do not rehydrate entries that were currently in flight.
1555            ((entry == null ? void 0 : entry.status) === STATUS_FULFILLED || (entry == null ? void 0 : entry.status) === STATUS_REJECTED) && // only rehydrate endpoints that were persisted using a `fixedCacheKey`
1556            key !== (entry == null ? void 0 : entry.requestId)
1557          ) {
1558            draft[key] = entry;
1559          }
1560        }
1561      });
1562    }
1563  });
1564  const initialInvalidationState = {
1565    tags: {},
1566    keys: {}
1567  };
1568  const invalidationSlice = createSlice({
1569    name: `${reducerPath}/invalidation`,
1570    initialState: initialInvalidationState,
1571    reducers: {
1572      updateProvidedBy: {
1573        reducer(draft, action) {
1574          var _a, _b, _c;
1575          for (const {
1576            queryCacheKey,
1577            providedTags
1578          } of action.payload) {
1579            removeCacheKeyFromTags(draft, queryCacheKey);
1580            for (const {
1581              type,
1582              id
1583            } of providedTags) {
1584              const subscribedQueries = (_b = (_a = draft.tags)[type] ?? (_a[type] = {}))[_c = id || "__internal_without_id"] ?? (_b[_c] = []);
1585              const alreadySubscribed = subscribedQueries.includes(queryCacheKey);
1586              if (!alreadySubscribed) {
1587                subscribedQueries.push(queryCacheKey);
1588              }
1589            }
1590            draft.keys[queryCacheKey] = providedTags;
1591          }
1592        },
1593        prepare: prepareAutoBatched()
1594      }
1595    },
1596    extraReducers(builder) {
1597      builder.addCase(querySlice.actions.removeQueryResult, (draft, {
1598        payload: {
1599          queryCacheKey
1600        }
1601      }) => {
1602        removeCacheKeyFromTags(draft, queryCacheKey);
1603      }).addMatcher(hasRehydrationInfo, (draft, action) => {
1604        var _a, _b, _c;
1605        const {
1606          provided
1607        } = extractRehydrationInfo(action);
1608        for (const [type, incomingTags] of Object.entries(provided.tags ?? {})) {
1609          for (const [id, cacheKeys] of Object.entries(incomingTags)) {
1610            const subscribedQueries = (_b = (_a = draft.tags)[type] ?? (_a[type] = {}))[_c = id || "__internal_without_id"] ?? (_b[_c] = []);
vendor: 5,638 bytes, lines 1611-1792
1611            for (const queryCacheKey of cacheKeys) {
1612              const alreadySubscribed = subscribedQueries.includes(queryCacheKey);
1613              if (!alreadySubscribed) {
1614                subscribedQueries.push(queryCacheKey);
1615              }
1616              draft.keys[queryCacheKey] = provided.keys[queryCacheKey];
1617            }
1618          }
1619        }
1620      }).addMatcher(isAnyOf(isFulfilled(queryThunk), isRejectedWithValue(queryThunk)), (draft, action) => {
1621        writeProvidedTagsForQueries(draft, [action]);
1622      }).addMatcher(querySlice.actions.cacheEntriesUpserted.match, (draft, action) => {
1623        const mockActions = action.payload.map(({
1624          queryDescription,
1625          value
1626        }) => {
1627          return {
1628            type: "UNKNOWN",
1629            payload: value,
1630            meta: {
1631              requestStatus: "fulfilled",
1632              requestId: "UNKNOWN",
1633              arg: queryDescription
1634            }
1635          };
1636        });
1637        writeProvidedTagsForQueries(draft, mockActions);
1638      });
1639    }
1640  });
1641  function removeCacheKeyFromTags(draft, queryCacheKey) {
1642    var _a;
1643    const existingTags = getCurrent(draft.keys[queryCacheKey] ?? []);
1644    for (const tag of existingTags) {
1645      const tagType = tag.type;
1646      const tagId = tag.id ?? "__internal_without_id";
1647      const tagSubscriptions = (_a = draft.tags[tagType]) == null ? void 0 : _a[tagId];
1648      if (tagSubscriptions) {
1649        draft.tags[tagType][tagId] = getCurrent(tagSubscriptions).filter((qc) => qc !== queryCacheKey);
1650      }
1651    }
1652    delete draft.keys[queryCacheKey];
1653  }
1654  function writeProvidedTagsForQueries(draft, actions3) {
1655    const providedByEntries = actions3.map((action) => {
1656      const providedTags = calculateProvidedByThunk(action, "providesTags", definitions, assertTagType);
1657      const {
1658        queryCacheKey
1659      } = action.meta.arg;
1660      return {
1661        queryCacheKey,
1662        providedTags
1663      };
1664    });
1665    invalidationSlice.caseReducers.updateProvidedBy(draft, invalidationSlice.actions.updateProvidedBy(providedByEntries));
1666  }
1667  const subscriptionSlice = createSlice({
1668    name: `${reducerPath}/subscriptions`,
1669    initialState,
1670    reducers: {
1671      updateSubscriptionOptions(d, a) {
1672      },
1673      unsubscribeQueryResult(d, a) {
1674      },
1675      internal_getRTKQSubscriptions() {
1676      }
1677    }
1678  });
1679  const internalSubscriptionsSlice = createSlice({
1680    name: `${reducerPath}/internalSubscriptions`,
1681    initialState,
1682    reducers: {
1683      subscriptionsUpdated: {
1684        reducer(state, action) {
1685          return applyPatches(state, action.payload);
1686        },
1687        prepare: prepareAutoBatched()
1688      }
1689    }
1690  });
1691  const configSlice = createSlice({
1692    name: `${reducerPath}/config`,
1693    initialState: {
1694      online: isOnline(),
1695      focused: isDocumentVisible(),
1696      middlewareRegistered: false,
1697      ...config
1698    },
1699    reducers: {
1700      middlewareRegistered(state, {
1701        payload
1702      }) {
1703        state.middlewareRegistered = state.middlewareRegistered === "conflict" || apiUid !== payload ? "conflict" : true;
1704      }
1705    },
1706    extraReducers: (builder) => {
1707      builder.addCase(onOnline, (state) => {
1708        state.online = true;
1709      }).addCase(onOffline, (state) => {
1710        state.online = false;
1711      }).addCase(onFocus, (state) => {
1712        state.focused = true;
1713      }).addCase(onFocusLost, (state) => {
1714        state.focused = false;
1715      }).addMatcher(hasRehydrationInfo, (draft) => ({
1716        ...draft
1717      }));
1718    }
1719  });
1720  const combinedReducer = combineReducers({
1721    queries: querySlice.reducer,
1722    mutations: mutationSlice.reducer,
1723    provided: invalidationSlice.reducer,
1724    subscriptions: internalSubscriptionsSlice.reducer,
1725    config: configSlice.reducer
1726  });
1727  const reducer = (state, action) => combinedReducer(resetApiState.match(action) ? void 0 : state, action);
1728  const actions2 = {
1729    ...configSlice.actions,
1730    ...querySlice.actions,
1731    ...subscriptionSlice.actions,
1732    ...internalSubscriptionsSlice.actions,
1733    ...mutationSlice.actions,
1734    ...invalidationSlice.actions,
1735    resetApiState
1736  };
1737  return {
1738    reducer,
1739    actions: actions2
1740  };
1741}
1742var skipToken = Symbol.for("RTKQ/skipToken");
1743var initialSubState = {
1744  status: STATUS_UNINITIALIZED
1745};
1746var defaultQuerySubState = produce(initialSubState, () => {
1747});
1748var defaultMutationSubState = produce(initialSubState, () => {
1749});
1750function buildSelectors({
1751  serializeQueryArgs,
1752  reducerPath,
1753  createSelector: createSelector2
1754}) {
1755  const selectSkippedQuery = (state) => defaultQuerySubState;
1756  const selectSkippedMutation = (state) => defaultMutationSubState;
1757  return {
1758    buildQuerySelector,
1759    buildInfiniteQuerySelector,
1760    buildMutationSelector,
1761    selectInvalidatedBy,
1762    selectCachedArgsForQuery,
1763    selectApiState,
1764    selectQueries,
1765    selectMutations,
1766    selectQueryEntry,
1767    selectConfig
1768  };
1769  function withRequestFlags(substate) {
1770    return {
1771      ...substate,
1772      ...getRequestStatusFlags(substate.status)
1773    };
1774  }
1775  function selectApiState(rootState) {
1776    const state = rootState[reducerPath];
1777    if (true) {
1778      if (!state) {
1779        if (selectApiState.triggered) return state;
1780        selectApiState.triggered = true;
1781        console.error(`Error: No data found at \`state.${reducerPath}\`. Did you forget to add the reducer to the store?`);
1782      }
1783    }
1784    return state;
1785  }
1786  function selectQueries(rootState) {
1787    var _a;
1788    return (_a = selectApiState(rootState)) == null ? void 0 : _a.queries;
1789  }
1790  function selectQueryEntry(rootState, cacheKey) {
1791    var _a;
1792    return (_a = selectQueries(rootState)) == null ? void 0 : _a[c
1792acheKey];
1793  }
1794  function selectMutations(rootState) {
1795    var _a;
1796    return (_a = selectApiState(rootState)) == null ? void 0 : _a.mutations;
1797  }
1798  function selectConfig(rootState) {
1799    var _a;
1800    return (_a = selectApiState(rootState)) == null ? void 0 : _a.config;
1801  }
1802  function buildAnyQuerySelector(endpointName, endpointDefinition, combiner) {
1803    return (queryArgs) => {
1804      if (queryArgs === skipToken) {
1805        return createSelector2(selectSkippedQuery, combiner);
1806      }
1807      const serializedArgs = serializeQueryArgs({
1808        queryArgs,
1809        endpointDefinition,
1810        endpointName
1811      });
1812      const selectQuerySubstate = (state) => selectQueryEntry(state, serializedArgs) ?? defaultQuerySubState;
1813      return createSelector2(selectQuerySubstate, combiner);
1814    };
1815  }
1816  function buildQuerySelector(endpointName, endpointDefinition) {
1817    return buildAnyQuerySelector(endpointName, endpointDefinition, withRequestFlags);
1818  }
1819  function buildInfiniteQuerySelector(endpointName, endpointDefinition) {
1820    const {
1821      infiniteQueryOptions
1822    } = endpointDefinition;
1823    function withInfiniteQueryResultFlags(substate) {
1824      const stateWithRequestFlags = {
1825        ...substate,
1826        ...getRequestStatusFlags(substate.status)
1827      };
1828      const {
1829        isLoading,
1830        isError,
1831        direction
1832      } = stateWithRequestFlags;
1833      const isForward = direction === "forward";
1834      const isBackward = direction === "backward";
1835      return {
1836        ...stateWithRequestFlags,
1837        hasNextPage: getHasNextPage(infiniteQueryOptions, stateWithRequestFlags.data, stateWithRequestFlags.originalArgs),
1838        hasPreviousPage: getHasPreviousPage(infiniteQueryOptions, stateWithRequestFlags.data, stateWithRequestFlags.originalArgs),
1839        isFetchingNextPage: isLoading && isForward,
1840        isFetchingPreviousPage: isLoading && isBackward,
1841        isFetchNextPageError: isError && isForward,
1842        isFetchPreviousPageError: isError && isBackward
1843      };
1844    }
1845    return buildAnyQuerySelector(endpointName, endpointDefinition, withInfiniteQueryResultFlags);
1846  }
1847  function buildMutationSelector() {
1848    return (id) => {
1849      let mutationId;
1850      if (typeof id === "object") {
1851        mutationId = getMutationCacheKey(id) ?? skipToken;
1852      } else {
1853        mutationId = id;
1854      }
1855      const selectMutationSubstate = (state) => {
1856        var _a, _b;
1857        return ((_b = (_a = selectApiState(state)) == null ? void 0 : _a.mutations) == null ? void 0 : _b[mutationId]) ?? defaultMutationSubState;
1858      };
1859      const finalSelectMutationSubstate = mutationId === skipToken ? selectSkippedMutation : selectMutationSubstate;
1860      return createSelector2(finalSelectMutationSubstate, withRequestFlags);
1861    };
1862  }
1863  function selectInvalidatedBy(state, tags) {
1864    const apiState = state[reducerPath];
1865    const toInvalidate = /* @__PURE__ */ new Set();
1866    const finalTags = filterMap(tags, isNotNullish, expandTagDescription);
1867    for (const tag of finalTags) {
1868      const provided = apiState.provided.tags[tag.type];
1869      if (!provided) {
1870        continue;
1871      }
1872      let invalidateSubscriptions = (tag.id !== void 0 ? (
1873        // id given: invalidate all queries that provide this type & id
1874        provided[tag.id]
1875      ) : (
1876        // no id: invalidate all queries that provide this type
1877        Object.values(provided).flat()
1878      )) ?? [];
1879      for (const invalidate of invalidateSubscriptions) {
1880        toInvalidate.add(invalidate);
1881      }
1882    }
1883    return Array.from(toInvalidate.values()).flatMap((queryCacheKey) => {
1884      const querySubState = apiState.queries[queryCacheKey];
1885      return querySubState ? {
1886        queryCacheKey,
1887        endpointName: querySubState.endpointName,
1888        originalArgs: querySubState.originalArgs
1889      } : [];
1890    });
1891  }
1892  function selectCachedArgsForQuery(state, queryName) {
1893    return filterMap(Object.values(selectQueries(state)), (entry) => (entry == null ? void 0 : entry.endpointName) === queryName && entry.status !== STATUS_UNINITIALIZED, (entry) => entry.originalArgs);
1894  }
1895  function getHasNextPage(options, data, queryArg) {
1896    if (!data) return false;
vendor: 5,127 bytes, lines 1897-2038
1897    return getNextPageParam(options, data, queryArg) != null;
1898  }
1899  function getHasPreviousPage(options, data, queryArg) {
1900    if (!data || !options.getPreviousPageParam) return false;
1901    return getPreviousPageParam(options, data, queryArg) != null;
1902  }
1903}
1904var cache = WeakMap ? /* @__PURE__ */ new WeakMap() : void 0;
1905var defaultSerializeQueryArgs = ({
1906  endpointName,
1907  queryArgs
1908}) => {
1909  let serialized = "";
1910  const cached = cache == null ? void 0 : cache.get(queryArgs);
1911  if (typeof cached === "string") {
1912    serialized = cached;
1913  } else {
1914    const stringified = JSON.stringify(queryArgs, (key, value) => {
1915      value = typeof value === "bigint" ? {
1916        $bigint: value.toString()
1917      } : value;
1918      value = isPlainObject(value) ? Object.keys(value).sort().reduce((acc, key2) => {
1919        acc[key2] = value[key2];
1920        return acc;
1921      }, {}) : value;
1922      return value;
1923    });
1924    if (isPlainObject(queryArgs)) {
1925      cache == null ? void 0 : cache.set(queryArgs, stringified);
1926    }
1927    serialized = stringified;
1928  }
1929  return `${endpointName}(${serialized})`;
1930};
1931function buildCreateApi(...modules) {
1932  return function baseCreateApi(options) {
1933    const extractRehydrationInfo = weakMapMemoize((action) => {
1934      var _a;
1935      return (_a = options.extractRehydrationInfo) == null ? void 0 : _a.call(options, action, {
1936        reducerPath: options.reducerPath ?? "api"
1937      });
1938    });
1939    const optionsWithDefaults = {
1940      reducerPath: "api",
1941      keepUnusedDataFor: 60,
1942      refetchOnMountOrArgChange: false,
1943      refetchOnFocus: false,
1944      refetchOnReconnect: false,
1945      invalidationBehavior: "delayed",
1946      ...options,
1947      extractRehydrationInfo,
1948      serializeQueryArgs(queryArgsApi) {
1949        let finalSerializeQueryArgs = defaultSerializeQueryArgs;
1950        if ("serializeQueryArgs" in queryArgsApi.endpointDefinition) {
1951          const endpointSQA = queryArgsApi.endpointDefinition.serializeQueryArgs;
1952          finalSerializeQueryArgs = (queryArgsApi2) => {
1953            const initialResult = endpointSQA(queryArgsApi2);
1954            if (typeof initialResult === "string") {
1955              return initialResult;
1956            } else {
1957              return defaultSerializeQueryArgs({
1958                ...queryArgsApi2,
1959                queryArgs: initialResult
1960              });
1961            }
1962          };
1963        } else if (options.serializeQueryArgs) {
1964          finalSerializeQueryArgs = options.serializeQueryArgs;
1965        }
1966        return finalSerializeQueryArgs(queryArgsApi);
1967      },
1968      tagTypes: [...options.tagTypes || []]
1969    };
1970    const context = {
1971      endpointDefinitions: {},
1972      batch(fn) {
1973        fn();
1974      },
1975      apiUid: nanoid(),
1976      extractRehydrationInfo,
1977      hasRehydrationInfo: weakMapMemoize((action) => extractRehydrationInfo(action) != null)
1978    };
1979    const api = {
1980      injectEndpoints,
1981      enhanceEndpoints({
1982        addTagTypes,
1983        endpoints
1984      }) {
1985        if (addTagTypes) {
1986          for (const eT of addTagTypes) {
1987            if (!optionsWithDefaults.tagTypes.includes(eT)) {
1988              ;
1989              optionsWithDefaults.tagTypes.push(eT);
1990            }
1991          }
1992        }
1993        if (endpoints) {
1994          for (const [endpointName, partialDefinition] of Object.entries(endpoints)) {
1995            if (typeof partialDefinition === "function") {
1996              partialDefinition(getEndpointDefinition(context, endpointName));
1997            } else {
1998              Object.assign(getEndpointDefinition(context, endpointName) || {}, partialDefinition);
1999            }
2000          }
2001        }
2002        return api;
2003      }
2004    };
2005    const initializedModules = modules.map((m) => m.init(api, optionsWithDefaults, context));
2006    function injectEndpoints(inject) {
2007      const evaluatedEndpoints = inject.endpoints({
2008        query: (x) => ({
2009          ...x,
2010          type: ENDPOINT_QUERY
2011        }),
2012        mutation: (x) => ({
2013          ...x,
2014          type: ENDPOINT_MUTATION
2015        }),
2016        infiniteQuery: (x) => ({
2017          ...x,
2018          type: ENDPOINT_INFINITEQUERY
2019        })
2020      });
2021      for (const [endpointName, definition] of Object.entries(evaluatedEndpoints)) {
2022        if (inject.overrideExisting !== true && endpointName in context.endpointDefinitions) {
2023          if (inject.overrideExisting === "throw") {
2024            throw new Error(false ? formatProdErrorMessage(39) : `called \`injectEndpoints\` to override already-existing endpointName ${endpointName} without specifying \`overrideExisting: true\``);
2025          } else if (typeof process !== "undefined" && true) {
2026            console.error(`called \`injectEndpoints\` to override already-existing endpointName ${endpointName} without specifying \`overrideExisting: true\``);
2027          }
2028          continue;
2029        }
2030        if (typeof process !== "undefined" && true) {
2031          if (isInfiniteQueryDefinition(definition)) {
2032            const {
2033              infiniteQueryOptions
2034            } = definition;
2035            const {
2036              maxPages,
2037              getPreviousPageParam: getPreviousPageParam2
2038            } = infiniteQueryOptions;
vendor: 5,758 bytes, lines 2039-2201
2039            if (typeof maxPages === "number") {
2040              if (maxPages < 1) {
2041                throw new Error(false ? formatProdErrorMessage(40) : `maxPages for endpoint '${endpointName}' must be a number greater than 0`);
2042              }
2043              if (typeof getPreviousPageParam2 !== "function") {
2044                throw new Error(false ? formatProdErrorMessage(41) : `getPreviousPageParam for endpoint '${endpointName}' must be a function if maxPages is used`);
2045              }
2046            }
2047          }
2048        }
2049        context.endpointDefinitions[endpointName] = definition;
2050        for (const m of initializedModules) {
2051          m.injectEndpoint(endpointName, definition);
2052        }
2053      }
2054      return api;
2055    }
2056    return api.injectEndpoints({
2057      endpoints: options.endpoints
2058    });
2059  };
2060}
2061var _NEVER = Symbol();
2062function fakeBaseQuery() {
2063  return function() {
2064    throw new Error(false ? formatProdErrorMessage(33) : "When using `fakeBaseQuery`, all queries & mutations must use the `queryFn` definition syntax.");
2065  };
2066}
2067function assertCast(v) {
2068}
2069function safeAssign(target, ...args) {
2070  return Object.assign(target, ...args);
2071}
2072var buildBatchedActionsHandler = ({
2073  api,
2074  queryThunk,
2075  internalState,
2076  mwApi
2077}) => {
2078  const subscriptionsPrefix = `${api.reducerPath}/subscriptions`;
2079  let previousSubscriptions = null;
2080  let updateSyncTimer = null;
2081  const {
2082    updateSubscriptionOptions,
2083    unsubscribeQueryResult
2084  } = api.internalActions;
2085  const actuallyMutateSubscriptions = (currentSubscriptions, action) => {
2086    if (updateSubscriptionOptions.match(action)) {
2087      const {
2088        queryCacheKey,
2089        requestId,
2090        options
2091      } = action.payload;
2092      const sub = currentSubscriptions.get(queryCacheKey);
2093      if (sub == null ? void 0 : sub.has(requestId)) {
2094        sub.set(requestId, options);
2095      }
2096      return true;
2097    }
2098    if (unsubscribeQueryResult.match(action)) {
2099      const {
2100        queryCacheKey,
2101        requestId
2102      } = action.payload;
2103      const sub = currentSubscriptions.get(queryCacheKey);
2104      if (sub) {
2105        sub.delete(requestId);
2106      }
2107      return true;
2108    }
2109    if (api.internalActions.removeQueryResult.match(action)) {
2110      currentSubscriptions.delete(action.payload.queryCacheKey);
2111      return true;
2112    }
2113    if (queryThunk.pending.match(action)) {
2114      const {
2115        meta: {
2116          arg,
2117          requestId
2118        }
2119      } = action;
2120      const substate = getOrInsertComputed(currentSubscriptions, arg.queryCacheKey, createNewMap);
2121      if (arg.subscribe) {
2122        substate.set(requestId, arg.subscriptionOptions ?? substate.get(requestId) ?? {});
2123      }
2124      return true;
2125    }
2126    let mutated = false;
2127    if (queryThunk.rejected.match(action)) {
2128      const {
2129        meta: {
2130          condition,
2131          arg,
2132          requestId
2133        }
2134      } = action;
2135      if (condition && arg.subscribe) {
2136        const substate = getOrInsertComputed(currentSubscriptions, arg.queryCacheKey, createNewMap);
2137        substate.set(requestId, arg.subscriptionOptions ?? substate.get(requestId) ?? {});
2138        mutated = true;
2139      }
2140    }
2141    return mutated;
2142  };
2143  const getSubscriptions = () => internalState.currentSubscriptions;
2144  const getSubscriptionCount = (queryCacheKey) => {
2145    const subscriptions = getSubscriptions();
2146    const subscriptionsForQueryArg = subscriptions.get(queryCacheKey);
2147    return (subscriptionsForQueryArg == null ? void 0 : subscriptionsForQueryArg.size) ?? 0;
2148  };
2149  const isRequestSubscribed = (queryCacheKey, requestId) => {
2150    var _a;
2151    const subscriptions = getSubscriptions();
2152    return !!((_a = subscriptions == null ? void 0 : subscriptions.get(queryCacheKey)) == null ? void 0 : _a.get(requestId));
2153  };
2154  const subscriptionSelectors = {
2155    getSubscriptions,
2156    getSubscriptionCount,
2157    isRequestSubscribed
2158  };
2159  function serializeSubscriptions(currentSubscriptions) {
2160    return JSON.parse(JSON.stringify(Object.fromEntries([...currentSubscriptions].map(([k, v]) => [k, Object.fromEntries(v)]))));
2161  }
2162  return (action, mwApi2) => {
2163    if (!previousSubscriptions) {
2164      previousSubscriptions = serializeSubscriptions(internalState.currentSubscriptions);
2165    }
2166    if (api.util.resetApiState.match(action)) {
2167      previousSubscriptions = {};
2168      internalState.currentSubscriptions.clear();
2169      updateSyncTimer = null;
2170      return [true, false];
2171    }
2172    if (api.internalActions.internal_getRTKQSubscriptions.match(action)) {
2173      return [false, subscriptionSelectors];
2174    }
2175    const didMutate = actuallyMutateSubscriptions(internalState.currentSubscriptions, action);
2176    let actionShouldContinue = true;
2177    if (false) {
2178      return [false, internalState.currentPolls];
2179    }
2180    if (didMutate) {
2181      if (!updateSyncTimer) {
2182        updateSyncTimer = setTimeout(() => {
2183          const newSubscriptions = serializeSubscriptions(internalState.currentSubscriptions);
2184          const [, patches] = produceWithPatches(previousSubscriptions, () => newSubscriptions);
2185          mwApi2.next(api.internalActions.subscriptionsUpdated(patches));
2186          previousSubscriptions = newSubscriptions;
2187          updateSyncTimer = null;
2188        }, 500);
2189      }
2190      const isSubscriptionSliceAction = typeof action.type == "string" && !!action.type.startsWith(subscriptionsPrefix);
2191      const isAdditionalSubscriptionAction = queryThunk.rejected.match(action) && action.meta.condition && !!action.meta.arg.subscribe;
2192      actionShouldContinue = !isSubscriptionSliceAction && !isAdditionalSubscriptionAction;
2193    }
2194    return [actionShouldContinue, false];
2195  };
2196};
2197var THIRTY_TWO_BIT_MAX_TIMER_SECONDS = 2147483647 / 1e3 - 1;
2198var buildCacheCollectionHandler = ({
2199  reducerPath,
2200  api,
2201  queryThunk,
vendor: 20,982 bytes, lines 2202-2789
2202  context,
2203  internalState,
2204  selectors: {
2205    selectQueryEntry,
2206    selectConfig
2207  },
2208  getRunningQueryThunk,
2209  mwApi
2210}) => {
2211  const {
2212    removeQueryResult,
2213    unsubscribeQueryResult,
2214    cacheEntriesUpserted
2215  } = api.internalActions;
2216  const canTriggerUnsubscribe = isAnyOf(unsubscribeQueryResult.match, queryThunk.fulfilled, queryThunk.rejected, cacheEntriesUpserted.match);
2217  function anySubscriptionsRemainingForKey(queryCacheKey) {
2218    const subscriptions = internalState.currentSubscriptions.get(queryCacheKey);
2219    if (!subscriptions) {
2220      return false;
2221    }
2222    const hasSubscriptions = subscriptions.size > 0;
2223    return hasSubscriptions;
2224  }
2225  const currentRemovalTimeouts = {};
2226  function abortAllPromises(promiseMap) {
2227    var _a;
2228    for (const promise of promiseMap.values()) {
2229      (_a = promise == null ? void 0 : promise.abort) == null ? void 0 : _a.call(promise);
2230    }
2231  }
2232  const handler = (action, mwApi2) => {
2233    const state = mwApi2.getState();
2234    const config = selectConfig(state);
2235    if (canTriggerUnsubscribe(action)) {
2236      let queryCacheKeys;
2237      if (cacheEntriesUpserted.match(action)) {
2238        queryCacheKeys = action.payload.map((entry) => entry.queryDescription.queryCacheKey);
2239      } else {
2240        const {
2241          queryCacheKey
2242        } = unsubscribeQueryResult.match(action) ? action.payload : action.meta.arg;
2243        queryCacheKeys = [queryCacheKey];
2244      }
2245      handleUnsubscribeMany(queryCacheKeys, mwApi2, config);
2246    }
2247    if (api.util.resetApiState.match(action)) {
2248      for (const [key, timeout] of Object.entries(currentRemovalTimeouts)) {
2249        if (timeout) clearTimeout(timeout);
2250        delete currentRemovalTimeouts[key];
2251      }
2252      abortAllPromises(internalState.runningQueries);
2253      abortAllPromises(internalState.runningMutations);
2254    }
2255    if (context.hasRehydrationInfo(action)) {
2256      const {
2257        queries
2258      } = context.extractRehydrationInfo(action);
2259      handleUnsubscribeMany(Object.keys(queries), mwApi2, config);
2260    }
2261  };
2262  function handleUnsubscribeMany(cacheKeys, api2, config) {
2263    const state = api2.getState();
2264    for (const queryCacheKey of cacheKeys) {
2265      const entry = selectQueryEntry(state, queryCacheKey);
2266      if (entry == null ? void 0 : entry.endpointName) {
2267        handleUnsubscribe(queryCacheKey, entry.endpointName, api2, config);
2268      }
2269    }
2270  }
2271  function handleUnsubscribe(queryCacheKey, endpointName, api2, config) {
2272    const endpointDefinition = getEndpointDefinition(context, endpointName);
2273    const keepUnusedDataFor = (endpointDefinition == null ? void 0 : endpointDefinition.keepUnusedDataFor) ?? config.keepUnusedDataFor;
2274    if (keepUnusedDataFor === Infinity) {
2275      return;
2276    }
2277    const finalKeepUnusedDataFor = Math.max(0, Math.min(keepUnusedDataFor, THIRTY_TWO_BIT_MAX_TIMER_SECONDS));
2278    if (!anySubscriptionsRemainingForKey(queryCacheKey)) {
2279      const currentTimeout = currentRemovalTimeouts[queryCacheKey];
2280      if (currentTimeout) {
2281        clearTimeout(currentTimeout);
2282      }
2283      currentRemovalTimeouts[queryCacheKey] = setTimeout(() => {
2284        if (!anySubscriptionsRemainingForKey(queryCacheKey)) {
2285          const entry = selectQueryEntry(api2.getState(), queryCacheKey);
2286          if (entry == null ? void 0 : entry.endpointName) {
2287            const runningQuery = api2.dispatch(getRunningQueryThunk(entry.endpointName, entry.originalArgs));
2288            runningQuery == null ? void 0 : runningQuery.abort();
2289          }
2290          api2.dispatch(removeQueryResult({
2291            queryCacheKey
2292          }));
2293        }
2294        delete currentRemovalTimeouts[queryCacheKey];
2295      }, finalKeepUnusedDataFor * 1e3);
2296    }
2297  }
2298  return handler;
2299};
2300var neverResolvedError = new Error("Promise never resolved before cacheEntryRemoved.");
2301var buildCacheLifecycleHandler = ({
2302  api,
2303  reducerPath,
2304  context,
2305  queryThunk,
2306  mutationThunk,
2307  internalState,
2308  selectors: {
2309    selectQueryEntry,
2310    selectApiState
2311  }
2312}) => {
2313  const isQueryThunk = isAsyncThunkAction(queryThunk);
2314  const isMutationThunk = isAsyncThunkAction(mutationThunk);
2315  const isFulfilledThunk = isFulfilled(queryThunk, mutationThunk);
2316  const lifecycleMap = {};
2317  const {
2318    removeQueryResult,
2319    removeMutationResult,
2320    cacheEntriesUpserted
2321  } = api.internalActions;
2322  function resolveLifecycleEntry(cacheKey, data, meta) {
2323    const lifecycle = lifecycleMap[cacheKey];
2324    if (lifecycle == null ? void 0 : lifecycle.valueResolved) {
2325      lifecycle.valueResolved({
2326        data,
2327        meta
2328      });
2329      delete lifecycle.valueResolved;
2330    }
2331  }
2332  function removeLifecycleEntry(cacheKey) {
2333    const lifecycle = lifecycleMap[cacheKey];
2334    if (lifecycle) {
2335      delete lifecycleMap[cacheKey];
2336      lifecycle.cacheEntryRemoved();
2337    }
2338  }
2339  function getActionMetaFields(action) {
2340    const {
2341      arg,
2342      requestId
2343    } = action.meta;
2344    const {
2345      endpointName,
2346      originalArgs
2347    } = arg;
2348    return [endpointName, originalArgs, requestId];
2349  }
2350  const handler = (action, mwApi, stateBefore) => {
2351    const cacheKey = getCacheKey(action);
2352    function checkForNewCacheKey(endpointName, cacheKey2, requestId, originalArgs) {
2353      const oldEntry = selectQueryEntry(stateBefore, cacheKey2);
2354      const newEntry = selectQueryEntry(mwApi.getState(), cacheKey2);
2355      if (!oldEntry && newEntry) {
2356        handleNewKey(endpointName, originalArgs, cacheKey2, mwApi, requestId);
2357      }
2358    }
2359    if (queryThunk.pending.match(action)) {
2360      const [endpointName, originalArgs, requestId] = getActionMetaFields(action);
2361      checkForNewCacheKey(endpointName, cacheKey, requestId, originalArgs);
2362    } else if (cacheEntriesUpserted.match(action)) {
2363      for (const {
2364        queryDescription,
2365        value
2366      } of action.payload) {
2367        const {
2368          endpointName,
2369          originalArgs,
2370          queryCacheKey
2371        } = queryDescription;
2372        checkForNewCacheKey(endpointName, queryCacheKey, action.meta.requestId, originalArgs);
2373        resolveLifecycleEntry(queryCacheKey, value, {});
2374      }
2375    } else if (mutationThunk.pending.match(action)) {
2376      const state = mwApi.getState()[reducerPath].mutations[cacheKey];
2377      if (state) {
2378        const [endpointName, originalArgs, requestId] = getActionMetaFields(action);
2379        handleNewKey(endpointName, originalArgs, cacheKey, mwApi, requestId);
2380      }
2381    } else if (isFulfilledThunk(action)) {
2382      resolveLifecycleEntry(cacheKey, action.payload, action.meta.baseQueryMeta);
2383    } else if (removeQueryResult.match(action) || removeMutationResult.match(action)) {
2384      removeLifecycleEntry(cacheKey);
2385    } else if (api.util.resetApiState.match(action)) {
2386      for (const cacheKey2 of Object.keys(lifecycleMap)) {
2387        removeLifecycleEntry(cacheKey2);
2388      }
2389    }
2390  };
2391  function getCacheKey(action) {
2392    if (isQueryThunk(action)) return action.meta.arg.queryCacheKey;
2393    if (isMutationThunk(action)) {
2394      return action.meta.arg.fixedCacheKey ?? action.meta.requestId;
2395    }
2396    if (removeQueryResult.match(action)) return action.payload.queryCacheKey;
2397    if (removeMutationResult.match(action)) return getMutationCacheKey(action.payload);
2398    return "";
2399  }
2400  function handleNewKey(endpointName, originalArgs, queryCacheKey, mwApi, requestId) {
2401    const endpointDefinition = getEndpointDefinition(context, endpointName);
2402    const onCacheEntryAdded = endpointDefinition == null ? void 0 : endpointDefinition.onCacheEntryAdded;
2403    if (!onCacheEntryAdded) return;
2404    const lifecycle = {};
2405    const cacheEntryRemoved = new Promise((resolve) => {
2406      lifecycle.cacheEntryRemoved = resolve;
2407    });
2408    const cacheDataLoaded = Promise.race([new Promise((resolve) => {
2409      lifecycle.valueResolved = resolve;
2410    }), cacheEntryRemoved.then(() => {
2411      throw neverResolvedError;
2412    })]);
2413    cacheDataLoaded.catch(() => {
2414    });
2415    lifecycleMap[queryCacheKey] = lifecycle;
2416    const selector = api.endpoints[endpointName].select(isAnyQueryDefinition(endpointDefinition) ? originalArgs : queryCacheKey);
2417    const extra = mwApi.dispatch((_, __, extra2) => extra2);
2418    const lifecycleApi = {
2419      ...mwApi,
2420      getCacheEntry: () => selector(mwApi.getState()),
2421      requestId,
2422      extra,
2423      updateCachedData: isAnyQueryDefinition(endpointDefinition) ? (updateRecipe) => mwApi.dispatch(api.util.updateQueryData(endpointName, originalArgs, updateRecipe)) : void 0,
2424      cacheDataLoaded,
2425      cacheEntryRemoved
2426    };
2427    const runningHandler = onCacheEntryAdded(originalArgs, lifecycleApi);
2428    Promise.resolve(runningHandler).catch((e) => {
2429      if (e === neverResolvedError) return;
2430      throw e;
2431    });
2432  }
2433  return handler;
2434};
2435var buildDevCheckHandler = ({
2436  api,
2437  context: {
2438    apiUid
2439  },
2440  reducerPath
2441}) => {
2442  return (action, mwApi) => {
2443    var _a, _b;
2444    if (api.util.resetApiState.match(action)) {
2445      mwApi.dispatch(api.internalActions.middlewareRegistered(apiUid));
2446    }
2447    if (typeof process !== "undefined" && true) {
2448      if (api.internalActions.middlewareRegistered.match(action) && action.payload === apiUid && ((_b = (_a = mwApi.getState()[reducerPath]) == null ? void 0 : _a.config) == null ? void 0 : _b.middlewareRegistered) === "conflict") {
2449        console.warn(`There is a mismatch between slice and middleware for the reducerPath "${reducerPath}".
2450You can only have one api per reducer path, this will lead to crashes in various situations!${reducerPath === "api" ? `
2451If you have multiple apis, you *have* to specify the reducerPath option when using createApi!` : ""}`);
2452      }
2453    }
2454  };
2455};
2456var buildInvalidationByTagsHandler = ({
2457  reducerPath,
2458  context,
2459  context: {
2460    endpointDefinitions
2461  },
2462  mutationThunk,
2463  queryThunk,
2464  api,
2465  assertTagType,
2466  refetchQuery,
2467  internalState
2468}) => {
2469  const {
2470    removeQueryResult
2471  } = api.internalActions;
2472  const isThunkActionWithTags = isAnyOf(isFulfilled(mutationThunk), isRejectedWithValue(mutationThunk));
2473  const isQueryEnd = isAnyOf(isFulfilled(queryThunk, mutationThunk), isRejected(queryThunk, mutationThunk));
2474  let pendingTagInvalidations = [];
2475  let pendingRequestCount = 0;
2476  const handler = (action, mwApi) => {
2477    if (queryThunk.pending.match(action) || mutationThunk.pending.match(action)) {
2478      pendingRequestCount++;
2479    }
2480    if (isQueryEnd(action)) {
2481      pendingRequestCount = Math.max(0, pendingRequestCount - 1);
2482    }
2483    if (isThunkActionWithTags(action)) {
2484      invalidateTags(calculateProvidedByThunk(action, "invalidatesTags", endpointDefinitions, assertTagType), mwApi);
2485    } else if (isQueryEnd(action)) {
2486      invalidateTags([], mwApi);
2487    } else if (api.util.invalidateTags.match(action)) {
2488      invalidateTags(calculateProvidedBy(action.payload, void 0, void 0, void 0, void 0, assertTagType), mwApi);
2489    }
2490  };
2491  function hasPendingRequests() {
2492    return pendingRequestCount > 0;
2493  }
2494  function invalidateTags(newTags, mwApi) {
2495    const rootState = mwApi.getState();
2496    const state = rootState[reducerPath];
2497    pendingTagInvalidations.push(...newTags);
2498    if (state.config.invalidationBehavior === "delayed" && hasPendingRequests()) {
2499      return;
2500    }
2501    const tags = pendingTagInvalidations;
2502    pendingTagInvalidations = [];
2503    if (tags.length === 0) return;
2504    const toInvalidate = api.util.selectInvalidatedBy(rootState, tags);
2505    context.batch(() => {
2506      const valuesArray = Array.from(toInvalidate.values());
2507      for (const {
2508        queryCacheKey
2509      } of valuesArray) {
2510        const querySubState = state.queries[queryCacheKey];
2511        const subscriptionSubState = getOrInsertComputed(internalState.currentSubscriptions, queryCacheKey, createNewMap);
2512        if (querySubState) {
2513          if (subscriptionSubState.size === 0) {
2514            mwApi.dispatch(removeQueryResult({
2515              queryCacheKey
2516            }));
2517          } else if (querySubState.status !== STATUS_UNINITIALIZED) {
2518            mwApi.dispatch(refetchQuery(querySubState));
2519          }
2520        }
2521      }
2522    });
2523  }
2524  return handler;
2525};
2526var buildPollingHandler = ({
2527  reducerPath,
2528  queryThunk,
2529  api,
2530  refetchQuery,
2531  internalState
2532}) => {
2533  const {
2534    currentPolls,
2535    currentSubscriptions
2536  } = internalState;
2537  const pendingPollingUpdates = /* @__PURE__ */ new Set();
2538  let pollingUpdateTimer = null;
2539  const handler = (action, mwApi) => {
2540    if (api.internalActions.updateSubscriptionOptions.match(action) || api.internalActions.unsubscribeQueryResult.match(action)) {
2541      schedulePollingUpdate(action.payload.queryCacheKey, mwApi);
2542    }
2543    if (queryThunk.pending.match(action) || queryThunk.rejected.match(action) && action.meta.condition) {
2544      schedulePollingUpdate(action.meta.arg.queryCacheKey, mwApi);
2545    }
2546    if (queryThunk.fulfilled.match(action) || queryThunk.rejected.match(action) && !action.meta.condition) {
2547      startNextPoll(action.meta.arg, mwApi);
2548    }
2549    if (api.util.resetApiState.match(action)) {
2550      clearPolls();
2551      if (pollingUpdateTimer) {
2552        clearTimeout(pollingUpdateTimer);
2553        pollingUpdateTimer = null;
2554      }
2555      pendingPollingUpdates.clear();
2556    }
2557  };
2558  function schedulePollingUpdate(queryCacheKey, api2) {
2559    pendingPollingUpdates.add(queryCacheKey);
2560    if (!pollingUpdateTimer) {
2561      pollingUpdateTimer = setTimeout(() => {
2562        for (const key of pendingPollingUpdates) {
2563          updatePollingInterval({
2564            queryCacheKey: key
2565          }, api2);
2566        }
2567        pendingPollingUpdates.clear();
2568        pollingUpdateTimer = null;
2569      }, 0);
2570    }
2571  }
2572  function startNextPoll({
2573    queryCacheKey
2574  }, api2) {
2575    const state = api2.getState()[reducerPath];
2576    const querySubState = state.queries[queryCacheKey];
2577    const subscriptions = currentSubscriptions.get(queryCacheKey);
2578    if (!querySubState || querySubState.status === STATUS_UNINITIALIZED) return;
2579    const {
2580      lowestPollingInterval,
2581      skipPollingIfUnfocused
2582    } = findLowestPollingInterval(subscriptions);
2583    if (!Number.isFinite(lowestPollingInterval)) return;
2584    const currentPoll = currentPolls.get(queryCacheKey);
2585    if (currentPoll == null ? void 0 : currentPoll.timeout) {
2586      clearTimeout(currentPoll.timeout);
2587      currentPoll.timeout = void 0;
2588    }
2589    const nextPollTimestamp = Date.now() + lowestPollingInterval;
2590    currentPolls.set(queryCacheKey, {
2591      nextPollTimestamp,
2592      pollingInterval: lowestPollingInterval,
2593      timeout: setTimeout(() => {
2594        if (state.config.focused || !skipPollingIfUnfocused) {
2595          api2.dispatch(refetchQuery(querySubState));
2596        }
2597        startNextPoll({
2598          queryCacheKey
2599        }, api2);
2600      }, lowestPollingInterval)
2601    });
2602  }
2603  function updatePollingInterval({
2604    queryCacheKey
2605  }, api2) {
2606    const state = api2.getState()[reducerPath];
2607    const querySubState = state.queries[queryCacheKey];
2608    const subscriptions = currentSubscriptions.get(queryCacheKey);
2609    if (!querySubState || querySubState.status === STATUS_UNINITIALIZED) {
2610      return;
2611    }
2612    const {
2613      lowestPollingInterval
2614    } = findLowestPollingInterval(subscriptions);
2615    if (false) {
2616      const updateCounters = currentPolls.pollUpdateCounters ?? (currentPolls.pollUpdateCounters = {});
2617      updateCounters[queryCacheKey] ?? (updateCounters[queryCacheKey] = 0);
2618      updateCounters[queryCacheKey]++;
2619    }
2620    if (!Number.isFinite(lowestPollingInterval)) {
2621      cleanupPollForKey(queryCacheKey);
2622      return;
2623    }
2624    const currentPoll = currentPolls.get(queryCacheKey);
2625    const nextPollTimestamp = Date.now() + lowestPollingInterval;
2626    if (!currentPoll || nextPollTimestamp < currentPoll.nextPollTimestamp) {
2627      startNextPoll({
2628        queryCacheKey
2629      }, api2);
2630    }
2631  }
2632  function cleanupPollForKey(key) {
2633    const existingPoll = currentPolls.get(key);
2634    if (existingPoll == null ? void 0 : existingPoll.timeout) {
2635      clearTimeout(existingPoll.timeout);
2636    }
2637    currentPolls.delete(key);
2638  }
2639  function clearPolls() {
2640    for (const key of currentPolls.keys()) {
2641      cleanupPollForKey(key);
2642    }
2643  }
2644  function findLowestPollingInterval(subscribers = /* @__PURE__ */ new Map()) {
2645    let skipPollingIfUnfocused = false;
2646    let lowestPollingInterval = Number.POSITIVE_INFINITY;
2647    for (const entry of subscribers.values()) {
2648      if (!!entry.pollingInterval) {
2649        lowestPollingInterval = Math.min(entry.pollingInterval, lowestPollingInterval);
2650        skipPollingIfUnfocused = entry.skipPollingIfUnfocused || skipPollingIfUnfocused;
2651      }
2652    }
2653    return {
2654      lowestPollingInterval,
2655      skipPollingIfUnfocused
2656    };
2657  }
2658  return handler;
2659};
2660var buildQueryLifecycleHandler = ({
2661  api,
2662  context,
2663  queryThunk,
2664  mutationThunk
2665}) => {
2666  const isPendingThunk = isPending(queryThunk, mutationThunk);
2667  const isRejectedThunk = isRejected(queryThunk, mutationThunk);
2668  const isFullfilledThunk = isFulfilled(queryThunk, mutationThunk);
2669  const lifecycleMap = {};
2670  const handler = (action, mwApi) => {
2671    var _a, _b;
2672    if (isPendingThunk(action)) {
2673      const {
2674        requestId,
2675        arg: {
2676          endpointName,
2677          originalArgs
2678        }
2679      } = action.meta;
2680      const endpointDefinition = getEndpointDefinition(context, endpointName);
2681      const onQueryStarted = endpointDefinition == null ? void 0 : endpointDefinition.onQueryStarted;
2682      if (onQueryStarted) {
2683        const lifecycle = {};
2684        const queryFulfilled = new Promise((resolve, reject) => {
2685          lifecycle.resolve = resolve;
2686          lifecycle.reject = reject;
2687        });
2688        queryFulfilled.catch(() => {
2689        });
2690        lifecycleMap[requestId] = lifecycle;
2691        const selector = api.endpoints[endpointName].select(isAnyQueryDefinition(endpointDefinition) ? originalArgs : requestId);
2692        const extra = mwApi.dispatch((_, __, extra2) => extra2);
2693        const lifecycleApi = {
2694          ...mwApi,
2695          getCacheEntry: () => selector(mwApi.getState()),
2696          requestId,
2697          extra,
2698          updateCachedData: isAnyQueryDefinition(endpointDefinition) ? (updateRecipe) => mwApi.dispatch(api.util.updateQueryData(endpointName, originalArgs, updateRecipe)) : void 0,
2699          queryFulfilled
2700        };
2701        onQueryStarted(originalArgs, lifecycleApi);
2702      }
2703    } else if (isFullfilledThunk(action)) {
2704      const {
2705        requestId,
2706        baseQueryMeta
2707      } = action.meta;
2708      (_a = lifecycleMap[requestId]) == null ? void 0 : _a.resolve({
2709        data: action.payload,
2710        meta: baseQueryMeta
2711      });
2712      delete lifecycleMap[requestId];
2713    } else if (isRejectedThunk(action)) {
2714      const {
2715        requestId,
2716        rejectedWithValue,
2717        baseQueryMeta
2718      } = action.meta;
2719      (_b = lifecycleMap[requestId]) == null ? void 0 : _b.reject({
2720        error: action.payload ?? action.error,
2721        isUnhandledError: !rejectedWithValue,
2722        meta: baseQueryMeta
2723      });
2724      delete lifecycleMap[requestId];
2725    }
2726  };
2727  return handler;
2728};
2729var buildWindowEventHandler = ({
2730  reducerPath,
2731  context,
2732  api,
2733  refetchQuery,
2734  internalState
2735}) => {
2736  const {
2737    removeQueryResult
2738  } = api.internalActions;
2739  const handler = (action, mwApi) => {
2740    if (onFocus.match(action)) {
2741      refetchValidQueries(mwApi, "refetchOnFocus");
2742    }
2743    if (onOnline.match(action)) {
2744      refetchValidQueries(mwApi, "refetchOnReconnect");
2745    }
2746  };
2747  function refetchValidQueries(api2, type) {
2748    const state = api2.getState()[reducerPath];
2749    const queries = state.queries;
2750    const subscriptions = internalState.currentSubscriptions;
2751    context.batch(() => {
2752      for (const queryCacheKey of subscriptions.keys()) {
2753        const querySubState = queries[queryCacheKey];
2754        const subscriptionSubState = subscriptions.get(queryCacheKey);
2755        if (!subscriptionSubState || !querySubState) continue;
2756        const values = [...subscriptionSubState.values()];
2757        const shouldRefetch = values.some((sub) => sub[type] === true) || values.every((sub) => sub[type] === void 0) && state.config[type];
2758        if (shouldRefetch) {
2759          if (subscriptionSubState.size === 0) {
2760            api2.dispatch(removeQueryResult({
2761              queryCacheKey
2762            }));
2763          } else if (querySubState.status !== STATUS_UNINITIALIZED) {
2764            api2.dispatch(refetchQuery(querySubState));
2765          }
2766        }
2767      }
2768    });
2769  }
2770  return handler;
2771};
2772function buildMiddleware(input) {
2773  const {
2774    reducerPath,
2775    queryThunk,
2776    api,
2777    context,
2778    getInternalState
2779  } = input;
2780  const {
2781    apiUid
2782  } = context;
2783  const actions2 = {
2784    invalidateTags: createAction(`${reducerPath}/invalidateTags`)
2785  };
2786  const isThisApiSliceAction = (action) => action.type.startsWith(`${reducerPath}/`);
2787  const handlerBuilders = [buildDevCheckHandler, buildCacheCollectionHandler, buildInvalidationByTagsHandler, buildPollingHandler, buildCacheLifecycleHandler, buildQueryLifecycleHandler];
2788  const middleware = (mwApi) => {
2789    let initialized2 = false;
vendor: 6,263 bytes, lines 2790-3020
2790    const internalState = getInternalState(mwApi.dispatch);
2791    const builderArgs = {
2792      ...input,
2793      internalState,
2794      refetchQuery,
2795      isThisApiSliceAction,
2796      mwApi
2797    };
2798    const handlers = handlerBuilders.map((build) => build(builderArgs));
2799    const batchedActionsHandler = buildBatchedActionsHandler(builderArgs);
2800    const windowEventsHandler = buildWindowEventHandler(builderArgs);
2801    return (next) => {
2802      return (action) => {
2803        if (!isAction(action)) {
2804          return next(action);
2805        }
2806        if (!initialized2) {
2807          initialized2 = true;
2808          mwApi.dispatch(api.internalActions.middlewareRegistered(apiUid));
2809        }
2810        const mwApiWithNext = {
2811          ...mwApi,
2812          next
2813        };
2814        const stateBefore = mwApi.getState();
2815        const [actionShouldContinue, internalProbeResult] = batchedActionsHandler(action, mwApiWithNext, stateBefore);
2816        let res;
2817        if (actionShouldContinue) {
2818          res = next(action);
2819        } else {
2820          res = internalProbeResult;
2821        }
2822        if (!!mwApi.getState()[reducerPath]) {
2823          windowEventsHandler(action, mwApiWithNext, stateBefore);
2824          if (isThisApiSliceAction(action) || context.hasRehydrationInfo(action)) {
2825            for (const handler of handlers) {
2826              handler(action, mwApiWithNext, stateBefore);
2827            }
2828          }
2829        }
2830        return res;
2831      };
2832    };
2833  };
2834  return {
2835    middleware,
2836    actions: actions2
2837  };
2838  function refetchQuery(querySubState) {
2839    return input.api.endpoints[querySubState.endpointName].initiate(querySubState.originalArgs, {
2840      subscribe: false,
2841      forceRefetch: true
2842    });
2843  }
2844}
2845var coreModuleName = Symbol();
2846var coreModule = ({
2847  createSelector: createSelector2 = createSelector
2848} = {}) => ({
2849  name: coreModuleName,
2850  init(api, {
2851    baseQuery,
2852    tagTypes,
2853    reducerPath,
2854    serializeQueryArgs,
2855    keepUnusedDataFor,
2856    refetchOnMountOrArgChange,
2857    refetchOnFocus,
2858    refetchOnReconnect,
2859    invalidationBehavior,
2860    onSchemaFailure,
2861    catchSchemaFailure,
2862    skipSchemaValidation
2863  }, context) {
2864    enablePatches();
2865    assertCast(serializeQueryArgs);
2866    const assertTagType = (tag) => {
2867      if (typeof process !== "undefined" && true) {
2868        if (!tagTypes.includes(tag.type)) {
2869          console.error(`Tag type '${tag.type}' was used, but not specified in \`tagTypes\`!`);
2870        }
2871      }
2872      return tag;
2873    };
2874    Object.assign(api, {
2875      reducerPath,
2876      endpoints: {},
2877      internalActions: {
2878        onOnline,
2879        onOffline,
2880        onFocus,
2881        onFocusLost
2882      },
2883      util: {}
2884    });
2885    const selectors = buildSelectors({
2886      serializeQueryArgs,
2887      reducerPath,
2888      createSelector: createSelector2
2889    });
2890    const {
2891      selectInvalidatedBy,
2892      selectCachedArgsForQuery,
2893      buildQuerySelector,
2894      buildInfiniteQuerySelector,
2895      buildMutationSelector
2896    } = selectors;
2897    safeAssign(api.util, {
2898      selectInvalidatedBy,
2899      selectCachedArgsForQuery
2900    });
2901    const {
2902      queryThunk,
2903      infiniteQueryThunk,
2904      mutationThunk,
2905      patchQueryData,
2906      updateQueryData,
2907      upsertQueryData,
2908      prefetch,
2909      buildMatchThunkActions
2910    } = buildThunks({
2911      baseQuery,
2912      reducerPath,
2913      context,
2914      api,
2915      serializeQueryArgs,
2916      assertTagType,
2917      selectors,
2918      onSchemaFailure,
2919      catchSchemaFailure,
2920      skipSchemaValidation
2921    });
2922    const {
2923      reducer,
2924      actions: sliceActions
2925    } = buildSlice({
2926      context,
2927      queryThunk,
2928      infiniteQueryThunk,
2929      mutationThunk,
2930      serializeQueryArgs,
2931      reducerPath,
2932      assertTagType,
2933      config: {
2934        refetchOnFocus,
2935        refetchOnReconnect,
2936        refetchOnMountOrArgChange,
2937        keepUnusedDataFor,
2938        reducerPath,
2939        invalidationBehavior
2940      }
2941    });
2942    safeAssign(api.util, {
2943      patchQueryData,
2944      updateQueryData,
2945      upsertQueryData,
2946      prefetch,
2947      resetApiState: sliceActions.resetApiState,
2948      upsertQueryEntries: sliceActions.cacheEntriesUpserted
2949    });
2950    safeAssign(api.internalActions, sliceActions);
2951    const internalStateMap = /* @__PURE__ */ new WeakMap();
2952    const getInternalState = (dispatch) => {
2953      const state = getOrInsertComputed(internalStateMap, dispatch, () => ({
2954        currentSubscriptions: /* @__PURE__ */ new Map(),
2955        currentPolls: /* @__PURE__ */ new Map(),
2956        runningQueries: /* @__PURE__ */ new Map(),
2957        runningMutations: /* @__PURE__ */ new Map()
2958      }));
2959      return state;
2960    };
2961    const {
2962      buildInitiateQuery,
2963      buildInitiateInfiniteQuery,
2964      buildInitiateMutation,
2965      getRunningMutationThunk,
2966      getRunningMutationsThunk,
2967      getRunningQueriesThunk,
2968      getRunningQueryThunk
2969    } = buildInitiate({
2970      queryThunk,
2971      mutationThunk,
2972      infiniteQueryThunk,
2973      api,
2974      serializeQueryArgs,
2975      context,
2976      getInternalState
2977    });
2978    safeAssign(api.util, {
2979      getRunningMutationThunk,
2980      getRunningMutationsThunk,
2981      getRunningQueryThunk,
2982      getRunningQueriesThunk
2983    });
2984    const {
2985      middleware,
2986      actions: middlewareActions
2987    } = buildMiddleware({
2988      reducerPath,
2989      context,
2990      queryThunk,
2991      mutationThunk,
2992      infiniteQueryThunk,
2993      api,
2994      assertTagType,
2995      selectors,
2996      getRunningQueryThunk,
2997      getInternalState
2998    });
2999    safeAssign(api.util, middlewareActions);
3000    safeAssign(api, {
3001      reducer,
3002      middleware
3003    });
3004    return {
3005      name: coreModuleName,
3006      injectEndpoint(endpointName, definition) {
3007        var _a;
3008        const anyApi = api;
3009        const endpoint = (_a = anyApi.endpoints)[endpointName] ?? (_a[endpointName] = {});
3010        if (isQueryDefinition(definition)) {
3011          safeAssign(endpoint, {
3012            name: endpointName,
3013            select: buildQuerySelector(endpointName, definition),
3014            initiate: buildInitiateQuery(endpointName, definition)
3015          }, buildMatchThunkActions(queryThunk, endpointName));
3016        }
3017        if (isMutationDefinition(definition)) {
3018          safeAssign(endpoint, {
3019            name: endpointName,
3020            select: buildMutationSelector(),
3021            initiate: buildInitiateMutation(endpointName)
3022          }, buildMatchThunkActions(mutationThunk, endpointName));
3023        }
3024        if (isInfiniteQueryDefinition(definition)) {
3025          safeAssign(endpoint, {
3026            name: endpointName,
3027            select: buildInfiniteQuerySelector(endpointName, definition),
3028            initiate: buildInitiateInfiniteQuery(endpointName, definition)
3029          }, buildMatchThunkActions(queryThunk, endpointName));
3030        }
3031      }
3032    };
3033  }
3034});
3035var createApi = buildCreateApi(coreModule());
3036export {
3037  QueryStatus,
3038  copyWithStructuralSharing,
3039  fetchBaseQuery,
3040  retry,
3041  setupListeners,
3042  NamedSchemaError,
3043  skipToken,
3044  defaultSerializeQueryArgs,
3045  buildCreateApi,
3046  _NEVER,
3047  fakeBaseQuery,
3048  coreModuleName,
3049  coreModule,
3050  createApi
3051};
3052
3053//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNodW5rLVdPM0FRRllTLmpzP3Y9YmY3NjMzMzAiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF9fYnVmZmVyX3BvbHlmaWxsIGZyb20gJ3ZpdGUtcGx1Z2luLW5vZGUtcG9seWZpbGxzL3NoaW1zL2J1ZmZlcidcbmdsb2JhbFRoaXMuQnVmZmVyID0gZ2xvYmFsVGhpcy5CdWZmZXIgfHwgX19idWZmZXJfcG9seWZpbGxcbmltcG9ydCBfX2dsb2JhbF9wb2x5ZmlsbCBmcm9tICd2aXRlLXBsdWdpbi1ub2RlLXBvbHlmaWxscy9zaGltcy9nbG9iYWwnXG5nbG9iYWxUaGlzLmdsb2JhbCA9IGdsb2JhbFRoaXMuZ2xvYmFsIHx8IF9fZ2xvYmFsX3BvbHlmaWxsXG5pbXBvcnQgX19wcm9jZXNzX3BvbHlmaWxsIGZyb20gJ3ZpdGUtcGx1Z2luLW5vZGUtcG9seWZpbGxzL3NoaW1zL3Byb2Nlc3MnXG5nbG9iYWxUaGlzLnByb2Nlc3MgPSBnbG9iYWxUaGlzLnByb2Nlc3MgfHwgX19wcm9jZXNzX3BvbHlmaWxsXG5cbmltcG9ydCB7XG4gIFNIT1VMRF9BVVRPQkFUQ0gsXG4gIGFwcGx5UGF0Y2hlcyxcbiAgY29tYmluZVJlZHVjZXJzLFxuICBjcmVhdGVBY3Rpb24sXG4gIGNyZWF0ZUFzeW5jVGh1bmssXG4gIGNyZWF0ZVNlbGVjdG9yLFxuICBjcmVhdGVTbGljZSxcbiAgY3VycmVudCxcbiAgZW5hYmxlUGF0Y2hlcyxcbiAgZm9ybWF0UHJvZEVycm9yTWVzc2FnZSxcbiAgaXNBY3Rpb24sXG4gIGlzQWxsT2YsXG4gIGlzQW55T2YsXG4gIGlzQXN5bmNUaHVua0FjdGlvbixcbiAgaXNEcmFmdCxcbiAgaXNEcmFmdGFibGUsXG4gIGlzRnVsZmlsbGVkLFxuICBpc1BlbmRpbmcsXG4gIGlzUGxhaW5PYmplY3QsXG4gIGlzUmVqZWN0ZWQsXG4gIGlzUmVqZWN0ZWRXaXRoVmFsdWUsXG4gIG5hbm9pZCxcbiAgb3JpZ2luYWwsXG4gIHByZXBhcmVBdXRvQmF0Y2hlZCxcbiAgcHJvZHVjZSxcbiAgcHJvZHVjZVdpdGhQYXRjaGVzLFxuICB3ZWFrTWFwTWVtb2l6ZVxufSBmcm9tIFwiLi9jaHVuay0ySUNORDI1My5qc1wiO1xuaW1wb3J0IHtcbiAgX19wdWJsaWNGaWVsZCxcbiAgX190b0VTTSxcbiAgcmVxdWlyZV9kaXN0LFxuICByZXF1aXJlX2Rpc3QyLFxuICByZXF1aXJlX2Rpc3QzXG59IGZyb20gXCIuL2NodW5rLUNVUk5GWlJSLmpzXCI7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcmVkdXhqcyt0b29sa2l0QDIuMTEuMl9yZWFjdC1yZWR1eEA5LjIuMF9AdHlwZXMrcmVhY3RAMTguMy4yN19yZWFjdEAxOC4zLjFfcmVkdXhANS4wLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvQHJlZHV4anMvdG9vbGtpdC9kaXN0L3F1ZXJ5L3J0ay1xdWVyeS5tb2Rlcm4ubWpzXG52YXIgaW1wb3J0X2Rpc3Q0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BzdGFuZGFyZC1zY2hlbWErdXRpbHNAMC4zLjAvbm9kZV9tb2R1bGVzL0BzdGFuZGFyZC1zY2hlbWEvdXRpbHMvZGlzdC9pbmRleC5qc1xudmFyIGltcG9ydF9kaXN0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSk7XG52YXIgaW1wb3J0X2Rpc3QyID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCkpO1xudmFyIGltcG9ydF9kaXN0MyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpKTtcbnZhciBTY2hlbWFFcnJvciA9IGNsYXNzIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQ3JlYXRlcyBhIHNjaGVtYSBlcnJvciB3aXRoIHVzZWZ1bCBpbmZvcm1hdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGlzc3VlcyBUaGUgc2NoZW1hIGlzc3Vlcy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGlzc3Vlcykge1xuICAgIHN1cGVyKGlzc3Vlc1swXS5tZXNzYWdlKTtcbiAgICAvKipcbiAgICAgKiBUaGUgc2NoZW1hIGlzc3Vlcy5cbiAgICAgKi9cbiAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsIFwiaXNzdWVzXCIpO1xuICAgIHRoaXMubmFtZSA9IFwiU2NoZW1hRXJyb3JcIjtcbiAgICB0aGlzLmlzc3VlcyA9IGlzc3VlcztcbiAgfVxufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0ByZWR1eGpzK3Rvb2xraXRAMi4xMS4yX3JlYWN0LXJlZHV4QDkuMi4wX0B0eXBlcytyZWFjdEAxOC4zLjI3X3JlYWN0QDE4LjMuMV9yZWR1eEA1LjAuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9AcmVkdXhqcy90b29sa2l0L2Rpc3QvcXVlcnkvcnRrLXF1ZXJ5Lm1vZGVybi5tanNcbnZhciBRdWVyeVN0YXR1cyA9ICgoUXVlcnlTdGF0dXM3KSA9PiB7XG4gIFF1ZXJ5U3RhdHVzN1tcInVuaW5pdGlhbGl6ZWRcIl0gPSBcInVuaW5pdGlhbGl6ZWRcIjtcbiAgUXVlcnlTdGF0dXM3W1wicGVuZGluZ1wiXSA9IFwicGVuZGluZ1wiO1xuICBRdWVyeVN0YXR1czdbXCJmdWxmaWxsZWRcIl0gPSBcImZ1bGZpbGxlZFwiO1xuICBRdWVyeVN0YXR1czdbXCJyZWplY3RlZFwiXSA9IFwicmVqZWN0ZWRcIjtcbiAgcmV0dXJuIFF1ZXJ5U3RhdHVzNztcbn0pKFF1ZXJ5U3RhdHVzIHx8IHt9KTtcbnZhciBTVEFUVVNfVU5JTklUSUFMSVpFRCA9IFwidW5pbml0aWFsaXplZFwiO1xudmFyIFNUQVRVU19QRU5ESU5HID0gXCJwZW5kaW5nXCI7XG52YXIgU1RBVFVTX0ZVTEZJTExFRCA9IFwiZnVsZmlsbGVkXCI7XG52YXIgU1RBVFVTX1JFSkVDVEVEID0gXCJyZWplY3RlZFwiO1xuZnVuY3Rpb24gZ2V0UmVxdWVzdFN0YXR1c0ZsYWdzKHN0YXR1cykge1xuICByZXR1cm4ge1xuICAgIHN0YXR1cyxcbiAgICBpc1VuaW5pdGlhbGl6ZWQ6IHN0YXR1cyA9PT0gU1RBVFVTX1VOSU5JVElBTElaRUQsXG4gICAgaXNMb2FkaW5nOiBzdGF0dXMgPT09IFNUQVRVU19QRU5ESU5HLFxuICAgIGlzU3VjY2Vzczogc3RhdHVzID09PSBTVEFUVVNfRlVMRklMTEVELFxuICAgIGlzRXJyb3I6IHN0YXR1cyA9PT0gU1RBVFVTX1JFSkVDVEVEXG4gIH07XG59XG52YXIgaXNQbGFpbk9iamVjdDIgPSBpc1BsYWluT2JqZWN0O1xuZnVuY3Rpb24gY29weVdpdGhTdHJ1Y3R1cmFsU2hhcmluZyhvbGRPYmosIG5ld09iaikge1xuICBpZiAob2xkT2JqID09PSBuZXdPYmogfHwgIShpc1BsYWluT2JqZWN0MihvbGRPYmopICYmIGlzUGxhaW5PYmplY3QyKG5ld09iaikgfHwgQXJyYXkuaXNBcnJheShvbGRPYmopICYmIEFycmF5LmlzQXJyYXkobmV3T2JqKSkpIHtcbiAgICByZXR1cm4gbmV3T2JqO1xuICB9XG4gIGNvbnN0IG5ld0tleXMgPSBPYmplY3Qua2V5cyhuZXdPYmopO1xuICBjb25zdCBvbGRLZXlzID0gT2JqZWN0LmtleXMob2xkT2JqKTtcbiAgbGV0IGlzU2FtZU9iamVjdCA9IG5ld0tleXMubGVuZ3RoID09PSBvbGRLZXlzLmxlbmd0aDtcbiAgY29uc3QgbWVyZ2VPYmogPSBBcnJheS5pc0FycmF
30535KG5ld09iaikgPyBbXSA6IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBuZXdLZXlzKSB7XG4gICAgbWVyZ2VPYmpba2V5XSA9IGNvcHlXaXRoU3RydWN0dXJhbFNoYXJpbmcob2xkT2JqW2tleV0sIG5ld09ialtrZXldKTtcbiAgICBpZiAoaXNTYW1lT2JqZWN0KSBpc1NhbWVPYmplY3QgPSBvbGRPYmpba2V5XSA9PT0gbWVyZ2VPYmpba2V5XTtcbiAgfVxuICByZXR1cm4gaXNTYW1lT2JqZWN0ID8gb2xkT2JqIDogbWVyZ2VPYmo7XG59XG5mdW5jdGlvbiBmaWx0ZXJNYXAoYXJyYXksIHByZWRpY2F0ZSwgbWFwcGVyKSB7XG4gIHJldHVybiBhcnJheS5yZWR1Y2UoKGFjYywgaXRlbSwgaSkgPT4ge1xuICAgIGlmIChwcmVkaWNhdGUoaXRlbSwgaSkpIHtcbiAgICAgIGFjYy5wdXNoKG1hcHBlcihpdGVtLCBpKSk7XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG4gIH0sIFtdKS5mbGF0KCk7XG59XG5mdW5jdGlvbiBpc0Fic29sdXRlVXJsKHVybCkge1xuICByZXR1cm4gbmV3IFJlZ0V4cChgKF58OikvL2ApLnRlc3QodXJsKTtcbn1cbmZ1bmN0aW9uIGlzRG9jdW1lbnRWaXNpYmxlKCkge1xuICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSAhPT0gXCJoaWRkZW5cIjtcbn1cbmZ1bmN0aW9uIGlzTm90TnVsbGlzaCh2KSB7XG4gIHJldHVybiB2ICE9IG51bGw7XG59XG5mdW5jdGlvbiBmaWx0ZXJOdWxsaXNoVmFsdWVzKG1hcCkge1xuICByZXR1cm4gWy4uLihtYXAgPT0gbnVsbCA/IHZvaWQgMCA6IG1hcC52YWx1ZXMoKSkgPz8gW11dLmZpbHRlcihpc05vdE51bGxpc2gpO1xufVxuZnVuY3Rpb24gaXNPbmxpbmUoKSB7XG4gIHJldHVybiB0eXBlb2YgbmF2aWdhdG9yID09PSBcInVuZGVmaW5lZFwiID8gdHJ1ZSA6IG5hdmlnYXRvci5vbkxpbmUgPT09IHZvaWQgMCA/IHRydWUgOiBuYXZpZ2F0b3Iub25MaW5lO1xufVxudmFyIHdpdGhvdXRUcmFpbGluZ1NsYXNoID0gKHVybCkgPT4gdXJsLnJlcGxhY2UoL1xcLyQvLCBcIlwiKTtcbnZhciB3aXRob3V0TGVhZGluZ1NsYXNoID0gKHVybCkgPT4gdXJsLnJlcGxhY2UoL15cXC8vLCBcIlwiKTtcbmZ1bmN0aW9uIGpvaW5VcmxzKGJhc2UsIHVybCkge1xuICBpZiAoIWJhc2UpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIGlmICghdXJsKSB7XG4gICAgcmV0dXJuIGJhc2U7XG4gIH1cbiAgaWYgKGlzQWJzb2x1dGVVcmwodXJsKSkge1xuICAgIHJldHVybiB1cmw7XG4gIH1cbiAgY29uc3QgZGVsaW1pdGVyID0gYmFzZS5lbmRzV2l0aChcIi9cIikgfHwgIXVybC5zdGFydHNXaXRoKFwiP1wiKSA/IFwiL1wiIDogXCJcIjtcbiAgYmFzZSA9IHdpdGhvdXRUcmFpbGluZ1NsYXNoKGJhc2UpO1xuICB1cmwgPSB3aXRob3V0TGVhZGluZ1NsYXNoKHVybCk7XG4gIHJldHVybiBgJHtiYXNlfSR7ZGVsaW1pdGVyfSR7dXJsfWA7XG59XG5mdW5jdGlvbiBnZXRPckluc2VydENvbXB1dGVkKG1hcCwga2V5LCBjb21wdXRlKSB7XG4gIGlmIChtYXAuaGFzKGtleSkpIHJldHVybiBtYXAuZ2V0KGtleSk7XG4gIHJldHVybiBtYXAuc2V0KGtleSwgY29tcHV0ZShrZXkpKS5nZXQoa2V5KTtcbn1cbnZhciBjcmVhdGVOZXdNYXAgPSAoKSA9PiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xudmFyIHRpbWVvdXRTaWduYWwgPSAobWlsbGlzZWNvbmRzKSA9PiB7XG4gIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgY29uc3QgbWVzc2FnZSA9IFwic2lnbmFsIHRpbWVkIG91dFwiO1xuICAgIGNvbnN0IG5hbWUgPSBcIlRpbWVvdXRFcnJvclwiO1xuICAgIGFib3J0Q29udHJvbGxlci5hYm9ydChcbiAgICAgIC8vIHNvbWUgZW52aXJvbm1lbnRzIChSZWFjdCBOYXRpdmUsIE5vZGUpIGRvbid0IGhhdmUgRE9NRXhjZXB0aW9uXG4gICAgICB0eXBlb2YgRE9NRXhjZXB0aW9uICE9PSBcInVuZGVmaW5lZFwiID8gbmV3IERPTUV4Y2VwdGlvbihtZXNzYWdlLCBuYW1lKSA6IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKG1lc3NhZ2UpLCB7XG4gICAgICAgIG5hbWVcbiAgICAgIH0pXG4gICAgKTtcbiAgfSwgbWlsbGlzZWNvbmRzKTtcbiAgcmV0dXJuIGFib3J0Q29udHJvbGxlci5zaWduYWw7XG59O1xudmFyIGFueVNpZ25hbCA9ICguLi5zaWduYWxzKSA9PiB7XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIHNpZ25hbHMpIGlmIChzaWduYWwuYWJvcnRlZCkgcmV0dXJuIEFib3J0U2lnbmFsLmFib3J0KHNpZ25hbC5yZWFzb24pO1xuICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIHNpZ25hbHMpIHtcbiAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsICgpID0+IGFib3J0Q29udHJvbGxlci5hYm9ydChzaWduYWwucmVhc29uKSwge1xuICAgICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgb25jZTogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsO1xufTtcbnZhciBkZWZhdWx0RmV0Y2hGbiA9ICguLi5hcmdzKSA9PiBmZXRjaCguLi5hcmdzKTtcbnZhciBkZWZhdWx0VmFsaWRhdGVTdGF0dXMgPSAocmVzcG9uc2UpID0+IHJlc3BvbnNlLnN0YXR1cyA+PSAyMDAgJiYgcmVzcG9uc2Uuc3RhdHVzIDw9IDI5OTtcbnZhciBkZWZhdWx0SXNKc29uQ29udGVudFR5cGUgPSAoaGVhZGVycykgPT4gKFxuICAvKmFwcGxpY2F0Ki9cbiAgL2lvblxcLyh2bmRcXC5hcGlcXCspP2pzb24vLnRlc3QoaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIikgfHwgXCJcIilcbik7XG5mdW5jdGlvbiBzdHJpcFVuZGVmaW5lZChvYmopIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KG9iaikpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG4gIGNvbnN0IGNvcHkgPSB7XG4gICAgLi4ub2JqXG4gIH07XG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGNvcHkpKSB7XG4gICAgaWYgKHYgPT09IHZvaWQgMCkgZGVsZXRlIGNvcHlba107XG4gIH1cbiAgcmV0dXJuIGNvcHk7XG59XG52YXIgaXNKc29uaWZpYWJsZSA9IChib2R5KSA9PiB0eXBlb2YgYm9keSA9PT0gXCJvYmplY3RcIiAmJiAoaXNQbGFpbk9iamVjdChib2R5KSB8fCBBcnJheS5pc0FycmF
30535KGJvZHkpIHx8IHR5cGVvZiBib2R5LnRvSlNPTiA9PT0gXCJmdW5jdGlvblwiKTtcbmZ1bmN0aW9uIGZldGNoQmFzZVF1ZXJ5KHtcbiAgYmFzZVVybCxcbiAgcHJlcGFyZUhlYWRlcnMgPSAoeCkgPT4geCxcbiAgZmV0Y2hGbiA9IGRlZmF1bHRGZXRjaEZuLFxuICBwYXJhbXNTZXJpYWxpemVyLFxuICBpc0pzb25Db250ZW50VHlwZSA9IGRlZmF1bHRJc0pzb25Db250ZW50VHlwZSxcbiAganNvbkNvbnRlbnRUeXBlID0gXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gIGpzb25SZXBsYWNlcixcbiAgdGltZW91dDogZGVmYXVsdFRpbWVvdXQsXG4gIHJlc3BvbnNlSGFuZGxlcjogZ2xvYmFsUmVzcG9uc2VIYW5kbGVyLFxuICB2YWxpZGF0ZVN0YXR1czogZ2xvYmFsVmFsaWRhdGVTdGF0dXMsXG4gIC4uLmJhc2VGZXRjaE9wdGlvbnNcbn0gPSB7fSkge1xuICBpZiAodHlwZW9mIGZldGNoID09PSBcInVuZGVmaW5lZFwiICYmIGZldGNoRm4gPT09IGRlZmF1bHRGZXRjaEZuKSB7XG4gICAgY29uc29sZS53YXJuKFwiV2FybmluZzogYGZldGNoYCBpcyBub3QgYXZhaWxhYmxlLiBQbGVhc2Ugc3VwcGx5IGEgY3VzdG9tIGBmZXRjaEZuYCBwcm9wZXJ0eSB0byB1c2UgYGZldGNoQmFzZVF1ZXJ5YCBvbiBTU1IgZW52aXJvbm1lbnRzLlwiKTtcbiAgfVxuICByZXR1cm4gYXN5bmMgKGFyZywgYXBpLCBleHRyYU9wdGlvbnMpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBnZXRTdGF0ZSxcbiAgICAgIGV4dHJhLFxuICAgICAgZW5kcG9pbnQsXG4gICAgICBmb3JjZWQsXG4gICAgICB0eX
3053BlXG4gICAgfSA9IGFwaTtcbiAgICBsZXQgbWV0YTtcbiAgICBsZXQge1xuICAgICAgdXJsLFxuICAgICAgaGVhZGVycyA9IG5ldyBIZWFkZXJzKGJhc2VGZXRjaE9wdGlvbnMuaGVhZGVycyksXG4gICAgICBwYXJhbXMgPSB2b2lkIDAsXG4gICAgICByZXNwb25zZUhhbmRsZXIgPSBnbG9iYWxSZXNwb25zZUhhbmRsZXIgPz8gXCJqc29uXCIsXG4gICAgICB2YWxpZGF0ZVN0YXR1cyA9IGdsb2JhbFZhbGlkYXRlU3RhdHVzID8/IGRlZmF1bHRWYWxpZGF0ZVN0YXR1cyxcbiAgICAgIHRpbWVvdXQgPSBkZWZhdWx0VGltZW91dCxcbiAgICAgIC4uLnJlc3RcbiAgICB9ID0gdHlwZW9mIGFyZyA9PSBcInN0cmluZ1wiID8ge1xuICAgICAgdXJsOiBhcmdcbiAgICB9IDogYXJnO1xuICAgIGxldCBjb25maWcgPSB7XG4gICAgICAuLi5iYXNlRmV0Y2hPcHRpb25zLFxuICAgICAgc2lnbmFsOiB0aW1lb3V0ID8gYW55U2lnbmFsKGFwaS5zaWduYWwsIHRpbWVvdXRTaWduYWwodGltZW91dCkpIDogYXBpLnNpZ25hbCxcbiAgICAgIC4uLnJlc3RcbiAgICB9O1xuICAgIGhlYWRlcnMgPSBuZXcgSGVhZGVycyhzdHJpcFVuZGVmaW5lZChoZWFkZXJzKSk7XG4gICAgY29uZmlnLmhlYWRlcnMgPSBhd2FpdCBwcmVwYXJlSGVhZGVycyhoZWFkZXJzLCB7XG4gICAgICBnZXRTdGF0ZSxcbiAgICAgIGFyZyxcbiAgICAgIGV4dHJhLFxuICAgICAgZW5kcG9pbnQsXG4gICAgICBmb3JjZWQsXG4gICAgICB0eXBlLFxuICAgICAgZXh0cmFPcHRpb25zXG4gICAgfSkgfHwgaGVhZGVycztcbiAgICBjb25zdCBib2R5SXNKc29uaWZpYWJsZSA9IGlzSnNvbmlmaWFibGUoY29uZmlnLmJvZHkpO1xuICAgIGlmIChjb25maWcuYm9keSAhPSBudWxsICYmICFib2R5SXNKc29uaWZpYWJsZSAmJiB0eXBlb2YgY29uZmlnLmJvZHkgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbmZpZy5oZWFkZXJzLmRlbGV0ZShcImNvbnRlbnQtdHlwZVwiKTtcbiAgICB9XG4gICAgaWYgKCFjb25maWcuaGVhZGVycy5oYXMoXCJjb250ZW50LXR5cGVcIikgJiYgYm9keUlzSnNvbmlmaWFibGUpIHtcbiAgICAgIGNvbmZpZy5oZWFkZXJzLnNldChcImNvbnRlbnQtdHlwZVwiLCBqc29uQ29udGVudFR5cGUpO1xuICAgIH1cbiAgICBpZiAoYm9keUlzSnNvbmlmaWFibGUgJiYgaXNKc29uQ29udGVudFR5cGUoY29uZmlnLmhlYWRlcnMpKSB7XG4gICAgICBjb25maWcuYm9keSA9IEpTT04uc3RyaW5naWZ5KGNvbmZpZy5ib2R5LCBqc29uUmVwbGFjZXIpO1xuICAgIH1cbiAgICBpZiAoIWNvbmZpZy5oZWFkZXJzLmhhcyhcImFjY2VwdFwiKSkge1xuICAgICAgaWYgKHJlc3BvbnNlSGFuZGxlciA9PT0gXCJqc29uXCIpIHtcbiAgICAgICAgY29uZmlnLmhlYWRlcnMuc2V0KFwiYWNjZXB0XCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2VIYW5kbGVyID09PSBcInRleHRcIikge1xuICAgICAgICBjb25maWcuaGVhZGVycy5zZXQoXCJhY2NlcHRcIiwgXCJ0ZXh0L3BsYWluLCB0ZXh0L2h0bWwsICovKlwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhcmFtcykge1xuICAgICAgY29uc3QgZGl2aWRlciA9IH51cmwuaW5kZXhPZihcIj9cIikgPyBcIiZcIiA6IFwiP1wiO1xuICAgICAgY29uc3QgcXVlcnkgPSBwYXJhbXNTZXJpYWxpemVyID8gcGFyYW1zU2VyaWFsaXplcihwYXJhbXMpIDogbmV3IFVSTFNlYXJjaFBhcmFtcyhzdHJpcFVuZGVmaW5lZChwYXJhbXMpKTtcbiAgICAgIHVybCArPSBkaXZpZGVyICsgcXVlcnk7XG4gICAgfVxuICAgIHVybCA9IGpvaW5VcmxzKGJhc2VVcmwsIHVybCk7XG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHVybCwgY29uZmlnKTtcbiAgICBjb25zdCByZXF1ZXN0Q2xvbmUgPSBuZXcgUmVxdWVzdCh1cmwsIGNvbmZpZyk7XG4gICAgbWV0YSA9IHtcbiAgICAgIHJlcXVlc3Q6IHJlcXVlc3RDbG9uZVxuICAgIH07XG4gICAgbGV0IHJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IGZldGNoRm4ocmVxdWVzdCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBzdGF0dXM6IChlIGluc3RhbmNlb2YgRXJyb3IgfHwgdHlwZW9mIERPTUV4Y2VwdGlvbiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBlIGluc3RhbmNlb2YgRE9NRXhjZXB0aW9uKSAmJiBlLm5hbWUgPT09IFwiVGltZW91dEVycm9yXCIgPyBcIlRJTUVPVVRfRVJST1JcIiA6IFwiRkVUQ0hfRVJST1JcIixcbiAgICAgICAgICBlcnJvcjogU3RyaW5nKGUpXG4gICAgICAgIH0sXG4gICAgICAgIG1ldGFcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlQ2xvbmUgPSByZXNwb25zZS5jbG9uZSgpO1xuICAgIG1ldGEucmVzcG9uc2UgPSByZXNwb25zZUNsb25lO1xuICAgIGxldCByZXN1bHREYXRhO1xuICAgIGxldCByZXNwb25zZVRleHQgPSBcIlwiO1xuICAgIHRyeSB7XG4gICAgICBsZXQgaGFuZGxlUmVzcG9uc2VFcnJvcjtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgaGFuZGxlUmVzcG9uc2UocmVzcG9uc2UsIHJlc3BvbnNlSGFuZGxlcikudGhlbigocikgPT4gcmVzdWx0RGF0YSA9IHIsIChlKSA9PiBoYW5kbGVSZXNwb25zZUVycm9yID0gZSksXG4gICAgICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbm9kZS1mZXRjaC9ub2RlLWZldGNoL2lzc3Vlcy82NjUjaXNzdWVjb21tZW50LTUzODk5NTE4MlxuICAgICAgICAvLyB3ZSAqaGF2ZSogdG8gXCJ1c2UgdXBcIiBib3RoIHN0cmVhbXMgYXQgdGhlIHNhbWUgdGltZSBvciB0aGV5IHdpbGwgc3RvcCBydW5uaW5nIGluIG5vZGUtZmV0Y2ggc2NlbmFyaW9zXG4gICAgICAgIHJlc3BvbnNlQ2xvbmUudGV4dCgpLnRoZW4oKHIpID0+IHJlc3BvbnNlVGV4dCA9IHIsICgpID0+IHtcbiAgICAgICAgfSlcbiAgICAgIF0pO1xuICAgICAgaWYgKGhhbmRsZVJlc3BvbnNlRXJyb3IpIHRocm93IGhhbmRsZVJlc3BvbnNlRXJyb3I7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBzdGF0dXM6IFwiUEFSU0lOR19FUlJPUlwiLFxuICAgICAgICAgIG9yaWdpbmFsU3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgICAgZGF0YTogcmVzcG9uc2VUZXh0LFxuICAgICAgICAgIGVycm9yOi
3053BTdHJpbmcoZSlcbiAgICAgICAgfSxcbiAgICAgICAgbWV0YVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkYXRlU3RhdHVzKHJlc3BvbnNlLCByZXN1bHREYXRhKSA/IHtcbiAgICAgIGRhdGE6IHJlc3VsdERhdGEsXG4gICAgICBtZXRhXG4gICAgfSA6IHtcbiAgICAgIGVycm9yOiB7XG4gICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICBkYXRhOiByZXN1bHREYXRhXG4gICAgICB9LFxuICAgICAgbWV0YVxuICAgIH07XG4gIH07XG4gIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZVJlc3BvbnNlKHJlc3BvbnNlLCByZXNwb25zZUhhbmRsZXIpIHtcbiAgICBpZiAodHlwZW9mIHJlc3BvbnNlSGFuZGxlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2VIYW5kbGVyKHJlc3BvbnNlKTtcbiAgICB9XG4gICAgaWYgKHJlc3BvbnNlSGFuZGxlciA9PT0gXCJjb250ZW50LXR5cGVcIikge1xuICAgICAgcmVzcG9uc2VIYW5kbGVyID0gaXNKc29uQ29udGVudFR5cGUocmVzcG9uc2UuaGVhZGVycykgPyBcImpzb25cIiA6IFwidGV4dFwiO1xuICAgIH1cbiAgICBpZiAocmVzcG9uc2VIYW5kbGVyID09PSBcImpzb25cIikge1xuICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgIHJldHVybiB0ZXh0Lmxlbmd0aCA/IEpTT04ucGFyc2UodGV4dCkgOiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xuICB9XG59XG52YXIgSGFuZGxlZEVycm9yID0gY2xhc3Mge1xuICBjb25zdHJ1Y3Rvcih2YWx1ZSwgbWV0YSA9IHZvaWQgMCkge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLm1ldGEgPSBtZXRhO1xuICB9XG59O1xuYXN5bmMgZnVuY3Rpb24gZGVmYXVsdEJhY2tvZmYoYXR0ZW1wdCA9IDAsIG1heFJldHJpZXMgPSA1LCBzaWduYWwpIHtcbiAgY29uc3QgYXR0ZW1wdHMgPSBNYXRoLm1pbihhdHRlbXB0LCBtYXhSZXRyaWVzKTtcbiAgY29uc3QgdGltZW91dCA9IH5+KChNYXRoLnJhbmRvbSgpICsgMC40KSAqICgzMDAgPDwgYXR0ZW1wdHMpKTtcbiAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCB0aW1lb3V0KTtcbiAgICBpZiAoc2lnbmFsKSB7XG4gICAgICBjb25zdCBhYm9ydEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICByZWplY3QobmV3IEVycm9yKFwiQWJvcnRlZFwiKSk7XG4gICAgICB9O1xuICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICByZWplY3QobmV3IEVycm9yKFwiQWJvcnRlZFwiKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGFib3J0SGFuZGxlciwge1xuICAgICAgICAgIG9uY2U6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIGZ
3053haWwoZXJyb3IsIG1ldGEpIHtcbiAgdGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgSGFuZGxlZEVycm9yKHtcbiAgICBlcnJvcixcbiAgICBtZXRhXG4gIH0pLCB7XG4gICAgdGhyb3dJbW1lZGlhdGVseTogdHJ1ZVxuICB9KTtcbn1cbmZ1bmN0aW9uIGZhaWxJZkFib3J0ZWQoc2lnbmFsKSB7XG4gIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgIGZhaWwoe1xuICAgICAgc3RhdHVzOiBcIkNVU1RPTV9FUlJPUlwiLFxuICAgICAgZXJyb3I6IFwiQWJvcnRlZFwiXG4gICAgfSk7XG4gIH1cbn1cbnZhciBFTVBUWV9PUFRJT05TID0ge307XG52YXIgcmV0cnlXaXRoQmFja29mZiA9IChiYXNlUXVlcnksIGRlZmF1bHRPcHRpb25zKSA9PiBhc3luYyAoYXJncywgYXBpLCBleHRyYU9wdGlvbnMpID0+IHtcbiAgY29uc3QgcG9zc2libGVNYXhSZXRyaWVzID0gWzUsIChkZWZhdWx0T3B0aW9ucyB8fCBFTVBUWV9PUFRJT05TKS5tYXhSZXRyaWVzLCAoZXh0cmFPcHRpb25zIHx8IEVNUFRZX09QVElPTlMpLm1heFJldHJpZXNdLmZpbHRlcigoeCkgPT4geCAhPT0gdm9pZCAwKTtcbiAgY29uc3QgW21heFJldHJpZXNdID0gcG9zc2libGVNYXhSZXRyaWVzLnNsaWNlKC0xKTtcbiAgY29uc3QgZGVmYXVsdFJldHJ5Q29uZGl0aW9uID0gKF8sIF9fLCB7XG4gICAgYXR0ZW1wdFxuICB9KSA9PiBhdHRlbXB0IDw9IG1heFJldHJpZXM7XG4gIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgbWF4UmV0cmllcyxcbiAgICBiYWNrb2ZmOiBkZWZhdWx0QmFja29mZixcbiAgICByZXRyeUNvbmRpdGlvbjogZGVmYXVsdFJldHJ5Q29uZGl0aW9uLFxuICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgIC4uLmV4dHJhT3B0aW9uc1xuICB9O1xuICBsZXQgcmV0cnkyID0gMDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBmYWlsSWZBYm9ydGVkKGFwaS5zaWduYWwpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlUXVlcnkoYXJncywgYXBpLCBleHRyYU9wdGlvbnMpO1xuICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgSGFuZGxlZEVycm9yKHJlc3VsdCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHJ5MisrO1xuICAgICAgaWYgKGUudGhyb3dJbW1lZGlhdGVseSkge1xuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEhhbmRsZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIEhhbmRsZWRFcnJvcikge1xuICAgICAgICBpZiAoIW9wdGlvbnMucmV0cnlDb25kaXRpb24oZS52YWx1ZS5lcnJvciwgYXJncywge1xuICAgICAgICAgIGF0dGVtcHQ6IHJldHJ5MixcbiAgICAgICAgICBiYXNlUXVlcnlBcGk6IGFwaSxcbiAgICAgICAgICBleHRyYU9wdGlvbnNcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICByZXR1cm4gZS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHJldHJ5MiA+IG9wdGlvbnMubWF4UmV0cmllcykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlcnJvcjogZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZhaWxJZkFib3J0ZWQoYXBpLnNpZ25hbCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBvcHRpb25zLmJhY2tvZmYocmV0cnkyLCBvcHRpb25zLm1heFJldHJpZXMsIGFwaS5zaWduYWwpO1xuICAgICAgfSBjYXRjaCAoYmFja29mZkVycm9yKSB7XG4gICAgICAgIGZhaWxJZkFib3J0ZWQoYXBpLnNpZ25hbCk7XG4gICAgICAgIHRocm93IGJhY2tvZmZFcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG52YXIgcmV0cnkgPSBPYmplY3QuYXNzaWduKHJldHJ5V2l0aEJhY2tvZmYsIHtcbiAgZmFpbFxufSk7XG52YXIgSU5URVJOQUxfUFJFRklYID0gXCJfX3J0a3EvXCI7XG52YXIgT05MSU5FID0gXCJvbmxpbmVcIjtcbnZhciBPRkZMSU5FID0gXCJvZmZsaW5lXCI7XG52YXIgRk9DVVMgPSBcImZvY3VzXCI7XG52YXIgRk9DVVNFRCA9IFwiZm9jdXNlZFwiO1xudmFyIFZJU0lCSUxJVFlDSEFOR0UgPSBcInZpc2liaWxpdHljaGFuZ2VcIjtcbnZhciBvbkZvY3VzID0gY3JlYXRlQWN0aW9uKGAke0lOVEVSTkFMX1BSRUZJWH0ke0ZPQ1VTRUR9YCk7XG52YXIgb25Gb2N1c0xvc3QgPSBjcmVhdGVBY3Rpb24oYCR7SU5URVJOQUxfUFJFRklYfXVuJHtGT0NVU0VEfWApO1xudmFyIG9uT25saW5lID0gY3JlYXRlQWN0aW9uKGAke0lOVEVSTkFMX1BSRUZJWH0ke09OTElORX1gKTtcbnZhciBvbk9mZmxpbmUgPSBjcmVhdGVBY3Rpb24oYCR7SU5URVJOQUxfUFJFRklYfSR7T0ZGTElORX1gKTtcbnZhciBhY3Rpb25zID0ge1xuICBvbkZvY3VzLFxuICBvbkZvY3VzTG9zdCxcbiAgb25PbmxpbmUsXG4gIG9uT2ZmbGluZVxufTtcbnZhciBpbml0aWFsaXplZCA9IGZhbHNlO1xuZnVuY3Rpb24gc2V0dXBMaXN0ZW5lcnMoZGlzcGF0Y2gsIGN1c3RvbUhhbmRsZXIpIHtcbiAgZnVuY3Rpb24gZGVmYXVsdEhhbmRsZXIoKSB7XG4gICAgY29uc3QgW2hhbmRsZUZvY3VzLCBoYW5kbGVGb2N1c0xvc3QsIGhhbmRsZU9ubGluZSwgaGFuZGxlT2ZmbGluZV0gPSBbb25Gb2N1cywgb25Gb2N1c0xvc3QsIG9uT25saW5lLCBvbk9mZmxpbmVdLm1hcCgoYWN0aW9uKSA9PiAoKSA9PiBkaXNwYXRjaChhY3Rpb24oKSkpO1xuICAgIGNvbnN0IGhhbmRsZVZpc2liaWxpdHlDaGFuZ2UgPSAoKSA9PiB7XG4gICAgICBpZiAod2luZG93LmRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gXCJ2aXNpYmxlXCIpIHtcbiAgICAgICAgaGFuZGxlRm9jdXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhhbmRsZUZvY3VzTG9zdCgpO1xuICAgICAgfVxuICAgIH07XG4gICAgbGV0IHVuc3Vic2NyaWJlID0gKCkgPT4ge1xuICAgICAgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB9O1xuICAgIGlmICghaW5pdGlhbGl6ZWQpIHtcbiAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgIGxldCB1cGRhdGVMaXN0ZW5lcnMyID0gZnVuY3Rpb24oYWRkKSB7XG4gICAgICAgICAgT2JqZWN0LmVud
3053HJpZXMoaGFuZGxlcnMpLmZvckVhY2goKFtldmVudCwgaGFuZGxlcl0pID0+IHtcbiAgICAgICAgICAgIGlmIChhZGQpIHtcbiAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIsIGZhbHNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHVwZGF0ZUxpc3RlbmVycyA9IHVwZGF0ZUxpc3RlbmVyczI7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0ge1xuICAgICAgICAgIFtGT0NVU106IGhhbmRsZUZvY3VzLFxuICAgICAgICAgIFtWSVNJQklMSVRZQ0hBTkdFXTogaGFuZGxlVmlzaWJpbGl0eUNoYW5nZSxcbiAgICAgICAgICBbT05MSU5FXTogaGFuZGxlT25saW5lLFxuICAgICAgICAgIFtPRkZMSU5FXTogaGFuZGxlT2ZmbGluZVxuICAgICAgICB9O1xuICAgICAgICB1cGRhdGVMaXN0ZW5lcnMyKHRydWUpO1xuICAgICAgICBpbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgIHVuc3Vic2NyaWJlID0gKCkgPT4ge1xuICAgICAgICAgIHVwZGF0ZUxpc3RlbmVyczIoZmFsc2UpO1xuICAgICAgICAgIGluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bnN1YnNjcmliZTtcbiAgfVxuICByZXR1cm4gY3VzdG9tSGFuZGxlciA/IGN1c3RvbUhhbmRsZXIoZGlzcGF0Y2gsIGFjdGlvbnMpIDogZGVmYXVsdEhhbmRsZXIoKTtcbn1cbnZhciBFTkRQT0lOVF9RVUVSWSA9IFwicXVlcnlcIjtcbnZhciBFTkRQT0lOVF9NVVRBVElPTiA9IFwibXV0YXRpb25cIjtcbnZhciBFTkRQT0lOVF9JTkZJTklURVFVRVJZID0gXCJpbmZpbml0ZXF1ZXJ5XCI7XG5mdW5jdGlvbiBpc1F1ZXJ5RGVmaW5pdGlvbihlKSB7XG4gIHJldHVybiBlLnR5cGUgPT09IEVORFBPSU5UX1FVRVJZO1xufVxuZnVuY3Rpb24gaXNNdXRhdGlvbkRlZmluaXRpb24oZSkge1xuICByZXR1cm4gZS50eXBlID09PSBFTkRQT0lOVF9NVVRBVElPTjtcbn1cbmZ1bmN0aW9uIGlzSW5maW5pdGVRdWVyeURlZmluaXRpb24oZSkge1xuICByZXR1cm4gZS50eXBlID09PSBFTkRQT0lOVF9JTkZJTklURVFVRVJZO1xufVxuZnVuY3Rpb24gaXNBbnlRdWVyeURlZmluaXRpb24oZSkge1xuICByZXR1cm4gaXNRdWVyeURlZmluaXRpb24oZSkgfHwgaXNJbmZpbml0ZVF1ZXJ5RGVmaW5pdGlvbihlKTtcbn1cbmZ1bmN0aW9uIGNhbGN1bGF0ZVByb3ZpZGVkQnkoZGVzY3JpcHRpb24sIHJlc3VsdCwgZXJyb3IsIHF1ZXJ5QXJnLCBtZXRhLCBhc3NlcnRUYWdUeXBlcykge1xuICBjb25zdCBmaW5hbERlc2NyaXB0aW9uID0gaXNGdW5jdGlvbihkZXNjcmlwdGlvbikgPyBkZXNjcmlwdGlvbihyZXN1bHQsIGVycm9yLCBxdWVyeUFyZywgbWV0YSkgOiBkZXNjcmlwdGlvbjtcbiAgaWYgKGZpbmFsRGVzY3JpcHRpb24pIHtcbiAgICByZXR1cm4gZmlsdGVyTWFwKGZpbmFsRGVzY3JpcHRpb24sIGlzTm90TnVsbGlzaCwgKHRhZykgPT4gYXNzZXJ0VGFnVHlwZXMoZXhwYW5kVGFnRGVzY3JpcHRpb24odGFnKSkpO1xuICB9XG4gIHJldHVybiBbXTtcbn1cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odCkge1xuICByZXR1cm4gdHlwZW9mIHQgPT09IFwiZnVuY3Rpb25cIjtcbn1cbmZ1bmN0aW9uIGV4cGFuZFRhZ0Rlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKSB7XG4gIHJldHVybiB0eXBlb2YgZGVzY3JpcHRpb24gPT09IFwic3RyaW5nXCIgPyB7XG4gICAgdHlwZTogZGVzY3JpcHRpb25cbiAgfSA6IGRlc2NyaXB0aW9uO1xufVxuZnVuY3Rpb24gYXNTYWZlUHJvbWlzZShwcm9taXNlLCBmYWxsYmFjaykge1xuICByZXR1cm4gcHJvbWlzZS5jYXRjaChmYWxsYmFjayk7XG59XG52YXIgZ2V0RW5kcG9pbnREZWZpbml0aW9uID0gKGNvbnRleHQsIGVuZHBvaW50TmFtZSkgPT4gY29udGV4dC5lbmRwb2ludERlZmluaXRpb25zW2VuZHBvaW50TmFtZV07XG52YXIgZm9yY2VRdWVyeUZuU3ltYm9sID0gU3ltYm9sKFwiZm9yY2VRdWVyeUZuXCIpO1xudmFyIGlzVXBzZXJ0UXVlcnkgPSAoYXJnKSA9PiB0eXBlb2YgYXJnW2ZvcmNlUXVlcnlGblN5bWJvbF0gPT09IFwiZnVuY3Rpb25cIjtcbmZ1bmN0aW9uIGJ1aWxkSW5pdGlhdGUoe1xuICBzZXJpYWxpemVRdWVyeUFyZ3MsXG4gIHF1ZXJ5VGh1bmssXG4gIGluZmluaXRlUXVlcnlUaHVuayxcbiAgbXV0YXRpb25UaHVuayxcbiAgYXBpLFxuICBjb250ZXh0LFxuICBnZXRJbnRlcm5hbFN0YXRlXG59KSB7XG4gIGNvbnN0IGdldFJ1bm5pbmdRdWVyaWVzID0gKGRpc3BhdGNoKSA9PiB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiAoX2EgPSBnZXRJbnRlcm5hbFN0YXRlKGRpc3BhdGNoKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLnJ1bm5pbmdRdWVyaWVzO1xuICB9O1xuICBjb25zdCBnZXRSdW5uaW5nTXV0YXRpb25zID0gKGRpc3BhdGNoKSA9PiB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiAoX2EgPSBnZXRJbnRlcm5hbFN0YXRlKGRpc3BhdGNoKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLnJ1bm5pbmdNdXRhdGlvbnM7XG4gIH07XG4gIGNvbnN0IHtcbiAgICB1bnN1YnNjcmliZVF1ZXJ5UmVzdWx0LFxuICAgIHJlbW92ZU11dGF0aW9uUmVzdWx0LFxuICAgIHVwZGF0ZVN1YnNjcmlwdGlvbk9wdGlvbnNcbiAgfSA9IGFwaS5pbnRlcm5hbEFjdGlvbnM7XG4gIHJldHVybiB7XG4gICAgYnVpbGRJbml0aWF0ZVF1ZXJ5LFxuICAgIGJ1aWxkSW5pdGlhdGVJbmZpbml0ZVF1ZXJ5LFxuICAgIGJ1aWxkSW5pdGlhdGVNdXRhdGlvbixcbiAgICBnZXRSdW5uaW5nUXVlcnlUaHVuayxcbiAgICBnZXRSdW5uaW5nTXV0YXRpb25UaHVuayxcbiAgICBnZXRSdW5uaW5nUXVlcmllc1RodW5rLFxuICAgIGdldFJ1bm5pbmdNdXRhdGlvbnNUaHVua1xuICB9O1xuICBmdW5jdGlvbiBnZXRSdW5uaW5nUXVlcnlUaHVuayhlbmRwb2ludE5hbWUsIHF1ZXJ5QXJncykge1xuICAgIHJldHVybiAoZGlzcGF0Y2gpID0+IHtcbiAgICAgIHZhciBfYTtcbiAgICAgIGNvbnN0IGVuZHBvaW50RGVmaW5pdGlvbiA9IGdldEVuZHBvaW50RGVmaW5pdGlvbihjb250ZXh0LCBlbmRwb2ludE5hbWUpO1xuICAgICAgY29uc3QgcXVlcnlDYWNoZUtleSA9IHNlcmlhbGl6ZVF1ZXJ5QXJncyh7XG4gICAgICAgI
3053HF1ZXJ5QXJncyxcbiAgICAgICAgZW5kcG9pbnREZWZpbml0aW9uLFxuICAgICAgICBlbmRwb2ludE5hbWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIChfYSA9IGdldFJ1bm5pbmdRdWVyaWVzKGRpc3BhdGNoKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLmdldChxdWVyeUNhY2hlS2V5KTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGdldFJ1bm5pbmdNdXRhdGlvblRodW5rKF9lbmRwb2ludE5hbWUsIGZpeGVkQ2FjaGVLZXlPclJlcXVlc3RJZCkge1xuICAgIHJldHVybiAoZGlzcGF0Y2gpID0+IHtcbiAgICAgIHZhciBfYTtcbiAgICAgIHJldHVybiAoX2EgPSBnZXRSdW5uaW5nTXV0YXRpb25zKGRpc3BhdGNoKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLmdldChmaXhlZENhY2hlS2V5T3JSZXF1ZXN0SWQpO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZ2V0UnVubmluZ1F1ZXJpZXNUaHVuaygpIHtcbiAgICByZXR1cm4gKGRpc3BhdGNoKSA9PiBmaWx0ZXJOdWxsaXNoVmFsdWVzKGdldFJ1bm5pbmdRdWVyaWVzKGRpc3BhdGNoKSk7XG4gIH1cbiAgZnVuY3Rpb24gZ2V0UnVubmluZ011dGF0aW9uc1RodW5rKCkge1xuICAgIHJldHVybiAoZGlzcGF0Y2gpID0+IGZpbHRlck51bGxpc2hWYWx1ZXMoZ2V0UnVubmluZ011dGF0aW9ucyhkaXNwYXRjaCkpO1xuICB9XG4gIGZ1bmN0aW9uIG1pZGRsZXdhcmVXYXJuaW5nKGRpc3BhdGNoKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgaWYgKG1pZGRsZXdhcmVXYXJuaW5nLnRyaWdnZXJlZCkgcmV0dXJuO1xuICAgICAgY29uc3QgcmV0dXJuZWRWYWx1ZSA9IGRpc3BhdGNoKGFwaS5pbnRlcm5hbEFjdGlvbnMuaW50ZXJuYWxfZ2V0UlRLUVN1YnNjcmlwdGlvbnMoKSk7XG4gICAgICBtaWRkbGV3YXJlV2FybmluZy50cmlnZ2VyZWQgPSB0cnVlO1xuICAgICAgaWYgKHR5cGVvZiByZXR1cm5lZFZhbHVlICE9PSBcIm9iamVjdFwiIHx8IHR5cGVvZiAocmV0dXJuZWRWYWx1ZSA9PSBudWxsID8gdm9pZCAwIDogcmV0dXJuZWRWYWx1ZS50eXBlKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgzNCkgOiBgV2FybmluZzogTWlkZGxld2FyZSBmb3IgUlRLLVF1ZXJ5IEFQSSBhdCByZWR1Y2VyUGF0aCBcIiR7YXBpLnJlZHVjZXJQYXRofVwiIGhhcyBub3QgYmVlbiBhZGRlZCB0byB0aGUgc3RvcmUuXG5Zb3UgbXVzdCBhZGQgdGhlIG1pZGRsZXdhcmUgZm9yIFJUSy1RdWVyeSB0byBmdW5jdGlvbiBjb3JyZWN0bHkhYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGJ1aWxkSW5pdGlhdGVBbnlRdWVyeShlbmRwb2ludE5hbWUsIGVuZHBvaW50RGVmaW5pdGlvbikge1xuICAgIGNvbnN0IHF1ZXJ5QWN0aW9uID0gKGFyZywge1xuICAgICAgc3Vic2NyaWJlID0gdHJ1ZSxcbiAgICAgIGZvcmNlUmVmZXRjaCxcbiAgICAgIHN1YnNjcmlwdGlvbk9wdGlvbnMsXG4gICAgICBbZm9yY2VRdWVyeUZuU3ltYm9sXTogZm9yY2VRdWVyeUZuLFxuICAgICAgLi4ucmVzdFxuICAgIH0gPSB7fSkgPT4gKGRpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICAgICAgdmFyIF9hO1xuICAgICAgY29uc3QgcXVlcnlDYWNoZUtleSA9IHNlcmlhbGl6ZVF1ZXJ5QXJncyh7XG4gICAgICAgIHF1ZXJ5QXJnczogYXJnLFxuICAgICAgICBlbmRwb2ludERlZmluaXRpb24sXG4gICAgICAgIGVuZHBvaW50TmFtZVxuICAgICAgfSk7XG4gICAgICBsZXQgdGh1bms7XG4gICAgICBjb25zdCBjb21tb25UaHVua0FyZ3MgPSB7XG4gICAgICAgIC4uLnJlc3QsXG4gICAgICAgIHR5cGU6IEVORFBPSU5UX1FVRVJZLFxuICAgICAgICBzdWJzY3JpYmUsXG4gICAgICAgIGZvcmNlUmVmZXRjaCxcbiAgICAgICAgc3Vic2NyaXB0aW9uT3B0aW9ucyxcbiAgICAgICAgZW5kcG9pbnROYW1lLFxuICAgICAgICBvcmlnaW5hbEFyZ3M6IGFyZyxcbiAgICAgICAgcXVlcnlDYWNoZUtleSxcbiAgICAgICAgW2ZvcmNlUXVlcnlGblN5bWJvbF06IGZvcmNlUXVlcnlGblxuICAgICAgfTtcbiAgICAgIGlmIChpc1F1ZXJ5RGVmaW5pdGlvbihlbmRwb2ludERlZmluaXRpb24pKSB7XG4gICAgICAgIHRodW5rID0gcXVlcnlUaHVuayhjb21tb25UaHVua0FyZ3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgICBpbml0aWFsUGFnZVBhcmFtLFxuICAgICAgICAgIHJlZmV0Y2hDYWNoZWRQYWdlc1xuICAgICAgICB9ID0gcmVzdDtcbiAgICAgICAgdGh1bmsgPSBpbmZpbml0ZVF1ZXJ5VGh1bmsoe1xuICAgICAgICAgIC4uLmNvbW1vblRodW5rQXJncyxcbiAgICAgICAgICAvLyBTdXBwbHkgdGhlc2UgZXZlbiBpZiB1bmRlZmluZWQuIFRoaXMgaGVscHMgd2l0aCBhIGZpZWxkIGV4aXN0ZW5jZVxuICAgICAgICAgIC8vIGNoZWNrIG92ZXIgaW4gYGJ1aWxkU2xpY2UudHNgXG4gICAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICAgIGluaXRpYWxQYWdlUGFyYW0sXG4gICAgICAgICAgcmVmZXRjaENhY2hlZFBhZ2VzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBhcGkuZW5kcG9pbnRzW2VuZHBvaW50TmFtZV0uc2VsZWN0KGFyZyk7XG4gICAgICBjb25zdCB0aHVua1Jlc3VsdCA9IGRpc3BhdGNoKHRodW5rKTtcbiAgICAgIGNvbnN0IHN0YXRlQWZ0ZXIgPSBzZWxlY3RvcihnZXRTdGF0ZSgpKTtcbiAgICAgIG1pZGRsZXdhcmVXYXJuaW5nKGRpc3BhdGNoKTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICBhYm9ydFxuICAgICAgfSA9IHRodW5rUmVzdWx0O1xuICAgICAgY29uc3Qgc2tpcHBlZFN5bmNocm9ub3VzbHkgPSBzdGF0ZUFmdGVyLnJlcXVlc3RJZCAhPT0gcmVxdWVzdElkO1xuICAgICAgY29uc3QgcnVubmluZ1F1ZXJ5ID0gKF9hID0gZ2V0UnVubmluZ1F1ZXJpZXMoZGlzcGF0Y2gpKSA9PSBudWxsID8gdm9pZCAwIDogX2EuZ2V0KHF1ZXJ5Q2FjaGVLZXkpO1xuICAgICAgY29uc3Qgc2VsZWN0RnJvbVN0YXRlID0gKCkgPT4gc2VsZWN0b3IoZ2V0U3RhdGUoKSk7XG4gICAgICBjb25zdCBzdGF0ZVByb21pc2UgPSBPYmplY3QuYXNzaWduKGZvcmNlUXVlcnlGbiA/IChcbiAgICAgICAgLy8gYSBxdWVyeSBoYXMgYmVlbiBmb3JjZWQgKHVwc2VydFF1ZXJ5RGF0YSlcbiAgICAgICAgLy8gLT4gd2Ugd2FudCB0byByZXNvbHZlIGl0IG9uY2UgZGF0YSBoYXMgYmVlbiB3cml0dGVuIHdpdGggdGhlIGRhdGEgdGhhdCB3aWxsIGJlIHdyaXR0ZW5cbiAgICAgICAgdGh1bmtSZXN1bHQudGhlbihzZWxlY3RGcm9tU3RhdGUpXG4gICAgICApIDogc2tpcHBlZFN5bmNocm9ub3VzbHkgJiYgIXJ1bm5pbmdRdWVyeSA/IChcbiAgICAgICAgLy8gYSBxdWVyeSBoYXMgYmVlbiBza2lwcGVkIGR1ZSB0byBhIGNvbmRpdGlvbiBhbmQgd2UgZG8gbm90IGhhdmUgYW55IGN1cnJlbnRseSBydW5uaW5nIHF1ZXJ5XG4gICAgICAgIC8vIC0+IHdlIHdhbnQgdG8gcmVzb2x2ZSBpdCBpbW1lZGlhdGVseSB3aXRoIHRoZSBjdXJyZW50IGRhdGFcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHN0YXRlQWZ0ZXIpXG4gICAgICApIDogKFxuICAgICAgICAvLyBxdWVyeSBqdXN0IHN0YXJ0ZWQgb3Igb25lIGlzIGFscmVhZHkgaW4gZmxpZ2h0XG4gICAgICAgIC8vIC0+IHdhaXQgZm9yIHRoZSBydW5uaW5nIHF1ZXJ5LCB0aGVuIHJlc29sdmUgd2l0aCBkYXRhIGZyb20gYWZ0ZXIgdGhhdFxuICAgICAgICBQcm9taXNlLmFsbChbcnVubmluZ1F1ZXJ5LCB0aHVua1Jlc3VsdF0pLnRoZW4oc2VsZWN0RnJvbVN0YXRl
3053KVxuICAgICAgKSwge1xuICAgICAgICBhcmcsXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgc3Vic2NyaXB0aW9uT3B0aW9ucyxcbiAgICAgICAgcXVlcnlDYWNoZUtleSxcbiAgICAgICAgYWJvcnQsXG4gICAgICAgIGFzeW5jIHVud3JhcCgpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdGF0ZVByb21pc2U7XG4gICAgICAgICAgaWYgKHJlc3VsdC5pc0Vycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQuZGF0YTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVmZXRjaDogKG9wdGlvbnMpID0+IGRpc3BhdGNoKHF1ZXJ5QWN0aW9uKGFyZywge1xuICAgICAgICAgIHN1YnNjcmliZTogZmFsc2UsXG4gICAgICAgICAgZm9yY2VSZWZldGNoOiB0cnVlLFxuICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgfSkpLFxuICAgICAgICB1bnN1YnNjcmliZSgpIHtcbiAgICAgICAgICBpZiAoc3Vic2NyaWJlKSBkaXNwYXRjaCh1bnN1YnNjcmliZVF1ZXJ5UmVzdWx0KHtcbiAgICAgICAgICAgIHF1ZXJ5Q2FjaGVLZXksXG4gICAgICAgICAgICByZXF1ZXN0SWRcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH0sXG4gICAgICAgIHVwZGF0ZVN1YnNjcmlwdGlvbk9wdGlvbnMob3B0aW9ucykge1xuICAgICAgICAgIHN0YXRlUHJvbWlzZS5zdWJzY3JpcHRpb25PcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgICBkaXNwYXRjaCh1cGRhdGVTdWJzY3JpcHRpb25PcHRpb25zKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZSxcbiAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgIHF1ZXJ5Q2FjaGVLZXksXG4gICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmICghcnVubmluZ1F1ZXJ5ICYmICFza2lwcGVkU3luY2hyb25vdXNseSAmJiAhZm9yY2VRdWVyeUZuKSB7XG4gICAgICAgIGNvbnN0IHJ1bm5pbmdRdWVyaWVzID0gZ2V0UnVubmluZ1F1ZXJpZXMoZGlzcGF0Y2gpO1xuICAgICAgICBydW5uaW5nUXVlcmllcy5zZXQocXVlcnlDYWNoZUtleSwgc3RhdGVQcm9taXNlKTtcbiAgICAgICAgc3RhdGVQcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJ1bm5pbmdRdWVyaWVzLmRlbGV0ZShxdWVyeUNhY2hlS2V5KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RhdGVQcm9taXNlO1xuICAgIH07XG4gICAgcmV0dXJuIHF1ZXJ5QWN0aW9uO1xuICB9XG4gIGZ1bmN0aW9uIGJ1aWxkSW5pdGlhdGVRdWVyeShlbmRwb2ludE5hbWUsIGVuZHBvaW50RGVmaW5pdGlvbikge1xuICAgIGNvbnN0IHF1ZXJ5QWN0aW9uID0gYnVpbGRJbml0aWF0ZUFueVF1ZXJ5KGVuZHBvaW50TmFtZSwgZW5kcG9pbnREZWZpbml0aW9uKTtcbiAgICByZXR1cm4gcXVlcnlBY3Rpb247XG4gIH1cbiAgZnVuY3Rpb24gYnVpbGRJbml0aWF0ZUluZmluaXRlUXVlcnkoZW5kcG9pbnROYW1lLCBlbmRwb2ludERlZmluaXRpb24pIHtcbiAgICBjb25zdCBpbmZpbml0ZVF1ZXJ5QWN0aW9uID0gYnVpbGRJbml0aWF0ZUFueVF1ZXJ5KGVuZHBvaW50TmFtZSwgZW5kcG9pbnREZWZpbml0aW9uKTtcbiAgICByZXR1cm4gaW5maW5pdGVRdWVyeUFjdGlvbjtcbiAgfVxuICBmdW5jdGlvbiBidWlsZEluaXRpYXRlTXV0YXRpb24oZW5kcG9pbnROYW1lKSB7XG4gICAgcmV0dXJuIChhcmcsIHtcbiAgICAgIHRyYWNrID0gdHJ1ZSxcbiAgICAgIGZpeGVkQ2FjaGVLZXlcbiAgICB9ID0ge30pID0+IChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcbiAgICAgIGNvbnN0IHRodW5rID0gbXV0YXRpb25UaHVuayh7XG4gICAgICAgIHR5cGU6IFwibXV0YXRpb25cIixcbiAgICAgICAgZW5kcG9pbnROYW1lLFxuICAgICAgICBvcmlnaW5hbEFyZ3M6IGFyZyxcbiAgICAgICAgdHJhY2ssXG4gICAgICAgIGZpeGVkQ2FjaGVLZXlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgdGh1bmtSZXN1bHQgPSBkaXNwYXRjaCh0aHVuayk7XG4gICAgICBtaWRkbGV3YXJlV2FybmluZyhkaXNwYXRjaCk7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgYWJvcnQsXG4gICAgICAgIHVud3JhcFxuICAgICAgfSA9IHRodW5rUmVzdWx0O1xuICAgICAgY29uc3QgcmV0dXJuVmFsdWVQcm9taXNlID0gYXNTYWZlUHJvbWlzZSh0aHVua1Jlc3VsdC51bndyYXAoKS50aGVuKChkYXRhKSA9PiAoe1xuICAgICAgICBkYXRhXG4gICAgICB9KSksIChlcnJvcikgPT4gKHtcbiAgICAgICAgZXJyb3JcbiAgICAgIH0pKTtcbiAgICAgIGNvbnN0IHJlc2V0ID0gKCkgPT4ge1xuICAgICAgICBkaXNwYXRjaChyZW1vdmVNdXRhdGlvblJlc3VsdCh7XG4gICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgIGZpeGVkQ2FjaGVLZXlcbiAgICAgICAgfSkpO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHJldCA9IE9iamVjdC5hc3NpZ24ocmV0dXJuVmFsdWVQcm9taXNlLCB7XG4gICAgICAgIGFyZzogdGh1bmtSZXN1bHQuYXJnLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGFib3J0LFxuICAgICAgICB1bndyYXAsXG4gICAgICAgIHJlc2V0XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJ1bm5pbmdNdXRhdGlvbnMgPSBnZXRSdW5uaW5nTXV0YXRpb25zKGRpc3BhdGNoKTtcbiAgICAgIHJ1bm5pbmdNdXRhdGlvbnMuc2V0KHJlcXVlc3RJZCwgcmV0KTtcbiAgICAgIHJldC50aGVuKCgpID0+IHtcbiAgICAgICAgcnVubmluZ011dGF0aW9ucy5kZWxldGUocmVxdWVzdElkKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGZpeGVkQ2FjaGVLZXkpIHtcbiAgICAgICAgcnVubmluZ011dGF0aW9ucy5zZXQoZml4ZWRDYWNoZUtleSwgcmV0KTtcbiAgICAgICAgcmV0LnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGlmIChydW5uaW5nTXV0YXRpb25zLmdldChmaXhlZENhY2hlS2V5KSA9PT0gcmV0KSB7XG4gICAgICAgICAgICBydW5uaW5nTXV0YXRpb25zLmRlbGV0ZShmaXhlZENhY2hlS2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9O1xuICB9XG59XG52YXIgTmFtZWRTY2hlbWFFcnJvciA9IGNsYXNzIGV4dGVuZHMgU2NoZW1hRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihpc3N1ZXMsIHZhbHVlLCBzY2hlbWFOYW1lLCBfYnFNZXRhKSB7XG4gICAgc3VwZXIoaXNzdWVzKTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5zY2hlbWFOYW1lID0gc2NoZW1hTmFtZTtcbiAgICB0aGlzLl9icU1ldGEgPSBfYnFNZXRhO1xuICB9XG59O1xudmFyIHNob3VsZFNraXAgPSAoc2tpcFNjaGVtYVZhbGlkYXRpb24sIHNjaGVtYU5hbWUpID0+IEFycmF
30535LmlzQXJyYXkoc2tpcFNjaGVtYVZhbGlkYXRpb24pID8gc2tpcFNjaGVtYVZhbGlkYXRpb24uaW5jbHVkZXMoc2NoZW1hTmFtZSkgOiAhIXNraXBTY2hlbWFWYWxpZGF0aW9uO1xuYXN5bmMgZnVuY3Rpb24gcGFyc2VXaXRoU2NoZW1hKHNjaGVtYSwgZGF0YSwgc2NoZW1hTmFtZSwgYnFNZXRhKSB7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNjaGVtYVtcIn5zdGFuZGFyZFwiXS52YWxpZGF0ZShkYXRhKTtcbiAgaWYgKHJlc3VsdC5pc3N1ZXMpIHtcbiAgICB0aHJvdyBuZXcgTmFtZWRTY2hlbWFFcnJvcihyZXN1bHQuaXNzdWVzLCBkYXRhLCBzY2hlbWFOYW1lLCBicU1ldGEpO1xuICB9XG4gIHJldHVybiByZXN1bHQudmFsdWU7XG59XG5mdW5jdGlvbiBkZWZhdWx0VHJhbnNmb3JtUmVzcG9uc2UoYmFzZVF1ZXJ5UmV0dXJuVmFsdWUpIHtcbiAgcmV0dXJuIGJhc2VRdWVyeVJldHVyblZhbHVlO1xufVxudmFyIGFkZFNob3VsZEF1dG9CYXRjaCA9IChhcmcgPSB7fSkgPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLmFyZyxcbiAgICBbU0hPVUxEX0FVVE9CQVRDSF06IHRydWVcbiAgfTtcbn07XG5mdW5jdGlvbiBidWlsZFRodW5rcyh7XG4gIHJlZHVjZXJQYXRoLFxuICBiYXNlUXVlcnksXG4gIGNvbnRleHQ6IHtcbiAgICBlbmRwb2ludERlZmluaXRpb25zXG4gIH0sXG4gIHNlcmlhbGl6ZVF1ZXJ5QXJncyxcbiAgYXBpLFxuICBhc3NlcnRUYWdUeXBlLFxuICBzZWxlY3RvcnMsXG4gIG9uU2NoZW1hRmFpbHVyZSxcbiAgY2F0Y2hTY2hlbWFGYWlsdXJlOiBnbG9iYWxDYXRjaFNjaGVtYUZhaWx1cmUsXG4gIHNraXBTY2hlbWFWYWxpZGF0aW9uOiBnbG9iYWxTa2lwU2NoZW1hVmFsaWRhdGlvblxufSkge1xuICBjb25zdCBwYXRjaFF1ZXJ5RGF0YSA9IChlbmRwb2ludE5hbWUsIGFyZywgcGF0Y2hlcywgdXBkYXRlUHJvdmlkZWQpID0+IChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcbiAgICBjb25zdCBlbmRwb2ludERlZmluaXRpb24gPSBlbmRwb2ludERlZmluaXRpb25zW2VuZHBvaW50TmFtZV07XG4gICAgY29uc3QgcXVlcnlDYWNoZUtleSA9IHNlcmlhbGl6ZVF1ZXJ5QXJncyh7XG4gICAgICBxdWVyeUFyZ3M6IGFyZyxcbiAgICAgIGVuZHBvaW50RGVmaW5pdGlvbixcbiAgICAgIGVuZHBvaW50TmFtZVxuICAgIH0pO1xuICAgIGRpc3BhdGNoKGFwaS5pbnRlcm5hbEFjdGlvbnMucXVlcnlSZXN1bHRQYXRjaGVkKHtcbiAgICAgIHF1ZXJ5Q2FjaGVLZXksXG4gICAgICBwYXRjaGVzXG4gICAgfSkpO1xuICAgIGlmICghdXBkYXRlUHJvdmlkZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV3VmFsdWUgPSBhcGkuZW5kcG9pbnRzW2VuZHBvaW50TmFtZV0uc2VsZWN0KGFyZykoXG4gICAgICAvLyBXb3JrIGFyb3VuZCBUUyA0LjEgbWlzbWF0Y2hcbiAgICAgIGdldFN0YXRlKClcbiAgICApO1xuICAgIGNvbnN0IHByb3ZpZGVkVGFncyA9IGNhbGN1bGF0ZVByb3ZpZGVkQnkoZW5kcG9pbnREZWZpbml0aW9uLnByb3ZpZGVzVGFncywgbmV3VmFsdWUuZGF0YSwgdm9pZCAwLCBhcmcsIHt9LCBhc3NlcnRUYWdUeXBlKTtcbiAgICBkaXNwYXRjaChhcGkuaW50ZXJuYWxBY3Rpb25zLnVwZGF0ZVByb3ZpZGVkQnkoW3tcbiAgICAgIHF1ZXJ5Q2FjaGVLZXksXG4gICAgICBwcm92aWRlZFRhZ3NcbiAgICB9XSkpO1xuICB9O1xuICBmdW5jdGlvbiBhZGRUb1N0YXJ0KGl0ZW1zLCBpdGVtLCBtYXggPSAwKSB7XG4gICAgY29uc3QgbmV3SXRlbXMgPSBbaXRlbSwgLi4uaXRlbXNdO1xuICAgIHJldHVybiBtYXggJiYgbmV3SXRlbXMubGVuZ3RoID4gbWF4ID8gbmV3SXRlbXMuc2xpY2UoMCwgLTEpIDogbmV3SXRlbXM7XG4gIH1cbiAgZnVuY3Rpb24gYWRkVG9FbmQoaXRlbXMsIGl0ZW0sIG1heCA9IDApIHtcbiAgICBjb25zdCBuZXdJdGVtcyA9IFsuLi5pdGVtcywgaXRlbV07XG4gICAgcmV0dXJuIG1heCAmJiBuZXdJdGVtcy5sZW5ndGggPiBtYXggPyBuZXdJdGVtcy5zbGljZSgxKSA6IG5ld0l0ZW1zO1xuICB9XG4gIGNvbnN0IHVwZGF0ZVF1ZXJ5RGF0YSA9IChlbmRwb2ludE5hbWUsIGFyZywgdXBkYXRlUmVjaXBlLCB1cGRhdGVQcm92aWRlZCA9IHRydWUpID0+IChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcbiAgICBjb25zdCBlbmRwb2ludERlZmluaXRpb24gPSBhcGkuZW5kcG9pbnRzW2VuZHBvaW50TmFtZV07XG4gICAgY29uc3QgY3VycmVudFN0YXRlID0gZW5kcG9pbnREZWZpbml0aW9uLnNlbGVjdChhcmcpKFxuICAgICAgLy8gV29yayBhcm91bmQgVFMgNC4xIG1pc21hdGNoXG4gICAgICBnZXRTdGF0ZSgpXG4gICAgKTtcbiAgICBjb25zdCByZXQgPSB7XG4gICAgICBwYXRjaGVzOiBbXSxcbiAgICAgIGludmVyc2VQYXRjaGVzOiBbXSxcbiAgICAgIHVuZG86ICgpID0+IGRpc3BhdGNoKGFwaS51dGlsLnBhdGNoUXVlcnlEYXRhKGVuZHBvaW50TmFtZSwgYXJnLCByZXQuaW52ZXJzZVBhdGNoZXMsIHVwZGF0ZVByb3ZpZGVkKSlcbiAgICB9O1xuICAgIGlmIChjdXJyZW50U3RhdGUuc3RhdHVzID09PSBTVEFUVVNfVU5JTklUSUFMSVpFRCkge1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG4gICAgbGV0IG5ld1ZhbHVlO1xuICAgIGlmIChcImRhdGFcIiBpbiBjdXJyZW50U3RhdGUpIHtcbiAgICAgIGlmIChpc0RyYWZ0YWJsZShjdXJyZW50U3RhdGUuZGF0YSkpIHtcbiAgICAgICAgY29uc3QgW3ZhbHVlLCBwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlc10gPSBwcm9kdWNlV2l0aFBhdGNoZXMoY3VycmVudFN0YXRlLmRhdGEsIHVwZGF0ZVJlY2lwZSk7XG4gICAgICAgIHJldC5wYXRjaGVzLnB1c2goLi4ucGF0Y2hlcyk7XG4gICAgICAgIHJldC5pbnZlcnNlUGF0Y2hlcy5wdXNoKC4uLmludmVyc2VQYXRjaGVzKTtcbiAgICAgICAgbmV3VmFsdWUgPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1ZhbHVlID0gdXBkYXRlUmVjaXBlKGN1cnJlbnRTdGF0ZS5kYXRhKTtcbiAgICAgICAgcmV0LnBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgb3A6IFwicmVwbGFjZVwiLFxuICAgICAgICAgIHBhdGg6IFtdLFxuICAgICAgICAgIHZhbHVlOiBuZXdWYWx1ZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0LmludmVyc2VQYXRjaGVzLnB1c2goe1xuICAgICAgICAgIG9wOiBcInJlcGxhY2VcIixcbiAgICAgICAgICBwYXRoOiBbXSxcbiAgICAgICAgICB2YWx1ZTogY3VycmVudFN0YXRlLmRhdGFcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZXQucGF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybi
3053ByZXQ7XG4gICAgfVxuICAgIGRpc3BhdGNoKGFwaS51dGlsLnBhdGNoUXVlcnlEYXRhKGVuZHBvaW50TmFtZSwgYXJnLCByZXQucGF0Y2hlcywgdXBkYXRlUHJvdmlkZWQpKTtcbiAgICByZXR1cm4gcmV0O1xuICB9O1xuICBjb25zdCB1cHNlcnRRdWVyeURhdGEgPSAoZW5kcG9pbnROYW1lLCBhcmcsIHZhbHVlKSA9PiAoZGlzcGF0Y2gpID0+IHtcbiAgICBjb25zdCByZXMgPSBkaXNwYXRjaChhcGkuZW5kcG9pbnRzW2VuZHBvaW50TmFtZV0uaW5pdGlhdGUoYXJnLCB7XG4gICAgICBzdWJzY3JpYmU6IGZhbHNlLFxuICAgICAgZm9yY2VSZWZldGNoOiB0cnVlLFxuICAgICAgW2ZvcmNlUXVlcnlGblN5bWJvbF06ICgpID0+ICh7XG4gICAgICAgIGRhdGE6IHZhbHVlXG4gICAgICB9KVxuICAgIH0pKTtcbiAgICByZXR1cm4gcmVzO1xuICB9O1xuICBjb25zdCBnZXRUcmFuc2Zvcm1DYWxsYmFja0ZvckVuZHBvaW50ID0gKGVuZHBvaW50RGVmaW5pdGlvbiwgdHJhbnNmb3JtRmllbGROYW1lKSA9PiB7XG4gICAgcmV0dXJuIGVuZHBvaW50RGVmaW5pdGlvbi5xdWVyeSAmJiBlbmRwb2ludERlZmluaXRpb25bdHJhbnNmb3JtRmllbGROYW1lXSA/IGVuZHBvaW50RGVmaW5pdGlvblt0cmFuc2Zvcm1GaWVsZE5hbWVdIDogZGVmYXVsdFRyYW5zZm9ybVJlc3BvbnNlO1xuICB9O1xuICBjb25zdCBleGVjdXRlRW5kcG9pbnQgPSBhc3luYyAoYXJnLCB7XG4gICAgc2lnbmFsLFxuICAgIGFib3J0LFxuICAgIHJlamVjdFdpdGhWYWx1ZSxcbiAgICBmdWxmaWxsV2l0aFZhbHVlLFxuICAgIGRpc3BhdGNoLFxuICAgIGdldFN0YXRlLFxuICAgIGV4dHJhXG4gIH0pID0+IHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIGNvbnN0IGVuZHBvaW50RGVmaW5pdGlvbiA9IGVuZHBvaW50RGVmaW5pdGlvbnNbYXJnLmVuZHBvaW50TmFtZV07XG4gICAgY29uc3Qge1xuICAgICAgbWV0YVNjaGVtYSxcbiAgICAgIHNraXBTY2hlbWFWYWxpZGF0aW9uID0gZ2xvYmFsU2tpcFNjaGVtYVZhbGlkYXRpb25cbiAgICB9ID0gZW5kcG9pbnREZWZpbml0aW9uO1xuICAgIGNvbnN0IGlzUXVlcnkgPSBhcmcudHlwZSA9PT0gRU5EUE9JTlRfUVVFUlk7XG4gICAgdHJ5IHtcbiAgICAgIGxldCB0cmFuc2Zvcm1SZXNwb25zZSA9IGRlZmF1bHRUcmFuc2Zvcm1SZXNwb25zZTtcbiAgICAgIGNvbnN0IGJhc2VRdWVyeUFwaSA9IHtcbiAgICAgICAgc2lnbmFsLFxuICAgICAgICBhYm9ydCxcbiAgICAgICAgZGlzcGF0Y2gsXG4gICAgICAgIGdldFN0YXRlLFxuICAgICAgICBleHRyYSxcbiAgICAgICAgZW5kcG9pbnQ6IGFyZy5lbmRwb2ludE5hbWUsXG4gICAgICAgIHR5cGU6IGFyZy50eXBlLFxuICAgICAgICBmb3JjZWQ6IGlzUXVlcnkgPyBpc0ZvcmNlZFF1ZXJ5KGFyZywgZ2V0U3RhdGUoKSkgOiB2b2lkIDAsXG4gICAgICAgIHF1ZXJ5Q2FjaGVLZXk6IGlzUXVlcnkgPyBhcmcucXVlcnlDYWNoZUtleSA6IHZvaWQgMFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGZvcmNlUXVlcnlGbiA9IGlzUXVlcnkgPyBhcmdbZm9yY2VRdWVyeUZuU3ltYm9sXSA6IHZvaWQgMDtcbiAgICAgIGxldCBmaW5hbFF1ZXJ5UmV0dXJuVmFsdWU7XG4gICAgICBjb25zdCBmZXRjaFBhZ2UgPSBhc3luYyAoZGF0YSwgcGFyYW0sIG1heFBhZ2VzLCBwcmV2aW91cykgPT4ge1xuICAgICAgICBpZiAocGFyYW0gPT0gbnVsbCAmJiBkYXRhLnBhZ2VzLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgICAgZGF0YVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpbmFsUXVlcnlBcmcgPSB7XG4gICAgICAgICAgcXVlcnlBcmc6IGFyZy5vcmlnaW5hbEFyZ3MsXG4gICAgICAgICAgcGFnZVBhcmFtOiBwYXJhbVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBwYWdlUmVzcG9uc2UgPSBhd2FpdCBleGVjdXRlUmVxdWVzdChmaW5hbFF1ZXJ5QXJnKTtcbiAgICAgICAgY29uc3QgYWRkVG8gPSBwcmV2aW91cyA/IGFkZFRvU3RhcnQgOiBhZGRUb0VuZDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBwYWdlczogYWRkVG8oZGF0YS5wYWdlcywgcGFnZVJlc3BvbnNlLmRhdGEsIG1heFBhZ2VzKSxcbiAgICAgICAgICAgIHBhZ2VQYXJhbXM6IGFkZFRvKGRhdGEucGFnZVBhcmFtcywgcGFyYW0sIG1heFBhZ2VzKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWV0YTogcGFnZVJlc3BvbnNlLm1ldGFcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgICBhc3luYyBmdW5jdGlvbiBleGVjdXRlUmVxdWVzdChmaW5hbFF1ZXJ5QXJnKSB7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBleHRyYU9wdGlvbnMsXG4gICAgICAgICAgYXJnU2NoZW1hLFxuICAgICAgICAgIHJhd1Jlc3BvbnNlU2NoZW1hLFxuICAgICAgICAgIHJlc3BvbnNlU2NoZW1hXG4gICAgICAgIH0gPSBlbmRwb2ludERlZmluaXRpb247XG4gICAgICAgIGlmIChhcmdTY2hlbWEgJiYgIXNob3VsZFNraXAoc2tpcFNjaGVtYVZhbGlkYXRpb24sIFwiYXJnXCIpKSB7XG4gICAgICAgICAgZmluYWxRdWVyeUFyZyA9IGF3YWl0IHBhcnNlV2l0aFNjaGVtYShcbiAgICAgICAgICAgIGFyZ1NjaG
3053VtYSxcbiAgICAgICAgICAgIGZpbmFsUXVlcnlBcmcsXG4gICAgICAgICAgICBcImFyZ1NjaGVtYVwiLFxuICAgICAgICAgICAge31cbiAgICAgICAgICAgIC8vIHdlIGRvbid0IGhhdmUgYSBtZXRhIHlldCwgc28gd2UgY2FuJ3QgcGFzcyBpdFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcmNlUXVlcnlGbikge1xuICAgICAgICAgIHJlc3VsdCA9IGZvcmNlUXVlcnlGbigpO1xuICAgICAgICB9IGVsc2UgaWYgKGVuZHBvaW50RGVmaW5pdGlvbi5xdWVyeSkge1xuICAgICAgICAgIHRyYW5zZm9ybVJlc3BvbnNlID0gZ2V0VHJhbnNmb3JtQ2FsbGJhY2tGb3JFbmRwb2ludChlbmRwb2ludERlZmluaXRpb24sIFwidHJhbnNmb3JtUmVzcG9uc2VcIik7XG4gICAgICAgICAgcmVzdWx0ID0gYXdhaXQgYmFzZVF1ZXJ5KGVuZHBvaW50RGVmaW5pdGlvbi5xdWVyeShmaW5hbFF1ZXJ5QXJnKSwgYmFzZVF1ZXJ5QXBpLCBleHRyYU9wdGlvbnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGVuZHBvaW50RGVmaW5pdGlvbi5xdWVyeUZuKGZpbmFsUXVlcnlBcmcsIGJhc2VRdWVyeUFwaSwgZXh0cmFPcHRpb25zLCAoYXJnMikgPT4gYmFzZVF1ZXJ5KGFyZzIsIGJhc2VRdWVyeUFwaSwgZXh0cmFPcHRpb25zKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHtcbiAgICAgICAgICBjb25zdCB3aGF0ID0gZW5kcG9pbnREZWZpbml0aW9uLnF1ZXJ5ID8gXCJgYmFzZVF1ZXJ5YFwiIDogXCJgcXVlcnlGbmBcIjtcbiAgICAgICAgICBsZXQgZXJyO1xuICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICBlcnIgPSBgJHt3aGF0fSBkaWQgbm90IHJldHVybiBhbnl0aGluZy5gO1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgZXJyID0gYCR7d2hhdH0gZGlkIG5vdCByZXR1cm4gYW4gb2JqZWN0LmA7XG4gICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuZXJyb3IgJiYgcmVzdWx0LmRhdGEpIHtcbiAgICAgICAgICAgIGVyciA9IGAke3doYXR9IHJldHVybmVkIGFuIG9iamVjdCBjb250YWluaW5nIGJvdGggXFxgZXJyb3JcXGAgYW5kIFxcYHJlc3VsdFxcYC5gO1xuICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0LmVycm9yID09PSB2b2lkIDAgJiYgcmVzdWx0LmRhdGEgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgZXJyID0gYCR7d2hhdH0gcmV0dXJuZWQgYW4gb2JqZWN0IGNvbnRhaW5pbmcgbmVpdGhlciBhIHZhbGlkIFxcYGVycm9yXFxgIGFuZCBcXGByZXN1bHRcXGAuIEF0IGxlYXN0IG9uZSBvZiB0aGVtIHNob3VsZCBub3QgYmUgXFxgdW5kZWZpbmVkXFxgYDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocmVzdWx0KSkge1xuICAgICAgICAgICAgICBpZiAoa2V5ICE9PSBcImVycm9yXCIgJiYga2V5ICE9PSBcImRhdGFcIiAmJiBrZXkgIT09IFwibWV0YVwiKSB7XG4gICAgICAgICAgICAgICAgZXJyID0gYFRoZSBvYmplY3QgcmV0dXJuZWQgYnkgJHt3aGF0fSBoYXMgdGhlIHVua25vd24gcHJvcGVydHkgJHtrZXl9LmA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgZW5jb3VudGVyZWQgaGFuZGxpbmcgdGhlIGVuZHBvaW50ICR7YXJnLmVuZHBvaW50TmFtZX0uXG4gICAgICAgICAgICAgICAgICAke2Vycn1cbiAgICAgICAgICAgICAgICAgIEl0IG5lZWRzIHRvIHJldHVybiBhbiBvYmplY3Qgd2l0aCBlaXRoZXIgdGhlIHNoYXBlIFxcYHsgZGF0YTogPHZhbHVlPiB9XFxgIG9yIFxcYHsgZXJyb3I6IDx2YWx1ZT4gfVxcYCB0aGF0IG1heSBjb250YWluIGFuIG9wdGlvbmFsIFxcYG1ldGFcXGAgcHJvcGVydHkuXG4gICAgICAgICAgICAgICAgICBPYmplY3QgcmV0dXJuZWQgd2FzOmAsIHJlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHRocm93IG5ldyBIYW5kbGVkRXJyb3IocmVzdWx0LmVycm9yLCByZXN1bHQubWV0YSk7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgZGF0YVxuICAgICAgICB9ID0gcmVzdWx0O1xuICAgICAgICBpZiAocmF3UmVzcG9uc2VTY2hlbWEgJiYgIXNob3VsZFNraXAoc2tpcFNjaGVtYVZhbGlkYXRpb24sIFwicmF3UmVzcG9uc2VcIikpIHtcbiAgICAgICAgICBkYXRhID0gYXdhaXQgcGFyc2VXaXRoU2NoZW1hKHJhd1Jlc3BvbnNlU2NoZW1hLCByZXN1bHQuZGF0YSwgXCJyYXdSZXNwb25zZVNjaGVtYVwiLCByZXN1bHQubWV0YSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRyYW5zZm9ybWVkUmVzcG9uc2UgPSBhd2FpdCB0cmFuc2Zvcm1SZXNwb25zZShkYXRhLCByZXN1bHQubWV0YSwgZmluYWxRdWVyeUFyZyk7XG4gICAgICAgIGlmIChyZXNwb25zZVNjaGVtYSAmJiAhc2hvdWxkU2tpcChza2lwU2NoZW1hVmFsaWRhdGlvbiwgXCJyZXNwb25zZVwiKSkge1xuICAgICAgICAgIHRyYW5zZm9ybWVkUmVzcG9uc2UgPSBhd2FpdCBwYXJzZVdpdGhTY2hlbWEocmVzcG9uc2VTY2hlbWEsIHRyYW5zZm9ybWVkUmVzcG9uc2UsIFwicmVzcG9uc2VTY2hlbWFcIiwgcmVzdWx0Lm1ldGEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICAgIGRhdGE6IHRyYW5zZm9ybWVkUmVzcG9uc2VcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1F1ZXJ5ICYmIFwiaW5maW5pdGVRdWVyeU9wdGlvbnNcIiBpbiBlbmRwb2ludERlZmluaXRpb24pIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGluZmluaXRlUXVlcnlPcHRpb25zXG4gICAgICAgIH0gPSBlbmRwb2ludERlZmluaXRpb247XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBtYXhQYWdlcyA9IEluZmluaXR5XG4gICAgICAgI
3053H0gPSBpbmZpbml0ZVF1ZXJ5T3B0aW9ucztcbiAgICAgICAgY29uc3QgcmVmZXRjaENhY2hlZFBhZ2VzID0gYXJnLnJlZmV0Y2hDYWNoZWRQYWdlcyA/PyBpbmZpbml0ZVF1ZXJ5T3B0aW9ucy5yZWZldGNoQ2FjaGVkUGFnZXMgPz8gdHJ1ZTtcbiAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgY29uc3QgYmxhbmtEYXRhID0ge1xuICAgICAgICAgIHBhZ2VzOiBbXSxcbiAgICAgICAgICBwYWdlUGFyYW1zOiBbXVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBjYWNoZWREYXRhID0gKF9hID0gc2VsZWN0b3JzLnNlbGVjdFF1ZXJ5RW50cnkoZ2V0U3RhdGUoKSwgYXJnLnF1ZXJ5Q2FjaGVLZXkpKSA9PSBudWxsID8gdm9pZCAwIDogX2EuZGF0YTtcbiAgICAgICAgY29uc3QgaXNGb3JjZWRRdWVyeU5lZWRpbmdSZWZldGNoID0gKFxuICAgICAgICAgIC8vIGFyZy5mb3JjZVJlZmV0Y2hcbiAgICAgICAgICBpc0ZvcmNlZFF1ZXJ5KGFyZywgZ2V0U3RhdGUoKSkgJiYgIWFyZy5kaXJlY3Rpb25cbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdEYXRhID0gaXNGb3JjZWRRdWVyeU5lZWRpbmdSZWZldGNoIHx8ICFjYWNoZWREYXRhID8gYmxhbmtEYXRhIDogY2FjaGVkRGF0YTtcbiAgICAgICAgaWYgKFwiZGlyZWN0aW9uXCIgaW4gYXJnICYmIGFyZy5kaXJlY3Rpb24gJiYgZXhpc3RpbmdEYXRhLnBhZ2VzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IHByZXZpb3VzID0gYXJnLmRpcmVjdGlvbiA9PT0gXCJiYWNrd2FyZFwiO1xuICAgICAgICAgIGNvbnN0IHBhZ2VQYXJhbUZuID0gcHJldmlvdXMgPyBnZXRQcmV2aW91c1BhZ2VQYXJhbSA6IGdldE5leHRQYWdlUGFyYW07XG4gICAgICAgICAgY29uc3QgcGFyYW0gPSBwYWdlUGFyYW1GbihpbmZpbml0ZVF1ZXJ5T3B0aW9ucywgZXhpc3RpbmdEYXRhLCBhcmcub3JpZ2luYWxBcmdzKTtcbiAgICAgICAgICByZXN1bHQgPSBhd2FpdCBmZXRjaFBhZ2UoZXhpc3RpbmdEYXRhLCBwYXJhbSwgbWF4UGFnZXMsIHByZXZpb3VzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBpbml0aWFsUGFnZVBhcmFtID0gaW5maW5pdGVRdWVyeU9wdGlvbnMuaW5pdGlhbFBhZ2VQYXJhbVxuICAgICAgICAgIH0gPSBhcmc7XG4gICAgICAgICAgY29uc3QgY2FjaGVkUGFnZVBhcmFtcyA9IChjYWNoZWREYXRhID09IG51bGwgPyB2b2lkIDAgOiBjYWNoZWREYXRhLnBhZ2VQYXJhbXMpID8/IFtdO1xuICAgICAgICAgIGNvbnN0IGZpcnN0UGFnZVBhcmFtID0gY2FjaGVkUGFnZVBhcmFtc1swXSA/PyBpbml0aWFsUGFnZVBhcmFtO1xuICAgICAgICAgIGNvbnN0IHRvdGFsUGFnZXMgPSBjYWNoZWRQYWdlUGFyYW1zLmxlbmd0aDtcbiAgICAgICAgICByZXN1bHQgPSBhd2FpdCBmZXRjaFBhZ2UoZXhpc3RpbmdEYXRhLCBmaXJzdFBhZ2VQYXJhbSwgbWF4UGFnZXMpO1xuICAgICAgICAgIGlmIChmb3JjZVF1ZXJ5Rm4pIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgZGF0YTogcmVzdWx0LmRhdGEucGFnZXNbMF1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZWZldGNoQ2FjaGVkUGFnZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdG90YWxQYWdlczsgaSsrKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHBhcmFtID0gZ2V0TmV4dFBhZ2VQYXJhbShpbmZpbml0ZVF1ZXJ5T3B0aW9ucywgcmVzdWx0LmRhdGEsIGFyZy5vcmlnaW5hbEFyZ3MpO1xuICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCBmZXRjaFBhZ2UocmVzdWx0LmRhdGEsIHBhcmFtLCBtYXhQYWdlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZpbmFsUXVlcnlSZXR1cm5WYWx1ZSA9IHJlc3VsdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbmFsUXVlcnlSZXR1cm5WYWx1ZSA9IGF3YWl0IGV4ZWN1dGVSZXF1ZXN0KGFyZy5vcmlnaW5hbEFyZ3MpO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGFTY2hlbWEgJiYgIXNob3VsZFNraXAoc2tpcFNjaGVtYVZhbGlkYXRpb24sIFwibWV0YVwiKSAmJiBmaW5hbFF1ZXJ5UmV0dXJuVmFsdWUubWV0YSkge1xuICAgICAgICBmaW5hbFF1ZXJ5UmV0dXJuVmFsdWUubWV0YSA9IGF3YWl0IHBhcnNlV2l0aFNjaGVtYShtZXRhU2NoZW1hLCBmaW5hbFF1ZXJ5UmV0dXJuVmFsdWUubWV0YSwgXCJtZXRhU2NoZW1hXCIsIGZpbmFsUXVlcnlSZXR1cm5WYWx1ZS5tZXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdWxmaWxsV2l0aFZhbHVlKGZpbmFsUXVlcnlSZXR1cm5WYWx1ZS5kYXRhLCBhZGRTaG91bGRBdXRvQmF0Y2goe1xuICAgICAgICBmdWxmaWxsZWRUaW1lU3RhbXA6IERhdGUubm93KCksXG4gICAgICAgIGJhc2VRdWVyeU1ldGE6IGZpbmFsUXVlcnlSZXR1cm5WYWx1ZS5tZXRhXG4gICAgICB9KSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxldCBjYXVnaHRFcnJvciA9IGVycm9yO1xuICAgICAgaWYgKGNhdWdodEVycm9yIGluc3RhbmNlb2YgSGFuZGxlZEVycm9yKSB7XG4gICAgICAgIGxldCB0cmFuc2Zvcm1FcnJvclJlc3BvbnNlID0gZ2V0VHJhbnNmb3JtQ2FsbGJhY2tGb3JFbmRwb2ludChlbmRwb2ludERlZmluaXRpb24sIFwidHJhbnNmb3JtRXJyb3JSZXNwb25zZVwiKTtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHJhd0Vycm9yUmVzcG9uc2VTY2hlbWEsXG4gICAgICAgICAgZXJyb3JSZXNwb25zZVNjaGVtYVxuICAgICAgICB9ID0gZW5kcG9pbnREZWZpbml0aW9uO1xuICAgICAgICBsZXQge1xuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIG1ldGFcbiAgICAgICAgfSA9IGNhdWdodEVycm9yO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChyYXdFcnJvclJlc3BvbnNlU2NoZW1hICYmICFzaG91bGRTa2lwKHNraXBTY2hlbWFWYWxpZGF0aW9uLCBcInJhd0Vycm9yUmVzcG9uc2VcIikpIHtcbiAgICAgICAgICAgIHZhbHVlID0gYXdhaXQgcGFyc2VXaXRoU2NoZW1hKHJhd0Vycm9yUmVzcG9uc2VTY2hlbWEsIHZhbHVlLCBcInJhd0Vycm9yUmVzcG9uc2VTY2hlbWFcIiwgbWV0YSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtZXRhU2NoZW1hICYmICFzaG91bGRTa2lwKHNraXBTY2hlbWFWYWxpZGF0aW9uLCBcIm1ldGFcIikpIHtcbiAgICAgICAgICAgIG1ldGEgPSBhd2FpdCBwYXJzZVdpdGhTY2hlbWEobWV0YVNjaGVtYSwgbWV0YSwgXCJtZXRhU2NoZW1hXCIsIG1ldGEpO1xuICAgICAgICAgI
3053H1cbiAgICAgICAgICBsZXQgdHJhbnNmb3JtZWRFcnJvclJlc3BvbnNlID0gYXdhaXQgdHJhbnNmb3JtRXJyb3JSZXNwb25zZSh2YWx1ZSwgbWV0YSwgYXJnLm9yaWdpbmFsQXJncyk7XG4gICAgICAgICAgaWYgKGVycm9yUmVzcG9uc2VTY2hlbWEgJiYgIXNob3VsZFNraXAoc2tpcFNjaGVtYVZhbGlkYXRpb24sIFwiZXJyb3JSZXNwb25zZVwiKSkge1xuICAgICAgICAgICAgdHJhbnNmb3JtZWRFcnJvclJlc3BvbnNlID0gYXdhaXQgcGFyc2VXaXRoU2NoZW1hKGVycm9yUmVzcG9uc2VTY2hlbWEsIHRyYW5zZm9ybWVkRXJyb3JSZXNwb25zZSwgXCJlcnJvclJlc3BvbnNlU2NoZW1hXCIsIG1ldGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVqZWN0V2l0aFZhbHVlKHRyYW5zZm9ybWVkRXJyb3JSZXNwb25zZSwgYWRkU2hvdWxkQXV0b0JhdGNoKHtcbiAgICAgICAgICAgIGJhc2VRdWVyeU1ldGE6IG1ldGFcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjYXVnaHRFcnJvciA9IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChjYXVnaHRFcnJvciBpbnN0YW5jZW9mIE5hbWVkU2NoZW1hRXJyb3IpIHtcbiAgICAgICAgICBjb25zdCBpbmZvID0ge1xuICAgICAgICAgICAgZW5kcG9pbnQ6IGFyZy5lbmRwb2ludE5hbWUsXG4gICAgICAgICAgICBhcmc6IGFyZy5vcmlnaW5hbEFyZ3MsXG4gICAgICAgICAgICB0eXBlOiBhcmcudHlwZSxcbiAgICAgICAgICAgIHF1ZXJ5Q2FjaGVLZXk6IGlzUXVlcnkgPyBhcmcucXVlcnlDYWNoZUtleSA6IHZvaWQgMFxuICAgICAgICAgIH07XG4gICAgICAgICAgKF9iID0gZW5kcG9pbnREZWZpbml0aW9uLm9uU2NoZW1hRmFpbHVyZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9iLmNhbGwoZW5kcG9pbnREZWZpbml0aW9uLCBjYXVnaHRFcnJvciwgaW5mbyk7XG4gICAgICAgICAgb25TY2hlbWFGYWlsdXJlID09IG51bGwgPyB2b2lkIDAgOiBvblNjaGVtYUZhaWx1cmU
3053oY2F1Z2h0RXJyb3IsIGluZm8pO1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGNhdGNoU2NoZW1hRmFpbHVyZSA9IGdsb2JhbENhdGNoU2NoZW1hRmFpbHVyZVxuICAgICAgICAgIH0gPSBlbmRwb2ludERlZmluaXRpb247XG4gICAgICAgICAgaWYgKGNhdGNoU2NoZW1hRmFpbHVyZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlamVjdFdpdGhWYWx1ZShjYXRjaFNjaGVtYUZhaWx1cmUoY2F1Z2h0RXJyb3IsIGluZm8pLCBhZGRTaG91bGRBdXRvQmF0Y2goe1xuICAgICAgICAgICAgICBiYXNlUXVlcnlNZXRhOiBjYXVnaHRFcnJvci5fYnFNZXRhXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhdWdodEVycm9yID0gZTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQW4gdW5oYW5kbGVkIGVycm9yIG9jY3VycmVkIHByb2Nlc3NpbmcgYSByZXF1ZXN0IGZvciB0aGUgZW5kcG9pbnQgXCIke2FyZy5lbmRwb2ludE5hbWV9XCIuXG5JbiB0aGUgY2FzZSBvZiBhbiB1bmhhbmRsZWQgZXJyb3IsIG5vIHRhZ3Mgd2lsbCBiZSBcInByb3ZpZGVkXCIgb3IgXCJpbnZhbGlkYXRlZFwiLmAsIGNhdWdodEVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2F1Z2h0RXJyb3IpO1xuICAgICAgfVxuICAgICAgdGhyb3cgY2F1Z2h0RXJyb3I7XG4gICAgfVxuICB9O1xuICBmdW5jdGlvbiBpc0ZvcmNlZFF1ZXJ5KGFyZywgc3RhdGUpIHtcbiAgICBjb25zdCByZXF1ZXN0U3RhdGUgPSBzZWxlY3RvcnMuc2VsZWN0UXVlcnlFbnRyeShzdGF0ZSwgYXJnLnF1ZXJ5Q2FjaGVLZXkpO1xuICAgIGNvbnN0IGJhc2VGZXRjaE9uTW91bnRPckFyZ0NoYW5nZSA9IHNlbGVjdG9ycy5zZWxlY3RDb25maWcoc3RhdGUpLnJlZmV0Y2hPbk1vdW50T3JBcmdDaGFuZ2U7XG4gICAgY29uc3QgZnVsZmlsbGVkVmFsID0gcmVxdWVzdFN0YXRlID09IG51bGwgPyB2b2lkIDAgOiByZXF1ZXN0U3RhdGUuZnVsZmlsbGVkVGltZVN0YW1wO1xuICAgIGNvbnN0IHJlZmV0Y2hWYWwgPSBhcmcuZm9yY2VSZWZldGNoID8/IChhcmcuc3Vic2NyaWJlICYmIGJhc2VGZXRjaE9uTW91bnRPckFyZ0NoYW5nZSk7XG4gICAgaWYgKHJlZmV0Y2hWYWwpIHtcbiAgICAgIHJldHVybiByZWZldGNoVmFsID09PSB0cnVlIHx8IChOdW1iZXIoLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCkpIC0gTnVtYmVyKGZ1bGZpbGxlZFZhbCkpIC8gMWUzID49IHJlZmV0Y2hWYWw7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBjcmVhdGVRdWVyeVRodW5rID0gKCkgPT4ge1xuICAgIGNvbnN0IGdlbmVyYXRlZFF1ZXJ5VGh1bmsgPSBjcmVhdGVBc3luY1RodW5rKGAke3JlZHVjZXJQYXRofS9leGVjdXRlUXVlcnlgLCBleGVjdXRlRW5kcG9pbnQsIHtcbiAgICAgIGdldFBlbmRpbmdNZXRhKHtcbiAgICAgICAgYXJnXG4gICAgICB9KSB7XG4gICAgICAgIGNvbnN0IGVuZHBvaW50RGVmaW5pdGlvbiA9IGVuZHBvaW50RGVmaW5pdGlvbnNbYXJnLmVuZHBvaW50TmFtZV07XG4gICAgICAgIHJldHVybiBhZGRTaG91bGRBdXRvQmF0Y2goe1xuICAgICAgICAgIHN0YXJ0ZWRUaW1lU3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgLi4uaXNJbmZpbml0ZVF1ZXJ5RGVmaW5pdGlvbihlbmRwb2ludERlZmluaXRpb24pID8ge1xuICAgICAgICAgICAgZGlyZWN0aW9uOiBhcmcuZGlyZWN0aW9uXG4gICAgICAgICAgfSA6IHt9XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGNvbmRpdGlvbihxdWVyeVRodW5rQXJnLCB7XG4gICAgICAgIGdldFN0YXRlXG4gICAgICB9KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBnZXRTdGF0ZSgpO1xuICAgICAgICBjb25zdCByZXF1ZXN0U3RhdGUgPSBzZWxlY3RvcnMuc2VsZWN0UXVlcnlFbnRyeShzdGF0ZSwgcXVlcnlUaHVua0FyZy5xdWVyeUNhY2hlS2V5KTtcbiAgICAgICAgY29uc3QgZnVsZmlsbGVkVmFsID0gcmVxdWVzdFN0YXRlID09IG51bGwgPyB2b2lkIDAgOiByZXF1ZXN0U3RhdGUuZnVsZmlsbGVkVGltZVN0YW1wO1xuICAgICAgICBjb25zdCBjdXJyZW50QXJnID0gcXVlcnlUaHVua0FyZy5vcmlnaW5hbEFyZ3M7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzQXJnID0gcmVxdWVzdFN0YXRlID09IG51bGwgPyB2b2lkIDAgOiByZXF1ZXN0U3RhdGUub3JpZ2luYWxBcmdzO1xuICAgICAgICBjb25zdCBlbmRwb2ludERlZmluaXRpb24gPSBlbmRwb2ludERlZmluaXRpb25zW3F1ZXJ5VGh1bmtBcmcuZW5kcG9pbnROYW1lXTtcbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gcXVlcnlUaHVua0FyZy5kaXJlY3Rpb247XG4gICAgICAgIGlmIChpc1Vwc2VydFF1ZXJ5KHF1ZXJ5VGh1bmtBcmcpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChyZXF1ZXN0U3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IHJlcXVlc3RTdGF0ZS5zdGF0dXMpID09PSBcInBlbmRpbmdcIikge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNGb3JjZWRRdWVyeShxdWVyeVRodW5rQXJnLCBzdGF0ZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNRdWVyeURlZmluaXRpb24oZW5kcG9pbnREZWZpbml0aW9uKSAmJiAoKF9hID0gZW5kcG9pbnREZWZpbml0aW9uID09IG51bGwgPyB2b2lkIDAgOiBlbmRwb2ludERlZmluaXRpb24uZm9yY2VSZWZldGNoKSA9PSBudWxsID8gdm9pZCAwIDogX2EuY2FsbChlbmRwb2ludERlZmluaXRpb24sIHtcbiAgICAgICAgICBjdXJyZW50QXJnLFxuICAgICAgICAgIHByZXZpb3VzQXJnLFxuICAgICAgICAgIGVuZHBvaW50U3RhdGU6IHJlcXVlc3RTdGF0ZSxcbiAgICAgICAgICBzdGF0ZVxuICAgICAgICB9KSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZnVsZmlsbGVkVmFsICYmICFkaXJlY3Rpb24pIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgI
3053H1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuICAgICAgZGlzcGF0Y2hDb25kaXRpb25SZWplY3Rpb246IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gZ2VuZXJhdGVkUXVlcnlUaHVuaztcbiAgfTtcbiAgY29uc3QgcXVlcnlUaHVuayA9IGNyZWF0ZVF1ZXJ5VGh1bmsoKTtcbiAgY29uc3QgaW5maW5pdGVRdWVyeVRodW5rID0gY3JlYXRlUXVlcnlUaHVuaygpO1xuICBjb25zdCBtdXRhdGlvblRodW5rID0gY3JlYXRlQXN5bmNUaHVuayhgJHtyZWR1Y2VyUGF0aH0vZXhlY3V0ZU11dGF0aW9uYCwgZXhlY3V0ZUVuZHBvaW50LCB7XG4gICAgZ2V0UGVuZGluZ01ldGEoKSB7XG4gICAgICByZXR1cm4gYWRkU2hvdWxkQXV0b0JhdGNoKHtcbiAgICAgICAgc3RhcnRlZFRpbWVTdGFtcDogRGF0ZS5ub3coKVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgaGFzVGhlRm9yY2UgPSAob3B0aW9ucykgPT4gXCJmb3JjZVwiIGluIG9wdGlvbnM7XG4gIGNvbnN0IGhhc01heEFnZSA9IChvcHRpb25zKSA9PiBcImlmT2xkZXJUaGFuXCIgaW4gb3B0aW9ucztcbiAgY29uc3QgcHJlZmV0Y2ggPSAoZW5kcG9pbnROYW1lLCBhcmcsIG9wdGlvbnMgPSB7fSkgPT4gKGRpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IGZvcmNlID0gaGFzVGhlRm9yY2Uob3B0aW9ucykgJiYgb3B0aW9ucy5mb3JjZTtcbiAgICBjb25zdCBtYXhBZ2UgPSBoYXNNYXhBZ2Uob3B0aW9ucykgJiYgb3B0aW9ucy5pZk9sZGVyVGhhbjtcbiAgICBjb25zdCBxdWVyeUFjdGlvbiA9IChmb3JjZTIgPSB0cnVlKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb25zMiA9IHtcbiAgICAgICAgZm9yY2VSZWZldGNoOiBmb3JjZTIsXG4gICAgICAgIHN1YnNjcmliZTogZmFsc2VcbiAgICAgIH07XG4gICAgICByZXR1cm4gYXBpLmVuZHBvaW50c1tlbmRwb2ludE5hbWVdLmluaXRpYXRlKGFyZywgb3B0aW9uczIpO1xuICAgIH07XG4gICAgY29uc3QgbGF0ZXN0U3RhdGVWYWx1ZSA9IGFwaS5lbmRwb2ludHNbZW5kcG9pbnROYW1lXS5zZWxlY3QoYXJnKShnZXRTdGF0ZSgpKTtcbiAgICBpZiAoZm9yY2UpIHtcbiAgICAgIGRpc3BhdGNoKHF1ZXJ5QWN0aW9uKCkpO1xuICAgIH0gZWxzZSBpZiAobWF4QWdlKSB7XG4gICAgICBjb25zdCBsYXN0RnVsZmlsbGVkVHMgPSBsYXRlc3RTdGF0ZVZhbHVlID09IG51bGwgPyB2b2lkIDAgOiBsYXRlc3RTdGF0ZVZhbHVlLmZ1bGZpbGxlZFRpbWVTdGFtcDtcbiAgICAgIGlmICghbGFzdEZ1bGZpbGxlZFRzKSB7XG4gICAgICAgIGRpc3BhdGNoKHF1ZXJ5QWN0aW9uKCkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBzaG91bGRSZXRyaWdnZXIgPSAoTnVtYmVyKC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpKSAtIE51bWJlcihuZXcgRGF0ZShsYXN0RnVsZmlsbGVkVHMpKSkgLyAxZTMgPj0gbWF4QWdlO1xuICAgICAgaWYgKHNob3VsZFJldHJpZ2dlcikge1xuICAgICAgICBkaXNwYXRjaChxdWVyeUFjdGlvbigpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZGlzcGF0Y2gocXVlcnlBY3Rpb24oZmFsc2UpKTtcbiAgICB9XG4gIH07XG4gIGZ1bmN0aW9uIG1hdGNoZXNFbmRwb2ludChlbmRwb2ludE5hbWUpIHtcbiAgICByZXR1cm4gKGFjdGlvbikgPT4ge1xuICAgICAgdmFyIF9hLCBfYjtcbiAgICAgIHJldHVybiAoKF9iID0gKF9hID0gYWN0aW9uID09IG51bGwgPyB2b2lkIDAgOiBhY3Rpb24ubWV0YSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLmFyZykgPT0gbnVsbCA/IHZvaWQgMCA6IF9iLmVuZHBvaW50TmFtZSkgPT09IGVuZHBvaW50TmFtZTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGJ1aWxkTWF0Y2hUaHVua0FjdGlvbnModGh1bmssIGVuZHBvaW50TmFtZSkge1xuICAgIHJldHVybiB7XG4gICAgICBtYXRjaFBlbmRpbmc6IGlzQWxsT2YoaXNQZW5kaW5nKHRodW5rKSwgbWF0Y2hlc0VuZHBvaW50KGVuZHBvaW50TmFtZSkpLFxuICAgICAgbWF0Y2hGdWxmaWxsZWQ6IGlzQWxsT2YoaXNGdWxmaWxsZWQodGh1bmspLCBtYXRjaGVzRW5kcG9pbnQoZW5kcG9pbnROYW1lKSksXG4gICAgICBtYXRjaFJlamVjdGVkOiBpc0FsbE9mKGlzUmVqZWN0ZWQodGh1bmspLCBtYXRjaGVzRW5kcG9pbnQoZW5kcG9pbnROYW1lKSlcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgcXVlcnlUaHVuayxcbiAgICBtdXRhdGlvblRodW5rLFxuICAgIGluZmluaXRlUXVlcnlUaHVuayxcbiAgICBwcmVmZXRjaCxcbiAgICB1cGRhdGVRdWVyeURhdGEsXG4gICAgdXBzZXJ0UXVlcnlEYXRhLFxuICAgIHBhdGNoUXVlcnlEYXRhLFxuICAgIGJ1aWxkTWF0Y2hUaHVua0FjdGlvbnNcbiAgfTtcbn1cbmZ1bmN0aW9uIGdldE5leHRQYWdlUGFyYW0ob3B0aW9ucywge1xuICBwYWdlcyxcbiAgcGFnZVBhcmFtc1xufSwgcXVlcnlBcmcpIHtcbiAgY29uc3QgbGFzdEluZGV4ID0gcGFnZXMubGVuZ3RoIC0gMTtcbiAgcmV0dXJuIG9wdGlvbnMuZ2V0TmV4dFBhZ2VQYXJhbShwYWdlc1tsYXN0SW5kZXhdLCBwYWdlcywgcGFnZVBhcmFtc1tsYXN0SW5kZXhdLCBwYWdlUGFyYW1zLCBxdWVyeUFyZyk7XG59XG5mdW5jdGlvbiBnZXRQcmV2aW91c1BhZ2VQYXJhbShvcHRpb25zLCB7XG4gIHBhZ2VzLFxuICBwYWdlUGFyYW1zXG59LCBxdWVyeUFyZykge1xuICB2YXIgX2E7XG4gIHJldHVybiAoX2EgPSBvcHRpb25zLmdldFByZXZpb3VzUGFnZVBhcmFtKSA9PSBudWxsID8gdm9pZCAwIDogX2EuY2FsbChvcHRpb25zLCBwYWdlc1swXSwgcGFnZXMsIHBhZ2VQYXJhbXNbMF0sIHBhZ2VQYXJhbXMsIHF1ZXJ5QXJnKTtcbn1cbmZ1bmN0aW9uIGNhbGN1bGF0ZVByb3ZpZGVkQnlUaHVuayhhY3Rpb24sIHR5cGUsIGVuZHBvaW50RGVmaW5pdGlvbnMsIGFzc2VydFRhZ1R5cGUpIHtcbiAgcmV0dXJuIGNhbGN1bGF0ZVByb3ZpZGVkQnkoZW5kcG9pbnREZWZpbml0aW9uc1thY3Rpb24ubWV0YS5hcmcuZW5kcG9pbnROYW1lXVt0eXBlXSwgaXNGdWxmaWxsZWQoYWN0aW9uKSA/IGFjdGlvbi5wYXlsb2FkIDogdm9pZCAwLCBpc1JlamVjdGVkV2l0aFZhbHVlKGFjdGlvbikgPyBhY3Rpb24ucGF5bG9hZCA6IHZvaWQgMCwgYWN0aW9uLm1ldGEuYXJnLm9yaWdpbmFsQXJncywgXCJiYXNlUXVlcnlNZXRhXCIgaW4gYWN0aW9uLm1ldGEgPyBhY3Rpb24ubWV0YS5iYXNlUXVlcnlNZXRhIDogdm9pZCAwLCBhc3NlcnRUYWdUeXBlKTtcbn1cbmZ1bmN0aW9uIGdldEN1cnJlbnQodmFsdWUpIHtcbiAgcmV0dXJuIGlzRHJhZnQodmFsdWUpID8gY3VycmVudCh2YWx1ZSkgOiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZVF1ZXJ5U3Vic3RhdGVJZkV4aXN0cyhzdGF0ZSwgcXVlcnlDYWNoZUtleSwgdXBkYXRlKSB7XG4gIGNvbnN0IHN1YnN0YXRlID0gc3RhdGVbcXVlcnlDYWNoZUtleV0
30537XG4gIGlmIChzdWJzdGF0ZSkge1xuICAgIHVwZGF0ZShzdWJzdGF0ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldE11dGF0aW9uQ2FjaGVLZXkoaWQpIHtcbiAgcmV0dXJuIChcImFyZ1wiIGluIGlkID8gaWQuYXJnLmZpeGVkQ2FjaGVLZXkgOiBpZC5maXhlZENhY2hlS2V5KSA/PyBpZC5yZXF1ZXN0SWQ7XG59XG5mdW5jdGlvbiB1cGRhdGVNdXRhdGlvblN1YnN0YXRlSWZFeGlzdHMoc3RhdGUsIGlkLCB1cGRhdGUpIHtcbiAgY29uc3Qgc3Vic3RhdGUgPSBzdGF0ZVtnZXRNdXRhdGlvbkNhY2hlS2V5KGlkKV07XG4gIGlmIChzdWJzdGF0ZSkge1xuICAgIHVwZGF0ZShzdWJzdGF0ZSk7XG4gIH1cbn1cbnZhciBpbml0aWFsU3RhdGUgPSB7fTtcbmZ1bmN0aW9uIGJ1aWxkU2xpY2Uoe1xuICByZWR1Y2VyUGF0aCxcbiAgcXVlcnlUaHVuayxcbiAgbXV0YXRpb25UaHVuayxcbiAgc2VyaWFsaXplUXVlcnlBcmdzLFxuICBjb250ZXh0OiB7XG4gICAgZW5kcG9pbnREZWZpbml0aW9uczogZGVmaW5pdGlvbnMsXG4gICAgYXBpVWlkLFxuICAgIGV4dHJhY3RSZWh5ZHJhdGlvbkluZm8sXG4gICAgaGFzUmVoeWRyYXRpb25JbmZvXG4gIH0sXG4gIGFzc2VydFRhZ1R5cGUsXG4gIGNvbmZpZ1xufSkge1xuICBjb25zdCByZXNldEFwaVN0YXRlID0gY3JlYXRlQWN0aW9uKGAke3JlZHVjZXJQYXRofS9yZXNldEFwaVN0YXRlYCk7XG4gIGZ1bmN0aW9uIHdyaXRlUGVuZGluZ0NhY2hlRW50cnkoZHJhZnQsIGFyZywgdXBzZXJ0aW5nLCBtZXRhKSB7XG4gICAgdmFyIF9hO1xuICAgIGRyYWZ0W19hID0gYXJnLnF1ZXJ5Q2FjaGVLZXldID8/IChkcmFmdFtfYV0gPSB7XG4gICAgICBzdGF0dXM6IFNUQVRVU19VTklOSVRJQUxJWkVELFxuICAgICAgZW5kcG9pbnROYW1lOiBhcmcuZW5kcG9pbnROYW1lXG4gICAgfSk7XG4gICAgdXBkYXRlUXVlcnlTdWJzdGF0ZUlmRXhpc3RzKGRyYWZ0LCBhcmcucXVlcnlDYWNoZUtleSwgKHN1YnN0YXRlKSA9PiB7XG4gICAgICBzdWJzdGF0ZS5zdGF0dXMgPSBTVEFUVVNfUEVORElORztcbiAgICAgIHN1YnN0YXRlLnJlcXVlc3RJZCA9IHVwc2VydGluZyAmJiBzdWJzdGF0ZS5yZXF1ZXN0SWQgPyAoXG4gICAgICAgIC8vIGZvciBgdXBzZXJ0UXVlcnlgICoqdXBkYXRlcyoqLCBrZWVwIHRoZSBjdXJyZW50IGByZXF1ZXN0SWRgXG4gICAgICAgIHN1YnN0YXRlLnJlcXVlc3RJZFxuICAgICAgKSA6IChcbiAgICAgICAgLy8gZm9yIG5vcm1hbCBxdWVyaWVzIG9yIGB1cHNlcnRRdWVyeWAgKippbnNlcnRzKiogYWx3YXlzIHVwZGF0ZSB0aGUgYHJlcXVlc3RJZGBcbiAgICAgICAgbWV0YS5yZXF1ZXN0SWRcbiAgICAgICk7XG4gICAgICBpZiAoYXJnLm9yaWdpbmFsQXJncyAhPT0gdm9pZCAwKSB7XG4gICAgICAgIHN1YnN0YXRlLm9yaWdpbmFsQXJncyA9IGFyZy5vcmlnaW5hbEFyZ3M7XG4gICAgICB9XG4gICAgICBzdWJzdGF0ZS5zdGFydGVkVGltZVN0YW1wID0gbWV0YS5zdGFydGVkVGltZVN0YW1wO1xuICAgICAgY29uc3QgZW5kcG9pbnREZWZpbml0aW9uID0gZGVmaW5pdGlvbnNbbWV0YS5hcmcuZW5kcG9pbnROYW1lXTtcbiAgICAgIGlmIChpc0luZmluaXRlUXVlcnlEZWZpbml0aW9uKGVuZHBvaW50RGVmaW5pdGlvbikgJiYgXCJkaXJlY3Rpb25cIiBpbiBhcmcpIHtcbiAgICAgICAgO1xuICAgICAgICBzdWJzdGF0ZS5kaXJlY3Rpb24gPSBhcmcuZGlyZWN0aW9uO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIHdyaXRlRnVsZmlsbGVkQ2FjaGVFbnRyeShkcmFmdCwgbWV0YSwgcGF5bG9hZCwgdXBzZXJ0aW5nKSB7XG4gICAgdXBkYXRlUXVlcnlTdWJzdGF0ZUlmRXhpc3RzKGRyYWZ0LCBtZXRhLmFyZy5xdWVyeUNhY2hlS2V5LCAoc3Vic3RhdGUpID0+IHtcbiAgICAgIGlmIChzdWJzdGF0ZS5yZXF1ZXN0SWQgIT09IG1ldGEucmVxdWVzdElkICYmICF1cHNlcnRpbmcpIHJldHVybjtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbWVyZ2VcbiAgICAgIH0gPSBkZWZpbml0aW9uc1ttZXRhLmFyZy5lbmRwb2ludE5hbWVdO1xuICAgICAgc3Vic3RhdGUuc3RhdHVzID0gU1RBVFVTX0ZVTEZJTExFRDtcbiAgICAgIGlmIChtZXJnZSkge1xuICAgICAgICBpZiAoc3Vic3RhdGUuZGF0YSAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgZnVsZmlsbGVkVGltZVN0YW1wLFxuICAgICAgICAgICAgYXJnLFxuICAgICAgICAgICAgYmFzZVF1ZXJ5TWV0YSxcbiAgICAgICAgICAgIHJlcXVlc3RJZFxuICAgICAgICAgIH0gPSBtZXRhO1xuICAgICAgICAgIGxldCBuZXdEYXRhID0gcHJvZHVjZShzdWJzdGF0ZS5kYXRhLCAoZHJhZnRTdWJzdGF0ZURhdGEpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBtZXJnZShkcmFmdFN1YnN0YXRlRGF0YSwgcGF5bG9hZCwge1xuICAgICAgICAgICAgICBhcmc6IGFyZy5vcmlnaW5hbEFyZ3MsXG4gICAgICAgICAgICAgIGJhc2VRdWVyeU1ldGEsXG4gICAgICAgICAgICAgIGZ1bGZpbGxlZFRpbWVTdGFtcCxcbiAgICAgICAgICAgICAgcmVxdWVzdElkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzdWJzdGF0ZS5kYXRhID0gbmV3RGF0YTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdWJzdGF0ZS5kYXRhID0gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3Vic3RhdGUuZGF0YSA9IGRlZmluaXRpb25zW21ldGEuYXJnLmVuZHBvaW50TmFtZV0uc3RydWN0dXJhbFNoYXJpbmcgPz8gdHJ1ZSA/IGNvcHlXaXRoU3RydWN0dXJhbFNoYXJpbmcoaXNEcmFmdChzdWJzdGF0ZS5kYXRhKSA/IG9yaWdpbmFsKHN1YnN0YXRlLmRhdGEpIDogc3Vic3RhdGUuZGF0YSwgcGF5bG9hZCkgOiBwYXlsb2FkO1xuICAgICAgfVxuICAgICAgZGVsZXRlIHN1YnN0YXRlLmVycm9yO1xuICAgICAgc3Vic3RhdGUuZnVsZmlsbGVkVGltZVN0YW1wID0gbWV0YS5mdWxmaWxsZWRUaW1lU3RhbXA7XG4gICAgfSk7XG4gIH1cbiAgY29uc3QgcXVlcnlTbGljZSA9IGNyZWF0ZVNsaWNlKHtcbiAgICBuYW1lOiBgJHtyZWR1Y2VyUGF0aH0vcXVlcmllc2AsXG4gICAgaW5pdGlhbFN0YXRlLFxuICAgIHJlZHVjZXJzOiB7XG4gICAgICByZW1vdmVRdWVyeVJlc3VsdDoge1xuICAgICAgICByZWR1Y2VyKGRyYWZ0LCB7XG4gICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgcXVlcnlDYWNoZUtleVxuICAgICAgICAgI
3053H1cbiAgICAgICAgfSkge1xuICAgICAgICAgIGRlbGV0ZSBkcmFmdFtxdWVyeUNhY2hlS2V5XTtcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyZTogcHJlcGFyZUF1dG9CYXRjaGVkKClcbiAgICAgIH0sXG4gICAgICBjYWNoZUVudHJpZXNVcHNlcnRlZDoge1xuICAgICAgICByZWR1Y2VyKGRyYWZ0LCBhY3Rpb24pIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGFjdGlvbi5wYXlsb2FkKSB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIHF1ZXJ5RGVzY3JpcHRpb246IGFyZyxcbiAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgIH0gPSBlbnRyeTtcbiAgICAgICAgICAgIHdyaXRlUGVuZGluZ0NhY2hlRW50cnkoZHJhZnQsIGFyZywgdHJ1ZSwge1xuICAgICAgICAgICAgICBhcmcsXG4gICAgICAgICAgICAgIHJlcXVlc3RJZDogYWN0aW9uLm1ldGEucmVxdWVzdElkLFxuICAgICAgICAgICAgICBzdGFydGVkVGltZVN0YW1wOiBhY3Rpb24ubWV0YS50aW1lc3RhbXBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgd3JpdGVGdWxmaWxsZWRDYWNoZUVudHJ5KFxuICAgICAgICAgICAgICBkcmFmdCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFyZyxcbiAgICAgICAgICAgICAgICByZXF1ZXN0SWQ6IGFjdGlvbi5tZXRhLnJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICBmdWxmaWxsZWRUaW1lU3RhbXA6IGFjdGlvbi5tZXRhLnRpbWVzdGFtcCxcbiAgICAgICAgICAgICAgICBiYXNlUXVlcnlNZXRhOiB7fVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgLy8gV2Uga25vdyB3ZSdyZSB1cHNlcnRpbmcgaGVyZVxuICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyZTogKHBheWxvYWQpID0+IHtcbiAgICAgICAgICBjb25zdCBxdWVyeURlc2NyaXB0aW9ucyA9IHBheWxvYWQubWFwKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBlbmRwb2ludE5hbWUsXG4gICAgICAgICAgICAgIGFyZyxcbiAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgIH0gPSBlbnRyeTtcbiAgICAgICAgICAgIGNvbnN0IGVuZHBvaW50RGVmaW5pdGlvbiA9IGRlZmluaXRpb25zW2VuZHBvaW50TmFtZV07XG4gICAgICAgICAgICBjb25zdCBxdWVyeURlc2NyaXB0aW9uID0ge1xuICAgICAgICAgICAgICB0eXBlOiBFTkRQT0lOVF9RVUVSWSxcbiAgICAgICAgICAgICAgZW5kcG9pbnROYW1lLFxuICAgICAgICAgICAgICBvcmlnaW5hbEFyZ3M6IGVudHJ5LmFyZyxcbiAgICAgICAgICAgICAgcXVlcnlDYWNoZUtleTogc2VyaWFsaXplUXVlcnlBcmdzKHtcbiAgICAgICAgICAgICAgICBxdWVyeUFyZ3M6IGFyZyxcbiAgICAgICAgICAgICAgICBlbmRwb2ludERlZmluaXRpb24sXG4gICAgICAgICAgICAgICAgZW5kcG9pbnROYW1lXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgcXVlcnlEZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgcGF5bG9hZDogcXVlcnlEZXNjcmlwdGlvbnMsXG4gICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgIFtTSE9VTERfQVVUT0JBVENIXTogdHJ1ZSxcbiAgICAgICAgICAgICAgcmVxdWVzdElkOiBuYW5vaWQoKSxcbiAgICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcXVlcnlSZXN1bHRQYXRjaGVkOiB7XG4gICAgICAgIHJlZHVjZXIoZHJhZnQsIHtcbiAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICBxdWVyeUNhY2hlS2V5LFxuICAgICAgICAgICAgcGF0Y2hlc1xuICAgICAgICAgIH1cbiAgICAgICAgfSkge1xuICAgICAgICAgIHVwZGF0ZVF1ZXJ5U3Vic3RhdGVJZkV4aXN0cyhkcmFmdCwgcXVlcnlDYWNoZUtleSwgKHN1YnN0YXRlKSA9PiB7XG4gICAgICAgICAgICBzdWJzdGF0ZS5kYXRhID0gYXBwbHlQYXRjaGVzKHN1YnN0YXRlLmRhdGEsIHBhdGNoZXMuY29uY2F0KCkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJlOiBwcmVwYXJlQXV0b0JhdGNoZWQoKVxuICAgICAgfVxuICAgIH0sXG4gICAgZXh0cmFSZWR1Y2VycyhidWlsZGVyKSB7XG4gICAgICBidWlsZGVyLmFkZENhc2UocXVlcnlUaHVuay5wZW5kaW5nLCAoZHJhZnQsIHtcbiAgICAgICAgbWV0YSxcbiAgICAgICAgbWV0YToge1xuICAgICAgICAgIGFyZ1xuICAgICAgICB9XG4gICAgICB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHVwc2VydGluZyA9IGlzVXBzZXJ0UXVlcnkoYXJnKTtcbiAgICAgICAgd3JpdGVQZW5kaW5nQ2FjaGVFbnRyeShkcmFmdCwgYXJnLCB1cHNlcnRpbmcsIG1ldGEpO1xuICAgICAgfSkuYWRkQ2FzZShxdWVyeVRodW5rLmZ1bGZpbGxlZCwgKGRyYWZ0LCB7XG4gICAgICAgIG1ldGEsXG4gICAgICAgIHBheWxvYWRcbiAgICAgIH0pID0+IHtcbiAgICAgICAgY29uc3QgdXBzZXJ0aW5nID0gaXNVcHNlcnRRdWVyeShtZXRhLmFyZyk7XG4gICAgICAgIHdyaXRlRnVsZmlsbGVkQ2FjaGVFbnRyeShkcmFmdCwgbWV0YSwgcGF5bG9hZCwgdXBzZXJ0aW5nKTtcbiAgICAgIH0pLmFkZENhc2UocXVlcnlUaHVuay5yZWplY3RlZCwgKGRyYWZ0LCB7XG4gICAgICAgIG1ldGE6IHtcbiAgICAgICAgICBjb25kaXRpb24sXG4gICAgICAgICAgYXJnLFxuICAgICAgICAgIHJlcXVlc3RJZFxuICAgICAgICB9LFxuICAgICAgICBlcnJvcixcbiAgICAgICAgcGF5bG9hZFxuICAgICAgfSkgPT4ge1xuICAgICAgICB1cGRhdGVRdWVyeVN1YnN0YXRlSWZFeGlzdHMoZHJhZnQsIGFyZy5xdWVyeUNhY2hlS2V5LCAoc3Vic3RhdGUpID0+IHtcbiAgICAgICAgICBpZiAoY29uZGl0
3053aW9uKSB7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzdWJzdGF0ZS5yZXF1ZXN0SWQgIT09IHJlcXVlc3RJZCkgcmV0dXJuO1xuICAgICAgICAgICAgc3Vic3RhdGUuc3RhdHVzID0gU1RBVFVTX1JFSkVDVEVEO1xuICAgICAgICAgICAgc3Vic3RhdGUuZXJyb3IgPSBwYXlsb2FkID8/IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KS5hZGRNYXRjaGVyKGhhc1JlaHlkcmF0aW9uSW5mbywgKGRyYWZ0LCBhY3Rpb24pID0+IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHF1ZXJpZXNcbiAgICAgICAgfSA9IGV4dHJhY3RSZWh5ZHJhdGlvbkluZm8oYWN0aW9uKTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXMocXVlcmllcykpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAvLyBkbyBub3QgcmVoeWRyYXRlIGVudHJpZXMgdGhhdCB3ZXJlIGN1cnJlbnRseSBpbiBmbGlnaHQuXG4gICAgICAgICAgICAoZW50cnkgPT0gbnVsbCA/IHZvaWQgMCA6IGVudHJ5LnN0YXR1cykgPT09IFNUQVRVU19GVUxGSUxMRUQgfHwgKGVudHJ5ID09IG51bGwgPyB2b2lkIDAgOiBlbnRyeS5zdGF0dXMpID09PSBTVEFUVVNfUkVKRUNURURcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGRyYWZ0W2tleV0gPSBlbnRyeTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IG11dGF0aW9uU2xpY2UgPSBjcmVhdGVTbGljZSh7XG4gICAgbmFtZTogYCR7cmVkdWNlclBhdGh9L211dGF0aW9uc2AsXG4gICAgaW5pdGlhbFN0YXRlLFxuICAgIHJlZHVjZXJzOiB7XG4gICAgICByZW1vdmVNdXRhdGlvblJlc3VsdDoge1xuICAgICAgICByZWR1Y2VyKGRyYWZ0LCB7XG4gICAgICAgICAgcGF5bG9hZFxuICAgICAgICB9KSB7XG4gICAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBnZXRNdXRhdGlvbkNhY2hlS2V5KHBheWxvYWQpO1xuICAgICAgICAgIGlmIChjYWNoZUtleSBpbiBkcmFmdCkge1xuICAgICAgICAgICAgZGVsZXRlIGRyYWZ0W2NhY2hlS2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcmU6IHByZXBhcmVBdXRvQmF0Y2hlZCgpXG4gICAgICB9XG4gICAgfSxcbiAgICBleHRyYVJlZHVjZXJzKGJ1aWxkZXIpIHtcbiAgICAgIGJ1aWxkZXIuYWRkQ2FzZShtdXRhdGlvblRodW5rLnBlbmRpbmcsIChkcmFmdCwge1xuICAgICAgICBtZXRhLFxuICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgIGFyZyxcbiAgICAgICAgICBzdGFydGVkVGltZVN0YW1wXG4gICAgICAgIH1cbiAgICAgIH0pID0+IHtcbiAgICAgICAgaWYgKCFhcmcudHJhY2spIHJldHVybjtcbiAgICAgICAgZHJhZnRbZ2V0TXV0YXRpb25DYWNoZUtleShtZXRhKV0gPSB7XG4gICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgIHN0YXR1czogU1RBVFVTX1BFTkRJTkcsXG4gICAgICAgICAgZW5kcG9pbnROYW1lOiBhcmcuZW5kcG9pbnROYW1lLFxuICAgICAgICAgIHN0YXJ0ZWRUaW1lU3RhbXBcbiAgICAgICAgfTtcbiAgICAgIH0pLmFkZENhc2UobXV0YXRpb25UaHVuay5mdWxmaWxsZWQsIChkcmFmdCwge1xuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBtZXRhXG4gICAgICB9KSA9PiB7XG4gICAgICAgIGlmICghbWV0YS5hcmcudHJhY2spIHJldHVybjtcbiAgICAgICAgdXBkYXRlTXV0YXRpb25TdWJzdGF0ZUlmRXhpc3RzKGRyYWZ0LCBtZXRhLCAoc3Vic3RhdGUpID0+IHtcbiAgICAgICAgICBpZiAoc3Vic3RhdGUucmVxdWVzdElkICE9PSBtZXRhLnJlcXVlc3RJZCkgcmV0dXJuO1xuICAgICAgICAgIHN1YnN0YXRlLnN0YXR1cyA9IFNUQVRVU19GVUxGSUxMRUQ7XG4gICAgICAgICAgc3Vic3RhdGUuZGF0YSA9IHBheWxvYWQ7XG4gICAgICAgICAgc3Vic3RhdGUuZnVsZmlsbGVkVGltZVN0YW1wID0gbWV0YS5mdWxmaWxsZWRUaW1lU3RhbXA7XG4gICAgICAgIH0pO1xuICAgICAgfSkuYWRkQ2FzZShtdXRhdGlvblRodW5rLnJlamVjdGVkLCAoZHJhZnQsIHtcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIG1ldGFcbiAgICAgIH0pID0+IHtcbiAgICAgICAgaWYgKCFtZXRhLmFyZy50cmFjaykgcmV0dXJuO1xuICAgICAgICB1cGRhdGVNdXRhdGlvblN1YnN0YXRlSWZFeGlzdHMoZHJhZnQsIG1ldGEsIChzdWJzdGF0ZSkgPT4ge1xuICAgICAgICAgIGlmIChzdWJzdGF0ZS5yZXF1ZXN0SWQgIT09IG1ldGEucmVxdWVzdElkKSByZXR1cm47XG4gICAgICAgICAgc3Vic3RhdGUuc3RhdHVzID0gU1RBVFVTX1JFSkVDVEVEO1xuICAgICAgICAgIHN1YnN0YXRlLmVycm9yID0gcGF5bG9hZCA/PyBlcnJvcjtcbiAgICAgICAgfSk7XG4gICAgICB9KS5hZGRNYXRjaGVyKGhhc1JlaHlkcmF0aW9uSW5mbywgKGRyYWZ0LCBhY3Rpb24pID0+IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIG11dGF0aW9uc1xuICAgICAgICB9ID0gZXh0cmFjdFJlaHlkcmF0aW9uSW5mbyhhY3Rpb24pO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhtdXRhdGlvbnMpKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgLy8gZG8gbm90IHJlaHlkcmF0ZSBlbnRyaWVzIHRoYXQgd2VyZSBjdXJyZW50bHkgaW4gZmxpZ2h0LlxuICAgICAgICAgICAgKChlbnRyeSA9PSBudWxsID8gdm9pZCAwIDogZW50cnkuc3RhdHVzKSA9PT0gU1RBVFVTX0ZVTEZJTExFRCB8fCAoZW50cnkgPT0gbnVsbCA/IHZvaWQgMCA6IGVudHJ5LnN0YXR1cykgPT09IFNUQVRVU19SRUpFQ1RFRCkgJiYgLy8gb25seSByZWh5ZHJhdGUgZW5kcG9pbnRzIHRoYXQgd2VyZSBwZXJzaXN0ZWQgdXNpbmcgYSBgZml4ZWRDYWNoZUtleWBcbiAgICAgICAgICAgIGtleSAhPT0gKGVudHJ5ID09IG51bGwgPyB2b2lkIDAgOiBlbnRyeS5yZXF1ZXN0SWQpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBkcmFmdFtrZXldID0gZW50cnk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBpbml0aWFsSW52YWxpZGF0aW9uU3RhdGUgPSB7XG4gICAgdGFnczoge30sXG4gICAga2V5czoge31cbiAgfTtcbiAgY29uc3QgaW52YWxpZGF0aW9uU2xpY2UgPSBjcmVhdGVTbGljZSh7XG4gICAgbmFtZTogYCR7cmVkdWNlclBhdGh9L2ludmFsaWRhdGlvbmAsXG4gICAgaW5pdGlhbFN0YXRlOiBpbml0aWFsSW52YWxpZGF0aW9uU3RhdGUsXG4gICAgcmVkdWNlcnM6IHtcbiAgICAgIHVwZGF0ZVByb3ZpZGVkQnk6IHtcbiAgICAgICAgcmVkdWNlcihkcmFmdCwgYWN0aW9uKSB7XG4gICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgICAgZm9yIChjb25zdCB7XG4gICAgICAgICAgICBxdWVyeUNhY2hlS2V5LFxuICAgICAgICAgICAgcHJvdmlkZWRUYWdzXG4gICAgICAgICAgfSBvZiBhY3Rpb24ucGF5bG9hZCkge1xuICAgICAgICAgICAgcmVtb3ZlQ2FjaGVLZXlGcm9tVGFncyhkcmFmdCwgcXVlcnlDYWNoZUtleSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHtcbiAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgaWRcbiAgICAgICAgICAgI
3053H0gb2YgcHJvdmlkZWRUYWdzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHN1YnNjcmliZWRRdWVyaWVzID0gKF9iID0gKF9hID0gZHJhZnQudGFncylbdHlwZV0gPz8gKF9hW3R5cGVdID0ge30pKVtfYyA9IGlkIHx8IFwiX19pbnRlcm5hbF93aXRob3V0X2lkXCJdID8/IChfYltfY10gPSBbXSk7XG4gICAgICAgICAgICAgIGNvbnN0IGFscmVhZHlTdWJzY3JpYmVkID0gc3Vic2NyaWJlZFF1ZXJpZXMuaW5jbHVkZXMocXVlcnlDYWNoZUtleSk7XG4gICAgICAgICAgICAgIGlmICghYWxyZWFkeVN1YnNjcmliZWQpIHtcbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVkUXVlcmllcy5wdXNoKHF1ZXJ5Q2FjaGVLZXkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkcmFmdC5rZXlzW3F1ZXJ5Q2FjaGVLZXldID0gcHJvdmlkZWRUYWdzO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyZTogcHJlcGFyZUF1dG9CYXRjaGVkKClcbiAgICAgIH1cbiAgICB9LFxuICAgIGV4dHJhUmVkdWNlcnMoYnVpbGRlcikge1xuICAgICAgYnVpbGRlci5hZGRDYXNlKHF1ZXJ5U2xpY2UuYWN0aW9ucy5yZW1vdmVRdWVyeVJlc3VsdCwgKGRyYWZ0LCB7XG4gICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICBxdWVyeUNhY2hlS2V5XG4gICAgICAgIH1cbiAgICAgIH0pID0+IHtcbiAgICAgICAgcmVtb3ZlQ2FjaGVLZXlGcm9tVGFncyhkcmFmdCwgcXVlcnlDYWNoZUtleSk7XG4gICAgICB9KS5hZGRNYXRjaGVyKGhhc1JlaHlkcmF0aW9uSW5mbywgKGRyYWZ0LCBhY3Rpb24pID0+IHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBwcm92aWRlZFxuICAgICAgICB9ID0gZXh0cmFjdFJlaHlkcmF0aW9uSW5mbyhhY3Rpb24pO1xuICAgICAgICBmb3IgKGNvbnN0IFt0eXBlLCBpbmNvbWluZ1RhZ3NdIG9mIE9iamVjdC5lbnRyaWVzKHByb3ZpZGVkLnRhZ3MgPz8ge30pKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBbaWQsIGNhY2hlS2V5c10gb2YgT2JqZWN0LmVud
3053HJpZXMoaW5jb21pbmdUYWdzKSkge1xuICAgICAgICAgICAgY29uc3Qgc3Vic2NyaWJlZFF1ZXJpZXMgPSAoX2IgPSAoX2EgPSBkcmFmdC50YWdzKVt0eXBlXSA/PyAoX2FbdHlwZV0gPSB7fSkpW19jID0gaWQgfHwgXCJfX2ludGVybmFsX3dpdGhvdXRfaWRcIl0gPz8gKF9iW19jXSA9IFtdKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcXVlcnlDYWNoZUtleSBvZiBjYWNoZUtleXMpIHtcbiAgICAgICAgICAgICAgY29uc3QgYWxyZWFkeVN1YnNjcmliZWQgPSBzdWJzY3JpYmVkUXVlcmllcy5pbmNsdWRlcyhxdWVyeUNhY2hlS2V5KTtcbiAgICAgICAgICAgICAgaWYgKCFhbHJlYWR5U3Vic2NyaWJlZCkge1xuICAgICAgICAgICAgICAgIHN1YnNjcmliZWRRdWVyaWVzLnB1c2gocXVlcnlDYWNoZUtleSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZHJhZnQua2V5c1txdWVyeUNhY2hlS2V5XSA9IHByb3ZpZGVkLmtleXNbcXVlcnlDYWNoZUtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KS5hZGRNYXRjaGVyKGlzQW55T2YoaXNGdWxmaWxsZWQocXVlcnlUaHVuayksIGlzUmVqZWN0ZWRXaXRoVmFsdWUocXVlcnlUaHVuaykpLCAoZHJhZnQsIGFjdGlvbikgPT4ge1xuICAgICAgICB3cml0ZVByb3ZpZGVkVGFnc0ZvclF1ZXJpZXMoZHJhZnQsIFthY3Rpb25dKTtcbiAgICAgIH0pLmFkZE1hdGNoZXIocXVlcnlTbGljZS5hY3Rpb25zLmNhY2hlRW50cmllc1Vwc2VydGVkLm1hdGNoLCAoZHJhZnQsIGFjdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBtb2NrQWN0aW9ucyA9IGFjdGlvbi5wYXlsb2FkLm1hcCgoe1xuICAgICAgICAgIHF1ZXJ5RGVzY3JpcHRpb24sXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgfSkgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBcIlVOS05PV05cIixcbiAgICAgICAgICAgIHBheWxvYWQ6IHZhbHVlLFxuICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICByZXF1ZXN0U3RhdHVzOiBcImZ1bGZpbGxlZFwiLFxuICAgICAgICAgICAgICByZXF1ZXN0SWQ6IFwiVU5LTk9XTlwiLFxuICAgICAgICAgICAgICBhcmc6IHF1ZXJ5RGVzY3JpcHRpb25cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgd3JpdGVQcm92aWRlZFRhZ3NGb3JRdWVyaWVzKGRyYWZ0LCBtb2NrQWN0aW9ucyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICBmdW5jdGlvbiByZW1vdmVDYWNoZUtleUZyb21UYWdzKGRyYWZ0LCBxdWVyeUNhY2hlS2V5KSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IGV4aXN0aW5nVGFncyA9IGdldEN1cnJlbnQoZHJhZnQua2V5c1txdWVyeUNhY2hlS2V5XSA/PyBbXSk7XG4gICAgZm9yIChjb25zdCB0YWcgb2YgZXhpc3RpbmdUYWdzKSB7XG4gICAgICBjb25zdCB0YWdUeXBlID0gdGFnLnR5cGU7XG4gICAgICBjb25zdCB0YWdJZCA9IHRhZy5pZCA/PyBcIl9faW50ZXJuYWxfd2l0aG91dF9pZFwiO1xuICAgICAgY29uc3QgdGFnU3Vic2NyaXB0aW9ucyA9IChfYSA9IGRyYWZ0LnRhZ3NbdGFnVHlwZV0pID09IG51bGwgPyB2b2lkIDAgOiBfYVt0YWdJZF07XG4gICAgICBpZiAodGFnU3Vic2NyaXB0aW9ucykge1xuICAgICAgICBkcmFmdC50YWdzW3RhZ1R5cGVdW3RhZ0lkXSA9IGdldEN1cnJlbnQodGFnU3Vic2NyaXB0aW9ucykuZmlsdGVyKChxYykgPT4gcWMgIT09IHF1ZXJ5Q2FjaGVLZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBkZWxldGUgZHJhZnQua2V5c1txdWVyeUNhY2hlS2V5XTtcbiAgfVxuICBmdW5jdGlvbiB3cml0ZVByb3ZpZGVkVGFnc0ZvclF1ZXJpZXMoZHJhZnQsIGFjdGlvbnMzKSB7XG4gICAgY29uc3QgcHJvdmlkZWRCeUVudHJpZXMgPSBhY3Rpb25zMy5tYXAoKGFjdGlvbikgPT4ge1xuICAgICAgY29uc3QgcHJvdmlkZWRUYWdzID0gY2FsY3VsYXRlUHJvdmlkZWRCeVRodW5rKGFjdGlvbiwgXCJwcm92aWRlc1RhZ3NcIiwgZGVmaW5pdGlvbnMsIGFzc2VydFRhZ1R5cGUpO1xuICAgICAgY29uc3Qge1xuICAgICAgICBxdWVyeUNhY2hlS2V5XG4gICAgICB9ID0gYWN0aW9uLm1ldGEuYXJnO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcXVlcnlDYWNoZUtleSxcbiAgICAgICAgcHJvdmlkZWRUYWdzXG4gICAgICB9O1xuICAgIH0pO1xuICAgIGludmFsaWRhdGlvblNsaWNlLmNhc2VSZWR1Y2Vycy51cGRhdGVQcm92aWRlZEJ5KGRyYWZ0LCBpbnZhbGlkYXRpb25TbGljZS5hY3Rpb25zLnVwZGF0ZVByb3ZpZGVkQnkocHJvdmlkZWRCeUVudHJpZXMpKTtcbiAgfVxuICBjb25zdCBzdWJzY3JpcHRpb25TbGljZSA9IGNyZWF0ZVNsaWNlKHtcbiAgICBuYW1lOiBgJHtyZWR1Y2VyUGF0aH0vc3Vic2NyaXB0aW9uc2AsXG4gICAgaW5pdGlhbFN0YXRlLFxuICAgIHJlZHVjZXJzOiB7XG4gICAgICB1cGRhdGVTdWJzY3JpcHRpb25PcHRpb25zKGQsIGEpIHtcbiAgICAgIH0sXG4gICAgICB1bnN1YnNjcmliZVF1ZXJ5UmVzdWx0KGQsIGEpIHtcbiAgICAgIH0sXG4gICAgICBpbnRlcm5hbF9nZXRSVEtRU3Vic2NyaXB0aW9ucygpIHtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICBjb25zdCBpbnRlcm5hbFN1YnNjcmlwdGlvbnNTbGljZSA9IGNyZWF0ZVNsaWNlKHtcbiAgICBuYW1lOiBgJHtyZWR1Y2VyUGF0aH0vaW50ZXJuYWxTdWJzY3JpcHRpb25zYCxcbiAgICBpbml0aWFsU3RhdGUsXG4gICAgcmVkdWNlcnM6IHtcbiAgICAgIHN1YnNjcmlwdGlvbnNVcGRhdGVkOiB7XG4gICAgICAgIHJlZHVjZXIoc3RhdGUsIGFjdGlvbikge1xuICAgICAgICAgIHJldHVybiBhcHBseVBhdGNoZXMoc3RhdGUsIGFjdGlvbi5wYXlsb2FkKTtcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyZTogcHJlcGFyZUF1dG9CYXRjaGVkKClcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICBjb25zdCBjb25maWdTbGljZSA9IGNyZWF0ZVNsaWNlKHtcbiAgICBuYW1lOiBgJHtyZWR1Y2VyUGF0aH0vY29uZmlnYCxcbiAgICBpbml0aWFsU3RhdGU6IHtcbiAgICAgIG9ubGluZTogaXNPbmxpbmUoKSxcbiAgICAgIGZvY3VzZWQ6IGlzRG9jdW1lbnRWaXNpYmxlKCksXG4gICAgICBtaWRkbGV3YXJlUmVnaXN0ZXJlZDogZmFsc2UsXG4gICAgICAuLi5jb25maWdcbiAgICB9LFxuICAgIHJlZHVjZXJzOiB7XG4gICAgICBtaWRkbGV3YXJlUmVnaXN0ZXJlZChzdGF0ZSwge1xuICAgICAgICBwYXlsb2FkXG4gICAgICB9KSB7XG4gICAgICAgI
3053HN0YXRlLm1pZGRsZXdhcmVSZWdpc3RlcmVkID0gc3RhdGUubWlkZGxld2FyZVJlZ2lzdGVyZWQgPT09IFwiY29uZmxpY3RcIiB8fCBhcGlVaWQgIT09IHBheWxvYWQgPyBcImNvbmZsaWN0XCIgOiB0cnVlO1xuICAgICAgfVxuICAgIH0sXG4gICAgZXh0cmFSZWR1Y2VyczogKGJ1aWxkZXIpID0+IHtcbiAgICAgIGJ1aWxkZXIuYWRkQ2FzZShvbk9ubGluZSwgKHN0YXRlKSA9PiB7XG4gICAgICAgIHN0YXRlLm9ubGluZSA9IHRydWU7XG4gICAgICB9KS5hZGRDYXNlKG9uT2ZmbGluZSwgKHN0YXRlKSA9PiB7XG4gICAgICAgIHN0YXRlLm9ubGluZSA9IGZhbHNlO1xuICAgICAgfSkuYWRkQ2FzZShvbkZvY3VzLCAoc3RhdGUpID0+IHtcbiAgICAgICAgc3RhdGUuZm9jdXNlZCA9IHRydWU7XG4gICAgICB9KS5hZGRDYXNlKG9uRm9jdXNMb3N0LCAoc3RhdGUpID0+IHtcbiAgICAgICAgc3RhdGUuZm9jdXNlZCA9IGZhbHNlO1xuICAgICAgfSkuYWRkTWF0Y2hlcihoYXNSZWh5ZHJhdGlvbkluZm8sIChkcmFmdCkgPT4gKHtcbiAgICAgICAgLi4uZHJhZnRcbiAgICAgIH0pKTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBjb21iaW5lZFJlZHVjZXIgPSBjb21iaW5lUmVkdWNlcnMoe1xuICAgIHF1ZXJpZXM6IHF1ZXJ5U2xpY2UucmVkdWNlcixcbiAgICBtdXRhdGlvbnM6IG11dGF0aW9uU2xpY2UucmVkdWNlcixcbiAgICBwcm92aWRlZDogaW52YWxpZGF0aW9uU2xpY2UucmVkdWNlcixcbiAgICBzdWJzY3JpcHRpb25zOiBpbnRlcm5hbFN1YnNjcmlwdGlvbnNTbGljZS5yZWR1Y2VyLFxuICAgIGNvbmZpZzogY29uZmlnU2xpY2UucmVkdWNlclxuICB9KTtcbiAgY29uc3QgcmVkdWNlciA9IChzdGF0ZSwgYWN0aW9uKSA9PiBjb21iaW5lZFJlZHVjZXIocmVzZXRBcGlTdGF0ZS5tYXRjaChhY3Rpb24pID8gdm9pZCAwIDogc3RhdGUsIGFjdGlvbik7XG4gIGNvbnN0IGFjdGlvbnMyID0ge1xuICAgIC4uLmNvbmZpZ1NsaWNlLmFjdGlvbnMsXG4gICAgLi4ucXVlcnlTbGljZS5hY3Rpb25zLFxuICAgIC4uLnN1YnNjcmlwdGlvblNsaWNlLmFjdGlvbnMsXG4gICAgLi4uaW50ZXJuYWxTdWJzY3JpcHRpb25zU2xpY2UuYWN0aW9ucyxcbiAgICAuLi5tdXRhdGlvblNsaWNlLmFjdGlvbnMsXG4gICAgLi4uaW52YWxpZGF0aW9uU2xpY2UuYWN0aW9ucyxcbiAgICByZXNldEFwaVN0YXRlXG4gIH07XG4gIHJldHVybiB7XG4gICAgcmVkdWNlcixcbiAgICBhY3Rpb25zOiBhY3Rpb25zMlxuICB9O1xufVxudmFyIHNraXBUb2tlbiA9IFN5bWJvbC5mb3IoXCJSVEtRL3NraXBUb2tlblwiKTtcbnZhciBpbml0aWFsU3ViU3RhdGUgPSB7XG4gIHN0YXR1czogU1RBVFVTX1VOSU5JVElBTElaRURcbn07XG52YXIgZGVmYXVsdFF1ZXJ5U3ViU3RhdGUgPSBwcm9kdWNlKGluaXRpYWxTdWJTdGF0ZSwgKCkgPT4ge1xufSk7XG52YXIgZGVmYXVsdE11dGF0aW9uU3ViU3RhdGUgPSBwcm9kdWNlKGluaXRpYWxTdWJTdGF0ZSwgKCkgPT4ge1xufSk7XG5mdW5jdGlvbiBidWlsZFNlbGVjdG9ycyh7XG4gIHNlcmlhbGl6ZVF1ZXJ5QXJncyxcbiAgcmVkdWNlclBhdGgsXG4gIGNyZWF0ZVNlbGVjdG9yOiBjcmVhdGVTZWxlY3RvcjJcbn0pIHtcbiAgY29uc3Qgc2VsZWN0U2tpcHBlZFF1ZXJ5ID0gKHN0YXRlKSA9PiBkZWZhdWx0UXVlcnlTdWJTdGF0ZTtcbiAgY29uc3Qgc2VsZWN0U2tpcHBlZE11dGF0aW9uID0gKHN0YXRlKSA9PiBkZWZhdWx0TXV0YXRpb25TdWJTdGF0ZTtcbiAgcmV0dXJuIHtcbiAgICBidWlsZFF1ZXJ5U2VsZWN0b3IsXG4gICAgYnVpbGRJbmZpbml0ZVF1ZXJ5U2VsZWN0b3IsXG4gICAgYnVpbGRNdXRhdGlvblNlbGVjdG9yLFxuICAgIHNlbGVjdEludmFsaWRhdGVkQnksXG4gICAgc2VsZWN0Q2FjaGVkQXJnc0ZvclF1ZXJ5LFxuICAgIHNlbGVjdEFwaVN0YXRlLFxuICAgIHNlbGVjdFF1ZXJpZXMsXG4gICAgc2VsZWN0TXV0YXRpb25zLFxuICAgIHNlbGVjdFF1ZXJ5RW50cnksXG4gICAgc2VsZWN0Q29uZmlnXG4gIH07XG4gIGZ1bmN0aW9uIHdpdGhSZXF1ZXN0RmxhZ3Moc3Vic3RhdGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3Vic3RhdGUsXG4gICAgICAuLi5nZXRSZXF1ZXN0U3RhdHVzRmxhZ3Moc3Vic3RhdGUuc3RhdHVzKVxuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gc2VsZWN0QXBpU3RhdGUocm9vdFN0YXRlKSB7XG4gICAgY29uc3Qgc3RhdGUgPSByb290U3RhdGVbcmVkdWNlclBhdGhdO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIGlmICghc3RhdGUpIHtcbiAgICAgICAgaWYgKHNlbGVjdEFwaVN0YXRlLnRyaWdnZXJlZCkgcmV0dXJuIHN0YXRlO1xuICAgICAgICBzZWxlY3RBcGlTdGF0ZS50cmlnZ2VyZWQgPSB0cnVlO1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogTm8gZGF0YSBmb3VuZCBhdCBcXGBzdGF0ZS4ke3JlZHVjZXJQYXRofVxcYC4gRGlkIHlvdSBmb3JnZXQgdG8gYWRkIHRoZSByZWR1Y2VyIHRvIHRoZSBzdG9yZT9gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGZ1bmN0aW9uIHNlbGVjdFF1ZXJpZXMocm9vdFN0YXRlKSB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiAoX2EgPSBzZWxlY3RBcGlTdGF0ZShyb290U3RhdGUpKSA9PSBudWxsID8gdm9pZCAwIDogX2EucXVlcmllcztcbiAgfVxuICBmdW5jdGlvbiBzZWxlY3RRdWVyeUVudHJ5KHJvb3RTdGF0ZSwgY2FjaGVLZXkpIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIChfYSA9IHNlbGVjdFF1ZXJpZXMocm9vdFN0YXRlKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hW2NhY2hlS2V5XTtcbiAgfVxuICBmdW5jdGlvbiBzZWxlY3RNdXRhdGlvbnMocm9vdFN0YXRlKSB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiAoX2EgPSBzZWxlY3RBcGlTdGF0ZShyb290U3RhdGUpKSA9PSBudWxsID8gdm9pZCAwIDogX2EubXV0YXRpb25zO1xuICB9XG4gIGZ1bmN0aW9uIHNlbGVjdENvbmZpZyhyb290U3RhdGUpIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIChfYSA9IHNlbGVjdEFwaVN0YXRlKHJvb3RTdGF0ZSkpID09IG51bGwgPyB2b2lkIDAgOiBfYS5jb25maWc7XG4gIH1cbiAgZnVuY3Rpb24gYnVpbGRBbnlRdWVyeVNlbGVjdG9yKGVuZHBvaW50TmFtZSwgZW5kcG9pbnREZWZpbml0aW9uLCBjb21iaW5lcikge1xuICAgIHJldHVybiAocXVlcnlBcmdzKSA9PiB7XG4gICAgICBpZiAocXVlcnlBcmdzID09PSBza2lwVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVNlbGVjdG9yMihzZWxlY3RTa2lwcGVkUXVlcnksIGNvbWJpbmVyKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRBcmdzID0gc2VyaWFsaXplUXVlcnlBcmdzKHtcbiAgICAgICAgcXVlcnlBcmdzLFxuICAgICAgICBlbmRwb2ludERlZmluaXRpb24sXG4gICAgICAgIGVuZHBvaW50TmFtZVxuICAgICAgfSk7XG4gICAgICBjb25zdCBzZWxlY3RRdWVyeVN1YnN0YXRlID0gKHN0YXRl
3053KSA9PiBzZWxlY3RRdWVyeUVudHJ5KHN0YXRlLCBzZXJpYWxpemVkQXJncykgPz8gZGVmYXVsdFF1ZXJ5U3ViU3RhdGU7XG4gICAgICByZXR1cm4gY3JlYXRlU2VsZWN0b3IyKHNlbGVjdFF1ZXJ5U3Vic3RhdGUsIGNvbWJpbmVyKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGJ1aWxkUXVlcnlTZWxlY3RvcihlbmRwb2ludE5hbWUsIGVuZHBvaW50RGVmaW5pdGlvbikge1xuICAgIHJldHVybiBidWlsZEFueVF1ZXJ5U2VsZWN0b3IoZW5kcG9pbnROYW1lLCBlbmRwb2ludERlZmluaXRpb24sIHdpdGhSZXF1ZXN0RmxhZ3MpO1xuICB9XG4gIGZ1bmN0aW9uIGJ1aWxkSW5maW5pdGVRdWVyeVNlbGVjdG9yKGVuZHBvaW50TmFtZSwgZW5kcG9pbnREZWZpbml0aW9uKSB7XG4gICAgY29uc3Qge1xuICAgICAgaW5maW5pdGVRdWVyeU9wdGlvbnNcbiAgICB9ID0gZW5kcG9pbnREZWZpbml0aW9uO1xuICAgIGZ1bmN0aW9uIHdpdGhJbmZpbml0ZVF1ZXJ5UmVzdWx0RmxhZ3Moc3Vic3RhdGUpIHtcbiAgICAgIGNvbnN0IHN0YXRlV2l0aFJlcXVlc3RGbGFncyA9IHtcbiAgICAgICAgLi4uc3Vic3RhdGUsXG4gICAgICAgIC4uLmdldFJlcXVlc3RTdGF0dXNGbGFncyhzdWJzdGF0ZS5zdGF0dXMpXG4gICAgICB9O1xuICAgICAgY29uc3Qge1xuICAgICAgICBpc0xvYWRpbmcsXG4gICAgICAgIGlzRXJyb3IsXG4gICAgICAgIGRpcmVjdGlvblxuICAgICAgfSA9IHN0YXRlV2l0aFJlcXVlc3RGbGFncztcbiAgICAgIGNvbnN0IGlzRm9yd2FyZCA9IGRpcmVjdGlvbiA9PT0gXCJmb3J3YXJkXCI7XG4gICAgICBjb25zdCBpc0JhY2t3YXJkID0gZGlyZWN0aW9uID09PSBcImJhY2t3YXJkXCI7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZVdpdGhSZXF1ZXN0RmxhZ3MsXG4gICAgICAgIGhhc05leHRQYWdlOiBnZXRIYXNOZXh0UGFnZShpbmZpbml0ZVF1ZXJ5T3B0aW9ucywgc3RhdGVXaXRoUmVxdWVzdEZsYWdzLmRhdGEsIHN0YXRlV2l0aFJlcXVlc3RGbGFncy5vcmlnaW5hbEFyZ3MpLFxuICAgICAgICBoYXNQcmV2aW91c1BhZ2U6IGdldEhhc1ByZXZpb3VzUGFnZShpbmZpbml0ZVF1ZXJ5T3B0aW9ucywgc3RhdGVXaXRoUmVxdWVzdEZsYWdzLmRhdGEsIHN0YXRlV2l0aFJlcXVlc3RGbGFncy5vcmlnaW5hbEFyZ3MpLFxuICAgICAgICBpc0ZldGNoaW5nTmV4dFBhZ2U6IGlzTG9hZGluZyAmJiBpc0ZvcndhcmQsXG4gICAgICAgIGlzRmV0Y2hpbmdQcmV2aW91c1BhZ2U6IGlzTG9hZGluZyAmJiBpc0JhY2t3YXJkLFxuICAgICAgICBpc0ZldGNoTmV4dFBhZ2VFcnJvcjogaXNFcnJvciAmJiBpc0ZvcndhcmQsXG4gICAgICAgIGlzRmV0Y2hQcmV2aW91c1BhZ2VFcnJvcjogaXNFcnJvciAmJiBpc0JhY2t3YXJkXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRBbnlRdWVyeVNlbGVjdG9yKGVuZHBvaW50TmFtZSwgZW5kcG9pbnREZWZpbml0aW9uLCB3aXRoSW5maW5pdGVRdWVyeVJlc3VsdEZsYWdzKTtcbiAgfVxuICBmdW5jdGlvbiBidWlsZE11dGF0aW9uU2VsZWN0b3IoKSB7XG4gICAgcmV0dXJuIChpZCkgPT4ge1xuICAgICAgbGV0IG11dGF0aW9uSWQ7XG4gICAgICBpZiAodHlwZW9mIGlkID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIG11dGF0aW9uSWQgPSBnZXRNdXRhdGlvbkNhY2hlS2V5KGlkKSA/PyBza2lwVG9rZW47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtdXRhdGlvbklkID0gaWQ7XG4gICAgICB9XG4gICAgICBjb25zdCBzZWxlY3RNdXRhdGlvblN1YnN0YXRlID0gKHN0YXRlKSA9PiB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHJldHVybiAoKF9iID0gKF9hID0gc2VsZWN0QXBpU3RhdGUoc3RhdGUpKSA9PSBudWxsID8gdm9pZCAwIDogX2EubXV0YXRpb25zKSA9PSBudWxsID8gdm9pZCAwIDogX2JbbXV0YXRpb25JZF0pID8/IGRlZmF1bHRNdXRhdGlvblN1YlN0YXRlO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGZpbmFsU2VsZWN0TXV0YXRpb25TdWJzdGF0ZSA9IG11dGF0aW9uSWQgPT09IHNraXBUb2tlbiA/IHNlbGVjdFNraXBwZWRNdXRhdGlvbiA6IHNlbGVjdE11dGF0aW9uU3Vic3RhdGU7XG4gICAgICByZXR1cm4gY3JlYXRlU2VsZWN0b3IyKGZpbmFsU2VsZWN0TXV0YXRpb25TdWJzdGF0ZSwgd2l0aFJlcXVlc3RGbGFncyk7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBzZWxlY3RJbnZhbGlkYXRlZEJ5KHN0YXRlLCB0YWdzKSB7XG4gICAgY29uc3QgYXBpU3RhdGUgPSBzdGF0ZVtyZWR1Y2VyUGF0aF07XG4gICAgY29uc3QgdG9JbnZhbGlkYXRlID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgICBjb25zdCBmaW5hbFRhZ3MgPSBmaWx0ZXJNYXAodGFncywgaXNOb3ROdWxsaXNoLCBleHBhbmRUYWdEZXNjcmlwdGlvbik7XG4gICAgZm9yIChjb25zdCB0YWcgb2YgZmluYWxUYWdzKSB7XG4gICAgICBjb25zdCBwcm92aWRlZCA9IGFwaVN0YXRlLnByb3ZpZGVkLnRhZ3NbdGFnLnR5cGVdO1xuICAgICAgaWYgKCFwcm92aWRlZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxldCBpbnZhbGlkYXRlU3Vic2NyaXB0aW9ucyA9ICh0YWcuaWQgIT09IHZvaWQgMCA/IChcbiAgICAgICAgLy8gaWQgZ2l2ZW46IGludmFsaWRhdGUgYWxsIHF1ZXJpZXMgdGhhdCBwcm92aWRlIHRoaXMgdHlwZSAmIGlkXG4gICAgICAgIHByb3ZpZGVkW3RhZy5pZF1cbiAgICAgICkgOiAoXG4gICAgICAgIC8vIG5vIGlkOiBpbnZhbGlkYXRlIGFsbCBxdWVyaWVzIHRoYXQgcHJvdmlkZSB0aGlzIHR5cGVcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhwcm92aWRlZCkuZmxhdCgpXG4gICAgICApKSA/PyBbXTtcbiAgICAgIGZvciAoY29uc3QgaW52YWxpZGF0ZSBvZiBpbnZhbGlkYXRlU3Vic2NyaXB0aW9ucykge1xuICAgICAgICB0b0ludmFsaWRhdGUuYWRkKGludmFsaWRhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0b0ludmFsaWRhdGUudmFsdWVzKCkpLmZsYXRNYXAoKHF1ZXJ5Q2FjaGVLZXkpID0+IHtcbiAgICAgIGNvbnN0IHF1ZXJ5U3ViU3RhdGUgPSBhcGlTdGF0ZS5xdWVyaWVzW3F1ZXJ5Q2FjaGVLZXldO1xuICAgICAgcmV0dXJuIHF1ZXJ5U3ViU3RhdGUgPyB7XG4gICAgICAgI
3053HF1ZXJ5Q2FjaGVLZXksXG4gICAgICAgIGVuZHBvaW50TmFtZTogcXVlcnlTdWJTdGF0ZS5lbmRwb2ludE5hbWUsXG4gICAgICAgIG9yaWdpbmFsQXJnczogcXVlcnlTdWJTdGF0ZS5vcmlnaW5hbEFyZ3NcbiAgICAgIH0gOiBbXTtcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBzZWxlY3RDYWNoZWRBcmdzRm9yUXVlcnkoc3RhdGUsIHF1ZXJ5TmFtZSkge1xuICAgIHJldHVybiBmaWx0ZXJNYXAoT2JqZWN0LnZhbHVlcyhzZWxlY3RRdWVyaWVzKHN0YXRlKSksIChlbnRyeSkgPT4gKGVudHJ5ID09IG51bGwgPyB2b2lkIDAgOiBlbnRyeS5lbmRwb2ludE5hbWUpID09PSBxdWVyeU5hbWUgJiYgZW50cnkuc3RhdHVzICE9PSBTVEFUVVNfVU5JTklUSUFMSVpFRCwgKGVudHJ5KSA9PiBlbnRyeS5vcmlnaW5hbEFyZ3MpO1xuICB9XG4gIGZ1bmN0aW9uIGdldEhhc05leHRQYWdlKG9wdGlvbnMsIGRhdGEsIHF1ZXJ5QXJnKSB7XG4gICAgaWYgKCFkYXRhKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGdldE5leHRQYWdlUGFyYW0ob3B0aW9ucywgZGF0YSwgcXVlcnlBcmcpICE9IG51bGw7XG4gIH1cbiAgZnVuY3Rpb24gZ2V0SGFzUHJldmlvdXNQYWdlKG9wdGlvbnMsIGRhdGEsIHF1ZXJ5QXJnKSB7XG4gICAgaWYgKCFkYXRhIHx8ICFvcHRpb25zLmdldFByZXZpb3VzUGFnZVBhcmFtKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGdldFByZXZpb3VzUGFnZVBhcmFtKG9wdGlvbnMsIGRhdGEsIHF1ZXJ5QXJnKSAhPSBudWxsO1xuICB9XG59XG52YXIgY2FjaGUgPSBXZWFrTWFwID8gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCkgOiB2b2lkIDA7XG52YXIgZGVmYXVsdFNlcmlhbGl6ZVF1ZXJ5QXJncyA9ICh7XG4gIGVuZHBvaW50TmFtZSxcbiAgcXVlcnlBcmdzXG59KSA9PiB7XG4gIGxldCBzZXJpYWxpemVkID0gXCJcIjtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGUgPT0gbnVsbCA/IHZvaWQgMCA6IGNhY2hlLmdldChxdWVyeUFyZ3MpO1xuICBpZiAodHlwZW9mIGNhY2hlZCA9PT0gXCJzdHJpbmdcIikge1xuICAgIHNlcmlhbGl6ZWQgPSBjYWNoZWQ7XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgc3RyaW5naWZpZWQgPSBKU09OLnN0cmluZ2lmeShxdWVyeUFyZ3MsIChrZXksIHZhbHVlKSA9PiB7XG4gICAgICB2YWx1ZSA9IHR5cGVvZiB2YWx1ZSA9PT0gXCJiaWdpbnRcIiA/IHtcbiAgICAgICAgJGJpZ2ludDogdmFsdWUudG9TdHJpbmcoKVxuICAgICAgfSA6IHZhbHVlO1xuICAgICAgdmFsdWUgPSBpc1BsYWluT2JqZWN0KHZhbHVlKSA/IE9iamVjdC5rZXlzKHZhbHVlKS5zb3J0KCkucmVkdWNlKChhY2MsIGtleTIpID0+IHtcbiAgICAgICAgYWNjW2tleTJdID0gdmFsdWVba2V5Ml07XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fSkgOiB2YWx1ZTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KTtcbiAgICBpZiAoaXNQbGFpbk9iamVjdChxdWVyeUFyZ3MpKSB7XG4gICAgICBjYWNoZSA9PSBudWxsID8gdm9pZCAwIDogY2FjaGUuc2V0KHF1ZXJ5QXJncywgc3RyaW5naWZpZWQpO1xuICAgIH1cbiAgICBzZXJpYWxpemVkID0gc3RyaW5naWZpZWQ7XG4gIH1cbiAgcmV0dXJuIGAke2VuZHBvaW50TmFtZX0oJHtzZXJpYWxpemVkfSlgO1xufTtcbmZ1bmN0aW9uIGJ1aWxkQ3JlYXRlQXBpKC4uLm1vZHVsZXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGJhc2VDcmVhdGVBcGkob3B0aW9ucykge1xuICAgIGNvbnN0IGV4dHJhY3RSZWh5ZHJhdGlvbkluZm8gPSB3ZWFrTWFwTWVtb2l6ZSgoYWN0aW9uKSA9PiB7XG4gICAgICB2Y
3053XIgX2E7XG4gICAgICByZXR1cm4gKF9hID0gb3B0aW9ucy5leHRyYWN0UmVoeWRyYXRpb25JbmZvKSA9PSBudWxsID8gdm9pZCAwIDogX2EuY2FsbChvcHRpb25zLCBhY3Rpb24sIHtcbiAgICAgICAgcmVkdWNlclBhdGg6IG9wdGlvbnMucmVkdWNlclBhdGggPz8gXCJhcGlcIlxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgY29uc3Qgb3B0aW9uc1dpdGhEZWZhdWx0cyA9IHtcbiAgICAgIHJlZHVjZXJQYXRoOiBcImFwaVwiLFxuICAgICAga2VlcFVudXNlZERhdGFGb3I6IDYwLFxuICAgICAgcmVmZXRjaE9uTW91bnRPckFyZ0NoYW5nZTogZmFsc2UsXG4gICAgICByZWZldGNoT25Gb2N1czogZmFsc2UsXG4gICAgICByZWZldGNoT25SZWNvbm5lY3Q6IGZhbHNlLFxuICAgICAgaW52YWxpZGF0aW9uQmVoYXZpb3I6IFwiZGVsYXllZFwiLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGV4dHJhY3RSZWh5ZHJhdGlvbkluZm8sXG4gICAgICBzZXJpYWxpemVRdWVyeUFyZ3MocXVlcnlBcmdzQXBpKSB7XG4gICAgICAgIGxldCBmaW5hbFNlcmlhbGl6ZVF1ZXJ5QXJncyA9IGRlZmF1bHRTZXJpYWxpemVRdWVyeUFyZ3M7XG4gICAgICAgIGlmIChcInNlcmlhbGl6ZVF1ZXJ5QXJnc1wiIGluIHF1ZXJ5QXJnc0FwaS5lbmRwb2ludERlZmluaXRpb24pIHtcbiAgICAgICAgICBjb25zdCBlbmRwb2ludFNRQSA9IHF1ZXJ5QXJnc0FwaS5lbmRwb2ludERlZmluaXRpb24uc2VyaWFsaXplUXVlcnlBcmdzO1xuICAgICAgICAgIGZpbmFsU2VyaWFsaXplUXVlcnlBcmdzID0gKHF1ZXJ5QXJnc0FwaTIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxSZXN1bHQgPSBlbmRwb2ludFNRQShxdWVyeUFyZ3NBcGkyKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW5pdGlhbFJlc3VsdCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICByZXR1cm4gaW5pdGlhbFJlc3VsdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0U2VyaWFsaXplUXVlcnlBcmdzKHtcbiAgICAgICAgICAgICAgICAuLi5xdWVyeUFyZ3NBcGkyLFxuICAgICAgICAgICAgICAgIHF1ZXJ5QXJnczogaW5pdGlhbFJlc3VsdFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuc2VyaWFsaXplUXVlcnlBcmdzKSB7XG4gICAgICAgICAgZmluYWxTZXJpYWxpemVRdWVyeUFyZ3MgPSBvcHRpb25zLnNlcmlhbGl6ZVF1ZXJ5QXJncztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmluYWxTZXJpYWxpemVRdWVyeUFyZ3MocXVlcnlBcmdzQXBpKTtcbiAgICAgIH0sXG4gICAgICB0YWdUeXBlczogWy4uLm9wdGlvbnMudGFnVHlwZXMgfHwgW11dXG4gICAgfTtcbiAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgZW5kcG9pbnREZWZpbml0aW9uczoge30sXG4gICAgICBiYXRjaChmbikge1xuICAgICAgICBmbigpO1xuICAgICAgfSxcbiAgICAgIGFwaVVpZDogbmFub2lkKCksXG4gICAgICBleHRyYWN0UmVoeWRyYXRpb25JbmZvLFxuICAgICAgaGFzUmVoeWRyYXRpb25JbmZvOiB3ZWFrTWFwTWVtb2l6ZSgoYWN0aW9uKSA9PiBleHRyYWN0UmVoeWRyYXRpb25JbmZvKGFjdGlvbikgIT0gbnVsbClcbiAgICB9O1xuICAgIGNvbnN0IGFwaSA9IHtcbiAgICAgIGluamVjdEVuZHBvaW50cyxcbiAgICAgIGVuaGFuY2VFbmRwb2ludHMoe1xuICAgICAgICBhZGRUYWdUeXBlcyxcbiAgICAgICAgZW5kcG9pbnRzXG4gICAgICB9KSB7XG4gICAgICAgIGlmIChhZGRUYWdUeXBlcykge1xuICAgICAgICAgIGZvciAoY29uc3QgZVQgb2YgYWRkVGFnVHlwZXMpIHtcbiAgICAgICAgICAgIGlmICghb3B0aW9uc1dpdGhEZWZhdWx0cy50YWdUeXBlcy5pbmNsdWRlcyhlVCkpIHtcbiAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICBvcHRpb25zV2l0aERlZmF1bHRzLnRhZ1R5cGVzLnB1c2goZVQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5kcG9pbnRzKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBbZW5kcG9pbnROYW1lLCBwYXJ0aWFsRGVmaW5pdGlvbl0gb2YgT2JqZWN0LmVud
3053HJpZXMoZW5kcG9pbnRzKSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJ0aWFsRGVmaW5pdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgIHBhcnRpYWxEZWZpbml0aW9uKGdldEVuZHBvaW50RGVmaW5pdGlvbihjb250ZXh0LCBlbmRwb2ludE5hbWUpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZ2V0RW5kcG9pbnREZWZpbml0aW9uKGNvbnRleHQsIGVuZHBvaW50TmFtZSkgfHwge30sIHBhcnRpYWxEZWZpbml0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IGluaXRpYWxpemVkTW9kdWxlcyA9IG1vZHVsZXMubWFwKChtKSA9PiBtLmluaXQoYXBpLCBvcHRpb25zV2l0aERlZmF1bHRzLCBjb250ZXh0KSk7XG4gICAgZnVuY3Rpb24gaW5qZWN0RW5kcG9pbnRzKGluamVjdCkge1xuICAgICAgY29uc3QgZXZhbHVhdGVkRW5kcG9pbnRzID0gaW5qZWN0LmVuZHBvaW50cyh7XG4gICAgICAgIHF1ZXJ5OiAoeCkgPT4gKHtcbiAgICAgICAgICAuLi54LFxuICAgICAgICAgIHR5cGU6IEVORFBPSU5UX1FVRVJZXG4gICAgICAgIH0pLFxuICAgICAgICBtdXRhdGlvbjogKHgpID0+ICh7XG4gICAgICAgICAgLi4ueCxcbiAgICAgICAgICB0eXBlOiBFTkRQT0lOVF9NVVRBVElPTlxuICAgICAgICB9KSxcbiAgICAgICAgaW5maW5pdGVRdWVyeTogKHgpID0+ICh7XG4gICAgICAgICAgLi4ueCxcbiAgICAgICAgICB0eXBlOiBFTkRQT0lOVF9JTkZJTklURVFVRVJZXG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICAgIGZvciAoY29uc3QgW2VuZHBvaW50TmFtZSwgZGVmaW5pdGlvbl0gb2YgT2JqZWN0LmVud
3053HJpZXMoZXZhbHVhdGVkRW5kcG9pbnRzKSkge1xuICAgICAgICBpZiAoaW5qZWN0Lm92ZXJyaWRlRXhpc3RpbmcgIT09IHRydWUgJiYgZW5kcG9pbnROYW1lIGluIGNvbnRleHQuZW5kcG9pbnREZWZpbml0aW9ucykge1xuICAgICAgICAgIGlmIChpbmplY3Qub3ZlcnJpZGVFeGlzdGluZyA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgzOSkgOiBgY2FsbGVkIFxcYGluamVjdEVuZHBvaW50c1xcYCB0byBvdmVycmlkZSBhbHJlYWR5LWV4aXN0aW5nIGVuZHBvaW50TmFtZSAke2VuZHBvaW50TmFtZX0gd2l0aG91dCBzcGVjaWZ5aW5nIFxcYG92ZXJyaWRlRXhpc3Rpbmc6IHRydWVcXGBgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGNhbGxlZCBcXGBpbmplY3RFbmRwb2ludHNcXGAgdG8gb3ZlcnJpZGUgYWxyZWFkeS1leGlzdGluZyBlbmRwb2ludE5hbWUgJHtlbmRwb2ludE5hbWV9IHdpdGhvdXQgc3BlY2lmeWluZyBcXGBvdmVycmlkZUV4aXN0aW5nOiB0cnVlXFxgYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJkZXZlbG9wbWVudFwiKSB7XG4gICAgICAgICAgaWYgKGlzSW5maW5pdGVRdWVyeURlZmluaXRpb24oZGVmaW5pdGlvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgaW5maW5pdGVRdWVyeU9wdGlvbnNcbiAgICAgICAgICAgIH0gPSBkZWZpbml0aW9uO1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBtYXhQYWdlcyxcbiAgICAgICAgICAgICAgZ2V0UHJldmlvdXNQYWdlUGFyYW06IGdldFByZXZpb3VzUGFnZVBhcmFtMlxuICAgICAgICAgICAgfSA9IGluZmluaXRlUXVlcnlPcHRpb25zO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtYXhQYWdlcyA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICBpZiAobWF4UGFnZXMgPCAxKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNDApIDogYG1heFBhZ2VzIGZvciBlbmRwb2ludCAnJHtlbmRwb2ludE5hbWV9JyBtdXN0IGJlIGEgbnVtYmVyIGdyZWF0ZXIgdGhhbiAwYCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBnZXRQcmV2aW91c1BhZ2VQYXJhbTIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDQxKSA6IGBnZXRQcmV2aW91c1BhZ2VQYXJhbSBmb3IgZW5kcG9pbnQgJyR7ZW5kcG9pbnROYW1lfScgbXVzdCBiZSBhIGZ1bmN0aW9uIGlmIG1heFBhZ2VzIGlzIHVzZWRgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmVuZHBvaW50RGVmaW5pdGlvbnNbZW5kcG9pbnROYW1lXSA9IGRlZmluaXRpb247XG4gICAgICAgIGZvciAoY29uc3QgbSBvZiBpbml0aWFsaXplZE1vZHVsZXMpIHtcbiAgICAgICAgICBtLmluamVjdEVuZHBvaW50KGVuZHBvaW50TmFtZSwgZGVmaW5pdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhcGk7XG4gICAgfVxuICAgIHJldHVybiBhcGkuaW5qZWN0RW5kcG9pbnRzKHtcbiAgICAgIGVuZHBvaW50czogb3B0aW9ucy5lbmRwb2ludHNcbiAgICB9KTtcbiAgfTtcbn1cbnZhciBfTkVWRVIgPSBTeW1ib2woKTtcbmZ1bmN0aW9uIGZ
3053ha2VCYXNlUXVlcnkoKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgzMykgOiBcIldoZW4gdXNpbmcgYGZha2VCYXNlUXVlcnlgLCBhbGwgcXVlcmllcyAmIG11dGF0aW9ucyBtdXN0IHVzZSB0aGUgYHF1ZXJ5Rm5gIGRlZmluaXRpb24gc3ludGF4LlwiKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGFzc2VydENhc3Qodikge1xufVxuZnVuY3Rpb24gc2FmZUFzc2lnbih0YXJnZXQsIC4uLmFyZ3MpIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24odGFyZ2V0LCAuLi5hcmdzKTtcbn1cbnZhciBidWlsZEJhdGNoZWRBY3Rpb25zSGFuZGxlciA9ICh7XG4gIGFwaSxcbiAgcXVlcnlUaHVuayxcbiAgaW50ZXJuYWxTdGF0ZSxcbiAgbXdBcGlcbn0pID0+IHtcbiAgY29uc3Qgc3Vic2NyaXB0aW9uc1ByZWZpeCA9IGAke2FwaS5yZWR1Y2VyUGF0aH0vc3Vic2NyaXB0aW9uc2A7XG4gIGxldCBwcmV2aW91c1N1YnNjcmlwdGlvbnMgPSBudWxsO1xuICBsZXQgdXBkYXRlU3luY1RpbWVyID0gbnVsbDtcbiAgY29uc3Qge1xuICAgIHVwZGF0ZVN1YnNjcmlwdGlvbk9wdGlvbnMsXG4gICAgdW5zdWJzY3JpYmVRdWVyeVJlc3VsdFxuICB9ID0gYXBpLmludGVybmFsQWN0aW9ucztcbiAgY29uc3QgYWN0dWFsbHlNdXRhdGVTdWJzY3JpcHRpb25zID0gKGN1cnJlbnRTdWJzY3JpcHRpb25zLCBhY3Rpb24pID0+IHtcbiAgICBpZiAodXBkYXRlU3Vic2NyaXB0aW9uT3B0aW9ucy5tYXRjaChhY3Rpb24pKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHF1ZXJ5Q2FjaGVLZXksXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgfSA9IGFjdGlvbi5wYXlsb2FkO1xuICAgICAgY29uc3Qgc3ViID0gY3VycmVudFN1YnNjcmlwdGlvbnMuZ2V0KHF1ZXJ5Q2FjaGVLZXkpO1xuICAgICAgaWYgKHN1YiA9PSBudWxsID8gdm9pZCAwIDogc3ViLmhhcyhyZXF1ZXN0SWQpKSB7XG4gICAgICAgIHN1Yi5zZXQocmVxdWVzdElkLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodW5zdWJzY3JpYmVRdWVyeVJlc3VsdC5tYXRjaChhY3Rpb24pKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHF1ZXJ5Q2FjaGVLZXksXG4gICAgICAgIHJlcXVlc3RJZFxuICAgICAgfSA9IGFjdGlvbi5wYXlsb2FkO1xuICAgICAgY29uc3Qgc3ViID0gY3VycmVudFN1YnNjcmlwdGlvbnMuZ2V0KHF1ZXJ5Q2FjaGVLZXkpO1xuICAgICAgaWYgKHN1Yikge1xuICAgICAgICBzdWIuZGVsZXRlKHJlcXVlc3RJZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGFwaS5pbnRlcm5hbEFjdGlvbnMucmVtb3ZlUXVlcnlSZXN1bHQubWF0Y2goYWN0aW9uKSkge1xuICAgICAgY3VycmVudFN1YnNjcmlwdGlvbnMuZGVsZXRlKGFjdGlvbi5wYXlsb2FkLnF1ZXJ5Q2FjaGVLZXkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChxdWVyeVRodW5rLnBlbmRpbmcubWF0Y2goYWN0aW9uKSkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgYXJnLFxuICAgICAgICAgIHJlcXVlc3RJZFxuICAgICAgICB9XG4gICAgICB9ID0gYWN0aW9uO1xuICAgICAgY29uc3Qgc3Vic3RhdGUgPSBnZXRPckluc2VydENvbXB1dGVkKGN1cnJlbnRTdWJzY3JpcHRpb25zLCBhcmcucXVlcnlDYWNoZUtleSwgY3JlYXRlTmV3TWFwKTtcbiAgICAgIGlmIChhcmcuc3Vic2NyaWJlKSB7XG4gICAgICAgIHN1YnN0YXRlLnNldChyZXF1ZXN0SWQsIGFyZy5zdWJzY3JpcHRpb25PcHRpb25zID8/IHN1YnN0YXRlLmdldChyZXF1ZXN0SWQpID8/IHt9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBsZXQgbXV0YXRlZCA9IGZhbHNlO1xuICAgIGlmIChxdWVyeVRodW5rLnJlamVjdGVkLm1hdGNoKGFjdGlvbikpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbWV0YToge1xuICAgICAgICAgIGNvbmRpdGlvbixcbiAgICAgICAgICBhcmcsXG4gICAgICAgICAgcmVxdWVzdElkXG4gICAgICAgIH1cbiAgICAgIH0gPSBhY3Rpb247XG4gICAgICBpZiAoY29uZGl0aW9uICYmIGFyZy5zdWJzY3JpYmUpIHtcbiAgICAgICAgY29uc3Qgc3Vic3RhdGUgPSBnZXRPckluc2VydENvbXB1dGVkKGN1cnJlbnRTdWJzY3JpcHRpb25zLCBhcmcucXVlcnlDYWNoZUtleSwgY3JlYXRlTmV3TWFwKTtcbiAgICAgICAgc3Vic3RhdGUuc2V0KHJlcXVlc3RJZCwgYXJnLnN1YnNjcmlwdGlvbk9wdGlvbnMgPz8gc3Vic3RhdGUuZ2V0KHJlcXVlc3RJZCkgPz8ge30pO1xuICAgICAgICBtdXRhdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG11dGF0ZWQ7XG4gIH07XG4gIGNvbnN0IGdldFN1YnNjcmlwdGlvbnMgPSAoKSA9PiBpbnRlcm5hbFN0YXRlLmN1cnJlbnRTdWJzY3JpcHRpb25zO1xuICBjb25zdCBnZXRTdWJzY3JpcHRpb25Db3VudCA9IChxdWVyeUNhY2hlS2V5KSA9PiB7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9ucyA9IGdldFN1YnNjcmlwdGlvbnMoKTtcbiAgICBjb25zdCBzdWJzY3JpcHRpb25zRm9yUXVlcnlBcmcgPSBzdWJzY3JpcHRpb25zLmdldChxdWVyeUNhY2hlS2V5KTtcbiAgICByZXR1cm4gKHN1YnNjcmlwdGlvbnNGb3JRdWVyeUFyZyA9PSBudWxsID8gdm9pZCAwIDogc3Vic2NyaXB0aW9uc0ZvclF1ZXJ5QXJnLnNpemUpID8/IDA7XG4gIH07XG4gIGNvbnN0IGlzUmVxdWVzdFN1YnNjcmliZWQgPSAocXVlcnlDYWNoZUtleSwgcmVxdWVzdElkKSA9PiB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IHN1YnNjcmlwdGlvbnMgPSBnZXRTdWJzY3JpcHRpb25zKCk7XG4gICAgcmV0dXJuICEhKChfYSA9IHN1YnNjcmlwdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IHN1YnNjcmlwdGlvbnMuZ2V0KHF1ZXJ5Q2FjaGVLZXkpKSA9PSBudWxsID8gdm9pZCAwIDogX2EuZ2V0KHJlcXVlc3RJZCkpO1xuICB9O1xuICBjb25zdCBzdWJzY3JpcHRpb25TZWxlY3RvcnMgPSB7XG4gICAgZ2V0U3Vic2NyaXB0aW9ucyxcbiAgICBnZXRTdWJzY3JpcHRpb25Db3VudCxcbiAgICBpc1JlcXVlc3RTdWJzY3JpYmVkXG4gIH07XG4gIGZ1bmN0aW9uIHNlcmlhbGl6ZVN1YnNjcmlwdGlvbnMoY3VycmVudFN1YnNjcmlwdGlvbnMpIHtcbiAgICByZXR1cm4gSl
3053NPTi5wYXJzZShKU09OLnN0cmluZ2lmeShPYmplY3QuZnJvbUVudHJpZXMoWy4uLmN1cnJlbnRTdWJzY3JpcHRpb25zXS5tYXAoKFtrLCB2XSkgPT4gW2ssIE9iamVjdC5mcm9tRW50cmllcyh2KV0pKSkpO1xuICB9XG4gIHJldHVybiAoYWN0aW9uLCBtd0FwaTIpID0+IHtcbiAgICBpZiAoIXByZXZpb3VzU3Vic2NyaXB0aW9ucykge1xuICAgICAgcHJldmlvdXNTdWJzY3JpcHRpb25zID0gc2VyaWFsaXplU3Vic2NyaXB0aW9ucyhpbnRlcm5hbFN0YXRlLmN1cnJlbnRTdWJzY3JpcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKGFwaS51dGlsLnJlc2V0QXBpU3RhdGUubWF0Y2goYWN0aW9uKSkge1xuICAgICAgcHJldmlvdXNTdWJzY3JpcHRpb25zID0ge307XG4gICAgICBpbnRlcm5hbFN0YXRlLmN1cnJlbnRTdWJzY3JpcHRpb25zLmNsZWFyKCk7XG4gICAgICB1cGRhdGVTeW5jVGltZXIgPSBudWxsO1xuICAgICAgcmV0dXJuIFt0cnVlLCBmYWxzZV07XG4gICAgfVxuICAgIGlmIChhcGkuaW50ZXJuYWxBY3Rpb25zLmludGVybmFsX2dldFJUS1FTdWJzY3JpcHRpb25zLm1hdGNoKGFjdGlvbikpIHtcbiAgICAgIHJldHVybiBbZmFsc2UsIHN1YnNjcmlwdGlvblNlbGVjdG9yc107XG4gICAgfVxuICAgIGNvbnN0IGRpZE11dGF0ZSA9IGFjdHVhbGx5TXV0YXRlU3Vic2NyaXB0aW9ucyhpbnRlcm5hbFN0YXRlLmN1cnJlbnRTdWJzY3JpcHRpb25zLCBhY3Rpb24pO1xuICAgIGxldCBhY3Rpb25TaG91bGRDb250aW51ZSA9IHRydWU7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIiAmJiB0eXBlb2YgYWN0aW9uLnR5cGUgPT09IFwic3RyaW5nXCIgJiYgYWN0aW9uLnR5cGUgPT09IGAke2FwaS5yZWR1Y2VyUGF0aH0vZ2V0UG9sbGluZ2ApIHtcbiAgICAgIHJldHVybiBbZmFsc2UsIGludGVybmFsU3RhdGUuY3VycmVudFBvbGxzXTtcbiAgICB9XG4gICAgaWYgKGRpZE11dGF0ZSkge1xuICAgICAgaWYgKCF1cGRhdGVTeW5jVGltZXIpIHtcbiAgICAgICAgdXBkYXRlU3luY1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgbmV3U3Vic2NyaXB0aW9ucyA9IHNlcmlhbGl6ZVN1YnNjcmlwdGlvbnMoaW50ZXJuYWxTdGF0ZS5jdXJyZW50U3Vic2NyaXB0aW9ucyk7XG4gICAgICAgICAgY29uc3QgWywgcGF0Y2hlc10gPSBwcm9kdWNlV2l0aFBhdGNoZXMocHJldmlvdXNTdWJzY3JpcHRpb25zLCAoKSA9PiBuZXdTdWJzY3JpcHRpb25zKTtcbiAgICAgICAgICBtd0FwaTIubmV4dChhcGkuaW50ZXJuYWxBY3Rpb25zLnN1YnNjcmlwdGlvbnNVcGRhdGVkKHBhdGNoZXMpKTtcbiAgICAgICAgICBwcmV2aW91c1N1YnNjcmlwdGlvbnMgPSBuZXdTdWJzY3JpcHRpb25zO1xuICAgICAgICAgIHVwZGF0ZVN5bmNUaW1lciA9IG51bGw7XG4gICAgICAgIH0sIDUwMCk7XG4gICAgICB9XG4gICAgICBjb25zdCBpc1N1YnNjcmlwdGlvblNsaWNlQWN0aW9uID0gdHlwZW9mIGFjdGlvbi50eXBlID09IFwic3RyaW5nXCIgJiYgISFhY3Rpb24udHlwZS5zdGFydHNXaXRoKHN1YnNjcmlwdGlvbnNQcmVmaXgpO1xuICAgICAgY29uc3QgaXNBZGRpdGlvbmFsU3Vic2NyaXB0aW9uQWN0aW9uID0gcXVlcnlUaHVuay5yZWplY3RlZC5tYXRjaChhY3Rpb24pICYmIGFjdGlvbi5tZXRhLmNvbmRpdGlvbiAmJiAhIWFjdGlvbi5tZXRhLmFyZy5zdWJzY3JpYmU7XG4gICAgICBhY3Rpb25TaG91bGRDb250aW51ZSA9ICFpc1N1YnNjcmlwdGlvblNsaWNlQWN0aW9uICYmICFpc0FkZGl0aW9uYWxTdWJzY3JpcHRpb25BY3Rpb247XG4gICAgfVxuICAgIHJldHVybiBbYWN0aW9uU2hvdWxkQ29udGludWUsIGZhbHNlXTtcbiAgfTtcbn07XG52YXIgVEhJUlRZX1RXT19CSVRfTUFYX1RJTUVSX1NFQ09ORFMgPSAyMTQ3NDgzNjQ3IC8gMWUzIC0gMTtcbnZhciBidWlsZENhY2hlQ29sbGVjdGlvbkhhbmRsZXIgPSAoe1xuICByZWR1Y2VyUGF0aCxcbiAgYXBpLFxuICBxdWVyeVRodW5rLFxuICBjb250ZXh0LFxuICBpbnRlcm5hbFN0YXRlLFxuICBzZWxlY3RvcnM6IHtcbiAgICBzZWxlY3RRdWVyeUVudHJ5LFxuICAgIHNlbGVjdENvbmZpZ1xuICB9LFxuICBnZXRSdW5uaW5nUXVlcnlUaHVuayxcbiAgbXdBcGlcbn0pID0+IHtcbiAgY29uc3Qge1xuICAgIHJlbW92ZVF1ZXJ5UmVzdWx0LFxuICAgIHVuc3Vic2NyaWJlUXVlcnlSZXN1bHQsXG4gICAgY2FjaGVFbnRyaWVzVXBzZXJ0ZWRcbiAgfSA9IGFwaS5pbnRlcm5hbEFjdGlvbnM7XG4gIGNvbnN0IGNhblRyaWdnZXJVbnN1YnNjcmliZSA9IGlzQW55T2YodW5zdWJzY3JpYmVRdWVyeVJlc3VsdC5tYXRjaCwgcXVlcnlUaHVuay5mdWxmaWxsZWQsIHF1ZXJ5VGh1bmsucmVqZWN0ZWQsIGNhY2hlRW50cmllc1Vwc2VydGVkLm1hdGNoKTtcbiAgZnVuY3Rpb24gYW55U3Vic2NyaXB0aW9uc1JlbWFpbmluZ0ZvcktleShxdWVyeUNhY2hlS2V5KSB7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9ucyA9IGludGVybmFsU3RhdGUuY3VycmVudFN1YnNjcmlwdGlvbnMuZ2V0KHF1ZXJ5Q2FjaGVLZXkpO1xuICAgIGlmICghc3Vic2NyaXB0aW9ucykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBoYXNTdWJzY3JpcHRpb25zID0gc3Vic2NyaXB0aW9ucy5zaXplID4gMDtcbiAgICByZXR1cm4gaGFzU3Vic2NyaXB0aW9ucztcbiAgfVxuICBjb25zdCBjdXJyZW50UmVtb3ZhbFRpbWVvdXRzID0ge307XG4gIGZ1bmN0aW9uIGFib3J0QWxsUHJvbWlzZXMocHJvbWlzZU1hcCkge1xuICAgIHZhciBfYTtcbiAgICBmb3IgKGNvbnN0IHByb21pc2Ugb2YgcHJvbWlzZU1hcC52YWx1ZXMoKSkge1xuICAgICAgKF9hID0gcHJvbWlzZSA9PSBudWxsID8gdm9pZCAwIDogcHJvbWlzZS5hYm9ydCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLmNhbGwocHJvbWlzZSk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGhhbmRsZXIgPSAoYWN0aW9uLCBtd0FwaTIpID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IG13QXBpMi5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHNlbGVjdENvbmZpZyhzdGF0ZSk7XG4gICAgaWYgKGNhblRyaWdnZXJVbnN1YnNjcmliZShhY3Rpb24pKSB7XG4gICAgICBsZXQgcXVlcnlDYWNoZUtleXM7XG4gICAgICBpZiAoY2FjaGVFbnRyaWVzVXBzZXJ0ZWQubWF0Y2goYWN0aW9uKSkge1xuICAgICAgICBxdWVyeUNhY2hlS2V5cyA9IGFjdGlvbi5wYXlsb2FkLm1hcCgoZW50cnkpID0+IGVudHJ5LnF1ZXJ5RGVzY3JpcHRpb24ucXVlcnlDYWNoZUtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgcXVlcnlDYWNoZUtleVxuICAgICAgICB9ID0gdW5zdWJzY3JpYmVRdWVyeVJlc3VsdC5tYXRjaChhY3Rpb24pID8gYWN0aW9uLnBheWxvYWQgOiBhY3Rpb24ubWV0YS5hcmc7XG4gICAgICAgI
3053HF1ZXJ5Q2FjaGVLZXlzID0gW3F1ZXJ5Q2FjaGVLZXldO1xuICAgICAgfVxuICAgICAgaGFuZGxlVW5zdWJzY3JpYmVNYW55KHF1ZXJ5Q2FjaGVLZXlzLCBtd0FwaTIsIGNvbmZpZyk7XG4gICAgfVxuICAgIGlmIChhcGkudXRpbC5yZXNldEFwaVN0YXRlLm1hdGNoKGFjdGlvbikpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdGltZW91dF0gb2YgT2JqZWN0LmVudHJpZXMoY3VycmVudFJlbW92YWxUaW1lb3V0cykpIHtcbiAgICAgICAgaWYgKHRpbWVvdXQpIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgZGVsZXRlIGN1cnJlbnRSZW1vdmFsVGltZW91dHNba2V5XTtcbiAgICAgIH1cbiAgICAgIGFib3J0QWxsUHJvbWlzZXMoaW50ZXJuYWxTdGF0ZS5ydW5uaW5nUXVlcmllcyk7XG4gICAgICBhYm9ydEFsbFByb21pc2VzKGludGVybmFsU3RhdGUucnVubmluZ011dGF0aW9ucyk7XG4gICAgfVxuICAgIGlmIChjb250ZXh0Lmhhc1JlaHlkcmF0aW9uSW5mbyhhY3Rpb24pKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHF1ZXJpZXNcbiAgICAgIH0gPSBjb250ZXh0LmV4dHJhY3RSZWh5ZHJhdGlvbkluZm8oYWN0aW9uKTtcbiAgICAgIGhhbmRsZVVuc3Vic2NyaWJlTWFueShPYmplY3Qua2V5cyhxdWVyaWVzKSwgbXdBcGkyLCBjb25maWcpO1xuICAgIH1cbiAgfTtcbiAgZnVuY3Rpb24gaGFuZGxlVW5zdWJzY3JpYmVNYW55KGNhY2hlS2V5cywgYXBpMiwgY29uZmlnKSB7XG4gICAgY29uc3Qgc3RhdGUgPSBhcGkyLmdldFN0YXRlKCk7XG4gICAgZm9yIChjb25zdCB
3053xdWVyeUNhY2hlS2V5IG9mIGNhY2hlS2V5cykge1xuICAgICAgY29uc3QgZW50cnkgPSBzZWxlY3RRdWVyeUVudHJ5KHN0YXRlLCBxdWVyeUNhY2hlS2V5KTtcbiAgICAgIGlmIChlbnRyeSA9PSBudWxsID8gdm9pZCAwIDogZW50cnkuZW5kcG9pbnROYW1lKSB7XG4gICAgICAgIGhhbmRsZVVuc3Vic2NyaWJlKHF1ZXJ5Q2FjaGVLZXksIGVudHJ5LmVuZHBvaW50TmFtZSwgYXBpMiwgY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gaGFuZGxlVW5zdWJzY3JpYmUocXVlcnlDYWNoZUtleSwgZW5kcG9pbnROYW1lLCBhcGkyLCBjb25maWcpIHtcbiAgICBjb25zdCBlbmRwb2ludERlZmluaXRpb24gPSBnZXRFbmRwb2ludERlZmluaXRpb24oY29udGV4dCwgZW5kcG9pbnROYW1lKTtcbiAgICBjb25zdCBrZWVwVW51c2VkRGF0YUZvciA9IChlbmRwb2ludERlZmluaXRpb24gPT0gbnVsbCA/IHZvaWQgMCA6IGVuZHBvaW50RGVmaW5pdGlvbi5rZWVwVW51c2VkRGF0YUZvcikgPz8gY29uZmlnLmtlZXBVbnVzZWREYXRhRm9yO1xuICAgIGlmIChrZWVwVW51c2VkRGF0YUZvciA9PT0gSW5maW5pdHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZmluYWxLZWVwVW51c2VkRGF0YUZvciA9IE1hdGgubWF4KDAsIE1hdGgubWluKGtlZXBVbnVzZWREYXRhRm9yLCBUSElSVFlfVFdPX0JJVF9NQVhfVElNRVJfU0VDT05EUykpO1xuICAgIGlmICghYW55U3Vic2NyaXB0aW9uc1JlbWFpbmluZ0ZvcktleShxdWVyeUNhY2hlS2V5KSkge1xuICAgICAgY29uc3QgY3VycmVudFRpbWVvdXQgPSBjdXJyZW50UmVtb3ZhbFRpbWVvdXRzW3F1ZXJ5Q2FjaGVLZXldO1xuICAgICAgaWYgKGN1cnJlbnRUaW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dChjdXJyZW50VGltZW91dCk7XG4gICAgICB9XG4gICAgICBjdXJyZW50UmVtb3ZhbFRpbWVvdXRzW3F1ZXJ5Q2FjaGVLZXldID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICghYW55U3Vic2NyaXB0aW9uc1JlbWFpbmluZ0ZvcktleShxdWVyeUNhY2hlS2V5KSkge1xuICAgICAgICAgIGNvbnN0IGVudHJ5ID0gc2VsZWN0UXVlcnlFbnRyeShhcGkyLmdldFN0YXRlKCksIHF1ZXJ5Q2FjaGVLZXkpO1xuICAgICAgICAgIGlmIChlbnRyeSA9PSBudWxsID8gdm9pZCAwIDogZW50cnkuZW5kcG9pbnROYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBydW5uaW5nUXVlcnkgPSBhcGkyLmRpc3BhdGNoKGdldFJ1bm5pbmdRdWVyeVRodW5rKGVudHJ5LmVuZHBvaW50TmFtZSwgZW50cnkub3JpZ2luYWxBcmdzKSk7XG4gICAgICAgICAgICBydW5uaW5nUXVlcnkgPT0gbnVsbCA/IHZvaWQgMCA6IHJ1bm5pbmdRdWVyeS5hYm9ydCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhcGkyLmRpc3BhdGNoKHJlbW92ZVF1ZXJ5UmVzdWx0KHtcbiAgICAgICAgICAgIHF1ZXJ5Q2FjaGVLZXlcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIGN1cnJlbnRSZW1vdmFsVGltZW91dHNbcXVlcnlDYWNoZUtleV07XG4gICAgICB9LCBmaW5hbEtlZXBVbnVzZWREYXRhRm9yICogMWUzKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGhhbmRsZXI7XG59O1xudmFyIG5ldmVyUmVzb2x2ZWRFcnJvciA9IG5ldyBFcnJvcihcIlByb21pc2UgbmV2ZXIgcmVzb2x2ZWQgYmVmb3JlIGNhY2hlRW50cnlSZW1vdmVkLlwiKTtcbnZhciBidWlsZENhY2hlTGlmZWN5Y2xlSGFuZGxlciA9ICh7XG4gIGFwaSxcbiAgcmVkdWNlclBhdGgsXG4gIGNvbnRleHQsXG4gIHF1ZXJ5VGh1bmssXG4gIG11dGF0aW9uVGh1bmssXG4gIGludGVybmFsU3RhdGUsXG4gIHNlbGVjdG9yczoge1xuICAgIHNlbGVjdFF1ZXJ5RW50cnksXG4gICAgc2VsZWN0QXBpU3RhdGVcbiAgfVxufSkgPT4ge1xuICBjb25zdCBpc1F1ZXJ5VGh1bmsgPSBpc0FzeW5jVGh1bmtBY3Rpb24ocXVlcnlUaHVuayk7XG4gIGNvbnN0IGlzTXV0YXRpb25UaHVuayA9IGlzQXN5bmNUaHVua0FjdGlvbihtdXRhdGlvblRodW5rKTtcbiAgY29uc3QgaXNGdWxmaWxsZWRUaHVuayA9IGlzRnVsZmlsbGVkKHF1ZXJ5VGh1bmssIG11dGF0aW9uVGh1bmspO1xuICBjb25zdCBsaWZlY3ljbGVNYXAgPSB7fTtcbiAgY29uc3Qge1xuICAgIHJlbW92ZVF1ZXJ5UmVzdWx0LFxuICAgIHJlbW92ZU11dGF0aW9uUmVzdWx0LFxuICAgIGNhY2hlRW50cmllc1Vwc2VydGVkXG4gIH0gPSBhcGkuaW50ZXJuYWxBY3Rpb25zO1xuICBmdW5jdGlvbiByZXNvbHZlTGlmZWN5Y2xlRW50cnkoY2FjaGVLZXksIGRhdGEsIG1ldGEpIHtcbiAgICBjb25zdCBsaWZlY3ljbGUgPSBsaWZlY3ljbGVNYXBbY2FjaGVLZXldO1xuICAgIGlmIChsaWZlY3ljbGUgPT0gbnVsbCA/IHZvaWQgMCA6IGxpZmVjeWNsZS52YWx1ZVJlc29sdmVkKSB7XG4gICAgICBsaWZlY3ljbGUudmFsdWVSZXNvbHZlZCh7XG4gICAgICAgIGRhdGEsXG4gICAgICAgIG1ldGFcbiAgICAgIH0pO1xuICAgICAgZGVsZXRlIGxpZmVjeWNsZS52YWx1ZVJlc29sdmVkO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiByZW1vdmVMaWZlY3ljbGVFbnRyeShjYWNoZUtleSkge1xuICAgIGNvbnN0IGxpZmVjeWNsZSA9IGxpZmVjeWNsZU1hcFtjYWNoZUtleV07XG4gICAgaWYgKGxpZmVjeWNsZSkge1xuICAgICAgZGVsZXRlIGxpZmVjeWNsZU1hcFtjYWNoZUtleV07XG4gICAgICBsaWZlY3ljbGUuY2FjaGVFbnRyeVJlbW92ZWQoKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZ2V0QWN0aW9uTWV0YUZpZWxkcyhhY3Rpb24pIHtcbiAgICBjb25zdCB7XG4gICAgICBhcmcsXG4gICAgICByZXF1ZXN0SWRcbiAgICB9ID0gYWN0aW9uLm1ldGE7XG4gICAgY29uc3Qge1xuICAgICAgZW5kcG9pbnROYW1lLFxuICAgICAgb3JpZ2luYWxBcmdzXG4gICAgfSA9IGFyZztcbiAgICByZXR1cm4gW2VuZHBvaW50TmFtZSwgb3JpZ2luYWxBcmdzLCByZXF1ZXN0SWRdO1xuICB9XG4gIGNvbnN0IGhhbmRsZXIgPSAoYWN0aW9uLCBtd0FwaSwgc3RhdGVCZWZvcmUpID0+IHtcbiAgICBjb25zdCBjYWNoZUtleSA9IGdldENhY2hlS2V5KGFjdGlvbik7XG4gICAgZnVuY3Rpb24gY2hlY2tGb3JOZXdDYWNoZUtleShlbmRwb2ludE5hbWUsIGNhY2hlS2V5MiwgcmVxdWVzdElkLCBvcmlnaW5hbEFyZ3MpIHtcbiAgICAgIGNvbnN0IG9sZEVudHJ5ID0gc2VsZWN0UXVlcnlFbnRyeShzdGF0ZUJlZm9yZSwgY2FjaGVLZXkyKTtcbiAgICAgIGNvbnN0IG5ld0VudHJ5ID0gc2VsZWN0UXVlcnlFbnRyeShtd0FwaS5nZXRTdGF0ZSgpLCBjYWNoZUtleTIpO1xuICAgICAgaWYgKCFvbGRFbnRyeSAmJiBuZXdFbnRyeSkge1xuICAgICAgICBoYW5kbGVOZXdLZXkoZW5kcG9pbnROYW1lLCBvcmlnaW5hbEFyZ3MsIGNhY2hlS2V5MiwgbXdBcGksIHJlcXVlc3RJZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChxdWVyeVRodW5rLnBlbmRpbmcubWF0Y2goYWN0aW9uKSkge1xuICAgICAgY29uc3QgW2VuZHBvaW50TmFtZSwgb3JpZ2luYWxBcmdzLCByZXF1ZXN0SWRdID0gZ2V0QWN0aW9uTWV0YUZpZWxkcyhhY3Rpb24pO1xuICAgICAgY2hlY2tGb3JOZXdDYWNoZUtleShlbmRwb2ludE5hbWUsIGNhY2hlS2V5LCByZXF1ZXN0SWQsIG9yaWdpbmFsQXJncyk7XG4gICAgfSBlbHNlIGlmIChjYWNoZUVudHJpZXNVcHNlcnRlZC5tYXRjaChhY3Rpb24pKSB7XG4gICAgICBmb3IgKGNvbnN0IHtcbiAgICAgICAgcXVlcnlEZXNjcmlwdGlvbixcbiAgICAgICAgdmFsdWVcbiAgICAgIH0gb2YgYWN0aW9uLnBheWxvYWQpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGVuZHBvaW50TmFtZSxcbiAgICAgICAgICBvcmlnaW5hbEFyZ3MsXG4gICAgICAgICAgcXVlcnlDYWNoZUtleVxuICAgICAgICB9ID0gcXVlcnlEZXNjcmlwdGlvbjtcbiAgICAgICAgY2hlY2tGb3JOZXdDYWNoZUtleShlbmRwb2ludE5hbWUsIHF1ZXJ5Q2FjaGVLZXksIGFjdGlvbi5tZXRhLnJlcXVlc3RJZCwgb3JpZ2luYWxBcmdzKTtcbiAgICAgICAgcmVzb2x2ZUxpZmVjeWNsZUVudHJ5KHF1ZXJ5Q2FjaGVLZXksIHZhbHVlLCB7fSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChtdXRhdGlvblRodW5rLnBlbmRpbmcubWF0Y2goYWN0aW9uKSkge1xuICAgICAgY29uc3Qgc3RhdGUgPSBtd0FwaS5nZXRTdGF0ZSgpW3JlZHVjZXJQYXRoXS5tdXRhdGlvbnNbY2FjaGVLZXldO1xuICAgICAgaWYgKHN0YXRl
3053KSB7XG4gICAgICAgIGNvbnN0IFtlbmRwb2ludE5hbWUsIG9yaWdpbmFsQXJncywgcmVxdWVzdElkXSA9IGdldEFjdGlvbk1ldGFGaWVsZHMoYWN0aW9uKTtcbiAgICAgICAgaGFuZGxlTmV3S2V5KGVuZHBvaW50TmFtZSwgb3JpZ2luYWxBcmdzLCBjYWNoZUtleSwgbXdBcGksIHJlcXVlc3RJZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0Z1bGZpbGxlZFRodW5rKGFjdGlvbikpIHtcbiAgICAgIHJlc29sdmVMaWZlY3ljbGVFbnRyeShjYWNoZUtleSwgYWN0aW9uLnBheWxvYWQsIGFjdGlvbi5tZXRhLmJhc2VRdWVyeU1ldGEpO1xuICAgIH0gZWxzZSBpZiAocmVtb3ZlUXVlcnlSZXN1bHQubWF0Y2goYWN0aW9uKSB8fCByZW1vdmVNdXRhdGlvblJlc3VsdC5tYXRjaChhY3Rpb24pKSB7XG4gICAgICByZW1vdmVMaWZlY3ljbGVFbnRyeShjYWNoZUtleSk7XG4gICAgfSBlbHNlIGlmIChhcGkudXRpbC5yZXNldEFwaVN0YXRlLm1hdGNoKGFjdGlvbikpIHtcbiAgICAgIGZvciAoY29uc3QgY2FjaGVLZXkyIG9mIE9iamVjdC5rZXlzKGxpZmVjeWNsZU1hcCkpIHtcbiAgICAgICAgcmVtb3ZlTGlmZWN5Y2xlRW50cnkoY2FjaGVLZXkyKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGZ1bmN0aW9uIGdldENhY2hlS2V5KGFjdGlvbikge1xuICAgIGlmIChpc1F1ZXJ5VGh1bmsoYWN0aW9uKSkgcmV0dXJuIGFjdGlvbi5tZXRhLmFyZy5xdWVyeUNhY2hlS2V5O1xuICAgIGlmIChpc011dGF0aW9uVGh1bmsoYWN0aW9uKSkge1xuICAgICAgcmV0dXJuIGFjdGlvbi5tZXRhLmFyZy5maXhlZENhY2hlS2V5ID8/IGFjdGlvbi5tZXRhLnJlcXVlc3RJZDtcbiAgICB9XG4gICAgaWYgKHJlbW92ZVF1ZXJ5UmVzdWx0Lm1hdGNoKGFjdGlvbikpIHJldHVybiBhY3Rpb24ucGF5bG9hZC5xdWVyeUNhY2hlS2V5O1xuICAgIGlmIChyZW1vdmVNdXRhdGlvblJlc3VsdC5tYXRjaChhY3Rpb24pKSByZXR1cm4gZ2V0TXV0YXRpb25DYWNoZUtleShhY3Rpb24ucGF5bG9hZCk7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbiAgZnVuY3Rpb24gaGFuZGxlTmV3S2V5KGVuZHBvaW50TmFtZSwgb3JpZ2luYWxBcmdzLCBxdWVyeUNhY2hlS2V5LCBtd0FwaSwgcmVxdWVzdElkKSB7XG4gICAgY29uc3QgZW5kcG9pbnREZWZpbml0aW9uID0gZ2V0RW5kcG9pbnREZWZpbml0aW9uKGNvbnRleHQsIGVuZHBvaW50TmFtZSk7XG4gICAgY29uc3Qgb25DYWNoZUVudHJ5QWRkZWQgPSBlbmRwb2ludERlZmluaXRpb24gPT0gbnVsbCA/IHZvaWQgMCA6IGVuZHBvaW50RGVmaW5pdGlvbi5vbkNhY2hlRW50cnlBZGRlZDtcbiAgICBpZiAoIW9uQ2FjaGVFbnRyeUFkZGVkKSByZXR1cm47XG4gICAgY29uc3QgbGlmZWN5Y2xlID0ge307XG4gICAgY29uc3QgY2FjaGVFbnRyeVJlbW92ZWQgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgbGlmZWN5Y2xlLmNhY2hlRW50cnlSZW1vdmVkID0gcmVzb2x2ZTtcbiAgICB9KTtcbiAgICBjb25zdCBjYWNoZURhdGFMb2FkZWQgPSBQcm9taXNlLnJhY2UoW25ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBsaWZlY3ljbGUudmFsdWVSZXNvbHZlZCA9IHJlc29sdmU7XG4gICAgfSksIGNhY2hlRW50cnlSZW1vdmVkLnRoZW4oKCkgPT4ge1xuICAgICAgdGhyb3cgbmV2ZXJSZXNvbHZlZEVycm9yO1xuICAgIH0pXSk7XG4gICAgY2FjaGVEYXRhTG9hZGVkLmNhdGNoKCgpID0+IHtcbiAgICB9KTtcbiAgICBsaWZlY3ljbGVNYXBbcXVlcnlDYWNoZUtleV0gPSBsaWZlY3ljbGU7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBhcGkuZW5kcG9pbnRzW2VuZHBvaW50TmFtZV0uc2VsZWN0KGlzQW55UXVlcnlEZWZpbml0aW9uKGVuZHBvaW50RGVmaW5pdGlvbikgPyBvcmlnaW5hbEFyZ3MgOiBxdWVyeUNhY2hlS2V5KTtcbiAgICBjb25zdCBleHRyYSA9IG13QXBpLmRpc3BhdGNoKChfLCBfXywgZXh0cmEyKSA9PiBleHRyYTIpO1xuICAgIGNvbnN0IGxpZmVjeWNsZUFwaSA9IHtcbiAgICAgIC4uLm13QXBpLFxuICAgICAgZ2V0Q2FjaGVFbnRyeTogKCkgPT4gc2VsZWN0b3IobXdBcGkuZ2V0U3RhdGUoKSksXG4gICAgICByZXF1ZXN0SWQsXG4gICAgICBleHRyYSxcbiAgICAgIHVwZGF0ZUNhY2hlZERhdGE6IGlzQW55UXVlcnlEZWZpbml0aW9uKGVuZHBvaW50RGVmaW5pdGlvbikgPyAodXBkYXRlUmVjaXBlKSA9PiBtd0FwaS5kaXNwYXRjaChhcGkudXRpbC51cGRhdGVRdWVyeURhdGEoZW5kcG9pbnROYW1lLCBvcmlnaW5hbEFyZ3MsIHVwZGF0ZVJlY2lwZSkpIDogdm9pZCAwLFxuICAgICAgY2FjaGVEYXRhTG9hZGVkLFxuICAgICAgY2FjaGVFbnRyeVJlbW92ZWRcbiAgICB9O1xuICAgIGNvbnN0IHJ1bm5pbmdIYW5kbGVyID0gb25DYWNoZUVudHJ5QWRkZWQob3JpZ2luYWxBcmdzLCBsaWZlY3ljbGVBcGkpO1xuICAgIFByb21pc2UucmVzb2x2ZShydW5uaW5nSGFuZGxlcikuY2F0Y2goKGUpID0+IHtcbiAgICAgIGlmIChlID09PSBuZXZlclJlc29sdmVkRXJyb3IpIHJldHVybjtcbiAgICAgIHRocm93IGU7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGhhbmRsZXI7XG59O1xudmFyIGJ1aWxkRGV2Q2hlY2tIYW5kbGVyID0gKHtcbiAgYXBpLFxuICBjb250ZXh0OiB7XG4gICAgYXBpVWlkXG4gIH0sXG4gIHJlZHVjZXJQYXRoXG59KSA9PiB7XG4gIHJldHVybiAoYWN0aW9uLCBtd0FwaSkgPT4ge1xuICAgIHZhciBfYSwgX2I7XG4gICAgaWYgKGFwaS51dGlsLnJlc2V0QXBpU3RhdGUubWF0Y2goYWN0aW9uKSkge1xuICAgICAgbXdBcGkuZGlzcGF0Y2goYXBpLmludGVybmFsQWN0aW9ucy5taWRkbGV3YXJlUmVnaXN0ZXJlZChhcGlVaWQpKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHtcbiAgICAgIGlmIChhcGkuaW50ZXJuYWxBY3Rpb25zLm1pZGRsZXdhcmVSZWdpc3RlcmVkLm1hdGNoKGFjdGlvbikgJiYgYWN0aW9uLnBheWxvYWQgPT09IGFwaVVpZCAmJiAoKF9iID0gKF9hID0gbXdBcGkuZ2V0U3RhdGUoKVtyZWR1Y2VyUGF0aF0pID09IG51bGwgPyB2b2lkIDAgOiBfYS5jb25maWcpID09IG51bGwgPyB2b2lkIDAgOiBfYi5taWRkbGV3YXJlUmVnaXN0ZXJlZCkgPT09IFwiY29uZmxpY3RcIikge1xuICAgICAgICBjb25zb2xlLndhcm4oYFRoZXJlIGlzIGEgbWlzbWF0Y2ggYmV0d2VlbiBzbGljZSBhbmQgbWlkZGxld2FyZSBmb3IgdGhlIHJlZHVjZXJQYXRoIFwiJHtyZWR1Y2VyUGF0aH1cIi5cbllvdSBjYW4gb25seSBoYXZlIG9uZSBhcGkgcGVyIHJlZHVjZXIgcGF0aCwgdGhpcyB3aWxsIGxlYWQgdG8gY3Jhc2hlcyBpbiB2YXJpb3VzIHNpdHVhdGlvbnMhJHtyZWR1Y2VyUGF0aCA9PT0gXCJhcGlcIiA/IGBcbklmIHlvdSBoYXZlIG11bHRpcGxlIGFwaXMsIHlvdSAqaGF2ZSogdG8gc3BlY2lmeSB0aGUgcmVkdWNlclBhdGggb3B0aW9uIHdoZW4gdXNpbmcgY3JlYXRlQXBpIWAgOiBcIlwifWApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG52YXIgYnVpbGRJbnZhbGlkYXRpb25CeVRhZ3NIYW5kbGVyID0gKHtcbiAgcmVkdWNlclBhdGgsXG4gIGNvbnRleHQsXG4gIGNvbnRleHQ6IHtcbiAgICBlbmRwb2ludERlZmluaXRpb25zXG4gIH0sXG4gIG11dGF0aW9uVGh1bmssXG4gIHF1ZXJ5VGh1bmssXG4gIGFwaSxcbiAgYXNzZXJ0VGFnVHlwZSxcbiAgcmVmZXRjaFF1ZXJ5LFxuICBpbnRlcm5hbFN0YXRlXG59KSA9PiB7XG4gIGNvbnN0IHtcbiAgICByZW1vdmVRdWVyeVJlc3VsdFxuICB9ID0gYXBpLmludGVybmFsQWN0aW9ucztcbiAgY29uc3QgaXNUaHVua0FjdGlvbldpdGhUYWdzID0gaXNBbnlPZihpc0Z1bGZpbGxlZChtdXRhdGlvblRodW5rKSwgaXNSZWplY3RlZFdpdGhWYWx1ZShtdXRhdGlvblRodW5rKSk7XG4gIGNvbnN0IGlzUXVlcnlFbmQgPSBpc0FueU9mKGlzRnVsZmlsbGVkKHF1ZXJ5VGh1bmssIG11dGF0aW9uVGh1bmspLCBpc1JlamVjdGVkK
3053HF1ZXJ5VGh1bmssIG11dGF0aW9uVGh1bmspKTtcbiAgbGV0IHBlbmRpbmdUYWdJbnZhbGlkYXRpb25zID0gW107XG4gIGxldCBwZW5kaW5nUmVxdWVzdENvdW50ID0gMDtcbiAgY29uc3QgaGFuZGxlciA9IChhY3Rpb24sIG13QXBpKSA9PiB7XG4gICAgaWYgKHF1ZXJ5VGh1bmsucGVuZGluZy5tYXRjaChhY3Rpb24pIHx8IG11dGF0aW9uVGh1bmsucGVuZGluZy5tYXRjaChhY3Rpb24pKSB7XG4gICAgICBwZW5kaW5nUmVxdWVzdENvdW50Kys7XG4gICAgfVxuICAgIGlmIChpc1F1ZXJ5RW5kKGFjdGlvbikpIHtcbiAgICAgIHBlbmRpbmdSZXF1ZXN0Q291bnQgPSBNYXRoLm1heCgwLCBwZW5kaW5nUmVxdWVzdENvdW50IC0gMSk7XG4gICAgfVxuICAgIGlmIChpc1RodW5rQWN0aW9uV2l0aFRhZ3MoYWN0aW9uKSkge1xuICAgICAgaW52YWxpZGF0ZVRhZ3MoY2FsY3VsYXRlUHJvdmlkZWRCeVRodW5rKGFjdGlvbiwgXCJpbnZhbGlkYXRlc1RhZ3NcIiwgZW5kcG9pbnREZWZpbml0aW9ucywgYXNzZXJ0VGFnVHlwZSksIG13QXBpKTtcbiAgICB9IGVsc2UgaWYgKGlzUXVlcnlFbmQoYWN0aW9uKSkge1xuICAgICAgaW52YWxpZGF0ZVRhZ3MoW10sIG13QXBpKTtcbiAgICB9IGVsc2UgaWYgKGFwaS51dGlsLmludmFsaWRhdGVUYWdzLm1hdGNoKGFjdGlvbikpIHtcbiAgICAgIGludmFsaWRhdGVUYWdzKGNhbGN1bGF0ZVByb3ZpZGVkQnkoYWN0aW9uLnBheWxvYWQsIHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgYXNzZXJ0VGFnVHlwZSksIG13QXBpKTtcbiAgICB9XG4gIH07XG4gIGZ1bmN0aW9uIGhhc1BlbmRpbmdSZXF1ZXN0cygpIHtcbiAgICByZXR1cm4gcGVuZGluZ1JlcXVlc3RDb3VudCA+IDA7XG4gIH1cbiAgZnVuY3Rpb24gaW52YWxpZGF0ZVRhZ3MobmV3VGFncywgbXdBcGkpIHtcbiAgICBjb25zdCByb290U3RhdGUgPSBtd0FwaS5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IHN0YXRlID0gcm9vdFN0YXRlW3JlZHVjZXJQYXRoXTtcbiAgICBwZW5kaW5nVGFnSW52YWxpZGF0aW9ucy5wdXNoKC4uLm5ld1RhZ3MpO1xuICAgIGlmIChzdGF0ZS5jb25maWcuaW52YWxpZGF0aW9uQmVoYXZpb3IgPT09IFwiZGVsYXllZFwiICYmIGhhc1BlbmRpbmdSZXF1ZXN0cygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRhZ3MgPSBwZW5kaW5nVGFnSW52YWxpZGF0aW9ucztcbiAgICBwZW5kaW5nVGFnSW52YWxpZGF0aW9ucyA9IFtdO1xuICAgIGlmICh0YWdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IHRvSW52YWxpZGF0ZSA9IGFwaS51dGlsLnNlbGVjdEludmFsaWRhdGVkQnkocm9vdFN0YXRlLCB0YWdzKTtcbiAgICBjb250ZXh0LmJhdGNoKCgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlc0FycmF5ID0gQXJyYXkuZnJvbSh0b0ludmFsaWRhdGUudmFsdWVzKCkpO1xuICAgICAgZm9yIChjb25zdCB7XG4gICAgICAgIHF1ZXJ5Q2FjaGVLZXlcbiAgICAgIH0gb2YgdmFsdWVzQXJyYXkpIHtcbiAgICAgICAgY29uc3QgcXVlcnlTdWJTdGF0ZSA9IHN0YXRlLnF1ZXJpZXNbcXVlcnlDYWNoZUtleV07XG4gICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvblN1YlN0YXRlID0gZ2V0T3JJbnNlcnRDb21wdXRlZChpbnRlcm5hbFN0YXRlLmN1cnJlbnRTdWJzY3JpcHRpb25zLCBxdWVyeUNhY2hlS2V5LCBjcmVhdGVOZXdNYXApO1xuICAgICAgICBpZiAocXVlcnlTdWJTdGF0ZSkge1xuICAgICAgICAgIGlmIChzdWJzY3JpcHRpb25TdWJTdGF0ZS5zaXplID09PSAwKSB7XG4gICAgICAgICAgICBtd0FwaS5kaXNwYXRjaChyZW1vdmVRdWVyeVJlc3VsdCh7XG4gICAgICAgICAgICAgIHF1ZXJ5Q2FjaGVLZXlcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHF1ZXJ5U3ViU3RhdGUuc3RhdHVzICE9PSBTVEFUVVNfVU5JTklUSUFMSVpFRCkge1xuICAgICAgICAgICAgbXdBcGkuZGlzcGF0Y2gocmVmZXRjaFF1ZXJ5KHF1ZXJ5U3ViU3RhdGUpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gaGFuZGxlcjtcbn07XG52YXIgYnVpbGRQb2xsaW5nSGFuZGxlciA9ICh7XG4gIHJlZHVjZXJQYXRoLFxuICBxdWVyeVRodW5rLFxuICBhcGksXG4gIHJlZmV0Y2hRdWVyeSxcbiAgaW50ZXJuYWxTdGF0ZVxufSkgPT4ge1xuICBjb25zdCB7XG4gICAgY3VycmVudFBvbGxzLFxuICAgIGN1cnJlbnRTdWJzY3JpcHRpb25zXG4gIH0gPSBpbnRlcm5hbFN0YXRlO1xuICBjb25zdCBwZW5kaW5nUG9sbGluZ1VwZGF0ZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICBsZXQgcG9sbGluZ1VwZGF0ZVRpbWVyID0gbnVsbDtcbiAgY29uc3QgaGFuZGxlciA9IChhY3Rpb24sIG13QXBpKSA9PiB7XG4gICAgaWYgKGFwaS5pbnRlcm5hbEFjdGlvbnMudXBkYXRlU3Vic2NyaXB0aW9uT3B0aW9ucy5tYXRjaChhY3Rpb24pIHx8IGFwaS5pbnRlcm5hbEFjdGlvbnMudW5zdWJzY3JpYmVRdWVyeVJlc3VsdC5tYXRjaChhY3Rpb24pKSB7XG4gICAgICBzY2hlZHVsZVBvbGxpbmdVcGRhdGUoYWN0aW9uLnBheWxvYWQucXVlcnlDYWNoZUtleSwgbXdBcGkpO1xuICAgIH1cbiAgICBpZiAocXVlcnlUaHVuay5wZW5kaW5nLm1hdGNoKGFjdGlvbikgfHwgcXVlcnlUaHVuay5yZWplY3RlZC5tYXRjaChhY3Rpb24pICYmIGFjdGlvbi5tZXRhLmNvbmRpdGlvbikge1xuICAgICAgc2NoZWR1bGVQb2xsaW5nVXBkYXRlKGFjdGlvbi5tZXRhLmFyZy5xdWVyeUNhY2hlS2V5LCBtd0FwaSk7XG4gICAgfVxuICAgIGlmIChxdWVyeVRodW5rLmZ1bGZpbGxlZC5tYXRjaChhY3Rpb24pIHx8IHF1ZXJ5VGh1bmsucmVqZWN0ZWQubWF0Y2goYWN0aW9uKSAmJiAhYWN0aW9uLm1ldGEuY29uZGl0aW9uKSB7XG4gICAgICBzdGFydE5leHRQb2xsKGFjdGlvbi5tZXRhLmFyZywgbXdBcGkpO1xuICAgIH1cbiAgICBpZiAoYXBpLnV0aWwucmVzZXRBcGlTdGF0ZS5tYXRjaChhY3Rpb24pKSB7XG4gICAgICBjbGVhclBvbGxzKCk7XG4gICAgICBpZiAocG9sbGluZ1VwZGF0ZVRpbWVyKSB7XG4gICAgICAgIGNsZWFyVGltZW91dChwb2xsaW5nVXBkYXRlVGltZXIpO1xuICAgICAgICBwb2xsaW5nVXBkYXRlVGltZXIgPSBudWxsO1xuICAgICAgfVxuICAgICAgcGVuZGluZ1BvbGxpbmdVcGRhdGVzLmNsZWFyKCk7XG4gICAgfVxuICB9O1xuICBmdW5jdGlvbiBzY2hlZHVsZVBvbGxpbmdVcGRhdGUocXVlcnlDYWNoZUtleSwgYXBpMikge1xuICAgIHBlbmRpbmdQb2xsaW5nVXBkYXRlcy5hZGQocXVlcnlDYWNoZUtleSk7XG4gICAgaWYgKCFwb2xsaW5nVXBkYXRlVGltZXIpIHtcbiAgICAgIHBvbGxpbmdVcGRhdGVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBwZW5kaW5nUG9sbGluZ1VwZGF0ZXMpIHtcbiAgICAgICAgICB1cGRhdGVQb2xsaW5nSW50ZXJ2YWwoe1xuICAgICAgICAgICAgcXVlcnlDYWNoZUtleToga2V5XG4gICAgICAgICAgfSwgYXBpMik7XG4gICAgICAgI
3053H1cbiAgICAgICAgcGVuZGluZ1BvbGxpbmdVcGRhdGVzLmNsZWFyKCk7XG4gICAgICAgIHBvbGxpbmdVcGRhdGVUaW1lciA9IG51bGw7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gc3RhcnROZXh0UG9sbCh7XG4gICAgcXVlcnlDYWNoZUtleVxuICB9LCBhcGkyKSB7XG4gICAgY29uc3Qgc3RhdGUgPSBhcGkyLmdldFN0YXRlKClbcmVkdWNlclBhdGhdO1xuICAgIGNvbnN0IHF1ZXJ5U3ViU3RhdGUgPSBzdGF0ZS5xdWVyaWVzW3F1ZXJ5Q2FjaGVLZXldO1xuICAgIGNvbnN0IHN1YnNjcmlwdGlvbnMgPSBjdXJyZW50U3Vic2NyaXB0aW9ucy5nZXQocXVlcnlDYWNoZUtleSk7XG4gICAgaWYgKCFxdWVyeVN1YlN0YXRlIHx8IHF1ZXJ5U3ViU3RhdGUuc3RhdHVzID09PSBTVEFUVVNfVU5JTklUSUFMSVpFRCkgcmV0dXJuO1xuICAgIGNvbnN0IHtcbiAgICAgIGxvd2VzdFBvbGxpbmdJbnRlcnZhbCxcbiAgICAgIHNraXBQb2xsaW5nSWZVbmZvY3VzZWRcbiAgICB9ID0gZmluZExvd2VzdFBvbGxpbmdJbnRlcnZhbChzdWJzY3JpcHRpb25zKTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShsb3dlc3RQb2xsaW5nSW50ZXJ2YWwpKSByZXR1cm47XG4gICAgY29uc3QgY3VycmVudFBvbGwgPSBjdXJyZW50UG9sbHMuZ2V0KHF1ZXJ5Q2FjaGVLZXkpO1xuICAgIGlmIChjdXJyZW50UG9sbCA9PSBudWxsID8gdm9pZCAwIDogY3VycmVudFBvbGwudGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KGN1cnJlbnRQb2xsLnRpbWVvdXQpO1xuICAgICAgY3VycmVudFBvbGwudGltZW91dCA9IHZvaWQgMDtcbiAgICB9XG4gICAgY29uc3QgbmV4dFBvbGxUaW1lc3RhbXAgPSBEYXRlLm5vdygpICsgbG93ZXN0UG9sbGluZ0ludGVydmFsO1xuICAgIGN1cnJlbnRQb2xscy5zZXQocXVlcnlDYWNoZUtleSwge1xuICAgICAgbmV4dFBvbGxUaW1lc3RhbXAsXG4gICAgICBwb2xsaW5nSW50ZXJ2YWw6IGxvd2VzdFBvbGxpbmdJbnRlcnZhbCxcbiAgICAgIHRpbWVvdXQ6IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoc3RhdGUuY29uZmlnLmZvY3VzZWQgfHwgIXNraXBQb2xsaW5nSWZVbmZvY3VzZWQpIHtcbiAgICAgICAgICBhcGkyLmRpc3BhdGNoKHJlZmV0Y2hRdWVyeShxdWVyeVN1YlN0YXRlKSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhcnROZXh0UG9sbCh7XG4gICAgICAgICAgcXVlcnlDYWNoZUtleVxuICAgICAgICB9LCBhcGkyKTtcbiAgICAgIH0sIGxvd2VzdFBvbGxpbmdJbnRlcnZhbClcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiB1cGRhdGVQb2xsaW5nSW50ZXJ2YWwoe1xuICAgIHF1ZXJ5Q2FjaGVLZXlcbiAgfSwgYXBpMikge1xuICAgIGNvbnN0IHN0YXRlID0gYXBpMi5nZXRTdGF0ZSgpW3JlZHVjZXJQYXRoXTtcbiAgICBjb25zdCBxdWVyeVN1YlN0YXRlID0gc3RhdGUucXVlcmllc1txdWVyeUNhY2hlS2V5XTtcbiAgICBjb25zdCBzdWJzY3JpcHRpb25zID0gY3VycmVudFN1YnNjcmlwdGlvbnMuZ2V0KHF1ZXJ5Q2FjaGVLZXkpO1xuICAgIGlmICghcXVlcnlTdWJTdGF0ZSB8fCBxdWVyeVN1YlN0YXRlLnN0YXR1cyA9PT0gU1RBVFVTX1VOSU5JVElBTElaRUQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgbG93ZXN0UG9sbGluZ0ludGVydmFsXG4gICAgfSA9IGZpbmRMb3dlc3RQb2xsaW5nSW50ZXJ2YWwoc3Vic2NyaXB0aW9ucyk7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIikge1xuICAgICAgY29uc3QgdXBkYXRlQ291bnRlcnMgPSBjdXJyZW50UG9sbHMucG9sbFVwZGF0ZUNvdW50ZXJzID8/IChjdXJyZW50UG9sbHMucG9sbFVwZGF0ZUNvdW50ZXJzID0ge30pO1xuICAgICAgdXBkYXRlQ291bnRlcnNbcXVlcnlDYWNoZUtleV0gPz8gKHVwZGF0ZUNvdW50ZXJzW3F1ZXJ5Q2FjaGVLZXldID0gMCk7XG4gICAgICB1cGRhdGVDb3VudGVyc1txdWVyeUNhY2hlS2V5XSsrO1xuICAgIH1cbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShsb3dlc3RQb2xsaW5nSW50ZXJ2YWwpKSB7XG4gICAgICBjbGVhbnVwUG9sbEZvcktleShxdWVyeUNhY2hlS2V5KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudFBvbGwgPSBjdXJyZW50UG9sbHMuZ2V0KHF1ZXJ5Q2FjaGVLZXkpO1xuICAgIGNvbnN0IG5leHRQb2xsVGltZXN0YW1wID0gRGF0ZS5ub3coKSArIGxvd2VzdFBvbGxpbmdJbnRlcnZhbDtcbiAgICBpZiAoIWN1cnJlbnRQb2xsIHx8IG5leHRQb2xsVGltZXN0YW1wIDwgY3VycmVudFBvbGwubmV4dFBvbGxUaW1lc3RhbXApIHtcbiAgICAgIHN0YXJ0TmV4dFBvbGwoe1xuICAgICAgICBxdWVyeUNhY2hlS2V5XG4gICAgICB9LCBhcGkyKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gY2xlYW51cFBvbGxGb3JLZXkoa2V5KSB7XG4gICAgY29uc3QgZXhpc3RpbmdQb2xsID0gY3VycmVudFBvbGxzLmdldChrZXkpO1xuICAgIGlmIChleGlzdGluZ1BvbGwgPT0gbnVsbCA/IHZvaWQgMCA6IGV4aXN0aW5nUG9sbC50aW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQoZXhpc3RpbmdQb2xsLnRpbWVvdXQpO1xuICAgIH1cbiAgICBjdXJyZW50UG9sbHMuZGVsZXRlKGtleSk7XG4gIH1cbiAgZnVuY3Rpb24gY2xlYXJQb2xscygpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBjdXJyZW50UG9sbHMua2V5cygpKSB7XG4gICAgICBjbGVhbnVwUG9sbEZvcktleShrZXkpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBmaW5kTG93ZXN0UG9sbGluZ0ludGVydmFsKHN1YnNjcmliZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSkge1xuICAgIGxldCBza2lwUG9sbGluZ0lmVW5mb2N1c2VkID0gZmFsc2U7XG4gICAgbGV0IGxvd2VzdFBvbGxpbmdJbnRlcnZhbCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHN1YnNjcmliZXJzLnZhbHVlcygpKSB7XG4gICAgICBpZiAoISFlbnRyeS5wb2xsaW5nSW50ZXJ2YWwpIHtcbiAgICAgICAgbG93ZXN0UG9sbGluZ0ludGVydmFsID0gTWF0aC5taW4oZW50cnkucG9sbGluZ0ludGVydmFsLCBsb3dlc3RQb2xsaW5nSW50ZXJ2YWwpO1xuICAgICAgICBza2lwUG9sbGluZ0lmVW5mb2N1c2VkID0gZW50cnkuc2tpcFBvbGxpbmdJZlVuZm9jdXNlZCB8fCBza2lwUG9sbGluZ0lmVW5mb2N1c2VkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbG93ZXN0UG9sbGluZ0ludGVydmFsLFxuICAgICAgc2tpcFBvbGxpbmdJZlVuZm9jdXNlZFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIGhhbmRsZXI7XG59O1xudmFyIGJ1aWxkUXVlcnlMaWZlY3ljbGVIYW5kbGVyID0gKHtcbiAgYXBpLFxuICBjb250ZXh0LFxuICBxdWVyeVRodW5rLFxuICBtdXRhdGlvblRodW5rXG59KSA9PiB7XG4gIGNvbnN0IGlzUGVuZGluZ1RodW5rID0gaXNQZW5kaW5nKHF1ZXJ5VGh1bmssIG11dGF0aW9uVGh1bmspO1xuICBjb25zdCBpc1JlamVjdGVkVGh1bmsgPSBpc1JlamVjdGVkK
3053HF1ZXJ5VGh1bmssIG11dGF0aW9uVGh1bmspO1xuICBjb25zdCBpc0Z1bGxmaWxsZWRUaHVuayA9IGlzRnVsZmlsbGVkKHF1ZXJ5VGh1bmssIG11dGF0aW9uVGh1bmspO1xuICBjb25zdCBsaWZlY3ljbGVNYXAgPSB7fTtcbiAgY29uc3QgaGFuZGxlciA9IChhY3Rpb24sIG13QXBpKSA9PiB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBpZiAoaXNQZW5kaW5nVGh1bmsoYWN0aW9uKSkge1xuICAgICAgY29uc3Qge1xuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGFyZzoge1xuICAgICAgICAgIGVuZHBvaW50TmFtZSxcbiAgICAgICAgICBvcmlnaW5hbEFyZ3NcbiAgICAgICAgfVxuICAgICAgfSA9IGFjdGlvbi5tZXRhO1xuICAgICAgY29uc3QgZW5kcG9pbnREZWZpbml0aW9uID0gZ2V0RW5kcG9pbnREZWZpbml0aW9uKGNvbnRleHQsIGVuZHBvaW50TmFtZSk7XG4gICAgICBjb25zdCBvblF1ZXJ5U3RhcnRlZCA9IGVuZHBvaW50RGVmaW5pdGlvbiA9PSBudWxsID8gdm9pZCAwIDogZW5kcG9pbnREZWZpbml0aW9uLm9uUXVlcnlTdGFydGVkO1xuICAgICAgaWYgKG9uUXVlcnlTdGFydGVkKSB7XG4gICAgICAgIGNvbnN0IGxpZmVjeWNsZSA9IHt9O1xuICAgICAgICBjb25zdCBxdWVyeUZ1bGZpbGxlZCA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBsaWZlY3ljbGUucmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgbGlmZWN5Y2xlLnJlamVjdCA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgICAgIHF1ZXJ5RnVsZmlsbGVkLmNhdGNoKCgpID0+IHtcbiAgICAgICAgfSk7XG4gICAgICAgIGxpZmVjeWNsZU1hcFtyZXF1ZXN0SWRdID0gbGlmZWN5Y2xlO1xuICAgICAgICBjb25zdCBzZWxlY3RvciA9IGFwaS5lbmRwb2ludHNbZW5kcG9pbnROYW1lXS5zZWxlY3QoaXNBbnlRdWVyeURlZmluaXRpb24oZW5kcG9pbnREZWZpbml0aW9uKSA/IG9yaWdpbmFsQXJncyA6IHJlcXVlc3RJZCk7XG4gICAgICAgIGNvbnN0IGV4dHJhID0gbXdBcGkuZGlzcGF0Y2goKF8sIF9fLCBleHRyYTIpID0+IGV4dHJhMik7XG4gICAgICAgIGNvbnN0IGxpZmVjeWNsZUFwaSA9IHtcbiAgICAgICAgICAuLi5td0FwaSxcbiAgICAgICAgICBnZXRDYWNoZUVudHJ5OiAoKSA9PiBzZWxlY3Rvcihtd0FwaS5nZXRTdGF0ZSgpKSxcbiAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgZXh0cmEsXG4gICAgICAgICAgdXBkYXRlQ2FjaG
3053VkRGF0YTogaXNBbnlRdWVyeURlZmluaXRpb24oZW5kcG9pbnREZWZpbml0aW9uKSA/ICh1cGRhdGVSZWNpcGUpID0+IG13QXBpLmRpc3BhdGNoKGFwaS51dGlsLnVwZGF0ZVF1ZXJ5RGF0YShlbmRwb2ludE5hbWUsIG9yaWdpbmFsQXJncywgdXBkYXRlUmVjaXBlKSkgOiB2b2lkIDAsXG4gICAgICAgICAgcXVlcnlGdWxmaWxsZWRcbiAgICAgICAgfTtcbiAgICAgICAgb25RdWVyeVN0YXJ0ZWQob3JpZ2luYWxBcmdzLCBsaWZlY3ljbGVBcGkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNGdWxsZmlsbGVkVGh1bmsoYWN0aW9uKSkge1xuICAgICAgY29uc3Qge1xuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGJhc2VRdWVyeU1ldGFcbiAgICAgIH0gPSBhY3Rpb24ubWV0YTtcbiAgICAgIChfYSA9IGxpZmVjeWNsZU1hcFtyZXF1ZXN0SWRdKSA9PSBudWxsID8gdm9pZCAwIDogX2EucmVzb2x2ZSh7XG4gICAgICAgIGRhdGE6IGFjdGlvbi5wYXlsb2FkLFxuICAgICAgICBtZXRhOiBiYXNlUXVlcnlNZXRhXG4gICAgICB9KTtcbiAgICAgIGRlbGV0ZSBsaWZlY3ljbGVNYXBbcmVxdWVzdElkXTtcbiAgICB9IGVsc2UgaWYgKGlzUmVqZWN0ZWRUaHVuayhhY3Rpb24pKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgcmVqZWN0ZWRXaXRoVmFsdWUsXG4gICAgICAgIGJhc2VRdWVyeU1ldGFcbiAgICAgIH0gPSBhY3Rpb24ubWV0YTtcbiAgICAgIChfYiA9IGxpZmVjeWNsZU1hcFtyZXF1ZXN0SWRdKSA9PSBudWxsID8gdm9pZCAwIDogX2IucmVqZWN0KHtcbiAgICAgICAgZXJyb3I6IGFjdGlvbi5wYXlsb2FkID8/IGFjdGlvbi5lcnJvcixcbiAgICAgICAgaXNVbmhhbmRsZWRFcnJvcjogIXJlamVjdGVkV2l0aFZhbHVlLFxuICAgICAgICBtZXRhOiBiYXNlUXVlcnlNZXRhXG4gICAgICB9KTtcbiAgICAgIGRlbGV0ZSBsaWZlY3ljbGVNYXBbcmVxdWVzdElkXTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBoYW5kbGVyO1xufTtcbnZhciBidWlsZFdpbmRvd0V2ZW50SGFuZGxlciA9ICh7XG4gIHJlZHVjZXJQYXRoLFxuICBjb250ZXh0LFxuICBhcGksXG4gIHJlZmV0Y2hRdWVyeSxcbiAgaW50ZXJuYWxTdGF0ZVxufSkgPT4ge1xuICBjb25zdCB7XG4gICAgcmVtb3ZlUXVlcnlSZXN1bHRcbiAgfSA9IGFwaS5pbnRlcm5hbEFjdGlvbnM7XG4gIGNvbnN0IGhhbmRsZXIgPSAoYWN0aW9uLCBtd0FwaSkgPT4ge1xuICAgIGlmIChvbkZvY3VzLm1hdGNoKGFjdGlvbikpIHtcbiAgICAgIHJlZmV0Y2hWYWxpZFF1ZXJpZXMobXdBcGksIFwicmVmZXRjaE9uRm9jdXNcIik7XG4gICAgfVxuICAgIGlmIChvbk9ubGluZS5tYXRjaChhY3Rpb24pKSB7XG4gICAgICByZWZldGNoVmFsaWRRdWVyaWVzKG13QXBpLCBcInJlZmV0Y2hPblJlY29ubmVjdFwiKTtcbiAgICB9XG4gIH07XG4gIGZ1bmN0aW9uIHJlZmV0Y2hWYWxpZFF1ZXJpZXMoYXBpMiwgdHlwZSkge1xuICAgIGNvbnN0IHN0YXRlID0gYXBpMi5nZXRTdGF0ZSgpW3JlZHVjZXJQYXRoXTtcbiAgICBjb25zdCBxdWVyaWVzID0gc3RhdGUucXVlcmllcztcbiAgICBjb25zdCBzdWJzY3JpcHRpb25zID0gaW50ZXJuYWxTdGF0ZS5jdXJyZW50U3Vic2NyaXB0aW9ucztcbiAgICBjb250ZXh0LmJhdGNoKCgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgcXVlcnlDYWNoZUtleSBvZiBzdWJzY3JpcHRpb25zLmtleXMoKSkge1xuICAgICAgICBjb25zdCBxdWVyeVN1YlN0YXRlID0gcXVlcmllc1txdWVyeUNhY2hlS2V5XTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uU3ViU3RhdGUgPSBzdWJzY3JpcHRpb25zLmdldChxdWVyeUNhY2hlS2V5KTtcbiAgICAgICAgaWYgKCFzdWJzY3JpcHRpb25TdWJTdGF0ZSB8fCAhcXVlcnlTdWJTdGF0ZSkgY29udGludWU7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IFsuLi5zdWJzY3JpcHRpb25TdWJTdGF0ZS52YWx1ZXMoKV07XG4gICAgICAgIGNvbnN0IHNob3VsZFJlZmV0Y2ggPSB2YWx1ZXMuc29tZSgoc3ViKSA9PiBzdWJbdHlwZV0gPT09IHRydWUpIHx8IHZhbHVlcy5ldmVyeSgoc3ViKSA9PiBzdWJbdHlwZV0gPT09IHZvaWQgMCkgJiYgc3RhdGUuY29uZmlnW3R5cGVdO1xuICAgICAgICBpZiAoc2hvdWxkUmVmZXRjaCkge1xuICAgICAgICAgIGlmIChzdWJzY3JpcHRpb25TdWJTdGF0ZS5zaXplID09PSAwKSB7XG4gICAgICAgICAgICBhcGkyLmRpc3BhdGNoKHJlbW92ZVF1ZXJ5UmVzdWx0KHtcbiAgICAgICAgICAgICAgcXVlcnlDYWNoZUtleVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH0gZWxzZSBpZiAocXVlcnlTdWJTdGF0ZS5zdGF0dXMgIT09IFNUQVRVU19VTklOSVRJQUxJWkVEKSB7XG4gICAgICAgICAgICBhcGkyLmRpc3BhdGNoKHJlZmV0Y2hRdWVyeShxdWVyeVN1YlN0YXRlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGhhbmRsZXI7XG59O1xuZnVuY3Rpb24gYnVpbGRNaWRkbGV3YXJlKGlucHV0KSB7XG4gIGNvbnN0IHtcbiAgICByZWR1Y2VyUGF0aCxcbiAgICBxdWVyeVRodW5rLFxuICAgIGFwaSxcbiAgICBjb250ZXh0LFxuICAgIGdldEludGVybmFsU3RhdGVcbiAgfSA9IGlucHV0O1xuICBjb25zdCB7XG4gICAgYXBpVWlkXG4gIH0gPSBjb250ZXh0O1xuICBjb25zdCBhY3Rpb25zMiA9IHtcbiAgICBpbnZhbGlkYXRlVGFnczogY3JlYXRlQWN0aW9uKGAke3JlZHVjZXJQYXRofS9pbnZhbGlkYXRlVGFnc2ApXG4gIH07XG4gIGNvbnN0IGlzVGhpc0FwaVNsaWNlQWN0aW9uID0gKGFjdGlvbikgPT4gYWN0aW9uLnR5cGUuc3RhcnRzV2l0aChgJHtyZWR1Y2VyUGF0aH0vYCk7XG4gIGNvbnN0IGhhbmRsZXJCdWlsZGVycyA9IFtidWlsZERldkNoZWNrSGFuZGxlciwgYnVpbGRDYWNoZUNvbGxlY3Rpb25IYW5kbGVyLCBidWlsZEludmFsaWRhdGlvbkJ5VGFnc0hhbmRsZXIsIGJ1aWxkUG9sbGluZ0hhbmRsZXIsIGJ1aWxkQ2FjaGVMaWZlY3ljbGVIYW5kbGVyLCBidWlsZFF1ZXJ5TGlmZWN5Y2xlSGFuZGxlcl07XG4gIGNvbnN0IG1pZGRsZXdhcmUgPSAobXdBcGkpID0+IHtcbiAgICBsZXQgaW5pdGlhbGl6ZWQyID0gZmFsc2U7XG4gICAgY29uc3QgaW50ZXJuYWxTdGF0ZSA9IGdldEludGVybmFsU3RhdGUobXdBcGkuZGlzcGF0Y2gpO1xuICAgIGNvbnN0IGJ1aWxkZXJBcmdzID0ge1xuICAgICAgLi4uaW5wdXQsXG4gICAgICBpbnRlcm5hbFN0YXRlLFxuICAgICAgcmVmZXRjaFF1ZXJ5LFxuICAgICAgaXNUaGlzQXBpU2xpY2VBY3Rpb24sXG4gICAgICBtd0FwaVxuICAgIH07XG4gICAgY29uc3QgaGFuZGxlcnMgPSBoYW5kbGVyQnVpbGRlcnMubWFwKChidWlsZCkgPT4gYnVpbGQoYnVpbGRlckFyZ3MpKTtcbiAgICBjb25zdCBiYXRjaGVkQWN0aW9uc0hhbmRsZXIgPSBidWlsZEJhdGNoZWRBY3Rpb25zSGFuZGxlcihidWlsZGVyQXJncyk7XG4gICAgY29uc3Qgd2luZG93RXZlbnRzSGFuZGxlciA9IGJ1aWxkV2luZG93RXZlbnRIYW5kbGVyKGJ1aWxkZXJBcmdzKTtcbiAgICByZXR1cm4gKG5leHQpID0+IHtcbiAgICAgIHJldHVybiAoYWN0aW9uKSA9PiB7XG4gICAgICAgIGlmICghaXNBY3Rpb24oYWN0aW9uKSkge1xuICAgICAgICAgI
3053HJldHVybiBuZXh0KGFjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpbml0aWFsaXplZDIpIHtcbiAgICAgICAgICBpbml0aWFsaXplZDIgPSB0cnVlO1xuICAgICAgICAgIG13QXBpLmRpc3BhdGNoKGFwaS5pbnRlcm5hbEFjdGlvbnMubWlkZGxld2FyZVJlZ2lzdGVyZWQoYXBpVWlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbXdBcGlXaXRoTmV4dCA9IHtcbiAgICAgICAgICAuLi5td0FwaSxcbiAgICAgICAgICBuZXh0XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHN0YXRlQmVmb3JlID0gbXdBcGkuZ2V0U3RhdGUoKTtcbiAgICAgICAgY29uc3QgW2FjdGlvblNob3VsZENvbnRpbnVlLCBpbnRlcm5hbFByb2JlUmVzdWx0XSA9IGJhdGNoZWRBY3Rpb25zSGFuZGxlcihhY3Rpb24sIG13QXBpV2l0aE5leHQsIHN0YXRlQmVmb3JlKTtcbiAgICAgICAgbGV0IHJlcztcbiAgICAgICAgaWYgKGFjdGlvblNob3VsZENvbnRpbnVlKSB7XG4gICAgICAgICAgcmVzID0gbmV4dChhY3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlcyA9IGludGVybmFsUHJvYmVSZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEhbXdBcGkuZ2V0U3RhdGUoKVtyZWR1Y2VyUGF0aF0pIHtcbiAgICAgICAgICB3aW5kb3dFdmVudHNIYW5kbGVyKGFjdGlvbiwgbXdBcGlXaXRoTmV4dCwgc3RhdGVCZWZvcmUpO1xuICAgICAgICAgIGlmIChpc1RoaXNBcGlTbGljZUFjdGlvbihhY3Rpb24pIHx8IGNvbnRleHQuaGFzUmVoeWRyYXRpb25JbmZvKGFjdGlvbikpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICAgICAgICBoYW5kbGVyKGFjdGlvbiwgbXdBcGlXaXRoTmV4dCwgc3RhdGVCZWZvcmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfTtcbiAgICB9O1xuICB9O1xuICByZXR1cm4ge1xuICAgIG1pZGRsZXdhcmUsXG4gICAgYWN0aW9uczogYWN0aW9uczJcbiAgfTtcbiAgZnVuY3Rpb24gcmVmZXRjaFF1ZXJ5KHF1ZXJ5U3ViU3RhdGUpIHtcbiAgICByZXR1cm4gaW5wdXQuYXBpLmVuZHBvaW50c1txdWVyeVN1YlN0YXRlLmVuZHBvaW50TmFtZV0uaW5pdGlhdGUocXVlcnlTdWJTdGF0ZS5vcmlnaW5hbEFyZ3MsIHtcbiAgICAgIHN1YnNjcmliZTogZmFsc2UsXG4gICAgICBmb3JjZVJlZmV0Y2g6IHRydWVcbiAgICB9KTtcbiAgfVxufVxudmFyIGNvcmVNb2R1bGVOYW1lID0gU3ltYm9sKCk7XG52YXIgY29yZU1vZHVsZSA9ICh7XG4gIGNyZWF0ZVNlbGVjdG9yOiBjcmVhdGVTZWxlY3RvcjIgPSBjcmVhdGVTZWxlY3RvclxufSA9IHt9KSA9PiAoe1xuICBuYW1lOiBjb3JlTW9kdWxlTmFtZSxcbiAgaW5pdChhcGksIHtcbiAgICBiYXNlUXVlcnksXG4gICAgdGFnVHlwZXMsXG4gICAgcmVkdWNlclBhdGgsXG4gICAgc2VyaWFsaXplUXVlcnlBcmdzLFxuICAgIGtlZXBVbnVzZWREYXRhRm9yLFxuICAgIHJlZmV0Y2hPbk1vdW50T3JBcmdDaGFuZ2UsXG4gICAgcmVmZXRjaE9uRm9jdXMsXG4gICAgcmVmZXRjaE9uUmVjb25uZWN0LFxuICAgIGludmFsaWRhdGlvbkJlaGF2aW9yLFxuICAgIG9uU2NoZW1hRmFpbHVyZSxcbiAgICBjYXRjaFNjaGVtYUZhaWx1cmUsXG4gICAgc2tpcFNjaGVtYVZhbGlkYXRpb25cbiAgfSwgY29udGV4dCkge1xuICAgIGVuYWJsZVBhdGNoZXMoKTtcbiAgICBhc3NlcnRDYXN0KHNlcmlhbGl6ZVF1ZXJ5QXJncyk7XG4gICAgY29uc3QgYXNzZXJ0VGFnVHlwZSA9ICh0YWcpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJkZXZlbG9wbWVudFwiKSB7XG4gICAgICAgIGlmICghdGFnVHlwZXMuaW5jbHVkZXModGFnLnR5cGUpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgVGFnIHR5cGUgJyR7dGFnLnR5cGV9JyB3YXMgdXNlZCwgYnV0IG5vdCBzcGVjaWZpZWQgaW4gXFxgdGFnVHlwZXNcXGAhYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0YWc7XG4gICAgfTtcbiAgICBPYmplY3QuYXNzaWduKGFwaSwge1xuICAgICAgcmVkdWNlclBhdGgsXG4gICAgICBlbmRwb2ludHM6IHt9LFxuICAgICAgaW50ZXJuYWxBY3Rpb25zOiB7XG4gICAgICAgIG9uT25saW5lLFxuICAgICAgICBvbk9mZmxpbmUsXG4gICAgICAgIG9uRm9jdXMsXG4gICAgICAgIG9uRm9jdXNMb3N0XG4gICAgICB9LFxuICAgICAgdXRpbDoge31cbiAgICB9KTtcbiAgICBjb25zdCBzZWxlY3RvcnMgPSBidWlsZFNlbGVjdG9ycyh7XG4gICAgICBzZXJpYWxpemVRdWVyeUFyZ3MsXG4gICAgICByZWR1Y2VyUGF0aCxcbiAgICAgIGNyZWF0ZVNlbGVjdG9yOiBjcmVhdGVTZWxlY3RvcjJcbiAgICB9KTtcbiAgICBjb25zdCB7XG4gICAgICBzZWxlY3RJbnZhbGlkYXRlZEJ5LFxuICAgICAgc2VsZWN0Q2FjaGVkQXJnc0ZvclF1ZXJ5LFxuICAgICAgYnVpbGRRdWVyeVNlbGVjdG9yLFxuICAgICAgYnVpbGRJbmZpbml0ZVF1ZXJ5U2VsZWN0b3IsXG4gICAgICBidWlsZE11dGF0aW9uU2VsZWN0b3JcbiAgICB9ID0gc2VsZWN0b3JzO1xuICAgIHNhZmVBc3NpZ24oYXBpLnV0aWwsIHtcbiAgICAgIHNlbGVjdEludmFsaWRhdGVkQnksXG4gICAgICBzZWxlY3RDYWNoZWRBcmdzRm9yUXVlcnlcbiAgICB9KTtcbiAgICBjb25zdCB7XG4gICAgICBxdWVyeVRodW5rLFxuICAgICAgaW5maW5pdGVRdWVyeVRodW5rLFxuICAgICAgbXV0YXRpb25UaHVuayxcbiAgICAgIHBhdGNoUXVlcnlEYXRhLFxuICAgICAgdXBkYXRlUXVlcnlEYXRhLFxuICAgICAgdXBzZXJ0UXVlcnlEYXRhLFxuICAgICAgcHJlZmV0Y2gsXG4gICAgICBidWlsZE1hdGNoVGh1bmtBY3Rpb25zXG4gICAgfSA9IGJ1aWxkVGh1bmtzKHtcbiAgICAgIGJhc2VRdWVyeSxcbiAgICAgIHJlZHVjZXJQYXRoLFxuICAgICAgY29udGV4dCxcbiAgICAgIGFwaSxcbiAgICAgIHNlcmlhbGl6ZVF1ZXJ5QXJncyxcbiAgICAgIGFzc2VydFRhZ1R5cGUsXG4gICAgICBzZWxlY3RvcnMsXG4gICAgICBvblNjaGVtYUZhaWx1cmUsXG4gICAgICBjYXRjaFNjaGVtYUZhaWx1cmUsXG4gICAgICBza2lwU2NoZW1hVmFsaWRhdGlvblxuICAgI
3053H0pO1xuICAgIGNvbnN0IHtcbiAgICAgIHJlZHVjZXIsXG4gICAgICBhY3Rpb25zOiBzbGljZUFjdGlvbnNcbiAgICB9ID0gYnVpbGRTbGljZSh7XG4gICAgICBjb250ZXh0LFxuICAgICAgcXVlcnlUaHVuayxcbiAgICAgIGluZmluaXRlUXVlcnlUaHVuayxcbiAgICAgIG11dGF0aW9uVGh1bmssXG4gICAgICBzZXJpYWxpemVRdWVyeUFyZ3MsXG4gICAgICByZWR1Y2VyUGF0aCxcbiAgICAgIGFzc2VydFRhZ1R5cGUsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgcmVmZXRjaE9uRm9jdXMsXG4gICAgICAgIHJlZmV0Y2hPblJlY29ubmVjdCxcbiAgICAgICAgcmVmZXRjaE9uTW91bnRPckFyZ0NoYW5nZSxcbiAgICAgICAga2VlcFVudXNlZERhdGFGb3IsXG4gICAgICAgIHJlZHVjZXJQYXRoLFxuICAgICAgICBpbnZhbGlkYXRpb25CZWhhdmlvclxuICAgICAgfVxuICAgIH0pO1xuICAgIHNhZmVBc3NpZ24oYXBpLnV0aWwsIHtcbiAgICAgIHBhdGNoUXVlcnlEYXRhLFxuICAgICAgdXBkYXRlUXVlcnlEYXRhLFxuICAgICAgdXBzZXJ0UXVlcnlEYXRhLFxuICAgICAgcHJlZmV0Y2gsXG4gICAgICByZXNldEFwaVN0YXRlOiBzbGljZUFjdGlvbnMucmVzZXRBcGlTdGF0ZSxcbiAgICAgIHVwc2VydFF1ZXJ5RW50cmllczogc2xpY2VBY3Rpb25zLmNhY2hlRW50cmllc1Vwc2VydGVkXG4gICAgfSk7XG4gICAgc2FmZUFzc2lnbihhcGkuaW50ZXJuYWxBY3Rpb25zLCBzbGljZUFjdGlvbnMpO1xuICAgIGNvbnN0IGludGVybmFsU3RhdGVNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbiAgICBjb25zdCBnZXRJbnRlcm5hbFN0YXRlID0gKGRpc3BhdGNoKSA9PiB7XG4gICAgICBjb25zdCBzdGF0ZSA9IGdldE9ySW5zZXJ0Q29tcHV0ZWQoaW50ZXJuYWxTdGF0ZU1hcCwgZGlzcGF0Y2gsICgpID0+ICh7XG4gICAgICAgIGN1cnJlbnRTdWJzY3JpcHRpb25zOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLFxuICAgICAgICBjdXJyZW50UG9sbHM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksXG4gICAgICAgIHJ1bm5pbmdRdWVyaWVzOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLFxuICAgICAgICBydW5uaW5nTXV0YXRpb25zOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpXG4gICAgICB9KSk7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfTtcbiAgICBjb25zdCB7XG4gICAgICBidWlsZEluaXRpYXRlUXVlcnksXG4gICAgICBidWlsZEluaXRpYXRlSW5maW5pdGVRdWVyeSxcbiAgICAgIGJ1aWxkSW5pdGlhdGVNdXRhdGlvbixcbiAgICAgIGdldFJ1bm5pbmdNdXRhdGlvblRodW5rLFxuICAgICAgZ2V0UnVubmluZ011dGF0aW9uc1RodW5rLFxuICAgICAgZ2V0UnVubmluZ1F1ZXJpZXNUaHVuayxcbiAgICAgIGdldFJ1bm5pbmdRdWVyeVRodW5rXG4gICAgfSA9IGJ1aWxkSW5pdGlhdGUoe1xuICAgICAgcXVlcnlUaHVuayxcbiAgICAgIG11dGF0aW9uVGh1bmssXG4gICAgICBpbmZpbml0ZVF1ZXJ5VGh1bmssXG4gICAgICBhcGksXG4gICAgICBzZXJpYWxpemVRdWVyeUFyZ3MsXG4gICAgICBjb250ZXh0LFxuICAgICAgZ2V0SW50ZXJuYWxTdGF0ZVxuICAgIH0pO1xuICAgIHNhZmVBc3NpZ24oYXBpLnV0aWwsIHtcbiAgICAgIGdldFJ1bm5pbmdNdXRhdGlvblRodW5rLFxuICAgICAgZ2V0UnVubmluZ011dGF0aW9uc1RodW5rLFxuICAgICAgZ2V0UnVubmluZ1F1ZXJ5VGh1bmssXG4gICAgICBnZXRSdW5uaW5nUXVlcmllc1RodW5rXG4gICAgfSk7XG4gICAgY29uc3Qge1xuICAgICAgbWlkZGxld2FyZSxcbiAgICAgIGFjdGlvbnM6IG1pZGRsZXdhcmVBY3Rpb25zXG4gICAgfSA9IGJ1aWxkTWlkZGxld2FyZSh7XG4gICAgICByZWR1Y2VyUGF0aCxcbiAgICAgIGNvbnRleHQsXG4gICAgICBxdWVyeVRodW5rLFxuICAgICAgbXV0YXRpb25UaHVuayxcbiAgICAgIGluZmluaXRlUXVlcnlUaHVuayxcbiAgICAgIGFwaSxcbiAgICAgIGFzc2VydFRhZ1R5cGUsXG4gICAgICBzZWxlY3RvcnMsXG4gICAgICBnZXRSdW5uaW5nUXVlcnlUaHVuayxcbiAgICAgIGdldEludGVybmFsU3RhdGVcbiAgICB9KTtcbiAgICBzYWZlQXNzaWduKGFwaS51dGlsLCBtaWRkbGV3YXJlQWN0aW9ucyk7XG4gICAgc2FmZUFzc2lnbihhcGksIHtcbiAgICAgIHJlZHVjZXIsXG4gICAgICBtaWRkbGV3YXJlXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IGNvcmVNb2R1bGVOYW1lLFxuICAgICAgaW5qZWN0RW5kcG9pbnQoZW5kcG9pbnROYW1lLCBkZWZpbml0aW9uKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgYW55QXBpID0gYXBpO1xuICAgICAgICBjb25zdCBlbmRwb2ludCA9IChfYSA9IGFueUFwaS5lbmRwb2ludHMpW2VuZHBvaW50TmFtZV0gPz8gKF9hW2VuZHBvaW50TmFtZV0gPSB7fSk7XG4gICAgICAgIGlmIChpc1F1ZXJ5RGVmaW5pdGlvbihkZWZpbml0aW9uKSkge1xuICAgICAgICAgIHNhZmVBc3NpZ24oZW5kcG9pbnQsIHtcbiAgICAgICAgICAgIG5hbWU6IGVuZHBvaW50TmFtZSxcbiAgICAgICAgICAgIHNlbGVjdDogYnVpbGRRdWVyeVNlbGVjdG9yKGVuZHBvaW50TmFtZSwgZGVmaW5pdGlvbiksXG4gICAgICAgICAgICBpbml0aWF0ZTogYnVpbGRJbml0aWF0ZVF1ZXJ5KGVuZHBvaW50TmFtZSwgZGVmaW5pdGlvbilcbiAgICAgICAgICB9LCBidWlsZE1hdGNoVGh1bmtBY3Rpb25zKHF1ZXJ5VGh1bmssIGVuZHBvaW50TmFtZSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc011dGF0aW9uRGVmaW5pdGlvbihkZWZpbml0aW9uKSkge1xuICAgICAgICAgIHNhZmVBc3NpZ24oZW5kcG9pbnQsIHtcbiAgICAgICAgICAgIG5hbWU6IGVuZHBvaW50TmFtZSxcbiAgICAgICAgICAgIHNlbGVjdDogYnVpbGRNdXRhdGlvblNlbGVjdG9yKCksXG4gICAgICAgICAgICBpbml0aWF0ZTogYnVpbGRJbml0aWF0ZU11dGF0aW9uKGVuZHBvaW50TmFtZSlcbiAgICAgICAgICB9LCBidWlsZE1hdGNoVGh1bmtBY3Rpb25zKG11dGF0aW9uVGh1bmssIGVuZHBvaW50TmFtZSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0luZmluaXRlUXVlcnlEZWZpbml0aW9uKGRlZmluaXRpb24pKSB7XG4gICAgICAgICAgc2FmZUFzc2lnbihlbmRwb2ludCwge1xuICAgICAgICAgICAgbmFtZTogZW5kcG9pbnROYW1lLFxuICAgICAgICAgICAgc2VsZWN0OiBidWlsZEluZmluaXRlUXVlcnlTZWxlY3RvcihlbmRwb2ludE5hbWUsIGRlZmluaXRpb24pLFxuICAgICAgICAgICAgaW5pdGlhdGU6IGJ1aWxkSW5pdGlhdGVJbmZpbml0ZVF1ZXJ5KGVuZHBvaW50TmFtZSwgZGVmaW5pdGlvbilcbiAgICAgICAgICB9LCBidWlsZE1hdGNoVGh1bmtBY3Rpb25zKHF1ZXJ5VGh1bmssIGVuZHBvaW50TmFtZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxufSk7XG52YXIgY3JlYXRlQXBpID0gYnVpbGRDcmVhdGVBcGkoY29yZU1vZHVsZSgpKTtcblxuZXhwb3J0IHtcbiAgUXVlcnlTdGF0dXMsXG4gIGNvcHlXaXRoU3RydWN0dXJhbFNoYXJpbmcsXG4gIGZldGNoQmFzZVF1ZXJ5LFxuICByZXRyeSxcbiAgc2V0dXBMaXN0ZW5lcnMsXG4gIE5hbWVkU2NoZW1hRXJyb3IsXG4gIHNraXBUb2tlbixcbiAgZGVmYXVsdFNlcmlhbGl6ZVF1ZXJ5QXJncyxcbiAgYnVpbGRDcmVhdGVBcGksXG4gIF9ORVZFUixcbiAgZmFrZUJhc2VRdW
3053VyeSxcbiAgY29yZU1vZHVsZU5hbWUsXG4gIGNvcmVNb2R1bGUsXG4gIGNyZWF0ZUFwaVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNodW5rLVdPM0FRRllTLmpzLm1hcFxuIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLHVCQUF1QjtBQUM5QixXQUFXLFNBQVMsV0FBVyxVQUFVO0FBQ3pDLE9BQU8sdUJBQXVCO0FBQzlCLFdBQVcsU0FBUyxXQUFXLFVBQVU7QUFDekMsT0FBTyx3QkFBd0I7QUFDL0IsV0FBVyxVQUFVLFdBQVcsV0FBVztBQUUzQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUdQLElBQUksZUFBZSxRQUFRLGFBQWEsR0FBRyxDQUFDO0FBQzVDLElBQUksZUFBZSxRQUFRLGNBQWMsR0FBRyxDQUFDO0FBQzdDLElBQUksZUFBZSxRQUFRLGNBQWMsR0FBRyxDQUFDO0FBRzdDLElBQUksY0FBYyxRQUFRLGFBQWEsQ0FBQztBQUN4QyxJQUFJLGVBQWUsUUFBUSxjQUFjLENBQUM7QUFDMUMsSUFBSSxlQUFlLFFBQVEsY0FBYyxDQUFDO0FBQzFDLElBQUksY0FBYyxjQUFjLE1BQU07QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNcEMsWUFBWSxRQUFRO0FBQ2xCLFVBQU0sT0FBTyxDQUFDLEVBQUUsT0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

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.