@airgap/aeternity 0.13.45-beta.1 → 0.13.45-beta.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/package.json +4 -4
- package/v0/index.js +7 -7
- package/v0/index.js.map +1 -1
- package/v0/protocol/AeternityAddress.js +27 -18
- package/v0/protocol/AeternityAddress.js.map +1 -1
- package/v0/protocol/AeternityCryptoClient.js +21 -84
- package/v0/protocol/AeternityCryptoClient.js.map +1 -1
- package/v0/protocol/AeternityProtocol.js +341 -657
- package/v0/protocol/AeternityProtocol.js.map +1 -1
- package/v0/protocol/AeternityProtocolOptions.js +22 -93
- package/v0/protocol/AeternityProtocolOptions.js.map +1 -1
- package/v0/serializer/validators/transaction-validator.js +30 -83
- package/v0/serializer/validators/transaction-validator.js.map +1 -1
- package/v0/serializer/validators/validators.js +19 -67
- package/v0/serializer/validators/validators.js.map +1 -1
- package/v1/block-explorer/AeternityBlockExplorer.js +12 -61
- package/v1/block-explorer/AeternityBlockExplorer.js.map +1 -1
- package/v1/data/AeternityAddress.js +12 -13
- package/v1/data/AeternityAddress.js.map +1 -1
- package/v1/index.js +3 -3
- package/v1/index.js.map +1 -1
- package/v1/module/AeternityModule.d.ts +1 -1
- package/v1/module/AeternityModule.js +37 -95
- package/v1/module/AeternityModule.js.map +1 -1
- package/v1/module.js +2 -3
- package/v1/module.js.map +1 -1
- package/v1/protocol/AeternityCryptoClient.js +21 -84
- package/v1/protocol/AeternityCryptoClient.js.map +1 -1
- package/v1/protocol/AeternityProtocol.js +282 -497
- package/v1/protocol/AeternityProtocol.js.map +1 -1
- package/v1/serializer/v3/schemas/converter/transaction-converter.js +8 -20
- package/v1/serializer/v3/schemas/converter/transaction-converter.js.map +1 -1
- package/v1/serializer/v3/serializer-companion.js +69 -148
- package/v1/serializer/v3/serializer-companion.js.map +1 -1
- package/v1/serializer/v3/validators/transaction-validator.js +15 -63
- package/v1/serializer/v3/validators/transaction-validator.js.map +1 -1
- package/v1/serializer/v3/validators/validators.js +19 -67
- package/v1/serializer/v3/validators/validators.js.map +1 -1
- package/v1/types/crypto.d.ts +1 -1
- package/v1/types/protocol.d.ts +1 -1
- package/v1/utils/convert.js +26 -17
- package/v1/utils/convert.js.map +1 -1
- package/v1/utils/key.js +9 -10
- package/v1/utils/key.js.map +1 -1
- package/v1/utils/signature.js +6 -7
- package/v1/utils/signature.js.map +1 -1
- package/v1/utils/transaction.d.ts +0 -1
- package/v1/utils/transaction.js +26 -17
- package/v1/utils/transaction.js.map +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@airgap/aeternity",
|
|
3
|
-
"version": "0.13.45-beta.
|
|
3
|
+
"version": "0.13.45-beta.3",
|
|
4
4
|
"description": "The @airgap/aeternity is an Aeternity implementation of the ICoinProtocol interface from @airgap/coinlib-core.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"airgap",
|
|
@@ -30,9 +30,9 @@
|
|
|
30
30
|
},
|
|
31
31
|
"author": "Papers AG <contact@papers.ch> (https://papers.ch)",
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@airgap/coinlib-core": "^0.13.45-beta.
|
|
34
|
-
"@airgap/module-kit": "^0.13.45-beta.
|
|
35
|
-
"@airgap/serializer": "^0.13.45-beta.
|
|
33
|
+
"@airgap/coinlib-core": "^0.13.45-beta.3",
|
|
34
|
+
"@airgap/module-kit": "^0.13.45-beta.3",
|
|
35
|
+
"@airgap/serializer": "^0.13.45-beta.3",
|
|
36
36
|
"@stablelib/ed25519": "^1.0.3"
|
|
37
37
|
},
|
|
38
38
|
"localDependencies": {},
|
package/v0/index.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AeternityAddress = exports.AeternityProtocolNetwork = exports.AeternalBlockExplorer = exports.AeternityProtocolOptions = exports.AeternityCryptoClient = exports.AeternityProtocol = void 0;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
const coinlib_core_1 = require("@airgap/coinlib-core");
|
|
5
|
+
const serializer_1 = require("@airgap/serializer");
|
|
6
|
+
const AeternityAddress_1 = require("./protocol/AeternityAddress");
|
|
7
7
|
Object.defineProperty(exports, "AeternityAddress", { enumerable: true, get: function () { return AeternityAddress_1.AeternityAddress; } });
|
|
8
|
-
|
|
8
|
+
const AeternityCryptoClient_1 = require("./protocol/AeternityCryptoClient");
|
|
9
9
|
Object.defineProperty(exports, "AeternityCryptoClient", { enumerable: true, get: function () { return AeternityCryptoClient_1.AeternityCryptoClient; } });
|
|
10
|
-
|
|
10
|
+
const AeternityProtocol_1 = require("./protocol/AeternityProtocol");
|
|
11
11
|
Object.defineProperty(exports, "AeternityProtocol", { enumerable: true, get: function () { return AeternityProtocol_1.AeternityProtocol; } });
|
|
12
|
-
|
|
12
|
+
const AeternityProtocolOptions_1 = require("./protocol/AeternityProtocolOptions");
|
|
13
13
|
Object.defineProperty(exports, "AeternalBlockExplorer", { enumerable: true, get: function () { return AeternityProtocolOptions_1.AeternalBlockExplorer; } });
|
|
14
14
|
Object.defineProperty(exports, "AeternityProtocolNetwork", { enumerable: true, get: function () { return AeternityProtocolOptions_1.AeternityProtocolNetwork; } });
|
|
15
15
|
Object.defineProperty(exports, "AeternityProtocolOptions", { enumerable: true, get: function () { return AeternityProtocolOptions_1.AeternityProtocolOptions; } });
|
|
16
|
-
|
|
16
|
+
const transaction_validator_1 = require("./serializer/validators/transaction-validator");
|
|
17
17
|
// Serializer
|
|
18
18
|
serializer_1.Serializer.addSchema(serializer_1.IACMessageType.TransactionSignRequest, { schema: require('./serializer/schemas/v2/transaction-sign-request-aeternity.json') }, coinlib_core_1.MainProtocolSymbols.AE);
|
|
19
19
|
serializer_1.Serializer.addSchema(serializer_1.IACMessageType.TransactionSignResponse, { schema: require('./serializer/schemas/v2/transaction-sign-response-aeternity.json') }, coinlib_core_1.MainProtocolSymbols.AE);
|
package/v0/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/v0/index.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/v0/index.ts"],"names":[],"mappings":";;;AAAA,uDAA0D;AAC1D,mDAA6E;AAE7E,kEAA8D;AAe5D,iGAfO,mCAAgB,OAeP;AAdlB,4EAAwE;AAUtE,sGAVO,6CAAqB,OAUP;AATvB,oEAAgE;AAQ9D,kGARO,qCAAiB,OAQP;AAPnB,kFAA+H;AAU7H,sGAVO,gDAAqB,OAUP;AACrB,yGAX8B,mDAAwB,OAW9B;AAFxB,yGATwD,mDAAwB,OASxD;AAR1B,yFAA4I;AAiB5I,aAAa;AAEb,uBAAU,CAAC,SAAS,CAClB,2BAAc,CAAC,sBAAsB,EACrC,EAAE,MAAM,EAAE,OAAO,CAAC,iEAAiE,CAAC,EAAE,EACtF,kCAAmB,CAAC,EAAE,CACvB,CAAA;AACD,uBAAU,CAAC,SAAS,CAClB,2BAAc,CAAC,uBAAuB,EACtC,EAAE,MAAM,EAAE,OAAO,CAAC,kEAAkE,CAAC,EAAE,EACvF,kCAAmB,CAAC,EAAE,CACvB,CAAA;AAED,yBAAY,CAAC,SAAS,CACpB,2BAAc,CAAC,sBAAsB,EACrC,EAAE,MAAM,EAAE,OAAO,CAAC,iEAAiE,CAAC,EAAE,EACtF,kCAAmB,CAAC,EAAE,CACvB,CAAA;AACD,yBAAY,CAAC,SAAS,CACpB,2BAAc,CAAC,uBAAuB,EACtC,EAAE,MAAM,EAAE,OAAO,CAAC,kEAAkE,CAAC,EAAE,EACvF,kCAAmB,CAAC,EAAE,CACvB,CAAA;AAED,uBAAU,CAAC,YAAY,CAAC,kCAAmB,CAAC,EAAE,EAAE,IAAI,8DAAsC,EAAE,CAAC,CAAA;AAC7F,yBAAY,CAAC,YAAY,CAAC,kCAAmB,CAAC,EAAE,EAAE,IAAI,4DAAoC,EAAE,CAAC,CAAA"}
|
|
@@ -15,28 +15,37 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
15
15
|
}) : function(o, v) {
|
|
16
16
|
o["default"] = v;
|
|
17
17
|
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
25
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
36
|
exports.AeternityAddress = void 0;
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
37
|
+
const bs58check = __importStar(require("@airgap/coinlib-core/dependencies/src/bs58check-2.1.2/index"));
|
|
38
|
+
class AeternityAddress {
|
|
39
|
+
constructor(value) {
|
|
30
40
|
this.value = value;
|
|
31
41
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
return new AeternityAddress(
|
|
35
|
-
}
|
|
36
|
-
|
|
42
|
+
static from(publicKey) {
|
|
43
|
+
const base58 = bs58check.encode(Buffer.from(publicKey, 'hex'));
|
|
44
|
+
return new AeternityAddress(`ak_${base58}`);
|
|
45
|
+
}
|
|
46
|
+
asString() {
|
|
37
47
|
return this.value;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
}());
|
|
48
|
+
}
|
|
49
|
+
}
|
|
41
50
|
exports.AeternityAddress = AeternityAddress;
|
|
42
51
|
//# sourceMappingURL=AeternityAddress.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AeternityAddress.js","sourceRoot":"","sources":["../../../src/v0/protocol/AeternityAddress.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AeternityAddress.js","sourceRoot":"","sources":["../../../src/v0/protocol/AeternityAddress.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uGAAwF;AAExF,MAAa,gBAAgB;IAC3B,YAAqC,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;IAAG,CAAC;IAE/C,MAAM,CAAC,IAAI,CAAC,SAAiB;QAClC,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAA;QAE9D,OAAO,IAAI,gBAAgB,CAAC,MAAM,MAAM,EAAE,CAAC,CAAA;IAC7C,CAAC;IAEM,QAAQ;QACb,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;CACF;AAZD,4CAYC"}
|
|
@@ -1,95 +1,32 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __extends = (this && this.__extends) || (function () {
|
|
3
|
-
var extendStatics = function (d, b) {
|
|
4
|
-
extendStatics = Object.setPrototypeOf ||
|
|
5
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
-
return extendStatics(d, b);
|
|
8
|
-
};
|
|
9
|
-
return function (d, b) {
|
|
10
|
-
if (typeof b !== "function" && b !== null)
|
|
11
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
-
extendStatics(d, b);
|
|
13
|
-
function __() { this.constructor = d; }
|
|
14
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
-
};
|
|
16
|
-
})();
|
|
17
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
18
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
19
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
20
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
21
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
22
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
23
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
24
|
-
});
|
|
25
|
-
};
|
|
26
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
27
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
28
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
29
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
30
|
-
function step(op) {
|
|
31
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
32
|
-
while (_) try {
|
|
33
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
34
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
35
|
-
switch (op[0]) {
|
|
36
|
-
case 0: case 1: t = op; break;
|
|
37
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
38
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
39
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
40
|
-
default:
|
|
41
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
42
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
43
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
44
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
45
|
-
if (t[2]) _.ops.pop();
|
|
46
|
-
_.trys.pop(); continue;
|
|
47
|
-
}
|
|
48
|
-
op = body.call(thisArg, _);
|
|
49
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
50
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
51
|
-
}
|
|
52
|
-
};
|
|
53
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
54
3
|
exports.AeternityCryptoClient = void 0;
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
4
|
+
const errors_1 = require("@airgap/coinlib-core/errors");
|
|
5
|
+
const coinlib_error_1 = require("@airgap/coinlib-core/errors/coinlib-error");
|
|
6
|
+
const Ed25519CryptoClient_1 = require("@airgap/coinlib-core/protocols/Ed25519CryptoClient");
|
|
7
|
+
const ed25519_1 = require("@stablelib/ed25519");
|
|
8
|
+
const personalMessageToBinary = (message) => {
|
|
9
|
+
const prefix = Buffer.from('Æternity Signed Message:\n', 'utf8');
|
|
10
|
+
const messageBuffer = Buffer.from(message, 'utf8');
|
|
62
11
|
if (messageBuffer.length >= 0xfd) {
|
|
63
12
|
throw new errors_1.InvalidValueError(coinlib_error_1.Domain.AETERNITY, 'message too long');
|
|
64
13
|
}
|
|
65
14
|
return Buffer.concat([Buffer.from([prefix.length]), prefix, Buffer.from([messageBuffer.length]), messageBuffer]);
|
|
66
15
|
};
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
16
|
+
class AeternityCryptoClient extends Ed25519CryptoClient_1.Ed25519CryptoClient {
|
|
17
|
+
constructor() {
|
|
18
|
+
super();
|
|
19
|
+
}
|
|
20
|
+
async signMessage(message, keypair) {
|
|
21
|
+
const messageBuffer = personalMessageToBinary(message);
|
|
22
|
+
const rawSignature = (0, ed25519_1.sign)(Buffer.from(keypair.privateKey, 'hex'), messageBuffer);
|
|
23
|
+
return Buffer.from(rawSignature).toString('hex');
|
|
24
|
+
}
|
|
25
|
+
async verifyMessage(message, signature, publicKey) {
|
|
26
|
+
const rawSignature = Buffer.from(signature, 'hex');
|
|
27
|
+
const messageBuffer = personalMessageToBinary(message);
|
|
28
|
+
return (0, ed25519_1.verify)(Buffer.from(publicKey, 'hex'), messageBuffer, rawSignature);
|
|
71
29
|
}
|
|
72
|
-
|
|
73
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
74
|
-
var messageBuffer, rawSignature;
|
|
75
|
-
return __generator(this, function (_a) {
|
|
76
|
-
messageBuffer = personalMessageToBinary(message);
|
|
77
|
-
rawSignature = (0, ed25519_1.sign)(Buffer.from(keypair.privateKey, 'hex'), messageBuffer);
|
|
78
|
-
return [2 /*return*/, Buffer.from(rawSignature).toString('hex')];
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
};
|
|
82
|
-
AeternityCryptoClient.prototype.verifyMessage = function (message, signature, publicKey) {
|
|
83
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
84
|
-
var rawSignature, messageBuffer;
|
|
85
|
-
return __generator(this, function (_a) {
|
|
86
|
-
rawSignature = Buffer.from(signature, 'hex');
|
|
87
|
-
messageBuffer = personalMessageToBinary(message);
|
|
88
|
-
return [2 /*return*/, (0, ed25519_1.verify)(Buffer.from(publicKey, 'hex'), messageBuffer, rawSignature)];
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
};
|
|
92
|
-
return AeternityCryptoClient;
|
|
93
|
-
}(Ed25519CryptoClient_1.Ed25519CryptoClient));
|
|
30
|
+
}
|
|
94
31
|
exports.AeternityCryptoClient = AeternityCryptoClient;
|
|
95
32
|
//# sourceMappingURL=AeternityCryptoClient.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AeternityCryptoClient.js","sourceRoot":"","sources":["../../../src/v0/protocol/AeternityCryptoClient.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AeternityCryptoClient.js","sourceRoot":"","sources":["../../../src/v0/protocol/AeternityCryptoClient.ts"],"names":[],"mappings":";;;AAAA,wDAA+D;AAC/D,6EAAkE;AAClE,4FAAwF;AACxF,gDAAiD;AAEjD,MAAM,uBAAuB,GAAG,CAAC,OAAe,EAAU,EAAE;IAC1D,MAAM,MAAM,GAAW,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE,MAAM,CAAC,CAAA;IACzE,MAAM,aAAa,GAAW,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IAC1D,IAAI,aAAa,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;QACjC,MAAM,IAAI,0BAAiB,CAAC,sBAAM,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAA;IACnE,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAA;AAClH,CAAC,CAAA;AAED,MAAa,qBAAsB,SAAQ,yCAAmB;IAC5D;QACE,KAAK,EAAE,CAAA;IACT,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,OAAe,EAAE,OAA+B;QACvE,MAAM,aAAa,GAAW,uBAAuB,CAAC,OAAO,CAAC,CAAA;QAC9D,MAAM,YAAY,GAAe,IAAA,cAAI,EAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,aAAa,CAAC,CAAA;QAE5F,OAAO,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAClD,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,OAAe,EAAE,SAAiB,EAAE,SAAiB;QAC9E,MAAM,YAAY,GAAW,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;QAC1D,MAAM,aAAa,GAAW,uBAAuB,CAAC,OAAO,CAAC,CAAA;QAE9D,OAAO,IAAA,gBAAM,EAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,aAAa,EAAE,YAAY,CAAC,CAAA;IAC3E,CAAC;CACF;AAlBD,sDAkBC"}
|