@grnsft/if 0.0.5 → 0.1.0
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/.examples/ompls/azure.yml +205 -0
- package/.github/workflows/nodejs-ci.yml +0 -8
- package/README.md +48 -9
- package/build/config/config.d.ts +0 -23
- package/build/config/config.js +1 -24
- package/build/index.js +3 -4
- package/build/lib/models-universe.js +95 -0
- package/build/lib/observatory.js +31 -0
- package/build/lib/supercomputer.js +109 -0
- package/examples/impls/test/azure.yml +8 -8
- package/examples/impls/test/ccf.yml +5 -3
- package/examples/impls/test/if-demo.yml +19 -9
- package/examples/impls/test/metadata.yml +3 -2
- package/examples/impls/test/nesting.yml +10 -13
- package/examples/impls/test/sci-e.yml +1 -1
- package/examples/impls/test/sci-m.yml +2 -2
- package/examples/impls/test/sci-o.yml +2 -4
- package/examples/impls/test/sci.yml +1 -2
- package/examples/impls/test/shell.yml +2 -1
- package/examples/impls/{tdp-finder-test.yml → test/tdp-finder.yml} +8 -8
- package/examples/ompls/ccf.yml +3 -1
- package/examples/ompls/if-demo.yml +46 -22
- package/package.json +12 -5
- package/tsconfig.build.json +7 -0
- package/tsconfig.build.tsbuildinfo +1 -0
- package/build/__mocks__/azure/index.d.ts +0 -11
- package/build/__mocks__/azure/index.js +0 -132
- package/build/__mocks__/boavizta/countries.json +0 -138
- package/build/__mocks__/boavizta/instance_types.json +0 -625
- package/build/__mocks__/boavizta/providers.json +0 -1
- package/build/__mocks__/fs/index.d.ts +0 -3
- package/build/__mocks__/fs/index.js +0 -56
- package/build/__mocks__/model-universe/index.d.ts +0 -31
- package/build/__mocks__/model-universe/index.js +0 -64
- package/build/__mocks__/watt-time/data.json +0 -119
- package/build/__tests__/integration/ompl/index.test.d.ts +0 -1
- package/build/__tests__/integration/ompl/index.test.js +0 -61
- package/build/__tests__/unit/lib/azure-importer/index.test.d.ts +0 -1
- package/build/__tests__/unit/lib/azure-importer/index.test.js +0 -152
- package/build/__tests__/unit/lib/boavizta/index.test.d.ts +0 -1
- package/build/__tests__/unit/lib/boavizta/index.test.js +0 -579
- package/build/__tests__/unit/lib/case-studies/aveva.test.d.ts +0 -1
- package/build/__tests__/unit/lib/case-studies/aveva.test.js +0 -36
- package/build/__tests__/unit/lib/case-studies/emem.test.d.ts +0 -1
- package/build/__tests__/unit/lib/case-studies/emem.test.js +0 -108
- package/build/__tests__/unit/lib/case-studies/eshoppen.test.d.ts +0 -1
- package/build/__tests__/unit/lib/case-studies/eshoppen.test.js +0 -53
- package/build/__tests__/unit/lib/case-studies/sci-accenture.test.d.ts +0 -1
- package/build/__tests__/unit/lib/case-studies/sci-accenture.test.js +0 -23
- package/build/__tests__/unit/lib/ccf/index.test.d.ts +0 -1
- package/build/__tests__/unit/lib/ccf/index.test.js +0 -223
- package/build/__tests__/unit/lib/cloud-instance-metadata/index.test.d.ts +0 -1
- package/build/__tests__/unit/lib/cloud-instance-metadata/index.test.js +0 -73
- package/build/__tests__/unit/lib/sci/index.test.d.ts +0 -1
- package/build/__tests__/unit/lib/sci/index.test.js +0 -106
- package/build/__tests__/unit/lib/sci-e/index.test.d.ts +0 -1
- package/build/__tests__/unit/lib/sci-e/index.test.js +0 -30
- package/build/__tests__/unit/lib/sci-m/index.test.d.ts +0 -1
- package/build/__tests__/unit/lib/sci-m/index.test.js +0 -58
- package/build/__tests__/unit/lib/sci-o/index.test.d.ts +0 -1
- package/build/__tests__/unit/lib/sci-o/index.test.js +0 -42
- package/build/__tests__/unit/lib/shell-imp/index.test.d.ts +0 -1
- package/build/__tests__/unit/lib/shell-imp/index.test.js +0 -21
- package/build/__tests__/unit/lib/tdp-finder/index.test.d.ts +0 -1
- package/build/__tests__/unit/lib/tdp-finder/index.test.js +0 -62
- package/build/__tests__/unit/lib/teads-aws/index.test.d.ts +0 -1
- package/build/__tests__/unit/lib/teads-aws/index.test.js +0 -170
- package/build/__tests__/unit/lib/teads-curve/index.test.d.ts +0 -1
- package/build/__tests__/unit/lib/teads-curve/index.test.js +0 -146
- package/build/__tests__/unit/lib/watt-time/index.test.d.ts +0 -1
- package/build/__tests__/unit/lib/watt-time/index.test.js +0 -106
- package/build/__tests__/unit/util/args.test.d.ts +0 -1
- package/build/__tests__/unit/util/args.test.js +0 -92
- package/build/__tests__/unit/util/models-universe.test.d.ts +0 -1
- package/build/__tests__/unit/util/models-universe.test.js +0 -193
- package/build/__tests__/unit/util/observatory.test.d.ts +0 -1
- package/build/__tests__/unit/util/observatory.test.js +0 -99
- package/build/__tests__/unit/util/supercomputer.test.d.ts +0 -1
- package/build/__tests__/unit/util/supercomputer.test.js +0 -231
- package/build/__tests__/unit/util/yaml.test.d.ts +0 -1
- package/build/__tests__/unit/util/yaml.test.js +0 -59
- package/build/lib/azure-importer/index.d.ts +0 -55
- package/build/lib/azure-importer/index.js +0 -314
- package/build/lib/boavizta/index.d.ts +0 -53
- package/build/lib/boavizta/index.js +0 -254
- package/build/lib/case-studies/aveva-model.d.ts +0 -29
- package/build/lib/case-studies/aveva-model.js +0 -53
- package/build/lib/case-studies/emem-model.d.ts +0 -42
- package/build/lib/case-studies/emem-model.js +0 -93
- package/build/lib/case-studies/eshoppen-model.d.ts +0 -24
- package/build/lib/case-studies/eshoppen-model.js +0 -123
- package/build/lib/case-studies/index.d.ts +0 -4
- package/build/lib/case-studies/index.js +0 -21
- package/build/lib/case-studies/sci-accenture-model.d.ts +0 -10
- package/build/lib/case-studies/sci-accenture-model.js +0 -37
- package/build/lib/ccf/aws-embodied.json +0 -5591
- package/build/lib/ccf/aws-instances.json +0 -21116
- package/build/lib/ccf/aws-use.json +0 -79
- package/build/lib/ccf/azure-embodied.json +0 -6547
- package/build/lib/ccf/azure-instances.json +0 -8332
- package/build/lib/ccf/azure-use.json +0 -58
- package/build/lib/ccf/gcp-embodied.json +0 -3049
- package/build/lib/ccf/gcp-instances.json +0 -3880
- package/build/lib/ccf/gcp-use.json +0 -58
- package/build/lib/ccf/index.d.ts +0 -63
- package/build/lib/ccf/index.js +0 -338
- package/build/lib/cloud-instance-metadata/aws-instances.json +0 -1
- package/build/lib/cloud-instance-metadata/azure-instances.json +0 -1
- package/build/lib/cloud-instance-metadata/index.d.ts +0 -15
- package/build/lib/cloud-instance-metadata/index.js +0 -104
- package/build/lib/index.d.ts +0 -14
- package/build/lib/index.js +0 -32
- package/build/lib/interfaces/ccf.d.ts +0 -19
- package/build/lib/interfaces/ccf.js +0 -3
- package/build/lib/interfaces/index.d.ts +0 -7
- package/build/lib/interfaces/index.js +0 -18
- package/build/lib/sci/index.d.ts +0 -13
- package/build/lib/sci/index.js +0 -131
- package/build/lib/sci-e/index.d.ts +0 -38
- package/build/lib/sci-e/index.js +0 -85
- package/build/lib/sci-m/index.d.ts +0 -10
- package/build/lib/sci-m/index.js +0 -124
- package/build/lib/sci-o/index.d.ts +0 -17
- package/build/lib/sci-o/index.js +0 -52
- package/build/lib/shell-imp/index.d.ts +0 -32
- package/build/lib/shell-imp/index.js +0 -82
- package/build/lib/tdp-finder/index.d.ts +0 -19
- package/build/lib/tdp-finder/index.js +0 -98
- package/build/lib/teads-aws/aws-embodied.json +0 -1
- package/build/lib/teads-aws/aws-instances.json +0 -1
- package/build/lib/teads-aws/index.d.ts +0 -58
- package/build/lib/teads-aws/index.js +0 -208
- package/build/lib/teads-curve/index.d.ts +0 -52
- package/build/lib/teads-curve/index.js +0 -158
- package/build/lib/watt-time/index.d.ts +0 -18
- package/build/lib/watt-time/index.js +0 -204
- package/build/util/models-universe.js +0 -95
- package/build/util/observatory.js +0 -31
- package/build/util/supercomputer.js +0 -109
- package/docs/implementations/tdp-finder.md +0 -36
- package/examples/impls/test/complex-pipeline.yml +0 -67
- package/examples/impls/test/toto.yaml +0 -22
- package/tsconfig.tsbuildinfo +0 -1
- /package/build/{util → lib}/models-universe.d.ts +0 -0
- /package/build/{util → lib}/observatory.d.ts +0 -0
- /package/build/{util → lib}/supercomputer.d.ts +0 -0
|
@@ -1,579 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const globals_1 = require("@jest/globals");
|
|
4
|
-
const index_1 = require("../../../../lib/boavizta/index");
|
|
5
|
-
const axios_1 = require("axios");
|
|
6
|
-
const PROVIDERS = require("../../../../__mocks__/boavizta/providers.json");
|
|
7
|
-
const COUNTRIES = require("../../../../__mocks__/boavizta/countries.json");
|
|
8
|
-
const INSTANCE_TYPES = require("../../../../__mocks__/boavizta/instance_types.json");
|
|
9
|
-
async function axiosGet(url) {
|
|
10
|
-
switch (url) {
|
|
11
|
-
case 'https://api.boavizta.org/v1/cloud/instance/all_providers':
|
|
12
|
-
return { data: PROVIDERS };
|
|
13
|
-
case 'https://api.boavizta.org/v1/utils/country_code':
|
|
14
|
-
return Promise.resolve({ data: COUNTRIES });
|
|
15
|
-
case 'https://api.boavizta.org/v1/cloud/instance/all_instances?provider=aws':
|
|
16
|
-
return Promise.resolve({
|
|
17
|
-
data: INSTANCE_TYPES['aws'],
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
return Promise.resolve({});
|
|
21
|
-
}
|
|
22
|
-
globals_1.jest.mock('axios');
|
|
23
|
-
const mockAxios = axios_1.default;
|
|
24
|
-
// Mock out all top level functions, such as get, put, delete and post:
|
|
25
|
-
mockAxios.get.mockImplementation(axiosGet);
|
|
26
|
-
mockAxios.post.mockImplementation((url) => {
|
|
27
|
-
switch (url) {
|
|
28
|
-
case 'https://api.boavizta.org/v1/component/cpu?verbose=false&duration=1':
|
|
29
|
-
return Promise.resolve({
|
|
30
|
-
data: {
|
|
31
|
-
outputs: {
|
|
32
|
-
gwp: {
|
|
33
|
-
embedded: {
|
|
34
|
-
value: 0.0008,
|
|
35
|
-
min: 0.0004155,
|
|
36
|
-
max: 0.003113,
|
|
37
|
-
warnings: ['End of life is not included in the calculation'],
|
|
38
|
-
},
|
|
39
|
-
use: { value: 0.06743, min: 0.06743, max: 0.06743 },
|
|
40
|
-
unit: 'kgCO2eq',
|
|
41
|
-
description: 'Total climate change',
|
|
42
|
-
},
|
|
43
|
-
adp: {
|
|
44
|
-
embedded: {
|
|
45
|
-
value: 7.764e-7,
|
|
46
|
-
min: 7.763e-7,
|
|
47
|
-
max: 7.771e-7,
|
|
48
|
-
warnings: ['End of life is not included in the calculation'],
|
|
49
|
-
},
|
|
50
|
-
use: { value: 1.796e-8, min: 1.796e-8, max: 1.796e-8 },
|
|
51
|
-
unit: 'kgSbeq',
|
|
52
|
-
description: 'Use of minerals and fossil ressources',
|
|
53
|
-
},
|
|
54
|
-
pe: {
|
|
55
|
-
embedded: {
|
|
56
|
-
value: 0.012,
|
|
57
|
-
min: 0.006847,
|
|
58
|
-
max: 0.04314,
|
|
59
|
-
warnings: ['End of life is not included in the calculation'],
|
|
60
|
-
},
|
|
61
|
-
use: { value: 2.07, min: 2.07, max: 2.07 },
|
|
62
|
-
unit: 'MJ',
|
|
63
|
-
description: 'Consumption of primary energy',
|
|
64
|
-
},
|
|
65
|
-
},
|
|
66
|
-
},
|
|
67
|
-
});
|
|
68
|
-
case 'https://api.boavizta.org/v1/component/cpu?verbose=true&duration=2':
|
|
69
|
-
return Promise.resolve({
|
|
70
|
-
data: {
|
|
71
|
-
outputs: {
|
|
72
|
-
gwp: {
|
|
73
|
-
embedded: {
|
|
74
|
-
value: 0.0016,
|
|
75
|
-
min: 0.000831,
|
|
76
|
-
max: 0.006226,
|
|
77
|
-
warnings: ['End of life is not included in the calculation'],
|
|
78
|
-
},
|
|
79
|
-
use: { value: 0.1924, min: 0.1924, max: 0.1924 },
|
|
80
|
-
unit: 'kgCO2eq',
|
|
81
|
-
description: 'Total climate change',
|
|
82
|
-
},
|
|
83
|
-
adp: {
|
|
84
|
-
embedded: {
|
|
85
|
-
value: 0.000001553,
|
|
86
|
-
min: 0.000001553,
|
|
87
|
-
max: 0.000001554,
|
|
88
|
-
warnings: ['End of life is not included in the calculation'],
|
|
89
|
-
},
|
|
90
|
-
use: { value: 5.126e-8, min: 5.126e-8, max: 5.126e-8 },
|
|
91
|
-
unit: 'kgSbeq',
|
|
92
|
-
description: 'Use of minerals and fossil ressources',
|
|
93
|
-
},
|
|
94
|
-
pe: {
|
|
95
|
-
embedded: {
|
|
96
|
-
value: 0.023,
|
|
97
|
-
min: 0.01369,
|
|
98
|
-
max: 0.08627,
|
|
99
|
-
warnings: ['End of life is not included in the calculation'],
|
|
100
|
-
},
|
|
101
|
-
use: { value: 5.907, min: 5.907, max: 5.907 },
|
|
102
|
-
unit: 'MJ',
|
|
103
|
-
description: 'Consumption of primary energy',
|
|
104
|
-
},
|
|
105
|
-
},
|
|
106
|
-
verbose: {
|
|
107
|
-
outputs: {
|
|
108
|
-
gwp: {
|
|
109
|
-
embedded: {
|
|
110
|
-
value: 0.0016,
|
|
111
|
-
min: 0.000831,
|
|
112
|
-
max: 0.006226,
|
|
113
|
-
warnings: [
|
|
114
|
-
'End of life is not included in the calculation',
|
|
115
|
-
],
|
|
116
|
-
},
|
|
117
|
-
use: { value: 0.1924, min: 0.1924, max: 0.1924 },
|
|
118
|
-
unit: 'kgCO2eq',
|
|
119
|
-
description: 'Total climate change',
|
|
120
|
-
},
|
|
121
|
-
adp: {
|
|
122
|
-
embedded: {
|
|
123
|
-
value: 0.000001553,
|
|
124
|
-
min: 0.000001553,
|
|
125
|
-
max: 0.000001554,
|
|
126
|
-
warnings: [
|
|
127
|
-
'End of life is not included in the calculation',
|
|
128
|
-
],
|
|
129
|
-
},
|
|
130
|
-
use: { value: 5.126e-8, min: 5.126e-8, max: 5.126e-8 },
|
|
131
|
-
unit: 'kgSbeq',
|
|
132
|
-
description: 'Use of minerals and fossil ressources',
|
|
133
|
-
},
|
|
134
|
-
pe: {
|
|
135
|
-
embedded: {
|
|
136
|
-
value: 0.023,
|
|
137
|
-
min: 0.01369,
|
|
138
|
-
max: 0.08627,
|
|
139
|
-
warnings: [
|
|
140
|
-
'End of life is not included in the calculation',
|
|
141
|
-
],
|
|
142
|
-
},
|
|
143
|
-
use: { value: 5.907, min: 5.907, max: 5.907 },
|
|
144
|
-
unit: 'MJ',
|
|
145
|
-
description: 'Consumption of primary energy',
|
|
146
|
-
},
|
|
147
|
-
},
|
|
148
|
-
units: { value: 1, status: 'ARCHETYPE', min: 1, max: 1 },
|
|
149
|
-
die_size: {
|
|
150
|
-
value: 521,
|
|
151
|
-
status: 'COMPLETED',
|
|
152
|
-
unit: 'mm2',
|
|
153
|
-
source: 'Average value for all families',
|
|
154
|
-
min: 41.2,
|
|
155
|
-
max: 3640,
|
|
156
|
-
},
|
|
157
|
-
duration: { value: 2, unit: 'hours' },
|
|
158
|
-
avg_power: {
|
|
159
|
-
value: 260.05,
|
|
160
|
-
status: 'COMPLETED',
|
|
161
|
-
unit: 'W',
|
|
162
|
-
min: 260.05,
|
|
163
|
-
max: 260.05,
|
|
164
|
-
},
|
|
165
|
-
time_workload: { value: 100, status: 'INPUT', unit: '%' },
|
|
166
|
-
usage_location: {
|
|
167
|
-
value: 'USA',
|
|
168
|
-
status: 'INPUT',
|
|
169
|
-
unit: 'CodSP3 - NCS Country Codes - NATO',
|
|
170
|
-
},
|
|
171
|
-
use_time_ratio: {
|
|
172
|
-
value: 1,
|
|
173
|
-
status: 'ARCHETYPE',
|
|
174
|
-
unit: '/1',
|
|
175
|
-
min: 1,
|
|
176
|
-
max: 1,
|
|
177
|
-
},
|
|
178
|
-
hours_life_time: {
|
|
179
|
-
value: 26280,
|
|
180
|
-
status: 'ARCHETYPE',
|
|
181
|
-
unit: 'hours',
|
|
182
|
-
min: 26280,
|
|
183
|
-
max: 26280,
|
|
184
|
-
},
|
|
185
|
-
params: {
|
|
186
|
-
value: { a: 171.2, b: 0.0354, c: 36.89, d: -10.13 },
|
|
187
|
-
status: 'ARCHETYPE',
|
|
188
|
-
},
|
|
189
|
-
gwp_factor: {
|
|
190
|
-
value: 0.37,
|
|
191
|
-
status: 'COMPLETED',
|
|
192
|
-
unit: 'kg CO2eq/kWh',
|
|
193
|
-
source: 'https://ember-climate.org/data/data-explorer',
|
|
194
|
-
min: 0.37,
|
|
195
|
-
max: 0.37,
|
|
196
|
-
},
|
|
197
|
-
adp_factor: {
|
|
198
|
-
value: 9.85548e-8,
|
|
199
|
-
status: 'COMPLETED',
|
|
200
|
-
unit: 'kg Sbeq/kWh',
|
|
201
|
-
source: 'ADEME Base outputS ®',
|
|
202
|
-
min: 9.85548e-8,
|
|
203
|
-
max: 9.85548e-8,
|
|
204
|
-
},
|
|
205
|
-
pe_factor: {
|
|
206
|
-
value: 11.358,
|
|
207
|
-
status: 'COMPLETED',
|
|
208
|
-
unit: 'MJ/kWh',
|
|
209
|
-
source: 'ADPf / (1-%renewable_energy)',
|
|
210
|
-
min: 11.358,
|
|
211
|
-
max: 11.358,
|
|
212
|
-
},
|
|
213
|
-
},
|
|
214
|
-
},
|
|
215
|
-
});
|
|
216
|
-
case 'https://api.boavizta.org/v1/cloud/instance?verbose=false&duration=0.004166666666666667':
|
|
217
|
-
return Promise.resolve({
|
|
218
|
-
data: {
|
|
219
|
-
outputs: {
|
|
220
|
-
gwp: {
|
|
221
|
-
embedded: {
|
|
222
|
-
value: 0.0016,
|
|
223
|
-
min: 0.000831,
|
|
224
|
-
max: 0.006226,
|
|
225
|
-
warnings: ['End of life is not included in the calculation'],
|
|
226
|
-
},
|
|
227
|
-
use: { value: 0.1924, min: 0.1924, max: 0.1924 },
|
|
228
|
-
unit: 'kgCO2eq',
|
|
229
|
-
description: 'Total climate change',
|
|
230
|
-
},
|
|
231
|
-
adp: {
|
|
232
|
-
embedded: {
|
|
233
|
-
value: 0.000001553,
|
|
234
|
-
min: 0.000001553,
|
|
235
|
-
max: 0.000001554,
|
|
236
|
-
warnings: ['End of life is not included in the calculation'],
|
|
237
|
-
},
|
|
238
|
-
use: { value: 5.126e-8, min: 5.126e-8, max: 5.126e-8 },
|
|
239
|
-
unit: 'kgSbeq',
|
|
240
|
-
description: 'Use of minerals and fossil ressources',
|
|
241
|
-
},
|
|
242
|
-
pe: {
|
|
243
|
-
embedded: {
|
|
244
|
-
value: 0.023,
|
|
245
|
-
min: 0.01369,
|
|
246
|
-
max: 0.08627,
|
|
247
|
-
warnings: ['End of life is not included in the calculation'],
|
|
248
|
-
},
|
|
249
|
-
use: { value: 5.907, min: 5.907, max: 5.907 },
|
|
250
|
-
unit: 'MJ',
|
|
251
|
-
description: 'Consumption of primary energy',
|
|
252
|
-
},
|
|
253
|
-
},
|
|
254
|
-
verbose: {
|
|
255
|
-
outputs: {
|
|
256
|
-
gwp: {
|
|
257
|
-
embedded: {
|
|
258
|
-
value: 0.0016,
|
|
259
|
-
min: 0.000831,
|
|
260
|
-
max: 0.006226,
|
|
261
|
-
warnings: [
|
|
262
|
-
'End of life is not included in the calculation',
|
|
263
|
-
],
|
|
264
|
-
},
|
|
265
|
-
use: { value: 0.1924, min: 0.1924, max: 0.1924 },
|
|
266
|
-
unit: 'kgCO2eq',
|
|
267
|
-
description: 'Total climate change',
|
|
268
|
-
},
|
|
269
|
-
adp: {
|
|
270
|
-
embedded: {
|
|
271
|
-
value: 0.000001553,
|
|
272
|
-
min: 0.000001553,
|
|
273
|
-
max: 0.000001554,
|
|
274
|
-
warnings: [
|
|
275
|
-
'End of life is not included in the calculation',
|
|
276
|
-
],
|
|
277
|
-
},
|
|
278
|
-
use: { value: 5.126e-8, min: 5.126e-8, max: 5.126e-8 },
|
|
279
|
-
unit: 'kgSbeq',
|
|
280
|
-
description: 'Use of minerals and fossil ressources',
|
|
281
|
-
},
|
|
282
|
-
pe: {
|
|
283
|
-
embedded: {
|
|
284
|
-
value: 0.023,
|
|
285
|
-
min: 0.01369,
|
|
286
|
-
max: 0.08627,
|
|
287
|
-
warnings: [
|
|
288
|
-
'End of life is not included in the calculation',
|
|
289
|
-
],
|
|
290
|
-
},
|
|
291
|
-
use: { value: 5.907, min: 5.907, max: 5.907 },
|
|
292
|
-
unit: 'MJ',
|
|
293
|
-
description: 'Consumption of primary energy',
|
|
294
|
-
},
|
|
295
|
-
},
|
|
296
|
-
units: { value: 1, status: 'ARCHETYPE', min: 1, max: 1 },
|
|
297
|
-
die_size: {
|
|
298
|
-
value: 521,
|
|
299
|
-
status: 'COMPLETED',
|
|
300
|
-
unit: 'mm2',
|
|
301
|
-
source: 'Average value for all families',
|
|
302
|
-
min: 41.2,
|
|
303
|
-
max: 3640,
|
|
304
|
-
},
|
|
305
|
-
duration: { value: 2, unit: 'hours' },
|
|
306
|
-
avg_power: {
|
|
307
|
-
value: 260.05,
|
|
308
|
-
status: 'COMPLETED',
|
|
309
|
-
unit: 'W',
|
|
310
|
-
min: 260.05,
|
|
311
|
-
max: 260.05,
|
|
312
|
-
},
|
|
313
|
-
time_workload: { value: 100, status: 'INPUT', unit: '%' },
|
|
314
|
-
usage_location: {
|
|
315
|
-
value: 'USA',
|
|
316
|
-
status: 'INPUT',
|
|
317
|
-
unit: 'CodSP3 - NCS Country Codes - NATO',
|
|
318
|
-
},
|
|
319
|
-
use_time_ratio: {
|
|
320
|
-
value: 1,
|
|
321
|
-
status: 'ARCHETYPE',
|
|
322
|
-
unit: '/1',
|
|
323
|
-
min: 1,
|
|
324
|
-
max: 1,
|
|
325
|
-
},
|
|
326
|
-
hours_life_time: {
|
|
327
|
-
value: 26280,
|
|
328
|
-
status: 'ARCHETYPE',
|
|
329
|
-
unit: 'hours',
|
|
330
|
-
min: 26280,
|
|
331
|
-
max: 26280,
|
|
332
|
-
},
|
|
333
|
-
params: {
|
|
334
|
-
value: { a: 171.2, b: 0.0354, c: 36.89, d: -10.13 },
|
|
335
|
-
status: 'ARCHETYPE',
|
|
336
|
-
},
|
|
337
|
-
gwp_factor: {
|
|
338
|
-
value: 0.37,
|
|
339
|
-
status: 'COMPLETED',
|
|
340
|
-
unit: 'kg CO2eq/kWh',
|
|
341
|
-
source: 'https://ember-climate.org/data/data-explorer',
|
|
342
|
-
min: 0.37,
|
|
343
|
-
max: 0.37,
|
|
344
|
-
},
|
|
345
|
-
adp_factor: {
|
|
346
|
-
value: 9.85548e-8,
|
|
347
|
-
status: 'COMPLETED',
|
|
348
|
-
unit: 'kg Sbeq/kWh',
|
|
349
|
-
source: 'ADEME Base outputS ®',
|
|
350
|
-
min: 9.85548e-8,
|
|
351
|
-
max: 9.85548e-8,
|
|
352
|
-
},
|
|
353
|
-
pe_factor: {
|
|
354
|
-
value: 11.358,
|
|
355
|
-
status: 'COMPLETED',
|
|
356
|
-
unit: 'MJ/kWh',
|
|
357
|
-
source: 'ADPf / (1-%renewable_energy)',
|
|
358
|
-
min: 11.358,
|
|
359
|
-
max: 11.358,
|
|
360
|
-
},
|
|
361
|
-
},
|
|
362
|
-
},
|
|
363
|
-
});
|
|
364
|
-
}
|
|
365
|
-
return Promise.resolve({});
|
|
366
|
-
});
|
|
367
|
-
globals_1.jest.setTimeout(30000);
|
|
368
|
-
(0, globals_1.describe)('cpu:configure test', () => {
|
|
369
|
-
(0, globals_1.test)('initialize wrong params should throw error', async () => {
|
|
370
|
-
const outputModel = new index_1.BoaviztaCpuOutputModel();
|
|
371
|
-
await (0, globals_1.expect)(outputModel.configure('test', { allocation: 'wrong' })).rejects.toThrowError();
|
|
372
|
-
(0, globals_1.expect)(outputModel.name).toBe('test');
|
|
373
|
-
});
|
|
374
|
-
(0, globals_1.test)('initialize without params throws error for parameter and call execute without params throws error for input', async () => {
|
|
375
|
-
const outputModel = new index_1.BoaviztaCpuOutputModel();
|
|
376
|
-
const outputModelConfigFail = new index_1.BoaviztaCpuOutputModel();
|
|
377
|
-
(0, globals_1.expect)(outputModel.modelIdentifier()).toBe('org.boavizta.cpu.sci');
|
|
378
|
-
await (0, globals_1.expect)(outputModel.authenticate({})).resolves.toBe(undefined);
|
|
379
|
-
await (0, globals_1.expect)(outputModelConfigFail.execute([
|
|
380
|
-
{
|
|
381
|
-
timestamp: '2021-01-01T00:00:00Z',
|
|
382
|
-
duration: 3600,
|
|
383
|
-
'cpu-util': 50,
|
|
384
|
-
},
|
|
385
|
-
])).rejects.toThrowError();
|
|
386
|
-
await (0, globals_1.expect)(outputModel.configure('test')).rejects.toThrow(Error('Improper configure: Missing processor parameter'));
|
|
387
|
-
await (0, globals_1.expect)(outputModel.configure('test', {
|
|
388
|
-
'physical-processor': 'Intel Xeon Gold 6138f',
|
|
389
|
-
})).rejects.toThrow(Error('Improper configure: Missing core-units parameter'));
|
|
390
|
-
await (0, globals_1.expect)(outputModel.configure('test', {
|
|
391
|
-
'physical-processor': 'Intel Xeon Gold 6138f',
|
|
392
|
-
'core-units': 24,
|
|
393
|
-
'expected-lifespan': 4 * 365 * 24 * 60 * 60,
|
|
394
|
-
})).resolves.toBeInstanceOf(index_1.BoaviztaCpuOutputModel);
|
|
395
|
-
(0, globals_1.expect)(outputModel.name).toBe('test');
|
|
396
|
-
// not providing inputs will throw a missing inputs error
|
|
397
|
-
await (0, globals_1.expect)(outputModel.execute()).rejects.toStrictEqual(Error('Parameter Not Given: invalid inputs parameter. Expecting an array of inputs'));
|
|
398
|
-
// improper inputs will throw an invalid inputs error
|
|
399
|
-
await (0, globals_1.expect)(outputModel.execute([{ invalid: 'input' }])).rejects.toStrictEqual(Error('Invalid Input: Invalid inputs parameter'));
|
|
400
|
-
});
|
|
401
|
-
});
|
|
402
|
-
(0, globals_1.describe)('cpu:initialize with params', () => {
|
|
403
|
-
(0, globals_1.test)('initialize with params and call multiple usages in IMPL format', async () => {
|
|
404
|
-
const outputModel = new index_1.BoaviztaCpuOutputModel();
|
|
405
|
-
await (0, globals_1.expect)(outputModel.configure('test', {
|
|
406
|
-
'physical-processor': 'Intel Xeon Gold 6138f',
|
|
407
|
-
'core-units': 24,
|
|
408
|
-
location: 'USA',
|
|
409
|
-
})).resolves.toBeInstanceOf(index_1.BoaviztaCpuOutputModel);
|
|
410
|
-
(0, globals_1.expect)(outputModel.name).toBe('test');
|
|
411
|
-
// configure without static params will cause improper configure error
|
|
412
|
-
await (0, globals_1.expect)(outputModel.execute([
|
|
413
|
-
{
|
|
414
|
-
timestamp: '2021-01-01T00:00:00Z',
|
|
415
|
-
duration: 3600,
|
|
416
|
-
'cpu-util': 50,
|
|
417
|
-
},
|
|
418
|
-
])).resolves.toStrictEqual([
|
|
419
|
-
{
|
|
420
|
-
'embodied-carbon': 0.8,
|
|
421
|
-
'e-cpu': 0.575,
|
|
422
|
-
},
|
|
423
|
-
]);
|
|
424
|
-
});
|
|
425
|
-
(0, globals_1.test)('initialize with params and call multiple usages in IMPL format:verbose', async () => {
|
|
426
|
-
const outputModel = new index_1.BoaviztaCpuOutputModel();
|
|
427
|
-
await (0, globals_1.expect)(outputModel.configure('test', {
|
|
428
|
-
'physical-processor': 'Intel Xeon Gold 6138f',
|
|
429
|
-
'core-units': 24,
|
|
430
|
-
location: 'USA',
|
|
431
|
-
verbose: true,
|
|
432
|
-
})).resolves.toBeInstanceOf(index_1.BoaviztaCpuOutputModel);
|
|
433
|
-
(0, globals_1.expect)(outputModel.name).toBe('test');
|
|
434
|
-
// configure without static params will cause improper configure error
|
|
435
|
-
await (0, globals_1.expect)(outputModel.execute([
|
|
436
|
-
{
|
|
437
|
-
timestamp: '2021-01-01T00:00:00Z',
|
|
438
|
-
duration: 7200,
|
|
439
|
-
'cpu-util': 100,
|
|
440
|
-
},
|
|
441
|
-
])).resolves.toStrictEqual([
|
|
442
|
-
{
|
|
443
|
-
'embodied-carbon': 1.6,
|
|
444
|
-
'e-cpu': 1.6408333333333334,
|
|
445
|
-
},
|
|
446
|
-
]);
|
|
447
|
-
});
|
|
448
|
-
});
|
|
449
|
-
(0, globals_1.describe)('cloud:initialize with params', () => {
|
|
450
|
-
(0, globals_1.test)('initialize with params and call usage in RAW Format', async () => {
|
|
451
|
-
const outputModel = new index_1.BoaviztaCloudOutputModel();
|
|
452
|
-
(0, globals_1.expect)(outputModel.modelIdentifier()).toBe('org.boavizta.cloud.sci');
|
|
453
|
-
await (0, globals_1.expect)(outputModel.validateLocation({ location: 'SomethingFail' })).rejects.toThrowError();
|
|
454
|
-
await (0, globals_1.expect)(outputModel.validateInstanceType({ 'instance-type': 'SomethingFail' })).rejects.toThrowError();
|
|
455
|
-
await (0, globals_1.expect)(outputModel.validateProvider({ provider: 'SomethingFail' })).rejects.toThrowError();
|
|
456
|
-
await (0, globals_1.expect)(outputModel.configure('test', {
|
|
457
|
-
'instance-type': 't2.micro',
|
|
458
|
-
location: 'USA',
|
|
459
|
-
'expected-lifespan': 4 * 365 * 24 * 60 * 60,
|
|
460
|
-
provider: 'aws',
|
|
461
|
-
verbose: false,
|
|
462
|
-
})).resolves.toBeInstanceOf(index_1.BoaviztaCloudOutputModel);
|
|
463
|
-
await (0, globals_1.expect)(outputModel.configure('test', {
|
|
464
|
-
'instance-type': 't2.micro',
|
|
465
|
-
location: 'USA',
|
|
466
|
-
'expected-lifespan': 4 * 365 * 24 * 60 * 60,
|
|
467
|
-
provider: 'aws',
|
|
468
|
-
verbose: 'false',
|
|
469
|
-
})).resolves.toBeInstanceOf(index_1.BoaviztaCloudOutputModel);
|
|
470
|
-
await (0, globals_1.expect)(outputModel.configure('test', {
|
|
471
|
-
'instance-type': 't2.micro',
|
|
472
|
-
location: 'USA',
|
|
473
|
-
'expected-lifespan': 4 * 365 * 24 * 60 * 60,
|
|
474
|
-
provider: 'aws',
|
|
475
|
-
verbose: 0,
|
|
476
|
-
})).resolves.toBeInstanceOf(index_1.BoaviztaCloudOutputModel);
|
|
477
|
-
(0, globals_1.expect)(outputModel.name).toBe('test');
|
|
478
|
-
// configure without static params will cause improper configure error
|
|
479
|
-
});
|
|
480
|
-
(0, globals_1.test)("correct 'instance-type': initialize with params and call usage in IMPL Format", async () => {
|
|
481
|
-
const outputModel = new index_1.BoaviztaCloudOutputModel();
|
|
482
|
-
await (0, globals_1.expect)(outputModel.configure('test', {
|
|
483
|
-
'instance-type': 't2.micro',
|
|
484
|
-
location: 'USA',
|
|
485
|
-
})).rejects.toThrowError();
|
|
486
|
-
await (0, globals_1.expect)(outputModel.configure('test', {
|
|
487
|
-
provider: 'aws',
|
|
488
|
-
location: 'USA',
|
|
489
|
-
})).rejects.toThrowError();
|
|
490
|
-
await (0, globals_1.expect)(outputModel.configure('test', {
|
|
491
|
-
'instance-type': 't2.micro',
|
|
492
|
-
location: 'USA',
|
|
493
|
-
provider: 'aws',
|
|
494
|
-
})).resolves.toBeInstanceOf(index_1.BoaviztaCloudOutputModel);
|
|
495
|
-
(0, globals_1.expect)(outputModel.name).toBe('test');
|
|
496
|
-
// mockAxios.get.mockResolvedValue({data: {}});
|
|
497
|
-
await (0, globals_1.expect)(outputModel.execute([
|
|
498
|
-
{
|
|
499
|
-
timestamp: '2021-01-01T00:00:00Z',
|
|
500
|
-
duration: 15,
|
|
501
|
-
'cpu-util': 34,
|
|
502
|
-
},
|
|
503
|
-
])).resolves.toStrictEqual([
|
|
504
|
-
{
|
|
505
|
-
'embodied-carbon': 1.6,
|
|
506
|
-
energy: 1.6408333333333334,
|
|
507
|
-
},
|
|
508
|
-
]);
|
|
509
|
-
});
|
|
510
|
-
(0, globals_1.test)('wrong "instance-type": initialize with params and call usage in IMPL Format throws error', async () => {
|
|
511
|
-
const outputModel = new index_1.BoaviztaCloudOutputModel();
|
|
512
|
-
await (0, globals_1.expect)(outputModel.configure('test', {
|
|
513
|
-
'instance-type': 't5.micro',
|
|
514
|
-
location: 'USA',
|
|
515
|
-
provider: 'aws',
|
|
516
|
-
})).rejects.toThrowError();
|
|
517
|
-
(0, globals_1.expect)(outputModel.name).toBe('test');
|
|
518
|
-
// configure without static params will cause improper configure error
|
|
519
|
-
await (0, globals_1.expect)(outputModel.execute([
|
|
520
|
-
{
|
|
521
|
-
timestamp: '2021-01-01T00:00:00Z',
|
|
522
|
-
duration: 15,
|
|
523
|
-
'cpu-util': 34,
|
|
524
|
-
},
|
|
525
|
-
{
|
|
526
|
-
timestamp: '2021-01-01T00:00:15Z',
|
|
527
|
-
duration: 15,
|
|
528
|
-
'cpu-util': 12,
|
|
529
|
-
},
|
|
530
|
-
{
|
|
531
|
-
timestamp: '2021-01-01T00:00:30Z',
|
|
532
|
-
duration: 15,
|
|
533
|
-
'cpu-util': 1,
|
|
534
|
-
},
|
|
535
|
-
{
|
|
536
|
-
timestamp: '2021-01-01T00:00:45Z',
|
|
537
|
-
duration: 15,
|
|
538
|
-
'cpu-util': 78,
|
|
539
|
-
},
|
|
540
|
-
])).rejects.toThrowError();
|
|
541
|
-
});
|
|
542
|
-
(0, globals_1.test)('without "instance-type": initialize with params and call usage in IMPL Format throws error', async () => {
|
|
543
|
-
const outputModel = new index_1.BoaviztaCloudOutputModel();
|
|
544
|
-
await (0, globals_1.expect)(outputModel.configure('test', {
|
|
545
|
-
location: 'USA',
|
|
546
|
-
provider: 'aws',
|
|
547
|
-
})).rejects.toStrictEqual(Error("Improper configure: Missing 'instance-type' parameter"));
|
|
548
|
-
await (0, globals_1.expect)(outputModel.configure('test', {
|
|
549
|
-
location: 'USAF',
|
|
550
|
-
provider: 'aws',
|
|
551
|
-
'instance-type': 't2.micro',
|
|
552
|
-
})).rejects.toThrowError();
|
|
553
|
-
(0, globals_1.expect)(outputModel.name).toBe('test');
|
|
554
|
-
// configure without static params will cause improper configure error
|
|
555
|
-
await (0, globals_1.expect)(outputModel.execute([
|
|
556
|
-
{
|
|
557
|
-
timestamp: '2021-01-01T00:00:00Z',
|
|
558
|
-
duration: 15,
|
|
559
|
-
'cpu-util': 34,
|
|
560
|
-
},
|
|
561
|
-
{
|
|
562
|
-
timestamp: '2021-01-01T00:00:15Z',
|
|
563
|
-
duration: 15,
|
|
564
|
-
'cpu-util': 12,
|
|
565
|
-
},
|
|
566
|
-
{
|
|
567
|
-
timestamp: '2021-01-01T00:00:30Z',
|
|
568
|
-
duration: 15,
|
|
569
|
-
'cpu-util': 1,
|
|
570
|
-
},
|
|
571
|
-
{
|
|
572
|
-
timestamp: '2021-01-01T00:00:45Z',
|
|
573
|
-
duration: 15,
|
|
574
|
-
'cpu-util': 78,
|
|
575
|
-
},
|
|
576
|
-
])).rejects.toStrictEqual(Error('Improper configure: Missing configuration parameters'));
|
|
577
|
-
});
|
|
578
|
-
});
|
|
579
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9fX3Rlc3RzX18vdW5pdC9saWIvYm9hdml6dGEvaW5kZXgudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDJDQUEyRDtBQUMzRCwwREFHd0M7QUFDeEMsaUNBQTJDO0FBQzNDLDJFQUEyRTtBQUMzRSwyRUFBMkU7QUFDM0UscUZBQXFGO0FBRXJGLEtBQUssVUFBVSxRQUFRLENBQ3JCLEdBQVc7SUFFWCxRQUFRLEdBQUcsRUFBRTtRQUNYLEtBQUssMERBQTBEO1lBQzdELE9BQU8sRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFNLENBQUM7UUFDaEMsS0FBSyxnREFBZ0Q7WUFDbkQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBTSxDQUFDLENBQUM7UUFDakQsS0FBSyx1RUFBdUU7WUFDMUUsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDO2dCQUNyQixJQUFJLEVBQUUsY0FBYyxDQUFDLEtBQUssQ0FBQzthQUN2QixDQUFDLENBQUM7S0FDWDtJQUNELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFPLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQsY0FBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNuQixNQUFNLFNBQVMsR0FBRyxlQUFrQyxDQUFDO0FBQ3JELHVFQUF1RTtBQUN2RSxTQUFTLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzNDLFNBQVMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQy9CLENBQXFDLEdBQVcsRUFBYyxFQUFFO0lBQzlELFFBQVEsR0FBRyxFQUFFO1FBQ1gsS0FBSyxvRUFBb0U7WUFDdkUsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDO2dCQUNyQixJQUFJLEVBQUU7b0JBQ0osT0FBTyxFQUFFO3dCQUNQLEdBQUcsRUFBRTs0QkFDSCxRQUFRLEVBQUU7Z0NBQ1IsS0FBSyxFQUFFLE1BQU07Z0NBQ2IsR0FBRyxFQUFFLFNBQVM7Z0NBQ2QsR0FBRyxFQUFFLFFBQVE7Z0NBQ2IsUUFBUSxFQUFFLENBQUMsZ0RBQWdELENBQUM7NkJBQzdEOzRCQUNELEdBQUcsRUFBRSxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFDOzRCQUNqRCxJQUFJLEVBQUUsU0FBUzs0QkFDZixXQUFXLEVBQUUsc0JBQXNCO3lCQUNwQzt3QkFDRCxHQUFHLEVBQUU7NEJBQ0gsUUFBUSxFQUFFO2dDQUNSLEtBQUssRUFBRSxRQUFRO2dDQUNmLEdBQUcsRUFBRSxRQUFRO2dDQUNiLEdBQUcsRUFBRSxRQUFRO2dDQUNiLFFBQVEsRUFBRSxDQUFDLGdEQUFnRCxDQUFDOzZCQUM3RDs0QkFDRCxHQUFHLEVBQUUsRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBQzs0QkFDcEQsSUFBSSxFQUFFLFFBQVE7NEJBQ2QsV0FBVyxFQUFFLHVDQUF1Qzt5QkFDckQ7d0JBQ0QsRUFBRSxFQUFFOzRCQUNGLFFBQVEsRUFBRTtnQ0FDUixLQUFLLEVBQUUsS0FBSztnQ0FDWixHQUFHLEVBQUUsUUFBUTtnQ0FDYixHQUFHLEVBQUUsT0FBTztnQ0FDWixRQUFRLEVBQUUsQ0FBQyxnREFBZ0QsQ0FBQzs2QkFDN0Q7NEJBQ0QsR0FBRyxFQUFFLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUM7NEJBQ3hDLElBQUksRUFBRSxJQUFJOzRCQUNWLFdBQVcsRUFBRSwrQkFBK0I7eUJBQzdDO3FCQUNGO2lCQUNGO2FBQ0csQ0FBQyxDQUFDO1FBQ1YsS0FBSyxtRUFBbUU7WUFDdEUsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDO2dCQUNyQixJQUFJLEVBQUU7b0JBQ0osT0FBTyxFQUFFO3dCQUNQLEdBQUcsRUFBRTs0QkFDSCxRQUFRLEVBQUU7Z0NBQ1IsS0FBSyxFQUFFLE1BQU07Z0NBQ2IsR0FBRyxFQUFFLFFBQVE7Z0NBQ2IsR0FBRyxFQUFFLFFBQVE7Z0NBQ2IsUUFBUSxFQUFFLENBQUMsZ0RBQWdELENBQUM7NkJBQzdEOzRCQUNELEdBQUcsRUFBRSxFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFDOzRCQUM5QyxJQUFJLEVBQUUsU0FBUzs0QkFDZixXQUFXLEVBQUUsc0JBQXNCO3lCQUNwQzt3QkFDRCxHQUFHLEVBQUU7NEJBQ0gsUUFBUSxFQUFFO2dDQUNSLEtBQUssRUFBRSxXQUFXO2dDQUNsQixHQUFHLEVBQUUsV0FBVztnQ0FDaEIsR0FBRyxFQUFFLFdBQVc7Z0NBQ2hCLFFBQVEsRUFBRSxDQUFDLGdEQUFnRCxDQUFDOzZCQUM3RDs0QkFDRCxHQUFHLEVBQUUsRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBQzs0QkFDcEQsSUFBSSxFQUFFLFFBQVE7NEJBQ2QsV0FBVyxFQUFFLHVDQUF1Qzt5QkFDckQ7d0JBQ0QsRUFBRSxFQUFFOzRCQUNGLFFBQVEsRUFBRTtnQ0FDUixLQUFLLEVBQUUsS0FBSztnQ0FDWixHQUFHLEVBQUUsT0FBTztnQ0FDWixHQUFHLEVBQUUsT0FBTztnQ0FDWixRQUFRLEVBQUUsQ0FBQyxnREFBZ0QsQ0FBQzs2QkFDN0Q7NEJBQ0QsR0FBRyxFQUFFLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUM7NEJBQzNDLElBQUksRUFBRSxJQUFJOzRCQUNWLFdBQVcsRUFBRSwrQkFBK0I7eUJBQzdDO3FCQUNGO29CQUNELE9BQU8sRUFBRTt3QkFDUCxPQUFPLEVBQUU7NEJBQ1AsR0FBRyxFQUFFO2dDQUNILFFBQVEsRUFBRTtvQ0FDUixLQUFLLEVBQUUsTUFBTTtvQ0FDYixHQUFHLEVBQUUsUUFBUTtvQ0FDYixHQUFHLEVBQUUsUUFBUTtvQ0FDYixRQUFRLEVBQUU7d0NBQ1IsZ0RBQWdEO3FDQUNqRDtpQ0FDRjtnQ0FDRCxHQUFHLEVBQUUsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBQztnQ0FDOUMsSUFBSSxFQUFFLFNBQVM7Z0NBQ2YsV0FBVyxFQUFFLHNCQUFzQjs2QkFDcEM7NEJBQ0QsR0FBRyxFQUFFO2dDQUNILFFBQVEsRUFBRTtvQ0FDUixLQUFLLEVBQUUsV0FBVztvQ0FDbEIsR0FBRyxFQUFFLFdBQVc7b0NBQ2hCLEdBQUcsRUFBRSxXQUFXO29DQUNoQixRQUFRLEVBQUU7d0NBQ1IsZ0RBQWdEO3FDQUNqRDtpQ0FDRjtnQ0FDRCxHQUFHLEVBQUUsRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBQztnQ0FDcEQsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsV0FBVyxFQUFFLHVDQUF1Qzs2QkFDckQ7NEJBQ0QsRUFBRSxFQUFFO2dDQUNGLFFBQVEsRUFBRTtvQ0FDUixLQUFLLEVBQUUsS0FBSztvQ0FDWixHQUFHLEVBQUUsT0FBTztvQ0FDWixHQUFHLEVBQUUsT0FBTztvQ0FDWixRQUFRLEVBQUU7d0NBQ1IsZ0RBQWdEO3FDQUNqRDtpQ0FDRjtnQ0FDRCxHQUFHLEVBQUUsRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBQztnQ0FDM0MsSUFBSSxFQUFFLElBQUk7Z0NBQ1YsV0FBVyxFQUFFLCtCQUErQjs2QkFDN0M7eUJBQ0Y7d0JBQ0QsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBQzt3QkFDdEQsUUFBUSxFQUFFOzRCQUNSLEtBQUssRUFBRSxHQUFHOzRCQUNWLE1BQU0sRUFBRSxXQUFXOzRCQUNuQixJQUFJLEVBQUUsS0FBSzs0QkFDWCxNQUFNLEVBQUUsZ0NBQWdDOzRCQUN4QyxHQUFHLEVBQUUsSUFBSTs0QkFDVCxHQUFHLEVBQUUsSUFBSTt5QkFDVjt3QkFDRCxRQUFRLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUM7d0JBQ25DLFNBQVMsRUFBRTs0QkFDVCxLQUFLLEVBQUUsTUFBTTs0QkFDYixNQUFNLEVBQUUsV0FBVzs0QkFDbkIsSUFBSSxFQUFFLEdBQUc7NEJBQ1QsR0FBRyxFQUFFLE1BQU07NEJBQ1gsR0FBRyxFQUFFLE1BQU07eUJBQ1o7d0JBQ0QsYUFBYSxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUM7d0JBQ3ZELGNBQWMsRUFBRTs0QkFDZCxLQUFLLEVBQUUsS0FBSzs0QkFDWixNQUFNLEVBQUUsT0FBTzs0QkFDZixJQUFJLEVBQUUsbUNBQW1DO3lCQUMxQzt3QkFDRCxjQUFjLEVBQUU7NEJBQ2QsS0FBSyxFQUFFLENBQUM7NEJBQ1IsTUFBTSxFQUFFLFdBQVc7NEJBQ25CLElBQUksRUFBRSxJQUFJOzRCQUNWLEdBQUcsRUFBRSxDQUFDOzRCQUNOLEdBQUcsRUFBRSxDQUFDO3lCQUNQO3dCQUNELGVBQWUsRUFBRTs0QkFDZixLQUFLLEVBQUUsS0FBSzs0QkFDWixNQUFNLEVBQUUsV0FBVzs0QkFDbkIsSUFBSSxFQUFFLE9BQU87NEJBQ2IsR0FBRyxFQUFFLEtBQUs7NEJBQ1YsR0FBRyxFQUFFLEtBQUs7eUJBQ1g7d0JBQ0QsTUFBTSxFQUFFOzRCQUNOLEtBQUssRUFBRSxFQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBQzs0QkFDakQsTUFBTSxFQUFFLFdBQVc7eUJBQ3BCO3dCQUNELFVBQVUsRUFBRTs0QkFDVixLQUFLLEVBQUUsSUFBSTs0QkFDWCxNQUFNLEVBQUUsV0FBVzs0QkFDbkIsSUFBSSxFQUFFLGNBQWM7NEJBQ3BCLE1BQU0sRUFBRSw4Q0FBOEM7NEJBQ3RELEdBQUcsRUFBRSxJQUFJOzRCQUNULEdBQUcsRUFBRSxJQUFJO3lCQUNWO3dCQUNELFVBQVUsRUFBRTs0QkFDVixLQUFLLEVBQUUsVUFBVTs0QkFDakIsTUFBTSxFQUFFLFdBQVc7NEJBQ25CLElBQUksRUFBRSxhQUFhOzRCQUNuQixNQUFNLEVBQUUsc0JBQXNCOzRCQUM5QixHQUFHLEVBQUUsVUFBVTs0QkFDZixHQUFHLEVBQUUsVUFBVTt5QkFDaEI7d0JBQ0QsU0FBUyxFQUFFOzRCQUNULEtBQUssRUFBRSxNQUFNOzRCQUNiLE1BQU0sRUFBRSxXQUFXOzRCQUNuQixJQUFJLEVBQUUsUUFBUTs0QkFDZCxNQUFNLEVBQUUsOEJBQThCOzRCQUN0QyxHQUFHLEVBQUUsTUFBTTs0QkFDWCxHQUFHLEVBQUUsTUFBTTt5QkFDWjtxQkFDRjtpQkFDRjthQUNHLENBQUMsQ0FBQztRQUNWLEtBQUssd0ZBQXdGO1lBQzNGLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQztnQkFDckIsSUFBSSxFQUFFO29CQUNKLE9BQU8sRUFBRTt3QkFDUCxHQUFHLEVBQUU7NEJBQ0gsUUFBUSxFQUFFO2dDQUNSLEtBQUssRUFBRSxNQUFNO2dDQUNiLEdBQUcsRUFBRSxRQUFRO2dDQUNiLEdBQUcsRUFBRSxRQUFRO2dDQUNiLFFBQVEsRUFBRSxDQUFDLGdEQUFnRCxDQUFDOzZCQUM3RDs0QkFDRCxHQUFHLEVBQUUsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBQzs0QkFDOUMsSUFBSSxFQUFFLFNBQVM7NEJBQ2YsV0FBVyxFQUFFLHNCQUFzQjt5QkFDcEM7d0JBQ0QsR0FBRyxFQUFFOzRCQUNILFFBQVEsRUFBRTtnQ0FDUixLQUFLLEVBQUUsV0FBVztnQ0FDbEIsR0FBRyxFQUFFLFdBQVc7Z0NBQ2hCLEdBQUcsRUFBRSxXQUFXO2dDQUNoQixRQUFRLEVBQUUsQ0FBQyxnREFBZ0QsQ0FBQzs2QkFDN0Q7NEJBQ0QsR0FBRyxFQUFFLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUM7NEJBQ3BELElBQUksRUFBRSxRQUFROzRCQUNkLFdBQVcsRUFBRSx1Q0FBdUM7eUJBQ3JEO3dCQUNELEVBQUUsRUFBRTs0QkFDRixRQUFRLEVBQUU7Z0NBQ1IsS0FBSyxFQUFFLEtBQUs7Z0NBQ1osR0FBRyxFQUFFLE9BQU87Z0NBQ1osR0FBRyxFQUFFLE9BQU87Z0NBQ1osUUFBUSxFQUFFLENBQUMsZ0RBQWdELENBQUM7NkJBQzdEOzRCQUNELEdBQUcsRUFBRSxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFDOzRCQUMzQyxJQUFJLEVBQUUsSUFBSTs0QkFDVixXQUFXLEVBQUUsK0JBQStCO3lCQUM3QztxQkFDRjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsT0FBTyxFQUFFOzRCQUNQLEdBQUcsRUFBRTtnQ0FDSCxRQUFRLEVBQUU7b0NBQ1IsS0FBSyxFQUFFLE1BQU07b0NBQ2IsR0FBRyxFQUFFLFFBQVE7b0NBQ2IsR0FBRyxFQUFFLFFBQVE7b0NBQ2IsUUFBUSxFQUFFO3dDQUNSLGdEQUFnRDtxQ0FDakQ7aUNBQ0Y7Z0NBQ0QsR0FBRyxFQUFFLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUM7Z0NBQzlDLElBQUksRUFBRSxTQUFTO2dDQUNmLFdBQVcsRUFBRSxzQkFBc0I7NkJBQ3BDOzRCQUNELEdBQUcsRUFBRTtnQ0FDSCxRQUFRLEVBQUU7b0NBQ1IsS0FBSyxFQUFFLFdBQVc7b0NBQ2xCLEdBQUcsRUFBRSxXQUFXO29DQUNoQixHQUFHLEVBQUUsV0FBVztvQ0FDaEIsUUFBUSxFQUFFO3dDQUNSLGdEQUFnRDtxQ0FDakQ7aUNBQ0Y7Z0NBQ0QsR0FBRyxFQUFFLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUM7Z0NBQ3BELElBQUksRUFBRSxRQUFRO2dDQUNkLFdBQVcsRUFBRSx1Q0FBdUM7NkJBQ3JEOzRCQUNELEVBQUUsRUFBRTtnQ0FDRixRQUFRLEVBQUU7b0NBQ1IsS0FBSyxFQUFFLEtBQUs7b0NBQ1osR0FBRyxFQUFFLE9BQU87b0NBQ1osR0FBRyxFQUFFLE9BQU87b0NBQ1osUUFBUSxFQUFFO3dDQUNSLGdEQUFnRDtxQ0FDakQ7aUNBQ0Y7Z0NBQ0QsR0FBRyxFQUFFLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUM7Z0NBQzNDLElBQUksRUFBRSxJQUFJO2dDQUNWLFdBQVcsRUFBRSwrQkFBK0I7NkJBQzdDO3lCQUNGO3dCQUNELEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUM7d0JBQ3RELFFBQVEsRUFBRTs0QkFDUixLQUFLLEVBQUUsR0FBRzs0QkFDVixNQUFNLEVBQUUsV0FBVzs0QkFDbkIsSUFBSSxFQUFFLEtBQUs7NEJBQ1gsTUFBTSxFQUFFLGdDQUFnQzs0QkFDeEMsR0FBRyxFQUFFLElBQUk7NEJBQ1QsR0FBRyxFQUFFLElBQUk7eUJBQ1Y7d0JBQ0QsUUFBUSxFQUFFLEVBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFDO3dCQUNuQyxTQUFTLEVBQUU7NEJBQ1QsS0FBSyxFQUFFLE1BQU07NEJBQ2IsTUFBTSxFQUFFLFdBQVc7NEJBQ25CLElBQUksRUFBRSxHQUFHOzRCQUNULEdBQUcsRUFBRSxNQUFNOzRCQUNYLEdBQUcsRUFBRSxNQUFNO3lCQUNaO3dCQUNELGFBQWEsRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFDO3dCQUN2RCxjQUFjLEVBQUU7NEJBQ2QsS0FBSyxFQUFFLEtBQUs7NEJBQ1osTUFBTSxFQUFFLE9BQU87NEJBQ2YsSUFBSSxFQUFFLG1DQUFtQzt5QkFDMUM7d0JBQ0QsY0FBYyxFQUFFOzRCQUNkLEtBQUssRUFBRSxDQUFDOzRCQUNSLE1BQU0sRUFBRSxXQUFXOzRCQUNuQixJQUFJLEVBQUUsSUFBSTs0QkFDVixHQUFHLEVBQUUsQ0FBQzs0QkFDTixHQUFHLEVBQUUsQ0FBQzt5QkFDUDt3QkFDRCxlQUFlLEVBQUU7NEJBQ2YsS0FBSyxFQUFFLEtBQUs7NEJBQ1osTUFBTSxFQUFFLFdBQVc7NEJBQ25CLElBQUksRUFBRSxPQUFPOzRCQUNiLEdBQUcsRUFBRSxLQUFLOzRCQUNWLEdBQUcsRUFBRSxLQUFLO3lCQUNYO3dCQUNELE1BQU0sRUFBRTs0QkFDTixLQUFLLEVBQUUsRUFBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUM7NEJBQ2pELE1BQU0sRUFBRSxXQUFXO3lCQUNwQjt3QkFDRCxVQUFVLEVBQUU7NEJBQ1YsS0FBSyxFQUFFLElBQUk7NEJBQ1gsTUFBTSxFQUFFLFdBQVc7NEJBQ25CLElBQUksRUFBRSxjQUFjOzRCQUNwQixNQUFNLEVBQUUsOENBQThDOzRCQUN0RCxHQUFHLEVBQUUsSUFBSTs0QkFDVCxHQUFHLEVBQUUsSUFBSTt5QkFDVjt3QkFDRCxVQUFVLEVBQUU7NEJBQ1YsS0FBSyxFQUFFLFVBQVU7NEJBQ2pCLE1BQU0sRUFBRSxXQUFXOzRCQUNuQixJQUFJLEVBQUUsYUFBYTs0QkFDbkIsTUFBTSxFQUFFLHNCQUFzQjs0QkFDOUIsR0FBRyxFQUFFLFVBQVU7NEJBQ2YsR0FBRyxFQUFFLFVBQVU7eUJBQ2hCO3dCQUNELFNBQVMsRUFBRTs0QkFDVCxLQUFLLEVBQUUsTUFBTTs0QkFDYixNQUFNLEVBQUUsV0FBVzs0QkFDbkIsSUFBSSxFQUFFLFFBQVE7NEJBQ2QsTUFBTSxFQUFFLDhCQUE4Qjs0QkFDdEMsR0FBRyxFQUFFLE1BQU07NEJBQ1gsR0FBRyxFQUFFLE1BQU07eUJBQ1o7cUJBQ0Y7aUJBQ0Y7YUFDRyxDQUFDLENBQUM7S0FDWDtJQUNELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFPLENBQUMsQ0FBQztBQUNsQyxDQUFDLENBQ0YsQ0FBQztBQUNGLGNBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdkIsSUFBQSxrQkFBUSxFQUFDLG9CQUFvQixFQUFFLEdBQUcsRUFBRTtJQUNsQyxJQUFBLGNBQUksRUFBQyw0Q0FBNEMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUM1RCxNQUFNLFdBQVcsR0FBRyxJQUFJLDhCQUFzQixFQUFFLENBQUM7UUFDakQsTUFBTSxJQUFBLGdCQUFNLEVBQ1YsV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FDckQsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDekIsSUFBQSxnQkFBTSxFQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFBLGNBQUksRUFBQyw2R0FBNkcsRUFBRSxLQUFLLElBQUksRUFBRTtRQUM3SCxNQUFNLFdBQVcsR0FBRyxJQUFJLDhCQUFzQixFQUFFLENBQUM7UUFDakQsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLDhCQUFzQixFQUFFLENBQUM7UUFDM0QsSUFBQSxnQkFBTSxFQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sSUFBQSxnQkFBTSxFQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sSUFBQSxnQkFBTSxFQUNWLHFCQUFxQixDQUFDLE9BQU8sQ0FBQztZQUM1QjtnQkFDRSxTQUFTLEVBQUUsc0JBQXNCO2dCQUNqQyxRQUFRLEVBQUUsSUFBSTtnQkFDZCxVQUFVLEVBQUUsRUFBRTthQUNmO1NBQ0YsQ0FBQyxDQUNILENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXpCLE1BQU0sSUFBQSxnQkFBTSxFQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUN6RCxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FDekQsQ0FBQztRQUNGLE1BQU0sSUFBQSxnQkFBTSxFQUNWLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFO1lBQzVCLG9CQUFvQixFQUFFLHVCQUF1QjtTQUM5QyxDQUFDLENBQ0gsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUNmLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUMxRCxDQUFDO1FBQ0YsTUFBTSxJQUFBLGdCQUFNLEVBQ1YsV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUU7WUFDNUIsb0JBQW9CLEVBQUUsdUJBQXVCO1lBQzdDLFlBQVksRUFBRSxFQUFFO1lBQ2hCLG1CQUFtQixFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO1NBQzVDLENBQUMsQ0FDSCxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsOEJBQXNCLENBQUMsQ0FBQztRQUNsRCxJQUFBLGdCQUFNLEVBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0Qyx5REFBeUQ7UUFDekQsTUFBTSxJQUFBLGdCQUFNLEVBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FDdkQsS0FBSyxDQUNILDZFQUE2RSxDQUM5RSxDQUNGLENBQUM7UUFDRixxREFBcUQ7UUFDckQsTUFBTSxJQUFBLGdCQUFNLEVBQ1YsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUMsT0FBTyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUMsQ0FDMUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDLENBQUM7SUFDNUUsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQztBQUVILElBQUEsa0JBQVEsRUFBQyw0QkFBNEIsRUFBRSxHQUFHLEVBQUU7SUFDMUMsSUFBQSxjQUFJLEVBQUMsZ0VBQWdFLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDaEYsTUFBTSxXQUFXLEdBQUcsSUFBSSw4QkFBc0IsRUFBRSxDQUFDO1FBQ2pELE1BQU0sSUFBQSxnQkFBTSxFQUNWLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFO1lBQzVCLG9CQUFvQixFQUFFLHVCQUF1QjtZQUM3QyxZQUFZLEVBQUUsRUFBRTtZQUNoQixRQUFRLEVBQUUsS0FBSztTQUNoQixDQUFDLENBQ0gsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLDhCQUFzQixDQUFDLENBQUM7UUFDbEQsSUFBQSxnQkFBTSxFQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEMsc0VBQXNFO1FBQ3RFLE1BQU0sSUFBQSxnQkFBTSxFQUNWLFdBQVcsQ0FBQyxPQUFPLENBQUM7WUFDbEI7Z0JBQ0UsU0FBUyxFQUFFLHNCQUFzQjtnQkFDakMsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsVUFBVSxFQUFFLEVBQUU7YUFDZjtTQUNGLENBQUMsQ0FDSCxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7WUFDdkI7Z0JBQ0UsaUJBQWlCLEVBQUUsR0FBRztnQkFDdEIsT0FBTyxFQUFFLEtBQUs7YUFDZjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0gsSUFBQSxjQUFJLEVBQUMsd0VBQXdFLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDeEYsTUFBTSxXQUFXLEdBQUcsSUFBSSw4QkFBc0IsRUFBRSxDQUFDO1FBQ2pELE1BQU0sSUFBQSxnQkFBTSxFQUNWLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFO1lBQzVCLG9CQUFvQixFQUFFLHVCQUF1QjtZQUM3QyxZQUFZLEVBQUUsRUFBRTtZQUNoQixRQUFRLEVBQUUsS0FBSztZQUNmLE9BQU8sRUFBRSxJQUFJO1NBQ2QsQ0FBQyxDQUNILENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyw4QkFBc0IsQ0FBQyxDQUFDO1FBQ2xELElBQUEsZ0JBQU0sRUFBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLHNFQUFzRTtRQUN0RSxNQUFNLElBQUEsZ0JBQU0sRUFDVixXQUFXLENBQUMsT0FBTyxDQUFDO1lBQ2xCO2dCQUNFLFNBQVMsRUFBRSxzQkFBc0I7Z0JBQ2pDLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFVBQVUsRUFBRSxHQUFHO2FBQ2hCO1NBQ0YsQ0FBQyxDQUNILENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQztZQUN2QjtnQkFDRSxpQkFBaUIsRUFBRSxHQUFHO2dCQUN0QixPQUFPLEVBQUUsa0JBQWtCO2FBQzVCO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQztBQUVILElBQUEsa0JBQVEsRUFBQyw4QkFBOEIsRUFBRSxHQUFHLEVBQUU7SUFDNUMsSUFBQSxjQUFJLEVBQUMscURBQXFELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDckUsTUFBTSxXQUFXLEdBQUcsSUFBSSxnQ0FBd0IsRUFBRSxDQUFDO1FBQ25ELElBQUEsZ0JBQU0sRUFBQyxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUNyRSxNQUFNLElBQUEsZ0JBQU0sRUFDVixXQUFXLENBQUMsZ0JBQWdCLENBQUMsRUFBQyxRQUFRLEVBQUUsZUFBZSxFQUFDLENBQUMsQ0FDMUQsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDekIsTUFBTSxJQUFBLGdCQUFNLEVBQ1YsV0FBVyxDQUFDLG9CQUFvQixDQUFDLEVBQUMsZUFBZSxFQUFFLGVBQWUsRUFBQyxDQUFDLENBQ3JFLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3pCLE1BQU0sSUFBQSxnQkFBTSxFQUNWLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFDLFFBQVEsRUFBRSxlQUFlLEVBQUMsQ0FBQyxDQUMxRCxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN6QixNQUFNLElBQUEsZ0JBQU0sRUFDVixXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRTtZQUM1QixlQUFlLEVBQUUsVUFBVTtZQUMzQixRQUFRLEVBQUUsS0FBSztZQUNmLG1CQUFtQixFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO1lBQzNDLFFBQVEsRUFBRSxLQUFLO1lBQ2YsT0FBTyxFQUFFLEtBQUs7U0FDZixDQUFDLENBQ0gsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLGdDQUF3QixDQUFDLENBQUM7UUFDcEQsTUFBTSxJQUFBLGdCQUFNLEVBQ1YsV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUU7WUFDNUIsZUFBZSxFQUFFLFVBQVU7WUFDM0IsUUFBUSxFQUFFLEtBQUs7WUFDZixtQkFBbUIsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtZQUMzQyxRQUFRLEVBQUUsS0FBSztZQUNmLE9BQU8sRUFBRSxPQUFPO1NBQ2pCLENBQUMsQ0FDSCxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsZ0NBQXdCLENBQUMsQ0FBQztRQUNwRCxNQUFNLElBQUEsZ0JBQU0sRUFDVixXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRTtZQUM1QixlQUFlLEVBQUUsVUFBVTtZQUMzQixRQUFRLEVBQUUsS0FBSztZQUNmLG1CQUFtQixFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO1lBQzNDLFFBQVEsRUFBRSxLQUFLO1lBQ2YsT0FBTyxFQUFFLENBQUM7U0FDWCxDQUFDLENBQ0gsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLGdDQUF3QixDQUFDLENBQUM7UUFDcEQsSUFBQSxnQkFBTSxFQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEMsc0VBQXNFO0lBQ3hFLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBQSxjQUFJLEVBQUMsK0VBQStFLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDL0YsTUFBTSxXQUFXLEdBQUcsSUFBSSxnQ0FBd0IsRUFBRSxDQUFDO1FBRW5ELE1BQU0sSUFBQSxnQkFBTSxFQUNWLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFO1lBQzVCLGVBQWUsRUFBRSxVQUFVO1lBQzNCLFFBQVEsRUFBRSxLQUFLO1NBQ2hCLENBQUMsQ0FDSCxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN6QixNQUFNLElBQUEsZ0JBQU0sRUFDVixXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRTtZQUM1QixRQUFRLEVBQUUsS0FBSztZQUNmLFFBQVEsRUFBRSxLQUFLO1NBQ2hCLENBQUMsQ0FDSCxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN6QixNQUFNLElBQUEsZ0JBQU0sRUFDVixXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRTtZQUM1QixlQUFlLEVBQUUsVUFBVTtZQUMzQixRQUFRLEVBQUUsS0FBSztZQUNmLFFBQVEsRUFBRSxLQUFLO1NBQ2hCLENBQUMsQ0FDSCxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsZ0NBQXdCLENBQUMsQ0FBQztRQUNwRCxJQUFBLGdCQUFNLEVBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QywrQ0FBK0M7UUFDL0MsTUFBTSxJQUFBLGdCQUFNLEVBQ1YsV0FBVyxDQUFDLE9BQU8sQ0FBQztZQUNsQjtnQkFDRSxTQUFTLEVBQUUsc0JBQXNCO2dCQUNqQyxRQUFRLEVBQUUsRUFBRTtnQkFDWixVQUFVLEVBQUUsRUFBRTthQUNmO1NBQ0YsQ0FBQyxDQUNILENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQztZQUN2QjtnQkFDRSxpQkFBaUIsRUFBRSxHQUFHO2dCQUN0QixNQUFNLEVBQUUsa0JBQWtCO2FBQzNCO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFBLGNBQUksRUFBQywwRkFBMEYsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMxRyxNQUFNLFdBQVcsR0FBRyxJQUFJLGdDQUF3QixFQUFFLENBQUM7UUFFbkQsTUFBTSxJQUFBLGdCQUFNLEVBQ1YsV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUU7WUFDNUIsZUFBZSxFQUFFLFVBQVU7WUFDM0IsUUFBUSxFQUFFLEtBQUs7WUFDZixRQUFRLEVBQUUsS0FBSztTQUNoQixDQUFDLENBQ0gsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDekIsSUFBQSxnQkFBTSxFQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEMsc0VBQXNFO1FBQ3RFLE1BQU0sSUFBQSxnQkFBTSxFQUNWLFdBQVcsQ0FBQyxPQUFPLENBQUM7WUFDbEI7Z0JBQ0UsU0FBUyxFQUFFLHNCQUFzQjtnQkFDakMsUUFBUSxFQUFFLEVBQUU7Z0JBQ1osVUFBVSxFQUFFLEVBQUU7YUFDZjtZQUNEO2dCQUNFLFNBQVMsRUFBRSxzQkFBc0I7Z0JBQ2pDLFFBQVEsRUFBRSxFQUFFO2dCQUNaLFVBQVUsRUFBRSxFQUFFO2FBQ2Y7WUFDRDtnQkFDRSxTQUFTLEVBQUUsc0JBQXNCO2dCQUNqQyxRQUFRLEVBQUUsRUFBRTtnQkFDWixVQUFVLEVBQUUsQ0FBQzthQUNkO1lBQ0Q7Z0JBQ0UsU0FBUyxFQUFFLHNCQUFzQjtnQkFDakMsUUFBUSxFQUFFLEVBQUU7Z0JBQ1osVUFBVSxFQUFFLEVBQUU7YUFDZjtTQUNGLENBQUMsQ0FDSCxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMzQixDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsY0FBSSxFQUFDLDRGQUE0RixFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzVHLE1BQU0sV0FBVyxHQUFHLElBQUksZ0NBQXdCLEVBQUUsQ0FBQztRQUVuRCxNQUFNLElBQUEsZ0JBQU0sRUFDVixXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRTtZQUM1QixRQUFRLEVBQUUsS0FBSztZQUNmLFFBQVEsRUFBRSxLQUFLO1NBQ2hCLENBQUMsQ0FDSCxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQ3JCLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUMvRCxDQUFDO1FBQ0YsTUFBTSxJQUFBLGdCQUFNLEVBQ1YsV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUU7WUFDNUIsUUFBUSxFQUFFLE1BQU07WUFDaEIsUUFBUSxFQUFFLEtBQUs7WUFDZixlQUFlLEVBQUUsVUFBVTtTQUM1QixDQUFDLENBQ0gsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDekIsSUFBQSxnQkFBTSxFQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEMsc0VBQXNFO1FBQ3RFLE1BQU0sSUFBQSxnQkFBTSxFQUNWLFdBQVcsQ0FBQyxPQUFPLENBQUM7WUFDbEI7Z0JBQ0UsU0FBUyxFQUFFLHNCQUFzQjtnQkFDakMsUUFBUSxFQUFFLEVBQUU7Z0JBQ1osVUFBVSxFQUFFLEVBQUU7YUFDZjtZQUNEO2dCQUNFLFNBQVMsRUFBRSxzQkFBc0I7Z0JBQ2pDLFFBQVEsRUFBRSxFQUFFO2dCQUNaLFVBQVUsRUFBRSxFQUFFO2FBQ2Y7WUFDRDtnQkFDRSxTQUFTLEVBQUUsc0JBQXNCO2dCQUNqQyxRQUFRLEVBQUUsRUFBRTtnQkFDWixVQUFVLEVBQUUsQ0FBQzthQUNkO1lBQ0Q7Z0JBQ0UsU0FBUyxFQUFFLHNCQUFzQjtnQkFDakMsUUFBUSxFQUFFLEVBQUU7Z0JBQ1osVUFBVSxFQUFFLEVBQUU7YUFDZjtTQUNGLENBQUMsQ0FDSCxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQ3JCLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUM5RCxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7ZGVzY3JpYmUsIGV4cGVjdCwgamVzdCwgdGVzdH0gZnJvbSAnQGplc3QvZ2xvYmFscyc7XG5pbXBvcnQge1xuICBCb2F2aXp0YUNsb3VkT3V0cHV0TW9kZWwsXG4gIEJvYXZpenRhQ3B1T3V0cHV0TW9kZWwsXG59IGZyb20gJy4uLy4uLy4uLy4uL2xpYi9ib2F2aXp0YS9pbmRleCc7XG5pbXBvcnQgYXhpb3MsIHtBeGlvc1Jlc3BvbnNlfSBmcm9tICdheGlvcyc7XG5pbXBvcnQgKiBhcyBQUk9WSURFUlMgZnJvbSAnLi4vLi4vLi4vLi4vX19tb2Nrc19fL2JvYXZpenRhL3Byb3ZpZGVycy5qc29uJztcbmltcG9ydCAqIGFzIENPVU5UUklFUyBmcm9tICcuLi8uLi8uLi8uLi9fX21vY2tzX18vYm9hdml6dGEvY291bnRyaWVzLmpzb24nO1xuaW1wb3J0ICogYXMgSU5TVEFOQ0VfVFlQRVMgZnJvbSAnLi4vLi4vLi4vLi4vX19tb2Nrc19fL2JvYXZpenRhL2luc3RhbmNlX3R5cGVzLmpzb24nO1xuXG5hc3luYyBmdW5jdGlvbiBheGlvc0dldDxUID0gYW55LCBSID0gQXhpb3NSZXNwb25zZTxULCBhbnk+PihcbiAgdXJsOiBzdHJpbmdcbik6IFByb21pc2U8Uj4ge1xuICBzd2l0Y2ggKHVybCkge1xuICAgIGNhc2UgJ2h0dHBzOi8vYXBpLmJvYXZpenRhLm9yZy92MS9jbG91ZC9pbnN0YW5jZS9hbGxfcHJvdmlkZXJzJzpcbiAgICAgIHJldHVybiB7ZGF0YTogUFJPVklERVJTfSBhcyBSO1xuICAgIGNhc2UgJ2h0dHBzOi8vYXBpLmJvYXZpenRhLm9yZy92MS91dGlscy9jb3VudHJ5X2NvZGUnOlxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7ZGF0YTogQ09VTlRSSUVTfSBhcyBSKTtcbiAgICBjYXNlICdodHRwczovL2FwaS5ib2F2aXp0YS5vcmcvdjEvY2xvdWQvaW5zdGFuY2UvYWxsX2luc3RhbmNlcz9wcm92aWRlcj1hd3MnOlxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgIGRhdGE6IElOU1RBTkNFX1RZUEVTWydhd3MnXSxcbiAgICAgIH0gYXMgUik7XG4gIH1cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSBhcyBSKTtcbn1cblxuamVzdC5tb2NrKCdheGlvcycpO1xuY29uc3QgbW9ja0F4aW9zID0gYXhpb3MgYXMgamVzdC5Nb2NrZWQ8dHlwZW9mIGF4aW9zPjtcbi8vIE1vY2sgb3V0IGFsbCB0b3AgbGV2ZWwgZnVuY3Rpb25zLCBzdWNoIGFzIGdldCwgcHV0LCBkZWxldGUgYW5kIHBvc3Q6XG5tb2NrQXhpb3MuZ2V0Lm1vY2tJbXBsZW1lbnRhdGlvbihheGlvc0dldCk7XG5tb2NrQXhpb3MucG9zdC5tb2NrSW1wbGVtZW50YXRpb24oXG4gIDxUID0gYW55LCBSID0gQXhpb3NSZXNwb25zZTxULCBhbnk+Pih1cmw6IHN0cmluZyk6IFByb21pc2U8Uj4gPT4ge1xuICAgIHN3aXRjaCAodXJsKSB7XG4gICAgICBjYXNlICdodHRwczovL2FwaS5ib2F2aXp0YS5vcmcvdjEvY29tcG9uZW50L2NwdT92ZXJib3NlPWZhbHNlJmR1cmF0aW9uPTEnOlxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBvdXRwdXRzOiB7XG4gICAgICAgICAgICAgIGd3cDoge1xuICAgICAgICAgICAgICAgIGVtYmVkZGVkOiB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZTogMC4wMDA4LFxuICAgICAgICAgICAgICAgICAgbWluOiAwLjAwMDQxNTUsXG4gICAgICAgICAgICAgICAgICBtYXg6IDAuMDAzMTEzLFxuICAgICAgICAgICAgICAgICAgd2FybmluZ3M6IFsnRW5kIG9mIGxpZmUgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBjYWxjdWxhdGlvbiddLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdXNlOiB7dmFsdWU6IDAuMDY3NDMsIG1pbjogMC4wNjc0MywgbWF4OiAwLjA2NzQzfSxcbiAgICAgICAgICAgICAgICB1bml0OiAna2dDTzJlcScsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUb3RhbCBjbGltYXRlIGNoYW5nZScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGFkcDoge1xuICAgICAgICAgICAgICAgIGVtYmVkZGVkOiB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZTogNy43NjRlLTcsXG4gICAgICAgICAgICAgICAgICBtaW46IDcuNzYzZS03LFxuICAgICAgICAgICAgICAgICAgbWF4OiA3Ljc3MWUtNyxcbiAgICAgICAgICAgICAgICAgIHdhcm5pbmdzOiBbJ0VuZCBvZiBsaWZlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgY2FsY3VsYXRpb24nXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHVzZToge3ZhbHVlOiAxLjc5NmUtOCwgbWluOiAxLjc5NmUtOCwgbWF4OiAxLjc5NmUtOH0sXG4gICAgICAgICAgICAgICAgdW5pdDogJ2tnU2JlcScsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdVc2Ugb2YgbWluZXJhbHMgYW5kIGZvc3NpbCByZXNzb3VyY2VzJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcGU6IHtcbiAgICAgICAgICAgICAgICBlbWJlZGRlZDoge1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IDAuMDEyLFxuICAgICAgICAgICAgICAgICAgbWluOiAwLjAwNjg0NyxcbiAgICAgICAgICAgICAgICAgIG1heDogMC4wNDMxNCxcbiAgICAgICAgICAgICAgICAgIHdhcm5pbmdzOiBbJ0VuZCBvZiBsaWZlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgY2FsY3VsYXRpb24nXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHVzZToge3ZhbHVlOiAyLjA3LCBtaW46IDIuMDcsIG1heDogMi4wN30sXG4gICAgICAgICAgICAgICAgdW5pdDogJ01KJyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0NvbnN1bXB0aW9uIG9mIHByaW1hcnkgZW5lcmd5JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSBhcyBSKTtcbiAgICAgIGNhc2UgJ2h0dHBzOi8vYXBpLmJvYXZpenRhLm9yZy92MS9jb21wb25lbnQvY3B1P3ZlcmJvc2U9dHJ1ZSZkdXJhdGlvbj0yJzpcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgb3V0cHV0czoge1xuICAgICAgICAgICAgICBnd3A6IHtcbiAgICAgICAgICAgICAgICBlbWJlZGRlZDoge1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IDAuMDAxNixcbiAgICAgICAgICAgICAgICAgIG1pbjogMC4wMDA4MzEsXG4gICAgICAgICAgICAgICAgICBtYXg6IDAuMDA2MjI2LFxuICAgICAgICAgICAgICAgICAgd2FybmluZ3M6IFsnRW5kIG9mIGxpZmUgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBjYWxjdWxhdGlvbiddLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdXNlOiB7dmFsdWU6IDAuMTkyNCwgbWluOiAwLjE5MjQsIG1heDogMC4xOTI0fSxcbiAgICAgICAgICAgICAgICB1bml0OiAna2dDTzJlcScsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUb3RhbCBjbGltYXRlIGNoYW5nZScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGFkcDoge1xuICAgICAgICAgICAgICAgIGVtYmVkZGVkOiB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZTogMC4wMDAwMDE1NTMsXG4gICAgICAgICAgICAgICAgICBtaW46IDAuMDAwMDAxNTUzLFxuICAgICAgICAgICAgICAgICAgbWF4OiAwLjAwMDAwMTU1NCxcbiAgICAgICAgICAgICAgICAgIHdhcm5pbmdzOiBbJ0VuZCBvZiBsaWZlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgY2FsY3VsYXRpb24nXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHVzZToge3ZhbHVlOiA1LjEyNmUtOCwgbWluOiA1LjEyNmUtOCwgbWF4OiA1LjEyNmUtOH0sXG4gICAgICAgICAgICAgICAgdW5pdDogJ2tnU2JlcScsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdVc2Ugb2YgbWluZXJhbHMgYW5kIGZvc3NpbCByZXNzb3VyY2VzJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcGU6IHtcbiAgICAgICAgICAgICAgICBlbWJlZGRlZDoge1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IDAuMDIzLFxuICAgICAgICAgICAgICAgICAgbWluOiAwLjAxMzY5LFxuICAgICAgICAgICAgICAgICAgbWF4OiAwLjA4NjI3LFxuICAgICAgICAgICAgICAgICAgd2FybmluZ3M6IFsnRW5kIG9mIGxpZmUgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBjYWxjdWxhdGlvbiddLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdXNlOiB7dmFsdWU6IDUuOTA3LCBtaW46IDUuOTA3LCBtYXg6IDUuOTA3fSxcbiAgICAgICAgICAgICAgICB1bml0OiAnTUonLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnQ29uc3VtcHRpb24gb2YgcHJpbWFyeSBlbmVyZ3knLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcmJvc2U6IHtcbiAgICAgICAgICAgICAgb3V0cHV0czoge1xuICAgICAgICAgICAgICAgIGd3cDoge1xuICAgICAgICAgICAgICAgICAgZW1iZWRkZWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDAuMDAxNixcbiAgICAgICAgICAgICAgICAgICAgbWluOiAwLjAwMDgzMSxcbiAgICAgICAgICAgICAgICAgICAgbWF4OiAwLjAwNjIyNixcbiAgICAgICAgICAgICAgICAgICAgd2FybmluZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAnRW5kIG9mIGxpZmUgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBjYWxjdWxhdGlvbicsXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgdXNlOiB7dmFsdWU6IDAuMTkyNCwgbWluOiAwLjE5MjQsIG1heDogMC4xOTI0fSxcbiAgICAgICAgICAgICAgICAgIHVuaXQ6ICdrZ0NPMmVxJyxcbiAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgY2xpbWF0ZSBjaGFuZ2UnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYWRwOiB7XG4gICAgICAgICAgICAgICAgICBlbWJlZGRlZDoge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMC4wMDAwMDE1NTMsXG4gICAgICAgICAgICAgICAgICAgIG1pbjogMC4wMDAwMDE1NTMsXG4gICAgICAgICAgICAgICAgICAgIG1heDogMC4wMDAwMDE1NTQsXG4gICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgJ0VuZCBvZiBsaWZlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgY2FsY3VsYXRpb24nLFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHVzZToge3ZhbHVlOiA1LjEyNmUtOCwgbWluOiA1LjEyNmUtOCwgbWF4OiA1LjEyNmUtOH0sXG4gICAgICAgICAgICAgICAgICB1bml0OiAna2dTYmVxJyxcbiAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVXNlIG9mIG1pbmVyYWxzIGFuZCBmb3NzaWwgcmVzc291cmNlcycsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwZToge1xuICAgICAgICAgICAgICAgICAgZW1iZWRkZWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDAuMDIzLFxuICAgICAgICAgICAgICAgICAgICBtaW46IDAuMDEzNjksXG4gICAgICAgICAgICAgICAgICAgIG1heDogMC4wODYyNyxcbiAgICAgICAgICAgICAgICAgICAgd2FybmluZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAnRW5kIG9mIGxpZmUgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBjYWxjdWxhdGlvbicsXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgdXNlOiB7dmFsdWU6IDUuOTA3LCBtaW46IDUuOTA3LCBtYXg6IDUuOTA3fSxcbiAgICAgICAgICAgICAgICAgIHVuaXQ6ICdNSicsXG4gICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0NvbnN1bXB0aW9uIG9mIHByaW1hcnkgZW5lcmd5JyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB1bml0czoge3ZhbHVlOiAxLCBzdGF0dXM6ICdBUkNIRVRZUEUnLCBtaW46IDEsIG1heDogMX0sXG4gICAgICAgICAgICAgIGRpZV9zaXplOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDUyMSxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdDT01QTEVURUQnLFxuICAgICAgICAgICAgICAgIHVuaXQ6ICdtbTInLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogJ0F2ZXJhZ2UgdmFsdWUgZm9yIGFsbCBmYW1pbGllcycsXG4gICAgICAgICAgICAgICAgbWluOiA0MS4yLFxuICAgICAgICAgICAgICAgIG1heDogMzY0MCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IHt2YWx1ZTogMiwgdW5pdDogJ2hvdXJzJ30sXG4gICAgICAgICAgICAgIGF2Z19wb3dlcjoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiAyNjAuMDUsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnQ09NUExFVEVEJyxcbiAgICAgICAgICAgICAgICB1bml0OiAnVycsXG4gICAgICAgICAgICAgICAgbWluOiAyNjAuMDUsXG4gICAgICAgICAgICAgICAgbWF4OiAyNjAuMDUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHRpbWVfd29ya2xvYWQ6IHt2YWx1ZTogMTAwLCBzdGF0dXM6ICdJTlBVVCcsIHVuaXQ6ICclJ30sXG4gICAgICAgICAgICAgIHVzYWdlX2xvY2F0aW9uOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6ICdVU0EnLFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ0lOUFVUJyxcbiAgICAgICAgICAgICAgICB1bml0OiAnQ29kU1AzIC0gTkNTIENvdW50cnkgQ29kZXMgLSBOQVRPJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdXNlX3RpbWVfcmF0aW86IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogMSxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdBUkNIRVRZUEUnLFxuICAgICAgICAgICAgICAgIHVuaXQ6ICcvMScsXG4gICAgICAgICAgICAgICAgbWluOiAxLFxuICAgICAgICAgICAgICAgIG1heDogMSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgaG91cnNfbGlmZV90aW1lOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDI2MjgwLFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ0FSQ0hFVFlQRScsXG4gICAgICAgICAgICAgICAgdW5pdDogJ2hvdXJzJyxcbiAgICAgICAgICAgICAgICBtaW46IDI2MjgwLFxuICAgICAgICAgICAgICAgIG1heDogMjYyODAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiB7YTogMTcxLjIsIGI6IDAuMDM1NCwgYzogMzYuODksIGQ6IC0xMC4xM30sXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnQVJDSEVUWVBFJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZ3dwX2ZhY3Rvcjoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiAwLjM3LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ0NPTVBMRVRFRCcsXG4gICAgICAgICAgICAgICAgdW5pdDogJ2tnIENPMmVxL2tXaCcsXG4gICAgICAgICAgICAgICAgc291cmNlOiAnaHR0cHM6Ly9lbWJlci1jbGltYXRlLm9yZy9kYXRhL2RhdGEtZXhwbG9yZXInLFxuICAgICAgICAgICAgICAgIG1pbjogMC4zNyxcbiAgICAgICAgICAgICAgICBtYXg6IDAuMzcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGFkcF9mYWN0b3I6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogOS44NTU0OGUtOCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdDT01QTEVURUQnLFxuICAgICAgICAgICAgICAgIHVuaXQ6ICdrZyBTYmVxL2tXaCcsXG4gICAgICAgICAgICAgICAgc291cmNlOiAnQURFTUUgQmFzZSBvdXRwdXRTIMKuJyxcbiAgICAgICAgICAgICAgICBtaW46IDkuODU1NDhlLTgsXG4gICAgICAgICAgICAgICAgbWF4OiA5Ljg1NTQ4ZS04LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBwZV9mYWN0b3I6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogMTEuMzU4LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ0NPTVBMRVRFRCcsXG4gICAgICAgICAgICAgICAgdW5pdDogJ01KL2tXaCcsXG4gICAgICAgICAgICAgICAgc291cmNlOiAnQURQZiAvICgxLSVyZW5ld2FibGVfZW5lcmd5KScsXG4gICAgICAgICAgICAgICAgbWluOiAxMS4zNTgsXG4gICAgICAgICAgICAgICAgbWF4OiAxMS4zNTgsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0gYXMgUik7XG4gICAgICBjYXNlICdodHRwczovL2FwaS5ib2F2aXp0YS5vcmcvdjEvY2xvdWQvaW5zdGFuY2U/dmVyYm9zZT1mYWxzZSZkdXJhdGlvbj0wLjAwNDE2NjY2NjY2NjY2NjY2Nyc6XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIG91dHB1dHM6IHtcbiAgICAgICAgICAgICAgZ3dwOiB7XG4gICAgICAgICAgICAgICAgZW1iZWRkZWQ6IHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiAwLjAwMTYsXG4gICAgICAgICAgICAgICAgICBtaW46IDAuMDAwODMxLFxuICAgICAgICAgICAgICAgICAgbWF4OiAwLjAwNjIyNixcbiAgICAgICAgICAgICAgICAgIHdhcm5pbmdzOiBbJ0VuZCBvZiBsaWZlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgY2FsY3VsYXRpb24nXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHVzZToge3ZhbHVlOiAwLjE5MjQsIG1pbjogMC4xOTI0LCBtYXg6IDAuMTkyNH0sXG4gICAgICAgICAgICAgICAgdW5pdDogJ2tnQ08yZXEnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgY2xpbWF0ZSBjaGFuZ2UnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBhZHA6IHtcbiAgICAgICAgICAgICAgICBlbWJlZGRlZDoge1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IDAuMDAwMDAxNTUzLFxuICAgICAgICAgICAgICAgICAgbWluOiAwLjAwMDAwMTU1MyxcbiAgICAgICAgICAgICAgICAgIG1heDogMC4wMDAwMDE1NTQsXG4gICAgICAgICAgICAgICAgICB3YXJuaW5nczogWydFbmQgb2YgbGlmZSBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGNhbGN1bGF0aW9uJ10sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB1c2U6IHt2YWx1ZTogNS4xMjZlLTgsIG1pbjogNS4xMjZlLTgsIG1heDogNS4xMjZlLTh9LFxuICAgICAgICAgICAgICAgIHVuaXQ6ICdrZ1NiZXEnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVXNlIG9mIG1pbmVyYWxzIGFuZCBmb3NzaWwgcmVzc291cmNlcycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHBlOiB7XG4gICAgICAgICAgICAgICAgZW1iZWRkZWQ6IHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiAwLjAyMyxcbiAgICAgICAgICAgICAgICAgIG1pbjogMC4wMTM2OSxcbiAgICAgICAgICAgICAgICAgIG1heDogMC4wODYyNyxcbiAgICAgICAgICAgICAgICAgIHdhcm5pbmdzOiBbJ0VuZCBvZiBsaWZlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgY2FsY3VsYXRpb24nXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHVzZToge3ZhbHVlOiA1LjkwNywgbWluOiA1LjkwNywgbWF4OiA1LjkwN30sXG4gICAgICAgICAgICAgICAgdW5pdDogJ01KJyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0NvbnN1bXB0aW9uIG9mIHByaW1hcnkgZW5lcmd5JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJib3NlOiB7XG4gICAgICAgICAgICAgIG91dHB1dHM6IHtcbiAgICAgICAgICAgICAgICBnd3A6IHtcbiAgICAgICAgICAgICAgICAgIGVtYmVkZGVkOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiAwLjAwMTYsXG4gICAgICAgICAgICAgICAgICAgIG1pbjogMC4wMDA4MzEsXG4gICAgICAgICAgICAgICAgICAgIG1heDogMC4wMDYyMjYsXG4gICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgJ0VuZCBvZiBsaWZlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgY2FsY3VsYXRpb24nLFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHVzZToge3ZhbHVlOiAwLjE5MjQsIG1pbjogMC4xOTI0LCBtYXg6IDAuMTkyNH0sXG4gICAgICAgICAgICAgICAgICB1bml0OiAna2dDTzJlcScsXG4gICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIGNsaW1hdGUgY2hhbmdlJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGFkcDoge1xuICAgICAgICAgICAgICAgICAgZW1iZWRkZWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDAuMDAwMDAxNTUzLFxuICAgICAgICAgICAgICAgICAgICBtaW46IDAuMDAwMDAxNTUzLFxuICAgICAgICAgICAgICAgICAgICBtYXg6IDAuMDAwMDAxNTU0LFxuICAgICAgICAgICAgICAgICAgICB3YXJuaW5nczogW1xuICAgICAgICAgICAgICAgICAgICAgICdFbmQgb2YgbGlmZSBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGNhbGN1bGF0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB1c2U6IHt2YWx1ZTogNS4xMjZlLTgsIG1pbjogNS4xMjZlLTgsIG1heDogNS4xMjZlLTh9LFxuICAgICAgICAgICAgICAgICAgdW5pdDogJ2tnU2JlcScsXG4gICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1VzZSBvZiBtaW5lcmFscyBhbmQgZm9zc2lsIHJlc3NvdXJjZXMnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcGU6IHtcbiAgICAgICAgICAgICAgICAgIGVtYmVkZGVkOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiAwLjAyMyxcbiAgICAgICAgICAgICAgICAgICAgbWluOiAwLjAxMzY5LFxuICAgICAgICAgICAgICAgICAgICBtYXg6IDAuMDg2MjcsXG4gICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgJ0VuZCBvZiBsaWZlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgY2FsY3VsYXRpb24nLFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHVzZToge3ZhbHVlOiA1LjkwNywgbWluOiA1LjkwNywgbWF4OiA1LjkwN30sXG4gICAgICAgICAgICAgICAgICB1bml0OiAnTUonLFxuICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdDb25zdW1wdGlvbiBvZiBwcmltYXJ5IGVuZXJneScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdW5pdHM6IHt2YWx1ZTogMSwgc3RhdHVzOiAnQVJDSEVUWVBFJywgbWluOiAxLCBtYXg6IDF9LFxuICAgICAgICAgICAgICBkaWVfc2l6ZToge1xuICAgICAgICAgICAgICAgIHZhbHVlOiA1MjEsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnQ09NUExFVEVEJyxcbiAgICAgICAgICAgICAgICB1bml0OiAnbW0yJyxcbiAgICAgICAgICAgICAgICBzb3VyY2U6ICdBdmVyYWdlIHZhbHVlIGZvciBhbGwgZmFtaWxpZXMnLFxuICAgICAgICAgICAgICAgIG1pbjogNDEuMixcbiAgICAgICAgICAgICAgICBtYXg6IDM2NDAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiB7dmFsdWU6IDIsIHVuaXQ6ICdob3Vycyd9LFxuICAgICAgICAgICAgICBhdmdfcG93ZXI6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogMjYwLjA1LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ0NPTVBMRVRFRCcsXG4gICAgICAgICAgICAgICAgdW5pdDogJ1cnLFxuICAgICAgICAgICAgICAgIG1pbjogMjYwLjA1LFxuICAgICAgICAgICAgICAgIG1heDogMjYwLjA1LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB0aW1lX3dvcmtsb2FkOiB7dmFsdWU6IDEwMCwgc3RhdHVzOiAnSU5QVVQnLCB1bml0OiAnJSd9LFxuICAgICAgICAgICAgICB1c2FnZV9sb2NhdGlvbjoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiAnVVNBJyxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdJTlBVVCcsXG4gICAgICAgICAgICAgICAgdW5pdDogJ0NvZFNQMyAtIE5DUyBDb3VudHJ5IENvZGVzIC0gTkFUTycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHVzZV90aW1lX3JhdGlvOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDEsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnQVJDSEVUWVBFJyxcbiAgICAgICAgICAgICAgICB1bml0OiAnLzEnLFxuICAgICAgICAgICAgICAgIG1pbjogMSxcbiAgICAgICAgICAgICAgICBtYXg6IDEsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGhvdXJzX2xpZmVfdGltZToge1xuICAgICAgICAgICAgICAgIHZhbHVlOiAyNjI4MCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdBUkNIRVRZUEUnLFxuICAgICAgICAgICAgICAgIHVuaXQ6ICdob3VycycsXG4gICAgICAgICAgICAgICAgbWluOiAyNjI4MCxcbiAgICAgICAgICAgICAgICBtYXg6IDI2MjgwLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZToge2E6IDE3MS4yLCBiOiAwLjAzNTQsIGM6IDM2Ljg5LCBkOiAtMTAuMTN9LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ0FSQ0hFVFlQRScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGd3cF9mYWN0b3I6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogMC4zNyxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdDT01QTEVURUQnLFxuICAgICAgICAgICAgICAgIHVuaXQ6ICdrZyBDTzJlcS9rV2gnLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogJ2h0dHBzOi8vZW1iZXItY2xpbWF0ZS5vcmcvZGF0YS9kYXRhLWV4cGxvcmVyJyxcbiAgICAgICAgICAgICAgICBtaW46IDAuMzcsXG4gICAgICAgICAgICAgICAgbWF4OiAwLjM3LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBhZHBfZmFjdG9yOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDkuODU1NDhlLTgsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnQ09NUExFVEVEJyxcbiAgICAgICAgICAgICAgICB1bml0OiAna2cgU2JlcS9rV2gnLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogJ0FERU1FIEJhc2Ugb3V0cHV0UyDCricsXG4gICAgICAgICAgICAgICAgbWluOiA5Ljg1NTQ4ZS04LFxuICAgICAgICAgICAgICAgIG1heDogOS44NTU0OGUtOCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcGVfZmFjdG9yOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDExLjM1OCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdDT01QTEVURUQnLFxuICAgICAgICAgICAgICAgIHVuaXQ6ICdNSi9rV2gnLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogJ0FEUGYgLyAoMS0lcmVuZXdhYmxlX2VuZXJneSknLFxuICAgICAgICAgICAgICAgIG1pbjogMTEuMzU4LFxuICAgICAgICAgICAgICAgIG1heDogMTEuMzU4LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9IGFzIFIpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9IGFzIFIpO1xuICB9XG4pO1xuamVzdC5zZXRUaW1lb3V0KDMwMDAwKTtcbmRlc2NyaWJlKCdjcHU6Y29uZmlndXJlIHRlc3QnLCAoKSA9PiB7XG4gIHRlc3QoJ2luaXRpYWxpemUgd3JvbmcgcGFyYW1zIHNob3VsZCB0aHJvdyBlcnJvcicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvdXRwdXRNb2RlbCA9IG5ldyBCb2F2aXp0YUNwdU91dHB1dE1vZGVsKCk7XG4gICAgYXdhaXQgZXhwZWN0KFxuICAgICAgb3V0cHV0TW9kZWwuY29uZmlndXJlKCd0ZXN0Jywge2FsbG9jYXRpb246ICd3cm9uZyd9KVxuICAgICkucmVqZWN0cy50b1Rocm93RXJyb3IoKTtcbiAgICBleHBlY3Qob3V0cHV0TW9kZWwubmFtZSkudG9CZSgndGVzdCcpO1xuICB9KTtcblxuICB0ZXN0KCdpbml0aWFsaXplIHdpdGhvdXQgcGFyYW1zIHRocm93cyBlcnJvciBmb3IgcGFyYW1ldGVyIGFuZCBjYWxsIGV4ZWN1dGUgd2l0aG91dCBwYXJhbXMgdGhyb3dzIGVycm9yIGZvciBpbnB1dCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvdXRwdXRNb2RlbCA9IG5ldyBCb2F2aXp0YUNwdU91dHB1dE1vZGVsKCk7XG4gICAgY29uc3Qgb3V0cHV0TW9kZWxDb25maWdGYWlsID0gbmV3IEJvYXZpenRhQ3B1T3V0cHV0TW9kZWwoKTtcbiAgICBleHBlY3Qob3V0cHV0TW9kZWwubW9kZWxJZGVudGlmaWVyKCkpLnRvQmUoJ29yZy5ib2F2aXp0YS5jcHUuc2NpJyk7XG4gICAgYXdhaXQgZXhwZWN0KG91dHB1dE1vZGVsLmF1dGhlbnRpY2F0ZSh7fSkpLnJlc29sdmVzLnRvQmUodW5kZWZpbmVkKTtcbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBvdXRwdXRNb2RlbENvbmZpZ0ZhaWwuZXhlY3V0ZShbXG4gICAgICAgIHtcbiAgICAgICAgICB0aW1lc3RhbXA6ICcyMDIxLTAxLTAxVDAwOjAwOjAwWicsXG4gICAgICAgICAgZHVyYXRpb246IDM2MDAsXG4gICAgICAgICAgJ2NwdS11dGlsJzogNTAsXG4gICAgICAgIH0sXG4gICAgICBdKVxuICAgICkucmVqZWN0cy50b1Rocm93RXJyb3IoKTtcblxuICAgIGF3YWl0IGV4cGVjdChvdXRwdXRNb2RlbC5jb25maWd1cmUoJ3Rlc3QnKSkucmVqZWN0cy50b1Rocm93KFxuICAgICAgRXJyb3IoJ0ltcHJvcGVyIGNvbmZpZ3VyZTogTWlzc2luZyBwcm9jZXNzb3IgcGFyYW1ldGVyJylcbiAgICApO1xuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIG91dHB1dE1vZGVsLmNvbmZpZ3VyZSgndGVzdCcsIHtcbiAgICAgICAgJ3BoeXNpY2FsLXByb2Nlc3Nvcic6ICdJbnRlbCBYZW9uIEdvbGQgNjEzOGYnLFxuICAgICAgfSlcbiAgICApLnJlamVjdHMudG9UaHJvdyhcbiAgICAgIEVycm9yKCdJbXByb3BlciBjb25maWd1cmU6IE1pc3NpbmcgY29yZS11bml0cyBwYXJhbWV0ZXInKVxuICAgICk7XG4gICAgYXdhaXQgZXhwZWN0KFxuICAgICAgb3V0cHV0TW9kZWwuY29uZmlndXJlKCd0ZXN0Jywge1xuICAgICAgICAncGh5c2ljYWwtcHJvY2Vzc29yJzogJ0ludGVsIFhlb24gR29sZCA2MTM4ZicsXG4gICAgICAgICdjb3JlLXVuaXRzJzogMjQsXG4gICAgICAgICdleHBlY3RlZC1saWZlc3Bhbic6IDQgKiAzNjUgKiAyNCAqIDYwICogNjAsXG4gICAgICB9KVxuICAgICkucmVzb2x2ZXMudG9CZUluc3RhbmNlT2YoQm9hdml6dGFDcHVPdXRwdXRNb2RlbCk7XG4gICAgZXhwZWN0KG91dHB1dE1vZGVsLm5hbWUpLnRvQmUoJ3Rlc3QnKTtcbiAgICAvLyBub3QgcHJvdmlkaW5nIGlucHV0cyB3aWxsIHRocm93IGEgbWlzc2luZyBpbnB1dHMgZXJyb3JcbiAgICBhd2FpdCBleHBlY3Qob3V0cHV0TW9kZWwuZXhlY3V0ZSgpKS5yZWplY3RzLnRvU3RyaWN0RXF1YWwoXG4gICAgICBFcnJvcihcbiAgICAgICAgJ1BhcmFtZXRlciBOb3QgR2l2ZW46IGludmFsaWQgaW5wdXRzIHBhcmFtZXRlci4gRXhwZWN0aW5nIGFuIGFycmF5IG9mIGlucHV0cydcbiAgICAgIClcbiAgICApO1xuICAgIC8vIGltcHJvcGVyIGlucHV0cyB3aWxsIHRocm93IGFuIGludmFsaWQgaW5wdXRzIGVycm9yXG4gICAgYXdhaXQgZXhwZWN0KFxuICAgICAgb3V0cHV0TW9kZWwuZXhlY3V0ZShbe2ludmFsaWQ6ICdpbnB1dCd9XSlcbiAgICApLnJlamVjdHMudG9TdHJpY3RFcXVhbChFcnJvcignSW52YWxpZCBJbnB1dDogSW52YWxpZCBpbnB1dHMgcGFyYW1ldGVyJykpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnY3B1OmluaXRpYWxpemUgd2l0aCBwYXJhbXMnLCAoKSA9PiB7XG4gIHRlc3QoJ2luaXRpYWxpemUgd2l0aCBwYXJhbXMgYW5kIGNhbGwgbXVsdGlwbGUgdXNhZ2VzIGluIElNUEwgZm9ybWF0JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG91dHB1dE1vZGVsID0gbmV3IEJvYXZpenRhQ3B1T3V0cHV0TW9kZWwoKTtcbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBvdXRwdXRNb2RlbC5jb25maWd1cmUoJ3Rlc3QnLCB7XG4gICAgICAgICdwaHlzaWNhbC1wcm9jZXNzb3InOiAnSW50ZWwgWGVvbiBHb2xkIDYxMzhmJyxcbiAgICAgICAgJ2NvcmUtdW5pdHMnOiAyNCxcbiAgICAgICAgbG9jYXRpb246ICdVU0EnLFxuICAgICAgfSlcbiAgICApLnJlc29sdmVzLnRvQmVJbnN0YW5jZU9mKEJvYXZpenRhQ3B1T3V0cHV0TW9kZWwpO1xuICAgIGV4cGVjdChvdXRwdXRNb2RlbC5uYW1lKS50b0JlKCd0ZXN0Jyk7XG4gICAgLy8gY29uZmlndXJlIHdpdGhvdXQgc3RhdGljIHBhcmFtcyB3aWxsIGNhdXNlIGltcHJvcGVyIGNvbmZpZ3VyZSBlcnJvclxuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIG91dHB1dE1vZGVsLmV4ZWN1dGUoW1xuICAgICAgICB7XG4gICAgICAgICAgdGltZXN0YW1wOiAnMjAyMS0wMS0wMVQwMDowMDowMFonLFxuICAgICAgICAgIGR1cmF0aW9uOiAzNjAwLFxuICAgICAgICAgICdjcHUtdXRpbCc6IDUwLFxuICAgICAgICB9LFxuICAgICAgXSlcbiAgICApLnJlc29sdmVzLnRvU3RyaWN0RXF1YWwoW1xuICAgICAge1xuICAgICAgICAnZW1ib2RpZWQtY2FyYm9uJzogMC44LFxuICAgICAgICAnZS1jcHUnOiAwLjU3NSxcbiAgICAgIH0sXG4gICAgXSk7XG4gIH0pO1xuICB0ZXN0KCdpbml0aWFsaXplIHdpdGggcGFyYW1zIGFuZCBjYWxsIG11bHRpcGxlIHVzYWdlcyBpbiBJTVBMIGZvcm1hdDp2ZXJib3NlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG91dHB1dE1vZGVsID0gbmV3IEJvYXZpenRhQ3B1T3V0cHV0TW9kZWwoKTtcbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBvdXRwdXRNb2RlbC5jb25maWd1cmUoJ3Rlc3QnLCB7XG4gICAgICAgICdwaHlzaWNhbC1wcm9jZXNzb3InOiAnSW50ZWwgWGVvbiBHb2xkIDYxMzhmJyxcbiAgICAgICAgJ2NvcmUtdW5pdHMnOiAyNCxcbiAgICAgICAgbG9jYXRpb246ICdVU0EnLFxuICAgICAgICB2ZXJib3NlOiB0cnVlLFxuICAgICAgfSlcbiAgICApLnJlc29sdmVzLnRvQmVJbnN0YW5jZU9mKEJvYXZpenRhQ3B1T3V0cHV0TW9kZWwpO1xuICAgIGV4cGVjdChvdXRwdXRNb2RlbC5uYW1lKS50b0JlKCd0ZXN0Jyk7XG4gICAgLy8gY29uZmlndXJlIHdpdGhvdXQgc3RhdGljIHBhcmFtcyB3aWxsIGNhdXNlIGltcHJvcGVyIGNvbmZpZ3VyZSBlcnJvclxuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIG91dHB1dE1vZGVsLmV4ZWN1dGUoW1xuICAgICAgICB7XG4gICAgICAgICAgdGltZXN0YW1wOiAnMjAyMS0wMS0wMVQwMDowMDowMFonLFxuICAgICAgICAgIGR1cmF0aW9uOiA3MjAwLFxuICAgICAgICAgICdjcHUtdXRpbCc6IDEwMCxcbiAgICAgICAgfSxcbiAgICAgIF0pXG4gICAgKS5yZXNvbHZlcy50b1N0cmljdEVxdWFsKFtcbiAgICAgIHtcbiAgICAgICAgJ2VtYm9kaWVkLWNhcmJvbic6IDEuNixcbiAgICAgICAgJ2UtY3B1JzogMS42NDA4MzMzMzMzMzMzMzM0LFxuICAgICAgfSxcbiAgICBdKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2Nsb3VkOmluaXRpYWxpemUgd2l0aCBwYXJhbXMnLCAoKSA9PiB7XG4gIHRlc3QoJ2luaXRpYWxpemUgd2l0aCBwYXJhbXMgYW5kIGNhbGwgdXNhZ2UgaW4gUkFXIEZvcm1hdCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvdXRwdXRNb2RlbCA9IG5ldyBCb2F2aXp0YUNsb3VkT3V0cHV0TW9kZWwoKTtcbiAgICBleHBlY3Qob3V0cHV0TW9kZWwubW9kZWxJZGVudGlmaWVyKCkpLnRvQmUoJ29yZy5ib2F2aXp0YS5jbG91ZC5zY2knKTtcbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBvdXRwdXRNb2RlbC52YWxpZGF0ZUxvY2F0aW9uKHtsb2NhdGlvbjogJ1NvbWV0aGluZ0ZhaWwnfSlcbiAgICApLnJlamVjdHMudG9UaHJvd0Vycm9yKCk7XG4gICAgYXdhaXQgZXhwZWN0KFxuICAgICAgb3V0cHV0TW9kZWwudmFsaWRhdGVJbnN0YW5jZVR5cGUoeydpbnN0YW5jZS10eXBlJzogJ1NvbWV0aGluZ0ZhaWwnfSlcbiAgICApLnJlamVjdHMudG9UaHJvd0Vycm9yKCk7XG4gICAgYXdhaXQgZXhwZWN0KFxuICAgICAgb3V0cHV0TW9kZWwudmFsaWRhdGVQcm92aWRlcih7cHJvdmlkZXI6ICdTb21ldGhpbmdGYWlsJ30pXG4gICAgKS5yZWplY3RzLnRvVGhyb3dFcnJvcigpO1xuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIG91dHB1dE1vZGVsLmNvbmZpZ3VyZSgndGVzdCcsIHtcbiAgICAgICAgJ2luc3RhbmNlLXR5cGUnOiAndDIubWljcm8nLFxuICAgICAgICBsb2NhdGlvbjogJ1VTQScsXG4gICAgICAgICdleHBlY3RlZC1saWZlc3Bhbic6IDQgKiAzNjUgKiAyNCAqIDYwICogNjAsXG4gICAgICAgIHByb3ZpZGVyOiAnYXdzJyxcbiAgICAgICAgdmVyYm9zZTogZmFsc2UsXG4gICAgICB9KVxuICAgICkucmVzb2x2ZXMudG9CZUluc3RhbmNlT2YoQm9hdml6dGFDbG91ZE91dHB1dE1vZGVsKTtcbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBvdXRwdXRNb2RlbC5jb25maWd1cmUoJ3Rlc3QnLCB7XG4gICAgICAgICdpbnN0YW5jZS10eXBlJzogJ3QyLm1pY3JvJyxcbiAgICAgICAgbG9jYXRpb246ICdVU0EnLFxuICAgICAgICAnZXhwZWN0ZWQtbGlmZXNwYW4nOiA0ICogMzY1ICogMjQgKiA2MCAqIDYwLFxuICAgICAgICBwcm92aWRlcjogJ2F3cycsXG4gICAgICAgIHZlcmJvc2U6ICdmYWxzZScsXG4gICAgICB9KVxuICAgICkucmVzb2x2ZXMudG9CZUluc3RhbmNlT2YoQm9hdml6dGFDbG91ZE91dHB1dE1vZGVsKTtcbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBvdXRwdXRNb2RlbC5jb25maWd1cmUoJ3Rlc3QnLCB7XG4gICAgICAgICdpbnN0YW5jZS10eXBlJzogJ3QyLm1pY3JvJyxcbiAgICAgICAgbG9jYXRpb246ICdVU0EnLFxuICAgICAgICAnZXhwZWN0ZWQtbGlmZXNwYW4nOiA0ICogMzY1ICogMjQgKiA2MCAqIDYwLFxuICAgICAgICBwcm92aWRlcjogJ2F3cycsXG4gICAgICAgIHZlcmJvc2U6IDAsXG4gICAgICB9KVxuICAgICkucmVzb2x2ZXMudG9CZUluc3RhbmNlT2YoQm9hdml6dGFDbG91ZE91dHB1dE1vZGVsKTtcbiAgICBleHBlY3Qob3V0cHV0TW9kZWwubmFtZSkudG9CZSgndGVzdCcpO1xuICAgIC8vIGNvbmZpZ3VyZSB3aXRob3V0IHN0YXRpYyBwYXJhbXMgd2lsbCBjYXVzZSBpbXByb3BlciBjb25maWd1cmUgZXJyb3JcbiAgfSk7XG5cbiAgdGVzdChcImNvcnJlY3QgJ2luc3RhbmNlLXR5cGUnOiBpbml0aWFsaXplIHdpdGggcGFyYW1zIGFuZCBjYWxsIHVzYWdlIGluIElNUEwgRm9ybWF0XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvdXRwdXRNb2RlbCA9IG5ldyBCb2F2aXp0YUNsb3VkT3V0cHV0TW9kZWwoKTtcblxuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIG91dHB1dE1vZGVsLmNvbmZpZ3VyZSgndGVzdCcsIHtcbiAgICAgICAgJ2luc3RhbmNlLXR5cGUnOiAndDIubWljcm8nLFxuICAgICAgICBsb2NhdGlvbjogJ1VTQScsXG4gICAgICB9KVxuICAgICkucmVqZWN0cy50b1Rocm93RXJyb3IoKTtcbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBvdXRwdXRNb2RlbC5jb25maWd1cmUoJ3Rlc3QnLCB7XG4gICAgICAgIHByb3ZpZGVyOiAnYXdzJyxcbiAgICAgICAgbG9jYXRpb246ICdVU0EnLFxuICAgICAgfSlcbiAgICApLnJlamVjdHMudG9UaHJvd0Vycm9yKCk7XG4gICAgYXdhaXQgZXhwZWN0KFxuICAgICAgb3V0cHV0TW9kZWwuY29uZmlndXJlKCd0ZXN0Jywge1xuICAgICAgICAnaW5zdGFuY2UtdHlwZSc6ICd0Mi5taWNybycsXG4gICAgICAgIGxvY2F0aW9uOiAnVVNBJyxcbiAgICAgICAgcHJvdmlkZXI6ICdhd3MnLFxuICAgICAgfSlcbiAgICApLnJlc29sdmVzLnRvQmVJbnN0YW5jZU9mKEJvYXZpenRhQ2xvdWRPdXRwdXRNb2RlbCk7XG4gICAgZXhwZWN0KG91dHB1dE1vZGVsLm5hbWUpLnRvQmUoJ3Rlc3QnKTtcbiAgICAvLyBtb2NrQXhpb3MuZ2V0Lm1vY2tSZXNvbHZlZFZhbHVlKHtkYXRhOiB7fX0pO1xuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIG91dHB1dE1vZGVsLmV4ZWN1dGUoW1xuICAgICAgICB7XG4gICAgICAgICAgdGltZXN0YW1wOiAnMjAyMS0wMS0wMVQwMDowMDowMFonLFxuICAgICAgICAgIGR1cmF0aW9uOiAxNSxcbiAgICAgICAgICAnY3B1LXV0aWwnOiAzNCxcbiAgICAgICAgfSxcbiAgICAgIF0pXG4gICAgKS5yZXNvbHZlcy50b1N0cmljdEVxdWFsKFtcbiAgICAgIHtcbiAgICAgICAgJ2VtYm9kaWVkLWNhcmJvbic6IDEuNixcbiAgICAgICAgZW5lcmd5OiAxLjY0MDgzMzMzMzMzMzMzMzQsXG4gICAgICB9LFxuICAgIF0pO1xuICB9KTtcblxuICB0ZXN0KCd3cm9uZyBcImluc3RhbmNlLXR5cGVcIjogaW5pdGlhbGl6ZSB3aXRoIHBhcmFtcyBhbmQgY2FsbCB1c2FnZSBpbiBJTVBMIEZvcm1hdCB0aHJvd3MgZXJyb3InLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgb3V0cHV0TW9kZWwgPSBuZXcgQm9hdml6dGFDbG91ZE91dHB1dE1vZGVsKCk7XG5cbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBvdXRwdXRNb2RlbC5jb25maWd1cmUoJ3Rlc3QnLCB7XG4gICAgICAgICdpbnN0YW5jZS10eXBlJzogJ3Q1Lm1pY3JvJyxcbiAgICAgICAgbG9jYXRpb246ICdVU0EnLFxuICAgICAgICBwcm92aWRlcjogJ2F3cycsXG4gICAgICB9KVxuICAgICkucmVqZWN0cy50b1Rocm93RXJyb3IoKTtcbiAgICBleHBlY3Qob3V0cHV0TW9kZWwubmFtZSkudG9CZSgndGVzdCcpO1xuICAgIC8vIGNvbmZpZ3VyZSB3aXRob3V0IHN0YXRpYyBwYXJhbXMgd2lsbCBjYXVzZSBpbXByb3BlciBjb25maWd1cmUgZXJyb3JcbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBvdXRwdXRNb2RlbC5leGVjdXRlKFtcbiAgICAgICAge1xuICAgICAgICAgIHRpbWVzdGFtcDogJzIwMjEtMDEtMDFUMDA6MDA6MDBaJyxcbiAgICAgICAgICBkdXJhdGlvbjogMTUsXG4gICAgICAgICAgJ2NwdS11dGlsJzogMzQsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0aW1lc3RhbXA6ICcyMDIxLTAxLTAxVDAwOjAwOjE1WicsXG4gICAgICAgICAgZHVyYXRpb246IDE1LFxuICAgICAgICAgICdjcHUtdXRpbCc6IDEyLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGltZXN0YW1wOiAnMjAyMS0wMS0wMVQwMDowMDozMFonLFxuICAgICAgICAgIGR1cmF0aW9uOiAxNSxcbiAgICAgICAgICAnY3B1LXV0aWwnOiAxLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGltZXN0YW1wOiAnMjAyMS0wMS0wMVQwMDowMDo0NVonLFxuICAgICAgICAgIGR1cmF0aW9uOiAxNSxcbiAgICAgICAgICAnY3B1LXV0aWwnOiA3OCxcbiAgICAgICAgfSxcbiAgICAgIF0pXG4gICAgKS5yZWplY3RzLnRvVGhyb3dFcnJvcigpO1xuICB9KTtcblxuICB0ZXN0KCd3aXRob3V0IFwiaW5zdGFuY2UtdHlwZVwiOiBpbml0aWFsaXplIHdpdGggcGFyYW1zIGFuZCBjYWxsIHVzYWdlIGluIElNUEwgRm9ybWF0IHRocm93cyBlcnJvcicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvdXRwdXRNb2RlbCA9IG5ldyBCb2F2aXp0YUNsb3VkT3V0cHV0TW9kZWwoKTtcblxuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIG91dHB1dE1vZGVsLmNvbmZpZ3VyZSgndGVzdCcsIHtcbiAgICAgICAgbG9jYXRpb246ICdVU0EnLFxuICAgICAgICBwcm92aWRlcjogJ2F3cycsXG4gICAgICB9KVxuICAgICkucmVqZWN0cy50b1N0cmljdEVxdWFsKFxuICAgICAgRXJyb3IoXCJJbXByb3BlciBjb25maWd1cmU6IE1pc3NpbmcgJ2luc3RhbmNlLXR5cGUnIHBhcmFtZXRlclwiKVxuICAgICk7XG4gICAgYXdhaXQgZXhwZWN0KFxuICAgICAgb3V0cHV0TW9kZWwuY29uZmlndXJlKCd0ZXN0Jywge1xuICAgICAgICBsb2NhdGlvbjogJ1VTQUYnLFxuICAgICAgICBwcm92aWRlcjogJ2F3cycsXG4gICAgICAgICdpbnN0YW5jZS10eXBlJzogJ3QyLm1pY3JvJyxcbiAgICAgIH0pXG4gICAgKS5yZWplY3RzLnRvVGhyb3dFcnJvcigpO1xuICAgIGV4cGVjdChvdXRwdXRNb2RlbC5uYW1lKS50b0JlKCd0ZXN0Jyk7XG4gICAgLy8gY29uZmlndXJlIHdpdGhvdXQgc3RhdGljIHBhcmFtcyB3aWxsIGNhdXNlIGltcHJvcGVyIGNvbmZpZ3VyZSBlcnJvclxuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIG91dHB1dE1vZGVsLmV4ZWN1dGUoW1xuICAgICAgICB7XG4gICAgICAgICAgdGltZXN0YW1wOiAnMjAyMS0wMS0wMVQwMDowMDowMFonLFxuICAgICAgICAgIGR1cmF0aW9uOiAxNSxcbiAgICAgICAgICAnY3B1LXV0aWwnOiAzNCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRpbWVzdGFtcDogJzIwMjEtMDEtMDFUMDA6MDA6MTVaJyxcbiAgICAgICAgICBkdXJhdGlvbjogMTUsXG4gICAgICAgICAgJ2NwdS11dGlsJzogMTIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0aW1lc3RhbXA6ICcyMDIxLTAxLTAxVDAwOjAwOjMwWicsXG4gICAgICAgICAgZHVyYXRpb246IDE1LFxuICAgICAgICAgICdjcHUtdXRpbCc6IDEsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0aW1lc3RhbXA6ICcyMDIxLTAxLTAxVDAwOjAwOjQ1WicsXG4gICAgICAgICAgZHVyYXRpb246IDE1LFxuICAgICAgICAgICdjcHUtdXRpbCc6IDc4LFxuICAgICAgICB9LFxuICAgICAgXSlcbiAgICApLnJlamVjdHMudG9TdHJpY3RFcXVhbChcbiAgICAgIEVycm9yKCdJbXByb3BlciBjb25maWd1cmU6IE1pc3NpbmcgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzJylcbiAgICApO1xuICB9KTtcbn0pO1xuIl19
|