vcomply-workflow-engine 3.8.7 → 3.8.9

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.
Files changed (29) hide show
  1. package/esm2022/lib/link-related-policies/constants.mjs +8 -0
  2. package/esm2022/lib/link-related-policies/link-related-policies.component.mjs +167 -0
  3. package/esm2022/lib/more-option/more-option.component.mjs +10 -1
  4. package/esm2022/lib/sharedComponents/framework-list/framework-integration-interfaces.mjs +1 -1
  5. package/esm2022/lib/workflow/shared/constants/cdn-link.constant.mjs +3 -1
  6. package/esm2022/lib/workflow-engine-container/api-constants.mjs +5 -0
  7. package/esm2022/lib/workflow-engine.module.mjs +5 -2
  8. package/esm2022/lib/workflow-interfaces/create-policy-form.mjs +1 -1
  9. package/esm2022/lib/workflow-policy/workflow-policy.component.mjs +44 -5
  10. package/esm2022/lib/workflow-risk/workflow-risk.component.mjs +2 -1
  11. package/esm2022/lib/workflow-services/policy.service.mjs +23 -3
  12. package/fesm2022/vcomply-workflow-engine.mjs +238 -5
  13. package/fesm2022/vcomply-workflow-engine.mjs.map +1 -1
  14. package/lib/link-related-policies/constants.d.ts +7 -0
  15. package/lib/link-related-policies/link-related-policies.component.d.ts +44 -0
  16. package/lib/sharedComponents/framework-list/framework-integration-interfaces.d.ts +11 -0
  17. package/lib/workflow/grc-object/grc-object-container/grc-object-container.component.d.ts +2 -0
  18. package/lib/workflow/shared/components/attributes/attributes-text-box/attributes-text-box.component.d.ts +2 -0
  19. package/lib/workflow/shared/components/attributes/attributes.component.d.ts +2 -0
  20. package/lib/workflow/shared/components/grc-object-list/grc-object-list.component.d.ts +2 -0
  21. package/lib/workflow/shared/components/program-responsibility-listing/program-responsibility-listing.component.d.ts +2 -0
  22. package/lib/workflow/shared/components/risk-category-risk-listing/risk-category-risk-listing.component.d.ts +2 -0
  23. package/lib/workflow/shared/constants/cdn-link.constant.d.ts +2 -0
  24. package/lib/workflow-engine-container/api-constants.d.ts +4 -0
  25. package/lib/workflow-engine.module.d.ts +34 -33
  26. package/lib/workflow-interfaces/create-policy-form.d.ts +3 -0
  27. package/lib/workflow-policy/workflow-policy.component.d.ts +4 -0
  28. package/lib/workflow-services/policy.service.d.ts +4 -0
  29. package/package.json +1 -1
