@ethlete/contentful 3.1.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @ethlete/contentful
2
2
 
3
+ ## 3.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`4835e46`](https://github.com/ethlete-io/ethdk/commit/4835e46abcb0d2377d20a722e079641661cec2e3) Thanks [@TomTomB](https://github.com/TomTomB)! - Add `getEntries` and `getAssets` methods to the `ContentfulIncludeMap`
8
+
3
9
  ## 3.1.0
4
10
 
5
11
  ### Minor Changes
@@ -1,5 +1,5 @@
1
1
  import { DOCUMENT } from '@angular/common';
2
- import { ChangeDetectionStrategy, Component, ElementRef, Renderer2, ViewContainerRef, ViewEncapsulation, computed, inject, input, } from '@angular/core';
2
+ import { ChangeDetectionStrategy, Component, ElementRef, Renderer2, ViewContainerRef, ViewEncapsulation, computed, inject, input, isDevMode, } from '@angular/core';
3
3
  import { takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop';
4
4
  import { BLOCKS, INLINES } from '@contentful/rich-text-types';
5
5
  import { getObjectProperty, isObject } from '@ethlete/core';
@@ -109,7 +109,7 @@ export const isExecutedHtmlOrTextCommandCacheItem = (cache) => {
109
109
  export const isExecutedTextCommandCacheItem = (cache) => {
110
110
  return isTextRenderCommand(cache.command);
111
111
  };
112
- const ANY_ENTRY_SYS_ID = '$$$_et-any-entry-sys-id';
112
+ export const ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID = '$$$_et-contentful-any-entry-content-type-sys-id';
113
113
  export class ContentfulRichTextRendererComponent {
114
114
  constructor() {
115
115
  this._viewContainerRef = inject(ViewContainerRef);
@@ -144,26 +144,47 @@ export class ContentfulRichTextRendererComponent {
144
144
  const assetMap = new Map(assets?.map((asset) => [asset.sys.id, asset]) ?? []);
145
145
  const entryMap = new Map(entries?.map((entry) => [entry.sys.id, entry]) ?? []);
146
146
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
147
- const getEntry = (id, sysId) => {
147
+ const getEntry = (id, contentTypeId) => {
148
148
  const entry = entryMap.get(id);
149
149
  if (!entry) {
150
+ if (isDevMode()) {
151
+ console.warn('Entry not found! Will return null. Is the include query param to low?', { id, entryMap });
152
+ }
150
153
  return null;
151
154
  }
152
- if (sysId === ANY_ENTRY_SYS_ID) {
155
+ if (contentTypeId === ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID) {
153
156
  return entry;
154
157
  }
155
- if (entry.sys.id !== sysId) {
156
- console.warn('Entry sys ID does not match the provided sys ID! Will return null.', { entry, sysId });
158
+ if (entry.sys.contentType.sys.id !== contentTypeId) {
159
+ if (isDevMode()) {
160
+ console.warn('Entry sys ID does not match the provided sys ID! Will return null.', {
161
+ entry,
162
+ sysId: contentTypeId,
163
+ });
164
+ }
157
165
  return null;
158
166
  }
159
167
  return entry;
160
168
  };
169
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
170
+ const getEntries = (ids, contentTypeId) => {
171
+ const entries = ids
172
+ .map((id) => (typeof id === 'string' ? id : id.sys.id))
173
+ .map((id) => getEntry(id, contentTypeId))
174
+ .filter((entry) => entry !== null);
175
+ return entries;
176
+ };
161
177
  const getAsset = (id) => {
162
178
  return assetMap.get(id) ?? null;
163
179
  };
180
+ const getAssets = (ids) => {
181
+ return ids.map((id) => getAsset(id)).filter((asset) => asset !== null);
182
+ };
164
183
  return {
165
184
  getEntry,
185
+ getEntries,
166
186
  getAsset,
187
+ getAssets,
167
188
  };
168
189
  });
169
190
  /**
@@ -375,7 +396,7 @@ export class ContentfulRichTextRendererComponent {
375
396
  if (!entryId) {
376
397
  throw richTextRendererError('entry_id_not_found', false, { node });
377
398
  }
378
- const entry = this.contentIncludesMap().getEntry(entryId, ANY_ENTRY_SYS_ID);
399
+ const entry = this.contentIncludesMap().getEntry(entryId, ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID);
379
400
  if (!entry) {
380
401
  throw richTextRendererError('entry_not_found', false, { entryId, node });
381
402
  }
@@ -729,4 +750,4 @@ function formatHTML(html) {
729
750
  }
730
751
  return result.join('\n');
731
752
  }
732
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmljaC10ZXh0LXJlbmRlcmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29udGVudGZ1bC9zcmMvbGliL2NvbXBvbmVudHMvcmljaC10ZXh0LXJlbmRlcmVyL3JpY2gtdGV4dC1yZW5kZXJlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUVULFVBQVUsRUFFVixTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQixRQUFRLEVBQ1IsTUFBTSxFQUNOLEtBQUssR0FDTixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3hGLE9BQU8sRUFBRSxNQUFNLEVBQVMsT0FBTyxFQUFzQixNQUFNLDZCQUE2QixDQUFDO0FBQ3pGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRXpFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLDJCQUEyQixDQUFDOztBQUVyRyxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRztJQUNqQyxTQUFTLEVBQUUsQ0FBQztJQUNaLFVBQVUsRUFBRSxDQUFDO0lBQ2IsSUFBSSxFQUFF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QUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN6QixNQUFNLEVBQUUsQ0FBQztRQUNYLENBQUM7UUFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBRTFDLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNqRCxNQUFNLEVBQUUsQ0FBQztRQUNYLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnRUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBDb21wb25lbnRSZWYsXG4gIEVsZW1lbnRSZWYsXG4gIEVtYmVkZGVkVmlld1JlZixcbiAgUmVuZGVyZXIyLFxuICBWaWV3Q29udGFpbmVyUmVmLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgY29tcHV0ZWQsXG4gIGluamVjdCxcbiAgaW5wdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkLCB0b09ic2VydmFibGUsIHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQkxPQ0tTLCBCbG9jaywgSU5MSU5FUywgSW5saW5lLCBNYXJrLCBUZXh0IH0gZnJvbSAnQGNvbnRlbnRmdWwvcmljaC10ZXh0LXR5cGVzJztcbmltcG9ydCB7IGdldE9iamVjdFByb3BlcnR5LCBpc09iamVjdCB9IGZyb20gJ0BldGhsZXRlL2NvcmUnO1xuaW1wb3J0IHsgcGFpcndpc2UsIHN0YXJ0V2l0aCwgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDT05URU5URlVMX0NPTkZJRyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9jb250ZW50ZnVsLmNvbnN0YW50cyc7XG5pbXBvcnQgeyBDb250ZW50ZnVsQXNzZXQsIENvbnRlbnRmdWxDb2xsZWN0aW9uLCBDb250ZW50ZnVsRW50cnksIFJpY2hUZXh0UmVzcG9uc2UgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVDb250ZW50ZnVsQ29uZmlnIH0gZnJvbSAnLi4vLi4vdXRpbHMvY29udGVudGZ1bC1jb25maWcnO1xuaW1wb3J0IHsgcmljaFRleHRSZW5kZXJlckVycm9yIH0gZnJvbSAnLi9yaWNoLXRleHQtcmVuZGVyZXIuZXJyb3JzJztcbmltcG9ydCB7IGlzUmljaFRleHRSb290Tm9kZSwgdHJhbnNsYXRlQ29udGVudGZ1bE5vZGVUeXBlVG9IdG1sVGFnIH0gZnJvbSAnLi9yaWNoLXRleHQtcmVuZGVyZXIudXRpbCc7XG5cbmV4cG9ydCBjb25zdCBSRU5ERVJfQ09NTUFORF9UWVBFID0ge1xuICBIVE1MX09QRU46IDAsXG4gIEhUTUxfQ0xPU0U6IDEsXG4gIFRFWFQ6IDIsXG4gIENPTVBPTkVOVDogMyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBSRU5ERVJfQ09NTUFORF9QT1NJVElPTiA9IHtcbiAgVFlQRTogMCxcbiAgTkVTVElOR19MRVZFTDogMSxcbiAgRE9NX1BPU0lUSU9OOiAyLFxuICBJTkRFWDogMyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBIVE1MX09QRU5fUkVOREVSX0NPTU1BTkRfUE9TSVRJT04gPSB7XG4gIEFUVFJJQlVURVM6IDQsXG4gIFRBR19OQU1FOiA1LFxuICBFTEVNRU5UX0lEOiA2LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IEhUTUxfQ0xPU0VfUkVOREVSX0NPTU1BTkRfUE9TSVRJT04gPSB7XG4gIFRBR19OQU1FOiA0LFxuICBFTEVNRU5UX0lEOiA1LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFRFWFRfUkVOREVSX0NPTU1BTkRfUE9TSVRJT04gPSB7XG4gIFRFWFQ6IDQsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgQ09NUE9ORU5UX1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OID0ge1xuICBBVFRSSUJVVEVTOiA0LFxuICBDT01QT05FTlQ6IDUsXG4gIElOUFVUUzogNixcbiAgQ09NUE9ORU5UX1RZUEU6IDcsXG59IGFzIGNvbnN0O1xuXG50eXBlIEh0bWxPcGVuUmVuZGVyQ29tbWFuZCA9IFtcbiAgdHlwZTogdHlwZW9mIFJFTkRFUl9DT01NQU5EX1RZUEUuSFRNTF9PUEVOLFxuICBuZXN0aW5nTGV2ZWw6IG51bWJlcixcbiAgZG9tUG9zaXRpb246IG51bWJlcixcbiAgaW5kZXg6IG51bWJlcixcbiAgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgdGFnTmFtZTogc3RyaW5nLFxuICBlbGVtZW50SWQ6IHN0cmluZyxcbl07XG5cbnR5cGUgSHRtbENsb3NlUmVuZGVyQ29tbWFuZCA9IFtcbiAgdHlwZTogdHlwZW9mIFJFTkRFUl9DT01NQU5EX1RZUEUuSFRNTF9DTE9TRSxcbiAgbmVzdGluZ0xldmVsOiBudW1iZXIsXG4gIGRvbVBvc2l0aW9uOiBudW1iZXIsXG4gIGluZGV4OiBudW1iZXIsXG4gIHRhZ05hbWU6IHN0cmluZyxcbiAgZWxlbWVudElkOiBzdHJpbmcsXG5dO1xuXG50eXBlIFRleHRSZW5kZXJDb21tYW5kID0gW1xuICB0eXBlOiB0eXBlb2YgUkVOREVSX0NPTU1BTkRfVFlQRS5URVhULFxuICBuZXN0aW5nTGV2ZWw6IG51bWJlcixcbiAgZG9tUG9zaXRpb246IG51bWJlcixcbiAgaW5kZXg6IG51bWJlcixcbiAgdGV4dDogc3RyaW5nLFxuXTtcblxudHlwZSBDb21wb25lbnRSZW5kZXJDb21tYW5kID0gW1xuICB0eXBlOiB0eXBlb2YgUkVOREVSX0NPTU1BTkRfVFlQRS5DT01QT05FTlQsXG4gIG5lc3RpbmdMZXZlbDogbnVtYmVyLFxuICBkb21Qb3NpdGlvbjogbnVtYmVyLFxuICBpbmRleDogbnVtYmVyLFxuICBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBjb21wb25lbnQ6IENvbXBvbmVudFR5cGU8dW5rbm93bj4sXG4gIGlucHV0czogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGNvbXBvbmVudFR5cGU6IHN0cmluZyxcbl07XG5cbnR5cGUgUmVuZGVyQ29tbWFuZCA9IEh0bWxPcGVuUmVuZGVyQ29tbWFuZCB8IEh0bWxDbG9zZVJlbmRlckNvbW1hbmQgfCBUZXh0UmVuZGVyQ29tbWFuZCB8IENvbXBvbmVudFJlbmRlckNvbW1hbmQ7XG5cbmV4cG9ydCBjb25zdCBSRU5ERVJfSU5TVFJVQ1RJT05fUE9TSVRJT04gPSB7XG4gIFRZUEU6IDAsXG4gIENPTU1BTkQ6IDEsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgUkVOREVSX0lOU1RSVUNUSU9OX1RZUEUgPSB7XG4gIENSRUFURTogMCxcbiAgVVBEQVRFOiAxLFxuICBERUxFVEU6IDIsXG4gIE1PVkU6IDMsXG59IGFzIGNvbnN0O1xuXG50eXBlIFJlbmRlckluc3RydWN0aW9uVHlwZVZhbHVlID0gKHR5cGVvZiBSRU5ERVJfSU5TVFJVQ1RJT05fVFlQRSlba2V5b2YgdHlwZW9mIFJFTkRFUl9JTlNUUlVDVElPTl9UWVBFXTtcblxudHlwZSBSZW5kZXJJbnN0cnVjdGlvbiA9IFtSZW5kZXJJbnN0cnVjdGlvblR5cGVWYWx1ZSwgUmVuZGVyQ29tbWFuZF07XG5cbmNvbnN0IE1BUktfVEFJTFdJTkRfTUFQOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBib2xkOiAnZm9udC1ib2xkJyxcbiAgaXRhbGljOiAnaXRhbGljJyxcbiAgdW5kZXJsaW5lOiAndW5kZXJsaW5lJyxcbiAgY29kZTogJ2ZvbnQtbW9ubycsXG59O1xuXG5leHBvcnQgY29uc3QgbWFya3NUb0NsYXNzID0gKG1hcmtzOiBNYXJrW10pID0+IHtcbiAgY29uc3QgY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IG1hcmsgb2YgbWFya3MpIHtcbiAgICBsZXQga2xhc3MgPSBNQVJLX1RBSUxXSU5EX01BUFttYXJrLnR5cGVdO1xuXG4gICAgaWYgKCFrbGFzcykge1xuICAgICAgY29uc29sZS53YXJuKGBObyBjbGFzcyBmb3VuZCBmb3IgbWFyayB0eXBlISBGYWxsaW5nIGJhY2sgdG8gXCIke21hcmsudHlwZX1cIi5gLCBtYXJrKTtcblxuICAgICAga2xhc3MgPSBtYXJrLnR5cGU7XG4gICAgfVxuXG4gICAgY2xhc3Nlcy5wdXNoKGtsYXNzKTtcbiAgfVxuXG4gIHJldHVybiBjbGFzc2VzLmpvaW4oJyAnKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0h0bWxPcGVuUmVuZGVyQ29tbWFuZCA9IChjb21tYW5kOiBSZW5kZXJDb21tYW5kKTogY29tbWFuZCBpcyBIdG1sT3BlblJlbmRlckNvbW1hbmQgPT4ge1xuICByZXR1cm4gY29tbWFuZFtSRU5ERVJfQ09NTUFORF9QT1NJVElPTi5UWVBFXSA9PT0gUkVOREVSX0NPTU1BTkRfVFlQRS5IVE1MX09QRU47XG59O1xuXG5leHBvcnQgY29uc3QgaXNIdG1sQ2xvc2VSZW5kZXJDb21tYW5kID0gKGNvbW1hbmQ6IFJlbmRlckNvbW1hbmQpOiBjb21tYW5kIGlzIEh0bWxDbG9zZVJlbmRlckNvbW1hbmQgPT4ge1xuICByZXR1cm4gY29tbWFuZFtSRU5ERVJfQ09NTUFORF9QT1NJVElPTi5UWVBFXSA9PT0gUkVOREVSX0NPTU1BTkRfVFlQRS5IVE1MX0NMT1NFO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzVGV4dFJlbmRlckNvbW1hbmQgPSAoY29tbWFuZDogUmVuZGVyQ29tbWFuZCk6IGNvbW1hbmQgaXMgVGV4dFJlbmRlckNvbW1hbmQgPT4ge1xuICByZXR1cm4gY29tbWFuZFtSRU5ERVJfQ09NTUFORF9QT1NJVElPTi5UWVBFXSA9PT0gUkVOREVSX0NPTU1BTkRfVFlQRS5URVhUO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzQ29tcG9uZW50UmVuZGVyQ29tbWFuZCA9IChjb21tYW5kOiBSZW5kZXJDb21tYW5kKTogY29tbWFuZCBpcyBDb21wb25lbnRSZW5kZXJDb21tYW5kID0+IHtcbiAgcmV0dXJuIGNvbW1hbmRbUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uVFlQRV0gPT09IFJFTkRFUl9DT01NQU5EX1RZUEUuQ09NUE9ORU5UO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFJlbmRlckNvbW1hbmRJZCA9IChjb21tYW5kOiBSZW5kZXJDb21tYW5kKSA9PiB7XG4gIGlmIChpc0h0bWxPcGVuUmVuZGVyQ29tbWFuZChjb21tYW5kKSkge1xuICAgIHJldHVybiBjb21tYW5kW0hUTUxfT1BFTl9SRU5ERVJfQ09NTUFORF9QT1NJVElPTi5FTEVNRU5UX0lEXTtcbiAgfSBlbHNlIGlmIChpc0h0bWxDbG9zZVJlbmRlckNvbW1hbmQoY29tbWFuZCkpIHtcbiAgICByZXR1cm4gY29tbWFuZFtIVE1MX0NMT1NFX1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLkVMRU1FTlRfSURdO1xuICB9IGVsc2UgaWYgKGlzVGV4dFJlbmRlckNvbW1hbmQoY29tbWFuZCkpIHtcbiAgICByZXR1cm4gY29tbWFuZFtURVhUX1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLlRFWFRdO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjb21tYW5kW0NPTVBPTkVOVF9SRU5ERVJfQ09NTUFORF9QT1NJVElPTi5DT01QT05FTlRfVFlQRV07XG4gIH1cbn07XG5cbmNvbnN0IENMQVNTX0FUVFIgPSAnY2xhc3MnO1xuY29uc3QgREVGQVVMVF9DT01QT05FTlRfVFlQRVMgPSB7XG4gIElNQUdFOiAnJCQkX2V0LWltYWdlJyxcbiAgVklERU86ICckJCRfZXQtdmlkZW8nLFxuICBBVURJTzogJyQkJF9ldC1hdWRpbycsXG4gIEZJTEU6ICckJCRfZXQtZmlsZScsXG59O1xuXG50eXBlIEV4ZWN1dGVkQ29tbWFuZENhY2hlSXRlbUJhc2UgPSB7XG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xufTtcblxudHlwZSBFeGVjdXRlZENvbXBvbmVudENvbW1hbmRDYWNoZUl0ZW0gPSB7XG4gIGNvbW1hbmQ6IENvbXBvbmVudFJlbmRlckNvbW1hbmQ7XG4gIGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPHVua25vd24+O1xufSAmIEV4ZWN1dGVkQ29tbWFuZENhY2hlSXRlbUJhc2U7XG5cbnR5cGUgRXhlY3V0ZWRIdG1sQ29tbWFuZENhY2hlSXRlbSA9IHtcbiAgY29tbWFuZDogSHRtbE9wZW5SZW5kZXJDb21tYW5kIHwgSHRtbENsb3NlUmVuZGVyQ29tbWFuZDtcbn0gJiBFeGVjdXRlZENvbW1hbmRDYWNoZUl0ZW1CYXNlO1xuXG50eXBlIEV4ZWN1dGVkVGV4dENvbW1hbmRDYWNoZUl0ZW0gPSB7XG4gIGNvbW1hbmQ6IFRleHRSZW5kZXJDb21tYW5kO1xuICB0ZXh0Tm9kZTogdW5rbm93bjtcbn0gJiBFeGVjdXRlZENvbW1hbmRDYWNoZUl0ZW1CYXNlO1xuXG50eXBlIEV4ZWN1dGVkQ29tbWFuZENhY2hlSXRlbSA9XG4gIHwgRXhlY3V0ZWRDb21wb25lbnRDb21tYW5kQ2FjaGVJdGVtXG4gIHwgRXhlY3V0ZWRIdG1sQ29tbWFuZENhY2hlSXRlbVxuICB8IEV4ZWN1dGVkVGV4dENvbW1hbmRDYWNoZUl0ZW07XG5cbmV4cG9ydCBjb25zdCBpc0V4ZWN1dGVkQ29tcG9uZW50Q29tbWFuZENhY2hlSXRlbSA9IChcbiAgY2FjaGU6IEV4ZWN1dGVkQ29tbWFuZENhY2hlSXRlbSxcbik6IGNhY2hlIGlzIEV4ZWN1dGVkQ29tcG9uZW50Q29tbWFuZENhY2hlSXRlbSA9PiB7XG4gIHJldHVybiBpc0NvbXBvbmVudFJlbmRlckNvbW1hbmQoY2FjaGUuY29tbWFuZCk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNFeGVjdXRlZEh0bWxPclRleHRDb21tYW5kQ2FjaGVJdGVtID0gKFxuICBjYWNoZTogRXhlY3V0ZWRDb21tYW5kQ2FjaGVJdGVtLFxuKTogY2FjaGUgaXMgRXhlY3V0ZWRIdG1sQ29tbWFuZENhY2hlSXRlbSA9PiB7XG4gIHJldHVybiBpc0h0bWxDbG9zZVJlbmRlckNvbW1hbmQoY2FjaGUuY29tbWFuZCkgfHwgaXNIdG1sT3BlblJlbmRlckNvbW1hbmQoY2FjaGUuY29tbWFuZCk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNFeGVjdXRlZFRleHRDb21tYW5kQ2FjaGVJdGVtID0gKFxuICBjYWNoZTogRXhlY3V0ZWRDb21tYW5kQ2FjaGVJdGVtLFxuKTogY2FjaGUgaXMgRXhlY3V0ZWRUZXh0Q29tbWFuZENhY2hlSXRlbSA9PiB7XG4gIHJldHVybiBpc1RleHRSZW5kZXJDb21tYW5kKGNhY2hlLmNvbW1hbmQpO1xufTtcblxuY29uc3QgQU5ZX0VOVFJZX1NZU19JRCA9ICckJCRfZXQtYW55LWVudHJ5LXN5cy1pZCc7XG5cbmV4cG9ydCB0eXBlIENvbnRlbnRmdWxJbmNsdWRlTWFwID0ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBnZXRFbnRyeTogPFQgZXh0ZW5kcyB7IFtrZXk6IHN0cmluZ106IGFueSB9PihpZDogc3RyaW5nLCBzeXNJZDogc3RyaW5nKSA9PiBDb250ZW50ZnVsRW50cnk8VD4gfCBudWxsO1xuICBnZXRBc3NldDogKGlkOiBzdHJpbmcpID0+IENvbnRlbnRmdWxBc3NldCB8IG51bGw7XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdldC1jb250ZW50ZnVsLXJpY2gtdGV4dC1yZW5kZXJlcicsXG4gIHRlbXBsYXRlOiBgYCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGhvc3Q6IHtcbiAgICBjbGFzczogJ2V0LWNvbnRlbnRmdWwtcmljaC10ZXh0LXJlbmRlcmVyJyxcbiAgfSxcbn0pXG5leHBvcnQgY2xhc3MgQ29udGVudGZ1bFJpY2hUZXh0UmVuZGVyZXJDb21wb25lbnQge1xuICBfdmlld0NvbnRhaW5lclJlZiA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKTtcbiAgX3JlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XG4gIF9lbGVtZW50UmVmID0gaW5qZWN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PihFbGVtZW50UmVmKTtcbiAgX2RvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcbiAgX2NvbmZpZyA9IGluamVjdChDT05URU5URlVMX0NPTkZJRywgeyBvcHRpb25hbDogdHJ1ZSB9KSA/PyBjcmVhdGVDb250ZW50ZnVsQ29uZmlnKCk7XG5cbiAgLyoqXG4gICAqIEEgY2FjaGUgZm9yIGFsbCBleGVjdXRlZCBjb21tYW5kcyB0aGF0IGFyZSBub3QgZGVsZXRlZC5cbiAgICogVGhpcyBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgYWxsIHJlbmRlcmVkIGVsZW1lbnRzIGFuZCBjb21wb25lbnRzLlxuICAgKiBUaGUga2V5IGlzIHRoZSByZW5kZXIgY29tbWFuZCBlbGVtZW50IElELlxuICAgKi9cbiAgX2V4ZWN1dGVkQ29tbWFuZHNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBFeGVjdXRlZENvbW1hbmRDYWNoZUl0ZW0+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50ZnVsIHJlc3BvbnNlIGdvdHRlbiB2aWEgdGhlaXIgUkVTVCBhcGkuXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cuY29udGVudGZ1bC5jb20vZGV2ZWxvcGVycy9kb2NzL3JlZmVyZW5jZXMvY29udGVudC1kZWxpdmVyeS1hcGkvIy9yZWZlcmVuY2UvZW50cmllcy9lbnRyaWVzLWNvbGxlY3Rpb25cbiAgICovXG4gIGNvbnRlbnQgPSBpbnB1dC5yZXF1aXJlZDxDb250ZW50ZnVsQ29sbGVjdGlvbiB8IG51bGwgfCB1bmRlZmluZWQ+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHdoZXJlIHRoZSByaWNoIHRleHQgZmllbGQgaXMgaW5zaWRlIHRoZSBjb250ZW50ZnVsIHJlc3BvbnNlLiBEb3QgYW5kIGFycmF5IG5vdGF0aW9uIGlzIGFsbG93ZWQuXG4gICAqIEBkZWZhdWx0IFwiaXRlbXNbMF0uZmllbGRzLmh0bWxcIlxuICAgKi9cbiAgcmljaFRleHRQYXRoID0gaW5wdXQucmVxdWlyZWQ8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBBIG1hcCBvZiBhbGwgaW5jbHVkZXMgaW4gdGhlIGNvbnRlbnRmdWwgcmVzcG9uc2UuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciBsb29raW5nIHVwIGFzc2V0cyBhbmQgZW50cmllcyB0aGF0IGFyZSByZWZlcmVuY2VkIGluIHRoZSByaWNoIHRleHQgd2l0aG91dCBoYXZpbmcgdG8gdXNlIGxvb3BzLlxuICAgKi9cbiAgY29udGVudEluY2x1ZGVzTWFwID0gY29tcHV0ZWQ8Q29udGVudGZ1bEluY2x1ZGVNYXA+KCgpID0+IHtcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5jb250ZW50KCk7XG4gICAgY29uc3QgYXNzZXRzID0gY29udGVudD8uaW5jbHVkZXMuQXNzZXQ7XG4gICAgY29uc3QgZW50cmllcyA9IGNvbnRlbnQ/LmluY2x1ZGVzLkVudHJ5O1xuXG4gICAgY29uc3QgYXNzZXRNYXAgPSBuZXcgTWFwKGFzc2V0cz8ubWFwKChhc3NldCkgPT4gW2Fzc2V0LnN5cy5pZCwgYXNzZXRdKSA/PyBbXSk7XG4gICAgY29uc3QgZW50cnlNYXAgPSBuZXcgTWFwKGVudHJpZXM/Lm1hcCgoZW50cnkpID0+IFtlbnRyeS5zeXMuaWQsIGVudHJ5XSkgPz8gW10pO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBnZXRFbnRyeSA9IDxUIGV4dGVuZHMgeyBba2V5OiBzdHJpbmddOiBhbnkgfT4oaWQ6IHN0cmluZywgc3lzSWQ6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgZW50cnkgPSBlbnRyeU1hcC5nZXQoaWQpO1xuXG4gICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3lzSWQgPT09IEFOWV9FTlRSWV9TWVNfSUQpIHtcbiAgICAgICAgcmV0dXJuIGVudHJ5IGFzIENvbnRlbnRmdWxFbnRyeTxUPjtcbiAgICAgIH1cblxuICAgICAgaWYgKGVudHJ5LnN5cy5pZCAhPT0gc3lzSWQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdFbnRyeSBzeXMgSUQgZG9lcyBub3QgbWF0Y2ggdGhlIHByb3ZpZGVkIHN5cyBJRCEgV2lsbCByZXR1cm4gbnVsbC4nLCB7IGVudHJ5LCBzeXNJZCB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlbnRyeSBhcyBDb250ZW50ZnVsRW50cnk8VD47XG4gICAgfTtcblxuICAgIGNvbnN0IGdldEFzc2V0ID0gKGlkOiBzdHJpbmcpID0+IHtcbiAgICAgIHJldHVybiBhc3NldE1hcC5nZXQoaWQpID8/IG51bGw7XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBnZXRFbnRyeSxcbiAgICAgIGdldEFzc2V0LFxuICAgIH07XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBUaGUgcmljaCB0ZXh0IGRhdGEgdGhhdCBzaG91bGQgYmUgcmVuZGVyZWQuXG4gICAqL1xuICByaWNoVGV4dERhdGEgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuY29udGVudCgpO1xuICAgIGNvbnN0IHJpY2hUZXh0UGF0aCA9IHRoaXMucmljaFRleHRQYXRoKCk7XG5cbiAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHJpY2hUZXh0ID0gZ2V0T2JqZWN0UHJvcGVydHkoY29udGVudCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCByaWNoVGV4dFBhdGgpO1xuXG4gICAgaWYgKCFpc09iamVjdChyaWNoVGV4dCkpIHtcbiAgICAgIHRocm93IHJpY2hUZXh0UmVuZGVyZXJFcnJvcigncmljaF90ZXh0X3VuZGVmaW5lZCcsIGZhbHNlLCB7IGNvbnRlbnQsIHJpY2hUZXh0UGF0aCB9KTtcbiAgICB9XG5cbiAgICBpZiAoIWlzUmljaFRleHRSb290Tm9kZShyaWNoVGV4dCkpIHtcbiAgICAgIHRocm93IHJpY2hUZXh0UmVuZGVyZXJFcnJvcigncmljaF90ZXh0X3dyb25nX3R5cGUnLCBmYWxzZSwgeyBjb250ZW50LCByaWNoVGV4dFBhdGggfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJpY2hUZXh0IGFzIFJpY2hUZXh0UmVzcG9uc2U7XG4gIH0pO1xuXG4gIHJlbmRlckNvbW1hbmRzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHJpY2hUZXh0RGF0YSA9IHRoaXMucmljaFRleHREYXRhKCk7XG5cbiAgICBpZiAoIXJpY2hUZXh0RGF0YSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVSZW5kZXJDb21tYW5kcyhyaWNoVGV4dERhdGEpO1xuICB9KTtcblxuICByZW5kZXJDb21tYW5kSGlzdG9yeSA9IHRvU2lnbmFsKFxuICAgIHRvT2JzZXJ2YWJsZSh0aGlzLnJlbmRlckNvbW1hbmRzKS5waXBlKHN0YXJ0V2l0aChbXSBhcyBSZW5kZXJDb21tYW5kW10pLCBwYWlyd2lzZSgpKSxcbiAgICB7IGluaXRpYWxWYWx1ZTogW1tdLCBbXV0gfSxcbiAgKTtcblxuICBwcmV2aW91c1JlbmRlckNvbW1hbmRNYXAgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgW3ByZXZDb21tYW5kc10gPSB0aGlzLnJlbmRlckNvbW1hbmRIaXN0b3J5KCk7XG5cbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZyB8IG51bWJlciwgUmVuZGVyQ29tbWFuZD4oKTtcblxuICAgIGZvciAoY29uc3QgY29tbWFuZCBvZiBwcmV2Q29tbWFuZHMpIHtcbiAgICAgIG1hcC5zZXQoZ2V0UmVuZGVyQ29tbWFuZElkKGNvbW1hbmQpLCBjb21tYW5kKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwO1xuICB9KTtcblxuICByZW5kZXJJbnN0cnVjdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY29tbWFuZHMgPSB0aGlzLnJlbmRlckNvbW1hbmRzKCk7XG4gICAgY29uc3QgcHJldmlvdXNSZW5kZXJDb21tYW5kTWFwID0gbmV3IE1hcCh0aGlzLnByZXZpb3VzUmVuZGVyQ29tbWFuZE1hcCgpKTtcblxuICAgIGNvbnN0IGluc3RydWN0aW9uczogUmVuZGVySW5zdHJ1Y3Rpb25bXSA9IFtdO1xuXG4gICAgLy8gcmVtb3ZlIGRlbGV0ZWQgY29tcG9uZW50cyBhcyB3ZWxsIGFzIGFsbCBvdGhlciBlbGVtZW50c1xuICAgIGZvciAoY29uc3QgWywgY29tbWFuZF0gb2YgcHJldmlvdXNSZW5kZXJDb21tYW5kTWFwKSB7XG4gICAgICBpZiAoaXNDb21wb25lbnRSZW5kZXJDb21tYW5kKGNvbW1hbmQpKSB7XG4gICAgICAgIC8vIGtlZXAgdGhlIGNvbXBvbmVudCBhcm91bmQgaWYgaXQncyBzdGlsbCBpbiB0aGUgbmV3IGNvbW1hbmRzXG4gICAgICAgIGlmIChjb21tYW5kcy5zb21lKChjKSA9PiBnZXRSZW5kZXJDb21tYW5kSWQoYykgPT09IGdldFJlbmRlckNvbW1hbmRJZChjb21tYW5kKSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpbnN0cnVjdGlvbnMucHVzaChbUkVOREVSX0lOU1RSVUNUSU9OX1RZUEUuREVMRVRFLCBjb21tYW5kXSk7XG5cbiAgICAgIC8vIHJlbW92ZSBmcm9tIG1hcCB0byBtYXJrIGFzIHVzZWRcbiAgICAgIHByZXZpb3VzUmVuZGVyQ29tbWFuZE1hcC5kZWxldGUoZ2V0UmVuZGVyQ29tbWFuZElkKGNvbW1hbmQpKTtcbiAgICB9XG5cbiAgICAvLyBGaW5kIHRoZSBpbmRleGVzIG9mIHRoZSBjb21tYW5kcyByZW1haW5pbmcgaW4gdGhlIHByZXZpb3VzUmVuZGVyQ29tbWFuZE1hcCBpbiB0aGUgbmV3IGNvbW1hbmRzIGFycmF5LlxuICAgIGNvbnN0IGxhc3RDb21wb25lbnRJbmRleGVzOiB7IG5ld0luZGV4OiBudW1iZXI7IHByZXZJbmRleDogbnVtYmVyOyBjb21tYW5kOiBSZW5kZXJDb21tYW5kIH1bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2lkLCBjb21tYW5kXSBvZiBwcmV2aW91c1JlbmRlckNvbW1hbmRNYXApIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gY29tbWFuZHMuZmluZEluZGV4KChjKSA9PiBnZXRSZW5kZXJDb21tYW5kSWQoYykgPT09IGlkKTtcbiAgICAgIGNvbnN0IG5ld0NvbW1hbmQgPSBjb21tYW5kc1tpbmRleF0hO1xuXG4gICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ29tbWFuZCBub3QgZm91bmQhJyk7XG4gICAgICB9XG5cbiAgICAgIGxhc3RDb21wb25lbnRJbmRleGVzLnB1c2goe1xuICAgICAgICBuZXdJbmRleDogaW5kZXgsXG4gICAgICAgIHByZXZJbmRleDogY29tbWFuZFtSRU5ERVJfQ09NTUFORF9QT1NJVElPTi5JTkRFWF0sXG4gICAgICAgIGNvbW1hbmQ6IG5ld0NvbW1hbmQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBsYXN0Q29tcG9uZW50SW5kZXhlcy5zb3J0KChhLCBiKSA9PiBhLm5ld0luZGV4IC0gYi5uZXdJbmRleCk7XG5cbiAgICAvLyBjaGVjayBpZiB0aGUgcHJldkluZGV4IGFyZSBpbiBvcmRlciBhc2NlbmRpbmdcbiAgICAvLyBmb3IgaW5kZXhlcyB0aGF0IGFyZSBub3QgaW4gb3JkZXIsIGNyZWF0ZSBhIG1vdmUgaW5zdHJ1Y3Rpb25cbiAgICAvLyBmb3IgaW5kZXhlcyB0aGF0IGFyZSBpbiBvcmRlciwgY3JlYXRlIGFuIHVwZGF0ZSBpbnN0cnVjdGlvblxuICAgIGxldCBtb3ZlQ2hlY2tJbmRleCA9IDA7XG4gICAgd2hpbGUgKG1vdmVDaGVja0luZGV4IDwgbGFzdENvbXBvbmVudEluZGV4ZXMubGVuZ3RoIC0gMSkge1xuICAgICAgY29uc3QgbW92ZUN1cnIgPSBsYXN0Q29tcG9uZW50SW5kZXhlc1ttb3ZlQ2hlY2tJbmRleF07XG4gICAgICBjb25zdCBtb3ZlTmV4dCA9IGxhc3RDb21wb25lbnRJbmRleGVzW21vdmVDaGVja0luZGV4ICsgMV07XG5cbiAgICAgIGlmICghbW92ZUN1cnIgfHwgIW1vdmVOZXh0KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAobW92ZUN1cnIucHJldkluZGV4ID4gbW92ZU5leHQucHJldkluZGV4KSB7XG4gICAgICAgIGxhc3RDb21wb25lbnRJbmRleGVzLnNwbGljZShtb3ZlQ2hlY2tJbmRleCArIDEsIDEpO1xuICAgICAgICBpbnN0cnVjdGlvbnMucHVzaChbUkVOREVSX0lOU1RSVUNUSU9OX1RZUEUuTU9WRSwgbW92ZU5leHQuY29tbWFuZF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5zdHJ1Y3Rpb25zLnB1c2goW1JFTkRFUl9JTlNUUlVDVElPTl9UWVBFLlVQREFURSwgbW92ZU5leHQuY29tbWFuZF0pO1xuICAgICAgICBtb3ZlQ2hlY2tJbmRleCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgY29tbWFuZCBvZiBjb21tYW5kcykge1xuICAgICAgY29uc3QgaWQgPSBnZXRSZW5kZXJDb21tYW5kSWQoY29tbWFuZCk7XG5cbiAgICAgIGlmIChpc0NvbXBvbmVudFJlbmRlckNvbW1hbmQoY29tbWFuZCkpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNDb21tYW5kID0gcHJldmlvdXNSZW5kZXJDb21tYW5kTWFwLmdldChpZCk7XG5cbiAgICAgICAgaWYgKCFwcmV2aW91c0NvbW1hbmQpIHtcbiAgICAgICAgICAvLyBjcmVhdGVcbiAgICAgICAgICBpbnN0cnVjdGlvbnMucHVzaChbUkVOREVSX0lOU1RSVUNUSU9OX1RZUEUuQ1JFQVRFLCBjb21tYW5kXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGNyZWF0ZVxuICAgICAgICBpbnN0cnVjdGlvbnMucHVzaChbUkVOREVSX0lOU1RSVUNUSU9OX1RZUEUuQ1JFQVRFLCBjb21tYW5kXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3RydWN0aW9ucztcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdG9PYnNlcnZhYmxlKHRoaXMucmVuZGVySW5zdHJ1Y3Rpb25zKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpLFxuICAgICAgICB0YXAoKGluc3RydWN0aW9ucykgPT4ge1xuICAgICAgICAgIHRoaXMuX2V4ZWNJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKTtcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVSZW5kZXJDb21tYW5kcyhyaWNoVGV4dERhdGE6IFJpY2hUZXh0UmVzcG9uc2UpIHtcbiAgICAvKiogTGlzdCBvZiBhbGwgcmVuZGVyIGNvbW1hbmRzICovXG4gICAgY29uc3Qgcm9vdENvbW1hbmRzOiBSZW5kZXJDb21tYW5kW10gPSBbXTtcblxuICAgIC8qKiBDb3VudGVyIGZvciBnZW5lcmF0aW5nIHVuaXF1ZSBodG1sIGVsZW1lbnQgSURzLiAqL1xuICAgIGxldCBlbGVtZW50SWQgPSAwO1xuXG4gICAgLyoqIENvdW50ZXIgZm9yIGdlbmVyYXRpbmcgdW5pcXVlIGNvbXBvbmVudCBJRHMuICovXG4gICAgY29uc3QgY29tcG9uZW50SWRNYXAgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gICAgLyoqIFRoZSBuZXN0aW5nIGxldmVsIG9mIHRoZSBjdXJyZW50IG5vZGUuICovXG4gICAgbGV0IG5lc3RpbmdMZXZlbCA9IDA7XG5cbiAgICAvKiogVGhlIHBvc2l0aW9uIChpbmRleCkgb2YgdGhlIGN1cnJlbnQgbm9kZSBpbnNpZGUgdGhlIHBhcmVudCBub2RlLiAqL1xuICAgIGxldCBkb21Qb3NpdGlvbiA9IDA7XG5cbiAgICBsZXQgY29tbWFuZEluZGV4ID0gMDtcblxuICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGU6IEJsb2NrIHwgSW5saW5lIHwgVGV4dCwgcGFyZW50OiBSZW5kZXJDb21tYW5kIHwgbnVsbCA9IG51bGwpID0+IHtcbiAgICAgIHN3aXRjaCAobm9kZS5ub2RlVHlwZSkge1xuICAgICAgICBjYXNlICd0ZXh0Jzoge1xuICAgICAgICAgIC8vIFJlbmRlciBtZWRpYVxuICAgICAgICAgIGNvbnN0IHR5cGUgPSBSRU5ERVJfQ09NTUFORF9UWVBFLlRFWFQ7XG4gICAgICAgICAgY29uc3QgdGV4dCA9IG5vZGUudmFsdWU7XG5cbiAgICAgICAgICBpZiAoIXRleHQpIGJyZWFrO1xuXG4gICAgICAgICAgY29uc3QgY29tbWFuZDogVGV4dFJlbmRlckNvbW1hbmQgPSBbdHlwZSwgbmVzdGluZ0xldmVsLCBkb21Qb3NpdGlvbiwgY29tbWFuZEluZGV4KyssIHRleHRdO1xuXG4gICAgICAgICAgcm9vdENvbW1hbmRzLnB1c2goY29tbWFuZCk7XG4gICAgICAgICAgZG9tUG9zaXRpb24rKztcblxuICAgICAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgICAgICB0aHJvdyByaWNoVGV4dFJlbmRlcmVyRXJyb3IoJ3RleHRfcGFyZW50X25vdF9mb3VuZCcsIGZhbHNlLCB7IG5vZGUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghaXNIdG1sT3BlblJlbmRlckNvbW1hbmQocGFyZW50KSAmJiAhaXNDb21wb25lbnRSZW5kZXJDb21tYW5kKHBhcmVudCkpIHtcbiAgICAgICAgICAgIHRocm93IHJpY2hUZXh0UmVuZGVyZXJFcnJvcigndGV4dF9wYXJlbnRfd3JvbmdfdHlwZScsIGZhbHNlLCB7IG5vZGUsIHBhcmVudCB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzUG9zaXRpb24gPVxuICAgICAgICAgICAgcGFyZW50W1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLlRZUEVdID09PSBSRU5ERVJfQ09NTUFORF9UWVBFLkhUTUxfT1BFTlxuICAgICAgICAgICAgICA/IEhUTUxfT1BFTl9SRU5ERVJfQ09NTUFORF9QT1NJVElPTi5BVFRSSUJVVEVTXG4gICAgICAgICAgICAgIDogQ09NUE9ORU5UX1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLkFUVFJJQlVURVM7XG5cbiAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gcGFyZW50W2F0dHJpYnV0ZXNQb3NpdGlvbl07XG5cbiAgICAgICAgICBpZiAobm9kZS5tYXJrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hcmtDbGFzc2VzID0gbWFya3NUb0NsYXNzKG5vZGUubWFya3MpO1xuXG4gICAgICAgICAgICBpZiAoQ0xBU1NfQVRUUiBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICAgIGF0dHJpYnV0ZXNbQ0xBU1NfQVRUUl0gKz0gYCAke21hcmtDbGFzc2VzfWA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhdHRyaWJ1dGVzW0NMQVNTX0FUVFJdID0gbWFya0NsYXNzZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIEJMT0NLUy5FTUJFRERFRF9BU1NFVDoge1xuICAgICAgICAgIC8vIFJlbmRlciBtZWRpYVxuICAgICAgICAgIGNvbnN0IHR5cGUgPSBSRU5ERVJfQ09NTUFORF9UWVBFLkNPTVBPTkVOVDtcbiAgICAgICAgICBjb25zdCBhc3NldElkID0gbm9kZS5kYXRhWyd0YXJnZXQnXT8uc3lzPy5pZDtcblxuICAgICAgICAgIGlmICghYXNzZXRJZCkge1xuICAgICAgICAgICAgdGhyb3cgcmljaFRleHRSZW5kZXJlckVycm9yKCdhc3NldF9pZF9ub3RfZm91bmQnLCBmYWxzZSwgeyBub2RlIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGFzc2V0ID0gdGhpcy5jb250ZW50SW5jbHVkZXNNYXAoKS5nZXRBc3NldChhc3NldElkKTtcblxuICAgICAgICAgIGlmICghYXNzZXQpIHtcbiAgICAgICAgICAgIHRocm93IHJpY2hUZXh0UmVuZGVyZXJFcnJvcignYXNzZXRfbm90X2ZvdW5kJywgZmFsc2UsIHsgYXNzZXRJZCwgbm9kZSB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IGFzc2V0LmZpZWxkcy5maWxlLmNvbnRlbnRUeXBlO1xuICAgICAgICAgIGNvbnN0IGFzc2V0Q29tcG9uZW50cyA9IHRoaXMuX2NvbmZpZy5jb21wb25lbnRzO1xuXG4gICAgICAgICAgY29uc3QgaXNJbWFnZSA9IGNvbnRlbnRUeXBlLnN0YXJ0c1dpdGgoJ2ltYWdlLycpO1xuICAgICAgICAgIGNvbnN0IGlzVmlkZW8gPSBjb250ZW50VHlwZS5zdGFydHNXaXRoKCd2aWRlby8nKTtcbiAgICAgICAgICBjb25zdCBpc0F1ZGlvID0gY29udGVudFR5cGUuc3RhcnRzV2l0aCgnYXVkaW8vJyk7XG5cbiAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBpc0ltYWdlXG4gICAgICAgICAgICA/IGFzc2V0Q29tcG9uZW50cy5pbWFnZVxuICAgICAgICAgICAgOiBpc1ZpZGVvXG4gICAgICAgICAgICAgID8gYXNzZXRDb21wb25lbnRzLnZpZGVvXG4gICAgICAgICAgICAgIDogaXNBdWRpb1xuICAgICAgICAgICAgICAgID8gYXNzZXRDb21wb25lbnRzLmF1ZGlvXG4gICAgICAgICAgICAgICAgOiBhc3NldENvbXBvbmVudHMuZmlsZTtcblxuICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFR5cGUgPSBpc0ltYWdlXG4gICAgICAgICAgICA/IERFRkFVTFRfQ09NUE9ORU5UX1RZUEVTLklNQUdFXG4gICAgICAgICAgICA6IGlzVmlkZW9cbiAgICAgICAgICAgICAgPyBERUZBVUxUX0NPTVBPTkVOVF9UWVBFUy5WSURFT1xuICAgICAgICAgICAgICA6IGlzQXVkaW9cbiAgICAgICAgICAgICAgICA/IERFRkFVTFRfQ09NUE9ORU5UX1RZUEVTLkFVRElPXG4gICAgICAgICAgICAgICAgOiBERUZBVUxUX0NPTVBPTkVOVF9UWVBFUy5GSUxFO1xuXG4gICAgICAgICAgbGV0IGNvbXBvbmVudElkID0gY29tcG9uZW50SWRNYXAuZ2V0KGNvbXBvbmVudFR5cGUpID8/IC0xO1xuICAgICAgICAgIGNvbnN0IGlkID0gY29tcG9uZW50VHlwZSArICsrY29tcG9uZW50SWQ7XG4gICAgICAgICAgY29tcG9uZW50SWRNYXAuc2V0KGNvbXBvbmVudFR5cGUsIGNvbXBvbmVudElkKTtcblxuICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB7fTtcblxuICAgICAgICAgIGNvbnN0IGlucHV0cyA9IHtcbiAgICAgICAgICAgIGFzc2V0LFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCBjb21tYW5kOiBDb21wb25lbnRSZW5kZXJDb21tYW5kID0gW1xuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIG5lc3RpbmdMZXZlbCxcbiAgICAgICAgICAgIGRvbVBvc2l0aW9uLFxuICAgICAgICAgICAgY29tbWFuZEluZGV4KyssXG4gICAgICAgICAgICBhdHRyaWJ1dGVzLFxuICAgICAgICAgICAgY29tcG9uZW50LFxuICAgICAgICAgICAgaW5wdXRzLFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgXTtcblxuICAgICAgICAgIHJvb3RDb21tYW5kcy5wdXNoKGNvbW1hbmQpO1xuXG4gICAgICAgICAgZG9tUG9zaXRpb24rKztcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBCTE9DS1MuRU1CRURERURfRU5UUlk6XG4gICAgICAgIGNhc2UgSU5MSU5FUy5FTUJFRERFRF9FTlRSWToge1xuICAgICAgICAgIC8vIFJlbmRlciBjb21wb25lbnRcbiAgICAgICAgICBjb25zdCB0eXBlID0gUkVOREVSX0NPTU1BTkRfVFlQRS5DT01QT05FTlQ7XG4gICAgICAgICAgY29uc3QgZW50cnlJZCA9IG5vZGUuZGF0YVsndGFyZ2V0J10/LnN5cz8uaWQ7XG5cbiAgICAgICAgICBpZiAoIWVudHJ5SWQpIHtcbiAgICAgICAgICAgIHRocm93IHJpY2hUZXh0UmVuZGVyZXJFcnJvcignZW50cnlfaWRfbm90X2ZvdW5kJywgZmFsc2UsIHsgbm9kZSB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuY29udGVudEluY2x1ZGVzTWFwKCkuZ2V0RW50cnkoZW50cnlJZCwgQU5ZX0VOVFJZX1NZU19JRCk7XG5cbiAgICAgICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgICAgICB0aHJvdyByaWNoVGV4dFJlbmRlcmVyRXJyb3IoJ2VudHJ5X25vdF9mb3VuZCcsIGZhbHNlLCB7IGVudHJ5SWQsIG5vZGUgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgY29tcG9uZW50VHlwZSA9IGVudHJ5LnN5cy5jb250ZW50VHlwZS5zeXMuaWQ7XG5cbiAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLl9jb25maWcuY3VzdG9tQ29tcG9uZW50c1tjb21wb25lbnRUeXBlXTtcblxuICAgICAgICAgIGlmICghY29tcG9uZW50KSB7XG4gICAgICAgICAgICB0aHJvdyByaWNoVGV4dFJlbmRlcmVyRXJyb3IoJ2N1c3RvbV9jb21wb25lbnRfbm90X2ZvdW5kJywgZmFsc2UsIHtcbiAgICAgICAgICAgICAgY29tcG9uZW50VHlwZSxcbiAgICAgICAgICAgICAgY3VzdG9tQ29tcG9uZW50czogdGhpcy5fY29uZmlnLmN1c3RvbUNvbXBvbmVudHMsXG4gICAgICAgICAgICAgIGVudHJ5LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHt9O1xuICAgICAgICAgIGxldCBjb21wb25lbnRJZCA9IGNvbXBvbmVudElkTWFwLmdldChjb21wb25lbnRUeXBlKSA/PyAtMTtcbiAgICAgICAgICBjb25zdCBpZCA9IGNvbXBvbmVudFR5cGUgKyArK2NvbXBvbmVudElkO1xuICAgICAgICAgIGNvbXBvbmVudElkTWFwLnNldChjb21wb25lbnRUeXBlLCBjb21wb25lbnRJZCk7XG5cbiAgICAgICAgICBjb25zdCBpbnB1dHMgPSB7XG4gICAgICAgICAgICBmaWVsZHM6IGVudHJ5LmZpZWxkcyxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBlbnRyeS5tZXRhZGF0YSxcbiAgICAgICAgICAgIHN5czogZW50cnkuc3lzLFxuICAgICAgICAgICAgaW5jbHVkZXM6IHRoaXMuY29udGVudEluY2x1ZGVzTWFwKCksXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IGNvbW1hbmQ6IENvbXBvbmVudFJlbmRlckNvbW1hbmQgPSBbXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgbmVzdGluZ0xldmVsLFxuICAgICAgICAgICAgZG9tUG9zaXRpb24sXG4gICAgICAgICAgICBjb21tYW5kSW5kZXgrKyxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICAgICAgICBjb21wb25lbnQsXG4gICAgICAgICAgICBpbnB1dHMsXG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICBdO1xuXG4gICAgICAgICAgcm9vdENvbW1hbmRzLnB1c2goY29tbWFuZCk7XG5cbiAgICAgICAgICBkb21Qb3NpdGlvbisrO1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgY29uc3QgdHlwZSA9IFJFTkRFUl9DT01NQU5EX1RZUEUuSFRNTF9PUEVOO1xuICAgICAgICAgIGNvbnN0IHRhZyA9IHRyYW5zbGF0ZUNvbnRlbnRmdWxOb2RlVHlwZVRvSHRtbFRhZyhub2RlLm5vZGVUeXBlKTtcbiAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICAgICAgY29uc3QgaWQgPSAnZScgKyBlbGVtZW50SWQrKztcblxuICAgICAgICAgIGNvbnN0IGNvbW1hbmQ6IEh0bWxPcGVuUmVuZGVyQ29tbWFuZCA9IFt0eXBlLCBuZXN0aW5nTGV2ZWwsIGRvbVBvc2l0aW9uLCBjb21tYW5kSW5kZXgrKywgYXR0cmlidXRlcywgdGFnLCBpZF07XG5cbiAgICAgICAgICByb290Q29tbWFuZHMucHVzaChjb21tYW5kKTtcblxuICAgICAgICAgIGNvbnN0IGRvbVBvc2l0aW9uQXRUaGlzTGV2ZWwgPSBkb21Qb3NpdGlvbjtcbiAgICAgICAgICAvLyBOb3JtYWwgaHRtbCBlbGVtZW50cyBjYW4gaGF2ZSBjaGlsZHJlblxuICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jb250ZW50KSB7XG4gICAgICAgICAgICBkb21Qb3NpdGlvbiA9IDA7XG4gICAgICAgICAgICBuZXN0aW5nTGV2ZWwrKztcbiAgICAgICAgICAgIHRyYXZlcnNlKGNoaWxkLCBjb21tYW5kKTtcbiAgICAgICAgICAgIG5lc3RpbmdMZXZlbC0tO1xuICAgICAgICAgICAgZG9tUG9zaXRpb24gPSBkb21Qb3NpdGlvbkF0VGhpc0xldmVsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGxhc3RDb21tYW5kID0gcm9vdENvbW1hbmRzW3Jvb3RDb21tYW5kcy5sZW5ndGggLSAxXTtcblxuICAgICAgICAgIGlmIChsYXN0Q29tbWFuZD8uW1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLlRZUEVdID09PSBSRU5ERVJfQ09NTUFORF9UWVBFLkhUTUxfT1BFTikge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGxhc3QgY29tbWFuZCBpcyBhbiBvcGVuIGNvbW1hbmQsIHdlIGNhbiByZW1vdmUgaXQgc2luY2UgaXQncyBlbXB0eVxuICAgICAgICAgICAgcm9vdENvbW1hbmRzLnBvcCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjbG9zZUlkID0gJ2UnICsgZWxlbWVudElkKys7XG5cbiAgICAgICAgICAgIGNvbnN0IGNsb3NlQ29tbWFuZDogSHRtbENsb3NlUmVuZGVyQ29tbWFuZCA9IFtcbiAgICAgICAgICAgICAgUkVOREVSX0NPTU1BTkRfVFlQRS5IVE1MX0NMT1NFLFxuICAgICAgICAgICAgICBuZXN0aW5nTGV2ZWwsXG4gICAgICAgICAgICAgIGRvbVBvc2l0aW9uLFxuICAgICAgICAgICAgICBjb21tYW5kSW5kZXgrKyxcbiAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICBjbG9zZUlkLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHJvb3RDb21tYW5kcy5wdXNoKGNsb3NlQ29tbWFuZCk7XG5cbiAgICAgICAgICAgIGRvbVBvc2l0aW9uKys7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IElOTElORVMuSFlQRVJMSU5LKSB7XG4gICAgICAgICAgICBjb25zdCB1cmkgPSBub2RlLmRhdGFbJ3VyaSddO1xuICAgICAgICAgICAgYXR0cmlidXRlc1snaHJlZiddID0gdXJpO1xuXG4gICAgICAgICAgICBjb25zdCBob3N0ID0gdGhpcy5fZG9jdW1lbnQubG9jYXRpb24uaG9zdDtcbiAgICAgICAgICAgIGNvbnN0IGlzRXh0ZXJuYWwgPSAhdXJpLmluY2x1ZGVzKGhvc3QpO1xuXG4gICAgICAgICAgICBpZiAoaXNFeHRlcm5hbCkge1xuICAgICAgICAgICAgICBhdHRyaWJ1dGVzWyd0YXJnZXQnXSA9ICdfYmxhbmsnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiByaWNoVGV4dERhdGEuY29udGVudCkge1xuICAgICAgdHJhdmVyc2Uobm9kZSwgbnVsbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvb3RDb21tYW5kcztcbiAgfVxuXG4gIHByaXZhdGUgX2V4ZWNJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zOiBSZW5kZXJJbnN0cnVjdGlvbltdKSB7XG4gICAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICAgIGNvbnN0IHR5cGUgPSBpbnN0cnVjdGlvbltSRU5ERVJfSU5TVFJVQ1RJT05fUE9TSVRJT04uVFlQRV07XG4gICAgICBjb25zdCBjb21tYW5kID0gaW5zdHJ1Y3Rpb25bUkVOREVSX0lOU1RSVUNUSU9OX1BPU0lUSU9OLkNPTU1BTkRdO1xuXG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBSRU5ERVJfSU5TVFJVQ1RJT05fVFlQRS5DUkVBVEU6XG4gICAgICAgICAgdGhpcy5fcnVuQ3JlYXRlSW5zdHJ1Y3Rpb24oY29tbWFuZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUkVOREVSX0lOU1RSVUNUSU9OX1RZUEUuVVBEQVRFOlxuICAgICAgICAgIHRoaXMuX3J1blVwZGF0ZUluc3RydWN0aW9uKGNvbW1hbmQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFJFTkRFUl9JTlNUUlVDVElPTl9UWVBFLk1PVkU6XG4gICAgICAgICAgdGhpcy5fcnVuTW92ZUluc3RydWN0aW9uKGNvbW1hbmQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFJFTkRFUl9JTlNUUlVDVElPTl9UWVBFLkRFTEVURTpcbiAgICAgICAgICB0aGlzLl9ydW5EZWxldGVJbnN0cnVjdGlvbihjb21tYW5kKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9ydW5DcmVhdGVJbnN0cnVjdGlvbihjb21tYW5kOiBSZW5kZXJDb21tYW5kKSB7XG4gICAgY29uc3QgaWQgPSBnZXRSZW5kZXJDb21tYW5kSWQoY29tbWFuZCk7XG4gICAgY29uc3QgcGFyZW50RWxlbWVudCA9IHRoaXMuX2ZpbmRQYXJlbnQoY29tbWFuZCk7XG4gICAgY29uc3QgbmV4dEVsZW1lbnQgPSB0aGlzLl9maW5kRm9sbG93aW5nRWxlbWVudChjb21tYW5kKTtcblxuICAgIGlmIChpc0NvbXBvbmVudFJlbmRlckNvbW1hbmQoY29tbWFuZCkpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMuX3ZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KGNvbW1hbmRbQ09NUE9ORU5UX1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLkNPTVBPTkVOVF0pO1xuXG4gICAgICB0aGlzLl91cGRhdGVDb21wb25lbnRJbnB1dHMoY29tbWFuZCwgY29tcG9uZW50UmVmKTtcblxuICAgICAgY29uc3Qgcm9vdE5vZGUgPSB0aGlzLl9nZXRDb21wb25lbnRSb290Tm9kZShjb21wb25lbnRSZWYpO1xuXG4gICAgICB0aGlzLl9yZW5kZXJJbnNlcnRPckFwcGVuZChyb290Tm9kZSwgcGFyZW50RWxlbWVudCwgbmV4dEVsZW1lbnQpO1xuXG4gICAgICB0aGlzLl9leGVjdXRlZENvbW1hbmRzQ2FjaGUuc2V0KGlkLCB7XG4gICAgICAgIGNvbW1hbmQsXG4gICAgICAgIGNvbXBvbmVudFJlZixcbiAgICAgICAgZWxlbWVudDogcm9vdE5vZGUsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGlzVGV4dFJlbmRlckNvbW1hbmQoY29tbWFuZCkpIHtcbiAgICAgIGNvbnN0IHRleHQgPSBjb21tYW5kW1RFWFRfUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uVEVYVF07XG4gICAgICBjb25zdCB0ZXh0Tm9kZSA9IHRoaXMuX3JlbmRlcmVyLmNyZWF0ZVRleHQodGV4dCk7XG4gICAgICBjb25zdCBzcGFuID0gdGhpcy5fcmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgdGhpcy5fcmVuZGVyZXIuYXBwZW5kQ2hpbGQoc3BhbiwgdGV4dE5vZGUpO1xuXG4gICAgICB0aGlzLl9yZW5kZXJJbnNlcnRPckFwcGVuZChzcGFuLCBwYXJlbnRFbGVtZW50LCBuZXh0RWxlbWVudCk7XG5cbiAgICAgIHRoaXMuX2V4ZWN1dGVkQ29tbWFuZHNDYWNoZS5zZXQoaWQsIHtcbiAgICAgICAgY29tbWFuZCxcbiAgICAgICAgZWxlbWVudDogc3BhbixcbiAgICAgICAgdGV4dE5vZGUsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGlzSHRtbE9wZW5SZW5kZXJDb21tYW5kKGNvbW1hbmQpKSB7XG4gICAgICBjb25zdCB0YWcgPSBjb21tYW5kW0hUTUxfT1BFTl9SRU5ERVJfQ09NTUFORF9QT1NJVElPTi5UQUdfTkFNRV07XG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gY29tbWFuZFtIVE1MX09QRU5fUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uQVRUUklCVVRFU107XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fcmVuZGVyZXIuY3JlYXRlRWxlbWVudCh0YWcpO1xuXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVzKSkge1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRBdHRyaWJ1dGUoZWxlbWVudCwga2V5LCB2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3JlbmRlckluc2VydE9yQXBwZW5kKGVsZW1lbnQsIHBhcmVudEVsZW1lbnQsIG5leHRFbGVtZW50KTtcblxuICAgICAgdGhpcy5fZXhlY3V0ZWRDb21tYW5kc0NhY2hlLnNldChpZCwge1xuICAgICAgICBjb21tYW5kLFxuICAgICAgICBlbGVtZW50LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcnVuVXBkYXRlSW5zdHJ1Y3Rpb24oY29tbWFuZDogUmVuZGVyQ29tbWFuZCkge1xuICAgIGNvbnN0IGlkID0gZ2V0UmVuZGVyQ29tbWFuZElkKGNvbW1hbmQpO1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuX2V4ZWN1dGVkQ29tbWFuZHNDYWNoZS5nZXQoaWQpO1xuXG4gICAgaWYgKCFjYWNoZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FjaGVkIGNvbW1hbmQgbm90IGZvdW5kIScpO1xuICAgIH1cblxuICAgIGlmIChpc0NvbXBvbmVudFJlbmRlckNvbW1hbmQoY29tbWFuZCkpIHtcbiAgICAgIGlmICghaXNFeGVjdXRlZENvbXBvbmVudENvbW1hbmRDYWNoZUl0ZW0oY2FjaGVkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhY2hlZCBjb21tYW5kIGlzIG5vdCBhIGNvbXBvbmVudCBjb21tYW5kIScpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBjYWNoZWQuY29tcG9uZW50UmVmO1xuXG4gICAgICBpZiAoIWNvbXBvbmVudFJlZikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbXBvbmVudCByZWYgbm90IGZvdW5kIScpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl91cGRhdGVDb21wb25lbnRJbnB1dHMoY29tbWFuZCwgY29tcG9uZW50UmVmKTtcbiAgICB9XG5cbiAgICB0aGlzLl9leGVjdXRlZENvbW1hbmRzQ2FjaGUuc2V0KGlkLCB7XG4gICAgICAuLi5jYWNoZWQsXG4gICAgICBjb21tYW5kOiBjb21tYW5kIGFzIGFueSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3J1bk1vdmVJbnN0cnVjdGlvbihjb21tYW5kOiBSZW5kZXJDb21tYW5kKSB7XG4gICAgY29uc3QgaWQgPSBnZXRSZW5kZXJDb21tYW5kSWQoY29tbWFuZCk7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5fZXhlY3V0ZWRDb21tYW5kc0NhY2hlLmdldChpZCk7XG5cbiAgICBpZiAoIWNhY2hlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWNoZWQgY29tbWFuZCBub3QgZm91bmQhJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzQ29tcG9uZW50UmVuZGVyQ29tbWFuZChjb21tYW5kKSkge1xuICAgICAgaWYgKCFpc0V4ZWN1dGVkQ29tcG9uZW50Q29tbWFuZENhY2hlSXRlbShjYWNoZWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FjaGVkIGNvbW1hbmQgaXMgbm90IGEgY29tcG9uZW50IGNvbW1hbmQhJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IGNhY2hlZC5jb21wb25lbnRSZWY7XG5cbiAgICAgIGlmICghY29tcG9uZW50UmVmKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ29tcG9uZW50IHJlZiBub3QgZm91bmQhJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJvb3ROb2RlID0gY2FjaGVkLmVsZW1lbnQ7XG4gICAgICBjb25zdCBvbGRQYXJlbnRFbGVtZW50ID0gY2FjaGVkLmVsZW1lbnQucGFyZW50RWxlbWVudDtcblxuICAgICAgdGhpcy5fcmVuZGVyZXIucmVtb3ZlQ2hpbGQob2xkUGFyZW50RWxlbWVudCwgcm9vdE5vZGUpO1xuXG4gICAgICBjb25zdCBuZXdQYXJlbnRFbGVtZW50ID0gdGhpcy5fZmluZFBhcmVudChjb21tYW5kKTtcbiAgICAgIGNvbnN0IG5leHRFbGVtZW50ID0gdGhpcy5fZmluZEZvbGxvd2luZ0VsZW1lbnQoY29tbWFuZCk7XG5cbiAgICAgIHRoaXMuX3JlbmRlckluc2VydE9yQXBwZW5kKHJvb3ROb2RlLCBuZXdQYXJlbnRFbGVtZW50LCBuZXh0RWxlbWVudCk7XG5cbiAgICAgIHRoaXMuX3VwZGF0ZUNvbXBvbmVudElucHV0cyhjb21tYW5kLCBjb21wb25lbnRSZWYpO1xuXG4gICAgICB0aGlzLl9leGVjdXRlZENvbW1hbmRzQ2FjaGUuc2V0KGlkLCB7XG4gICAgICAgIC4uLmNhY2hlZCxcbiAgICAgICAgY29tbWFuZDogY29tbWFuZCBhcyBhbnksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9ydW5EZWxldGVJbnN0cnVjdGlvbihjb21tYW5kOiBSZW5kZXJDb21tYW5kKSB7XG4gICAgY29uc3QgaWQgPSBnZXRSZW5kZXJDb21tYW5kSWQoY29tbWFuZCk7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5fZXhlY3V0ZWRDb21tYW5kc0NhY2hlLmdldChpZCk7XG5cbiAgICBpZiAoIWNhY2hlZCkge1xuICAgICAgaWYgKGlzSHRtbENsb3NlUmVuZGVyQ29tbWFuZChjb21tYW5kKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FjaGVkIGNvbW1hbmQgbm90IGZvdW5kIScpO1xuICAgIH1cblxuICAgIGlmIChpc0NvbXBvbmVudFJlbmRlckNvbW1hbmQoY29tbWFuZCkpIHtcbiAgICAgIGlmICghaXNFeGVjdXRlZENvbXBvbmVudENvbW1hbmRDYWNoZUl0ZW0oY2FjaGVkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhY2hlZCBjb21tYW5kIGlzIG5vdCBhIGNvbXBvbmVudCBjb21tYW5kIScpO1xuICAgICAgfVxuXG4gICAgICBjYWNoZWQuY29tcG9uZW50UmVmPy5kZXN0cm95KCk7XG4gICAgfSBlbHNlIGlmIChpc1RleHRSZW5kZXJDb21tYW5kKGNvbW1hbmQpKSB7XG4gICAgICB0aGlzLl9yZW5kZXJlci5yZW1vdmVDaGlsZChjYWNoZWQuZWxlbWVudD8ucGFyZW50RWxlbWVudCwgY2FjaGVkLmVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAoaXNIdG1sT3BlblJlbmRlckNvbW1hbmQoY29tbWFuZCkpIHtcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnJlbW92ZUNoaWxkKGNhY2hlZC5lbGVtZW50Py5wYXJlbnRFbGVtZW50LCBjYWNoZWQuZWxlbWVudCk7XG4gICAgfVxuXG4gICAgdGhpcy5fZXhlY3V0ZWRDb21tYW5kc0NhY2hlLmRlbGV0ZShpZCk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRDb21wb25lbnRSb290Tm9kZShjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxhbnk+KTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiAoY29tcG9uZW50UmVmLmhvc3RWaWV3IGFzIEVtYmVkZGVkVmlld1JlZjxhbnk+KS5yb290Tm9kZXNbMF0gYXMgSFRNTEVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVDb21wb25lbnRJbnB1dHMoY29tbWFuZDogQ29tcG9uZW50UmVuZGVyQ29tbWFuZCwgY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8YW55Pikge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNvbW1hbmRbQ09NUE9ORU5UX1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLklOUFVUU10pKSB7XG4gICAgICBpZiAoIWNvbXBvbmVudFJlZi5pbnN0YW5jZVtrZXldKSBjb250aW51ZTtcblxuICAgICAgY29tcG9uZW50UmVmLnNldElucHV0KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmRQYXJlbnQoY29tbWFuZDogUmVuZGVyQ29tbWFuZCkge1xuICAgIGNvbnN0IGhvc3RFbGVtZW50ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IG5lc3RpbmdMZXZlbCA9IGNvbW1hbmRbUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uTkVTVElOR19MRVZFTF07XG4gICAgbGV0IHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKG5lc3RpbmdMZXZlbCA9PT0gMCkge1xuICAgICAgcGFyZW50RWxlbWVudCA9IGhvc3RFbGVtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXZlcnNlIHNlYXJjaCBhbGwgcmVuZGVyIGNvbW1hbmRzIGJlZ2lubmluZyBmcm9tIHRoZSBjdXJyZW50IG9uZSB1c2luZyBhIGZvciBsb29wLlxuICAgICAgLy8gVGhlIHBhcmVudCBpcyBmb3VuZCB3aGVuIHRoZSBjb21tYW5kJ3MgbmVzdGluZyBsZXZlbCBpc3QgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgbmVzdGluZyBsZXZlbCBtaW51cyAxLlxuICAgICAgLy8gSWYgdGhlIHBhcmVudCBpcyBub3QgZm91bmQsIHRocm93IGFuIGVycm9yLlxuICAgICAgY29uc3QgYWxsQ29tbWFuZHMgPSB0aGlzLnJlbmRlckNvbW1hbmRzKCk7XG4gICAgICBjb25zdCBjdXJyZW50Q29tbWFuZEluZGV4ID0gY29tbWFuZFtSRU5ERVJfQ09NTUFORF9QT1NJVElPTi5JTkRFWF07XG5cbiAgICAgIGxldCBwYXJlbnRDb21tYW5kOiBSZW5kZXJDb21tYW5kIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgIGZvciAobGV0IGkgPSBjdXJyZW50Q29tbWFuZEluZGV4IC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgY21kID0gYWxsQ29tbWFuZHNbaV07XG5cbiAgICAgICAgaWYgKCFjbWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbW1hbmQgbm90IGZvdW5kIScpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNtZFtSRU5ERVJfQ09NTUFORF9QT1NJVElPTi5ORVNUSU5HX0xFVkVMXSA9PT0gbmVzdGluZ0xldmVsIC0gMSkge1xuICAgICAgICAgIHBhcmVudENvbW1hbmQgPSBjbWQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFwYXJlbnRDb21tYW5kKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUGFyZW50IGNvbW1hbmQgbm90IGZvdW5kIScpO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnRFbGVtZW50ID0gdGhpcy5fZXhlY3V0ZWRDb21tYW5kc0NhY2hlLmdldChnZXRSZW5kZXJDb21tYW5kSWQocGFyZW50Q29tbWFuZCkpPy5lbGVtZW50O1xuICAgIH1cblxuICAgIGlmICghcGFyZW50RWxlbWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJlbnQgZWxlbWVudCBub3QgZm91bmQhJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmVudEVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIF9maW5kRm9sbG93aW5nRWxlbWVudChjb21tYW5kOiBSZW5kZXJDb21tYW5kKSB7XG4gICAgY29uc3QgY2FjaGVBcnJheSA9IEFycmF5LmZyb20odGhpcy5fZXhlY3V0ZWRDb21tYW5kc0NhY2hlLnZhbHVlcygpKTtcbiAgICBsZXQgbmV4dEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgZG9tUG9zaXRpb24gPSBjb21tYW5kW1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLkRPTV9QT1NJVElPTl07XG4gICAgY29uc3QgbmVzdGluZ0xldmVsID0gY29tbWFuZFtSRU5ERVJfQ09NTUFORF9QT1NJVElPTi5ORVNUSU5HX0xFVkVMXTtcbiAgICBjb25zdCB0eXBlID0gY29tbWFuZFtSRU5ERVJfQ09NTUFORF9QT1NJVElPTi5UWVBFXTtcblxuICAgIC8vICBUcnkgdG8gZmluZCBhbiBhbHJlYWR5IHJlbmRlcmVkIGVsZW1lbnQgd2l0aCBhIGRvbVBvc2l0aW9uIHRoYXQgaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IGRvbVBvc2l0aW9uLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUsIHVzZSB0aGUgb25lIHdpdGggdGhlIHNtYWxsZXN0IGRvbVBvc2l0aW9uLlxuICAgIC8vIElmIGl0IGRvZXMgbm90IGV4aXN0LCB1c2UgLmFwcGVuZENoaWxkIHRvIHNpbXBseSBhcHBlbmQgdGhlIGVsZW1lbnQgdG8gdGhlIGVuZCBvZiB0aGUgcGFyZW50IGVsZW1lbnQuXG4gICAgLy8gSWYgaXQgZG9lcyBleGlzdCwgdXNlIC5pbnNlcnRCZWZvcmUgdG8gaW5zZXJ0IHRoZSBlbGVtZW50IGJlZm9yZSB0aGUgZm91bmQgZWxlbWVudC5cbiAgICBmb3IgKGNvbnN0IGNhY2hlZCBvZiBjYWNoZUFycmF5KSB7XG4gICAgICBpZiAoXG4gICAgICAgIGNhY2hlZC5jb21tYW5kW1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLkRPTV9QT1NJVElPTl0gPiBkb21Qb3NpdGlvbiAmJlxuICAgICAgICBjYWNoZWQuY29tbWFuZFtSRU5ERVJfQ09NTUFORF9QT1NJVElPTi5ORVNUSU5HX0xFVkVMXSA9PT0gbmVzdGluZ0xldmVsICYmXG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZWxlbWVudCBkb2VzIG5vdCBmaW5kIGl0c2VsZlxuICAgICAgICBjYWNoZWQuY29tbWFuZFtSRU5ERVJfQ09NTUFORF9QT1NJVElPTi5UWVBFXSAhPT0gdHlwZVxuICAgICAgKSB7XG4gICAgICAgIG5leHRFbGVtZW50ID0gY2FjaGVkLmVsZW1lbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXh0RWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlckluc2VydE9yQXBwZW5kKFxuICAgIG5vZGVUb1JlbmRlcjogSFRNTEVsZW1lbnQsXG4gICAgcGFyZW50RWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgbmV4dEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICBpZiAobmV4dEVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX3JlbmRlcmVyLmluc2VydEJlZm9yZShwYXJlbnRFbGVtZW50LCBub2RlVG9SZW5kZXIsIG5leHRFbGVtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmVuZGVyZXIuYXBwZW5kQ2hpbGQocGFyZW50RWxlbWVudCwgbm9kZVRvUmVuZGVyKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9kZWJ1Z1Zpc3VhbGl6ZVJlbmRlckNvbW1hbmRzKGNvbW1hbmRzOiBSZW5kZXJDb21tYW5kW10pIHtcbiAgICBjb25zdCBkZWJ1ZyA9IGNvbW1hbmRzLm1hcCgoY29tbWFuZCkgPT4gdGhpcy5fc3RyaW5naWZ5UmVuZGVyQ29tbWFuZChjb21tYW5kKSkuZmxhdCgpO1xuXG4gICAgY29uc3QgcHJldHRpZmllZCA9IGZvcm1hdEhUTUwoZGVidWcpO1xuXG4gICAgcmV0dXJuIHByZXR0aWZpZWQ7XG4gIH1cblxuICBwcml2YXRlIF9zdHJpbmdpZnlSZW5kZXJDb21tYW5kKGNvbW1hbmQ6IFJlbmRlckNvbW1hbmQpIHtcbiAgICBjb25zdCBuZXN0QXR0ciA9IGBuZXN0PVwiJHtjb21tYW5kW1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLk5FU1RJTkdfTEVWRUxdfVwiYDtcbiAgICBjb25zdCBkb21BdHRyID0gYGRvbT1cIiR7Y29tbWFuZFtSRU5ERVJfQ09NTUFORF9QT1NJVElPTi5ET01fUE9TSVRJT05dfVwiYDtcblxuICAgIGlmIChpc0h0bWxPcGVuUmVuZGVyQ29tbWFuZChjb21tYW5kKSkge1xuICAgICAgcmV0dXJuIGA8JHtjb21tYW5kW0hUTUxfT1BFTl9SRU5ERVJfQ09NTUFORF9QT1NJVElPTi5UQUdfTkFNRV19ICR7bmVzdEF0dHJ9ICR7ZG9tQXR0cn0+YDtcbiAgICB9IGVsc2UgaWYgKGlzSHRtbENsb3NlUmVuZGVyQ29tbWFuZChjb21tYW5kKSkge1xuICAgICAgcmV0dXJuIGA8LyR7Y29tbWFuZFtIVE1MX0NMT1NFX1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLlRBR19OQU1FXX0gJHtuZXN0QXR0cn0gJHtkb21BdHRyfT5gO1xuICAgIH0gZWxzZSBpZiAoaXNUZXh0UmVuZGVyQ29tbWFuZChjb21tYW5kKSkge1xuICAgICAgcmV0dXJuIFtgPHNwYW4gJHtuZXN0QXR0cn0gJHtkb21BdHRyfT5gLCBjb21tYW5kW1RFWFRfUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uVEVYVF0sICc8L3NwYW4+J107XG4gICAgfSBlbHNlIGlmIChpc0NvbXBvbmVudFJlbmRlckNvbW1hbmQoY29tbWFuZCkpIHtcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gY29tbWFuZFtDT01QT05FTlRfUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uQ09NUE9ORU5UX1RZUEVdO1xuICAgICAgcmV0dXJuIFtgPCR7c2VsZWN0b3J9ICR7bmVzdEF0dHJ9ICR7ZG9tQXR0cn0+YCwgYDwvJHtzZWxlY3Rvcn0+YF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnVU5LTk9XTic7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc3RyaW5naWZ5UmVuZGVySW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb246IFJlbmRlckluc3RydWN0aW9uKSB7XG4gICAgY29uc3QgdHlwZSA9IGluc3RydWN0aW9uW1JFTkRFUl9JTlNUUlVDVElPTl9QT1NJVElPTi5UWVBFXTtcbiAgICBjb25zdCB0cmFuc2xhdGVkVHlwZSA9IE9iamVjdC5lbnRyaWVzKFJFTkRFUl9JTlNUUlVDVElPTl9UWVBFKS5maW5kKChbLCB2YWx1ZV0pID0+IHZhbHVlID09PSB0eXBlKT8uWzBdO1xuXG4gICAgY29uc3QgY29tbWFuZCA9IHRoaXMuX3N0cmluZ2lmeVJlbmRlckNvbW1hbmQoaW5zdHJ1Y3Rpb25bUkVOREVSX0lOU1RSVUNUSU9OX1BPU0lUSU9OLkNPTU1BTkRdKTtcblxuICAgIHJldHVybiBgJHt0cmFuc2xhdGVkVHlwZX06ICR7Y29tbWFuZH1gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEhUTUwoaHRtbDogc3RyaW5nW10pIHtcbiAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgaW5kZW50ID0gMDtcblxuICBmb3IgKGNvbnN0IHRhZyBvZiBodG1sKSB7XG4gICAgaWYgKHRhZy5zdGFydHNXaXRoKCc8LycpKSB7XG4gICAgICBpbmRlbnQtLTtcbiAgICB9XG5cbiAgICByZXN1bHQucHVzaCgnICcucmVwZWF0KGluZGVudCAqIDIpICsgdGFnKTtcblxuICAgIGlmICh0YWcuc3RhcnRzV2l0aCgnPCcpICYmICF0YWcuc3RhcnRzV2l0aCgnPC8nKSkge1xuICAgICAgaW5kZW50Kys7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdC5qb2luKCdcXG4nKTtcbn1cbiJdfQ==
753
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmljaC10ZXh0LXJlbmRlcmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29udGVudGZ1bC9zcmMvbGliL2NvbXBvbmVudHMvcmljaC10ZXh0LXJlbmRlcmVyL3JpY2gtdGV4dC1yZW5kZXJlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUVULFVBQVUsRUFFVixTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQixRQUFRLEVBQ1IsTUFBTSxFQUNOLEtBQUssRUFDTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN4RixPQUFPLEVBQUUsTUFBTSxFQUFTLE9BQU8sRUFBc0IsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVELE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQVF6RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN2RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7QUFFckcsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUc7SUFDakMsU0FBUyxFQUFFLENBQUM7SUFDWixVQUFVLEVBQUUsQ0FBQztJQUNiLElBQUksRUFBRSxDQUFDO0lBQ1AsU0FBUyxFQUFFLENBQUM7Q0FDSixDQUFDO0FBRVgsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUc7SUFDckMsSUFBSSxFQUFFLENBQUM7SUFDUCxhQUFhLEVBQUUsQ0FBQztJQUNoQixZQUFZLEVBQUUsQ0FBQztJQUNmLEtBQUssRUFBRSxDQUFDO0NBQ0EsQ0FBQztBQUVYLE1BQU0sQ0FBQyxNQUFNLGlDQUFpQyxHQUFHO0lBQy9DLFVBQVUsRUFBRSxDQUFDO0lBQ2IsUUFBUSxFQUFFLENBQUM7SUFDWCxVQUFVLEVBQUUsQ0FBQztDQUNMLENBQUM7QUFFWCxNQUFNLENBQUMsTUFBTSxrQ0FBa0MsR0FBRztJQUNoRCxRQUFRLEVBQUUsQ0FBQztJQUNYLFVBQVUsRUFBRSxDQUFDO0NBQ0wsQ0FBQztBQUVYLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFHO0lBQzFDLElBQUksRUFBRSxDQUFDO0NBQ0MsQ0FBQztBQUVYLE1BQU0sQ0FBQyxNQUFNLGlDQUFpQyxHQUFHO0lBQy9DLFVBQVUsRUFBRSxDQUFDO0lBQ2IsU0FBUyxFQUFFLENBQUM7SUFDWixNQUFNLEVBQUUsQ0FBQztJQUNULGNBQWMsRUFBRSxDQUFDO0NBQ1QsQ0FBQztBQTBDWCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRztJQUN6QyxJQUFJLEVBQUUsQ0FBQztJQUNQLE9BQU8sRUFBRSxDQUFDO0NBQ0YsQ0FBQztBQUVYLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHO0lBQ3JDLE1BQU0sRUFBRSxDQUFDO0lBQ1QsTUFBTSxFQUFFLENBQUM7SUFDVCxNQUFNLEVBQUUsQ0FBQztJQUNULElBQUksRUFBRSxDQUFDO0NBQ0MsQ0FBQztBQU1YLE1BQU0saUJBQWlCLEdBQTJCO0lBQ2hELElBQUksRUFBRSxXQUFXO0lBQ2pCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLElBQUksRUFBRSxXQUFXO0NBQ2xCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRTtJQUM1QyxNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUM7SUFFN0IsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLEtBQUssR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFekMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsT0FBTyxDQUFDLElBQUksQ0FBQyxrREFBa0QsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRXBGLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3BCLENBQUM7UUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0IsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxPQUFzQixFQUFvQyxFQUFFO0lBQ2xHLE9BQU8sT0FBTyxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxLQUFLLG1CQUFtQixDQUFDLFNBQVMsQ0FBQztBQUNqRixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLE9BQXNCLEVBQXFDLEVBQUU7SUFDcEcsT0FBTyxPQUFPLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLEtBQUssbUJBQW1CLENBQUMsVUFBVSxDQUFDO0FBQ2xGLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsT0FBc0IsRUFBZ0MsRUFBRTtJQUMxRixPQUFPLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxtQkFBbUIsQ0FBQyxJQUFJLENBQUM7QUFDNUUsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxPQUFzQixFQUFxQyxFQUFFO0lBQ3BHLE9BQU8sT0FBTyxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxLQUFLLG1CQUFtQixDQUFDLFNBQVMsQ0FBQztBQUNqRixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLE9BQXNCLEVBQUUsRUFBRTtJQUMzRCxJQUFJLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDckMsT0FBTyxPQUFPLENBQUMsaUNBQWlDLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDL0QsQ0FBQztTQUFNLElBQUksd0JBQXdCLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUM3QyxPQUFPLE9BQU8sQ0FBQyxrQ0FBa0MsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNoRSxDQUFDO1NBQU0sSUFBSSxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3hDLE9BQU8sT0FBTyxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BELENBQUM7U0FBTSxDQUFDO1FBQ04sT0FBTyxPQUFPLENBQUMsaUNBQWlDLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDbkUsQ0FBQztBQUNILENBQUMsQ0FBQztBQUVGLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQztBQUMzQixNQUFNLHVCQUF1QixHQUFHO0lBQzlCLEtBQUssRUFBRSxjQUFjO0lBQ3JCLEtBQUssRUFBRSxjQUFjO0lBQ3JCLEtBQUssRUFBRSxjQUFjO0lBQ3JCLElBQUksRUFBRSxhQUFhO0NBQ3BCLENBQUM7QUF5QkYsTUFBTSxDQUFDLE1BQU0sbUNBQW1DLEdBQUcsQ0FDakQsS0FBK0IsRUFDYSxFQUFFO0lBQzlDLE9BQU8sd0JBQXdCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2pELENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG9DQUFvQyxHQUFHLENBQ2xELEtBQStCLEVBQ1EsRUFBRTtJQUN6QyxPQUFPLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDM0YsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsQ0FDNUMsS0FBK0IsRUFDUSxFQUFFO0lBQ3pDLE9BQU8sbUJBQW1CLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzVDLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLDJDQUEyQyxHQUFHLGlEQUFpRCxDQUFDO0FBa0Q3RyxNQUFNLE9BQU8sbUNBQW1DO0lBb085QztRQW5PQSxzQkFBaUIsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM3QyxjQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlCLGdCQUFXLEdBQUcsTUFBTSxDQUEwQixVQUFVLENBQUMsQ0FBQztRQUMxRCxjQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdCLFlBQU8sR0FBRyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxzQkFBc0IsRUFBRSxDQUFDO1FBRXBGOzs7O1dBSUc7UUFDSCwyQkFBc0IsR0FBRyxJQUFJLEdBQUcsRUFBb0MsQ0FBQztRQUVyRTs7O1dBR0c7UUFDSCxZQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBMkMsQ0FBQztRQUVwRTs7O1dBR0c7UUFDSCxpQkFBWSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQVUsQ0FBQztRQUV4Qzs7O1dBR0c7UUFDSCx1QkFBa0IsR0FBRyxRQUFRLENBQXVCLEdBQUcsRUFBRTtZQUN2RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDL0IsTUFBTSxNQUFNLEdBQUcsT0FBTyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDdkMsTUFBTSxPQUFPLEdBQUcsT0FBTyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFFeEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzlFLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUUvRSw4REFBOEQ7WUFDOUQsTUFBTSxRQUFRLEdBQUcsQ0FBbUMsRUFBVSxFQUFFLGFBQXFCLEVBQUUsRUFBRTtnQkFDdkYsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFFL0IsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUNYLElBQUksU0FBUyxFQUFFLEVBQUUsQ0FBQzt3QkFDaEIsT0FBTyxDQUFDLElBQUksQ0FBQyx1RUFBdUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO29CQUMxRyxDQUFDO29CQUVELE9BQU8sSUFBSSxDQUFDO2dCQUNkLENBQUM7Z0JBRUQsSUFBSSxhQUFhLEtBQUssMkNBQTJDLEVBQUUsQ0FBQztvQkFDbEUsT0FBTyxLQUEyQixDQUFDO2dCQUNyQyxDQUFDO2dCQUVELElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxhQUFhLEVBQUUsQ0FBQztvQkFDbkQsSUFBSSxTQUFTLEVBQUUsRUFBRSxDQUFDO3dCQUNoQixPQUFPLENBQUMsSUFBSSxDQUFDLG9FQUFvRSxFQUFFOzRCQUNqRixLQUFLOzRCQUNMLEtBQUssRUFBRSxhQUFhO3lCQUNyQixDQUFDLENBQUM7b0JBQ0wsQ0FBQztvQkFFRCxPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDO2dCQUVELE9BQU8sS0FBMkIsQ0FBQztZQUNyQyxDQUFDLENBQUM7WUFFRiw4REFBOEQ7WUFDOUQsTUFBTSxVQUFVLEdBQUcsQ0FDakIsR0FBeUMsRUFDekMsYUFBcUIsRUFDckIsRUFBRTtnQkFDRixNQUFNLE9BQU8sR0FBRyxHQUFHO3FCQUNoQixHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7cUJBQ3RELEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFJLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQztxQkFDM0MsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUErQixFQUFFLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDO2dCQUVsRSxPQUFPLE9BQU8sQ0FBQztZQUNqQixDQUFDLENBQUM7WUFFRixNQUFNLFFBQVEsR0FBRyxDQUFDLEVBQVUsRUFBRSxFQUFFO2dCQUM5QixPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDO1lBQ2xDLENBQUMsQ0FBQztZQUVGLE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBYSxFQUFFLEVBQUU7Z0JBQ2xDLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUE0QixFQUFFLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDO1lBQ25HLENBQUMsQ0FBQztZQUVGLE9BQU87Z0JBQ0wsUUFBUTtnQkFDUixVQUFVO2dCQUNWLFFBQVE7Z0JBQ1IsU0FBUzthQUNWLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVIOztXQUVHO1FBQ0gsaUJBQVksR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQzNCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMvQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFekMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNiLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUVELE1BQU0sUUFBUSxHQUFHLGlCQUFpQixDQUFDLE9BQTZDLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFFaEcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUN4QixNQUFNLHFCQUFxQixDQUFDLHFCQUFxQixFQUFFLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZGLENBQUM7WUFFRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDbEMsTUFBTSxxQkFBcUIsQ0FBQyxzQkFBc0IsRUFBRSxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUN4RixDQUFDO1lBRUQsT0FBTyxRQUE0QixDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBRUgsbUJBQWMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQzdCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUV6QyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ2xCLE9BQU8sRUFBRSxDQUFDO1lBQ1osQ0FBQztZQUVELE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2xELENBQUMsQ0FBQyxDQUFDO1FBRUgseUJBQW9CLEdBQUcsUUFBUSxDQUM3QixZQUFZLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBcUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQ3BGLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQzNCLENBQUM7UUFFRiw2QkFBd0IsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ3ZDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUVuRCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBa0MsQ0FBQztZQUV0RCxLQUFLLE1BQU0sT0FBTyxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNuQyxHQUFHLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELENBQUM7WUFFRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsQ0FBQyxDQUFDO1FBRUgsdUJBQWtCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUNqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkMsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxDQUFDO1lBRTFFLE1BQU0sWUFBWSxHQUF3QixFQUFFLENBQUM7WUFFN0MsMERBQTBEO1lBQzFELEtBQUssTUFBTSxDQUFDLEVBQUUsT0FBTyxDQUFDLElBQUksd0JBQXdCLEVBQUUsQ0FBQztnQkFDbkQsSUFBSSx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO29CQUN0Qyw4REFBOEQ7b0JBQzlELElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEtBQUssa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDO3dCQUNoRixTQUFTO29CQUNYLENBQUM7Z0JBQ0gsQ0FBQztnQkFFRCxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsdUJBQXVCLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBRTdELGtDQUFrQztnQkFDbEMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDL0QsQ0FBQztZQUVELHdHQUF3RztZQUN4RyxNQUFNLG9CQUFvQixHQUFzRSxFQUFFLENBQUM7WUFDbkcsS0FBSyxNQUFNLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxJQUFJLHdCQUF3QixFQUFFLENBQUM7Z0JBQ3JELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUN0RSxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFFLENBQUM7Z0JBRXBDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztnQkFDeEMsQ0FBQztnQkFFRCxvQkFBb0IsQ0FBQyxJQUFJLENBQUM7b0JBQ3hCLFFBQVEsRUFBRSxLQUFLO29CQUNmLFNBQVMsRUFBRSxPQUFPLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDO29CQUNqRCxPQUFPLEVBQUUsVUFBVTtpQkFDcEIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUVELG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRTdELGdEQUFnRDtZQUNoRCwrREFBK0Q7WUFDL0QsOERBQThEO1lBQzlELElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQztZQUN2QixPQUFPLGNBQWMsR0FBRyxvQkFBb0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hELE1BQU0sUUFBUSxHQUFHLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUN0RCxNQUFNLFFBQVEsR0FBRyxvQkFBb0IsQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBRTFELElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDM0IsTUFBTTtnQkFDUixDQUFDO2dCQUVELElBQUksUUFBUSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQzVDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxjQUFjLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNuRCxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUN0RSxDQUFDO3FCQUFNLENBQUM7b0JBQ04sWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztvQkFDdEUsY0FBYyxFQUFFLENBQUM7Z0JBQ25CLENBQUM7WUFDSCxDQUFDO1lBRUQsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDL0IsTUFBTSxFQUFFLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRXZDLElBQUksd0JBQXdCLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztvQkFDdEMsTUFBTSxlQUFlLEdBQUcsd0JBQXdCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUV6RCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7d0JBQ3JCLFNBQVM7d0JBQ1QsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO29CQUMvRCxDQUFDO2dCQUNILENBQUM7cUJBQU0sQ0FBQztvQkFDTixTQUFTO29CQUNULFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDL0QsQ0FBQztZQUNILENBQUM7WUFFRCxPQUFPLFlBQVksQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztRQUdELFlBQVksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUM7YUFDbEMsSUFBSSxDQUNILGtCQUFrQixFQUFFLEVBQ3BCLEdBQUcsQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFO1lBQ25CLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN2QyxDQUFDLENBQUMsQ0FDSDthQUNBLFNBQVMsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxZQUE4QjtRQUMxRCxrQ0FBa0M7UUFDbEMsTUFBTSxZQUFZLEdBQW9CLEVBQUUsQ0FBQztRQUV6QyxzREFBc0Q7UUFDdEQsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBRWxCLG1EQUFtRDtRQUNuRCxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztRQUVqRCw2Q0FBNkM7UUFDN0MsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBRXJCLHVFQUF1RTtRQUN2RSxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFFcEIsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBRXJCLE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBMkIsRUFBRSxTQUErQixJQUFJLEVBQUUsRUFBRTtZQUNwRixRQUFRLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDdEIsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDO29CQUNaLGVBQWU7b0JBQ2YsTUFBTSxJQUFJLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDO29CQUN0QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO29CQUV4QixJQUFJLENBQUMsSUFBSTt3QkFBRSxNQUFNO29CQUVqQixNQUFNLE9BQU8sR0FBc0IsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFFM0YsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDM0IsV0FBVyxFQUFFLENBQUM7b0JBRWQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO3dCQUNaLE1BQU0scUJBQXFCLENBQUMsdUJBQXVCLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDeEUsQ0FBQztvQkFDRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO3dCQUMxRSxNQUFNLHFCQUFxQixDQUFDLHdCQUF3QixFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO29CQUNqRixDQUFDO29CQUVELE1BQU0sa0JBQWtCLEdBQ3RCLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxtQkFBbUIsQ0FBQyxTQUFTO3dCQUNwRSxDQUFDLENBQUMsaUNBQWlDLENBQUMsVUFBVTt3QkFDOUMsQ0FBQyxDQUFDLGlDQUFpQyxDQUFDLFVBQVUsQ0FBQztvQkFFbkQsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7b0JBRTlDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQzt3QkFDdEIsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFFN0MsSUFBSSxVQUFVLElBQUksVUFBVSxFQUFFLENBQUM7NEJBQzdCLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLFdBQVcsRUFBRSxDQUFDO3dCQUM5QyxDQUFDOzZCQUFNLENBQUM7NEJBQ04sVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLFdBQVcsQ0FBQzt3QkFDdkMsQ0FBQztvQkFDSCxDQUFDO29CQUVELE1BQU07Z0JBQ1IsQ0FBQztnQkFFRCxLQUFLLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO29CQUMzQixlQUFlO29CQUNmLE1BQU0sSUFBSSxHQUFHLG1CQUFtQixDQUFDLFNBQVMsQ0FBQztvQkFDM0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO29CQUU3QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ2IsTUFBTSxxQkFBcUIsQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUNyRSxDQUFDO29CQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFFMUQsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUNYLE1BQU0scUJBQXFCLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQzNFLENBQUM7b0JBRUQsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO29CQUNsRCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztvQkFFaEQsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDakQsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDakQsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFFakQsTUFBTSxTQUFTLEdBQUcsT0FBTzt3QkFDdkIsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxLQUFLO3dCQUN2QixDQUFDLENBQUMsT0FBTzs0QkFDUCxDQUFDLENBQUMsZUFBZSxDQUFDLEtBQUs7NEJBQ3ZCLENBQUMsQ0FBQyxPQUFPO2dDQUNQLENBQUMsQ0FBQyxlQUFlLENBQUMsS0FBSztnQ0FDdkIsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7b0JBRTdCLE1BQU0sYUFBYSxHQUFHLE9BQU87d0JBQzNCLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLO3dCQUMvQixDQUFDLENBQUMsT0FBTzs0QkFDUCxDQUFDLENBQUMsdUJBQXVCLENBQUMsS0FBSzs0QkFDL0IsQ0FBQyxDQUFDLE9BQU87Z0NBQ1AsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLEtBQUs7Z0NBQy9CLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUM7b0JBRXJDLElBQUksV0FBVyxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7b0JBQzFELE1BQU0sRUFBRSxHQUFHLGFBQWEsR0FBRyxFQUFFLFdBQVcsQ0FBQztvQkFDekMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUM7b0JBRS9DLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQztvQkFFdEIsTUFBTSxNQUFNLEdBQUc7d0JBQ2IsS0FBSztxQkFDTixDQUFDO29CQUVGLE1BQU0sT0FBTyxHQUEyQjt3QkFDdEMsSUFBSTt3QkFDSixZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsWUFBWSxFQUFFO3dCQUNkLFVBQVU7d0JBQ1YsU0FBUzt3QkFDVCxNQUFNO3dCQUNOLEVBQUU7cUJBQ0gsQ0FBQztvQkFFRixZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUUzQixXQUFXLEVBQUUsQ0FBQztvQkFFZCxNQUFNO2dCQUNSLENBQUM7Z0JBRUQsS0FBSyxNQUFNLENBQUMsY0FBYyxDQUFDO2dCQUMzQixLQUFLLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO29CQUM1QixtQkFBbUI7b0JBQ25CLE1BQU0sSUFBSSxHQUFHLG1CQUFtQixDQUFDLFNBQVMsQ0FBQztvQkFDM0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO29CQUU3QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ2IsTUFBTSxxQkFBcUIsQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUNyRSxDQUFDO29CQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsMkNBQTJDLENBQUMsQ0FBQztvQkFFdkcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUNYLE1BQU0scUJBQXFCLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQzNFLENBQUM7b0JBRUQsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFFbkQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFFL0QsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO3dCQUNmLE1BQU0scUJBQXFCLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxFQUFFOzRCQUMvRCxhQUFhOzRCQUNiLGdCQUFnQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCOzRCQUMvQyxLQUFLO3lCQUNOLENBQUMsQ0FBQztvQkFDTCxDQUFDO29CQUVELE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQztvQkFDdEIsSUFBSSxXQUFXLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztvQkFDMUQsTUFBTSxFQUFFLEdBQUcsYUFBYSxHQUFHLEVBQUUsV0FBVyxDQUFDO29CQUN6QyxjQUFjLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQztvQkFFL0MsTUFBTSxNQUFNLEdBQUc7d0JBQ2IsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO3dCQUNwQixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7d0JBQ3hCLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRzt3QkFDZCxRQUFRLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUFFO3FCQUNwQyxDQUFDO29CQUVGLE1BQU0sT0FBTyxHQUEyQjt3QkFDdEMsSUFBSTt3QkFDSixZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsWUFBWSxFQUFFO3dCQUNkLFVBQVU7d0JBQ1YsU0FBUzt3QkFDVCxNQUFNO3dCQUNOLEVBQUU7cUJBQ0gsQ0FBQztvQkFFRixZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUUzQixXQUFXLEVBQUUsQ0FBQztvQkFFZCxNQUFNO2dCQUNSLENBQUM7Z0JBRUQsT0FBTyxDQUFDLENBQUMsQ0FBQztvQkFDUixNQUFNLElBQUksR0FBRyxtQkFBbUIsQ0FBQyxTQUFTLENBQUM7b0JBQzNDLE1BQU0sR0FBRyxHQUFHLG9DQUFvQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDaEUsTUFBTSxVQUFVLEdBQTJCLEVBQUUsQ0FBQztvQkFDOUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxHQUFHLFNBQVMsRUFBRSxDQUFDO29CQUU3QixNQUFNLE9BQU8sR0FBMEIsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUU5RyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUUzQixNQUFNLHNCQUFzQixHQUFHLFdBQVcsQ0FBQztvQkFDM0MseUNBQXlDO29CQUN6QyxLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDakMsV0FBVyxHQUFHLENBQUMsQ0FBQzt3QkFDaEIsWUFBWSxFQUFFLENBQUM7d0JBQ2YsUUFBUSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQzt3QkFDekIsWUFBWSxFQUFFLENBQUM7d0JBQ2YsV0FBVyxHQUFHLHNCQUFzQixDQUFDO29CQUN2QyxDQUFDO29CQUVELE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUUxRCxJQUFJLFdBQVcsRUFBRSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxLQUFLLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxDQUFDO3dCQUNsRiw0RUFBNEU7d0JBQzVFLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDckIsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLE1BQU0sT0FBTyxHQUFHLEdBQUcsR0FBRyxTQUFTLEVBQUUsQ0FBQzt3QkFFbEMsTUFBTSxZQUFZLEdBQTJCOzRCQUMzQyxtQkFBbUIsQ0FBQyxVQUFVOzRCQUM5QixZQUFZOzRCQUNaLFdBQVc7NEJBQ1gsWUFBWSxFQUFFOzRCQUNkLEdBQUc7NEJBQ0gsT0FBTzt5QkFDUixDQUFDO3dCQUNGLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7d0JBRWhDLFdBQVcsRUFBRSxDQUFDO29CQUNoQixDQUFDO29CQUVELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7d0JBQ3hDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQzdCLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUM7d0JBRXpCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQzt3QkFDMUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUV2QyxJQUFJLFVBQVUsRUFBRSxDQUFDOzRCQUNmLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxRQUFRLENBQUM7d0JBQ2xDLENBQUM7b0JBQ0gsQ0FBQztvQkFFRCxNQUFNO2dCQUNSLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsS0FBSyxNQUFNLElBQUksSUFBSSxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDeEMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN2QixDQUFDO1FBRUQsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVPLGlCQUFpQixDQUFDLFlBQWlDO1FBQ3pELEtBQUssTUFBTSxXQUFXLElBQUksWUFBWSxFQUFFLENBQUM7WUFDdkMsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNELE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQywyQkFBMkIsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUVqRSxRQUFRLElBQUksRUFBRSxDQUFDO2dCQUNiLEtBQUssdUJBQXVCLENBQUMsTUFBTTtvQkFDakMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUNwQyxNQUFNO2dCQUNSLEtBQUssdUJBQXVCLENBQUMsTUFBTTtvQkFDakMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUNwQyxNQUFNO2dCQUNSLEtBQUssdUJBQXVCLENBQUMsSUFBSTtvQkFDL0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUNsQyxNQUFNO2dCQUNSLEtBQUssdUJBQXVCLENBQUMsTUFBTTtvQkFDakMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUNwQyxNQUFNO1lBQ1YsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8scUJBQXFCLENBQUMsT0FBc0I7UUFDbEQsTUFBTSxFQUFFLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFeEQsSUFBSSx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLGlDQUFpQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFFbEgsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztZQUVuRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsWUFBWSxDQUFDLENBQUM7WUFFMUQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFFakUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xDLE9BQU87Z0JBQ1AsWUFBWTtnQkFDWixPQUFPLEVBQUUsUUFBUTthQUNsQixDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sSUFBSSxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFFM0MsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFFN0QsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xDLE9BQU87Z0JBQ1AsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsUUFBUTthQUNULENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxJQUFJLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDNUMsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLGlDQUFpQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxpQ0FBaUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN6RSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVsRCxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUN0RCxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ25ELENBQUM7WUFFRCxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUVoRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRTtnQkFDbEMsT0FBTztnQkFDUCxPQUFPO2FBQ1IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxPQUFzQjtRQUNsRCxNQUFNLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRW5ELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBRUQsSUFBSSx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUNqRCxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7WUFDaEUsQ0FBQztZQUVELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7WUFFekMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7WUFDOUMsQ0FBQztZQUVELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDckQsQ0FBQztRQUVELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFO1lBQ2xDLEdBQUcsTUFBTTtZQUNULE9BQU8sRUFBRSxPQUFjO1NBQ3hCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxPQUFzQjtRQUNoRCxNQUFNLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRW5ELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBRUQsSUFBSSx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUNqRCxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7WUFDaEUsQ0FBQztZQUVELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7WUFFekMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7WUFDOUMsQ0FBQztZQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7WUFDaEMsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztZQUV0RCxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUV2RCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbkQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRXhELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFFcEUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztZQUVuRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRTtnQkFDbEMsR0FBRyxNQUFNO2dCQUNULE9BQU8sRUFBRSxPQUFjO2FBQ3hCLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRU8scUJBQXFCLENBQUMsT0FBc0I7UUFDbEQsTUFBTSxFQUFFLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVuRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixJQUFJLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ3RDLE9BQU87WUFDVCxDQUFDO1lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFFRCxJQUFJLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ2pELE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztZQUNoRSxDQUFDO1lBRUQsTUFBTSxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNqQyxDQUFDO2FBQU0sSUFBSSxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1RSxDQUFDO2FBQU0sSUFBSSx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBRUQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRU8scUJBQXFCLENBQUMsWUFBK0I7UUFDM0QsT0FBUSxZQUFZLENBQUMsUUFBaUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFnQixDQUFDO0lBQ3JGLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxPQUErQixFQUFFLFlBQStCO1FBQzdGLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQ0FBaUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDN0YsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO2dCQUFFLFNBQVM7WUFFMUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEMsQ0FBQztJQUNILENBQUM7SUFFTyxXQUFXLENBQUMsT0FBc0I7UUFDeEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUM7UUFDbkQsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLHVCQUF1QixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3BFLElBQUksYUFBYSxHQUE0QixTQUFTLENBQUM7UUFFdkQsSUFBSSxZQUFZLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkIsYUFBYSxHQUFHLFdBQVcsQ0FBQztRQUM5QixDQUFDO2FBQU0sQ0FBQztZQUNOLHNGQUFzRjtZQUN0RiwwR0FBMEc7WUFDMUcsOENBQThDO1lBQzlDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMxQyxNQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUVuRSxJQUFJLGFBQWEsR0FBeUIsSUFBSSxDQUFDO1lBRS9DLEtBQUssSUFBSSxDQUFDLEdBQUcsbUJBQW1CLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDbEQsTUFBTSxHQUFHLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUUzQixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQ1QsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2dCQUN4QyxDQUFDO2dCQUVELElBQUksR0FBRyxDQUFDLHVCQUF1QixDQUFDLGFBQWEsQ0FBQyxLQUFLLFlBQVksR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDcEUsYUFBYSxHQUFHLEdBQUcsQ0FBQztvQkFDcEIsTUFBTTtnQkFDUixDQUFDO1lBQ0gsQ0FBQztZQUVELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFFRCxhQUFhLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQztRQUM5RixDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBRUQsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUVPLHFCQUFxQixDQUFDLE9BQXNCO1FBQ2xELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDcEUsSUFBSSxXQUFXLEdBQTRCLFNBQVMsQ0FBQztRQUVyRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsdUJBQXVCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbEUsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLHVCQUF1QixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVuRCw4S0FBOEs7UUFDOUssd0dBQXdHO1FBQ3hHLHNGQUFzRjtRQUN0RixLQUFLLE1BQU0sTUFBTSxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2hDLElBQ0UsTUFBTSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxZQUFZLENBQUMsR0FBRyxXQUFXO2dCQUNsRSxNQUFNLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLGFBQWEsQ0FBQyxLQUFLLFlBQVk7Z0JBQ3RFLDZDQUE2QztnQkFDN0MsTUFBTSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQ3JELENBQUM7Z0JBQ0QsV0FBVyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7Z0JBQzdCLE1BQU07WUFDUixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFTyxxQkFBcUIsQ0FDM0IsWUFBeUIsRUFDekIsYUFBMEIsRUFDMUIsV0FBb0M7UUFFcEMsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzFELENBQUM7SUFDSCxDQUFDO0lBRU8sNkJBQTZCLENBQUMsUUFBeUI7UUFDN0QsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFdEYsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXJDLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFTyx1QkFBdUIsQ0FBQyxPQUFzQjtRQUNwRCxNQUFNLFFBQVEsR0FBRyxTQUFTLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDO1FBQzVFLE1BQU0sT0FBTyxHQUFHLFFBQVEsT0FBTyxDQUFDLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUM7UUFFekUsSUFBSSx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE9BQU8sSUFBSSxPQUFPLENBQUMsaUNBQWlDLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxJQUFJLE9BQU8sR0FBRyxDQUFDO1FBQzNGLENBQUM7YUFBTSxJQUFJLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDN0MsT0FBTyxLQUFLLE9BQU8sQ0FBQyxrQ0FBa0MsQ0FBQyxRQUFRLENBQUMsSUFBSSxRQUFRLElBQUksT0FBTyxHQUFHLENBQUM7UUFDN0YsQ0FBQzthQUFNLElBQUksbUJBQW1CLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUN4QyxPQUFPLENBQUMsU0FBUyxRQUFRLElBQUksT0FBTyxHQUFHLEVBQUUsT0FBTyxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2xHLENBQUM7YUFBTSxJQUFJLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDN0MsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLGlDQUFpQyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzNFLE9BQU8sQ0FBQyxJQUFJLFFBQVEsSUFBSSxRQUFRLElBQUksT0FBTyxHQUFHLEVBQUUsS0FBSyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztJQUNILENBQUM7SUFFTywyQkFBMkIsQ0FBQyxXQUE4QjtRQUNoRSxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0QsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFeEcsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQywyQkFBMkIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRS9GLE9BQU8sR0FBRyxjQUFjLEtBQUssT0FBTyxFQUFFLENBQUM7SUFDekMsQ0FBQzs4R0Exd0JVLG1DQUFtQztrR0FBbkMsbUNBQW1DLCthQVJwQyxFQUFFOzsyRkFRRCxtQ0FBbUM7a0JBVi9DLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGtDQUFrQztvQkFDNUMsUUFBUSxFQUFFLEVBQUU7b0JBQ1osYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7b0JBQ3JDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsSUFBSSxFQUFFO3dCQUNKLEtBQUssRUFBRSxrQ0FBa0M7cUJBQzFDO2lCQUNGOztBQTh3QkQsU0FBUyxVQUFVLENBQUMsSUFBYztJQUNoQyxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFDNUIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRWYsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN6QixNQUFNLEVBQUUsQ0FBQztRQUNYLENBQUM7UUFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBRTFDLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNqRCxNQUFNLEVBQUUsQ0FBQztRQUNYLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnRUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBDb21wb25lbnRSZWYsXG4gIEVsZW1lbnRSZWYsXG4gIEVtYmVkZGVkVmlld1JlZixcbiAgUmVuZGVyZXIyLFxuICBWaWV3Q29udGFpbmVyUmVmLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgY29tcHV0ZWQsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIGlzRGV2TW9kZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQsIHRvT2JzZXJ2YWJsZSwgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBCTE9DS1MsIEJsb2NrLCBJTkxJTkVTLCBJbmxpbmUsIE1hcmssIFRleHQgfSBmcm9tICdAY29udGVudGZ1bC9yaWNoLXRleHQtdHlwZXMnO1xuaW1wb3J0IHsgZ2V0T2JqZWN0UHJvcGVydHksIGlzT2JqZWN0IH0gZnJvbSAnQGV0aGxldGUvY29yZSc7XG5pbXBvcnQgeyBwYWlyd2lzZSwgc3RhcnRXaXRoLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENPTlRFTlRGVUxfQ09ORklHIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2NvbnRlbnRmdWwuY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIENvbnRlbnRmdWxBc3NldCxcbiAgQ29udGVudGZ1bENvbGxlY3Rpb24sXG4gIENvbnRlbnRmdWxFbnRyeSxcbiAgQ29udGVudGZ1bEVudHJ5TGlua0l0ZW0sXG4gIFJpY2hUZXh0UmVzcG9uc2UsXG59IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZUNvbnRlbnRmdWxDb25maWcgfSBmcm9tICcuLi8uLi91dGlscy9jb250ZW50ZnVsLWNvbmZpZyc7XG5pbXBvcnQgeyByaWNoVGV4dFJlbmRlcmVyRXJyb3IgfSBmcm9tICcuL3JpY2gtdGV4dC1yZW5kZXJlci5lcnJvcnMnO1xuaW1wb3J0IHsgaXNSaWNoVGV4dFJvb3ROb2RlLCB0cmFuc2xhdGVDb250ZW50ZnVsTm9kZVR5cGVUb0h0bWxUYWcgfSBmcm9tICcuL3JpY2gtdGV4dC1yZW5kZXJlci51dGlsJztcblxuZXhwb3J0IGNvbnN0IFJFTkRFUl9DT01NQU5EX1RZUEUgPSB7XG4gIEhUTUxfT1BFTjogMCxcbiAgSFRNTF9DTE9TRTogMSxcbiAgVEVYVDogMixcbiAgQ09NUE9ORU5UOiAzLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFJFTkRFUl9DT01NQU5EX1BPU0lUSU9OID0ge1xuICBUWVBFOiAwLFxuICBORVNUSU5HX0xFVkVMOiAxLFxuICBET01fUE9TSVRJT046IDIsXG4gIElOREVYOiAzLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IEhUTUxfT1BFTl9SRU5ERVJfQ09NTUFORF9QT1NJVElPTiA9IHtcbiAgQVRUUklCVVRFUzogNCxcbiAgVEFHX05BTUU6IDUsXG4gIEVMRU1FTlRfSUQ6IDYsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgSFRNTF9DTE9TRV9SRU5ERVJfQ09NTUFORF9QT1NJVElPTiA9IHtcbiAgVEFHX05BTUU6IDQsXG4gIEVMRU1FTlRfSUQ6IDUsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgVEVYVF9SRU5ERVJfQ09NTUFORF9QT1NJVElPTiA9IHtcbiAgVEVYVDogNCxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBDT01QT05FTlRfUkVOREVSX0NPTU1BTkRfUE9TSVRJT04gPSB7XG4gIEFUVFJJQlVURVM6IDQsXG4gIENPTVBPTkVOVDogNSxcbiAgSU5QVVRTOiA2LFxuICBDT01QT05FTlRfVFlQRTogNyxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgSHRtbE9wZW5SZW5kZXJDb21tYW5kID0gW1xuICB0eXBlOiB0eXBlb2YgUkVOREVSX0NPTU1BTkRfVFlQRS5IVE1MX09QRU4sXG4gIG5lc3RpbmdMZXZlbDogbnVtYmVyLFxuICBkb21Qb3NpdGlvbjogbnVtYmVyLFxuICBpbmRleDogbnVtYmVyLFxuICBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICB0YWdOYW1lOiBzdHJpbmcsXG4gIGVsZW1lbnRJZDogc3RyaW5nLFxuXTtcblxudHlwZSBIdG1sQ2xvc2VSZW5kZXJDb21tYW5kID0gW1xuICB0eXBlOiB0eXBlb2YgUkVOREVSX0NPTU1BTkRfVFlQRS5IVE1MX0NMT1NFLFxuICBuZXN0aW5nTGV2ZWw6IG51bWJlcixcbiAgZG9tUG9zaXRpb246IG51bWJlcixcbiAgaW5kZXg6IG51bWJlcixcbiAgdGFnTmFtZTogc3RyaW5nLFxuICBlbGVtZW50SWQ6IHN0cmluZyxcbl07XG5cbnR5cGUgVGV4dFJlbmRlckNvbW1hbmQgPSBbXG4gIHR5cGU6IHR5cGVvZiBSRU5ERVJfQ09NTUFORF9UWVBFLlRFWFQsXG4gIG5lc3RpbmdMZXZlbDogbnVtYmVyLFxuICBkb21Qb3NpdGlvbjogbnVtYmVyLFxuICBpbmRleDogbnVtYmVyLFxuICB0ZXh0OiBzdHJpbmcsXG5dO1xuXG50eXBlIENvbXBvbmVudFJlbmRlckNvbW1hbmQgPSBbXG4gIHR5cGU6IHR5cGVvZiBSRU5ERVJfQ09NTUFORF9UWVBFLkNPTVBPTkVOVCxcbiAgbmVzdGluZ0xldmVsOiBudW1iZXIsXG4gIGRvbVBvc2l0aW9uOiBudW1iZXIsXG4gIGluZGV4OiBudW1iZXIsXG4gIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGNvbXBvbmVudDogQ29tcG9uZW50VHlwZTx1bmtub3duPixcbiAgaW5wdXRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgY29tcG9uZW50VHlwZTogc3RyaW5nLFxuXTtcblxudHlwZSBSZW5kZXJDb21tYW5kID0gSHRtbE9wZW5SZW5kZXJDb21tYW5kIHwgSHRtbENsb3NlUmVuZGVyQ29tbWFuZCB8IFRleHRSZW5kZXJDb21tYW5kIHwgQ29tcG9uZW50UmVuZGVyQ29tbWFuZDtcblxuZXhwb3J0IGNvbnN0IFJFTkRFUl9JTlNUUlVDVElPTl9QT1NJVElPTiA9IHtcbiAgVFlQRTogMCxcbiAgQ09NTUFORDogMSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBSRU5ERVJfSU5TVFJVQ1RJT05fVFlQRSA9IHtcbiAgQ1JFQVRFOiAwLFxuICBVUERBVEU6IDEsXG4gIERFTEVURTogMixcbiAgTU9WRTogMyxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgUmVuZGVySW5zdHJ1Y3Rpb25UeXBlVmFsdWUgPSAodHlwZW9mIFJFTkRFUl9JTlNUUlVDVElPTl9UWVBFKVtrZXlvZiB0eXBlb2YgUkVOREVSX0lOU1RSVUNUSU9OX1RZUEVdO1xuXG50eXBlIFJlbmRlckluc3RydWN0aW9uID0gW1JlbmRlckluc3RydWN0aW9uVHlwZVZhbHVlLCBSZW5kZXJDb21tYW5kXTtcblxuY29uc3QgTUFSS19UQUlMV0lORF9NQVA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIGJvbGQ6ICdmb250LWJvbGQnLFxuICBpdGFsaWM6ICdpdGFsaWMnLFxuICB1bmRlcmxpbmU6ICd1bmRlcmxpbmUnLFxuICBjb2RlOiAnZm9udC1tb25vJyxcbn07XG5cbmV4cG9ydCBjb25zdCBtYXJrc1RvQ2xhc3MgPSAobWFya3M6IE1hcmtbXSkgPT4ge1xuICBjb25zdCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgbWFyayBvZiBtYXJrcykge1xuICAgIGxldCBrbGFzcyA9IE1BUktfVEFJTFdJTkRfTUFQW21hcmsudHlwZV07XG5cbiAgICBpZiAoIWtsYXNzKSB7XG4gICAgICBjb25zb2xlLndhcm4oYE5vIGNsYXNzIGZvdW5kIGZvciBtYXJrIHR5cGUhIEZhbGxpbmcgYmFjayB0byBcIiR7bWFyay50eXBlfVwiLmAsIG1hcmspO1xuXG4gICAgICBrbGFzcyA9IG1hcmsudHlwZTtcbiAgICB9XG5cbiAgICBjbGFzc2VzLnB1c2goa2xhc3MpO1xuICB9XG5cbiAgcmV0dXJuIGNsYXNzZXMuam9pbignICcpO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzSHRtbE9wZW5SZW5kZXJDb21tYW5kID0gKGNvbW1hbmQ6IFJlbmRlckNvbW1hbmQpOiBjb21tYW5kIGlzIEh0bWxPcGVuUmVuZGVyQ29tbWFuZCA9PiB7XG4gIHJldHVybiBjb21tYW5kW1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLlRZUEVdID09PSBSRU5ERVJfQ09NTUFORF9UWVBFLkhUTUxfT1BFTjtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0h0bWxDbG9zZVJlbmRlckNvbW1hbmQgPSAoY29tbWFuZDogUmVuZGVyQ29tbWFuZCk6IGNvbW1hbmQgaXMgSHRtbENsb3NlUmVuZGVyQ29tbWFuZCA9PiB7XG4gIHJldHVybiBjb21tYW5kW1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLlRZUEVdID09PSBSRU5ERVJfQ09NTUFORF9UWVBFLkhUTUxfQ0xPU0U7XG59O1xuXG5leHBvcnQgY29uc3QgaXNUZXh0UmVuZGVyQ29tbWFuZCA9IChjb21tYW5kOiBSZW5kZXJDb21tYW5kKTogY29tbWFuZCBpcyBUZXh0UmVuZGVyQ29tbWFuZCA9PiB7XG4gIHJldHVybiBjb21tYW5kW1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLlRZUEVdID09PSBSRU5ERVJfQ09NTUFORF9UWVBFLlRFWFQ7XG59O1xuXG5leHBvcnQgY29uc3QgaXNDb21wb25lbnRSZW5kZXJDb21tYW5kID0gKGNvbW1hbmQ6IFJlbmRlckNvbW1hbmQpOiBjb21tYW5kIGlzIENvbXBvbmVudFJlbmRlckNvbW1hbmQgPT4ge1xuICByZXR1cm4gY29tbWFuZFtSRU5ERVJfQ09NTUFORF9QT1NJVElPTi5UWVBFXSA9PT0gUkVOREVSX0NPTU1BTkRfVFlQRS5DT01QT05FTlQ7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVuZGVyQ29tbWFuZElkID0gKGNvbW1hbmQ6IFJlbmRlckNvbW1hbmQpID0+IHtcbiAgaWYgKGlzSHRtbE9wZW5SZW5kZXJDb21tYW5kKGNvbW1hbmQpKSB7XG4gICAgcmV0dXJuIGNvbW1hbmRbSFRNTF9PUEVOX1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLkVMRU1FTlRfSURdO1xuICB9IGVsc2UgaWYgKGlzSHRtbENsb3NlUmVuZGVyQ29tbWFuZChjb21tYW5kKSkge1xuICAgIHJldHVybiBjb21tYW5kW0hUTUxfQ0xPU0VfUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uRUxFTUVOVF9JRF07XG4gIH0gZWxzZSBpZiAoaXNUZXh0UmVuZGVyQ29tbWFuZChjb21tYW5kKSkge1xuICAgIHJldHVybiBjb21tYW5kW1RFWFRfUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uVEVYVF07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNvbW1hbmRbQ09NUE9ORU5UX1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLkNPTVBPTkVOVF9UWVBFXTtcbiAgfVxufTtcblxuY29uc3QgQ0xBU1NfQVRUUiA9ICdjbGFzcyc7XG5jb25zdCBERUZBVUxUX0NPTVBPTkVOVF9UWVBFUyA9IHtcbiAgSU1BR0U6ICckJCRfZXQtaW1hZ2UnLFxuICBWSURFTzogJyQkJF9ldC12aWRlbycsXG4gIEFVRElPOiAnJCQkX2V0LWF1ZGlvJyxcbiAgRklMRTogJyQkJF9ldC1maWxlJyxcbn07XG5cbnR5cGUgRXhlY3V0ZWRDb21tYW5kQ2FjaGVJdGVtQmFzZSA9IHtcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG59O1xuXG50eXBlIEV4ZWN1dGVkQ29tcG9uZW50Q29tbWFuZENhY2hlSXRlbSA9IHtcbiAgY29tbWFuZDogQ29tcG9uZW50UmVuZGVyQ29tbWFuZDtcbiAgY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8dW5rbm93bj47XG59ICYgRXhlY3V0ZWRDb21tYW5kQ2FjaGVJdGVtQmFzZTtcblxudHlwZSBFeGVjdXRlZEh0bWxDb21tYW5kQ2FjaGVJdGVtID0ge1xuICBjb21tYW5kOiBIdG1sT3BlblJlbmRlckNvbW1hbmQgfCBIdG1sQ2xvc2VSZW5kZXJDb21tYW5kO1xufSAmIEV4ZWN1dGVkQ29tbWFuZENhY2hlSXRlbUJhc2U7XG5cbnR5cGUgRXhlY3V0ZWRUZXh0Q29tbWFuZENhY2hlSXRlbSA9IHtcbiAgY29tbWFuZDogVGV4dFJlbmRlckNvbW1hbmQ7XG4gIHRleHROb2RlOiB1bmtub3duO1xufSAmIEV4ZWN1dGVkQ29tbWFuZENhY2hlSXRlbUJhc2U7XG5cbnR5cGUgRXhlY3V0ZWRDb21tYW5kQ2FjaGVJdGVtID1cbiAgfCBFeGVjdXRlZENvbXBvbmVudENvbW1hbmRDYWNoZUl0ZW1cbiAgfCBFeGVjdXRlZEh0bWxDb21tYW5kQ2FjaGVJdGVtXG4gIHwgRXhlY3V0ZWRUZXh0Q29tbWFuZENhY2hlSXRlbTtcblxuZXhwb3J0IGNvbnN0IGlzRXhlY3V0ZWRDb21wb25lbnRDb21tYW5kQ2FjaGVJdGVtID0gKFxuICBjYWNoZTogRXhlY3V0ZWRDb21tYW5kQ2FjaGVJdGVtLFxuKTogY2FjaGUgaXMgRXhlY3V0ZWRDb21wb25lbnRDb21tYW5kQ2FjaGVJdGVtID0+IHtcbiAgcmV0dXJuIGlzQ29tcG9uZW50UmVuZGVyQ29tbWFuZChjYWNoZS5jb21tYW5kKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0V4ZWN1dGVkSHRtbE9yVGV4dENvbW1hbmRDYWNoZUl0ZW0gPSAoXG4gIGNhY2hlOiBFeGVjdXRlZENvbW1hbmRDYWNoZUl0ZW0sXG4pOiBjYWNoZSBpcyBFeGVjdXRlZEh0bWxDb21tYW5kQ2FjaGVJdGVtID0+IHtcbiAgcmV0dXJuIGlzSHRtbENsb3NlUmVuZGVyQ29tbWFuZChjYWNoZS5jb21tYW5kKSB8fCBpc0h0bWxPcGVuUmVuZGVyQ29tbWFuZChjYWNoZS5jb21tYW5kKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0V4ZWN1dGVkVGV4dENvbW1hbmRDYWNoZUl0ZW0gPSAoXG4gIGNhY2hlOiBFeGVjdXRlZENvbW1hbmRDYWNoZUl0ZW0sXG4pOiBjYWNoZSBpcyBFeGVjdXRlZFRleHRDb21tYW5kQ2FjaGVJdGVtID0+IHtcbiAgcmV0dXJuIGlzVGV4dFJlbmRlckNvbW1hbmQoY2FjaGUuY29tbWFuZCk7XG59O1xuXG5leHBvcnQgY29uc3QgRVRfQ09OVEVOVEZVTF9BTllfRU5UUllfQ09OVEVOVF9UWVBFX1NZU19JRCA9ICckJCRfZXQtY29udGVudGZ1bC1hbnktZW50cnktY29udGVudC10eXBlLXN5cy1pZCc7XG5cbmV4cG9ydCB0eXBlIENvbnRlbnRmdWxJbmNsdWRlTWFwID0ge1xuICAvKipcbiAgICogU2VsZWN0IGFuIGVudHJ5IGJ5IGl0cyBJRCBhbmQgY29udGVudCB0eXBlIElELlxuICAgKlxuICAgKiBUaGUgY29udGVudCB0eXBlIElEIGNhbiBiZSBmb3VuZCBpbnNpZGUgdGhlIGVudHJ5IC0+IHN5cyAtPiBjb250ZW50VHlwZSAtPiBzeXMgLT4gaWQgcHJvcGVydHkuXG4gICAqXG4gICAqIFlvdSBjYW4gcHJvdmlkZSB0aGUgYEVUX0NPTlRFTlRGVUxfQU5ZX0VOVFJZX0NPTlRFTlRfVFlQRV9TWVNfSURgIGNvbnN0YW50IHRvIG1hdGNoIGFueSBlbnRyeSBzeXMgSUQuXG4gICAqIEJ1dCBiZSBhd2FyZSB0aGF0IHRoaXMgd2lsbCByZXR1cm4gdGhlIGVudHJ5IGFzIGlzIHdpdGhvdXQgYW55IHR5cGUgY2hlY2tpbmcuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBnZXRFbnRyeTogPFQgZXh0ZW5kcyB7IFtrZXk6IHN0cmluZ106IGFueSB9PihpZDogc3RyaW5nLCBjb250ZW50VHlwZUlkOiBzdHJpbmcpID0+IENvbnRlbnRmdWxFbnRyeTxUPiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNlbGVjdCBtdWx0aXBsZSBlbnRyaWVzIGJ5IHRoZWlyIElEcyBhbmQgY29udGVudCB0eXBlIElELlxuICAgKiBJZiBhbiBlbnRyeSBpcyBub3QgZm91bmQsIGl0IHdpbGwgYmUgb21pdHRlZCBmcm9tIHRoZSByZXN1bHQuXG4gICAqXG4gICAqIFRoZSBjb250ZW50IHR5cGUgSUQgY2FuIGJlIGZvdW5kIGluc2lkZSB0aGUgZW50cnkgLT4gc3lzIC0+IGNvbnRlbnRUeXBlIC0+IHN5cyAtPiBpZCBwcm9wZXJ0eS5cbiAgICpcbiAgICogWW91IGNhbiBwcm92aWRlIHRoZSBgRVRfQ09OVEVOVEZVTF9BTllfRU5UUllfQ09OVEVOVF9UWVBFX1NZU19JRGAgY29uc3RhbnQgdG8gbWF0Y2ggYW55IGVudHJ5IHN5cyBJRC5cbiAgICogQnV0IGJlIGF3YXJlIHRoYXQgdGhpcyB3aWxsIHJldHVybiB0aGUgZW50cnkgYXMgaXMgd2l0aG91dCBhbnkgdHlwZSBjaGVja2luZy5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGdldEVudHJpZXM6IDxUIGV4dGVuZHMgeyBba2V5OiBzdHJpbmddOiBhbnkgfT4oXG4gICAgaWRzOiBzdHJpbmdbXSB8IENvbnRlbnRmdWxFbnRyeUxpbmtJdGVtW10sXG4gICAgY29udGVudFR5cGVJZDogc3RyaW5nLFxuICApID0+IENvbnRlbnRmdWxFbnRyeTxUPltdO1xuXG4gIC8qKlxuICAgKiBTZWxlY3QgYW4gYXNzZXQgYnkgaXRzIElELlxuICAgKi9cbiAgZ2V0QXNzZXQ6IChpZDogc3RyaW5nKSA9PiBDb250ZW50ZnVsQXNzZXQgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTZWxlY3QgbXVsdGlwbGUgYXNzZXRzIGJ5IHRoZWlyIElEcy4gSWYgYW4gYXNzZXQgaXMgbm90IGZvdW5kLCBpdCB3aWxsIGJlIG9taXR0ZWQgZnJvbSB0aGUgcmVzdWx0LlxuICAgKi9cbiAgZ2V0QXNzZXRzOiAoaWRzOiBzdHJpbmdbXSkgPT4gQ29udGVudGZ1bEFzc2V0W107XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdldC1jb250ZW50ZnVsLXJpY2gtdGV4dC1yZW5kZXJlcicsXG4gIHRlbXBsYXRlOiBgYCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGhvc3Q6IHtcbiAgICBjbGFzczogJ2V0LWNvbnRlbnRmdWwtcmljaC10ZXh0LXJlbmRlcmVyJyxcbiAgfSxcbn0pXG5leHBvcnQgY2xhc3MgQ29udGVudGZ1bFJpY2hUZXh0UmVuZGVyZXJDb21wb25lbnQge1xuICBfdmlld0NvbnRhaW5lclJlZiA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKTtcbiAgX3JlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XG4gIF9lbGVtZW50UmVmID0gaW5qZWN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PihFbGVtZW50UmVmKTtcbiAgX2RvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcbiAgX2NvbmZpZyA9IGluamVjdChDT05URU5URlVMX0NPTkZJRywgeyBvcHRpb25hbDogdHJ1ZSB9KSA/PyBjcmVhdGVDb250ZW50ZnVsQ29uZmlnKCk7XG5cbiAgLyoqXG4gICAqIEEgY2FjaGUgZm9yIGFsbCBleGVjdXRlZCBjb21tYW5kcyB0aGF0IGFyZSBub3QgZGVsZXRlZC5cbiAgICogVGhpcyBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgYWxsIHJlbmRlcmVkIGVsZW1lbnRzIGFuZCBjb21wb25lbnRzLlxuICAgKiBUaGUga2V5IGlzIHRoZSByZW5kZXIgY29tbWFuZCBlbGVtZW50IElELlxuICAgKi9cbiAgX2V4ZWN1dGVkQ29tbWFuZHNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBFeGVjdXRlZENvbW1hbmRDYWNoZUl0ZW0+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50ZnVsIHJlc3BvbnNlIGdvdHRlbiB2aWEgdGhlaXIgUkVTVCBhcGkuXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cuY29udGVudGZ1bC5jb20vZGV2ZWxvcGVycy9kb2NzL3JlZmVyZW5jZXMvY29udGVudC1kZWxpdmVyeS1hcGkvIy9yZWZlcmVuY2UvZW50cmllcy9lbnRyaWVzLWNvbGxlY3Rpb25cbiAgICovXG4gIGNvbnRlbnQgPSBpbnB1dC5yZXF1aXJlZDxDb250ZW50ZnVsQ29sbGVjdGlvbiB8IG51bGwgfCB1bmRlZmluZWQ+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHdoZXJlIHRoZSByaWNoIHRleHQgZmllbGQgaXMgaW5zaWRlIHRoZSBjb250ZW50ZnVsIHJlc3BvbnNlLiBEb3QgYW5kIGFycmF5IG5vdGF0aW9uIGlzIGFsbG93ZWQuXG4gICAqIEBkZWZhdWx0IFwiaXRlbXNbMF0uZmllbGRzLmh0bWxcIlxuICAgKi9cbiAgcmljaFRleHRQYXRoID0gaW5wdXQucmVxdWlyZWQ8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBBIG1hcCBvZiBhbGwgaW5jbHVkZXMgaW4gdGhlIGNvbnRlbnRmdWwgcmVzcG9uc2UuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciBsb29raW5nIHVwIGFzc2V0cyBhbmQgZW50cmllcyB0aGF0IGFyZSByZWZlcmVuY2VkIGluIHRoZSByaWNoIHRleHQgd2l0aG91dCBoYXZpbmcgdG8gdXNlIGxvb3BzLlxuICAgKi9cbiAgY29udGVudEluY2x1ZGVzTWFwID0gY29tcHV0ZWQ8Q29udGVudGZ1bEluY2x1ZGVNYXA+KCgpID0+IHtcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5jb250ZW50KCk7XG4gICAgY29uc3QgYXNzZXRzID0gY29udGVudD8uaW5jbHVkZXMuQXNzZXQ7XG4gICAgY29uc3QgZW50cmllcyA9IGNvbnRlbnQ/LmluY2x1ZGVzLkVudHJ5O1xuXG4gICAgY29uc3QgYXNzZXRNYXAgPSBuZXcgTWFwKGFzc2V0cz8ubWFwKChhc3NldCkgPT4gW2Fzc2V0LnN5cy5pZCwgYXNzZXRdKSA/PyBbXSk7XG4gICAgY29uc3QgZW50cnlNYXAgPSBuZXcgTWFwKGVudHJpZXM/Lm1hcCgoZW50cnkpID0+IFtlbnRyeS5zeXMuaWQsIGVudHJ5XSkgPz8gW10pO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBnZXRFbnRyeSA9IDxUIGV4dGVuZHMgeyBba2V5OiBzdHJpbmddOiBhbnkgfT4oaWQ6IHN0cmluZywgY29udGVudFR5cGVJZDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBlbnRyeSA9IGVudHJ5TWFwLmdldChpZCk7XG5cbiAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdFbnRyeSBub3QgZm91bmQhIFdpbGwgcmV0dXJuIG51bGwuIElzIHRoZSBpbmNsdWRlIHF1ZXJ5IHBhcmFtIHRvIGxvdz8nLCB7IGlkLCBlbnRyeU1hcCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29udGVudFR5cGVJZCA9PT0gRVRfQ09OVEVOVEZVTF9BTllfRU5UUllfQ09OVEVOVF9UWVBFX1NZU19JRCkge1xuICAgICAgICByZXR1cm4gZW50cnkgYXMgQ29udGVudGZ1bEVudHJ5PFQ+O1xuICAgICAgfVxuXG4gICAgICBpZiAoZW50cnkuc3lzLmNvbnRlbnRUeXBlLnN5cy5pZCAhPT0gY29udGVudFR5cGVJZCkge1xuICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ0VudHJ5IHN5cyBJRCBkb2VzIG5vdCBtYXRjaCB0aGUgcHJvdmlkZWQgc3lzIElEISBXaWxsIHJldHVybiBudWxsLicsIHtcbiAgICAgICAgICAgIGVudHJ5LFxuICAgICAgICAgICAgc3lzSWQ6IGNvbnRlbnRUeXBlSWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVudHJ5IGFzIENvbnRlbnRmdWxFbnRyeTxUPjtcbiAgICB9O1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBnZXRFbnRyaWVzID0gPFQgZXh0ZW5kcyB7IFtrZXk6IHN0cmluZ106IGFueSB9PihcbiAgICAgIGlkczogc3RyaW5nW10gfCBDb250ZW50ZnVsRW50cnlMaW5rSXRlbVtdLFxuICAgICAgY29udGVudFR5cGVJZDogc3RyaW5nLFxuICAgICkgPT4ge1xuICAgICAgY29uc3QgZW50cmllcyA9IGlkc1xuICAgICAgICAubWFwKChpZCkgPT4gKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgPyBpZCA6IGlkLnN5cy5pZCkpXG4gICAgICAgIC5tYXAoKGlkKSA9PiBnZXRFbnRyeTxUPihpZCwgY29udGVudFR5cGVJZCkpXG4gICAgICAgIC5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgQ29udGVudGZ1bEVudHJ5PFQ+ID0+IGVudHJ5ICE9PSBudWxsKTtcblxuICAgICAgcmV0dXJuIGVudHJpZXM7XG4gICAgfTtcblxuICAgIGNvbnN0IGdldEFzc2V0ID0gKGlkOiBzdHJpbmcpID0+IHtcbiAgICAgIHJldHVybiBhc3NldE1hcC5nZXQoaWQpID8/IG51bGw7XG4gICAgfTtcblxuICAgIGNvbnN0IGdldEFzc2V0cyA9IChpZHM6IHN0cmluZ1tdKSA9PiB7XG4gICAgICByZXR1cm4gaWRzLm1hcCgoaWQpID0+IGdldEFzc2V0KGlkKSkuZmlsdGVyKChhc3NldCk6IGFzc2V0IGlzIENvbnRlbnRmdWxBc3NldCA9PiBhc3NldCAhPT0gbnVsbCk7XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBnZXRFbnRyeSxcbiAgICAgIGdldEVudHJpZXMsXG4gICAgICBnZXRBc3NldCxcbiAgICAgIGdldEFzc2V0cyxcbiAgICB9O1xuICB9KTtcblxuICAvKipcbiAgICogVGhlIHJpY2ggdGV4dCBkYXRhIHRoYXQgc2hvdWxkIGJlIHJlbmRlcmVkLlxuICAgKi9cbiAgcmljaFRleHREYXRhID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLmNvbnRlbnQoKTtcbiAgICBjb25zdCByaWNoVGV4dFBhdGggPSB0aGlzLnJpY2hUZXh0UGF0aCgpO1xuXG4gICAgaWYgKCFjb250ZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCByaWNoVGV4dCA9IGdldE9iamVjdFByb3BlcnR5KGNvbnRlbnQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgcmljaFRleHRQYXRoKTtcblxuICAgIGlmICghaXNPYmplY3QocmljaFRleHQpKSB7XG4gICAgICB0aHJvdyByaWNoVGV4dFJlbmRlcmVyRXJyb3IoJ3JpY2hfdGV4dF91bmRlZmluZWQnLCBmYWxzZSwgeyBjb250ZW50LCByaWNoVGV4dFBhdGggfSk7XG4gICAgfVxuXG4gICAgaWYgKCFpc1JpY2hUZXh0Um9vdE5vZGUocmljaFRleHQpKSB7XG4gICAgICB0aHJvdyByaWNoVGV4dFJlbmRlcmVyRXJyb3IoJ3JpY2hfdGV4dF93cm9uZ190eXBlJywgZmFsc2UsIHsgY29udGVudCwgcmljaFRleHRQYXRoIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByaWNoVGV4dCBhcyBSaWNoVGV4dFJlc3BvbnNlO1xuICB9KTtcblxuICByZW5kZXJDb21tYW5kcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCByaWNoVGV4dERhdGEgPSB0aGlzLnJpY2hUZXh0RGF0YSgpO1xuXG4gICAgaWYgKCFyaWNoVGV4dERhdGEpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlUmVuZGVyQ29tbWFuZHMocmljaFRleHREYXRhKTtcbiAgfSk7XG5cbiAgcmVuZGVyQ29tbWFuZEhpc3RvcnkgPSB0b1NpZ25hbChcbiAgICB0b09ic2VydmFibGUodGhpcy5yZW5kZXJDb21tYW5kcykucGlwZShzdGFydFdpdGgoW10gYXMgUmVuZGVyQ29tbWFuZFtdKSwgcGFpcndpc2UoKSksXG4gICAgeyBpbml0aWFsVmFsdWU6IFtbXSwgW11dIH0sXG4gICk7XG5cbiAgcHJldmlvdXNSZW5kZXJDb21tYW5kTWFwID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IFtwcmV2Q29tbWFuZHNdID0gdGhpcy5yZW5kZXJDb21tYW5kSGlzdG9yeSgpO1xuXG4gICAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcgfCBudW1iZXIsIFJlbmRlckNvbW1hbmQ+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGNvbW1hbmQgb2YgcHJldkNvbW1hbmRzKSB7XG4gICAgICBtYXAuc2V0KGdldFJlbmRlckNvbW1hbmRJZChjb21tYW5kKSwgY29tbWFuZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcDtcbiAgfSk7XG5cbiAgcmVuZGVySW5zdHJ1Y3Rpb25zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGNvbW1hbmRzID0gdGhpcy5yZW5kZXJDb21tYW5kcygpO1xuICAgIGNvbnN0IHByZXZpb3VzUmVuZGVyQ29tbWFuZE1hcCA9IG5ldyBNYXAodGhpcy5wcmV2aW91c1JlbmRlckNvbW1hbmRNYXAoKSk7XG5cbiAgICBjb25zdCBpbnN0cnVjdGlvbnM6IFJlbmRlckluc3RydWN0aW9uW10gPSBbXTtcblxuICAgIC8vIHJlbW92ZSBkZWxldGVkIGNvbXBvbmVudHMgYXMgd2VsbCBhcyBhbGwgb3RoZXIgZWxlbWVudHNcbiAgICBmb3IgKGNvbnN0IFssIGNvbW1hbmRdIG9mIHByZXZpb3VzUmVuZGVyQ29tbWFuZE1hcCkge1xuICAgICAgaWYgKGlzQ29tcG9uZW50UmVuZGVyQ29tbWFuZChjb21tYW5kKSkge1xuICAgICAgICAvLyBrZWVwIHRoZSBjb21wb25lbnQgYXJvdW5kIGlmIGl0J3Mgc3RpbGwgaW4gdGhlIG5ldyBjb21tYW5kc1xuICAgICAgICBpZiAoY29tbWFuZHMuc29tZSgoYykgPT4gZ2V0UmVuZGVyQ29tbWFuZElkKGMpID09PSBnZXRSZW5kZXJDb21tYW5kSWQoY29tbWFuZCkpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaW5zdHJ1Y3Rpb25zLnB1c2goW1JFTkRFUl9JTlNUUlVDVElPTl9UWVBFLkRFTEVURSwgY29tbWFuZF0pO1xuXG4gICAgICAvLyByZW1vdmUgZnJvbSBtYXAgdG8gbWFyayBhcyB1c2VkXG4gICAgICBwcmV2aW91c1JlbmRlckNvbW1hbmRNYXAuZGVsZXRlKGdldFJlbmRlckNvbW1hbmRJZChjb21tYW5kKSk7XG4gICAgfVxuXG4gICAgLy8gRmluZCB0aGUgaW5kZXhlcyBvZiB0aGUgY29tbWFuZHMgcmVtYWluaW5nIGluIHRoZSBwcmV2aW91c1JlbmRlckNvbW1hbmRNYXAgaW4gdGhlIG5ldyBjb21tYW5kcyBhcnJheS5cbiAgICBjb25zdCBsYXN0Q29tcG9uZW50SW5kZXhlczogeyBuZXdJbmRleDogbnVtYmVyOyBwcmV2SW5kZXg6IG51bWJlcjsgY29tbWFuZDogUmVuZGVyQ29tbWFuZCB9W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtpZCwgY29tbWFuZF0gb2YgcHJldmlvdXNSZW5kZXJDb21tYW5kTWFwKSB7XG4gICAgICBjb25zdCBpbmRleCA9IGNvbW1hbmRzLmZpbmRJbmRleCgoYykgPT4gZ2V0UmVuZGVyQ29tbWFuZElkKGMpID09PSBpZCk7XG4gICAgICBjb25zdCBuZXdDb21tYW5kID0gY29tbWFuZHNbaW5kZXhdITtcblxuICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbW1hbmQgbm90IGZvdW5kIScpO1xuICAgICAgfVxuXG4gICAgICBsYXN0Q29tcG9uZW50SW5kZXhlcy5wdXNoKHtcbiAgICAgICAgbmV3SW5kZXg6IGluZGV4LFxuICAgICAgICBwcmV2SW5kZXg6IGNvbW1hbmRbUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uSU5ERVhdLFxuICAgICAgICBjb21tYW5kOiBuZXdDb21tYW5kLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGFzdENvbXBvbmVudEluZGV4ZXMuc29ydCgoYSwgYikgPT4gYS5uZXdJbmRleCAtIGIubmV3SW5kZXgpO1xuXG4gICAgLy8gY2hlY2sgaWYgdGhlIHByZXZJbmRleCBhcmUgaW4gb3JkZXIgYXNjZW5kaW5nXG4gICAgLy8gZm9yIGluZGV4ZXMgdGhhdCBhcmUgbm90IGluIG9yZGVyLCBjcmVhdGUgYSBtb3ZlIGluc3RydWN0aW9uXG4gICAgLy8gZm9yIGluZGV4ZXMgdGhhdCBhcmUgaW4gb3JkZXIsIGNyZWF0ZSBhbiB1cGRhdGUgaW5zdHJ1Y3Rpb25cbiAgICBsZXQgbW92ZUNoZWNrSW5kZXggPSAwO1xuICAgIHdoaWxlIChtb3ZlQ2hlY2tJbmRleCA8IGxhc3RDb21wb25lbnRJbmRleGVzLmxlbmd0aCAtIDEpIHtcbiAgICAgIGNvbnN0IG1vdmVDdXJyID0gbGFzdENvbXBvbmVudEluZGV4ZXNbbW92ZUNoZWNrSW5kZXhdO1xuICAgICAgY29uc3QgbW92ZU5leHQgPSBsYXN0Q29tcG9uZW50SW5kZXhlc1ttb3ZlQ2hlY2tJbmRleCArIDFdO1xuXG4gICAgICBpZiAoIW1vdmVDdXJyIHx8ICFtb3ZlTmV4dCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKG1vdmVDdXJyLnByZXZJbmRleCA+IG1vdmVOZXh0LnByZXZJbmRleCkge1xuICAgICAgICBsYXN0Q29tcG9uZW50SW5kZXhlcy5zcGxpY2UobW92ZUNoZWNrSW5kZXggKyAxLCAxKTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25zLnB1c2goW1JFTkRFUl9JTlNUUlVDVElPTl9UWVBFLk1PVkUsIG1vdmVOZXh0LmNvbW1hbmRdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluc3RydWN0aW9ucy5wdXNoKFtSRU5ERVJfSU5TVFJVQ1RJT05fVFlQRS5VUERBVEUsIG1vdmVOZXh0LmNvbW1hbmRdKTtcbiAgICAgICAgbW92ZUNoZWNrSW5kZXgrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNvbW1hbmQgb2YgY29tbWFuZHMpIHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0UmVuZGVyQ29tbWFuZElkKGNvbW1hbmQpO1xuXG4gICAgICBpZiAoaXNDb21wb25lbnRSZW5kZXJDb21tYW5kKGNvbW1hbmQpKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzQ29tbWFuZCA9IHByZXZpb3VzUmVuZGVyQ29tbWFuZE1hcC5nZXQoaWQpO1xuXG4gICAgICAgIGlmICghcHJldmlvdXNDb21tYW5kKSB7XG4gICAgICAgICAgLy8gY3JlYXRlXG4gICAgICAgICAgaW5zdHJ1Y3Rpb25zLnB1c2goW1JFTkRFUl9JTlNUUlVDVElPTl9UWVBFLkNSRUFURSwgY29tbWFuZF0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBjcmVhdGVcbiAgICAgICAgaW5zdHJ1Y3Rpb25zLnB1c2goW1JFTkRFUl9JTlNUUlVDVElPTl9UWVBFLkNSRUFURSwgY29tbWFuZF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpbnN0cnVjdGlvbnM7XG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRvT2JzZXJ2YWJsZSh0aGlzLnJlbmRlckluc3RydWN0aW9ucylcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKSxcbiAgICAgICAgdGFwKChpbnN0cnVjdGlvbnMpID0+IHtcbiAgICAgICAgICB0aGlzLl9leGVjSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyk7XG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlUmVuZGVyQ29tbWFuZHMocmljaFRleHREYXRhOiBSaWNoVGV4dFJlc3BvbnNlKSB7XG4gICAgLyoqIExpc3Qgb2YgYWxsIHJlbmRlciBjb21tYW5kcyAqL1xuICAgIGNvbnN0IHJvb3RDb21tYW5kczogUmVuZGVyQ29tbWFuZFtdID0gW107XG5cbiAgICAvKiogQ291bnRlciBmb3IgZ2VuZXJhdGluZyB1bmlxdWUgaHRtbCBlbGVtZW50IElEcy4gKi9cbiAgICBsZXQgZWxlbWVudElkID0gMDtcblxuICAgIC8qKiBDb3VudGVyIGZvciBnZW5lcmF0aW5nIHVuaXF1ZSBjb21wb25lbnQgSURzLiAqL1xuICAgIGNvbnN0IGNvbXBvbmVudElkTWFwID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuICAgIC8qKiBUaGUgbmVzdGluZyBsZXZlbCBvZiB0aGUgY3VycmVudCBub2RlLiAqL1xuICAgIGxldCBuZXN0aW5nTGV2ZWwgPSAwO1xuXG4gICAgLyoqIFRoZSBwb3NpdGlvbiAoaW5kZXgpIG9mIHRoZSBjdXJyZW50IG5vZGUgaW5zaWRlIHRoZSBwYXJlbnQgbm9kZS4gKi9cbiAgICBsZXQgZG9tUG9zaXRpb24gPSAwO1xuXG4gICAgbGV0IGNvbW1hbmRJbmRleCA9IDA7XG5cbiAgICBjb25zdCB0cmF2ZXJzZSA9IChub2RlOiBCbG9jayB8IElubGluZSB8IFRleHQsIHBhcmVudDogUmVuZGVyQ29tbWFuZCB8IG51bGwgPSBudWxsKSA9PiB7XG4gICAgICBzd2l0Y2ggKG5vZGUubm9kZVR5cGUpIHtcbiAgICAgICAgY2FzZSAndGV4dCc6IHtcbiAgICAgICAgICAvLyBSZW5kZXIgbWVkaWFcbiAgICAgICAgICBjb25zdCB0eXBlID0gUkVOREVSX0NPTU1BTkRfVFlQRS5URVhUO1xuICAgICAgICAgIGNvbnN0IHRleHQgPSBub2RlLnZhbHVlO1xuXG4gICAgICAgICAgaWYgKCF0ZXh0KSBicmVhaztcblxuICAgICAgICAgIGNvbnN0IGNvbW1hbmQ6IFRleHRSZW5kZXJDb21tYW5kID0gW3R5cGUsIG5lc3RpbmdMZXZlbCwgZG9tUG9zaXRpb24sIGNvbW1hbmRJbmRleCsrLCB0ZXh0XTtcblxuICAgICAgICAgIHJvb3RDb21tYW5kcy5wdXNoKGNvbW1hbmQpO1xuICAgICAgICAgIGRvbVBvc2l0aW9uKys7XG5cbiAgICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgdGhyb3cgcmljaFRleHRSZW5kZXJlckVycm9yKCd0ZXh0X3BhcmVudF9ub3RfZm91bmQnLCBmYWxzZSwgeyBub2RlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWlzSHRtbE9wZW5SZW5kZXJDb21tYW5kKHBhcmVudCkgJiYgIWlzQ29tcG9uZW50UmVuZGVyQ29tbWFuZChwYXJlbnQpKSB7XG4gICAgICAgICAgICB0aHJvdyByaWNoVGV4dFJlbmRlcmVyRXJyb3IoJ3RleHRfcGFyZW50X3dyb25nX3R5cGUnLCBmYWxzZSwgeyBub2RlLCBwYXJlbnQgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYXR0cmlidXRlc1Bvc2l0aW9uID1cbiAgICAgICAgICAgIHBhcmVudFtSRU5ERVJfQ09NTUFORF9QT1NJVElPTi5UWVBFXSA9PT0gUkVOREVSX0NPTU1BTkRfVFlQRS5IVE1MX09QRU5cbiAgICAgICAgICAgICAgPyBIVE1MX09QRU5fUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uQVRUUklCVVRFU1xuICAgICAgICAgICAgICA6IENPTVBPTkVOVF9SRU5ERVJfQ09NTUFORF9QT1NJVElPTi5BVFRSSUJVVEVTO1xuXG4gICAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHBhcmVudFthdHRyaWJ1dGVzUG9zaXRpb25dO1xuXG4gICAgICAgICAgaWYgKG5vZGUubWFya3MubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBtYXJrQ2xhc3NlcyA9IG1hcmtzVG9DbGFzcyhub2RlLm1hcmtzKTtcblxuICAgICAgICAgICAgaWYgKENMQVNTX0FUVFIgaW4gYXR0cmlidXRlcykge1xuICAgICAgICAgICAgICBhdHRyaWJ1dGVzW0NMQVNTX0FUVFJdICs9IGAgJHttYXJrQ2xhc3Nlc31gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYXR0cmlidXRlc1tDTEFTU19BVFRSXSA9IG1hcmtDbGFzc2VzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBCTE9DS1MuRU1CRURERURfQVNTRVQ6IHtcbiAgICAgICAgICAvLyBSZW5kZXIgbWVkaWFcbiAgICAgICAgICBjb25zdCB0eXBlID0gUkVOREVSX0NPTU1BTkRfVFlQRS5DT01QT05FTlQ7XG4gICAgICAgICAgY29uc3QgYXNzZXRJZCA9IG5vZGUuZGF0YVsndGFyZ2V0J10/LnN5cz8uaWQ7XG5cbiAgICAgICAgICBpZiAoIWFzc2V0SWQpIHtcbiAgICAgICAgICAgIHRocm93IHJpY2hUZXh0UmVuZGVyZXJFcnJvcignYXNzZXRfaWRfbm90X2ZvdW5kJywgZmFsc2UsIHsgbm9kZSB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBhc3NldCA9IHRoaXMuY29udGVudEluY2x1ZGVzTWFwKCkuZ2V0QXNzZXQoYXNzZXRJZCk7XG5cbiAgICAgICAgICBpZiAoIWFzc2V0KSB7XG4gICAgICAgICAgICB0aHJvdyByaWNoVGV4dFJlbmRlcmVyRXJyb3IoJ2Fzc2V0X25vdF9mb3VuZCcsIGZhbHNlLCB7IGFzc2V0SWQsIG5vZGUgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSBhc3NldC5maWVsZHMuZmlsZS5jb250ZW50VHlwZTtcbiAgICAgICAgICBjb25zdCBhc3NldENvbXBvbmVudHMgPSB0aGlzLl9jb25maWcuY29tcG9uZW50cztcblxuICAgICAgICAgIGNvbnN0IGlzSW1hZ2UgPSBjb250ZW50VHlwZS5zdGFydHNXaXRoKCdpbWFnZS8nKTtcbiAgICAgICAgICBjb25zdCBpc1ZpZGVvID0gY29udGVudFR5cGUuc3RhcnRzV2l0aCgndmlkZW8vJyk7XG4gICAgICAgICAgY29uc3QgaXNBdWRpbyA9IGNvbnRlbnRUeXBlLnN0YXJ0c1dpdGgoJ2F1ZGlvLycpO1xuXG4gICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gaXNJbWFnZVxuICAgICAgICAgICAgPyBhc3NldENvbXBvbmVudHMuaW1hZ2VcbiAgICAgICAgICAgIDogaXNWaWRlb1xuICAgICAgICAgICAgICA/IGFzc2V0Q29tcG9uZW50cy52aWRlb1xuICAgICAgICAgICAgICA6IGlzQXVkaW9cbiAgICAgICAgICAgICAgICA/IGFzc2V0Q29tcG9uZW50cy5hdWRpb1xuICAgICAgICAgICAgICAgIDogYXNzZXRDb21wb25lbnRzLmZpbGU7XG5cbiAgICAgICAgICBjb25zdCBjb21wb25lbnRUeXBlID0gaXNJbWFnZVxuICAgICAgICAgICAgPyBERUZBVUxUX0NPTVBPTkVOVF9UWVBFUy5JTUFHRVxuICAgICAgICAgICAgOiBpc1ZpZGVvXG4gICAgICAgICAgICAgID8gREVGQVVMVF9DT01QT05FTlRfVFlQRVMuVklERU9cbiAgICAgICAgICAgICAgOiBpc0F1ZGlvXG4gICAgICAgICAgICAgICAgPyBERUZBVUxUX0NPTVBPTkVOVF9UWVBFUy5BVURJT1xuICAgICAgICAgICAgICAgIDogREVGQVVMVF9DT01QT05FTlRfVFlQRVMuRklMRTtcblxuICAgICAgICAgIGxldCBjb21wb25lbnRJZCA9IGNvbXBvbmVudElkTWFwLmdldChjb21wb25lbnRUeXBlKSA/PyAtMTtcbiAgICAgICAgICBjb25zdCBpZCA9IGNvbXBvbmVudFR5cGUgKyArK2NvbXBvbmVudElkO1xuICAgICAgICAgIGNvbXBvbmVudElkTWFwLnNldChjb21wb25lbnRUeXBlLCBjb21wb25lbnRJZCk7XG5cbiAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0ge307XG5cbiAgICAgICAgICBjb25zdCBpbnB1dHMgPSB7XG4gICAgICAgICAgICBhc3NldCxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29uc3QgY29tbWFuZDogQ29tcG9uZW50UmVuZGVyQ29tbWFuZCA9IFtcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBuZXN0aW5nTGV2ZWwsXG4gICAgICAgICAgICBkb21Qb3NpdGlvbixcbiAgICAgICAgICAgIGNvbW1hbmRJbmRleCsrLFxuICAgICAgICAgICAgYXR0cmlidXRlcyxcbiAgICAgICAgICAgIGNvbXBvbmVudCxcbiAgICAgICAgICAgIGlucHV0cyxcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgIF07XG5cbiAgICAgICAgICByb290Q29tbWFuZHMucHVzaChjb21tYW5kKTtcblxuICAgICAgICAgIGRvbVBvc2l0aW9uKys7XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgQkxPQ0tTLkVNQkVEREVEX0VOVFJZOlxuICAgICAgICBjYXNlIElOTElORVMuRU1CRURERURfRU5UUlk6IHtcbiAgICAgICAgICAvLyBSZW5kZXIgY29tcG9uZW50XG4gICAgICAgICAgY29uc3QgdHlwZSA9IFJFTkRFUl9DT01NQU5EX1RZUEUuQ09NUE9ORU5UO1xuICAgICAgICAgIGNvbnN0IGVudHJ5SWQgPSBub2RlLmRhdGFbJ3RhcmdldCddPy5zeXM/LmlkO1xuXG4gICAgICAgICAgaWYgKCFlbnRyeUlkKSB7XG4gICAgICAgICAgICB0aHJvdyByaWNoVGV4dFJlbmRlcmVyRXJyb3IoJ2VudHJ5X2lkX25vdF9mb3VuZCcsIGZhbHNlLCB7IG5vZGUgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmNvbnRlbnRJbmNsdWRlc01hcCgpLmdldEVudHJ5KGVudHJ5SWQsIEVUX0NPTlRFTlRGVUxfQU5ZX0VOVFJZX0NPTlRFTlRfVFlQRV9TWVNfSUQpO1xuXG4gICAgICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICAgICAgdGhyb3cgcmljaFRleHRSZW5kZXJlckVycm9yKCdlbnRyeV9ub3RfZm91bmQnLCBmYWxzZSwgeyBlbnRyeUlkLCBub2RlIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFR5cGUgPSBlbnRyeS5zeXMuY29udGVudFR5cGUuc3lzLmlkO1xuXG4gICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5fY29uZmlnLmN1c3RvbUNvbXBvbmVudHNbY29tcG9uZW50VHlwZV07XG5cbiAgICAgICAgICBpZiAoIWNvbXBvbmVudCkge1xuICAgICAgICAgICAgdGhyb3cgcmljaFRleHRSZW5kZXJlckVycm9yKCdjdXN0b21fY29tcG9uZW50X25vdF9mb3VuZCcsIGZhbHNlLCB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudFR5cGUsXG4gICAgICAgICAgICAgIGN1c3RvbUNvbXBvbmVudHM6IHRoaXMuX2NvbmZpZy5jdXN0b21Db21wb25lbnRzLFxuICAgICAgICAgICAgICBlbnRyeSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB7fTtcbiAgICAgICAgICBsZXQgY29tcG9uZW50SWQgPSBjb21wb25lbnRJZE1hcC5nZXQoY29tcG9uZW50VHlwZSkgPz8gLTE7XG4gICAgICAgICAgY29uc3QgaWQgPSBjb21wb25lbnRUeXBlICsgKytjb21wb25lbnRJZDtcbiAgICAgICAgICBjb21wb25lbnRJZE1hcC5zZXQoY29tcG9uZW50VHlwZSwgY29tcG9uZW50SWQpO1xuXG4gICAgICAgICAgY29uc3QgaW5wdXRzID0ge1xuICAgICAgICAgICAgZmllbGRzOiBlbnRyeS5maWVsZHMsXG4gICAgICAgICAgICBtZXRhZGF0YTogZW50cnkubWV0YWRhdGEsXG4gICAgICAgICAgICBzeXM6IGVudHJ5LnN5cyxcbiAgICAgICAgICAgIGluY2x1ZGVzOiB0aGlzLmNvbnRlbnRJbmNsdWRlc01hcCgpLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCBjb21tYW5kOiBDb21wb25lbnRSZW5kZXJDb21tYW5kID0gW1xuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIG5lc3RpbmdMZXZlbCxcbiAgICAgICAgICAgIGRvbVBvc2l0aW9uLFxuICAgICAgICAgICAgY29tbWFuZEluZGV4KyssXG4gICAgICAgICAgICBhdHRyaWJ1dGVzLFxuICAgICAgICAgICAgY29tcG9uZW50LFxuICAgICAgICAgICAgaW5wdXRzLFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgXTtcblxuICAgICAgICAgIHJvb3RDb21tYW5kcy5wdXNoKGNvbW1hbmQpO1xuXG4gICAgICAgICAgZG9tUG9zaXRpb24rKztcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGNvbnN0IHR5cGUgPSBSRU5ERVJfQ09NTUFORF9UWVBFLkhUTUxfT1BFTjtcbiAgICAgICAgICBjb25zdCB0YWcgPSB0cmFuc2xhdGVDb250ZW50ZnVsTm9kZVR5cGVUb0h0bWxUYWcobm9kZS5ub2RlVHlwZSk7XG4gICAgICAgICAgY29uc3QgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgICAgICAgIGNvbnN0IGlkID0gJ2UnICsgZWxlbWVudElkKys7XG5cbiAgICAgICAgICBjb25zdCBjb21tYW5kOiBIdG1sT3BlblJlbmRlckNvbW1hbmQgPSBbdHlwZSwgbmVzdGluZ0xldmVsLCBkb21Qb3NpdGlvbiwgY29tbWFuZEluZGV4KyssIGF0dHJpYnV0ZXMsIHRhZywgaWRdO1xuXG4gICAgICAgICAgcm9vdENvbW1hbmRzLnB1c2goY29tbWFuZCk7XG5cbiAgICAgICAgICBjb25zdCBkb21Qb3NpdGlvbkF0VGhpc0xldmVsID0gZG9tUG9zaXRpb247XG4gICAgICAgICAgLy8gTm9ybWFsIGh0bWwgZWxlbWVudHMgY2FuIGhhdmUgY2hpbGRyZW5cbiAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY29udGVudCkge1xuICAgICAgICAgICAgZG9tUG9zaXRpb24gPSAwO1xuICAgICAgICAgICAgbmVzdGluZ0xldmVsKys7XG4gICAgICAgICAgICB0cmF2ZXJzZShjaGlsZCwgY29tbWFuZCk7XG4gICAgICAgICAgICBuZXN0aW5nTGV2ZWwtLTtcbiAgICAgICAgICAgIGRvbVBvc2l0aW9uID0gZG9tUG9zaXRpb25BdFRoaXNMZXZlbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBsYXN0Q29tbWFuZCA9IHJvb3RDb21tYW5kc1tyb290Q29tbWFuZHMubGVuZ3RoIC0gMV07XG5cbiAgICAgICAgICBpZiAobGFzdENvbW1hbmQ/LltSRU5ERVJfQ09NTUFORF9QT1NJVElPTi5UWVBFXSA9PT0gUkVOREVSX0NPTU1BTkRfVFlQRS5IVE1MX09QRU4pIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBsYXN0IGNvbW1hbmQgaXMgYW4gb3BlbiBjb21tYW5kLCB3ZSBjYW4gcmVtb3ZlIGl0IHNpbmNlIGl0J3MgZW1wdHlcbiAgICAgICAgICAgIHJvb3RDb21tYW5kcy5wb3AoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY2xvc2VJZCA9ICdlJyArIGVsZW1lbnRJZCsrO1xuXG4gICAgICAgICAgICBjb25zdCBjbG9zZUNvbW1hbmQ6IEh0bWxDbG9zZVJlbmRlckNvbW1hbmQgPSBbXG4gICAgICAgICAgICAgIFJFTkRFUl9DT01NQU5EX1RZUEUuSFRNTF9DTE9TRSxcbiAgICAgICAgICAgICAgbmVzdGluZ0xldmVsLFxuICAgICAgICAgICAgICBkb21Qb3NpdGlvbixcbiAgICAgICAgICAgICAgY29tbWFuZEluZGV4KyssXG4gICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAgY2xvc2VJZCxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICByb290Q29tbWFuZHMucHVzaChjbG9zZUNvbW1hbmQpO1xuXG4gICAgICAgICAgICBkb21Qb3NpdGlvbisrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBJTkxJTkVTLkhZUEVSTElOSykge1xuICAgICAgICAgICAgY29uc3QgdXJpID0gbm9kZS5kYXRhWyd1cmknXTtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXNbJ2hyZWYnXSA9IHVyaTtcblxuICAgICAgICAgICAgY29uc3QgaG9zdCA9IHRoaXMuX2RvY3VtZW50LmxvY2F0aW9uLmhvc3Q7XG4gICAgICAgICAgICBjb25zdCBpc0V4dGVybmFsID0gIXVyaS5pbmNsdWRlcyhob3N0KTtcblxuICAgICAgICAgICAgaWYgKGlzRXh0ZXJuYWwpIHtcbiAgICAgICAgICAgICAgYXR0cmlidXRlc1sndGFyZ2V0J10gPSAnX2JsYW5rJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgcmljaFRleHREYXRhLmNvbnRlbnQpIHtcbiAgICAgIHRyYXZlcnNlKG5vZGUsIG51bGwpO1xuICAgIH1cblxuICAgIHJldHVybiByb290Q29tbWFuZHM7XG4gIH1cblxuICBwcml2YXRlIF9leGVjSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9uczogUmVuZGVySW5zdHJ1Y3Rpb25bXSkge1xuICAgIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgICBjb25zdCB0eXBlID0gaW5zdHJ1Y3Rpb25bUkVOREVSX0lOU1RSVUNUSU9OX1BPU0lUSU9OLlRZUEVdO1xuICAgICAgY29uc3QgY29tbWFuZCA9IGluc3RydWN0aW9uW1JFTkRFUl9JTlNUUlVDVElPTl9QT1NJVElPTi5DT01NQU5EXTtcblxuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgUkVOREVSX0lOU1RSVUNUSU9OX1RZUEUuQ1JFQVRFOlxuICAgICAgICAgIHRoaXMuX3J1bkNyZWF0ZUluc3RydWN0aW9uKGNvbW1hbmQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFJFTkRFUl9JTlNUUlVDVElPTl9UWVBFLlVQREFURTpcbiAgICAgICAgICB0aGlzLl9ydW5VcGRhdGVJbnN0cnVjdGlvbihjb21tYW5kKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBSRU5ERVJfSU5TVFJVQ1RJT05fVFlQRS5NT1ZFOlxuICAgICAgICAgIHRoaXMuX3J1bk1vdmVJbnN0cnVjdGlvbihjb21tYW5kKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBSRU5ERVJfSU5TVFJVQ1RJT05fVFlQRS5ERUxFVEU6XG4gICAgICAgICAgdGhpcy5fcnVuRGVsZXRlSW5zdHJ1Y3Rpb24oY29tbWFuZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcnVuQ3JlYXRlSW5zdHJ1Y3Rpb24oY29tbWFuZDogUmVuZGVyQ29tbWFuZCkge1xuICAgIGNvbnN0IGlkID0gZ2V0UmVuZGVyQ29tbWFuZElkKGNvbW1hbmQpO1xuICAgIGNvbnN0IHBhcmVudEVsZW1lbnQgPSB0aGlzLl9maW5kUGFyZW50KGNvbW1hbmQpO1xuICAgIGNvbnN0IG5leHRFbGVtZW50ID0gdGhpcy5fZmluZEZvbGxvd2luZ0VsZW1lbnQoY29tbWFuZCk7XG5cbiAgICBpZiAoaXNDb21wb25lbnRSZW5kZXJDb21tYW5kKGNvbW1hbmQpKSB7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb21tYW5kW0NPTVBPTkVOVF9SRU5ERVJfQ09NTUFORF9QT1NJVElPTi5DT01QT05FTlRdKTtcblxuICAgICAgdGhpcy5fdXBkYXRlQ29tcG9uZW50SW5wdXRzKGNvbW1hbmQsIGNvbXBvbmVudFJlZik7XG5cbiAgICAgIGNvbnN0IHJvb3ROb2RlID0gdGhpcy5fZ2V0Q29tcG9uZW50Um9vdE5vZGUoY29tcG9uZW50UmVmKTtcblxuICAgICAgdGhpcy5fcmVuZGVySW5zZXJ0T3JBcHBlbmQocm9vdE5vZGUsIHBhcmVudEVsZW1lbnQsIG5leHRFbGVtZW50KTtcblxuICAgICAgdGhpcy5fZXhlY3V0ZWRDb21tYW5kc0NhY2hlLnNldChpZCwge1xuICAgICAgICBjb21tYW5kLFxuICAgICAgICBjb21wb25lbnRSZWYsXG4gICAgICAgIGVsZW1lbnQ6IHJvb3ROb2RlLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChpc1RleHRSZW5kZXJDb21tYW5kKGNvbW1hbmQpKSB7XG4gICAgICBjb25zdCB0ZXh0ID0gY29tbWFuZFtURVhUX1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLlRFWFRdO1xuICAgICAgY29uc3QgdGV4dE5vZGUgPSB0aGlzLl9yZW5kZXJlci5jcmVhdGVUZXh0KHRleHQpO1xuICAgICAgY29uc3Qgc3BhbiA9IHRoaXMuX3JlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgIHRoaXMuX3JlbmRlcmVyLmFwcGVuZENoaWxkKHNwYW4sIHRleHROb2RlKTtcblxuICAgICAgdGhpcy5fcmVuZGVySW5zZXJ0T3JBcHBlbmQoc3BhbiwgcGFyZW50RWxlbWVudCwgbmV4dEVsZW1lbnQpO1xuXG4gICAgICB0aGlzLl9leGVjdXRlZENvbW1hbmRzQ2FjaGUuc2V0KGlkLCB7XG4gICAgICAgIGNvbW1hbmQsXG4gICAgICAgIGVsZW1lbnQ6IHNwYW4sXG4gICAgICAgIHRleHROb2RlLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChpc0h0bWxPcGVuUmVuZGVyQ29tbWFuZChjb21tYW5kKSkge1xuICAgICAgY29uc3QgdGFnID0gY29tbWFuZFtIVE1MX09QRU5fUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uVEFHX05BTUVdO1xuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGNvbW1hbmRbSFRNTF9PUEVOX1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLkFUVFJJQlVURVNdO1xuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX3JlbmRlcmVyLmNyZWF0ZUVsZW1lbnQodGFnKTtcblxuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcykpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0QXR0cmlidXRlKGVsZW1lbnQsIGtleSwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9yZW5kZXJJbnNlcnRPckFwcGVuZChlbGVtZW50LCBwYXJlbnRFbGVtZW50LCBuZXh0RWxlbWVudCk7XG5cbiAgICAgIHRoaXMuX2V4ZWN1dGVkQ29tbWFuZHNDYWNoZS5zZXQoaWQsIHtcbiAgICAgICAgY29tbWFuZCxcbiAgICAgICAgZWxlbWVudCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3J1blVwZGF0ZUluc3RydWN0aW9uKGNvbW1hbmQ6IFJlbmRlckNvbW1hbmQpIHtcbiAgICBjb25zdCBpZCA9IGdldFJlbmRlckNvbW1hbmRJZChjb21tYW5kKTtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLl9leGVjdXRlZENvbW1hbmRzQ2FjaGUuZ2V0KGlkKTtcblxuICAgIGlmICghY2FjaGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhY2hlZCBjb21tYW5kIG5vdCBmb3VuZCEnKTtcbiAgICB9XG5cbiAgICBpZiAoaXNDb21wb25lbnRSZW5kZXJDb21tYW5kKGNvbW1hbmQpKSB7XG4gICAgICBpZiAoIWlzRXhlY3V0ZWRDb21wb25lbnRDb21tYW5kQ2FjaGVJdGVtKGNhY2hlZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWNoZWQgY29tbWFuZCBpcyBub3QgYSBjb21wb25lbnQgY29tbWFuZCEnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gY2FjaGVkLmNvbXBvbmVudFJlZjtcblxuICAgICAgaWYgKCFjb21wb25lbnRSZWYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb21wb25lbnQgcmVmIG5vdCBmb3VuZCEnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fdXBkYXRlQ29tcG9uZW50SW5wdXRzKGNvbW1hbmQsIGNvbXBvbmVudFJlZik7XG4gICAgfVxuXG4gICAgdGhpcy5fZXhlY3V0ZWRDb21tYW5kc0NhY2hlLnNldChpZCwge1xuICAgICAgLi4uY2FjaGVkLFxuICAgICAgY29tbWFuZDogY29tbWFuZCBhcyBhbnksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9ydW5Nb3ZlSW5zdHJ1Y3Rpb24oY29tbWFuZDogUmVuZGVyQ29tbWFuZCkge1xuICAgIGNvbnN0IGlkID0gZ2V0UmVuZGVyQ29tbWFuZElkKGNvbW1hbmQpO1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuX2V4ZWN1dGVkQ29tbWFuZHNDYWNoZS5nZXQoaWQpO1xuXG4gICAgaWYgKCFjYWNoZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FjaGVkIGNvbW1hbmQgbm90IGZvdW5kIScpO1xuICAgIH1cblxuICAgIGlmIChpc0NvbXBvbmVudFJlbmRlckNvbW1hbmQoY29tbWFuZCkpIHtcbiAgICAgIGlmICghaXNFeGVjdXRlZENvbXBvbmVudENvbW1hbmRDYWNoZUl0ZW0oY2FjaGVkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhY2hlZCBjb21tYW5kIGlzIG5vdCBhIGNvbXBvbmVudCBjb21tYW5kIScpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBjYWNoZWQuY29tcG9uZW50UmVmO1xuXG4gICAgICBpZiAoIWNvbXBvbmVudFJlZikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbXBvbmVudCByZWYgbm90IGZvdW5kIScpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByb290Tm9kZSA9IGNhY2hlZC5lbGVtZW50O1xuICAgICAgY29uc3Qgb2xkUGFyZW50RWxlbWVudCA9IGNhY2hlZC5lbGVtZW50LnBhcmVudEVsZW1lbnQ7XG5cbiAgICAgIHRoaXMuX3JlbmRlcmVyLnJlbW92ZUNoaWxkKG9sZFBhcmVudEVsZW1lbnQsIHJvb3ROb2RlKTtcblxuICAgICAgY29uc3QgbmV3UGFyZW50RWxlbWVudCA9IHRoaXMuX2ZpbmRQYXJlbnQoY29tbWFuZCk7XG4gICAgICBjb25zdCBuZXh0RWxlbWVudCA9IHRoaXMuX2ZpbmRGb2xsb3dpbmdFbGVtZW50KGNvbW1hbmQpO1xuXG4gICAgICB0aGlzLl9yZW5kZXJJbnNlcnRPckFwcGVuZChyb290Tm9kZSwgbmV3UGFyZW50RWxlbWVudCwgbmV4dEVsZW1lbnQpO1xuXG4gICAgICB0aGlzLl91cGRhdGVDb21wb25lbnRJbnB1dHMoY29tbWFuZCwgY29tcG9uZW50UmVmKTtcblxuICAgICAgdGhpcy5fZXhlY3V0ZWRDb21tYW5kc0NhY2hlLnNldChpZCwge1xuICAgICAgICAuLi5jYWNoZWQsXG4gICAgICAgIGNvbW1hbmQ6IGNvbW1hbmQgYXMgYW55LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcnVuRGVsZXRlSW5zdHJ1Y3Rpb24oY29tbWFuZDogUmVuZGVyQ29tbWFuZCkge1xuICAgIGNvbnN0IGlkID0gZ2V0UmVuZGVyQ29tbWFuZElkKGNvbW1hbmQpO1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuX2V4ZWN1dGVkQ29tbWFuZHNDYWNoZS5nZXQoaWQpO1xuXG4gICAgaWYgKCFjYWNoZWQpIHtcbiAgICAgIGlmIChpc0h0bWxDbG9zZVJlbmRlckNvbW1hbmQoY29tbWFuZCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhY2hlZCBjb21tYW5kIG5vdCBmb3VuZCEnKTtcbiAgICB9XG5cbiAgICBpZiAoaXNDb21wb25lbnRSZW5kZXJDb21tYW5kKGNvbW1hbmQpKSB7XG4gICAgICBpZiAoIWlzRXhlY3V0ZWRDb21wb25lbnRDb21tYW5kQ2FjaGVJdGVtKGNhY2hlZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWNoZWQgY29tbWFuZCBpcyBub3QgYSBjb21wb25lbnQgY29tbWFuZCEnKTtcbiAgICAgIH1cblxuICAgICAgY2FjaGVkLmNvbXBvbmVudFJlZj8uZGVzdHJveSgpO1xuICAgIH0gZWxzZSBpZiAoaXNUZXh0UmVuZGVyQ29tbWFuZChjb21tYW5kKSkge1xuICAgICAgdGhpcy5fcmVuZGVyZXIucmVtb3ZlQ2hpbGQoY2FjaGVkLmVsZW1lbnQ/LnBhcmVudEVsZW1lbnQsIGNhY2hlZC5lbGVtZW50KTtcbiAgICB9IGVsc2UgaWYgKGlzSHRtbE9wZW5SZW5kZXJDb21tYW5kKGNvbW1hbmQpKSB7XG4gICAgICB0aGlzLl9yZW5kZXJlci5yZW1vdmVDaGlsZChjYWNoZWQuZWxlbWVudD8ucGFyZW50RWxlbWVudCwgY2FjaGVkLmVsZW1lbnQpO1xuICAgIH1cblxuICAgIHRoaXMuX2V4ZWN1dGVkQ29tbWFuZHNDYWNoZS5kZWxldGUoaWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Q29tcG9uZW50Um9vdE5vZGUoY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8YW55Pik6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gKGNvbXBvbmVudFJlZi5ob3N0VmlldyBhcyBFbWJlZGRlZFZpZXdSZWY8YW55Pikucm9vdE5vZGVzWzBdIGFzIEhUTUxFbGVtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlQ29tcG9uZW50SW5wdXRzKGNvbW1hbmQ6IENvbXBvbmVudFJlbmRlckNvbW1hbmQsIGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPGFueT4pIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjb21tYW5kW0NPTVBPTkVOVF9SRU5ERVJfQ09NTUFORF9QT1NJVElPTi5JTlBVVFNdKSkge1xuICAgICAgaWYgKCFjb21wb25lbnRSZWYuaW5zdGFuY2Vba2V5XSkgY29udGludWU7XG5cbiAgICAgIGNvbXBvbmVudFJlZi5zZXRJbnB1dChrZXksIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9maW5kUGFyZW50KGNvbW1hbmQ6IFJlbmRlckNvbW1hbmQpIHtcbiAgICBjb25zdCBob3N0RWxlbWVudCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBuZXN0aW5nTGV2ZWwgPSBjb21tYW5kW1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLk5FU1RJTkdfTEVWRUxdO1xuICAgIGxldCBwYXJlbnRFbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGlmIChuZXN0aW5nTGV2ZWwgPT09IDApIHtcbiAgICAgIHBhcmVudEVsZW1lbnQgPSBob3N0RWxlbWVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmV2ZXJzZSBzZWFyY2ggYWxsIHJlbmRlciBjb21tYW5kcyBiZWdpbm5pbmcgZnJvbSB0aGUgY3VycmVudCBvbmUgdXNpbmcgYSBmb3IgbG9vcC5cbiAgICAgIC8vIFRoZSBwYXJlbnQgaXMgZm91bmQgd2hlbiB0aGUgY29tbWFuZCdzIG5lc3RpbmcgbGV2ZWwgaXN0IHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IG5lc3RpbmcgbGV2ZWwgbWludXMgMS5cbiAgICAgIC8vIElmIHRoZSBwYXJlbnQgaXMgbm90IGZvdW5kLCB0aHJvdyBhbiBlcnJvci5cbiAgICAgIGNvbnN0IGFsbENvbW1hbmRzID0gdGhpcy5yZW5kZXJDb21tYW5kcygpO1xuICAgICAgY29uc3QgY3VycmVudENvbW1hbmRJbmRleCA9IGNvbW1hbmRbUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uSU5ERVhdO1xuXG4gICAgICBsZXQgcGFyZW50Q29tbWFuZDogUmVuZGVyQ29tbWFuZCB8IG51bGwgPSBudWxsO1xuXG4gICAgICBmb3IgKGxldCBpID0gY3VycmVudENvbW1hbmRJbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGNvbnN0IGNtZCA9IGFsbENvbW1hbmRzW2ldO1xuXG4gICAgICAgIGlmICghY21kKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb21tYW5kIG5vdCBmb3VuZCEnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjbWRbUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uTkVTVElOR19MRVZFTF0gPT09IG5lc3RpbmdMZXZlbCAtIDEpIHtcbiAgICAgICAgICBwYXJlbnRDb21tYW5kID0gY21kO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghcGFyZW50Q29tbWFuZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmVudCBjb21tYW5kIG5vdCBmb3VuZCEnKTtcbiAgICAgIH1cblxuICAgICAgcGFyZW50RWxlbWVudCA9IHRoaXMuX2V4ZWN1dGVkQ29tbWFuZHNDYWNoZS5nZXQoZ2V0UmVuZGVyQ29tbWFuZElkKHBhcmVudENvbW1hbmQpKT8uZWxlbWVudDtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmVudEVsZW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGFyZW50IGVsZW1lbnQgbm90IGZvdW5kIScpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJlbnRFbGVtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBfZmluZEZvbGxvd2luZ0VsZW1lbnQoY29tbWFuZDogUmVuZGVyQ29tbWFuZCkge1xuICAgIGNvbnN0IGNhY2hlQXJyYXkgPSBBcnJheS5mcm9tKHRoaXMuX2V4ZWN1dGVkQ29tbWFuZHNDYWNoZS52YWx1ZXMoKSk7XG4gICAgbGV0IG5leHRFbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGRvbVBvc2l0aW9uID0gY29tbWFuZFtSRU5ERVJfQ09NTUFORF9QT1NJVElPTi5ET01fUE9TSVRJT05dO1xuICAgIGNvbnN0IG5lc3RpbmdMZXZlbCA9IGNvbW1hbmRbUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uTkVTVElOR19MRVZFTF07XG4gICAgY29uc3QgdHlwZSA9IGNvbW1hbmRbUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uVFlQRV07XG5cbiAgICAvLyAgVHJ5IHRvIGZpbmQgYW4gYWxyZWFkeSByZW5kZXJlZCBlbGVtZW50IHdpdGggYSBkb21Qb3NpdGlvbiB0aGF0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBkb21Qb3NpdGlvbi4gSWYgdGhlcmUgYXJlIG11bHRpcGxlLCB1c2UgdGhlIG9uZSB3aXRoIHRoZSBzbWFsbGVzdCBkb21Qb3NpdGlvbi5cbiAgICAvLyBJZiBpdCBkb2VzIG5vdCBleGlzdCwgdXNlIC5hcHBlbmRDaGlsZCB0byBzaW1wbHkgYXBwZW5kIHRoZSBlbGVtZW50IHRvIHRoZSBlbmQgb2YgdGhlIHBhcmVudCBlbGVtZW50LlxuICAgIC8vIElmIGl0IGRvZXMgZXhpc3QsIHVzZSAuaW5zZXJ0QmVmb3JlIHRvIGluc2VydCB0aGUgZWxlbWVudCBiZWZvcmUgdGhlIGZvdW5kIGVsZW1lbnQuXG4gICAgZm9yIChjb25zdCBjYWNoZWQgb2YgY2FjaGVBcnJheSkge1xuICAgICAgaWYgKFxuICAgICAgICBjYWNoZWQuY29tbWFuZFtSRU5ERVJfQ09NTUFORF9QT1NJVElPTi5ET01fUE9TSVRJT05dID4gZG9tUG9zaXRpb24gJiZcbiAgICAgICAgY2FjaGVkLmNvbW1hbmRbUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uTkVTVElOR19MRVZFTF0gPT09IG5lc3RpbmdMZXZlbCAmJlxuICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGVsZW1lbnQgZG9lcyBub3QgZmluZCBpdHNlbGZcbiAgICAgICAgY2FjaGVkLmNvbW1hbmRbUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uVFlQRV0gIT09IHR5cGVcbiAgICAgICkge1xuICAgICAgICBuZXh0RWxlbWVudCA9IGNhY2hlZC5lbGVtZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dEVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJJbnNlcnRPckFwcGVuZChcbiAgICBub2RlVG9SZW5kZXI6IEhUTUxFbGVtZW50LFxuICAgIHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIG5leHRFbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgaWYgKG5leHRFbGVtZW50KSB7XG4gICAgICB0aGlzLl9yZW5kZXJlci5pbnNlcnRCZWZvcmUocGFyZW50RWxlbWVudCwgbm9kZVRvUmVuZGVyLCBuZXh0RWxlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3JlbmRlcmVyLmFwcGVuZENoaWxkKHBhcmVudEVsZW1lbnQsIG5vZGVUb1JlbmRlcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZGVidWdWaXN1YWxpemVSZW5kZXJDb21tYW5kcyhjb21tYW5kczogUmVuZGVyQ29tbWFuZFtdKSB7XG4gICAgY29uc3QgZGVidWcgPSBjb21tYW5kcy5tYXAoKGNvbW1hbmQpID0+IHRoaXMuX3N0cmluZ2lmeVJlbmRlckNvbW1hbmQoY29tbWFuZCkpLmZsYXQoKTtcblxuICAgIGNvbnN0IHByZXR0aWZpZWQgPSBmb3JtYXRIVE1MKGRlYnVnKTtcblxuICAgIHJldHVybiBwcmV0dGlmaWVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3RyaW5naWZ5UmVuZGVyQ29tbWFuZChjb21tYW5kOiBSZW5kZXJDb21tYW5kKSB7XG4gICAgY29uc3QgbmVzdEF0dHIgPSBgbmVzdD1cIiR7Y29tbWFuZFtSRU5ERVJfQ09NTUFORF9QT1NJVElPTi5ORVNUSU5HX0xFVkVMXX1cImA7XG4gICAgY29uc3QgZG9tQXR0ciA9IGBkb209XCIke2NvbW1hbmRbUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uRE9NX1BPU0lUSU9OXX1cImA7XG5cbiAgICBpZiAoaXNIdG1sT3BlblJlbmRlckNvbW1hbmQoY29tbWFuZCkpIHtcbiAgICAgIHJldHVybiBgPCR7Y29tbWFuZFtIVE1MX09QRU5fUkVOREVSX0NPTU1BTkRfUE9TSVRJT04uVEFHX05BTUVdfSAke25lc3RBdHRyfSAke2RvbUF0dHJ9PmA7XG4gICAgfSBlbHNlIGlmIChpc0h0bWxDbG9zZVJlbmRlckNvbW1hbmQoY29tbWFuZCkpIHtcbiAgICAgIHJldHVybiBgPC8ke2NvbW1hbmRbSFRNTF9DTE9TRV9SRU5ERVJfQ09NTUFORF9QT1NJVElPTi5UQUdfTkFNRV19ICR7bmVzdEF0dHJ9ICR7ZG9tQXR0cn0+YDtcbiAgICB9IGVsc2UgaWYgKGlzVGV4dFJlbmRlckNvbW1hbmQoY29tbWFuZCkpIHtcbiAgICAgIHJldHVybiBbYDxzcGFuICR7bmVzdEF0dHJ9ICR7ZG9tQXR0cn0+YCwgY29tbWFuZFtURVhUX1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLlRFWFRdLCAnPC9zcGFuPiddO1xuICAgIH0gZWxzZSBpZiAoaXNDb21wb25lbnRSZW5kZXJDb21tYW5kKGNvbW1hbmQpKSB7XG4gICAgICBjb25zdCBzZWxlY3RvciA9IGNvbW1hbmRbQ09NUE9ORU5UX1JFTkRFUl9DT01NQU5EX1BPU0lUSU9OLkNPTVBPTkVOVF9UWVBFXTtcbiAgICAgIHJldHVybiBbYDwke3NlbGVjdG9yfSAke25lc3RBdHRyfSAke2RvbUF0dHJ9PmAsIGA8LyR7c2VsZWN0b3J9PmBdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ1VOS05PV04nO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3N0cmluZ2lmeVJlbmRlckluc3RydWN0aW9uKGluc3RydWN0aW9uOiBSZW5kZXJJbnN0cnVjdGlvbikge1xuICAgIGNvbnN0IHR5cGUgPSBpbnN0cnVjdGlvbltSRU5ERVJfSU5TVFJVQ1RJT05fUE9TSVRJT04uVFlQRV07XG4gICAgY29uc3QgdHJhbnNsYXRlZFR5cGUgPSBPYmplY3QuZW50cmllcyhSRU5ERVJfSU5TVFJVQ1RJT05fVFlQRSkuZmluZCgoWywgdmFsdWVdKSA9PiB2YWx1ZSA9PT0gdHlwZSk/LlswXTtcblxuICAgIGNvbnN0IGNvbW1hbmQgPSB0aGlzLl9zdHJpbmdpZnlSZW5kZXJDb21tYW5kKGluc3RydWN0aW9uW1JFTkRFUl9JTlNUUlVDVElPTl9QT1NJVElPTi5DT01NQU5EXSk7XG5cbiAgICByZXR1cm4gYCR7dHJhbnNsYXRlZFR5cGV9OiAke2NvbW1hbmR9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXRIVE1MKGh0bWw6IHN0cmluZ1tdKSB7XG4gIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGluZGVudCA9IDA7XG5cbiAgZm9yIChjb25zdCB0YWcgb2YgaHRtbCkge1xuICAgIGlmICh0YWcuc3RhcnRzV2l0aCgnPC8nKSkge1xuICAgICAgaW5kZW50LS07XG4gICAgfVxuXG4gICAgcmVzdWx0LnB1c2goJyAnLnJlcGVhdChpbmRlbnQgKiAyKSArIHRhZyk7XG5cbiAgICBpZiAodGFnLnN0YXJ0c1dpdGgoJzwnKSAmJiAhdGFnLnN0YXJ0c1dpdGgoJzwvJykpIHtcbiAgICAgIGluZGVudCsrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQuam9pbignXFxuJyk7XG59XG4iXX0=
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudGZ1bC50eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29udGVudGZ1bC9zcmMvbGliL3R5cGVzL2NvbnRlbnRmdWwudHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudFR5cGUgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IElucHV0U2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCbG9jaywgTm9kZURhdGEgfSBmcm9tICdAY29udGVudGZ1bC9yaWNoLXRleHQtdHlwZXMnO1xuaW1wb3J0IHsgQ29udGVudGZ1bEluY2x1ZGVNYXAgfSBmcm9tICcuLi9jb21wb25lbnRzL3JpY2gtdGV4dC1yZW5kZXJlcic7XG5cbmV4cG9ydCB0eXBlIENvbnRlbnRmdWxJbWFnZVJlc2l6ZUJlaGF2aW9yID0gJ3BhZCcgfCAnY3JvcCcgfCAnZmlsbCcgfCAnc2NhbGUnIHwgJ3RodW1iJyB8ICdmaXQnO1xuZXhwb3J0IHR5cGUgQ29udGVudGZ1bEltYWdlRm9jdXNBcmVhID1cbiAgfCAndG9wJ1xuICB8ICdib3R0b20nXG4gIHwgJ2xlZnQnXG4gIHwgJ3JpZ2h0J1xuICB8ICdjZW50ZXInXG4gIHwgJ3RvcF9sZWZ0J1xuICB8ICd0b3BfcmlnaHQnXG4gIHwgJ2JvdHRvbV9sZWZ0J1xuICB8ICdib3R0b21fcmlnaHQnXG4gIHwgJ2ZhY2UnXG4gIHwgJ2ZhY2VzJztcblxudHlwZSBDb21wb25lbnRMaWtlV2l0aEFzc2V0ID0gQ29tcG9uZW50VHlwZTx7IGFzc2V0OiBJbnB1dFNpZ25hbDxDb250ZW50ZnVsQXNzZXQgfCBudWxsIHwgdW5kZWZpbmVkPiB9PjtcbnR5cGUgQ29tcG9uZW50TGlrZVdpdGhDb250ZW50ZnVsUmVuZGVyZXJJbnB1dHMgPSBDb21wb25lbnRUeXBlPHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgZmllbGRzPzogSW5wdXRTaWduYWw8YW55PjtcblxuICBpbmNsdWRlcz86IElucHV0U2lnbmFsPENvbnRlbnRmdWxJbmNsdWRlTWFwPjtcblxuICBtZXRhZGF0YT86IElucHV0U2lnbmFsPENvbnRlbnRmdWxNZXRhZGF0YT47XG5cbiAgc3lzPzogSW5wdXRTaWduYWw8Q29udGVudGZ1bFN5cz47XG59PjtcblxuZXhwb3J0IGludGVyZmFjZSBDb250ZW50ZnVsQXNzZXRDb21wb25lbnRzIHtcbiAgZmlsZTogQ29tcG9uZW50TGlrZVdpdGhBc3NldDtcbiAgaW1hZ2U6IENvbXBvbmVudExpa2VXaXRoQXNzZXQ7XG4gIHZpZGVvOiBDb21wb25lbnRMaWtlV2l0aEFzc2V0O1xuICBhdWRpbzogQ29tcG9uZW50TGlrZVdpdGhBc3NldDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb250ZW50ZnVsQ29uZmlnIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgY29tcG9uZW50cyBmb3IgcmVuZGVyaW5nIGNvbnRlbnRmdWwgYXNzZXRzXG4gICAqL1xuICBjb21wb25lbnRzOiBDb250ZW50ZnVsQXNzZXRDb21wb25lbnRzO1xuXG4gIC8qKlxuICAgKiBDb21wb25lbnQgZm9yIHJlbmRlcmluZyBlbWJlZGRlZCBlbnRyaWVzXG4gICAqL1xuICBjdXN0b21Db21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCBDb21wb25lbnRMaWtlV2l0aENvbnRlbnRmdWxSZW5kZXJlcklucHV0cz47XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgdGhlIGNvbnRlbnRmdWwgcmljaCB0ZXh0IHJlbmRlcmVyIHNob3VsZCByZW5kZXIgdGhlIGNvbnRlbnRmdWwgcmljaCB0ZXh0IHdpdGggdGFpbHdpbmQgY3NzIGNsYXNzZXNcbiAgICovXG4gIHVzZVRhaWx3aW5kQ2xhc3NlczogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGVmYXVsdCBvcHRpb25zIGZvciB0aGUgY29udGVudGZ1bCBpbWFnZSBhcGlcbiAgICovXG4gIGltYWdlT3B0aW9uczoge1xuICAgIC8qKlxuICAgICAqIFNvdXJjZSBzZXQgc2l6ZXMuIEVnLlxuICAgICAqIC0gYFwiNDAwXCJgIC0gNDAwcHggd2lkdGhcbiAgICAgKiAtIGBcIjQwMHgzMDBcImAgLSA0MDBweCB3aWR0aCBhbmQgMzAwcHggaGVpZ2h0XG4gICAgICogLSBgXCI0MDB3XCJgIC0gNDAwcHggd2lkdGhcbiAgICAgKiAtIGBcIjQwMGhcImAgLSA0MDBweCBoZWlnaHRcbiAgICAgKiAtIGBcIjQwMHd4MzAwaFwiYCAtIDQwMHB4IHdpZHRoIGFuZCAzMDBweCBoZWlnaHRcbiAgICAgKiovXG4gICAgc3Jjc2V0U2l6ZXM6IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogU2l6ZXMgZm9yIHRoZSBpbWFnZS4gRWcuXG4gICAgICogIC0gYFwiMTAwdndcImAgLSAxMDAlIG9mIHRoZSB2aWV3cG9ydCB3aWR0aFxuICAgICAqICAtIGBcIjUwdndcImAgLSA1MCUgb2YgdGhlIHZpZXdwb3J0IHdpZHRoXG4gICAgICogIC0gYChtaW4td2lkdGg6IDMwZW0pIDMwZW1cImAgLSAzMGVtIGlmIHRoZSB2aWV3cG9ydCBpcyBhdCBsZWFzdCAzMGVtIHdpZGVcbiAgICAgKi9cbiAgICBzaXplczogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBCYWNrZ3JvdW5kIGNvbG9yIGZvciB0aGUgaW1hZ2UgaW4gaGV4LiBFZy4gYFwiMDAwMDAwXCJgXG4gICAgICovXG4gICAgYmFja2dyb3VuZENvbG9yOiBzdHJpbmcgfCBudWxsO1xuICB9O1xufVxuXG5leHBvcnQgdHlwZSBDb250ZW50ZnVsTGlua1R5cGUgPSAnU3BhY2UnIHwgJ0NvbnRlbnRUeXBlJyB8ICdFbnZpcm9ubWVudCc7XG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRmdWxMaW5rPFQgZXh0ZW5kcyBDb250ZW50ZnVsTGlua1R5cGU+IHtcbiAgdHlwZTogJ0xpbmsnO1xuICBsaW5rVHlwZTogVDtcbiAgaWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgQ29udGVudGZ1bFNwYWNlTGluayA9IENvbnRlbnRmdWxMaW5rPCdTcGFjZSc+O1xuZXhwb3J0IHR5cGUgQ29udGVudGZ1bEVudmlyb25tZW50TGluayA9IENvbnRlbnRmdWxMaW5rPCdFbnZpcm9ubWVudCc+O1xuZXhwb3J0IHR5cGUgQ29udGVudGZ1bENvbnRlbnRUeXBlTGluayA9IENvbnRlbnRmdWxMaW5rPCdDb250ZW50VHlwZSc+O1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRmdWxUYWdMaW5rIHtcbiAgc3lzOiB7XG4gICAgdHlwZTogJ0xpbmsnO1xuICAgIGxpbmtUeXBlOiAnVGFnJztcbiAgICBpZDogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRmdWxNZXRhZGF0YSB7XG4gIHRhZ3M6IENvbnRlbnRmdWxUYWdMaW5rW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudGZ1bFN5cyB7XG4gIHR5cGU6IHN0cmluZztcbiAgaWQ6IHN0cmluZztcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gIHVwZGF0ZWRBdDogc3RyaW5nO1xuICBsb2NhbGU6IHN0cmluZztcbiAgcmV2aXNpb24/OiBudW1iZXI7XG4gIHNwYWNlPzoge1xuICAgIHN5czogQ29udGVudGZ1bFNwYWNlTGluaztcbiAgfTtcbiAgZW52aXJvbm1lbnQ/OiB7XG4gICAgc3lzOiBDb250ZW50ZnVsRW52aXJvbm1lbnRMaW5rO1xuICB9O1xuICBjb250ZW50VHlwZToge1xuICAgIHN5czogQ29udGVudGZ1bENvbnRlbnRUeXBlTGluaztcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb250ZW50ZnVsQXNzZXRJbWFnZURhdGEge1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb250ZW50ZnVsQXNzZXRGaWxlRGF0YSB7XG4gIHVybDogc3RyaW5nO1xuICBkZXRhaWxzOiB7XG4gICAgc2l6ZTogbnVtYmVyO1xuICAgIGltYWdlPzogQ29udGVudGZ1bEFzc2V0SW1hZ2VEYXRhO1xuICB9O1xuICBmaWxlTmFtZTogc3RyaW5nO1xuICBjb250ZW50VHlwZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRmdWxBc3NldCB7XG4gIHN5czogQ29udGVudGZ1bFN5cztcbiAgZmllbGRzOiB7XG4gICAgdGl0bGU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIGZpbGU6IENvbnRlbnRmdWxBc3NldEZpbGVEYXRhO1xuICB9O1xuICBtZXRhZGF0YTogQ29udGVudGZ1bE1ldGFkYXRhO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGludGVyZmFjZSBDb250ZW50ZnVsRW50cnk8VCA9IHsgW2tleTogc3RyaW5nXTogYW55IH0+IHtcbiAgc3lzOiBDb250ZW50ZnVsU3lzO1xuICBmaWVsZHM6IFQ7XG4gIG1ldGFkYXRhOiBDb250ZW50ZnVsTWV0YWRhdGE7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudGZ1bENvbGxlY3Rpb24ge1xuICBpbmNsdWRlczoge1xuICAgIEFzc2V0OiBDb250ZW50ZnVsQXNzZXRbXTtcbiAgICBFbnRyeTogQ29udGVudGZ1bEVudHJ5W107XG4gIH07XG4gIGl0ZW1zOiBDb250ZW50ZnVsRW50cnlbXTtcbiAgbGltaXQ6IG51bWJlcjtcbiAgc2tpcDogbnVtYmVyO1xuICB0b3RhbDogbnVtYmVyO1xuICBzeXM6IHtcbiAgICB0eXBlOiAnQXJyYXknO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJpY2hUZXh0UmVzcG9uc2Uge1xuICBub2RlVHlwZTogJ2RvY3VtZW50JztcbiAgZGF0YTogTm9kZURhdGE7XG4gIGNvbnRlbnQ6IEJsb2NrW107XG59XG4iXX0=
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudGZ1bC50eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29udGVudGZ1bC9zcmMvbGliL3R5cGVzL2NvbnRlbnRmdWwudHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudFR5cGUgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IElucHV0U2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCbG9jaywgTm9kZURhdGEgfSBmcm9tICdAY29udGVudGZ1bC9yaWNoLXRleHQtdHlwZXMnO1xuaW1wb3J0IHsgQ29udGVudGZ1bEluY2x1ZGVNYXAgfSBmcm9tICcuLi9jb21wb25lbnRzL3JpY2gtdGV4dC1yZW5kZXJlcic7XG5cbmV4cG9ydCB0eXBlIENvbnRlbnRmdWxJbWFnZVJlc2l6ZUJlaGF2aW9yID0gJ3BhZCcgfCAnY3JvcCcgfCAnZmlsbCcgfCAnc2NhbGUnIHwgJ3RodW1iJyB8ICdmaXQnO1xuZXhwb3J0IHR5cGUgQ29udGVudGZ1bEltYWdlRm9jdXNBcmVhID1cbiAgfCAndG9wJ1xuICB8ICdib3R0b20nXG4gIHwgJ2xlZnQnXG4gIHwgJ3JpZ2h0J1xuICB8ICdjZW50ZXInXG4gIHwgJ3RvcF9sZWZ0J1xuICB8ICd0b3BfcmlnaHQnXG4gIHwgJ2JvdHRvbV9sZWZ0J1xuICB8ICdib3R0b21fcmlnaHQnXG4gIHwgJ2ZhY2UnXG4gIHwgJ2ZhY2VzJztcblxudHlwZSBDb21wb25lbnRMaWtlV2l0aEFzc2V0ID0gQ29tcG9uZW50VHlwZTx7IGFzc2V0OiBJbnB1dFNpZ25hbDxDb250ZW50ZnVsQXNzZXQgfCBudWxsIHwgdW5kZWZpbmVkPiB9PjtcbnR5cGUgQ29tcG9uZW50TGlrZVdpdGhDb250ZW50ZnVsUmVuZGVyZXJJbnB1dHMgPSBDb21wb25lbnRUeXBlPHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgZmllbGRzPzogSW5wdXRTaWduYWw8YW55PjtcblxuICBpbmNsdWRlcz86IElucHV0U2lnbmFsPENvbnRlbnRmdWxJbmNsdWRlTWFwPjtcblxuICBtZXRhZGF0YT86IElucHV0U2lnbmFsPENvbnRlbnRmdWxNZXRhZGF0YT47XG5cbiAgc3lzPzogSW5wdXRTaWduYWw8Q29udGVudGZ1bFN5cz47XG59PjtcblxuZXhwb3J0IGludGVyZmFjZSBDb250ZW50ZnVsQXNzZXRDb21wb25lbnRzIHtcbiAgZmlsZTogQ29tcG9uZW50TGlrZVdpdGhBc3NldDtcbiAgaW1hZ2U6IENvbXBvbmVudExpa2VXaXRoQXNzZXQ7XG4gIHZpZGVvOiBDb21wb25lbnRMaWtlV2l0aEFzc2V0O1xuICBhdWRpbzogQ29tcG9uZW50TGlrZVdpdGhBc3NldDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb250ZW50ZnVsQ29uZmlnIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgY29tcG9uZW50cyBmb3IgcmVuZGVyaW5nIGNvbnRlbnRmdWwgYXNzZXRzXG4gICAqL1xuICBjb21wb25lbnRzOiBDb250ZW50ZnVsQXNzZXRDb21wb25lbnRzO1xuXG4gIC8qKlxuICAgKiBDb21wb25lbnQgZm9yIHJlbmRlcmluZyBlbWJlZGRlZCBlbnRyaWVzXG4gICAqL1xuICBjdXN0b21Db21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCBDb21wb25lbnRMaWtlV2l0aENvbnRlbnRmdWxSZW5kZXJlcklucHV0cz47XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgdGhlIGNvbnRlbnRmdWwgcmljaCB0ZXh0IHJlbmRlcmVyIHNob3VsZCByZW5kZXIgdGhlIGNvbnRlbnRmdWwgcmljaCB0ZXh0IHdpdGggdGFpbHdpbmQgY3NzIGNsYXNzZXNcbiAgICovXG4gIHVzZVRhaWx3aW5kQ2xhc3NlczogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGVmYXVsdCBvcHRpb25zIGZvciB0aGUgY29udGVudGZ1bCBpbWFnZSBhcGlcbiAgICovXG4gIGltYWdlT3B0aW9uczoge1xuICAgIC8qKlxuICAgICAqIFNvdXJjZSBzZXQgc2l6ZXMuIEVnLlxuICAgICAqIC0gYFwiNDAwXCJgIC0gNDAwcHggd2lkdGhcbiAgICAgKiAtIGBcIjQwMHgzMDBcImAgLSA0MDBweCB3aWR0aCBhbmQgMzAwcHggaGVpZ2h0XG4gICAgICogLSBgXCI0MDB3XCJgIC0gNDAwcHggd2lkdGhcbiAgICAgKiAtIGBcIjQwMGhcImAgLSA0MDBweCBoZWlnaHRcbiAgICAgKiAtIGBcIjQwMHd4MzAwaFwiYCAtIDQwMHB4IHdpZHRoIGFuZCAzMDBweCBoZWlnaHRcbiAgICAgKiovXG4gICAgc3Jjc2V0U2l6ZXM6IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogU2l6ZXMgZm9yIHRoZSBpbWFnZS4gRWcuXG4gICAgICogIC0gYFwiMTAwdndcImAgLSAxMDAlIG9mIHRoZSB2aWV3cG9ydCB3aWR0aFxuICAgICAqICAtIGBcIjUwdndcImAgLSA1MCUgb2YgdGhlIHZpZXdwb3J0IHdpZHRoXG4gICAgICogIC0gYChtaW4td2lkdGg6IDMwZW0pIDMwZW1cImAgLSAzMGVtIGlmIHRoZSB2aWV3cG9ydCBpcyBhdCBsZWFzdCAzMGVtIHdpZGVcbiAgICAgKi9cbiAgICBzaXplczogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBCYWNrZ3JvdW5kIGNvbG9yIGZvciB0aGUgaW1hZ2UgaW4gaGV4LiBFZy4gYFwiMDAwMDAwXCJgXG4gICAgICovXG4gICAgYmFja2dyb3VuZENvbG9yOiBzdHJpbmcgfCBudWxsO1xuICB9O1xufVxuXG5leHBvcnQgdHlwZSBDb250ZW50ZnVsTGlua1R5cGUgPSAnU3BhY2UnIHwgJ0NvbnRlbnRUeXBlJyB8ICdFbnZpcm9ubWVudCcgfCAnRW50cnknIHwgJ0Fzc2V0JyB8ICdUYWcnO1xuZXhwb3J0IGludGVyZmFjZSBDb250ZW50ZnVsTGluazxUIGV4dGVuZHMgQ29udGVudGZ1bExpbmtUeXBlPiB7XG4gIHR5cGU6ICdMaW5rJztcbiAgbGlua1R5cGU6IFQ7XG4gIGlkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIENvbnRlbnRmdWxTcGFjZUxpbmsgPSBDb250ZW50ZnVsTGluazwnU3BhY2UnPjtcbmV4cG9ydCB0eXBlIENvbnRlbnRmdWxFbnZpcm9ubWVudExpbmsgPSBDb250ZW50ZnVsTGluazwnRW52aXJvbm1lbnQnPjtcbmV4cG9ydCB0eXBlIENvbnRlbnRmdWxDb250ZW50VHlwZUxpbmsgPSBDb250ZW50ZnVsTGluazwnQ29udGVudFR5cGUnPjtcbmV4cG9ydCB0eXBlIENvbnRlbnRmdWxFbnRyeUxpbmsgPSBDb250ZW50ZnVsTGluazwnRW50cnknPjtcbmV4cG9ydCB0eXBlIENvbnRlbnRmdWxBc3NldExpbmsgPSBDb250ZW50ZnVsTGluazwnQXNzZXQnPjtcbmV4cG9ydCB0eXBlIENvbnRlbnRmdWxUYWdMaW5rID0gQ29udGVudGZ1bExpbms8J1RhZyc+O1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRmdWxUYWdMaW5rSXRlbSB7XG4gIHN5czogQ29udGVudGZ1bFRhZ0xpbms7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudGZ1bEVudHJ5TGlua0l0ZW0ge1xuICBzeXM6IENvbnRlbnRmdWxFbnRyeUxpbms7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudGZ1bEFzc2V0TGlua0l0ZW0ge1xuICBzeXM6IENvbnRlbnRmdWxBc3NldExpbms7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudGZ1bE1ldGFkYXRhIHtcbiAgdGFnczogQ29udGVudGZ1bFRhZ0xpbmtJdGVtW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudGZ1bFN5cyB7XG4gIHR5cGU6IHN0cmluZztcbiAgaWQ6IHN0cmluZztcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gIHVwZGF0ZWRBdDogc3RyaW5nO1xuICBsb2NhbGU6IHN0cmluZztcbiAgcmV2aXNpb24/OiBudW1iZXI7XG4gIHNwYWNlPzoge1xuICAgIHN5czogQ29udGVudGZ1bFNwYWNlTGluaztcbiAgfTtcbiAgZW52aXJvbm1lbnQ/OiB7XG4gICAgc3lzOiBDb250ZW50ZnVsRW52aXJvbm1lbnRMaW5rO1xuICB9O1xuICBjb250ZW50VHlwZToge1xuICAgIHN5czogQ29udGVudGZ1bENvbnRlbnRUeXBlTGluaztcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb250ZW50ZnVsQXNzZXRJbWFnZURhdGEge1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb250ZW50ZnVsQXNzZXRGaWxlRGF0YSB7XG4gIHVybDogc3RyaW5nO1xuICBkZXRhaWxzOiB7XG4gICAgc2l6ZTogbnVtYmVyO1xuICAgIGltYWdlPzogQ29udGVudGZ1bEFzc2V0SW1hZ2VEYXRhO1xuICB9O1xuICBmaWxlTmFtZTogc3RyaW5nO1xuICBjb250ZW50VHlwZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRmdWxBc3NldCB7XG4gIHN5czogQ29udGVudGZ1bFN5cztcbiAgZmllbGRzOiB7XG4gICAgdGl0bGU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIGZpbGU6IENvbnRlbnRmdWxBc3NldEZpbGVEYXRhO1xuICB9O1xuICBtZXRhZGF0YTogQ29udGVudGZ1bE1ldGFkYXRhO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGludGVyZmFjZSBDb250ZW50ZnVsRW50cnk8VCA9IHsgW2tleTogc3RyaW5nXTogYW55IH0+IHtcbiAgc3lzOiBDb250ZW50ZnVsU3lzO1xuICBmaWVsZHM6IFQ7XG4gIG1ldGFkYXRhOiBDb250ZW50ZnVsTWV0YWRhdGE7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudGZ1bENvbGxlY3Rpb24ge1xuICBpbmNsdWRlczoge1xuICAgIEFzc2V0OiBDb250ZW50ZnVsQXNzZXRbXTtcbiAgICBFbnRyeTogQ29udGVudGZ1bEVudHJ5W107XG4gIH07XG4gIGl0ZW1zOiBDb250ZW50ZnVsRW50cnlbXTtcbiAgbGltaXQ6IG51bWJlcjtcbiAgc2tpcDogbnVtYmVyO1xuICB0b3RhbDogbnVtYmVyO1xuICBzeXM6IHtcbiAgICB0eXBlOiAnQXJyYXknO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJpY2hUZXh0UmVzcG9uc2Uge1xuICBub2RlVHlwZTogJ2RvY3VtZW50JztcbiAgZGF0YTogTm9kZURhdGE7XG4gIGNvbnRlbnQ6IEJsb2NrW107XG59XG4iXX0=
@@ -1,6 +1,6 @@
1
1
  import { NgClass, DOCUMENT } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
- import { input, Component, ChangeDetectionStrategy, ViewEncapsulation, InjectionToken, inject, numberAttribute, booleanAttribute, computed, ViewContainerRef, Renderer2, ElementRef } from '@angular/core';
3
+ import { input, Component, ChangeDetectionStrategy, ViewEncapsulation, InjectionToken, inject, numberAttribute, booleanAttribute, computed, ViewContainerRef, Renderer2, ElementRef, isDevMode } from '@angular/core';
4
4
  import { normalizePictureSizes, PictureComponent } from '@ethlete/cdk';
5
5
  import { toSignal, toObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';
6
6
  import { INLINES, BLOCKS } from '@contentful/rich-text-types';
@@ -473,7 +473,7 @@ const isExecutedHtmlOrTextCommandCacheItem = (cache) => {
473
473
  const isExecutedTextCommandCacheItem = (cache) => {
474
474
  return isTextRenderCommand(cache.command);
475
475
  };
476
- const ANY_ENTRY_SYS_ID = '$$$_et-any-entry-sys-id';
476
+ const ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID = '$$$_et-contentful-any-entry-content-type-sys-id';
477
477
  class ContentfulRichTextRendererComponent {
478
478
  constructor() {
479
479
  this._viewContainerRef = inject(ViewContainerRef);
@@ -508,26 +508,47 @@ class ContentfulRichTextRendererComponent {
508
508
  const assetMap = new Map(assets?.map((asset) => [asset.sys.id, asset]) ?? []);
509
509
  const entryMap = new Map(entries?.map((entry) => [entry.sys.id, entry]) ?? []);
510
510
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
511
- const getEntry = (id, sysId) => {
511
+ const getEntry = (id, contentTypeId) => {
512
512
  const entry = entryMap.get(id);
513
513
  if (!entry) {
514
+ if (isDevMode()) {
515
+ console.warn('Entry not found! Will return null. Is the include query param to low?', { id, entryMap });
516
+ }
514
517
  return null;
515
518
  }
516
- if (sysId === ANY_ENTRY_SYS_ID) {
519
+ if (contentTypeId === ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID) {
517
520
  return entry;
518
521
  }
519
- if (entry.sys.id !== sysId) {
520
- console.warn('Entry sys ID does not match the provided sys ID! Will return null.', { entry, sysId });
522
+ if (entry.sys.contentType.sys.id !== contentTypeId) {
523
+ if (isDevMode()) {
524
+ console.warn('Entry sys ID does not match the provided sys ID! Will return null.', {
525
+ entry,
526
+ sysId: contentTypeId,
527
+ });
528
+ }
521
529
  return null;
522
530
  }
523
531
  return entry;
524
532
  };
533
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
534
+ const getEntries = (ids, contentTypeId) => {
535
+ const entries = ids
536
+ .map((id) => (typeof id === 'string' ? id : id.sys.id))
537
+ .map((id) => getEntry(id, contentTypeId))
538
+ .filter((entry) => entry !== null);
539
+ return entries;
540
+ };
525
541
  const getAsset = (id) => {
526
542
  return assetMap.get(id) ?? null;
527
543
  };
544
+ const getAssets = (ids) => {
545
+ return ids.map((id) => getAsset(id)).filter((asset) => asset !== null);
546
+ };
528
547
  return {
529
548
  getEntry,
549
+ getEntries,
530
550
  getAsset,
551
+ getAssets,
531
552
  };
532
553
  });
533
554
  /**
@@ -739,7 +760,7 @@ class ContentfulRichTextRendererComponent {
739
760
  if (!entryId) {
740
761
  throw richTextRendererError('entry_id_not_found', false, { node });
741
762
  }
742
- const entry = this.contentIncludesMap().getEntry(entryId, ANY_ENTRY_SYS_ID);
763
+ const entry = this.contentIncludesMap().getEntry(entryId, ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID);
743
764
  if (!entry) {
744
765
  throw richTextRendererError('entry_not_found', false, { entryId, node });
745
766
  }
@@ -1127,5 +1148,5 @@ const provideContentfulConfig = (contentfulConfig = {}) => {
1127
1148
  * Generated bundle index. Do not edit.
1128
1149
  */
1129
1150
 
1130
- export { COMPONENT_RENDER_COMMAND_POSITION, CONTENTFUL_CONFIG, ContentfulAudioComponent, ContentfulFileComponent, ContentfulImageComponent, ContentfulImports, ContentfulRichTextRendererComponent, ContentfulVideoComponent, GQL_FRAGMENT_CONTENTFUL_ASSET, HTML_CLOSE_RENDER_COMMAND_POSITION, HTML_OPEN_RENDER_COMMAND_POSITION, RENDER_COMMAND_POSITION, RENDER_COMMAND_TYPE, RENDER_INSTRUCTION_POSITION, RENDER_INSTRUCTION_TYPE, TEXT_RENDER_COMMAND_POSITION, createContentfulConfig, generateContentfulImageSources, generateDefaultContentfulImageSource, getRenderCommandId, isComponentRenderCommand, isExecutedComponentCommandCacheItem, isExecutedHtmlOrTextCommandCacheItem, isExecutedTextCommandCacheItem, isHtmlCloseRenderCommand, isHtmlOpenRenderCommand, isRichTextRootNode, isTextRenderCommand, marksToClass, parseContentfulImageSize, provideContentfulConfig, translateContentfulNodeTypeToHtmlTag };
1151
+ export { COMPONENT_RENDER_COMMAND_POSITION, CONTENTFUL_CONFIG, ContentfulAudioComponent, ContentfulFileComponent, ContentfulImageComponent, ContentfulImports, ContentfulRichTextRendererComponent, ContentfulVideoComponent, ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID, GQL_FRAGMENT_CONTENTFUL_ASSET, HTML_CLOSE_RENDER_COMMAND_POSITION, HTML_OPEN_RENDER_COMMAND_POSITION, RENDER_COMMAND_POSITION, RENDER_COMMAND_TYPE, RENDER_INSTRUCTION_POSITION, RENDER_INSTRUCTION_TYPE, TEXT_RENDER_COMMAND_POSITION, createContentfulConfig, generateContentfulImageSources, generateDefaultContentfulImageSource, getRenderCommandId, isComponentRenderCommand, isExecutedComponentCommandCacheItem, isExecutedHtmlOrTextCommandCacheItem, isExecutedTextCommandCacheItem, isHtmlCloseRenderCommand, isHtmlOpenRenderCommand, isRichTextRootNode, isTextRenderCommand, marksToClass, parseContentfulImageSize, provideContentfulConfig, translateContentfulNodeTypeToHtmlTag };
1131
1152
  //# sourceMappingURL=ethlete-contentful.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ethlete-contentful.mjs","sources":["../../../../libs/contentful/src/lib/components/audio/contentful-audio.component.ts","../../../../libs/contentful/src/lib/components/file/contentful-file.component.ts","../../../../libs/contentful/src/lib/constants/contentful.constants.ts","../../../../libs/contentful/src/lib/components/image/contentful-image.component.utils.ts","../../../../libs/contentful/src/lib/components/image/contentful-image.component.ts","../../../../libs/contentful/src/lib/components/video/contentful-video.component.ts","../../../../libs/contentful/src/lib/utils/contentful-config.ts","../../../../libs/contentful/src/lib/components/rich-text-renderer/rich-text-renderer.errors.ts","../../../../libs/contentful/src/lib/components/rich-text-renderer/rich-text-renderer.util.ts","../../../../libs/contentful/src/lib/components/rich-text-renderer/rich-text-renderer.component.ts","../../../../libs/contentful/src/lib/contentful.imports.ts","../../../../libs/contentful/src/lib/gql/asset.fragments.ts","../../../../libs/contentful/src/lib/utils/contentful.util.ts","../../../../libs/contentful/src/index.ts","../../../../libs/contentful/src/ethlete-contentful.ts"],"sourcesContent":["import { NgClass } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation, input } from '@angular/core';\nimport { NgClassType } from '@ethlete/core';\nimport { ContentfulAsset } from '../../types';\n\n@Component({\n selector: 'et-contentful-audio',\n template: `\n @if (asset(); as data) {\n <figure [ngClass]=\"figureClass()\">\n <figcaption [ngClass]=\"figcaptionClass()\">{{ data.fields.title }}</figcaption>\n <audio [ngClass]=\"audioClass()\" controls src=\"{{ data.fields.file.url }}\"></audio>\n </figure>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [NgClass],\n})\nexport class ContentfulAudioComponent {\n asset = input.required<ContentfulAsset | null | undefined>();\n audioClass = input<NgClassType>(null);\n figureClass = input<NgClassType>(null);\n figcaptionClass = input<NgClassType>(null);\n}\n","import { NgClass } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation, input } from '@angular/core';\nimport { NgClassType } from '@ethlete/core';\nimport { ContentfulAsset } from '../../types';\n\n@Component({\n selector: 'et-contentful-file',\n template: `\n @if (asset(); as data) {\n <a [href]=\"data.fields.file.url\" [ngClass]=\"fileClass()\" class=\"underline\" target=\"_blank\">\n {{ data.fields.title }} ({{ data.fields.file.details.size }} Bytes)\n </a>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [NgClass],\n})\nexport class ContentfulFileComponent {\n asset = input.required<ContentfulAsset | null | undefined>();\n fileClass = input<NgClassType>(null);\n}\n","import { InjectionToken } from '@angular/core';\n\nimport { ContentfulConfig } from '../types';\n\nexport const CONTENTFUL_CONFIG = new InjectionToken<ContentfulConfig>('ContentfulConfig');\n","import { PictureSource } from '@ethlete/cdk';\nimport { ContentfulAsset, ContentfulImageFocusArea, ContentfulImageResizeBehavior } from '../../types';\n\nexport const generateDefaultContentfulImageSource = (data: ContentfulAsset): PictureSource => {\n const file = data.fields.file;\n\n return {\n type: file.contentType,\n srcset: file.url,\n };\n};\n\n/**\n * Parses source set sizes into an object containing with and height. Eg.\n * - `\"400\"` - 400px width\n * - `\"400x300\"` - 400px width and 300px height\n * - `\"400w\"` - 400px width\n * - `\"400h\"` - 400px height\n * - `\"400wx300h\"` - 400px width and 300px height\n **/\nexport const parseContentfulImageSize = (size: string): { width: number | null; height: number | null } => {\n let width: string | null | undefined = null;\n let height: string | null | undefined = null;\n\n if (size.includes('x')) {\n const [w, h] = size.split('x');\n\n width = w;\n height = h;\n } else if (size.includes('h')) {\n height = size;\n } else {\n width = size;\n }\n\n return {\n width: width ? parseInt(width, 10) : null,\n height: height ? parseInt(height, 10) : null,\n };\n};\n\nexport const generateContentfulImageSources = (\n data: ContentfulAsset,\n srcsetSizes: string[],\n backgroundColor: string | null,\n quality: number | null,\n focusArea: ContentfulImageFocusArea | null,\n resizeBehavior: ContentfulImageResizeBehavior | null,\n): PictureSource[] => {\n const assetData = data;\n\n if (!assetData) {\n return [];\n }\n\n const sources: PictureSource[] = [];\n\n const SOURCE_TYPES = ['image/avif', 'image/webp', 'image/png', 'image/jpg'];\n\n for (const type of SOURCE_TYPES) {\n const baseUrl = assetData.fields.file.url;\n const sourceSets: string[] = [];\n const queryParams: string[] = [];\n\n // Set the format (e.g. 'fm=webp')\n queryParams.push(`fm=${type.split('/')[1]}`);\n\n if (backgroundColor) {\n queryParams.push(`bg=rgb:${backgroundColor}`);\n }\n\n if (quality !== null) {\n queryParams.push(`q=${quality}`);\n }\n\n if (focusArea) {\n queryParams.push(`f=${focusArea}`);\n }\n\n if (resizeBehavior) {\n queryParams.push(`fit=${resizeBehavior}`);\n }\n if (srcsetSizes?.length) {\n const urlWithParams = `${baseUrl}?${queryParams.join('&')}`;\n\n for (const size of srcsetSizes) {\n const { width, height } = parseContentfulImageSize(size);\n\n if (width && height) {\n sourceSets.push(`${urlWithParams}&w=${width}&h=${height} ${width}w`);\n } else if (width) {\n sourceSets.push(`${urlWithParams}&w=${width} ${width}w`);\n } else if (height) {\n sourceSets.push(`${urlWithParams}&h=${height} ${height}h`);\n }\n }\n }\n\n sources.push({\n type,\n srcset: sourceSets.length ? sourceSets.join(', ') : `${baseUrl}?${queryParams.join('&')}`,\n });\n }\n\n return sources;\n};\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n inject,\n input,\n numberAttribute,\n} from '@angular/core';\nimport { PictureComponent, normalizePictureSizes } from '@ethlete/cdk';\nimport { NgClassType } from '@ethlete/core';\nimport { CONTENTFUL_CONFIG } from '../../constants';\nimport { ContentfulAsset, ContentfulImageFocusArea, ContentfulImageResizeBehavior } from '../../types';\nimport {\n generateContentfulImageSources,\n generateDefaultContentfulImageSource,\n} from './contentful-image.component.utils';\n\n@Component({\n selector: 'et-contentful-image',\n template: `\n <et-picture\n [imgClass]=\"imgClass()\"\n [hasPriority]=\"hasPriority()\"\n [figureClass]=\"figureClass()\"\n [pictureClass]=\"pictureClass()\"\n [figcaptionClass]=\"figcaptionClass()\"\n [defaultSrc]=\"_defaultSrc()\"\n [alt]=\"asset()?.fields?.title ?? null\"\n [figcaption]=\"asset()?.fields?.description ?? null\"\n [width]=\"asset()?.fields?.file?.details?.image?.width ?? null\"\n [height]=\"asset()?.fields?.file?.details?.image?.height ?? null\"\n [sizes]=\"sizes()\"\n [sources]=\"_sources()\"\n />\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [PictureComponent],\n host: {\n class: 'et-contentful-image',\n },\n})\nexport class ContentfulImageComponent {\n _contentfulConfig = inject(CONTENTFUL_CONFIG);\n\n asset = input.required<ContentfulAsset | null | undefined>();\n backgroundColor = input<string | null>(null);\n srcsetSizes = input<string[]>(this._contentfulConfig.imageOptions.srcsetSizes);\n\n quality = input(null, { transform: numberAttribute });\n focusArea = input<ContentfulImageFocusArea | null>(null);\n resizeBehavior = input<ContentfulImageResizeBehavior | null>(null);\n hasPriority = input(false, { transform: booleanAttribute });\n imgClass = input<NgClassType>(null);\n figureClass = input<NgClassType>(null);\n figcaptionClass = input<NgClassType>(null);\n pictureClass = input<NgClassType>(null);\n sizes = input<string | null, string[] | string | null>(\n normalizePictureSizes(this._contentfulConfig.imageOptions.sizes),\n {\n transform: (v) => normalizePictureSizes(v),\n },\n );\n\n _sources = computed(() => {\n const asset = this.asset();\n const backgroundColor = this.backgroundColor();\n const srcsetSizes = this.srcsetSizes();\n const quality = this.quality();\n const focusArea = this.focusArea();\n const resizeBehavior = this.resizeBehavior();\n\n if (!asset) {\n return [];\n }\n\n return generateContentfulImageSources(asset, srcsetSizes, backgroundColor, quality, focusArea, resizeBehavior);\n });\n\n _defaultSrc = computed(() => {\n const asset = this.asset();\n\n return asset ? generateDefaultContentfulImageSource(asset) : null;\n });\n}\n","import { NgClass } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation, input } from '@angular/core';\nimport { NgClassType } from '@ethlete/core';\nimport { ContentfulAsset } from '../../types';\n\n@Component({\n selector: 'et-contentful-video',\n template: `\n @if (asset(); as data) {\n <video [ngClass]=\"videoClass()\" controls>\n <source src=\"{{ data.fields.file.url }}\" type=\"{{ data.fields.file.contentType }}\" />\n </video>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [NgClass],\n})\nexport class ContentfulVideoComponent {\n asset = input.required<ContentfulAsset | null | undefined>();\n videoClass = input<NgClassType>(null);\n}\n","import { ContentfulAudioComponent } from '../components/audio';\nimport { ContentfulFileComponent } from '../components/file';\nimport { ContentfulImageComponent } from '../components/image';\nimport { ContentfulVideoComponent } from '../components/video';\nimport { ContentfulConfig } from '../types';\n\nexport const createContentfulConfig = (\n config: Partial<ContentfulConfig> | null | undefined = {},\n): ContentfulConfig => ({\n // This default config must be inline and not saved inside a const for some weird webpack reason\n ...{\n useTailwindClasses: false,\n components: {\n audio: ContentfulAudioComponent,\n file: ContentfulFileComponent,\n image: ContentfulImageComponent,\n video: ContentfulVideoComponent,\n },\n customComponents: {},\n imageOptions: {\n srcsetSizes: ['375w', '1280w', '1920w', '2560w'],\n sizes: [],\n backgroundColor: null,\n },\n },\n ...(config || {}),\n});\n","import { RuntimeError } from '@ethlete/core';\n\nexport const RICH_TEXT_RENDERER_ERRORS = {\n rich_text_undefined:\n 'The property value given at richTextPath is undefined. Use the richTextPath input to specify the path to the rich text object.',\n rich_text_wrong_type:\n 'The rich text object does not satisfy the RichTextResponse interface. It should contain a property named \"nodeType\" with the value \"document\".',\n\n asset_id_not_found: 'The asset ID was not found. This node is not supported.',\n entry_id_not_found: 'The entry ID was not found. This node is not supported.',\n\n asset_not_found: 'The asset was not found. This node is not supported.',\n entry_not_found: 'The entry was not found. This node is not supported.',\n\n custom_component_not_found: 'No custom component found for entry type. Please provide one for this type.',\n\n text_parent_not_found: 'The parent node is not found. This structure is not supported.',\n text_parent_wrong_type:\n 'The parent node neither a html element nor a custom component. This structure is not supported.',\n} as const;\n\nconst RICH_TEXT_RENDERER_ERROR_CODES = Object.keys(RICH_TEXT_RENDERER_ERRORS).reduce(\n (acc, key, index) => {\n acc[key as keyof typeof RICH_TEXT_RENDERER_ERRORS] = index;\n return acc;\n },\n {} as Record<keyof typeof RICH_TEXT_RENDERER_ERRORS, number>,\n);\n\nexport const richTextRendererError = (\n code: keyof typeof RICH_TEXT_RENDERER_ERRORS,\n devOnly: boolean,\n data?: unknown,\n) => {\n const message = `<et-contentful-rich-text-renderer>: ${RICH_TEXT_RENDERER_ERRORS[code]}`;\n\n throw new RuntimeError(RICH_TEXT_RENDERER_ERROR_CODES[code], message, devOnly, data);\n};\n","import { BLOCKS, INLINES } from '@contentful/rich-text-types';\nimport { isObject } from '@ethlete/core';\nimport { RichTextResponse } from '../../types';\n\nexport const isRichTextRootNode = (node: unknown): node is RichTextResponse => {\n return isObject(node) && 'nodeType' in node && node['nodeType'] === 'document';\n};\n\nexport const translateContentfulNodeTypeToHtmlTag = (nodeType: 'text' | BLOCKS | INLINES) => {\n switch (nodeType) {\n case BLOCKS.HEADING_1:\n return 'h1';\n case BLOCKS.HEADING_2:\n return 'h2';\n case BLOCKS.HEADING_3:\n return 'h3';\n case BLOCKS.HEADING_4:\n return 'h4';\n case BLOCKS.HEADING_5:\n return 'h5';\n case BLOCKS.HEADING_6:\n return 'h6';\n case BLOCKS.PARAGRAPH:\n return 'p';\n case BLOCKS.UL_LIST:\n return 'ul';\n case BLOCKS.OL_LIST:\n return 'ol';\n case BLOCKS.LIST_ITEM:\n return 'li';\n case BLOCKS.HR:\n return 'hr';\n case BLOCKS.QUOTE:\n return 'blockquote';\n case BLOCKS.TABLE:\n return 'table';\n case BLOCKS.TABLE_ROW:\n return 'tr';\n case BLOCKS.TABLE_CELL:\n return 'td';\n case BLOCKS.TABLE_HEADER_CELL:\n return 'th';\n case BLOCKS.EMBEDDED_ASSET:\n return 'div';\n\n case INLINES.HYPERLINK:\n return 'a';\n case INLINES.ENTRY_HYPERLINK:\n return 'a';\n case INLINES.ASSET_HYPERLINK:\n return 'a';\n\n case 'text':\n return 'span';\n\n // Will be ignored by the renderer\n case 'document':\n return 'document';\n\n case BLOCKS.EMBEDDED_ENTRY:\n return 'div';\n case INLINES.EMBEDDED_ENTRY:\n return 'div';\n\n default:\n return 'div';\n }\n};\n","import { ComponentType } from '@angular/cdk/portal';\nimport { DOCUMENT } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ComponentRef,\n ElementRef,\n EmbeddedViewRef,\n Renderer2,\n ViewContainerRef,\n ViewEncapsulation,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { BLOCKS, Block, INLINES, Inline, Mark, Text } from '@contentful/rich-text-types';\nimport { getObjectProperty, isObject } from '@ethlete/core';\nimport { pairwise, startWith, tap } from 'rxjs';\nimport { CONTENTFUL_CONFIG } from '../../constants/contentful.constants';\nimport { ContentfulAsset, ContentfulCollection, ContentfulEntry, RichTextResponse } from '../../types';\nimport { createContentfulConfig } from '../../utils/contentful-config';\nimport { richTextRendererError } from './rich-text-renderer.errors';\nimport { isRichTextRootNode, translateContentfulNodeTypeToHtmlTag } from './rich-text-renderer.util';\n\nexport const RENDER_COMMAND_TYPE = {\n HTML_OPEN: 0,\n HTML_CLOSE: 1,\n TEXT: 2,\n COMPONENT: 3,\n} as const;\n\nexport const RENDER_COMMAND_POSITION = {\n TYPE: 0,\n NESTING_LEVEL: 1,\n DOM_POSITION: 2,\n INDEX: 3,\n} as const;\n\nexport const HTML_OPEN_RENDER_COMMAND_POSITION = {\n ATTRIBUTES: 4,\n TAG_NAME: 5,\n ELEMENT_ID: 6,\n} as const;\n\nexport const HTML_CLOSE_RENDER_COMMAND_POSITION = {\n TAG_NAME: 4,\n ELEMENT_ID: 5,\n} as const;\n\nexport const TEXT_RENDER_COMMAND_POSITION = {\n TEXT: 4,\n} as const;\n\nexport const COMPONENT_RENDER_COMMAND_POSITION = {\n ATTRIBUTES: 4,\n COMPONENT: 5,\n INPUTS: 6,\n COMPONENT_TYPE: 7,\n} as const;\n\ntype HtmlOpenRenderCommand = [\n type: typeof RENDER_COMMAND_TYPE.HTML_OPEN,\n nestingLevel: number,\n domPosition: number,\n index: number,\n attributes: Record<string, string>,\n tagName: string,\n elementId: string,\n];\n\ntype HtmlCloseRenderCommand = [\n type: typeof RENDER_COMMAND_TYPE.HTML_CLOSE,\n nestingLevel: number,\n domPosition: number,\n index: number,\n tagName: string,\n elementId: string,\n];\n\ntype TextRenderCommand = [\n type: typeof RENDER_COMMAND_TYPE.TEXT,\n nestingLevel: number,\n domPosition: number,\n index: number,\n text: string,\n];\n\ntype ComponentRenderCommand = [\n type: typeof RENDER_COMMAND_TYPE.COMPONENT,\n nestingLevel: number,\n domPosition: number,\n index: number,\n attributes: Record<string, string>,\n component: ComponentType<unknown>,\n inputs: Record<string, unknown>,\n componentType: string,\n];\n\ntype RenderCommand = HtmlOpenRenderCommand | HtmlCloseRenderCommand | TextRenderCommand | ComponentRenderCommand;\n\nexport const RENDER_INSTRUCTION_POSITION = {\n TYPE: 0,\n COMMAND: 1,\n} as const;\n\nexport const RENDER_INSTRUCTION_TYPE = {\n CREATE: 0,\n UPDATE: 1,\n DELETE: 2,\n MOVE: 3,\n} as const;\n\ntype RenderInstructionTypeValue = (typeof RENDER_INSTRUCTION_TYPE)[keyof typeof RENDER_INSTRUCTION_TYPE];\n\ntype RenderInstruction = [RenderInstructionTypeValue, RenderCommand];\n\nconst MARK_TAILWIND_MAP: Record<string, string> = {\n bold: 'font-bold',\n italic: 'italic',\n underline: 'underline',\n code: 'font-mono',\n};\n\nexport const marksToClass = (marks: Mark[]) => {\n const classes: string[] = [];\n\n for (const mark of marks) {\n let klass = MARK_TAILWIND_MAP[mark.type];\n\n if (!klass) {\n console.warn(`No class found for mark type! Falling back to \"${mark.type}\".`, mark);\n\n klass = mark.type;\n }\n\n classes.push(klass);\n }\n\n return classes.join(' ');\n};\n\nexport const isHtmlOpenRenderCommand = (command: RenderCommand): command is HtmlOpenRenderCommand => {\n return command[RENDER_COMMAND_POSITION.TYPE] === RENDER_COMMAND_TYPE.HTML_OPEN;\n};\n\nexport const isHtmlCloseRenderCommand = (command: RenderCommand): command is HtmlCloseRenderCommand => {\n return command[RENDER_COMMAND_POSITION.TYPE] === RENDER_COMMAND_TYPE.HTML_CLOSE;\n};\n\nexport const isTextRenderCommand = (command: RenderCommand): command is TextRenderCommand => {\n return command[RENDER_COMMAND_POSITION.TYPE] === RENDER_COMMAND_TYPE.TEXT;\n};\n\nexport const isComponentRenderCommand = (command: RenderCommand): command is ComponentRenderCommand => {\n return command[RENDER_COMMAND_POSITION.TYPE] === RENDER_COMMAND_TYPE.COMPONENT;\n};\n\nexport const getRenderCommandId = (command: RenderCommand) => {\n if (isHtmlOpenRenderCommand(command)) {\n return command[HTML_OPEN_RENDER_COMMAND_POSITION.ELEMENT_ID];\n } else if (isHtmlCloseRenderCommand(command)) {\n return command[HTML_CLOSE_RENDER_COMMAND_POSITION.ELEMENT_ID];\n } else if (isTextRenderCommand(command)) {\n return command[TEXT_RENDER_COMMAND_POSITION.TEXT];\n } else {\n return command[COMPONENT_RENDER_COMMAND_POSITION.COMPONENT_TYPE];\n }\n};\n\nconst CLASS_ATTR = 'class';\nconst DEFAULT_COMPONENT_TYPES = {\n IMAGE: '$$$_et-image',\n VIDEO: '$$$_et-video',\n AUDIO: '$$$_et-audio',\n FILE: '$$$_et-file',\n};\n\ntype ExecutedCommandCacheItemBase = {\n element: HTMLElement;\n};\n\ntype ExecutedComponentCommandCacheItem = {\n command: ComponentRenderCommand;\n componentRef: ComponentRef<unknown>;\n} & ExecutedCommandCacheItemBase;\n\ntype ExecutedHtmlCommandCacheItem = {\n command: HtmlOpenRenderCommand | HtmlCloseRenderCommand;\n} & ExecutedCommandCacheItemBase;\n\ntype ExecutedTextCommandCacheItem = {\n command: TextRenderCommand;\n textNode: unknown;\n} & ExecutedCommandCacheItemBase;\n\ntype ExecutedCommandCacheItem =\n | ExecutedComponentCommandCacheItem\n | ExecutedHtmlCommandCacheItem\n | ExecutedTextCommandCacheItem;\n\nexport const isExecutedComponentCommandCacheItem = (\n cache: ExecutedCommandCacheItem,\n): cache is ExecutedComponentCommandCacheItem => {\n return isComponentRenderCommand(cache.command);\n};\n\nexport const isExecutedHtmlOrTextCommandCacheItem = (\n cache: ExecutedCommandCacheItem,\n): cache is ExecutedHtmlCommandCacheItem => {\n return isHtmlCloseRenderCommand(cache.command) || isHtmlOpenRenderCommand(cache.command);\n};\n\nexport const isExecutedTextCommandCacheItem = (\n cache: ExecutedCommandCacheItem,\n): cache is ExecutedTextCommandCacheItem => {\n return isTextRenderCommand(cache.command);\n};\n\nconst ANY_ENTRY_SYS_ID = '$$$_et-any-entry-sys-id';\n\nexport type ContentfulIncludeMap = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getEntry: <T extends { [key: string]: any }>(id: string, sysId: string) => ContentfulEntry<T> | null;\n getAsset: (id: string) => ContentfulAsset | null;\n};\n\n@Component({\n selector: 'et-contentful-rich-text-renderer',\n template: ``,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n host: {\n class: 'et-contentful-rich-text-renderer',\n },\n})\nexport class ContentfulRichTextRendererComponent {\n _viewContainerRef = inject(ViewContainerRef);\n _renderer = inject(Renderer2);\n _elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n _document = inject(DOCUMENT);\n _config = inject(CONTENTFUL_CONFIG, { optional: true }) ?? createContentfulConfig();\n\n /**\n * A cache for all executed commands that are not deleted.\n * This is used to keep track of all rendered elements and components.\n * The key is the render command element ID.\n */\n _executedCommandsCache = new Map<string, ExecutedCommandCacheItem>();\n\n /**\n * The contentful response gotten via their REST api.\n * @see https://www.contentful.com/developers/docs/references/content-delivery-api/#/reference/entries/entries-collection\n */\n content = input.required<ContentfulCollection | null | undefined>();\n\n /**\n * The path to where the rich text field is inside the contentful response. Dot and array notation is allowed.\n * @default \"items[0].fields.html\"\n */\n richTextPath = input.required<string>();\n\n /**\n * A map of all includes in the contentful response.\n * This is useful for looking up assets and entries that are referenced in the rich text without having to use loops.\n */\n contentIncludesMap = computed<ContentfulIncludeMap>(() => {\n const content = this.content();\n const assets = content?.includes.Asset;\n const entries = content?.includes.Entry;\n\n const assetMap = new Map(assets?.map((asset) => [asset.sys.id, asset]) ?? []);\n const entryMap = new Map(entries?.map((entry) => [entry.sys.id, entry]) ?? []);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const getEntry = <T extends { [key: string]: any }>(id: string, sysId: string) => {\n const entry = entryMap.get(id);\n\n if (!entry) {\n return null;\n }\n\n if (sysId === ANY_ENTRY_SYS_ID) {\n return entry as ContentfulEntry<T>;\n }\n\n if (entry.sys.id !== sysId) {\n console.warn('Entry sys ID does not match the provided sys ID! Will return null.', { entry, sysId });\n return null;\n }\n\n return entry as ContentfulEntry<T>;\n };\n\n const getAsset = (id: string) => {\n return assetMap.get(id) ?? null;\n };\n\n return {\n getEntry,\n getAsset,\n };\n });\n\n /**\n * The rich text data that should be rendered.\n */\n richTextData = computed(() => {\n const content = this.content();\n const richTextPath = this.richTextPath();\n\n if (!content) {\n return null;\n }\n\n const richText = getObjectProperty(content as unknown as Record<string, unknown>, richTextPath);\n\n if (!isObject(richText)) {\n throw richTextRendererError('rich_text_undefined', false, { content, richTextPath });\n }\n\n if (!isRichTextRootNode(richText)) {\n throw richTextRendererError('rich_text_wrong_type', false, { content, richTextPath });\n }\n\n return richText as RichTextResponse;\n });\n\n renderCommands = computed(() => {\n const richTextData = this.richTextData();\n\n if (!richTextData) {\n return [];\n }\n\n return this._createRenderCommands(richTextData);\n });\n\n renderCommandHistory = toSignal(\n toObservable(this.renderCommands).pipe(startWith([] as RenderCommand[]), pairwise()),\n { initialValue: [[], []] },\n );\n\n previousRenderCommandMap = computed(() => {\n const [prevCommands] = this.renderCommandHistory();\n\n const map = new Map<string | number, RenderCommand>();\n\n for (const command of prevCommands) {\n map.set(getRenderCommandId(command), command);\n }\n\n return map;\n });\n\n renderInstructions = computed(() => {\n const commands = this.renderCommands();\n const previousRenderCommandMap = new Map(this.previousRenderCommandMap());\n\n const instructions: RenderInstruction[] = [];\n\n // remove deleted components as well as all other elements\n for (const [, command] of previousRenderCommandMap) {\n if (isComponentRenderCommand(command)) {\n // keep the component around if it's still in the new commands\n if (commands.some((c) => getRenderCommandId(c) === getRenderCommandId(command))) {\n continue;\n }\n }\n\n instructions.push([RENDER_INSTRUCTION_TYPE.DELETE, command]);\n\n // remove from map to mark as used\n previousRenderCommandMap.delete(getRenderCommandId(command));\n }\n\n // Find the indexes of the commands remaining in the previousRenderCommandMap in the new commands array.\n const lastComponentIndexes: { newIndex: number; prevIndex: number; command: RenderCommand }[] = [];\n for (const [id, command] of previousRenderCommandMap) {\n const index = commands.findIndex((c) => getRenderCommandId(c) === id);\n const newCommand = commands[index]!;\n\n if (index === -1) {\n throw new Error('Command not found!');\n }\n\n lastComponentIndexes.push({\n newIndex: index,\n prevIndex: command[RENDER_COMMAND_POSITION.INDEX],\n command: newCommand,\n });\n }\n\n lastComponentIndexes.sort((a, b) => a.newIndex - b.newIndex);\n\n // check if the prevIndex are in order ascending\n // for indexes that are not in order, create a move instruction\n // for indexes that are in order, create an update instruction\n let moveCheckIndex = 0;\n while (moveCheckIndex < lastComponentIndexes.length - 1) {\n const moveCurr = lastComponentIndexes[moveCheckIndex];\n const moveNext = lastComponentIndexes[moveCheckIndex + 1];\n\n if (!moveCurr || !moveNext) {\n break;\n }\n\n if (moveCurr.prevIndex > moveNext.prevIndex) {\n lastComponentIndexes.splice(moveCheckIndex + 1, 1);\n instructions.push([RENDER_INSTRUCTION_TYPE.MOVE, moveNext.command]);\n } else {\n instructions.push([RENDER_INSTRUCTION_TYPE.UPDATE, moveNext.command]);\n moveCheckIndex++;\n }\n }\n\n for (const command of commands) {\n const id = getRenderCommandId(command);\n\n if (isComponentRenderCommand(command)) {\n const previousCommand = previousRenderCommandMap.get(id);\n\n if (!previousCommand) {\n // create\n instructions.push([RENDER_INSTRUCTION_TYPE.CREATE, command]);\n }\n } else {\n // create\n instructions.push([RENDER_INSTRUCTION_TYPE.CREATE, command]);\n }\n }\n\n return instructions;\n });\n\n constructor() {\n toObservable(this.renderInstructions)\n .pipe(\n takeUntilDestroyed(),\n tap((instructions) => {\n this._execInstructions(instructions);\n }),\n )\n .subscribe();\n }\n\n private _createRenderCommands(richTextData: RichTextResponse) {\n /** List of all render commands */\n const rootCommands: RenderCommand[] = [];\n\n /** Counter for generating unique html element IDs. */\n let elementId = 0;\n\n /** Counter for generating unique component IDs. */\n const componentIdMap = new Map<string, number>();\n\n /** The nesting level of the current node. */\n let nestingLevel = 0;\n\n /** The position (index) of the current node inside the parent node. */\n let domPosition = 0;\n\n let commandIndex = 0;\n\n const traverse = (node: Block | Inline | Text, parent: RenderCommand | null = null) => {\n switch (node.nodeType) {\n case 'text': {\n // Render media\n const type = RENDER_COMMAND_TYPE.TEXT;\n const text = node.value;\n\n if (!text) break;\n\n const command: TextRenderCommand = [type, nestingLevel, domPosition, commandIndex++, text];\n\n rootCommands.push(command);\n domPosition++;\n\n if (!parent) {\n throw richTextRendererError('text_parent_not_found', false, { node });\n }\n if (!isHtmlOpenRenderCommand(parent) && !isComponentRenderCommand(parent)) {\n throw richTextRendererError('text_parent_wrong_type', false, { node, parent });\n }\n\n const attributesPosition =\n parent[RENDER_COMMAND_POSITION.TYPE] === RENDER_COMMAND_TYPE.HTML_OPEN\n ? HTML_OPEN_RENDER_COMMAND_POSITION.ATTRIBUTES\n : COMPONENT_RENDER_COMMAND_POSITION.ATTRIBUTES;\n\n const attributes = parent[attributesPosition];\n\n if (node.marks.length) {\n const markClasses = marksToClass(node.marks);\n\n if (CLASS_ATTR in attributes) {\n attributes[CLASS_ATTR] += ` ${markClasses}`;\n } else {\n attributes[CLASS_ATTR] = markClasses;\n }\n }\n\n break;\n }\n\n case BLOCKS.EMBEDDED_ASSET: {\n // Render media\n const type = RENDER_COMMAND_TYPE.COMPONENT;\n const assetId = node.data['target']?.sys?.id;\n\n if (!assetId) {\n throw richTextRendererError('asset_id_not_found', false, { node });\n }\n\n const asset = this.contentIncludesMap().getAsset(assetId);\n\n if (!asset) {\n throw richTextRendererError('asset_not_found', false, { assetId, node });\n }\n\n const contentType = asset.fields.file.contentType;\n const assetComponents = this._config.components;\n\n const isImage = contentType.startsWith('image/');\n const isVideo = contentType.startsWith('video/');\n const isAudio = contentType.startsWith('audio/');\n\n const component = isImage\n ? assetComponents.image\n : isVideo\n ? assetComponents.video\n : isAudio\n ? assetComponents.audio\n : assetComponents.file;\n\n const componentType = isImage\n ? DEFAULT_COMPONENT_TYPES.IMAGE\n : isVideo\n ? DEFAULT_COMPONENT_TYPES.VIDEO\n : isAudio\n ? DEFAULT_COMPONENT_TYPES.AUDIO\n : DEFAULT_COMPONENT_TYPES.FILE;\n\n let componentId = componentIdMap.get(componentType) ?? -1;\n const id = componentType + ++componentId;\n componentIdMap.set(componentType, componentId);\n\n const attributes = {};\n\n const inputs = {\n asset,\n };\n\n const command: ComponentRenderCommand = [\n type,\n nestingLevel,\n domPosition,\n commandIndex++,\n attributes,\n component,\n inputs,\n id,\n ];\n\n rootCommands.push(command);\n\n domPosition++;\n\n break;\n }\n\n case BLOCKS.EMBEDDED_ENTRY:\n case INLINES.EMBEDDED_ENTRY: {\n // Render component\n const type = RENDER_COMMAND_TYPE.COMPONENT;\n const entryId = node.data['target']?.sys?.id;\n\n if (!entryId) {\n throw richTextRendererError('entry_id_not_found', false, { node });\n }\n\n const entry = this.contentIncludesMap().getEntry(entryId, ANY_ENTRY_SYS_ID);\n\n if (!entry) {\n throw richTextRendererError('entry_not_found', false, { entryId, node });\n }\n\n const componentType = entry.sys.contentType.sys.id;\n\n const component = this._config.customComponents[componentType];\n\n if (!component) {\n throw richTextRendererError('custom_component_not_found', false, {\n componentType,\n customComponents: this._config.customComponents,\n entry,\n });\n }\n\n const attributes = {};\n let componentId = componentIdMap.get(componentType) ?? -1;\n const id = componentType + ++componentId;\n componentIdMap.set(componentType, componentId);\n\n const inputs = {\n fields: entry.fields,\n metadata: entry.metadata,\n sys: entry.sys,\n includes: this.contentIncludesMap(),\n };\n\n const command: ComponentRenderCommand = [\n type,\n nestingLevel,\n domPosition,\n commandIndex++,\n attributes,\n component,\n inputs,\n id,\n ];\n\n rootCommands.push(command);\n\n domPosition++;\n\n break;\n }\n\n default: {\n const type = RENDER_COMMAND_TYPE.HTML_OPEN;\n const tag = translateContentfulNodeTypeToHtmlTag(node.nodeType);\n const attributes: Record<string, string> = {};\n const id = 'e' + elementId++;\n\n const command: HtmlOpenRenderCommand = [type, nestingLevel, domPosition, commandIndex++, attributes, tag, id];\n\n rootCommands.push(command);\n\n const domPositionAtThisLevel = domPosition;\n // Normal html elements can have children\n for (const child of node.content) {\n domPosition = 0;\n nestingLevel++;\n traverse(child, command);\n nestingLevel--;\n domPosition = domPositionAtThisLevel;\n }\n\n const lastCommand = rootCommands[rootCommands.length - 1];\n\n if (lastCommand?.[RENDER_COMMAND_POSITION.TYPE] === RENDER_COMMAND_TYPE.HTML_OPEN) {\n // If the last command is an open command, we can remove it since it's empty\n rootCommands.pop();\n } else {\n const closeId = 'e' + elementId++;\n\n const closeCommand: HtmlCloseRenderCommand = [\n RENDER_COMMAND_TYPE.HTML_CLOSE,\n nestingLevel,\n domPosition,\n commandIndex++,\n tag,\n closeId,\n ];\n rootCommands.push(closeCommand);\n\n domPosition++;\n }\n\n if (node.nodeType === INLINES.HYPERLINK) {\n const uri = node.data['uri'];\n attributes['href'] = uri;\n\n const host = this._document.location.host;\n const isExternal = !uri.includes(host);\n\n if (isExternal) {\n attributes['target'] = '_blank';\n }\n }\n\n break;\n }\n }\n };\n\n for (const node of richTextData.content) {\n traverse(node, null);\n }\n\n return rootCommands;\n }\n\n private _execInstructions(instructions: RenderInstruction[]) {\n for (const instruction of instructions) {\n const type = instruction[RENDER_INSTRUCTION_POSITION.TYPE];\n const command = instruction[RENDER_INSTRUCTION_POSITION.COMMAND];\n\n switch (type) {\n case RENDER_INSTRUCTION_TYPE.CREATE:\n this._runCreateInstruction(command);\n break;\n case RENDER_INSTRUCTION_TYPE.UPDATE:\n this._runUpdateInstruction(command);\n break;\n case RENDER_INSTRUCTION_TYPE.MOVE:\n this._runMoveInstruction(command);\n break;\n case RENDER_INSTRUCTION_TYPE.DELETE:\n this._runDeleteInstruction(command);\n break;\n }\n }\n }\n\n private _runCreateInstruction(command: RenderCommand) {\n const id = getRenderCommandId(command);\n const parentElement = this._findParent(command);\n const nextElement = this._findFollowingElement(command);\n\n if (isComponentRenderCommand(command)) {\n const componentRef = this._viewContainerRef.createComponent(command[COMPONENT_RENDER_COMMAND_POSITION.COMPONENT]);\n\n this._updateComponentInputs(command, componentRef);\n\n const rootNode = this._getComponentRootNode(componentRef);\n\n this._renderInsertOrAppend(rootNode, parentElement, nextElement);\n\n this._executedCommandsCache.set(id, {\n command,\n componentRef,\n element: rootNode,\n });\n } else if (isTextRenderCommand(command)) {\n const text = command[TEXT_RENDER_COMMAND_POSITION.TEXT];\n const textNode = this._renderer.createText(text);\n const span = this._renderer.createElement('span');\n this._renderer.appendChild(span, textNode);\n\n this._renderInsertOrAppend(span, parentElement, nextElement);\n\n this._executedCommandsCache.set(id, {\n command,\n element: span,\n textNode,\n });\n } else if (isHtmlOpenRenderCommand(command)) {\n const tag = command[HTML_OPEN_RENDER_COMMAND_POSITION.TAG_NAME];\n const attributes = command[HTML_OPEN_RENDER_COMMAND_POSITION.ATTRIBUTES];\n const element = this._renderer.createElement(tag);\n\n for (const [key, value] of Object.entries(attributes)) {\n this._renderer.setAttribute(element, key, value);\n }\n\n this._renderInsertOrAppend(element, parentElement, nextElement);\n\n this._executedCommandsCache.set(id, {\n command,\n element,\n });\n }\n }\n\n private _runUpdateInstruction(command: RenderCommand) {\n const id = getRenderCommandId(command);\n const cached = this._executedCommandsCache.get(id);\n\n if (!cached) {\n throw new Error('Cached command not found!');\n }\n\n if (isComponentRenderCommand(command)) {\n if (!isExecutedComponentCommandCacheItem(cached)) {\n throw new Error('Cached command is not a component command!');\n }\n\n const componentRef = cached.componentRef;\n\n if (!componentRef) {\n throw new Error('Component ref not found!');\n }\n\n this._updateComponentInputs(command, componentRef);\n }\n\n this._executedCommandsCache.set(id, {\n ...cached,\n command: command as any,\n });\n }\n\n private _runMoveInstruction(command: RenderCommand) {\n const id = getRenderCommandId(command);\n const cached = this._executedCommandsCache.get(id);\n\n if (!cached) {\n throw new Error('Cached command not found!');\n }\n\n if (isComponentRenderCommand(command)) {\n if (!isExecutedComponentCommandCacheItem(cached)) {\n throw new Error('Cached command is not a component command!');\n }\n\n const componentRef = cached.componentRef;\n\n if (!componentRef) {\n throw new Error('Component ref not found!');\n }\n\n const rootNode = cached.element;\n const oldParentElement = cached.element.parentElement;\n\n this._renderer.removeChild(oldParentElement, rootNode);\n\n const newParentElement = this._findParent(command);\n const nextElement = this._findFollowingElement(command);\n\n this._renderInsertOrAppend(rootNode, newParentElement, nextElement);\n\n this._updateComponentInputs(command, componentRef);\n\n this._executedCommandsCache.set(id, {\n ...cached,\n command: command as any,\n });\n }\n }\n\n private _runDeleteInstruction(command: RenderCommand) {\n const id = getRenderCommandId(command);\n const cached = this._executedCommandsCache.get(id);\n\n if (!cached) {\n if (isHtmlCloseRenderCommand(command)) {\n return;\n }\n\n throw new Error('Cached command not found!');\n }\n\n if (isComponentRenderCommand(command)) {\n if (!isExecutedComponentCommandCacheItem(cached)) {\n throw new Error('Cached command is not a component command!');\n }\n\n cached.componentRef?.destroy();\n } else if (isTextRenderCommand(command)) {\n this._renderer.removeChild(cached.element?.parentElement, cached.element);\n } else if (isHtmlOpenRenderCommand(command)) {\n this._renderer.removeChild(cached.element?.parentElement, cached.element);\n }\n\n this._executedCommandsCache.delete(id);\n }\n\n private _getComponentRootNode(componentRef: ComponentRef<any>): HTMLElement {\n return (componentRef.hostView as EmbeddedViewRef<any>).rootNodes[0] as HTMLElement;\n }\n\n private _updateComponentInputs(command: ComponentRenderCommand, componentRef: ComponentRef<any>) {\n for (const [key, value] of Object.entries(command[COMPONENT_RENDER_COMMAND_POSITION.INPUTS])) {\n if (!componentRef.instance[key]) continue;\n\n componentRef.setInput(key, value);\n }\n }\n\n private _findParent(command: RenderCommand) {\n const hostElement = this._elementRef.nativeElement;\n const nestingLevel = command[RENDER_COMMAND_POSITION.NESTING_LEVEL];\n let parentElement: HTMLElement | undefined = undefined;\n\n if (nestingLevel === 0) {\n parentElement = hostElement;\n } else {\n // Reverse search all render commands beginning from the current one using a for loop.\n // The parent is found when the command's nesting level ist the same as the current nesting level minus 1.\n // If the parent is not found, throw an error.\n const allCommands = this.renderCommands();\n const currentCommandIndex = command[RENDER_COMMAND_POSITION.INDEX];\n\n let parentCommand: RenderCommand | null = null;\n\n for (let i = currentCommandIndex - 1; i >= 0; i--) {\n const cmd = allCommands[i];\n\n if (!cmd) {\n throw new Error('Command not found!');\n }\n\n if (cmd[RENDER_COMMAND_POSITION.NESTING_LEVEL] === nestingLevel - 1) {\n parentCommand = cmd;\n break;\n }\n }\n\n if (!parentCommand) {\n throw new Error('Parent command not found!');\n }\n\n parentElement = this._executedCommandsCache.get(getRenderCommandId(parentCommand))?.element;\n }\n\n if (!parentElement) {\n throw new Error('Parent element not found!');\n }\n\n return parentElement;\n }\n\n private _findFollowingElement(command: RenderCommand) {\n const cacheArray = Array.from(this._executedCommandsCache.values());\n let nextElement: HTMLElement | undefined = undefined;\n\n const domPosition = command[RENDER_COMMAND_POSITION.DOM_POSITION];\n const nestingLevel = command[RENDER_COMMAND_POSITION.NESTING_LEVEL];\n const type = command[RENDER_COMMAND_POSITION.TYPE];\n\n // Try to find an already rendered element with a domPosition that is greater than the current domPosition. If there are multiple, use the one with the smallest domPosition.\n // If it does not exist, use .appendChild to simply append the element to the end of the parent element.\n // If it does exist, use .insertBefore to insert the element before the found element.\n for (const cached of cacheArray) {\n if (\n cached.command[RENDER_COMMAND_POSITION.DOM_POSITION] > domPosition &&\n cached.command[RENDER_COMMAND_POSITION.NESTING_LEVEL] === nestingLevel &&\n // Make sure the element does not find itself\n cached.command[RENDER_COMMAND_POSITION.TYPE] !== type\n ) {\n nextElement = cached.element;\n break;\n }\n }\n\n return nextElement;\n }\n\n private _renderInsertOrAppend(\n nodeToRender: HTMLElement,\n parentElement: HTMLElement,\n nextElement: HTMLElement | undefined,\n ) {\n if (nextElement) {\n this._renderer.insertBefore(parentElement, nodeToRender, nextElement);\n } else {\n this._renderer.appendChild(parentElement, nodeToRender);\n }\n }\n\n private _debugVisualizeRenderCommands(commands: RenderCommand[]) {\n const debug = commands.map((command) => this._stringifyRenderCommand(command)).flat();\n\n const prettified = formatHTML(debug);\n\n return prettified;\n }\n\n private _stringifyRenderCommand(command: RenderCommand) {\n const nestAttr = `nest=\"${command[RENDER_COMMAND_POSITION.NESTING_LEVEL]}\"`;\n const domAttr = `dom=\"${command[RENDER_COMMAND_POSITION.DOM_POSITION]}\"`;\n\n if (isHtmlOpenRenderCommand(command)) {\n return `<${command[HTML_OPEN_RENDER_COMMAND_POSITION.TAG_NAME]} ${nestAttr} ${domAttr}>`;\n } else if (isHtmlCloseRenderCommand(command)) {\n return `</${command[HTML_CLOSE_RENDER_COMMAND_POSITION.TAG_NAME]} ${nestAttr} ${domAttr}>`;\n } else if (isTextRenderCommand(command)) {\n return [`<span ${nestAttr} ${domAttr}>`, command[TEXT_RENDER_COMMAND_POSITION.TEXT], '</span>'];\n } else if (isComponentRenderCommand(command)) {\n const selector = command[COMPONENT_RENDER_COMMAND_POSITION.COMPONENT_TYPE];\n return [`<${selector} ${nestAttr} ${domAttr}>`, `</${selector}>`];\n } else {\n return 'UNKNOWN';\n }\n }\n\n private _stringifyRenderInstruction(instruction: RenderInstruction) {\n const type = instruction[RENDER_INSTRUCTION_POSITION.TYPE];\n const translatedType = Object.entries(RENDER_INSTRUCTION_TYPE).find(([, value]) => value === type)?.[0];\n\n const command = this._stringifyRenderCommand(instruction[RENDER_INSTRUCTION_POSITION.COMMAND]);\n\n return `${translatedType}: ${command}`;\n }\n}\n\nfunction formatHTML(html: string[]) {\n const result: string[] = [];\n let indent = 0;\n\n for (const tag of html) {\n if (tag.startsWith('</')) {\n indent--;\n }\n\n result.push(' '.repeat(indent * 2) + tag);\n\n if (tag.startsWith('<') && !tag.startsWith('</')) {\n indent++;\n }\n }\n\n return result.join('\\n');\n}\n","import { ContentfulAudioComponent } from './components/audio';\nimport { ContentfulFileComponent } from './components/file';\nimport { ContentfulImageComponent } from './components/image';\nimport { ContentfulRichTextRendererComponent } from './components/rich-text-renderer';\nimport { ContentfulVideoComponent } from './components/video';\n\nexport const ContentfulImports = [\n ContentfulAudioComponent,\n ContentfulFileComponent,\n ContentfulImageComponent,\n ContentfulVideoComponent,\n ContentfulRichTextRendererComponent,\n] as const;\n","import { gql } from '@ethlete/query';\n\nexport const GQL_FRAGMENT_CONTENTFUL_ASSET = gql`\n fragment AssetData on Asset {\n sys {\n id\n }\n url\n title\n width\n height\n description\n contentType\n size\n }\n`;\n","import { CONTENTFUL_CONFIG } from '../constants';\nimport { ContentfulConfig } from '../types';\nimport { createContentfulConfig } from './contentful-config';\n\nexport const provideContentfulConfig = (contentfulConfig: Partial<ContentfulConfig> | null | undefined = {}) => {\n return { provide: CONTENTFUL_CONFIG, useValue: createContentfulConfig(contentfulConfig) };\n};\n","export * from './lib/components/audio';\nexport * from './lib/components/file';\nexport * from './lib/components/image';\nexport * from './lib/components/rich-text-renderer';\nexport * from './lib/components/video';\nexport * from './lib/constants';\nexport * from './lib/contentful.imports';\nexport * from './lib/gql';\nexport * from './lib/types';\nexport * from './lib/utils';\n\n// Burst cache\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ethlete-contentful.mjs","sources":["../../../../libs/contentful/src/lib/components/audio/contentful-audio.component.ts","../../../../libs/contentful/src/lib/components/file/contentful-file.component.ts","../../../../libs/contentful/src/lib/constants/contentful.constants.ts","../../../../libs/contentful/src/lib/components/image/contentful-image.component.utils.ts","../../../../libs/contentful/src/lib/components/image/contentful-image.component.ts","../../../../libs/contentful/src/lib/components/video/contentful-video.component.ts","../../../../libs/contentful/src/lib/utils/contentful-config.ts","../../../../libs/contentful/src/lib/components/rich-text-renderer/rich-text-renderer.errors.ts","../../../../libs/contentful/src/lib/components/rich-text-renderer/rich-text-renderer.util.ts","../../../../libs/contentful/src/lib/components/rich-text-renderer/rich-text-renderer.component.ts","../../../../libs/contentful/src/lib/contentful.imports.ts","../../../../libs/contentful/src/lib/gql/asset.fragments.ts","../../../../libs/contentful/src/lib/utils/contentful.util.ts","../../../../libs/contentful/src/index.ts","../../../../libs/contentful/src/ethlete-contentful.ts"],"sourcesContent":["import { NgClass } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation, input } from '@angular/core';\nimport { NgClassType } from '@ethlete/core';\nimport { ContentfulAsset } from '../../types';\n\n@Component({\n selector: 'et-contentful-audio',\n template: `\n @if (asset(); as data) {\n <figure [ngClass]=\"figureClass()\">\n <figcaption [ngClass]=\"figcaptionClass()\">{{ data.fields.title }}</figcaption>\n <audio [ngClass]=\"audioClass()\" controls src=\"{{ data.fields.file.url }}\"></audio>\n </figure>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [NgClass],\n})\nexport class ContentfulAudioComponent {\n asset = input.required<ContentfulAsset | null | undefined>();\n audioClass = input<NgClassType>(null);\n figureClass = input<NgClassType>(null);\n figcaptionClass = input<NgClassType>(null);\n}\n","import { NgClass } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation, input } from '@angular/core';\nimport { NgClassType } from '@ethlete/core';\nimport { ContentfulAsset } from '../../types';\n\n@Component({\n selector: 'et-contentful-file',\n template: `\n @if (asset(); as data) {\n <a [href]=\"data.fields.file.url\" [ngClass]=\"fileClass()\" class=\"underline\" target=\"_blank\">\n {{ data.fields.title }} ({{ data.fields.file.details.size }} Bytes)\n </a>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [NgClass],\n})\nexport class ContentfulFileComponent {\n asset = input.required<ContentfulAsset | null | undefined>();\n fileClass = input<NgClassType>(null);\n}\n","import { InjectionToken } from '@angular/core';\n\nimport { ContentfulConfig } from '../types';\n\nexport const CONTENTFUL_CONFIG = new InjectionToken<ContentfulConfig>('ContentfulConfig');\n","import { PictureSource } from '@ethlete/cdk';\nimport { ContentfulAsset, ContentfulImageFocusArea, ContentfulImageResizeBehavior } from '../../types';\n\nexport const generateDefaultContentfulImageSource = (data: ContentfulAsset): PictureSource => {\n const file = data.fields.file;\n\n return {\n type: file.contentType,\n srcset: file.url,\n };\n};\n\n/**\n * Parses source set sizes into an object containing with and height. Eg.\n * - `\"400\"` - 400px width\n * - `\"400x300\"` - 400px width and 300px height\n * - `\"400w\"` - 400px width\n * - `\"400h\"` - 400px height\n * - `\"400wx300h\"` - 400px width and 300px height\n **/\nexport const parseContentfulImageSize = (size: string): { width: number | null; height: number | null } => {\n let width: string | null | undefined = null;\n let height: string | null | undefined = null;\n\n if (size.includes('x')) {\n const [w, h] = size.split('x');\n\n width = w;\n height = h;\n } else if (size.includes('h')) {\n height = size;\n } else {\n width = size;\n }\n\n return {\n width: width ? parseInt(width, 10) : null,\n height: height ? parseInt(height, 10) : null,\n };\n};\n\nexport const generateContentfulImageSources = (\n data: ContentfulAsset,\n srcsetSizes: string[],\n backgroundColor: string | null,\n quality: number | null,\n focusArea: ContentfulImageFocusArea | null,\n resizeBehavior: ContentfulImageResizeBehavior | null,\n): PictureSource[] => {\n const assetData = data;\n\n if (!assetData) {\n return [];\n }\n\n const sources: PictureSource[] = [];\n\n const SOURCE_TYPES = ['image/avif', 'image/webp', 'image/png', 'image/jpg'];\n\n for (const type of SOURCE_TYPES) {\n const baseUrl = assetData.fields.file.url;\n const sourceSets: string[] = [];\n const queryParams: string[] = [];\n\n // Set the format (e.g. 'fm=webp')\n queryParams.push(`fm=${type.split('/')[1]}`);\n\n if (backgroundColor) {\n queryParams.push(`bg=rgb:${backgroundColor}`);\n }\n\n if (quality !== null) {\n queryParams.push(`q=${quality}`);\n }\n\n if (focusArea) {\n queryParams.push(`f=${focusArea}`);\n }\n\n if (resizeBehavior) {\n queryParams.push(`fit=${resizeBehavior}`);\n }\n if (srcsetSizes?.length) {\n const urlWithParams = `${baseUrl}?${queryParams.join('&')}`;\n\n for (const size of srcsetSizes) {\n const { width, height } = parseContentfulImageSize(size);\n\n if (width && height) {\n sourceSets.push(`${urlWithParams}&w=${width}&h=${height} ${width}w`);\n } else if (width) {\n sourceSets.push(`${urlWithParams}&w=${width} ${width}w`);\n } else if (height) {\n sourceSets.push(`${urlWithParams}&h=${height} ${height}h`);\n }\n }\n }\n\n sources.push({\n type,\n srcset: sourceSets.length ? sourceSets.join(', ') : `${baseUrl}?${queryParams.join('&')}`,\n });\n }\n\n return sources;\n};\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n inject,\n input,\n numberAttribute,\n} from '@angular/core';\nimport { PictureComponent, normalizePictureSizes } from '@ethlete/cdk';\nimport { NgClassType } from '@ethlete/core';\nimport { CONTENTFUL_CONFIG } from '../../constants';\nimport { ContentfulAsset, ContentfulImageFocusArea, ContentfulImageResizeBehavior } from '../../types';\nimport {\n generateContentfulImageSources,\n generateDefaultContentfulImageSource,\n} from './contentful-image.component.utils';\n\n@Component({\n selector: 'et-contentful-image',\n template: `\n <et-picture\n [imgClass]=\"imgClass()\"\n [hasPriority]=\"hasPriority()\"\n [figureClass]=\"figureClass()\"\n [pictureClass]=\"pictureClass()\"\n [figcaptionClass]=\"figcaptionClass()\"\n [defaultSrc]=\"_defaultSrc()\"\n [alt]=\"asset()?.fields?.title ?? null\"\n [figcaption]=\"asset()?.fields?.description ?? null\"\n [width]=\"asset()?.fields?.file?.details?.image?.width ?? null\"\n [height]=\"asset()?.fields?.file?.details?.image?.height ?? null\"\n [sizes]=\"sizes()\"\n [sources]=\"_sources()\"\n />\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [PictureComponent],\n host: {\n class: 'et-contentful-image',\n },\n})\nexport class ContentfulImageComponent {\n _contentfulConfig = inject(CONTENTFUL_CONFIG);\n\n asset = input.required<ContentfulAsset | null | undefined>();\n backgroundColor = input<string | null>(null);\n srcsetSizes = input<string[]>(this._contentfulConfig.imageOptions.srcsetSizes);\n\n quality = input(null, { transform: numberAttribute });\n focusArea = input<ContentfulImageFocusArea | null>(null);\n resizeBehavior = input<ContentfulImageResizeBehavior | null>(null);\n hasPriority = input(false, { transform: booleanAttribute });\n imgClass = input<NgClassType>(null);\n figureClass = input<NgClassType>(null);\n figcaptionClass = input<NgClassType>(null);\n pictureClass = input<NgClassType>(null);\n sizes = input<string | null, string[] | string | null>(\n normalizePictureSizes(this._contentfulConfig.imageOptions.sizes),\n {\n transform: (v) => normalizePictureSizes(v),\n },\n );\n\n _sources = computed(() => {\n const asset = this.asset();\n const backgroundColor = this.backgroundColor();\n const srcsetSizes = this.srcsetSizes();\n const quality = this.quality();\n const focusArea = this.focusArea();\n const resizeBehavior = this.resizeBehavior();\n\n if (!asset) {\n return [];\n }\n\n return generateContentfulImageSources(asset, srcsetSizes, backgroundColor, quality, focusArea, resizeBehavior);\n });\n\n _defaultSrc = computed(() => {\n const asset = this.asset();\n\n return asset ? generateDefaultContentfulImageSource(asset) : null;\n });\n}\n","import { NgClass } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation, input } from '@angular/core';\nimport { NgClassType } from '@ethlete/core';\nimport { ContentfulAsset } from '../../types';\n\n@Component({\n selector: 'et-contentful-video',\n template: `\n @if (asset(); as data) {\n <video [ngClass]=\"videoClass()\" controls>\n <source src=\"{{ data.fields.file.url }}\" type=\"{{ data.fields.file.contentType }}\" />\n </video>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [NgClass],\n})\nexport class ContentfulVideoComponent {\n asset = input.required<ContentfulAsset | null | undefined>();\n videoClass = input<NgClassType>(null);\n}\n","import { ContentfulAudioComponent } from '../components/audio';\nimport { ContentfulFileComponent } from '../components/file';\nimport { ContentfulImageComponent } from '../components/image';\nimport { ContentfulVideoComponent } from '../components/video';\nimport { ContentfulConfig } from '../types';\n\nexport const createContentfulConfig = (\n config: Partial<ContentfulConfig> | null | undefined = {},\n): ContentfulConfig => ({\n // This default config must be inline and not saved inside a const for some weird webpack reason\n ...{\n useTailwindClasses: false,\n components: {\n audio: ContentfulAudioComponent,\n file: ContentfulFileComponent,\n image: ContentfulImageComponent,\n video: ContentfulVideoComponent,\n },\n customComponents: {},\n imageOptions: {\n srcsetSizes: ['375w', '1280w', '1920w', '2560w'],\n sizes: [],\n backgroundColor: null,\n },\n },\n ...(config || {}),\n});\n","import { RuntimeError } from '@ethlete/core';\n\nexport const RICH_TEXT_RENDERER_ERRORS = {\n rich_text_undefined:\n 'The property value given at richTextPath is undefined. Use the richTextPath input to specify the path to the rich text object.',\n rich_text_wrong_type:\n 'The rich text object does not satisfy the RichTextResponse interface. It should contain a property named \"nodeType\" with the value \"document\".',\n\n asset_id_not_found: 'The asset ID was not found. This node is not supported.',\n entry_id_not_found: 'The entry ID was not found. This node is not supported.',\n\n asset_not_found: 'The asset was not found. This node is not supported.',\n entry_not_found: 'The entry was not found. This node is not supported.',\n\n custom_component_not_found: 'No custom component found for entry type. Please provide one for this type.',\n\n text_parent_not_found: 'The parent node is not found. This structure is not supported.',\n text_parent_wrong_type:\n 'The parent node neither a html element nor a custom component. This structure is not supported.',\n} as const;\n\nconst RICH_TEXT_RENDERER_ERROR_CODES = Object.keys(RICH_TEXT_RENDERER_ERRORS).reduce(\n (acc, key, index) => {\n acc[key as keyof typeof RICH_TEXT_RENDERER_ERRORS] = index;\n return acc;\n },\n {} as Record<keyof typeof RICH_TEXT_RENDERER_ERRORS, number>,\n);\n\nexport const richTextRendererError = (\n code: keyof typeof RICH_TEXT_RENDERER_ERRORS,\n devOnly: boolean,\n data?: unknown,\n) => {\n const message = `<et-contentful-rich-text-renderer>: ${RICH_TEXT_RENDERER_ERRORS[code]}`;\n\n throw new RuntimeError(RICH_TEXT_RENDERER_ERROR_CODES[code], message, devOnly, data);\n};\n","import { BLOCKS, INLINES } from '@contentful/rich-text-types';\nimport { isObject } from '@ethlete/core';\nimport { RichTextResponse } from '../../types';\n\nexport const isRichTextRootNode = (node: unknown): node is RichTextResponse => {\n return isObject(node) && 'nodeType' in node && node['nodeType'] === 'document';\n};\n\nexport const translateContentfulNodeTypeToHtmlTag = (nodeType: 'text' | BLOCKS | INLINES) => {\n switch (nodeType) {\n case BLOCKS.HEADING_1:\n return 'h1';\n case BLOCKS.HEADING_2:\n return 'h2';\n case BLOCKS.HEADING_3:\n return 'h3';\n case BLOCKS.HEADING_4:\n return 'h4';\n case BLOCKS.HEADING_5:\n return 'h5';\n case BLOCKS.HEADING_6:\n return 'h6';\n case BLOCKS.PARAGRAPH:\n return 'p';\n case BLOCKS.UL_LIST:\n return 'ul';\n case BLOCKS.OL_LIST:\n return 'ol';\n case BLOCKS.LIST_ITEM:\n return 'li';\n case BLOCKS.HR:\n return 'hr';\n case BLOCKS.QUOTE:\n return 'blockquote';\n case BLOCKS.TABLE:\n return 'table';\n case BLOCKS.TABLE_ROW:\n return 'tr';\n case BLOCKS.TABLE_CELL:\n return 'td';\n case BLOCKS.TABLE_HEADER_CELL:\n return 'th';\n case BLOCKS.EMBEDDED_ASSET:\n return 'div';\n\n case INLINES.HYPERLINK:\n return 'a';\n case INLINES.ENTRY_HYPERLINK:\n return 'a';\n case INLINES.ASSET_HYPERLINK:\n return 'a';\n\n case 'text':\n return 'span';\n\n // Will be ignored by the renderer\n case 'document':\n return 'document';\n\n case BLOCKS.EMBEDDED_ENTRY:\n return 'div';\n case INLINES.EMBEDDED_ENTRY:\n return 'div';\n\n default:\n return 'div';\n }\n};\n","import { ComponentType } from '@angular/cdk/portal';\nimport { DOCUMENT } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ComponentRef,\n ElementRef,\n EmbeddedViewRef,\n Renderer2,\n ViewContainerRef,\n ViewEncapsulation,\n computed,\n inject,\n input,\n isDevMode,\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { BLOCKS, Block, INLINES, Inline, Mark, Text } from '@contentful/rich-text-types';\nimport { getObjectProperty, isObject } from '@ethlete/core';\nimport { pairwise, startWith, tap } from 'rxjs';\nimport { CONTENTFUL_CONFIG } from '../../constants/contentful.constants';\nimport {\n ContentfulAsset,\n ContentfulCollection,\n ContentfulEntry,\n ContentfulEntryLinkItem,\n RichTextResponse,\n} from '../../types';\nimport { createContentfulConfig } from '../../utils/contentful-config';\nimport { richTextRendererError } from './rich-text-renderer.errors';\nimport { isRichTextRootNode, translateContentfulNodeTypeToHtmlTag } from './rich-text-renderer.util';\n\nexport const RENDER_COMMAND_TYPE = {\n HTML_OPEN: 0,\n HTML_CLOSE: 1,\n TEXT: 2,\n COMPONENT: 3,\n} as const;\n\nexport const RENDER_COMMAND_POSITION = {\n TYPE: 0,\n NESTING_LEVEL: 1,\n DOM_POSITION: 2,\n INDEX: 3,\n} as const;\n\nexport const HTML_OPEN_RENDER_COMMAND_POSITION = {\n ATTRIBUTES: 4,\n TAG_NAME: 5,\n ELEMENT_ID: 6,\n} as const;\n\nexport const HTML_CLOSE_RENDER_COMMAND_POSITION = {\n TAG_NAME: 4,\n ELEMENT_ID: 5,\n} as const;\n\nexport const TEXT_RENDER_COMMAND_POSITION = {\n TEXT: 4,\n} as const;\n\nexport const COMPONENT_RENDER_COMMAND_POSITION = {\n ATTRIBUTES: 4,\n COMPONENT: 5,\n INPUTS: 6,\n COMPONENT_TYPE: 7,\n} as const;\n\ntype HtmlOpenRenderCommand = [\n type: typeof RENDER_COMMAND_TYPE.HTML_OPEN,\n nestingLevel: number,\n domPosition: number,\n index: number,\n attributes: Record<string, string>,\n tagName: string,\n elementId: string,\n];\n\ntype HtmlCloseRenderCommand = [\n type: typeof RENDER_COMMAND_TYPE.HTML_CLOSE,\n nestingLevel: number,\n domPosition: number,\n index: number,\n tagName: string,\n elementId: string,\n];\n\ntype TextRenderCommand = [\n type: typeof RENDER_COMMAND_TYPE.TEXT,\n nestingLevel: number,\n domPosition: number,\n index: number,\n text: string,\n];\n\ntype ComponentRenderCommand = [\n type: typeof RENDER_COMMAND_TYPE.COMPONENT,\n nestingLevel: number,\n domPosition: number,\n index: number,\n attributes: Record<string, string>,\n component: ComponentType<unknown>,\n inputs: Record<string, unknown>,\n componentType: string,\n];\n\ntype RenderCommand = HtmlOpenRenderCommand | HtmlCloseRenderCommand | TextRenderCommand | ComponentRenderCommand;\n\nexport const RENDER_INSTRUCTION_POSITION = {\n TYPE: 0,\n COMMAND: 1,\n} as const;\n\nexport const RENDER_INSTRUCTION_TYPE = {\n CREATE: 0,\n UPDATE: 1,\n DELETE: 2,\n MOVE: 3,\n} as const;\n\ntype RenderInstructionTypeValue = (typeof RENDER_INSTRUCTION_TYPE)[keyof typeof RENDER_INSTRUCTION_TYPE];\n\ntype RenderInstruction = [RenderInstructionTypeValue, RenderCommand];\n\nconst MARK_TAILWIND_MAP: Record<string, string> = {\n bold: 'font-bold',\n italic: 'italic',\n underline: 'underline',\n code: 'font-mono',\n};\n\nexport const marksToClass = (marks: Mark[]) => {\n const classes: string[] = [];\n\n for (const mark of marks) {\n let klass = MARK_TAILWIND_MAP[mark.type];\n\n if (!klass) {\n console.warn(`No class found for mark type! Falling back to \"${mark.type}\".`, mark);\n\n klass = mark.type;\n }\n\n classes.push(klass);\n }\n\n return classes.join(' ');\n};\n\nexport const isHtmlOpenRenderCommand = (command: RenderCommand): command is HtmlOpenRenderCommand => {\n return command[RENDER_COMMAND_POSITION.TYPE] === RENDER_COMMAND_TYPE.HTML_OPEN;\n};\n\nexport const isHtmlCloseRenderCommand = (command: RenderCommand): command is HtmlCloseRenderCommand => {\n return command[RENDER_COMMAND_POSITION.TYPE] === RENDER_COMMAND_TYPE.HTML_CLOSE;\n};\n\nexport const isTextRenderCommand = (command: RenderCommand): command is TextRenderCommand => {\n return command[RENDER_COMMAND_POSITION.TYPE] === RENDER_COMMAND_TYPE.TEXT;\n};\n\nexport const isComponentRenderCommand = (command: RenderCommand): command is ComponentRenderCommand => {\n return command[RENDER_COMMAND_POSITION.TYPE] === RENDER_COMMAND_TYPE.COMPONENT;\n};\n\nexport const getRenderCommandId = (command: RenderCommand) => {\n if (isHtmlOpenRenderCommand(command)) {\n return command[HTML_OPEN_RENDER_COMMAND_POSITION.ELEMENT_ID];\n } else if (isHtmlCloseRenderCommand(command)) {\n return command[HTML_CLOSE_RENDER_COMMAND_POSITION.ELEMENT_ID];\n } else if (isTextRenderCommand(command)) {\n return command[TEXT_RENDER_COMMAND_POSITION.TEXT];\n } else {\n return command[COMPONENT_RENDER_COMMAND_POSITION.COMPONENT_TYPE];\n }\n};\n\nconst CLASS_ATTR = 'class';\nconst DEFAULT_COMPONENT_TYPES = {\n IMAGE: '$$$_et-image',\n VIDEO: '$$$_et-video',\n AUDIO: '$$$_et-audio',\n FILE: '$$$_et-file',\n};\n\ntype ExecutedCommandCacheItemBase = {\n element: HTMLElement;\n};\n\ntype ExecutedComponentCommandCacheItem = {\n command: ComponentRenderCommand;\n componentRef: ComponentRef<unknown>;\n} & ExecutedCommandCacheItemBase;\n\ntype ExecutedHtmlCommandCacheItem = {\n command: HtmlOpenRenderCommand | HtmlCloseRenderCommand;\n} & ExecutedCommandCacheItemBase;\n\ntype ExecutedTextCommandCacheItem = {\n command: TextRenderCommand;\n textNode: unknown;\n} & ExecutedCommandCacheItemBase;\n\ntype ExecutedCommandCacheItem =\n | ExecutedComponentCommandCacheItem\n | ExecutedHtmlCommandCacheItem\n | ExecutedTextCommandCacheItem;\n\nexport const isExecutedComponentCommandCacheItem = (\n cache: ExecutedCommandCacheItem,\n): cache is ExecutedComponentCommandCacheItem => {\n return isComponentRenderCommand(cache.command);\n};\n\nexport const isExecutedHtmlOrTextCommandCacheItem = (\n cache: ExecutedCommandCacheItem,\n): cache is ExecutedHtmlCommandCacheItem => {\n return isHtmlCloseRenderCommand(cache.command) || isHtmlOpenRenderCommand(cache.command);\n};\n\nexport const isExecutedTextCommandCacheItem = (\n cache: ExecutedCommandCacheItem,\n): cache is ExecutedTextCommandCacheItem => {\n return isTextRenderCommand(cache.command);\n};\n\nexport const ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID = '$$$_et-contentful-any-entry-content-type-sys-id';\n\nexport type ContentfulIncludeMap = {\n /**\n * Select an entry by its ID and content type ID.\n *\n * The content type ID can be found inside the entry -> sys -> contentType -> sys -> id property.\n *\n * You can provide the `ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID` constant to match any entry sys ID.\n * But be aware that this will return the entry as is without any type checking.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getEntry: <T extends { [key: string]: any }>(id: string, contentTypeId: string) => ContentfulEntry<T> | null;\n\n /**\n * Select multiple entries by their IDs and content type ID.\n * If an entry is not found, it will be omitted from the result.\n *\n * The content type ID can be found inside the entry -> sys -> contentType -> sys -> id property.\n *\n * You can provide the `ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID` constant to match any entry sys ID.\n * But be aware that this will return the entry as is without any type checking.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getEntries: <T extends { [key: string]: any }>(\n ids: string[] | ContentfulEntryLinkItem[],\n contentTypeId: string,\n ) => ContentfulEntry<T>[];\n\n /**\n * Select an asset by its ID.\n */\n getAsset: (id: string) => ContentfulAsset | null;\n\n /**\n * Select multiple assets by their IDs. If an asset is not found, it will be omitted from the result.\n */\n getAssets: (ids: string[]) => ContentfulAsset[];\n};\n\n@Component({\n selector: 'et-contentful-rich-text-renderer',\n template: ``,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n host: {\n class: 'et-contentful-rich-text-renderer',\n },\n})\nexport class ContentfulRichTextRendererComponent {\n _viewContainerRef = inject(ViewContainerRef);\n _renderer = inject(Renderer2);\n _elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n _document = inject(DOCUMENT);\n _config = inject(CONTENTFUL_CONFIG, { optional: true }) ?? createContentfulConfig();\n\n /**\n * A cache for all executed commands that are not deleted.\n * This is used to keep track of all rendered elements and components.\n * The key is the render command element ID.\n */\n _executedCommandsCache = new Map<string, ExecutedCommandCacheItem>();\n\n /**\n * The contentful response gotten via their REST api.\n * @see https://www.contentful.com/developers/docs/references/content-delivery-api/#/reference/entries/entries-collection\n */\n content = input.required<ContentfulCollection | null | undefined>();\n\n /**\n * The path to where the rich text field is inside the contentful response. Dot and array notation is allowed.\n * @default \"items[0].fields.html\"\n */\n richTextPath = input.required<string>();\n\n /**\n * A map of all includes in the contentful response.\n * This is useful for looking up assets and entries that are referenced in the rich text without having to use loops.\n */\n contentIncludesMap = computed<ContentfulIncludeMap>(() => {\n const content = this.content();\n const assets = content?.includes.Asset;\n const entries = content?.includes.Entry;\n\n const assetMap = new Map(assets?.map((asset) => [asset.sys.id, asset]) ?? []);\n const entryMap = new Map(entries?.map((entry) => [entry.sys.id, entry]) ?? []);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const getEntry = <T extends { [key: string]: any }>(id: string, contentTypeId: string) => {\n const entry = entryMap.get(id);\n\n if (!entry) {\n if (isDevMode()) {\n console.warn('Entry not found! Will return null. Is the include query param to low?', { id, entryMap });\n }\n\n return null;\n }\n\n if (contentTypeId === ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID) {\n return entry as ContentfulEntry<T>;\n }\n\n if (entry.sys.contentType.sys.id !== contentTypeId) {\n if (isDevMode()) {\n console.warn('Entry sys ID does not match the provided sys ID! Will return null.', {\n entry,\n sysId: contentTypeId,\n });\n }\n\n return null;\n }\n\n return entry as ContentfulEntry<T>;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const getEntries = <T extends { [key: string]: any }>(\n ids: string[] | ContentfulEntryLinkItem[],\n contentTypeId: string,\n ) => {\n const entries = ids\n .map((id) => (typeof id === 'string' ? id : id.sys.id))\n .map((id) => getEntry<T>(id, contentTypeId))\n .filter((entry): entry is ContentfulEntry<T> => entry !== null);\n\n return entries;\n };\n\n const getAsset = (id: string) => {\n return assetMap.get(id) ?? null;\n };\n\n const getAssets = (ids: string[]) => {\n return ids.map((id) => getAsset(id)).filter((asset): asset is ContentfulAsset => asset !== null);\n };\n\n return {\n getEntry,\n getEntries,\n getAsset,\n getAssets,\n };\n });\n\n /**\n * The rich text data that should be rendered.\n */\n richTextData = computed(() => {\n const content = this.content();\n const richTextPath = this.richTextPath();\n\n if (!content) {\n return null;\n }\n\n const richText = getObjectProperty(content as unknown as Record<string, unknown>, richTextPath);\n\n if (!isObject(richText)) {\n throw richTextRendererError('rich_text_undefined', false, { content, richTextPath });\n }\n\n if (!isRichTextRootNode(richText)) {\n throw richTextRendererError('rich_text_wrong_type', false, { content, richTextPath });\n }\n\n return richText as RichTextResponse;\n });\n\n renderCommands = computed(() => {\n const richTextData = this.richTextData();\n\n if (!richTextData) {\n return [];\n }\n\n return this._createRenderCommands(richTextData);\n });\n\n renderCommandHistory = toSignal(\n toObservable(this.renderCommands).pipe(startWith([] as RenderCommand[]), pairwise()),\n { initialValue: [[], []] },\n );\n\n previousRenderCommandMap = computed(() => {\n const [prevCommands] = this.renderCommandHistory();\n\n const map = new Map<string | number, RenderCommand>();\n\n for (const command of prevCommands) {\n map.set(getRenderCommandId(command), command);\n }\n\n return map;\n });\n\n renderInstructions = computed(() => {\n const commands = this.renderCommands();\n const previousRenderCommandMap = new Map(this.previousRenderCommandMap());\n\n const instructions: RenderInstruction[] = [];\n\n // remove deleted components as well as all other elements\n for (const [, command] of previousRenderCommandMap) {\n if (isComponentRenderCommand(command)) {\n // keep the component around if it's still in the new commands\n if (commands.some((c) => getRenderCommandId(c) === getRenderCommandId(command))) {\n continue;\n }\n }\n\n instructions.push([RENDER_INSTRUCTION_TYPE.DELETE, command]);\n\n // remove from map to mark as used\n previousRenderCommandMap.delete(getRenderCommandId(command));\n }\n\n // Find the indexes of the commands remaining in the previousRenderCommandMap in the new commands array.\n const lastComponentIndexes: { newIndex: number; prevIndex: number; command: RenderCommand }[] = [];\n for (const [id, command] of previousRenderCommandMap) {\n const index = commands.findIndex((c) => getRenderCommandId(c) === id);\n const newCommand = commands[index]!;\n\n if (index === -1) {\n throw new Error('Command not found!');\n }\n\n lastComponentIndexes.push({\n newIndex: index,\n prevIndex: command[RENDER_COMMAND_POSITION.INDEX],\n command: newCommand,\n });\n }\n\n lastComponentIndexes.sort((a, b) => a.newIndex - b.newIndex);\n\n // check if the prevIndex are in order ascending\n // for indexes that are not in order, create a move instruction\n // for indexes that are in order, create an update instruction\n let moveCheckIndex = 0;\n while (moveCheckIndex < lastComponentIndexes.length - 1) {\n const moveCurr = lastComponentIndexes[moveCheckIndex];\n const moveNext = lastComponentIndexes[moveCheckIndex + 1];\n\n if (!moveCurr || !moveNext) {\n break;\n }\n\n if (moveCurr.prevIndex > moveNext.prevIndex) {\n lastComponentIndexes.splice(moveCheckIndex + 1, 1);\n instructions.push([RENDER_INSTRUCTION_TYPE.MOVE, moveNext.command]);\n } else {\n instructions.push([RENDER_INSTRUCTION_TYPE.UPDATE, moveNext.command]);\n moveCheckIndex++;\n }\n }\n\n for (const command of commands) {\n const id = getRenderCommandId(command);\n\n if (isComponentRenderCommand(command)) {\n const previousCommand = previousRenderCommandMap.get(id);\n\n if (!previousCommand) {\n // create\n instructions.push([RENDER_INSTRUCTION_TYPE.CREATE, command]);\n }\n } else {\n // create\n instructions.push([RENDER_INSTRUCTION_TYPE.CREATE, command]);\n }\n }\n\n return instructions;\n });\n\n constructor() {\n toObservable(this.renderInstructions)\n .pipe(\n takeUntilDestroyed(),\n tap((instructions) => {\n this._execInstructions(instructions);\n }),\n )\n .subscribe();\n }\n\n private _createRenderCommands(richTextData: RichTextResponse) {\n /** List of all render commands */\n const rootCommands: RenderCommand[] = [];\n\n /** Counter for generating unique html element IDs. */\n let elementId = 0;\n\n /** Counter for generating unique component IDs. */\n const componentIdMap = new Map<string, number>();\n\n /** The nesting level of the current node. */\n let nestingLevel = 0;\n\n /** The position (index) of the current node inside the parent node. */\n let domPosition = 0;\n\n let commandIndex = 0;\n\n const traverse = (node: Block | Inline | Text, parent: RenderCommand | null = null) => {\n switch (node.nodeType) {\n case 'text': {\n // Render media\n const type = RENDER_COMMAND_TYPE.TEXT;\n const text = node.value;\n\n if (!text) break;\n\n const command: TextRenderCommand = [type, nestingLevel, domPosition, commandIndex++, text];\n\n rootCommands.push(command);\n domPosition++;\n\n if (!parent) {\n throw richTextRendererError('text_parent_not_found', false, { node });\n }\n if (!isHtmlOpenRenderCommand(parent) && !isComponentRenderCommand(parent)) {\n throw richTextRendererError('text_parent_wrong_type', false, { node, parent });\n }\n\n const attributesPosition =\n parent[RENDER_COMMAND_POSITION.TYPE] === RENDER_COMMAND_TYPE.HTML_OPEN\n ? HTML_OPEN_RENDER_COMMAND_POSITION.ATTRIBUTES\n : COMPONENT_RENDER_COMMAND_POSITION.ATTRIBUTES;\n\n const attributes = parent[attributesPosition];\n\n if (node.marks.length) {\n const markClasses = marksToClass(node.marks);\n\n if (CLASS_ATTR in attributes) {\n attributes[CLASS_ATTR] += ` ${markClasses}`;\n } else {\n attributes[CLASS_ATTR] = markClasses;\n }\n }\n\n break;\n }\n\n case BLOCKS.EMBEDDED_ASSET: {\n // Render media\n const type = RENDER_COMMAND_TYPE.COMPONENT;\n const assetId = node.data['target']?.sys?.id;\n\n if (!assetId) {\n throw richTextRendererError('asset_id_not_found', false, { node });\n }\n\n const asset = this.contentIncludesMap().getAsset(assetId);\n\n if (!asset) {\n throw richTextRendererError('asset_not_found', false, { assetId, node });\n }\n\n const contentType = asset.fields.file.contentType;\n const assetComponents = this._config.components;\n\n const isImage = contentType.startsWith('image/');\n const isVideo = contentType.startsWith('video/');\n const isAudio = contentType.startsWith('audio/');\n\n const component = isImage\n ? assetComponents.image\n : isVideo\n ? assetComponents.video\n : isAudio\n ? assetComponents.audio\n : assetComponents.file;\n\n const componentType = isImage\n ? DEFAULT_COMPONENT_TYPES.IMAGE\n : isVideo\n ? DEFAULT_COMPONENT_TYPES.VIDEO\n : isAudio\n ? DEFAULT_COMPONENT_TYPES.AUDIO\n : DEFAULT_COMPONENT_TYPES.FILE;\n\n let componentId = componentIdMap.get(componentType) ?? -1;\n const id = componentType + ++componentId;\n componentIdMap.set(componentType, componentId);\n\n const attributes = {};\n\n const inputs = {\n asset,\n };\n\n const command: ComponentRenderCommand = [\n type,\n nestingLevel,\n domPosition,\n commandIndex++,\n attributes,\n component,\n inputs,\n id,\n ];\n\n rootCommands.push(command);\n\n domPosition++;\n\n break;\n }\n\n case BLOCKS.EMBEDDED_ENTRY:\n case INLINES.EMBEDDED_ENTRY: {\n // Render component\n const type = RENDER_COMMAND_TYPE.COMPONENT;\n const entryId = node.data['target']?.sys?.id;\n\n if (!entryId) {\n throw richTextRendererError('entry_id_not_found', false, { node });\n }\n\n const entry = this.contentIncludesMap().getEntry(entryId, ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID);\n\n if (!entry) {\n throw richTextRendererError('entry_not_found', false, { entryId, node });\n }\n\n const componentType = entry.sys.contentType.sys.id;\n\n const component = this._config.customComponents[componentType];\n\n if (!component) {\n throw richTextRendererError('custom_component_not_found', false, {\n componentType,\n customComponents: this._config.customComponents,\n entry,\n });\n }\n\n const attributes = {};\n let componentId = componentIdMap.get(componentType) ?? -1;\n const id = componentType + ++componentId;\n componentIdMap.set(componentType, componentId);\n\n const inputs = {\n fields: entry.fields,\n metadata: entry.metadata,\n sys: entry.sys,\n includes: this.contentIncludesMap(),\n };\n\n const command: ComponentRenderCommand = [\n type,\n nestingLevel,\n domPosition,\n commandIndex++,\n attributes,\n component,\n inputs,\n id,\n ];\n\n rootCommands.push(command);\n\n domPosition++;\n\n break;\n }\n\n default: {\n const type = RENDER_COMMAND_TYPE.HTML_OPEN;\n const tag = translateContentfulNodeTypeToHtmlTag(node.nodeType);\n const attributes: Record<string, string> = {};\n const id = 'e' + elementId++;\n\n const command: HtmlOpenRenderCommand = [type, nestingLevel, domPosition, commandIndex++, attributes, tag, id];\n\n rootCommands.push(command);\n\n const domPositionAtThisLevel = domPosition;\n // Normal html elements can have children\n for (const child of node.content) {\n domPosition = 0;\n nestingLevel++;\n traverse(child, command);\n nestingLevel--;\n domPosition = domPositionAtThisLevel;\n }\n\n const lastCommand = rootCommands[rootCommands.length - 1];\n\n if (lastCommand?.[RENDER_COMMAND_POSITION.TYPE] === RENDER_COMMAND_TYPE.HTML_OPEN) {\n // If the last command is an open command, we can remove it since it's empty\n rootCommands.pop();\n } else {\n const closeId = 'e' + elementId++;\n\n const closeCommand: HtmlCloseRenderCommand = [\n RENDER_COMMAND_TYPE.HTML_CLOSE,\n nestingLevel,\n domPosition,\n commandIndex++,\n tag,\n closeId,\n ];\n rootCommands.push(closeCommand);\n\n domPosition++;\n }\n\n if (node.nodeType === INLINES.HYPERLINK) {\n const uri = node.data['uri'];\n attributes['href'] = uri;\n\n const host = this._document.location.host;\n const isExternal = !uri.includes(host);\n\n if (isExternal) {\n attributes['target'] = '_blank';\n }\n }\n\n break;\n }\n }\n };\n\n for (const node of richTextData.content) {\n traverse(node, null);\n }\n\n return rootCommands;\n }\n\n private _execInstructions(instructions: RenderInstruction[]) {\n for (const instruction of instructions) {\n const type = instruction[RENDER_INSTRUCTION_POSITION.TYPE];\n const command = instruction[RENDER_INSTRUCTION_POSITION.COMMAND];\n\n switch (type) {\n case RENDER_INSTRUCTION_TYPE.CREATE:\n this._runCreateInstruction(command);\n break;\n case RENDER_INSTRUCTION_TYPE.UPDATE:\n this._runUpdateInstruction(command);\n break;\n case RENDER_INSTRUCTION_TYPE.MOVE:\n this._runMoveInstruction(command);\n break;\n case RENDER_INSTRUCTION_TYPE.DELETE:\n this._runDeleteInstruction(command);\n break;\n }\n }\n }\n\n private _runCreateInstruction(command: RenderCommand) {\n const id = getRenderCommandId(command);\n const parentElement = this._findParent(command);\n const nextElement = this._findFollowingElement(command);\n\n if (isComponentRenderCommand(command)) {\n const componentRef = this._viewContainerRef.createComponent(command[COMPONENT_RENDER_COMMAND_POSITION.COMPONENT]);\n\n this._updateComponentInputs(command, componentRef);\n\n const rootNode = this._getComponentRootNode(componentRef);\n\n this._renderInsertOrAppend(rootNode, parentElement, nextElement);\n\n this._executedCommandsCache.set(id, {\n command,\n componentRef,\n element: rootNode,\n });\n } else if (isTextRenderCommand(command)) {\n const text = command[TEXT_RENDER_COMMAND_POSITION.TEXT];\n const textNode = this._renderer.createText(text);\n const span = this._renderer.createElement('span');\n this._renderer.appendChild(span, textNode);\n\n this._renderInsertOrAppend(span, parentElement, nextElement);\n\n this._executedCommandsCache.set(id, {\n command,\n element: span,\n textNode,\n });\n } else if (isHtmlOpenRenderCommand(command)) {\n const tag = command[HTML_OPEN_RENDER_COMMAND_POSITION.TAG_NAME];\n const attributes = command[HTML_OPEN_RENDER_COMMAND_POSITION.ATTRIBUTES];\n const element = this._renderer.createElement(tag);\n\n for (const [key, value] of Object.entries(attributes)) {\n this._renderer.setAttribute(element, key, value);\n }\n\n this._renderInsertOrAppend(element, parentElement, nextElement);\n\n this._executedCommandsCache.set(id, {\n command,\n element,\n });\n }\n }\n\n private _runUpdateInstruction(command: RenderCommand) {\n const id = getRenderCommandId(command);\n const cached = this._executedCommandsCache.get(id);\n\n if (!cached) {\n throw new Error('Cached command not found!');\n }\n\n if (isComponentRenderCommand(command)) {\n if (!isExecutedComponentCommandCacheItem(cached)) {\n throw new Error('Cached command is not a component command!');\n }\n\n const componentRef = cached.componentRef;\n\n if (!componentRef) {\n throw new Error('Component ref not found!');\n }\n\n this._updateComponentInputs(command, componentRef);\n }\n\n this._executedCommandsCache.set(id, {\n ...cached,\n command: command as any,\n });\n }\n\n private _runMoveInstruction(command: RenderCommand) {\n const id = getRenderCommandId(command);\n const cached = this._executedCommandsCache.get(id);\n\n if (!cached) {\n throw new Error('Cached command not found!');\n }\n\n if (isComponentRenderCommand(command)) {\n if (!isExecutedComponentCommandCacheItem(cached)) {\n throw new Error('Cached command is not a component command!');\n }\n\n const componentRef = cached.componentRef;\n\n if (!componentRef) {\n throw new Error('Component ref not found!');\n }\n\n const rootNode = cached.element;\n const oldParentElement = cached.element.parentElement;\n\n this._renderer.removeChild(oldParentElement, rootNode);\n\n const newParentElement = this._findParent(command);\n const nextElement = this._findFollowingElement(command);\n\n this._renderInsertOrAppend(rootNode, newParentElement, nextElement);\n\n this._updateComponentInputs(command, componentRef);\n\n this._executedCommandsCache.set(id, {\n ...cached,\n command: command as any,\n });\n }\n }\n\n private _runDeleteInstruction(command: RenderCommand) {\n const id = getRenderCommandId(command);\n const cached = this._executedCommandsCache.get(id);\n\n if (!cached) {\n if (isHtmlCloseRenderCommand(command)) {\n return;\n }\n\n throw new Error('Cached command not found!');\n }\n\n if (isComponentRenderCommand(command)) {\n if (!isExecutedComponentCommandCacheItem(cached)) {\n throw new Error('Cached command is not a component command!');\n }\n\n cached.componentRef?.destroy();\n } else if (isTextRenderCommand(command)) {\n this._renderer.removeChild(cached.element?.parentElement, cached.element);\n } else if (isHtmlOpenRenderCommand(command)) {\n this._renderer.removeChild(cached.element?.parentElement, cached.element);\n }\n\n this._executedCommandsCache.delete(id);\n }\n\n private _getComponentRootNode(componentRef: ComponentRef<any>): HTMLElement {\n return (componentRef.hostView as EmbeddedViewRef<any>).rootNodes[0] as HTMLElement;\n }\n\n private _updateComponentInputs(command: ComponentRenderCommand, componentRef: ComponentRef<any>) {\n for (const [key, value] of Object.entries(command[COMPONENT_RENDER_COMMAND_POSITION.INPUTS])) {\n if (!componentRef.instance[key]) continue;\n\n componentRef.setInput(key, value);\n }\n }\n\n private _findParent(command: RenderCommand) {\n const hostElement = this._elementRef.nativeElement;\n const nestingLevel = command[RENDER_COMMAND_POSITION.NESTING_LEVEL];\n let parentElement: HTMLElement | undefined = undefined;\n\n if (nestingLevel === 0) {\n parentElement = hostElement;\n } else {\n // Reverse search all render commands beginning from the current one using a for loop.\n // The parent is found when the command's nesting level ist the same as the current nesting level minus 1.\n // If the parent is not found, throw an error.\n const allCommands = this.renderCommands();\n const currentCommandIndex = command[RENDER_COMMAND_POSITION.INDEX];\n\n let parentCommand: RenderCommand | null = null;\n\n for (let i = currentCommandIndex - 1; i >= 0; i--) {\n const cmd = allCommands[i];\n\n if (!cmd) {\n throw new Error('Command not found!');\n }\n\n if (cmd[RENDER_COMMAND_POSITION.NESTING_LEVEL] === nestingLevel - 1) {\n parentCommand = cmd;\n break;\n }\n }\n\n if (!parentCommand) {\n throw new Error('Parent command not found!');\n }\n\n parentElement = this._executedCommandsCache.get(getRenderCommandId(parentCommand))?.element;\n }\n\n if (!parentElement) {\n throw new Error('Parent element not found!');\n }\n\n return parentElement;\n }\n\n private _findFollowingElement(command: RenderCommand) {\n const cacheArray = Array.from(this._executedCommandsCache.values());\n let nextElement: HTMLElement | undefined = undefined;\n\n const domPosition = command[RENDER_COMMAND_POSITION.DOM_POSITION];\n const nestingLevel = command[RENDER_COMMAND_POSITION.NESTING_LEVEL];\n const type = command[RENDER_COMMAND_POSITION.TYPE];\n\n // Try to find an already rendered element with a domPosition that is greater than the current domPosition. If there are multiple, use the one with the smallest domPosition.\n // If it does not exist, use .appendChild to simply append the element to the end of the parent element.\n // If it does exist, use .insertBefore to insert the element before the found element.\n for (const cached of cacheArray) {\n if (\n cached.command[RENDER_COMMAND_POSITION.DOM_POSITION] > domPosition &&\n cached.command[RENDER_COMMAND_POSITION.NESTING_LEVEL] === nestingLevel &&\n // Make sure the element does not find itself\n cached.command[RENDER_COMMAND_POSITION.TYPE] !== type\n ) {\n nextElement = cached.element;\n break;\n }\n }\n\n return nextElement;\n }\n\n private _renderInsertOrAppend(\n nodeToRender: HTMLElement,\n parentElement: HTMLElement,\n nextElement: HTMLElement | undefined,\n ) {\n if (nextElement) {\n this._renderer.insertBefore(parentElement, nodeToRender, nextElement);\n } else {\n this._renderer.appendChild(parentElement, nodeToRender);\n }\n }\n\n private _debugVisualizeRenderCommands(commands: RenderCommand[]) {\n const debug = commands.map((command) => this._stringifyRenderCommand(command)).flat();\n\n const prettified = formatHTML(debug);\n\n return prettified;\n }\n\n private _stringifyRenderCommand(command: RenderCommand) {\n const nestAttr = `nest=\"${command[RENDER_COMMAND_POSITION.NESTING_LEVEL]}\"`;\n const domAttr = `dom=\"${command[RENDER_COMMAND_POSITION.DOM_POSITION]}\"`;\n\n if (isHtmlOpenRenderCommand(command)) {\n return `<${command[HTML_OPEN_RENDER_COMMAND_POSITION.TAG_NAME]} ${nestAttr} ${domAttr}>`;\n } else if (isHtmlCloseRenderCommand(command)) {\n return `</${command[HTML_CLOSE_RENDER_COMMAND_POSITION.TAG_NAME]} ${nestAttr} ${domAttr}>`;\n } else if (isTextRenderCommand(command)) {\n return [`<span ${nestAttr} ${domAttr}>`, command[TEXT_RENDER_COMMAND_POSITION.TEXT], '</span>'];\n } else if (isComponentRenderCommand(command)) {\n const selector = command[COMPONENT_RENDER_COMMAND_POSITION.COMPONENT_TYPE];\n return [`<${selector} ${nestAttr} ${domAttr}>`, `</${selector}>`];\n } else {\n return 'UNKNOWN';\n }\n }\n\n private _stringifyRenderInstruction(instruction: RenderInstruction) {\n const type = instruction[RENDER_INSTRUCTION_POSITION.TYPE];\n const translatedType = Object.entries(RENDER_INSTRUCTION_TYPE).find(([, value]) => value === type)?.[0];\n\n const command = this._stringifyRenderCommand(instruction[RENDER_INSTRUCTION_POSITION.COMMAND]);\n\n return `${translatedType}: ${command}`;\n }\n}\n\nfunction formatHTML(html: string[]) {\n const result: string[] = [];\n let indent = 0;\n\n for (const tag of html) {\n if (tag.startsWith('</')) {\n indent--;\n }\n\n result.push(' '.repeat(indent * 2) + tag);\n\n if (tag.startsWith('<') && !tag.startsWith('</')) {\n indent++;\n }\n }\n\n return result.join('\\n');\n}\n","import { ContentfulAudioComponent } from './components/audio';\nimport { ContentfulFileComponent } from './components/file';\nimport { ContentfulImageComponent } from './components/image';\nimport { ContentfulRichTextRendererComponent } from './components/rich-text-renderer';\nimport { ContentfulVideoComponent } from './components/video';\n\nexport const ContentfulImports = [\n ContentfulAudioComponent,\n ContentfulFileComponent,\n ContentfulImageComponent,\n ContentfulVideoComponent,\n ContentfulRichTextRendererComponent,\n] as const;\n","import { gql } from '@ethlete/query';\n\nexport const GQL_FRAGMENT_CONTENTFUL_ASSET = gql`\n fragment AssetData on Asset {\n sys {\n id\n }\n url\n title\n width\n height\n description\n contentType\n size\n }\n`;\n","import { CONTENTFUL_CONFIG } from '../constants';\nimport { ContentfulConfig } from '../types';\nimport { createContentfulConfig } from './contentful-config';\n\nexport const provideContentfulConfig = (contentfulConfig: Partial<ContentfulConfig> | null | undefined = {}) => {\n return { provide: CONTENTFUL_CONFIG, useValue: createContentfulConfig(contentfulConfig) };\n};\n","export * from './lib/components/audio';\nexport * from './lib/components/file';\nexport * from './lib/components/image';\nexport * from './lib/components/rich-text-renderer';\nexport * from './lib/components/video';\nexport * from './lib/constants';\nexport * from './lib/contentful.imports';\nexport * from './lib/gql';\nexport * from './lib/types';\nexport * from './lib/utils';\n\n// Burst cache\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { ComponentType } from '@angular/cdk/portal';
2
2
  import { ComponentRef, ElementRef, Renderer2, ViewContainerRef } from '@angular/core';
3
3
  import { Mark } from '@contentful/rich-text-types';
4
- import { ContentfulAsset, ContentfulCollection, ContentfulEntry, RichTextResponse } from '../../types';
4
+ import { ContentfulAsset, ContentfulCollection, ContentfulEntry, ContentfulEntryLinkItem, RichTextResponse } from '../../types';
5
5
  import * as i0 from "@angular/core";
6
6
  export declare const RENDER_COMMAND_TYPE: {
7
7
  readonly HTML_OPEN: 0;
@@ -104,11 +104,39 @@ type ExecutedCommandCacheItem = ExecutedComponentCommandCacheItem | ExecutedHtml
104
104
  export declare const isExecutedComponentCommandCacheItem: (cache: ExecutedCommandCacheItem) => cache is ExecutedComponentCommandCacheItem;
105
105
  export declare const isExecutedHtmlOrTextCommandCacheItem: (cache: ExecutedCommandCacheItem) => cache is ExecutedHtmlCommandCacheItem;
106
106
  export declare const isExecutedTextCommandCacheItem: (cache: ExecutedCommandCacheItem) => cache is ExecutedTextCommandCacheItem;
107
+ export declare const ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID = "$$$_et-contentful-any-entry-content-type-sys-id";
107
108
  export type ContentfulIncludeMap = {
109
+ /**
110
+ * Select an entry by its ID and content type ID.
111
+ *
112
+ * The content type ID can be found inside the entry -> sys -> contentType -> sys -> id property.
113
+ *
114
+ * You can provide the `ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID` constant to match any entry sys ID.
115
+ * But be aware that this will return the entry as is without any type checking.
116
+ */
108
117
  getEntry: <T extends {
109
118
  [key: string]: any;
110
- }>(id: string, sysId: string) => ContentfulEntry<T> | null;
119
+ }>(id: string, contentTypeId: string) => ContentfulEntry<T> | null;
120
+ /**
121
+ * Select multiple entries by their IDs and content type ID.
122
+ * If an entry is not found, it will be omitted from the result.
123
+ *
124
+ * The content type ID can be found inside the entry -> sys -> contentType -> sys -> id property.
125
+ *
126
+ * You can provide the `ET_CONTENTFUL_ANY_ENTRY_CONTENT_TYPE_SYS_ID` constant to match any entry sys ID.
127
+ * But be aware that this will return the entry as is without any type checking.
128
+ */
129
+ getEntries: <T extends {
130
+ [key: string]: any;
131
+ }>(ids: string[] | ContentfulEntryLinkItem[], contentTypeId: string) => ContentfulEntry<T>[];
132
+ /**
133
+ * Select an asset by its ID.
134
+ */
111
135
  getAsset: (id: string) => ContentfulAsset | null;
136
+ /**
137
+ * Select multiple assets by their IDs. If an asset is not found, it will be omitted from the result.
138
+ */
139
+ getAssets: (ids: string[]) => ContentfulAsset[];
112
140
  };
113
141
  export declare class ContentfulRichTextRendererComponent {
114
142
  _viewContainerRef: ViewContainerRef;
@@ -58,7 +58,7 @@ export interface ContentfulConfig {
58
58
  backgroundColor: string | null;
59
59
  };
60
60
  }
61
- export type ContentfulLinkType = 'Space' | 'ContentType' | 'Environment';
61
+ export type ContentfulLinkType = 'Space' | 'ContentType' | 'Environment' | 'Entry' | 'Asset' | 'Tag';
62
62
  export interface ContentfulLink<T extends ContentfulLinkType> {
63
63
  type: 'Link';
64
64
  linkType: T;
@@ -67,15 +67,20 @@ export interface ContentfulLink<T extends ContentfulLinkType> {
67
67
  export type ContentfulSpaceLink = ContentfulLink<'Space'>;
68
68
  export type ContentfulEnvironmentLink = ContentfulLink<'Environment'>;
69
69
  export type ContentfulContentTypeLink = ContentfulLink<'ContentType'>;
70
- export interface ContentfulTagLink {
71
- sys: {
72
- type: 'Link';
73
- linkType: 'Tag';
74
- id: string;
75
- };
70
+ export type ContentfulEntryLink = ContentfulLink<'Entry'>;
71
+ export type ContentfulAssetLink = ContentfulLink<'Asset'>;
72
+ export type ContentfulTagLink = ContentfulLink<'Tag'>;
73
+ export interface ContentfulTagLinkItem {
74
+ sys: ContentfulTagLink;
75
+ }
76
+ export interface ContentfulEntryLinkItem {
77
+ sys: ContentfulEntryLink;
78
+ }
79
+ export interface ContentfulAssetLinkItem {
80
+ sys: ContentfulAssetLink;
76
81
  }
77
82
  export interface ContentfulMetadata {
78
- tags: ContentfulTagLink[];
83
+ tags: ContentfulTagLinkItem[];
79
84
  }
80
85
  export interface ContentfulSys {
81
86
  type: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ethlete/contentful",
3
- "version": "3.1.0",
3
+ "version": "3.2.0",
4
4
  "peerDependencies": {
5
5
  "@angular/cdk": "17.3.3",
6
6
  "@angular/common": "17.3.3",