UNPKG

ack-angular

Version:

Extra special directives, components, providers and pipes to aide in tackling everyday interface development needs in Angular2

194 lines 23.9 kB
//import { StateService,TransitionService,Transition } from "ui-router-ng2"; import { NavigationEnd } from '@angular/router'; import { Injectable } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/router"; /** A stateful connection to ui-router history - .stateChange() with arguments MUST be called at every state change - Has 99% accuracy of knowing if OS back or forward button has been used - Their is no web event for knowing if OS button is used. */ export class RouteWatchReporter { constructor(router, activatedRoute) { this.router = router; this.activatedRoute = activatedRoute; this.current = {}; this.$history = []; //$window : any this.historyPos = 0; this.isBackMode = false; this.isOsAction = false; this.isNextBackMode = false; this.isNextBackHistory = false; this.activatedRoute = activatedRoute; router.events.subscribe(event => { if (event.constructor == NavigationEnd) { //const params = {}//COMING REALLY SOON const current = this.getCurrent(); this.recordStateChange(current.config, current.params); } }); this.current = this.getCurrent(); } $window() { return window; } getCurrent() { return getCurrentByActive(this.activatedRoute); } getCurrentConfig() { let target = this.activatedRoute; while (target.firstChild) target = target.firstChild; return (target.routeConfig || target["config"] || target); } getCurrentParams() { let target = this.activatedRoute; while (target.firstChild) target = target.firstChild; return target.snapshot.params; } isTrapHistory(toState, toParams) { return this.isBackHistory(toState, toParams) && this.isForwardHistory(toState, toParams); } isBackHistory(toState, toParams) { const $history = this.$history; const isEven = $history.length > this.historyPos + 1; const isNameMatch = isEven && toState && toState.name == $history[this.historyPos + 1].name; return isNameMatch && this.isParamsMatch(toParams, $history[this.historyPos + 1].params); } isForwardHistory(toState, toParams) { const $history = this.$history; const isEven = !this.isNextBackMode && this.historyPos && $history.length > this.historyPos; const isNameMatch = isEven && toState && toState.name == $history[this.historyPos - 1].name; return isNameMatch && this.isParamsMatch(toParams, $history[this.historyPos - 1].params); } isParamsMatch(toParams, otherParams) { if (!toParams || !otherParams) { return false; } for (let x in toParams) { if (toParams[x] != otherParams[x]) { return false; } } return true; } recordStateChange(toState, toParams) { this.current = { params: toParams, config: toState }; let isForward = this.isForwardHistory(toState, toParams); let isBackHistory = this.isNextBackHistory || this.isBackHistory(toState, toParams); if (this.isOsAction && this.isTrapHistory(toState, toParams)) { if (this.isBackMode) { isForward = false; } else { isBackHistory = false; } } else { this.isBackMode = this.isNextBackMode || (this.isOsAction && isBackHistory); } const $history = this.$history; if (!toState) return; if (isForward) { --this.historyPos; } else if (this.isBackMode) { ++this.historyPos; } else { //const $state = this.$state() this.historyPos = 0; const hist = { name: toState.name, title: toState.title, data: toState.data, params: toParams }; if (!Object.keys(toParams).length) { delete hist.params; } $history.unshift(hist); } this.isNextBackHistory = false; } /** deprecated and most likely not working */ goBackTo(name, params) { this.isNextBackMode = true; this.isNextBackHistory = true; this.$state().go(name, params); } tryBack(name, params) { if (this.$history.length) { this.goHistoryBack(); } else { this.goBackTo(name, params); } } goHistoryBack() { this.isNextBackMode = true; this.isNextBackHistory = true; this.$window().history.back(); } watchDocument($document) { this.watchDocByCallbacks($document, this.getDocumentCallbacks()); } getDocumentCallbacks() { const isBackButton = () => { this.isOsAction = true; }; const isNotBackButton = () => { this.isOsAction = false; }; return { isBackButton: isBackButton, isNotBackButton: isNotBackButton }; } watchDocByCallbacks($document, callbacks) { $document.addEventListener('mouseout', callbacks.isBackButton); //$document.addEventListener('mouseover', callbacks.mouseover) $document.addEventListener('mousedown', callbacks.isNotBackButton); } unwatchDocByCallbacks($document, callbacks) { $document.removeEventListener('mouseout', callbacks.isBackButton); $document.removeEventListener('mouseover', callbacks.isNotBackButton); $document.removeEventListener('mousedown', callbacks.isNotBackButton); } } RouteWatchReporter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.4", ngImport: i0, type: RouteWatchReporter, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Injectable }); RouteWatchReporter.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.4", ngImport: i0, type: RouteWatchReporter }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.4", ngImport: i0, type: RouteWatchReporter, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i1.Router }, { type: i1.ActivatedRoute }]; } }); export function getCurrentByActive(ActivatedRoute) { let parent = ActivatedRoute; let target = ActivatedRoute; while (target.firstChild) { parent = target; target = target.firstChild; } return { ...breakdownActivated(target), parent: breakdownActivated(parent), }; } export function getRouteByActive(ActivatedRoute) { let target = ActivatedRoute; while (target.firstChild) { target = target.firstChild; } return target; } function breakdownActivated(target) { const snapshot = target.snapshot || {}; return { ActivatedRoute: target, config: (target.routeConfig || target['config']), params: snapshot.params, }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUm91dGVXYXRjaFJlcG9ydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvcm91dGVyL1JvdXRlV2F0Y2hSZXBvcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0RUFBNEU7QUFDNUUsT0FBTyxFQUNVLGFBQWEsRUFFN0IsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsVUFBVSxFQUFRLE1BQU0sZUFBZSxDQUFDOzs7QUFvQmpEOzs7O0VBSUU7QUFDWSxNQUFNLE9BQU8sa0JBQWtCO0lBWTNDLFlBQ1MsTUFBYyxFQUNkLGNBQTZCO1FBRDdCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQWJ0QyxZQUFPLEdBQVUsRUFBRSxDQUFBO1FBQ25CLGFBQVEsR0FBZSxFQUFFLENBQUE7UUFFekIsZ0JBQWdCO1FBRWhCLGVBQVUsR0FBWSxDQUFDLENBQUE7UUFDdkIsZUFBVSxHQUFhLEtBQUssQ0FBQTtRQUM1QixlQUFVLEdBQWEsS0FBSyxDQUFBO1FBQzVCLG1CQUFjLEdBQWEsS0FBSyxDQUFBO1FBQ2hDLHNCQUFpQixHQUFhLEtBQUssQ0FBQTtRQU1qQyxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQTtRQUVwQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUEsRUFBRTtZQUM3QixJQUFHLEtBQUssQ0FBQyxXQUFXLElBQUUsYUFBYSxFQUFDO2dCQUNsQyx1Q0FBdUM7Z0JBQ3ZDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtnQkFDakMsSUFBSSxDQUFDLGlCQUFpQixDQUNwQixPQUFPLENBQUMsTUFBTSxFQUNkLE9BQU8sQ0FBQyxNQUFNLENBQ2QsQ0FBQTthQUNIO1FBQ0gsQ0FBQyxDQUFDLENBQUE7UUFFRixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtJQUNsQyxDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sTUFBTSxDQUFBO0lBQ2YsQ0FBQztJQUVELFVBQVU7UUFDUixPQUFPLGtCQUFrQixDQUFFLElBQUksQ0FBQyxjQUFjLENBQUUsQ0FBQTtJQUNsRCxDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQTtRQUNoQyxPQUFNLE1BQU0sQ0FBQyxVQUFVO1lBQUMsTUFBTSxHQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUE7UUFDaEQsT0FBYyxDQUFDLE1BQU0sQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFBO0lBQ2xFLENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFBO1FBQ2hDLE9BQU0sTUFBTSxDQUFDLFVBQVU7WUFBQyxNQUFNLEdBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQTtRQUNoRCxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFBO0lBQy9CLENBQUM7SUFFRCxhQUFhLENBQUMsT0FBWSxFQUFFLFFBQWE7UUFDdkMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQzFGLENBQUM7SUFFRCxhQUFhLENBQUMsT0FBWSxFQUFFLFFBQWE7UUFDdkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQTtRQUM5QixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUMsQ0FBQyxDQUFBO1FBQ2xELE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksSUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7UUFDdkYsT0FBTyxXQUFXLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDeEYsQ0FBQztJQUVELGdCQUFnQixDQUFDLE9BQVksRUFBRSxRQUFhO1FBQzFDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUE7UUFDOUIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBQyxJQUFJLENBQUMsVUFBVSxDQUFBO1FBQ3pGLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksSUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7UUFDdkYsT0FBTyxXQUFXLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDeEYsQ0FBQztJQUVELGFBQWEsQ0FBQyxRQUFhLEVBQUUsV0FBZ0I7UUFDM0MsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUM3QixPQUFPLEtBQUssQ0FBQTtTQUNiO1FBRUQsS0FBSSxJQUFJLENBQUMsSUFBSSxRQUFRLEVBQUM7WUFDcEIsSUFBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFDO2dCQUM3QixPQUFPLEtBQUssQ0FBQTthQUNiO1NBQ0Y7UUFFRCxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxPQUFjLEVBQUUsUUFBYTtRQUM3QyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsTUFBTSxFQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUMsT0FBTyxFQUFFLENBQUE7UUFDbEQsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUN4RCxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFFbkYsSUFBRyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxFQUFDO1lBQzFELElBQUcsSUFBSSxDQUFDLFVBQVUsRUFBQztnQkFDakIsU0FBUyxHQUFHLEtBQUssQ0FBQTthQUNsQjtpQkFBSTtnQkFDSCxhQUFhLEdBQUcsS0FBSyxDQUFBO2FBQ3RCO1NBQ0Y7YUFBSTtZQUNILElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksYUFBYSxDQUFDLENBQUE7U0FDNUU7UUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFBO1FBRTlCLElBQUcsQ0FBQyxPQUFPO1lBQUMsT0FBTTtRQUVsQixJQUFHLFNBQVMsRUFBQztZQUNYLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQTtTQUNsQjthQUFLLElBQUcsSUFBSSxDQUFDLFVBQVUsRUFBQztZQUN2QixFQUFFLElBQUksQ0FBQyxVQUFVLENBQUE7U0FDbEI7YUFBSTtZQUNILDhCQUE4QjtZQUM5QixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQTtZQUNuQixNQUFNLElBQUksR0FBWTtnQkFDcEIsSUFBSSxFQUFHLE9BQWUsQ0FBQyxJQUFJO2dCQUMzQixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7Z0JBQ3BCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtnQkFDbEIsTUFBTSxFQUFDLFFBQVE7YUFDaEIsQ0FBQTtZQUVELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sRUFBRTtnQkFDakMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFBO2FBQ25CO1lBRUQsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtTQUN2QjtRQUVELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUE7SUFDaEMsQ0FBQztJQUVELDZDQUE2QztJQUM3QyxRQUFRLENBQUMsSUFBUyxFQUFFLE1BQVc7UUFDN0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUE7UUFDMUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQTtRQUM3QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUNoQyxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQVMsRUFBRSxNQUFXO1FBQzVCLElBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUM7WUFDdEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFBO1NBQ3JCO2FBQUk7WUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQTtTQUM1QjtJQUNILENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUE7UUFDMUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQTtRQUM3QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQy9CLENBQUM7SUFFRCxhQUFhLENBQUMsU0FBYztRQUMxQixJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUE7SUFDbEUsQ0FBQztJQUVELG9CQUFvQjtRQUNsQixNQUFNLFlBQVksR0FBRyxHQUFFLEVBQUU7WUFDdkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUE7UUFDeEIsQ0FBQyxDQUFBO1FBRUQsTUFBTSxlQUFlLEdBQUcsR0FBRSxFQUFFO1lBQzFCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFBO1FBQ3pCLENBQUMsQ0FBQTtRQUVELE9BQU87WUFDTCxZQUFZLEVBQU0sWUFBWTtZQUM5QixlQUFlLEVBQUcsZUFBZTtTQUNsQyxDQUFBO0lBQ0gsQ0FBQztJQUVELG1CQUFtQixDQUFDLFNBQWMsRUFBRSxTQUFjO1FBQ2hELFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQzlELDhEQUE4RDtRQUM5RCxTQUFTLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQTtJQUNwRSxDQUFDO0lBRUQscUJBQXFCLENBQUMsU0FBYyxFQUFFLFNBQWM7UUFDbEQsU0FBUyxDQUFDLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDakUsU0FBUyxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUE7UUFDckUsU0FBUyxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUE7SUFDdkUsQ0FBQzs7K0dBakx3QixrQkFBa0I7bUhBQWxCLGtCQUFrQjsyRkFBbEIsa0JBQWtCO2tCQUE1QyxVQUFVOztBQW9MWCxNQUFNLFVBQVUsa0JBQWtCLENBQUUsY0FBNkI7SUFDL0QsSUFBSSxNQUFNLEdBQUcsY0FBYyxDQUFBO0lBQzNCLElBQUksTUFBTSxHQUFHLGNBQWMsQ0FBQTtJQUMzQixPQUFNLE1BQU0sQ0FBQyxVQUFVLEVBQUM7UUFDdEIsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNmLE1BQU0sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFBO0tBQzNCO0lBRUQsT0FBTztRQUNMLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDO1FBQzdCLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7S0FDbkMsQ0FBQTtBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUUsY0FBOEI7SUFDOUQsSUFBSSxNQUFNLEdBQUcsY0FBYyxDQUFBO0lBQzNCLE9BQU0sTUFBTSxDQUFDLFVBQVUsRUFBQztRQUN0QixNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQTtLQUMzQjtJQUVELE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUMsTUFBc0I7SUFDaEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsSUFBNEIsRUFBRSxDQUFBO0lBQzlELE9BQU87UUFDTCxjQUFjLEVBQUUsTUFBTTtRQUN0QixNQUFNLEVBQVEsQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0RCxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07S0FDeEIsQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvL2ltcG9ydCB7IFN0YXRlU2VydmljZSxUcmFuc2l0aW9uU2VydmljZSxUcmFuc2l0aW9uIH0gZnJvbSBcInVpLXJvdXRlci1uZzJcIjtcbmltcG9ydCB7XG4gIFJvdXRlLCBSb3V0ZXIsIE5hdmlnYXRpb25FbmQsXG4gIEFjdGl2YXRlZFJvdXRlLCBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBEYXRhLCBSZXNvbHZlLCBSZXNvbHZlRm4sIFBhcmFtc1xufSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlSW5zaWdodCB7XG4gIGNvbmZpZyAgOiBSb3V0ZS8vfEFjdGl2YXRlZFJvdXRlXG4gIEFjdGl2YXRlZFJvdXRlPzogQWN0aXZhdGVkUm91dGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBjdXJyZW50Um91dGUgZXh0ZW5kcyBSb3V0ZUluc2lnaHQge1xuICBBY3RpdmF0ZWRSb3V0ZSA6IEFjdGl2YXRlZFJvdXRlXG4gIHBhcmFtcyAgOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIHBhcmVudD8gOiBjdXJyZW50Um91dGUvL3xBY3RpdmF0ZWRSb3V0ZVxufVxuXG5pbnRlcmZhY2UgSGlzdG9yeSB7XG4gIG5hbWU6IHN0cmluZ1xuICB0aXRsZT86IHN0cmluZyB8IFR5cGU8UmVzb2x2ZTxzdHJpbmc+PiB8IFJlc29sdmVGbjxzdHJpbmc+XG4gIHBhcmFtcz86IGFueVxuICBkYXRhPzogRGF0YVxufVxuXG4vKiogQSBzdGF0ZWZ1bCBjb25uZWN0aW9uIHRvIHVpLXJvdXRlciBoaXN0b3J5XG4gLSAuc3RhdGVDaGFuZ2UoKSB3aXRoIGFyZ3VtZW50cyBNVVNUIGJlIGNhbGxlZCBhdCBldmVyeSBzdGF0ZSBjaGFuZ2VcbiAtIEhhcyA5OSUgYWNjdXJhY3kgb2Yga25vd2luZyBpZiBPUyBiYWNrIG9yIGZvcndhcmQgYnV0dG9uIGhhcyBiZWVuIHVzZWRcbiAgIC0gVGhlaXIgaXMgbm8gd2ViIGV2ZW50IGZvciBrbm93aW5nIGlmIE9TIGJ1dHRvbiBpcyB1c2VkLlxuKi9cbkBJbmplY3RhYmxlKCkgZXhwb3J0IGNsYXNzIFJvdXRlV2F0Y2hSZXBvcnRlcntcbiAgY3VycmVudCAgOiBhbnkgPSB7fVxuICAkaGlzdG9yeSA6IEhpc3RvcnlbXSA9IFtdXG4gICRzdGF0ZSAgIDogYW55XG4gIC8vJHdpbmRvdyAgOiBhbnlcblxuICBoaXN0b3J5UG9zIDogbnVtYmVyID0gMFxuICBpc0JhY2tNb2RlIDogYm9vbGVhbiA9IGZhbHNlXG4gIGlzT3NBY3Rpb24gOiBib29sZWFuID0gZmFsc2VcbiAgaXNOZXh0QmFja01vZGUgOiBib29sZWFuID0gZmFsc2VcbiAgaXNOZXh0QmFja0hpc3RvcnkgOiBib29sZWFuID0gZmFsc2VcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHVibGljIGFjdGl2YXRlZFJvdXRlOkFjdGl2YXRlZFJvdXRlXG4gICl7XG4gICAgdGhpcy5hY3RpdmF0ZWRSb3V0ZSA9IGFjdGl2YXRlZFJvdXRlXG5cbiAgICByb3V0ZXIuZXZlbnRzLnN1YnNjcmliZShldmVudD0+e1xuICAgICAgaWYoZXZlbnQuY29uc3RydWN0b3I9PU5hdmlnYXRpb25FbmQpe1xuICAgICAgICAvL2NvbnN0IHBhcmFtcyA9IHt9Ly9DT01JTkcgUkVBTExZIFNPT05cbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuZ2V0Q3VycmVudCgpXG4gICAgICAgIHRoaXMucmVjb3JkU3RhdGVDaGFuZ2UoXG4gICAgICAgICAgY3VycmVudC5jb25maWcsXG4gICAgICAgICAgY3VycmVudC5wYXJhbXNcbiAgICAgICAgIClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgdGhpcy5jdXJyZW50ID0gdGhpcy5nZXRDdXJyZW50KClcbiAgfVxuXG4gICR3aW5kb3coKXtcbiAgICByZXR1cm4gd2luZG93XG4gIH1cblxuICBnZXRDdXJyZW50KCkgOiBjdXJyZW50Um91dGV7XG4gICAgcmV0dXJuIGdldEN1cnJlbnRCeUFjdGl2ZSggdGhpcy5hY3RpdmF0ZWRSb3V0ZSApXG4gIH1cblxuICBnZXRDdXJyZW50Q29uZmlnKCk6Um91dGV7XG4gICAgbGV0IHRhcmdldCA9IHRoaXMuYWN0aXZhdGVkUm91dGVcbiAgICB3aGlsZSh0YXJnZXQuZmlyc3RDaGlsZCl0YXJnZXQ9dGFyZ2V0LmZpcnN0Q2hpbGRcbiAgICByZXR1cm4gPFJvdXRlPih0YXJnZXQucm91dGVDb25maWcgfHwgdGFyZ2V0W1wiY29uZmlnXCJdIHx8IHRhcmdldClcbiAgfVxuXG4gIGdldEN1cnJlbnRQYXJhbXMoKTogUGFyYW1zIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgdGFyZ2V0ID0gdGhpcy5hY3RpdmF0ZWRSb3V0ZVxuICAgIHdoaWxlKHRhcmdldC5maXJzdENoaWxkKXRhcmdldD10YXJnZXQuZmlyc3RDaGlsZFxuICAgIHJldHVybiB0YXJnZXQuc25hcHNob3QucGFyYW1zXG4gIH1cblxuICBpc1RyYXBIaXN0b3J5KHRvU3RhdGU6IGFueSwgdG9QYXJhbXM6IGFueSk6IGJvb2xlYW57XG4gICAgcmV0dXJuIHRoaXMuaXNCYWNrSGlzdG9yeSh0b1N0YXRlLCB0b1BhcmFtcykgJiYgdGhpcy5pc0ZvcndhcmRIaXN0b3J5KHRvU3RhdGUsIHRvUGFyYW1zKVxuICB9XG5cbiAgaXNCYWNrSGlzdG9yeSh0b1N0YXRlOiBhbnksIHRvUGFyYW1zOiBhbnkpOiBib29sZWFue1xuICAgIGNvbnN0ICRoaXN0b3J5ID0gdGhpcy4kaGlzdG9yeVxuICAgIGNvbnN0IGlzRXZlbiA9ICRoaXN0b3J5Lmxlbmd0aCA+IHRoaXMuaGlzdG9yeVBvcysxXG4gICAgY29uc3QgaXNOYW1lTWF0Y2ggPSBpc0V2ZW4gJiYgdG9TdGF0ZSAmJiB0b1N0YXRlLm5hbWU9PSRoaXN0b3J5W3RoaXMuaGlzdG9yeVBvcysxXS5uYW1lXG4gICAgcmV0dXJuIGlzTmFtZU1hdGNoICYmIHRoaXMuaXNQYXJhbXNNYXRjaCh0b1BhcmFtcywgJGhpc3RvcnlbdGhpcy5oaXN0b3J5UG9zKzFdLnBhcmFtcylcbiAgfVxuXG4gIGlzRm9yd2FyZEhpc3RvcnkodG9TdGF0ZTogYW55LCB0b1BhcmFtczogYW55KTogYm9vbGVhbntcbiAgICBjb25zdCAkaGlzdG9yeSA9IHRoaXMuJGhpc3RvcnlcbiAgICBjb25zdCBpc0V2ZW4gPSAhdGhpcy5pc05leHRCYWNrTW9kZSAmJiB0aGlzLmhpc3RvcnlQb3MgJiYgJGhpc3RvcnkubGVuZ3RoPnRoaXMuaGlzdG9yeVBvc1xuICAgIGNvbnN0IGlzTmFtZU1hdGNoID0gaXNFdmVuICYmIHRvU3RhdGUgJiYgdG9TdGF0ZS5uYW1lPT0kaGlzdG9yeVt0aGlzLmhpc3RvcnlQb3MtMV0ubmFtZVxuICAgIHJldHVybiBpc05hbWVNYXRjaCAmJiB0aGlzLmlzUGFyYW1zTWF0Y2godG9QYXJhbXMsICRoaXN0b3J5W3RoaXMuaGlzdG9yeVBvcy0xXS5wYXJhbXMpXG4gIH1cblxuICBpc1BhcmFtc01hdGNoKHRvUGFyYW1zOiBhbnksIG90aGVyUGFyYW1zOiBhbnkpOmJvb2xlYW57XG4gICAgaWYoICF0b1BhcmFtcyB8fCAhb3RoZXJQYXJhbXMgKXtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGZvcihsZXQgeCBpbiB0b1BhcmFtcyl7XG4gICAgICBpZih0b1BhcmFtc1t4XSE9b3RoZXJQYXJhbXNbeF0pe1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgcmVjb3JkU3RhdGVDaGFuZ2UodG9TdGF0ZTogUm91dGUsIHRvUGFyYW1zOiBhbnkpe1xuICAgIHRoaXMuY3VycmVudCA9IHsgcGFyYW1zOnRvUGFyYW1zLCBjb25maWc6dG9TdGF0ZSB9XG4gICAgbGV0IGlzRm9yd2FyZCA9IHRoaXMuaXNGb3J3YXJkSGlzdG9yeSh0b1N0YXRlLCB0b1BhcmFtcylcbiAgICBsZXQgaXNCYWNrSGlzdG9yeSA9IHRoaXMuaXNOZXh0QmFja0hpc3RvcnkgfHwgdGhpcy5pc0JhY2tIaXN0b3J5KHRvU3RhdGUsIHRvUGFyYW1zKVxuXG4gICAgaWYodGhpcy5pc09zQWN0aW9uICYmIHRoaXMuaXNUcmFwSGlzdG9yeSh0b1N0YXRlLCB0b1BhcmFtcykpe1xuICAgICAgaWYodGhpcy5pc0JhY2tNb2RlKXtcbiAgICAgICAgaXNGb3J3YXJkID0gZmFsc2VcbiAgICAgIH1lbHNle1xuICAgICAgICBpc0JhY2tIaXN0b3J5ID0gZmFsc2VcbiAgICAgIH1cbiAgICB9ZWxzZXtcbiAgICAgIHRoaXMuaXNCYWNrTW9kZSA9IHRoaXMuaXNOZXh0QmFja01vZGUgfHwgKHRoaXMuaXNPc0FjdGlvbiAmJiBpc0JhY2tIaXN0b3J5KVxuICAgIH1cblxuICAgIGNvbnN0ICRoaXN0b3J5ID0gdGhpcy4kaGlzdG9yeVxuXG4gICAgaWYoIXRvU3RhdGUpcmV0dXJuXG5cbiAgICBpZihpc0ZvcndhcmQpe1xuICAgICAgLS10aGlzLmhpc3RvcnlQb3NcbiAgICB9ZWxzZSBpZih0aGlzLmlzQmFja01vZGUpe1xuICAgICAgKyt0aGlzLmhpc3RvcnlQb3NcbiAgICB9ZWxzZXtcbiAgICAgIC8vY29uc3QgJHN0YXRlID0gdGhpcy4kc3RhdGUoKVxuICAgICAgdGhpcy5oaXN0b3J5UG9zID0gMFxuICAgICAgY29uc3QgaGlzdDogSGlzdG9yeSA9IHtcbiAgICAgICAgbmFtZTogKHRvU3RhdGUgYXMgYW55KS5uYW1lLFxuICAgICAgICB0aXRsZTogdG9TdGF0ZS50aXRsZSxcbiAgICAgICAgZGF0YTogdG9TdGF0ZS5kYXRhLFxuICAgICAgICBwYXJhbXM6dG9QYXJhbXNcbiAgICAgIH1cblxuICAgICAgaWYoICFPYmplY3Qua2V5cyh0b1BhcmFtcykubGVuZ3RoICl7XG4gICAgICAgIGRlbGV0ZSBoaXN0LnBhcmFtc1xuICAgICAgfVxuXG4gICAgICAkaGlzdG9yeS51bnNoaWZ0KGhpc3QpXG4gICAgfVxuXG4gICAgdGhpcy5pc05leHRCYWNrSGlzdG9yeSA9IGZhbHNlXG4gIH1cblxuICAvKiogZGVwcmVjYXRlZCBhbmQgbW9zdCBsaWtlbHkgbm90IHdvcmtpbmcgKi9cbiAgZ29CYWNrVG8obmFtZTogYW55LCBwYXJhbXM6IGFueSl7XG4gICAgdGhpcy5pc05leHRCYWNrTW9kZSA9IHRydWVcbiAgICB0aGlzLmlzTmV4dEJhY2tIaXN0b3J5ID0gdHJ1ZVxuICAgIHRoaXMuJHN0YXRlKCkuZ28obmFtZSwgcGFyYW1zKVxuICB9XG5cbiAgdHJ5QmFjayhuYW1lOiBhbnksIHBhcmFtczogYW55KXtcbiAgICBpZih0aGlzLiRoaXN0b3J5Lmxlbmd0aCl7XG4gICAgICB0aGlzLmdvSGlzdG9yeUJhY2soKVxuICAgIH1lbHNle1xuICAgICAgdGhpcy5nb0JhY2tUbyhuYW1lLCBwYXJhbXMpXG4gICAgfVxuICB9XG5cbiAgZ29IaXN0b3J5QmFjaygpIHtcbiAgICB0aGlzLmlzTmV4dEJhY2tNb2RlID0gdHJ1ZVxuICAgIHRoaXMuaXNOZXh0QmFja0hpc3RvcnkgPSB0cnVlXG4gICAgdGhpcy4kd2luZG93KCkuaGlzdG9yeS5iYWNrKClcbiAgfVxuXG4gIHdhdGNoRG9jdW1lbnQoJGRvY3VtZW50OiBhbnkpe1xuICAgIHRoaXMud2F0Y2hEb2NCeUNhbGxiYWNrcygkZG9jdW1lbnQsIHRoaXMuZ2V0RG9jdW1lbnRDYWxsYmFja3MoKSlcbiAgfVxuXG4gIGdldERvY3VtZW50Q2FsbGJhY2tzKCl7XG4gICAgY29uc3QgaXNCYWNrQnV0dG9uID0gKCk9PntcbiAgICAgIHRoaXMuaXNPc0FjdGlvbiA9IHRydWVcbiAgICB9XG5cbiAgICBjb25zdCBpc05vdEJhY2tCdXR0b24gPSAoKT0+e1xuICAgICAgdGhpcy5pc09zQWN0aW9uID0gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaXNCYWNrQnV0dG9uICAgIDogaXNCYWNrQnV0dG9uLFxuICAgICAgaXNOb3RCYWNrQnV0dG9uIDogaXNOb3RCYWNrQnV0dG9uXG4gICAgfVxuICB9XG5cbiAgd2F0Y2hEb2NCeUNhbGxiYWNrcygkZG9jdW1lbnQ6IGFueSwgY2FsbGJhY2tzOiBhbnkpe1xuICAgICRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIGNhbGxiYWNrcy5pc0JhY2tCdXR0b24pXG4gICAgLy8kZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgY2FsbGJhY2tzLm1vdXNlb3ZlcilcbiAgICAkZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgY2FsbGJhY2tzLmlzTm90QmFja0J1dHRvbilcbiAgfVxuXG4gIHVud2F0Y2hEb2NCeUNhbGxiYWNrcygkZG9jdW1lbnQ6IGFueSwgY2FsbGJhY2tzOiBhbnkpe1xuICAgICRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIGNhbGxiYWNrcy5pc0JhY2tCdXR0b24pXG4gICAgJGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIGNhbGxiYWNrcy5pc05vdEJhY2tCdXR0b24pXG4gICAgJGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGNhbGxiYWNrcy5pc05vdEJhY2tCdXR0b24pXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEN1cnJlbnRCeUFjdGl2ZSggQWN0aXZhdGVkUm91dGU6QWN0aXZhdGVkUm91dGUgKTogY3VycmVudFJvdXRlIHtcbiAgbGV0IHBhcmVudCA9IEFjdGl2YXRlZFJvdXRlXG4gIGxldCB0YXJnZXQgPSBBY3RpdmF0ZWRSb3V0ZVxuICB3aGlsZSh0YXJnZXQuZmlyc3RDaGlsZCl7XG4gICAgcGFyZW50ID0gdGFyZ2V0XG4gICAgdGFyZ2V0ID0gdGFyZ2V0LmZpcnN0Q2hpbGRcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uYnJlYWtkb3duQWN0aXZhdGVkKHRhcmdldCksXG4gICAgcGFyZW50OiBicmVha2Rvd25BY3RpdmF0ZWQocGFyZW50KSxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um91dGVCeUFjdGl2ZSggQWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlICk6IEFjdGl2YXRlZFJvdXRlIHtcbiAgbGV0IHRhcmdldCA9IEFjdGl2YXRlZFJvdXRlXG4gIHdoaWxlKHRhcmdldC5maXJzdENoaWxkKXtcbiAgICB0YXJnZXQgPSB0YXJnZXQuZmlyc3RDaGlsZFxuICB9XG5cbiAgcmV0dXJuIHRhcmdldFxufVxuXG5mdW5jdGlvbiBicmVha2Rvd25BY3RpdmF0ZWQodGFyZ2V0OiBBY3RpdmF0ZWRSb3V0ZSkge1xuICBjb25zdCBzbmFwc2hvdCA9IHRhcmdldC5zbmFwc2hvdCB8fCA8QWN0aXZhdGVkUm91dGVTbmFwc2hvdD57fVxuICByZXR1cm4ge1xuICAgIEFjdGl2YXRlZFJvdXRlOiB0YXJnZXQsXG4gICAgY29uZmlnOjxSb3V0ZT4odGFyZ2V0LnJvdXRlQ29uZmlnIHx8IHRhcmdldFsnY29uZmlnJ10pLCAvLyAgfHwgdGFyZ2V0XG4gICAgcGFyYW1zOiBzbmFwc2hvdC5wYXJhbXMsXG4gIH1cbn0iXX0=