UNPKG

@pangz/ng-cloudflare-turnstile

Version:

An intuitive, lightweight and easy to integrate cloudflare-turnstile component for Angular.

364 lines 49.7 kB
import { Component, EventEmitter, Input, Output } from '@angular/core'; import * as i0 from "@angular/core"; export var DevSiteKey; (function (DevSiteKey) { DevSiteKey["ALWAYS_PASSES"] = "1x00000000000000000000AA"; DevSiteKey["ALWAYS_BLOCKS"] = "2x00000000000000000000AB"; DevSiteKey["ALWAYS_PASSES_INVISIBLE"] = "1x00000000000000000000BB"; DevSiteKey["ALWAYS_BLOCKS_INVISIBLE"] = "2x00000000000000000000BB"; DevSiteKey["FORCE_INTERACTIVE_CHALLENGE"] = "3x00000000000000000000FF"; })(DevSiteKey || (DevSiteKey = {})); export var Language; (function (Language) { Language["AUTO"] = "auto"; Language["ARABIC"] = "ar-eg"; Language["BULGARIAN"] = "bg-bg"; Language["CHINESE_SIMPLIFIED"] = "zh-cn"; Language["CHINESE_TRADITIONAL"] = "zh-tw"; Language["CROATIAN"] = "hr-hr"; Language["CZECH"] = "cs-cz"; Language["DANISH"] = "da-dk"; Language["DUTCH"] = "nl-nl"; Language["ENGLISH"] = "en-us"; Language["FARSI"] = "fa-ir"; Language["FINNISH"] = "fi-fi"; Language["FRENCH"] = "fr-fr"; Language["GERMAN"] = "de-de"; Language["GREEK"] = "el-gr"; Language["HEBREW"] = "he-il"; Language["HINDI"] = "hi-in"; Language["HUNGARIAN"] = "hu-hu"; Language["INDONESIAN"] = "id-id"; Language["ITALIAN"] = "it-it"; Language["JAPANESE"] = "ja-jp"; Language["KLINGON"] = "tlh"; Language["KOREAN"] = "ko-kr"; Language["LITHUANIAN"] = "lt-lt"; Language["MALAY"] = "ms-my"; Language["NORWEGIAN"] = "nb-no"; Language["POLISH"] = "pl-pl"; Language["PORTUGUESE"] = "pt-br"; Language["ROMANIAN"] = "ro-ro"; Language["RUSSIAN"] = "ru-ru"; Language["SERBIAN"] = "sr-ba"; Language["SLOVAK"] = "sk-sk"; Language["SLOVENIAN"] = "sl-si"; Language["SPANISH"] = "es-es"; Language["SWEDISH"] = "sv-se"; Language["TAGALOG"] = "tl-ph"; Language["THAI"] = "th-th"; Language["TURKISH"] = "tr-tr"; Language["UKRAINIAN"] = "uk-ua"; Language["VIETNAMESE"] = "vi-vn"; })(Language || (Language = {})); export var Theme; (function (Theme) { Theme["LIGHT"] = "light"; Theme["DARK"] = "dark"; Theme["AUTO"] = "auto"; })(Theme || (Theme = {})); export var Size; (function (Size) { Size["NORMAL"] = "normal"; Size["FLEXIBLE"] = "flexible"; Size["COMPACT"] = "compact"; })(Size || (Size = {})); export var Appearance; (function (Appearance) { Appearance["ALWAYS"] = "always"; Appearance["EXECUTE"] = "execute"; Appearance["INTERACTION_ONLY"] = "interaction-only"; })(Appearance || (Appearance = {})); export var Retry; (function (Retry) { Retry["AUTO"] = "auto"; Retry["NEVER"] = "never"; })(Retry || (Retry = {})); export var RefreshExpiry; (function (RefreshExpiry) { RefreshExpiry["AUTO"] = "auto"; RefreshExpiry["MANUAL"] = "manual"; RefreshExpiry["NEVER"] = "never"; })(RefreshExpiry || (RefreshExpiry = {})); export var RefreshTimeout; (function (RefreshTimeout) { RefreshTimeout["AUTO"] = "auto"; RefreshTimeout["MANUAL"] = "manual"; RefreshTimeout["NEVER"] = "never"; })(RefreshTimeout || (RefreshTimeout = {})); export var State; (function (State) { State[State["SUCCESS"] = 0] = "SUCCESS"; State[State["WIDGET_CREATED"] = 1] = "WIDGET_CREATED"; State[State["WIDGET_REMOVED"] = 2] = "WIDGET_REMOVED"; State[State["WIDGET_RESET"] = 3] = "WIDGET_RESET"; State[State["AFTER_INTERACTIVE"] = 4] = "AFTER_INTERACTIVE"; State[State["BEFORE_INTERACTIVE"] = 5] = "BEFORE_INTERACTIVE"; State[State["ERROR"] = -1] = "ERROR"; State[State["EXPIRED"] = -2] = "EXPIRED"; State[State["TIMEOUT"] = -3] = "TIMEOUT"; })(State || (State = {})); export class TurnstileManager { obj; event; widgetId; containerRef; options; constructor(obj, event, widgetId = '', containerRef = '', options = '') { this.obj = obj; this.event = event; this.widgetId = widgetId; this.containerRef = containerRef; this.options = options; } reRender(options) { this.remove(null); this.updateOptions(options); this.widgetId = this.obj.render(this.containerRef, this.options); const payload = { name: 'WIDGET_CREATED', data: this.widgetId, result: State.WIDGET_CREATED, manager: this }; this.options.onCreate(payload); this.event.emit(payload); } reset(id) { this.obj.reset(id ?? this.widgetId); const payload = { name: 'WIDGET_RESET', data: id, result: State.WIDGET_RESET, manager: this }; this.options.onReset(payload); this.event.emit(payload); } remove(id) { this.obj.remove(id ?? this.widgetId); const payload = { name: 'WIDGET_REMOVED', data: id, result: State.WIDGET_REMOVED, manager: this }; this.options.onRemove(payload); this.event.emit(payload); } updateOptions(options) { if (this.options.sitekey !== options.siteKey) { this.options.sitekey = options.siteKey; } if (this.options.action !== options.action) { this.options.action = options.action; } if (this.options.cData !== options.cData) { this.options.cData = options.cData; } if (this.options.tabindex !== options.tabIndex) { this.options.tabindex = options.tabIndex; } if (this.options.language !== options.language) { this.options.language = options.language; } if (this.options.theme !== options.theme) { this.options.theme = options.theme; } if (this.options.size !== options.size) { this.options.size = options.size; } if (this.options.appearance !== options.appearance) { this.options.appearance = options.appearance; } if (this.options.retry !== options.retry) { this.options.retry = options.retry; } if (this.options['retry-interval'] !== options.retryInterval) { this.options['retry-interval'] = options.retryInterval; } if (this.options['refresh-expired'] !== options.refreshExpired) { this.options['refresh-expired'] = options.refreshExpired; } if (this.options['refresh-timeout'] !== options.refreshTimeout) { this.options['refresh-timeout'] = options.refreshTimeout; } if (this.options['response-field'] !== options.responseField) { this.options['response-field'] = options.responseField; } if (this.options['feedback-enabled'] !== options.feedbackEnabled) { this.options['feedback-enabled'] = options.feedbackEnabled; } } } class EventHandler { static widgetId; static tsManager; static event; static config = { siteKey: '', action: '', cData: '', tabIndex: 0, language: Language.AUTO, theme: Theme.AUTO, size: Size.NORMAL, appearance: Appearance.ALWAYS, retry: Retry.AUTO, retryInterval: 8000, refreshExpired: RefreshExpiry.AUTO, refreshTimeout: RefreshTimeout.AUTO, responseField: true, feedbackEnabled: true, onSuccess: (_) => { }, onError: (_) => { }, onExpired: (_) => { }, onBeforeInteractive: (_) => { }, onAfterInteractive: (_) => { }, onTimeout: (_) => { }, onCreate: (_) => { }, onReset: (_) => { }, onRemove: (_) => { }, }; static init(e, config, manager, widgetId = '') { EventHandler.event = e; EventHandler.config = config; EventHandler.tsManager = manager; EventHandler.widgetId = widgetId; } static emit(d) { EventHandler.event.emit(d); } static get e() { return EventHandler.event; } static setWidgetId(id) { EventHandler.widgetId = id; } static getWidgetId() { return EventHandler.widgetId; } static get conf() { return EventHandler.config; } static get manager() { return EventHandler.tsManager; } static copyWith(p) { if (p.manager !== null) { EventHandler.tsManager = p.manager; } if (p.widgetId !== null) { EventHandler.widgetId = p.widgetId; } } } export class NgCloudflareTurnstile { config = { siteKey: '', action: '', cData: '', tabIndex: 0, language: Language.AUTO, theme: Theme.AUTO, size: Size.NORMAL, appearance: Appearance.ALWAYS, retry: Retry.AUTO, retryInterval: 8000, refreshExpired: RefreshExpiry.AUTO, refreshTimeout: RefreshTimeout.AUTO, responseField: true, feedbackEnabled: true, onSuccess: (_) => { }, onError: (_) => { }, onExpired: (_) => { }, onBeforeInteractive: (_) => { }, onAfterInteractive: (_) => { }, onTimeout: (_) => { }, onCreate: (_) => { }, onReset: (_) => { }, onRemove: (_) => { }, }; event = new EventEmitter(); constructor() { window.onloadTurnstileCallback = function () { const conf = EventHandler.conf; const containerRef = "#cf-container"; const renderingConf = { sitekey: conf.siteKey, action: conf.action, cData: conf.cData, tabindex: conf.tabIndex, language: conf.language, theme: conf.theme, size: conf.size, appearance: conf.appearance, retry: conf.retry, 'retry-interval': conf.retryInterval, 'refresh-expired': conf.refreshExpired, 'refresh-timeout': conf.refreshTimeout, 'response-field': conf.responseField, 'feedback-enabled': conf.feedbackEnabled, callback: (token) => { const payload = { name: 'SUCCESS', data: token, result: State.SUCCESS, manager: EventHandler.manager }; EventHandler.conf.onSuccess(payload); EventHandler.emit(payload); }, 'error-callback': (code) => { const payload = { name: 'ERROR', data: code, result: State.ERROR, manager: EventHandler.manager }; EventHandler.conf.onError(payload); EventHandler.emit(payload); }, 'expired-callback': (d) => { const payload = { name: 'EXPIRED', data: d, result: State.EXPIRED, manager: EventHandler.manager }; EventHandler.conf.onExpired(payload); EventHandler.emit(payload); }, 'before-interactive-callback': (d) => { const payload = { name: 'BEFORE_INTERACTIVE', data: d, result: State.BEFORE_INTERACTIVE, manager: EventHandler.manager }; EventHandler.conf.onBeforeInteractive(payload); EventHandler.emit(payload); }, 'after-interactive-callback': (d) => { const payload = { name: 'AFTER_INTERACTIVE', data: d, result: State.AFTER_INTERACTIVE, manager: EventHandler.manager }; EventHandler.conf.onAfterInteractive(payload); EventHandler.emit(payload); }, 'timeout-callback': (d) => { const payload = { name: 'TIMEOUT', data: d, result: State.TIMEOUT, manager: EventHandler.manager }; EventHandler.conf.onTimeout(payload); EventHandler.emit(payload); }, // Add the custom callback onSuccess: conf.onSuccess, onError: conf.onError, onExpired: conf.onExpired, onBeforeInteractive: conf.onBeforeInteractive, onAfterInteractive: conf.onAfterInteractive, onTimeout: conf.onTimeout, onCreate: conf.onCreate, onReset: conf.onReset, onRemove: conf.onRemove, }; const widgetId = window.turnstile.render(containerRef, renderingConf); EventHandler.setWidgetId(widgetId); EventHandler.copyWith({ manager: new TurnstileManager(window.turnstile, EventHandler.e, widgetId, containerRef, renderingConf) }); const payload = { name: 'WIDGET_CREATED', data: widgetId, result: State.WIDGET_CREATED, manager: EventHandler.manager }; EventHandler.conf.onCreate(payload); EventHandler.emit(payload); }; } ngOnInit() { EventHandler.init(this.event, this.config, new TurnstileManager(window.turnstile, this.event)); if (window.turnstile) { window.onloadTurnstileCallback(); } } ngAfterViewInit() { this.loadTurnstileScript(); } loadTurnstileScript() { // Check if script is already loaded to avoid duplicates if (!document.querySelector('script[src*="turnstile"]')) { const script = document.createElement('script'); script.src = 'https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit&onload=onloadTurnstileCallback'; script.async = true; script.defer = true; document.head.appendChild(script); } } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgCloudflareTurnstile, deps: [], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: NgCloudflareTurnstile, isStandalone: true, selector: "ng-cloudflare-turnstile", inputs: { config: "config" }, outputs: { event: "event" }, ngImport: i0, template: `<div id="cf-container"></div>`, isInline: true, styles: [""] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgCloudflareTurnstile, decorators: [{ type: Component, args: [{ selector: 'ng-cloudflare-turnstile', standalone: true, imports: [], template: `<div id="cf-container"></div>` }] }], ctorParameters: () => [], propDecorators: { config: [{ type: Input }], event: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY2xvdWRmbGFyZS10dXJuc3RpbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctY2xvdWRmbGFyZS10dXJuc3RpbGUvc3JjL2xpYi9uZy1jbG91ZGZsYXJlLXR1cm5zdGlsZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBbUMsTUFBTSxlQUFlLENBQUM7O0FBbUJ4RyxNQUFNLENBQU4sSUFBWSxVQU1YO0FBTkQsV0FBWSxVQUFVO0lBQ2xCLHdEQUEwQyxDQUFBO0lBQzFDLHdEQUEwQyxDQUFBO0lBQzFDLGtFQUFvRCxDQUFBO0lBQ3BELGtFQUFvRCxDQUFBO0lBQ3BELHNFQUF3RCxDQUFBO0FBQzVELENBQUMsRUFOVyxVQUFVLEtBQVYsVUFBVSxRQU1yQjtBQUVELE1BQU0sQ0FBTixJQUFZLFFBeUNYO0FBekNELFdBQVksUUFBUTtJQUNoQix5QkFBYSxDQUFBO0lBQ2IsNEJBQWdCLENBQUE7SUFDaEIsK0JBQW1CLENBQUE7SUFDbkIsd0NBQTRCLENBQUE7SUFDNUIseUNBQTZCLENBQUE7SUFDN0IsOEJBQWtCLENBQUE7SUFDbEIsMkJBQWUsQ0FBQTtJQUNmLDRCQUFnQixDQUFBO0lBQ2hCLDJCQUFlLENBQUE7SUFDZiw2QkFBaUIsQ0FBQTtJQUNqQiwyQkFBZSxDQUFBO0lBQ2YsNkJBQWlCLENBQUE7SUFDakIsNEJBQWdCLENBQUE7SUFDaEIsNEJBQWdCLENBQUE7SUFDaEIsMkJBQWUsQ0FBQTtJQUNmLDRCQUFnQixDQUFBO0lBQ2hCLDJCQUFlLENBQUE7SUFDZiwrQkFBbUIsQ0FBQTtJQUNuQixnQ0FBb0IsQ0FBQTtJQUNwQiw2QkFBaUIsQ0FBQTtJQUNqQiw4QkFBa0IsQ0FBQTtJQUNsQiwyQkFBZSxDQUFBO0lBQ2YsNEJBQWdCLENBQUE7SUFDaEIsZ0NBQW9CLENB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akMsSUFBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQUMsQ0FBQztRQUN4RixJQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFBQyxDQUFDO1FBQ3BGLElBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFDLENBQUM7UUFDaEYsSUFBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7WUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQUMsQ0FBQztRQUM1RixJQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxLQUFLLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFBQyxDQUFDO1FBQzVGLElBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFDLENBQUM7UUFDaEYsSUFBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQUMsQ0FBQztRQUM1RSxJQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxLQUFLLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7UUFBQyxDQUFDO1FBQ3BHLElBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFDLENBQUM7UUFDaEYsSUFBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEtBQUssT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7UUFBQyxDQUFDO1FBQ3hILElBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO1FBQUMsQ0FBQztRQUM1SCxJQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsS0FBSyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7WUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztRQUFDLENBQUM7UUFDNUgsSUFBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEtBQUssT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7UUFBQyxDQUFDO1FBQ3hILElBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDO1FBQUMsQ0FBQztJQUNwSSxDQUFDO0NBQ0o7QUFFRCxNQUFNLFlBQVk7SUFDTixNQUFNLENBQUMsUUFBUSxDQUFTO0lBQ3hCLE1BQU0sQ0FBQyxTQUFTLENBQW1CO0lBQ25DLE1BQU0sQ0FBQyxLQUFLLENBQXVCO0lBQ25DLE1BQU0sQ0FBQyxNQUFNLEdBQVc7UUFDNUIsT0FBTyxFQUFFLEVBQUU7UUFDWCxNQUFNLEVBQUUsRUFBRTtRQUNWLEtBQUssRUFBRSxFQUFFO1FBQ1QsUUFBUSxFQUFFLENBQUM7UUFDWCxRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUk7UUFDdkIsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJO1FBQ2pCLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTTtRQUNqQixVQUFVLEVBQUUsVUFBVSxDQUFDLE1BQU07UUFDN0IsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJO1FBQ2pCLGFBQWEsRUFBRSxJQUFJO1FBQ25CLGNBQWMsRUFBRSxhQUFhLENBQUMsSUFBSTtRQUNsQyxjQUFjLEVBQUUsY0FBYyxDQUFDLElBQUk7UUFDbkMsYUFBYSxFQUFFLElBQUk7UUFDbkIsZUFBZSxFQUFFLElBQUk7UUFDckIsU0FBUyxFQUFFLENBQUMsQ0FBUyxFQUFRLEVBQUUsR0FBRSxDQUFDO1FBQ2xDLE9BQU8sRUFBRSxDQUFDLENBQVMsRUFBUSxFQUFFLEdBQUUsQ0FBQztRQUNoQyxTQUFTLEVBQUUsQ0FBQyxDQUFTLEVBQVEsRUFBRSxHQUFFLENBQUM7UUFDbEMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFTLEVBQVEsRUFBRSxHQUFFLENBQUM7UUFDNUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFTLEVBQVEsRUFBRSxHQUFFLENBQUM7UUFDM0MsU0FBUyxFQUFFLENBQUMsQ0FBUyxFQUFRLEVBQUUsR0FBRSxDQUFDO1FBQ2xDLFFBQVEsRUFBRSxDQUFDLENBQVMsRUFBUSxFQUFFLEdBQUUsQ0FBQztRQUNqQyxPQUFPLEVBQUUsQ0FBQyxDQUFTLEVBQVEsRUFBRSxHQUFFLENBQUM7UUFDaEMsUUFBUSxFQUFFLENBQUMsQ0FBUyxFQUFRLEVBQUUsR0FBRSxDQUFDO0tBQ3BDLENBQUM7SUFFRixNQUFNLENBQUMsSUFBSSxDQUFDLENBQXVCLEVBQUUsTUFBYyxFQUFFLE9BQXlCLEVBQUUsUUFBUSxHQUFHLEVBQUU7UUFDekYsWUFBWSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDdkIsWUFBWSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDN0IsWUFBWSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUM7UUFDakMsWUFBWSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDckMsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBUztRQUNqQixZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsTUFBTSxLQUFLLENBQUM7UUFDUixPQUFPLFlBQVksQ0FBQyxLQUFLLENBQUM7SUFDOUIsQ0FBQztJQUVELE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBVTtRQUN6QixZQUFZLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsTUFBTSxDQUFDLFdBQVc7UUFDZCxPQUFPLFlBQVksQ0FBQyxRQUFRLENBQUM7SUFDakMsQ0FBQztJQUVELE1BQU0sS0FBSyxJQUFJO1FBQ1gsT0FBTyxZQUFZLENBQUMsTUFBTSxDQUFDO0lBQy9CLENBQUM7SUFFRCxNQUFNLEtBQUssT0FBTztRQUNkLE9BQU8sWUFBWSxDQUFDLFNBQVMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUdmO1FBQ0csSUFBRyxDQUFDLENBQUMsT0FBTyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQUMsWUFBWSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsT0FBUSxDQUFDO1FBQUMsQ0FBQztRQUMvRCxJQUFHLENBQUMsQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFLENBQUM7WUFBQyxZQUFZLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxRQUFTLENBQUM7UUFBQyxDQUFDO0lBQ3BFLENBQUM7O0FBVUwsTUFBTSxPQUFPLHFCQUFxQjtJQUNyQixNQUFNLEdBQVc7UUFDdEIsT0FBTyxFQUFFLEVBQUU7UUFDWCxNQUFNLEVBQUUsRUFBRTtRQUNWLEtBQUssRUFBRSxFQUFFO1FBQ1QsUUFBUSxFQUFFLENBQUM7UUFDWCxRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUk7UUFDdkIsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJO1FBQ2pCLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTTtRQUNqQixVQUFVLEVBQUUsVUFBVSxDQUFDLE1BQU07UUFDN0IsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJO1FBQ2pCLGFBQWEsRUFBRSxJQUFJO1FBQ25CLGNBQWMsRUFBRSxhQUFhLENBQUMsSUFBSTtRQUNsQyxjQUFjLEVBQUUsY0FBYyxDQUFDLElBQUk7UUFDbkMsYUFBYSxFQUFFLElBQUk7UUFDbkIsZUFBZSxFQUFFLElBQUk7UUFDckIsU0FBUyxFQUFFLENBQUMsQ0FBUyxFQUFRLEVBQUUsR0FBRSxDQUFDO1FBQ2xDLE9BQU8sRUFBRSxDQUFDLENBQVMsRUFBUSxFQUFFLEdBQUUsQ0FBQztRQUNoQyxTQUFTLEVBQUUsQ0FBQyxDQUFTLEVBQVEsRUFBRSxHQUFFLENBQUM7UUFDbEMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFTLEVBQVEsRUFBRSxHQUFFLENBQUM7UUFDNUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFTLEVBQVEsRUFBRSxHQUFFLENBQUM7UUFDM0MsU0FBUyxFQUFFLENBQUMsQ0FBUyxFQUFRLEVBQUUsR0FBRSxDQUFDO1FBQ2xDLFFBQVEsRUFBRSxDQUFDLENBQVMsRUFBUSxFQUFFLEdBQUUsQ0FBQztRQUNqQyxPQUFPLEVBQUUsQ0FBQyxDQUFTLEVBQVEsRUFBRSxHQUFFLENBQUM7UUFDaEMsUUFBUSxFQUFFLENBQUMsQ0FBUyxFQUFRLEVBQUUsR0FBRSxDQUFDO0tBQ3BDLENBQUM7SUFDUSxLQUFLLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztJQUM3QztRQUNJLE1BQU0sQ0FBQyx1QkFBdUIsR0FBRztZQUM3QixNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDO1lBQy9CLE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQztZQUNyQyxNQUFNLGFBQWEsR0FBRztnQkFDbEIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO2dCQUNyQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0JBQ25CLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztnQkFDakIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO2dCQUN2QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7Z0JBQ3ZCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztnQkFDakIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNmLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtnQkFDM0IsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNqQixnQkFBZ0IsRUFBRSxJQUFJLENBQUMsYUFBYTtnQkFDcEMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGNBQWM7Z0JBQ3RDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxjQUFjO2dCQUN0QyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsYUFBYTtnQkFDcEMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGVBQWU7Z0JBQ3hDLFFBQVEsRUFBRSxDQUFDLEtBQVUsRUFBRSxFQUFFO29CQUNyQixNQUFNLE9BQU8sR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLE9BQU8sRUFBQyxDQUFDO29CQUN0RyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDdEMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDL0IsQ0FBQztnQkFDRCxnQkFBZ0IsRUFBRSxDQUFDLElBQVMsRUFBRSxFQUFFO29CQUM1QixNQUFNLE9BQU8sR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNsRyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDcEMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDL0IsQ0FBQztnQkFDRCxrQkFBa0IsRUFBRSxDQUFDLENBQU0sRUFBRSxFQUFFO29CQUMzQixNQUFNLE9BQU8sR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNuRyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDdEMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDL0IsQ0FBQztnQkFDRCw2QkFBNkIsRUFBRSxDQUFDLENBQU0sRUFBRSxFQUFFO29CQUN0QyxNQUFNLE9BQU8sR0FBRyxFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsa0JBQWtCLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDekgsWUFBWSxDQUFDLElBQUksQ0FBQyxtQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDaEQsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDL0IsQ0FBQztnQkFDRCw0QkFBNEIsRUFBRSxDQUFDLENBQU0sRUFBRSxFQUFFO29CQUNyQyxNQUFNLE9BQU8sR0FBRyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDdkgsWUFBWSxDQUFDLElBQUksQ0FBQyxrQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDL0MsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDL0IsQ0FBQztnQkFDRCxrQkFBa0IsRUFBRSxDQUFDLENBQU0sRUFBRSxFQUFFO29CQUMzQixNQUFNLE9BQU8sR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNuRyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDdEMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDL0IsQ0FBQztnQkFDRCwwQkFBMEI7Z0JBQzFCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztnQkFDekIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO2dCQUNyQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7Z0JBQ3pCLG1CQUFtQixFQUFFLElBQUksQ0FBQyxtQkFBbUI7Z0JBQzdDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxrQkFBa0I7Z0JBQzNDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztnQkFDekIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO2dCQUN2QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87Z0JBQ3JCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTthQUMxQixDQUFDO1lBQ0YsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQ3RFLFlBQVksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbkMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxFQUFDLE9BQU8sRUFBRSxJQUFJLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLGFBQWEsQ0FBQyxFQUFDLENBQUMsQ0FBQztZQUVoSSxNQUFNLE9BQU8sR0FBRyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsY0FBYyxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsT0FBTyxFQUFDLENBQUM7WUFDdkgsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUM7SUFDTixDQUFDO0lBRUQsUUFBUTtRQUNKLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMvRixJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixNQUFNLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUNyQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGVBQWUsS0FBVyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFL0MsbUJBQW1CO1FBQ3ZCLHdEQUF3RDtRQUN4RCxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQywwQkFBMEIsQ0FBQyxFQUFFLENBQUM7WUFDdEQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNoRCxNQUFNLENBQUMsR0FBRyxHQUFHLHNHQUFzRyxDQUFDO1lBQ3BILE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLENBQUM7SUFDTCxDQUFDO3dHQW5IUSxxQkFBcUI7NEZBQXJCLHFCQUFxQiw4SUFIcEIsK0JBQStCOzs0RkFHaEMscUJBQXFCO2tCQVBqQyxTQUFTOytCQUNJLHlCQUF5QixjQUN2QixJQUFJLFdBQ1AsRUFBRSxZQUNELCtCQUErQjt3REFJaEMsTUFBTTtzQkFBZCxLQUFLO2dCQXlCSSxLQUFLO3NCQUFkLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgdHlwZSBBZnRlclZpZXdJbml0LCB0eXBlIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gICAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgICAgIG9ubG9hZFR1cm5zdGlsZUNhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICAgICAgICB0dXJuc3RpbGU6IHtcbiAgICAgICAgICAgIHJlbmRlcjogKFxuICAgICAgICAgICAgICAgIGlkT3JDb250YWluZXI6IHN0cmluZyB8IEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGFueSxcbiAgICAgICAgICAgICkgPT4gc3RyaW5nO1xuICAgICAgICAgICAgcmVzZXQ6ICh3aWRnZXRJZE9yQ29udGFpbmVyOiBzdHJpbmcgfCBIVE1MRWxlbWVudCkgPT4gdm9pZDtcbiAgICAgICAgICAgIGdldFJlc3BvbnNlOiAoXG4gICAgICAgICAgICAgICAgd2lkZ2V0SWRPckNvbnRhaW5lcjogc3RyaW5nIHwgSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICApID0+IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJlbW92ZTogKHdpZGdldElkT3JDb250YWluZXI6IHN0cmluZyB8IEhUTUxFbGVtZW50KSA9PiB2b2lkO1xuICAgICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGVudW0gRGV2U2l0ZUtleSB7XG4gICAgQUxXQVlTX1BBU1NFUyA9ICcxeDAwMDAwMDAwMDAwMDAwMDAwMDAwQUEnLFxuICAgIEFMV0FZU19CTE9DS1MgPSAnMngwMDAwMDAwMDAwMDAwMDAwMDAwMEFCJyxcbiAgICBBTFdBWVNfUEFTU0VTX0lOVklTSUJMRSA9ICcxeDAwMDAwMDAwMDAwMDAwMDAwMDAwQkInLFxuICAgIEFMV0FZU19CTE9DS1NfSU5WSVNJQkxFID0gJzJ4MDAwMDAwMDAwMDAwMDAwMDAwMDBCQicsXG4gICAgRk9SQ0VfSU5URVJBQ1RJVkVfQ0hBTExFTkdFID0gJzN4MDAwMDAwMDAwMDAwMDAwMDAwMDBGRicsXG59XG5cbmV4cG9ydCBlbnVtIExhbmd1YWdlIHtcbiAgICBBVVRPID0gJ2F1dG8nLFxuICAgIEFSQUJJQyA9ICdhci1lZycsXG4gICAgQlVMR0FSSUFOID0gJ2JnLWJnJyxcbiAgICBDSElORVNFX1NJTVBMSUZJRUQgPSAnemgtY24nLFxuICAgIENISU5FU0VfVFJBRElUSU9OQUwgPSAnemgtdHcnLFxuICAgIENST0FUSUFOID0gJ2hyLWhyJyxcbiAgICBDWkVDSCA9ICdjcy1jeicsXG4gICAgREFOSVNIID0gJ2RhLWRrJyxcbiAgICBEVVRDSCA9ICdubC1ubCcsXG4gICAgRU5HTElTSCA9ICdlbi11cycsXG4gICAgRkFSU0kgPSAnZmEtaXInLFxuICAgIEZJTk5JU0ggPSAnZmktZmknLFxuICAgIEZSRU5DSCA9ICdmci1mcicsXG4gICAgR0VSTUFOID0gJ2RlLWRlJyxcbiAgICBHUkVFSyA9ICdlbC1ncicsXG4gICAgSEVCUkVXID0gJ2hlLWlsJyxcbiAgICBISU5ESSA9ICdoaS1pbicsXG4gICAgSFVOR0FSSUFOID0gJ2h1LWh1JyxcbiAgICBJTkRPTkVTSUFOID0gJ2lkLWlkJyxcbiAgICBJVEFMSUFOID0gJ2l0LWl0JyxcbiAgICBKQVBBTkVTRSA9ICdqYS1qcCcsXG4gICAgS0xJTkdPTiA9ICd0bGgnLFxuICAgIEtPUkVBTiA9ICdrby1rcicsXG4gICAgTElUSFVBTklBTiA9ICdsdC1sdCcsXG4gICAgTUFMQVkgPSAnbXMtbXknLFxuICAgIE5PUldFR0lBTiA9ICduYi1ubycsXG4gICAgUE9MSVNIID0gJ3BsLXBsJyxcbiAgICBQT1JUVUdVRVNFID0gJ3B0LWJyJyxcbiAgICBST01BTklBTiA9ICdyby1ybycsXG4gICAgUlVTU0lBTiA9ICdydS1ydScsXG4gICAgU0VSQklBTiA9ICdzci1iYScsXG4gICAgU0xPVkFLID0gJ3NrLXNrJyxcbiAgICBTTE9WRU5JQU4gPSAnc2wtc2knLFxuICAgIFNQQU5JU0ggPSAnZXMtZXMnLFxuICAgIFNXRURJU0ggPSAnc3Ytc2UnLFxuICAgIFRBR0FMT0cgPSAndGwtcGgnLFxuICAgIFRIQUkgPSAndGgtdGgnLFxuICAgIFRVUktJU0ggPSAndHItdHInLFxuICAgIFVLUkFJTklBTiA9ICd1ay11YScsXG4gICAgVklFVE5BTUVTRSA9ICd2aS12bidcbn1cblxuZXhwb3J0IGVudW0gVGhlbWUge1xuICAgIExJR0hUID0gJ2xpZ2h0JyxcbiAgICBEQVJLID0gJ2RhcmsnLFxuICAgIEFVVE8gPSAnYXV0bycsXG59XG5cbmV4cG9ydCBlbnVtIFNpemUge1xuICAgIE5PUk1BTCA9ICdub3JtYWwnLFxuICAgIEZMRVhJQkxFID0gJ2ZsZXhpYmxlJyxcbiAgICBDT01QQUNUID0gJ2NvbXBhY3QnLFxufVxuXG5leHBvcnQgZW51bSBBcHBlYXJhbmNlIHtcbiAgICBBTFdBWVMgPSAnYWx3YXlzJyxcbiAgICBFWEVDVVRFID0gJ2V4ZWN1dGUnLFxuICAgIElOVEVSQUNUSU9OX09OTFkgPSAnaW50ZXJhY3Rpb24tb25seScsXG59XG5cbmV4cG9ydCBlbnVtIFJldHJ5IHtcbiAgICBBVVRPID0gJ2F1dG8nLFxuICAgIE5FVkVSID0gJ25ldmVyJyxcbn1cblxuZXhwb3J0IGVudW0gUmVmcmVzaEV4cGlyeSB7XG4gICAgQVVUTyA9ICdhdXRvJyxcbiAgICBNQU5VQUwgPSAnbWFudWFsJyxcbiAgICBORVZFUiA9ICduZXZlcicsXG59XG5cbmV4cG9ydCBlbnVtIFJlZnJlc2hUaW1lb3V0IHtcbiAgICBBVVRPID0gJ2F1dG8nLFxuICAgIE1BTlVBTCA9ICdtYW51YWwnLFxuICAgIE5FVkVSID0gJ25ldmVyJyxcbn1cblxuZXhwb3J0IGVudW0gU3RhdGUge1xuICAgIFNVQ0NFU1MgPSAwLFxuICAgIFdJREdFVF9DUkVBVEVEID0gMSxcbiAgICBXSURHRVRfUkVNT1ZFRCA9IDIsXG4gICAgV0lER0VUX1JFU0VUID0gMyxcbiAgICBBRlRFUl9JTlRFUkFDVElWRSA9IDQsXG4gICAgQkVGT1JFX0lOVEVSQUNUSVZFID0gNSxcbiAgICBFUlJPUiA9IC0xLFxuICAgIEVYUElSRUQgPSAtMixcbiAgICBUSU1FT1VUID0gLTMsXG59XG5cbmV4cG9ydCB0eXBlIFJlc3VsdCA9IHtcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZGF0YT86IGFueVxuICAgIHJlc3VsdDogbnVtYmVyLFxuICAgIG1hbmFnZXI6IFR1cm5zdGlsZU1hbmFnZXJcbn1cblxuZXhwb3J0IHR5cGUgRXZlbnRDYWxsYmFjayA9IChkOiBSZXN1bHQpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBDb25maWcgPSB7XG4gICAgc2l0ZUtleTogc3RyaW5nO1xuICAgIGFjdGlvbj86IHN0cmluZztcbiAgICBjRGF0YT86IHN0cmluZztcbiAgICB0YWJJbmRleD86IG51bWJlcjtcbiAgICBsYW5ndWFnZT86IExhbmd1YWdlO1xuICAgIHRoZW1lPzogVGhlbWU7XG4gICAgcmVzcG9uc2VGaWVsZD86IGJvb2xlYW47XG4gICAgc2l6ZT86IFNpemU7XG4gICAgYXBwZWFyYW5jZT86IEFwcGVhcmFuY2U7XG4gICAgcmV0cnk/OiBSZXRyeTtcbiAgICByZXRyeUludGVydmFsPzogbnVtYmVyO1xuICAgIHJlZnJlc2hFeHBpcmVkPzogUmVmcmVzaEV4cGlyeTtcbiAgICByZWZyZXNoVGltZW91dD86IFJlZnJlc2hUaW1lb3V0O1xuICAgIGZlZWRiYWNrRW5hYmxlZD86IGJvb2xlYW47XG4gICAgb25TdWNjZXNzPzogRXZlbnRDYWxsYmFjayxcbiAgICBvbkVycm9yPzogRXZlbnRDYWxsYmFjayxcbiAgICBvbkV4cGlyZWQ/OiBFdmVudENhbGxiYWNrLFxuICAgIG9uQmVmb3JlSW50ZXJhY3RpdmU/OiBFdmVudENhbGxiYWNrLFxuICAgIG9uQWZ0ZXJJbnRlcmFjdGl2ZT86IEV2ZW50Q2FsbGJhY2ssXG4gICAgb25UaW1lb3V0PzogRXZlbnRDYWxsYmFjayxcbiAgICBvbkNyZWF0ZT86IEV2ZW50Q2FsbGJhY2ssXG4gICAgb25SZXNldD86IEV2ZW50Q2FsbGJhY2ssXG4gICAgb25SZW1vdmU/OiBFdmVudENhbGxiYWNrLFxufVxuXG5leHBvcnQgY2xhc3MgVHVybnN0aWxlTWFuYWdlciB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgb2JqOiBhbnksXG4gICAgICAgIHByaXZhdGUgZXZlbnQ6IEV2ZW50RW1pdHRlcjxSZXN1bHQ+LFxuICAgICAgICBwcml2YXRlIHdpZGdldElkOiBzdHJpbmcgPSAnJyxcbiAgICAgICAgcHJpdmF0ZSBjb250YWluZXJSZWY6IHN0cmluZyB8IEhUTUxFbGVtZW50ID0gJycsXG4gICAgICAgIHByaXZhdGUgb3B0aW9uczogYW55ID0gJydcbiAgICApIHt9XG5cbiAgICByZVJlbmRlcihvcHRpb25zOiBDb25maWcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZW1vdmUobnVsbCk7XG4gICAgICAgIHRoaXMudXBkYXRlT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy53aWRnZXRJZCA9IHRoaXMub2JqLnJlbmRlcih0aGlzLmNvbnRhaW5lclJlZiwgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSB7IG5hbWU6ICdXSURHRVRfQ1JFQVRFRCcsIGRhdGE6IHRoaXMud2lkZ2V0SWQsIHJlc3VsdDogU3RhdGUuV0lER0VUX0NSRUFURUQsIG1hbmFnZXI6IHRoaXN9XG4gICAgICAgIHRoaXMub3B0aW9ucy5vbkNyZWF0ZShwYXlsb2FkKTtcbiAgICAgICAgdGhpcy5ldmVudC5lbWl0KHBheWxvYWQpO1xuICAgIH1cblxuICAgIHJlc2V0KGlkOiBzdHJpbmcgfCBIVE1MRWxlbWVudCB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vYmoucmVzZXQoaWQgPz8gdGhpcy53aWRnZXRJZCk7XG5cbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHsgbmFtZTogJ1dJREdFVF9SRVNFVCcsIGRhdGE6IGlkLCByZXN1bHQ6IFN0YXRlLldJREdFVF9SRVNFVCwgbWFuYWdlcjogdGhpc307XG4gICAgICAgIHRoaXMub3B0aW9ucy5vblJlc2V0KHBheWxvYWQpO1xuICAgICAgICB0aGlzLmV2ZW50LmVtaXQocGF5bG9hZCk7XG4gICAgfVxuICAgIFxuICAgIHJlbW92ZShpZDogc3RyaW5nIHwgSFRNTEVsZW1lbnQgfCBudWxsKTogdm9pZCB7XG4gICAgICAgIHRoaXMub2JqLnJlbW92ZShpZCA/PyB0aGlzLndpZGdldElkKTtcblxuICAgICAgICBjb25zdCBwYXlsb2FkID0geyBuYW1lOiAnV0lER0VUX1JFTU9WRUQnLCBkYXRhOiBpZCwgcmVzdWx0OiBTdGF0ZS5XSURHRVRfUkVNT1ZFRCwgbWFuYWdlcjogdGhpc307XG4gICAgICAgIHRoaXMub3B0aW9ucy5vblJlbW92ZShwYXlsb2FkKTtcbiAgICAgICAgdGhpcy5ldmVudC5lbWl0KHBheWxvYWQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlT3B0aW9ucyhvcHRpb25zOiBDb25maWcpOiB2b2lkIHtcbiAgICAgICAgaWYodGhpcy5vcHRpb25zLnNpdGVrZXkgIT09IG9wdGlvbnMuc2l0ZUtleSkgeyB0aGlzLm9wdGlvbnMuc2l0ZWtleSA9IG9wdGlvbnMuc2l0ZUtleTsgfVxuICAgICAgICBpZih0aGlzLm9wdGlvbnMuYWN0aW9uICE9PSBvcHRpb25zLmFjdGlvbikgeyB0aGlzLm9wdGlvbnMuYWN0aW9uID0gb3B0aW9ucy5hY3Rpb247IH1cbiAgICAgICAgaWYodGhpcy5vcHRpb25zLmNEYXRhICE9PSBvcHRpb25zLmNEYXRhKSB7IHRoaXMub3B0aW9ucy5jRGF0YSA9IG9wdGlvbnMuY0RhdGE7IH1cbiAgICAgICAgaWYodGhpcy5vcHRpb25zLnRhYmluZGV4ICE9PSBvcHRpb25zLnRhYkluZGV4KSB7IHRoaXMub3B0aW9ucy50YWJpbmRleCA9IG9wdGlvbnMudGFiSW5kZXg7IH1cbiAgICAgICAgaWYodGhpcy5vcHRpb25zLmxhbmd1YWdlICE9PSBvcHRpb25zLmxhbmd1YWdlKSB7IHRoaXMub3B0aW9ucy5sYW5ndWFnZSA9IG9wdGlvbnMubGFuZ3VhZ2U7IH1cbiAgICAgICAgaWYodGhpcy5vcHRpb25zLnRoZW1lICE9PSBvcHRpb25zLnRoZW1lKSB7IHRoaXMub3B0aW9ucy50aGVtZSA9IG9wdGlvbnMudGhlbWU7IH1cbiAgICAgICAgaWYodGhpcy5vcHRpb25zLnNpemUgIT09IG9wdGlvbnMuc2l6ZSkgeyB0aGlzLm9wdGlvbnMuc2l6ZSA9IG9wdGlvbnMuc2l6ZTsgfVxuICAgICAgICBpZih0aGlzLm9wdGlvbnMuYXBwZWFyYW5jZSAhPT0gb3B0aW9ucy5hcHBlYXJhbmNlKSB7IHRoaXMub3B0aW9ucy5hcHBlYXJhbmNlID0gb3B0aW9ucy5hcHBlYXJhbmNlOyB9XG4gICAgICAgIGlmKHRoaXMub3B0aW9ucy5yZXRyeSAhPT0gb3B0aW9ucy5yZXRyeSkgeyB0aGlzLm9wdGlvbnMucmV0cnkgPSBvcHRpb25zLnJldHJ5OyB9XG4gICAgICAgIGlmKHRoaXMub3B0aW9uc1sncmV0cnktaW50ZXJ2YWwnXSAhPT0gb3B0aW9ucy5yZXRyeUludGVydmFsKSB7IHRoaXMub3B0aW9uc1sncmV0cnktaW50ZXJ2YWwnXSA9IG9wdGlvbnMucmV0cnlJbnRlcnZhbDsgfVxuICAgICAgICBpZih0aGlzLm9wdGlvbnNbJ3JlZnJlc2gtZXhwaXJlZCddICE9PSBvcHRpb25zLnJlZnJlc2hFeHBpcmVkKSB7IHRoaXMub3B0aW9uc1sncmVmcmVzaC1leHBpcmVkJ10gPSBvcHRpb25zLnJlZnJlc2hFeHBpcmVkOyB9XG4gICAgICAgIGlmKHRoaXMub3B0aW9uc1sncmVmcmVzaC10aW1lb3V0J10gIT09IG9wdGlvbnMucmVmcmVzaFRpbWVvdXQpIHsgdGhpcy5vcHRpb25zWydyZWZyZXNoLXRpbWVvdXQnXSA9IG9wdGlvbnMucmVmcmVzaFRpbWVvdXQ7IH1cbiAgICAgICAgaWYodGhpcy5vcHRpb25zWydyZXNwb25zZS1maWVsZCddICE9PSBvcHRpb25zLnJlc3BvbnNlRmllbGQpIHsgdGhpcy5vcHRpb25zWydyZXNwb25zZS1maWVsZCddID0gb3B0aW9ucy5yZXNwb25zZUZpZWxkOyB9XG4gICAgICAgIGlmKHRoaXMub3B0aW9uc1snZmVlZGJhY2stZW5hYmxlZCddICE9PSBvcHRpb25zLmZlZWRiYWNrRW5hYmxlZCkgeyB0aGlzLm9wdGlvbnNbJ2ZlZWRiYWNrLWVuYWJsZWQnXSA9IG9wdGlvbnMuZmVlZGJhY2tFbmFibGVkOyB9XG4gICAgfVxufVxuXG5jbGFzcyBFdmVudEhhbmRsZXIge1xuICAgIHByaXZhdGUgc3RhdGljIHdpZGdldElkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBzdGF0aWMgdHNNYW5hZ2VyOiBUdXJuc3RpbGVNYW5hZ2VyO1xuICAgIHByaXZhdGUgc3RhdGljIGV2ZW50OiBFdmVudEVtaXR0ZXI8UmVzdWx0PjtcbiAgICBwcml2YXRlIHN0YXRpYyBjb25maWc6IENvbmZpZyA9IHtcbiAgICAgICAgc2l0ZUtleTogJycsXG4gICAgICAgIGFjdGlvbjogJycsXG4gICAgICAgIGNEYXRhOiAnJyxcbiAgICAgICAgdGFiSW5kZXg6IDAsXG4gICAgICAgIGxhbmd1YWdlOiBMYW5ndWFnZS5BVVRPLFxuICAgICAgICB0aGVtZTogVGhlbWUuQVVUTyxcbiAgICAgICAgc2l6ZTogU2l6ZS5OT1JNQUwsXG4gICAgICAgIGFwcGVhcmFuY2U6IEFwcGVhcmFuY2UuQUxXQVlTLFxuICAgICAgICByZXRyeTogUmV0cnkuQVVUTyxcbiAgICAgICAgcmV0cnlJbnRlcnZhbDogODAwMCxcbiAgICAgICAgcmVmcmVzaEV4cGlyZWQ6IFJlZnJlc2hFeHBpcnkuQVVUTyxcbiAgICAgICAgcmVmcmVzaFRpbWVvdXQ6IFJlZnJlc2hUaW1lb3V0LkFVVE8sXG4gICAgICAgIHJlc3BvbnNlRmllbGQ6IHRydWUsXG4gICAgICAgIGZlZWRiYWNrRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgb25TdWNjZXNzOiAoXzogUmVzdWx0KTogdm9pZCA9PiB7fSxcbiAgICAgICAgb25FcnJvcjogKF86IFJlc3VsdCk6IHZvaWQgPT4ge30sXG4gICAgICAgIG9uRXhwaXJlZDogKF86IFJlc3VsdCk6IHZvaWQgPT4ge30sXG4gICAgICAgIG9uQmVmb3JlSW50ZXJhY3RpdmU6IChfOiBSZXN1bHQpOiB2b2lkID0+IHt9LFxuICAgICAgICBvbkFmdGVySW50ZXJhY3RpdmU6IChfOiBSZXN1bHQpOiB2b2lkID0+IHt9LFxuICAgICAgICBvblRpbWVvdXQ6IChfOiBSZXN1bHQpOiB2b2lkID0+IHt9LFxuICAgICAgICBvbkNyZWF0ZTogKF86IFJlc3VsdCk6IHZvaWQgPT4ge30sXG4gICAgICAgIG9uUmVzZXQ6IChfOiBSZXN1bHQpOiB2b2lkID0+IHt9LFxuICAgICAgICBvblJlbW92ZTogKF86IFJlc3VsdCk6IHZvaWQgPT4ge30sXG4gICAgfTtcblxuICAgIHN0YXRpYyBpbml0KGU6IEV2ZW50RW1pdHRlcjxSZXN1bHQ+LCBjb25maWc6IENvbmZpZywgbWFuYWdlcjogVHVybnN0aWxlTWFuYWdlciwgd2lkZ2V0SWQgPSAnJyk6IHZvaWQge1xuICAgICAgICBFdmVudEhhbmRsZXIuZXZlbnQgPSBlO1xuICAgICAgICBFdmVudEhhbmRsZXIuY29uZmlnID0gY29uZmlnO1xuICAgICAgICBFdmVudEhhbmRsZXIudHNNYW5hZ2VyID0gbWFuYWdlcjtcbiAgICAgICAgRXZlbnRIYW5kbGVyLndpZGdldElkID0gd2lkZ2V0SWQ7XG4gICAgfVxuXG4gICAgc3RhdGljIGVtaXQoZDogUmVzdWx0KTogdm9pZCB7XG4gICAgICAgIEV2ZW50SGFuZGxlci5ldmVudC5lbWl0KGQpO1xuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgZ2V0IGUoKTogRXZlbnRFbWl0dGVyPFJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gRXZlbnRIYW5kbGVyLmV2ZW50O1xuICAgIH1cblxuICAgIHN0YXRpYyBzZXRXaWRnZXRJZChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIEV2ZW50SGFuZGxlci53aWRnZXRJZCA9IGlkO1xuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgZ2V0V2lkZ2V0SWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIEV2ZW50SGFuZGxlci53aWRnZXRJZDtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IGNvbmYoKTogQ29uZmlnIHtcbiAgICAgICAgcmV0dXJuIEV2ZW50SGFuZGxlci5jb25maWc7XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyBnZXQgbWFuYWdlcigpOiBUdXJuc3RpbGVNYW5hZ2VyIHtcbiAgICAgICAgcmV0dXJuIEV2ZW50SGFuZGxlci50c01hbmFnZXI7XG4gICAgfVxuXG4gICAgc3RhdGljIGNvcHlXaXRoKHA6IHtcbiAgICAgICAgbWFuYWdlcj86IFR1cm5zdGlsZU1hbmFnZXIsXG4gICAgICAgIHdpZGdldElkPzogc3RyaW5nLFxuICAgIH0pOiB2b2lkIHtcbiAgICAgICAgaWYocC5tYW5hZ2VyICE9PSBudWxsKSB7IEV2ZW50SGFuZGxlci50c01hbmFnZXIgPSBwLm1hbmFnZXIhOyB9XG4gICAgICAgIGlmKHAud2lkZ2V0SWQgIT09IG51bGwpIHsgRXZlbnRIYW5kbGVyLndpZGdldElkID0gcC53aWRnZXRJZCE7IH1cbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmctY2xvdWRmbGFyZS10dXJuc3RpbGUnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW10sXG4gICAgdGVtcGxhdGU6IGA8ZGl2IGlkPVwiY2YtY29udGFpbmVyXCI+PC9kaXY+YCxcbiAgICBzdHlsZXM6IGBgXG59KVxuZXhwb3J0IGNsYXNzIE5nQ2xvdWRmbGFyZVR1cm5zdGlsZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uSW5pdCB7XG4gICAgQElucHV0KCkgY29uZmlnOiBDb25maWcgPSB7XG4gICAgICAgIHNpdGVLZXk6ICcnLFxuICAgICAgICBhY3Rpb246ICcnLFxuICAgICAgICBjRGF0YTogJycsXG4gICAgICAgIHRhYkluZGV4OiAwLFxuICAgICAgICBsYW5ndWFnZTogTGFuZ3VhZ2UuQVVUTyxcbiAgICAgICAgdGhlbWU6IFRoZW1lLkFVVE8sXG4gICAgICAgIHNpemU6IFNpemUuTk9STUFMLFxuICAgICAgICBhcHBlYXJhbmNlOiBBcHBlYXJhbmNlLkFMV0FZUyxcbiAgICAgICAgcmV0cnk6IFJldHJ5LkFVVE8sXG4gICAgICAgIHJldHJ5SW50ZXJ2YWw6IDgwMDAsXG4gICAgICAgIHJlZnJlc2hFeHBpcmVkOiBSZWZyZXNoRXhwaXJ5LkFVVE8sXG4gICAgICAgIHJlZnJlc2hUaW1lb3V0OiBSZWZyZXNoVGltZW91dC5BVVRPLFxuICAgICAgICByZXNwb25zZUZpZWxkOiB0cnVlLFxuICAgICAgICBmZWVkYmFja0VuYWJsZWQ6IHRydWUsXG4gICAgICAgIG9uU3VjY2VzczogKF86IFJlc3VsdCk6IHZvaWQgPT4ge30sXG4gICAgICAgIG9uRXJyb3I6IChfOiBSZXN1bHQpOiB2b2lkID0+IHt9LFxuICAgICAgICBvbkV4cGlyZWQ6IChfOiBSZXN1bHQpOiB2b2lkID0+IHt9LFxuICAgICAgICBvbkJlZm9yZUludGVyYWN0aXZlOiAoXzogUmVzdWx0KTogdm9pZCA9PiB7fSxcbiAgICAgICAgb25BZnRlckludGVyYWN0aXZlOiAoXzogUmVzdWx0KTogdm9pZCA9PiB7fSxcbiAgICAgICAgb25UaW1lb3V0OiAoXzogUmVzdWx0KTogdm9pZCA9PiB7fSxcbiAgICAgICAgb25DcmVhdGU6IChfOiBSZXN1bHQpOiB2b2lkID0+IHt9LFxuICAgICAgICBvblJlc2V0OiAoXzogUmVzdWx0KTogdm9pZCA9PiB7fSxcbiAgICAgICAgb25SZW1vdmU6IChfOiBSZXN1bHQpOiB2b2lkID0+IHt9LFxuICAgIH07XG4gICAgQE91dHB1dCgpIGV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxSZXN1bHQ+KCk7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHdpbmRvdy5vbmxvYWRUdXJuc3RpbGVDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmYgPSBFdmVudEhhbmRsZXIuY29uZjtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lclJlZiA9IFwiI2NmLWNvbnRhaW5lclwiO1xuICAgICAgICAgICAgY29uc3QgcmVuZGVyaW5nQ29uZiA9IHtcbiAgICAgICAgICAgICAgICBzaXRla2V5OiBjb25mLnNpdGVLZXksXG4gICAgICAgICAgICAgICAgYWN0aW9uOiBjb25mLmFjdGlvbixcbiAgICAgICAgICAgICAgICBjRGF0YTogY29uZi5jRGF0YSxcbiAgICAgICAgICAgICAgICB0YWJpbmRleDogY29uZi50YWJJbmRleCxcbiAgICAgICAgICAgICAgICBsYW5ndWFnZTogY29uZi5sYW5ndWFnZSxcbiAgICAgICAgICAgICAgICB0aGVtZTogY29uZi50aGVtZSxcbiAgICAgICAgICAgICAgICBzaXplOiBjb25mLnNpemUsXG4gICAgICAgICAgICAgICAgYXBwZWFyYW5jZTogY29uZi5hcHBlYXJhbmNlLFxuICAgICAgICAgICAgICAgIHJldHJ5OiBjb25mLnJldHJ5LFxuICAgICAgICAgICAgICAgICdyZXRyeS1pbnRlcnZhbCc6IGNvbmYucmV0cnlJbnRlcnZhbCxcbiAgICAgICAgICAgICAgICAncmVmcmVzaC1leHBpcmVkJzogY29uZi5yZWZyZXNoRXhwaXJlZCxcbiAgICAgICAgICAgICAgICAncmVmcmVzaC10aW1lb3V0JzogY29uZi5yZWZyZXNoVGltZW91dCxcbiAgICAgICAgICAgICAgICAncmVzcG9uc2UtZmllbGQnOiBjb25mLnJlc3BvbnNlRmllbGQsXG4gICAgICAgICAgICAgICAgJ2ZlZWRiYWNrLWVuYWJsZWQnOiBjb25mLmZlZWRiYWNrRW5hYmxlZCxcbiAgICAgICAgICAgICAgICBjYWxsYmFjazogKHRva2VuOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHsgbmFtZTogJ1NVQ0NFU1MnLCBkYXRhOiB0b2tlbiwgcmVzdWx0OiBTdGF0ZS5TVUNDRVNTLCBtYW5hZ2VyOiBFdmVudEhhbmRsZXIubWFuYWdlcn07XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50SGFuZGxlci5jb25mLm9uU3VjY2VzcyEocGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50SGFuZGxlci5lbWl0KHBheWxvYWQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgJ2Vycm9yLWNhbGxiYWNrJzogKGNvZGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkID0geyBuYW1lOiAnRVJST1InLCBkYXRhOiBjb2RlLCByZXN1bHQ6IFN0YXRlLkVSUk9SLCBtYW5hZ2VyOiBFdmVudEhhbmRsZXIubWFuYWdlciB9O1xuICAgICAgICAgICAgICAgICAgICBFdmVudEhhbmRsZXIuY29uZi5vbkVycm9yIShwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRIYW5kbGVyLmVtaXQocGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAnZXhwaXJlZC1jYWxsYmFjayc6IChkOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHsgbmFtZTogJ0VYUElSRUQnLCBkYXRhOiBkLCByZXN1bHQ6IFN0YXRlLkVYUElSRUQsIG1hbmFnZXI6IEV2ZW50SGFuZGxlci5tYW5hZ2VyIH07XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50SGFuZGxlci5jb25mLm9uRXhwaXJlZCEocGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50SGFuZGxlci5lbWl0KHBheWxvYWQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgJ2JlZm9yZS1pbnRlcmFjdGl2ZS1jYWxsYmFjayc6IChkOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHsgbmFtZTogJ0JFRk9SRV9JTlRFUkFDVElWRScsIGRhdGE6IGQsIHJlc3VsdDogU3RhdGUuQkVGT1JFX0lOVEVSQUNUSVZFLCBtYW5hZ2VyOiBFdmVudEhhbmRsZXIubWFuYWdlciB9O1xuICAgICAgICAgICAgICAgICAgICBFdmVudEhhbmRsZXIuY29uZi5vbkJlZm9yZUludGVyYWN0aXZlIShwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRIYW5kbGVyLmVtaXQocGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAnYWZ0ZXItaW50ZXJhY3RpdmUtY2FsbGJhY2snOiAoZDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSB7IG5hbWU6ICdBRlRFUl9JTlRFUkFDVElWRScsIGRhdGE6IGQsIHJlc3VsdDogU3RhdGUuQUZURVJfSU5URVJBQ1RJVkUsIG1hbmFnZXI6IEV2ZW50SGFuZGxlci5tYW5hZ2VyIH07XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50SGFuZGxlci5jb25mLm9uQWZ0ZXJJbnRlcmFjdGl2ZSEocGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50SGFuZGxlci5lbWl0KHBheWxvYWQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgJ3RpbWVvdXQtY2FsbGJhY2snOiAoZDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSB7IG5hbWU6ICdUSU1FT1VUJywgZGF0YTogZCwgcmVzdWx0OiBTdGF0ZS5USU1FT1VULCBtYW5hZ2VyOiBFdmVudEhhbmRsZXIubWFuYWdlciB9O1xuICAgICAgICAgICAgICAgICAgICBFdmVudEhhbmRsZXIuY29uZi5vblRpbWVvdXQhKHBheWxvYWQpO1xuICAgICAgICAgICAgICAgICAgICBFdmVudEhhbmRsZXIuZW1pdChwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgY3VzdG9tIGNhbGxiYWNrXG4gICAgICAgICAgICAgICAgb25TdWNjZXNzOiBjb25mLm9uU3VjY2VzcyxcbiAgICAgICAgICAgICAgICBvbkVycm9yOiBjb25mLm9uRXJyb3IsXG4gICAgICAgICAgICAgICAgb25FeHBpcmVkOiBjb25mLm9uRXhwaXJlZCxcbiAgICAgICAgICAgICAgICBvbkJlZm9yZUludGVyYWN0aXZlOiBjb25mLm9uQmVmb3JlSW50ZXJhY3RpdmUsXG4gICAgICAgICAgICAgICAgb25BZnRlckludGVyYWN0aXZlOiBjb25mLm9uQWZ0ZXJJbnRlcmFjdGl2ZSxcbiAgICAgICAgICAgICAgICBvblRpbWVvdXQ6IGNvbmYub25UaW1lb3V0LFxuICAgICAgICAgICAgICAgIG9uQ3JlYXRlOiBjb25mLm9uQ3JlYXRlLFxuICAgICAgICAgICAgICAgIG9uUmVzZXQ6IGNvbmYub25SZXNldCxcbiAgICAgICAgICAgICAgICBvblJlbW92ZTogY29uZi5vblJlbW92ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCB3aWRnZXRJZCA9IHdpbmRvdy50dXJuc3RpbGUucmVuZGVyKGNvbnRhaW5lclJlZiwgcmVuZGVyaW5nQ29uZik7XG4gICAgICAgICAgICBFdmVudEhhbmRsZXIuc2V0V2lkZ2V0SWQod2lkZ2V0SWQpO1xuICAgICAgICAgICAgRXZlbnRIYW5kbGVyLmNvcHlXaXRoKHttYW5hZ2VyOiBuZXcgVHVybnN0aWxlTWFuYWdlcih3aW5kb3cudHVybnN0aWxlLCBFdmVudEhhbmRsZXIuZSwgd2lkZ2V0SWQsIGNvbnRhaW5lclJlZiwgcmVuZGVyaW5nQ29uZil9KTtcblxuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHsgbmFtZTogJ1dJREdFVF9DUkVBVEVEJywgZGF0YTogd2lkZ2V0SWQsIHJlc3VsdDogU3RhdGUuV0lER0VUX0NSRUFURUQsIG1hbmFnZXI6IEV2ZW50SGFuZGxlci5tYW5hZ2VyfTtcbiAgICAgICAgICAgIEV2ZW50SGFuZGxlci5jb25mLm9uQ3JlYXRlIShwYXlsb2FkKTtcbiAgICAgICAgICAgIEV2ZW50SGFuZGxlci5lbWl0KHBheWxvYWQpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBFdmVudEhhbmRsZXIuaW5pdCh0aGlzLmV2ZW50LCB0aGlzLmNvbmZpZywgbmV3IFR1cm5zdGlsZU1hbmFnZXIod2luZG93LnR1cm5zdGlsZSwgdGhpcy5ldmVudCkpO1xuICAgICAgICBpZiAod2luZG93LnR1cm5zdGlsZSkge1xuICAgICAgICAgICAgd2luZG93Lm9ubG9hZFR1cm5zdGlsZUNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7IHRoaXMubG9hZFR1cm5zdGlsZVNjcmlwdCgpOyB9XG5cbiAgICBwcml2YXRlIGxvYWRUdXJuc3RpbGVTY3JpcHQoKTogdm9pZCB7XG4gICAgICAgIC8vIENoZWNrIGlmIHNjcmlwdCBpcyBhbHJlYWR5IGxvYWRlZCB0byBhdm9pZCBkdXBsaWNhdGVzXG4gICAgICAgIGlmICghZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3NyYyo9XCJ0dXJuc3RpbGVcIl0nKSkge1xuICAgICAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICBzY3JpcHQuc3JjID0gJ2h0dHBzOi8vY2hhbGxlbmdlcy5jbG91ZGZsYXJlLmNvbS90dXJuc3RpbGUvdjAvYXBpLmpzP3JlbmRlcj1leHBsaWNpdCZvbmxvYWQ9b25sb2FkVHVybnN0aWxlQ2FsbGJhY2snO1xuICAgICAgICAgICAgc2NyaXB0LmFzeW5jID0gdHJ1ZTtcbiAgICAgICAgICAgIHNjcmlwdC5kZWZlciA9IHRydWU7XG4gICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=