@grnsft/if 0.0.6 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/.examples/ompls/azure.yml +205 -0
  2. package/.github/workflows/nodejs-ci.yml +0 -8
  3. package/README.md +48 -9
  4. package/build/index.js +1 -2
  5. package/coverage/clover.xml +132 -1118
  6. package/coverage/coverage-final.json +9 -26
  7. package/coverage/lcov-report/config/config.ts.html +3 -66
  8. package/coverage/lcov-report/config/index.html +15 -15
  9. package/coverage/lcov-report/config/index.ts.html +3 -3
  10. package/coverage/lcov-report/config/strings.ts.html +82 -19
  11. package/coverage/lcov-report/index.html +36 -231
  12. package/coverage/lcov-report/lib/index.html +43 -13
  13. package/coverage/lcov-report/lib/models-universe.ts.html +433 -0
  14. package/coverage/lcov-report/lib/observatory.ts.html +187 -0
  15. package/coverage/lcov-report/lib/supercomputer.ts.html +553 -0
  16. package/coverage/lcov-report/util/args.ts.html +23 -8
  17. package/coverage/lcov-report/util/errors.ts.html +157 -0
  18. package/coverage/lcov-report/util/index.html +20 -50
  19. package/coverage/lcov-report/util/yaml.ts.html +17 -11
  20. package/coverage/lcov.info +225 -2004
  21. package/examples/impls/test/azure.yml +8 -8
  22. package/examples/impls/test/ccf.yml +5 -3
  23. package/examples/impls/test/if-demo.yml +19 -9
  24. package/examples/impls/test/metadata.yml +3 -2
  25. package/examples/impls/test/nesting.yml +10 -13
  26. package/examples/impls/test/sci-e.yml +1 -1
  27. package/examples/impls/test/sci-m.yml +2 -2
  28. package/examples/impls/test/sci-o.yml +2 -4
  29. package/examples/impls/test/sci.yml +38 -15
  30. package/examples/impls/test/shell.yml +2 -1
  31. package/examples/impls/{tdp-finder-test.yml → test/tdp-finder.yml} +8 -8
  32. package/examples/ompls/ccf.yml +3 -1
  33. package/examples/ompls/if-demo.yml +46 -22
  34. package/package.json +15 -7
  35. package/tsconfig.build.json +7 -0
  36. package/tsconfig.build.tsbuildinfo +1 -0
  37. package/build/__mocks__/azure/index.d.ts +0 -11
  38. package/build/__mocks__/azure/index.js +0 -132
  39. package/build/__mocks__/boavizta/countries.json +0 -138
  40. package/build/__mocks__/boavizta/instance_types.json +0 -625
  41. package/build/__mocks__/boavizta/providers.json +0 -1
  42. package/build/__mocks__/fs/index.d.ts +0 -3
  43. package/build/__mocks__/fs/index.js +0 -56
  44. package/build/__mocks__/model-universe/index.d.ts +0 -31
  45. package/build/__mocks__/model-universe/index.js +0 -64
  46. package/build/__mocks__/watt-time/data.json +0 -119
  47. package/build/__tests__/integration/ompl/index.test.d.ts +0 -1
  48. package/build/__tests__/integration/ompl/index.test.js +0 -61
  49. package/build/__tests__/unit/lib/azure-importer/index.test.d.ts +0 -1
  50. package/build/__tests__/unit/lib/azure-importer/index.test.js +0 -152
  51. package/build/__tests__/unit/lib/boavizta/index.test.d.ts +0 -1
  52. package/build/__tests__/unit/lib/boavizta/index.test.js +0 -579
  53. package/build/__tests__/unit/lib/case-studies/aveva.test.d.ts +0 -1
  54. package/build/__tests__/unit/lib/case-studies/aveva.test.js +0 -36
  55. package/build/__tests__/unit/lib/case-studies/emem.test.d.ts +0 -1
  56. package/build/__tests__/unit/lib/case-studies/emem.test.js +0 -108
  57. package/build/__tests__/unit/lib/case-studies/eshoppen.test.d.ts +0 -1
  58. package/build/__tests__/unit/lib/case-studies/eshoppen.test.js +0 -53
  59. package/build/__tests__/unit/lib/case-studies/sci-accenture.test.d.ts +0 -1
  60. package/build/__tests__/unit/lib/case-studies/sci-accenture.test.js +0 -23
  61. package/build/__tests__/unit/lib/ccf/index.test.d.ts +0 -1
  62. package/build/__tests__/unit/lib/ccf/index.test.js +0 -223
  63. package/build/__tests__/unit/lib/cloud-instance-metadata/index.test.d.ts +0 -1
  64. package/build/__tests__/unit/lib/cloud-instance-metadata/index.test.js +0 -73
  65. package/build/__tests__/unit/lib/models-universe.test.d.ts +0 -1
  66. package/build/__tests__/unit/lib/models-universe.test.js +0 -193
  67. package/build/__tests__/unit/lib/observatory.test.d.ts +0 -1
  68. package/build/__tests__/unit/lib/observatory.test.js +0 -99
  69. package/build/__tests__/unit/lib/sci/index.test.d.ts +0 -1
  70. package/build/__tests__/unit/lib/sci/index.test.js +0 -106
  71. package/build/__tests__/unit/lib/sci-e/index.test.d.ts +0 -1
  72. package/build/__tests__/unit/lib/sci-e/index.test.js +0 -30
  73. package/build/__tests__/unit/lib/sci-m/index.test.d.ts +0 -1
  74. package/build/__tests__/unit/lib/sci-m/index.test.js +0 -58
  75. package/build/__tests__/unit/lib/sci-o/index.test.d.ts +0 -1
  76. package/build/__tests__/unit/lib/sci-o/index.test.js +0 -42
  77. package/build/__tests__/unit/lib/shell-imp/index.test.d.ts +0 -1
  78. package/build/__tests__/unit/lib/shell-imp/index.test.js +0 -21
  79. package/build/__tests__/unit/lib/supercomputer.test.d.ts +0 -1
  80. package/build/__tests__/unit/lib/supercomputer.test.js +0 -231
  81. package/build/__tests__/unit/lib/tdp-finder/index.test.d.ts +0 -1
  82. package/build/__tests__/unit/lib/tdp-finder/index.test.js +0 -62
  83. package/build/__tests__/unit/lib/teads-aws/index.test.d.ts +0 -1
  84. package/build/__tests__/unit/lib/teads-aws/index.test.js +0 -170
  85. package/build/__tests__/unit/lib/teads-curve/index.test.d.ts +0 -1
  86. package/build/__tests__/unit/lib/teads-curve/index.test.js +0 -146
  87. package/build/__tests__/unit/lib/watt-time/index.test.d.ts +0 -1
  88. package/build/__tests__/unit/lib/watt-time/index.test.js +0 -106
  89. package/build/__tests__/unit/util/args.test.d.ts +0 -1
  90. package/build/__tests__/unit/util/args.test.js +0 -92
  91. package/build/__tests__/unit/util/models-universe.test.d.ts +0 -1
  92. package/build/__tests__/unit/util/models-universe.test.js +0 -193
  93. package/build/__tests__/unit/util/observatory.test.d.ts +0 -1
  94. package/build/__tests__/unit/util/observatory.test.js +0 -99
  95. package/build/__tests__/unit/util/supercomputer.test.d.ts +0 -1
  96. package/build/__tests__/unit/util/supercomputer.test.js +0 -231
  97. package/build/__tests__/unit/util/yaml.test.d.ts +0 -1
  98. package/build/__tests__/unit/util/yaml.test.js +0 -59
  99. package/build/config/config.d.ts +0 -9
  100. package/build/config/config.js +0 -51
  101. package/build/lib/azure-importer/index.d.ts +0 -55
  102. package/build/lib/azure-importer/index.js +0 -314
  103. package/build/lib/boavizta/index.d.ts +0 -53
  104. package/build/lib/boavizta/index.js +0 -254
  105. package/build/lib/case-studies/aveva-model.d.ts +0 -29
  106. package/build/lib/case-studies/aveva-model.js +0 -53
  107. package/build/lib/case-studies/emem-model.d.ts +0 -42
  108. package/build/lib/case-studies/emem-model.js +0 -93
  109. package/build/lib/case-studies/eshoppen-model.d.ts +0 -24
  110. package/build/lib/case-studies/eshoppen-model.js +0 -123
  111. package/build/lib/case-studies/index.d.ts +0 -4
  112. package/build/lib/case-studies/index.js +0 -21
  113. package/build/lib/case-studies/sci-accenture-model.d.ts +0 -10
  114. package/build/lib/case-studies/sci-accenture-model.js +0 -37
  115. package/build/lib/ccf/aws-embodied.json +0 -5591
  116. package/build/lib/ccf/aws-instances.json +0 -21116
  117. package/build/lib/ccf/aws-use.json +0 -79
  118. package/build/lib/ccf/azure-embodied.json +0 -6547
  119. package/build/lib/ccf/azure-instances.json +0 -8332
  120. package/build/lib/ccf/azure-use.json +0 -58
  121. package/build/lib/ccf/gcp-embodied.json +0 -3049
  122. package/build/lib/ccf/gcp-instances.json +0 -3880
  123. package/build/lib/ccf/gcp-use.json +0 -58
  124. package/build/lib/ccf/index.d.ts +0 -63
  125. package/build/lib/ccf/index.js +0 -338
  126. package/build/lib/cloud-instance-metadata/aws-instances.json +0 -1
  127. package/build/lib/cloud-instance-metadata/azure-instances.json +0 -1
  128. package/build/lib/cloud-instance-metadata/index.d.ts +0 -15
  129. package/build/lib/cloud-instance-metadata/index.js +0 -104
  130. package/build/lib/index.d.ts +0 -14
  131. package/build/lib/index.js +0 -32
  132. package/build/lib/interfaces/ccf.d.ts +0 -19
  133. package/build/lib/interfaces/ccf.js +0 -3
  134. package/build/lib/interfaces/index.d.ts +0 -7
  135. package/build/lib/interfaces/index.js +0 -18
  136. package/build/lib/observatory.d.ts +0 -20
  137. package/build/lib/observatory.js +0 -31
  138. package/build/lib/sci/index.d.ts +0 -13
  139. package/build/lib/sci/index.js +0 -131
  140. package/build/lib/sci-e/index.d.ts +0 -38
  141. package/build/lib/sci-e/index.js +0 -85
  142. package/build/lib/sci-m/index.d.ts +0 -10
  143. package/build/lib/sci-m/index.js +0 -124
  144. package/build/lib/sci-o/index.d.ts +0 -17
  145. package/build/lib/sci-o/index.js +0 -52
  146. package/build/lib/shell-imp/index.d.ts +0 -32
  147. package/build/lib/shell-imp/index.js +0 -82
  148. package/build/lib/tdp-finder/index.d.ts +0 -19
  149. package/build/lib/tdp-finder/index.js +0 -98
  150. package/build/lib/teads-aws/aws-embodied.json +0 -1
  151. package/build/lib/teads-aws/aws-instances.json +0 -1
  152. package/build/lib/teads-aws/index.d.ts +0 -58
  153. package/build/lib/teads-aws/index.js +0 -208
  154. package/build/lib/teads-curve/index.d.ts +0 -52
  155. package/build/lib/teads-curve/index.js +0 -158
  156. package/build/lib/watt-time/index.d.ts +0 -18
  157. package/build/lib/watt-time/index.js +0 -204
  158. package/build/types/model-interface.d.ts +0 -16
  159. package/build/types/model-interface.js +0 -3
  160. package/build/types/process-args.d.ts +0 -7
  161. package/build/types/process-args.js +0 -3
  162. package/build/types/supercomputer.d.ts +0 -4
  163. package/build/types/supercomputer.js +0 -3
  164. package/build/util/args.js +0 -48
  165. package/build/util/errors.d.ts +0 -6
  166. package/build/util/errors.js +0 -22
  167. package/build/util/helpers.js +0 -18
  168. package/build/util/models-universe.d.ts +0 -28
  169. package/build/util/models-universe.js +0 -95
  170. package/build/util/observatory.d.ts +0 -20
  171. package/build/util/observatory.js +0 -31
  172. package/build/util/supercomputer.d.ts +0 -30
  173. package/build/util/supercomputer.js +0 -109
  174. package/docs/implementations/tdp-finder.md +0 -36
  175. package/examples/impls/test/complex-pipeline.yml +0 -67
  176. package/examples/impls/test/toto.yaml +0 -22
  177. package/src/__mocks__/boavizta/countries.json +0 -138
  178. package/src/__mocks__/boavizta/instance_types.json +0 -625
  179. package/src/__mocks__/boavizta/providers.json +0 -1
  180. package/src/__mocks__/watt-time/data.json +0 -119
  181. package/tsconfig.tsbuildinfo +0 -1
  182. package/yarn-error.log +0 -5854
