valtech-components 4.0.939 → 4.0.941

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { Component, computed, EventEmitter, inject, Input, Output, signal } from '@angular/core';
1
+ import { Component, computed, EventEmitter, inject, Input, Output, signal, ViewChildren, } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import { Validators } from '@angular/forms';
4
4
  import { authPasswordValidator } from '../../../shared/utils/validators';
@@ -1084,6 +1084,23 @@ export class LoginComponent {
1084
1084
  queueMicrotask(() => this.openMFAVerifyModal());
1085
1085
  }
1086
1086
  }
1087
+ /**
1088
+ * Ionic (`IonicRouteStrategy`) no destruye la página de login al navegar
1089
+ * afuera — la "detach"-ea y la reutiliza si el usuario vuelve a la misma
1090
+ * ruta, así que `ngOnInit` no vuelve a correr. `val-form` arma su
1091
+ * `FormGroup` UNA sola vez en su propio `ngOnInit`; sin este hook, cerrar
1092
+ * sesión y volver a `/login` mostraba el email y la contraseña que la
1093
+ * sesión anterior había tecleado.
1094
+ *
1095
+ * `ionViewWillEnter` es el gancho de Ionic pensado exactamente para esto:
1096
+ * corre en CADA entrada a la vista, sea la primera vez o una reutilización
1097
+ * desde caché. Ionic lo invoca por duck-typing sobre cualquier componente
1098
+ * de la jerarquía que lo declare, sin necesidad de implementar la interfaz
1099
+ * `ViewWillEnter` (mismo patrón que `SelectSearchComponent` en esta lib).
1100
+ */
1101
+ ionViewWillEnter() {
1102
+ this.forms?.forEach((f) => f.resetForm());
1103
+ }
1087
1104
  ngOnDestroy() {
1088
1105
  this.stopResendCooldown();
1089
1106
  this.stopResetResendCooldown();
@@ -1091,7 +1108,7 @@ export class LoginComponent {
1091
1108
  this.stopListeningForOAuthReturn();
1092
1109
  }
1093
1110
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LoginComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1094
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LoginComponent, isStandalone: true, selector: "val-login", inputs: { props: "props" }, outputs: { onSuccess: "onSuccess", onError: "onError", onMFARequired: "onMFARequired" }, ngImport: i0, template: "<div class=\"val-login\" [class.val-login--card]=\"config.showCard\">\n <!-- Logo \u2014 default de marca (--main-logo) si el consumer no pasa logo -->\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n\n <!-- Login Form -->\n <val-form [props]=\"loginFormProps()\" (onSubmit)=\"loginHandler($event)\" />\n\n <!-- OAuth Section -->\n @if (config.showOAuth && config.oauthProviders.length > 0) {\n <div class=\"oauth-separator\">\n <span>{{ t('orContinueWith') }}</span>\n </div>\n\n <div class=\"oauth-buttons\">\n @for (provider of config.oauthProviders; track provider) {\n <val-button\n [props]=\"oauthButtonProps(provider)\"\n (onClick)=\"loginWithOAuth(provider)\"\n />\n }\n </div>\n }\n\n <!-- Register Link -->\n @if (config.showRegister) {\n <div class=\"auth-link\">\n <ion-text color=\"dark\">\n {{ t('noAccount') }}\n <a (click)=\"openRegisterModal()\">{{ t('register') }}</a>\n </ion-text>\n </div>\n }\n\n <!-- Forgot Password Link -->\n @if (config.showForgotPassword) {\n <div class=\"auth-link forgot-password\">\n <ion-text color=\"dark\">\n {{ t('forgotLink') }}\n <a (click)=\"openForgotPasswordModal()\">{{ t('recoverPassword') }}</a>\n </ion-text>\n </div>\n }\n\n <!-- Legal Notice -->\n @if (props.legal) {\n <div class=\"legal-notice\">\n <ion-text color=\"dark\">\n <p>\n {{ t('legalPrefix') }} @if (resolvedCompanyLink) {\n <a [href]=\"resolvedCompanyLink\" target=\"_blank\" rel=\"noopener noreferrer\"\n ><strong>{{ props.legal.companyName }}</strong></a\n >\n } @else {\n <strong>{{ props.legal.companyName }}</strong>\n } {{ t('legalSuffix') }} @if (props.legal.termsLink) {\n <a [href]=\"props.legal.termsLink\">{{ t('termsAndConditions') }}</a>\n } @else {\n <span>{{ t('termsAndConditions') }}</span>\n } {{ t('and') }} @if (props.legal.privacyLink) {\n <a [href]=\"props.legal.privacyLink\">{{ t('privacyPolicy') }}</a>\n } @else {\n <span>{{ t('privacyPolicy') }}</span>\n }.\n </p>\n </ion-text>\n </div>\n }\n</div>\n\n<!-- Register Modal -->\n<ion-modal [isOpen]=\"isRegisterModalOpen\" (didDismiss)=\"closeRegisterModal()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeRegisterModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"registerFormProps()\" (onSubmit)=\"registerHandler($event)\" />\n <div class=\"auth-link\">\n <ion-text color=\"dark\">\n {{ t('hasAccount') }}\n <a (click)=\"onRegisterSwitchToLogin()\">{{ t('signIn') }}</a>\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Verify Email Modal -->\n<ion-modal [isOpen]=\"isVerifyModalOpen\" [backdropDismiss]=\"false\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeVerifyModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"verifyFormProps()\" (onSubmit)=\"verifyHandler($event)\" />\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n {{ t('noCodeReceived') }} @if (resendCooldown > 0) {\n <span class=\"cooldown\">{{ t('resendIn', { seconds: resendCooldown.toString() }) }}</span>\n } @else {\n <a (click)=\"resendCode()\">{{ t('resend') }}</a>\n }\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Forgot Password Modal -->\n<ion-modal [isOpen]=\"isForgotPasswordModalOpen\" (didDismiss)=\"closeForgotPasswordModal()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeForgotPasswordModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"forgotPasswordFormProps()\" (onSubmit)=\"forgotPasswordHandler($event)\" />\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Reset Password Modal -->\n<ion-modal [isOpen]=\"isResetPasswordModalOpen\" [backdropDismiss]=\"false\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeResetPasswordModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"resetPasswordFormProps()\" (onSubmit)=\"resetPasswordHandler($event)\" />\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n {{ t('noCodeReceived') }} @if (resetResendCooldown > 0) {\n <span class=\"cooldown\">{{ t('resendIn', { seconds: resetResendCooldown.toString() }) }}</span>\n } @else {\n <a (click)=\"resendResetCode()\">{{ t('resend') }}</a>\n }\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- MFA Verify Modal -->\n<ion-modal [isOpen]=\"isMFAVerifyModalOpen\" [backdropDismiss]=\"false\" (didDismiss)=\"onMFAVerifyDismissed()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeMFAVerifyModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"mfaVerifyFormProps()\" (onSubmit)=\"verifyMFAHandler($event)\" />\n @if (mfaMethod() === 'TOTP') {\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n @if (mfaUseBackupCode()) {\n <a (click)=\"toggleMFABackupCode()\">{{ t('mfaUseTotpAction') }}</a>\n } @else { {{ t('mfaUseBackupLink') }}\n <a (click)=\"toggleMFABackupCode()\">{{ t('mfaUseBackupAction') }}</a>\n }\n </ion-text>\n </div>\n }\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n {{ t('mfaLostBackupLink') }}\n <a (click)=\"openMFAResetModal()\">{{ t('mfaResetAction') }}</a>\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- MFA Reset Modal (B) \u2014 recovery por email cuando no hay backup codes -->\n<ion-modal [isOpen]=\"isMFAResetModalOpen\" [backdropDismiss]=\"false\" (didDismiss)=\"closeMFAResetModal()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeMFAResetModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n @if (mfaResetStep() === 'request') {\n <val-form [props]=\"mfaResetRequestFormProps()\" (onSubmit)=\"mfaResetRequestHandler($event)\" />\n } @else {\n <val-form [props]=\"mfaResetConfirmFormProps()\" (onSubmit)=\"mfaResetConfirmHandler($event)\" />\n }\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".val-login{width:100%}.val-login--card{padding:1rem .75rem;background:var(--ion-color-light);border-radius:16px;box-shadow:0 2px 8px #00000014}.logo-container{max-width:130px;margin-bottom:1.5rem}.auth-link{text-align:center;margin-top:1rem;font-size:.9rem}.auth-link a{color:var(--ion-color-primary);text-decoration:none;font-weight:500;cursor:pointer}.auth-link a:hover{text-decoration:underline}.oauth-separator{display:flex;align-items:center;margin:1.5rem 0}.oauth-separator:before,.oauth-separator:after{content:\"\";flex:1;height:1px;background:var(--ion-color-medium-tint)}.oauth-separator span{padding:0 1rem;color:var(--ion-color-dark);font-size:.85rem}.oauth-buttons{margin-bottom:1rem;display:flex;flex-direction:column;gap:.5rem}.oauth-buttons val-button{--border-width: 1px}.oauth-buttons ion-icon{font-size:1.2rem;margin-right:.5rem}.legal-notice{margin-top:1.5rem;padding-top:1rem;border-top:1px solid var(--ion-color-medium-tint)}.legal-notice p{font-size:.75rem;line-height:1.5;text-align:center;margin:0}.legal-notice a{color:var(--ion-color-primary);text-decoration:none}.legal-notice a:hover{text-decoration:underline}.resend-link{text-align:center;margin-top:1rem;font-size:.9rem}.resend-link a{color:var(--ion-color-primary);cursor:pointer;font-weight:500}.resend-link a:hover{text-decoration:underline}.resend-link .cooldown{color:var(--ion-color-medium)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonModal, selector: "ion-modal" }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onValueChange", "onInvalid", "onSelectChange"] }, { kind: "component", type: ImageComponent, selector: "val-image", inputs: ["props"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }] }); }
1111
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LoginComponent, isStandalone: true, selector: "val-login", inputs: { props: "props" }, outputs: { onSuccess: "onSuccess", onError: "onError", onMFARequired: "onMFARequired" }, viewQueries: [{ propertyName: "forms", predicate: FormComponent, descendants: true }], ngImport: i0, template: "<div class=\"val-login\" [class.val-login--card]=\"config.showCard\">\n <!-- Logo \u2014 default de marca (--main-logo) si el consumer no pasa logo -->\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n\n <!-- Login Form -->\n <val-form [props]=\"loginFormProps()\" (onSubmit)=\"loginHandler($event)\" />\n\n <!-- OAuth Section -->\n @if (config.showOAuth && config.oauthProviders.length > 0) {\n <div class=\"oauth-separator\">\n <span>{{ t('orContinueWith') }}</span>\n </div>\n\n <div class=\"oauth-buttons\">\n @for (provider of config.oauthProviders; track provider) {\n <val-button\n [props]=\"oauthButtonProps(provider)\"\n (onClick)=\"loginWithOAuth(provider)\"\n />\n }\n </div>\n }\n\n <!-- Register Link -->\n @if (config.showRegister) {\n <div class=\"auth-link\">\n <ion-text color=\"dark\">\n {{ t('noAccount') }}\n <a (click)=\"openRegisterModal()\">{{ t('register') }}</a>\n </ion-text>\n </div>\n }\n\n <!-- Forgot Password Link -->\n @if (config.showForgotPassword) {\n <div class=\"auth-link forgot-password\">\n <ion-text color=\"dark\">\n {{ t('forgotLink') }}\n <a (click)=\"openForgotPasswordModal()\">{{ t('recoverPassword') }}</a>\n </ion-text>\n </div>\n }\n\n <!-- Legal Notice -->\n @if (props.legal) {\n <div class=\"legal-notice\">\n <ion-text color=\"dark\">\n <p>\n {{ t('legalPrefix') }} @if (resolvedCompanyLink) {\n <a [href]=\"resolvedCompanyLink\" target=\"_blank\" rel=\"noopener noreferrer\"\n ><strong>{{ props.legal.companyName }}</strong></a\n >\n } @else {\n <strong>{{ props.legal.companyName }}</strong>\n } {{ t('legalSuffix') }} @if (props.legal.termsLink) {\n <a [href]=\"props.legal.termsLink\">{{ t('termsAndConditions') }}</a>\n } @else {\n <span>{{ t('termsAndConditions') }}</span>\n } {{ t('and') }} @if (props.legal.privacyLink) {\n <a [href]=\"props.legal.privacyLink\">{{ t('privacyPolicy') }}</a>\n } @else {\n <span>{{ t('privacyPolicy') }}</span>\n }.\n </p>\n </ion-text>\n </div>\n }\n</div>\n\n<!-- Register Modal -->\n<ion-modal [isOpen]=\"isRegisterModalOpen\" (didDismiss)=\"closeRegisterModal()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeRegisterModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"registerFormProps()\" (onSubmit)=\"registerHandler($event)\" />\n <div class=\"auth-link\">\n <ion-text color=\"dark\">\n {{ t('hasAccount') }}\n <a (click)=\"onRegisterSwitchToLogin()\">{{ t('signIn') }}</a>\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Verify Email Modal -->\n<ion-modal [isOpen]=\"isVerifyModalOpen\" [backdropDismiss]=\"false\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeVerifyModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"verifyFormProps()\" (onSubmit)=\"verifyHandler($event)\" />\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n {{ t('noCodeReceived') }} @if (resendCooldown > 0) {\n <span class=\"cooldown\">{{ t('resendIn', { seconds: resendCooldown.toString() }) }}</span>\n } @else {\n <a (click)=\"resendCode()\">{{ t('resend') }}</a>\n }\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Forgot Password Modal -->\n<ion-modal [isOpen]=\"isForgotPasswordModalOpen\" (didDismiss)=\"closeForgotPasswordModal()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeForgotPasswordModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"forgotPasswordFormProps()\" (onSubmit)=\"forgotPasswordHandler($event)\" />\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Reset Password Modal -->\n<ion-modal [isOpen]=\"isResetPasswordModalOpen\" [backdropDismiss]=\"false\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeResetPasswordModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"resetPasswordFormProps()\" (onSubmit)=\"resetPasswordHandler($event)\" />\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n {{ t('noCodeReceived') }} @if (resetResendCooldown > 0) {\n <span class=\"cooldown\">{{ t('resendIn', { seconds: resetResendCooldown.toString() }) }}</span>\n } @else {\n <a (click)=\"resendResetCode()\">{{ t('resend') }}</a>\n }\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- MFA Verify Modal -->\n<ion-modal [isOpen]=\"isMFAVerifyModalOpen\" [backdropDismiss]=\"false\" (didDismiss)=\"onMFAVerifyDismissed()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeMFAVerifyModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"mfaVerifyFormProps()\" (onSubmit)=\"verifyMFAHandler($event)\" />\n @if (mfaMethod() === 'TOTP') {\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n @if (mfaUseBackupCode()) {\n <a (click)=\"toggleMFABackupCode()\">{{ t('mfaUseTotpAction') }}</a>\n } @else { {{ t('mfaUseBackupLink') }}\n <a (click)=\"toggleMFABackupCode()\">{{ t('mfaUseBackupAction') }}</a>\n }\n </ion-text>\n </div>\n }\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n {{ t('mfaLostBackupLink') }}\n <a (click)=\"openMFAResetModal()\">{{ t('mfaResetAction') }}</a>\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- MFA Reset Modal (B) \u2014 recovery por email cuando no hay backup codes -->\n<ion-modal [isOpen]=\"isMFAResetModalOpen\" [backdropDismiss]=\"false\" (didDismiss)=\"closeMFAResetModal()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeMFAResetModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n @if (mfaResetStep() === 'request') {\n <val-form [props]=\"mfaResetRequestFormProps()\" (onSubmit)=\"mfaResetRequestHandler($event)\" />\n } @else {\n <val-form [props]=\"mfaResetConfirmFormProps()\" (onSubmit)=\"mfaResetConfirmHandler($event)\" />\n }\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".val-login{width:100%}.val-login--card{padding:1rem .75rem;background:var(--ion-color-light);border-radius:16px;box-shadow:0 2px 8px #00000014}.logo-container{max-width:130px;margin-bottom:1.5rem}.auth-link{text-align:center;margin-top:1rem;font-size:.9rem}.auth-link a{color:var(--ion-color-primary);text-decoration:none;font-weight:500;cursor:pointer}.auth-link a:hover{text-decoration:underline}.oauth-separator{display:flex;align-items:center;margin:1.5rem 0}.oauth-separator:before,.oauth-separator:after{content:\"\";flex:1;height:1px;background:var(--ion-color-medium-tint)}.oauth-separator span{padding:0 1rem;color:var(--ion-color-dark);font-size:.85rem}.oauth-buttons{margin-bottom:1rem;display:flex;flex-direction:column;gap:.5rem}.oauth-buttons val-button{--border-width: 1px}.oauth-buttons ion-icon{font-size:1.2rem;margin-right:.5rem}.legal-notice{margin-top:1.5rem;padding-top:1rem;border-top:1px solid var(--ion-color-medium-tint)}.legal-notice p{font-size:.75rem;line-height:1.5;text-align:center;margin:0}.legal-notice a{color:var(--ion-color-primary);text-decoration:none}.legal-notice a:hover{text-decoration:underline}.resend-link{text-align:center;margin-top:1rem;font-size:.9rem}.resend-link a{color:var(--ion-color-primary);cursor:pointer;font-weight:500}.resend-link a:hover{text-decoration:underline}.resend-link .cooldown{color:var(--ion-color-medium)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonModal, selector: "ion-modal" }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onValueChange", "onInvalid", "onSelectChange"] }, { kind: "component", type: ImageComponent, selector: "val-image", inputs: ["props"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }] }); }
1095
1112
  }
1096
1113
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LoginComponent, decorators: [{
1097
1114
  type: Component,
@@ -1109,7 +1126,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
1109
1126
  ImageComponent,
1110
1127
  ButtonComponent,
1111
1128
  ], template: "<div class=\"val-login\" [class.val-login--card]=\"config.showCard\">\n <!-- Logo \u2014 default de marca (--main-logo) si el consumer no pasa logo -->\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n\n <!-- Login Form -->\n <val-form [props]=\"loginFormProps()\" (onSubmit)=\"loginHandler($event)\" />\n\n <!-- OAuth Section -->\n @if (config.showOAuth && config.oauthProviders.length > 0) {\n <div class=\"oauth-separator\">\n <span>{{ t('orContinueWith') }}</span>\n </div>\n\n <div class=\"oauth-buttons\">\n @for (provider of config.oauthProviders; track provider) {\n <val-button\n [props]=\"oauthButtonProps(provider)\"\n (onClick)=\"loginWithOAuth(provider)\"\n />\n }\n </div>\n }\n\n <!-- Register Link -->\n @if (config.showRegister) {\n <div class=\"auth-link\">\n <ion-text color=\"dark\">\n {{ t('noAccount') }}\n <a (click)=\"openRegisterModal()\">{{ t('register') }}</a>\n </ion-text>\n </div>\n }\n\n <!-- Forgot Password Link -->\n @if (config.showForgotPassword) {\n <div class=\"auth-link forgot-password\">\n <ion-text color=\"dark\">\n {{ t('forgotLink') }}\n <a (click)=\"openForgotPasswordModal()\">{{ t('recoverPassword') }}</a>\n </ion-text>\n </div>\n }\n\n <!-- Legal Notice -->\n @if (props.legal) {\n <div class=\"legal-notice\">\n <ion-text color=\"dark\">\n <p>\n {{ t('legalPrefix') }} @if (resolvedCompanyLink) {\n <a [href]=\"resolvedCompanyLink\" target=\"_blank\" rel=\"noopener noreferrer\"\n ><strong>{{ props.legal.companyName }}</strong></a\n >\n } @else {\n <strong>{{ props.legal.companyName }}</strong>\n } {{ t('legalSuffix') }} @if (props.legal.termsLink) {\n <a [href]=\"props.legal.termsLink\">{{ t('termsAndConditions') }}</a>\n } @else {\n <span>{{ t('termsAndConditions') }}</span>\n } {{ t('and') }} @if (props.legal.privacyLink) {\n <a [href]=\"props.legal.privacyLink\">{{ t('privacyPolicy') }}</a>\n } @else {\n <span>{{ t('privacyPolicy') }}</span>\n }.\n </p>\n </ion-text>\n </div>\n }\n</div>\n\n<!-- Register Modal -->\n<ion-modal [isOpen]=\"isRegisterModalOpen\" (didDismiss)=\"closeRegisterModal()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeRegisterModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"registerFormProps()\" (onSubmit)=\"registerHandler($event)\" />\n <div class=\"auth-link\">\n <ion-text color=\"dark\">\n {{ t('hasAccount') }}\n <a (click)=\"onRegisterSwitchToLogin()\">{{ t('signIn') }}</a>\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Verify Email Modal -->\n<ion-modal [isOpen]=\"isVerifyModalOpen\" [backdropDismiss]=\"false\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeVerifyModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"verifyFormProps()\" (onSubmit)=\"verifyHandler($event)\" />\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n {{ t('noCodeReceived') }} @if (resendCooldown > 0) {\n <span class=\"cooldown\">{{ t('resendIn', { seconds: resendCooldown.toString() }) }}</span>\n } @else {\n <a (click)=\"resendCode()\">{{ t('resend') }}</a>\n }\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Forgot Password Modal -->\n<ion-modal [isOpen]=\"isForgotPasswordModalOpen\" (didDismiss)=\"closeForgotPasswordModal()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeForgotPasswordModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"forgotPasswordFormProps()\" (onSubmit)=\"forgotPasswordHandler($event)\" />\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Reset Password Modal -->\n<ion-modal [isOpen]=\"isResetPasswordModalOpen\" [backdropDismiss]=\"false\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeResetPasswordModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"resetPasswordFormProps()\" (onSubmit)=\"resetPasswordHandler($event)\" />\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n {{ t('noCodeReceived') }} @if (resetResendCooldown > 0) {\n <span class=\"cooldown\">{{ t('resendIn', { seconds: resetResendCooldown.toString() }) }}</span>\n } @else {\n <a (click)=\"resendResetCode()\">{{ t('resend') }}</a>\n }\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- MFA Verify Modal -->\n<ion-modal [isOpen]=\"isMFAVerifyModalOpen\" [backdropDismiss]=\"false\" (didDismiss)=\"onMFAVerifyDismissed()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeMFAVerifyModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"mfaVerifyFormProps()\" (onSubmit)=\"verifyMFAHandler($event)\" />\n @if (mfaMethod() === 'TOTP') {\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n @if (mfaUseBackupCode()) {\n <a (click)=\"toggleMFABackupCode()\">{{ t('mfaUseTotpAction') }}</a>\n } @else { {{ t('mfaUseBackupLink') }}\n <a (click)=\"toggleMFABackupCode()\">{{ t('mfaUseBackupAction') }}</a>\n }\n </ion-text>\n </div>\n }\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n {{ t('mfaLostBackupLink') }}\n <a (click)=\"openMFAResetModal()\">{{ t('mfaResetAction') }}</a>\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- MFA Reset Modal (B) \u2014 recovery por email cuando no hay backup codes -->\n<ion-modal [isOpen]=\"isMFAResetModalOpen\" [backdropDismiss]=\"false\" (didDismiss)=\"closeMFAResetModal()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeMFAResetModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n @if (mfaResetStep() === 'request') {\n <val-form [props]=\"mfaResetRequestFormProps()\" (onSubmit)=\"mfaResetRequestHandler($event)\" />\n } @else {\n <val-form [props]=\"mfaResetConfirmFormProps()\" (onSubmit)=\"mfaResetConfirmHandler($event)\" />\n }\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".val-login{width:100%}.val-login--card{padding:1rem .75rem;background:var(--ion-color-light);border-radius:16px;box-shadow:0 2px 8px #00000014}.logo-container{max-width:130px;margin-bottom:1.5rem}.auth-link{text-align:center;margin-top:1rem;font-size:.9rem}.auth-link a{color:var(--ion-color-primary);text-decoration:none;font-weight:500;cursor:pointer}.auth-link a:hover{text-decoration:underline}.oauth-separator{display:flex;align-items:center;margin:1.5rem 0}.oauth-separator:before,.oauth-separator:after{content:\"\";flex:1;height:1px;background:var(--ion-color-medium-tint)}.oauth-separator span{padding:0 1rem;color:var(--ion-color-dark);font-size:.85rem}.oauth-buttons{margin-bottom:1rem;display:flex;flex-direction:column;gap:.5rem}.oauth-buttons val-button{--border-width: 1px}.oauth-buttons ion-icon{font-size:1.2rem;margin-right:.5rem}.legal-notice{margin-top:1.5rem;padding-top:1rem;border-top:1px solid var(--ion-color-medium-tint)}.legal-notice p{font-size:.75rem;line-height:1.5;text-align:center;margin:0}.legal-notice a{color:var(--ion-color-primary);text-decoration:none}.legal-notice a:hover{text-decoration:underline}.resend-link{text-align:center;margin-top:1rem;font-size:.9rem}.resend-link a{color:var(--ion-color-primary);cursor:pointer;font-weight:500}.resend-link a:hover{text-decoration:underline}.resend-link .cooldown{color:var(--ion-color-medium)}\n"] }]
1112
- }], propDecorators: { props: [{
1129
+ }], propDecorators: { forms: [{
1130
+ type: ViewChildren,
1131
+ args: [FormComponent]
1132
+ }], props: [{
1113
1133
  type: Input
1114
1134
  }], onSuccess: [{
1115
1135
  type: Output
@@ -1118,4 +1138,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
1118
1138
  }], onMFARequired: [{
1119
1139
  type: Output
1120
1140
  }] } });
1121
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9sb2dpbi9sb2dpbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvb3JnYW5pc21zL2xvZ2luL2xvZ2luLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDekUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBQ1YsU0FBUyxFQUNULE9BQU8sRUFDUCxRQUFRLEVBQ1IsT0FBTyxFQUNQLFVBQVUsR0FDWCxNQUFNLDJCQUEyQixDQUFDO0FBRW5DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDL0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNuRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxN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QkFDVixhQUFhO3dCQUNiLGNBQWM7d0JBQ2QsZUFBZTtxQkFDaEI7OEJBS1EsS0FBSztzQkFBYixLQUFLO2dCQUVJLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csT0FBTztzQkFBaEIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBjb21wdXRlZCwgRXZlbnRFbWl0dGVyLCBpbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgYXV0aFBhc3N3b3JkVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3V0aWxzL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1xuICBJb25CdXR0b24sXG4gIElvbkJ1dHRvbnMsXG4gIElvbkNvbnRlbnQsXG4gIElvbkhlYWRlcixcbiAgSW9uSWNvbixcbiAgSW9uTW9kYWwsXG4gIElvblRleHQsXG4gIElvblRvb2xiYXIsXG59IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuXG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2F1dGgnO1xuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdG9hc3Quc2VydmljZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSwgSW5wdXRJMThuSGVscGVyIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaTE4bic7XG5pbXBvcnQgeyBMZWdhbExpbmtTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbGVnYWwtbGluay9sZWdhbC1saW5rLnNlcnZpY2UnO1xuaW1wb3J0IHsgRm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL2Zvcm0vZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSW1hZ2VDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy9pbWFnZS9pbWFnZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvYnV0dG9uL2J1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgQnV0dG9uTWV0YWRhdGEsXG4gIEZvcm1NZXRhZGF0YSxcbiAgRm9ybVN1Ym1pdCxcbiAgSW5wdXRUeXBlLFxuICBDb21wb25lbnRTdGF0ZXMsXG4gIENvbXBvbmVudFN0YXRlLFxufSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBidXR0b24gfSBmcm9tICcuLi8uLi9hdG9tcy9idXR0b24vZmFjdG9yeSc7XG5pbXBvcnQgeyBJbWFnZU1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vYXRvbXMvaW1hZ2UvdHlwZXMnO1xuaW1wb3J0IHtcbiAgTG9naW5NZXRhZGF0YSxcbiAgTG9naW5TdWNjZXNzRXZlbnQsXG4gIExvZ2luRXJyb3JFdmVudCxcbiAgTUZBUmVxdWlyZWRFdmVudCxcbiAgTE9HSU5fREVGQVVMVFMsXG4gIERFRkFVTFRfTE9HSU5fTE9HTyxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1sb2dpbicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgSW9uQnV0dG9uLFxuICAgIElvbkJ1dHRvbnMsXG4gICAgSW9uQ29udGVudCxcbiAgICBJb25IZWFkZXIsXG4gICAgSW9uSWNvbixcbiAgICBJb25Nb2RhbCxcbiAgICBJb25UZXh0LFxuICAgIElvblRvb2xiYXIsXG4gICAgRm9ybUNvbXBvbmVudCxcbiAgICBJbWFnZUNvbXBvbmVudCxcbiAgICBCdXR0b25Db21wb25lbnQsXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9sb2dpbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2xvZ2luLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIExvZ2luQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBwcm9wczogTG9naW5NZXRhZGF0YSA9IHt9O1xuXG4gIEBPdXRwdXQoKSBvblN1Y2Nlc3MgPSBuZXcgRXZlbnRFbWl0dGVyPExvZ2luU3VjY2Vzc0V2ZW50PigpO1xuICBAT3V0cHV0KCkgb25FcnJvciA9IG5ldyBFdmVudEVtaXR0ZXI8TG9naW5FcnJvckV2ZW50PigpO1xuICBAT3V0cHV0KCkgb25NRkFSZXF1aXJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8TUZBUmVxdWlyZWRFdmVudD4oKTtcblxuICAvLyBTZXJ2aWNlc1xuICBhdXRoU2VydmljZSA9IGluamVjdChBdXRoU2VydmljZSk7XG4gIHByaXZhdGUgdG9hc3RTZXJ2aWNlID0gaW5qZWN0KFRvYXN0U2VydmljZSk7XG4gIHByaXZhdGUgcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gIHByaXZhdGUgcm91dGUgPSBpbmplY3QoQWN0aXZhdGVkUm91dGUpO1xuICBwcml2YXRlIGkxOG4gPSBpbmplY3QoSTE4blNlcnZpY2UpO1xuICBwcml2YXRlIGkxOG5IZWxwZXIgPSBpbmplY3QoSW5wdXRJMThuSGVscGVyKTtcbiAgcHJpdmF0ZSBsZWdhbExpbmsgPSBpbmplY3QoTGVnYWxMaW5rU2VydmljZSk7XG5cbiAgLyoqIFVSTCBkZWwgc2l0aW8gcHJpbmNpcGFsIHJlc3VlbHRhIHBvciBhbWJpZW50ZSDigJQgZmFsbGJhY2sgY3VhbmRvIGVsIGNvbnN1bWVyIG5vIHBhc2EgY29tcGFueUxpbmsuICovXG4gIGdldCByZXNvbHZlZENvbXBhbnlMaW5rKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMubGVnYWw/LmNvbXBhbnlMaW5rID8/IHRoaXMubGVnYWxMaW5rLmJhc2VVcmwgPz8gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgZm9yIHRyYW5zbGF0aW5nIGF1dGgtcmVsYXRlZCBzdHJpbmdzLlxuICAgKiBFeHBvc2VkIHRvIHRlbXBsYXRlIGZvciBkeW5hbWljIHRleHQuXG4gICAqL1xuICB0KGtleTogc3RyaW5nLCBkYXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaTE4bi50KGtleSwgJ19hdXRoJywgZGF0YSk7XG4gIH1cblxuICAvLyBUaW1lcnNcbiAgcHJpdmF0ZSByZXNlbmRUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVzZXRSZXNlbmRUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgb2F1dGhMb2FkaW5nUmVzZXRUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcblxuICAvLyBTdGF0ZVxuICBpc09BdXRoTG9hZGluZyA9IGZhbHNlO1xuICBpc1JlZ2lzdGVyTW9kYWxPcGVuID0gZmFsc2U7XG4gIGlzVmVyaWZ5TW9kYWxPcGVuID0gZmFsc2U7XG4gIGlzRm9yZ290UGFzc3dvcmRNb2RhbE9wZW4gPSBmYWxzZTtcbiAgaXNSZXNldFBhc3N3b3JkTW9kYWxPcGVuID0gZmFsc2U7XG4gIGlzTUZBVmVyaWZ5TW9kYWxPcGVuID0gZmFsc2U7XG4gIHByaXZhdGUgX21mYVN1Y2Nlc3NQZW5kaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzZXRPQXV0aExvYWRpbmdPblJldHVybiA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoIXRoaXMuaXNPQXV0aExvYWRpbmcpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09ICdoaWRkZW4nKSByZXR1cm47XG5cbiAgICB0aGlzLmNsZWFyT0F1dGhMb2FkaW5nUmVzZXRUaW1lcigpO1xuICAgIHRoaXMuaXNPQXV0aExvYWRpbmcgPSBmYWxzZTtcbiAgfTtcblxuICBwZW5kaW5nVmVyaWZpY2F0aW9uRW1haWwgPSAnJztcbiAgcGVuZGluZ1Jlc2V0RW1haWwgPSAnJztcbiAgcmVzZW5kQ29vbGRvd24gPSAwO1xuICByZXNldFJlc2VuZENvb2xkb3duID0gMDtcblxuICAvLyBSZXNvbHZlZCBwcm9wcyB3aXRoIGRlZmF1bHRzXG4gIGdldCBjb25maWcoKTogUmVxdWlyZWQ8XG4gICAgT21pdDxMb2dpbk1ldGFkYXRhLCAnbG9nbycgfCAnbGVnYWwnIHwgJ3JlZGlyZWN0T25TdWNjZXNzJyB8ICdyZWRpcmVjdE9uU3VjY2Vzc1F1ZXJ5UGFyYW0nIHwgJ2luaXRpYWxPcGVyYXRpb24nIHwgJ2xvZ2luUm91dGUnPlxuICA+ICZcbiAgICBMb2dpbk1ldGFkYXRhIHtcbiAgICByZXR1cm4geyAuLi5MT0dJTl9ERUZBVUxUUywgLi4udGhpcy5wcm9wcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ28gYSByZW5kZXJpemFyIGFycmliYSBkZWwgZm9ybS4gU2kgZWwgY29uc3VtZXIgbm8gcGFzYSBgbG9nb2AsIGNhZSBhbFxuICAgKiBkZWZhdWx0IGRlIG1hcmNhIGRlbCBmYWN0b3J5IChgLS1tYWluLWxvZ29gIHBvciBhcHApLiBWZXIgREVGQVVMVF9MT0dJTl9MT0dPLlxuICAgKi9cbiAgZ2V0IHJlc29sdmVkTG9nbygpOiBJbWFnZU1ldGFkYXRhIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5sb2dvID8/IERFRkFVTFRfTE9HSU5fTE9HTztcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBGT1JNIFNUQVRFIFNJR05BTFNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJpdmF0ZSBfbG9naW5Gb3JtU3RhdGUgPSBzaWduYWw8Q29tcG9uZW50U3RhdGU+KENvbXBvbmVudFN0YXRlcy5FTkFCTEVEKTtcbiAgcHJpdmF0ZSBfcmVnaXN0ZXJGb3JtU3RhdGUgPSBzaWduYWw8Q29tcG9uZW50U3RhdGU+KENvbXBvbmVudFN0YXRlcy5FTkFCTEVEKTtcbiAgcHJpdmF0ZSBfdmVyaWZ5Rm9ybVN0YXRlID0gc2lnbmFsPENvbXBvbmVudFN0YXRlPihDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCk7XG4gIHByaXZhdGUgX3ZlcmlmeUZvcm1TZWN0aW9uTmFtZSA9IHNpZ25hbCgnJyk7XG4gIHByaXZhdGUgX21mYVZlcmlmeUZvcm1TdGF0ZSA9IHNpZ25hbDxDb21wb25lbnRTdGF0ZT4oQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQpO1xuICBwcml2YXRlIF9tZmFNZXRob2QgPSBzaWduYWw8J1RPVFAnIHwgJ0VNQUlMJyB8ICdTTVMnPignVE9UUCcpO1xuICAvKiogTcOpdG9kbyBNRkEgcGVuZGllbnRlIOKAlCBleHB1ZXN0byBhbCB0ZW1wbGF0ZSBwYXJhIGdhdGVhciBlbCBsaW5rIGRlIGJhY2t1cCAoc29sbyBUT1RQKS4gKi9cbiAgcmVhZG9ubHkgbWZhTWV0aG9kID0gdGhpcy5fbWZhTWV0aG9kLmFzUmVhZG9ubHkoKTtcbiAgLyoqIEE6IGVsIHVzZXIgdG9nZ2xlYSBhIFwiY8OzZGlnbyBkZSByZXNwYWxkb1wiICg4IGNoYXJzIGFsZmFudW3DqXJpY29zKSBjdWFuZG8gcGVyZGnDsyBlbCAywrogZmFjdG9yLiAqL1xuICByZWFkb25seSBtZmFVc2VCYWNrdXBDb2RlID0gc2lnbmFsKGZhbHNlKTtcbiAgLy8gQjogcmVzZXQgZGUgTUZBIHBvciBlbWFpbCAoY3VhbmRvIGVsIHVzZXIgbm8gdGllbmUgYmFja3VwIGNvZGVzKS5cbiAgaXNNRkFSZXNldE1vZGFsT3BlbiA9IGZhbHNlO1xuICBwcml2YXRlIF9tZmFSZXNldFN0ZXAgPSBzaWduYWw8J3JlcXVlc3QnIHwgJ2NvbmZpcm0nPigncmVxdWVzdCcpO1xuICByZWFkb25seSBtZmFSZXNldFN0ZXAgPSB0aGlzLl9tZmFSZXNldFN0ZXAuYXNSZWFkb25seSgpO1xuICBwcml2YXRlIF9tZmFSZXNldEZvcm1TdGF0ZSA9IHNpZ25hbDxDb21wb25lbnRTdGF0ZT4oQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQpO1xuICBwcml2YXRlIF9tZmFSZXNldEVtYWlsID0gc2lnbmFsKCcnKTtcbiAgcHJpdmF0ZSBfZm9yZ290UGFzc3dvcmRGb3JtU3RhdGUgPSBzaWduYWw8Q29tcG9uZW50U3RhdGU+KENvbXBvbmVudFN0YXRlcy5FTkFCTEVEKTtcbiAgcHJpdmF0ZSBfcmVzZXRQYXNzd29yZEZvcm1TdGF0ZSA9IHNpZ25hbDxDb21wb25lbnRTdGF0ZT4oQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQpO1xuICBwcml2YXRlIF9yZXNldEZvcm1TZWN0aW9uTmFtZSA9IHNpZ25hbCgnJyk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIExPR0lOIEZPUk0gKGNvbXB1dGVkKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICByZWFkb25seSBsb2dpbkZvcm1Qcm9wcyA9IGNvbXB1dGVkPEZvcm1NZXRhZGF0YT4oKCkgPT5cbiAgICB0aGlzLmkxOG5IZWxwZXIucmVzb2x2ZUZvcm0oe1xuICAgICAgbmFtZUtleTogJ2xvZ2luVGl0bGUnLFxuICAgICAgaTE4bk5hbWVzcGFjZTogJ19hdXRoJyxcbiAgICAgIHNlY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnJyxcbiAgICAgICAgICBvcmRlcjogMCxcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogSW5wdXRUeXBlLkVNQUlMLFxuICAgICAgICAgICAgICBuYW1lOiAnZW1haWwnLFxuICAgICAgICAgICAgICB0b2tlbjogJ2xvZ2luLWVtYWlsJyxcbiAgICAgICAgICAgICAgaGludDogJycsXG4gICAgICAgICAgICAgIGxhYmVsS2V5OiAnZW1haWwnLFxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcktleTogJ2VtYWlsUGxhY2Vob2xkZXInLFxuICAgICAgICAgICAgICBlcnJvcktleXM6IHtcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogJ2VtYWlsUmVxdWlyZWQnLFxuICAgICAgICAgICAgICAgIGVtYWlsOiAnZW1haWxJbnZhbGlkJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMuZW1haWxdLFxuICAgICAgICAgICAgICBvcmRlcjogMCxcbiAgICAgICAgICAgICAgc3RhdGU6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogSW5wdXRUeXBlLlBBU1NXT1JELFxuICAgICAgICAgICAgICBuYW1lOiAncGFzc3dvcmQnLFxuICAgICAgICAgICAgICB0b2tlbjogJ2xvZ2luLXBhc3N3b3JkJyxcbiAgICAgICAgICAgICAgaGludDogJycsXG4gICAgICAgICAgICAgIGxhYmVsS2V5OiAncGFzc3dvcmQnLFxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcktleTogJ3Bhc3N3b3JkUGxhY2Vob2xkZXInLFxuICAgICAgICAgICAgICBlcnJvcktleXM6IHtcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogJ3Bhc3N3b3JkUmVxdWlyZWQnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgICAgICAgIG9yZGVyOiAxLFxuICAgICAgICAgICAgICBzdGF0ZTogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgYWN0aW9uczoge1xuICAgICAgICAuLi5idXR0b24oe1xuICAgICAgICAgIHRleHQ6ICcnLFxuICAgICAgICAgIHR5cGU6ICdzdWJtaXQnLFxuICAgICAgICAgIGZpbGw6ICdzb2xpZCcsXG4gICAgICAgICAgZXhwYW5kOiAnYmxvY2snLFxuICAgICAgICAgIC8vIFDDrWxkb3JhIGVuIHRvZG8gZWwgam91cm5leTogc2luIHNoYXBlLCBJb25pYyBjYWUgYSBzdSByYWRpbyBwb3JcbiAgICAgICAgICAvLyBtb2RvICgxNHB4IGVuIGlvcykgeSBlbCBDVEEgcHJpbmNpcGFsIHF1ZWRhYmEgbWVub3MgcmVkb25kbyBxdWVcbiAgICAgICAgICAvLyBsb3MgYm90b25lcyBkZSBwcm92ZWVkb3IuXG4gICAgICAgICAgc2hhcGU6ICdyb3VuZCcsXG4gICAgICAgIH0pLFxuICAgICAgICB0b2tlbjogJ2xvZ2luLXN1Ym1pdCcsXG4gICAgICAgIHRleHRLZXk6ICdsb2dpblN1Ym1pdCcsXG4gICAgICB9LFxuICAgICAgc3RhdGU6IHRoaXMuX2xvZ2luRm9ybVN0YXRlKCksXG4gICAgfSlcbiAgKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUkVHSVNURVIgRk9STSAoY29tcHV0ZWQpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHJlYWRvbmx5IHJlZ2lzdGVyRm9ybVByb3BzID0gY29tcHV0ZWQ8Rm9ybU1ldGFkYXRhPigoKSA9PlxuICAgIHRoaXMuaTE4bkhlbHBlci5yZXNvbHZlRm9ybSh7XG4gICAgICBuYW1lS2V5OiAncmVnaXN0ZXJUaXRsZScsXG4gICAgICBpMThuTmFtZXNwYWNlOiAnX2F1dGgnLFxuICAgICAgc2VjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICcnLFxuICAgICAgICAgIG9yZGVyOiAwLFxuICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBJbnB1dFR5cGUuVEVYVCxcbiAgICAgICAgICAgICAgbmFtZTogJ25hbWUnLFxuICAgICAgICAgICAgICB0b2tlbjogJ3JlZ2lzdGVyLW5hbWUnLFxuICAgICAgICAgICAgICBoaW50OiAnJyxcbiAgICAgICAgICAgICAgbGFiZWxLZXk6ICdmdWxsTmFtZScsXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyS2V5OiAnbmFtZVBsYWNlaG9sZGVyJyxcbiAgICAgICAgICAgICAgZXJyb3JLZXlzOiB7XG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICduYW1lUmVxdWlyZWQnLFxuICAgICAgICAgICAgICAgIG1pbmxlbmd0aDogJ25hbWVNaW5MZW5ndGgnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoMildLFxuICAgICAgICAgICAgICBvcmRlcjogMCxcbiAgICAgICAgICAgICAgc3RhdGU6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogSW5wdXRUeXBlLkVNQUlMLFxuICAgICAgICAgICAgICBuYW1lOiAnZW1haWwnLFxuICAgICAgICAgICAgICB0b2tlbjogJ3JlZ2lzdGVyLWVtYWlsJyxcbiAgICAgICAgICAgICAgaGludDogJycsXG4gICAgICAgICAgICAgIGxhYmVsS2V5OiAnZW1haWwnLFxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcktleTogJ2VtYWlsUGxhY2Vob2xkZXInLFxuICAgICAgICAgICAgICBlcnJvcktleXM6IHtcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogJ2VtYWlsUmVxdWlyZWQnLFxuICAgICAgICAgICAgICAgIGVtYWlsOiAnZW1haWxJbnZhbGlkJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMuZW1haWxdLFxuICAgICAgICAgICAgICBvcmRlcjogMSxcbiAgICAgICAgICAgICAgc3RhdGU6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogSW5wdXRUeXBlLlBBU1NXT1JELFxuICAgICAgICAgICAgICBuYW1lOiAncGFzc3dvcmQnLFxuICAgICAgICAgICAgICB0b2tlbjogJ3JlZ2lzdGVyLXBhc3N3b3JkJyxcbiAgICAgICAgICAgICAgaGludDogJycsXG4gICAgICAgICAgICAgIGxhYmVsS2V5OiAncGFzc3dvcmQnLFxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcktleTogJ3Bhc3N3b3JkUGxhY2Vob2xkZXInLFxuICAgICAgICAgICAgICBlcnJvcktleXM6IHtcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogJ3Bhc3N3b3JkUmVxdWlyZWQnLFxuICAgICAgICAgICAgICAgIGF1dGhQYXNzd29yZDogJ3Bhc3N3b3JkU3RyZW5ndGgnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgYXV0aFBhc3N3b3JkVmFsaWRhdG9yKCldLFxuICAgICAgICAgICAgICBvcmRlcjogMixcbiAgICAgICAgICAgICAgc3RhdGU6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGFjdGlvbnM6IHtcbiAgICAgICAgLi4uYnV0dG9uKHtcbiAgICAgICAgICB0ZXh0OiAnJyxcbiAgICAgICAgICB0eXBlOiAnc3VibWl0JyxcbiAgICAgICAgICBmaWxsOiAnc29saWQnLFxuICAgICAgICAgIGV4cGFuZDogJ2Jsb2NrJyxcbiAgICAgICAgICAvLyBQw61sZG9yYSBlbiB0b2RvIGVsIGpvdXJuZXk6IHNpbiBzaGFwZSwgSW9uaWMgY2FlIGEgc3UgcmFkaW8gcG9yXG4gICAgICAgICAgLy8gbW9kbyAoMTRweCBlbiBpb3MpIHkgZWwgQ1RBIHByaW5jaXBhbCBxdWVkYWJhIG1lbm9zIHJlZG9uZG8gcXVlXG4gICAgICAgICAgLy8gbG9zIGJvdG9uZXMgZGUgcHJvdmVlZG9yLlxuICAgICAgICAgIHNoYXBlOiAncm91bmQnLFxuICAgICAgICB9KSxcbiAgICAgICAgdG9rZW46ICdyZWdpc3Rlci1zdWJtaXQnLFxuICAgICAgICB0ZXh0S2V5OiAncmVnaXN0ZXJTdWJtaXQnLFxuICAgICAgfSxcbiAgICAgIHN0YXRlOiB0aGlzLl9yZWdpc3RlckZvcm1TdGF0ZSgpLFxuICAgIH0pXG4gICk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFZFUklGWSBFTUFJTCBGT1JNIChjb21wdXRlZClcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcmVhZG9ubHkgdmVyaWZ5Rm9ybVByb3BzID0gY29tcHV0ZWQ8Rm9ybU1ldGFkYXRhPigoKSA9PiB7XG4gICAgY29uc3Qgc2VjdGlvbk5hbWUgPSB0aGlzLl92ZXJpZnlGb3JtU2VjdGlvbk5hbWUoKSB8fCB0aGlzLnQoJ3ZlcmlmeURlc2NyaXB0aW9uJyk7XG4gICAgcmV0dXJuIHRoaXMuaTE4bkhlbHBlci5yZXNvbHZlRm9ybSh7XG4gICAgICBuYW1lS2V5OiAndmVyaWZ5VGl0bGUnLFxuICAgICAgaTE4bk5hbWVzcGFjZTogJ19hdXRoJyxcbiAgICAgIHNlY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBzZWN0aW9uTmFtZSxcbiAgICAgICAgICBvcmRlcjogMCxcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogSW5wdXRUeXBlLlBJTl9DT0RFLFxuICAgICAgICAgICAgICBsYWJlbDogJycsXG4gICAgICAgICAgICAgIG5hbWU6ICdjb2RlJyxcbiAgICAgICAgICAgICAgdG9rZW46ICd2ZXJpZnktcGluJyxcbiAgICAgICAgICAgICAgaGludDogJycsXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiAnJyxcbiAgICAgICAgICAgICAgZXJyb3JLZXlzOiB7XG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICdjb2RlUmVxdWlyZWQnLFxuICAgICAgICAgICAgICAgIG1pbmxlbmd0aDogJ2NvZGVNaW5MZW5ndGgnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoNildLFxuICAgICAgICAgICAgICBvcmRlcjogMCxcbiAgICAgICAgICAgICAgc3RhdGU6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgICAgICAgICAgICBsZW5ndGg6IDYsXG4gICAgICAgICAgICAgIGFsbG93TnVtYmVyc09ubHk6IHRydWUsXG4gICAgICAgICAgICAgIGF1dG9Gb2N1czogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBhY3Rpb25zOiB7XG4gICAgICAgIC4uLmJ1dHRvbih7XG4gICAgICAgICAgdGV4dDogJycsXG4gICAgICAgICAgdHlwZTogJ3N1Ym1pdCcsXG4gICAgICAgICAgZmlsbDogJ3NvbGlkJyxcbiAgICAgICAgICBleHBhbmQ6ICdibG9jaycsXG4gICAgICAgICAgLy8gUMOtbGRvcmEgZW4gdG9kbyBlbCBqb3VybmV5OiBzaW4gc2hhcGUsIElvbmljIGNhZSBhIHN1IHJhZGlvIHBvclxuICAgICAgICAgIC8vIG1vZG8gKDE0cHggZW4gaW9zKSB5IGVsIENUQSBwcmluY2lwYWwgcXVlZGFiYSBtZW5vcyByZWRvbmRvIHF1ZVxuICAgICAgICAgIC8vIGxvcyBib3RvbmVzIGRlIHByb3ZlZWRvci5cbiAgICAgICAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICAgICAgfSksXG4gICAgICAgIHRva2VuOiAndmVyaWZ5LXN1Ym1pdCcsXG4gICAgICAgIHRleHRLZXk6ICd2ZXJpZnlTdWJtaXQnLFxuICAgICAgfSxcbiAgICAgIHN0YXRlOiB0aGlzLl92ZXJpZnlGb3JtU3RhdGUoKSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE1GQSBWRVJJRlkgRk9STSAoY29tcHV0ZWQpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHJlYWRvbmx5IG1mYVZlcmlmeUZvcm1Qcm9wcyA9IGNvbXB1dGVkPEZvcm1NZXRhZGF0YT4oKCkgPT4ge1xuICAgIGNvbnN0IG1ldGhvZCA9IHRoaXMuX21mYU1ldGhvZCgpO1xuICAgIGNvbnN0IHVzZUJhY2t1cCA9IHRoaXMubWZhVXNlQmFja3VwQ29kZSgpO1xuICAgIGNvbnN0IHNlY3Rpb25OYW1lID0gdXNlQmFja3VwXG4gICAgICA/IHRoaXMudCgnbWZhQmFja3VwQ29kZScpXG4gICAgICA6IG1ldGhvZCA9PT0gJ1RPVFAnXG4gICAgICAgID8gdGhpcy50KCdtZmFUT1RQJylcbiAgICAgICAgOiBtZXRob2QgPT09ICdFTUFJTCdcbiAgICAgICAgICA/IHRoaXMudCgnbWZhRW1haWwnKVxuICAgICAgICAgIDogdGhpcy50KCdtZmFTTVMnKTtcblxuICAgIC8vIEE6IGJhY2t1cCBjb2RlID0gOCBjaGFycyBhbGZhbnVtw6lyaWNvcyDihpIgaW5wdXQgZGUgdGV4dG8gKGVsIFBJTiBkZSA2XG4gICAgLy8gY2VsZGFzIG51bcOpcmljYXMgbm8gcHVlZGUgY2FwdHVyYXJsbykuIEVsIGJhY2tlbmQgcnV0ZWEgcG9yIGxvbmdpdHVkLlxuICAgIGNvbnN0IGNvZGVGaWVsZCA9IHVzZUJhY2t1cFxuICAgICAgPyB7XG4gICAgICAgICAgdHlwZTogSW5wdXRUeXBlLlRFWFQsXG4gICAgICAgICAgbGFiZWw6ICcnLFxuICAgICAgICAgIG5hbWU6ICdjb2RlJyxcbiAgICAgICAgICB0b2tlbjogJ21mYS1iYWNrdXAnLFxuICAgICAgICAgIGhpbnQ6ICcnLFxuICAgICAgICAgIHBsYWNlaG9sZGVyOiAnJyxcbiAgICAgICAgICBlcnJvcktleXM6IHtcbiAgICAgICAgICAgIHJlcXVpcmVkOiAnY29kZVJlcXVpcmVkJyxcbiAgICAgICAgICAgIG1pbmxlbmd0aDogJ2JhY2t1cENvZGVNaW5MZW5ndGgnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDgpXSxcbiAgICAgICAgICBvcmRlcjogMCxcbiAgICAgICAgICBzdGF0ZTogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgICAgICAgYXV0b0ZvY3VzOiB0cnVlLFxuICAgICAgICB9XG4gICAgICA6IHtcbiAgICAgICAgICB0eXBlOiBJbnB1dFR5cGUuUElOX0NPREUsXG4gICAgICAgICAgbGFiZWw6ICcnLFxuICAgICAgICAgIG5hbWU6ICdjb2RlJyxcbiAgICAgICAgICB0b2tlbjogJ21mYS1waW4nLFxuICAgICAgICAgIGhpbnQ6ICcnLFxuICAgICAgICAgIHBsYWNlaG9sZGVyOiAnJyxcbiAgICAgICAgICBlcnJvcktleXM6IHtcbiAgICAgICAgICAgIHJlcXVpcmVkOiAnY29kZVJlcXVpcmVkJyxcbiAgICAgICAgICAgIG1pbmxlbmd0aDogJ2NvZGVNaW5MZW5ndGgnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDYpXSxcbiAgICAgICAgICBvcmRlcjogMCxcbiAgICAgICAgICBzdGF0ZTogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgICAgICAgbGVuZ3RoOiA2LFxuICAgICAgICAgIGFsbG93TnVtYmVyc09ubHk6IHRydWUsXG4gICAgICAgICAgYXV0b0ZvY3VzOiB0cnVlLFxuICAgICAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuaTE4bkhlbHBlci5yZXNvbHZlRm9ybSh7XG4gICAgICBuYW1lS2V5OiAnbWZhVGl0bGUnLFxuICAgICAgaTE4bk5hbWVzcGFjZTogJ19hdXRoJyxcbiAgICAgIHNlY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBzZWN0aW9uTmFtZSxcbiAgICAgICAgICBvcmRlcjogMCxcbiAgICAgICAgICBmaWVsZHM6IFtjb2RlRmllbGRdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGFjdGlvbnM6IHtcbiAgICAgICAgLi4uYnV0dG9uKHtcbiAgICAgICAgICB0ZXh0OiAnJyxcbiAgICAgICAgICB0eXBlOiAnc3VibWl0JyxcbiAgICAgICAgICBmaWxsOiAnc29saWQnLFxuICAgICAgICAgIGV4cGFuZDogJ2Jsb2NrJyxcbiAgICAgICAgICAvLyBQw61sZG9yYSBlbiB0b2RvIGVsIGpvdXJuZXk6IHNpbiBzaGFwZSwgSW9uaWMgY2FlIGEgc3UgcmFkaW8gcG9yXG4gICAgICAgICAgLy8gbW9kbyAoMTRweCBlbiBpb3MpIHkgZWwgQ1RBIHByaW5jaXBhbCBxdWVkYWJhIG1lbm9zIHJlZG9uZG8gcXVlXG4gICAgICAgICAgLy8gbG9zIGJvdG9uZXMgZGUgcHJvdmVlZG9yLlxuICAgICAgICAgIHNoYXBlOiAncm91bmQnLFxuICAgICAgICB9KSxcbiAgICAgICAgdG9rZW46ICdtZmEtdmVyaWZ5LXN1Ym1pdCcsXG4gICAgICAgIHRleHRLZXk6ICd2ZXJpZnlTdWJtaXQnLFxuICAgICAgfSxcbiAgICAgIHN0YXRlOiB0aGlzLl9tZmFWZXJpZnlGb3JtU3RhdGUoKSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE1GQSBSRVNFVCBGT1JNIChjb21wdXRlZCkg4oCUIEI6IHJlY292ZXJ5IHBvciBlbWFpbFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICByZWFkb25seSBtZmFSZXNldFJlcXVlc3RGb3JtUHJvcHMgPSBjb21wdXRlZDxGb3JtTWV0YWRhdGE+KCgpID0+XG4gICAgdGhpcy5pMThuSGVscGVyLnJlc29sdmVGb3JtKHtcbiAgICAgIG5hbWVLZXk6ICdtZmFSZXNldFRpdGxlJyxcbiAgICAgIGkxOG5OYW1lc3BhY2U6ICdfYXV0aCcsXG4gICAgICBzZWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogdGhpcy50KCdtZmFSZXNldFJlcXVlc3REZXNjcmlwdGlvbicpLFxuICAgICAgICAgIG9yZGVyOiAwLFxuICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBJbnB1dFR5cGUuRU1BSUwsXG4gICAgICAgICAgICAgIGxhYmVsOiAnJyxcbiAgICAgICAgICAgICAgbmFtZTogJ2VtYWlsJyxcbiAgICAgICAgICAgICAgdG9rZW46ICdtZmEtcmVzZXQtZW1haWwnLFxuICAgICAgICAgICAgICBoaW50OiAnJyxcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXJLZXk6ICdlbWFpbFBsYWNlaG9sZGVyJyxcbiAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuX21mYVJlc2V0RW1haWwoKSxcbiAgICAgICAgICAgICAgZXJyb3JLZXlzOiB7XG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICdlbWFpbFJlcXVpcmVkJyxcbiAgICAgICAgICAgICAgICBlbWFpbDogJ2VtYWlsSW52YWxpZCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLmVtYWlsXSxcbiAgICAgICAgICAgICAgb3JkZXI6IDAsXG4gICAgICAgICAgICAgIHN0YXRlOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBhY3Rpb25zOiB7XG4gICAgICAgIC4uLmJ1dHRvbih7XG4gICAgICAgICAgdGV4dDogJycsXG4gICAgICAgICAgdHlwZTogJ3N1Ym1pdCcsXG4gICAgICAgICAgZmlsbDogJ3NvbGlkJyxcbiAgICAgICAgICBleHBhbmQ6ICdibG9jaycsXG4gICAgICAgICAgLy8gUMOtbGRvcmEgZW4gdG9kbyBlbCBqb3VybmV5OiBzaW4gc2hhcGUsIElvbmljIGNhZSBhIHN1IHJhZGlvIHBvclxuICAgICAgICAgIC8vIG1vZG8gKDE0cHggZW4gaW9zKSB5IGVsIENUQSBwcmluY2lwYWwgcXVlZGFiYSBtZW5vcyByZWRvbmRvIHF1ZVxuICAgICAgICAgIC8vIGxvcyBib3RvbmVzIGRlIHByb3ZlZWRvci5cbiAgICAgICAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICAgICAgfSksXG4gICAgICAgIHRva2VuOiAnbWZhLXJlc2V0LXJlcXVlc3Qtc3VibWl0JyxcbiAgICAgICAgdGV4dEtleTogJ21mYVJlc2V0U3VibWl0JyxcbiAgICAgIH0sXG4gICAgICBzdGF0ZTogdGhpcy5fbWZhUmVzZXRGb3JtU3RhdGUoKSxcbiAgICB9KVxuICApO1xuXG4gIHJlYWRvbmx5IG1mYVJlc2V0Q29uZmlybUZvcm1Qcm9wcyA9IGNvbXB1dGVkPEZvcm1NZXRhZGF0YT4oKCkgPT5cbiAgICB0aGlzLmkxOG5IZWxwZXIucmVzb2x2ZUZvcm0oe1xuICAgICAgbmFtZUtleTogJ21mYVJlc2V0VGl0bGUnLFxuICAgICAgaTE4bk5hbWVzcGFjZTogJ19hdXRoJyxcbiAgICAgIHNlY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiB0aGlzLnQoJ21mYVJlc2V0Q29uZmlybURlc2NyaXB0aW9uJyksXG4gICAgICAgICAgb3JkZXI6IDAsXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IElucHV0VHlwZS5QSU5fQ09ERSxcbiAgICAgICAgICAgICAgbGFiZWw6ICcnLFxuICAgICAgICAgICAgICBuYW1lOiAnY29kZScsXG4gICAgICAgICAgICAgIHRva2VuOiAnbWZhLXJlc2V0LXBpbicsXG4gICAgICAgICAgICAgIGhpbnQ6ICcnLFxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogJycsXG4gICAgICAgICAgICAgIGVycm9yS2V5czoge1xuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAnY29kZVJlcXVpcmVkJyxcbiAgICAgICAgICAgICAgICBtaW5sZW5ndGg6ICdjb2RlTWluTGVuZ3RoJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDYpXSxcbiAgICAgICAgICAgICAgb3JkZXI6IDAsXG4gICAgICAgICAgICAgIHN0YXRlOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICAgICAgICAgICAgbGVuZ3RoOiA2LFxuICAgICAgICAgICAgICBhbGxvd051bWJlcnNPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICBhdXRvRm9jdXM6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgYWN0aW9uczoge1xuICAgICAgICAuLi5idXR0b24oe1xuICAgICAgICAgIHRleHQ6ICcnLFxuICAgICAgICAgIHR5cGU6ICdzdWJtaXQnLFxuICAgICAgICAgIGZpbGw6ICdzb2xpZCcsXG4gICAgICAgICAgZXhwYW5kOiAnYmxvY2snLFxuICAgICAgICAgIC8vIFDDrWxkb3JhIGVuIHRvZG8gZWwgam91cm5leTogc2luIHNoYXBlLCBJb25pYyBjYWUgYSBzdSByYWRpbyBwb3JcbiAgICAgICAgICAvLyBtb2RvICgxNHB4IGVuIGlvcykgeSBlbCBDVEEgcHJpbmNpcGFsIHF1ZWRhYmEgbWVub3MgcmVkb25kbyBxdWVcbiAgICAgICAgICAvLyBsb3MgYm90b25lcyBkZSBwcm92ZWVkb3IuXG4gICAgICAgICAgc2hhcGU6ICdyb3VuZCcsXG4gICAgICAgIH0pLFxuICAgICAgICB0b2tlbjogJ21mYS1yZXNldC1jb25maXJtLXN1Ym1pdCcsXG4gICAgICAgIHRleHRLZXk6ICdtZmFSZXNldENvbmZpcm1TdWJtaXQnLFxuICAgICAgfSxcbiAgICAgIHN0YXRlOiB0aGlzLl9tZmFSZXNldEZvcm1TdGF0ZSgpLFxuICAgIH0pXG4gICk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEZPUkdPVCBQQVNTV09SRCBGT1JNIChjb21wdXRlZClcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcmVhZG9ubHkgZm9yZ290UGFzc3dvcmRGb3JtUHJvcHMgPSBjb21wdXRlZDxGb3JtTWV0YWRhdGE+KCgpID0+XG4gICAgdGhpcy5pMThuSGVscGVyLnJlc29sdmVGb3JtKHtcbiAgICAgIG5hbWVLZXk6ICdmb3Jnb3RUaXRsZScsXG4gICAgICBpMThuTmFtZXNwYWNlOiAnX2F1dGgnLFxuICAgICAgc2VjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IHRoaXMudCgnZm9yZ290RGVzY3JpcHRpb24nKSxcbiAgICAgICAgICBvcmRlcjogMCxcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogSW5wdXRUeXBlLkVNQUlMLFxuICAgICAgICAgICAgICBsYWJlbDogJycsXG4gICAgICAgICAgICAgIG5hbWU6ICdlbWFpbCcsXG4gICAgICAgICAgICAgIHRva2VuOiAnZm9yZ290LWVtYWlsJyxcbiAgICAgICAgICAgICAgaGludDogJycsXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyS2V5OiAnZW1haWxQbGFjZWhvbGRlcicsXG4gICAgICAgICAgICAgIGVycm9yS2V5czoge1xuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAnZW1haWxSZXF1aXJlZCcsXG4gICAgICAgICAgICAgICAgZW1haWw6ICdlbWFpbEludmFsaWQnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5lbWFpbF0sXG4gICAgICAgICAgICAgIG9yZGVyOiAwLFxuICAgICAgICAgICAgICBzdGF0ZTogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgYWN0aW9uczoge1xuICAgICAgICAuLi5idXR0b24oe1xuICAgICAgICAgIHRleHQ6ICcnLFxuICAgICAgICAgIHR5cGU6ICdzdWJtaXQnLFxuICAgICAgICAgIGZpbGw6ICdzb2xpZCcsXG4gICAgICAgICAgZXhwYW5kOiAnYmxvY2snLFxuICAgICAgICAgIC8vIFDDrWxkb3JhIGVuIHRvZG8gZWwgam91cm5leTogc2luIHNoYXBlLCBJb25pYyBjYWUgYSBzdSByYWRpbyBwb3JcbiAgICAgICAgICAvLyBtb2RvICgxNHB4IGVuIGlvcykgeSBlbCBDVEEgcHJpbmNpcGFsIHF1ZWRhYmEgbWVub3MgcmVkb25kbyBxdWVcbiAgICAgICAgICAvLyBsb3MgYm90b25lcyBkZSBwcm92ZWVkb3IuXG4gICAgICAgICAgc2hhcGU6ICdyb3VuZCcsXG4gICAgICAgIH0pLFxuICAgICAgICB0b2tlbjogJ2ZvcmdvdC1zdWJtaXQnLFxuICAgICAgICB0ZXh0S2V5OiAnZm9yZ290U3VibWl0JyxcbiAgICAgIH0sXG4gICAgICBzdGF0ZTogdGhpcy5fZm9yZ290UGFzc3dvcmRGb3JtU3RhdGUoKSxcbiAgICB9KVxuICApO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSRVNFVCBQQVNTV09SRCBGT1JNIChjb21wdXRlZClcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcmVhZG9ubHkgcmVzZXRQYXNzd29yZEZvcm1Qcm9wcyA9IGNvbXB1dGVkPEZvcm1NZXRhZGF0YT4oKCkgPT4ge1xuICAgIGNvbnN0IHNlY3Rpb25OYW1lID0gdGhpcy5fcmVzZXRGb3JtU2VjdGlvbk5hbWUoKSB8fCB0aGlzLnQoJ3Jlc2V0RGVzY3JpcHRpb24nKTtcbiAgICByZXR1cm4gdGhpcy5pMThuSGVscGVyLnJlc29sdmVGb3JtKHtcbiAgICAgIG5hbWVLZXk6ICdyZXNldFRpdGxlJyxcbiAgICAgIGkxOG5OYW1lc3BhY2U6ICdfYXV0aCcsXG4gICAgICBzZWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogc2VjdGlvbk5hbWUsXG4gICAgICAgICAgb3JkZXI6IDAsXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IElucHV0VHlwZS5QSU5fQ09ERSxcbiAgICAgICAgICAgICAgbGFiZWw6ICcnLFxuICAgICAgICAgICAgICBuYW1lOiAnY29kZScsXG4gICAgICAgICAgICAgIHRva2VuOiAncmVzZXQtcGluJyxcbiAgICAgICAgICAgICAgaGludDogJycsXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiAnJyxcbiAgICAgICAgICAgICAgZXJyb3JLZXlzOiB7XG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICdjb2RlUmVxdWlyZWQnLFxuICAgICAgICAgICAgICAgIG1pbmxlbmd0aDogJ2NvZGVNaW5MZW5ndGgnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoNildLFxuICAgICAgICAgICAgICBvcmRlcjogMCxcbiAgICAgICAgICAgICAgc3RhdGU6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgICAgICAgICAgICBsZW5ndGg6IDYsXG4gICAgICAgICAgICAgIGFsbG93TnVtYmVyc09ubHk6IHRydWUsXG4gICAgICAgICAgICAgIGF1dG9Gb2N1czogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IElucHV0VHlwZS5QQVNTV09SRCxcbiAgICAgICAgICAgICAgbmFtZTogJ25ld1Bhc3N3b3JkJyxcbiAgICAgICAgICAgICAgdG9rZW46ICdyZXNldC1uZXctcGFzc3dvcmQnLFxuICAgICAgICAgICAgICBsYWJlbEtleTogJ25ld1Bhc3N3b3JkJyxcbiAgICAgICAgICAgICAgaGludEtleTogJ25ld1Bhc3N3b3JkSGludCcsXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyS2V5OiAncGFzc3dvcmRQbGFjZWhvbGRlcicsXG4gICAgICAgICAgICAgIGVycm9yS2V5czoge1xuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAncGFzc3dvcmRSZXF1aXJlZCcsXG4gICAgICAgICAgICAgICAgYXV0aFBhc3N3b3JkOiAncGFzc3dvcmRTdHJlbmd0aCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBhdXRoUGFzc3dvcmRWYWxpZGF0b3IoKV0sXG4gICAgICAgICAgICAgIG9yZGVyOiAxLFxuICAgICAgICAgICAgICBzdGF0ZTogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgYWN0aW9uczoge1xuICAgICAgICAuLi5idXR0b24oe1xuICAgICAgICAgIHRleHQ6ICcnLFxuICAgICAgICAgIHR5cGU6ICdzdWJtaXQnLFxuICAgICAgICAgIGZpbGw6ICdzb2xpZCcsXG4gICAgICAgICAgZXhwYW5kOiAnYmxvY2snLFxuICAgICAgICAgIC8vIFDDrWxkb3JhIGVuIHRvZG8gZWwgam91cm5leTogc2luIHNoYXBlLCBJb25pYyBjYWUgYSBzdSByYWRpbyBwb3JcbiAgICAgICAgICAvLyBtb2RvICgxNHB4IGVuIGlvcykgeSBlbCBDVEEgcHJpbmNpcGFsIHF1ZWRhYmEgbWVub3MgcmVkb25kbyBxdWVcbiAgICAgICAgICAvLyBsb3MgYm90b25lcyBkZSBwcm92ZWVkb3IuXG4gICAgICAgICAgc2hhcGU6ICdyb3VuZCcsXG4gICAgICAgIH0pLFxuICAgICAgICB0b2tlbjogJ3Jlc2V0LXN1Ym1pdCcsXG4gICAgICAgIHRleHRLZXk6ICdyZXNldFN1Ym1pdCcsXG4gICAgICB9LFxuICAgICAgc3RhdGU6IHRoaXMuX3Jlc2V0UGFzc3dvcmRGb3JtU3RhdGUoKSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEhBTkRMRVJTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGxvZ2luSGFuZGxlcihldmVudDogRm9ybVN1Ym1pdCk6IHZvaWQge1xuICAgIGNvbnN0IGVtYWlsID0gZXZlbnQuZmllbGRzWydlbWFpbCddO1xuICAgIGNvbnN0IHBhc3N3b3JkID0gZXZlbnQuZmllbGRzWydwYXNzd29yZCddO1xuXG4gICAgaWYgKCFlbWFpbCB8fCAhcGFzc3dvcmQpIHtcbiAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMudCgnY29tcGxldGVBbGxGaWVsZHMnKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbG9naW5Gb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5XT1JLSU5HKTtcblxuICAgIHRoaXMuYXV0aFNlcnZpY2Uuc2lnbmluKHsgZW1haWwsIHBhc3N3b3JkIH0pLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMuX2xvZ2luRm9ybVN0YXRlLnNldChDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCk7XG5cbiAgICAgICAgaWYgKHRoaXMuYXV0aFNlcnZpY2UubWZhUGVuZGluZygpLnJlcXVpcmVkKSB7XG4gICAgICAgICAgdGhpcy5fbWZhUmVzZXRFbWFpbC5zZXQoZW1haWwpOyAvLyBCOiBwcmVmaWxsIGRlbCByZXNldCBwb3IgZW1haWxcbiAgICAgICAgICB0aGlzLm9wZW5NRkFWZXJpZnlNb2RhbCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGFuZGxlTG9naW5TdWNjZXNzKCk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgIHRoaXMuX2xvZ2luRm9ybVN0YXRlLnNldChDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCk7XG5cbiAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gKGVyciBhcyB7IGNvZGU/OiBzdHJpbmcgfSk/LmNvZGU7XG4gICAgICAgIGlmIChlcnJvckNvZGUgPT09ICdBVVRIVjJfRU1BSUxfTk9UX1ZFUklGSUVEJykge1xuICAgICAgICAgIHRoaXMub3BlblZlcmlmeU1vZGFsKGVtYWlsKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGVyciwgJ3NpZ25pbicpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9wcyBkZWwgYm90w7NuIGRlIHVuIHByb3ZlZWRvci4gTG9zIE9BdXRoIHBhc2FuIHBvciBgdmFsLWJ1dHRvbmAgY29tbyBlbFxuICAgKiByZXN0byBkZWwgam91cm5leTogYXPDrSBoZXJlZGFuIGxhIGZvcm1hIGRlIHDDrWxkb3JhIGRlbCBzaXN0ZW1hIGVuIHZleiBkZVxuICAgKiBkZXBlbmRlciBkZSB1biBgLS1ib3JkZXItcmFkaXVzYCBsb2NhbCwgcXVlIGVyYSBsbyBxdWUgbG9zIGRlamFiYVxuICAgKiByZWN0YW5ndWxhcmVzIGFsIGxhZG8gZGVsIENUQSBwcmluY2lwYWwuXG4gICAqL1xuICBvYXV0aEJ1dHRvblByb3BzKFxuICAgIHByb3ZpZGVyOiAnZ29vZ2xlJyB8ICdhcHBsZScgfCAnbWljcm9zb2Z0JyB8ICdmYWNlYm9vaydcbiAgKTogQnV0dG9uTWV0YWRhdGEge1xuICAgIGNvbnN0IGxhYmVsczogUmVjb3JkPHR5cGVvZiBwcm92aWRlciwgc3RyaW5nPiA9IHtcbiAgICAgIGdvb2dsZTogJ2NvbnRpbnVlV2l0aEdvb2dsZScsXG4gICAgICBhcHBsZTogJ2NvbnRpbnVlV2l0aEFwcGxlJyxcbiAgICAgIG1pY3Jvc29mdDogJ2NvbnRpbnVlV2l0aE1pY3Jvc29mdCcsXG4gICAgICBmYWNlYm9vazogJ2NvbnRpbnVlV2l0aEZhY2Vib29rJyxcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICB0b2tlbjogYG9hdXRoLSR7cHJvdmlkZXJ9YCxcbiAgICAgIHRleHQ6IHRoaXMuaXNPQXV0aExvYWRpbmcgPyB0aGlzLnQoJ2Nvbm5lY3RpbmcnKSA6IHRoaXMudChsYWJlbHNbcHJvdmlkZXJdKSxcbiAgICAgIGljb246IHsgbmFtZTogYGxvZ28tJHtwcm92aWRlcn1gLCBzbG90OiAnc3RhcnQnIH0sXG4gICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgZmlsbDogJ291dGxpbmUnLFxuICAgICAgc2hhcGU6ICdyb3VuZCcsXG4gICAgICBleHBhbmQ6ICdibG9jaycsXG4gICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgIHN0YXRlOiB0aGlzLmlzT0F1dGhMb2FkaW5nXG4gICAgICAgID8gQ29tcG9uZW50U3RhdGVzLkRJU0FCTEVEXG4gICAgICAgIDogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgfTtcbiAgfVxuXG4gIGxvZ2luV2l0aE9BdXRoKHByb3ZpZGVyOiAnZ29vZ2xlJyB8ICdhcHBsZScgfCAnbWljcm9zb2Z0JyB8ICdmYWNlYm9vaycpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc09BdXRoTG9hZGluZykgcmV0dXJuO1xuXG4gICAgdGhpcy5pc09BdXRoTG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5zY2hlZHVsZU9BdXRoTG9hZGluZ1Jlc2V0KCk7XG5cbiAgICB0aGlzLmF1dGhTZXJ2aWNlLnNpZ25pbldpdGhPQXV0aChwcm92aWRlcikuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy5jbGVhck9BdXRoTG9hZGluZ1Jlc2V0VGltZXIoKTtcbiAgICAgICAgdGhpcy5pc09BdXRoTG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0aGlzLmF1dGhTZXJ2aWNlLm1mYVBlbmRpbmcoKS5yZXF1aXJlZCkge1xuICAgICAgICAgIHRoaXMub3Blbk1GQVZlcmlmeU1vZGFsKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oYW5kbGVMb2dpblN1Y2Nlc3MocHJvdmlkZXIpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiBlcnIgPT4ge1xuICAgICAgICB0aGlzLmNsZWFyT0F1dGhMb2FkaW5nUmVzZXRUaW1lcigpO1xuICAgICAgICB0aGlzLmlzT0F1dGhMb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gKGVyciBhcyB7IGNvZGU/OiBzdHJpbmcgfSk/LmNvZGU7XG4gICAgICAgIGlmIChlcnJvckNvZGUgPT09ICdQT1BVUF9DTE9TRUQnKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnIsICdvYXV0aCcpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSRUdJU1RFUiBIQU5ETEVSU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogTmF2ZWdhY2nDs24gcGVuZGllbnRlIGEgbGEgcMOhZ2luYSBkZSBsb2dpbiB0cmFzIGNlcnJhciBlbCBtb2RhbCBkZSByZWdpc3Ryby4gKi9cbiAgcHJpdmF0ZSBfcGVuZGluZ0xvZ2luTmF2ID0gZmFsc2U7XG5cbiAgb3BlblJlZ2lzdGVyTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5pc1JlZ2lzdGVyTW9kYWxPcGVuID0gdHJ1ZTtcbiAgfVxuXG4gIGNsb3NlUmVnaXN0ZXJNb2RhbCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzUmVnaXN0ZXJNb2RhbE9wZW4gPSBmYWxzZTtcbiAgICAvLyBOYXZlZ2FjacOzbiBkaWZlcmlkYTogc2UgaGFjZSBlbiBlbCBjaWVycmUgZGVsIG1vZGFsIChkaWREaXNtaXNzIGxsYW1hIGFjw6EpXG4gICAgLy8gcGFyYSBxdWUgaW9uLW1vZGFsIGNvbXBsZXRlIHN1IGFuaW1hY2nDs24gYW50ZXMgZGUgZW5ydXRhciDigJQgc2luIGVzdG8gZWxcbiAgICAvLyBtb2RhbCBwdWVkZSBxdWVkYXIgdmlzaWJsZSBzb2JyZSBsYSBww6FnaW5hIGRlc3Rpbm8uXG4gICAgaWYgKHRoaXMuX3BlbmRpbmdMb2dpbk5hdikge1xuICAgICAgdGhpcy5fcGVuZGluZ0xvZ2luTmF2ID0gZmFsc2U7XG4gICAgICBjb25zdCByb3V0ZSA9IHRoaXMucHJvcHMubG9naW5Sb3V0ZTtcbiAgICAgIGlmIChyb3V0ZSkgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3JvdXRlXSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpbmsgXCLCv1lhIHRpZW5lcyBjdWVudGE/XCIgZGVsIG1vZGFsIGRlIHJlZ2lzdHJvLiBTaSBgcHJvcHMubG9naW5Sb3V0ZWAgZXN0w6FcbiAgICogY29uZmlndXJhZG8sIGNpZXJyYSBlbCBtb2RhbCB5IG5hdmVnYSBhIGxhIHDDoWdpbmEgZGUgbG9naW47IHNpIG5vLCBzb2xvXG4gICAqIGNpZXJyYSBlbCBtb2RhbCAoY29tcG9ydGFtaWVudG8gcG9yIGRlZmVjdG8pLlxuICAgKi9cbiAgb25SZWdpc3RlclN3aXRjaFRvTG9naW4oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJvcHMubG9naW5Sb3V0ZSkge1xuICAgICAgdGhpcy5fcGVuZGluZ0xvZ2luTmF2ID0gdHJ1ZTtcbiAgICAgIHRoaXMuaXNSZWdpc3Rlck1vZGFsT3BlbiA9IGZhbHNlOyAvLyBkaXNwYXJhIChkaWREaXNtaXNzKSDihpIgY2xvc2VSZWdpc3Rlck1vZGFsXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2xvc2VSZWdpc3Rlck1vZGFsKCk7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJIYW5kbGVyKGV2ZW50OiBGb3JtU3VibWl0KTogdm9pZCB7XG4gICAgY29uc3QgbmFtZSA9IGV2ZW50LmZpZWxkc1snbmFtZSddO1xuICAgIGNvbnN0IGVtYWlsID0gZXZlbnQuZmllbGRzWydlbWFpbCddO1xuICAgIGNvbnN0IHBhc3N3b3JkID0gZXZlbnQuZmllbGRzWydwYXNzd29yZCddO1xuXG4gICAgaWYgKCFuYW1lIHx8ICFlbWFpbCB8fCAhcGFzc3dvcmQpIHtcbiAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMudCgnY29tcGxldGVBbGxGaWVsZHMnKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcmVnaXN0ZXJGb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5XT1JLSU5HKTtcblxuICAgIHRoaXMuYXV0aFNlcnZpY2Uuc2lnbnVwKHsgbmFtZSwgZW1haWwsIHBhc3N3b3JkIH0pLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMuX3JlZ2lzdGVyRm9ybVN0YXRlLnNldChDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCk7XG4gICAgICAgIHRoaXMuY2xvc2VSZWdpc3Rlck1vZGFsKCk7XG4gICAgICAgIHRoaXMub3BlblZlcmlmeU1vZGFsKGVtYWlsKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogZXJyID0+IHtcbiAgICAgICAgdGhpcy5fcmVnaXN0ZXJGb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5FTkFCTEVEKTtcbiAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnIsICdzaWdudXAnKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVkVSSUZZIEVNQUlMIEhBTkRMRVJTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIG9wZW5WZXJpZnlNb2RhbChlbWFpbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wZW5kaW5nVmVyaWZpY2F0aW9uRW1haWwgPSBlbWFpbDtcbiAgICB0aGlzLl92ZXJpZnlGb3JtU2VjdGlvbk5hbWUuc2V0KGAke3RoaXMudCgndmVyaWZ5RGVzY3JpcHRpb24nKS5yZXBsYWNlKCcuJywgJycpfSAoJHtlbWFpbH0pYCk7XG4gICAgdGhpcy5fdmVyaWZ5Rm9ybVN0YXRlLnNldChDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCk7XG4gICAgdGhpcy5pc1ZlcmlmeU1vZGFsT3BlbiA9IHRydWU7XG4gICAgdGhpcy5zdGFydFJlc2VuZENvb2xkb3duKCk7XG4gIH1cblxuICBjbG9zZVZlcmlmeU1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMuaXNWZXJpZnlNb2RhbE9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLnBlbmRpbmdWZXJpZmljYXRpb25FbWFpbCA9ICcnO1xuICAgIHRoaXMuX3ZlcmlmeUZvcm1TZWN0aW9uTmFtZS5zZXQoJycpO1xuICAgIHRoaXMuc3RvcFJlc2VuZENvb2xkb3duKCk7XG4gIH1cblxuICB2ZXJpZnlIYW5kbGVyKGV2ZW50OiBGb3JtU3VibWl0KTogdm9pZCB7XG4gICAgY29uc3QgY29kZSA9IGV2ZW50LmZpZWxkc1snY29kZSddO1xuXG4gICAgdGhpcy5fdmVyaWZ5Rm9ybVN0YXRlLnNldChDb21wb25lbnRTdGF0ZXMuV09SS0lORyk7XG5cbiAgICB0aGlzLmF1dGhTZXJ2aWNlXG4gICAgICAudmVyaWZ5RW1haWwoe1xuICAgICAgICBlbWFpbDogdGhpcy5wZW5kaW5nVmVyaWZpY2F0aW9uRW1haWwsXG4gICAgICAgIGNvZGUsXG4gICAgICB9KVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLl92ZXJpZnlGb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5FTkFCTEVEKTtcbiAgICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ2VtYWlsVmVyaWZpZWQnKSk7XG4gICAgICAgICAgdGhpcy5jbG9zZVZlcmlmeU1vZGFsKCk7XG4gICAgICAgICAgdGhpcy5oYW5kbGVMb2dpblN1Y2Nlc3MoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgICAgdGhpcy5fdmVyaWZ5Rm9ybVN0YXRlLnNldChDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCk7XG4gICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnIsICd2ZXJpZnknKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICB9XG5cbiAgcmVzZW5kQ29kZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZXNlbmRDb29sZG93biA+IDApIHJldHVybjtcblxuICAgIHRoaXMuYXV0aFNlcnZpY2VcbiAgICAgIC5yZXNlbmRDb2RlKHtcbiAgICAgICAgZW1haWw6IHRoaXMucGVuZGluZ1ZlcmlmaWNhdGlvbkVtYWlsLFxuICAgICAgICB0eXBlOiAnRU1BSUxfVkVSSUZZJyxcbiAgICAgIH0pXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMudCgnY29kZVNlbnQnKSk7XG4gICAgICAgICAgdGhpcy5zdGFydFJlc2VuZENvb2xkb3duKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBlcnIgPT4ge1xuICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyLCAndmVyaWZ5Jyk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBNRkEgSEFORExFUlNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgb3Blbk1GQVZlcmlmeU1vZGFsKCk6IHZvaWQge1xuICAgIGNvbnN0IG1ldGhvZCA9IHRoaXMuYXV0aFNlcnZpY2UubWZhUGVuZGluZygpLm1ldGhvZCBhcyAnVE9UUCcgfCAnRU1BSUwnIHwgJ1NNUyc7XG4gICAgdGhpcy5fbWZhTWV0aG9kLnNldChtZXRob2QpO1xuICAgIHRoaXMubWZhVXNlQmFja3VwQ29kZS5zZXQoZmFsc2UpO1xuICAgIHRoaXMuX21mYVZlcmlmeUZvcm1TdGF0ZS5zZXQoQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQpO1xuICAgIHRoaXMuaXNNRkFWZXJpZnlNb2RhbE9wZW4gPSB0cnVlO1xuXG4gICAgdGhpcy5vbk1GQVJlcXVpcmVkLmVtaXQoeyBtZXRob2QgfSk7XG4gIH1cblxuICBjbG9zZU1GQVZlcmlmeU1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMuaXNNRkFWZXJpZnlNb2RhbE9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIC8qKiBBOiBhbHRlcm5hIGVudHJlIGVsIGPDs2RpZ28gVE9UUCAoNiBkw61nKSB5IHVuIGPDs2RpZ28gZGUgcmVzcGFsZG8gKDggY2hhcnMpLiAqL1xuICB0b2dnbGVNRkFCYWNrdXBDb2RlKCk6IHZvaWQge1xuICAgIHRoaXMubWZhVXNlQmFja3VwQ29kZS51cGRhdGUodiA9PiAhdik7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTUZBIFJFU0VUIEhBTkRMRVJTIOKAlCBCOiByZWNvdmVyeSBwb3IgZW1haWxcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgb3Blbk1GQVJlc2V0TW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5fbWZhUmVzZXRTdGVwLnNldCgncmVxdWVzdCcpO1xuICAgIHRoaXMuX21mYVJlc2V0Rm9ybVN0YXRlLnNldChDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCk7XG4gICAgdGhpcy5pc01GQVJlc2V0TW9kYWxPcGVuID0gdHJ1ZTtcbiAgfVxuXG4gIGNsb3NlTUZBUmVzZXRNb2RhbCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzTUZBUmVzZXRNb2RhbE9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLl9tZmFSZXNldFN0ZXAuc2V0KCdyZXF1ZXN0Jyk7XG4gIH1cblxuICBtZmFSZXNldFJlcXVlc3RIYW5kbGVyKGV2ZW50OiBGb3JtU3VibWl0KTogdm9pZCB7XG4gICAgY29uc3QgZW1haWwgPSBldmVudC5maWVsZHNbJ2VtYWlsJ107XG4gICAgaWYgKCFlbWFpbCkge1xuICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy50KCdlbnRlckVtYWlsJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX21mYVJlc2V0Rm9ybVN0YXRlLnNldChDb21wb25lbnRTdGF0ZXMuV09SS0lORyk7XG4gICAgdGhpcy5fbWZhUmVzZXRFbWFpbC5zZXQoZW1haWwpO1xuXG4gICAgdGhpcy5hdXRoU2VydmljZS5yZXF1ZXN0TUZBUmVzZXQoeyBlbWFpbCB9KS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICB0aGlzLl9tZmFSZXNldEZvcm1TdGF0ZS5zZXQoQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQpO1xuICAgICAgICB0aGlzLl9tZmFSZXNldFN0ZXAuc2V0KCdjb25maXJtJyk7XG4gICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMudCgnbWZhUmVzZXRDb2RlU2VudCcpKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogZXJyID0+IHtcbiAgICAgICAgdGhpcy5fbWZhUmVzZXRGb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5FTkFCTEVEKTtcbiAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnIsICdtZmEnKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBtZmFSZXNldENvbmZpcm1IYW5kbGVyKGV2ZW50OiBGb3JtU3VibWl0KTogdm9pZCB7XG4gICAgY29uc3QgY29kZSA9IGV2ZW50LmZpZWxkc1snY29kZSddO1xuXG4gICAgdGhpcy5fbWZhUmVzZXRGb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5XT1JLSU5HKTtcblxuICAgIHRoaXMuYXV0aFNlcnZpY2UuY29uZmlybU1GQVJlc2V0KHsgZW1haWw6IHRoaXMuX21mYVJlc2V0RW1haWwoKSwgY29kZSB9KS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICB0aGlzLl9tZmFSZXNldEZvcm1TdGF0ZS5zZXQoQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQpO1xuICAgICAgICAvLyBNRkEgZGVzaGFiaWxpdGFkbyDihpIgY2VycmFtb3MgYW1ib3MgbW9kYWxlczsgZWwgdXNlciByZWluaWNpYSBlbCBsb2dpblxuICAgICAgICAvLyAoYWhvcmEgc2luIDLCuiBmYWN0b3IpIHkgcmUtZW5yb2xhIFRPVFAgZGVzZGUgYWp1c3Rlcy5cbiAgICAgICAgdGhpcy5jbG9zZU1GQVJlc2V0TW9kYWwoKTtcbiAgICAgICAgdGhpcy5jbG9zZU1GQVZlcmlmeU1vZGFsKCk7XG4gICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMudCgnbWZhUmVzZXREb25lJykpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiBlcnIgPT4ge1xuICAgICAgICB0aGlzLl9tZmFSZXNldEZvcm1TdGF0ZS5zZXQoQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQpO1xuICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGVyciwgJ21mYScpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHZlcmlmeU1GQUhhbmRsZXIoZXZlbnQ6IEZvcm1TdWJtaXQpOiB2b2lkIHtcbiAgICBjb25zdCBjb2RlID0gZXZlbnQuZmllbGRzWydjb2RlJ107XG5cbiAgICB0aGlzLl9tZmFWZXJpZnlGb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5XT1JLSU5HKTtcblxuICAgIHRoaXMuYXV0aFNlcnZpY2UudmVyaWZ5TUZBKGNvZGUpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMuX21mYVZlcmlmeUZvcm1TdGF0ZS5zZXQoQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQpO1xuICAgICAgICAvLyBEaWZlcmltb3MgaGFuZGxlTG9naW5TdWNjZXNzIGhhc3RhIHF1ZSBpb24tbW9kYWwgY29tcGxldGUgc3VcbiAgICAgICAgLy8gYW5pbWFjacOzbiBkZSBjaWVycmUgKGRpZERpc21pc3MpLiBTaW4gZXN0bywgYHJvdXRlci5uYXZpZ2F0ZWAgZGVsXG4gICAgICAgIC8vIHBhZHJlIGRlc3RydXllIGFsIGhvc3QgZGVsIG1vZGFsIGFudGVzIGRlIHF1ZSBJb25pYyBwcm9jZXNlIGVsXG4gICAgICAgIC8vIGRpc21pc3MsIHkgZWwgbW9kYWwgcXVlZGEgdmlzaWJsZSBlbmNpbWEgZGUgbGEgcMOhZ2luYSBkZXN0aW5vXG4gICAgICAgIC8vIChpT1MgUFdBKS5cbiAgICAgICAgdGhpcy5fbWZhU3VjY2Vzc1BlbmRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmNsb3NlTUZBVmVyaWZ5TW9kYWwoKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogZXJyID0+IHtcbiAgICAgICAgdGhpcy5fbWZhVmVyaWZ5Rm9ybVN0YXRlLnNldChDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCk7XG4gICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyLCAnbWZhJyk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgb25NRkFWZXJpZnlEaXNtaXNzZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX21mYVN1Y2Nlc3NQZW5kaW5nKSB7XG4gICAgICB0aGlzLl9tZmFTdWNjZXNzUGVuZGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5oYW5kbGVMb2dpblN1Y2Nlc3ModW5kZWZpbmVkLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRk9SR09UIFBBU1NXT1JEIEhBTkRMRVJTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIG9wZW5Gb3Jnb3RQYXNzd29yZE1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMuaXNGb3Jnb3RQYXNzd29yZE1vZGFsT3BlbiA9IHRydWU7XG4gIH1cblxuICBjbG9zZUZvcmdvdFBhc3N3b3JkTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5pc0ZvcmdvdFBhc3N3b3JkTW9kYWxPcGVuID0gZmFsc2U7XG4gIH1cblxuICBmb3Jnb3RQYXNzd29yZEhhbmRsZXIoZXZlbnQ6IEZvcm1TdWJtaXQpOiB2b2lkIHtcbiAgICBjb25zdCBlbWFpbCA9IGV2ZW50LmZpZWxkc1snZW1haWwnXTtcblxuICAgIGlmICghZW1haWwpIHtcbiAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMudCgnZW50ZXJFbWFpbCcpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9mb3Jnb3RQYXNzd29yZEZvcm1TdGF0ZS5zZXQoQ29tcG9uZW50U3RhdGVzLldPUktJTkcpO1xuXG4gICAgdGhpcy5hdXRoU2VydmljZS5mb3Jnb3RQYXNzd29yZCh7IGVtYWlsIH0pLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMuX2ZvcmdvdFBhc3N3b3JkRm9ybVN0YXRlLnNldChDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCk7XG4gICAgICAgIHRoaXMuY2xvc2VGb3Jnb3RQYXNzd29yZE1vZGFsKCk7XG4gICAgICAgIHRoaXMub3BlblJlc2V0UGFzc3dvcmRNb2RhbChlbWFpbCk7XG4gICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMudCgnY29kZVNlbnQnKSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgIHRoaXMuX2ZvcmdvdFBhc3N3b3JkRm9ybVN0YXRlLnNldChDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCk7XG4gICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyLCAnZm9yZ290Jyk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJFU0VUIFBBU1NXT1JEIEhBTkRMRVJTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIG9wZW5SZXNldFBhc3N3b3JkTW9kYWwoZW1haWw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucGVuZGluZ1Jlc2V0RW1haWwgPSBlbWFpbDtcbiAgICB0aGlzLl9yZXNldEZvcm1TZWN0aW9uTmFtZS5zZXQoYCR7dGhpcy50KCdyZXNldERlc2NyaXB0aW9uJykucmVwbGFjZSgnLicsICcnKX0gKCR7ZW1haWx9KWApO1xuICAgIHRoaXMuX3Jlc2V0UGFzc3dvcmRGb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5FTkFCTEVEKTtcbiAgICB0aGlzLmlzUmVzZXRQYXNzd29yZE1vZGFsT3BlbiA9IHRydWU7XG4gICAgdGhpcy5zdGFydFJlc2V0UmVzZW5kQ29vbGRvd24oKTtcbiAgfVxuXG4gIGNsb3NlUmVzZXRQYXNzd29yZE1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMuaXNSZXNldFBhc3N3b3JkTW9kYWxPcGVuID0gZmFsc2U7XG4gICAgdGhpcy5wZW5kaW5nUmVzZXRFbWFpbCA9ICcnO1xuICAgIHRoaXMuX3Jlc2V0Rm9ybVNlY3Rpb25OYW1lLnNldCgnJyk7XG4gICAgdGhpcy5zdG9wUmVzZXRSZXNlbmRDb29sZG93bigpO1xuICB9XG5cbiAgcmVzZXRQYXNzd29yZEhhbmRsZXIoZXZlbnQ6IEZvcm1TdWJtaXQpOiB2b2lkIHtcbiAgICBjb25zdCBjb2RlID0gZXZlbnQuZmllbGRzWydjb2RlJ107XG4gICAgY29uc3QgbmV3UGFzc3dvcmQgPSBldmVudC5maWVsZHNbJ25ld1Bhc3N3b3JkJ107XG5cbiAgICB0aGlzLl9yZXNldFBhc3N3b3JkRm9ybVN0YXRlLnNldChDb21wb25lbnRTdGF0ZXMuV09SS0lORyk7XG5cbiAgICB0aGlzLmF1dGhTZXJ2aWNlXG4gICAgICAucmVzZXRQYXNzd29yZCh7XG4gICAgICAgIGVtYWlsOiB0aGlzLnBlbmRpbmdSZXNldEVtYWlsLFxuICAgICAgICBjb2RlLFxuICAgICAgICBuZXdQYXNzd29yZCxcbiAgICAgIH0pXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX3Jlc2V0UGFzc3dvcmRGb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5FTkFCTEVEKTtcbiAgICAgICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ3Bhc3N3b3JkVXBkYXRlZCcpKTtcbiAgICAgICAgICB0aGlzLmNsb3NlUmVzZXRQYXNzd29yZE1vZGFsKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBlcnIgPT4ge1xuICAgICAgICAgIHRoaXMuX3Jlc2V0UGFzc3dvcmRGb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5FTkFCTEVEKTtcbiAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGVyciwgJ3Jlc2V0Jyk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgfVxuXG4gIHJlc2VuZFJlc2V0Q29kZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZXNldFJlc2VuZENvb2xkb3duID4gMCkgcmV0dXJuO1xuXG4gICAgdGhpcy5hdXRoU2VydmljZVxuICAgICAgLnJlc2VuZENvZGUoe1xuICAgICAgICBlbWFpbDogdGhpcy5wZW5kaW5nUmVzZXRFbWFpbCxcbiAgICAgICAgdHlwZTogJ1BBU1NXT1JEX1JFU0VUJyxcbiAgICAgIH0pXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMudCgnY29kZVNlbnQnKSk7XG4gICAgICAgICAgdGhpcy5zdGFydFJlc2V0UmVzZW5kQ29vbGRvd24oKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnIsICdyZXNldCcpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSEVMUEVSU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcml2YXRlIGhhbmRsZUxvZ2luU3VjY2VzcyhvYXV0aFByb3ZpZGVyPzogJ2dvb2dsZScgfCAnYXBwbGUnIHwgJ21pY3Jvc29mdCcgfCAnZmFjZWJvb2snLCBtZmFDb21wbGV0ZWQ/OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zaG93VG9hc3QodGhpcy50KCd3ZWxjb21lJykpO1xuXG4gICAgdGhpcy5vblN1Y2Nlc3MuZW1pdCh7XG4gICAgICB1c2VyOiB0aGlzLmF1dGhTZXJ2aWNlLnVzZXIoKSxcbiAgICAgIG1mYUNvbXBsZXRlZCxcbiAgICAgIG9hdXRoUHJvdmlkZXIsXG4gICAgfSk7XG5cbiAgICBjb25zdCBxdWVyeVJlZGlyZWN0ID0gdGhpcy5yZXNvbHZlUXVlcnlSZWRpcmVjdCgpO1xuICAgIGlmIChxdWVyeVJlZGlyZWN0KSB7XG4gICAgICB2b2lkIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwocXVlcnlSZWRpcmVjdCwgeyByZXBsYWNlVXJsOiB0cnVlIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByb3BzLnJlZGlyZWN0T25TdWNjZXNzKSB7XG4gICAgICB2b2lkIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLnByb3BzLnJlZGlyZWN0T25TdWNjZXNzXSwgeyByZXBsYWNlVXJsOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVF1ZXJ5UmVkaXJlY3QoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBxdWVyeVBhcmFtID0gdGhpcy5wcm9wcy5yZWRpcmVjdE9uU3VjY2Vzc1F1ZXJ5UGFyYW07XG4gICAgaWYgKCFxdWVyeVBhcmFtKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbU1hcC5nZXQocXVlcnlQYXJhbSk7XG4gICAgaWYgKCF0YXJnZXQgfHwgIXRhcmdldC5zdGFydHNXaXRoKCcvJykgfHwgdGFyZ2V0LnN0YXJ0c1dpdGgoJy8vJykpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbG9naW5Sb3V0ZSA9IHRoaXMucHJvcHMubG9naW5Sb3V0ZSA/PyAnL2xvZ2luJztcbiAgICBpZiAodGFyZ2V0ID09PSBsb2dpblJvdXRlIHx8IHRhcmdldC5zdGFydHNXaXRoKGAke2xvZ2luUm91dGV9P2ApIHx8IHRhcmdldC5zdGFydHNXaXRoKGAke2xvZ2luUm91dGV9L2ApKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUVycm9yKGVycjogdW5rbm93biwgb3BlcmF0aW9uOiBMb2dpbkVycm9yRXZlbnRbJ29wZXJhdGlvbiddKTogdm9pZCB7XG4gICAgY29uc3QgbWVzc2FnZSA9IHRoaXMuZ2V0RXJyb3JNZXNzYWdlKGVycik7XG4gICAgdGhpcy5zaG93VG9hc3QobWVzc2FnZSk7XG5cbiAgICB0aGlzLm9uRXJyb3IuZW1pdCh7XG4gICAgICBjb2RlOiAoZXJyIGFzIHsgY29kZT86IHN0cmluZyB9KT8uY29kZSxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBvcGVyYXRpb24sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNob3dUb2FzdChtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93KHtcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBkdXJhdGlvbjogMzUwMCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RXJyb3JNZXNzYWdlKGVycjogdW5rbm93bik6IHN0cmluZyB7XG4gICAgY29uc3QgZXJyb3IgPSBlcnIgYXMge1xuICAgICAgZXJyb3I/OiB7IG1lc3NhZ2U/OiBzdHJpbmc7IGNvZGU/OiBzdHJpbmcgfTtcbiAgICAgIGNvZGU/OiBzdHJpbmc7XG4gICAgfTtcblxuICAgIC8vIE1hcCBlcnJvciBjb2RlcyB0byBpMThuIGtleXNcbiAgICBjb25zdCBlcnJvcktleU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIC8vIFNpZ25pblxuICAgICAgQVVUSFYyX0lOVkFMSURfQ1JFREVOVElBTFM6ICdlcnJvckludmFsaWRDcmVkZW50aWFscycsXG4gICAgICBBVVRIVjJfRU1BSUxfTk9UX1ZFUklGSUVEOiAnZXJyb3JFbWFpbE5vdFZlcmlmaWVkJyxcbiAgICAgIEFVVEhWMl9BQ0NPVU5UX1NVU1BFTkRFRDogJ2Vycm9yQWNjb3VudFN1c3BlbmRlZCcsXG5cbiAgICAgIC8vIFNpZ251cFxuICAgICAgQVVUSFYyX0VNQUlMX0VYSVNUUzogJ2Vycm9yRW1haWxFeGlzdHMnLFxuICAgICAgQVVUSFYyX1dFQUtfUEFTU1dPUkQ6ICdlcnJvcldlYWtQYXNzd29yZCcsXG5cbiAgICAgIC8vIFZlcmlmaWNhdGlvbiBjb2Rlc1xuICAgICAgQVVUSFYyX0lOVkFMSURfQ09ERTogJ2Vycm9ySW52YWxpZENvZGUnLFxuICAgICAgQVVUSFYyX0VYUElSRURfQ09ERTogJ2Vycm9yRXhwaXJlZENvZGUnLFxuICAgICAgQVVUSFYyX0NPREVfRVhQSVJFRDogJ2Vycm9yRXhwaXJlZENvZGUnLFxuICAgICAgQVVUSFYyX1RPT19NQU5ZX0FUVEVNUFRTOiAnZXJyb3JUb29NYW55QXR0ZW1wdHMnLFxuXG4gICAgICAvLyBNRkFcbiAgICAgIEFVVEhWMl9NRkFfSU5WQUxJRF9DT0RFOiAnZXJyb3JNRkFJbnZhbGlkQ29kZScsXG5cbiAgICAgIC8vIE9BdXRoXG4gICAgICBQT1BVUF9CTE9DS0VEOiAnZXJyb3JQb3B1cEJsb2NrZWQnLFxuICAgICAgT0FVVEhfRkFJTEVEOiAnZXJyb3JPQXV0aEZhaWxlZCcsXG4gICAgfTtcblxuICAgIGNvbnN0IGVycm9yQ29kZSA9IGVycm9yPy5lcnJvcj8uY29kZSB8fCBlcnJvcj8uY29kZTtcbiAgICBpZiAoZXJyb3JDb2RlICYmIGVycm9yS2V5TWFwW2Vycm9yQ29kZV0pIHtcbiAgICAgIHJldHVybiB0aGlzLnQoZXJyb3JLZXlNYXBbZXJyb3JDb2RlXSk7XG4gICAgfVxuXG4gICAgaWYgKGVycm9yPy5lcnJvcj8ubWVzc2FnZSkge1xuICAgICAgcmV0dXJuIGVycm9yLmVycm9yLm1lc3NhZ2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudCgnZXJyb3JHZW5lcmljJyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ09PTERPV04gVElNRVJTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgc3RhcnRSZXNlbmRDb29sZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2VuZENvb2xkb3duID0gMzA7XG4gICAgdGhpcy5yZXNlbmRUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRoaXMucmVzZW5kQ29vbGRvd24tLTtcbiAgICAgIGlmICh0aGlzLnJlc2VuZENvb2xkb3duIDw9IDApIHtcbiAgICAgICAgdGhpcy5zdG9wUmVzZW5kQ29vbGRvd24oKTtcbiAgICAgIH1cbiAgICB9LCAxMDAwKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcFJlc2VuZENvb2xkb3duKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlc2VuZFRpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMucmVzZW5kVGltZXIpO1xuICAgICAgdGhpcy5yZXNlbmRUaW1lciA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMucmVzZW5kQ29vbGRvd24gPSAwO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydFJlc2V0UmVzZW5kQ29vbGRvd24oKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldFJlc2VuZENvb2xkb3duID0gMzA7XG4gICAgdGhpcy5yZXNldFJlc2VuZFRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5yZXNldFJlc2VuZENvb2xkb3duLS07XG4gICAgICBpZiAodGhpcy5yZXNldFJlc2VuZENvb2xkb3duIDw9IDApIHtcbiAgICAgICAgdGhpcy5zdG9wUmVzZXRSZXNlbmRDb29sZG93bigpO1xuICAgICAgfVxuICAgIH0sIDEwMDApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wUmVzZXRSZXNlbmRDb29sZG93bigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZXNldFJlc2VuZFRpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMucmVzZXRSZXNlbmRUaW1lcik7XG4gICAgICB0aGlzLnJlc2V0UmVzZW5kVGltZXIgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLnJlc2V0UmVzZW5kQ29vbGRvd24gPSAwO1xuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZU9BdXRoTG9hZGluZ1Jlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJPQXV0aExvYWRpbmdSZXNldFRpbWVyKCk7XG4gICAgdGhpcy5vYXV0aExvYWRpbmdSZXNldFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmlzT0F1dGhMb2FkaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLm9hdXRoTG9hZGluZ1Jlc2V0VGltZXIgPSBudWxsO1xuICAgIH0sIDQ1XzAwMCk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyT0F1dGhMb2FkaW5nUmVzZXRUaW1lcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMub2F1dGhMb2FkaW5nUmVzZXRUaW1lcikgcmV0dXJuO1xuXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMub2F1dGhMb2FkaW5nUmVzZXRUaW1lcik7XG4gICAgdGhpcy5vYXV0aExvYWRpbmdSZXNldFRpbWVyID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgbGlzdGVuRm9yT0F1dGhSZXR1cm4oKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncGFnZXNob3cnLCB0aGlzLnJlc2V0T0F1dGhMb2FkaW5nT25SZXR1cm4pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMucmVzZXRPQXV0aExvYWRpbmdPblJldHVybik7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIHRoaXMucmVzZXRPQXV0aExvYWRpbmdPblJldHVybik7XG4gIH1cblxuICBwcml2YXRlIHN0b3BMaXN0ZW5pbmdGb3JPQXV0aFJldHVybigpOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcblxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdwYWdlc2hvdycsIHRoaXMucmVzZXRPQXV0aExvYWRpbmdPblJldHVybik7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5yZXNldE9BdXRoTG9hZGluZ09uUmV0dXJuKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy5yZXNldE9BdXRoTG9hZGluZ09uUmV0dXJuKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubGlzdGVuRm9yT0F1dGhSZXR1cm4oKTtcblxuICAgIGlmICh0aGlzLnByb3BzLmluaXRpYWxPcGVyYXRpb24gPT09ICdzaWdudXAnKSB7XG4gICAgICB0aGlzLmlzUmVnaXN0ZXJNb2RhbE9wZW4gPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmF1dGhTZXJ2aWNlLm1mYVBlbmRpbmcoKS5yZXF1aXJlZCkge1xuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5vcGVuTUZBVmVyaWZ5TW9kYWwoKSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wUmVzZW5kQ29vbGRvd24oKTtcbiAgICB0aGlzLnN0b3BSZXNldFJlc2VuZENvb2xkb3duKCk7XG4gICAgdGhpcy5jbGVhck9BdXRoTG9hZGluZ1Jlc2V0VGltZXIoKTtcbiAgICB0aGlzLnN0b3BMaXN0ZW5pbmdGb3JPQXV0aFJldHVybigpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwidmFsLWxvZ2luXCIgW2NsYXNzLnZhbC1sb2dpbi0tY2FyZF09XCJjb25maWcuc2hvd0NhcmRcIj5cbiAgPCEtLSBMb2dvIOKAlCBkZWZhdWx0IGRlIG1hcmNhICgtLW1haW4tbG9nbykgc2kgZWwgY29uc3VtZXIgbm8gcGFzYSBsb2dvIC0tPlxuICA8ZGl2IGNsYXNzPVwibG9nby1jb250YWluZXJcIj5cbiAgICA8dmFsLWltYWdlIFtwcm9wc109XCJyZXNvbHZlZExvZ29cIiAvPlxuICA8L2Rpdj5cblxuICA8IS0tIExvZ2luIEZvcm0gLS0+XG4gIDx2YWwtZm9ybSBbcHJvcHNdPVwibG9naW5Gb3JtUHJvcHMoKVwiIChvblN1Ym1pdCk9XCJsb2dpbkhhbmRsZXIoJGV2ZW50KVwiIC8+XG5cbiAgPCEtLSBPQXV0aCBTZWN0aW9uIC0tPlxuICBAaWYgKGNvbmZpZy5zaG93T0F1dGggJiYgY29uZmlnLm9hdXRoUHJvdmlkZXJzLmxlbmd0aCA+IDApIHtcbiAgPGRpdiBjbGFzcz1cIm9hdXRoLXNlcGFyYXRvclwiPlxuICAgIDxzcGFuPnt7IHQoJ29yQ29udGludWVXaXRoJykgfX08L3NwYW4+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJvYXV0aC1idXR0b25zXCI+XG4gICAgQGZvciAocHJvdmlkZXIgb2YgY29uZmlnLm9hdXRoUHJvdmlkZXJzOyB0cmFjayBwcm92aWRlcikge1xuICAgIDx2YWwtYnV0dG9uXG4gICAgICBbcHJvcHNdPVwib2F1dGhCdXR0b25Qcm9wcyhwcm92aWRlcilcIlxuICAgICAgKG9uQ2xpY2spPVwibG9naW5XaXRoT0F1dGgocHJvdmlkZXIpXCJcbiAgICAvPlxuICAgIH1cbiAgPC9kaXY+XG4gIH1cblxuICA8IS0tIFJlZ2lzdGVyIExpbmsgLS0+XG4gIEBpZiAoY29uZmlnLnNob3dSZWdpc3Rlcikge1xuICA8ZGl2IGNsYXNzPVwiYXV0aC1saW5rXCI+XG4gICAgPGlvbi10ZXh0IGNvbG9yPVwiZGFya1wiPlxuICAgICAge3sgdCgnbm9BY2NvdW50JykgfX1cbiAgICAgIDxhIChjbGljayk9XCJvcGVuUmVnaXN0ZXJNb2RhbCgpXCI+e3sgdCgncmVnaXN0ZXInKSB9fTwvYT5cbiAgICA8L2lvbi10ZXh0PlxuICA8L2Rpdj5cbiAgfVxuXG4gIDwhLS0gRm9yZ290IFBhc3N3b3JkIExpbmsgLS0+XG4gIEBpZiAoY29uZmlnLnNob3dGb3Jnb3RQYXNzd29yZCkge1xuICA8ZGl2IGNsYXNzPVwiYXV0aC1saW5rIGZvcmdvdC1wYXNzd29yZFwiPlxuICAgIDxpb24tdGV4dCBjb2xvcj1cImRhcmtcIj5cbiAgICAgIHt7IHQoJ2ZvcmdvdExpbmsnKSB9fVxuICAgICAgPGEgKGNsaWNrKT1cIm9wZW5Gb3Jnb3RQYXNzd29yZE1vZGFsKClcIj57eyB0KCdyZWNvdmVyUGFzc3dvcmQnKSB9fTwvYT5cbiAgICA8L2lvbi10ZXh0PlxuICA8L2Rpdj5cbiAgfVxuXG4gIDwhLS0gTGVnYWwgTm90aWNlIC0tPlxuICBAaWYgKHByb3BzLmxlZ2FsKSB7XG4gIDxkaXYgY2xhc3M9XCJsZWdhbC1ub3RpY2VcIj5cbiAgICA8aW9uLXRleHQgY29sb3I9XCJkYXJrXCI+XG4gICAgICA8cD5cbiAgICAgICAge3sgdCgnbGVnYWxQcmVmaXgnKSB9fSBAaWYgKHJlc29sdmVkQ29tcGFueUxpbmspIHtcbiAgICAgICAgPGEgW2hyZWZdPVwicmVzb2x2ZWRDb21wYW55TGlua1wiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxuICAgICAgICAgID48c3Ryb25nPnt7IHByb3BzLmxlZ2FsLmNvbXBhbnlOYW1lIH19PC9zdHJvbmc+PC9hXG4gICAgICAgID5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxzdHJvbmc+e3sgcHJvcHMubGVnYWwuY29tcGFueU5hbWUgfX08L3N0cm9uZz5cbiAgICAgICAgfSB7eyB0KCdsZWdhbFN1ZmZpeCcpIH19IEBpZiAocHJvcHMubGVnYWwudGVybXNMaW5rKSB7XG4gICAgICAgIDxhIFtocmVmXT1cInByb3BzLmxlZ2FsLnRlcm1zTGlua1wiPnt7IHQoJ3Rlcm1zQW5kQ29uZGl0aW9ucycpIH19PC9hPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgPHNwYW4+e3sgdCgndGVybXNBbmRDb25kaXRpb25zJykgfX08L3NwYW4+XG4gICAgICAgIH0ge3sgdCgnYW5kJykgfX0gQGlmIChwcm9wcy5sZWdhbC5wcml2YWN5TGluaykge1xuICAgICAgICA8YSBbaHJlZl09XCJwcm9wcy5sZWdhbC5wcml2YWN5TGlua1wiPnt7IHQoJ3ByaXZhY3lQb2xpY3knKSB9fTwvYT5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxzcGFuPnt7IHQoJ3ByaXZhY3lQb2xpY3knKSB9fTwvc3Bhbj5cbiAgICAgICAgfS5cbiAgICAgIDwvcD5cbiAgICA8L2lvbi10ZXh0PlxuICA8L2Rpdj5cbiAgfVxuPC9kaXY+XG5cbjwhLS0gUmVnaXN0ZXIgTW9kYWwgLS0+XG48aW9uLW1vZGFsIFtpc09wZW5dPVwiaXNSZWdpc3Rlck1vZGFsT3BlblwiIChkaWREaXNtaXNzKT1cImNsb3NlUmVnaXN0ZXJNb2RhbCgpXCI+XG4gIDxuZy10ZW1wbGF0ZT5cbiAgICA8aW9uLWhlYWRlcj5cbiAgICAgIDxpb24tdG9vbGJhcj5cbiAgICAgICAgPGlvbi1idXR0b25zIHNsb3Q9XCJlbmRcIj5cbiAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBjb2xvcj1cImRhcmtcIiAoY2xpY2spPVwiY2xvc2VSZWdpc3Rlck1vZGFsKClcIj5cbiAgICAgICAgICAgIDxzdHJvbmc+e3sgdCgnY2xvc2UnKSB9fTwvc3Ryb25nPlxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9pb24tYnV0dG9ucz5cbiAgICAgIDwvaW9uLXRvb2xiYXI+XG4gICAgPC9pb24taGVhZGVyPlxuICAgIDxpb24tY29udGVudCBjbGFzcz1cImlvbi1wYWRkaW5nXCI+XG4gICAgICA8c2VjdGlvbiBjbGFzcz1cIm1vZGFsLWZvcm0tc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9nby1jb250YWluZXJcIj5cbiAgICAgICAgICA8dmFsLWltYWdlIFtwcm9wc109XCJyZXNvbHZlZExvZ29cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHZhbC1mb3JtIFtwcm9wc109XCJyZWdpc3RlckZvcm1Qcm9wcygpXCIgKG9uU3VibWl0KT1cInJlZ2lzdGVySGFuZGxlcigkZXZlbnQpXCIgLz5cbiAgICAgICAgPGRpdiBjbGFzcz1cImF1dGgtbGlua1wiPlxuICAgICAgICAgIDxpb24tdGV4dCBjb2xvcj1cImRhcmtcIj5cbiAgICAgICAgICAgIHt7IHQoJ2hhc0FjY291bnQnKSB9fVxuICAgICAgICAgICAgPGEgKGNsaWNrKT1cIm9uUmVnaXN0ZXJTd2l0Y2hUb0xvZ2luKClcIj57eyB0KCdzaWduSW4nKSB9fTwvYT5cbiAgICAgICAgICA8L2lvbi10ZXh0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvc2VjdGlvbj5cbiAgICA8L2lvbi1jb250ZW50PlxuICA8L25nLXRlbXBsYXRlPlxuPC9pb24tbW9kYWw+XG5cbjwhLS0gVmVyaWZ5IEVtYWlsIE1vZGFsIC0tPlxuPGlvbi1tb2RhbCBbaXNPcGVuXT1cImlzVmVyaWZ5TW9kYWxPcGVuXCIgW2JhY2tkcm9wRGlzbWlzc109XCJmYWxzZVwiPlxuICA8bmctdGVtcGxhdGU+XG4gICAgPGlvbi1oZWFkZXI+XG4gICAgICA8aW9uLXRvb2xiYXI+XG4gICAgICAgIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCI+XG4gICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgKGNsaWNrKT1cImNsb3NlVmVyaWZ5TW9kYWwoKVwiPlxuICAgICAgICAgICAgPHN0cm9uZz57eyB0KCdjbG9zZScpIH19PC9zdHJvbmc+XG4gICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8L2lvbi1idXR0b25zPlxuICAgICAgPC9pb24tdG9vbGJhcj5cbiAgICA8L2lvbi1oZWFkZXI+XG4gICAgPGlvbi1jb250ZW50IGNsYXNzPVwiaW9uLXBhZGRpbmdcIj5cbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwibW9kYWwtZm9ybS1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2dvLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDx2YWwtaW1hZ2UgW3Byb3BzXT1cInJlc29sdmVkTG9nb1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8dmFsLWZvcm0gW3Byb3BzXT1cInZlcmlmeUZvcm1Qcm9wcygpXCIgKG9uU3VibWl0KT1cInZlcmlmeUhhbmRsZXIoJGV2ZW50KVwiIC8+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXNlbmQtbGlua1wiPlxuICAgICAgICAgIDxpb24tdGV4dCBjb2xvcj1cImRhcmtcIj5cbiAgICAgICAgICAgIHt7IHQoJ25vQ29kZVJlY2VpdmVkJykgfX0gQGlmIChyZXNlbmRDb29sZG93biA+IDApIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29vbGRvd25cIj57eyB0KCdyZXNlbmRJbicsIHsgc2Vjb25kczogcmVzZW5kQ29vbGRvd24udG9TdHJpbmcoKSB9KSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPGEgKGNsaWNrKT1cInJlc2VuZENvZGUoKVwiPnt7IHQoJ3Jlc2VuZCcpIH19PC9hPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zZWN0aW9uPlxuICAgIDwvaW9uLWNvbnRlbnQ+XG4gIDwvbmctdGVtcGxhdGU+XG48L2lvbi1tb2RhbD5cblxuPCEtLSBGb3Jnb3QgUGFzc3dvcmQgTW9kYWwgLS0+XG48aW9uLW1vZGFsIFtpc09wZW5dPVwiaXNGb3Jnb3RQYXNzd29yZE1vZGFsT3BlblwiIChkaWREaXNtaXNzKT1cImNsb3NlRm9yZ290UGFzc3dvcmRNb2RhbCgpXCI+XG4gIDxuZy10ZW1wbGF0ZT5cbiAgICA8aW9uLWhlYWRlcj5cbiAgICAgIDxpb24tdG9vbGJhcj5cbiAgICAgICAgPGlvbi1idXR0b25zIHNsb3Q9XCJlbmRcIj5cbiAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBjb2xvcj1cImRhcmtcIiAoY2xpY2spPVwiY2xvc2VGb3Jnb3RQYXNzd29yZE1vZGFsKClcIj5cbiAgICAgICAgICAgIDxzdHJvbmc+e3sgdCgnY2xvc2UnKSB9fTwvc3Ryb25nPlxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9pb24tYnV0dG9ucz5cbiAgICAgIDwvaW9uLXRvb2xiYXI+XG4gICAgPC9pb24taGVhZGVyPlxuICAgIDxpb24tY29udGVudCBjbGFzcz1cImlvbi1wYWRkaW5nXCI+XG4gICAgICA8c2VjdGlvbiBjbGFzcz1cIm1vZGFsLWZvcm0tc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9nby1jb250YWluZXJcIj5cbiAgICAgICAgICA8dmFsLWltYWdlIFtwcm9wc109XCJyZXNvbHZlZExvZ29cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHZhbC1mb3JtIFtwcm9wc109XCJmb3Jnb3RQYXNzd29yZEZvcm1Qcm9wcygpXCIgKG9uU3VibWl0KT1cImZvcmdvdFBhc3N3b3JkSGFuZGxlcigkZXZlbnQpXCIgLz5cbiAgICAgIDwvc2VjdGlvbj5cbiAgICA8L2lvbi1jb250ZW50PlxuICA8L25nLXRlbXBsYXRlPlxuPC9pb24tbW9kYWw+XG5cbjwhLS0gUmVzZXQgUGFzc3dvcmQgTW9kYWwgLS0+XG48aW9uLW1vZGFsIFtpc09wZW5dPVwiaXNSZXNldFBhc3N3b3JkTW9kYWxPcGVuXCIgW2JhY2tkcm9wRGlzbWlzc109XCJmYWxzZVwiPlxuICA8bmctdGVtcGxhdGU+XG4gICAgPGlvbi1oZWFkZXI+XG4gICAgICA8aW9uLXRvb2xiYXI+XG4gICAgICAgIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCI+XG4gICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgKGNsaWNrKT1cImNsb3NlUmVzZXRQYXNzd29yZE1vZGFsKClcIj5cbiAgICAgICAgICAgIDxzdHJvbmc+e3sgdCgnY2xvc2UnKSB9fTwvc3Ryb25nPlxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9pb24tYnV0dG9ucz5cbiAgICAgIDwvaW9uLXRvb2xiYXI+XG4gICAgPC9pb24taGVhZGVyPlxuICAgIDxpb24tY29udGVudCBjbGFzcz1cImlvbi1wYWRkaW5nXCI+XG4gICAgICA8c2VjdGlvbiBjbGFzcz1cIm1vZGFsLWZvcm0tc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9nby1jb250YWluZXJcIj5cbiAgICAgICAgICA8dmFsLWltYWdlIFtwcm9wc109XCJyZXNvbHZlZExvZ29cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHZhbC1mb3JtIFtwcm9wc109XCJyZXNldFBhc3N3b3JkRm9ybVByb3BzKClcIiAob25TdWJtaXQpPVwicmVzZXRQYXNzd29yZEhhbmRsZXIoJGV2ZW50KVwiIC8+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXNlbmQtbGlua1wiPlxuICAgICAgICAgIDxpb24tdGV4dCBjb2xvcj1cImRhcmtcIj5cbiAgICAgICAgICAgIHt7IHQoJ25vQ29kZVJlY2VpdmVkJykgfX0gQGlmIChyZXNldFJlc2VuZENvb2xkb3duID4gMCkge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb29sZG93blwiPnt7IHQoJ3Jlc2VuZEluJywgeyBzZWNvbmRzOiByZXNldFJlc2VuZENvb2xkb3duLnRvU3RyaW5nKCkgfSkgfX08L3NwYW4+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxhIChjbGljayk9XCJyZXNlbmRSZXNldENvZGUoKVwiPnt7IHQoJ3Jlc2VuZCcpIH19PC9hPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zZWN0aW9uPlxuICAgIDwvaW9uLWNvbnRlbnQ+XG4gIDwvbmctdGVtcGxhdGU+XG48L2lvbi1tb2RhbD5cblxuPCEtLSBNRkEgVmVyaWZ5IE1vZGFsIC0tPlxuPGlvbi1tb2RhbCBbaXNPcGVuXT1cImlzTUZBVmVyaWZ5TW9kYWxPcGVuXCIgW2JhY2tkcm9wRGlzbWlzc109XCJmYWxzZVwiIChkaWREaXNtaXNzKT1cIm9uTUZBVmVyaWZ5RGlzbWlzc2VkKClcIj5cbiAgPG5nLXRlbXBsYXRlPlxuICAgIDxpb24taGVhZGVyPlxuICAgICAgPGlvbi10b29sYmFyPlxuICAgICAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiPlxuICAgICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwiZGFya1wiIChjbGljayk9XCJjbG9zZU1GQVZlcmlmeU1vZGFsKClcIj5cbiAgICAgICAgICAgIDxzdHJvbmc+e3sgdCgnY2xvc2UnKSB9fTwvc3Ryb25nPlxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9pb24tYnV0dG9ucz5cbiAgICAgIDwvaW9uLXRvb2xiYXI+XG4gICAgPC9pb24taGVhZGVyPlxuICAgIDxpb24tY29udGVudCBjbGFzcz1cImlvbi1wYWRkaW5nXCI+XG4gICAgICA8c2VjdGlvbiBjbGFzcz1cIm1vZGFsLWZvcm0tc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9nby1jb250YWluZXJcIj5cbiAgICAgICAgICA8dmFsLWltYWdlIFtwcm9wc109XCJyZXNvbHZlZExvZ29cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHZhbC1mb3JtIFtwcm9wc109XCJtZmFWZXJpZnlGb3JtUHJvcHMoKVwiIChvblN1Ym1pdCk9XCJ2ZXJpZnlNRkFIYW5kbGVyKCRldmVudClcIiAvPlxuICAgICAgICBAaWYgKG1mYU1ldGhvZCgpID09PSAnVE9UUCcpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInJlc2VuZC1saW5rXCI+XG4gICAgICAgICAgPGlvbi10ZXh0IGNvbG9yPVwiZGFya1wiPlxuICAgICAgICAgICAgQGlmIChtZmFVc2VCYWNrdXBDb2RlKCkpIHtcbiAgICAgICAgICAgIDxhIChjbGljayk9XCJ0b2dnbGVNRkFCYWNrdXBDb2RlKClcIj57eyB0KCdtZmFVc2VUb3RwQWN0aW9uJykgfX08L2E+XG4gICAgICAgICAgICB9IEBlbHNlIHsge3sgdCgnbWZhVXNlQmFja3VwTGluaycpIH19XG4gICAgICAgICAgICA8YSAoY2xpY2spPVwidG9nZ2xlTUZBQmFja3VwQ29kZSgpXCI+e3sgdCgnbWZhVXNlQmFja3VwQWN0aW9uJykgfX08L2E+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9pb24tdGV4dD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlc2VuZC1saW5rXCI+XG4gICAgICAgICAgPGlvbi10ZXh0IGNvbG9yPVwiZGFya1wiPlxuICAgICAgICAgICAge3sgdCgnbWZhTG9zdEJhY2t1cExpbmsnKSB9fVxuICAgICAgICAgICAgPGEgKGNsaWNrKT1cIm9wZW5NRkFSZXNldE1vZGFsKClcIj57eyB0KCdtZmFSZXNldEFjdGlvbicpIH19PC9hPlxuICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zZWN0aW9uPlxuICAgIDwvaW9uLWNvbnRlbnQ+XG4gIDwvbmctdGVtcGxhdGU+XG48L2lvbi1tb2RhbD5cblxuPCEtLSBNRkEgUmVzZXQgTW9kYWwgKEIpIOKAlCByZWNvdmVyeSBwb3IgZW1haWwgY3VhbmRvIG5vIGhheSBiYWNrdXAgY29kZXMgLS0+XG48aW9uLW1vZGFsIFtpc09wZW5dPVwiaXNNRkFSZXNldE1vZGFsT3BlblwiIFtiYWNrZHJvcERpc21pc3NdPVwiZmFsc2VcIiAoZGlkRGlzbWlzcyk9XCJjbG9zZU1GQVJlc2V0TW9kYWwoKVwiPlxuICA8bmctdGVtcGxhdGU+XG4gICAgPGlvbi1oZWFkZXI+XG4gICAgICA8aW9uLXRvb2xiYXI+XG4gICAgICAgIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCI+XG4gICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgKGNsaWNrKT1cImNsb3NlTUZBUmVzZXRNb2RhbCgpXCI+XG4gICAgICAgICAgICA8c3Ryb25nPnt7IHQoJ2Nsb3NlJykgfX08L3N0cm9uZz5cbiAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIDwvaW9uLWJ1dHRvbnM+XG4gICAgICA8L2lvbi10b29sYmFyPlxuICAgIDwvaW9uLWhlYWRlcj5cbiAgICA8aW9uLWNvbnRlbnQgY2xhc3M9XCJpb24tcGFkZGluZ1wiPlxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJtb2RhbC1mb3JtLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxvZ28tY29udGFpbmVyXCI+XG4gICAgICAgICAgPHZhbC1pbWFnZSBbcHJvcHNdPVwicmVzb2x2ZWRMb2dvXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIEBpZiAobWZhUmVzZXRTdGVwKCkgPT09ICdyZXF1ZXN0Jykge1xuICAgICAgICA8dmFsLWZvcm0gW3Byb3BzXT1cIm1mYVJlc2V0UmVxdWVzdEZvcm1Qcm9wcygpXCIgKG9uU3VibWl0KT1cIm1mYVJlc2V0UmVxdWVzdEhhbmRsZXIoJGV2ZW50KVwiIC8+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8dmFsLWZvcm0gW3Byb3BzXT1cIm1mYVJlc2V0Q29uZmlybUZvcm1Qcm9wcygpXCIgKG9uU3VibWl0KT1cIm1mYVJlc2V0Q29uZmlybUhhbmRsZXIoJGV2ZW50KVwiIC8+XG4gICAgICAgIH1cbiAgICAgIDwvc2VjdGlvbj5cbiAgICA8L2lvbi1jb250ZW50PlxuICA8L25nLXRlbXBsYXRlPlxuPC9pb24tbW9kYWw+XG4iXX0=
1141
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9sb2dpbi9sb2dpbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvb3JnYW5pc21zL2xvZ2luL2xvZ2luLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsUUFBUSxFQUNSLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFFTixNQUFNLEVBQ04sWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDekUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBQ1YsU0FBUyxFQUNULE9BQU8sRUFDUCxRQUFRLEVBQ1IsT0FBTyxFQUNQLFVBQVUsR0FDWCxNQUFNLDJCQUEyQixDQUFDO0FBRW5DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDL0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNuRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNB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QUFlOzs0RkFLTixjQUFjO2tCQXBCMUIsU0FBUzsrQkFDRSxXQUFXLGNBQ1QsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osU0FBUzt3QkFDVCxVQUFVO3dCQUNWLFVBQVU7d0JBQ1YsU0FBUzt3QkFDVCxPQUFPO3dCQUNQLFFBQVE7d0JBQ1IsT0FBTzt3QkFDUCxVQUFVO3dCQUNWLGFBQWE7d0JBQ2IsY0FBYzt3QkFDZCxlQUFlO3FCQUNoQjs4QkFRb0MsS0FBSztzQkFBekMsWUFBWTt1QkFBQyxhQUFhO2dCQUVsQixLQUFLO3NCQUFiLEtBQUs7Z0JBRUksU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxPQUFPO3NCQUFoQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBFdmVudEVtaXR0ZXIsXG4gIGluamVjdCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgc2lnbmFsLFxuICBWaWV3Q2hpbGRyZW4sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBhdXRoUGFzc3dvcmRWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvdXRpbHMvdmFsaWRhdG9ycyc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7XG4gIElvbkJ1dHRvbixcbiAgSW9uQnV0dG9ucyxcbiAgSW9uQ29udGVudCxcbiAgSW9uSGVhZGVyLFxuICBJb25JY29uLFxuICBJb25Nb2RhbCxcbiAgSW9uVGV4dCxcbiAgSW9uVG9vbGJhcixcbn0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5cbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXV0aCc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy90b2FzdC5zZXJ2aWNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlLCBJbnB1dEkxOG5IZWxwZXIgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pMThuJztcbmltcG9ydCB7IExlZ2FsTGlua1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9sZWdhbC1saW5rL2xlZ2FsLWxpbmsuc2VydmljZSc7XG5pbXBvcnQgeyBGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vZm9ybS9mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJbWFnZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2F0b21zL2ltYWdlL2ltYWdlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy9idXR0b24vYnV0dG9uLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBCdXR0b25NZXRhZGF0YSxcbiAgRm9ybU1ldGFkYXRhLFxuICBGb3JtU3VibWl0LFxuICBJbnB1dFR5cGUsXG4gIENvbXBvbmVudFN0YXRlcyxcbiAgQ29tcG9uZW50U3RhdGUsXG59IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IGJ1dHRvbiB9IGZyb20gJy4uLy4uL2F0b21zL2J1dHRvbi9mYWN0b3J5JztcbmltcG9ydCB7IEltYWdlTWV0YWRhdGEgfSBmcm9tICcuLi8uLi9hdG9tcy9pbWFnZS90eXBlcyc7XG5pbXBvcnQge1xuICBMb2dpbk1ldGFkYXRhLFxuICBMb2dpblN1Y2Nlc3NFdmVudCxcbiAgTG9naW5FcnJvckV2ZW50LFxuICBNRkFSZXF1aXJlZEV2ZW50LFxuICBMT0dJTl9ERUZBVUxUUyxcbiAgREVGQVVMVF9MT0dJTl9MT0dPLFxufSBmcm9tICcuL3R5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLWxvZ2luJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBJb25CdXR0b24sXG4gICAgSW9uQnV0dG9ucyxcbiAgICBJb25Db250ZW50LFxuICAgIElvbkhlYWRlcixcbiAgICBJb25JY29uLFxuICAgIElvbk1vZGFsLFxuICAgIElvblRleHQsXG4gICAgSW9uVG9vbGJhcixcbiAgICBGb3JtQ29tcG9uZW50LFxuICAgIEltYWdlQ29tcG9uZW50LFxuICAgIEJ1dHRvbkNvbXBvbmVudCxcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2xvZ2luLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbG9naW4uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgTG9naW5Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8vIFRvZG9zIGxvcyBgdmFsLWZvcm1gIHF1ZSBlc3RlIG9yZ2FuaXNtbyBwdWVkYSByZW5kZXJpemFyIChsb2dpbiwgcmVnaXN0cm8sXG4gIC8vIE1GQSwgcmVjdXBlcmFyIGNvbnRyYXNlw7FhLi4uKS4gU2UgcmVzZXRlYW4ganVudG9zIGFsIHJlZW50cmFyIGEgbGEgdmlzdGEg4oCUXG4gIC8vIHZlciBgaW9uVmlld1dpbGxFbnRlcmAgbcOhcyBhYmFqby5cbiAgQFZpZXdDaGlsZHJlbihGb3JtQ29tcG9uZW50KSBwcml2YXRlIGZvcm1zITogUXVlcnlMaXN0PEZvcm1Db21wb25lbnQ+O1xuXG4gIEBJbnB1dCgpIHByb3BzOiBMb2dpbk1ldGFkYXRhID0ge307XG5cbiAgQE91dHB1dCgpIG9uU3VjY2VzcyA9IG5ldyBFdmVudEVtaXR0ZXI8TG9naW5TdWNjZXNzRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBvbkVycm9yID0gbmV3IEV2ZW50RW1pdHRlcjxMb2dpbkVycm9yRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBvbk1GQVJlcXVpcmVkID0gbmV3IEV2ZW50RW1pdHRlcjxNRkFSZXF1aXJlZEV2ZW50PigpO1xuXG4gIC8vIFNlcnZpY2VzXG4gIGF1dGhTZXJ2aWNlID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTtcbiAgcHJpdmF0ZSB0b2FzdFNlcnZpY2UgPSBpbmplY3QoVG9hc3RTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgcHJpdmF0ZSByb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSk7XG4gIHByaXZhdGUgaTE4biA9IGluamVjdChJMThuU2VydmljZSk7XG4gIHByaXZhdGUgaTE4bkhlbHBlciA9IGluamVjdChJbnB1dEkxOG5IZWxwZXIpO1xuICBwcml2YXRlIGxlZ2FsTGluayA9IGluamVjdChMZWdhbExpbmtTZXJ2aWNlKTtcblxuICAvKiogVVJMIGRlbCBzaXRpbyBwcmluY2lwYWwgcmVzdWVsdGEgcG9yIGFtYmllbnRlIOKAlCBmYWxsYmFjayBjdWFuZG8gZWwgY29uc3VtZXIgbm8gcGFzYSBjb21wYW55TGluay4gKi9cbiAgZ2V0IHJlc29sdmVkQ29tcGFueUxpbmsoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5sZWdhbD8uY29tcGFueUxpbmsgPz8gdGhpcy5sZWdhbExpbmsuYmFzZVVybCA/PyB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCBmb3IgdHJhbnNsYXRpbmcgYXV0aC1yZWxhdGVkIHN0cmluZ3MuXG4gICAqIEV4cG9zZWQgdG8gdGVtcGxhdGUgZm9yIGR5bmFtaWMgdGV4dC5cbiAgICovXG4gIHQoa2V5OiBzdHJpbmcsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pMThuLnQoa2V5LCAnX2F1dGgnLCBkYXRhKTtcbiAgfVxuXG4gIC8vIFRpbWVyc1xuICBwcml2YXRlIHJlc2VuZFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZXNldFJlc2VuZFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBvYXV0aExvYWRpbmdSZXNldFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuXG4gIC8vIFN0YXRlXG4gIGlzT0F1dGhMb2FkaW5nID0gZmFsc2U7XG4gIGlzUmVnaXN0ZXJNb2RhbE9wZW4gPSBmYWxzZTtcbiAgaXNWZXJpZnlNb2RhbE9wZW4gPSBmYWxzZTtcbiAgaXNGb3Jnb3RQYXNzd29yZE1vZGFsT3BlbiA9IGZhbHNlO1xuICBpc1Jlc2V0UGFzc3dvcmRNb2RhbE9wZW4gPSBmYWxzZTtcbiAgaXNNRkFWZXJpZnlNb2RhbE9wZW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbWZhU3VjY2Vzc1BlbmRpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSByZXNldE9BdXRoTG9hZGluZ09uUmV0dXJuID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmICghdGhpcy5pc09BdXRoTG9hZGluZykgcmV0dXJuO1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ2hpZGRlbicpIHJldHVybjtcblxuICAgIHRoaXMuY2xlYXJPQXV0aExvYWRpbmdSZXNldFRpbWVyKCk7XG4gICAgdGhpcy5pc09BdXRoTG9hZGluZyA9IGZhbHNlO1xuICB9O1xuXG4gIHBlbmRpbmdWZXJpZmljYXRpb25FbWFpbCA9ICcnO1xuICBwZW5kaW5nUmVzZXRFbWFpbCA9ICcnO1xuICByZXNlbmRDb29sZG93biA9IDA7XG4gIHJlc2V0UmVzZW5kQ29vbGRvd24gPSAwO1xuXG4gIC8vIFJlc29sdmVkIHByb3BzIHdpdGggZGVmYXVsdHNcbiAgZ2V0IGNvbmZpZygpOiBSZXF1aXJlZDxcbiAgICBPbWl0PExvZ2luTWV0YWRhdGEsICdsb2dvJyB8ICdsZWdhbCcgfCAncmVkaXJlY3RPblN1Y2Nlc3MnIHwgJ3JlZGlyZWN0T25TdWNjZXNzUXVlcnlQYXJhbScgfCAnaW5pdGlhbE9wZXJhdGlvbicgfCAnbG9naW5Sb3V0ZSc+XG4gID4gJlxuICAgIExvZ2luTWV0YWRhdGEge1xuICAgIHJldHVybiB7IC4uLkxPR0lOX0RFRkFVTFRTLCAuLi50aGlzLnByb3BzIH07XG4gIH1cblxuICAvKipcbiAgICogTG9nbyBhIHJlbmRlcml6YXIgYXJyaWJhIGRlbCBmb3JtLiBTaSBlbCBjb25zdW1lciBubyBwYXNhIGBsb2dvYCwgY2FlIGFsXG4gICAqIGRlZmF1bHQgZGUgbWFyY2EgZGVsIGZhY3RvcnkgKGAtLW1haW4tbG9nb2AgcG9yIGFwcCkuIFZlciBERUZBVUxUX0xPR0lOX0xPR08uXG4gICAqL1xuICBnZXQgcmVzb2x2ZWRMb2dvKCk6IEltYWdlTWV0YWRhdGEge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmxvZ28gPz8gREVGQVVMVF9MT0dJTl9MT0dPO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEZPUk0gU1RBVEUgU0lHTkFMU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcml2YXRlIF9sb2dpbkZvcm1TdGF0ZSA9IHNpZ25hbDxDb21wb25lbnRTdGF0ZT4oQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQpO1xuICBwcml2YXRlIF9yZWdpc3RlckZvcm1TdGF0ZSA9IHNpZ25hbDxDb21wb25lbnRTdGF0ZT4oQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQpO1xuICBwcml2YXRlIF92ZXJpZnlGb3JtU3RhdGUgPSBzaWduYWw8Q29tcG9uZW50U3RhdGU+KENvbXBvbmVudFN0YXRlcy5FTkFCTEVEKTtcbiAgcHJpdmF0ZSBfdmVyaWZ5Rm9ybVNlY3Rpb25OYW1lID0gc2lnbmFsKCcnKTtcbiAgcHJpdmF0ZSBfbWZhVmVyaWZ5Rm9ybVN0YXRlID0gc2lnbmFsPENvbXBvbmVudFN0YXRlPihDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCk7XG4gIHByaXZhdGUgX21mYU1ldGhvZCA9IHNpZ25hbDwnVE9UUCcgfCAnRU1BSUwnIHwgJ1NNUyc+KCdUT1RQJyk7XG4gIC8qKiBNw6l0b2RvIE1GQSBwZW5kaWVudGUg4oCUIGV4cHVlc3RvIGFsIHRlbXBsYXRlIHBhcmEgZ2F0ZWFyIGVsIGxpbmsgZGUgYmFja3VwIChzb2xvIFRPVFApLiAqL1xuICByZWFkb25seSBtZmFNZXRob2QgPSB0aGlzLl9tZmFNZXRob2QuYXNSZWFkb25seSgpO1xuICAvKiogQTogZWwgdXNlciB0b2dnbGVhIGEgXCJjw7NkaWdvIGRlIHJlc3BhbGRvXCIgKDggY2hhcnMgYWxmYW51bcOpcmljb3MpIGN1YW5kbyBwZXJkacOzIGVsIDLCuiBmYWN0b3IuICovXG4gIHJlYWRvbmx5IG1mYVVzZUJhY2t1cENvZGUgPSBzaWduYWwoZmFsc2UpO1xuICAvLyBCOiByZXNldCBkZSBNRkEgcG9yIGVtYWlsIChjdWFuZG8gZWwgdXNlciBubyB0aWVuZSBiYWNrdXAgY29kZXMpLlxuICBpc01GQVJlc2V0TW9kYWxPcGVuID0gZmFsc2U7XG4gIHByaXZhdGUgX21mYVJlc2V0U3RlcCA9IHNpZ25hbDwncmVxdWVzdCcgfCAnY29uZmlybSc+KCdyZXF1ZXN0Jyk7XG4gIHJlYWRvbmx5IG1mYVJlc2V0U3RlcCA9IHRoaXMuX21mYVJlc2V0U3RlcC5hc1JlYWRvbmx5KCk7XG4gIHByaXZhdGUgX21mYVJlc2V0Rm9ybVN0YXRlID0gc2lnbmFsPENvbXBvbmVudFN0YXRlPihDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCk7XG4gIHByaXZhdGUgX21mYVJlc2V0RW1haWwgPSBzaWduYWwoJycpO1xuICBwcml2YXRlIF9mb3Jnb3RQYXNzd29yZEZvcm1TdGF0ZSA9IHNpZ25hbDxDb21wb25lbnRTdGF0ZT4oQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQpO1xuICBwcml2YXRlIF9yZXNldFBhc3N3b3JkRm9ybVN0YXRlID0gc2lnbmFsPENvbXBvbmVudFN0YXRlPihDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCk7XG4gIHByaXZhdGUgX3Jlc2V0Rm9ybVNlY3Rpb25OYW1lID0gc2lnbmFsKCcnKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTE9HSU4gRk9STSAoY29tcHV0ZWQpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHJlYWRvbmx5IGxvZ2luRm9ybVByb3BzID0gY29tcHV0ZWQ8Rm9ybU1ldGFkYXRhPigoKSA9PlxuICAgIHRoaXMuaTE4bkhlbHBlci5yZXNvbHZlRm9ybSh7XG4gICAgICBuYW1lS2V5OiAnbG9naW5UaXRsZScsXG4gICAgICBpMThuTmFtZXNwYWNlOiAnX2F1dGgnLFxuICAgICAgc2VjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICcnLFxuICAgICAgICAgIG9yZGVyOiAwLFxuICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBJbnB1dFR5cGUuRU1BSUwsXG4gICAgICAgICAgICAgIG5hbWU6ICdlbWFpbCcsXG4gICAgICAgICAgICAgIHRva2VuOiAnbG9naW4tZW1haWwnLFxuICAgICAgICAgICAgICBoaW50OiAnJyxcbiAgICAgICAgICAgICAgbGFiZWxLZXk6ICdlbWFpbCcsXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyS2V5OiAnZW1haWxQbGFjZWhvbGRlcicsXG4gICAgICAgICAgICAgIGVycm9yS2V5czoge1xuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAnZW1haWxSZXF1aXJlZCcsXG4gICAgICAgICAgICAgICAgZW1haWw6ICdlbWFpbEludmFsaWQnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5lbWFpbF0sXG4gICAgICAgICAgICAgIG9yZGVyOiAwLFxuICAgICAgICAgICAgICBzdGF0ZTogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBJbnB1dFR5cGUuUEFTU1dPUkQsXG4gICAgICAgICAgICAgIG5hbWU6ICdwYXNzd29yZCcsXG4gICAgICAgICAgICAgIHRva2VuOiAnbG9naW4tcGFzc3dvcmQnLFxuICAgICAgICAgICAgICBoaW50OiAnJyxcbiAgICAgICAgICAgICAgbGFiZWxLZXk6ICdwYXNzd29yZCcsXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyS2V5OiAncGFzc3dvcmRQbGFjZWhvbGRlcicsXG4gICAgICAgICAgICAgIGVycm9yS2V5czoge1xuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAncGFzc3dvcmRSZXF1aXJlZCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgICAgICAgb3JkZXI6IDEsXG4gICAgICAgICAgICAgIHN0YXRlOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBhY3Rpb25zOiB7XG4gICAgICAgIC4uLmJ1dHRvbih7XG4gICAgICAgICAgdGV4dDogJycsXG4gICAgICAgICAgdHlwZTogJ3N1Ym1pdCcsXG4gICAgICAgICAgZmlsbDogJ3NvbGlkJyxcbiAgICAgICAgICBleHBhbmQ6ICdibG9jaycsXG4gICAgICAgICAgLy8gUMOtbGRvcmEgZW4gdG9kbyBlbCBqb3VybmV5OiBzaW4gc2hhcGUsIElvbmljIGNhZSBhIHN1IHJhZGlvIHBvclxuICAgICAgICAgIC8vIG1vZG8gKDE0cHggZW4gaW9zKSB5IGVsIENUQSBwcmluY2lwYWwgcXVlZGFiYSBtZW5vcyByZWRvbmRvIHF1ZVxuICAgICAgICAgIC8vIGxvcyBib3RvbmVzIGRlIHByb3ZlZWRvci5cbiAgICAgICAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICAgICAgfSksXG4gICAgICAgIHRva2VuOiAnbG9naW4tc3VibWl0JyxcbiAgICAgICAgdGV4dEtleTogJ2xvZ2luU3VibWl0JyxcbiAgICAgIH0sXG4gICAgICBzdGF0ZTogdGhpcy5fbG9naW5Gb3JtU3RhdGUoKSxcbiAgICB9KVxuICApO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSRUdJU1RFUiBGT1JNIChjb21wdXRlZClcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcmVhZG9ubHkgcmVnaXN0ZXJGb3JtUHJvcHMgPSBjb21wdXRlZDxGb3JtTWV0YWRhdGE+KCgpID0+XG4gICAgdGhpcy5pMThuSGVscGVyLnJlc29sdmVGb3JtKHtcbiAgICAgIG5hbWVLZXk6ICdyZWdpc3RlclRpdGxlJyxcbiAgICAgIGkxOG5OYW1lc3BhY2U6ICdfYXV0aCcsXG4gICAgICBzZWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJycsXG4gICAgICAgICAgb3JkZXI6IDAsXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IElucHV0VHlwZS5URVhULFxuICAgICAgICAgICAgICBuYW1lOiAnbmFtZScsXG4gICAgICAgICAgICAgIHRva2VuOiAncmVnaXN0ZXItbmFtZScsXG4gICAgICAgICAgICAgIGhpbnQ6ICcnLFxuICAgICAgICAgICAgICBsYWJlbEtleTogJ2Z1bGxOYW1lJyxcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXJLZXk6ICduYW1lUGxhY2Vob2xkZXInLFxuICAgICAgICAgICAgICBlcnJvcktleXM6IHtcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogJ25hbWVSZXF1aXJlZCcsXG4gICAgICAgICAgICAgICAgbWlubGVuZ3RoOiAnbmFtZU1pbkxlbmd0aCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCgyKV0sXG4gICAgICAgICAgICAgIG9yZGVyOiAwLFxuICAgICAgICAgICAgICBzdGF0ZTogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBJbnB1dFR5cGUuRU1BSUwsXG4gICAgICAgICAgICAgIG5hbWU6ICdlbWFpbCcsXG4gICAgICAgICAgICAgIHRva2VuOiAncmVnaXN0ZXItZW1haWwnLFxuICAgICAgICAgICAgICBoaW50OiAnJyxcbiAgICAgICAgICAgICAgbGFiZWxLZXk6ICdlbWFpbCcsXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyS2V5OiAnZW1haWxQbGFjZWhvbGRlcicsXG4gICAgICAgICAgICAgIGVycm9yS2V5czoge1xuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAnZW1haWxSZXF1aXJlZCcsXG4gICAgICAgICAgICAgICAgZW1haWw6ICdlbWFpbEludmFsaWQnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5lbWFpbF0sXG4gICAgICAgICAgICAgIG9yZGVyOiAxLFxuICAgICAgICAgICAgICBzdGF0ZTogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBJbnB1dFR5cGUuUEFTU1dPUkQsXG4gICAgICAgICAgICAgIG5hbWU6ICdwYXNzd29yZCcsXG4gICAgICAgICAgICAgIHRva2VuOiAncmVnaXN0ZXItcGFzc3dvcmQnLFxuICAgICAgICAgICAgICBoaW50OiAnJyxcbiAgICAgICAgICAgICAgbGFiZWxLZXk6ICdwYXNzd29yZCcsXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyS2V5OiAncGFzc3dvcmRQbGFjZWhvbGRlcicsXG4gICAgICAgICAgICAgIGVycm9yS2V5czoge1xuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAncGFzc3dvcmRSZXF1aXJlZCcsXG4gICAgICAgICAgICAgICAgYXV0aFBhc3N3b3JkOiAncGFzc3dvcmRTdHJlbmd0aCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBhdXRoUGFzc3dvcmRWYWxpZGF0b3IoKV0sXG4gICAgICAgICAgICAgIG9yZGVyOiAyLFxuICAgICAgICAgICAgICBzdGF0ZTogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgYWN0aW9uczoge1xuICAgICAgICAuLi5idXR0b24oe1xuICAgICAgICAgIHRleHQ6ICcnLFxuICAgICAgICAgIHR5cGU6ICdzdWJtaXQnLFxuICAgICAgICAgIGZpbGw6ICdzb2xpZCcsXG4gICAgICAgICAgZXhwYW5kOiAnYmxvY2snLFxuICAgICAgICAgIC8vIFDDrWxkb3JhIGVuIHRvZG8gZWwgam91cm5leTogc2luIHNoYXBlLCBJb25pYyBjYWUgYSBzdSByYWRpbyBwb3JcbiAgICAgICAgICAvLyBtb2RvICgxNHB4IGVuIGlvcykgeSBlbCBDVEEgcHJpbmNpcGFsIHF1ZWRhYmEgbWVub3MgcmVkb25kbyBxdWVcbiAgICAgICAgICAvLyBsb3MgYm90b25lcyBkZSBwcm92ZWVkb3IuXG4gICAgICAgICAgc2hhcGU6ICdyb3VuZCcsXG4gICAgICAgIH0pLFxuICAgICAgICB0b2tlbjogJ3JlZ2lzdGVyLXN1Ym1pdCcsXG4gICAgICAgIHRleHRLZXk6ICdyZWdpc3RlclN1Ym1pdCcsXG4gICAgICB9LFxuICAgICAgc3RhdGU6IHRoaXMuX3JlZ2lzdGVyRm9ybVN0YXRlKCksXG4gICAgfSlcbiAgKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVkVSSUZZIEVNQUlMIEZPUk0gKGNvbXB1dGVkKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICByZWFkb25seSB2ZXJpZnlGb3JtUHJvcHMgPSBjb21wdXRlZDxGb3JtTWV0YWRhdGE+KCgpID0+IHtcbiAgICBjb25zdCBzZWN0aW9uTmFtZSA9IHRoaXMuX3ZlcmlmeUZvcm1TZWN0aW9uTmFtZSgpIHx8IHRoaXMudCgndmVyaWZ5RGVzY3JpcHRpb24nKTtcbiAgICByZXR1cm4gdGhpcy5pMThuSGVscGVyLnJlc29sdmVGb3JtKHtcbiAgICAgIG5hbWVLZXk6ICd2ZXJpZnlUaXRsZScsXG4gICAgICBpMThuTmFtZXNwYWNlOiAnX2F1dGgnLFxuICAgICAgc2VjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IHNlY3Rpb25OYW1lLFxuICAgICAgICAgIG9yZGVyOiAwLFxuICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBJbnB1dFR5cGUuUElOX0NPREUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnJyxcbiAgICAgICAgICAgICAgbmFtZTogJ2NvZGUnLFxuICAgICAgICAgICAgICB0b2tlbjogJ3ZlcmlmeS1waW4nLFxuICAgICAgICAgICAgICBoaW50OiAnJyxcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICcnLFxuICAgICAgICAgICAgICBlcnJvcktleXM6IHtcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogJ2NvZGVSZXF1aXJlZCcsXG4gICAgICAgICAgICAgICAgbWlubGVuZ3RoOiAnY29kZU1pbkxlbmd0aCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCg2KV0sXG4gICAgICAgICAgICAgIG9yZGVyOiAwLFxuICAgICAgICAgICAgICBzdGF0ZTogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgICAgICAgICAgIGxlbmd0aDogNixcbiAgICAgICAgICAgICAgYWxsb3dOdW1iZXJzT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgYXV0b0ZvY3VzOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGFjdGlvbnM6IHtcbiAgICAgICAgLi4uYnV0dG9uKHtcbiAgICAgICAgICB0ZXh0OiAnJyxcbiAgICAgICAgICB0eXBlOiAnc3VibWl0JyxcbiAgICAgICAgICBmaWxsOiAnc29saWQnLFxuICAgICAgICAgIGV4cGFuZDogJ2Jsb2NrJyxcbiAgICAgICAgICAvLyBQw61sZG9yYSBlbiB0b2RvIGVsIGpvdXJuZXk6IHNpbiBzaGFwZSwgSW9uaWMgY2FlIGEgc3UgcmFkaW8gcG9yXG4gICAgICAgICAgLy8gbW9kbyAoMTRweCBlbiBpb3MpIHkgZWwgQ1RBIHByaW5jaXBhbCBxdWVkYWJhIG1lbm9zIHJlZG9uZG8gcXVlXG4gICAgICAgICAgLy8gbG9zIGJvdG9uZXMgZGUgcHJvdmVlZG9yLlxuICAgICAgICAgIHNoYXBlOiAncm91bmQnLFxuICAgICAgICB9KSxcbiAgICAgICAgdG9rZW46ICd2ZXJpZnktc3VibWl0JyxcbiAgICAgICAgdGV4dEtleTogJ3ZlcmlmeVN1Ym1pdCcsXG4gICAgICB9LFxuICAgICAgc3RhdGU6IHRoaXMuX3ZlcmlmeUZvcm1TdGF0ZSgpLFxuICAgIH0pO1xuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTUZBIFZFUklGWSBGT1JNIChjb21wdXRlZClcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcmVhZG9ubHkgbWZhVmVyaWZ5Rm9ybVByb3BzID0gY29tcHV0ZWQ8Rm9ybU1ldGFkYXRhPigoKSA9PiB7XG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5fbWZhTWV0aG9kKCk7XG4gICAgY29uc3QgdXNlQmFja3VwID0gdGhpcy5tZmFVc2VCYWNrdXBDb2RlKCk7XG4gICAgY29uc3Qgc2VjdGlvbk5hbWUgPSB1c2VCYWNrdXBcbiAgICAgID8gdGhpcy50KCdtZmFCYWNrdXBDb2RlJylcbiAgICAgIDogbWV0aG9kID09PSAnVE9UUCdcbiAgICAgICAgPyB0aGlzLnQoJ21mYVRPVFAnKVxuICAgICAgICA6IG1ldGhvZCA9PT0gJ0VNQUlMJ1xuICAgICAgICAgID8gdGhpcy50KCdtZmFFbWFpbCcpXG4gICAgICAgICAgOiB0aGlzLnQoJ21mYVNNUycpO1xuXG4gICAgLy8gQTogYmFja3VwIGNvZGUgPSA4IGNoYXJzIGFsZmFudW3DqXJpY29zIOKGkiBpbnB1dCBkZSB0ZXh0byAoZWwgUElOIGRlIDZcbiAgICAvLyBjZWxkYXMgbnVtw6lyaWNhcyBubyBwdWVkZSBjYXB0dXJhcmxvKS4gRWwgYmFja2VuZCBydXRlYSBwb3IgbG9uZ2l0dWQuXG4gICAgY29uc3QgY29kZUZpZWxkID0gdXNlQmFja3VwXG4gICAgICA/IHtcbiAgICAgICAgICB0eXBlOiBJbnB1dFR5cGUuVEVYVCxcbiAgICAgICAgICBsYWJlbDogJycsXG4gICAgICAgICAgbmFtZTogJ2NvZGUnLFxuICAgICAgICAgIHRva2VuOiAnbWZhLWJhY2t1cCcsXG4gICAgICAgICAgaGludDogJycsXG4gICAgICAgICAgcGxhY2Vob2xkZXI6ICcnLFxuICAgICAgICAgIGVycm9yS2V5czoge1xuICAgICAgICAgICAgcmVxdWlyZWQ6ICdjb2RlUmVxdWlyZWQnLFxuICAgICAgICAgICAgbWlubGVuZ3RoOiAnYmFja3VwQ29kZU1pbkxlbmd0aCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoOCldLFxuICAgICAgICAgIG9yZGVyOiAwLFxuICAgICAgICAgIHN0YXRlOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICAgICAgICBhdXRvRm9jdXM6IHRydWUsXG4gICAgICAgIH1cbiAgICAgIDoge1xuICAgICAgICAgIHR5cGU6IElucHV0VHlwZS5QSU5fQ09ERSxcbiAgICAgICAgICBsYWJlbDogJycsXG4gICAgICAgICAgbmFtZTogJ2NvZGUnLFxuICAgICAgICAgIHRva2VuOiAnbWZhLXBpbicsXG4gICAgICAgICAgaGludDogJycsXG4gICAgICAgICAgcGxhY2Vob2xkZXI6ICcnLFxuICAgICAgICAgIGVycm9yS2V5czoge1xuICAgICAgICAgICAgcmVxdWlyZWQ6ICdjb2RlUmVxdWlyZWQnLFxuICAgICAgICAgICAgbWlubGVuZ3RoOiAnY29kZU1pbkxlbmd0aCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoNildLFxuICAgICAgICAgIG9yZGVyOiAwLFxuICAgICAgICAgIHN0YXRlOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICAgICAgICBsZW5ndGg6IDYsXG4gICAgICAgICAgYWxsb3dOdW1iZXJzT25seTogdHJ1ZSxcbiAgICAgICAgICBhdXRvRm9jdXM6IHRydWUsXG4gICAgICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5pMThuSGVscGVyLnJlc29sdmVGb3JtKHtcbiAgICAgIG5hbWVLZXk6ICdtZmFUaXRsZScsXG4gICAgICBpMThuTmFtZXNwYWNlOiAnX2F1dGgnLFxuICAgICAgc2VjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IHNlY3Rpb25OYW1lLFxuICAgICAgICAgIG9yZGVyOiAwLFxuICAgICAgICAgIGZpZWxkczogW2NvZGVGaWVsZF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgYWN0aW9uczoge1xuICAgICAgICAuLi5idXR0b24oe1xuICAgICAgICAgIHRleHQ6ICcnLFxuICAgICAgICAgIHR5cGU6ICdzdWJtaXQnLFxuICAgICAgICAgIGZpbGw6ICdzb2xpZCcsXG4gICAgICAgICAgZXhwYW5kOiAnYmxvY2snLFxuICAgICAgICAgIC8vIFDDrWxkb3JhIGVuIHRvZG8gZWwgam91cm5leTogc2luIHNoYXBlLCBJb25pYyBjYWUgYSBzdSByYWRpbyBwb3JcbiAgICAgICAgICAvLyBtb2RvICgxNHB4IGVuIGlvcykgeSBlbCBDVEEgcHJpbmNpcGFsIHF1ZWRhYmEgbWVub3MgcmVkb25kbyBxdWVcbiAgICAgICAgICAvLyBsb3MgYm90b25lcyBkZSBwcm92ZWVkb3IuXG4gICAgICAgICAgc2hhcGU6ICdyb3VuZCcsXG4gICAgICAgIH0pLFxuICAgICAgICB0b2tlbjogJ21mYS12ZXJpZnktc3VibWl0JyxcbiAgICAgICAgdGV4dEtleTogJ3ZlcmlmeVN1Ym1pdCcsXG4gICAgICB9LFxuICAgICAgc3RhdGU6IHRoaXMuX21mYVZlcmlmeUZvcm1TdGF0ZSgpLFxuICAgIH0pO1xuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTUZBIFJFU0VUIEZPUk0gKGNvbXB1dGVkKSDigJQgQjogcmVjb3ZlcnkgcG9yIGVtYWlsXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHJlYWRvbmx5IG1mYVJlc2V0UmVxdWVzdEZvcm1Qcm9wcyA9IGNvbXB1dGVkPEZvcm1NZXRhZGF0YT4oKCkgPT5cbiAgICB0aGlzLmkxOG5IZWxwZXIucmVzb2x2ZUZvcm0oe1xuICAgICAgbmFtZUtleTogJ21mYVJlc2V0VGl0bGUnLFxuICAgICAgaTE4bk5hbWVzcGFjZTogJ19hdXRoJyxcbiAgICAgIHNlY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiB0aGlzLnQoJ21mYVJlc2V0UmVxdWVzdERlc2NyaXB0aW9uJyksXG4gICAgICAgICAgb3JkZXI6IDAsXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IElucHV0VHlwZS5FTUFJTCxcbiAgICAgICAgICAgICAgbGFiZWw6ICcnLFxuICAgICAgICAgICAgICBuYW1lOiAnZW1haWwnLFxuICAgICAgICAgICAgICB0b2tlbjogJ21mYS1yZXNldC1lbWFpbCcsXG4gICAgICAgICAgICAgIGhpbnQ6ICcnLFxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcktleTogJ2VtYWlsUGxhY2Vob2xkZXInLFxuICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5fbWZhUmVzZXRFbWFpbCgpLFxuICAgICAgICAgICAgICBlcnJvcktleXM6IHtcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogJ2VtYWlsUmVxdWlyZWQnLFxuICAgICAgICAgICAgICAgIGVtYWlsOiAnZW1haWxJbnZhbGlkJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMuZW1haWxdLFxuICAgICAgICAgICAgICBvcmRlcjogMCxcbiAgICAgICAgICAgICAgc3RhdGU6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGFjdGlvbnM6IHtcbiAgICAgICAgLi4uYnV0dG9uKHtcbiAgICAgICAgICB0ZXh0OiAnJyxcbiAgICAgICAgICB0eXBlOiAnc3VibWl0JyxcbiAgICAgICAgICBmaWxsOiAnc29saWQnLFxuICAgICAgICAgIGV4cGFuZDogJ2Jsb2NrJyxcbiAgICAgICAgICAvLyBQw61sZG9yYSBlbiB0b2RvIGVsIGpvdXJuZXk6IHNpbiBzaGFwZSwgSW9uaWMgY2FlIGEgc3UgcmFkaW8gcG9yXG4gICAgICAgICAgLy8gbW9kbyAoMTRweCBlbiBpb3MpIHkgZWwgQ1RBIHByaW5jaXBhbCBxdWVkYWJhIG1lbm9zIHJlZG9uZG8gcXVlXG4gICAgICAgICAgLy8gbG9zIGJvdG9uZXMgZGUgcHJvdmVlZG9yLlxuICAgICAgICAgIHNoYXBlOiAncm91bmQnLFxuICAgICAgICB9KSxcbiAgICAgICAgdG9rZW46ICdtZmEtcmVzZXQtcmVxdWVzdC1zdWJtaXQnLFxuICAgICAgICB0ZXh0S2V5OiAnbWZhUmVzZXRTdWJtaXQnLFxuICAgICAgfSxcbiAgICAgIHN0YXRlOiB0aGlzLl9tZmFSZXNldEZvcm1TdGF0ZSgpLFxuICAgIH0pXG4gICk7XG5cbiAgcmVhZG9ubHkgbWZhUmVzZXRDb25maXJtRm9ybVByb3BzID0gY29tcHV0ZWQ8Rm9ybU1ldGFkYXRhPigoKSA9PlxuICAgIHRoaXMuaTE4bkhlbHBlci5yZXNvbHZlRm9ybSh7XG4gICAgICBuYW1lS2V5OiAnbWZhUmVzZXRUaXRsZScsXG4gICAgICBpMThuTmFtZXNwYWNlOiAnX2F1dGgnLFxuICAgICAgc2VjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IHRoaXMudCgnbWZhUmVzZXRDb25maXJtRGVzY3JpcHRpb24nKSxcbiAgICAgICAgICBvcmRlcjogMCxcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogSW5wdXRUeXBlLlBJTl9DT0RFLFxuICAgICAgICAgICAgICBsYWJlbDogJycsXG4gICAgICAgICAgICAgIG5hbWU6ICdjb2RlJyxcbiAgICAgICAgICAgICAgdG9rZW46ICdtZmEtcmVzZXQtcGluJyxcbiAgICAgICAgICAgICAgaGludDogJycsXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiAnJyxcbiAgICAgICAgICAgICAgZXJyb3JLZXlzOiB7XG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICdjb2RlUmVxdWlyZWQnLFxuICAgICAgICAgICAgICAgIG1pbmxlbmd0aDogJ2NvZGVNaW5MZW5ndGgnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoNildLFxuICAgICAgICAgICAgICBvcmRlcjogMCxcbiAgICAgICAgICAgICAgc3RhdGU6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgICAgICAgICAgICBsZW5ndGg6IDYsXG4gICAgICAgICAgICAgIGFsbG93TnVtYmVyc09ubHk6IHRydWUsXG4gICAgICAgICAgICAgIGF1dG9Gb2N1czogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBhY3Rpb25zOiB7XG4gICAgICAgIC4uLmJ1dHRvbih7XG4gICAgICAgICAgdGV4dDogJycsXG4gICAgICAgICAgdHlwZTogJ3N1Ym1pdCcsXG4gICAgICAgICAgZmlsbDogJ3NvbGlkJyxcbiAgICAgICAgICBleHBhbmQ6ICdibG9jaycsXG4gICAgICAgICAgLy8gUMOtbGRvcmEgZW4gdG9kbyBlbCBqb3VybmV5OiBzaW4gc2hhcGUsIElvbmljIGNhZSBhIHN1IHJhZGlvIHBvclxuICAgICAgICAgIC8vIG1vZG8gKDE0cHggZW4gaW9zKSB5IGVsIENUQSBwcmluY2lwYWwgcXVlZGFiYSBtZW5vcyByZWRvbmRvIHF1ZVxuICAgICAgICAgIC8vIGxvcyBib3RvbmVzIGRlIHByb3ZlZWRvci5cbiAgICAgICAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICAgICAgfSksXG4gICAgICAgIHRva2VuOiAnbWZhLXJlc2V0LWNvbmZpcm0tc3VibWl0JyxcbiAgICAgICAgdGV4dEtleTogJ21mYVJlc2V0Q29uZmlybVN1Ym1pdCcsXG4gICAgICB9LFxuICAgICAgc3RhdGU6IHRoaXMuX21mYVJlc2V0Rm9ybVN0YXRlKCksXG4gICAgfSlcbiAgKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRk9SR09UIFBBU1NXT1JEIEZPUk0gKGNvbXB1dGVkKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICByZWFkb25seSBmb3Jnb3RQYXNzd29yZEZvcm1Qcm9wcyA9IGNvbXB1dGVkPEZvcm1NZXRhZGF0YT4oKCkgPT5cbiAgICB0aGlzLmkxOG5IZWxwZXIucmVzb2x2ZUZvcm0oe1xuICAgICAgbmFtZUtleTogJ2ZvcmdvdFRpdGxlJyxcbiAgICAgIGkxOG5OYW1lc3BhY2U6ICdfYXV0aCcsXG4gICAgICBzZWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogdGhpcy50KCdmb3Jnb3REZXNjcmlwdGlvbicpLFxuICAgICAgICAgIG9yZGVyOiAwLFxuICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBJbnB1dFR5cGUuRU1BSUwsXG4gICAgICAgICAgICAgIGxhYmVsOiAnJyxcbiAgICAgICAgICAgICAgbmFtZTogJ2VtYWlsJyxcbiAgICAgICAgICAgICAgdG9rZW46ICdmb3Jnb3QtZW1haWwnLFxuICAgICAgICAgICAgICBoaW50OiAnJyxcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXJLZXk6ICdlbWFpbFBsYWNlaG9sZGVyJyxcbiAgICAgICAgICAgICAgZXJyb3JLZXlzOiB7XG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICdlbWFpbFJlcXVpcmVkJyxcbiAgICAgICAgICAgICAgICBlbWFpbDogJ2VtYWlsSW52YWxpZCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLmVtYWlsXSxcbiAgICAgICAgICAgICAgb3JkZXI6IDAsXG4gICAgICAgICAgICAgIHN0YXRlOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBhY3Rpb25zOiB7XG4gICAgICAgIC4uLmJ1dHRvbih7XG4gICAgICAgICAgdGV4dDogJycsXG4gICAgICAgICAgdHlwZTogJ3N1Ym1pdCcsXG4gICAgICAgICAgZmlsbDogJ3NvbGlkJyxcbiAgICAgICAgICBleHBhbmQ6ICdibG9jaycsXG4gICAgICAgICAgLy8gUMOtbGRvcmEgZW4gdG9kbyBlbCBqb3VybmV5OiBzaW4gc2hhcGUsIElvbmljIGNhZSBhIHN1IHJhZGlvIHBvclxuICAgICAgICAgIC8vIG1vZG8gKDE0cHggZW4gaW9zKSB5IGVsIENUQSBwcmluY2lwYWwgcXVlZGFiYSBtZW5vcyByZWRvbmRvIHF1ZVxuICAgICAgICAgIC8vIGxvcyBib3RvbmVzIGRlIHByb3ZlZWRvci5cbiAgICAgICAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICAgICAgfSksXG4gICAgICAgIHRva2VuOiAnZm9yZ290LXN1Ym1pdCcsXG4gICAgICAgIHRleHRLZXk6ICdmb3Jnb3RTdWJtaXQnLFxuICAgICAgfSxcbiAgICAgIHN0YXRlOiB0aGlzLl9mb3Jnb3RQYXNzd29yZEZvcm1TdGF0ZSgpLFxuICAgIH0pXG4gICk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJFU0VUIFBBU1NXT1JEIEZPUk0gKGNvbXB1dGVkKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICByZWFkb25seSByZXNldFBhc3N3b3JkRm9ybVByb3BzID0gY29tcHV0ZWQ8Rm9ybU1ldGFkYXRhPigoKSA9PiB7XG4gICAgY29uc3Qgc2VjdGlvbk5hbWUgPSB0aGlzLl9yZXNldEZvcm1TZWN0aW9uTmFtZSgpIHx8IHRoaXMudCgncmVzZXREZXNjcmlwdGlvbicpO1xuICAgIHJldHVybiB0aGlzLmkxOG5IZWxwZXIucmVzb2x2ZUZvcm0oe1xuICAgICAgbmFtZUtleTogJ3Jlc2V0VGl0bGUnLFxuICAgICAgaTE4bk5hbWVzcGFjZTogJ19hdXRoJyxcbiAgICAgIHNlY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBzZWN0aW9uTmFtZSxcbiAgICAgICAgICBvcmRlcjogMCxcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogSW5wdXRUeXBlLlBJTl9DT0RFLFxuICAgICAgICAgICAgICBsYWJlbDogJycsXG4gICAgICAgICAgICAgIG5hbWU6ICdjb2RlJyxcbiAgICAgICAgICAgICAgdG9rZW46ICdyZXNldC1waW4nLFxuICAgICAgICAgICAgICBoaW50OiAnJyxcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICcnLFxuICAgICAgICAgICAgICBlcnJvcktleXM6IHtcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogJ2NvZGVSZXF1aXJlZCcsXG4gICAgICAgICAgICAgICAgbWlubGVuZ3RoOiAnY29kZU1pbkxlbmd0aCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCg2KV0sXG4gICAgICAgICAgICAgIG9yZGVyOiAwLFxuICAgICAgICAgICAgICBzdGF0ZTogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgICAgICAgICAgIGxlbmd0aDogNixcbiAgICAgICAgICAgICAgYWxsb3dOdW1iZXJzT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgYXV0b0ZvY3VzOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogSW5wdXRUeXBlLlBBU1NXT1JELFxuICAgICAgICAgICAgICBuYW1lOiAnbmV3UGFzc3dvcmQnLFxuICAgICAgICAgICAgICB0b2tlbjogJ3Jlc2V0LW5ldy1wYXNzd29yZCcsXG4gICAgICAgICAgICAgIGxhYmVsS2V5OiAnbmV3UGFzc3dvcmQnLFxuICAgICAgICAgICAgICBoaW50S2V5OiAnbmV3UGFzc3dvcmRIaW50JyxcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXJLZXk6ICdwYXNzd29yZFBsYWNlaG9sZGVyJyxcbiAgICAgICAgICAgICAgZXJyb3JLZXlzOiB7XG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICdwYXNzd29yZFJlcXVpcmVkJyxcbiAgICAgICAgICAgICAgICBhdXRoUGFzc3dvcmQ6ICdwYXNzd29yZFN0cmVuZ3RoJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWQsIGF1dGhQYXNzd29yZFZhbGlkYXRvcigpXSxcbiAgICAgICAgICAgICAgb3JkZXI6IDEsXG4gICAgICAgICAgICAgIHN0YXRlOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBhY3Rpb25zOiB7XG4gICAgICAgIC4uLmJ1dHRvbih7XG4gICAgICAgICAgdGV4dDogJycsXG4gICAgICAgICAgdHlwZTogJ3N1Ym1pdCcsXG4gICAgICAgICAgZmlsbDogJ3NvbGlkJyxcbiAgICAgICAgICBleHBhbmQ6ICdibG9jaycsXG4gICAgICAgICAgLy8gUMOtbGRvcmEgZW4gdG9kbyBlbCBqb3VybmV5OiBzaW4gc2hhcGUsIElvbmljIGNhZSBhIHN1IHJhZGlvIHBvclxuICAgICAgICAgIC8vIG1vZG8gKDE0cHggZW4gaW9zKSB5IGVsIENUQSBwcmluY2lwYWwgcXVlZGFiYSBtZW5vcyByZWRvbmRvIHF1ZVxuICAgICAgICAgIC8vIGxvcyBib3RvbmVzIGRlIHByb3ZlZWRvci5cbiAgICAgICAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICAgICAgfSksXG4gICAgICAgIHRva2VuOiAncmVzZXQtc3VibWl0JyxcbiAgICAgICAgdGV4dEtleTogJ3Jlc2V0U3VibWl0JyxcbiAgICAgIH0sXG4gICAgICBzdGF0ZTogdGhpcy5fcmVzZXRQYXNzd29yZEZvcm1TdGF0ZSgpLFxuICAgIH0pO1xuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSEFORExFUlNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgbG9naW5IYW5kbGVyKGV2ZW50OiBGb3JtU3VibWl0KTogdm9pZCB7XG4gICAgY29uc3QgZW1haWwgPSBldmVudC5maWVsZHNbJ2VtYWlsJ107XG4gICAgY29uc3QgcGFzc3dvcmQgPSBldmVudC5maWVsZHNbJ3Bhc3N3b3JkJ107XG5cbiAgICBpZiAoIWVtYWlsIHx8ICFwYXNzd29yZCkge1xuICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy50KCdjb21wbGV0ZUFsbEZpZWxkcycpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dpbkZvcm1TdGF0ZS5zZXQoQ29tcG9uZW50U3RhdGVzLldPUktJTkcpO1xuXG4gICAgdGhpcy5hdXRoU2VydmljZS5zaWduaW4oeyBlbWFpbCwgcGFzc3dvcmQgfSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy5fbG9naW5Gb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5FTkFCTEVEKTtcblxuICAgICAgICBpZiAodGhpcy5hdXRoU2VydmljZS5tZmFQZW5kaW5nKCkucmVxdWlyZWQpIHtcbiAgICAgICAgICB0aGlzLl9tZmFSZXNldEVtYWlsLnNldChlbWFpbCk7IC8vIEI6IHByZWZpbGwgZGVsIHJlc2V0IHBvciBlbWFpbFxuICAgICAgICAgIHRoaXMub3Blbk1GQVZlcmlmeU1vZGFsKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oYW5kbGVMb2dpblN1Y2Nlc3MoKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogZXJyID0+IHtcbiAgICAgICAgdGhpcy5fbG9naW5Gb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5FTkFCTEVEKTtcblxuICAgICAgICBjb25zdCBlcnJvckNvZGUgPSAoZXJyIGFzIHsgY29kZT86IHN0cmluZyB9KT8uY29kZTtcbiAgICAgICAgaWYgKGVycm9yQ29kZSA9PT0gJ0FVVEhWMl9FTUFJTF9OT1RfVkVSSUZJRUQnKSB7XG4gICAgICAgICAgdGhpcy5vcGVuVmVyaWZ5TW9kYWwoZW1haWwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyLCAnc2lnbmluJyk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3BzIGRlbCBib3TDs24gZGUgdW4gcHJvdmVlZG9yLiBMb3MgT0F1dGggcGFzYW4gcG9yIGB2YWwtYnV0dG9uYCBjb21vIGVsXG4gICAqIHJlc3RvIGRlbCBqb3VybmV5OiBhc8OtIGhlcmVkYW4gbGEgZm9ybWEgZGUgcMOtbGRvcmEgZGVsIHNpc3RlbWEgZW4gdmV6IGRlXG4gICAqIGRlcGVuZGVyIGRlIHVuIGAtLWJvcmRlci1yYWRpdXNgIGxvY2FsLCBxdWUgZXJhIGxvIHF1ZSBsb3MgZGVqYWJhXG4gICAqIHJlY3Rhbmd1bGFyZXMgYWwgbGFkbyBkZWwgQ1RBIHByaW5jaXBhbC5cbiAgICovXG4gIG9hdXRoQnV0dG9uUHJvcHMoXG4gICAgcHJvdmlkZXI6ICdnb29nbGUnIHwgJ2FwcGxlJyB8ICdtaWNyb3NvZnQnIHwgJ2ZhY2Vib29rJ1xuICApOiBCdXR0b25NZXRhZGF0YSB7XG4gICAgY29uc3QgbGFiZWxzOiBSZWNvcmQ8dHlwZW9mIHByb3ZpZGVyLCBzdHJpbmc+ID0ge1xuICAgICAgZ29vZ2xlOiAnY29udGludWVXaXRoR29vZ2xlJyxcbiAgICAgIGFwcGxlOiAnY29udGludWVXaXRoQXBwbGUnLFxuICAgICAgbWljcm9zb2Z0OiAnY29udGludWVXaXRoTWljcm9zb2Z0JyxcbiAgICAgIGZhY2Vib29rOiAnY29udGludWVXaXRoRmFjZWJvb2snLFxuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIHRva2VuOiBgb2F1dGgtJHtwcm92aWRlcn1gLFxuICAgICAgdGV4dDogdGhpcy5pc09BdXRoTG9hZGluZyA/IHRoaXMudCgnY29ubmVjdGluZycpIDogdGhpcy50KGxhYmVsc1twcm92aWRlcl0pLFxuICAgICAgaWNvbjogeyBuYW1lOiBgbG9nby0ke3Byb3ZpZGVyfWAsIHNsb3Q6ICdzdGFydCcgfSxcbiAgICAgIGNvbG9yOiAnZGFyaycsXG4gICAgICBmaWxsOiAnb3V0bGluZScsXG4gICAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICAgIGV4cGFuZDogJ2Jsb2NrJyxcbiAgICAgIHR5cGU6ICdidXR0b24nLFxuICAgICAgc3RhdGU6IHRoaXMuaXNPQXV0aExvYWRpbmdcbiAgICAgICAgPyBDb21wb25lbnRTdGF0ZXMuRElTQUJMRURcbiAgICAgICAgOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICB9O1xuICB9XG5cbiAgbG9naW5XaXRoT0F1dGgocHJvdmlkZXI6ICdnb29nbGUnIHwgJ2FwcGxlJyB8ICdtaWNyb3NvZnQnIHwgJ2ZhY2Vib29rJyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzT0F1dGhMb2FkaW5nKSByZXR1cm47XG5cbiAgICB0aGlzLmlzT0F1dGhMb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnNjaGVkdWxlT0F1dGhMb2FkaW5nUmVzZXQoKTtcblxuICAgIHRoaXMuYXV0aFNlcnZpY2Uuc2lnbmluV2l0aE9BdXRoKHByb3ZpZGVyKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICB0aGlzLmNsZWFyT0F1dGhMb2FkaW5nUmVzZXRUaW1lcigpO1xuICAgICAgICB0aGlzLmlzT0F1dGhMb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuYXV0aFNlcnZpY2UubWZhUGVuZGluZygpLnJlcXVpcmVkKSB7XG4gICAgICAgICAgdGhpcy5vcGVuTUZBVmVyaWZ5TW9kYWwoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhhbmRsZUxvZ2luU3VjY2Vzcyhwcm92aWRlcik7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgIHRoaXMuY2xlYXJPQXV0aExvYWRpbmdSZXNldFRpbWVyKCk7XG4gICAgICAgIHRoaXMuaXNPQXV0aExvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBlcnJvckNvZGUgPSAoZXJyIGFzIHsgY29kZT86IHN0cmluZyB9KT8uY29kZTtcbiAgICAgICAgaWYgKGVycm9yQ29kZSA9PT0gJ1BPUFVQX0NMT1NFRCcpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGVyciwgJ29hdXRoJyk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJFR0lTVEVSIEhBTkRMRVJTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBOYXZlZ2FjacOzbiBwZW5kaWVudGUgYSBsYSBww6FnaW5hIGRlIGxvZ2luIHRyYXMgY2VycmFyIGVsIG1vZGFsIGRlIHJlZ2lzdHJvLiAqL1xuICBwcml2YXRlIF9wZW5kaW5nTG9naW5OYXYgPSBmYWxzZTtcblxuICBvcGVuUmVnaXN0ZXJNb2RhbCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzUmVnaXN0ZXJNb2RhbE9wZW4gPSB0cnVlO1xuICB9XG5cbiAgY2xvc2VSZWdpc3Rlck1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMuaXNSZWdpc3Rlck1vZGFsT3BlbiA9IGZhbHNlO1xuICAgIC8vIE5hdmVnYWNpw7NuIGRpZmVyaWRhOiBzZSBoYWNlIGVuIGVsIGNpZXJyZSBkZWwgbW9kYWwgKGRpZERpc21pc3MgbGxhbWEgYWPDoSlcbiAgICAvLyBwYXJhIHF1ZSBpb24tbW9kYWwgY29tcGxldGUgc3UgYW5pbWFjacOzbiBhbnRlcyBkZSBlbnJ1dGFyIOKAlCBzaW4gZXN0byBlbFxuICAgIC8vIG1vZGFsIHB1ZWRlIHF1ZWRhciB2aXNpYmxlIHNvYnJlIGxhIHDDoWdpbmEgZGVzdGluby5cbiAgICBpZiAodGhpcy5fcGVuZGluZ0xvZ2luTmF2KSB7XG4gICAgICB0aGlzLl9wZW5kaW5nTG9naW5OYXYgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHJvdXRlID0gdGhpcy5wcm9wcy5sb2dpblJvdXRlO1xuICAgICAgaWYgKHJvdXRlKSB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbcm91dGVdKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGluayBcIsK/WWEgdGllbmVzIGN1ZW50YT9cIiBkZWwgbW9kYWwgZGUgcmVnaXN0cm8uIFNpIGBwcm9wcy5sb2dpblJvdXRlYCBlc3TDoVxuICAgKiBjb25maWd1cmFkbywgY2llcnJhIGVsIG1vZGFsIHkgbmF2ZWdhIGEgbGEgcMOhZ2luYSBkZSBsb2dpbjsgc2kgbm8sIHNvbG9cbiAgICogY2llcnJhIGVsIG1vZGFsIChjb21wb3J0YW1pZW50byBwb3IgZGVmZWN0bykuXG4gICAqL1xuICBvblJlZ2lzdGVyU3dpdGNoVG9Mb2dpbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wcm9wcy5sb2dpblJvdXRlKSB7XG4gICAgICB0aGlzLl9wZW5kaW5nTG9naW5OYXYgPSB0cnVlO1xuICAgICAgdGhpcy5pc1JlZ2lzdGVyTW9kYWxPcGVuID0gZmFsc2U7IC8vIGRpc3BhcmEgKGRpZERpc21pc3MpIOKGkiBjbG9zZVJlZ2lzdGVyTW9kYWxcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jbG9zZVJlZ2lzdGVyTW9kYWwoKTtcbiAgICB9XG4gIH1cblxuICByZWdpc3RlckhhbmRsZXIoZXZlbnQ6IEZvcm1TdWJtaXQpOiB2b2lkIHtcbiAgICBjb25zdCBuYW1lID0gZXZlbnQuZmllbGRzWyduYW1lJ107XG4gICAgY29uc3QgZW1haWwgPSBldmVudC5maWVsZHNbJ2VtYWlsJ107XG4gICAgY29uc3QgcGFzc3dvcmQgPSBldmVudC5maWVsZHNbJ3Bhc3N3b3JkJ107XG5cbiAgICBpZiAoIW5hbWUgfHwgIWVtYWlsIHx8ICFwYXNzd29yZCkge1xuICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy50KCdjb21wbGV0ZUFsbEZpZWxkcycpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9yZWdpc3RlckZvcm1TdGF0ZS5zZXQoQ29tcG9uZW50U3RhdGVzLldPUktJTkcpO1xuXG4gICAgdGhpcy5hdXRoU2VydmljZS5zaWdudXAoeyBuYW1lLCBlbWFpbCwgcGFzc3dvcmQgfSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy5fcmVnaXN0ZXJGb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5FTkFCTEVEKTtcbiAgICAgICAgdGhpcy5jbG9zZVJlZ2lzdGVyTW9kYWwoKTtcbiAgICAgICAgdGhpcy5vcGVuVmVyaWZ5TW9kYWwoZW1haWwpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiBlcnIgPT4ge1xuICAgICAgICB0aGlzLl9yZWdpc3RlckZvcm1TdGF0ZS5zZXQoQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQpO1xuICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGVyciwgJ3NpZ251cCcpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBWRVJJRlkgRU1BSUwgSEFORExFUlNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgb3BlblZlcmlmeU1vZGFsKGVtYWlsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnBlbmRpbmdWZXJpZmljYXRpb25FbWFpbCA9IGVtYWlsO1xuICAgIHRoaXMuX3ZlcmlmeUZvcm1TZWN0aW9uTmFtZS5zZXQoYCR7dGhpcy50KCd2ZXJpZnlEZXNjcmlwdGlvbicpLnJlcGxhY2UoJy4nLCAnJyl9ICgke2VtYWlsfSlgKTtcbiAgICB0aGlzLl92ZXJpZnlGb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5FTkFCTEVEKTtcbiAgICB0aGlzLmlzVmVyaWZ5TW9kYWxPcGVuID0gdHJ1ZTtcbiAgICB0aGlzLnN0YXJ0UmVzZW5kQ29vbGRvd24oKTtcbiAgfVxuXG4gIGNsb3NlVmVyaWZ5TW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5pc1ZlcmlmeU1vZGFsT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMucGVuZGluZ1ZlcmlmaWNhdGlvbkVtYWlsID0gJyc7XG4gICAgdGhpcy5fdmVyaWZ5Rm9ybVNlY3Rpb25OYW1lLnNldCgnJyk7XG4gICAgdGhpcy5zdG9wUmVzZW5kQ29vbGRvd24oKTtcbiAgfVxuXG4gIHZlcmlmeUhhbmRsZXIoZXZlbnQ6IEZvcm1TdWJtaXQpOiB2b2lkIHtcbiAgICBjb25zdCBjb2RlID0gZXZlbnQuZmllbGRzWydjb2RlJ107XG5cbiAgICB0aGlzLl92ZXJpZnlGb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5XT1JLSU5HKTtcblxuICAgIHRoaXMuYXV0aFNlcnZpY2VcbiAgICAgIC52ZXJpZnlFbWFpbCh7XG4gICAgICAgIGVtYWlsOiB0aGlzLnBlbmRpbmdWZXJpZmljYXRpb25FbWFpbCxcbiAgICAgICAgY29kZSxcbiAgICAgIH0pXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX3ZlcmlmeUZvcm1TdGF0ZS5zZXQoQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQpO1xuICAgICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMudCgnZW1haWxWZXJpZmllZCcpKTtcbiAgICAgICAgICB0aGlzLmNsb3NlVmVyaWZ5TW9kYWwoKTtcbiAgICAgICAgICB0aGlzLmhhbmRsZUxvZ2luU3VjY2VzcygpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogZXJyID0+IHtcbiAgICAgICAgICB0aGlzLl92ZXJpZnlGb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5FTkFCTEVEKTtcbiAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGVyciwgJ3ZlcmlmeScpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gIH1cblxuICByZXNlbmRDb2RlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlc2VuZENvb2xkb3duID4gMCkgcmV0dXJuO1xuXG4gICAgdGhpcy5hdXRoU2VydmljZVxuICAgICAgLnJlc2VuZENvZGUoe1xuICAgICAgICBlbWFpbDogdGhpcy5wZW5kaW5nVmVyaWZpY2F0aW9uRW1haWwsXG4gICAgICAgIHR5cGU6ICdFTUFJTF9WRVJJRlknLFxuICAgICAgfSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy50KCdjb2RlU2VudCcpKTtcbiAgICAgICAgICB0aGlzLnN0YXJ0UmVzZW5kQ29vbGRvd24oKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnIsICd2ZXJpZnknKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE1GQSBIQU5ETEVSU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBvcGVuTUZBVmVyaWZ5TW9kYWwoKTogdm9pZCB7XG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5hdXRoU2VydmljZS5tZmFQZW5kaW5nKCkubWV0aG9kIGFzICdUT1RQJyB8ICdFTUFJTCcgfCAnU01TJztcbiAgICB0aGlzLl9tZmFNZXRob2Quc2V0KG1ldGhvZCk7XG4gICAgdGhpcy5tZmFVc2VCYWNrdXBDb2RlLnNldChmYWxzZSk7XG4gICAgdGhpcy5fbWZhVmVyaWZ5Rm9ybVN0YXRlLnNldChDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCk7XG4gICAgdGhpcy5pc01GQVZlcmlmeU1vZGFsT3BlbiA9IHRydWU7XG5cbiAgICB0aGlzLm9uTUZBUmVxdWlyZWQuZW1pdCh7IG1ldGhvZCB9KTtcbiAgfVxuXG4gIGNsb3NlTUZBVmVyaWZ5TW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5pc01GQVZlcmlmeU1vZGFsT3BlbiA9IGZhbHNlO1xuICB9XG5cbiAgLyoqIEE6IGFsdGVybmEgZW50cmUgZWwgY8OzZGlnbyBUT1RQICg2IGTDrWcpIHkgdW4gY8OzZGlnbyBkZSByZXNwYWxkbyAoOCBjaGFycykuICovXG4gIHRvZ2dsZU1GQUJhY2t1cENvZGUoKTogdm9pZCB7XG4gICAgdGhpcy5tZmFVc2VCYWNrdXBDb2RlLnVwZGF0ZSh2ID0+ICF2KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBNRkEgUkVTRVQgSEFORExFUlMg4oCUIEI6IHJlY292ZXJ5IHBvciBlbWFpbFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBvcGVuTUZBUmVzZXRNb2RhbCgpOiB2b2lkIHtcbiAgICB0aGlzLl9tZmFSZXNldFN0ZXAuc2V0KCdyZXF1ZXN0Jyk7XG4gICAgdGhpcy5fbWZhUmVzZXRGb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5FTkFCTEVEKTtcbiAgICB0aGlzLmlzTUZBUmVzZXRNb2RhbE9wZW4gPSB0cnVlO1xuICB9XG5cbiAgY2xvc2VNRkFSZXNldE1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMuaXNNRkFSZXNldE1vZGFsT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuX21mYVJlc2V0U3RlcC5zZXQoJ3JlcXVlc3QnKTtcbiAgfVxuXG4gIG1mYVJlc2V0UmVxdWVzdEhhbmRsZXIoZXZlbnQ6IEZvcm1TdWJtaXQpOiB2b2lkIHtcbiAgICBjb25zdCBlbWFpbCA9IGV2ZW50LmZpZWxkc1snZW1haWwnXTtcbiAgICBpZiAoIWVtYWlsKSB7XG4gICAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ2VudGVyRW1haWwnKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbWZhUmVzZXRGb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5XT1JLSU5HKTtcbiAgICB0aGlzLl9tZmFSZXNldEVtYWlsLnNldChlbWFpbCk7XG5cbiAgICB0aGlzLmF1dGhTZXJ2aWNlLnJlcXVlc3RNRkFSZXNldCh7IGVtYWlsIH0pLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMuX21mYVJlc2V0Rm9ybVN0YXRlLnNldChDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCk7XG4gICAgICAgIHRoaXMuX21mYVJlc2V0U3RlcC5zZXQoJ2NvbmZpcm0nKTtcbiAgICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy50KCdtZmFSZXNldENvZGVTZW50JykpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiBlcnIgPT4ge1xuICAgICAgICB0aGlzLl9tZmFSZXNldEZvcm1TdGF0ZS5zZXQoQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQpO1xuICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGVyciwgJ21mYScpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIG1mYVJlc2V0Q29uZmlybUhhbmRsZXIoZXZlbnQ6IEZvcm1TdWJtaXQpOiB2b2lkIHtcbiAgICBjb25zdCBjb2RlID0gZXZlbnQuZmllbGRzWydjb2RlJ107XG5cbiAgICB0aGlzLl9tZmFSZXNldEZvcm1TdGF0ZS5zZXQoQ29tcG9uZW50U3RhdGVzLldPUktJTkcpO1xuXG4gICAgdGhpcy5hdXRoU2VydmljZS5jb25maXJtTUZBUmVzZXQoeyBlbWFpbDogdGhpcy5fbWZhUmVzZXRFbWFpbCgpLCBjb2RlIH0pLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMuX21mYVJlc2V0Rm9ybVN0YXRlLnNldChDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCk7XG4gICAgICAgIC8vIE1GQSBkZXNoYWJpbGl0YWRvIOKGkiBjZXJyYW1vcyBhbWJvcyBtb2RhbGVzOyBlbCB1c2VyIHJlaW5pY2lhIGVsIGxvZ2luXG4gICAgICAgIC8vIChhaG9yYSBzaW4gMsK6IGZhY3RvcikgeSByZS1lbnJvbGEgVE9UUCBkZXNkZSBhanVzdGVzLlxuICAgICAgICB0aGlzLmNsb3NlTUZBUmVzZXRNb2RhbCgpO1xuICAgICAgICB0aGlzLmNsb3NlTUZBVmVyaWZ5TW9kYWwoKTtcbiAgICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy50KCdtZmFSZXNldERvbmUnKSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgIHRoaXMuX21mYVJlc2V0Rm9ybVN0YXRlLnNldChDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCk7XG4gICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyLCAnbWZhJyk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgdmVyaWZ5TUZBSGFuZGxlcihldmVudDogRm9ybVN1Ym1pdCk6IHZvaWQge1xuICAgIGNvbnN0IGNvZGUgPSBldmVudC5maWVsZHNbJ2NvZGUnXTtcblxuICAgIHRoaXMuX21mYVZlcmlmeUZvcm1TdGF0ZS5zZXQoQ29tcG9uZW50U3RhdGVzLldPUktJTkcpO1xuXG4gICAgdGhpcy5hdXRoU2VydmljZS52ZXJpZnlNRkEoY29kZSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy5fbWZhVmVyaWZ5Rm9ybVN0YXRlLnNldChDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCk7XG4gICAgICAgIC8vIERpZmVyaW1vcyBoYW5kbGVMb2dpblN1Y2Nlc3MgaGFzdGEgcXVlIGlvbi1tb2RhbCBjb21wbGV0ZSBzdVxuICAgICAgICAvLyBhbmltYWNpw7NuIGRlIGNpZXJyZSAoZGlkRGlzbWlzcykuIFNpbiBlc3RvLCBgcm91dGVyLm5hdmlnYXRlYCBkZWxcbiAgICAgICAgLy8gcGFkcmUgZGVzdHJ1eWUgYWwgaG9zdCBkZWwgbW9kYWwgYW50ZXMgZGUgcXVlIElvbmljIHByb2Nlc2UgZWxcbiAgICAgICAgLy8gZGlzbWlzcywgeSBlbCBtb2RhbCBxdWVkYSB2aXNpYmxlIGVuY2ltYSBkZSBsYSBww6FnaW5hIGRlc3Rpbm9cbiAgICAgICAgLy8gKGlPUyBQV0EpLlxuICAgICAgICB0aGlzLl9tZmFTdWNjZXNzUGVuZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuY2xvc2VNRkFWZXJpZnlNb2RhbCgpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiBlcnIgPT4ge1xuICAgICAgICB0aGlzLl9tZmFWZXJpZnlGb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5FTkFCTEVEKTtcbiAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnIsICdtZmEnKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBvbk1GQVZlcmlmeURpc21pc3NlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbWZhU3VjY2Vzc1BlbmRpbmcpIHtcbiAgICAgIHRoaXMuX21mYVN1Y2Nlc3NQZW5kaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmhhbmRsZUxvZ2luU3VjY2Vzcyh1bmRlZmluZWQsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBGT1JHT1QgUEFTU1dPUkQgSEFORExFUlNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgb3BlbkZvcmdvdFBhc3N3b3JkTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5pc0ZvcmdvdFBhc3N3b3JkTW9kYWxPcGVuID0gdHJ1ZTtcbiAgfVxuXG4gIGNsb3NlRm9yZ290UGFzc3dvcmRNb2RhbCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzRm9yZ290UGFzc3dvcmRNb2RhbE9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIGZvcmdvdFBhc3N3b3JkSGFuZGxlcihldmVudDogRm9ybVN1Ym1pdCk6IHZvaWQge1xuICAgIGNvbnN0IGVtYWlsID0gZXZlbnQuZmllbGRzWydlbWFpbCddO1xuXG4gICAgaWYgKCFlbWFpbCkge1xuICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy50KCdlbnRlckVtYWlsJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2ZvcmdvdFBhc3N3b3JkRm9ybVN0YXRlLnNldChDb21wb25lbnRTdGF0ZXMuV09SS0lORyk7XG5cbiAgICB0aGlzLmF1dGhTZXJ2aWNlLmZvcmdvdFBhc3N3b3JkKHsgZW1haWwgfSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy5fZm9yZ290UGFzc3dvcmRGb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5FTkFCTEVEKTtcbiAgICAgICAgdGhpcy5jbG9zZUZvcmdvdFBhc3N3b3JkTW9kYWwoKTtcbiAgICAgICAgdGhpcy5vcGVuUmVzZXRQYXNzd29yZE1vZGFsKGVtYWlsKTtcbiAgICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy50KCdjb2RlU2VudCcpKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogZXJyID0+IHtcbiAgICAgICAgdGhpcy5fZm9yZ290UGFzc3dvcmRGb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5FTkFCTEVEKTtcbiAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnIsICdmb3Jnb3QnKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUkVTRVQgUEFTU1dPUkQgSEFORExFUlNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgb3BlblJlc2V0UGFzc3dvcmRNb2RhbChlbWFpbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wZW5kaW5nUmVzZXRFbWFpbCA9IGVtYWlsO1xuICAgIHRoaXMuX3Jlc2V0Rm9ybVNlY3Rpb25OYW1lLnNldChgJHt0aGlzLnQoJ3Jlc2V0RGVzY3JpcHRpb24nKS5yZXBsYWNlKCcuJywgJycpfSAoJHtlbWFpbH0pYCk7XG4gICAgdGhpcy5fcmVzZXRQYXNzd29yZEZvcm1TdGF0ZS5zZXQoQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQpO1xuICAgIHRoaXMuaXNSZXNldFBhc3N3b3JkTW9kYWxPcGVuID0gdHJ1ZTtcbiAgICB0aGlzLnN0YXJ0UmVzZXRSZXNlbmRDb29sZG93bigpO1xuICB9XG5cbiAgY2xvc2VSZXNldFBhc3N3b3JkTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5pc1Jlc2V0UGFzc3dvcmRNb2RhbE9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLnBlbmRpbmdSZXNldEVtYWlsID0gJyc7XG4gICAgdGhpcy5fcmVzZXRGb3JtU2VjdGlvbk5hbWUuc2V0KCcnKTtcbiAgICB0aGlzLnN0b3BSZXNldFJlc2VuZENvb2xkb3duKCk7XG4gIH1cblxuICByZXNldFBhc3N3b3JkSGFuZGxlcihldmVudDogRm9ybVN1Ym1pdCk6IHZvaWQge1xuICAgIGNvbnN0IGNvZGUgPSBldmVudC5maWVsZHNbJ2NvZGUnXTtcbiAgICBjb25zdCBuZXdQYXNzd29yZCA9IGV2ZW50LmZpZWxkc1snbmV3UGFzc3dvcmQnXTtcblxuICAgIHRoaXMuX3Jlc2V0UGFzc3dvcmRGb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5XT1JLSU5HKTtcblxuICAgIHRoaXMuYXV0aFNlcnZpY2VcbiAgICAgIC5yZXNldFBhc3N3b3JkKHtcbiAgICAgICAgZW1haWw6IHRoaXMucGVuZGluZ1Jlc2V0RW1haWwsXG4gICAgICAgIGNvZGUsXG4gICAgICAgIG5ld1Bhc3N3b3JkLFxuICAgICAgfSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fcmVzZXRQYXNzd29yZEZvcm1TdGF0ZS5zZXQoQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQpO1xuICAgICAgICAgIHRoaXMuc2hvd1RvYXN0KHRoaXMudCgncGFzc3dvcmRVcGRhdGVkJykpO1xuICAgICAgICAgIHRoaXMuY2xvc2VSZXNldFBhc3N3b3JkTW9kYWwoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgICAgdGhpcy5fcmVzZXRQYXNzd29yZEZvcm1TdGF0ZS5zZXQoQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQpO1xuICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyLCAncmVzZXQnKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICB9XG5cbiAgcmVzZW5kUmVzZXRDb2RlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlc2V0UmVzZW5kQ29vbGRvd24gPiAwKSByZXR1cm47XG5cbiAgICB0aGlzLmF1dGhTZXJ2aWNlXG4gICAgICAucmVzZW5kQ29kZSh7XG4gICAgICAgIGVtYWlsOiB0aGlzLnBlbmRpbmdSZXNldEVtYWlsLFxuICAgICAgICB0eXBlOiAnUEFTU1dPUkRfUkVTRVQnLFxuICAgICAgfSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zaG93VG9hc3QodGhpcy50KCdjb2RlU2VudCcpKTtcbiAgICAgICAgICB0aGlzLnN0YXJ0UmVzZXRSZXNlbmRDb29sZG93bigpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogZXJyID0+IHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGVyciwgJ3Jlc2V0Jyk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIRUxQRVJTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgaGFuZGxlTG9naW5TdWNjZXNzKG9hdXRoUHJvdmlkZXI/OiAnZ29vZ2xlJyB8ICdhcHBsZScgfCAnbWljcm9zb2Z0JyB8ICdmYWNlYm9vaycsIG1mYUNvbXBsZXRlZD86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNob3dUb2FzdCh0aGlzLnQoJ3dlbGNvbWUnKSk7XG5cbiAgICB0aGlzLm9uU3VjY2Vzcy5lbWl0KHtcbiAgICAgIHVzZXI6IHRoaXMuYXV0aFNlcnZpY2UudXNlcigpLFxuICAgICAgbWZhQ29tcGxldGVkLFxuICAgICAgb2F1dGhQcm92aWRlcixcbiAgICB9KTtcblxuICAgIGNvbnN0IHF1ZXJ5UmVkaXJlY3QgPSB0aGlzLnJlc29sdmVRdWVyeVJlZGlyZWN0KCk7XG4gICAgaWYgKHF1ZXJ5UmVkaXJlY3QpIHtcbiAgICAgIHZvaWQgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChxdWVyeVJlZGlyZWN0LCB7IHJlcGxhY2VVcmw6IHRydWUgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJvcHMucmVkaXJlY3RPblN1Y2Nlc3MpIHtcbiAgICAgIHZvaWQgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMucHJvcHMucmVkaXJlY3RPblN1Y2Nlc3NdLCB7IHJlcGxhY2VVcmw6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlUXVlcnlSZWRpcmVjdCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHF1ZXJ5UGFyYW0gPSB0aGlzLnByb3BzLnJlZGlyZWN0T25TdWNjZXNzUXVlcnlQYXJhbTtcbiAgICBpZiAoIXF1ZXJ5UGFyYW0pIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtTWFwLmdldChxdWVyeVBhcmFtKTtcbiAgICBpZiAoIXRhcmdldCB8fCAhdGFyZ2V0LnN0YXJ0c1dpdGgoJy8nKSB8fCB0YXJnZXQuc3RhcnRzV2l0aCgnLy8nKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBsb2dpblJvdXRlID0gdGhpcy5wcm9wcy5sb2dpblJvdXRlID8/ICcvbG9naW4nO1xuICAgIGlmICh0YXJnZXQgPT09IGxvZ2luUm91dGUgfHwgdGFyZ2V0LnN0YXJ0c1dpdGgoYCR7bG9naW5Sb3V0ZX0/YCkgfHwgdGFyZ2V0LnN0YXJ0c1dpdGgoYCR7bG9naW5Sb3V0ZX0vYCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRXJyb3IoZXJyOiB1bmtub3duLCBvcGVyYXRpb246IExvZ2luRXJyb3JFdmVudFsnb3BlcmF0aW9uJ10pOiB2b2lkIHtcbiAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5nZXRFcnJvck1lc3NhZ2UoZXJyKTtcbiAgICB0aGlzLnNob3dUb2FzdChtZXNzYWdlKTtcblxuICAgIHRoaXMub25FcnJvci5lbWl0KHtcbiAgICAgIGNvZGU6IChlcnIgYXMgeyBjb2RlPzogc3RyaW5nIH0pPy5jb2RlLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIG9wZXJhdGlvbixcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd1RvYXN0KG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudG9hc3RTZXJ2aWNlLnNob3coe1xuICAgICAgbWVzc2FnZSxcbiAgICAgIGR1cmF0aW9uOiAzNTAwLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFcnJvck1lc3NhZ2UoZXJyOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICBjb25zdCBlcnJvciA9IGVyciBhcyB7XG4gICAgICBlcnJvcj86IHsgbWVzc2FnZT86IHN0cmluZzsgY29kZT86IHN0cmluZyB9O1xuICAgICAgY29kZT86IHN0cmluZztcbiAgICB9O1xuXG4gICAgLy8gTWFwIGVycm9yIGNvZGVzIHRvIGkxOG4ga2V5c1xuICAgIGNvbnN0IGVycm9yS2V5TWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgLy8gU2lnbmluXG4gICAgICBBVVRIVjJfSU5WQUxJRF9DUkVERU5USUFMUzogJ2Vycm9ySW52YWxpZENyZWRlbnRpYWxzJyxcbiAgICAgIEFVVEhWMl9FTUFJTF9OT1RfVkVSSUZJRUQ6ICdlcnJvckVtYWlsTm90VmVyaWZpZWQnLFxuICAgICAgQVVUSFYyX0FDQ09VTlRfU1VTUEVOREVEOiAnZXJyb3JBY2NvdW50U3VzcGVuZGVkJyxcblxuICAgICAgLy8gU2lnbnVwXG4gICAgICBBVVRIVjJfRU1BSUxfRVhJU1RTOiAnZXJyb3JFbWFpbEV4aXN0cycsXG4gICAgICBBVVRIVjJfV0VBS19QQVNTV09SRDogJ2Vycm9yV2Vha1Bhc3N3b3JkJyxcblxuICAgICAgLy8gVmVyaWZpY2F0aW9uIGNvZGVzXG4gICAgICBBVVRIVjJfSU5WQUxJRF9DT0RFOiAnZXJyb3JJbnZhbGlkQ29kZScsXG4gICAgICBBVVRIVjJfRVhQSVJFRF9DT0RFOiAnZXJyb3JFeHBpcmVkQ29kZScsXG4gICAgICBBVVRIVjJfQ09ERV9FWFBJUkVEOiAnZXJyb3JFeHBpcmVkQ29kZScsXG4gICAgICBBVVRIVjJfVE9PX01BTllfQVRURU1QVFM6ICdlcnJvclRvb01hbnlBdHRlbXB0cycsXG5cbiAgICAgIC8vIE1GQVxuICAgICAgQVVUSFYyX01GQV9JTlZBTElEX0NPREU6ICdlcnJvck1GQUludmFsaWRDb2RlJyxcblxuICAgICAgLy8gT0F1dGhcbiAgICAgIFBPUFVQX0JMT0NLRUQ6ICdlcnJvclBvcHVwQmxvY2tlZCcsXG4gICAgICBPQVVUSF9GQUlMRUQ6ICdlcnJvck9BdXRoRmFpbGVkJyxcbiAgICB9O1xuXG4gICAgY29uc3QgZXJyb3JDb2RlID0gZXJyb3I/LmVycm9yPy5jb2RlIHx8IGVycm9yPy5jb2RlO1xuICAgIGlmIChlcnJvckNvZGUgJiYgZXJyb3JLZXlNYXBbZXJyb3JDb2RlXSkge1xuICAgICAgcmV0dXJuIHRoaXMudChlcnJvcktleU1hcFtlcnJvckNvZGVdKTtcbiAgICB9XG5cbiAgICBpZiAoZXJyb3I/LmVycm9yPy5tZXNzYWdlKSB7XG4gICAgICByZXR1cm4gZXJyb3IuZXJyb3IubWVzc2FnZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50KCdlcnJvckdlbmVyaWMnKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDT09MRE9XTiBUSU1FUlNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJpdmF0ZSBzdGFydFJlc2VuZENvb2xkb3duKCk6IHZvaWQge1xuICAgIHRoaXMucmVzZW5kQ29vbGRvd24gPSAzMDtcbiAgICB0aGlzLnJlc2VuZFRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5yZXNlbmRDb29sZG93bi0tO1xuICAgICAgaWYgKHRoaXMucmVzZW5kQ29vbGRvd24gPD0gMCkge1xuICAgICAgICB0aGlzLnN0b3BSZXNlbmRDb29sZG93bigpO1xuICAgICAgfVxuICAgIH0sIDEwMDApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wUmVzZW5kQ29vbGRvd24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVzZW5kVGltZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5yZXNlbmRUaW1lcik7XG4gICAgICB0aGlzLnJlc2VuZFRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5yZXNlbmRDb29sZG93biA9IDA7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0UmVzZXRSZXNlbmRDb29sZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2V0UmVzZW5kQ29vbGRvd24gPSAzMDtcbiAgICB0aGlzLnJlc2V0UmVzZW5kVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB0aGlzLnJlc2V0UmVzZW5kQ29vbGRvd24tLTtcbiAgICAgIGlmICh0aGlzLnJlc2V0UmVzZW5kQ29vbGRvd24gPD0gMCkge1xuICAgICAgICB0aGlzLnN0b3BSZXNldFJlc2VuZENvb2xkb3duKCk7XG4gICAgICB9XG4gICAgfSwgMTAwMCk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BSZXNldFJlc2VuZENvb2xkb3duKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlc2V0UmVzZW5kVGltZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5yZXNldFJlc2VuZFRpbWVyKTtcbiAgICAgIHRoaXMucmVzZXRSZXNlbmRUaW1lciA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMucmVzZXRSZXNlbmRDb29sZG93biA9IDA7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlT0F1dGhMb2FkaW5nUmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhck9BdXRoTG9hZGluZ1Jlc2V0VGltZXIoKTtcbiAgICB0aGlzLm9hdXRoTG9hZGluZ1Jlc2V0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaXNPQXV0aExvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMub2F1dGhMb2FkaW5nUmVzZXRUaW1lciA9IG51bGw7XG4gICAgfSwgNDVfMDAwKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJPQXV0aExvYWRpbmdSZXNldFRpbWVyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5vYXV0aExvYWRpbmdSZXNldFRpbWVyKSByZXR1cm47XG5cbiAgICBjbGVhclRpbWVvdXQodGhpcy5vYXV0aExvYWRpbmdSZXNldFRpbWVyKTtcbiAgICB0aGlzLm9hdXRoTG9hZGluZ1Jlc2V0VGltZXIgPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBsaXN0ZW5Gb3JPQXV0aFJldHVybigpOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwYWdlc2hvdycsIHRoaXMucmVzZXRPQXV0aExvYWRpbmdPblJldHVybik7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5yZXNldE9BdXRoTG9hZGluZ09uUmV0dXJuKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy5yZXNldE9BdXRoTG9hZGluZ09uUmV0dXJuKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcExpc3RlbmluZ0Zvck9BdXRoUmV0dXJuKCk6IHZvaWQge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BhZ2VzaG93JywgdGhpcy5yZXNldE9BdXRoTG9hZGluZ09uUmV0dXJuKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXMnLCB0aGlzLnJlc2V0T0F1dGhMb2FkaW5nT25SZXR1cm4pO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCB0aGlzLnJlc2V0T0F1dGhMb2FkaW5nT25SZXR1cm4pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5saXN0ZW5Gb3JPQXV0aFJldHVybigpO1xuXG4gICAgaWYgKHRoaXMucHJvcHMuaW5pdGlhbE9wZXJhdGlvbiA9PT0gJ3NpZ251cCcpIHtcbiAgICAgIHRoaXMuaXNSZWdpc3Rlck1vZGFsT3BlbiA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYXV0aFNlcnZpY2UubWZhUGVuZGluZygpLnJlcXVpcmVkKSB7XG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB0aGlzLm9wZW5NRkFWZXJpZnlNb2RhbCgpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW9uaWMgKGBJb25pY1JvdXRlU3RyYXRlZ3lgKSBubyBkZXN0cnV5ZSBsYSBww6FnaW5hIGRlIGxvZ2luIGFsIG5hdmVnYXJcbiAgICogYWZ1ZXJhIOKAlCBsYSBcImRldGFjaFwiLWVhIHkgbGEgcmV1dGlsaXphIHNpIGVsIHVzdWFyaW8gdnVlbHZlIGEgbGEgbWlzbWFcbiAgICogcnV0YSwgYXPDrSBxdWUgYG5nT25Jbml0YCBubyB2dWVsdmUgYSBjb3JyZXIuIGB2YWwtZm9ybWAgYXJtYSBzdVxuICAgKiBgRm9ybUdyb3VwYCBVTkEgc29sYSB2ZXogZW4gc3UgcHJvcGlvIGBuZ09uSW5pdGA7IHNpbiBlc3RlIGhvb2ssIGNlcnJhclxuICAgKiBzZXNpw7NuIHkgdm9sdmVyIGEgYC9sb2dpbmAgbW9zdHJhYmEgZWwgZW1haWwgeSBsYSBjb250cmFzZcOxYSBxdWUgbGFcbiAgICogc2VzacOzbiBhbnRlcmlvciBoYWLDrWEgdGVjbGVhZG8uXG4gICAqXG4gICAqIGBpb25WaWV3V2lsbEVudGVyYCBlcyBlbCBnYW5jaG8gZGUgSW9uaWMgcGVuc2FkbyBleGFjdGFtZW50ZSBwYXJhIGVzdG86XG4gICAqIGNvcnJlIGVuIENBREEgZW50cmFkYSBhIGxhIHZpc3RhLCBzZWEgbGEgcHJpbWVyYSB2ZXogbyB1bmEgcmV1dGlsaXphY2nDs25cbiAgICogZGVzZGUgY2FjaMOpLiBJb25pYyBsbyBpbnZvY2EgcG9yIGR1Y2stdHlwaW5nIHNvYnJlIGN1YWxxdWllciBjb21wb25lbnRlXG4gICAqIGRlIGxhIGplcmFycXXDrWEgcXVlIGxvIGRlY2xhcmUsIHNpbiBuZWNlc2lkYWQgZGUgaW1wbGVtZW50YXIgbGEgaW50ZXJmYXpcbiAgICogYFZpZXdXaWxsRW50ZXJgIChtaXNtbyBwYXRyw7NuIHF1ZSBgU2VsZWN0U2VhcmNoQ29tcG9uZW50YCBlbiBlc3RhIGxpYikuXG4gICAqL1xuICBpb25WaWV3V2lsbEVudGVyKCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybXM/LmZvckVhY2goKGYpID0+IGYucmVzZXRGb3JtKCkpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wUmVzZW5kQ29vbGRvd24oKTtcbiAgICB0aGlzLnN0b3BSZXNldFJlc2VuZENvb2xkb3duKCk7XG4gICAgdGhpcy5jbGVhck9BdXRoTG9hZGluZ1Jlc2V0VGltZXIoKTtcbiAgICB0aGlzLnN0b3BMaXN0ZW5pbmdGb3JPQXV0aFJldHVybigpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwidmFsLWxvZ2luXCIgW2NsYXNzLnZhbC1sb2dpbi0tY2FyZF09XCJjb25maWcuc2hvd0NhcmRcIj5cbiAgPCEtLSBMb2dvIOKAlCBkZWZhdWx0IGRlIG1hcmNhICgtLW1haW4tbG9nbykgc2kgZWwgY29uc3VtZXIgbm8gcGFzYSBsb2dvIC0tPlxuICA8ZGl2IGNsYXNzPVwibG9nby1jb250YWluZXJcIj5cbiAgICA8dmFsLWltYWdlIFtwcm9wc109XCJyZXNvbHZlZExvZ29cIiAvPlxuICA8L2Rpdj5cblxuICA8IS0tIExvZ2luIEZvcm0gLS0+XG4gIDx2YWwtZm9ybSBbcHJvcHNdPVwibG9naW5Gb3JtUHJvcHMoKVwiIChvblN1Ym1pdCk9XCJsb2dpbkhhbmRsZXIoJGV2ZW50KVwiIC8+XG5cbiAgPCEtLSBPQXV0aCBTZWN0aW9uIC0tPlxuICBAaWYgKGNvbmZpZy5zaG93T0F1dGggJiYgY29uZmlnLm9hdXRoUHJvdmlkZXJzLmxlbmd0aCA+IDApIHtcbiAgPGRpdiBjbGFzcz1cIm9hdXRoLXNlcGFyYXRvclwiPlxuICAgIDxzcGFuPnt7IHQoJ29yQ29udGludWVXaXRoJykgfX08L3NwYW4+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJvYXV0aC1idXR0b25zXCI+XG4gICAgQGZvciAocHJvdmlkZXIgb2YgY29uZmlnLm9hdXRoUHJvdmlkZXJzOyB0cmFjayBwcm92aWRlcikge1xuICAgIDx2YWwtYnV0dG9uXG4gICAgICBbcHJvcHNdPVwib2F1dGhCdXR0b25Qcm9wcyhwcm92aWRlcilcIlxuICAgICAgKG9uQ2xpY2spPVwibG9naW5XaXRoT0F1dGgocHJvdmlkZXIpXCJcbiAgICAvPlxuICAgIH1cbiAgPC9kaXY+XG4gIH1cblxuICA8IS0tIFJlZ2lzdGVyIExpbmsgLS0+XG4gIEBpZiAoY29uZmlnLnNob3dSZWdpc3Rlcikge1xuICA8ZGl2IGNsYXNzPVwiYXV0aC1saW5rXCI+XG4gICAgPGlvbi10ZXh0IGNvbG9yPVwiZGFya1wiPlxuICAgICAge3sgdCgnbm9BY2NvdW50JykgfX1cbiAgICAgIDxhIChjbGljayk9XCJvcGVuUmVnaXN0ZXJNb2RhbCgpXCI+e3sgdCgncmVnaXN0ZXInKSB9fTwvYT5cbiAgICA8L2lvbi10ZXh0PlxuICA8L2Rpdj5cbiAgfVxuXG4gIDwhLS0gRm9yZ290IFBhc3N3b3JkIExpbmsgLS0+XG4gIEBpZiAoY29uZmlnLnNob3dGb3Jnb3RQYXNzd29yZCkge1xuICA8ZGl2IGNsYXNzPVwiYXV0aC1saW5rIGZvcmdvdC1wYXNzd29yZFwiPlxuICAgIDxpb24tdGV4dCBjb2xvcj1cImRhcmtcIj5cbiAgICAgIHt7IHQoJ2ZvcmdvdExpbmsnKSB9fVxuICAgICAgPGEgKGNsaWNrKT1cIm9wZW5Gb3Jnb3RQYXNzd29yZE1vZGFsKClcIj57eyB0KCdyZWNvdmVyUGFzc3dvcmQnKSB9fTwvYT5cbiAgICA8L2lvbi10ZXh0PlxuICA8L2Rpdj5cbiAgfVxuXG4gIDwhLS0gTGVnYWwgTm90aWNlIC0tPlxuICBAaWYgKHByb3BzLmxlZ2FsKSB7XG4gIDxkaXYgY2xhc3M9XCJsZWdhbC1ub3RpY2VcIj5cbiAgICA8aW9uLXRleHQgY29sb3I9XCJkYXJrXCI+XG4gICAgICA8cD5cbiAgICAgICAge3sgdCgnbGVnYWxQcmVmaXgnKSB9fSBAaWYgKHJlc29sdmVkQ29tcGFueUxpbmspIHtcbiAgICAgICAgPGEgW2hyZWZdPVwicmVzb2x2ZWRDb21wYW55TGlua1wiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxuICAgICAgICAgID48c3Ryb25nPnt7IHByb3BzLmxlZ2FsLmNvbXBhbnlOYW1lIH19PC9zdHJvbmc+PC9hXG4gICAgICAgID5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxzdHJvbmc+e3sgcHJvcHMubGVnYWwuY29tcGFueU5hbWUgfX08L3N0cm9uZz5cbiAgICAgICAgfSB7eyB0KCdsZWdhbFN1ZmZpeCcpIH19IEBpZiAocHJvcHMubGVnYWwudGVybXNMaW5rKSB7XG4gICAgICAgIDxhIFtocmVmXT1cInByb3BzLmxlZ2FsLnRlcm1zTGlua1wiPnt7IHQoJ3Rlcm1zQW5kQ29uZGl0aW9ucycpIH19PC9hPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgPHNwYW4+e3sgdCgndGVybXNBbmRDb25kaXRpb25zJykgfX08L3NwYW4+XG4gICAgICAgIH0ge3sgdCgnYW5kJykgfX0gQGlmIChwcm9wcy5sZWdhbC5wcml2YWN5TGluaykge1xuICAgICAgICA8YSBbaHJlZl09XCJwcm9wcy5sZWdhbC5wcml2YWN5TGlua1wiPnt7IHQoJ3ByaXZhY3lQb2xpY3knKSB9fTwvYT5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxzcGFuPnt7IHQoJ3ByaXZhY3lQb2xpY3knKSB9fTwvc3Bhbj5cbiAgICAgICAgfS5cbiAgICAgIDwvcD5cbiAgICA8L2lvbi10ZXh0PlxuICA8L2Rpdj5cbiAgfVxuPC9kaXY+XG5cbjwhLS0gUmVnaXN0ZXIgTW9kYWwgLS0+XG48aW9uLW1vZGFsIFtpc09wZW5dPVwiaXNSZWdpc3Rlck1vZGFsT3BlblwiIChkaWREaXNtaXNzKT1cImNsb3NlUmVnaXN0ZXJNb2RhbCgpXCI+XG4gIDxuZy10ZW1wbGF0ZT5cbiAgICA8aW9uLWhlYWRlcj5cbiAgICAgIDxpb24tdG9vbGJhcj5cbiAgICAgICAgPGlvbi1idXR0b25zIHNsb3Q9XCJlbmRcIj5cbiAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBjb2xvcj1cImRhcmtcIiAoY2xpY2spPVwiY2xvc2VSZWdpc3Rlck1vZGFsKClcIj5cbiAgICAgICAgICAgIDxzdHJvbmc+e3sgdCgnY2xvc2UnKSB9fTwvc3Ryb25nPlxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9pb24tYnV0dG9ucz5cbiAgICAgIDwvaW9uLXRvb2xiYXI+XG4gICAgPC9pb24taGVhZGVyPlxuICAgIDxpb24tY29udGVudCBjbGFzcz1cImlvbi1wYWRkaW5nXCI+XG4gICAgICA8c2VjdGlvbiBjbGFzcz1cIm1vZGFsLWZvcm0tc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9nby1jb250YWluZXJcIj5cbiAgICAgICAgICA8dmFsLWltYWdlIFtwcm9wc109XCJyZXNvbHZlZExvZ29cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHZhbC1mb3JtIFtwcm9wc109XCJyZWdpc3RlckZvcm1Qcm9wcygpXCIgKG9uU3VibWl0KT1cInJlZ2lzdGVySGFuZGxlcigkZXZlbnQpXCIgLz5cbiAgICAgICAgPGRpdiBjbGFzcz1cImF1dGgtbGlua1wiPlxuICAgICAgICAgIDxpb24tdGV4dCBjb2xvcj1cImRhcmtcIj5cbiAgICAgICAgICAgIHt7IHQoJ2hhc0FjY291bnQnKSB9fVxuICAgICAgICAgICAgPGEgKGNsaWNrKT1cIm9uUmVnaXN0ZXJTd2l0Y2hUb0xvZ2luKClcIj57eyB0KCdzaWduSW4nKSB9fTwvYT5cbiAgICAgICAgICA8L2lvbi10ZXh0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvc2VjdGlvbj5cbiAgICA8L2lvbi1jb250ZW50PlxuICA8L25nLXRlbXBsYXRlPlxuPC9pb24tbW9kYWw+XG5cbjwhLS0gVmVyaWZ5IEVtYWlsIE1vZGFsIC0tPlxuPGlvbi1tb2RhbCBbaXNPcGVuXT1cImlzVmVyaWZ5TW9kYWxPcGVuXCIgW2JhY2tkcm9wRGlzbWlzc109XCJmYWxzZVwiPlxuICA8bmctdGVtcGxhdGU+XG4gICAgPGlvbi1oZWFkZXI+XG4gICAgICA8aW9uLXRvb2xiYXI+XG4gICAgICAgIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCI+XG4gICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgKGNsaWNrKT1cImNsb3NlVmVyaWZ5TW9kYWwoKVwiPlxuICAgICAgICAgICAgPHN0cm9uZz57eyB0KCdjbG9zZScpIH19PC9zdHJvbmc+XG4gICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8L2lvbi1idXR0b25zPlxuICAgICAgPC9pb24tdG9vbGJhcj5cbiAgICA8L2lvbi1oZWFkZXI+XG4gICAgPGlvbi1jb250ZW50IGNsYXNzPVwiaW9uLXBhZGRpbmdcIj5cbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwibW9kYWwtZm9ybS1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2dvLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDx2YWwtaW1hZ2UgW3Byb3BzXT1cInJlc29sdmVkTG9nb1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8dmFsLWZvcm0gW3Byb3BzXT1cInZlcmlmeUZvcm1Qcm9wcygpXCIgKG9uU3VibWl0KT1cInZlcmlmeUhhbmRsZXIoJGV2ZW50KVwiIC8+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXNlbmQtbGlua1wiPlxuICAgICAgICAgIDxpb24tdGV4dCBjb2xvcj1cImRhcmtcIj5cbiAgICAgICAgICAgIHt7IHQoJ25vQ29kZVJlY2VpdmVkJykgfX0gQGlmIChyZXNlbmRDb29sZG93biA+IDApIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29vbGRvd25cIj57eyB0KCdyZXNlbmRJbicsIHsgc2Vjb25kczogcmVzZW5kQ29vbGRvd24udG9TdHJpbmcoKSB9KSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPGEgKGNsaWNrKT1cInJlc2VuZENvZGUoKVwiPnt7IHQoJ3Jlc2VuZCcpIH19PC9hPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zZWN0aW9uPlxuICAgIDwvaW9uLWNvbnRlbnQ+XG4gIDwvbmctdGVtcGxhdGU+XG48L2lvbi1tb2RhbD5cblxuPCEtLSBGb3Jnb3QgUGFzc3dvcmQgTW9kYWwgLS0+XG48aW9uLW1vZGFsIFtpc09wZW5dPVwiaXNGb3Jnb3RQYXNzd29yZE1vZGFsT3BlblwiIChkaWREaXNtaXNzKT1cImNsb3NlRm9yZ290UGFzc3dvcmRNb2RhbCgpXCI+XG4gIDxuZy10ZW1wbGF0ZT5cbiAgICA8aW9uLWhlYWRlcj5cbiAgICAgIDxpb24tdG9vbGJhcj5cbiAgICAgICAgPGlvbi1idXR0b25zIHNsb3Q9XCJlbmRcIj5cbiAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBjb2xvcj1cImRhcmtcIiAoY2xpY2spPVwiY2xvc2VGb3Jnb3RQYXNzd29yZE1vZGFsKClcIj5cbiAgICAgICAgICAgIDxzdHJvbmc+e3sgdCgnY2xvc2UnKSB9fTwvc3Ryb25nPlxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9pb24tYnV0dG9ucz5cbiAgICAgIDwvaW9uLXRvb2xiYXI+XG4gICAgPC9pb24taGVhZGVyPlxuICAgIDxpb24tY29udGVudCBjbGFzcz1cImlvbi1wYWRkaW5nXCI+XG4gICAgICA8c2VjdGlvbiBjbGFzcz1cIm1vZGFsLWZvcm0tc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9nby1jb250YWluZXJcIj5cbiAgICAgICAgICA8dmFsLWltYWdlIFtwcm9wc109XCJyZXNvbHZlZExvZ29cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHZhbC1mb3JtIFtwcm9wc109XCJmb3Jnb3RQYXNzd29yZEZvcm1Qcm9wcygpXCIgKG9uU3VibWl0KT1cImZvcmdvdFBhc3N3b3JkSGFuZGxlcigkZXZlbnQpXCIgLz5cbiAgICAgIDwvc2VjdGlvbj5cbiAgICA8L2lvbi1jb250ZW50PlxuICA8L25nLXRlbXBsYXRlPlxuPC9pb24tbW9kYWw+XG5cbjwhLS0gUmVzZXQgUGFzc3dvcmQgTW9kYWwgLS0+XG48aW9uLW1vZGFsIFtpc09wZW5dPVwiaXNSZXNldFBhc3N3b3JkTW9kYWxPcGVuXCIgW2JhY2tkcm9wRGlzbWlzc109XCJmYWxzZVwiPlxuICA8bmctdGVtcGxhdGU+XG4gICAgPGlvbi1oZWFkZXI+XG4gICAgICA8aW9uLXRvb2xiYXI+XG4gICAgICAgIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCI+XG4gICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgKGNsaWNrKT1cImNsb3NlUmVzZXRQYXNzd29yZE1vZGFsKClcIj5cbiAgICAgICAgICAgIDxzdHJvbmc+e3sgdCgnY2xvc2UnKSB9fTwvc3Ryb25nPlxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9pb24tYnV0dG9ucz5cbiAgICAgIDwvaW9uLXRvb2xiYXI+XG4gICAgPC9pb24taGVhZGVyPlxuICAgIDxpb24tY29udGVudCBjbGFzcz1cImlvbi1wYWRkaW5nXCI+XG4gICAgICA8c2VjdGlvbiBjbGFzcz1cIm1vZGFsLWZvcm0tc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9nby1jb250YWluZXJcIj5cbiAgICAgICAgICA8dmFsLWltYWdlIFtwcm9wc109XCJyZXNvbHZlZExvZ29cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHZhbC1mb3JtIFtwcm9wc109XCJyZXNldFBhc3N3b3JkRm9ybVByb3BzKClcIiAob25TdWJtaXQpPVwicmVzZXRQYXNzd29yZEhhbmRsZXIoJGV2ZW50KVwiIC8+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXNlbmQtbGlua1wiPlxuICAgICAgICAgIDxpb24tdGV4dCBjb2xvcj1cImRhcmtcIj5cbiAgICAgICAgICAgIHt7IHQoJ25vQ29kZVJlY2VpdmVkJykgfX0gQGlmIChyZXNldFJlc2VuZENvb2xkb3duID4gMCkge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb29sZG93blwiPnt7IHQoJ3Jlc2VuZEluJywgeyBzZWNvbmRzOiByZXNldFJlc2VuZENvb2xkb3duLnRvU3RyaW5nKCkgfSkgfX08L3NwYW4+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxhIChjbGljayk9XCJyZXNlbmRSZXNldENvZGUoKVwiPnt7IHQoJ3Jlc2VuZCcpIH19PC9hPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zZWN0aW9uPlxuICAgIDwvaW9uLWNvbnRlbnQ+XG4gIDwvbmctdGVtcGxhdGU+XG48L2lvbi1tb2RhbD5cblxuPCEtLSBNRkEgVmVyaWZ5IE1vZGFsIC0tPlxuPGlvbi1tb2RhbCBbaXNPcGVuXT1cImlzTUZBVmVyaWZ5TW9kYWxPcGVuXCIgW2JhY2tkcm9wRGlzbWlzc109XCJmYWxzZVwiIChkaWREaXNtaXNzKT1cIm9uTUZBVmVyaWZ5RGlzbWlzc2VkKClcIj5cbiAgPG5nLXRlbXBsYXRlPlxuICAgIDxpb24taGVhZGVyPlxuICAgICAgPGlvbi10b29sYmFyPlxuICAgICAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiPlxuICAgICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwiZGFya1wiIChjbGljayk9XCJjbG9zZU1GQVZlcmlmeU1vZGFsKClcIj5cbiAgICAgICAgICAgIDxzdHJvbmc+e3sgdCgnY2xvc2UnKSB9fTwvc3Ryb25nPlxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9pb24tYnV0dG9ucz5cbiAgICAgIDwvaW9uLXRvb2xiYXI+XG4gICAgPC9pb24taGVhZGVyPlxuICAgIDxpb24tY29udGVudCBjbGFzcz1cImlvbi1wYWRkaW5nXCI+XG4gICAgICA8c2VjdGlvbiBjbGFzcz1cIm1vZGFsLWZvcm0tc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9nby1jb250YWluZXJcIj5cbiAgICAgICAgICA8dmFsLWltYWdlIFtwcm9wc109XCJyZXNvbHZlZExvZ29cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHZhbC1mb3JtIFtwcm9wc109XCJtZmFWZXJpZnlGb3JtUHJvcHMoKVwiIChvblN1Ym1pdCk9XCJ2ZXJpZnlNRkFIYW5kbGVyKCRldmVudClcIiAvPlxuICAgICAgICBAaWYgKG1mYU1ldGhvZCgpID09PSAnVE9UUCcpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInJlc2VuZC1saW5rXCI+XG4gICAgICAgICAgPGlvbi10ZXh0IGNvbG9yPVwiZGFya1wiPlxuICAgICAgICAgICAgQGlmIChtZmFVc2VCYWNrdXBDb2RlKCkpIHtcbiAgICAgICAgICAgIDxhIChjbGljayk9XCJ0b2dnbGVNRkFCYWNrdXBDb2RlKClcIj57eyB0KCdtZmFVc2VUb3RwQWN0aW9uJykgfX08L2E+XG4gICAgICAgICAgICB9IEBlbHNlIHsge3sgdCgnbWZhVXNlQmFja3VwTGluaycpIH19XG4gICAgICAgICAgICA8YSAoY2xpY2spPVwidG9nZ2xlTUZBQmFja3VwQ29kZSgpXCI+e3sgdCgnbWZhVXNlQmFja3VwQWN0aW9uJykgfX08L2E+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9pb24tdGV4dD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlc2VuZC1saW5rXCI+XG4gICAgICAgICAgPGlvbi10ZXh0IGNvbG9yPVwiZGFya1wiPlxuICAgICAgICAgICAge3sgdCgnbWZhTG9zdEJhY2t1cExpbmsnKSB9fVxuICAgICAgICAgICAgPGEgKGNsaWNrKT1cIm9wZW5NRkFSZXNldE1vZGFsKClcIj57eyB0KCdtZmFSZXNldEFjdGlvbicpIH19PC9hPlxuICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zZWN0aW9uPlxuICAgIDwvaW9uLWNvbnRlbnQ+XG4gIDwvbmctdGVtcGxhdGU+XG48L2lvbi1tb2RhbD5cblxuPCEtLSBNRkEgUmVzZXQgTW9kYWwgKEIpIOKAlCByZWNvdmVyeSBwb3IgZW1haWwgY3VhbmRvIG5vIGhheSBiYWNrdXAgY29kZXMgLS0+XG48aW9uLW1vZGFsIFtpc09wZW5dPVwiaXNNRkFSZXNldE1vZGFsT3BlblwiIFtiYWNrZHJvcERpc21pc3NdPVwiZmFsc2VcIiAoZGlkRGlzbWlzcyk9XCJjbG9zZU1GQVJlc2V0TW9kYWwoKVwiPlxuICA8bmctdGVtcGxhdGU+XG4gICAgPGlvbi1oZWFkZXI+XG4gICAgICA8aW9uLXRvb2xiYXI+XG4gICAgICAgIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCI+XG4gICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgKGNsaWNrKT1cImNsb3NlTUZBUmVzZXRNb2RhbCgpXCI+XG4gICAgICAgICAgICA8c3Ryb25nPnt7IHQoJ2Nsb3NlJykgfX08L3N0cm9uZz5cbiAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIDwvaW9uLWJ1dHRvbnM+XG4gICAgICA8L2lvbi10b29sYmFyPlxuICAgIDwvaW9uLWhlYWRlcj5cbiAgICA8aW9uLWNvbnRlbnQgY2xhc3M9XCJpb24tcGFkZGluZ1wiPlxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJtb2RhbC1mb3JtLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxvZ28tY29udGFpbmVyXCI+XG4gICAgICAgICAgPHZhbC1pbWFnZSBbcHJvcHNdPVwicmVzb2x2ZWRMb2dvXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIEBpZiAobWZhUmVzZXRTdGVwKCkgPT09ICdyZXF1ZXN0Jykge1xuICAgICAgICA8dmFsLWZvcm0gW3Byb3BzXT1cIm1mYVJlc2V0UmVxdWVzdEZvcm1Qcm9wcygpXCIgKG9uU3VibWl0KT1cIm1mYVJlc2V0UmVxdWVzdEhhbmRsZXIoJGV2ZW50KVwiIC8+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8dmFsLWZvcm0gW3Byb3BzXT1cIm1mYVJlc2V0Q29uZmlybUZvcm1Qcm9wcygpXCIgKG9uU3VibWl0KT1cIm1mYVJlc2V0Q29uZmlybUhhbmRsZXIoJGV2ZW50KVwiIC8+XG4gICAgICAgIH1cbiAgICAgIDwvc2VjdGlvbj5cbiAgICA8L2lvbi1jb250ZW50PlxuICA8L25nLXRlbXBsYXRlPlxuPC9pb24tbW9kYWw+XG4iXX0=