@mnaoumov/obsidian-lib 8.1.0 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -95,11 +95,11 @@ export interface GetBacklinksForFileSafeParams extends GetBacklinksForFileSafeOp
95
95
  */
96
96
  export type GetCacheSafeOptions = ParseCacheOptions;
97
97
  /**
98
- * Params for {@link getLinks}.
98
+ * Params for {@link getReferences}.
99
99
  */
100
- export interface GetLinksParams {
100
+ export interface GetReferencesParams {
101
101
  /**
102
- * The cached metadata to retrieve the links from.
102
+ * The cached metadata to retrieve the references from.
103
103
  */
104
104
  readonly cache: CachedMetadata;
105
105
  /**
@@ -128,6 +128,12 @@ export interface GetLinksParams {
128
128
  * @default `true`
129
129
  */
130
130
  readonly shouldIncludeFrontmatterLinks?: boolean;
131
+ /**
132
+ * Whether to include the body links (`cache.links`).
133
+ *
134
+ * @default `true`
135
+ */
136
+ readonly shouldIncludeLinks?: boolean;
131
137
  /**
132
138
  * Whether to include the external links parsed from multi-link (multi-value) note frontmatter values,
133
139
  * i.e. the offset-carrying frontmatter external links (narrowed via
@@ -143,12 +149,6 @@ export interface GetLinksParams {
143
149
  * @default `false`
144
150
  */
145
151
  readonly shouldIncludeMultiValueFrontmatterLinks?: boolean;
146
- /**
147
- * Whether to include the reference links (`cache.links`).
148
- *
149
- * @default `true`
150
- */
151
- readonly shouldIncludeReferences?: boolean;
152
152
  }
153
153
  /**
154
154
  * Options for the parsing performed by {@link getCacheSafe} and {@link parseMetadata} beyond Obsidian's
@@ -283,12 +283,13 @@ export declare function getCacheSafe(app: App, fileOrPath: PathOrFile, options?:
283
283
  */
284
284
  export declare function getFrontmatterSafe<CustomFrontmatter = unknown>(app: App, pathOrFile: PathOrFile): Promise<CombinedFrontmatter<CustomFrontmatter>>;
285
285
  /**
286
- * Retrieves the selected links from the provided cache.
286
+ * Retrieves the selected references (links, embeds, frontmatter links and the opted-in extras) from the
287
+ * provided cache.
287
288
  *
288
- * @param params - The parameters for retrieving the links.
289
- * @returns An array of references representing the selected links.
289
+ * @param params - The parameters for retrieving the references.
290
+ * @returns The selected references.
290
291
  */
291
- export declare function getLinks(params: GetLinksParams): Reference[];
292
+ export declare function getReferences(params: GetReferencesParams): Reference[];
292
293
  /**
293
294
  * Determines whether a backlink cache plugin is currently loaded - either `Advanced Metadata Cache` ({@link ADVANCED_METADATA_CACHE_PLUGIN_ID}) or its retired predecessor `Backlink Cache` ({@link BACKLINK_CACHE_PLUGIN_ID}).
294
295
  *
@@ -267,19 +267,19 @@ async function getFrontmatterSafe(app, pathOrFile) {
267
267
  const cache = await getCacheSafe(app, pathOrFile);
268
268
  return cache?.frontmatter ?? {};
269
269
  }
270
- function getLinks(params) {
270
+ function getReferences(params) {
271
271
  const {
272
272
  cache,
273
273
  shouldIncludeEmbeds = true,
274
274
  shouldIncludeExternalLinks = false,
275
275
  shouldIncludeFrontmatterExternalLinks = false,
276
276
  shouldIncludeFrontmatterLinks = true,
277
+ shouldIncludeLinks = true,
277
278
  shouldIncludeMultiValueFrontmatterExternalLinks = false,
278
- shouldIncludeMultiValueFrontmatterLinks = false,
279
- shouldIncludeReferences = true
279
+ shouldIncludeMultiValueFrontmatterLinks = false
280
280
  } = params;
281
281
  let links = [
282
- ...shouldIncludeReferences ? cache.links ?? [] : [],
282
+ ...shouldIncludeLinks ? cache.links ?? [] : [],
283
283
  ...shouldIncludeEmbeds ? cache.embeds ?? [] : [],
284
284
  ...shouldIncludeFrontmatterLinks ? cache.frontmatterLinks ?? [] : []
285
285
  ];
@@ -479,7 +479,7 @@ export {
479
479
  getBacklinksForFileSafe,
480
480
  getCacheSafe,
481
481
  getFrontmatterSafe,
482
- getLinks,
482
+ getReferences,
483
483
  hasBacklinkCachePlugin,
484
484
  isCachedMetadataEx,
485
485
  parseMetadata,
@@ -488,4 +488,4 @@ export {
488
488
  unregisterFileCacheForNonExistingFile,
489
489
  unregisterFiles
490
490
  };
491
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZXRhZGF0YS1jYWNoZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCB0aGUgbWV0YWRhdGEgY2FjaGUgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcGlDb250cmFjdCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hcGktY29udHJhY3QnO1xuaW1wb3J0IHR5cGUgeyBSZXRyeU9wdGlvbnMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYXN5bmMnO1xuaW1wb3J0IHR5cGUgeyBDdXN0b21BcnJheURpY3QgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0JztcbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBDYWNoZWRNZXRhZGF0YSxcbiAgUmVmZXJlbmNlLFxuICBUQWJzdHJhY3RGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHtcbiAgY3JlYXRlQXJndW1lbnRzU2NoZW1hLFxuICBjcmVhdGVUeXBlR3VhcmRTY2hlbWFcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FwaS1jb250cmFjdCc7XG5pbXBvcnQgeyBDYWxsYmFja0Rpc3Bvc2FibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZGlzcG9zYWJsZSc7XG5pbXBvcnQgeyBwcmludEVycm9yIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2Vycm9yJztcbmltcG9ydCB7IGdldE5lc3RlZFByb3BlcnR5VmFsdWUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvb2JqZWN0LXV0aWxzJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7XG4gIEN1c3RvbUFycmF5RGljdEltcGwsXG4gIGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGUsXG4gIGlzUmVmZXJlbmNlQ2FjaGUsXG4gIHBhcmVudEZvbGRlclBhdGhcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWRGcm9udG1hdHRlciB9IGZyb20gJy4vZnJvbnRtYXR0ZXIudHMnO1xuaW1wb3J0IHR5cGUge1xuICBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZSxcbiAgUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2VXaXRoT2Zmc2V0cyxcbiAgUGFyc2VMaW5rUmVmZXJlbmNlXG59IGZyb20gJy4vcGFyc2UtbGluay50cyc7XG5cbmltcG9ydCB7IHJldHJ5V2l0aFRpbWVvdXROb3RpY2UgfSBmcm9tICcuL2FzeW5jLXdpdGgtbm90aWNlLnRzJztcbmltcG9ydCB7IGdldEluZGV4ZWRCYWNrbGlua3NGb3JGaWxlIH0gZnJvbSAnLi9iYWNrbGluay1pbmRleC50cyc7XG5pbXBvcnQge1xuICBnZXRGaWxlLFxuICBnZXRGaWxlT3JOdWxsLFxuICBnZXRGb2xkZXIsXG4gIGdldFBhdGgsXG4gIGlzQ2FudmFzRmlsZSxcbiAgaXNGaWxlLFxuICBpc1BhdGhPckZpbGVcbn0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQge1xuICBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMsXG4gIHRvRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0c1xufSBmcm9tICcuL2Zyb250bWF0dGVyLWxpbmstY2FjaGUtd2l0aC1vZmZzZXRzLnRzJztcbmltcG9ydCB7IHBhcnNlRnJvbnRtYXR0ZXIgfSBmcm9tICcuL2Zyb250bWF0dGVyLnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuL2kxOG4vaTE4bi50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkxpYlN0YXRlIH0gZnJvbSAnLi9vYnNpZGlhbi1saWItc3RhdGUudHMnO1xuaW1wb3J0IHtcbiAgcGFyc2VGcm9udG1hdHRlckxpbmtzLFxuICBwYXJzZUxpbmtzLFxuICB0b1BhcnNlTGlua1JlZmVyZW5jZVxufSBmcm9tICcuL3BhcnNlLWxpbmsudHMnO1xuaW1wb3J0IHsgZmluZFBsdWdpbkFwaSB9IGZyb20gJy4vcGx1Z2luL3BsdWdpbi1hcGkudHMnO1xuaW1wb3J0IHtcbiAgZ2V0UmVmZXJlbmNlTGlua1RleHQsXG4gIHNvcnRSZWZlcmVuY2VzXG59IGZyb20gJy4vcmVmZXJlbmNlLnRzJztcbmltcG9ydCB7XG4gIHJlYWRTYWZlLFxuICBzYXZlTm90ZVxufSBmcm9tICcuL3ZhdWx0LnRzJztcblxuLyoqXG4gKiBBIHBhcnNpbmcgZmVhdHVyZSB0aGF0IHdhcyBhcHBsaWVkIHdoZW4gY29tcHV0aW5nIGEge0BsaW5rIENhY2hlZE1ldGFkYXRhRXh9LlxuICovXG5leHBvcnQgZW51bSBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZSB7XG4gIC8qKlxuICAgKiBUaGUgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gdGhlIG5vdGUgY29udGVudCBib2R5LlxuICAgKi9cbiAgRXh0ZXJuYWxMaW5rcyA9ICdFeHRlcm5hbExpbmtzJyxcblxuICAvKipcbiAgICogVGhlIGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIHNpbmdsZS1saW5rIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKi9cbiAgRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gJ0Zyb250bWF0dGVyRXh0ZXJuYWxMaW5rcycsXG5cbiAgLyoqXG4gICAqIFRoZSBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKi9cbiAgTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9ICdNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzJyxcblxuICAvKipcbiAgICogVGhlIGludGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMsIHdoaWNoIE9ic2lkaWFuIGRvZXMgbm90IG5hdGl2ZWx5IGNhY2hlLlxuICAgKi9cbiAgTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3MgPSAnTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3MnLFxuXG4gIC8qKlxuICAgKiBPYnNpZGlhbidzIG5hdGl2ZSBtZXRhZGF0YSBwYXJzaW5nIChpbnRlcm5hbCBsaW5rcywgZW1iZWRzLCBmcm9udG1hdHRlciBsaW5rcykuXG4gICAqL1xuICBOYXRpdmUgPSAnTmF0aXZlJ1xufVxuXG4vKipcbiAqIEFuIGV4dGVuZGVkIHtAbGluayBDYWNoZWRNZXRhZGF0YX0gdGhhdCByZWNvcmRzIHdoaWNoIHBhcnNpbmcge0BsaW5rIENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlfXMgd2VyZVxuICogYXBwbGllZCAodmlhIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4LmZlYXR1cmVzfSkgYW5kIGNhcnJpZXMgdGhlIHJlc3VsdGluZyBleHRlcm5hbCBsaW5rcy4gRWFjaCBsaW5rc1xuICogYXJyYXkgaXMgcG9wdWxhdGVkIG9ubHkgd2hlbiBpdHMgY29ycmVzcG9uZGluZyBmZWF0dXJlIGlzIHByZXNlbnQgaW4ge0BsaW5rIENhY2hlZE1ldGFkYXRhRXguZmVhdHVyZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlZE1ldGFkYXRhRXggZXh0ZW5kcyBDYWNoZWRNZXRhZGF0YSB7XG4gIC8qKlxuICAgKiBUaGUgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gdGhlIG5vdGUgY29udGVudCBib2R5LiBQb3B1bGF0ZWQgb25seSB3aGVuXG4gICAqIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5FeHRlcm5hbExpbmtzfSBpcyBhcHBsaWVkLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQtZGV2LXRvb2xraXQvcmVhZG9ubHktaW50ZXJmYWNlLW1lbWJlcnMgLS0gTWV0YWRhdGEgcGFyc2luZyBwb3B1bGF0ZXMgdGhpcyBvcHRpb25hbCBjYWNoZSBmZWF0dXJlIGFmdGVyIHJlYWRpbmcgdGhlIG5vdGUuXG4gIGV4dGVybmFsTGlua3M/OiBQYXJzZUxpbmtSZWZlcmVuY2VbXTtcblxuICAvKipcbiAgICogVGhlIHBhcnNpbmcgZmVhdHVyZXMgdGhhdCB3ZXJlIGFwcGxpZWQgd2hlbiBjb21wdXRpbmcgdGhpcyBjYWNoZS5cbiAgICovXG4gIHJlYWRvbmx5IGZlYXR1cmVzOiBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gc2luZ2xlLWxpbmsgKHNpbmdsZS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMuIFBvcHVsYXRlZCBvbmx5XG4gICAqIHdoZW4ge0BsaW5rIENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLkZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc30gaXMgYXBwbGllZC5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0LWRldi10b29sa2l0L3JlYWRvbmx5LWludGVyZmFjZS1tZW1iZXJzIC0tIE1ldGFkYXRhIHBhcnNpbmcgcG9wdWxhdGVzIHRoaXMgb3B0aW9uYWwgY2FjaGUgZmVhdHVyZSBhZnRlciByZWFkaW5nIHRoZSBub3RlLlxuICBmcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gbXVsdGktbGluayAobXVsdGktdmFsdWUpIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLiBQb3B1bGF0ZWQgb25seSB3aGVuXG4gICAqIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5NdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzfSBpcyBhcHBsaWVkLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQtZGV2LXRvb2xraXQvcmVhZG9ubHktaW50ZXJmYWNlLW1lbWJlcnMgLS0gTWV0YWRhdGEgcGFyc2luZyBwb3B1bGF0ZXMgdGhpcyBvcHRpb25hbCBjYWNoZSBmZWF0dXJlIGFmdGVyIHJlYWRpbmcgdGhlIG5vdGUuXG4gIG11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZVdpdGhPZmZzZXRzW107XG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMuIFBvcHVsYXRlZCBvbmx5IHdoZW5cbiAgICoge0BsaW5rIENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLk11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzfSBpcyBhcHBsaWVkLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQtZGV2LXRvb2xraXQvcmVhZG9ubHktaW50ZXJmYWNlLW1lbWJlcnMgLS0gTWV0YWRhdGEgcGFyc2luZyBwb3B1bGF0ZXMgdGhpcyBvcHRpb25hbCBjYWNoZSBmZWF0dXJlIGFmdGVyIHJlYWRpbmcgdGhlIG5vdGUuXG4gIG11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzPzogUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2VXaXRoT2Zmc2V0c1tdO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QmFja2xpbmtzRm9yRmlsZVNhZmVPcHRpb25zIGV4dGVuZHMgUmV0cnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc2hvdyBhIHRpbWVvdXQgbm90aWNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNob3dUaW1lb3V0Tm90aWNlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEJhY2tsaW5rc0ZvckZpbGVTYWZlUGFyYW1zIGV4dGVuZHMgR2V0QmFja2xpbmtzRm9yRmlsZVNhZmVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIG9iamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGdldENhY2hlU2FmZX0uXG4gKi9cbmV4cG9ydCB0eXBlIEdldENhY2hlU2FmZU9wdGlvbnMgPSBQYXJzZUNhY2hlT3B0aW9ucztcblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBnZXRMaW5rc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0TGlua3NQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNhY2hlZCBtZXRhZGF0YSB0byByZXRyaWV2ZSB0aGUgbGlua3MgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlOiBDYWNoZWRNZXRhZGF0YTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBlbWJlZHMgKGBjYWNoZS5lbWJlZHNgKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRW1iZWRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSB0aGUgbm90ZSBib2R5LiBSZXF1aXJlcyB0aGUgY2FjaGUgdG8gYmUgYVxuICAgKiB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeH0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBzaW5nbGUtbGluayAoc2luZ2xlLXZhbHVlKSBub3RlIGZyb250bWF0dGVyXG4gICAqIHZhbHVlcy4gUmVxdWlyZXMgdGhlIGNhY2hlIHRvIGJlIGEge0BsaW5rIENhY2hlZE1ldGFkYXRhRXh9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBmcm9udG1hdHRlciBsaW5rcyAoYGNhY2hlLmZyb250bWF0dGVyTGlua3NgKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gbXVsdGktbGluayAobXVsdGktdmFsdWUpIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLFxuICAgKiBpLmUuIHRoZSBvZmZzZXQtY2FycnlpbmcgZnJvbnRtYXR0ZXIgZXh0ZXJuYWwgbGlua3MgKG5hcnJvd2VkIHZpYVxuICAgKiB7QGxpbmsgaXNGcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzfSkuIFJlcXVpcmVzIHRoZSBjYWNoZSB0byBiZSBhIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4fS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGludGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgKG11bHRpLXZhbHVlKSBub3RlIGZyb250bWF0dGVyIHZhbHVlcy5cbiAgICogUmVxdWlyZXMgdGhlIGNhY2hlIHRvIGJlIGEge0BsaW5rIENhY2hlZE1ldGFkYXRhRXh9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIHJlZmVyZW5jZSBsaW5rcyAoYGNhY2hlLmxpbmtzYCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZVJlZmVyZW5jZXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSBwYXJzaW5nIHBlcmZvcm1lZCBieSB7QGxpbmsgZ2V0Q2FjaGVTYWZlfSBhbmQge0BsaW5rIHBhcnNlTWV0YWRhdGF9IGJleW9uZCBPYnNpZGlhbidzXG4gKiBuYXRpdmUgbWV0YWRhdGEgcGFyc2luZy4gRWFjaCBvcHRpb24gaXMgb3B0LWluOyBlbmFibGluZyBpdCBhZGRzIHRoZSBjb3JyZXNwb25kaW5nXG4gKiB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmV9IGFuZCBwb3B1bGF0ZXMgdGhlIG1hdGNoaW5nIGxpbmtzIGFycmF5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlQ2FjaGVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcGFyc2UgdGhlIGV4dGVybmFsIGxpbmtzIGZyb20gdGhlIG5vdGUgY29udGVudCBib2R5LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRQYXJzZUV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHBhcnNlIHRoZSBleHRlcm5hbCBsaW5rcyBmcm9tIHNpbmdsZS1saW5rIChzaW5nbGUtdmFsdWUpIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRQYXJzZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcGFyc2UgdGhlIGV4dGVybmFsIGxpbmtzIGZyb20gbXVsdGktbGluayAobXVsdGktdmFsdWUpIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRQYXJzZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHBhcnNlIHRoZSBpbnRlcm5hbCBsaW5rcyBmcm9tIG11bHRpLWxpbmsgKG11bHRpLXZhbHVlKSBub3RlIGZyb250bWF0dGVyIHZhbHVlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUGFyc2VNdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHBhcnNlTWV0YWRhdGF9LlxuICovXG5leHBvcnQgdHlwZSBQYXJzZU1ldGFkYXRhT3B0aW9ucyA9IFBhcnNlQ2FjaGVPcHRpb25zO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgZmlsZSBjYWNoZSB0byByZWdpc3Rlci5cbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlOiBDYWNoZWRNZXRhZGF0YTtcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZmlsZSB0byByZWdpc3RlciB0aGUgZmlsZSBjYWNoZSBmb3IuXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFRoZSBzbGljZSBvZiBgQWR2YW5jZWQgTWV0YWRhdGEgQ2FjaGVgJ3MgcHVibGlzaGVkIEFQSSB0aGlzIG1vZHVsZSBjYWxscywgZGVjbGFyZWQgaGVyZSByYXRoZXIgdGhhbiBpbXBvcnRlZCxcbiAqIGJlY2F1c2UgdGhhdCBwbHVnaW4gaXMgbm90IGEgZGVwZW5kZW5jeSAocnVsZSBMOSBpbiBgQUdFTlRTLm1kYCkuIEl0cyBgYXBpLmQudHNgIGRlY2xhcmVzIHRoZSB3aG9sZSBvZiBpdC5cbiAqL1xuaW50ZXJmYWNlIEFkdmFuY2VkTWV0YWRhdGFDYWNoZUJhY2tsaW5rc0FwaSB7XG4gIC8qKlxuICAgKiBBbnN3ZXJzIGZyb20gdGhlIHBsdWdpbidzIGJhY2tsaW5rIGNhY2hlLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2JqZWN0LlxuICAgKiBAcmV0dXJucyBUaGUgYmFja2xpbmtzLCBvciBgbnVsbGAgd2hpbGUgdGhlIHBsdWdpbidzIGBCYWNrbGlua3NgIG1vZHVsZSBpcyBvZmYuXG4gICAqL1xuICByZWFkb25seSBnZXRCYWNrbGlua3NGb3JGaWxlOiAocGF0aE9yRmlsZTogUGF0aE9yRmlsZSkgPT4gQ3VzdG9tQXJyYXlEaWN0PFJlZmVyZW5jZT4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBbnN3ZXJzIGZyb20gdGhlIHBsdWdpbidzIGJhY2tsaW5rIGNhY2hlIG9uY2UgdGhlIHBlbmRpbmcgZmlsZSBjaGFuZ2VzIGhhdmUgYmVlbiBwcm9jZXNzZWQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvYmplY3QuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGJhY2tsaW5rcywgb3IgdG8gYG51bGxgIHdoaWxlIHRoZSBwbHVnaW4ncyBgQmFja2xpbmtzYFxuICAgKiAgIG1vZHVsZSBpcyBvZmYuXG4gICAqL1xuICByZWFkb25seSBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZTogKHBhdGhPckZpbGU6IFBhdGhPckZpbGUpID0+IFByb21pc2U8Q3VzdG9tQXJyYXlEaWN0PFJlZmVyZW5jZT4gfCBudWxsPjtcbn1cblxuLyoqXG4gKiBBIHNlbGVjdG9yIGZvciBhIGZlYXR1cmUtZ2F0ZWQgbGluayBjYXRlZ29yeSBpbiB7QGxpbmsgZ2V0TGlua3N9LlxuICovXG5pbnRlcmZhY2UgRmVhdHVyZUxpbmtTZWxlY3RvciB7XG4gIC8qKlxuICAgKiBBIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBsaW5rIGNhdGVnb3J5LCB1c2VkIGluIGVycm9yIG1lc3NhZ2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZlYXR1cmUgdGhhdCBtdXN0IGJlIHByZXNlbnQgaW4gdGhlIGNhY2hlIGZvciB0aGlzIGNhdGVnb3J5IHRvIGJlIGF2YWlsYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IGZlYXR1cmU6IENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlO1xuXG4gIC8qKlxuICAgKiBTZWxlY3RzIHRoZSBsaW5rcyBmb3IgdGhpcyBjYXRlZ29yeSBmcm9tIHRoZSBjYWNoZS5cbiAgICovXG4gIHJlYWRvbmx5IHNlbGVjdDogKGNhY2hlOiBDYWNoZWRNZXRhZGF0YUV4KSA9PiBSZWZlcmVuY2VbXSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoaXMgY2F0ZWdvcnkuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHRvUGFyc2VkQ2FjaGVkTWV0YWRhdGFFeH0uXG4gKi9cbmludGVyZmFjZSBUb1BhcnNlZENhY2hlZE1ldGFkYXRhRXhQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHBsYWluIGNhY2hlZCBtZXRhZGF0YSB0byB3cmFwLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGU6IENhY2hlZE1ldGFkYXRhO1xuXG4gIC8qKlxuICAgKiBUaGUgbm90ZSBjb250ZW50IHRoZSBvZmZzZXRzIGluZGV4IGludG8sIHVzZWQgZm9yIGJvZHkgZXh0ZXJuYWwtbGluayBwYXJzaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFyc2Ugb3B0aW9ucyBjb250cm9sbGluZyB3aGljaCBsaW5rcyB0byBwYXJzZS5cbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbnM6IFBhcnNlQ2FjaGVPcHRpb25zO1xufVxuXG4vKipcbiAqIFRoZSBwbHVnaW4gaWQgb2YgdGhlIGBBZHZhbmNlZCBNZXRhZGF0YSBDYWNoZWAgcGx1Z2luLCB0aGUgc3VjY2Vzc29yIHRvIGBCYWNrbGluayBDYWNoZWAuXG4gKlxuICogVXNlZCBieSB7QGxpbmsgaGFzQmFja2xpbmtDYWNoZVBsdWdpbn0sIGFuZCBhcyB0aGUgcHJvdmlkZXIgaWQgdW5kZXIgd2hpY2gge0BsaW5rIGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGh9IGFuZCB7QGxpbmsgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmV9IGxvb2sgdXAgdGhlIHBsdWdpbidzIHB1Ymxpc2hlZCBBUEkuXG4gKi9cbmV4cG9ydCBjb25zdCBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9QTFVHSU5fSUQgPSAnYWR2YW5jZWQtbWV0YWRhdGEtY2FjaGUnO1xuXG4vKipcbiAqIFRoZSBjb250cmFjdCB2ZXJzaW9ucyBvZiBgQWR2YW5jZWQgTWV0YWRhdGEgQ2FjaGVgJ3MgQVBJIHRoaXMgbW9kdWxlIGNvbXBpbGVkIGFnYWluc3QuIGAxLjMuMGAgaXMgdGhlIGZpcnN0IHRvIGNhcnJ5IHRoZSB0d28gYmFja2xpbmsgbWV0aG9kcy5cbiAqL1xuY29uc3QgQURWQU5DRURfTUVUQURBVEFfQ0FDSEVfQkFDS0xJTktTX0FQSV9WRVJTSU9OX1JBTkdFID0gJ14xLjMuMCc7XG5cbi8qKlxuICogVGhlIHNjaGVtYXMgb2YgYSBiYWNrbGluayBtZXRob2QncyBwYXlsb2FkczogdGhlIG9uZSBwYXRoLW9yLWZpbGUgYXJndW1lbnQsIGFuZCB0aGUgYmFja2xpbmtzIG9yIGBudWxsYC5cbiAqXG4gKiBBIGNvcHkgb2YgdGhlIGBnZXRCYWNrbGlua3NGb3JGaWxlYCBhbmQgYGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlYCBlbnRyaWVzIG9mIGBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9BUElfQ09OVFJBQ1RgLCB3aGljaCBgQWR2YW5jZWQgTWV0YWRhdGEgQ2FjaGVgIHNoaXBzIGFzXG4gKiBpdHMgcm9vdCBgYXBpLWNvbnRyYWN0LnRzYCBhbmQgcHVibGlzaGVzLiBLZWVwIHRoZSBndWFyZHMgaW4gYWdyZWVtZW50IHdpdGggdGhhdCBmaWxlLCBzbyB0aGUgcHJvdmlkZXIgYW5kIHRoaXMgY29uc3VtZXIgY2hlY2sgb25lIGRlZmluaXRpb24uXG4gKi9cbmNvbnN0IEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX0JBQ0tMSU5LU19NRVRIT0RfQ09OVFJBQ1QgPSB7XG4gIGlucHV0OiBjcmVhdGVBcmd1bWVudHNTY2hlbWE8W3BhdGhPckZpbGU6IFBhdGhPckZpbGVdPihbeyBleHBlY3RlZDogJ2EgcGF0aCBvciBhIGZpbGUnLCB0eXBlR3VhcmQ6IGlzUGF0aE9yRmlsZSB9XSksXG4gIG91dHB1dDogY3JlYXRlVHlwZUd1YXJkU2NoZW1hKHsgZXhwZWN0ZWQ6ICdhIGJhY2tsaW5rcyBkaWN0aW9uYXJ5IG9yIG51bGwnLCB0eXBlR3VhcmQ6IGlzTnVsbGFibGVCYWNrbGlua3NEaWN0IH0pXG59O1xuXG4vKipcbiAqIFRoZSBjb250cmFjdCBvZiB0aGUgbWVtYmVycyBvZiBgQWR2YW5jZWQgTWV0YWRhdGEgQ2FjaGVgJ3MgQVBJIHRoaXMgbW9kdWxlIGNhbGxzLCBzbyBhIHJlY29yZCB0aGF0IGxhY2tzIGVpdGhlciBpcyBwYXNzZWQgb3ZlciwgYW5kIGEgcGF5bG9hZCB0aGF0IGJyZWFrcyBpdHMgc2lnbmF0dXJlIGlzIHJlcG9ydGVkIHdoaWxlIHRoZSBgb2JzaWRpYW4tbGliOnZhbGlkYXRlLXBsdWdpbi1hcGktcGF5bG9hZHNgIGRlYnVnIHN3aXRjaCBpcyBvbi5cbiAqL1xuY29uc3QgQURWQU5DRURfTUVUQURBVEFfQ0FDSEVfQkFDS0xJTktTX0FQSV9DT05UUkFDVDogQXBpQ29udHJhY3Q8QWR2YW5jZWRNZXRhZGF0YUNhY2hlQmFja2xpbmtzQXBpPiA9IHtcbiAgZ2V0QmFja2xpbmtzRm9yRmlsZTogQURWQU5DRURfTUVUQURBVEFfQ0FDSEVfQkFDS0xJTktTX01FVEhPRF9DT05UUkFDVCxcbiAgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmU6IEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX0JBQ0tMSU5LU19NRVRIT0RfQ09OVFJBQ1Rcbn07XG5cbi8qKlxuICogVGhlIHBsdWdpbiBpZCBvZiB0aGUgcmV0aXJlZCBgQmFja2xpbmsgQ2FjaGVgIHBsdWdpbiwgc3VwZXJzZWRlZCBieSB7QGxpbmsgQURWQU5DRURfTUVUQURBVEFfQ0FDSEVfUExVR0lOX0lEfS5cbiAqXG4gKiBTdGlsbCByZWNvZ25pemVkIGJ5IHtAbGluayBoYXNCYWNrbGlua0NhY2hlUGx1Z2lufSwgZGVsaWJlcmF0ZWx5LiBSZW1vdmluZyBhIHBsdWdpbiBmcm9tIHRoZSBjb21tdW5pdHkgcmVnaXN0cnkgYmxvY2tzIG5ldyBpbnN0YWxsczsgaXQgdW5pbnN0YWxscyBub3RoaW5nLCBzbyBldmVyeSBleGlzdGluZyB1c2VyIGtlZXBzIGl0IHVudGlsIHRoZXkgbWlncmF0ZSBieSBoYW5kLlxuICpcbiAqIEl0IG1heSBiZSBkcm9wcGVkIHdoZW4gYWxsIHRocmVlIG9mIHRoZSBmb2xsb3dpbmcgaG9sZCwgYW5kIG5vdCBiZWZvcmU6IGBBZHZhbmNlZCBNZXRhZGF0YSBDYWNoZWAgaXMgbGlzdGVkIGluIHRoZSBjb21tdW5pdHkgcmVnaXN0cnksIHNvIG1pZ3JhdGluZyBpcyBwb3NzaWJsZSBhdCBhbGw7IHRoZSBmaW5hbCBgQmFja2xpbmsgQ2FjaGVgIGhhbmRvdmVyIHJlbGVhc2UgaGFzIGJlZW4gb3V0IGZvciBhdCBsZWFzdCB0d2VsdmUgbW9udGhzOyBhbmQgdGhpcyBsaWJyYXJ5IGlzIGN1dHRpbmcgYSBtYWpvciByZWxlYXNlIGFueXdheSwgYmVjYXVzZSBkcm9wcGluZyB0aGUgaWQgc2lsZW50bHkgdW4tZ2F0ZXMgY2FudmFzIGxpbmsgaGFuZGxpbmcgZm9yIGFueW9uZSB3aG8gaGFzIG5vdCBtaWdyYXRlZC4gVGhlcmUgaXMgbm8gY29zdCBwcmVzc3VyZSB0byBkcm9wIGl0IGVhcmxpZXIgLSByZWNvZ25pemluZyBhIGRlYWQgaWQgaXMgb25lIHN0cmluZyBjb21wYXJpc29uIG9uIGEgcGF0aCB0aGF0IGFscmVhZHkgcmVhZHMgYSBwbHVnaW4gcmVnaXN0cnkuXG4gKi9cbmV4cG9ydCBjb25zdCBCQUNLTElOS19DQUNIRV9QTFVHSU5fSUQgPSAnYmFja2xpbmstY2FjaGUnO1xuXG4vKipcbiAqIEVuc3VyZXMgdGhhdCB0aGUgbWV0YWRhdGEgY2FjaGUgaXMgcmVhZHkgZm9yIGFsbCBmaWxlcy5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbWV0YWRhdGEgY2FjaGUgaXMgcmVhZHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVNZXRhZGF0YUNhY2hlUmVhZHkoYXBwOiBBcHApOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBhcHAubWV0YWRhdGFDYWNoZS5vbkNsZWFuQ2FjaGUocmVzb2x2ZSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgYmFja2xpbmtzIGZvciBhIGZpbGUgb3IgcGF0aC5cbiAqIE5PVEU6IFRoZSBmaWxlIG1heSBiZSBub24tZXhpc3RlbnQuXG4gKlxuICogV2hlbiBgQWR2YW5jZWQgTWV0YWRhdGEgQ2FjaGVgIHB1Ymxpc2hlcyBpdHMgYmFja2xpbmtzIEFQSSBhbmQgaXRzIGBCYWNrbGlua3NgIG1vZHVsZSBpcyBvbiwgaXRzIGNhY2hlIGFuc3dlcnMuXG4gKiBPdGhlcndpc2UgdGhlIGFuc3dlciBjb21lcyBmcm9tIGEgYmFja2xpbmsgaW5kZXggd2hvc2UgY29zdCBpcyBwcm9wb3J0aW9uYWwgdG8gdGhlIGNhbmRpZGF0ZSBub3RlcyByYXRoZXIgdGhhblxuICogdG8gZXZlcnkgcmVmZXJlbmNlIGluIHRoZSB2YXVsdCwgYW5kIHdoaWNoIGdpdmVzIHRoZSBzYW1lIHJlZmVyZW5jZXMgT2JzaWRpYW4ncyBvd24gYGdldEJhY2tsaW5rc0ZvckZpbGVgIGdpdmVzLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2JqZWN0LlxuICogQHJldHVybnMgVGhlIGJhY2tsaW5rcyBmb3IgdGhlIGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRCYWNrbGlua3NGb3JGaWxlT3JQYXRoKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogQ3VzdG9tQXJyYXlEaWN0PFJlZmVyZW5jZT4ge1xuICBjb25zdCBmaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZSwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICB1c2luZyBfcmVnaXN0cmF0aW9uID0gcmVnaXN0ZXJGaWxlcyhhcHAsIFtmaWxlXSk7XG4gIHJldHVybiBmaW5kQWR2YW5jZWRNZXRhZGF0YUNhY2hlQmFja2xpbmtzQXBpKCk/LmdldEJhY2tsaW5rc0ZvckZpbGUoZmlsZSkgPz8gZ2V0SW5kZXhlZEJhY2tsaW5rc0ZvckZpbGUoYXBwLCBmaWxlKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGJhY2tsaW5rcyBmb3IgYSBmaWxlIHNhZmVseS5cbiAqXG4gKiBXaGVuIGBBZHZhbmNlZCBNZXRhZGF0YSBDYWNoZWAgcHVibGlzaGVzIGl0cyBiYWNrbGlua3MgQVBJIGFuZCBpdHMgYEJhY2tsaW5rc2AgbW9kdWxlIGlzIG9uLCB0aGF0IEFQSSBhbnN3ZXJzLlxuICpcbiAqIE90aGVyd2lzZSB0aGlzIGlzIE5PVCBhIHB1cmUgcmVhZC4gSXQgdmVyaWZpZXNcbiAqIGVhY2ggYmFja2xpbmsgYWdhaW5zdCB0aGUgbm90ZSdzIGN1cnJlbnQgdGV4dCwgYW5kIHRvIGRvIHRoYXQgaXQgY2FsbHMge0BsaW5rIHNhdmVOb3RlfSBvbiBldmVyeVxuICogbm90ZSB0aGF0IGxpbmtzIHRvIHRoZSBmaWxlLCB3aGljaCBzYXZlcyBhbnkgb3BlbiBlZGl0b3IgdmlldyBvZiB0aG9zZSBub3RlcyB0aGF0IGhhcyB1bnNhdmVkXG4gKiBjaGFuZ2VzLiBDYWxsIGl0IGZyb20gYW4gZXhwbGljaXQgdXNlciBhY3Rpb24uIERvIG5vdCBjYWxsIGl0IGZyb20gYW4gYXV0b21hdGljIHRyaWdnZXIgKGEgdmF1bHQgb3JcbiAqIG1ldGFkYXRhIGV2ZW50LCBhIHNhdmUgb3IgcmVuZGVyIHBhdGNoKSB0aGF0IG9ubHkgZGVjaWRlcyB3aGV0aGVyIHRvIGFjdC4gVGhlcmUsIGEgZm9yY2VkIHNhdmUgY2FuXG4gKiByYWNlIGFub3RoZXIgcGx1Z2luJ3MgaW4tZmxpZ2h0IGVkaXRvciBjaGFuZ2UuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciByZXRyaWV2aW5nIHRoZSBiYWNrbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IGRpY3Rpb25hcnkgb2YgYmFja2xpbmtzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUocGFyYW1zOiBHZXRCYWNrbGlua3NGb3JGaWxlU2FmZVBhcmFtcyk6IFByb21pc2U8Q3VzdG9tQXJyYXlEaWN0PFJlZmVyZW5jZT4+IHtcbiAgY29uc3QgeyBhcHAsIHBhdGhPckZpbGUsIC4uLm9wdGlvbnMgfSA9IHBhcmFtcztcbiAgY29uc3QgY2FjaGVkQmFja2xpbmtzID0gYXdhaXQgZmluZEFkdmFuY2VkTWV0YWRhdGFDYWNoZUJhY2tsaW5rc0FwaSgpPy5nZXRCYWNrbGlua3NGb3JGaWxlU2FmZShwYXRoT3JGaWxlKTtcbiAgaWYgKGNhY2hlZEJhY2tsaW5rcykge1xuICAgIHJldHVybiBjYWNoZWRCYWNrbGlua3M7XG4gIH1cblxuICBsZXQgYmFja2xpbmtzOiBDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlPiA9IG5ldyBDdXN0b21BcnJheURpY3RJbXBsPFJlZmVyZW5jZT4oKTtcbiAgYXdhaXQgcmV0cnlXaXRoVGltZW91dE5vdGljZSh7XG4gICAgYXN5bmMgb3BlcmF0aW9uRnVuY3Rpb24oYWJvcnRTaWduYWwpIHtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBjb25zdCBmaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZSB9KTtcbiAgICAgIGF3YWl0IGVuc3VyZU1ldGFkYXRhQ2FjaGVSZWFkeShhcHApO1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGJhY2tsaW5rcyA9IGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgoYXBwLCBmaWxlKTtcbiAgICAgIGZvciAoY29uc3Qgbm90ZVBhdGggb2YgYmFja2xpbmtzLmtleXMoKSkge1xuICAgICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBjb25zdCBub3RlID0gZ2V0RmlsZU9yTnVsbCh7IGFwcCwgcGF0aE9yRmlsZTogbm90ZVBhdGggfSk7XG4gICAgICAgIGlmICghbm90ZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEEgY2FudmFzIGhvbGRlciBjYW5ub3QgYmUgY2hlY2tlZCBhZ2FpbnN0IGl0cyB0ZXh0LiBJdHMgZmlsZS1ub2RlIHJlZmVyZW5jZXMgY2Fycnkgbm8gcG9zaXRpb24sIGFuZFxuICAgICAgICAvLyBPYnNpZGlhbiByZXBvcnRzIGEgdGV4dC1ub2RlIGVtYmVkIHdpdGggYSBwb3NpdGlvbiBpbnRvIHRoYXQgbm9kZSdzIG93biB0ZXh0LCBub3QgaW50byB0aGUgY2FudmFzIEpTT04sXG4gICAgICAgIC8vIHNvIHNsaWNpbmcgdGhlIGZpbGUgYXQgaXQgbmV2ZXIgZ2l2ZXMgdGhlIGxpbmsgYmFjayBhbmQgdGhlIHJldHJ5IHdvdWxkIG5ldmVyIGVuZC5cbiAgICAgICAgaWYgKGlzQ2FudmFzRmlsZShub3RlKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgc2F2ZU5vdGUoYXBwLCBub3RlKTtcbiAgICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZFNhZmUoYXBwLCBub3RlKTtcbiAgICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgaWYgKCFjb250ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxpbmtzID0gYmFja2xpbmtzLmdldChub3RlUGF0aCk7XG4gICAgICAgIGlmICghbGlua3MpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQYXJzZWQgb25seSB3aGVuIGEgZnJvbnRtYXR0ZXIgbGluayBuZWVkcyBpdDogYSBub3RlIHdob3NlIFlBTUwgZG9lcyBub3QgcGFyc2Ugc3RpbGwgaG9sZHMgYm9keSBsaW5rcyxcbiAgICAgICAgLy8gYW5kIGBudWxsYCBtYXJrcyBhIHBhcnNlIHRoYXQgZmFpbGVkLCBzbyBpdHMgZnJvbnRtYXR0ZXIgbGlua3MgYXJlIHNraXBwZWQgcmF0aGVyIHRoYW4gcmV0cmllZCBmb3JldmVyLlxuICAgICAgICBsZXQgZnJvbnRtYXR0ZXI6IENvbWJpbmVkRnJvbnRtYXR0ZXI8dW5rbm93bj4gfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKGNvbnN0IGxpbmsgb2YgbGlua3MpIHtcbiAgICAgICAgICBsZXQgYWN0dWFsTGluazogc3RyaW5nO1xuICAgICAgICAgIGlmIChpc1JlZmVyZW5jZUNhY2hlKGxpbmspKSB7XG4gICAgICAgICAgICBhY3R1YWxMaW5rID0gY29udGVudC5zbGljZShsaW5rLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCwgbGluay5wb3NpdGlvbi5lbmQub2Zmc2V0KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGUobGluaykpIHtcbiAgICAgICAgICAgIGlmIChmcm9udG1hdHRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGZyb250bWF0dGVyID0gcGFyc2VGcm9udG1hdHRlck9yTnVsbChjb250ZW50LCBub3RlUGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZnJvbnRtYXR0ZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0eVZhbHVlID0gZ2V0TmVzdGVkUHJvcGVydHlWYWx1ZShmcm9udG1hdHRlciwgbGluay5rZXkpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eVZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxpbmtXaXRoT2Zmc2V0cyA9IHRvRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0cyhsaW5rKTtcbiAgICAgICAgICAgIGFjdHVhbExpbmsgPSBwcm9wZXJ0eVZhbHVlLnNsaWNlKGxpbmtXaXRoT2Zmc2V0cy5zdGFydE9mZnNldCwgbGlua1dpdGhPZmZzZXRzLmVuZE9mZnNldCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYWN0dWFsTGluayAhPT0gZ2V0UmVmZXJlbmNlTGlua1RleHQobGluaykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBvcGVyYXRpb25OYW1lOiB0KCgkKSA9PiAkLm9ic2lkaWFuTGliLm1ldGFkYXRhQ2FjaGUuZ2V0QmFja2xpbmtzRm9yRmlsZVBhdGgsIHsgZmlsZVBhdGg6IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKSB9KSxcbiAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IG51bGwsXG4gICAgcmV0cnlPcHRpb25zOiBvcHRpb25zLFxuICAgIHNob3VsZFNob3dUaW1lb3V0Tm90aWNlOiBvcHRpb25zLnNob3VsZFNob3dUaW1lb3V0Tm90aWNlID8/IHRydWVcbiAgfSk7XG5cbiAgcmV0dXJuIGJhY2tsaW5rcztcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGNhY2hlZCBtZXRhZGF0YSBmb3IgYSBnaXZlbiBmaWxlIG9yIHBhdGguXG4gKlxuICogVGhpcyBpcyBOT1QgYSBwdXJlIHJlYWQ6IGJlZm9yZSBpdCByZWFkcyB0aGUgY2FjaGUsIGl0IGNhbGxzIHtAbGluayBzYXZlTm90ZX0sIHdoaWNoIHNhdmVzIGFueVxuICogb3BlbiBlZGl0b3IgdmlldyBvZiB0aGUgbm90ZSB0aGF0IGhhcyB1bnNhdmVkIGNoYW5nZXMuIFRoYXQgc2F2ZSBpcyB3aHkgdGhlIGNhY2hlIG1hdGNoZXMgd2hhdCB0aGVcbiAqIHVzZXIgc2VlcywgYW5kIHdoeSBhIGNvbW1hbmQgdGhhdCByZXdyaXRlcyB0aGUgbm90ZSBjYW4gdXNlIHRoaXMgc2FmZWx5IHdpdGhvdXQgaXRzIHJld3JpdGUgYmVpbmdcbiAqIGNsb2JiZXJlZC4gSXQgaXMgYWxzbyBhIHdyaXRlIG9uIHRoZSBub3RlLiBTbyBkbyBub3QgY2FsbCB0aGlzIGZyb20gYW4gYXV0b21hdGljIHRyaWdnZXIgKGEgdmF1bHRcbiAqIG9yIG1ldGFkYXRhIGV2ZW50LCBhIHNhdmUgb3IgcmVuZGVyIHBhdGNoLCBhIGxheW91dCBob29rKSB0aGF0IG9ubHkgZGVjaWRlcyB3aGV0aGVyIHRvIGFjdDogYVxuICogZm9yY2VkIHNhdmUgb25lIHRpY2sgYWZ0ZXIgYW5vdGhlciBwbHVnaW4gaGFzIGRpc3BhdGNoZWQgYSBjaGFuZ2UgaW50byB0aGUgZWRpdG9yIGNhbiBsZWF2ZVxuICogT2JzaWRpYW4ncyBlZGl0b3IgcmVuZGVyaW5nIHN0YWxlIHN0YXRlLiBBIHJlYWQtb25seSBwcm9iZSBvbiB0aGUgbm90ZSdzIGN1cnJlbnQgdGV4dCBzaG91bGQgdXNlXG4gKiB7QGxpbmsgcGFyc2VNZXRhZGF0YX0gb24gdGhhdCB0ZXh0IGluc3RlYWQuIEl0IG5lZWRzIG5vIHZpZXcsIG5vIGNhY2hlIGFuZCBubyBzYXZlLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIGZpbGVPclBhdGggLSBUaGUgZmlsZSBvciBwYXRoIHRvIHJldHJpZXZlIHRoZSBtZXRhZGF0YSBmb3IuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJzZSBvcHRpb25zIGNvbnRyb2xsaW5nIHdoaWNoIGFkZGl0aW9uYWwgbGlua3MgdG8gcGFyc2UuXG4gKiBAcmV0dXJucyBUaGUgY2FjaGVkIG1ldGFkYXRhIGZvciB0aGUgZmlsZSwgb3IgYG51bGxgIGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDYWNoZVNhZmUoYXBwOiBBcHAsIGZpbGVPclBhdGg6IFBhdGhPckZpbGUsIG9wdGlvbnM6IEdldENhY2hlU2FmZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8Q2FjaGVkTWV0YWRhdGFFeCB8IG51bGw+IHtcbiAgY29uc3QgZmlsZSA9IGdldEZpbGVPck51bGwoeyBhcHAsIHBhdGhPckZpbGU6IGZpbGVPclBhdGggfSk7XG5cbiAgdHJ5IHtcbiAgICBpZiAoIWZpbGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCBjYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICAgIGlmIChmaWxlLmRlbGV0ZWQpIHtcbiAgICAgIGNhY2hlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBzYXZlTm90ZShhcHAsIGZpbGUpO1xuXG4gICAgICBjb25zdCBmaWxlQ2FjaGVFbnRyeSA9IGFwcC5tZXRhZGF0YUNhY2hlLmZpbGVDYWNoZVtmaWxlLnBhdGhdO1xuICAgICAgY29uc3QgaXNVcFRvRGF0ZSA9IGZpbGVDYWNoZUVudHJ5Py5tdGltZSA9PT0gZmlsZS5zdGF0Lm10aW1lXG4gICAgICAgICYmIGZpbGVDYWNoZUVudHJ5LnNpemUgPT09IGZpbGUuc3RhdC5zaXplXG4gICAgICAgICYmIE9iamVjdC5oYXNPd24oYXBwLm1ldGFkYXRhQ2FjaGUubWV0YWRhdGFDYWNoZSwgZmlsZUNhY2hlRW50cnkuaGFzaCk7XG4gICAgICBpZiAoIWlzVXBUb0RhdGUpIHtcbiAgICAgICAgYXdhaXQgYXBwLm1ldGFkYXRhQ2FjaGUuY29tcHV0ZUZpbGVNZXRhZGF0YUFzeW5jKGZpbGUpO1xuICAgICAgICBhd2FpdCBlbnN1cmVNZXRhZGF0YUNhY2hlUmVhZHkoYXBwKTtcbiAgICAgIH1cbiAgICAgIGNhY2hlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpO1xuICAgIH1cblxuICAgIGlmIChjYWNoZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gT25seSB0aGUgYm9keS1leHRlcm5hbCBwYXJzZSBuZWVkcyB0aGUgZmlsZSBjb250ZW50OyBmcm9udG1hdHRlciBwYXJzaW5nIHVzZXMgdGhlIGNhY2hlZFxuICAgIC8vIGZyb250bWF0dGVyLCBzbyBhdm9pZCByZWFkaW5nIHRoZSBjb250ZW50IHVubGVzcyBpdCBpcyBhY3R1YWxseSBuZWVkZWQuXG4gICAgY29uc3QgY29udGVudCA9IG9wdGlvbnMuc2hvdWxkUGFyc2VFeHRlcm5hbExpbmtzID8gYXdhaXQgYXBwLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSkgOiAnJztcbiAgICByZXR1cm4gdG9QYXJzZWRDYWNoZWRNZXRhZGF0YUV4KHsgY2FjaGUsIGNvbnRlbnQsIG9wdGlvbnMgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCFmaWxlIHx8IGZpbGUuZGVsZXRlZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGZyb250IG1hdHRlciBmcm9tIHRoZSBtZXRhZGF0YSBjYWNoZSBzYWZlbHkuXG4gKlxuICogSXQgcmVhZHMgdGhyb3VnaCB7QGxpbmsgZ2V0Q2FjaGVTYWZlfSwgc28gaXQgc2F2ZXMgYW55IG9wZW4gZWRpdG9yIHZpZXcgb2YgdGhlIG5vdGUgdGhhdCBoYXNcbiAqIHVuc2F2ZWQgY2hhbmdlcy4gU2VlIHtAbGluayBnZXRDYWNoZVNhZmV9IGZvciB3aGVuIHRoYXQgc2F2ZSBtYXR0ZXJzIGFuZCB3aGF0IHRvIHVzZSBpbnN0ZWFkLlxuICpcbiAqIEB0eXBlUGFyYW0gQ3VzdG9tRnJvbnRtYXR0ZXIgLSBUaGUgdHlwZSBvZiBjdXN0b20gZnJvbnQgbWF0dGVyLlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gcmV0cmlldmUgdGhlIGZyb250IG1hdHRlciBmcm9tLlxuICogQHJldHVybnMgVGhlIGNvbWJpbmVkIGZyb250IG1hdHRlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEZyb250bWF0dGVyU2FmZTxDdXN0b21Gcm9udG1hdHRlciA9IHVua25vd24+KGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogUHJvbWlzZTxDb21iaW5lZEZyb250bWF0dGVyPEN1c3RvbUZyb250bWF0dGVyPj4ge1xuICBjb25zdCBjYWNoZSA9IGF3YWl0IGdldENhY2hlU2FmZShhcHAsIHBhdGhPckZpbGUpO1xuICByZXR1cm4gKGNhY2hlPy5mcm9udG1hdHRlciA/PyB7fSkgYXMgQ29tYmluZWRGcm9udG1hdHRlcjxDdXN0b21Gcm9udG1hdHRlcj47XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBzZWxlY3RlZCBsaW5rcyBmcm9tIHRoZSBwcm92aWRlZCBjYWNoZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHJldHJpZXZpbmcgdGhlIGxpbmtzLlxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgcmVmZXJlbmNlcyByZXByZXNlbnRpbmcgdGhlIHNlbGVjdGVkIGxpbmtzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGlua3MocGFyYW1zOiBHZXRMaW5rc1BhcmFtcyk6IFJlZmVyZW5jZVtdIHtcbiAgY29uc3Qge1xuICAgIGNhY2hlLFxuICAgIHNob3VsZEluY2x1ZGVFbWJlZHMgPSB0cnVlLFxuICAgIHNob3VsZEluY2x1ZGVFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgc2hvdWxkSW5jbHVkZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckxpbmtzID0gdHJ1ZSxcbiAgICBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEluY2x1ZGVSZWZlcmVuY2VzID0gdHJ1ZVxuICB9ID0gcGFyYW1zO1xuXG4gIGxldCBsaW5rczogUmVmZXJlbmNlW10gPSBbXG4gICAgLi4uKHNob3VsZEluY2x1ZGVSZWZlcmVuY2VzID8gY2FjaGUubGlua3MgPz8gW10gOiBbXSksXG4gICAgLi4uKHNob3VsZEluY2x1ZGVFbWJlZHMgPyBjYWNoZS5lbWJlZHMgPz8gW10gOiBbXSksXG4gICAgLi4uKHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckxpbmtzID8gY2FjaGUuZnJvbnRtYXR0ZXJMaW5rcyA/PyBbXSA6IFtdKVxuICBdO1xuXG4gIGNvbnN0IGZlYXR1cmVMaW5rU2VsZWN0b3JzOiBGZWF0dXJlTGlua1NlbGVjdG9yW10gPSBbXG4gICAge1xuICAgICAgZGVzY3JpcHRpb246ICdib2R5IGV4dGVybmFsIGxpbmtzJyxcbiAgICAgIGZlYXR1cmU6IENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLkV4dGVybmFsTGlua3MsXG4gICAgICBzZWxlY3Q6IChjYWNoZUV4KSA9PiBjYWNoZUV4LmV4dGVybmFsTGlua3MsXG4gICAgICBzaG91bGRJbmNsdWRlOiBzaG91bGRJbmNsdWRlRXh0ZXJuYWxMaW5rc1xuICAgIH0sXG4gICAge1xuICAgICAgZGVzY3JpcHRpb246ICdmcm9udG1hdHRlciBleHRlcm5hbCBsaW5rcycsXG4gICAgICBmZWF0dXJlOiBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5Gcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICBzZWxlY3Q6IChjYWNoZUV4KSA9PiBjYWNoZUV4LmZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgIHNob3VsZEluY2x1ZGU6IHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckV4dGVybmFsTGlua3NcbiAgICB9LFxuICAgIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnbXVsdGktdmFsdWUgZnJvbnRtYXR0ZXIgZXh0ZXJuYWwgbGlua3MnLFxuICAgICAgZmVhdHVyZTogQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgIHNlbGVjdDogKGNhY2hlRXgpID0+IGNhY2hlRXgubXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgIHNob3VsZEluY2x1ZGU6IHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzXG4gICAgfSxcbiAgICB7XG4gICAgICBkZXNjcmlwdGlvbjogJ211bHRpLXZhbHVlIGZyb250bWF0dGVyIGxpbmtzJyxcbiAgICAgIGZlYXR1cmU6IENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLk11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzLFxuICAgICAgc2VsZWN0OiAoY2FjaGVFeCkgPT4gY2FjaGVFeC5tdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcyxcbiAgICAgIHNob3VsZEluY2x1ZGU6IHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rc1xuICAgIH1cbiAgXTtcblxuICBmb3IgKGNvbnN0IGZlYXR1cmVMaW5rU2VsZWN0b3Igb2YgZmVhdHVyZUxpbmtTZWxlY3RvcnMpIHtcbiAgICBpZiAoIWZlYXR1cmVMaW5rU2VsZWN0b3Iuc2hvdWxkSW5jbHVkZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFpc0NhY2hlZE1ldGFkYXRhRXgoY2FjaGUpIHx8ICFjYWNoZS5mZWF0dXJlcy5pbmNsdWRlcyhmZWF0dXJlTGlua1NlbGVjdG9yLmZlYXR1cmUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBpbmNsdWRlICR7ZmVhdHVyZUxpbmtTZWxlY3Rvci5kZXNjcmlwdGlvbn06IHRoZSBjYWNoZSB3YXMgbm90IGNvbXB1dGVkIHdpdGggdGhlICR7ZmVhdHVyZUxpbmtTZWxlY3Rvci5mZWF0dXJlfSBmZWF0dXJlLmApO1xuICAgIH1cblxuICAgIGxpbmtzLnB1c2goLi4uZW5zdXJlTm9uTnVsbGFibGUoZmVhdHVyZUxpbmtTZWxlY3Rvci5zZWxlY3QoY2FjaGUpKSk7XG4gIH1cblxuICBzb3J0UmVmZXJlbmNlcyhsaW5rcyk7XG5cbiAgLy8gQlVHOiBodHRwczovL2ZvcnVtLm9ic2lkaWFuLm1kL3QvYnVnLWR1cGxpY2F0ZWQtbGlua3MtaW4tbWV0YWRhdGFjYWNoZS1pbnNpZGUtZm9vdG5vdGVzLzg1NTUxXG4gIGxpbmtzID0gbGlua3MuZmlsdGVyKChsaW5rLCBpbmRleCkgPT4ge1xuICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgcHJldmlvdXNMaW5rID0gZW5zdXJlTm9uTnVsbGFibGUobGlua3NbaW5kZXggLSAxXSk7XG5cbiAgICBpZiAoaXNSZWZlcmVuY2VDYWNoZShsaW5rKSAmJiBpc1JlZmVyZW5jZUNhY2hlKHByZXZpb3VzTGluaykpIHtcbiAgICAgIHJldHVybiBsaW5rLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCAhPT0gcHJldmlvdXNMaW5rLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldDtcbiAgICB9XG5cbiAgICBpZiAoaXNGcm9udG1hdHRlckxpbmtDYWNoZShsaW5rKSAmJiBpc0Zyb250bWF0dGVyTGlua0NhY2hlKHByZXZpb3VzTGluaykpIHtcbiAgICAgIGNvbnN0IGxpbmtTdGFydE9mZnNldCA9IGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0cyhsaW5rKSA/IGxpbmsuc3RhcnRPZmZzZXQgOiAwO1xuICAgICAgY29uc3QgcHJldmlvdXNMaW5rU3RhcnRPZmZzZXQgPSBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMocHJldmlvdXNMaW5rKSA/IHByZXZpb3VzTGluay5zdGFydE9mZnNldCA6IDA7XG4gICAgICByZXR1cm4gbGluay5rZXkgIT09IHByZXZpb3VzTGluay5rZXkgfHwgaXNGcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzKGxpbmspICE9PSBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMocHJldmlvdXNMaW5rKVxuICAgICAgICB8fCBsaW5rU3RhcnRPZmZzZXQgIT09IHByZXZpb3VzTGlua1N0YXJ0T2Zmc2V0O1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gbGlua3M7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgYmFja2xpbmsgY2FjaGUgcGx1Z2luIGlzIGN1cnJlbnRseSBsb2FkZWQgLSBlaXRoZXIgYEFkdmFuY2VkIE1ldGFkYXRhIENhY2hlYCAoe0BsaW5rIEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX1BMVUdJTl9JRH0pIG9yIGl0cyByZXRpcmVkIHByZWRlY2Vzc29yIGBCYWNrbGluayBDYWNoZWAgKHtAbGluayBCQUNLTElOS19DQUNIRV9QTFVHSU5fSUR9KS5cbiAqXG4gKiBTdWNoIGEgcGx1Z2luIGtlZXBzIGEgZHJhaW4tb24tcmVhZCBiYWNrbGluayBpbmRleCBhbmQgaW5kZXhlcyBjYW52YXMgbWV0YWRhdGEsIHNvIGEgY2FsbGVyIHRoYXQgY29tcGVuc2F0ZXMgZm9yIE9ic2lkaWFuJ3Mgb3duIGdhcHMgY2FuIHN0YW5kIGRvd24gd2hpbGUgb25lIGlzIHByZXNlbnQuIEJvdGggaWRzIGFyZSByZWNvZ25pemVkOyB7QGxpbmsgQkFDS0xJTktfQ0FDSEVfUExVR0lOX0lEfSByZWNvcmRzIHdoZW4gdGhlIHJldGlyZWQgb25lIG1heSBiZSBkcm9wcGVkLlxuICpcbiAqIFRoaXMgcmVhZHMgdGhlIExPQURFRCBwbHVnaW4gaW5zdGFuY2UgcmF0aGVyIHRoYW4gYGFwcC5wbHVnaW5zLmVuYWJsZWRQbHVnaW5zYCwgZGVsaWJlcmF0ZWx5OiB0aGUgcXVlc3Rpb24gaXMgd2hldGhlciB0aGUgcGx1Z2luJ3MgcGF0Y2hlcyBhcmUgaW4gcGxhY2UgcmlnaHQgbm93LCBhbmQgdGhleSBhcmUgbm90IHVudGlsIGl0IGhhcyBsb2FkZWQuIFBsdWdpbnMgbG9hZCBpbiBhbiB1bnNwZWNpZmllZCBvcmRlciwgc28gY2FsbCB0aGlzIGZyb20gYSB1c2VyLWRyaXZlbiBwYXRoIHJhdGhlciB0aGFuIGZyb20gcGx1Z2luIGxvYWQgLSBzZWUgcnVsZSBMMjUgaW4gYEFHRU5UUy5tZGAuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYSBiYWNrbGluayBjYWNoZSBwbHVnaW4gaXMgbG9hZGVkLCBvdGhlcndpc2UgYGZhbHNlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0JhY2tsaW5rQ2FjaGVQbHVnaW4oYXBwOiBBcHApOiBib29sZWFuIHtcbiAgcmV0dXJuIGFwcC5wbHVnaW5zLmdldFBsdWdpbihBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9QTFVHSU5fSUQpICE9PSBudWxsIHx8IGFwcC5wbHVnaW5zLmdldFBsdWdpbihCQUNLTElOS19DQUNIRV9QTFVHSU5fSUQpICE9PSBudWxsO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIGNhY2hlIGlzIGEge0BsaW5rIENhY2hlZE1ldGFkYXRhRXh9IChpLmUuIGl0IHdhcyBjb21wdXRlZCB3aXRoIGV4dGVybmFsLWxpbmtcbiAqIHBhcnNpbmcgZW5hYmxlZCkuXG4gKlxuICogQHBhcmFtIGNhY2hlIC0gVGhlIGNhY2hlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBjYWNoZSBpcyBhIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4fSwgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NhY2hlZE1ldGFkYXRhRXgoY2FjaGU6IENhY2hlZE1ldGFkYXRhKTogY2FjaGUgaXMgQ2FjaGVkTWV0YWRhdGFFeCB7XG4gIHJldHVybiAnZmVhdHVyZXMnIGluIGNhY2hlO1xufVxuXG4vKipcbiAqIFBhcnNlcyB0aGUgbWV0YWRhdGEgZm9yIGEgZ2l2ZW4gc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtICRzdHJpbmcgLSBUaGUgc3RyaW5nIHRvIHBhcnNlIHRoZSBtZXRhZGF0YSBmb3IuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJzZSBvcHRpb25zIGNvbnRyb2xsaW5nIHdoaWNoIGFkZGl0aW9uYWwgbGlua3MgdG8gcGFyc2UuXG4gKiBAcmV0dXJucyBUaGUgcGFyc2VkIG1ldGFkYXRhLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyc2VNZXRhZGF0YShhcHA6IEFwcCwgJHN0cmluZzogc3RyaW5nLCBvcHRpb25zOiBQYXJzZU1ldGFkYXRhT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxDYWNoZWRNZXRhZGF0YUV4PiB7XG4gIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgY29uc3QgYnVmZmVyID0gZW5jb2Rlci5lbmNvZGUoJHN0cmluZykuYnVmZmVyO1xuICBjb25zdCBjYWNoZSA9IGF3YWl0IGFwcC5tZXRhZGF0YUNhY2hlLmNvbXB1dGVNZXRhZGF0YUFzeW5jKGJ1ZmZlcikgPz8ge307XG4gIHJldHVybiB0b1BhcnNlZENhY2hlZE1ldGFkYXRhRXgoeyBjYWNoZSwgY29udGVudDogJHN0cmluZywgb3B0aW9ucyB9KTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIGZpbGUgY2FjaGUgZm9yIGEgbm9uLWV4aXN0aW5nIGZpbGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciByZWdpc3RlcmluZyB0aGUgZmlsZSBjYWNoZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgdW5yZWdpc3RlcnMgdGhlIGZpbGUgY2FjaGUgd2hlbiBkaXNwb3NlZCwgZm9yIHVzZSB3aXRoIGB1c2luZ2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZShwYXJhbXM6IFJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlUGFyYW1zKTogRGlzcG9zYWJsZSB7XG4gIGNvbnN0IHsgYXBwLCBjYWNoZSwgcGF0aE9yRmlsZSB9ID0gcGFyYW1zO1xuICBjb25zdCBmaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZSwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICBpZiAoIWZpbGUuZGVsZXRlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmlsZSBpcyBleGlzdGluZycpO1xuICB9XG5cbiAgYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZUNhY2hlW2ZpbGUucGF0aF0gPSB7XG4gICAgaGFzaDogZmlsZS5wYXRoLFxuICAgIG10aW1lOiAwLFxuICAgIHNpemU6IDBcbiAgfTtcblxuICBhcHAubWV0YWRhdGFDYWNoZS5tZXRhZGF0YUNhY2hlW2ZpbGUucGF0aF0gPSBjYWNoZTtcblxuICByZXR1cm4gbmV3IENhbGxiYWNrRGlzcG9zYWJsZSh7XG4gICAgY2FsbGJhY2s6ICgpOiB2b2lkID0+IHtcbiAgICAgIHVucmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGUoYXBwLCBmaWxlKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBmaWxlcyBpbiB0aGUgT2JzaWRpYW4gYXBwLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIGZpbGVzIC0gVGhlIGZpbGVzIHRvIHJlZ2lzdGVyLlxuICogQHJldHVybnMgQSB7QGxpbmsgRGlzcG9zYWJsZX0gdGhhdCB1bnJlZ2lzdGVycyB0aGUgZmlsZXMgd2hlbiBkaXNwb3NlZCwgZm9yIHVzZSB3aXRoIGB1c2luZ2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckZpbGVzKGFwcDogQXBwLCBmaWxlczogVEFic3RyYWN0RmlsZVtdKTogRGlzcG9zYWJsZSB7XG4gIGNvbnN0IHJlZ2lzdGVyZWRGaWxlc0NvdW50cyA9IGdldFJlZ2lzdGVyZWRGaWxlc0NvdW50cygpO1xuXG4gIGZvciAobGV0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICB3aGlsZSAoZmlsZS5kZWxldGVkKSB7XG4gICAgICBsZXQgY291bnQgPSByZWdpc3RlcmVkRmlsZXNDb3VudHMuZ2V0KGZpbGUucGF0aCkgPz8gMDtcbiAgICAgIGNvdW50Kys7XG4gICAgICByZWdpc3RlcmVkRmlsZXNDb3VudHMuc2V0KGZpbGUucGF0aCwgY291bnQpO1xuXG4gICAgICBhcHAudmF1bHQuZmlsZU1hcFtmaWxlLnBhdGhdID0gZmlsZTtcblxuICAgICAgaWYgKGlzRmlsZShmaWxlKSkge1xuICAgICAgICBhcHAubWV0YWRhdGFDYWNoZS51bmlxdWVGaWxlTG9va3VwLmFkZChmaWxlLm5hbWUudG9Mb3dlckNhc2UoKSwgZmlsZSk7XG4gICAgICB9XG5cbiAgICAgIGZpbGUgPSBnZXRGb2xkZXIoe1xuICAgICAgICBhcHAsXG4gICAgICAgIHBhdGhPckZvbGRlcjogcGFyZW50Rm9sZGVyUGF0aChmaWxlLnBhdGgpLFxuICAgICAgICBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgQ2FsbGJhY2tEaXNwb3NhYmxlKHtcbiAgICBjYWxsYmFjazogKCk6IHZvaWQgPT4ge1xuICAgICAgdW5yZWdpc3RlckZpbGVzKGFwcCwgZmlsZXMpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogVW5yZWdpc3RlcnMgdGhlIGZpbGUgY2FjaGUgZm9yIGEgbm9uLWV4aXN0aW5nIGZpbGUuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gdW5yZWdpc3RlciB0aGUgZmlsZSBjYWNoZSBmb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gIGNvbnN0IGZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gIGlmICghZmlsZS5kZWxldGVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGaWxlIGlzIGV4aXN0aW5nJyk7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZSAtLSBXZSBoYXZlIG5vIG90aGVyIHdheSB0byBkZWxldGUgdGhlIHByb3BlcnR5LlxuICBkZWxldGUgYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZUNhY2hlW2ZpbGUucGF0aF07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGUgLS0gV2UgaGF2ZSBubyBvdGhlciB3YXkgdG8gZGVsZXRlIHRoZSBwcm9wZXJ0eS5cbiAgZGVsZXRlIGFwcC5tZXRhZGF0YUNhY2hlLm1ldGFkYXRhQ2FjaGVbZmlsZS5wYXRoXTtcbn1cblxuLyoqXG4gKiBVbnJlZ2lzdGVycyBmaWxlcyBmcm9tIHRoZSBPYnNpZGlhbiBhcHAuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gZmlsZXMgLSBUaGUgZmlsZXMgdG8gdW5yZWdpc3Rlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVucmVnaXN0ZXJGaWxlcyhhcHA6IEFwcCwgZmlsZXM6IFRBYnN0cmFjdEZpbGVbXSk6IHZvaWQge1xuICBjb25zdCByZWdpc3RlcmVkRmlsZXNDb3VudHMgPSBnZXRSZWdpc3RlcmVkRmlsZXNDb3VudHMoKTtcblxuICBmb3IgKGxldCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgd2hpbGUgKGZpbGUuZGVsZXRlZCkge1xuICAgICAgbGV0IGNvdW50ID0gcmVnaXN0ZXJlZEZpbGVzQ291bnRzLmdldChmaWxlLnBhdGgpID8/IDE7XG4gICAgICBjb3VudC0tO1xuICAgICAgcmVnaXN0ZXJlZEZpbGVzQ291bnRzLnNldChmaWxlLnBhdGgsIGNvdW50KTtcbiAgICAgIGlmIChjb3VudCA9PT0gMCkge1xuICAgICAgICByZWdpc3RlcmVkRmlsZXNDb3VudHMuZGVsZXRlKGZpbGUucGF0aCk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGUgLS0gV2UgaGF2ZSBubyBvdGhlciB3YXkgdG8gZGVsZXRlIHRoZSBwcm9wZXJ0eS5cbiAgICAgICAgZGVsZXRlIGFwcC52YXVsdC5maWxlTWFwW2ZpbGUucGF0aF07XG5cbiAgICAgICAgaWYgKGlzRmlsZShmaWxlKSkge1xuICAgICAgICAgIGFwcC5tZXRhZGF0YUNhY2hlLnVuaXF1ZUZpbGVMb29rdXAucmVtb3ZlKGZpbGUubmFtZS50b0xvd2VyQ2FzZSgpLCBmaWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmaWxlID0gZ2V0Rm9sZGVyKHtcbiAgICAgICAgYXBwLFxuICAgICAgICBwYXRoT3JGb2xkZXI6IHBhcmVudEZvbGRlclBhdGgoZmlsZS5wYXRoKSxcbiAgICAgICAgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEFkdmFuY2VkTWV0YWRhdGFDYWNoZUJhY2tsaW5rc0FwaSgpOiBBZHZhbmNlZE1ldGFkYXRhQ2FjaGVCYWNrbGlua3NBcGkgfCBudWxsIHtcbiAgcmV0dXJuIGZpbmRQbHVnaW5BcGk8QWR2YW5jZWRNZXRhZGF0YUNhY2hlQmFja2xpbmtzQXBpPih7XG4gICAgYXBpVmVyc2lvblJhbmdlOiBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9CQUNLTElOS1NfQVBJX1ZFUlNJT05fUkFOR0UsXG4gICAgY29udHJhY3Q6IEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX0JBQ0tMSU5LU19BUElfQ09OVFJBQ1QsXG4gICAgcGx1Z2luSWQ6IEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX1BMVUdJTl9JRFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVnaXN0ZXJlZEZpbGVzQ291bnRzKCk6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xuICByZXR1cm4gZ2V0T2JzaWRpYW5MaWJTdGF0ZSgncmVnaXN0ZXJlZEZpbGVzQ291bnRzJywgbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKSkudmFsdWU7XG59XG5cbi8qKlxuICogU3RydWN0dXJhbGx5IHJlY29nbml6ZXMgdGhlIGJhY2tsaW5rcyBkaWN0aW9uYXJ5IGFub3RoZXIgcGx1Z2luJ3MgY29weSBidWlsdCwgb3IgYG51bGxgLiBUaGUgY2xhc3MgaXQgd2FzIGJ1aWx0IGZyb20gbGl2ZXMgaW4gdGhhdCBjb3B5LCBzbyBgaW5zdGFuY2VvZmAgY2Fubm90IGJlIHVzZWQgKHJ1bGUgTDkgaW4gYEFHRU5UUy5tZGApLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHZhbHVlIGlzIGBudWxsYCBvciByZWFkcyBhcyBhIGJhY2tsaW5rcyBkaWN0aW9uYXJ5LlxuICovXG5mdW5jdGlvbiBpc051bGxhYmxlQmFja2xpbmtzRGljdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEN1c3RvbUFycmF5RGljdDxSZWZlcmVuY2U+IHwgbnVsbCB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbFxuICAgIHx8ICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnXG4gICAgICAmJiBSZWZsZWN0LmdldCh2YWx1ZSwgJ2RhdGEnKSBpbnN0YW5jZW9mIE1hcFxuICAgICAgJiYgdHlwZW9mIFJlZmxlY3QuZ2V0KHZhbHVlLCAnZ2V0JykgPT09ICdmdW5jdGlvbidcbiAgICAgICYmIHR5cGVvZiBSZWZsZWN0LmdldCh2YWx1ZSwgJ2tleXMnKSA9PT0gJ2Z1bmN0aW9uJyk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRXh0ZXJuYWxCb2R5TGlua3MoY29udGVudDogc3RyaW5nLCBjYWNoZTogQ2FjaGVkTWV0YWRhdGEpOiBQYXJzZUxpbmtSZWZlcmVuY2VbXSB7XG4gIGNvbnN0IGZyb250bWF0dGVyRW5kT2Zmc2V0ID0gY2FjaGUuZnJvbnRtYXR0ZXJQb3NpdGlvbj8uZW5kLm9mZnNldCA/PyAwO1xuICByZXR1cm4gcGFyc2VMaW5rcyhjb250ZW50KVxuICAgIC5maWx0ZXIoKHBhcnNlTGlua1Jlc3VsdCkgPT4gcGFyc2VMaW5rUmVzdWx0LmlzRXh0ZXJuYWwgJiYgcGFyc2VMaW5rUmVzdWx0LnN0YXJ0T2Zmc2V0ID49IGZyb250bWF0dGVyRW5kT2Zmc2V0KVxuICAgIC5tYXAoKHBhcnNlTGlua1Jlc3VsdCkgPT4gdG9QYXJzZUxpbmtSZWZlcmVuY2UoeyBjb250ZW50LCBwYXJzZUxpbmtSZXN1bHQgfSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUZyb250bWF0dGVyT3JOdWxsKGNvbnRlbnQ6IHN0cmluZywgcGF0aDogc3RyaW5nKTogQ29tYmluZWRGcm9udG1hdHRlcjx1bmtub3duPiB8IG51bGwge1xuICB0cnkge1xuICAgIHJldHVybiBwYXJzZUZyb250bWF0dGVyKGNvbnRlbnQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHByaW50RXJyb3IobmV3IEVycm9yKGBGcm9udG1hdHRlciBwYXJzaW5nIGZhaWxlZCBpbiAke3BhdGh9YCwgeyBjYXVzZTogZXJyb3IgfSkpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvUGFyc2VkQ2FjaGVkTWV0YWRhdGFFeChwYXJhbXM6IFRvUGFyc2VkQ2FjaGVkTWV0YWRhdGFFeFBhcmFtcyk6IENhY2hlZE1ldGFkYXRhRXgge1xuICBjb25zdCB7IGNhY2hlLCBjb250ZW50LCBvcHRpb25zIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGZlYXR1cmVzOiBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZVtdID0gW0NhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLk5hdGl2ZV07XG4gIGNvbnN0IHJlc3VsdDogQ2FjaGVkTWV0YWRhdGFFeCA9IHsgLi4uY2FjaGUsIGZlYXR1cmVzIH07XG5cbiAgaWYgKG9wdGlvbnMuc2hvdWxkUGFyc2VFeHRlcm5hbExpbmtzKSB7XG4gICAgcmVzdWx0LmV4dGVybmFsTGlua3MgPSBwYXJzZUV4dGVybmFsQm9keUxpbmtzKGNvbnRlbnQsIGNhY2hlKTtcbiAgICBmZWF0dXJlcy5wdXNoKENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLkV4dGVybmFsTGlua3MpO1xuICB9XG5cbiAgaWYgKFxuICAgIG9wdGlvbnMuc2hvdWxkUGFyc2VGcm9udG1hdHRlckV4dGVybmFsTGlua3NcbiAgICB8fCBvcHRpb25zLnNob3VsZFBhcnNlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc1xuICAgIHx8IG9wdGlvbnMuc2hvdWxkUGFyc2VNdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rc1xuICApIHtcbiAgICBjb25zdCBmcm9udG1hdHRlckxpbmtzID0gcGFyc2VGcm9udG1hdHRlckxpbmtzKGNhY2hlLmZyb250bWF0dGVyKTtcblxuICAgIGlmIChvcHRpb25zLnNob3VsZFBhcnNlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzKSB7XG4gICAgICByZXN1bHQuZnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZnJvbnRtYXR0ZXJMaW5rcy5mcm9udG1hdHRlckV4dGVybmFsTGlua3M7XG4gICAgICBmZWF0dXJlcy5wdXNoKENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLkZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuc2hvdWxkUGFyc2VNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzKSB7XG4gICAgICByZXN1bHQubXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZyb250bWF0dGVyTGlua3MubXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcztcbiAgICAgIGZlYXR1cmVzLnB1c2goQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuc2hvdWxkUGFyc2VNdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcykge1xuICAgICAgcmVzdWx0Lm11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzID0gZnJvbnRtYXR0ZXJMaW5rcy5tdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcztcbiAgICAgIGZlYXR1cmVzLnB1c2goQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3MpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUywwQkFBMEI7QUFDbkMsU0FBUyxrQkFBa0I7QUFDM0IsU0FBUyw4QkFBOEI7QUFDdkMsU0FBUyx5QkFBeUI7QUFDbEM7QUFBQSxFQUNFO0FB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VSxRQUNYLE9BQU8sVUFBVSxZQUNoQixRQUFRLElBQUksT0FBTyxNQUFNLGFBQWEsT0FDdEMsT0FBTyxRQUFRLElBQUksT0FBTyxLQUFLLE1BQU0sY0FDckMsT0FBTyxRQUFRLElBQUksT0FBTyxNQUFNLE1BQU07QUFDL0M7QUFFQSxTQUFTLHVCQUF1QixTQUFpQixPQUE2QztBQUM1RixRQUFNLHVCQUF1QixNQUFNLHFCQUFxQixJQUFJLFVBQVU7QUFDdEUsU0FBTyxXQUFXLE9BQU8sRUFDdEIsT0FBTyxDQUFDLG9CQUFvQixnQkFBZ0IsY0FBYyxnQkFBZ0IsZUFBZSxvQkFBb0IsRUFDN0csSUFBSSxDQUFDLG9CQUFvQixxQkFBcUIsRUFBRSxTQUFTLGdCQUFnQixDQUFDLENBQUM7QUFDaEY7QUFFQSxTQUFTLHVCQUF1QixTQUFpQixNQUFtRDtBQUNsRyxNQUFJO0FBQ0YsV0FBTyxpQkFBaUIsT0FBTztBQUFBLEVBQ2pDLFNBQVMsT0FBTztBQUNkLGVBQVcsSUFBSSxNQUFNLGlDQUFpQyxJQUFJLElBQUksRUFBRSxPQUFPLE1BQU0sQ0FBQyxDQUFDO0FBQy9FLFdBQU87QUFBQSxFQUNUO0FBQ0Y7QUFFQSxTQUFTLHlCQUF5QixRQUEwRDtBQUMxRixRQUFNLEVBQUUsT0FBTyxTQUFTLFFBQVEsSUFBSTtBQUNwQyxRQUFNLFdBQXNDLENBQUMscUJBQThCO0FBQzNFLFFBQU0sU0FBMkIsRUFBRSxHQUFHLE9BQU8sU0FBUztBQUV0RCxNQUFJLFFBQVEsMEJBQTBCO0FBQ3BDLFdBQU8sZ0JBQWdCLHVCQUF1QixTQUFTLEtBQUs7QUFDNUQsYUFBUyxLQUFLLG1DQUFxQztBQUFBLEVBQ3JEO0FBRUEsTUFDRSxRQUFRLHVDQUNMLFFBQVEsaURBQ1IsUUFBUSx1Q0FDWDtBQUNBLFVBQU0sbUJBQW1CLHNCQUFzQixNQUFNLFdBQVc7QUFFaEUsUUFBSSxRQUFRLHFDQUFxQztBQUMvQyxhQUFPLDJCQUEyQixpQkFBaUI7QUFDbkQsZUFBUyxLQUFLLHlEQUFnRDtBQUFBLElBQ2hFO0FBRUEsUUFBSSxRQUFRLCtDQUErQztBQUN6RCxhQUFPLHFDQUFxQyxpQkFBaUI7QUFDN0QsZUFBUyxLQUFLLDZFQUEwRDtBQUFBLElBQzFFO0FBRUEsUUFBSSxRQUFRLHVDQUF1QztBQUNqRCxhQUFPLDZCQUE2QixpQkFBaUI7QUFDckQsZUFBUyxLQUFLLDZEQUFrRDtBQUFBLElBQ2xFO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDsiLCJuYW1lcyI6WyJDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZSJdfQ==
491
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZXRhZGF0YS1jYWNoZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCB0aGUgbWV0YWRhdGEgY2FjaGUgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcGlDb250cmFjdCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hcGktY29udHJhY3QnO1xuaW1wb3J0IHR5cGUgeyBSZXRyeU9wdGlvbnMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYXN5bmMnO1xuaW1wb3J0IHR5cGUgeyBDdXN0b21BcnJheURpY3QgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0JztcbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBDYWNoZWRNZXRhZGF0YSxcbiAgUmVmZXJlbmNlLFxuICBUQWJzdHJhY3RGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHtcbiAgY3JlYXRlQXJndW1lbnRzU2NoZW1hLFxuICBjcmVhdGVUeXBlR3VhcmRTY2hlbWFcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FwaS1jb250cmFjdCc7XG5pbXBvcnQgeyBDYWxsYmFja0Rpc3Bvc2FibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZGlzcG9zYWJsZSc7XG5pbXBvcnQgeyBwcmludEVycm9yIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2Vycm9yJztcbmltcG9ydCB7IGdldE5lc3RlZFByb3BlcnR5VmFsdWUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvb2JqZWN0LXV0aWxzJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7XG4gIEN1c3RvbUFycmF5RGljdEltcGwsXG4gIGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGUsXG4gIGlzUmVmZXJlbmNlQ2FjaGUsXG4gIHBhcmVudEZvbGRlclBhdGhcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWRGcm9udG1hdHRlciB9IGZyb20gJy4vZnJvbnRtYXR0ZXIudHMnO1xuaW1wb3J0IHR5cGUge1xuICBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZSxcbiAgUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2VXaXRoT2Zmc2V0cyxcbiAgUGFyc2VMaW5rUmVmZXJlbmNlXG59IGZyb20gJy4vcGFyc2UtbGluay50cyc7XG5cbmltcG9ydCB7IHJldHJ5V2l0aFRpbWVvdXROb3RpY2UgfSBmcm9tICcuL2FzeW5jLXdpdGgtbm90aWNlLnRzJztcbmltcG9ydCB7IGdldEluZGV4ZWRCYWNrbGlua3NGb3JGaWxlIH0gZnJvbSAnLi9iYWNrbGluay1pbmRleC50cyc7XG5pbXBvcnQge1xuICBnZXRGaWxlLFxuICBnZXRGaWxlT3JOdWxsLFxuICBnZXRGb2xkZXIsXG4gIGdldFBhdGgsXG4gIGlzQ2FudmFzRmlsZSxcbiAgaXNGaWxlLFxuICBpc1BhdGhPckZpbGVcbn0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQge1xuICBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMsXG4gIHRvRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0c1xufSBmcm9tICcuL2Zyb250bWF0dGVyLWxpbmstY2FjaGUtd2l0aC1vZmZzZXRzLnRzJztcbmltcG9ydCB7IHBhcnNlRnJvbnRtYXR0ZXIgfSBmcm9tICcuL2Zyb250bWF0dGVyLnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuL2kxOG4vaTE4bi50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkxpYlN0YXRlIH0gZnJvbSAnLi9vYnNpZGlhbi1saWItc3RhdGUudHMnO1xuaW1wb3J0IHtcbiAgcGFyc2VGcm9udG1hdHRlckxpbmtzLFxuICBwYXJzZUxpbmtzLFxuICB0b1BhcnNlTGlua1JlZmVyZW5jZVxufSBmcm9tICcuL3BhcnNlLWxpbmsudHMnO1xuaW1wb3J0IHsgZmluZFBsdWdpbkFwaSB9IGZyb20gJy4vcGx1Z2luL3BsdWdpbi1hcGkudHMnO1xuaW1wb3J0IHtcbiAgZ2V0UmVmZXJlbmNlTGlua1RleHQsXG4gIHNvcnRSZWZlcmVuY2VzXG59IGZyb20gJy4vcmVmZXJlbmNlLnRzJztcbmltcG9ydCB7XG4gIHJlYWRTYWZlLFxuICBzYXZlTm90ZVxufSBmcm9tICcuL3ZhdWx0LnRzJztcblxuLyoqXG4gKiBBIHBhcnNpbmcgZmVhdHVyZSB0aGF0IHdhcyBhcHBsaWVkIHdoZW4gY29tcHV0aW5nIGEge0BsaW5rIENhY2hlZE1ldGFkYXRhRXh9LlxuICovXG5leHBvcnQgZW51bSBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZSB7XG4gIC8qKlxuICAgKiBUaGUgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gdGhlIG5vdGUgY29udGVudCBib2R5LlxuICAgKi9cbiAgRXh0ZXJuYWxMaW5rcyA9ICdFeHRlcm5hbExpbmtzJyxcblxuICAvKipcbiAgICogVGhlIGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIHNpbmdsZS1saW5rIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKi9cbiAgRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gJ0Zyb250bWF0dGVyRXh0ZXJuYWxMaW5rcycsXG5cbiAgLyoqXG4gICAqIFRoZSBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKi9cbiAgTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9ICdNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzJyxcblxuICAvKipcbiAgICogVGhlIGludGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMsIHdoaWNoIE9ic2lkaWFuIGRvZXMgbm90IG5hdGl2ZWx5IGNhY2hlLlxuICAgKi9cbiAgTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3MgPSAnTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3MnLFxuXG4gIC8qKlxuICAgKiBPYnNpZGlhbidzIG5hdGl2ZSBtZXRhZGF0YSBwYXJzaW5nIChpbnRlcm5hbCBsaW5rcywgZW1iZWRzLCBmcm9udG1hdHRlciBsaW5rcykuXG4gICAqL1xuICBOYXRpdmUgPSAnTmF0aXZlJ1xufVxuXG4vKipcbiAqIEFuIGV4dGVuZGVkIHtAbGluayBDYWNoZWRNZXRhZGF0YX0gdGhhdCByZWNvcmRzIHdoaWNoIHBhcnNpbmcge0BsaW5rIENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlfXMgd2VyZVxuICogYXBwbGllZCAodmlhIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4LmZlYXR1cmVzfSkgYW5kIGNhcnJpZXMgdGhlIHJlc3VsdGluZyBleHRlcm5hbCBsaW5rcy4gRWFjaCBsaW5rc1xuICogYXJyYXkgaXMgcG9wdWxhdGVkIG9ubHkgd2hlbiBpdHMgY29ycmVzcG9uZGluZyBmZWF0dXJlIGlzIHByZXNlbnQgaW4ge0BsaW5rIENhY2hlZE1ldGFkYXRhRXguZmVhdHVyZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlZE1ldGFkYXRhRXggZXh0ZW5kcyBDYWNoZWRNZXRhZGF0YSB7XG4gIC8qKlxuICAgKiBUaGUgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gdGhlIG5vdGUgY29udGVudCBib2R5LiBQb3B1bGF0ZWQgb25seSB3aGVuXG4gICAqIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5FeHRlcm5hbExpbmtzfSBpcyBhcHBsaWVkLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQtZGV2LXRvb2xraXQvcmVhZG9ubHktaW50ZXJmYWNlLW1lbWJlcnMgLS0gTWV0YWRhdGEgcGFyc2luZyBwb3B1bGF0ZXMgdGhpcyBvcHRpb25hbCBjYWNoZSBmZWF0dXJlIGFmdGVyIHJlYWRpbmcgdGhlIG5vdGUuXG4gIGV4dGVybmFsTGlua3M/OiBQYXJzZUxpbmtSZWZlcmVuY2VbXTtcblxuICAvKipcbiAgICogVGhlIHBhcnNpbmcgZmVhdHVyZXMgdGhhdCB3ZXJlIGFwcGxpZWQgd2hlbiBjb21wdXRpbmcgdGhpcyBjYWNoZS5cbiAgICovXG4gIHJlYWRvbmx5IGZlYXR1cmVzOiBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gc2luZ2xlLWxpbmsgKHNpbmdsZS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMuIFBvcHVsYXRlZCBvbmx5XG4gICAqIHdoZW4ge0BsaW5rIENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLkZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc30gaXMgYXBwbGllZC5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0LWRldi10b29sa2l0L3JlYWRvbmx5LWludGVyZmFjZS1tZW1iZXJzIC0tIE1ldGFkYXRhIHBhcnNpbmcgcG9wdWxhdGVzIHRoaXMgb3B0aW9uYWwgY2FjaGUgZmVhdHVyZSBhZnRlciByZWFkaW5nIHRoZSBub3RlLlxuICBmcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gbXVsdGktbGluayAobXVsdGktdmFsdWUpIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLiBQb3B1bGF0ZWQgb25seSB3aGVuXG4gICAqIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5NdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzfSBpcyBhcHBsaWVkLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQtZGV2LXRvb2xraXQvcmVhZG9ubHktaW50ZXJmYWNlLW1lbWJlcnMgLS0gTWV0YWRhdGEgcGFyc2luZyBwb3B1bGF0ZXMgdGhpcyBvcHRpb25hbCBjYWNoZSBmZWF0dXJlIGFmdGVyIHJlYWRpbmcgdGhlIG5vdGUuXG4gIG11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZVdpdGhPZmZzZXRzW107XG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMuIFBvcHVsYXRlZCBvbmx5IHdoZW5cbiAgICoge0BsaW5rIENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLk11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzfSBpcyBhcHBsaWVkLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQtZGV2LXRvb2xraXQvcmVhZG9ubHktaW50ZXJmYWNlLW1lbWJlcnMgLS0gTWV0YWRhdGEgcGFyc2luZyBwb3B1bGF0ZXMgdGhpcyBvcHRpb25hbCBjYWNoZSBmZWF0dXJlIGFmdGVyIHJlYWRpbmcgdGhlIG5vdGUuXG4gIG11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzPzogUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2VXaXRoT2Zmc2V0c1tdO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QmFja2xpbmtzRm9yRmlsZVNhZmVPcHRpb25zIGV4dGVuZHMgUmV0cnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc2hvdyBhIHRpbWVvdXQgbm90aWNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNob3dUaW1lb3V0Tm90aWNlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEJhY2tsaW5rc0ZvckZpbGVTYWZlUGFyYW1zIGV4dGVuZHMgR2V0QmFja2xpbmtzRm9yRmlsZVNhZmVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIG9iamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGdldENhY2hlU2FmZX0uXG4gKi9cbmV4cG9ydCB0eXBlIEdldENhY2hlU2FmZU9wdGlvbnMgPSBQYXJzZUNhY2hlT3B0aW9ucztcblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBnZXRSZWZlcmVuY2VzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRSZWZlcmVuY2VzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjYWNoZWQgbWV0YWRhdGEgdG8gcmV0cmlldmUgdGhlIHJlZmVyZW5jZXMgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlOiBDYWNoZWRNZXRhZGF0YTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBlbWJlZHMgKGBjYWNoZS5lbWJlZHNgKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRW1iZWRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSB0aGUgbm90ZSBib2R5LiBSZXF1aXJlcyB0aGUgY2FjaGUgdG8gYmUgYVxuICAgKiB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeH0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBzaW5nbGUtbGluayAoc2luZ2xlLXZhbHVlKSBub3RlIGZyb250bWF0dGVyXG4gICAqIHZhbHVlcy4gUmVxdWlyZXMgdGhlIGNhY2hlIHRvIGJlIGEge0BsaW5rIENhY2hlZE1ldGFkYXRhRXh9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBmcm9udG1hdHRlciBsaW5rcyAoYGNhY2hlLmZyb250bWF0dGVyTGlua3NgKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgYm9keSBsaW5rcyAoYGNhY2hlLmxpbmtzYCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZUxpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMsXG4gICAqIGkuZS4gdGhlIG9mZnNldC1jYXJyeWluZyBmcm9udG1hdHRlciBleHRlcm5hbCBsaW5rcyAobmFycm93ZWQgdmlhXG4gICAqIHtAbGluayBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHN9KS4gUmVxdWlyZXMgdGhlIGNhY2hlIHRvIGJlIGEge0BsaW5rIENhY2hlZE1ldGFkYXRhRXh9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgaW50ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gbXVsdGktbGluayAobXVsdGktdmFsdWUpIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKiBSZXF1aXJlcyB0aGUgY2FjaGUgdG8gYmUgYSB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeH0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHBhcnNpbmcgcGVyZm9ybWVkIGJ5IHtAbGluayBnZXRDYWNoZVNhZmV9IGFuZCB7QGxpbmsgcGFyc2VNZXRhZGF0YX0gYmV5b25kIE9ic2lkaWFuJ3NcbiAqIG5hdGl2ZSBtZXRhZGF0YSBwYXJzaW5nLiBFYWNoIG9wdGlvbiBpcyBvcHQtaW47IGVuYWJsaW5nIGl0IGFkZHMgdGhlIGNvcnJlc3BvbmRpbmdcbiAqIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZX0gYW5kIHBvcHVsYXRlcyB0aGUgbWF0Y2hpbmcgbGlua3MgYXJyYXkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VDYWNoZU9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byBwYXJzZSB0aGUgZXh0ZXJuYWwgbGlua3MgZnJvbSB0aGUgbm90ZSBjb250ZW50IGJvZHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFBhcnNlRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcGFyc2UgdGhlIGV4dGVybmFsIGxpbmtzIGZyb20gc2luZ2xlLWxpbmsgKHNpbmdsZS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFBhcnNlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBwYXJzZSB0aGUgZXh0ZXJuYWwgbGlua3MgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFBhcnNlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcGFyc2UgdGhlIGludGVybmFsIGxpbmtzIGZyb20gbXVsdGktbGluayAobXVsdGktdmFsdWUpIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRQYXJzZU11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcGFyc2VNZXRhZGF0YX0uXG4gKi9cbmV4cG9ydCB0eXBlIFBhcnNlTWV0YWRhdGFPcHRpb25zID0gUGFyc2VDYWNoZU9wdGlvbnM7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBmaWxlIGNhY2hlIHRvIHJlZ2lzdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGU6IENhY2hlZE1ldGFkYXRhO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIHRvIHJlZ2lzdGVyIHRoZSBmaWxlIGNhY2hlIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogVGhlIHNsaWNlIG9mIGBBZHZhbmNlZCBNZXRhZGF0YSBDYWNoZWAncyBwdWJsaXNoZWQgQVBJIHRoaXMgbW9kdWxlIGNhbGxzLCBkZWNsYXJlZCBoZXJlIHJhdGhlciB0aGFuIGltcG9ydGVkLFxuICogYmVjYXVzZSB0aGF0IHBsdWdpbiBpcyBub3QgYSBkZXBlbmRlbmN5IChydWxlIEw5IGluIGBBR0VOVFMubWRgKS4gSXRzIGBhcGkuZC50c2AgZGVjbGFyZXMgdGhlIHdob2xlIG9mIGl0LlxuICovXG5pbnRlcmZhY2UgQWR2YW5jZWRNZXRhZGF0YUNhY2hlQmFja2xpbmtzQXBpIHtcbiAgLyoqXG4gICAqIEFuc3dlcnMgZnJvbSB0aGUgcGx1Z2luJ3MgYmFja2xpbmsgY2FjaGUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvYmplY3QuXG4gICAqIEByZXR1cm5zIFRoZSBiYWNrbGlua3MsIG9yIGBudWxsYCB3aGlsZSB0aGUgcGx1Z2luJ3MgYEJhY2tsaW5rc2AgbW9kdWxlIGlzIG9mZi5cbiAgICovXG4gIHJlYWRvbmx5IGdldEJhY2tsaW5rc0ZvckZpbGU6IChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKSA9PiBDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlPiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEFuc3dlcnMgZnJvbSB0aGUgcGx1Z2luJ3MgYmFja2xpbmsgY2FjaGUgb25jZSB0aGUgcGVuZGluZyBmaWxlIGNoYW5nZXMgaGF2ZSBiZWVuIHByb2Nlc3NlZC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9iamVjdC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgYmFja2xpbmtzLCBvciB0byBgbnVsbGAgd2hpbGUgdGhlIHBsdWdpbidzIGBCYWNrbGlua3NgXG4gICAqICAgbW9kdWxlIGlzIG9mZi5cbiAgICovXG4gIHJlYWRvbmx5IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlOiAocGF0aE9yRmlsZTogUGF0aE9yRmlsZSkgPT4gUHJvbWlzZTxDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlPiB8IG51bGw+O1xufVxuXG4vKipcbiAqIEEgc2VsZWN0b3IgZm9yIGEgZmVhdHVyZS1nYXRlZCBsaW5rIGNhdGVnb3J5IGluIHtAbGluayBnZXRSZWZlcmVuY2VzfS5cbiAqL1xuaW50ZXJmYWNlIEZlYXR1cmVMaW5rU2VsZWN0b3Ige1xuICAvKipcbiAgICogQSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGluayBjYXRlZ29yeSwgdXNlZCBpbiBlcnJvciBtZXNzYWdlcy5cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmZWF0dXJlIHRoYXQgbXVzdCBiZSBwcmVzZW50IGluIHRoZSBjYWNoZSBmb3IgdGhpcyBjYXRlZ29yeSB0byBiZSBhdmFpbGFibGUuXG4gICAqL1xuICByZWFkb25seSBmZWF0dXJlOiBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZTtcblxuICAvKipcbiAgICogU2VsZWN0cyB0aGUgbGlua3MgZm9yIHRoaXMgY2F0ZWdvcnkgZnJvbSB0aGUgY2FjaGUuXG4gICAqL1xuICByZWFkb25seSBzZWxlY3Q6IChjYWNoZTogQ2FjaGVkTWV0YWRhdGFFeCkgPT4gUmVmZXJlbmNlW10gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGlzIGNhdGVnb3J5LlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayB0b1BhcnNlZENhY2hlZE1ldGFkYXRhRXh9LlxuICovXG5pbnRlcmZhY2UgVG9QYXJzZWRDYWNoZWRNZXRhZGF0YUV4UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBwbGFpbiBjYWNoZWQgbWV0YWRhdGEgdG8gd3JhcC5cbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlOiBDYWNoZWRNZXRhZGF0YTtcblxuICAvKipcbiAgICogVGhlIG5vdGUgY29udGVudCB0aGUgb2Zmc2V0cyBpbmRleCBpbnRvLCB1c2VkIGZvciBib2R5IGV4dGVybmFsLWxpbmsgcGFyc2luZy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhcnNlIG9wdGlvbnMgY29udHJvbGxpbmcgd2hpY2ggbGlua3MgdG8gcGFyc2UuXG4gICAqL1xuICByZWFkb25seSBvcHRpb25zOiBQYXJzZUNhY2hlT3B0aW9ucztcbn1cblxuLyoqXG4gKiBUaGUgcGx1Z2luIGlkIG9mIHRoZSBgQWR2YW5jZWQgTWV0YWRhdGEgQ2FjaGVgIHBsdWdpbiwgdGhlIHN1Y2Nlc3NvciB0byBgQmFja2xpbmsgQ2FjaGVgLlxuICpcbiAqIFVzZWQgYnkge0BsaW5rIGhhc0JhY2tsaW5rQ2FjaGVQbHVnaW59LCBhbmQgYXMgdGhlIHByb3ZpZGVyIGlkIHVuZGVyIHdoaWNoIHtAbGluayBnZXRCYWNrbGlua3NGb3JGaWxlT3JQYXRofSBhbmQge0BsaW5rIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlfSBsb29rIHVwIHRoZSBwbHVnaW4ncyBwdWJsaXNoZWQgQVBJLlxuICovXG5leHBvcnQgY29uc3QgQURWQU5DRURfTUVUQURBVEFfQ0FDSEVfUExVR0lOX0lEID0gJ2FkdmFuY2VkLW1ldGFkYXRhLWNhY2hlJztcblxuLyoqXG4gKiBUaGUgY29udHJhY3QgdmVyc2lvbnMgb2YgYEFkdmFuY2VkIE1ldGFkYXRhIENhY2hlYCdzIEFQSSB0aGlzIG1vZHVsZSBjb21waWxlZCBhZ2FpbnN0LiBgMS4zLjBgIGlzIHRoZSBmaXJzdCB0byBjYXJyeSB0aGUgdHdvIGJhY2tsaW5rIG1ldGhvZHMuXG4gKi9cbmNvbnN0IEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX0JBQ0tMSU5LU19BUElfVkVSU0lPTl9SQU5HRSA9ICdeMS4zLjAnO1xuXG4vKipcbiAqIFRoZSBzY2hlbWFzIG9mIGEgYmFja2xpbmsgbWV0aG9kJ3MgcGF5bG9hZHM6IHRoZSBvbmUgcGF0aC1vci1maWxlIGFyZ3VtZW50LCBhbmQgdGhlIGJhY2tsaW5rcyBvciBgbnVsbGAuXG4gKlxuICogQSBjb3B5IG9mIHRoZSBgZ2V0QmFja2xpbmtzRm9yRmlsZWAgYW5kIGBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZWAgZW50cmllcyBvZiBgQURWQU5DRURfTUVUQURBVEFfQ0FDSEVfQVBJX0NPTlRSQUNUYCwgd2hpY2ggYEFkdmFuY2VkIE1ldGFkYXRhIENhY2hlYCBzaGlwcyBhc1xuICogaXRzIHJvb3QgYGFwaS1jb250cmFjdC50c2AgYW5kIHB1Ymxpc2hlcy4gS2VlcCB0aGUgZ3VhcmRzIGluIGFncmVlbWVudCB3aXRoIHRoYXQgZmlsZSwgc28gdGhlIHByb3ZpZGVyIGFuZCB0aGlzIGNvbnN1bWVyIGNoZWNrIG9uZSBkZWZpbml0aW9uLlxuICovXG5jb25zdCBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9CQUNLTElOS1NfTUVUSE9EX0NPTlRSQUNUID0ge1xuICBpbnB1dDogY3JlYXRlQXJndW1lbnRzU2NoZW1hPFtwYXRoT3JGaWxlOiBQYXRoT3JGaWxlXT4oW3sgZXhwZWN0ZWQ6ICdhIHBhdGggb3IgYSBmaWxlJywgdHlwZUd1YXJkOiBpc1BhdGhPckZpbGUgfV0pLFxuICBvdXRwdXQ6IGNyZWF0ZVR5cGVHdWFyZFNjaGVtYSh7IGV4cGVjdGVkOiAnYSBiYWNrbGlua3MgZGljdGlvbmFyeSBvciBudWxsJywgdHlwZUd1YXJkOiBpc051bGxhYmxlQmFja2xpbmtzRGljdCB9KVxufTtcblxuLyoqXG4gKiBUaGUgY29udHJhY3Qgb2YgdGhlIG1lbWJlcnMgb2YgYEFkdmFuY2VkIE1ldGFkYXRhIENhY2hlYCdzIEFQSSB0aGlzIG1vZHVsZSBjYWxscywgc28gYSByZWNvcmQgdGhhdCBsYWNrcyBlaXRoZXIgaXMgcGFzc2VkIG92ZXIsIGFuZCBhIHBheWxvYWQgdGhhdCBicmVha3MgaXRzIHNpZ25hdHVyZSBpcyByZXBvcnRlZCB3aGlsZSB0aGUgYG9ic2lkaWFuLWxpYjp2YWxpZGF0ZS1wbHVnaW4tYXBpLXBheWxvYWRzYCBkZWJ1ZyBzd2l0Y2ggaXMgb24uXG4gKi9cbmNvbnN0IEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX0JBQ0tMSU5LU19BUElfQ09OVFJBQ1Q6IEFwaUNvbnRyYWN0PEFkdmFuY2VkTWV0YWRhdGFDYWNoZUJhY2tsaW5rc0FwaT4gPSB7XG4gIGdldEJhY2tsaW5rc0ZvckZpbGU6IEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX0JBQ0tMSU5LU19NRVRIT0RfQ09OVFJBQ1QsXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlOiBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9CQUNLTElOS1NfTUVUSE9EX0NPTlRSQUNUXG59O1xuXG4vKipcbiAqIFRoZSBwbHVnaW4gaWQgb2YgdGhlIHJldGlyZWQgYEJhY2tsaW5rIENhY2hlYCBwbHVnaW4sIHN1cGVyc2VkZWQgYnkge0BsaW5rIEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX1BMVUdJTl9JRH0uXG4gKlxuICogU3RpbGwgcmVjb2duaXplZCBieSB7QGxpbmsgaGFzQmFja2xpbmtDYWNoZVBsdWdpbn0sIGRlbGliZXJhdGVseS4gUmVtb3ZpbmcgYSBwbHVnaW4gZnJvbSB0aGUgY29tbXVuaXR5IHJlZ2lzdHJ5IGJsb2NrcyBuZXcgaW5zdGFsbHM7IGl0IHVuaW5zdGFsbHMgbm90aGluZywgc28gZXZlcnkgZXhpc3RpbmcgdXNlciBrZWVwcyBpdCB1bnRpbCB0aGV5IG1pZ3JhdGUgYnkgaGFuZC5cbiAqXG4gKiBJdCBtYXkgYmUgZHJvcHBlZCB3aGVuIGFsbCB0aHJlZSBvZiB0aGUgZm9sbG93aW5nIGhvbGQsIGFuZCBub3QgYmVmb3JlOiBgQWR2YW5jZWQgTWV0YWRhdGEgQ2FjaGVgIGlzIGxpc3RlZCBpbiB0aGUgY29tbXVuaXR5IHJlZ2lzdHJ5LCBzbyBtaWdyYXRpbmcgaXMgcG9zc2libGUgYXQgYWxsOyB0aGUgZmluYWwgYEJhY2tsaW5rIENhY2hlYCBoYW5kb3ZlciByZWxlYXNlIGhhcyBiZWVuIG91dCBmb3IgYXQgbGVhc3QgdHdlbHZlIG1vbnRoczsgYW5kIHRoaXMgbGlicmFyeSBpcyBjdXR0aW5nIGEgbWFqb3IgcmVsZWFzZSBhbnl3YXksIGJlY2F1c2UgZHJvcHBpbmcgdGhlIGlkIHNpbGVudGx5IHVuLWdhdGVzIGNhbnZhcyBsaW5rIGhhbmRsaW5nIGZvciBhbnlvbmUgd2hvIGhhcyBub3QgbWlncmF0ZWQuIFRoZXJlIGlzIG5vIGNvc3QgcHJlc3N1cmUgdG8gZHJvcCBpdCBlYXJsaWVyIC0gcmVjb2duaXppbmcgYSBkZWFkIGlkIGlzIG9uZSBzdHJpbmcgY29tcGFyaXNvbiBvbiBhIHBhdGggdGhhdCBhbHJlYWR5IHJlYWRzIGEgcGx1Z2luIHJlZ2lzdHJ5LlxuICovXG5leHBvcnQgY29uc3QgQkFDS0xJTktfQ0FDSEVfUExVR0lOX0lEID0gJ2JhY2tsaW5rLWNhY2hlJztcblxuLyoqXG4gKiBFbnN1cmVzIHRoYXQgdGhlIG1ldGFkYXRhIGNhY2hlIGlzIHJlYWR5IGZvciBhbGwgZmlsZXMuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG1ldGFkYXRhIGNhY2hlIGlzIHJlYWR5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlTWV0YWRhdGFDYWNoZVJlYWR5KGFwcDogQXBwKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgYXBwLm1ldGFkYXRhQ2FjaGUub25DbGVhbkNhY2hlKHJlc29sdmUpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGJhY2tsaW5rcyBmb3IgYSBmaWxlIG9yIHBhdGguXG4gKiBOT1RFOiBUaGUgZmlsZSBtYXkgYmUgbm9uLWV4aXN0ZW50LlxuICpcbiAqIFdoZW4gYEFkdmFuY2VkIE1ldGFkYXRhIENhY2hlYCBwdWJsaXNoZXMgaXRzIGJhY2tsaW5rcyBBUEkgYW5kIGl0cyBgQmFja2xpbmtzYCBtb2R1bGUgaXMgb24sIGl0cyBjYWNoZSBhbnN3ZXJzLlxuICogT3RoZXJ3aXNlIHRoZSBhbnN3ZXIgY29tZXMgZnJvbSBhIGJhY2tsaW5rIGluZGV4IHdob3NlIGNvc3QgaXMgcHJvcG9ydGlvbmFsIHRvIHRoZSBjYW5kaWRhdGUgbm90ZXMgcmF0aGVyIHRoYW5cbiAqIHRvIGV2ZXJ5IHJlZmVyZW5jZSBpbiB0aGUgdmF1bHQsIGFuZCB3aGljaCBnaXZlcyB0aGUgc2FtZSByZWZlcmVuY2VzIE9ic2lkaWFuJ3Mgb3duIGBnZXRCYWNrbGlua3NGb3JGaWxlYCBnaXZlcy5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9iamVjdC5cbiAqIEByZXR1cm5zIFRoZSBiYWNrbGlua3MgZm9yIHRoZSBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QmFja2xpbmtzRm9yRmlsZU9yUGF0aChhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IEN1c3RvbUFycmF5RGljdDxSZWZlcmVuY2U+IHtcbiAgY29uc3QgZmlsZSA9IGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGUsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbiAgdXNpbmcgX3JlZ2lzdHJhdGlvbiA9IHJlZ2lzdGVyRmlsZXMoYXBwLCBbZmlsZV0pO1xuICByZXR1cm4gZmluZEFkdmFuY2VkTWV0YWRhdGFDYWNoZUJhY2tsaW5rc0FwaSgpPy5nZXRCYWNrbGlua3NGb3JGaWxlKGZpbGUpID8/IGdldEluZGV4ZWRCYWNrbGlua3NGb3JGaWxlKGFwcCwgZmlsZSk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBiYWNrbGlua3MgZm9yIGEgZmlsZSBzYWZlbHkuXG4gKlxuICogV2hlbiBgQWR2YW5jZWQgTWV0YWRhdGEgQ2FjaGVgIHB1Ymxpc2hlcyBpdHMgYmFja2xpbmtzIEFQSSBhbmQgaXRzIGBCYWNrbGlua3NgIG1vZHVsZSBpcyBvbiwgdGhhdCBBUEkgYW5zd2Vycy5cbiAqXG4gKiBPdGhlcndpc2UgdGhpcyBpcyBOT1QgYSBwdXJlIHJlYWQuIEl0IHZlcmlmaWVzXG4gKiBlYWNoIGJhY2tsaW5rIGFnYWluc3QgdGhlIG5vdGUncyBjdXJyZW50IHRleHQsIGFuZCB0byBkbyB0aGF0IGl0IGNhbGxzIHtAbGluayBzYXZlTm90ZX0gb24gZXZlcnlcbiAqIG5vdGUgdGhhdCBsaW5rcyB0byB0aGUgZmlsZSwgd2hpY2ggc2F2ZXMgYW55IG9wZW4gZWRpdG9yIHZpZXcgb2YgdGhvc2Ugbm90ZXMgdGhhdCBoYXMgdW5zYXZlZFxuICogY2hhbmdlcy4gQ2FsbCBpdCBmcm9tIGFuIGV4cGxpY2l0IHVzZXIgYWN0aW9uLiBEbyBub3QgY2FsbCBpdCBmcm9tIGFuIGF1dG9tYXRpYyB0cmlnZ2VyIChhIHZhdWx0IG9yXG4gKiBtZXRhZGF0YSBldmVudCwgYSBzYXZlIG9yIHJlbmRlciBwYXRjaCkgdGhhdCBvbmx5IGRlY2lkZXMgd2hldGhlciB0byBhY3QuIFRoZXJlLCBhIGZvcmNlZCBzYXZlIGNhblxuICogcmFjZSBhbm90aGVyIHBsdWdpbidzIGluLWZsaWdodCBlZGl0b3IgY2hhbmdlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgcmV0cmlldmluZyB0aGUgYmFja2xpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBkaWN0aW9uYXJ5IG9mIGJhY2tsaW5rcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKHBhcmFtczogR2V0QmFja2xpbmtzRm9yRmlsZVNhZmVQYXJhbXMpOiBQcm9taXNlPEN1c3RvbUFycmF5RGljdDxSZWZlcmVuY2U+PiB7XG4gIGNvbnN0IHsgYXBwLCBwYXRoT3JGaWxlLCAuLi5vcHRpb25zIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGNhY2hlZEJhY2tsaW5rcyA9IGF3YWl0IGZpbmRBZHZhbmNlZE1ldGFkYXRhQ2FjaGVCYWNrbGlua3NBcGkoKT8uZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUocGF0aE9yRmlsZSk7XG4gIGlmIChjYWNoZWRCYWNrbGlua3MpIHtcbiAgICByZXR1cm4gY2FjaGVkQmFja2xpbmtzO1xuICB9XG5cbiAgbGV0IGJhY2tsaW5rczogQ3VzdG9tQXJyYXlEaWN0PFJlZmVyZW5jZT4gPSBuZXcgQ3VzdG9tQXJyYXlEaWN0SW1wbDxSZWZlcmVuY2U+KCk7XG4gIGF3YWl0IHJldHJ5V2l0aFRpbWVvdXROb3RpY2Uoe1xuICAgIGFzeW5jIG9wZXJhdGlvbkZ1bmN0aW9uKGFib3J0U2lnbmFsKSB7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgY29uc3QgZmlsZSA9IGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGUgfSk7XG4gICAgICBhd2FpdCBlbnN1cmVNZXRhZGF0YUNhY2hlUmVhZHkoYXBwKTtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBiYWNrbGlua3MgPSBnZXRCYWNrbGlua3NGb3JGaWxlT3JQYXRoKGFwcCwgZmlsZSk7XG4gICAgICBmb3IgKGNvbnN0IG5vdGVQYXRoIG9mIGJhY2tsaW5rcy5rZXlzKCkpIHtcbiAgICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgY29uc3Qgbm90ZSA9IGdldEZpbGVPck51bGwoeyBhcHAsIHBhdGhPckZpbGU6IG5vdGVQYXRoIH0pO1xuICAgICAgICBpZiAoIW5vdGUpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBIGNhbnZhcyBob2xkZXIgY2Fubm90IGJlIGNoZWNrZWQgYWdhaW5zdCBpdHMgdGV4dC4gSXRzIGZpbGUtbm9kZSByZWZlcmVuY2VzIGNhcnJ5IG5vIHBvc2l0aW9uLCBhbmRcbiAgICAgICAgLy8gT2JzaWRpYW4gcmVwb3J0cyBhIHRleHQtbm9kZSBlbWJlZCB3aXRoIGEgcG9zaXRpb24gaW50byB0aGF0IG5vZGUncyBvd24gdGV4dCwgbm90IGludG8gdGhlIGNhbnZhcyBKU09OLFxuICAgICAgICAvLyBzbyBzbGljaW5nIHRoZSBmaWxlIGF0IGl0IG5ldmVyIGdpdmVzIHRoZSBsaW5rIGJhY2sgYW5kIHRoZSByZXRyeSB3b3VsZCBuZXZlciBlbmQuXG4gICAgICAgIGlmIChpc0NhbnZhc0ZpbGUobm90ZSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHNhdmVOb3RlKGFwcCwgbm90ZSk7XG4gICAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRTYWZlKGFwcCwgbm90ZSk7XG4gICAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsaW5rcyA9IGJhY2tsaW5rcy5nZXQobm90ZVBhdGgpO1xuICAgICAgICBpZiAoIWxpbmtzKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGFyc2VkIG9ubHkgd2hlbiBhIGZyb250bWF0dGVyIGxpbmsgbmVlZHMgaXQ6IGEgbm90ZSB3aG9zZSBZQU1MIGRvZXMgbm90IHBhcnNlIHN0aWxsIGhvbGRzIGJvZHkgbGlua3MsXG4gICAgICAgIC8vIGFuZCBgbnVsbGAgbWFya3MgYSBwYXJzZSB0aGF0IGZhaWxlZCwgc28gaXRzIGZyb250bWF0dGVyIGxpbmtzIGFyZSBza2lwcGVkIHJhdGhlciB0aGFuIHJldHJpZWQgZm9yZXZlci5cbiAgICAgICAgbGV0IGZyb250bWF0dGVyOiBDb21iaW5lZEZyb250bWF0dGVyPHVua25vd24+IHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSB7XG4gICAgICAgICAgbGV0IGFjdHVhbExpbms6IHN0cmluZztcbiAgICAgICAgICBpZiAoaXNSZWZlcmVuY2VDYWNoZShsaW5rKSkge1xuICAgICAgICAgICAgYWN0dWFsTGluayA9IGNvbnRlbnQuc2xpY2UobGluay5wb3NpdGlvbi5zdGFydC5vZmZzZXQsIGxpbmsucG9zaXRpb24uZW5kLm9mZnNldCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc0Zyb250bWF0dGVyTGlua0NhY2hlKGxpbmspKSB7XG4gICAgICAgICAgICBpZiAoZnJvbnRtYXR0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBmcm9udG1hdHRlciA9IHBhcnNlRnJvbnRtYXR0ZXJPck51bGwoY29udGVudCwgbm90ZVBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZyb250bWF0dGVyID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcHJvcGVydHlWYWx1ZSA9IGdldE5lc3RlZFByb3BlcnR5VmFsdWUoZnJvbnRtYXR0ZXIsIGxpbmsua2V5KTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHlWYWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsaW5rV2l0aE9mZnNldHMgPSB0b0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMobGluayk7XG4gICAgICAgICAgICBhY3R1YWxMaW5rID0gcHJvcGVydHlWYWx1ZS5zbGljZShsaW5rV2l0aE9mZnNldHMuc3RhcnRPZmZzZXQsIGxpbmtXaXRoT2Zmc2V0cy5lbmRPZmZzZXQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGFjdHVhbExpbmsgIT09IGdldFJlZmVyZW5jZUxpbmtUZXh0KGxpbmspKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5tZXRhZGF0YUNhY2hlLmdldEJhY2tsaW5rc0ZvckZpbGVQYXRoLCB7IGZpbGVQYXRoOiBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSkgfSksXG4gICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBudWxsLFxuICAgIHJldHJ5T3B0aW9uczogb3B0aW9ucyxcbiAgICBzaG91bGRTaG93VGltZW91dE5vdGljZTogb3B0aW9ucy5zaG91bGRTaG93VGltZW91dE5vdGljZSA/PyB0cnVlXG4gIH0pO1xuXG4gIHJldHVybiBiYWNrbGlua3M7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBjYWNoZWQgbWV0YWRhdGEgZm9yIGEgZ2l2ZW4gZmlsZSBvciBwYXRoLlxuICpcbiAqIFRoaXMgaXMgTk9UIGEgcHVyZSByZWFkOiBiZWZvcmUgaXQgcmVhZHMgdGhlIGNhY2hlLCBpdCBjYWxscyB7QGxpbmsgc2F2ZU5vdGV9LCB3aGljaCBzYXZlcyBhbnlcbiAqIG9wZW4gZWRpdG9yIHZpZXcgb2YgdGhlIG5vdGUgdGhhdCBoYXMgdW5zYXZlZCBjaGFuZ2VzLiBUaGF0IHNhdmUgaXMgd2h5IHRoZSBjYWNoZSBtYXRjaGVzIHdoYXQgdGhlXG4gKiB1c2VyIHNlZXMsIGFuZCB3aHkgYSBjb21tYW5kIHRoYXQgcmV3cml0ZXMgdGhlIG5vdGUgY2FuIHVzZSB0aGlzIHNhZmVseSB3aXRob3V0IGl0cyByZXdyaXRlIGJlaW5nXG4gKiBjbG9iYmVyZWQuIEl0IGlzIGFsc28gYSB3cml0ZSBvbiB0aGUgbm90ZS4gU28gZG8gbm90IGNhbGwgdGhpcyBmcm9tIGFuIGF1dG9tYXRpYyB0cmlnZ2VyIChhIHZhdWx0XG4gKiBvciBtZXRhZGF0YSBldmVudCwgYSBzYXZlIG9yIHJlbmRlciBwYXRjaCwgYSBsYXlvdXQgaG9vaykgdGhhdCBvbmx5IGRlY2lkZXMgd2hldGhlciB0byBhY3Q6IGFcbiAqIGZvcmNlZCBzYXZlIG9uZSB0aWNrIGFmdGVyIGFub3RoZXIgcGx1Z2luIGhhcyBkaXNwYXRjaGVkIGEgY2hhbmdlIGludG8gdGhlIGVkaXRvciBjYW4gbGVhdmVcbiAqIE9ic2lkaWFuJ3MgZWRpdG9yIHJlbmRlcmluZyBzdGFsZSBzdGF0ZS4gQSByZWFkLW9ubHkgcHJvYmUgb24gdGhlIG5vdGUncyBjdXJyZW50IHRleHQgc2hvdWxkIHVzZVxuICoge0BsaW5rIHBhcnNlTWV0YWRhdGF9IG9uIHRoYXQgdGV4dCBpbnN0ZWFkLiBJdCBuZWVkcyBubyB2aWV3LCBubyBjYWNoZSBhbmQgbm8gc2F2ZS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBmaWxlT3JQYXRoIC0gVGhlIGZpbGUgb3IgcGF0aCB0byByZXRyaWV2ZSB0aGUgbWV0YWRhdGEgZm9yLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyc2Ugb3B0aW9ucyBjb250cm9sbGluZyB3aGljaCBhZGRpdGlvbmFsIGxpbmtzIHRvIHBhcnNlLlxuICogQHJldHVybnMgVGhlIGNhY2hlZCBtZXRhZGF0YSBmb3IgdGhlIGZpbGUsIG9yIGBudWxsYCBpZiBpdCBkb2Vzbid0IGV4aXN0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q2FjaGVTYWZlKGFwcDogQXBwLCBmaWxlT3JQYXRoOiBQYXRoT3JGaWxlLCBvcHRpb25zOiBHZXRDYWNoZVNhZmVPcHRpb25zID0ge30pOiBQcm9taXNlPENhY2hlZE1ldGFkYXRhRXggfCBudWxsPiB7XG4gIGNvbnN0IGZpbGUgPSBnZXRGaWxlT3JOdWxsKHsgYXBwLCBwYXRoT3JGaWxlOiBmaWxlT3JQYXRoIH0pO1xuXG4gIHRyeSB7XG4gICAgaWYgKCFmaWxlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgY2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgICBpZiAoZmlsZS5kZWxldGVkKSB7XG4gICAgICBjYWNoZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgc2F2ZU5vdGUoYXBwLCBmaWxlKTtcblxuICAgICAgY29uc3QgZmlsZUNhY2hlRW50cnkgPSBhcHAubWV0YWRhdGFDYWNoZS5maWxlQ2FjaGVbZmlsZS5wYXRoXTtcbiAgICAgIGNvbnN0IGlzVXBUb0RhdGUgPSBmaWxlQ2FjaGVFbnRyeT8ubXRpbWUgPT09IGZpbGUuc3RhdC5tdGltZVxuICAgICAgICAmJiBmaWxlQ2FjaGVFbnRyeS5zaXplID09PSBmaWxlLnN0YXQuc2l6ZVxuICAgICAgICAmJiBPYmplY3QuaGFzT3duKGFwcC5tZXRhZGF0YUNhY2hlLm1ldGFkYXRhQ2FjaGUsIGZpbGVDYWNoZUVudHJ5Lmhhc2gpO1xuICAgICAgaWYgKCFpc1VwVG9EYXRlKSB7XG4gICAgICAgIGF3YWl0IGFwcC5tZXRhZGF0YUNhY2hlLmNvbXB1dGVGaWxlTWV0YWRhdGFBc3luYyhmaWxlKTtcbiAgICAgICAgYXdhaXQgZW5zdXJlTWV0YWRhdGFDYWNoZVJlYWR5KGFwcCk7XG4gICAgICB9XG4gICAgICBjYWNoZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcbiAgICB9XG5cbiAgICBpZiAoY2FjaGUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIE9ubHkgdGhlIGJvZHktZXh0ZXJuYWwgcGFyc2UgbmVlZHMgdGhlIGZpbGUgY29udGVudDsgZnJvbnRtYXR0ZXIgcGFyc2luZyB1c2VzIHRoZSBjYWNoZWRcbiAgICAvLyBmcm9udG1hdHRlciwgc28gYXZvaWQgcmVhZGluZyB0aGUgY29udGVudCB1bmxlc3MgaXQgaXMgYWN0dWFsbHkgbmVlZGVkLlxuICAgIGNvbnN0IGNvbnRlbnQgPSBvcHRpb25zLnNob3VsZFBhcnNlRXh0ZXJuYWxMaW5rcyA/IGF3YWl0IGFwcC52YXVsdC5jYWNoZWRSZWFkKGZpbGUpIDogJyc7XG4gICAgcmV0dXJuIHRvUGFyc2VkQ2FjaGVkTWV0YWRhdGFFeCh7IGNhY2hlLCBjb250ZW50LCBvcHRpb25zIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICghZmlsZSB8fCBmaWxlLmRlbGV0ZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBmcm9udCBtYXR0ZXIgZnJvbSB0aGUgbWV0YWRhdGEgY2FjaGUgc2FmZWx5LlxuICpcbiAqIEl0IHJlYWRzIHRocm91Z2gge0BsaW5rIGdldENhY2hlU2FmZX0sIHNvIGl0IHNhdmVzIGFueSBvcGVuIGVkaXRvciB2aWV3IG9mIHRoZSBub3RlIHRoYXQgaGFzXG4gKiB1bnNhdmVkIGNoYW5nZXMuIFNlZSB7QGxpbmsgZ2V0Q2FjaGVTYWZlfSBmb3Igd2hlbiB0aGF0IHNhdmUgbWF0dGVycyBhbmQgd2hhdCB0byB1c2UgaW5zdGVhZC5cbiAqXG4gKiBAdHlwZVBhcmFtIEN1c3RvbUZyb250bWF0dGVyIC0gVGhlIHR5cGUgb2YgY3VzdG9tIGZyb250IG1hdHRlci5cbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIHJldHJpZXZlIHRoZSBmcm9udCBtYXR0ZXIgZnJvbS5cbiAqIEByZXR1cm5zIFRoZSBjb21iaW5lZCBmcm9udCBtYXR0ZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRGcm9udG1hdHRlclNhZmU8Q3VzdG9tRnJvbnRtYXR0ZXIgPSB1bmtub3duPihhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IFByb21pc2U8Q29tYmluZWRGcm9udG1hdHRlcjxDdXN0b21Gcm9udG1hdHRlcj4+IHtcbiAgY29uc3QgY2FjaGUgPSBhd2FpdCBnZXRDYWNoZVNhZmUoYXBwLCBwYXRoT3JGaWxlKTtcbiAgcmV0dXJuIChjYWNoZT8uZnJvbnRtYXR0ZXIgPz8ge30pIGFzIENvbWJpbmVkRnJvbnRtYXR0ZXI8Q3VzdG9tRnJvbnRtYXR0ZXI+O1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgc2VsZWN0ZWQgcmVmZXJlbmNlcyAobGlua3MsIGVtYmVkcywgZnJvbnRtYXR0ZXIgbGlua3MgYW5kIHRoZSBvcHRlZC1pbiBleHRyYXMpIGZyb20gdGhlXG4gKiBwcm92aWRlZCBjYWNoZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHJldHJpZXZpbmcgdGhlIHJlZmVyZW5jZXMuXG4gKiBAcmV0dXJucyBUaGUgc2VsZWN0ZWQgcmVmZXJlbmNlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlZmVyZW5jZXMocGFyYW1zOiBHZXRSZWZlcmVuY2VzUGFyYW1zKTogUmVmZXJlbmNlW10ge1xuICBjb25zdCB7XG4gICAgY2FjaGUsXG4gICAgc2hvdWxkSW5jbHVkZUVtYmVkcyA9IHRydWUsXG4gICAgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3MgPSBmYWxzZSxcbiAgICBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgc2hvdWxkSW5jbHVkZUZyb250bWF0dGVyTGlua3MgPSB0cnVlLFxuICAgIHNob3VsZEluY2x1ZGVMaW5rcyA9IHRydWUsXG4gICAgc2hvdWxkSW5jbHVkZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSBmYWxzZSxcbiAgICBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3MgPSBmYWxzZVxuICB9ID0gcGFyYW1zO1xuXG4gIGxldCBsaW5rczogUmVmZXJlbmNlW10gPSBbXG4gICAgLi4uKHNob3VsZEluY2x1ZGVMaW5rcyA/IGNhY2hlLmxpbmtzID8/IFtdIDogW10pLFxuICAgIC4uLihzaG91bGRJbmNsdWRlRW1iZWRzID8gY2FjaGUuZW1iZWRzID8/IFtdIDogW10pLFxuICAgIC4uLihzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJMaW5rcyA/IGNhY2hlLmZyb250bWF0dGVyTGlua3MgPz8gW10gOiBbXSlcbiAgXTtcblxuICBjb25zdCBmZWF0dXJlTGlua1NlbGVjdG9yczogRmVhdHVyZUxpbmtTZWxlY3RvcltdID0gW1xuICAgIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnYm9keSBleHRlcm5hbCBsaW5rcycsXG4gICAgICBmZWF0dXJlOiBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5FeHRlcm5hbExpbmtzLFxuICAgICAgc2VsZWN0OiAoY2FjaGVFeCkgPT4gY2FjaGVFeC5leHRlcm5hbExpbmtzLFxuICAgICAgc2hvdWxkSW5jbHVkZTogc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3NcbiAgICB9LFxuICAgIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnZnJvbnRtYXR0ZXIgZXh0ZXJuYWwgbGlua3MnLFxuICAgICAgZmVhdHVyZTogQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzLFxuICAgICAgc2VsZWN0OiAoY2FjaGVFeCkgPT4gY2FjaGVFeC5mcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICBzaG91bGRJbmNsdWRlOiBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzXG4gICAgfSxcbiAgICB7XG4gICAgICBkZXNjcmlwdGlvbjogJ211bHRpLXZhbHVlIGZyb250bWF0dGVyIGV4dGVybmFsIGxpbmtzJyxcbiAgICAgIGZlYXR1cmU6IENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLk11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICBzZWxlY3Q6IChjYWNoZUV4KSA9PiBjYWNoZUV4Lm11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICBzaG91bGRJbmNsdWRlOiBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc1xuICAgIH0sXG4gICAge1xuICAgICAgZGVzY3JpcHRpb246ICdtdWx0aS12YWx1ZSBmcm9udG1hdHRlciBsaW5rcycsXG4gICAgICBmZWF0dXJlOiBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5NdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcyxcbiAgICAgIHNlbGVjdDogKGNhY2hlRXgpID0+IGNhY2hlRXgubXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3MsXG4gICAgICBzaG91bGRJbmNsdWRlOiBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3NcbiAgICB9XG4gIF07XG5cbiAgZm9yIChjb25zdCBmZWF0dXJlTGlua1NlbGVjdG9yIG9mIGZlYXR1cmVMaW5rU2VsZWN0b3JzKSB7XG4gICAgaWYgKCFmZWF0dXJlTGlua1NlbGVjdG9yLnNob3VsZEluY2x1ZGUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghaXNDYWNoZWRNZXRhZGF0YUV4KGNhY2hlKSB8fCAhY2FjaGUuZmVhdHVyZXMuaW5jbHVkZXMoZmVhdHVyZUxpbmtTZWxlY3Rvci5mZWF0dXJlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgaW5jbHVkZSAke2ZlYXR1cmVMaW5rU2VsZWN0b3IuZGVzY3JpcHRpb259OiB0aGUgY2FjaGUgd2FzIG5vdCBjb21wdXRlZCB3aXRoIHRoZSAke2ZlYXR1cmVMaW5rU2VsZWN0b3IuZmVhdHVyZX0gZmVhdHVyZS5gKTtcbiAgICB9XG5cbiAgICBsaW5rcy5wdXNoKC4uLmVuc3VyZU5vbk51bGxhYmxlKGZlYXR1cmVMaW5rU2VsZWN0b3Iuc2VsZWN0KGNhY2hlKSkpO1xuICB9XG5cbiAgc29ydFJlZmVyZW5jZXMobGlua3MpO1xuXG4gIC8vIEJVRzogaHR0cHM6Ly9mb3J1bS5vYnNpZGlhbi5tZC90L2J1Zy1kdXBsaWNhdGVkLWxpbmtzLWluLW1ldGFkYXRhY2FjaGUtaW5zaWRlLWZvb3Rub3Rlcy84NTU1MVxuICBsaW5rcyA9IGxpbmtzLmZpbHRlcigobGluaywgaW5kZXgpID0+IHtcbiAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXZpb3VzTGluayA9IGVuc3VyZU5vbk51bGxhYmxlKGxpbmtzW2luZGV4IC0gMV0pO1xuXG4gICAgaWYgKGlzUmVmZXJlbmNlQ2FjaGUobGluaykgJiYgaXNSZWZlcmVuY2VDYWNoZShwcmV2aW91c0xpbmspKSB7XG4gICAgICByZXR1cm4gbGluay5wb3NpdGlvbi5zdGFydC5vZmZzZXQgIT09IHByZXZpb3VzTGluay5wb3NpdGlvbi5zdGFydC5vZmZzZXQ7XG4gICAgfVxuXG4gICAgaWYgKGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGUobGluaykgJiYgaXNGcm9udG1hdHRlckxpbmtDYWNoZShwcmV2aW91c0xpbmspKSB7XG4gICAgICBjb25zdCBsaW5rU3RhcnRPZmZzZXQgPSBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMobGluaykgPyBsaW5rLnN0YXJ0T2Zmc2V0IDogMDtcbiAgICAgIGNvbnN0IHByZXZpb3VzTGlua1N0YXJ0T2Zmc2V0ID0gaXNGcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzKHByZXZpb3VzTGluaykgPyBwcmV2aW91c0xpbmsuc3RhcnRPZmZzZXQgOiAwO1xuICAgICAgcmV0dXJuIGxpbmsua2V5ICE9PSBwcmV2aW91c0xpbmsua2V5IHx8IGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0cyhsaW5rKSAhPT0gaXNGcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzKHByZXZpb3VzTGluaylcbiAgICAgICAgfHwgbGlua1N0YXJ0T2Zmc2V0ICE9PSBwcmV2aW91c0xpbmtTdGFydE9mZnNldDtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG5cbiAgcmV0dXJuIGxpbmtzO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIGJhY2tsaW5rIGNhY2hlIHBsdWdpbiBpcyBjdXJyZW50bHkgbG9hZGVkIC0gZWl0aGVyIGBBZHZhbmNlZCBNZXRhZGF0YSBDYWNoZWAgKHtAbGluayBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9QTFVHSU5fSUR9KSBvciBpdHMgcmV0aXJlZCBwcmVkZWNlc3NvciBgQmFja2xpbmsgQ2FjaGVgICh7QGxpbmsgQkFDS0xJTktfQ0FDSEVfUExVR0lOX0lEfSkuXG4gKlxuICogU3VjaCBhIHBsdWdpbiBrZWVwcyBhIGRyYWluLW9uLXJlYWQgYmFja2xpbmsgaW5kZXggYW5kIGluZGV4ZXMgY2FudmFzIG1ldGFkYXRhLCBzbyBhIGNhbGxlciB0aGF0IGNvbXBlbnNhdGVzIGZvciBPYnNpZGlhbidzIG93biBnYXBzIGNhbiBzdGFuZCBkb3duIHdoaWxlIG9uZSBpcyBwcmVzZW50LiBCb3RoIGlkcyBhcmUgcmVjb2duaXplZDsge0BsaW5rIEJBQ0tMSU5LX0NBQ0hFX1BMVUdJTl9JRH0gcmVjb3JkcyB3aGVuIHRoZSByZXRpcmVkIG9uZSBtYXkgYmUgZHJvcHBlZC5cbiAqXG4gKiBUaGlzIHJlYWRzIHRoZSBMT0FERUQgcGx1Z2luIGluc3RhbmNlIHJhdGhlciB0aGFuIGBhcHAucGx1Z2lucy5lbmFibGVkUGx1Z2luc2AsIGRlbGliZXJhdGVseTogdGhlIHF1ZXN0aW9uIGlzIHdoZXRoZXIgdGhlIHBsdWdpbidzIHBhdGNoZXMgYXJlIGluIHBsYWNlIHJpZ2h0IG5vdywgYW5kIHRoZXkgYXJlIG5vdCB1bnRpbCBpdCBoYXMgbG9hZGVkLiBQbHVnaW5zIGxvYWQgaW4gYW4gdW5zcGVjaWZpZWQgb3JkZXIsIHNvIGNhbGwgdGhpcyBmcm9tIGEgdXNlci1kcml2ZW4gcGF0aCByYXRoZXIgdGhhbiBmcm9tIHBsdWdpbiBsb2FkIC0gc2VlIHJ1bGUgTDI1IGluIGBBR0VOVFMubWRgLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHJldHVybnMgYHRydWVgIGlmIGEgYmFja2xpbmsgY2FjaGUgcGx1Z2luIGlzIGxvYWRlZCwgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNCYWNrbGlua0NhY2hlUGx1Z2luKGFwcDogQXBwKTogYm9vbGVhbiB7XG4gIHJldHVybiBhcHAucGx1Z2lucy5nZXRQbHVnaW4oQURWQU5DRURfTUVUQURBVEFfQ0FDSEVfUExVR0lOX0lEKSAhPT0gbnVsbCB8fCBhcHAucGx1Z2lucy5nZXRQbHVnaW4oQkFDS0xJTktfQ0FDSEVfUExVR0lOX0lEKSAhPT0gbnVsbDtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBjYWNoZSBpcyBhIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4fSAoaS5lLiBpdCB3YXMgY29tcHV0ZWQgd2l0aCBleHRlcm5hbC1saW5rXG4gKiBwYXJzaW5nIGVuYWJsZWQpLlxuICpcbiAqIEBwYXJhbSBjYWNoZSAtIFRoZSBjYWNoZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgY2FjaGUgaXMgYSB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeH0sIG90aGVyd2lzZSBgZmFsc2VgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDYWNoZWRNZXRhZGF0YUV4KGNhY2hlOiBDYWNoZWRNZXRhZGF0YSk6IGNhY2hlIGlzIENhY2hlZE1ldGFkYXRhRXgge1xuICByZXR1cm4gJ2ZlYXR1cmVzJyBpbiBjYWNoZTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgdGhlIG1ldGFkYXRhIGZvciBhIGdpdmVuIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSAkc3RyaW5nIC0gVGhlIHN0cmluZyB0byBwYXJzZSB0aGUgbWV0YWRhdGEgZm9yLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyc2Ugb3B0aW9ucyBjb250cm9sbGluZyB3aGljaCBhZGRpdGlvbmFsIGxpbmtzIHRvIHBhcnNlLlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBtZXRhZGF0YS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBhcnNlTWV0YWRhdGEoYXBwOiBBcHAsICRzdHJpbmc6IHN0cmluZywgb3B0aW9uczogUGFyc2VNZXRhZGF0YU9wdGlvbnMgPSB7fSk6IFByb21pc2U8Q2FjaGVkTWV0YWRhdGFFeD4ge1xuICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gIGNvbnN0IGJ1ZmZlciA9IGVuY29kZXIuZW5jb2RlKCRzdHJpbmcpLmJ1ZmZlcjtcbiAgY29uc3QgY2FjaGUgPSBhd2FpdCBhcHAubWV0YWRhdGFDYWNoZS5jb21wdXRlTWV0YWRhdGFBc3luYyhidWZmZXIpID8/IHt9O1xuICByZXR1cm4gdG9QYXJzZWRDYWNoZWRNZXRhZGF0YUV4KHsgY2FjaGUsIGNvbnRlbnQ6ICRzdHJpbmcsIG9wdGlvbnMgfSk7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIHRoZSBmaWxlIGNhY2hlIGZvciBhIG5vbi1leGlzdGluZyBmaWxlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgcmVnaXN0ZXJpbmcgdGhlIGZpbGUgY2FjaGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBEaXNwb3NhYmxlfSB0aGF0IHVucmVnaXN0ZXJzIHRoZSBmaWxlIGNhY2hlIHdoZW4gZGlzcG9zZWQsIGZvciB1c2Ugd2l0aCBgdXNpbmdgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGUocGFyYW1zOiBSZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZVBhcmFtcyk6IERpc3Bvc2FibGUge1xuICBjb25zdCB7IGFwcCwgY2FjaGUsIHBhdGhPckZpbGUgfSA9IHBhcmFtcztcbiAgY29uc3QgZmlsZSA9IGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGUsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbiAgaWYgKCFmaWxlLmRlbGV0ZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpbGUgaXMgZXhpc3RpbmcnKTtcbiAgfVxuXG4gIGFwcC5tZXRhZGF0YUNhY2hlLmZpbGVDYWNoZVtmaWxlLnBhdGhdID0ge1xuICAgIGhhc2g6IGZpbGUucGF0aCxcbiAgICBtdGltZTogMCxcbiAgICBzaXplOiAwXG4gIH07XG5cbiAgYXBwLm1ldGFkYXRhQ2FjaGUubWV0YWRhdGFDYWNoZVtmaWxlLnBhdGhdID0gY2FjaGU7XG5cbiAgcmV0dXJuIG5ldyBDYWxsYmFja0Rpc3Bvc2FibGUoe1xuICAgIGNhbGxiYWNrOiAoKTogdm9pZCA9PiB7XG4gICAgICB1bnJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlKGFwcCwgZmlsZSk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgZmlsZXMgaW4gdGhlIE9ic2lkaWFuIGFwcC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBmaWxlcyAtIFRoZSBmaWxlcyB0byByZWdpc3Rlci5cbiAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgdW5yZWdpc3RlcnMgdGhlIGZpbGVzIHdoZW4gZGlzcG9zZWQsIGZvciB1c2Ugd2l0aCBgdXNpbmdgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJGaWxlcyhhcHA6IEFwcCwgZmlsZXM6IFRBYnN0cmFjdEZpbGVbXSk6IERpc3Bvc2FibGUge1xuICBjb25zdCByZWdpc3RlcmVkRmlsZXNDb3VudHMgPSBnZXRSZWdpc3RlcmVkRmlsZXNDb3VudHMoKTtcblxuICBmb3IgKGxldCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgd2hpbGUgKGZpbGUuZGVsZXRlZCkge1xuICAgICAgbGV0IGNvdW50ID0gcmVnaXN0ZXJlZEZpbGVzQ291bnRzLmdldChmaWxlLnBhdGgpID8/IDA7XG4gICAgICBjb3VudCsrO1xuICAgICAgcmVnaXN0ZXJlZEZpbGVzQ291bnRzLnNldChmaWxlLnBhdGgsIGNvdW50KTtcblxuICAgICAgYXBwLnZhdWx0LmZpbGVNYXBbZmlsZS5wYXRoXSA9IGZpbGU7XG5cbiAgICAgIGlmIChpc0ZpbGUoZmlsZSkpIHtcbiAgICAgICAgYXBwLm1ldGFkYXRhQ2FjaGUudW5pcXVlRmlsZUxvb2t1cC5hZGQoZmlsZS5uYW1lLnRvTG93ZXJDYXNlKCksIGZpbGUpO1xuICAgICAgfVxuXG4gICAgICBmaWxlID0gZ2V0Rm9sZGVyKHtcbiAgICAgICAgYXBwLFxuICAgICAgICBwYXRoT3JGb2xkZXI6IHBhcmVudEZvbGRlclBhdGgoZmlsZS5wYXRoKSxcbiAgICAgICAgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IENhbGxiYWNrRGlzcG9zYWJsZSh7XG4gICAgY2FsbGJhY2s6ICgpOiB2b2lkID0+IHtcbiAgICAgIHVucmVnaXN0ZXJGaWxlcyhhcHAsIGZpbGVzKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFVucmVnaXN0ZXJzIHRoZSBmaWxlIGNhY2hlIGZvciBhIG5vbi1leGlzdGluZyBmaWxlLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIHVucmVnaXN0ZXIgdGhlIGZpbGUgY2FjaGUgZm9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5yZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZShhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IHZvaWQge1xuICBjb25zdCBmaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZSwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICBpZiAoIWZpbGUuZGVsZXRlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmlsZSBpcyBleGlzdGluZycpO1xuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGUgLS0gV2UgaGF2ZSBubyBvdGhlciB3YXkgdG8gZGVsZXRlIHRoZSBwcm9wZXJ0eS5cbiAgZGVsZXRlIGFwcC5tZXRhZGF0YUNhY2hlLmZpbGVDYWNoZVtmaWxlLnBhdGhdO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlIC0tIFdlIGhhdmUgbm8gb3RoZXIgd2F5IHRvIGRlbGV0ZSB0aGUgcHJvcGVydHkuXG4gIGRlbGV0ZSBhcHAubWV0YWRhdGFDYWNoZS5tZXRhZGF0YUNhY2hlW2ZpbGUucGF0aF07XG59XG5cbi8qKlxuICogVW5yZWdpc3RlcnMgZmlsZXMgZnJvbSB0aGUgT2JzaWRpYW4gYXBwLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIGZpbGVzIC0gVGhlIGZpbGVzIHRvIHVucmVnaXN0ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnJlZ2lzdGVyRmlsZXMoYXBwOiBBcHAsIGZpbGVzOiBUQWJzdHJhY3RGaWxlW10pOiB2b2lkIHtcbiAgY29uc3QgcmVnaXN0ZXJlZEZpbGVzQ291bnRzID0gZ2V0UmVnaXN0ZXJlZEZpbGVzQ291bnRzKCk7XG5cbiAgZm9yIChsZXQgZmlsZSBvZiBmaWxlcykge1xuICAgIHdoaWxlIChmaWxlLmRlbGV0ZWQpIHtcbiAgICAgIGxldCBjb3VudCA9IHJlZ2lzdGVyZWRGaWxlc0NvdW50cy5nZXQoZmlsZS5wYXRoKSA/PyAxO1xuICAgICAgY291bnQtLTtcbiAgICAgIHJlZ2lzdGVyZWRGaWxlc0NvdW50cy5zZXQoZmlsZS5wYXRoLCBjb3VudCk7XG4gICAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgICAgcmVnaXN0ZXJlZEZpbGVzQ291bnRzLmRlbGV0ZShmaWxlLnBhdGgpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlIC0tIFdlIGhhdmUgbm8gb3RoZXIgd2F5IHRvIGRlbGV0ZSB0aGUgcHJvcGVydHkuXG4gICAgICAgIGRlbGV0ZSBhcHAudmF1bHQuZmlsZU1hcFtmaWxlLnBhdGhdO1xuXG4gICAgICAgIGlmIChpc0ZpbGUoZmlsZSkpIHtcbiAgICAgICAgICBhcHAubWV0YWRhdGFDYWNoZS51bmlxdWVGaWxlTG9va3VwLnJlbW92ZShmaWxlLm5hbWUudG9Mb3dlckNhc2UoKSwgZmlsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZmlsZSA9IGdldEZvbGRlcih7XG4gICAgICAgIGFwcCxcbiAgICAgICAgcGF0aE9yRm9sZGVyOiBwYXJlbnRGb2xkZXJQYXRoKGZpbGUucGF0aCksXG4gICAgICAgIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRBZHZhbmNlZE1ldGFkYXRhQ2FjaGVCYWNrbGlua3NBcGkoKTogQWR2YW5jZWRNZXRhZGF0YUNhY2hlQmFja2xpbmtzQXBpIHwgbnVsbCB7XG4gIHJldHVybiBmaW5kUGx1Z2luQXBpPEFkdmFuY2VkTWV0YWRhdGFDYWNoZUJhY2tsaW5rc0FwaT4oe1xuICAgIGFwaVZlcnNpb25SYW5nZTogQURWQU5DRURfTUVUQURBVEFfQ0FDSEVfQkFDS0xJTktTX0FQSV9WRVJTSU9OX1JBTkdFLFxuICAgIGNvbnRyYWN0OiBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9CQUNLTElOS1NfQVBJX0NPTlRSQUNULFxuICAgIHBsdWdpbklkOiBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9QTFVHSU5fSURcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFJlZ2lzdGVyZWRGaWxlc0NvdW50cygpOiBNYXA8c3RyaW5nLCBudW1iZXI+IHtcbiAgcmV0dXJuIGdldE9ic2lkaWFuTGliU3RhdGUoJ3JlZ2lzdGVyZWRGaWxlc0NvdW50cycsIG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCkpLnZhbHVlO1xufVxuXG4vKipcbiAqIFN0cnVjdHVyYWxseSByZWNvZ25pemVzIHRoZSBiYWNrbGlua3MgZGljdGlvbmFyeSBhbm90aGVyIHBsdWdpbidzIGNvcHkgYnVpbHQsIG9yIGBudWxsYC4gVGhlIGNsYXNzIGl0IHdhcyBidWlsdCBmcm9tIGxpdmVzIGluIHRoYXQgY29weSwgc28gYGluc3RhbmNlb2ZgIGNhbm5vdCBiZSB1c2VkIChydWxlIEw5IGluIGBBR0VOVFMubWRgKS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB2YWx1ZSBpcyBgbnVsbGAgb3IgcmVhZHMgYXMgYSBiYWNrbGlua3MgZGljdGlvbmFyeS5cbiAqL1xuZnVuY3Rpb24gaXNOdWxsYWJsZUJhY2tsaW5rc0RpY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlPiB8IG51bGwge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGxcbiAgICB8fCAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0J1xuICAgICAgJiYgUmVmbGVjdC5nZXQodmFsdWUsICdkYXRhJykgaW5zdGFuY2VvZiBNYXBcbiAgICAgICYmIHR5cGVvZiBSZWZsZWN0LmdldCh2YWx1ZSwgJ2dldCcpID09PSAnZnVuY3Rpb24nXG4gICAgICAmJiB0eXBlb2YgUmVmbGVjdC5nZXQodmFsdWUsICdrZXlzJykgPT09ICdmdW5jdGlvbicpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUV4dGVybmFsQm9keUxpbmtzKGNvbnRlbnQ6IHN0cmluZywgY2FjaGU6IENhY2hlZE1ldGFkYXRhKTogUGFyc2VMaW5rUmVmZXJlbmNlW10ge1xuICBjb25zdCBmcm9udG1hdHRlckVuZE9mZnNldCA9IGNhY2hlLmZyb250bWF0dGVyUG9zaXRpb24/LmVuZC5vZmZzZXQgPz8gMDtcbiAgcmV0dXJuIHBhcnNlTGlua3MoY29udGVudClcbiAgICAuZmlsdGVyKChwYXJzZUxpbmtSZXN1bHQpID0+IHBhcnNlTGlua1Jlc3VsdC5pc0V4dGVybmFsICYmIHBhcnNlTGlua1Jlc3VsdC5zdGFydE9mZnNldCA+PSBmcm9udG1hdHRlckVuZE9mZnNldClcbiAgICAubWFwKChwYXJzZUxpbmtSZXN1bHQpID0+IHRvUGFyc2VMaW5rUmVmZXJlbmNlKHsgY29udGVudCwgcGFyc2VMaW5rUmVzdWx0IH0pKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VGcm9udG1hdHRlck9yTnVsbChjb250ZW50OiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IENvbWJpbmVkRnJvbnRtYXR0ZXI8dW5rbm93bj4gfCBudWxsIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcGFyc2VGcm9udG1hdHRlcihjb250ZW50KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBwcmludEVycm9yKG5ldyBFcnJvcihgRnJvbnRtYXR0ZXIgcGFyc2luZyBmYWlsZWQgaW4gJHtwYXRofWAsIHsgY2F1c2U6IGVycm9yIH0pKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b1BhcnNlZENhY2hlZE1ldGFkYXRhRXgocGFyYW1zOiBUb1BhcnNlZENhY2hlZE1ldGFkYXRhRXhQYXJhbXMpOiBDYWNoZWRNZXRhZGF0YUV4IHtcbiAgY29uc3QgeyBjYWNoZSwgY29udGVudCwgb3B0aW9ucyB9ID0gcGFyYW1zO1xuICBjb25zdCBmZWF0dXJlczogQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmVbXSA9IFtDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5OYXRpdmVdO1xuICBjb25zdCByZXN1bHQ6IENhY2hlZE1ldGFkYXRhRXggPSB7IC4uLmNhY2hlLCBmZWF0dXJlcyB9O1xuXG4gIGlmIChvcHRpb25zLnNob3VsZFBhcnNlRXh0ZXJuYWxMaW5rcykge1xuICAgIHJlc3VsdC5leHRlcm5hbExpbmtzID0gcGFyc2VFeHRlcm5hbEJvZHlMaW5rcyhjb250ZW50LCBjYWNoZSk7XG4gICAgZmVhdHVyZXMucHVzaChDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5FeHRlcm5hbExpbmtzKTtcbiAgfVxuXG4gIGlmIChcbiAgICBvcHRpb25zLnNob3VsZFBhcnNlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzXG4gICAgfHwgb3B0aW9ucy5zaG91bGRQYXJzZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3NcbiAgICB8fCBvcHRpb25zLnNob3VsZFBhcnNlTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3NcbiAgKSB7XG4gICAgY29uc3QgZnJvbnRtYXR0ZXJMaW5rcyA9IHBhcnNlRnJvbnRtYXR0ZXJMaW5rcyhjYWNoZS5mcm9udG1hdHRlcik7XG5cbiAgICBpZiAob3B0aW9ucy5zaG91bGRQYXJzZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcykge1xuICAgICAgcmVzdWx0LmZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZyb250bWF0dGVyTGlua3MuZnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzO1xuICAgICAgZmVhdHVyZXMucHVzaChDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5Gcm9udG1hdHRlckV4dGVybmFsTGlua3MpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnNob3VsZFBhcnNlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcykge1xuICAgICAgcmVzdWx0Lm11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSBmcm9udG1hdHRlckxpbmtzLm11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M7XG4gICAgICBmZWF0dXJlcy5wdXNoKENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLk11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnNob3VsZFBhcnNlTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3MpIHtcbiAgICAgIHJlc3VsdC5tdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcyA9IGZyb250bWF0dGVyTGlua3MubXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3M7XG4gICAgICBmZWF0dXJlcy5wdXNoKENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLk11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdCQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsa0JBQWtCO0FB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QUFDLEVBQUU7QUFDakY7QUFRQSxTQUFTLHdCQUF3QixPQUE0RDtBQUMzRixTQUFPLFVBQVUsUUFDWCxPQUFPLFVBQVUsWUFDaEIsUUFBUSxJQUFJLE9BQU8sTUFBTSxhQUFhLE9BQ3RDLE9BQU8sUUFBUSxJQUFJLE9BQU8sS0FBSyxNQUFNLGNBQ3JDLE9BQU8sUUFBUSxJQUFJLE9BQU8sTUFBTSxNQUFNO0FBQy9DO0FBRUEsU0FBUyx1QkFBdUIsU0FBaUIsT0FBNkM7QUFDNUYsUUFBTSx1QkFBdUIsTUFBTSxxQkFBcUIsSUFBSSxVQUFVO0FBQ3RFLFNBQU8sV0FBVyxPQUFPLEVBQ3RCLE9BQU8sQ0FBQyxvQkFBb0IsZ0JBQWdCLGNBQWMsZ0JBQWdCLGVBQWUsb0JBQW9CLEVBQzdHLElBQUksQ0FBQyxvQkFBb0IscUJBQXFCLEVBQUUsU0FBUyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ2hGO0FBRUEsU0FBUyx1QkFBdUIsU0FBaUIsTUFBbUQ7QUFDbEcsTUFBSTtBQUNGLFdBQU8saUJBQWlCLE9BQU87QUFBQSxFQUNqQyxTQUFTLE9BQU87QUFDZCxlQUFXLElBQUksTUFBTSxpQ0FBaUMsSUFBSSxJQUFJLEVBQUUsT0FBTyxNQUFNLENBQUMsQ0FBQztBQUMvRSxXQUFPO0FBQUEsRUFDVDtBQUNGO0FBRUEsU0FBUyx5QkFBeUIsUUFBMEQ7QUFDMUYsUUFBTSxFQUFFLE9BQU8sU0FBUyxRQUFRLElBQUk7QUFDcEMsUUFBTSxXQUFzQyxDQUFDLHFCQUE4QjtBQUMzRSxRQUFNLFNBQTJCLEVBQUUsR0FBRyxPQUFPLFNBQVM7QUFFdEQsTUFBSSxRQUFRLDBCQUEwQjtBQUNwQyxXQUFPLGdCQUFnQix1QkFBdUIsU0FBUyxLQUFLO0FBQzVELGFBQVMsS0FBSyxtQ0FBcUM7QUFBQSxFQUNyRDtBQUVBLE1BQ0UsUUFBUSx1Q0FDTCxRQUFRLGlEQUNSLFFBQVEsdUNBQ1g7QUFDQSxVQUFNLG1CQUFtQixzQkFBc0IsTUFBTSxXQUFXO0FBRWhFLFFBQUksUUFBUSxxQ0FBcUM7QUFDL0MsYUFBTywyQkFBMkIsaUJBQWlCO0FBQ25ELGVBQVMsS0FBSyx5REFBZ0Q7QUFBQSxJQUNoRTtBQUVBLFFBQUksUUFBUSwrQ0FBK0M7QUFDekQsYUFBTyxxQ0FBcUMsaUJBQWlCO0FBQzdELGVBQVMsS0FBSyw2RUFBMEQ7QUFBQSxJQUMxRTtBQUVBLFFBQUksUUFBUSx1Q0FBdUM7QUFDakQsYUFBTyw2QkFBNkIsaUJBQWlCO0FBQ3JELGVBQVMsS0FBSyw2REFBa0Q7QUFBQSxJQUNsRTtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7IiwibmFtZXMiOlsiQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUiXX0=
@@ -0,0 +1,55 @@
1
+ /// <reference path="./library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Contains utility functions for comparing positions within a file's content.
6
+ */
7
+ import type { Pos } from 'obsidian';
8
+ import type { OffsetRange } from './reference.mjs';
9
+ /**
10
+ * A position, or anything that carries one.
11
+ */
12
+ export type PositionContainer = Pos | Positioned;
13
+ /**
14
+ * Anything that carries a position within a file's content: a reference cache, a heading, a section, a list
15
+ * item, and so on.
16
+ */
17
+ export interface Positioned {
18
+ /**
19
+ * A position within the file's content.
20
+ */
21
+ readonly position: Pos;
22
+ }
23
+ /**
24
+ * Checks if a position is fully contained within an offset range.
25
+ *
26
+ * Containment is full and both bounds are inclusive: a position that coincides exactly with the range is
27
+ * inside it, and one that only partially overlaps it is not.
28
+ *
29
+ * @param position - The position to check.
30
+ * @param offsetRange - The offset range to check against.
31
+ * @returns Whether the position is fully contained within the offset range.
32
+ */
33
+ export declare function isPositionInOffsetRange(position: Pos, offsetRange: OffsetRange): boolean;
34
+ /**
35
+ * Checks if a position is fully contained within another position.
36
+ *
37
+ * Only the offsets are compared. Containment is full and both bounds are inclusive: a position equal to the
38
+ * outer one is inside it, and one that only partially overlaps it is not.
39
+ *
40
+ * @param inner - The position to check.
41
+ * @param outer - The position to check against.
42
+ * @returns Whether the inner position is fully contained within the outer one.
43
+ */
44
+ export declare function isPositionInside(inner: Pos, outer: Pos): boolean;
45
+ /**
46
+ * Checks if a position is fully contained within any of the given containers.
47
+ *
48
+ * Each container is a position, or anything that carries one (a reference cache, a heading, a section). The
49
+ * containment test is {@link isPositionInside}.
50
+ *
51
+ * @param inner - The position to check.
52
+ * @param containers - The positions, or things carrying positions, to check against.
53
+ * @returns Whether the inner position is fully contained within at least one container.
54
+ */
55
+ export declare function isPositionInsideAnyOf(inner: Pos, containers: readonly PositionContainer[]): boolean;
@@ -0,0 +1,23 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ function isPositionInOffsetRange(position, offsetRange) {
7
+ return offsetRange.startOffset <= position.start.offset && position.end.offset <= offsetRange.endOffset;
8
+ }
9
+ function isPositionInside(inner, outer) {
10
+ return outer.start.offset <= inner.start.offset && inner.end.offset <= outer.end.offset;
11
+ }
12
+ function isPositionInsideAnyOf(inner, containers) {
13
+ return containers.some((container) => isPositionInside(inner, getPosition(container)));
14
+ }
15
+ function getPosition(container) {
16
+ return "position" in container ? container.position : container;
17
+ }
18
+ export {
19
+ isPositionInOffsetRange,
20
+ isPositionInside,
21
+ isPositionInsideAnyOf
22
+ };
23
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3Bvc2l0aW9uLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGNvbXBhcmluZyBwb3NpdGlvbnMgd2l0aGluIGEgZmlsZSdzIGNvbnRlbnQuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBQb3MgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgT2Zmc2V0UmFuZ2UgfSBmcm9tICcuL3JlZmVyZW5jZS50cyc7XG5cbi8qKlxuICogQSBwb3NpdGlvbiwgb3IgYW55dGhpbmcgdGhhdCBjYXJyaWVzIG9uZS5cbiAqL1xuZXhwb3J0IHR5cGUgUG9zaXRpb25Db250YWluZXIgPSBQb3MgfCBQb3NpdGlvbmVkO1xuXG4vKipcbiAqIEFueXRoaW5nIHRoYXQgY2FycmllcyBhIHBvc2l0aW9uIHdpdGhpbiBhIGZpbGUncyBjb250ZW50OiBhIHJlZmVyZW5jZSBjYWNoZSwgYSBoZWFkaW5nLCBhIHNlY3Rpb24sIGEgbGlzdFxuICogaXRlbSwgYW5kIHNvIG9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBvc2l0aW9uZWQge1xuICAvKipcbiAgICogQSBwb3NpdGlvbiB3aXRoaW4gdGhlIGZpbGUncyBjb250ZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgcG9zaXRpb246IFBvcztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBwb3NpdGlvbiBpcyBmdWxseSBjb250YWluZWQgd2l0aGluIGFuIG9mZnNldCByYW5nZS5cbiAqXG4gKiBDb250YWlubWVudCBpcyBmdWxsIGFuZCBib3RoIGJvdW5kcyBhcmUgaW5jbHVzaXZlOiBhIHBvc2l0aW9uIHRoYXQgY29pbmNpZGVzIGV4YWN0bHkgd2l0aCB0aGUgcmFuZ2UgaXNcbiAqIGluc2lkZSBpdCwgYW5kIG9uZSB0aGF0IG9ubHkgcGFydGlhbGx5IG92ZXJsYXBzIGl0IGlzIG5vdC5cbiAqXG4gKiBAcGFyYW0gcG9zaXRpb24gLSBUaGUgcG9zaXRpb24gdG8gY2hlY2suXG4gKiBAcGFyYW0gb2Zmc2V0UmFuZ2UgLSBUaGUgb2Zmc2V0IHJhbmdlIHRvIGNoZWNrIGFnYWluc3QuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBwb3NpdGlvbiBpcyBmdWxseSBjb250YWluZWQgd2l0aGluIHRoZSBvZmZzZXQgcmFuZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Bvc2l0aW9uSW5PZmZzZXRSYW5nZShwb3NpdGlvbjogUG9zLCBvZmZzZXRSYW5nZTogT2Zmc2V0UmFuZ2UpOiBib29sZWFuIHtcbiAgcmV0dXJuIG9mZnNldFJhbmdlLnN0YXJ0T2Zmc2V0IDw9IHBvc2l0aW9uLnN0YXJ0Lm9mZnNldCAmJiBwb3NpdGlvbi5lbmQub2Zmc2V0IDw9IG9mZnNldFJhbmdlLmVuZE9mZnNldDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBwb3NpdGlvbiBpcyBmdWxseSBjb250YWluZWQgd2l0aGluIGFub3RoZXIgcG9zaXRpb24uXG4gKlxuICogT25seSB0aGUgb2Zmc2V0cyBhcmUgY29tcGFyZWQuIENvbnRhaW5tZW50IGlzIGZ1bGwgYW5kIGJvdGggYm91bmRzIGFyZSBpbmNsdXNpdmU6IGEgcG9zaXRpb24gZXF1YWwgdG8gdGhlXG4gKiBvdXRlciBvbmUgaXMgaW5zaWRlIGl0LCBhbmQgb25lIHRoYXQgb25seSBwYXJ0aWFsbHkgb3ZlcmxhcHMgaXQgaXMgbm90LlxuICpcbiAqIEBwYXJhbSBpbm5lciAtIFRoZSBwb3NpdGlvbiB0byBjaGVjay5cbiAqIEBwYXJhbSBvdXRlciAtIFRoZSBwb3NpdGlvbiB0byBjaGVjayBhZ2FpbnN0LlxuICogQHJldHVybnMgV2hldGhlciB0aGUgaW5uZXIgcG9zaXRpb24gaXMgZnVsbHkgY29udGFpbmVkIHdpdGhpbiB0aGUgb3V0ZXIgb25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQb3NpdGlvbkluc2lkZShpbm5lcjogUG9zLCBvdXRlcjogUG9zKTogYm9vbGVhbiB7XG4gIHJldHVybiBvdXRlci5zdGFydC5vZmZzZXQgPD0gaW5uZXIuc3RhcnQub2Zmc2V0ICYmIGlubmVyLmVuZC5vZmZzZXQgPD0gb3V0ZXIuZW5kLm9mZnNldDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBwb3NpdGlvbiBpcyBmdWxseSBjb250YWluZWQgd2l0aGluIGFueSBvZiB0aGUgZ2l2ZW4gY29udGFpbmVycy5cbiAqXG4gKiBFYWNoIGNvbnRhaW5lciBpcyBhIHBvc2l0aW9uLCBvciBhbnl0aGluZyB0aGF0IGNhcnJpZXMgb25lIChhIHJlZmVyZW5jZSBjYWNoZSwgYSBoZWFkaW5nLCBhIHNlY3Rpb24pLiBUaGVcbiAqIGNvbnRhaW5tZW50IHRlc3QgaXMge0BsaW5rIGlzUG9zaXRpb25JbnNpZGV9LlxuICpcbiAqIEBwYXJhbSBpbm5lciAtIFRoZSBwb3NpdGlvbiB0byBjaGVjay5cbiAqIEBwYXJhbSBjb250YWluZXJzIC0gVGhlIHBvc2l0aW9ucywgb3IgdGhpbmdzIGNhcnJ5aW5nIHBvc2l0aW9ucywgdG8gY2hlY2sgYWdhaW5zdC5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGlubmVyIHBvc2l0aW9uIGlzIGZ1bGx5IGNvbnRhaW5lZCB3aXRoaW4gYXQgbGVhc3Qgb25lIGNvbnRhaW5lci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUG9zaXRpb25JbnNpZGVBbnlPZihpbm5lcjogUG9zLCBjb250YWluZXJzOiByZWFkb25seSBQb3NpdGlvbkNvbnRhaW5lcltdKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb250YWluZXJzLnNvbWUoKGNvbnRhaW5lcikgPT4gaXNQb3NpdGlvbkluc2lkZShpbm5lciwgZ2V0UG9zaXRpb24oY29udGFpbmVyKSkpO1xufVxuXG5mdW5jdGlvbiBnZXRQb3NpdGlvbihjb250YWluZXI6IFBvc2l0aW9uQ29udGFpbmVyKTogUG9zIHtcbiAgcmV0dXJuICdwb3NpdGlvbicgaW4gY29udGFpbmVyID8gY29udGFpbmVyLnBvc2l0aW9uIDogY29udGFpbmVyO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFvQ08sU0FBUyx3QkFBd0IsVUFBZSxhQUFtQztBQUN4RixTQUFPLFlBQVksZUFBZSxTQUFTLE1BQU0sVUFBVSxTQUFTLElBQUksVUFBVSxZQUFZO0FBQ2hHO0FBWU8sU0FBUyxpQkFBaUIsT0FBWSxPQUFxQjtBQUNoRSxTQUFPLE1BQU0sTUFBTSxVQUFVLE1BQU0sTUFBTSxVQUFVLE1BQU0sSUFBSSxVQUFVLE1BQU0sSUFBSTtBQUNuRjtBQVlPLFNBQVMsc0JBQXNCLE9BQVksWUFBbUQ7QUFDbkcsU0FBTyxXQUFXLEtBQUssQ0FBQyxjQUFjLGlCQUFpQixPQUFPLFlBQVksU0FBUyxDQUFDLENBQUM7QUFDdkY7QUFFQSxTQUFTLFlBQVksV0FBbUM7QUFDdEQsU0FBTyxjQUFjLFlBQVksVUFBVSxXQUFXO0FBQ3hEOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -35,6 +35,10 @@ import {
35
35
  isReferenceCache
36
36
  } from "@obsidian-typings/obsidian-public-latest/implementations";
37
37
  import { isFrontmatterLinkCacheWithOffsets } from "./frontmatter-link-cache-with-offsets.mjs";
38
+ import {
39
+ isPositionInOffsetRange,
40
+ isPositionInsideAnyOf
41
+ } from "./position.mjs";
38
42
  function getReferenceLinkText(reference) {
39
43
  return isFrontmatterLinkCacheWithOffsets(reference) ? reference.original.slice(reference.startOffset, reference.endOffset) : reference.original;
40
44
  }
@@ -51,14 +55,13 @@ function isReferenceInHeading(reference, cache) {
51
55
  if (!cache || !isReferenceCache(reference)) {
52
56
  return false;
53
57
  }
54
- const headingPositions = [
55
- ...(cache.headings ?? []).map((heading) => heading.position),
56
- ...(cache.sections ?? []).filter((section) => section.type === "heading").map((section) => section.position)
57
- ];
58
- return headingPositions.some((position) => position.start.offset <= reference.position.start.offset && reference.position.end.offset <= position.end.offset);
58
+ return isPositionInsideAnyOf(reference.position, [
59
+ ...cache.headings ?? [],
60
+ ...(cache.sections ?? []).filter((section) => section.type === "heading")
61
+ ]);
59
62
  }
60
63
  function isReferenceInOffsetRange(reference, offsetRange) {
61
- return isReferenceCache(reference) && offsetRange.startOffset <= reference.position.start.offset && reference.position.end.offset <= offsetRange.endOffset;
64
+ return isReferenceCache(reference) && isPositionInOffsetRange(reference.position, offsetRange);
62
65
  }
63
66
  function referenceToFileChange(reference, newContent) {
64
67
  return {
@@ -90,4 +93,4 @@ export {
90
93
  referenceToFileChange,
91
94
  sortReferences
92
95
  };
93
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZWZlcmVuY2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBoYW5kbGluZyByZWZlcmVuY2VzIGluIE9ic2lkaWFuLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIEZyb250bWF0dGVyTGlua0NhY2hlLFxuICBQb3MsXG4gIFJlZmVyZW5jZVxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7XG4gIGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGUsXG4gIGlzUmVmZXJlbmNlQ2FjaGVcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuXG5pbXBvcnQgdHlwZSB7IEZpbGVDaGFuZ2UgfSBmcm9tICcuL2ZpbGUtY2hhbmdlLnRzJztcblxuaW1wb3J0IHsgaXNGcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzIH0gZnJvbSAnLi9mcm9udG1hdHRlci1saW5rLWNhY2hlLXdpdGgtb2Zmc2V0cy50cyc7XG5cbi8qKlxuICogQSByZWZlcmVuY2Ugd2l0aGluIGEgZmlsZSBub2RlIGluIGEgY2FudmFzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhbnZhc0ZpbGVOb2RlUmVmZXJlbmNlIGV4dGVuZHMgQ2FudmFzUmVmZXJlbmNlIHtcbiAgLyoqXG4gICAqIEEgdHlwZSBvZiByZWZlcmVuY2UuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiAnZmlsZSc7XG59XG5cbi8qKlxuICogQSByZWZlcmVuY2Ugd2l0aGluIGEgY2FudmFzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhbnZhc1JlZmVyZW5jZSBleHRlbmRzIEZyb250bWF0dGVyTGlua0NhY2hlIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHJlZmVyZW5jZSBpcyBhIGNhbnZhcyByZWZlcmVuY2UuXG4gICAqL1xuICByZWFkb25seSBpc0NhbnZhczogdHJ1ZTtcblxuICAvKipcbiAgICogQW4gaW5kZXggb2YgdGhlIG5vZGUgaW4gdGhlIGNhbnZhcy5cbiAgICovXG4gIHJlYWRvbmx5IG5vZGVJbmRleDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIHR5cGUgb2YgcmVmZXJlbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogJ2ZpbGUnIHwgJ3RleHQnO1xufVxuXG4vKipcbiAqIEEgcmVmZXJlbmNlIHdpdGhpbiBhIHRleHQgbm9kZSBpbiBhIGNhbnZhcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYW52YXNUZXh0Tm9kZVJlZmVyZW5jZSBleHRlbmRzIENhbnZhc1JlZmVyZW5jZSB7XG4gIC8qKlxuICAgKiBBbiBvcmlnaW5hbCByZWZlcmVuY2UuXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5hbFJlZmVyZW5jZTogUmVmZXJlbmNlO1xuXG4gIC8qKlxuICAgKiBBIHR5cGUgb2YgcmVmZXJlbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogJ3RleHQnO1xufVxuXG4vKipcbiAqIEEgcmFuZ2Ugd2l0aGluIGEgZmlsZSdzIGNvbnRlbnQsIGV4cHJlc3NlZCBpbiBjaGFyYWN0ZXIgb2Zmc2V0cy5cbiAqXG4gKiBCb3RoIGJvdW5kcyBhcmUgaW5jbHVzaXZlOiBhIHJlZmVyZW5jZSB3aG9zZSBvd24gb2Zmc2V0cyBjb2luY2lkZSBleGFjdGx5IHdpdGhcbiAqIHtAbGluayBPZmZzZXRSYW5nZS5zdGFydE9mZnNldH0gLyB7QGxpbmsgT2Zmc2V0UmFuZ2UuZW5kT2Zmc2V0fSBpcyBpbnNpZGUgdGhlIHJhbmdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9mZnNldFJhbmdlIHtcbiAgLyoqXG4gICAqIEFuIGVuZCBvZmZzZXQgb2YgdGhlIHJhbmdlIHdpdGhpbiB0aGUgZmlsZSdzIGNvbnRlbnQuXG4gICAqL1xuICByZWFkb25seSBlbmRPZmZzZXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQSBzdGFydCBvZmZzZXQgb2YgdGhlIHJhbmdlIHdpdGhpbiB0aGUgZmlsZSdzIGNvbnRlbnQuXG4gICAqL1xuICByZWFkb25seSBzdGFydE9mZnNldDogbnVtYmVyO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHRleHQgb2YgdGhlIG9uZSBsaW5rIGEgcmVmZXJlbmNlIHN0YW5kcyBmb3IuXG4gKlxuICogRm9yIG1vc3QgcmVmZXJlbmNlcyB0aGF0IGlzIHtAbGluayBSZWZlcmVuY2Uub3JpZ2luYWx9LiBBIGZyb250bWF0dGVyIGxpbmsgdGhhdCBjYXJyaWVzIG9mZnNldHMgaXMgdGhlXG4gKiBleGNlcHRpb246IGl0cyBgb3JpZ2luYWxgIGlzIHRoZSBXSE9MRSBwcm9wZXJ0eSB2YWx1ZSwgd2hpY2ggbWF5IGhvbGQgc2V2ZXJhbCBsaW5rcywgYW5kIGBzdGFydE9mZnNldGAgL1xuICogYGVuZE9mZnNldGAgZ2l2ZSB0aGlzIGxpbmsncyBzcGFuIGluIGl0LiBBbnl0aGluZyB0aGF0IHBhcnNlcywgY29tcGFyZXMgb3IgcmVwbGFjZXMgdGhlIGxpbmsgYXMgb25lIGxpbmtcbiAqIG11c3QgcmVhZCB0aGF0IHNwYW4sIG5ldmVyIHRoZSB3aG9sZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlIC0gVGhlIHJlZmVyZW5jZS5cbiAqIEByZXR1cm5zIFRoZSB0ZXh0IG9mIHRoZSBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVmZXJlbmNlTGlua1RleHQocmVmZXJlbmNlOiBSZWZlcmVuY2UpOiBzdHJpbmcge1xuICByZXR1cm4gaXNGcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzKHJlZmVyZW5jZSkgPyByZWZlcmVuY2Uub3JpZ2luYWwuc2xpY2UocmVmZXJlbmNlLnN0YXJ0T2Zmc2V0LCByZWZlcmVuY2UuZW5kT2Zmc2V0KSA6IHJlZmVyZW5jZS5vcmlnaW5hbDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSByZWZlcmVuY2UgaXMgYSBjYW52YXMgZmlsZSBub2RlIHJlZmVyZW5jZS5cbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlIC0gVGhlIHJlZmVyZW5jZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHJlZmVyZW5jZSBpcyBhIGNhbnZhcyBmaWxlIG5vZGUgcmVmZXJlbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDYW52YXNGaWxlTm9kZVJlZmVyZW5jZShyZWZlcmVuY2U6IFJlZmVyZW5jZSk6IHJlZmVyZW5jZSBpcyBDYW52YXNGaWxlTm9kZVJlZmVyZW5jZSB7XG4gIHJldHVybiBpc0NhbnZhc1JlZmVyZW5jZShyZWZlcmVuY2UpICYmIHJlZmVyZW5jZS50eXBlID09PSAnZmlsZSc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcmVmZXJlbmNlIGlzIGEgY2FudmFzIHJlZmVyZW5jZS5cbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlIC0gVGhlIHJlZmVyZW5jZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHJlZmVyZW5jZSBpcyBhIGNhbnZhcyByZWZlcmVuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NhbnZhc1JlZmVyZW5jZShyZWZlcmVuY2U6IFJlZmVyZW5jZSk6IHJlZmVyZW5jZSBpcyBDYW52YXNSZWZlcmVuY2Uge1xuICByZXR1cm4gaXNGcm9udG1hdHRlckxpbmtDYWNoZShyZWZlcmVuY2UpICYmICEhKHJlZmVyZW5jZSBhcyBQYXJ0aWFsPENhbnZhc1JlZmVyZW5jZT4pLmlzQ2FudmFzO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHJlZmVyZW5jZSBpcyBhIGNhbnZhcyB0ZXh0IG5vZGUgcmVmZXJlbmNlLlxuICpcbiAqIEBwYXJhbSByZWZlcmVuY2UgLSBUaGUgcmVmZXJlbmNlIHRvIGNoZWNrLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgcmVmZXJlbmNlIGlzIGEgY2FudmFzIHRleHQgbm9kZSByZWZlcmVuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NhbnZhc1RleHROb2RlUmVmZXJlbmNlKHJlZmVyZW5jZTogUmVmZXJlbmNlKTogcmVmZXJlbmNlIGlzIENhbnZhc1RleHROb2RlUmVmZXJlbmNlIHtcbiAgcmV0dXJuIGlzQ2FudmFzUmVmZXJlbmNlKHJlZmVyZW5jZSkgJiYgcmVmZXJlbmNlLnR5cGUgPT09ICd0ZXh0Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSByZWZlcmVuY2Ugc2l0cyBpbnNpZGUgYSBoZWFkaW5nLlxuICpcbiAqIFRoZSBhbnN3ZXIgY29tZXMgZnJvbSB0aGUgcGFyc2VkIGhlYWRpbmcgcG9zaXRpb25zIG9mIHRoZSBmaWxlJ3MgbWV0YWRhdGEsIG5ldmVyIGZyb20gYSBwYXR0ZXJuIG92ZXIgaXRzXG4gKiB0ZXh0OiBhIHJlZmVyZW5jZSBpcyBpbnNpZGUgYSBoZWFkaW5nIHdoZW4gaXQgaXMgZnVsbHkgY29udGFpbmVkIGluIGEgYGhlYWRpbmdzYCBlbnRyeSBvciBpbiBhIGBoZWFkaW5nYFxuICogc2VjdGlvbi4gVGhlIHNlY3Rpb24gY292ZXJzIGEgU2V0ZXh0IGhlYWRpbmcncyB1bmRlcmxpbmUgYXMgd2VsbCwgc28gYm90aCBoZWFkaW5nIHN5bnRheGVzIGNvdW50LlxuICpcbiAqIE9ubHkgYSByZWZlcmVuY2UgdGhhdCBjYXJyaWVzIGEgcG9zaXRpb24gd2l0aGluIHRoZSBmaWxlJ3MgY29udGVudCBjYW4gYmUgaW5zaWRlIGEgaGVhZGluZy4gQVxuICoge0BsaW5rIEZyb250bWF0dGVyTGlua0NhY2hlfSDigJQgYSBmcm9udG1hdHRlciBsaW5rLCBhIG11bHRpLWxpbmsgZnJvbnRtYXR0ZXIgdmFsdWUgZW50cnksIG9yIGFueSBjYW52YXNcbiAqIHJlZmVyZW5jZSDigJQgbmV2ZXIgaXMuXG4gKlxuICogQSBsaW5rIGluIGEgaGVhZGluZyBpcyBwYXJ0IG9mIHRoYXQgaGVhZGluZydzIHRleHQsIGFuZCBzbyBvZiBldmVyeSBgI2hlYWRpbmdgIHN1YnBhdGggcG9pbnRpbmcgYXQgaXQuXG4gKiBSZXdyaXRpbmcgc3VjaCBhIGxpbmsgY2hhbmdlcyB0aGUgaGVhZGluZyB0ZXh0IGFuZCBicmVha3MgdGhvc2Ugc3VicGF0aHMsIHdoaWNoIGlzIHdoeSBhIGxpbmsgY29udmVydGVyXG4gKiBtYXkgd2FudCB0byBsZWF2ZSBpdCBhbG9uZS5cbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlIC0gVGhlIHJlZmVyZW5jZSB0byBjaGVjay5cbiAqIEBwYXJhbSBjYWNoZSAtIFRoZSBtZXRhZGF0YSBvZiB0aGUgZmlsZSB0aGUgcmVmZXJlbmNlIGJlbG9uZ3MgdG8uXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSByZWZlcmVuY2UgaXMgZnVsbHkgY29udGFpbmVkIGluIGEgaGVhZGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVmZXJlbmNlSW5IZWFkaW5nKHJlZmVyZW5jZTogUmVmZXJlbmNlLCBjYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsKTogYm9vbGVhbiB7XG4gIGlmICghY2FjaGUgfHwgIWlzUmVmZXJlbmNlQ2FjaGUocmVmZXJlbmNlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGhlYWRpbmdQb3NpdGlvbnM6IFBvc1tdID0gW1xuICAgIC4uLihjYWNoZS5oZWFkaW5ncyA/PyBbXSkubWFwKChoZWFkaW5nKSA9PiBoZWFkaW5nLnBvc2l0aW9uKSxcbiAgICAuLi4oY2FjaGUuc2VjdGlvbnMgPz8gW10pLmZpbHRlcigoc2VjdGlvbikgPT4gc2VjdGlvbi50eXBlID09PSAnaGVhZGluZycpLm1hcCgoc2VjdGlvbikgPT4gc2VjdGlvbi5wb3NpdGlvbilcbiAgXTtcblxuICByZXR1cm4gaGVhZGluZ1Bvc2l0aW9ucy5zb21lKChwb3NpdGlvbikgPT4gcG9zaXRpb24uc3RhcnQub2Zmc2V0IDw9IHJlZmVyZW5jZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQgJiYgcmVmZXJlbmNlLnBvc2l0aW9uLmVuZC5vZmZzZXQgPD0gcG9zaXRpb24uZW5kLm9mZnNldCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcmVmZXJlbmNlIGlzIGZ1bGx5IGNvbnRhaW5lZCB3aXRoaW4gYW4gb2Zmc2V0IHJhbmdlLlxuICpcbiAqIE9ubHkgYSByZWZlcmVuY2UgdGhhdCBjYXJyaWVzIGEgcG9zaXRpb24gd2l0aGluIHRoZSBmaWxlJ3MgY29udGVudCBjYW4gYmUgaW4gYSByYW5nZS4gQVxuICoge0BsaW5rIEZyb250bWF0dGVyTGlua0NhY2hlfSDigJQgYSBmcm9udG1hdHRlciBsaW5rLCBhIG11bHRpLWxpbmsgZnJvbnRtYXR0ZXIgdmFsdWUgZW50cnksIG9yIGFueSBjYW52YXNcbiAqIHJlZmVyZW5jZSDigJQgY2FycmllcyBubyBzdWNoIHBvc2l0aW9uIGFuZCBpcyB0aGVyZWZvcmUgbmV2ZXIgaW4gcmFuZ2UuIEl0cyBgc3RhcnRPZmZzZXRgIC8gYGVuZE9mZnNldGAsXG4gKiB3aGVyZSBwcmVzZW50LCBsb2NhdGUgdGhlIGxpbmsgd2l0aGluIGl0cyBvd24gcHJvcGVydHkgdmFsdWUgcmF0aGVyIHRoYW4gd2l0aGluIHRoZSBmaWxlLCBzbyB0aGV5IGFyZVxuICogZGVsaWJlcmF0ZWx5IG5vdCBjb21wYXJlZCBhZ2FpbnN0IHRoZSByYW5nZS5cbiAqXG4gKiBDb250YWlubWVudCBpcyBmdWxsIGFuZCBib3RoIGJvdW5kcyBhcmUgaW5jbHVzaXZlOiBhIHJlZmVyZW5jZSB0aGF0IG9ubHkgcGFydGlhbGx5IG92ZXJsYXBzIHRoZSByYW5nZSBpc1xuICogbm90IGluIGl0LCBiZWNhdXNlIHJld3JpdGluZyBwYXJ0IG9mIGEgbGluayBjb3JydXB0cyBpdC5cbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlIC0gVGhlIHJlZmVyZW5jZSB0byBjaGVjay5cbiAqIEBwYXJhbSBvZmZzZXRSYW5nZSAtIFRoZSBvZmZzZXQgcmFuZ2UgdG8gY2hlY2sgYWdhaW5zdC5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHJlZmVyZW5jZSBpcyBmdWxseSBjb250YWluZWQgd2l0aGluIHRoZSBvZmZzZXQgcmFuZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JlZmVyZW5jZUluT2Zmc2V0UmFuZ2UocmVmZXJlbmNlOiBSZWZlcmVuY2UsIG9mZnNldFJhbmdlOiBPZmZzZXRSYW5nZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNSZWZlcmVuY2VDYWNoZShyZWZlcmVuY2UpICYmIG9mZnNldFJhbmdlLnN0YXJ0T2Zmc2V0IDw9IHJlZmVyZW5jZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQgJiYgcmVmZXJlbmNlLnBvc2l0aW9uLmVuZC5vZmZzZXQgPD0gb2Zmc2V0UmFuZ2UuZW5kT2Zmc2V0O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgcmVmZXJlbmNlIHRvIGEgZmlsZSBjaGFuZ2UuXG4gKlxuICogQHBhcmFtIHJlZmVyZW5jZSAtIFRoZSByZWZlcmVuY2UgdG8gY29udmVydC5cbiAqIEBwYXJhbSBuZXdDb250ZW50IC0gVGhlIG5ldyBjb250ZW50IGZvciB0aGUgcmVmZXJlbmNlLlxuICogQHJldHVybnMgVGhlIGZpbGUgY2hhbmdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVmZXJlbmNlVG9GaWxlQ2hhbmdlKHJlZmVyZW5jZTogUmVmZXJlbmNlLCBuZXdDb250ZW50OiBzdHJpbmcpOiBGaWxlQ2hhbmdlIHtcbiAgcmV0dXJuIHtcbiAgICBuZXdDb250ZW50LFxuICAgIG9sZENvbnRlbnQ6IGdldFJlZmVyZW5jZUxpbmtUZXh0KHJlZmVyZW5jZSksXG4gICAgcmVmZXJlbmNlXG4gIH07XG59XG5cbi8qKlxuICogU29ydHMgcmVmZXJlbmNlcyBieSB0aGVpciB0eXBlIGFuZCBwb3NpdGlvbi5cbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlcyAtIFRoZSByZWZlcmVuY2VzIHRvIHNvcnQuXG4gKiBAcmV0dXJucyBUaGUgc29ydGVkIHJlZmVyZW5jZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb3J0UmVmZXJlbmNlcyhyZWZlcmVuY2VzOiBSZWZlcmVuY2VbXSk6IFJlZmVyZW5jZVtdIHtcbiAgcmV0dXJuIHJlZmVyZW5jZXMuc29ydCgoYSwgYikgPT4ge1xuICAgIGlmIChpc0Zyb250bWF0dGVyTGlua0NhY2hlKGEpICYmIGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGUoYikpIHtcbiAgICAgIGNvbnN0IGFTdGFydE9mZnNldCA9IGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0cyhhKSA/IGEuc3RhcnRPZmZzZXQgOiAwO1xuICAgICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIHY4IGluY29ycmVjdGx5IHJlcG9ydHMgdGhpcyBicmFuY2ggYXMgdW5jb3ZlcmVkLCBidXQgaXQgaXMgY292ZXJlZCBieSBgc2hvdWxkIHNvcnQgdHdvIGZyb250bWF0dGVyIGxpbmtzIHdpdGhvdXQgb2Zmc2V0c2AgdGVzdC4gKi9cbiAgICAgIGNvbnN0IGJTdGFydE9mZnNldCA9IGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0cyhiKSA/IGIuc3RhcnRPZmZzZXQgOiAwO1xuICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICAgIHJldHVybiBhLmtleS5sb2NhbGVDb21wYXJlKGIua2V5KSB8fCBOdW1iZXIoaXNGcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzKGIpKSAtIE51bWJlcihpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMoYSkpXG4gICAgICAgIHx8IGFTdGFydE9mZnNldCAtIGJTdGFydE9mZnNldDtcbiAgICB9XG5cbiAgICBpZiAoaXNSZWZlcmVuY2VDYWNoZShhKSAmJiBpc1JlZmVyZW5jZUNhY2hlKGIpKSB7XG4gICAgICByZXR1cm4gYS5wb3NpdGlvbi5zdGFydC5vZmZzZXQgLSBiLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldDtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNGcm9udG1hdHRlckxpbmtDYWNoZShhKSA/IDEgOiAtMTtcbiAgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBYUE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFJUCxTQUFTLHlDQUF5QztBQTRFM0MsU0FBUyxxQkFBcUIsV0FBOEI7QUFDakUsU0FBTyxrQ0FBa0MsU0FBUyxJQUFJLFVBQVUsU0FBUyxNQUFNLFVBQVUsYUFBYSxVQUFVLFNBQVMsSUFBSSxVQUFVO0FBQ3pJO0FBUU8sU0FBUywwQkFBMEIsV0FBNEQ7QUFDcEcsU0FBTyxrQkFBa0IsU0FBUyxLQUFLLFVBQVUsU0FBUztBQUM1RDtBQVFPLFNBQVMsa0JBQWtCLFdBQW9EO0FBQ3BGLFNBQU8sdUJBQXVCLFNBQVMsS0FBSyxDQUFDLENBQUUsVUFBdUM7QUFDeEY7QUFRTyxTQUFTLDBCQUEwQixXQUE0RDtBQUNwRyxTQUFPLGtCQUFrQixTQUFTLEtBQUssVUFBVSxTQUFTO0FBQzVEO0FBcUJPLFNBQVMscUJBQXFCLFdBQXNCLE9BQXVDO0FBQ2hHLE1BQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLFNBQVMsR0FBRztBQUMxQyxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sbUJBQTBCO0FBQUEsSUFDOUIsSUFBSSxNQUFNLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLFFBQVEsUUFBUTtBQUFBLElBQzNELElBQUksTUFBTSxZQUFZLENBQUMsR0FBRyxPQUFPLENBQUMsWUFBWSxRQUFRLFNBQVMsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLFFBQVEsUUFBUTtBQUFBLEVBQzdHO0FBRUEsU0FBTyxpQkFBaUIsS0FBSyxDQUFDLGFBQWEsU0FBUyxNQUFNLFVBQVUsVUFBVSxTQUFTLE1BQU0sVUFBVSxVQUFVLFNBQVMsSUFBSSxVQUFVLFNBQVMsSUFBSSxNQUFNO0FBQzdKO0FBa0JPLFNBQVMseUJBQXlCLFdBQXNCLGFBQW1DO0FBQ2hHLFNBQU8saUJBQWlCLFNBQVMsS0FBSyxZQUFZLGVBQWUsVUFBVSxTQUFTLE1BQU0sVUFBVSxVQUFVLFNBQVMsSUFBSSxVQUFVLFlBQVk7QUFDbko7QUFTTyxTQUFTLHNCQUFzQixXQUFzQixZQUFnQztBQUMxRixTQUFPO0FBQUEsSUFDTDtBQUFBLElBQ0EsWUFBWSxxQkFBcUIsU0FBUztBQUFBLElBQzFDO0FBQUEsRUFDRjtBQUNGO0FBUU8sU0FBUyxlQUFlLFlBQXNDO0FBQ25FLFNBQU8sV0FBVyxLQUFLLENBQUMsR0FBRyxNQUFNO0FBQy9CLFFBQUksdUJBQXVCLENBQUMsS0FBSyx1QkFBdUIsQ0FBQyxHQUFHO0FBQzFELFlBQU0sZUFBZSxrQ0FBa0MsQ0FBQyxJQUFJLEVBQUUsY0FBYztBQUU1RSxZQUFNLGVBQWUsa0NBQWtDLENBQUMsSUFBSSxFQUFFLGNBQWM7QUFFNUUsYUFBTyxFQUFFLElBQUksY0FBYyxFQUFFLEdBQUcsS0FBSyxPQUFPLGtDQUFrQyxDQUFDLENBQUMsSUFBSSxPQUFPLGtDQUFrQyxDQUFDLENBQUMsS0FDMUgsZUFBZTtBQUFBLElBQ3RCO0FBRUEsUUFBSSxpQkFBaUIsQ0FBQyxLQUFLLGlCQUFpQixDQUFDLEdBQUc7QUFDOUMsYUFBTyxFQUFFLFNBQVMsTUFBTSxTQUFTLEVBQUUsU0FBUyxNQUFNO0FBQUEsSUFDcEQ7QUFFQSxXQUFPLHVCQUF1QixDQUFDLElBQUksSUFBSTtBQUFBLEVBQ3pDLENBQUM7QUFDSDsiLCJuYW1lcyI6W119
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZWZlcmVuY2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBoYW5kbGluZyByZWZlcmVuY2VzIGluIE9ic2lkaWFuLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIEZyb250bWF0dGVyTGlua0NhY2hlLFxuICBSZWZlcmVuY2Vcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBpc0Zyb250bWF0dGVyTGlua0NhY2hlLFxuICBpc1JlZmVyZW5jZUNhY2hlXG59IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QvaW1wbGVtZW50YXRpb25zJztcblxuaW1wb3J0IHR5cGUgeyBGaWxlQ2hhbmdlIH0gZnJvbSAnLi9maWxlLWNoYW5nZS50cyc7XG5cbmltcG9ydCB7IGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0cyB9IGZyb20gJy4vZnJvbnRtYXR0ZXItbGluay1jYWNoZS13aXRoLW9mZnNldHMudHMnO1xuaW1wb3J0IHtcbiAgaXNQb3NpdGlvbkluT2Zmc2V0UmFuZ2UsXG4gIGlzUG9zaXRpb25JbnNpZGVBbnlPZlxufSBmcm9tICcuL3Bvc2l0aW9uLnRzJztcblxuLyoqXG4gKiBBIHJlZmVyZW5jZSB3aXRoaW4gYSBmaWxlIG5vZGUgaW4gYSBjYW52YXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FudmFzRmlsZU5vZGVSZWZlcmVuY2UgZXh0ZW5kcyBDYW52YXNSZWZlcmVuY2Uge1xuICAvKipcbiAgICogQSB0eXBlIG9mIHJlZmVyZW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6ICdmaWxlJztcbn1cblxuLyoqXG4gKiBBIHJlZmVyZW5jZSB3aXRoaW4gYSBjYW52YXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FudmFzUmVmZXJlbmNlIGV4dGVuZHMgRnJvbnRtYXR0ZXJMaW5rQ2FjaGUge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgcmVmZXJlbmNlIGlzIGEgY2FudmFzIHJlZmVyZW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGlzQ2FudmFzOiB0cnVlO1xuXG4gIC8qKlxuICAgKiBBbiBpbmRleCBvZiB0aGUgbm9kZSBpbiB0aGUgY2FudmFzLlxuICAgKi9cbiAgcmVhZG9ubHkgbm9kZUluZGV4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgdHlwZSBvZiByZWZlcmVuY2UuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiAnZmlsZScgfCAndGV4dCc7XG59XG5cbi8qKlxuICogQSByZWZlcmVuY2Ugd2l0aGluIGEgdGV4dCBub2RlIGluIGEgY2FudmFzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhbnZhc1RleHROb2RlUmVmZXJlbmNlIGV4dGVuZHMgQ2FudmFzUmVmZXJlbmNlIHtcbiAgLyoqXG4gICAqIEFuIG9yaWdpbmFsIHJlZmVyZW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbmFsUmVmZXJlbmNlOiBSZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIEEgdHlwZSBvZiByZWZlcmVuY2UuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiAndGV4dCc7XG59XG5cbi8qKlxuICogQSByYW5nZSB3aXRoaW4gYSBmaWxlJ3MgY29udGVudCwgZXhwcmVzc2VkIGluIGNoYXJhY3RlciBvZmZzZXRzLlxuICpcbiAqIEJvdGggYm91bmRzIGFyZSBpbmNsdXNpdmU6IGEgcmVmZXJlbmNlIHdob3NlIG93biBvZmZzZXRzIGNvaW5jaWRlIGV4YWN0bHkgd2l0aFxuICoge0BsaW5rIE9mZnNldFJhbmdlLnN0YXJ0T2Zmc2V0fSAvIHtAbGluayBPZmZzZXRSYW5nZS5lbmRPZmZzZXR9IGlzIGluc2lkZSB0aGUgcmFuZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2Zmc2V0UmFuZ2Uge1xuICAvKipcbiAgICogQW4gZW5kIG9mZnNldCBvZiB0aGUgcmFuZ2Ugd2l0aGluIHRoZSBmaWxlJ3MgY29udGVudC5cbiAgICovXG4gIHJlYWRvbmx5IGVuZE9mZnNldDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIHN0YXJ0IG9mZnNldCBvZiB0aGUgcmFuZ2Ugd2l0aGluIHRoZSBmaWxlJ3MgY29udGVudC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0T2Zmc2V0OiBudW1iZXI7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgdGV4dCBvZiB0aGUgb25lIGxpbmsgYSByZWZlcmVuY2Ugc3RhbmRzIGZvci5cbiAqXG4gKiBGb3IgbW9zdCByZWZlcmVuY2VzIHRoYXQgaXMge0BsaW5rIFJlZmVyZW5jZS5vcmlnaW5hbH0uIEEgZnJvbnRtYXR0ZXIgbGluayB0aGF0IGNhcnJpZXMgb2Zmc2V0cyBpcyB0aGVcbiAqIGV4Y2VwdGlvbjogaXRzIGBvcmlnaW5hbGAgaXMgdGhlIFdIT0xFIHByb3BlcnR5IHZhbHVlLCB3aGljaCBtYXkgaG9sZCBzZXZlcmFsIGxpbmtzLCBhbmQgYHN0YXJ0T2Zmc2V0YCAvXG4gKiBgZW5kT2Zmc2V0YCBnaXZlIHRoaXMgbGluaydzIHNwYW4gaW4gaXQuIEFueXRoaW5nIHRoYXQgcGFyc2VzLCBjb21wYXJlcyBvciByZXBsYWNlcyB0aGUgbGluayBhcyBvbmUgbGlua1xuICogbXVzdCByZWFkIHRoYXQgc3BhbiwgbmV2ZXIgdGhlIHdob2xlIHZhbHVlLlxuICpcbiAqIEBwYXJhbSByZWZlcmVuY2UgLSBUaGUgcmVmZXJlbmNlLlxuICogQHJldHVybnMgVGhlIHRleHQgb2YgdGhlIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWZlcmVuY2VMaW5rVGV4dChyZWZlcmVuY2U6IFJlZmVyZW5jZSk6IHN0cmluZyB7XG4gIHJldHVybiBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMocmVmZXJlbmNlKSA/IHJlZmVyZW5jZS5vcmlnaW5hbC5zbGljZShyZWZlcmVuY2Uuc3RhcnRPZmZzZXQsIHJlZmVyZW5jZS5lbmRPZmZzZXQpIDogcmVmZXJlbmNlLm9yaWdpbmFsO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHJlZmVyZW5jZSBpcyBhIGNhbnZhcyBmaWxlIG5vZGUgcmVmZXJlbmNlLlxuICpcbiAqIEBwYXJhbSByZWZlcmVuY2UgLSBUaGUgcmVmZXJlbmNlIHRvIGNoZWNrLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgcmVmZXJlbmNlIGlzIGEgY2FudmFzIGZpbGUgbm9kZSByZWZlcmVuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NhbnZhc0ZpbGVOb2RlUmVmZXJlbmNlKHJlZmVyZW5jZTogUmVmZXJlbmNlKTogcmVmZXJlbmNlIGlzIENhbnZhc0ZpbGVOb2RlUmVmZXJlbmNlIHtcbiAgcmV0dXJuIGlzQ2FudmFzUmVmZXJlbmNlKHJlZmVyZW5jZSkgJiYgcmVmZXJlbmNlLnR5cGUgPT09ICdmaWxlJztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSByZWZlcmVuY2UgaXMgYSBjYW52YXMgcmVmZXJlbmNlLlxuICpcbiAqIEBwYXJhbSByZWZlcmVuY2UgLSBUaGUgcmVmZXJlbmNlIHRvIGNoZWNrLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgcmVmZXJlbmNlIGlzIGEgY2FudmFzIHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2FudmFzUmVmZXJlbmNlKHJlZmVyZW5jZTogUmVmZXJlbmNlKTogcmVmZXJlbmNlIGlzIENhbnZhc1JlZmVyZW5jZSB7XG4gIHJldHVybiBpc0Zyb250bWF0dGVyTGlua0NhY2hlKHJlZmVyZW5jZSkgJiYgISEocmVmZXJlbmNlIGFzIFBhcnRpYWw8Q2FudmFzUmVmZXJlbmNlPikuaXNDYW52YXM7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcmVmZXJlbmNlIGlzIGEgY2FudmFzIHRleHQgbm9kZSByZWZlcmVuY2UuXG4gKlxuICogQHBhcmFtIHJlZmVyZW5jZSAtIFRoZSByZWZlcmVuY2UgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSByZWZlcmVuY2UgaXMgYSBjYW52YXMgdGV4dCBub2RlIHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2FudmFzVGV4dE5vZGVSZWZlcmVuY2UocmVmZXJlbmNlOiBSZWZlcmVuY2UpOiByZWZlcmVuY2UgaXMgQ2FudmFzVGV4dE5vZGVSZWZlcmVuY2Uge1xuICByZXR1cm4gaXNDYW52YXNSZWZlcmVuY2UocmVmZXJlbmNlKSAmJiByZWZlcmVuY2UudHlwZSA9PT0gJ3RleHQnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHJlZmVyZW5jZSBzaXRzIGluc2lkZSBhIGhlYWRpbmcuXG4gKlxuICogVGhlIGFuc3dlciBjb21lcyBmcm9tIHRoZSBwYXJzZWQgaGVhZGluZyBwb3NpdGlvbnMgb2YgdGhlIGZpbGUncyBtZXRhZGF0YSwgbmV2ZXIgZnJvbSBhIHBhdHRlcm4gb3ZlciBpdHNcbiAqIHRleHQ6IGEgcmVmZXJlbmNlIGlzIGluc2lkZSBhIGhlYWRpbmcgd2hlbiBpdCBpcyBmdWxseSBjb250YWluZWQgaW4gYSBgaGVhZGluZ3NgIGVudHJ5IG9yIGluIGEgYGhlYWRpbmdgXG4gKiBzZWN0aW9uLiBUaGUgc2VjdGlvbiBjb3ZlcnMgYSBTZXRleHQgaGVhZGluZydzIHVuZGVybGluZSBhcyB3ZWxsLCBzbyBib3RoIGhlYWRpbmcgc3ludGF4ZXMgY291bnQuXG4gKlxuICogT25seSBhIHJlZmVyZW5jZSB0aGF0IGNhcnJpZXMgYSBwb3NpdGlvbiB3aXRoaW4gdGhlIGZpbGUncyBjb250ZW50IGNhbiBiZSBpbnNpZGUgYSBoZWFkaW5nLiBBXG4gKiB7QGxpbmsgRnJvbnRtYXR0ZXJMaW5rQ2FjaGV9IOKAlCBhIGZyb250bWF0dGVyIGxpbmssIGEgbXVsdGktbGluayBmcm9udG1hdHRlciB2YWx1ZSBlbnRyeSwgb3IgYW55IGNhbnZhc1xuICogcmVmZXJlbmNlIOKAlCBuZXZlciBpcy5cbiAqXG4gKiBBIGxpbmsgaW4gYSBoZWFkaW5nIGlzIHBhcnQgb2YgdGhhdCBoZWFkaW5nJ3MgdGV4dCwgYW5kIHNvIG9mIGV2ZXJ5IGAjaGVhZGluZ2Agc3VicGF0aCBwb2ludGluZyBhdCBpdC5cbiAqIFJld3JpdGluZyBzdWNoIGEgbGluayBjaGFuZ2VzIHRoZSBoZWFkaW5nIHRleHQgYW5kIGJyZWFrcyB0aG9zZSBzdWJwYXRocywgd2hpY2ggaXMgd2h5IGEgbGluayBjb252ZXJ0ZXJcbiAqIG1heSB3YW50IHRvIGxlYXZlIGl0IGFsb25lLlxuICpcbiAqIEBwYXJhbSByZWZlcmVuY2UgLSBUaGUgcmVmZXJlbmNlIHRvIGNoZWNrLlxuICogQHBhcmFtIGNhY2hlIC0gVGhlIG1ldGFkYXRhIG9mIHRoZSBmaWxlIHRoZSByZWZlcmVuY2UgYmVsb25ncyB0by5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHJlZmVyZW5jZSBpcyBmdWxseSBjb250YWluZWQgaW4gYSBoZWFkaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZWZlcmVuY2VJbkhlYWRpbmcocmVmZXJlbmNlOiBSZWZlcmVuY2UsIGNhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGwpOiBib29sZWFuIHtcbiAgaWYgKCFjYWNoZSB8fCAhaXNSZWZlcmVuY2VDYWNoZShyZWZlcmVuY2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGlzUG9zaXRpb25JbnNpZGVBbnlPZihyZWZlcmVuY2UucG9zaXRpb24sIFtcbiAgICAuLi5jYWNoZS5oZWFkaW5ncyA/PyBbXSxcbiAgICAuLi4oY2FjaGUuc2VjdGlvbnMgPz8gW10pLmZpbHRlcigoc2VjdGlvbikgPT4gc2VjdGlvbi50eXBlID09PSAnaGVhZGluZycpXG4gIF0pO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHJlZmVyZW5jZSBpcyBmdWxseSBjb250YWluZWQgd2l0aGluIGFuIG9mZnNldCByYW5nZS5cbiAqXG4gKiBPbmx5IGEgcmVmZXJlbmNlIHRoYXQgY2FycmllcyBhIHBvc2l0aW9uIHdpdGhpbiB0aGUgZmlsZSdzIGNvbnRlbnQgY2FuIGJlIGluIGEgcmFuZ2UuIEFcbiAqIHtAbGluayBGcm9udG1hdHRlckxpbmtDYWNoZX0g4oCUIGEgZnJvbnRtYXR0ZXIgbGluaywgYSBtdWx0aS1saW5rIGZyb250bWF0dGVyIHZhbHVlIGVudHJ5LCBvciBhbnkgY2FudmFzXG4gKiByZWZlcmVuY2Ug4oCUIGNhcnJpZXMgbm8gc3VjaCBwb3NpdGlvbiBhbmQgaXMgdGhlcmVmb3JlIG5ldmVyIGluIHJhbmdlLiBJdHMgYHN0YXJ0T2Zmc2V0YCAvIGBlbmRPZmZzZXRgLFxuICogd2hlcmUgcHJlc2VudCwgbG9jYXRlIHRoZSBsaW5rIHdpdGhpbiBpdHMgb3duIHByb3BlcnR5IHZhbHVlIHJhdGhlciB0aGFuIHdpdGhpbiB0aGUgZmlsZSwgc28gdGhleSBhcmVcbiAqIGRlbGliZXJhdGVseSBub3QgY29tcGFyZWQgYWdhaW5zdCB0aGUgcmFuZ2UuXG4gKlxuICogQ29udGFpbm1lbnQgaXMgZnVsbCBhbmQgYm90aCBib3VuZHMgYXJlIGluY2x1c2l2ZTogYSByZWZlcmVuY2UgdGhhdCBvbmx5IHBhcnRpYWxseSBvdmVybGFwcyB0aGUgcmFuZ2UgaXNcbiAqIG5vdCBpbiBpdCwgYmVjYXVzZSByZXdyaXRpbmcgcGFydCBvZiBhIGxpbmsgY29ycnVwdHMgaXQuXG4gKlxuICogQHBhcmFtIHJlZmVyZW5jZSAtIFRoZSByZWZlcmVuY2UgdG8gY2hlY2suXG4gKiBAcGFyYW0gb2Zmc2V0UmFuZ2UgLSBUaGUgb2Zmc2V0IHJhbmdlIHRvIGNoZWNrIGFnYWluc3QuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSByZWZlcmVuY2UgaXMgZnVsbHkgY29udGFpbmVkIHdpdGhpbiB0aGUgb2Zmc2V0IHJhbmdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZWZlcmVuY2VJbk9mZnNldFJhbmdlKHJlZmVyZW5jZTogUmVmZXJlbmNlLCBvZmZzZXRSYW5nZTogT2Zmc2V0UmFuZ2UpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzUmVmZXJlbmNlQ2FjaGUocmVmZXJlbmNlKSAmJiBpc1Bvc2l0aW9uSW5PZmZzZXRSYW5nZShyZWZlcmVuY2UucG9zaXRpb24sIG9mZnNldFJhbmdlKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHJlZmVyZW5jZSB0byBhIGZpbGUgY2hhbmdlLlxuICpcbiAqIEBwYXJhbSByZWZlcmVuY2UgLSBUaGUgcmVmZXJlbmNlIHRvIGNvbnZlcnQuXG4gKiBAcGFyYW0gbmV3Q29udGVudCAtIFRoZSBuZXcgY29udGVudCBmb3IgdGhlIHJlZmVyZW5jZS5cbiAqIEByZXR1cm5zIFRoZSBmaWxlIGNoYW5nZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZmVyZW5jZVRvRmlsZUNoYW5nZShyZWZlcmVuY2U6IFJlZmVyZW5jZSwgbmV3Q29udGVudDogc3RyaW5nKTogRmlsZUNoYW5nZSB7XG4gIHJldHVybiB7XG4gICAgbmV3Q29udGVudCxcbiAgICBvbGRDb250ZW50OiBnZXRSZWZlcmVuY2VMaW5rVGV4dChyZWZlcmVuY2UpLFxuICAgIHJlZmVyZW5jZVxuICB9O1xufVxuXG4vKipcbiAqIFNvcnRzIHJlZmVyZW5jZXMgYnkgdGhlaXIgdHlwZSBhbmQgcG9zaXRpb24uXG4gKlxuICogQHBhcmFtIHJlZmVyZW5jZXMgLSBUaGUgcmVmZXJlbmNlcyB0byBzb3J0LlxuICogQHJldHVybnMgVGhlIHNvcnRlZCByZWZlcmVuY2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc29ydFJlZmVyZW5jZXMocmVmZXJlbmNlczogUmVmZXJlbmNlW10pOiBSZWZlcmVuY2VbXSB7XG4gIHJldHVybiByZWZlcmVuY2VzLnNvcnQoKGEsIGIpID0+IHtcbiAgICBpZiAoaXNGcm9udG1hdHRlckxpbmtDYWNoZShhKSAmJiBpc0Zyb250bWF0dGVyTGlua0NhY2hlKGIpKSB7XG4gICAgICBjb25zdCBhU3RhcnRPZmZzZXQgPSBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMoYSkgPyBhLnN0YXJ0T2Zmc2V0IDogMDtcbiAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSB2OCBpbmNvcnJlY3RseSByZXBvcnRzIHRoaXMgYnJhbmNoIGFzIHVuY292ZXJlZCwgYnV0IGl0IGlzIGNvdmVyZWQgYnkgYHNob3VsZCBzb3J0IHR3byBmcm9udG1hdHRlciBsaW5rcyB3aXRob3V0IG9mZnNldHNgIHRlc3QuICovXG4gICAgICBjb25zdCBiU3RhcnRPZmZzZXQgPSBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMoYikgPyBiLnN0YXJ0T2Zmc2V0IDogMDtcbiAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgICByZXR1cm4gYS5rZXkubG9jYWxlQ29tcGFyZShiLmtleSkgfHwgTnVtYmVyKGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0cyhiKSkgLSBOdW1iZXIoaXNGcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzKGEpKVxuICAgICAgICB8fCBhU3RhcnRPZmZzZXQgLSBiU3RhcnRPZmZzZXQ7XG4gICAgfVxuXG4gICAgaWYgKGlzUmVmZXJlbmNlQ2FjaGUoYSkgJiYgaXNSZWZlcmVuY2VDYWNoZShiKSkge1xuICAgICAgcmV0dXJuIGEucG9zaXRpb24uc3RhcnQub2Zmc2V0IC0gYi5wb3NpdGlvbi5zdGFydC5vZmZzZXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGUoYSkgPyAxIDogLTE7XG4gIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVlBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBSVAsU0FBUyx5Q0FBeUM7QUFDbEQ7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUE0RUEsU0FBUyxxQkFBcUIsV0FBOEI7QUFDakUsU0FBTyxrQ0FBa0MsU0FBUyxJQUFJLFVBQVUsU0FBUyxNQUFNLFVBQVUsYUFBYSxVQUFVLFNBQVMsSUFBSSxVQUFVO0FBQ3pJO0FBUU8sU0FBUywwQkFBMEIsV0FBNEQ7QUFDcEcsU0FBTyxrQkFBa0IsU0FBUyxLQUFLLFVBQVUsU0FBUztBQUM1RDtBQVFPLFNBQVMsa0JBQWtCLFdBQW9EO0FBQ3BGLFNBQU8sdUJBQXVCLFNBQVMsS0FBSyxDQUFDLENBQUUsVUFBdUM7QUFDeEY7QUFRTyxTQUFTLDBCQUEwQixXQUE0RDtBQUNwRyxTQUFPLGtCQUFrQixTQUFTLEtBQUssVUFBVSxTQUFTO0FBQzVEO0FBcUJPLFNBQVMscUJBQXFCLFdBQXNCLE9BQXVDO0FBQ2hHLE1BQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLFNBQVMsR0FBRztBQUMxQyxXQUFPO0FBQUEsRUFDVDtBQUVBLFNBQU8sc0JBQXNCLFVBQVUsVUFBVTtBQUFBLElBQy9DLEdBQUcsTUFBTSxZQUFZLENBQUM7QUFBQSxJQUN0QixJQUFJLE1BQU0sWUFBWSxDQUFDLEdBQUcsT0FBTyxDQUFDLFlBQVksUUFBUSxTQUFTLFNBQVM7QUFBQSxFQUMxRSxDQUFDO0FBQ0g7QUFrQk8sU0FBUyx5QkFBeUIsV0FBc0IsYUFBbUM7QUFDaEcsU0FBTyxpQkFBaUIsU0FBUyxLQUFLLHdCQUF3QixVQUFVLFVBQVUsV0FBVztBQUMvRjtBQVNPLFNBQVMsc0JBQXNCLFdBQXNCLFlBQWdDO0FBQzFGLFNBQU87QUFBQSxJQUNMO0FBQUEsSUFDQSxZQUFZLHFCQUFxQixTQUFTO0FBQUEsSUFDMUM7QUFBQSxFQUNGO0FBQ0Y7QUFRTyxTQUFTLGVBQWUsWUFBc0M7QUFDbkUsU0FBTyxXQUFXLEtBQUssQ0FBQyxHQUFHLE1BQU07QUFDL0IsUUFBSSx1QkFBdUIsQ0FBQyxLQUFLLHVCQUF1QixDQUFDLEdBQUc7QUFDMUQsWUFBTSxlQUFlLGtDQUFrQyxDQUFDLElBQUksRUFBRSxjQUFjO0FBRTVFLFlBQU0sZUFBZSxrQ0FBa0MsQ0FBQyxJQUFJLEVBQUUsY0FBYztBQUU1RSxhQUFPLEVBQUUsSUFBSSxjQUFjLEVBQUUsR0FBRyxLQUFLLE9BQU8sa0NBQWtDLENBQUMsQ0FBQyxJQUFJLE9BQU8sa0NBQWtDLENBQUMsQ0FBQyxLQUMxSCxlQUFlO0FBQUEsSUFDdEI7QUFFQSxRQUFJLGlCQUFpQixDQUFDLEtBQUssaUJBQWlCLENBQUMsR0FBRztBQUM5QyxhQUFPLEVBQUUsU0FBUyxNQUFNLFNBQVMsRUFBRSxTQUFTLE1BQU07QUFBQSxJQUNwRDtBQUVBLFdBQU8sdUJBQXVCLENBQUMsSUFBSSxJQUFJO0FBQUEsRUFDekMsQ0FBQztBQUNIOyIsIm5hbWVzIjpbXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mnaoumov/obsidian-lib",
3
- "version": "8.1.0",
3
+ "version": "9.0.0",
4
4
  "description": "Runtime library for Obsidian plugin development: plugin base classes, components, settings, modals, vault and metadata helpers.",
5
5
  "keywords": [
6
6
  "obsidian",
@@ -390,7 +390,7 @@
390
390
  "@commitlint/cli": "^21.2.2",
391
391
  "@commitlint/config-conventional": "^21.2.2",
392
392
  "@mnaoumov/obsidian-dev-toolkit": "^7.1.0",
393
- "@mnaoumov/typescript-dev-toolkit": "^5.0.0",
393
+ "@mnaoumov/typescript-dev-toolkit": "^5.1.0",
394
394
  "@mnaoumov/typescript-test-toolkit": "^1.0.3",
395
395
  "@obsidian-typings/obsidian-public-latest": "^6.37.0",
396
396
  "@resvg/resvg-js": "^2.6.2",