@@ -1,254 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.BoaviztaCloudOutputModel = exports.BoaviztaCpuOutputModel = void 0;
4
- const axios_1 = require("axios");
5
- const config_1 = require("../../config");
6
- const { MODEL_IDS } = config_1.CONFIG;
7
- const { BOAVIZTA_CPU, BOAVIZTA_CLOUD } = MODEL_IDS;
8
- class BoaviztaOutputModel {
9
- constructor() {
10
- this.sharedParams = undefined;
11
- this.metricType = 'cpu-util';
12
- this.expectedLifespan = 4 * 365 * 24 * 60 * 60;
13
- }
14
- async authenticate(authParams) {
15
- this.authCredentials = authParams;
16
- }
17
- async configure(name, staticParams = undefined) {
18
- this.name = name;
19
- this.sharedParams = await this.captureStaticParams(staticParams ?? {});
20
- return this;
21
- }
22
- // list of supported locations by the model
23
- async supportedLocations() {
24
- const countries = await axios_1.default.get('https://api.boavizta.org/v1/utils/country_code');
25
- return Object.values(countries.data);
26
- }
27
- // converts the usage from IMPL input to the format required by Boavizta API.
28
- transformToBoaviztaUsage(duration, metric) {
29
- // duration is in seconds, convert to hours
30
- // metric is between 0 and 1, convert to percentage
31
- let usageInput = {
32
- hours_use_time: duration / 3600.0,
33
- time_workload: metric,
34
- };
35
- // convert expected lifespan from seconds to years
36
- usageInput['years_life_time'] =
37
- this.expectedLifespan / (365.0 * 24.0 * 60.0 * 60.0);
38
- usageInput = this.addLocationToUsage(usageInput);
39
- return usageInput;
40
- }
41
- // Calculates the output of the given usage
42
- async execute(inputs = undefined) {
43
- if (Array.isArray(inputs)) {
44
- const results = [];
45
- for (const input of inputs) {
46
- const usageResult = await this.calculateUsageForinput(input);
47
- results.push(usageResult);
48
- }
49
- return results;
50
- }
51
- else {
52
- throw new Error('Parameter Not Given: invalid inputs parameter. Expecting an array of inputs');
53
- }
54
- }
55
- // Adds location to usage if location is defined in sharedParams
56
- addLocationToUsage(usageRaw) {
57
- if (this.sharedParams !== undefined && 'location' in this.sharedParams) {
58
- usageRaw['usage_location'] = this.sharedParams['location'];
59
- }
60
- return usageRaw;
61
- }
62
- // extracts information from Boavizta API response to return the output in the format required by IMPL
63
- formatResponse(data) {
64
- let m = 0;
65
- let e = 0;
66
- if ('outputs' in data) {
67
- // embodied-carbon output is in kgCO2eq, convert to gCO2eq
68
- m = data['outputs']['gwp']['embedded']['value'] * 1000;
69
- // use output is in J , convert to kWh.
70
- // 1,000,000 J / 3600 = 277.7777777777778 Wh.
71
- // 1 MJ / 3.6 = 0.278 kWh
72
- e = data['outputs']['pe']['use']['value'] / 3.6;
73
- }
74
- else if ('gwp' in data && 'pe' in data) {
75
- // embodied-carbon output is in kgCO2eq, convert to gCO2eq
76
- m = data['gwp']['embodied-carbon'] * 1000;
77
- // use output is in J , convert to kWh.
78
- // 1,000,000 J / 3600 = 277.7777777777778 Wh.
79
- // 1 MJ / 3.6 = 0.278 kWh
80
- e = data['pe']['use'] / 3.6;
81
- }
82
- return { 'embodied-carbon': m, energy: e };
83
- }
84
- // converts the usage to the format required by Boavizta API.
85
- async calculateUsageForinput(input) {
86
- if ('timestamp' in input &&
87
- 'duration' in input &&
88
- this.metricType in input) {
89
- const usageInput = this.transformToBoaviztaUsage(input['duration'], input[this.metricType]);
90
- const usage = (await this.fetchData(usageInput));
91
- return usage;
92
- }
93
- else {
94
- throw new Error('Invalid Input: Invalid inputs parameter');
95
- }
96
- }
97
- }
98
- class BoaviztaCpuOutputModel extends BoaviztaOutputModel {
99
- constructor() {
100
- super();
101
- this.sharedParams = undefined;
102
- this.verbose = false;
103
- this.allocation = 'LINEAR';
104
- this.componentType = 'cpu';
105
- this.metricType = 'cpu-util';
106
- this.componentType = 'cpu';
107
- }
108
- modelIdentifier() {
109
- return BOAVIZTA_CPU;
110
- }
111
- async fetchData(usageData) {
112
- if (this.sharedParams === undefined) {
113
- throw new Error('Improper configure: Missing configuration parameters');
114
- }
115
- const dataCast = this.sharedParams;
116
- dataCast['usage'] = usageData;
117
- const response = await axios_1.default.post(`https://api.boavizta.org/v1/component/${this.componentType}?verbose=${this.verbose}&duration=${dataCast['usage']['hours_use_time']}`, dataCast);
118
- const result = this.formatResponse(response.data);
119
- // console.log(
120
- // 'hitting ',
121
- // `https://api.boavizta.org/v1/component/${this.componentType}?verbose=${this.verbose}&duration=${dataCast['usage']['hours_use_time']}`,
122
- // dataCast,
123
- // JSON.stringify(response.data)
124
- // );
125
- return {
126
- 'e-cpu': result.energy,
127
- 'embodied-carbon': result['embodied-carbon'],
128
- };
129
- }
130
- async captureStaticParams(staticParams) {
131
- if ('verbose' in staticParams) {
132
- this.verbose = staticParams.verbose ?? false;
133
- staticParams.verbose = undefined;
134
- }
135
- if (!('physical-processor' in staticParams)) {
136
- throw new Error('Improper configure: Missing processor parameter');
137
- }
138
- if (!('core-units' in staticParams)) {
139
- throw new Error('Improper configure: Missing core-units parameter');
140
- }
141
- if ('expected-lifespan' in staticParams) {
142
- this.expectedLifespan = staticParams['expected-lifespan'];
143
- }
144
- this.sharedParams = Object.assign({}, staticParams);
145
- return this.sharedParams;
146
- }
147
- }
148
- exports.BoaviztaCpuOutputModel = BoaviztaCpuOutputModel;
149
- class BoaviztaCloudOutputModel extends BoaviztaOutputModel {
150
- constructor() {
151
- super(...arguments);
152
- this.sharedParams = undefined;
153
- this.instanceTypes = {};
154
- this.verbose = false;
155
- this.allocation = 'LINEAR';
156
- }
157
- modelIdentifier() {
158
- return BOAVIZTA_CLOUD;
159
- }
160
- async validateLocation(staticParamsCast) {
161
- if ('location' in staticParamsCast) {
162
- const location = staticParamsCast.location ?? 'USA';
163
- const countries = await this.supportedLocations();
164
- if (!countries.includes(location)) {
165
- throw new Error("Improper configure: Invalid location parameter: '" +
166
- location +
167
- "'. Valid values are : " +
168
- countries.join(', '));
169
- }
170
- return staticParamsCast.location;
171
- }
172
- }
173
- async validateInstanceType(staticParamsCast) {
174
- if (!('provider' in staticParamsCast)) {
175
- throw new Error('Improper configure: Missing provider parameter');
176
- }
177
- if (!('instance-type' in staticParamsCast)) {
178
- throw new Error("Improper configure: Missing 'instance-type' parameter");
179
- }
180
- const provider = staticParamsCast.provider;
181
- if (this.instanceTypes[provider] === undefined ||
182
- this.instanceTypes[provider].length === 0) {
183
- this.instanceTypes[provider] = await this.supportedInstancesList(provider);
184
- }
185
- if ('instance-type' in staticParamsCast) {
186
- if (!this.instanceTypes[provider].includes(staticParamsCast['instance-type'])) {
187
- throw new Error(`Improper configure: Invalid 'instance-type' parameter: '${staticParamsCast['instance-type']}'. Valid values are : ${this.instanceTypes[provider].join(', ')}`);
188
- }
189
- }
190
- }
191
- async validateProvider(staticParamsCast) {
192
- if (!('provider' in staticParamsCast)) {
193
- throw new Error('Improper configure: Missing provider parameter');
194
- }
195
- else {
196
- const supportedProviders = await this.supportedProvidersList();
197
- if (!supportedProviders.includes(staticParamsCast.provider)) {
198
- throw new Error("Improper configure: Invalid provider parameter: '" +
199
- staticParamsCast.provider +
200
- "'. Valid values are : " +
201
- supportedProviders.join(', '));
202
- }
203
- }
204
- }
205
- async supportedInstancesList(provider) {
206
- const instances = await axios_1.default.get(`https://api.boavizta.org/v1/cloud/instance/all_instances?provider=${provider}`);
207
- return instances.data;
208
- }
209
- async supportedProvidersList() {
210
- const providers = await axios_1.default.get('https://api.boavizta.org/v1/cloud/instance/all_providers');
211
- return Object.values(providers.data);
212
- }
213
- async fetchData(usageData) {
214
- if (this.sharedParams === undefined) {
215
- throw new Error('Improper configure: Missing configuration parameters');
216
- }
217
- const dataCast = this.sharedParams;
218
- for (const key in dataCast) {
219
- // replace - with _ in keys
220
- if (key.includes('-')) {
221
- const newKey = key.replace(/-/g, '_');
222
- dataCast[newKey] = dataCast[key];
223
- delete dataCast[key];
224
- }
225
- }
226
- dataCast['usage'] = usageData;
227
- const response = await axios_1.default.post(`https://api.boavizta.org/v1/cloud/instance?verbose=${this.verbose}&duration=${dataCast['usage']['hours_use_time']}`, dataCast);
228
- // console.log(
229
- // `https://api.boavizta.org/v1/cloud/instance?verbose=${this.verbose}&duration=${dataCast['usage']['hours_use_time']}`,
230
- // JSON.stringify(response.data),
231
- // dataCast
232
- // );
233
- return this.formatResponse(response.data);
234
- }
235
- async captureStaticParams(staticParams) {
236
- if ('verbose' in staticParams) {
237
- this.verbose = staticParams.verbose ?? false;
238
- staticParams.verbose = undefined;
239
- }
240
- // if no valid provider found, throw error
241
- await this.validateProvider(staticParams);
242
- // if no valid 'instance-type' found, throw error
243
- await this.validateInstanceType(staticParams);
244
- // if no valid location found, throw error
245
- await this.validateLocation(staticParams);
246
- if ('expected-lifespan' in staticParams) {
247
- this.expectedLifespan = staticParams['expected-lifespan'];
248
- }
249
- this.sharedParams = Object.assign({}, staticParams);
250
- return this.sharedParams;
251
- }
252
- }
253
- exports.BoaviztaCloudOutputModel = BoaviztaCloudOutputModel;
254
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2JvYXZpenRhL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlDQUEwQjtBQUcxQix5Q0FBb0M7QUFLcEMsTUFBTSxFQUFDLFNBQVMsRUFBQyxHQUFHLGVBQU0sQ0FBQztBQUMzQixNQUFNLEVBQUMsWUFBWSxFQUFFLGNBQWMsRUFBQyxHQUFHLFNBQVMsQ0FBQztBQUVqRCxNQUFlLG1CQUFtQjtJQUFsQztRQUVFLGlCQUFZLEdBQXVCLFNBQVMsQ0FBQztRQUM3QyxlQUFVLEdBQXlDLFVBQVUsQ0FBQztRQUM5RCxxQkFBZ0IsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBeUg1QyxDQUFDO0lBdEhDLEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBa0I7UUFDbkMsSUFBSSxDQUFDLGVBQWUsR0FBRyxVQUFVLENBQUM7SUFDcEMsQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFTLENBQ2IsSUFBWSxFQUNaLGVBQW1DLFNBQVM7UUFFNUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdkUsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBUUQsMkNBQTJDO0lBQzNDLEtBQUssQ0FBQyxrQkFBa0I7UUFDdEIsTUFBTSxTQUFTLEdBQUcsTUFBTSxlQUFLLENBQUMsR0FBRyxDQUMvQixnREFBZ0QsQ0FDakQsQ0FBQztRQUNGLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELDZFQUE2RTtJQUM3RSx3QkFBd0IsQ0FBQyxRQUFnQixFQUFFLE1BQWM7UUFDdkQsMkNBQTJDO1FBQzNDLG1E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QztZQUMxRCxZQUFZLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztTQUNsQztRQUNELDBDQUEwQztRQUMxQyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxQyxpREFBaUQ7UUFDakQsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDOUMsMENBQTBDO1FBQzFDLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTFDLElBQUksbUJBQW1CLElBQUksWUFBWSxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsbUJBQW1CLENBQVcsQ0FBQztTQUNyRTtRQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFcEQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7Q0FDRjtBQWxKRCw0REFrSkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuXG5pbXBvcnQge0lPdXRwdXRNb2RlbEludGVyZmFjZX0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQge0NPTkZJR30gZnJvbSAnLi4vLi4vY29uZmlnJztcblxuaW1wb3J0IHtCb2F2aXp0YUluc3RhbmNlVHlwZXMsIElCb2F2aXp0YVVzYWdlU0NJfSBmcm9tICcuLi8uLi90eXBlcy9ib2F2aXp0YSc7XG5pbXBvcnQge0tleVZhbHVlUGFpcn0gZnJvbSAnLi4vLi4vdHlwZXMvY29tbW9uJztcblxuY29uc3Qge01PREVMX0lEU30gPSBDT05GSUc7XG5jb25zdCB7Qk9BVklaVEFfQ1BVLCBCT0FWSVpUQV9DTE9VRH0gPSBNT0RFTF9JRFM7XG5cbmFic3RyYWN0IGNsYXNzIEJvYXZpenRhT3V0cHV0TW9kZWwgaW1wbGVtZW50cyBJT3V0cHV0TW9kZWxJbnRlcmZhY2Uge1xuICBuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHNoYXJlZFBhcmFtczogb2JqZWN0IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBtZXRyaWNUeXBlOiAnY3B1LXV0aWwnIHwgJ2dwdS11dGlsJyB8ICdyYW0tdXRpbCcgPSAnY3B1LXV0aWwnO1xuICBleHBlY3RlZExpZmVzcGFuID0gNCAqIDM2NSAqIDI0ICogNjAgKiA2MDtcbiAgcHJvdGVjdGVkIGF1dGhDcmVkZW50aWFsczogb2JqZWN0IHwgdW5kZWZpbmVkO1xuXG4gIGFzeW5jIGF1dGhlbnRpY2F0ZShhdXRoUGFyYW1zOiBvYmplY3QpIHtcbiAgICB0aGlzLmF1dGhDcmVkZW50aWFscyA9IGF1dGhQYXJhbXM7XG4gIH1cblxuICBhc3luYyBjb25maWd1cmUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHN0YXRpY1BhcmFtczogb2JqZWN0IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkXG4gICk6IFByb21pc2U8SU91dHB1dE1vZGVsSW50ZXJmYWNlPiB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnNoYXJlZFBhcmFtcyA9IGF3YWl0IHRoaXMuY2FwdHVyZVN0YXRpY1BhcmFtcyhzdGF0aWNQYXJhbXMgPz8ge30pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy9kZWZpbmVzIHRoZSBtb2RlbCBpZGVudGlmaWVyXG4gIGFic3RyYWN0IG1vZGVsSWRlbnRpZmllcigpOiBzdHJpbmc7XG5cbiAgLy9mZXRjaGVzIGRhdGEgZnJvbSBCb2F2aXp0YSBBUEkgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpYyBlbmRwb2ludCBvZiB0aGUgbW9kZWxcbiAgYWJzdHJhY3QgZmV0Y2hEYXRhKHVzYWdlRGF0YTogb2JqZWN0IHwgdW5kZWZpbmVkKTogUHJvbWlzZTxvYmplY3Q+O1xuXG4gIC8vIGxpc3Qgb2Ygc3VwcG9ydGVkIGxvY2F0aW9ucyBieSB0aGUgbW9kZWxcbiAgYXN5bmMgc3VwcG9ydGVkTG9jYXRpb25zKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBjb3VudHJpZXMgPSBhd2FpdCBheGlvcy5nZXQoXG4gICAgICAnaHR0cHM6Ly9hcGkuYm9hdml6dGEub3JnL3YxL3V0aWxzL2NvdW50cnlfY29kZSdcbiAgICApO1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKGNvdW50cmllcy5kYXRhKTtcbiAgfVxuXG4gIC8vIGNvbnZlcnRzIHRoZSB1c2FnZSBmcm9tIElNUEwgaW5wdXQgdG8gdGhlIGZvcm1hdCByZXF1aXJlZCBieSBCb2F2aXp0YSBBUEkuXG4gIHRyYW5zZm9ybVRvQm9hdml6dGFVc2FnZShkdXJhdGlvbjogbnVtYmVyLCBtZXRyaWM6IG51bWJlcikge1xuICAgIC8vIGR1cmF0aW9uIGlzIGluIHNlY29uZHMsIGNvbnZlcnQgdG8gaG91cnNcbiAgICAvLyBtZXRyaWMgaXMgYmV0d2VlbiAwIGFuZCAxLCBjb252ZXJ0IHRvIHBlcmNlbnRhZ2VcbiAgICBsZXQgdXNhZ2VJbnB1dDogS2V5VmFsdWVQYWlyID0ge1xuICAgICAgaG91cnNfdXNlX3RpbWU6IGR1cmF0aW9uIC8gMzYwMC4wLFxuICAgICAgdGltZV93b3JrbG9hZDogbWV0cmljLFxuICAgIH07XG4gICAgLy8gY29udmVydCBleHBlY3RlZCBsaWZlc3BhbiBmcm9tIHNlY29uZHMgdG8geWVhcnNcbiAgICB1c2FnZUlucHV0Wyd5ZWFyc19saWZlX3RpbWUnXSA9XG4gICAgICB0aGlzLmV4cGVjdGVkTGlmZXNwYW4gLyAoMzY1LjAgKiAyNC4wICogNjAuMCAqIDYwLjApO1xuICAgIHVzYWdlSW5wdXQgPSB0aGlzLmFkZExvY2F0aW9uVG9Vc2FnZSh1c2FnZUlucHV0KTtcblxuICAgIHJldHVybiB1c2FnZUlucHV0O1xuICB9XG5cbiAgLy8gQ2FsY3VsYXRlcyB0aGUgb3V0cHV0IG9mIHRoZSBnaXZlbiB1c2FnZVxuICBhc3luYyBleGVjdXRlKFxuICAgIGlucHV0czogb2JqZWN0IHwgb2JqZWN0W10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcbiAgKTogUHJvbWlzZTxhbnlbXT4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0cykpIHtcbiAgICAgIGNvbnN0IHJlc3VsdHM6IEtleVZhbHVlUGFpcltdID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgaW5wdXQgb2YgaW5wdXRzKSB7XG4gICAgICAgIGNvbnN0IHVzYWdlUmVzdWx0ID0gYXdhaXQgdGhpcy5jYWxjdWxhdGVVc2FnZUZvcmlucHV0KGlucHV0KTtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHVzYWdlUmVzdWx0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1BhcmFtZXRlciBOb3QgR2l2ZW46IGludmFsaWQgaW5wdXRzIHBhcmFtZXRlci4gRXhwZWN0aW5nIGFuIGFycmF5IG9mIGlucHV0cydcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gQWRkcyBsb2NhdGlvbiB0byB1c2FnZSBpZiBsb2NhdGlvbiBpcyBkZWZpbmVkIGluIHNoYXJlZFBhcmFtc1xuICBhZGRMb2NhdGlvblRvVXNhZ2UodXNhZ2VSYXc6IEtleVZhbHVlUGFpcikge1xuICAgIGlmICh0aGlzLnNoYXJlZFBhcmFtcyAhPT0gdW5kZWZpbmVkICYmICdsb2NhdGlvbicgaW4gdGhpcy5zaGFyZWRQYXJhbXMpIHtcbiAgICAgIHVzYWdlUmF3Wyd1c2FnZV9sb2NhdGlvbiddID0gdGhpcy5zaGFyZWRQYXJhbXNbJ2xvY2F0aW9uJ107XG4gICAgfVxuXG4gICAgcmV0dXJuIHVzYWdlUmF3O1xuICB9XG5cbiAgLy9hYnN0cmFjdCBzdWJzIHRvIG1ha2UgY29tcGF0aWJpbGl0eSB3aXRoIGJhc2UgaW50ZXJmYWNlLiBhbGxvd3MgY29uZmlndXJlIHRvIGJlIGRlZmluZWQgaW4gYmFzZSBjbGFzc1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgY2FwdHVyZVN0YXRpY1BhcmFtcyhzdGF0aWNQYXJhbXM6IG9iamVjdCk6IG9iamVjdDtcblxuICAvLyBleHRyYWN0cyBpbmZvcm1hdGlvbiBmcm9tIEJvYXZpenRhIEFQSSByZXNwb25zZSB0byByZXR1cm4gdGhlIG91dHB1dCBpbiB0aGUgZm9ybWF0IHJlcXVpcmVkIGJ5IElNUExcbiAgcHJvdGVjdGVkIGZvcm1hdFJlc3BvbnNlKGRhdGE6IEtleVZhbHVlUGFpcik6IEtleVZhbHVlUGFpciB7XG4gICAgbGV0IG0gPSAwO1xuICAgIGxldCBlID0gMDtcbiAgICBpZiAoJ291dHB1dHMnIGluIGRhdGEpIHtcbiAgICAgIC8vIGVtYm9kaWVkLWNhcmJvbiBvdXRwdXQgaXMgaW4ga2dDTzJlcSwgY29udmVydCB0byBnQ08yZXFcbiAgICAgIG0gPSBkYXRhWydvdXRwdXRzJ11bJ2d3cCddWydlbWJlZGRlZCddWyd2YWx1ZSddICogMTAwMDtcbiAgICAgIC8vIHVzZSBvdXRwdXQgaXMgaW4gSiAsIGNvbnZlcnQgdG8ga1doLlxuICAgICAgLy8gMSwwMDAsMDAwIEogLyAzNjAwID0gMjc3Ljc3Nzc3Nzc3Nzc3NzggV2guXG4gICAgICAvLyAxIE1KIC8gMy42ID0gMC4yNzgga1doXG4gICAgICBlID0gZGF0YVsnb3V0cHV0cyddWydwZSddWyd1c2UnXVsndmFsdWUnXSAvIDMuNjtcbiAgICB9IGVsc2UgaWYgKCdnd3AnIGluIGRhdGEgJiYgJ3BlJyBpbiBkYXRhKSB7XG4gICAgICAvLyBlbWJvZGllZC1jYXJib24gb3V0cHV0IGlzIGluIGtnQ08yZXEsIGNvbnZlcnQgdG8gZ0NPMmVxXG4gICAgICBtID0gZGF0YVsnZ3dwJ11bJ2VtYm9kaWVkLWNhcmJvbiddICogMTAwMDtcbiAgICAgIC8vIHVzZSBvdXRwdXQgaXMgaW4gSiAsIGNvbnZlcnQgdG8ga1doLlxuICAgICAgLy8gMSwwMDAsMDAwIEogLyAzNjAwID0gMjc3Ljc3Nzc3Nzc3Nzc3NzggV2guXG4gICAgICAvLyAxIE1KIC8gMy42ID0gMC4yNzgga1doXG4gICAgICBlID0gZGF0YVsncGUnXVsndXNlJ10gLyAzLjY7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsnZW1ib2RpZWQtY2FyYm9uJzogbSwgZW5lcmd5OiBlfTtcbiAgfVxuXG4gIC8vIGNvbnZlcnRzIHRoZSB1c2FnZSB0byB0aGUgZm9ybWF0IHJlcXVpcmVkIGJ5IEJvYXZpenRhIEFQSS5cbiAgcHJvdGVjdGVkIGFzeW5jIGNhbGN1bGF0ZVVzYWdlRm9yaW5wdXQoXG4gICAgaW5wdXQ6IEtleVZhbHVlUGFpclxuICApOiBQcm9taXNlPEtleVZhbHVlUGFpcj4ge1xuICAgIGlmIChcbiAgICAgICd0aW1lc3RhbXAnIGluIGlucHV0ICYmXG4gICAgICAnZHVyYXRpb24nIGluIGlucHV0ICYmXG4gICAgICB0aGlzLm1ldHJpY1R5cGUgaW4gaW5wdXRcbiAgICApIHtcbiAgICAgIGNvbnN0IHVzYWdlSW5wdXQgPSB0aGlzLnRyYW5zZm9ybVRvQm9hdml6dGFVc2FnZShcbiAgICAgICAgaW5wdXRbJ2R1cmF0aW9uJ10sXG4gICAgICAgIGlucHV0W3RoaXMubWV0cmljVHlwZV1cbiAgICAgICk7XG4gICAgICBjb25zdCB1c2FnZSA9IChhd2FpdCB0aGlzLmZldGNoRGF0YSh1c2FnZUlucHV0KSkgYXMgSUJvYXZpenRhVXNhZ2VTQ0k7XG5cbiAgICAgIHJldHVybiB1c2FnZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIElucHV0OiBJbnZhbGlkIGlucHV0cyBwYXJhbWV0ZXInKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJvYXZpenRhQ3B1T3V0cHV0TW9kZWxcbiAgZXh0ZW5kcyBCb2F2aXp0YU91dHB1dE1vZGVsXG4gIGltcGxlbWVudHMgSU91dHB1dE1vZGVsSW50ZXJmYWNlXG57XG4gIHNoYXJlZFBhcmFtczogb2JqZWN0IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBwdWJsaWMgbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgdmVyYm9zZSA9IGZhbHNlO1xuICBwdWJsaWMgYWxsb2NhdGlvbiA9ICdMSU5FQVInO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbXBvbmVudFR5cGUgPSAnY3B1JztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubWV0cmljVHlwZSA9ICdjcHUtdXRpbCc7XG4gICAgdGhpcy5jb21wb25lbnRUeXBlID0gJ2NwdSc7XG4gIH1cblxuICBtb2RlbElkZW50aWZpZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gQk9BVklaVEFfQ1BVO1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hEYXRhKHVzYWdlRGF0YTogb2JqZWN0IHwgdW5kZWZpbmVkKTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBpZiAodGhpcy5zaGFyZWRQYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbXByb3BlciBjb25maWd1cmU6IE1pc3NpbmcgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YUNhc3QgPSB0aGlzLnNoYXJlZFBhcmFtcyBhcyBLZXlWYWx1ZVBhaXI7XG4gICAgZGF0YUNhc3RbJ3VzYWdlJ10gPSB1c2FnZURhdGE7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLnBvc3QoXG4gICAgICBgaHR0cHM6Ly9hcGkuYm9hdml6dGEub3JnL3YxL2NvbXBvbmVudC8ke3RoaXMuY29tcG9uZW50VHlwZX0/dmVyYm9zZT0ke3RoaXMudmVyYm9zZX0mZHVyYXRpb249JHtkYXRhQ2FzdFsndXNhZ2UnXVsnaG91cnNfdXNlX3RpbWUnXX1gLFxuICAgICAgZGF0YUNhc3RcbiAgICApO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5mb3JtYXRSZXNwb25zZShyZXNwb25zZS5kYXRhKTtcblxuICAgIC8vIGNvbnNvbGUubG9nKFxuICAgIC8vICAgJ2hpdHRpbmcgJyxcbiAgICAvLyAgIGBodHRwczovL2FwaS5ib2F2aXp0YS5vcmcvdjEvY29tcG9uZW50LyR7dGhpcy5jb21wb25lbnRUeXBlfT92ZXJib3NlPSR7dGhpcy52ZXJib3NlfSZkdXJhdGlvbj0ke2RhdGFDYXN0Wyd1c2FnZSddWydob3Vyc191c2VfdGltZSddfWAsXG4gICAgLy8gICBkYXRhQ2FzdCxcbiAgICAvLyAgIEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlLmRhdGEpXG4gICAgLy8gKTtcbiAgICByZXR1cm4ge1xuICAgICAgJ2UtY3B1JzogcmVzdWx0LmVuZXJneSxcbiAgICAgICdlbWJvZGllZC1jYXJib24nOiByZXN1bHRbJ2VtYm9kaWVkLWNhcmJvbiddLFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY2FwdHVyZVN0YXRpY1BhcmFtcyhzdGF0aWNQYXJhbXM6IG9iamVjdCk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgaWYgKCd2ZXJib3NlJyBpbiBzdGF0aWNQYXJhbXMpIHtcbiAgICAgIHRoaXMudmVyYm9zZSA9IChzdGF0aWNQYXJhbXMudmVyYm9zZSBhcyBib29sZWFuKSA/PyBmYWxzZTtcbiAgICAgIHN0YXRpY1BhcmFtcy52ZXJib3NlID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICghKCdwaHlzaWNhbC1wcm9jZXNzb3InIGluIHN0YXRpY1BhcmFtcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW1wcm9wZXIgY29uZmlndXJlOiBNaXNzaW5nIHByb2Nlc3NvciBwYXJhbWV0ZXInKTtcbiAgICB9XG5cbiAgICBpZiAoISgnY29yZS11bml0cycgaW4gc3RhdGljUGFyYW1zKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbXByb3BlciBjb25maWd1cmU6IE1pc3NpbmcgY29yZS11bml0cyBwYXJhbWV0ZXInKTtcbiAgICB9XG5cbiAgICBpZiAoJ2V4cGVjdGVkLWxpZmVzcGFuJyBpbiBzdGF0aWNQYXJhbXMpIHtcbiAgICAgIHRoaXMuZXhwZWN0ZWRMaWZlc3BhbiA9IHN0YXRpY1BhcmFtc1snZXhwZWN0ZWQtbGlmZXNwYW4nXSBhcyBudW1iZXI7XG4gICAgfVxuICAgIHRoaXMuc2hhcmVkUGFyYW1zID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGljUGFyYW1zKTtcblxuICAgIHJldHVybiB0aGlzLnNoYXJlZFBhcmFtcztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQm9hdml6dGFDbG91ZE91dHB1dE1vZGVsXG4gIGV4dGVuZHMgQm9hdml6dGFPdXRwdXRNb2RlbFxuICBpbXBsZW1lbnRzIElPdXRwdXRNb2RlbEludGVyZmFjZVxue1xuICBwdWJsaWMgc2hhcmVkUGFyYW1zOiBvYmplY3QgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIHB1YmxpYyBpbnN0YW5jZVR5cGVzOiBCb2F2aXp0YUluc3RhbmNlVHlwZXMgPSB7fTtcbiAgcHVibGljIG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHVibGljIHZlcmJvc2UgPSBmYWxzZTtcbiAgcHVibGljIGFsbG9jYXRpb24gPSAnTElORUFSJztcblxuICBtb2RlbElkZW50aWZpZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gQk9BVklaVEFfQ0xPVUQ7XG4gIH1cblxuICBhc3luYyB2YWxpZGF0ZUxvY2F0aW9uKHN0YXRpY1BhcmFtc0Nhc3Q6IG9iamVjdCk6IFByb21pc2U8c3RyaW5nIHwgdm9pZD4ge1xuICAgIGlmICgnbG9jYXRpb24nIGluIHN0YXRpY1BhcmFtc0Nhc3QpIHtcbiAgICAgIGNvbnN0IGxvY2F0aW9uID0gKHN0YXRpY1BhcmFtc0Nhc3QubG9jYXRpb24gYXMgc3RyaW5nKSA/PyAnVVNBJztcbiAgICAgIGNvbnN0IGNvdW50cmllcyA9IGF3YWl0IHRoaXMuc3VwcG9ydGVkTG9jYXRpb25zKCk7XG4gICAgICBpZiAoIWNvdW50cmllcy5pbmNsdWRlcyhsb2NhdGlvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiSW1wcm9wZXIgY29uZmlndXJlOiBJbnZhbGlkIGxvY2F0aW9uIHBhcmFtZXRlcjogJ1wiICtcbiAgICAgICAgICAgIGxvY2F0aW9uICtcbiAgICAgICAgICAgIFwiJy4gVmFsaWQgdmFsdWVzIGFyZSA6IFwiICtcbiAgICAgICAgICAgIGNvdW50cmllcy5qb2luKCcsICcpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RhdGljUGFyYW1zQ2FzdC5sb2NhdGlvbiBhcyBzdHJpbmc7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdmFsaWRhdGVJbnN0YW5jZVR5cGUoc3RhdGljUGFyYW1zQ2FzdDogb2JqZWN0KSB7XG4gICAgaWYgKCEoJ3Byb3ZpZGVyJyBpbiBzdGF0aWNQYXJhbXNDYXN0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbXByb3BlciBjb25maWd1cmU6IE1pc3NpbmcgcHJvdmlkZXIgcGFyYW1ldGVyJyk7XG4gICAgfVxuXG4gICAgaWYgKCEoJ2luc3RhbmNlLXR5cGUnIGluIHN0YXRpY1BhcmFtc0Nhc3QpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbXByb3BlciBjb25maWd1cmU6IE1pc3NpbmcgJ2luc3RhbmNlLXR5cGUnIHBhcmFtZXRlclwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm92aWRlciA9IHN0YXRpY1BhcmFtc0Nhc3QucHJvdmlkZXIgYXMgc3RyaW5nO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5pbnN0YW5jZVR5cGVzW3Byb3ZpZGVyXSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLmluc3RhbmNlVHlwZXNbcHJvdmlkZXJdLmxlbmd0aCA9PT0gMFxuICAgICkge1xuICAgICAgdGhpcy5pbnN0YW5jZVR5cGVzW3Byb3ZpZGVyXSA9IGF3YWl0IHRoaXMuc3VwcG9ydGVkSW5zdGFuY2VzTGlzdChcbiAgICAgICAgcHJvdmlkZXJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCdpbnN0YW5jZS10eXBlJyBpbiBzdGF0aWNQYXJhbXNDYXN0KSB7XG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLmluc3RhbmNlVHlwZXNbcHJvdmlkZXJdLmluY2x1ZGVzKFxuICAgICAgICAgIHN0YXRpY1BhcmFtc0Nhc3RbJ2luc3RhbmNlLXR5cGUnXSBhcyBzdHJpbmdcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW1wcm9wZXIgY29uZmlndXJlOiBJbnZhbGlkICdpbnN0YW5jZS10eXBlJyBwYXJhbWV0ZXI6ICcke1xuICAgICAgICAgICAgc3RhdGljUGFyYW1zQ2FzdFsnaW5zdGFuY2UtdHlwZSddXG4gICAgICAgICAgfScuIFZhbGlkIHZhbHVlcyBhcmUgOiAke3RoaXMuaW5zdGFuY2VUeXBlc1twcm92aWRlcl0uam9pbignLCAnKX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdmFsaWRhdGVQcm92aWRlcihzdGF0aWNQYXJhbXNDYXN0OiBvYmplY3QpIHtcbiAgICBpZiAoISgncHJvdmlkZXInIGluIHN0YXRpY1BhcmFtc0Nhc3QpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ltcHJvcGVyIGNvbmZpZ3VyZTogTWlzc2luZyBwcm92aWRlciBwYXJhbWV0ZXInKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3VwcG9ydGVkUHJvdmlkZXJzID0gYXdhaXQgdGhpcy5zdXBwb3J0ZWRQcm92aWRlcnNMaXN0KCk7XG5cbiAgICAgIGlmICghc3VwcG9ydGVkUHJvdmlkZXJzLmluY2x1ZGVzKHN0YXRpY1BhcmFtc0Nhc3QucHJvdmlkZXIgYXMgc3RyaW5nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJJbXByb3BlciBjb25maWd1cmU6IEludmFsaWQgcHJvdmlkZXIgcGFyYW1ldGVyOiAnXCIgK1xuICAgICAgICAgICAgc3RhdGljUGFyYW1zQ2FzdC5wcm92aWRlciArXG4gICAgICAgICAgICBcIicuIFZhbGlkIHZhbHVlcyBhcmUgOiBcIiArXG4gICAgICAgICAgICBzdXBwb3J0ZWRQcm92aWRlcnMuam9pbignLCAnKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN1cHBvcnRlZEluc3RhbmNlc0xpc3QocHJvdmlkZXI6IHN0cmluZykge1xuICAgIGNvbnN0IGluc3RhbmNlcyA9IGF3YWl0IGF4aW9zLmdldChcbiAgICAgIGBodHRwczovL2FwaS5ib2F2aXp0YS5vcmcvdjEvY2xvdWQvaW5zdGFuY2UvYWxsX2luc3RhbmNlcz9wcm92aWRlcj0ke3Byb3ZpZGVyfWBcbiAgICApO1xuXG4gICAgcmV0dXJuIGluc3RhbmNlcy5kYXRhO1xuICB9XG5cbiAgYXN5bmMgc3VwcG9ydGVkUHJvdmlkZXJzTGlzdCgpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgcHJvdmlkZXJzID0gYXdhaXQgYXhpb3MuZ2V0KFxuICAgICAgJ2h0dHBzOi8vYXBpLmJvYXZpenRhLm9yZy92MS9jbG91ZC9pbnN0YW5jZS9hbGxfcHJvdmlkZXJzJ1xuICAgICk7XG5cbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhwcm92aWRlcnMuZGF0YSk7XG4gIH1cblxuICBhc3luYyBmZXRjaERhdGEodXNhZ2VEYXRhOiBvYmplY3QgfCB1bmRlZmluZWQpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGlmICh0aGlzLnNoYXJlZFBhcmFtcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ltcHJvcGVyIGNvbmZpZ3VyZTogTWlzc2luZyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhQ2FzdCA9IHRoaXMuc2hhcmVkUGFyYW1zIGFzIEtleVZhbHVlUGFpcjtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhQ2FzdCkge1xuICAgICAgLy8gICByZXBsYWNlIC0gd2l0aCBfIGluIGtleXNcbiAgICAgIGlmIChrZXkuaW5jbHVkZXMoJy0nKSkge1xuICAgICAgICBjb25zdCBuZXdLZXkgPSBrZXkucmVwbGFjZSgvLS9nLCAnXycpO1xuICAgICAgICBkYXRhQ2FzdFtuZXdLZXldID0gZGF0YUNhc3Rba2V5XTtcbiAgICAgICAgZGVsZXRlIGRhdGFDYXN0W2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIGRhdGFDYXN0Wyd1c2FnZSddID0gdXNhZ2VEYXRhO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3MucG9zdChcbiAgICAgIGBodHRwczovL2FwaS5ib2F2aXp0YS5vcmcvdjEvY2xvdWQvaW5zdGFuY2U/dmVyYm9zZT0ke3RoaXMudmVyYm9zZX0mZHVyYXRpb249JHtkYXRhQ2FzdFsndXNhZ2UnXVsnaG91cnNfdXNlX3RpbWUnXX1gLFxuICAgICAgZGF0YUNhc3RcbiAgICApO1xuICAgIC8vIGNvbnNvbGUubG9nKFxuICAgIC8vICAgYGh0dHBzOi8vYXBpLmJvYXZpenRhLm9yZy92MS9jbG91ZC9pbnN0YW5jZT92ZXJib3NlPSR7dGhpcy52ZXJib3NlfSZkdXJhdGlvbj0ke2RhdGFDYXN0Wyd1c2FnZSddWydob3Vyc191c2VfdGltZSddfWAsXG4gICAgLy8gICBKU09OLnN0cmluZ2lmeShyZXNwb25zZS5kYXRhKSxcbiAgICAvLyAgIGRhdGFDYXN0XG4gICAgLy8gKTtcblxuICAgIHJldHVybiB0aGlzLmZvcm1hdFJlc3BvbnNlKHJlc3BvbnNlLmRhdGEpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGNhcHR1cmVTdGF0aWNQYXJhbXMoc3RhdGljUGFyYW1zOiBvYmplY3QpIHtcbiAgICBpZiAoJ3ZlcmJvc2UnIGluIHN0YXRpY1BhcmFtcykge1xuICAgICAgdGhpcy52ZXJib3NlID0gKHN0YXRpY1BhcmFtcy52ZXJib3NlIGFzIGJvb2xlYW4pID8/IGZhbHNlO1xuICAgICAgc3RhdGljUGFyYW1zLnZlcmJvc2UgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8vIGlmIG5vIHZhbGlkIHByb3ZpZGVyIGZvdW5kLCB0aHJvdyBlcnJvclxuICAgIGF3YWl0IHRoaXMudmFsaWRhdGVQcm92aWRlcihzdGF0aWNQYXJhbXMpO1xuICAgIC8vIGlmIG5vIHZhbGlkICdpbnN0YW5jZS10eXBlJyBmb3VuZCwgdGhyb3cgZXJyb3JcbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlSW5zdGFuY2VUeXBlKHN0YXRpY1BhcmFtcyk7XG4gICAgLy8gaWYgbm8gdmFsaWQgbG9jYXRpb24gZm91bmQsIHRocm93IGVycm9yXG4gICAgYXdhaXQgdGhpcy52YWxpZGF0ZUxvY2F0aW9uKHN0YXRpY1BhcmFtcyk7XG5cbiAgICBpZiAoJ2V4cGVjdGVkLWxpZmVzcGFuJyBpbiBzdGF0aWNQYXJhbXMpIHtcbiAgICAgIHRoaXMuZXhwZWN0ZWRMaWZlc3BhbiA9IHN0YXRpY1BhcmFtc1snZXhwZWN0ZWQtbGlmZXNwYW4nXSBhcyBudW1iZXI7XG4gICAgfVxuXG4gICAgdGhpcy5zaGFyZWRQYXJhbXMgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0aWNQYXJhbXMpO1xuXG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkUGFyYW1zO1xuICB9XG59XG5cbi8qKlxuICogRm9yIEpTSUkuXG4gKi9cbmV4cG9ydCB7SU91dHB1dE1vZGVsSW50ZXJmYWNlfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmV4cG9ydCB7Qm9hdml6dGFJbnN0YW5jZVR5cGVzLCBJQm9hdml6dGFVc2FnZVNDSX0gZnJvbSAnLi4vLi4vdHlwZXMvYm9hdml6dGEnO1xuZXhwb3J0IHtLZXlWYWx1ZVBhaXJ9IGZyb20gJy4uLy4uL3R5cGVzL2NvbW1vbic7XG4iXX0=
@@ -1,29 +0,0 @@
1
- import { IOutputModelInterface } from '../interfaces';
2
- export declare class EAvevaModel implements IOutputModelInterface {
3
- authParams: object | undefined;
4
- name: string | undefined;
5
- staticParams: object | undefined;
6
- /**
7
- * Defined for compatibility. Not used here.
8
- */
9
- authenticate(authParams: object): void;
10
- /**
11
- * Configures the Aveva Plugin for IEF
12
- * @param {string} name name of the resource
13
- * @param {Object} staticParams static parameters for the resource
14
- */
15
- configure(name: string, staticParams?: object | undefined): Promise<IOutputModelInterface>;
16
- /**
17
- * Calculate the total emissions for a list of inputs.
18
- * Each input require:
19
- * @param {Object[]} inputs
20
- * @param {number} inputs[].time time to normalize to in hours
21
- * @param {number} inputs[].pb baseline power
22
- * @param {number} inputs[].pl measured power
23
- */
24
- execute(inputs: object | object[] | undefined): Promise<any[]>;
25
- /**
26
- * Returns model identifier
27
- */
28
- modelIdentifier(): string;
29
- }
@@ -1,53 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EAvevaModel = void 0;
4
- const config_1 = require("../../config");
5
- const { MODEL_IDS } = config_1.CONFIG;
6
- const { AVEVA } = MODEL_IDS;
7
- class EAvevaModel {
8
- /**
9
- * Defined for compatibility. Not used here.
10
- */
11
- authenticate(authParams) {
12
- this.authParams = authParams;
13
- }
14
- /**
15
- * Configures the Aveva Plugin for IEF
16
- * @param {string} name name of the resource
17
- * @param {Object} staticParams static parameters for the resource
18
- */
19
- async configure(name, staticParams = undefined) {
20
- this.name = name;
21
- this.staticParams = staticParams;
22
- return this;
23
- }
24
- /**
25
- * Calculate the total emissions for a list of inputs.
26
- * Each input require:
27
- * @param {Object[]} inputs
28
- * @param {number} inputs[].time time to normalize to in hours
29
- * @param {number} inputs[].pb baseline power
30
- * @param {number} inputs[].pl measured power
31
- */
32
- async execute(inputs) {
33
- if (inputs === undefined) {
34
- throw new Error('Required Parameters not provided');
35
- }
36
- else if (!Array.isArray(inputs)) {
37
- throw new Error('inputs must be an array');
38
- }
39
- return inputs.map(input => {
40
- input['energy-cpu'] =
41
- ((input['pl'] - input['pb']) * input['time']) / 1000;
42
- return input;
43
- });
44
- }
45
- /**
46
- * Returns model identifier
47
- */
48
- modelIdentifier() {
49
- return AVEVA;
50
- }
51
- }
52
- exports.EAvevaModel = EAvevaModel;
53
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZldmEtbW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2Nhc2Utc3R1ZGllcy9hdmV2YS1tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSx5Q0FBb0M7QUFFcEMsTUFBTSxFQUFDLFNBQVMsRUFBQyxHQUFHLGVBQU0sQ0FBQztBQUMzQixNQUFNLEVBQUMsS0FBSyxFQUFDLEdBQUcsU0FBUyxDQUFDO0FBRTFCLE1BQWEsV0FBVztJQUt0Qjs7T0FFRztJQUNILFlBQVksQ0FBQyxVQUFrQjtRQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQ2IsSUFBWSxFQUNaLGVBQW1DLFNBQVM7UUFFNUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFFakMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBcUM7UUFDakQsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztTQUNyRDthQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztTQUM1QztRQUVELE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN4QixLQUFLLENBQUMsWUFBWSxDQUFDO2dCQUNqQixDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztZQUV2RCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZTtRQUNiLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGO0FBeERELGtDQXdEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SU91dHB1dE1vZGVsSW50ZXJmYWNlfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcblxuaW1wb3J0IHtDT05GSUd9IGZyb20gJy4uLy4uL2NvbmZpZyc7XG5cbmNvbnN0IHtNT0RFTF9JRFN9ID0gQ09ORklHO1xuY29uc3Qge0FWRVZBfSA9IE1PREVMX0lEUztcblxuZXhwb3J0IGNsYXNzIEVBdmV2YU1vZGVsIGltcGxlbWVudHMgSU91dHB1dE1vZGVsSW50ZXJmYWNlIHtcbiAgYXV0aFBhcmFtczogb2JqZWN0IHwgdW5kZWZpbmVkOyAvLyBEZWZpbmVkIGZvciBjb21wYXRpYmlsaXR5LiBOb3QgdXNlZCBpbiBBdmV2YS5cbiAgbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkOyAvLyBuYW1lIG9mIHRoZSBkYXRhIHNvdXJjZVxuICBzdGF0aWNQYXJhbXM6IG9iamVjdCB8IHVuZGVmaW5lZDsgLy8gRGVmaW5lZCBmb3IgY29tcGF0aWJpbGl0eS4gTm90IHVzZWQgaW4gQXZldmEuXG5cbiAgLyoqXG4gICAqIERlZmluZWQgZm9yIGNvbXBhdGliaWxpdHkuIE5vdCB1c2VkIGhlcmUuXG4gICAqL1xuICBhdXRoZW50aWNhdGUoYXV0aFBhcmFtczogb2JqZWN0KTogdm9pZCB7XG4gICAgdGhpcy5hdXRoUGFyYW1zID0gYXV0aFBhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmVzIHRoZSBBdmV2YSBQbHVnaW4gZm9yIElFRlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBuYW1lIG9mIHRoZSByZXNvdXJjZVxuICAgKiBAcGFyYW0ge09iamVjdH0gc3RhdGljUGFyYW1zIHN0YXRpYyBwYXJhbWV0ZXJzIGZvciB0aGUgcmVzb3VyY2VcbiAgICovXG4gIGFzeW5jIGNvbmZpZ3VyZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgc3RhdGljUGFyYW1zOiBvYmplY3QgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcbiAgKTogUHJvbWlzZTxJT3V0cHV0TW9kZWxJbnRlcmZhY2U+IHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuc3RhdGljUGFyYW1zID0gc3RhdGljUGFyYW1zO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHRoZSB0b3RhbCBlbWlzc2lvbnMgZm9yIGEgbGlzdCBvZiBpbnB1dHMuXG4gICAqIEVhY2ggaW5wdXQgcmVxdWlyZTpcbiAgICogQHBhcmFtIHtPYmplY3RbXX0gaW5wdXRzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbnB1dHNbXS50aW1lIHRpbWUgdG8gbm9ybWFsaXplIHRvIGluIGhvdXJzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbnB1dHNbXS5wYiBiYXNlbGluZSBwb3dlclxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5wdXRzW10ucGwgbWVhc3VyZWQgcG93ZXJcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUoaW5wdXRzOiBvYmplY3QgfCBvYmplY3RbXSB8IHVuZGVmaW5lZCk6IFByb21pc2U8YW55W10+IHtcbiAgICBpZiAoaW5wdXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgUGFyYW1ldGVycyBub3QgcHJvdmlkZWQnKTtcbiAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW5wdXRzIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5wdXRzLm1hcChpbnB1dCA9PiB7XG4gICAgICBpbnB1dFsnZW5lcmd5LWNwdSddID1cbiAgICAgICAgKChpbnB1dFsncGwnXSAtIGlucHV0WydwYiddKSAqIGlucHV0Wyd0aW1lJ10pIC8gMTAwMDtcblxuICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgbW9kZWwgaWRlbnRpZmllclxuICAgKi9cbiAgbW9kZWxJZGVudGlmaWVyKCkge1xuICAgIHJldHVybiBBVkVWQTtcbiAgfVxufVxuIl19
@@ -1,42 +0,0 @@
1
- import { IOutputModelInterface } from '../interfaces';
2
- export declare class EMemModel implements IOutputModelInterface {
3
- authParams: object | undefined;
4
- name: string | undefined;
5
- memoryAllocation: number;
6
- memoryEnergy: number;
7
- /**
8
- * Defined for compatibility. Not used.
9
- */
10
- authenticate(authParams: object): void;
11
- /**
12
- * Configures the Plugin for IEF
13
- * @param {string} name name of the resource
14
- * @param {Object} staticParams static parameters for the resource
15
- * @param {number} staticParams.thermal-design-power Thermal Design Power in Watts
16
- * @param {Interpolation} staticParams.interpolation Interpolation method
17
- */
18
- configure(name: string, staticParams?: object | undefined): Promise<IOutputModelInterface>;
19
- /**
20
- * Calculate the total emissions for a list of inputs.
21
- *
22
- * Each input require:
23
- * @param {Object[]} inputs
24
- * @param {string} inputs[].timestamp RFC3339 timestamp string
25
- * @param {number} inputs[].mem-util percentage mem usage
26
- */
27
- execute(inputs: object | object[] | undefined): Promise<any[]>;
28
- /**
29
- * Returns model identifier
30
- */
31
- modelIdentifier(): string;
32
- /**
33
- * Calculates the energy consumption for a single input
34
- * requires
35
- *
36
- * mem-util: ram usage in percentage
37
- * timestamp: RFC3339 timestamp string
38
- *
39
- * multiplies memory used (GB) by a coefficient (wh/GB) and converts to kwh
40
- */
41
- private calculateEnergy;
42
- }
@@ -1,93 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EMemModel = void 0;
4
- const config_1 = require("../../config");
5
- const { MODEL_IDS } = config_1.CONFIG;
6
- const { EMEM } = MODEL_IDS;
7
- class EMemModel {
8
- constructor() {
9
- this.memoryAllocation = 0;
10
- this.memoryEnergy = 0;
11
- }
12
- /**
13
- * Defined for compatibility. Not used.
14
- */
15
- authenticate(authParams) {
16
- this.authParams = authParams;
17
- }
18
- /**
19
- * Configures the Plugin for IEF
20
- * @param {string} name name of the resource
21
- * @param {Object} staticParams static parameters for the resource
22
- * @param {number} staticParams.thermal-design-power Thermal Design Power in Watts
23
- * @param {Interpolation} staticParams.interpolation Interpolation method
24
- */
25
- async configure(name, staticParams = undefined) {
26
- this.name = name;
27
- if (staticParams === undefined) {
28
- throw new Error('Required Parameters not provided');
29
- }
30
- if ('mem-alloc' in staticParams) {
31
- this.memoryAllocation = staticParams['mem-alloc'];
32
- }
33
- if ('mem-energy' in staticParams) {
34
- this.memoryEnergy = staticParams['mem-energy'];
35
- }
36
- return this;
37
- }
38
- /**
39
- * Calculate the total emissions for a list of inputs.
40
- *
41
- * Each input require:
42
- * @param {Object[]} inputs
43
- * @param {string} inputs[].timestamp RFC3339 timestamp string
44
- * @param {number} inputs[].mem-util percentage mem usage
45
- */
46
- async execute(inputs) {
47
- if (inputs === undefined) {
48
- throw new Error('Required Parameters not provided');
49
- }
50
- else if (!Array.isArray(inputs)) {
51
- throw new Error('inputs must be an array');
52
- }
53
- return inputs.map((input) => {
54
- this.configure(this.name, input);
55
- input['energy-memory'] = this.calculateEnergy(input);
56
- return input;
57
- });
58
- }
59
- /**
60
- * Returns model identifier
61
- */
62
- modelIdentifier() {
63
- return EMEM;
64
- }
65
- /**
66
- * Calculates the energy consumption for a single input
67
- * requires
68
- *
69
- * mem-util: ram usage in percentage
70
- * timestamp: RFC3339 timestamp string
71
- *
72
- * multiplies memory used (GB) by a coefficient (wh/GB) and converts to kwh
73
- */
74
- calculateEnergy(input) {
75
- if (!('mem-util' in input) || !('timestamp' in input)) {
76
- throw new Error('Required Parameters duration,cpu-util,timestamp not provided for input');
77
- }
78
- if (this.memoryAllocation === 0) {
79
- throw new Error('Required Parameter: mem-alloc not provided in configure');
80
- }
81
- if (this.memoryEnergy === 0) {
82
- throw new Error('Required Parameter: mem-energy not provided in configure');
83
- }
84
- const mem_alloc = this.memoryAllocation;
85
- const mem_util = input['mem-util']; // convert cpu usage to percentage
86
- if (mem_util < 0 || mem_util > 100) {
87
- throw new Error('cpu usage must be between 0 and 100');
88
- }
89
- return (mem_alloc * (mem_util / 100) * this.memoryEnergy) / 1000;
90
- }
91
- }
92
- exports.EMemModel = EMemModel;
93
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1lbS1tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvY2FzZS1zdHVkaWVzL2VtZW0tbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEseUNBQW9DO0FBSXBDLE1BQU0sRUFBQyxTQUFTLEVBQUMsR0FBRyxlQUFNLENBQUM7QUFDM0IsTUFBTSxFQUFDLElBQUksRUFBQyxHQUFHLFNBQVMsQ0FBQztBQUV6QixNQUFhLFNBQVM7SUFBdEI7UUFHRSxxQkFBZ0IsR0FBRyxDQUFDLENBQUM7UUFDckIsaUJBQVksR0FBRyxDQUFDLENBQUM7SUF3R25CLENBQUM7SUF0R0M7O09BRUc7SUFDSCxZQUFZLENBQUMsVUFBa0I7UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQ2IsSUFBWSxFQUNaLGVBQW1DLFNBQVM7UUFFNUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFFakIsSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFO1lBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztTQUNyRDtRQUVELElBQUksV0FBVyxJQUFJLFlBQVksRUFBRTtZQUMvQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBVyxDQUFDO1NBQzdEO1FBRUQsSUFBSSxZQUFZLElBQUksWUFBWSxFQUFFO1lBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBVyxDQUFDO1NBQzFEO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBcUM7UUFDakQsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztTQUNyRDthQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztTQUM1QztRQUVELE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQW1CLEVBQUUsRUFBRTtZQUN4QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbEMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFckQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLGVBQWUsQ0FBQyxLQUFtQjtRQUN6QyxJQUFJLENBQUMsQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsRUFBRTtZQUNyRCxNQUFNLElBQUksS0FBSyxDQUNiLHdFQUF3RSxDQUN6RSxDQUFDO1NBQ0g7UUFFRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxDQUFDLEVBQUU7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FDYix5REFBeUQsQ0FDMUQsQ0FBQztTQUNIO1FBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLENBQUMsRUFBRTtZQUMzQixNQUFNLElBQUksS0FBSyxDQUNiLDBEQUEwRCxDQUMzRCxDQUFDO1NBQ0g7UUFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDeEMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0NBQWtDO1FBRXRFLElBQUksUUFBUSxHQUFHLENBQUMsSUFBSSxRQUFRLEdBQUcsR0FBRyxFQUFFO1lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztTQUN4RDtRQUVELE9BQU8sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNuRSxDQUFDO0NBQ0Y7QUE1R0QsOEJBNEdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJT3V0cHV0TW9kZWxJbnRlcmZhY2V9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuXG5pbXBvcnQge0NPTkZJR30gZnJvbSAnLi4vLi4vY29uZmlnJztcblxuaW1wb3J0IHtLZXlWYWx1ZVBhaXJ9IGZyb20gJy4uLy4uL3R5cGVzL2NvbW1vbic7XG5cbmNvbnN0IHtNT0RFTF9JRFN9ID0gQ09ORklHO1xuY29uc3Qge0VNRU19ID0gTU9ERUxfSURTO1xuXG5leHBvcnQgY2xhc3MgRU1lbU1vZGVsIGltcGxlbWVudHMgSU91dHB1dE1vZGVsSW50ZXJmYWNlIHtcbiAgYXV0aFBhcmFtczogb2JqZWN0IHwgdW5kZWZpbmVkOyAvLyBEZWZpbmVkIGZvciBjb21wYXRpYmlsaXR5LiBOb3QgdXNlZCBpbiB0aGlzLlxuICBuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7IC8vIG5hbWUgb2YgdGhlIGRhdGEgc291cmNlXG4gIG1lbW9yeUFsbG9jYXRpb24gPSAwO1xuICBtZW1vcnlFbmVyZ3kgPSAwO1xuXG4gIC8qKlxuICAgKiBEZWZpbmVkIGZvciBjb21wYXRpYmlsaXR5LiBOb3QgdXNlZC5cbiAgICovXG4gIGF1dGhlbnRpY2F0ZShhdXRoUGFyYW1zOiBvYmplY3QpOiB2b2lkIHtcbiAgICB0aGlzLmF1dGhQYXJhbXMgPSBhdXRoUGFyYW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZXMgdGhlIFBsdWdpbiBmb3IgSUVGXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIG5hbWUgb2YgdGhlIHJlc291cmNlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0aWNQYXJhbXMgc3RhdGljIHBhcmFtZXRlcnMgZm9yIHRoZSByZXNvdXJjZVxuICAgKiBAcGFyYW0ge251bWJlcn0gc3RhdGljUGFyYW1zLnRoZXJtYWwtZGVzaWduLXBvd2VyIFRoZXJtYWwgRGVzaWduIFBvd2VyIGluIFdhdHRzXG4gICAqIEBwYXJhbSB7SW50ZXJwb2xhdGlvbn0gc3RhdGljUGFyYW1zLmludGVycG9sYXRpb24gSW50ZXJwb2xhdGlvbiBtZXRob2RcbiAgICovXG4gIGFzeW5jIGNvbmZpZ3VyZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgc3RhdGljUGFyYW1zOiBvYmplY3QgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcbiAgKTogUHJvbWlzZTxJT3V0cHV0TW9kZWxJbnRlcmZhY2U+IHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuXG4gICAgaWYgKHN0YXRpY1BhcmFtcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIFBhcmFtZXRlcnMgbm90IHByb3ZpZGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKCdtZW0tYWxsb2MnIGluIHN0YXRpY1BhcmFtcykge1xuICAgICAgdGhpcy5tZW1vcnlBbGxvY2F0aW9uID0gc3RhdGljUGFyYW1zWydtZW0tYWxsb2MnXSBhcyBudW1iZXI7XG4gICAgfVxuXG4gICAgaWYgKCdtZW0tZW5lcmd5JyBpbiBzdGF0aWNQYXJhbXMpIHtcbiAgICAgIHRoaXMubWVtb3J5RW5lcmd5ID0gc3RhdGljUGFyYW1zWydtZW0tZW5lcmd5J10gYXMgbnVtYmVyO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0aGUgdG90YWwgZW1pc3Npb25zIGZvciBhIGxpc3Qgb2YgaW5wdXRzLlxuICAgKlxuICAgKiBFYWNoIGlucHV0IHJlcXVpcmU6XG4gICAqIEBwYXJhbSB7T2JqZWN0W119IGlucHV0c1xuICAgKiBAcGFyYW0ge3N0cmluZ30gaW5wdXRzW10udGltZXN0YW1wIFJGQzMzMzkgdGltZXN0YW1wIHN0cmluZ1xuICAgKiBAcGFyYW0ge251bWJlcn0gaW5wdXRzW10ubWVtLXV0aWwgcGVyY2VudGFnZSBtZW0gdXNhZ2VcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUoaW5wdXRzOiBvYmplY3QgfCBvYmplY3RbXSB8IHVuZGVmaW5lZCk6IFByb21pc2U8YW55W10+IHtcbiAgICBpZiAoaW5wdXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgUGFyYW1ldGVycyBub3QgcHJvdmlkZWQnKTtcbiAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW5wdXRzIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5wdXRzLm1hcCgoaW5wdXQ6IEtleVZhbHVlUGFpcikgPT4ge1xuICAgICAgdGhpcy5jb25maWd1cmUodGhpcy5uYW1lISwgaW5wdXQpO1xuICAgICAgaW5wdXRbJ2VuZXJneS1tZW1vcnknXSA9IHRoaXMuY2FsY3VsYXRlRW5lcmd5KGlucHV0KTtcblxuICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgbW9kZWwgaWRlbnRpZmllclxuICAgKi9cbiAgbW9kZWxJZGVudGlmaWVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEVNRU07XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgZW5lcmd5IGNvbnN1bXB0aW9uIGZvciBhIHNpbmdsZSBpbnB1dFxuICAgKiByZXF1aXJlc1xuICAgKlxuICAgKiBtZW0tdXRpbDogcmFtIHVzYWdlIGluIHBlcmNlbnRhZ2VcbiAgICogdGltZXN0YW1wOiBSRkMzMzM5IHRpbWVzdGFtcCBzdHJpbmdcbiAgICpcbiAgICogbXVsdGlwbGllcyBtZW1vcnkgdXNlZCAoR0IpIGJ5IGEgY29lZmZpY2llbnQgKHdoL0dCKSBhbmQgY29udmVydHMgdG8ga3doXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZUVuZXJneShpbnB1dDogS2V5VmFsdWVQYWlyKSB7XG4gICAgaWYgKCEoJ21lbS11dGlsJyBpbiBpbnB1dCkgfHwgISgndGltZXN0YW1wJyBpbiBpbnB1dCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1JlcXVpcmVkIFBhcmFtZXRlcnMgZHVyYXRpb24sY3B1LXV0aWwsdGltZXN0YW1wIG5vdCBwcm92aWRlZCBmb3IgaW5wdXQnXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1lbW9yeUFsbG9jYXRpb24gPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1JlcXVpcmVkIFBhcmFtZXRlcjogbWVtLWFsbG9jIG5vdCBwcm92aWRlZCBpbiBjb25maWd1cmUnXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1lbW9yeUVuZXJneSA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnUmVxdWlyZWQgUGFyYW1ldGVyOiBtZW0tZW5lcmd5IG5vdCBwcm92aWRlZCBpbiBjb25maWd1cmUnXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG1lbV9hbGxvYyA9IHRoaXMubWVtb3J5QWxsb2NhdGlvbjtcbiAgICBjb25zdCBtZW1fdXRpbCA9IGlucHV0WydtZW0tdXRpbCddOyAvLyBjb252ZXJ0IGNwdSB1c2FnZSB0byBwZXJjZW50YWdlXG5cbiAgICBpZiAobWVtX3V0aWwgPCAwIHx8IG1lbV91dGlsID4gMTAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NwdSB1c2FnZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTAwJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChtZW1fYWxsb2MgKiAobWVtX3V0aWwgLyAxMDApICogdGhpcy5tZW1vcnlFbmVyZ3kpIC8gMTAwMDtcbiAgfVxufVxuIl19
@@ -1,24 +0,0 @@
1
- import { IOutputModelInterface } from '../interfaces';
2
- export { KeyValuePair } from '../../types/common';
3
- export declare class EshoppenModel implements IOutputModelInterface {
4
- authParams: object | undefined;
5
- modelType: 'energy-cpu' | 'energy-memory' | 'energy-network' | 'e-sum';
6
- staticParams: object | undefined;
7
- name: string | undefined;
8
- authenticate(authParams: object): void;
9
- execute(inputs: object | object[] | undefined): Promise<any[]>;
10
- configure(name: string, staticParams: object | undefined): Promise<IOutputModelInterface>;
11
- modelIdentifier(): string;
12
- }
13
- export declare class EshoppenCpuModel extends EshoppenModel {
14
- constructor();
15
- modelIdentifier(): string;
16
- }
17
- export declare class EshoppenMemModel extends EshoppenModel {
18
- constructor();
19
- modelIdentifier(): string;
20
- }
21
- export declare class EshoppenNetModel extends EshoppenModel {
22
- constructor();
23
- modelIdentifier(): string;
24
- }