ravcredit-lib 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/v1/objects/oAddress.mjs +2 -0
- package/esm2022/lib/v1/objects/oBusiness.mjs +2 -0
- package/esm2022/lib/v1/objects/oClient.mjs +2 -0
- package/esm2022/lib/v1/objects/oConekta.mjs +85 -0
- package/esm2022/lib/v1/objects/oContract.mjs +2 -0
- package/esm2022/lib/v1/objects/oContractAll.mjs +2 -0
- package/esm2022/lib/v1/objects/oCustomer.mjs +18 -0
- package/esm2022/lib/v1/objects/oDevice.mjs +2 -0
- package/esm2022/lib/v1/objects/oFinancial.mjs +2 -0
- package/esm2022/lib/v1/objects/oGlobal.mjs +86 -0
- package/esm2022/lib/v1/objects/oLogIn.mjs +17 -0
- package/esm2022/lib/v1/objects/oNewPayment.mjs +2 -0
- package/esm2022/lib/v1/objects/oNotification.mjs +17 -0
- package/esm2022/lib/v1/objects/oPassport.mjs +7 -0
- package/esm2022/lib/v1/objects/oUser.mjs +2 -0
- package/esm2022/lib/v1/util/UtilBusiness.mjs +181 -0
- package/esm2022/lib/v1/util/UtilClient.mjs +221 -0
- package/esm2022/lib/v1/util/UtilContract.mjs +339 -0
- package/esm2022/lib/v1/util/UtilDynamiCore.mjs +292 -0
- package/esm2022/public-api.mjs +16 -2
- package/fesm2022/ravcredit-lib.mjs +962 -1
- package/fesm2022/ravcredit-lib.mjs.map +1 -1
- package/lib/v1/objects/oAddress.d.ts +9 -0
- package/lib/v1/objects/oBusiness.d.ts +101 -0
- package/lib/{oClient.d.ts → v1/objects/oClient.d.ts} +0 -1
- package/lib/v1/objects/oConekta.d.ts +305 -0
- package/lib/v1/objects/oContract.d.ts +23 -0
- package/lib/v1/objects/oContractAll.d.ts +21 -0
- package/lib/v1/objects/oCustomer.d.ts +17 -0
- package/lib/v1/objects/oDevice.d.ts +5 -0
- package/lib/v1/objects/oFinancial.d.ts +30 -0
- package/lib/v1/objects/oGlobal.d.ts +149 -0
- package/lib/v1/objects/oLogIn.d.ts +30 -0
- package/lib/v1/objects/oNewPayment.d.ts +11 -0
- package/lib/v1/objects/oNotification.d.ts +25 -0
- package/lib/v1/objects/oPassport.d.ts +55 -0
- package/lib/v1/objects/oUser.d.ts +25 -0
- package/lib/v1/util/UtilBusiness.d.ts +54 -0
- package/lib/v1/util/UtilClient.d.ts +34 -0
- package/lib/v1/util/UtilContract.d.ts +71 -0
- package/lib/v1/util/UtilDynamiCore.d.ts +453 -0
- package/package.json +1 -1
- package/public-api.d.ts +15 -1
- package/esm2022/lib/oClient.mjs +0 -2
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
import { UntypedFormArray, UntypedFormControl, Validators } from "@angular/forms";
|
|
2
|
+
import { cClient, cUserReference } from "./UtilClient";
|
|
3
|
+
// import {TaskState} from "firebase/storage";
|
|
4
|
+
import { cBusinessDeadlines } from "./UtilBusiness";
|
|
5
|
+
export var eProvider;
|
|
6
|
+
(function (eProvider) {
|
|
7
|
+
eProvider["none"] = "";
|
|
8
|
+
eProvider["Conekta"] = "Conekta";
|
|
9
|
+
eProvider["Passport"] = "Passport";
|
|
10
|
+
eProvider["DynamiCore"] = "DynamiCore";
|
|
11
|
+
})(eProvider || (eProvider = {}));
|
|
12
|
+
// export type ProgressTaskStatus = TaskState | "uploading" | "idle" | "generating" | "unauthorized"
|
|
13
|
+
export const cDevice = {
|
|
14
|
+
device: "",
|
|
15
|
+
IMEI: ""
|
|
16
|
+
};
|
|
17
|
+
export const cFinancial = {
|
|
18
|
+
total: 0,
|
|
19
|
+
initial: 0,
|
|
20
|
+
deadlines: cBusinessDeadlines,
|
|
21
|
+
initDate: 0,
|
|
22
|
+
weeklyPayment: 0,
|
|
23
|
+
pendingOf: [],
|
|
24
|
+
progress: [],
|
|
25
|
+
interest: 0,
|
|
26
|
+
provider: eProvider.DynamiCore,
|
|
27
|
+
financed: 0,
|
|
28
|
+
nextPayment: 0,
|
|
29
|
+
amount_commission_opening: 0,
|
|
30
|
+
principal_disbursed: 0,
|
|
31
|
+
expected_disbursed: 0, // ---------
|
|
32
|
+
credit_type: 'Arrendamiento',
|
|
33
|
+
interest_rate: 0,
|
|
34
|
+
commission_opening: 0,
|
|
35
|
+
interest_arrears: 0,
|
|
36
|
+
};
|
|
37
|
+
export const cAddress = {
|
|
38
|
+
street: "",
|
|
39
|
+
city: "",
|
|
40
|
+
neighbor: "",
|
|
41
|
+
zip: "",
|
|
42
|
+
ext: "",
|
|
43
|
+
int: "",
|
|
44
|
+
state: ""
|
|
45
|
+
};
|
|
46
|
+
export const cContract = {
|
|
47
|
+
id: "",
|
|
48
|
+
client: "",
|
|
49
|
+
address: cAddress,
|
|
50
|
+
device: cDevice,
|
|
51
|
+
financial: cFinancial,
|
|
52
|
+
by: "",
|
|
53
|
+
active: true
|
|
54
|
+
};
|
|
55
|
+
export class FactoryContract {
|
|
56
|
+
static FormClient(client) {
|
|
57
|
+
let data = cClient;
|
|
58
|
+
if (client)
|
|
59
|
+
data = client;
|
|
60
|
+
return {
|
|
61
|
+
name: new UntypedFormControl(data.name, [Validators.required, Validators.minLength(10)]),
|
|
62
|
+
email: new UntypedFormControl(data.username, [Validators.required, Validators.email]),
|
|
63
|
+
phone: new UntypedFormControl(data.phone, [Validators.required, Validators.min(10)]),
|
|
64
|
+
curp: new UntypedFormControl(data.curp, [Validators.required, Validators.minLength(16)]),
|
|
65
|
+
userReferences: new UntypedFormArray([])
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
static CreateUserReferenceFormObj(user) {
|
|
69
|
+
let data = cUserReference;
|
|
70
|
+
if (user.name != "")
|
|
71
|
+
data = user;
|
|
72
|
+
return {
|
|
73
|
+
name: new UntypedFormControl(data.name, [Validators.required, Validators.minLength(10)]),
|
|
74
|
+
phone: new UntypedFormControl(data.phone, [Validators.required]),
|
|
75
|
+
relationship: new UntypedFormControl(data.relationship, [Validators.required]),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
static FormAddress(address) {
|
|
79
|
+
let data = cAddress;
|
|
80
|
+
if (address)
|
|
81
|
+
data = address;
|
|
82
|
+
return {
|
|
83
|
+
street: new UntypedFormControl(data.street, Validators.required),
|
|
84
|
+
neighbor: new UntypedFormControl(data.neighbor, Validators.required),
|
|
85
|
+
cp: new UntypedFormControl(data.zip, Validators.required),
|
|
86
|
+
ext: new UntypedFormControl(data.ext, Validators.required),
|
|
87
|
+
int: new UntypedFormControl(data.int),
|
|
88
|
+
city: new UntypedFormControl(data.city, Validators.required),
|
|
89
|
+
state: new UntypedFormControl(data.state, Validators.required),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
static FormDevice(device) {
|
|
93
|
+
let data = cDevice;
|
|
94
|
+
if (device)
|
|
95
|
+
data = device;
|
|
96
|
+
return {
|
|
97
|
+
model: new UntypedFormControl(data.device, Validators.required),
|
|
98
|
+
IMEI: new UntypedFormControl(data.IMEI, Validators.required),
|
|
99
|
+
ID: new UntypedFormControl(data.id),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
static FormFinancial(financial) {
|
|
103
|
+
let data = cFinancial;
|
|
104
|
+
if (financial)
|
|
105
|
+
data = financial;
|
|
106
|
+
data.credit_type = "Arrendamiento";
|
|
107
|
+
// data.deadlines.weeks = cBusinessDeadlines
|
|
108
|
+
return {
|
|
109
|
+
total: new UntypedFormControl(data.total, [Validators.required, Validators.min(1)]),
|
|
110
|
+
initial: new UntypedFormControl(data.initial, [Validators.required]),
|
|
111
|
+
financed: new UntypedFormControl(data.financed, Validators.min(1)),
|
|
112
|
+
weeklyPayment: new UntypedFormControl(data.weeklyPayment, [Validators.required, Validators.min(1)]),
|
|
113
|
+
deadlines: new UntypedFormControl(data.deadlines, [Validators.required]),
|
|
114
|
+
initDate: new UntypedFormControl(data.initDate),
|
|
115
|
+
provider: new UntypedFormControl(data.provider),
|
|
116
|
+
credit_type: new UntypedFormControl(data.credit_type ? data.credit_type : 0),
|
|
117
|
+
interest_rate: new UntypedFormControl(data.interest_rate ? data.interest_rate : 0), // interes credit dynamic
|
|
118
|
+
commission_opening: new UntypedFormControl(data.commission_opening ? data.commission_opening : 0),
|
|
119
|
+
interest_arrears: new UntypedFormControl(data.interest_arrears ? data.interest_arrears : 0), // intereses moratorios dynamic
|
|
120
|
+
amount_commission_opening: new UntypedFormControl(data.amount_commission_opening), // comision por apertura dynamic
|
|
121
|
+
principal_disbursed: new UntypedFormControl(data.principal_disbursed),
|
|
122
|
+
expected_disbursed: new UntypedFormControl(data.expected_disbursed)
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
static CreateContractFromFormObj(data, finalPay) {
|
|
126
|
+
const date = new Date();
|
|
127
|
+
const device = {
|
|
128
|
+
device: data["device"][0].model,
|
|
129
|
+
id: data["device"][0].ID,
|
|
130
|
+
IMEI: data["device"][0].IMEI
|
|
131
|
+
};
|
|
132
|
+
const address = {
|
|
133
|
+
street: data["address"][0].street,
|
|
134
|
+
city: data["address"][0].city,
|
|
135
|
+
neighbor: data["address"][0].neighbor,
|
|
136
|
+
zip: data["address"][0].cp,
|
|
137
|
+
ext: data["address"][0].ext,
|
|
138
|
+
int: data["address"][0].int,
|
|
139
|
+
state: data["address"][0].state
|
|
140
|
+
};
|
|
141
|
+
const financial = {
|
|
142
|
+
total: Number(data["financial"][0].total),
|
|
143
|
+
initial: data["financial"][0].initial,
|
|
144
|
+
deadlines: data["financial"][0].deadlines,
|
|
145
|
+
progress: [],
|
|
146
|
+
pendingOf: [],
|
|
147
|
+
weeklyPayment: data["financial"][0].weeklyPayment,
|
|
148
|
+
interest: data["financial"][0].interest_rate,
|
|
149
|
+
finalDate: date.getTime() + (data["financial"][0].deadlines.weeks * (604800 * 1000)),
|
|
150
|
+
initDate: date.getDate(),
|
|
151
|
+
dayCut: date.getDate(),
|
|
152
|
+
provider: data["financial"][0].provider,
|
|
153
|
+
finalPayment: finalPay,
|
|
154
|
+
financed: data["financial"][0].financed,
|
|
155
|
+
nextPayment: data["financial"][0].nextPayment
|
|
156
|
+
};
|
|
157
|
+
if (data["financial"][0].provider == eProvider.DynamiCore) {
|
|
158
|
+
financial.initial = data["financial"][0].amount_commission_opening ? Number(data["financial"][0].amount_commission_opening) : 0;
|
|
159
|
+
financial.expected_disbursed = data["financial"][0].expected_disbursed ? Number(data["financial"][0].expected_disbursed) : 0;
|
|
160
|
+
financial.principal_disbursed = data["financial"][0].principal_disbursed ? Number(data["financial"][0].principal_disbursed) : 0;
|
|
161
|
+
financial.interest_arrears = data["financial"][0].interest_rate ? Number(data["financial"][0].interest_rate) : 0;
|
|
162
|
+
financial.commission_opening = data["financial"][0].commission_opening ? Number(data["financial"][0].commission_opening) : 0;
|
|
163
|
+
financial.credit_type = data["financial"][0].credit_type ? data["financial"][0].credit_type : "";
|
|
164
|
+
financial.clabe = data["financial"][0].clabe ? data["financial"][0].clabe : "";
|
|
165
|
+
}
|
|
166
|
+
if (data["financial"][0].amount_commission_opening != undefined) {
|
|
167
|
+
if (Number(data["financial"][0].amount_commission_opening) > 0)
|
|
168
|
+
financial.initial = Number(data["financial"][0].amount_commission_opening);
|
|
169
|
+
else
|
|
170
|
+
financial.initial = Number(data["financial"][0].initial);
|
|
171
|
+
}
|
|
172
|
+
if (Number(data["financial"][0].amount_commission_opening) > 0)
|
|
173
|
+
financial.amount_commission_opening = Number(data["financial"][0].amount_commission_opening);
|
|
174
|
+
else
|
|
175
|
+
financial.amount_commission_opening = financial.initial;
|
|
176
|
+
if (financial.nextPayment == undefined)
|
|
177
|
+
financial.nextPayment = 0;
|
|
178
|
+
const contract = {
|
|
179
|
+
id: "",
|
|
180
|
+
client: "",
|
|
181
|
+
address: address,
|
|
182
|
+
device: device,
|
|
183
|
+
financial: financial,
|
|
184
|
+
by: "",
|
|
185
|
+
active: true,
|
|
186
|
+
lastPayment: date.getTime(),
|
|
187
|
+
createdAt: date.getTime()
|
|
188
|
+
};
|
|
189
|
+
return contract;
|
|
190
|
+
}
|
|
191
|
+
static CreateContractToConektaObj(data, monthlyPay, finalPay) {
|
|
192
|
+
const o = {};
|
|
193
|
+
const device = {
|
|
194
|
+
device: data.device.device,
|
|
195
|
+
id: data.device.id,
|
|
196
|
+
IMEI: data.device.IMEI
|
|
197
|
+
};
|
|
198
|
+
const address = {
|
|
199
|
+
street: data.address.street,
|
|
200
|
+
city: data.address.city,
|
|
201
|
+
neighbor: data.address.neighbor,
|
|
202
|
+
zip: data.address.zip,
|
|
203
|
+
ext: data.address.ext,
|
|
204
|
+
int: data.address.int,
|
|
205
|
+
state: data.address.state
|
|
206
|
+
};
|
|
207
|
+
const financial = {
|
|
208
|
+
total: data.financial.total,
|
|
209
|
+
initial: data.financial.initial,
|
|
210
|
+
deadlines: data.financial.deadlines,
|
|
211
|
+
progress: data.financial.progress,
|
|
212
|
+
pendingOf: data.financial.pendingOf,
|
|
213
|
+
weeklyPayment: data.financial.weeklyPayment,
|
|
214
|
+
interest: data.financial.interest,
|
|
215
|
+
finalDate: data.financial.finalDate,
|
|
216
|
+
initDate: data.financial.initDate,
|
|
217
|
+
dayCut: data.financial.dayCut,
|
|
218
|
+
provider: data.financial.provider,
|
|
219
|
+
finalPayment: data.financial.finalPayment,
|
|
220
|
+
financed: data.financial.financed,
|
|
221
|
+
nextPayment: data.financial.nextPayment
|
|
222
|
+
};
|
|
223
|
+
const contract = {
|
|
224
|
+
id: "",
|
|
225
|
+
client: "",
|
|
226
|
+
address: address,
|
|
227
|
+
device: device,
|
|
228
|
+
financial: financial,
|
|
229
|
+
by: "",
|
|
230
|
+
active: true
|
|
231
|
+
};
|
|
232
|
+
return contract;
|
|
233
|
+
}
|
|
234
|
+
static CreateAuthForm(username, curp) {
|
|
235
|
+
const password = this.createPassword(curp);
|
|
236
|
+
return {
|
|
237
|
+
username: new UntypedFormControl(username, Validators.required),
|
|
238
|
+
password: new UntypedFormControl(password, Validators.required),
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
static createPassword(curp) {
|
|
242
|
+
const _curp = curp.split("");
|
|
243
|
+
let password = "";
|
|
244
|
+
const limit = 7;
|
|
245
|
+
if (_curp.length < 16)
|
|
246
|
+
return "";
|
|
247
|
+
password += _curp[0].toLowerCase();
|
|
248
|
+
for (let i = 1; i <= limit; i++)
|
|
249
|
+
password += _curp[i].toUpperCase();
|
|
250
|
+
password += `*`;
|
|
251
|
+
return password;
|
|
252
|
+
}
|
|
253
|
+
static MapperTypeContCli_Contract(_contract) {
|
|
254
|
+
const contract = {
|
|
255
|
+
id: _contract.contract,
|
|
256
|
+
client: _contract.client,
|
|
257
|
+
address: _contract.address,
|
|
258
|
+
device: _contract.device,
|
|
259
|
+
financial: _contract.financial,
|
|
260
|
+
by: _contract.by,
|
|
261
|
+
active: _contract.active,
|
|
262
|
+
lastPayment: _contract.lastPayment,
|
|
263
|
+
createdAt: _contract.createdAt,
|
|
264
|
+
dynamicAccount: _contract.dynamicAccount,
|
|
265
|
+
};
|
|
266
|
+
return contract;
|
|
267
|
+
}
|
|
268
|
+
static MapperSyncContractDynamic(base, account) {
|
|
269
|
+
let nContract = base;
|
|
270
|
+
let _financial = base.financial;
|
|
271
|
+
let _device = base.device;
|
|
272
|
+
const financial = {
|
|
273
|
+
total: _financial.total,
|
|
274
|
+
initial: account.properties.amount_commission_opening ? account.properties.amount_commission_opening : _financial.initial,
|
|
275
|
+
deadlines: _financial.deadlines,
|
|
276
|
+
progress: _financial.progress ? _financial.progress : [],
|
|
277
|
+
pendingOf: _financial.pendingOf ? _financial.pendingOf : [],
|
|
278
|
+
weeklyPayment: _financial.weeklyPayment,
|
|
279
|
+
interest: _financial.interest,
|
|
280
|
+
finalDate: _financial.finalDate,
|
|
281
|
+
initDate: _financial.initDate,
|
|
282
|
+
dayCut: _financial.dayCut,
|
|
283
|
+
provider: _financial.provider,
|
|
284
|
+
finalPayment: _financial.finalPayment,
|
|
285
|
+
financed: _financial.financed,
|
|
286
|
+
nextPayment: _financial.nextPayment ? _financial.nextPayment : 0,
|
|
287
|
+
amount_commission_opening: account.properties.amount_commission_opening,
|
|
288
|
+
expected_disbursed: account.properties.expected_disbursed ?
|
|
289
|
+
Number(account.properties.expected_disbursed) :
|
|
290
|
+
Number(_financial.expected_disbursed),
|
|
291
|
+
principal_disbursed: account.properties.principal_disbursed ?
|
|
292
|
+
account.properties.principal_disbursed :
|
|
293
|
+
_financial.principal_disbursed,
|
|
294
|
+
commission_opening: account.config.commission_opening ?
|
|
295
|
+
Number(account.config.commission_opening) :
|
|
296
|
+
Number(_financial.commission_opening),
|
|
297
|
+
credit_type: account.config.credit_type ? account.config.credit_type : _financial.credit_type,
|
|
298
|
+
clabe: String(account.properties.clabe ? account.properties.clabe : _financial.clabe)
|
|
299
|
+
};
|
|
300
|
+
const interestArrears = account.config.interest_arrears;
|
|
301
|
+
const prevInterestArrears = _financial.interest_arrears;
|
|
302
|
+
if (interestArrears != undefined) {
|
|
303
|
+
financial.interest_arrears = interestArrears;
|
|
304
|
+
}
|
|
305
|
+
else if (prevInterestArrears != undefined) {
|
|
306
|
+
financial.interest_arrears = prevInterestArrears;
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
financial.interest_arrears = 0;
|
|
310
|
+
}
|
|
311
|
+
const interest = account.config.interest_rate;
|
|
312
|
+
const prevInterest = _financial.interest;
|
|
313
|
+
if (interest != undefined) {
|
|
314
|
+
financial.interest = interest;
|
|
315
|
+
}
|
|
316
|
+
else if (prevInterest != undefined) {
|
|
317
|
+
financial.interest = prevInterest;
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
financial.interest = 0;
|
|
321
|
+
}
|
|
322
|
+
if (account.properties.amount_commission_opening != undefined) {
|
|
323
|
+
if (Number(account.properties.amount_commission_opening) > 0) {
|
|
324
|
+
financial.initial = Number(account.properties.amount_commission_opening);
|
|
325
|
+
financial.amount_commission_opening = Number(account.properties.amount_commission_opening);
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
financial.initial = Number(_financial.initial);
|
|
329
|
+
financial.amount_commission_opening = financial.initial;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
const seller = account.properties.seller_name;
|
|
333
|
+
nContract.by = seller != null ? seller : "";
|
|
334
|
+
nContract.device.id = _device.id ? _device.id : "";
|
|
335
|
+
nContract.financial = financial;
|
|
336
|
+
return nContract;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXRpbENvbnRyYWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmF2Y3JlZGl0LWxpYi9zcmMvbGliL3YxL3V0aWwvVXRpbENvbnRyYWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRixPQUFPLEVBQUMsT0FBTyxFQUFFLGNBQWMsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNyRCw4Q0FBOEM7QUFDOUMsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFTbEQsTUFBTSxDQUFOLElBQVksU0FLWDtBQUxELFdBQVksU0FBUztJQUNuQixzQkFBUyxDQUFBO0lBQ1QsZ0NBQW1CLENBQUE7SUFDbkIsa0NBQXFCLENBQUE7SUFDckIsc0NBQXlCLENBQUE7QUFDM0IsQ0FBQyxFQUxXLFNBQVMsS0FBVCxTQUFTLFFBS3BCO0FBRUQsb0dBQW9HO0FBRXBHLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBWTtJQUM5QixNQUFNLEVBQUUsRUFBRTtJQUNWLElBQUksRUFBRSxFQUFFO0NBQ1QsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBZTtJQUNwQyxLQUFLLEVBQUUsQ0FBQztJQUNSLE9BQU8sRUFBRSxDQUFDO0lBQ1YsU0FBUyxFQUFFLGtCQUFrQjtJQUM3QixRQUFRLEVBQUUsQ0FBQztJQUNYLGFBQWEsRUFBRSxDQUFDO0lBQ2hCLFNBQVMsRUFBRSxFQUFFO0lBQ2IsUUFBUSxFQUFFLEVBQUU7SUFDWixRQUFRLEVBQUUsQ0FBQztJQUNYLFFBQVEsRUFBRSxTQUFTLENBQUMsVUFBVTtJQUM5QixRQUFRLEVBQUUsQ0FBQztJQUNYLFdBQVcsRUFBRSxDQUFDO0lBQ2QseUJBQXlCLEVBQUUsQ0FBQztJQUM1QixtQkFBbUIsRUFBRSxDQUFDO0lBQ3RCLGtC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Q0FBQyxDQUFBO2dCQUN4RSxTQUFTLENBQUMseUJBQXlCLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMseUJBQXlCLENBQUMsQ0FBQTtZQUM1RixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sU0FBUyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUM5QyxTQUFTLENBQUMseUJBQXlCLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQTtZQUN6RCxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUF1QixPQUFPLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQTtRQUNqRSxTQUFTLENBQUMsRUFBRSxHQUFHLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBRTNDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUVsRCxTQUFTLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQTtRQUMvQixPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1VudHlwZWRGb3JtQXJyYXksIFVudHlwZWRGb3JtQ29udHJvbCwgVmFsaWRhdG9yc30gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQge2NDbGllbnQsIGNVc2VyUmVmZXJlbmNlfSBmcm9tIFwiLi9VdGlsQ2xpZW50XCI7XG4vLyBpbXBvcnQge1Rhc2tTdGF0ZX0gZnJvbSBcImZpcmViYXNlL3N0b3JhZ2VcIjtcbmltcG9ydCB7Y0J1c2luZXNzRGVhZGxpbmVzfSBmcm9tIFwiLi9VdGlsQnVzaW5lc3NcIjtcbmltcG9ydCB7SURDQWNjb3VudH0gZnJvbSBcIi4vVXRpbER5bmFtaUNvcmVcIjtcbmltcG9ydCB7b0RldmljZX0gZnJvbSAnLi4vb2JqZWN0cy9vRGV2aWNlJztcbmltcG9ydCB7b0ZpbmFuY2lhbH0gZnJvbSAnLi4vb2JqZWN0cy9vRmluYW5jaWFsJztcbmltcG9ydCB7b0FkZHJlc3N9IGZyb20gJy4uL29iamVjdHMvb0FkZHJlc3MnO1xuaW1wb3J0IHtvQ29udHJhY3R9IGZyb20gJy4uL29iamVjdHMvb0NvbnRyYWN0JztcbmltcG9ydCB7b0NsaWVudCwgb1VzZXJSZWZlcmVuY2V9IGZyb20gJy4uL29iamVjdHMvb0NsaWVudCc7XG5pbXBvcnQge3R5Q2xpZW50Q29udHJhY3R9IGZyb20gJy4uL29iamVjdHMvb0dsb2JhbCc7XG5cbmV4cG9ydCBlbnVtIGVQcm92aWRlciB7XG4gIG5vbmUgPSBcIlwiLFxuICBDb25la3RhID0gXCJDb25la3RhXCIsXG4gIFBhc3Nwb3J0ID0gXCJQYXNzcG9ydFwiLFxuICBEeW5hbWlDb3JlID0gXCJEeW5hbWlDb3JlXCIsXG59XG5cbi8vIGV4cG9ydCB0eXBlIFByb2dyZXNzVGFza1N0YXR1cyA9IFRhc2tTdGF0ZSB8IFwidXBsb2FkaW5nXCIgfCBcImlkbGVcIiB8IFwiZ2VuZXJhdGluZ1wiIHwgXCJ1bmF1dGhvcml6ZWRcIlxuXG5leHBvcnQgY29uc3QgY0RldmljZTogb0RldmljZSA9IHtcbiAgZGV2aWNlOiBcIlwiLFxuICBJTUVJOiBcIlwiXG59XG5cbmV4cG9ydCBjb25zdCBjRmluYW5jaWFsOiBvRmluYW5jaWFsID0ge1xuICB0b3RhbDogMCxcbiAgaW5pdGlhbDogMCxcbiAgZGVhZGxpbmVzOiBjQnVzaW5lc3NEZWFkbGluZXMsXG4gIGluaXREYXRlOiAwLFxuICB3ZWVrbHlQYXltZW50OiAwLFxuICBwZW5kaW5nT2Y6IFtdLFxuICBwcm9ncmVzczogW10sXG4gIGludGVyZXN0OiAwLFxuICBwcm92aWRlcjogZVByb3ZpZGVyLkR5bmFtaUNvcmUsXG4gIGZpbmFuY2VkOiAwLFxuICBuZXh0UGF5bWVudDogMCxcbiAgYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZzogMCxcbiAgcHJpbmNpcGFsX2Rpc2J1cnNlZDogMCxcbiAgZXhwZWN0ZWRfZGlzYnVyc2VkOiAwLCAvLyAtLS0tLS0tLS1cbiAgY3JlZGl0X3R5cGU6ICdBcnJlbmRhbWllbnRvJyxcbiAgaW50ZXJlc3RfcmF0ZTogMCxcbiAgY29tbWlzc2lvbl9vcGVuaW5nOiAwLFxuICBpbnRlcmVzdF9hcnJlYXJzOiAwLFxufVxuXG5leHBvcnQgY29uc3QgY0FkZHJlc3M6IG9BZGRyZXNzID0ge1xuICBzdHJlZXQ6IFwiXCIsXG4gIGNpdHk6IFwiXCIsXG4gIG5laWdoYm9yOiBcIlwiLFxuICB6aXA6IFwiXCIsXG4gIGV4dDogXCJcIixcbiAgaW50OiBcIlwiLFxuICBzdGF0ZTogXCJcIlxufVxuXG5leHBvcnQgY29uc3QgY0NvbnRyYWN0OiBvQ29udHJhY3QgPSB7XG4gIGlkOiBcIlwiLFxuICBjbGllbnQ6IFwiXCIsXG4gIGFkZHJlc3M6IGNBZGRyZXNzLFxuICBkZXZpY2U6IGNEZXZpY2UsXG4gIGZpbmFuY2lhbDogY0ZpbmFuY2lhbCxcbiAgYnk6IFwiXCIsXG4gIGFjdGl2ZTogdHJ1ZVxufVxuXG5leHBvcnQgY2xhc3MgRmFjdG9yeUNvbnRyYWN0IHtcblxuICBwdWJsaWMgc3RhdGljIEZvcm1DbGllbnQoY2xpZW50Pzogb0NsaWVudCkge1xuICAgIGxldCBkYXRhID0gY0NsaWVudFxuXG4gICAgaWYgKGNsaWVudCkgZGF0YSA9IGNsaWVudFxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5uYW1lLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoMTApXSksXG4gICAgICBlbWFpbDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLnVzZXJuYW1lLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5lbWFpbF0pLFxuICAgICAgcGhvbmU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5waG9uZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDEwKV0pLFxuICAgICAgY3VycDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmN1cnAsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCgxNildKSxcbiAgICAgIHVzZXJSZWZlcmVuY2VzOiBuZXcgVW50eXBlZEZvcm1BcnJheShbXSlcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIENyZWF0ZVVzZXJSZWZlcmVuY2VGb3JtT2JqKHVzZXI6IG9Vc2VyUmVmZXJlbmNlKSB7XG4gICAgbGV0IGRhdGEgPSBjVXNlclJlZmVyZW5jZVxuXG4gICAgaWYgKHVzZXIubmFtZSAhPSBcIlwiKSBkYXRhID0gdXNlclxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5uYW1lLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoMTApXSksXG4gICAgICBwaG9uZTogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLnBob25lLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICAgICAgcmVsYXRpb25zaGlwOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEucmVsYXRpb25zaGlwLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgRm9ybUFkZHJlc3MoYWRkcmVzcz86IG9BZGRyZXNzKSB7XG4gICAgbGV0IGRhdGEgPSBjQWRkcmVzc1xuXG4gICAgaWYgKGFkZHJlc3MpIGRhdGEgPSBhZGRyZXNzXG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RyZWV0OiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEuc3RyZWV0LCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgIG5laWdoYm9yOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEubmVpZ2hib3IsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgICAgY3A6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS56aXAsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgICAgZXh0OiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEuZXh0LCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgIGludDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmludCksXG4gICAgICBjaXR5OiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEuY2l0eSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICBzdGF0ZTogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLnN0YXRlLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIEZvcm1EZXZpY2UoZGV2aWNlPzogb0RldmljZSkge1xuICAgIGxldCBkYXRhID0gY0RldmljZVxuXG4gICAgaWYgKGRldmljZSkgZGF0YSA9IGRldmljZVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZGVsOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEuZGV2aWNlLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgIElNRUk6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5JTUVJLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgIElEOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEuaWQpLFxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgRm9ybUZpbmFuY2lhbChmaW5hbmNpYWw/OiBvRmluYW5jaWFsKSB7XG4gICAgbGV0IGRhdGEgPSBjRmluYW5jaWFsXG5cbiAgICBpZiAoZmluYW5jaWFsKSBkYXRhID0gZmluYW5jaWFsXG5cbiAgICBkYXRhLmNyZWRpdF90eXBlID0gXCJBcnJlbmRhbWllbnRvXCJcbiAgICAvLyBkYXRhLmRlYWRsaW5lcy53ZWVrcyA9IGNCdXNpbmVzc0RlYWRsaW5lc1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvdGFsOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEudG90YWwsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigxKV0pLFxuICAgICAgaW5pdGlhbDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmluaXRpYWwsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXG4gICAgICBmaW5hbmNlZDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmZpbmFuY2VkLCBWYWxpZGF0b3JzLm1pbigxKSksXG4gICAgICB3ZWVrbHlQYXltZW50OiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEud2Vla2x5UGF5bWVudCwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDEpXSksXG4gICAgICBkZWFkbGluZXM6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5kZWFkbGluZXMsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXG4gICAgICBpbml0RGF0ZTogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmluaXREYXRlKSxcbiAgICAgIHByb3ZpZGVyOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEucHJvdmlkZXIpLFxuXG4gICAgICBjcmVkaXRfdHlwZTogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmNyZWRpdF90eXBlID8gZGF0YS5jcmVkaXRfdHlwZSA6IDApLFxuICAgICAgaW50ZXJlc3RfcmF0ZTogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmludGVyZXN0X3JhdGUgPyBkYXRhLmludGVyZXN0X3JhdGUgOiAwKSwgLy8gaW50ZXJlcyBjcmVkaXQgZHluYW1pY1xuICAgICAgY29tbWlzc2lvbl9vcGVuaW5nOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEuY29tbWlzc2lvbl9vcGVuaW5nID8gZGF0YS5jb21taXNzaW9uX29wZW5pbmcgOiAwKSxcbiAgICAgIGludGVyZXN0X2FycmVhcnM6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5pbnRlcmVzdF9hcnJlYXJzID8gZGF0YS5pbnRlcmVzdF9hcnJlYXJzIDogMCksIC8vIGludGVyZXNlcyBtb3JhdG9yaW9zIGR5bmFtaWNcblxuICAgICAgYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZzogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcpLCAvLyBjb21pc2lvbiBwb3IgYXBlcnR1cmEgZHluYW1pY1xuICAgICAgcHJpbmNpcGFsX2Rpc2J1cnNlZDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLnByaW5jaXBhbF9kaXNidXJzZWQpLFxuICAgICAgZXhwZWN0ZWRfZGlzYnVyc2VkOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEuZXhwZWN0ZWRfZGlzYnVyc2VkKVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgQ3JlYXRlQ29udHJhY3RGcm9tRm9ybU9iaihkYXRhOiBhbnksIGZpbmFsUGF5OiBudW1iZXIpIHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKVxuXG4gICAgY29uc3QgZGV2aWNlOiBvRGV2aWNlID0ge1xuICAgICAgZGV2aWNlOiBkYXRhW1wiZGV2aWNlXCJdWzBdLm1vZGVsLFxuICAgICAgaWQ6IGRhdGFbXCJkZXZpY2VcIl1bMF0uSUQsXG4gICAgICBJTUVJOiBkYXRhW1wiZGV2aWNlXCJdWzBdLklNRUlcbiAgICB9XG4gICAgY29uc3QgYWRkcmVzczogb0FkZHJlc3MgPSB7XG4gICAgICBzdHJlZXQ6IGRhdGFbXCJhZGRyZXNzXCJdWzBdLnN0cmVldCxcbiAgICAgIGNpdHk6IGRhdGFbXCJhZGRyZXNzXCJdWzBdLmNpdHksXG4gICAgICBuZWlnaGJvcjogZGF0YVtcImFkZHJlc3NcIl1bMF0ubmVpZ2hib3IsXG4gICAgICB6aXA6IGRhdGFbXCJhZGRyZXNzXCJdWzBdLmNwLFxuICAgICAgZXh0OiBkYXRhW1wiYWRkcmVzc1wiXVswXS5leHQsXG4gICAgICBpbnQ6IGRhdGFbXCJhZGRyZXNzXCJdWzBdLmludCxcbiAgICAgIHN0YXRlOiBkYXRhW1wiYWRkcmVzc1wiXVswXS5zdGF0ZVxuICAgIH1cblxuICAgIGNvbnN0IGZpbmFuY2lhbDogb0ZpbmFuY2lhbCA9IHtcbiAgICAgIHRvdGFsOiBOdW1iZXIoZGF0YVtcImZpbmFuY2lhbFwiXVswXS50b3RhbCksXG4gICAgICBpbml0aWFsOiBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmluaXRpYWwsXG4gICAgICBkZWFkbGluZXM6IGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uZGVhZGxpbmVzLFxuICAgICAgcHJvZ3Jlc3M6IFtdLFxuICAgICAgcGVuZGluZ09mOiBbXSxcbiAgICAgIHdlZWtseVBheW1lbnQ6IGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0ud2Vla2x5UGF5bWVudCxcbiAgICAgIGludGVyZXN0OiBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmludGVyZXN0X3JhdGUsXG4gICAgICBmaW5hbERhdGU6IGRhdGUuZ2V0VGltZSgpICsgKGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uZGVhZGxpbmVzLndlZWtzICogKDYwNDgwMCAqIDEwMDApKSxcbiAgICAgIGluaXREYXRlOiBkYXRlLmdldERhdGUoKSxcbiAgICAgIGRheUN1dDogZGF0ZS5nZXREYXRlKCksXG4gICAgICBwcm92aWRlcjogZGF0YVtcImZpbmFuY2lhbFwiXVswXS5wcm92aWRlcixcbiAgICAgIGZpbmFsUGF5bWVudDogZmluYWxQYXksXG4gICAgICBmaW5hbmNlZDogZGF0YVtcImZpbmFuY2lhbFwiXVswXS5maW5hbmNlZCxcbiAgICAgIG5leHRQYXltZW50OiBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLm5leHRQYXltZW50XG4gICAgfVxuICAgIGlmIChkYXRhW1wiZmluYW5jaWFsXCJdWzBdLnByb3ZpZGVyID09IGVQcm92aWRlci5EeW5hbWlDb3JlKSB7XG4gICAgICBmaW5hbmNpYWwuaW5pdGlhbCA9IGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZyA/IE51bWJlcihkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcpIDogMFxuICAgICAgZmluYW5jaWFsLmV4cGVjdGVkX2Rpc2J1cnNlZCA9IGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uZXhwZWN0ZWRfZGlzYnVyc2VkID8gTnVtYmVyKGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uZXhwZWN0ZWRfZGlzYnVyc2VkKSA6IDBcbiAgICAgIGZpbmFuY2lhbC5wcmluY2lwYWxfZGlzYnVyc2VkID0gZGF0YVtcImZpbmFuY2lhbFwiXVswXS5wcmluY2lwYWxfZGlzYnVyc2VkID8gTnVtYmVyKGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0ucHJpbmNpcGFsX2Rpc2J1cnNlZCkgOiAwXG4gICAgICBmaW5hbmNpYWwuaW50ZXJlc3RfYXJyZWFycyA9IGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uaW50ZXJlc3RfcmF0ZSA/IE51bWJlcihkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmludGVyZXN0X3JhdGUpIDogMFxuICAgICAgZmluYW5jaWFsLmNvbW1pc3Npb25fb3BlbmluZyA9IGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uY29tbWlzc2lvbl9vcGVuaW5nID8gTnVtYmVyKGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uY29tbWlzc2lvbl9vcGVuaW5nKSA6IDBcbiAgICAgIGZpbmFuY2lhbC5jcmVkaXRfdHlwZSA9IGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uY3JlZGl0X3R5cGUgPyBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmNyZWRpdF90eXBlIDogXCJcIlxuICAgICAgZmluYW5jaWFsLmNsYWJlID0gZGF0YVtcImZpbmFuY2lhbFwiXVswXS5jbGFiZSA/IGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uY2xhYmUgOiBcIlwiXG4gICAgfVxuXG4gICAgaWYgKGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZyAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChOdW1iZXIoZGF0YVtcImZpbmFuY2lhbFwiXVswXS5hbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nKSA+IDApXG4gICAgICAgIGZpbmFuY2lhbC5pbml0aWFsID0gTnVtYmVyKGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZylcbiAgICAgIGVsc2VcbiAgICAgICAgZmluYW5jaWFsLmluaXRpYWwgPSBOdW1iZXIoZGF0YVtcImZpbmFuY2lhbFwiXVswXS5pbml0aWFsKVxuICAgIH1cblxuICAgIGlmIChOdW1iZXIoZGF0YVtcImZpbmFuY2lhbFwiXVswXS5hbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nKSA+IDApXG4gICAgICBmaW5hbmNpYWwuYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZyA9IE51bWJlcihkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcpXG4gICAgZWxzZVxuICAgICAgZmluYW5jaWFsLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcgPSBmaW5hbmNpYWwuaW5pdGlhbFxuXG4gICAgaWYgKGZpbmFuY2lhbC5uZXh0UGF5bWVudCA9PSB1bmRlZmluZWQpIGZpbmFuY2lhbC5uZXh0UGF5bWVudCA9IDBcblxuICAgIGNvbnN0IGNvbnRyYWN0OiBvQ29udHJhY3QgPSB7XG4gICAgICBpZDogXCJcIixcbiAgICAgIGNsaWVudDogXCJcIixcbiAgICAgIGFkZHJlc3M6IGFkZHJlc3MsXG4gICAgICBkZXZpY2U6IGRldmljZSxcbiAgICAgIGZpbmFuY2lhbDogZmluYW5jaWFsLFxuICAgICAgYnk6IFwiXCIsXG4gICAgICBhY3RpdmU6IHRydWUsXG4gICAgICBsYXN0UGF5bWVudDogZGF0ZS5nZXRUaW1lKCksXG4gICAgICBjcmVhdGVkQXQ6IGRhdGUuZ2V0VGltZSgpXG4gICAgfVxuICAgIHJldHVybiBjb250cmFjdFxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBDcmVhdGVDb250cmFjdFRvQ29uZWt0YU9iaihkYXRhOiBvQ29udHJhY3QsIG1vbnRobHlQYXk6IG51bWJlciwgZmluYWxQYXk6IG51bWJlcikge1xuICAgIGNvbnN0IG86IGFueSA9IHt9XG5cbiAgICBjb25zdCBkZXZpY2U6IG9EZXZpY2UgPSB7XG4gICAgICBkZXZpY2U6IGRhdGEuZGV2aWNlLmRldmljZSxcbiAgICAgIGlkOiBkYXRhLmRldmljZS5pZCxcbiAgICAgIElNRUk6IGRhdGEuZGV2aWNlLklNRUlcbiAgICB9XG4gICAgY29uc3QgYWRkcmVzczogb0FkZHJlc3MgPSB7XG4gICAgICBzdHJlZXQ6IGRhdGEuYWRkcmVzcy5zdHJlZXQsXG4gICAgICBjaXR5OiBkYXRhLmFkZHJlc3MuY2l0eSxcbiAgICAgIG5laWdoYm9yOiBkYXRhLmFkZHJlc3MubmVpZ2hib3IsXG4gICAgICB6aXA6IGRhdGEuYWRkcmVzcy56aXAsXG4gICAgICBleHQ6IGRhdGEuYWRkcmVzcy5leHQsXG4gICAgICBpbnQ6IGRhdGEuYWRkcmVzcy5pbnQsXG4gICAgICBzdGF0ZTogZGF0YS5hZGRyZXNzLnN0YXRlXG4gICAgfVxuICAgIGNvbnN0IGZpbmFuY2lhbDogb0ZpbmFuY2lhbCA9IHtcbiAgICAgIHRvdGFsOiBkYXRhLmZpbmFuY2lhbC50b3RhbCxcbiAgICAgIGluaXRpYWw6IGRhdGEuZmluYW5jaWFsLmluaXRpYWwsXG4gICAgICBkZWFkbGluZXM6IGRhdGEuZmluYW5jaWFsLmRlYWRsaW5lcyxcbiAgICAgIHByb2dyZXNzOiBkYXRhLmZpbmFuY2lhbC5wcm9ncmVzcyxcbiAgICAgIHBlbmRpbmdPZjogZGF0YS5maW5hbmNpYWwucGVuZGluZ09mLFxuICAgICAgd2Vla2x5UGF5bWVudDogZGF0YS5maW5hbmNpYWwud2Vla2x5UGF5bWVudCxcbiAgICAgIGludGVyZXN0OiBkYXRhLmZpbmFuY2lhbC5pbnRlcmVzdCxcbiAgICAgIGZpbmFsRGF0ZTogZGF0YS5maW5hbmNpYWwuZmluYWxEYXRlLFxuICAgICAgaW5pdERhdGU6IGRhdGEuZmluYW5jaWFsLmluaXREYXRlLFxuICAgICAgZGF5Q3V0OiBkYXRhLmZpbmFuY2lhbC5kYXlDdXQsXG4gICAgICBwcm92aWRlcjogZGF0YS5maW5hbmNpYWwucHJvdmlkZXIsXG4gICAgICBmaW5hbFBheW1lbnQ6IGRhdGEuZmluYW5jaWFsLmZpbmFsUGF5bWVudCxcbiAgICAgIGZpbmFuY2VkOiBkYXRhLmZpbmFuY2lhbC5maW5hbmNlZCxcbiAgICAgIG5leHRQYXltZW50OiBkYXRhLmZpbmFuY2lhbC5uZXh0UGF5bWVudFxuICAgIH1cbiAgICBjb25zdCBjb250cmFjdDogb0NvbnRyYWN0ID0ge1xuICAgICAgaWQ6IFwiXCIsXG4gICAgICBjbGllbnQ6IFwiXCIsXG4gICAgICBhZGRyZXNzOiBhZGRyZXNzLFxuICAgICAgZGV2aWNlOiBkZXZpY2UsXG4gICAgICBmaW5hbmNpYWw6IGZpbmFuY2lhbCxcbiAgICAgIGJ5OiBcIlwiLFxuICAgICAgYWN0aXZlOiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBjb250cmFjdFxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBDcmVhdGVBdXRoRm9ybSh1c2VybmFtZTogc3RyaW5nLCBjdXJwOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwYXNzd29yZDogc3RyaW5nID0gdGhpcy5jcmVhdGVQYXNzd29yZChjdXJwKVxuICAgIHJldHVybiB7XG4gICAgICB1c2VybmFtZTogbmV3IFVudHlwZWRGb3JtQ29udHJvbCh1c2VybmFtZSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICBwYXNzd29yZDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChwYXNzd29yZCwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBjcmVhdGVQYXNzd29yZChjdXJwOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IF9jdXJwID0gY3VycC5zcGxpdChcIlwiKVxuICAgIGxldCBwYXNzd29yZCA9IFwiXCJcbiAgICBjb25zdCBsaW1pdCA9IDdcblxuICAgIGlmIChfY3VycC5sZW5ndGggPCAxNikgcmV0dXJuIFwiXCJcblxuICAgIHBhc3N3b3JkICs9IF9jdXJwWzBdLnRvTG93ZXJDYXNlKClcblxuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGxpbWl0OyBpKyspXG4gICAgICBwYXNzd29yZCArPSBfY3VycFtpXS50b1VwcGVyQ2FzZSgpXG5cbiAgICBwYXNzd29yZCArPSBgKmBcbiAgICByZXR1cm4gcGFzc3dvcmRcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgTWFwcGVyVHlwZUNvbnRDbGlfQ29udHJhY3QoX2NvbnRyYWN0OiB0eUNsaWVudENvbnRyYWN0KTogb0NvbnRyYWN0IHtcbiAgICBjb25zdCBjb250cmFjdDogb0NvbnRyYWN0ID0ge1xuICAgICAgaWQ6IF9jb250cmFjdC5jb250cmFjdCEsXG4gICAgICBjbGllbnQ6IF9jb250cmFjdC5jbGllbnQsXG4gICAgICBhZGRyZXNzOiBfY29udHJhY3QuYWRkcmVzcyxcbiAgICAgIGRldmljZTogX2NvbnRyYWN0LmRldmljZSxcbiAgICAgIGZpbmFuY2lhbDogX2NvbnRyYWN0LmZpbmFuY2lhbCxcbiAgICAgIGJ5OiBfY29udHJhY3QuYnksXG4gICAgICBhY3RpdmU6IF9jb250cmFjdC5hY3RpdmUsXG4gICAgICBsYXN0UGF5bWVudDogX2NvbnRyYWN0Lmxhc3RQYXltZW50LFxuICAgICAgY3JlYXRlZEF0OiBfY29udHJhY3QuY3JlYXRlZEF0LFxuICAgICAgZHluYW1pY0FjY291bnQ6IF9jb250cmFjdC5keW5hbWljQWNjb3VudCxcbiAgICB9XG5cbiAgICByZXR1cm4gY29udHJhY3RcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgTWFwcGVyU3luY0NvbnRyYWN0RHluYW1pYyhiYXNlOiBvQ29udHJhY3QsIGFjY291bnQ6IElEQ0FjY291bnQpOiBvQ29udHJhY3Qge1xuICAgIGxldCBuQ29udHJhY3QgPSBiYXNlXG4gICAgbGV0IF9maW5hbmNpYWwgPSBiYXNlLmZpbmFuY2lhbFxuICAgIGxldCBfZGV2aWNlID0gYmFzZS5kZXZpY2VcblxuXG4gICAgY29uc3QgZmluYW5jaWFsOiBvRmluYW5jaWFsID0ge1xuICAgICAgdG90YWw6IF9maW5hbmNpYWwudG90YWwsXG4gICAgICBpbml0aWFsOiBhY2NvdW50LnByb3BlcnRpZXMuYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZyA/IGFjY291bnQucHJvcGVydGllcy5hbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nIDogX2ZpbmFuY2lhbC5pbml0aWFsLFxuICAgICAgZGVhZGxpbmVzOiBfZmluYW5jaWFsLmRlYWRsaW5lcyxcbiAgICAgIHByb2dyZXNzOiBfZmluYW5jaWFsLnByb2dyZXNzID8gX2ZpbmFuY2lhbC5wcm9ncmVzcyA6IFtdLFxuICAgICAgcGVuZGluZ09mOiBfZmluYW5jaWFsLnBlbmRpbmdPZiA/IF9maW5hbmNpYWwucGVuZGluZ09mIDogW10sXG4gICAgICB3ZWVrbHlQYXltZW50OiBfZmluYW5jaWFsLndlZWtseVBheW1lbnQsXG4gICAgICBpbnRlcmVzdDogX2ZpbmFuY2lhbC5pbnRlcmVzdCxcbiAgICAgIGZpbmFsRGF0ZTogX2ZpbmFuY2lhbC5maW5hbERhdGUsXG4gICAgICBpbml0RGF0ZTogX2ZpbmFuY2lhbC5pbml0RGF0ZSxcbiAgICAgIGRheUN1dDogX2ZpbmFuY2lhbC5kYXlDdXQsXG4gICAgICBwcm92aWRlcjogX2ZpbmFuY2lhbC5wcm92aWRlcixcbiAgICAgIGZpbmFsUGF5bWVudDogX2ZpbmFuY2lhbC5maW5hbFBheW1lbnQsXG4gICAgICBmaW5hbmNlZDogX2ZpbmFuY2lhbC5maW5hbmNlZCxcbiAgICAgIG5leHRQYXltZW50OiBfZmluYW5jaWFsLm5leHRQYXltZW50ID8gX2ZpbmFuY2lhbC5uZXh0UGF5bWVudCA6IDAsXG5cbiAgICAgIGFtb3VudF9jb21taXNzaW9uX29wZW5pbmc6XG4gICAgICBhY2NvdW50LnByb3BlcnRpZXMuYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZyxcblxuICAgICAgZXhwZWN0ZWRfZGlzYnVyc2VkOlxuICAgICAgICBhY2NvdW50LnByb3BlcnRpZXMuZXhwZWN0ZWRfZGlzYnVyc2VkID9cbiAgICAgICAgICBOdW1iZXIoYWNjb3VudC5wcm9wZXJ0aWVzLmV4cGVjdGVkX2Rpc2J1cnNlZCkgOlxuICAgICAgICAgIE51bWJlcihfZmluYW5jaWFsLmV4cGVjdGVkX2Rpc2J1cnNlZCksXG5cbiAgICAgIHByaW5jaXBhbF9kaXNidXJzZWQ6XG4gICAgICAgIGFjY291bnQucHJvcGVydGllcy5wcmluY2lwYWxfZGlzYnVyc2VkID9cbiAgICAgICAgICBhY2NvdW50LnByb3BlcnRpZXMucHJpbmNpcGFsX2Rpc2J1cnNlZCA6XG4gICAgICAgICAgX2ZpbmFuY2lhbC5wcmluY2lwYWxfZGlzYnVyc2VkLFxuXG4gICAgICBjb21taXNzaW9uX29wZW5pbmc6XG4gICAgICAgIGFjY291bnQuY29uZmlnLmNvbW1pc3Npb25fb3BlbmluZyA/XG4gICAgICAgICAgTnVtYmVyKGFjY291bnQuY29uZmlnLmNvbW1pc3Npb25fb3BlbmluZykgOlxuICAgICAgICAgIE51bWJlcihfZmluYW5jaWFsLmNvbW1pc3Npb25fb3BlbmluZyksXG5cbiAgICAgIGNyZWRpdF90eXBlOlxuICAgICAgICBhY2NvdW50LmNvbmZpZy5jcmVkaXRfdHlwZSA/IGFjY291bnQuY29uZmlnLmNyZWRpdF90eXBlIDogX2ZpbmFuY2lhbC5jcmVkaXRfdHlwZSxcblxuICAgICAgY2xhYmU6XG4gICAgICAgIFN0cmluZyhhY2NvdW50LnByb3BlcnRpZXMuY2xhYmUgPyBhY2NvdW50LnByb3BlcnRpZXMuY2xhYmUgOiBfZmluYW5jaWFsLmNsYWJlKVxuICAgIH1cblxuICAgIGNvbnN0IGludGVyZXN0QXJyZWFycyA9IGFjY291bnQuY29uZmlnLmludGVyZXN0X2FycmVhcnNcbiAgICBjb25zdCBwcmV2SW50ZXJlc3RBcnJlYXJzID0gX2ZpbmFuY2lhbC5pbnRlcmVzdF9hcnJlYXJzXG4gICAgaWYgKGludGVyZXN0QXJyZWFycyAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGZpbmFuY2lhbC5pbnRlcmVzdF9hcnJlYXJzID0gaW50ZXJlc3RBcnJlYXJzXG4gICAgfSBlbHNlIGlmIChwcmV2SW50ZXJlc3RBcnJlYXJzICE9IHVuZGVmaW5lZCkge1xuICAgICAgZmluYW5jaWFsLmludGVyZXN0X2FycmVhcnMgPSBwcmV2SW50ZXJlc3RBcnJlYXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGZpbmFuY2lhbC5pbnRlcmVzdF9hcnJlYXJzID0gMFxuICAgIH1cblxuICAgIGNvbnN0IGludGVyZXN0ID0gYWNjb3VudC5jb25maWcuaW50ZXJlc3RfcmF0ZVxuICAgIGNvbnN0IHByZXZJbnRlcmVzdCA9IF9maW5hbmNpYWwuaW50ZXJlc3RcbiAgICBpZiAoaW50ZXJlc3QgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBmaW5hbmNpYWwuaW50ZXJlc3QgPSBpbnRlcmVzdFxuICAgIH0gZWxzZSBpZiAocHJldkludGVyZXN0ICE9IHVuZGVmaW5lZCkge1xuICAgICAgZmluYW5jaWFsLmludGVyZXN0ID0gcHJldkludGVyZXN0XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpbmFuY2lhbC5pbnRlcmVzdCA9IDBcbiAgICB9XG5cbiAgICBpZiAoYWNjb3VudC5wcm9wZXJ0aWVzLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoTnVtYmVyKGFjY291bnQucHJvcGVydGllcy5hbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nKSA+IDApIHtcbiAgICAgICAgZmluYW5jaWFsLmluaXRpYWwgPSBOdW1iZXIoYWNjb3VudC5wcm9wZXJ0aWVzLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcpXG4gICAgICAgIGZpbmFuY2lhbC5hbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nID0gTnVtYmVyKGFjY291bnQucHJvcGVydGllcy5hbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmluYW5jaWFsLmluaXRpYWwgPSBOdW1iZXIoX2ZpbmFuY2lhbC5pbml0aWFsKVxuICAgICAgICBmaW5hbmNpYWwuYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZyA9IGZpbmFuY2lhbC5pbml0aWFsXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsbGVyOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBhY2NvdW50LnByb3BlcnRpZXMuc2VsbGVyX25hbWVcbiAgICBuQ29udHJhY3QuYnkgPSBzZWxsZXIgIT0gbnVsbCA/IHNlbGxlciA6IFwiXCJcblxuICAgIG5Db250cmFjdC5kZXZpY2UuaWQgPSBfZGV2aWNlLmlkID8gX2RldmljZS5pZCA6IFwiXCJcblxuICAgIG5Db250cmFjdC5maW5hbmNpYWwgPSBmaW5hbmNpYWxcbiAgICByZXR1cm4gbkNvbnRyYWN0XG4gIH1cbn1cblxuIl19
|