dotnetreport-ng 6.2.1 → 6.2.2-beta
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/dotnetreport-ng-6.2.2-beta.tgz +0 -0
- package/fesm2022/dotnetreport-ng.mjs +170 -209
- package/fesm2022/dotnetreport-ng.mjs.map +1 -1
- package/index.d.ts +68 -5
- package/package.json +4 -6
- package/dotnetreport-ng-6.2.1.tgz +0 -0
- package/esm2022/dotnetreport-ng.mjs +0 -5
- package/esm2022/lib/dotnetdashboard/dotnetdashboard.component.mjs +0 -3246
- package/esm2022/lib/dotnetreport/dotnetreport.component.mjs +0 -3202
- package/esm2022/lib/dotnetreport-lib.di.mjs +0 -3
- package/esm2022/lib/dotnetreport-lib.module.mjs +0 -46
- package/esm2022/lib/dotnetreport-lib.service.mjs +0 -15
- package/esm2022/lib/dotnetsetup/dotnetsetup.component.mjs +0 -3192
- package/esm2022/public-api.mjs +0 -9
- package/lib/dotnetdashboard/dotnetdashboard.component.d.ts +0 -24
- package/lib/dotnetreport/dotnetreport.component.d.ts +0 -23
- package/lib/dotnetreport-lib.di.d.ts +0 -2
- package/lib/dotnetreport-lib.module.d.ts +0 -12
- package/lib/dotnetreport-lib.service.d.ts +0 -6
- package/lib/dotnetsetup/dotnetsetup.component.d.ts +0 -22
- package/public-api.d.ts +0 -5
|
@@ -1,3202 +0,0 @@
|
|
|
1
|
-
import { Component, Inject } from '@angular/core';
|
|
2
|
-
import { BASE_URL_TOKEN } from './../dotnetreport-lib.di';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "@angular/platform-browser";
|
|
5
|
-
import * as i2 from "@angular/common/http";
|
|
6
|
-
import * as i3 from "@angular/router";
|
|
7
|
-
export class DotnetreportComponent {
|
|
8
|
-
sanitizer;
|
|
9
|
-
cdref;
|
|
10
|
-
baseUrl;
|
|
11
|
-
http;
|
|
12
|
-
route;
|
|
13
|
-
baseServiceUrl;
|
|
14
|
-
reportTemplates;
|
|
15
|
-
queryParams;
|
|
16
|
-
constructor(injector, sanitizer, cdref, baseUrl, http, route) {
|
|
17
|
-
this.sanitizer = sanitizer;
|
|
18
|
-
this.cdref = cdref;
|
|
19
|
-
this.baseUrl = baseUrl;
|
|
20
|
-
this.http = http;
|
|
21
|
-
this.route = route;
|
|
22
|
-
this.baseServiceUrl = this.baseUrl + '/api';
|
|
23
|
-
this.reportTemplates = "";
|
|
24
|
-
}
|
|
25
|
-
ngOnInit() {
|
|
26
|
-
let getUsersAndRolesUrl = this.baseServiceUrl + "/DotNetReportApi/GetUsersAndRoles";
|
|
27
|
-
getUsersAndRolesUrl = getUsersAndRolesUrl.replace(/[?&]$/, "");
|
|
28
|
-
this.queryParams = this.route.snapshot.queryParams;
|
|
29
|
-
this.http.get(getUsersAndRolesUrl).subscribe((response) => {
|
|
30
|
-
let result = response;
|
|
31
|
-
let vm = new reportViewModel({
|
|
32
|
-
runReportUrl: this.baseServiceUrl + '/DotNetReport/Report',
|
|
33
|
-
reportWizard: $("#modal-reportbuilder"),
|
|
34
|
-
execReportUrl: this.baseServiceUrl + '/DotNetReportApi/RunReport',
|
|
35
|
-
runLinkReportUrl: this.baseServiceUrl + '/DotNetReportApi/RunReportLink',
|
|
36
|
-
getSchemaFromSql: this.baseServiceUrl + '/DotNetReportApi/GetSchemaFromSql',
|
|
37
|
-
linkModal: $("#linkModal"),
|
|
38
|
-
reportHeader: "report-header",
|
|
39
|
-
fieldOptionsModal: $("#fieldOptionsModal"),
|
|
40
|
-
lookupListUrl: this.baseServiceUrl + '/DotNetReportApi/GetLookupList',
|
|
41
|
-
apiUrl: this.baseServiceUrl + '/DotNetReportApi/CallReportApi',
|
|
42
|
-
runReportApiUrl: this.baseServiceUrl + '/DotNetReportApi/RunReportApi',
|
|
43
|
-
getUsersAndRolesUrl: this.baseServiceUrl + '/DotNetReportApi/GetUsersAndRoles',
|
|
44
|
-
userSettings: result,
|
|
45
|
-
dataFilters: result.dataFilters,
|
|
46
|
-
runExportUrl: this.baseServiceUrl + '/DotNetReportApi/',
|
|
47
|
-
getTimeZonesUrl: this.baseServiceUrl + '/DotNetReportApi/GetAllTimezones',
|
|
48
|
-
printReportUrl: this.baseUrl + '/DotNetReport/ReportPrint',
|
|
49
|
-
samePageOnRun: true,
|
|
50
|
-
reportMode: this.queryParams["linkedreport"] == "true" ? "linked" : "",
|
|
51
|
-
reportId: this.queryParams["reportId"] || 0,
|
|
52
|
-
});
|
|
53
|
-
vm.printReport = function () {
|
|
54
|
-
var printWindow = window.open("");
|
|
55
|
-
printWindow?.document.open();
|
|
56
|
-
printWindow?.document.write('<html><head>' +
|
|
57
|
-
'<link href="/Content/bootstrap.css" rel="stylesheet" />' +
|
|
58
|
-
'<style type="text/css">a[href]:after {content: none !important;}</style>' +
|
|
59
|
-
'</head><body>' + $('.report-inner').html() +
|
|
60
|
-
'</body></html>');
|
|
61
|
-
setTimeout(function () {
|
|
62
|
-
printWindow?.print();
|
|
63
|
-
printWindow?.close();
|
|
64
|
-
}, 250);
|
|
65
|
-
};
|
|
66
|
-
vm.init(0, result.noAccount);
|
|
67
|
-
this.renderKOTemplates();
|
|
68
|
-
ko.applyBindings(vm, document.getElementById('dot-net-report'));
|
|
69
|
-
this.bindWindowResize(vm);
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
ngOnDestroy() {
|
|
73
|
-
ko.cleanNode(document.getElementById('dot-net-report'));
|
|
74
|
-
}
|
|
75
|
-
init() {
|
|
76
|
-
this.ngOnInit();
|
|
77
|
-
}
|
|
78
|
-
renderKOTemplates() {
|
|
79
|
-
this.reportTemplates = this.sanitizer.bypassSecurityTrustHtml(`<!-- Dotnet Report HTML Templates -->
|
|
80
|
-
<script type="text/html" id="report-filter">
|
|
81
|
-
<div class="form-group" data-bind="attr: {id: 'filter-'+uiId }">
|
|
82
|
-
<!-- ko if: !hasForeignKey-->
|
|
83
|
-
<!-- ko if: ['DateTime','Date','Time'].indexOf(fieldType) != -1 -->
|
|
84
|
-
<div style="display: flex; align-items: center; gap: 8px;">
|
|
85
|
-
<!-- ko if: ['=','>','<','>=','<=', 'not equal'].indexOf($parent.Operator()) != -1 -->
|
|
86
|
-
<input class="form-control" data-bind="datepicker: $parent.fmtValue, datepickerOptions: {value: $parent.Value, dateFormat: dateFormat() === 'Custom' ? customDateFormat().replace(/yyyy/g, 'yy') : $root.dateFormatMappings[dateFormat()]}" required />
|
|
87
|
-
<!-- ko if: fieldType=='Time' || fieldFormat()=='Time' || fieldFormat()=='Date and Time'-->
|
|
88
|
-
<input class="form-control" type="time" data-bind="value:$parent.Valuetime" required>
|
|
89
|
-
<!-- /ko -->
|
|
90
|
-
<!-- /ko -->
|
|
91
|
-
</div>
|
|
92
|
-
<!-- ko if: ['between'].indexOf($parent.Operator()) != -1 -->
|
|
93
|
-
From
|
|
94
|
-
<div style="display: flex; align-items: center; gap: 8px;">
|
|
95
|
-
<input required class="form-control from-date" data-bind="datepicker: $parent.fmtValue, datepickerOptions: {value: $parent.Value, dateFormat: dateFormat() === 'Custom' ? customDateFormat().replace(/yyyy/g, 'yy') : $root.dateFormatMappings[dateFormat()]}" />
|
|
96
|
-
<!-- ko if:fieldType=='Time' || fieldFormat()=='Time' || fieldFormat()=='Date and Time'-->
|
|
97
|
-
<input class="form-control" type="time" data-bind="value:$parent.Valuetime" required>
|
|
98
|
-
<!-- /ko -->
|
|
99
|
-
</div>
|
|
100
|
-
to
|
|
101
|
-
<div style="display: flex; align-items: center; gap: 8px;">
|
|
102
|
-
<input data-bind="datepicker: $parent.fmtValue2, datepickerOptions: {value: $parent.Value2, dateFormat: dateFormat() === 'Custom' ? customDateFormat().replace(/yyyy/g, 'yy') : $root.dateFormatMappings[dateFormat()]}" class="form-control to-date" required />
|
|
103
|
-
<!-- ko if:fieldType=='Time' || fieldFormat()=='Time' || fieldFormat()=='Date and Time'-->
|
|
104
|
-
<input class="form-control" type="time" data-bind="value:$parent.Valuetime2" required>
|
|
105
|
-
<!-- /ko -->
|
|
106
|
-
</div>
|
|
107
|
-
<!-- /ko -->
|
|
108
|
-
<!-- ko if: ['range'].indexOf($parent.Operator()) != -1 -->
|
|
109
|
-
<select data-bind="value: $parent.Value" class="form-select" required>
|
|
110
|
-
<option value=""></option>
|
|
111
|
-
<option>Today</option>
|
|
112
|
-
<option>Today +</option>
|
|
113
|
-
<option>Today -</option>
|
|
114
|
-
<option>Yesterday</option>
|
|
115
|
-
<option>This Week</option>
|
|
116
|
-
<option>Last Week</option>
|
|
117
|
-
<option>This Month</option>
|
|
118
|
-
<option>Last Month</option>
|
|
119
|
-
<option>This Year</option>
|
|
120
|
-
<option>Last Year</option>
|
|
121
|
-
<option>This Week To Date</option>
|
|
122
|
-
<option>This Month To Date</option>
|
|
123
|
-
<option>This Year To Date</option>
|
|
124
|
-
<option>Last 30 Days</option>
|
|
125
|
-
<!--<option>This Month Last Year</option>
|
|
126
|
-
<option>Last Month Last Year</option>
|
|
127
|
-
<option>This Quarter</option>
|
|
128
|
-
<option>Last Quarter</option>
|
|
129
|
-
<option>First Quarter</option>
|
|
130
|
-
<option>Second Quarter</option>
|
|
131
|
-
<option>Third Quarter</option>
|
|
132
|
-
<option>Fourth Quarter</option>
|
|
133
|
-
<option>Next 6 Months</option>
|
|
134
|
-
<option>Last 6 Months</option>
|
|
135
|
-
<option>2 Years ago</option>
|
|
136
|
-
<option>3 Years ago</option>
|
|
137
|
-
<option>4 Years ago</option>
|
|
138
|
-
<option>5 Years ago</option>-->
|
|
139
|
-
<optgroup label="Comparison Options">
|
|
140
|
-
<option>>= Today</option>
|
|
141
|
-
<option><= Today</option>
|
|
142
|
-
<option>>= Today +</option>
|
|
143
|
-
<option><= Today +</option>
|
|
144
|
-
<option>>= Today -</option>
|
|
145
|
-
<option><= Today -</option>
|
|
146
|
-
</optgroup>
|
|
147
|
-
</select>
|
|
148
|
-
<div data-bind="if: $parent.Value().indexOf('Today +') >= 0 || $parent.Value().indexOf('Today -') >= 0" class="form-group pull-left" style="padding-top: 5px;">
|
|
149
|
-
<input type="number" class="form-control input-sm pull-left" style="width: 80px;" data-bind="value: $parent.Value2" required /><span style="padding: 5px 5px;" class="pull-left"> days</span>
|
|
150
|
-
</div>
|
|
151
|
-
<!-- /ko -->
|
|
152
|
-
<!-- /ko -->
|
|
153
|
-
<!-- ko if: ['Int','Money','Float','Double'].indexOf(fieldType) != -1 -->
|
|
154
|
-
<!-- ko if: ['=','>','<','>=','<=', 'not equal'].indexOf($parent.Operator()) != -1 && ['is blank', 'is not blank', 'is null', 'is not null'].indexOf($parent.Operator()) == -1 -->
|
|
155
|
-
<input class="form-control" type="number" data-bind="value: $parent.Value, disable: $parent.Operator() == 'is default'" required />
|
|
156
|
-
<!-- /ko -->
|
|
157
|
-
<!-- ko if: ['in', 'not in'].indexOf($parent.Operator()) != -1 -->
|
|
158
|
-
<input class="form-control" type="text" data-bind="value: $parent.Value" required />
|
|
159
|
-
<!-- /ko -->
|
|
160
|
-
<!-- ko if: ['between'].indexOf($parent.Operator()) != -1 -->
|
|
161
|
-
From
|
|
162
|
-
<input class="form-control" type="number" data-bind="value: $parent.Value" required />
|
|
163
|
-
To
|
|
164
|
-
<input class="form-control" type="number" data-bind="value: $parent.Value2" required />
|
|
165
|
-
<!-- /ko -->
|
|
166
|
-
<!-- /ko -->
|
|
167
|
-
<!-- ko if: fieldType=='Boolean' && ['is blank', 'is not blank', 'is null', 'is not null'].indexOf($parent.Operator()) == -1 -->
|
|
168
|
-
<select required class="form-select" data-bind="value: $parent.Value, disable: $parent.Operator() == 'is default'">
|
|
169
|
-
<option value="1">Yes</option>
|
|
170
|
-
<option value="0">No</option>
|
|
171
|
-
</select>
|
|
172
|
-
<!-- /ko -->
|
|
173
|
-
<!-- ko if: ['Int','Money','Float','Double','Date','DateTime','Time','Boolean'].indexOf(fieldType) == -1 && ['is blank', 'is not blank', 'is null', 'is not null'].indexOf($parent.Operator()) == -1 -->
|
|
174
|
-
<input class="form-control" type="text" data-bind="value: $parent.Value, disable: $parent.Operator() == 'is default',attr: {id: 'ctl-' + $element.closest('[data-parentprefix]').getAttribute('data-parentprefix') + '-' + uiId}" required />
|
|
175
|
-
<!-- /ko -->
|
|
176
|
-
<!-- /ko -->
|
|
177
|
-
<!-- ko if: hasForeignKey && $parent.Operator() != 'all' -->
|
|
178
|
-
<!-- ko if: hasForeignParentKey && $parent.showParentFilter() -->
|
|
179
|
-
<select multiple class="form-control" data-bind="select2: { dropdownParent: '#filter-'+uiId, placeholder: 'Please Choose', allowClear: true }, options: $parent.ParentList, optionsText: 'text', optionsValue: $parent.IsConditionalFilter ? 'text': 'id', selectedOptions: $parent.ParentIn"></select>
|
|
180
|
-
<!-- /ko -->
|
|
181
|
-
<!-- ko if: $parent.Operator()=='='-->
|
|
182
|
-
<select required class="form-control" data-bind="select2: { dropdownParent: '#filter-'+uiId, placeholder: 'Please Choose', allowClear: true }, options: $parent.LookupList, optionsText: 'text', optionsValue: $parent.IsConditionalFilter ? 'text': 'id', value: $parent.Value, optionsCaption: 'Please Choose'"></select>
|
|
183
|
-
<!-- /ko -->
|
|
184
|
-
<!-- ko if: $parent.Operator()=='in' || $parent.Operator()=='not in'-->
|
|
185
|
-
<select required multiple class="form-control" data-bind="select2: { dropdownParent: '#filter-'+uiId, placeholder: 'Please Choose', allowClear: true }, options: $parent.LookupList, optionsText: 'text', optionsValue: $parent.IsConditionalFilter ? 'text': 'id', selectedOptions: $parent.ValueIn"></select>
|
|
186
|
-
<!-- /ko -->
|
|
187
|
-
<!-- /ko -->
|
|
188
|
-
</div>
|
|
189
|
-
</script>
|
|
190
|
-
|
|
191
|
-
<script type="text/html" id="pager-template">
|
|
192
|
-
<div class="pager-container d-flex align-items-center flex-wrap gap-2">
|
|
193
|
-
|
|
194
|
-
<!-- Rows per page -->
|
|
195
|
-
<div class="d-flex align-items-center gap-1 ms-1">
|
|
196
|
-
<span class="text-muted small">Page size:</span>
|
|
197
|
-
<select class="form-select form-select-sm w-auto"
|
|
198
|
-
data-bind="options: pageSizeOptions, value: pageSize">
|
|
199
|
-
</select>
|
|
200
|
-
</div>
|
|
201
|
-
|
|
202
|
-
<!-- Inner border block for page navigation controls -->
|
|
203
|
-
<div class="d-flex align-items-center gap-1 ms-3">
|
|
204
|
-
<a href="#" title="First" data-bind="click: first, enable: !isFirstPage()"
|
|
205
|
-
class="btn btn-outline-secondary btn-sm pager-btn ms-1" aria-label="First Page">
|
|
206
|
-
<i class="fa fa-angle-double-left"></i>
|
|
207
|
-
</a>
|
|
208
|
-
|
|
209
|
-
<a href="#" title="Previous" data-bind="click: previous, enable: !isFirstPage()"
|
|
210
|
-
class="btn btn-outline-secondary btn-sm pager-btn" aria-label="Previous Page">
|
|
211
|
-
<i class="fa fa-angle-left"></i>
|
|
212
|
-
</a>
|
|
213
|
-
|
|
214
|
-
<div class="d-flex align-items-center gap-1">
|
|
215
|
-
<span class="text-muted small">Page</span>
|
|
216
|
-
<input type="number" min="1" pattern="[0-9]*"
|
|
217
|
-
class="form-control form-control-sm text-center pager-input"
|
|
218
|
-
style="width: 60px;"
|
|
219
|
-
data-bind="value: currentPage, attr: { max: pages() }">
|
|
220
|
-
<span class="text-muted small">of</span>
|
|
221
|
-
<span class="text-muted small" data-bind="text: pages"></span>
|
|
222
|
-
</div>
|
|
223
|
-
|
|
224
|
-
<a href="#" title="Next" data-bind="click: next, enable: !isLastPage()"
|
|
225
|
-
class="btn btn-outline-secondary btn-sm pager-btn" aria-label="Next Page">
|
|
226
|
-
<i class="fa fa-angle-right"></i>
|
|
227
|
-
</a>
|
|
228
|
-
|
|
229
|
-
<a href="#" title="Last" data-bind="click: last, enable: !isLastPage()"
|
|
230
|
-
class="btn btn-outline-secondary btn-sm pager-btn" aria-label="Last Page">
|
|
231
|
-
<i class="fa fa-angle-double-right"></i>
|
|
232
|
-
</a>
|
|
233
|
-
</div>
|
|
234
|
-
</div>
|
|
235
|
-
</script>
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
<script type="text/html" id="report-column-header">
|
|
240
|
-
<!-- ko foreach: Columns -->
|
|
241
|
-
<th data-bind="attr: { id: !IsPivotField ? fieldId : 'pivot--' + fieldName }, style: {'text-align': fieldAlign() ? fieldAlign() : (IsNumeric ? 'right' : 'left'), 'background-color': headerBackColor }, hidden: outerGroup" style="border-right: 1px solid;">
|
|
242
|
-
|
|
243
|
-
<div class="pull-left" data-bind="if: !$parent.IsDrillDown()" style="padding-right: 5px;">
|
|
244
|
-
<div class="dropup">
|
|
245
|
-
<a href="#" data-bs-toggle="dropdown" aria-haspopup="false" aria-expanded="false">
|
|
246
|
-
<span class="fa fa-ellipsis-v sortable" title="Drag to reorder"></span>
|
|
247
|
-
</a>
|
|
248
|
-
<ul data-bind="visible: !IsPivotField" class="dropdown-menu" style="z-index: 1001;">
|
|
249
|
-
<li class="dropdown-item small" data-bind="visible: !IsNumeric">
|
|
250
|
-
<a href="#" data-bind="click: toggleOuterGroup">
|
|
251
|
-
<span class="fa fa-clone"></span> Outer Group
|
|
252
|
-
</a>
|
|
253
|
-
</li>
|
|
254
|
-
<li class="dropdown-item small">
|
|
255
|
-
<a href="#" data-bind="click: setupFieldOptions">
|
|
256
|
-
<span class="fa fa-gear"></span> Field Settings
|
|
257
|
-
</a>
|
|
258
|
-
</li>
|
|
259
|
-
</ul>
|
|
260
|
-
</div>
|
|
261
|
-
</div>
|
|
262
|
-
<div data-bind="style: {'width': fieldWidth}">
|
|
263
|
-
<!-- ko if: $parents[3].useStoredProc ? $parents[3].useStoredProc() : ($parents[5].useStoredProc ? $parents[5].useStoredProc() : false) -->
|
|
264
|
-
<span data-bind="text: fieldLabel() ? fieldLabel() : fieldName, style: {'color': headerFontColor, 'font-weight': headerFontBold() ? 'bold' : 'normal'}"></span>
|
|
265
|
-
<!-- /ko -->
|
|
266
|
-
<!-- ko ifnot: $parents[3].useStoredProc ? $parents[3].useStoredProc() : ($parents[5].useStoredProc ? $parents[5].useStoredProc() : false) -->
|
|
267
|
-
<a href="" data-bind="click: function(){ if (!IsPivotField) { $parents[pagerIndex($parents)].changeSort(SqlField); } }, style: {'color': headerFontColor, 'font-weight': headerFontBold() ? 'bold' : 'normal'}">
|
|
268
|
-
<span data-bind="text: $parent.IsDrillDown() && fieldLabel2() ? fieldLabel2() : (fieldLabel() ? fieldLabel() : fieldName)"></span>
|
|
269
|
-
<span data-bind="text: $parents[pagerIndex($parents)].pager.sortColumn() === SqlField ? ($parents[pagerIndex($parents)].pager.sortDescending() ? '▼' : '▲') : ''"></span>
|
|
270
|
-
</a>
|
|
271
|
-
<!-- /ko -->
|
|
272
|
-
</div>
|
|
273
|
-
</th>
|
|
274
|
-
<!-- /ko -->
|
|
275
|
-
</script>
|
|
276
|
-
|
|
277
|
-
<script type="text/html" id="report-widget">
|
|
278
|
-
<div style="text-align: center; width: 100%;font-size: 48px">
|
|
279
|
-
<span data-bind="visible: Rows.length < 1" title="No data found">/</span>
|
|
280
|
-
|
|
281
|
-
<div data-bind="if: Rows.length > 0">
|
|
282
|
-
<div data-bind="with: $parent.rows[0].Items[0]">
|
|
283
|
-
<span data-bind="html: formattedVal"></span>
|
|
284
|
-
|
|
285
|
-
<!-- ko if: $parent.Rows.length > 1 ? ($parents[$parents.length-2].showPriorInKpi != undefined ? $parents[$parents.length-2].showPriorInKpi() : $parents[$parents.length-1].showPriorInKpi()) : false -->
|
|
286
|
-
<span data-bind="style: {'color': $parent.calculateRate() > 0 ? 'green' : 'red', 'font-size': '24px'}">
|
|
287
|
-
<span data-bind="html: $parent.calculateRate() + '%'"></span>
|
|
288
|
-
</span>
|
|
289
|
-
|
|
290
|
-
<div data-bind="style: {'font-size': '24px', 'color': 'gray'}, css: {'text-muted': true}">
|
|
291
|
-
Prior Period: <span data-bind="html: $parent.Rows[1].Items[0].formattedVal"></span>
|
|
292
|
-
</div>
|
|
293
|
-
<!-- /ko -->
|
|
294
|
-
|
|
295
|
-
</div>
|
|
296
|
-
</div>
|
|
297
|
-
</div>
|
|
298
|
-
|
|
299
|
-
</script>
|
|
300
|
-
|
|
301
|
-
<script type="text/html" id="report-column">
|
|
302
|
-
<!-- ko foreach: Items -->
|
|
303
|
-
<td data-bind="hidden: outerGroup, style: {'background-color': _backColor ?? backColor(), 'color': _fontColor ?? fontColor(), 'font-weight': fontBold() || _fontBold ? 'bold' : 'normal', 'text-align': fieldAlign() ? fieldAlign() : (Column.IsNumeric ? 'right' : 'left')}">
|
|
304
|
-
<div data-bind="style: {'width': fieldWidth }, css: { 'text-wrap': fieldWidth }">
|
|
305
|
-
<!-- ko if: LinkTo-->
|
|
306
|
-
<a data-bind="attr: {href: LinkTo}" target="_blank"><span data-bind="html: formattedVal"></span></a>
|
|
307
|
-
<!-- /ko-->
|
|
308
|
-
<!-- ko ifnot: LinkTo-->
|
|
309
|
-
<span data-bind="html: formattedVal"></span>
|
|
310
|
-
<!-- /ko-->
|
|
311
|
-
</div>
|
|
312
|
-
</td>
|
|
313
|
-
</script>
|
|
314
|
-
|
|
315
|
-
<script type="text/html" id="report-pivot">
|
|
316
|
-
<div class="table-responsive" data-bind="with: ReportData">
|
|
317
|
-
<table class="table table-striped table-hover table-condensed">
|
|
318
|
-
<thead style="position: sticky; top: -1px; z-index: 2;">
|
|
319
|
-
<tr>
|
|
320
|
-
<th></th>
|
|
321
|
-
<!-- ko foreach: Rows -->
|
|
322
|
-
<th>
|
|
323
|
-
<span data-bind="text: Items[0].FormattedValue"></span>
|
|
324
|
-
</th>
|
|
325
|
-
<!-- /ko -->
|
|
326
|
-
</tr>
|
|
327
|
-
</thead>
|
|
328
|
-
<tbody data-bind="foreach: Columns">
|
|
329
|
-
<tr>
|
|
330
|
-
<!-- ko if: $index() > 0 -->
|
|
331
|
-
<td>
|
|
332
|
-
<span data-bind="text: fieldLabel || ColumnName"></span>
|
|
333
|
-
</td>
|
|
334
|
-
<!-- ko foreach: $parent.Rows -->
|
|
335
|
-
<td data-bind="style: {'background-color': $parent.backColor, 'color': $parent.fontColor, 'font-weight': $parent.fontBold() ? 'bold' : 'normal', 'text-align': $parent.fieldAlign ? $parent.fieldAlign : ($parent.IsNumeric ? 'right' : 'left') }">
|
|
336
|
-
<span data-bind="text: Items[$parentContext.$index()].FormattedValue"></span>
|
|
337
|
-
</td>
|
|
338
|
-
<!-- /ko -->
|
|
339
|
-
<!-- /ko -->
|
|
340
|
-
</tr>
|
|
341
|
-
</tbody>
|
|
342
|
-
</table>
|
|
343
|
-
|
|
344
|
-
</div>
|
|
345
|
-
|
|
346
|
-
</script>
|
|
347
|
-
|
|
348
|
-
<script type="text/html" id="report-table">
|
|
349
|
-
<div class="table-responsive">
|
|
350
|
-
<table class="table table-hover table-condensed" data-bind="attr: {class: 'table table-striped table-hover table-condensed ' + $parents[2].selectedStyle()}">
|
|
351
|
-
<thead style="position: sticky; top: -1px; z-index: 2;" data-bind="if: !$parents[2].noHeaderRow()">
|
|
352
|
-
<tr class="no-highlight" data-bind="sortableColumns: { handle: '.sortable', cursor: 'move', placeholder: 'drop-highlight',selectedFields: $parents[2].SelectedFields }">
|
|
353
|
-
<!-- ko if: $parentContext.$parentContext.$parent.canDrilldown() && !IsDrillDown() && !CanExpandOption() && (!$parents[2].hasPivotColumn() || ($parents[2].hasPivotColumn() && $parents[2].appSettings.useAltPivot)) -->
|
|
354
|
-
<th style="width: 30px; border-left: 1px solid;" data-bind="style: {'background-color': Columns[0].headerBackColor}"></th>
|
|
355
|
-
<!-- /ko -->
|
|
356
|
-
<!-- ko template: 'report-column-header', data: $data -->
|
|
357
|
-
<!-- /ko-->
|
|
358
|
-
</tr>
|
|
359
|
-
</thead>
|
|
360
|
-
<tbody data-bind="attr: {id: 'report-table-body' + $parents[2].ReportID()}">
|
|
361
|
-
<tr style="display: none;" data-bind="visible: Rows.length < 1">
|
|
362
|
-
<td data-bind="attr:{colspan: Columns.length + 1}">
|
|
363
|
-
No records found
|
|
364
|
-
</td>
|
|
365
|
-
</tr>
|
|
366
|
-
|
|
367
|
-
<!-- ko if: !$parents[2].useRenderTable() -->
|
|
368
|
-
<!-- ko foreach: $parent.rows -->
|
|
369
|
-
<tr>
|
|
370
|
-
<!-- ko if: $parentContext.$parentContext.$parentContext.$parent.canDrilldown() && !$parent.IsDrillDown() && !$parent.CanExpandOption() && $parentContext.$parentContext.$parentContext.$parent.ReportType() != 'Single' -->
|
|
371
|
-
<td style="width: 30px; vertical-align: middle;" data-bind="style: {'background-color': Items[0]._backColor ?? Items[0].backColor(), 'color': Items[0]._fontColor ?? Items[0].fontColor()}">
|
|
372
|
-
<a href="#" data-bind="click: function(){ toggle(); }"><span class="fa" data-bind="css: {'fa-plus': !isExpanded(), 'fa-minus': isExpanded()}"></span></a>
|
|
373
|
-
</td>
|
|
374
|
-
<!-- /ko -->
|
|
375
|
-
<!-- ko template: 'report-column', data: $data -->
|
|
376
|
-
<!-- /ko-->
|
|
377
|
-
</tr>
|
|
378
|
-
<!-- ko if: isExpanded -->
|
|
379
|
-
<tr>
|
|
380
|
-
<td style="width: 30px;"></td>
|
|
381
|
-
<td data-bind="attr:{colspan: $parent.Columns.length }" style="padding-left: 0px;">
|
|
382
|
-
<div data-bind="visible: !DrillDownData()">
|
|
383
|
-
<div class="report-spinner"></div>
|
|
384
|
-
</div>
|
|
385
|
-
<!-- ko if: DrillDownData -->
|
|
386
|
-
<table class="table table-striped table-hover table-condensed" data-bind="with: DrillDownData">
|
|
387
|
-
<thead>
|
|
388
|
-
<tr class="no-highlight">
|
|
389
|
-
<!-- ko template: 'report-column-header', data: $data -->
|
|
390
|
-
<!-- /ko-->
|
|
391
|
-
</tr>
|
|
392
|
-
</thead>
|
|
393
|
-
<tbody>
|
|
394
|
-
<tr style="display: none;" data-bind="visible: Rows && Rows.length < 1">
|
|
395
|
-
<td data-bind="attr: {colspan: Columns.length}">
|
|
396
|
-
No records found
|
|
397
|
-
</td>
|
|
398
|
-
</tr>
|
|
399
|
-
<!-- ko foreach: Rows -->
|
|
400
|
-
<tr>
|
|
401
|
-
<!-- ko template: 'report-column', data: $data -->
|
|
402
|
-
<!-- /ko-->
|
|
403
|
-
</tr>
|
|
404
|
-
<!-- /ko -->
|
|
405
|
-
</tbody>
|
|
406
|
-
</table>
|
|
407
|
-
<div class="col-xs-12 col-centered" data-bind="with: pager">
|
|
408
|
-
<div class="form-inline small text-muted">
|
|
409
|
-
<div class="pull-left total-records" data-bind="visible: pages()">
|
|
410
|
-
<span data-bind="text: 'Total Records: ' + totalRecords()"></span>
|
|
411
|
-
</div>
|
|
412
|
-
<div class="pull-left total-records">
|
|
413
|
-
|
|
414
|
-
<a href="#" title="Download Excel" data-bind="click: $parent.exportExcel"><span class="fa fa-file-excel-o"></span></a>
|
|
415
|
-
|
|
416
|
-
<a href="#" title="View Code" data-bs-toggle="modal" data-bs-target="#sqlDrillDownModal" data-bind="visible: $root.adminMode">
|
|
417
|
-
<span class="fa fa-code"></span>
|
|
418
|
-
</a>
|
|
419
|
-
</div>
|
|
420
|
-
<div class="form-group pull-right" data-bind="visible: pages()">
|
|
421
|
-
<div data-bind="template: 'pager-template', data: $data"></div>
|
|
422
|
-
</div>
|
|
423
|
-
</div>
|
|
424
|
-
</div>
|
|
425
|
-
<!-- /ko -->
|
|
426
|
-
</td>
|
|
427
|
-
</tr>
|
|
428
|
-
<!-- /ko -->
|
|
429
|
-
<!-- ko if: subReportsRan().length > 0 -->
|
|
430
|
-
<tr>
|
|
431
|
-
<td data-bind="attr:{colspan: $parent.Columns.length }" style="padding-left: 0px;">
|
|
432
|
-
<div data-bind="foreach: subReportsRan">
|
|
433
|
-
<div class="">
|
|
434
|
-
<div class="" style="padding-bottom: 20px;" >
|
|
435
|
-
<h2 class="pull-left" data-bind="text: ReportName"></h2>
|
|
436
|
-
|
|
437
|
-
<div class="clearfix"></div>
|
|
438
|
-
<div class="list-overflow-auto" style="padding-top: 0; margin-top: 0;">
|
|
439
|
-
<p data-bind="html: ReportDescription, visible: ReportDescription"></p>
|
|
440
|
-
|
|
441
|
-
<div data-bind="with: ReportResult" class="small">
|
|
442
|
-
<div data-bind="visible: !ReportData()">
|
|
443
|
-
<div class="report-spinner"></div>
|
|
444
|
-
</div>
|
|
445
|
-
<div data-bind="template: 'report-template', data: $data"></div>
|
|
446
|
-
</div>
|
|
447
|
-
</div>
|
|
448
|
-
<div class="form-inline">
|
|
449
|
-
<div class="small" data-bind="with: pager">
|
|
450
|
-
<div class="form-group pull-left total-records" data-bind="if: totalRecords()>1 && $parent.ReportType() != 'Single'">
|
|
451
|
-
<span data-bind="text: 'Total Records: ' + totalRecords()"></span><br />
|
|
452
|
-
</div>
|
|
453
|
-
<div class="form-group pull-right" data-bind="if: pages()>1 && $parent.ReportType() != 'Single'">
|
|
454
|
-
<div data-bind="template: 'pager-template', data: $data"></div>
|
|
455
|
-
</div>
|
|
456
|
-
</div>
|
|
457
|
-
</div>
|
|
458
|
-
</div>
|
|
459
|
-
|
|
460
|
-
</div>
|
|
461
|
-
</div>
|
|
462
|
-
</td>
|
|
463
|
-
</tr>
|
|
464
|
-
<!-- /ko -->
|
|
465
|
-
<!-- /ko -->
|
|
466
|
-
<!-- /ko-->
|
|
467
|
-
</tbody>
|
|
468
|
-
<!-- ko if: $parentContext.$parent.SubTotals().length == 1 && $parentContext.$parentContext.$parent.OuterGroupColumns().length == 0 -->
|
|
469
|
-
<tfoot data-bind="foreach: $parentContext.$parent.SubTotals">
|
|
470
|
-
<tr class="sub-total">
|
|
471
|
-
<!-- ko if: $parentContext.$parentContext.$parentContext.$parent.canDrilldown() && !$parent.IsDrillDown() && !$parent.CanExpandOption() -->
|
|
472
|
-
<td></td>
|
|
473
|
-
<!-- /ko -->
|
|
474
|
-
<!-- ko foreach: Items -->
|
|
475
|
-
<!-- ko if: Value != 'NA' && Value != 'NaN' && !outerGroup() -->
|
|
476
|
-
<td data-bind="style: {'background-color': _backColor ?? backColor(), 'color': _fontColor ?? fontColor(), 'font-weight': fontBold() || _fontBold ? 'bold' : 'normal', 'text-align': fieldAlign() ? fieldAlign() : 'right'}">
|
|
477
|
-
<div data-bind="style: {'width': fieldWidth }">
|
|
478
|
-
<span data-bind="html: formattedVal"></span>
|
|
479
|
-
</div>
|
|
480
|
-
</td>
|
|
481
|
-
<!-- /ko -->
|
|
482
|
-
<!-- /ko -->
|
|
483
|
-
</tr>
|
|
484
|
-
</tfoot>
|
|
485
|
-
<!-- /ko -->
|
|
486
|
-
</table>
|
|
487
|
-
</div>
|
|
488
|
-
</script>
|
|
489
|
-
|
|
490
|
-
<script type="text/html" id="report-render">
|
|
491
|
-
<div data-bind="with: ReportData">
|
|
492
|
-
<div data-bind="foreach: Rows">
|
|
493
|
-
<div data-bind="html: renderedHtml, css: { 'card-view': $parents[$parents.length-1].cardView }"></div>
|
|
494
|
-
|
|
495
|
-
<div data-bind="foreach: subReportsRan">
|
|
496
|
-
<div class="">
|
|
497
|
-
<div class="" style="padding-bottom: 20px;" >
|
|
498
|
-
<h2 class="pull-left" data-bind="text: ReportName"></h2>
|
|
499
|
-
|
|
500
|
-
<div class="clearfix"></div>
|
|
501
|
-
<div class="list-overflow-auto" style="padding-top: 0; margin-top: 0;">
|
|
502
|
-
<p data-bind="html: ReportDescription, visible: ReportDescription"></p>
|
|
503
|
-
|
|
504
|
-
<div data-bind="with: ReportResult" class="small">
|
|
505
|
-
<div data-bind="visible: !ReportData()">
|
|
506
|
-
<div class="report-spinner"></div>
|
|
507
|
-
</div>
|
|
508
|
-
<div data-bind="template: 'report-template', data: $data"></div>
|
|
509
|
-
</div>
|
|
510
|
-
</div>
|
|
511
|
-
<div class="form-inline">
|
|
512
|
-
<div class="small" data-bind="with: pager">
|
|
513
|
-
<div class="form-group pull-left total-records" data-bind="if: totalRecords()>1 && $parent.ReportType() != 'Single'">
|
|
514
|
-
<span data-bind="text: 'Total Records: ' + totalRecords()"></span><br />
|
|
515
|
-
</div>
|
|
516
|
-
<div class="form-group pull-right" data-bind="if: pages()>1 && $parent.ReportType() != 'Single'">
|
|
517
|
-
<div data-bind="template: 'pager-template', data: $data"></div>
|
|
518
|
-
</div>
|
|
519
|
-
</div>
|
|
520
|
-
</div>
|
|
521
|
-
</div>
|
|
522
|
-
|
|
523
|
-
</div>
|
|
524
|
-
</div>
|
|
525
|
-
</div>
|
|
526
|
-
</div>
|
|
527
|
-
<div class="clearfix"></div>
|
|
528
|
-
</script>
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
<script type="text/html" id="report-template">
|
|
532
|
-
<div class="report-chart" data-bind="attr: {id: 'chart_div_' + $parent.ReportID()}, visible: $parent.isChart"></div>
|
|
533
|
-
<!-- ko if: $parent.ReportType() == 'Pivot' -->
|
|
534
|
-
<div data-bind="template: {name: 'report-pivot', data: $data }"></div>
|
|
535
|
-
<!-- /ko -->
|
|
536
|
-
|
|
537
|
-
<!-- ko if: $parent.ReportType() == 'Html' -->
|
|
538
|
-
<div data-bind="template: {name: 'report-render', data: $data }"></div>
|
|
539
|
-
<!-- /ko -->
|
|
540
|
-
|
|
541
|
-
<!-- ko if: $parent.ReportType() != 'Pivot' && $parent.ReportType() != 'Html' && (!$parent.isChart() || $parent.ShowDataWithGraph()) -->
|
|
542
|
-
<div class="pull-right" data-bind="if: $parent.OuterGroupColumns().length > 0">
|
|
543
|
-
<a href="#" data-bs-toggle="dropdown" aria-haspopup="false" aria-expanded="false">
|
|
544
|
-
Manage Groups <span class="fa fa-ellipsis-v"></span>
|
|
545
|
-
</a>
|
|
546
|
-
<ul class="dropdown-menu" style="z-index: 1001;" data-bind="foreach: $parent.OuterGroupColumns">
|
|
547
|
-
<li class="dropdown-item small">
|
|
548
|
-
<a href="#" data-bind="click: remove" title="Remove from Group">
|
|
549
|
-
<span class="fa fa-close"></span> <span data-bind="text: fieldName"></span>
|
|
550
|
-
</a>
|
|
551
|
-
</li>
|
|
552
|
-
</ul>
|
|
553
|
-
</div>
|
|
554
|
-
<div class="clear-fix"></div>
|
|
555
|
-
|
|
556
|
-
<div data-bind="foreach: outerGroupData">
|
|
557
|
-
<!-- ko if: rows.length > 0 || ($parent.outerGroupData && $parent.outerGroupData().length == 1) -->
|
|
558
|
-
<h6 data-bind="html: display"></h6>
|
|
559
|
-
<div class="" style="padding-top: 5px;"></div>
|
|
560
|
-
|
|
561
|
-
<!-- ko if: $parents[1].ReportType() != 'Single'-->
|
|
562
|
-
<div data-bind="template: {name: 'report-table', data: $parent.ReportData }"></div>
|
|
563
|
-
<!-- /ko -->
|
|
564
|
-
<!-- ko if: $parents[1].ReportType() == 'Single'-->
|
|
565
|
-
<div data-bind="template: {name: 'report-widget', data: $parent.ReportData }"></div>
|
|
566
|
-
<!-- /ko -->
|
|
567
|
-
<!-- /ko -->
|
|
568
|
-
</div>
|
|
569
|
-
<!-- /ko -->
|
|
570
|
-
</script>
|
|
571
|
-
<script type="text/html" id="admin-mode-template">
|
|
572
|
-
<div class="row">
|
|
573
|
-
<div class="d-flex justify-content-end align-items-center" style="gap: 10px;">
|
|
574
|
-
<div data-bind="visible: adminMode">
|
|
575
|
-
<div class="alert alert-info d-inline-block" style="font-size: 10pt; padding: 5px; max-width: 350px; white-space: normal; margin-bottom: 0;">
|
|
576
|
-
<i class="fa fa-user-circle"></i> You can manage Reports/Dashboards for all users
|
|
577
|
-
</div>
|
|
578
|
-
</div>
|
|
579
|
-
<div class="d-flex align-items-center">
|
|
580
|
-
<div class="bubble-badge">
|
|
581
|
-
Admin Mode
|
|
582
|
-
<div class="form-check form-switch ms-2">
|
|
583
|
-
<input class="form-check-input" type="checkbox" data-bind="checked: adminMode">
|
|
584
|
-
</div>
|
|
585
|
-
</div>
|
|
586
|
-
</div>
|
|
587
|
-
</div>
|
|
588
|
-
</div>
|
|
589
|
-
</script>
|
|
590
|
-
<script type="text/html" id="manage-access-template">
|
|
591
|
-
<h5><span class="fa fa-key"></span>Manage Access</h5>
|
|
592
|
-
<div class="panel panel-default panel-body" style="margin-left: 20px;">
|
|
593
|
-
|
|
594
|
-
<div class="form-group row">
|
|
595
|
-
<label class="col-md-3 col-sm-3 control-label">Client Id to Restrict Access</label>
|
|
596
|
-
<div class="col-md-3 col-sm-3">
|
|
597
|
-
<input class="form-control text-box single-line" type="text" data-bind="value: clientId">
|
|
598
|
-
</div>
|
|
599
|
-
<div class="col-md-1 col-sm-1">
|
|
600
|
-
<span data-bs-toggle="tooltip" data-placement="right" class="fa fa-question-circle helptip" title="Leave blank to give all clients access (Global Reports)"></span>
|
|
601
|
-
</div>
|
|
602
|
-
</div>
|
|
603
|
-
<div class="alert alert-info">
|
|
604
|
-
<span class="fa fa-lightbulb-o fa-2x"></span> User level rights override Role level rights. No selection for a rule implies report is available to all.
|
|
605
|
-
</div>
|
|
606
|
-
|
|
607
|
-
<div class="row small">
|
|
608
|
-
<div class="col-md-6">
|
|
609
|
-
<i class="toggle-icon fa" data-bind="click: toggleManageUsers,css: { 'fa-chevron-down': showManageUsers(), 'fa-chevron-right': !showManageUsers() }"></i> <b>Manage by User</b> (allow edit)
|
|
610
|
-
<div class="row container-fluid" data-bind="visible: showManageUsers">
|
|
611
|
-
<!-- ko if: groupedUsers().length > 0 -->
|
|
612
|
-
<!-- ko foreach: groupedUsers -->
|
|
613
|
-
<div class="col-md-12">
|
|
614
|
-
<div class="category-header" style="cursor: pointer;" data-bind="click: function() { show(!show()); }">
|
|
615
|
-
<i class="fa toggle-icon" data-bind="css: { 'fa-chevron-down': show(), 'fa-chevron-right': !show() }"></i>
|
|
616
|
-
<strong data-bind="text: category"></strong>
|
|
617
|
-
</div>
|
|
618
|
-
<div class="row container-fluid" data-bind="visible: show">
|
|
619
|
-
<!-- ko foreach: users -->
|
|
620
|
-
<div class="pull-left">
|
|
621
|
-
<div class="checkbox">
|
|
622
|
-
<label class="label label-info">
|
|
623
|
-
<input type="checkbox" data-bind="checked: selected"> <span data-bind="text: text"></span> </label>
|
|
624
|
-
</div>
|
|
625
|
-
</div>
|
|
626
|
-
<!-- /ko -->
|
|
627
|
-
</div>
|
|
628
|
-
</div>
|
|
629
|
-
<!-- /ko -->
|
|
630
|
-
<!-- /ko -->
|
|
631
|
-
<!-- ko if: groupedUsers().length == 0 && users.length > 0 -->
|
|
632
|
-
<!-- ko foreach: users -->
|
|
633
|
-
<div class="pull-left">
|
|
634
|
-
<div class="checkbox">
|
|
635
|
-
<label class="label label-info">
|
|
636
|
-
<input type="checkbox" data-bind="checked: selected"> <span data-bind="text: text"></span>
|
|
637
|
-
</label>
|
|
638
|
-
</div>
|
|
639
|
-
</div>
|
|
640
|
-
<!-- /ko -->
|
|
641
|
-
<!-- /ko -->
|
|
642
|
-
<div data-bind="if: groupedUsers().length == 0 && users.length == 0">
|
|
643
|
-
Users list not populated or not applicable
|
|
644
|
-
</div>
|
|
645
|
-
</div>
|
|
646
|
-
<br />
|
|
647
|
-
<i class="toggle-icon fa" data-bind="click: toggleViewUsers,css: { 'fa-chevron-down': showViewUsers(), 'fa-chevron-right': !showViewUsers() }"></i> <b>View only by User</b> (no edit/delete)
|
|
648
|
-
<div class="row container-fluid" data-bind="visible: showViewUsers">
|
|
649
|
-
<!-- ko if: groupedViewOnlyUsers().length > 0 -->
|
|
650
|
-
<!-- ko foreach: groupedViewOnlyUsers -->
|
|
651
|
-
<div class="col-md-12">
|
|
652
|
-
<div class="category-header" style="cursor: pointer;" data-bind="click: function() { show(!show()); }">
|
|
653
|
-
<i class="fa toggle-icon" data-bind="css: { 'fa-chevron-down': show(), 'fa-chevron-right': !show() }"></i>
|
|
654
|
-
<strong data-bind="text: category"></strong>
|
|
655
|
-
</div>
|
|
656
|
-
<div class="row container-fluid" data-bind="visible: show">
|
|
657
|
-
<!-- ko foreach: viewOnlyUsers -->
|
|
658
|
-
<div class="pull-left">
|
|
659
|
-
<div class="checkbox">
|
|
660
|
-
<label class="label label-info">
|
|
661
|
-
<input type="checkbox" data-bind="checked: selected"> <span data-bind="text: text"></span> </label>
|
|
662
|
-
</div>
|
|
663
|
-
</div>
|
|
664
|
-
<!-- /ko -->
|
|
665
|
-
</div>
|
|
666
|
-
</div>
|
|
667
|
-
<!-- /ko -->
|
|
668
|
-
<!-- /ko -->
|
|
669
|
-
<!-- ko if: groupedViewOnlyUsers().length == 0 && viewOnlyUsers.length > 0 -->
|
|
670
|
-
<!-- ko foreach: viewOnlyUsers -->
|
|
671
|
-
<div class="pull-left">
|
|
672
|
-
<div class="checkbox">
|
|
673
|
-
<label class="label label-info">
|
|
674
|
-
<input type="checkbox" data-bind="checked: selected"> <span data-bind="text: text"></span>
|
|
675
|
-
</label>
|
|
676
|
-
</div>
|
|
677
|
-
</div>
|
|
678
|
-
<!-- /ko -->
|
|
679
|
-
<!-- /ko -->
|
|
680
|
-
<div data-bind="if: groupedViewOnlyUsers().length == 0 && users.length == 0">
|
|
681
|
-
Users list not populated or not applicable
|
|
682
|
-
</div>
|
|
683
|
-
</div>
|
|
684
|
-
<br />
|
|
685
|
-
<div data-bind="ifnot: isDashboard">
|
|
686
|
-
<i class="toggle-icon fa" data-bind="click: toggleDeleteUsers,css: { 'fa-chevron-down': showDeleteUsers(), 'fa-chevron-right': !showDeleteUsers() }"></i><b>Delete by User</b> (allow delete)
|
|
687
|
-
<div class="row container-fluid" data-bind="visible: showDeleteUsers">
|
|
688
|
-
<!-- ko if: groupedDeleteOnlyUsers().length > 0 -->
|
|
689
|
-
<!-- ko foreach: groupedDeleteOnlyUsers -->
|
|
690
|
-
<div class="col-md-12">
|
|
691
|
-
<div class="category-header" style="cursor: pointer;" data-bind="click: function() { show(!show()); }">
|
|
692
|
-
<i class="fa toggle-icon" data-bind="css: { 'fa-chevron-down': show(), 'fa-chevron-right': !show() }"></i>
|
|
693
|
-
<strong data-bind="text: category"></strong>
|
|
694
|
-
</div>
|
|
695
|
-
<div class="row container-fluid" data-bind="visible: show">
|
|
696
|
-
<!-- ko foreach: deleteOnlyUsers -->
|
|
697
|
-
<div class="pull-left">
|
|
698
|
-
<div class="checkbox">
|
|
699
|
-
<label class="label label-info">
|
|
700
|
-
<input type="checkbox" data-bind="checked: selected"> <span data-bind="text: text"></span> </label>
|
|
701
|
-
</div>
|
|
702
|
-
</div>
|
|
703
|
-
<!-- /ko -->
|
|
704
|
-
</div>
|
|
705
|
-
</div>
|
|
706
|
-
<!-- /ko -->
|
|
707
|
-
<!-- /ko -->
|
|
708
|
-
<!-- ko if: groupedDeleteOnlyUsers().length == 0 && deleteOnlyUsers.length > 0 -->
|
|
709
|
-
<!-- ko foreach: deleteOnlyUsers -->
|
|
710
|
-
<div class="pull-left">
|
|
711
|
-
<div class="checkbox">
|
|
712
|
-
<label class="label label-info">
|
|
713
|
-
<input type="checkbox" data-bind="checked: selected"> <span data-bind="text: text"></span>
|
|
714
|
-
</label>
|
|
715
|
-
</div>
|
|
716
|
-
</div>
|
|
717
|
-
<!-- /ko -->
|
|
718
|
-
<!-- /ko -->
|
|
719
|
-
<div data-bind="if: groupedDeleteOnlyUsers().length == 0 && users.length == 0">
|
|
720
|
-
Users list not populated or not applicable
|
|
721
|
-
</div>
|
|
722
|
-
</div>
|
|
723
|
-
<br />
|
|
724
|
-
</div>
|
|
725
|
-
</div>
|
|
726
|
-
<div class="col-md-6">
|
|
727
|
-
<i class="toggle-icon fa" data-bind="click: toggleManageRoles,css: { 'fa-chevron-down': showManageRoles(), 'fa-chevron-right': !showManageRoles() }"></i><b>Manage by User Role</b> (allow edit)
|
|
728
|
-
<div class="row container-fluid" data-bind="visible: showManageRoles">
|
|
729
|
-
<!-- ko foreach: userRoles -->
|
|
730
|
-
<div class="pull-left">
|
|
731
|
-
<div class="checkbox">
|
|
732
|
-
<label class="label label-info">
|
|
733
|
-
<input type="checkbox" data-bind="checked: selected"> <span data-bind="text: text"></span>
|
|
734
|
-
</label>
|
|
735
|
-
</div>
|
|
736
|
-
</div>
|
|
737
|
-
<!-- /ko -->
|
|
738
|
-
<div data-bind="if: userRoles.length == 0">
|
|
739
|
-
User Roles list not populated or not applicable
|
|
740
|
-
</div>
|
|
741
|
-
</div>
|
|
742
|
-
<br />
|
|
743
|
-
<i class="toggle-icon fa" data-bind="click: toggleViewRoles,css: { 'fa-chevron-down': showViewRoles(), 'fa-chevron-right': !showViewRoles() }"></i><b>View only by User Role</b> (no edit/delete)
|
|
744
|
-
<div class="row container-fluid" data-bind="visible: showViewRoles">
|
|
745
|
-
<!-- ko foreach: viewOnlyUserRoles -->
|
|
746
|
-
<div class="pull-left">
|
|
747
|
-
<div class="checkbox">
|
|
748
|
-
<label class="label label-info">
|
|
749
|
-
<input type="checkbox" data-bind="checked: selected"> <span data-bind="text: text"></span>
|
|
750
|
-
</label>
|
|
751
|
-
</div>
|
|
752
|
-
</div>
|
|
753
|
-
<!-- /ko -->
|
|
754
|
-
<div data-bind="if: userRoles.length == 0">
|
|
755
|
-
User Roles list not populated or not applicable
|
|
756
|
-
</div>
|
|
757
|
-
</div>
|
|
758
|
-
<div data-bind="ifnot: isDashboard">
|
|
759
|
-
<i class="toggle-icon fa" data-bind="click: toggleDeleteRoles,css: { 'fa-chevron-down': showDeleteRoles(), 'fa-chevron-right': !showDeleteRoles() }"></i><b>Delete by User Role</b> (allow delete)
|
|
760
|
-
<div class="row container-fluid" data-bind="visible: showDeleteRoles">
|
|
761
|
-
<!-- ko foreach: deleteOnlyUserRoles -->
|
|
762
|
-
<div class="pull-left">
|
|
763
|
-
<div class="checkbox">
|
|
764
|
-
<label class="label label-info">
|
|
765
|
-
<input type="checkbox" data-bind="checked: selected"> <span data-bind="text: text"></span>
|
|
766
|
-
</label>
|
|
767
|
-
</div>
|
|
768
|
-
</div>
|
|
769
|
-
<!-- /ko -->
|
|
770
|
-
<div data-bind="if: userRoles.length == 0">
|
|
771
|
-
User Roles list not populated or not applicable
|
|
772
|
-
</div>
|
|
773
|
-
</div>
|
|
774
|
-
</div>
|
|
775
|
-
</div>
|
|
776
|
-
</div>
|
|
777
|
-
</div>
|
|
778
|
-
</script>
|
|
779
|
-
<script type="text/html" id="filter-group">
|
|
780
|
-
<div class="query-builder form-inline" data-bind="foreach: FilterGroups">
|
|
781
|
-
<div class="rules-group-container">
|
|
782
|
-
<div class="rules-group-header" data-bind="attr: {parentdivid: generateUniqueId()}">
|
|
783
|
-
<div data-bind="visible: !isRoot">
|
|
784
|
-
<div class="pull-left">
|
|
785
|
-
<div class="btn-group btn-group-toggle btn-group-sm" data-bs-toggle="buttons" role="group">
|
|
786
|
-
<label class="btn btn-light active" style="margin-right: 0px;">
|
|
787
|
-
<input type="radio" data-bind="attr: { name: 'andOrGroup-' + $element.closest('.rules-group-header').getAttribute('parentdivid') }, checked: AndOr" value="And" /> And
|
|
788
|
-
</label>
|
|
789
|
-
<label class="btn btn-light active">
|
|
790
|
-
<input type="radio" data-bind="attr: { name: 'andOrGroup-' + $element.closest('.rules-group-header').getAttribute('parentdivid') }, checked: AndOr" value="Or" /> Or
|
|
791
|
-
</label>
|
|
792
|
-
</div>
|
|
793
|
-
</div>
|
|
794
|
-
<div class="pull-right">
|
|
795
|
-
<button class="btn btn-sm btn-secondary" data-bind="click: $parent.RemoveFilterGroup, visible: !isRoot">Remove Group</button>
|
|
796
|
-
</div>
|
|
797
|
-
</div>
|
|
798
|
-
<div data-bind="visible: isRoot">
|
|
799
|
-
<div class="pull-left padded-div">
|
|
800
|
-
<label> Filter Conditions</label>
|
|
801
|
-
</div>
|
|
802
|
-
</div>
|
|
803
|
-
<div class="clearfix"></div>
|
|
804
|
-
</div>
|
|
805
|
-
|
|
806
|
-
<div class="rules-group-body" data-bind="template: {name: 'filter-inner'}"></div>
|
|
807
|
-
</div>
|
|
808
|
-
</div>
|
|
809
|
-
</script>
|
|
810
|
-
<script type="text/html" id="fly-filter-template">
|
|
811
|
-
<div class="card" data-bind="visible: FlyFilters().length>0 || DontExecuteOnRun">
|
|
812
|
-
<div class="card-header">
|
|
813
|
-
<a data-bs-toggle="collapse" data-bind="attr: {'data-bs-target': '#filter-panel-' + ReportID() }" href="#">
|
|
814
|
-
<i class="fa fa-filter"></i> Choose Filters
|
|
815
|
-
</a>
|
|
816
|
-
</div>
|
|
817
|
-
<div data-bind="attr: {id: 'filter-panel-' + ReportID() }, css: {collpased: !DontExecuteOnRun(), collapse: !DontExecuteOnRun()}" class="card-body">
|
|
818
|
-
<div>
|
|
819
|
-
<!-- ko foreach: FlyFilters -->
|
|
820
|
-
<div class="row">
|
|
821
|
-
<div class="col-sm-5 col-xs-4">
|
|
822
|
-
<div data-bind="with: Field" class="checkbox">
|
|
823
|
-
<div class="checkbox">
|
|
824
|
-
<label>
|
|
825
|
-
<input type="checkbox" title="Apply this filter" data-bind="checked: $parent.Apply, disabled: forced" /> <span data-bind="text: selectedFilterName"></span>
|
|
826
|
-
</label>
|
|
827
|
-
</div>
|
|
828
|
-
</div>
|
|
829
|
-
</div>
|
|
830
|
-
<div data-bind="with: Field" class="col-sm-2 col-xs-3">
|
|
831
|
-
<div class="form-group" data-bind="if: $parent.Apply">
|
|
832
|
-
<select class="form-select" data-bind="options: fieldFilter, value: $parent.Operator" required></select>
|
|
833
|
-
</div>
|
|
834
|
-
</div>
|
|
835
|
-
<div data-bind="with: Field" class="col-sm-5 col-xs-5">
|
|
836
|
-
<div data-bind="if: $parent.Apply" data-parentprefix="F" >
|
|
837
|
-
<div data-bind="template: 'report-filter', data: $data"></div>
|
|
838
|
-
</div>
|
|
839
|
-
</div>
|
|
840
|
-
</div>
|
|
841
|
-
<!-- /ko -->
|
|
842
|
-
<button class="btn btn-primary" data-bind="click: ExecuteReport">Run</button>
|
|
843
|
-
</div>
|
|
844
|
-
</div>
|
|
845
|
-
</div>
|
|
846
|
-
</script>
|
|
847
|
-
|
|
848
|
-
<script type="text/html" id="filter-inner">
|
|
849
|
-
<div class="rules-list">
|
|
850
|
-
<div class="rule-container" data-bind="visible: Filters().length>0">
|
|
851
|
-
<table class="table table-striped table-hover table-borderless">
|
|
852
|
-
<thead>
|
|
853
|
-
<tr>
|
|
854
|
-
<th class="row">
|
|
855
|
-
<div class="col-md-1"></div>
|
|
856
|
-
<div class="col-md-4">Field</div>
|
|
857
|
-
<div class="col-md-2"></div>
|
|
858
|
-
<div class="col-md-4">Filter</div>
|
|
859
|
-
<div class="col-md-1"></div>
|
|
860
|
-
</th>
|
|
861
|
-
</tr>
|
|
862
|
-
</thead>
|
|
863
|
-
<tbody data-bind="foreach: Filters">
|
|
864
|
-
<tr class="rule-container">
|
|
865
|
-
<td class="row">
|
|
866
|
-
<div class="col-md-1">
|
|
867
|
-
<select data-bind="value: AndOr, visible: $index()>0" class="form-select">
|
|
868
|
-
<option>And</option>
|
|
869
|
-
<option>Or</option>
|
|
870
|
-
</select>
|
|
871
|
-
</div>
|
|
872
|
-
<div class="col-md-3">
|
|
873
|
-
<div class="form-group">
|
|
874
|
-
<select class="form-select" style="width: 100%;" data-bind="
|
|
875
|
-
options: $parents[$parents.length-2].selectedFieldsCanFilter != undefined
|
|
876
|
-
? $parents[$parents.length-2].selectedFieldsCanFilter
|
|
877
|
-
: $parents[$parents.length-1].selectedFieldsCanFilter,
|
|
878
|
-
optionsText: 'selectedFieldName',
|
|
879
|
-
optionsCaption: 'Please Choose',
|
|
880
|
-
value: Field,
|
|
881
|
-
attr: {required: Field()==null?'required':false},
|
|
882
|
-
disable: Field() && Field().forced"></select>
|
|
883
|
-
</div>
|
|
884
|
-
</div>
|
|
885
|
-
<div class="col-md-2">
|
|
886
|
-
<div data-bind="with: Field">
|
|
887
|
-
<div class="form-group">
|
|
888
|
-
<select class="form-select" style="width: 100%;" data-bind="options: fieldFilter, value: $parent.Operator" required></select>
|
|
889
|
-
</div>
|
|
890
|
-
</div>
|
|
891
|
-
</div>
|
|
892
|
-
<div class="col-md-5">
|
|
893
|
-
<div data-bind="with: Field" data-parentprefix="M">
|
|
894
|
-
<div data-bind="template: 'report-filter', data: $data"></div>
|
|
895
|
-
</div>
|
|
896
|
-
<!-- ko if: Field() && Field().fieldType == 'DateTime' && Operator() == 'range' && $index()==0 -->
|
|
897
|
-
<!-- ko if: $parents[$parents.length-2].canAddSeries != undefined && $parents[$parents.length-2].canAddSeries() -->
|
|
898
|
-
<button class="btn btn-sm btn-secondary" data-bind="click: $parents[$parents.length-2].AddSeries.bind($data)">Add Comparison</button>
|
|
899
|
-
<!--/ko -->
|
|
900
|
-
<!-- ko if: $parents[$parents.length-2].canAddSeries == undefined && $parentContext.$parent.canAddSeries != undefined && $parentContext.$parent.canAddSeries()-->
|
|
901
|
-
<button class="btn btn-sm btn-secondary" data-bind="click: $parentContext.$parent.AddSeries.bind($data)">Add Comparison</button>
|
|
902
|
-
<!--/ko -->
|
|
903
|
-
<!--/ko -->
|
|
904
|
-
<span data-bind="visible: Field() && Field().forced" class="badge bg-info">Required Filter</span>
|
|
905
|
-
</div>
|
|
906
|
-
<div class="col-md-1">
|
|
907
|
-
<div style="display: flex; align-items: center;">
|
|
908
|
-
<div class="form-group" style="flex-grow: 1;">
|
|
909
|
-
<button class="btn btn-sm btn-secondary" data-bind="click: $parent.RemoveFilter, hidden: Field() && Field().forced" title="Remove">
|
|
910
|
-
<i class="fa fa-trash"></i>
|
|
911
|
-
</button>
|
|
912
|
-
</div>
|
|
913
|
-
<div class="form-group" style="flex-grow: 1;" data-bind="with: Field, hidden: document.querySelector('#filter-panel.card-body.collapse')">
|
|
914
|
-
<span class="btn btn-sm" tabindex="0" data-bind="click: function(){ filterOnFly(!filterOnFly()); }, css: {'btn-success': filterOnFly()==true, 'btn-secondary': filterOnFly()==false}">
|
|
915
|
-
<span class="fa fa-filter" aria-hidden="true" title="Filter on Report"></span>
|
|
916
|
-
</span>
|
|
917
|
-
</div>
|
|
918
|
-
</div>
|
|
919
|
-
|
|
920
|
-
</div>
|
|
921
|
-
</td>
|
|
922
|
-
</tr>
|
|
923
|
-
<!-- ko foreach: compareTo -->
|
|
924
|
-
<tr>
|
|
925
|
-
<td class="row">
|
|
926
|
-
<div class="col-md-6"> </div>
|
|
927
|
-
<div class="col-md-2">
|
|
928
|
-
<span style="text-align: right"><button class="btn btn-sm" data-bind="click: $parents[2].RemoveSeries"><span class="fa fa-trash-o"></span></button></span>
|
|
929
|
-
<span class="muted">Compare to</span>
|
|
930
|
-
</div>
|
|
931
|
-
<div class="col-md-4">
|
|
932
|
-
<select class="form-select" data-bind="options: Range, value: Value" required></select>
|
|
933
|
-
</div>
|
|
934
|
-
</td>
|
|
935
|
-
</tr>
|
|
936
|
-
<!-- /ko -->
|
|
937
|
-
</tbody>
|
|
938
|
-
</table>
|
|
939
|
-
</div>
|
|
940
|
-
|
|
941
|
-
<div class="rule-container">
|
|
942
|
-
<div data-bind="template: {name: 'filter-group'}"></div>
|
|
943
|
-
<div>
|
|
944
|
-
<button class="btn btn-sm btn-outline-secondary" data-bind="click: AddFilter">Add Filter</button>
|
|
945
|
-
<button class="btn btn-sm btn-outline-secondary" data-bind="click: AddFilterGroup">Add Filter Group</button>
|
|
946
|
-
</div>
|
|
947
|
-
</div>
|
|
948
|
-
</div>
|
|
949
|
-
|
|
950
|
-
</script>
|
|
951
|
-
|
|
952
|
-
<script type="text/html" id="filter-parameters">
|
|
953
|
-
<div class="table-responsive">
|
|
954
|
-
<span data-bind="hidden: showParameters">No filters available to choose</span>
|
|
955
|
-
<table class="table table-striped table-hover table-borderless" data-bind="visible: showParameters">
|
|
956
|
-
<thead>
|
|
957
|
-
<tr>
|
|
958
|
-
<th style="width: 30%">Filter</th>
|
|
959
|
-
<th style="width: 20%"></th>
|
|
960
|
-
<th style="width: 30%">Value</th>
|
|
961
|
-
<th></th>
|
|
962
|
-
</tr>
|
|
963
|
-
</thead>
|
|
964
|
-
<tbody data-bind="foreach: Parameters">
|
|
965
|
-
<tr data-bind="ifnot: Hidden">
|
|
966
|
-
<td data-bind="text: DisplayName">
|
|
967
|
-
</td>
|
|
968
|
-
<td>
|
|
969
|
-
<div class="form-group">
|
|
970
|
-
<select class="form-select" style="width: 100%;" data-bind="options: operators, value: Operator" required></select>
|
|
971
|
-
</div>
|
|
972
|
-
</td>
|
|
973
|
-
<td data-bind="with: Field" data-parentprefix="P">
|
|
974
|
-
<div data-bind="template: 'report-filter', data: $data"></div>
|
|
975
|
-
</td>
|
|
976
|
-
<td></td>
|
|
977
|
-
</tr>
|
|
978
|
-
|
|
979
|
-
</tbody>
|
|
980
|
-
</table>
|
|
981
|
-
</div>
|
|
982
|
-
</script>
|
|
983
|
-
|
|
984
|
-
<script type="text/html" id="report-schedule">
|
|
985
|
-
<div data-bind="with: scheduleBuilder" id="schedule-builder-div">
|
|
986
|
-
<div class="form-check">
|
|
987
|
-
<input class="form-check-input" type="checkbox" data-bind="checked: hasSchedule" id="scheduleReportCheckbox">
|
|
988
|
-
<label class="form-check-label" for="scheduleReportCheckbox">
|
|
989
|
-
Set Schedule to send by Email
|
|
990
|
-
</label>
|
|
991
|
-
</div>
|
|
992
|
-
<div data-bind="if: hasSchedule">
|
|
993
|
-
<div class="d-flex align-items-center">
|
|
994
|
-
<div class="me-3 d-flex align-items-center">
|
|
995
|
-
<span data-bind="text: selectedOption() != 'once' ? 'Every ' : ''"></span>
|
|
996
|
-
<select class="form-select" required data-bind="options: options, value: selectedOption" style="min-width: 80px;"></select>
|
|
997
|
-
</div>
|
|
998
|
-
<div data-bind="if: selectedOption() == 'once'" class="me-3 d-flex align-items-center">
|
|
999
|
-
on <input data-bind="datepicker: selectedDate, datepickerOptions: {value: selectedDate}" class="form-control" required />
|
|
1000
|
-
</div>
|
|
1001
|
-
<div class="d-flex align-items-center">
|
|
1002
|
-
<div data-bind="if: showDays" class="d-flex align-items-center">
|
|
1003
|
-
on
|
|
1004
|
-
<select multiple class="form-select ms-2" required data-bind="select2: { placeholder: 'Choose Days', allowClear: true }, options: days, selectedOptions: selectedDays"></select>
|
|
1005
|
-
</div>
|
|
1006
|
-
<div data-bind="if: showDates" class="d-flex align-items-center">
|
|
1007
|
-
on
|
|
1008
|
-
<select multiple class="form-select" required data-bind="select2: { placeholder: 'Choose Dates', allowClear: true }, options: dates, selectedOptions: selectedDates"></select>
|
|
1009
|
-
</div>
|
|
1010
|
-
<div data-bind="if: showMonths" class="d-flex align-items-center">
|
|
1011
|
-
on
|
|
1012
|
-
<select multiple class="form-select" required data-bind="select2: { placeholder: 'Choose Months', allowClear: true }, options: months, selectedOptions: selectedMonths"></select>
|
|
1013
|
-
</div>
|
|
1014
|
-
<div data-bind="if: showAtTime" class="d-flex align-items-center ms-3">
|
|
1015
|
-
at
|
|
1016
|
-
<select class="form-select me-2" style="min-width: 60px;" data-bind="options: hours, value: selectedHour"></select>
|
|
1017
|
-
<select class="form-select me-2" style="min-width: 60px;" data-bind="options: minutes, value: selectedMinute"></select>
|
|
1018
|
-
<select class="form-select" style="min-width: 80px;" data-bind="value: selectedAmPm">
|
|
1019
|
-
<option>AM</option>
|
|
1020
|
-
<option>PM</option>
|
|
1021
|
-
</select>
|
|
1022
|
-
</div>
|
|
1023
|
-
</div>
|
|
1024
|
-
</div>
|
|
1025
|
-
|
|
1026
|
-
<div class="alert alert-info">
|
|
1027
|
-
Report will be run and emailed <span data-bind="text: selectedOption() != 'once' ? 'every' : ''"></span> <span data-bind="text: selectedOption"></span>
|
|
1028
|
-
<span data-bind="if: selectedOption() == 'once'">
|
|
1029
|
-
on <span class="error" data-bind="visible: !selectedDate()">Please pick a Date</span> <span data-bind="text: selectedDate"></span>
|
|
1030
|
-
</span>
|
|
1031
|
-
<span data-bind="if: showDays">
|
|
1032
|
-
on <span class="error" data-bind="visible: selectedDays().length == 0">Please pick Day(s)</span> <span data-bind="text: selectedDays"></span>
|
|
1033
|
-
</span>
|
|
1034
|
-
<span data-bind="if: showDates">
|
|
1035
|
-
on <span class="error" data-bind="visible: selectedDates().length == 0">Please pick Date(s)</span>
|
|
1036
|
-
<span data-bind="foreach: selectedDates"><span data-bind="visible: $index()>0">, </span><span data-bind="text: $data == 1 ? '1st': ($data == 2 ? '2nd' : ($data == 3 ? '3rd' : ($data == 31 ? '31st' : $data+'th')))"></span></span>
|
|
1037
|
-
</span>
|
|
1038
|
-
<span data-bind="if: showMonths">
|
|
1039
|
-
of <span class="error" data-bind="visible: selectedMonths().length == 0">Please pick Month(s)</span> <span data-bind="text: selectedMonths"></span>
|
|
1040
|
-
</span>
|
|
1041
|
-
<span data-bind="if: showAtTime">
|
|
1042
|
-
at <span data-bind="text: selectedHour"></span>:<span data-bind="text: selectedMinute"></span> <span data-bind="text: selectedAmPm"></span>
|
|
1043
|
-
</span>
|
|
1044
|
-
</div>
|
|
1045
|
-
<div class="mb-3">
|
|
1046
|
-
<div class="row g-3">
|
|
1047
|
-
<label class="col-sm-3 col-form-label">Email to</label>
|
|
1048
|
-
<div class="col-sm-6">
|
|
1049
|
-
<input type="text" class="form-control" data-bind="value: emailTo" placeholder="Enter Email Addresses separated by comma to send the Report to" required />
|
|
1050
|
-
</div>
|
|
1051
|
-
<label class="col-sm-1 col-form-label">Format</label>
|
|
1052
|
-
<div class="col-sm-2">
|
|
1053
|
-
<select class="form-select" data-bind="value: format,event: { change: onFormatChange }">
|
|
1054
|
-
<option value="EXCEL">Excel</option>
|
|
1055
|
-
<option data-bind="visible: $parent.canDrilldown && $parent.canDrilldown()" value="EXCEL-SUB">Excel (Expanded)</option>
|
|
1056
|
-
<option value="CSV">CSV</option>
|
|
1057
|
-
<option value="PDF">PDF</option>
|
|
1058
|
-
<option value="WORD">Word</option>
|
|
1059
|
-
<option value="LINK">Link</option>
|
|
1060
|
-
</select>
|
|
1061
|
-
</div>
|
|
1062
|
-
</div>
|
|
1063
|
-
</div>
|
|
1064
|
-
<div class="mb-3">
|
|
1065
|
-
<div class="row g-3">
|
|
1066
|
-
<label class="col-sm-3 col-form-label">Pick Time Zone</label>
|
|
1067
|
-
<div class="col-sm-9">
|
|
1068
|
-
<select class="form-select" data-bind="options: timezonOption,
|
|
1069
|
-
optionsText: 'displayName',
|
|
1070
|
-
optionsValue: 'timeZoneId',
|
|
1071
|
-
value: selectedTimezone,
|
|
1072
|
-
select2: {dropdownParent: $('#schedule-builder-div'), allowClear: true, placeholder: 'Set a time zone to send report'}">
|
|
1073
|
-
</select>
|
|
1074
|
-
</div>
|
|
1075
|
-
</div>
|
|
1076
|
-
</div>
|
|
1077
|
-
<div class="mb-3">
|
|
1078
|
-
<div class="row g-3">
|
|
1079
|
-
<div class="col-sm-3">
|
|
1080
|
-
<div class="form-check" title="Set a date to start sending scheduled report">
|
|
1081
|
-
<input class="form-check-input" type="checkbox" data-bind="checked: hasScheduleStart" id="scheduleStartCheckbox">
|
|
1082
|
-
<label class="form-check-label" for="scheduleStartCheckbox">
|
|
1083
|
-
Schedule Start Date
|
|
1084
|
-
</label>
|
|
1085
|
-
</div>
|
|
1086
|
-
</div>
|
|
1087
|
-
<div class="col-sm-4" data-bind="if: hasScheduleStart">
|
|
1088
|
-
<input type="text" class="form-control" data-bind="datepicker: scheduleStart, datepickerOptions: {value: scheduleStart}" title="Scheduled Report will not be sent before this date" required />
|
|
1089
|
-
</div>
|
|
1090
|
-
</div>
|
|
1091
|
-
</div>
|
|
1092
|
-
<div class="mb-3">
|
|
1093
|
-
<div class="row g-3">
|
|
1094
|
-
<div class="col-sm-3">
|
|
1095
|
-
<div class="form-check" title="Set a date to stop sending scheduled report">
|
|
1096
|
-
<input class="form-check-input" type="checkbox" data-bind="checked: hasScheduleEnd" id="scheduleEndCheckbox">
|
|
1097
|
-
<label class="form-check-label" for="scheduleEndCheckbox">
|
|
1098
|
-
Schedule End Date
|
|
1099
|
-
</label>
|
|
1100
|
-
</div>
|
|
1101
|
-
</div>
|
|
1102
|
-
<div class="col-sm-4" data-bind="if: hasScheduleEnd">
|
|
1103
|
-
<input type="text" class="form-control" data-bind="datepicker: scheduleEnd, datepickerOptions: {value: scheduleEnd}" title="Scheduled Report will not be sent after this date" required />
|
|
1104
|
-
</div>
|
|
1105
|
-
</div>
|
|
1106
|
-
</div>
|
|
1107
|
-
</div>
|
|
1108
|
-
</div>
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
</script>
|
|
1112
|
-
|
|
1113
|
-
<script type="text/html" id="report-field-options">
|
|
1114
|
-
<div class="modal-dialog" style="max-width: 750px;">
|
|
1115
|
-
<div class="modal-content" data-bind="with: editFieldOptions">
|
|
1116
|
-
<div class="modal-header">
|
|
1117
|
-
<h5 class="modal-title"><span data-bind="text: fieldName"></span> - Setup Additional Field Options</h5>
|
|
1118
|
-
</div>
|
|
1119
|
-
<div class="modal-body needs-validation">
|
|
1120
|
-
<div class="card card-body">
|
|
1121
|
-
<b>Column Format Settings</b>
|
|
1122
|
-
<div class="form-group row">
|
|
1123
|
-
<label class="col-sm-5 col-md-5 control-label">Pick Data Format</label>
|
|
1124
|
-
<div class="col-sm-7 col-md-7">
|
|
1125
|
-
<select class="form-select" data-bind="options: ['Days', 'Hours', 'Minutes', 'Seconds'].indexOf(fieldFormat()) >= 0 ? ['Days', 'Hours', 'Minutes', 'Seconds'] : $parents[1].fieldFormatTypes, value: fieldFormat"></select>
|
|
1126
|
-
</div>
|
|
1127
|
-
</div>
|
|
1128
|
-
<div class="form-group row" data-bind="visible: $parents[1].decimalFormatTypes.indexOf($data.fieldFormat())>=0">
|
|
1129
|
-
<label class="col-sm-5 col-md-5 control-label">Pick Decimal Places</label>
|
|
1130
|
-
<div class="col-sm-7 col-md-7">
|
|
1131
|
-
<input type="number" class="form-control" data-bind="value: decimalPlaces" placeholder="" />
|
|
1132
|
-
</div>
|
|
1133
|
-
</div>
|
|
1134
|
-
<div class="form-group row" data-bind="visible: fieldFormat()=='Currency'">
|
|
1135
|
-
<label class="col-sm-5 col-md-5 control-label">Pick Currency Format</label>
|
|
1136
|
-
<div class="col-sm-7 col-md-7">
|
|
1137
|
-
<select class="form-select" required data-bind="options: $parents[1].currencyFormats, optionsText: 'display',optionsValue: 'value', value: currencyFormat"></select>
|
|
1138
|
-
</div>
|
|
1139
|
-
</div>
|
|
1140
|
-
<div class="form-group row" data-bind="visible: fieldFormat()=='Date'">
|
|
1141
|
-
<label class="col-sm-5 col-md-5 control-label">Pick Date Format</label>
|
|
1142
|
-
<div class="col-sm-7 col-md-7">
|
|
1143
|
-
<select class="form-select" data-bind="options: $parents[1].dateFormats, value: dateFormat"></select>
|
|
1144
|
-
</div>
|
|
1145
|
-
</div>
|
|
1146
|
-
<div class="form-group row" data-bind="visible:selectedAggregate()=='Pivot' && fieldFormat()=='Date'">
|
|
1147
|
-
<label class="col-sm-5 col-md-5 control-label">Pivot Drilldown Date Format</label>
|
|
1148
|
-
<div class="col-sm-7 col-md-7">
|
|
1149
|
-
<select class="form-select" data-bind="options: ['', 'Day', 'Month', 'Year', 'Month/Year'], value: drillDataFormat"></select>
|
|
1150
|
-
</div>
|
|
1151
|
-
</div>
|
|
1152
|
-
|
|
1153
|
-
<div class="form-group row" data-bind="visible: fieldFormat()=='Date' && dateFormat()==='Custom'">
|
|
1154
|
-
<label class="col-sm-5 col-md-5 control-label">Enter Custom Date Format</label>
|
|
1155
|
-
<div class="col-sm-7 col-md-7">
|
|
1156
|
-
<input type="text" class="form-control" data-bind="value: customDateFormat" placeholder="dd/mm/yyyy" />
|
|
1157
|
-
</div>
|
|
1158
|
-
</div>
|
|
1159
|
-
<div class="form-group row">
|
|
1160
|
-
<label class="col-sm-5 col-md-5 control-label">Choose Column Label</label>
|
|
1161
|
-
<div class="col-sm-7 col-md-7">
|
|
1162
|
-
<input type="text" class="form-control" data-bind="value: fieldLabel" />
|
|
1163
|
-
</div>
|
|
1164
|
-
</div>
|
|
1165
|
-
<div class="form-group row">
|
|
1166
|
-
<label class="col-sm-5 col-md-5 control-label">Inner Column Label</label>
|
|
1167
|
-
<div class="col-sm-7 col-md-7">
|
|
1168
|
-
<input type="text" class="form-control" data-bind="value: fieldLabel2" />
|
|
1169
|
-
</div>
|
|
1170
|
-
</div>
|
|
1171
|
-
<div class="form-group row">
|
|
1172
|
-
<label class="col-sm-5 col-md-5 control-label">Choose Text Alignment</label>
|
|
1173
|
-
<div class="col-sm-7 col-md-7">
|
|
1174
|
-
<select class="form-select" data-bind="options: $parents[1].fieldAlignments, value: fieldAlign"></select>
|
|
1175
|
-
</div>
|
|
1176
|
-
</div>
|
|
1177
|
-
<div class="form-group row">
|
|
1178
|
-
<label class="col-sm-5 col-md-5 control-label">Choose Width (leave blank for auto)</label>
|
|
1179
|
-
<div class="col-sm-7 col-md-7">
|
|
1180
|
-
<input type="text" class="form-control" data-bind="value: fieldWidth" />
|
|
1181
|
-
</div>
|
|
1182
|
-
</div>
|
|
1183
|
-
</div>
|
|
1184
|
-
<br />
|
|
1185
|
-
<div class="card card-body">
|
|
1186
|
-
<div class="form-row align-items-center">
|
|
1187
|
-
<div class="col-auto">
|
|
1188
|
-
<b>Header Settings</b>
|
|
1189
|
-
</div>
|
|
1190
|
-
</div>
|
|
1191
|
-
<div class="row mb-3">
|
|
1192
|
-
<div class="col">
|
|
1193
|
-
<div class="mb-3">
|
|
1194
|
-
<label class="form-label">Pick Text Color</label>
|
|
1195
|
-
<div class="d-flex">
|
|
1196
|
-
<input type="color" style="width: 50px; height: 38px;" class="form-control me-2" data-bind="value: headerFontColor" />
|
|
1197
|
-
<input type="text" style="width: 100px" class="form-control me-2" data-bind="value: headerFontColor" />
|
|
1198
|
-
<button class="btn btn-sm btn-secondary" title="Apply to all columns" data-bind="click: function(){applyAllHeaderFontColor(!applyAllHeaderFontColor()); }">
|
|
1199
|
-
<span class="fa" data-bind="css: applyAllHeaderFontColor() ? 'fa-check' : 'fa-paste'"></span>
|
|
1200
|
-
</button>
|
|
1201
|
-
</div>
|
|
1202
|
-
</div>
|
|
1203
|
-
</div>
|
|
1204
|
-
<div class="col">
|
|
1205
|
-
<div class="mb-3">
|
|
1206
|
-
<label class="form-label">Pick Background Color</label>
|
|
1207
|
-
<div class="d-flex">
|
|
1208
|
-
<input type="color" style="width: 50px; height: 38px;" class="form-control me-2" data-bind="value: headerBackColor" />
|
|
1209
|
-
<input type="text" style="width: 100px" class="form-control me-2" data-bind="value: headerBackColor" />
|
|
1210
|
-
<button class="btn btn-sm btn-secondary" title="Apply to all columns" data-bind="click: function(){applyAllHeaderBackColor(!applyAllHeaderBackColor()); }">
|
|
1211
|
-
<span class="fa" data-bind="css: applyAllHeaderBackColor() ? 'fa-check' : 'fa-paste'"></span>
|
|
1212
|
-
</button>
|
|
1213
|
-
</div>
|
|
1214
|
-
</div>
|
|
1215
|
-
</div>
|
|
1216
|
-
<div class="col d-flex align-items-center">
|
|
1217
|
-
<div class="form-check me-3">
|
|
1218
|
-
<input class="form-check-input" type="checkbox" data-bind="checked: headerFontBold" id="headerFontBoldCheckbox">
|
|
1219
|
-
<label class="form-check-label" for="headerFontBoldCheckbox">
|
|
1220
|
-
Bold Text
|
|
1221
|
-
</label>
|
|
1222
|
-
</div>
|
|
1223
|
-
<button class="btn btn-sm btn-secondary" title="Apply to all columns" data-bind="click: function(){applyAllHeaderBold(!applyAllHeaderBold()); }">
|
|
1224
|
-
<span class="fa" data-bind="css: applyAllHeaderBold() ? 'fa-check' : 'fa-paste'"></span>
|
|
1225
|
-
</button>
|
|
1226
|
-
</div>
|
|
1227
|
-
</div>
|
|
1228
|
-
</div>
|
|
1229
|
-
<br />
|
|
1230
|
-
<div class="card card-body">
|
|
1231
|
-
<div class="form-row align-items-center">
|
|
1232
|
-
<div class="col-auto">
|
|
1233
|
-
<b>Text Settings</b>
|
|
1234
|
-
</div>
|
|
1235
|
-
</div>
|
|
1236
|
-
<div class="row mb-3">
|
|
1237
|
-
<div class="col">
|
|
1238
|
-
<div class="mb-3">
|
|
1239
|
-
<label class="form-label">Pick Text Color</label>
|
|
1240
|
-
<div class="d-flex">
|
|
1241
|
-
<input type="color" style="width: 50px; height: 38px;" class="form-control me-2" data-bind="value: fontColor" />
|
|
1242
|
-
<input type="text" style="width: 100px;" class="form-control me-2" data-bind="value: fontColor" />
|
|
1243
|
-
<button class="btn btn-sm btn-secondary" title="Apply to all columns" data-bind="click: function(){applyAllFontColor(!applyAllFontColor()); }">
|
|
1244
|
-
<span class="fa" data-bind="css: applyAllFontColor() ? 'fa-check' : 'fa-paste'"></span>
|
|
1245
|
-
</button>
|
|
1246
|
-
</div>
|
|
1247
|
-
</div>
|
|
1248
|
-
</div>
|
|
1249
|
-
<div class="col">
|
|
1250
|
-
<div class="mb-3">
|
|
1251
|
-
<label class="form-label">Pick Background Color</label>
|
|
1252
|
-
<div class="d-flex">
|
|
1253
|
-
<input type="color" style="width: 50px; height: 38px;" class="form-control me-2" data-bind="value: backColor" />
|
|
1254
|
-
<input type="text" style="width: 100px;" class="form-control me-2" data-bind="value: backColor" />
|
|
1255
|
-
<button class="btn btn-sm btn-secondary" title="Apply to all columns" data-bind="click: function(){applyAllBackColor(!applyAllBackColor()); }">
|
|
1256
|
-
<span class="fa" data-bind="css: applyAllBackColor() ? 'fa-check' : 'fa-paste'"></span>
|
|
1257
|
-
</button>
|
|
1258
|
-
</div>
|
|
1259
|
-
</div>
|
|
1260
|
-
</div>
|
|
1261
|
-
<div class="col d-flex align-items-center">
|
|
1262
|
-
<div class="form-check me-3">
|
|
1263
|
-
<input class="form-check-input" type="checkbox" data-bind="checked: fontBold" id="fontBoldCheckbox">
|
|
1264
|
-
<label class="form-check-label" for="fontBoldCheckbox">
|
|
1265
|
-
Bold Text
|
|
1266
|
-
</label>
|
|
1267
|
-
</div>
|
|
1268
|
-
<button class="btn btn-sm btn-secondary" title="Apply to all columns" data-bind="click: function(){applyAllBold(!applyAllBold()); }">
|
|
1269
|
-
<span class="fa" data-bind="css: applyAllBold() ? 'fa-check' : 'fa-paste'"></span>
|
|
1270
|
-
</button>
|
|
1271
|
-
</div>
|
|
1272
|
-
</div>
|
|
1273
|
-
</div>
|
|
1274
|
-
<div class="padded-div">
|
|
1275
|
-
<button class="btn btn-sm btn-primary" data-bind="click: function() {addConditionalFormatSetting(null)}">Add Conditional Formatting</button>
|
|
1276
|
-
</div>
|
|
1277
|
-
<div data-bind="foreach: fieldCondtionalFormats" style="padding-left: 40px;">
|
|
1278
|
-
<div class="card card-body">
|
|
1279
|
-
<div class="row m-2">
|
|
1280
|
-
<div class="col d-flex justify-content-start">
|
|
1281
|
-
<b>Conditional Format #<span data-bind="text: $index()+1"></span></b>
|
|
1282
|
-
</div>
|
|
1283
|
-
<div class="col d-flex justify-content-end">
|
|
1284
|
-
<button class="btn btn-sm btn-secondary" data-bind="click: $parent.removeSetting">Remove</button>
|
|
1285
|
-
</div>
|
|
1286
|
-
</div>
|
|
1287
|
-
<div class="row mb-3">
|
|
1288
|
-
<div class="col">
|
|
1289
|
-
<div class="mb-3">
|
|
1290
|
-
<label class="form-label">Pick Text Color</label>
|
|
1291
|
-
<div class="d-flex">
|
|
1292
|
-
<input type="color" style="width: 50px; height: 38px;" class="form-control me-2" data-bind="value: fontColor" />
|
|
1293
|
-
<input type="text" style="width: 100px;" class="form-control me-2" data-bind="value: fontColor" />
|
|
1294
|
-
</div>
|
|
1295
|
-
</div>
|
|
1296
|
-
</div>
|
|
1297
|
-
<div class="col">
|
|
1298
|
-
<div class="mb-3">
|
|
1299
|
-
<label class="form-label">Pick Background Color</label>
|
|
1300
|
-
<div class="d-flex">
|
|
1301
|
-
<input type="color" style="width: 50px; height: 38px;" class="form-control me-2" data-bind="value: backColor" />
|
|
1302
|
-
<input type="text" style="width: 100px;" class="form-control me-2" data-bind="value: backColor" />
|
|
1303
|
-
</div>
|
|
1304
|
-
</div>
|
|
1305
|
-
</div>
|
|
1306
|
-
<div class="col d-flex align-items-center">
|
|
1307
|
-
<div class="form-check me-3">
|
|
1308
|
-
<input class="form-check-input" type="checkbox" data-bind="checked: fontBold" id="fontBoldCheckbox">
|
|
1309
|
-
<label class="form-check-label" for="fontBoldCheckbox">
|
|
1310
|
-
Bold Text
|
|
1311
|
-
</label>
|
|
1312
|
-
</div>
|
|
1313
|
-
</div>
|
|
1314
|
-
</div>
|
|
1315
|
-
|
|
1316
|
-
<div class="row m-2" data-bind="foreach: filter.Filters">
|
|
1317
|
-
<div class="col-md-2">
|
|
1318
|
-
Value
|
|
1319
|
-
</div>
|
|
1320
|
-
<div class="col-md-4">
|
|
1321
|
-
<div data-bind="with: Field">
|
|
1322
|
-
<div class="form-group">
|
|
1323
|
-
<select class="form-select" style="width: 100%;" data-bind="options: fieldFilter, value: $parent.Operator" required></select>
|
|
1324
|
-
</div>
|
|
1325
|
-
</div>
|
|
1326
|
-
</div>
|
|
1327
|
-
<div class="col-md-4">
|
|
1328
|
-
<div data-bind="with: Field" data-parentprefix="C">
|
|
1329
|
-
<div data-bind="template: 'report-filter', data: $data"></div>
|
|
1330
|
-
</div>
|
|
1331
|
-
</div>
|
|
1332
|
-
</div>
|
|
1333
|
-
</div>
|
|
1334
|
-
</div>
|
|
1335
|
-
<br />
|
|
1336
|
-
<div class="form-group row" data-bind="if: $parents[1].useStoredProc()">
|
|
1337
|
-
<div class="col-sm-12">
|
|
1338
|
-
<div class="checkbox pull-left" style="padding-top: 5px;">
|
|
1339
|
-
<label>
|
|
1340
|
-
<input type="checkbox" data-bind="checked: checkOuterGroup" />
|
|
1341
|
-
Outer Group
|
|
1342
|
-
</label>
|
|
1343
|
-
</div>
|
|
1344
|
-
</div>
|
|
1345
|
-
</div>
|
|
1346
|
-
</div>
|
|
1347
|
-
<div class="modal-footer">
|
|
1348
|
-
<button type="button" class="btn btn-danger" data-bind="click: cancelFieldOptions">Cancel</button>
|
|
1349
|
-
<button type="button" class="btn btn-primary" data-bind="click: saveFieldOptions">Save Changes</button>
|
|
1350
|
-
</div>
|
|
1351
|
-
</div>
|
|
1352
|
-
</div>
|
|
1353
|
-
</script>
|
|
1354
|
-
|
|
1355
|
-
<script type="text/html" id="report-link-edit">
|
|
1356
|
-
<div class="modal-dialog" style="max-width: 750px;">
|
|
1357
|
-
<div class="modal-content" data-bind="with: editLinkField">
|
|
1358
|
-
<div class="modal-header">
|
|
1359
|
-
<h5 class="modal-title">Setup Link Field</h5>
|
|
1360
|
-
</div>
|
|
1361
|
-
<div class="modal-body needs-validation" data-bind="with: linkFieldItem">
|
|
1362
|
-
<div class="form-group row">
|
|
1363
|
-
<label class="col-sm-5 col-md-5 control-label">This field will link to</label>
|
|
1364
|
-
<div class="col-sm-7 col-md-7">
|
|
1365
|
-
<select class="form-select" required data-bind="options: linkTypes, value: selectedLinkType"></select>
|
|
1366
|
-
</div>
|
|
1367
|
-
</div>
|
|
1368
|
-
<div data-bind="if: LinksToReport">
|
|
1369
|
-
<div class="form-group row">
|
|
1370
|
-
<label class="col-sm-5 col-md-5 control-label">Link to this Report</label>
|
|
1371
|
-
<div class="col-sm-7 col-md-7">
|
|
1372
|
-
<select class="form-select" required data-bind="options: $parentContext.$parent.SavedReports, optionsText: 'reportName', optionsValue: 'reportId', value: LinkedToReportId, optionsCaption: 'Choose the Report to link to'"></select>
|
|
1373
|
-
</div>
|
|
1374
|
-
</div>
|
|
1375
|
-
<div class="checkbox" data-bind="if: LinkedToReportId">
|
|
1376
|
-
<label>
|
|
1377
|
-
<input type="checkbox" data-bind="checked: SendAsFilterParameter" />
|
|
1378
|
-
Send field value as Report Filter Parameter
|
|
1379
|
-
</label>
|
|
1380
|
-
</div>
|
|
1381
|
-
<div class="form-group row" data-bind="if: SendAsFilterParameter">
|
|
1382
|
-
<label class="col-sm-5 col-md-5 control-label">Link to this Report Filter</label>
|
|
1383
|
-
<div class="col-sm-7 col-md-7">
|
|
1384
|
-
<select class="form-select" required data-bind="options: allFields, optionsText: 'fieldName', optionsValue: 'fieldId', value: SelectedFilterId, optionsCaption: 'Choose the Field to Filter by value'"></select>
|
|
1385
|
-
</div>
|
|
1386
|
-
</div>
|
|
1387
|
-
</div>
|
|
1388
|
-
<div data-bind="ifnot: LinksToReport">
|
|
1389
|
-
<div class="form-group row">
|
|
1390
|
-
<label class="col-sm-5 col-md-5 control-label">Link to this URL</label>
|
|
1391
|
-
<div class="col-sm-7 col-md-7">
|
|
1392
|
-
<input type="text" class="form-control" required placeholder="Enter a url to open" data-bind="value: LinkToUrl" title="Valid URL needs to start with http:// or https://">
|
|
1393
|
-
</div>
|
|
1394
|
-
</div>
|
|
1395
|
-
<div class="checkbox">
|
|
1396
|
-
<label>
|
|
1397
|
-
<input type="checkbox" data-bind="checked: SendAsQueryParameter" />
|
|
1398
|
-
Send field value as Query Parameter
|
|
1399
|
-
</label>
|
|
1400
|
-
</div>
|
|
1401
|
-
<div class="form-group row" data-bind="if: SendAsQueryParameter">
|
|
1402
|
-
<label class="col-sm-5 col-md-5 control-label">Parameter Name to use</label>
|
|
1403
|
-
<div class="col-sm-7 col-md-7">
|
|
1404
|
-
<input type="text" class="form-control" required placeholder="Enter parameter name to send value as" data-bind="value: QueryParameterName">
|
|
1405
|
-
</div>
|
|
1406
|
-
</div>
|
|
1407
|
-
<br />
|
|
1408
|
-
</div>
|
|
1409
|
-
</div>
|
|
1410
|
-
<div class="modal-footer">
|
|
1411
|
-
<button type="button" class="btn btn-danger" data-bind="click: removeLinkField">Remove Link</button>
|
|
1412
|
-
<button type="button" class="btn btn-primary" data-bind="click: saveLinkField">Save Changes</button>
|
|
1413
|
-
</div>
|
|
1414
|
-
</div>
|
|
1415
|
-
</div>
|
|
1416
|
-
</script>
|
|
1417
|
-
|
|
1418
|
-
<script type="text/html" id="designer-choose-visual">
|
|
1419
|
-
<div class="btn-group" role="group" aria-label="Visualization Options">
|
|
1420
|
-
<button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('List'); }, css: { active: ReportType()=='List' }">
|
|
1421
|
-
<span class="fa fa-2x fa-list-alt"></span>
|
|
1422
|
-
<p>List</p>
|
|
1423
|
-
</button>
|
|
1424
|
-
<button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Summary'); }, css: { active: ReportType()=='Summary' }">
|
|
1425
|
-
<span class="fa fa-2x fa-table"></span>
|
|
1426
|
-
<p>Summary</p>
|
|
1427
|
-
</button>
|
|
1428
|
-
<button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Bar'); }, css: { active: ReportType()=='Bar' }">
|
|
1429
|
-
<span class="fa fa-2x fa-bar-chart"></span>
|
|
1430
|
-
<p>Bar</p>
|
|
1431
|
-
</button>
|
|
1432
|
-
<button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Pie'); }, css: { active: ReportType()=='Pie' }">
|
|
1433
|
-
<span class="fa fa-2x fa-pie-chart"></span>
|
|
1434
|
-
<p>Pie</p>
|
|
1435
|
-
</button>
|
|
1436
|
-
<button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Line'); }, css: { active: ReportType()=='Line' }">
|
|
1437
|
-
<span class="fa fa-2x fa-line-chart"></span>
|
|
1438
|
-
<p>Line</p>
|
|
1439
|
-
</button>
|
|
1440
|
-
<button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Combo'); }, css: { active: ReportType()=='Combo' }">
|
|
1441
|
-
<span class="fa fa-2x fa-signal"></span>
|
|
1442
|
-
<p>Combo</p>
|
|
1443
|
-
</button>
|
|
1444
|
-
<button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Html'); }, css: { active: ReportType()=='Html' }">
|
|
1445
|
-
<span class="fa fa-2x fa-code"></span>
|
|
1446
|
-
<p>Custom</p>
|
|
1447
|
-
</button>
|
|
1448
|
-
<button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Map'); }, css: { active: ReportType().indexOf('Map')==0 }">
|
|
1449
|
-
<span class="fa fa-2x fa-globe"></span>
|
|
1450
|
-
<p>Map</p>
|
|
1451
|
-
</button>
|
|
1452
|
-
<button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('HeatMap'); }, css: { active: ReportType().indexOf('HeatMap')==0 }">
|
|
1453
|
-
<span class="fa fa-2x fa-map"></span>
|
|
1454
|
-
<p>HeatMap</p>
|
|
1455
|
-
</button>
|
|
1456
|
-
<button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Single'); }, css: { active: ReportType()=='Single' }">
|
|
1457
|
-
<span class="fa fa-2x fa-window-maximize"></span>
|
|
1458
|
-
<p>KPI</p>
|
|
1459
|
-
</button>
|
|
1460
|
-
<button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Treemap'); }, css: { active: ReportType()=='Treemap' }">
|
|
1461
|
-
<span class="fa fa-2x fa-window-restore"></span>
|
|
1462
|
-
<p>Treemap</p>
|
|
1463
|
-
</button>
|
|
1464
|
-
<button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Pivot'); }, css: { active: ReportType()=='Pivot' }">
|
|
1465
|
-
<span class="fa fa-2x fa-random"></span>
|
|
1466
|
-
<p>Transpose</p>
|
|
1467
|
-
</button>
|
|
1468
|
-
</div>
|
|
1469
|
-
</script>
|
|
1470
|
-
|
|
1471
|
-
<script type="text/html" id="designer-choose-data">
|
|
1472
|
-
<div>
|
|
1473
|
-
<div class="pull-left btn-group btn-group-toggle" role="group" data-bind="if: ReportID() <= 0">
|
|
1474
|
-
<label class="btn btn-sm btn-light active" style="margin-right: 0px;" title="You can change the Data source only when creating a new report, changing this will clear all selections">
|
|
1475
|
-
<input type="radio" name="dataoption" id="table" checked data-bind="checked: useStoredProc, checkedValue: false"> Dynamic
|
|
1476
|
-
</label>
|
|
1477
|
-
<label class="btn btn-sm btn-light active">
|
|
1478
|
-
<input type="radio" name="dataoption" id="proc" value="1" data-bind="checked: useStoredProc, checkedValue: true"> Predefined
|
|
1479
|
-
</label>
|
|
1480
|
-
</div>
|
|
1481
|
-
<div class="pull-right">
|
|
1482
|
-
<a href="#" class="btn btn-secondary btn-sm" title="Add Custom Field using Formula" data-bind="hidden: isFunctionField() || useStoredProc(), click: cancelFormulaField, text: isFormulaField()? 'Cancel': 'Custom Field', css: {'btn-primary': !isFormulaField(), 'btn-danger': isFormulaField}"></a>
|
|
1483
|
-
<a href="#" class="btn btn-secondary btn-sm" title="Add Custom Field using Function" data-bind="hidden: true || isFormulaField() || useStoredProc(), click: function(){designFunctionField()}, text: isFunctionField()? 'Cancel': 'Function Field', css: {'btn-primary': !isFunctionField(), 'btn-danger': isFunctionField}"></a>
|
|
1484
|
-
</div>
|
|
1485
|
-
</div>
|
|
1486
|
-
<div class="clearfix"></div>
|
|
1487
|
-
<div class="row">
|
|
1488
|
-
<div class="col-md-12" data-bind="disable: isFormulaField, hidden: useStoredProc">
|
|
1489
|
-
<div data-bind="with: textQuery.searchFields">
|
|
1490
|
-
<select id="search-field" class="form-control" data-bind="select2: {dropdownParent: $root.activeDesign() ? $('#choose-data-design') : $('#choose-data-card'), placeholder: 'Search for a Data Field...', ajax: { url: url, dataType: 'json', data: query, processResults: processResults, headers: headers }, minimumInputLength: 2, allowClear: true }, value: selectedOption"></select>
|
|
1491
|
-
</div>
|
|
1492
|
-
</div>
|
|
1493
|
-
|
|
1494
|
-
<div class="col-md-12" data-bind="visible: useStoredProc">
|
|
1495
|
-
<div>
|
|
1496
|
-
<select class="form-control" data-bind="select2Value: {dropdownParent: $root.activeDesign() ? $('#choose-data-design') : $('#choose-data-card')}, options: Procs, optionsCaption: 'Choose Section...', optionsText: 'DisplayName', value: SelectedProc, visible: useStoredProc"></select>
|
|
1497
|
-
</div>
|
|
1498
|
-
</div>
|
|
1499
|
-
<div class="col-md-12" data-bind="hidden: useStoredProc">
|
|
1500
|
-
<div class="d-flex justify-content-between align-items-center mb-2" style="padding-top: 15px;">
|
|
1501
|
-
<span>
|
|
1502
|
-
Select Data to use in Report
|
|
1503
|
-
<i class="fa fa-info-circle text-muted" data-toggle="tooltip" title="Choose a table to show fields to select."></i>
|
|
1504
|
-
</span>
|
|
1505
|
-
</div>
|
|
1506
|
-
|
|
1507
|
-
<div class="data-select-tree">
|
|
1508
|
-
<!-- ko foreach: CategorizedTables -->
|
|
1509
|
-
<div class="mb-3">
|
|
1510
|
-
<div data-bind="click: function() { isExpanded(!isExpanded()); }, visible: categoryName" style="cursor: pointer;">
|
|
1511
|
-
<i class="fa" data-bind="css: isExpanded() ? 'fa-chevron-down text-secondary' : 'fa-chevron-right text-secondary'"></i>
|
|
1512
|
-
<i class="fa" data-bind="css: isExpanded() ? 'fa-folder-open' : 'fa-folder'"></i>
|
|
1513
|
-
<span data-bind="text: categoryName" class="ml-2"></span>
|
|
1514
|
-
</div>
|
|
1515
|
-
<div class="report-list" data-bind="visible: isExpanded(), foreach: tables" style="padding-left: 15px;">
|
|
1516
|
-
<div class="row border-bottom py-2 w-100">
|
|
1517
|
-
<div class="col-md-12">
|
|
1518
|
-
<div class="pull-left" data-bind="click: function() { selectTable($data); }, css: {'text-muted': !isEnabled()}, style: {cursor: isEnabled() ? 'pointer' : ''}, attr: {title: !isEnabled() ? 'Cannot use table as joins do not exist': ''}">
|
|
1519
|
-
<span class="text-secondary fa" data-bind="css: isEnabled() ? ($data === $parents[1].SelectedTable() ? 'fa-chevron-down' : 'fa-chevron-right') : 'fa-ban'"></span>
|
|
1520
|
-
<span class="fa fa-table"></span> <span data-bind="text: tableName" class=""></span>
|
|
1521
|
-
</div>
|
|
1522
|
-
<div class="pull-right" data-bind="visible: $data === $parents[1].SelectedTable() && !$parents[1].isFormulaField() && !$parents[1].SelectedTable().dynamicColumns">
|
|
1523
|
-
<a href="#" class="small text-muted" data-bind="click: $parents[1].MoveAllFields">Select all</a> |
|
|
1524
|
-
<a href="#" class="small text-muted" data-bind="click: $parents[1].RemoveSelectedFields">Remove all</a>
|
|
1525
|
-
</div>
|
|
1526
|
-
</div>
|
|
1527
|
-
|
|
1528
|
-
<!-- Fields Expand Here -->
|
|
1529
|
-
<div data-bind="visible: $data === $parents[1].SelectedTable()" style="padding-left: 30px;">
|
|
1530
|
-
<!-- ko foreach: $parents[1].ChooseFields -->
|
|
1531
|
-
<div class="row border-bottom py-2 align-items-center w-100">
|
|
1532
|
-
<div class="checkbox">
|
|
1533
|
-
<label>
|
|
1534
|
-
<input type="checkbox" data-bind="checkedInArray: {array: $parents[2].isFormulaField() ? $parents[2].formulaFields : $parents[2].SelectedFields, value: $data}">
|
|
1535
|
-
<span data-bind="text: fieldName"></span>
|
|
1536
|
-
</label>
|
|
1537
|
-
</div>
|
|
1538
|
-
</div>
|
|
1539
|
-
<!--/ko-->
|
|
1540
|
-
</div>
|
|
1541
|
-
</div>
|
|
1542
|
-
</div>
|
|
1543
|
-
</div>
|
|
1544
|
-
<!-- /ko -->
|
|
1545
|
-
</div>
|
|
1546
|
-
</div>
|
|
1547
|
-
</div>
|
|
1548
|
-
</script>
|
|
1549
|
-
|
|
1550
|
-
<script type="text/html" id="designer-selected-data">
|
|
1551
|
-
<div data-bind="visible: SelectedFields().length == 0">
|
|
1552
|
-
Please choose data
|
|
1553
|
-
</div>
|
|
1554
|
-
<div data-bind="if: SelectedFields().length > 0">
|
|
1555
|
-
<div data-bind="visible: ReportType()=='Bar'" class="card card-body">
|
|
1556
|
-
<div class="alert alert-info small py-1 mb-2">
|
|
1557
|
-
<span class="fa fa-lightbulb-o"></span> For Bar Graph, the first field below will show on the x-axis. All other numeric fields will show on y-axis.
|
|
1558
|
-
</div>
|
|
1559
|
-
<div class="form-group row small">
|
|
1560
|
-
<div class="checkbox col-6">
|
|
1561
|
-
<label>
|
|
1562
|
-
<input type="checkbox" data-bind="checked: barChartHorizontal" />
|
|
1563
|
-
Horizontal Bar Chart
|
|
1564
|
-
</label>
|
|
1565
|
-
</div>
|
|
1566
|
-
<div class="checkbox col-6">
|
|
1567
|
-
<label>
|
|
1568
|
-
<input type="checkbox" data-bind="checked: barChartStacked" />
|
|
1569
|
-
Stacked Bar Chart
|
|
1570
|
-
</label>
|
|
1571
|
-
</div>
|
|
1572
|
-
</div>
|
|
1573
|
-
</div>
|
|
1574
|
-
|
|
1575
|
-
<div data-bind="visible: ReportType()=='Pie'" class="card card-body">
|
|
1576
|
-
<div class="alert alert-info small py-1 mb-2">
|
|
1577
|
-
<span class="fa fa-lightbulb-o"></span> For Pie Graph, the first field below will be grouped, and the first numeric field will show as the ratio.
|
|
1578
|
-
</div>
|
|
1579
|
-
<div class="form-group row small">
|
|
1580
|
-
<div class="checkbox col-6">
|
|
1581
|
-
<label>
|
|
1582
|
-
<input type="checkbox" data-bind="checked: pieChartDonut" />
|
|
1583
|
-
Donut Chart
|
|
1584
|
-
</label>
|
|
1585
|
-
</div>
|
|
1586
|
-
</div>
|
|
1587
|
-
</div>
|
|
1588
|
-
|
|
1589
|
-
<div data-bind="visible: ReportType()=='Treemap'" class="card card-body">
|
|
1590
|
-
<div class="alert alert-info small py-1 mb-0">
|
|
1591
|
-
<span class="fa fa-lightbulb-o"></span> For Treemap, the data must be in a hierarchical format with 2nd column having parent and third column having a numeric value. The data must have a single root node having null as its parent as well.
|
|
1592
|
-
</div>
|
|
1593
|
-
</div>
|
|
1594
|
-
<div data-bind="visible: ReportType()=='HeatMap'" class="card card-body">
|
|
1595
|
-
<div class="alert alert-info mb-3">
|
|
1596
|
-
<span class="fa fa-lightbulb-o fa-2x"></span> For HeatMap, the first two columns must be numeric values representing
|
|
1597
|
-
<strong>Latitude</strong> and <strong>Longitude</strong>. At least one additional numeric column is required to provide the
|
|
1598
|
-
<strong>intensity</strong> of each point.
|
|
1599
|
-
</div>
|
|
1600
|
-
|
|
1601
|
-
<div class="form-group row mb-2">
|
|
1602
|
-
<div class="checkbox col-6">
|
|
1603
|
-
<label>
|
|
1604
|
-
<input type="checkbox" data-bind="checked: heatMapOptions.showMarker" />
|
|
1605
|
-
Show Marker
|
|
1606
|
-
</label>
|
|
1607
|
-
</div>
|
|
1608
|
-
</div>
|
|
1609
|
-
|
|
1610
|
-
<div class="form-group row mb-3">
|
|
1611
|
-
<label class="col-12 fw-bold">Heatmap Colors</label>
|
|
1612
|
-
|
|
1613
|
-
<div class="col-4 mb-2">
|
|
1614
|
-
<input type="color" class="color-picker"
|
|
1615
|
-
data-bind="value: heatMapOptions.gradient1" title="Gradient 1" />
|
|
1616
|
-
</div>
|
|
1617
|
-
<div class="col-4 mb-2">
|
|
1618
|
-
<input type="color" class="color-picker"
|
|
1619
|
-
data-bind="value: heatMapOptions.gradient2" title="Gradient 2" />
|
|
1620
|
-
</div>
|
|
1621
|
-
<div class="col-4 mb-2">
|
|
1622
|
-
<input type="color" class="color-picker"
|
|
1623
|
-
data-bind="value: heatMapOptions.gradient3" title="Gradient 3" />
|
|
1624
|
-
</div>
|
|
1625
|
-
</div>
|
|
1626
|
-
</div>
|
|
1627
|
-
|
|
1628
|
-
<div data-bind="visible: ReportType()=='Line'" class="card card-body">
|
|
1629
|
-
<div class="alert alert-info small py-1 mb-2">
|
|
1630
|
-
<span class="fa fa-lightbulb-o"></span> For Line Graph, the first field below will show on the x-axis. All other fields will numeric fields will show on y-axis.
|
|
1631
|
-
</div>
|
|
1632
|
-
<div class="form-group row small">
|
|
1633
|
-
<div class="checkbox col-6">
|
|
1634
|
-
<label>
|
|
1635
|
-
<input type="checkbox" data-bind="checked: lineChartArea" />
|
|
1636
|
-
Area Chart
|
|
1637
|
-
</label>
|
|
1638
|
-
</div>
|
|
1639
|
-
</div>
|
|
1640
|
-
</div>
|
|
1641
|
-
|
|
1642
|
-
<div data-bind="visible: ReportType()=='Combo'" class="card card-body">
|
|
1643
|
-
<div class="alert alert-info small py-1 mb-2">
|
|
1644
|
-
<span class="fa fa-lightbulb-o"></span> For Combo Graph, the first field below will show on the x-axis. All other numeric fields will show on y-axis, and you can choose display each series as line, bar or area.
|
|
1645
|
-
</div>
|
|
1646
|
-
<div class="form-group row small">
|
|
1647
|
-
<div class="col-6">
|
|
1648
|
-
<label>Default Series Type</label>
|
|
1649
|
-
<select class="form-select form-select-sm" data-bind="options: seriesTypes, value: comboChartType"></select>
|
|
1650
|
-
</div>
|
|
1651
|
-
</div>
|
|
1652
|
-
</div>
|
|
1653
|
-
|
|
1654
|
-
<div data-bind="visible: ReportType()=='Pivot'" class="card card-body">
|
|
1655
|
-
<div class="alert alert-info small py-1 mb-0">
|
|
1656
|
-
<span class="fa fa-lightbulb-o"></span> For Transpose, the first field below will be used to Pivot/Transpose the rows as columns, and it must be grouped.
|
|
1657
|
-
</div>
|
|
1658
|
-
</div>
|
|
1659
|
-
|
|
1660
|
-
<div data-bind="visible: ReportType()=='Single'" class="card card-body">
|
|
1661
|
-
<div class="alert alert-info small py-1 mb-0">
|
|
1662
|
-
<span class="fa fa-lightbulb-o"></span> KPI is a single value report that is ideal for placing on a Dashboard. All fields except one must be hidden for Widgets.
|
|
1663
|
-
</div>
|
|
1664
|
-
</div>
|
|
1665
|
-
|
|
1666
|
-
<div data-bind="visible: ReportType()=='Html'" class="card card-body">
|
|
1667
|
-
<div class="form-group row small">
|
|
1668
|
-
<div class="checkbox col-6">
|
|
1669
|
-
<label>
|
|
1670
|
-
<input type="checkbox" data-bind="checked: dontGroupCustom" />
|
|
1671
|
-
List (Don't Summarize)
|
|
1672
|
-
</label>
|
|
1673
|
-
</div>
|
|
1674
|
-
</div>
|
|
1675
|
-
</div>
|
|
1676
|
-
|
|
1677
|
-
<div data-bind="visible: ReportType()=='Map'" class="card card-body">
|
|
1678
|
-
<div class="alert alert-info small py-1 mb-2">
|
|
1679
|
-
<span class="fa fa-lightbulb-o"></span> For Map Graph, the first field below has to be a Region, like a Country.
|
|
1680
|
-
</div>
|
|
1681
|
-
<div class="form-group row small">
|
|
1682
|
-
<label class="col-sm-3 control-label">Map Display</label>
|
|
1683
|
-
<div class="col-sm-5">
|
|
1684
|
-
<select class="form-select form-select-sm" data-bind="options: mapRegions, value: mapRegion"></select>
|
|
1685
|
-
</div>
|
|
1686
|
-
</div>
|
|
1687
|
-
</div>
|
|
1688
|
-
</div>
|
|
1689
|
-
<ul class="list-group" data-bind="sortable: { data: SelectedFields, options: { handle: '.sortable', cursor: 'move', placeholder: 'drop-highlight' }, strategyMove: true }">
|
|
1690
|
-
<li class="list-group-item">
|
|
1691
|
-
<div class="row">
|
|
1692
|
-
<div class="col-5">
|
|
1693
|
-
<span class="sortable pull-left" style="padding-right: 15px;" data-bind="ifnot: $parent.useStoredProc">
|
|
1694
|
-
<span class="fa fa-ellipsis-v" aria-hidden="true" title="Drag to reorder"></span>
|
|
1695
|
-
</span>
|
|
1696
|
-
<span class="fa fa-columns"></span>
|
|
1697
|
-
<span data-bind="text: selectedFieldName"></span>
|
|
1698
|
-
<span data-bind="text: isFormulaField() ? '(' + fieldFormat() + ')' : ''"></span>
|
|
1699
|
-
<span data-bind="visible: !$parent.isFieldValidForYAxis($index(), fieldType || fieldFormat(), selectedAggregate()) && $parent.ReportType() !='Treemap' && $parent.isChart()">
|
|
1700
|
-
<span class="badge bg-danger" data-bind="visible: !groupInGraph()">Will not show in <span data-bind="text: $parent.ReportType"></span>Chart</span>
|
|
1701
|
-
</span>
|
|
1702
|
-
<span data-bind="visible: $parent.IsPivotFieldLastColumn($index(),selectedAggregate())">
|
|
1703
|
-
<span class="badge bg-danger" >Pivot field cannot be the last column.</span>
|
|
1704
|
-
</span>
|
|
1705
|
-
<span data-bind="visible: $parent.IsDynamicFieldFirstColumn($index())">
|
|
1706
|
-
<span class="badge bg-danger" >Dynamic cannot be first column.</span>
|
|
1707
|
-
</span>
|
|
1708
|
-
</div>
|
|
1709
|
-
<div class="col-7">
|
|
1710
|
-
<div class="pull-right" style="margin-top: -5px;" data-bind="if: $parent.AggregateReport() && !$parent.useStoredProc()">
|
|
1711
|
-
<select class="form-select form-control-sm" data-bind="options: $parent.canDrilldown() && $index()>0 ? fieldAggregateWithDrilldown : fieldAggregate, value: selectedAggregate"></select>
|
|
1712
|
-
</div>
|
|
1713
|
-
|
|
1714
|
-
<div class="pull-right" style="padding-right: 10px;" data-bind="ifnot: $parent.useStoredProc">
|
|
1715
|
-
<span class="fa fa-trash-o" title="Cannot Delete Required Filter" data-bind="visible: forceFilterForTable"></span>
|
|
1716
|
-
<span class="fa fa-trash" style="cursor: pointer;" aria-hidden="true" title="Delete this Field" data-bind="click: $parent.RemoveField, hidden: forceFilterForTable"></span>
|
|
1717
|
-
</div>
|
|
1718
|
-
<!--<div class="pull-right" style="padding-right: 10px;" data-bind="ifnot: $parent.useStoredProc">
|
|
1719
|
-
<span class="button-box no-padding" tabindex="0" data-bind="click: function(){ filterOnFly(!filterOnFly()); }, css: {active: filterOnFly()==true}">
|
|
1720
|
-
<span class="fa fa-filter" aria-hidden="true" title="Filter by this field on the Report"></span>
|
|
1721
|
-
</span>
|
|
1722
|
-
</div>-->
|
|
1723
|
-
<div class="pull-right" style="padding-right: 10px;" data-bind="visible: $parent.ReportType()!='Pivot'">
|
|
1724
|
-
<span class="button-box no-padding" tabindex="0" data-bind="click: toggleDisable, css: {active: disabled()==true}">
|
|
1725
|
-
<span class="fa fa-close" aria-hidden="true" title="Do not include in Report"></span>
|
|
1726
|
-
</span>
|
|
1727
|
-
</div>
|
|
1728
|
-
<div class="pull-right" style="padding-right: 10px;" data-bind="visible: $parent.ReportType()!='Pivot' && $parent.ReportType()!='List' && !$parent.useStoredProc()">
|
|
1729
|
-
<span class="button-box no-padding" tabindex="0" data-bind="click: function(){ hideInDetail(!hideInDetail()); }, css: {active: hideInDetail()==true}">
|
|
1730
|
-
<span class="fa fa-eye-slash" aria-hidden="true" title="Hide in Details"></span>
|
|
1731
|
-
</span>
|
|
1732
|
-
</div>
|
|
1733
|
-
<div class="pull-right" style="padding-right: 10px;" data-bind="visible: $parent.isFieldValidForYAxis($index(), fieldType || fieldFormat(), selectedAggregate()) && $parent.isChart() && $index()>0">
|
|
1734
|
-
<span class="button-box no-padding" tabindex="0" data-bind="click: function(){ groupInGraph(!groupInGraph()); }, css: {active: groupInGraph()==false}">
|
|
1735
|
-
<span class="fa fa-signal" aria-hidden="true" title="Include in series"></span>
|
|
1736
|
-
</span>
|
|
1737
|
-
</div>
|
|
1738
|
-
<div class="pull-right" style="padding-right: 10px;" data-bind="visible: $parent.IncludeSubTotal() && (['Int', 'Double', 'Money', 'Decimal', 'Currency'].indexOf(fieldType) >= 0 || ['Int', 'Double', 'Money', 'Decimal', 'Currency'].indexOf(fieldFormat()) >= 0)">
|
|
1739
|
-
<span class="button-box no-padding" tabindex="0" data-bind="click: function(){ dontSubTotal(!dontSubTotal()); }, css: {active: dontSubTotal()==true}">
|
|
1740
|
-
<span class="fa fa-plus-circle" aria-hidden="true" title="Don't add to Total row"></span>
|
|
1741
|
-
</span>
|
|
1742
|
-
</div>
|
|
1743
|
-
<div class="pull-right" style="padding-right: 10px;" data-bind="visible: $parent.ReportType()!='Pivot'">
|
|
1744
|
-
<span class="button-box no-padding" tabindex="0" data-bind="click: setupLinkField, css: {active: linkField()==true}">
|
|
1745
|
-
<span class="fa fa-link" aria-hidden="true" title="Link to another Report or Url"></span>
|
|
1746
|
-
</span>
|
|
1747
|
-
</div>
|
|
1748
|
-
<div class="pull-right" style="padding-right: 10px;" data-bind="visible: $parent.ReportType()=='Combo' && $parent.isFieldValidForYAxis($index(), fieldType || fieldFormat(), selectedAggregate()) && $parent.isChart() && $index()>0">
|
|
1749
|
-
<span class="button-box no-padding" tabindex="0" data-bind="click: function(){ seriesType(seriesType() == 'line' ? 'area' : (seriesType()=='bars' ? 'line' : 'bars')); }">
|
|
1750
|
-
<span class="fa" aria-hidden="true" data-bind="css: {'fa-line-chart': seriesType() == 'line', 'fa-bar-chart': seriesType() == 'bars', 'fa-area-chart': seriesType()=='area' }, attr: {title: seriesType}"></span>
|
|
1751
|
-
</span>
|
|
1752
|
-
</div>
|
|
1753
|
-
<div class="pull-right" style="padding-right: 10px;">
|
|
1754
|
-
<span class="button-box no-padding" tabindex="0" data-bind="click: setupFieldOptions">
|
|
1755
|
-
<span class="fa fa-gear" aria-hidden="true" title="More Options"></span>
|
|
1756
|
-
</span>
|
|
1757
|
-
</div>
|
|
1758
|
-
<div class="pull-right" style="padding-right: 10px;" data-bind="if: isFormulaField">
|
|
1759
|
-
<span class="button-box no-padding" tabindex="0" data-bind="click: editFormulaField">
|
|
1760
|
-
<span class="fa fa-pencil" aria-hidden="true" title="Edit Formula Field"></span>
|
|
1761
|
-
</span>
|
|
1762
|
-
</div>
|
|
1763
|
-
</div>
|
|
1764
|
-
</div>
|
|
1765
|
-
</li>
|
|
1766
|
-
</ul>
|
|
1767
|
-
</script>
|
|
1768
|
-
|
|
1769
|
-
<script type="text/html" id="designer-sub-report">
|
|
1770
|
-
<p class="text-muted mb-3">
|
|
1771
|
-
Linked reports are available to add as sub reports.
|
|
1772
|
-
Selecting sub reports will restrict the report to <strong>one record per page</strong>.
|
|
1773
|
-
</p>
|
|
1774
|
-
|
|
1775
|
-
<div class="mb-3">
|
|
1776
|
-
<select class="form-select"
|
|
1777
|
-
data-bind="options: linkedReportFields,
|
|
1778
|
-
optionsText: 'name',
|
|
1779
|
-
value: selectedSubReport,
|
|
1780
|
-
optionsCaption: 'Select a linked report...'">
|
|
1781
|
-
</select>
|
|
1782
|
-
</div>
|
|
1783
|
-
<ul class="list-group"
|
|
1784
|
-
data-bind="sortable: {
|
|
1785
|
-
data: subReports,
|
|
1786
|
-
options: { handle: '.sortable', cursor: 'move', placeholder: 'drop-highlight' }
|
|
1787
|
-
}">
|
|
1788
|
-
<li class="list-group-item d-flex justify-content-between align-items-center">
|
|
1789
|
-
<span>
|
|
1790
|
-
<i class="fa fa-bars sortable me-2" style="cursor:move;"></i>
|
|
1791
|
-
<span data-bind="text: name"></span>
|
|
1792
|
-
</span>
|
|
1793
|
-
<button type="button" class="btn btn-sm btn-outline-danger"
|
|
1794
|
-
data-bind="click: $parent.removeSubReport">
|
|
1795
|
-
Delete
|
|
1796
|
-
</button>
|
|
1797
|
-
</li>
|
|
1798
|
-
</ul>
|
|
1799
|
-
</script>
|
|
1800
|
-
|
|
1801
|
-
<script type="text/html" id="designer-html">
|
|
1802
|
-
<div class="row align-items-center mb-1">
|
|
1803
|
-
<div class="col-md-4">
|
|
1804
|
-
<select class="form-select" data-bind="options: SelectedFields, value: SelectFieldToInsert, optionsCaption: 'Select a field...', optionsText: 'selectedFieldName'"></select>
|
|
1805
|
-
</div>
|
|
1806
|
-
<div class="col-auto dropdown">
|
|
1807
|
-
<button class="btn btn-outline-secondary btn-sm dropdown-toggle" type="button" data-bs-toggle="dropdown">
|
|
1808
|
-
<i class="fa fa-table"></i> Insert as Table
|
|
1809
|
-
</button>
|
|
1810
|
-
<ul class="dropdown-menu">
|
|
1811
|
-
<li><a class="dropdown-item" href="#" data-bind="click: insertFieldTableTransposed">Transposed</a></li>
|
|
1812
|
-
<li><a class="dropdown-item" href="#" data-bind="click: insertFieldTableStandard">Standard</a></li>
|
|
1813
|
-
<li><hr class="dropdown-divider"></li>
|
|
1814
|
-
<li><a class="dropdown-item" href="#" data-bind="click: insertHeaderBreak">Add Header Break</a></li>
|
|
1815
|
-
<li><a class="dropdown-item" href="#" data-bind="click: insertFooterBreak">Add Footer Break</a></li>
|
|
1816
|
-
</ul>
|
|
1817
|
-
</div>
|
|
1818
|
-
|
|
1819
|
-
<div class="col-md-auto ms-2">
|
|
1820
|
-
<label class="form-check-label">
|
|
1821
|
-
<input class="form-check-input me-2" type="checkbox" data-bind="checked: cardView">
|
|
1822
|
-
Card Layout
|
|
1823
|
-
</label>
|
|
1824
|
-
</div>
|
|
1825
|
-
</div>
|
|
1826
|
-
<div class="mb-3">
|
|
1827
|
-
<textarea data-bind="summernote: reportHtml"></textarea>
|
|
1828
|
-
</div>
|
|
1829
|
-
</script>
|
|
1830
|
-
|
|
1831
|
-
<script type="text/html" id="designer-sort">
|
|
1832
|
-
<div data-bind="ifnot: useStoredProc">
|
|
1833
|
-
<div class="form-group row align-items-center flex-nowrap">
|
|
1834
|
-
<label class="col-auto control-label">Sort By</label>
|
|
1835
|
-
<div class="col">
|
|
1836
|
-
<select class="form-select form-select-sm"
|
|
1837
|
-
data-bind="options: FilteredFields, optionsText: 'selectedFieldName', optionsValue: 'fieldId', value: SortByField, optionsCaption: 'Select field to sort...', allowClear: true">
|
|
1838
|
-
</select>
|
|
1839
|
-
</div>
|
|
1840
|
-
<div class="col-auto d-flex gap-1">
|
|
1841
|
-
<button class="btn btn-sm btn-secondary"
|
|
1842
|
-
data-bind="text: !SortDesc() ? '▲ Ascending' : 'Descending ▼', click: function() { SortDesc(!SortDesc()); return false; }">
|
|
1843
|
-
</button>
|
|
1844
|
-
<button class="btn btn-sm btn-secondary"
|
|
1845
|
-
data-bind="click: addSortField">
|
|
1846
|
-
Add Sort
|
|
1847
|
-
</button>
|
|
1848
|
-
</div>
|
|
1849
|
-
</div>
|
|
1850
|
-
|
|
1851
|
-
<div data-bind="foreach: SortFields">
|
|
1852
|
-
<div class="form-group row align-items-center flex-nowrap">
|
|
1853
|
-
<label class="col-auto control-label"> Then Sort By</label>
|
|
1854
|
-
<div class="col">
|
|
1855
|
-
<select class="form-select form-select-sm" required
|
|
1856
|
-
data-bind="options: $parent.FilteredFields, optionsText: 'selectedFieldName', optionsValue: 'fieldId', value: sortByFieldId">
|
|
1857
|
-
</select>
|
|
1858
|
-
</div>
|
|
1859
|
-
<div class="col-auto d-flex gap-1">
|
|
1860
|
-
<button class="btn btn-sm btn-secondary"
|
|
1861
|
-
data-bind="click: remove">
|
|
1862
|
-
Remove Sort
|
|
1863
|
-
</button>
|
|
1864
|
-
<button class="btn btn-sm btn-secondary"
|
|
1865
|
-
data-bind="text: !sortDesc() ? '▲ Ascending' : 'Descending ▼', click: function() { sortDesc(!sortDesc()); return false; }">
|
|
1866
|
-
</button>
|
|
1867
|
-
<button class="btn btn-sm btn-secondary"
|
|
1868
|
-
data-bind="click: $parent.addSortField">
|
|
1869
|
-
Add Sort
|
|
1870
|
-
</button>
|
|
1871
|
-
</div>
|
|
1872
|
-
</div>
|
|
1873
|
-
</div>
|
|
1874
|
-
</div>
|
|
1875
|
-
</script>
|
|
1876
|
-
|
|
1877
|
-
<script type="text/html" id="designer-options">
|
|
1878
|
-
<div class="row">
|
|
1879
|
-
<div class="col-md-5">
|
|
1880
|
-
<div class="checkbox" data-bind="visible: ReportType()!='Pivot'">
|
|
1881
|
-
<label>
|
|
1882
|
-
<input type="checkbox" data-bind="checked: IncludeSubTotal" />
|
|
1883
|
-
Include Total Row
|
|
1884
|
-
</label>
|
|
1885
|
-
</div>
|
|
1886
|
-
<div class="checkbox" data-bind="hidden: AggregateReport">
|
|
1887
|
-
<label>
|
|
1888
|
-
<input type="checkbox" data-bind="checked: ShowUniqueRecords" />
|
|
1889
|
-
Show only Unique Records
|
|
1890
|
-
</label>
|
|
1891
|
-
</div>
|
|
1892
|
-
<div class="checkbox" data-bind="visible: ReportType()!='List'">
|
|
1893
|
-
<label>
|
|
1894
|
-
<input type="checkbox" data-bind="checked: ShowExpandOption" />
|
|
1895
|
-
Don't Show Expand Option
|
|
1896
|
-
</label>
|
|
1897
|
-
</div>
|
|
1898
|
-
<div class="checkbox" data-bind="visible: isChart">
|
|
1899
|
-
<label>
|
|
1900
|
-
<input type="checkbox" data-bind="checked: ShowDataWithGraph" />
|
|
1901
|
-
Show Data along with Graph
|
|
1902
|
-
</label>
|
|
1903
|
-
</div>
|
|
1904
|
-
<div class="checkbox">
|
|
1905
|
-
<label>
|
|
1906
|
-
<input type="checkbox" data-bind="checked: DontExecuteOnRun" />
|
|
1907
|
-
Wait to Select Filters before Running Report
|
|
1908
|
-
</label>
|
|
1909
|
-
</div>
|
|
1910
|
-
<div class="form-group row">
|
|
1911
|
-
<div class="checkbox col-md-5">
|
|
1912
|
-
<label>
|
|
1913
|
-
<input type="checkbox" data-bind="checked: maxRecords" />
|
|
1914
|
-
Max Records
|
|
1915
|
-
</label>
|
|
1916
|
-
</div>
|
|
1917
|
-
<div class="col-md-5" data-bind="if: maxRecords">
|
|
1918
|
-
<input type="number" style="width: 150px;" class="form-control" required placeholder="Only top n..." data-bind="value: OnlyTop, visible: maxRecords">
|
|
1919
|
-
</div>
|
|
1920
|
-
</div>
|
|
1921
|
-
<div class="form-group row">
|
|
1922
|
-
<div class="checkbox col-md-5">
|
|
1923
|
-
<label>
|
|
1924
|
-
<input type="checkbox" data-bind="checked: changePageSize, disable: subReports().length > 0" />
|
|
1925
|
-
Change Page Size
|
|
1926
|
-
</label>
|
|
1927
|
-
</div>
|
|
1928
|
-
<div class="col-md-5"
|
|
1929
|
-
data-bind="visible: changePageSize,
|
|
1930
|
-
css: { 'text-muted': subReports().length > 0 }">
|
|
1931
|
-
<select style="width: 150px;" class="form-select"
|
|
1932
|
-
data-bind="options: [1,10,30,50,100,150,200,500,1000],
|
|
1933
|
-
value: DefaultPageSize,
|
|
1934
|
-
disable: subReports().length > 0">
|
|
1935
|
-
</select>
|
|
1936
|
-
<!-- Force default to 1 if sub reports selected -->
|
|
1937
|
-
<small class="text-danger" data-bind="visible: subReports().length > 0">
|
|
1938
|
-
Page size is restricted to 1 when sub reports are selected.
|
|
1939
|
-
</small>
|
|
1940
|
-
</div>
|
|
1941
|
-
</div>
|
|
1942
|
-
</div>
|
|
1943
|
-
<div class="col-md-7">
|
|
1944
|
-
<p><span class="fa fa-paint-brush"></span> Pick Report Format</p>
|
|
1945
|
-
<div>
|
|
1946
|
-
<!-- ko foreach: tableStyles -->
|
|
1947
|
-
<div class="dropdown-option" data-bind="title: $data.name, click: $parent.selectStyle, css: {'dropdown-option-selected': $parent.selectedStyle() == $data.colorscheme}">
|
|
1948
|
-
<div class="mini-table-preview" data-bind="foreach: new Array(5)">
|
|
1949
|
-
<div class="mini-table-row" data-bind="foreach: new Array(5)">
|
|
1950
|
-
<div class="mini-table-cell" data-bind="style: { backgroundColor: $parentContext.$index() === 0 ? $parents[1].headerBg : ($parentContext.$index() % 2 === 0 ? $parents[1].altRowBg : $parents[1].rowBg), color: $parents[1].textColor }"></div>
|
|
1951
|
-
|
|
1952
|
-
</div>
|
|
1953
|
-
</div>
|
|
1954
|
-
</div>
|
|
1955
|
-
<!-- /ko -->
|
|
1956
|
-
</div>
|
|
1957
|
-
<div class="checkbox">
|
|
1958
|
-
<label>
|
|
1959
|
-
<input type="checkbox" data-bind="checked: noHeaderRow" />
|
|
1960
|
-
No Header Row
|
|
1961
|
-
</label>
|
|
1962
|
-
</div>
|
|
1963
|
-
<div class="checkbox">
|
|
1964
|
-
<label>
|
|
1965
|
-
<input type="checkbox" data-bind="checked: noDashboardBorders" />
|
|
1966
|
-
Borderless on Dashboard
|
|
1967
|
-
</label>
|
|
1968
|
-
</div>
|
|
1969
|
-
<div class="checkbox" data-bind="if: ReportType() == 'Single'">
|
|
1970
|
-
<label>
|
|
1971
|
-
<input type="checkbox" data-bind="checked: showPriorInKpi" />
|
|
1972
|
-
Show previous comparision in KPI if applicable
|
|
1973
|
-
</label>
|
|
1974
|
-
</div>
|
|
1975
|
-
</div>
|
|
1976
|
-
</div>
|
|
1977
|
-
</script>
|
|
1978
|
-
|
|
1979
|
-
<script type="text/html" id="custom-field-designer">
|
|
1980
|
-
<div>
|
|
1981
|
-
<div class="row">
|
|
1982
|
-
<div class="col-md-12" data-bind="visible: isFormulaField()">
|
|
1983
|
-
<div class="alert alert-info">
|
|
1984
|
-
You are now creating a Customized Field. Please select the fields you want to use in the calculation, then choose the operations you want to perform, and click "Save" to add your Custom field.
|
|
1985
|
-
</div>
|
|
1986
|
-
</div>
|
|
1987
|
-
</div>
|
|
1988
|
-
<div class="row">
|
|
1989
|
-
<div class="col-sm-6 small">
|
|
1990
|
-
Setup your Formula for calculating this Field
|
|
1991
|
-
</div>
|
|
1992
|
-
<div class="col-sm-6 right-align" data-bind="visible: formulaType()=='build'">
|
|
1993
|
-
<a href="#" class="btn btn-secondary btn-sm" data-bind="click: addFormulaParentheses">Add ( )</a>
|
|
1994
|
-
<a href="#" class="btn btn-secondary btn-sm" title="Add Today" data-bind="visible: formulaOnlyHasDateFields() || formulaFields().length == 0, click: addFormulaDateToday">Add Today</a>
|
|
1995
|
-
<a href="#" class="btn btn-secondary btn-sm" title="Add a Constant Value" data-bind="click: addFormulaConstantValue">Add Value</a>
|
|
1996
|
-
<a href="#" class="btn btn-secondary btn-sm" data-bind="click: clearFormulaField">Clear</a>
|
|
1997
|
-
</div>
|
|
1998
|
-
</div>
|
|
1999
|
-
<div class="form-group-row" data-bind="if: formulaOnlyHasDateFields">
|
|
2000
|
-
<div class="col-sm-12">
|
|
2001
|
-
<div class="alert alert-info">
|
|
2002
|
-
For Dates Field calculation, you can only substract date fields and display the result as days, hours, minutes or seconds.
|
|
2003
|
-
</div>
|
|
2004
|
-
</div>
|
|
2005
|
-
</div>
|
|
2006
|
-
<div class="form-group row">
|
|
2007
|
-
<label class="col-sm-2 control-label">Field Label</label>
|
|
2008
|
-
<div class="col-sm-10">
|
|
2009
|
-
<input type="text" class="form-control form-control-sm" data-bind="value: formulaFieldLabel" required placeholder="Custom Field Label" />
|
|
2010
|
-
</div>
|
|
2011
|
-
</div>
|
|
2012
|
-
<div class="form-group row">
|
|
2013
|
-
<label class="col-sm-2 control-label">Data Format</label>
|
|
2014
|
-
<div class="col-sm-10">
|
|
2015
|
-
<select class="form-select form-select-sm" data-bind="value: formulaDataFormat" required>
|
|
2016
|
-
<!-- ko ifnot: formulaOnlyHasDateFields -->
|
|
2017
|
-
<option>String</option>
|
|
2018
|
-
<option>Integer</option>
|
|
2019
|
-
<option>Decimal</option>
|
|
2020
|
-
<option>Currency</option>
|
|
2021
|
-
<!-- /ko -->
|
|
2022
|
-
<!-- ko if: formulaOnlyHasDateFields -->
|
|
2023
|
-
<option>Days</option>
|
|
2024
|
-
<option>Hours</option>
|
|
2025
|
-
<option>Minutes</option>
|
|
2026
|
-
<option>Seconds</option>
|
|
2027
|
-
<!-- /ko -->
|
|
2028
|
-
</select>
|
|
2029
|
-
</div>
|
|
2030
|
-
</div>
|
|
2031
|
-
<div class="form-group row" data-bind="visible: formulaDataFormat() == 'Decimal' || formulaDataFormat() == 'Currency'">
|
|
2032
|
-
<label class="col-sm-2 control-label">Round to Decimal Places</label>
|
|
2033
|
-
<div class="col-sm-10">
|
|
2034
|
-
<input type="number" class="form-control" data-bind="value: formulaDecimalPlaces" placeholder="Choose Decimal places (leave blank to not use rounding)" title="Choose Decimal places (leave blank to not use rounding)" />
|
|
2035
|
-
</div>
|
|
2036
|
-
</div>
|
|
2037
|
-
<div class="form-group row" data-bind="visible: appSettings.useSqlCustomField">
|
|
2038
|
-
<label class="col-sm-2 control-label">Field Builder Type</label>
|
|
2039
|
-
<div class="col-sm-10">
|
|
2040
|
-
<select class="form-select form-select-sm" data-bind="value: formulaType" required>
|
|
2041
|
-
<option value="build">Simple Calculation</option>
|
|
2042
|
-
<option value="sql">Advanced Expression</option>
|
|
2043
|
-
</select>
|
|
2044
|
-
</div>
|
|
2045
|
-
</div>
|
|
2046
|
-
|
|
2047
|
-
<div class="form-group row" data-bind="if: formulaType()=='build'">
|
|
2048
|
-
<label class="col-sm-2 control-label">Field Formula</label>
|
|
2049
|
-
<div class="col-sm-10">
|
|
2050
|
-
<div class="text-muted small" data-bind="visible: formulaFields().length == 0">Pick fields to build calculation</div>
|
|
2051
|
-
<div class="d-flex align-items-center flex-wrap" data-bind="foreach: formulaFields">
|
|
2052
|
-
<h3 class="me-3" data-bind="visible: setupFormula.isParenthesesStart" style="margin-top: 0;">(</h3>
|
|
2053
|
-
<div data-bind="if: !setupFormula.isParenthesesStart() && !setupFormula.isParenthesesEnd()" class="list-group me-3">
|
|
2054
|
-
<div class="list-group-item d-flex align-items-center formula-field-item" style="margin-left: 15px; padding: 5px 15px">
|
|
2055
|
-
<span data-bind="text: fieldName, visible: !setupFormula.isConstantValue()"></span>
|
|
2056
|
-
<div data-bind="if: setupFormula.isConstantValue" class="d-flex align-items-center">
|
|
2057
|
-
<input data-bind="value: setupFormula.constantValue, visible: setupFormula.constantValue()!='|Today|'" class="form-control form-control-sm me-2" required />
|
|
2058
|
-
<span data-bind="visible: setupFormula.constantValue() == '|Today|'"><b>Today</b></span>
|
|
2059
|
-
</div>
|
|
2060
|
-
<button class="btn btn-danger btn-sm ms-2" data-bind="click: $parent.removeField">
|
|
2061
|
-
<i class="fa fa-trash"></i>
|
|
2062
|
-
</button>
|
|
2063
|
-
</div>
|
|
2064
|
-
</div>
|
|
2065
|
-
<h3 class="me-3" data-bind="visible: setupFormula.isParenthesesEnd" style="margin-top: 0;">)</h3>
|
|
2066
|
-
<div class="me-3" style="margin-left: 15px;" data-bind="visible: $parent.showFormulaOperation($index())">
|
|
2067
|
-
<select class="form-control form-control-sm" style="max-width: 50px;" data-bind="value: setupFormula.formulaOperation">
|
|
2068
|
-
<!-- ko if: !$parent.formulaOnlyHasDateFields() || ($parent.formulaOnlyHasDateFields() && $parent.isConstantOperation($index())) -->
|
|
2069
|
-
<option>+</option>
|
|
2070
|
-
<!-- /ko -->
|
|
2071
|
-
<option>-</option>
|
|
2072
|
-
<!-- ko if: ['Integer','Money','Float','Double','Decimal','Currency'].indexOf($parent.formulaDataFormat()) != -1 -->
|
|
2073
|
-
<option>*</option>
|
|
2074
|
-
<option>/</option>
|
|
2075
|
-
<!-- /ko -->
|
|
2076
|
-
</select>
|
|
2077
|
-
</div>
|
|
2078
|
-
</div>
|
|
2079
|
-
|
|
2080
|
-
</div>
|
|
2081
|
-
</div>
|
|
2082
|
-
|
|
2083
|
-
<div data-bind="with: customSqlField, visible: formulaType()=='sql'">
|
|
2084
|
-
<div class="row">
|
|
2085
|
-
<div class="col-md-12">
|
|
2086
|
-
|
|
2087
|
-
<div class="mb-3">
|
|
2088
|
-
<label class="form-label">Select Data Operation:</label>
|
|
2089
|
-
<select class="form-select" data-bind="select2: {
|
|
2090
|
-
dropdownParent: $root.activeDesign() ? $('#choose-data-design') : $('#choose-data-card'),
|
|
2091
|
-
placeholder: 'Select Function...',
|
|
2092
|
-
data: availableFunctionsGrouped(),
|
|
2093
|
-
templateResult: templateResult
|
|
2094
|
-
}, value: selectedSqlFunction"></select>
|
|
2095
|
-
</div>
|
|
2096
|
-
|
|
2097
|
-
<div class="mb-3" data-bind="hidden: isConditionalFunction() || selectedSqlFunction() == 'Other'">
|
|
2098
|
-
<label class="form-label">Select the Data Field to use:</label>
|
|
2099
|
-
<select class="form-select"
|
|
2100
|
-
data-bind="select2: {
|
|
2101
|
-
dropdownParent: $root.activeDesign() ? $('#choose-data-design') : $('#choose-data-card'),
|
|
2102
|
-
placeholder: 'Search Field...',
|
|
2103
|
-
ajax: {
|
|
2104
|
-
url: $parent.textQuery.searchFields.url,
|
|
2105
|
-
dataType: 'json',
|
|
2106
|
-
data: $parent.textQuery.searchFields.query,
|
|
2107
|
-
processResults: $parent.textQuery.searchFields.processResults,
|
|
2108
|
-
headers: $parent.textQuery.searchFields.headers
|
|
2109
|
-
},
|
|
2110
|
-
minimumInputLength: 2,
|
|
2111
|
-
allowClear: true
|
|
2112
|
-
}, select2Text: selectedField,select2TableId:selectedFieldTableId"></select>
|
|
2113
|
-
<div data-bind="with: selectedField" class="small">
|
|
2114
|
-
Selected: <span class="highlight" data-bind="text: $data"></span>
|
|
2115
|
-
</div>
|
|
2116
|
-
</div>
|
|
2117
|
-
|
|
2118
|
-
<div class="mb-3" data-bind="if: requiresValue">
|
|
2119
|
-
<label for="inputValue" class="form-label">Provide the relevant value to use:</label>
|
|
2120
|
-
<input type="text" id="inputValue" class="form-control" data-bind="value: inputValue" required />
|
|
2121
|
-
</div>
|
|
2122
|
-
|
|
2123
|
-
<div class="mb-3" data-bind="visible: selectedSqlFunction() == 'Other'">
|
|
2124
|
-
<label for="custom-sql" class="form-label">Custom SQL Expression:</label>
|
|
2125
|
-
<p class="text-muted">
|
|
2126
|
-
Build your custom SQL Expression below by selecting data fields, adding calculations or using SQL keywords as needed. For string values, remember to enclose them in single quotes ('')
|
|
2127
|
-
</p>
|
|
2128
|
-
<p id="custom-sql" class="hint-input" contenteditable="true" placeholder="Write your custom SQL"></p>
|
|
2129
|
-
</div>
|
|
2130
|
-
<div data-bind="visible: isConditionalFunction">
|
|
2131
|
-
<p class="text-muted">
|
|
2132
|
-
Build your conditional logic below by selecting data fields, adding calculations and defining conditions as needed, and provide corresponding results. For string values, remember to enclose them in single quotes ('')
|
|
2133
|
-
</p>
|
|
2134
|
-
<div class="input-group mb-3">
|
|
2135
|
-
<div class="flex-grow-1">
|
|
2136
|
-
<p class="hint-input" id="condition-field" contenteditable="true" placeholder="Field to compare" title="Field to compare"></p>
|
|
2137
|
-
</div>
|
|
2138
|
-
|
|
2139
|
-
<div class="mx-2" style="width: 120px;">
|
|
2140
|
-
<select class="form-select form-select-sm" data-bind="options: availableOperators, value: selectedOperator"></select>
|
|
2141
|
-
</div>
|
|
2142
|
-
|
|
2143
|
-
<div class="flex-grow-1">
|
|
2144
|
-
<p class="hint-input" id="condition-value" contenteditable="true" placeholder="Value to compare" title="Value to compare"></p>
|
|
2145
|
-
</div>
|
|
2146
|
-
|
|
2147
|
-
<span class="input-group-text" style="max-height: 32px;">THEN</span>
|
|
2148
|
-
|
|
2149
|
-
<div class="flex-grow-1">
|
|
2150
|
-
<p class="hint-input" id="condition-result" contenteditable="true" placeholder="Condition Result" title="Condition Result"></p>
|
|
2151
|
-
</div>
|
|
2152
|
-
</div>
|
|
2153
|
-
|
|
2154
|
-
<button class="btn btn-outline-primary" data-bind="click: addCondition">Add Condition</button>
|
|
2155
|
-
<ul class="list-group mt-3" data-bind="foreach: conditions">
|
|
2156
|
-
<li class="list-group-item d-flex justify-content-between align-items-center">
|
|
2157
|
-
<span data-bind="text: conditionDisplay"></span>
|
|
2158
|
-
<button class="btn btn-sm btn-danger" data-bind="click: $parent.removeCondition">Remove</button>
|
|
2159
|
-
</li>
|
|
2160
|
-
</ul>
|
|
2161
|
-
|
|
2162
|
-
<div class="input-group mb-3" style="padding-top: 5px;">
|
|
2163
|
-
<span class="input-group-text" style="max-height: 32px;">ELSE</span>
|
|
2164
|
-
<div class="flex-grow-1">
|
|
2165
|
-
<p class="hint-input" id="condition-else" contenteditable="true" placeholder="Default Result" title="Default Result"></p>
|
|
2166
|
-
</div>
|
|
2167
|
-
</div>
|
|
2168
|
-
</div>
|
|
2169
|
-
|
|
2170
|
-
</div>
|
|
2171
|
-
</div>
|
|
2172
|
-
</div>
|
|
2173
|
-
|
|
2174
|
-
<div class="col-md-12">
|
|
2175
|
-
<hr />
|
|
2176
|
-
<a href="#" class="btn btn-primary btn-sm" title="Save Custom Formula Field" data-bind="click: saveFormulaField, visible: isFormulaField">Save</a>
|
|
2177
|
-
<a href="#" class="btn btn-sm" title="Custom Field using Formula" data-bind="click: cancelFormulaField, text: isFormulaField()? 'Cancel': 'Customize', css: {'btn-primary': !isFormulaField(), 'btn-danger': isFormulaField}"></a>
|
|
2178
|
-
</div>
|
|
2179
|
-
</div>
|
|
2180
|
-
</script>
|
|
2181
|
-
|
|
2182
|
-
<script type="text/html" id="report-designer-compact">
|
|
2183
|
-
<div class="designer-container compact-designer" id="choose-data-design" style="font-size:12px;">
|
|
2184
|
-
|
|
2185
|
-
<!-- Visualization Toolbar -->
|
|
2186
|
-
<div class="card p-1 mb-2">
|
|
2187
|
-
<div class="card-header p-1 d-flex justify-content-between align-items-center">
|
|
2188
|
-
<span><i class="fa fa-file"></i> Visualization</span>
|
|
2189
|
-
<button type="button" class="btn btn-sm btn-light" data-bind="visible: ReportID(), click: function() {activeDesign(false);}" title="Close">
|
|
2190
|
-
<i class="fa fa-times"></i> Close Designer
|
|
2191
|
-
</button>
|
|
2192
|
-
</div>
|
|
2193
|
-
<div class="card-body p-1">
|
|
2194
|
-
<div data-bind="template: 'designer-choose-visual'"></div>
|
|
2195
|
-
</div>
|
|
2196
|
-
</div>
|
|
2197
|
-
|
|
2198
|
-
<!-- Main Grid -->
|
|
2199
|
-
<div class="d-flex flex-row flex-wrap gap-2 compact-filters needs-validation">
|
|
2200
|
-
|
|
2201
|
-
<!-- Data -->
|
|
2202
|
-
<div class="card flex-fill expandable-panel" id="dataPanel" style="max-width: 300px"
|
|
2203
|
-
data-bind="css:{'collapsed-vertical': panels.isCollapsed('dataPanel')}">
|
|
2204
|
-
<div class="card-header p-1" data-bind="click:function(){panels.togglePanel('dataPanel')}">
|
|
2205
|
-
<i class="fa fa-database"></i> Data
|
|
2206
|
-
</div>
|
|
2207
|
-
|
|
2208
|
-
<div class="card-body p-1">
|
|
2209
|
-
<div data-bind="template: 'designer-choose-data'"></div>
|
|
2210
|
-
</div>
|
|
2211
|
-
</div>
|
|
2212
|
-
|
|
2213
|
-
<!-- Selected -->
|
|
2214
|
-
<div class="card flex-fill expandable-panel" id="selectedPanel" style="max-width: 400px"
|
|
2215
|
-
data-bind="css:{'collapsed-vertical': panels.isCollapsed('selectedPanel')}">
|
|
2216
|
-
<div class="card-header p-1" data-bind="click:function(){panels.togglePanel('selectedPanel')}">
|
|
2217
|
-
<i class="fa fa-table"></i> Selected data for the Report
|
|
2218
|
-
<a href="#" class="small text-muted float-end"
|
|
2219
|
-
data-bind="visible: SelectedFields().length, click:function(){SelectedFields([]);}">Clear all</a>
|
|
2220
|
-
</div>
|
|
2221
|
-
|
|
2222
|
-
<div class="card-body designer-auto-update p-1">
|
|
2223
|
-
<div style="max-height: 300px; overflow-y: auto;">
|
|
2224
|
-
<div data-bind="template: 'designer-selected-data'"></div>
|
|
2225
|
-
</div>
|
|
2226
|
-
</div>
|
|
2227
|
-
</div>
|
|
2228
|
-
|
|
2229
|
-
<div class="card flex-fill expandable-panel" id="subReportsPanel"
|
|
2230
|
-
data-bind="css:{'collapsed-vertical': panels.isCollapsed('subReportsPanel')}, visible: linkedReportFields().length > 0">
|
|
2231
|
-
<div class="card-header p-1" data-bind="click:function(){panels.togglePanel('subReportsPanel')}">
|
|
2232
|
-
<i class="fa fa-bookmark"></i> Sub Reports
|
|
2233
|
-
</div>
|
|
2234
|
-
<div class="card-body p-1">
|
|
2235
|
-
<div data-bind="template: 'designer-sub-report', data: $data"></div>
|
|
2236
|
-
</div>
|
|
2237
|
-
</div>
|
|
2238
|
-
|
|
2239
|
-
<div class="card flex-fill expandable-panel" id="htmlReportPanel"
|
|
2240
|
-
data-bind="css:{'collapsed-vertical': panels.isCollapsed('htmlReportPanel')}, visible: ReportType()=='Html'">
|
|
2241
|
-
<div class="card-header p-1" data-bind="click:function(){panels.togglePanel('htmlReportPanel')}">
|
|
2242
|
-
<i class="fa fa-pencil"></i> Custom Design
|
|
2243
|
-
</div>
|
|
2244
|
-
<div class="card-body p-1">
|
|
2245
|
-
<div data-bind="template: 'designer-html', data: $data"></div>
|
|
2246
|
-
</div>
|
|
2247
|
-
</div>
|
|
2248
|
-
|
|
2249
|
-
<!-- Custom Field -->
|
|
2250
|
-
<div class="card flex-fill expandable-panel" id="customFieldPanel" data-bind="visible: isFormulaField">
|
|
2251
|
-
<div class="card-header p-1">
|
|
2252
|
-
<i class="fa fa-magic"></i> Custom Field
|
|
2253
|
-
</div>
|
|
2254
|
-
<div class="card-body p-1 custom-field-design" style="max-height: 400px; overflow-y: auto; overflow-x: hidden;">
|
|
2255
|
-
<div data-bind="template: 'custom-field-designer', data: $data"></div>
|
|
2256
|
-
</div>
|
|
2257
|
-
</div>
|
|
2258
|
-
<!-- Field Options Panel -->
|
|
2259
|
-
<div id="fieldOptionsPanel" class="card p-2 mt-2 collapse">
|
|
2260
|
-
<!-- dynamic field settings load here -->
|
|
2261
|
-
</div>
|
|
2262
|
-
<!-- Filters -->
|
|
2263
|
-
<div class="card flex-fill expandable-panel" id="filtersPanel"
|
|
2264
|
-
data-bind="css:{'collapsed-vertical': panels.isCollapsed('filtersPanel')}, hidden: isFormulaField">
|
|
2265
|
-
<div class="card-header p-1" data-bind="click:function(){panels.togglePanel('filtersPanel')}">
|
|
2266
|
-
<i class="fa fa-filter"></i> Filters
|
|
2267
|
-
</div>
|
|
2268
|
-
<div class="card-body p-1 designer-auto-update" style="max-height:300px; overflow-y:auto;">
|
|
2269
|
-
<div data-bind="if:useStoredProc"><div data-bind="template:{name:'filter-parameters'}"></div></div>
|
|
2270
|
-
<div data-bind="ifnot:useStoredProc"><div data-bind="template:{name:'filter-group'}"></div></div>
|
|
2271
|
-
</div>
|
|
2272
|
-
</div>
|
|
2273
|
-
|
|
2274
|
-
<!-- Sort -->
|
|
2275
|
-
<div class="card flex-fill expandable-panel" id="sortPanel"
|
|
2276
|
-
data-bind="css:{'collapsed-vertical': panels.isCollapsed('sortPanel')}, hidden: useStoredProc() || isFormulaField()">
|
|
2277
|
-
<div class="card-header p-1" data-bind="click:function(){panels.togglePanel('sortPanel')}">
|
|
2278
|
-
<i class="fa fa-sort"></i> Sort
|
|
2279
|
-
</div>
|
|
2280
|
-
<div class="card-body p-1 designer-auto-update row">
|
|
2281
|
-
<div data-bind="template: 'designer-sort'"></div>
|
|
2282
|
-
</div>
|
|
2283
|
-
</div>
|
|
2284
|
-
|
|
2285
|
-
<!-- Settings -->
|
|
2286
|
-
<div class="card flex-fill expandable-panel" id="settingsPanel"
|
|
2287
|
-
data-bind="css:{'collapsed-vertical': panels.isCollapsed('settingsPanel')}, hidden: isFormulaField">
|
|
2288
|
-
<div class="card-header p-1" data-bind="click:function(){panels.togglePanel('settingsPanel')}">
|
|
2289
|
-
<i class="fa fa-gear"></i>Options
|
|
2290
|
-
</div>
|
|
2291
|
-
<div class="card-body">
|
|
2292
|
-
<div class="form-group row">
|
|
2293
|
-
<label class="col-form-label h6">
|
|
2294
|
-
<i class="fa fa-file"></i> Report Name
|
|
2295
|
-
</label>
|
|
2296
|
-
<div>
|
|
2297
|
-
<input type="text" class="form-control" required placeholder="Report Name" data-bind="value: ReportName">
|
|
2298
|
-
</div>
|
|
2299
|
-
</div>
|
|
2300
|
-
<div class="form-group row">
|
|
2301
|
-
<label class="control-label h6">
|
|
2302
|
-
<i class="fa fa-info-circle"></i> Report Description
|
|
2303
|
-
</label>
|
|
2304
|
-
<div>
|
|
2305
|
-
<textarea class="form-control" style="width: 100%;" rows="3" placeholder="Additional details (optional)" data-bind="value: ReportDescription"></textarea>
|
|
2306
|
-
</div>
|
|
2307
|
-
</div>
|
|
2308
|
-
<div class="checkbox" data-bind="visible: CanSaveReports()">
|
|
2309
|
-
<label>
|
|
2310
|
-
<input type="checkbox" data-bind="checked: SaveReport">
|
|
2311
|
-
Save Report
|
|
2312
|
-
</label>
|
|
2313
|
-
</div>
|
|
2314
|
-
<div class="form-group row" data-bind="visible: SaveReport">
|
|
2315
|
-
<label class="control-label h6">
|
|
2316
|
-
<i class="fa fa-folder-open"></i> Choose Folder
|
|
2317
|
-
</label>
|
|
2318
|
-
<div>
|
|
2319
|
-
<select class="form-select" style="width: 100%;" data-bind="options: Folders, optionsText: 'FolderName', optionsValue: 'Id', value: FolderID"></select>
|
|
2320
|
-
</div>
|
|
2321
|
-
</div>
|
|
2322
|
-
<hr />
|
|
2323
|
-
<div data-bind="template: 'designer-options'"></div>
|
|
2324
|
-
</div>
|
|
2325
|
-
</div>
|
|
2326
|
-
|
|
2327
|
-
<!-- Schedule -->
|
|
2328
|
-
<div class="card flex-fill expandable-panel" id="schedulePanel"
|
|
2329
|
-
data-bind="css:{'collapsed-vertical': panels.isCollapsed('schedulePanel')}">
|
|
2330
|
-
<div class="card-header p-1" data-bind="click:function(){panels.togglePanel('schedulePanel')}">
|
|
2331
|
-
<i class="fa fa-hourglass"></i> Schedule
|
|
2332
|
-
</div>
|
|
2333
|
-
<div class="card-body p-1 designer-auto-update row">
|
|
2334
|
-
<div data-bind="template: {name: 'report-schedule'}"></div>
|
|
2335
|
-
</div>
|
|
2336
|
-
</div>
|
|
2337
|
-
|
|
2338
|
-
<!-- Access -->
|
|
2339
|
-
<div class="card flex-fill expandable-panel" id="accessPanel"
|
|
2340
|
-
data-bind="css:{'collapsed-vertical': panels.isCollapsed('accessPanel')}, visible: adminMode() && !isFormulaField()">
|
|
2341
|
-
<div class="card-header p-1" data-bind="click:function(){panels.togglePanel('accessPanel')}">
|
|
2342
|
-
<i class="fa fa-key"></i>Security
|
|
2343
|
-
</div>
|
|
2344
|
-
|
|
2345
|
-
<div data-bind="" class="card card-body">
|
|
2346
|
-
<div data-bind="template: {name: 'manage-access-template', data: manageAccess}"></div>
|
|
2347
|
-
</div>
|
|
2348
|
-
</div>
|
|
2349
|
-
|
|
2350
|
-
</div>
|
|
2351
|
-
</div>
|
|
2352
|
-
<hr />
|
|
2353
|
-
</script>
|
|
2354
|
-
|
|
2355
|
-
<script type="text/html" id="report-designer">
|
|
2356
|
-
<div class="modal-dialog modal-dialog-scrollable" style="height: 100vh;" id="report-designer-modal">
|
|
2357
|
-
<div class="modal-content" style="display: flex; flex-direction: column; height: 100%;">
|
|
2358
|
-
<div class="modal-header">
|
|
2359
|
-
<h5 class="modal-title" id="myModalLabel">
|
|
2360
|
-
<a title="Need help setting up a report?" target="_blank" href="https://dotnetreport.com/blogs/docs/designing-reports"><span class="fa fa-question-circle"></span></a> Design your Report
|
|
2361
|
-
</h5>
|
|
2362
|
-
<button type="button" class="btn-close" data-bs-dismiss="modal" data-bind="click: onModalCloseClicked" aria-label="Close"></button>
|
|
2363
|
-
</div>
|
|
2364
|
-
<div class="modal-body needs-validation" style="overflow-y: auto; flex-grow: 1;">
|
|
2365
|
-
<div class="row">
|
|
2366
|
-
<div class="col-md-4">
|
|
2367
|
-
<div class="card card-body" id="choose-data-card" style="min-height: calc(100vh - 200px);">
|
|
2368
|
-
<div class="form-group row align-items-center">
|
|
2369
|
-
<label class="col-sm-4 col-form-label h6">
|
|
2370
|
-
<i class="fa fa-file"></i> Report Name
|
|
2371
|
-
</label>
|
|
2372
|
-
<div class="col-sm-8">
|
|
2373
|
-
<input type="text" class="form-control" required placeholder="Report Name" data-bind="value: ReportName">
|
|
2374
|
-
</div>
|
|
2375
|
-
</div>
|
|
2376
|
-
<hr />
|
|
2377
|
-
<h5><span class="fa fa-database"></span> Choose Data for Report</h5>
|
|
2378
|
-
<div data-bind="template: 'designer-choose-data'"></div>
|
|
2379
|
-
</div>
|
|
2380
|
-
<br />
|
|
2381
|
-
|
|
2382
|
-
<div class="card card-body">
|
|
2383
|
-
|
|
2384
|
-
<div class="form-group row">
|
|
2385
|
-
<label class="control-label h6">
|
|
2386
|
-
<i class="fa fa-info-circle"></i> Report Description
|
|
2387
|
-
</label>
|
|
2388
|
-
<div>
|
|
2389
|
-
<textarea class="form-control" style="width: 100%;" rows="3" placeholder="Additional details (optional)" data-bind="value: ReportDescription"></textarea>
|
|
2390
|
-
</div>
|
|
2391
|
-
</div>
|
|
2392
|
-
<div class="checkbox" data-bind="visible: CanSaveReports()">
|
|
2393
|
-
<label>
|
|
2394
|
-
<input type="checkbox" data-bind="checked: SaveReport">
|
|
2395
|
-
Save Report
|
|
2396
|
-
</label>
|
|
2397
|
-
</div>
|
|
2398
|
-
<div class="form-group row" data-bind="visible: SaveReport">
|
|
2399
|
-
<label class="control-label h6">
|
|
2400
|
-
<i class="fa fa-folder-open"></i> Choose Folder
|
|
2401
|
-
</label>
|
|
2402
|
-
<div>
|
|
2403
|
-
<select class="form-select" style="width: 100%;" data-bind="options: Folders, optionsText: 'FolderName', optionsValue: 'Id', value: FolderID"></select>
|
|
2404
|
-
</div>
|
|
2405
|
-
</div>
|
|
2406
|
-
</div>
|
|
2407
|
-
</div>
|
|
2408
|
-
<div class="col-md-8">
|
|
2409
|
-
<div class="card card-body">
|
|
2410
|
-
<h5><span class="fa fa-file"></span> Choose Visualization</h5>
|
|
2411
|
-
<div style="overflow-x: auto; white-space: nowrap;">
|
|
2412
|
-
<div data-bind="template: 'designer-choose-visual'"></div>
|
|
2413
|
-
</div>
|
|
2414
|
-
</div>
|
|
2415
|
-
<div>
|
|
2416
|
-
<div data-bind="if: isFunctionField" class="custom-field-design">
|
|
2417
|
-
<br />
|
|
2418
|
-
<br />
|
|
2419
|
-
<div class="card">
|
|
2420
|
-
<div class="card-body">
|
|
2421
|
-
<div class="row">
|
|
2422
|
-
<div class="col-md-12 pull-right">
|
|
2423
|
-
<a href="#" class="btn btn-primary btn-sm" title="Save Custom Function Field" data-bind="click: saveFunctionField, visible: isFunctionField">Save</a>
|
|
2424
|
-
<a href="#" class="btn btn-sm" title="Custom Field using Function" data-bind="click: function(){isFunctionField(!isFunctionField())}, text: isFunctionField()? 'Cancel': 'Function', css: {'btn-primary': !isFunctionField(), 'btn-danger': isFunctionField}"></a>
|
|
2425
|
-
</div>
|
|
2426
|
-
<div class="col-md-12 padded-div" data-bind="visible: isFunctionField()">
|
|
2427
|
-
<div class="alert alert-info">
|
|
2428
|
-
You are now creating a Customized Field using Functions available.
|
|
2429
|
-
</div>
|
|
2430
|
-
</div>
|
|
2431
|
-
</div>
|
|
2432
|
-
|
|
2433
|
-
<div class="form-group row">
|
|
2434
|
-
<label class="col-sm-2 control-label">Field Label</label>
|
|
2435
|
-
<div class="col-sm-10">
|
|
2436
|
-
<input type="text" class="form-control form-control-sm" data-bind="value: formulaFieldLabel" required placeholder="Custom Field Label" />
|
|
2437
|
-
</div>
|
|
2438
|
-
</div>
|
|
2439
|
-
<div class="form-group row">
|
|
2440
|
-
<label class="col-sm-2 control-label">Data Format</label>
|
|
2441
|
-
<div class="col-sm-10">
|
|
2442
|
-
<select class="form-select form-control-sm" data-bind="value: formulaDataFormat" required>
|
|
2443
|
-
<option>String</option>
|
|
2444
|
-
<option>Integer</option>
|
|
2445
|
-
<option>Decimal</option>
|
|
2446
|
-
<option>Currency</option>
|
|
2447
|
-
<option>Date</option>
|
|
2448
|
-
<option value="DateTime">Date and Time</option>
|
|
2449
|
-
</select>
|
|
2450
|
-
</div>
|
|
2451
|
-
</div>
|
|
2452
|
-
<div class="form-group row" data-bind="visible: formulaDataFormat() == 'Decimal' || formulaDataFormat() == 'Currency'">
|
|
2453
|
-
<label class="col-sm-2 control-label">Round to Decimal Places</label>
|
|
2454
|
-
<div class="col-sm-10">
|
|
2455
|
-
<input type="number" class="form-control" data-bind="value: formulaDecimalPlaces" placeholder="Choose Decimal places (leave blank to not use rounding)" title="Choose Decimal places (leave blank to not use rounding)" />
|
|
2456
|
-
</div>
|
|
2457
|
-
</div>
|
|
2458
|
-
|
|
2459
|
-
<div>
|
|
2460
|
-
Define your Function:
|
|
2461
|
-
<textarea id="function-code"></textarea>
|
|
2462
|
-
</div>
|
|
2463
|
-
</div>
|
|
2464
|
-
</div>
|
|
2465
|
-
<div class="clearfix"></div>
|
|
2466
|
-
</div>
|
|
2467
|
-
|
|
2468
|
-
<div data-bind="if: lastPickedField() && lastPickedField().fieldType == 'Json'">
|
|
2469
|
-
<br />
|
|
2470
|
-
<div class="card">
|
|
2471
|
-
<div class="card-header">
|
|
2472
|
-
<h6>Select Data Fields from <span data-bind="text: lastPickedField().fieldName"></span></h6>
|
|
2473
|
-
</div>
|
|
2474
|
-
<div class="card-body">
|
|
2475
|
-
<div class="row container-fluid" data-bind="foreach: jsonFields">
|
|
2476
|
-
<div class="col-md-3 col-sm-4 col-xs-6 list-group">
|
|
2477
|
-
<div class="list-group-item">
|
|
2478
|
-
<div class="checkbox">
|
|
2479
|
-
<label>
|
|
2480
|
-
<input type="checkbox" data-bind="checkedInArray: {array: $parent.SelectedFields, value: $data}">
|
|
2481
|
-
<span data-bind="text: jsonColumnName"></span>
|
|
2482
|
-
</label>
|
|
2483
|
-
</div>
|
|
2484
|
-
</div>
|
|
2485
|
-
</div>
|
|
2486
|
-
</div>
|
|
2487
|
-
</div>
|
|
2488
|
-
</div>
|
|
2489
|
-
</div>
|
|
2490
|
-
|
|
2491
|
-
<div id="customFieldSection" data-bind="if: isFormulaField" class="custom-field-design">
|
|
2492
|
-
<br />
|
|
2493
|
-
<br />
|
|
2494
|
-
<div class="card">
|
|
2495
|
-
<div class="card-header">
|
|
2496
|
-
<b>Build Custom Field</b>
|
|
2497
|
-
</div>
|
|
2498
|
-
<div class="card-body" data-bind="template: 'custom-field-designer'">
|
|
2499
|
-
|
|
2500
|
-
</div>
|
|
2501
|
-
</div>
|
|
2502
|
-
<div class="clearfix"></div>
|
|
2503
|
-
</div>
|
|
2504
|
-
</div>
|
|
2505
|
-
<br />
|
|
2506
|
-
<div class="card card-body">
|
|
2507
|
-
<div class="row">
|
|
2508
|
-
<h5 class="col-8 pull-left"><span class="fa fa-table"></span> Selected data for the Report</h5>
|
|
2509
|
-
<div class="col-4 pull-right right-align">
|
|
2510
|
-
<a href="#" class="small text-muted" data-bind="visible: SelectedFields().length, click: function() {SelectedFields([]);}">Clear all</a>
|
|
2511
|
-
</div>
|
|
2512
|
-
</div>
|
|
2513
|
-
|
|
2514
|
-
<div data-bind="template: 'designer-selected-data'"></div>
|
|
2515
|
-
</div>
|
|
2516
|
-
<div data-bind="if: linkedReportFields().length > 0">
|
|
2517
|
-
<br />
|
|
2518
|
-
<div class="card mb-4">
|
|
2519
|
-
<div class="card-header bg-light">
|
|
2520
|
-
<h5 class="mb-0">
|
|
2521
|
-
<i class="fa fa-bookmark"></i> Include Sub Reports
|
|
2522
|
-
</h5>
|
|
2523
|
-
</div>
|
|
2524
|
-
<div class="card-body">
|
|
2525
|
-
<div data-bind="template: 'designer-sub-report'"></div>
|
|
2526
|
-
</div>
|
|
2527
|
-
</div>
|
|
2528
|
-
</div>
|
|
2529
|
-
<div data-bind="visible: ReportType()=='Html'">
|
|
2530
|
-
<br />
|
|
2531
|
-
<div class="card mb-4">
|
|
2532
|
-
<div class="card-header bg-light">
|
|
2533
|
-
<h5 class="mb-0">
|
|
2534
|
-
<i class="fa fa-pencil"></i> Design your Report
|
|
2535
|
-
</h5>
|
|
2536
|
-
</div>
|
|
2537
|
-
<div class="card-body">
|
|
2538
|
-
<div data-bind="template: 'designer-html'"></div>
|
|
2539
|
-
</div>
|
|
2540
|
-
</div>
|
|
2541
|
-
</div>
|
|
2542
|
-
<br />
|
|
2543
|
-
<div class="card card-body">
|
|
2544
|
-
<h5><span class="fa fa-filter"></span> Choose Filters</h5>
|
|
2545
|
-
|
|
2546
|
-
<div class="row" style="padding: 10px 10px; overflow-x: auto;">
|
|
2547
|
-
<div data-bind="if: useStoredProc" class="col-md-12">
|
|
2548
|
-
<div data-bind="template: {name: 'filter-parameters'}"></div>
|
|
2549
|
-
</div>
|
|
2550
|
-
<div data-bind="ifnot: useStoredProc" class="col-md-12">
|
|
2551
|
-
<div data-bind="template: {name: 'filter-group'}"></div>
|
|
2552
|
-
</div>
|
|
2553
|
-
|
|
2554
|
-
<div class="checkbox col-12">
|
|
2555
|
-
<label>
|
|
2556
|
-
<input type="checkbox" data-bind="checked: EditFiltersOnReport" />
|
|
2557
|
-
Allow setting up and saving filters on Report
|
|
2558
|
-
</label>
|
|
2559
|
-
</div>
|
|
2560
|
-
<br />
|
|
2561
|
-
</div>
|
|
2562
|
-
</div>
|
|
2563
|
-
<br />
|
|
2564
|
-
<div data-bind="hidden: useStoredProc" class="card card-body">
|
|
2565
|
-
<h5><span class="fa fa-sort"></span> Choose Sorting</h5>
|
|
2566
|
-
<div data-bind="template: 'designer-sort'"></div>
|
|
2567
|
-
</div>
|
|
2568
|
-
<br />
|
|
2569
|
-
<div data-bind="visible: SaveReport" class="card card-body">
|
|
2570
|
-
<h5><span class="fa fa-hourglass"></span> Choose Schedule</h5>
|
|
2571
|
-
|
|
2572
|
-
<div style="padding: 10px 10px" data-bind="if: SaveReport">
|
|
2573
|
-
<div data-bind="template: {name: 'report-schedule'}"></div>
|
|
2574
|
-
</div>
|
|
2575
|
-
</div>
|
|
2576
|
-
<br />
|
|
2577
|
-
<div data-bind="ifnot: useStoredProc">
|
|
2578
|
-
<div class="card card-body">
|
|
2579
|
-
<div data-bind="template: 'designer-options'"></div>
|
|
2580
|
-
</div>
|
|
2581
|
-
</div>
|
|
2582
|
-
<br />
|
|
2583
|
-
<div data-bind="visible: adminMode" class="card card-body">
|
|
2584
|
-
<div data-bind="template: {name: 'manage-access-template', data: manageAccess}"></div>
|
|
2585
|
-
</div>
|
|
2586
|
-
|
|
2587
|
-
</div>
|
|
2588
|
-
</div>
|
|
2589
|
-
</div>
|
|
2590
|
-
<div class="modal-footer">
|
|
2591
|
-
<button class="btn btn-primary" data-bind="visible: adminMode, click: RunReportSqlPreview">
|
|
2592
|
-
<i class="fa fa-code"></i> Preview Report Code
|
|
2593
|
-
</button>
|
|
2594
|
-
<a href="#" class="btn btn-danger" data-bind="click: cancelCreateReport">Cancel editing Report</a>
|
|
2595
|
-
<button class="btn btn-primary" type="button" data-bind="visible: SaveReport() && CanSaveReports(), click: SaveWithoutRun" style="padding-right: 10px;">Save Report</button>
|
|
2596
|
-
<button class="btn btn-primary" type="button" data-bind="text: SaveReport() && CanSaveReports()? 'Save & Run Report': 'Run Report', click: RunReport">Run Report</button>
|
|
2597
|
-
</div>
|
|
2598
|
-
|
|
2599
|
-
</div>
|
|
2600
|
-
</div>
|
|
2601
|
-
</script>
|
|
2602
|
-
|
|
2603
|
-
<script type="text/html" id="chart-settings">
|
|
2604
|
-
<div class="chart-container pull-right">
|
|
2605
|
-
<button class="btn btn-light btn-sm d-flex align-items-center mt-2 chart-settings-btn"
|
|
2606
|
-
data-bind="click: toggleChartSettings" title="Report settings">
|
|
2607
|
-
<i class="fa fa-cog"></i>
|
|
2608
|
-
</button>
|
|
2609
|
-
|
|
2610
|
-
<div class="chart-settings-panel border p-2 shadow-sm bg-light" data-bind="visible: showSettings">
|
|
2611
|
-
<div class="d-flex justify-content-between align-items-center mb-2">
|
|
2612
|
-
<button class="btn btn-sm btn-close" data-bind="click: toggleChartSettings"></button>
|
|
2613
|
-
<h6 class="mb-0">Report Settings</h6>
|
|
2614
|
-
</div>
|
|
2615
|
-
<ul class="nav nav-tabs nav-sm mb-2 small" data-bind="visible: ReportType() === 'Bar' || ReportType() === 'Pie' || ReportType() === 'Line'">
|
|
2616
|
-
<li class="nav-item">
|
|
2617
|
-
<a class="nav-link"
|
|
2618
|
-
data-bs-toggle="tab"
|
|
2619
|
-
data-bind="attr: { href: '#chartTab-' + ReportID() }, css: { active: ReportType() === 'Bar' || ReportType() === 'Pie' || ReportType() === 'Line' }">
|
|
2620
|
-
Chart
|
|
2621
|
-
</a>
|
|
2622
|
-
</li>
|
|
2623
|
-
<li class="nav-item">
|
|
2624
|
-
<a class="nav-link"
|
|
2625
|
-
data-bs-toggle="tab"
|
|
2626
|
-
data-bind="attr: { href: '#tableTab-' + ReportID() }, css: { active: !(ReportType() === 'Bar' || ReportType() === 'Pie' || ReportType() === 'Line') }">
|
|
2627
|
-
Table
|
|
2628
|
-
</a>
|
|
2629
|
-
</li>
|
|
2630
|
-
</ul>
|
|
2631
|
-
<div class="tab-content small">
|
|
2632
|
-
<div class="tab-pane fade"
|
|
2633
|
-
data-bind="attr: { id: 'chartTab-' + ReportID() }, css: { 'show active': ReportType() === 'Bar' || ReportType() === 'Pie' || ReportType() === 'Line' }">
|
|
2634
|
-
<div class="mb-2">
|
|
2635
|
-
<div class="btn-group" role="group" data-bind="visible: ReportType() === 'Bar' || ReportType() === 'Pie' || ReportType() === 'Line'">
|
|
2636
|
-
<button type="button" class="btn btn-light" data-bs-toggle="tooltip" title="Bar Chart"
|
|
2637
|
-
data-bind="css: { 'active': ReportType() === 'Bar' }, click: function() { ReportType('Bar'); }">
|
|
2638
|
-
<span class="fa fa-bar-chart"></span>
|
|
2639
|
-
</button>
|
|
2640
|
-
<button type="button" class="btn btn-light" data-bs-toggle="tooltip" title="Pie Chart"
|
|
2641
|
-
data-bind="css: { 'active': ReportType() === 'Pie' }, click: function() { ReportType('Pie'); }">
|
|
2642
|
-
<span class="fa fa-pie-chart"></span>
|
|
2643
|
-
</button>
|
|
2644
|
-
<button type="button" class="btn btn-light" data-bs-toggle="tooltip" title="Line Chart"
|
|
2645
|
-
data-bind="css: { 'active': ReportType() === 'Line' }, click: function() { ReportType('Line'); }">
|
|
2646
|
-
<span class="fa fa-line-chart"></span>
|
|
2647
|
-
</button>
|
|
2648
|
-
</div>
|
|
2649
|
-
</div>
|
|
2650
|
-
<div data-bind="visible: ReportType()=='Bar'">
|
|
2651
|
-
<div class="form-group row">
|
|
2652
|
-
<div class="checkbox col-6">
|
|
2653
|
-
<label><input type="checkbox" data-bind="checked: barChartHorizontal" /> Horizontal</label>
|
|
2654
|
-
</div>
|
|
2655
|
-
<div class="checkbox col-6">
|
|
2656
|
-
<label><input type="checkbox" data-bind="checked: barChartStacked" /> Stacked</label>
|
|
2657
|
-
</div>
|
|
2658
|
-
</div>
|
|
2659
|
-
</div>
|
|
2660
|
-
<div data-bind="visible: ReportType()=='Pie'">
|
|
2661
|
-
<div class="form-group row">
|
|
2662
|
-
<div class="checkbox col-6">
|
|
2663
|
-
<label><input type="checkbox" data-bind="checked: pieChartDonut" /> Donut</label>
|
|
2664
|
-
</div>
|
|
2665
|
-
</div>
|
|
2666
|
-
</div>
|
|
2667
|
-
<div data-bind="visible: ReportType()=='Line'">
|
|
2668
|
-
<div class="form-group row">
|
|
2669
|
-
<div class="checkbox col-6">
|
|
2670
|
-
<label><input type="checkbox" data-bind="checked: lineChartArea" /> Area</label>
|
|
2671
|
-
</div>
|
|
2672
|
-
</div>
|
|
2673
|
-
</div>
|
|
2674
|
-
<div class="mb-2">
|
|
2675
|
-
<label class="form-label small">Background Color</label>
|
|
2676
|
-
<div class="d-flex align-items-center flex-wrap">
|
|
2677
|
-
<input type="color" class="color-picker" data-bind="value: chartOptions().backgroundColor, attr: { placeholder: 'Select' }, event: { change: updateChart }">
|
|
2678
|
-
</div>
|
|
2679
|
-
</div>
|
|
2680
|
-
<div class="mb-2">
|
|
2681
|
-
<label class="form-label small">Font Color</label>
|
|
2682
|
-
<div class="d-flex align-items-center flex-wrap">
|
|
2683
|
-
<input type="color" class="color-picker" data-bind="value: chartOptions().fontColor, attr: { placeholder: 'Select' }, event: { change: updateChart }">
|
|
2684
|
-
</div>
|
|
2685
|
-
</div>
|
|
2686
|
-
<div class="mb-2">
|
|
2687
|
-
<label class="form-label small">Series Colors</label>
|
|
2688
|
-
<div class="d-flex flex-wrap" data-bind="foreach: chartOptions().seriesColors">
|
|
2689
|
-
<div class="color-box me-2">
|
|
2690
|
-
<input type="color" class="color-picker"
|
|
2691
|
-
data-bind="value: $data, event: { input: function(data, event) { $parent.updateSeriesColor($index(), event.target.value); } }">
|
|
2692
|
-
<button class="btn btn-sm btn-danger remove-color" data-bind="click: $parent.removeSeriesColor">×</button>
|
|
2693
|
-
</div>
|
|
2694
|
-
</div>
|
|
2695
|
-
<button class="color-box btn btn-sm btn-secondary" data-bind="click: addSeriesColor" title="Add Series Color" style="margin-top: -7px;">
|
|
2696
|
-
<i class="fa fa-plus"></i>
|
|
2697
|
-
</button>
|
|
2698
|
-
</div>
|
|
2699
|
-
<div class="d-flex justify-content-between mb-1">
|
|
2700
|
-
<div>
|
|
2701
|
-
<label class="form-label small">Legend Position</label>
|
|
2702
|
-
<select class="form-select form-select-sm" data-bind="value: chartOptions().legendPosition, event: { change: updateChart }">
|
|
2703
|
-
<option value="right">Right</option>
|
|
2704
|
-
<option value="top">Top</option>
|
|
2705
|
-
<option value="bottom">Bottom</option>
|
|
2706
|
-
<option value="none">None</option>
|
|
2707
|
-
</select>
|
|
2708
|
-
</div>
|
|
2709
|
-
<div>
|
|
2710
|
-
<label class="form-label small">Font Size</label>
|
|
2711
|
-
<input type="number" class="form-control form-control-sm font-size-input" data-bind="value: chartOptions().fontSize, event: { change: updateChart }">
|
|
2712
|
-
</div>
|
|
2713
|
-
</div>
|
|
2714
|
-
<div data-bind="visible: ReportType()!='Pie'">
|
|
2715
|
-
<div class="form-check form-switch small mb-1">
|
|
2716
|
-
<input class="form-check-input" type="checkbox" data-bind="checked: chartOptions().showXAxisLabel, event: { change: updateChart }">
|
|
2717
|
-
<label class="form-check-label">X-Axis Label</label>
|
|
2718
|
-
</div>
|
|
2719
|
-
<div class="form-check form-switch small mb-1">
|
|
2720
|
-
<input class="form-check-input" type="checkbox" data-bind="checked: chartOptions().showYAxisLabel, event: { change: updateChart }">
|
|
2721
|
-
<label class="form-check-label">Y-Axis Label</label>
|
|
2722
|
-
</div>
|
|
2723
|
-
<div class="form-check form-switch small mb-1" data-bind="visible: ReportType() !== 'Pie'">
|
|
2724
|
-
<input class="form-check-input" type="checkbox" data-bind="checked: chartOptions().showGridlines, event: { change: updateChart }">
|
|
2725
|
-
<label class="form-check-label">Gridlines</label>
|
|
2726
|
-
</div>
|
|
2727
|
-
<div class="form-check form-switch small mb-1">
|
|
2728
|
-
<input class="form-check-input" type="checkbox" data-bind="checked: chartOptions().showSmallValuesOnLabel, event: { change: updateChart }">
|
|
2729
|
-
<label class="form-check-label">Show Small Values On Label</label>
|
|
2730
|
-
</div>
|
|
2731
|
-
<div class="form-group small mb-1">
|
|
2732
|
-
<label class="form-label">Y-Axis Format</label>
|
|
2733
|
-
<input type="text" class="form-control form-control-sm" placeholder="#,##0.00" data-bind="value: chartOptions().yAxisFormat, event: { change: updateChart }" />
|
|
2734
|
-
</div>
|
|
2735
|
-
<div class="form-group small mb-1 d-flex gap-2">
|
|
2736
|
-
<div class="w-50">
|
|
2737
|
-
<label class="form-label">Y-Axis Min</label>
|
|
2738
|
-
<input type="number" class="form-control form-control-sm" data-bind="value: chartOptions().yMin, event: { change: updateChart }" />
|
|
2739
|
-
</div>
|
|
2740
|
-
<div class="w-50">
|
|
2741
|
-
<label class="form-label">Y-Axis Max</label>
|
|
2742
|
-
<input type="number" class="form-control form-control-sm" data-bind="value: chartOptions().yMax, event: { change: updateChart }" />
|
|
2743
|
-
</div>
|
|
2744
|
-
</div>
|
|
2745
|
-
</div>
|
|
2746
|
-
</div>
|
|
2747
|
-
|
|
2748
|
-
<div class="tab-pane fade"
|
|
2749
|
-
data-bind="attr: { id: 'tableTab-' + ReportID() }, css: { 'show active': !(ReportType() === 'Bar' || ReportType() === 'Pie' || ReportType() === 'Line') }">
|
|
2750
|
-
<div class="form-group row">
|
|
2751
|
-
<div class="mb-2 col-6">
|
|
2752
|
-
<label class="form-label small">Header Back Color</label><br />
|
|
2753
|
-
<input type="color" class="color-picker"
|
|
2754
|
-
data-bind="attr: { id: 'tbl-color-picker-' + ReportID()} , value: tableSettings().headerBackColor, event: { change: updateTable }"/>
|
|
2755
|
-
</div>
|
|
2756
|
-
<div class="mb-2 col-6">
|
|
2757
|
-
<label class="form-label small">Header Font Color</label><br />
|
|
2758
|
-
<input type="color" class="color-picker"
|
|
2759
|
-
data-bind="attr: { id: 'tbl-color-picker-' + ReportID()} ,value: tableSettings().headerFontColor, event: { change: updateTable }"/>
|
|
2760
|
-
</div>
|
|
2761
|
-
</div>
|
|
2762
|
-
<div class="form-group row">
|
|
2763
|
-
<div class="mb-2 col-6">
|
|
2764
|
-
<label class="form-label small">Row Back Color</label><br />
|
|
2765
|
-
<input type="color" class="color-picker"
|
|
2766
|
-
data-bind="attr: { id: 'tbl-color-picker-' + ReportID()} ,value: tableSettings().rowBackColor, event: { change: updateTable }"/>
|
|
2767
|
-
</div>
|
|
2768
|
-
<div class="mb-2 col-6">
|
|
2769
|
-
<label class="form-label small">Row Font Color</label><br />
|
|
2770
|
-
<input type="color" class="color-picker"
|
|
2771
|
-
data-bind="attr: { id: 'tbl-color-picker-' + ReportID()} ,value: tableSettings().rowFontColor, event: { change: updateTable }"/>
|
|
2772
|
-
</div>
|
|
2773
|
-
</div>
|
|
2774
|
-
<div class="form-group row" style="display: none;">
|
|
2775
|
-
<div class="mb-2 col-6">
|
|
2776
|
-
<label class="form-label small">Alt Row Back Color</label><br />
|
|
2777
|
-
<input type="color" class="color-picker"
|
|
2778
|
-
data-bind="value: tableSettings().altRowBackColor, event: { change: updateTable }"/>
|
|
2779
|
-
</div>
|
|
2780
|
-
<div class="mb-2 col-6">
|
|
2781
|
-
<label class="form-label small">Alt Row Font Color</label>
|
|
2782
|
-
<input type="color" class="color-picker"
|
|
2783
|
-
data-bind="value: tableSettings().altRowFontColor, event: { change: updateTable }"/>
|
|
2784
|
-
</div>
|
|
2785
|
-
</div>
|
|
2786
|
-
<div class="form-group mb-2" style="display: none;">
|
|
2787
|
-
<label class="form-label small">Borders</label>
|
|
2788
|
-
<div class="btn-group d-flex flex-wrap">
|
|
2789
|
-
<button type="button" class="btn btn-light btn-sm flex-fill"
|
|
2790
|
-
data-bind="click: function(){ tableSettings().border('none'); updateTable(); }, css: { active: tableSettings().border === 'none' }">None</button>
|
|
2791
|
-
<button type="button" class="btn btn-light btn-sm flex-fill"
|
|
2792
|
-
data-bind="click: function(){ tableSettings().border('all'); updateTable(); }, css: { active: tableSettings().border === 'all' }">All</button>
|
|
2793
|
-
<button type="button" class="btn btn-light btn-sm flex-fill"
|
|
2794
|
-
data-bind="click: function(){ tableSettings().border('outer'); updateTable(); }, css: { active: tableSettings().border === 'outer' }">Outside</button>
|
|
2795
|
-
<button type="button" class="btn btn-light btn-sm flex-fill"
|
|
2796
|
-
data-bind="click: function(){ tableSettings().border('inner'); updateTable(); }, css: { active: tableSettings().border === 'inner' }">Inside</button>
|
|
2797
|
-
</div>
|
|
2798
|
-
</div>
|
|
2799
|
-
<div class="form-group row">
|
|
2800
|
-
<div class="mb-2 col-6" style="display: none;">
|
|
2801
|
-
<label class="form-label small">Border Color</label>
|
|
2802
|
-
<input type="color" class="color-picker"
|
|
2803
|
-
data-bind="value: tableSettings().borderColor, event: { change: updateTable }"/>
|
|
2804
|
-
</div>
|
|
2805
|
-
<div class="mb-2 col-6 d-flex align-items-end">
|
|
2806
|
-
<button class="btn btn-sm small btn-outline-secondary" data-bind="click: clearTableSettings">
|
|
2807
|
-
Clear
|
|
2808
|
-
</button>
|
|
2809
|
-
</div>
|
|
2810
|
-
</div>
|
|
2811
|
-
</div>
|
|
2812
|
-
</div>
|
|
2813
|
-
</div>
|
|
2814
|
-
</div>
|
|
2815
|
-
</script>
|
|
2816
|
-
|
|
2817
|
-
<div class="modal" id="drilldownModal" tabindex="-1" role="dialog" aria-hidden="true">
|
|
2818
|
-
<div class="modal-dialog modal-lg">
|
|
2819
|
-
<div class="modal-content" data-bind="with: ChartDrillDownData">
|
|
2820
|
-
<div class="modal-header">
|
|
2821
|
-
<h4 class="modal-title">Drilldown Data</h4>
|
|
2822
|
-
<button type="button" class="btn-close pull-right" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
2823
|
-
</div>
|
|
2824
|
-
<!-- ko if: DrillDownData -->
|
|
2825
|
-
<div class="modal-body">
|
|
2826
|
-
<div style="overflow-x: auto; max-height: 500px; overflow-y: auto;">
|
|
2827
|
-
<table class="table table-striped table-hover table-condensed" data-bind="with: DrillDownData, attr: {class: 'table table-striped table-hover table-condensed ' + $parent.selectedStyle()}">
|
|
2828
|
-
<thead style="position: sticky; top: -1px; z-index: 2;">
|
|
2829
|
-
<tr class="no-highlight">
|
|
2830
|
-
<!-- ko foreach: Columns -->
|
|
2831
|
-
<th data-bind="attr: { id: fieldId }, css: {'right-align': IsNumeric}, style: {'width': fieldWidth, 'background-color': headerBackColor }, hidden: outerGroup" style="border-right: 1px solid;">
|
|
2832
|
-
<span data-bind="text: fieldLabel2() ? fieldLabel2() : (fieldLabel() ? fieldLabel() : fieldName), style: {'color': headerFontColor, 'font-weight': headerFontBold() ? 'bold' : 'normal'}"></span>
|
|
2833
|
-
</th>
|
|
2834
|
-
<!-- /ko -->
|
|
2835
|
-
</tr>
|
|
2836
|
-
</thead>
|
|
2837
|
-
<tbody>
|
|
2838
|
-
<tr style="display: none;" data-bind="visible: Rows && Rows.length < 1">
|
|
2839
|
-
<td data-bind="attr:{colspan: Columns.length}">
|
|
2840
|
-
No records found
|
|
2841
|
-
</td>
|
|
2842
|
-
</tr>
|
|
2843
|
-
<!-- ko foreach: Rows -->
|
|
2844
|
-
<tr>
|
|
2845
|
-
<!-- ko foreach: Items -->
|
|
2846
|
-
<td data-bind="hidden: outerGroup, style: {'background-color': backColor, 'color': fontColor, 'font-weight': fontBold() ? 'bold' : 'normal' }">
|
|
2847
|
-
<div data-bind="style: {'width': fieldWidth }">
|
|
2848
|
-
<!-- ko if: LinkTo-->
|
|
2849
|
-
<a data-bind="attr: {href: LinkTo}" target="_blank"><span data-bind="html: formattedVal"></span></a>
|
|
2850
|
-
<!-- /ko-->
|
|
2851
|
-
<!-- ko ifnot: LinkTo-->
|
|
2852
|
-
<span data-bind="html: formattedVal"></span>
|
|
2853
|
-
<!-- /ko-->
|
|
2854
|
-
</div>
|
|
2855
|
-
</td>
|
|
2856
|
-
<!-- /ko-->
|
|
2857
|
-
</tr>
|
|
2858
|
-
<!-- /ko -->
|
|
2859
|
-
</tbody>
|
|
2860
|
-
</table>
|
|
2861
|
-
</div>
|
|
2862
|
-
</div>
|
|
2863
|
-
<div class="modal-footer">
|
|
2864
|
-
<div class="col-xs-12 col-centered" data-bind="with: pager">
|
|
2865
|
-
<div class="form-inline small text-muted">
|
|
2866
|
-
<div class="pull-left total-records" data-bind="visible: pages()">
|
|
2867
|
-
<span data-bind="text: 'Total Records: ' + totalRecords()"></span>
|
|
2868
|
-
</div>
|
|
2869
|
-
<div class="pull-left">
|
|
2870
|
-
<button class="btn btn-xs" title="Download Excel" data-bind="click: $parent.exportExcel"><span class="fa fa-file-excel-o"></span></button>
|
|
2871
|
-
<button class="btn btn-secondary btn-sm" data-bs-toggle="modal" data-bs-target="#sqlDrillDownModal" data-bind="visible: $root.adminMode">
|
|
2872
|
-
<span class="fa fa-code"></span> View Code
|
|
2873
|
-
</button>
|
|
2874
|
-
</div>
|
|
2875
|
-
<div class="form-group pull-right" data-bind="visible: pages()">
|
|
2876
|
-
<div data-bind="template: 'pager-template', data: $data"></div>
|
|
2877
|
-
</div>
|
|
2878
|
-
</div>
|
|
2879
|
-
</div>
|
|
2880
|
-
</div>
|
|
2881
|
-
<!-- /ko -->
|
|
2882
|
-
</div>
|
|
2883
|
-
</div>
|
|
2884
|
-
</div>
|
|
2885
|
-
|
|
2886
|
-
<div class="modal" id="sqlModal" tabindex="-1" role="dialog" aria-hidden="true">
|
|
2887
|
-
<div class="modal-dialog modal-lg">
|
|
2888
|
-
<div class="modal-content">
|
|
2889
|
-
<div class="modal-header d-flex justify-content-between align-items-center">
|
|
2890
|
-
<h4 class="modal-title">Report Code</h4>
|
|
2891
|
-
<button class="btn btn-outline-secondary btn-sm d-flex align-items-center"
|
|
2892
|
-
data-bind="click: function(data, event) { copySqlToClipboard(event.target); }">
|
|
2893
|
-
<i class="fa fa-clipboard"></i> Copy
|
|
2894
|
-
</button>
|
|
2895
|
-
<button type="button" class="btn-close pull-right" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
2896
|
-
</div>
|
|
2897
|
-
<div class="modal-body" data-bind="with: ReportResult">
|
|
2898
|
-
<div id="reportSqlCode" style="overflow-x: auto; max-height: 500px; overflow-y: scroll; border: 1px solid; padding: 10px;" class="bg-dark text-light">
|
|
2899
|
-
<pre><code data-bind="html: ReportSql" style="white-space: pre-wrap;"></code></pre>
|
|
2900
|
-
</div>
|
|
2901
|
-
</div>
|
|
2902
|
-
</div>
|
|
2903
|
-
</div>
|
|
2904
|
-
</div>
|
|
2905
|
-
|
|
2906
|
-
<div class="modal" id="sqlDrillDownModal" tabindex="-1" role="dialog" aria-hidden="true">
|
|
2907
|
-
<div class="modal-dialog modal-lg">
|
|
2908
|
-
<div class="modal-content" data-bind="with:ChartDrillDownData">
|
|
2909
|
-
<div class="modal-header d-flex justify-content-between align-items-center">
|
|
2910
|
-
<h4 class="modal-title">Drill Down Report Code</h4>
|
|
2911
|
-
<button class="btn btn-outline-secondary btn-sm d-flex align-items-center"
|
|
2912
|
-
data-bind="click: function(data, event) { copySqlToClipboard(event.target); }">
|
|
2913
|
-
<i class="fa fa-clipboard"></i> Copy
|
|
2914
|
-
</button>
|
|
2915
|
-
<button type="button" class="btn-close pull-right" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
2916
|
-
</div>
|
|
2917
|
-
<div class="modal-body" data-bind="with:DrillDownData">
|
|
2918
|
-
<div id="reportSqlCode" style="overflow-x: auto; max-height: 500px; overflow-y: scroll; border: 1px solid; padding: 10px;" class="bg-dark text-light">
|
|
2919
|
-
<pre><code data-bind="html: ReportSql" style="white-space: pre-wrap;"></code></pre>
|
|
2920
|
-
</div>
|
|
2921
|
-
</div>
|
|
2922
|
-
</div>
|
|
2923
|
-
</div>
|
|
2924
|
-
</div>
|
|
2925
|
-
<div class="modal" id="noaccountModal" tabindex="-1" role="dialog" aria-hidden="true">
|
|
2926
|
-
<div class="modal-dialog">
|
|
2927
|
-
<div class="modal-content">
|
|
2928
|
-
<div class="modal-header">
|
|
2929
|
-
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
2930
|
-
<h4 class="modal-title">Account not Setup</h4>
|
|
2931
|
-
</div>
|
|
2932
|
-
<div class="modal-body">
|
|
2933
|
-
<p class="alert alert-danger">dotnet Report Account Configuration missing!</p>
|
|
2934
|
-
<p>You do not have the neccessary initial configuration completed to use dotnet Report.</p>
|
|
2935
|
-
<p>Please view the <a href="https://dotnetreport.com/blogs/getting-started-with-dotnet-report/" target="_blank">Getting Started Guide</a> to correctly configure dotnet Report.</p>
|
|
2936
|
-
</div>
|
|
2937
|
-
<div class="modal-footer">
|
|
2938
|
-
<button type="button" class="btn btn-default" data-bs-dismiss="modal">Close</button>
|
|
2939
|
-
</div>
|
|
2940
|
-
</div>
|
|
2941
|
-
</div>
|
|
2942
|
-
</div>
|
|
2943
|
-
<script type="text/html" id="pdf-options-schedule-template">
|
|
2944
|
-
<div class="modal-dialog modal-dialog-centered">
|
|
2945
|
-
<div class="modal-content" data-bind="with: PdfPage">
|
|
2946
|
-
<div class="modal-header">
|
|
2947
|
-
<h5 class="modal-title" id="pdfOptionsScheduleModalLabel">
|
|
2948
|
-
<i class="fa fa-file-pdf-o me-2"></i> Set PDF Page Size
|
|
2949
|
-
</h5>
|
|
2950
|
-
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
2951
|
-
</div>
|
|
2952
|
-
<div class="modal-body row g-0">
|
|
2953
|
-
<div class="col-md-5 d-flex justify-content-center align-items-center">
|
|
2954
|
-
<div id="pagePreviewBox" class="text-center">
|
|
2955
|
-
<div data-bind="style: {
|
|
2956
|
-
width: selectedWidth(),
|
|
2957
|
-
height: selectedHeight(),
|
|
2958
|
-
backgroundColor: selectedBackgroundStyle(),
|
|
2959
|
-
transition: 'all 0.3s ease'
|
|
2960
|
-
}"
|
|
2961
|
-
class="shadow rounded mx-auto mb-2 border position-relative">
|
|
2962
|
-
<span class="position-absolute top-50 start-50 translate-middle text-muted small">Preview</span>
|
|
2963
|
-
</div>
|
|
2964
|
-
<div data-bind="text: selectedPageLabel" class="fw-bold"></div>
|
|
2965
|
-
<div data-bind="text: selectedPageDimension" class="text-muted small"></div>
|
|
2966
|
-
</div>
|
|
2967
|
-
</div>
|
|
2968
|
-
<div class="col-md-7">
|
|
2969
|
-
<div class="mb-3">
|
|
2970
|
-
<label for="pageSizeSelect" class="form-label fw-bold">Page Size:</label>
|
|
2971
|
-
<select class="form-select" id="pageSizeSelect"
|
|
2972
|
-
data-bind="options: availablePageSizes,
|
|
2973
|
-
optionsText: 'label',
|
|
2974
|
-
optionsValue: 'value',
|
|
2975
|
-
value: selectedPageSize">
|
|
2976
|
-
</select>
|
|
2977
|
-
</div>
|
|
2978
|
-
<div class="mb-3">
|
|
2979
|
-
<label for="pageOrientationSelect" class="form-label fw-bold">Page Orientation:</label>
|
|
2980
|
-
<select class="form-select" id="pageOrientationSelect"
|
|
2981
|
-
data-bind="options: availablePageOrientation,
|
|
2982
|
-
optionsText: 'label',
|
|
2983
|
-
optionsValue: 'value',
|
|
2984
|
-
value: selectedPageOrientation">
|
|
2985
|
-
</select>
|
|
2986
|
-
</div>
|
|
2987
|
-
<div class="alert alert-info p-2 small mt-2">
|
|
2988
|
-
This PDF will be exported using the selected page size. Ensure your content fits well.
|
|
2989
|
-
If the content width exceeds the selected size, it will default to Letter.
|
|
2990
|
-
</div>
|
|
2991
|
-
</div>
|
|
2992
|
-
</div>
|
|
2993
|
-
<div class="modal-footer">
|
|
2994
|
-
<button type="button" class="btn btn-light" data-bs-dismiss="modal">Cancel</button>
|
|
2995
|
-
<button type="button" class="btn btn-success" data-bs-dismiss="modal" data-bind="click: save">
|
|
2996
|
-
Save
|
|
2997
|
-
</button>
|
|
2998
|
-
</div>
|
|
2999
|
-
</div>
|
|
3000
|
-
</div>
|
|
3001
|
-
</script>
|
|
3002
|
-
<script type="text/html" id="word-options-schedule-template">
|
|
3003
|
-
<div class="modal-dialog modal-dialog-centered">
|
|
3004
|
-
<div class="modal-content" data-bind="with: WordPage">
|
|
3005
|
-
<div class="modal-header">
|
|
3006
|
-
<h5 class="modal-title" id="pdfOptionsScheduleModalLabel">
|
|
3007
|
-
<i class="fa fa-file-pdf-o me-2"></i> Set WORD Page Size
|
|
3008
|
-
</h5>
|
|
3009
|
-
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
3010
|
-
</div>
|
|
3011
|
-
<div class="modal-body row g-0">
|
|
3012
|
-
<div class="col-md-5 d-flex justify-content-center align-items-center">
|
|
3013
|
-
<div id="pagePreviewBox" class="text-center">
|
|
3014
|
-
<div data-bind="style: {
|
|
3015
|
-
width: selectedWidth(),
|
|
3016
|
-
height: selectedHeight(),
|
|
3017
|
-
backgroundColor: selectedBackgroundStyle(),
|
|
3018
|
-
transition: 'all 0.3s ease'
|
|
3019
|
-
}"
|
|
3020
|
-
class="shadow rounded mx-auto mb-2 border position-relative">
|
|
3021
|
-
<span class="position-absolute top-50 start-50 translate-middle text-muted small">Preview</span>
|
|
3022
|
-
</div>
|
|
3023
|
-
<div data-bind="text: selectedPageLabel" class="fw-bold"></div>
|
|
3024
|
-
<div data-bind="text: selectedPageDimension" class="text-muted small"></div>
|
|
3025
|
-
</div>
|
|
3026
|
-
</div>
|
|
3027
|
-
<div class="col-md-7">
|
|
3028
|
-
<div class="mb-3">
|
|
3029
|
-
<label for="pageSizeSelect" class="form-label fw-bold">Page Size:</label>
|
|
3030
|
-
<select class="form-select" id="pageSizeSelect"
|
|
3031
|
-
data-bind="options: availablePageSizes,
|
|
3032
|
-
optionsText: 'label',
|
|
3033
|
-
optionsValue: 'value',
|
|
3034
|
-
value: selectedPageSize">
|
|
3035
|
-
</select>
|
|
3036
|
-
</div>
|
|
3037
|
-
<div class="mb-3">
|
|
3038
|
-
<label for="pageOrientationSelect" class="form-label fw-bold">Page Orientation:</label>
|
|
3039
|
-
<select class="form-select" id="pageOrientationSelect"
|
|
3040
|
-
data-bind="options: availablePageOrientation,
|
|
3041
|
-
optionsText: 'label',
|
|
3042
|
-
optionsValue: 'value',
|
|
3043
|
-
value: selectedPageOrientation">
|
|
3044
|
-
</select>
|
|
3045
|
-
</div>
|
|
3046
|
-
<div class="alert alert-info p-2 small mt-2">
|
|
3047
|
-
This WORD will be exported using the selected page size. Ensure your content fits well.
|
|
3048
|
-
If the content width exceeds the selected size, it will default to Letter.
|
|
3049
|
-
</div>
|
|
3050
|
-
</div>
|
|
3051
|
-
</div>
|
|
3052
|
-
<div class="modal-footer">
|
|
3053
|
-
<button type="button" class="btn btn-light" data-bs-dismiss="modal">Cancel</button>
|
|
3054
|
-
<button type="button" class="btn btn-success" data-bs-dismiss="modal" data-bind="click: save">
|
|
3055
|
-
Save
|
|
3056
|
-
</button>
|
|
3057
|
-
</div>
|
|
3058
|
-
</div>
|
|
3059
|
-
</div>
|
|
3060
|
-
</script>
|
|
3061
|
-
<script type="text/html" id="word-options-template">
|
|
3062
|
-
<div class="modal-dialog modal-dialog-centered">
|
|
3063
|
-
<div class="modal-content" data-bind="with: WordPage">
|
|
3064
|
-
<div class="modal-header">
|
|
3065
|
-
<h5 class="modal-title" id="wordOptionsModalLabel"><i class="fa fa-file-pdf-o me-2"></i> Export to WORD</h5>
|
|
3066
|
-
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
3067
|
-
</div>
|
|
3068
|
-
<div class="modal-body row g-0">
|
|
3069
|
-
<!-- Left Side: Page Preview SVG -->
|
|
3070
|
-
<div class="col-md-5 d-flex justify-content-center align-items-center">
|
|
3071
|
-
<div id="pagePreviewBox" class="text-center">
|
|
3072
|
-
<div data-bind="style: {
|
|
3073
|
-
width: selectedWidth(),
|
|
3074
|
-
height: selectedHeight(),
|
|
3075
|
-
backgroundColor: selectedBackgroundStyle(),
|
|
3076
|
-
transition: 'all 0.3s ease'
|
|
3077
|
-
}"
|
|
3078
|
-
class="shadow rounded mx-auto mb-2 border position-relative">
|
|
3079
|
-
<span class="position-absolute top-50 start-50 translate-middle text-muted small">Preview</span>
|
|
3080
|
-
</div>
|
|
3081
|
-
<div data-bind="text: selectedPageLabel" class="fw-bold"></div>
|
|
3082
|
-
<div data-bind="text: selectedPageDimension" class="text-muted small"></div>
|
|
3083
|
-
</div>
|
|
3084
|
-
</div>
|
|
3085
|
-
|
|
3086
|
-
<!-- Right Side: Form Options -->
|
|
3087
|
-
<div class="col-md-7">
|
|
3088
|
-
<div class="mb-3">
|
|
3089
|
-
<label for="pageSizeSelect" class="form-label fw-bold">Page Size:</label>
|
|
3090
|
-
<select class="form-select" id="pageSizeSelect"
|
|
3091
|
-
data-bind="options: availablePageSizes,
|
|
3092
|
-
optionsText: 'label',
|
|
3093
|
-
optionsValue: 'value',
|
|
3094
|
-
value: selectedPageSize">
|
|
3095
|
-
</select>
|
|
3096
|
-
</div>
|
|
3097
|
-
<div class="mb-3">
|
|
3098
|
-
<label for="pageOrientationSelect" class="form-label fw-bold">Page Orientation:</label>
|
|
3099
|
-
<select class="form-select" id="pageOrientationSelect"
|
|
3100
|
-
data-bind="options: availablePageOrientation,
|
|
3101
|
-
optionsText: 'label',
|
|
3102
|
-
optionsValue: 'value',
|
|
3103
|
-
value: selectedPageOrientation">
|
|
3104
|
-
</select>
|
|
3105
|
-
</div>
|
|
3106
|
-
<div class="alert alert-info p-2 small mt-2">
|
|
3107
|
-
This Word will be exported using the selected page size. Ensure your content fits well.
|
|
3108
|
-
If the content width exceeds the selected size, it will default to Letter.
|
|
3109
|
-
</div>
|
|
3110
|
-
</div>
|
|
3111
|
-
</div>
|
|
3112
|
-
<div class="modal-footer">
|
|
3113
|
-
<button type="button" class="btn btn-light" data-bs-dismiss="modal">Cancel</button>
|
|
3114
|
-
<button type="button" class="btn btn-success" data-bs-dismiss="modal" data-bind="click: download">
|
|
3115
|
-
<i class="fa fa-download me-1"></i> Download WORD
|
|
3116
|
-
</button>
|
|
3117
|
-
</div>
|
|
3118
|
-
</div>
|
|
3119
|
-
</div>
|
|
3120
|
-
</script>
|
|
3121
|
-
<script type="text/html" id="pdf-options-template">
|
|
3122
|
-
<div class="modal-dialog modal-dialog-centered">
|
|
3123
|
-
<div class="modal-content" data-bind="with: PdfPage">
|
|
3124
|
-
<div class="modal-header">
|
|
3125
|
-
<h5 class="modal-title" id="pdfOptionsModalLabel"><i class="fa fa-file-pdf-o me-2"></i> Export to PDF</h5>
|
|
3126
|
-
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
3127
|
-
</div>
|
|
3128
|
-
<div class="modal-body row g-0">
|
|
3129
|
-
<!-- Left Side: Page Preview SVG -->
|
|
3130
|
-
<div class="col-md-5 d-flex justify-content-center align-items-center">
|
|
3131
|
-
<div id="pagePreviewBox" class="text-center">
|
|
3132
|
-
<div data-bind="style: {
|
|
3133
|
-
width: selectedWidth(),
|
|
3134
|
-
height: selectedHeight(),
|
|
3135
|
-
backgroundColor: selectedBackgroundStyle(),
|
|
3136
|
-
transition: 'all 0.3s ease'
|
|
3137
|
-
}"
|
|
3138
|
-
class="shadow rounded mx-auto mb-2 border position-relative">
|
|
3139
|
-
<span class="position-absolute top-50 start-50 translate-middle text-muted small">Preview</span>
|
|
3140
|
-
</div>
|
|
3141
|
-
<div data-bind="text: selectedPageLabel" class="fw-bold"></div>
|
|
3142
|
-
<div data-bind="text: selectedPageDimension" class="text-muted small"></div>
|
|
3143
|
-
</div>
|
|
3144
|
-
</div>
|
|
3145
|
-
|
|
3146
|
-
<!-- Right Side: Form Options -->
|
|
3147
|
-
<div class="col-md-7">
|
|
3148
|
-
<div class="mb-3">
|
|
3149
|
-
<label for="pageSizeSelect" class="form-label fw-bold">Page Size:</label>
|
|
3150
|
-
<select class="form-select" id="pageSizeSelect"
|
|
3151
|
-
data-bind="options: availablePageSizes,
|
|
3152
|
-
optionsText: 'label',
|
|
3153
|
-
optionsValue: 'value',
|
|
3154
|
-
value: selectedPageSize">
|
|
3155
|
-
</select>
|
|
3156
|
-
</div>
|
|
3157
|
-
<div class="mb-3">
|
|
3158
|
-
<label for="pageOrientationSelect" class="form-label fw-bold">Page Orientation:</label>
|
|
3159
|
-
<select class="form-select" id="pageOrientationSelect"
|
|
3160
|
-
data-bind="options: availablePageOrientation,
|
|
3161
|
-
optionsText: 'label',
|
|
3162
|
-
optionsValue: 'value',
|
|
3163
|
-
value: selectedPageOrientation">
|
|
3164
|
-
</select>
|
|
3165
|
-
</div>
|
|
3166
|
-
<div class="alert alert-info p-2 small mt-2">
|
|
3167
|
-
This PDF will be exported using the selected page size. Ensure your content fits well.
|
|
3168
|
-
If the content width exceeds the selected size, it will default to Letter.
|
|
3169
|
-
</div>
|
|
3170
|
-
</div>
|
|
3171
|
-
</div>
|
|
3172
|
-
<div class="modal-footer">
|
|
3173
|
-
<button type="button" class="btn btn-light" data-bs-dismiss="modal">Cancel</button>
|
|
3174
|
-
<button type="button" class="btn btn-success" data-bs-dismiss="modal" data-bind="click: download">
|
|
3175
|
-
<i class="fa fa-download me-1"></i> Download PDF
|
|
3176
|
-
</button>
|
|
3177
|
-
</div>
|
|
3178
|
-
</div>
|
|
3179
|
-
</div>
|
|
3180
|
-
</script>
|
|
3181
|
-
`);
|
|
3182
|
-
this.cdref.detectChanges();
|
|
3183
|
-
}
|
|
3184
|
-
bindWindowResize(vm) {
|
|
3185
|
-
$(window).resize(function () {
|
|
3186
|
-
if (vm.reportMode == "execute") {
|
|
3187
|
-
vm.DrawChart();
|
|
3188
|
-
}
|
|
3189
|
-
;
|
|
3190
|
-
});
|
|
3191
|
-
}
|
|
3192
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DotnetreportComponent, deps: [{ token: i0.Injector }, { token: i1.DomSanitizer }, { token: i0.ChangeDetectorRef }, { token: BASE_URL_TOKEN }, { token: i2.HttpClient }, { token: i3.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component });
|
|
3193
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DotnetreportComponent, selector: "app-dotnetreport", ngImport: i0, template: "<div id=\"dot-net-report\" class=\"body-content\">\r\n<div class=\"container-fluid\">\r\n <div data-bind=\"template: {name: 'admin-mode-template'}, visible: allowAdmin\" style=\"display: none;\"></div>\r\n\r\n <!--\r\n The markup code below is related to presentation. You don't have to change it, unless you\r\n intentionally want to change something in the Report Builder's behavior in your Application.\r\n It's Recommended you use it as is. You will be responsible for managing and maintaining any changes.\r\n -->\r\n <!-- Folders/Report List -->\r\n <div id=\"report-start\" data-bind=\"if: ReportMode() == 'start' || ReportMode() == 'generate'\">\r\n <div class=\"card folder-panel\" data-bind=\"visible: true\" style=\"display: none;\">\r\n <div class=\"card-header\">\r\n <nav class=\"navbar navbar-expand-lg navbar-light bg-light\">\r\n <a class=\"navbar-brand\" href=\"#\" data-bind=\"click: function() {SelectedFolder(null); designingHeader(false); searchReports(''); $('#search-report').val([]).trigger('change'); }\">Manage Reports</a>\r\n <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\r\n <span class=\"navbar-toggler-icon\"></span>\r\n </button>\r\n\r\n <div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\">\r\n <ul class=\"navbar-nav mr-auto\">\r\n <li class=\"nav-item dropdown\" data-bind=\"visible: (CanSaveReports() && appSettings.usePromptBuilder()) || adminMode()\">\r\n <a href=\"#\" class=\"nav-link dropdown-toggle\" role=\"button\" data-bs-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n <span class=\"fa fa-plus\"></span> New Report\r\n </a>\r\n <div class=\"dropdown-menu\">\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: createNewReport\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\"><i class=\"fa fa-sliders\"></i> Use Standard Designer</a>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: createNewReportAi\"><i class=\"fa fa-bolt\"></i> Use Smarter Designer</a>\r\n </div>\r\n </li>\r\n <li class=\"nav-item active\" data-bind=\"visible: (SelectedFolder() ? SelectedFolder().canEdit : (CanSaveReports() || adminMode())) && !appSettings.usePromptBuilder()\">\r\n <a href=\"#\" class=\"nav-link\" data-bind=\"click: createNewReport\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\">\r\n <span class=\"fa fa-plus\"></span> New Report\r\n </a>\r\n </li>\r\n <li class=\"nav-item\" data-bind=\"visible: CanManageFolders() || adminMode()\">\r\n <a href=\"#\" class=\"nav-link\" data-bind=\"click: ManageFolder.newFolder\">\r\n <span class=\"fa fa-folder-o\"></span> Add Folder\r\n </a>\r\n </li>\r\n <li class=\"nav-item dropdown\" data-bind=\"visible: (CanManageFolders() || adminMode()) && SelectedFolder()!=null && (SelectedFolder().canEdit || SelectedFolder().canDelete || adminMode())\">\r\n <a href=\"#\" class=\"nav-link dropdown-toggle\" role=\"button\" data-bs-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n <span class=\"fa fa-folder\"></span> Folder Options\r\n </a>\r\n <div class=\"dropdown-menu\">\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: ManageFolder.editFolder, visible: SelectedFolder() && (SelectedFolder().canEdit || adminMode())\">Edit Selected Folder</a>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: ManageFolder.deleteFolder, visible: SelectedFolder() && (SelectedFolder().canDelete || adminMode())\">Delete Selected Folder</a>\r\n </div>\r\n </li>\r\n <li class=\"nav-item active\" data-bind=\"visible: adminMode() && SelectedFolder() ==null\">\r\n <a href=\"#\" class=\"nav-link\" data-bind=\"click: function(){ initHeaderDesigner(false); }\">\r\n <span class=\"fa fa-arrow-up\"></span> Report Header\r\n </a>\r\n </li>\r\n <li class=\"nav-item dropdown\" data-bind=\"visible: appSettings.showImportExport() || adminMode()\">\r\n <a href=\"#\" class=\"nav-link dropdown-toggle\" role=\"button\" data-bs-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n <span class=\"fa fa-exchange\"></span> Import / Export\r\n </a>\r\n <div class=\"dropdown-menu\">\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function(){ selectMode(!selectMode()); }\">\r\n <span data-bind=\"css: selectMode() ? 'fa fa-check-square text-primary' : 'fa fa-square-o'\"></span>\r\n <span data-bind=\"text: selectMode() ? 'Cancel Select Mode' : 'Select Mode'\"></span>\r\n </a>\r\n <div class=\"dropdown-divider\"></div>\r\n <a class=\"dropdown-item\" href=\"#\" data-bs-toggle=\"modal\" data-bs-target=\"#uploadFileModal\" data-bind=\"visible: !selectMode()\" title=\"Import Report from JSON file\">\r\n <span class=\"fa fa-upload\"></span> Import Reports\r\n </a>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"visible: selectMode, click: exportSelectedReportJson\">\r\n <span class=\"fa fa-download\"></span> Export Selected Reports\r\n </a>\r\n </div>\r\n </li>\r\n </ul>\r\n <div class=\"form-inline my-2 my-lg-0 ms-auto w-50\">\r\n <div class=\"input-group w-100\">\r\n <p id=\"search-input\" class=\"form-control search-input\" data-placeholder=\"Search Report by Name, Description or Data Field...\"></p>\r\n <span data-bind=\"click: searchForReports\" class=\"input-group-text\" style=\"height: 38px; cursor: pointer;\" title=\"Search\"><i class=\"fa fa-search\"></i></span>\r\n <span data-bind=\"click: function() {resetQuery(true, true);}\" class=\"input-group-text\" style=\"height: 38px; cursor: pointer;\" title=\"Clear Search\"><i class=\"fa fa-close\"></i></span>\r\n </div>\r\n </div>\r\n </div>\r\n </nav>\r\n </div>\r\n <div class=\"card-body\">\r\n <div data-bind=\"visible: designingHeader, with: headerDesigner\" style=\"display: none;\" class=\"overflow-auto\">\r\n <div class=\"checkbox\">\r\n <label>\r\n <input type=\"checkbox\" data-bind=\"checked: UseReportHeader\"> Use Report Header\r\n </label>\r\n </div>\r\n <div data-bind=\"visible: UseReportHeader\">\r\n <p class=\"alert alert-info\">\r\n You can design the common report header below that will be applied to all reports where report headers are turned on.\r\n </p>\r\n <div class=\"form-group row m-1\" data-bind=\"visible: clientListIds().length > 0\">\r\n <div class=\"col-md-3 col-sm-3\">\r\n <label class=\"control-label\">Headers for other Clients saved</label>\r\n </div>\r\n <div class=\"col-md-3 col-sm-3\">\r\n <select class=\"form-control\"\r\n data-bind=\"options: clientListIds,\r\n value: selectedHeaderClientId,\r\n optionsCaption: 'No Client Id (Global)',\r\n event: { change: function () { loadHtmlHeader(true); } }\">\r\n </select>\r\n </div>\r\n <div class=\"col-md-1 col-sm-1\">\r\n <span data-bs-toggle=\"tooltip\" class=\"fa fa-question-circle helptip\"\r\n title=\"Choose a client to design its report header\"></span>\r\n </div>\r\n </div>\r\n <div class=\"form-group row m-1\">\r\n <div class=\"col-md-3 col-sm-3\">\r\n <label class=\"control-label\">Specify Client Id to Restrict Access</label>\r\n </div>\r\n <div class=\"col-md-3 col-sm-3\">\r\n <input class=\"form-control text-box single-line\" type=\"text\" data-bind=\"value: headerClientId\">\r\n </div>\r\n <div class=\"col-md-1 col-sm-1\">\r\n <span data-bs-toggle=\"tooltip\" data-placement=\"right\" class=\"fa fa-question-circle helptip\" title=\"Leave blank to give all clients access (Global Report Header)\"></span>\r\n </div>\r\n </div>\r\n <textarea id=\"report-header-editor\"></textarea>\r\n <button class=\"btn btn-primary btn-sm mt-2\" data-bind=\"click: saveHtmlHeader\">\r\n Save Changes\r\n </button>\r\n </div>\r\n <div data-bind=\"visible: !UseReportHeader()\">\r\n <p class=\"alert alert-info\">\r\n If you turn off the <b>Use Report Header</b> option,\r\n the <b>Report Header</b> will not be applied in reports.\r\n </p>\r\n <button class=\"btn btn-primary btn-sm mt-2\" data-bind=\"click: saveHtmlHeader\">\r\n Save Changes\r\n </button>\r\n </div>\r\n </div>\r\n <div data-bind=\"ifnot: designingHeader\">\r\n <div class=\"btn-group pull-right\" role=\"group\">\r\n <button type=\"button\" class=\"btn btn-light\" data-bs-toggle=\"tooltip\" title=\"List View\"\r\n data-bind=\"css: { 'active': layout() === 'list' }, click: toggleLayout\">\r\n <span class=\"fa fa-list\"></span>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-light\" data-bs-toggle=\"tooltip\" title=\"Icon View\"\r\n data-bind=\"css: { 'active': layout() === 'icons' }, click: toggleLayout\">\r\n <span class=\"fa fa-th-large\"></span>\r\n </button>\r\n </div>\r\n\r\n <div data-bind=\"if: layout()=='icons'\">\r\n <div data-bind=\"visible: !SelectedFolder() && !searchReports()\">\r\n <p>Please choose Folders below to view Reports</p>\r\n <ul class=\"folder-list\" data-bind=\"foreach: Folders\">\r\n <li data-bind=\"click: function(){ $parent.SelectedFolder($data); }\">\r\n <span data-bind=\"visible: $root.selectMode, click: function(d,e){ isSelected(!isSelected()); e.stopPropagation(); },\r\n css: isSelected() ? 'fa fa-check-square text-primary me-2' : 'fa fa-square-o me-2'\"></span>\r\n <span class=\"fa fa-3x fa-folder text-secondary\"></span>\r\n <span class=\"desc\" data-bind=\"text: FolderName\"></span>\r\n </li>\r\n </ul>\r\n </div>\r\n <div data-bind=\"visible: SelectedFolder() || searchReports()\">\r\n <div class=\"clearfix\">\r\n <p class=\"pull-left\">Please choose a Report from this Folder</p>\r\n <div class=\"pull-right\">\r\n <a href=\"#\" class=\"btn btn-light\" data-bind=\"click: function(){ SelectedFolder(null); searchReports(''); $('#search-report').val([]).trigger('change');}\">\r\n ..back to Folders\r\n </a>\r\n </div>\r\n </div>\r\n <div class=\"list-group list-overflow\">\r\n <div data-bind=\"if: SelectedFolder()!=null && reportsInFolder().length==0\">\r\n This folder is empty.\r\n </div>\r\n <div data-bind=\"if: searchReports() && reportsInSearch().length==0\">\r\n No Reports found matching your Search\r\n </div>\r\n <div class=\"list-group\" data-bind=\"foreach: searchReports() ? reportsInSearch() : reportsInFolder()\">\r\n <div class=\"list-group-item\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-7\">\r\n <input type=\"checkbox\" data-bind=\"visible: $root.selectMode, checked: isSelected\" class=\"pull-left me-2\" />\r\n <div class=\"fa fa-2x pull-left\" data-bind=\"css: {'fa-file': reportType=='List', 'fa-th-list': reportType=='Summary', 'fa-bar-chart': reportType=='Bar', 'fa-pie-chart': reportType=='Pie', 'fa-line-chart': reportType=='Line', 'fa-globe': reportType.indexOf('Map')==0, 'fa-window-maximize': reportType=='Single', 'fa-random': reportType=='Pivot', 'fa-window-restore': reportType=='Treemap', 'fa-signal': reportType == 'Combo', 'fa-code': reportType == 'Html', 'fa-map': reportType == 'HeatMap'}\"></div>\r\n <div class=\"pull-left\">\r\n <h4>\r\n <a data-bind=\"click: runReport\" style=\"cursor: pointer\">\r\n <span data-bind=\"highlightedText: { text: reportName, highlight: $parent.searchReports, css: 'highlight' }\"></span>\r\n </a>\r\n </h4>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n <p data-bind=\"text: reportDescription\"></p>\r\n <p data-bind=\"if: $parent.searchReports()\">\r\n <span class=\"fa fa-folder\"></span> <span data-bind=\"text: folderName\"></span>\r\n <span>\r\n <span data-bind=\"text: message\" class=\"highlight small\"></span>\r\n </span>\r\n </p>\r\n <div data-bind=\"if: $parent.adminMode\">\r\n <div class=\"small\">\r\n <b>Report Access</b><br />\r\n Manage by User <span class=\"badge text-bg-info text-white\" data-bind=\"text: userId ? userId : 'Any User'\"></span>\r\n <br />\r\n View only by User <span class=\"badge text-bg-info text-white\" data-bind=\"text: (viewOnlyUserId ? viewOnlyUserId : (userId ? userId : 'Any User'))\"></span>\r\n <br />\r\n <div data-bind=\"if: deleteOnlyUserId\">\r\n Delete only by User <span class=\"badge text-bg-info text-white\" data-bind=\"text: deleteOnlyUserId\"></span>\r\n <br />\r\n </div>\r\n <div data-bind=\"if: userRole\">\r\n Manage by Role <span class=\"badge text-bg-info text-white\" data-bind=\"text: userRole ? userRole : 'No Role'\"></span>\r\n <br />\r\n </div>\r\n <div data-bind=\"if: viewOnlyUserRole\">\r\n View only by Role <span class=\"badge text-bg-info text-white\" data-bind=\"text: viewOnlyUserRole ? viewOnlyUserRole : 'Any Role'\"></span>\r\n <br />\r\n </div>\r\n <div data-bind=\"if: deleteOnlyUserRole\">\r\n Delete only by Role <span class=\"badge text-bg-info text-white\" data-bind=\"text: deleteOnlyUserRole ? deleteOnlyUserRole : 'Same as Manage'\"></span>\r\n <br />\r\n </div>\r\n <div data-bind=\"if: clientId\">\r\n For Client <span class=\"label label-info\" data-bind=\"text: clientId ? clientId : 'Any'\"></span>\r\n <br />\r\n </div>\r\n <div>\r\n Direct Link to Run Report: <a data-bind=\"attr: {href: '/DotNetReport/?linkedreport=true&noparent=true&reportId=' + reportId }\" target=\"_blank\"><span class=\"fa fa-link\"></span></a>\r\n <a href=\"#\" data-bind=\"click: navigator.clipboard.writeText(window.location.href + '?linkedreport=true&noparent=true&reportId=' + reportId )\"><span class=\"fa fa-copy\" title=\"Click to Copy Link\"></span></a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-5 right-align\">\r\n <div class=\"d-none d-md-block\">\r\n <br />\r\n <span data-bind=\"if: $root.CanSaveReports() || $root.adminMode() \">\r\n <button class=\"btn btn-sm btn-outline-secondary\" data-bind=\"click: openReport, visible: canEdit\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\">\r\n <span class=\"fa fa-edit\" aria-hidden=\"true\"></span> Edit\r\n </button>\r\n <button class=\"btn btn-sm btn-outline-secondary\" data-bind=\"click: copyReport, visible: canEdit\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\">\r\n <span class=\"fa fa-copy\" aria-hidden=\"true\"></span> Copy\r\n </button>\r\n </span>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" data-bind=\"click: runReport\">\r\n <span class=\"fa fa-gears\" aria-hidden=\"true\"></span> Run\r\n </button>\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" style=\"margin-left: -4px;\">\r\n <span class=\"sr-only\"></span>\r\n </button>\r\n <div class=\"dropdown-menu dropdown-menu-right\">\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() {exportReport('pdf');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download PDF\r\n </a>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() {exportReport('excel');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download Excel\r\n </a>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"visible: hasDrilldown, click: function() {exportReport('excel-sub');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download Excel (Expanded)\r\n </a>\r\n </div>\r\n </div>\r\n <button class=\"btn btn-sm btn-outline-secondary\" data-bind=\"click: deleteReport, visible: canDelete\">\r\n <span class=\"fa fa-trash\" aria-hidden=\"true\"></span> Delete\r\n </button>\r\n <br />\r\n </div>\r\n\r\n <div class=\"d-block d-md-none\">\r\n <span data-bind=\"if: $root.CanSaveReports() || $root.adminMode()\">\r\n <button class=\"btn btn-sm btn-outline-secondary\" title=\"Edit Report\" data-bind=\"click: openReport, visible: canEdit\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\">\r\n <span class=\"fa fa-edit\" aria-hidden=\"true\"></span>\r\n </button>\r\n <button class=\"btn btn-sm btn-light\" data-bind=\"click: copyReport, visible: canEdit\" title=\"Copy Report\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\">\r\n <span class=\"fa fa-copy\" aria-hidden=\"true\"></span>\r\n </button>\r\n </span>\r\n\r\n <div class=\"btn-group\">\r\n <button class=\"btn btn-sm btn-outline-secondary\" data-bind=\"click: runReport\" title=\"Run Report\">\r\n <span class=\"fa fa-gears\" aria-hidden=\"true\"></span>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" style=\"margin-left: -4px;\">\r\n <span class=\"sr-only\"></span>\r\n </button>\r\n <div class=\"dropdown-menu\">\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() {exportReport('excel');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download Excel\r\n </a>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"visible: hasDrilldown, click: function() {exportReport('excel-sub');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download Excel with inner rows\r\n </a>\r\n </div>\r\n </div>\r\n\r\n <button class=\"btn btn-sm btn-outline-secondary\" title=\"Delete Report\" data-bind=\"click: deleteReport, visible: canDelete\">\r\n <span class=\"fa fa-trash\" aria-hidden=\"true\"></span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div data-bind=\"if: layout()=='list'\">\r\n <div class=\"file-explorer-container\">\r\n <nav class=\"breadcrumb\">\r\n <a href=\"#\" class=\"breadcrumb-item\" data-bind=\"click: function(){ SelectedFolder(null); searchReports(''); }\">\r\n All Folders\r\n </a>\r\n <span class=\"breadcrumb-item active\" data-bind=\"visible: SelectedFolder && !searchReports(), text: SelectedFolder()?.FolderName\"></span>\r\n <span class=\"breadcrumb-item active\" data-bind=\"visible: searchReports\">\r\n Search Results\r\n </span>\r\n </nav>\r\n\r\n <div data-bind=\"visible: !SelectedFolder() && !searchReports()\">\r\n <div class=\"container-fluid\">\r\n <div class=\"row fw-bold border-bottom py-2 w-100\">\r\n <div class=\"col-md-6\">Name</div>\r\n <div class=\"col-md-6 text-end\" data-bind=\"visible: adminMode\">Access Control</div>\r\n </div>\r\n <div class=\"folder-list\" data-bind=\"foreach: Folders\">\r\n <div class=\"row clickable py-2 border-bottom align-items-center w-100\" data-bind=\"click: function(){ $parent.SelectedFolder($data); }\">\r\n <div class=\"col-md-6 d-flex align-items-center\">\r\n <span data-bind=\"visible: $root.selectMode, click: function(d,e){ isSelected(!isSelected()); e.stopPropagation(); },\r\n css: isSelected() ? 'fa fa-check-square text-primary me-2' : 'fa fa-square-o me-2'\"></span>\r\n <span class=\"fa fa-folder text-secondary me-2\"></span>\r\n <span data-bind=\"text: FolderName\"></span>\r\n </div>\r\n <div class=\"col-md-6 text-end\" data-bind=\"visible: $parent.adminMode\">\r\n <!--<div class=\"badge bg-info text-white\" data-bind=\"text: userId ? userId : 'Any User'\"></div>\r\n <div class=\"badge bg-info text-white\" data-bind=\"text: userRole ? userRole : 'No Role'\"></div>-->\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div data-bind=\"visible: SelectedFolder() || searchReports()\">\r\n <div class=\"container-fluid\">\r\n <div data-bind=\"if: SelectedFolder()!=null && reportsInFolder().length==0\">\r\n <p class=\"text-muted\">This folder is empty.</p>\r\n </div>\r\n\r\n <div data-bind=\"if: searchReports() && reportsInSearch().length==0\">\r\n <p class=\"text-center text-muted\">No reports found matching your search.</p>\r\n </div>\r\n <div data-bind=\"if: reportsInFolder().length > 0 || reportsInSearch().length > 0\">\r\n <div class=\"row fw-bold border-bottom py-2 w-100\">\r\n <div class=\"col-md-4\">Name</div>\r\n <div class=\"col-md-1\"></div>\r\n <div class=\"col-md-2\" data-bind=\"visible: searchReports()\">Folder</div>\r\n <div class=\"col-md-2\"></div>\r\n <div class=\"col-md-2\" data-bind=\"visible: adminMode\">Access</div>\r\n <div class=\"col-md-1\" data-bind=\"visible: adminMode\">Direct Link</div>\r\n </div>\r\n\r\n <div class=\"report-list\" data-bind=\"foreach: searchReports() ? reportsInSearch() : reportsInFolder()\">\r\n <div class=\"row border-bottom py-2 align-items-center w-100\">\r\n <div class=\"col-md-4 d-flex align-items-center\">\r\n <input type=\"checkbox\" data-bind=\"visible: $root.selectMode, checked: isSelected\" class=\"me-2\" />\r\n <span class=\"fa\" data-bind=\"css: {\r\n 'fa-file': reportType=='List',\r\n 'fa-th-list': reportType=='Summary',\r\n 'fa-bar-chart': reportType=='Bar',\r\n 'fa-pie-chart': reportType=='Pie',\r\n 'fa-line-chart': reportType=='Line',\r\n 'fa-signal': reportType=='Combo',\r\n 'fa-globe': reportType.indexOf('Map')==0,\r\n 'fa-window-maximize': reportType=='Single',\r\n 'fa-random': reportType=='Pivot',\r\n 'fa-window-restore': reportType=='Treemap',\r\n 'fa-code': reportType == 'Html',\r\n 'fa-map': reportType == 'HeatMap'\r\n }\"></span>\r\n <a class=\"ms-2\" data-bind=\"click: runReport, highlightedText: { text: reportName, highlight: $parent.searchReports, css: 'highlight' }\" style=\"cursor: pointer\"></a> \r\n <span data-bind=\"text: message\" class=\"highlight small\"></span>\r\n </div>\r\n\r\n <div class=\"col-md-1\">\r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-sm\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\r\n <span class=\"fa fa-ellipsis-h\"></span>\r\n </button>\r\n <ul class=\"dropdown-menu\">\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\" data-bind=\"click: openReport, visible: canEdit\">\r\n <span class=\"fa fa-edit\"></span> Edit\r\n </a>\r\n </li>\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\" data-bind=\"click: copyReport, visible: canEdit\">\r\n <span class=\"fa fa-copy\"></span> Copy\r\n </a>\r\n </li>\r\n <li>\r\n <a class=\"dropdown-item text-danger\" href=\"#\" data-bind=\"click: deleteReport, visible: canDelete\">\r\n <span class=\"fa fa-trash\"></span> Delete\r\n </a>\r\n </li>\r\n <li><hr class=\"dropdown-divider\"></li>\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: runReport\">\r\n <span class=\"fa fa-gears\"></span> Run Report\r\n </a>\r\n </li>\r\n <li class=\"dropdown-submenu\">\r\n <a class=\"dropdown-item dropdown-toggle\" href=\"#\">Export</a>\r\n <ul class=\"dropdown-menu\">\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() {exportReport('pdf');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download PDF\r\n </a>\r\n </li>\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() {exportReport('excel');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download Excel\r\n </a>\r\n </li>\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"visible: hasDrilldown, click: function() {exportReport('excel-sub');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download Excel (Expanded)\r\n </a>\r\n </li>\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"visible:$parent.adminMode, click: function() {exportReport('json');}\">\r\n <span class=\"fa fa-file\"></span> Export JSON\r\n </a>\r\n </li>\r\n </ul>\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-md-2\" data-bind=\"text: folderName, visible: $parent.searchReports()\"></div>\r\n <div class=\"col-md-2\"></div>\r\n <div class=\"col-md-2\" data-bind=\"visible: $parent.adminMode\">\r\n <div class=\"badge bg-info text-white\" data-bind=\"text: userId ? userId : 'Any User'\"></div>\r\n <div class=\"badge bg-info text-white\" data-bind=\"text: userRole ? userRole : 'No Role'\"></div>\r\n </div>\r\n <div class=\"col-md-1\" data-bind=\"visible: $parent.adminMode\">\r\n <a data-bind=\"attr: {href: '/DotNetReport?linkedreport=true&noparent=true&reportId=' + reportId }\" target=\"_blank\"><span class=\"fa fa-link\"></span></a>\r\n \r\n <a href=\"#\" data-bind=\"click: function() { navigator && navigator.clipboard && navigator.clipboard.writeText('/DotNetReport?linkedreport=true&noparent=true&reportId=' + reportId) }\">\r\n <span class=\"fa fa-copy\" title=\"Copy Link\"></span>\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n\r\n <div data-bind=\"visible: ReportMode() == 'execute' || ReportMode() == 'linked' || ReportMode() == 'design'\">\r\n <div class=\"card\" data-bind=\"visible: true;\" style=\"display: none;\">\r\n <div class=\"card-header\">\r\n <nav class=\"navbar navbar-expand-lg navbar-light bg-light\">\r\n <a class=\"navbar-brand\" href=\"#\">Viewing Report</a>\r\n <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\r\n <span class=\"navbar-toggler-icon\"></span>\r\n </button>\r\n <div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\">\r\n <ul class=\"navbar-nav me-auto\"></ul>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button class=\"btn btn-light btn-sm\" data-bind=\"click: function() {$root.ReportMode('start'); $root.textQuery.setupSearch();}\">\r\n <i class=\"fa fa-arrow-left\"></i>\r\n <span>Back to Reports</span>\r\n </button>\r\n <button class=\"btn btn-light btn-sm\" data-bind=\"visible: ReportMode()=='linked'\">\r\n <i class=\"fa fa-arrow-circle-left\"></i>\r\n <span>Back to Parent Report</span>\r\n </button>\r\n <div class=\"dropdown\" data-bind=\"visible: $root.CanEdit() && ReportID()\">\r\n <button class=\"dropdown-toggle btn btn-light btn-sm\" role=\"button\" data-bs-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n <i class=\"fa fa-edit\"></i> Edit Report\r\n </button>\r\n <div class=\"dropdown-menu\">\r\n <a class=\"dropdown-item\" href=\"#\"\r\n data-bind=\"click: function(){ SaveReport(true); }\"\r\n data-bs-toggle=\"modal\"\r\n data-bs-target=\"#modal-reportbuilder\">\r\n <i class=\"fa fa-sliders\"></i> Edit with Standard Designer\r\n </a>\r\n <a class=\"dropdown-item\" href=\"#\"\r\n data-bind=\"click: editReportAi\">\r\n <i class=\"fa fa-bolt\"></i> Edit with Smarter Designer\r\n </a>\r\n </div>\r\n </div>\r\n\r\n <button class=\"btn btn-light btn-sm\" data-bind=\"click: RefreshReport, visible: false\">\r\n <i class=\"fa fa-refresh\"></i>\r\n <span>Refresh</span>\r\n </button> \r\n <span data-bind=\"visible: isDirty\" title=\"You have unsaved changes\">\r\n <i class=\"text-warning fa fa-exclamation-triangle\"></i>\r\n </span>\r\n <button class=\"btn btn-light btn-sm\" data-bind=\"visible: $root.CanEdit(), click: SaveWithoutRun\">\r\n <i class=\"fa fa-save\"></i> \r\n <span>Save Report</span>\r\n </button>\r\n <div class=\"dropdown\" data-bind=\"hidden: (DontExecuteOnRun() && !reportRan()) || !ReportID()\">\r\n <button type=\"button\" class=\"btn btn-light btn-sm dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\r\n <i class=\"fa fa-download\"></i>\r\n <span>Export</span>\r\n </button>\r\n <ul class=\"dropdown-menu dropdown-menu-end\"> \r\n <li data-bind=\"hidden: appSettings.useAltPdf\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: appSettings.showPageSize\r\n ? function() { PdfPage.isDebug = false; $('#pdfOptionsModal').modal('show'); }\r\n : function() { downloadPdf(false); }\">\r\n <i class=\"fa fa-file-pdf-o\"></i> Pdf\r\n </a>\r\n </li>\r\n <li data-bind=\"visible: adminMode() && !appSettings.useAltPdf\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: appSettings.showPageSize\r\n ? function() { PdfPage.isDebug = true; $('#pdfOptionsModal').modal('show'); }\r\n : function() { downloadPdf(true); }\">\r\n <i class=\"fa fa-file-pdf-o\"></i> Pdf (Debug)\r\n </a>\r\n </li>\r\n <li data-bind=\"visible: appSettings.useAltPdf\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: appSettings.showPageSize\r\n ? function() { $('#pdfOptionsModal').modal('show'); }\r\n : function() { downloadPdfAlt(); }\">\r\n <i class=\"fa fa-file-pdf-o\"></i> Pdf\r\n </a>\r\n </li>\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: downloadExcel\">\r\n <i class=\"fa fa-file-excel-o\"></i> Excel\r\n </a>\r\n </li>\r\n <li data-bind=\"visible: canDrilldown\">\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: downloadExcelWithDrilldown\">\r\n <i class=\"fa fa-file-excel-o\"></i> Excel (Expanded)\r\n </a>\r\n </li>\r\n <li data-bind=\"hidden: appSettings.dontWordExport\">\r\n <a class=\"dropdown-item\" data-bind=\"click: appSettings.showPageSize\r\n ? function() { $('#wordOptionsModal').modal('show'); }\r\n : function() { downloadWord(); }\">\r\n <span class=\"fa fa-file-word-o\"></span> Word\r\n </a>\r\n </li>\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: downloadCsv\">\r\n <i class=\"fa fa-file-excel-o\"></i> Csv\r\n </a>\r\n </li>\r\n <li data-bind=\"hidden: appSettings.dontXmlExport\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: downloadXml\">\r\n <i class=\"fa fa-file-code-o\"></i> Xml\r\n </a>\r\n </li>\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: printReportPage\">\r\n <i class=\"fa fa-print\"></i> Print\r\n </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n </nav>\r\n </div>\r\n <div class=\"card-body\">\r\n <div data-bind=\"if: activeDesign()\">\r\n <div data-bind=\"if: ReportID() <= 0\">\r\n <ul class=\"nav nav-tabs\" id=\"designTabs\" role=\"tablist\"> \r\n <li class=\"nav-item\" role=\"presentation\">\r\n <button class=\"nav-link active\" id=\"designer-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#designer\" type=\"button\" role=\"tab\">\r\n Report Designer\r\n </button>\r\n </li>\r\n <li class=\"nav-item\" role=\"presentation\">\r\n <button class=\"nav-link\" id=\"nl-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#nl\" type=\"button\" role=\"tab\">\r\n Use Prompt<span title=\"This feature is still in Beta release. You can turn it off from settings\" style=\"font-size: 10pt; padding: 5px; max-width: 350px; white-space: normal; margin-bottom: 0;\">\r\n <i class=\"fa fa-info-circle\"></i>\r\n </span>\r\n </button>\r\n </li>\r\n </ul>\r\n\r\n <div class=\"tab-content mt-3\">\r\n <div class=\"tab-pane fade show active\" id=\"designer\" role=\"tabpanel\" aria-labelledby=\"designer-tab\">\r\n <div data-bind=\"template: 'report-designer-compact', data: $root\"></div>\r\n </div>\r\n <div class=\"tab-pane fade\" id=\"nl\" role=\"tabpanel\" aria-labelledby=\"nl-tab\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n <p>\r\n What would you like to know? Type a <b>natural language prompt</b> below to ask questions about your data.<br>\r\n Use <b>Auto Complete</b> suggestions to guide your query \u2014 the AI will convert your prompt into a Dotnet Report that you can then preview, design, save and reuse.\r\n </p>\r\n\r\n <p id=\"query-input\" class=\"query-input\">\r\n Show me \r\n </p>\r\n\r\n <p>\r\n <button data-bind=\"click: function() {runQuery(false);}\" class=\"btn btn-primary btn-sm\">\r\n <span class=\"fa fa-magic\"></span> Process with AI\r\n </button>\r\n\r\n <button data-bind=\"click: function() {resetQuery(true, false);}\" class=\"btn btn-secondary btn-sm\">\r\n <span class=\"fa fa-undo\"></span> Start Over\r\n </button>\r\n\r\n <button class=\"btn btn-secondary btn-sm\" data-bs-toggle=\"modal\" data-bs-target=\"#sqlModal\" data-bind=\"visible: adminMode\">\r\n <span class=\"fa fa-code\"></span> View Code\r\n </button>\r\n\r\n <button class=\"btn btn-secondary btn-sm\" data-bind=\"visible: CanSaveReports(), click: SaveWithoutRun\">\r\n <span class=\"fa fa-save\"></span> Save Report\r\n </button>\r\n\r\n <button data-bind=\"click: openDesigner\" class=\"btn btn-secondary btn-sm\">\r\n <span class=\"fa fa-pencil\"></span> Design/Save Report\r\n </button>\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div data-bind=\"if: ReportID() > 0\">\r\n <div data-bind=\"template: 'report-designer-compact', data: $root\"></div>\r\n </div>\r\n </div>\r\n\r\n <div data-bind=\"with: ReportResult\" class=\"report-view\">\r\n <div data-bind=\"ifnot: HasError\">\r\n <div data-bind=\"with: $root\">\r\n <div>\r\n <div data-bind=\"if: EditFiltersOnReport\">\r\n <div class=\"card\">\r\n <div class=\"card-header\">\r\n <a data-bs-toggle=\"collapse\" data-bs-target=\"#filter-panel\" href=\"#\">\r\n <i class=\"fa fa-filter\"></i>Choose Filters\r\n </a>\r\n </div>\r\n <div id=\"filter-panel\" class=\"card-body collapse\">\r\n <div data-bind=\"if: useStoredProc\">\r\n <div class=\"row\">\r\n <div data-bind=\"template: {name: 'filter-parameters'}\" class=\"col-md-12\"></div>\r\n </div>\r\n </div>\r\n <div data-bind=\"ifnot: useStoredProc\">\r\n <div class=\"row\">\r\n <div data-bind=\"template: {name: 'filter-group'}\" class=\"col-md-12\"></div>\r\n </div>\r\n </div>\r\n <br />\r\n <button class=\"btn btn-primary\" data-bind=\"click: SaveFilterAndRunReport\">Update Filters</button>\r\n </div>\r\n </div>\r\n <br />\r\n </div>\r\n <div data-bind=\"ifnot: EditFiltersOnReport\">\r\n <div data-bind=\"template: {name: 'fly-filter-template'}\"></div>\r\n <br />\r\n </div>\r\n </div>\r\n <div class=\"report-render\" data-bind=\"css: { 'report-expanded': isExpanded }\">\r\n <div class=\"report-menubar bg-light\" data-bind=\"hidden: DontExecuteOnRun() && !reportRan()\">\r\n <div class=\"col-xs-12 col-centered\" data-bind=\"with: pager\">\r\n <div class=\"form-inline pull-left\" data-bind=\"visible: pages()\">\r\n <div class=\"form-group pull-left total-records\">\r\n <span data-bind=\"text: ' Total Records: ' + totalRecords()\"></span><br />\r\n </div>\r\n <div class=\"pull-left\">\r\n <button class=\"btn btn-secondary btn-sm\" data-bind=\"visible: !$root.isChart() || $root.ShowDataWithGraph(), click: $root.downloadExcel\" title=\"Export to Excel\">\r\n <span class=\"fa fa-file-excel-o\"></span>\r\n </button>\r\n <button class=\"btn btn-secondary btn-sm\" data-bind=\"click: $parent.toggleExpand\">\r\n <span class=\"fa\" data-bind=\"css: {'fa-expand': !$parent.isExpanded(), 'fa-compress': $parent.isExpanded() }\"></span>\r\n </button>\r\n <button class=\"btn btn-secondary btn-sm\" data-bind=\"visible: $parent.canDrilldown, click: $parent.ExpandAll\" title=\"Expand all rows\">\r\n <span class=\"fa fa-plus\"></span>\r\n </button>\r\n <button class=\"btn btn-secondary btn-sm\" data-bind=\"visible: $parent.canDrilldown, click: $parent.CollapseAll\" title=\"Collapse all rows\">\r\n <span class=\"fa fa-minus\"></span>\r\n </button>\r\n <button class=\"btn btn-secondary btn-sm\" title=\"Re-run Report\" data-bind=\"click: function() { $root.RunReport(false, true);}\">\r\n <i class=\"fa fa-play\"></i> \r\n </button>\r\n <div data-bind=\"with: $parent\" class=\"pull-left\">\r\n <div class=\"dropdown-selected\" data-bind=\"click: toggleDropdown\">\r\n <div data-bind=\"with: selectedTableStyle\" class=\"btn btn-sm btn-secondary\" title=\"Format Table\">\r\n <span class=\"fa fa- fa-paint-brush\"></span>\r\n </div>\r\n </div>\r\n <div class=\"dropdown-content\" style=\"position: absolute;\" data-bind=\"visible: dropdownOpen\">\r\n <!-- ko foreach: tableStyles -->\r\n <div class=\"dropdown-option\" data-bind=\"title: $data.name, click: $parent.selectStyle\">\r\n <div class=\"mini-table-preview\" data-bind=\"foreach: new Array(5)\">\r\n <div class=\"mini-table-row\" data-bind=\"foreach: new Array(5)\">\r\n <div class=\"mini-table-cell\" data-bind=\"style: { backgroundColor: $parentContext.$index() === 0 ? $parents[1].headerBg : ($parentContext.$index() % 2 === 0 ? $parents[1].altRowBg : $parents[1].rowBg), color: $parents[1].textColor }\"></div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <!-- /ko -->\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-inline pull-right\">\r\n <div data-bind=\"template: 'pager-template', data: $data\"></div>\r\n </div>\r\n <div class=\"btn-group btn-group-sm pull-right\" role=\"group\"> \r\n <button class=\"btn btn-light\" data-bs-toggle=\"modal\" data-bs-target=\"#sqlModal\" data-bind=\"visible: $parent.adminMode\">\r\n <i class=\"fa fa-code\"></i> View Report Code\r\n </button>\r\n <button class=\"btn btn-light\" data-bind=\"click: $parent.zoomOut\" data-bs-toggle=\"tooltip\" title=\"Zoom Out\">\r\n <i class=\"fa fa-search-minus\"></i>\r\n </button>\r\n <button class=\"btn btn-light\" data-bind=\"click: $parent.resetZoom\" data-bs-toggle=\"tooltip\" title=\"Reset Zoom\">\r\n <i class=\"fa fa-compress\"></i>\r\n </button>\r\n <button class=\"btn btn-light\" data-bind=\"click: $parent.zoomIn\" data-bs-toggle=\"tooltip\" title=\"Zoom In\">\r\n <i class=\"fa fa-search-plus\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"report-canvas\" data-bind=\"hidden: DontExecuteOnRun() && !reportRan()\">\r\n <div class=\"report-container bg-light\">\r\n <div class=\"report-inner bg-white\">\r\n <div data-bind=\"if: $root.CanEdit() && ReportType()!='Html' && ReportType()!='Single'\">\r\n <div data-bind=\"template: 'chart-settings', data: $data\"></div>\r\n </div>\r\n <div data-bind=\"visible: headerDesigner.UseReportHeader\">\r\n <div id=\"report-header\" width=\"900\" height=\"120\" data-bind=\"html: headerDesigner.headerHtml\"></div>\r\n </div>\r\n <h2 data-bind=\"text: ReportName\"></h2>\r\n <p data-bind=\"html: ReportDescription\">\r\n </p>\r\n\r\n <div data-bind=\"with: ReportResult\" class=\"report-expanded-scroll\">\r\n <div data-bind=\"visible: !ReportData()\">\r\n <div class=\"report-spinner\"></div>\r\n </div>\r\n <div data-bind=\"template: 'report-template', data: $data\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <br />\r\n <span>Report ran on: <span data-bind=\"text: new Date().toLocaleDateString() + ' ' + new Date().toLocaleTimeString()\"></span></span>\r\n </div>\r\n </div>\r\n <div data-bind=\"if: HasError\">\r\n <h2 data-bind=\"text: $root.ReportName\"></h2>\r\n <p data-bind=\"text: $root.ReportDescription\"></p>\r\n\r\n <h3>An unexpected error occured while running the Report</h3>\r\n <hr />\r\n <b>Error Details</b>\r\n <div data-bind=\"text: Exception\"></div>\r\n <br />\r\n <button class=\"btn btn-light\" data-bs-toggle=\"modal\" data-bs-target=\"#sqlModal\" data-bind=\"visible: $parent.adminMode\">\r\n <i class=\"fa fa-code\"></i> View Report Code\r\n </button>\r\n <button class=\"btn btn-light\" data-bind=\"click: function() { $root.RunReport(false, true);}\">\r\n <i class=\"fa fa-play\"></i> Re-run Report\r\n </button>\r\n <hr />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Report Builder -->\r\n<div class=\"modal modal-fullscreen\" id=\"modal-reportbuilder\" role=\"dialog\" aria-labelledby=\"myModalLabel\" aria-hidden=\"true\" style=\"padding-right: 0px !important;\">\r\n <div data-bind=\"template: {name: 'report-designer', data: $data}\"></div>\r\n</div>\r\n\r\n<!-- Field Options Modal -->\r\n<div class=\"modal\" id=\"fieldOptionsModal\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\r\n <div data-bind=\"template: {name: 'report-field-options', data: $data}\"></div>\r\n</div>\r\n\r\n<!-- Link Edit Modal -->\r\n<div class=\"modal\" id=\"linkModal\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\r\n <div data-bind=\"template: {name: 'report-link-edit', data: $data}\"></div>\r\n</div>\r\n\r\n<!-- Folder Edit Modal -->\r\n<div class=\"modal\" id=\"folderModal\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog\" data-bind=\"css: {'modal-lg': adminMode}\">\r\n <div class=\"modal-content\" data-bind=\"with: ManageFolder\">\r\n <div class=\"modal-header\">\r\n <h5 class=\"modal-title fs-5\">Manage Folder</h5>\r\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"form-group\">\r\n <label class=\"col-sm-4 col-md-4 control-label\">Folder Name</label>\r\n <div class=\"col-sm-8 col-md-8\">\r\n <input type=\"text\" class=\"form-control\" id=\"folderName\" required placeholder=\"Folder Name\" data-bind=\"value: FolderName\">\r\n </div>\r\n </div>\r\n <br />\r\n <div data-bind=\"visible: $root.adminMode\" class=\"card card-body\">\r\n <div data-bind=\"template: {name: 'manage-access-template', data: $root.manageFolderAccess}\"></div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" data-bind=\"click: saveFolder\">Save</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Import Json File Modal -->\r\n<div class=\"modal\" id=\"uploadFileModal\" tabindex=\"-1\" aria-labelledby=\"uploadFileModalLabel\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog\">\r\n <div class=\"modal-content\" data-bind=\"with: ManageJsonFile\">\r\n <div class=\"modal-header\">\r\n <h5 class=\"modal-title\" id=\"uploadFileModalLabel\">Import previously Exported Reports</h5>\r\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n\r\n <div class=\"alert alert-info small\">\r\n <strong>Instructions:</strong><br />\r\n \u2022 Select a <code>.json</code> file previously exported from Dotnet Report.<br />\r\n \u2022 The file may include multiple reports and their folders.<br />\r\n \u2022 Any missing folders will be created automatically.<br />\r\n \u2022 If a report with the same name already exists, you will be prompted to:\r\n <em>Skip</em>, <em>Overwrite</em>, or <em>Make a Copy</em>.<br />\r\n \u2022 Once uploaded, all imported reports will be available immediately.\r\n </div>\r\n\r\n <div id=\"dropzone\" class=\"dropzone\"\r\n data-bind=\"event: {click: triggerFileInput }\"\r\n style=\"border: 2px dashed #007bff; border-radius: 5px; padding: 30px; text-align: center; color: #007bff; cursor: pointer;\">\r\n Click here to select a JSON file\r\n </div>\r\n\r\n <input type=\"file\" id=\"fileInputJson\" accept=\".json\" style=\"display: none;\"\r\n data-bind=\"event: { change: handleFileSelect }\">\r\n\r\n <div class=\"mt-3\" data-bind=\"visible: fileName\">\r\n <p><strong>Selected File:</strong> <span data-bind=\"text: fileName\"></span></p>\r\n </div>\r\n\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\r\n <button type=\"button\" class=\"btn btn-primary\" data-bind=\"click: uploadFile\">Upload</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal\" id=\"wordOptionsModal\" tabindex=\"-1\" aria-labelledby=\"wordOptionsModalLabel\" aria-hidden=\"true\">\r\n <div data-bind=\"template: { name: 'word-options-template', data: $data }\"></div>\r\n</div>\r\n<div class=\"modal\" id=\"pdfOptionsModal\" tabindex=\"-1\" aria-labelledby=\"pdfOptionsModalLabel\" aria-hidden=\"true\">\r\n <div data-bind=\"template: { name: 'pdf-options-template', data: $data }\"></div>\r\n</div>\r\n\r\n<!-- This renders the template -->\r\n<div class=\"modal\" id=\"pdfOptionsScheduleModal\" tabindex=\"-1\" aria-labelledby=\"pdfOptionsScheduleModalLabel\" aria-hidden=\"true\">\r\n <div data-bind=\"template: { name: 'pdf-options-schedule-template', data: $data }\"></div>\r\n</div>\r\n<!-- This renders the template -->\r\n<div class=\"modal\" id=\"wordOptionsScheduleModal\" tabindex=\"-1\" aria-labelledby=\"wordOptionsScheduleModalLabel\" aria-hidden=\"true\">\r\n <div data-bind=\"template: { name: 'word-options-schedule-template', data: $data }\"></div>\r\n</div>\r\n\r\n<!-- Templates -->\r\n<div [innerHtml]=\"reportTemplates\"></div>\r\n<!-- Templates -->", styles: [""] });
|
|
3194
|
-
}
|
|
3195
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DotnetreportComponent, decorators: [{
|
|
3196
|
-
type: Component,
|
|
3197
|
-
args: [{ selector: 'app-dotnetreport', template: "<div id=\"dot-net-report\" class=\"body-content\">\r\n<div class=\"container-fluid\">\r\n <div data-bind=\"template: {name: 'admin-mode-template'}, visible: allowAdmin\" style=\"display: none;\"></div>\r\n\r\n <!--\r\n The markup code below is related to presentation. You don't have to change it, unless you\r\n intentionally want to change something in the Report Builder's behavior in your Application.\r\n It's Recommended you use it as is. You will be responsible for managing and maintaining any changes.\r\n -->\r\n <!-- Folders/Report List -->\r\n <div id=\"report-start\" data-bind=\"if: ReportMode() == 'start' || ReportMode() == 'generate'\">\r\n <div class=\"card folder-panel\" data-bind=\"visible: true\" style=\"display: none;\">\r\n <div class=\"card-header\">\r\n <nav class=\"navbar navbar-expand-lg navbar-light bg-light\">\r\n <a class=\"navbar-brand\" href=\"#\" data-bind=\"click: function() {SelectedFolder(null); designingHeader(false); searchReports(''); $('#search-report').val([]).trigger('change'); }\">Manage Reports</a>\r\n <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\r\n <span class=\"navbar-toggler-icon\"></span>\r\n </button>\r\n\r\n <div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\">\r\n <ul class=\"navbar-nav mr-auto\">\r\n <li class=\"nav-item dropdown\" data-bind=\"visible: (CanSaveReports() && appSettings.usePromptBuilder()) || adminMode()\">\r\n <a href=\"#\" class=\"nav-link dropdown-toggle\" role=\"button\" data-bs-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n <span class=\"fa fa-plus\"></span> New Report\r\n </a>\r\n <div class=\"dropdown-menu\">\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: createNewReport\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\"><i class=\"fa fa-sliders\"></i> Use Standard Designer</a>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: createNewReportAi\"><i class=\"fa fa-bolt\"></i> Use Smarter Designer</a>\r\n </div>\r\n </li>\r\n <li class=\"nav-item active\" data-bind=\"visible: (SelectedFolder() ? SelectedFolder().canEdit : (CanSaveReports() || adminMode())) && !appSettings.usePromptBuilder()\">\r\n <a href=\"#\" class=\"nav-link\" data-bind=\"click: createNewReport\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\">\r\n <span class=\"fa fa-plus\"></span> New Report\r\n </a>\r\n </li>\r\n <li class=\"nav-item\" data-bind=\"visible: CanManageFolders() || adminMode()\">\r\n <a href=\"#\" class=\"nav-link\" data-bind=\"click: ManageFolder.newFolder\">\r\n <span class=\"fa fa-folder-o\"></span> Add Folder\r\n </a>\r\n </li>\r\n <li class=\"nav-item dropdown\" data-bind=\"visible: (CanManageFolders() || adminMode()) && SelectedFolder()!=null && (SelectedFolder().canEdit || SelectedFolder().canDelete || adminMode())\">\r\n <a href=\"#\" class=\"nav-link dropdown-toggle\" role=\"button\" data-bs-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n <span class=\"fa fa-folder\"></span> Folder Options\r\n </a>\r\n <div class=\"dropdown-menu\">\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: ManageFolder.editFolder, visible: SelectedFolder() && (SelectedFolder().canEdit || adminMode())\">Edit Selected Folder</a>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: ManageFolder.deleteFolder, visible: SelectedFolder() && (SelectedFolder().canDelete || adminMode())\">Delete Selected Folder</a>\r\n </div>\r\n </li>\r\n <li class=\"nav-item active\" data-bind=\"visible: adminMode() && SelectedFolder() ==null\">\r\n <a href=\"#\" class=\"nav-link\" data-bind=\"click: function(){ initHeaderDesigner(false); }\">\r\n <span class=\"fa fa-arrow-up\"></span> Report Header\r\n </a>\r\n </li>\r\n <li class=\"nav-item dropdown\" data-bind=\"visible: appSettings.showImportExport() || adminMode()\">\r\n <a href=\"#\" class=\"nav-link dropdown-toggle\" role=\"button\" data-bs-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n <span class=\"fa fa-exchange\"></span> Import / Export\r\n </a>\r\n <div class=\"dropdown-menu\">\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function(){ selectMode(!selectMode()); }\">\r\n <span data-bind=\"css: selectMode() ? 'fa fa-check-square text-primary' : 'fa fa-square-o'\"></span>\r\n <span data-bind=\"text: selectMode() ? 'Cancel Select Mode' : 'Select Mode'\"></span>\r\n </a>\r\n <div class=\"dropdown-divider\"></div>\r\n <a class=\"dropdown-item\" href=\"#\" data-bs-toggle=\"modal\" data-bs-target=\"#uploadFileModal\" data-bind=\"visible: !selectMode()\" title=\"Import Report from JSON file\">\r\n <span class=\"fa fa-upload\"></span> Import Reports\r\n </a>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"visible: selectMode, click: exportSelectedReportJson\">\r\n <span class=\"fa fa-download\"></span> Export Selected Reports\r\n </a>\r\n </div>\r\n </li>\r\n </ul>\r\n <div class=\"form-inline my-2 my-lg-0 ms-auto w-50\">\r\n <div class=\"input-group w-100\">\r\n <p id=\"search-input\" class=\"form-control search-input\" data-placeholder=\"Search Report by Name, Description or Data Field...\"></p>\r\n <span data-bind=\"click: searchForReports\" class=\"input-group-text\" style=\"height: 38px; cursor: pointer;\" title=\"Search\"><i class=\"fa fa-search\"></i></span>\r\n <span data-bind=\"click: function() {resetQuery(true, true);}\" class=\"input-group-text\" style=\"height: 38px; cursor: pointer;\" title=\"Clear Search\"><i class=\"fa fa-close\"></i></span>\r\n </div>\r\n </div>\r\n </div>\r\n </nav>\r\n </div>\r\n <div class=\"card-body\">\r\n <div data-bind=\"visible: designingHeader, with: headerDesigner\" style=\"display: none;\" class=\"overflow-auto\">\r\n <div class=\"checkbox\">\r\n <label>\r\n <input type=\"checkbox\" data-bind=\"checked: UseReportHeader\"> Use Report Header\r\n </label>\r\n </div>\r\n <div data-bind=\"visible: UseReportHeader\">\r\n <p class=\"alert alert-info\">\r\n You can design the common report header below that will be applied to all reports where report headers are turned on.\r\n </p>\r\n <div class=\"form-group row m-1\" data-bind=\"visible: clientListIds().length > 0\">\r\n <div class=\"col-md-3 col-sm-3\">\r\n <label class=\"control-label\">Headers for other Clients saved</label>\r\n </div>\r\n <div class=\"col-md-3 col-sm-3\">\r\n <select class=\"form-control\"\r\n data-bind=\"options: clientListIds,\r\n value: selectedHeaderClientId,\r\n optionsCaption: 'No Client Id (Global)',\r\n event: { change: function () { loadHtmlHeader(true); } }\">\r\n </select>\r\n </div>\r\n <div class=\"col-md-1 col-sm-1\">\r\n <span data-bs-toggle=\"tooltip\" class=\"fa fa-question-circle helptip\"\r\n title=\"Choose a client to design its report header\"></span>\r\n </div>\r\n </div>\r\n <div class=\"form-group row m-1\">\r\n <div class=\"col-md-3 col-sm-3\">\r\n <label class=\"control-label\">Specify Client Id to Restrict Access</label>\r\n </div>\r\n <div class=\"col-md-3 col-sm-3\">\r\n <input class=\"form-control text-box single-line\" type=\"text\" data-bind=\"value: headerClientId\">\r\n </div>\r\n <div class=\"col-md-1 col-sm-1\">\r\n <span data-bs-toggle=\"tooltip\" data-placement=\"right\" class=\"fa fa-question-circle helptip\" title=\"Leave blank to give all clients access (Global Report Header)\"></span>\r\n </div>\r\n </div>\r\n <textarea id=\"report-header-editor\"></textarea>\r\n <button class=\"btn btn-primary btn-sm mt-2\" data-bind=\"click: saveHtmlHeader\">\r\n Save Changes\r\n </button>\r\n </div>\r\n <div data-bind=\"visible: !UseReportHeader()\">\r\n <p class=\"alert alert-info\">\r\n If you turn off the <b>Use Report Header</b> option,\r\n the <b>Report Header</b> will not be applied in reports.\r\n </p>\r\n <button class=\"btn btn-primary btn-sm mt-2\" data-bind=\"click: saveHtmlHeader\">\r\n Save Changes\r\n </button>\r\n </div>\r\n </div>\r\n <div data-bind=\"ifnot: designingHeader\">\r\n <div class=\"btn-group pull-right\" role=\"group\">\r\n <button type=\"button\" class=\"btn btn-light\" data-bs-toggle=\"tooltip\" title=\"List View\"\r\n data-bind=\"css: { 'active': layout() === 'list' }, click: toggleLayout\">\r\n <span class=\"fa fa-list\"></span>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-light\" data-bs-toggle=\"tooltip\" title=\"Icon View\"\r\n data-bind=\"css: { 'active': layout() === 'icons' }, click: toggleLayout\">\r\n <span class=\"fa fa-th-large\"></span>\r\n </button>\r\n </div>\r\n\r\n <div data-bind=\"if: layout()=='icons'\">\r\n <div data-bind=\"visible: !SelectedFolder() && !searchReports()\">\r\n <p>Please choose Folders below to view Reports</p>\r\n <ul class=\"folder-list\" data-bind=\"foreach: Folders\">\r\n <li data-bind=\"click: function(){ $parent.SelectedFolder($data); }\">\r\n <span data-bind=\"visible: $root.selectMode, click: function(d,e){ isSelected(!isSelected()); e.stopPropagation(); },\r\n css: isSelected() ? 'fa fa-check-square text-primary me-2' : 'fa fa-square-o me-2'\"></span>\r\n <span class=\"fa fa-3x fa-folder text-secondary\"></span>\r\n <span class=\"desc\" data-bind=\"text: FolderName\"></span>\r\n </li>\r\n </ul>\r\n </div>\r\n <div data-bind=\"visible: SelectedFolder() || searchReports()\">\r\n <div class=\"clearfix\">\r\n <p class=\"pull-left\">Please choose a Report from this Folder</p>\r\n <div class=\"pull-right\">\r\n <a href=\"#\" class=\"btn btn-light\" data-bind=\"click: function(){ SelectedFolder(null); searchReports(''); $('#search-report').val([]).trigger('change');}\">\r\n ..back to Folders\r\n </a>\r\n </div>\r\n </div>\r\n <div class=\"list-group list-overflow\">\r\n <div data-bind=\"if: SelectedFolder()!=null && reportsInFolder().length==0\">\r\n This folder is empty.\r\n </div>\r\n <div data-bind=\"if: searchReports() && reportsInSearch().length==0\">\r\n No Reports found matching your Search\r\n </div>\r\n <div class=\"list-group\" data-bind=\"foreach: searchReports() ? reportsInSearch() : reportsInFolder()\">\r\n <div class=\"list-group-item\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-7\">\r\n <input type=\"checkbox\" data-bind=\"visible: $root.selectMode, checked: isSelected\" class=\"pull-left me-2\" />\r\n <div class=\"fa fa-2x pull-left\" data-bind=\"css: {'fa-file': reportType=='List', 'fa-th-list': reportType=='Summary', 'fa-bar-chart': reportType=='Bar', 'fa-pie-chart': reportType=='Pie', 'fa-line-chart': reportType=='Line', 'fa-globe': reportType.indexOf('Map')==0, 'fa-window-maximize': reportType=='Single', 'fa-random': reportType=='Pivot', 'fa-window-restore': reportType=='Treemap', 'fa-signal': reportType == 'Combo', 'fa-code': reportType == 'Html', 'fa-map': reportType == 'HeatMap'}\"></div>\r\n <div class=\"pull-left\">\r\n <h4>\r\n <a data-bind=\"click: runReport\" style=\"cursor: pointer\">\r\n <span data-bind=\"highlightedText: { text: reportName, highlight: $parent.searchReports, css: 'highlight' }\"></span>\r\n </a>\r\n </h4>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n <p data-bind=\"text: reportDescription\"></p>\r\n <p data-bind=\"if: $parent.searchReports()\">\r\n <span class=\"fa fa-folder\"></span> <span data-bind=\"text: folderName\"></span>\r\n <span>\r\n <span data-bind=\"text: message\" class=\"highlight small\"></span>\r\n </span>\r\n </p>\r\n <div data-bind=\"if: $parent.adminMode\">\r\n <div class=\"small\">\r\n <b>Report Access</b><br />\r\n Manage by User <span class=\"badge text-bg-info text-white\" data-bind=\"text: userId ? userId : 'Any User'\"></span>\r\n <br />\r\n View only by User <span class=\"badge text-bg-info text-white\" data-bind=\"text: (viewOnlyUserId ? viewOnlyUserId : (userId ? userId : 'Any User'))\"></span>\r\n <br />\r\n <div data-bind=\"if: deleteOnlyUserId\">\r\n Delete only by User <span class=\"badge text-bg-info text-white\" data-bind=\"text: deleteOnlyUserId\"></span>\r\n <br />\r\n </div>\r\n <div data-bind=\"if: userRole\">\r\n Manage by Role <span class=\"badge text-bg-info text-white\" data-bind=\"text: userRole ? userRole : 'No Role'\"></span>\r\n <br />\r\n </div>\r\n <div data-bind=\"if: viewOnlyUserRole\">\r\n View only by Role <span class=\"badge text-bg-info text-white\" data-bind=\"text: viewOnlyUserRole ? viewOnlyUserRole : 'Any Role'\"></span>\r\n <br />\r\n </div>\r\n <div data-bind=\"if: deleteOnlyUserRole\">\r\n Delete only by Role <span class=\"badge text-bg-info text-white\" data-bind=\"text: deleteOnlyUserRole ? deleteOnlyUserRole : 'Same as Manage'\"></span>\r\n <br />\r\n </div>\r\n <div data-bind=\"if: clientId\">\r\n For Client <span class=\"label label-info\" data-bind=\"text: clientId ? clientId : 'Any'\"></span>\r\n <br />\r\n </div>\r\n <div>\r\n Direct Link to Run Report: <a data-bind=\"attr: {href: '/DotNetReport/?linkedreport=true&noparent=true&reportId=' + reportId }\" target=\"_blank\"><span class=\"fa fa-link\"></span></a>\r\n <a href=\"#\" data-bind=\"click: navigator.clipboard.writeText(window.location.href + '?linkedreport=true&noparent=true&reportId=' + reportId )\"><span class=\"fa fa-copy\" title=\"Click to Copy Link\"></span></a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-5 right-align\">\r\n <div class=\"d-none d-md-block\">\r\n <br />\r\n <span data-bind=\"if: $root.CanSaveReports() || $root.adminMode() \">\r\n <button class=\"btn btn-sm btn-outline-secondary\" data-bind=\"click: openReport, visible: canEdit\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\">\r\n <span class=\"fa fa-edit\" aria-hidden=\"true\"></span> Edit\r\n </button>\r\n <button class=\"btn btn-sm btn-outline-secondary\" data-bind=\"click: copyReport, visible: canEdit\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\">\r\n <span class=\"fa fa-copy\" aria-hidden=\"true\"></span> Copy\r\n </button>\r\n </span>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" data-bind=\"click: runReport\">\r\n <span class=\"fa fa-gears\" aria-hidden=\"true\"></span> Run\r\n </button>\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" style=\"margin-left: -4px;\">\r\n <span class=\"sr-only\"></span>\r\n </button>\r\n <div class=\"dropdown-menu dropdown-menu-right\">\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() {exportReport('pdf');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download PDF\r\n </a>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() {exportReport('excel');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download Excel\r\n </a>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"visible: hasDrilldown, click: function() {exportReport('excel-sub');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download Excel (Expanded)\r\n </a>\r\n </div>\r\n </div>\r\n <button class=\"btn btn-sm btn-outline-secondary\" data-bind=\"click: deleteReport, visible: canDelete\">\r\n <span class=\"fa fa-trash\" aria-hidden=\"true\"></span> Delete\r\n </button>\r\n <br />\r\n </div>\r\n\r\n <div class=\"d-block d-md-none\">\r\n <span data-bind=\"if: $root.CanSaveReports() || $root.adminMode()\">\r\n <button class=\"btn btn-sm btn-outline-secondary\" title=\"Edit Report\" data-bind=\"click: openReport, visible: canEdit\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\">\r\n <span class=\"fa fa-edit\" aria-hidden=\"true\"></span>\r\n </button>\r\n <button class=\"btn btn-sm btn-light\" data-bind=\"click: copyReport, visible: canEdit\" title=\"Copy Report\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\">\r\n <span class=\"fa fa-copy\" aria-hidden=\"true\"></span>\r\n </button>\r\n </span>\r\n\r\n <div class=\"btn-group\">\r\n <button class=\"btn btn-sm btn-outline-secondary\" data-bind=\"click: runReport\" title=\"Run Report\">\r\n <span class=\"fa fa-gears\" aria-hidden=\"true\"></span>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" style=\"margin-left: -4px;\">\r\n <span class=\"sr-only\"></span>\r\n </button>\r\n <div class=\"dropdown-menu\">\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() {exportReport('excel');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download Excel\r\n </a>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"visible: hasDrilldown, click: function() {exportReport('excel-sub');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download Excel with inner rows\r\n </a>\r\n </div>\r\n </div>\r\n\r\n <button class=\"btn btn-sm btn-outline-secondary\" title=\"Delete Report\" data-bind=\"click: deleteReport, visible: canDelete\">\r\n <span class=\"fa fa-trash\" aria-hidden=\"true\"></span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div data-bind=\"if: layout()=='list'\">\r\n <div class=\"file-explorer-container\">\r\n <nav class=\"breadcrumb\">\r\n <a href=\"#\" class=\"breadcrumb-item\" data-bind=\"click: function(){ SelectedFolder(null); searchReports(''); }\">\r\n All Folders\r\n </a>\r\n <span class=\"breadcrumb-item active\" data-bind=\"visible: SelectedFolder && !searchReports(), text: SelectedFolder()?.FolderName\"></span>\r\n <span class=\"breadcrumb-item active\" data-bind=\"visible: searchReports\">\r\n Search Results\r\n </span>\r\n </nav>\r\n\r\n <div data-bind=\"visible: !SelectedFolder() && !searchReports()\">\r\n <div class=\"container-fluid\">\r\n <div class=\"row fw-bold border-bottom py-2 w-100\">\r\n <div class=\"col-md-6\">Name</div>\r\n <div class=\"col-md-6 text-end\" data-bind=\"visible: adminMode\">Access Control</div>\r\n </div>\r\n <div class=\"folder-list\" data-bind=\"foreach: Folders\">\r\n <div class=\"row clickable py-2 border-bottom align-items-center w-100\" data-bind=\"click: function(){ $parent.SelectedFolder($data); }\">\r\n <div class=\"col-md-6 d-flex align-items-center\">\r\n <span data-bind=\"visible: $root.selectMode, click: function(d,e){ isSelected(!isSelected()); e.stopPropagation(); },\r\n css: isSelected() ? 'fa fa-check-square text-primary me-2' : 'fa fa-square-o me-2'\"></span>\r\n <span class=\"fa fa-folder text-secondary me-2\"></span>\r\n <span data-bind=\"text: FolderName\"></span>\r\n </div>\r\n <div class=\"col-md-6 text-end\" data-bind=\"visible: $parent.adminMode\">\r\n <!--<div class=\"badge bg-info text-white\" data-bind=\"text: userId ? userId : 'Any User'\"></div>\r\n <div class=\"badge bg-info text-white\" data-bind=\"text: userRole ? userRole : 'No Role'\"></div>-->\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div data-bind=\"visible: SelectedFolder() || searchReports()\">\r\n <div class=\"container-fluid\">\r\n <div data-bind=\"if: SelectedFolder()!=null && reportsInFolder().length==0\">\r\n <p class=\"text-muted\">This folder is empty.</p>\r\n </div>\r\n\r\n <div data-bind=\"if: searchReports() && reportsInSearch().length==0\">\r\n <p class=\"text-center text-muted\">No reports found matching your search.</p>\r\n </div>\r\n <div data-bind=\"if: reportsInFolder().length > 0 || reportsInSearch().length > 0\">\r\n <div class=\"row fw-bold border-bottom py-2 w-100\">\r\n <div class=\"col-md-4\">Name</div>\r\n <div class=\"col-md-1\"></div>\r\n <div class=\"col-md-2\" data-bind=\"visible: searchReports()\">Folder</div>\r\n <div class=\"col-md-2\"></div>\r\n <div class=\"col-md-2\" data-bind=\"visible: adminMode\">Access</div>\r\n <div class=\"col-md-1\" data-bind=\"visible: adminMode\">Direct Link</div>\r\n </div>\r\n\r\n <div class=\"report-list\" data-bind=\"foreach: searchReports() ? reportsInSearch() : reportsInFolder()\">\r\n <div class=\"row border-bottom py-2 align-items-center w-100\">\r\n <div class=\"col-md-4 d-flex align-items-center\">\r\n <input type=\"checkbox\" data-bind=\"visible: $root.selectMode, checked: isSelected\" class=\"me-2\" />\r\n <span class=\"fa\" data-bind=\"css: {\r\n 'fa-file': reportType=='List',\r\n 'fa-th-list': reportType=='Summary',\r\n 'fa-bar-chart': reportType=='Bar',\r\n 'fa-pie-chart': reportType=='Pie',\r\n 'fa-line-chart': reportType=='Line',\r\n 'fa-signal': reportType=='Combo',\r\n 'fa-globe': reportType.indexOf('Map')==0,\r\n 'fa-window-maximize': reportType=='Single',\r\n 'fa-random': reportType=='Pivot',\r\n 'fa-window-restore': reportType=='Treemap',\r\n 'fa-code': reportType == 'Html',\r\n 'fa-map': reportType == 'HeatMap'\r\n }\"></span>\r\n <a class=\"ms-2\" data-bind=\"click: runReport, highlightedText: { text: reportName, highlight: $parent.searchReports, css: 'highlight' }\" style=\"cursor: pointer\"></a> \r\n <span data-bind=\"text: message\" class=\"highlight small\"></span>\r\n </div>\r\n\r\n <div class=\"col-md-1\">\r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-sm\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\r\n <span class=\"fa fa-ellipsis-h\"></span>\r\n </button>\r\n <ul class=\"dropdown-menu\">\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\" data-bind=\"click: openReport, visible: canEdit\">\r\n <span class=\"fa fa-edit\"></span> Edit\r\n </a>\r\n </li>\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\" data-bind=\"click: copyReport, visible: canEdit\">\r\n <span class=\"fa fa-copy\"></span> Copy\r\n </a>\r\n </li>\r\n <li>\r\n <a class=\"dropdown-item text-danger\" href=\"#\" data-bind=\"click: deleteReport, visible: canDelete\">\r\n <span class=\"fa fa-trash\"></span> Delete\r\n </a>\r\n </li>\r\n <li><hr class=\"dropdown-divider\"></li>\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: runReport\">\r\n <span class=\"fa fa-gears\"></span> Run Report\r\n </a>\r\n </li>\r\n <li class=\"dropdown-submenu\">\r\n <a class=\"dropdown-item dropdown-toggle\" href=\"#\">Export</a>\r\n <ul class=\"dropdown-menu\">\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() {exportReport('pdf');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download PDF\r\n </a>\r\n </li>\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() {exportReport('excel');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download Excel\r\n </a>\r\n </li>\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"visible: hasDrilldown, click: function() {exportReport('excel-sub');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download Excel (Expanded)\r\n </a>\r\n </li>\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"visible:$parent.adminMode, click: function() {exportReport('json');}\">\r\n <span class=\"fa fa-file\"></span> Export JSON\r\n </a>\r\n </li>\r\n </ul>\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-md-2\" data-bind=\"text: folderName, visible: $parent.searchReports()\"></div>\r\n <div class=\"col-md-2\"></div>\r\n <div class=\"col-md-2\" data-bind=\"visible: $parent.adminMode\">\r\n <div class=\"badge bg-info text-white\" data-bind=\"text: userId ? userId : 'Any User'\"></div>\r\n <div class=\"badge bg-info text-white\" data-bind=\"text: userRole ? userRole : 'No Role'\"></div>\r\n </div>\r\n <div class=\"col-md-1\" data-bind=\"visible: $parent.adminMode\">\r\n <a data-bind=\"attr: {href: '/DotNetReport?linkedreport=true&noparent=true&reportId=' + reportId }\" target=\"_blank\"><span class=\"fa fa-link\"></span></a>\r\n \r\n <a href=\"#\" data-bind=\"click: function() { navigator && navigator.clipboard && navigator.clipboard.writeText('/DotNetReport?linkedreport=true&noparent=true&reportId=' + reportId) }\">\r\n <span class=\"fa fa-copy\" title=\"Copy Link\"></span>\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n\r\n <div data-bind=\"visible: ReportMode() == 'execute' || ReportMode() == 'linked' || ReportMode() == 'design'\">\r\n <div class=\"card\" data-bind=\"visible: true;\" style=\"display: none;\">\r\n <div class=\"card-header\">\r\n <nav class=\"navbar navbar-expand-lg navbar-light bg-light\">\r\n <a class=\"navbar-brand\" href=\"#\">Viewing Report</a>\r\n <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\r\n <span class=\"navbar-toggler-icon\"></span>\r\n </button>\r\n <div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\">\r\n <ul class=\"navbar-nav me-auto\"></ul>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button class=\"btn btn-light btn-sm\" data-bind=\"click: function() {$root.ReportMode('start'); $root.textQuery.setupSearch();}\">\r\n <i class=\"fa fa-arrow-left\"></i>\r\n <span>Back to Reports</span>\r\n </button>\r\n <button class=\"btn btn-light btn-sm\" data-bind=\"visible: ReportMode()=='linked'\">\r\n <i class=\"fa fa-arrow-circle-left\"></i>\r\n <span>Back to Parent Report</span>\r\n </button>\r\n <div class=\"dropdown\" data-bind=\"visible: $root.CanEdit() && ReportID()\">\r\n <button class=\"dropdown-toggle btn btn-light btn-sm\" role=\"button\" data-bs-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n <i class=\"fa fa-edit\"></i> Edit Report\r\n </button>\r\n <div class=\"dropdown-menu\">\r\n <a class=\"dropdown-item\" href=\"#\"\r\n data-bind=\"click: function(){ SaveReport(true); }\"\r\n data-bs-toggle=\"modal\"\r\n data-bs-target=\"#modal-reportbuilder\">\r\n <i class=\"fa fa-sliders\"></i> Edit with Standard Designer\r\n </a>\r\n <a class=\"dropdown-item\" href=\"#\"\r\n data-bind=\"click: editReportAi\">\r\n <i class=\"fa fa-bolt\"></i> Edit with Smarter Designer\r\n </a>\r\n </div>\r\n </div>\r\n\r\n <button class=\"btn btn-light btn-sm\" data-bind=\"click: RefreshReport, visible: false\">\r\n <i class=\"fa fa-refresh\"></i>\r\n <span>Refresh</span>\r\n </button> \r\n <span data-bind=\"visible: isDirty\" title=\"You have unsaved changes\">\r\n <i class=\"text-warning fa fa-exclamation-triangle\"></i>\r\n </span>\r\n <button class=\"btn btn-light btn-sm\" data-bind=\"visible: $root.CanEdit(), click: SaveWithoutRun\">\r\n <i class=\"fa fa-save\"></i> \r\n <span>Save Report</span>\r\n </button>\r\n <div class=\"dropdown\" data-bind=\"hidden: (DontExecuteOnRun() && !reportRan()) || !ReportID()\">\r\n <button type=\"button\" class=\"btn btn-light btn-sm dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\r\n <i class=\"fa fa-download\"></i>\r\n <span>Export</span>\r\n </button>\r\n <ul class=\"dropdown-menu dropdown-menu-end\"> \r\n <li data-bind=\"hidden: appSettings.useAltPdf\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: appSettings.showPageSize\r\n ? function() { PdfPage.isDebug = false; $('#pdfOptionsModal').modal('show'); }\r\n : function() { downloadPdf(false); }\">\r\n <i class=\"fa fa-file-pdf-o\"></i> Pdf\r\n </a>\r\n </li>\r\n <li data-bind=\"visible: adminMode() && !appSettings.useAltPdf\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: appSettings.showPageSize\r\n ? function() { PdfPage.isDebug = true; $('#pdfOptionsModal').modal('show'); }\r\n : function() { downloadPdf(true); }\">\r\n <i class=\"fa fa-file-pdf-o\"></i> Pdf (Debug)\r\n </a>\r\n </li>\r\n <li data-bind=\"visible: appSettings.useAltPdf\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: appSettings.showPageSize\r\n ? function() { $('#pdfOptionsModal').modal('show'); }\r\n : function() { downloadPdfAlt(); }\">\r\n <i class=\"fa fa-file-pdf-o\"></i> Pdf\r\n </a>\r\n </li>\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: downloadExcel\">\r\n <i class=\"fa fa-file-excel-o\"></i> Excel\r\n </a>\r\n </li>\r\n <li data-bind=\"visible: canDrilldown\">\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: downloadExcelWithDrilldown\">\r\n <i class=\"fa fa-file-excel-o\"></i> Excel (Expanded)\r\n </a>\r\n </li>\r\n <li data-bind=\"hidden: appSettings.dontWordExport\">\r\n <a class=\"dropdown-item\" data-bind=\"click: appSettings.showPageSize\r\n ? function() { $('#wordOptionsModal').modal('show'); }\r\n : function() { downloadWord(); }\">\r\n <span class=\"fa fa-file-word-o\"></span> Word\r\n </a>\r\n </li>\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: downloadCsv\">\r\n <i class=\"fa fa-file-excel-o\"></i> Csv\r\n </a>\r\n </li>\r\n <li data-bind=\"hidden: appSettings.dontXmlExport\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: downloadXml\">\r\n <i class=\"fa fa-file-code-o\"></i> Xml\r\n </a>\r\n </li>\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: printReportPage\">\r\n <i class=\"fa fa-print\"></i> Print\r\n </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n </nav>\r\n </div>\r\n <div class=\"card-body\">\r\n <div data-bind=\"if: activeDesign()\">\r\n <div data-bind=\"if: ReportID() <= 0\">\r\n <ul class=\"nav nav-tabs\" id=\"designTabs\" role=\"tablist\"> \r\n <li class=\"nav-item\" role=\"presentation\">\r\n <button class=\"nav-link active\" id=\"designer-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#designer\" type=\"button\" role=\"tab\">\r\n Report Designer\r\n </button>\r\n </li>\r\n <li class=\"nav-item\" role=\"presentation\">\r\n <button class=\"nav-link\" id=\"nl-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#nl\" type=\"button\" role=\"tab\">\r\n Use Prompt<span title=\"This feature is still in Beta release. You can turn it off from settings\" style=\"font-size: 10pt; padding: 5px; max-width: 350px; white-space: normal; margin-bottom: 0;\">\r\n <i class=\"fa fa-info-circle\"></i>\r\n </span>\r\n </button>\r\n </li>\r\n </ul>\r\n\r\n <div class=\"tab-content mt-3\">\r\n <div class=\"tab-pane fade show active\" id=\"designer\" role=\"tabpanel\" aria-labelledby=\"designer-tab\">\r\n <div data-bind=\"template: 'report-designer-compact', data: $root\"></div>\r\n </div>\r\n <div class=\"tab-pane fade\" id=\"nl\" role=\"tabpanel\" aria-labelledby=\"nl-tab\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n <p>\r\n What would you like to know? Type a <b>natural language prompt</b> below to ask questions about your data.<br>\r\n Use <b>Auto Complete</b> suggestions to guide your query \u2014 the AI will convert your prompt into a Dotnet Report that you can then preview, design, save and reuse.\r\n </p>\r\n\r\n <p id=\"query-input\" class=\"query-input\">\r\n Show me \r\n </p>\r\n\r\n <p>\r\n <button data-bind=\"click: function() {runQuery(false);}\" class=\"btn btn-primary btn-sm\">\r\n <span class=\"fa fa-magic\"></span> Process with AI\r\n </button>\r\n\r\n <button data-bind=\"click: function() {resetQuery(true, false);}\" class=\"btn btn-secondary btn-sm\">\r\n <span class=\"fa fa-undo\"></span> Start Over\r\n </button>\r\n\r\n <button class=\"btn btn-secondary btn-sm\" data-bs-toggle=\"modal\" data-bs-target=\"#sqlModal\" data-bind=\"visible: adminMode\">\r\n <span class=\"fa fa-code\"></span> View Code\r\n </button>\r\n\r\n <button class=\"btn btn-secondary btn-sm\" data-bind=\"visible: CanSaveReports(), click: SaveWithoutRun\">\r\n <span class=\"fa fa-save\"></span> Save Report\r\n </button>\r\n\r\n <button data-bind=\"click: openDesigner\" class=\"btn btn-secondary btn-sm\">\r\n <span class=\"fa fa-pencil\"></span> Design/Save Report\r\n </button>\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div data-bind=\"if: ReportID() > 0\">\r\n <div data-bind=\"template: 'report-designer-compact', data: $root\"></div>\r\n </div>\r\n </div>\r\n\r\n <div data-bind=\"with: ReportResult\" class=\"report-view\">\r\n <div data-bind=\"ifnot: HasError\">\r\n <div data-bind=\"with: $root\">\r\n <div>\r\n <div data-bind=\"if: EditFiltersOnReport\">\r\n <div class=\"card\">\r\n <div class=\"card-header\">\r\n <a data-bs-toggle=\"collapse\" data-bs-target=\"#filter-panel\" href=\"#\">\r\n <i class=\"fa fa-filter\"></i>Choose Filters\r\n </a>\r\n </div>\r\n <div id=\"filter-panel\" class=\"card-body collapse\">\r\n <div data-bind=\"if: useStoredProc\">\r\n <div class=\"row\">\r\n <div data-bind=\"template: {name: 'filter-parameters'}\" class=\"col-md-12\"></div>\r\n </div>\r\n </div>\r\n <div data-bind=\"ifnot: useStoredProc\">\r\n <div class=\"row\">\r\n <div data-bind=\"template: {name: 'filter-group'}\" class=\"col-md-12\"></div>\r\n </div>\r\n </div>\r\n <br />\r\n <button class=\"btn btn-primary\" data-bind=\"click: SaveFilterAndRunReport\">Update Filters</button>\r\n </div>\r\n </div>\r\n <br />\r\n </div>\r\n <div data-bind=\"ifnot: EditFiltersOnReport\">\r\n <div data-bind=\"template: {name: 'fly-filter-template'}\"></div>\r\n <br />\r\n </div>\r\n </div>\r\n <div class=\"report-render\" data-bind=\"css: { 'report-expanded': isExpanded }\">\r\n <div class=\"report-menubar bg-light\" data-bind=\"hidden: DontExecuteOnRun() && !reportRan()\">\r\n <div class=\"col-xs-12 col-centered\" data-bind=\"with: pager\">\r\n <div class=\"form-inline pull-left\" data-bind=\"visible: pages()\">\r\n <div class=\"form-group pull-left total-records\">\r\n <span data-bind=\"text: ' Total Records: ' + totalRecords()\"></span><br />\r\n </div>\r\n <div class=\"pull-left\">\r\n <button class=\"btn btn-secondary btn-sm\" data-bind=\"visible: !$root.isChart() || $root.ShowDataWithGraph(), click: $root.downloadExcel\" title=\"Export to Excel\">\r\n <span class=\"fa fa-file-excel-o\"></span>\r\n </button>\r\n <button class=\"btn btn-secondary btn-sm\" data-bind=\"click: $parent.toggleExpand\">\r\n <span class=\"fa\" data-bind=\"css: {'fa-expand': !$parent.isExpanded(), 'fa-compress': $parent.isExpanded() }\"></span>\r\n </button>\r\n <button class=\"btn btn-secondary btn-sm\" data-bind=\"visible: $parent.canDrilldown, click: $parent.ExpandAll\" title=\"Expand all rows\">\r\n <span class=\"fa fa-plus\"></span>\r\n </button>\r\n <button class=\"btn btn-secondary btn-sm\" data-bind=\"visible: $parent.canDrilldown, click: $parent.CollapseAll\" title=\"Collapse all rows\">\r\n <span class=\"fa fa-minus\"></span>\r\n </button>\r\n <button class=\"btn btn-secondary btn-sm\" title=\"Re-run Report\" data-bind=\"click: function() { $root.RunReport(false, true);}\">\r\n <i class=\"fa fa-play\"></i> \r\n </button>\r\n <div data-bind=\"with: $parent\" class=\"pull-left\">\r\n <div class=\"dropdown-selected\" data-bind=\"click: toggleDropdown\">\r\n <div data-bind=\"with: selectedTableStyle\" class=\"btn btn-sm btn-secondary\" title=\"Format Table\">\r\n <span class=\"fa fa- fa-paint-brush\"></span>\r\n </div>\r\n </div>\r\n <div class=\"dropdown-content\" style=\"position: absolute;\" data-bind=\"visible: dropdownOpen\">\r\n <!-- ko foreach: tableStyles -->\r\n <div class=\"dropdown-option\" data-bind=\"title: $data.name, click: $parent.selectStyle\">\r\n <div class=\"mini-table-preview\" data-bind=\"foreach: new Array(5)\">\r\n <div class=\"mini-table-row\" data-bind=\"foreach: new Array(5)\">\r\n <div class=\"mini-table-cell\" data-bind=\"style: { backgroundColor: $parentContext.$index() === 0 ? $parents[1].headerBg : ($parentContext.$index() % 2 === 0 ? $parents[1].altRowBg : $parents[1].rowBg), color: $parents[1].textColor }\"></div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <!-- /ko -->\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-inline pull-right\">\r\n <div data-bind=\"template: 'pager-template', data: $data\"></div>\r\n </div>\r\n <div class=\"btn-group btn-group-sm pull-right\" role=\"group\"> \r\n <button class=\"btn btn-light\" data-bs-toggle=\"modal\" data-bs-target=\"#sqlModal\" data-bind=\"visible: $parent.adminMode\">\r\n <i class=\"fa fa-code\"></i> View Report Code\r\n </button>\r\n <button class=\"btn btn-light\" data-bind=\"click: $parent.zoomOut\" data-bs-toggle=\"tooltip\" title=\"Zoom Out\">\r\n <i class=\"fa fa-search-minus\"></i>\r\n </button>\r\n <button class=\"btn btn-light\" data-bind=\"click: $parent.resetZoom\" data-bs-toggle=\"tooltip\" title=\"Reset Zoom\">\r\n <i class=\"fa fa-compress\"></i>\r\n </button>\r\n <button class=\"btn btn-light\" data-bind=\"click: $parent.zoomIn\" data-bs-toggle=\"tooltip\" title=\"Zoom In\">\r\n <i class=\"fa fa-search-plus\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"report-canvas\" data-bind=\"hidden: DontExecuteOnRun() && !reportRan()\">\r\n <div class=\"report-container bg-light\">\r\n <div class=\"report-inner bg-white\">\r\n <div data-bind=\"if: $root.CanEdit() && ReportType()!='Html' && ReportType()!='Single'\">\r\n <div data-bind=\"template: 'chart-settings', data: $data\"></div>\r\n </div>\r\n <div data-bind=\"visible: headerDesigner.UseReportHeader\">\r\n <div id=\"report-header\" width=\"900\" height=\"120\" data-bind=\"html: headerDesigner.headerHtml\"></div>\r\n </div>\r\n <h2 data-bind=\"text: ReportName\"></h2>\r\n <p data-bind=\"html: ReportDescription\">\r\n </p>\r\n\r\n <div data-bind=\"with: ReportResult\" class=\"report-expanded-scroll\">\r\n <div data-bind=\"visible: !ReportData()\">\r\n <div class=\"report-spinner\"></div>\r\n </div>\r\n <div data-bind=\"template: 'report-template', data: $data\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <br />\r\n <span>Report ran on: <span data-bind=\"text: new Date().toLocaleDateString() + ' ' + new Date().toLocaleTimeString()\"></span></span>\r\n </div>\r\n </div>\r\n <div data-bind=\"if: HasError\">\r\n <h2 data-bind=\"text: $root.ReportName\"></h2>\r\n <p data-bind=\"text: $root.ReportDescription\"></p>\r\n\r\n <h3>An unexpected error occured while running the Report</h3>\r\n <hr />\r\n <b>Error Details</b>\r\n <div data-bind=\"text: Exception\"></div>\r\n <br />\r\n <button class=\"btn btn-light\" data-bs-toggle=\"modal\" data-bs-target=\"#sqlModal\" data-bind=\"visible: $parent.adminMode\">\r\n <i class=\"fa fa-code\"></i> View Report Code\r\n </button>\r\n <button class=\"btn btn-light\" data-bind=\"click: function() { $root.RunReport(false, true);}\">\r\n <i class=\"fa fa-play\"></i> Re-run Report\r\n </button>\r\n <hr />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Report Builder -->\r\n<div class=\"modal modal-fullscreen\" id=\"modal-reportbuilder\" role=\"dialog\" aria-labelledby=\"myModalLabel\" aria-hidden=\"true\" style=\"padding-right: 0px !important;\">\r\n <div data-bind=\"template: {name: 'report-designer', data: $data}\"></div>\r\n</div>\r\n\r\n<!-- Field Options Modal -->\r\n<div class=\"modal\" id=\"fieldOptionsModal\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\r\n <div data-bind=\"template: {name: 'report-field-options', data: $data}\"></div>\r\n</div>\r\n\r\n<!-- Link Edit Modal -->\r\n<div class=\"modal\" id=\"linkModal\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\r\n <div data-bind=\"template: {name: 'report-link-edit', data: $data}\"></div>\r\n</div>\r\n\r\n<!-- Folder Edit Modal -->\r\n<div class=\"modal\" id=\"folderModal\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog\" data-bind=\"css: {'modal-lg': adminMode}\">\r\n <div class=\"modal-content\" data-bind=\"with: ManageFolder\">\r\n <div class=\"modal-header\">\r\n <h5 class=\"modal-title fs-5\">Manage Folder</h5>\r\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"form-group\">\r\n <label class=\"col-sm-4 col-md-4 control-label\">Folder Name</label>\r\n <div class=\"col-sm-8 col-md-8\">\r\n <input type=\"text\" class=\"form-control\" id=\"folderName\" required placeholder=\"Folder Name\" data-bind=\"value: FolderName\">\r\n </div>\r\n </div>\r\n <br />\r\n <div data-bind=\"visible: $root.adminMode\" class=\"card card-body\">\r\n <div data-bind=\"template: {name: 'manage-access-template', data: $root.manageFolderAccess}\"></div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" data-bind=\"click: saveFolder\">Save</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Import Json File Modal -->\r\n<div class=\"modal\" id=\"uploadFileModal\" tabindex=\"-1\" aria-labelledby=\"uploadFileModalLabel\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog\">\r\n <div class=\"modal-content\" data-bind=\"with: ManageJsonFile\">\r\n <div class=\"modal-header\">\r\n <h5 class=\"modal-title\" id=\"uploadFileModalLabel\">Import previously Exported Reports</h5>\r\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n\r\n <div class=\"alert alert-info small\">\r\n <strong>Instructions:</strong><br />\r\n \u2022 Select a <code>.json</code> file previously exported from Dotnet Report.<br />\r\n \u2022 The file may include multiple reports and their folders.<br />\r\n \u2022 Any missing folders will be created automatically.<br />\r\n \u2022 If a report with the same name already exists, you will be prompted to:\r\n <em>Skip</em>, <em>Overwrite</em>, or <em>Make a Copy</em>.<br />\r\n \u2022 Once uploaded, all imported reports will be available immediately.\r\n </div>\r\n\r\n <div id=\"dropzone\" class=\"dropzone\"\r\n data-bind=\"event: {click: triggerFileInput }\"\r\n style=\"border: 2px dashed #007bff; border-radius: 5px; padding: 30px; text-align: center; color: #007bff; cursor: pointer;\">\r\n Click here to select a JSON file\r\n </div>\r\n\r\n <input type=\"file\" id=\"fileInputJson\" accept=\".json\" style=\"display: none;\"\r\n data-bind=\"event: { change: handleFileSelect }\">\r\n\r\n <div class=\"mt-3\" data-bind=\"visible: fileName\">\r\n <p><strong>Selected File:</strong> <span data-bind=\"text: fileName\"></span></p>\r\n </div>\r\n\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\r\n <button type=\"button\" class=\"btn btn-primary\" data-bind=\"click: uploadFile\">Upload</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal\" id=\"wordOptionsModal\" tabindex=\"-1\" aria-labelledby=\"wordOptionsModalLabel\" aria-hidden=\"true\">\r\n <div data-bind=\"template: { name: 'word-options-template', data: $data }\"></div>\r\n</div>\r\n<div class=\"modal\" id=\"pdfOptionsModal\" tabindex=\"-1\" aria-labelledby=\"pdfOptionsModalLabel\" aria-hidden=\"true\">\r\n <div data-bind=\"template: { name: 'pdf-options-template', data: $data }\"></div>\r\n</div>\r\n\r\n<!-- This renders the template -->\r\n<div class=\"modal\" id=\"pdfOptionsScheduleModal\" tabindex=\"-1\" aria-labelledby=\"pdfOptionsScheduleModalLabel\" aria-hidden=\"true\">\r\n <div data-bind=\"template: { name: 'pdf-options-schedule-template', data: $data }\"></div>\r\n</div>\r\n<!-- This renders the template -->\r\n<div class=\"modal\" id=\"wordOptionsScheduleModal\" tabindex=\"-1\" aria-labelledby=\"wordOptionsScheduleModalLabel\" aria-hidden=\"true\">\r\n <div data-bind=\"template: { name: 'word-options-schedule-template', data: $data }\"></div>\r\n</div>\r\n\r\n<!-- Templates -->\r\n<div [innerHtml]=\"reportTemplates\"></div>\r\n<!-- Templates -->" }]
|
|
3198
|
-
}], ctorParameters: () => [{ type: i0.Injector }, { type: i1.DomSanitizer }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
|
|
3199
|
-
type: Inject,
|
|
3200
|
-
args: [BASE_URL_TOKEN]
|
|
3201
|
-
}] }, { type: i2.HttpClient }, { type: i3.ActivatedRoute }] });
|
|
3202
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG90bmV0cmVwb3J0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RvdG5ldHJlcG9ydC1saWIvc3JjL2xpYi9kb3RuZXRyZXBvcnQvZG90bmV0cmVwb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RvdG5ldHJlcG9ydC1saWIvc3JjL2xpYi9kb3RuZXRyZXBvcnQvZG90bmV0cmVwb3J0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBcUIsU0FBUyxFQUFFLE1BQU0sRUFBK0IsTUFBTSxlQUFlLENBQUM7QUFFbEcsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7OztBQWMxRCxNQUFNLE9BQU8scUJBQXFCO0lBTXBCO0lBQ0E7SUFDd0I7SUFDeEI7SUFDQTtJQVRGLGNBQWMsQ0FBUztJQUN4QixlQUFlLENBQVc7SUFDekIsV0FBVyxDQUE0QjtJQUUvQyxZQUFZLFFBQWtCLEVBQ3BCLFNBQXVCLEVBQ3ZCLEtBQXdCLEVBQ0EsT0FBZSxFQUN2QyxJQUFnQixFQUNoQixLQUFxQjtRQUpyQixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQ3ZCLFVBQUssR0FBTCxLQUFLLENBQW1CO1FBQ0EsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUN2QyxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBRTNCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDNUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVILFFBQVE7UUFDTixJQUFJLG1CQUFtQixHQUFHLElBQUksQ0FBQyxjQUFjLEdBQUcsbUNBQW1DLENBQUM7UUFDcEYsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUduRCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFO1lBRTNELElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQztZQUN0QixJQUFJLEVBQUUsR0FBRyxJQUFJLGVBQWUsQ0FBQztnQkFDekIsWUFBWSxFQUFFLElBQUksQ0FBQyxjQUFjLEdBQUcsc0JBQXNCO2dCQUMxRCxZQUFZLEVBQUUsQ0FBQyxDQUFDLHNCQUFzQixDQUFDO2dCQUN2QyxhQUFhLEVBQUUsSUFBSSxDQUFDLGNBQWMsR0FBRyw0QkFBNEI7Z0JBQ2pFLGdCQUFnQixFQUFDLElBQUksQ0FBQyxjQUFjLEdBQUUsZ0NBQWdDO2dCQUN0RSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsY0FBYyxHQUFHLG1DQUFtQztnQkFDM0UsU0FBUyxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUM7Z0JBQzFCLFlBQVksRUFBRSxlQUFlO2dCQUM3QixpQkFBaUIsRUFBRSxDQUFDLENBQUMsb0JBQW9CLENBQUM7Z0JBQzFDLGFBQWEsRUFBRSxJQUFJLENBQUMsY0FBYyxHQUFHLGdDQUFnQztnQkFDckUsTUFBTSxFQUFFLElBQUksQ0FBQyxjQUFjLEdBQUcsZ0NBQWdDO2dCQUM5RCxlQUFlLEVBQUUsSUFBSSxDQUFDLGNBQWMsR0FBRywrQkFBK0I7Z0JBQ3RFLG1CQUFtQixFQUFFLElBQUksQ0FBQyxjQUFjLEdBQUcsbUNBQW1DO2dCQUM5RSxZQUFZLEVBQUUsTUFBTTtnQkFDcEIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO2dCQUMvQixZQUFZLEVBQUUsSUFBSSxDQUFDLGNBQWMsR0FBRyxtQkFBbUI7Z0JBQ3ZELGVBQWUsRUFBRSxJQUFJLENBQUMsY0FBYyxHQUFHLGtDQUFrQztnQkFDekUsY0FBYyxFQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsMkJBQTJCO2dCQUMxRCxhQUFhLEVBQUUsSUFBSTtnQkFDbkIsVUFBVSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3RFLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7YUFDOUMsQ0FBQyxDQUFDO1lBQ0gsRUFBRSxDQUFDLFdBQVcsR0FBRztnQkFDYixJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNsQyxXQUFXLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUM3QixXQUFXLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxjQUFjO29CQUN0Qyx5REFBeUQ7b0JBQ3pELDBFQUEwRTtvQkFDMUUsZUFBZSxHQUFHLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLEVBQUU7b0JBQzNDLGdCQUFnQixDQUFDLENBQUM7Z0JBRXRCLFVBQVUsQ0FBQztvQkFDUCxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUM7b0JBQ3JCLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQztnQkFDekIsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ1osQ0FBQyxDQUFBO1lBRUQsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRTdCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3pCLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBRWhFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxXQUFXO1FBQ1AsRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRU0sSUFBSTtRQUNULElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRU8saUJBQWlCO1FBRXZCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBOGhHakUsQ0FBQyxDQUFDO1FBQ0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU8sZ0JBQWdCLENBQUMsRUFBTztRQUM5QixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ2IsSUFBSSxFQUFFLENBQUMsVUFBVSxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUM3QixFQUFFLENBQUMsU0FBUyxFQUFFLENBQUE7WUFDbEIsQ0FBQztZQUFBLENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBem5HVSxxQkFBcUIsdUdBUXBCLGNBQWM7NEZBUmYscUJBQXFCLHdEQ2pCbEMsMGh4RUE0M0JrQjs7NEZEMzJCTCxxQkFBcUI7a0JBUGpDLFNBQVM7K0JBQ0Usa0JBQWtCOzswQkFjdkIsTUFBTTsyQkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSW5qZWN0LCBJbmplY3RvciwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBCQVNFX1VSTF9UT0tFTiB9IGZyb20gJy4vLi4vZG90bmV0cmVwb3J0LWxpYi5kaSc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuXHJcbmRlY2xhcmUgdmFyIGtvOiBhbnk7XHJcbmRlY2xhcmUgdmFyIHJlcG9ydFZpZXdNb2RlbDogYW55O1xyXG5kZWNsYXJlIHZhciAkOiBhbnk7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1kb3RuZXRyZXBvcnQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9kb3RuZXRyZXBvcnQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2RvdG5ldHJlcG9ydC5jb21wb25lbnQuY3NzJ11cclxufSlcclxuIFxyXG5cclxuZXhwb3J0IGNsYXNzIERvdG5ldHJlcG9ydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICAgIHByaXZhdGUgYmFzZVNlcnZpY2VVcmw6IHN0cmluZztcclxuICAgIHB1YmxpYyByZXBvcnRUZW1wbGF0ZXM6IFNhZmVIdG1sO1xyXG4gICAgcHJpdmF0ZSBxdWVyeVBhcmFtczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcclxuICBcclxuICAgIGNvbnN0cnVjdG9yKGluamVjdG9yOiBJbmplY3RvcixcclxuICAgICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcclxuICAgICAgcHJpdmF0ZSBjZHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgIEBJbmplY3QoQkFTRV9VUkxfVE9LRU4pIHByaXZhdGUgYmFzZVVybDogc3RyaW5nLFxyXG4gICAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlKSB7IFxyXG4gIFxyXG4gICAgICAgIHRoaXMuYmFzZVNlcnZpY2VVcmwgPSB0aGlzLmJhc2VVcmwgKyAnL2FwaSc7ICAgXHJcbiAgICAgICAgdGhpcy5yZXBvcnRUZW1wbGF0ZXMgPSBcIlwiO1xyXG4gICAgICB9XHJcbiAgXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgbGV0IGdldFVzZXJzQW5kUm9sZXNVcmwgPSB0aGlzLmJhc2VTZXJ2aWNlVXJsICsgXCIvRG90TmV0UmVwb3J0QXBpL0dldFVzZXJzQW5kUm9sZXNcIjtcclxuICAgICAgZ2V0VXNlcnNBbmRSb2xlc1VybCA9IGdldFVzZXJzQW5kUm9sZXNVcmwucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcclxuICAgICAgdGhpcy5xdWVyeVBhcmFtcyA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXM7XHJcbiAgICAgICAgXHJcbiAgXHJcbiAgICAgIHRoaXMuaHR0cC5nZXQoZ2V0VXNlcnNBbmRSb2xlc1VybCkuc3Vic2NyaWJlKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgXHJcbiAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVzcG9uc2U7XHJcbiAgICAgICAgICBsZXQgdm0gPSBuZXcgcmVwb3J0Vmlld01vZGVsKHtcclxuICAgICAgICAgICAgICBydW5SZXBvcnRVcmw6IHRoaXMuYmFzZVNlcnZpY2VVcmwgKyAnL0RvdE5ldFJlcG9ydC9SZXBvcnQnLFxyXG4gICAgICAgICAgICAgIHJlcG9ydFdpemFyZDogJChcIiNtb2RhbC1yZXBvcnRidWlsZGVyXCIpLFxyXG4gICAgICAgICAgICAgIGV4ZWNSZXBvcnRVcmw6IHRoaXMuYmFzZVNlcnZpY2VVcmwgKyAnL0RvdE5ldFJlcG9ydEFwaS9SdW5SZXBvcnQnLFxyXG4gICAgICAgICAgICAgIHJ1bkxpbmtSZXBvcnRVcmw6dGhpcy5iYXNlU2VydmljZVVybCArJy9Eb3ROZXRSZXBvcnRBcGkvUnVuUmVwb3J0TGluaycsXHJcbiAgICAgICAgICAgICAgZ2V0U2NoZW1hRnJvbVNxbDogdGhpcy5iYXNlU2VydmljZVVybCArICcvRG90TmV0UmVwb3J0QXBpL0dldFNjaGVtYUZyb21TcWwnLFxyXG4gICAgICAgICAgICAgIGxpbmtNb2RhbDogJChcIiNsaW5rTW9kYWxcIiksXHJcbiAgICAgICAgICAgICAgcmVwb3J0SGVhZGVyOiBcInJlcG9ydC1oZWFkZXJcIixcclxuICAgICAgICAgICAgICBmaWVsZE9wdGlvbnNNb2RhbDogJChcIiNmaWVsZE9wdGlvbnNNb2RhbFwiKSwgIFxyXG4gICAgICAgICAgICAgIGxvb2t1cExpc3RVcmw6IHRoaXMuYmFzZVNlcnZpY2VVcmwgKyAnL0RvdE5ldFJlcG9ydEFwaS9HZXRMb29rdXBMaXN0JyxcclxuICAgICAgICAgICAgICBhcGlVcmw6IHRoaXMuYmFzZVNlcnZpY2VVcmwgKyAnL0RvdE5ldFJlcG9ydEFwaS9DYWxsUmVwb3J0QXBpJyxcclxuICAgICAgICAgICAgICBydW5SZXBvcnRBcGlVcmw6IHRoaXMuYmFzZVNlcnZpY2VVcmwgKyAnL0RvdE5ldFJlcG9ydEFwaS9SdW5SZXBvcnRBcGknLFxyXG4gICAgICAgICAgICAgIGdldFVzZXJzQW5kUm9sZXNVcmw6IHRoaXMuYmFzZVNlcnZpY2VVcmwgKyAnL0RvdE5ldFJlcG9ydEFwaS9HZXRVc2Vyc0FuZFJvbGVzJyxcclxuICAgICAgICAgICAgICB1c2VyU2V0dGluZ3M6IHJlc3VsdCxcclxuICAgICAgICAgICAgICBkYXRhRmlsdGVyczogcmVzdWx0LmRhdGFGaWx0ZXJzLFxyXG4gICAgICAgICAgICAgIHJ1bkV4cG9ydFVybDogdGhpcy5iYXNlU2VydmljZVVybCArICcvRG90TmV0UmVwb3J0QXBpLycsXHJcbiAgICAgICAgICAgICAgZ2V0VGltZVpvbmVzVXJsOiB0aGlzLmJhc2VTZXJ2aWNlVXJsICsgJy9Eb3ROZXRSZXBvcnRBcGkvR2V0QWxsVGltZXpvbmVzJyxcclxuICAgICAgICAgICAgICBwcmludFJlcG9ydFVybDogdGhpcy5iYXNlVXJsICsgJy9Eb3ROZXRSZXBvcnQvUmVwb3J0UHJpbnQnLFxyXG4gICAgICAgICAgICAgIHNhbWVQYWdlT25SdW46IHRydWUsXHJcbiAgICAgICAgICAgICAgcmVwb3J0TW9kZTogdGhpcy5xdWVyeVBhcmFtc1tcImxpbmtlZHJlcG9ydFwiXSA9PSBcInRydWVcIiA/IFwibGlua2VkXCIgOiBcIlwiLFxyXG4gICAgICAgICAgICAgIHJlcG9ydElkOiB0aGlzLnF1ZXJ5UGFyYW1zW1wicmVwb3J0SWRcIl0gfHwgMCxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdm0ucHJpbnRSZXBvcnQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgdmFyIHByaW50V2luZG93ID0gd2luZG93Lm9wZW4oXCJcIik7XHJcbiAgICAgICAgICAgICAgcHJpbnRXaW5kb3c/LmRvY3VtZW50Lm9wZW4oKTtcclxuICAgICAgICAgICAgICBwcmludFdpbmRvdz8uZG9jdW1lbnQud3JpdGUoJzxodG1sPjxoZWFkPicgK1xyXG4gICAgICAgICAgICAgICAgICAnPGxpbmsgaHJlZj1cIi9Db250ZW50L2Jvb3RzdHJhcC5jc3NcIiByZWw9XCJzdHlsZXNoZWV0XCIgLz4nK1xyXG4gICAgICAgICAgICAgICAgICAnPHN0eWxlIHR5cGU9XCJ0ZXh0L2Nzc1wiPmFbaHJlZl06YWZ0ZXIge2NvbnRlbnQ6IG5vbmUgIWltcG9ydGFudDt9PC9zdHlsZT4nICtcclxuICAgICAgICAgICAgICAgICAgJzwvaGVhZD48Ym9keT4nICsgJCgnLnJlcG9ydC1pbm5lcicpLmh0bWwoKSArXHJcbiAgICAgICAgICAgICAgICAgICc8L2JvZHk+PC9odG1sPicpO1xyXG4gICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgIHByaW50V2luZG93Py5wcmludCgpO1xyXG4gICAgICAgICAgICAgICAgICBwcmludFdpbmRvdz8uY2xvc2UoKTtcclxuICAgICAgICAgICAgICB9LCAyNTApO1xyXG4gICAgICAgICAgfVxyXG4gIFxyXG4gICAgICAgICAgdm0uaW5pdCgwLCByZXN1bHQubm9BY2NvdW50KTtcclxuICBcclxuICAgICAgICAgIHRoaXMucmVuZGVyS09UZW1wbGF0ZXMoKTtcclxuICAgICAgICAgIGtvLmFwcGx5QmluZGluZ3Modm0sIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb3QtbmV0LXJlcG9ydCcpKTtcclxuICBcclxuICAgICAgICAgIHRoaXMuYmluZFdpbmRvd1Jlc2l6ZSh2bSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuICBcclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAga28uY2xlYW5Ob2RlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb3QtbmV0LXJlcG9ydCcpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0KCkge1xyXG4gICAgdGhpcy5uZ09uSW5pdCgpO1xyXG4gIH1cclxuICBcclxuICBwcml2YXRlIHJlbmRlcktPVGVtcGxhdGVzKCkge1xyXG4gIFxyXG4gICAgdGhpcy5yZXBvcnRUZW1wbGF0ZXMgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChgPCEtLSBEb3RuZXQgUmVwb3J0IEhUTUwgVGVtcGxhdGVzIC0tPlxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cInJlcG9ydC1maWx0ZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCIgZGF0YS1iaW5kPVwiYXR0cjoge2lkOiAnZmlsdGVyLScrdWlJZCB9XCI+XHJcbiAgICAgICAgPCEtLSBrbyBpZjogIWhhc0ZvcmVpZ25LZXktLT5cclxuICAgICAgICA8IS0tIGtvIGlmOiBbJ0RhdGVUaW1lJywnRGF0ZScsJ1RpbWUnXS5pbmRleE9mKGZpZWxkVHlwZSkgIT0gLTEgLS0+XHJcbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4O1wiPlxyXG4gICAgICAgICAgICA8IS0tIGtvIGlmOiBbJz0nLCc+JywnPCcsJz49JywnPD0nLCAnbm90IGVxdWFsJ10uaW5kZXhPZigkcGFyZW50Lk9wZXJhdG9yKCkpICE9IC0xIC0tPlxyXG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBkYXRhLWJpbmQ9XCJkYXRlcGlja2VyOiAkcGFyZW50LmZtdFZhbHVlLCBkYXRlcGlja2VyT3B0aW9uczoge3ZhbHVlOiAkcGFyZW50LlZhbHVlLCBkYXRlRm9ybWF0OiBkYXRlRm9ybWF0KCkgPT09ICdDdXN0b20nID8gY3VzdG9tRGF0ZUZvcm1hdCgpLnJlcGxhY2UoL3l5eXkvZywgJ3l5JykgOiAkcm9vdC5kYXRlRm9ybWF0TWFwcGluZ3NbZGF0ZUZvcm1hdCgpXX1cIiByZXF1aXJlZCAvPlxyXG4gICAgICAgICAgICA8IS0tIGtvIGlmOiBmaWVsZFR5cGU9PSdUaW1lJyB8fCBmaWVsZEZvcm1hdCgpPT0nVGltZScgfHwgZmllbGRGb3JtYXQoKT09J0RhdGUgYW5kIFRpbWUnLS0+XHJcbiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHR5cGU9XCJ0aW1lXCIgZGF0YS1iaW5kPVwidmFsdWU6JHBhcmVudC5WYWx1ZXRpbWVcIiByZXF1aXJlZD5cclxuICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwhLS0ga28gaWY6IFsnYmV0d2VlbiddLmluZGV4T2YoJHBhcmVudC5PcGVyYXRvcigpKSAhPSAtMSAtLT5cclxuICAgICAgICBGcm9tXHJcbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4O1wiPlxyXG4gICAgICAgICAgICA8aW5wdXQgcmVxdWlyZWQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZnJvbS1kYXRlXCIgZGF0YS1iaW5kPVwiZGF0ZXBpY2tlcjogJHBhcmVudC5mbXRWYWx1ZSwgZGF0ZXBpY2tlck9wdGlvbnM6IHt2YWx1ZTogJHBhcmVudC5WYWx1ZSwgZGF0ZUZvcm1hdDogZGF0ZUZvcm1hdCgpID09PSAnQ3VzdG9tJyA/IGN1c3RvbURhdGVGb3JtYXQoKS5yZXBsYWNlKC95eXl5L2csICd5eScpIDogJHJvb3QuZGF0ZUZvcm1hdE1hcHBpbmdzW2RhdGVGb3JtYXQoKV19XCIgLz5cclxuICAgICAgICAgICAgPCEtLSBrbyBpZjpmaWVsZFR5cGU9PSdUaW1lJyB8fCBmaWVsZEZvcm1hdCgpPT0nVGltZScgfHwgZmllbGRGb3JtYXQoKT09J0RhdGUgYW5kIFRpbWUnLS0+XHJcbiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHR5cGU9XCJ0aW1lXCIgZGF0YS1iaW5kPVwidmFsdWU6JHBhcmVudC5WYWx1ZXRpbWVcIiByZXF1aXJlZD5cclxuICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgdG9cclxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7XCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCBkYXRhLWJpbmQ9XCJkYXRlcGlja2VyOiAkcGFyZW50LmZtdFZhbHVlMiwgZGF0ZXBpY2tlck9wdGlvbnM6IHt2YWx1ZTogJHBhcmVudC5WYWx1ZTIsIGRhdGVGb3JtYXQ6IGRhdGVGb3JtYXQoKSA9PT0gJ0N1c3RvbScgPyBjdXN0b21EYXRlRm9ybWF0KCkucmVwbGFjZSgveXl5eS9nLCAneXknKSA6ICRyb290LmRhdGVGb3JtYXRNYXBwaW5nc1tkYXRlRm9ybWF0KCldfVwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHRvLWRhdGVcIiByZXF1aXJlZCAvPlxyXG4gICAgICAgICAgICA8IS0tIGtvIGlmOmZpZWxkVHlwZT09J1RpbWUnIHx8IGZpZWxkRm9ybWF0KCk9PSdUaW1lJyB8fCBmaWVsZEZvcm1hdCgpPT0nRGF0ZSBhbmQgVGltZSctLT5cclxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInRpbWVcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTokcGFyZW50LlZhbHVldGltZTJcIiByZXF1aXJlZD5cclxuICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgPCEtLSBrbyBpZjogWydyYW5nZSddLmluZGV4T2YoJHBhcmVudC5PcGVyYXRvcigpKSAhPSAtMSAtLT5cclxuICAgICAgICA8c2VsZWN0IGRhdGEtYmluZD1cInZhbHVlOiAkcGFyZW50LlZhbHVlXCIgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIHJlcXVpcmVkPlxyXG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+PC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+VG9kYXk8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj5Ub2RheSArPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+VG9kYXkgLTwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPlllc3RlcmRheTwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPlRoaXMgV2Vlazwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPkxhc3QgV2Vlazwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPlRoaXMgTW9udGg8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj5MYXN0IE1vbnRoPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+VGhpcyBZZWFyPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+TGFzdCBZZWFyPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+VGhpcyBXZWVrIFRvIERhdGU8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj5UaGlzIE1vbnRoIFRvIERhdGU8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj5UaGlzIFllYXIgVG8gRGF0ZTwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPkxhc3QgMzAgRGF5czwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8IS0tPG9wdGlvbj5UaGlzIE1vbnRoIExhc3QgWWVhcjwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPkxhc3QgTW9udGggTGFzdCBZZWFyPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+VGhpcyBRdWFydGVyPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+TGFzdCBRdWFydGVyPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+Rmlyc3QgUXVhcnRlcjwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPlNlY29uZCBRdWFydGVyPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+VGhpcmQgUXVhcnRlcjwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPkZvdXJ0aCBRdWFydGVyPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+TmV4dCA2IE1vbnRoczwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPkxhc3QgNiBNb250aHM8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj4yIFllYXJzIGFnbzwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPjMgWWVhcnMgYWdvPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+NCBZZWFycyBhZ288L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj41IFllYXJzIGFnbzwvb3B0aW9uPi0tPlxyXG4gICAgICAgICAgICA8b3B0Z3JvdXAgbGFiZWw9XCJDb21wYXJpc29uIE9wdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgIDxvcHRpb24+Pj0gVG9kYXk8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDxvcHRpb24+PD0gVG9kYXk8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDxvcHRpb24+Pj0gVG9kYXkgKzwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPG9wdGlvbj48PSBUb2RheSArPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8b3B0aW9uPj49IFRvZGF5IC08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDxvcHRpb24+PD0gVG9kYXkgLTwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8L29wdGdyb3VwPlxyXG4gICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6ICRwYXJlbnQuVmFsdWUoKS5pbmRleE9mKCdUb2RheSArJykgPj0gMCB8fCAkcGFyZW50LlZhbHVlKCkuaW5kZXhPZignVG9kYXkgLScpID49IDBcIiBjbGFzcz1cImZvcm0tZ3JvdXAgcHVsbC1sZWZ0XCIgc3R5bGU9XCJwYWRkaW5nLXRvcDogNXB4O1wiPlxyXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGlucHV0LXNtIHB1bGwtbGVmdFwiIHN0eWxlPVwid2lkdGg6IDgwcHg7XCIgZGF0YS1iaW5kPVwidmFsdWU6ICRwYXJlbnQuVmFsdWUyXCIgcmVxdWlyZWQgLz48c3BhbiBzdHlsZT1cInBhZGRpbmc6IDVweCA1cHg7XCIgY2xhc3M9XCJwdWxsLWxlZnRcIj4gZGF5czwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8IS0tIGtvIGlmOiBbJ0ludCcsJ01vbmV5JywnRmxvYXQnLCdEb3VibGUnXS5pbmRleE9mKGZpZWxkVHlwZSkgIT0gLTEgLS0+XHJcbiAgICAgICAgICAgIDwhLS0ga28gaWY6IFsnPScsJz4nLCc8JywnPj0nLCc8PScsICdub3QgZXF1YWwnXS5pbmRleE9mKCRwYXJlbnQuT3BlcmF0b3IoKSkgIT0gLTEgJiYgWydpcyBibGFuaycsICdpcyBub3QgYmxhbmsnLCAnaXMgbnVsbCcsICdpcyBub3QgbnVsbCddLmluZGV4T2YoJHBhcmVudC5PcGVyYXRvcigpKSA9PSAtMSAtLT5cclxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cIm51bWJlclwiIGRhdGEtYmluZD1cInZhbHVlOiAkcGFyZW50LlZhbHVlLCBkaXNhYmxlOiAkcGFyZW50Lk9wZXJhdG9yKCkgPT0gJ2lzIGRlZmF1bHQnXCIgcmVxdWlyZWQgLz5cclxuICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICA8IS0tIGtvIGlmOiBbJ2luJywgJ25vdCBpbiddLmluZGV4T2YoJHBhcmVudC5PcGVyYXRvcigpKSAhPSAtMSAtLT5cclxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInRleHRcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogJHBhcmVudC5WYWx1ZVwiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICA8IS0tIGtvIGlmOiBbJ2JldHdlZW4nXS5pbmRleE9mKCRwYXJlbnQuT3BlcmF0b3IoKSkgIT0gLTEgLS0+XHJcbiAgICAgICAgICAgIEZyb21cclxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cIm51bWJlclwiIGRhdGEtYmluZD1cInZhbHVlOiAkcGFyZW50LlZhbHVlXCIgcmVxdWlyZWQgLz5cclxuICAgICAgICAgICAgVG9cclxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cIm51bWJlclwiIGRhdGEtYmluZD1cInZhbHVlOiAkcGFyZW50LlZhbHVlMlwiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgPCEtLSBrbyBpZjogZmllbGRUeXBlPT0nQm9vbGVhbicgJiYgWydpcyBibGFuaycsICdpcyBub3QgYmxhbmsnLCAnaXMgbnVsbCcsICdpcyBub3QgbnVsbCddLmluZGV4T2YoJHBhcmVudC5PcGVyYXRvcigpKSA9PSAtMSAtLT5cclxuICAgICAgICA8c2VsZWN0IHJlcXVpcmVkIGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogJHBhcmVudC5WYWx1ZSwgZGlzYWJsZTogJHBhcmVudC5PcGVyYXRvcigpID09ICdpcyBkZWZhdWx0J1wiPlxyXG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMVwiPlllczwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMFwiPk5vPC9vcHRpb24+XHJcbiAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgPCEtLSBrbyBpZjogWydJbnQnLCdNb25leScsJ0Zsb2F0JywnRG91YmxlJywnRGF0ZScsJ0RhdGVUaW1lJywnVGltZScsJ0Jvb2xlYW4nXS5pbmRleE9mKGZpZWxkVHlwZSkgPT0gLTEgJiYgWydpcyBibGFuaycsICdpcyBub3QgYmxhbmsnLCAnaXMgbnVsbCcsICdpcyBub3QgbnVsbCddLmluZGV4T2YoJHBhcmVudC5PcGVyYXRvcigpKSA9PSAtMSAtLT5cclxuICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGV4dFwiIGRhdGEtYmluZD1cInZhbHVlOiAkcGFyZW50LlZhbHVlLCBkaXNhYmxlOiAkcGFyZW50Lk9wZXJhdG9yKCkgPT0gJ2lzIGRlZmF1bHQnLGF0dHI6IHtpZDogJ2N0bC0nICsgJGVsZW1lbnQuY2xvc2VzdCgnW2RhdGEtcGFyZW50cHJlZml4XScpLmdldEF0dHJpYnV0ZSgnZGF0YS1wYXJlbnRwcmVmaXgnKSArICctJyArIHVpSWR9XCIgcmVxdWlyZWQgLz5cclxuICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8IS0tIGtvIGlmOiBoYXNGb3JlaWduS2V5ICYmICRwYXJlbnQuT3BlcmF0b3IoKSAhPSAnYWxsJyAtLT5cclxuICAgICAgICA8IS0tIGtvIGlmOiBoYXNGb3JlaWduUGFyZW50S2V5ICYmICRwYXJlbnQuc2hvd1BhcmVudEZpbHRlcigpIC0tPlxyXG4gICAgICAgIDxzZWxlY3QgbXVsdGlwbGUgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBkYXRhLWJpbmQ9XCJzZWxlY3QyOiB7IGRyb3Bkb3duUGFyZW50OiAnI2ZpbHRlci0nK3VpSWQsIHBsYWNlaG9sZGVyOiAnUGxlYXNlIENob29zZScsIGFsbG93Q2xlYXI6IHRydWUgfSwgb3B0aW9uczogJHBhcmVudC5QYXJlbnRMaXN0LCBvcHRpb25zVGV4dDogJ3RleHQnLCBvcHRpb25zVmFsdWU6ICRwYXJlbnQuSXNDb25kaXRpb25hbEZpbHRlciA/ICd0ZXh0JzogJ2lkJywgc2VsZWN0ZWRPcHRpb25zOiAkcGFyZW50LlBhcmVudEluXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgPCEtLSBrbyBpZjogJHBhcmVudC5PcGVyYXRvcigpPT0nPSctLT5cclxuICAgICAgICA8c2VsZWN0IHJlcXVpcmVkIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZGF0YS1iaW5kPVwic2VsZWN0MjogeyBkcm9wZG93blBhcmVudDogJyNmaWx0ZXItJyt1aUlkLCBwbGFjZWhvbGRlcjogJ1BsZWFzZSBDaG9vc2UnLCBhbGxvd0NsZWFyOiB0cnVlIH0sIG9wdGlvbnM6ICRwYXJlbnQuTG9va3VwTGlzdCwgb3B0aW9uc1RleHQ6ICd0ZXh0Jywgb3B0aW9uc1ZhbHVlOiAgICRwYXJlbnQuSXNDb25kaXRpb25hbEZpbHRlciA/ICd0ZXh0JzogJ2lkJywgdmFsdWU6ICRwYXJlbnQuVmFsdWUsIG9wdGlvbnNDYXB0aW9uOiAnUGxlYXNlIENob29zZSdcIj48L3NlbGVjdD5cclxuICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8IS0tIGtvIGlmOiAkcGFyZW50Lk9wZXJhdG9yKCk9PSdpbicgfHwgJHBhcmVudC5PcGVyYXRvcigpPT0nbm90IGluJy0tPlxyXG4gICAgICAgIDxzZWxlY3QgcmVxdWlyZWQgbXVsdGlwbGUgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBkYXRhLWJpbmQ9XCJzZWxlY3QyOiB7IGRyb3Bkb3duUGFyZW50OiAnI2ZpbHRlci0nK3VpSWQsIHBsYWNlaG9sZGVyOiAnUGxlYXNlIENob29zZScsIGFsbG93Q2xlYXI6IHRydWUgfSwgb3B0aW9uczogJHBhcmVudC5Mb29rdXBMaXN0LCBvcHRpb25zVGV4dDogJ3RleHQnLCBvcHRpb25zVmFsdWU6ICRwYXJlbnQuSXNDb25kaXRpb25hbEZpbHRlciA/ICd0ZXh0JzogJ2lkJywgc2VsZWN0ZWRPcHRpb25zOiAkcGFyZW50LlZhbHVlSW5cIj48L3NlbGVjdD5cclxuICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwicGFnZXItdGVtcGxhdGVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJwYWdlci1jb250YWluZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LXdyYXAgZ2FwLTJcIj5cclxuXHJcbiAgICAgICAgPCEtLSBSb3dzIHBlciBwYWdlIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0xIG1zLTFcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsXCI+UGFnZSBzaXplOjwvc3Bhbj5cclxuICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tc2VsZWN0LXNtIHctYXV0b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwib3B0aW9uczogcGFnZVNpemVPcHRpb25zLCB2YWx1ZTogcGFnZVNpemVcIj5cclxuICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gSW5uZXIgYm9yZGVyIGJsb2NrIGZvciBwYWdlIG5hdmlnYXRpb24gY29udHJvbHMgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTEgbXMtM1wiPlxyXG4gICAgICAgICAgICA8YSBocmVmPVwiI1wiIHRpdGxlPVwiRmlyc3RcIiBkYXRhLWJpbmQ9XCJjbGljazogZmlyc3QsIGVuYWJsZTogIWlzRmlyc3RQYWdlKClcIlxyXG4gICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnkgYnRuLXNtIHBhZ2VyLWJ0biBtcy0xXCIgYXJpYS1sYWJlbD1cIkZpcnN0IFBhZ2VcIj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYW5nbGUtZG91YmxlLWxlZnRcIj48L2k+XHJcbiAgICAgICAgICAgIDwvYT5cclxuXHJcbiAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgdGl0bGU9XCJQcmV2aW91c1wiIGRhdGEtYmluZD1cImNsaWNrOiBwcmV2aW91cywgZW5hYmxlOiAhaXNGaXJzdFBhZ2UoKVwiXHJcbiAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBidG4tc20gcGFnZXItYnRuXCIgYXJpYS1sYWJlbD1cIlByZXZpb3VzIFBhZ2VcIj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYW5nbGUtbGVmdFwiPjwvaT5cclxuICAgICAgICAgICAgPC9hPlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTFcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPlBhZ2U8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG1pbj1cIjFcIiBwYXR0ZXJuPVwiWzAtOV0qXCJcclxuICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc20gdGV4dC1jZW50ZXIgcGFnZXItaW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDYwcHg7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJ2YWx1ZTogY3VycmVudFBhZ2UsIGF0dHI6IHsgbWF4OiBwYWdlcygpIH1cIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPm9mPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsXCIgZGF0YS1iaW5kPVwidGV4dDogcGFnZXNcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiB0aXRsZT1cIk5leHRcIiBkYXRhLWJpbmQ9XCJjbGljazogbmV4dCwgZW5hYmxlOiAhaXNMYXN0UGFnZSgpXCJcclxuICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGJ0bi1zbSBwYWdlci1idG5cIiBhcmlhLWxhYmVsPVwiTmV4dCBQYWdlXCI+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWFuZ2xlLXJpZ2h0XCI+PC9pPlxyXG4gICAgICAgICAgICA8L2E+XHJcblxyXG4gICAgICAgICAgICA8YSBocmVmPVwiI1wiIHRpdGxlPVwiTGFzdFwiIGRhdGEtYmluZD1cImNsaWNrOiBsYXN0LCBlbmFibGU6ICFpc0xhc3RQYWdlKClcIlxyXG4gICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnkgYnRuLXNtIHBhZ2VyLWJ0blwiIGFyaWEtbGFiZWw9XCJMYXN0IFBhZ2VcIj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYW5nbGUtZG91YmxlLXJpZ2h0XCI+PC9pPlxyXG4gICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9zY3JpcHQ+XHJcblxyXG5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwicmVwb3J0LWNvbHVtbi1oZWFkZXJcIj5cclxuICAgIDwhLS0ga28gZm9yZWFjaDogQ29sdW1ucyAtLT5cclxuICAgIDx0aCBkYXRhLWJpbmQ9XCJhdHRyOiB7IGlkOiAhSXNQaXZvdEZpZWxkID8gZmllbGRJZCA6ICdwaXZvdC0tJyArIGZpZWxkTmFtZSB9LCBzdHlsZTogeyd0ZXh0LWFsaWduJzogZmllbGRBbGlnbigpID8gZmllbGRBbGlnbigpIDogKElzTnVtZXJpYyA/ICdyaWdodCcgOiAnbGVmdCcpLCAnYmFja2dyb3VuZC1jb2xvcic6IGhlYWRlckJhY2tDb2xvciB9LCBoaWRkZW46IG91dGVyR3JvdXBcIiBzdHlsZT1cImJvcmRlci1yaWdodDogMXB4IHNvbGlkO1wiPlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0XCIgZGF0YS1iaW5kPVwiaWY6ICEkcGFyZW50LklzRHJpbGxEb3duKClcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDVweDtcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3B1cFwiPlxyXG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCIgYXJpYS1oYXNwb3B1cD1cImZhbHNlXCIgYXJpYS1leHBhbmRlZD1cImZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1lbGxpcHNpcy12IHNvcnRhYmxlXCIgdGl0bGU9XCJEcmFnIHRvIHJlb3JkZXJcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICA8dWwgZGF0YS1iaW5kPVwidmlzaWJsZTogIUlzUGl2b3RGaWVsZFwiIGNsYXNzPVwiZHJvcGRvd24tbWVudVwiIHN0eWxlPVwiei1pbmRleDogMTAwMTtcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJkcm9wZG93bi1pdGVtIHNtYWxsXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogIUlzTnVtZXJpY1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGRhdGEtYmluZD1cImNsaWNrOiB0b2dnbGVPdXRlckdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWNsb25lXCI+PC9zcGFuPiBPdXRlciBHcm91cFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJkcm9wZG93bi1pdGVtIHNtYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgZGF0YS1iaW5kPVwiY2xpY2s6IHNldHVwRmllbGRPcHRpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWdlYXJcIj48L3NwYW4+IEZpZWxkIFNldHRpbmdzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJzdHlsZTogeyd3aWR0aCc6IGZpZWxkV2lkdGh9XCI+XHJcbiAgICAgICAgICAgIDwhLS0ga28gaWY6ICRwYXJlbnRzWzNdLnVzZVN0b3JlZFByb2MgPyAkcGFyZW50c1szXS51c2VTdG9yZWRQcm9jKCkgOiAoJHBhcmVudHNbNV0udXNlU3RvcmVkUHJvYyA/ICRwYXJlbnRzWzVdLnVzZVN0b3JlZFByb2MoKSA6IGZhbHNlKSAtLT5cclxuICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogZmllbGRMYWJlbCgpID8gZmllbGRMYWJlbCgpIDogZmllbGROYW1lLCBzdHlsZTogeydjb2xvcic6IGhlYWRlckZvbnRDb2xvciwgJ2ZvbnQtd2VpZ2h0JzogaGVhZGVyRm9udEJvbGQoKSA/ICdib2xkJyA6ICdub3JtYWwnfVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgIDwhLS0ga28gaWZub3Q6ICRwYXJlbnRzWzNdLnVzZVN0b3JlZFByb2MgPyAkcGFyZW50c1szXS51c2VTdG9yZWRQcm9jKCkgOiAoJHBhcmVudHNbNV0udXNlU3RvcmVkUHJvYyA/ICRwYXJlbnRzWzVdLnVzZVN0b3JlZFByb2MoKSA6IGZhbHNlKSAgLS0+XHJcbiAgICAgICAgICAgIDxhIGhyZWY9XCJcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgaWYgKCFJc1Bpdm90RmllbGQpIHsgJHBhcmVudHNbcGFnZXJJbmRleCgkcGFyZW50cyldLmNoYW5nZVNvcnQoU3FsRmllbGQpOyB9IH0sIHN0eWxlOiB7J2NvbG9yJzogaGVhZGVyRm9udENvbG9yLCAnZm9udC13ZWlnaHQnOiBoZWFkZXJGb250Qm9sZCgpID8gJ2JvbGQnIDogJ25vcm1hbCd9XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiAkcGFyZW50LklzRHJpbGxEb3duKCkgJiYgZmllbGRMYWJlbDIoKSA/IGZpZWxkTGFiZWwyKCkgOiAoZmllbGRMYWJlbCgpID8gZmllbGRMYWJlbCgpIDogZmllbGROYW1lKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInRleHQ6ICRwYXJlbnRzW3BhZ2VySW5kZXgoJHBhcmVudHMpXS5wYWdlci5zb3J0Q29sdW1uKCkgPT09IFNxbEZpZWxkID8gKCRwYXJlbnRzW3BhZ2VySW5kZXgoJHBhcmVudHMpXS5wYWdlci5zb3J0RGVzY2VuZGluZygpID8gJyYjOTY2MDsnIDogJyYjOTY1MDsnKSA6ICcnXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC90aD5cclxuICAgIDwhLS0gL2tvIC0tPlxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwicmVwb3J0LXdpZGdldFwiPlxyXG4gICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgd2lkdGg6IDEwMCU7Zm9udC1zaXplOiA0OHB4XCI+XHJcbiAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidmlzaWJsZTogUm93cy5sZW5ndGggPCAxXCIgdGl0bGU9XCJObyBkYXRhIGZvdW5kXCI+Lzwvc3Bhbj5cclxuXHJcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogUm93cy5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogJHBhcmVudC5yb3dzWzBdLkl0ZW1zWzBdXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJodG1sOiBmb3JtYXR0ZWRWYWxcIj48L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogJHBhcmVudC5Sb3dzLmxlbmd0aCA+IDEgPyAoJHBhcmVudHNbJHBhcmVudHMubGVuZ3RoLTJdLnNob3dQcmlvckluS3BpICE9IHVuZGVmaW5lZCA/ICRwYXJlbnRzWyRwYXJlbnRzLmxlbmd0aC0yXS5zaG93UHJpb3JJbktwaSgpIDogJHBhcmVudHNbJHBhcmVudHMubGVuZ3RoLTFdLnNob3dQcmlvckluS3BpKCkpIDogZmFsc2UgLS0+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJzdHlsZTogeydjb2xvcic6ICRwYXJlbnQuY2FsY3VsYXRlUmF0ZSgpID4gMCA/ICdncmVlbicgOiAncmVkJywgJ2ZvbnQtc2l6ZSc6ICcyNHB4J31cIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJodG1sOiAkcGFyZW50LmNhbGN1bGF0ZVJhdGUoKSArICclJ1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInN0eWxlOiB7J2ZvbnQtc2l6ZSc6ICcyNHB4JywgJ2NvbG9yJzogJ2dyYXknfSwgY3NzOiB7J3RleHQtbXV0ZWQnOiB0cnVlfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIFByaW9yIFBlcmlvZDogPHNwYW4gZGF0YS1iaW5kPVwiaHRtbDogJHBhcmVudC5Sb3dzWzFdLkl0ZW1zWzBdLmZvcm1hdHRlZFZhbFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcblxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuPC9zY3JpcHQ+XHJcblxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cInJlcG9ydC1jb2x1bW5cIj5cclxuICAgIDwhLS0ga28gZm9yZWFjaDogSXRlbXMgLS0+XHJcbiAgICA8dGQgZGF0YS1iaW5kPVwiaGlkZGVuOiBvdXRlckdyb3VwLCBzdHlsZTogeydiYWNrZ3JvdW5kLWNvbG9yJzogX2JhY2tDb2xvciA/PyBiYWNrQ29sb3IoKSwgJ2NvbG9yJzogX2ZvbnRDb2xvciA/PyBmb250Q29sb3IoKSwgJ2ZvbnQtd2VpZ2h0JzogZm9udEJvbGQoKSB8fCBfZm9udEJvbGQgPyAnYm9sZCcgOiAnbm9ybWFsJywgJ3RleHQtYWxpZ24nOiBmaWVsZEFsaWduKCkgPyBmaWVsZEFsaWduKCkgOiAoQ29sdW1uLklzTnVtZXJpYyA/ICdyaWdodCcgOiAnbGVmdCcpfVwiPlxyXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVwic3R5bGU6IHsnd2lkdGgnOiBmaWVsZFdpZHRoIH0sIGNzczogeyAndGV4dC13cmFwJzogZmllbGRXaWR0aCB9XCI+XHJcbiAgICAgICAgICAgIDwhLS0ga28gaWY6IExpbmtUby0tPlxyXG4gICAgICAgICAgICA8YSBkYXRhLWJpbmQ9XCJhdHRyOiB7aHJlZjogTGlua1RvfVwiIHRhcmdldD1cIl9ibGFua1wiPjxzcGFuIGRhdGEtYmluZD1cImh0bWw6IGZvcm1hdHRlZFZhbFwiPjwvc3Bhbj48L2E+XHJcbiAgICAgICAgICAgIDwhLS0gL2tvLS0+XHJcbiAgICAgICAgICAgIDwhLS0ga28gaWZub3Q6IExpbmtUby0tPlxyXG4gICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJodG1sOiBmb3JtYXR0ZWRWYWxcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDwhLS0gL2tvLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L3RkPlxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwicmVwb3J0LXBpdm90XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiIGRhdGEtYmluZD1cIndpdGg6IFJlcG9ydERhdGFcIj5cclxuICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zdHJpcGVkIHRhYmxlLWhvdmVyIHRhYmxlLWNvbmRlbnNlZFwiPlxyXG4gICAgICAgICAgICA8dGhlYWQgc3R5bGU9XCJwb3NpdGlvbjogc3RpY2t5OyB0b3A6IC0xcHg7IHotaW5kZXg6IDI7XCI+XHJcbiAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoPjwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiBSb3dzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogSXRlbXNbMF0uRm9ybWF0dGVkVmFsdWVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgIDx0Ym9keSBkYXRhLWJpbmQ9XCJmb3JlYWNoOiBDb2x1bW5zXCI+XHJcbiAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogJGluZGV4KCkgPiAwIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogZmllbGRMYWJlbCB8fCBDb2x1bW5OYW1lXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiAkcGFyZW50LlJvd3MgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtYmluZD1cInN0eWxlOiB7J2JhY2tncm91bmQtY29sb3InOiAkcGFyZW50LmJhY2tDb2xvciwgJ2NvbG9yJzogJHBhcmVudC5mb250Q29sb3IsICdmb250LXdlaWdodCc6ICRwYXJlbnQuZm9udEJvbGQoKSA/ICdib2xkJyA6ICdub3JtYWwnLCAndGV4dC1hbGlnbic6ICRwYXJlbnQuZmllbGRBbGlnbiA/ICRwYXJlbnQuZmllbGRBbGlnbiA6ICgkcGFyZW50LklzTnVtZXJpYyA/ICdyaWdodCcgOiAnbGVmdCcpIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogSXRlbXNbJHBhcmVudENvbnRleHQuJGluZGV4KCldLkZvcm1hdHRlZFZhbHVlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgIDwvdGFibGU+XHJcblxyXG4gICAgPC9kaXY+XHJcblxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwicmVwb3J0LXRhYmxlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxyXG4gICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLWhvdmVyIHRhYmxlLWNvbmRlbnNlZFwiIGRhdGEtYmluZD1cImF0dHI6IHtjbGFzczogJ3RhYmxlIHRhYmxlLXN0cmlwZWQgdGFibGUtaG92ZXIgdGFibGUtY29uZGVuc2VkICcgKyAkcGFyZW50c1syXS5zZWxlY3RlZFN0eWxlKCl9XCI+XHJcbiAgICAgICAgICAgIDx0aGVhZCBzdHlsZT1cInBvc2l0aW9uOiBzdGlja3k7IHRvcDogLTFweDsgei1pbmRleDogMjtcIiBkYXRhLWJpbmQ9XCJpZjogISRwYXJlbnRzWzJdLm5vSGVhZGVyUm93KClcIj5cclxuICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cIm5vLWhpZ2hsaWdodFwiIGRhdGEtYmluZD1cInNvcnRhYmxlQ29sdW1uczogeyBoYW5kbGU6ICcuc29ydGFibGUnLCBjdXJzb3I6ICdtb3ZlJywgcGxhY2Vob2xkZXI6ICdkcm9wLWhpZ2hsaWdodCcsc2VsZWN0ZWRGaWVsZHM6ICRwYXJlbnRzWzJdLlNlbGVjdGVkRmllbGRzIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiAkcGFyZW50Q29udGV4dC4kcGFyZW50Q29udGV4dC4kcGFyZW50LmNhbkRyaWxsZG93bigpICYmICFJc0RyaWxsRG93bigpICYmICFDYW5FeHBhbmRPcHRpb24oKSAmJiAoISRwYXJlbnRzWzJdLmhhc1Bpdm90Q29sdW1uKCkgfHwgKCRwYXJlbnRzWzJdLmhhc1Bpdm90Q29sdW1uKCkgJiYgJHBhcmVudHNbMl0uYXBwU2V0dGluZ3MudXNlQWx0UGl2b3QpKSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMzBweDsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZDtcIiBkYXRhLWJpbmQ9XCJzdHlsZTogeydiYWNrZ3JvdW5kLWNvbG9yJzogQ29sdW1uc1swXS5oZWFkZXJCYWNrQ29sb3J9XCI+PC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiAncmVwb3J0LWNvbHVtbi1oZWFkZXInLCBkYXRhOiAkZGF0YSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rby0tPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgPHRib2R5IGRhdGEtYmluZD1cImF0dHI6IHtpZDogJ3JlcG9ydC10YWJsZS1ib2R5JyArICRwYXJlbnRzWzJdLlJlcG9ydElEKCl9XCI+XHJcbiAgICAgICAgICAgICAgICA8dHIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIGRhdGEtYmluZD1cInZpc2libGU6IFJvd3MubGVuZ3RoIDwgMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBkYXRhLWJpbmQ9XCJhdHRyOntjb2xzcGFuOiBDb2x1bW5zLmxlbmd0aCArIDF9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIE5vIHJlY29yZHMgZm91bmRcclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiAhJHBhcmVudHNbMl0udXNlUmVuZGVyVGFibGUoKSAtLT5cclxuICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogJHBhcmVudC5yb3dzICAtLT5cclxuICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiAkcGFyZW50Q29udGV4dC4kcGFyZW50Q29udGV4dC4kcGFyZW50Q29udGV4dC4kcGFyZW50LmNhbkRyaWxsZG93bigpICYmICEkcGFyZW50LklzRHJpbGxEb3duKCkgJiYgISRwYXJlbnQuQ2FuRXhwYW5kT3B0aW9uKCkgJiYgJHBhcmVudENvbnRleHQuJHBhcmVudENvbnRleHQuJHBhcmVudENvbnRleHQuJHBhcmVudC5SZXBvcnRUeXBlKCkgIT0gJ1NpbmdsZScgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDMwcHg7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XCIgZGF0YS1iaW5kPVwic3R5bGU6IHsnYmFja2dyb3VuZC1jb2xvcic6IEl0ZW1zWzBdLl9iYWNrQ29sb3IgPz8gSXRlbXNbMF0uYmFja0NvbG9yKCksICdjb2xvcic6IEl0ZW1zWzBdLl9mb250Q29sb3IgPz8gSXRlbXNbMF0uZm9udENvbG9yKCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IHRvZ2dsZSgpOyB9XCI+PHNwYW4gY2xhc3M9XCJmYVwiIGRhdGEtYmluZD1cImNzczogeydmYS1wbHVzJzogIWlzRXhwYW5kZWQoKSwgJ2ZhLW1pbnVzJzogaXNFeHBhbmRlZCgpfVwiPjwvc3Bhbj48L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiAncmVwb3J0LWNvbHVtbicsIGRhdGE6ICRkYXRhIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvLS0+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogaXNFeHBhbmRlZCAtLT5cclxuICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMzBweDtcIj48L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBkYXRhLWJpbmQ9XCJhdHRyOntjb2xzcGFuOiAkcGFyZW50LkNvbHVtbnMubGVuZ3RoIH1cIiBzdHlsZT1cInBhZGRpbmctbGVmdDogMHB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6ICFEcmlsbERvd25EYXRhKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXBvcnQtc3Bpbm5lclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogRHJpbGxEb3duRGF0YSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtc3RyaXBlZCB0YWJsZS1ob3ZlciB0YWJsZS1jb25kZW5zZWRcIiBkYXRhLWJpbmQ9XCJ3aXRoOiBEcmlsbERvd25EYXRhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwibm8taGlnaGxpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6ICdyZXBvcnQtY29sdW1uLWhlYWRlcicsIGRhdGE6ICRkYXRhIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIC9rby0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogUm93cyAmJiBSb3dzLmxlbmd0aCA8IDFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtYmluZD1cImF0dHI6IHtjb2xzcGFuOiBDb2x1bW5zLmxlbmd0aH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIHJlY29yZHMgZm91bmRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogUm93cyAgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiAncmVwb3J0LWNvbHVtbicsIGRhdGE6ICRkYXRhIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIC9rby0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXhzLTEyIGNvbC1jZW50ZXJlZFwiIGRhdGEtYmluZD1cIndpdGg6IHBhZ2VyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1pbmxpbmUgc21hbGwgdGV4dC1tdXRlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnQgdG90YWwtcmVjb3Jkc1wiIGRhdGEtYmluZD1cInZpc2libGU6IHBhZ2VzKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogJ1RvdGFsIFJlY29yZHM6ICcgKyB0b3RhbFJlY29yZHMoKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0IHRvdGFsLXJlY29yZHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgdGl0bGU9XCJEb3dubG9hZCBFeGNlbFwiIGRhdGEtYmluZD1cImNsaWNrOiAkcGFyZW50LmV4cG9ydEV4Y2VsXCI+PHNwYW4gY2xhc3M9XCJmYSBmYS1maWxlLWV4Y2VsLW9cIj48L3NwYW4+PC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiB0aXRsZT1cIlZpZXcgQ29kZVwiIGRhdGEtYnMtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLWJzLXRhcmdldD1cIiNzcWxEcmlsbERvd25Nb2RhbFwiIGRhdGEtYmluZD1cInZpc2libGU6ICRyb290LmFkbWluTW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1jb2RlXCI+PC9zcGFuPiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPiAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBwdWxsLXJpZ2h0XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogcGFnZXMoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAncGFnZXItdGVtcGxhdGUnLCBkYXRhOiAkZGF0YVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogc3ViUmVwb3J0c1JhbigpLmxlbmd0aCA+IDAgLS0+XHJcbiAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtYmluZD1cImF0dHI6e2NvbHNwYW46ICRwYXJlbnQuQ29sdW1ucy5sZW5ndGggfVwiIHN0eWxlPVwicGFkZGluZy1sZWZ0OiAwcHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiZm9yZWFjaDogc3ViUmVwb3J0c1JhblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIiBzdHlsZT1cInBhZGRpbmctYm90dG9tOiAyMHB4O1wiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwicHVsbC1sZWZ0XCIgZGF0YS1iaW5kPVwidGV4dDogUmVwb3J0TmFtZVwiPjwvaDI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xlYXJmaXhcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3Qtb3ZlcmZsb3ctYXV0b1wiIHN0eWxlPVwicGFkZGluZy10b3A6IDA7IG1hcmdpbi10b3A6IDA7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBkYXRhLWJpbmQ9XCJodG1sOiBSZXBvcnREZXNjcmlwdGlvbiwgdmlzaWJsZTogUmVwb3J0RGVzY3JpcHRpb25cIj48L3A+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ3aXRoOiBSZXBvcnRSZXN1bHRcIiBjbGFzcz1cInNtYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAhUmVwb3J0RGF0YSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXBvcnQtc3Bpbm5lclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdyZXBvcnQtdGVtcGxhdGUnLCBkYXRhOiAkZGF0YVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1pbmxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWFsbFwiIGRhdGEtYmluZD1cIndpdGg6IHBhZ2VyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcHVsbC1sZWZ0IHRvdGFsLXJlY29yZHNcIiBkYXRhLWJpbmQ9XCJpZjogdG90YWxSZWNvcmRzKCk+MSAmJiAkcGFyZW50LlJlcG9ydFR5cGUoKSAhPSAnU2luZ2xlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiAnVG90YWwgUmVjb3JkczogJyArIHRvdGFsUmVjb3JkcygpXCI+PC9zcGFuPjxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHB1bGwtcmlnaHRcIiBkYXRhLWJpbmQ9XCJpZjogcGFnZXMoKT4xICYmICRwYXJlbnQuUmVwb3J0VHlwZSgpICE9ICdTaW5nbGUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdwYWdlci10ZW1wbGF0ZScsIGRhdGE6ICRkYXRhXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgIDwhLS0gL2tvLS0+XHJcbiAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgIDwhLS0ga28gaWY6ICRwYXJlbnRDb250ZXh0LiRwYXJlbnQuU3ViVG90YWxzKCkubGVuZ3RoID09IDEgJiYgJHBhcmVudENvbnRleHQuJHBhcmVudENvbnRleHQuJHBhcmVudC5PdXRlckdyb3VwQ29sdW1ucygpLmxlbmd0aCA9PSAwIC0tPlxyXG4gICAgICAgICAgICA8dGZvb3QgZGF0YS1iaW5kPVwiZm9yZWFjaDogJHBhcmVudENvbnRleHQuJHBhcmVudC5TdWJUb3RhbHNcIj5cclxuICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cInN1Yi10b3RhbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6ICRwYXJlbnRDb250ZXh0LiRwYXJlbnRDb250ZXh0LiRwYXJlbnRDb250ZXh0LiRwYXJlbnQuY2FuRHJpbGxkb3duKCkgJiYgISRwYXJlbnQuSXNEcmlsbERvd24oKSAmJiAhJHBhcmVudC5DYW5FeHBhbmRPcHRpb24oKSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IEl0ZW1zIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6IFZhbHVlICE9ICdOQScgJiYgVmFsdWUgIT0gJ05hTicgJiYgIW91dGVyR3JvdXAoKSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgZGF0YS1iaW5kPVwic3R5bGU6IHsnYmFja2dyb3VuZC1jb2xvcic6IF9iYWNrQ29sb3IgPz8gYmFja0NvbG9yKCksICdjb2xvcic6IF9mb250Q29sb3IgPz8gZm9udENvbG9yKCksICdmb250LXdlaWdodCc6IGZvbnRCb2xkKCkgfHwgX2ZvbnRCb2xkID8gJ2JvbGQnIDogJ25vcm1hbCcsICd0ZXh0LWFsaWduJzogZmllbGRBbGlnbigpID8gZmllbGRBbGlnbigpIDogJ3JpZ2h0J31cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJzdHlsZTogeyd3aWR0aCc6IGZpZWxkV2lkdGggfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJodG1sOiBmb3JtYXR0ZWRWYWxcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L3Rmb290PlxyXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8L3RhYmxlPlxyXG4gICAgPC9kaXY+XHJcbjwvc2NyaXB0PlxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJyZXBvcnQtcmVuZGVyXCI+XHJcbiAgICA8ZGl2IGRhdGEtYmluZD1cIndpdGg6IFJlcG9ydERhdGFcIj5cclxuICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJmb3JlYWNoOiBSb3dzXCI+XHJcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJodG1sOiByZW5kZXJlZEh0bWwsIGNzczogeyAnY2FyZC12aWV3JzogJHBhcmVudHNbJHBhcmVudHMubGVuZ3RoLTFdLmNhcmRWaWV3IH1cIj48L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJmb3JlYWNoOiBzdWJSZXBvcnRzUmFuXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIiBzdHlsZT1cInBhZGRpbmctYm90dG9tOiAyMHB4O1wiID5cclxuICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9XCJwdWxsLWxlZnRcIiBkYXRhLWJpbmQ9XCJ0ZXh0OiBSZXBvcnROYW1lXCI+PC9oMj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsZWFyZml4XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3Qtb3ZlcmZsb3ctYXV0b1wiIHN0eWxlPVwicGFkZGluZy10b3A6IDA7IG1hcmdpbi10b3A6IDA7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGRhdGEtYmluZD1cImh0bWw6IFJlcG9ydERlc2NyaXB0aW9uLCB2aXNpYmxlOiBSZXBvcnREZXNjcmlwdGlvblwiPjwvcD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogUmVwb3J0UmVzdWx0XCIgY2xhc3M9XCJzbWFsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAhUmVwb3J0RGF0YSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlcG9ydC1zcGlubmVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdyZXBvcnQtdGVtcGxhdGUnLCBkYXRhOiAkZGF0YVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1pbmxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtYWxsXCIgZGF0YS1iaW5kPVwid2l0aDogcGFnZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHB1bGwtbGVmdCB0b3RhbC1yZWNvcmRzXCIgZGF0YS1iaW5kPVwiaWY6IHRvdGFsUmVjb3JkcygpPjEgJiYgJHBhcmVudC5SZXBvcnRUeXBlKCkgIT0gJ1NpbmdsZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiAnVG90YWwgUmVjb3JkczogJyArIHRvdGFsUmVjb3JkcygpXCI+PC9zcGFuPjxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBwdWxsLXJpZ2h0XCIgZGF0YS1iaW5kPVwiaWY6IHBhZ2VzKCk+MSAmJiAkcGFyZW50LlJlcG9ydFR5cGUoKSAhPSAnU2luZ2xlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdwYWdlci10ZW1wbGF0ZScsIGRhdGE6ICRkYXRhXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNsZWFyZml4XCI+PC9kaXY+XHJcbjwvc2NyaXB0PlxyXG5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwicmVwb3J0LXRlbXBsYXRlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicmVwb3J0LWNoYXJ0XCIgZGF0YS1iaW5kPVwiYXR0cjoge2lkOiAnY2hhcnRfZGl2XycgKyAkcGFyZW50LlJlcG9ydElEKCl9LCB2aXNpYmxlOiAkcGFyZW50LmlzQ2hhcnRcIj48L2Rpdj5cclxuICAgIDwhLS0ga28gaWY6ICRwYXJlbnQuUmVwb3J0VHlwZSgpID09ICdQaXZvdCcgLS0+XHJcbiAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiB7bmFtZTogJ3JlcG9ydC1waXZvdCcsIGRhdGE6ICRkYXRhIH1cIj48L2Rpdj5cclxuICAgIDwhLS0gL2tvIC0tPlxyXG5cclxuICAgIDwhLS0ga28gaWY6ICRwYXJlbnQuUmVwb3J0VHlwZSgpID09ICdIdG1sJyAtLT5cclxuICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6IHtuYW1lOiAncmVwb3J0LXJlbmRlcicsIGRhdGE6ICRkYXRhIH1cIj48L2Rpdj5cclxuICAgIDwhLS0gL2tvIC0tPlxyXG5cclxuICAgIDwhLS0ga28gaWY6ICRwYXJlbnQuUmVwb3J0VHlwZSgpICE9ICdQaXZvdCcgJiYgJHBhcmVudC5SZXBvcnRUeXBlKCkgIT0gJ0h0bWwnICYmICghJHBhcmVudC5pc0NoYXJ0KCkgfHwgJHBhcmVudC5TaG93RGF0YVdpdGhHcmFwaCgpKSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCIgZGF0YS1iaW5kPVwiaWY6ICRwYXJlbnQuT3V0ZXJHcm91cENvbHVtbnMoKS5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgPGEgaHJlZj1cIiNcIiBkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCIgYXJpYS1oYXNwb3B1cD1cImZhbHNlXCIgYXJpYS1leHBhbmRlZD1cImZhbHNlXCI+XHJcbiAgICAgICAgICAgIE1hbmFnZSBHcm91cHMgPHNwYW4gY2xhc3M9XCJmYSBmYS1lbGxpcHNpcy12XCI+PC9zcGFuPlxyXG4gICAgICAgIDwvYT5cclxuICAgICAgICA8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgc3R5bGU9XCJ6LWluZGV4OiAxMDAxO1wiIGRhdGEtYmluZD1cImZvcmVhY2g6ICRwYXJlbnQuT3V0ZXJHcm91cENvbHVtbnNcIj5cclxuICAgICAgICAgICAgPGxpIGNsYXNzPVwiZHJvcGRvd24taXRlbSBzbWFsbFwiPlxyXG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogcmVtb3ZlXCIgdGl0bGU9XCJSZW1vdmUgZnJvbSBHcm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtY2xvc2VcIj48L3NwYW4+IDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IGZpZWxkTmFtZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgPC9saT5cclxuICAgICAgICA8L3VsPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2xlYXItZml4XCI+PC9kaXY+XHJcblxyXG4gICAgPGRpdiBkYXRhLWJpbmQ9XCJmb3JlYWNoOiBvdXRlckdyb3VwRGF0YVwiPlxyXG4gICAgICAgIDwhLS0ga28gaWY6IHJvd3MubGVuZ3RoID4gMCB8fCAoJHBhcmVudC5vdXRlckdyb3VwRGF0YSAmJiAkcGFyZW50Lm91dGVyR3JvdXBEYXRhKCkubGVuZ3RoID09IDEpIC0tPlxyXG4gICAgICAgIDxoNiBkYXRhLWJpbmQ9XCJodG1sOiBkaXNwbGF5XCI+PC9oNj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiXCIgc3R5bGU9XCJwYWRkaW5nLXRvcDogNXB4O1wiPjwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIGtvIGlmOiAkcGFyZW50c1sxXS5SZXBvcnRUeXBlKCkgIT0gJ1NpbmdsZSctLT5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiB7bmFtZTogJ3JlcG9ydC10YWJsZScsIGRhdGE6ICRwYXJlbnQuUmVwb3J0RGF0YSB9XCI+PC9kaXY+XHJcbiAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgPCEtLSBrbyBpZjogJHBhcmVudHNbMV0uUmVwb3J0VHlwZSgpID09ICdTaW5nbGUnLS0+XHJcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZToge25hbWU6ICdyZXBvcnQtd2lkZ2V0JywgZGF0YTogJHBhcmVudC5SZXBvcnREYXRhIH1cIj48L2Rpdj5cclxuICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgIDwvZGl2PlxyXG4gICAgPCEtLSAva28gLS0+XHJcbjwvc2NyaXB0PlxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cImFkbWluLW1vZGUtdGVtcGxhdGVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtY2VudGVyXCIgc3R5bGU9XCJnYXA6IDEwcHg7XCI+XHJcbiAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogYWRtaW5Nb2RlXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mbyBkLWlubGluZS1ibG9ja1wiIHN0eWxlPVwiZm9udC1zaXplOiAxMHB0OyBwYWRkaW5nOiA1cHg7IG1heC13aWR0aDogMzUwcHg7IHdoaXRlLXNwYWNlOiBub3JtYWw7IG1hcmdpbi1ib3R0b206IDA7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS11c2VyLWNpcmNsZVwiPjwvaT4gWW91IGNhbiBtYW5hZ2UgUmVwb3J0cy9EYXNoYm9hcmRzIGZvciBhbGwgdXNlcnNcclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidWJibGUtYmFkZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICBBZG1pbiBNb2RlXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgZm9ybS1zd2l0Y2ggbXMtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogYWRtaW5Nb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9zY3JpcHQ+XHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwibWFuYWdlLWFjY2Vzcy10ZW1wbGF0ZVwiPlxyXG4gICAgPGg1PjxzcGFuIGNsYXNzPVwiZmEgZmEta2V5XCI+PC9zcGFuPk1hbmFnZSBBY2Nlc3M8L2g1PlxyXG4gICAgPGRpdiBjbGFzcz1cInBhbmVsIHBhbmVsLWRlZmF1bHQgcGFuZWwtYm9keVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDIwcHg7XCI+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtMyBjb2wtc20tMyBjb250cm9sLWxhYmVsXCI+Q2xpZW50IElkIHRvIFJlc3RyaWN0IEFjY2VzczwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMyBjb2wtc20tM1wiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sIHRleHQtYm94IHNpbmdsZS1saW5lXCIgdHlwZT1cInRleHRcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogY2xpZW50SWRcIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMSBjb2wtc20tMVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1icy10b2dnbGU9XCJ0b29sdGlwXCIgZGF0YS1wbGFjZW1lbnQ9XCJyaWdodFwiIGNsYXNzPVwiZmEgZmEtcXVlc3Rpb24tY2lyY2xlIGhlbHB0aXBcIiB0aXRsZT1cIkxlYXZlIGJsYW5rIHRvIGdpdmUgYWxsIGNsaWVudHMgYWNjZXNzIChHbG9iYWwgUmVwb3J0cylcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtbGlnaHRidWxiLW8gZmEtMnhcIj48L3NwYW4+Jm5ic3A7VXNlciBsZXZlbCByaWdodHMgb3ZlcnJpZGUgUm9sZSBsZXZlbCByaWdodHMuIE5vIHNlbGVjdGlvbiBmb3IgYSBydWxlIGltcGxpZXMgcmVwb3J0IGlzIGF2YWlsYWJsZSB0byBhbGwuXHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgc21hbGxcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInRvZ2dsZS1pY29uIGZhXCIgZGF0YS1iaW5kPVwiY2xpY2s6IHRvZ2dsZU1hbmFnZVVzZXJzLGNzczogeyAnZmEtY2hldnJvbi1kb3duJzogc2hvd01hbmFnZVVzZXJzKCksICdmYS1jaGV2cm9uLXJpZ2h0JzogIXNob3dNYW5hZ2VVc2VycygpIH1cIj48L2k+IDxiPk1hbmFnZSBieSBVc2VyPC9iPiAoYWxsb3cgZWRpdClcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgY29udGFpbmVyLWZsdWlkXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogc2hvd01hbmFnZVVzZXJzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogZ3JvdXBlZFVzZXJzKCkubGVuZ3RoID4gMCAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IGdyb3VwZWRVc2VycyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktaGVhZGVyXCIgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCkgeyBzaG93KCFzaG93KCkpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgdG9nZ2xlLWljb25cIiBkYXRhLWJpbmQ9XCJjc3M6IHsgJ2ZhLWNoZXZyb24tZG93bic6IHNob3coKSwgJ2ZhLWNoZXZyb24tcmlnaHQnOiAhc2hvdygpIH1cIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmcgZGF0YS1iaW5kPVwidGV4dDogY2F0ZWdvcnlcIj48L3N0cm9uZz5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBjb250YWluZXItZmx1aWRcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBzaG93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogdXNlcnMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsIGxhYmVsLWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IHNlbGVjdGVkXCI+ICZuYnNwOyA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiB0ZXh0XCI+PC9zcGFuPiZuYnNwOyA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBncm91cGVkVXNlcnMoKS5sZW5ndGggPT0gMCAmJiB1c2Vycy5sZW5ndGggPiAwIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogdXNlcnMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsIGxhYmVsLWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogc2VsZWN0ZWRcIj4mbmJzcDs8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiB0ZXh0XCI+PC9zcGFuPiZuYnNwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogZ3JvdXBlZFVzZXJzKCkubGVuZ3RoID09IDAgJiYgdXNlcnMubGVuZ3RoID09IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgVXNlcnMgbGlzdCBub3QgcG9wdWxhdGVkIG9yIG5vdCBhcHBsaWNhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJ0b2dnbGUtaWNvbiBmYVwiIGRhdGEtYmluZD1cImNsaWNrOiB0b2dnbGVWaWV3VXNlcnMsY3NzOiB7ICdmYS1jaGV2cm9uLWRvd24nOiBzaG93Vmlld1VzZXJzKCksICdmYS1jaGV2cm9uLXJpZ2h0JzogIXNob3dWaWV3VXNlcnMoKSB9XCI+PC9pPiA8Yj5WaWV3IG9ubHkgYnkgVXNlcjwvYj4gKG5vIGVkaXQvZGVsZXRlKVxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBjb250YWluZXItZmx1aWRcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBzaG93Vmlld1VzZXJzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogZ3JvdXBlZFZpZXdPbmx5VXNlcnMoKS5sZW5ndGggPiAwIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogZ3JvdXBlZFZpZXdPbmx5VXNlcnMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LWhlYWRlclwiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpIHsgc2hvdyghc2hvdygpKTsgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIHRvZ2dsZS1pY29uXCIgZGF0YS1iaW5kPVwiY3NzOiB7ICdmYS1jaGV2cm9uLWRvd24nOiBzaG93KCksICdmYS1jaGV2cm9uLXJpZ2h0JzogIXNob3coKSB9XCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nIGRhdGEtYmluZD1cInRleHQ6IGNhdGVnb3J5XCI+PC9zdHJvbmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgY29udGFpbmVyLWZsdWlkXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogc2hvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IHZpZXdPbmx5VXNlcnMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsIGxhYmVsLWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IHNlbGVjdGVkXCI+ICZuYnNwOyA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiB0ZXh0XCI+PC9zcGFuPiZuYnNwOyA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBncm91cGVkVmlld09ubHlVc2VycygpLmxlbmd0aCA9PSAwICYmIHZpZXdPbmx5VXNlcnMubGVuZ3RoID4gMCAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IHZpZXdPbmx5VXNlcnMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsIGxhYmVsLWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogc2VsZWN0ZWRcIj4mbmJzcDs8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiB0ZXh0XCI+PC9zcGFuPiZuYnNwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogZ3JvdXBlZFZpZXdPbmx5VXNlcnMoKS5sZW5ndGggPT0gMCAmJiB1c2Vycy5sZW5ndGggPT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBVc2VycyBsaXN0IG5vdCBwb3B1bGF0ZWQgb3Igbm90IGFwcGxpY2FibGVcclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmbm90OiBpc0Rhc2hib2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwidG9nZ2xlLWljb24gZmFcIiBkYXRhLWJpbmQ9XCJjbGljazogdG9nZ2xlRGVsZXRlVXNlcnMsY3NzOiB7ICdmYS1jaGV2cm9uLWRvd24nOiBzaG93RGVsZXRlVXNlcnMoKSwgJ2ZhLWNoZXZyb24tcmlnaHQnOiAhc2hvd0RlbGV0ZVVzZXJzKCkgfVwiPjwvaT48Yj5EZWxldGUgYnkgVXNlcjwvYj4gKGFsbG93IGRlbGV0ZSlcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGNvbnRhaW5lci1mbHVpZFwiIGRhdGEtYmluZD1cInZpc2libGU6IHNob3dEZWxldGVVc2Vyc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6IGdyb3VwZWREZWxldGVPbmx5VXNlcnMoKS5sZW5ndGggPiAwIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogZ3JvdXBlZERlbGV0ZU9ubHlVc2VycyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktaGVhZGVyXCIgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCkgeyBzaG93KCFzaG93KCkpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgdG9nZ2xlLWljb25cIiBkYXRhLWJpbmQ9XCJjc3M6IHsgJ2ZhLWNoZXZyb24tZG93bic6IHNob3coKSwgJ2ZhLWNoZXZyb24tcmlnaHQnOiAhc2hvdygpIH1cIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmcgZGF0YS1iaW5kPVwidGV4dDogY2F0ZWdvcnlcIj48L3N0cm9uZz5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBjb250YWluZXItZmx1aWRcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBzaG93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogZGVsZXRlT25seVVzZXJzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbCBsYWJlbC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBzZWxlY3RlZFwiPiAmbmJzcDsgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogdGV4dFwiPjwvc3Bhbj4mbmJzcDsgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogZ3JvdXBlZERlbGV0ZU9ubHlVc2VycygpLmxlbmd0aCA9PSAwICYmIGRlbGV0ZU9ubHlVc2Vycy5sZW5ndGggPiAwIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogZGVsZXRlT25seVVzZXJzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbCBsYWJlbC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBzZWxlY3RlZFwiPiZuYnNwOzxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHRleHRcIj48L3NwYW4+Jm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBncm91cGVkRGVsZXRlT25seVVzZXJzKCkubGVuZ3RoID09IDAgJiYgIHVzZXJzLmxlbmd0aCA9PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VycyBsaXN0IG5vdCBwb3B1bGF0ZWQgb3Igbm90IGFwcGxpY2FibGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJ0b2dnbGUtaWNvbiBmYVwiIGRhdGEtYmluZD1cImNsaWNrOiB0b2dnbGVNYW5hZ2VSb2xlcyxjc3M6IHsgJ2ZhLWNoZXZyb24tZG93bic6IHNob3dNYW5hZ2VSb2xlcygpLCAnZmEtY2hldnJvbi1yaWdodCc6ICFzaG93TWFuYWdlUm9sZXMoKSB9XCI+PC9pPjxiPk1hbmFnZSBieSBVc2VyIFJvbGU8L2I+IChhbGxvdyBlZGl0KVxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBjb250YWluZXItZmx1aWRcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBzaG93TWFuYWdlUm9sZXNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IHVzZXJSb2xlcyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwgbGFiZWwtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBzZWxlY3RlZFwiPiZuYnNwOzxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHRleHRcIj48L3NwYW4+Jm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiB1c2VyUm9sZXMubGVuZ3RoID09IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgVXNlciBSb2xlcyBsaXN0IG5vdCBwb3B1bGF0ZWQgb3Igbm90IGFwcGxpY2FibGVcclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInRvZ2dsZS1pY29uIGZhXCIgZGF0YS1iaW5kPVwiY2xpY2s6IHRvZ2dsZVZpZXdSb2xlcyxjc3M6IHsgJ2ZhLWNoZXZyb24tZG93bic6IHNob3dWaWV3Um9sZXMoKSwgJ2ZhLWNoZXZyb24tcmlnaHQnOiAhc2hvd1ZpZXdSb2xlcygpIH1cIj48L2k+PGI+VmlldyBvbmx5IGJ5IFVzZXIgUm9sZTwvYj4gKG5vIGVkaXQvZGVsZXRlKVxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBjb250YWluZXItZmx1aWRcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBzaG93Vmlld1JvbGVzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiB2aWV3T25seVVzZXJSb2xlcyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwgbGFiZWwtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBzZWxlY3RlZFwiPiZuYnNwOzxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHRleHRcIj48L3NwYW4+Jm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiB1c2VyUm9sZXMubGVuZ3RoID09IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgVXNlciBSb2xlcyBsaXN0IG5vdCBwb3B1bGF0ZWQgb3Igbm90IGFwcGxpY2FibGVcclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZm5vdDogaXNEYXNoYm9hcmRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInRvZ2dsZS1pY29uIGZhXCIgZGF0YS1iaW5kPVwiY2xpY2s6IHRvZ2dsZURlbGV0ZVJvbGVzLGNzczogeyAnZmEtY2hldnJvbi1kb3duJzogc2hvd0RlbGV0ZVJvbGVzKCksICdmYS1jaGV2cm9uLXJpZ2h0JzogIXNob3dEZWxldGVSb2xlcygpIH1cIj48L2k+PGI+RGVsZXRlIGJ5IFVzZXIgUm9sZTwvYj4gKGFsbG93IGRlbGV0ZSlcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGNvbnRhaW5lci1mbHVpZFwiIGRhdGEtYmluZD1cInZpc2libGU6IHNob3dEZWxldGVSb2xlc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IGRlbGV0ZU9ubHlVc2VyUm9sZXMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsIGxhYmVsLWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IHNlbGVjdGVkXCI+Jm5ic3A7PHNwYW4gZGF0YS1iaW5kPVwidGV4dDogdGV4dFwiPjwvc3Bhbj4mbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogdXNlclJvbGVzLmxlbmd0aCA9PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyIFJvbGVzIGxpc3Qgbm90IHBvcHVsYXRlZCBvciBub3QgYXBwbGljYWJsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJmaWx0ZXItZ3JvdXBcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJxdWVyeS1idWlsZGVyIGZvcm0taW5saW5lXCIgZGF0YS1iaW5kPVwiZm9yZWFjaDogRmlsdGVyR3JvdXBzXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJ1bGVzLWdyb3VwLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnVsZXMtZ3JvdXAtaGVhZGVyXCIgZGF0YS1iaW5kPVwiYXR0cjoge3BhcmVudGRpdmlkOiBnZW5lcmF0ZVVuaXF1ZUlkKCl9XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6ICFpc1Jvb3RcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgYnRuLWdyb3VwLXRvZ2dsZSBidG4tZ3JvdXAtc21cIiBkYXRhLWJzLXRvZ2dsZT1cImJ1dHRvbnNcIiByb2xlPVwiZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImJ0biBidG4tbGlnaHQgYWN0aXZlXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDBweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgZGF0YS1iaW5kPVwiYXR0cjogeyBuYW1lOiAnYW5kT3JHcm91cC0nICsgJGVsZW1lbnQuY2xvc2VzdCgnLnJ1bGVzLWdyb3VwLWhlYWRlcicpLmdldEF0dHJpYnV0ZSgncGFyZW50ZGl2aWQnKSB9LCBjaGVja2VkOiBBbmRPclwiIHZhbHVlPVwiQW5kXCIgLz4gQW5kXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBhY3RpdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgZGF0YS1iaW5kPVwiYXR0cjogeyBuYW1lOiAnYW5kT3JHcm91cC0nICsgJGVsZW1lbnQuY2xvc2VzdCgnLnJ1bGVzLWdyb3VwLWhlYWRlcicpLmdldEF0dHJpYnV0ZSgncGFyZW50ZGl2aWQnKSB9LCBjaGVja2VkOiBBbmRPclwiIHZhbHVlPVwiT3JcIiAvPiBPclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiAkcGFyZW50LlJlbW92ZUZpbHRlckdyb3VwLCB2aXNpYmxlOiAhaXNSb290XCI+UmVtb3ZlIEdyb3VwPC9idXR0b24+Jm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogaXNSb290XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdCBwYWRkZWQtZGl2XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4gJm5ic3A7RmlsdGVyIENvbmRpdGlvbnM8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xlYXJmaXhcIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnVsZXMtZ3JvdXAtYm9keVwiIGRhdGEtYmluZD1cInRlbXBsYXRlOiB7bmFtZTogJ2ZpbHRlci1pbm5lcid9XCI+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9zY3JpcHQ+XHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwiZmx5LWZpbHRlci10ZW1wbGF0ZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhcmRcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBGbHlGaWx0ZXJzKCkubGVuZ3RoPjAgfHwgRG9udEV4ZWN1dGVPblJ1blwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlclwiPlxyXG4gICAgICAgICAgICA8YSBkYXRhLWJzLXRvZ2dsZT1cImNvbGxhcHNlXCIgZGF0YS1iaW5kPVwiYXR0cjogeydkYXRhLWJzLXRhcmdldCc6ICcjZmlsdGVyLXBhbmVsLScgKyBSZXBvcnRJRCgpIH1cIiBocmVmPVwiI1wiPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1maWx0ZXJcIj48L2k+IENob29zZSBGaWx0ZXJzXHJcbiAgICAgICAgICAgIDwvYT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImF0dHI6IHtpZDogJ2ZpbHRlci1wYW5lbC0nICsgUmVwb3J0SUQoKSB9LCBjc3M6IHtjb2xscGFzZWQ6ICFEb250RXhlY3V0ZU9uUnVuKCksIGNvbGxhcHNlOiAhRG9udEV4ZWN1dGVPblJ1bigpfVwiIGNsYXNzPVwiY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IEZseUZpbHRlcnMgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS01IGNvbC14cy00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogRmllbGRcIiBjbGFzcz1cImNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiB0aXRsZT1cIkFwcGx5IHRoaXMgZmlsdGVyXCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogJHBhcmVudC5BcHBseSwgZGlzYWJsZWQ6IGZvcmNlZFwiIC8+IDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHNlbGVjdGVkRmlsdGVyTmFtZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogRmllbGRcIiBjbGFzcz1cImNvbC1zbS0yIGNvbC14cy0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCIgZGF0YS1iaW5kPVwiaWY6ICRwYXJlbnQuQXBwbHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGRhdGEtYmluZD1cIm9wdGlvbnM6IGZpZWxkRmlsdGVyLCB2YWx1ZTogJHBhcmVudC5PcGVyYXRvclwiIHJlcXVpcmVkPjwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cIndpdGg6IEZpZWxkXCIgY2xhc3M9XCJjb2wtc20tNSBjb2wteHMtNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiAkcGFyZW50LkFwcGx5XCIgZGF0YS1wYXJlbnRwcmVmaXg9XCJGXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ3JlcG9ydC1maWx0ZXInLCBkYXRhOiAkZGF0YVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IEV4ZWN1dGVSZXBvcnRcIj5SdW48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9zY3JpcHQ+XHJcblxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cImZpbHRlci1pbm5lclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInJ1bGVzLWxpc3RcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicnVsZS1jb250YWluZXJcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBGaWx0ZXJzKCkubGVuZ3RoPjBcIj5cclxuICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtc3RyaXBlZCB0YWJsZS1ob3ZlciB0YWJsZS1ib3JkZXJsZXNzXCI+XHJcbiAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+RmllbGQ8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMlwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+RmlsdGVyPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTFcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgICAgIDx0Ym9keSBkYXRhLWJpbmQ9XCJmb3JlYWNoOiBGaWx0ZXJzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwicnVsZS1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGRhdGEtYmluZD1cInZhbHVlOiBBbmRPciwgdmlzaWJsZTogJGluZGV4KCk+MFwiIGNsYXNzPVwiZm9ybS1zZWxlY3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj5BbmQ8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj5Pcjwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiIGRhdGEtYmluZD1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogJHBhcmVudHNbJHBhcmVudHMubGVuZ3RoLTJdLnNlbGVjdGVkRmllbGRzQ2FuRmlsdGVyICE9IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAkcGFyZW50c1skcGFyZW50cy5sZW5ndGgtMl0uc2VsZWN0ZWRGaWVsZHNDYW5GaWx0ZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJHBhcmVudHNbJHBhcmVudHMubGVuZ3RoLTFdLnNlbGVjdGVkRmllbGRzQ2FuRmlsdGVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1RleHQ6ICdzZWxlY3RlZEZpZWxkTmFtZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zQ2FwdGlvbjogJ1BsZWFzZSBDaG9vc2UnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IEZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cjoge3JlcXVpcmVkOiBGaWVsZCgpPT1udWxsPydyZXF1aXJlZCc6ZmFsc2V9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZTogRmllbGQoKSAmJiBGaWVsZCgpLmZvcmNlZFwiPjwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cIndpdGg6IEZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiIGRhdGEtYmluZD1cIm9wdGlvbnM6IGZpZWxkRmlsdGVyLCB2YWx1ZTogJHBhcmVudC5PcGVyYXRvclwiIHJlcXVpcmVkPjwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ3aXRoOiBGaWVsZFwiIGRhdGEtcGFyZW50cHJlZml4PVwiTVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAncmVwb3J0LWZpbHRlcicsIGRhdGE6ICRkYXRhXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogRmllbGQoKSAmJiBGaWVsZCgpLmZpZWxkVHlwZSA9PSAnRGF0ZVRpbWUnICYmIE9wZXJhdG9yKCkgPT0gJ3JhbmdlJyAmJiAkaW5kZXgoKT09MCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiAkcGFyZW50c1skcGFyZW50cy5sZW5ndGgtMl0uY2FuQWRkU2VyaWVzICE9IHVuZGVmaW5lZCAmJiAkcGFyZW50c1skcGFyZW50cy5sZW5ndGgtMl0uY2FuQWRkU2VyaWVzKCkgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiAkcGFyZW50c1skcGFyZW50cy5sZW5ndGgtMl0uQWRkU2VyaWVzLmJpbmQoJGRhdGEpXCI+QWRkIENvbXBhcmlzb248L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6ICRwYXJlbnRzWyRwYXJlbnRzLmxlbmd0aC0yXS5jYW5BZGRTZXJpZXMgPT0gdW5kZWZpbmVkICYmICRwYXJlbnRDb250ZXh0LiRwYXJlbnQuY2FuQWRkU2VyaWVzICE9IHVuZGVmaW5lZCAmJiAkcGFyZW50Q29udGV4dC4kcGFyZW50LmNhbkFkZFNlcmllcygpLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiAkcGFyZW50Q29udGV4dC4kcGFyZW50LkFkZFNlcmllcy5iaW5kKCRkYXRhKVwiPkFkZCBDb21wYXJpc29uPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLS9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInZpc2libGU6IEZpZWxkKCkgJiYgRmllbGQoKS5mb3JjZWRcIiBjbGFzcz1cImJhZGdlIGJnLWluZm9cIj5SZXF1aXJlZCBGaWx0ZXI8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiIHN0eWxlPVwiZmxleC1ncm93OiAxO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiAkcGFyZW50LlJlbW92ZUZpbHRlciwgaGlkZGVuOiBGaWVsZCgpICYmIEZpZWxkKCkuZm9yY2VkXCIgdGl0bGU9XCJSZW1vdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXRyYXNoXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiIHN0eWxlPVwiZmxleC1ncm93OiAxO1wiIGRhdGEtYmluZD1cIndpdGg6IEZpZWxkLCBoaWRkZW46IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNmaWx0ZXItcGFuZWwuY2FyZC1ib2R5LmNvbGxhcHNlJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnRuIGJ0bi1zbVwiIHRhYmluZGV4PVwiMFwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyBmaWx0ZXJPbkZseSghZmlsdGVyT25GbHkoKSk7IH0sIGNzczogeydidG4tc3VjY2Vzcyc6IGZpbHRlck9uRmx5KCk9PXRydWUsICdidG4tc2Vjb25kYXJ5JzogZmlsdGVyT25GbHkoKT09ZmFsc2V9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1maWx0ZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIiB0aXRsZT1cIkZpbHRlciBvbiBSZXBvcnRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiBjb21wYXJlVG8gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPiZuYnNwOzwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJ0ZXh0LWFsaWduOiByaWdodFwiPjxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtXCIgZGF0YS1iaW5kPVwiY2xpY2s6ICRwYXJlbnRzWzJdLlJlbW92ZVNlcmllc1wiPjxzcGFuIGNsYXNzPVwiZmEgZmEtdHJhc2gtb1wiPjwvc3Bhbj48L2J1dHRvbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtdXRlZFwiPkNvbXBhcmUgdG88L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGRhdGEtYmluZD1cIm9wdGlvbnM6IFJhbmdlLCB2YWx1ZTogVmFsdWVcIiByZXF1aXJlZD48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicnVsZS1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZToge25hbWU6ICdmaWx0ZXItZ3JvdXAnfVwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IEFkZEZpbHRlclwiPkFkZCBGaWx0ZXI8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiBBZGRGaWx0ZXJHcm91cFwiPkFkZCBGaWx0ZXIgR3JvdXA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbjwvc2NyaXB0PlxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJmaWx0ZXItcGFyYW1ldGVyc1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIj5cclxuICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJoaWRkZW46IHNob3dQYXJhbWV0ZXJzXCI+Tm8gZmlsdGVycyBhdmFpbGFibGUgdG8gY2hvb3NlPC9zcGFuPlxyXG4gICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLXN0cmlwZWQgdGFibGUtaG92ZXIgdGFibGUtYm9yZGVybGVzc1wiIGRhdGEtYmluZD1cInZpc2libGU6IHNob3dQYXJhbWV0ZXJzXCI+XHJcbiAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMzAlXCI+RmlsdGVyPC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMjAlXCI+PC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMzAlXCI+VmFsdWU8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD48L3RoPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgPHRib2R5IGRhdGEtYmluZD1cImZvcmVhY2g6IFBhcmFtZXRlcnNcIj5cclxuICAgICAgICAgICAgICAgIDx0ciBkYXRhLWJpbmQ9XCJpZm5vdDogSGlkZGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtYmluZD1cInRleHQ6IERpc3BsYXlOYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiIGRhdGEtYmluZD1cIm9wdGlvbnM6IG9wZXJhdG9ycywgdmFsdWU6IE9wZXJhdG9yXCIgcmVxdWlyZWQ+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtYmluZD1cIndpdGg6IEZpZWxkXCIgZGF0YS1wYXJlbnRwcmVmaXg9XCJQXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdyZXBvcnQtZmlsdGVyJywgZGF0YTogJGRhdGFcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuXHJcbiAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgPC90YWJsZT5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwicmVwb3J0LXNjaGVkdWxlXCI+XHJcbiAgICA8ZGl2IGRhdGEtYmluZD1cIndpdGg6IHNjaGVkdWxlQnVpbGRlclwiIGlkPVwic2NoZWR1bGUtYnVpbGRlci1kaXZcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiPlxyXG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogaGFzU2NoZWR1bGVcIiBpZD1cInNjaGVkdWxlUmVwb3J0Q2hlY2tib3hcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cInNjaGVkdWxlUmVwb3J0Q2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgIFNldCBTY2hlZHVsZSB0byBzZW5kIGJ5IEVtYWlsXHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogaGFzU2NoZWR1bGVcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZS0zIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBzZWxlY3RlZE9wdGlvbigpICE9ICdvbmNlJyA/ICdFdmVyeSAnIDogJydcIj48L3NwYW4+Jm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgcmVxdWlyZWQgZGF0YS1iaW5kPVwib3B0aW9uczogb3B0aW9ucywgdmFsdWU6IHNlbGVjdGVkT3B0aW9uXCIgc3R5bGU9XCJtaW4td2lkdGg6IDgwcHg7XCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IHNlbGVjdGVkT3B0aW9uKCkgPT0gJ29uY2UnXCIgY2xhc3M9XCJtZS0zIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAmbmJzcDtvbiZuYnNwOzxpbnB1dCBkYXRhLWJpbmQ9XCJkYXRlcGlja2VyOiBzZWxlY3RlZERhdGUsIGRhdGVwaWNrZXJPcHRpb25zOiB7dmFsdWU6IHNlbGVjdGVkRGF0ZX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogc2hvd0RheXNcIiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7b24mbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBtdWx0aXBsZSBjbGFzcz1cImZvcm0tc2VsZWN0IG1zLTJcIiByZXF1aXJlZCBkYXRhLWJpbmQ9XCJzZWxlY3QyOiB7IHBsYWNlaG9sZGVyOiAnQ2hvb3NlIERheXMnLCBhbGxvd0NsZWFyOiB0cnVlIH0sIG9wdGlvbnM6IGRheXMsIHNlbGVjdGVkT3B0aW9uczogc2VsZWN0ZWREYXlzXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogc2hvd0RhdGVzXCIgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwO29uJm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgbXVsdGlwbGUgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIHJlcXVpcmVkIGRhdGEtYmluZD1cInNlbGVjdDI6IHsgcGxhY2Vob2xkZXI6ICdDaG9vc2UgRGF0ZXMnLCBhbGxvd0NsZWFyOiB0cnVlIH0sIG9wdGlvbnM6IGRhdGVzLCBzZWxlY3RlZE9wdGlvbnM6IHNlbGVjdGVkRGF0ZXNcIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBzaG93TW9udGhzXCIgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwO29uJm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgbXVsdGlwbGUgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIHJlcXVpcmVkIGRhdGEtYmluZD1cInNlbGVjdDI6IHsgcGxhY2Vob2xkZXI6ICdDaG9vc2UgTW9udGhzJywgYWxsb3dDbGVhcjogdHJ1ZSB9LCBvcHRpb25zOiBtb250aHMsIHNlbGVjdGVkT3B0aW9uczogc2VsZWN0ZWRNb250aHNcIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBzaG93QXRUaW1lXCIgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG1zLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7YXQmbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IG1lLTJcIiBzdHlsZT1cIm1pbi13aWR0aDogNjBweDtcIiBkYXRhLWJpbmQ9XCJvcHRpb25zOiBob3VycywgdmFsdWU6IHNlbGVjdGVkSG91clwiPjwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgbWUtMlwiIHN0eWxlPVwibWluLXdpZHRoOiA2MHB4O1wiIGRhdGEtYmluZD1cIm9wdGlvbnM6IG1pbnV0ZXMsIHZhbHVlOiBzZWxlY3RlZE1pbnV0ZVwiPjwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBzdHlsZT1cIm1pbi13aWR0aDogODBweDtcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogc2VsZWN0ZWRBbVBtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPkFNPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPlBNPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm9cIj5cclxuICAgICAgICAgICAgICAgIFJlcG9ydCB3aWxsIGJlIHJ1biBhbmQgZW1haWxlZCA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBzZWxlY3RlZE9wdGlvbigpICE9ICdvbmNlJyA/ICdldmVyeScgOiAnJ1wiPjwvc3Bhbj4gPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogc2VsZWN0ZWRPcHRpb25cIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJpZjogc2VsZWN0ZWRPcHRpb24oKSA9PSAnb25jZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICBvbiA8c3BhbiBjbGFzcz1cImVycm9yXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogIXNlbGVjdGVkRGF0ZSgpXCI+UGxlYXNlIHBpY2sgYSBEYXRlPC9zcGFuPiA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBzZWxlY3RlZERhdGVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJpZjogc2hvd0RheXNcIj5cclxuICAgICAgICAgICAgICAgICAgICBvbiA8c3BhbiBjbGFzcz1cImVycm9yXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogc2VsZWN0ZWREYXlzKCkubGVuZ3RoID09IDBcIj5QbGVhc2UgcGljayBEYXkocyk8L3NwYW4+IDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHNlbGVjdGVkRGF5c1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cImlmOiBzaG93RGF0ZXNcIj5cclxuICAgICAgICAgICAgICAgICAgICBvbiA8c3BhbiBjbGFzcz1cImVycm9yXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogc2VsZWN0ZWREYXRlcygpLmxlbmd0aCA9PSAwXCI+UGxlYXNlIHBpY2sgRGF0ZShzKTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJmb3JlYWNoOiBzZWxlY3RlZERhdGVzXCI+PHNwYW4gZGF0YS1iaW5kPVwidmlzaWJsZTogJGluZGV4KCk+MFwiPiwgPC9zcGFuPjxzcGFuIGRhdGEtYmluZD1cInRleHQ6ICRkYXRhID09IDEgPyAnMXN0JzogKCRkYXRhID09IDIgPyAnMm5kJyA6ICgkZGF0YSA9PSAzID8gJzNyZCcgOiAoJGRhdGEgPT0gMzEgPyAnMzFzdCcgOiAkZGF0YSsndGgnKSkpXCI+PC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cImlmOiBzaG93TW9udGhzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgb2YgPHNwYW4gY2xhc3M9XCJlcnJvclwiIGRhdGEtYmluZD1cInZpc2libGU6IHNlbGVjdGVkTW9udGhzKCkubGVuZ3RoID09IDBcIj5QbGVhc2UgcGljayBNb250aChzKTwvc3Bhbj4gPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogc2VsZWN0ZWRNb250aHNcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJpZjogc2hvd0F0VGltZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIGF0IDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHNlbGVjdGVkSG91clwiPjwvc3Bhbj46PHNwYW4gZGF0YS1iaW5kPVwidGV4dDogc2VsZWN0ZWRNaW51dGVcIj48L3NwYW4+IDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHNlbGVjdGVkQW1QbVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGctM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsXCI+RW1haWwgdG88L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGRhdGEtYmluZD1cInZhbHVlOiBlbWFpbFRvXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBFbWFpbCBBZGRyZXNzZXMgc2VwYXJhdGVkIGJ5IGNvbW1hIHRvIHNlbmQgdGhlIFJlcG9ydCB0b1wiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTEgY29sLWZvcm0tbGFiZWxcIj5Gb3JtYXQ8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogZm9ybWF0LGV2ZW50OiB7IGNoYW5nZTogb25Gb3JtYXRDaGFuZ2UgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkVYQ0VMXCI+RXhjZWw8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGF0YS1iaW5kPVwidmlzaWJsZTogJHBhcmVudC5jYW5EcmlsbGRvd24gJiYgJHBhcmVudC5jYW5EcmlsbGRvd24oKVwiIHZhbHVlPVwiRVhDRUwtU1VCXCI+RXhjZWwgKEV4cGFuZGVkKTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkNTVlwiPkNTVjwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlBERlwiPlBERjwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIldPUkRcIj5Xb3JkPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiTElOS1wiPkxpbms8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGctM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsXCI+UGljayBUaW1lIFpvbmU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBkYXRhLWJpbmQ9XCJvcHRpb25zOiB0aW1lem9uT3B0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVGV4dDogJ2Rpc3BsYXlOYW1lJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1ZhbHVlOiAndGltZVpvbmVJZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZWxlY3RlZFRpbWV6b25lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QyOiB7ZHJvcGRvd25QYXJlbnQ6ICQoJyNzY2hlZHVsZS1idWlsZGVyLWRpdicpLCBhbGxvd0NsZWFyOiB0cnVlLCBwbGFjZWhvbGRlcjogJ1NldCBhIHRpbWUgem9uZSB0byBzZW5kIHJlcG9ydCd9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBnLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2tcIiB0aXRsZT1cIlNldCBhIGRhdGUgdG8gc3RhcnQgc2VuZGluZyBzY2hlZHVsZWQgcmVwb3J0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogaGFzU2NoZWR1bGVTdGFydFwiIGlkPVwic2NoZWR1bGVTdGFydENoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwic2NoZWR1bGVTdGFydENoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZWR1bGUgU3RhcnQgRGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS00XCIgZGF0YS1iaW5kPVwiaWY6IGhhc1NjaGVkdWxlU3RhcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBkYXRhLWJpbmQ9XCJkYXRlcGlja2VyOiBzY2hlZHVsZVN0YXJ0LCBkYXRlcGlja2VyT3B0aW9uczoge3ZhbHVlOiBzY2hlZHVsZVN0YXJ0fVwiIHRpdGxlPVwiU2NoZWR1bGVkIFJlcG9ydCB3aWxsIG5vdCBiZSBzZW50IGJlZm9yZSB0aGlzIGRhdGVcIiByZXF1aXJlZCAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBnLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2tcIiB0aXRsZT1cIlNldCBhIGRhdGUgdG8gc3RvcCBzZW5kaW5nIHNjaGVkdWxlZCByZXBvcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBoYXNTY2hlZHVsZUVuZFwiIGlkPVwic2NoZWR1bGVFbmRDaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cInNjaGVkdWxlRW5kQ2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlZHVsZSBFbmQgRGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS00XCIgZGF0YS1iaW5kPVwiaWY6IGhhc1NjaGVkdWxlRW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZGF0YS1iaW5kPVwiZGF0ZXBpY2tlcjogc2NoZWR1bGVFbmQsIGRhdGVwaWNrZXJPcHRpb25zOiB7dmFsdWU6IHNjaGVkdWxlRW5kfVwiIHRpdGxlPVwiU2NoZWR1bGVkIFJlcG9ydCB3aWxsIG5vdCBiZSBzZW50IGFmdGVyIHRoaXMgZGF0ZVwiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcblxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwicmVwb3J0LWZpZWxkLW9wdGlvbnNcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2dcIiBzdHlsZT1cIm1heC13aWR0aDogNzUwcHg7XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIiBkYXRhLWJpbmQ9XCJ3aXRoOiBlZGl0RmllbGRPcHRpb25zXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+PHNwYW4gZGF0YS1iaW5kPVwidGV4dDogZmllbGROYW1lXCI+PC9zcGFuPiAtIFNldHVwIEFkZGl0aW9uYWwgRmllbGQgT3B0aW9uczwvaDU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBuZWVkcy12YWxpZGF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Yj5Db2x1bW4gRm9ybWF0IFNldHRpbmdzPC9iPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNSBjb2wtbWQtNSBjb250cm9sLWxhYmVsXCI+UGljayBEYXRhIEZvcm1hdDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNyBjb2wtbWQtN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgZGF0YS1iaW5kPVwib3B0aW9uczogWydEYXlzJywgJ0hvdXJzJywgJ01pbnV0ZXMnLCAnU2Vjb25kcyddLmluZGV4T2YoZmllbGRGb3JtYXQoKSkgPj0gMCA/IFsnRGF5cycsICdIb3VycycsICdNaW51dGVzJywgJ1NlY29uZHMnXSA6ICRwYXJlbnRzWzFdLmZpZWxkRm9ybWF0VHlwZXMsIHZhbHVlOiBmaWVsZEZvcm1hdFwiPjwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcGFyZW50c1sxXS5kZWNpbWFsRm9ybWF0VHlwZXMuaW5kZXhPZigkZGF0YS5maWVsZEZvcm1hdCgpKT49MFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNSBjb2wtbWQtNSBjb250cm9sLWxhYmVsXCI+UGljayBEZWNpbWFsIFBsYWNlczwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNyBjb2wtbWQtN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGRhdGEtYmluZD1cInZhbHVlOiBkZWNpbWFsUGxhY2VzXCIgcGxhY2Vob2xkZXI9XCJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBmaWVsZEZvcm1hdCgpPT0nQ3VycmVuY3knXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS01IGNvbC1tZC01IGNvbnRyb2wtbGFiZWxcIj5QaWNrIEN1cnJlbmN5IEZvcm1hdDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNyBjb2wtbWQtN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgcmVxdWlyZWQgZGF0YS1iaW5kPVwib3B0aW9uczogJHBhcmVudHNbMV0uY3VycmVuY3lGb3JtYXRzLCBvcHRpb25zVGV4dDogJ2Rpc3BsYXknLG9wdGlvbnNWYWx1ZTogJ3ZhbHVlJywgdmFsdWU6IGN1cnJlbmN5Rm9ybWF0XCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiIGRhdGEtYmluZD1cInZpc2libGU6IGZpZWxkRm9ybWF0KCk9PSdEYXRlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNSBjb2wtbWQtNSBjb250cm9sLWxhYmVsXCI+UGljayBEYXRlIEZvcm1hdDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNyBjb2wtbWQtN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgZGF0YS1iaW5kPVwib3B0aW9uczogJHBhcmVudHNbMV0uZGF0ZUZvcm1hdHMsIHZhbHVlOiBkYXRlRm9ybWF0XCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiIGRhdGEtYmluZD1cInZpc2libGU6c2VsZWN0ZWRBZ2dyZWdhdGUoKT09J1Bpdm90JyAmJiBmaWVsZEZvcm1hdCgpPT0nRGF0ZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTUgY29sLW1kLTUgY29udHJvbC1sYWJlbFwiPlBpdm90IERyaWxsZG93biBEYXRlIEZvcm1hdDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNyBjb2wtbWQtN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgZGF0YS1iaW5kPVwib3B0aW9uczogWycnLCAnRGF5JywgJ01vbnRoJywgJ1llYXInLCAnTW9udGgvWWVhciddLCB2YWx1ZTogZHJpbGxEYXRhRm9ybWF0XCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBmaWVsZEZvcm1hdCgpPT0nRGF0ZScgJiYgZGF0ZUZvcm1hdCgpPT09J0N1c3RvbSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTUgY29sLW1kLTUgY29udHJvbC1sYWJlbFwiPkVudGVyIEN1c3RvbSBEYXRlIEZvcm1hdDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNyBjb2wtbWQtN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogY3VzdG9tRGF0ZUZvcm1hdFwiIHBsYWNlaG9sZGVyPVwiZGQvbW0veXl5eVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNSBjb2wtbWQtNSBjb250cm9sLWxhYmVsXCI+Q2hvb3NlIENvbHVtbiBMYWJlbDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNyBjb2wtbWQtN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogZmllbGRMYWJlbFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNSBjb2wtbWQtNSBjb250cm9sLWxhYmVsXCI+SW5uZXIgQ29sdW1uIExhYmVsPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS03IGNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGRhdGEtYmluZD1cInZhbHVlOiBmaWVsZExhYmVsMlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNSBjb2wtbWQtNSBjb250cm9sLWxhYmVsXCI+Q2hvb3NlIFRleHQgQWxpZ25tZW50PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS03IGNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBkYXRhLWJpbmQ9XCJvcHRpb25zOiAkcGFyZW50c1sxXS5maWVsZEFsaWdubWVudHMsIHZhbHVlOiBmaWVsZEFsaWduXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNSBjb2wtbWQtNSBjb250cm9sLWxhYmVsXCI+Q2hvb3NlIFdpZHRoIChsZWF2ZSBibGFuayBmb3IgYXV0byk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTcgY29sLW1kLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZGF0YS1iaW5kPVwidmFsdWU6IGZpZWxkV2lkdGhcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3cgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtYXV0b1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGI+SGVhZGVyIFNldHRpbmdzPC9iPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UGljayBUZXh0IENvbG9yPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBzdHlsZT1cIndpZHRoOiA1MHB4OyBoZWlnaHQ6IDM4cHg7XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWUtMlwiIGRhdGEtYmluZD1cInZhbHVlOiBoZWFkZXJGb250Q29sb3JcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBzdHlsZT1cIndpZHRoOiAxMDBweFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIG1lLTJcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogaGVhZGVyRm9udENvbG9yXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiIHRpdGxlPVwiQXBwbHkgdG8gYWxsIGNvbHVtbnNcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXthcHBseUFsbEhlYWRlckZvbnRDb2xvcighYXBwbHlBbGxIZWFkZXJGb250Q29sb3IoKSk7IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmFcIiBkYXRhLWJpbmQ9XCJjc3M6IGFwcGx5QWxsSGVhZGVyRm9udENvbG9yKCkgPyAnZmEtY2hlY2snIDogJ2ZhLXBhc3RlJ1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlBpY2sgQmFja2dyb3VuZCBDb2xvcjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgc3R5bGU9XCJ3aWR0aDogNTBweDsgaGVpZ2h0OiAzOHB4O1wiIGNsYXNzPVwiZm9ybS1jb250cm9sIG1lLTJcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogaGVhZGVyQmFja0NvbG9yXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgc3R5bGU9XCJ3aWR0aDogMTAwcHhcIiBjbGFzcz1cImZvcm0tY29udHJvbCBtZS0yXCIgZGF0YS1iaW5kPVwidmFsdWU6IGhlYWRlckJhY2tDb2xvclwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIiB0aXRsZT1cIkFwcGx5IHRvIGFsbCBjb2x1bW5zXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7YXBwbHlBbGxIZWFkZXJCYWNrQ29sb3IoIWFwcGx5QWxsSGVhZGVyQmFja0NvbG9yKCkpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhXCIgZGF0YS1iaW5kPVwiY3NzOiBhcHBseUFsbEhlYWRlckJhY2tDb2xvcigpID8gJ2ZhLWNoZWNrJyA6ICdmYS1wYXN0ZSdcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIG1lLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogaGVhZGVyRm9udEJvbGRcIiBpZD1cImhlYWRlckZvbnRCb2xkQ2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwiaGVhZGVyRm9udEJvbGRDaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb2xkIFRleHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCIgdGl0bGU9XCJBcHBseSB0byBhbGwgY29sdW1uc1wiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpe2FwcGx5QWxsSGVhZGVyQm9sZCghYXBwbHlBbGxIZWFkZXJCb2xkKCkpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYVwiIGRhdGEtYmluZD1cImNzczogYXBwbHlBbGxIZWFkZXJCb2xkKCkgPyAnZmEtY2hlY2snIDogJ2ZhLXBhc3RlJ1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3cgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtYXV0b1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGI+VGV4dCBTZXR0aW5nczwvYj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlBpY2sgVGV4dCBDb2xvcjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgc3R5bGU9XCJ3aWR0aDogNTBweDsgaGVpZ2h0OiAzOHB4O1wiIGNsYXNzPVwiZm9ybS1jb250cm9sIG1lLTJcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogZm9udENvbG9yXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgc3R5bGU9XCJ3aWR0aDogMTAwcHg7XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWUtMlwiIGRhdGEtYmluZD1cInZhbHVlOiBmb250Q29sb3JcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCIgdGl0bGU9XCJBcHBseSB0byBhbGwgY29sdW1uc1wiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpe2FwcGx5QWxsRm9udENvbG9yKCFhcHBseUFsbEZvbnRDb2xvcigpKTsgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYVwiIGRhdGEtYmluZD1cImNzczogYXBwbHlBbGxGb250Q29sb3IoKSA/ICdmYS1jaGVjaycgOiAnZmEtcGFzdGUnXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UGljayBCYWNrZ3JvdW5kIENvbG9yPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBzdHlsZT1cIndpZHRoOiA1MHB4OyBoZWlnaHQ6IDM4cHg7XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWUtMlwiIGRhdGEtYmluZD1cInZhbHVlOiBiYWNrQ29sb3JcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBzdHlsZT1cIndpZHRoOiAxMDBweDtcIiBjbGFzcz1cImZvcm0tY29udHJvbCBtZS0yXCIgZGF0YS1iaW5kPVwidmFsdWU6IGJhY2tDb2xvclwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIiB0aXRsZT1cIkFwcGx5IHRvIGFsbCBjb2x1bW5zXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7YXBwbHlBbGxCYWNrQ29sb3IoIWFwcGx5QWxsQmFja0NvbG9yKCkpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhXCIgZGF0YS1iaW5kPVwiY3NzOiBhcHBseUFsbEJhY2tDb2xvcigpID8gJ2ZhLWNoZWNrJyA6ICdmYS1wYXN0ZSdcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIG1lLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogZm9udEJvbGRcIiBpZD1cImZvbnRCb2xkQ2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwiZm9udEJvbGRDaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb2xkIFRleHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCIgdGl0bGU9XCJBcHBseSB0byBhbGwgY29sdW1uc1wiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpe2FwcGx5QWxsQm9sZCghYXBwbHlBbGxCb2xkKCkpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYVwiIGRhdGEtYmluZD1cImNzczogYXBwbHlBbGxCb2xkKCkgPyAnZmEtY2hlY2snIDogJ2ZhLXBhc3RlJ1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhZGRlZC1kaXZcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tcHJpbWFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpIHthZGRDb25kaXRpb25hbEZvcm1hdFNldHRpbmcobnVsbCl9XCI+QWRkIENvbmRpdGlvbmFsIEZvcm1hdHRpbmc8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJmb3JlYWNoOiBmaWVsZENvbmR0aW9uYWxGb3JtYXRzXCIgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDQwcHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtc3RhcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj5Db25kaXRpb25hbCBGb3JtYXQgIzxzcGFuIGRhdGEtYmluZD1cInRleHQ6ICRpbmRleCgpKzFcIj48L3NwYW4+PC9iPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiAkcGFyZW50LnJlbW92ZVNldHRpbmdcIj5SZW1vdmU8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlBpY2sgVGV4dCBDb2xvcjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBzdHlsZT1cIndpZHRoOiA1MHB4OyBoZWlnaHQ6IDM4cHg7XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWUtMlwiIGRhdGEtYmluZD1cInZhbHVlOiBmb250Q29sb3JcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgc3R5bGU9XCJ3aWR0aDogMTAwcHg7XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWUtMlwiIGRhdGEtYmluZD1cInZhbHVlOiBmb250Q29sb3JcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5QaWNrIEJhY2tncm91bmQgQ29sb3I8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgc3R5bGU9XCJ3aWR0aDogNTBweDsgaGVpZ2h0OiAzOHB4O1wiIGNsYXNzPVwiZm9ybS1jb250cm9sIG1lLTJcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogYmFja0NvbG9yXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHN0eWxlPVwid2lkdGg6IDEwMHB4O1wiIGNsYXNzPVwiZm9ybS1jb250cm9sIG1lLTJcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogYmFja0NvbG9yXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIG1lLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IGZvbnRCb2xkXCIgaWQ9XCJmb250Qm9sZENoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJmb250Qm9sZENoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb2xkIFRleHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbS0yXCIgZGF0YS1iaW5kPVwiZm9yZWFjaDogZmlsdGVyLkZpbHRlcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogRmllbGRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgZGF0YS1iaW5kPVwib3B0aW9uczogZmllbGRGaWx0ZXIsIHZhbHVlOiAkcGFyZW50Lk9wZXJhdG9yXCIgcmVxdWlyZWQ+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cIndpdGg6IEZpZWxkXCIgZGF0YS1wYXJlbnRwcmVmaXg9XCJDXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdyZXBvcnQtZmlsdGVyJywgZGF0YTogJGRhdGFcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIiBkYXRhLWJpbmQ9XCJpZjogJHBhcmVudHNbMV0udXNlU3RvcmVkUHJvYygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3ggcHVsbC1sZWZ0XCIgc3R5bGU9XCJwYWRkaW5nLXRvcDogNXB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBjaGVja091dGVyR3JvdXBcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dGVyIEdyb3VwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRhbmdlclwiIGRhdGEtYmluZD1cImNsaWNrOiBjYW5jZWxGaWVsZE9wdGlvbnNcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IHNhdmVGaWVsZE9wdGlvbnNcIj5TYXZlIENoYW5nZXM8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9zY3JpcHQ+XHJcblxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cInJlcG9ydC1saW5rLWVkaXRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2dcIiBzdHlsZT1cIm1heC13aWR0aDogNzUwcHg7XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIiBkYXRhLWJpbmQ9XCJ3aXRoOiBlZGl0TGlua0ZpZWxkXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+U2V0dXAgTGluayBGaWVsZDwvaDU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBuZWVkcy12YWxpZGF0aW9uXCIgZGF0YS1iaW5kPVwid2l0aDogbGlua0ZpZWxkSXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTUgY29sLW1kLTUgY29udHJvbC1sYWJlbFwiPlRoaXMgZmllbGQgd2lsbCBsaW5rIHRvPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTcgY29sLW1kLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgcmVxdWlyZWQgZGF0YS1iaW5kPVwib3B0aW9uczogbGlua1R5cGVzLCB2YWx1ZTogc2VsZWN0ZWRMaW5rVHlwZVwiPjwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBMaW5rc1RvUmVwb3J0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS01IGNvbC1tZC01IGNvbnRyb2wtbGFiZWxcIj5MaW5rIHRvIHRoaXMgUmVwb3J0PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS03IGNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiByZXF1aXJlZCBkYXRhLWJpbmQ9XCJvcHRpb25zOiAkcGFyZW50Q29udGV4dC4kcGFyZW50LlNhdmVkUmVwb3J0cywgb3B0aW9uc1RleHQ6ICdyZXBvcnROYW1lJywgb3B0aW9uc1ZhbHVlOiAncmVwb3J0SWQnLCB2YWx1ZTogTGlua2VkVG9SZXBvcnRJZCwgb3B0aW9uc0NhcHRpb246ICdDaG9vc2UgdGhlIFJlcG9ydCB0byBsaW5rIHRvJ1wiPjwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJpZjogTGlua2VkVG9SZXBvcnRJZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogU2VuZEFzRmlsdGVyUGFyYW1ldGVyXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbmQgZmllbGQgdmFsdWUgYXMgUmVwb3J0IEZpbHRlciBQYXJhbWV0ZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIiBkYXRhLWJpbmQ9XCJpZjogU2VuZEFzRmlsdGVyUGFyYW1ldGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS01IGNvbC1tZC01IGNvbnRyb2wtbGFiZWxcIj5MaW5rIHRvIHRoaXMgUmVwb3J0IEZpbHRlcjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNyBjb2wtbWQtN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgcmVxdWlyZWQgZGF0YS1iaW5kPVwib3B0aW9uczogYWxsRmllbGRzLCBvcHRpb25zVGV4dDogJ2ZpZWxkTmFtZScsIG9wdGlvbnNWYWx1ZTogJ2ZpZWxkSWQnLCB2YWx1ZTogU2VsZWN0ZWRGaWx0ZXJJZCwgb3B0aW9uc0NhcHRpb246ICdDaG9vc2UgdGhlIEZpZWxkIHRvIEZpbHRlciBieSB2YWx1ZSdcIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWZub3Q6IExpbmtzVG9SZXBvcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTUgY29sLW1kLTUgY29udHJvbC1sYWJlbFwiPkxpbmsgdG8gdGhpcyBVUkw8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTcgY29sLW1kLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcmVxdWlyZWQgcGxhY2Vob2xkZXI9XCJFbnRlciBhIHVybCB0byBvcGVuXCIgZGF0YS1iaW5kPVwidmFsdWU6IExpbmtUb1VybFwiIHRpdGxlPVwiVmFsaWQgVVJMIG5lZWRzIHRvIHN0YXJ0IHdpdGggaHR0cDovLyBvciBodHRwczovL1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IFNlbmRBc1F1ZXJ5UGFyYW1ldGVyXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbmQgZmllbGQgdmFsdWUgYXMgUXVlcnkgUGFyYW1ldGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCIgZGF0YS1iaW5kPVwiaWY6IFNlbmRBc1F1ZXJ5UGFyYW1ldGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS01IGNvbC1tZC01IGNvbnRyb2wtbGFiZWxcIj5QYXJhbWV0ZXIgTmFtZSB0byB1c2U8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTcgY29sLW1kLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcmVxdWlyZWQgcGxhY2Vob2xkZXI9XCJFbnRlciBwYXJhbWV0ZXIgbmFtZSB0byBzZW5kIHZhbHVlIGFzXCIgZGF0YS1iaW5kPVwidmFsdWU6IFF1ZXJ5UGFyYW1ldGVyTmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRhbmdlclwiIGRhdGEtYmluZD1cImNsaWNrOiByZW1vdmVMaW5rRmllbGRcIj5SZW1vdmUgTGluazwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogc2F2ZUxpbmtGaWVsZFwiPlNhdmUgQ2hhbmdlczwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwiZGVzaWduZXItY2hvb3NlLXZpc3VhbFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJWaXN1YWxpemF0aW9uIE9wdGlvbnNcIj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyBzZXRSZXBvcnRUeXBlKCdMaXN0Jyk7IH0sIGNzczogeyBhY3RpdmU6IFJlcG9ydFR5cGUoKT09J0xpc3QnIH1cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS0yeCBmYS1saXN0LWFsdFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHA+TGlzdDwvcD5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyBzZXRSZXBvcnRUeXBlKCdTdW1tYXJ5Jyk7IH0sIGNzczogeyBhY3RpdmU6IFJlcG9ydFR5cGUoKT09J1N1bW1hcnknIH1cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS0yeCBmYS10YWJsZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHA+U3VtbWFyeTwvcD5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyBzZXRSZXBvcnRUeXBlKCdCYXInKTsgfSwgY3NzOiB7IGFjdGl2ZTogUmVwb3J0VHlwZSgpPT0nQmFyJyB9XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtMnggZmEtYmFyLWNoYXJ0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8cD5CYXI8L3A+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgc2V0UmVwb3J0VHlwZSgnUGllJyk7IH0sIGNzczogeyBhY3RpdmU6IFJlcG9ydFR5cGUoKT09J1BpZScgfVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLTJ4IGZhLXBpZS1jaGFydFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHA+UGllPC9wPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IHNldFJlcG9ydFR5cGUoJ0xpbmUnKTsgfSwgY3NzOiB7IGFjdGl2ZTogUmVwb3J0VHlwZSgpPT0nTGluZScgfVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLTJ4IGZhLWxpbmUtY2hhcnRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxwPkxpbmU8L3A+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgc2V0UmVwb3J0VHlwZSgnQ29tYm8nKTsgfSwgY3NzOiB7IGFjdGl2ZTogUmVwb3J0VHlwZSgpPT0nQ29tYm8nIH1cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS0yeCBmYS1zaWduYWxcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxwPkNvbWJvPC9wPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IHNldFJlcG9ydFR5cGUoJ0h0bWwnKTsgfSwgY3NzOiB7IGFjdGl2ZTogUmVwb3J0VHlwZSgpPT0nSHRtbCcgfVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLTJ4IGZhLWNvZGVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxwPkN1c3RvbTwvcD5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyBzZXRSZXBvcnRUeXBlKCdNYXAnKTsgfSwgY3NzOiB7IGFjdGl2ZTogUmVwb3J0VHlwZSgpLmluZGV4T2YoJ01hcCcpPT0wIH1cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS0yeCBmYS1nbG9iZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHA+TWFwPC9wPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IHNldFJlcG9ydFR5cGUoJ0hlYXRNYXAnKTsgfSwgY3NzOiB7IGFjdGl2ZTogUmVwb3J0VHlwZSgpLmluZGV4T2YoJ0hlYXRNYXAnKT09MCB9XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtMnggZmEtbWFwXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8cD5IZWF0TWFwPC9wPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IHNldFJlcG9ydFR5cGUoJ1NpbmdsZScpOyB9LCBjc3M6IHsgYWN0aXZlOiBSZXBvcnRUeXBlKCk9PSdTaW5nbGUnIH1cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS0yeCBmYS13aW5kb3ctbWF4aW1pemVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxwPktQSTwvcD5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyBzZXRSZXBvcnRUeXBlKCdUcmVlbWFwJyk7IH0sIGNzczogeyBhY3RpdmU6IFJlcG9ydFR5cGUoKT09J1RyZWVtYXAnIH1cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS0yeCBmYS13aW5kb3ctcmVzdG9yZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHA+VHJlZW1hcDwvcD5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyBzZXRSZXBvcnRUeXBlKCdQaXZvdCcpOyB9LCBjc3M6IHsgYWN0aXZlOiBSZXBvcnRUeXBlKCk9PSdQaXZvdCcgfVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLTJ4IGZhLXJhbmRvbVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHA+VHJhbnNwb3NlPC9wPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbjwvc2NyaXB0PlxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJkZXNpZ25lci1jaG9vc2UtZGF0YVwiPlxyXG4gICAgPGRpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0IGJ0bi1ncm91cCBidG4tZ3JvdXAtdG9nZ2xlXCIgcm9sZT1cImdyb3VwXCIgZGF0YS1iaW5kPVwiaWY6IFJlcG9ydElEKCkgPD0gMFwiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1saWdodCBhY3RpdmVcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDogMHB4O1wiIHRpdGxlPVwiWW91IGNhbiBjaGFuZ2UgdGhlIERhdGEgc291cmNlIG9ubHkgd2hlbiBjcmVhdGluZyBhIG5ldyByZXBvcnQsIGNoYW5naW5nIHRoaXMgd2lsbCBjbGVhciBhbGwgc2VsZWN0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJkYXRhb3B0aW9uXCIgaWQ9XCJ0YWJsZVwiIGNoZWNrZWQgZGF0YS1iaW5kPVwiY2hlY2tlZDogdXNlU3RvcmVkUHJvYywgY2hlY2tlZFZhbHVlOiBmYWxzZVwiPiBEeW5hbWljXHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImJ0biBidG4tc20gYnRuLWxpZ2h0IGFjdGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJkYXRhb3B0aW9uXCIgaWQ9XCJwcm9jXCIgdmFsdWU9XCIxXCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogdXNlU3RvcmVkUHJvYywgY2hlY2tlZFZhbHVlOiB0cnVlXCI+IFByZWRlZmluZWRcclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1yaWdodFwiPlxyXG4gICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLXNtXCIgdGl0bGU9XCJBZGQgQ3VzdG9tIEZpZWxkIHVzaW5nIEZvcm11bGFcIiBkYXRhLWJpbmQ9XCJoaWRkZW46IGlzRnVuY3Rpb25GaWVsZCgpIHx8IHVzZVN0b3JlZFByb2MoKSwgY2xpY2s6IGNhbmNlbEZvcm11bGFGaWVsZCwgdGV4dDogaXNGb3JtdWxhRmllbGQoKT8gJ0NhbmNlbCc6ICdDdXN0b20gRmllbGQnLCBjc3M6IHsnYnRuLXByaW1hcnknOiAhaXNGb3JtdWxhRmllbGQoKSwgJ2J0bi1kYW5nZXInOiBpc0Zvcm11bGFGaWVsZH1cIj48L2E+XHJcbiAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBidG4tc21cIiB0aXRsZT1cIkFkZCBDdXN0b20gRmllbGQgdXNpbmcgRnVuY3Rpb25cIiBkYXRhLWJpbmQ9XCJoaWRkZW46IHRydWUgfHwgaXNGb3JtdWxhRmllbGQoKSB8fCB1c2VTdG9yZWRQcm9jKCksIGNsaWNrOiBmdW5jdGlvbigpe2Rlc2lnbkZ1bmN0aW9uRmllbGQoKX0sIHRleHQ6IGlzRnVuY3Rpb25GaWVsZCgpPyAnQ2FuY2VsJzogJ0Z1bmN0aW9uIEZpZWxkJywgY3NzOiB7J2J0bi1wcmltYXJ5JzogIWlzRnVuY3Rpb25GaWVsZCgpLCAnYnRuLWRhbmdlcic6IGlzRnVuY3Rpb25GaWVsZH1cIj48L2E+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjbGVhcmZpeFwiPjwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIiBkYXRhLWJpbmQ9XCJkaXNhYmxlOiBpc0Zvcm11bGFGaWVsZCwgaGlkZGVuOiB1c2VTdG9yZWRQcm9jXCI+XHJcbiAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogdGV4dFF1ZXJ5LnNlYXJjaEZpZWxkc1wiPlxyXG4gICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cInNlYXJjaC1maWVsZFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZGF0YS1iaW5kPVwic2VsZWN0Mjoge2Ryb3Bkb3duUGFyZW50OiAkcm9vdC5hY3RpdmVEZXNpZ24oKSA/ICQoJyNjaG9vc2UtZGF0YS1kZXNpZ24nKSA6ICQoJyNjaG9vc2UtZGF0YS1jYXJkJyksIHBsYWNlaG9sZGVyOiAnU2VhcmNoIGZvciBhIERhdGEgRmllbGQuLi4nLCBhamF4OiB7IHVybDogdXJsLCBkYXRhVHlwZTogJ2pzb24nLCBkYXRhOiBxdWVyeSwgcHJvY2Vzc1Jlc3VsdHM6IHByb2Nlc3NSZXN1bHRzLCBoZWFkZXJzOiBoZWFkZXJzIH0sIG1pbmltdW1JbnB1dExlbmd0aDogMiwgYWxsb3dDbGVhcjogdHJ1ZSB9LCB2YWx1ZTogc2VsZWN0ZWRPcHRpb25cIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiB1c2VTdG9yZWRQcm9jXCI+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZGF0YS1iaW5kPVwic2VsZWN0MlZhbHVlOiB7ZHJvcGRvd25QYXJlbnQ6ICRyb290LmFjdGl2ZURlc2lnbigpID8gJCgnI2Nob29zZS1kYXRhLWRlc2lnbicpIDogJCgnI2Nob29zZS1kYXRhLWNhcmQnKX0sIG9wdGlvbnM6IFByb2NzLCBvcHRpb25zQ2FwdGlvbjogJ0Nob29zZSBTZWN0aW9uLi4uJywgb3B0aW9uc1RleHQ6ICdEaXNwbGF5TmFtZScsIHZhbHVlOiBTZWxlY3RlZFByb2MsIHZpc2libGU6IHVzZVN0b3JlZFByb2NcIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiIGRhdGEtYmluZD1cImhpZGRlbjogdXNlU3RvcmVkUHJvY1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0yXCIgc3R5bGU9XCJwYWRkaW5nLXRvcDogMTVweDtcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIFNlbGVjdCBEYXRhIHRvIHVzZSBpbiBSZXBvcnRcclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWluZm8tY2lyY2xlIHRleHQtbXV0ZWRcIiBkYXRhLXRvZ2dsZT1cInRvb2x0aXBcIiB0aXRsZT1cIkNob29zZSBhIHRhYmxlIHRvIHNob3cgZmllbGRzIHRvIHNlbGVjdC5cIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGEtc2VsZWN0LXRyZWVcIj5cclxuICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogQ2F0ZWdvcml6ZWRUYWJsZXMgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCkgeyBpc0V4cGFuZGVkKCFpc0V4cGFuZGVkKCkpOyB9LCB2aXNpYmxlOiBjYXRlZ29yeU5hbWVcIiBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYVwiIGRhdGEtYmluZD1cImNzczogaXNFeHBhbmRlZCgpID8gJ2ZhLWNoZXZyb24tZG93biB0ZXh0LXNlY29uZGFyeScgOiAnZmEtY2hldnJvbi1yaWdodCB0ZXh0LXNlY29uZGFyeSdcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFcIiBkYXRhLWJpbmQ9XCJjc3M6IGlzRXhwYW5kZWQoKSA/ICdmYS1mb2xkZXItb3BlbicgOiAnZmEtZm9sZGVyJ1wiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogY2F0ZWdvcnlOYW1lXCIgY2xhc3M9XCJtbC0yXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXBvcnQtbGlzdFwiIGRhdGEtYmluZD1cInZpc2libGU6IGlzRXhwYW5kZWQoKSwgZm9yZWFjaDogdGFibGVzXCIgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDE1cHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYm9yZGVyLWJvdHRvbSBweS0yIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpIHsgc2VsZWN0VGFibGUoJGRhdGEpOyB9LCBjc3M6IHsndGV4dC1tdXRlZCc6ICFpc0VuYWJsZWQoKX0sIHN0eWxlOiB7Y3Vyc29yOiBpc0VuYWJsZWQoKSA/ICdwb2ludGVyJyA6ICcnfSwgYXR0cjoge3RpdGxlOiAhaXNFbmFibGVkKCkgPyAnQ2Fubm90IHVzZSB0YWJsZSBhcyBqb2lucyBkbyBub3QgZXhpc3QnOiAnJ31cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeSBmYVwiIGRhdGEtYmluZD1cImNzczogaXNFbmFibGVkKCkgPyAoJGRhdGEgPT09ICRwYXJlbnRzWzFdLlNlbGVjdGVkVGFibGUoKSA/ICdmYS1jaGV2cm9uLWRvd24nIDogJ2ZhLWNoZXZyb24tcmlnaHQnKSA6ICdmYS1iYW4nXCI+PC9zcGFuPiZuYnNwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXRhYmxlXCI+PC9zcGFuPiZuYnNwOzxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHRhYmxlTmFtZVwiIGNsYXNzPVwiXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogJGRhdGEgPT09ICRwYXJlbnRzWzFdLlNlbGVjdGVkVGFibGUoKSAmJiAhJHBhcmVudHNbMV0uaXNGb3JtdWxhRmllbGQoKSAmJiAhJHBhcmVudHNbMV0uU2VsZWN0ZWRUYWJsZSgpLmR5bmFtaWNDb2x1bW5zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJzbWFsbCB0ZXh0LW11dGVkXCIgZGF0YS1iaW5kPVwiY2xpY2s6ICRwYXJlbnRzWzFdLk1vdmVBbGxGaWVsZHNcIj5TZWxlY3QgYWxsPC9hPiB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJzbWFsbCB0ZXh0LW11dGVkXCIgZGF0YS1iaW5kPVwiY2xpY2s6ICRwYXJlbnRzWzFdLlJlbW92ZVNlbGVjdGVkRmllbGRzXCI+UmVtb3ZlIGFsbDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRmllbGRzIEV4cGFuZCBIZXJlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkZGF0YSA9PT0gJHBhcmVudHNbMV0uU2VsZWN0ZWRUYWJsZSgpXCIgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDMwcHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiAkcGFyZW50c1sxXS5DaG9vc2VGaWVsZHMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBib3JkZXItYm90dG9tIHB5LTIgYWxpZ24taXRlbXMtY2VudGVyIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkSW5BcnJheToge2FycmF5OiAkcGFyZW50c1syXS5pc0Zvcm11bGFGaWVsZCgpID8gJHBhcmVudHNbMl0uZm9ybXVsYUZpZWxkcyA6ICRwYXJlbnRzWzJdLlNlbGVjdGVkRmllbGRzLCB2YWx1ZTogJGRhdGF9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogZmllbGROYW1lXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLS9rby0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9zY3JpcHQ+XHJcblxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cImRlc2lnbmVyLXNlbGVjdGVkLWRhdGFcIj5cclxuICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogU2VsZWN0ZWRGaWVsZHMoKS5sZW5ndGggPT0gMFwiPlxyXG4gICAgICAgIFBsZWFzZSBjaG9vc2UgZGF0YVxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBTZWxlY3RlZEZpZWxkcygpLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6IFJlcG9ydFR5cGUoKT09J0JhcidcIiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvIHNtYWxsIHB5LTEgbWItMlwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWxpZ2h0YnVsYi1vXCI+PC9zcGFuPiZuYnNwO0ZvciBCYXIgR3JhcGgsIHRoZSBmaXJzdCBmaWVsZCBiZWxvdyB3aWxsIHNob3cgb24gdGhlIHgtYXhpcy4gQWxsIG90aGVyIG51bWVyaWMgZmllbGRzIHdpbGwgc2hvdyBvbiB5LWF4aXMuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3cgc21hbGxcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94IGNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogYmFyQ2hhcnRIb3Jpem9udGFsXCIgLz5cclxuICAgICAgICAgICAgICAgIEhvcml6b250YWwgQmFyIENoYXJ0XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94IGNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogYmFyQ2hhcnRTdGFja2VkXCIgLz5cclxuICAgICAgICAgICAgICAgIFN0YWNrZWQgQmFyIENoYXJ0XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpPT0nUGllJ1wiIGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm8gc21hbGwgcHktMSBtYi0yXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtbGlnaHRidWxiLW9cIj48L3NwYW4+Jm5ic3A7Rm9yIFBpZSBHcmFwaCwgdGhlIGZpcnN0IGZpZWxkIGJlbG93IHdpbGwgYmUgZ3JvdXBlZCwgYW5kIHRoZSBmaXJzdCBudW1lcmljIGZpZWxkIHdpbGwgc2hvdyBhcyB0aGUgcmF0aW8uXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3cgc21hbGxcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94IGNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogcGllQ2hhcnREb251dFwiIC8+XHJcbiAgICAgICAgICAgICAgICBEb251dCBDaGFydFxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6IFJlcG9ydFR5cGUoKT09J1RyZWVtYXAnXCIgY2xhc3M9XCJjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mbyBzbWFsbCBweS0xIG1iLTBcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1saWdodGJ1bGItb1wiPjwvc3Bhbj4mbmJzcDtGb3IgVHJlZW1hcCwgdGhlIGRhdGEgbXVzdCBiZSBpbiBhIGhpZXJhcmNoaWNhbCBmb3JtYXQgd2l0aCAybmQgY29sdW1uIGhhdmluZyBwYXJlbnQgYW5kIHRoaXJkIGNvbHVtbiBoYXZpbmcgYSBudW1lcmljIHZhbHVlLiBUaGUgZGF0YSBtdXN0IGhhdmUgYSBzaW5nbGUgcm9vdCBub2RlIGhhdmluZyBudWxsIGFzIGl0cyBwYXJlbnQgYXMgd2VsbC5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSZXBvcnRUeXBlKCk9PSdIZWF0TWFwJ1wiIGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm8gbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1saWdodGJ1bGItbyBmYS0yeFwiPjwvc3Bhbj4mbmJzcDtGb3IgSGVhdE1hcCwgdGhlIGZpcnN0IHR3byBjb2x1bW5zIG11c3QgYmUgbnVtZXJpYyB2YWx1ZXMgcmVwcmVzZW50aW5nXHJcbiAgICAgICAgICAgICAgICA8c3Ryb25nPkxhdGl0dWRlPC9zdHJvbmc+IGFuZCA8c3Ryb25nPkxvbmdpdHVkZTwvc3Ryb25nPi4gQXQgbGVhc3Qgb25lIGFkZGl0aW9uYWwgbnVtZXJpYyBjb2x1bW4gaXMgcmVxdWlyZWQgdG8gcHJvdmlkZSB0aGVcclxuICAgICAgICAgICAgICAgIDxzdHJvbmc+aW50ZW5zaXR5PC9zdHJvbmc+IG9mIGVhY2ggcG9pbnQuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93IG1iLTJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveCBjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IGhlYXRNYXBPcHRpb25zLnNob3dNYXJrZXJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBTaG93IE1hcmtlclxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3cgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLTEyIGZ3LWJvbGRcIj5IZWF0bWFwIENvbG9yczwvbGFiZWw+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC00IG1iLTJcIj4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBjbGFzcz1cImNvbG9yLXBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJ2YWx1ZTogaGVhdE1hcE9wdGlvbnMuZ3JhZGllbnQxXCIgdGl0bGU9XCJHcmFkaWVudCAxXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC00IG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgY2xhc3M9XCJjb2xvci1waWNrZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwidmFsdWU6IGhlYXRNYXBPcHRpb25zLmdyYWRpZW50MlwiIHRpdGxlPVwiR3JhZGllbnQgMlwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNCBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIGNsYXNzPVwiY29sb3ItcGlja2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cInZhbHVlOiBoZWF0TWFwT3B0aW9ucy5ncmFkaWVudDNcIiB0aXRsZT1cIkdyYWRpZW50IDNcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6IFJlcG9ydFR5cGUoKT09J0xpbmUnXCIgY2xhc3M9XCJjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mbyBzbWFsbCBweS0xIG1iLTJcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1saWdodGJ1bGItb1wiPjwvc3Bhbj4mbmJzcDtGb3IgTGluZSBHcmFwaCwgdGhlIGZpcnN0IGZpZWxkIGJlbG93IHdpbGwgc2hvdyBvbiB0aGUgeC1heGlzLiBBbGwgb3RoZXIgZmllbGRzIHdpbGwgbnVtZXJpYyBmaWVsZHMgd2lsbCBzaG93IG9uIHktYXhpcy5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvdyBzbWFsbFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3ggY29sLTZcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBsaW5lQ2hhcnRBcmVhXCIgLz5cclxuICAgICAgICAgICAgICAgIEFyZWEgQ2hhcnRcclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSZXBvcnRUeXBlKCk9PSdDb21ibydcIiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvIHNtYWxsIHB5LTEgbWItMlwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWxpZ2h0YnVsYi1vXCI+PC9zcGFuPiZuYnNwO0ZvciBDb21ibyBHcmFwaCwgdGhlIGZpcnN0IGZpZWxkIGJlbG93IHdpbGwgc2hvdyBvbiB0aGUgeC1heGlzLiBBbGwgb3RoZXIgbnVtZXJpYyBmaWVsZHMgd2lsbCBzaG93IG9uIHktYXhpcywgYW5kIHlvdSBjYW4gY2hvb3NlIGRpc3BsYXkgZWFjaCBzZXJpZXMgYXMgbGluZSwgYmFyIG9yIGFyZWEuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3cgc21hbGxcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+RGVmYXVsdCBTZXJpZXMgVHlwZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3Qtc21cIiBkYXRhLWJpbmQ9XCJvcHRpb25zOiBzZXJpZXNUeXBlcywgdmFsdWU6IGNvbWJvQ2hhcnRUeXBlXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSZXBvcnRUeXBlKCk9PSdQaXZvdCdcIiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvIHNtYWxsIHB5LTEgbWItMFwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWxpZ2h0YnVsYi1vXCI+PC9zcGFuPiZuYnNwO0ZvciBUcmFuc3Bvc2UsIHRoZSBmaXJzdCBmaWVsZCBiZWxvdyB3aWxsIGJlIHVzZWQgdG8gUGl2b3QvVHJhbnNwb3NlIHRoZSByb3dzIGFzIGNvbHVtbnMsIGFuZCBpdCBtdXN0IGJlIGdyb3VwZWQuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6IFJlcG9ydFR5cGUoKT09J1NpbmdsZSdcIiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvIHNtYWxsIHB5LTEgbWItMFwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWxpZ2h0YnVsYi1vXCI+PC9zcGFuPiZuYnNwO0tQSSBpcyBhIHNpbmdsZSB2YWx1ZSByZXBvcnQgdGhhdCBpcyBpZGVhbCBmb3IgcGxhY2luZyBvbiBhIERhc2hib2FyZC4gQWxsIGZpZWxkcyBleGNlcHQgb25lIG11c3QgYmUgaGlkZGVuIGZvciBXaWRnZXRzLlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSZXBvcnRUeXBlKCk9PSdIdG1sJ1wiIGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93IHNtYWxsXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveCBjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IGRvbnRHcm91cEN1c3RvbVwiIC8+XHJcbiAgICAgICAgICAgICAgICBMaXN0IChEb24ndCBTdW1tYXJpemUpXHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpPT0nTWFwJ1wiIGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm8gc21hbGwgcHktMSBtYi0yXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtbGlnaHRidWxiLW9cIj48L3NwYW4+Jm5ic3A7Rm9yIE1hcCBHcmFwaCwgdGhlIGZpcnN0IGZpZWxkIGJlbG93IGhhcyB0byBiZSBhIFJlZ2lvbiwgbGlrZSBhIENvdW50cnkuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3cgc21hbGxcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTMgY29udHJvbC1sYWJlbFwiPk1hcCBEaXNwbGF5PC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS01XCI+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3Qtc21cIiBkYXRhLWJpbmQ9XCJvcHRpb25zOiBtYXBSZWdpb25zLCB2YWx1ZTogbWFwUmVnaW9uXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cFwiIGRhdGEtYmluZD1cInNvcnRhYmxlOiB7IGRhdGE6IFNlbGVjdGVkRmllbGRzLCBvcHRpb25zOiB7IGhhbmRsZTogJy5zb3J0YWJsZScsIGN1cnNvcjogJ21vdmUnLCBwbGFjZWhvbGRlcjogJ2Ryb3AtaGlnaGxpZ2h0JyB9LCBzdHJhdGVneU1vdmU6IHRydWUgfVwiPlxyXG4gICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNvcnRhYmxlIHB1bGwtbGVmdFwiIHN0eWxlPVwicGFkZGluZy1yaWdodDogMTVweDtcIiBkYXRhLWJpbmQ9XCJpZm5vdDogJHBhcmVudC51c2VTdG9yZWRQcm9jXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtZWxsaXBzaXMtdlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHRpdGxlPVwiRHJhZyB0byByZW9yZGVyXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWNvbHVtbnNcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogc2VsZWN0ZWRGaWVsZE5hbWVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogaXNGb3JtdWxhRmllbGQoKSA/ICcoJyArIGZpZWxkRm9ybWF0KCkgKyAnKScgOiAnJ1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAhJHBhcmVudC5pc0ZpZWxkVmFsaWRGb3JZQXhpcygkaW5kZXgoKSwgZmllbGRUeXBlIHx8IGZpZWxkRm9ybWF0KCksIHNlbGVjdGVkQWdncmVnYXRlKCkpICYmICRwYXJlbnQuUmVwb3J0VHlwZSgpICE9J1RyZWVtYXAnICYmICRwYXJlbnQuaXNDaGFydCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctZGFuZ2VyXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogIWdyb3VwSW5HcmFwaCgpXCI+V2lsbCBub3Qgc2hvdyBpbiA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiAkcGFyZW50LlJlcG9ydFR5cGVcIj48L3NwYW4+Q2hhcnQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInZpc2libGU6ICRwYXJlbnQuSXNQaXZvdEZpZWxkTGFzdENvbHVtbigkaW5kZXgoKSxzZWxlY3RlZEFnZ3JlZ2F0ZSgpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJnLWRhbmdlclwiID5QaXZvdCBmaWVsZCBjYW5ub3QgYmUgdGhlIGxhc3QgY29sdW1uLjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidmlzaWJsZTogJHBhcmVudC5Jc0R5bmFtaWNGaWVsZEZpcnN0Q29sdW1uKCRpbmRleCgpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJnLWRhbmdlclwiID5EeW5hbWljIGNhbm5vdCBiZSBmaXJzdCBjb2x1bW4uPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIiBzdHlsZT1cIm1hcmdpbi10b3A6IC01cHg7XCIgZGF0YS1iaW5kPVwiaWY6ICRwYXJlbnQuQWdncmVnYXRlUmVwb3J0KCkgJiYgISRwYXJlbnQudXNlU3RvcmVkUHJvYygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLWNvbnRyb2wtc21cIiBkYXRhLWJpbmQ9XCJvcHRpb25zOiAkcGFyZW50LmNhbkRyaWxsZG93bigpICYmICRpbmRleCgpPjAgPyBmaWVsZEFnZ3JlZ2F0ZVdpdGhEcmlsbGRvd24gOiBmaWVsZEFnZ3JlZ2F0ZSwgdmFsdWU6IHNlbGVjdGVkQWdncmVnYXRlXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCIgc3R5bGU9XCJwYWRkaW5nLXJpZ2h0OiAxMHB4O1wiIGRhdGEtYmluZD1cImlmbm90OiAkcGFyZW50LnVzZVN0b3JlZFByb2NcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS10cmFzaC1vXCIgdGl0bGU9XCJDYW5ub3QgRGVsZXRlIFJlcXVpcmVkIEZpbHRlclwiIGRhdGEtYmluZD1cInZpc2libGU6IGZvcmNlRmlsdGVyRm9yVGFibGVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtdHJhc2hcIiBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjtcIiBhcmlhLWhpZGRlbj1cInRydWVcIiB0aXRsZT1cIkRlbGV0ZSB0aGlzIEZpZWxkXCIgZGF0YS1iaW5kPVwiY2xpY2s6ICRwYXJlbnQuUmVtb3ZlRmllbGQsIGhpZGRlbjogZm9yY2VGaWx0ZXJGb3JUYWJsZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDEwcHg7XCIgZGF0YS1iaW5kPVwiaWZub3Q6ICRwYXJlbnQudXNlU3RvcmVkUHJvY1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJ1dHRvbi1ib3ggbm8tcGFkZGluZ1wiIHRhYmluZGV4PVwiMFwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyBmaWx0ZXJPbkZseSghZmlsdGVyT25GbHkoKSk7IH0sIGNzczoge2FjdGl2ZTogZmlsdGVyT25GbHkoKT09dHJ1ZX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtZmlsdGVyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgdGl0bGU9XCJGaWx0ZXIgYnkgdGhpcyBmaWVsZCBvbiB0aGUgUmVwb3J0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+LS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDEwcHg7XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogJHBhcmVudC5SZXBvcnRUeXBlKCkhPSdQaXZvdCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJidXR0b24tYm94IG5vLXBhZGRpbmdcIiB0YWJpbmRleD1cIjBcIiBkYXRhLWJpbmQ9XCJjbGljazogdG9nZ2xlRGlzYWJsZSwgY3NzOiB7YWN0aXZlOiBkaXNhYmxlZCgpPT10cnVlfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1jbG9zZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHRpdGxlPVwiRG8gbm90IGluY2x1ZGUgaW4gUmVwb3J0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDEwcHg7XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogJHBhcmVudC5SZXBvcnRUeXBlKCkhPSdQaXZvdCcgJiYgJHBhcmVudC5SZXBvcnRUeXBlKCkhPSdMaXN0JyAmJiAhJHBhcmVudC51c2VTdG9yZWRQcm9jKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJidXR0b24tYm94IG5vLXBhZGRpbmdcIiB0YWJpbmRleD1cIjBcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgaGlkZUluRGV0YWlsKCFoaWRlSW5EZXRhaWwoKSk7IH0sIGNzczoge2FjdGl2ZTogaGlkZUluRGV0YWlsKCk9PXRydWV9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWV5ZS1zbGFzaFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHRpdGxlPVwiSGlkZSBpbiBEZXRhaWxzXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDEwcHg7XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogJHBhcmVudC5pc0ZpZWxkVmFsaWRGb3JZQXhpcygkaW5kZXgoKSwgZmllbGRUeXBlIHx8IGZpZWxkRm9ybWF0KCksIHNlbGVjdGVkQWdncmVnYXRlKCkpICAmJiAkcGFyZW50LmlzQ2hhcnQoKSAmJiAkaW5kZXgoKT4wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnV0dG9uLWJveCBuby1wYWRkaW5nXCIgdGFiaW5kZXg9XCIwXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IGdyb3VwSW5HcmFwaCghZ3JvdXBJbkdyYXBoKCkpOyB9LCBjc3M6IHthY3RpdmU6IGdyb3VwSW5HcmFwaCgpPT1mYWxzZX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtc2lnbmFsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgdGl0bGU9XCJJbmNsdWRlIGluIHNlcmllc1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCIgc3R5bGU9XCJwYWRkaW5nLXJpZ2h0OiAxMHB4O1wiIGRhdGEtYmluZD1cInZpc2libGU6ICRwYXJlbnQuSW5jbHVkZVN1YlRvdGFsKCkgICYmICAoWydJbnQnLCAnRG91YmxlJywgJ01vbmV5JywgJ0RlY2ltYWwnLCAnQ3VycmVuY3knXS5pbmRleE9mKGZpZWxkVHlwZSkgPj0gMCB8fCBbJ0ludCcsICdEb3VibGUnLCAnTW9uZXknLCAnRGVjaW1hbCcsICdDdXJyZW5jeSddLmluZGV4T2YoZmllbGRGb3JtYXQoKSkgPj0gMClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJidXR0b24tYm94IG5vLXBhZGRpbmdcIiB0YWJpbmRleD1cIjBcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgZG9udFN1YlRvdGFsKCFkb250U3ViVG90YWwoKSk7IH0sIGNzczoge2FjdGl2ZTogZG9udFN1YlRvdGFsKCk9PXRydWV9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXBsdXMtY2lyY2xlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgdGl0bGU9XCJEb24ndCBhZGQgdG8gVG90YWwgcm93XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDEwcHg7XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogJHBhcmVudC5SZXBvcnRUeXBlKCkhPSdQaXZvdCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJidXR0b24tYm94IG5vLXBhZGRpbmdcIiB0YWJpbmRleD1cIjBcIiBkYXRhLWJpbmQ9XCJjbGljazogc2V0dXBMaW5rRmllbGQsIGNzczoge2FjdGl2ZTogbGlua0ZpZWxkKCk9PXRydWV9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWxpbmtcIiBhcmlhLWhpZGRlbj1cInRydWVcIiB0aXRsZT1cIkxpbmsgdG8gYW5vdGhlciBSZXBvcnQgb3IgVXJsXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDEwcHg7XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogJHBhcmVudC5SZXBvcnRUeXBlKCk9PSdDb21ibycgJiYgJHBhcmVudC5pc0ZpZWxkVmFsaWRGb3JZQXhpcygkaW5kZXgoKSwgZmllbGRUeXBlIHx8IGZpZWxkRm9ybWF0KCksIHNlbGVjdGVkQWdncmVnYXRlKCkpICAmJiAkcGFyZW50LmlzQ2hhcnQoKSAmJiAkaW5kZXgoKT4wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnV0dG9uLWJveCBuby1wYWRkaW5nXCIgdGFiaW5kZXg9XCIwXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IHNlcmllc1R5cGUoc2VyaWVzVHlwZSgpID09ICdsaW5lJyA/ICdhcmVhJyA6IChzZXJpZXNUeXBlKCk9PSdiYXJzJyA/ICdsaW5lJyA6ICdiYXJzJykpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZGF0YS1iaW5kPVwiY3NzOiB7J2ZhLWxpbmUtY2hhcnQnOiBzZXJpZXNUeXBlKCkgPT0gJ2xpbmUnLCAnZmEtYmFyLWNoYXJ0Jzogc2VyaWVzVHlwZSgpID09ICdiYXJzJywgJ2ZhLWFyZWEtY2hhcnQnOiBzZXJpZXNUeXBlKCk9PSdhcmVhJyB9LCBhdHRyOiB7dGl0bGU6IHNlcmllc1R5cGV9XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDEwcHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnV0dG9uLWJveCBuby1wYWRkaW5nXCIgdGFiaW5kZXg9XCIwXCIgZGF0YS1iaW5kPVwiY2xpY2s6IHNldHVwRmllbGRPcHRpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWdlYXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIiB0aXRsZT1cIk1vcmUgT3B0aW9uc1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCIgc3R5bGU9XCJwYWRkaW5nLXJpZ2h0OiAxMHB4O1wiIGRhdGEtYmluZD1cImlmOiBpc0Zvcm11bGFGaWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJ1dHRvbi1ib3ggbm8tcGFkZGluZ1wiIHRhYmluZGV4PVwiMFwiIGRhdGEtYmluZD1cImNsaWNrOiBlZGl0Rm9ybXVsYUZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXBlbmNpbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHRpdGxlPVwiRWRpdCBGb3JtdWxhIEZpZWxkXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9saT5cclxuICAgIDwvdWw+XHJcbjwvc2NyaXB0PlxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJkZXNpZ25lci1zdWItcmVwb3J0XCI+XHJcbiAgICA8cCBjbGFzcz1cInRleHQtbXV0ZWQgbWItM1wiPlxyXG4gICAgICAgIExpbmtlZCByZXBvcnRzIGFyZSBhdmFpbGFibGUgdG8gYWRkIGFzIHN1YiByZXBvcnRzLlxyXG4gICAgICAgIFNlbGVjdGluZyBzdWIgcmVwb3J0cyB3aWxsIHJlc3RyaWN0IHRoZSByZXBvcnQgdG8gPHN0cm9uZz5vbmUgcmVjb3JkIHBlciBwYWdlPC9zdHJvbmc+LlxyXG4gICAgPC9wPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCJcclxuICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cIm9wdGlvbnM6IGxpbmtlZFJlcG9ydEZpZWxkcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNUZXh0OiAnbmFtZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VsZWN0ZWRTdWJSZXBvcnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zQ2FwdGlvbjogJ1NlbGVjdCBhIGxpbmtlZCByZXBvcnQuLi4nXCI+XHJcbiAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICA8L2Rpdj5cclxuICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXBcIlxyXG4gICAgICAgIGRhdGEtYmluZD1cInNvcnRhYmxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHN1YlJlcG9ydHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsgaGFuZGxlOiAnLnNvcnRhYmxlJywgY3Vyc29yOiAnbW92ZScsIHBsYWNlaG9sZGVyOiAnZHJvcC1oaWdobGlnaHQnIH1cclxuICAgICAgICAgICAgICAgICAgICB9XCI+XHJcbiAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWJhcnMgc29ydGFibGUgbWUtMlwiIHN0eWxlPVwiY3Vyc29yOm1vdmU7XCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogbmFtZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjbGljazogJHBhcmVudC5yZW1vdmVTdWJSZXBvcnRcIj5cclxuICAgICAgICAgICAgICAgIERlbGV0ZVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2xpPlxyXG4gICAgPC91bD5cclxuPC9zY3JpcHQ+XHJcblxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cImRlc2lnbmVyLWh0bWxcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtY2VudGVyIG1iLTFcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cclxuICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBkYXRhLWJpbmQ9XCJvcHRpb25zOiBTZWxlY3RlZEZpZWxkcywgdmFsdWU6IFNlbGVjdEZpZWxkVG9JbnNlcnQsIG9wdGlvbnNDYXB0aW9uOiAnU2VsZWN0IGEgZmllbGQuLi4nLCBvcHRpb25zVGV4dDogJ3NlbGVjdGVkRmllbGROYW1lJ1wiPjwvc2VsZWN0PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtYXV0byBkcm9wZG93blwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBidG4tc20gZHJvcGRvd24tdG9nZ2xlXCIgdHlwZT1cImJ1dHRvblwiIGRhdGEtYnMtdG9nZ2xlPVwiZHJvcGRvd25cIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10YWJsZVwiPjwvaT4gSW5zZXJ0IGFzIFRhYmxlXHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+XHJcbiAgICAgICAgICAgICAgICA8bGk+PGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogaW5zZXJ0RmllbGRUYWJsZVRyYW5zcG9zZWRcIj5UcmFuc3Bvc2VkPC9hPjwvbGk+XHJcbiAgICAgICAgICAgICAgICA8bGk+PGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogaW5zZXJ0RmllbGRUYWJsZVN0YW5kYXJkXCI+U3RhbmRhcmQ8L2E+PC9saT5cclxuICAgICAgICAgICAgICAgIDxsaT48aHIgY2xhc3M9XCJkcm9wZG93bi1kaXZpZGVyXCI+PC9saT5cclxuICAgICAgICAgICAgICAgIDxsaT48YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiI1wiIGRhdGEtYmluZD1cImNsaWNrOiBpbnNlcnRIZWFkZXJCcmVha1wiPkFkZCBIZWFkZXIgQnJlYWs8L2E+PC9saT5cclxuICAgICAgICAgICAgICAgIDxsaT48YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiI1wiIGRhdGEtYmluZD1cImNsaWNrOiBpbnNlcnRGb290ZXJCcmVha1wiPkFkZCBGb290ZXIgQnJlYWs8L2E+PC9saT5cclxuICAgICAgICAgICAgPC91bD5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC1hdXRvIG1zLTJcIj5cclxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgbWUtMlwiIHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IGNhcmRWaWV3XCI+XHJcbiAgICAgICAgICAgIENhcmQgTGF5b3V0XHJcbiAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICA8dGV4dGFyZWEgZGF0YS1iaW5kPVwic3VtbWVybm90ZTogcmVwb3J0SHRtbFwiPjwvdGV4dGFyZWE+XHJcbiAgICA8L2Rpdj5cclxuPC9zY3JpcHQ+XHJcblxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cImRlc2lnbmVyLXNvcnRcIj5cclxuICAgIDxkaXYgZGF0YS1iaW5kPVwiaWZub3Q6IHVzZVN0b3JlZFByb2NcIj5cclxuICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93IGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LW5vd3JhcFwiPlxyXG4gICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLWF1dG8gY29udHJvbC1sYWJlbFwiPlNvcnQgQnk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLXNlbGVjdC1zbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cIm9wdGlvbnM6IEZpbHRlcmVkRmllbGRzLCBvcHRpb25zVGV4dDogJ3NlbGVjdGVkRmllbGROYW1lJywgb3B0aW9uc1ZhbHVlOiAnZmllbGRJZCcsIHZhbHVlOiBTb3J0QnlGaWVsZCwgb3B0aW9uc0NhcHRpb246ICdTZWxlY3QgZmllbGQgdG8gc29ydC4uLicsIGFsbG93Q2xlYXI6IHRydWVcIj5cclxuICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvIGQtZmxleCBnYXAtMVwiPlxyXG4gICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJ0ZXh0OiAhU29ydERlc2MoKSA/ICfilrIgQXNjZW5kaW5nJyA6ICdEZXNjZW5kaW5nIOKWvCcsIGNsaWNrOiBmdW5jdGlvbigpIHsgU29ydERlc2MoIVNvcnREZXNjKCkpOyByZXR1cm4gZmFsc2U7IH1cIj5cclxuICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwiY2xpY2s6IGFkZFNvcnRGaWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICBBZGQgU29ydFxyXG4gICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJmb3JlYWNoOiBTb3J0RmllbGRzXCI+XHJcbiAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3cgYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtbm93cmFwXCI+XHJcbiAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLWF1dG8gY29udHJvbC1sYWJlbFwiPiZuYnNwOyZuYnNwO1RoZW4gU29ydCBCeTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3Qtc21cIiByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwib3B0aW9uczogJHBhcmVudC5GaWx0ZXJlZEZpZWxkcywgb3B0aW9uc1RleHQ6ICdzZWxlY3RlZEZpZWxkTmFtZScsIG9wdGlvbnNWYWx1ZTogJ2ZpZWxkSWQnLCB2YWx1ZTogc29ydEJ5RmllbGRJZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gZC1mbGV4IGdhcC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwiY2xpY2s6IHJlbW92ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlIFNvcnRcclxuICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwidGV4dDogIXNvcnREZXNjKCkgPyAn4payIEFzY2VuZGluZycgOiAnRGVzY2VuZGluZyDilrwnLCBjbGljazogZnVuY3Rpb24oKSB7IHNvcnREZXNjKCFzb3J0RGVzYygpKTsgcmV0dXJuIGZhbHNlOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImNsaWNrOiAkcGFyZW50LmFkZFNvcnRGaWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgQWRkIFNvcnRcclxuICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgPC9kaXY+XHJcbiAgICAgPC9kaXY+XHJcbjwvc2NyaXB0PlxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJkZXNpZ25lci1vcHRpb25zXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC01XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cInZpc2libGU6IFJlcG9ydFR5cGUoKSE9J1Bpdm90J1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBJbmNsdWRlU3ViVG90YWxcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIEluY2x1ZGUgVG90YWwgUm93XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiaGlkZGVuOiBBZ2dyZWdhdGVSZXBvcnRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogU2hvd1VuaXF1ZVJlY29yZHNcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIFNob3cgb25seSBVbmlxdWUgUmVjb3Jkc1xyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cInZpc2libGU6IFJlcG9ydFR5cGUoKSE9J0xpc3QnXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IFNob3dFeHBhbmRPcHRpb25cIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIERvbid0IFNob3cgRXhwYW5kIE9wdGlvblxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBpc0NoYXJ0XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IFNob3dEYXRhV2l0aEdyYXBoXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICBTaG93IERhdGEgYWxvbmcgd2l0aCBHcmFwaFxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBEb250RXhlY3V0ZU9uUnVuXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICBXYWl0IHRvIFNlbGVjdCBGaWx0ZXJzIGJlZm9yZSBSdW5uaW5nIFJlcG9ydFxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94IGNvbC1tZC01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogbWF4UmVjb3Jkc1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIE1heCBSZWNvcmRzXHJcbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC01XCIgZGF0YS1iaW5kPVwiaWY6IG1heFJlY29yZHNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIHN0eWxlPVwid2lkdGg6IDE1MHB4O1wiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcmVxdWlyZWQgcGxhY2Vob2xkZXI9XCJPbmx5IHRvcCBuLi4uXCIgZGF0YS1iaW5kPVwidmFsdWU6IE9ubHlUb3AsIHZpc2libGU6IG1heFJlY29yZHNcIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3ggY29sLW1kLTVcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogY2hhbmdlUGFnZVNpemUsIGRpc2FibGU6IHN1YlJlcG9ydHMoKS5sZW5ndGggPiAwXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICBDaGFuZ2UgUGFnZSBTaXplXHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTVcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cInZpc2libGU6IGNoYW5nZVBhZ2VTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzczogeyAndGV4dC1tdXRlZCc6IHN1YlJlcG9ydHMoKS5sZW5ndGggPiAwIH1cIj5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3Qgc3R5bGU9XCJ3aWR0aDogMTUwcHg7XCIgY2xhc3M9XCJmb3JtLXNlbGVjdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cIm9wdGlvbnM6IFsxLDEwLDMwLDUwLDEwMCwxNTAsMjAwLDUwMCwxMDAwXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IERlZmF1bHRQYWdlU2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZTogc3ViUmVwb3J0cygpLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgPCEtLSBGb3JjZSBkZWZhdWx0IHRvIDEgaWYgc3ViIHJlcG9ydHMgc2VsZWN0ZWQgLS0+XHJcbiAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiIGRhdGEtYmluZD1cInZpc2libGU6IHN1YlJlcG9ydHMoKS5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgUGFnZSBzaXplIGlzIHJlc3RyaWN0ZWQgdG8gMSB3aGVuIHN1YiByZXBvcnRzIGFyZSBzZWxlY3RlZC5cclxuICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgIDxwPjxzcGFuIGNsYXNzPVwiZmEgZmEtcGFpbnQtYnJ1c2hcIj48L3NwYW4+IFBpY2sgUmVwb3J0IEZvcm1hdDwvcD5cclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogdGFibGVTdHlsZXMgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tb3B0aW9uXCIgZGF0YS1iaW5kPVwidGl0bGU6ICRkYXRhLm5hbWUsIGNsaWNrOiAkcGFyZW50LnNlbGVjdFN0eWxlLCBjc3M6IHsnZHJvcGRvd24tb3B0aW9uLXNlbGVjdGVkJzogJHBhcmVudC5zZWxlY3RlZFN0eWxlKCkgPT0gJGRhdGEuY29sb3JzY2hlbWV9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1pbmktdGFibGUtcHJldmlld1wiIGRhdGEtYmluZD1cImZvcmVhY2g6IG5ldyBBcnJheSg1KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWluaS10YWJsZS1yb3dcIiBkYXRhLWJpbmQ9XCJmb3JlYWNoOiBuZXcgQXJyYXkoNSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaW5pLXRhYmxlLWNlbGxcIiBkYXRhLWJpbmQ9XCJzdHlsZTogeyBiYWNrZ3JvdW5kQ29sb3I6ICRwYXJlbnRDb250ZXh0LiRpbmRleCgpID09PSAwID8gJHBhcmVudHNbMV0uaGVhZGVyQmcgOiAoJHBhcmVudENvbnRleHQuJGluZGV4KCkgJSAyID09PSAwID8gJHBhcmVudHNbMV0uYWx0Um93QmcgOiAkcGFyZW50c1sxXS5yb3dCZyksIGNvbG9yOiAkcGFyZW50c1sxXS50ZXh0Q29sb3IgfVwiPjwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IG5vSGVhZGVyUm93XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICBObyBIZWFkZXIgUm93XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IG5vRGFzaGJvYXJkQm9yZGVyc1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgQm9yZGVybGVzcyBvbiBEYXNoYm9hcmRcclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJpZjogUmVwb3J0VHlwZSgpID09ICdTaW5nbGUnXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IHNob3dQcmlvckluS3BpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICBTaG93IHByZXZpb3VzIGNvbXBhcmlzaW9uIGluIEtQSSBpZiBhcHBsaWNhYmxlXHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwiY3VzdG9tLWZpZWxkLWRlc2lnbmVyXCI+XHJcbiAgICA8ZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiIGRhdGEtYmluZD1cInZpc2libGU6IGlzRm9ybXVsYUZpZWxkKClcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgWW91IGFyZSBub3cgY3JlYXRpbmcgYSBDdXN0b21pemVkIEZpZWxkLiBQbGVhc2Ugc2VsZWN0IHRoZSBmaWVsZHMgeW91IHdhbnQgdG8gdXNlIGluIHRoZSBjYWxjdWxhdGlvbiwgdGhlbiBjaG9vc2UgdGhlIG9wZXJhdGlvbnMgeW91IHdhbnQgdG8gcGVyZm9ybSwgYW5kIGNsaWNrIFwiU2F2ZVwiIHRvIGFkZCB5b3VyIEN1c3RvbSBmaWVsZC5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNiBzbWFsbFwiPlxyXG4gICAgICAgICAgICAgICAgU2V0dXAgeW91ciBGb3JtdWxhIGZvciBjYWxjdWxhdGluZyB0aGlzIEZpZWxkXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTYgcmlnaHQtYWxpZ25cIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBmb3JtdWxhVHlwZSgpPT0nYnVpbGQnXCI+XHJcbiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLXNtXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGFkZEZvcm11bGFQYXJlbnRoZXNlc1wiPkFkZCAoICk8L2E+XHJcbiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLXNtXCIgdGl0bGU9XCJBZGQgVG9kYXlcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBmb3JtdWxhT25seUhhc0RhdGVGaWVsZHMoKSB8fCBmb3JtdWxhRmllbGRzKCkubGVuZ3RoID09IDAsIGNsaWNrOiBhZGRGb3JtdWxhRGF0ZVRvZGF5XCI+QWRkIFRvZGF5PC9hPlxyXG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IGJ0bi1zbVwiIHRpdGxlPVwiQWRkIGEgQ29uc3RhbnQgVmFsdWVcIiBkYXRhLWJpbmQ9XCJjbGljazogYWRkRm9ybXVsYUNvbnN0YW50VmFsdWVcIj5BZGQgVmFsdWU8L2E+XHJcbiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLXNtXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGNsZWFyRm9ybXVsYUZpZWxkXCI+Q2xlYXI8L2E+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwLXJvd1wiIGRhdGEtYmluZD1cImlmOiBmb3JtdWxhT25seUhhc0RhdGVGaWVsZHNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMlwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICBGb3IgRGF0ZXMgRmllbGQgY2FsY3VsYXRpb24sIHlvdSBjYW4gb25seSBzdWJzdHJhY3QgZGF0ZSBmaWVsZHMgYW5kIGRpc3BsYXkgdGhlIHJlc3VsdCBhcyBkYXlzLCBob3VycywgbWludXRlcyBvciBzZWNvbmRzLlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMiBjb250cm9sLWxhYmVsXCI+RmllbGQgTGFiZWw8L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEwXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc21cIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogZm9ybXVsYUZpZWxkTGFiZWxcIiByZXF1aXJlZCBwbGFjZWhvbGRlcj1cIkN1c3RvbSBGaWVsZCBMYWJlbFwiIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMiBjb250cm9sLWxhYmVsXCI+RGF0YSBGb3JtYXQ8L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEwXCI+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3Qtc21cIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogZm9ybXVsYURhdGFGb3JtYXRcIiByZXF1aXJlZD5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmbm90OiBmb3JtdWxhT25seUhhc0RhdGVGaWVsZHMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj5TdHJpbmc8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPkludGVnZXI8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPkRlY2ltYWw8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPkN1cnJlbmN5PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogZm9ybXVsYU9ubHlIYXNEYXRlRmllbGRzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24+RGF5czwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24+SG91cnM8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPk1pbnV0ZXM8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPlNlY29uZHM8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBmb3JtdWxhRGF0YUZvcm1hdCgpID09ICdEZWNpbWFsJyB8fCBmb3JtdWxhRGF0YUZvcm1hdCgpID09ICdDdXJyZW5jeSdcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTIgY29udHJvbC1sYWJlbFwiPlJvdW5kIHRvIERlY2ltYWwgUGxhY2VzPC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMFwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGRhdGEtYmluZD1cInZhbHVlOiBmb3JtdWxhRGVjaW1hbFBsYWNlc1wiIHBsYWNlaG9sZGVyPVwiQ2hvb3NlIERlY2ltYWwgcGxhY2VzIChsZWF2ZSBibGFuayB0byBub3QgdXNlIHJvdW5kaW5nKVwiIHRpdGxlPVwiQ2hvb3NlIERlY2ltYWwgcGxhY2VzIChsZWF2ZSBibGFuayB0byBub3QgdXNlIHJvdW5kaW5nKVwiIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiIGRhdGEtYmluZD1cInZpc2libGU6IGFwcFNldHRpbmdzLnVzZVNxbEN1c3RvbUZpZWxkXCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0yIGNvbnRyb2wtbGFiZWxcIj5GaWVsZCBCdWlsZGVyIFR5cGU8L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEwXCI+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3Qtc21cIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogZm9ybXVsYVR5cGVcIiByZXF1aXJlZD5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYnVpbGRcIj5TaW1wbGUgQ2FsY3VsYXRpb248L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwic3FsXCI+QWR2YW5jZWQgRXhwcmVzc2lvbjwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIiBkYXRhLWJpbmQ9XCJpZjogZm9ybXVsYVR5cGUoKT09J2J1aWxkJ1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMiBjb250cm9sLWxhYmVsXCI+RmllbGQgRm9ybXVsYTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogZm9ybXVsYUZpZWxkcygpLmxlbmd0aCA9PSAwXCI+UGljayBmaWVsZHMgdG8gYnVpbGQgY2FsY3VsYXRpb248L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtd3JhcFwiIGRhdGEtYmluZD1cImZvcmVhY2g6IGZvcm11bGFGaWVsZHNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJtZS0zXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogc2V0dXBGb3JtdWxhLmlzUGFyZW50aGVzZXNTdGFydFwiIHN0eWxlPVwibWFyZ2luLXRvcDogMDtcIj4oPC9oMz5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiAhc2V0dXBGb3JtdWxhLmlzUGFyZW50aGVzZXNTdGFydCgpICYmICFzZXR1cEZvcm11bGEuaXNQYXJlbnRoZXNlc0VuZCgpXCIgY2xhc3M9XCJsaXN0LWdyb3VwIG1lLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGZvcm11bGEtZmllbGQtaXRlbVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDE1cHg7IHBhZGRpbmc6IDVweCAxNXB4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBmaWVsZE5hbWUsIHZpc2libGU6ICFzZXR1cEZvcm11bGEuaXNDb25zdGFudFZhbHVlKClcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBzZXR1cEZvcm11bGEuaXNDb25zdGFudFZhbHVlXCIgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGRhdGEtYmluZD1cInZhbHVlOiBzZXR1cEZvcm11bGEuY29uc3RhbnRWYWx1ZSwgdmlzaWJsZTogc2V0dXBGb3JtdWxhLmNvbnN0YW50VmFsdWUoKSE9J3xUb2RheXwnXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtIG1lLTJcIiByZXF1aXJlZCAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInZpc2libGU6IHNldHVwRm9ybXVsYS5jb25zdGFudFZhbHVlKCkgPT0gJ3xUb2RheXwnXCI+PGI+VG9kYXk8L2I+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXIgYnRuLXNtIG1zLTJcIiBkYXRhLWJpbmQ9XCJjbGljazogJHBhcmVudC5yZW1vdmVGaWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdHJhc2hcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwibWUtM1wiIGRhdGEtYmluZD1cInZpc2libGU6IHNldHVwRm9ybXVsYS5pc1BhcmVudGhlc2VzRW5kXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAwO1wiPik8L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZS0zXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogMTVweDtcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcGFyZW50LnNob3dGb3JtdWxhT3BlcmF0aW9uKCRpbmRleCgpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbVwiIHN0eWxlPVwibWF4LXdpZHRoOiA1MHB4O1wiIGRhdGEtYmluZD1cInZhbHVlOiBzZXR1cEZvcm11bGEuZm9ybXVsYU9wZXJhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogISRwYXJlbnQuZm9ybXVsYU9ubHlIYXNEYXRlRmllbGRzKCkgfHwgKCRwYXJlbnQuZm9ybXVsYU9ubHlIYXNEYXRlRmllbGRzKCkgJiYgJHBhcmVudC5pc0NvbnN0YW50T3BlcmF0aW9uKCRpbmRleCgpKSkgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPis8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj4tPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBbJ0ludGVnZXInLCdNb25leScsJ0Zsb2F0JywnRG91YmxlJywnRGVjaW1hbCcsJ0N1cnJlbmN5J10uaW5kZXhPZigkcGFyZW50LmZvcm11bGFEYXRhRm9ybWF0KCkpICE9IC0xIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj4qPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPi88L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogY3VzdG9tU3FsRmllbGQsIHZpc2libGU6IGZvcm11bGFUeXBlKCk9PSdzcWwnXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlNlbGVjdCBEYXRhIE9wZXJhdGlvbjo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBkYXRhLWJpbmQ9XCJzZWxlY3QyOiB7XHJcbiAgICAgICAgICAgICAgICBkcm9wZG93blBhcmVudDogJHJvb3QuYWN0aXZlRGVzaWduKCkgPyAkKCcjY2hvb3NlLWRhdGEtZGVzaWduJykgOiAkKCcjY2hvb3NlLWRhdGEtY2FyZCcpLFxyXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgRnVuY3Rpb24uLi4nLFxyXG4gICAgICAgICAgICAgICAgZGF0YTogYXZhaWxhYmxlRnVuY3Rpb25zR3JvdXBlZCgpLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVSZXN1bHQ6IHRlbXBsYXRlUmVzdWx0XHJcbiAgICAgICAgICAgIH0sIHZhbHVlOiBzZWxlY3RlZFNxbEZ1bmN0aW9uXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCIgZGF0YS1iaW5kPVwiaGlkZGVuOiBpc0NvbmRpdGlvbmFsRnVuY3Rpb24oKSB8fCBzZWxlY3RlZFNxbEZ1bmN0aW9uKCkgPT0gJ090aGVyJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+U2VsZWN0IHRoZSBEYXRhIEZpZWxkIHRvIHVzZTo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cInNlbGVjdDI6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcGRvd25QYXJlbnQ6ICRyb290LmFjdGl2ZURlc2lnbigpID8gJCgnI2Nob29zZS1kYXRhLWRlc2lnbicpIDogJCgnI2Nob29zZS1kYXRhLWNhcmQnKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICdTZWFyY2ggRmllbGQuLi4nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhamF4OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICRwYXJlbnQudGV4dFF1ZXJ5LnNlYXJjaEZpZWxkcy51cmwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogJHBhcmVudC50ZXh0UXVlcnkuc2VhcmNoRmllbGRzLnF1ZXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1Jlc3VsdHM6ICRwYXJlbnQudGV4dFF1ZXJ5LnNlYXJjaEZpZWxkcy5wcm9jZXNzUmVzdWx0cyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6ICRwYXJlbnQudGV4dFF1ZXJ5LnNlYXJjaEZpZWxkcy5oZWFkZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW1JbnB1dExlbmd0aDogMixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dDbGVhcjogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHNlbGVjdDJUZXh0OiBzZWxlY3RlZEZpZWxkLHNlbGVjdDJUYWJsZUlkOnNlbGVjdGVkRmllbGRUYWJsZUlkXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogc2VsZWN0ZWRGaWVsZFwiIGNsYXNzPVwic21hbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZDogPHNwYW4gY2xhc3M9XCJoaWdobGlnaHRcIiBkYXRhLWJpbmQ9XCJ0ZXh0OiAkZGF0YVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCIgZGF0YS1iaW5kPVwiaWY6IHJlcXVpcmVzVmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImlucHV0VmFsdWVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5Qcm92aWRlIHRoZSByZWxldmFudCB2YWx1ZSB0byB1c2U6PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJpbnB1dFZhbHVlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogaW5wdXRWYWx1ZVwiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogc2VsZWN0ZWRTcWxGdW5jdGlvbigpID09ICdPdGhlcidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImN1c3RvbS1zcWxcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5DdXN0b20gU1FMIEV4cHJlc3Npb246PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZCB5b3VyIGN1c3RvbSBTUUwgRXhwcmVzc2lvbiBiZWxvdyBieSBzZWxlY3RpbmcgZGF0YSBmaWVsZHMsIGFkZGluZyBjYWxjdWxhdGlvbnMgb3IgdXNpbmcgU1FMIGtleXdvcmRzIGFzIG5lZWRlZC4gRm9yIHN0cmluZyB2YWx1ZXMsIHJlbWVtYmVyIHRvIGVuY2xvc2UgdGhlbSBpbiBzaW5nbGUgcXVvdGVzICgnJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBpZD1cImN1c3RvbS1zcWxcIiBjbGFzcz1cImhpbnQtaW5wdXRcIiBjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCIgcGxhY2Vob2xkZXI9XCJXcml0ZSB5b3VyIGN1c3RvbSBTUUxcIj48L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBpc0NvbmRpdGlvbmFsRnVuY3Rpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZCB5b3VyIGNvbmRpdGlvbmFsIGxvZ2ljIGJlbG93IGJ5IHNlbGVjdGluZyBkYXRhIGZpZWxkcywgYWRkaW5nIGNhbGN1bGF0aW9ucyBhbmQgZGVmaW5pbmcgY29uZGl0aW9ucyBhcyBuZWVkZWQsIGFuZCBwcm92aWRlIGNvcnJlc3BvbmRpbmcgcmVzdWx0cy4gRm9yIHN0cmluZyB2YWx1ZXMsIHJlbWVtYmVyIHRvIGVuY2xvc2UgdGhlbSBpbiBzaW5nbGUgcXVvdGVzICgnJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJoaW50LWlucHV0XCIgaWQ9XCJjb25kaXRpb24tZmllbGRcIiBjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCIgcGxhY2Vob2xkZXI9XCJGaWVsZCB0byBjb21wYXJlXCIgdGl0bGU9XCJGaWVsZCB0byBjb21wYXJlXCI+PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTJcIiBzdHlsZT1cIndpZHRoOiAxMjBweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3Qtc21cIiBkYXRhLWJpbmQ9XCJvcHRpb25zOiBhdmFpbGFibGVPcGVyYXRvcnMsIHZhbHVlOiBzZWxlY3RlZE9wZXJhdG9yXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImhpbnQtaW5wdXRcIiBpZD1cImNvbmRpdGlvbi12YWx1ZVwiIGNvbnRlbnRlZGl0YWJsZT1cInRydWVcIiBwbGFjZWhvbGRlcj1cIlZhbHVlIHRvIGNvbXBhcmVcIiB0aXRsZT1cIlZhbHVlIHRvIGNvbXBhcmVcIj48L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlucHV0LWdyb3VwLXRleHRcIiBzdHlsZT1cIm1heC1oZWlnaHQ6IDMycHg7XCI+VEhFTjwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImhpbnQtaW5wdXRcIiBpZD1cImNvbmRpdGlvbi1yZXN1bHRcIiBjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCIgcGxhY2Vob2xkZXI9XCJDb25kaXRpb24gUmVzdWx0XCIgdGl0bGU9XCJDb25kaXRpb24gUmVzdWx0XCI+PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGFkZENvbmRpdGlvblwiPkFkZCBDb25kaXRpb248L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBtdC0zXCIgZGF0YS1iaW5kPVwiZm9yZWFjaDogY29uZGl0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBjb25kaXRpb25EaXNwbGF5XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1kYW5nZXJcIiBkYXRhLWJpbmQ9XCJjbGljazogJHBhcmVudC5yZW1vdmVDb25kaXRpb25cIj5SZW1vdmU8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgbWItM1wiIHN0eWxlPVwicGFkZGluZy10b3A6IDVweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtdGV4dFwiIHN0eWxlPVwibWF4LWhlaWdodDogMzJweDtcIj5FTFNFPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJoaW50LWlucHV0XCIgaWQ9XCJjb25kaXRpb24tZWxzZVwiIGNvbnRlbnRlZGl0YWJsZT1cInRydWVcIiBwbGFjZWhvbGRlcj1cIkRlZmF1bHQgUmVzdWx0XCIgdGl0bGU9XCJEZWZhdWx0IFJlc3VsdFwiPjwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgPGhyIC8+XHJcbiAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXNtXCIgdGl0bGU9XCJTYXZlIEN1c3RvbSBGb3JtdWxhIEZpZWxkXCIgZGF0YS1iaW5kPVwiY2xpY2s6IHNhdmVGb3JtdWxhRmllbGQsIHZpc2libGU6IGlzRm9ybXVsYUZpZWxkXCI+U2F2ZTwvYT5cclxuICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImJ0biBidG4tc21cIiB0aXRsZT1cIkN1c3RvbSBGaWVsZCB1c2luZyBGb3JtdWxhXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGNhbmNlbEZvcm11bGFGaWVsZCwgdGV4dDogaXNGb3JtdWxhRmllbGQoKT8gJ0NhbmNlbCc6ICdDdXN0b21pemUnLCBjc3M6IHsnYnRuLXByaW1hcnknOiAhaXNGb3JtdWxhRmllbGQoKSwgJ2J0bi1kYW5nZXInOiBpc0Zvcm11bGFGaWVsZH1cIj48L2E+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9zY3JpcHQ+XHJcblxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cInJlcG9ydC1kZXNpZ25lci1jb21wYWN0XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGVzaWduZXItY29udGFpbmVyIGNvbXBhY3QtZGVzaWduZXJcIiBpZD1cImNob29zZS1kYXRhLWRlc2lnblwiIHN0eWxlPVwiZm9udC1zaXplOjEycHg7XCI+XHJcblxyXG4gICAgICA8IS0tIFZpc3VhbGl6YXRpb24gVG9vbGJhciAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQgcC0xIG1iLTJcIj5cclxuICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHAtMSBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICA8c3Bhbj48aSBjbGFzcz1cImZhIGZhLWZpbGVcIj48L2k+IFZpc3VhbGl6YXRpb248L3NwYW4+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWxpZ2h0XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0SUQoKSwgY2xpY2s6IGZ1bmN0aW9uKCkge2FjdGl2ZURlc2lnbihmYWxzZSk7fVwiIHRpdGxlPVwiQ2xvc2VcIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10aW1lc1wiPjwvaT4gQ2xvc2UgRGVzaWduZXJcclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcC0xXCI+XHJcbiAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAnZGVzaWduZXItY2hvb3NlLXZpc3VhbCdcIj48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIE1haW4gR3JpZCAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LXJvdyBmbGV4LXdyYXAgZ2FwLTIgY29tcGFjdC1maWx0ZXJzIG5lZWRzLXZhbGlkYXRpb25cIj5cclxuXHJcbiAgICAgICAgPCEtLSBEYXRhIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGZsZXgtZmlsbCBleHBhbmRhYmxlLXBhbmVsXCIgaWQ9XCJkYXRhUGFuZWxcIiBzdHlsZT1cIm1heC13aWR0aDogMzAwcHhcIlxyXG4gICAgICAgICAgICAgZGF0YS1iaW5kPVwiY3NzOnsnY29sbGFwc2VkLXZlcnRpY2FsJzogcGFuZWxzLmlzQ29sbGFwc2VkKCdkYXRhUGFuZWwnKX1cIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBwLTFcIiBkYXRhLWJpbmQ9XCJjbGljazpmdW5jdGlvbigpe3BhbmVscy50b2dnbGVQYW5lbCgnZGF0YVBhbmVsJyl9XCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZGF0YWJhc2VcIj48L2k+IERhdGFcclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcC0xXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ2Rlc2lnbmVyLWNob29zZS1kYXRhJ1wiPjwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gU2VsZWN0ZWQgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgZmxleC1maWxsIGV4cGFuZGFibGUtcGFuZWxcIiBpZD1cInNlbGVjdGVkUGFuZWxcIiBzdHlsZT1cIm1heC13aWR0aDogNDAwcHhcIlxyXG4gICAgICAgICBkYXRhLWJpbmQ9XCJjc3M6eydjb2xsYXBzZWQtdmVydGljYWwnOiBwYW5lbHMuaXNDb2xsYXBzZWQoJ3NlbGVjdGVkUGFuZWwnKX1cIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBwLTFcIiBkYXRhLWJpbmQ9XCJjbGljazpmdW5jdGlvbigpe3BhbmVscy50b2dnbGVQYW5lbCgnc2VsZWN0ZWRQYW5lbCcpfVwiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXRhYmxlXCI+PC9pPiBTZWxlY3RlZCBkYXRhIGZvciB0aGUgUmVwb3J0XHJcbiAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJzbWFsbCB0ZXh0LW11dGVkIGZsb2F0LWVuZFwiXHJcbiAgICAgICAgICAgICAgIGRhdGEtYmluZD1cInZpc2libGU6IFNlbGVjdGVkRmllbGRzKCkubGVuZ3RoLCBjbGljazpmdW5jdGlvbigpe1NlbGVjdGVkRmllbGRzKFtdKTt9XCI+Q2xlYXIgYWxsPC9hPlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBkZXNpZ25lci1hdXRvLXVwZGF0ZSBwLTFcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXgtaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3cteTogYXV0bztcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAnZGVzaWduZXItc2VsZWN0ZWQtZGF0YSdcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgZmxleC1maWxsIGV4cGFuZGFibGUtcGFuZWxcIiBpZD1cInN1YlJlcG9ydHNQYW5lbFwiXHJcbiAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjc3M6eydjb2xsYXBzZWQtdmVydGljYWwnOiBwYW5lbHMuaXNDb2xsYXBzZWQoJ3N1YlJlcG9ydHNQYW5lbCcpfSwgdmlzaWJsZTogbGlua2VkUmVwb3J0RmllbGRzKCkubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgcC0xXCIgZGF0YS1iaW5kPVwiY2xpY2s6ZnVuY3Rpb24oKXtwYW5lbHMudG9nZ2xlUGFuZWwoJ3N1YlJlcG9ydHNQYW5lbCcpfVwiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWJvb2ttYXJrXCI+PC9pPiBTdWIgUmVwb3J0c1xyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwLTFcIj5cclxuICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ2Rlc2lnbmVyLXN1Yi1yZXBvcnQnLCBkYXRhOiAkZGF0YVwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgZmxleC1maWxsIGV4cGFuZGFibGUtcGFuZWxcIiBpZD1cImh0bWxSZXBvcnRQYW5lbFwiXHJcbiAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjc3M6eydjb2xsYXBzZWQtdmVydGljYWwnOiBwYW5lbHMuaXNDb2xsYXBzZWQoJ2h0bWxSZXBvcnRQYW5lbCcpfSwgdmlzaWJsZTogUmVwb3J0VHlwZSgpPT0nSHRtbCdcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHAtMVwiIGRhdGEtYmluZD1cImNsaWNrOmZ1bmN0aW9uKCl7cGFuZWxzLnRvZ2dsZVBhbmVsKCdodG1sUmVwb3J0UGFuZWwnKX1cIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wZW5jaWxcIj48L2k+IEN1c3RvbSBEZXNpZ25cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcC0xXCI+XHJcbiAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdkZXNpZ25lci1odG1sJywgZGF0YTogJGRhdGFcIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gQ3VzdG9tIEZpZWxkIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGZsZXgtZmlsbCBleHBhbmRhYmxlLXBhbmVsXCIgaWQ9XCJjdXN0b21GaWVsZFBhbmVsXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogaXNGb3JtdWxhRmllbGRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHAtMVwiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLW1hZ2ljXCI+PC9pPiBDdXN0b20gRmllbGRcclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcC0xIGN1c3RvbS1maWVsZC1kZXNpZ25cIiBzdHlsZT1cIm1heC1oZWlnaHQ6IDQwMHB4OyBvdmVyZmxvdy15OiBhdXRvOyBvdmVyZmxvdy14OiBoaWRkZW47XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAnY3VzdG9tLWZpZWxkLWRlc2lnbmVyJywgZGF0YTogJGRhdGFcIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSBGaWVsZCBPcHRpb25zIFBhbmVsIC0tPlxyXG4gICAgICAgIDxkaXYgaWQ9XCJmaWVsZE9wdGlvbnNQYW5lbFwiIGNsYXNzPVwiY2FyZCBwLTIgbXQtMiBjb2xsYXBzZVwiPlxyXG4gICAgICAgIDwhLS0gZHluYW1pYyBmaWVsZCBzZXR0aW5ncyBsb2FkIGhlcmUgLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSBGaWx0ZXJzIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGZsZXgtZmlsbCBleHBhbmRhYmxlLXBhbmVsXCIgaWQ9XCJmaWx0ZXJzUGFuZWxcIlxyXG4gICAgICAgICAgICAgZGF0YS1iaW5kPVwiY3NzOnsnY29sbGFwc2VkLXZlcnRpY2FsJzogcGFuZWxzLmlzQ29sbGFwc2VkKCdmaWx0ZXJzUGFuZWwnKX0sIGhpZGRlbjogaXNGb3JtdWxhRmllbGRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBwLTFcIiBkYXRhLWJpbmQ9XCJjbGljazpmdW5jdGlvbigpe3BhbmVscy50b2dnbGVQYW5lbCgnZmlsdGVyc1BhbmVsJyl9XCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZmlsdGVyXCI+PC9pPiBGaWx0ZXJzXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcC0xIGRlc2lnbmVyLWF1dG8tdXBkYXRlXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OjMwMHB4OyBvdmVyZmxvdy15OmF1dG87XCI+XHJcbiAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6dXNlU3RvcmVkUHJvY1wiPjxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6e25hbWU6J2ZpbHRlci1wYXJhbWV0ZXJzJ31cIj48L2Rpdj48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZm5vdDp1c2VTdG9yZWRQcm9jXCI+PGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTp7bmFtZTonZmlsdGVyLWdyb3VwJ31cIj48L2Rpdj48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFNvcnQgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgZmxleC1maWxsIGV4cGFuZGFibGUtcGFuZWxcIiBpZD1cInNvcnRQYW5lbFwiXHJcbiAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjc3M6eydjb2xsYXBzZWQtdmVydGljYWwnOiBwYW5lbHMuaXNDb2xsYXBzZWQoJ3NvcnRQYW5lbCcpfSwgaGlkZGVuOiB1c2VTdG9yZWRQcm9jKCkgfHwgaXNGb3JtdWxhRmllbGQoKVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHAtMVwiIGRhdGEtYmluZD1cImNsaWNrOmZ1bmN0aW9uKCl7cGFuZWxzLnRvZ2dsZVBhbmVsKCdzb3J0UGFuZWwnKX1cIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zb3J0XCI+PC9pPiBTb3J0XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcC0xIGRlc2lnbmVyLWF1dG8tdXBkYXRlIHJvd1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAnZGVzaWduZXItc29ydCdcIj48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFNldHRpbmdzIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGZsZXgtZmlsbCBleHBhbmRhYmxlLXBhbmVsXCIgaWQ9XCJzZXR0aW5nc1BhbmVsXCJcclxuICAgICAgICAgICAgIGRhdGEtYmluZD1cImNzczp7J2NvbGxhcHNlZC12ZXJ0aWNhbCc6IHBhbmVscy5pc0NvbGxhcHNlZCgnc2V0dGluZ3NQYW5lbCcpfSwgaGlkZGVuOiBpc0Zvcm11bGFGaWVsZFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHAtMVwiIGRhdGEtYmluZD1cImNsaWNrOmZ1bmN0aW9uKCl7cGFuZWxzLnRvZ2dsZVBhbmVsKCdzZXR0aW5nc1BhbmVsJyl9XCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZ2VhclwiPjwvaT5PcHRpb25zXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtZm9ybS1sYWJlbCBoNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZmlsZVwiPjwvaT4gUmVwb3J0IE5hbWVcclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcmVxdWlyZWQgcGxhY2Vob2xkZXI9XCJSZXBvcnQgTmFtZVwiIGRhdGEtYmluZD1cInZhbHVlOiBSZXBvcnROYW1lXCI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29udHJvbC1sYWJlbCBoNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtaW5mby1jaXJjbGVcIj48L2k+IFJlcG9ydCBEZXNjcmlwdGlvblxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIiByb3dzPVwiM1wiIHBsYWNlaG9sZGVyPVwiQWRkaXRpb25hbCBkZXRhaWxzIChvcHRpb25hbClcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogUmVwb3J0RGVzY3JpcHRpb25cIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBDYW5TYXZlUmVwb3J0cygpXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IFNhdmVSZXBvcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICBTYXZlIFJlcG9ydFxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiIGRhdGEtYmluZD1cInZpc2libGU6IFNhdmVSZXBvcnRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWwgaDZcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWZvbGRlci1vcGVuXCI+PC9pPiBDaG9vc2UgRm9sZGVyXHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiIGRhdGEtYmluZD1cIm9wdGlvbnM6IEZvbGRlcnMsIG9wdGlvbnNUZXh0OiAnRm9sZGVyTmFtZScsIG9wdGlvbnNWYWx1ZTogJ0lkJywgdmFsdWU6IEZvbGRlcklEXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxociAvPlxyXG4gICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAnZGVzaWduZXItb3B0aW9ucydcIj48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFNjaGVkdWxlIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGZsZXgtZmlsbCBleHBhbmRhYmxlLXBhbmVsXCIgaWQ9XCJzY2hlZHVsZVBhbmVsXCJcclxuICAgICAgICAgICAgIGRhdGEtYmluZD1cImNzczp7J2NvbGxhcHNlZC12ZXJ0aWNhbCc6IHBhbmVscy5pc0NvbGxhcHNlZCgnc2NoZWR1bGVQYW5lbCcpfVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHAtMVwiIGRhdGEtYmluZD1cImNsaWNrOmZ1bmN0aW9uKCl7cGFuZWxzLnRvZ2dsZVBhbmVsKCdzY2hlZHVsZVBhbmVsJyl9XCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtaG91cmdsYXNzXCI+PC9pPiBTY2hlZHVsZVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHAtMSBkZXNpZ25lci1hdXRvLXVwZGF0ZSByb3dcIj5cclxuICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZToge25hbWU6ICdyZXBvcnQtc2NoZWR1bGUnfVwiPjwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gQWNjZXNzIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGZsZXgtZmlsbCBleHBhbmRhYmxlLXBhbmVsXCIgaWQ9XCJhY2Nlc3NQYW5lbFwiXHJcbiAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjc3M6eydjb2xsYXBzZWQtdmVydGljYWwnOiBwYW5lbHMuaXNDb2xsYXBzZWQoJ2FjY2Vzc1BhbmVsJyl9LCB2aXNpYmxlOiBhZG1pbk1vZGUoKSAmJiAhaXNGb3JtdWxhRmllbGQoKVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHAtMVwiIGRhdGEtYmluZD1cImNsaWNrOmZ1bmN0aW9uKCl7cGFuZWxzLnRvZ2dsZVBhbmVsKCdhY2Nlc3NQYW5lbCcpfVwiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWtleVwiPjwvaT5TZWN1cml0eVxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJcIiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6IHtuYW1lOiAnbWFuYWdlLWFjY2Vzcy10ZW1wbGF0ZScsIGRhdGE6IG1hbmFnZUFjY2Vzc31cIj48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8aHIgLz5cclxuPC9zY3JpcHQ+XHJcblxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cInJlcG9ydC1kZXNpZ25lclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctc2Nyb2xsYWJsZVwiIHN0eWxlPVwiaGVpZ2h0OiAxMDB2aDtcIiBpZD1cInJlcG9ydC1kZXNpZ25lci1tb2RhbFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBoZWlnaHQ6IDEwMCU7XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlXCIgaWQ9XCJteU1vZGFsTGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YSB0aXRsZT1cIk5lZWQgaGVscCBzZXR0aW5nIHVwIGEgcmVwb3J0P1wiIHRhcmdldD1cIl9ibGFua1wiIGhyZWY9XCJodHRwczovL2RvdG5ldHJlcG9ydC5jb20vYmxvZ3MvZG9jcy9kZXNpZ25pbmctcmVwb3J0c1wiPjxzcGFuIGNsYXNzPVwiZmEgZmEtcXVlc3Rpb24tY2lyY2xlXCI+PC9zcGFuPjwvYT4gRGVzaWduIHlvdXIgUmVwb3J0XHJcbiAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiIGRhdGEtYmluZD1cImNsaWNrOiBvbk1vZGFsQ2xvc2VDbGlja2VkXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBuZWVkcy12YWxpZGF0aW9uXCIgc3R5bGU9XCJvdmVyZmxvdy15OiBhdXRvOyBmbGV4LWdyb3c6IDE7XCI+XHJcbiAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCIgaWQ9XCJjaG9vc2UtZGF0YS1jYXJkXCIgIHN0eWxlPVwibWluLWhlaWdodDogY2FsYygxMDB2aCAtIDIwMHB4KTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvdyBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbCBoNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWZpbGVcIj48L2k+IFJlcG9ydCBOYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByZXF1aXJlZCBwbGFjZWhvbGRlcj1cIlJlcG9ydCBOYW1lXCIgZGF0YS1iaW5kPVwidmFsdWU6IFJlcG9ydE5hbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDU+PHNwYW4gY2xhc3M9XCJmYSBmYS1kYXRhYmFzZVwiPjwvc3Bhbj4mbmJzcDtDaG9vc2UgRGF0YSBmb3IgUmVwb3J0PC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdkZXNpZ25lci1jaG9vc2UtZGF0YSdcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29udHJvbC1sYWJlbCBoNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWluZm8tY2lyY2xlXCI+PC9pPiBSZXBvcnQgRGVzY3JpcHRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImZvcm0tY29udHJvbFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgcm93cz1cIjNcIiBwbGFjZWhvbGRlcj1cIkFkZGl0aW9uYWwgZGV0YWlscyAob3B0aW9uYWwpXCIgZGF0YS1iaW5kPVwidmFsdWU6IFJlcG9ydERlc2NyaXB0aW9uXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogQ2FuU2F2ZVJlcG9ydHMoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IFNhdmVSZXBvcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZSBSZXBvcnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBTYXZlUmVwb3J0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29udHJvbC1sYWJlbCBoNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWZvbGRlci1vcGVuXCI+PC9pPiBDaG9vc2UgRm9sZGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiIGRhdGEtYmluZD1cIm9wdGlvbnM6IEZvbGRlcnMsIG9wdGlvbnNUZXh0OiAnRm9sZGVyTmFtZScsIG9wdGlvbnNWYWx1ZTogJ0lkJywgdmFsdWU6IEZvbGRlcklEXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1PjxzcGFuIGNsYXNzPVwiZmEgZmEtZmlsZVwiPjwvc3Bhbj4mbmJzcDtDaG9vc2UgVmlzdWFsaXphdGlvbjwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwib3ZlcmZsb3cteDogYXV0bzsgd2hpdGUtc3BhY2U6IG5vd3JhcDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAnZGVzaWduZXItY2hvb3NlLXZpc3VhbCdcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IGlzRnVuY3Rpb25GaWVsZFwiIGNsYXNzPVwiY3VzdG9tLWZpZWxkLWRlc2lnblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIHB1bGwtcmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc21cIiB0aXRsZT1cIlNhdmUgQ3VzdG9tIEZ1bmN0aW9uIEZpZWxkXCIgZGF0YS1iaW5kPVwiY2xpY2s6IHNhdmVGdW5jdGlvbkZpZWxkLCB2aXNpYmxlOiBpc0Z1bmN0aW9uRmllbGRcIj5TYXZlPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYnRuIGJ0bi1zbVwiIHRpdGxlPVwiQ3VzdG9tIEZpZWxkIHVzaW5nIEZ1bmN0aW9uXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7aXNGdW5jdGlvbkZpZWxkKCFpc0Z1bmN0aW9uRmllbGQoKSl9LCB0ZXh0OiBpc0Z1bmN0aW9uRmllbGQoKT8gJ0NhbmNlbCc6ICdGdW5jdGlvbicsIGNzczogeydidG4tcHJpbWFyeSc6ICFpc0Z1bmN0aW9uRmllbGQoKSwgJ2J0bi1kYW5nZXInOiBpc0Z1bmN0aW9uRmllbGR9XCI+PC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgcGFkZGVkLWRpdlwiIGRhdGEtYmluZD1cInZpc2libGU6IGlzRnVuY3Rpb25GaWVsZCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZb3UgYXJlIG5vdyBjcmVhdGluZyBhIEN1c3RvbWl6ZWQgRmllbGQgdXNpbmcgRnVuY3Rpb25zIGF2YWlsYWJsZS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMiBjb250cm9sLWxhYmVsXCI+RmllbGQgTGFiZWw8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgZGF0YS1iaW5kPVwidmFsdWU6IGZvcm11bGFGaWVsZExhYmVsXCIgcmVxdWlyZWQgcGxhY2Vob2xkZXI9XCJDdXN0b20gRmllbGQgTGFiZWxcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMiBjb250cm9sLWxhYmVsXCI+RGF0YSBGb3JtYXQ8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tY29udHJvbC1zbVwiIGRhdGEtYmluZD1cInZhbHVlOiBmb3JtdWxhRGF0YUZvcm1hdFwiIHJlcXVpcmVkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj5TdHJpbmc8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24+SW50ZWdlcjwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj5EZWNpbWFsPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPkN1cnJlbmN5PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPkRhdGU8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJEYXRlVGltZVwiPkRhdGUgYW5kIFRpbWU8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiIGRhdGEtYmluZD1cInZpc2libGU6IGZvcm11bGFEYXRhRm9ybWF0KCkgPT0gJ0RlY2ltYWwnIHx8IGZvcm11bGFEYXRhRm9ybWF0KCkgPT0gJ0N1cnJlbmN5J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0yIGNvbnRyb2wtbGFiZWxcIj5Sb3VuZCB0byBEZWNpbWFsIFBsYWNlczwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZGF0YS1iaW5kPVwidmFsdWU6IGZvcm11bGFEZWNpbWFsUGxhY2VzXCIgcGxhY2Vob2xkZXI9XCJDaG9vc2UgRGVjaW1hbCBwbGFjZXMgKGxlYXZlIGJsYW5rIHRvIG5vdCB1c2Ugcm91bmRpbmcpXCIgdGl0bGU9XCJDaG9vc2UgRGVjaW1hbCBwbGFjZXMgKGxlYXZlIGJsYW5rIHRvIG5vdCB1c2Ugcm91bmRpbmcpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHlvdXIgRnVuY3Rpb246XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPVwiZnVuY3Rpb24tY29kZVwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsZWFyZml4XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBsYXN0UGlja2VkRmllbGQoKSAmJiBsYXN0UGlja2VkRmllbGQoKS5maWVsZFR5cGUgPT0gJ0pzb24nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDY+U2VsZWN0IERhdGEgRmllbGRzIGZyb20gPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogbGFzdFBpY2tlZEZpZWxkKCkuZmllbGROYW1lXCI+PC9zcGFuPjwvaDY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGNvbnRhaW5lci1mbHVpZFwiIGRhdGEtYmluZD1cImZvcmVhY2g6IGpzb25GaWVsZHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgY29sLXNtLTQgY29sLXhzLTYgbGlzdC1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1ncm91cC1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkSW5BcnJheToge2FycmF5OiAkcGFyZW50LlNlbGVjdGVkRmllbGRzLCB2YWx1ZTogJGRhdGF9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IGpzb25Db2x1bW5OYW1lXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiY3VzdG9tRmllbGRTZWN0aW9uXCIgZGF0YS1iaW5kPVwiaWY6IGlzRm9ybXVsYUZpZWxkXCIgY2xhc3M9XCJjdXN0b20tZmllbGQtZGVzaWduXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj5CdWlsZCBDdXN0b20gRmllbGQ8L2I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCIgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdjdXN0b20tZmllbGQtZGVzaWduZXInXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xlYXJmaXhcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImNvbC04IHB1bGwtbGVmdFwiPjxzcGFuIGNsYXNzPVwiZmEgZmEtdGFibGVcIj48L3NwYW4+Jm5ic3A7U2VsZWN0ZWQgZGF0YSBmb3IgdGhlIFJlcG9ydDwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC00IHB1bGwtcmlnaHQgcmlnaHQtYWxpZ25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cInNtYWxsIHRleHQtbXV0ZWRcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBTZWxlY3RlZEZpZWxkcygpLmxlbmd0aCwgY2xpY2s6IGZ1bmN0aW9uKCkge1NlbGVjdGVkRmllbGRzKFtdKTt9XCI+Q2xlYXIgYWxsPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ2Rlc2lnbmVyLXNlbGVjdGVkLWRhdGEnXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBsaW5rZWRSZXBvcnRGaWVsZHMoKS5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIG1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgYmctbGlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJtYi0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYm9va21hcmtcIj48L2k+IEluY2x1ZGUgU3ViIFJlcG9ydHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ2Rlc2lnbmVyLXN1Yi1yZXBvcnQnXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpPT0nSHRtbCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgbWItNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBiZy1saWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1iLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wZW5jaWxcIj48L2k+IERlc2lnbiB5b3VyIFJlcG9ydFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAnZGVzaWduZXItaHRtbCdcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1PjxzcGFuIGNsYXNzPVwiZmEgZmEtZmlsdGVyXCI+PC9zcGFuPiZuYnNwO0Nob29zZSBGaWx0ZXJzPC9oNT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDEwcHg7IG92ZXJmbG93LXg6IGF1dG87XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogdXNlU3RvcmVkUHJvY1wiIGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6IHtuYW1lOiAnZmlsdGVyLXBhcmFtZXRlcnMnfVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWZub3Q6IHVzZVN0b3JlZFByb2NcIiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiB7bmFtZTogJ2ZpbHRlci1ncm91cCd9XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveCBjb2wtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IEVkaXRGaWx0ZXJzT25SZXBvcnRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb3cgc2V0dGluZyB1cCBhbmQgc2F2aW5nIGZpbHRlcnMgb24gUmVwb3J0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImhpZGRlbjogdXNlU3RvcmVkUHJvY1wiIGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNT48c3BhbiBjbGFzcz1cImZhIGZhLXNvcnRcIj48L3NwYW4+Jm5ic3A7Q2hvb3NlIFNvcnRpbmc8L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ2Rlc2lnbmVyLXNvcnQnXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBTYXZlUmVwb3J0XCIgY2xhc3M9XCJjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1PjxzcGFuIGNsYXNzPVwiZmEgZmEtaG91cmdsYXNzXCI+PC9zcGFuPiZuYnNwO0Nob29zZSBTY2hlZHVsZTwvaDU+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEwcHggMTBweFwiIGRhdGEtYmluZD1cImlmOiBTYXZlUmVwb3J0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZToge25hbWU6ICdyZXBvcnQtc2NoZWR1bGUnfVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZm5vdDogdXNlU3RvcmVkUHJvY1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ2Rlc2lnbmVyLW9wdGlvbnMnXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6IGFkbWluTW9kZVwiIGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6IHtuYW1lOiAnbWFuYWdlLWFjY2Vzcy10ZW1wbGF0ZScsIGRhdGE6IG1hbmFnZUFjY2Vzc31cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogYWRtaW5Nb2RlLCBjbGljazogUnVuUmVwb3J0U3FsUHJldmlld1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY29kZVwiPjwvaT4gUHJldmlldyBSZXBvcnQgQ29kZVxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXJcIiBkYXRhLWJpbmQ9XCJjbGljazogY2FuY2VsQ3JlYXRlUmVwb3J0XCI+Q2FuY2VsIGVkaXRpbmcgUmVwb3J0PC9hPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBTYXZlUmVwb3J0KCkgJiYgQ2FuU2F2ZVJlcG9ydHMoKSwgY2xpY2s6IFNhdmVXaXRob3V0UnVuXCIgc3R5bGU9XCJwYWRkaW5nLXJpZ2h0OiAxMHB4O1wiPlNhdmUgUmVwb3J0PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiIGRhdGEtYmluZD1cInRleHQ6IFNhdmVSZXBvcnQoKSAmJiBDYW5TYXZlUmVwb3J0cygpPyAnU2F2ZSAmIFJ1biBSZXBvcnQnOiAnUnVuIFJlcG9ydCcsIGNsaWNrOiBSdW5SZXBvcnRcIj5SdW4gUmVwb3J0PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwiY2hhcnQtc2V0dGluZ3NcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjaGFydC1jb250YWluZXIgcHVsbC1yaWdodFwiPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG10LTIgY2hhcnQtc2V0dGluZ3MtYnRuXCJcclxuICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImNsaWNrOiB0b2dnbGVDaGFydFNldHRpbmdzXCIgdGl0bGU9XCJSZXBvcnQgc2V0dGluZ3NcIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jb2dcIj48L2k+XHJcbiAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjaGFydC1zZXR0aW5ncy1wYW5lbCBib3JkZXIgcC0yIHNoYWRvdy1zbSBiZy1saWdodFwiIGRhdGEtYmluZD1cInZpc2libGU6IHNob3dTZXR0aW5nc1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tY2xvc2VcIiBkYXRhLWJpbmQ9XCJjbGljazogdG9nZ2xlQ2hhcnRTZXR0aW5nc1wiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGg2IGNsYXNzPVwibWItMFwiPlJlcG9ydCBTZXR0aW5nczwvaDY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgPHVsIGNsYXNzPVwibmF2IG5hdi10YWJzIG5hdi1zbSBtYi0yIHNtYWxsXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpID09PSAnQmFyJyB8fCBSZXBvcnRUeXBlKCkgPT09ICdQaWUnIHx8IFJlcG9ydFR5cGUoKSA9PT0gJ0xpbmUnXCI+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibmF2LWxpbmtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYnMtdG9nZ2xlPVwidGFiXCJcclxuICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJhdHRyOiB7IGhyZWY6ICcjY2hhcnRUYWItJyArIFJlcG9ydElEKCkgfSwgY3NzOiB7IGFjdGl2ZTogUmVwb3J0VHlwZSgpID09PSAnQmFyJyB8fCBSZXBvcnRUeXBlKCkgPT09ICdQaWUnIHx8IFJlcG9ydFR5cGUoKSA9PT0gJ0xpbmUnIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRcclxuICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cIm5hdi1saW5rXCJcclxuICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJzLXRvZ2dsZT1cInRhYlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwiYXR0cjogeyBocmVmOiAnI3RhYmxlVGFiLScgKyBSZXBvcnRJRCgpIH0sIGNzczogeyBhY3RpdmU6ICEoUmVwb3J0VHlwZSgpID09PSAnQmFyJyB8fCBSZXBvcnRUeXBlKCkgPT09ICdQaWUnIHx8IFJlcG9ydFR5cGUoKSA9PT0gJ0xpbmUnKSB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1jb250ZW50IHNtYWxsXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLXBhbmUgZmFkZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImF0dHI6IHsgaWQ6ICdjaGFydFRhYi0nICsgUmVwb3J0SUQoKSB9LCBjc3M6IHsgJ3Nob3cgYWN0aXZlJzogUmVwb3J0VHlwZSgpID09PSAnQmFyJyB8fCBSZXBvcnRUeXBlKCkgPT09ICdQaWUnIHx8IFJlcG9ydFR5cGUoKSA9PT0gJ0xpbmUnIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCIgcm9sZT1cImdyb3VwXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpID09PSAnQmFyJyB8fCBSZXBvcnRUeXBlKCkgPT09ICdQaWUnIHx8IFJlcG9ydFR5cGUoKSA9PT0gJ0xpbmUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGlnaHRcIiBkYXRhLWJzLXRvZ2dsZT1cInRvb2x0aXBcIiB0aXRsZT1cIkJhciBDaGFydFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImNzczogeyAnYWN0aXZlJzogUmVwb3J0VHlwZSgpID09PSAnQmFyJyB9LCBjbGljazogZnVuY3Rpb24oKSB7IFJlcG9ydFR5cGUoJ0JhcicpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1iYXItY2hhcnRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1saWdodFwiIGRhdGEtYnMtdG9nZ2xlPVwidG9vbHRpcFwiIHRpdGxlPVwiUGllIENoYXJ0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwiY3NzOiB7ICdhY3RpdmUnOiBSZXBvcnRUeXBlKCkgPT09ICdQaWUnIH0sIGNsaWNrOiBmdW5jdGlvbigpIHsgUmVwb3J0VHlwZSgnUGllJyk7IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXBpZS1jaGFydFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0XCIgZGF0YS1icy10b2dnbGU9XCJ0b29sdGlwXCIgdGl0bGU9XCJMaW5lIENoYXJ0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwiY3NzOiB7ICdhY3RpdmUnOiBSZXBvcnRUeXBlKCkgPT09ICdMaW5lJyB9LCBjbGljazogZnVuY3Rpb24oKSB7IFJlcG9ydFR5cGUoJ0xpbmUnKTsgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtbGluZS1jaGFydFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6IFJlcG9ydFR5cGUoKT09J0JhcidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3ggY29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IGJhckNoYXJ0SG9yaXpvbnRhbFwiIC8+IEhvcml6b250YWw8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3ggY29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IGJhckNoYXJ0U3RhY2tlZFwiIC8+IFN0YWNrZWQ8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpPT0nUGllJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveCBjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogcGllQ2hhcnREb251dFwiIC8+IERvbnV0PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6IFJlcG9ydFR5cGUoKT09J0xpbmUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94IGNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBsaW5lQ2hhcnRBcmVhXCIgLz4gQXJlYTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBzbWFsbFwiPkJhY2tncm91bmQgQ29sb3I8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LXdyYXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBjbGFzcz1cImNvbG9yLXBpY2tlclwiIGRhdGEtYmluZD1cInZhbHVlOiBjaGFydE9wdGlvbnMoKS5iYWNrZ3JvdW5kQ29sb3IsIGF0dHI6IHsgcGxhY2Vob2xkZXI6ICdTZWxlY3QnIH0sIGV2ZW50OiB7IGNoYW5nZTogdXBkYXRlQ2hhcnQgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsXCI+Rm9udCBDb2xvcjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtd3JhcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIGNsYXNzPVwiY29sb3ItcGlja2VyXCIgZGF0YS1iaW5kPVwidmFsdWU6IGNoYXJ0T3B0aW9ucygpLmZvbnRDb2xvciwgYXR0cjogeyBwbGFjZWhvbGRlcjogJ1NlbGVjdCcgfSwgZXZlbnQ6IHsgY2hhbmdlOiB1cGRhdGVDaGFydCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5TZXJpZXMgQ29sb3JzPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LXdyYXBcIiBkYXRhLWJpbmQ9XCJmb3JlYWNoOiBjaGFydE9wdGlvbnMoKS5zZXJpZXNDb2xvcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xvci1ib3ggbWUtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBjbGFzcz1cImNvbG9yLXBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cInZhbHVlOiAkZGF0YSwgZXZlbnQ6IHsgaW5wdXQ6IGZ1bmN0aW9uKGRhdGEsIGV2ZW50KSB7ICRwYXJlbnQudXBkYXRlU2VyaWVzQ29sb3IoJGluZGV4KCksIGV2ZW50LnRhcmdldC52YWx1ZSk7IH0gfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1kYW5nZXIgcmVtb3ZlLWNvbG9yXCIgZGF0YS1iaW5kPVwiY2xpY2s6ICRwYXJlbnQucmVtb3ZlU2VyaWVzQ29sb3JcIj4mdGltZXM7PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb2xvci1ib3ggYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGFkZFNlcmllc0NvbG9yXCIgdGl0bGU9XCJBZGQgU2VyaWVzIENvbG9yXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAtN3B4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wbHVzXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIG1iLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5MZWdlbmQgUG9zaXRpb248L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tc2VsZWN0LXNtXCIgZGF0YS1iaW5kPVwidmFsdWU6IGNoYXJ0T3B0aW9ucygpLmxlZ2VuZFBvc2l0aW9uLCBldmVudDogeyBjaGFuZ2U6IHVwZGF0ZUNoYXJ0IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicmlnaHRcIj5SaWdodDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ0b3BcIj5Ub3A8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYm90dG9tXCI+Qm90dG9tPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm5vbmVcIj5Ob25lPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsXCI+Rm9udCBTaXplPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtIGZvbnQtc2l6ZS1pbnB1dFwiIGRhdGEtYmluZD1cInZhbHVlOiBjaGFydE9wdGlvbnMoKS5mb250U2l6ZSwgZXZlbnQ6IHsgY2hhbmdlOiB1cGRhdGVDaGFydCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpIT0nUGllJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLXN3aXRjaCBzbWFsbCBtYi0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogY2hhcnRPcHRpb25zKCkuc2hvd1hBeGlzTGFiZWwsIGV2ZW50OiB7IGNoYW5nZTogdXBkYXRlQ2hhcnQgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiPlgtQXhpcyBMYWJlbDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLXN3aXRjaCBzbWFsbCBtYi0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogY2hhcnRPcHRpb25zKCkuc2hvd1lBeGlzTGFiZWwsIGV2ZW50OiB7IGNoYW5nZTogdXBkYXRlQ2hhcnQgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiPlktQXhpcyBMYWJlbDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLXN3aXRjaCBzbWFsbCBtYi0xXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpICE9PSAnUGllJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IGNoYXJ0T3B0aW9ucygpLnNob3dHcmlkbGluZXMsIGV2ZW50OiB7IGNoYW5nZTogdXBkYXRlQ2hhcnQgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiPkdyaWRsaW5lczwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLXN3aXRjaCBzbWFsbCBtYi0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogY2hhcnRPcHRpb25zKCkuc2hvd1NtYWxsVmFsdWVzT25MYWJlbCwgZXZlbnQ6IHsgY2hhbmdlOiB1cGRhdGVDaGFydCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCI+U2hvdyBTbWFsbCBWYWx1ZXMgT24gTGFiZWw8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgc21hbGwgbWItMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlktQXhpcyBGb3JtYXQ8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgcGxhY2Vob2xkZXI9XCIjLCMjMC4wMFwiIGRhdGEtYmluZD1cInZhbHVlOiBjaGFydE9wdGlvbnMoKS55QXhpc0Zvcm1hdCwgZXZlbnQ6IHsgY2hhbmdlOiB1cGRhdGVDaGFydCB9XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHNtYWxsIG1iLTEgZC1mbGV4IGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy01MFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5ZLUF4aXMgTWluPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbVwiIGRhdGEtYmluZD1cInZhbHVlOiBjaGFydE9wdGlvbnMoKS55TWluLCBldmVudDogeyBjaGFuZ2U6IHVwZGF0ZUNoYXJ0IH1cIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy01MFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5ZLUF4aXMgTWF4PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbVwiIGRhdGEtYmluZD1cInZhbHVlOiBjaGFydE9wdGlvbnMoKS55TWF4LCBldmVudDogeyBjaGFuZ2U6IHVwZGF0ZUNoYXJ0IH1cIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1wYW5lIGZhZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJhdHRyOiB7IGlkOiAndGFibGVUYWItJyArIFJlcG9ydElEKCkgfSwgY3NzOiB7ICdzaG93IGFjdGl2ZSc6ICEoUmVwb3J0VHlwZSgpID09PSAnQmFyJyB8fCBSZXBvcnRUeXBlKCkgPT09ICdQaWUnIHx8IFJlcG9ydFR5cGUoKSA9PT0gJ0xpbmUnKSB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yIGNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsXCI+SGVhZGVyIEJhY2sgQ29sb3I8L2xhYmVsPjxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIGNsYXNzPVwiY29sb3ItcGlja2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJhdHRyOiB7IGlkOiAndGJsLWNvbG9yLXBpY2tlci0nICsgUmVwb3J0SUQoKX0gLCB2YWx1ZTogdGFibGVTZXR0aW5ncygpLmhlYWRlckJhY2tDb2xvciwgZXZlbnQ6IHsgY2hhbmdlOiB1cGRhdGVUYWJsZSB9XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTIgY29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5IZWFkZXIgRm9udCBDb2xvcjwvbGFiZWw+PGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgY2xhc3M9XCJjb2xvci1waWNrZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImF0dHI6IHsgaWQ6ICd0YmwtY29sb3ItcGlja2VyLScgKyBSZXBvcnRJRCgpfSAsdmFsdWU6IHRhYmxlU2V0dGluZ3MoKS5oZWFkZXJGb250Q29sb3IsIGV2ZW50OiB7IGNoYW5nZTogdXBkYXRlVGFibGUgfVwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yIGNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsXCI+Um93IEJhY2sgQ29sb3I8L2xhYmVsPjxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIGNsYXNzPVwiY29sb3ItcGlja2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJhdHRyOiB7IGlkOiAndGJsLWNvbG9yLXBpY2tlci0nICsgUmVwb3J0SUQoKX0gLHZhbHVlOiB0YWJsZVNldHRpbmdzKCkucm93QmFja0NvbG9yLCBldmVudDogeyBjaGFuZ2U6IHVwZGF0ZVRhYmxlIH1cIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMiBjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBzbWFsbFwiPlJvdyBGb250IENvbG9yPC9sYWJlbD48YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBjbGFzcz1cImNvbG9yLXBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwiYXR0cjogeyBpZDogJ3RibC1jb2xvci1waWNrZXItJyArIFJlcG9ydElEKCl9ICx2YWx1ZTogdGFibGVTZXR0aW5ncygpLnJvd0ZvbnRDb2xvciwgZXZlbnQ6IHsgY2hhbmdlOiB1cGRhdGVUYWJsZSB9XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yIGNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsXCI+QWx0IFJvdyBCYWNrIENvbG9yPC9sYWJlbD48YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBjbGFzcz1cImNvbG9yLXBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwidmFsdWU6IHRhYmxlU2V0dGluZ3MoKS5hbHRSb3dCYWNrQ29sb3IsIGV2ZW50OiB7IGNoYW5nZTogdXBkYXRlVGFibGUgfVwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yIGNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsXCI+QWx0IFJvdyBGb250IENvbG9yPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBjbGFzcz1cImNvbG9yLXBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwidmFsdWU6IHRhYmxlU2V0dGluZ3MoKS5hbHRSb3dGb250Q29sb3IsIGV2ZW50OiB7IGNoYW5nZTogdXBkYXRlVGFibGUgfVwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgbWItMlwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBzbWFsbFwiPkJvcmRlcnM8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGQtZmxleCBmbGV4LXdyYXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBidG4tc20gZmxleC1maWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IHRhYmxlU2V0dGluZ3MoKS5ib3JkZXIoJ25vbmUnKTsgdXBkYXRlVGFibGUoKTsgfSwgY3NzOiB7IGFjdGl2ZTogdGFibGVTZXR0aW5ncygpLmJvcmRlciA9PT0gJ25vbmUnIH1cIj5Ob25lPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGlnaHQgYnRuLXNtIGZsZXgtZmlsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyB0YWJsZVNldHRpbmdzKCkuYm9yZGVyKCdhbGwnKTsgdXBkYXRlVGFibGUoKTsgfSwgY3NzOiB7IGFjdGl2ZTogdGFibGVTZXR0aW5ncygpLmJvcmRlciA9PT0gJ2FsbCcgfVwiPkFsbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbSBmbGV4LWZpbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgdGFibGVTZXR0aW5ncygpLmJvcmRlcignb3V0ZXInKTsgdXBkYXRlVGFibGUoKTsgfSwgY3NzOiB7IGFjdGl2ZTogdGFibGVTZXR0aW5ncygpLmJvcmRlciA9PT0gJ291dGVyJyB9XCI+T3V0c2lkZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbSBmbGV4LWZpbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgdGFibGVTZXR0aW5ncygpLmJvcmRlcignaW5uZXInKTsgdXBkYXRlVGFibGUoKTsgfSwgY3NzOiB7IGFjdGl2ZTogdGFibGVTZXR0aW5ncygpLmJvcmRlciA9PT0gJ2lubmVyJyB9XCI+SW5zaWRlPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMiBjb2wtNlwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5Cb3JkZXIgQ29sb3I8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIGNsYXNzPVwiY29sb3ItcGlja2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cInZhbHVlOiB0YWJsZVNldHRpbmdzKCkuYm9yZGVyQ29sb3IsIGV2ZW50OiB7IGNoYW5nZTogdXBkYXRlVGFibGUgfVwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yIGNvbC02IGQtZmxleCBhbGlnbi1pdGVtcy1lbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBzbWFsbCBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogY2xlYXJUYWJsZVNldHRpbmdzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xlYXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuXHJcbjxkaXYgY2xhc3M9XCJtb2RhbFwiIGlkPVwiZHJpbGxkb3duTW9kYWxcIiB0YWJpbmRleD1cIi0xXCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1sZ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCIgZGF0YS1iaW5kPVwid2l0aDogQ2hhcnREcmlsbERvd25EYXRhXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+RHJpbGxkb3duIERhdGE8L2g0PlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2UgcHVsbC1yaWdodFwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tIGtvIGlmOiBEcmlsbERvd25EYXRhIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm92ZXJmbG93LXg6IGF1dG87IG1heC1oZWlnaHQ6IDUwMHB4OyBvdmVyZmxvdy15OiBhdXRvO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLXN0cmlwZWQgdGFibGUtaG92ZXIgdGFibGUtY29uZGVuc2VkXCIgZGF0YS1iaW5kPVwid2l0aDogRHJpbGxEb3duRGF0YSwgYXR0cjoge2NsYXNzOiAndGFibGUgdGFibGUtc3RyaXBlZCB0YWJsZS1ob3ZlciB0YWJsZS1jb25kZW5zZWQgJyArICRwYXJlbnQuc2VsZWN0ZWRTdHlsZSgpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQgc3R5bGU9XCJwb3NpdGlvbjogc3RpY2t5OyB0b3A6IC0xcHg7IHotaW5kZXg6IDI7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJuby1oaWdobGlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IENvbHVtbnMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGRhdGEtYmluZD1cImF0dHI6IHsgaWQ6IGZpZWxkSWQgfSwgY3NzOiB7J3JpZ2h0LWFsaWduJzogSXNOdW1lcmljfSwgc3R5bGU6IHsnd2lkdGgnOiBmaWVsZFdpZHRoLCAnYmFja2dyb3VuZC1jb2xvcic6IGhlYWRlckJhY2tDb2xvciB9LCBoaWRkZW46IG91dGVyR3JvdXBcIiBzdHlsZT1cImJvcmRlci1yaWdodDogMXB4IHNvbGlkO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBmaWVsZExhYmVsMigpID8gZmllbGRMYWJlbDIoKSA6IChmaWVsZExhYmVsKCkgPyBmaWVsZExhYmVsKCkgOiBmaWVsZE5hbWUpLCBzdHlsZTogeydjb2xvcic6IGhlYWRlckZvbnRDb2xvciwgJ2ZvbnQtd2VpZ2h0JzogaGVhZGVyRm9udEJvbGQoKSA/ICdib2xkJyA6ICdub3JtYWwnfVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSb3dzICYmIFJvd3MubGVuZ3RoIDwgMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBkYXRhLWJpbmQ9XCJhdHRyOntjb2xzcGFuOiBDb2x1bW5zLmxlbmd0aH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gcmVjb3JkcyBmb3VuZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiBSb3dzICAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IEl0ZW1zIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBkYXRhLWJpbmQ9XCJoaWRkZW46IG91dGVyR3JvdXAsIHN0eWxlOiB7J2JhY2tncm91bmQtY29sb3InOiBiYWNrQ29sb3IsICdjb2xvcic6IGZvbnRDb2xvciwgJ2ZvbnQtd2VpZ2h0JzogZm9udEJvbGQoKSA/ICdib2xkJyA6ICdub3JtYWwnIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJzdHlsZTogeyd3aWR0aCc6IGZpZWxkV2lkdGggfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogTGlua1RvLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBkYXRhLWJpbmQ9XCJhdHRyOiB7aHJlZjogTGlua1RvfVwiIHRhcmdldD1cIl9ibGFua1wiPjxzcGFuIGRhdGEtYmluZD1cImh0bWw6IGZvcm1hdHRlZFZhbFwiPjwvc3Bhbj48L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIC9rby0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZm5vdDogTGlua1RvLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJodG1sOiBmb3JtYXR0ZWRWYWxcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIC9rby0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC14cy0xMiBjb2wtY2VudGVyZWRcIiBkYXRhLWJpbmQ9XCJ3aXRoOiBwYWdlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWlubGluZSBzbWFsbCB0ZXh0LW11dGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnQgdG90YWwtcmVjb3Jkc1wiIGRhdGEtYmluZD1cInZpc2libGU6IHBhZ2VzKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInRleHQ6ICdUb3RhbCBSZWNvcmRzOiAnICsgdG90YWxSZWNvcmRzKClcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi14c1wiIHRpdGxlPVwiRG93bmxvYWQgRXhjZWxcIiBkYXRhLWJpbmQ9XCJjbGljazogJHBhcmVudC5leHBvcnRFeGNlbFwiPjxzcGFuIGNsYXNzPVwiZmEgZmEtZmlsZS1leGNlbC1vXCI+PC9zcGFuPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IGJ0bi1zbVwiIGRhdGEtYnMtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLWJzLXRhcmdldD1cIiNzcWxEcmlsbERvd25Nb2RhbFwiIGRhdGEtYmluZD1cInZpc2libGU6ICRyb290LmFkbWluTW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtY29kZVwiPjwvc3Bhbj4gVmlldyBDb2RlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHB1bGwtcmlnaHRcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBwYWdlcygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAncGFnZXItdGVtcGxhdGUnLCBkYXRhOiAkZGF0YVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwibW9kYWxcIiBpZD1cInNxbE1vZGFsXCIgdGFiaW5kZXg9XCItMVwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgbW9kYWwtbGdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+UmVwb3J0IENvZGU8L2g0PlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnkgYnRuLXNtIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oZGF0YSwgZXZlbnQpIHsgY29weVNxbFRvQ2xpcGJvYXJkKGV2ZW50LnRhcmdldCk7IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNsaXBib2FyZFwiPjwvaT4mbmJzcDtDb3B5XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlIHB1bGwtcmlnaHRcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIiBkYXRhLWJpbmQ9XCJ3aXRoOiBSZXBvcnRSZXN1bHRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJyZXBvcnRTcWxDb2RlXCIgc3R5bGU9XCJvdmVyZmxvdy14OiBhdXRvOyBtYXgtaGVpZ2h0OiA1MDBweDsgb3ZlcmZsb3cteTogc2Nyb2xsOyBib3JkZXI6IDFweCBzb2xpZDsgcGFkZGluZzogMTBweDtcIiBjbGFzcz1cImJnLWRhcmsgdGV4dC1saWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwcmU+PGNvZGUgZGF0YS1iaW5kPVwiaHRtbDogUmVwb3J0U3FsXCIgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XCI+PC9jb2RlPjwvcHJlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiBjbGFzcz1cIm1vZGFsXCIgaWQ9XCJzcWxEcmlsbERvd25Nb2RhbFwiIHRhYmluZGV4PVwiLTFcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWxnXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIiBkYXRhLWJpbmQ9XCJ3aXRoOkNoYXJ0RHJpbGxEb3duRGF0YVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+RHJpbGwgRG93biBSZXBvcnQgQ29kZTwvaDQ+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBidG4tc20gZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbihkYXRhLCBldmVudCkgeyBjb3B5U3FsVG9DbGlwYm9hcmQoZXZlbnQudGFyZ2V0KTsgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2xpcGJvYXJkXCI+PC9pPiZuYnNwO0NvcHlcclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2UgcHVsbC1yaWdodFwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIGRhdGEtYmluZD1cIndpdGg6RHJpbGxEb3duRGF0YVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBpZD1cInJlcG9ydFNxbENvZGVcIiBzdHlsZT1cIm92ZXJmbG93LXg6IGF1dG87IG1heC1oZWlnaHQ6IDUwMHB4OyBvdmVyZmxvdy15OiBzY3JvbGw7IGJvcmRlcjogMXB4IHNvbGlkOyBwYWRkaW5nOiAxMHB4O1wiIGNsYXNzPVwiYmctZGFyayB0ZXh0LWxpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHByZT48Y29kZSBkYXRhLWJpbmQ9XCJodG1sOiBSZXBvcnRTcWxcIiBzdHlsZT1cIndoaXRlLXNwYWNlOiBwcmUtd3JhcDtcIj48L2NvZGU+PC9wcmU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcbjxkaXYgY2xhc3M9XCJtb2RhbFwiIGlkPVwibm9hY2NvdW50TW9kYWxcIiB0YWJpbmRleD1cIi0xXCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+QWNjb3VudCBub3QgU2V0dXA8L2g0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyXCI+ZG90bmV0IFJlcG9ydCBBY2NvdW50IENvbmZpZ3VyYXRpb24gbWlzc2luZyE8L3A+XHJcbiAgICAgICAgICAgICAgICA8cD5Zb3UgZG8gbm90IGhhdmUgdGhlIG5lY2Nlc3NhcnkgaW5pdGlhbCBjb25maWd1cmF0aW9uIGNvbXBsZXRlZCB0byB1c2UgZG90bmV0IFJlcG9ydC48L3A+XHJcbiAgICAgICAgICAgICAgICA8cD5QbGVhc2UgdmlldyB0aGUgPGEgaHJlZj1cImh0dHBzOi8vZG90bmV0cmVwb3J0LmNvbS9ibG9ncy9nZXR0aW5nLXN0YXJ0ZWQtd2l0aC1kb3RuZXQtcmVwb3J0L1wiIHRhcmdldD1cIl9ibGFua1wiPkdldHRpbmcgU3RhcnRlZCBHdWlkZTwvYT4gdG8gY29ycmVjdGx5IGNvbmZpZ3VyZSBkb3RuZXQgUmVwb3J0LjwvcD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIj5DbG9zZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJwZGYtb3B0aW9ucy1zY2hlZHVsZS10ZW1wbGF0ZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctY2VudGVyZWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiIGRhdGEtYmluZD1cIndpdGg6IFBkZlBhZ2VcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cInBkZk9wdGlvbnNTY2hlZHVsZU1vZGFsTGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWZpbGUtcGRmLW8gbWUtMlwiPjwvaT4gU2V0IFBERiBQYWdlIFNpemVcclxuICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSByb3cgZy0wXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTUgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInBhZ2VQcmV2aWV3Qm94XCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogc2VsZWN0ZWRXaWR0aCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBzZWxlY3RlZEhlaWdodCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBzZWxlY3RlZEJhY2tncm91bmRTdHlsZSgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogJ2FsbCAwLjNzIGVhc2UnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2hhZG93IHJvdW5kZWQgbXgtYXV0byBtYi0yIGJvcmRlciBwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwb3NpdGlvbi1hYnNvbHV0ZSB0b3AtNTAgc3RhcnQtNTAgdHJhbnNsYXRlLW1pZGRsZSB0ZXh0LW11dGVkIHNtYWxsXCI+UHJldmlldzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGV4dDogc2VsZWN0ZWRQYWdlTGFiZWxcIiBjbGFzcz1cImZ3LWJvbGRcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZXh0OiBzZWxlY3RlZFBhZ2VEaW1lbnNpb25cIiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBhZ2VTaXplU2VsZWN0XCIgY2xhc3M9XCJmb3JtLWxhYmVsIGZ3LWJvbGRcIj5QYWdlIFNpemU6PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgaWQ9XCJwYWdlU2l6ZVNlbGVjdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwib3B0aW9uczogYXZhaWxhYmxlUGFnZVNpemVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1RleHQ6ICdsYWJlbCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVmFsdWU6ICd2YWx1ZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VsZWN0ZWRQYWdlU2l6ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGFnZU9yaWVudGF0aW9uU2VsZWN0XCIgY2xhc3M9XCJmb3JtLWxhYmVsIGZ3LWJvbGRcIj5QYWdlIE9yaWVudGF0aW9uOjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGlkPVwicGFnZU9yaWVudGF0aW9uU2VsZWN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJvcHRpb25zOiBhdmFpbGFibGVQYWdlT3JpZW50YXRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVGV4dDogJ2xhYmVsJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNWYWx1ZTogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZWxlY3RlZFBhZ2VPcmllbnRhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mbyBwLTIgc21hbGwgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIFBERiB3aWxsIGJlIGV4cG9ydGVkIHVzaW5nIHRoZSBzZWxlY3RlZCBwYWdlIHNpemUuIEVuc3VyZSB5b3VyIGNvbnRlbnQgZml0cyB3ZWxsLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgY29udGVudCB3aWR0aCBleGNlZWRzIHRoZSBzZWxlY3RlZCBzaXplLCBpdCB3aWxsIGRlZmF1bHQgdG8gTGV0dGVyLlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGlnaHRcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiIGRhdGEtYmluZD1cImNsaWNrOiBzYXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgIFNhdmVcclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJ3b3JkLW9wdGlvbnMtc2NoZWR1bGUtdGVtcGxhdGVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLWNlbnRlcmVkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIiBkYXRhLWJpbmQ9XCJ3aXRoOiBXb3JkUGFnZVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGlkPVwicGRmT3B0aW9uc1NjaGVkdWxlTW9kYWxMYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZmlsZS1wZGYtbyBtZS0yXCI+PC9pPiBTZXQgV09SRCBQYWdlIFNpemVcclxuICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSByb3cgZy0wXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTUgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInBhZ2VQcmV2aWV3Qm94XCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogc2VsZWN0ZWRXaWR0aCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBzZWxlY3RlZEhlaWdodCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBzZWxlY3RlZEJhY2tncm91bmRTdHlsZSgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogJ2FsbCAwLjNzIGVhc2UnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2hhZG93IHJvdW5kZWQgbXgtYXV0byBtYi0yIGJvcmRlciBwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwb3NpdGlvbi1hYnNvbHV0ZSB0b3AtNTAgc3RhcnQtNTAgdHJhbnNsYXRlLW1pZGRsZSB0ZXh0LW11dGVkIHNtYWxsXCI+UHJldmlldzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGV4dDogc2VsZWN0ZWRQYWdlTGFiZWxcIiBjbGFzcz1cImZ3LWJvbGRcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZXh0OiBzZWxlY3RlZFBhZ2VEaW1lbnNpb25cIiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBhZ2VTaXplU2VsZWN0XCIgY2xhc3M9XCJmb3JtLWxhYmVsIGZ3LWJvbGRcIj5QYWdlIFNpemU6PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgaWQ9XCJwYWdlU2l6ZVNlbGVjdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwib3B0aW9uczogYXZhaWxhYmxlUGFnZVNpemVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1RleHQ6ICdsYWJlbCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVmFsdWU6ICd2YWx1ZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VsZWN0ZWRQYWdlU2l6ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGFnZU9yaWVudGF0aW9uU2VsZWN0XCIgY2xhc3M9XCJmb3JtLWxhYmVsIGZ3LWJvbGRcIj5QYWdlIE9yaWVudGF0aW9uOjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGlkPVwicGFnZU9yaWVudGF0aW9uU2VsZWN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJvcHRpb25zOiBhdmFpbGFibGVQYWdlT3JpZW50YXRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVGV4dDogJ2xhYmVsJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNWYWx1ZTogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZWxlY3RlZFBhZ2VPcmllbnRhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mbyBwLTIgc21hbGwgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIFdPUkQgd2lsbCBiZSBleHBvcnRlZCB1c2luZyB0aGUgc2VsZWN0ZWQgcGFnZSBzaXplLiBFbnN1cmUgeW91ciBjb250ZW50IGZpdHMgd2VsbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIGNvbnRlbnQgd2lkdGggZXhjZWVkcyB0aGUgc2VsZWN0ZWQgc2l6ZSwgaXQgd2lsbCBkZWZhdWx0IHRvIExldHRlci5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0XCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zdWNjZXNzXCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIiBkYXRhLWJpbmQ9XCJjbGljazogc2F2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICBTYXZlXHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9zY3JpcHQ+XHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwid29yZC1vcHRpb25zLXRlbXBsYXRlXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctY2VudGVyZWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiIGRhdGEtYmluZD1cIndpdGg6IFdvcmRQYWdlXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlXCIgaWQ9XCJ3b3JkT3B0aW9uc01vZGFsTGFiZWxcIj48aSBjbGFzcz1cImZhIGZhLWZpbGUtcGRmLW8gbWUtMlwiPjwvaT4gRXhwb3J0IHRvIFdPUkQ8L2g1PlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHkgcm93IGctMFwiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBMZWZ0IFNpZGU6IFBhZ2UgUHJldmlldyBTVkcgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTUgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInBhZ2VQcmV2aWV3Qm94XCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogc2VsZWN0ZWRXaWR0aCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBzZWxlY3RlZEhlaWdodCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBzZWxlY3RlZEJhY2tncm91bmRTdHlsZSgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogJ2FsbCAwLjNzIGVhc2UnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2hhZG93IHJvdW5kZWQgbXgtYXV0byBtYi0yIGJvcmRlciBwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwb3NpdGlvbi1hYnNvbHV0ZSB0b3AtNTAgc3RhcnQtNTAgdHJhbnNsYXRlLW1pZGRsZSB0ZXh0LW11dGVkIHNtYWxsXCI+UHJldmlldzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGV4dDogc2VsZWN0ZWRQYWdlTGFiZWxcIiBjbGFzcz1cImZ3LWJvbGRcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZXh0OiBzZWxlY3RlZFBhZ2VEaW1lbnNpb25cIiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gUmlnaHQgU2lkZTogRm9ybSBPcHRpb25zIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBhZ2VTaXplU2VsZWN0XCIgY2xhc3M9XCJmb3JtLWxhYmVsIGZ3LWJvbGRcIj5QYWdlIFNpemU6PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgaWQ9XCJwYWdlU2l6ZVNlbGVjdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwib3B0aW9uczogYXZhaWxhYmxlUGFnZVNpemVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1RleHQ6ICdsYWJlbCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVmFsdWU6ICd2YWx1ZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VsZWN0ZWRQYWdlU2l6ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGFnZU9yaWVudGF0aW9uU2VsZWN0XCIgY2xhc3M9XCJmb3JtLWxhYmVsIGZ3LWJvbGRcIj5QYWdlIE9yaWVudGF0aW9uOjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGlkPVwicGFnZU9yaWVudGF0aW9uU2VsZWN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJvcHRpb25zOiBhdmFpbGFibGVQYWdlT3JpZW50YXRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVGV4dDogJ2xhYmVsJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNWYWx1ZTogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZWxlY3RlZFBhZ2VPcmllbnRhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mbyBwLTIgc21hbGwgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIFdvcmQgd2lsbCBiZSBleHBvcnRlZCB1c2luZyB0aGUgc2VsZWN0ZWQgcGFnZSBzaXplLiBFbnN1cmUgeW91ciBjb250ZW50IGZpdHMgd2VsbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIGNvbnRlbnQgd2lkdGggZXhjZWVkcyB0aGUgc2VsZWN0ZWQgc2l6ZSwgaXQgd2lsbCBkZWZhdWx0IHRvIExldHRlci5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0XCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zdWNjZXNzXCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIiBkYXRhLWJpbmQ9XCJjbGljazogZG93bmxvYWRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWRvd25sb2FkIG1lLTFcIj48L2k+IERvd25sb2FkIFdPUkRcclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJwZGYtb3B0aW9ucy10ZW1wbGF0ZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctY2VudGVyZWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiIGRhdGEtYmluZD1cIndpdGg6IFBkZlBhZ2VcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cInBkZk9wdGlvbnNNb2RhbExhYmVsXCI+PGkgY2xhc3M9XCJmYSBmYS1maWxlLXBkZi1vIG1lLTJcIj48L2k+IEV4cG9ydCB0byBQREY8L2g1PlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHkgcm93IGctMFwiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBMZWZ0IFNpZGU6IFBhZ2UgUHJldmlldyBTVkcgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTUgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInBhZ2VQcmV2aWV3Qm94XCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogc2VsZWN0ZWRXaWR0aCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBzZWxlY3RlZEhlaWdodCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBzZWxlY3RlZEJhY2tncm91bmRTdHlsZSgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogJ2FsbCAwLjNzIGVhc2UnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2hhZG93IHJvdW5kZWQgbXgtYXV0byBtYi0yIGJvcmRlciBwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwb3NpdGlvbi1hYnNvbHV0ZSB0b3AtNTAgc3RhcnQtNTAgdHJhbnNsYXRlLW1pZGRsZSB0ZXh0LW11dGVkIHNtYWxsXCI+UHJldmlldzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGV4dDogc2VsZWN0ZWRQYWdlTGFiZWxcIiBjbGFzcz1cImZ3LWJvbGRcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZXh0OiBzZWxlY3RlZFBhZ2VEaW1lbnNpb25cIiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gUmlnaHQgU2lkZTogRm9ybSBPcHRpb25zIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBhZ2VTaXplU2VsZWN0XCIgY2xhc3M9XCJmb3JtLWxhYmVsIGZ3LWJvbGRcIj5QYWdlIFNpemU6PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgaWQ9XCJwYWdlU2l6ZVNlbGVjdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwib3B0aW9uczogYXZhaWxhYmxlUGFnZVNpemVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1RleHQ6ICdsYWJlbCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVmFsdWU6ICd2YWx1ZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VsZWN0ZWRQYWdlU2l6ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGFnZU9yaWVudGF0aW9uU2VsZWN0XCIgY2xhc3M9XCJmb3JtLWxhYmVsIGZ3LWJvbGRcIj5QYWdlIE9yaWVudGF0aW9uOjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGlkPVwicGFnZU9yaWVudGF0aW9uU2VsZWN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJvcHRpb25zOiBhdmFpbGFibGVQYWdlT3JpZW50YXRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVGV4dDogJ2xhYmVsJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNWYWx1ZTogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZWxlY3RlZFBhZ2VPcmllbnRhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mbyBwLTIgc21hbGwgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIFBERiB3aWxsIGJlIGV4cG9ydGVkIHVzaW5nIHRoZSBzZWxlY3RlZCBwYWdlIHNpemUuIEVuc3VyZSB5b3VyIGNvbnRlbnQgZml0cyB3ZWxsLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgY29udGVudCB3aWR0aCBleGNlZWRzIHRoZSBzZWxlY3RlZCBzaXplLCBpdCB3aWxsIGRlZmF1bHQgdG8gTGV0dGVyLlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGlnaHRcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiIGRhdGEtYmluZD1cImNsaWNrOiBkb3dubG9hZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZG93bmxvYWQgbWUtMVwiPjwvaT4gRG93bmxvYWQgUERGXHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9zY3JpcHQ+XHJcbmApO1xyXG4gICAgdGhpcy5jZHJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG4gIFxyXG4gIHByaXZhdGUgYmluZFdpbmRvd1Jlc2l6ZSh2bTogYW55KTogdm9pZCB7XHJcbiAgICAkKHdpbmRvdykucmVzaXplKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAodm0ucmVwb3J0TW9kZSA9PSBcImV4ZWN1dGVcIikge1xyXG4gICAgICAgICAgICB2bS5EcmF3Q2hhcnQoKVxyXG4gICAgICAgIH07XHJcbiAgICB9KTtcclxuICB9XHJcbiAgXHJcbiAgXHJcbiAgfVxyXG4iLCI8ZGl2IGlkPVwiZG90LW5ldC1yZXBvcnRcIiBjbGFzcz1cImJvZHktY29udGVudFwiPlxyXG48ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+XHJcbiAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiB7bmFtZTogJ2FkbWluLW1vZGUtdGVtcGxhdGUnfSwgdmlzaWJsZTogYWxsb3dBZG1pblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj48L2Rpdj5cclxuXHJcbiAgICA8IS0tXHJcbiAgICAgICAgVGhlIG1hcmt1cCBjb2RlIGJlbG93IGlzIHJlbGF0ZWQgdG8gcHJlc2VudGF0aW9uLiBZb3UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UgaXQsIHVubGVzcyB5b3VcclxuICAgICAgICBpbnRlbnRpb25hbGx5IHdhbnQgdG8gY2hhbmdlIHNvbWV0aGluZyBpbiB0aGUgUmVwb3J0IEJ1aWxkZXIncyBiZWhhdmlvciBpbiB5b3VyIEFwcGxpY2F0aW9uLlxyXG4gICAgICAgIEl0J3MgUmVjb21tZW5kZWQgeW91IHVzZSBpdCBhcyBpcy4gWW91IHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIGFuZCBtYWludGFpbmluZyBhbnkgY2hhbmdlcy5cclxuICAgIC0tPlxyXG4gICAgPCEtLSBGb2xkZXJzL1JlcG9ydCBMaXN0IC0tPlxyXG4gICAgPGRpdiBpZD1cInJlcG9ydC1zdGFydFwiIGRhdGEtYmluZD1cImlmOiBSZXBvcnRNb2RlKCkgPT0gJ3N0YXJ0JyB8fCBSZXBvcnRNb2RlKCkgPT0gJ2dlbmVyYXRlJ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGZvbGRlci1wYW5lbFwiIGRhdGEtYmluZD1cInZpc2libGU6IHRydWVcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPG5hdiBjbGFzcz1cIm5hdmJhciBuYXZiYXItZXhwYW5kLWxnIG5hdmJhci1saWdodCBiZy1saWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibmF2YmFyLWJyYW5kXCIgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKSB7U2VsZWN0ZWRGb2xkZXIobnVsbCk7IGRlc2lnbmluZ0hlYWRlcihmYWxzZSk7IHNlYXJjaFJlcG9ydHMoJycpOyAkKCcjc2VhcmNoLXJlcG9ydCcpLnZhbChbXSkudHJpZ2dlcignY2hhbmdlJyk7IH1cIj5NYW5hZ2UgUmVwb3J0czwvYT5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwibmF2YmFyLXRvZ2dsZXJcIiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1icy10b2dnbGU9XCJjb2xsYXBzZVwiIGRhdGEtYnMtdGFyZ2V0PVwiI25hdmJhclN1cHBvcnRlZENvbnRlbnRcIiBhcmlhLWNvbnRyb2xzPVwibmF2YmFyU3VwcG9ydGVkQ29udGVudFwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiIGFyaWEtbGFiZWw9XCJUb2dnbGUgbmF2aWdhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5hdmJhci10b2dnbGVyLWljb25cIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xsYXBzZSBuYXZiYXItY29sbGFwc2VcIiBpZD1cIm5hdmJhclN1cHBvcnRlZENvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibmF2YmFyLW5hdiBtci1hdXRvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbSBkcm9wZG93blwiIGRhdGEtYmluZD1cInZpc2libGU6IChDYW5TYXZlUmVwb3J0cygpICYmIGFwcFNldHRpbmdzLnVzZVByb21wdEJ1aWxkZXIoKSkgfHwgYWRtaW5Nb2RlKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwibmF2LWxpbmsgZHJvcGRvd24tdG9nZ2xlXCIgcm9sZT1cImJ1dHRvblwiIGRhdGEtYnMtdG9nZ2xlPVwiZHJvcGRvd25cIiBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXBsdXNcIj48L3NwYW4+IE5ldyBSZXBvcnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogY3JlYXRlTmV3UmVwb3J0XCIgZGF0YS1icy10b2dnbGU9XCJtb2RhbFwiIGRhdGEtYnMtdGFyZ2V0PVwiI21vZGFsLXJlcG9ydGJ1aWxkZXJcIj48aSBjbGFzcz1cImZhIGZhLXNsaWRlcnNcIj48L2k+IFVzZSBTdGFuZGFyZCBEZXNpZ25lcjwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogY3JlYXRlTmV3UmVwb3J0QWlcIj48aSBjbGFzcz1cImZhIGZhLWJvbHRcIj48L2k+IFVzZSBTbWFydGVyIERlc2lnbmVyPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtIGFjdGl2ZVwiIGRhdGEtYmluZD1cInZpc2libGU6IChTZWxlY3RlZEZvbGRlcigpID8gU2VsZWN0ZWRGb2xkZXIoKS5jYW5FZGl0IDogKENhblNhdmVSZXBvcnRzKCkgfHwgYWRtaW5Nb2RlKCkpKSAmJiAhYXBwU2V0dGluZ3MudXNlUHJvbXB0QnVpbGRlcigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cIm5hdi1saW5rXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGNyZWF0ZU5ld1JlcG9ydFwiIGRhdGEtYnMtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLWJzLXRhcmdldD1cIiNtb2RhbC1yZXBvcnRidWlsZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtcGx1c1wiPjwvc3Bhbj4gTmV3IFJlcG9ydFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbVwiIGRhdGEtYmluZD1cInZpc2libGU6IENhbk1hbmFnZUZvbGRlcnMoKSB8fCBhZG1pbk1vZGUoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJuYXYtbGlua1wiIGRhdGEtYmluZD1cImNsaWNrOiBNYW5hZ2VGb2xkZXIubmV3Rm9sZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtZm9sZGVyLW9cIj48L3NwYW4+IEFkZCBGb2xkZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW0gZHJvcGRvd25cIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAoQ2FuTWFuYWdlRm9sZGVycygpIHx8IGFkbWluTW9kZSgpKSAmJiBTZWxlY3RlZEZvbGRlcigpIT1udWxsICYmIChTZWxlY3RlZEZvbGRlcigpLmNhbkVkaXQgfHwgU2VsZWN0ZWRGb2xkZXIoKS5jYW5EZWxldGUgfHwgYWRtaW5Nb2RlKCkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cIm5hdi1saW5rIGRyb3Bkb3duLXRvZ2dsZVwiIHJvbGU9XCJidXR0b25cIiBkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCIgYXJpYS1oYXNwb3B1cD1cInRydWVcIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1mb2xkZXJcIj48L3NwYW4+IEZvbGRlciBPcHRpb25zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGhyZWY9XCIjXCIgZGF0YS1iaW5kPVwiY2xpY2s6IE1hbmFnZUZvbGRlci5lZGl0Rm9sZGVyLCB2aXNpYmxlOiBTZWxlY3RlZEZvbGRlcigpICYmIChTZWxlY3RlZEZvbGRlcigpLmNhbkVkaXQgfHwgYWRtaW5Nb2RlKCkpXCI+RWRpdCBTZWxlY3RlZCBGb2xkZXI8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGhyZWY9XCIjXCIgZGF0YS1iaW5kPVwiY2xpY2s6IE1hbmFnZUZvbGRlci5kZWxldGVGb2xkZXIsIHZpc2libGU6IFNlbGVjdGVkRm9sZGVyKCkgJiYgKFNlbGVjdGVkRm9sZGVyKCkuY2FuRGVsZXRlIHx8IGFkbWluTW9kZSgpKVwiPkRlbGV0ZSBTZWxlY3RlZCBGb2xkZXI8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW0gYWN0aXZlXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogYWRtaW5Nb2RlKCkgJiYgU2VsZWN0ZWRGb2xkZXIoKSA9PW51bGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwibmF2LWxpbmtcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgaW5pdEhlYWRlckRlc2lnbmVyKGZhbHNlKTsgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWFycm93LXVwXCI+PC9zcGFuPiBSZXBvcnQgSGVhZGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtIGRyb3Bkb3duXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogYXBwU2V0dGluZ3Muc2hvd0ltcG9ydEV4cG9ydCgpIHx8IGFkbWluTW9kZSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cIm5hdi1saW5rIGRyb3Bkb3duLXRvZ2dsZVwiIHJvbGU9XCJidXR0b25cIiBkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCIgYXJpYS1oYXNwb3B1cD1cInRydWVcIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1leGNoYW5nZVwiPjwvc3Bhbj4gSW1wb3J0IC8gRXhwb3J0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGhyZWY9XCIjXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IHNlbGVjdE1vZGUoIXNlbGVjdE1vZGUoKSk7IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cImNzczogc2VsZWN0TW9kZSgpID8gJ2ZhIGZhLWNoZWNrLXNxdWFyZSB0ZXh0LXByaW1hcnknIDogJ2ZhIGZhLXNxdWFyZS1vJ1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHNlbGVjdE1vZGUoKSA/ICdDYW5jZWwgU2VsZWN0IE1vZGUnIDogJ1NlbGVjdCBNb2RlJ1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tZGl2aWRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiI1wiIGRhdGEtYnMtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLWJzLXRhcmdldD1cIiN1cGxvYWRGaWxlTW9kYWxcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAhc2VsZWN0TW9kZSgpXCIgdGl0bGU9XCJJbXBvcnQgUmVwb3J0IGZyb20gSlNPTiBmaWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXVwbG9hZFwiPjwvc3Bhbj4gSW1wb3J0IFJlcG9ydHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiI1wiIGRhdGEtYmluZD1cInZpc2libGU6IHNlbGVjdE1vZGUsIGNsaWNrOiBleHBvcnRTZWxlY3RlZFJlcG9ydEpzb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtZG93bmxvYWRcIj48L3NwYW4+IEV4cG9ydCBTZWxlY3RlZCBSZXBvcnRzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWlubGluZSBteS0yIG15LWxnLTAgbXMtYXV0byB3LTUwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBpZD1cInNlYXJjaC1pbnB1dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHNlYXJjaC1pbnB1dFwiIGRhdGEtcGxhY2Vob2xkZXI9XCJTZWFyY2ggUmVwb3J0IGJ5IE5hbWUsIERlc2NyaXB0aW9uIG9yIERhdGEgRmllbGQuLi5cIj48L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwiY2xpY2s6IHNlYXJjaEZvclJlcG9ydHNcIiBjbGFzcz1cImlucHV0LWdyb3VwLXRleHRcIiBzdHlsZT1cImhlaWdodDogMzhweDsgY3Vyc29yOiBwb2ludGVyO1wiIHRpdGxlPVwiU2VhcmNoXCI+PGkgY2xhc3M9XCJmYSBmYS1zZWFyY2hcIj48L2k+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpIHtyZXNldFF1ZXJ5KHRydWUsIHRydWUpO31cIiBjbGFzcz1cImlucHV0LWdyb3VwLXRleHRcIiBzdHlsZT1cImhlaWdodDogMzhweDsgY3Vyc29yOiBwb2ludGVyO1wiIHRpdGxlPVwiQ2xlYXIgU2VhcmNoXCI+PGkgY2xhc3M9XCJmYSBmYS1jbG9zZVwiPjwvaT48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25hdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogZGVzaWduaW5nSGVhZGVyLCB3aXRoOiBoZWFkZXJEZXNpZ25lclwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiBjbGFzcz1cIm92ZXJmbG93LWF1dG9cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IFVzZVJlcG9ydEhlYWRlclwiPiBVc2UgUmVwb3J0IEhlYWRlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogVXNlUmVwb3J0SGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWW91IGNhbiBkZXNpZ24gdGhlIGNvbW1vbiByZXBvcnQgaGVhZGVyIGJlbG93IHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCByZXBvcnRzIHdoZXJlIHJlcG9ydCBoZWFkZXJzIGFyZSB0dXJuZWQgb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93IG0tMVwiIGRhdGEtYmluZD1cInZpc2libGU6IGNsaWVudExpc3RJZHMoKS5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgY29sLXNtLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+SGVhZGVycyBmb3Igb3RoZXIgQ2xpZW50cyBzYXZlZDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMyBjb2wtc20tM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwib3B0aW9uczogY2xpZW50TGlzdElkcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VsZWN0ZWRIZWFkZXJDbGllbnRJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zQ2FwdGlvbjogJ05vIENsaWVudCBJZCAoR2xvYmFsKScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IHsgY2hhbmdlOiBmdW5jdGlvbiAoKSB7IGxvYWRIdG1sSGVhZGVyKHRydWUpOyB9IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xIGNvbC1zbS0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1icy10b2dnbGU9XCJ0b29sdGlwXCIgY2xhc3M9XCJmYSBmYS1xdWVzdGlvbi1jaXJjbGUgaGVscHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJDaG9vc2UgYSBjbGllbnQgdG8gZGVzaWduIGl0cyByZXBvcnQgaGVhZGVyXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3cgbS0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgY29sLXNtLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+U3BlY2lmeSBDbGllbnQgSWQgdG8gUmVzdHJpY3QgQWNjZXNzPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zIGNvbC1zbS0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sIHRleHQtYm94IHNpbmdsZS1saW5lXCIgdHlwZT1cInRleHRcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogaGVhZGVyQ2xpZW50SWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xIGNvbC1zbS0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1icy10b2dnbGU9XCJ0b29sdGlwXCIgZGF0YS1wbGFjZW1lbnQ9XCJyaWdodFwiIGNsYXNzPVwiZmEgZmEtcXVlc3Rpb24tY2lyY2xlIGhlbHB0aXBcIiB0aXRsZT1cIkxlYXZlIGJsYW5rIHRvIGdpdmUgYWxsIGNsaWVudHMgYWNjZXNzIChHbG9iYWwgUmVwb3J0IEhlYWRlcilcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cInJlcG9ydC1oZWFkZXItZWRpdG9yXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc20gbXQtMlwiIGRhdGEtYmluZD1cImNsaWNrOiBzYXZlSHRtbEhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZSBDaGFuZ2VzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogIVVzZVJlcG9ydEhlYWRlcigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91IHR1cm4gb2ZmIHRoZSA8Yj5Vc2UgUmVwb3J0IEhlYWRlcjwvYj4gb3B0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIDxiPlJlcG9ydCBIZWFkZXI8L2I+IHdpbGwgbm90IGJlIGFwcGxpZWQgaW4gcmVwb3J0cy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbSBtdC0yXCIgZGF0YS1iaW5kPVwiY2xpY2s6IHNhdmVIdG1sSGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlIENoYW5nZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWZub3Q6IGRlc2lnbmluZ0hlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgcHVsbC1yaWdodFwiIHJvbGU9XCJncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGlnaHRcIiBkYXRhLWJzLXRvZ2dsZT1cInRvb2x0aXBcIiB0aXRsZT1cIkxpc3QgVmlld1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwiY3NzOiB7ICdhY3RpdmUnOiBsYXlvdXQoKSA9PT0gJ2xpc3QnIH0sIGNsaWNrOiB0b2dnbGVMYXlvdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtbGlzdFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1saWdodFwiIGRhdGEtYnMtdG9nZ2xlPVwidG9vbHRpcFwiIHRpdGxlPVwiSWNvbiBWaWV3XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjc3M6IHsgJ2FjdGl2ZSc6IGxheW91dCgpID09PSAnaWNvbnMnIH0sIGNsaWNrOiB0b2dnbGVMYXlvdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtdGgtbGFyZ2VcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBsYXlvdXQoKT09J2ljb25zJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6ICFTZWxlY3RlZEZvbGRlcigpICYmICFzZWFyY2hSZXBvcnRzKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlBsZWFzZSBjaG9vc2UgRm9sZGVycyBiZWxvdyB0byB2aWV3IFJlcG9ydHM8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJmb2xkZXItbGlzdFwiIGRhdGEtYmluZD1cImZvcmVhY2g6IEZvbGRlcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7ICRwYXJlbnQuU2VsZWN0ZWRGb2xkZXIoJGRhdGEpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInZpc2libGU6ICRyb290LnNlbGVjdE1vZGUsIGNsaWNrOiBmdW5jdGlvbihkLGUpeyBpc1NlbGVjdGVkKCFpc1NlbGVjdGVkKCkpOyBlLnN0b3BQcm9wYWdhdGlvbigpOyB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3M6IGlzU2VsZWN0ZWQoKSA/ICdmYSBmYS1jaGVjay1zcXVhcmUgdGV4dC1wcmltYXJ5IG1lLTInIDogJ2ZhIGZhLXNxdWFyZS1vIG1lLTInXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLTN4IGZhLWZvbGRlciB0ZXh0LXNlY29uZGFyeVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXNjXCIgZGF0YS1iaW5kPVwidGV4dDogRm9sZGVyTmFtZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogU2VsZWN0ZWRGb2xkZXIoKSB8fCBzZWFyY2hSZXBvcnRzKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGVhcmZpeFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwicHVsbC1sZWZ0XCI+UGxlYXNlIGNob29zZSBhIFJlcG9ydCBmcm9tIHRoaXMgRm9sZGVyPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IFNlbGVjdGVkRm9sZGVyKG51bGwpOyBzZWFyY2hSZXBvcnRzKCcnKTsgJCgnI3NlYXJjaC1yZXBvcnQnKS52YWwoW10pLnRyaWdnZXIoJ2NoYW5nZScpO31cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uYmFjayB0byBGb2xkZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1vdmVyZmxvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IFNlbGVjdGVkRm9sZGVyKCkhPW51bGwgJiYgcmVwb3J0c0luRm9sZGVyKCkubGVuZ3RoPT0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZm9sZGVyIGlzIGVtcHR5LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IHNlYXJjaFJlcG9ydHMoKSAmJiByZXBvcnRzSW5TZWFyY2goKS5sZW5ndGg9PTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gUmVwb3J0cyBmb3VuZCBtYXRjaGluZyB5b3VyIFNlYXJjaFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWdyb3VwXCIgZGF0YS1iaW5kPVwiZm9yZWFjaDogc2VhcmNoUmVwb3J0cygpID8gcmVwb3J0c0luU2VhcmNoKCkgOiByZXBvcnRzSW5Gb2xkZXIoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1ncm91cC1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcm9vdC5zZWxlY3RNb2RlLCBjaGVja2VkOiBpc1NlbGVjdGVkXCIgY2xhc3M9XCJwdWxsLWxlZnQgbWUtMlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmYSBmYS0yeCBwdWxsLWxlZnRcIiBkYXRhLWJpbmQ9XCJjc3M6IHsnZmEtZmlsZSc6IHJlcG9ydFR5cGU9PSdMaXN0JywgJ2ZhLXRoLWxpc3QnOiByZXBvcnRUeXBlPT0nU3VtbWFyeScsICdmYS1iYXItY2hhcnQnOiByZXBvcnRUeXBlPT0nQmFyJywgJ2ZhLXBpZS1jaGFydCc6IHJlcG9ydFR5cGU9PSdQaWUnLCAgJ2ZhLWxpbmUtY2hhcnQnOiByZXBvcnRUeXBlPT0nTGluZScsICdmYS1nbG9iZSc6IHJlcG9ydFR5cGUuaW5kZXhPZignTWFwJyk9PTAsICdmYS13aW5kb3ctbWF4aW1pemUnOiByZXBvcnRUeXBlPT0nU2luZ2xlJywgJ2ZhLXJhbmRvbSc6IHJlcG9ydFR5cGU9PSdQaXZvdCcsICdmYS13aW5kb3ctcmVzdG9yZSc6IHJlcG9ydFR5cGU9PSdUcmVlbWFwJywgJ2ZhLXNpZ25hbCc6IHJlcG9ydFR5cGUgPT0gJ0NvbWJvJywgJ2ZhLWNvZGUnOiByZXBvcnRUeXBlID09ICdIdG1sJywgJ2ZhLW1hcCc6IHJlcG9ydFR5cGUgPT0gJ0hlYXRNYXAnfVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgZGF0YS1iaW5kPVwiY2xpY2s6IHJ1blJlcG9ydFwiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cImhpZ2hsaWdodGVkVGV4dDogeyB0ZXh0OiByZXBvcnROYW1lLCBoaWdobGlnaHQ6ICRwYXJlbnQuc2VhcmNoUmVwb3J0cywgY3NzOiAnaGlnaGxpZ2h0JyB9XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xlYXJmaXhcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgZGF0YS1iaW5kPVwidGV4dDogcmVwb3J0RGVzY3JpcHRpb25cIj48L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGRhdGEtYmluZD1cImlmOiAkcGFyZW50LnNlYXJjaFJlcG9ydHMoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1mb2xkZXJcIj48L3NwYW4+IDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IGZvbGRlck5hbWVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBtZXNzYWdlXCIgY2xhc3M9XCJoaWdobGlnaHQgc21hbGxcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogJHBhcmVudC5hZG1pbk1vZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWFsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiPlJlcG9ydCBBY2Nlc3M8L2I+PGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFuYWdlIGJ5IFVzZXIgPHNwYW4gY2xhc3M9XCJiYWRnZSB0ZXh0LWJnLWluZm8gdGV4dC13aGl0ZVwiIGRhdGEtYmluZD1cInRleHQ6IHVzZXJJZCA/IHVzZXJJZCA6ICdBbnkgVXNlcidcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBvbmx5IGJ5IFVzZXIgPHNwYW4gY2xhc3M9XCJiYWRnZSB0ZXh0LWJnLWluZm8gdGV4dC13aGl0ZVwiIGRhdGEtYmluZD1cInRleHQ6ICh2aWV3T25seVVzZXJJZCA/IHZpZXdPbmx5VXNlcklkIDogKHVzZXJJZCA/IHVzZXJJZCA6ICdBbnkgVXNlcicpKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBkZWxldGVPbmx5VXNlcklkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZSBvbmx5IGJ5IFVzZXIgPHNwYW4gY2xhc3M9XCJiYWRnZSB0ZXh0LWJnLWluZm8gdGV4dC13aGl0ZVwiIGRhdGEtYmluZD1cInRleHQ6IGRlbGV0ZU9ubHlVc2VySWRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IHVzZXJSb2xlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hbmFnZSBieSBSb2xlIDxzcGFuIGNsYXNzPVwiYmFkZ2UgdGV4dC1iZy1pbmZvIHRleHQtd2hpdGVcIiBkYXRhLWJpbmQ9XCJ0ZXh0OiB1c2VyUm9sZSA/IHVzZXJSb2xlIDogJ05vIFJvbGUnXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiB2aWV3T25seVVzZXJSb2xlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgb25seSBieSBSb2xlIDxzcGFuIGNsYXNzPVwiYmFkZ2UgdGV4dC1iZy1pbmZvIHRleHQtd2hpdGVcIiBkYXRhLWJpbmQ9XCJ0ZXh0OiB2aWV3T25seVVzZXJSb2xlID8gdmlld09ubHlVc2VyUm9sZSA6ICdBbnkgUm9sZSdcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IGRlbGV0ZU9ubHlVc2VyUm9sZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGUgb25seSBieSBSb2xlIDxzcGFuIGNsYXNzPVwiYmFkZ2UgdGV4dC1iZy1pbmZvIHRleHQtd2hpdGVcIiBkYXRhLWJpbmQ9XCJ0ZXh0OiBkZWxldGVPbmx5VXNlclJvbGUgPyBkZWxldGVPbmx5VXNlclJvbGUgOiAnU2FtZSBhcyBNYW5hZ2UnXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBjbGllbnRJZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgQ2xpZW50IDxzcGFuIGNsYXNzPVwibGFiZWwgbGFiZWwtaW5mb1wiIGRhdGEtYmluZD1cInRleHQ6IGNsaWVudElkID8gY2xpZW50SWQgOiAnQW55J1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0IExpbmsgdG8gUnVuIFJlcG9ydDogPGEgZGF0YS1iaW5kPVwiYXR0cjoge2hyZWY6ICcvRG90TmV0UmVwb3J0Lz9saW5rZWRyZXBvcnQ9dHJ1ZSZub3BhcmVudD10cnVlJnJlcG9ydElkPScgKyByZXBvcnRJZCB9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+PHNwYW4gY2xhc3M9XCJmYSBmYS1saW5rXCI+PC9zcGFuPjwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7PGEgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQod2luZG93LmxvY2F0aW9uLmhyZWYgKyAnP2xpbmtlZHJlcG9ydD10cnVlJm5vcGFyZW50PXRydWUmcmVwb3J0SWQ9JyArIHJlcG9ydElkIClcIj48c3BhbiBjbGFzcz1cImZhIGZhLWNvcHlcIiB0aXRsZT1cIkNsaWNrIHRvIENvcHkgTGlua1wiPjwvc3Bhbj48L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS01IHJpZ2h0LWFsaWduXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLW5vbmUgZC1tZC1ibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJpZjogJHJvb3QuQ2FuU2F2ZVJlcG9ydHMoKSB8fCAkcm9vdC5hZG1pbk1vZGUoKSBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogb3BlblJlcG9ydCwgdmlzaWJsZTogY2FuRWRpdFwiIGRhdGEtYnMtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLWJzLXRhcmdldD1cIiNtb2RhbC1yZXBvcnRidWlsZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtZWRpdFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj4gRWRpdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiBjb3B5UmVwb3J0LCB2aXNpYmxlOiBjYW5FZGl0XCIgZGF0YS1icy10b2dnbGU9XCJtb2RhbFwiIGRhdGEtYnMtdGFyZ2V0PVwiI21vZGFsLXJlcG9ydGJ1aWxkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1jb3B5XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPiBDb3B5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiBydW5SZXBvcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1nZWFyc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj4gUnVuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBkcm9wZG93bi10b2dnbGUgZHJvcGRvd24tdG9nZ2xlLXNwbGl0XCIgZGF0YS1icy10b2dnbGU9XCJkcm9wZG93blwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IC00cHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudSBkcm9wZG93bi1tZW51LXJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGhyZWY9XCIjXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCkge2V4cG9ydFJlcG9ydCgncGRmJyk7fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1maWxlLWV4Y2VsLW9cIj48L3NwYW4+IERvd25sb2FkIFBERlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGhyZWY9XCIjXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCkge2V4cG9ydFJlcG9ydCgnZXhjZWwnKTt9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWZpbGUtZXhjZWwtb1wiPjwvc3Bhbj4gRG93bmxvYWQgRXhjZWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiI1wiIGRhdGEtYmluZD1cInZpc2libGU6IGhhc0RyaWxsZG93biwgY2xpY2s6IGZ1bmN0aW9uKCkge2V4cG9ydFJlcG9ydCgnZXhjZWwtc3ViJyk7fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1maWxlLWV4Y2VsLW9cIj48L3NwYW4+IERvd25sb2FkIEV4Y2VsIChFeHBhbmRlZClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogZGVsZXRlUmVwb3J0LCB2aXNpYmxlOiBjYW5EZWxldGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXRyYXNoXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPiBEZWxldGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtYmxvY2sgZC1tZC1ub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJpZjogJHJvb3QuQ2FuU2F2ZVJlcG9ydHMoKSB8fCAkcm9vdC5hZG1pbk1vZGUoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIHRpdGxlPVwiRWRpdCBSZXBvcnRcIiBkYXRhLWJpbmQ9XCJjbGljazogb3BlblJlcG9ydCwgdmlzaWJsZTogY2FuRWRpdFwiIGRhdGEtYnMtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLWJzLXRhcmdldD1cIiNtb2RhbC1yZXBvcnRidWlsZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtZWRpdFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tbGlnaHRcIiBkYXRhLWJpbmQ9XCJjbGljazogY29weVJlcG9ydCwgdmlzaWJsZTogY2FuRWRpdFwiIHRpdGxlPVwiQ29weSBSZXBvcnRcIiBkYXRhLWJzLXRvZ2dsZT1cIm1vZGFsXCIgZGF0YS1icy10YXJnZXQ9XCIjbW9kYWwtcmVwb3J0YnVpbGRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWNvcHlcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiBydW5SZXBvcnRcIiB0aXRsZT1cIlJ1biBSZXBvcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1nZWFyc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGRyb3Bkb3duLXRvZ2dsZSBkcm9wZG93bi10b2dnbGUtc3BsaXRcIiBkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogLTRweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGhyZWY9XCIjXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCkge2V4cG9ydFJlcG9ydCgnZXhjZWwnKTt9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWZpbGUtZXhjZWwtb1wiPjwvc3Bhbj4gRG93bmxvYWQgRXhjZWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiI1wiIGRhdGEtYmluZD1cInZpc2libGU6IGhhc0RyaWxsZG93biwgY2xpY2s6IGZ1bmN0aW9uKCkge2V4cG9ydFJlcG9ydCgnZXhjZWwtc3ViJyk7fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1maWxlLWV4Y2VsLW9cIj48L3NwYW4+IERvd25sb2FkIEV4Y2VsIHdpdGggaW5uZXIgcm93c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiB0aXRsZT1cIkRlbGV0ZSBSZXBvcnRcIiBkYXRhLWJpbmQ9XCJjbGljazogZGVsZXRlUmVwb3J0LCB2aXNpYmxlOiBjYW5EZWxldGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXRyYXNoXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IGxheW91dCgpPT0nbGlzdCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGUtZXhwbG9yZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmF2IGNsYXNzPVwiYnJlYWRjcnVtYlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJicmVhZGNydW1iLWl0ZW1cIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgU2VsZWN0ZWRGb2xkZXIobnVsbCk7IHNlYXJjaFJlcG9ydHMoJycpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBGb2xkZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJlYWRjcnVtYi1pdGVtIGFjdGl2ZVwiIGRhdGEtYmluZD1cInZpc2libGU6IFNlbGVjdGVkRm9sZGVyICYmICFzZWFyY2hSZXBvcnRzKCksIHRleHQ6IFNlbGVjdGVkRm9sZGVyKCk/LkZvbGRlck5hbWVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJicmVhZGNydW1iLWl0ZW0gYWN0aXZlXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogc2VhcmNoUmVwb3J0c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2ggUmVzdWx0c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmF2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogIVNlbGVjdGVkRm9sZGVyKCkgJiYgIXNlYXJjaFJlcG9ydHMoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBmdy1ib2xkIGJvcmRlci1ib3R0b20gcHktMiB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+TmFtZTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02IHRleHQtZW5kXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogYWRtaW5Nb2RlXCI+QWNjZXNzIENvbnRyb2w8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb2xkZXItbGlzdFwiIGRhdGEtYmluZD1cImZvcmVhY2g6IEZvbGRlcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgY2xpY2thYmxlIHB5LTIgYm9yZGVyLWJvdHRvbSBhbGlnbi1pdGVtcy1jZW50ZXIgdy0xMDBcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgJHBhcmVudC5TZWxlY3RlZEZvbGRlcigkZGF0YSk7IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTYgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcm9vdC5zZWxlY3RNb2RlLCBjbGljazogZnVuY3Rpb24oZCxlKXsgaXNTZWxlY3RlZCghaXNTZWxlY3RlZCgpKTsgZS5zdG9wUHJvcGFnYXRpb24oKTsgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzczogaXNTZWxlY3RlZCgpID8gJ2ZhIGZhLWNoZWNrLXNxdWFyZSB0ZXh0LXByaW1hcnkgbWUtMicgOiAnZmEgZmEtc3F1YXJlLW8gbWUtMidcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtZm9sZGVyIHRleHQtc2Vjb25kYXJ5IG1lLTJcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IEZvbGRlck5hbWVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02IHRleHQtZW5kXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogJHBhcmVudC5hZG1pbk1vZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLTxkaXYgY2xhc3M9XCJiYWRnZSBiZy1pbmZvIHRleHQtd2hpdGVcIiBkYXRhLWJpbmQ9XCJ0ZXh0OiB1c2VySWQgPyB1c2VySWQgOiAnQW55IFVzZXInXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmFkZ2UgYmctaW5mbyB0ZXh0LXdoaXRlXCIgZGF0YS1iaW5kPVwidGV4dDogdXNlclJvbGUgPyB1c2VyUm9sZSA6ICdObyBSb2xlJ1wiPjwvZGl2Pi0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBTZWxlY3RlZEZvbGRlcigpIHx8IHNlYXJjaFJlcG9ydHMoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogU2VsZWN0ZWRGb2xkZXIoKSE9bnVsbCAmJiByZXBvcnRzSW5Gb2xkZXIoKS5sZW5ndGg9PTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1tdXRlZFwiPlRoaXMgZm9sZGVyIGlzIGVtcHR5LjwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBzZWFyY2hSZXBvcnRzKCkgJiYgcmVwb3J0c0luU2VhcmNoKCkubGVuZ3RoPT0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtY2VudGVyIHRleHQtbXV0ZWRcIj5ObyByZXBvcnRzIGZvdW5kIG1hdGNoaW5nIHlvdXIgc2VhcmNoLjwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IHJlcG9ydHNJbkZvbGRlcigpLmxlbmd0aCA+IDAgfHwgcmVwb3J0c0luU2VhcmNoKCkubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBmdy1ib2xkIGJvcmRlci1ib3R0b20gcHktMiB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPk5hbWU8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTFcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTJcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBzZWFyY2hSZXBvcnRzKClcIj5Gb2xkZXI8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTJcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTJcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBhZG1pbk1vZGVcIj5BY2Nlc3M8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTFcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBhZG1pbk1vZGVcIj5EaXJlY3QgTGluazwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlcG9ydC1saXN0XCIgZGF0YS1iaW5kPVwiZm9yZWFjaDogc2VhcmNoUmVwb3J0cygpID8gcmVwb3J0c0luU2VhcmNoKCkgOiByZXBvcnRzSW5Gb2xkZXIoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYm9yZGVyLWJvdHRvbSBweS0yIGFsaWduLWl0ZW1zLWNlbnRlciB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTQgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cInZpc2libGU6ICRyb290LnNlbGVjdE1vZGUsIGNoZWNrZWQ6IGlzU2VsZWN0ZWRcIiBjbGFzcz1cIm1lLTJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYVwiIGRhdGEtYmluZD1cImNzczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhLWZpbGUnOiByZXBvcnRUeXBlPT0nTGlzdCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmEtdGgtbGlzdCc6IHJlcG9ydFR5cGU9PSdTdW1tYXJ5JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmYS1iYXItY2hhcnQnOiByZXBvcnRUeXBlPT0nQmFyJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmYS1waWUtY2hhcnQnOiByZXBvcnRUeXBlPT0nUGllJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmYS1saW5lLWNoYXJ0JzogcmVwb3J0VHlwZT09J0xpbmUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhLXNpZ25hbCc6IHJlcG9ydFR5cGU9PSdDb21ibycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmEtZ2xvYmUnOiByZXBvcnRUeXBlLmluZGV4T2YoJ01hcCcpPT0wLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhLXdpbmRvdy1tYXhpbWl6ZSc6IHJlcG9ydFR5cGU9PSdTaW5nbGUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhLXJhbmRvbSc6IHJlcG9ydFR5cGU9PSdQaXZvdCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmEtd2luZG93LXJlc3RvcmUnOiByZXBvcnRUeXBlPT0nVHJlZW1hcCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmEtY29kZSc6IHJlcG9ydFR5cGUgPT0gJ0h0bWwnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhLW1hcCc6IHJlcG9ydFR5cGUgPT0gJ0hlYXRNYXAnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cIm1zLTJcIiBkYXRhLWJpbmQ9XCJjbGljazogcnVuUmVwb3J0LCBoaWdobGlnaHRlZFRleHQ6IHsgdGV4dDogcmVwb3J0TmFtZSwgaGlnaGxpZ2h0OiAkcGFyZW50LnNlYXJjaFJlcG9ydHMsIGNzczogJ2hpZ2hsaWdodCcgfVwiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyXCI+PC9hPiZuYnNwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogbWVzc2FnZVwiIGNsYXNzPVwiaGlnaGxpZ2h0IHNtYWxsXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc21cIiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1icy10b2dnbGU9XCJkcm9wZG93blwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWVsbGlwc2lzLWhcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiZHJvcGRvd24tbWVudVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiI1wiIGRhdGEtYnMtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLWJzLXRhcmdldD1cIiNtb2RhbC1yZXBvcnRidWlsZGVyXCIgZGF0YS1iaW5kPVwiY2xpY2s6IG9wZW5SZXBvcnQsIHZpc2libGU6IGNhbkVkaXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWVkaXRcIj48L3NwYW4+IEVkaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWJzLXRvZ2dsZT1cIm1vZGFsXCIgZGF0YS1icy10YXJnZXQ9XCIjbW9kYWwtcmVwb3J0YnVpbGRlclwiIGRhdGEtYmluZD1cImNsaWNrOiBjb3B5UmVwb3J0LCB2aXNpYmxlOiBjYW5FZGl0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1jb3B5XCI+PC9zcGFuPiBDb3B5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbSB0ZXh0LWRhbmdlclwiIGhyZWY9XCIjXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGRlbGV0ZVJlcG9ydCwgdmlzaWJsZTogY2FuRGVsZXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS10cmFzaFwiPjwvc3Bhbj4gRGVsZXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48aHIgY2xhc3M9XCJkcm9wZG93bi1kaXZpZGVyXCI+PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogcnVuUmVwb3J0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1nZWFyc1wiPjwvc3Bhbj4gUnVuIFJlcG9ydFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJkcm9wZG93bi1zdWJtZW51XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZHJvcGRvd24tdG9nZ2xlXCIgaHJlZj1cIiNcIj5FeHBvcnQ8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiI1wiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpIHtleHBvcnRSZXBvcnQoJ3BkZicpO31cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtZmlsZS1leGNlbC1vXCI+PC9zcGFuPiBEb3dubG9hZCBQREZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiI1wiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpIHtleHBvcnRSZXBvcnQoJ2V4Y2VsJyk7fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1maWxlLWV4Y2VsLW9cIj48L3NwYW4+IERvd25sb2FkIEV4Y2VsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBoYXNEcmlsbGRvd24sIGNsaWNrOiBmdW5jdGlvbigpIHtleHBvcnRSZXBvcnQoJ2V4Y2VsLXN1YicpO31cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtZmlsZS1leGNlbC1vXCI+PC9zcGFuPiBEb3dubG9hZCBFeGNlbCAoRXhwYW5kZWQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiRwYXJlbnQuYWRtaW5Nb2RlLCBjbGljazogZnVuY3Rpb24oKSB7ZXhwb3J0UmVwb3J0KCdqc29uJyk7fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1maWxlXCI+PC9zcGFuPiBFeHBvcnQgSlNPTlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMlwiIGRhdGEtYmluZD1cInRleHQ6IGZvbGRlck5hbWUsIHZpc2libGU6ICRwYXJlbnQuc2VhcmNoUmVwb3J0cygpXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMlwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTJcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcGFyZW50LmFkbWluTW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhZGdlIGJnLWluZm8gdGV4dC13aGl0ZVwiIGRhdGEtYmluZD1cInRleHQ6IHVzZXJJZCA/IHVzZXJJZCA6ICdBbnkgVXNlcidcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYWRnZSBiZy1pbmZvIHRleHQtd2hpdGVcIiBkYXRhLWJpbmQ9XCJ0ZXh0OiB1c2VyUm9sZSA/IHVzZXJSb2xlIDogJ05vIFJvbGUnXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTFcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcGFyZW50LmFkbWluTW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgZGF0YS1iaW5kPVwiYXR0cjoge2hyZWY6ICcvRG90TmV0UmVwb3J0P2xpbmtlZHJlcG9ydD10cnVlJm5vcGFyZW50PXRydWUmcmVwb3J0SWQ9JyArIHJlcG9ydElkIH1cIiB0YXJnZXQ9XCJfYmxhbmtcIj48c3BhbiBjbGFzcz1cImZhIGZhLWxpbmtcIj48L3NwYW4+PC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpIHsgbmF2aWdhdG9yICYmIG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoJy9Eb3ROZXRSZXBvcnQ/bGlua2VkcmVwb3J0PXRydWUmbm9wYXJlbnQ9dHJ1ZSZyZXBvcnRJZD0nICsgcmVwb3J0SWQpIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWNvcHlcIiB0aXRsZT1cIkNvcHkgTGlua1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgXHJcblxyXG4gICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSZXBvcnRNb2RlKCkgPT0gJ2V4ZWN1dGUnIHx8IFJlcG9ydE1vZGUoKSA9PSAnbGlua2VkJyB8fCBSZXBvcnRNb2RlKCkgPT0gJ2Rlc2lnbidcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiIGRhdGEtYmluZD1cInZpc2libGU6IHRydWU7XCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxuYXYgY2xhc3M9XCJuYXZiYXIgbmF2YmFyLWV4cGFuZC1sZyBuYXZiYXItbGlnaHQgYmctbGlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cIm5hdmJhci1icmFuZFwiIGhyZWY9XCIjXCI+Vmlld2luZyBSZXBvcnQ8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm5hdmJhci10b2dnbGVyXCIgdHlwZT1cImJ1dHRvblwiIGRhdGEtYnMtdG9nZ2xlPVwiY29sbGFwc2VcIiBkYXRhLWJzLXRhcmdldD1cIiNuYXZiYXJTdXBwb3J0ZWRDb250ZW50XCIgYXJpYS1jb250cm9scz1cIm5hdmJhclN1cHBvcnRlZENvbnRlbnRcIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIiBhcmlhLWxhYmVsPVwiVG9nZ2xlIG5hdmlnYXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuYXZiYXItdG9nZ2xlci1pY29uXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xsYXBzZSBuYXZiYXItY29sbGFwc2VcIiBpZD1cIm5hdmJhclN1cHBvcnRlZENvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibmF2YmFyLW5hdiBtZS1hdXRvXCI+PC91bD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbVwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpIHskcm9vdC5SZXBvcnRNb2RlKCdzdGFydCcpOyAkcm9vdC50ZXh0UXVlcnkuc2V0dXBTZWFyY2goKTt9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hcnJvdy1sZWZ0XCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkJhY2sgdG8gUmVwb3J0czwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGlnaHQgYnRuLXNtXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0TW9kZSgpPT0nbGlua2VkJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYXJyb3ctY2lyY2xlLWxlZnRcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+QmFjayB0byBQYXJlbnQgUmVwb3J0PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd25cIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcm9vdC5DYW5FZGl0KCkgJiYgUmVwb3J0SUQoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkcm9wZG93bi10b2dnbGUgYnRuIGJ0bi1saWdodCBidG4tc21cIiByb2xlPVwiYnV0dG9uXCIgZGF0YS1icy10b2dnbGU9XCJkcm9wZG93blwiIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCIgYXJpYS1leHBhbmRlZD1cImZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZWRpdFwiPjwvaT4gRWRpdCBSZXBvcnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiI1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyBTYXZlUmVwb3J0KHRydWUpOyB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1icy10b2dnbGU9XCJtb2RhbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYnMtdGFyZ2V0PVwiI21vZGFsLXJlcG9ydGJ1aWxkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc2xpZGVyc1wiPjwvaT4gRWRpdCB3aXRoIFN0YW5kYXJkIERlc2lnbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjbGljazogZWRpdFJlcG9ydEFpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWJvbHRcIj48L2k+IEVkaXQgd2l0aCBTbWFydGVyIERlc2lnbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbVwiIGRhdGEtYmluZD1cImNsaWNrOiBSZWZyZXNoUmVwb3J0LCB2aXNpYmxlOiBmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcmVmcmVzaFwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5SZWZyZXNoPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidmlzaWJsZTogaXNEaXJ0eVwiIHRpdGxlPVwiWW91IGhhdmUgdW5zYXZlZCBjaGFuZ2VzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJ0ZXh0LXdhcm5pbmcgZmEgZmEtZXhjbGFtYXRpb24tdHJpYW5nbGVcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBidG4tc21cIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcm9vdC5DYW5FZGl0KCksIGNsaWNrOiBTYXZlV2l0aG91dFJ1blwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc2F2ZVwiPjwvaT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+U2F2ZSBSZXBvcnQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93blwiIGRhdGEtYmluZD1cImhpZGRlbjogKERvbnRFeGVjdXRlT25SdW4oKSAmJiAhcmVwb3J0UmFuKCkpIHx8ICFSZXBvcnRJRCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbSBkcm9wZG93bi10b2dnbGVcIiBkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCIgYXJpYS1leHBhbmRlZD1cImZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZG93bmxvYWRcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkV4cG9ydDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51IGRyb3Bkb3duLW1lbnUtZW5kXCI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBkYXRhLWJpbmQ9XCJoaWRkZW46IGFwcFNldHRpbmdzLnVzZUFsdFBkZlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBkYXRhLWJpbmQ9XCJjbGljazogYXBwU2V0dGluZ3Muc2hvd1BhZ2VTaXplXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uKCkgeyBQZGZQYWdlLmlzRGVidWcgPSBmYWxzZTsgJCgnI3BkZk9wdGlvbnNNb2RhbCcpLm1vZGFsKCdzaG93Jyk7IH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZnVuY3Rpb24oKSB7IGRvd25sb2FkUGRmKGZhbHNlKTsgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZmlsZS1wZGYtb1wiPjwvaT4gUGRmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBhZG1pbk1vZGUoKSAmJiAhYXBwU2V0dGluZ3MudXNlQWx0UGRmXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGRhdGEtYmluZD1cImNsaWNrOiBhcHBTZXR0aW5ncy5zaG93UGFnZVNpemVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZnVuY3Rpb24oKSB7IFBkZlBhZ2UuaXNEZWJ1ZyA9IHRydWU7ICQoJyNwZGZPcHRpb25zTW9kYWwnKS5tb2RhbCgnc2hvdycpOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZ1bmN0aW9uKCkgeyBkb3dubG9hZFBkZih0cnVlKTsgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZmlsZS1wZGYtb1wiPjwvaT4gUGRmIChEZWJ1ZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtYmluZD1cInZpc2libGU6IGFwcFNldHRpbmdzLnVzZUFsdFBkZlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBkYXRhLWJpbmQ9XCJjbGljazogYXBwU2V0dGluZ3Muc2hvd1BhZ2VTaXplXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uKCkgeyAkKCcjcGRmT3B0aW9uc01vZGFsJykubW9kYWwoJ3Nob3cnKTsgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmdW5jdGlvbigpIHsgZG93bmxvYWRQZGZBbHQoKTsgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZmlsZS1wZGYtb1wiPjwvaT4gUGRmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGRvd25sb2FkRXhjZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWZpbGUtZXhjZWwtb1wiPjwvaT4gRXhjZWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtYmluZD1cInZpc2libGU6IGNhbkRyaWxsZG93blwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogZG93bmxvYWRFeGNlbFdpdGhEcmlsbGRvd25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWZpbGUtZXhjZWwtb1wiPjwvaT4gRXhjZWwgKEV4cGFuZGVkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgZGF0YS1iaW5kPVwiaGlkZGVuOiBhcHBTZXR0aW5ncy5kb250V29yZEV4cG9ydFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGFwcFNldHRpbmdzLnNob3dQYWdlU2l6ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZnVuY3Rpb24oKSB7ICQoJyN3b3JkT3B0aW9uc01vZGFsJykubW9kYWwoJ3Nob3cnKTsgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZnVuY3Rpb24oKSB7IGRvd25sb2FkV29yZCgpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1maWxlLXdvcmQtb1wiPjwvc3Bhbj4gV29yZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGRhdGEtYmluZD1cImNsaWNrOiBkb3dubG9hZENzdlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZmlsZS1leGNlbC1vXCI+PC9pPiBDc3ZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtYmluZD1cImhpZGRlbjogYXBwU2V0dGluZ3MuZG9udFhtbEV4cG9ydFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBkYXRhLWJpbmQ9XCJjbGljazogZG93bmxvYWRYbWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWZpbGUtY29kZS1vXCI+PC9pPiBYbWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBkYXRhLWJpbmQ9XCJjbGljazogcHJpbnRSZXBvcnRQYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wcmludFwiPjwvaT4gUHJpbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uYXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBhY3RpdmVEZXNpZ24oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IFJlcG9ydElEKCkgPD0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJuYXYgbmF2LXRhYnNcIiBpZD1cImRlc2lnblRhYnNcIiByb2xlPVwidGFibGlzdFwiPiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJuYXYtbGluayBhY3RpdmVcIiBpZD1cImRlc2lnbmVyLXRhYlwiIGRhdGEtYnMtdG9nZ2xlPVwidGFiXCIgZGF0YS1icy10YXJnZXQ9XCIjZGVzaWduZXJcIiB0eXBlPVwiYnV0dG9uXCIgcm9sZT1cInRhYlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBvcnQgRGVzaWduZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbVwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwibmF2LWxpbmtcIiBpZD1cIm5sLXRhYlwiIGRhdGEtYnMtdG9nZ2xlPVwidGFiXCIgZGF0YS1icy10YXJnZXQ9XCIjbmxcIiB0eXBlPVwiYnV0dG9uXCIgcm9sZT1cInRhYlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgUHJvbXB0PHNwYW4gdGl0bGU9XCJUaGlzIGZlYXR1cmUgaXMgc3RpbGwgaW4gQmV0YSByZWxlYXNlLiBZb3UgY2FuIHR1cm4gaXQgb2ZmIGZyb20gc2V0dGluZ3NcIiBzdHlsZT1cImZvbnQtc2l6ZTogMTBwdDsgcGFkZGluZzogNXB4OyBtYXgtd2lkdGg6IDM1MHB4OyB3aGl0ZS1zcGFjZTogbm9ybWFsOyBtYXJnaW4tYm90dG9tOiAwO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1pbmZvLWNpcmNsZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItY29udGVudCBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLXBhbmUgZmFkZSBzaG93IGFjdGl2ZVwiIGlkPVwiZGVzaWduZXJcIiByb2xlPVwidGFicGFuZWxcIiBhcmlhLWxhYmVsbGVkYnk9XCJkZXNpZ25lci10YWJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAncmVwb3J0LWRlc2lnbmVyLWNvbXBhY3QnLCBkYXRhOiAkcm9vdFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLXBhbmUgZmFkZVwiIGlkPVwibmxcIiByb2xlPVwidGFicGFuZWxcIiBhcmlhLWxhYmVsbGVkYnk9XCJubC10YWJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGF0IHdvdWxkIHlvdSBsaWtlIHRvIGtub3c/IFR5cGUgYSA8Yj5uYXR1cmFsIGxhbmd1YWdlIHByb21wdDwvYj4gYmVsb3cgdG8gYXNrIHF1ZXN0aW9ucyBhYm91dCB5b3VyIGRhdGEuPGJyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSA8Yj5BdXRvIENvbXBsZXRlPC9iPiBzdWdnZXN0aW9ucyB0byBndWlkZSB5b3VyIHF1ZXJ5IOKAlCB0aGUgQUkgd2lsbCBjb252ZXJ0IHlvdXIgcHJvbXB0IGludG8gYSBEb3RuZXQgUmVwb3J0IHRoYXQgeW91IGNhbiB0aGVuIHByZXZpZXcsIGRlc2lnbiwgc2F2ZSBhbmQgcmV1c2UuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgaWQ9XCJxdWVyeS1pbnB1dFwiIGNsYXNzPVwicXVlcnktaW5wdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG93IG1lJm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKSB7cnVuUXVlcnkoZmFsc2UpO31cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc21cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1tYWdpY1wiPjwvc3Bhbj4gUHJvY2VzcyB3aXRoIEFJXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCkge3Jlc2V0UXVlcnkodHJ1ZSwgZmFsc2UpO31cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IGJ0bi1zbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXVuZG9cIj48L3NwYW4+IFN0YXJ0IE92ZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IGJ0bi1zbVwiIGRhdGEtYnMtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLWJzLXRhcmdldD1cIiNzcWxNb2RhbFwiIGRhdGEtYmluZD1cInZpc2libGU6IGFkbWluTW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWNvZGVcIj48L3NwYW4+IFZpZXcgQ29kZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLXNtXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogQ2FuU2F2ZVJlcG9ydHMoKSwgY2xpY2s6IFNhdmVXaXRob3V0UnVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtc2F2ZVwiPjwvc3Bhbj4gU2F2ZSBSZXBvcnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWJpbmQ9XCJjbGljazogb3BlbkRlc2lnbmVyXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBidG4tc21cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1wZW5jaWxcIj48L3NwYW4+IERlc2lnbi9TYXZlIFJlcG9ydFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogUmVwb3J0SUQoKSA+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ3JlcG9ydC1kZXNpZ25lci1jb21wYWN0JywgZGF0YTogJHJvb3RcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogUmVwb3J0UmVzdWx0XCIgY2xhc3M9XCJyZXBvcnQtdmlld1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWZub3Q6IEhhc0Vycm9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogJHJvb3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogRWRpdEZpbHRlcnNPblJlcG9ydFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgZGF0YS1icy10b2dnbGU9XCJjb2xsYXBzZVwiIGRhdGEtYnMtdGFyZ2V0PVwiI2ZpbHRlci1wYW5lbFwiIGhyZWY9XCIjXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZmlsdGVyXCI+PC9pPkNob29zZSBGaWx0ZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiZmlsdGVyLXBhbmVsXCIgY2xhc3M9XCJjYXJkLWJvZHkgY29sbGFwc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiB1c2VTdG9yZWRQcm9jXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6IHtuYW1lOiAnZmlsdGVyLXBhcmFtZXRlcnMnfVwiIGNsYXNzPVwiY29sLW1kLTEyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWZub3Q6IHVzZVN0b3JlZFByb2NcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZToge25hbWU6ICdmaWx0ZXItZ3JvdXAnfVwiIGNsYXNzPVwiY29sLW1kLTEyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogU2F2ZUZpbHRlckFuZFJ1blJlcG9ydFwiPlVwZGF0ZSBGaWx0ZXJzPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWZub3Q6IEVkaXRGaWx0ZXJzT25SZXBvcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZToge25hbWU6ICdmbHktZmlsdGVyLXRlbXBsYXRlJ31cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXBvcnQtcmVuZGVyXCIgZGF0YS1iaW5kPVwiY3NzOiB7ICdyZXBvcnQtZXhwYW5kZWQnOiBpc0V4cGFuZGVkIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVwb3J0LW1lbnViYXIgYmctbGlnaHRcIiBkYXRhLWJpbmQ9XCJoaWRkZW46IERvbnRFeGVjdXRlT25SdW4oKSAmJiAhcmVwb3J0UmFuKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC14cy0xMiBjb2wtY2VudGVyZWRcIiBkYXRhLWJpbmQ9XCJ3aXRoOiBwYWdlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0taW5saW5lIHB1bGwtbGVmdFwiIGRhdGEtYmluZD1cInZpc2libGU6IHBhZ2VzKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBwdWxsLWxlZnQgdG90YWwtcmVjb3Jkc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiAnIFRvdGFsIFJlY29yZHM6ICcgKyB0b3RhbFJlY29yZHMoKVwiPjwvc3Bhbj48YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBidG4tc21cIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAhJHJvb3QuaXNDaGFydCgpIHx8ICRyb290LlNob3dEYXRhV2l0aEdyYXBoKCksIGNsaWNrOiAkcm9vdC5kb3dubG9hZEV4Y2VsXCIgdGl0bGU9XCJFeHBvcnQgdG8gRXhjZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtZmlsZS1leGNlbC1vXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IGJ0bi1zbVwiIGRhdGEtYmluZD1cImNsaWNrOiAkcGFyZW50LnRvZ2dsZUV4cGFuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYVwiIGRhdGEtYmluZD1cImNzczogeydmYS1leHBhbmQnOiAhJHBhcmVudC5pc0V4cGFuZGVkKCksICdmYS1jb21wcmVzcyc6ICRwYXJlbnQuaXNFeHBhbmRlZCgpIH1cIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLXNtXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogJHBhcmVudC5jYW5EcmlsbGRvd24sIGNsaWNrOiAkcGFyZW50LkV4cGFuZEFsbFwiIHRpdGxlPVwiRXhwYW5kIGFsbCByb3dzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXBsdXNcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLXNtXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogJHBhcmVudC5jYW5EcmlsbGRvd24sIGNsaWNrOiAkcGFyZW50LkNvbGxhcHNlQWxsXCIgdGl0bGU9XCJDb2xsYXBzZSBhbGwgcm93c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1taW51c1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBidG4tc21cIiB0aXRsZT1cIlJlLXJ1biBSZXBvcnRcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKSB7ICRyb290LlJ1blJlcG9ydChmYWxzZSwgdHJ1ZSk7fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wbGF5XCI+PC9pPiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogJHBhcmVudFwiIGNsYXNzPVwicHVsbC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tc2VsZWN0ZWRcIiBkYXRhLWJpbmQ9XCJjbGljazogdG9nZ2xlRHJvcGRvd25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cIndpdGg6IHNlbGVjdGVkVGFibGVTdHlsZVwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCIgdGl0bGU9XCJGb3JtYXQgVGFibGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS0gZmEtcGFpbnQtYnJ1c2hcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250ZW50XCIgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogZHJvcGRvd25PcGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiB0YWJsZVN0eWxlcyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tb3B0aW9uXCIgZGF0YS1iaW5kPVwidGl0bGU6ICRkYXRhLm5hbWUsIGNsaWNrOiAkcGFyZW50LnNlbGVjdFN0eWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaW5pLXRhYmxlLXByZXZpZXdcIiBkYXRhLWJpbmQ9XCJmb3JlYWNoOiBuZXcgQXJyYXkoNSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaW5pLXRhYmxlLXJvd1wiIGRhdGEtYmluZD1cImZvcmVhY2g6IG5ldyBBcnJheSg1KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaW5pLXRhYmxlLWNlbGxcIiBkYXRhLWJpbmQ9XCJzdHlsZTogeyBiYWNrZ3JvdW5kQ29sb3I6ICRwYXJlbnRDb250ZXh0LiRpbmRleCgpID09PSAwID8gJHBhcmVudHNbMV0uaGVhZGVyQmcgOiAoJHBhcmVudENvbnRleHQuJGluZGV4KCkgJSAyID09PSAwID8gJHBhcmVudHNbMV0uYWx0Um93QmcgOiAkcGFyZW50c1sxXS5yb3dCZyksIGNvbG9yOiAkcGFyZW50c1sxXS50ZXh0Q29sb3IgfVwiPjwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0taW5saW5lIHB1bGwtcmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAncGFnZXItdGVtcGxhdGUnLCBkYXRhOiAkZGF0YVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGJ0bi1ncm91cC1zbSBwdWxsLXJpZ2h0XCIgcm9sZT1cImdyb3VwXCI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saWdodFwiIGRhdGEtYnMtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLWJzLXRhcmdldD1cIiNzcWxNb2RhbFwiIGRhdGEtYmluZD1cInZpc2libGU6ICRwYXJlbnQuYWRtaW5Nb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY29kZVwiPjwvaT4gVmlldyBSZXBvcnQgQ29kZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpZ2h0XCIgZGF0YS1iaW5kPVwiY2xpY2s6ICRwYXJlbnQuem9vbU91dFwiIGRhdGEtYnMtdG9nZ2xlPVwidG9vbHRpcFwiIHRpdGxlPVwiWm9vbSBPdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zZWFyY2gtbWludXNcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGlnaHRcIiBkYXRhLWJpbmQ9XCJjbGljazogJHBhcmVudC5yZXNldFpvb21cIiBkYXRhLWJzLXRvZ2dsZT1cInRvb2x0aXBcIiB0aXRsZT1cIlJlc2V0IFpvb21cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jb21wcmVzc1wiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saWdodFwiIGRhdGEtYmluZD1cImNsaWNrOiAkcGFyZW50Lnpvb21JblwiIGRhdGEtYnMtdG9nZ2xlPVwidG9vbHRpcFwiIHRpdGxlPVwiWm9vbSBJblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNlYXJjaC1wbHVzXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXBvcnQtY2FudmFzXCIgZGF0YS1iaW5kPVwiaGlkZGVuOiBEb250RXhlY3V0ZU9uUnVuKCkgJiYgIXJlcG9ydFJhbigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXBvcnQtY29udGFpbmVyIGJnLWxpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVwb3J0LWlubmVyIGJnLXdoaXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogJHJvb3QuQ2FuRWRpdCgpICYmIFJlcG9ydFR5cGUoKSE9J0h0bWwnICYmIFJlcG9ydFR5cGUoKSE9J1NpbmdsZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ2NoYXJ0LXNldHRpbmdzJywgZGF0YTogJGRhdGFcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6IGhlYWRlckRlc2lnbmVyLlVzZVJlcG9ydEhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwicmVwb3J0LWhlYWRlclwiIHdpZHRoPVwiOTAwXCIgaGVpZ2h0PVwiMTIwXCIgZGF0YS1iaW5kPVwiaHRtbDogaGVhZGVyRGVzaWduZXIuaGVhZGVySHRtbFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMiBkYXRhLWJpbmQ9XCJ0ZXh0OiBSZXBvcnROYW1lXCI+PC9oMj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBkYXRhLWJpbmQ9XCJodG1sOiBSZXBvcnREZXNjcmlwdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ3aXRoOiBSZXBvcnRSZXN1bHRcIiBjbGFzcz1cInJlcG9ydC1leHBhbmRlZC1zY3JvbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAhUmVwb3J0RGF0YSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVwb3J0LXNwaW5uZXJcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdyZXBvcnQtdGVtcGxhdGUnLCBkYXRhOiAkZGF0YVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlJlcG9ydCByYW4gb246IDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IG5ldyBEYXRlKCkudG9Mb2NhbGVEYXRlU3RyaW5nKCkgKyAnICcgKyBuZXcgRGF0ZSgpLnRvTG9jYWxlVGltZVN0cmluZygpXCI+PC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogSGFzRXJyb3JcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGRhdGEtYmluZD1cInRleHQ6ICRyb290LlJlcG9ydE5hbWVcIj48L2gyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBkYXRhLWJpbmQ9XCJ0ZXh0OiAkcm9vdC5SZXBvcnREZXNjcmlwdGlvblwiPjwvcD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5BbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VyZWQgd2hpbGUgcnVubmluZyB0aGUgUmVwb3J0PC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGhyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxiPkVycm9yIERldGFpbHM8L2I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGV4dDogRXhjZXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saWdodFwiIGRhdGEtYnMtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLWJzLXRhcmdldD1cIiNzcWxNb2RhbFwiIGRhdGEtYmluZD1cInZpc2libGU6ICRwYXJlbnQuYWRtaW5Nb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNvZGVcIj48L2k+IFZpZXcgUmVwb3J0IENvZGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpZ2h0XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCkgeyAkcm9vdC5SdW5SZXBvcnQoZmFsc2UsIHRydWUpO31cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcGxheVwiPjwvaT4gUmUtcnVuIFJlcG9ydFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGhyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48IS0tIFJlcG9ydCBCdWlsZGVyIC0tPlxyXG48ZGl2IGNsYXNzPVwibW9kYWwgbW9kYWwtZnVsbHNjcmVlblwiIGlkPVwibW9kYWwtcmVwb3J0YnVpbGRlclwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWxhYmVsbGVkYnk9XCJteU1vZGFsTGFiZWxcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDBweCAhaW1wb3J0YW50O1wiPlxyXG4gICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZToge25hbWU6ICdyZXBvcnQtZGVzaWduZXInLCBkYXRhOiAkZGF0YX1cIj48L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48IS0tIEZpZWxkIE9wdGlvbnMgTW9kYWwgLS0+XHJcbjxkaXYgY2xhc3M9XCJtb2RhbFwiIGlkPVwiZmllbGRPcHRpb25zTW9kYWxcIiB0YWJpbmRleD1cIi0xXCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZToge25hbWU6ICdyZXBvcnQtZmllbGQtb3B0aW9ucycsIGRhdGE6ICRkYXRhfVwiPjwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gTGluayBFZGl0IE1vZGFsIC0tPlxyXG48ZGl2IGNsYXNzPVwibW9kYWxcIiBpZD1cImxpbmtNb2RhbFwiIHRhYmluZGV4PVwiLTFcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiB7bmFtZTogJ3JlcG9ydC1saW5rLWVkaXQnLCBkYXRhOiAkZGF0YX1cIj48L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48IS0tIEZvbGRlciBFZGl0IE1vZGFsIC0tPlxyXG48ZGl2IGNsYXNzPVwibW9kYWxcIiBpZD1cImZvbGRlck1vZGFsXCIgdGFiaW5kZXg9XCItMVwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2dcIiBkYXRhLWJpbmQ9XCJjc3M6IHsnbW9kYWwtbGcnOiBhZG1pbk1vZGV9XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIiBkYXRhLWJpbmQ9XCJ3aXRoOiBNYW5hZ2VGb2xkZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGUgIGZzLTVcIj5NYW5hZ2UgRm9sZGVyPC9oNT5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1tZC00IGNvbnRyb2wtbGFiZWxcIj5Gb2xkZXIgTmFtZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04IGNvbC1tZC04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJmb2xkZXJOYW1lXCIgcmVxdWlyZWQgcGxhY2Vob2xkZXI9XCJGb2xkZXIgTmFtZVwiIGRhdGEtYmluZD1cInZhbHVlOiBGb2xkZXJOYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcm9vdC5hZG1pbk1vZGVcIiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZToge25hbWU6ICdtYW5hZ2UtYWNjZXNzLXRlbXBsYXRlJywgZGF0YTogJHJvb3QubWFuYWdlRm9sZGVyQWNjZXNzfVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IHNhdmVGb2xkZXJcIj5TYXZlPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPCEtLSBJbXBvcnQgSnNvbiBGaWxlIE1vZGFsIC0tPlxyXG48ZGl2IGNsYXNzPVwibW9kYWxcIiBpZD1cInVwbG9hZEZpbGVNb2RhbFwiIHRhYmluZGV4PVwiLTFcIiBhcmlhLWxhYmVsbGVkYnk9XCJ1cGxvYWRGaWxlTW9kYWxMYWJlbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCIgZGF0YS1iaW5kPVwid2l0aDogTWFuYWdlSnNvbkZpbGVcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cInVwbG9hZEZpbGVNb2RhbExhYmVsXCI+SW1wb3J0IHByZXZpb3VzbHkgRXhwb3J0ZWQgUmVwb3J0czwvaDU+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvIHNtYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz5JbnN0cnVjdGlvbnM6PC9zdHJvbmc+PGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAg4oCiIFNlbGVjdCBhIDxjb2RlPi5qc29uPC9jb2RlPiBmaWxlIHByZXZpb3VzbHkgZXhwb3J0ZWQgZnJvbSBEb3RuZXQgUmVwb3J0LjxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgIOKAoiBUaGUgZmlsZSBtYXkgaW5jbHVkZSBtdWx0aXBsZSByZXBvcnRzIGFuZCB0aGVpciBmb2xkZXJzLjxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgIOKAoiBBbnkgbWlzc2luZyBmb2xkZXJzIHdpbGwgYmUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5LjxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgIOKAoiBJZiBhIHJlcG9ydCB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMsIHlvdSB3aWxsIGJlIHByb21wdGVkIHRvOlxyXG4gICAgICAgICAgICAgICAgICAgIDxlbT5Ta2lwPC9lbT4sIDxlbT5PdmVyd3JpdGU8L2VtPiwgb3IgPGVtPk1ha2UgYSBDb3B5PC9lbT4uPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAg4oCiIE9uY2UgdXBsb2FkZWQsIGFsbCBpbXBvcnRlZCByZXBvcnRzIHdpbGwgYmUgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBpZD1cImRyb3B6b25lXCIgY2xhc3M9XCJkcm9wem9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImV2ZW50OiB7Y2xpY2s6IHRyaWdnZXJGaWxlSW5wdXQgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYm9yZGVyOiAycHggZGFzaGVkICMwMDdiZmY7IGJvcmRlci1yYWRpdXM6IDVweDsgcGFkZGluZzogMzBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogIzAwN2JmZjsgY3Vyc29yOiBwb2ludGVyO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIENsaWNrIGhlcmUgdG8gc2VsZWN0IGEgSlNPTiBmaWxlXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBpZD1cImZpbGVJbnB1dEpzb25cIiBhY2NlcHQ9XCIuanNvblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImV2ZW50OiB7IGNoYW5nZTogaGFuZGxlRmlsZVNlbGVjdCB9XCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTNcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBmaWxlTmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwPjxzdHJvbmc+U2VsZWN0ZWQgRmlsZTo8L3N0cm9uZz4gPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogZmlsZU5hbWVcIj48L3NwYW4+PC9wPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCI+Q2xvc2U8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IHVwbG9hZEZpbGVcIj5VcGxvYWQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwibW9kYWxcIiBpZD1cIndvcmRPcHRpb25zTW9kYWxcIiB0YWJpbmRleD1cIi0xXCIgYXJpYS1sYWJlbGxlZGJ5PVwid29yZE9wdGlvbnNNb2RhbExhYmVsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiB7IG5hbWU6ICd3b3JkLW9wdGlvbnMtdGVtcGxhdGUnLCBkYXRhOiAkZGF0YSB9XCI+PC9kaXY+XHJcbjwvZGl2PlxyXG48ZGl2IGNsYXNzPVwibW9kYWxcIiBpZD1cInBkZk9wdGlvbnNNb2RhbFwiIHRhYmluZGV4PVwiLTFcIiBhcmlhLWxhYmVsbGVkYnk9XCJwZGZPcHRpb25zTW9kYWxMYWJlbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogeyBuYW1lOiAncGRmLW9wdGlvbnMtdGVtcGxhdGUnLCBkYXRhOiAkZGF0YSB9XCI+PC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPCEtLSBUaGlzIHJlbmRlcnMgdGhlIHRlbXBsYXRlIC0tPlxyXG48ZGl2IGNsYXNzPVwibW9kYWxcIiBpZD1cInBkZk9wdGlvbnNTY2hlZHVsZU1vZGFsXCIgdGFiaW5kZXg9XCItMVwiIGFyaWEtbGFiZWxsZWRieT1cInBkZk9wdGlvbnNTY2hlZHVsZU1vZGFsTGFiZWxcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6IHsgbmFtZTogJ3BkZi1vcHRpb25zLXNjaGVkdWxlLXRlbXBsYXRlJywgZGF0YTogJGRhdGEgfVwiPjwvZGl2PlxyXG48L2Rpdj5cclxuPCEtLSBUaGlzIHJlbmRlcnMgdGhlIHRlbXBsYXRlIC0tPlxyXG48ZGl2IGNsYXNzPVwibW9kYWxcIiBpZD1cIndvcmRPcHRpb25zU2NoZWR1bGVNb2RhbFwiIHRhYmluZGV4PVwiLTFcIiBhcmlhLWxhYmVsbGVkYnk9XCJ3b3JkT3B0aW9uc1NjaGVkdWxlTW9kYWxMYWJlbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogeyBuYW1lOiAnd29yZC1vcHRpb25zLXNjaGVkdWxlLXRlbXBsYXRlJywgZGF0YTogJGRhdGEgfVwiPjwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gVGVtcGxhdGVzIC0tPlxyXG48ZGl2IFtpbm5lckh0bWxdPVwicmVwb3J0VGVtcGxhdGVzXCI+PC9kaXY+XHJcbjwhLS0gVGVtcGxhdGVzIC0tPiJdfQ==
|