@posiwise/smart-crm 0.0.28 → 0.0.30
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.
- package/esm2022/index.mjs +2 -1
- package/esm2022/lib/private/components/smart-crm-accounts/smart-crm-account-details/smart-crm-account-details.component.mjs +4 -4
- package/esm2022/lib/private/components/smart-crm-accounts/smart-crm-account-files/smart-crm-account-files.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-accounts/smart-crm-account-info/smart-crm-account-info.component.mjs +9 -5
- package/esm2022/lib/private/components/smart-crm-accounts/smart-crm-account-invoices/smart-crm-account-invoices.component.mjs +92 -0
- package/esm2022/lib/private/components/smart-crm-accounts/smart-crm-accounts.component.mjs +6 -7
- package/esm2022/lib/private/components/smart-crm-configuration/smart-crm-actions/smart-crm-actions-details/smart-crm-actions-details.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-configuration/smart-crm-actions/smart-crm-actions.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-configuration/smart-crm-opportunity-categories/smart-crm-opportunity-categories-details/smart-crm-opportunity-categories-details.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-configuration/smart-crm-opportunity-categories/smart-crm-opportunity-categories.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-configuration/smart-crm-source/smart-crm-source-details/smart-crm-source-details.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-configuration/smart-crm-source/smart-crm-source.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-configuration/smart-crm-stages/smart-crm-stage-details/smart-crm-stage-details.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-configuration/smart-crm-stages/smart-crm-stages.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-configuration/smart-crm-widgets/smart-crm-widgets-details/smart-crm-widgets-details.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-configuration/smart-crm-widgets/smart-crm-widgets.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-contacts/smart-crm-contact-details/smart-crm-contact-details.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-contacts/smart-crm-contact-info/smart-crm-contact-info.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-contacts/smart-crm-contacts.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-leads/smart-crm-leads-details/smart-crm-leads-details.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-leads/smart-crm-leads.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-marketing/smart-crm-marketing-list/smart-crm-marketing-details/smart-crm-marketing-details.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-marketing/smart-crm-marketing-list/smart-crm-marketing-list.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-marketing/smart-crm-marketing.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-opportunities/smart-crm-board/smart-crm-board.component.mjs +8 -6
- package/esm2022/lib/private/components/smart-crm-opportunities/smart-crm-opportunities-list/smart-crm-opportunities-details/smart-crm-opportunities-details.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-opportunities/smart-crm-opportunities-list/smart-crm-opportunities-info/smart-crm-opportunities-info.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-opportunities/smart-crm-opportunities-list/smart-crm-opportunities-list.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-summary/smart-crm-summary-actions/smart-crm-summary-actions.component.mjs +5 -4
- package/esm2022/lib/private/components/smart-crm-summary/smart-crm-summary-others/smart-crm-summary-others.component.mjs +40 -3
- package/esm2022/lib/private/smart-crm-private.module.mjs +6 -1
- package/esm2022/lib/public/components/smart-crm-signup/smart-crm-signup.component.mjs +3 -3
- package/esm2022/lib/shared/models/smart-crm.model.mjs +4 -4
- package/fesm2022/posiwise-smart-crm.mjs +191 -71
- package/fesm2022/posiwise-smart-crm.mjs.map +1 -1
- package/index.d.ts +1 -0
- package/lib/private/components/smart-crm-accounts/smart-crm-account-info/smart-crm-account-info.component.d.ts +1 -0
- package/lib/private/components/smart-crm-accounts/smart-crm-account-invoices/smart-crm-account-invoices.component.d.ts +32 -0
- package/lib/private/components/smart-crm-accounts/smart-crm-accounts.component.d.ts +1 -1
- package/lib/private/components/smart-crm-opportunities/smart-crm-board/smart-crm-board.component.d.ts +1 -0
- package/lib/private/components/smart-crm-summary/smart-crm-summary-actions/smart-crm-summary-actions.component.d.ts +1 -0
- package/lib/private/components/smart-crm-summary/smart-crm-summary-others/smart-crm-summary-others.component.d.ts +7 -0
- package/lib/private/smart-crm-private.module.d.ts +40 -39
- package/package.json +1 -1
|
@@ -466,7 +466,7 @@ export class SmartCrmOpportunitiesInfoComponent extends AppBaseComponent {
|
|
|
466
466
|
super.ngOnDestroy();
|
|
467
467
|
}
|
|
468
468
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartCrmOpportunitiesInfoComponent, deps: [{ token: i0.Injector }, { token: i1.CrmService }, { token: i2.NgbModal }, { token: i3.AuthService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
469
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: SmartCrmOpportunitiesInfoComponent, selector: "pw-smart-crm-opportunities-info", usesInheritance: true, ngImport: i0, template: "<div class=\"row\">\n <div class=\"col-12 mb-0\">\n <div class=\"me-auto mb-0\">\n <h2 class=\"mb-0\">\n <a href=\"javascript:void(0)\"\n (click)=\"back()\"\n class=\"previous\"><i class=\"fa fa-arrow-alt-circle-left\" aria-hidden=\"true\"></i></a>\n Opportunity Info\n </h2>\n </div>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"user-info p-3 card pb-0 h-auto\">\n <div class=\"mb-2 text-center\">\n <a class=\"profile-image\">\n <img width=\"100\"\n height=\"100\"\n class=\"rounded-circle img-border width-100\"\n alt=\"user\"\n src=\"assets/img/icons/male.png\" />\n </a>\n </div>\n <div class=\"mb-4 d-flex justify-content-between align-items-center\">\n <h4 class=\"d-inline-block\">\n About <span *ngIf=\"data?.id\">{{ data.title }}</span>\n </h4>\n <a href=\"javascript:void(0);\"\n *ngIf=\"isFormEdit\"\n class=\"btn btn-sm btn-outline-primary float-end\"\n (click)=\"\n isFormEdit = !isFormEdit; getAccountsBySubscription(); getAllContacts()\n \">Edit</a>\n </div>\n <form [formGroup]=\"aboutControls\"\n [class.isDisabled]=\"isFormEdit\">\n <div class=\"mb-3\">\n <label class=\"label mb-0\">{{\n 'Crm.OpportunitiesMessage.Title' | transloco\n }}</label>\n <input type=\"text\"\n class=\"form-control rounded-0 ps-1 user-value\"\n formControlName=\"title\"\n [ngClass]=\"{ 'is-invalid': submitted && f['title'].errors }\" />\n </div>\n <div class=\"mb-3 ui-fluid skills-modal\"\n *ngIf=\"data?.crm_contact_id\">\n <label class=\"label mb-2\">{{\n 'Crm.OpportunitiesMessage.Contact' | transloco\n }}</label>\n <a [routerLink]=\"[\n '/' + subscription?.slug + routers.contactInfo,\n data.crm_contact_id\n ]\"\n class=\"form-control d-block pb-2 ps-1 user-value\"\n *ngIf=\"isFormEdit && data?.crm_contact_id\">{{ data?.crm_contact?.first_name }} {{ data?.crm_contact?.last_name }}</a>\n <p-autoComplete *ngIf=\"!isFormEdit || !data?.crm_contact_id\"\n [suggestions]=\"filteredContacts\"\n formControlName=\"crm_contact_id\"\n dataKey=\"id\"\n field=\"displayName\"\n [dropdown]=\"true\"\n (completeMethod)=\"onContactSearch($event)\"\n styleClass=\"w-100\"\n placeholder=\"Search contacts\"\n [multiple]=\"false\">\n </p-autoComplete>\n </div>\n <div class=\"mb-3 ui-fluid skills-modal\">\n <label class=\"label mb-2\">{{\n 'Crm.OpportunitiesMessage.Account' | transloco\n }}</label>\n <a [routerLink]=\"[\n '/' + subscription?.slug + routers.accountInfo,\n data.crm_account_id\n ]\"\n class=\"form-control d-block pb-2 ps-1 user-value\"\n *ngIf=\"isFormEdit && data?.crm_account_id\">{{ data?.crm_account?.name }}</a>\n <p-autoComplete *ngIf=\"!isFormEdit || !data?.crm_account_id\"\n [suggestions]=\"filteredAccounts\"\n formControlName=\"crm_account_id\"\n dataKey=\"id\"\n field=\"name\"\n [dropdown]=\"true\"\n (completeMethod)=\"accountSearch($event)\"\n styleClass=\"w-100\"\n placeholder=\"Search accounts\"\n [multiple]=\"false\">\n </p-autoComplete>\n </div>\n <div class=\"mb-3\">\n <label class=\"label mb-0\">{{\n 'Crm.OpportunitiesMessage.OneTimeAmount' | transloco\n }}</label>\n <span class=\"form-control d-block pb-2 ps-1 user-value\"\n *ngIf=\"isFormEdit && data?.one_time_amount\">{{ data?.one_time_amount | currency }}</span>\n <input *ngIf=\"!isFormEdit || !data?.one_time_amount\"\n type=\"number\"\n numbersOnly\n class=\"form-control rounded-0 ps-1 user-value\"\n formControlName=\"one_time_amount\"\n id=\"one_time_amount\"\n [ngClass]=\"{ 'is-invalid': submitted && f['one_time_amount'].errors }\" />\n </div>\n <div class=\"mb-3\">\n <label class=\"label mb-0\">{{\n 'Crm.OpportunitiesMessage.MonthlyAmount' | transloco\n }}</label>\n <span class=\"form-control d-block pb-2 ps-1 user-value\"\n *ngIf=\"isFormEdit && data?.monthly_amount\">{{ data?.monthly_amount | currency }}</span>\n <input *ngIf=\"!isFormEdit || !data?.monthly_amount\"\n type=\"number\"\n numbersOnly\n class=\"form-control rounded-0 ps-1 user-value\"\n formControlName=\"monthly_amount\"\n id=\"monthly_amount\"\n [ngClass]=\"{ 'is-invalid': submitted && f['monthly_amount'].errors }\" />\n </div>\n <div *ngIf=\"!isFormEdit\"\n class=\"text-end form-action-buttons\">\n <input type=\"button\"\n class=\"btn btn-outline-primary\"\n (click)=\"isFormEdit = !isFormEdit; getOpportunityDetails()\"\n value=\"Cancel\" />\n <input type=\"button\"\n class=\"btn btn-primary ms-3\"\n value=\"Submit\"\n (click)=\"updateOpportunities()\" />\n </div>\n </form>\n </div>\n </div>\n <div class=\"col-12 col-md-8\">\n <ul ngbNav\n #nav=\"ngbNav\"\n class=\"nav-tabs\">\n <li [ngbNavItem]=\"1\">\n <a ngbNavLink>Notes</a>\n <ng-template ngbNavContent>\n <form [formGroup]=\"actionControls\"\n (ngSubmit)=\"onCommentSave()\">\n <textarea class=\"form-control\"\n formControlName=\"comment\"\n rows=\"6\"></textarea>\n <p class=\"text-danger\"\n *ngIf=\"\n actionControls.get('comment').touched &&\n actionControls.get('comment').invalid\n \">\n Note Required\n </p>\n <div *ngIf=\"actions?.length\"\n class=\"d-block clear-both pt-3\">\n <ng-container *ngFor=\"let action of actions; index as i\">\n <button *ngIf=\"action.visible\"\n type=\"button\"\n [class.active]=\"\"\n class=\"btn btn-sm me-2 btn-outline-primary mb-2 action-btn\"\n (click)=\"showDatePicker($event, action.id); d.toggle()\">\n {{ action.name }}\n </button>\n </ng-container>\n <div class=\"text-danger\"\n *ngIf=\"submitAction && actionFormControls.crm_action_id.invalid\">\n Please select an action\n </div>\n <div class=\"row mt-3\">\n <div class=\"col-12 col-sm-4\">\n <div class=\"input-group\">\n <input class=\"form-control\"\n placeholder=\"dd-mmm-yyyy\"\n formControlName=\"when\"\n ngbDatepicker\n #d=\"ngbDatepicker\"\n (click)=\"d.toggle()\" />\n </div>\n </div>\n <div class=\"col-sm-4 pe-0 completed-toggle\">\n <div class=\"mb-3\">\n <ui-switch checkedLabel=\"completed\"\n uncheckedLabel=\"open\"\n formControlName=\"completed\"\n name=\"completed\">\n </ui-switch>\n </div>\n </div>\n </div>\n </div>\n <div class=\"float-end\">\n <button type=\"submit\"\n [buttonBusy]=\"buttonBusy\"\n [disabled]=\"buttonDisable\"\n class=\"btn btn-primary mt-2 mb-2 float-end\"\n >Submit Note</button>\n <a class=\"btn btn-outline-primary mt-2 mb-2 me-0 me-sm-2 float-end\"\n (click)=\"openModal(content)\">{{ 'Upload file' | transloco }}</a>\n </div>\n <div *ngIf=\"buttonDisable\"\n class=\"no-actions pt-4\">\n <pw-no-data [withImage]=\"true\" [message]=\"\n 'Crm.OpportunitiesMessage.NoActionsInOpportunitiesInfoMessage'\n | transloco\n \">\n </pw-no-data>\n </div>\n </form>\n <div class=\"w-100 text-center mt-3\"\n *ngIf=\"!isLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </div>\n <div *ngIf=\"!opportunitiesComments?.length && isLoaded\"\n class=\"no-actions pt-3\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.OpportunitiesMessage.NoActionsMessage' | transloco\">\n </pw-no-data>\n </div>\n <div *ngIf=\"opportunitiesComments?.length\"\n id=\"timeline\"\n class=\"pt-3 clear-both timeline-center timeline-wrapper\">\n <ul class=\"timeline\">\n <li class=\"timeline-line\"></li>\n </ul>\n <ul class=\"timeline\">\n <li class=\"timeline-line\"></li>\n <li class=\"timeline-item\"\n [ngClass]=\"{ 'mt-5': odd }\"\n *ngFor=\"\n let item of opportunitiesComments;\n index as i;\n let odd = odd;\n let even = even\n \">\n <div class=\"timeline-badge\">\n <span class=\"bg-red bg-lighten-1\">\n <span class=\"timeline-year\">\n <span class=\"d-block date-year\">{{\n item.when | date: 'medium' | slice: 0:3\n }}</span>\n <span>{{ item.year }}</span>\n </span>\n </span>\n </div>\n <div class=\"timeline-card shadow card pb-0 rounded border-grey border-lighten-2 position-static\">\n <div class=\"card-header py-4\">\n <div class=\"mb-0 clearfix\">\n <textarea type=\"text\"\n name=\"comment\"\n class=\"comment-field form-control p-0\"\n [(ngModel)]=\"item.comment\">{{ item.comment }}</textarea>\n <p class=\"float-start mb-0\"\n *ngIf=\"!showFullComment || item.id !== commentId\">\n {{ item.comment | slice: 0:170\n }}<a *ngIf=\"item.comment.length > 170\"\n class=\"text-secondary\"\n (click)=\"\n showFullComment = true; commentId = item.id\n \">...show more</a>\n </p>\n <p class=\"float-start mb-0\"\n *ngIf=\"showFullComment && item.id === commentId\">\n {{ item.comment }}\n <a *ngIf=\"\n item.comment.length > 170 && showFullComment\n \"\n (click)=\"showFullComment = false\"\n class=\"text-secondary\">...show less</a>\n </p>\n <button class=\"btn btn-md edit-btn float-end py-0\"\n (click)=\"showEditControls($event)\"\n *ngIf=\"userId === item.owner_id || hasAccess\">\n <i\n class=\"fa fa-edit edit-icon\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n <div class=\"card-subtitle text-muted my-0 clearfix\">\n <div class=\"float-start\">\n <span *ngIf=\"!updating || actionId !== item.id\"\n class=\"font-small-3\">\n {{ item.when }}</span>\n <input *ngIf=\"updating && actionId === item.id\"\n placeholder=\"dd-mmm-yyyy\"\n value=\"{{ item.when }}\"\n ngbDatepicker\n #d=\"ngbDatepicker\"\n (focus)=\"d.toggle()\"\n (dateSelect)=\"onDateSelect($event, item)\" />\n </div>\n <button type=\" button\"\n class=\"btn btn-sm float-end when-btn py-0\"\n *ngIf=\"userId === item.owner_id || hasAccess\"\n (click)=\"showDatePickerUpdate(item.id)\">\n <i\n class=\"fa fa-edit edit-icon\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n <p [class.text-danger]=\"!item.color\"\n *ngIf=\"!item.cancelled && !item.completed\"\n class=\"mb-0\">\n {{ item.due }}\n </p>\n <p>\n {{\n item?.owner?.first_name +\n ' ' +\n item?.owner?.last_name\n }}\n </p>\n <span class=\"badge bg-primary\">{{\n item?.crm_action?.name\n }}</span>\n <span *ngIf=\"\n !item.completed &&\n (userId === item.owner_id || hasAccess)\n \"\n class=\"badge bg-success ms-2\">Open</span>\n <a *ngIf=\"\n !item.completed &&\n (userId === item.owner_id || hasAccess)\n \"\n ngbTooltip=\"Set as completed\"\n class=\"me-3 ms-3\"\n href=\"javascript:void(0);\"\n (click)=\"\n setAsCompletedOrUncompleted(\n item.id,\n item,\n item.completed\n )\n \">\n <i class=\"fa fa-tasks completed\" aria-hidden=\"true\"></i>\n </a>\n <a *ngIf=\"\n !item.cancelled &&\n !item.completed &&\n (userId === item.owner_id || hasAccess)\n \"\n ngbTooltip=\"Set as cancelled\"\n href=\"javascript:void(0);\"\n (click)=\"setAsCancelled(item.id, item)\">\n <i\n class=\"fa fa-times delete-icon\"\n aria-hidden=\"true\"\n ></i>\n </a>\n <a *ngIf=\"\n item.completed &&\n (userId === item.owner_id || hasAccess)\n \"\n ngbTooltip=\"Set as UnCompleted\"\n href=\"javascript:void(0);\"\n (click)=\"\n setAsCompletedOrUncompleted(\n item.id,\n item,\n item.completed\n )\n \"\n class=\"ms-2\">\n <i class=\"far fa-window-close\" aria-hidden=\"true\"></i>\n </a>\n <div class=\"control-btns mt-3 text-end\">\n <button type=\"button\"\n class=\"btn btn-sm btn-outline-default me-2\"\n (click)=\"showEditControls(undefined)\">\n Cancel\n </button>\n <button class=\"btn btn-sm btn-primary\"\n type=\"button\"\n (click)=\"updateComment(item)\">\n Submit\n </button>\n </div>\n </div>\n </div>\n </li>\n </ul>\n </div>\n </ng-template>\n </li>\n <li [ngbNavItem]=\"2\">\n <a ngbNavLink>Versioning</a>\n <ng-template ngbNavContent>\n <div *ngFor=\"let version of opportunitiesVersioning\">\n <p>\n <strong>Event: </strong>{{ version.event }} | <strong>Author: </strong><a *ngIf=\"version?.author\"\n [routerLink]=\"['/members', version?.author?.slug]\">{{ version?.author | ifNameNullShowEmail }}</a>\n | <strong>Created at: </strong>{{ version.created_at }}<br />\n <strong>Object: </strong>{{ version.object | json }}\n </p>\n <hr />\n </div>\n <div *ngIf=\"opportunitiesVersioning?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.OpportunitiesMessage.NoVersionsMessage' | transloco\">\n </pw-no-data>\n </div>\n </ng-template>\n </li>\n <li [ngbNavItem]=\"3\">\n <a ngbNavLink>Files</a>\n <ng-template ngbNavContent>\n <pw-smart-crm-company-files [contactId]=\"contactId\"\n [accountId]=\"accountId\"\n [opportunityId]=\"opportunitiesId\">\n </pw-smart-crm-company-files>\n </ng-template>\n </li>\n </ul>\n\n <div [ngbNavOutlet]=\"nav\"></div>\n </div>\n</div>\n\n<ng-template #content\n let-modal>\n <div class=\"modal-header\">\n <h3 class=\"modal-title mb-0 p-0\">{{ 'Upload File' | transloco }}</h3>\n <button type=\"button\"\n class=\"btn-close float-end\"\n aria-label=\"Close\"\n (click)=\"modal.dismiss()\">\n\n </button>\n </div>\n <div class=\"modal-body\">\n <small> {{ 'User.Profile.PictureMessage' | transloco }}</small>\n <div class=\"row p-2\">\n <div class=\"col-12\">\n <div class=\"upload-box\">\n <div class=\"upload-box-content\">\n <div class=\"drop-container\"\n ngFileDrop\n [options]=\"options\"\n (uploadOutput)=\"onUploadOutput($event)\"\n [uploadInput]=\"uploadInput\">\n <p>\n Drag files here or\n <label class=\"upload-button\">\n <input type=\"file\"\n ngFileSelect\n [options]=\"options\"\n (uploadOutput)=\"onUploadOutput($event)\"\n [uploadInput]=\"uploadInput\"\n multiple />\n browse\n </label>\n to upload.\n </p>\n </div>\n <div class=\"upload-item\"\n *ngFor=\"let f of files; let i = index\">\n <div class=\"upload-item-content\">\n <div class=\"filename\">\n <div class=\"filename-left\">\n <i class=\"ionicon ion-ios-copy\" aria-hidden=\"true\"></i>\n <span>{{ f.name }}</span>\n </div>\n </div>\n <div class=\"progress-content\">\n <div class=\"progress\">\n <span class=\"bar\"\n [style.width]=\"f?.progress?.data?.percentage + '%'\"\n [class.is-done]=\"f['uploaded']\"></span>\n </div>\n </div>\n <div class=\"progress-text-content\">\n <span class=\"progress-text\"\n [class.is-done]=\"f['uploaded']\">\n <span *ngIf=\"!f['uploaded']\">{{ f.progress?.data?.percentage - 1 }}%\n </span>\n <span *ngIf=\"f['uploaded']\">100 %</span>\n <span *ngIf=\"!f['uploaded']\">Uploading...</span>\n <span *ngIf=\"f['uploaded']\">Done</span>\n </span>\n <span class=\"speed-and-eta-text\"\n *ngIf=\"f.progress?.data?.percentage !== 0 && !f['uploaded']\">\n <span>{{ f.progress?.data?.speedHuman }} </span>\n <span>ETA {{ f.progress?.data?.etaHuman }}</span>\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [":root{--first: rgb(23 105 225);--second: rgb(54 194 131);--third: rgb(255 171 0);--text: rgb(34 34 34);--tabs_bg: rgb(23 105 225);--tabs_text: rgb(255 255 255);--titles: rgb(34 34 34);--sidebar_bg: rgb(0, 48, 63);--sidebar_text: rgb(255 255 255)}.user-info .label{color:#777;font-size:14px;text-transform:capitalize}.user-info .user-value{border:0;border-bottom:1px solid rgb(119,119,119)}.user-info .user-value:focus{box-shadow:none}.user-info .user-value.is-invalid{border-color:#ff586b}.action-btn.active{color:#fff!important;background-color:var(--first)}.control-btns{display:none}.comment-field{border:0;border-bottom:1px solid rgb(242,242,242);color:#1769e1;display:none;font-size:15px;min-height:100px;padding:2px 5px!important}.comment-field:focus{border:1px solid rgb(23,105,225)!important;border-bottom:0;box-shadow:none}p{max-width:85%;white-space:pre-wrap}.show-controls .comment-field,.show-controls .control-btns{display:block}.show-controls p,.show-controls .edit-btn{display:none}select{appearance:none}textarea{resize:none}.clear-both{clear:both}.isDisabled input[type=text],.isDisabled select{pointer-events:none}.timeline-card.card{min-height:auto}@media (max-width: 768px){.completed-toggle{padding-top:10px}}.when-btn:focus{border:0;box-shadow:none}.no-actions{clear:both}.form-action-buttons{margin-bottom:14px;margin-top:15px}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.UiSwitchComponent, selector: "ui-switch", inputs: ["size", "color", "switchOffColor", "switchColor", "defaultBgColor", "defaultBoColor", "checkedLabel", "uncheckedLabel", "checkedTextColor", "uncheckedTextColor", "beforeChange", "ariaLabel", "checked", "disabled", "reverse", "loading"], outputs: ["change", "changeEvent", "valueChange"] }, { kind: "directive", type: i7.ButtonBusyDirective, selector: "[buttonBusy]", inputs: ["buttonBusy", "busyText"] }, { kind: "directive", type: i7.NumberDirective, selector: "input[numbersOnly]" }, { kind: "directive", type: i7.LazyImgDirective, selector: "img" }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "contentTemplate", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "popperOptions", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { kind: "directive", type: i2.NgbNavContent, selector: "ng-template[ngbNavContent]" }, { kind: "directive", type: i2.NgbNav, selector: "[ngbNav]", inputs: ["activeId", "animation", "destroyOnHide", "orientation", "roles", "keyboard"], outputs: ["activeIdChange", "shown", "hidden", "navChange"], exportAs: ["ngbNav"] }, { kind: "directive", type: i2.NgbNavItem, selector: "[ngbNavItem]", inputs: ["destroyOnHide", "disabled", "domId", "ngbNavItem"], outputs: ["shown", "hidden"], exportAs: ["ngbNavItem"] }, { kind: "directive", type: i2.NgbNavItemRole, selector: "[ngbNavItem]:not(ng-container)" }, { kind: "directive", type: i2.NgbNavLink, selector: "a[ngbNavLink]" }, { kind: "directive", type: i2.NgbNavLinkBase, selector: "[ngbNavLink]" }, { kind: "component", type: i2.NgbNavOutlet, selector: "[ngbNavOutlet]", inputs: ["paneRole", "ngbNavOutlet"] }, { kind: "directive", type: i2.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i8.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i9.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "component", type: i10.AutoComplete, selector: "p-autoComplete", inputs: ["minLength", "delay", "style", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "disabled", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "maxlength", "name", "required", "size", "appendTo", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "dropdownAriaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "showClear", "field", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "overlayOptions", "suggestions", "itemSize", "optionLabel", "optionValue", "id", "searchMessage", "emptySelectionMessage", "selectionMessage", "autoOptionFocus", "selectOnFocus", "searchLocale", "optionDisabled", "focusOnHover", "variant"], outputs: ["completeMethod", "onSelect", "onUnselect", "onFocus", "onBlur", "onDropdownClick", "onClear", "onKeyUp", "onShow", "onHide", "onLazyLoad"] }, { kind: "component", type: i11.NoDataComponent, selector: "pw-no-data", inputs: ["message", "description", "withImage"] }, { kind: "directive", type: i12.NgFileDropDirective, selector: "[ngFileDrop]", inputs: ["options", "uploadInput"], outputs: ["uploadOutput"] }, { kind: "directive", type: i12.NgFileSelectDirective, selector: "[ngFileSelect]", inputs: ["options", "uploadInput"], outputs: ["uploadOutput"] }, { kind: "component", type: i13.SmartCrmCompanyFilesComponent, selector: "pw-smart-crm-company-files", inputs: ["accountId", "contactId", "opportunityId"] }, { kind: "pipe", type: i4.JsonPipe, name: "json" }, { kind: "pipe", type: i4.SlicePipe, name: "slice" }, { kind: "pipe", type: i4.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i4.DatePipe, name: "date" }, { kind: "pipe", type: i14.IfNameNullShowEmailPipe, name: "ifNameNullShowEmail" }, { kind: "pipe", type: i15.TranslocoPipe, name: "transloco" }] }); }
|
|
469
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: SmartCrmOpportunitiesInfoComponent, selector: "pw-smart-crm-opportunities-info", usesInheritance: true, ngImport: i0, template: "<div class=\"row\">\n <div class=\"col-12 mb-0\">\n <div class=\"me-auto mb-0\">\n <h2 class=\"mb-0\">\n <a aria-label=\"Navigate to Target\"\n (click)=\"back()\"\n class=\"previous\"><i class=\"fa fa-arrow-alt-circle-left\" aria-hidden=\"true\"></i></a>\n Opportunity Info\n </h2>\n </div>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"user-info p-3 card pb-0 h-auto\">\n <div class=\"mb-2 text-center\">\n <a class=\"profile-image\">\n <img width=\"100\"\n height=\"100\"\n class=\"rounded-circle img-border width-100\"\n alt=\"user\"\n src=\"assets/img/icons/male.png\" />\n </a>\n </div>\n <div class=\"mb-4 d-flex justify-content-between align-items-center\">\n <h4 class=\"d-inline-block\">\n About <span *ngIf=\"data?.id\">{{ data.title }}</span>\n </h4>\n <a href=\"javascript:void(0);\"\n *ngIf=\"isFormEdit\"\n class=\"btn btn-sm btn-outline-primary float-end\"\n (click)=\"\n isFormEdit = !isFormEdit; getAccountsBySubscription(); getAllContacts()\n \">Edit</a>\n </div>\n <form [formGroup]=\"aboutControls\"\n [class.isDisabled]=\"isFormEdit\">\n <div class=\"mb-3\">\n <label class=\"label mb-0\" for=\"Title\">{{\n 'Crm.OpportunitiesMessage.Title' | transloco\n }}</label>\n <input type=\"text\"\n class=\"form-control rounded-0 ps-1 user-value\"\n formControlName=\"title\"\n [ngClass]=\"{ 'is-invalid': submitted && f['title'].errors }\" />\n </div>\n <div class=\"mb-3 ui-fluid skills-modal\"\n *ngIf=\"data?.crm_contact_id\">\n <label class=\"label mb-2\" for=\"Contact\">{{\n 'Crm.OpportunitiesMessage.Contact' | transloco\n }}</label>\n <a [routerLink]=\"[\n '/' + subscription?.slug + routers.contactInfo,\n data.crm_contact_id\n ]\"\n class=\"form-control d-block pb-2 ps-1 user-value\"\n *ngIf=\"isFormEdit && data?.crm_contact_id\">{{ data?.crm_contact?.first_name }} {{ data?.crm_contact?.last_name }}</a>\n <p-autoComplete *ngIf=\"!isFormEdit || !data?.crm_contact_id\"\n [suggestions]=\"filteredContacts\"\n formControlName=\"crm_contact_id\"\n dataKey=\"id\"\n field=\"displayName\"\n [dropdown]=\"true\"\n (completeMethod)=\"onContactSearch($event)\"\n styleClass=\"w-100\"\n placeholder=\"Search contacts\"\n [multiple]=\"false\">\n </p-autoComplete>\n </div>\n <div class=\"mb-3 ui-fluid skills-modal\">\n <label class=\"label mb-2\" for=\"Account\">{{\n 'Crm.OpportunitiesMessage.Account' | transloco\n }}</label>\n <a [routerLink]=\"[\n '/' + subscription?.slug + routers.accountInfo,\n data.crm_account_id\n ]\"\n class=\"form-control d-block pb-2 ps-1 user-value\"\n *ngIf=\"isFormEdit && data?.crm_account_id\">{{ data?.crm_account?.name }}</a>\n <p-autoComplete *ngIf=\"!isFormEdit || !data?.crm_account_id\"\n [suggestions]=\"filteredAccounts\"\n formControlName=\"crm_account_id\"\n dataKey=\"id\"\n field=\"name\"\n [dropdown]=\"true\"\n (completeMethod)=\"accountSearch($event)\"\n styleClass=\"w-100\"\n placeholder=\"Search accounts\"\n [multiple]=\"false\">\n </p-autoComplete>\n </div>\n <div class=\"mb-3\">\n <label class=\"label mb-0\" for=\"OneTimeAmount\">{{\n 'Crm.OpportunitiesMessage.OneTimeAmount' | transloco\n }}</label>\n <span class=\"form-control d-block pb-2 ps-1 user-value\"\n *ngIf=\"isFormEdit && data?.one_time_amount\">{{ data?.one_time_amount | currency }}</span>\n <input *ngIf=\"!isFormEdit || !data?.one_time_amount\"\n type=\"number\"\n numbersOnly\n class=\"form-control rounded-0 ps-1 user-value\"\n formControlName=\"one_time_amount\"\n id=\"one_time_amount\"\n [ngClass]=\"{ 'is-invalid': submitted && f['one_time_amount'].errors }\" />\n </div>\n <div class=\"mb-3\">\n <label class=\"label mb-0\" for=\"monthlyAmount\">{{\n 'Crm.OpportunitiesMessage.MonthlyAmount' | transloco\n }}</label>\n <span class=\"form-control d-block pb-2 ps-1 user-value\"\n *ngIf=\"isFormEdit && data?.monthly_amount\">{{ data?.monthly_amount | currency }}</span>\n <input *ngIf=\"!isFormEdit || !data?.monthly_amount\"\n type=\"number\"\n numbersOnly\n class=\"form-control rounded-0 ps-1 user-value\"\n formControlName=\"monthly_amount\"\n id=\"monthly_amount\"\n [ngClass]=\"{ 'is-invalid': submitted && f['monthly_amount'].errors }\" />\n </div>\n <div *ngIf=\"!isFormEdit\"\n class=\"text-end form-action-buttons\">\n <input type=\"button\"\n class=\"btn btn-outline-primary\"\n (click)=\"isFormEdit = !isFormEdit; getOpportunityDetails()\"\n value=\"Cancel\" />\n <input type=\"button\"\n class=\"btn btn-primary ms-3\"\n value=\"Submit\"\n (click)=\"updateOpportunities()\" />\n </div>\n </form>\n </div>\n </div>\n <div class=\"col-12 col-md-8\">\n <ul ngbNav\n #nav=\"ngbNav\"\n class=\"nav-tabs\">\n <li [ngbNavItem]=\"1\">\n <a ngbNavLink>Notes</a>\n <ng-template ngbNavContent>\n <form [formGroup]=\"actionControls\"\n (ngSubmit)=\"onCommentSave()\">\n <textarea class=\"form-control\"\n formControlName=\"comment\"\n rows=\"6\"></textarea>\n <p class=\"text-danger\"\n *ngIf=\"\n actionControls.get('comment').touched &&\n actionControls.get('comment').invalid\n \">\n Note Required\n </p>\n <div *ngIf=\"actions?.length\"\n class=\"d-block clear-both pt-3\">\n <ng-container *ngFor=\"let action of actions; index as i\">\n <button *ngIf=\"action.visible\"\n type=\"button\"\n [class.active]=\"\"\n class=\"btn btn-sm me-2 btn-outline-primary mb-2 action-btn\"\n (click)=\"showDatePicker($event, action.id); d.toggle()\">\n {{ action.name }}\n </button>\n </ng-container>\n <div class=\"text-danger\"\n *ngIf=\"submitAction && actionFormControls.crm_action_id.invalid\">\n Please select an action\n </div>\n <div class=\"row mt-3\">\n <div class=\"col-12 col-sm-4\">\n <div class=\"input-group\">\n <input class=\"form-control\"\n placeholder=\"dd-mmm-yyyy\"\n formControlName=\"when\"\n ngbDatepicker\n #d=\"ngbDatepicker\"\n (click)=\"d.toggle()\" />\n </div>\n </div>\n <div class=\"col-sm-4 pe-0 completed-toggle\">\n <div class=\"mb-3\">\n <ui-switch checkedLabel=\"completed\"\n uncheckedLabel=\"open\"\n formControlName=\"completed\"\n name=\"completed\">\n </ui-switch>\n </div>\n </div>\n </div>\n </div>\n <div class=\"float-end\">\n <button type=\"submit\"\n [buttonBusy]=\"buttonBusy\"\n [disabled]=\"buttonDisable\"\n class=\"btn btn-primary mt-2 mb-2 float-end\"\n >Submit Note</button>\n <a class=\"btn btn-outline-primary mt-2 mb-2 me-0 me-sm-2 float-end\"\n (click)=\"openModal(content)\">{{ 'Upload file' | transloco }}</a>\n </div>\n <div *ngIf=\"buttonDisable\"\n class=\"no-actions pt-4\">\n <pw-no-data [withImage]=\"true\" [message]=\"\n 'Crm.OpportunitiesMessage.NoActionsInOpportunitiesInfoMessage'\n | transloco\n \">\n </pw-no-data>\n </div>\n </form>\n <div class=\"w-100 text-center mt-3\"\n *ngIf=\"!isLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </div>\n <div *ngIf=\"!opportunitiesComments?.length && isLoaded\"\n class=\"no-actions pt-3\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.OpportunitiesMessage.NoActionsMessage' | transloco\">\n </pw-no-data>\n </div>\n <div *ngIf=\"opportunitiesComments?.length\"\n id=\"timeline\"\n class=\"pt-3 clear-both timeline-center timeline-wrapper\">\n <ul class=\"timeline\">\n <li class=\"timeline-line\"></li>\n </ul>\n <ul class=\"timeline\">\n <li class=\"timeline-line\"></li>\n <li class=\"timeline-item\"\n [ngClass]=\"{ 'mt-5': odd }\"\n *ngFor=\"\n let item of opportunitiesComments;\n index as i;\n let odd = odd;\n let even = even\n \">\n <div class=\"timeline-badge\">\n <span class=\"bg-red bg-lighten-1\">\n <span class=\"timeline-year\">\n <span class=\"d-block date-year\">{{\n item.when | date: 'medium' | slice: 0:3\n }}</span>\n <span>{{ item.year }}</span>\n </span>\n </span>\n </div>\n <div class=\"timeline-card shadow card pb-0 rounded border-grey border-lighten-2 position-static\">\n <div class=\"card-header py-4\">\n <div class=\"mb-0 clearfix\">\n <textarea type=\"text\"\n name=\"comment\"\n class=\"comment-field form-control p-0\"\n [(ngModel)]=\"item.comment\">{{ item.comment }}</textarea>\n <p class=\"float-start mb-0\"\n *ngIf=\"!showFullComment || item.id !== commentId\">\n {{ item.comment | slice: 0:170\n }}<a *ngIf=\"item.comment.length > 170\"\n class=\"text-secondary\"\n (click)=\"\n showFullComment = true; commentId = item.id\n \">...show more</a>\n </p>\n <p class=\"float-start mb-0\"\n *ngIf=\"showFullComment && item.id === commentId\">\n {{ item.comment }}\n <a *ngIf=\"\n item.comment.length > 170 && showFullComment\n \"\n (click)=\"showFullComment = false\"\n class=\"text-secondary\">...show less</a>\n </p>\n <button class=\"btn btn-md edit-btn float-end py-0\"\n (click)=\"showEditControls($event)\"\n *ngIf=\"userId === item.owner_id || hasAccess\">\n <i\n class=\"fa fa-edit edit-icon\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n <div class=\"card-subtitle text-muted my-0 clearfix\">\n <div class=\"float-start\">\n <span *ngIf=\"!updating || actionId !== item.id\"\n class=\"font-small-3\">\n {{ item.when }}</span>\n <input *ngIf=\"updating && actionId === item.id\"\n placeholder=\"dd-mmm-yyyy\"\n value=\"{{ item.when }}\"\n ngbDatepicker\n #d=\"ngbDatepicker\"\n (focus)=\"d.toggle()\"\n (dateSelect)=\"onDateSelect($event, item)\" />\n </div>\n <button type=\" button\"\n class=\"btn btn-sm float-end when-btn py-0\"\n *ngIf=\"userId === item.owner_id || hasAccess\"\n (click)=\"showDatePickerUpdate(item.id)\">\n <i\n class=\"fa fa-edit edit-icon\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n <p [class.text-danger]=\"!item.color\"\n *ngIf=\"!item.cancelled && !item.completed\"\n class=\"mb-0\">\n {{ item.due }}\n </p>\n <p>\n {{\n item?.owner?.first_name +\n ' ' +\n item?.owner?.last_name\n }}\n </p>\n <span class=\"badge bg-primary\">{{\n item?.crm_action?.name\n }}</span>\n <span *ngIf=\"\n !item.completed &&\n (userId === item.owner_id || hasAccess)\n \"\n class=\"badge bg-success ms-2\">Open</span>\n <a *ngIf=\"\n !item.completed &&\n (userId === item.owner_id || hasAccess)\n \"\n ngbTooltip=\"Set as completed\"\n aria-label=\"Set as completed\"\n class=\"me-3 ms-3\"\n href=\"javascript:void(0);\"\n (click)=\"\n setAsCompletedOrUncompleted(\n item.id,\n item,\n item.completed\n )\n \">\n <i class=\"fa fa-tasks completed\" aria-hidden=\"true\"></i>\n </a>\n <a *ngIf=\"\n !item.cancelled &&\n !item.completed &&\n (userId === item.owner_id || hasAccess)\n \"\n ngbTooltip=\"Set as cancelled\"\n aria-label=\"Set as cancelled\"\n href=\"javascript:void(0);\"\n (click)=\"setAsCancelled(item.id, item)\">\n <i\n class=\"fa fa-times delete-icon\"\n aria-hidden=\"true\"\n ></i>\n </a>\n <a *ngIf=\"\n item.completed &&\n (userId === item.owner_id || hasAccess)\n \"\n ngbTooltip=\"Set as UnCompleted\"\n aria-label=\"Set as UnCompleted\"\n href=\"javascript:void(0);\"\n (click)=\"\n setAsCompletedOrUncompleted(\n item.id,\n item,\n item.completed\n )\n \"\n class=\"ms-2\">\n <i class=\"far fa-window-close\" aria-hidden=\"true\"></i>\n </a>\n <div class=\"control-btns mt-3 text-end\">\n <button type=\"button\"\n class=\"btn btn-sm btn-outline-default me-2\"\n (click)=\"showEditControls(undefined)\">\n Cancel\n </button>\n <button class=\"btn btn-sm btn-primary\"\n type=\"button\"\n (click)=\"updateComment(item)\">\n Submit\n </button>\n </div>\n </div>\n </div>\n </li>\n </ul>\n </div>\n </ng-template>\n </li>\n <li [ngbNavItem]=\"2\">\n <a ngbNavLink>Versioning</a>\n <ng-template ngbNavContent>\n <div *ngFor=\"let version of opportunitiesVersioning\">\n <p>\n <strong>Event: </strong>{{ version.event }} | <strong>Author: </strong><a *ngIf=\"version?.author\"\n [routerLink]=\"['/members', version?.author?.slug]\">{{ version?.author | ifNameNullShowEmail }}</a>\n | <strong>Created at: </strong>{{ version.created_at }}<br />\n <strong>Object: </strong>{{ version.object | json }}\n </p>\n <hr />\n </div>\n <div *ngIf=\"opportunitiesVersioning?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.OpportunitiesMessage.NoVersionsMessage' | transloco\">\n </pw-no-data>\n </div>\n </ng-template>\n </li>\n <li [ngbNavItem]=\"3\">\n <a ngbNavLink>Files</a>\n <ng-template ngbNavContent>\n <pw-smart-crm-company-files [contactId]=\"contactId\"\n [accountId]=\"accountId\"\n [opportunityId]=\"opportunitiesId\">\n </pw-smart-crm-company-files>\n </ng-template>\n </li>\n </ul>\n\n <div [ngbNavOutlet]=\"nav\"></div>\n </div>\n</div>\n\n<ng-template #content\n let-modal>\n <div class=\"modal-header\">\n <h3 class=\"modal-title mb-0 p-0\">{{ 'Upload File' | transloco }}</h3>\n <button type=\"button\"\n class=\"btn-close float-end\"\n aria-label=\"Close\"\n (click)=\"modal.dismiss()\">\n\n </button>\n </div>\n <div class=\"modal-body\">\n <small> {{ 'User.Profile.PictureMessage' | transloco }}</small>\n <div class=\"row p-2\">\n <div class=\"col-12\">\n <div class=\"upload-box\">\n <div class=\"upload-box-content\">\n <div class=\"drop-container\"\n ngFileDrop\n [options]=\"options\"\n (uploadOutput)=\"onUploadOutput($event)\"\n [uploadInput]=\"uploadInput\">\n <p>\n Drag files here or\n <label class=\"upload-button\">\n <input type=\"file\"\n ngFileSelect\n [options]=\"options\"\n (uploadOutput)=\"onUploadOutput($event)\"\n [uploadInput]=\"uploadInput\"\n multiple />\n browse\n </label>\n to upload.\n </p>\n </div>\n <div class=\"upload-item\"\n *ngFor=\"let f of files; let i = index\">\n <div class=\"upload-item-content\">\n <div class=\"filename\">\n <div class=\"filename-left\">\n <i class=\"ionicon ion-ios-copy\" aria-hidden=\"true\"></i>\n <span>{{ f.name }}</span>\n </div>\n </div>\n <div class=\"progress-content\">\n <div class=\"progress\">\n <span class=\"bar\"\n [style.width]=\"f?.progress?.data?.percentage + '%'\"\n [class.is-done]=\"f['uploaded']\"></span>\n </div>\n </div>\n <div class=\"progress-text-content\">\n <span class=\"progress-text\"\n [class.is-done]=\"f['uploaded']\">\n <span *ngIf=\"!f['uploaded']\">{{ f.progress?.data?.percentage - 1 }}%\n </span>\n <span *ngIf=\"f['uploaded']\">100 %</span>\n <span *ngIf=\"!f['uploaded']\">Uploading...</span>\n <span *ngIf=\"f['uploaded']\">Done</span>\n </span>\n <span class=\"speed-and-eta-text\"\n *ngIf=\"f.progress?.data?.percentage !== 0 && !f['uploaded']\">\n <span>{{ f.progress?.data?.speedHuman }} </span>\n <span>ETA {{ f.progress?.data?.etaHuman }}</span>\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [":root{--first: rgb(23 105 225);--second: rgb(54 194 131);--third: rgb(255 171 0);--text: rgb(34 34 34);--tabs_bg: rgb(23 105 225);--tabs_text: rgb(255 255 255);--titles: rgb(34 34 34);--sidebar_bg: rgb(0, 48, 63);--sidebar_text: rgb(255 255 255)}.user-info .label{color:#777;font-size:14px;text-transform:capitalize}.user-info .user-value{border:0;border-bottom:1px solid rgb(119,119,119)}.user-info .user-value:focus{box-shadow:none}.user-info .user-value.is-invalid{border-color:#ff586b}.action-btn.active{color:#fff!important;background-color:var(--first)}.control-btns{display:none}.comment-field{border:0;border-bottom:1px solid rgb(242,242,242);color:#1769e1;display:none;font-size:15px;min-height:100px;padding:2px 5px!important}.comment-field:focus{border:1px solid rgb(23,105,225)!important;border-bottom:0;box-shadow:none}p{max-width:85%;white-space:pre-wrap}.show-controls .comment-field,.show-controls .control-btns{display:block}.show-controls p,.show-controls .edit-btn{display:none}select{appearance:none}textarea{resize:none}.clear-both{clear:both}.isDisabled input[type=text],.isDisabled select{pointer-events:none}.timeline-card.card{min-height:auto}@media (max-width: 768px){.completed-toggle{padding-top:10px}}.when-btn:focus{border:0;box-shadow:none}.no-actions{clear:both}.form-action-buttons{margin-bottom:14px;margin-top:15px}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.UiSwitchComponent, selector: "ui-switch", inputs: ["size", "color", "switchOffColor", "switchColor", "defaultBgColor", "defaultBoColor", "checkedLabel", "uncheckedLabel", "checkedTextColor", "uncheckedTextColor", "beforeChange", "ariaLabel", "checked", "disabled", "reverse", "loading"], outputs: ["change", "changeEvent", "valueChange"] }, { kind: "directive", type: i7.ButtonBusyDirective, selector: "[buttonBusy]", inputs: ["buttonBusy", "busyText"] }, { kind: "directive", type: i7.NumberDirective, selector: "input[numbersOnly]" }, { kind: "directive", type: i7.LazyImgDirective, selector: "img" }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "contentTemplate", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "popperOptions", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { kind: "directive", type: i2.NgbNavContent, selector: "ng-template[ngbNavContent]" }, { kind: "directive", type: i2.NgbNav, selector: "[ngbNav]", inputs: ["activeId", "animation", "destroyOnHide", "orientation", "roles", "keyboard"], outputs: ["activeIdChange", "shown", "hidden", "navChange"], exportAs: ["ngbNav"] }, { kind: "directive", type: i2.NgbNavItem, selector: "[ngbNavItem]", inputs: ["destroyOnHide", "disabled", "domId", "ngbNavItem"], outputs: ["shown", "hidden"], exportAs: ["ngbNavItem"] }, { kind: "directive", type: i2.NgbNavItemRole, selector: "[ngbNavItem]:not(ng-container)" }, { kind: "directive", type: i2.NgbNavLink, selector: "a[ngbNavLink]" }, { kind: "directive", type: i2.NgbNavLinkBase, selector: "[ngbNavLink]" }, { kind: "component", type: i2.NgbNavOutlet, selector: "[ngbNavOutlet]", inputs: ["paneRole", "ngbNavOutlet"] }, { kind: "directive", type: i2.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i8.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i9.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "component", type: i10.AutoComplete, selector: "p-autoComplete", inputs: ["minLength", "delay", "style", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "disabled", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "maxlength", "name", "required", "size", "appendTo", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "dropdownAriaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "showClear", "field", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "overlayOptions", "suggestions", "itemSize", "optionLabel", "optionValue", "id", "searchMessage", "emptySelectionMessage", "selectionMessage", "autoOptionFocus", "selectOnFocus", "searchLocale", "optionDisabled", "focusOnHover", "variant"], outputs: ["completeMethod", "onSelect", "onUnselect", "onFocus", "onBlur", "onDropdownClick", "onClear", "onKeyUp", "onShow", "onHide", "onLazyLoad"] }, { kind: "component", type: i11.NoDataComponent, selector: "pw-no-data", inputs: ["message", "description", "withImage"] }, { kind: "directive", type: i12.NgFileDropDirective, selector: "[ngFileDrop]", inputs: ["options", "uploadInput"], outputs: ["uploadOutput"] }, { kind: "directive", type: i12.NgFileSelectDirective, selector: "[ngFileSelect]", inputs: ["options", "uploadInput"], outputs: ["uploadOutput"] }, { kind: "component", type: i13.SmartCrmCompanyFilesComponent, selector: "pw-smart-crm-company-files", inputs: ["accountId", "contactId", "opportunityId"] }, { kind: "pipe", type: i4.JsonPipe, name: "json" }, { kind: "pipe", type: i4.SlicePipe, name: "slice" }, { kind: "pipe", type: i4.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i4.DatePipe, name: "date" }, { kind: "pipe", type: i14.IfNameNullShowEmailPipe, name: "ifNameNullShowEmail" }, { kind: "pipe", type: i15.TranslocoPipe, name: "transloco" }] }); }
|
|
470
470
|
}
|
|
471
471
|
__decorate([
|
|
472
472
|
ValidateForm('actionControls'),
|
|
@@ -476,9 +476,9 @@ __decorate([
|
|
|
476
476
|
], SmartCrmOpportunitiesInfoComponent.prototype, "onCommentSave", null);
|
|
477
477
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartCrmOpportunitiesInfoComponent, decorators: [{
|
|
478
478
|
type: Component,
|
|
479
|
-
args: [{ selector: 'pw-smart-crm-opportunities-info', template: "<div class=\"row\">\n <div class=\"col-12 mb-0\">\n <div class=\"me-auto mb-0\">\n <h2 class=\"mb-0\">\n <a href=\"javascript:void(0)\"\n (click)=\"back()\"\n class=\"previous\"><i class=\"fa fa-arrow-alt-circle-left\" aria-hidden=\"true\"></i></a>\n Opportunity Info\n </h2>\n </div>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"user-info p-3 card pb-0 h-auto\">\n <div class=\"mb-2 text-center\">\n <a class=\"profile-image\">\n <img width=\"100\"\n height=\"100\"\n class=\"rounded-circle img-border width-100\"\n alt=\"user\"\n src=\"assets/img/icons/male.png\" />\n </a>\n </div>\n <div class=\"mb-4 d-flex justify-content-between align-items-center\">\n <h4 class=\"d-inline-block\">\n About <span *ngIf=\"data?.id\">{{ data.title }}</span>\n </h4>\n <a href=\"javascript:void(0);\"\n *ngIf=\"isFormEdit\"\n class=\"btn btn-sm btn-outline-primary float-end\"\n (click)=\"\n isFormEdit = !isFormEdit; getAccountsBySubscription(); getAllContacts()\n \">Edit</a>\n </div>\n <form [formGroup]=\"aboutControls\"\n [class.isDisabled]=\"isFormEdit\">\n <div class=\"mb-3\">\n <label class=\"label mb-0\">{{\n 'Crm.OpportunitiesMessage.Title' | transloco\n }}</label>\n <input type=\"text\"\n class=\"form-control rounded-0 ps-1 user-value\"\n formControlName=\"title\"\n [ngClass]=\"{ 'is-invalid': submitted && f['title'].errors }\" />\n </div>\n <div class=\"mb-3 ui-fluid skills-modal\"\n *ngIf=\"data?.crm_contact_id\">\n <label class=\"label mb-2\">{{\n 'Crm.OpportunitiesMessage.Contact' | transloco\n }}</label>\n <a [routerLink]=\"[\n '/' + subscription?.slug + routers.contactInfo,\n data.crm_contact_id\n ]\"\n class=\"form-control d-block pb-2 ps-1 user-value\"\n *ngIf=\"isFormEdit && data?.crm_contact_id\">{{ data?.crm_contact?.first_name }} {{ data?.crm_contact?.last_name }}</a>\n <p-autoComplete *ngIf=\"!isFormEdit || !data?.crm_contact_id\"\n [suggestions]=\"filteredContacts\"\n formControlName=\"crm_contact_id\"\n dataKey=\"id\"\n field=\"displayName\"\n [dropdown]=\"true\"\n (completeMethod)=\"onContactSearch($event)\"\n styleClass=\"w-100\"\n placeholder=\"Search contacts\"\n [multiple]=\"false\">\n </p-autoComplete>\n </div>\n <div class=\"mb-3 ui-fluid skills-modal\">\n <label class=\"label mb-2\">{{\n 'Crm.OpportunitiesMessage.Account' | transloco\n }}</label>\n <a [routerLink]=\"[\n '/' + subscription?.slug + routers.accountInfo,\n data.crm_account_id\n ]\"\n class=\"form-control d-block pb-2 ps-1 user-value\"\n *ngIf=\"isFormEdit && data?.crm_account_id\">{{ data?.crm_account?.name }}</a>\n <p-autoComplete *ngIf=\"!isFormEdit || !data?.crm_account_id\"\n [suggestions]=\"filteredAccounts\"\n formControlName=\"crm_account_id\"\n dataKey=\"id\"\n field=\"name\"\n [dropdown]=\"true\"\n (completeMethod)=\"accountSearch($event)\"\n styleClass=\"w-100\"\n placeholder=\"Search accounts\"\n [multiple]=\"false\">\n </p-autoComplete>\n </div>\n <div class=\"mb-3\">\n <label class=\"label mb-0\">{{\n 'Crm.OpportunitiesMessage.OneTimeAmount' | transloco\n }}</label>\n <span class=\"form-control d-block pb-2 ps-1 user-value\"\n *ngIf=\"isFormEdit && data?.one_time_amount\">{{ data?.one_time_amount | currency }}</span>\n <input *ngIf=\"!isFormEdit || !data?.one_time_amount\"\n type=\"number\"\n numbersOnly\n class=\"form-control rounded-0 ps-1 user-value\"\n formControlName=\"one_time_amount\"\n id=\"one_time_amount\"\n [ngClass]=\"{ 'is-invalid': submitted && f['one_time_amount'].errors }\" />\n </div>\n <div class=\"mb-3\">\n <label class=\"label mb-0\">{{\n 'Crm.OpportunitiesMessage.MonthlyAmount' | transloco\n }}</label>\n <span class=\"form-control d-block pb-2 ps-1 user-value\"\n *ngIf=\"isFormEdit && data?.monthly_amount\">{{ data?.monthly_amount | currency }}</span>\n <input *ngIf=\"!isFormEdit || !data?.monthly_amount\"\n type=\"number\"\n numbersOnly\n class=\"form-control rounded-0 ps-1 user-value\"\n formControlName=\"monthly_amount\"\n id=\"monthly_amount\"\n [ngClass]=\"{ 'is-invalid': submitted && f['monthly_amount'].errors }\" />\n </div>\n <div *ngIf=\"!isFormEdit\"\n class=\"text-end form-action-buttons\">\n <input type=\"button\"\n class=\"btn btn-outline-primary\"\n (click)=\"isFormEdit = !isFormEdit; getOpportunityDetails()\"\n value=\"Cancel\" />\n <input type=\"button\"\n class=\"btn btn-primary ms-3\"\n value=\"Submit\"\n (click)=\"updateOpportunities()\" />\n </div>\n </form>\n </div>\n </div>\n <div class=\"col-12 col-md-8\">\n <ul ngbNav\n #nav=\"ngbNav\"\n class=\"nav-tabs\">\n <li [ngbNavItem]=\"1\">\n <a ngbNavLink>Notes</a>\n <ng-template ngbNavContent>\n <form [formGroup]=\"actionControls\"\n (ngSubmit)=\"onCommentSave()\">\n <textarea class=\"form-control\"\n formControlName=\"comment\"\n rows=\"6\"></textarea>\n <p class=\"text-danger\"\n *ngIf=\"\n actionControls.get('comment').touched &&\n actionControls.get('comment').invalid\n \">\n Note Required\n </p>\n <div *ngIf=\"actions?.length\"\n class=\"d-block clear-both pt-3\">\n <ng-container *ngFor=\"let action of actions; index as i\">\n <button *ngIf=\"action.visible\"\n type=\"button\"\n [class.active]=\"\"\n class=\"btn btn-sm me-2 btn-outline-primary mb-2 action-btn\"\n (click)=\"showDatePicker($event, action.id); d.toggle()\">\n {{ action.name }}\n </button>\n </ng-container>\n <div class=\"text-danger\"\n *ngIf=\"submitAction && actionFormControls.crm_action_id.invalid\">\n Please select an action\n </div>\n <div class=\"row mt-3\">\n <div class=\"col-12 col-sm-4\">\n <div class=\"input-group\">\n <input class=\"form-control\"\n placeholder=\"dd-mmm-yyyy\"\n formControlName=\"when\"\n ngbDatepicker\n #d=\"ngbDatepicker\"\n (click)=\"d.toggle()\" />\n </div>\n </div>\n <div class=\"col-sm-4 pe-0 completed-toggle\">\n <div class=\"mb-3\">\n <ui-switch checkedLabel=\"completed\"\n uncheckedLabel=\"open\"\n formControlName=\"completed\"\n name=\"completed\">\n </ui-switch>\n </div>\n </div>\n </div>\n </div>\n <div class=\"float-end\">\n <button type=\"submit\"\n [buttonBusy]=\"buttonBusy\"\n [disabled]=\"buttonDisable\"\n class=\"btn btn-primary mt-2 mb-2 float-end\"\n >Submit Note</button>\n <a class=\"btn btn-outline-primary mt-2 mb-2 me-0 me-sm-2 float-end\"\n (click)=\"openModal(content)\">{{ 'Upload file' | transloco }}</a>\n </div>\n <div *ngIf=\"buttonDisable\"\n class=\"no-actions pt-4\">\n <pw-no-data [withImage]=\"true\" [message]=\"\n 'Crm.OpportunitiesMessage.NoActionsInOpportunitiesInfoMessage'\n | transloco\n \">\n </pw-no-data>\n </div>\n </form>\n <div class=\"w-100 text-center mt-3\"\n *ngIf=\"!isLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </div>\n <div *ngIf=\"!opportunitiesComments?.length && isLoaded\"\n class=\"no-actions pt-3\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.OpportunitiesMessage.NoActionsMessage' | transloco\">\n </pw-no-data>\n </div>\n <div *ngIf=\"opportunitiesComments?.length\"\n id=\"timeline\"\n class=\"pt-3 clear-both timeline-center timeline-wrapper\">\n <ul class=\"timeline\">\n <li class=\"timeline-line\"></li>\n </ul>\n <ul class=\"timeline\">\n <li class=\"timeline-line\"></li>\n <li class=\"timeline-item\"\n [ngClass]=\"{ 'mt-5': odd }\"\n *ngFor=\"\n let item of opportunitiesComments;\n index as i;\n let odd = odd;\n let even = even\n \">\n <div class=\"timeline-badge\">\n <span class=\"bg-red bg-lighten-1\">\n <span class=\"timeline-year\">\n <span class=\"d-block date-year\">{{\n item.when | date: 'medium' | slice: 0:3\n }}</span>\n <span>{{ item.year }}</span>\n </span>\n </span>\n </div>\n <div class=\"timeline-card shadow card pb-0 rounded border-grey border-lighten-2 position-static\">\n <div class=\"card-header py-4\">\n <div class=\"mb-0 clearfix\">\n <textarea type=\"text\"\n name=\"comment\"\n class=\"comment-field form-control p-0\"\n [(ngModel)]=\"item.comment\">{{ item.comment }}</textarea>\n <p class=\"float-start mb-0\"\n *ngIf=\"!showFullComment || item.id !== commentId\">\n {{ item.comment | slice: 0:170\n }}<a *ngIf=\"item.comment.length > 170\"\n class=\"text-secondary\"\n (click)=\"\n showFullComment = true; commentId = item.id\n \">...show more</a>\n </p>\n <p class=\"float-start mb-0\"\n *ngIf=\"showFullComment && item.id === commentId\">\n {{ item.comment }}\n <a *ngIf=\"\n item.comment.length > 170 && showFullComment\n \"\n (click)=\"showFullComment = false\"\n class=\"text-secondary\">...show less</a>\n </p>\n <button class=\"btn btn-md edit-btn float-end py-0\"\n (click)=\"showEditControls($event)\"\n *ngIf=\"userId === item.owner_id || hasAccess\">\n <i\n class=\"fa fa-edit edit-icon\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n <div class=\"card-subtitle text-muted my-0 clearfix\">\n <div class=\"float-start\">\n <span *ngIf=\"!updating || actionId !== item.id\"\n class=\"font-small-3\">\n {{ item.when }}</span>\n <input *ngIf=\"updating && actionId === item.id\"\n placeholder=\"dd-mmm-yyyy\"\n value=\"{{ item.when }}\"\n ngbDatepicker\n #d=\"ngbDatepicker\"\n (focus)=\"d.toggle()\"\n (dateSelect)=\"onDateSelect($event, item)\" />\n </div>\n <button type=\" button\"\n class=\"btn btn-sm float-end when-btn py-0\"\n *ngIf=\"userId === item.owner_id || hasAccess\"\n (click)=\"showDatePickerUpdate(item.id)\">\n <i\n class=\"fa fa-edit edit-icon\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n <p [class.text-danger]=\"!item.color\"\n *ngIf=\"!item.cancelled && !item.completed\"\n class=\"mb-0\">\n {{ item.due }}\n </p>\n <p>\n {{\n item?.owner?.first_name +\n ' ' +\n item?.owner?.last_name\n }}\n </p>\n <span class=\"badge bg-primary\">{{\n item?.crm_action?.name\n }}</span>\n <span *ngIf=\"\n !item.completed &&\n (userId === item.owner_id || hasAccess)\n \"\n class=\"badge bg-success ms-2\">Open</span>\n <a *ngIf=\"\n !item.completed &&\n (userId === item.owner_id || hasAccess)\n \"\n ngbTooltip=\"Set as completed\"\n class=\"me-3 ms-3\"\n href=\"javascript:void(0);\"\n (click)=\"\n setAsCompletedOrUncompleted(\n item.id,\n item,\n item.completed\n )\n \">\n <i class=\"fa fa-tasks completed\" aria-hidden=\"true\"></i>\n </a>\n <a *ngIf=\"\n !item.cancelled &&\n !item.completed &&\n (userId === item.owner_id || hasAccess)\n \"\n ngbTooltip=\"Set as cancelled\"\n href=\"javascript:void(0);\"\n (click)=\"setAsCancelled(item.id, item)\">\n <i\n class=\"fa fa-times delete-icon\"\n aria-hidden=\"true\"\n ></i>\n </a>\n <a *ngIf=\"\n item.completed &&\n (userId === item.owner_id || hasAccess)\n \"\n ngbTooltip=\"Set as UnCompleted\"\n href=\"javascript:void(0);\"\n (click)=\"\n setAsCompletedOrUncompleted(\n item.id,\n item,\n item.completed\n )\n \"\n class=\"ms-2\">\n <i class=\"far fa-window-close\" aria-hidden=\"true\"></i>\n </a>\n <div class=\"control-btns mt-3 text-end\">\n <button type=\"button\"\n class=\"btn btn-sm btn-outline-default me-2\"\n (click)=\"showEditControls(undefined)\">\n Cancel\n </button>\n <button class=\"btn btn-sm btn-primary\"\n type=\"button\"\n (click)=\"updateComment(item)\">\n Submit\n </button>\n </div>\n </div>\n </div>\n </li>\n </ul>\n </div>\n </ng-template>\n </li>\n <li [ngbNavItem]=\"2\">\n <a ngbNavLink>Versioning</a>\n <ng-template ngbNavContent>\n <div *ngFor=\"let version of opportunitiesVersioning\">\n <p>\n <strong>Event: </strong>{{ version.event }} | <strong>Author: </strong><a *ngIf=\"version?.author\"\n [routerLink]=\"['/members', version?.author?.slug]\">{{ version?.author | ifNameNullShowEmail }}</a>\n | <strong>Created at: </strong>{{ version.created_at }}<br />\n <strong>Object: </strong>{{ version.object | json }}\n </p>\n <hr />\n </div>\n <div *ngIf=\"opportunitiesVersioning?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.OpportunitiesMessage.NoVersionsMessage' | transloco\">\n </pw-no-data>\n </div>\n </ng-template>\n </li>\n <li [ngbNavItem]=\"3\">\n <a ngbNavLink>Files</a>\n <ng-template ngbNavContent>\n <pw-smart-crm-company-files [contactId]=\"contactId\"\n [accountId]=\"accountId\"\n [opportunityId]=\"opportunitiesId\">\n </pw-smart-crm-company-files>\n </ng-template>\n </li>\n </ul>\n\n <div [ngbNavOutlet]=\"nav\"></div>\n </div>\n</div>\n\n<ng-template #content\n let-modal>\n <div class=\"modal-header\">\n <h3 class=\"modal-title mb-0 p-0\">{{ 'Upload File' | transloco }}</h3>\n <button type=\"button\"\n class=\"btn-close float-end\"\n aria-label=\"Close\"\n (click)=\"modal.dismiss()\">\n\n </button>\n </div>\n <div class=\"modal-body\">\n <small> {{ 'User.Profile.PictureMessage' | transloco }}</small>\n <div class=\"row p-2\">\n <div class=\"col-12\">\n <div class=\"upload-box\">\n <div class=\"upload-box-content\">\n <div class=\"drop-container\"\n ngFileDrop\n [options]=\"options\"\n (uploadOutput)=\"onUploadOutput($event)\"\n [uploadInput]=\"uploadInput\">\n <p>\n Drag files here or\n <label class=\"upload-button\">\n <input type=\"file\"\n ngFileSelect\n [options]=\"options\"\n (uploadOutput)=\"onUploadOutput($event)\"\n [uploadInput]=\"uploadInput\"\n multiple />\n browse\n </label>\n to upload.\n </p>\n </div>\n <div class=\"upload-item\"\n *ngFor=\"let f of files; let i = index\">\n <div class=\"upload-item-content\">\n <div class=\"filename\">\n <div class=\"filename-left\">\n <i class=\"ionicon ion-ios-copy\" aria-hidden=\"true\"></i>\n <span>{{ f.name }}</span>\n </div>\n </div>\n <div class=\"progress-content\">\n <div class=\"progress\">\n <span class=\"bar\"\n [style.width]=\"f?.progress?.data?.percentage + '%'\"\n [class.is-done]=\"f['uploaded']\"></span>\n </div>\n </div>\n <div class=\"progress-text-content\">\n <span class=\"progress-text\"\n [class.is-done]=\"f['uploaded']\">\n <span *ngIf=\"!f['uploaded']\">{{ f.progress?.data?.percentage - 1 }}%\n </span>\n <span *ngIf=\"f['uploaded']\">100 %</span>\n <span *ngIf=\"!f['uploaded']\">Uploading...</span>\n <span *ngIf=\"f['uploaded']\">Done</span>\n </span>\n <span class=\"speed-and-eta-text\"\n *ngIf=\"f.progress?.data?.percentage !== 0 && !f['uploaded']\">\n <span>{{ f.progress?.data?.speedHuman }} </span>\n <span>ETA {{ f.progress?.data?.etaHuman }}</span>\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [":root{--first: rgb(23 105 225);--second: rgb(54 194 131);--third: rgb(255 171 0);--text: rgb(34 34 34);--tabs_bg: rgb(23 105 225);--tabs_text: rgb(255 255 255);--titles: rgb(34 34 34);--sidebar_bg: rgb(0, 48, 63);--sidebar_text: rgb(255 255 255)}.user-info .label{color:#777;font-size:14px;text-transform:capitalize}.user-info .user-value{border:0;border-bottom:1px solid rgb(119,119,119)}.user-info .user-value:focus{box-shadow:none}.user-info .user-value.is-invalid{border-color:#ff586b}.action-btn.active{color:#fff!important;background-color:var(--first)}.control-btns{display:none}.comment-field{border:0;border-bottom:1px solid rgb(242,242,242);color:#1769e1;display:none;font-size:15px;min-height:100px;padding:2px 5px!important}.comment-field:focus{border:1px solid rgb(23,105,225)!important;border-bottom:0;box-shadow:none}p{max-width:85%;white-space:pre-wrap}.show-controls .comment-field,.show-controls .control-btns{display:block}.show-controls p,.show-controls .edit-btn{display:none}select{appearance:none}textarea{resize:none}.clear-both{clear:both}.isDisabled input[type=text],.isDisabled select{pointer-events:none}.timeline-card.card{min-height:auto}@media (max-width: 768px){.completed-toggle{padding-top:10px}}.when-btn:focus{border:0;box-shadow:none}.no-actions{clear:both}.form-action-buttons{margin-bottom:14px;margin-top:15px}\n"] }]
|
|
479
|
+
args: [{ selector: 'pw-smart-crm-opportunities-info', template: "<div class=\"row\">\n <div class=\"col-12 mb-0\">\n <div class=\"me-auto mb-0\">\n <h2 class=\"mb-0\">\n <a aria-label=\"Navigate to Target\"\n (click)=\"back()\"\n class=\"previous\"><i class=\"fa fa-arrow-alt-circle-left\" aria-hidden=\"true\"></i></a>\n Opportunity Info\n </h2>\n </div>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"user-info p-3 card pb-0 h-auto\">\n <div class=\"mb-2 text-center\">\n <a class=\"profile-image\">\n <img width=\"100\"\n height=\"100\"\n class=\"rounded-circle img-border width-100\"\n alt=\"user\"\n src=\"assets/img/icons/male.png\" />\n </a>\n </div>\n <div class=\"mb-4 d-flex justify-content-between align-items-center\">\n <h4 class=\"d-inline-block\">\n About <span *ngIf=\"data?.id\">{{ data.title }}</span>\n </h4>\n <a href=\"javascript:void(0);\"\n *ngIf=\"isFormEdit\"\n class=\"btn btn-sm btn-outline-primary float-end\"\n (click)=\"\n isFormEdit = !isFormEdit; getAccountsBySubscription(); getAllContacts()\n \">Edit</a>\n </div>\n <form [formGroup]=\"aboutControls\"\n [class.isDisabled]=\"isFormEdit\">\n <div class=\"mb-3\">\n <label class=\"label mb-0\" for=\"Title\">{{\n 'Crm.OpportunitiesMessage.Title' | transloco\n }}</label>\n <input type=\"text\"\n class=\"form-control rounded-0 ps-1 user-value\"\n formControlName=\"title\"\n [ngClass]=\"{ 'is-invalid': submitted && f['title'].errors }\" />\n </div>\n <div class=\"mb-3 ui-fluid skills-modal\"\n *ngIf=\"data?.crm_contact_id\">\n <label class=\"label mb-2\" for=\"Contact\">{{\n 'Crm.OpportunitiesMessage.Contact' | transloco\n }}</label>\n <a [routerLink]=\"[\n '/' + subscription?.slug + routers.contactInfo,\n data.crm_contact_id\n ]\"\n class=\"form-control d-block pb-2 ps-1 user-value\"\n *ngIf=\"isFormEdit && data?.crm_contact_id\">{{ data?.crm_contact?.first_name }} {{ data?.crm_contact?.last_name }}</a>\n <p-autoComplete *ngIf=\"!isFormEdit || !data?.crm_contact_id\"\n [suggestions]=\"filteredContacts\"\n formControlName=\"crm_contact_id\"\n dataKey=\"id\"\n field=\"displayName\"\n [dropdown]=\"true\"\n (completeMethod)=\"onContactSearch($event)\"\n styleClass=\"w-100\"\n placeholder=\"Search contacts\"\n [multiple]=\"false\">\n </p-autoComplete>\n </div>\n <div class=\"mb-3 ui-fluid skills-modal\">\n <label class=\"label mb-2\" for=\"Account\">{{\n 'Crm.OpportunitiesMessage.Account' | transloco\n }}</label>\n <a [routerLink]=\"[\n '/' + subscription?.slug + routers.accountInfo,\n data.crm_account_id\n ]\"\n class=\"form-control d-block pb-2 ps-1 user-value\"\n *ngIf=\"isFormEdit && data?.crm_account_id\">{{ data?.crm_account?.name }}</a>\n <p-autoComplete *ngIf=\"!isFormEdit || !data?.crm_account_id\"\n [suggestions]=\"filteredAccounts\"\n formControlName=\"crm_account_id\"\n dataKey=\"id\"\n field=\"name\"\n [dropdown]=\"true\"\n (completeMethod)=\"accountSearch($event)\"\n styleClass=\"w-100\"\n placeholder=\"Search accounts\"\n [multiple]=\"false\">\n </p-autoComplete>\n </div>\n <div class=\"mb-3\">\n <label class=\"label mb-0\" for=\"OneTimeAmount\">{{\n 'Crm.OpportunitiesMessage.OneTimeAmount' | transloco\n }}</label>\n <span class=\"form-control d-block pb-2 ps-1 user-value\"\n *ngIf=\"isFormEdit && data?.one_time_amount\">{{ data?.one_time_amount | currency }}</span>\n <input *ngIf=\"!isFormEdit || !data?.one_time_amount\"\n type=\"number\"\n numbersOnly\n class=\"form-control rounded-0 ps-1 user-value\"\n formControlName=\"one_time_amount\"\n id=\"one_time_amount\"\n [ngClass]=\"{ 'is-invalid': submitted && f['one_time_amount'].errors }\" />\n </div>\n <div class=\"mb-3\">\n <label class=\"label mb-0\" for=\"monthlyAmount\">{{\n 'Crm.OpportunitiesMessage.MonthlyAmount' | transloco\n }}</label>\n <span class=\"form-control d-block pb-2 ps-1 user-value\"\n *ngIf=\"isFormEdit && data?.monthly_amount\">{{ data?.monthly_amount | currency }}</span>\n <input *ngIf=\"!isFormEdit || !data?.monthly_amount\"\n type=\"number\"\n numbersOnly\n class=\"form-control rounded-0 ps-1 user-value\"\n formControlName=\"monthly_amount\"\n id=\"monthly_amount\"\n [ngClass]=\"{ 'is-invalid': submitted && f['monthly_amount'].errors }\" />\n </div>\n <div *ngIf=\"!isFormEdit\"\n class=\"text-end form-action-buttons\">\n <input type=\"button\"\n class=\"btn btn-outline-primary\"\n (click)=\"isFormEdit = !isFormEdit; getOpportunityDetails()\"\n value=\"Cancel\" />\n <input type=\"button\"\n class=\"btn btn-primary ms-3\"\n value=\"Submit\"\n (click)=\"updateOpportunities()\" />\n </div>\n </form>\n </div>\n </div>\n <div class=\"col-12 col-md-8\">\n <ul ngbNav\n #nav=\"ngbNav\"\n class=\"nav-tabs\">\n <li [ngbNavItem]=\"1\">\n <a ngbNavLink>Notes</a>\n <ng-template ngbNavContent>\n <form [formGroup]=\"actionControls\"\n (ngSubmit)=\"onCommentSave()\">\n <textarea class=\"form-control\"\n formControlName=\"comment\"\n rows=\"6\"></textarea>\n <p class=\"text-danger\"\n *ngIf=\"\n actionControls.get('comment').touched &&\n actionControls.get('comment').invalid\n \">\n Note Required\n </p>\n <div *ngIf=\"actions?.length\"\n class=\"d-block clear-both pt-3\">\n <ng-container *ngFor=\"let action of actions; index as i\">\n <button *ngIf=\"action.visible\"\n type=\"button\"\n [class.active]=\"\"\n class=\"btn btn-sm me-2 btn-outline-primary mb-2 action-btn\"\n (click)=\"showDatePicker($event, action.id); d.toggle()\">\n {{ action.name }}\n </button>\n </ng-container>\n <div class=\"text-danger\"\n *ngIf=\"submitAction && actionFormControls.crm_action_id.invalid\">\n Please select an action\n </div>\n <div class=\"row mt-3\">\n <div class=\"col-12 col-sm-4\">\n <div class=\"input-group\">\n <input class=\"form-control\"\n placeholder=\"dd-mmm-yyyy\"\n formControlName=\"when\"\n ngbDatepicker\n #d=\"ngbDatepicker\"\n (click)=\"d.toggle()\" />\n </div>\n </div>\n <div class=\"col-sm-4 pe-0 completed-toggle\">\n <div class=\"mb-3\">\n <ui-switch checkedLabel=\"completed\"\n uncheckedLabel=\"open\"\n formControlName=\"completed\"\n name=\"completed\">\n </ui-switch>\n </div>\n </div>\n </div>\n </div>\n <div class=\"float-end\">\n <button type=\"submit\"\n [buttonBusy]=\"buttonBusy\"\n [disabled]=\"buttonDisable\"\n class=\"btn btn-primary mt-2 mb-2 float-end\"\n >Submit Note</button>\n <a class=\"btn btn-outline-primary mt-2 mb-2 me-0 me-sm-2 float-end\"\n (click)=\"openModal(content)\">{{ 'Upload file' | transloco }}</a>\n </div>\n <div *ngIf=\"buttonDisable\"\n class=\"no-actions pt-4\">\n <pw-no-data [withImage]=\"true\" [message]=\"\n 'Crm.OpportunitiesMessage.NoActionsInOpportunitiesInfoMessage'\n | transloco\n \">\n </pw-no-data>\n </div>\n </form>\n <div class=\"w-100 text-center mt-3\"\n *ngIf=\"!isLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </div>\n <div *ngIf=\"!opportunitiesComments?.length && isLoaded\"\n class=\"no-actions pt-3\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.OpportunitiesMessage.NoActionsMessage' | transloco\">\n </pw-no-data>\n </div>\n <div *ngIf=\"opportunitiesComments?.length\"\n id=\"timeline\"\n class=\"pt-3 clear-both timeline-center timeline-wrapper\">\n <ul class=\"timeline\">\n <li class=\"timeline-line\"></li>\n </ul>\n <ul class=\"timeline\">\n <li class=\"timeline-line\"></li>\n <li class=\"timeline-item\"\n [ngClass]=\"{ 'mt-5': odd }\"\n *ngFor=\"\n let item of opportunitiesComments;\n index as i;\n let odd = odd;\n let even = even\n \">\n <div class=\"timeline-badge\">\n <span class=\"bg-red bg-lighten-1\">\n <span class=\"timeline-year\">\n <span class=\"d-block date-year\">{{\n item.when | date: 'medium' | slice: 0:3\n }}</span>\n <span>{{ item.year }}</span>\n </span>\n </span>\n </div>\n <div class=\"timeline-card shadow card pb-0 rounded border-grey border-lighten-2 position-static\">\n <div class=\"card-header py-4\">\n <div class=\"mb-0 clearfix\">\n <textarea type=\"text\"\n name=\"comment\"\n class=\"comment-field form-control p-0\"\n [(ngModel)]=\"item.comment\">{{ item.comment }}</textarea>\n <p class=\"float-start mb-0\"\n *ngIf=\"!showFullComment || item.id !== commentId\">\n {{ item.comment | slice: 0:170\n }}<a *ngIf=\"item.comment.length > 170\"\n class=\"text-secondary\"\n (click)=\"\n showFullComment = true; commentId = item.id\n \">...show more</a>\n </p>\n <p class=\"float-start mb-0\"\n *ngIf=\"showFullComment && item.id === commentId\">\n {{ item.comment }}\n <a *ngIf=\"\n item.comment.length > 170 && showFullComment\n \"\n (click)=\"showFullComment = false\"\n class=\"text-secondary\">...show less</a>\n </p>\n <button class=\"btn btn-md edit-btn float-end py-0\"\n (click)=\"showEditControls($event)\"\n *ngIf=\"userId === item.owner_id || hasAccess\">\n <i\n class=\"fa fa-edit edit-icon\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n <div class=\"card-subtitle text-muted my-0 clearfix\">\n <div class=\"float-start\">\n <span *ngIf=\"!updating || actionId !== item.id\"\n class=\"font-small-3\">\n {{ item.when }}</span>\n <input *ngIf=\"updating && actionId === item.id\"\n placeholder=\"dd-mmm-yyyy\"\n value=\"{{ item.when }}\"\n ngbDatepicker\n #d=\"ngbDatepicker\"\n (focus)=\"d.toggle()\"\n (dateSelect)=\"onDateSelect($event, item)\" />\n </div>\n <button type=\" button\"\n class=\"btn btn-sm float-end when-btn py-0\"\n *ngIf=\"userId === item.owner_id || hasAccess\"\n (click)=\"showDatePickerUpdate(item.id)\">\n <i\n class=\"fa fa-edit edit-icon\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n <p [class.text-danger]=\"!item.color\"\n *ngIf=\"!item.cancelled && !item.completed\"\n class=\"mb-0\">\n {{ item.due }}\n </p>\n <p>\n {{\n item?.owner?.first_name +\n ' ' +\n item?.owner?.last_name\n }}\n </p>\n <span class=\"badge bg-primary\">{{\n item?.crm_action?.name\n }}</span>\n <span *ngIf=\"\n !item.completed &&\n (userId === item.owner_id || hasAccess)\n \"\n class=\"badge bg-success ms-2\">Open</span>\n <a *ngIf=\"\n !item.completed &&\n (userId === item.owner_id || hasAccess)\n \"\n ngbTooltip=\"Set as completed\"\n aria-label=\"Set as completed\"\n class=\"me-3 ms-3\"\n href=\"javascript:void(0);\"\n (click)=\"\n setAsCompletedOrUncompleted(\n item.id,\n item,\n item.completed\n )\n \">\n <i class=\"fa fa-tasks completed\" aria-hidden=\"true\"></i>\n </a>\n <a *ngIf=\"\n !item.cancelled &&\n !item.completed &&\n (userId === item.owner_id || hasAccess)\n \"\n ngbTooltip=\"Set as cancelled\"\n aria-label=\"Set as cancelled\"\n href=\"javascript:void(0);\"\n (click)=\"setAsCancelled(item.id, item)\">\n <i\n class=\"fa fa-times delete-icon\"\n aria-hidden=\"true\"\n ></i>\n </a>\n <a *ngIf=\"\n item.completed &&\n (userId === item.owner_id || hasAccess)\n \"\n ngbTooltip=\"Set as UnCompleted\"\n aria-label=\"Set as UnCompleted\"\n href=\"javascript:void(0);\"\n (click)=\"\n setAsCompletedOrUncompleted(\n item.id,\n item,\n item.completed\n )\n \"\n class=\"ms-2\">\n <i class=\"far fa-window-close\" aria-hidden=\"true\"></i>\n </a>\n <div class=\"control-btns mt-3 text-end\">\n <button type=\"button\"\n class=\"btn btn-sm btn-outline-default me-2\"\n (click)=\"showEditControls(undefined)\">\n Cancel\n </button>\n <button class=\"btn btn-sm btn-primary\"\n type=\"button\"\n (click)=\"updateComment(item)\">\n Submit\n </button>\n </div>\n </div>\n </div>\n </li>\n </ul>\n </div>\n </ng-template>\n </li>\n <li [ngbNavItem]=\"2\">\n <a ngbNavLink>Versioning</a>\n <ng-template ngbNavContent>\n <div *ngFor=\"let version of opportunitiesVersioning\">\n <p>\n <strong>Event: </strong>{{ version.event }} | <strong>Author: </strong><a *ngIf=\"version?.author\"\n [routerLink]=\"['/members', version?.author?.slug]\">{{ version?.author | ifNameNullShowEmail }}</a>\n | <strong>Created at: </strong>{{ version.created_at }}<br />\n <strong>Object: </strong>{{ version.object | json }}\n </p>\n <hr />\n </div>\n <div *ngIf=\"opportunitiesVersioning?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.OpportunitiesMessage.NoVersionsMessage' | transloco\">\n </pw-no-data>\n </div>\n </ng-template>\n </li>\n <li [ngbNavItem]=\"3\">\n <a ngbNavLink>Files</a>\n <ng-template ngbNavContent>\n <pw-smart-crm-company-files [contactId]=\"contactId\"\n [accountId]=\"accountId\"\n [opportunityId]=\"opportunitiesId\">\n </pw-smart-crm-company-files>\n </ng-template>\n </li>\n </ul>\n\n <div [ngbNavOutlet]=\"nav\"></div>\n </div>\n</div>\n\n<ng-template #content\n let-modal>\n <div class=\"modal-header\">\n <h3 class=\"modal-title mb-0 p-0\">{{ 'Upload File' | transloco }}</h3>\n <button type=\"button\"\n class=\"btn-close float-end\"\n aria-label=\"Close\"\n (click)=\"modal.dismiss()\">\n\n </button>\n </div>\n <div class=\"modal-body\">\n <small> {{ 'User.Profile.PictureMessage' | transloco }}</small>\n <div class=\"row p-2\">\n <div class=\"col-12\">\n <div class=\"upload-box\">\n <div class=\"upload-box-content\">\n <div class=\"drop-container\"\n ngFileDrop\n [options]=\"options\"\n (uploadOutput)=\"onUploadOutput($event)\"\n [uploadInput]=\"uploadInput\">\n <p>\n Drag files here or\n <label class=\"upload-button\">\n <input type=\"file\"\n ngFileSelect\n [options]=\"options\"\n (uploadOutput)=\"onUploadOutput($event)\"\n [uploadInput]=\"uploadInput\"\n multiple />\n browse\n </label>\n to upload.\n </p>\n </div>\n <div class=\"upload-item\"\n *ngFor=\"let f of files; let i = index\">\n <div class=\"upload-item-content\">\n <div class=\"filename\">\n <div class=\"filename-left\">\n <i class=\"ionicon ion-ios-copy\" aria-hidden=\"true\"></i>\n <span>{{ f.name }}</span>\n </div>\n </div>\n <div class=\"progress-content\">\n <div class=\"progress\">\n <span class=\"bar\"\n [style.width]=\"f?.progress?.data?.percentage + '%'\"\n [class.is-done]=\"f['uploaded']\"></span>\n </div>\n </div>\n <div class=\"progress-text-content\">\n <span class=\"progress-text\"\n [class.is-done]=\"f['uploaded']\">\n <span *ngIf=\"!f['uploaded']\">{{ f.progress?.data?.percentage - 1 }}%\n </span>\n <span *ngIf=\"f['uploaded']\">100 %</span>\n <span *ngIf=\"!f['uploaded']\">Uploading...</span>\n <span *ngIf=\"f['uploaded']\">Done</span>\n </span>\n <span class=\"speed-and-eta-text\"\n *ngIf=\"f.progress?.data?.percentage !== 0 && !f['uploaded']\">\n <span>{{ f.progress?.data?.speedHuman }} </span>\n <span>ETA {{ f.progress?.data?.etaHuman }}</span>\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [":root{--first: rgb(23 105 225);--second: rgb(54 194 131);--third: rgb(255 171 0);--text: rgb(34 34 34);--tabs_bg: rgb(23 105 225);--tabs_text: rgb(255 255 255);--titles: rgb(34 34 34);--sidebar_bg: rgb(0, 48, 63);--sidebar_text: rgb(255 255 255)}.user-info .label{color:#777;font-size:14px;text-transform:capitalize}.user-info .user-value{border:0;border-bottom:1px solid rgb(119,119,119)}.user-info .user-value:focus{box-shadow:none}.user-info .user-value.is-invalid{border-color:#ff586b}.action-btn.active{color:#fff!important;background-color:var(--first)}.control-btns{display:none}.comment-field{border:0;border-bottom:1px solid rgb(242,242,242);color:#1769e1;display:none;font-size:15px;min-height:100px;padding:2px 5px!important}.comment-field:focus{border:1px solid rgb(23,105,225)!important;border-bottom:0;box-shadow:none}p{max-width:85%;white-space:pre-wrap}.show-controls .comment-field,.show-controls .control-btns{display:block}.show-controls p,.show-controls .edit-btn{display:none}select{appearance:none}textarea{resize:none}.clear-both{clear:both}.isDisabled input[type=text],.isDisabled select{pointer-events:none}.timeline-card.card{min-height:auto}@media (max-width: 768px){.completed-toggle{padding-top:10px}}.when-btn:focus{border:0;box-shadow:none}.no-actions{clear:both}.form-action-buttons{margin-bottom:14px;margin-top:15px}\n"] }]
|
|
480
480
|
}], ctorParameters: () => [{ type: i0.Injector }, { type: i1.CrmService }, { type: i2.NgbModal }, { type: i3.AuthService }, { type: Document, decorators: [{
|
|
481
481
|
type: Inject,
|
|
482
482
|
args: [DOCUMENT]
|
|
483
483
|
}] }], propDecorators: { onCommentSave: [] } });
|
|
484
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtY3JtLW9wcG9ydHVuaXRpZXMtaW5mby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3NtYXJ0LWNybS9zcmMvbGliL3ByaXZhdGUvY29tcG9uZW50cy9zbWFydC1jcm0tb3Bwb3J0dW5pdGllcy9zbWFydC1jcm0tb3Bwb3J0dW5pdGllcy1saXN0L3NtYXJ0LWNybS1vcHBvcnR1bml0aWVzLWluZm8vc21hcnQtY3JtLW9wcG9ydHVuaXRpZXMtaW5mby5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3NtYXJ0LWNybS9zcmMvbGliL3ByaXZhdGUvY29tcG9uZW50cy9zbWFydC1jcm0tb3Bwb3J0dW5pdGllcy9zbWFydC1jcm0tb3Bwb3J0dW5pdGllcy1saXN0L3NtYXJ0LWNybS1vcHBvcnR1bml0aWVzLWluZm8vc21hcnQtY3JtLW9wcG9ydHVuaXRpZXMtaW5mby5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQzdGLE9BQU8sRUFBb0IsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDaEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3hELE9BQU8s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OzBCQWtGdEMsTUFBTTsyQkFBQyxRQUFRO3lDQW9HcEIsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbmplY3QsIEluamVjdG9yLCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE5nYk1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xuaW1wb3J0IHsgQ1JNX0FDQ09VTlRfRklMRVNfUEFUSCB9IGZyb20gJ0Bwb3Npd2lzZS9zbWFydC1jcm0tc2hhcmVkJztcbmltcG9ydCB7IEFwcFNtYXJ0Q3JtIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2hhcmVkL21vZGVscy9zbWFydC1jcm0ubW9kZWwnO1xuaW1wb3J0IHsgUk9VVEVSUyB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NoYXJlZC9yb3V0ZXJzL3JvdXRlcnMnO1xuaW1wb3J0IHsgQ3JtU2VydmljZSB9IGZyb20gJ0Bwb3Npd2lzZS9zbWFydC1jcm0tc2hhcmVkJztcbmltcG9ydCB7IFVwbG9hZEZpbGUsIFVwbG9hZElucHV0LCBVcGxvYWRPdXRwdXQsIFVwbG9hZFN0YXR1cywgVXBsb2FkZXJPcHRpb25zIH0gZnJvbSAnbmd4LXVwbG9hZGVyJztcbmltcG9ydCBzd2FsIGZyb20gJ3N3ZWV0YWxlcnQyJztcblxuaW1wb3J0IHsgRE9DVU1FTlRfVFlQRV9FWFQsIFRPS0VOX0hFQURFUl9LRVkgfSBmcm9tICdAcG9zaXdpc2UvY29tbW9uLXV0aWxpdGllcyc7XG5pbXBvcnQgeyBDcm1BY2NvdW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2hhcmVkL2ludGVyZmFjZS9jcm0tYWNjb3VudC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ3JtQWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2hhcmVkL2ludGVyZmFjZS9jcm0tYWN0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDcm1WZXJzaW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2hhcmVkL2ludGVyZmFjZS9jcm0tb3Bwb3J0dW5pdHkuaW50ZXJmYWNlJztcbmltcG9ydCB7IEFwcEJhc2VDb21wb25lbnQgfSBmcm9tICdAcG9zaXdpc2UvYXBwLWJhc2UtY29tcG9uZW50JztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ0Bwb3Npd2lzZS9jb21tb24tdXRpbGl0aWVzJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnQHBvc2l3aXNlL2NvbW1vbi1zZXJ2aWNlcyc7XG5pbXBvcnQgeyBIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnQHBvc2l3aXNlL2hlbHBlci1zZXJ2aWNlJztcbmltcG9ydCB7IFZhbGlkYXRlRm9ybSB9IGZyb20gJ0Bwb3Npd2lzZS91dGlscyc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQge1xuICAgIE9wcG9ydHVuaXR5Q29tbWVudCxcbiAgICBPcHBvcnR1bml0eUNvbnRhY3QsXG4gICAgT3Bwb3J0dW5pdHlEYXRhXG59IGZyb20gJ2xpYnMvc21hcnQtY3JtL3NyYy9saWIvc2hhcmVkL2ludGVyZmFjZS9zbWFydC1jcm0tbW9kdWxlLmludGVyZmFjZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncHctc21hcnQtY3JtLW9wcG9ydHVuaXRpZXMtaW5mbycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NtYXJ0LWNybS1vcHBvcnR1bml0aWVzLWluZm8uY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3NtYXJ0LWNybS1vcHBvcnR1bml0aWVzLWluZm8uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBTbWFydENybU9wcG9ydHVuaXRpZXNJbmZvQ29tcG9uZW50XG4gICAgZXh0ZW5kcyBBcHBCYXNlQ29tcG9uZW50XG4gICAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveVxue1xuICAgIGlzTG9hZGVkID0gZmFsc2U7XG5cbiAgICBpc0Zvcm1FZGl0ID0gdHJ1ZTtcblxuICAgIG9wcG9ydHVuaXRpZXNJZDogbnVtYmVyO1xuXG4gICAgZGF0YTogT3Bwb3J0dW5pdHlEYXRhO1xuXG4gICAgYWJvdXRDb250cm9sczogVW50eXBlZEZvcm1Hcm91cDtcblxuICAgIHN1Ym1pdHRlZCA9IGZhbHNlO1xuICAgIGJ1dHRvbkJ1c3kgPSBmYWxzZTtcblxuICAgIGFjY291bnRzOiBDcm1BY2NvdW50W107XG5cbiAgICBmaWx0ZXJlZEFjY291bnRzOiBDcm1BY2NvdW50W10gPSBbXTtcblxuICAgIHN1YnNjcmlwdGlvbklkOiBudW1iZXI7XG5cbiAgICBhY3Rpb25zOiBDcm1BY3Rpb25bXTtcblxuICAgIGJ1dHRvbkRpc2FibGU6IGJvb2xlYW47XG5cbiAgICBoYXNBY2Nlc3M6IGJvb2xlYW47XG5cbiAgICBvcHRpb25zOiBVcGxvYWRlck9wdGlvbnM7XG5cbiAgICB1cGxvYWRJbnB1dDogRXZlbnRFbWl0dGVyPFVwbG9hZElucHV0PjtcblxuICAgIGZpbGVzOiBVcGxvYWRGaWxlW107XG5cbiAgICB0b2tlbjogc3RyaW5nO1xuXG4gICAgZHJhZ092ZXI6IGJvb2xlYW47XG5cbiAgICBjb250YWN0SWQ6IG51bWJlcjtcblxuICAgIGFjY291bnRJZDogbnVtYmVyO1xuXG4gICAgdXNlcklkOiBudW1iZXI7XG5cbiAgICBhY3Rpb25Db250cm9sczogVW50eXBlZEZvcm1Hcm91cDtcblxuICAgIGlzRGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIHVwZGF0aW5nID0gZmFsc2U7XG5cbiAgICBhY3Rpb25JZDogbnVtYmVyO1xuXG4gICAgc2hvd0Z1bGxDb21tZW50ID0gZmFsc2U7XG5cbiAgICBjb21tZW50SWQ6IG51bWJlcjtcblxuICAgIG9wcG9ydHVuaXRpZXNDb21tZW50czogT3Bwb3J0dW5pdHlDb21tZW50W107XG5cbiAgICBkYW5nZXJDb2xvcjogYm9vbGVhbjtcblxuICAgIGFsbENvbnRhY3RzOiBPcHBvcnR1bml0eUNvbnRhY3RbXTtcblxuICAgIGZpbHRlcmVkQ29udGFjdHM6IE9wcG9ydHVuaXR5Q29udGFjdFtdO1xuXG4gICAgb3Bwb3J0dW5pdGllc1ZlcnNpb25pbmc6IENybVZlcnNpb25bXTtcblxuICAgIHN1Ym1pdEFjdGlvbiA9IGZhbHNlO1xuXG4gICAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgICByb3V0ZXJzID0gUk9VVEVSUztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHByaXZhdGUgY3JtU2VydmljZTogQ3JtU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsLFxuICAgICAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSxcbiAgICAgICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnRcbiAgICApIHtcbiAgICAgICAgc3VwZXIoaW5qZWN0b3IpO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSB7IGNvbmN1cnJlbmN5OiAxLCBtYXhVcGxvYWRzOiAzIH07XG4gICAgICAgIHRoaXMudXBsb2FkSW5wdXQgPSBuZXcgRXZlbnRFbWl0dGVyPFVwbG9hZElucHV0PigpO1xuICAgICAgICB0aGlzLnRva2VuID0gYnRvYSh0aGlzLmF1dGhTZXJ2aWNlLmdldFRva2VuKCkpO1xuICAgICAgICB0aGlzLmZpbGVzID0gW107XG4gICAgICAgIHRoaXMuYWN0aW9uQ29udHJvbHMgPSBBcHBTbWFydENybS5nZXRPcHBvcnR1bml0eUFjdGlvbnNGb3JtKHRoaXMuaXNEaXNhYmxlZCk7XG4gICAgICAgIHRoaXMuYWJvdXRDb250cm9scyA9IEFwcFNtYXJ0Q3JtLmdldE9wcG9ydHVuaXRpZXNGb3JtKCk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZ2V0VXNlclN1YnNjcmlwdGlvbigpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uPy5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0QWN0aW9ucygpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0T3Bwb3J0dW5pdGllc0NvbW1lbnRzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJvdXRlLnBhcmFtcy5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9wcG9ydHVuaXRpZXNJZCA9IE51bWJlcihkYXRhWydpZCddKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wcG9ydHVuaXRpZXNJZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0T3Bwb3J0dW5pdHlEZXRhaWxzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25Db250cm9scy5nZXQoJ2NybV9vcHBvcnR1bml0eV9pZCcpLnNldFZhbHVlKHRoaXMub3Bwb3J0dW5pdGllc0lkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub25EYXRlU2VsZWN0ZWQoKTtcbiAgICAgICAgdGhpcy5nZXRDb250YWN0VmVyc2lvbigpO1xuICAgICAgICB0aGlzLnVzZXJJbmZvKCk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGNhbGwgdXNlciBpbmZvICovXG4gICAgcHJpdmF0ZSB1c2VySW5mbygpIHtcbiAgICAgICAgdGhpcy51c2VyU3RvcmUoKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXJJZCA9IHJlcy5pZDtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbkNvbnRyb2xzLmdldCgnb3duZXJfaWQnKS5zZXRWYWx1ZShyZXMuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gZ2V0IG9wcG9ydHVuaXRpZXMgZGV0YWlscyAqL1xuICAgIGdldE9wcG9ydHVuaXR5RGV0YWlscygpIHtcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5zdWJzY3JpcHRpb24pO1xuICAgICAgICB0aGlzLmNybVNlcnZpY2VcbiAgICAgICAgICAgIC5nZXRPcHBvcnR1bml0eURldGFpbHModGhpcy5zdWJzY3JpcHRpb24/LmlkLCB0aGlzLm9wcG9ydHVuaXRpZXNJZClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuY3JtX2NvbnRhY3RfaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmNybV9jb250YWN0LmRpc3BsYXlOYW1lID0gYCR7cmVzcG9uc2UuY3JtX2NvbnRhY3QuZmlyc3RfbmFtZX0gJHtyZXNwb25zZS5jcm1fY29udGFjdC5sYXN0X25hbWV9YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9wZXJhdG9yLWFzc2lnbm1lbnRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLm1vbnRobHlfYW1vdW50ID0gdGhpcy5kYXRhLm1vbnRobHlfYW1vdW50IC8gMTAwO1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb3BlcmF0b3ItYXNzaWdubWVudFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEub25lX3RpbWVfYW1vdW50ID0gdGhpcy5kYXRhLm9uZV90aW1lX2Ftb3VudCAvIDEwMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250YWN0SWQgPSByZXNwb25zZS5jcm1fY29udGFjdF9pZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY2NvdW50SWQgPSByZXNwb25zZS5jcm1fYWNjb3VudF9pZDtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFib3V0Q29udHJvbHMucGF0Y2hWYWx1ZShyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWJvdXRDb250cm9scy5nZXQoJ2NybV9jb250YWN0X2lkJykucGF0Y2hWYWx1ZShyZXNwb25zZS5jcm1fY29udGFjdCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWJvdXRDb250cm9scy5nZXQoJ2NybV9hY2NvdW50X2lkJykucGF0Y2hWYWx1ZShyZXNwb25zZS5jcm1fYWNjb3VudCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uQ29udHJvbHMuZ2V0KCdjcm1fY29udGFjdF9pZCcpLnNldFZhbHVlKHRoaXMuY29udGFjdElkKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25Db250cm9scy5nZXQoJ2NybV9hY2NvdW50X2lkJykuc2V0VmFsdWUodGhpcy5hY2NvdW50SWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byB1cGRhdGUgb3Bwb3J0dW5pdGllcyAqL1xuICAgIHVwZGF0ZU9wcG9ydHVuaXRpZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmFib3V0Q29udHJvbHMuaW52YWxpZCkge1xuICAgICAgICAgICAgdGhpcy5zdWJtaXR0ZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZm9ybURhdGEgPSB0aGlzLmFib3V0Q29udHJvbHM7XG4gICAgICAgICAgICBjb25zdCBkYXRhT2JqZWN0ID0ge1xuICAgICAgICAgICAgICAgIGNybV9hY2NvdW50X2lkOiBmb3JtRGF0YS5nZXQoJ2NybV9hY2NvdW50X2lkJykudmFsdWU/LmlkLFxuICAgICAgICAgICAgICAgIGNybV9jb250YWN0X2lkOiBmb3JtRGF0YS5nZXQoJ2NybV9jb250YWN0X2lkJykudmFsdWU/LmlkLFxuICAgICAgICAgICAgICAgIG9uZV90aW1lX2Ftb3VudDogZm9ybURhdGEuZ2V0KCdvbmVfdGltZV9hbW91bnQnKS52YWx1ZSAqIDEwMCxcbiAgICAgICAgICAgICAgICBtb250aGx5X2Ftb3VudDogZm9ybURhdGEuZ2V0KCdtb250aGx5X2Ftb3VudCcpLnZhbHVlICogMTAwXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5jcm1TZXJ2aWNlXG4gICAgICAgICAgICAgICAgLnVwZGF0ZU9wcG9ydHVuaXRpZXModGhpcy5zdWJzY3JpcHRpb24/LmlkLCB0aGlzLm9wcG9ydHVuaXRpZXNJZCwge1xuICAgICAgICAgICAgICAgICAgICAuLi5mb3JtRGF0YS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgLi4uZGF0YU9iamVjdFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNsYXRpb24udHJhbnNsYXRlKCdDcm0uT3Bwb3J0dW5pdGllc01lc3NhZ2UuVXBkYXRlZE1lc3NhZ2UnKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzRm9ybUVkaXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE9wcG9ydHVuaXR5RGV0YWlscygpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmFkZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0dGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gc2F2ZSBjb21tZW50ICovXG4gICAgQFZhbGlkYXRlRm9ybSgnYWN0aW9uQ29udHJvbHMnKVxuICAgIG9uQ29tbWVudFNhdmUoKSB7XG4gICAgICAgIHRoaXMuYnV0dG9uQnVzeSA9IHRydWU7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmFjdGlvbkNvbnRyb2xzLnZhbHVlO1xuICAgICAgICBkYXRhLndoZW4gPSBIZWxwZXJTZXJ2aWNlLmRhdGVGb3JtYXQoZGF0YT8ud2hlbik7XG4gICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgLnBvc3RBY2NvdW50Q29tbWVudCh0aGlzLnN1YnNjcmlwdGlvbj8uaWQsIGRhdGEpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbkNvbnRyb2xzLmdldCgnY29tbWVudCcpLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRPcHBvcnR1bml0aWVzQ29tbWVudHMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0LnN1Y2Nlc3MoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNsYXRpb24udHJhbnNsYXRlKCdDcm0uT3Bwb3J0dW5pdGllc01lc3NhZ2UuQ29tbWVudFN1Ym1pdHRlZE1lc3NhZ2UnKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmFkZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRBY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1dHRvbkJ1c3kgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNob3dEYXRlUGlja2VyKGV2ZW50LCBpZCkge1xuICAgICAgICB0aGlzLmFjdGlvbkNvbnRyb2xzLmdldCgnd2hlbicpLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcbiAgICAgICAgY29uc3QgYWN0aW9uQnV0dG9ucyA9IHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYWN0aW9uLWJ0bicpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFjdGlvbkJ1dHRvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFjdGlvbkJ1dHRvbnNbaV0uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgICB0aGlzLmFjdGlvbkNvbnRyb2xzLmdldCgnY3JtX2FjdGlvbl9pZCcpLnNldFZhbHVlKGlkKTtcbiAgICB9XG5cbiAgICBvbkRhdGVTZWxlY3RlZCgpIHtcbiAgICAgICAgdGhpcy5hY3Rpb25Db250cm9scy5nZXQoJ3doZW4nKS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRGF0ZSA9IHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3doZW4nKT8uWyd2YWx1ZSddO1xuICAgICAgICAgICAgY29uc3QgdG9kYXlEYXRlID0gbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnREQtTU1NLVlZWVknKTtcbiAgICAgICAgICAgIGlmICh0b2RheURhdGUgPCBzZWxlY3RlZERhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uQ29udHJvbHMuZ2V0KCdjb21wbGV0ZWQnKS5kaXNhYmxlKHsgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25Db250cm9scy5nZXQoJ2NvbXBsZXRlZCcpLnNldFZhbHVlKGZhbHNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25Db250cm9scy5nZXQoJ2NvbXBsZXRlZCcpLmVuYWJsZSh7IG9ubHlTZWxmOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNEaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gZ2V0IGFsbCBjb21tZW50cyAqL1xuICAgIHByaXZhdGUgZ2V0T3Bwb3J0dW5pdGllc0NvbW1lbnRzKCkge1xuICAgICAgICB0aGlzLmNybVNlcnZpY2VcbiAgICAgICAgICAgIC5nZXRPcHBvcnR1bml0aWVzQ29tbWVudHModGhpcy5vcHBvcnR1bml0aWVzSWQsIHRoaXMuc3Vic2NyaXB0aW9uPy5pZClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocmVzcCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3A/LmNybV9hY2NvdW50X2FjdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wcG9ydHVuaXRpZXNDb21tZW50cyA9IHJlc3AuY3JtX2FjY291bnRfYWN0aW9ucztcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wcG9ydHVuaXRpZXNDb21tZW50cy5mb3JFYWNoKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS53aGVuX3Nob3J0X2RhdGUgPSBtb21lbnQoZGF0YS53aGVuKS5mb3JtYXQoJ0RELU1NTS1ZWVlZJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWZmID0gbW9tZW50KG5ldyBEYXRlKGRhdGEud2hlbikpLmRpZmYobW9tZW50KG5ldyBEYXRlKCkpLCAnZGF5cycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vbWVudChuZXcgRGF0ZShkYXRhLndoZW4pKSA8IG1vbWVudChuZXcgRGF0ZSgpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbJ2R1ZSddID0gYE92ZXJkdWUgYnkgJHtNYXRoLmFicyhkaWZmKX0gZGF5c2A7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVsnY29sb3InXSA9IHRoaXMuZGFuZ2VyQ29sb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbJ2R1ZSddID0gYEluICR7ZGlmZn0gZGF5c2A7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVsnY29sb3InXSA9ICF0aGlzLmRhbmdlckNvbG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wcG9ydHVuaXRpZXNDb21tZW50cy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoYS53aGVuKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShiLndoZW4pLmdldFRpbWUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3Bwb3J0dW5pdGllc0NvbW1lbnRzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtWyd3aGVuJ10gPSBtb21lbnQoaXRlbVsnd2hlbiddKS5mb3JtYXQoJ0RELU1NTS1ZWVlZJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtWyd5ZWFyJ10gPSBtb21lbnQoaXRlbVsnd2hlbiddKS5mb3JtYXQoJ1lZWVknKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1bJ21vbnRoJ10gPSBtb21lbnQoaXRlbVsnd2hlbiddKS5mb3JtYXQoJ01NJyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wbGV0ZWRDYW5jZWxsZWRBY3Rpb25zOiBPcHBvcnR1bml0eUNvbW1lbnRbXSA9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wcG9ydHVuaXRpZXNDb21tZW50cy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0+IGFjdGlvbi5jb21wbGV0ZWQgPT09IHRydWUgfHwgYWN0aW9uLmNhbmNlbGxlZCA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkQ2FuY2VsbGVkQWN0aW9ucy5yZXZlcnNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vdENvbXBsZXRlZENhbmNlbGxlZEFjdGlvbnM6IE9wcG9ydHVuaXR5Q29tbWVudFtdID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3Bwb3J0dW5pdGllc0NvbW1lbnRzLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPT4gYWN0aW9uLmNvbXBsZXRlZCA9PT0gZmFsc2UgJiYgYWN0aW9uLmNhbmNlbGxlZCA9PT0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3Bwb3J0dW5pdGllc0NvbW1lbnRzID1cbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdENvbXBsZXRlZENhbmNlbGxlZEFjdGlvbnMuY29uY2F0KGNvbXBsZXRlZENhbmNlbGxlZEFjdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXQgZigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWJvdXRDb250cm9scy5jb250cm9scztcbiAgICB9XG5cbiAgICBnZXQgYWN0aW9uRm9ybUNvbnRyb2xzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3Rpb25Db250cm9scy5jb250cm9scztcbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gZ2V0IHRoZSBsaXN0IG9mIGFjY291bnRzIGJ5IHN1YnNjcmlwdGlvbklkICovXG4gICAgZ2V0QWNjb3VudHNCeVN1YnNjcmlwdGlvbigpIHtcbiAgICAgICAgdGhpcy5jcm1TZXJ2aWNlLmdldEFjY291bnRzQnlTdWJzY3JpcHRpb24odGhpcy5zdWJzY3JpcHRpb24/LmlkKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWNjb3VudHMgPSByZXMuYWNjb3VudHM7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byBnZXQgYW5kIHNob3cgYWxsIHRoZSBhY3Rpb25zICovXG4gICAgcHJpdmF0ZSBnZXRBY3Rpb25zKCkge1xuICAgICAgICB0aGlzLmNybVNlcnZpY2UuZ2V0QWN0aW9uc0J5U3Vic2NyaXB0aW9uSWQodGhpcy5zdWJzY3JpcHRpb24/LmlkKS5zdWJzY3JpYmUocmVzcCA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcCAmJiByZXNwLmNybV9hY3Rpb25zICYmIHJlc3AuY3JtX2FjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9ucyA9IHJlc3AuY3JtX2FjdGlvbnM7XG4gICAgICAgICAgICAgICAgdGhpcy5idXR0b25EaXNhYmxlID0gdGhpcy5hY3Rpb25zLmV2ZXJ5KFxuICAgICAgICAgICAgICAgICAgICB4ID0+IHgudmlzaWJsZSA9PT0gZmFsc2UgfHwgeC52aXNpYmxlID09PSBudWxsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idXR0b25EaXNhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaGFzQWNjZXNzID0gdGhpcy5oYXNBZG1pbkFjY2Vzcyh0aGlzLnN1YnNjcmlwdGlvbj8uaWQpO1xuICAgIH1cblxuICAgIHNob3dFZGl0Q29udHJvbHMoZXZlbnQpIHtcbiAgICAgICAgY29uc3QgY29tbWVudHMgPSB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2NhcmQtaGVhZGVyJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbW1lbnRzW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3ctY29udHJvbHMnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQgJiYgZXZlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJy5jYXJkLWhlYWRlcicpLmNsYXNzTGlzdC5hZGQoJ3Nob3ctY29udHJvbHMnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byB1cGRhdGUgdGhlIGRhdGUgKi9cbiAgICBvbkRhdGVTZWxlY3QoZXZlbnQsIGFjdGlvbikge1xuICAgICAgICBjb25zdCBjb21tZW50T2JqID0ge1xuICAgICAgICAgICAgd2hlbjogSGVscGVyU2VydmljZS5kYXRlRm9ybWF0KGV2ZW50KSxcbiAgICAgICAgICAgIGNvbW1lbnQ6IGFjdGlvbi5jb21tZW50LFxuICAgICAgICAgICAgY29tcGxldGVkOiBhY3Rpb24uY29tcGxldGVkLFxuICAgICAgICAgICAgY2FuY2VsbGVkOiBhY3Rpb24uY2FuY2VsbGVkLFxuICAgICAgICAgICAgY3JtX2FjY291bnRfaWQ6IGFjdGlvbi5jcm1fYWNjb3VudF9pZFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNybVNlcnZpY2VcbiAgICAgICAgICAgIC51cGRhdGVBY2NvdW50Q29tbWVudCh0aGlzLnN1YnNjcmlwdGlvbj8uaWQsIGFjdGlvbi5pZCwgY29tbWVudE9iailcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcygnZGF0ZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0T3Bwb3J0dW5pdGllc0NvbW1lbnRzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIHNob3cgRGF0ZVBpY2tlciAqL1xuICAgIHNob3dEYXRlUGlja2VyVXBkYXRlKGFjdGlvbklkKSB7XG4gICAgICAgIHRoaXMudXBkYXRpbmcgPSAhdGhpcy51cGRhdGluZztcbiAgICAgICAgdGhpcy5hY3Rpb25JZCA9IGFjdGlvbklkO1xuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byBzZXQgdGhlIGFjdGlvbiBhcyBjb21wbGV0ZWQgKi9cbiAgICBzZXRBc0NvbXBsZXRlZE9yVW5jb21wbGV0ZWQoaWQsIGFjdGlvbiwgY29tcGxldGVkT3JVbmNvbXBsZXRlZCkge1xuICAgICAgICBjb25zdCBhbGVydFRpdGxlID0gY29tcGxldGVkT3JVbmNvbXBsZXRlZCA/ICdJbkNvbXBsZXRlZCcgOiAnQ29tcGxldGVkJztcblxuICAgICAgICByZXR1cm4gc3dhbFxuICAgICAgICAgICAgLmZpcmUoe1xuICAgICAgICAgICAgICAgIHRpdGxlOiBhbGVydFRpdGxlLFxuICAgICAgICAgICAgICAgIGh0bWw6IGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gc2V0IGFzICR7YWxlcnRUaXRsZX0/YCxcbiAgICAgICAgICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLFxuICAgICAgICAgICAgICAgIHJldmVyc2VCdXR0b25zOiB0cnVlLFxuICAgICAgICAgICAgICAgIGljb246ICd3YXJuaW5nJ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcy52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3Rpb25PYmogPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50OiBhY3Rpb24uY29tbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZDogIWNvbXBsZXRlZE9yVW5jb21wbGV0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxsZWQ6IGFjdGlvbi5jYW5jZWxsZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjcm1fYWNjb3VudF9pZDogYWN0aW9uLmNybV9hY2NvdW50X2lkXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAgICAgLnVwZGF0ZUFjY291bnRDb21tZW50KHRoaXMuc3Vic2NyaXB0aW9uPy5pZCwgaWQsIGFjdGlvbk9iailcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGlvbi50cmFuc2xhdGUoJ0NybS5TZXR0aW5ncy5VcGRhdGVkTWVzc2FnZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbnMuc3BsaWNlKGFjdGlvbiwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBY3Rpb25zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRPcHBvcnR1bml0aWVzQ29tbWVudHMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byB1cGRhdGUgY29tbWVudCAqL1xuICAgIHVwZGF0ZUNvbW1lbnQoaXRlbSkge1xuICAgICAgICBjb25zdCBjb21tZW50T2JqID0ge1xuICAgICAgICAgICAgY29tbWVudDogaXRlbS5jb21tZW50LFxuICAgICAgICAgICAgY29tcGxldGVkOiBpdGVtLmNvbXBsZXRlZCxcbiAgICAgICAgICAgIGNhbmNlbGxlZDogaXRlbS5jYW5jZWxsZWQsXG4gICAgICAgICAgICBjcm1fYWNjb3VudF9pZDogaXRlbS5jcm1fYWNjb3VudF9pZFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNybVNlcnZpY2VcbiAgICAgICAgICAgIC51cGRhdGVBY2NvdW50Q29tbWVudCh0aGlzLnN1YnNjcmlwdGlvbj8uaWQsIGl0ZW0uaWQsIGNvbW1lbnRPYmopXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0LnN1Y2Nlc3MoJ2NvbW1lbnQgdXBkYXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dFZGl0Q29udHJvbHModW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmdldE9wcG9ydHVuaXRpZXNDb21tZW50cygpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIHNldCB0aGUgYWN0aW9uIGFzIGNhbmNlbGxlZCAqL1xuICAgIHNldEFzQ2FuY2VsbGVkKGlkLCBhY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIHN3YWxcbiAgICAgICAgICAgIC5maXJlKHtcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0NhbmNlbCcsXG4gICAgICAgICAgICAgICAgaHRtbDogYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBzZXQgYXMgY2FuY2VsbGVkP2AsXG4gICAgICAgICAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICByZXZlcnNlQnV0dG9uczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpY29uOiAnd2FybmluZydcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihyZXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0aW9uT2JqID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudDogYWN0aW9uLmNvbW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQ6IGFjdGlvbi5jb21wbGV0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjcm1fYWNjb3VudF9pZDogYWN0aW9uLmNybV9hY2NvdW50X2lkXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAgICAgLnVwZGF0ZUFjY291bnRDb21tZW50KHRoaXMuc3Vic2NyaXB0aW9uPy5pZCwgaWQsIGFjdGlvbk9iailcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGlvbi50cmFuc2xhdGUoJ0NybS5TZXR0aW5ncy5VcGRhdGVkTWVzc2FnZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbnMuc3BsaWNlKGFjdGlvbiwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBY3Rpb25zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRPcHBvcnR1bml0eURldGFpbHMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byBjYWxsIGNvbnRhY3RzICovXG4gICAgZ2V0QWxsQ29udGFjdHMoKSB7XG4gICAgICAgIHRoaXMuY3JtU2VydmljZS5nZXRBbGxDb250YWN0cyh0aGlzLnN1YnNjcmlwdGlvbj8uaWQsICcnKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgdGhpcy5hbGxDb250YWN0cyA9IHJlc3BvbnNlLmNvbnRhY3RzO1xuICAgICAgICAgICAgdGhpcy5hbGxDb250YWN0cy5mb3JFYWNoKG1lbWJlciA9PiB7XG4gICAgICAgICAgICAgICAgbWVtYmVyLmRpc3BsYXlOYW1lID0gYCR7bWVtYmVyLmZpcnN0X25hbWUgfHwgJyd9ICR7bWVtYmVyLmxhc3RfbmFtZSB8fCAnJ30gLSAke1xuICAgICAgICAgICAgICAgICAgICBtZW1iZXIuZW1haWxcbiAgICAgICAgICAgICAgICB9YC50cmltKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIHNlYXJjaCBhY2NvdW50cyAqL1xuICAgIGFjY291bnRTZWFyY2goZXZlbnQpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBbXTtcbiAgICAgICAgaWYgKGV2ZW50LnF1ZXJ5KSB7XG4gICAgICAgICAgICBkYXRhID0gdGhpcy5hY2NvdW50cy5maWx0ZXIoKHg6IENybUFjY291bnQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4geC5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZXZlbnQucXVlcnkudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWNjb3VudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICBkYXRhLnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbHRlcmVkQ29udGFjdHMgPSBkYXRhO1xuICAgIH1cblxuICAgIG9uQ29udGFjdFNlYXJjaChldmVudCkge1xuICAgICAgICBsZXQgZGF0YSA9IFtdO1xuICAgICAgICBpZiAoZXZlbnQucXVlcnkpIHtcbiAgICAgICAgICAgIGRhdGEgPSB0aGlzLmFsbENvbnRhY3RzLmZpbHRlcigoeDogT3Bwb3J0dW5pdHlDb250YWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHguZGlzcGxheU5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhldmVudC5xdWVyeS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hbGxDb250YWN0cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGRhdGEucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlsdGVyZWRDb250YWN0cyA9IGRhdGE7XG4gICAgfVxuXG4gICAgb3Blbk1vZGFsKGNvbnRlbnQpIHtcbiAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2Uub3Blbihjb250ZW50LCB7IGNlbnRlcmVkOiB0cnVlLCB3aW5kb3dDbGFzczogJ21vZGFsLWhvbGRlcicgfSk7XG4gICAgfVxuXG4gICAgb25DbG9zZSgpIHtcbiAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2UuZGlzbWlzc0FsbCgpO1xuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byBnZXQgb3Bwb3J0dW5pdGllcyB2ZXJzaW9ucyAqL1xuICAgIHByaXZhdGUgZ2V0Q29udGFjdFZlcnNpb24oKSB7XG4gICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgLmdldENvbnRhY3RWZXJzaW9uKHRoaXMuc3Vic2NyaXB0aW9uPy5pZCwgdGhpcy5vcHBvcnR1bml0aWVzSWQsICdDcm1PcHBvcnR1bml0eScpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wcG9ydHVuaXRpZXNWZXJzaW9uaW5nID0gcmVzcG9uc2UudmVyc2lvbnM7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvblVwbG9hZE91dHB1dChvdXRwdXQ6IFVwbG9hZE91dHB1dCk6IHZvaWQge1xuICAgICAgICBzd2l0Y2ggKG91dHB1dC50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdhbGxBZGRlZFRvUXVldWUnOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXZlbnQ6IFVwbG9hZElucHV0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3VwbG9hZEFsbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw6IENSTV9BQ0NPVU5UX0ZJTEVTX1BBVEgsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lcl9pZDogYCR7dGhpcy51c2VySWR9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm1fYWNjb3VudF9pZDogYCR7dGhpcy5hY2NvdW50SWR9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm1fY29udGFjdF9pZDogYCR7dGhpcy5jb250YWN0SWR9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm1fb3Bwb3J0dW5pdHlfaWQ6IGAke3RoaXMub3Bwb3J0dW5pdGllc0lkfWBcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW1RPS0VOX0hFQURFUl9LRVldOiB0aGlzLnRva2VuXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkSW5wdXQuZW1pdChldmVudCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdhZGRlZFRvUXVldWUnOlxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3V0cHV0LmZpbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4dCA9IG91dHB1dC5maWxlLm5hbWUuc3BsaXQoJy4nKS5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKERPQ1VNRU5UX1RZUEVfRVhULmluY2x1ZGVzKGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsZXMucHVzaChvdXRwdXQuZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0LmVycm9yKCdmaWxlIGZvcm1hdHMgaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3VwbG9hZGluZyc6XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvdXRwdXQuZmlsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmZpbGVzLmZpbmRJbmRleChcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPT4gdHlwZW9mIG91dHB1dC5maWxlICE9PSAndW5kZWZpbmVkJyAmJiBmaWxlLmlkID09PSBvdXRwdXQuZmlsZS5pZFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGVzW2luZGV4XSA9IG91dHB1dC5maWxlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3JlbW92ZWQnOlxuICAgICAgICAgICAgICAgIHRoaXMuZmlsZXMgPSB0aGlzLmZpbGVzLmZpbHRlcigoZmlsZTogVXBsb2FkRmlsZSkgPT4gZmlsZSAhPT0gb3V0cHV0LmZpbGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZHJhZ092ZXInOlxuICAgICAgICAgICAgICAgIHRoaXMuZHJhZ092ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZHJhZ091dCc6XG4gICAgICAgICAgICBjYXNlICdkcm9wJzpcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWdPdmVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkb25lJzpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gICAgICAgICAgICBpZiAoZmlsZS5wcm9ncmVzcy5zdGF0dXMgPT09IFVwbG9hZFN0YXR1cy5Eb25lKSB7XG4gICAgICAgICAgICAgICAgZmlsZVsndXBsb2FkZWQnXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyB3YWl0IGZvciA1MDBtcyBiZWZvcmUgZmlsdGVyIGZpbGVzXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5maWxlcyA9IHRoaXMuZmlsZXMuZmlsdGVyKGZpbGUgPT4gZmlsZS5wcm9ncmVzcy5zdGF0dXMgIT09IFVwbG9hZFN0YXR1cy5Eb25lKTtcbiAgICAgICAgfSwgNTAwKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicm93XCI+XG4gIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJtZS1hdXRvIG1iLTBcIj5cbiAgICAgIDxoMiBjbGFzcz1cIm1iLTBcIj5cbiAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiXG4gICAgICAgICAgKGNsaWNrKT1cImJhY2soKVwiXG4gICAgICAgICAgY2xhc3M9XCJwcmV2aW91c1wiPjxpIGNsYXNzPVwiZmEgZmEtYXJyb3ctYWx0LWNpcmNsZS1sZWZ0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvYT5cbiAgICAgICAgT3Bwb3J0dW5pdHkgSW5mb1xuICAgICAgPC9oMj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTRcIj5cbiAgICA8ZGl2IGNsYXNzPVwidXNlci1pbmZvIHAtMyBjYXJkIHBiLTAgaC1hdXRvXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWItMiB0ZXh0LWNlbnRlclwiPlxuICAgICAgICA8YSBjbGFzcz1cInByb2ZpbGUtaW1hZ2VcIj5cbiAgICAgICAgICA8aW1nIHdpZHRoPVwiMTAwXCJcbiAgICAgICAgICAgIGhlaWdodD1cIjEwMFwiXG4gICAgICAgICAgICBjbGFzcz1cInJvdW5kZWQtY2lyY2xlIGltZy1ib3JkZXIgd2lkdGgtMTAwXCJcbiAgICAgICAgICAgIGFsdD1cInVzZXJcIlxuICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ltZy9pY29ucy9tYWxlLnBuZ1wiIC8+XG4gICAgICAgIDwvYT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTQgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8aDQgY2xhc3M9XCJkLWlubGluZS1ibG9ja1wiPlxuICAgICAgICAgIEFib3V0IDxzcGFuICpuZ0lmPVwiZGF0YT8uaWRcIj57eyBkYXRhLnRpdGxlIH19PC9zcGFuPlxuICAgICAgICA8L2g0PlxuICAgICAgICA8YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApO1wiXG4gICAgICAgICAgKm5nSWY9XCJpc0Zvcm1FZGl0XCJcbiAgICAgICAgICBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtcHJpbWFyeSBmbG9hdC1lbmRcIlxuICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzRm9ybUVkaXQgPSAhaXNGb3JtRWRpdDsgZ2V0QWNjb3VudHNCeVN1YnNjcmlwdGlvbigpOyBnZXRBbGxDb250YWN0cygpXG4gICAgICAgICAgICAgICAgICAgIFwiPkVkaXQ8L2E+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiYWJvdXRDb250cm9sc1wiXG4gICAgICAgIFtjbGFzcy5pc0Rpc2FibGVkXT1cImlzRm9ybUVkaXRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbCBtYi0wXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICdDcm0uT3Bwb3J0dW5pdGllc01lc3NhZ2UuVGl0bGUnIHwgdHJhbnNsb2NvXG4gICAgICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgcm91bmRlZC0wIHBzLTEgdXNlci12YWx1ZVwiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ3RpdGxlJ10uZXJyb3JzIH1cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTMgdWktZmx1aWQgc2tpbGxzLW1vZGFsXCJcbiAgICAgICAgICAqbmdJZj1cImRhdGE/LmNybV9jb250YWN0X2lkXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwgbWItMlwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAnQ3JtLk9wcG9ydHVuaXRpZXNNZXNzYWdlLkNvbnRhY3QnIHwgdHJhbnNsb2NvXG4gICAgICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICA8YSBbcm91dGVyTGlua109XCJbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgcm91dGVycy5jb250YWN0SW5mbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNybV9jb250YWN0X2lkXG4gICAgICAgICAgICAgICAgICAgICAgICBdXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGQtYmxvY2sgcGItMiBwcy0xIHVzZXItdmFsdWVcIlxuICAgICAgICAgICAgKm5nSWY9XCJpc0Zvcm1FZGl0ICYmIGRhdGE/LmNybV9jb250YWN0X2lkXCI+e3sgZGF0YT8uY3JtX2NvbnRhY3Q/LmZpcnN0X25hbWUgfX0ge3sgZGF0YT8uY3JtX2NvbnRhY3Q/Lmxhc3RfbmFtZSB9fTwvYT5cbiAgICAgICAgICA8cC1hdXRvQ29tcGxldGUgKm5nSWY9XCIhaXNGb3JtRWRpdCB8fCAhZGF0YT8uY3JtX2NvbnRhY3RfaWRcIlxuICAgICAgICAgICAgW3N1Z2dlc3Rpb25zXT1cImZpbHRlcmVkQ29udGFjdHNcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY3JtX2NvbnRhY3RfaWRcIlxuICAgICAgICAgICAgZGF0YUtleT1cImlkXCJcbiAgICAgICAgICAgIGZpZWxkPVwiZGlzcGxheU5hbWVcIlxuICAgICAgICAgICAgW2Ryb3Bkb3duXT1cInRydWVcIlxuICAgICAgICAgICAgKGNvbXBsZXRlTWV0aG9kKT1cIm9uQ29udGFjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJ3LTEwMFwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBjb250YWN0c1wiXG4gICAgICAgICAgICBbbXVsdGlwbGVdPVwiZmFsc2VcIj5cbiAgICAgICAgICA8L3AtYXV0b0NvbXBsZXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTMgdWktZmx1aWQgc2tpbGxzLW1vZGFsXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwgbWItMlwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAnQ3JtLk9wcG9ydHVuaXRpZXNNZXNzYWdlLkFjY291bnQnIHwgdHJhbnNsb2NvXG4gICAgICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICA8YSBbcm91dGVyTGlua109XCJbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgcm91dGVycy5hY2NvdW50SW5mbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNybV9hY2NvdW50X2lkXG4gICAgICAgICAgICAgICAgICAgICAgICBdXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGQtYmxvY2sgcGItMiBwcy0xIHVzZXItdmFsdWVcIlxuICAgICAgICAgICAgKm5nSWY9XCJpc0Zvcm1FZGl0ICYmIGRhdGE/LmNybV9hY2NvdW50X2lkXCI+e3sgZGF0YT8uY3JtX2FjY291bnQ/Lm5hbWUgfX08L2E+XG4gICAgICAgICAgPHAtYXV0b0NvbXBsZXRlICpuZ0lmPVwiIWlzRm9ybUVkaXQgfHwgIWRhdGE/LmNybV9hY2NvdW50X2lkXCJcbiAgICAgICAgICAgIFtzdWdnZXN0aW9uc109XCJmaWx0ZXJlZEFjY291bnRzXCJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNybV9hY2NvdW50X2lkXCJcbiAgICAgICAgICAgIGRhdGFLZXk9XCJpZFwiXG4gICAgICAgICAgICBmaWVsZD1cIm5hbWVcIlxuICAgICAgICAgICAgW2Ryb3Bkb3duXT1cInRydWVcIlxuICAgICAgICAgICAgKGNvbXBsZXRlTWV0aG9kKT1cImFjY291bnRTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICBzdHlsZUNsYXNzPVwidy0xMDBcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggYWNjb3VudHNcIlxuICAgICAgICAgICAgW211bHRpcGxlXT1cImZhbHNlXCI+XG4gICAgICAgICAgPC9wLWF1dG9Db21wbGV0ZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwgbWItMFwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAnQ3JtLk9wcG9ydHVuaXRpZXNNZXNzYWdlLk9uZVRpbWVBbW91bnQnIHwgdHJhbnNsb2NvXG4gICAgICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvcm0tY29udHJvbCBkLWJsb2NrIHBiLTIgcHMtMSB1c2VyLXZhbHVlXCJcbiAgICAgICAgICAgICpuZ0lmPVwiaXNGb3JtRWRpdCAmJiBkYXRhPy5vbmVfdGltZV9hbW91bnRcIj57eyBkYXRhPy5vbmVfdGltZV9hbW91bnQgfCBjdXJyZW5jeSB9fTwvc3Bhbj5cbiAgICAgICAgICA8aW5wdXQgKm5nSWY9XCIhaXNGb3JtRWRpdCB8fCAhZGF0YT8ub25lX3RpbWVfYW1vdW50XCJcbiAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgbnVtYmVyc09ubHlcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIHJvdW5kZWQtMCBwcy0xIHVzZXItdmFsdWVcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwib25lX3RpbWVfYW1vdW50XCJcbiAgICAgICAgICAgIGlkPVwib25lX3RpbWVfYW1vdW50XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOiBzdWJtaXR0ZWQgJiYgZlsnb25lX3RpbWVfYW1vdW50J10uZXJyb3JzIH1cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbCBtYi0wXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICdDcm0uT3Bwb3J0dW5pdGllc01lc3NhZ2UuTW9udGhseUFtb3VudCcgfCB0cmFuc2xvY29cbiAgICAgICAgICAgICAgICAgICAgfX08L2xhYmVsPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9ybS1jb250cm9sIGQtYmxvY2sgcGItMiBwcy0xIHVzZXItdmFsdWVcIlxuICAgICAgICAgICAgKm5nSWY9XCJpc0Zvcm1FZGl0ICYmIGRhdGE/Lm1vbnRobHlfYW1vdW50XCI+e3sgZGF0YT8ubW9udGhseV9hbW91bnQgfCBjdXJyZW5jeSB9fTwvc3Bhbj5cbiAgICAgICAgICA8aW5wdXQgKm5nSWY9XCIhaXNGb3JtRWRpdCB8fCAhZGF0YT8ubW9udGhseV9hbW91bnRcIlxuICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICBudW1iZXJzT25seVxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgcm91bmRlZC0wIHBzLTEgdXNlci12YWx1ZVwiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJtb250aGx5X2Ftb3VudFwiXG4gICAgICAgICAgICBpZD1cIm1vbnRobHlfYW1vdW50XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOiBzdWJtaXR0ZWQgJiYgZlsnbW9udGhseV9hbW91bnQnXS5lcnJvcnMgfVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzRm9ybUVkaXRcIlxuICAgICAgICAgIGNsYXNzPVwidGV4dC1lbmQgZm9ybS1hY3Rpb24tYnV0dG9uc1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnlcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImlzRm9ybUVkaXQgPSAhaXNGb3JtRWRpdDsgZ2V0T3Bwb3J0dW5pdHlEZXRhaWxzKClcIlxuICAgICAgICAgICAgdmFsdWU9XCJDYW5jZWxcIiAvPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG1zLTNcIlxuICAgICAgICAgICAgdmFsdWU9XCJTdWJtaXRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZU9wcG9ydHVuaXRpZXMoKVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9mb3JtPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtOFwiPlxuICAgIDx1bCBuZ2JOYXZcbiAgICAgICNuYXY9XCJuZ2JOYXZcIlxuICAgICAgY2xhc3M9XCJuYXYtdGFic1wiPlxuICAgICAgPGxpIFtuZ2JOYXZJdGVtXT1cIjFcIj5cbiAgICAgICAgPGEgbmdiTmF2TGluaz5Ob3RlczwvYT5cbiAgICAgICAgPG5nLXRlbXBsYXRlIG5nYk5hdkNvbnRlbnQ+XG4gICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJhY3Rpb25Db250cm9sc1wiXG4gICAgICAgICAgICAobmdTdWJtaXQpPVwib25Db21tZW50U2F2ZSgpXCI+XG4gICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjb21tZW50XCJcbiAgICAgICAgICAgICAgcm93cz1cIjZcIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkNvbnRyb2xzLmdldCgnY29tbWVudCcpLnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uQ29udHJvbHMuZ2V0KCdjb21tZW50JykuaW52YWxpZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICBOb3RlIFJlcXVpcmVkXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYWN0aW9ucz8ubGVuZ3RoXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJkLWJsb2NrIGNsZWFyLWJvdGggcHQtM1wiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgYWN0aW9uczsgaW5kZXggYXMgaVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJhY3Rpb24udmlzaWJsZVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zbSBtZS0yIGJ0bi1vdXRsaW5lLXByaW1hcnkgbWItMiBhY3Rpb24tYnRuXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzaG93RGF0ZVBpY2tlcigkZXZlbnQsIGFjdGlvbi5pZCk7IGQudG9nZ2xlKClcIj5cbiAgICAgICAgICAgICAgICAgIHt7IGFjdGlvbi5uYW1lIH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwic3VibWl0QWN0aW9uICYmIGFjdGlvbkZvcm1Db250cm9scy5jcm1fYWN0aW9uX2lkLmludmFsaWRcIj5cbiAgICAgICAgICAgICAgICBQbGVhc2Ugc2VsZWN0IGFuIGFjdGlvblxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC0zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtc20tNFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJkZC1tbW0teXl5eVwiXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwid2hlblwiXG4gICAgICAgICAgICAgICAgICAgICAgbmdiRGF0ZXBpY2tlclxuICAgICAgICAgICAgICAgICAgICAgICNkPVwibmdiRGF0ZXBpY2tlclwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImQudG9nZ2xlKClcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS00IHBlLTAgY29tcGxldGVkLXRvZ2dsZVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHVpLXN3aXRjaCBjaGVja2VkTGFiZWw9XCJjb21wbGV0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgIHVuY2hlY2tlZExhYmVsPVwib3BlblwiXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY29tcGxldGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiY29tcGxldGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvdWktc3dpdGNoPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxvYXQtZW5kXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICAgIFtidXR0b25CdXN5XT1cImJ1dHRvbkJ1c3lcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidXR0b25EaXNhYmxlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBtdC0yIG1iLTIgZmxvYXQtZW5kXCJcbiAgICAgICAgICAgICAgICA+U3VibWl0IE5vdGU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSBtdC0yIG1iLTIgbWUtMCBtZS1zbS0yIGZsb2F0LWVuZFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5Nb2RhbChjb250ZW50KVwiPnt7ICdVcGxvYWQgZmlsZScgfCB0cmFuc2xvY28gfX08L2E+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJidXR0b25EaXNhYmxlXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJuby1hY3Rpb25zIHB0LTRcIj5cbiAgICAgICAgICAgICAgPHB3LW5vLWRhdGEgW3dpdGhJbWFnZV09XCJ0cnVlXCIgW21lc3NhZ2VdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ3JtLk9wcG9ydHVuaXRpZXNNZXNzYWdlLk5vQWN0aW9uc0luT3Bwb3J0dW5pdGllc0luZm9NZXNzYWdlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsb2NvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICA8L3B3LW5vLWRhdGE+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwIHRleHQtY2VudGVyIG10LTNcIlxuICAgICAgICAgICAgKm5nSWY9XCIhaXNMb2FkZWRcIj5cbiAgICAgICAgICAgIDxwLXByb2dyZXNzU3Bpbm5lciBzdHJva2VXaWR0aD1cIjJcIj4gPC9wLXByb2dyZXNzU3Bpbm5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIW9wcG9ydHVuaXRpZXNDb21tZW50cz8ubGVuZ3RoICYmIGlzTG9hZGVkXCJcbiAgICAgICAgICAgIGNsYXNzPVwibm8tYWN0aW9ucyBwdC0zXCI+XG4gICAgICAgICAgICA8cHctbm8tZGF0YSBbd2l0aEltYWdlXT1cInRydWVcIiBbbWVzc2FnZV09XCInQ3JtLk9wcG9ydHVuaXRpZXNNZXNzYWdlLk5vQWN0aW9uc01lc3NhZ2UnIHwgdHJhbnNsb2NvXCI+XG4gICAgICAgICAgICA8L3B3LW5vLWRhdGE+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cIm9wcG9ydHVuaXRpZXNDb21tZW50cz8ubGVuZ3RoXCJcbiAgICAgICAgICAgIGlkPVwidGltZWxpbmVcIlxuICAgICAgICAgICAgY2xhc3M9XCJwdC0zIGNsZWFyLWJvdGggdGltZWxpbmUtY2VudGVyIHRpbWVsaW5lLXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDx1bCBjbGFzcz1cInRpbWVsaW5lXCI+XG4gICAgICAgICAgICAgIDxsaSBjbGFzcz1cInRpbWVsaW5lLWxpbmVcIj48L2xpPlxuICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDx1bCBjbGFzcz1cInRpbWVsaW5lXCI+XG4gICAgICAgICAgICAgIDxsaSBjbGFzcz1cInRpbWVsaW5lLWxpbmVcIj48L2xpPlxuICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJ0aW1lbGluZS1pdGVtXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdtdC01Jzogb2RkIH1cIlxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW0gb2Ygb3Bwb3J0dW5pdGllc0NvbW1lbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggYXMgaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvZGQgPSBvZGQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXZlbiA9IGV2ZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWVsaW5lLWJhZGdlXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJnLXJlZCBiZy1saWdodGVuLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aW1lbGluZS15ZWFyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkLWJsb2NrIGRhdGUteWVhclwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLndoZW4gfCBkYXRlOiAnbWVkaXVtJyB8IHNsaWNlOiAwOjNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgaXRlbS55ZWFyIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWVsaW5lLWNhcmQgc2hhZG93IGNhcmQgcGItMCByb3VuZGVkIGJvcmRlci1ncmV5IGJvcmRlci1saWdodGVuLTIgcG9zaXRpb24tc3RhdGljXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgcHktNFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMCBjbGVhcmZpeFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiY29tbWVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbW1lbnQtZmllbGQgZm9ybS1jb250cm9sIHAtMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0uY29tbWVudFwiPnt7IGl0ZW0uY29tbWVudCB9fTwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJmbG9hdC1zdGFydCBtYi0wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXNob3dGdWxsQ29tbWVudCB8fCBpdGVtLmlkICE9PSBjb21tZW50SWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uY29tbWVudCB8IHNsaWNlOiAwOjE3MFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08YSAqbmdJZj1cIml0ZW0uY29tbWVudC5sZW5ndGggPiAxNzBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtc2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93RnVsbENvbW1lbnQgPSB0cnVlOyBjb21tZW50SWQgPSBpdGVtLmlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+Li4uc2hvdyBtb3JlPC9hPlxuICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZsb2F0LXN0YXJ0IG1iLTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93RnVsbENvbW1lbnQgJiYgaXRlbS5pZCA9PT0gY29tbWVudElkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmNvbW1lbnQgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY29tbWVudC5sZW5ndGggPiAxNzAgJiYgc2hvd0Z1bGxDb21tZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dGdWxsQ29tbWVudCA9IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeVwiPi4uLnNob3cgbGVzczwvYT5cbiAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbWQgZWRpdC1idG4gZmxvYXQtZW5kIHB5LTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dFZGl0Q29udHJvbHMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInVzZXJJZCA9PT0gaXRlbS5vd25lcl9pZCB8fCBoYXNBY2Nlc3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS1lZGl0IGVkaXQtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1zdWJ0aXRsZSB0ZXh0LW11dGVkIG15LTAgY2xlYXJmaXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxvYXQtc3RhcnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIXVwZGF0aW5nIHx8IGFjdGlvbklkICE9PSBpdGVtLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb250LXNtYWxsLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS53aGVuIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwidXBkYXRpbmcgJiYgYWN0aW9uSWQgPT09IGl0ZW0uaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImRkLW1tbS15eXl5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJ7eyBpdGVtLndoZW4gfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBuZ2JEYXRlcGlja2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICNkPVwibmdiRGF0ZXBpY2tlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1cyk9XCJkLnRvZ2dsZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGVTZWxlY3QpPVwib25EYXRlU2VsZWN0KCRldmVudCwgaXRlbSlcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cIiBidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNtIGZsb2F0LWVuZCB3aGVuLWJ0biBweS0wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwidXNlcklkID09PSBpdGVtLm93bmVyX2lkIHx8IGhhc0FjY2Vzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd0RhdGVQaWNrZXJVcGRhdGUoaXRlbS5pZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS1lZGl0IGVkaXQtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8cCBbY2xhc3MudGV4dC1kYW5nZXJdPVwiIWl0ZW0uY29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWl0ZW0uY2FuY2VsbGVkICYmICFpdGVtLmNvbXBsZXRlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYi0wXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5kdWUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbT8ub3duZXI/LmZpcnN0X25hbWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbT8ub3duZXI/Lmxhc3RfbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctcHJpbWFyeVwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0/LmNybV9hY3Rpb24/Lm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpdGVtLmNvbXBsZXRlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZXJJZCA9PT0gaXRlbS5vd25lcl9pZCB8fCBoYXNBY2Nlc3MpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJiYWRnZSBiZy1zdWNjZXNzIG1zLTJcIj5PcGVuPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8YSAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWl0ZW0uY29tcGxldGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNlcklkID09PSBpdGVtLm93bmVyX2lkIHx8IGhhc0FjY2VzcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwiU2V0IGFzIGNvbXBsZXRlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZS0zIG1zLTNcIlxuICAgICAgICAgICAgICAgICAgICAgIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMCk7XCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBc0NvbXBsZXRlZE9yVW5jb21wbGV0ZWQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY29tcGxldGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdGFza3MgY29tcGxldGVkXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDxhICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXRlbS5jYW5jZWxsZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpdGVtLmNvbXBsZXRlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZXJJZCA9PT0gaXRlbS5vd25lcl9pZCB8fCBoYXNBY2Nlc3MpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIlNldCBhcyBjYW5jZWxsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMCk7XCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2V0QXNDYW5jZWxsZWQoaXRlbS5pZCwgaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS10aW1lcyBkZWxldGUtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDxhICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmNvbXBsZXRlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZXJJZCA9PT0gaXRlbS5vd25lcl9pZCB8fCBoYXNBY2Nlc3MpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIlNldCBhcyBVbkNvbXBsZXRlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKTtcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEFzQ29tcGxldGVkT3JVbmNvbXBsZXRlZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5jb21wbGV0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1zLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhciBmYS13aW5kb3ctY2xvc2VcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2wtYnRucyBtdC0zIHRleHQtZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1kZWZhdWx0IG1lLTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dFZGl0Q29udHJvbHModW5kZWZpbmVkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQ2FuY2VsXG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlQ29tbWVudChpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgU3VibWl0XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9saT5cbiAgICAgIDxsaSBbbmdiTmF2SXRlbV09XCIyXCI+XG4gICAgICAgIDxhIG5nYk5hdkxpbms+VmVyc2lvbmluZzwvYT5cbiAgICAgICAgPG5nLXRlbXBsYXRlIG5nYk5hdkNvbnRlbnQ+XG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgdmVyc2lvbiBvZiBvcHBvcnR1bml0aWVzVmVyc2lvbmluZ1wiPlxuICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgIDxzdHJvbmc+RXZlbnQ6IDwvc3Ryb25nPnt7IHZlcnNpb24uZXZlbnQgfX0gfCA8c3Ryb25nPkF1dGhvcjogPC9zdHJvbmc+PGEgKm5nSWY9XCJ2ZXJzaW9uPy5hdXRob3JcIlxuICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIlsnL21lbWJlcnMnLCB2ZXJzaW9uPy5hdXRob3I/LnNsdWddXCI+e3sgdmVyc2lvbj8uYXV0aG9yIHwgaWZOYW1lTnVsbFNob3dFbWFpbCB9fTwvYT5cbiAgICAgICAgICAgICAgfCA8c3Ryb25nPkNyZWF0ZWQgYXQ6IDwvc3Ryb25nPnt7IHZlcnNpb24uY3JlYXRlZF9hdCB9fTxiciAvPlxuICAgICAgICAgICAgICA8c3Ryb25nPk9iamVjdDogPC9zdHJvbmc+e3sgdmVyc2lvbi5vYmplY3QgfCBqc29uIH19XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8aHIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwib3Bwb3J0dW5pdGllc1ZlcnNpb25pbmc/Lmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICAgICAgPHB3LW5vLWRhdGEgW3dpdGhJbWFnZV09XCJ0cnVlXCIgW21lc3NhZ2VdPVwiJ0NybS5PcHBvcnR1bml0aWVzTWVzc2FnZS5Ob1ZlcnNpb25zTWVzc2FnZScgfCB0cmFuc2xvY29cIj5cbiAgICAgICAgICAgIDwvcHctbm8tZGF0YT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvbGk+XG4gICAgICA8bGkgW25nYk5hdkl0ZW1dPVwiM1wiPlxuICAgICAgICA8YSBuZ2JOYXZMaW5rPkZpbGVzPC9hPlxuICAgICAgICA8bmctdGVtcGxhdGUgbmdiTmF2Q29udGVudD5cbiAgICAgICAgICA8cHctc21hcnQtY3JtLWNvbXBhbnktZmlsZXMgW2NvbnRhY3RJZF09XCJjb250YWN0SWRcIlxuICAgICAgICAgICAgW2FjY291bnRJZF09XCJhY2NvdW50SWRcIlxuICAgICAgICAgICAgW29wcG9ydHVuaXR5SWRdPVwib3Bwb3J0dW5pdGllc0lkXCI+XG4gICAgICAgICAgPC9wdy1zbWFydC1jcm0tY29tcGFueS1maWxlcz5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvbGk+XG4gICAgPC91bD5cblxuICAgIDxkaXYgW25nYk5hdk91dGxldF09XCJuYXZcIj48L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNjb250ZW50XG4gIGxldC1tb2RhbD5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgIDxoMyBjbGFzcz1cIm1vZGFsLXRpdGxlIG1iLTAgcC0wXCI+e3sgJ1VwbG9hZCBGaWxlJyB8IHRyYW5zbG9jbyB9fTwvaDM+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGNsYXNzPVwiYnRuLWNsb3NlIGZsb2F0LWVuZFwiXG4gICAgICBhcmlhLWxhYmVsPVwiQ2xvc2VcIlxuICAgICAgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoKVwiPlxuXG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxuICAgIDxzbWFsbD4ge3sgJ1VzZXIuUHJvZmlsZS5QaWN0dXJlTWVzc2FnZScgfCB0cmFuc2xvY28gfX08L3NtYWxsPlxuICAgIDxkaXYgY2xhc3M9XCJyb3cgcC0yXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ1cGxvYWQtYm94XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInVwbG9hZC1ib3gtY29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3AtY29udGFpbmVyXCJcbiAgICAgICAgICAgICAgbmdGaWxlRHJvcFxuICAgICAgICAgICAgICBbb3B0aW9uc109XCJvcHRpb25zXCJcbiAgICAgICAgICAgICAgKHVwbG9hZE91dHB1dCk9XCJvblVwbG9hZE91dHB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgW3VwbG9hZElucHV0XT1cInVwbG9hZElucHV0XCI+XG4gICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgIERyYWcgZmlsZXMgaGVyZSBvclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInVwbG9hZC1idXR0b25cIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiXG4gICAgICAgICAgICAgICAgICAgIG5nRmlsZVNlbGVjdFxuICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJvcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgKHVwbG9hZE91dHB1dCk9XCJvblVwbG9hZE91dHB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgW3VwbG9hZElucHV0XT1cInVwbG9hZElucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGUgLz5cbiAgICAgICAgICAgICAgICAgIGJyb3dzZVxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgdG8gdXBsb2FkLlxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1cGxvYWQtaXRlbVwiXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBmIG9mIGZpbGVzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1cGxvYWQtaXRlbS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGVuYW1lXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsZW5hbWUtbGVmdFwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImlvbmljb24gaW9uLWlvcy1jb3B5XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBmLm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFyXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiZj8ucHJvZ3Jlc3M/LmRhdGE/LnBlcmNlbnRhZ2UgKyAnJSdcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1kb25lXT1cImZbJ3VwbG9hZGVkJ11cIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtdGV4dC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInByb2dyZXNzLXRleHRcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaXMtZG9uZV09XCJmWyd1cGxvYWRlZCddXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZbJ3VwbG9hZGVkJ11cIj57eyBmLnByb2dyZXNzPy5kYXRhPy5wZXJjZW50YWdlIC0gMSB9fSVcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZbJ3VwbG9hZGVkJ11cIj4xMDAgJTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZlsndXBsb2FkZWQnXVwiPlVwbG9hZGluZy4uLjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmWyd1cGxvYWRlZCddXCI+RG9uZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3BlZWQtYW5kLWV0YS10ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmLnByb2dyZXNzPy5kYXRhPy5wZXJjZW50YWdlICE9PSAwICYmICFmWyd1cGxvYWRlZCddXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGYucHJvZ3Jlc3M/LmRhdGE/LnNwZWVkSHVtYW4gfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5FVEEge3sgZi5wcm9ncmVzcz8uZGF0YT8uZXRhSHVtYW4gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
484
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtY3JtLW9wcG9ydHVuaXRpZXMtaW5mby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3NtYXJ0LWNybS9zcmMvbGliL3ByaXZhdGUvY29tcG9uZW50cy9zbWFydC1jcm0tb3Bwb3J0dW5pdGllcy9zbWFydC1jcm0tb3Bwb3J0dW5pdGllcy1saXN0L3NtYXJ0LWNybS1vcHBvcnR1bml0aWVzLWluZm8vc21hcnQtY3JtLW9wcG9ydHVuaXRpZXMtaW5mby5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3NtYXJ0LWNybS9zcmMvbGliL3ByaXZhdGUvY29tcG9uZW50cy9zbWFydC1jcm0tb3Bwb3J0dW5pdGllcy9zbWFydC1jcm0tb3Bwb3J0dW5pdGllcy1saXN0L3NtYXJ0LWNybS1vcHBvcnR1bml0aWVzLWluZm8vc21hcnQtY3JtLW9wcG9ydHVuaXRpZXMtaW5mby5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQzdGLE9BQU8sRUFBb0IsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDaEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3hELE9BQU8s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OzBCQWtGdEMsTUFBTTsyQkFBQyxRQUFRO3lDQW9HcEIsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbmplY3QsIEluamVjdG9yLCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE5nYk1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xuaW1wb3J0IHsgQ1JNX0FDQ09VTlRfRklMRVNfUEFUSCB9IGZyb20gJ0Bwb3Npd2lzZS9zbWFydC1jcm0tc2hhcmVkJztcbmltcG9ydCB7IEFwcFNtYXJ0Q3JtIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2hhcmVkL21vZGVscy9zbWFydC1jcm0ubW9kZWwnO1xuaW1wb3J0IHsgUk9VVEVSUyB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NoYXJlZC9yb3V0ZXJzL3JvdXRlcnMnO1xuaW1wb3J0IHsgQ3JtU2VydmljZSB9IGZyb20gJ0Bwb3Npd2lzZS9zbWFydC1jcm0tc2hhcmVkJztcbmltcG9ydCB7IFVwbG9hZEZpbGUsIFVwbG9hZElucHV0LCBVcGxvYWRPdXRwdXQsIFVwbG9hZFN0YXR1cywgVXBsb2FkZXJPcHRpb25zIH0gZnJvbSAnbmd4LXVwbG9hZGVyJztcbmltcG9ydCBzd2FsIGZyb20gJ3N3ZWV0YWxlcnQyJztcblxuaW1wb3J0IHsgRE9DVU1FTlRfVFlQRV9FWFQsIFRPS0VOX0hFQURFUl9LRVkgfSBmcm9tICdAcG9zaXdpc2UvY29tbW9uLXV0aWxpdGllcyc7XG5pbXBvcnQgeyBDcm1BY2NvdW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2hhcmVkL2ludGVyZmFjZS9jcm0tYWNjb3VudC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ3JtQWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2hhcmVkL2ludGVyZmFjZS9jcm0tYWN0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDcm1WZXJzaW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2hhcmVkL2ludGVyZmFjZS9jcm0tb3Bwb3J0dW5pdHkuaW50ZXJmYWNlJztcbmltcG9ydCB7IEFwcEJhc2VDb21wb25lbnQgfSBmcm9tICdAcG9zaXdpc2UvYXBwLWJhc2UtY29tcG9uZW50JztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ0Bwb3Npd2lzZS9jb21tb24tdXRpbGl0aWVzJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnQHBvc2l3aXNlL2NvbW1vbi1zZXJ2aWNlcyc7XG5pbXBvcnQgeyBIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnQHBvc2l3aXNlL2hlbHBlci1zZXJ2aWNlJztcbmltcG9ydCB7IFZhbGlkYXRlRm9ybSB9IGZyb20gJ0Bwb3Npd2lzZS91dGlscyc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQge1xuICAgIE9wcG9ydHVuaXR5Q29tbWVudCxcbiAgICBPcHBvcnR1bml0eUNvbnRhY3QsXG4gICAgT3Bwb3J0dW5pdHlEYXRhXG59IGZyb20gJ2xpYnMvc21hcnQtY3JtL3NyYy9saWIvc2hhcmVkL2ludGVyZmFjZS9zbWFydC1jcm0tbW9kdWxlLmludGVyZmFjZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncHctc21hcnQtY3JtLW9wcG9ydHVuaXRpZXMtaW5mbycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NtYXJ0LWNybS1vcHBvcnR1bml0aWVzLWluZm8uY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3NtYXJ0LWNybS1vcHBvcnR1bml0aWVzLWluZm8uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBTbWFydENybU9wcG9ydHVuaXRpZXNJbmZvQ29tcG9uZW50XG4gICAgZXh0ZW5kcyBBcHBCYXNlQ29tcG9uZW50XG4gICAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveVxue1xuICAgIGlzTG9hZGVkID0gZmFsc2U7XG5cbiAgICBpc0Zvcm1FZGl0ID0gdHJ1ZTtcblxuICAgIG9wcG9ydHVuaXRpZXNJZDogbnVtYmVyO1xuXG4gICAgZGF0YTogT3Bwb3J0dW5pdHlEYXRhO1xuXG4gICAgYWJvdXRDb250cm9sczogVW50eXBlZEZvcm1Hcm91cDtcblxuICAgIHN1Ym1pdHRlZCA9IGZhbHNlO1xuICAgIGJ1dHRvbkJ1c3kgPSBmYWxzZTtcblxuICAgIGFjY291bnRzOiBDcm1BY2NvdW50W107XG5cbiAgICBmaWx0ZXJlZEFjY291bnRzOiBDcm1BY2NvdW50W10gPSBbXTtcblxuICAgIHN1YnNjcmlwdGlvbklkOiBudW1iZXI7XG5cbiAgICBhY3Rpb25zOiBDcm1BY3Rpb25bXTtcblxuICAgIGJ1dHRvbkRpc2FibGU6IGJvb2xlYW47XG5cbiAgICBoYXNBY2Nlc3M6IGJvb2xlYW47XG5cbiAgICBvcHRpb25zOiBVcGxvYWRlck9wdGlvbnM7XG5cbiAgICB1cGxvYWRJbnB1dDogRXZlbnRFbWl0dGVyPFVwbG9hZElucHV0PjtcblxuICAgIGZpbGVzOiBVcGxvYWRGaWxlW107XG5cbiAgICB0b2tlbjogc3RyaW5nO1xuXG4gICAgZHJhZ092ZXI6IGJvb2xlYW47XG5cbiAgICBjb250YWN0SWQ6IG51bWJlcjtcblxuICAgIGFjY291bnRJZDogbnVtYmVyO1xuXG4gICAgdXNlcklkOiBudW1iZXI7XG5cbiAgICBhY3Rpb25Db250cm9sczogVW50eXBlZEZvcm1Hcm91cDtcblxuICAgIGlzRGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIHVwZGF0aW5nID0gZmFsc2U7XG5cbiAgICBhY3Rpb25JZDogbnVtYmVyO1xuXG4gICAgc2hvd0Z1bGxDb21tZW50ID0gZmFsc2U7XG5cbiAgICBjb21tZW50SWQ6IG51bWJlcjtcblxuICAgIG9wcG9ydHVuaXRpZXNDb21tZW50czogT3Bwb3J0dW5pdHlDb21tZW50W107XG5cbiAgICBkYW5nZXJDb2xvcjogYm9vbGVhbjtcblxuICAgIGFsbENvbnRhY3RzOiBPcHBvcnR1bml0eUNvbnRhY3RbXTtcblxuICAgIGZpbHRlcmVkQ29udGFjdHM6IE9wcG9ydHVuaXR5Q29udGFjdFtdO1xuXG4gICAgb3Bwb3J0dW5pdGllc1ZlcnNpb25pbmc6IENybVZlcnNpb25bXTtcblxuICAgIHN1Ym1pdEFjdGlvbiA9IGZhbHNlO1xuXG4gICAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgICByb3V0ZXJzID0gUk9VVEVSUztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHByaXZhdGUgY3JtU2VydmljZTogQ3JtU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsLFxuICAgICAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSxcbiAgICAgICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnRcbiAgICApIHtcbiAgICAgICAgc3VwZXIoaW5qZWN0b3IpO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSB7IGNvbmN1cnJlbmN5OiAxLCBtYXhVcGxvYWRzOiAzIH07XG4gICAgICAgIHRoaXMudXBsb2FkSW5wdXQgPSBuZXcgRXZlbnRFbWl0dGVyPFVwbG9hZElucHV0PigpO1xuICAgICAgICB0aGlzLnRva2VuID0gYnRvYSh0aGlzLmF1dGhTZXJ2aWNlLmdldFRva2VuKCkpO1xuICAgICAgICB0aGlzLmZpbGVzID0gW107XG4gICAgICAgIHRoaXMuYWN0aW9uQ29udHJvbHMgPSBBcHBTbWFydENybS5nZXRPcHBvcnR1bml0eUFjdGlvbnNGb3JtKHRoaXMuaXNEaXNhYmxlZCk7XG4gICAgICAgIHRoaXMuYWJvdXRDb250cm9scyA9IEFwcFNtYXJ0Q3JtLmdldE9wcG9ydHVuaXRpZXNGb3JtKCk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZ2V0VXNlclN1YnNjcmlwdGlvbigpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uPy5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0QWN0aW9ucygpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0T3Bwb3J0dW5pdGllc0NvbW1lbnRzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJvdXRlLnBhcmFtcy5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9wcG9ydHVuaXRpZXNJZCA9IE51bWJlcihkYXRhWydpZCddKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wcG9ydHVuaXRpZXNJZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0T3Bwb3J0dW5pdHlEZXRhaWxzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25Db250cm9scy5nZXQoJ2NybV9vcHBvcnR1bml0eV9pZCcpLnNldFZhbHVlKHRoaXMub3Bwb3J0dW5pdGllc0lkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub25EYXRlU2VsZWN0ZWQoKTtcbiAgICAgICAgdGhpcy5nZXRDb250YWN0VmVyc2lvbigpO1xuICAgICAgICB0aGlzLnVzZXJJbmZvKCk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGNhbGwgdXNlciBpbmZvICovXG4gICAgcHJpdmF0ZSB1c2VySW5mbygpIHtcbiAgICAgICAgdGhpcy51c2VyU3RvcmUoKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXJJZCA9IHJlcy5pZDtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbkNvbnRyb2xzLmdldCgnb3duZXJfaWQnKS5zZXRWYWx1ZShyZXMuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gZ2V0IG9wcG9ydHVuaXRpZXMgZGV0YWlscyAqL1xuICAgIGdldE9wcG9ydHVuaXR5RGV0YWlscygpIHtcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5zdWJzY3JpcHRpb24pO1xuICAgICAgICB0aGlzLmNybVNlcnZpY2VcbiAgICAgICAgICAgIC5nZXRPcHBvcnR1bml0eURldGFpbHModGhpcy5zdWJzY3JpcHRpb24/LmlkLCB0aGlzLm9wcG9ydHVuaXRpZXNJZClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuY3JtX2NvbnRhY3RfaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmNybV9jb250YWN0LmRpc3BsYXlOYW1lID0gYCR7cmVzcG9uc2UuY3JtX2NvbnRhY3QuZmlyc3RfbmFtZX0gJHtyZXNwb25zZS5jcm1fY29udGFjdC5sYXN0X25hbWV9YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9wZXJhdG9yLWFzc2lnbm1lbnRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLm1vbnRobHlfYW1vdW50ID0gdGhpcy5kYXRhLm1vbnRobHlfYW1vdW50IC8gMTAwO1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb3BlcmF0b3ItYXNzaWdubWVudFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEub25lX3RpbWVfYW1vdW50ID0gdGhpcy5kYXRhLm9uZV90aW1lX2Ftb3VudCAvIDEwMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250YWN0SWQgPSByZXNwb25zZS5jcm1fY29udGFjdF9pZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY2NvdW50SWQgPSByZXNwb25zZS5jcm1fYWNjb3VudF9pZDtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFib3V0Q29udHJvbHMucGF0Y2hWYWx1ZShyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWJvdXRDb250cm9scy5nZXQoJ2NybV9jb250YWN0X2lkJykucGF0Y2hWYWx1ZShyZXNwb25zZS5jcm1fY29udGFjdCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWJvdXRDb250cm9scy5nZXQoJ2NybV9hY2NvdW50X2lkJykucGF0Y2hWYWx1ZShyZXNwb25zZS5jcm1fYWNjb3VudCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uQ29udHJvbHMuZ2V0KCdjcm1fY29udGFjdF9pZCcpLnNldFZhbHVlKHRoaXMuY29udGFjdElkKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25Db250cm9scy5nZXQoJ2NybV9hY2NvdW50X2lkJykuc2V0VmFsdWUodGhpcy5hY2NvdW50SWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byB1cGRhdGUgb3Bwb3J0dW5pdGllcyAqL1xuICAgIHVwZGF0ZU9wcG9ydHVuaXRpZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmFib3V0Q29udHJvbHMuaW52YWxpZCkge1xuICAgICAgICAgICAgdGhpcy5zdWJtaXR0ZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZm9ybURhdGEgPSB0aGlzLmFib3V0Q29udHJvbHM7XG4gICAgICAgICAgICBjb25zdCBkYXRhT2JqZWN0ID0ge1xuICAgICAgICAgICAgICAgIGNybV9hY2NvdW50X2lkOiBmb3JtRGF0YS5nZXQoJ2NybV9hY2NvdW50X2lkJykudmFsdWU/LmlkLFxuICAgICAgICAgICAgICAgIGNybV9jb250YWN0X2lkOiBmb3JtRGF0YS5nZXQoJ2NybV9jb250YWN0X2lkJykudmFsdWU/LmlkLFxuICAgICAgICAgICAgICAgIG9uZV90aW1lX2Ftb3VudDogZm9ybURhdGEuZ2V0KCdvbmVfdGltZV9hbW91bnQnKS52YWx1ZSAqIDEwMCxcbiAgICAgICAgICAgICAgICBtb250aGx5X2Ftb3VudDogZm9ybURhdGEuZ2V0KCdtb250aGx5X2Ftb3VudCcpLnZhbHVlICogMTAwXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5jcm1TZXJ2aWNlXG4gICAgICAgICAgICAgICAgLnVwZGF0ZU9wcG9ydHVuaXRpZXModGhpcy5zdWJzY3JpcHRpb24/LmlkLCB0aGlzLm9wcG9ydHVuaXRpZXNJZCwge1xuICAgICAgICAgICAgICAgICAgICAuLi5mb3JtRGF0YS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgLi4uZGF0YU9iamVjdFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNsYXRpb24udHJhbnNsYXRlKCdDcm0uT3Bwb3J0dW5pdGllc01lc3NhZ2UuVXBkYXRlZE1lc3NhZ2UnKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzRm9ybUVkaXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE9wcG9ydHVuaXR5RGV0YWlscygpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmFkZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0dGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gc2F2ZSBjb21tZW50ICovXG4gICAgQFZhbGlkYXRlRm9ybSgnYWN0aW9uQ29udHJvbHMnKVxuICAgIG9uQ29tbWVudFNhdmUoKSB7XG4gICAgICAgIHRoaXMuYnV0dG9uQnVzeSA9IHRydWU7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmFjdGlvbkNvbnRyb2xzLnZhbHVlO1xuICAgICAgICBkYXRhLndoZW4gPSBIZWxwZXJTZXJ2aWNlLmRhdGVGb3JtYXQoZGF0YT8ud2hlbik7XG4gICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgLnBvc3RBY2NvdW50Q29tbWVudCh0aGlzLnN1YnNjcmlwdGlvbj8uaWQsIGRhdGEpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbkNvbnRyb2xzLmdldCgnY29tbWVudCcpLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRPcHBvcnR1bml0aWVzQ29tbWVudHMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0LnN1Y2Nlc3MoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNsYXRpb24udHJhbnNsYXRlKCdDcm0uT3Bwb3J0dW5pdGllc01lc3NhZ2UuQ29tbWVudFN1Ym1pdHRlZE1lc3NhZ2UnKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmFkZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRBY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1dHRvbkJ1c3kgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNob3dEYXRlUGlja2VyKGV2ZW50LCBpZCkge1xuICAgICAgICB0aGlzLmFjdGlvbkNvbnRyb2xzLmdldCgnd2hlbicpLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcbiAgICAgICAgY29uc3QgYWN0aW9uQnV0dG9ucyA9IHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYWN0aW9uLWJ0bicpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFjdGlvbkJ1dHRvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFjdGlvbkJ1dHRvbnNbaV0uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgICB0aGlzLmFjdGlvbkNvbnRyb2xzLmdldCgnY3JtX2FjdGlvbl9pZCcpLnNldFZhbHVlKGlkKTtcbiAgICB9XG5cbiAgICBvbkRhdGVTZWxlY3RlZCgpIHtcbiAgICAgICAgdGhpcy5hY3Rpb25Db250cm9scy5nZXQoJ3doZW4nKS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRGF0ZSA9IHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3doZW4nKT8uWyd2YWx1ZSddO1xuICAgICAgICAgICAgY29uc3QgdG9kYXlEYXRlID0gbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnREQtTU1NLVlZWVknKTtcbiAgICAgICAgICAgIGlmICh0b2RheURhdGUgPCBzZWxlY3RlZERhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uQ29udHJvbHMuZ2V0KCdjb21wbGV0ZWQnKS5kaXNhYmxlKHsgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25Db250cm9scy5nZXQoJ2NvbXBsZXRlZCcpLnNldFZhbHVlKGZhbHNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25Db250cm9scy5nZXQoJ2NvbXBsZXRlZCcpLmVuYWJsZSh7IG9ubHlTZWxmOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNEaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gZ2V0IGFsbCBjb21tZW50cyAqL1xuICAgIHByaXZhdGUgZ2V0T3Bwb3J0dW5pdGllc0NvbW1lbnRzKCkge1xuICAgICAgICB0aGlzLmNybVNlcnZpY2VcbiAgICAgICAgICAgIC5nZXRPcHBvcnR1bml0aWVzQ29tbWVudHModGhpcy5vcHBvcnR1bml0aWVzSWQsIHRoaXMuc3Vic2NyaXB0aW9uPy5pZClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocmVzcCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3A/LmNybV9hY2NvdW50X2FjdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wcG9ydHVuaXRpZXNDb21tZW50cyA9IHJlc3AuY3JtX2FjY291bnRfYWN0aW9ucztcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wcG9ydHVuaXRpZXNDb21tZW50cy5mb3JFYWNoKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS53aGVuX3Nob3J0X2RhdGUgPSBtb21lbnQoZGF0YS53aGVuKS5mb3JtYXQoJ0RELU1NTS1ZWVlZJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWZmID0gbW9tZW50KG5ldyBEYXRlKGRhdGEud2hlbikpLmRpZmYobW9tZW50KG5ldyBEYXRlKCkpLCAnZGF5cycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vbWVudChuZXcgRGF0ZShkYXRhLndoZW4pKSA8IG1vbWVudChuZXcgRGF0ZSgpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbJ2R1ZSddID0gYE92ZXJkdWUgYnkgJHtNYXRoLmFicyhkaWZmKX0gZGF5c2A7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVsnY29sb3InXSA9IHRoaXMuZGFuZ2VyQ29sb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbJ2R1ZSddID0gYEluICR7ZGlmZn0gZGF5c2A7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVsnY29sb3InXSA9ICF0aGlzLmRhbmdlckNvbG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wcG9ydHVuaXRpZXNDb21tZW50cy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoYS53aGVuKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShiLndoZW4pLmdldFRpbWUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3Bwb3J0dW5pdGllc0NvbW1lbnRzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtWyd3aGVuJ10gPSBtb21lbnQoaXRlbVsnd2hlbiddKS5mb3JtYXQoJ0RELU1NTS1ZWVlZJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtWyd5ZWFyJ10gPSBtb21lbnQoaXRlbVsnd2hlbiddKS5mb3JtYXQoJ1lZWVknKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1bJ21vbnRoJ10gPSBtb21lbnQoaXRlbVsnd2hlbiddKS5mb3JtYXQoJ01NJyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wbGV0ZWRDYW5jZWxsZWRBY3Rpb25zOiBPcHBvcnR1bml0eUNvbW1lbnRbXSA9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wcG9ydHVuaXRpZXNDb21tZW50cy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0+IGFjdGlvbi5jb21wbGV0ZWQgPT09IHRydWUgfHwgYWN0aW9uLmNhbmNlbGxlZCA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkQ2FuY2VsbGVkQWN0aW9ucy5yZXZlcnNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vdENvbXBsZXRlZENhbmNlbGxlZEFjdGlvbnM6IE9wcG9ydHVuaXR5Q29tbWVudFtdID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3Bwb3J0dW5pdGllc0NvbW1lbnRzLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPT4gYWN0aW9uLmNvbXBsZXRlZCA9PT0gZmFsc2UgJiYgYWN0aW9uLmNhbmNlbGxlZCA9PT0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3Bwb3J0dW5pdGllc0NvbW1lbnRzID1cbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdENvbXBsZXRlZENhbmNlbGxlZEFjdGlvbnMuY29uY2F0KGNvbXBsZXRlZENhbmNlbGxlZEFjdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXQgZigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWJvdXRDb250cm9scy5jb250cm9scztcbiAgICB9XG5cbiAgICBnZXQgYWN0aW9uRm9ybUNvbnRyb2xzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3Rpb25Db250cm9scy5jb250cm9scztcbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gZ2V0IHRoZSBsaXN0IG9mIGFjY291bnRzIGJ5IHN1YnNjcmlwdGlvbklkICovXG4gICAgZ2V0QWNjb3VudHNCeVN1YnNjcmlwdGlvbigpIHtcbiAgICAgICAgdGhpcy5jcm1TZXJ2aWNlLmdldEFjY291bnRzQnlTdWJzY3JpcHRpb24odGhpcy5zdWJzY3JpcHRpb24/LmlkKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWNjb3VudHMgPSByZXMuYWNjb3VudHM7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byBnZXQgYW5kIHNob3cgYWxsIHRoZSBhY3Rpb25zICovXG4gICAgcHJpdmF0ZSBnZXRBY3Rpb25zKCkge1xuICAgICAgICB0aGlzLmNybVNlcnZpY2UuZ2V0QWN0aW9uc0J5U3Vic2NyaXB0aW9uSWQodGhpcy5zdWJzY3JpcHRpb24/LmlkKS5zdWJzY3JpYmUocmVzcCA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcCAmJiByZXNwLmNybV9hY3Rpb25zICYmIHJlc3AuY3JtX2FjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9ucyA9IHJlc3AuY3JtX2FjdGlvbnM7XG4gICAgICAgICAgICAgICAgdGhpcy5idXR0b25EaXNhYmxlID0gdGhpcy5hY3Rpb25zLmV2ZXJ5KFxuICAgICAgICAgICAgICAgICAgICB4ID0+IHgudmlzaWJsZSA9PT0gZmFsc2UgfHwgeC52aXNpYmxlID09PSBudWxsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idXR0b25EaXNhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaGFzQWNjZXNzID0gdGhpcy5oYXNBZG1pbkFjY2Vzcyh0aGlzLnN1YnNjcmlwdGlvbj8uaWQpO1xuICAgIH1cblxuICAgIHNob3dFZGl0Q29udHJvbHMoZXZlbnQpIHtcbiAgICAgICAgY29uc3QgY29tbWVudHMgPSB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2NhcmQtaGVhZGVyJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbW1lbnRzW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3ctY29udHJvbHMnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQgJiYgZXZlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJy5jYXJkLWhlYWRlcicpLmNsYXNzTGlzdC5hZGQoJ3Nob3ctY29udHJvbHMnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byB1cGRhdGUgdGhlIGRhdGUgKi9cbiAgICBvbkRhdGVTZWxlY3QoZXZlbnQsIGFjdGlvbikge1xuICAgICAgICBjb25zdCBjb21tZW50T2JqID0ge1xuICAgICAgICAgICAgd2hlbjogSGVscGVyU2VydmljZS5kYXRlRm9ybWF0KGV2ZW50KSxcbiAgICAgICAgICAgIGNvbW1lbnQ6IGFjdGlvbi5jb21tZW50LFxuICAgICAgICAgICAgY29tcGxldGVkOiBhY3Rpb24uY29tcGxldGVkLFxuICAgICAgICAgICAgY2FuY2VsbGVkOiBhY3Rpb24uY2FuY2VsbGVkLFxuICAgICAgICAgICAgY3JtX2FjY291bnRfaWQ6IGFjdGlvbi5jcm1fYWNjb3VudF9pZFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNybVNlcnZpY2VcbiAgICAgICAgICAgIC51cGRhdGVBY2NvdW50Q29tbWVudCh0aGlzLnN1YnNjcmlwdGlvbj8uaWQsIGFjdGlvbi5pZCwgY29tbWVudE9iailcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcygnZGF0ZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0T3Bwb3J0dW5pdGllc0NvbW1lbnRzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIHNob3cgRGF0ZVBpY2tlciAqL1xuICAgIHNob3dEYXRlUGlja2VyVXBkYXRlKGFjdGlvbklkKSB7XG4gICAgICAgIHRoaXMudXBkYXRpbmcgPSAhdGhpcy51cGRhdGluZztcbiAgICAgICAgdGhpcy5hY3Rpb25JZCA9IGFjdGlvbklkO1xuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byBzZXQgdGhlIGFjdGlvbiBhcyBjb21wbGV0ZWQgKi9cbiAgICBzZXRBc0NvbXBsZXRlZE9yVW5jb21wbGV0ZWQoaWQsIGFjdGlvbiwgY29tcGxldGVkT3JVbmNvbXBsZXRlZCkge1xuICAgICAgICBjb25zdCBhbGVydFRpdGxlID0gY29tcGxldGVkT3JVbmNvbXBsZXRlZCA/ICdJbkNvbXBsZXRlZCcgOiAnQ29tcGxldGVkJztcblxuICAgICAgICByZXR1cm4gc3dhbFxuICAgICAgICAgICAgLmZpcmUoe1xuICAgICAgICAgICAgICAgIHRpdGxlOiBhbGVydFRpdGxlLFxuICAgICAgICAgICAgICAgIGh0bWw6IGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gc2V0IGFzICR7YWxlcnRUaXRsZX0/YCxcbiAgICAgICAgICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLFxuICAgICAgICAgICAgICAgIHJldmVyc2VCdXR0b25zOiB0cnVlLFxuICAgICAgICAgICAgICAgIGljb246ICd3YXJuaW5nJ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcy52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3Rpb25PYmogPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50OiBhY3Rpb24uY29tbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZDogIWNvbXBsZXRlZE9yVW5jb21wbGV0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxsZWQ6IGFjdGlvbi5jYW5jZWxsZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjcm1fYWNjb3VudF9pZDogYWN0aW9uLmNybV9hY2NvdW50X2lkXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAgICAgLnVwZGF0ZUFjY291bnRDb21tZW50KHRoaXMuc3Vic2NyaXB0aW9uPy5pZCwgaWQsIGFjdGlvbk9iailcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGlvbi50cmFuc2xhdGUoJ0NybS5TZXR0aW5ncy5VcGRhdGVkTWVzc2FnZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbnMuc3BsaWNlKGFjdGlvbiwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBY3Rpb25zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRPcHBvcnR1bml0aWVzQ29tbWVudHMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byB1cGRhdGUgY29tbWVudCAqL1xuICAgIHVwZGF0ZUNvbW1lbnQoaXRlbSkge1xuICAgICAgICBjb25zdCBjb21tZW50T2JqID0ge1xuICAgICAgICAgICAgY29tbWVudDogaXRlbS5jb21tZW50LFxuICAgICAgICAgICAgY29tcGxldGVkOiBpdGVtLmNvbXBsZXRlZCxcbiAgICAgICAgICAgIGNhbmNlbGxlZDogaXRlbS5jYW5jZWxsZWQsXG4gICAgICAgICAgICBjcm1fYWNjb3VudF9pZDogaXRlbS5jcm1fYWNjb3VudF9pZFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNybVNlcnZpY2VcbiAgICAgICAgICAgIC51cGRhdGVBY2NvdW50Q29tbWVudCh0aGlzLnN1YnNjcmlwdGlvbj8uaWQsIGl0ZW0uaWQsIGNvbW1lbnRPYmopXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0LnN1Y2Nlc3MoJ2NvbW1lbnQgdXBkYXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dFZGl0Q29udHJvbHModW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmdldE9wcG9ydHVuaXRpZXNDb21tZW50cygpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIHNldCB0aGUgYWN0aW9uIGFzIGNhbmNlbGxlZCAqL1xuICAgIHNldEFzQ2FuY2VsbGVkKGlkLCBhY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIHN3YWxcbiAgICAgICAgICAgIC5maXJlKHtcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0NhbmNlbCcsXG4gICAgICAgICAgICAgICAgaHRtbDogYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBzZXQgYXMgY2FuY2VsbGVkP2AsXG4gICAgICAgICAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICByZXZlcnNlQnV0dG9uczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpY29uOiAnd2FybmluZydcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihyZXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0aW9uT2JqID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudDogYWN0aW9uLmNvbW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQ6IGFjdGlvbi5jb21wbGV0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjcm1fYWNjb3VudF9pZDogYWN0aW9uLmNybV9hY2NvdW50X2lkXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAgICAgLnVwZGF0ZUFjY291bnRDb21tZW50KHRoaXMuc3Vic2NyaXB0aW9uPy5pZCwgaWQsIGFjdGlvbk9iailcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGlvbi50cmFuc2xhdGUoJ0NybS5TZXR0aW5ncy5VcGRhdGVkTWVzc2FnZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbnMuc3BsaWNlKGFjdGlvbiwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBY3Rpb25zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRPcHBvcnR1bml0eURldGFpbHMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byBjYWxsIGNvbnRhY3RzICovXG4gICAgZ2V0QWxsQ29udGFjdHMoKSB7XG4gICAgICAgIHRoaXMuY3JtU2VydmljZS5nZXRBbGxDb250YWN0cyh0aGlzLnN1YnNjcmlwdGlvbj8uaWQsICcnKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgdGhpcy5hbGxDb250YWN0cyA9IHJlc3BvbnNlLmNvbnRhY3RzO1xuICAgICAgICAgICAgdGhpcy5hbGxDb250YWN0cy5mb3JFYWNoKG1lbWJlciA9PiB7XG4gICAgICAgICAgICAgICAgbWVtYmVyLmRpc3BsYXlOYW1lID0gYCR7bWVtYmVyLmZpcnN0X25hbWUgfHwgJyd9ICR7bWVtYmVyLmxhc3RfbmFtZSB8fCAnJ30gLSAke1xuICAgICAgICAgICAgICAgICAgICBtZW1iZXIuZW1haWxcbiAgICAgICAgICAgICAgICB9YC50cmltKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIHNlYXJjaCBhY2NvdW50cyAqL1xuICAgIGFjY291bnRTZWFyY2goZXZlbnQpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBbXTtcbiAgICAgICAgaWYgKGV2ZW50LnF1ZXJ5KSB7XG4gICAgICAgICAgICBkYXRhID0gdGhpcy5hY2NvdW50cy5maWx0ZXIoKHg6IENybUFjY291bnQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4geC5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZXZlbnQucXVlcnkudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWNjb3VudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICBkYXRhLnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbHRlcmVkQ29udGFjdHMgPSBkYXRhO1xuICAgIH1cblxuICAgIG9uQ29udGFjdFNlYXJjaChldmVudCkge1xuICAgICAgICBsZXQgZGF0YSA9IFtdO1xuICAgICAgICBpZiAoZXZlbnQucXVlcnkpIHtcbiAgICAgICAgICAgIGRhdGEgPSB0aGlzLmFsbENvbnRhY3RzLmZpbHRlcigoeDogT3Bwb3J0dW5pdHlDb250YWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHguZGlzcGxheU5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhldmVudC5xdWVyeS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hbGxDb250YWN0cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGRhdGEucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlsdGVyZWRDb250YWN0cyA9IGRhdGE7XG4gICAgfVxuXG4gICAgb3Blbk1vZGFsKGNvbnRlbnQpIHtcbiAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2Uub3Blbihjb250ZW50LCB7IGNlbnRlcmVkOiB0cnVlLCB3aW5kb3dDbGFzczogJ21vZGFsLWhvbGRlcicgfSk7XG4gICAgfVxuXG4gICAgb25DbG9zZSgpIHtcbiAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2UuZGlzbWlzc0FsbCgpO1xuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byBnZXQgb3Bwb3J0dW5pdGllcyB2ZXJzaW9ucyAqL1xuICAgIHByaXZhdGUgZ2V0Q29udGFjdFZlcnNpb24oKSB7XG4gICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgLmdldENvbnRhY3RWZXJzaW9uKHRoaXMuc3Vic2NyaXB0aW9uPy5pZCwgdGhpcy5vcHBvcnR1bml0aWVzSWQsICdDcm1PcHBvcnR1bml0eScpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wcG9ydHVuaXRpZXNWZXJzaW9uaW5nID0gcmVzcG9uc2UudmVyc2lvbnM7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvblVwbG9hZE91dHB1dChvdXRwdXQ6IFVwbG9hZE91dHB1dCk6IHZvaWQge1xuICAgICAgICBzd2l0Y2ggKG91dHB1dC50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdhbGxBZGRlZFRvUXVldWUnOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXZlbnQ6IFVwbG9hZElucHV0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3VwbG9hZEFsbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw6IENSTV9BQ0NPVU5UX0ZJTEVTX1BBVEgsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lcl9pZDogYCR7dGhpcy51c2VySWR9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm1fYWNjb3VudF9pZDogYCR7dGhpcy5hY2NvdW50SWR9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm1fY29udGFjdF9pZDogYCR7dGhpcy5jb250YWN0SWR9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm1fb3Bwb3J0dW5pdHlfaWQ6IGAke3RoaXMub3Bwb3J0dW5pdGllc0lkfWBcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW1RPS0VOX0hFQURFUl9LRVldOiB0aGlzLnRva2VuXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkSW5wdXQuZW1pdChldmVudCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdhZGRlZFRvUXVldWUnOlxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3V0cHV0LmZpbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4dCA9IG91dHB1dC5maWxlLm5hbWUuc3BsaXQoJy4nKS5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKERPQ1VNRU5UX1RZUEVfRVhULmluY2x1ZGVzKGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsZXMucHVzaChvdXRwdXQuZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0LmVycm9yKCdmaWxlIGZvcm1hdHMgaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3VwbG9hZGluZyc6XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvdXRwdXQuZmlsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmZpbGVzLmZpbmRJbmRleChcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPT4gdHlwZW9mIG91dHB1dC5maWxlICE9PSAndW5kZWZpbmVkJyAmJiBmaWxlLmlkID09PSBvdXRwdXQuZmlsZS5pZFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGVzW2luZGV4XSA9IG91dHB1dC5maWxlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3JlbW92ZWQnOlxuICAgICAgICAgICAgICAgIHRoaXMuZmlsZXMgPSB0aGlzLmZpbGVzLmZpbHRlcigoZmlsZTogVXBsb2FkRmlsZSkgPT4gZmlsZSAhPT0gb3V0cHV0LmZpbGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZHJhZ092ZXInOlxuICAgICAgICAgICAgICAgIHRoaXMuZHJhZ092ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZHJhZ091dCc6XG4gICAgICAgICAgICBjYXNlICdkcm9wJzpcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWdPdmVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkb25lJzpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gICAgICAgICAgICBpZiAoZmlsZS5wcm9ncmVzcy5zdGF0dXMgPT09IFVwbG9hZFN0YXR1cy5Eb25lKSB7XG4gICAgICAgICAgICAgICAgZmlsZVsndXBsb2FkZWQnXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyB3YWl0IGZvciA1MDBtcyBiZWZvcmUgZmlsdGVyIGZpbGVzXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5maWxlcyA9IHRoaXMuZmlsZXMuZmlsdGVyKGZpbGUgPT4gZmlsZS5wcm9ncmVzcy5zdGF0dXMgIT09IFVwbG9hZFN0YXR1cy5Eb25lKTtcbiAgICAgICAgfSwgNTAwKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicm93XCI+XG4gIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJtZS1hdXRvIG1iLTBcIj5cbiAgICAgIDxoMiBjbGFzcz1cIm1iLTBcIj5cbiAgICAgICAgPGEgYXJpYS1sYWJlbD1cIk5hdmlnYXRlIHRvIFRhcmdldFwiXG4gICAgICAgICAgKGNsaWNrKT1cImJhY2soKVwiXG4gICAgICAgICAgY2xhc3M9XCJwcmV2aW91c1wiPjxpIGNsYXNzPVwiZmEgZmEtYXJyb3ctYWx0LWNpcmNsZS1sZWZ0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvYT5cbiAgICAgICAgT3Bwb3J0dW5pdHkgSW5mb1xuICAgICAgPC9oMj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTRcIj5cbiAgICA8ZGl2IGNsYXNzPVwidXNlci1pbmZvIHAtMyBjYXJkIHBiLTAgaC1hdXRvXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWItMiB0ZXh0LWNlbnRlclwiPlxuICAgICAgICA8YSBjbGFzcz1cInByb2ZpbGUtaW1hZ2VcIj5cbiAgICAgICAgICA8aW1nIHdpZHRoPVwiMTAwXCJcbiAgICAgICAgICAgIGhlaWdodD1cIjEwMFwiXG4gICAgICAgICAgICBjbGFzcz1cInJvdW5kZWQtY2lyY2xlIGltZy1ib3JkZXIgd2lkdGgtMTAwXCJcbiAgICAgICAgICAgIGFsdD1cInVzZXJcIlxuICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ltZy9pY29ucy9tYWxlLnBuZ1wiIC8+XG4gICAgICAgIDwvYT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTQgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8aDQgY2xhc3M9XCJkLWlubGluZS1ibG9ja1wiPlxuICAgICAgICAgIEFib3V0IDxzcGFuICpuZ0lmPVwiZGF0YT8uaWRcIj57eyBkYXRhLnRpdGxlIH19PC9zcGFuPlxuICAgICAgICA8L2g0PlxuICAgICAgICA8YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApO1wiXG4gICAgICAgICAgKm5nSWY9XCJpc0Zvcm1FZGl0XCJcbiAgICAgICAgICBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtcHJpbWFyeSBmbG9hdC1lbmRcIlxuICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzRm9ybUVkaXQgPSAhaXNGb3JtRWRpdDsgZ2V0QWNjb3VudHNCeVN1YnNjcmlwdGlvbigpOyBnZXRBbGxDb250YWN0cygpXG4gICAgICAgICAgICAgICAgICAgIFwiPkVkaXQ8L2E+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiYWJvdXRDb250cm9sc1wiXG4gICAgICAgIFtjbGFzcy5pc0Rpc2FibGVkXT1cImlzRm9ybUVkaXRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbCBtYi0wXCIgZm9yPVwiVGl0bGVcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgJ0NybS5PcHBvcnR1bml0aWVzTWVzc2FnZS5UaXRsZScgfCB0cmFuc2xvY29cbiAgICAgICAgICAgICAgICAgICAgfX08L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCByb3VuZGVkLTAgcHMtMSB1c2VyLXZhbHVlXCJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRpdGxlXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOiBzdWJtaXR0ZWQgJiYgZlsndGl0bGUnXS5lcnJvcnMgfVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItMyB1aS1mbHVpZCBza2lsbHMtbW9kYWxcIlxuICAgICAgICAgICpuZ0lmPVwiZGF0YT8uY3JtX2NvbnRhY3RfaWRcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbCBtYi0yXCIgZm9yPVwiQ29udGFjdFwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAnQ3JtLk9wcG9ydHVuaXRpZXNNZXNzYWdlLkNvbnRhY3QnIHwgdHJhbnNsb2NvXG4gICAgICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICA8YSBbcm91dGVyTGlua109XCJbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nICsgc3Vic2NyaXB0aW9uPy5zbHVnICsgcm91dGVycy5jb250YWN0SW5mbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNybV9jb250YWN0X2lkXG4gICAgICAgICAgICAgICAgICAgICAgICBdXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGQtYmxvY2sgcGItMiBwcy0xIHVzZXItdmFsdWVcIlxuICAgICAgICAgICAgKm5nSWY9XCJpc0Zvcm1FZGl0ICYmIGRhdGE/LmNybV9jb250YWN0X2lkXCI+e3sgZGF0YT8uY3JtX2NvbnRhY3Q/LmZpcnN0X25hbWUgfX0ge3sgZGF0YT8uY3JtX2NvbnRhY3Q/Lmxhc3RfbmFtZSB9fTwvYT5cbiAgICAgICAgICA8cC1hdXRvQ29tcGxldGUgKm5nSWY9XCIhaXNGb3JtRWRpdCB8fCAhZGF0YT8uY3JtX2NvbnRhY3RfaWRcIlxuICAgICAgICAgICAgW3N1Z2dlc3Rpb25zXT1cImZpbHRlcmVkQ29udGFjdHNcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY3JtX2NvbnRhY3RfaWRcIlxuICAgICAgICAgICAgZGF0YUtleT1cImlkXCJcbiAgICAgICAgICAgIGZpZWxkPVwiZGlzcGxheU5hbWVcIlxuICAgICAgICAgICAgW2Ryb3Bkb3duXT1cInRydWVcIlxuICAgICAgICAgICAgKGNvbXBsZXRlTWV0aG9kKT1cIm9uQ29udGFjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJ3LTEwMFwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBjb250YWN0c1wiXG4gICAgICAgICAgICBbbXVsdGlwbGVdPVwiZmFsc2VcIj5cbiAgICAgICAgICA8L3AtYXV0b0NvbXBsZXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTMgdWktZmx1aWQgc2tpbGxzLW1vZGFsXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwgbWItMlwiIGZvcj1cIkFjY291bnRcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgJ0NybS5PcHBvcnR1bml0aWVzTWVzc2FnZS5BY2NvdW50JyB8IHRyYW5zbG9jb1xuICAgICAgICAgICAgICAgICAgICB9fTwvbGFiZWw+XG4gICAgICAgICAgPGEgW3JvdXRlckxpbmtdPVwiW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvJyArIHN1YnNjcmlwdGlvbj8uc2x1ZyArIHJvdXRlcnMuYWNjb3VudEluZm8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5jcm1fYWNjb3VudF9pZFxuICAgICAgICAgICAgICAgICAgICAgICAgXVwiXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBkLWJsb2NrIHBiLTIgcHMtMSB1c2VyLXZhbHVlXCJcbiAgICAgICAgICAgICpuZ0lmPVwiaXNGb3JtRWRpdCAmJiBkYXRhPy5jcm1fYWNjb3VudF9pZFwiPnt7IGRhdGE/LmNybV9hY2NvdW50Py5uYW1lIH19PC9hPlxuICAgICAgICAgIDxwLWF1dG9Db21wbGV0ZSAqbmdJZj1cIiFpc0Zvcm1FZGl0IHx8ICFkYXRhPy5jcm1fYWNjb3VudF9pZFwiXG4gICAgICAgICAgICBbc3VnZ2VzdGlvbnNdPVwiZmlsdGVyZWRBY2NvdW50c1wiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjcm1fYWNjb3VudF9pZFwiXG4gICAgICAgICAgICBkYXRhS2V5PVwiaWRcIlxuICAgICAgICAgICAgZmllbGQ9XCJuYW1lXCJcbiAgICAgICAgICAgIFtkcm9wZG93bl09XCJ0cnVlXCJcbiAgICAgICAgICAgIChjb21wbGV0ZU1ldGhvZCk9XCJhY2NvdW50U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgc3R5bGVDbGFzcz1cInctMTAwXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGFjY291bnRzXCJcbiAgICAgICAgICAgIFttdWx0aXBsZV09XCJmYWxzZVwiPlxuICAgICAgICAgIDwvcC1hdXRvQ29tcGxldGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsIG1iLTBcIiBmb3I9XCJPbmVUaW1lQW1vdW50XCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICdDcm0uT3Bwb3J0dW5pdGllc01lc3NhZ2UuT25lVGltZUFtb3VudCcgfCB0cmFuc2xvY29cbiAgICAgICAgICAgICAgICAgICAgfX08L2xhYmVsPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9ybS1jb250cm9sIGQtYmxvY2sgcGItMiBwcy0xIHVzZXItdmFsdWVcIlxuICAgICAgICAgICAgKm5nSWY9XCJpc0Zvcm1FZGl0ICYmIGRhdGE/Lm9uZV90aW1lX2Ftb3VudFwiPnt7IGRhdGE/Lm9uZV90aW1lX2Ftb3VudCB8IGN1cnJlbmN5IH19PC9zcGFuPlxuICAgICAgICAgIDxpbnB1dCAqbmdJZj1cIiFpc0Zvcm1FZGl0IHx8ICFkYXRhPy5vbmVfdGltZV9hbW91bnRcIlxuICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICBudW1iZXJzT25seVxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgcm91bmRlZC0wIHBzLTEgdXNlci12YWx1ZVwiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJvbmVfdGltZV9hbW91bnRcIlxuICAgICAgICAgICAgaWQ9XCJvbmVfdGltZV9hbW91bnRcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmWydvbmVfdGltZV9hbW91bnQnXS5lcnJvcnMgfVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsIG1iLTBcIiBmb3I9XCJtb250aGx5QW1vdW50XCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICdDcm0uT3Bwb3J0dW5pdGllc01lc3NhZ2UuTW9udGhseUFtb3VudCcgfCB0cmFuc2xvY29cbiAgICAgICAgICAgICAgICAgICAgfX08L2xhYmVsPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9ybS1jb250cm9sIGQtYmxvY2sgcGItMiBwcy0xIHVzZXItdmFsdWVcIlxuICAgICAgICAgICAgKm5nSWY9XCJpc0Zvcm1FZGl0ICYmIGRhdGE/Lm1vbnRobHlfYW1vdW50XCI+e3sgZGF0YT8ubW9udGhseV9hbW91bnQgfCBjdXJyZW5jeSB9fTwvc3Bhbj5cbiAgICAgICAgICA8aW5wdXQgKm5nSWY9XCIhaXNGb3JtRWRpdCB8fCAhZGF0YT8ubW9udGhseV9hbW91bnRcIlxuICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICBudW1iZXJzT25seVxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgcm91bmRlZC0wIHBzLTEgdXNlci12YWx1ZVwiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJtb250aGx5X2Ftb3VudFwiXG4gICAgICAgICAgICBpZD1cIm1vbnRobHlfYW1vdW50XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOiBzdWJtaXR0ZWQgJiYgZlsnbW9udGhseV9hbW91bnQnXS5lcnJvcnMgfVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzRm9ybUVkaXRcIlxuICAgICAgICAgIGNsYXNzPVwidGV4dC1lbmQgZm9ybS1hY3Rpb24tYnV0dG9uc1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnlcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImlzRm9ybUVkaXQgPSAhaXNGb3JtRWRpdDsgZ2V0T3Bwb3J0dW5pdHlEZXRhaWxzKClcIlxuICAgICAgICAgICAgdmFsdWU9XCJDYW5jZWxcIiAvPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG1zLTNcIlxuICAgICAgICAgICAgdmFsdWU9XCJTdWJtaXRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZU9wcG9ydHVuaXRpZXMoKVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9mb3JtPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtOFwiPlxuICAgIDx1bCBuZ2JOYXZcbiAgICAgICNuYXY9XCJuZ2JOYXZcIlxuICAgICAgY2xhc3M9XCJuYXYtdGFic1wiPlxuICAgICAgPGxpIFtuZ2JOYXZJdGVtXT1cIjFcIj5cbiAgICAgICAgPGEgbmdiTmF2TGluaz5Ob3RlczwvYT5cbiAgICAgICAgPG5nLXRlbXBsYXRlIG5nYk5hdkNvbnRlbnQ+XG4gICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJhY3Rpb25Db250cm9sc1wiXG4gICAgICAgICAgICAobmdTdWJtaXQpPVwib25Db21tZW50U2F2ZSgpXCI+XG4gICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjb21tZW50XCJcbiAgICAgICAgICAgICAgcm93cz1cIjZcIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkNvbnRyb2xzLmdldCgnY29tbWVudCcpLnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uQ29udHJvbHMuZ2V0KCdjb21tZW50JykuaW52YWxpZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICBOb3RlIFJlcXVpcmVkXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYWN0aW9ucz8ubGVuZ3RoXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJkLWJsb2NrIGNsZWFyLWJvdGggcHQtM1wiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgYWN0aW9uczsgaW5kZXggYXMgaVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJhY3Rpb24udmlzaWJsZVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zbSBtZS0yIGJ0bi1vdXRsaW5lLXByaW1hcnkgbWItMiBhY3Rpb24tYnRuXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzaG93RGF0ZVBpY2tlcigkZXZlbnQsIGFjdGlvbi5pZCk7IGQudG9nZ2xlKClcIj5cbiAgICAgICAgICAgICAgICAgIHt7IGFjdGlvbi5uYW1lIH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwic3VibWl0QWN0aW9uICYmIGFjdGlvbkZvcm1Db250cm9scy5jcm1fYWN0aW9uX2lkLmludmFsaWRcIj5cbiAgICAgICAgICAgICAgICBQbGVhc2Ugc2VsZWN0IGFuIGFjdGlvblxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC0zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtc20tNFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJkZC1tbW0teXl5eVwiXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwid2hlblwiXG4gICAgICAgICAgICAgICAgICAgICAgbmdiRGF0ZXBpY2tlclxuICAgICAgICAgICAgICAgICAgICAgICNkPVwibmdiRGF0ZXBpY2tlclwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImQudG9nZ2xlKClcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS00IHBlLTAgY29tcGxldGVkLXRvZ2dsZVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHVpLXN3aXRjaCBjaGVja2VkTGFiZWw9XCJjb21wbGV0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgIHVuY2hlY2tlZExhYmVsPVwib3BlblwiXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY29tcGxldGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiY29tcGxldGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvdWktc3dpdGNoPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxvYXQtZW5kXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICAgIFtidXR0b25CdXN5XT1cImJ1dHRvbkJ1c3lcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidXR0b25EaXNhYmxlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBtdC0yIG1iLTIgZmxvYXQtZW5kXCJcbiAgICAgICAgICAgICAgICA+U3VibWl0IE5vdGU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSBtdC0yIG1iLTIgbWUtMCBtZS1zbS0yIGZsb2F0LWVuZFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5Nb2RhbChjb250ZW50KVwiPnt7ICdVcGxvYWQgZmlsZScgfCB0cmFuc2xvY28gfX08L2E+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJidXR0b25EaXNhYmxlXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJuby1hY3Rpb25zIHB0LTRcIj5cbiAgICAgICAgICAgICAgPHB3LW5vLWRhdGEgW3dpdGhJbWFnZV09XCJ0cnVlXCIgW21lc3NhZ2VdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ3JtLk9wcG9ydHVuaXRpZXNNZXNzYWdlLk5vQWN0aW9uc0luT3Bwb3J0dW5pdGllc0luZm9NZXNzYWdlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsb2NvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICA8L3B3LW5vLWRhdGE+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwIHRleHQtY2VudGVyIG10LTNcIlxuICAgICAgICAgICAgKm5nSWY9XCIhaXNMb2FkZWRcIj5cbiAgICAgICAgICAgIDxwLXByb2dyZXNzU3Bpbm5lciBzdHJva2VXaWR0aD1cIjJcIj4gPC9wLXByb2dyZXNzU3Bpbm5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIW9wcG9ydHVuaXRpZXNDb21tZW50cz8ubGVuZ3RoICYmIGlzTG9hZGVkXCJcbiAgICAgICAgICAgIGNsYXNzPVwibm8tYWN0aW9ucyBwdC0zXCI+XG4gICAgICAgICAgICA8cHctbm8tZGF0YSBbd2l0aEltYWdlXT1cInRydWVcIiBbbWVzc2FnZV09XCInQ3JtLk9wcG9ydHVuaXRpZXNNZXNzYWdlLk5vQWN0aW9uc01lc3NhZ2UnIHwgdHJhbnNsb2NvXCI+XG4gICAgICAgICAgICA8L3B3LW5vLWRhdGE+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cIm9wcG9ydHVuaXRpZXNDb21tZW50cz8ubGVuZ3RoXCJcbiAgICAgICAgICAgIGlkPVwidGltZWxpbmVcIlxuICAgICAgICAgICAgY2xhc3M9XCJwdC0zIGNsZWFyLWJvdGggdGltZWxpbmUtY2VudGVyIHRpbWVsaW5lLXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDx1bCBjbGFzcz1cInRpbWVsaW5lXCI+XG4gICAgICAgICAgICAgIDxsaSBjbGFzcz1cInRpbWVsaW5lLWxpbmVcIj48L2xpPlxuICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDx1bCBjbGFzcz1cInRpbWVsaW5lXCI+XG4gICAgICAgICAgICAgIDxsaSBjbGFzcz1cInRpbWVsaW5lLWxpbmVcIj48L2xpPlxuICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJ0aW1lbGluZS1pdGVtXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdtdC01Jzogb2RkIH1cIlxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW0gb2Ygb3Bwb3J0dW5pdGllc0NvbW1lbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggYXMgaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvZGQgPSBvZGQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXZlbiA9IGV2ZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWVsaW5lLWJhZGdlXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJnLXJlZCBiZy1saWdodGVuLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aW1lbGluZS15ZWFyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkLWJsb2NrIGRhdGUteWVhclwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLndoZW4gfCBkYXRlOiAnbWVkaXVtJyB8IHNsaWNlOiAwOjNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgaXRlbS55ZWFyIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWVsaW5lLWNhcmQgc2hhZG93IGNhcmQgcGItMCByb3VuZGVkIGJvcmRlci1ncmV5IGJvcmRlci1saWdodGVuLTIgcG9zaXRpb24tc3RhdGljXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgcHktNFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMCBjbGVhcmZpeFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiY29tbWVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbW1lbnQtZmllbGQgZm9ybS1jb250cm9sIHAtMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0uY29tbWVudFwiPnt7IGl0ZW0uY29tbWVudCB9fTwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJmbG9hdC1zdGFydCBtYi0wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXNob3dGdWxsQ29tbWVudCB8fCBpdGVtLmlkICE9PSBjb21tZW50SWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uY29tbWVudCB8IHNsaWNlOiAwOjE3MFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08YSAqbmdJZj1cIml0ZW0uY29tbWVudC5sZW5ndGggPiAxNzBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtc2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93RnVsbENvbW1lbnQgPSB0cnVlOyBjb21tZW50SWQgPSBpdGVtLmlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+Li4uc2hvdyBtb3JlPC9hPlxuICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZsb2F0LXN0YXJ0IG1iLTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93RnVsbENvbW1lbnQgJiYgaXRlbS5pZCA9PT0gY29tbWVudElkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmNvbW1lbnQgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY29tbWVudC5sZW5ndGggPiAxNzAgJiYgc2hvd0Z1bGxDb21tZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dGdWxsQ29tbWVudCA9IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeVwiPi4uLnNob3cgbGVzczwvYT5cbiAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbWQgZWRpdC1idG4gZmxvYXQtZW5kIHB5LTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dFZGl0Q29udHJvbHMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInVzZXJJZCA9PT0gaXRlbS5vd25lcl9pZCB8fCBoYXNBY2Nlc3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS1lZGl0IGVkaXQtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1zdWJ0aXRsZSB0ZXh0LW11dGVkIG15LTAgY2xlYXJmaXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxvYXQtc3RhcnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIXVwZGF0aW5nIHx8IGFjdGlvbklkICE9PSBpdGVtLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb250LXNtYWxsLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS53aGVuIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwidXBkYXRpbmcgJiYgYWN0aW9uSWQgPT09IGl0ZW0uaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImRkLW1tbS15eXl5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJ7eyBpdGVtLndoZW4gfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBuZ2JEYXRlcGlja2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICNkPVwibmdiRGF0ZXBpY2tlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1cyk9XCJkLnRvZ2dsZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGVTZWxlY3QpPVwib25EYXRlU2VsZWN0KCRldmVudCwgaXRlbSlcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cIiBidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNtIGZsb2F0LWVuZCB3aGVuLWJ0biBweS0wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwidXNlcklkID09PSBpdGVtLm93bmVyX2lkIHx8IGhhc0FjY2Vzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd0RhdGVQaWNrZXJVcGRhdGUoaXRlbS5pZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS1lZGl0IGVkaXQtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8cCBbY2xhc3MudGV4dC1kYW5nZXJdPVwiIWl0ZW0uY29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWl0ZW0uY2FuY2VsbGVkICYmICFpdGVtLmNvbXBsZXRlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYi0wXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5kdWUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbT8ub3duZXI/LmZpcnN0X25hbWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbT8ub3duZXI/Lmxhc3RfbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctcHJpbWFyeVwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0/LmNybV9hY3Rpb24/Lm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpdGVtLmNvbXBsZXRlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZXJJZCA9PT0gaXRlbS5vd25lcl9pZCB8fCBoYXNBY2Nlc3MpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJiYWRnZSBiZy1zdWNjZXNzIG1zLTJcIj5PcGVuPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8YSAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWl0ZW0uY29tcGxldGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNlcklkID09PSBpdGVtLm93bmVyX2lkIHx8IGhhc0FjY2VzcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwiU2V0IGFzIGNvbXBsZXRlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlNldCBhcyBjb21wbGV0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWUtMyBtcy0zXCJcbiAgICAgICAgICAgICAgICAgICAgICBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApO1wiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXNDb21wbGV0ZWRPclVuY29tcGxldGVkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmNvbXBsZXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXRhc2tzIGNvbXBsZXRlZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICA8YSAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWl0ZW0uY2FuY2VsbGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXRlbS5jb21wbGV0ZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2VySWQgPT09IGl0ZW0ub3duZXJfaWQgfHwgaGFzQWNjZXNzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJTZXQgYXMgY2FuY2VsbGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiU2V0IGFzIGNhbmNlbGxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKTtcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZXRBc0NhbmNlbGxlZChpdGVtLmlkLCBpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhIGZhLXRpbWVzIGRlbGV0ZS1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgPGEgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY29tcGxldGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNlcklkID09PSBpdGVtLm93bmVyX2lkIHx8IGhhc0FjY2VzcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwiU2V0IGFzIFVuQ29tcGxldGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiU2V0IGFzIFVuQ29tcGxldGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApO1wiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXNDb21wbGV0ZWRPclVuY29tcGxldGVkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmNvbXBsZXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXMtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFyIGZhLXdpbmRvdy1jbG9zZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbC1idG5zIG10LTMgdGV4dC1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLWRlZmF1bHQgbWUtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd0VkaXRDb250cm9scyh1bmRlZmluZWQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBDYW5jZWxcbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVDb21tZW50KGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBTdWJtaXRcbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2xpPlxuICAgICAgPGxpIFtuZ2JOYXZJdGVtXT1cIjJcIj5cbiAgICAgICAgPGEgbmdiTmF2TGluaz5WZXJzaW9uaW5nPC9hPlxuICAgICAgICA8bmctdGVtcGxhdGUgbmdiTmF2Q29udGVudD5cbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCB2ZXJzaW9uIG9mIG9wcG9ydHVuaXRpZXNWZXJzaW9uaW5nXCI+XG4gICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgPHN0cm9uZz5FdmVudDogPC9zdHJvbmc+e3sgdmVyc2lvbi5ldmVudCB9fSB8IDxzdHJvbmc+QXV0aG9yOiA8L3N0cm9uZz48YSAqbmdJZj1cInZlcnNpb24/LmF1dGhvclwiXG4gICAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiWycvbWVtYmVycycsIHZlcnNpb24/LmF1dGhvcj8uc2x1Z11cIj57eyB2ZXJzaW9uPy5hdXRob3IgfCBpZk5hbWVOdWxsU2hvd0VtYWlsIH19PC9hPlxuICAgICAgICAgICAgICB8IDxzdHJvbmc+Q3JlYXRlZCBhdDogPC9zdHJvbmc+e3sgdmVyc2lvbi5jcmVhdGVkX2F0IH19PGJyIC8+XG4gICAgICAgICAgICAgIDxzdHJvbmc+T2JqZWN0OiA8L3N0cm9uZz57eyB2ZXJzaW9uLm9iamVjdCB8IGpzb24gfX1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDxociAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJvcHBvcnR1bml0aWVzVmVyc2lvbmluZz8ubGVuZ3RoID09PSAwXCI+XG4gICAgICAgICAgICA8cHctbm8tZGF0YSBbd2l0aEltYWdlXT1cInRydWVcIiBbbWVzc2FnZV09XCInQ3JtLk9wcG9ydHVuaXRpZXNNZXNzYWdlLk5vVmVyc2lvbnNNZXNzYWdlJyB8IHRyYW5zbG9jb1wiPlxuICAgICAgICAgICAgPC9wdy1uby1kYXRhPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9saT5cbiAgICAgIDxsaSBbbmdiTmF2SXRlbV09XCIzXCI+XG4gICAgICAgIDxhIG5nYk5hdkxpbms+RmlsZXM8L2E+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBuZ2JOYXZDb250ZW50PlxuICAgICAgICAgIDxwdy1zbWFydC1jcm0tY29tcGFueS1maWxlcyBbY29udGFjdElkXT1cImNvbnRhY3RJZFwiXG4gICAgICAgICAgICBbYWNjb3VudElkXT1cImFjY291bnRJZFwiXG4gICAgICAgICAgICBbb3Bwb3J0dW5pdHlJZF09XCJvcHBvcnR1bml0aWVzSWRcIj5cbiAgICAgICAgICA8L3B3LXNtYXJ0LWNybS1jb21wYW55LWZpbGVzPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9saT5cbiAgICA8L3VsPlxuXG4gICAgPGRpdiBbbmdiTmF2T3V0bGV0XT1cIm5hdlwiPjwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2NvbnRlbnRcbiAgbGV0LW1vZGFsPlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgPGgzIGNsYXNzPVwibW9kYWwtdGl0bGUgbWItMCBwLTBcIj57eyAnVXBsb2FkIEZpbGUnIHwgdHJhbnNsb2NvIH19PC9oMz5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3M9XCJidG4tY2xvc2UgZmxvYXQtZW5kXCJcbiAgICAgIGFyaWEtbGFiZWw9XCJDbG9zZVwiXG4gICAgICAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCI+XG5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XG4gICAgPHNtYWxsPiB7eyAnVXNlci5Qcm9maWxlLlBpY3R1cmVNZXNzYWdlJyB8IHRyYW5zbG9jbyB9fTwvc21hbGw+XG4gICAgPGRpdiBjbGFzcz1cInJvdyBwLTJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInVwbG9hZC1ib3hcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidXBsb2FkLWJveC1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcC1jb250YWluZXJcIlxuICAgICAgICAgICAgICBuZ0ZpbGVEcm9wXG4gICAgICAgICAgICAgIFtvcHRpb25zXT1cIm9wdGlvbnNcIlxuICAgICAgICAgICAgICAodXBsb2FkT3V0cHV0KT1cIm9uVXBsb2FkT3V0cHV0KCRldmVudClcIlxuICAgICAgICAgICAgICBbdXBsb2FkSW5wdXRdPVwidXBsb2FkSW5wdXRcIj5cbiAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgRHJhZyBmaWxlcyBoZXJlIG9yXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidXBsb2FkLWJ1dHRvblwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCJcbiAgICAgICAgICAgICAgICAgICAgbmdGaWxlU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cIm9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAodXBsb2FkT3V0cHV0KT1cIm9uVXBsb2FkT3V0cHV0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBbdXBsb2FkSW5wdXRdPVwidXBsb2FkSW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZSAvPlxuICAgICAgICAgICAgICAgICAgYnJvd3NlXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICB0byB1cGxvYWQuXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVwbG9hZC1pdGVtXCJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGYgb2YgZmlsZXM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVwbG9hZC1pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsZW5hbWVcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlbmFtZS1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiaW9uaWNvbiBpb24taW9zLWNvcHlcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGYubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYXJcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJmPy5wcm9ncmVzcz8uZGF0YT8ucGVyY2VudGFnZSArICclJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWRvbmVdPVwiZlsndXBsb2FkZWQnXVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy10ZXh0LWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHJvZ3Jlc3MtdGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1kb25lXT1cImZbJ3VwbG9hZGVkJ11cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZlsndXBsb2FkZWQnXVwiPnt7IGYucHJvZ3Jlc3M/LmRhdGE/LnBlcmNlbnRhZ2UgLSAxIH19JVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZlsndXBsb2FkZWQnXVwiPjEwMCAlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmWyd1cGxvYWRlZCddXCI+VXBsb2FkaW5nLi4uPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZbJ3VwbG9hZGVkJ11cIj5Eb25lPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzcGVlZC1hbmQtZXRhLXRleHRcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImYucHJvZ3Jlc3M/LmRhdGE/LnBlcmNlbnRhZ2UgIT09IDAgJiYgIWZbJ3VwbG9hZGVkJ11cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZi5wcm9ncmVzcz8uZGF0YT8uc3BlZWRIdW1hbiB9fSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPkVUQSB7eyBmLnByb2dyZXNzPy5kYXRhPy5ldGFIdW1hbiB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|