UNPKG

@datorama/akita

Version:

State Management Tailored-Made for JS Applications

452 lines 32.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { delay, map, switchMap, take } from 'rxjs/operators'; import { BehaviorSubject, from, isObservable } from 'rxjs'; import { AkitaPlugin } from '../plugin'; import { applyTransaction } from '../../transaction'; import { isUndefined } from '../../isUndefined'; import { action, logAction } from '../../actions'; import { isNil } from '../../isNil'; /** * @record * @template E */ export function PaginationResponse() { } if (false) { /** @type {?} */ PaginationResponse.prototype.currentPage; /** @type {?} */ PaginationResponse.prototype.perPage; /** @type {?} */ PaginationResponse.prototype.lastPage; /** @type {?} */ PaginationResponse.prototype.data; /** @type {?|undefined} */ PaginationResponse.prototype.total; /** @type {?|undefined} */ PaginationResponse.prototype.from; /** @type {?|undefined} */ PaginationResponse.prototype.to; /** @type {?|undefined} */ PaginationResponse.prototype.pageControls; } /** @type {?} */ const paginatorDefaults = { pagesControls: false, range: false, startWith: 1, cacheTimeout: undefined, clearStoreWithCache: true }; /** * @template State */ export class PaginatorPlugin extends AkitaPlugin { /** * @param {?} query * @param {?=} config */ constructor(query, config = {}) { super(query, { resetFn: (/** * @return {?} */ () => { this.initial = false; this.destroy({ clearCache: true, currentPage: 1 }); }) }); this.query = query; this.config = config; /** * Save current filters, sorting, etc. in cache */ this.metadata = new Map(); this.pages = new Map(); this.pagination = { currentPage: 1, perPage: 0, total: 0, lastPage: 0, data: [] }; /** * When the user navigates to a different page and return * we don't want to call `clearCache` on first time. */ this.initial = true; /** * Proxy to the query loading */ this.isLoading$ = this.query.selectLoading().pipe(delay(0)); this.config = Object.assign(paginatorDefaults, config); const { startWith, cacheTimeout } = this.config; this.page = new BehaviorSubject(startWith); if (isObservable(cacheTimeout)) { this.clearCacheSubscription = cacheTimeout.subscribe((/** * @return {?} */ () => this.clearCache())); } } /** * Listen to page changes * @return {?} */ get pageChanges() { return this.page.asObservable(); } /** * Get the current page number * @return {?} */ get currentPage() { return this.pagination.currentPage; } /** * Check if current page is the first one * @return {?} */ get isFirst() { return this.currentPage === 1; } /** * Check if current page is the last one * @return {?} */ get isLast() { return this.currentPage === this.pagination.lastPage; } /** * Whether to generate an array of pages for *ngFor * [1, 2, 3, 4] * @template THIS * @this {THIS} * @return {THIS} */ withControls() { (/** @type {?} */ (this)).config.pagesControls = true; return (/** @type {?} */ (this)); } /** * Whether to generate the `from` and `to` keys * [1, 2, 3, 4] * @template THIS * @this {THIS} * @return {THIS} */ withRange() { (/** @type {?} */ (this)).config.range = true; return (/** @type {?} */ (this)); } /** * Set the loading state * @param {?=} value * @return {?} */ setLoading(value = true) { this.getStore().setLoading(value); } /** * Update the pagination object and add the page * @param {?} response * @return {?} */ update(response) { this.pagination = response; this.addPage(response.data); } /** * * Set the ids and add the page to store * @param {?} data * @return {?} */ addPage(data) { this.pages.set(this.currentPage, { ids: data.map((/** * @param {?} entity * @return {?} */ entity => entity[this.getStore().idKey])) }); this.getStore().add(data); } /** * Clear the cache. * @param {?=} options * @return {?} */ clearCache(options = {}) { if (!this.initial) { logAction('@Pagination - Clear Cache'); if (options.clearStore !== false && (this.config.clearStoreWithCache || options.clearStore)) { this.getStore().remove(); } this.pages = new Map(); this.metadata = new Map(); } this.initial = false; } /** * @param {?} page * @return {?} */ clearPage(page) { this.pages.delete(page); } /** * Clear the cache timeout and optionally the pages * @param {?=} __0 * @return {?} */ destroy({ clearCache, currentPage } = {}) { if (this.clearCacheSubscription) { this.clearCacheSubscription.unsubscribe(); } if (clearCache) { this.clearCache(); } if (!isUndefined(currentPage)) { this.setPage(currentPage); } this.initial = true; } /** * Whether the provided page is active * @param {?} page * @return {?} */ isPageActive(page) { return this.currentPage === page; } /** * Set the current page * @param {?} page * @return {?} */ setPage(page) { if (page !== this.currentPage || !this.hasPage(page)) { this.page.next((this.pagination.currentPage = page)); } } /** * Increment current page * @return {?} */ nextPage() { if (this.currentPage !== this.pagination.lastPage) { this.setPage(this.pagination.currentPage + 1); } } /** * Decrement current page * @return {?} */ prevPage() { if (this.pagination.currentPage > 1) { this.setPage(this.pagination.currentPage - 1); } } /** * Set current page to last * @return {?} */ setLastPage() { this.setPage(this.pagination.lastPage); } /** * Set current page to first * @return {?} */ setFirstPage() { this.setPage(1); } /** * Check if page exists in cache * @param {?} page * @return {?} */ hasPage(page) { return this.pages.has(page); } /** * Get the current page if it's in cache, otherwise invoke the request * @param {?} req * @return {?} */ getPage(req) { /** @type {?} */ let page = this.pagination.currentPage; if (this.hasPage(page)) { return this.selectPage(page); } else { this.setLoading(true); return from(req()).pipe(switchMap((/** * @param {?} config * @return {?} */ (config) => { page = config.currentPage; applyTransaction((/** * @return {?} */ () => { this.setLoading(false); this.update(config); })); return this.selectPage(page); }))); } } /** * @return {?} */ getQuery() { return this.query; } /** * @return {?} */ refreshCurrentPage() { if (isNil(this.currentPage) === false) { this.clearPage(this.currentPage); this.setPage(this.currentPage); } } /** * @private * @return {?} */ getFrom() { if (this.isFirst) { return 1; } return (this.currentPage - 1) * this.pagination.perPage + 1; } /** * @private * @return {?} */ getTo() { if (this.isLast) { return this.pagination.total; } return this.currentPage * this.pagination.perPage; } /** * Select the page * @private * @param {?} page * @return {?} */ selectPage(page) { return this.query.selectAll({ asObject: true }).pipe(take(1), map((/** * @param {?} entities * @return {?} */ entities => { /** @type {?} */ let response = Object.assign({}, this.pagination, { data: this.pages.get(page).ids.map((/** * @param {?} id * @return {?} */ id => entities[id])) }); const { range, pagesControls } = this.config; /** If no total - calc it */ if (isNaN(this.pagination.total)) { if (response.lastPage === 1) { response.total = response.data ? response.data.length : 0; } else { response.total = response.perPage * response.lastPage; } this.pagination.total = response.total; } if (range) { response.from = this.getFrom(); response.to = this.getTo(); } if (pagesControls) { response.pageControls = generatePages(this.pagination.total, this.pagination.perPage); } return response; }))); } } tslib_1.__decorate([ action('@Pagination - New Page'), tslib_1.__metadata("design:type", Function), tslib_1.__metadata("design:paramtypes", [Object]), tslib_1.__metadata("design:returntype", void 0) ], PaginatorPlugin.prototype, "update", null); if (false) { /** * Save current filters, sorting, etc. in cache * @type {?} */ PaginatorPlugin.prototype.metadata; /** * @type {?} * @private */ PaginatorPlugin.prototype.page; /** * @type {?} * @private */ PaginatorPlugin.prototype.pages; /** * @type {?} * @private */ PaginatorPlugin.prototype.clearCacheSubscription; /** * @type {?} * @private */ PaginatorPlugin.prototype.pagination; /** * When the user navigates to a different page and return * we don't want to call `clearCache` on first time. * @type {?} * @private */ PaginatorPlugin.prototype.initial; /** * Proxy to the query loading * @type {?} */ PaginatorPlugin.prototype.isLoading$; /** * @type {?} * @protected */ PaginatorPlugin.prototype.query; /** @type {?} */ PaginatorPlugin.prototype.config; } /** * Generate an array so we can ngFor them to navigate between pages * @param {?} total * @param {?} perPage * @return {?} */ function generatePages(total, perPage) { /** @type {?} */ const len = Math.ceil(total / perPage); /** @type {?} */ let arr = []; for (let i = 0; i < len; i++) { arr.push(i + 1); } return arr; } /** * backward compatibility * @type {?} */ export const Paginator = PaginatorPlugin; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdG9yUGx1Z2luLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGRhdG9yYW1hL2FraXRhLyIsInNvdXJjZXMiOlsic3JjL3BsdWdpbnMvcGFnaW5hdG9yL3BhZ2luYXRvclBsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQTRCLE1BQU0sTUFBTSxDQUFDO0FBRXJGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDeEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7Ozs7O0FBRXBDLHdDQVNDOzs7SUFSQyx5Q0FBb0I7O0lBQ3BCLHFDQUFnQjs7SUFDaEIsc0NBQWlCOztJQUNqQixrQ0FBVTs7SUFDVixtQ0FBZTs7SUFDZixrQ0FBYzs7SUFDZCxnQ0FBWTs7SUFDWiwwQ0FBd0I7OztNQVdwQixpQkFBaUIsR0FBb0I7SUFDekMsYUFBYSxFQUFFLEtBQUs7SUFDcEIsS0FBSyxFQUFFLEtBQUs7SUFDWixTQUFTLEVBQUUsQ0FBQztJQUNaLFlBQVksRUFBRSxTQUFTO0lBQ3ZCLG1CQUFtQixFQUFFLElBQUk7Q0FDMUI7Ozs7QUFFRCxNQUFNLE9BQU8sZUFBMkMsU0FBUSxXQUFrQjs7Ozs7SUFzQmhGLFlBQXNCLEtBQXlCLEVBQVMsU0FBMEIsRUFBRTtRQUNsRixLQUFLLENBQUMsS0FBSyxFQUFFO1lBQ1gsT0FBTzs7O1lBQUUsR0FBRyxFQUFFO2dCQUNa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Li8uLi9xdWVyeUVudGl0eSc7XG5pbXBvcnQgeyBkZWxheSwgbWFwLCBzd2l0Y2hNYXAsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZyb20sIGlzT2JzZXJ2YWJsZSwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBFbnRpdHlTdGF0ZSwgSUQsIGdldEVudGl0eVR5cGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBBa2l0YVBsdWdpbiB9IGZyb20gJy4uL3BsdWdpbic7XG5pbXBvcnQgeyBhcHBseVRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgaXNVbmRlZmluZWQgfSBmcm9tICcuLi8uLi9pc1VuZGVmaW5lZCc7XG5pbXBvcnQgeyBhY3Rpb24sIGxvZ0FjdGlvbiB9IGZyb20gJy4uLy4uL2FjdGlvbnMnO1xuaW1wb3J0IHsgaXNOaWwgfSBmcm9tICcuLi8uLi9pc05pbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGlvblJlc3BvbnNlPEU+IHtcbiAgY3VycmVudFBhZ2U6IG51bWJlcjtcbiAgcGVyUGFnZTogbnVtYmVyO1xuICBsYXN0UGFnZTogbnVtYmVyO1xuICBkYXRhOiBFW107XG4gIHRvdGFsPzogbnVtYmVyO1xuICBmcm9tPzogbnVtYmVyO1xuICB0bz86IG51bWJlcjtcbiAgcGFnZUNvbnRyb2xzPzogbnVtYmVyW107XG59XG5cbmV4cG9ydCB0eXBlIFBhZ2luYXRvckNvbmZpZyA9IHtcbiAgcGFnZXNDb250cm9scz86IGJvb2xlYW47XG4gIHJhbmdlPzogYm9vbGVhbjtcbiAgc3RhcnRXaXRoPzogbnVtYmVyO1xuICBjYWNoZVRpbWVvdXQ/OiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIGNsZWFyU3RvcmVXaXRoQ2FjaGU/OiBib29sZWFuO1xufTtcblxuY29uc3QgcGFnaW5hdG9yRGVmYXVsdHM6IFBhZ2luYXRvckNvbmZpZyA9IHtcbiAgcGFnZXNDb250cm9sczogZmFsc2UsXG4gIHJhbmdlOiBmYWxzZSxcbiAgc3RhcnRXaXRoOiAxLFxuICBjYWNoZVRpbWVvdXQ6IHVuZGVmaW5lZCxcbiAgY2xlYXJTdG9yZVdpdGhDYWNoZTogdHJ1ZVxufTtcblxuZXhwb3J0IGNsYXNzIFBhZ2luYXRvclBsdWdpbjxTdGF0ZSBleHRlbmRzIEVudGl0eVN0YXRlPiBleHRlbmRzIEFraXRhUGx1Z2luPFN0YXRlPiB7XG4gIC8qKiBTYXZlIGN1cnJlbnQgZmlsdGVycywgc29ydGluZywgZXRjLiBpbiBjYWNoZSAqL1xuICBtZXRhZGF0YSA9IG5ldyBNYXAoKTtcblxuICBwcml2YXRlIHBhZ2U6IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+O1xuICBwcml2YXRlIHBhZ2VzID0gbmV3IE1hcDxudW1iZXIsIHsgaWRzOiBJRFtdIH0+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xlYXJDYWNoZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIHByaXZhdGUgcGFnaW5hdGlvbjogUGFnaW5hdGlvblJlc3BvbnNlPGdldEVudGl0eVR5cGU8U3RhdGU+PiA9IHtcbiAgICBjdXJyZW50UGFnZTogMSxcbiAgICBwZXJQYWdlOiAwLFxuICAgIHRvdGFsOiAwLFxuICAgIGxhc3RQYWdlOiAwLFxuICAgIGRhdGE6IFtdXG4gIH07XG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIHVzZXIgbmF2aWdhdGVzIHRvIGEgZGlmZmVyZW50IHBhZ2UgYW5kIHJldHVyblxuICAgKiB3ZSBkb24ndCB3YW50IHRvIGNhbGwgYGNsZWFyQ2FjaGVgIG9uIGZpcnN0IHRpbWUuXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWwgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBxdWVyeTogUXVlcnlFbnRpdHk8U3RhdGU+LCBwdWJsaWMgY29uZmlnOiBQYWdpbmF0b3JDb25maWcgPSB7fSkge1xuICAgIHN1cGVyKHF1ZXJ5LCB7XG4gICAgICByZXNldEZuOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuaW5pdGlhbCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRlc3Ryb3koeyBjbGVhckNhY2hlOiB0cnVlLCBjdXJyZW50UGFnZTogMSB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmNvbmZpZyA9IE9iamVjdC5hc3NpZ24ocGFnaW5hdG9yRGVmYXVsdHMsIGNvbmZpZyk7XG4gICAgY29uc3QgeyBzdGFydFdpdGgsIGNhY2hlVGltZW91dCB9ID0gdGhpcy5jb25maWc7XG4gICAgdGhpcy5wYWdlID0gbmV3IEJlaGF2aW9yU3ViamVjdChzdGFydFdpdGgpO1xuICAgIGlmIChpc09ic2VydmFibGUoY2FjaGVUaW1lb3V0KSkge1xuICAgICAgdGhpcy5jbGVhckNhY2hlU3Vic2NyaXB0aW9uID0gY2FjaGVUaW1lb3V0LnN1YnNjcmliZSgoKSA9PiB0aGlzLmNsZWFyQ2FjaGUoKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb3h5IHRvIHRoZSBxdWVyeSBsb2FkaW5nXG4gICAqL1xuICBpc0xvYWRpbmckID0gdGhpcy5xdWVyeS5zZWxlY3RMb2FkaW5nKCkucGlwZShkZWxheSgwKSk7XG5cbiAgLyoqXG4gICAqIExpc3RlbiB0byBwYWdlIGNoYW5nZXNcbiAgICovXG4gIGdldCBwYWdlQ2hhbmdlcygpIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBwYWdlIG51bWJlclxuICAgKi9cbiAgZ2V0IGN1cnJlbnRQYWdlKCkge1xuICAgIHJldHVybiB0aGlzLnBhZ2luYXRpb24uY3VycmVudFBhZ2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY3VycmVudCBwYWdlIGlzIHRoZSBmaXJzdCBvbmVcbiAgICovXG4gIGdldCBpc0ZpcnN0KCkge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRQYWdlID09PSAxO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGN1cnJlbnQgcGFnZSBpcyB0aGUgbGFzdCBvbmVcbiAgICovXG4gIGdldCBpc0xhc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFBhZ2UgPT09IHRoaXMucGFnaW5hdGlvbi5sYXN0UGFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIGFuIGFycmF5IG9mIHBhZ2VzIGZvciAqbmdGb3JcbiAgICogWzEsIDIsIDMsIDRdXG4gICAqL1xuICB3aXRoQ29udHJvbHMoKSB7XG4gICAgdGhpcy5jb25maWcucGFnZXNDb250cm9scyA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0byBnZW5lcmF0ZSB0aGUgYGZyb21gIGFuZCBgdG9gIGtleXNcbiAgICogWzEsIDIsIDMsIDRdXG4gICAqL1xuICB3aXRoUmFuZ2UoKSB7XG4gICAgdGhpcy5jb25maWcucmFuZ2UgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgbG9hZGluZyBzdGF0ZVxuICAgKi9cbiAgc2V0TG9hZGluZyh2YWx1ZSA9IHRydWUpIHtcbiAgICB0aGlzLmdldFN0b3JlKCkuc2V0TG9hZGluZyh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBwYWdpbmF0aW9uIG9iamVjdCBhbmQgYWRkIHRoZSBwYWdlXG4gICAqL1xuICBAYWN0aW9uKCdAUGFnaW5hdGlvbiAtIE5ldyBQYWdlJylcbiAgdXBkYXRlKHJlc3BvbnNlOiBQYWdpbmF0aW9uUmVzcG9uc2U8Z2V0RW50aXR5VHlwZTxTdGF0ZT4+KSB7XG4gICAgdGhpcy5wYWdpbmF0aW9uID0gcmVzcG9uc2U7XG4gICAgdGhpcy5hZGRQYWdlKHJlc3BvbnNlLmRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIFNldCB0aGUgaWRzIGFuZCBhZGQgdGhlIHBhZ2UgdG8gc3RvcmVcbiAgICovXG4gIGFkZFBhZ2UoZGF0YTogZ2V0RW50aXR5VHlwZTxTdGF0ZT5bXSkge1xuICAgIHRoaXMucGFnZXMuc2V0KHRoaXMuY3VycmVudFBhZ2UsIHsgaWRzOiBkYXRhLm1hcChlbnRpdHkgPT4gZW50aXR5W3RoaXMuZ2V0U3RvcmUoKS5pZEtleV0pIH0pO1xuICAgIHRoaXMuZ2V0U3RvcmUoKS5hZGQoZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhlIGNhY2hlLlxuICAgKi9cbiAgY2xlYXJDYWNoZShvcHRpb25zOiB7IGNsZWFyU3RvcmU/OiBib29sZWFuIH0gPSB7fSkge1xuICAgIGlmICghdGhpcy5pbml0aWFsKSB7XG4gICAgICBsb2dBY3Rpb24oJ0BQYWdpbmF0aW9uIC0gQ2xlYXIgQ2FjaGUnKTtcblxuICAgICAgaWYgKG9wdGlvbnMuY2xlYXJTdG9yZSAhPT0gZmFsc2UgJiYgKHRoaXMuY29uZmlnLmNsZWFyU3RvcmVXaXRoQ2FjaGUgfHwgb3B0aW9ucy5jbGVhclN0b3JlKSkge1xuICAgICAgICB0aGlzLmdldFN0b3JlKCkucmVtb3ZlKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucGFnZXMgPSBuZXcgTWFwKCk7XG4gICAgICB0aGlzLm1ldGFkYXRhID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICB0aGlzLmluaXRpYWwgPSBmYWxzZTtcbiAgfVxuXG4gIGNsZWFyUGFnZShwYWdlOiBudW1iZXIpIHtcbiAgICB0aGlzLnBhZ2VzLmRlbGV0ZShwYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciB0aGUgY2FjaGUgdGltZW91dCBhbmQgb3B0aW9uYWxseSB0aGUgcGFnZXNcbiAgICovXG4gIGRlc3Ryb3koeyBjbGVhckNhY2hlLCBjdXJyZW50UGFnZSB9OiB7IGNsZWFyQ2FjaGU/OiBib29sZWFuOyBjdXJyZW50UGFnZT86IG51bWJlciB9ID0ge30pIHtcbiAgICBpZiAodGhpcy5jbGVhckNhY2hlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmNsZWFyQ2FjaGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKGNsZWFyQ2FjaGUpIHtcbiAgICAgIHRoaXMuY2xlYXJDYWNoZSgpO1xuICAgIH1cbiAgICBpZiAoIWlzVW5kZWZpbmVkKGN1cnJlbnRQYWdlKSkge1xuICAgICAgdGhpcy5zZXRQYWdlKGN1cnJlbnRQYWdlKTtcbiAgICB9XG4gICAgdGhpcy5pbml0aWFsID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwcm92aWRlZCBwYWdlIGlzIGFjdGl2ZVxuICAgKi9cbiAgaXNQYWdlQWN0aXZlKHBhZ2U6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRQYWdlID09PSBwYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY3VycmVudCBwYWdlXG4gICAqL1xuICBzZXRQYWdlKHBhZ2U6IG51bWJlcikge1xuICAgIGlmIChwYWdlICE9PSB0aGlzLmN1cnJlbnRQYWdlIHx8ICF0aGlzLmhhc1BhZ2UocGFnZSkpIHtcbiAgICAgIHRoaXMucGFnZS5uZXh0KCh0aGlzLnBhZ2luYXRpb24uY3VycmVudFBhZ2UgPSBwYWdlKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluY3JlbWVudCBjdXJyZW50IHBhZ2VcbiAgICovXG4gIG5leHRQYWdlKCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlICE9PSB0aGlzLnBhZ2luYXRpb24ubGFzdFBhZ2UpIHtcbiAgICAgIHRoaXMuc2V0UGFnZSh0aGlzLnBhZ2luYXRpb24uY3VycmVudFBhZ2UgKyAxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVjcmVtZW50IGN1cnJlbnQgcGFnZVxuICAgKi9cbiAgcHJldlBhZ2UoKSB7XG4gICAgaWYgKHRoaXMucGFnaW5hdGlvbi5jdXJyZW50UGFnZSA+IDEpIHtcbiAgICAgIHRoaXMuc2V0UGFnZSh0aGlzLnBhZ2luYXRpb24uY3VycmVudFBhZ2UgLSAxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IGN1cnJlbnQgcGFnZSB0byBsYXN0XG4gICAqL1xuICBzZXRMYXN0UGFnZSgpIHtcbiAgICB0aGlzLnNldFBhZ2UodGhpcy5wYWdpbmF0aW9uLmxhc3RQYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgY3VycmVudCBwYWdlIHRvIGZpcnN0XG4gICAqL1xuICBzZXRGaXJzdFBhZ2UoKSB7XG4gICAgdGhpcy5zZXRQYWdlKDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHBhZ2UgZXhpc3RzIGluIGNhY2hlXG4gICAqL1xuICBoYXNQYWdlKHBhZ2U6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLnBhZ2VzLmhhcyhwYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgcGFnZSBpZiBpdCdzIGluIGNhY2hlLCBvdGhlcndpc2UgaW52b2tlIHRoZSByZXF1ZXN0XG4gICAqL1xuICBnZXRQYWdlKHJlcTogKCkgPT4gT2JzZXJ2YWJsZTxQYWdpbmF0aW9uUmVzcG9uc2U8Z2V0RW50aXR5VHlwZTxTdGF0ZT4+Pikge1xuICAgIGxldCBwYWdlID0gdGhpcy5wYWdpbmF0aW9uLmN1cnJlbnRQYWdlO1xuICAgIGlmICh0aGlzLmhhc1BhZ2UocGFnZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdFBhZ2UocGFnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0TG9hZGluZyh0cnVlKTtcbiAgICAgIHJldHVybiBmcm9tKHJlcSgpKS5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKGNvbmZpZzogUGFnaW5hdGlvblJlc3BvbnNlPGdldEVudGl0eVR5cGU8U3RhdGU+PikgPT4ge1xuICAgICAgICAgIHBhZ2UgPSBjb25maWcuY3VycmVudFBhZ2U7XG4gICAgICAgICAgYXBwbHlUcmFuc2FjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGUoY29uZmlnKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RQYWdlKHBhZ2UpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBnZXRRdWVyeSgpOiBRdWVyeUVudGl0eTxTdGF0ZT4ge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5O1xuICB9XG5cbiAgcmVmcmVzaEN1cnJlbnRQYWdlKCkge1xuICAgIGlmIChpc05pbCh0aGlzLmN1cnJlbnRQYWdlKSA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuY2xlYXJQYWdlKHRoaXMuY3VycmVudFBhZ2UpO1xuICAgICAgdGhpcy5zZXRQYWdlKHRoaXMuY3VycmVudFBhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0RnJvbSgpIHtcbiAgICBpZiAodGhpcy5pc0ZpcnN0KSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgcmV0dXJuICh0aGlzLmN1cnJlbnRQYWdlIC0gMSkgKiB0aGlzLnBhZ2luYXRpb24ucGVyUGFnZSArIDE7XG4gIH1cblxuICBwcml2YXRlIGdldFRvKCkge1xuICAgIGlmICh0aGlzLmlzTGFzdCkge1xuICAgICAgcmV0dXJuIHRoaXMucGFnaW5hdGlvbi50b3RhbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2luYXRpb24ucGVyUGFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgdGhlIHBhZ2VcbiAgICovXG4gIHByaXZhdGUgc2VsZWN0UGFnZShwYWdlOiBudW1iZXIpOiBPYnNlcnZhYmxlPFBhZ2luYXRpb25SZXNwb25zZTxnZXRFbnRpdHlUeXBlPFN0YXRlPj4+IHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeS5zZWxlY3RBbGwoeyBhc09iamVjdDogdHJ1ZSB9KS5waXBlKFxuICAgICAgdGFrZSgxKSxcbiAgICAgIG1hcChlbnRpdGllcyA9PiB7XG4gICAgICAgIGxldCByZXNwb25zZTogUGFnaW5hdGlvblJlc3BvbnNlPGdldEVudGl0eVR5cGU8U3RhdGU+PiA9IHtcbiAgICAgICAgICAuLi50aGlzLnBhZ2luYXRpb24sXG4gICAgICAgICAgZGF0YTogdGhpcy5wYWdlcy5nZXQocGFnZSkuaWRzLm1hcChpZCA9PiBlbnRpdGllc1tpZF0pXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgeyByYW5nZSwgcGFnZXNDb250cm9scyB9ID0gdGhpcy5jb25maWc7XG5cbiAgICAgICAgLyoqIElmIG5vIHRvdGFsIC0gY2FsYyBpdCAqL1xuICAgICAgICBpZiAoaXNOYU4odGhpcy5wYWdpbmF0aW9uLnRvdGFsKSkge1xuICAgICAgICAgIGlmIChyZXNwb25zZS5sYXN0UGFnZSA9PT0gMSkge1xuICAgICAgICAgICAgcmVzcG9uc2UudG90YWwgPSByZXNwb25zZS5kYXRhID8gcmVzcG9uc2UuZGF0YS5sZW5ndGggOiAwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNwb25zZS50b3RhbCA9IHJlc3BvbnNlLnBlclBhZ2UgKiByZXNwb25zZS5sYXN0UGFnZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5wYWdpbmF0aW9uLnRvdGFsID0gcmVzcG9uc2UudG90YWw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICByZXNwb25zZS5mcm9tID0gdGhpcy5nZXRGcm9tKCk7XG4gICAgICAgICAgcmVzcG9uc2UudG8gPSB0aGlzLmdldFRvKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFnZXNDb250cm9scykge1xuICAgICAgICAgIHJlc3BvbnNlLnBhZ2VDb250cm9scyA9IGdlbmVyYXRlUGFnZXModGhpcy5wYWdpbmF0aW9uLnRvdGFsLCB0aGlzLnBhZ2luYXRpb24ucGVyUGFnZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBhbiBhcnJheSBzbyB3ZSBjYW4gbmdGb3IgdGhlbSB0byBuYXZpZ2F0ZSBiZXR3ZWVuIHBhZ2VzXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlUGFnZXModG90YWw6IG51bWJlciwgcGVyUGFnZTogbnVtYmVyKSB7XG4gIGNvbnN0IGxlbiA9IE1hdGguY2VpbCh0b3RhbCAvIHBlclBhZ2UpO1xuICBsZXQgYXJyID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBhcnIucHVzaChpICsgMSk7XG4gIH1cbiAgcmV0dXJuIGFycjtcbn1cblxuLyoqIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi9cbmV4cG9ydCBjb25zdCBQYWdpbmF0b3IgPSBQYWdpbmF0b3JQbHVnaW47XG4iXX0=