@rosen-bridge/fraud-extractor 2.2.2 → 3.0.0-7b38188a
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/CHANGELOG.md +25 -0
- package/dist/actions/fraudAction.d.ts +11 -51
- package/dist/actions/fraudAction.d.ts.map +1 -1
- package/dist/actions/fraudAction.js +21 -184
- package/dist/entities/fraudEntity.d.ts +3 -11
- package/dist/entities/fraudEntity.d.ts.map +1 -1
- package/dist/entities/fraudEntity.js +7 -51
- package/dist/extractor/fraudExtractor.d.ts +21 -128
- package/dist/extractor/fraudExtractor.d.ts.map +1 -1
- package/dist/extractor/fraudExtractor.js +48 -229
- package/dist/interfaces/types.d.ts +6 -10
- package/dist/interfaces/types.d.ts.map +1 -1
- package/dist/interfaces/types.js +1 -1
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +5 -3
- package/dist/migrations/postgres/1766229066209-migration.d.ts +7 -0
- package/dist/migrations/postgres/1766229066209-migration.d.ts.map +1 -0
- package/dist/migrations/postgres/1766229066209-migration.js +52 -0
- package/dist/migrations/sqlite/1766226220592-migration.d.ts +7 -0
- package/dist/migrations/sqlite/1766226220592-migration.d.ts.map +1 -0
- package/dist/migrations/sqlite/1766226220592-migration.js +114 -0
- package/package.json +6 -8
- package/dist/constants.d.ts +0 -4
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js +0 -4
|
@@ -1,146 +1,39 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AbstractErgoBoxExtractor, InitializeOptions, TxExtra } from '@rosen-bridge/abstract-extractor';
|
|
2
2
|
import { AbstractLogger } from '@rosen-bridge/abstract-logger';
|
|
3
3
|
import { DataSource } from '@rosen-bridge/extended-typeorm';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
4
|
+
import { InputExtension, OutputBox, Transaction } from '@rosen-bridge/scanner-interfaces';
|
|
5
|
+
import { FraudAction } from '../actions/fraudAction';
|
|
6
|
+
import { FraudEntity } from '../entities/fraudEntity';
|
|
6
7
|
import { ExtractedFraud } from '../interfaces/types';
|
|
7
|
-
export declare class FraudExtractor
|
|
8
|
-
|
|
9
|
-
private readonly actions;
|
|
8
|
+
export declare class FraudExtractor extends AbstractErgoBoxExtractor<ExtractedFraud, FraudEntity> {
|
|
9
|
+
readonly actions: FraudAction;
|
|
10
10
|
private readonly id;
|
|
11
11
|
private readonly ergoTree;
|
|
12
12
|
private readonly rwt;
|
|
13
|
-
|
|
14
|
-
v0: {
|
|
15
|
-
getApiV0AddressesP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0AddressesP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").AddressInfo>;
|
|
16
|
-
getApiV0AddressesP1Transactions: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0AddressesP1TransactionsParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").ItemsTransactionInfo>;
|
|
17
|
-
getApiV0AddressesAssetholdersP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0AddressesAssetholdersP1Params) => Promise<string[]>;
|
|
18
|
-
getApiV0AddressesBalances: (params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0AddressesBalancesParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").ItemsBalanceInfo>;
|
|
19
|
-
getApiV0AssetsIssuingboxes: (params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0AssetsIssuingboxesParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").ItemsOutputInfo>;
|
|
20
|
-
getApiV0AssetsP1Issuingbox: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").OutputInfo[]>;
|
|
21
|
-
getApiV0Blocks: (params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0BlocksParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").ItemsBlockInfo>;
|
|
22
|
-
getApiV0BlocksP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").BlockSummary>;
|
|
23
|
-
getApiV0BlocksAtP1: (p1: number) => Promise<string[]>;
|
|
24
|
-
getApiV0DexTokensP1Unspentsellorders: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0DexTokensP1UnspentsellordersParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").DexSellOrderInfo[]>;
|
|
25
|
-
getApiV0DexTokensP1Unspentbuyorders: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0DexTokensP1UnspentbuyordersParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").DexBuyOrderInfo[]>;
|
|
26
|
-
getApiV0TransactionsP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").TransactionSummary>;
|
|
27
|
-
getApiV0TransactionsUnconfirmedP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").UTransactionSummary>;
|
|
28
|
-
getApiV0TransactionsUnconfirmedByaddressP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0TransactionsUnconfirmedByaddressP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").ItemsUTransactionInfo>;
|
|
29
|
-
getApiV0TransactionsUnconfirmed: (params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0TransactionsUnconfirmedParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").ItemsUTransactionInfo>;
|
|
30
|
-
getApiV0TransactionsSinceP1: (p1: number, params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0TransactionsSinceP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").TransactionInfo[]>;
|
|
31
|
-
postApiV0TransactionsSend: (postApiV0TransactionsSendBody: import("@rosen-clients/ergo-explorer/dist/v0/types").PostApiV0TransactionsSendBody) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").TxIdResponse>;
|
|
32
|
-
getApiV0TransactionsBoxesP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").OutputInfo>;
|
|
33
|
-
getApiV0TransactionsBoxesByergotreeP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").OutputInfo[]>;
|
|
34
|
-
getApiV0TransactionsBoxesByergotreeUnspentP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").OutputInfo[]>;
|
|
35
|
-
getApiV0TransactionsBoxesByaddressP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").OutputInfo[]>;
|
|
36
|
-
getApiV0TransactionsBoxesByaddressUnspentP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").OutputInfo[]>;
|
|
37
|
-
getApiV0Info: () => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").BlockChainInfo>;
|
|
38
|
-
getApiV0InfoSupply: () => Promise<string>;
|
|
39
|
-
getApiV0Stats: () => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").StatsSummary>;
|
|
40
|
-
getApiV0DocsOpenapi: () => Promise<string>;
|
|
41
|
-
};
|
|
42
|
-
v1: {
|
|
43
|
-
getApiV1TransactionsP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").TransactionInfo>;
|
|
44
|
-
getApiV1TransactionsByinputsscripttemplatehashP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1TransactionsByinputsscripttemplatehashP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsTransactionInfo>;
|
|
45
|
-
getApiV1TransactionsByglobalindexStream: (params: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1TransactionsByglobalindexStreamParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ListTransactionInfo>;
|
|
46
|
-
getApiV1BoxesUnspentBylastepochsStream: (params: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesUnspentBylastepochsStreamParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ListOutputInfo>;
|
|
47
|
-
getApiV1BoxesUnspentByglobalindexStream: (params: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesUnspentByglobalindexStreamParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ListOutputInfo>;
|
|
48
|
-
getApiV1BoxesUnspentStream: (params: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesUnspentStreamParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ListOutputInfo>;
|
|
49
|
-
getApiV1BoxesByergotreetemplatehashP1Stream: (p1: string, params: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesByergotreetemplatehashP1StreamParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ListOutputInfo>;
|
|
50
|
-
getApiV1BoxesUnspentByergotreetemplatehashP1Stream: (p1: string, params: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesUnspentByergotreetemplatehashP1StreamParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ListOutputInfo>;
|
|
51
|
-
getApiV1BoxesUnspentBytokenidP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesUnspentBytokenidP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
|
|
52
|
-
getApiV1BoxesBytokenidP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesBytokenidP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
|
|
53
|
-
getApiV1BoxesP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").OutputInfo>;
|
|
54
|
-
getApiV1BoxesByergotreeP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesByergotreeP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
|
|
55
|
-
getApiV1BoxesByergotreetemplatehashP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesByergotreetemplatehashP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
|
|
56
|
-
getApiV1BoxesUnspentByergotreeP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesUnspentByergotreeP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
|
|
57
|
-
getApiV1BoxesUnspentByergotreetemplatehashP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesUnspentByergotreetemplatehashP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
|
|
58
|
-
getApiV1BoxesByaddressP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesByaddressP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
|
|
59
|
-
getApiV1BoxesUnspentUnconfirmedByaddressP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesUnspentUnconfirmedByaddressP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").MOutputInfo[]>;
|
|
60
|
-
getApiV1BoxesUnspentByaddressP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesUnspentByaddressP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
|
|
61
|
-
getApiV1BoxesByglobalindexStream: (params: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesByglobalindexStreamParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ListOutputInfo>;
|
|
62
|
-
postApiV1BoxesUnspentSearchUnion: (boxAssetsQuery: import("@rosen-clients/ergo-explorer/dist/v1/types").BoxAssetsQuery, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").PostApiV1BoxesUnspentSearchUnionParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
|
|
63
|
-
postApiV1BoxesUnspentSearch: (boxQuery: import("@rosen-clients/ergo-explorer/dist/v1/types").BoxQuery, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").PostApiV1BoxesUnspentSearchParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
|
|
64
|
-
postApiV1BoxesSearch: (boxQuery: import("@rosen-clients/ergo-explorer/dist/v1/types").BoxQuery, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").PostApiV1BoxesSearchParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
|
|
65
|
-
getApiV1Tokens: (params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1TokensParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsTokenInfo>;
|
|
66
|
-
getApiV1TokensSearch: (params: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1TokensSearchParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsTokenInfo>;
|
|
67
|
-
getApiV1TokensBysymbolP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").TokenInfo[]>;
|
|
68
|
-
getApiV1TokensP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").TokenInfo>;
|
|
69
|
-
getApiV1Assets: (params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1AssetsParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsTokenInfo>;
|
|
70
|
-
getApiV1AssetsSearchBytokenid: (params: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1AssetsSearchBytokenidParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsAssetInfo>;
|
|
71
|
-
getApiV1EpochsParams: () => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").EpochInfo>;
|
|
72
|
-
getApiV1AddressesP1Transactions: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1AddressesP1TransactionsParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsTransactionInfo>;
|
|
73
|
-
getApiV1AddressesP1BalanceConfirmed: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1AddressesP1BalanceConfirmedParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").Balance>;
|
|
74
|
-
getApiV1AddressesP1BalanceTotal: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").TotalBalance>;
|
|
75
|
-
getApiV1Blocks: (params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BlocksParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsBlockInfo>;
|
|
76
|
-
getApiV1BlocksP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").BlockSummary>;
|
|
77
|
-
getApiV1BlocksHeaders: (params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BlocksHeadersParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsBlockHeader>;
|
|
78
|
-
getApiV1BlocksByglobalindexStream: (params: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BlocksByglobalindexStreamParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ListBlockInfo>;
|
|
79
|
-
getApiV1BlocksStreamSummary: (params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BlocksStreamSummaryParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ListBlockSummaryV1>;
|
|
80
|
-
postApiV1MempoolTransactionsSubmit: (postApiV1MempoolTransactionsSubmitBody: import("@rosen-clients/ergo-explorer/dist/v1/types").PostApiV1MempoolTransactionsSubmitBody) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").TxIdResponse>;
|
|
81
|
-
getApiV1MempoolTransactionsByaddressP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1MempoolTransactionsByaddressP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsUTransactionInfo>;
|
|
82
|
-
getApiV1MempoolBoxesUnspent: () => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ListOutputInfo>;
|
|
83
|
-
getApiV1Info: () => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").NetworkState>;
|
|
84
|
-
getApiV1Networkstate: () => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").NetworkState>;
|
|
85
|
-
getApiV1Networkstats: () => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").NetworkStats>;
|
|
86
|
-
postApiV1ErgotreeConvert: (ergoTreeConversionRequest: import("@rosen-clients/ergo-explorer/dist/v1/types").ErgoTreeConversionRequest) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ErgoTreeHuman>;
|
|
87
|
-
};
|
|
88
|
-
};
|
|
89
|
-
constructor(dataSource: DataSource, id: string, explorerUrl: string, fraudAddress: string, rwt: string, logger?: AbstractLogger);
|
|
13
|
+
constructor(dataSource: DataSource, id: string, rwt: string, initializeOptions: InitializeOptions, logger?: AbstractLogger);
|
|
90
14
|
/**
|
|
91
15
|
* get Id for current extractor
|
|
92
16
|
*/
|
|
93
17
|
getId: () => string;
|
|
94
18
|
/**
|
|
95
|
-
*
|
|
96
|
-
* @param
|
|
97
|
-
* @
|
|
19
|
+
* check proper data format in the box
|
|
20
|
+
* @param box
|
|
21
|
+
* @return true if the box has the required data and false otherwise
|
|
98
22
|
*/
|
|
99
|
-
|
|
23
|
+
hasBoxData: (box: OutputBox) => boolean;
|
|
100
24
|
/**
|
|
101
|
-
*
|
|
102
|
-
* @param
|
|
25
|
+
* extract transaction extra information
|
|
26
|
+
* @param tx
|
|
27
|
+
* @returns transaction extra data containing trigger box id
|
|
103
28
|
*/
|
|
104
|
-
|
|
29
|
+
getTransactionExtraData: (tx: Transaction) => TxExtra;
|
|
105
30
|
/**
|
|
106
|
-
*
|
|
31
|
+
* extract box data to proper format (not including spending information)
|
|
32
|
+
* @param box
|
|
33
|
+
* @param inputExtensions all input box extensions in transaction
|
|
34
|
+
* @param txExtra transaction extra data containing trigger box id
|
|
35
|
+
* @return extracted data in proper format
|
|
107
36
|
*/
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Validate all remaining boxes in the database
|
|
111
|
-
* update the correct ones and remove the invalid ones
|
|
112
|
-
* @param unchangedStoredBoxIds
|
|
113
|
-
* @param initialHeight
|
|
114
|
-
*/
|
|
115
|
-
validateOldStoredFrauds: (unchangedStoredBoxIds: Array<string>, initialHeight: number) => Promise<void>;
|
|
116
|
-
/**
|
|
117
|
-
* Return extracted information of a fraud with its boxId
|
|
118
|
-
* @param boxId
|
|
119
|
-
*/
|
|
120
|
-
getFraudInfoWithBoxId: (boxId: string) => Promise<ExtractedFraud | undefined>;
|
|
121
|
-
/**
|
|
122
|
-
* Get unspent frauds created bellow the initial height
|
|
123
|
-
* @param initialHeight
|
|
124
|
-
* @returns
|
|
125
|
-
*/
|
|
126
|
-
getUnspentFrauds: (initialHeight: number) => Promise<Array<ExtractedFraud>>;
|
|
127
|
-
/**
|
|
128
|
-
* Returns block information of tx
|
|
129
|
-
* @param txId
|
|
130
|
-
*/
|
|
131
|
-
getTxBlock: (txId: string) => Promise<{
|
|
132
|
-
id: string;
|
|
133
|
-
height: number;
|
|
134
|
-
}>;
|
|
135
|
-
/**
|
|
136
|
-
* Returns trigger boxId from fraud transaction id
|
|
137
|
-
* @param txId
|
|
138
|
-
*/
|
|
139
|
-
getTriggerBoxId: (txId: string) => Promise<string | undefined>;
|
|
140
|
-
/**
|
|
141
|
-
* Extract needed information for storing in database from api json outputs
|
|
142
|
-
* @param boxes
|
|
143
|
-
*/
|
|
144
|
-
extractBoxData: (boxes: Array<V1.OutputInfo>) => Promise<ExtractedFraud[]>;
|
|
37
|
+
extractBoxData: (box: OutputBox, _inputExtensions: InputExtension[], txExtra?: TxExtra) => ExtractedFraud | undefined;
|
|
145
38
|
}
|
|
146
39
|
//# sourceMappingURL=fraudExtractor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fraudExtractor.d.ts","sourceRoot":"","sources":["../../lib/extractor/fraudExtractor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fraudExtractor.d.ts","sourceRoot":"","sources":["../../lib/extractor/fraudExtractor.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,OAAO,EACR,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAE5D,OAAO,EACL,cAAc,EACd,SAAS,EACT,WAAW,EACZ,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,qBAAa,cAAe,SAAQ,wBAAwB,CAC1D,cAAc,EACd,WAAW,CACZ;IACC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;gBAG3B,UAAU,EAAE,UAAU,EACtB,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,MAAM,EACX,iBAAiB,EAAE,iBAAiB,EACpC,MAAM,CAAC,EAAE,cAAc;IAczB;;OAEG;IACH,KAAK,eAAsB;IAE3B;;;;OAIG;IACH,UAAU,GAAI,KAAK,SAAS,KAAG,OAAO,CAmBpC;IAEF;;;;OAIG;IACH,uBAAuB,GAAI,IAAI,WAAW,KAAG,OAAO,CAEjD;IAEH;;;;;;OAMG;IACH,cAAc,GACZ,KAAK,SAAS,EACd,kBAAkB,cAAc,EAAE,EAClC,UAAU,OAAO,KAChB,cAAc,GAAG,SAAS,CAuB3B;CACH"}
|
|
@@ -1,262 +1,81 @@
|
|
|
1
1
|
import { Buffer } from 'buffer';
|
|
2
2
|
import * as wasm from 'ergo-lib-wasm-nodejs';
|
|
3
|
-
import {
|
|
4
|
-
import { DummyLogger } from '@rosen-bridge/abstract-logger';
|
|
3
|
+
import { AbstractErgoBoxExtractor, } from '@rosen-bridge/abstract-extractor';
|
|
5
4
|
import JsonBI from '@rosen-bridge/json-bigint';
|
|
6
|
-
import ergoExplorerClientFactory from '@rosen-clients/ergo-explorer';
|
|
7
5
|
import { FraudAction } from '../actions/fraudAction';
|
|
8
|
-
|
|
9
|
-
export class FraudExtractor {
|
|
10
|
-
logger;
|
|
6
|
+
export class FraudExtractor extends AbstractErgoBoxExtractor {
|
|
11
7
|
actions;
|
|
12
8
|
id;
|
|
13
9
|
ergoTree;
|
|
14
10
|
rwt;
|
|
15
|
-
|
|
16
|
-
|
|
11
|
+
constructor(dataSource, id, rwt, initializeOptions, logger) {
|
|
12
|
+
super(initializeOptions, logger);
|
|
17
13
|
this.id = id;
|
|
18
|
-
this.ergoTree = wasm.Address.from_base58(
|
|
14
|
+
this.ergoTree = wasm.Address.from_base58(initializeOptions.address)
|
|
19
15
|
.to_ergo_tree()
|
|
20
16
|
.to_base16_bytes();
|
|
21
17
|
this.rwt = rwt;
|
|
22
|
-
this.
|
|
23
|
-
this.actions = new FraudAction(dataSource, this.logger);
|
|
24
|
-
this.api = ergoExplorerClientFactory(explorerUrl);
|
|
18
|
+
this.actions = new FraudAction(dataSource, this.logger.child('FraudAction'));
|
|
25
19
|
}
|
|
26
20
|
/**
|
|
27
21
|
* get Id for current extractor
|
|
28
22
|
*/
|
|
29
23
|
getId = () => `${this.id}`;
|
|
30
24
|
/**
|
|
31
|
-
*
|
|
32
|
-
* @param
|
|
33
|
-
* @
|
|
25
|
+
* check proper data format in the box
|
|
26
|
+
* @param box
|
|
27
|
+
* @return true if the box has the required data and false otherwise
|
|
34
28
|
*/
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
txs.forEach((transaction) => {
|
|
41
|
-
for (const output of transaction.outputs) {
|
|
42
|
-
if (output.ergoTree !== this.ergoTree ||
|
|
43
|
-
!output.assets ||
|
|
44
|
-
output.assets[0].tokenId !== this.rwt) {
|
|
45
|
-
continue;
|
|
46
|
-
}
|
|
47
|
-
const boxOutput = wasm.ErgoBox.from_json(JsonBI.stringify(output));
|
|
48
|
-
const r4 = boxOutput
|
|
49
|
-
.register_value(wasm.NonMandatoryRegisterId.R4)
|
|
50
|
-
?.to_coll_coll_byte();
|
|
51
|
-
if (!r4) {
|
|
52
|
-
this.logger.debug(`A new fraud box found without correct wid format at height ${block.height}`);
|
|
53
|
-
continue;
|
|
54
|
-
}
|
|
55
|
-
const newFraud = {
|
|
56
|
-
boxId: output.boxId,
|
|
57
|
-
txId: transaction.id,
|
|
58
|
-
triggerBoxId: transaction.inputs[0].boxId,
|
|
59
|
-
wid: Buffer.from(r4[0]).toString('hex'),
|
|
60
|
-
rwtCount: output.assets[0].amount.toString(),
|
|
61
|
-
serialized: Buffer.from(wasm.ErgoBox.from_json(JsonBI.stringify(output)).sigma_serialize_bytes()).toString('base64'),
|
|
62
|
-
};
|
|
63
|
-
newFrauds.push(newFraud);
|
|
64
|
-
this.logger.debug(`new fraud found [${newFraud}] at height ${block.height}`);
|
|
65
|
-
}
|
|
66
|
-
txSpendIds.push({
|
|
67
|
-
txId: transaction.id,
|
|
68
|
-
spendBoxes: transaction.inputs.map((box) => box.boxId),
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
this.actions
|
|
72
|
-
.storeBlockFrauds(newFrauds, block, this.getId())
|
|
73
|
-
.then(async (status) => {
|
|
74
|
-
if (status) {
|
|
75
|
-
if (newFrauds.length > 0)
|
|
76
|
-
this.logger.debug(`successfully stored new frauds at hight ${block.height}`);
|
|
77
|
-
for (const spendIds of txSpendIds)
|
|
78
|
-
await this.actions.spendFrauds(spendIds.spendBoxes, block, this.getId(), spendIds.txId);
|
|
79
|
-
}
|
|
80
|
-
resolve(status);
|
|
81
|
-
})
|
|
82
|
-
.catch((e) => {
|
|
83
|
-
this.logger.error(`An error occurred in processing frauds in block [${block.hash}]: ${e}`);
|
|
84
|
-
reject(e);
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
catch (e) {
|
|
88
|
-
reject(e);
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
};
|
|
92
|
-
/**
|
|
93
|
-
* fork one block and remove all stored information for this block
|
|
94
|
-
* @param hash: block hash
|
|
95
|
-
*/
|
|
96
|
-
forkBlock = async (hash) => {
|
|
97
|
-
await this.actions.deleteBlock(hash, this.getId());
|
|
98
|
-
};
|
|
99
|
-
/**
|
|
100
|
-
* Initializes the database with older frauds
|
|
101
|
-
*/
|
|
102
|
-
initializeBoxes = async (initialBlock) => {
|
|
103
|
-
// Getting unspent boxes
|
|
104
|
-
this.logger.debug(`Initializing fraud table. storing fraud boxes created bellow height ${initialBlock.height}.`);
|
|
105
|
-
const unspentFrauds = await this.getUnspentFrauds(initialBlock.height);
|
|
106
|
-
const unspentBoxIds = unspentFrauds.map((box) => box.boxId);
|
|
107
|
-
this.logger.debug(`Unspent fraud boxIds ${unspentBoxIds}`);
|
|
108
|
-
// Storing extracted boxes
|
|
109
|
-
let allStoredBoxIds = await this.actions.getAllBoxIds(this.getId());
|
|
110
|
-
for (const fraud of unspentFrauds) {
|
|
111
|
-
if (allStoredBoxIds.includes(fraud.boxId)) {
|
|
112
|
-
await this.actions.updateFraud(fraud, this.getId());
|
|
113
|
-
this.logger.info(`Updated the existing unspent fraud with boxId, [${fraud.boxId}]`);
|
|
114
|
-
this.logger.debug(`Updated fraud: [${JSON.stringify(fraud)}]`);
|
|
115
|
-
}
|
|
116
|
-
else {
|
|
117
|
-
await this.actions.insertFraud(fraud, this.getId());
|
|
118
|
-
this.logger.info(`Inserted new unspent fraud with boxId, [${fraud.boxId}]`);
|
|
119
|
-
this.logger.debug(`Inserted fraud: [${JSON.stringify(fraud)}]`);
|
|
120
|
-
}
|
|
29
|
+
hasBoxData = (box) => {
|
|
30
|
+
if (box.ergoTree !== this.ergoTree ||
|
|
31
|
+
box.assets.length === 0 ||
|
|
32
|
+
box.assets[0].tokenId !== this.rwt) {
|
|
33
|
+
return false;
|
|
121
34
|
}
|
|
122
|
-
//
|
|
123
|
-
allStoredBoxIds = difference(allStoredBoxIds, unspentBoxIds);
|
|
124
|
-
// Validating remained boxes
|
|
125
|
-
this.logger.debug(`Validating and updating stored fraud boxes with boxIds ${allStoredBoxIds}`);
|
|
126
|
-
await this.validateOldStoredFrauds(allStoredBoxIds, initialBlock.height);
|
|
127
|
-
};
|
|
128
|
-
/**
|
|
129
|
-
* Validate all remaining boxes in the database
|
|
130
|
-
* update the correct ones and remove the invalid ones
|
|
131
|
-
* @param unchangedStoredBoxIds
|
|
132
|
-
* @param initialHeight
|
|
133
|
-
*/
|
|
134
|
-
validateOldStoredFrauds = async (unchangedStoredBoxIds, initialHeight) => {
|
|
135
|
-
for (const boxId of unchangedStoredBoxIds) {
|
|
136
|
-
const box = await this.getFraudInfoWithBoxId(boxId);
|
|
137
|
-
if (box && box.spendBlock && box.spendHeight) {
|
|
138
|
-
if (box.spendHeight < initialHeight) {
|
|
139
|
-
this.logger.debug(`updating spending information of fraud with boxId [${box.boxId}] spent at height [${box.spendHeight}]`);
|
|
140
|
-
await this.actions.updateSpendBlock(boxId, this.getId(), box.spendBlock, box.spendHeight);
|
|
141
|
-
}
|
|
142
|
-
else {
|
|
143
|
-
this.logger.debug(`fraud with boxId [${box.boxId}] has been spent after the initialization height, updating spending information skipped.`);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
await this.actions.removeFraud(boxId, this.getId());
|
|
148
|
-
this.logger.info(`Removed invalid fraud [${boxId}] in initialization validation`);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
};
|
|
152
|
-
/**
|
|
153
|
-
* Return extracted information of a fraud with its boxId
|
|
154
|
-
* @param boxId
|
|
155
|
-
*/
|
|
156
|
-
getFraudInfoWithBoxId = async (boxId) => {
|
|
35
|
+
// Check if R4 register exists and is valid
|
|
157
36
|
try {
|
|
158
|
-
const
|
|
159
|
-
|
|
37
|
+
const ergoBox = wasm.ErgoBox.from_json(JsonBI.stringify(box));
|
|
38
|
+
const r4 = ergoBox
|
|
39
|
+
.register_value(wasm.NonMandatoryRegisterId.R4)
|
|
40
|
+
?.to_byte_array();
|
|
41
|
+
return r4 != null;
|
|
160
42
|
}
|
|
161
43
|
catch {
|
|
162
|
-
|
|
163
|
-
return undefined;
|
|
44
|
+
return false;
|
|
164
45
|
}
|
|
165
46
|
};
|
|
166
47
|
/**
|
|
167
|
-
*
|
|
168
|
-
* @param
|
|
169
|
-
* @returns
|
|
48
|
+
* extract transaction extra information
|
|
49
|
+
* @param tx
|
|
50
|
+
* @returns transaction extra data containing trigger box id
|
|
170
51
|
*/
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
while (offset < total) {
|
|
175
|
-
boxes = await this.api.v1.getApiV1BoxesUnspentByergotreeP1(this.ergoTree, {
|
|
176
|
-
offset: offset,
|
|
177
|
-
limit: DefaultApiLimit,
|
|
178
|
-
});
|
|
179
|
-
if (!boxes.items) {
|
|
180
|
-
throw new Error('Explorer api output items should not be undefined.');
|
|
181
|
-
}
|
|
182
|
-
allBoxes = [
|
|
183
|
-
...allBoxes,
|
|
184
|
-
...(await this.extractBoxData(boxes.items.filter((box) => box.creationHeight < initialHeight &&
|
|
185
|
-
box.assets &&
|
|
186
|
-
box.assets[0].tokenId == this.rwt))),
|
|
187
|
-
];
|
|
188
|
-
total = boxes.total;
|
|
189
|
-
offset += DefaultApiLimit;
|
|
190
|
-
}
|
|
191
|
-
return allBoxes;
|
|
192
|
-
};
|
|
52
|
+
getTransactionExtraData = (tx) => ({
|
|
53
|
+
triggerBoxId: tx.inputs[0].boxId,
|
|
54
|
+
});
|
|
193
55
|
/**
|
|
194
|
-
*
|
|
195
|
-
* @param
|
|
56
|
+
* extract box data to proper format (not including spending information)
|
|
57
|
+
* @param box
|
|
58
|
+
* @param inputExtensions all input box extensions in transaction
|
|
59
|
+
* @param txExtra transaction extra data containing trigger box id
|
|
60
|
+
* @return extracted data in proper format
|
|
196
61
|
*/
|
|
197
|
-
|
|
198
|
-
const
|
|
62
|
+
extractBoxData = (box, _inputExtensions, txExtra) => {
|
|
63
|
+
const triggerBoxId = txExtra?.triggerBoxId;
|
|
64
|
+
if (!triggerBoxId) {
|
|
65
|
+
throw new Error(`ImpossibleBehaviour: Trigger boxId is missing for box ${box.boxId}, txExtra: ${JSON.stringify(txExtra)}`);
|
|
66
|
+
}
|
|
67
|
+
const ergoBox = wasm.ErgoBox.from_json(JsonBI.stringify(box));
|
|
68
|
+
const r4 = ergoBox
|
|
69
|
+
.register_value(wasm.NonMandatoryRegisterId.R4)
|
|
70
|
+
?.to_byte_array();
|
|
199
71
|
return {
|
|
200
|
-
|
|
201
|
-
|
|
72
|
+
identifier: ergoBox.box_id().to_str(),
|
|
73
|
+
triggerBoxId,
|
|
74
|
+
txId: box.transactionId,
|
|
75
|
+
wid: Buffer.from(r4).toString('hex'),
|
|
76
|
+
rwtCount: box.assets[0].amount.toString(),
|
|
77
|
+
serialized: Buffer.from(ergoBox.sigma_serialize_bytes()).toString('base64'),
|
|
202
78
|
};
|
|
203
79
|
};
|
|
204
|
-
/**
|
|
205
|
-
* Returns trigger boxId from fraud transaction id
|
|
206
|
-
* @param txId
|
|
207
|
-
*/
|
|
208
|
-
getTriggerBoxId = async (txId) => {
|
|
209
|
-
const tx = await this.api.v1.getApiV1TransactionsP1(txId);
|
|
210
|
-
return tx.inputs?.[0].boxId;
|
|
211
|
-
};
|
|
212
|
-
/**
|
|
213
|
-
* Extract needed information for storing in database from api json outputs
|
|
214
|
-
* @param boxes
|
|
215
|
-
*/
|
|
216
|
-
extractBoxData = async (boxes) => {
|
|
217
|
-
const extractedFrauds = [];
|
|
218
|
-
for (const box of boxes) {
|
|
219
|
-
try {
|
|
220
|
-
this.logger.debug(`Extracting box fraud information from box with boxId [${box.boxId}]`);
|
|
221
|
-
let spendBlock, spendHeight;
|
|
222
|
-
// Extract spending information
|
|
223
|
-
if (box.spentTransactionId) {
|
|
224
|
-
const block = await this.getTxBlock(box.spentTransactionId);
|
|
225
|
-
spendBlock = block.id;
|
|
226
|
-
spendHeight = block.height;
|
|
227
|
-
}
|
|
228
|
-
// Extract WID
|
|
229
|
-
const ergoBox = wasm.ErgoBox.from_json(JsonBI.stringify(box));
|
|
230
|
-
const r4 = ergoBox
|
|
231
|
-
.register_value(wasm.NonMandatoryRegisterId.R4)
|
|
232
|
-
?.to_coll_coll_byte();
|
|
233
|
-
// Extract trigger boxId
|
|
234
|
-
const triggerBoxId = await this.getTriggerBoxId(box.transactionId);
|
|
235
|
-
if (!r4 || !triggerBoxId) {
|
|
236
|
-
this.logger.warn(`Skipping storing fraud with boxId [${box.boxId}], wid or trigger box id is undefined`);
|
|
237
|
-
continue;
|
|
238
|
-
}
|
|
239
|
-
const extractedFraud = {
|
|
240
|
-
boxId: ergoBox.box_id().to_str(),
|
|
241
|
-
triggerBoxId: triggerBoxId,
|
|
242
|
-
wid: Buffer.from(r4[0]).toString('hex'),
|
|
243
|
-
rwtCount: box.assets[0].amount.toString(),
|
|
244
|
-
serialized: Buffer.from(ergoBox.sigma_serialize_bytes()).toString('base64'),
|
|
245
|
-
blockId: box.blockId,
|
|
246
|
-
height: box.settlementHeight,
|
|
247
|
-
txId: box.transactionId,
|
|
248
|
-
spendBlock: spendBlock,
|
|
249
|
-
spendHeight: spendHeight,
|
|
250
|
-
spendTxId: box.spentTransactionId,
|
|
251
|
-
};
|
|
252
|
-
extractedFrauds.push(extractedFraud);
|
|
253
|
-
this.logger.debug(`Extracted fraud: [${extractedFraud}]`);
|
|
254
|
-
}
|
|
255
|
-
catch (e) {
|
|
256
|
-
this.logger.error(`Extracting fraud information failed for box [${box.boxId}] with error: ${e}`);
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
return extractedFrauds;
|
|
260
|
-
};
|
|
261
80
|
}
|
|
262
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhdWRFeHRyYWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZXh0cmFjdG9yL2ZyYXVkRXh0cmFjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDaEMsT0FBTyxLQUFLLElBQUksTUFBTSxzQkFBc0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBR3ZDLE9BQU8sRUFBa0IsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFNUUsT0FBTyxNQUFNLE1BQU0sMkJBQTJCLENBQUM7QUFNL0MsT0FBTyx5QkFBeUIsTUFBTSw4QkFBOEIsQ0FBQztBQUdyRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUcvQyxNQUFNLE9BQU8sY0FBYztJQUNSLE1BQU0sQ0FBaUI7SUFDdkIsT0FBTyxDQUFjO0lBQ3JCLEVBQUUsQ0FBUztJQUNYLFFBQVEsQ0FBUztJQUNqQixHQUFHLENBQVM7SUFDcEIsR0FBRyxDQUFDO0lBRWIsWUFDRSxVQUFzQixFQUN0QixFQUFVLEVBQ1YsV0FBbUIsRUFDbkIsWUFBb0IsRUFDcEIsR0FBVyxFQUNYLE1BQXVCO1FBRXZCLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUM7YUFDbkQsWUFBWSxFQUFFO2FBQ2QsZUFBZSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ2xELElB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QUFDLEVBQUUsQ0FDOUUsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQyxDQUFDO0NBQ0giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0ICogYXMgd2FzbSBmcm9tICdlcmdvLWxpYi13YXNtLW5vZGVqcyc7XG5pbXBvcnQgeyBkaWZmZXJlbmNlIH0gZnJvbSAnbG9kYXNoLWVzJztcblxuaW1wb3J0IHsgQWJzdHJhY3RFeHRyYWN0b3IgfSBmcm9tICdAcm9zZW4tYnJpZGdlL2Fic3RyYWN0LWV4dHJhY3Rvcic7XG5pbXBvcnQgeyBBYnN0cmFjdExvZ2dlciwgRHVtbXlMb2dnZXIgfSBmcm9tICdAcm9zZW4tYnJpZGdlL2Fic3RyYWN0LWxvZ2dlcic7XG5pbXBvcnQgeyBEYXRhU291cmNlIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9leHRlbmRlZC10eXBlb3JtJztcbmltcG9ydCBKc29uQkkgZnJvbSAnQHJvc2VuLWJyaWRnZS9qc29uLWJpZ2ludCc7XG5pbXBvcnQge1xuICBCbG9jayxcbiAgQmxvY2tJbmZvLFxuICBUcmFuc2FjdGlvbixcbn0gZnJvbSAnQHJvc2VuLWJyaWRnZS9zY2FubmVyLWludGVyZmFjZXMnO1xuaW1wb3J0IGVyZ29FeHBsb3JlckNsaWVudEZhY3RvcnkgZnJvbSAnQHJvc2VuLWNsaWVudHMvZXJnby1leHBsb3Jlcic7XG5pbXBvcnQgeyBWMSB9IGZyb20gJ0Byb3Nlbi1jbGllbnRzL2VyZ28tZXhwbG9yZXInO1xuXG5pbXBvcnQgeyBGcmF1ZEFjdGlvbiB9IGZyb20gJy4uL2FjdGlvbnMvZnJhdWRBY3Rpb24nO1xuaW1wb3J0IHsgRGVmYXVsdEFwaUxpbWl0IH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IEV4dHJhY3RlZEZyYXVkIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBGcmF1ZEV4dHJhY3RvciBpbXBsZW1lbnRzIEFic3RyYWN0RXh0cmFjdG9yPFRyYW5zYWN0aW9uPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBBYnN0cmFjdExvZ2dlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBhY3Rpb25zOiBGcmF1ZEFjdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSBpZDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGVyZ29UcmVlOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcnd0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFwaTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBkYXRhU291cmNlOiBEYXRhU291cmNlLFxuICAgIGlkOiBzdHJpbmcsXG4gICAgZXhwbG9yZXJVcmw6IHN0cmluZyxcbiAgICBmcmF1ZEFkZHJlc3M6IHN0cmluZyxcbiAgICByd3Q6IHN0cmluZyxcbiAgICBsb2dnZXI/OiBBYnN0cmFjdExvZ2dlcixcbiAgKSB7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMuZXJnb1RyZWUgPSB3YXNtLkFkZHJlc3MuZnJvbV9iYXNlNTgoZnJhdWRBZGRyZXNzKVxuICAgICAgLnRvX2VyZ29fdHJlZSgpXG4gICAgICAudG9fYmFzZTE2X2J5dGVzKCk7XG4gICAgdGhpcy5yd3QgPSByd3Q7XG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXIgPyBsb2dnZXIgOiBuZXcgRHVtbXlMb2dnZXIoKTtcbiAgICB0aGlzLmFjdGlvbnMgPSBuZXcgRnJhdWRBY3Rpb24oZGF0YVNvdXJjZSwgdGhpcy5sb2dnZXIpO1xuICAgIHRoaXMuYXBpID0gZXJnb0V4cGxvcmVyQ2xpZW50RmFjdG9yeShleHBsb3JlclVybCk7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IElkIGZvciBjdXJyZW50IGV4dHJhY3RvclxuICAgKi9cbiAgZ2V0SWQgPSAoKSA9PiBgJHt0aGlzLmlkfWA7XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgZnJhdWQgYm94ZXMgaW4gdGhlIHNwZWNpZmllZCBibG9jayB0cmFuc2FjdGlvbnNcbiAgICogQHBhcmFtIHR4c1xuICAgKiBAcGFyYW0gYmxvY2tcbiAgICovXG4gIHByb2Nlc3NUcmFuc2FjdGlvbnMgPSAoXG4gICAgdHhzOiBBcnJheTxUcmFuc2FjdGlvbj4sXG4gICAgYmxvY2s6IEJsb2NrLFxuICApOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbmV3RnJhdWRzOiBBcnJheTxFeHRyYWN0ZWRGcmF1ZD4gPSBbXTtcbiAgICAgICAgY29uc3QgdHhTcGVuZElkczogQXJyYXk8eyB0eElkOiBzdHJpbmc7IHNwZW5kQm94ZXM6IEFycmF5PHN0cmluZz4gfT4gPVxuICAgICAgICAgIFtdO1xuICAgICAgICB0eHMuZm9yRWFjaCgodHJhbnNhY3Rpb24pID0+IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG91dHB1dCBvZiB0cmFuc2FjdGlvbi5vdXRwdXRzKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIG91dHB1dC5lcmdvVHJlZSAhPT0gdGhpcy5lcmdvVHJlZSB8fFxuICAgICAgICAgICAgICAhb3V0cHV0LmFzc2V0cyB8fFxuICAgICAgICAgICAgICBvdXRwdXQuYXNzZXRzWzBdLnRva2VuSWQgIT09IHRoaXMucnd0XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBib3hPdXRwdXQgPSB3YXNtLkVyZ29Cb3guZnJvbV9qc29uKEpzb25CSS5zdHJpbmdpZnkob3V0cHV0KSk7XG4gICAgICAgICAgICBjb25zdCByNCA9IGJveE91dHB1dFxuICAgICAgICAgICAgICAucmVnaXN0ZXJfdmFsdWUod2FzbS5Ob25NYW5kYXRvcnlSZWdpc3RlcklkLlI0KVxuICAgICAgICAgICAgICA/LnRvX2NvbGxfY29sbF9ieXRlKCk7XG4gICAgICAgICAgICBpZiAoIXI0KSB7XG4gICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBBIG5ldyBmcmF1ZCBib3ggZm91bmQgd2l0aG91dCBjb3JyZWN0IHdpZCBmb3JtYXQgYXQgaGVpZ2h0ICR7YmxvY2suaGVpZ2h0fWAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmV3RnJhdWQgPSB7XG4gICAgICAgICAgICAgIGJveElkOiBvdXRwdXQuYm94SWQsXG4gICAgICAgICAgICAgIHR4SWQ6IHRyYW5zYWN0aW9uLmlkLFxuICAgICAgICAgICAgICB0cmlnZ2VyQm94SWQ6IHRyYW5zYWN0aW9uLmlucHV0c1swXS5ib3hJZCxcbiAgICAgICAgICAgICAgd2lkOiBCdWZmZXIuZnJvbShyNFswXSkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgICAgICByd3RDb3VudDogb3V0cHV0LmFzc2V0c1swXS5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgc2VyaWFsaXplZDogQnVmZmVyLmZyb20oXG4gICAgICAgICAgICAgICAgd2FzbS5FcmdvQm94LmZyb21fanNvbihcbiAgICAgICAgICAgICAgICAgIEpzb25CSS5zdHJpbmdpZnkob3V0cHV0KSxcbiAgICAgICAgICAgICAgICApLnNpZ21hX3NlcmlhbGl6ZV9ieXRlcygpLFxuICAgICAgICAgICAgICApLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBuZXdGcmF1ZHMucHVzaChuZXdGcmF1ZCk7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgYG5ldyBmcmF1ZCBmb3VuZCBbJHtuZXdGcmF1ZH1dIGF0IGhlaWdodCAke2Jsb2NrLmhlaWdodH1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHhTcGVuZElkcy5wdXNoKHtcbiAgICAgICAgICAgIHR4SWQ6IHRyYW5zYWN0aW9uLmlkLFxuICAgICAgICAgICAgc3BlbmRCb3hlczogdHJhbnNhY3Rpb24uaW5wdXRzLm1hcCgoYm94KSA9PiBib3guYm94SWQpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hY3Rpb25zXG4gICAgICAgICAgLnN0b3JlQmxvY2tGcmF1ZHMobmV3RnJhdWRzLCBibG9jaywgdGhpcy5nZXRJZCgpKVxuICAgICAgICAgIC50aGVuKGFzeW5jIChzdGF0dXMpID0+IHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgICAgaWYgKG5ld0ZyYXVkcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgYHN1Y2Nlc3NmdWxseSBzdG9yZWQgbmV3IGZyYXVkcyBhdCBoaWdodCAke2Jsb2NrLmhlaWdodH1gLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGZvciAoY29uc3Qgc3BlbmRJZHMgb2YgdHhTcGVuZElkcylcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFjdGlvbnMuc3BlbmRGcmF1ZHMoXG4gICAgICAgICAgICAgICAgICBzcGVuZElkcy5zcGVuZEJveGVzLFxuICAgICAgICAgICAgICAgICAgYmxvY2ssXG4gICAgICAgICAgICAgICAgICB0aGlzLmdldElkKCksXG4gICAgICAgICAgICAgICAgICBzcGVuZElkcy50eElkLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKHN0YXR1cyk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICBgQW4gZXJyb3Igb2NjdXJyZWQgaW4gcHJvY2Vzc2luZyBmcmF1ZHMgaW4gYmxvY2sgWyR7YmxvY2suaGFzaH1dOiAke2V9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogZm9yayBvbmUgYmxvY2sgYW5kIHJlbW92ZSBhbGwgc3RvcmVkIGluZm9ybWF0aW9uIGZvciB0aGlzIGJsb2NrXG4gICAqIEBwYXJhbSBoYXNoOiBibG9jayBoYXNoXG4gICAqL1xuICBmb3JrQmxvY2sgPSBhc3luYyAoaGFzaDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgYXdhaXQgdGhpcy5hY3Rpb25zLmRlbGV0ZUJsb2NrKGhhc2gsIHRoaXMuZ2V0SWQoKSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBkYXRhYmFzZSB3aXRoIG9sZGVyIGZyYXVkc1xuICAgKi9cbiAgaW5pdGlhbGl6ZUJveGVzID0gYXN5bmMgKGluaXRpYWxCbG9jazogQmxvY2tJbmZvKSA9PiB7XG4gICAgLy8gR2V0dGluZyB1bnNwZW50IGJveGVzXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICBgSW5pdGlhbGl6aW5nIGZyYXVkIHRhYmxlLiBzdG9yaW5nIGZyYXVkIGJveGVzIGNyZWF0ZWQgYmVsbG93IGhlaWdodCAke2luaXRpYWxCbG9jay5oZWlnaHR9LmAsXG4gICAgKTtcbiAgICBjb25zdCB1bnNwZW50RnJhdWRzID0gYXdhaXQgdGhpcy5nZXRVbnNwZW50RnJhdWRzKGluaXRpYWxCbG9jay5oZWlnaHQpO1xuICAgIGNvbnN0IHVuc3BlbnRCb3hJZHMgPSB1bnNwZW50RnJhdWRzLm1hcCgoYm94KSA9PiBib3guYm94SWQpO1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBVbnNwZW50IGZyYXVkIGJveElkcyAke3Vuc3BlbnRCb3hJZHN9YCk7XG5cbiAgICAvLyBTdG9yaW5nIGV4dHJhY3RlZCBib3hlc1xuICAgIGxldCBhbGxTdG9yZWRCb3hJZHMgPSBhd2FpdCB0aGlzLmFjdGlvbnMuZ2V0QWxsQm94SWRzKHRoaXMuZ2V0SWQoKSk7XG4gICAgZm9yIChjb25zdCBmcmF1ZCBvZiB1bnNwZW50RnJhdWRzKSB7XG4gICAgICBpZiAoYWxsU3RvcmVkQm94SWRzLmluY2x1ZGVzKGZyYXVkLmJveElkKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFjdGlvbnMudXBkYXRlRnJhdWQoZnJhdWQsIHRoaXMuZ2V0SWQoKSk7XG4gICAgICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICAgICAgYFVwZGF0ZWQgdGhlIGV4aXN0aW5nIHVuc3BlbnQgZnJhdWQgd2l0aCBib3hJZCwgWyR7ZnJhdWQuYm94SWR9XWAsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBVcGRhdGVkIGZyYXVkOiBbJHtKU09OLnN0cmluZ2lmeShmcmF1ZCl9XWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hY3Rpb25zLmluc2VydEZyYXVkKGZyYXVkLCB0aGlzLmdldElkKCkpO1xuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBJbnNlcnRlZCBuZXcgdW5zcGVudCBmcmF1ZCB3aXRoIGJveElkLCBbJHtmcmF1ZC5ib3hJZH1dYCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYEluc2VydGVkIGZyYXVkOiBbJHtKU09OLnN0cmluZ2lmeShmcmF1ZCl9XWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSB1cGRhdGVkIGJveCBpZHMgZnJvbSBleGlzdGluZyBib3hlcyBpbiBkYXRhYmFzZVxuICAgIGFsbFN0b3JlZEJveElkcyA9IGRpZmZlcmVuY2UoYWxsU3RvcmVkQm94SWRzLCB1bnNwZW50Qm94SWRzKTtcbiAgICAvLyBWYWxpZGF0aW5nIHJlbWFpbmVkIGJveGVzXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICBgVmFsaWRhdGluZyBhbmQgdXBkYXRpbmcgc3RvcmVkIGZyYXVkIGJveGVzIHdpdGggYm94SWRzICR7YWxsU3RvcmVkQm94SWRzfWAsXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlT2xkU3RvcmVkRnJhdWRzKGFsbFN0b3JlZEJveElkcywgaW5pdGlhbEJsb2NrLmhlaWdodCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFsbCByZW1haW5pbmcgYm94ZXMgaW4gdGhlIGRhdGFiYXNlXG4gICAqIHVwZGF0ZSB0aGUgY29ycmVjdCBvbmVzIGFuZCByZW1vdmUgdGhlIGludmFsaWQgb25lc1xuICAgKiBAcGFyYW0gdW5jaGFuZ2VkU3RvcmVkQm94SWRzXG4gICAqIEBwYXJhbSBpbml0aWFsSGVpZ2h0XG4gICAqL1xuICB2YWxpZGF0ZU9sZFN0b3JlZEZyYXVkcyA9IGFzeW5jIChcbiAgICB1bmNoYW5nZWRTdG9yZWRCb3hJZHM6IEFycmF5PHN0cmluZz4sXG4gICAgaW5pdGlhbEhlaWdodDogbnVtYmVyLFxuICApID0+IHtcbiAgICBmb3IgKGNvbnN0IGJveElkIG9mIHVuY2hhbmdlZFN0b3JlZEJveElkcykge1xuICAgICAgY29uc3QgYm94ID0gYXdhaXQgdGhpcy5nZXRGcmF1ZEluZm9XaXRoQm94SWQoYm94SWQpO1xuICAgICAgaWYgKGJveCAmJiBib3guc3BlbmRCbG9jayAmJiBib3guc3BlbmRIZWlnaHQpIHtcbiAgICAgICAgaWYgKGJveC5zcGVuZEhlaWdodCA8IGluaXRpYWxIZWlnaHQpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGB1cGRhdGluZyBzcGVuZGluZyBpbmZvcm1hdGlvbiBvZiBmcmF1ZCB3aXRoIGJveElkIFske2JveC5ib3hJZH1dIHNwZW50IGF0IGhlaWdodCBbJHtib3guc3BlbmRIZWlnaHR9XWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFjdGlvbnMudXBkYXRlU3BlbmRCbG9jayhcbiAgICAgICAgICAgIGJveElkLFxuICAgICAgICAgICAgdGhpcy5nZXRJZCgpLFxuICAgICAgICAgICAgYm94LnNwZW5kQmxvY2ssXG4gICAgICAgICAgICBib3guc3BlbmRIZWlnaHQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBmcmF1ZCB3aXRoIGJveElkIFske2JveC5ib3hJZH1dIGhhcyBiZWVuIHNwZW50IGFmdGVyIHRoZSBpbml0aWFsaXphdGlvbiBoZWlnaHQsIHVwZGF0aW5nIHNwZW5kaW5nIGluZm9ybWF0aW9uIHNraXBwZWQuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLmFjdGlvbnMucmVtb3ZlRnJhdWQoYm94SWQsIHRoaXMuZ2V0SWQoKSk7XG4gICAgICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICAgICAgYFJlbW92ZWQgaW52YWxpZCBmcmF1ZCBbJHtib3hJZH1dIGluIGluaXRpYWxpemF0aW9uIHZhbGlkYXRpb25gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJuIGV4dHJhY3RlZCBpbmZvcm1hdGlvbiBvZiBhIGZyYXVkIHdpdGggaXRzIGJveElkXG4gICAqIEBwYXJhbSBib3hJZFxuICAgKi9cbiAgZ2V0RnJhdWRJbmZvV2l0aEJveElkID0gYXN5bmMgKFxuICAgIGJveElkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8RXh0cmFjdGVkRnJhdWQgfCB1bmRlZmluZWQ+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYm94ID0gYXdhaXQgdGhpcy5hcGkudjEuZ2V0QXBpVjFCb3hlc1AxKGJveElkKTtcbiAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5leHRyYWN0Qm94RGF0YShbYm94XSkpWzBdO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5sb2dnZXIud2FybihgQm94IHdpdGggaWQgWyR7Ym94SWR9XSBkb2VzIG5vdCBleGlzdHNgKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgdW5zcGVudCBmcmF1ZHMgY3JlYXRlZCBiZWxsb3cgdGhlIGluaXRpYWwgaGVpZ2h0XG4gICAqIEBwYXJhbSBpbml0aWFsSGVpZ2h0XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXRVbnNwZW50RnJhdWRzID0gYXN5bmMgKFxuICAgIGluaXRpYWxIZWlnaHQ6IG51bWJlcixcbiAgKTogUHJvbWlzZTxBcnJheTxFeHRyYWN0ZWRGcmF1ZD4+ID0+IHtcbiAgICBsZXQgYWxsQm94ZXM6IEFycmF5PEV4dHJhY3RlZEZyYXVkPiA9IFtdO1xuICAgIGxldCBvZmZzZXQgPSAwLFxuICAgICAgdG90YWwgPSBEZWZhdWx0QXBpTGltaXQsXG4gICAgICBib3hlczogVjEuSXRlbXNPdXRwdXRJbmZvO1xuICAgIHdoaWxlIChvZmZzZXQgPCB0b3RhbCkge1xuICAgICAgYm94ZXMgPSBhd2FpdCB0aGlzLmFwaS52MS5nZXRBcGlWMUJveGVzVW5zcGVudEJ5ZXJnb3RyZWVQMShcbiAgICAgICAgdGhpcy5lcmdvVHJlZSxcbiAgICAgICAge1xuICAgICAgICAgIG9mZnNldDogb2Zmc2V0LFxuICAgICAgICAgIGxpbWl0OiBEZWZhdWx0QXBpTGltaXQsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgaWYgKCFib3hlcy5pdGVtcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGxvcmVyIGFwaSBvdXRwdXQgaXRlbXMgc2hvdWxkIG5vdCBiZSB1bmRlZmluZWQuJyk7XG4gICAgICB9XG4gICAgICBhbGxCb3hlcyA9IFtcbiAgICAgICAgLi4uYWxsQm94ZXMsXG4gICAgICAgIC4uLihhd2FpdCB0aGlzLmV4dHJhY3RCb3hEYXRhKFxuICAgICAgICAgIGJveGVzLml0ZW1zLmZpbHRlcihcbiAgICAgICAgICAgIChib3gpID0+XG4gICAgICAgICAgICAgIGJveC5jcmVhdGlvbkhlaWdodCA8IGluaXRpYWxIZWlnaHQgJiZcbiAgICAgICAgICAgICAgYm94LmFzc2V0cyAmJlxuICAgICAgICAgICAgICBib3guYXNzZXRzWzBdLnRva2VuSWQgPT0gdGhpcy5yd3QsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSksXG4gICAgICBdO1xuICAgICAgdG90YWwgPSBib3hlcy50b3RhbDtcbiAgICAgIG9mZnNldCArPSBEZWZhdWx0QXBpTGltaXQ7XG4gICAgfVxuICAgIHJldHVybiBhbGxCb3hlcztcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyBibG9jayBpbmZvcm1hdGlvbiBvZiB0eFxuICAgKiBAcGFyYW0gdHhJZFxuICAgKi9cbiAgZ2V0VHhCbG9jayA9IGFzeW5jICh0eElkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHRoaXMuYXBpLnYxLmdldEFwaVYxVHJhbnNhY3Rpb25zUDEodHhJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0eC5ibG9ja0lkLFxuICAgICAgaGVpZ2h0OiB0eC5pbmNsdXNpb25IZWlnaHQsXG4gICAgfTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB0cmlnZ2VyIGJveElkIGZyb20gZnJhdWQgdHJhbnNhY3Rpb24gaWRcbiAgICogQHBhcmFtIHR4SWRcbiAgICovXG4gIGdldFRyaWdnZXJCb3hJZCA9IGFzeW5jICh0eElkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHRoaXMuYXBpLnYxLmdldEFwaVYxVHJhbnNhY3Rpb25zUDEodHhJZCk7XG4gICAgcmV0dXJuIHR4LmlucHV0cz8uWzBdLmJveElkO1xuICB9O1xuXG4gIC8qKlxuICAgKiBFeHRyYWN0IG5lZWRlZCBpbmZvcm1hdGlvbiBmb3Igc3RvcmluZyBpbiBkYXRhYmFzZSBmcm9tIGFwaSBqc29uIG91dHB1dHNcbiAgICogQHBhcmFtIGJveGVzXG4gICAqL1xuICBleHRyYWN0Qm94RGF0YSA9IGFzeW5jIChib3hlczogQXJyYXk8VjEuT3V0cHV0SW5mbz4pID0+IHtcbiAgICBjb25zdCBleHRyYWN0ZWRGcmF1ZHM6IEFycmF5PEV4dHJhY3RlZEZyYXVkPiA9IFtdO1xuICAgIGZvciAoY29uc3QgYm94IG9mIGJveGVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICBgRXh0cmFjdGluZyBib3ggZnJhdWQgaW5mb3JtYXRpb24gZnJvbSBib3ggd2l0aCBib3hJZCBbJHtib3guYm94SWR9XWAsXG4gICAgICAgICk7XG4gICAgICAgIGxldCBzcGVuZEJsb2NrLCBzcGVuZEhlaWdodDtcbiAgICAgICAgLy8gRXh0cmFjdCBzcGVuZGluZyBpbmZvcm1hdGlvblxuICAgICAgICBpZiAoYm94LnNwZW50VHJhbnNhY3Rpb25JZCkge1xuICAgICAgICAgIGNvbnN0IGJsb2NrID0gYXdhaXQgdGhpcy5nZXRUeEJsb2NrKGJveC5zcGVudFRyYW5zYWN0aW9uSWQpO1xuICAgICAgICAgIHNwZW5kQmxvY2sgPSBibG9jay5pZDtcbiAgICAgICAgICBzcGVuZEhlaWdodCA9IGJsb2NrLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICAvLyBFeHRyYWN0IFdJRFxuICAgICAgICBjb25zdCBlcmdvQm94ID0gd2FzbS5FcmdvQm94LmZyb21fanNvbihKc29uQkkuc3RyaW5naWZ5KGJveCkpO1xuICAgICAgICBjb25zdCByNCA9IGVyZ29Cb3hcbiAgICAgICAgICAucmVnaXN0ZXJfdmFsdWUod2FzbS5Ob25NYW5kYXRvcnlSZWdpc3RlcklkLlI0KVxuICAgICAgICAgID8udG9fY29sbF9jb2xsX2J5dGUoKTtcbiAgICAgICAgLy8gRXh0cmFjdCB0cmlnZ2VyIGJveElkXG4gICAgICAgIGNvbnN0IHRyaWdnZXJCb3hJZCA9IGF3YWl0IHRoaXMuZ2V0VHJpZ2dlckJveElkKGJveC50cmFuc2FjdGlvbklkKTtcbiAgICAgICAgaWYgKCFyNCB8fCAhdHJpZ2dlckJveElkKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgIGBTa2lwcGluZyBzdG9yaW5nIGZyYXVkIHdpdGggYm94SWQgWyR7Ym94LmJveElkfV0sIHdpZCBvciB0cmlnZ2VyIGJveCBpZCBpcyB1bmRlZmluZWRgLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBleHRyYWN0ZWRGcmF1ZCA9IHtcbiAgICAgICAgICBib3hJZDogZXJnb0JveC5ib3hfaWQoKS50b19zdHIoKSxcbiAgICAgICAgICB0cmlnZ2VyQm94SWQ6IHRyaWdnZXJCb3hJZCxcbiAgICAgICAgICB3aWQ6IEJ1ZmZlci5mcm9tKHI0WzBdKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgcnd0Q291bnQ6IGJveC5hc3NldHMhWzBdLmFtb3VudC50b1N0cmluZygpLFxuICAgICAgICAgIHNlcmlhbGl6ZWQ6IEJ1ZmZlci5mcm9tKGVyZ29Cb3guc2lnbWFfc2VyaWFsaXplX2J5dGVzKCkpLnRvU3RyaW5nKFxuICAgICAgICAgICAgJ2Jhc2U2NCcsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBibG9ja0lkOiBib3guYmxvY2tJZCxcbiAgICAgICAgICBoZWlnaHQ6IGJveC5zZXR0bGVtZW50SGVpZ2h0LFxuICAgICAgICAgIHR4SWQ6IGJveC50cmFuc2FjdGlvbklkLFxuICAgICAgICAgIHNwZW5kQmxvY2s6IHNwZW5kQmxvY2ssXG4gICAgICAgICAgc3BlbmRIZWlnaHQ6IHNwZW5kSGVpZ2h0LFxuICAgICAgICAgIHNwZW5kVHhJZDogYm94LnNwZW50VHJhbnNhY3Rpb25JZCxcbiAgICAgICAgfTtcbiAgICAgICAgZXh0cmFjdGVkRnJhdWRzLnB1c2goZXh0cmFjdGVkRnJhdWQpO1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgRXh0cmFjdGVkIGZyYXVkOiBbJHtleHRyYWN0ZWRGcmF1ZH1dYCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBFeHRyYWN0aW5nIGZyYXVkIGluZm9ybWF0aW9uIGZhaWxlZCBmb3IgYm94IFske2JveC5ib3hJZH1dIHdpdGggZXJyb3I6ICR7ZX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZXh0cmFjdGVkRnJhdWRzO1xuICB9O1xufVxuIl19
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhdWRFeHRyYWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZXh0cmFjdG9yL2ZyYXVkRXh0cmFjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDaEMsT0FBTyxLQUFLLElBQUksTUFBTSxzQkFBc0IsQ0FBQztBQUU3QyxPQUFPLEVBQ0wsd0JBQXdCLEdBR3pCLE1BQU0sa0NBQWtDLENBQUM7QUFHMUMsT0FBTyxNQUFNLE1BQU0sMkJBQTJCLENBQUM7QUFPL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBSXJELE1BQU0sT0FBTyxjQUFlLFNBQVEsd0JBR25DO0lBQ1UsT0FBTyxDQUFjO0lBQ2IsRUFBRSxDQUFTO0lBQ1gsUUFBUSxDQUFTO0lBQ2pCLEdBQUcsQ0FBUztJQUU3QixZQUNFLFVBQXNCLEVBQ3RCLEVBQVUsRUFDVixHQUFXLEVBQ1gsaUJBQW9DLEVBQ3BDLE1BQXVCO1FBRXZCLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDO2FBQ2hFLFlBQVksRUFBRTthQUNkLGVBQWUsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FDNUIsVUFBVSxFQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUNqQyxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBRTNCOzs7O09BSUc7SUFDSCxVQUFVLEdBQUcsQ0FBQyxHQUFjLEVBQVcsRUFBRTtRQUN2QyxJQUNFLEdBQUcsQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLFFBQVE7WUFDOUIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUN2QixHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsR0FBRyxFQUNsQyxDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsMkNBQTJDO1FBQzNDLElBQUksQ0FBQztZQUNILE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM5RCxNQUFNLEVBQUUsR0FBRyxPQUFPO2lCQUNmLGNBQWMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDO2dCQUMvQyxFQUFFLGFBQWEsRUFBRSxDQUFDO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQztRQUNwQixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBRUY7Ozs7T0FJRztJQUNILHVCQUF1QixHQUFHLENBQUMsRUFBZSxFQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELFlBQVksRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUs7S0FDakMsQ0FBQyxDQUFDO0lBRUg7Ozs7OztPQU1HO0lBQ0gsY0FBYyxHQUFHLENBQ2YsR0FBYyxFQUNkLGdCQUFrQyxFQUNsQyxPQUFpQixFQUNXLEVBQUU7UUFDOUIsTUFBTSxZQUFZLEdBQUcsT0FBTyxFQUFFLFlBQVksQ0FBQztRQUMzQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FDYix5REFBeUQsR0FBRyxDQUFDLEtBQUssY0FBYyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQzFHLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzlELE1BQU0sRUFBRSxHQUFHLE9BQU87YUFDZixjQUFjLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsQ0FBQztZQUMvQyxFQUFFLGFBQWEsRUFBRSxDQUFDO1FBRXBCLE9BQU87WUFDTCxVQUFVLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRTtZQUNyQyxZQUFZO1lBQ1osSUFBSSxFQUFFLEdBQUcsQ0FBQyxhQUFhO1lBQ3ZCLEdBQUcsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDckMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTtZQUN6QyxVQUFVLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FDL0QsUUFBUSxDQUNUO1NBQ0YsQ0FBQztJQUNKLENBQUMsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCAqIGFzIHdhc20gZnJvbSAnZXJnby1saWItd2FzbS1ub2RlanMnO1xuXG5pbXBvcnQge1xuICBBYnN0cmFjdEVyZ29Cb3hFeHRyYWN0b3IsXG4gIEluaXRpYWxpemVPcHRpb25zLFxuICBUeEV4dHJhLFxufSBmcm9tICdAcm9zZW4tYnJpZGdlL2Fic3RyYWN0LWV4dHJhY3Rvcic7XG5pbXBvcnQgeyBBYnN0cmFjdExvZ2dlciB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3QtbG9nZ2VyJztcbmltcG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICdAcm9zZW4tYnJpZGdlL2V4dGVuZGVkLXR5cGVvcm0nO1xuaW1wb3J0IEpzb25CSSBmcm9tICdAcm9zZW4tYnJpZGdlL2pzb24tYmlnaW50JztcbmltcG9ydCB7XG4gIElucHV0RXh0ZW5zaW9uLFxuICBPdXRwdXRCb3gsXG4gIFRyYW5zYWN0aW9uLFxufSBmcm9tICdAcm9zZW4tYnJpZGdlL3NjYW5uZXItaW50ZXJmYWNlcyc7XG5cbmltcG9ydCB7IEZyYXVkQWN0aW9uIH0gZnJvbSAnLi4vYWN0aW9ucy9mcmF1ZEFjdGlvbic7XG5pbXBvcnQgeyBGcmF1ZEVudGl0eSB9IGZyb20gJy4uL2VudGl0aWVzL2ZyYXVkRW50aXR5JztcbmltcG9ydCB7IEV4dHJhY3RlZEZyYXVkIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBGcmF1ZEV4dHJhY3RvciBleHRlbmRzIEFic3RyYWN0RXJnb0JveEV4dHJhY3RvcjxcbiAgRXh0cmFjdGVkRnJhdWQsXG4gIEZyYXVkRW50aXR5XG4+IHtcbiAgcmVhZG9ubHkgYWN0aW9uczogRnJhdWRBY3Rpb247XG4gIHByaXZhdGUgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBlcmdvVHJlZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHJ3dDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsXG4gICAgaWQ6IHN0cmluZyxcbiAgICByd3Q6IHN0cmluZyxcbiAgICBpbml0aWFsaXplT3B0aW9uczogSW5pdGlhbGl6ZU9wdGlvbnMsXG4gICAgbG9nZ2VyPzogQWJzdHJhY3RMb2dnZXIsXG4gICkge1xuICAgIHN1cGVyKGluaXRpYWxpemVPcHRpb25zLCBsb2dnZXIpO1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLmVyZ29UcmVlID0gd2FzbS5BZGRyZXNzLmZyb21fYmFzZTU4KGluaXRpYWxpemVPcHRpb25zLmFkZHJlc3MpXG4gICAgICAudG9fZXJnb190cmVlKClcbiAgICAgIC50b19iYXNlMTZfYnl0ZXMoKTtcbiAgICB0aGlzLnJ3dCA9IHJ3dDtcbiAgICB0aGlzLmFjdGlvbnMgPSBuZXcgRnJhdWRBY3Rpb24oXG4gICAgICBkYXRhU291cmNlLFxuICAgICAgdGhpcy5sb2dnZXIuY2hpbGQoJ0ZyYXVkQWN0aW9uJyksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgSWQgZm9yIGN1cnJlbnQgZXh0cmFjdG9yXG4gICAqL1xuICBnZXRJZCA9ICgpID0+IGAke3RoaXMuaWR9YDtcblxuICAvKipcbiAgICogY2hlY2sgcHJvcGVyIGRhdGEgZm9ybWF0IGluIHRoZSBib3hcbiAgICogQHBhcmFtIGJveFxuICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGJveCBoYXMgdGhlIHJlcXVpcmVkIGRhdGEgYW5kIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgaGFzQm94RGF0YSA9IChib3g6IE91dHB1dEJveCk6IGJvb2xlYW4gPT4ge1xuICAgIGlmIChcbiAgICAgIGJveC5lcmdvVHJlZSAhPT0gdGhpcy5lcmdvVHJlZSB8fFxuICAgICAgYm94LmFzc2V0cy5sZW5ndGggPT09IDAgfHxcbiAgICAgIGJveC5hc3NldHNbMF0udG9rZW5JZCAhPT0gdGhpcy5yd3RcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBSNCByZWdpc3RlciBleGlzdHMgYW5kIGlzIHZhbGlkXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVyZ29Cb3ggPSB3YXNtLkVyZ29Cb3guZnJvbV9qc29uKEpzb25CSS5zdHJpbmdpZnkoYm94KSk7XG4gICAgICBjb25zdCByNCA9IGVyZ29Cb3hcbiAgICAgICAgLnJlZ2lzdGVyX3ZhbHVlKHdhc20uTm9uTWFuZGF0b3J5UmVnaXN0ZXJJZC5SNClcbiAgICAgICAgPy50b19ieXRlX2FycmF5KCk7XG4gICAgICByZXR1cm4gcjQgIT0gbnVsbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIGV4dHJhY3QgdHJhbnNhY3Rpb24gZXh0cmEgaW5mb3JtYXRpb25cbiAgICogQHBhcmFtIHR4XG4gICAqIEByZXR1cm5zIHRyYW5zYWN0aW9uIGV4dHJhIGRhdGEgY29udGFpbmluZyB0cmlnZ2VyIGJveCBpZFxuICAgKi9cbiAgZ2V0VHJhbnNhY3Rpb25FeHRyYURhdGEgPSAodHg6IFRyYW5zYWN0aW9uKTogVHhFeHRyYSA9PiAoe1xuICAgIHRyaWdnZXJCb3hJZDogdHguaW5wdXRzWzBdLmJveElkLFxuICB9KTtcblxuICAvKipcbiAgICogZXh0cmFjdCBib3ggZGF0YSB0byBwcm9wZXIgZm9ybWF0IChub3QgaW5jbHVkaW5nIHNwZW5kaW5nIGluZm9ybWF0aW9uKVxuICAgKiBAcGFyYW0gYm94XG4gICAqIEBwYXJhbSBpbnB1dEV4dGVuc2lvbnMgYWxsIGlucHV0IGJveCBleHRlbnNpb25zIGluIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB0eEV4dHJhIHRyYW5zYWN0aW9uIGV4dHJhIGRhdGEgY29udGFpbmluZyB0cmlnZ2VyIGJveCBpZFxuICAgKiBAcmV0dXJuIGV4dHJhY3RlZCBkYXRhIGluIHByb3BlciBmb3JtYXRcbiAgICovXG4gIGV4dHJhY3RCb3hEYXRhID0gKFxuICAgIGJveDogT3V0cHV0Qm94LFxuICAgIF9pbnB1dEV4dGVuc2lvbnM6IElucHV0RXh0ZW5zaW9uW10sXG4gICAgdHhFeHRyYT86IFR4RXh0cmEsXG4gICk6IEV4dHJhY3RlZEZyYXVkIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCB0cmlnZ2VyQm94SWQgPSB0eEV4dHJhPy50cmlnZ2VyQm94SWQ7XG4gICAgaWYgKCF0cmlnZ2VyQm94SWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEltcG9zc2libGVCZWhhdmlvdXI6IFRyaWdnZXIgYm94SWQgaXMgbWlzc2luZyBmb3IgYm94ICR7Ym94LmJveElkfSwgdHhFeHRyYTogJHtKU09OLnN0cmluZ2lmeSh0eEV4dHJhKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBlcmdvQm94ID0gd2FzbS5FcmdvQm94LmZyb21fanNvbihKc29uQkkuc3RyaW5naWZ5KGJveCkpO1xuICAgIGNvbnN0IHI0ID0gZXJnb0JveFxuICAgICAgLnJlZ2lzdGVyX3ZhbHVlKHdhc20uTm9uTWFuZGF0b3J5UmVnaXN0ZXJJZC5SNClcbiAgICAgID8udG9fYnl0ZV9hcnJheSgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkZW50aWZpZXI6IGVyZ29Cb3guYm94X2lkKCkudG9fc3RyKCksXG4gICAgICB0cmlnZ2VyQm94SWQsXG4gICAgICB0eElkOiBib3gudHJhbnNhY3Rpb25JZCxcbiAgICAgIHdpZDogQnVmZmVyLmZyb20ocjQhKS50b1N0cmluZygnaGV4JyksXG4gICAgICByd3RDb3VudDogYm94LmFzc2V0c1swXS5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgIHNlcmlhbGl6ZWQ6IEJ1ZmZlci5mcm9tKGVyZ29Cb3guc2lnbWFfc2VyaWFsaXplX2J5dGVzKCkpLnRvU3RyaW5nKFxuICAgICAgICAnYmFzZTY0JyxcbiAgICAgICksXG4gICAgfTtcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -1,15 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { AbstractEntityData } from '@rosen-bridge/abstract-extractor';
|
|
2
|
+
export interface ExtractedFraud extends AbstractEntityData {
|
|
3
|
+
txId: string;
|
|
4
4
|
triggerBoxId: string;
|
|
5
5
|
wid: string;
|
|
6
6
|
rwtCount: string;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
spendBlock?: string;
|
|
11
|
-
spendHeight?: number;
|
|
12
|
-
spendTxId?: string;
|
|
7
|
+
spendBlock?: string | null;
|
|
8
|
+
spendHeight?: number | null;
|
|
9
|
+
spendTxId?: string | null;
|
|
13
10
|
}
|
|
14
|
-
export { ExtractedFraud };
|
|
15
11
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../lib/interfaces/types.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../lib/interfaces/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAEtE,MAAM,WAAW,cAAe,SAAQ,kBAAkB;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B"}
|
package/dist/interfaces/types.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvaW50ZXJmYWNlcy90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWJzdHJhY3RFbnRpdHlEYXRhIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1leHRyYWN0b3InO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RlZEZyYXVkIGV4dGVuZHMgQWJzdHJhY3RFbnRpdHlEYXRhIHtcbiAgdHhJZDogc3RyaW5nO1xuICB0cmlnZ2VyQm94SWQ6IHN0cmluZztcbiAgd2lkOiBzdHJpbmc7XG4gIHJ3dENvdW50OiBzdHJpbmc7XG4gIHNwZW5kQmxvY2s/OiBzdHJpbmcgfCBudWxsO1xuICBzcGVuZEhlaWdodD86IG51bWJlciB8IG51bGw7XG4gIHNwZW5kVHhJZD86IHN0cmluZyB8IG51bGw7XG59XG4iXX0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/migrations/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/migrations/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAE5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAG1E,eAAO,MAAM,UAAU;;;CAGtB,CAAC"}
|