UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

173 lines 31.7 kB
import { inject } from '@angular/core'; import { toObservable, toSignal } from '@angular/core/rxjs-interop'; import { ActivatedRoute, Router } from '@angular/router'; import { NEVER, Subject, catchError, filter, interval, isObservable, map, of, startWith, switchMap, switchScan, take, withLatestFrom, } from 'rxjs'; import { WatchEvent } from '../api/public-api'; import { DOWNGRADE_WATCH_ENABLED, DOWNGRADE_WATCH_POLLING, publishRef, } from '../core/public-api'; export class K8SResourcePagedList { constructor(config) { this.config = config; this.reload$$ = new Subject(); this.addedUid = new Set(); this.deletedUid = new Set(); this.params$ = isObservable(this.config.params) ? this.config.params : toObservable(this.config.params); this.loadState$ = this.config.watcher && !DOWNGRADE_WATCH_ENABLED ? this.loadStateWithWatcher() : this.config.watcher || this.config.polling ? this.loadStateWithPolling() : this.sourceLoadState(); this.loading$ = this.loadState$.pipe(map(state => state.loading)); this.items$ = this.loadState$.pipe(map(state => state.items)); this.totalItems$ = this.loadState$.pipe(map(state => state.totalItems)); this.loadError$ = this.loadState$.pipe(map(state => state.loadError)); this.$loading = toSignal(this.loading$); this.$items = toSignal(this.items$); this.$totalItems = toSignal(this.totalItems$); this.$loadError = toSignal(this.loadError$); } reload() { this.reload$$.next(); } sourceLoadState() { return this.params$.pipe(map(parseListParams), switchMap(({ listParams, extraParams }) => { return this.reload$$.pipe(startWith(null), switchMap(() => { return this.config.fetcher(listParams, extraParams).pipe(map(list => ({ loading: false, loadSuccess: true, items: list.items ?? [], totalItems: list.metadata.totalItems ?? 0, })), startWith({ loading: true, loadSuccess: false, items: [], totalItems: 0, }), catchError((err) => of({ loading: false, loadSuccess: false, loadError: err, items: [], totalItems: 0, }))); })); }), publishRef()); } loadStateWithPolling() { return this.sourceLoadState().pipe(switchMap(sourceState => sourceState.loadSuccess ? interval(this.config.polling || DOWNGRADE_WATCH_POLLING).pipe(withLatestFrom(this.params$), map(([_, params]) => parseListParams(params)), switchMap(({ listParams, extraParams }) => this.config.fetcher(listParams, extraParams).pipe(map(list => ({ ...sourceState, items: list.items, totalItems: list.metadata.totalItems, })), catchError(() => NEVER))), startWith(sourceState)) : of(sourceState)), publishRef()); } loadStateWithWatcher() { return this.sourceLoadState().pipe(switchMap(sourceState => sourceState.loadSuccess ? this.params$.pipe(take(1), switchMap(params => { const watchParams = parseListParams({ keyword: params.keyword, extra: params.extra, }); const fetchParams = parseListParams(params); return this.config .watcher(watchParams.listParams, watchParams.extraParams) .pipe(filter(({ type, object }) => { switch (type) { case WatchEvent.Added: { if (this.addedUid.has(object.metadata.uid)) { return false; } this.addedUid.add(object.metadata.uid); return true; } case WatchEvent.Deleted: { if (this.deletedUid.has(object.metadata.uid)) { return false; } this.deletedUid.add(object.metadata.uid); return true; } default: { return true; } } }), switchScan((state, { type, object }) => { switch (type) { case WatchEvent.Modified: { return of({ ...state, items: state.items.map(item => item.metadata.uid === object.metadata.uid ? object : item), }); } case WatchEvent.Added: case WatchEvent.Deleted: { return this.config .fetcher(fetchParams.listParams, fetchParams.extraParams) .pipe(map(list => ({ ...state, items: list.items, totalItems: list.metadata.totalItems, })), catchError(() => NEVER)); } default: { return NEVER; } } }, sourceState)); }), startWith(sourceState)) : of(sourceState)), publishRef()); } } export function extractPagedListParams(defaultParams = {}, extraParams) { const route = inject(ActivatedRoute); const params$ = route.queryParams.pipe(map(params => ({ ...defaultParams, ...{ pageIndex: params.pageIndex || defaultParams.pageIndex || 0, pageSize: params.pageSize || defaultParams.pageSize || 20, }, ...(params.keyword ? { keyword: params.keyword } : {}), ...(params.sortField ? { sortField: params.sortField } : {}), ...(params.sortOrder ? { sortOrder: params.sortOrder } : {}), ...(params.fieldSelector ? { fieldSelector: params.fieldSelector } : {}), ...(params.labelSelector ? { labelSelector: params.labelSelector } : {}), ...(extraParams ? { extra: extraParams(params) } : {}), }))); return { stream: () => params$, signal: () => toSignal(params$), }; } export function queryListParams() { const router = inject(Router); const route = inject(ActivatedRoute); return (queryParams) => { router.navigate(['./'], { relativeTo: route, queryParamsHandling: 'merge', queryParams, }); }; } function parseListParams({ pageIndex, pageSize, sortField, sortOrder, keyword, fieldSelector: originFieldSelector, labelSelector, extra: extraParams, }) { const search = keyword ? `search=${keyword}` : ''; const sortBy = sortField ? `sortby=${sortOrder === 'desc' ? '-' : ''}${sortField}` : ''; const fieldSelector = [search, sortBy, originFieldSelector] .filter(v => !!v) .join(','); return { listParams: { limit: (pageSize || 20) + '', continue: +(pageIndex || 0) * +(pageSize || 20) + '', ...(labelSelector ? { labelSelector } : {}), ...(fieldSelector ? { fieldSelector } : {}), }, extraParams, }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiazhzLXJlc291cmNlLXBhZ2VkLWxpc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvazhzLXJlc291cmNlLWxpc3QvazhzLXJlc291cmNlLXBhZ2VkLWxpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxjQUFjLEVBQVUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakUsT0FBTyxFQUNMLEtBQUssRUFFTCxPQUFPLEVBQ1AsVUFBVSxFQUNWLE1BQU0sRUFDTixRQUFRLEVBQ1IsWUFBWSxFQUNaLEdBQUcsRUFDSCxFQUFFLEVBQ0YsU0FBUyxFQUNULFNBQVMsRUFDVCxVQUFVLEVBQ1YsSUFBSSxFQUNKLGNBQWMsR0FDZixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFBb0IsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakUsT0FBTyxFQUNMLHVCQUF1QixFQUN2Qix1QkFBdUIsRUFJdkIsVUFBVSxHQUNYLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsTUFBTSxPQUFPLG9CQUFvQjtJQTZCL0IsWUFBNkIsTUFBNkI7UUFBN0IsV0FBTSxHQUFOLE1BQU0sQ0FBdUI7UUF6QnpDLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQy9CLGFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQzdCLGVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBRWhELFlBQU8sR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDeEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTtZQUNwQixDQUFDLENBQUMsWUFBWSxDQUFDLElB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TUFBTSxNQUFNLEdBQUcsU0FBUztRQUN0QixDQUFDLENBQUMsVUFBVSxTQUFTLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxTQUFTLEVBQUU7UUFDekQsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNQLE1BQU0sYUFBYSxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQztTQUN4RCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNiLE9BQU87UUFDTCxVQUFVLEVBQUU7WUFDVixLQUFLLEVBQUUsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRTtZQUM1QixRQUFRLEVBQUUsQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUU7WUFDcEQsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzNDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUMvQjtRQUNkLFdBQVc7S0FDWixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgU2lnbmFsLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRvT2JzZXJ2YWJsZSwgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUGFyYW1zLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtcbiAgTkVWRVIsXG4gIE9ic2VydmFibGUsXG4gIFN1YmplY3QsXG4gIGNhdGNoRXJyb3IsXG4gIGZpbHRlcixcbiAgaW50ZXJ2YWwsXG4gIGlzT2JzZXJ2YWJsZSxcbiAgbWFwLFxuICBvZixcbiAgc3RhcnRXaXRoLFxuICBzd2l0Y2hNYXAsXG4gIHN3aXRjaFNjYW4sXG4gIHRha2UsXG4gIHdpdGhMYXRlc3RGcm9tLFxufSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgV2F0Y2hBUElSZXNwb25zZSwgV2F0Y2hFdmVudCB9IGZyb20gJy4uL2FwaS9wdWJsaWMtYXBpJztcbmltcG9ydCB7XG4gIERPV05HUkFERV9XQVRDSF9FTkFCTEVELFxuICBET1dOR1JBREVfV0FUQ0hfUE9MTElORyxcbiAgS3ViZXJuZXRlc1Jlc291cmNlLFxuICBLdWJlcm5ldGVzUmVzb3VyY2VMaXN0LFxuICBTdGF0dXMsXG4gIHB1Ymxpc2hSZWYsXG59IGZyb20gJy4uL2NvcmUvcHVibGljLWFwaSc7XG5cbmV4cG9ydCBjbGFzcyBLOFNSZXNvdXJjZVBhZ2VkTGlzdDxcbiAgUiBleHRlbmRzIEt1YmVybmV0ZXNSZXNvdXJjZSA9IEt1YmVybmV0ZXNSZXNvdXJjZSxcbiAgUCA9IHVua25vd24sXG4+IHtcbiAgcHJpdmF0ZSByZWFkb25seSByZWxvYWQkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkZWRVaWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVkVWlkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgcGFyYW1zJCA9IGlzT2JzZXJ2YWJsZSh0aGlzLmNvbmZpZy5wYXJhbXMpXG4gICAgPyB0aGlzLmNvbmZpZy5wYXJhbXNcbiAgICA6IHRvT2JzZXJ2YWJsZSh0aGlzLmNvbmZpZy5wYXJhbXMpO1xuXG4gIGxvYWRTdGF0ZSQgPVxuICAgIHRoaXMuY29uZmlnLndhdGNoZXIgJiYgIURPV05HUkFERV9XQVRDSF9FTkFCTEVEXG4gICAgICA/IHRoaXMubG9hZFN0YXRlV2l0aFdhdGNoZXIoKVxuICAgICAgOiB0aGlzLmNvbmZpZy53YXRjaGVyIHx8IHRoaXMuY29uZmlnLnBvbGxpbmdcbiAgICAgICAgPyB0aGlzLmxvYWRTdGF0ZVdpdGhQb2xsaW5nKClcbiAgICAgICAgOiB0aGlzLnNvdXJjZUxvYWRTdGF0ZSgpO1xuXG4gIGxvYWRpbmckID0gdGhpcy5sb2FkU3RhdGUkLnBpcGUobWFwKHN0YXRlID0+IHN0YXRlLmxvYWRpbmcpKTtcbiAgaXRlbXMkID0gdGhpcy5sb2FkU3RhdGUkLnBpcGUobWFwKHN0YXRlID0+IHN0YXRlLml0ZW1zKSk7XG4gIHRvdGFsSXRlbXMkID0gdGhpcy5sb2FkU3RhdGUkLnBpcGUobWFwKHN0YXRlID0+IHN0YXRlLnRvdGFsSXRlbXMpKTtcbiAgbG9hZEVycm9yJCA9IHRoaXMubG9hZFN0YXRlJC5waXBlKG1hcChzdGF0ZSA9PiBzdGF0ZS5sb2FkRXJyb3IpKTtcblxuICAkbG9hZGluZyA9IHRvU2lnbmFsKHRoaXMubG9hZGluZyQpO1xuICAkaXRlbXMgPSB0b1NpZ25hbCh0aGlzLml0ZW1zJCk7XG4gICR0b3RhbEl0ZW1zID0gdG9TaWduYWwodGhpcy50b3RhbEl0ZW1zJCk7XG4gICRsb2FkRXJyb3IgPSB0b1NpZ25hbCh0aGlzLmxvYWRFcnJvciQpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBQYWdlZExpc3RDb25maWc8UiwgUD4pIHt9XG5cbiAgcmVsb2FkKCkge1xuICAgIHRoaXMucmVsb2FkJCQubmV4dCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzb3VyY2VMb2FkU3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1zJC5waXBlKFxuICAgICAgbWFwKHBhcnNlTGlzdFBhcmFtcyksXG4gICAgICBzd2l0Y2hNYXAoKHsgbGlzdFBhcmFtcywgZXh0cmFQYXJhbXMgfSkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWxvYWQkJC5waXBlKFxuICAgICAgICAgIHN0YXJ0V2l0aChudWxsKSxcbiAgICAgICAgICBzd2l0Y2hNYXAoKCk6IE9ic2VydmFibGU8TG9hZFN0YXRlPFI+PiA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25maWcuZmV0Y2hlcihsaXN0UGFyYW1zLCBleHRyYVBhcmFtcykucGlwZShcbiAgICAgICAgICAgICAgbWFwKGxpc3QgPT4gKHtcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsb2FkU3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpdGVtczogbGlzdC5pdGVtcyA/PyBbXSxcbiAgICAgICAgICAgICAgICB0b3RhbEl0ZW1zOiBsaXN0Lm1ldGFkYXRhLnRvdGFsSXRlbXMgPz8gMCxcbiAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICBzdGFydFdpdGgoe1xuICAgICAgICAgICAgICAgIGxvYWRpbmc6IHRydWUsXG4gICAgICAgICAgICAgICAgbG9hZFN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgICAgICAgICB0b3RhbEl0ZW1zOiAwLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBTdGF0dXMgfCBIdHRwRXJyb3JSZXNwb25zZSkgPT5cbiAgICAgICAgICAgICAgICBvZih7XG4gICAgICAgICAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIGxvYWRTdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIGxvYWRFcnJvcjogZXJyLFxuICAgICAgICAgICAgICAgICAgaXRlbXM6IFtdLFxuICAgICAgICAgICAgICAgICAgdG90YWxJdGVtczogMCxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KSxcbiAgICAgIHB1Ymxpc2hSZWYoKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkU3RhdGVXaXRoUG9sbGluZygpOiBPYnNlcnZhYmxlPExvYWRTdGF0ZTxSPj4ge1xuICAgIHJldHVybiB0aGlzLnNvdXJjZUxvYWRTdGF0ZSgpLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoc291cmNlU3RhdGUgPT5cbiAgICAgICAgc291cmNlU3RhdGUubG9hZFN1Y2Nlc3NcbiAgICAgICAgICA/IGludGVydmFsKHRoaXMuY29uZmlnLnBvbGxpbmcgfHwgRE9XTkdSQURFX1dBVENIX1BPTExJTkcpLnBpcGUoXG4gICAgICAgICAgICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMucGFyYW1zJCksXG4gICAgICAgICAgICAgIG1hcCgoW18sIHBhcmFtc10pID0+IHBhcnNlTGlzdFBhcmFtcyhwYXJhbXMpKSxcbiAgICAgICAgICAgICAgc3dpdGNoTWFwKCh7IGxpc3RQYXJhbXMsIGV4dHJhUGFyYW1zIH0pID0+XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuZmV0Y2hlcihsaXN0UGFyYW1zLCBleHRyYVBhcmFtcykucGlwZShcbiAgICAgICAgICAgICAgICAgIG1hcChsaXN0ID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIC4uLnNvdXJjZVN0YXRlLFxuICAgICAgICAgICAgICAgICAgICBpdGVtczogbGlzdC5pdGVtcyxcbiAgICAgICAgICAgICAgICAgICAgdG90YWxJdGVtczogbGlzdC5tZXRhZGF0YS50b3RhbEl0ZW1zLFxuICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBORVZFUiksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgc3RhcnRXaXRoKHNvdXJjZVN0YXRlKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IG9mKHNvdXJjZVN0YXRlKSxcbiAgICAgICksXG4gICAgICBwdWJsaXNoUmVmKCksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZFN0YXRlV2l0aFdhdGNoZXIoKTogT2JzZXJ2YWJsZTxMb2FkU3RhdGU8Uj4+IHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2VMb2FkU3RhdGUoKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKHNvdXJjZVN0YXRlID0+XG4gICAgICAgIHNvdXJjZVN0YXRlLmxvYWRTdWNjZXNzXG4gICAgICAgICAgPyB0aGlzLnBhcmFtcyQucGlwZShcbiAgICAgICAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgICAgICAgc3dpdGNoTWFwKHBhcmFtcyA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2F0Y2hQYXJhbXMgPSBwYXJzZUxpc3RQYXJhbXMoe1xuICAgICAgICAgICAgICAgICAga2V5d29yZDogcGFyYW1zLmtleXdvcmQsXG4gICAgICAgICAgICAgICAgICBleHRyYTogcGFyYW1zLmV4dHJhLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZldGNoUGFyYW1zID0gcGFyc2VMaXN0UGFyYW1zKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnXG4gICAgICAgICAgICAgICAgICAud2F0Y2hlcih3YXRjaFBhcmFtcy5saXN0UGFyYW1zLCB3YXRjaFBhcmFtcy5leHRyYVBhcmFtcylcbiAgICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKHsgdHlwZSwgb2JqZWN0IH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV2F0Y2hFdmVudC5BZGRlZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hZGRlZFVpZC5oYXMob2JqZWN0Lm1ldGFkYXRhLnVpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRlZFVpZC5hZGQob2JqZWN0Lm1ldGFkYXRhLnVpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXYXRjaEV2ZW50LkRlbGV0ZWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVsZXRlZFVpZC5oYXMob2JqZWN0Lm1ldGFkYXRhLnVpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxldGVkVWlkLmFkZChvYmplY3QubWV0YWRhdGEudWlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaFNjYW4oKHN0YXRlLCB7IHR5cGUsIG9iamVjdCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdhdGNoRXZlbnQuTW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogc3RhdGUuaXRlbXMubWFwKGl0ZW0gPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubWV0YWRhdGEudWlkID09PSBvYmplY3QubWV0YWRhdGEudWlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV2F0Y2hFdmVudC5BZGRlZDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV2F0Y2hFdmVudC5EZWxldGVkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mZXRjaGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hQYXJhbXMubGlzdFBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoUGFyYW1zLmV4dHJhUGFyYW1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcChsaXN0ID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogbGlzdC5pdGVtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxJdGVtczogbGlzdC5tZXRhZGF0YS50b3RhbEl0ZW1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBORVZFUiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5FVkVSO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwgc291cmNlU3RhdGUpLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIHN0YXJ0V2l0aChzb3VyY2VTdGF0ZSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBvZihzb3VyY2VTdGF0ZSksXG4gICAgICApLFxuICAgICAgcHVibGlzaFJlZigpLFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYWdlZExpc3RDb25maWc8UiwgUD4ge1xuICBwYXJhbXM6IFNpZ25hbDxMaXN0RmV0Y2hQYXJhbXM8UD4+IHwgT2JzZXJ2YWJsZTxMaXN0RmV0Y2hQYXJhbXM8UD4+O1xuICBmZXRjaGVyOiAoXG4gICAgbGlzdFBhcmFtczogRmV0Y2hTZWVkLFxuICAgIGV4dHJhUGFyYW1zOiBQLFxuICApID0+IE9ic2VydmFibGU8S3ViZXJuZXRlc1Jlc291cmNlTGlzdDxSPj47XG4gIHdhdGNoZXI/OiAoXG4gICAgbGlzdFBhcmFtczogRmV0Y2hTZWVkLFxuICAgIGV4dHJhUGFyYW1zOiBQLFxuICApID0+IE9ic2VydmFibGU8V2F0Y2hBUElSZXNwb25zZTxSPj47XG4gIHBvbGxpbmc/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdEZldGNoUGFyYW1zPFAgPSBuZXZlcj4ge1xuICBwYWdlSW5kZXg/OiBudW1iZXIgfCBzdHJpbmc7XG4gIHBhZ2VTaXplPzogbnVtYmVyIHwgc3RyaW5nO1xuICBzb3J0RmllbGQ/OiBzdHJpbmc7XG4gIHNvcnRPcmRlcj86ICdhc2MnIHwgJ2Rlc2MnO1xuICBrZXl3b3JkPzogc3RyaW5nO1xuICBmaWVsZFNlbGVjdG9yPzogc3RyaW5nO1xuICBsYWJlbFNlbGVjdG9yPzogc3RyaW5nO1xuICBleHRyYT86IFA7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmV0Y2hTZWVkIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGxpbWl0Pzogc3RyaW5nO1xuICBjb250aW51ZT86IHN0cmluZztcbiAgZmllbGRTZWxlY3Rvcj86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIExvYWRTdGF0ZTxSPiB7XG4gIGl0ZW1zOiBSW107XG4gIHRvdGFsSXRlbXM6IG51bWJlcjtcbiAgbG9hZGluZzogYm9vbGVhbjtcbiAgbG9hZFN1Y2Nlc3M6IGJvb2xlYW47XG4gIGxvYWRFcnJvcj86IEh0dHBFcnJvclJlc3BvbnNlIHwgU3RhdHVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFBhZ2VkTGlzdFBhcmFtczxQPihcbiAgZGVmYXVsdFBhcmFtczogTGlzdEZldGNoUGFyYW1zID0ge30sXG4gIGV4dHJhUGFyYW1zPzogKHF1ZXJ5UGFyYW1zOiBQYXJhbXMpID0+IFAsXG4pOiBSZWFkb25seTx7XG4gIHN0cmVhbTogKCkgPT4gT2JzZXJ2YWJsZTxMaXN0RmV0Y2hQYXJhbXM8UD4+O1xuICBzaWduYWw6ICgpID0+IFNpZ25hbDxMaXN0RmV0Y2hQYXJhbXM8UD4+O1xufT4ge1xuICBjb25zdCByb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSk7XG4gIGNvbnN0IHBhcmFtcyQgPSByb3V0ZS5xdWVyeVBhcmFtcy5waXBlKFxuICAgIG1hcChwYXJhbXMgPT4gKHtcbiAgICAgIC4uLmRlZmF1bHRQYXJhbXMsXG4gICAgICAuLi57XG4gICAgICAgIHBhZ2VJbmRleDogcGFyYW1zLnBhZ2VJbmRleCB8fCBkZWZhdWx0UGFyYW1zLnBhZ2VJbmRleCB8fCAwLFxuICAgICAgICBwYWdlU2l6ZTogcGFyYW1zLnBhZ2VTaXplIHx8IGRlZmF1bHRQYXJhbXMucGFnZVNpemUgfHwgMjAsXG4gICAgICB9LFxuICAgICAgLi4uKHBhcmFtcy5rZXl3b3JkID8geyBrZXl3b3JkOiBwYXJhbXMua2V5d29yZCB9IDoge30pLFxuICAgICAgLi4uKHBhcmFtcy5zb3J0RmllbGQgPyB7IHNvcnRGaWVsZDogcGFyYW1zLnNvcnRGaWVsZCB9IDoge30pLFxuICAgICAgLi4uKHBhcmFtcy5zb3J0T3JkZXIgPyB7IHNvcnRPcmRlcjogcGFyYW1zLnNvcnRPcmRlciB9IDoge30pLFxuICAgICAgLi4uKHBhcmFtcy5maWVsZFNlbGVjdG9yID8geyBmaWVsZFNlbGVjdG9yOiBwYXJhbXMuZmllbGRTZWxlY3RvciB9IDoge30pLFxuICAgICAgLi4uKHBhcmFtcy5sYWJlbFNlbGVjdG9yID8geyBsYWJlbFNlbGVjdG9yOiBwYXJhbXMubGFiZWxTZWxlY3RvciB9IDoge30pLFxuICAgICAgLi4uKGV4dHJhUGFyYW1zID8geyBleHRyYTogZXh0cmFQYXJhbXMocGFyYW1zKSB9IDoge30pLFxuICAgIH0pKSxcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHN0cmVhbTogKCkgPT4gcGFyYW1zJCxcbiAgICBzaWduYWw6ICgpID0+IHRvU2lnbmFsKHBhcmFtcyQpLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcXVlcnlMaXN0UGFyYW1zKCkge1xuICBjb25zdCByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgY29uc3Qgcm91dGUgPSBpbmplY3QoQWN0aXZhdGVkUm91dGUpO1xuXG4gIHJldHVybiAocXVlcnlQYXJhbXM6IFBhcmFtcykgPT4ge1xuICAgIHJvdXRlci5uYXZpZ2F0ZShbJy4vJ10sIHtcbiAgICAgIHJlbGF0aXZlVG86IHJvdXRlLFxuICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogJ21lcmdlJyxcbiAgICAgIHF1ZXJ5UGFyYW1zLFxuICAgIH0pO1xuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZUxpc3RQYXJhbXM8UD4oe1xuICBwYWdlSW5kZXgsXG4gIHBhZ2VTaXplLFxuICBzb3J0RmllbGQsXG4gIHNvcnRPcmRlcixcbiAga2V5d29yZCxcbiAgZmllbGRTZWxlY3Rvcjogb3JpZ2luRmllbGRTZWxlY3RvcixcbiAgbGFiZWxTZWxlY3RvcixcbiAgZXh0cmE6IGV4dHJhUGFyYW1zLFxufTogTGlzdEZldGNoUGFyYW1zPFA+KSB7XG4gIGNvbnN0IHNlYXJjaCA9IGtleXdvcmQgPyBgc2VhcmNoPSR7a2V5d29yZH1gIDogJyc7XG4gIGNvbnN0IHNvcnRCeSA9IHNvcnRGaWVsZFxuICAgID8gYHNvcnRieT0ke3NvcnRPcmRlciA9PT0gJ2Rlc2MnID8gJy0nIDogJyd9JHtzb3J0RmllbGR9YFxuICAgIDogJyc7XG4gIGNvbnN0IGZpZWxkU2VsZWN0b3IgPSBbc2VhcmNoLCBzb3J0QnksIG9yaWdpbkZpZWxkU2VsZWN0b3JdXG4gICAgLmZpbHRlcih2ID0+ICEhdilcbiAgICAuam9pbignLCcpO1xuICByZXR1cm4ge1xuICAgIGxpc3RQYXJhbXM6IHtcbiAgICAgIGxpbWl0OiAocGFnZVNpemUgfHwgMjApICsgJycsXG4gICAgICBjb250aW51ZTogKyhwYWdlSW5kZXggfHwgMCkgKiArKHBhZ2VTaXplIHx8IDIwKSArICcnLFxuICAgICAgLi4uKGxhYmVsU2VsZWN0b3IgPyB7IGxhYmVsU2VsZWN0b3IgfSA6IHt9KSxcbiAgICAgIC4uLihmaWVsZFNlbGVjdG9yID8geyBmaWVsZFNlbGVjdG9yIH0gOiB7fSksXG4gICAgfSBhcyBGZXRjaFNlZWQsXG4gICAgZXh0cmFQYXJhbXMsXG4gIH07XG59XG4iXX0=