@@ -0,0 +1,8 @@
1
+ export const CONSTANTS = {
2
+ DEFAULT_PAGE_NUMBER: 1,
3
+ PAGE_IN_SINGLE_VIEW: 5,
4
+ NO_DATA_IMAGE_TEXT: 'No data to display.',
5
+ LINK_POLICY: 'isLinkedPolices',
6
+ LINK_POLICY_HELP_TEXT: 'If enabled, all the related policies will be visible when this policy is published on the Policy Portal.'
7
+ };
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdngtd29ya2Zsb3ctZW5naW5lL3NyYy9saWIvbGluay1yZWxhdGVkLXBvbGljaWVzL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUU7SUFDdEIsbUJBQW1CLEVBQUUsQ0FBQztJQUN0QixtQkFBbUIsRUFBRSxDQUFDO0lBQ3RCLGtCQUFrQixFQUFDLHFCQUFxQjtJQUN4QyxXQUFXLEVBQUcsaUJBQWlCO0lBQy9CLHFCQUFxQixFQUFHLDBHQUEwRztDQUNuSSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IENPTlNUQU5UUyA9e1xyXG4gIERFRkFVTFRfUEFHRV9OVU1CRVI6IDEsXHJcbiAgUEFHRV9JTl9TSU5HTEVfVklFVzogNSxcclxuICBOT19EQVRBX0lNQUdFX1RFWFQ6J05vIGRhdGEgdG8gZGlzcGxheS4nLFxyXG4gIExJTktfUE9MSUNZIDogJ2lzTGlua2VkUG9saWNlcycsXHJcbiAgTElOS19QT0xJQ1lfSEVMUF9URVhUOiAgJ0lmIGVuYWJsZWQsIGFsbCB0aGUgcmVsYXRlZCBwb2xpY2llcyB3aWxsIGJlIHZpc2libGUgd2hlbiB0aGlzIHBvbGljeSBpcyBwdWJsaXNoZWQgb24gdGhlIFBvbGljeSBQb3J0YWwuJ1xyXG59O1xyXG5cclxuXHJcbiJdfQ==
@@ -0,0 +1,167 @@
1
+ import { HttpParams } from '@angular/common/http';
2
+ import { Component, EventEmitter, Output, Input } from '@angular/core';
3
+ import { Subject, takeUntil } from 'rxjs';
4
+ import { CONSTANTS } from './constants';
5
+ import { LINKS } from '../workflow/shared/constants/cdn-link.constant';
6
+ import { API_URLS } from '../workflow-engine-container/api-constants';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "../workflow-services/policy.service";
9
+ import * as i2 from "@angular/common";
10
+ import * as i3 from "../formgroup/cs-checkbox/cs-checkbox.component";
11
+ import * as i4 from "../ui-kit/tooltip/tooltip.directive";
12
+ import * as i5 from "../ui-kit/popover/popover.component";
13
+ import * as i6 from "../ui-kit/popover/popover.directive";
14
+ import * as i7 from "../sharedComponents/no-data/no-data.component";
15
+ import * as i8 from "../sharedComponents/v-loader/loader-inline/loader-inline.component";
16
+ import * as i9 from "../workflow-program/create-program-ui/pagination/pagination/pagination.component";
17
+ export class LinkRelatedPoliciesComponent {
18
+ constructor(policyService) {
19
+ this.policyService = policyService;
20
+ this.CONSTANTS = CONSTANTS;
21
+ this.LINKS = LINKS;
22
+ this.animation = false;
23
+ this.unsubscribe = new Subject();
24
+ this.policySortBy = 'desc';
25
+ this.selectedControlIds = [];
26
+ this.selectedPolicyList = [];
27
+ this.searchText = {
28
+ policy: '',
29
+ };
30
+ this.loader = false;
31
+ this.recentPage = CONSTANTS.DEFAULT_PAGE_NUMBER;
32
+ this.policiesList = {
33
+ from: 1,
34
+ to: 0,
35
+ currentPage: 1,
36
+ totalPage: 0,
37
+ totalRecords: 0,
38
+ data: [],
39
+ };
40
+ this.closeLinkPolicyList = new EventEmitter();
41
+ this.selectedList = new EventEmitter();
42
+ this.selectedPolicies = [];
43
+ this.recentPage = CONSTANTS.DEFAULT_PAGE_NUMBER;
44
+ }
45
+ ngOnInit() {
46
+ this.animation = true;
47
+ setTimeout(() => {
48
+ this.animation = false;
49
+ }, 300);
50
+ this.getPolicies();
51
+ }
52
+ goBack() {
53
+ this.closeLinkPolicyList.emit();
54
+ }
55
+ selectedItems() {
56
+ this.selectedControlIds = this.policyService?.linkRelatePolicies[this.recentPage - 1]?.data
57
+ .filter((element) => this.selectedPolicyList?.includes(element.contract_name))
58
+ .map((element) => element.contract_id);
59
+ }
60
+ searchBy(event) {
61
+ if (this.searchText.policy != event) {
62
+ this.searchText.policy = event;
63
+ this.getPolicies({ search: true });
64
+ }
65
+ if (!event) {
66
+ this.recentPage = CONSTANTS.DEFAULT_PAGE_NUMBER;
67
+ this.getPolicies({ search: false });
68
+ }
69
+ }
70
+ changePage(event) {
71
+ this.recentPage = event;
72
+ if (this.policyService.linkRelatePolicies[event - 1]) {
73
+ this.policiesList = this.policyService.linkRelatePolicies[event - 1];
74
+ this.selectedItems();
75
+ return;
76
+ }
77
+ this.getPolicies();
78
+ }
79
+ selectedParam(data) {
80
+ let params = new HttpParams();
81
+ params = params.append('paginationType', 'small');
82
+ if (data?.search) {
83
+ params = params.append('searchText', this.searchText.policy);
84
+ }
85
+ params = params.append('pageNo', this.recentPage);
86
+ if (data?.sort) {
87
+ params = params.append('sortBy', this.policySortBy);
88
+ }
89
+ return params;
90
+ }
91
+ getPagePolicyList(res) {
92
+ return {
93
+ from: res?.from ?? 1,
94
+ to: res?.to ?? 0,
95
+ currentPage: this.recentPage,
96
+ totalPage: res?.total_pages ?? 0,
97
+ totalRecords: res?.all_records ?? 0,
98
+ data: [...new Set(res?.data)],
99
+ };
100
+ }
101
+ getPolicies(data) {
102
+ if (this.policyService.linkRelatePolicies[this.recentPage - 1] &&
103
+ !data?.search) {
104
+ this.policiesList =
105
+ this.policyService.linkRelatePolicies[this.recentPage - 1];
106
+ this.selectedPolicyList = [...new Set(this.selectedPolicies)];
107
+ this.selectedItems();
108
+ return;
109
+ }
110
+ let params = this.selectedParam(data);
111
+ this.loader = true;
112
+ const request = {
113
+ method: 'get',
114
+ action: '/policy',
115
+ mode: API_URLS.fetchPolicyList,
116
+ params,
117
+ };
118
+ this.policyService
119
+ .getPolicyList(request)
120
+ .pipe(takeUntil(this.unsubscribe))
121
+ .subscribe({
122
+ next: (res) => {
123
+ this.loader = false;
124
+ this.policiesList = this.getPagePolicyList(res);
125
+ if (!this.policyService.linkRelatePolicies[this.recentPage - 1]) {
126
+ this.policyService.linkRelatePolicies[this.recentPage - 1] =
127
+ JSON.parse(JSON.stringify(this.policiesList));
128
+ }
129
+ },
130
+ error: (err) => {
131
+ this.loader = false;
132
+ },
133
+ });
134
+ }
135
+ selectPolicy(event, data) {
136
+ if (event) {
137
+ this.selectedControlIds.push(data.contract_id);
138
+ this.selectedPolicyList.push(data.contract_name);
139
+ }
140
+ else {
141
+ this.selectedControlIds = this.selectedControlIds.filter((id) => id !== data.contract_id);
142
+ this.selectedPolicyList = this.selectedPolicyList.filter((name) => name !== data.contract_name);
143
+ }
144
+ }
145
+ saveChanges() {
146
+ this.selectedList.emit({
147
+ selectedPolicyList: this.selectedPolicyList,
148
+ });
149
+ }
150
+ deleteItem(event) {
151
+ this.selectedPolicyList = this.selectedPolicyList.filter((name) => name !== event);
152
+ this.selectedItems();
153
+ }
154
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LinkRelatedPoliciesComponent, deps: [{ token: i1.PolicyService }], target: i0.ɵɵFactoryTarget.Component }); }
155
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: LinkRelatedPoliciesComponent, selector: "app-link-related-policies", inputs: { selectedPolicies: "selectedPolicies" }, outputs: { closeLinkPolicyList: "closeLinkPolicyList", selectedList: "selectedList" }, ngImport: i0, template: "<div class=\"link-policy\" [class.animate]=\"animation\">\r\n <ng-container>\r\n <div\r\n class=\"link-policy-head vx-d-flex vx-align-center vx-justify-between vx-pl-4 vx-pr-4\"\r\n >\r\n <div class=\"page-title vx-fs-14 vx-fw-500 vx-label-txt\">\r\n Select Policies to link with\r\n </div>\r\n <button\r\n (click)=\"goBack()\"\r\n class=\"back-btn vx-fs-14 vx-fw-500 vx-label-txt vx-tt-uppercase vx-p-0 vx-m-0 vx-d-flex vx-align-center\"\r\n >\r\n <i class=\"icons vx-mr-1\">&#xe91d;</i> BACK\r\n </button>\r\n </div>\r\n <div class=\"link-policy-body vx-p-4 vx-pb-3\">\r\n <div class=\"link-policy-search vx-mb-2\">\r\n <i class=\"icons vx-fs-12\">&#xe90b;</i>\r\n <input\r\n type=\"text\"\r\n placeholder=\"Search Policies\"\r\n (keyup.enter)=\"searchBy($event.target.value)\"\r\n />\r\n </div>\r\n <vui-pagination\r\n *ngIf=\"!loader && policiesList.totalPage > CONSTANTS.DEFAULT_PAGE_NUMBER\"\r\n [from]=\"policiesList.from\"\r\n [to]=\"policiesList.to\"\r\n [total]=\"policiesList.totalRecords\"\r\n [showPageDetail]=\"true\"\r\n [totalPage]=\"policiesList.totalPage\"\r\n [currentPage]=\"policiesList.currentPage\"\r\n [pageInSingleView]=\"CONSTANTS.PAGE_IN_SINGLE_VIEW\"\r\n (pageChanged)=\"changePage($event)\"\r\n >\r\n </vui-pagination>\r\n <div\r\n class=\"link-policy-table\"\r\n [class.with-pagination]=\"!loader && policiesList.totalPage > 1\"\r\n >\r\n <ng-container *ngIf=\"!loader && policiesList.data?.length > 0\">\r\n <div class=\"table-header\">\r\n <div class=\"table-row\">\r\n <div\r\n class=\"table-column vx-fs-10 vx-fw-500 vx-label-txt vx-lh-5 vx-tt-uppercase vx-pl-1 vx-pr-1 vx-d-flex vx-align-center serial\"\r\n >\r\n #\r\n </div>\r\n <div\r\n class=\"table-column vx-fs-10 vx-fw-500 vx-label-txt vx-lh-5 vx-tt-uppercase vx-pl-1 vx-pr-1 vx-d-flex vx-align-center policies\"\r\n >\r\n POLICIES\r\n </div>\r\n <div\r\n class=\"table-column vx-fs-10 vx-fw-500 vx-label-txt vx-lh-5 vx-tt-uppercase vx-pl-1 vx-pr-1 vx-d-flex vx-align-center categories\"\r\n >\r\n CATEGORIES\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"table-body\">\r\n <div\r\n class=\"table-row\"\r\n [class.active]=\"selectedControlIds?.includes(policy.contract_id)\"\r\n *ngFor=\"let policy of policiesList.data; let i = index\"\r\n >\r\n <div\r\n class=\"table-column vx-pl-1 vx-pr-1 vx-d-flex vx-align-center serial\"\r\n >\r\n <div\r\n class=\"sr-no\"\r\n [appTooltip]=\"i + policiesList.from\"\r\n placement=\"bottom\"\r\n delay=\"0\"\r\n type=\"black\"\r\n [tooltipMandatory]=\"true\"\r\n >\r\n {{ i + policiesList.from }}\r\n </div>\r\n <app-cs-checkbox\r\n class=\"check-box\"\r\n [value]=\"policy?.contract_id\"\r\n [ngValue]=\"selectedControlIds?.includes(policy?.contract_id)\"\r\n (ngValueChange)=\"selectPolicy($event, policy)\"\r\n ></app-cs-checkbox>\r\n </div>\r\n <div\r\n class=\"table-column vx-pl-1 vx-pr-1 vx-d-flex vx-align-center policies column-body clickable\"\r\n >\r\n <div\r\n class=\"value vx-fs-12 vx-label-txt\"\r\n [appTooltip]=\"policy?.contract_name\"\r\n placement=\"bottom-left\"\r\n delay=\"0\"\r\n type=\"black\"\r\n [tooltipMandatory]=\"false\"\r\n (click)=\"\r\n selectPolicy(\r\n !selectedControlIds?.includes(policy?.contract_id),\r\n policy\r\n )\r\n \"\r\n >\r\n {{\r\n policy?.control_id\r\n ? \"[POLID - \" + policy.control_id + \"] \"\r\n : \"\"\r\n }}{{ policy?.contract_name }}\r\n </div>\r\n </div>\r\n <div\r\n class=\"table-column vx-pl-1 vx-pr-1 vx-d-flex vx-align-center categories\"\r\n >\r\n <ng-container *ngIf=\"policy?.childCat?.length\">\r\n <div\r\n class=\"value vx-fs-12 vx-label-txt\"\r\n [appTooltip]=\"policy?.childCat[0]?.category_name\"\r\n placement=\"bottom-left\"\r\n delay=\"0\"\r\n type=\"black\"\r\n [tooltipMandatory]=\"false\"\r\n >\r\n {{ policy?.childCat[0]?.category_name }}\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"policy?.childCat?.length > 1\">\r\n <button\r\n class=\"count vx-fs-12 vx-fw-500 vx-txt-white vx-p-0 vx-pl-1 vx-pr-1 vx-m-0 vx-ml-1 vx-d-flex vx-align-center vx-justify-center\"\r\n appPopover\r\n (click)=\"category.popover()\"\r\n placement=\"top\"\r\n >\r\n +{{ policy?.childCat?.slice(1)?.length }}\r\n </button>\r\n <app-popover #category [dontCloseonClick]=\"true\">\r\n <div class=\"wf-action-list\">\r\n <ul class=\"action-item\">\r\n <li\r\n *ngFor=\"\r\n let childCategory of policy?.childCat?.slice(1)\r\n \"\r\n >\r\n <div class=\"avatar-card\">\r\n <span class=\"value\">{{\r\n childCategory?.category_name\r\n }}</span>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </app-popover>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <app-no-data\r\n *ngIf=\"!loader && policiesList?.data?.length === 0\"\r\n [noDataImage]=\"\r\n LINKS.linkPolicyNoDataImage\r\n \"\r\n [noDataText]=\"CONSTANTS.NO_DATA_IMAGE_TEXT\"\r\n ></app-no-data>\r\n </div>\r\n\r\n <div\r\n class=\"link-policy-floating-bar vx-d-flex vx-align-center vx-justify-between vx-p-3 vx-mt-1\"\r\n >\r\n <div class=\"link-policy-floating-bar-left vx-d-flex vx-align-center\">\r\n <div class=\"selected\" *ngIf=\"selectedPolicyList?.length > 0\">\r\n <div\r\n class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\"\r\n >\r\n <ng-container\r\n *ngFor=\"let policyName of selectedPolicyList?.slice(0, 1)\"\r\n >\r\n <i\r\n (click)=\"deleteItem(policyName)\"\r\n class=\"icons cross vx-fs-10 vx-paragraph-txt vx-mr-1\"\r\n >&#xe9ae;</i\r\n >\r\n <span\r\n class=\"chipName vx-fs-11 vx-label-txt\"\r\n [appTooltip]=\"policyName\"\r\n placement=\"bottom-left\"\r\n delay=\"0\"\r\n type=\"black\"\r\n [tooltipMandatory]=\"false\"\r\n >{{ policyName }}</span\r\n >\r\n </ng-container>\r\n <button\r\n class=\"countBtn vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\r\n *ngIf=\"selectedPolicyList.length > 1\"\r\n type=\"button\"\r\n appPopover\r\n (click)=\"relatedPolicy.popover()\"\r\n placement=\"left\"\r\n >\r\n +{{ selectedPolicyList?.slice(1).length }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <app-popover #relatedPolicy [dontCloseonClick]=\"true\">\r\n <div class=\"wf-action-list\">\r\n <ul class=\"action-item\">\r\n <li\r\n *ngFor=\"\r\n let policyName of selectedPolicyList | slice : 1;\r\n let j = index\r\n \"\r\n >\r\n <div class=\"avatar-card\">\r\n <span class=\"value\">\r\n <i class=\"icons\" (click)=\"deleteItem(policyName)\"\r\n >&#xe90d;</i\r\n >\r\n {{ policyName }}\r\n </span>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </app-popover>\r\n <div class=\"link-policy-floating-bar-right vx-d-flex vx-align-center\">\r\n <button\r\n (click)=\"goBack()\"\r\n class=\"cancel-btn vx-fs-11 vx-fw-500 vx-tt-uppercase vx-d-flex vx-align-center vx-justify-center vx-txt-red\"\r\n >\r\n CANCEL\r\n </button>\r\n <button\r\n (click)=\"saveChanges()\"\r\n [class.disabled]=\"selectedPolicyList.length === 0\"\r\n class=\"next-btn vx-fs-11 vx-fw-500 vx-tt-uppercase vx-d-flex vx-align-center vx-justify-center vx-txt-white\"\r\n >\r\n NEXT <i class=\"icons vx-ml-2\">&#xe91e;</i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <app-loader-inline *ngIf=\"loader\"></app-loader-inline>\r\n</div>\r\n", styles: ["@import\"https://cdn.v-comply.com/design-system/css/icons/icons.css\";@import\"https://cdn.v-comply.com/design-system/css/display/display.css\";@import\"https://cdn.v-comply.com/design-system/css/alignment/alignment.css\";@import\"https://cdn.v-comply.com/design-system/css/text/text.css\";@import\"https://cdn.v-comply.com/design-system/css/color/color.css\";@import\"https://cdn.v-comply.com/design-system/css/width/width.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-top.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-bottom.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-left.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-right.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-top.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-bottom.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-left.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-right.css\";::ng-deep .link-policy{position:fixed;inset:0 500px 0 0}::ng-deep .link-policy.animate{animation:animate-right .2s cubic-bezier(.25,.46,.45,.94) both;z-index:-1}::ng-deep .link-policy-head{background:#f8f8f8;border-radius:.125rem .125rem 0 0;border-bottom:1px solid #F1F1F1;height:2.75rem}::ng-deep .link-policy-head button.back-btn{background:transparent;border-radius:0;border:none}::ng-deep .link-policy-search{position:relative}::ng-deep .link-policy-search input{height:2.75rem;line-height:1.5rem;padding:.75rem .75rem .75rem 2.5rem;outline:none;border:1px solid #7475763f;border-radius:.25rem;width:100%;font-size:14px;color:#747576}::ng-deep .link-policy-search input::placeholder{color:#747576;opacity:1}::ng-deep .link-policy-search i{position:absolute;left:1rem;top:1rem;pointer-events:none;color:#f1f1f1}::ng-deep .link-policy-table{overflow:hidden;overflow-y:auto;height:calc(100vh - 14rem)}::ng-deep .link-policy-table::-webkit-scrollbar-track{background-color:transparent}::ng-deep .link-policy-table .table-header{background:#fff;position:sticky;top:0;z-index:1}::ng-deep .link-policy-table .table-header .table-row{border:none!important;border-radius:0!important}::ng-deep .link-policy-table .table-header .table-row .table-column{line-height:1rem!important;min-height:1.5rem!important}::ng-deep .link-policy-table .table-row{border:1px solid #F1F1F1;border-radius:.25rem;display:flex;justify-content:space-between;position:relative;margin-bottom:.25rem}::ng-deep .link-policy-table .table-row:hover .table-column.serial app-cs-checkbox,::ng-deep .link-policy-table .table-row.active .table-column.serial app-cs-checkbox{opacity:1}::ng-deep .link-policy-table .table-row .table-column{min-height:2.5rem;position:relative;width:100%}::ng-deep .link-policy-table .table-row .table-column.serial{width:2rem;max-width:2rem;justify-content:center}::ng-deep .link-policy-table .table-row .table-column.serial .sr-no{width:1.25rem;background:#f8f8f8;writing-mode:vertical-lr;color:#747576;font-size:.625rem;font-weight:500;display:flex;height:2.5rem;align-items:center;justify-content:center;position:relative;transition:all .2s ease-in-out}::ng-deep .link-policy-table .table-row .table-column.serial app-cs-checkbox{background:#fff;border-radius:.125rem;position:absolute;top:.75rem;left:.5rem;width:1rem;height:1rem;opacity:0;transition:all .2s ease-in-out}::ng-deep .link-policy-table .table-row .table-column.serial app-cs-checkbox .checkbox-item .checkbox,::ng-deep .link-policy-table .table-row .table-column.serial app-cs-checkbox .checkbox-item .checkmark{position:absolute;top:0}::ng-deep .link-policy-table .table-row .table-column.policies{width:calc(100% - 28rem);min-width:calc(100% - 28rem)}::ng-deep .link-policy-table .table-row .table-column.policies .value{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;width:calc(100% - 5rem)}::ng-deep .link-policy-table .table-row .table-column.categories{width:26rem;min-width:26rem}::ng-deep .link-policy-table .table-row .table-column.categories .value{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;max-width:calc(100% - 1rem)}::ng-deep .link-policy-table .table-row .table-column.categories button.count{background:#1e5dd3;border:none;border-radius:.125rem;height:1.5rem}::ng-deep .link-policy-table .table-row .table-column.category-name{width:calc(100% - 2rem);min-width:calc(100% - 2rem)}::ng-deep .link-policy-table .table-row .table-column.category-name .value{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;width:calc(100% - 5rem)}::ng-deep .link-policy-floating-bar{background:#fff;border-radius:.25rem;box-shadow:0 2px 12px #4681ef40}::ng-deep .link-policy-floating-bar-left .counter{background:#34aa44;border-radius:.125rem;min-width:1.75rem}::ng-deep .link-policy-floating-bar-left .chip{background:#fff;border-radius:.125rem;box-shadow:0 2px 4px #1e5dd31a;height:1.5rem;display:block;max-width:13rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}::ng-deep .link-policy-floating-bar-left .chip i{position:relative;top:.0625rem;cursor:pointer}::ng-deep .link-policy-floating-bar-left button.count{background:#34aa44;border:none;border-radius:.125rem;height:1.5rem}::ng-deep .link-policy-floating-bar-right button{background:transparent;border:none;border-radius:.125rem;padding:0 .5rem;height:1.5rem}::ng-deep .link-policy-floating-bar-right button.next-btn{background:#1e5dd3}::ng-deep .link-policy-floating-bar-right button.next-btn.disabled{background:#f1f1f1!important;color:#747576!important;pointer-events:none!important}::ng-deep app-popover .wf-action-list ul.action-item li .avatar-card .cross-btn{cursor:pointer}.wf-action-list .action-item li .count-value{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}@keyframes animate-right{0%{transform:translate(100%)}to{transform:translate(0)}}.column-body{position:relative;left:10px}.clickable{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.CsCheckboxComponent, selector: "app-cs-checkbox", inputs: ["disabled", "ngValue", "value", "readonly", "oneLine"], outputs: ["ngValueChange"] }, { kind: "directive", type: i4.ToolTipDirective, selector: "[appTooltip]", inputs: ["appTooltip", "placement", "type", "tooltipMandatory", "showTooltip", "animate"] }, { kind: "component", type: i5.PopoverComponent, selector: "app-popover", inputs: ["dontCloseonClick"] }, { kind: "directive", type: i6.PopoverDirective, selector: "[appPopover]", inputs: ["refrence", "placement"] }, { kind: "component", type: i7.NoDataComponent, selector: "app-no-data", inputs: ["action", "noDataImage", "noDataText", "noDataButton", "noDataSecButton", "altText", "smallButton", "button"], outputs: ["buttonAction"] }, { kind: "component", type: i8.LoaderInlineComponent, selector: "app-loader-inline" }, { kind: "component", type: i9.PaginationComponent, selector: "vui-pagination", inputs: ["from", "to", "total", "showPageDetail", "totalPage", "currentPage", "pageInSingleView"], outputs: ["pageChanged"] }, { kind: "pipe", type: i2.SlicePipe, name: "slice" }] }); }
156
+ }
157
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LinkRelatedPoliciesComponent, decorators: [{
158
+ type: Component,
159
+ args: [{ selector: 'app-link-related-policies', template: "<div class=\"link-policy\" [class.animate]=\"animation\">\r\n <ng-container>\r\n <div\r\n class=\"link-policy-head vx-d-flex vx-align-center vx-justify-between vx-pl-4 vx-pr-4\"\r\n >\r\n <div class=\"page-title vx-fs-14 vx-fw-500 vx-label-txt\">\r\n Select Policies to link with\r\n </div>\r\n <button\r\n (click)=\"goBack()\"\r\n class=\"back-btn vx-fs-14 vx-fw-500 vx-label-txt vx-tt-uppercase vx-p-0 vx-m-0 vx-d-flex vx-align-center\"\r\n >\r\n <i class=\"icons vx-mr-1\">&#xe91d;</i> BACK\r\n </button>\r\n </div>\r\n <div class=\"link-policy-body vx-p-4 vx-pb-3\">\r\n <div class=\"link-policy-search vx-mb-2\">\r\n <i class=\"icons vx-fs-12\">&#xe90b;</i>\r\n <input\r\n type=\"text\"\r\n placeholder=\"Search Policies\"\r\n (keyup.enter)=\"searchBy($event.target.value)\"\r\n />\r\n </div>\r\n <vui-pagination\r\n *ngIf=\"!loader && policiesList.totalPage > CONSTANTS.DEFAULT_PAGE_NUMBER\"\r\n [from]=\"policiesList.from\"\r\n [to]=\"policiesList.to\"\r\n [total]=\"policiesList.totalRecords\"\r\n [showPageDetail]=\"true\"\r\n [totalPage]=\"policiesList.totalPage\"\r\n [currentPage]=\"policiesList.currentPage\"\r\n [pageInSingleView]=\"CONSTANTS.PAGE_IN_SINGLE_VIEW\"\r\n (pageChanged)=\"changePage($event)\"\r\n >\r\n </vui-pagination>\r\n <div\r\n class=\"link-policy-table\"\r\n [class.with-pagination]=\"!loader && policiesList.totalPage > 1\"\r\n >\r\n <ng-container *ngIf=\"!loader && policiesList.data?.length > 0\">\r\n <div class=\"table-header\">\r\n <div class=\"table-row\">\r\n <div\r\n class=\"table-column vx-fs-10 vx-fw-500 vx-label-txt vx-lh-5 vx-tt-uppercase vx-pl-1 vx-pr-1 vx-d-flex vx-align-center serial\"\r\n >\r\n #\r\n </div>\r\n <div\r\n class=\"table-column vx-fs-10 vx-fw-500 vx-label-txt vx-lh-5 vx-tt-uppercase vx-pl-1 vx-pr-1 vx-d-flex vx-align-center policies\"\r\n >\r\n POLICIES\r\n </div>\r\n <div\r\n class=\"table-column vx-fs-10 vx-fw-500 vx-label-txt vx-lh-5 vx-tt-uppercase vx-pl-1 vx-pr-1 vx-d-flex vx-align-center categories\"\r\n >\r\n CATEGORIES\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"table-body\">\r\n <div\r\n class=\"table-row\"\r\n [class.active]=\"selectedControlIds?.includes(policy.contract_id)\"\r\n *ngFor=\"let policy of policiesList.data; let i = index\"\r\n >\r\n <div\r\n class=\"table-column vx-pl-1 vx-pr-1 vx-d-flex vx-align-center serial\"\r\n >\r\n <div\r\n class=\"sr-no\"\r\n [appTooltip]=\"i + policiesList.from\"\r\n placement=\"bottom\"\r\n delay=\"0\"\r\n type=\"black\"\r\n [tooltipMandatory]=\"true\"\r\n >\r\n {{ i + policiesList.from }}\r\n </div>\r\n <app-cs-checkbox\r\n class=\"check-box\"\r\n [value]=\"policy?.contract_id\"\r\n [ngValue]=\"selectedControlIds?.includes(policy?.contract_id)\"\r\n (ngValueChange)=\"selectPolicy($event, policy)\"\r\n ></app-cs-checkbox>\r\n </div>\r\n <div\r\n class=\"table-column vx-pl-1 vx-pr-1 vx-d-flex vx-align-center policies column-body clickable\"\r\n >\r\n <div\r\n class=\"value vx-fs-12 vx-label-txt\"\r\n [appTooltip]=\"policy?.contract_name\"\r\n placement=\"bottom-left\"\r\n delay=\"0\"\r\n type=\"black\"\r\n [tooltipMandatory]=\"false\"\r\n (click)=\"\r\n selectPolicy(\r\n !selectedControlIds?.includes(policy?.contract_id),\r\n policy\r\n )\r\n \"\r\n >\r\n {{\r\n policy?.control_id\r\n ? \"[POLID - \" + policy.control_id + \"] \"\r\n : \"\"\r\n }}{{ policy?.contract_name }}\r\n </div>\r\n </div>\r\n <div\r\n class=\"table-column vx-pl-1 vx-pr-1 vx-d-flex vx-align-center categories\"\r\n >\r\n <ng-container *ngIf=\"policy?.childCat?.length\">\r\n <div\r\n class=\"value vx-fs-12 vx-label-txt\"\r\n [appTooltip]=\"policy?.childCat[0]?.category_name\"\r\n placement=\"bottom-left\"\r\n delay=\"0\"\r\n type=\"black\"\r\n [tooltipMandatory]=\"false\"\r\n >\r\n {{ policy?.childCat[0]?.category_name }}\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"policy?.childCat?.length > 1\">\r\n <button\r\n class=\"count vx-fs-12 vx-fw-500 vx-txt-white vx-p-0 vx-pl-1 vx-pr-1 vx-m-0 vx-ml-1 vx-d-flex vx-align-center vx-justify-center\"\r\n appPopover\r\n (click)=\"category.popover()\"\r\n placement=\"top\"\r\n >\r\n +{{ policy?.childCat?.slice(1)?.length }}\r\n </button>\r\n <app-popover #category [dontCloseonClick]=\"true\">\r\n <div class=\"wf-action-list\">\r\n <ul class=\"action-item\">\r\n <li\r\n *ngFor=\"\r\n let childCategory of policy?.childCat?.slice(1)\r\n \"\r\n >\r\n <div class=\"avatar-card\">\r\n <span class=\"value\">{{\r\n childCategory?.category_name\r\n }}</span>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </app-popover>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <app-no-data\r\n *ngIf=\"!loader && policiesList?.data?.length === 0\"\r\n [noDataImage]=\"\r\n LINKS.linkPolicyNoDataImage\r\n \"\r\n [noDataText]=\"CONSTANTS.NO_DATA_IMAGE_TEXT\"\r\n ></app-no-data>\r\n </div>\r\n\r\n <div\r\n class=\"link-policy-floating-bar vx-d-flex vx-align-center vx-justify-between vx-p-3 vx-mt-1\"\r\n >\r\n <div class=\"link-policy-floating-bar-left vx-d-flex vx-align-center\">\r\n <div class=\"selected\" *ngIf=\"selectedPolicyList?.length > 0\">\r\n <div\r\n class=\"chipContainer vx-d-flex vx-align-center vx-pl-2 vx-pr-2\"\r\n >\r\n <ng-container\r\n *ngFor=\"let policyName of selectedPolicyList?.slice(0, 1)\"\r\n >\r\n <i\r\n (click)=\"deleteItem(policyName)\"\r\n class=\"icons cross vx-fs-10 vx-paragraph-txt vx-mr-1\"\r\n >&#xe9ae;</i\r\n >\r\n <span\r\n class=\"chipName vx-fs-11 vx-label-txt\"\r\n [appTooltip]=\"policyName\"\r\n placement=\"bottom-left\"\r\n delay=\"0\"\r\n type=\"black\"\r\n [tooltipMandatory]=\"false\"\r\n >{{ policyName }}</span\r\n >\r\n </ng-container>\r\n <button\r\n class=\"countBtn vx-fs-9 vx-fw-500 vx-txt-white vx-d-flex vx-align-center vx-justify-center vx-lh-4\"\r\n *ngIf=\"selectedPolicyList.length > 1\"\r\n type=\"button\"\r\n appPopover\r\n (click)=\"relatedPolicy.popover()\"\r\n placement=\"left\"\r\n >\r\n +{{ selectedPolicyList?.slice(1).length }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <app-popover #relatedPolicy [dontCloseonClick]=\"true\">\r\n <div class=\"wf-action-list\">\r\n <ul class=\"action-item\">\r\n <li\r\n *ngFor=\"\r\n let policyName of selectedPolicyList | slice : 1;\r\n let j = index\r\n \"\r\n >\r\n <div class=\"avatar-card\">\r\n <span class=\"value\">\r\n <i class=\"icons\" (click)=\"deleteItem(policyName)\"\r\n >&#xe90d;</i\r\n >\r\n {{ policyName }}\r\n </span>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </app-popover>\r\n <div class=\"link-policy-floating-bar-right vx-d-flex vx-align-center\">\r\n <button\r\n (click)=\"goBack()\"\r\n class=\"cancel-btn vx-fs-11 vx-fw-500 vx-tt-uppercase vx-d-flex vx-align-center vx-justify-center vx-txt-red\"\r\n >\r\n CANCEL\r\n </button>\r\n <button\r\n (click)=\"saveChanges()\"\r\n [class.disabled]=\"selectedPolicyList.length === 0\"\r\n class=\"next-btn vx-fs-11 vx-fw-500 vx-tt-uppercase vx-d-flex vx-align-center vx-justify-center vx-txt-white\"\r\n >\r\n NEXT <i class=\"icons vx-ml-2\">&#xe91e;</i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <app-loader-inline *ngIf=\"loader\"></app-loader-inline>\r\n</div>\r\n", styles: ["@import\"https://cdn.v-comply.com/design-system/css/icons/icons.css\";@import\"https://cdn.v-comply.com/design-system/css/display/display.css\";@import\"https://cdn.v-comply.com/design-system/css/alignment/alignment.css\";@import\"https://cdn.v-comply.com/design-system/css/text/text.css\";@import\"https://cdn.v-comply.com/design-system/css/color/color.css\";@import\"https://cdn.v-comply.com/design-system/css/width/width.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-top.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-bottom.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-left.css\";@import\"https://cdn.v-comply.com/design-system/css/margin/margin-right.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-top.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-bottom.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-left.css\";@import\"https://cdn.v-comply.com/design-system/css/padding/padding-right.css\";::ng-deep .link-policy{position:fixed;inset:0 500px 0 0}::ng-deep .link-policy.animate{animation:animate-right .2s cubic-bezier(.25,.46,.45,.94) both;z-index:-1}::ng-deep .link-policy-head{background:#f8f8f8;border-radius:.125rem .125rem 0 0;border-bottom:1px solid #F1F1F1;height:2.75rem}::ng-deep .link-policy-head button.back-btn{background:transparent;border-radius:0;border:none}::ng-deep .link-policy-search{position:relative}::ng-deep .link-policy-search input{height:2.75rem;line-height:1.5rem;padding:.75rem .75rem .75rem 2.5rem;outline:none;border:1px solid #7475763f;border-radius:.25rem;width:100%;font-size:14px;color:#747576}::ng-deep .link-policy-search input::placeholder{color:#747576;opacity:1}::ng-deep .link-policy-search i{position:absolute;left:1rem;top:1rem;pointer-events:none;color:#f1f1f1}::ng-deep .link-policy-table{overflow:hidden;overflow-y:auto;height:calc(100vh - 14rem)}::ng-deep .link-policy-table::-webkit-scrollbar-track{background-color:transparent}::ng-deep .link-policy-table .table-header{background:#fff;position:sticky;top:0;z-index:1}::ng-deep .link-policy-table .table-header .table-row{border:none!important;border-radius:0!important}::ng-deep .link-policy-table .table-header .table-row .table-column{line-height:1rem!important;min-height:1.5rem!important}::ng-deep .link-policy-table .table-row{border:1px solid #F1F1F1;border-radius:.25rem;display:flex;justify-content:space-between;position:relative;margin-bottom:.25rem}::ng-deep .link-policy-table .table-row:hover .table-column.serial app-cs-checkbox,::ng-deep .link-policy-table .table-row.active .table-column.serial app-cs-checkbox{opacity:1}::ng-deep .link-policy-table .table-row .table-column{min-height:2.5rem;position:relative;width:100%}::ng-deep .link-policy-table .table-row .table-column.serial{width:2rem;max-width:2rem;justify-content:center}::ng-deep .link-policy-table .table-row .table-column.serial .sr-no{width:1.25rem;background:#f8f8f8;writing-mode:vertical-lr;color:#747576;font-size:.625rem;font-weight:500;display:flex;height:2.5rem;align-items:center;justify-content:center;position:relative;transition:all .2s ease-in-out}::ng-deep .link-policy-table .table-row .table-column.serial app-cs-checkbox{background:#fff;border-radius:.125rem;position:absolute;top:.75rem;left:.5rem;width:1rem;height:1rem;opacity:0;transition:all .2s ease-in-out}::ng-deep .link-policy-table .table-row .table-column.serial app-cs-checkbox .checkbox-item .checkbox,::ng-deep .link-policy-table .table-row .table-column.serial app-cs-checkbox .checkbox-item .checkmark{position:absolute;top:0}::ng-deep .link-policy-table .table-row .table-column.policies{width:calc(100% - 28rem);min-width:calc(100% - 28rem)}::ng-deep .link-policy-table .table-row .table-column.policies .value{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;width:calc(100% - 5rem)}::ng-deep .link-policy-table .table-row .table-column.categories{width:26rem;min-width:26rem}::ng-deep .link-policy-table .table-row .table-column.categories .value{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;max-width:calc(100% - 1rem)}::ng-deep .link-policy-table .table-row .table-column.categories button.count{background:#1e5dd3;border:none;border-radius:.125rem;height:1.5rem}::ng-deep .link-policy-table .table-row .table-column.category-name{width:calc(100% - 2rem);min-width:calc(100% - 2rem)}::ng-deep .link-policy-table .table-row .table-column.category-name .value{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;width:calc(100% - 5rem)}::ng-deep .link-policy-floating-bar{background:#fff;border-radius:.25rem;box-shadow:0 2px 12px #4681ef40}::ng-deep .link-policy-floating-bar-left .counter{background:#34aa44;border-radius:.125rem;min-width:1.75rem}::ng-deep .link-policy-floating-bar-left .chip{background:#fff;border-radius:.125rem;box-shadow:0 2px 4px #1e5dd31a;height:1.5rem;display:block;max-width:13rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}::ng-deep .link-policy-floating-bar-left .chip i{position:relative;top:.0625rem;cursor:pointer}::ng-deep .link-policy-floating-bar-left button.count{background:#34aa44;border:none;border-radius:.125rem;height:1.5rem}::ng-deep .link-policy-floating-bar-right button{background:transparent;border:none;border-radius:.125rem;padding:0 .5rem;height:1.5rem}::ng-deep .link-policy-floating-bar-right button.next-btn{background:#1e5dd3}::ng-deep .link-policy-floating-bar-right button.next-btn.disabled{background:#f1f1f1!important;color:#747576!important;pointer-events:none!important}::ng-deep app-popover .wf-action-list ul.action-item li .avatar-card .cross-btn{cursor:pointer}.wf-action-list .action-item li .count-value{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}@keyframes animate-right{0%{transform:translate(100%)}to{transform:translate(0)}}.column-body{position:relative;left:10px}.clickable{cursor:pointer}\n"] }]
160
+ }], ctorParameters: function () { return [{ type: i1.PolicyService }]; }, propDecorators: { closeLinkPolicyList: [{
161
+ type: Output
162
+ }], selectedList: [{
163
+ type: Output
164
+ }], selectedPolicies: [{
165
+ type: Input
166
+ }] } });
167
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluay1yZWxhdGVkLXBvbGljaWVzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Z4LXdvcmtmbG93LWVuZ2luZS9zcmMvbGliL2xpbmstcmVsYXRlZC1wb2xpY2llcy9saW5rLXJlbGF0ZWQtcG9saWNpZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdngtd29ya2Zsb3ctZW5naW5lL3NyYy9saWIvbGluay1yZWxhdGVkLXBvbGljaWVzL2xpbmstcmVsYXRlZC1wb2xpY2llcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFVLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN2RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNENBQTRDLENBQUM7Ozs7Ozs7Ozs7O0FBV3RFLE1BQU0sT0FBTyw0QkFBNEI7SUF5QnZDLFlBQW9CLGFBQTRCO1FBQTVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBeEJoRCxjQUFTLEdBQVEsU0FBUyxDQUFDO1FBQzNCLFVBQUssR0FBUSxLQUFLLENBQUM7UUFDbkIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixnQkFBVyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDNUIsaUJBQVksR0FBbUIsTUFBTSxDQUFDO1FBQ3RDLHVCQUFrQixHQUFlLEVBQUUsQ0FBQztRQUNwQyx1QkFBa0IsR0FBZSxFQUFFLENBQUM7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QyxDQUFDO1lBQy9DLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ2xEO2FBQU07WUFDTCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FDdEQsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsV0FBVyxDQUNoQyxDQUFDO1lBQ0YsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQ3RELENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FDdEMsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztZQUNyQixrQkFBa0IsRUFBRSxJQUFJLENBQUMsa0JBQWtCO1NBQzVDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxVQUFVLENBQUMsS0FBVTtRQUNuQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FDdEQsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxLQUFLLENBQ3pCLENBQUM7UUFDRixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdkIsQ0FBQzsrR0FqS1UsNEJBQTRCO21HQUE1Qiw0QkFBNEIsME1DakJ6QywwalVBdVBBOzs0RkR0T2EsNEJBQTRCO2tCQUx4QyxTQUFTOytCQUNFLDJCQUEyQjtvR0F5QjNCLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNFLGdCQUFnQjtzQkFBeEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIE9uSW5pdCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUG9saWN5U2VydmljZSB9IGZyb20gJy4uL3dvcmtmbG93LXNlcnZpY2VzL3BvbGljeS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENPTlNUQU5UUyB9IGZyb20gJy4vY29uc3RhbnRzJztcclxuaW1wb3J0IHsgTElOS1MgfSBmcm9tICcuLi93b3JrZmxvdy9zaGFyZWQvY29uc3RhbnRzL2Nkbi1saW5rLmNvbnN0YW50JztcclxuaW1wb3J0IHsgQVBJX1VSTFMgfSBmcm9tICcuLi93b3JrZmxvdy1lbmdpbmUtY29udGFpbmVyL2FwaS1jb25zdGFudHMnO1xyXG5pbXBvcnQge1xyXG4gIHBvbGljeUxpc3QsXHJcbiAgc2VhcmNoVGV4dCxcclxufSBmcm9tICcuLi9zaGFyZWRDb21wb25lbnRzL2ZyYW1ld29yay1saXN0L2ZyYW1ld29yay1pbnRlZ3JhdGlvbi1pbnRlcmZhY2VzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWxpbmstcmVsYXRlZC1wb2xpY2llcycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2xpbmstcmVsYXRlZC1wb2xpY2llcy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbGluay1yZWxhdGVkLXBvbGljaWVzLmNvbXBvbmVudC5sZXNzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBMaW5rUmVsYXRlZFBvbGljaWVzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBDT05TVEFOVFM6IGFueSA9IENPTlNUQU5UUztcclxuICBMSU5LUzogYW55ID0gTElOS1M7XHJcbiAgYW5pbWF0aW9uID0gZmFsc2U7XHJcbiAgdW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdCgpO1xyXG4gIHBvbGljeVNvcnRCeTogJ2Rlc2MnIHwgJ2FzYycgPSAnZGVzYyc7XHJcbiAgc2VsZWN0ZWRDb250cm9sSWRzOiBBcnJheTxhbnk+ID0gW107XHJcbiAgc2VsZWN0ZWRQb2xpY3lMaXN0OiBBcnJheTxhbnk+ID0gW107XHJcbiAgc2VhcmNoVGV4dDogc2VhcmNoVGV4dCA9IHtcclxuICAgIHBvbGljeTogJycsXHJcbiAgfTtcclxuICBsb2FkZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICByZWNlbnRQYWdlOiBudW1iZXIgPSBDT05TVEFOVFMuREVGQVVMVF9QQUdFX05VTUJFUjtcclxuICBwb2xpY2llc0xpc3Q6IHBvbGljeUxpc3QgPSB7XHJcbiAgICBmcm9tOiAxLFxyXG4gICAgdG86IDAsXHJcbiAgICBjdXJyZW50UGFnZTogMSxcclxuICAgIHRvdGFsUGFnZTogMCxcclxuICAgIHRvdGFsUmVjb3JkczogMCxcclxuICAgIGRhdGE6IFtdLFxyXG4gIH07XHJcbiAgQE91dHB1dCgpIGNsb3NlTGlua1BvbGljeUxpc3QgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkTGlzdCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBASW5wdXQoKSBzZWxlY3RlZFBvbGljaWVzOiBBcnJheTxhbnk+ID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcG9saWN5U2VydmljZTogUG9saWN5U2VydmljZSkge1xyXG4gICAgdGhpcy5yZWNlbnRQYWdlID0gQ09OU1RBTlRTLkRFRkFVTFRfUEFHRV9OVU1CRVI7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuYW5pbWF0aW9uID0gdHJ1ZTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmFuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgfSwgMzAwKTtcclxuICAgIHRoaXMuZ2V0UG9saWNpZXMoKTtcclxuICB9XHJcblxyXG4gIGdvQmFjaygpIHtcclxuICAgIHRoaXMuY2xvc2VMaW5rUG9saWN5TGlzdC5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RlZEl0ZW1zKCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbnRyb2xJZHMgPSB0aGlzLnBvbGljeVNlcnZpY2U/LmxpbmtSZWxhdGVQb2xpY2llc1tcclxuICAgICAgdGhpcy5yZWNlbnRQYWdlIC0gMVxyXG4gICAgXT8uZGF0YVxyXG4gICAgICAuZmlsdGVyKChlbGVtZW50OiBhbnkpID0+XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFBvbGljeUxpc3Q/LmluY2x1ZGVzKGVsZW1lbnQuY29udHJhY3RfbmFtZSlcclxuICAgICAgKVxyXG4gICAgICAubWFwKChlbGVtZW50OiBhbnkpID0+IGVsZW1lbnQuY29udHJhY3RfaWQpO1xyXG4gIH1cclxuXHJcbiAgc2VhcmNoQnkoZXZlbnQ6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuc2VhcmNoVGV4dC5wb2xpY3kgIT0gZXZlbnQpIHtcclxuICAgICAgdGhpcy5zZWFyY2hUZXh0LnBvbGljeSA9IGV2ZW50O1xyXG4gICAgICB0aGlzLmdldFBvbGljaWVzKHsgc2VhcmNoOiB0cnVlIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKCFldmVudCkge1xyXG4gICAgICB0aGlzLnJlY2VudFBhZ2UgPSBDT05TVEFOVFMuREVGQVVMVF9QQUdFX05VTUJFUjtcclxuICAgICAgdGhpcy5nZXRQb2xpY2llcyh7IHNlYXJjaDogZmFsc2UgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VQYWdlKGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMucmVjZW50UGFnZSA9IGV2ZW50O1xyXG4gICAgaWYgKHRoaXMucG9saWN5U2VydmljZS5saW5rUmVsYXRlUG9saWNpZXNbZXZlbnQgLSAxXSkge1xyXG4gICAgICB0aGlzLnBvbGljaWVzTGlzdCA9IHRoaXMucG9saWN5U2VydmljZS5saW5rUmVsYXRlUG9saWNpZXNbZXZlbnQgLSAxXTtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuZ2V0UG9saWNpZXMoKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdGVkUGFyYW0oZGF0YT86IGFueSkge1xyXG4gICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKCdwYWdpbmF0aW9uVHlwZScsICdzbWFsbCcpO1xyXG4gICAgaWYgKGRhdGE/LnNlYXJjaCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKCdzZWFyY2hUZXh0JywgdGhpcy5zZWFyY2hUZXh0LnBvbGljeSk7XHJcbiAgICB9XHJcbiAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKCdwYWdlTm8nLCB0aGlzLnJlY2VudFBhZ2UpO1xyXG4gICAgaWYgKGRhdGE/LnNvcnQpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZCgnc29ydEJ5JywgdGhpcy5wb2xpY3lTb3J0QnkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBhcmFtcztcclxuICB9XHJcblxyXG4gIGdldFBhZ2VQb2xpY3lMaXN0KHJlczogYW55KSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBmcm9tOiByZXM/LmZyb20gPz8gMSxcclxuICAgICAgdG86IHJlcz8udG8gPz8gMCxcclxuICAgICAgY3VycmVudFBhZ2U6IHRoaXMucmVjZW50UGFnZSxcclxuICAgICAgdG90YWxQYWdlOiByZXM/LnRvdGFsX3BhZ2VzID8/IDAsXHJcbiAgICAgIHRvdGFsUmVjb3JkczogcmVzPy5hbGxfcmVjb3JkcyA/PyAwLFxyXG4gICAgICBkYXRhOiBbLi4ubmV3IFNldChyZXM/LmRhdGEpXSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBnZXRQb2xpY2llcyhkYXRhPzogYW55KSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMucG9saWN5U2VydmljZS5saW5rUmVsYXRlUG9saWNpZXNbdGhpcy5yZWNlbnRQYWdlIC0gMV0gJiZcclxuICAgICAgIWRhdGE/LnNlYXJjaFxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMucG9saWNpZXNMaXN0ID1cclxuICAgICAgICB0aGlzLnBvbGljeVNlcnZpY2UubGlua1JlbGF0ZVBvbGljaWVzW3RoaXMucmVjZW50UGFnZSAtIDFdO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkUG9saWN5TGlzdCA9IFsuLi5uZXcgU2V0KHRoaXMuc2VsZWN0ZWRQb2xpY2llcyldO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXMoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbGV0IHBhcmFtcyA9IHRoaXMuc2VsZWN0ZWRQYXJhbShkYXRhKTtcclxuICAgIHRoaXMubG9hZGVyID0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCByZXF1ZXN0ID0ge1xyXG4gICAgICBtZXRob2Q6ICdnZXQnLFxyXG4gICAgICBhY3Rpb246ICcvcG9saWN5JyxcclxuICAgICAgbW9kZTogQVBJX1VSTFMuZmV0Y2hQb2xpY3lMaXN0LFxyXG4gICAgICBwYXJhbXMsXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMucG9saWN5U2VydmljZVxyXG4gICAgICAuZ2V0UG9saWN5TGlzdChyZXF1ZXN0KVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sb2FkZXIgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMucG9saWNpZXNMaXN0ID0gdGhpcy5nZXRQYWdlUG9saWN5TGlzdChyZXMpO1xyXG5cclxuICAgICAgICAgIGlmICghdGhpcy5wb2xpY3lTZXJ2aWNlLmxpbmtSZWxhdGVQb2xpY2llc1t0aGlzLnJlY2VudFBhZ2UgLSAxXSkge1xyXG4gICAgICAgICAgICB0aGlzLnBvbGljeVNlcnZpY2UubGlua1JlbGF0ZVBvbGljaWVzW3RoaXMucmVjZW50UGFnZSAtIDFdID1cclxuICAgICAgICAgICAgICBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMucG9saWNpZXNMaXN0KSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxvYWRlciA9IGZhbHNlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0UG9saWN5KGV2ZW50OiBhbnksIGRhdGE6IGFueSkge1xyXG4gICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb250cm9sSWRzLnB1c2goZGF0YS5jb250cmFjdF9pZCk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRQb2xpY3lMaXN0LnB1c2goZGF0YS5jb250cmFjdF9uYW1lKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb250cm9sSWRzID0gdGhpcy5zZWxlY3RlZENvbnRyb2xJZHMuZmlsdGVyKFxyXG4gICAgICAgIChpZCkgPT4gaWQgIT09IGRhdGEuY29udHJhY3RfaWRcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZFBvbGljeUxpc3QgPSB0aGlzLnNlbGVjdGVkUG9saWN5TGlzdC5maWx0ZXIoXHJcbiAgICAgICAgKG5hbWUpID0+IG5hbWUgIT09IGRhdGEuY29udHJhY3RfbmFtZVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2F2ZUNoYW5nZXMoKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkTGlzdC5lbWl0KHtcclxuICAgICAgc2VsZWN0ZWRQb2xpY3lMaXN0OiB0aGlzLnNlbGVjdGVkUG9saWN5TGlzdCxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlSXRlbShldmVudDogYW55KSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkUG9saWN5TGlzdCA9IHRoaXMuc2VsZWN0ZWRQb2xpY3lMaXN0LmZpbHRlcihcclxuICAgICAgKG5hbWUpID0+IG5hbWUgIT09IGV2ZW50XHJcbiAgICApO1xyXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zKCk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJsaW5rLXBvbGljeVwiIFtjbGFzcy5hbmltYXRlXT1cImFuaW1hdGlvblwiPlxyXG4gIDxuZy1jb250YWluZXI+XHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwibGluay1wb2xpY3ktaGVhZCB2eC1kLWZsZXggdngtYWxpZ24tY2VudGVyIHZ4LWp1c3RpZnktYmV0d2VlbiB2eC1wbC00IHZ4LXByLTRcIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicGFnZS10aXRsZSB2eC1mcy0xNCB2eC1mdy01MDAgdngtbGFiZWwtdHh0XCI+XHJcbiAgICAgICAgU2VsZWN0IFBvbGljaWVzIHRvIGxpbmsgd2l0aFxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIChjbGljayk9XCJnb0JhY2soKVwiXHJcbiAgICAgICAgY2xhc3M9XCJiYWNrLWJ0biB2eC1mcy0xNCB2eC1mdy01MDAgdngtbGFiZWwtdHh0IHZ4LXR0LXVwcGVyY2FzZSB2eC1wLTAgdngtbS0wIHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXJcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJpY29ucyB2eC1tci0xXCI+JiN4ZTkxZDs8L2k+IEJBQ0tcclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJsaW5rLXBvbGljeS1ib2R5IHZ4LXAtNCB2eC1wYi0zXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJsaW5rLXBvbGljeS1zZWFyY2ggdngtbWItMlwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwiaWNvbnMgdngtZnMtMTJcIj4mI3hlOTBiOzwvaT5cclxuICAgICAgICA8aW5wdXRcclxuICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIFBvbGljaWVzXCJcclxuICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJzZWFyY2hCeSgkZXZlbnQudGFyZ2V0LnZhbHVlKVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDx2dWktcGFnaW5hdGlvblxyXG4gICAgICAgICpuZ0lmPVwiIWxvYWRlciAmJiBwb2xpY2llc0xpc3QudG90YWxQYWdlID4gQ09OU1RBTlRTLkRFRkFVTFRfUEFHRV9OVU1CRVJcIlxyXG4gICAgICAgIFtmcm9tXT1cInBvbGljaWVzTGlzdC5mcm9tXCJcclxuICAgICAgICBbdG9dPVwicG9saWNpZXNMaXN0LnRvXCJcclxuICAgICAgICBbdG90YWxdPVwicG9saWNpZXNMaXN0LnRvdGFsUmVjb3Jkc1wiXHJcbiAgICAgICAgW3Nob3dQYWdlRGV0YWlsXT1cInRydWVcIlxyXG4gICAgICAgIFt0b3RhbFBhZ2VdPVwicG9saWNpZXNMaXN0LnRvdGFsUGFnZVwiXHJcbiAgICAgICAgW2N1cnJlbnRQYWdlXT1cInBvbGljaWVzTGlzdC5jdXJyZW50UGFnZVwiXHJcbiAgICAgICAgW3BhZ2VJblNpbmdsZVZpZXddPVwiQ09OU1RBTlRTLlBBR0VfSU5fU0lOR0xFX1ZJRVdcIlxyXG4gICAgICAgIChwYWdlQ2hhbmdlZCk9XCJjaGFuZ2VQYWdlKCRldmVudClcIlxyXG4gICAgICA+XHJcbiAgICAgIDwvdnVpLXBhZ2luYXRpb24+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cImxpbmstcG9saWN5LXRhYmxlXCJcclxuICAgICAgICBbY2xhc3Mud2l0aC1wYWdpbmF0aW9uXT1cIiFsb2FkZXIgJiYgcG9saWNpZXNMaXN0LnRvdGFsUGFnZSA+IDFcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkZXIgJiYgcG9saWNpZXNMaXN0LmRhdGE/Lmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1oZWFkZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJvd1wiPlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidGFibGUtY29sdW1uIHZ4LWZzLTEwIHZ4LWZ3LTUwMCB2eC1sYWJlbC10eHQgdngtbGgtNSB2eC10dC11cHBlcmNhc2UgdngtcGwtMSB2eC1wci0xIHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXIgc2VyaWFsXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAjXHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gdngtZnMtMTAgdngtZnctNTAwIHZ4LWxhYmVsLXR4dCB2eC1saC01IHZ4LXR0LXVwcGVyY2FzZSB2eC1wbC0xIHZ4LXByLTEgdngtZC1mbGV4IHZ4LWFsaWduLWNlbnRlciBwb2xpY2llc1wiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgUE9MSUNJRVNcclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInRhYmxlLWNvbHVtbiB2eC1mcy0xMCB2eC1mdy01MDAgdngtbGFiZWwtdHh0IHZ4LWxoLTUgdngtdHQtdXBwZXJjYXNlIHZ4LXBsLTEgdngtcHItMSB2eC1kLWZsZXggdngtYWxpZ24tY2VudGVyIGNhdGVnb3JpZXNcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIENBVEVHT1JJRVNcclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1ib2R5XCI+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICBjbGFzcz1cInRhYmxlLXJvd1wiXHJcbiAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJzZWxlY3RlZENvbnRyb2xJZHM/LmluY2x1ZGVzKHBvbGljeS5jb250cmFjdF9pZClcIlxyXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBwb2xpY3kgb2YgcG9saWNpZXNMaXN0LmRhdGE7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gdngtcGwtMSB2eC1wci0xIHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXIgc2VyaWFsXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3Itbm9cIlxyXG4gICAgICAgICAgICAgICAgICBbYXBwVG9vbHRpcF09XCJpICsgcG9saWNpZXNMaXN0LmZyb21cIlxyXG4gICAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b21cIlxyXG4gICAgICAgICAgICAgICAgICBkZWxheT1cIjBcIlxyXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYmxhY2tcIlxyXG4gICAgICAgICAgICAgICAgICBbdG9vbHRpcE1hbmRhdG9yeV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAge3sgaSArIHBvbGljaWVzTGlzdC5mcm9tIH19XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxhcHAtY3MtY2hlY2tib3hcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGVjay1ib3hcIlxyXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwicG9saWN5Py5jb250cmFjdF9pZFwiXHJcbiAgICAgICAgICAgICAgICAgIFtuZ1ZhbHVlXT1cInNlbGVjdGVkQ29udHJvbElkcz8uaW5jbHVkZXMocG9saWN5Py5jb250cmFjdF9pZClcIlxyXG4gICAgICAgICAgICAgICAgICAobmdWYWx1ZUNoYW5nZSk9XCJzZWxlY3RQb2xpY3koJGV2ZW50LCBwb2xpY3kpXCJcclxuICAgICAgICAgICAgICAgID48L2FwcC1jcy1jaGVja2JveD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInRhYmxlLWNvbHVtbiB2eC1wbC0xIHZ4LXByLTEgdngtZC1mbGV4IHZ4LWFsaWduLWNlbnRlciBwb2xpY2llcyBjb2x1bW4tYm9keSBjbGlja2FibGVcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ2YWx1ZSB2eC1mcy0xMiB2eC1sYWJlbC10eHRcIlxyXG4gICAgICAgICAgICAgICAgICBbYXBwVG9vbHRpcF09XCJwb2xpY3k/LmNvbnRyYWN0X25hbWVcIlxyXG4gICAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b20tbGVmdFwiXHJcbiAgICAgICAgICAgICAgICAgIGRlbGF5PVwiMFwiXHJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJibGFja1wiXHJcbiAgICAgICAgICAgICAgICAgIFt0b29sdGlwTWFuZGF0b3J5XT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdFBvbGljeShcclxuICAgICAgICAgICAgICAgICAgICAgICFzZWxlY3RlZENvbnRyb2xJZHM/LmluY2x1ZGVzKHBvbGljeT8uY29udHJhY3RfaWQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcG9saWN5XHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICB7e1xyXG4gICAgICAgICAgICAgICAgICAgIHBvbGljeT8uY29udHJvbF9pZFxyXG4gICAgICAgICAgICAgICAgICAgICAgPyBcIltQT0xJRCAtIFwiICsgcG9saWN5LmNvbnRyb2xfaWQgKyBcIl0gXCJcclxuICAgICAgICAgICAgICAgICAgICAgIDogXCJcIlxyXG4gICAgICAgICAgICAgICAgICB9fXt7IHBvbGljeT8uY29udHJhY3RfbmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gdngtcGwtMSB2eC1wci0xIHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXIgY2F0ZWdvcmllc1wiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBvbGljeT8uY2hpbGRDYXQ/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ2YWx1ZSB2eC1mcy0xMiB2eC1sYWJlbC10eHRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthcHBUb29sdGlwXT1cInBvbGljeT8uY2hpbGRDYXRbMF0/LmNhdGVnb3J5X25hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbS1sZWZ0XCJcclxuICAgICAgICAgICAgICAgICAgICBkZWxheT1cIjBcIlxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJibGFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBNYW5kYXRvcnldPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgcG9saWN5Py5jaGlsZENhdFswXT8uY2F0ZWdvcnlfbmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBvbGljeT8uY2hpbGRDYXQ/Lmxlbmd0aCA+IDFcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY291bnQgdngtZnMtMTIgdngtZnctNTAwIHZ4LXR4dC13aGl0ZSB2eC1wLTAgdngtcGwtMSB2eC1wci0xIHZ4LW0tMCB2eC1tbC0xIHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXIgdngtanVzdGlmeS1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIGFwcFBvcG92ZXJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2F0ZWdvcnkucG9wb3ZlcigpXCJcclxuICAgICAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJ0b3BcIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgK3t7IHBvbGljeT8uY2hpbGRDYXQ/LnNsaWNlKDEpPy5sZW5ndGggfX1cclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDxhcHAtcG9wb3ZlciAjY2F0ZWdvcnkgW2RvbnRDbG9zZW9uQ2xpY2tdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3Zi1hY3Rpb24tbGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiYWN0aW9uLWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGRDYXRlZ29yeSBvZiBwb2xpY3k/LmNoaWxkQ2F0Py5zbGljZSgxKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXZhdGFyLWNhcmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmFsdWVcIj57e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZENhdGVnb3J5Py5jYXRlZ29yeV9uYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvYXBwLXBvcG92ZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPGFwcC1uby1kYXRhXHJcbiAgICAgICAgICAqbmdJZj1cIiFsb2FkZXIgJiYgcG9saWNpZXNMaXN0Py5kYXRhPy5sZW5ndGggPT09IDBcIlxyXG4gICAgICAgICAgW25vRGF0YUltYWdlXT1cIlxyXG4gICAgICAgICAgICBMSU5LUy5saW5rUG9saWN5Tm9EYXRhSW1hZ2VcclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgICBbbm9EYXRhVGV4dF09XCJDT05TVEFOVFMuTk9fREFUQV9JTUFHRV9URVhUXCJcclxuICAgICAgICA+PC9hcHAtbm8tZGF0YT5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJsaW5rLXBvbGljeS1mbG9hdGluZy1iYXIgdngtZC1mbGV4IHZ4LWFsaWduLWNlbnRlciB2eC1qdXN0aWZ5LWJldHdlZW4gdngtcC0zIHZ4LW10LTFcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxpbmstcG9saWN5LWZsb2F0aW5nLWJhci1sZWZ0IHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RlZFwiICpuZ0lmPVwic2VsZWN0ZWRQb2xpY3lMaXN0Py5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICBjbGFzcz1cImNoaXBDb250YWluZXIgdngtZC1mbGV4IHZ4LWFsaWduLWNlbnRlciB2eC1wbC0yIHZ4LXByLTJcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHBvbGljeU5hbWUgb2Ygc2VsZWN0ZWRQb2xpY3lMaXN0Py5zbGljZSgwLCAxKVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZUl0ZW0ocG9saWN5TmFtZSlcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImljb25zIGNyb3NzIHZ4LWZzLTEwIHZ4LXBhcmFncmFwaC10eHQgdngtbXItMVwiXHJcbiAgICAgICAgICAgICAgICAgID4mI3hlOWFlOzwvaVxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGlwTmFtZSB2eC1mcy0xMSB2eC1sYWJlbC10eHRcIlxyXG4gICAgICAgICAgICAgICAgICBbYXBwVG9vbHRpcF09XCJwb2xpY3lOYW1lXCJcclxuICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tLWxlZnRcIlxyXG4gICAgICAgICAgICAgICAgICBkZWxheT1cIjBcIlxyXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYmxhY2tcIlxyXG4gICAgICAgICAgICAgICAgICBbdG9vbHRpcE1hbmRhdG9yeV09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgID57eyBwb2xpY3lOYW1lIH19PC9zcGFuXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjb3VudEJ0biB2eC1mcy05IHZ4LWZ3LTUwMCB2eC10eHQtd2hpdGUgdngtZC1mbGV4IHZ4LWFsaWduLWNlbnRlciB2eC1qdXN0aWZ5LWNlbnRlciB2eC1saC00XCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRQb2xpY3lMaXN0Lmxlbmd0aCA+IDFcIlxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBhcHBQb3BvdmVyXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVsYXRlZFBvbGljeS5wb3BvdmVyKClcIlxyXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50PVwibGVmdFwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgK3t7IHNlbGVjdGVkUG9saWN5TGlzdD8uc2xpY2UoMSkubGVuZ3RoIH19XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGFwcC1wb3BvdmVyICNyZWxhdGVkUG9saWN5IFtkb250Q2xvc2VvbkNsaWNrXT1cInRydWVcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3Zi1hY3Rpb24tbGlzdFwiPlxyXG4gICAgICAgICAgICA8dWwgY2xhc3M9XCJhY3Rpb24taXRlbVwiPlxyXG4gICAgICAgICAgICAgIDxsaVxyXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwiXHJcbiAgICAgICAgICAgICAgICAgIGxldCBwb2xpY3lOYW1lIG9mIHNlbGVjdGVkUG9saWN5TGlzdCB8IHNsaWNlIDogMTtcclxuICAgICAgICAgICAgICAgICAgbGV0IGogPSBpbmRleFxyXG4gICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXZhdGFyLWNhcmRcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiaWNvbnNcIiAoY2xpY2spPVwiZGVsZXRlSXRlbShwb2xpY3lOYW1lKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+JiN4ZTkwZDs8L2lcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgcG9saWN5TmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9hcHAtcG9wb3Zlcj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibGluay1wb2xpY3ktZmxvYXRpbmctYmFyLXJpZ2h0IHZ4LWQtZmxleCB2eC1hbGlnbi1jZW50ZXJcIj5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgKGNsaWNrKT1cImdvQmFjaygpXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJjYW5jZWwtYnRuIHZ4LWZzLTExIHZ4LWZ3LTUwMCB2eC10dC11cHBlcmNhc2UgdngtZC1mbGV4IHZ4LWFsaWduLWNlbnRlciB2eC1qdXN0aWZ5LWNlbnRlciB2eC10eHQtcmVkXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgQ0FOQ0VMXHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgKGNsaWNrKT1cInNhdmVDaGFuZ2VzKClcIlxyXG4gICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwic2VsZWN0ZWRQb2xpY3lMaXN0Lmxlbmd0aCA9PT0gMFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwibmV4dC1idG4gdngtZnMtMTEgdngtZnctNTAwIHZ4LXR0LXVwcGVyY2FzZSB2eC1kLWZsZXggdngtYWxpZ24tY2VudGVyIHZ4LWp1c3RpZnktY2VudGVyIHZ4LXR4dC13aGl0ZVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIE5FWFQgPGkgY2xhc3M9XCJpY29ucyB2eC1tbC0yXCI+JiN4ZTkxZTs8L2k+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgPGFwcC1sb2FkZXItaW5saW5lICpuZ0lmPVwibG9hZGVyXCI+PC9hcHAtbG9hZGVyLWlubGluZT5cclxuPC9kaXY+XHJcbiJdfQ==