drama-pm-client 0.4.9 → 0.4.10
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/dist/idl.d.ts +76 -29
- package/dist/idl.js +210 -1
- package/dist/index.d.ts +93 -0
- package/dist/index.js +179 -1
- package/dist/types.d.ts +209 -0
- package/dist/types.js +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -588,6 +588,118 @@ export class DramaPmClient {
|
|
|
588
588
|
const ix = await this.refund(params);
|
|
589
589
|
return new Transaction().add(ix);
|
|
590
590
|
}
|
|
591
|
+
/**
|
|
592
|
+
* Refund both Yes and No positions in a single transaction.
|
|
593
|
+
*
|
|
594
|
+
* Use this method when a user has bet on both Yes and No outcomes and needs to
|
|
595
|
+
* refund all positions after the market has been resolved as "Refunded" (None).
|
|
596
|
+
*
|
|
597
|
+
* This method automatically:
|
|
598
|
+
* - Checks if the user has Yes tokens and/or No tokens
|
|
599
|
+
* - Only includes refund instructions for outcomes the user actually holds
|
|
600
|
+
* - Closes the token accounts after refunding (by default)
|
|
601
|
+
*
|
|
602
|
+
* @param params - RefundV2Params
|
|
603
|
+
* @param params.user - User's public key (signer)
|
|
604
|
+
* @param params.market - Market PDA address
|
|
605
|
+
* @param params.bettingToken - Betting token mint (e.g., USDC)
|
|
606
|
+
* @param params.yesTokenAmount - Optional. Amount of Yes tokens to refund. 0 or undefined = refund all.
|
|
607
|
+
* @param params.noTokenAmount - Optional. Amount of No tokens to refund. 0 or undefined = refund all.
|
|
608
|
+
* @param params.closeYesAccount - Optional. Whether to close the Yes token account after refund. Default: true
|
|
609
|
+
* @param params.closeNoAccount - Optional. Whether to close the No token account after refund. Default: true
|
|
610
|
+
*
|
|
611
|
+
* @returns Transaction containing refund instructions for both outcomes (if applicable)
|
|
612
|
+
*
|
|
613
|
+
* @example
|
|
614
|
+
* ```typescript
|
|
615
|
+
* // Basic usage: Refund all Yes and No tokens
|
|
616
|
+
* const tx = await client.buildRefundV2Tx({
|
|
617
|
+
* user: userPublicKey,
|
|
618
|
+
* market: marketPda,
|
|
619
|
+
* bettingToken: usdcMint,
|
|
620
|
+
* });
|
|
621
|
+
*
|
|
622
|
+
* // Sign and send
|
|
623
|
+
* tx.recentBlockhash = (await connection.getLatestBlockhash()).blockhash;
|
|
624
|
+
* tx.feePayer = userPublicKey;
|
|
625
|
+
* await wallet.signTransaction(tx);
|
|
626
|
+
* await connection.sendRawTransaction(tx.serialize());
|
|
627
|
+
* ```
|
|
628
|
+
*
|
|
629
|
+
* @example
|
|
630
|
+
* ```typescript
|
|
631
|
+
* // Keep token accounts open (don't close them)
|
|
632
|
+
* const tx = await client.buildRefundV2Tx({
|
|
633
|
+
* user: userPublicKey,
|
|
634
|
+
* market: marketPda,
|
|
635
|
+
* bettingToken: usdcMint,
|
|
636
|
+
* closeYesAccount: false, // Keep Yes token account open
|
|
637
|
+
* closeNoAccount: false, // Keep No token account open
|
|
638
|
+
* });
|
|
639
|
+
* ```
|
|
640
|
+
*
|
|
641
|
+
* @remarks
|
|
642
|
+
* - The market must be in "Refunded" status for this method to work
|
|
643
|
+
* - If the user only has tokens on one side, only that side will be refunded
|
|
644
|
+
* - The returned transaction will be empty if the user has no tokens on either side
|
|
645
|
+
*/
|
|
646
|
+
async buildRefundV2Tx(params) {
|
|
647
|
+
const { user, market, bettingToken, yesTokenAmount, noTokenAmount, closeYesAccount = true, closeNoAccount = true } = params;
|
|
648
|
+
const tx = new Transaction();
|
|
649
|
+
// Derive mint PDAs from market address
|
|
650
|
+
const yesMint = PublicKey.findProgramAddressSync([Buffer.from(YES_MINT_SEED), market.toBuffer()], this.program.programId)[0];
|
|
651
|
+
const noMint = PublicKey.findProgramAddressSync([Buffer.from(NO_MINT_SEED), market.toBuffer()], this.program.programId)[0];
|
|
652
|
+
// Get user's outcome token accounts
|
|
653
|
+
const userYesToken = getAssociatedTokenAddressSync(yesMint, user, false, TOKEN_2022_PROGRAM_ID);
|
|
654
|
+
const userNoToken = getAssociatedTokenAddressSync(noMint, user, false, TOKEN_2022_PROGRAM_ID);
|
|
655
|
+
// Check if user has Yes tokens
|
|
656
|
+
let hasYesTokens = false;
|
|
657
|
+
let yesBalance = 0;
|
|
658
|
+
try {
|
|
659
|
+
const yesAccount = await this.connection.getTokenAccountBalance(userYesToken);
|
|
660
|
+
yesBalance = Number(yesAccount.value.amount);
|
|
661
|
+
hasYesTokens = yesBalance > 0;
|
|
662
|
+
}
|
|
663
|
+
catch {
|
|
664
|
+
// Account doesn't exist or has no balance
|
|
665
|
+
}
|
|
666
|
+
// Check if user has No tokens
|
|
667
|
+
let hasNoTokens = false;
|
|
668
|
+
let noBalance = 0;
|
|
669
|
+
try {
|
|
670
|
+
const noAccount = await this.connection.getTokenAccountBalance(userNoToken);
|
|
671
|
+
noBalance = Number(noAccount.value.amount);
|
|
672
|
+
hasNoTokens = noBalance > 0;
|
|
673
|
+
}
|
|
674
|
+
catch {
|
|
675
|
+
// Account doesn't exist or has no balance
|
|
676
|
+
}
|
|
677
|
+
// Add Yes refund instruction if user has Yes tokens
|
|
678
|
+
if (hasYesTokens) {
|
|
679
|
+
const yesRefundIx = await this.refund({
|
|
680
|
+
user,
|
|
681
|
+
market,
|
|
682
|
+
bettingToken,
|
|
683
|
+
outcome: "Yes",
|
|
684
|
+
tokenAmount: 0,
|
|
685
|
+
closeAccount: closeYesAccount,
|
|
686
|
+
});
|
|
687
|
+
tx.add(yesRefundIx);
|
|
688
|
+
}
|
|
689
|
+
// Add No refund instruction if user has No tokens
|
|
690
|
+
if (hasNoTokens) {
|
|
691
|
+
const noRefundIx = await this.refund({
|
|
692
|
+
user,
|
|
693
|
+
market,
|
|
694
|
+
bettingToken,
|
|
695
|
+
outcome: "No",
|
|
696
|
+
tokenAmount: 0,
|
|
697
|
+
closeAccount: closeNoAccount,
|
|
698
|
+
});
|
|
699
|
+
tx.add(noRefundIx);
|
|
700
|
+
}
|
|
701
|
+
return tx;
|
|
702
|
+
}
|
|
591
703
|
/**
|
|
592
704
|
* Resolve a market (Admin only)
|
|
593
705
|
*/
|
|
@@ -806,6 +918,72 @@ export class DramaPmClient {
|
|
|
806
918
|
const ix = await this.burnMarketTokens(user, market, losingOutcome, tokenAmount, closeAccount);
|
|
807
919
|
return new Transaction().add(ix);
|
|
808
920
|
}
|
|
921
|
+
/**
|
|
922
|
+
* Claim rewards if won, or burn tokens if lost, with optional account closure.
|
|
923
|
+
* This instruction combines claim_rewards and burn_market_tokens logic into a single call.
|
|
924
|
+
*
|
|
925
|
+
* @param params - ClaimBurnMarketParams
|
|
926
|
+
* @param userYesToken - User's YES token account (optional, pass null if user has no YES tokens)
|
|
927
|
+
* @param userNoToken - User's NO token account (optional, pass null if user has no NO tokens)
|
|
928
|
+
*/
|
|
929
|
+
async claimBurnMarket(params, userYesToken, userNoToken) {
|
|
930
|
+
const { user, market, bettingToken } = params;
|
|
931
|
+
// Derive PDAs
|
|
932
|
+
const yesMint = PublicKey.findProgramAddressSync([Buffer.from(YES_MINT_SEED), market.toBuffer()], this.program.programId)[0];
|
|
933
|
+
const noMint = PublicKey.findProgramAddressSync([Buffer.from(NO_MINT_SEED), market.toBuffer()], this.program.programId)[0];
|
|
934
|
+
const vault = PublicKey.findProgramAddressSync([Buffer.from(VAULT_SEED), market.toBuffer()], this.program.programId)[0];
|
|
935
|
+
const userBettingToken = getAssociatedTokenAddressSync(bettingToken, user);
|
|
936
|
+
return await this.program.methods
|
|
937
|
+
.claimBurnMarket()
|
|
938
|
+
.accountsPartial({
|
|
939
|
+
market,
|
|
940
|
+
yesMint,
|
|
941
|
+
noMint,
|
|
942
|
+
vault,
|
|
943
|
+
userYesToken: userYesToken,
|
|
944
|
+
userNoToken: userNoToken,
|
|
945
|
+
userBettingToken,
|
|
946
|
+
user,
|
|
947
|
+
tokenProgram: TOKEN_PROGRAM_ID,
|
|
948
|
+
token2022Program: TOKEN_2022_PROGRAM_ID,
|
|
949
|
+
})
|
|
950
|
+
.instruction();
|
|
951
|
+
}
|
|
952
|
+
/**
|
|
953
|
+
* Build a complete transaction to claim rewards (if won) or burn tokens (if lost)
|
|
954
|
+
* Automatically creates user outcome token accounts based on user's holdings
|
|
955
|
+
*/
|
|
956
|
+
async buildClaimBurnMarketTx(params) {
|
|
957
|
+
const { user, market } = params;
|
|
958
|
+
const tx = new Transaction();
|
|
959
|
+
// Derive PDAs
|
|
960
|
+
const yesMint = PublicKey.findProgramAddressSync([Buffer.from(YES_MINT_SEED), market.toBuffer()], this.program.programId)[0];
|
|
961
|
+
const noMint = PublicKey.findProgramAddressSync([Buffer.from(NO_MINT_SEED), market.toBuffer()], this.program.programId)[0];
|
|
962
|
+
// Get user token accounts
|
|
963
|
+
const userYesToken = getAssociatedTokenAddressSync(yesMint, user, false, TOKEN_2022_PROGRAM_ID);
|
|
964
|
+
const userNoToken = getAssociatedTokenAddressSync(noMint, user, false, TOKEN_2022_PROGRAM_ID);
|
|
965
|
+
// Check which accounts exist and have tokens
|
|
966
|
+
let hasYesTokens = false;
|
|
967
|
+
let hasNoTokens = false;
|
|
968
|
+
try {
|
|
969
|
+
const yesAccount = await getAccount(this.connection, userYesToken, undefined, TOKEN_2022_PROGRAM_ID);
|
|
970
|
+
hasYesTokens = yesAccount.amount > 0n;
|
|
971
|
+
}
|
|
972
|
+
catch {
|
|
973
|
+
// Account doesn't exist
|
|
974
|
+
}
|
|
975
|
+
try {
|
|
976
|
+
const noAccount = await getAccount(this.connection, userNoToken, undefined, TOKEN_2022_PROGRAM_ID);
|
|
977
|
+
hasNoTokens = noAccount.amount > 0n;
|
|
978
|
+
}
|
|
979
|
+
catch {
|
|
980
|
+
// Account doesn't exist
|
|
981
|
+
}
|
|
982
|
+
// Build instruction with appropriate accounts
|
|
983
|
+
const ix = await this.claimBurnMarket(params, hasYesTokens ? userYesToken : null, hasNoTokens ? userNoToken : null);
|
|
984
|
+
tx.add(ix);
|
|
985
|
+
return tx;
|
|
986
|
+
}
|
|
809
987
|
/**
|
|
810
988
|
* Fetch global config account data
|
|
811
989
|
*/
|
|
@@ -833,4 +1011,4 @@ export class DramaPmClient {
|
|
|
833
1011
|
return await getAccount(this.connection, vaultPda);
|
|
834
1012
|
}
|
|
835
1013
|
}
|
|
836
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLDJCQUEyQixFQUMzQix5QkFBeUIsRUFDekIsVUFBVSxFQUNWLDZCQUE2QixFQUM3QixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2pCLE1BQU0sbUJBQW1CLENBQUM7QUFFM0IsT0FBTyxFQUFFLE9BQU8sSUFBSSxhQUFhLEVBQUUsY0FBYyxFQUF3QixNQUFNLG1CQUFtQixDQUFDO0FBRW5HLE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUV2QixPQUFPLEVBRUwsT0FBTyxFQUNQLFNBQVMsRUFDVCxhQUFhLEVBQ2IsV0FBVyxFQUNYLHNCQUFzQixFQUN2QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFL0IsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixZQUFZLEVBQ1osYUFBYSxFQUNiLFdBQVcsRUFDWCxZQUFZLEVBQ1osVUFBVSxFQUNWLGFBQWEsRUFDZCxNQUFNLFlBQVksQ0FBQztBQUVwQixjQUFjLFlBQVksQ0FBQztBQUMzQixPQUFPLEVBQVcsR0FBRyxFQUFFLENBQUM7QUFzRnhCLE1BQU0sT0FBTyxhQUFhO0lBS3hCLFlBQVksVUFBc0IsRUFBRSxNQUFlLEVBQUUsU0FBcUI7UUFDeEUsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFFN0IsMkNBQTJDO1FBQzNDLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMxQyxNQUFNLGFBQWEsR0FBVztZQUM1QixTQUFTLEVBQUUsY0FBYyxDQUFDLFNBQVM7WUFDbkMsZUFBZSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDakMsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRztZQUN2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ckQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQVNTT0NJQVRFRF9UT0tFTl9QUk9HUkFNX0lELFxuICBjcmVhdGVUcmFuc2Zlckluc3RydWN0aW9uLFxuICBnZXRBY2NvdW50LFxuICBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyxcbiAgVE9LRU5fMjAyMl9QUk9HUkFNX0lELFxuICBUT0tFTl9QUk9HUkFNX0lEXG59IGZyb20gXCJAc29sYW5hL3NwbC10b2tlblwiO1xuXG5pbXBvcnQgeyBQcm9ncmFtIGFzIEFuY2hvclByb2dyYW0sIEFuY2hvclByb3ZpZGVyLCBJZGwsIFByb2dyYW0sIFdhbGxldCB9IGZyb20gXCJAY29yYWwteHl6L2FuY2hvclwiO1xuXG5pbXBvcnQgQk4gZnJvbSBcImJuLmpzXCI7XG5cbmltcG9ydCB7XG4gIENvbm5lY3Rpb24sXG4gIEtleXBhaXIsXG4gIFB1YmxpY0tleSxcbiAgU3lzdGVtUHJvZ3JhbSxcbiAgVHJhbnNhY3Rpb24sXG4gIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25cbn0gZnJvbSBcIkBzb2xhbmEvd2ViMy5qc1wiO1xuaW1wb3J0IHsgSURMIH0gZnJvbSBcIi4vaWRsLmpzXCI7XG5pbXBvcnQgeyBEcmFtYVBtIH0gZnJvbSBcIi4vdHlwZXMuanNcIjtcbmltcG9ydCB7XG4gIGdldEdsb2JhbENvbmZpZ1BkYSxcbiAgZ2V0TWFya2V0UGRhLFxuICBnZXRNYXJrZXRQZGFzLFxuICBnZXRWYXVsdFBkYSxcbiAgTk9fTUlOVF9TRUVELFxuICBWQVVMVF9TRUVELFxuICBZRVNfTUlOVF9TRUVEXG59IGZyb20gXCIuL3V0aWxzLmpzXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzLmpzXCI7XG5leHBvcnQgeyBEcmFtYVBtLCBJREwgfTtcblxuZXhwb3J0IHR5cGUgT3V0Y29tZSA9IFwiWWVzXCIgfCBcIk5vXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlTWFya2V0UGFyYW1zIHtcbiAgYWRtaW46IFB1YmxpY0tleTtcbiAgbWFya2V0SWQ6IG51bWJlciB8IEJOO1xuICB5ZXNQcmljZTogbnVtYmVyIHwgQk47XG4gIG5vUHJpY2U6IG51bWJlciB8IEJOO1xuICBlbmRUaW1lOiBudW1iZXIgfCBCTjtcbiAgYmV0dGluZ1Rva2VuOiBQdWJsaWNLZXk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxhY2VCZXRQYXJhbXMge1xuICB1c2VyOiBQdWJsaWNLZXk7XG4gIG1hcmtldDogUHVibGljS2V5OyAvLyBNYXJrZXQgUERBIGFkZHJlc3NcbiAgYW1vdW50OiBudW1iZXIgfCBCTjtcbiAgb3V0Y29tZTogT3V0Y29tZTtcbiAgYmV0dGluZ1Rva2VuOiBQdWJsaWNLZXk7XG4gIGZlZVJlY2lwaWVudD86IFB1YmxpY0tleTsgLy8gRmVlIHJlY2lwaWVudCBhZGRyZXNzIChvcHRpb25hbCwgd2lsbCBmZXRjaCBmcm9tIGNvbmZpZyBpZiBub3QgcHJvdmlkZWQpXG4gIGZlZVJlY2lwaWVudFRva2VuPzogUHVibGljS2V5IHwgbnVsbDsgLy8gRmVlIHJlY2lwaWVudCB0b2tlbiBhY2NvdW50IChvcHRpb25hbCwgdXNlZCBpbnRlcm5hbGx5IGJ5IGJ1aWxkUGxhY2VCZXRUeClcbiAgY3JlYXRlQXRhPzogYm9vbGVhbjsgLy8gV2hldGhlciB0byBjcmVhdGUgQVRBIGluc3RydWN0aW9uIGF1dG9tYXRpY2FsbHlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVGZWVDb25maWdQYXJhbXMge1xuICBhdXRob3JpdHk6IFB1YmxpY0tleTsgLy8gQ2FuIGJlIGF1dGhvcml0eSBvciBhdXRob3JpemVkIGFkbWluXG4gIG5ld0ZlZUJwczogbnVtYmVyOyAvLyBGZWUgaW4gYmFzaXMgcG9pbnRzICgxIGJwcyA9IDAuMDElLCBtYXggMjAwMCA9IDIwJSlcbiAgbmV3RmVlUmVjaXBpZW50OiBQdWJsaWNLZXk7XG4gIG5ld0ZlZUNsYWltQnBzOiBudW1iZXI7IC8vIEZlZSBmb3IgY2xhaW1pbmcgcmV3YXJkcyBpbiBiYXNpcyBwb2ludHNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDbGFpbVJld2FyZHNQYXJhbXMge1xuICB1c2VyOiBQdWJsaWNLZXk7XG4gIG1hcmtldDogUHVibGljS2V5OyAvLyBNYXJrZXQgUERBIGFkZHJlc3NcbiAgYmV0dGluZ1Rva2VuOiBQdWJsaWNLZXk7XG4gIHdpbm5pbmdPdXRjb21lOiBPdXRjb21lO1xuICBzaGFyZXNUb0NsYWltOiBudW1iZXIgfCBCTjsgLy8gQW1vdW50IG9mIHNoYXJlcyB0byBjbGFpbSAoMCA9IGNsYWltIGFsbClcbiAgY2xvc2VBY2NvdW50PzogYm9vbGVhbjsgLy8gV2hldGhlciB0byBjbG9zZSB0aGUgb3V0Y29tZSB0b2tlbiBhY2NvdW50IGFmdGVyIGNsYWltaW5nIGFsbCBzaGFyZXMgKGRlZmF1bHQ6IGZhbHNlKVxuICBmZWVSZWNpcGllbnQ/OiBQdWJsaWNLZXk7IC8vIEZlZSByZWNpcGllbnQgYWRkcmVzcyAob3B0aW9uYWwsIHdpbGwgZmV0Y2ggZnJvbSBjb25maWcgaWYgbm90IHByb3ZpZGVkKVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJhdGNoQ2xhaW1QYXJhbXMge1xuICB1c2VyOiBQdWJsaWNLZXk7XG4gIGNsYWltczogQXJyYXk8e1xuICAgIG1hcmtldDogUHVibGljS2V5O1xuICAgIGJldHRpbmdUb2tlbjogUHVibGljS2V5O1xuICAgIHdpbm5pbmdPdXRjb21lOiBPdXRjb21lO1xuICAgIHNoYXJlc1RvQ2xhaW0/OiBudW1iZXIgfCBCTjsgLy8gQW1vdW50IG9mIHNoYXJlcyB0byBjbGFpbSAoMCBvciB1bmRlZmluZWQgPSBjbGFpbSBhbGwpXG4gICAgY2xvc2VBY2NvdW50PzogYm9vbGVhbjsgLy8gV2hldGhlciB0byBjbG9zZSB0aGUgb3V0Y29tZSB0b2tlbiBhY2NvdW50IGFmdGVyIGNsYWltaW5nIGFsbCBzaGFyZXNcbiAgfT47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVmdW5kUGFyYW1zIHtcbiAgdXNlcjogUHVibGljS2V5O1xuICBtYXJrZXQ6IFB1YmxpY0tleTsgLy8gTWFya2V0IFBEQSBhZGRyZXNzXG4gIGJldHRpbmdUb2tlbjogUHVibGljS2V5O1xuICBvdXRjb21lOiBPdXRjb21lO1xuICB0b2tlbkFtb3VudD86IG51bWJlciB8IEJOOyAvLyBBbW91bnQgb2Ygc2hhcmVzIHRvIHJlZnVuZC4gMCBvciB1bmRlZmluZWQgbWVhbnMgcmVmdW5kIGFsbCBzaGFyZXMuXG4gIGNsb3NlQWNjb3VudD86IGJvb2xlYW47IC8vIFdoZXRoZXIgdG8gY2xvc2UgdGhlIG91dGNvbWUgdG9rZW4gYWNjb3VudCBhZnRlciByZWZ1bmRpbmcgYWxsIHNoYXJlcyAoZGVmYXVsdDogZmFsc2UpXG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgcGxhY2VCZXRWMiAtIGNvbWJpbmVzIHVzZXIgYmV0IGFuZCBib251cyBhY2NvdW50IGJldCBpbiBvbmUgdHJhbnNhY3Rpb25cbiAqIFJlcXVpcmVzIGJvdGggdXNlciBhbmQgYm9udXNBY2NvdW50IHRvIHNpZ24gdGhlIHRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGxhY2VCZXRWMlBhcmFtcyB7XG4gIHVzZXI6IFB1YmxpY0tleTsgICAgICAgICAgICAgIC8vIFVzZXIncyBwdWJsaWMga2V5IChzaWduZXIpXG4gIGJvbnVzQWNjb3VudDogUHVibGljS2V5OyAgICAgIC8vIEJvbnVzIGFjY291bnQgcHVibGljIGtleSAoc2lnbmVyKVxuICBtYXJrZXQ6IFB1YmxpY0tleTsgICAgICAgICAgICAvLyBNYXJrZXQgUERBIGFkZHJlc3NcbiAgdXNlckFtb3VudDogbnVtYmVyIHwgQk47ICAgICAgLy8gQW1vdW50IHVzZXIgcGF5c1xuICBib251c0Ftb3VudDogbnVtYmVyIHwgQk47ICAgICAvLyBBbW91bnQgYm9udXMgYWNjb3VudCBwYXlzXG4gIG91dGNvbWU6IE91dGNvbWU7ICAgICAgICAgICAgIC8vIE91dGNvbWUgdG8gYmV0IG9uIChZZXMvTm8pXG4gIGJldHRpbmdUb2tlbjogUHVibGljS2V5OyAgICAgIC8vIEJldHRpbmcgdG9rZW4gbWludFxuICBmZWVSZWNpcGllbnQ/OiBQdWJsaWNLZXk7ICAgICAvLyBGZWUgcmVjaXBpZW50IGFkZHJlc3MgKG9wdGlvbmFsKVxuICBjcmVhdGVBdGE/OiBib29sZWFuOyAgICAgICAgICAvLyBXaGV0aGVyIHRvIGNyZWF0ZSBBVEEgaW5zdHJ1Y3Rpb24gYXV0b21hdGljYWxseVxufVxuXG4vKipcbiAqIFJlc3VsdCBmcm9tIGJ1aWxkUGxhY2VCZXRWMlR4IGNvbnRhaW5pbmcgYm90aCB0aGUgdHJhbnNhY3Rpb24gYW5kIGl0cyBzZXJpYWxpemVkIGZvcm1cbiAqIGZvciBzcGxpdCBzaWduaW5nIHdvcmtmbG93IChmcm9udGVuZCB1c2VyIHNpZ24gKyBiYWNrZW5kIGJvbnVzIHNpZ24pXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGxhY2VCZXRWMlJlc3VsdCB7XG4gIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbjsgICAgIC8vIFRyYW5zYWN0aW9uIG9iamVjdCBmb3IgbG9jYWwgc2lnbmluZyAodGVzdGluZylcbiAgcmVxdWlyZWRTaWduZXJzOiBQdWJsaWNLZXlbXTsgLy8gTGlzdCBvZiByZXF1aXJlZCBzaWduZXJzIFt1c2VyLCBib251c0FjY291bnRdXG59XG5cbmV4cG9ydCBjbGFzcyBEcmFtYVBtQ2xpZW50IHtcbiAgcHJvZ3JhbTogUHJvZ3JhbTxEcmFtYVBtPjtcbiAgcHJvdmlkZXI6IEFuY2hvclByb3ZpZGVyO1xuICBjb25uZWN0aW9uOiBDb25uZWN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKGNvbm5lY3Rpb246IENvbm5lY3Rpb24sIHdhbGxldD86IFdhbGxldCwgcHJvZ3JhbUlkPzogUHVibGljS2V5KSB7XG4gICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICBcbiAgICAvLyBDcmVhdGUgYSBkZWZhdWx0IHdhbGxldCBpZiBub25lIHByb3ZpZGVkXG4gICAgY29uc3QgZGVmYXVsdEtleXBhaXIgPSBLZXlwYWlyLmdlbmVyYXRlKCk7XG4gICAgY29uc3QgZGVmYXVsdFdhbGxldDogV2FsbGV0ID0ge1xuICAgICAgcHVibGljS2V5OiBkZWZhdWx0S2V5cGFpci5wdWJsaWNLZXksXG4gICAgICBzaWduVHJhbnNhY3Rpb246IGFzeW5jICh0eCkgPT4gdHgsXG4gICAgICBzaWduQWxsVHJhbnNhY3Rpb25zOiBhc3luYyAodHhzKSA9PiB0eHMsXG4gICAgICBwYXllcjogZGVmYXVsdEtleXBhaXIsXG4gICAgfTtcbiAgICBcbiAgICB0aGlzLnByb3ZpZGVyID0gbmV3IEFuY2hvclByb3ZpZGVyKFxuICAgICAgY29ubmVjdGlvbixcbiAgICAgIHdhbGxldCB8fCBkZWZhdWx0V2FsbGV0LFxuICAgICAgeyBjb21taXRtZW50OiBcImNvbmZpcm1lZFwiIH1cbiAgICApO1xuICAgIFxuICAgIC8vIFVzZSBjdXN0b20gcHJvZ3JhbUlkIGlmIHByb3ZpZGVkLCBvdGhlcndpc2UgdXNlIHRoZSBkZWZhdWx0IGZyb20gSURMXG4gICAgY29uc3QgZmluYWxQcm9ncmFtSWQgPSBwcm9ncmFtSWQgfHwgbmV3IFB1YmxpY0tleShJREwuYWRkcmVzcyk7XG4gICAgXG4gICAgLy8gQ3JlYXRlIGEgbmV3IElETCB3aXRoIHRoZSBjdXN0b20gcHJvZ3JhbUlkXG4gICAgY29uc3QgY3VzdG9tSWRsID0geyAuLi5JREwsIGFkZHJlc3M6IGZpbmFsUHJvZ3JhbUlkLnRvQmFzZTU4KCkgfTtcbiAgICBcbiAgICB0aGlzLnByb2dyYW0gPSBuZXcgQW5jaG9yUHJvZ3JhbShjdXN0b21JZGwgYXMgSWRsLCB0aGlzLnByb3ZpZGVyKSBhcyB1bmtub3duIGFzIFByb2dyYW08RHJhbWFQbT47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHByb2dyYW0gSURcbiAgICovXG4gIGdldFByb2dyYW1JZCgpOiBQdWJsaWNLZXkge1xuICAgIHJldHVybiB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIG5ldyBwcm9ncmFtIElEIGFuZCByZWluaXRpYWxpemUgdGhlIHByb2dyYW0gaW5zdGFuY2VcbiAgICogVXNlZnVsIHdoZW4gcmVkZXBsb3lpbmcgdGhlIHByb2dyYW0gdG8gYSBuZXcgYWRkcmVzc1xuICAgKi9cbiAgc2V0UHJvZ3JhbUlkKHByb2dyYW1JZDogUHVibGljS2V5KTogdm9pZCB7XG4gICAgY29uc3QgY3VzdG9tSWRsID0geyAuLi5JREwsIGFkZHJlc3M6IHByb2dyYW1JZC50b0Jhc2U1OCgpIH07XG4gICAgdGhpcy5wcm9ncmFtID0gbmV3IEFuY2hvclByb2dyYW0oY3VzdG9tSWRsIGFzIElkbCwgdGhpcy5wcm92aWRlcikgYXMgdW5rbm93biBhcyBQcm9ncmFtPERyYW1hUG0+O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudCBleGlzdHNcbiAgICovXG4gIGFzeW5jIGF0YUV4aXN0cyhhdGE6IFB1YmxpY0tleSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBnZXRBY2NvdW50KHRoaXMuY29ubmVjdGlvbiwgYXRhKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gaW5zdHJ1Y3Rpb24gdG8gaW5pdGlhbGl6ZSBhbiBhc3NvY2lhdGVkIHRva2VuIGFjY291bnRcbiAgICogQHBhcmFtIHRva2VuUHJvZ3JhbSAtIFRva2VuIHByb2dyYW0gSUQgKFRPS0VOX1BST0dSQU1fSUQgZm9yIGJldHRpbmcgdG9rZW4sIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCBmb3Igb3V0Y29tZSB0b2tlbnMpXG4gICAqL1xuICBjcmVhdGVBdGFJbnN0cnVjdGlvbihcbiAgICBwYXllcjogUHVibGljS2V5LFxuICAgIG93bmVyOiBQdWJsaWNLZXksXG4gICAgbWludDogUHVibGljS2V5LFxuICAgIHRva2VuUHJvZ3JhbTogUHVibGljS2V5ID0gVE9LRU5fUFJPR1JBTV9JRFxuICApOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uIHtcbiAgICBjb25zdCBhdGEgPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhtaW50LCBvd25lciwgdHJ1ZSwgdG9rZW5Qcm9ncmFtKTtcbiAgICBcbiAgICAvLyBVc2UgQ3JlYXRlSWRlbXBvdGVudCBpbnN0cnVjdGlvbiAob3Bjb2RlIDEpIHRvIHN1cHBvcnQgUERBcyBhbmQgaWRlbXBvdGVuY3lcbiAgICBjb25zdCBrZXlzID0gW1xuICAgICAgeyBwdWJrZXk6IHBheWVyLCBpc1NpZ25lcjogdHJ1ZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBwdWJrZXk6IGF0YSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgICB7IHB1YmtleTogb3duZXIsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICAgIHsgcHVia2V5OiBtaW50LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sXG4gICAgICB7IHB1YmtleTogU3lzdGVtUHJvZ3JhbS5wcm9ncmFtSWQsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICAgIHsgcHVia2V5OiB0b2tlblByb2dyYW0sIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICBdO1xuXG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkluc3RydWN0aW9uKHtcbiAgICAgIGtleXMsXG4gICAgICBwcm9ncmFtSWQ6IEFTU09DSUFURURfVE9LRU5fUFJPR1JBTV9JRCxcbiAgICAgIGRhdGE6IEJ1ZmZlci5mcm9tKFsxXSksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBnbG9iYWwgY29uZmlndXJhdGlvbiAoQXV0aG9yaXR5IG9ubHkpXG4gICAqL1xuICBhc3luYyBpbml0aWFsaXplQ29uZmlnKGF1dGhvcml0eTogUHVibGljS2V5KTogUHJvbWlzZTxUcmFuc2FjdGlvbkluc3RydWN0aW9uPiB7XG4gICAgY29uc3QgZ2xvYmFsQ29uZmlnID0gZ2V0R2xvYmFsQ29uZmlnUGRhKHRoaXMucHJvZ3JhbS5wcm9ncmFtSWQpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb2dyYW0ubWV0aG9kc1xuICAgICAgLmluaXRpYWxpemVDb25maWcoKVxuICAgICAgLmFjY291bnRzUGFydGlhbCh7XG4gICAgICAgIGdsb2JhbENvbmZpZyxcbiAgICAgICAgYXV0aG9yaXR5OiBhdXRob3JpdHksXG4gICAgICAgIHN5c3RlbVByb2dyYW06IFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkLFxuICAgICAgfSlcbiAgICAgIC5pbnN0cnVjdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgY29tcGxldGUgdHJhbnNhY3Rpb24gdG8gaW5pdGlhbGl6ZSBjb25maWdcbiAgICovXG4gIGFzeW5jIGJ1aWxkSW5pdGlhbGl6ZUNvbmZpZ1R4KGF1dGhvcml0eTogUHVibGljS2V5KTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IGl4ID0gYXdhaXQgdGhpcy5pbml0aWFsaXplQ29uZmlnKGF1dGhvcml0eSk7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbigpLmFkZChpeCk7XG4gIH1cblxuICAvKipcbiAgICogTWlncmF0ZSBHbG9iYWxDb25maWcgdG8gbmV3IHZlcnNpb24gd2l0aCBmZWVfY2xhaW1fYnBzIGZpZWxkIChBdXRob3JpdHkgb25seSlcbiAgICogU2hvdWxkIGJlIGNhbGxlZCBvbmNlIGFmdGVyIHByb2dyYW0gdXBncmFkZVxuICAgKi9cbiAgYXN5bmMgbWlncmF0ZUNvbmZpZyhhdXRob3JpdHk6IFB1YmxpY0tleSk6IFByb21pc2U8VHJhbnNhY3Rpb25JbnN0cnVjdGlvbj4ge1xuICAgIGNvbnN0IGdsb2JhbENvbmZpZyA9IGdldEdsb2JhbENvbmZpZ1BkYSh0aGlzLnByb2dyYW0ucHJvZ3JhbUlkKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLm1ldGhvZHNcbiAgICAgIC5taWdyYXRlQ29uZmlnKClcbiAgICAgIC5hY2NvdW50c1BhcnRpYWwoe1xuICAgICAgICBnbG9iYWxDb25maWcsXG4gICAgICAgIGF1dGhvcml0eTogYXV0aG9yaXR5LFxuICAgICAgICBzeXN0ZW1Qcm9ncmFtOiBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZCxcbiAgICAgIH0pXG4gICAgICAuaW5zdHJ1Y3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNvbXBsZXRlIHRyYW5zYWN0aW9uIHRvIG1pZ3JhdGUgY29uZmlnXG4gICAqL1xuICBhc3luYyBidWlsZE1pZ3JhdGVDb25maWdUeChhdXRob3JpdHk6IFB1YmxpY0tleSk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBpeCA9IGF3YWl0IHRoaXMubWlncmF0ZUNvbmZpZyhhdXRob3JpdHkpO1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb24oKS5hZGQoaXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhdXRob3JpemVkIGFkbWluIChBdXRob3JpdHkgb25seSlcbiAgICovXG4gIGFzeW5jIGFkZEFkbWluKG5ld0FkbWluOiBQdWJsaWNLZXkpOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24+IHtcbiAgICBjb25zdCBnbG9iYWxDb25maWcgPSBnZXRHbG9iYWxDb25maWdQZGEodGhpcy5wcm9ncmFtLnByb2dyYW1JZCk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLm1ldGhvZHNcbiAgICAgIC5hZGRBZG1pbihuZXdBZG1pbilcbiAgICAgIC5hY2NvdW50c1BhcnRpYWwoe1xuICAgICAgICBnbG9iYWxDb25maWcsXG4gICAgICB9KVxuICAgICAgLmluc3RydWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBjb21wbGV0ZSB0cmFuc2FjdGlvbiB0byB1cGRhdGUgYWRtaW5cbiAgICovXG4gIGFzeW5jIGJ1aWxkQWRkQWRtaW5UeChuZXdBZG1pbjogUHVibGljS2V5KTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IGl4ID0gYXdhaXQgdGhpcy5hZGRBZG1pbihuZXdBZG1pbik7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbigpLmFkZChpeCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGF1dGhvcml6ZWQgYWRtaW4gKEF1dGhvcml0eSBvbmx5KVxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlQWRtaW4oYWRtaW5Ub1JlbW92ZTogUHVibGljS2V5KTogUHJvbWlzZTxUcmFuc2FjdGlvbkluc3RydWN0aW9uPiB7XG4gICAgY29uc3QgZ2xvYmFsQ29uZmlnID0gZ2V0R2xvYmFsQ29uZmlnUGRhKHRoaXMucHJvZ3JhbS5wcm9ncmFtSWQpO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvZ3JhbS5tZXRob2RzXG4gICAgICAucmVtb3ZlQWRtaW4oYWRtaW5Ub1JlbW92ZSlcbiAgICAgIC5hY2NvdW50c1BhcnRpYWwoe1xuICAgICAgICBnbG9iYWxDb25maWcsXG4gICAgICB9KVxuICAgICAgLmluc3RydWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBjb21wbGV0ZSB0cmFuc2FjdGlvbiB0byByZW1vdmUgYWRtaW5cbiAgICovXG4gIGFzeW5jIGJ1aWxkUmVtb3ZlQWRtaW5UeChhZG1pblRvUmVtb3ZlOiBQdWJsaWNLZXkpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgaXggPSBhd2FpdCB0aGlzLnJlbW92ZUFkbWluKGFkbWluVG9SZW1vdmUpO1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb24oKS5hZGQoaXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBmZWUgY29uZmlndXJhdGlvbiAoQXV0aG9yaXR5IG9yIGF1dGhvcml6ZWQgYWRtaW4pXG4gICAqL1xuICBhc3luYyB1cGRhdGVGZWVDb25maWcocGFyYW1zOiBVcGRhdGVGZWVDb25maWdQYXJhbXMpOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24+IHtcbiAgICBjb25zdCBnbG9iYWxDb25maWcgPSBnZXRHbG9iYWxDb25maWdQZGEodGhpcy5wcm9ncmFtLnByb2dyYW1JZCk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLm1ldGhvZHNcbiAgICAgIC51cGRhdGVGZWVDb25maWcocGFyYW1zLm5ld0ZlZUJwcywgcGFyYW1zLm5ld0ZlZVJlY2lwaWVudCwgcGFyYW1zLm5ld0ZlZUNsYWltQnBzKVxuICAgICAgLmFjY291bnRzUGFydGlhbCh7XG4gICAgICAgIGdsb2JhbENvbmZpZzogZ2xvYmFsQ29uZmlnLFxuICAgICAgICBhdXRob3JpdHk6IHBhcmFtcy5hdXRob3JpdHksXG4gICAgICB9KVxuICAgICAgLmluc3RydWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBjb21wbGV0ZSB0cmFuc2FjdGlvbiB0byB1cGRhdGUgZmVlIGNvbmZpZ1xuICAgKi9cbiAgYXN5bmMgYnVpbGRVcGRhdGVGZWVDb25maWdUeChwYXJhbXM6IFVwZGF0ZUZlZUNvbmZpZ1BhcmFtcyk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBpeCA9IGF3YWl0IHRoaXMudXBkYXRlRmVlQ29uZmlnKHBhcmFtcyk7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbigpLmFkZChpeCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHByZWRpY3Rpb24gbWFya2V0IGluc3RydWN0aW9uXG4gICAqL1xuICBhc3luYyBjcmVhdGVNYXJrZXQocGFyYW1zOiBDcmVhdGVNYXJrZXRQYXJhbXMpOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24+IHtcbiAgICBjb25zdCB7IGFkbWluLCBtYXJrZXRJZCwgeWVzUHJpY2UsIG5vUHJpY2UsIGVuZFRpbWUsIGJldHRpbmdUb2tlbiB9ID0gcGFyYW1zO1xuICAgIFxuICAgIGNvbnN0IG1hcmtldElkQm4gPSBuZXcgQk4obWFya2V0SWQpO1xuICAgIGNvbnN0IHllc1ByaWNlQm4gPSBuZXcgQk4oeWVzUHJpY2UpO1xuICAgIGNvbnN0IG5vUHJpY2VCbiA9IG5ldyBCTihub1ByaWNlKTtcbiAgICBjb25zdCBlbmRUaW1lQm4gPSBuZXcgQk4oZW5kVGltZSk7XG5cbiAgICBjb25zdCBwZGFzID0gZ2V0TWFya2V0UGRhcyh0aGlzLnByb2dyYW0ucHJvZ3JhbUlkLCBhZG1pbiwgbWFya2V0SWRCbik7XG4gICAgY29uc3QgZ2xvYmFsQ29uZmlnID0gZ2V0R2xvYmFsQ29uZmlnUGRhKHRoaXMucHJvZ3JhbS5wcm9ncmFtSWQpO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvZ3JhbS5tZXRob2RzXG4gICAgICAuY3JlYXRlTWFya2V0KHtcbiAgICAgICAgICBtYXJrZXRJZDogbWFya2V0SWRCbixcbiAgICAgICAgICB5ZXNQcmljZTogeWVzUHJpY2VCbixcbiAgICAgICAgICBub1ByaWNlOiBub1ByaWNlQm4sXG4gICAgICAgICAgZW5kVGltZTogZW5kVGltZUJuLFxuICAgICAgICB9KVxuICAgICAgICAuYWNjb3VudHNQYXJ0aWFsKHtcbiAgICAgICAgICBnbG9iYWxDb25maWcsXG4gICAgICAgICAgbWFya2V0OiBwZGFzLm1hcmtldCxcbiAgICAgICAgICB5ZXNNaW50OiBwZGFzLnllc01pbnQsXG4gICAgICAgICAgbm9NaW50OiBwZGFzLm5vTWludCxcbiAgICAgICAgICBiZXR0aW5nVG9rZW46IGJldHRpbmdUb2tlbixcbiAgICAgICAgICB2YXVsdDogcGRhcy52YXVsdCxcbiAgICAgICAgICBhZG1pbjogYWRtaW4sXG4gICAgICAgICAgdG9rZW5Qcm9ncmFtOiBUT0tFTl9QUk9HUkFNX0lELFxuICAgICAgICAgIHN5c3RlbVByb2dyYW06IFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkLFxuICAgICAgICB9KVxuICAgICAgICAuaW5zdHJ1Y3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNvbXBsZXRlIHRyYW5zYWN0aW9uIHRvIGNyZWF0ZSBhIG1hcmtldFxuICAgKi9cbiAgYXN5bmMgYnVpbGRDcmVhdGVNYXJrZXRUeChwYXJhbXM6IENyZWF0ZU1hcmtldFBhcmFtcyk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBpeCA9IGF3YWl0IHRoaXMuY3JlYXRlTWFya2V0KHBhcmFtcyk7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbigpLmFkZChpeCk7XG4gIH1cblxuICAvKipcbiAgICogUGxhY2UgYSBiZXQgaW5zdHJ1Y3Rpb24gKHdpdGhvdXQgQVRBIGNyZWF0aW9uKVxuICAgKi9cbiAgYXN5bmMgcGxhY2VCZXQocGFyYW1zOiBQbGFjZUJldFBhcmFtcyk6IFByb21pc2U8VHJhbnNhY3Rpb25JbnN0cnVjdGlvbj4ge1xuICAgIGNvbnN0IHsgdXNlciwgbWFya2V0LCBhbW91bnQsIG91dGNvbWUsIGJldHRpbmdUb2tlbiwgZmVlUmVjaXBpZW50VG9rZW4gfSA9IHBhcmFtcztcbiAgICBcbiAgICBjb25zdCBhbW91bnRCbiA9IG5ldyBCTihhbW91bnQpO1xuICAgIGNvbnN0IG91dGNvbWVFbnVtID0gb3V0Y29tZSA9PT0gXCJZZXNcIiA/IHsgeWVzOiB7fSB9IDogeyBubzoge30gfTtcblxuICAgIC8vIEdldCBnbG9iYWwgY29uZmlnIGZvciBmZWUgaW5mb1xuICAgIGNvbnN0IGdsb2JhbENvbmZpZyA9IGdldEdsb2JhbENvbmZpZ1BkYSh0aGlzLnByb2dyYW0ucHJvZ3JhbUlkKTtcblxuICAgIC8vIERlcml2ZSBQREFzIGZyb20gbWFya2V0IGFkZHJlc3NcbiAgICBjb25zdCB5ZXNNaW50ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oWUVTX01JTlRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuICAgIGNvbnN0IG5vTWludCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKE5PX01JTlRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuICAgIGNvbnN0IHZhdWx0ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oVkFVTFRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuXG4gICAgY29uc3QgdXNlckJldHRpbmdUb2tlbiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKGJldHRpbmdUb2tlbiwgdXNlcik7XG4gICAgXG4gICAgLy8gRGV0ZXJtaW5lIHdoaWNoIG91dGNvbWUgdG9rZW4gdGhlIHVzZXIgd2lsbCByZWNlaXZlXG4gICAgLy8gT3V0Y29tZSB0b2tlbnMgKFllcy9ObykgdXNlIFRva2VuLTIwMjIgcHJvZ3JhbVxuICAgIGNvbnN0IHRhcmdldE1pbnQgPSBvdXRjb21lID09PSBcIlllc1wiID8geWVzTWludCA6IG5vTWludDtcbiAgICBjb25zdCB1c2VyT3V0Y29tZVRva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModGFyZ2V0TWludCwgdXNlciwgZmFsc2UsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLm1ldGhvZHNcbiAgICAgIC5wbGFjZUJldCh7XG4gICAgICAgIGJ1eU91dGNvbWU6IG91dGNvbWVFbnVtLFxuICAgICAgICBhbW91bnQ6IGFtb3VudEJuLFxuICAgICAgfSlcbiAgICAgIC5hY2NvdW50c1BhcnRpYWwoe1xuICAgICAgICBnbG9iYWxDb25maWcsXG4gICAgICAgIG1hcmtldCxcbiAgICAgICAgeWVzTWludCxcbiAgICAgICAgbm9NaW50LFxuICAgICAgICB2YXVsdCxcbiAgICAgICAgZmVlUmVjaXBpZW50VG9rZW46IGZlZVJlY2lwaWVudFRva2VuIHx8IG51bGwsXG4gICAgICAgIHVzZXJPdXRjb21lVG9rZW4sXG4gICAgICAgIHVzZXJCZXR0aW5nVG9rZW4sXG4gICAgICAgIHVzZXIsXG4gICAgICB9KVxuICAgICAgLmluc3RydWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBjb21wbGV0ZSB0cmFuc2FjdGlvbiB0byBwbGFjZSBhIGJldCAod2l0aCBvcHRpb25hbCBBVEEgY3JlYXRpb24gZm9yIGJvdGggb3V0Y29tZSB0b2tlbiBhbmQgZmVlIHJlY2lwaWVudClcbiAgICovXG4gIGFzeW5jIGJ1aWxkUGxhY2VCZXRUeChwYXJhbXM6IFBsYWNlQmV0UGFyYW1zKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHsgdXNlciwgbWFya2V0LCBvdXRjb21lLCBiZXR0aW5nVG9rZW4sIGNyZWF0ZUF0YSA9IHRydWUgfSA9IHBhcmFtcztcbiAgICBcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbigpO1xuICAgIFxuICAgIC8vIEZldGNoIGNvbmZpZyB0byBjaGVjayBmZWVfYnBzXG4gICAgY29uc3QgY29uZmlnQWNjb3VudCA9IGF3YWl0IHRoaXMuZ2V0R2xvYmFsQ29uZmlnQWNjb3VudCgpO1xuICAgIFxuICAgIC8vIERlcml2ZSBtaW50IFBEQXMgZnJvbSBtYXJrZXQgYWRkcmVzc1xuICAgIGNvbnN0IHllc01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShZRVNfTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG4gICAgY29uc3Qgbm9NaW50ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oTk9fTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG4gICAgXG4gICAgLy8gT3V0Y29tZSB0b2tlbnMgKFllcy9ObykgdXNlIFRva2VuLTIwMjIgcHJvZ3JhbVxuICAgIGNvbnN0IHRhcmdldE1pbnQgPSBvdXRjb21lID09PSBcIlllc1wiID8geWVzTWludCA6IG5vTWludDtcbiAgICBjb25zdCB1c2VyT3V0Y29tZVRva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModGFyZ2V0TWludCwgdXNlciwgZmFsc2UsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG5cbiAgICAvLyBDaGVjayBpZiB1c2VyIG91dGNvbWUgQVRBIGV4aXN0cyBhbmQgY3JlYXRlIGlmIG5lZWRlZFxuICAgIGlmIChjcmVhdGVBdGEpIHtcbiAgICAgIGNvbnN0IGV4aXN0cyA9IGF3YWl0IHRoaXMuYXRhRXhpc3RzKHVzZXJPdXRjb21lVG9rZW4pO1xuICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgY29uc3QgY3JlYXRlQXRhSXggPSB0aGlzLmNyZWF0ZUF0YUluc3RydWN0aW9uKHVzZXIsIHVzZXIsIHRhcmdldE1pbnQsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG4gICAgICAgIHR4LmFkZChjcmVhdGVBdGFJeCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGZlZSByZWNpcGllbnQgdG9rZW4gYWNjb3VudCBpZiBmZWVfYnBzID4gMFxuICAgIGxldCBmZWVSZWNpcGllbnRUb2tlbjogUHVibGljS2V5IHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKGNvbmZpZ0FjY291bnQuZmVlQnBzID4gMCkge1xuICAgICAgY29uc3QgZmVlUmVjaXBpZW50QWRkcmVzcyA9IHBhcmFtcy5mZWVSZWNpcGllbnQgfHwgY29uZmlnQWNjb3VudC5mZWVSZWNpcGllbnQ7XG4gICAgICBmZWVSZWNpcGllbnRUb2tlbiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKGJldHRpbmdUb2tlbiwgZmVlUmVjaXBpZW50QWRkcmVzcyk7XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIGZlZSByZWNpcGllbnQgQVRBIGV4aXN0cyBhbmQgY3JlYXRlIGlmIG5lZWRlZFxuICAgICAgY29uc3QgZmVlQXRhRXhpc3RzID0gYXdhaXQgdGhpcy5hdGFFeGlzdHMoZmVlUmVjaXBpZW50VG9rZW4pO1xuICAgICAgaWYgKCFmZWVBdGFFeGlzdHMpIHtcbiAgICAgICAgY29uc3QgY3JlYXRlRmVlQXRhSXggPSB0aGlzLmNyZWF0ZUF0YUluc3RydWN0aW9uKHVzZXIsIGZlZVJlY2lwaWVudEFkZHJlc3MsIGJldHRpbmdUb2tlbik7XG4gICAgICAgIHR4LmFkZChjcmVhdGVGZWVBdGFJeCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGxhY2VCZXRJeCA9IGF3YWl0IHRoaXMucGxhY2VCZXQoe1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgZmVlUmVjaXBpZW50VG9rZW4sXG4gICAgfSk7XG4gICAgdHguYWRkKHBsYWNlQmV0SXgpO1xuXG4gICAgcmV0dXJuIHR4O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgdHJhbnNhY3Rpb24gdG8gcGxhY2UgYmV0cyBmcm9tIGJvdGggdXNlciBhbmQgYm9udXMgYWNjb3VudCBpbiBvbmUgdHJhbnNhY3Rpb24uXG4gICAqIFRoaXMgdHJhbnNhY3Rpb24gcmVxdWlyZXMgdHdvIHNpZ25lcnM6IHVzZXIgYW5kIGJvbnVzQWNjb3VudC5cbiAgICogXG4gICAqIFVzZSBjYXNlOiBVc2VyIHBheXMgcGFydCBvZiB0aGUgYmV0LCBib251cyBhY2NvdW50IChiYWNrZW5kKSBwYXlzIHRoZSByZXN0LlxuICAgKiBFeGFtcGxlOiBVc2VyIGJldHMgMTBVIHRvdGFsLCB1c2VyIHBheXMgOFUsIGJvbnVzIGFjY291bnQgcGF5cyAyVS5cbiAgICogXG4gICAqIEJvdGggYmV0cyBhcmUgcGxhY2VkIG9uIHRoZSBzYW1lIG91dGNvbWUsIGJ1dCBvdXRjb21lIHRva2VucyBnbyB0byBlYWNoIGFjY291bnQgcmVzcGVjdGl2ZWx5LlxuICAgKi9cbiAgYXN5bmMgYnVpbGRQbGFjZUJldFYyVHgocGFyYW1zOiBQbGFjZUJldFYyUGFyYW1zKTogUHJvbWlzZTxQbGFjZUJldFYyUmVzdWx0PiB7XG4gICAgY29uc3QgeyBcbiAgICAgIHVzZXIsIFxuICAgICAgYm9udXNBY2NvdW50LCBcbiAgICAgIG1hcmtldCwgXG4gICAgICB1c2VyQW1vdW50LCBcbiAgICAgIGJvbnVzQW1vdW50LCBcbiAgICAgIG91dGNvbWUsIFxuICAgICAgYmV0dGluZ1Rva2VuLCBcbiAgICAgIGNyZWF0ZUF0YSA9IHRydWUgXG4gICAgfSA9IHBhcmFtcztcbiAgICBcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbigpO1xuICAgIFxuICAgIC8vIEZldGNoIGNvbmZpZyB0byBjaGVjayBmZWVfYnBzXG4gICAgY29uc3QgY29uZmlnQWNjb3VudCA9IGF3YWl0IHRoaXMuZ2V0R2xvYmFsQ29uZmlnQWNjb3VudCgpO1xuICAgIFxuICAgIC8vIERlcml2ZSBtaW50IFBEQXMgZnJvbSBtYXJrZXQgYWRkcmVzc1xuICAgIGNvbnN0IHllc01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShZRVNfTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG4gICAgY29uc3Qgbm9NaW50ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oTk9fTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG4gICAgXG4gICAgLy8gT3V0Y29tZSB0b2tlbnMgKFllcy9ObykgdXNlIFRva2VuLTIwMjIgcHJvZ3JhbVxuICAgIGNvbnN0IHRhcmdldE1pbnQgPSBvdXRjb21lID09PSBcIlllc1wiID8geWVzTWludCA6IG5vTWludDtcbiAgICBcbiAgICAvLyBVc2VyJ3Mgb3V0Y29tZSB0b2tlbiBhY2NvdW50XG4gICAgY29uc3QgdXNlck91dGNvbWVUb2tlbiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHRhcmdldE1pbnQsIHVzZXIsIGZhbHNlLCBUT0tFTl8yMDIyX1BST0dSQU1fSUQpO1xuICAgIFxuICAgIC8vIEJvbnVzIGFjY291bnQncyBvdXRjb21lIHRva2VuIGFjY291bnRcbiAgICBjb25zdCBib251c091dGNvbWVUb2tlbiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHRhcmdldE1pbnQsIGJvbnVzQWNjb3VudCwgZmFsc2UsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG5cbiAgICAvLyBDcmVhdGUgQVRBcyBpZiBuZWVkZWRcbiAgICBpZiAoY3JlYXRlQXRhKSB7XG4gICAgICAvLyBDaGVjayBpZiB1c2VyIG91dGNvbWUgQVRBIGV4aXN0cyBhbmQgY3JlYXRlIGlmIG5lZWRlZFxuICAgICAgY29uc3QgdXNlckF0YUV4aXN0cyA9IGF3YWl0IHRoaXMuYXRhRXhpc3RzKHVzZXJPdXRjb21lVG9rZW4pO1xuICAgICAgaWYgKCF1c2VyQXRhRXhpc3RzKSB7XG4gICAgICAgIGNvbnN0IGNyZWF0ZVVzZXJBdGFJeCA9IHRoaXMuY3JlYXRlQXRhSW5zdHJ1Y3Rpb24odXNlciwgdXNlciwgdGFyZ2V0TWludCwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcbiAgICAgICAgdHguYWRkKGNyZWF0ZVVzZXJBdGFJeCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIGJvbnVzIGFjY291bnQgb3V0Y29tZSBBVEEgZXhpc3RzIGFuZCBjcmVhdGUgaWYgbmVlZGVkXG4gICAgICBjb25zdCBib251c0F0YUV4aXN0cyA9IGF3YWl0IHRoaXMuYXRhRXhpc3RzKGJvbnVzT3V0Y29tZVRva2VuKTtcbiAgICAgIGlmICghYm9udXNBdGFFeGlzdHMpIHtcbiAgICAgICAgLy8gVXNlciBwYXlzIGZvciBjcmVhdGluZyB0aGUgYm9udXMgYWNjb3VudCdzIEFUQVxuICAgICAgICBjb25zdCBjcmVhdGVCb251c0F0YUl4ID0gdGhpcy5jcmVhdGVBdGFJbnN0cnVjdGlvbih1c2VyLCBib251c0FjY291bnQsIHRhcmdldE1pbnQsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG4gICAgICAgIHR4LmFkZChjcmVhdGVCb251c0F0YUl4KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZmVlIHJlY2lwaWVudCB0b2tlbiBhY2NvdW50IGlmIGZlZV9icHMgPiAwXG4gICAgbGV0IGZlZVJlY2lwaWVudFRva2VuOiBQdWJsaWNLZXkgfCBudWxsID0gbnVsbDtcbiAgICBpZiAoY29uZmlnQWNjb3VudC5mZWVCcHMgPiAwKSB7XG4gICAgICBjb25zdCBmZWVSZWNpcGllbnRBZGRyZXNzID0gcGFyYW1zLmZlZVJlY2lwaWVudCB8fCBjb25maWdBY2NvdW50LmZlZVJlY2lwaWVudDtcbiAgICAgIGZlZVJlY2lwaWVudFRva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMoYmV0dGluZ1Rva2VuLCBmZWVSZWNpcGllbnRBZGRyZXNzKTtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgZmVlIHJlY2lwaWVudCBBVEEgZXhpc3RzIGFuZCBjcmVhdGUgaWYgbmVlZGVkXG4gICAgICBjb25zdCBmZWVBdGFFeGlzdHMgPSBhd2FpdCB0aGlzLmF0YUV4aXN0cyhmZWVSZWNpcGllbnRUb2tlbik7XG4gICAgICBpZiAoIWZlZUF0YUV4aXN0cykge1xuICAgICAgICBjb25zdCBjcmVhdGVGZWVBdGFJeCA9IHRoaXMuY3JlYXRlQXRhSW5zdHJ1Y3Rpb24odXNlciwgZmVlUmVjaXBpZW50QWRkcmVzcywgYmV0dGluZ1Rva2VuKTtcbiAgICAgICAgdHguYWRkKGNyZWF0ZUZlZUF0YUl4KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgdXNlcidzIHBsYWNlQmV0IGluc3RydWN0aW9uXG4gICAgY29uc3QgdXNlckJldEl4ID0gYXdhaXQgdGhpcy5wbGFjZUJldCh7XG4gICAgICB1c2VyLFxuICAgICAgbWFya2V0LFxuICAgICAgYW1vdW50OiB1c2VyQW1vdW50LFxuICAgICAgb3V0Y29tZSxcbiAgICAgIGJldHRpbmdUb2tlbixcbiAgICAgIGZlZVJlY2lwaWVudFRva2VuLFxuICAgIH0pO1xuICAgIHR4LmFkZCh1c2VyQmV0SXgpO1xuXG4gICAgLy8gQ3JlYXRlIGJvbnVzIGFjY291bnQncyBwbGFjZUJldCBpbnN0cnVjdGlvblxuICAgIGNvbnN0IGJvbnVzQmV0SXggPSBhd2FpdCB0aGlzLnBsYWNlQmV0KHtcbiAgICAgIHVzZXI6IGJvbnVzQWNjb3VudCxcbiAgICAgIG1hcmtldCxcbiAgICAgIGFtb3VudDogYm9udXNBbW91bnQsXG4gICAgICBvdXRjb21lLFxuICAgICAgYmV0dGluZ1Rva2VuLFxuICAgICAgZmVlUmVjaXBpZW50VG9rZW4sXG4gICAgfSk7XG4gICAgdHguYWRkKGJvbnVzQmV0SXgpO1xuICAgIHJldHVybiB7XG4gICAgICB0cmFuc2FjdGlvbjogdHgsXG4gICAgICByZXF1aXJlZFNpZ25lcnM6IFt1c2VyLCBib251c0FjY291bnRdLFxuICAgIH07XG4gIH1cblxuICBhc3luYyB3aXRoZHJhd0JvbnVzKCkge1xuICAgIFxuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGEgYmFzZTY0IGVuY29kZWQgdHJhbnNhY3Rpb25cbiAgICogVXNlIHRoaXMgb24gZnJvbnRlbmQgdG8gZGVjb2RlIHRoZSB0cmFuc2FjdGlvbiByZWNlaXZlZCBmcm9tIGJhY2tlbmRcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZVRyYW5zYWN0aW9uKHNlcmlhbGl6ZWRUeDogc3RyaW5nKTogVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHNlcmlhbGl6ZWRUeCwgJ2Jhc2U2NCcpO1xuICAgIHJldHVybiBUcmFuc2FjdGlvbi5mcm9tKGJ1ZmZlcik7XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBhIHBhcnRpYWxseSBzaWduZWQgdHJhbnNhY3Rpb24gd2l0aCB0aGUgYm9udXMgYWNjb3VudCAoYmFja2VuZCBzaWRlKVxuICAgKiBcbiAgICogQHBhcmFtIHVzZXJTaWduZWRUeEJhc2U2NCAtIEJhc2U2NCBlbmNvZGVkIHRyYW5zYWN0aW9uIHRoYXQgaGFzIGJlZW4gc2lnbmVkIGJ5IHVzZXJcbiAgICogQHBhcmFtIGJvbnVzQWNjb3VudEtleXBhaXIgLSBUaGUgYm9udXMgYWNjb3VudCBrZXlwYWlyIGZvciBzaWduaW5nXG4gICAqIEByZXR1cm5zIFRoZSBmdWxseSBzaWduZWQgdHJhbnNhY3Rpb24gcmVhZHkgZm9yIHN1Ym1pc3Npb25cbiAgICovXG4gIHN0YXRpYyBzaWduV2l0aEtleVBhaXIodXNlclNpZ25lZFR4QmFzZTY0OiBzdHJpbmcsIGtleVBhaXI6IEtleXBhaXIpOiBUcmFuc2FjdGlvbiB7XG4gICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20odXNlclNpZ25lZFR4QmFzZTY0LCAnYmFzZTY0Jyk7XG4gICAgY29uc3QgdHggPSBUcmFuc2FjdGlvbi5mcm9tKGJ1ZmZlcik7XG4gICAgdHgucGFydGlhbFNpZ24oa2V5UGFpcik7XG4gICAgcmV0dXJuIHR4O1xuICB9XG5cbiAgLy8gYXN5bmMgdHJhbnNmZXIoKVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIHRyYW5zYWN0aW9uIHRvIHdpdGhkcmF3IGJvbnVzICh0cmFuc2ZlciBVU0RUIGZyb20gYm9udXMgYWNjb3VudCB0byB1c2VyKVxuICAgKiBUaGlzIHRyYW5zYWN0aW9uIHJlcXVpcmVzIHRoZSBib251cyBhY2NvdW50IHRvIHNpZ24uXG4gICAqIFxuICAgKiBAcGFyYW0gYm9udXNBY2NvdW50IC0gVGhlIGJvbnVzIGFjY291bnQgcHVibGljIGtleSAoc2lnbmVyLCBzb3VyY2Ugb2YgZnVuZHMpXG4gICAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIncyBwdWJsaWMga2V5IChkZXN0aW5hdGlvbilcbiAgICogQHBhcmFtIHRva2VuTWludCAtIFRoZSB0b2tlbiBtaW50IGFkZHJlc3MgKGUuZy4sIFVTRFQpXG4gICAqIEBwYXJhbSBhbW91bnQgLSBBbW91bnQgdG8gdHJhbnNmZXIgKGluIHRva2VuJ3Mgc21hbGxlc3QgdW5pdCwgZS5nLiwgMV8wMDBfMDAwIGZvciAxIFVTRFQgd2l0aCA2IGRlY2ltYWxzKVxuICAgKiBAcGFyYW0gY3JlYXRlQXRhIC0gV2hldGhlciB0byBjcmVhdGUgdGhlIHVzZXIncyBBVEEgaWYgaXQgZG9lc24ndCBleGlzdCAoZGVmYXVsdDogdHJ1ZSlcbiAgICogQHJldHVybnMgVHJhbnNhY3Rpb24gcmVhZHkgZm9yIHNpZ25pbmdcbiAgICovXG4gIGFzeW5jIGJ1aWxkV2l0aGRyYXdCb251c1R4KHBhcmFtczoge1xuICAgIGJvbnVzQWNjb3VudDogUHVibGljS2V5O1xuICAgIHVzZXI6IFB1YmxpY0tleTtcbiAgICB0b2tlbk1pbnQ6IFB1YmxpY0tleTtcbiAgICBhbW91bnQ6IG51bWJlciB8IEJOO1xuICAgIGNyZWF0ZUF0YT86IGJvb2xlYW47XG4gIH0pOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgeyBib251c0FjY291bnQsIHVzZXIsIHRva2VuTWludCwgYW1vdW50LCBjcmVhdGVBdGEgPSB0cnVlIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgYW1vdW50Qm4gPSBuZXcgQk4oYW1vdW50KTtcbiAgICBcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbigpO1xuICAgIFxuICAgIC8vIEdldCBBVEEgYWRkcmVzc2VzIGZvciBib3RoIGFjY291bnRzXG4gICAgY29uc3QgYm9udXNUb2tlbkFjY291bnQgPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh0b2tlbk1pbnQsIGJvbnVzQWNjb3VudCk7XG4gICAgY29uc3QgdXNlclRva2VuQWNjb3VudCA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHRva2VuTWludCwgdXNlcik7XG4gICAgXG4gICAgLy8gQ3JlYXRlIHVzZXIncyBBVEEgaWYgbmVlZGVkXG4gICAgaWYgKGNyZWF0ZUF0YSkge1xuICAgICAgY29uc3QgdXNlckF0YUV4aXN0cyA9IGF3YWl0IHRoaXMuYXRhRXhpc3RzKHVzZXJUb2tlbkFjY291bnQpO1xuICAgICAgaWYgKCF1c2VyQXRhRXhpc3RzKSB7XG4gICAgICAgIGNvbnN0IGNyZWF0ZVVzZXJBdGFJeCA9IHRoaXMuY3JlYXRlQXRhSW5zdHJ1Y3Rpb24oYm9udXNBY2NvdW50LCB1c2VyLCB0b2tlbk1pbnQpO1xuICAgICAgICB0eC5hZGQoY3JlYXRlVXNlckF0YUl4KTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gQ3JlYXRlIHRyYW5zZmVyIGluc3RydWN0aW9uXG4gICAgY29uc3QgdHJhbnNmZXJJeCA9IGNyZWF0ZVRyYW5zZmVySW5zdHJ1Y3Rpb24oXG4gICAgICBib251c1Rva2VuQWNjb3VudCwgIC8vIHNvdXJjZVxuICAgICAgdXNlclRva2VuQWNjb3VudCwgICAvLyBkZXN0aW5hdGlvblxuICAgICAgYm9udXNBY2NvdW50LCAgICAgICAvLyBvd25lciAoc2lnbmVyKVxuICAgICAgQmlnSW50KGFtb3VudEJuLnRvU3RyaW5nKCkpLCAgLy8gYW1vdW50XG4gICAgICBbXSwgICAgICAgICAgICAgICAgIC8vIG11bHRpU2lnbmVycyAoZW1wdHkgZm9yIHNpbmdsZSBzaWduZXIpXG4gICAgICBUT0tFTl9QUk9HUkFNX0lEICAgIC8vIHByb2dyYW0gaWRcbiAgICApO1xuICAgIHR4LmFkZCh0cmFuc2Zlckl4KTtcbiAgICBcbiAgICByZXR1cm4gdHg7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYW5kIHJldHVybiBhIHRyYW5zYWN0aW9uIGZvciB3aXRoZHJhd2luZyBib251cyB3aXRoIHNlcmlhbGl6YXRpb24gaW5mb1xuICAgKiBVc2VmdWwgZm9yIHNwbGl0IHNpZ25pbmcgd29ya2Zsb3cgd2hlcmUgdXNlci9hZG1pbiBidWlsZHMgdHggYW5kIGJvbnVzIGFjY291bnQgc2lnbnNcbiAgICogXG4gICAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIHRyYW5zYWN0aW9uIGFuZCByZXF1aXJlZCBzaWduZXJzXG4gICAqL1xuICBhc3luYyBidWlsZFdpdGhkcmF3Qm9udXNUeFdpdGhJbmZvKHBhcmFtczoge1xuICAgIGJvbnVzQWNjb3VudDogUHVibGljS2V5O1xuICAgIHVzZXI6IFB1YmxpY0tleTtcbiAgICB0b2tlbk1pbnQ6IFB1YmxpY0tleTtcbiAgICBhbW91bnQ6IG51bWJlciB8IEJOO1xuICAgIGNyZWF0ZUF0YT86IGJvb2xlYW47XG4gIH0pOiBQcm9taXNlPHsgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uOyByZXF1aXJlZFNpZ25lcnM6IFB1YmxpY0tleVtdIH0+IHtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHRoaXMuYnVpbGRXaXRoZHJhd0JvbnVzVHgocGFyYW1zKTtcbiAgICByZXR1cm4ge1xuICAgICAgdHJhbnNhY3Rpb246IHR4LFxuICAgICAgcmVxdWlyZWRTaWduZXJzOiBbcGFyYW1zLmJvbnVzQWNjb3VudF0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGFpbSByZXdhcmRzIGFmdGVyIG1hcmtldCByZXNvbHV0aW9uXG4gICAqL1xuICBhc3luYyBjbGFpbVJld2FyZHMocGFyYW1zOiBDbGFpbVJld2FyZHNQYXJhbXMpOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24+IHtcbiAgICBjb25zdCB7IHVzZXIsIG1hcmtldCwgYmV0dGluZ1Rva2VuLCB3aW5uaW5nT3V0Y29tZSB9ID0gcGFyYW1zO1xuXG4gICAgLy8gRGVyaXZlIG1pbnQgUERBcyBmcm9tIG1hcmtldCBhZGRyZXNzXG4gICAgY29uc3QgeWVzTWludCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKFlFU19NSU5UX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcbiAgICBjb25zdCBub01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShOT19NSU5UX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcblxuICAgIC8vIERlcml2ZSB2YXVsdCBQREFcbiAgICBjb25zdCB2YXVsdCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKFZBVUxUX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcblxuICAgIGNvbnN0IHVzZXJCZXR0aW5nVG9rZW4gPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhiZXR0aW5nVG9rZW4sIHVzZXIpO1xuICAgIC8vIE91dGNvbWUgdG9rZW5zIChZZXMvTm8pIHVzZSBUb2tlbi0yMDIyIHByb2dyYW1cbiAgICBjb25zdCB0YXJnZXRNaW50ID0gd2lubmluZ091dGNvbWUgPT09IFwiWWVzXCIgPyB5ZXNNaW50IDogbm9NaW50O1xuICAgIGNvbnN0IHVzZXJPdXRjb21lVG9rZW4gPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh0YXJnZXRNaW50LCB1c2VyLCBmYWxzZSwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcbiAgICBjb25zdCBzaGFyZXNUb0NsYWltQm4gPSBuZXcgQk4ocGFyYW1zLnNoYXJlc1RvQ2xhaW0pO1xuICAgIGNvbnN0IGNsb3NlQWNjb3VudCA9IHBhcmFtcy5jbG9zZUFjY291bnQgPz8gdHJ1ZTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLm1ldGhvZHNcbiAgICAgIC5jbGFpbVJld2FyZHMoe1xuICAgICAgICB0b2tlbkFtb3VudDogc2hhcmVzVG9DbGFpbUJuLFxuICAgICAgICBjbG9zZUFjY291bnQsXG4gICAgICB9KVxuICAgICAgLmFjY291bnRzUGFydGlhbCh7XG4gICAgICAgIG1hcmtldCxcbiAgICAgICAgeWVzTWludCxcbiAgICAgICAgbm9NaW50LFxuICAgICAgICB2YXVsdCxcbiAgICAgICAgdXNlck91dGNvbWVUb2tlbixcbiAgICAgICAgdXNlckJldHRpbmdUb2tlbixcbiAgICAgICAgdXNlcixcbiAgICAgIH0pXG4gICAgICAuaW5zdHJ1Y3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNvbXBsZXRlIHRyYW5zYWN0aW9uIHRvIGNsYWltIHJld2FyZHNcbiAgICovXG4gIGFzeW5jIGJ1aWxkQ2xhaW1SZXdhcmRzVHgocGFyYW1zOiBDbGFpbVJld2FyZHNQYXJhbXMpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgeyB1c2VyLCBtYXJrZXQsIGJldHRpbmdUb2tlbiwgd2lubmluZ091dGNvbWUgfSA9IHBhcmFtcztcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbigpO1xuXG4gICAgLy8gRGVyaXZlIG1pbnQgUERBcyBmcm9tIG1hcmtldCBhZGRyZXNzXG4gICAgY29uc3QgeWVzTWludCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKFlFU19NSU5UX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcblxuICAgIGNvbnN0IG5vTWludCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKE5PX01JTlRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuXG4gICAgLy8gRGVyaXZlIHZhdWx0IFBEQVxuICAgIGNvbnN0IHZhdWx0ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oVkFVTFRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuXG4gICAgY29uc3QgdXNlckJldHRpbmdUb2tlbiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKGJldHRpbmdUb2tlbiwgdXNlcik7XG4gICAgLy8gT3V0Y29tZSB0b2tlbnMgKFllcy9ObykgdXNlIFRva2VuLTIwMjIgcHJvZ3JhbVxuICAgIGNvbnN0IHRhcmdldE1pbnQgPSB3aW5uaW5nT3V0Y29tZSA9PT0gXCJZZXNcIiA/IHllc01pbnQgOiBub01pbnQ7XG4gICAgY29uc3QgdXNlck91dGNvbWVUb2tlbiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHRhcmdldE1pbnQsIHVzZXIsIGZhbHNlLCBUT0tFTl8yMDIyX1BST0dSQU1fSUQpO1xuICAgIGNvbnN0IHNoYXJlc1RvQ2xhaW1CbiA9IG5ldyBCTihwYXJhbXMuc2hhcmVzVG9DbGFpbSk7XG4gICAgY29uc3QgY2xvc2VBY2NvdW50ID0gcGFyYW1zLmNsb3NlQWNjb3VudCA/PyB0cnVlO1xuXG4gICAgY29uc3QgaXggPSBhd2FpdCB0aGlzLnByb2dyYW0ubWV0aG9kc1xuICAgICAgLmNsYWltUmV3YXJkcyh7XG4gICAgICAgIHRva2VuQW1vdW50OiBzaGFyZXNUb0NsYWltQm4sXG4gICAgICAgIGNsb3NlQWNjb3VudCxcbiAgICAgIH0pXG4gICAgICAuYWNjb3VudHNQYXJ0aWFsKHtcbiAgICAgICAgbWFya2V0LFxuICAgICAgICB5ZXNNaW50LFxuICAgICAgICBub01pbnQsXG4gICAgICAgIHZhdWx0LFxuICAgICAgICB1c2VyT3V0Y29tZVRva2VuLFxuICAgICAgICB1c2VyQmV0dGluZ1Rva2VuLFxuICAgICAgICB1c2VyLFxuICAgICAgfSlcbiAgICAgIC5pbnN0cnVjdGlvbigpO1xuICAgIFxuICAgIHR4LmFkZChpeCk7XG4gICAgcmV0dXJuIHR4O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGluc3RydWN0aW9ucyB0byBjbGFpbSByZXdhcmRzIGZyb20gbXVsdGlwbGUgbWFya2V0c1xuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGluc3RydWN0aW9ucyB0aGF0IGNhbiBiZSBiYXRjaGVkIGludG8gdHJhbnNhY3Rpb25zXG4gICAqL1xuICBhc3luYyBiYXRjaENsYWltUmV3YXJkcyhwYXJhbXM6IEJhdGNoQ2xhaW1QYXJhbXMpOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXT4ge1xuICAgIGNvbnN0IHsgdXNlciwgY2xhaW1zIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgY2xhaW0gb2YgY2xhaW1zKSB7XG4gICAgICBjb25zdCBpeCA9IGF3YWl0IHRoaXMuY2xhaW1SZXdhcmRzKHtcbiAgICAgICAgdXNlcixcbiAgICAgICAgbWFya2V0OiBjbGFpbS5tYXJrZXQsXG4gICAgICAgIGJldHRpbmdUb2tlbjogY2xhaW0uYmV0dGluZ1Rva2VuLFxuICAgICAgICB3aW5uaW5nT3V0Y29tZTogY2xhaW0ud2lubmluZ091dGNvbWUsXG4gICAgICAgIHNoYXJlc1RvQ2xhaW06IGNsYWltLnNoYXJlc1RvQ2xhaW0gPz8gMCxcbiAgICAgICAgY2xvc2VBY2NvdW50OiBjbGFpbS5jbG9zZUFjY291bnQgPz8gdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgaW5zdHJ1Y3Rpb25zLnB1c2goaXgpO1xuICAgIH1cblxuICAgIHJldHVybiBpbnN0cnVjdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdHJhbnNhY3Rpb25zIHRvIGNsYWltIHJld2FyZHMgZnJvbSBtdWx0aXBsZSBtYXJrZXRzXG4gICAqIEF1dG9tYXRpY2FsbHkgc3BsaXRzIGludG8gbXVsdGlwbGUgdHJhbnNhY3Rpb25zIGlmIG5lZWRlZCAobWF4IDUgY2xhaW1zIHBlciB0eCB0byBhdm9pZCBzaXplIGxpbWl0cylcbiAgICogQHBhcmFtIHBhcmFtcyAtIEJhdGNoIGNsYWltIHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIG1heENsYWltc1BlclR4IC0gTWF4aW11bSBjbGFpbXMgcGVyIHRyYW5zYWN0aW9uIChkZWZhdWx0OiA1KVxuICAgKiBAcmV0dXJucyBBcnJheSBvZiB0cmFuc2FjdGlvbnNcbiAgICovXG4gIGFzeW5jIGJ1aWxkQmF0Y2hDbGFpbVJld2FyZHNUeChcbiAgICBwYXJhbXM6IEJhdGNoQ2xhaW1QYXJhbXMsXG4gICAgbWF4Q2xhaW1zUGVyVHg6IG51bWJlciA9IDVcbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvbltdPiB7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gYXdhaXQgdGhpcy5iYXRjaENsYWltUmV3YXJkcyhwYXJhbXMpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uczogVHJhbnNhY3Rpb25bXSA9IFtdO1xuXG4gICAgLy8gU3BsaXQgaW5zdHJ1Y3Rpb25zIGludG8gY2h1bmtzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnN0cnVjdGlvbnMubGVuZ3RoOyBpICs9IG1heENsYWltc1BlclR4KSB7XG4gICAgICBjb25zdCBjaHVuayA9IGluc3RydWN0aW9ucy5zbGljZShpLCBpICsgbWF4Q2xhaW1zUGVyVHgpO1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oKTtcbiAgICAgIGNodW5rLmZvckVhY2goaXggPT4gdHguYWRkKGl4KSk7XG4gICAgICB0cmFuc2FjdGlvbnMucHVzaCh0eCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYW5zYWN0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZ1bmQgYmV0cyBpZiBtYXJrZXQgaXMgcmVmdW5kZWRcbiAgICogQHBhcmFtIHBhcmFtcy50b2tlbkFtb3VudCAtIEFtb3VudCBvZiBzaGFyZXMgdG8gcmVmdW5kLiAwIG9yIHVuZGVmaW5lZCBtZWFucyByZWZ1bmQgYWxsIHNoYXJlcy5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgYWxsb3dzIHVzZXJzIHRvIHBhcnRpYWxseSByZWZ1bmQgdGhlaXIgcG9zaXRpb24gYWNyb3NzIG11bHRpcGxlIHRyYW5zYWN0aW9ucy5cbiAgICovXG4gIGFzeW5jIHJlZnVuZChwYXJhbXM6IFJlZnVuZFBhcmFtcyk6IFByb21pc2U8VHJhbnNhY3Rpb25JbnN0cnVjdGlvbj4ge1xuICAgIGNvbnN0IHsgdXNlciwgbWFya2V0LCBiZXR0aW5nVG9rZW4sIG91dGNvbWUsIHRva2VuQW1vdW50LCBjbG9zZUFjY291bnQgPSB0cnVlIH0gPSBwYXJhbXM7XG4gICAgXG4gICAgY29uc3Qgb3V0Y29tZUVudW0gPSBvdXRjb21lID09PSBcIlllc1wiID8geyB5ZXM6IHt9IH0gOiB7IG5vOiB7fSB9O1xuICAgIFxuICAgIC8vIENvbnZlcnQgdG9rZW5BbW91bnQgdG8gQk4gKDAgbWVhbnMgcmVmdW5kIGFsbClcbiAgICBjb25zdCB0b2tlbkFtb3VudEJuID0gbmV3IEJOKHRva2VuQW1vdW50ID8/IDApO1xuICAgIFxuICAgIC8vIERlcml2ZSBtaW50IFBEQXMgZnJvbSBtYXJrZXQgYWRkcmVzc1xuICAgIGNvbnN0IHllc01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShZRVNfTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG4gICAgY29uc3Qgbm9NaW50ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oTk9fTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG5cbiAgICAvLyBEZXJpdmUgdmF1bHQgUERBXG4gICAgY29uc3QgdmF1bHQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShWQVVMVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG5cbiAgICBjb25zdCB1c2VyQmV0dGluZ1Rva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMoYmV0dGluZ1Rva2VuLCB1c2VyKTtcbiAgICAvLyBPdXRjb21lIHRva2VucyAoWWVzL05vKSB1c2UgVG9rZW4tMjAyMiBwcm9ncmFtXG4gICAgY29uc3QgdGFyZ2V0TWludCA9IG91dGNvbWUgPT09IFwiWWVzXCIgPyB5ZXNNaW50IDogbm9NaW50O1xuICAgIGNvbnN0IHVzZXJPdXRjb21lVG9rZW4gPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh0YXJnZXRNaW50LCB1c2VyLCBmYWxzZSwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb2dyYW0ubWV0aG9kc1xuICAgICAgLnJlZnVuZCh7XG4gICAgICAgIG91dGNvbWU6IG91dGNvbWVFbnVtLFxuICAgICAgICB0b2tlbkFtb3VudDogdG9rZW5BbW91bnRCbixcbiAgICAgICAgY2xvc2VBY2NvdW50LFxuICAgICAgfSlcbiAgICAgIC5hY2NvdW50c1BhcnRpYWwoe1xuICAgICAgICBtYXJrZXQ6IG1hcmtldCxcbiAgICAgICAgeWVzTWludDogeWVzTWludCxcbiAgICAgICAgbm9NaW50OiBub01pbnQsXG4gICAgICAgIHZhdWx0OiB2YXVsdCxcbiAgICAgICAgdXNlck91dGNvbWVUb2tlbjogdXNlck91dGNvbWVUb2tlbixcbiAgICAgICAgdXNlckJldHRpbmdUb2tlbjogdXNlckJldHRpbmdUb2tlbixcbiAgICAgICAgdG9rZW5Qcm9ncmFtOiBUT0tFTl9QUk9HUkFNX0lELFxuICAgICAgICB0b2tlbjIwMjJQcm9ncmFtOiBUT0tFTl8yMDIyX1BST0dSQU1fSUQsXG4gICAgICAgIHVzZXI6IHVzZXIsXG4gICAgICB9KVxuICAgICAgLmluc3RydWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBjb21wbGV0ZSB0cmFuc2FjdGlvbiB0byByZWZ1bmRcbiAgICovXG4gIGFzeW5jIGJ1aWxkUmVmdW5kVHgocGFyYW1zOiBSZWZ1bmRQYXJhbXMpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgaXggPSBhd2FpdCB0aGlzLnJlZnVuZChwYXJhbXMpO1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb24oKS5hZGQoaXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBtYXJrZXQgKEFkbWluIG9ubHkpXG4gICAqL1xuICBhc3luYyByZXNvbHZlTWFya2V0QnlJRChcbiAgICBhZG1pbjogUHVibGljS2V5LFxuICAgIG1hcmtldElkOiBudW1iZXIgfCBCTixcbiAgICB3aW5uaW5nT3V0Y29tZTogXCJZZXNcIiB8IFwiTm9cIiB8IG51bGwsXG4gICAgZmVlUmVjaXBpZW50PzogUHVibGljS2V5XG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb25JbnN0cnVjdGlvbj4ge1xuICAgIGNvbnN0IG1hcmtldElkQm4gPSBuZXcgQk4obWFya2V0SWQpO1xuICAgIGNvbnN0IG1hcmtldFBkYSA9IGdldE1hcmtldFBkYSh0aGlzLnByb2dyYW0ucHJvZ3JhbUlkLCBhZG1pbiwgbWFya2V0SWRCbik7XG4gICAgY29uc3QgZ2xvYmFsQ29uZmlnID0gZ2V0R2xvYmFsQ29uZmlnUGRhKHRoaXMucHJvZ3JhbS5wcm9ncmFtSWQpO1xuXG4gICAgbGV0IG91dGNvbWVFbnVtOiBhbnkgPSBudWxsO1xuICAgIGlmICh3aW5uaW5nT3V0Y29tZSA9PT0gXCJZZXNcIikge1xuICAgICAgb3V0Y29tZUVudW0gPSB7IHllczoge30gfTtcbiAgICB9IGVsc2UgaWYgKHdpbm5pbmdPdXRjb21lID09PSBcIk5vXCIpIHtcbiAgICAgIG91dGNvbWVFbnVtID0geyBubzoge30gfTtcbiAgICB9XG5cbiAgICAvLyBHZXQgbWFya2V0IGluZm8gdG8gZGV0ZXJtaW5lIGJldHRpbmcgdG9rZW5cbiAgICBjb25zdCBtYXJrZXRJbmZvID0gYXdhaXQgdGhpcy5nZXRNYXJrZXRJbmZvKG1hcmtldFBkYSk7XG4gICAgLy8gZmVlIHJlY2lwaWVudCBhZGRyZXNzXG4gICAgY29uc3QgZmVlUmVjaXBpZW50QWRkcmVzcyA9IGZlZVJlY2lwaWVudCB8fCAoYXdhaXQgdGhpcy5nZXRHbG9iYWxDb25maWdBY2NvdW50KCkpLmZlZVJlY2lwaWVudDtcbiAgICAvLyBmZWUgcmVjaXBpZW50IHRva2VuIGFjY291bnQgKGFsbG93T3duZXJPZmZDdXJ2ZSBmb3IgbXVsdGlzaWcvUERBKVxuICAgIGNvbnN0IGZlZVJlY2lwaWVudFRva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMobWFya2V0SW5mby5iZXR0aW5nVG9rZW4sIGZlZVJlY2lwaWVudEFkZHJlc3MsIHRydWUpO1xuXG4gICAgLy8gRGVyaXZlIHZhdWx0IFBEQVxuICAgIGNvbnN0IHZhdWx0ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oVkFVTFRfU0VFRCksIG1hcmtldFBkYS50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvZ3JhbS5tZXRob2RzXG4gICAgICAucmVzb2x2ZU1hcmtldChvdXRjb21lRW51bSlcbiAgICAgIC5hY2NvdW50c1BhcnRpYWwoe1xuICAgICAgICBnbG9iYWxDb25maWcsXG4gICAgICAgIG1hcmtldDogbWFya2V0UGRhLFxuICAgICAgICB2YXVsdCxcbiAgICAgICAgZmVlUmVjaXBpZW50OiBmZWVSZWNpcGllbnRUb2tlbixcbiAgICAgICAgYWRtaW4sXG4gICAgICAgIHRva2VuUHJvZ3JhbTogVE9LRU5fUFJPR1JBTV9JRCxcbiAgICAgIH0pXG4gICAgICAuaW5zdHJ1Y3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNvbXBsZXRlIHRyYW5zYWN0aW9uIHRvIHJlc29sdmUgYSBtYXJrZXRcbiAgICovXG4gIGFzeW5jIGJ1aWxkUmVzb2x2ZU1hcmtldFR4QnlJRChcbiAgICBhZG1pbjogUHVibGljS2V5LFxuICAgIG1hcmtldElkOiBudW1iZXIgfCBCTixcbiAgICB3aW5uaW5nT3V0Y29tZTogXCJZZXNcIiB8IFwiTm9cIiB8IG51bGwsXG4gICAgZmVlUmVjaXBpZW50PzogUHVibGljS2V5XG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBtYXJrZXRJZEJuID0gbmV3IEJOKG1hcmtldElkKTtcbiAgICBjb25zdCBtYXJrZXRQZGEgPSBnZXRNYXJrZXRQZGEodGhpcy5wcm9ncmFtLnByb2dyYW1JZCwgYWRtaW4sIG1hcmtldElkQm4pO1xuICAgIGNvbnN0IG1hcmtldEluZm8gPSBhd2FpdCB0aGlzLmdldE1hcmtldEluZm8obWFya2V0UGRhKTtcbiAgICBjb25zdCBnbG9iYWxDb25maWdBY2NvdW50ID0gYXdhaXQgdGhpcy5nZXRHbG9iYWxDb25maWdBY2NvdW50KCk7XG4gICAgY29uc3QgZmVlUmVjaXBpZW50QWRkcmVzcyA9IGZlZVJlY2lwaWVudCB8fCBnbG9iYWxDb25maWdBY2NvdW50LmZlZVJlY2lwaWVudDtcbiAgICAvLyBhbGxvd093bmVyT2ZmQ3VydmUgZm9yIG11bHRpc2lnL1BEQSBmZWUgcmVjaXBpZW50c1xuICAgIGNvbnN0IGZlZVJlY2lwaWVudFRva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMobWFya2V0SW5mby5iZXR0aW5nVG9rZW4sIGZlZVJlY2lwaWVudEFkZHJlc3MsIHRydWUpO1xuXG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oKTtcblxuICAgIC8vIENoZWNrIGlmIGZlZSByZWNpcGllbnQgdG9rZW4gYWNjb3VudCBleGlzdHMgYW5kIGNyZWF0ZSBpZiBuZWVkZWRcbiAgICBjb25zdCBmZWVSZWNpcGllbnRBdGFFeGlzdHMgPSBhd2FpdCB0aGlzLmF0YUV4aXN0cyhmZWVSZWNpcGllbnRUb2tlbik7XG4gICAgaWYgKCFmZWVSZWNpcGllbnRBdGFFeGlzdHMpIHtcbiAgICAgIGNvbnN0IGNyZWF0ZUZlZVJlY2lwaWVudEF0YUl4ID0gdGhpcy5jcmVhdGVBdGFJbnN0cnVjdGlvbihhZG1pbiwgZmVlUmVjaXBpZW50QWRkcmVzcywgbWFya2V0SW5mby5iZXR0aW5nVG9rZW4pO1xuICAgICAgdHguYWRkKGNyZWF0ZUZlZVJlY2lwaWVudEF0YUl4KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgcmVzb2x2ZSBtYXJrZXQgaW5zdHJ1Y3Rpb25cbiAgICBjb25zdCByZXNvbHZlTWFya2V0SXggPSBhd2FpdCB0aGlzLnJlc29sdmVNYXJrZXRCeUlEKGFkbWluLCBtYXJrZXRJZCwgd2lubmluZ091dGNvbWUsIGZlZVJlY2lwaWVudCk7XG4gICAgdHguYWRkKHJlc29sdmVNYXJrZXRJeCk7XG5cbiAgICByZXR1cm4gdHg7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIG1hcmtldCAoQWRtaW4gb25seSlcbiAgICovXG4gIGFzeW5jIHJlc29sdmVNYXJrZXQoXG4gICAgYWRtaW46IFB1YmxpY0tleSxcbiAgICBtYXJrZXQ6IFB1YmxpY0tleSxcbiAgICB3aW5uaW5nT3V0Y29tZTogXCJZZXNcIiB8IFwiTm9cIiB8IG51bGwsXG4gICAgZmVlUmVjaXBpZW50PzogUHVibGljS2V5XG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb25JbnN0cnVjdGlvbj4ge1xuICAgIGNvbnN0IGdsb2JhbENvbmZpZyA9IGdldEdsb2JhbENvbmZpZ1BkYSh0aGlzLnByb2dyYW0ucHJvZ3JhbUlkKTtcblxuICAgIGxldCBvdXRjb21lRW51bTogYW55ID0gbnVsbDtcbiAgICBpZiAod2lubmluZ091dGNvbWUgPT09IFwiWWVzXCIpIHtcbiAgICAgIG91dGNvbWVFbnVtID0geyB5ZXM6IHt9IH07XG4gICAgfSBlbHNlIGlmICh3aW5uaW5nT3V0Y29tZSA9PT0gXCJOb1wiKSB7XG4gICAgICBvdXRjb21lRW51bSA9IHsgbm86IHt9IH07XG4gICAgfVxuXG4gICAgLy8gR2V0IG1hcmtldCBpbmZvIHRvIGRldGVybWluZSBiZXR0aW5nIHRva2VuXG4gICAgY29uc3QgbWFya2V0SW5mbyA9IGF3YWl0IHRoaXMuZ2V0TWFya2V0SW5mbyhtYXJrZXQpO1xuICAgIGNvbnN0IGZlZVJlY2lwaWVudEFkZHJlc3MgPSBmZWVSZWNpcGllbnQgfHwgKGF3YWl0IHRoaXMuZ2V0R2xvYmFsQ29uZmlnQWNjb3VudCgpKS5mZWVSZWNpcGllbnQ7XG4gICAgLy8gYWxsb3dPd25lck9mZkN1cnZlIGZvciBtdWx0aXNpZy9QREEgZmVlIHJlY2lwaWVudHNcbiAgICBjb25zdCBmZWVSZWNpcGllbnRUb2tlbiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKG1hcmtldEluZm8uYmV0dGluZ1Rva2VuLCBmZWVSZWNpcGllbnRBZGRyZXNzLCB0cnVlKTtcblxuICAgIC8vIERlcml2ZSB2YXVsdCBQREFcbiAgICBjb25zdCB2YXVsdCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKFZBVUxUX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb2dyYW0ubWV0aG9kc1xuICAgICAgLnJlc29sdmVNYXJrZXQob3V0Y29tZUVudW0pXG4gICAgICAuYWNjb3VudHNQYXJ0aWFsKHtcbiAgICAgICAgZ2xvYmFsQ29uZmlnLFxuICAgICAgICBtYXJrZXQ6IG1hcmtldCxcbiAgICAgICAgdmF1bHQsXG4gICAgICAgIGZlZVJlY2lwaWVudDogZmVlUmVjaXBpZW50VG9rZW4sXG4gICAgICAgIGFkbWluLFxuICAgICAgICB0b2tlblByb2dyYW06IFRPS0VOX1BST0dSQU1fSUQsXG4gICAgICB9KVxuICAgICAgLmluc3RydWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBjb21wbGV0ZSB0cmFuc2FjdGlvbiB0byByZXNvbHZlIGEgbWFya2V0XG4gICAqL1xuICBhc3luYyBidWlsZFJlc29sdmVNYXJrZXRUeChcbiAgICBhZG1pbjogUHVibGljS2V5LFxuICAgIG1hcmtldDogUHVibGljS2V5LFxuICAgIHdpbm5pbmdPdXRjb21lOiBcIlllc1wiIHwgXCJOb1wiIHwgbnVsbCxcbiAgICBmZWVSZWNpcGllbnQ/OiBQdWJsaWNLZXlcbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IG1hcmtldEluZm8gPSBhd2FpdCB0aGlzLmdldE1hcmtldEluZm8obWFya2V0KTtcbiAgICBjb25zdCBnbG9iYWxDb25maWdBY2NvdW50ID0gYXdhaXQgdGhpcy5nZXRHbG9iYWxDb25maWdBY2NvdW50KCk7XG4gICAgY29uc3QgZmVlUmVjaXBpZW50QWRkcmVzcyA9IGZlZVJlY2lwaWVudCB8fCBnbG9iYWxDb25maWdBY2NvdW50LmZlZVJlY2lwaWVudDtcbiAgICAvLyBhbGxvd093bmVyT2ZmQ3VydmUgZm9yIG11bHRpc2lnL1BEQSBmZWUgcmVjaXBpZW50c1xuICAgIGNvbnN0IGZlZVJlY2lwaWVudFRva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMobWFya2V0SW5mby5iZXR0aW5nVG9rZW4sIGZlZVJlY2lwaWVudEFkZHJlc3MsIHRydWUpO1xuXG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oKTtcblxuICAgIC8vIENoZWNrIGlmIGZlZSByZWNpcGllbnQgdG9rZW4gYWNjb3VudCBleGlzdHMgYW5kIGNyZWF0ZSBpZiBuZWVkZWRcbiAgICBjb25zdCBmZWVSZWNpcGllbnRBdGFFeGlzdHMgPSBhd2FpdCB0aGlzLmF0YUV4aXN0cyhmZWVSZWNpcGllbnRUb2tlbik7XG4gICAgaWYgKCFmZWVSZWNpcGllbnRBdGFFeGlzdHMpIHtcbiAgICAgIGNvbnN0IGNyZWF0ZUZlZVJlY2lwaWVudEF0YUl4ID0gdGhpcy5jcmVhdGVBdGFJbnN0cnVjdGlvbihhZG1pbiwgZmVlUmVjaXBpZW50QWRkcmVzcywgbWFya2V0SW5mby5iZXR0aW5nVG9rZW4pO1xuICAgICAgdHguYWRkKGNyZWF0ZUZlZVJlY2lwaWVudEF0YUl4KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgcmVzb2x2ZSBtYXJrZXQgaW5zdHJ1Y3Rpb25cbiAgICBjb25zdCByZXNvbHZlTWFya2V0SXggPSBhd2FpdCB0aGlzLnJlc29sdmVNYXJrZXQoYWRtaW4sIG1hcmtldCwgd2lubmluZ091dGNvbWUsIGZlZVJlY2lwaWVudCk7XG4gICAgdHguYWRkKHJlc29sdmVNYXJrZXRJeCk7XG5cbiAgICByZXR1cm4gdHg7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgYSBtYXJrZXQgKEFkbWluIG9ubHkpXG4gICAqL1xuICBhc3luYyBjbG9zZU1hcmtldChcbiAgICBhZG1pbjogUHVibGljS2V5LFxuICAgIG1hcmtldDogUHVibGljS2V5XG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb25JbnN0cnVjdGlvbj4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb2dyYW0ubWV0aG9kc1xuICAgICAgLmNsb3NlTWFya2V0KClcbiAgICAgIC5hY2NvdW50c1BhcnRpYWwoe1xuICAgICAgICBtYXJrZXQ6IG1hcmtldCxcbiAgICAgICAgYWRtaW46IGFkbWluLFxuICAgICAgfSlcbiAgICAgIC5pbnN0cnVjdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgY29tcGxldGUgdHJhbnNhY3Rpb24gdG8gY2xvc2UgYSBtYXJrZXRcbiAgICovXG4gIGFzeW5jIGJ1aWxkQ2xvc2VNYXJrZXRUeChcbiAgICBhZG1pbjogUHVibGljS2V5LFxuICAgIG1hcmtldDogUHVibGljS2V5XG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBpeCA9IGF3YWl0IHRoaXMuY2xvc2VNYXJrZXQoYWRtaW4sIG1hcmtldCk7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbigpLmFkZChpeCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgYSBtYXJrZXQgKEFkbWluIG9ubHkpXG4gICAqL1xuICBhc3luYyBjbG9zZU1hcmtldEJ5SUQoXG4gICAgYWRtaW46IFB1YmxpY0tleSxcbiAgICBtYXJrZXRJZDogbnVtYmVyIHwgQk5cbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluc3RydWN0aW9uPiB7XG4gICAgY29uc3QgbWFya2V0SWRCbiA9IG5ldyBCTihtYXJrZXRJZCk7XG4gICAgY29uc3QgbWFya2V0UGRhID0gZ2V0TWFya2V0UGRhKHRoaXMucHJvZ3JhbS5wcm9ncmFtSWQsIGFkbWluLCBtYXJrZXRJZEJuKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb2dyYW0ubWV0aG9kc1xuICAgICAgLmNsb3NlTWFya2V0KClcbiAgICAgIC5hY2NvdW50c1BhcnRpYWwoe1xuICAgICAgICBtYXJrZXQ6IG1hcmtldFBkYSxcbiAgICAgICAgYWRtaW46IGFkbWluLFxuICAgICAgfSlcbiAgICAgIC5pbnN0cnVjdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgY29tcGxldGUgdHJhbnNhY3Rpb24gdG8gY2xvc2UgYSBtYXJrZXRcbiAgICovXG4gIGFzeW5jIGJ1aWxkQ2xvc2VNYXJrZXRUeEJ5SUQoXG4gICAgYWRtaW46IFB1YmxpY0tleSxcbiAgICBtYXJrZXRJZDogbnVtYmVyIHwgQk5cbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IGl4ID0gYXdhaXQgdGhpcy5jbG9zZU1hcmtldEJ5SUQoYWRtaW4sIG1hcmtldElkKTtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKGl4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSBtYXJrZXQgYWNjb3VudCBhbmQgcmVjbGFpbSByZW50IChBZG1pbiBvbmx5KVxuICAgKiBDYW4gb25seSBiZSBjYWxsZWQgYWZ0ZXIgbWFya2V0IGlzIHJlc29sdmVkIGFuZCBhbGwgcmV3YXJkcyBjbGFpbWVkXG4gICAqL1xuICBhc3luYyBjbG9zZU1hcmtldEFjY291bnQoXG4gICAgYWRtaW46IFB1YmxpY0tleSxcbiAgICBtYXJrZXQ6IFB1YmxpY0tleVxuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24+IHtcbiAgICAvLyBEZXJpdmUgUERBc1xuICAgIGNvbnN0IHllc01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShZRVNfTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG4gICAgY29uc3Qgbm9NaW50ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oTk9fTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG4gICAgY29uc3QgdmF1bHQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShWQVVMVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLm1ldGhvZHNcbiAgICAgIC5jbG9zZU1hcmtldEFjY291bnQoKVxuICAgICAgLmFjY291bnRzUGFydGlhbCh7XG4gICAgICAgIG1hcmtldCxcbiAgICAgICAgeWVzTWludCxcbiAgICAgICAgbm9NaW50LFxuICAgICAgICB2YXVsdCxcbiAgICAgICAgYWRtaW4sXG4gICAgICAgIHRva2VuUHJvZ3JhbTogVE9LRU5fUFJPR1JBTV9JRCxcbiAgICAgICAgdG9rZW4yMDIyUHJvZ3JhbTogVE9LRU5fMjAyMl9QUk9HUkFNX0lELFxuICAgICAgfSlcbiAgICAgIC5pbnN0cnVjdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgY29tcGxldGUgdHJhbnNhY3Rpb24gdG8gY2xvc2UgbWFya2V0IGFjY291bnRcbiAgICovXG4gIGFzeW5jIGJ1aWxkQ2xvc2VNYXJrZXRBY2NvdW50VHgoXG4gICAgYWRtaW46IFB1YmxpY0tleSxcbiAgICBtYXJrZXQ6IFB1YmxpY0tleVxuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgaXggPSBhd2FpdCB0aGlzLmNsb3NlTWFya2V0QWNjb3VudChhZG1pbiwgbWFya2V0KTtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKGl4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdXJuIHdvcnRobGVzcyB0b2tlbnMgZnJvbSB0aGUgbG9zaW5nIHNpZGUgb2YgYSByZXNvbHZlZCBtYXJrZXQuXG4gICAqIFRoaXMgYWxsb3dzIHVzZXJzIHRvIGNsZWFuIHVwIHRoZWlyIGxvc2luZyB0b2tlbnMgc28gdGhlIG1hcmtldCBhY2NvdW50IGNhbiBiZSBjbG9zZWQuXG4gICAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIgd2hvIGhvbGRzIGxvc2luZyB0b2tlbnNcbiAgICogQHBhcmFtIG1hcmtldCAtIFRoZSBtYXJrZXQgUERBXG4gICAqIEBwYXJhbSBsb3NpbmdPdXRjb21lIC0gVGhlIG91dGNvbWUgdGhhdCBsb3N0ICh0aGUgc2lkZSB0byBidXJuKVxuICAgKiBAcGFyYW0gdG9rZW5BbW91bnQgLSBBbW91bnQgdG8gYnVybiAoMCA9IGJ1cm4gYWxsKVxuICAgKiBAcGFyYW0gY2xvc2VBY2NvdW50IC0gV2hldGhlciB0byBjbG9zZSB0aGUgbG9zaW5nIHRva2VuIGFjY291bnQgYWZ0ZXIgYnVybmluZyBhbGwgdG9rZW5zIChkZWZhdWx0OiBmYWxzZSlcbiAgICovXG4gIGFzeW5jIGJ1cm5NYXJrZXRUb2tlbnMoXG4gICAgdXNlcjogUHVibGljS2V5LFxuICAgIG1hcmtldDogUHVibGljS2V5LFxuICAgIGxvc2luZ091dGNvbWU6IE91dGNvbWUsXG4gICAgdG9rZW5BbW91bnQ6IG51bWJlciB8IEJOID0gMCxcbiAgICBjbG9zZUFjY291bnQ6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24+IHtcbiAgICAvLyBEZXJpdmUgUERBc1xuICAgIGNvbnN0IHllc01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShZRVNfTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG4gICAgY29uc3Qgbm9NaW50ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oTk9fTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG5cbiAgICAvLyBUaGUgbG9zaW5nIG1pbnQgaXMgdGhlIHNpZGUgdGhhdCBsb3N0XG4gICAgY29uc3QgbG9zaW5nTWludCA9IGxvc2luZ091dGNvbWUgPT09IFwiWWVzXCIgPyB5ZXNNaW50IDogbm9NaW50O1xuICAgIGNvbnN0IHVzZXJMb3NpbmdUb2tlbiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKGxvc2luZ01pbnQsIHVzZXIsIGZhbHNlLCBUT0tFTl8yMDIyX1BST0dSQU1fSUQpO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvZ3JhbS5tZXRob2RzXG4gICAgICAuYnVybk1hcmtldFRva2Vucyh7XG4gICAgICAgIHRva2VuQW1vdW50OiBuZXcgQk4odG9rZW5BbW91bnQpLFxuICAgICAgICBjbG9zZUFjY291bnQsXG4gICAgICB9KVxuICAgICAgLmFjY291bnRzUGFydGlhbCh7XG4gICAgICAgIG1hcmtldCxcbiAgICAgICAgeWVzTWludCxcbiAgICAgICAgbm9NaW50LFxuICAgICAgICBsb3NpbmdNaW50LFxuICAgICAgICB1c2VyTG9zaW5nVG9rZW4sXG4gICAgICAgIHVzZXIsXG4gICAgICAgIHRva2VuMjAyMlByb2dyYW06IFRPS0VOXzIwMjJfUFJPR1JBTV9JRCxcbiAgICAgIH0pXG4gICAgICAuaW5zdHJ1Y3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNvbXBsZXRlIHRyYW5zYWN0aW9uIHRvIGJ1cm4gbWFya2V0IHRva2Vuc1xuICAgKiBAcGFyYW0gY2xvc2VBY2NvdW50IC0gV2hldGhlciB0byBjbG9zZSB0aGUgbG9zaW5nIHRva2VuIGFjY291bnQgYWZ0ZXIgYnVybmluZyBhbGwgdG9rZW5zIChkZWZhdWx0OiBmYWxzZSlcbiAgICovXG4gIGFzeW5jIGJ1aWxkQnVybk1hcmtldFRva2Vuc1R4KFxuICAgIHVzZXI6IFB1YmxpY0tleSxcbiAgICBtYXJrZXQ6IFB1YmxpY0tleSxcbiAgICBsb3NpbmdPdXRjb21lOiBPdXRjb21lLFxuICAgIHRva2VuQW1vdW50OiBudW1iZXIgfCBCTiA9IDAsXG4gICAgY2xvc2VBY2NvdW50OiBib29sZWFuID0gdHJ1ZVxuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgaXggPSBhd2FpdCB0aGlzLmJ1cm5NYXJrZXRUb2tlbnModXNlciwgbWFya2V0LCBsb3NpbmdPdXRjb21lLCB0b2tlbkFtb3VudCwgY2xvc2VBY2NvdW50KTtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKGl4KTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEZldGNoIGdsb2JhbCBjb25maWcgYWNjb3VudCBkYXRhXG4gICAqL1xuICBhc3luYyBnZXRHbG9iYWxDb25maWdBY2NvdW50KCkge1xuICAgIGNvbnN0IGdsb2JhbENvbmZpZyA9IGdldEdsb2JhbENvbmZpZ1BkYSh0aGlzLnByb2dyYW0ucHJvZ3JhbUlkKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLmFjY291bnQuZ2xvYmFsQ29uZmlnLmZldGNoKGdsb2JhbENvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggbWFya2V0IGFjY291bnQgZGF0YVxuICAgKi9cbiAgYXN5bmMgZ2V0TWFya2V0QWNjb3VudChhZG1pbjogUHVibGljS2V5LCBtYXJrZXRJZDogbnVtYmVyIHwgQk4pIHtcbiAgICBjb25zdCBtYXJrZXRJZEJuID0gbmV3IEJOKG1hcmtldElkKTtcbiAgICBjb25zdCBtYXJrZXRQZGEgPSBnZXRNYXJrZXRQZGEodGhpcy5wcm9ncmFtLnByb2dyYW1JZCwgYWRtaW4sIG1hcmtldElkQm4pO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb2dyYW0uYWNjb3VudC5tYXJrZXQuZmV0Y2gobWFya2V0UGRhKTtcbiAgfVxuXG4gIGFzeW5jIGdldE1hcmtldEluZm8obWFya2V0UGRhOiBQdWJsaWNLZXkpIHtcbiAgICBjb25zdCBtYXJrZXRBY2NvdW50ID0gYXdhaXQgdGhpcy5wcm9ncmFtLmFjY291bnQubWFya2V0LmZldGNoKG1hcmtldFBkYSk7XG4gICAgcmV0dXJuIG1hcmtldEFjY291bnQ7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggdmF1bHQgYWNjb3VudCBkYXRhXG4gICAqL1xuICBhc3luYyBnZXRWYXVsdEFjY291bnQobWFya2V0UGRhOiBQdWJsaWNLZXkpIHtcbiAgICBjb25zdCB2YXVsdFBkYSA9IGdldFZhdWx0UGRhKHRoaXMucHJvZ3JhbS5wcm9ncmFtSWQsIG1hcmtldFBkYSk7XG4gICAgcmV0dXJuIGF3YWl0IGdldEFjY291bnQodGhpcy5jb25uZWN0aW9uLCB2YXVsdFBkYSk7XG4gIH1cbn1cbiJdfQ==
|
|
1014
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLDJCQUEyQixFQUMzQix5QkFBeUIsRUFDekIsVUFBVSxFQUNWLDZCQUE2QixFQUM3QixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2pCLE1BQU0sbUJBQW1CLENBQUM7QUFFM0IsT0FBTyxFQUFFLE9BQU8sSUFBSSxhQUFhLEVBQUUsY0FBYyxFQUF3QixNQUFNLG1CQUFtQixDQUFDO0FBRW5HLE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUV2QixPQUFPLEVBRUwsT0FBTyxFQUNQLFNBQVMsRUFDVCxhQUFhLEVBQ2IsV0FBVyxFQUNYLHNCQUFzQixFQUN2QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFL0IsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixZQUFZLEVBQ1osYUFBYSxFQUNiLFdBQVcsRUFDWCxZQUFZLEVBQ1osVUFBVSxFQUNWLGFBQWEsRUFDZCxNQUFNLFlBQVksQ0FBQztBQUVwQixjQUFjLFlBQVksQ0FBQztBQUMzQixPQUFPLEVBQVcsR0FBRyxFQUFFLENBQUM7QUFpSHhCLE1BQU0sT0FBTyxhQUFhO0lBS3hCLFlBQVksVUFBc0IsRUFBRSxNQUFlLEVBQUUsU0FBcUI7UUFDeEUsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFFN0IsMkNBQTJDO1FBQzNDLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMxQyxNQUFNLGFBQWEsR0FBVztZQUM1QixTQUFTLEVBQUUsY0FBYyxDQUFDLFNBQVM7WUFDbkMsZUFBZSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDakMsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRztZQUN2QyxLQUFLLEVBQUUsY0FBYztTQUN0QixDQUFDO1FBRUYsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLGNBQWMsQ0FDaEMsVUFBVSxFQUNWLE1BQU0sSUFBSSxhQUFhLEVBQ3ZCLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxDQUM1QixDQUFDO1FBRUYsdUVBQXVFO1FBQ3ZFLE1BQU0sY0FBYyxHQUFHLFNBQVMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFL0QsNkNBQTZDO1FBQzdDLE1BQU0sU0FBUyxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1FBRWpFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxhQUFhLENBQUMsU0FBZ0IsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFnQyxDQUFDO0lBQ25HLENBQUM7SUFFRDs7T0FFRztJQUNILFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxZQUFZLENBQUMsU0FBb0I7UUFDL0IsTUFBTSxTQUFTLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7UUFDNUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGFBQWEsQ0FBQyxTQUFnQixFQUFFLElBQUksQ0FBQyxRQUFRLENBQWdDLENBQUM7SUFDbkcsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFjO1FBQzVCLElBQUksQ0FBQztZQUNILE1BQU0sVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDdkMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILG9CQUFvQixDQUNsQixLQUFnQixFQUNoQixLQUFnQixFQUNoQixJQUFlLEVBQ2YsZUFBMEIsZ0JBQWdCO1FBRTFDLE1BQU0sR0FBRyxHQUFHLDZCQUE2QixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRTNFLDhFQUE4RTtRQUM5RSxNQUFNLElBQUksR0FBRztZQUNYLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUU7WUFDbkQsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRTtZQUNsRCxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFO1lBQ3JELEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUU7WUFDcEQsRUFBRSxNQUFNLEVBQUUsYUFBYSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUU7WUFDdkUsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRTtTQUM3RCxDQUFDO1FBRUYsT0FBTyxJQUFJLHNCQUFzQixDQUFDO1lBQ2hDLElBQUk7WUFDSixTQUFTLEVBQUUsMkJBQTJCO1lBQ3RDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFNBQW9CO1FBQ3pDLE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEUsT0FBTyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTzthQUM5QixnQkFBZ0IsRUFBRTthQUNsQixlQUFlLENBQUM7WUFDZixZQUFZO1lBQ1osU0FBUyxFQUFFLFNBQVM7WUFDcEIsYUFBYSxFQUFFLGFBQWEsQ0FBQyxTQUFTO1NBQ3ZDLENBQUM7YUFDRCxXQUFXLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsdUJBQXVCLENBQUMsU0FBb0I7UUFDaEQsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEQsT0FBTyxJQUFJLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLGFBQWEsQ0FBQyxTQUFvQjtRQUN0QyxNQUFNLFlBQVksR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hFLE9BQU8sTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU87YUFDOUIsYUFBYSxFQUFFO2FBQ2YsZUFBZSxDQUFDO1lBQ2YsWUFBWTtZQUNaLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLGFBQWEsRUFBRSxhQUFhLENBQUMsU0FBUztTQUN2QyxDQUFDO2FBQ0QsV0FBVyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLG9CQUFvQixDQUFDLFNBQW9CO1FBQzdDLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvQyxPQUFPLElBQUksV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBbUI7UUFDaEMsTUFBTSxZQUFZLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVoRSxPQUFPLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPO2FBQzlCLFFBQVEsQ0FBQyxRQUFRLENBQUM7YUFDbEIsZUFBZSxDQUFDO1lBQ2YsWUFBWTtTQUNiLENBQUM7YUFDRCxXQUFXLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsZUFBZSxDQUFDLFFBQW1CO1FBQ3ZDLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6QyxPQUFPLElBQUksV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxXQUFXLENBQUMsYUFBd0I7UUFDeEMsTUFBTSxZQUFZLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVoRSxPQUFPLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPO2FBQzlCLFdBQVcsQ0FBQyxhQUFhLENBQUM7YUFDMUIsZUFBZSxDQUFDO1lBQ2YsWUFBWTtTQUNiLENBQUM7YUFDRCxXQUFXLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsa0JBQWtCLENBQUMsYUFBd0I7UUFDL0MsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2pELE9BQU8sSUFBSSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUE2QjtRQUNqRCxNQUFNLFlBQVksR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWhFLE9BQU8sTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU87YUFDOUIsZUFBZSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsY0FBYyxDQUFDO2FBQ2hGLGVBQWUsQ0FBQztZQUNmLFlBQVksRUFBRSxZQUFZO1lBQzFCLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztTQUM1QixDQUFDO2FBQ0QsV0FBVyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLHNCQUFzQixDQUFDLE1BQTZCO1FBQ3hELE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QyxPQUFPLElBQUksV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBMEI7UUFDM0MsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBRTdFLE1BQU0sVUFBVSxHQUFHLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sVUFBVSxHQUFHLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sU0FBUyxHQUFHLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sU0FBUyxHQUFHLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWxDLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDdEUsTUFBTSxZQUFZLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVoRSxPQUFPLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPO2FBQzlCLFlBQVksQ0FBQztZQUNWLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLE9BQU8sRUFBRSxTQUFTO1lBQ2xCLE9BQU8sRUFBRSxTQUFTO1NBQ25CLENBQUM7YUFDRCxlQUFlLENBQUM7WUFDZixZQUFZO1lBQ1osTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsWUFBWSxFQUFFLFlBQVk7WUFDMUIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLEtBQUssRUFBRSxLQUFLO1lBQ1osWUFBWSxFQUFFLGdCQUFnQjtZQUM5QixhQUFhLEVBQUUsYUFBYSxDQUFDLFNBQVM7U0FDdkMsQ0FBQzthQUNELFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxNQUEwQjtRQUNsRCxNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0MsT0FBTyxJQUFJLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQXNCO1FBQ25DLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLEdBQUcsTUFBTSxDQUFDO1FBRWxGLE1BQU0sUUFBUSxHQUFHLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sV0FBVyxHQUFHLE9BQU8sS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUVqRSxpQ0FBaUM7UUFDakMsTUFBTSxZQUFZLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVoRSxrQ0FBa0M7UUFDbEMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLHNCQUFzQixDQUM5QyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQy9DLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUN2QixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLHNCQUFzQixDQUM3QyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQzlDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUN2QixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLHNCQUFzQixDQUM1QyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQzVDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUN2QixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRUwsTUFBTSxnQkFBZ0IsR0FBRyw2QkFBNkIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFM0Usc0RBQXNEO1FBQ3RELGlEQUFpRDtRQUNqRCxNQUFNLFVBQVUsR0FBRyxPQUFPLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUN4RCxNQUFNLGdCQUFnQixHQUFHLDZCQUE2QixDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFFdkcsT0FBTyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTzthQUM5QixRQUFRLENBQUM7WUFDUixVQUFVLEVBQUUsV0FBVztZQUN2QixNQUFNLEVBQUUsUUFBUTtTQUNqQixDQUFDO2FBQ0QsZUFBZSxDQUFDO1lBQ2YsWUFBWTtZQUNaLE1BQU07WUFDTixPQUFPO1lBQ1AsTUFBTTtZQUNOLEtBQUs7WUFDTCxpQkFBaUIsRUFBRSxpQkFBaUIsSUFBSSxJQUFJO1lBQzVDLGdCQUFnQjtZQUNoQixnQkFBZ0I7WUFDaEIsSUFBSTtTQUNMLENBQUM7YUFDRCxXQUFXLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsZUFBZSxDQUFDLE1BQXNCO1FBQzFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxHQUFHLElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUV6RSxNQUFNLEVBQUUsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBRTdCLGdDQUFnQztRQUNoQyxNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBRTFELHVDQUF1QztRQUN2QyxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsc0JBQXNCLENBQzlDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFDL0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQ3ZCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDTCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsc0JBQXNCLENBQzdDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFDOUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQ3ZCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFTCxpREFBaUQ7UUFDakQsTUFBTSxVQUFVLEdBQUcsT0FBTyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDeEQsTUFBTSxnQkFBZ0IsR0FBRyw2QkFBNkIsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBRXZHLHdEQUF3RDtRQUN4RCxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDdEQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNaLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO2dCQUM3RixFQUFFLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3RCLENBQUM7UUFDSCxDQUFDO1FBRUQsb0RBQW9EO1FBQ3BELElBQUksaUJBQWlCLEdBQXFCLElBQUksQ0FBQztRQUMvQyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDN0IsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLENBQUMsWUFBWSxJQUFJLGFBQWEsQ0FBQyxZQUFZLENBQUM7WUFDOUUsaUJBQWlCLEdBQUcsNkJBQTZCLENBQUMsWUFBWSxFQUFFLG1CQUFtQixDQUFDLENBQUM7WUFFckYseURBQXlEO1lBQ3pELE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzdELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDbEIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxtQkFBbUIsRUFBRSxZQUFZLENBQUMsQ0FBQztnQkFDMUYsRUFBRSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUN6QixDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUNyQyxHQUFHLE1BQU07WUFDVCxpQkFBaUI7U0FDbEIsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVuQixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUF3QjtRQUM5QyxNQUFNLEVBQ0osSUFBSSxFQUNKLFlBQVksRUFDWixNQUFNLEVBQ04sVUFBVSxFQUNWLFdBQVcsRUFDWCxPQUFPLEVBQ1AsWUFBWSxFQUNaLFNBQVMsR0FBRyxJQUFJLEVBQ2pCLEdBQUcsTUFBTSxDQUFDO1FBRVgsTUFBTSxFQUFFLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUU3QixnQ0FBZ0M7UUFDaEMsTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUUxRCx1Q0FBdUM7UUFDdkMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLHNCQUFzQixDQUM5QyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQy9DLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUN2QixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLHNCQUFzQixDQUM3QyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQzlDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUN2QixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRUwsaURBQWlEO1FBQ2pELE1BQU0sVUFBVSxHQUFHLE9BQU8sS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBRXhELCtCQUErQjtRQUMvQixNQUFNLGdCQUFnQixHQUFHLDZCQUE2QixDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFFdkcsd0NBQXdDO1FBQ3hDLE1BQU0saUJBQWlCLEdBQUcsNkJBQTZCLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUVoSCx3QkFBd0I7UUFDeEIsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLHdEQUF3RDtZQUN4RCxNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ25CLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO2dCQUNqRyxFQUFFLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQzFCLENBQUM7WUFFRCxpRUFBaUU7WUFDakUsTUFBTSxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDL0QsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNwQixpREFBaUQ7Z0JBQ2pELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLHFCQUFxQixDQUFDLENBQUM7Z0JBQzFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUMzQixDQUFDO1FBQ0gsQ0FBQztRQUVELG9EQUFvRDtRQUNwRCxJQUFJLGlCQUFpQixHQUFxQixJQUFJLENBQUM7UUFDL0MsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzdCLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLFlBQVksSUFBSSxhQUFhLENBQUMsWUFBWSxDQUFDO1lBQzlFLGlCQUFpQixHQUFHLDZCQUE2QixDQUFDLFlBQVksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1lBRXJGLHlEQUF5RDtZQUN6RCxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ2xCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxDQUFDLENBQUM7Z0JBQzFGLEVBQUUsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDekIsQ0FBQztRQUNILENBQUM7UUFFRCxxQ0FBcUM7UUFDckMsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ3BDLElBQUk7WUFDSixNQUFNO1lBQ04sTUFBTSxFQUFFLFVBQVU7WUFDbEIsT0FBTztZQUNQLFlBQVk7WUFDWixpQkFBaUI7U0FDbEIsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVsQiw4Q0FBOEM7UUFDOUMsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ3JDLElBQUksRUFBRSxZQUFZO1lBQ2xCLE1BQU07WUFDTixNQUFNLEVBQUUsV0FBVztZQUNuQixPQUFPO1lBQ1AsWUFBWTtZQUNaLGlCQUFpQjtTQUNsQixDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ25CLE9BQU87WUFDTCxXQUFXLEVBQUUsRUFBRTtZQUNmLGVBQWUsRUFBRSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUM7U0FDdEMsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYTtJQUVuQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLHNCQUFzQixDQUFDLFlBQW9CO1FBQ2hELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ25ELE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLGVBQWUsQ0FBQyxrQkFBMEIsRUFBRSxPQUFnQjtRQUNqRSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxtQkFBbUI7SUFFbkI7Ozs7Ozs7Ozs7T0FVRztJQUNILEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQU0xQjtRQUNDLE1BQU0sRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxHQUFHLElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUMzRSxNQUFNLFFBQVEsR0FBRyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVoQyxNQUFNLEVBQUUsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBRTdCLHNDQUFzQztRQUN0QyxNQUFNLGlCQUFpQixHQUFHLDZCQUE2QixDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNqRixNQUFNLGdCQUFnQixHQUFHLDZCQUE2QixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUV4RSw4QkFBOEI7UUFDOUIsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzdELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDbkIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQ2pGLEVBQUUsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDMUIsQ0FBQztRQUNILENBQUM7UUFFRCw4QkFBOEI7UUFDOUIsTUFBTSxVQUFVLEdBQUcseUJBQXlCLENBQzFDLGlCQUFpQixFQUFHLFNBQVM7UUFDN0IsZ0JBQWdCLEVBQUksY0FBYztRQUNsQyxZQUFZLEVBQVEsaUJBQWlCO1FBQ3JDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRyxTQUFTO1FBQ3ZDLEVBQUUsRUFBa0IseUNBQXlDO1FBQzdELGdCQUFnQixDQUFJLGFBQWE7U0FDbEMsQ0FBQztRQUNGLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFbkIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsNEJBQTRCLENBQUMsTUFNbEM7UUFDQyxNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuRCxPQUFPO1lBQ0wsV0FBVyxFQUFFLEVBQUU7WUFDZixlQUFlLEVBQUUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO1NBQ3ZDLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQTBCO1FBQzNDLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsR0FBRyxNQUFNLENBQUM7UUFFOUQsdUNBQXVDO1FBQ3ZDLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxzQkFBc0IsQ0FDOUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUMvQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FDdkIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNMLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxzQkFBc0IsQ0FDN0MsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUM5QyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FDdkIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVMLG1CQUFtQjtRQUNuQixNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsc0JBQXNCLENBQzVDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFDNUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQ3ZCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFTCxNQUFNLGdCQUFnQixHQUFHLDZCQUE2QixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMzRSxpREFBaUQ7UUFDakQsTUFBTSxVQUFVLEdBQUcsY0FBYyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDL0QsTUFBTSxnQkFBZ0IsR0FBRyw2QkFBNkIsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3ZHLE1BQU0sZUFBZSxHQUFHLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNyRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQztRQUNqRCxPQUFPLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPO2FBQzlCLFlBQVksQ0FBQztZQUNaLFdBQVcsRUFBRSxlQUFlO1lBQzVCLFlBQVk7U0FDYixDQUFDO2FBQ0QsZUFBZSxDQUFDO1lBQ2YsTUFBTTtZQUNOLE9BQU87WUFDUCxNQUFNO1lBQ04sS0FBSztZQUNMLGdCQUFnQjtZQUNoQixnQkFBZ0I7WUFDaEIsSUFBSTtTQUNMLENBQUM7YUFDRCxXQUFXLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsbUJBQW1CLENBQUMsTUFBMEI7UUFDbEQsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUM5RCxNQUFNLEVBQUUsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBRTdCLHVDQUF1QztRQUN2QyxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsc0JBQXNCLENBQzlDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFDL0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQ3ZCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFTCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsc0JBQXNCLENBQzdDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFDOUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQ3ZCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFTCxtQkFBbUI7UUFDbkIsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLHNCQUFzQixDQUM1QyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQzVDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUN2QixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRUwsTUFBTSxnQkFBZ0IsR0FBRyw2QkFBNkIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0UsaURBQWlEO1FBQ2pELE1BQU0sVUFBVSxHQUFHLGNBQWMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQy9ELE1BQU0sZ0JBQWdCLEdBQUcsNkJBQTZCLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUN2RyxNQUFNLGVBQWUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDckQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUM7UUFFakQsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU87YUFDbEMsWUFBWSxDQUFDO1lBQ1osV0FBVyxFQUFFLGVBQWU7WUFDNUIsWUFBWTtTQUNiLENBQUM7YUFDRCxlQUFlLENBQUM7WUFDZixNQUFNO1lBQ04sT0FBTztZQUNQLE1BQU07WUFDTixLQUFLO1lBQ0wsZ0JBQWdCO1lBQ2hCLGdCQUFnQjtZQUNoQixJQUFJO1NBQ0wsQ0FBQzthQUNELFdBQVcsRUFBRSxDQUFDO1FBRWpCLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDWCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBd0I7UUFDOUMsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUM7UUFDaEMsTUFBTSxZQUFZLEdBQTZCLEVBQUUsQ0FBQztRQUVsRCxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzNCLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQztnQkFDakMsSUFBSTtnQkFDSixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07Z0JBQ3BCLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtnQkFDaEMsY0FBYyxFQUFFLEtBQUssQ0FBQyxjQUFjO2dCQUNwQyxhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWEsSUFBSSxDQUFDO2dCQUN2QyxZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVksSUFBSSxJQUFJO2FBQ3pDLENBQUMsQ0FBQztZQUNILFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEIsQ0FBQztRQUVELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsd0JBQXdCLENBQzVCLE1BQXdCLEVBQ3hCLGlCQUF5QixDQUFDO1FBRTFCLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFELE1BQU0sWUFBWSxHQUFrQixFQUFFLENBQUM7UUFFdkMsaUNBQWlDO1FBQ2pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUM3RCxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLENBQUM7WUFDeEQsTUFBTSxFQUFFLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUM3QixLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEIsQ0FBQztRQUVELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFvQjtRQUMvQixNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEdBQUcsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBRXpGLE1BQU0sV0FBVyxHQUFHLE9BQU8sS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUVqRSxpREFBaUQ7UUFDakQsTUFBTSxhQUFhLEdBQUcsSUFBSSxFQUFFLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRS9DLHVDQUF1QztRQUN2QyxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsc0JBQXNCLENBQzlDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFDL0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQ3ZCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDTCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsc0JBQXNCLENBQzdDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFDOUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQ3ZCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFTCxtQkFBbUI7UUFDbkIsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLHNCQUFzQixDQUM1QyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQzVDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUN2QixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRUwsTUFBTSxnQkFBZ0IsR0FBRyw2QkFBNkIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0UsaURBQWlEO1FBQ2pELE1BQU0sVUFBVSxHQUFHLE9BQU8sS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3hELE1BQU0sZ0JBQWdCLEdBQUcsNkJBQTZCLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUV2RyxPQUFPLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPO2FBQzlCLE1BQU0sQ0FBQztZQUNOLE9BQU8sRUFBRSxXQUFXO1lBQ3BCLFdBQVcsRUFBRSxhQUFhO1lBQzFCLFlBQVk7U0FDYixDQUFDO2FBQ0QsZUFBZSxDQUFDO1lBQ2YsTUFBTSxFQUFFLE1BQU07WUFDZCxPQUFPLEVBQUUsT0FBTztZQUNoQixNQUFNLEVBQUUsTUFBTTtZQUNkLEtBQUssRUFBRSxLQUFLO1lBQ1osZ0JBQWdCLEVBQUUsZ0JBQWdCO1lBQ2xDLGdCQUFnQixFQUFFLGdCQUFnQjtZQUNsQyxZQUFZLEVBQUUsZ0JBQWdCO1lBQzlCLGdCQUFnQixFQUFFLHFCQUFxQjtZQUN2QyxJQUFJLEVBQUUsSUFBSTtTQUNYLENBQUM7YUFDRCxXQUFXLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQW9CO1FBQ3RDLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyQyxPQUFPLElBQUksV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bc0RHO0lBQ0gsS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUFzQjtRQUMxQyxNQUFNLEVBQ0osSUFBSSxFQUNKLE1BQU0sRUFDTixZQUFZLEVBQ1osY0FBYyxFQUNkLGFBQWEsRUFDYixlQUFlLEdBQUcsSUFBSSxFQUN0QixjQUFjLEdBQUcsSUFBSSxFQUN0QixHQUFHLE1BQU0sQ0FBQztRQUVYLE1BQU0sRUFBRSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFFN0IsdUNBQXVDO1FBQ3ZDLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxzQkFBc0IsQ0FDOUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUMvQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FDdkIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNMLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxzQkFBc0IsQ0FDN0MsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUM5QyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FDdkIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVMLG9DQUFvQztRQUNwQyxNQUFNLFlBQVksR0FBRyw2QkFBNkIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQ2hHLE1BQU0sV0FBVyxHQUFHLDZCQUE2QixDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFFOUYsK0JBQStCO1FBQy9CLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzlFLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3QyxZQUFZLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsMENBQTBDO1FBQzVDLENBQUM7UUFFRCw4QkFBOEI7UUFDOUIsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNsQixJQUFJLENBQUM7WUFDSCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDNUUsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzNDLFdBQVcsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCwwQ0FBMEM7UUFDNUMsQ0FBQztRQUVELG9EQUFvRDtRQUNwRCxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDcEMsSUFBSTtnQkFDSixNQUFNO2dCQUNOLFlBQVk7Z0JBQ1osT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsV0FBVyxFQUFFLENBQUM7Z0JBQ2QsWUFBWSxFQUFFLGVBQWU7YUFDOUIsQ0FBQyxDQUFDO1lBQ0gsRUFBRSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN0QixDQUFDO1FBRUQsa0RBQWtEO1FBQ2xELElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUNuQyxJQUFJO2dCQUNKLE1BQU07Z0JBQ04sWUFBWTtnQkFDWixPQUFPLEVBQUUsSUFBSTtnQkFDYixXQUFXLEVBQUUsQ0FBQztnQkFDZCxZQUFZLEVBQUUsY0FBYzthQUM3QixDQUFDLENBQUM7WUFDSCxFQUFFLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JCLENBQUM7UUFFRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxpQkFBaUIsQ0FDckIsS0FBZ0IsRUFDaEIsUUFBcUIsRUFDckIsY0FBbUMsRUFDbkMsWUFBd0I7UUFFeEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEMsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMxRSxNQUFNLFlBQVksR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWhFLElBQUksV0FBVyxHQUFRLElBQUksQ0FBQztRQUM1QixJQUFJLGNBQWMsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUM3QixXQUFXLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDNUIsQ0FBQzthQUFNLElBQUksY0FBYyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ25DLFdBQVcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUMzQixDQUFDO1FBRUQsNkNBQTZDO1FBQzdDLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2RCx3QkFBd0I7UUFDeEIsTUFBTSxtQkFBbUIsR0FBRyxZQUFZLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDO1FBQy9GLG9FQUFvRTtRQUNwRSxNQUFNLGlCQUFpQixHQUFHLDZCQUE2QixDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFNUcsbUJBQW1CO1FBQ25CLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxzQkFBc0IsQ0FDNUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUMvQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FDdkIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVMLE9BQU8sTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU87YUFDOUIsYUFBYSxDQUFDLFdBQVcsQ0FBQzthQUMxQixlQUFlLENBQUM7WUFDZixZQUFZO1lBQ1osTUFBTSxFQUFFLFNBQVM7WUFDakIsS0FBSztZQUNMLFlBQVksRUFBRSxpQkFBaUI7WUFDL0IsS0FBSztZQUNMLFlBQVksRUFBRSxnQkFBZ0I7U0FDL0IsQ0FBQzthQUNELFdBQVcsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyx3QkFBd0IsQ0FDNUIsS0FBZ0IsRUFDaEIsUUFBcUIsRUFDckIsY0FBbUMsRUFDbkMsWUFBd0I7UUFFeEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEMsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMxRSxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdkQsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ2hFLE1BQU0sbUJBQW1CLEdBQUcsWUFBWSxJQUFJLG1CQUFtQixDQUFDLFlBQVksQ0FBQztRQUM3RSxxREFBcUQ7UUFDckQsTUFBTSxpQkFBaUIsR0FBRyw2QkFBNkIsQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLG1CQUFtQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBRTVHLE1BQU0sRUFBRSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFFN0IsbUVBQW1FO1FBQ25FLE1BQU0scUJBQXFCLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDM0IsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUMvRyxFQUFFLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUVELGlDQUFpQztRQUNqQyxNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNwRyxFQUFFLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRXhCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGFBQWEsQ0FDakIsS0FBZ0IsRUFDaEIsTUFBaUIsRUFDakIsY0FBbUMsRUFDbkMsWUFBd0I7UUFFeEIsTUFBTSxZQUFZLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVoRSxJQUFJLFdBQVcsR0FBUSxJQUFJLENBQUM7UUFDNUIsSUFBSSxjQUFjLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDN0IsV0FBVyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQzVCLENBQUM7YUFBTSxJQUFJLGNBQWMsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNuQyxXQUFXLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDM0IsQ0FBQztRQUVELDZDQUE2QztRQUM3QyxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEQsTUFBTSxtQkFBbUIsR0FBRyxZQUFZLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDO1FBQy9GLHFEQUFxRDtRQUNyRCxNQUFNLGlCQUFpQixHQUFHLDZCQUE2QixDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFNUcsbUJBQW1CO1FBQ25CLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxzQkFBc0IsQ0FDNUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUM1QyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FDdkIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVMLE9BQU8sTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU87YUFDOUIsYUFBYSxDQUFDLFdBQVcsQ0FBQzthQUMxQixlQUFlLENBQUM7WUFDZixZQUFZO1lBQ1osTUFBTSxFQUFFLE1BQU07WUFDZCxLQUFLO1lBQ0wsWUFBWSxFQUFFLGlCQUFpQjtZQUMvQixLQUFLO1lBQ0wsWUFBWSxFQUFFLGdCQUFnQjtTQUMvQixDQUFDO2FBQ0QsV0FBVyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLG9CQUFvQixDQUN4QixLQUFnQixFQUNoQixNQUFpQixFQUNqQixjQUFtQyxFQUNuQyxZQUF3QjtRQUV4QixNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEQsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ2hFLE1BQU0sbUJBQW1CLEdBQUcsWUFBWSxJQUFJLG1CQUFtQixDQUFDLFlBQVksQ0FBQztRQUM3RSxxREFBcUQ7UUFDckQsTUFBTSxpQkFBaUIsR0FBRyw2QkFBNkIsQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLG1CQUFtQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBRTVHLE1BQU0sRUFBRSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFFN0IsbUVBQW1FO1FBQ25FLE1BQU0scUJBQXFCLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDM0IsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUMvRyxFQUFFLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUVELGlDQUFpQztRQUNqQyxNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDOUYsRUFBRSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUV4QixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxXQUFXLENBQ2YsS0FBZ0IsRUFDaEIsTUFBaUI7UUFFakIsT0FBTyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTzthQUM5QixXQUFXLEVBQUU7YUFDYixlQUFlLENBQUM7WUFDZixNQUFNLEVBQUUsTUFBTTtZQUNkLEtBQUssRUFBRSxLQUFLO1NBQ2IsQ0FBQzthQUNELFdBQVcsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxrQkFBa0IsQ0FDdEIsS0FBZ0IsRUFDaEIsTUFBaUI7UUFFakIsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNqRCxPQUFPLElBQUksV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxlQUFlLENBQ25CLEtBQWdCLEVBQ2hCLFFBQXFCO1FBRXJCLE1BQU0sVUFBVSxHQUFHLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFMUUsT0FBTyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTzthQUM5QixXQUFXLEVBQUU7YUFDYixlQUFlLENBQUM7WUFDZixNQUFNLEVBQUUsU0FBUztZQUNqQixLQUFLLEVBQUUsS0FBSztTQUNiLENBQUM7YUFDRCxXQUFXLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsc0JBQXNCLENBQzFCLEtBQWdCLEVBQ2hCLFFBQXFCO1FBRXJCLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDdkQsT0FBTyxJQUFJLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLGtCQUFrQixDQUN0QixLQUFnQixFQUNoQixNQUFpQjtRQUVqQixjQUFjO1FBQ2QsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLHNCQUFzQixDQUM5QyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQy9DLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUN2QixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLHNCQUFzQixDQUM3QyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQzlDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUN2QixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLHNCQUFzQixDQUM1QyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQzVDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUN2QixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRUwsT0FBTyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTzthQUM5QixrQkFBa0IsRUFBRTthQUNwQixlQUFlLENBQUM7WUFDZixNQUFNO1lBQ04sT0FBTztZQUNQLE1BQU07WUFDTixLQUFLO1lBQ0wsS0FBSztZQUNMLFlBQVksRUFBRSxnQkFBZ0I7WUFDOUIsZ0JBQWdCLEVBQUUscUJBQXFCO1NBQ3hDLENBQUM7YUFDRCxXQUFXLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMseUJBQXlCLENBQzdCLEtBQWdCLEVBQ2hCLE1BQWlCO1FBRWpCLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN4RCxPQUFPLElBQUksV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILEtBQUssQ0FBQyxnQkFBZ0IsQ0FDcEIsSUFBZSxFQUNmLE1BQWlCLEVBQ2pCLGFBQXNCLEVBQ3RCLGNBQTJCLENBQUMsRUFDNUIsZUFBd0IsS0FBSztRQUU3QixjQUFjO1FBQ2QsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLHNCQUFzQixDQUM5QyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQy9DLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUN2QixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLHNCQUFzQixDQUM3QyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQzlDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUN2QixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRUwsd0NBQXdDO1FBQ3hDLE1BQU0sVUFBVSxHQUFHLGFBQWEsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQzlELE1BQU0sZUFBZSxHQUFHLDZCQUE2QixDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFFdEcsT0FBTyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTzthQUM5QixnQkFBZ0IsQ0FBQztZQUNoQixXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDO1lBQ2hDLFlBQVk7U0FDYixDQUFDO2FBQ0QsZUFBZSxDQUFDO1lBQ2YsTUFBTTtZQUNOLE9BQU87WUFDUCxNQUFNO1lBQ04sVUFBVTtZQUNWLGVBQWU7WUFDZixJQUFJO1lBQ0osZ0JBQWdCLEVBQUUscUJBQXFCO1NBQ3hDLENBQUM7YUFDRCxXQUFXLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLHVCQUF1QixDQUMzQixJQUFlLEVBQ2YsTUFBaUIsRUFDakIsYUFBc0IsRUFDdEIsY0FBMkIsQ0FBQyxFQUM1QixlQUF3QixJQUFJO1FBRTVCLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUMvRixPQUFPLElBQUksV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLGVBQWUsQ0FDbkIsTUFBNkIsRUFDN0IsWUFBOEIsRUFDOUIsV0FBNkI7UUFFN0IsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBRTlDLGNBQWM7UUFDZCxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsc0JBQXNCLENBQzlDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFDL0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQ3ZCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDTCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsc0JBQXNCLENBQzdDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFDOUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQ3ZCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDTCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsc0JBQXNCLENBQzVDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFDNUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQ3ZCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFTCxNQUFNLGdCQUFnQixHQUFHLDZCQUE2QixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUUzRSxPQUFPLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPO2FBQzlCLGVBQWUsRUFBRTthQUNqQixlQUFlLENBQUM7WUFDZixNQUFNO1lBQ04sT0FBTztZQUNQLE1BQU07WUFDTixLQUFLO1lBQ0wsWUFBWSxFQUFFLFlBQVk7WUFDMUIsV0FBVyxFQUFFLFdBQVc7WUFDeEIsZ0JBQWdCO1lBQ2hCLElBQUk7WUFDSixZQUFZLEVBQUUsZ0JBQWdCO1lBQzlCLGdCQUFnQixFQUFFLHFCQUFxQjtTQUN4QyxDQUFDO2FBQ0QsV0FBVyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUdEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxNQUE2QjtRQUN4RCxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUNoQyxNQUFNLEVBQUUsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBRTdCLGNBQWM7UUFDZCxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsc0JBQXNCLENBQzlDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFDL0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQ3ZCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDTCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsc0JBQXNCLENBQzdDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFDOUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQ3ZCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFTCwwQkFBMEI7UUFDMUIsTUFBTSxZQUFZLEdBQUcsNkJBQTZCLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUNoRyxNQUFNLFdBQVcsR0FBRyw2QkFBNkIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBRTlGLDZDQUE2QztRQUM3QyxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBRXhCLElBQUksQ0FBQztZQUNILE1BQU0sVUFBVSxHQUFHLE1BQU0sVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1lBQ3JHLFlBQVksR0FBRyxVQUFVLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUN4QyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1Asd0JBQXdCO1FBQzFCLENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCxNQUFNLFNBQVMsR0FBRyxNQUFNLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUscUJBQXFCLENBQUMsQ0FBQztZQUNuRyxXQUFXLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDdEMsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLHdCQUF3QjtRQUMxQixDQUFDO1FBRUQsOENBQThDO1FBQzlDLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FDbkMsTUFBTSxFQUNOLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQ2xDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ2pDLENBQUM7UUFDRixFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRVgsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsc0JBQXNCO1FBQzFCLE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEUsT0FBTyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUdEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQWdCLEVBQUUsUUFBcUI7UUFDNUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEMsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMxRSxPQUFPLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWEsQ0FBQyxTQUFvQjtRQUN0QyxNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDekUsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGVBQWUsQ0FBQyxTQUFvQjtRQUN4QyxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDaEUsT0FBTyxNQUFNLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3JELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFTU09DSUFURURfVE9LRU5fUFJPR1JBTV9JRCxcbiAgY3JlYXRlVHJhbnNmZXJJbnN0cnVjdGlvbixcbiAgZ2V0QWNjb3VudCxcbiAgZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMsXG4gIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCxcbiAgVE9LRU5fUFJPR1JBTV9JRFxufSBmcm9tIFwiQHNvbGFuYS9zcGwtdG9rZW5cIjtcblxuaW1wb3J0IHsgUHJvZ3JhbSBhcyBBbmNob3JQcm9ncmFtLCBBbmNob3JQcm92aWRlciwgSWRsLCBQcm9ncmFtLCBXYWxsZXQgfSBmcm9tIFwiQGNvcmFsLXh5ei9hbmNob3JcIjtcblxuaW1wb3J0IEJOIGZyb20gXCJibi5qc1wiO1xuXG5pbXBvcnQge1xuICBDb25uZWN0aW9uLFxuICBLZXlwYWlyLFxuICBQdWJsaWNLZXksXG4gIFN5c3RlbVByb2dyYW0sXG4gIFRyYW5zYWN0aW9uLFxuICBUcmFuc2FjdGlvbkluc3RydWN0aW9uXG59IGZyb20gXCJAc29sYW5hL3dlYjMuanNcIjtcbmltcG9ydCB7IElETCB9IGZyb20gXCIuL2lkbC5qc1wiO1xuaW1wb3J0IHsgRHJhbWFQbSB9IGZyb20gXCIuL3R5cGVzLmpzXCI7XG5pbXBvcnQge1xuICBnZXRHbG9iYWxDb25maWdQZGEsXG4gIGdldE1hcmtldFBkYSxcbiAgZ2V0TWFya2V0UGRhcyxcbiAgZ2V0VmF1bHRQZGEsXG4gIE5PX01JTlRfU0VFRCxcbiAgVkFVTFRfU0VFRCxcbiAgWUVTX01JTlRfU0VFRFxufSBmcm9tIFwiLi91dGlscy5qc1wiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi91dGlscy5qc1wiO1xuZXhwb3J0IHsgRHJhbWFQbSwgSURMIH07XG5cbmV4cG9ydCB0eXBlIE91dGNvbWUgPSBcIlllc1wiIHwgXCJOb1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZU1hcmtldFBhcmFtcyB7XG4gIGFkbWluOiBQdWJsaWNLZXk7XG4gIG1hcmtldElkOiBudW1iZXIgfCBCTjtcbiAgeWVzUHJpY2U6IG51bWJlciB8IEJOO1xuICBub1ByaWNlOiBudW1iZXIgfCBCTjtcbiAgZW5kVGltZTogbnVtYmVyIHwgQk47XG4gIGJldHRpbmdUb2tlbjogUHVibGljS2V5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYWNlQmV0UGFyYW1zIHtcbiAgdXNlcjogUHVibGljS2V5O1xuICBtYXJrZXQ6IFB1YmxpY0tleTsgLy8gTWFya2V0IFBEQSBhZGRyZXNzXG4gIGFtb3VudDogbnVtYmVyIHwgQk47XG4gIG91dGNvbWU6IE91dGNvbWU7XG4gIGJldHRpbmdUb2tlbjogUHVibGljS2V5O1xuICBmZWVSZWNpcGllbnQ/OiBQdWJsaWNLZXk7IC8vIEZlZSByZWNpcGllbnQgYWRkcmVzcyAob3B0aW9uYWwsIHdpbGwgZmV0Y2ggZnJvbSBjb25maWcgaWYgbm90IHByb3ZpZGVkKVxuICBmZWVSZWNpcGllbnRUb2tlbj86IFB1YmxpY0tleSB8IG51bGw7IC8vIEZlZSByZWNpcGllbnQgdG9rZW4gYWNjb3VudCAob3B0aW9uYWwsIHVzZWQgaW50ZXJuYWxseSBieSBidWlsZFBsYWNlQmV0VHgpXG4gIGNyZWF0ZUF0YT86IGJvb2xlYW47IC8vIFdoZXRoZXIgdG8gY3JlYXRlIEFUQSBpbnN0cnVjdGlvbiBhdXRvbWF0aWNhbGx5XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlRmVlQ29uZmlnUGFyYW1zIHtcbiAgYXV0aG9yaXR5OiBQdWJsaWNLZXk7IC8vIENhbiBiZSBhdXRob3JpdHkgb3IgYXV0aG9yaXplZCBhZG1pblxuICBuZXdGZWVCcHM6IG51bWJlcjsgLy8gRmVlIGluIGJhc2lzIHBvaW50cyAoMSBicHMgPSAwLjAxJSwgbWF4IDIwMDAgPSAyMCUpXG4gIG5ld0ZlZVJlY2lwaWVudDogUHVibGljS2V5O1xuICBuZXdGZWVDbGFpbUJwczogbnVtYmVyOyAvLyBGZWUgZm9yIGNsYWltaW5nIHJld2FyZHMgaW4gYmFzaXMgcG9pbnRzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xhaW1SZXdhcmRzUGFyYW1zIHtcbiAgdXNlcjogUHVibGljS2V5O1xuICBtYXJrZXQ6IFB1YmxpY0tleTsgLy8gTWFya2V0IFBEQSBhZGRyZXNzXG4gIGJldHRpbmdUb2tlbjogUHVibGljS2V5O1xuICB3aW5uaW5nT3V0Y29tZTogT3V0Y29tZTtcbiAgc2hhcmVzVG9DbGFpbTogbnVtYmVyIHwgQk47IC8vIEFtb3VudCBvZiBzaGFyZXMgdG8gY2xhaW0gKDAgPSBjbGFpbSBhbGwpXG4gIGNsb3NlQWNjb3VudD86IGJvb2xlYW47IC8vIFdoZXRoZXIgdG8gY2xvc2UgdGhlIG91dGNvbWUgdG9rZW4gYWNjb3VudCBhZnRlciBjbGFpbWluZyBhbGwgc2hhcmVzIChkZWZhdWx0OiBmYWxzZSlcbiAgZmVlUmVjaXBpZW50PzogUHVibGljS2V5OyAvLyBGZWUgcmVjaXBpZW50IGFkZHJlc3MgKG9wdGlvbmFsLCB3aWxsIGZldGNoIGZyb20gY29uZmlnIGlmIG5vdCBwcm92aWRlZClcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCYXRjaENsYWltUGFyYW1zIHtcbiAgdXNlcjogUHVibGljS2V5O1xuICBjbGFpbXM6IEFycmF5PHtcbiAgICBtYXJrZXQ6IFB1YmxpY0tleTtcbiAgICBiZXR0aW5nVG9rZW46IFB1YmxpY0tleTtcbiAgICB3aW5uaW5nT3V0Y29tZTogT3V0Y29tZTtcbiAgICBzaGFyZXNUb0NsYWltPzogbnVtYmVyIHwgQk47IC8vIEFtb3VudCBvZiBzaGFyZXMgdG8gY2xhaW0gKDAgb3IgdW5kZWZpbmVkID0gY2xhaW0gYWxsKVxuICAgIGNsb3NlQWNjb3VudD86IGJvb2xlYW47IC8vIFdoZXRoZXIgdG8gY2xvc2UgdGhlIG91dGNvbWUgdG9rZW4gYWNjb3VudCBhZnRlciBjbGFpbWluZyBhbGwgc2hhcmVzXG4gIH0+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlZnVuZFBhcmFtcyB7XG4gIHVzZXI6IFB1YmxpY0tleTtcbiAgbWFya2V0OiBQdWJsaWNLZXk7IC8vIE1hcmtldCBQREEgYWRkcmVzc1xuICBiZXR0aW5nVG9rZW46IFB1YmxpY0tleTtcbiAgb3V0Y29tZTogT3V0Y29tZTtcbiAgdG9rZW5BbW91bnQ/OiBudW1iZXIgfCBCTjsgLy8gQW1vdW50IG9mIHNoYXJlcyB0byByZWZ1bmQuIDAgb3IgdW5kZWZpbmVkIG1lYW5zIHJlZnVuZCBhbGwgc2hhcmVzLlxuICBjbG9zZUFjY291bnQ/OiBib29sZWFuOyAvLyBXaGV0aGVyIHRvIGNsb3NlIHRoZSBvdXRjb21lIHRva2VuIGFjY291bnQgYWZ0ZXIgcmVmdW5kaW5nIGFsbCBzaGFyZXMgKGRlZmF1bHQ6IGZhbHNlKVxufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHJlZnVuZFYyIC0gcmVmdW5kaW5nIGJvdGggWWVzIGFuZCBObyBwb3NpdGlvbnMgaW4gb25lIHRyYW5zYWN0aW9uLlxuICogVXNlIHRoaXMgd2hlbiBhIHVzZXIgaGFzIGJldCBvbiBib3RoIG91dGNvbWVzIGFuZCB3YW50cyB0byByZWZ1bmQgZXZlcnl0aGluZyBhdCBvbmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZnVuZFYyUGFyYW1zIHtcbiAgdXNlcjogUHVibGljS2V5O1xuICBtYXJrZXQ6IFB1YmxpY0tleTsgLy8gTWFya2V0IFBEQSBhZGRyZXNzXG4gIGJldHRpbmdUb2tlbjogUHVibGljS2V5O1xuICB5ZXNUb2tlbkFtb3VudD86IG51bWJlciB8IEJOOyAvLyBBbW91bnQgb2YgWWVzIHNoYXJlcyB0byByZWZ1bmQuIDAgb3IgdW5kZWZpbmVkIG1lYW5zIHJlZnVuZCBhbGwuXG4gIG5vVG9rZW5BbW91bnQ/OiBudW1iZXIgfCBCTjsgIC8vIEFtb3VudCBvZiBObyBzaGFyZXMgdG8gcmVmdW5kLiAwIG9yIHVuZGVmaW5lZCBtZWFucyByZWZ1bmQgYWxsLlxuICBjbG9zZVllc0FjY291bnQ/OiBib29sZWFuOyAvLyBXaGV0aGVyIHRvIGNsb3NlIHRoZSBZZXMgb3V0Y29tZSB0b2tlbiBhY2NvdW50IChkZWZhdWx0OiB0cnVlKVxuICBjbG9zZU5vQWNjb3VudD86IGJvb2xlYW47ICAvLyBXaGV0aGVyIHRvIGNsb3NlIHRoZSBObyBvdXRjb21lIHRva2VuIGFjY291bnQgKGRlZmF1bHQ6IHRydWUpXG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgY2xhaW1fYnVybl9tYXJrZXQgaW5zdHJ1Y3Rpb25cbiAqIENvbWJpbmVzIGNsYWltaW5nIHJld2FyZHMgKGlmIHdvbikgYW5kIGJ1cm5pbmcgdG9rZW5zIChpZiBsb3N0KSBpbiBvbmUgY2FsbC5cbiAqIEFsd2F5cyBjbG9zZXMgdG9rZW4gYWNjb3VudHMgdG8gcmVjbGFpbSByZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsYWltQnVybk1hcmtldFBhcmFtcyB7XG4gIHVzZXI6IFB1YmxpY0tleTtcbiAgbWFya2V0OiBQdWJsaWNLZXk7IC8vIE1hcmtldCBQREEgYWRkcmVzc1xuICBiZXR0aW5nVG9rZW46IFB1YmxpY0tleTtcbn1cblxuXG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgcGxhY2VCZXRWMiAtIGNvbWJpbmVzIHVzZXIgYmV0IGFuZCBib251cyBhY2NvdW50IGJldCBpbiBvbmUgdHJhbnNhY3Rpb25cbiAqIFJlcXVpcmVzIGJvdGggdXNlciBhbmQgYm9udXNBY2NvdW50IHRvIHNpZ24gdGhlIHRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGxhY2VCZXRWMlBhcmFtcyB7XG4gIHVzZXI6IFB1YmxpY0tleTsgICAgICAgICAgICAgIC8vIFVzZXIncyBwdWJsaWMga2V5IChzaWduZXIpXG4gIGJvbnVzQWNjb3VudDogUHVibGljS2V5OyAgICAgIC8vIEJvbnVzIGFjY291bnQgcHVibGljIGtleSAoc2lnbmVyKVxuICBtYXJrZXQ6IFB1YmxpY0tleTsgICAgICAgICAgICAvLyBNYXJrZXQgUERBIGFkZHJlc3NcbiAgdXNlckFtb3VudDogbnVtYmVyIHwgQk47ICAgICAgLy8gQW1vdW50IHVzZXIgcGF5c1xuICBib251c0Ftb3VudDogbnVtYmVyIHwgQk47ICAgICAvLyBBbW91bnQgYm9udXMgYWNjb3VudCBwYXlzXG4gIG91dGNvbWU6IE91dGNvbWU7ICAgICAgICAgICAgIC8vIE91dGNvbWUgdG8gYmV0IG9uIChZZXMvTm8pXG4gIGJldHRpbmdUb2tlbjogUHVibGljS2V5OyAgICAgIC8vIEJldHRpbmcgdG9rZW4gbWludFxuICBmZWVSZWNpcGllbnQ/OiBQdWJsaWNLZXk7ICAgICAvLyBGZWUgcmVjaXBpZW50IGFkZHJlc3MgKG9wdGlvbmFsKVxuICBjcmVhdGVBdGE/OiBib29sZWFuOyAgICAgICAgICAvLyBXaGV0aGVyIHRvIGNyZWF0ZSBBVEEgaW5zdHJ1Y3Rpb24gYXV0b21hdGljYWxseVxufVxuXG4vKipcbiAqIFJlc3VsdCBmcm9tIGJ1aWxkUGxhY2VCZXRWMlR4IGNvbnRhaW5pbmcgYm90aCB0aGUgdHJhbnNhY3Rpb24gYW5kIGl0cyBzZXJpYWxpemVkIGZvcm1cbiAqIGZvciBzcGxpdCBzaWduaW5nIHdvcmtmbG93IChmcm9udGVuZCB1c2VyIHNpZ24gKyBiYWNrZW5kIGJvbnVzIHNpZ24pXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGxhY2VCZXRWMlJlc3VsdCB7XG4gIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbjsgICAgIC8vIFRyYW5zYWN0aW9uIG9iamVjdCBmb3IgbG9jYWwgc2lnbmluZyAodGVzdGluZylcbiAgcmVxdWlyZWRTaWduZXJzOiBQdWJsaWNLZXlbXTsgLy8gTGlzdCBvZiByZXF1aXJlZCBzaWduZXJzIFt1c2VyLCBib251c0FjY291bnRdXG59XG5cbmV4cG9ydCBjbGFzcyBEcmFtYVBtQ2xpZW50IHtcbiAgcHJvZ3JhbTogUHJvZ3JhbTxEcmFtYVBtPjtcbiAgcHJvdmlkZXI6IEFuY2hvclByb3ZpZGVyO1xuICBjb25uZWN0aW9uOiBDb25uZWN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKGNvbm5lY3Rpb246IENvbm5lY3Rpb24sIHdhbGxldD86IFdhbGxldCwgcHJvZ3JhbUlkPzogUHVibGljS2V5KSB7XG4gICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICBcbiAgICAvLyBDcmVhdGUgYSBkZWZhdWx0IHdhbGxldCBpZiBub25lIHByb3ZpZGVkXG4gICAgY29uc3QgZGVmYXVsdEtleXBhaXIgPSBLZXlwYWlyLmdlbmVyYXRlKCk7XG4gICAgY29uc3QgZGVmYXVsdFdhbGxldDogV2FsbGV0ID0ge1xuICAgICAgcHVibGljS2V5OiBkZWZhdWx0S2V5cGFpci5wdWJsaWNLZXksXG4gICAgICBzaWduVHJhbnNhY3Rpb246IGFzeW5jICh0eCkgPT4gdHgsXG4gICAgICBzaWduQWxsVHJhbnNhY3Rpb25zOiBhc3luYyAodHhzKSA9PiB0eHMsXG4gICAgICBwYXllcjogZGVmYXVsdEtleXBhaXIsXG4gICAgfTtcbiAgICBcbiAgICB0aGlzLnByb3ZpZGVyID0gbmV3IEFuY2hvclByb3ZpZGVyKFxuICAgICAgY29ubmVjdGlvbixcbiAgICAgIHdhbGxldCB8fCBkZWZhdWx0V2FsbGV0LFxuICAgICAgeyBjb21taXRtZW50OiBcImNvbmZpcm1lZFwiIH1cbiAgICApO1xuICAgIFxuICAgIC8vIFVzZSBjdXN0b20gcHJvZ3JhbUlkIGlmIHByb3ZpZGVkLCBvdGhlcndpc2UgdXNlIHRoZSBkZWZhdWx0IGZyb20gSURMXG4gICAgY29uc3QgZmluYWxQcm9ncmFtSWQgPSBwcm9ncmFtSWQgfHwgbmV3IFB1YmxpY0tleShJREwuYWRkcmVzcyk7XG4gICAgXG4gICAgLy8gQ3JlYXRlIGEgbmV3IElETCB3aXRoIHRoZSBjdXN0b20gcHJvZ3JhbUlkXG4gICAgY29uc3QgY3VzdG9tSWRsID0geyAuLi5JREwsIGFkZHJlc3M6IGZpbmFsUHJvZ3JhbUlkLnRvQmFzZTU4KCkgfTtcbiAgICBcbiAgICB0aGlzLnByb2dyYW0gPSBuZXcgQW5jaG9yUHJvZ3JhbShjdXN0b21JZGwgYXMgSWRsLCB0aGlzLnByb3ZpZGVyKSBhcyB1bmtub3duIGFzIFByb2dyYW08RHJhbWFQbT47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHByb2dyYW0gSURcbiAgICovXG4gIGdldFByb2dyYW1JZCgpOiBQdWJsaWNLZXkge1xuICAgIHJldHVybiB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIG5ldyBwcm9ncmFtIElEIGFuZCByZWluaXRpYWxpemUgdGhlIHByb2dyYW0gaW5zdGFuY2VcbiAgICogVXNlZnVsIHdoZW4gcmVkZXBsb3lpbmcgdGhlIHByb2dyYW0gdG8gYSBuZXcgYWRkcmVzc1xuICAgKi9cbiAgc2V0UHJvZ3JhbUlkKHByb2dyYW1JZDogUHVibGljS2V5KTogdm9pZCB7XG4gICAgY29uc3QgY3VzdG9tSWRsID0geyAuLi5JREwsIGFkZHJlc3M6IHByb2dyYW1JZC50b0Jhc2U1OCgpIH07XG4gICAgdGhpcy5wcm9ncmFtID0gbmV3IEFuY2hvclByb2dyYW0oY3VzdG9tSWRsIGFzIElkbCwgdGhpcy5wcm92aWRlcikgYXMgdW5rbm93biBhcyBQcm9ncmFtPERyYW1hUG0+O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudCBleGlzdHNcbiAgICovXG4gIGFzeW5jIGF0YUV4aXN0cyhhdGE6IFB1YmxpY0tleSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBnZXRBY2NvdW50KHRoaXMuY29ubmVjdGlvbiwgYXRhKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gaW5zdHJ1Y3Rpb24gdG8gaW5pdGlhbGl6ZSBhbiBhc3NvY2lhdGVkIHRva2VuIGFjY291bnRcbiAgICogQHBhcmFtIHRva2VuUHJvZ3JhbSAtIFRva2VuIHByb2dyYW0gSUQgKFRPS0VOX1BST0dSQU1fSUQgZm9yIGJldHRpbmcgdG9rZW4sIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCBmb3Igb3V0Y29tZSB0b2tlbnMpXG4gICAqL1xuICBjcmVhdGVBdGFJbnN0cnVjdGlvbihcbiAgICBwYXllcjogUHVibGljS2V5LFxuICAgIG93bmVyOiBQdWJsaWNLZXksXG4gICAgbWludDogUHVibGljS2V5LFxuICAgIHRva2VuUHJvZ3JhbTogUHVibGljS2V5ID0gVE9LRU5fUFJPR1JBTV9JRFxuICApOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uIHtcbiAgICBjb25zdCBhdGEgPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhtaW50LCBvd25lciwgdHJ1ZSwgdG9rZW5Qcm9ncmFtKTtcbiAgICBcbiAgICAvLyBVc2UgQ3JlYXRlSWRlbXBvdGVudCBpbnN0cnVjdGlvbiAob3Bjb2RlIDEpIHRvIHN1cHBvcnQgUERBcyBhbmQgaWRlbXBvdGVuY3lcbiAgICBjb25zdCBrZXlzID0gW1xuICAgICAgeyBwdWJrZXk6IHBheWVyLCBpc1NpZ25lcjogdHJ1ZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBwdWJrZXk6IGF0YSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgICB7IHB1YmtleTogb3duZXIsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICAgIHsgcHVia2V5OiBtaW50LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sXG4gICAgICB7IHB1YmtleTogU3lzdGVtUHJvZ3JhbS5wcm9ncmFtSWQsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICAgIHsgcHVia2V5OiB0b2tlblByb2dyYW0sIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICBdO1xuXG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkluc3RydWN0aW9uKHtcbiAgICAgIGtleXMsXG4gICAgICBwcm9ncmFtSWQ6IEFTU09DSUFURURfVE9LRU5fUFJPR1JBTV9JRCxcbiAgICAgIGRhdGE6IEJ1ZmZlci5mcm9tKFsxXSksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBnbG9iYWwgY29uZmlndXJhdGlvbiAoQXV0aG9yaXR5IG9ubHkpXG4gICAqL1xuICBhc3luYyBpbml0aWFsaXplQ29uZmlnKGF1dGhvcml0eTogUHVibGljS2V5KTogUHJvbWlzZTxUcmFuc2FjdGlvbkluc3RydWN0aW9uPiB7XG4gICAgY29uc3QgZ2xvYmFsQ29uZmlnID0gZ2V0R2xvYmFsQ29uZmlnUGRhKHRoaXMucHJvZ3JhbS5wcm9ncmFtSWQpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb2dyYW0ubWV0aG9kc1xuICAgICAgLmluaXRpYWxpemVDb25maWcoKVxuICAgICAgLmFjY291bnRzUGFydGlhbCh7XG4gICAgICAgIGdsb2JhbENvbmZpZyxcbiAgICAgICAgYXV0aG9yaXR5OiBhdXRob3JpdHksXG4gICAgICAgIHN5c3RlbVByb2dyYW06IFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkLFxuICAgICAgfSlcbiAgICAgIC5pbnN0cnVjdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgY29tcGxldGUgdHJhbnNhY3Rpb24gdG8gaW5pdGlhbGl6ZSBjb25maWdcbiAgICovXG4gIGFzeW5jIGJ1aWxkSW5pdGlhbGl6ZUNvbmZpZ1R4KGF1dGhvcml0eTogUHVibGljS2V5KTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IGl4ID0gYXdhaXQgdGhpcy5pbml0aWFsaXplQ29uZmlnKGF1dGhvcml0eSk7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbigpLmFkZChpeCk7XG4gIH1cblxuICAvKipcbiAgICogTWlncmF0ZSBHbG9iYWxDb25maWcgdG8gbmV3IHZlcnNpb24gd2l0aCBmZWVfY2xhaW1fYnBzIGZpZWxkIChBdXRob3JpdHkgb25seSlcbiAgICogU2hvdWxkIGJlIGNhbGxlZCBvbmNlIGFmdGVyIHByb2dyYW0gdXBncmFkZVxuICAgKi9cbiAgYXN5bmMgbWlncmF0ZUNvbmZpZyhhdXRob3JpdHk6IFB1YmxpY0tleSk6IFByb21pc2U8VHJhbnNhY3Rpb25JbnN0cnVjdGlvbj4ge1xuICAgIGNvbnN0IGdsb2JhbENvbmZpZyA9IGdldEdsb2JhbENvbmZpZ1BkYSh0aGlzLnByb2dyYW0ucHJvZ3JhbUlkKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLm1ldGhvZHNcbiAgICAgIC5taWdyYXRlQ29uZmlnKClcbiAgICAgIC5hY2NvdW50c1BhcnRpYWwoe1xuICAgICAgICBnbG9iYWxDb25maWcsXG4gICAgICAgIGF1dGhvcml0eTogYXV0aG9yaXR5LFxuICAgICAgICBzeXN0ZW1Qcm9ncmFtOiBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZCxcbiAgICAgIH0pXG4gICAgICAuaW5zdHJ1Y3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNvbXBsZXRlIHRyYW5zYWN0aW9uIHRvIG1pZ3JhdGUgY29uZmlnXG4gICAqL1xuICBhc3luYyBidWlsZE1pZ3JhdGVDb25maWdUeChhdXRob3JpdHk6IFB1YmxpY0tleSk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBpeCA9IGF3YWl0IHRoaXMubWlncmF0ZUNvbmZpZyhhdXRob3JpdHkpO1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb24oKS5hZGQoaXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhdXRob3JpemVkIGFkbWluIChBdXRob3JpdHkgb25seSlcbiAgICovXG4gIGFzeW5jIGFkZEFkbWluKG5ld0FkbWluOiBQdWJsaWNLZXkpOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24+IHtcbiAgICBjb25zdCBnbG9iYWxDb25maWcgPSBnZXRHbG9iYWxDb25maWdQZGEodGhpcy5wcm9ncmFtLnByb2dyYW1JZCk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLm1ldGhvZHNcbiAgICAgIC5hZGRBZG1pbihuZXdBZG1pbilcbiAgICAgIC5hY2NvdW50c1BhcnRpYWwoe1xuICAgICAgICBnbG9iYWxDb25maWcsXG4gICAgICB9KVxuICAgICAgLmluc3RydWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBjb21wbGV0ZSB0cmFuc2FjdGlvbiB0byB1cGRhdGUgYWRtaW5cbiAgICovXG4gIGFzeW5jIGJ1aWxkQWRkQWRtaW5UeChuZXdBZG1pbjogUHVibGljS2V5KTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IGl4ID0gYXdhaXQgdGhpcy5hZGRBZG1pbihuZXdBZG1pbik7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbigpLmFkZChpeCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGF1dGhvcml6ZWQgYWRtaW4gKEF1dGhvcml0eSBvbmx5KVxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlQWRtaW4oYWRtaW5Ub1JlbW92ZTogUHVibGljS2V5KTogUHJvbWlzZTxUcmFuc2FjdGlvbkluc3RydWN0aW9uPiB7XG4gICAgY29uc3QgZ2xvYmFsQ29uZmlnID0gZ2V0R2xvYmFsQ29uZmlnUGRhKHRoaXMucHJvZ3JhbS5wcm9ncmFtSWQpO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvZ3JhbS5tZXRob2RzXG4gICAgICAucmVtb3ZlQWRtaW4oYWRtaW5Ub1JlbW92ZSlcbiAgICAgIC5hY2NvdW50c1BhcnRpYWwoe1xuICAgICAgICBnbG9iYWxDb25maWcsXG4gICAgICB9KVxuICAgICAgLmluc3RydWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBjb21wbGV0ZSB0cmFuc2FjdGlvbiB0byByZW1vdmUgYWRtaW5cbiAgICovXG4gIGFzeW5jIGJ1aWxkUmVtb3ZlQWRtaW5UeChhZG1pblRvUmVtb3ZlOiBQdWJsaWNLZXkpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgaXggPSBhd2FpdCB0aGlzLnJlbW92ZUFkbWluKGFkbWluVG9SZW1vdmUpO1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb24oKS5hZGQoaXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBmZWUgY29uZmlndXJhdGlvbiAoQXV0aG9yaXR5IG9yIGF1dGhvcml6ZWQgYWRtaW4pXG4gICAqL1xuICBhc3luYyB1cGRhdGVGZWVDb25maWcocGFyYW1zOiBVcGRhdGVGZWVDb25maWdQYXJhbXMpOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24+IHtcbiAgICBjb25zdCBnbG9iYWxDb25maWcgPSBnZXRHbG9iYWxDb25maWdQZGEodGhpcy5wcm9ncmFtLnByb2dyYW1JZCk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLm1ldGhvZHNcbiAgICAgIC51cGRhdGVGZWVDb25maWcocGFyYW1zLm5ld0ZlZUJwcywgcGFyYW1zLm5ld0ZlZVJlY2lwaWVudCwgcGFyYW1zLm5ld0ZlZUNsYWltQnBzKVxuICAgICAgLmFjY291bnRzUGFydGlhbCh7XG4gICAgICAgIGdsb2JhbENvbmZpZzogZ2xvYmFsQ29uZmlnLFxuICAgICAgICBhdXRob3JpdHk6IHBhcmFtcy5hdXRob3JpdHksXG4gICAgICB9KVxuICAgICAgLmluc3RydWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBjb21wbGV0ZSB0cmFuc2FjdGlvbiB0byB1cGRhdGUgZmVlIGNvbmZpZ1xuICAgKi9cbiAgYXN5bmMgYnVpbGRVcGRhdGVGZWVDb25maWdUeChwYXJhbXM6IFVwZGF0ZUZlZUNvbmZpZ1BhcmFtcyk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBpeCA9IGF3YWl0IHRoaXMudXBkYXRlRmVlQ29uZmlnKHBhcmFtcyk7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbigpLmFkZChpeCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHByZWRpY3Rpb24gbWFya2V0IGluc3RydWN0aW9uXG4gICAqL1xuICBhc3luYyBjcmVhdGVNYXJrZXQocGFyYW1zOiBDcmVhdGVNYXJrZXRQYXJhbXMpOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24+IHtcbiAgICBjb25zdCB7IGFkbWluLCBtYXJrZXRJZCwgeWVzUHJpY2UsIG5vUHJpY2UsIGVuZFRpbWUsIGJldHRpbmdUb2tlbiB9ID0gcGFyYW1zO1xuICAgIFxuICAgIGNvbnN0IG1hcmtldElkQm4gPSBuZXcgQk4obWFya2V0SWQpO1xuICAgIGNvbnN0IHllc1ByaWNlQm4gPSBuZXcgQk4oeWVzUHJpY2UpO1xuICAgIGNvbnN0IG5vUHJpY2VCbiA9IG5ldyBCTihub1ByaWNlKTtcbiAgICBjb25zdCBlbmRUaW1lQm4gPSBuZXcgQk4oZW5kVGltZSk7XG5cbiAgICBjb25zdCBwZGFzID0gZ2V0TWFya2V0UGRhcyh0aGlzLnByb2dyYW0ucHJvZ3JhbUlkLCBhZG1pbiwgbWFya2V0SWRCbik7XG4gICAgY29uc3QgZ2xvYmFsQ29uZmlnID0gZ2V0R2xvYmFsQ29uZmlnUGRhKHRoaXMucHJvZ3JhbS5wcm9ncmFtSWQpO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvZ3JhbS5tZXRob2RzXG4gICAgICAuY3JlYXRlTWFya2V0KHtcbiAgICAgICAgICBtYXJrZXRJZDogbWFya2V0SWRCbixcbiAgICAgICAgICB5ZXNQcmljZTogeWVzUHJpY2VCbixcbiAgICAgICAgICBub1ByaWNlOiBub1ByaWNlQm4sXG4gICAgICAgICAgZW5kVGltZTogZW5kVGltZUJuLFxuICAgICAgICB9KVxuICAgICAgICAuYWNjb3VudHNQYXJ0aWFsKHtcbiAgICAgICAgICBnbG9iYWxDb25maWcsXG4gICAgICAgICAgbWFya2V0OiBwZGFzLm1hcmtldCxcbiAgICAgICAgICB5ZXNNaW50OiBwZGFzLnllc01pbnQsXG4gICAgICAgICAgbm9NaW50OiBwZGFzLm5vTWludCxcbiAgICAgICAgICBiZXR0aW5nVG9rZW46IGJldHRpbmdUb2tlbixcbiAgICAgICAgICB2YXVsdDogcGRhcy52YXVsdCxcbiAgICAgICAgICBhZG1pbjogYWRtaW4sXG4gICAgICAgICAgdG9rZW5Qcm9ncmFtOiBUT0tFTl9QUk9HUkFNX0lELFxuICAgICAgICAgIHN5c3RlbVByb2dyYW06IFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkLFxuICAgICAgICB9KVxuICAgICAgICAuaW5zdHJ1Y3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNvbXBsZXRlIHRyYW5zYWN0aW9uIHRvIGNyZWF0ZSBhIG1hcmtldFxuICAgKi9cbiAgYXN5bmMgYnVpbGRDcmVhdGVNYXJrZXRUeChwYXJhbXM6IENyZWF0ZU1hcmtldFBhcmFtcyk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBpeCA9IGF3YWl0IHRoaXMuY3JlYXRlTWFya2V0KHBhcmFtcyk7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbigpLmFkZChpeCk7XG4gIH1cblxuICAvKipcbiAgICogUGxhY2UgYSBiZXQgaW5zdHJ1Y3Rpb24gKHdpdGhvdXQgQVRBIGNyZWF0aW9uKVxuICAgKi9cbiAgYXN5bmMgcGxhY2VCZXQocGFyYW1zOiBQbGFjZUJldFBhcmFtcyk6IFByb21pc2U8VHJhbnNhY3Rpb25JbnN0cnVjdGlvbj4ge1xuICAgIGNvbnN0IHsgdXNlciwgbWFya2V0LCBhbW91bnQsIG91dGNvbWUsIGJldHRpbmdUb2tlbiwgZmVlUmVjaXBpZW50VG9rZW4gfSA9IHBhcmFtcztcbiAgICBcbiAgICBjb25zdCBhbW91bnRCbiA9IG5ldyBCTihhbW91bnQpO1xuICAgIGNvbnN0IG91dGNvbWVFbnVtID0gb3V0Y29tZSA9PT0gXCJZZXNcIiA/IHsgeWVzOiB7fSB9IDogeyBubzoge30gfTtcblxuICAgIC8vIEdldCBnbG9iYWwgY29uZmlnIGZvciBmZWUgaW5mb1xuICAgIGNvbnN0IGdsb2JhbENvbmZpZyA9IGdldEdsb2JhbENvbmZpZ1BkYSh0aGlzLnByb2dyYW0ucHJvZ3JhbUlkKTtcblxuICAgIC8vIERlcml2ZSBQREFzIGZyb20gbWFya2V0IGFkZHJlc3NcbiAgICBjb25zdCB5ZXNNaW50ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oWUVTX01JTlRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuICAgIGNvbnN0IG5vTWludCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKE5PX01JTlRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuICAgIGNvbnN0IHZhdWx0ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oVkFVTFRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuXG4gICAgY29uc3QgdXNlckJldHRpbmdUb2tlbiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKGJldHRpbmdUb2tlbiwgdXNlcik7XG4gICAgXG4gICAgLy8gRGV0ZXJtaW5lIHdoaWNoIG91dGNvbWUgdG9rZW4gdGhlIHVzZXIgd2lsbCByZWNlaXZlXG4gICAgLy8gT3V0Y29tZSB0b2tlbnMgKFllcy9ObykgdXNlIFRva2VuLTIwMjIgcHJvZ3JhbVxuICAgIGNvbnN0IHRhcmdldE1pbnQgPSBvdXRjb21lID09PSBcIlllc1wiID8geWVzTWludCA6IG5vTWludDtcbiAgICBjb25zdCB1c2VyT3V0Y29tZVRva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModGFyZ2V0TWludCwgdXNlciwgZmFsc2UsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLm1ldGhvZHNcbiAgICAgIC5wbGFjZUJldCh7XG4gICAgICAgIGJ1eU91dGNvbWU6IG91dGNvbWVFbnVtLFxuICAgICAgICBhbW91bnQ6IGFtb3VudEJuLFxuICAgICAgfSlcbiAgICAgIC5hY2NvdW50c1BhcnRpYWwoe1xuICAgICAgICBnbG9iYWxDb25maWcsXG4gICAgICAgIG1hcmtldCxcbiAgICAgICAgeWVzTWludCxcbiAgICAgICAgbm9NaW50LFxuICAgICAgICB2YXVsdCxcbiAgICAgICAgZmVlUmVjaXBpZW50VG9rZW46IGZlZVJlY2lwaWVudFRva2VuIHx8IG51bGwsXG4gICAgICAgIHVzZXJPdXRjb21lVG9rZW4sXG4gICAgICAgIHVzZXJCZXR0aW5nVG9rZW4sXG4gICAgICAgIHVzZXIsXG4gICAgICB9KVxuICAgICAgLmluc3RydWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBjb21wbGV0ZSB0cmFuc2FjdGlvbiB0byBwbGFjZSBhIGJldCAod2l0aCBvcHRpb25hbCBBVEEgY3JlYXRpb24gZm9yIGJvdGggb3V0Y29tZSB0b2tlbiBhbmQgZmVlIHJlY2lwaWVudClcbiAgICovXG4gIGFzeW5jIGJ1aWxkUGxhY2VCZXRUeChwYXJhbXM6IFBsYWNlQmV0UGFyYW1zKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHsgdXNlciwgbWFya2V0LCBvdXRjb21lLCBiZXR0aW5nVG9rZW4sIGNyZWF0ZUF0YSA9IHRydWUgfSA9IHBhcmFtcztcbiAgICBcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbigpO1xuICAgIFxuICAgIC8vIEZldGNoIGNvbmZpZyB0byBjaGVjayBmZWVfYnBzXG4gICAgY29uc3QgY29uZmlnQWNjb3VudCA9IGF3YWl0IHRoaXMuZ2V0R2xvYmFsQ29uZmlnQWNjb3VudCgpO1xuICAgIFxuICAgIC8vIERlcml2ZSBtaW50IFBEQXMgZnJvbSBtYXJrZXQgYWRkcmVzc1xuICAgIGNvbnN0IHllc01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShZRVNfTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG4gICAgY29uc3Qgbm9NaW50ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oTk9fTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG4gICAgXG4gICAgLy8gT3V0Y29tZSB0b2tlbnMgKFllcy9ObykgdXNlIFRva2VuLTIwMjIgcHJvZ3JhbVxuICAgIGNvbnN0IHRhcmdldE1pbnQgPSBvdXRjb21lID09PSBcIlllc1wiID8geWVzTWludCA6IG5vTWludDtcbiAgICBjb25zdCB1c2VyT3V0Y29tZVRva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmModGFyZ2V0TWludCwgdXNlciwgZmFsc2UsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG5cbiAgICAvLyBDaGVjayBpZiB1c2VyIG91dGNvbWUgQVRBIGV4aXN0cyBhbmQgY3JlYXRlIGlmIG5lZWRlZFxuICAgIGlmIChjcmVhdGVBdGEpIHtcbiAgICAgIGNvbnN0IGV4aXN0cyA9IGF3YWl0IHRoaXMuYXRhRXhpc3RzKHVzZXJPdXRjb21lVG9rZW4pO1xuICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgY29uc3QgY3JlYXRlQXRhSXggPSB0aGlzLmNyZWF0ZUF0YUluc3RydWN0aW9uKHVzZXIsIHVzZXIsIHRhcmdldE1pbnQsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG4gICAgICAgIHR4LmFkZChjcmVhdGVBdGFJeCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGZlZSByZWNpcGllbnQgdG9rZW4gYWNjb3VudCBpZiBmZWVfYnBzID4gMFxuICAgIGxldCBmZWVSZWNpcGllbnRUb2tlbjogUHVibGljS2V5IHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKGNvbmZpZ0FjY291bnQuZmVlQnBzID4gMCkge1xuICAgICAgY29uc3QgZmVlUmVjaXBpZW50QWRkcmVzcyA9IHBhcmFtcy5mZWVSZWNpcGllbnQgfHwgY29uZmlnQWNjb3VudC5mZWVSZWNpcGllbnQ7XG4gICAgICBmZWVSZWNpcGllbnRUb2tlbiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKGJldHRpbmdUb2tlbiwgZmVlUmVjaXBpZW50QWRkcmVzcyk7XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIGZlZSByZWNpcGllbnQgQVRBIGV4aXN0cyBhbmQgY3JlYXRlIGlmIG5lZWRlZFxuICAgICAgY29uc3QgZmVlQXRhRXhpc3RzID0gYXdhaXQgdGhpcy5hdGFFeGlzdHMoZmVlUmVjaXBpZW50VG9rZW4pO1xuICAgICAgaWYgKCFmZWVBdGFFeGlzdHMpIHtcbiAgICAgICAgY29uc3QgY3JlYXRlRmVlQXRhSXggPSB0aGlzLmNyZWF0ZUF0YUluc3RydWN0aW9uKHVzZXIsIGZlZVJlY2lwaWVudEFkZHJlc3MsIGJldHRpbmdUb2tlbik7XG4gICAgICAgIHR4LmFkZChjcmVhdGVGZWVBdGFJeCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGxhY2VCZXRJeCA9IGF3YWl0IHRoaXMucGxhY2VCZXQoe1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgZmVlUmVjaXBpZW50VG9rZW4sXG4gICAgfSk7XG4gICAgdHguYWRkKHBsYWNlQmV0SXgpO1xuXG4gICAgcmV0dXJuIHR4O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgdHJhbnNhY3Rpb24gdG8gcGxhY2UgYmV0cyBmcm9tIGJvdGggdXNlciBhbmQgYm9udXMgYWNjb3VudCBpbiBvbmUgdHJhbnNhY3Rpb24uXG4gICAqIFRoaXMgdHJhbnNhY3Rpb24gcmVxdWlyZXMgdHdvIHNpZ25lcnM6IHVzZXIgYW5kIGJvbnVzQWNjb3VudC5cbiAgICogXG4gICAqIFVzZSBjYXNlOiBVc2VyIHBheXMgcGFydCBvZiB0aGUgYmV0LCBib251cyBhY2NvdW50IChiYWNrZW5kKSBwYXlzIHRoZSByZXN0LlxuICAgKiBFeGFtcGxlOiBVc2VyIGJldHMgMTBVIHRvdGFsLCB1c2VyIHBheXMgOFUsIGJvbnVzIGFjY291bnQgcGF5cyAyVS5cbiAgICogXG4gICAqIEJvdGggYmV0cyBhcmUgcGxhY2VkIG9uIHRoZSBzYW1lIG91dGNvbWUsIGJ1dCBvdXRjb21lIHRva2VucyBnbyB0byBlYWNoIGFjY291bnQgcmVzcGVjdGl2ZWx5LlxuICAgKi9cbiAgYXN5bmMgYnVpbGRQbGFjZUJldFYyVHgocGFyYW1zOiBQbGFjZUJldFYyUGFyYW1zKTogUHJvbWlzZTxQbGFjZUJldFYyUmVzdWx0PiB7XG4gICAgY29uc3QgeyBcbiAgICAgIHVzZXIsIFxuICAgICAgYm9udXNBY2NvdW50LCBcbiAgICAgIG1hcmtldCwgXG4gICAgICB1c2VyQW1vdW50LCBcbiAgICAgIGJvbnVzQW1vdW50LCBcbiAgICAgIG91dGNvbWUsIFxuICAgICAgYmV0dGluZ1Rva2VuLCBcbiAgICAgIGNyZWF0ZUF0YSA9IHRydWUgXG4gICAgfSA9IHBhcmFtcztcbiAgICBcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbigpO1xuICAgIFxuICAgIC8vIEZldGNoIGNvbmZpZyB0byBjaGVjayBmZWVfYnBzXG4gICAgY29uc3QgY29uZmlnQWNjb3VudCA9IGF3YWl0IHRoaXMuZ2V0R2xvYmFsQ29uZmlnQWNjb3VudCgpO1xuICAgIFxuICAgIC8vIERlcml2ZSBtaW50IFBEQXMgZnJvbSBtYXJrZXQgYWRkcmVzc1xuICAgIGNvbnN0IHllc01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShZRVNfTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG4gICAgY29uc3Qgbm9NaW50ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oTk9fTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG4gICAgXG4gICAgLy8gT3V0Y29tZSB0b2tlbnMgKFllcy9ObykgdXNlIFRva2VuLTIwMjIgcHJvZ3JhbVxuICAgIGNvbnN0IHRhcmdldE1pbnQgPSBvdXRjb21lID09PSBcIlllc1wiID8geWVzTWludCA6IG5vTWludDtcbiAgICBcbiAgICAvLyBVc2VyJ3Mgb3V0Y29tZSB0b2tlbiBhY2NvdW50XG4gICAgY29uc3QgdXNlck91dGNvbWVUb2tlbiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHRhcmdldE1pbnQsIHVzZXIsIGZhbHNlLCBUT0tFTl8yMDIyX1BST0dSQU1fSUQpO1xuICAgIFxuICAgIC8vIEJvbnVzIGFjY291bnQncyBvdXRjb21lIHRva2VuIGFjY291bnRcbiAgICBjb25zdCBib251c091dGNvbWVUb2tlbiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHRhcmdldE1pbnQsIGJvbnVzQWNjb3VudCwgZmFsc2UsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG5cbiAgICAvLyBDcmVhdGUgQVRBcyBpZiBuZWVkZWRcbiAgICBpZiAoY3JlYXRlQXRhKSB7XG4gICAgICAvLyBDaGVjayBpZiB1c2VyIG91dGNvbWUgQVRBIGV4aXN0cyBhbmQgY3JlYXRlIGlmIG5lZWRlZFxuICAgICAgY29uc3QgdXNlckF0YUV4aXN0cyA9IGF3YWl0IHRoaXMuYXRhRXhpc3RzKHVzZXJPdXRjb21lVG9rZW4pO1xuICAgICAgaWYgKCF1c2VyQXRhRXhpc3RzKSB7XG4gICAgICAgIGNvbnN0IGNyZWF0ZVVzZXJBdGFJeCA9IHRoaXMuY3JlYXRlQXRhSW5zdHJ1Y3Rpb24odXNlciwgdXNlciwgdGFyZ2V0TWludCwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcbiAgICAgICAgdHguYWRkKGNyZWF0ZVVzZXJBdGFJeCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIGJvbnVzIGFjY291bnQgb3V0Y29tZSBBVEEgZXhpc3RzIGFuZCBjcmVhdGUgaWYgbmVlZGVkXG4gICAgICBjb25zdCBib251c0F0YUV4aXN0cyA9IGF3YWl0IHRoaXMuYXRhRXhpc3RzKGJvbnVzT3V0Y29tZVRva2VuKTtcbiAgICAgIGlmICghYm9udXNBdGFFeGlzdHMpIHtcbiAgICAgICAgLy8gVXNlciBwYXlzIGZvciBjcmVhdGluZyB0aGUgYm9udXMgYWNjb3VudCdzIEFUQVxuICAgICAgICBjb25zdCBjcmVhdGVCb251c0F0YUl4ID0gdGhpcy5jcmVhdGVBdGFJbnN0cnVjdGlvbih1c2VyLCBib251c0FjY291bnQsIHRhcmdldE1pbnQsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG4gICAgICAgIHR4LmFkZChjcmVhdGVCb251c0F0YUl4KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZmVlIHJlY2lwaWVudCB0b2tlbiBhY2NvdW50IGlmIGZlZV9icHMgPiAwXG4gICAgbGV0IGZlZVJlY2lwaWVudFRva2VuOiBQdWJsaWNLZXkgfCBudWxsID0gbnVsbDtcbiAgICBpZiAoY29uZmlnQWNjb3VudC5mZWVCcHMgPiAwKSB7XG4gICAgICBjb25zdCBmZWVSZWNpcGllbnRBZGRyZXNzID0gcGFyYW1zLmZlZVJlY2lwaWVudCB8fCBjb25maWdBY2NvdW50LmZlZVJlY2lwaWVudDtcbiAgICAgIGZlZVJlY2lwaWVudFRva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMoYmV0dGluZ1Rva2VuLCBmZWVSZWNpcGllbnRBZGRyZXNzKTtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgZmVlIHJlY2lwaWVudCBBVEEgZXhpc3RzIGFuZCBjcmVhdGUgaWYgbmVlZGVkXG4gICAgICBjb25zdCBmZWVBdGFFeGlzdHMgPSBhd2FpdCB0aGlzLmF0YUV4aXN0cyhmZWVSZWNpcGllbnRUb2tlbik7XG4gICAgICBpZiAoIWZlZUF0YUV4aXN0cykge1xuICAgICAgICBjb25zdCBjcmVhdGVGZWVBdGFJeCA9IHRoaXMuY3JlYXRlQXRhSW5zdHJ1Y3Rpb24odXNlciwgZmVlUmVjaXBpZW50QWRkcmVzcywgYmV0dGluZ1Rva2VuKTtcbiAgICAgICAgdHguYWRkKGNyZWF0ZUZlZUF0YUl4KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgdXNlcidzIHBsYWNlQmV0IGluc3RydWN0aW9uXG4gICAgY29uc3QgdXNlckJldEl4ID0gYXdhaXQgdGhpcy5wbGFjZUJldCh7XG4gICAgICB1c2VyLFxuICAgICAgbWFya2V0LFxuICAgICAgYW1vdW50OiB1c2VyQW1vdW50LFxuICAgICAgb3V0Y29tZSxcbiAgICAgIGJldHRpbmdUb2tlbixcbiAgICAgIGZlZVJlY2lwaWVudFRva2VuLFxuICAgIH0pO1xuICAgIHR4LmFkZCh1c2VyQmV0SXgpO1xuXG4gICAgLy8gQ3JlYXRlIGJvbnVzIGFjY291bnQncyBwbGFjZUJldCBpbnN0cnVjdGlvblxuICAgIGNvbnN0IGJvbnVzQmV0SXggPSBhd2FpdCB0aGlzLnBsYWNlQmV0KHtcbiAgICAgIHVzZXI6IGJvbnVzQWNjb3VudCxcbiAgICAgIG1hcmtldCxcbiAgICAgIGFtb3VudDogYm9udXNBbW91bnQsXG4gICAgICBvdXRjb21lLFxuICAgICAgYmV0dGluZ1Rva2VuLFxuICAgICAgZmVlUmVjaXBpZW50VG9rZW4sXG4gICAgfSk7XG4gICAgdHguYWRkKGJvbnVzQmV0SXgpO1xuICAgIHJldHVybiB7XG4gICAgICB0cmFuc2FjdGlvbjogdHgsXG4gICAgICByZXF1aXJlZFNpZ25lcnM6IFt1c2VyLCBib251c0FjY291bnRdLFxuICAgIH07XG4gIH1cblxuICBhc3luYyB3aXRoZHJhd0JvbnVzKCkge1xuICAgIFxuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGEgYmFzZTY0IGVuY29kZWQgdHJhbnNhY3Rpb25cbiAgICogVXNlIHRoaXMgb24gZnJvbnRlbmQgdG8gZGVjb2RlIHRoZSB0cmFuc2FjdGlvbiByZWNlaXZlZCBmcm9tIGJhY2tlbmRcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZVRyYW5zYWN0aW9uKHNlcmlhbGl6ZWRUeDogc3RyaW5nKTogVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHNlcmlhbGl6ZWRUeCwgJ2Jhc2U2NCcpO1xuICAgIHJldHVybiBUcmFuc2FjdGlvbi5mcm9tKGJ1ZmZlcik7XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBhIHBhcnRpYWxseSBzaWduZWQgdHJhbnNhY3Rpb24gd2l0aCB0aGUgYm9udXMgYWNjb3VudCAoYmFja2VuZCBzaWRlKVxuICAgKiBcbiAgICogQHBhcmFtIHVzZXJTaWduZWRUeEJhc2U2NCAtIEJhc2U2NCBlbmNvZGVkIHRyYW5zYWN0aW9uIHRoYXQgaGFzIGJlZW4gc2lnbmVkIGJ5IHVzZXJcbiAgICogQHBhcmFtIGJvbnVzQWNjb3VudEtleXBhaXIgLSBUaGUgYm9udXMgYWNjb3VudCBrZXlwYWlyIGZvciBzaWduaW5nXG4gICAqIEByZXR1cm5zIFRoZSBmdWxseSBzaWduZWQgdHJhbnNhY3Rpb24gcmVhZHkgZm9yIHN1Ym1pc3Npb25cbiAgICovXG4gIHN0YXRpYyBzaWduV2l0aEtleVBhaXIodXNlclNpZ25lZFR4QmFzZTY0OiBzdHJpbmcsIGtleVBhaXI6IEtleXBhaXIpOiBUcmFuc2FjdGlvbiB7XG4gICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20odXNlclNpZ25lZFR4QmFzZTY0LCAnYmFzZTY0Jyk7XG4gICAgY29uc3QgdHggPSBUcmFuc2FjdGlvbi5mcm9tKGJ1ZmZlcik7XG4gICAgdHgucGFydGlhbFNpZ24oa2V5UGFpcik7XG4gICAgcmV0dXJuIHR4O1xuICB9XG5cbiAgLy8gYXN5bmMgdHJhbnNmZXIoKVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIHRyYW5zYWN0aW9uIHRvIHdpdGhkcmF3IGJvbnVzICh0cmFuc2ZlciBVU0RUIGZyb20gYm9udXMgYWNjb3VudCB0byB1c2VyKVxuICAgKiBUaGlzIHRyYW5zYWN0aW9uIHJlcXVpcmVzIHRoZSBib251cyBhY2NvdW50IHRvIHNpZ24uXG4gICAqIFxuICAgKiBAcGFyYW0gYm9udXNBY2NvdW50IC0gVGhlIGJvbnVzIGFjY291bnQgcHVibGljIGtleSAoc2lnbmVyLCBzb3VyY2Ugb2YgZnVuZHMpXG4gICAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIncyBwdWJsaWMga2V5IChkZXN0aW5hdGlvbilcbiAgICogQHBhcmFtIHRva2VuTWludCAtIFRoZSB0b2tlbiBtaW50IGFkZHJlc3MgKGUuZy4sIFVTRFQpXG4gICAqIEBwYXJhbSBhbW91bnQgLSBBbW91bnQgdG8gdHJhbnNmZXIgKGluIHRva2VuJ3Mgc21hbGxlc3QgdW5pdCwgZS5nLiwgMV8wMDBfMDAwIGZvciAxIFVTRFQgd2l0aCA2IGRlY2ltYWxzKVxuICAgKiBAcGFyYW0gY3JlYXRlQXRhIC0gV2hldGhlciB0byBjcmVhdGUgdGhlIHVzZXIncyBBVEEgaWYgaXQgZG9lc24ndCBleGlzdCAoZGVmYXVsdDogdHJ1ZSlcbiAgICogQHJldHVybnMgVHJhbnNhY3Rpb24gcmVhZHkgZm9yIHNpZ25pbmdcbiAgICovXG4gIGFzeW5jIGJ1aWxkV2l0aGRyYXdCb251c1R4KHBhcmFtczoge1xuICAgIGJvbnVzQWNjb3VudDogUHVibGljS2V5O1xuICAgIHVzZXI6IFB1YmxpY0tleTtcbiAgICB0b2tlbk1pbnQ6IFB1YmxpY0tleTtcbiAgICBhbW91bnQ6IG51bWJlciB8IEJOO1xuICAgIGNyZWF0ZUF0YT86IGJvb2xlYW47XG4gIH0pOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgeyBib251c0FjY291bnQsIHVzZXIsIHRva2VuTWludCwgYW1vdW50LCBjcmVhdGVBdGEgPSB0cnVlIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgYW1vdW50Qm4gPSBuZXcgQk4oYW1vdW50KTtcbiAgICBcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbigpO1xuICAgIFxuICAgIC8vIEdldCBBVEEgYWRkcmVzc2VzIGZvciBib3RoIGFjY291bnRzXG4gICAgY29uc3QgYm9udXNUb2tlbkFjY291bnQgPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh0b2tlbk1pbnQsIGJvbnVzQWNjb3VudCk7XG4gICAgY29uc3QgdXNlclRva2VuQWNjb3VudCA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHRva2VuTWludCwgdXNlcik7XG4gICAgXG4gICAgLy8gQ3JlYXRlIHVzZXIncyBBVEEgaWYgbmVlZGVkXG4gICAgaWYgKGNyZWF0ZUF0YSkge1xuICAgICAgY29uc3QgdXNlckF0YUV4aXN0cyA9IGF3YWl0IHRoaXMuYXRhRXhpc3RzKHVzZXJUb2tlbkFjY291bnQpO1xuICAgICAgaWYgKCF1c2VyQXRhRXhpc3RzKSB7XG4gICAgICAgIGNvbnN0IGNyZWF0ZVVzZXJBdGFJeCA9IHRoaXMuY3JlYXRlQXRhSW5zdHJ1Y3Rpb24oYm9udXNBY2NvdW50LCB1c2VyLCB0b2tlbk1pbnQpO1xuICAgICAgICB0eC5hZGQoY3JlYXRlVXNlckF0YUl4KTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gQ3JlYXRlIHRyYW5zZmVyIGluc3RydWN0aW9uXG4gICAgY29uc3QgdHJhbnNmZXJJeCA9IGNyZWF0ZVRyYW5zZmVySW5zdHJ1Y3Rpb24oXG4gICAgICBib251c1Rva2VuQWNjb3VudCwgIC8vIHNvdXJjZVxuICAgICAgdXNlclRva2VuQWNjb3VudCwgICAvLyBkZXN0aW5hdGlvblxuICAgICAgYm9udXNBY2NvdW50LCAgICAgICAvLyBvd25lciAoc2lnbmVyKVxuICAgICAgQmlnSW50KGFtb3VudEJuLnRvU3RyaW5nKCkpLCAgLy8gYW1vdW50XG4gICAgICBbXSwgICAgICAgICAgICAgICAgIC8vIG11bHRpU2lnbmVycyAoZW1wdHkgZm9yIHNpbmdsZSBzaWduZXIpXG4gICAgICBUT0tFTl9QUk9HUkFNX0lEICAgIC8vIHByb2dyYW0gaWRcbiAgICApO1xuICAgIHR4LmFkZCh0cmFuc2Zlckl4KTtcbiAgICBcbiAgICByZXR1cm4gdHg7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYW5kIHJldHVybiBhIHRyYW5zYWN0aW9uIGZvciB3aXRoZHJhd2luZyBib251cyB3aXRoIHNlcmlhbGl6YXRpb24gaW5mb1xuICAgKiBVc2VmdWwgZm9yIHNwbGl0IHNpZ25pbmcgd29ya2Zsb3cgd2hlcmUgdXNlci9hZG1pbiBidWlsZHMgdHggYW5kIGJvbnVzIGFjY291bnQgc2lnbnNcbiAgICogXG4gICAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIHRyYW5zYWN0aW9uIGFuZCByZXF1aXJlZCBzaWduZXJzXG4gICAqL1xuICBhc3luYyBidWlsZFdpdGhkcmF3Qm9udXNUeFdpdGhJbmZvKHBhcmFtczoge1xuICAgIGJvbnVzQWNjb3VudDogUHVibGljS2V5O1xuICAgIHVzZXI6IFB1YmxpY0tleTtcbiAgICB0b2tlbk1pbnQ6IFB1YmxpY0tleTtcbiAgICBhbW91bnQ6IG51bWJlciB8IEJOO1xuICAgIGNyZWF0ZUF0YT86IGJvb2xlYW47XG4gIH0pOiBQcm9taXNlPHsgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uOyByZXF1aXJlZFNpZ25lcnM6IFB1YmxpY0tleVtdIH0+IHtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHRoaXMuYnVpbGRXaXRoZHJhd0JvbnVzVHgocGFyYW1zKTtcbiAgICByZXR1cm4ge1xuICAgICAgdHJhbnNhY3Rpb246IHR4LFxuICAgICAgcmVxdWlyZWRTaWduZXJzOiBbcGFyYW1zLmJvbnVzQWNjb3VudF0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGFpbSByZXdhcmRzIGFmdGVyIG1hcmtldCByZXNvbHV0aW9uXG4gICAqL1xuICBhc3luYyBjbGFpbVJld2FyZHMocGFyYW1zOiBDbGFpbVJld2FyZHNQYXJhbXMpOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24+IHtcbiAgICBjb25zdCB7IHVzZXIsIG1hcmtldCwgYmV0dGluZ1Rva2VuLCB3aW5uaW5nT3V0Y29tZSB9ID0gcGFyYW1zO1xuXG4gICAgLy8gRGVyaXZlIG1pbnQgUERBcyBmcm9tIG1hcmtldCBhZGRyZXNzXG4gICAgY29uc3QgeWVzTWludCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKFlFU19NSU5UX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcbiAgICBjb25zdCBub01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShOT19NSU5UX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcblxuICAgIC8vIERlcml2ZSB2YXVsdCBQREFcbiAgICBjb25zdCB2YXVsdCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKFZBVUxUX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcblxuICAgIGNvbnN0IHVzZXJCZXR0aW5nVG9rZW4gPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhiZXR0aW5nVG9rZW4sIHVzZXIpO1xuICAgIC8vIE91dGNvbWUgdG9rZW5zIChZZXMvTm8pIHVzZSBUb2tlbi0yMDIyIHByb2dyYW1cbiAgICBjb25zdCB0YXJnZXRNaW50ID0gd2lubmluZ091dGNvbWUgPT09IFwiWWVzXCIgPyB5ZXNNaW50IDogbm9NaW50O1xuICAgIGNvbnN0IHVzZXJPdXRjb21lVG9rZW4gPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh0YXJnZXRNaW50LCB1c2VyLCBmYWxzZSwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcbiAgICBjb25zdCBzaGFyZXNUb0NsYWltQm4gPSBuZXcgQk4ocGFyYW1zLnNoYXJlc1RvQ2xhaW0pO1xuICAgIGNvbnN0IGNsb3NlQWNjb3VudCA9IHBhcmFtcy5jbG9zZUFjY291bnQgPz8gdHJ1ZTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLm1ldGhvZHNcbiAgICAgIC5jbGFpbVJld2FyZHMoe1xuICAgICAgICB0b2tlbkFtb3VudDogc2hhcmVzVG9DbGFpbUJuLFxuICAgICAgICBjbG9zZUFjY291bnQsXG4gICAgICB9KVxuICAgICAgLmFjY291bnRzUGFydGlhbCh7XG4gICAgICAgIG1hcmtldCxcbiAgICAgICAgeWVzTWludCxcbiAgICAgICAgbm9NaW50LFxuICAgICAgICB2YXVsdCxcbiAgICAgICAgdXNlck91dGNvbWVUb2tlbixcbiAgICAgICAgdXNlckJldHRpbmdUb2tlbixcbiAgICAgICAgdXNlcixcbiAgICAgIH0pXG4gICAgICAuaW5zdHJ1Y3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNvbXBsZXRlIHRyYW5zYWN0aW9uIHRvIGNsYWltIHJld2FyZHNcbiAgICovXG4gIGFzeW5jIGJ1aWxkQ2xhaW1SZXdhcmRzVHgocGFyYW1zOiBDbGFpbVJld2FyZHNQYXJhbXMpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgeyB1c2VyLCBtYXJrZXQsIGJldHRpbmdUb2tlbiwgd2lubmluZ091dGNvbWUgfSA9IHBhcmFtcztcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbigpO1xuXG4gICAgLy8gRGVyaXZlIG1pbnQgUERBcyBmcm9tIG1hcmtldCBhZGRyZXNzXG4gICAgY29uc3QgeWVzTWludCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKFlFU19NSU5UX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcblxuICAgIGNvbnN0IG5vTWludCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKE5PX01JTlRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuXG4gICAgLy8gRGVyaXZlIHZhdWx0IFBEQVxuICAgIGNvbnN0IHZhdWx0ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oVkFVTFRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuXG4gICAgY29uc3QgdXNlckJldHRpbmdUb2tlbiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKGJldHRpbmdUb2tlbiwgdXNlcik7XG4gICAgLy8gT3V0Y29tZSB0b2tlbnMgKFllcy9ObykgdXNlIFRva2VuLTIwMjIgcHJvZ3JhbVxuICAgIGNvbnN0IHRhcmdldE1pbnQgPSB3aW5uaW5nT3V0Y29tZSA9PT0gXCJZZXNcIiA/IHllc01pbnQgOiBub01pbnQ7XG4gICAgY29uc3QgdXNlck91dGNvbWVUb2tlbiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKHRhcmdldE1pbnQsIHVzZXIsIGZhbHNlLCBUT0tFTl8yMDIyX1BST0dSQU1fSUQpO1xuICAgIGNvbnN0IHNoYXJlc1RvQ2xhaW1CbiA9IG5ldyBCTihwYXJhbXMuc2hhcmVzVG9DbGFpbSk7XG4gICAgY29uc3QgY2xvc2VBY2NvdW50ID0gcGFyYW1zLmNsb3NlQWNjb3VudCA/PyB0cnVlO1xuXG4gICAgY29uc3QgaXggPSBhd2FpdCB0aGlzLnByb2dyYW0ubWV0aG9kc1xuICAgICAgLmNsYWltUmV3YXJkcyh7XG4gICAgICAgIHRva2VuQW1vdW50OiBzaGFyZXNUb0NsYWltQm4sXG4gICAgICAgIGNsb3NlQWNjb3VudCxcbiAgICAgIH0pXG4gICAgICAuYWNjb3VudHNQYXJ0aWFsKHtcbiAgICAgICAgbWFya2V0LFxuICAgICAgICB5ZXNNaW50LFxuICAgICAgICBub01pbnQsXG4gICAgICAgIHZhdWx0LFxuICAgICAgICB1c2VyT3V0Y29tZVRva2VuLFxuICAgICAgICB1c2VyQmV0dGluZ1Rva2VuLFxuICAgICAgICB1c2VyLFxuICAgICAgfSlcbiAgICAgIC5pbnN0cnVjdGlvbigpO1xuICAgIFxuICAgIHR4LmFkZChpeCk7XG4gICAgcmV0dXJuIHR4O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGluc3RydWN0aW9ucyB0byBjbGFpbSByZXdhcmRzIGZyb20gbXVsdGlwbGUgbWFya2V0c1xuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGluc3RydWN0aW9ucyB0aGF0IGNhbiBiZSBiYXRjaGVkIGludG8gdHJhbnNhY3Rpb25zXG4gICAqL1xuICBhc3luYyBiYXRjaENsYWltUmV3YXJkcyhwYXJhbXM6IEJhdGNoQ2xhaW1QYXJhbXMpOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXT4ge1xuICAgIGNvbnN0IHsgdXNlciwgY2xhaW1zIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgY2xhaW0gb2YgY2xhaW1zKSB7XG4gICAgICBjb25zdCBpeCA9IGF3YWl0IHRoaXMuY2xhaW1SZXdhcmRzKHtcbiAgICAgICAgdXNlcixcbiAgICAgICAgbWFya2V0OiBjbGFpbS5tYXJrZXQsXG4gICAgICAgIGJldHRpbmdUb2tlbjogY2xhaW0uYmV0dGluZ1Rva2VuLFxuICAgICAgICB3aW5uaW5nT3V0Y29tZTogY2xhaW0ud2lubmluZ091dGNvbWUsXG4gICAgICAgIHNoYXJlc1RvQ2xhaW06IGNsYWltLnNoYXJlc1RvQ2xhaW0gPz8gMCxcbiAgICAgICAgY2xvc2VBY2NvdW50OiBjbGFpbS5jbG9zZUFjY291bnQgPz8gdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgaW5zdHJ1Y3Rpb25zLnB1c2goaXgpO1xuICAgIH1cblxuICAgIHJldHVybiBpbnN0cnVjdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdHJhbnNhY3Rpb25zIHRvIGNsYWltIHJld2FyZHMgZnJvbSBtdWx0aXBsZSBtYXJrZXRzXG4gICAqIEF1dG9tYXRpY2FsbHkgc3BsaXRzIGludG8gbXVsdGlwbGUgdHJhbnNhY3Rpb25zIGlmIG5lZWRlZCAobWF4IDUgY2xhaW1zIHBlciB0eCB0byBhdm9pZCBzaXplIGxpbWl0cylcbiAgICogQHBhcmFtIHBhcmFtcyAtIEJhdGNoIGNsYWltIHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIG1heENsYWltc1BlclR4IC0gTWF4aW11bSBjbGFpbXMgcGVyIHRyYW5zYWN0aW9uIChkZWZhdWx0OiA1KVxuICAgKiBAcmV0dXJucyBBcnJheSBvZiB0cmFuc2FjdGlvbnNcbiAgICovXG4gIGFzeW5jIGJ1aWxkQmF0Y2hDbGFpbVJld2FyZHNUeChcbiAgICBwYXJhbXM6IEJhdGNoQ2xhaW1QYXJhbXMsXG4gICAgbWF4Q2xhaW1zUGVyVHg6IG51bWJlciA9IDVcbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvbltdPiB7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gYXdhaXQgdGhpcy5iYXRjaENsYWltUmV3YXJkcyhwYXJhbXMpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uczogVHJhbnNhY3Rpb25bXSA9IFtdO1xuXG4gICAgLy8gU3BsaXQgaW5zdHJ1Y3Rpb25zIGludG8gY2h1bmtzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnN0cnVjdGlvbnMubGVuZ3RoOyBpICs9IG1heENsYWltc1BlclR4KSB7XG4gICAgICBjb25zdCBjaHVuayA9IGluc3RydWN0aW9ucy5zbGljZShpLCBpICsgbWF4Q2xhaW1zUGVyVHgpO1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oKTtcbiAgICAgIGNodW5rLmZvckVhY2goaXggPT4gdHguYWRkKGl4KSk7XG4gICAgICB0cmFuc2FjdGlvbnMucHVzaCh0eCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYW5zYWN0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZ1bmQgYmV0cyBpZiBtYXJrZXQgaXMgcmVmdW5kZWRcbiAgICogQHBhcmFtIHBhcmFtcy50b2tlbkFtb3VudCAtIEFtb3VudCBvZiBzaGFyZXMgdG8gcmVmdW5kLiAwIG9yIHVuZGVmaW5lZCBtZWFucyByZWZ1bmQgYWxsIHNoYXJlcy5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgYWxsb3dzIHVzZXJzIHRvIHBhcnRpYWxseSByZWZ1bmQgdGhlaXIgcG9zaXRpb24gYWNyb3NzIG11bHRpcGxlIHRyYW5zYWN0aW9ucy5cbiAgICovXG4gIGFzeW5jIHJlZnVuZChwYXJhbXM6IFJlZnVuZFBhcmFtcyk6IFByb21pc2U8VHJhbnNhY3Rpb25JbnN0cnVjdGlvbj4ge1xuICAgIGNvbnN0IHsgdXNlciwgbWFya2V0LCBiZXR0aW5nVG9rZW4sIG91dGNvbWUsIHRva2VuQW1vdW50LCBjbG9zZUFjY291bnQgPSB0cnVlIH0gPSBwYXJhbXM7XG4gICAgXG4gICAgY29uc3Qgb3V0Y29tZUVudW0gPSBvdXRjb21lID09PSBcIlllc1wiID8geyB5ZXM6IHt9IH0gOiB7IG5vOiB7fSB9O1xuICAgIFxuICAgIC8vIENvbnZlcnQgdG9rZW5BbW91bnQgdG8gQk4gKDAgbWVhbnMgcmVmdW5kIGFsbClcbiAgICBjb25zdCB0b2tlbkFtb3VudEJuID0gbmV3IEJOKHRva2VuQW1vdW50ID8/IDApO1xuICAgIFxuICAgIC8vIERlcml2ZSBtaW50IFBEQXMgZnJvbSBtYXJrZXQgYWRkcmVzc1xuICAgIGNvbnN0IHllc01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShZRVNfTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG4gICAgY29uc3Qgbm9NaW50ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oTk9fTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG5cbiAgICAvLyBEZXJpdmUgdmF1bHQgUERBXG4gICAgY29uc3QgdmF1bHQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShWQVVMVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG5cbiAgICBjb25zdCB1c2VyQmV0dGluZ1Rva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMoYmV0dGluZ1Rva2VuLCB1c2VyKTtcbiAgICAvLyBPdXRjb21lIHRva2VucyAoWWVzL05vKSB1c2UgVG9rZW4tMjAyMiBwcm9ncmFtXG4gICAgY29uc3QgdGFyZ2V0TWludCA9IG91dGNvbWUgPT09IFwiWWVzXCIgPyB5ZXNNaW50IDogbm9NaW50O1xuICAgIGNvbnN0IHVzZXJPdXRjb21lVG9rZW4gPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyh0YXJnZXRNaW50LCB1c2VyLCBmYWxzZSwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb2dyYW0ubWV0aG9kc1xuICAgICAgLnJlZnVuZCh7XG4gICAgICAgIG91dGNvbWU6IG91dGNvbWVFbnVtLFxuICAgICAgICB0b2tlbkFtb3VudDogdG9rZW5BbW91bnRCbixcbiAgICAgICAgY2xvc2VBY2NvdW50LFxuICAgICAgfSlcbiAgICAgIC5hY2NvdW50c1BhcnRpYWwoe1xuICAgICAgICBtYXJrZXQ6IG1hcmtldCxcbiAgICAgICAgeWVzTWludDogeWVzTWludCxcbiAgICAgICAgbm9NaW50OiBub01pbnQsXG4gICAgICAgIHZhdWx0OiB2YXVsdCxcbiAgICAgICAgdXNlck91dGNvbWVUb2tlbjogdXNlck91dGNvbWVUb2tlbixcbiAgICAgICAgdXNlckJldHRpbmdUb2tlbjogdXNlckJldHRpbmdUb2tlbixcbiAgICAgICAgdG9rZW5Qcm9ncmFtOiBUT0tFTl9QUk9HUkFNX0lELFxuICAgICAgICB0b2tlbjIwMjJQcm9ncmFtOiBUT0tFTl8yMDIyX1BST0dSQU1fSUQsXG4gICAgICAgIHVzZXI6IHVzZXIsXG4gICAgICB9KVxuICAgICAgLmluc3RydWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBjb21wbGV0ZSB0cmFuc2FjdGlvbiB0byByZWZ1bmRcbiAgICovXG4gIGFzeW5jIGJ1aWxkUmVmdW5kVHgocGFyYW1zOiBSZWZ1bmRQYXJhbXMpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgaXggPSBhd2FpdCB0aGlzLnJlZnVuZChwYXJhbXMpO1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb24oKS5hZGQoaXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnVuZCBib3RoIFllcyBhbmQgTm8gcG9zaXRpb25zIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uLlxuICAgKiBcbiAgICogVXNlIHRoaXMgbWV0aG9kIHdoZW4gYSB1c2VyIGhhcyBiZXQgb24gYm90aCBZZXMgYW5kIE5vIG91dGNvbWVzIGFuZCBuZWVkcyB0byBcbiAgICogcmVmdW5kIGFsbCBwb3NpdGlvbnMgYWZ0ZXIgdGhlIG1hcmtldCBoYXMgYmVlbiByZXNvbHZlZCBhcyBcIlJlZnVuZGVkXCIgKE5vbmUpLlxuICAgKiBcbiAgICogVGhpcyBtZXRob2QgYXV0b21hdGljYWxseTpcbiAgICogLSBDaGVja3MgaWYgdGhlIHVzZXIgaGFzIFllcyB0b2tlbnMgYW5kL29yIE5vIHRva2Vuc1xuICAgKiAtIE9ubHkgaW5jbHVkZXMgcmVmdW5kIGluc3RydWN0aW9ucyBmb3Igb3V0Y29tZXMgdGhlIHVzZXIgYWN0dWFsbHkgaG9sZHNcbiAgICogLSBDbG9zZXMgdGhlIHRva2VuIGFjY291bnRzIGFmdGVyIHJlZnVuZGluZyAoYnkgZGVmYXVsdClcbiAgICogXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBSZWZ1bmRWMlBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLnVzZXIgLSBVc2VyJ3MgcHVibGljIGtleSAoc2lnbmVyKVxuICAgKiBAcGFyYW0gcGFyYW1zLm1hcmtldCAtIE1hcmtldCBQREEgYWRkcmVzc1xuICAgKiBAcGFyYW0gcGFyYW1zLmJldHRpbmdUb2tlbiAtIEJldHRpbmcgdG9rZW4gbWludCAoZS5nLiwgVVNEQylcbiAgICogQHBhcmFtIHBhcmFtcy55ZXNUb2tlbkFtb3VudCAtIE9wdGlvbmFsLiBBbW91bnQgb2YgWWVzIHRva2VucyB0byByZWZ1bmQuIDAgb3IgdW5kZWZpbmVkID0gcmVmdW5kIGFsbC5cbiAgICogQHBhcmFtIHBhcmFtcy5ub1Rva2VuQW1vdW50IC0gT3B0aW9uYWwuIEFtb3VudCBvZiBObyB0b2tlbnMgdG8gcmVmdW5kLiAwIG9yIHVuZGVmaW5lZCA9IHJlZnVuZCBhbGwuXG4gICAqIEBwYXJhbSBwYXJhbXMuY2xvc2VZZXNBY2NvdW50IC0gT3B0aW9uYWwuIFdoZXRoZXIgdG8gY2xvc2UgdGhlIFllcyB0b2tlbiBhY2NvdW50IGFmdGVyIHJlZnVuZC4gRGVmYXVsdDogdHJ1ZVxuICAgKiBAcGFyYW0gcGFyYW1zLmNsb3NlTm9BY2NvdW50IC0gT3B0aW9uYWwuIFdoZXRoZXIgdG8gY2xvc2UgdGhlIE5vIHRva2VuIGFjY291bnQgYWZ0ZXIgcmVmdW5kLiBEZWZhdWx0OiB0cnVlXG4gICAqIFxuICAgKiBAcmV0dXJucyBUcmFuc2FjdGlvbiBjb250YWluaW5nIHJlZnVuZCBpbnN0cnVjdGlvbnMgZm9yIGJvdGggb3V0Y29tZXMgKGlmIGFwcGxpY2FibGUpXG4gICAqIFxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIEJhc2ljIHVzYWdlOiBSZWZ1bmQgYWxsIFllcyBhbmQgTm8gdG9rZW5zXG4gICAqIGNvbnN0IHR4ID0gYXdhaXQgY2xpZW50LmJ1aWxkUmVmdW5kVjJUeCh7XG4gICAqICAgdXNlcjogdXNlclB1YmxpY0tleSxcbiAgICogICBtYXJrZXQ6IG1hcmtldFBkYSxcbiAgICogICBiZXR0aW5nVG9rZW46IHVzZGNNaW50LFxuICAgKiB9KTtcbiAgICogXG4gICAqIC8vIFNpZ24gYW5kIHNlbmRcbiAgICogdHgucmVjZW50QmxvY2toYXNoID0gKGF3YWl0IGNvbm5lY3Rpb24uZ2V0TGF0ZXN0QmxvY2toYXNoKCkpLmJsb2NraGFzaDtcbiAgICogdHguZmVlUGF5ZXIgPSB1c2VyUHVibGljS2V5O1xuICAgKiBhd2FpdCB3YWxsZXQuc2lnblRyYW5zYWN0aW9uKHR4KTtcbiAgICogYXdhaXQgY29ubmVjdGlvbi5zZW5kUmF3VHJhbnNhY3Rpb24odHguc2VyaWFsaXplKCkpO1xuICAgKiBgYGBcbiAgICogXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gS2VlcCB0b2tlbiBhY2NvdW50cyBvcGVuIChkb24ndCBjbG9zZSB0aGVtKVxuICAgKiBjb25zdCB0eCA9IGF3YWl0IGNsaWVudC5idWlsZFJlZnVuZFYyVHgoe1xuICAgKiAgIHVzZXI6IHVzZXJQdWJsaWNLZXksXG4gICAqICAgbWFya2V0OiBtYXJrZXRQZGEsXG4gICAqICAgYmV0dGluZ1Rva2VuOiB1c2RjTWludCxcbiAgICogICBjbG9zZVllc0FjY291bnQ6IGZhbHNlLCAvLyBLZWVwIFllcyB0b2tlbiBhY2NvdW50IG9wZW5cbiAgICogICBjbG9zZU5vQWNjb3VudDogZmFsc2UsICAvLyBLZWVwIE5vIHRva2VuIGFjY291bnQgb3BlblxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqIFxuICAgKiBAcmVtYXJrc1xuICAgKiAtIFRoZSBtYXJrZXQgbXVzdCBiZSBpbiBcIlJlZnVuZGVkXCIgc3RhdHVzIGZvciB0aGlzIG1ldGhvZCB0byB3b3JrXG4gICAqIC0gSWYgdGhlIHVzZXIgb25seSBoYXMgdG9rZW5zIG9uIG9uZSBzaWRlLCBvbmx5IHRoYXQgc2lkZSB3aWxsIGJlIHJlZnVuZGVkXG4gICAqIC0gVGhlIHJldHVybmVkIHRyYW5zYWN0aW9uIHdpbGwgYmUgZW1wdHkgaWYgdGhlIHVzZXIgaGFzIG5vIHRva2VucyBvbiBlaXRoZXIgc2lkZVxuICAgKi9cbiAgYXN5bmMgYnVpbGRSZWZ1bmRWMlR4KHBhcmFtczogUmVmdW5kVjJQYXJhbXMpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgeyBcbiAgICAgIHVzZXIsIFxuICAgICAgbWFya2V0LCBcbiAgICAgIGJldHRpbmdUb2tlbixcbiAgICAgIHllc1Rva2VuQW1vdW50LFxuICAgICAgbm9Ub2tlbkFtb3VudCxcbiAgICAgIGNsb3NlWWVzQWNjb3VudCA9IHRydWUsXG4gICAgICBjbG9zZU5vQWNjb3VudCA9IHRydWUgXG4gICAgfSA9IHBhcmFtcztcbiAgICBcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbigpO1xuICAgIFxuICAgIC8vIERlcml2ZSBtaW50IFBEQXMgZnJvbSBtYXJrZXQgYWRkcmVzc1xuICAgIGNvbnN0IHllc01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShZRVNfTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG4gICAgY29uc3Qgbm9NaW50ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oTk9fTUlOVF9TRUVEKSwgbWFya2V0LnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG4gICAgXG4gICAgLy8gR2V0IHVzZXIncyBvdXRjb21lIHRva2VuIGFjY291bnRzXG4gICAgY29uc3QgdXNlclllc1Rva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMoeWVzTWludCwgdXNlciwgZmFsc2UsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG4gICAgY29uc3QgdXNlck5vVG9rZW4gPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhub01pbnQsIHVzZXIsIGZhbHNlLCBUT0tFTl8yMDIyX1BST0dSQU1fSUQpO1xuICAgIFxuICAgIC8vIENoZWNrIGlmIHVzZXIgaGFzIFllcyB0b2tlbnNcbiAgICBsZXQgaGFzWWVzVG9rZW5zID0gZmFsc2U7XG4gICAgbGV0IHllc0JhbGFuY2UgPSAwO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB5ZXNBY2NvdW50ID0gYXdhaXQgdGhpcy5jb25uZWN0aW9uLmdldFRva2VuQWNjb3VudEJhbGFuY2UodXNlclllc1Rva2VuKTtcbiAgICAgIHllc0JhbGFuY2UgPSBOdW1iZXIoeWVzQWNjb3VudC52YWx1ZS5hbW91bnQpO1xuICAgICAgaGFzWWVzVG9rZW5zID0geWVzQmFsYW5jZSA+IDA7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBBY2NvdW50IGRvZXNuJ3QgZXhpc3Qgb3IgaGFzIG5vIGJhbGFuY2VcbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgdXNlciBoYXMgTm8gdG9rZW5zXG4gICAgbGV0IGhhc05vVG9rZW5zID0gZmFsc2U7XG4gICAgbGV0IG5vQmFsYW5jZSA9IDA7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG5vQWNjb3VudCA9IGF3YWl0IHRoaXMuY29ubmVjdGlvbi5nZXRUb2tlbkFjY291bnRCYWxhbmNlKHVzZXJOb1Rva2VuKTtcbiAgICAgIG5vQmFsYW5jZSA9IE51bWJlcihub0FjY291bnQudmFsdWUuYW1vdW50KTtcbiAgICAgIGhhc05vVG9rZW5zID0gbm9CYWxhbmNlID4gMDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEFjY291bnQgZG9lc24ndCBleGlzdCBvciBoYXMgbm8gYmFsYW5jZVxuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgWWVzIHJlZnVuZCBpbnN0cnVjdGlvbiBpZiB1c2VyIGhhcyBZZXMgdG9rZW5zXG4gICAgaWYgKGhhc1llc1Rva2Vucykge1xuICAgICAgY29uc3QgeWVzUmVmdW5kSXggPSBhd2FpdCB0aGlzLnJlZnVuZCh7XG4gICAgICAgIHVzZXIsXG4gICAgICAgIG1hcmtldCxcbiAgICAgICAgYmV0dGluZ1Rva2VuLFxuICAgICAgICBvdXRjb21lOiBcIlllc1wiLFxuICAgICAgICB0b2tlbkFtb3VudDogMCxcbiAgICAgICAgY2xvc2VBY2NvdW50OiBjbG9zZVllc0FjY291bnQsXG4gICAgICB9KTtcbiAgICAgIHR4LmFkZCh5ZXNSZWZ1bmRJeCk7XG4gICAgfVxuICAgIFxuICAgIC8vIEFkZCBObyByZWZ1bmQgaW5zdHJ1Y3Rpb24gaWYgdXNlciBoYXMgTm8gdG9rZW5zXG4gICAgaWYgKGhhc05vVG9rZW5zKSB7XG4gICAgICBjb25zdCBub1JlZnVuZEl4ID0gYXdhaXQgdGhpcy5yZWZ1bmQoe1xuICAgICAgICB1c2VyLFxuICAgICAgICBtYXJrZXQsXG4gICAgICAgIGJldHRpbmdUb2tlbixcbiAgICAgICAgb3V0Y29tZTogXCJOb1wiLFxuICAgICAgICB0b2tlbkFtb3VudDogMCxcbiAgICAgICAgY2xvc2VBY2NvdW50OiBjbG9zZU5vQWNjb3VudCxcbiAgICAgIH0pO1xuICAgICAgdHguYWRkKG5vUmVmdW5kSXgpO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gdHg7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIG1hcmtldCAoQWRtaW4gb25seSlcbiAgICovXG4gIGFzeW5jIHJlc29sdmVNYXJrZXRCeUlEKFxuICAgIGFkbWluOiBQdWJsaWNLZXksXG4gICAgbWFya2V0SWQ6IG51bWJlciB8IEJOLFxuICAgIHdpbm5pbmdPdXRjb21lOiBcIlllc1wiIHwgXCJOb1wiIHwgbnVsbCxcbiAgICBmZWVSZWNpcGllbnQ/OiBQdWJsaWNLZXlcbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluc3RydWN0aW9uPiB7XG4gICAgY29uc3QgbWFya2V0SWRCbiA9IG5ldyBCTihtYXJrZXRJZCk7XG4gICAgY29uc3QgbWFya2V0UGRhID0gZ2V0TWFya2V0UGRhKHRoaXMucHJvZ3JhbS5wcm9ncmFtSWQsIGFkbWluLCBtYXJrZXRJZEJuKTtcbiAgICBjb25zdCBnbG9iYWxDb25maWcgPSBnZXRHbG9iYWxDb25maWdQZGEodGhpcy5wcm9ncmFtLnByb2dyYW1JZCk7XG5cbiAgICBsZXQgb3V0Y29tZUVudW06IGFueSA9IG51bGw7XG4gICAgaWYgKHdpbm5pbmdPdXRjb21lID09PSBcIlllc1wiKSB7XG4gICAgICBvdXRjb21lRW51bSA9IHsgeWVzOiB7fSB9O1xuICAgIH0gZWxzZSBpZiAod2lubmluZ091dGNvbWUgPT09IFwiTm9cIikge1xuICAgICAgb3V0Y29tZUVudW0gPSB7IG5vOiB7fSB9O1xuICAgIH1cblxuICAgIC8vIEdldCBtYXJrZXQgaW5mbyB0byBkZXRlcm1pbmUgYmV0dGluZyB0b2tlblxuICAgIGNvbnN0IG1hcmtldEluZm8gPSBhd2FpdCB0aGlzLmdldE1hcmtldEluZm8obWFya2V0UGRhKTtcbiAgICAvLyBmZWUgcmVjaXBpZW50IGFkZHJlc3NcbiAgICBjb25zdCBmZWVSZWNpcGllbnRBZGRyZXNzID0gZmVlUmVjaXBpZW50IHx8IChhd2FpdCB0aGlzLmdldEdsb2JhbENvbmZpZ0FjY291bnQoKSkuZmVlUmVjaXBpZW50O1xuICAgIC8vIGZlZSByZWNpcGllbnQgdG9rZW4gYWNjb3VudCAoYWxsb3dPd25lck9mZkN1cnZlIGZvciBtdWx0aXNpZy9QREEpXG4gICAgY29uc3QgZmVlUmVjaXBpZW50VG9rZW4gPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhtYXJrZXRJbmZvLmJldHRpbmdUb2tlbiwgZmVlUmVjaXBpZW50QWRkcmVzcywgdHJ1ZSk7XG5cbiAgICAvLyBEZXJpdmUgdmF1bHQgUERBXG4gICAgY29uc3QgdmF1bHQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShWQVVMVF9TRUVEKSwgbWFya2V0UGRhLnRvQnVmZmVyKCldLFxuICAgICAgdGhpcy5wcm9ncmFtLnByb2dyYW1JZFxuICAgIClbMF07XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLm1ldGhvZHNcbiAgICAgIC5yZXNvbHZlTWFya2V0KG91dGNvbWVFbnVtKVxuICAgICAgLmFjY291bnRzUGFydGlhbCh7XG4gICAgICAgIGdsb2JhbENvbmZpZyxcbiAgICAgICAgbWFya2V0OiBtYXJrZXRQZGEsXG4gICAgICAgIHZhdWx0LFxuICAgICAgICBmZWVSZWNpcGllbnQ6IGZlZVJlY2lwaWVudFRva2VuLFxuICAgICAgICBhZG1pbixcbiAgICAgICAgdG9rZW5Qcm9ncmFtOiBUT0tFTl9QUk9HUkFNX0lELFxuICAgICAgfSlcbiAgICAgIC5pbnN0cnVjdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgY29tcGxldGUgdHJhbnNhY3Rpb24gdG8gcmVzb2x2ZSBhIG1hcmtldFxuICAgKi9cbiAgYXN5bmMgYnVpbGRSZXNvbHZlTWFya2V0VHhCeUlEKFxuICAgIGFkbWluOiBQdWJsaWNLZXksXG4gICAgbWFya2V0SWQ6IG51bWJlciB8IEJOLFxuICAgIHdpbm5pbmdPdXRjb21lOiBcIlllc1wiIHwgXCJOb1wiIHwgbnVsbCxcbiAgICBmZWVSZWNpcGllbnQ/OiBQdWJsaWNLZXlcbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IG1hcmtldElkQm4gPSBuZXcgQk4obWFya2V0SWQpO1xuICAgIGNvbnN0IG1hcmtldFBkYSA9IGdldE1hcmtldFBkYSh0aGlzLnByb2dyYW0ucHJvZ3JhbUlkLCBhZG1pbiwgbWFya2V0SWRCbik7XG4gICAgY29uc3QgbWFya2V0SW5mbyA9IGF3YWl0IHRoaXMuZ2V0TWFya2V0SW5mbyhtYXJrZXRQZGEpO1xuICAgIGNvbnN0IGdsb2JhbENvbmZpZ0FjY291bnQgPSBhd2FpdCB0aGlzLmdldEdsb2JhbENvbmZpZ0FjY291bnQoKTtcbiAgICBjb25zdCBmZWVSZWNpcGllbnRBZGRyZXNzID0gZmVlUmVjaXBpZW50IHx8IGdsb2JhbENvbmZpZ0FjY291bnQuZmVlUmVjaXBpZW50O1xuICAgIC8vIGFsbG93T3duZXJPZmZDdXJ2ZSBmb3IgbXVsdGlzaWcvUERBIGZlZSByZWNpcGllbnRzXG4gICAgY29uc3QgZmVlUmVjaXBpZW50VG9rZW4gPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhtYXJrZXRJbmZvLmJldHRpbmdUb2tlbiwgZmVlUmVjaXBpZW50QWRkcmVzcywgdHJ1ZSk7XG5cbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbigpO1xuXG4gICAgLy8gQ2hlY2sgaWYgZmVlIHJlY2lwaWVudCB0b2tlbiBhY2NvdW50IGV4aXN0cyBhbmQgY3JlYXRlIGlmIG5lZWRlZFxuICAgIGNvbnN0IGZlZVJlY2lwaWVudEF0YUV4aXN0cyA9IGF3YWl0IHRoaXMuYXRhRXhpc3RzKGZlZVJlY2lwaWVudFRva2VuKTtcbiAgICBpZiAoIWZlZVJlY2lwaWVudEF0YUV4aXN0cykge1xuICAgICAgY29uc3QgY3JlYXRlRmVlUmVjaXBpZW50QXRhSXggPSB0aGlzLmNyZWF0ZUF0YUluc3RydWN0aW9uKGFkbWluLCBmZWVSZWNpcGllbnRBZGRyZXNzLCBtYXJrZXRJbmZvLmJldHRpbmdUb2tlbik7XG4gICAgICB0eC5hZGQoY3JlYXRlRmVlUmVjaXBpZW50QXRhSXgpO1xuICAgIH1cblxuICAgIC8vIEFkZCByZXNvbHZlIG1hcmtldCBpbnN0cnVjdGlvblxuICAgIGNvbnN0IHJlc29sdmVNYXJrZXRJeCA9IGF3YWl0IHRoaXMucmVzb2x2ZU1hcmtldEJ5SUQoYWRtaW4sIG1hcmtldElkLCB3aW5uaW5nT3V0Y29tZSwgZmVlUmVjaXBpZW50KTtcbiAgICB0eC5hZGQocmVzb2x2ZU1hcmtldEl4KTtcblxuICAgIHJldHVybiB0eDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGEgbWFya2V0IChBZG1pbiBvbmx5KVxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZU1hcmtldChcbiAgICBhZG1pbjogUHVibGljS2V5LFxuICAgIG1hcmtldDogUHVibGljS2V5LFxuICAgIHdpbm5pbmdPdXRjb21lOiBcIlllc1wiIHwgXCJOb1wiIHwgbnVsbCxcbiAgICBmZWVSZWNpcGllbnQ/OiBQdWJsaWNLZXlcbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluc3RydWN0aW9uPiB7XG4gICAgY29uc3QgZ2xvYmFsQ29uZmlnID0gZ2V0R2xvYmFsQ29uZmlnUGRhKHRoaXMucHJvZ3JhbS5wcm9ncmFtSWQpO1xuXG4gICAgbGV0IG91dGNvbWVFbnVtOiBhbnkgPSBudWxsO1xuICAgIGlmICh3aW5uaW5nT3V0Y29tZSA9PT0gXCJZZXNcIikge1xuICAgICAgb3V0Y29tZUVudW0gPSB7IHllczoge30gfTtcbiAgICB9IGVsc2UgaWYgKHdpbm5pbmdPdXRjb21lID09PSBcIk5vXCIpIHtcbiAgICAgIG91dGNvbWVFbnVtID0geyBubzoge30gfTtcbiAgICB9XG5cbiAgICAvLyBHZXQgbWFya2V0IGluZm8gdG8gZGV0ZXJtaW5lIGJldHRpbmcgdG9rZW5cbiAgICBjb25zdCBtYXJrZXRJbmZvID0gYXdhaXQgdGhpcy5nZXRNYXJrZXRJbmZvKG1hcmtldCk7XG4gICAgY29uc3QgZmVlUmVjaXBpZW50QWRkcmVzcyA9IGZlZVJlY2lwaWVudCB8fCAoYXdhaXQgdGhpcy5nZXRHbG9iYWxDb25maWdBY2NvdW50KCkpLmZlZVJlY2lwaWVudDtcbiAgICAvLyBhbGxvd093bmVyT2ZmQ3VydmUgZm9yIG11bHRpc2lnL1BEQSBmZWUgcmVjaXBpZW50c1xuICAgIGNvbnN0IGZlZVJlY2lwaWVudFRva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMobWFya2V0SW5mby5iZXR0aW5nVG9rZW4sIGZlZVJlY2lwaWVudEFkZHJlc3MsIHRydWUpO1xuXG4gICAgLy8gRGVyaXZlIHZhdWx0IFBEQVxuICAgIGNvbnN0IHZhdWx0ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oVkFVTFRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvZ3JhbS5tZXRob2RzXG4gICAgICAucmVzb2x2ZU1hcmtldChvdXRjb21lRW51bSlcbiAgICAgIC5hY2NvdW50c1BhcnRpYWwoe1xuICAgICAgICBnbG9iYWxDb25maWcsXG4gICAgICAgIG1hcmtldDogbWFya2V0LFxuICAgICAgICB2YXVsdCxcbiAgICAgICAgZmVlUmVjaXBpZW50OiBmZWVSZWNpcGllbnRUb2tlbixcbiAgICAgICAgYWRtaW4sXG4gICAgICAgIHRva2VuUHJvZ3JhbTogVE9LRU5fUFJPR1JBTV9JRCxcbiAgICAgIH0pXG4gICAgICAuaW5zdHJ1Y3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNvbXBsZXRlIHRyYW5zYWN0aW9uIHRvIHJlc29sdmUgYSBtYXJrZXRcbiAgICovXG4gIGFzeW5jIGJ1aWxkUmVzb2x2ZU1hcmtldFR4KFxuICAgIGFkbWluOiBQdWJsaWNLZXksXG4gICAgbWFya2V0OiBQdWJsaWNLZXksXG4gICAgd2lubmluZ091dGNvbWU6IFwiWWVzXCIgfCBcIk5vXCIgfCBudWxsLFxuICAgIGZlZVJlY2lwaWVudD86IFB1YmxpY0tleVxuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgbWFya2V0SW5mbyA9IGF3YWl0IHRoaXMuZ2V0TWFya2V0SW5mbyhtYXJrZXQpO1xuICAgIGNvbnN0IGdsb2JhbENvbmZpZ0FjY291bnQgPSBhd2FpdCB0aGlzLmdldEdsb2JhbENvbmZpZ0FjY291bnQoKTtcbiAgICBjb25zdCBmZWVSZWNpcGllbnRBZGRyZXNzID0gZmVlUmVjaXBpZW50IHx8IGdsb2JhbENvbmZpZ0FjY291bnQuZmVlUmVjaXBpZW50O1xuICAgIC8vIGFsbG93T3duZXJPZmZDdXJ2ZSBmb3IgbXVsdGlzaWcvUERBIGZlZSByZWNpcGllbnRzXG4gICAgY29uc3QgZmVlUmVjaXBpZW50VG9rZW4gPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhtYXJrZXRJbmZvLmJldHRpbmdUb2tlbiwgZmVlUmVjaXBpZW50QWRkcmVzcywgdHJ1ZSk7XG5cbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbigpO1xuXG4gICAgLy8gQ2hlY2sgaWYgZmVlIHJlY2lwaWVudCB0b2tlbiBhY2NvdW50IGV4aXN0cyBhbmQgY3JlYXRlIGlmIG5lZWRlZFxuICAgIGNvbnN0IGZlZVJlY2lwaWVudEF0YUV4aXN0cyA9IGF3YWl0IHRoaXMuYXRhRXhpc3RzKGZlZVJlY2lwaWVudFRva2VuKTtcbiAgICBpZiAoIWZlZVJlY2lwaWVudEF0YUV4aXN0cykge1xuICAgICAgY29uc3QgY3JlYXRlRmVlUmVjaXBpZW50QXRhSXggPSB0aGlzLmNyZWF0ZUF0YUluc3RydWN0aW9uKGFkbWluLCBmZWVSZWNpcGllbnRBZGRyZXNzLCBtYXJrZXRJbmZvLmJldHRpbmdUb2tlbik7XG4gICAgICB0eC5hZGQoY3JlYXRlRmVlUmVjaXBpZW50QXRhSXgpO1xuICAgIH1cblxuICAgIC8vIEFkZCByZXNvbHZlIG1hcmtldCBpbnN0cnVjdGlvblxuICAgIGNvbnN0IHJlc29sdmVNYXJrZXRJeCA9IGF3YWl0IHRoaXMucmVzb2x2ZU1hcmtldChhZG1pbiwgbWFya2V0LCB3aW5uaW5nT3V0Y29tZSwgZmVlUmVjaXBpZW50KTtcbiAgICB0eC5hZGQocmVzb2x2ZU1hcmtldEl4KTtcblxuICAgIHJldHVybiB0eDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSBhIG1hcmtldCAoQWRtaW4gb25seSlcbiAgICovXG4gIGFzeW5jIGNsb3NlTWFya2V0KFxuICAgIGFkbWluOiBQdWJsaWNLZXksXG4gICAgbWFya2V0OiBQdWJsaWNLZXlcbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluc3RydWN0aW9uPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvZ3JhbS5tZXRob2RzXG4gICAgICAuY2xvc2VNYXJrZXQoKVxuICAgICAgLmFjY291bnRzUGFydGlhbCh7XG4gICAgICAgIG1hcmtldDogbWFya2V0LFxuICAgICAgICBhZG1pbjogYWRtaW4sXG4gICAgICB9KVxuICAgICAgLmluc3RydWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBjb21wbGV0ZSB0cmFuc2FjdGlvbiB0byBjbG9zZSBhIG1hcmtldFxuICAgKi9cbiAgYXN5bmMgYnVpbGRDbG9zZU1hcmtldFR4KFxuICAgIGFkbWluOiBQdWJsaWNLZXksXG4gICAgbWFya2V0OiBQdWJsaWNLZXlcbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IGl4ID0gYXdhaXQgdGhpcy5jbG9zZU1hcmtldChhZG1pbiwgbWFya2V0KTtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKGl4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSBhIG1hcmtldCAoQWRtaW4gb25seSlcbiAgICovXG4gIGFzeW5jIGNsb3NlTWFya2V0QnlJRChcbiAgICBhZG1pbjogUHVibGljS2V5LFxuICAgIG1hcmtldElkOiBudW1iZXIgfCBCTlxuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24+IHtcbiAgICBjb25zdCBtYXJrZXRJZEJuID0gbmV3IEJOKG1hcmtldElkKTtcbiAgICBjb25zdCBtYXJrZXRQZGEgPSBnZXRNYXJrZXRQZGEodGhpcy5wcm9ncmFtLnByb2dyYW1JZCwgYWRtaW4sIG1hcmtldElkQm4pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvZ3JhbS5tZXRob2RzXG4gICAgICAuY2xvc2VNYXJrZXQoKVxuICAgICAgLmFjY291bnRzUGFydGlhbCh7XG4gICAgICAgIG1hcmtldDogbWFya2V0UGRhLFxuICAgICAgICBhZG1pbjogYWRtaW4sXG4gICAgICB9KVxuICAgICAgLmluc3RydWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBjb21wbGV0ZSB0cmFuc2FjdGlvbiB0byBjbG9zZSBhIG1hcmtldFxuICAgKi9cbiAgYXN5bmMgYnVpbGRDbG9zZU1hcmtldFR4QnlJRChcbiAgICBhZG1pbjogUHVibGljS2V5LFxuICAgIG1hcmtldElkOiBudW1iZXIgfCBCTlxuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgaXggPSBhd2FpdCB0aGlzLmNsb3NlTWFya2V0QnlJRChhZG1pbiwgbWFya2V0SWQpO1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb24oKS5hZGQoaXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIG1hcmtldCBhY2NvdW50IGFuZCByZWNsYWltIHJlbnQgKEFkbWluIG9ubHkpXG4gICAqIENhbiBvbmx5IGJlIGNhbGxlZCBhZnRlciBtYXJrZXQgaXMgcmVzb2x2ZWQgYW5kIGFsbCByZXdhcmRzIGNsYWltZWRcbiAgICovXG4gIGFzeW5jIGNsb3NlTWFya2V0QWNjb3VudChcbiAgICBhZG1pbjogUHVibGljS2V5LFxuICAgIG1hcmtldDogUHVibGljS2V5XG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb25JbnN0cnVjdGlvbj4ge1xuICAgIC8vIERlcml2ZSBQREFzXG4gICAgY29uc3QgeWVzTWludCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKFlFU19NSU5UX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcbiAgICBjb25zdCBub01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShOT19NSU5UX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcbiAgICBjb25zdCB2YXVsdCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKFZBVUxUX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb2dyYW0ubWV0aG9kc1xuICAgICAgLmNsb3NlTWFya2V0QWNjb3VudCgpXG4gICAgICAuYWNjb3VudHNQYXJ0aWFsKHtcbiAgICAgICAgbWFya2V0LFxuICAgICAgICB5ZXNNaW50LFxuICAgICAgICBub01pbnQsXG4gICAgICAgIHZhdWx0LFxuICAgICAgICBhZG1pbixcbiAgICAgICAgdG9rZW5Qcm9ncmFtOiBUT0tFTl9QUk9HUkFNX0lELFxuICAgICAgICB0b2tlbjIwMjJQcm9ncmFtOiBUT0tFTl8yMDIyX1BST0dSQU1fSUQsXG4gICAgICB9KVxuICAgICAgLmluc3RydWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBjb21wbGV0ZSB0cmFuc2FjdGlvbiB0byBjbG9zZSBtYXJrZXQgYWNjb3VudFxuICAgKi9cbiAgYXN5bmMgYnVpbGRDbG9zZU1hcmtldEFjY291bnRUeChcbiAgICBhZG1pbjogUHVibGljS2V5LFxuICAgIG1hcmtldDogUHVibGljS2V5XG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBpeCA9IGF3YWl0IHRoaXMuY2xvc2VNYXJrZXRBY2NvdW50KGFkbWluLCBtYXJrZXQpO1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb24oKS5hZGQoaXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1cm4gd29ydGhsZXNzIHRva2VucyBmcm9tIHRoZSBsb3Npbmcgc2lkZSBvZiBhIHJlc29sdmVkIG1hcmtldC5cbiAgICogVGhpcyBhbGxvd3MgdXNlcnMgdG8gY2xlYW4gdXAgdGhlaXIgbG9zaW5nIHRva2VucyBzbyB0aGUgbWFya2V0IGFjY291bnQgY2FuIGJlIGNsb3NlZC5cbiAgICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlciB3aG8gaG9sZHMgbG9zaW5nIHRva2Vuc1xuICAgKiBAcGFyYW0gbWFya2V0IC0gVGhlIG1hcmtldCBQREFcbiAgICogQHBhcmFtIGxvc2luZ091dGNvbWUgLSBUaGUgb3V0Y29tZSB0aGF0IGxvc3QgKHRoZSBzaWRlIHRvIGJ1cm4pXG4gICAqIEBwYXJhbSB0b2tlbkFtb3VudCAtIEFtb3VudCB0byBidXJuICgwID0gYnVybiBhbGwpXG4gICAqIEBwYXJhbSBjbG9zZUFjY291bnQgLSBXaGV0aGVyIHRvIGNsb3NlIHRoZSBsb3NpbmcgdG9rZW4gYWNjb3VudCBhZnRlciBidXJuaW5nIGFsbCB0b2tlbnMgKGRlZmF1bHQ6IGZhbHNlKVxuICAgKi9cbiAgYXN5bmMgYnVybk1hcmtldFRva2VucyhcbiAgICB1c2VyOiBQdWJsaWNLZXksXG4gICAgbWFya2V0OiBQdWJsaWNLZXksXG4gICAgbG9zaW5nT3V0Y29tZTogT3V0Y29tZSxcbiAgICB0b2tlbkFtb3VudDogbnVtYmVyIHwgQk4gPSAwLFxuICAgIGNsb3NlQWNjb3VudDogYm9vbGVhbiA9IGZhbHNlXG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb25JbnN0cnVjdGlvbj4ge1xuICAgIC8vIERlcml2ZSBQREFzXG4gICAgY29uc3QgeWVzTWludCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKFlFU19NSU5UX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcbiAgICBjb25zdCBub01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShOT19NSU5UX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcblxuICAgIC8vIFRoZSBsb3NpbmcgbWludCBpcyB0aGUgc2lkZSB0aGF0IGxvc3RcbiAgICBjb25zdCBsb3NpbmdNaW50ID0gbG9zaW5nT3V0Y29tZSA9PT0gXCJZZXNcIiA/IHllc01pbnQgOiBub01pbnQ7XG4gICAgY29uc3QgdXNlckxvc2luZ1Rva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMobG9zaW5nTWludCwgdXNlciwgZmFsc2UsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLm1ldGhvZHNcbiAgICAgIC5idXJuTWFya2V0VG9rZW5zKHtcbiAgICAgICAgdG9rZW5BbW91bnQ6IG5ldyBCTih0b2tlbkFtb3VudCksXG4gICAgICAgIGNsb3NlQWNjb3VudCxcbiAgICAgIH0pXG4gICAgICAuYWNjb3VudHNQYXJ0aWFsKHtcbiAgICAgICAgbWFya2V0LFxuICAgICAgICB5ZXNNaW50LFxuICAgICAgICBub01pbnQsXG4gICAgICAgIGxvc2luZ01pbnQsXG4gICAgICAgIHVzZXJMb3NpbmdUb2tlbixcbiAgICAgICAgdXNlcixcbiAgICAgICAgdG9rZW4yMDIyUHJvZ3JhbTogVE9LRU5fMjAyMl9QUk9HUkFNX0lELFxuICAgICAgfSlcbiAgICAgIC5pbnN0cnVjdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgY29tcGxldGUgdHJhbnNhY3Rpb24gdG8gYnVybiBtYXJrZXQgdG9rZW5zXG4gICAqIEBwYXJhbSBjbG9zZUFjY291bnQgLSBXaGV0aGVyIHRvIGNsb3NlIHRoZSBsb3NpbmcgdG9rZW4gYWNjb3VudCBhZnRlciBidXJuaW5nIGFsbCB0b2tlbnMgKGRlZmF1bHQ6IGZhbHNlKVxuICAgKi9cbiAgYXN5bmMgYnVpbGRCdXJuTWFya2V0VG9rZW5zVHgoXG4gICAgdXNlcjogUHVibGljS2V5LFxuICAgIG1hcmtldDogUHVibGljS2V5LFxuICAgIGxvc2luZ091dGNvbWU6IE91dGNvbWUsXG4gICAgdG9rZW5BbW91bnQ6IG51bWJlciB8IEJOID0gMCxcbiAgICBjbG9zZUFjY291bnQ6IGJvb2xlYW4gPSB0cnVlXG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBpeCA9IGF3YWl0IHRoaXMuYnVybk1hcmtldFRva2Vucyh1c2VyLCBtYXJrZXQsIGxvc2luZ091dGNvbWUsIHRva2VuQW1vdW50LCBjbG9zZUFjY291bnQpO1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb24oKS5hZGQoaXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsYWltIHJld2FyZHMgaWYgd29uLCBvciBidXJuIHRva2VucyBpZiBsb3N0LCB3aXRoIG9wdGlvbmFsIGFjY291bnQgY2xvc3VyZS5cbiAgICogVGhpcyBpbnN0cnVjdGlvbiBjb21iaW5lcyBjbGFpbV9yZXdhcmRzIGFuZCBidXJuX21hcmtldF90b2tlbnMgbG9naWMgaW50byBhIHNpbmdsZSBjYWxsLlxuICAgKiBcbiAgICogQHBhcmFtIHBhcmFtcyAtIENsYWltQnVybk1hcmtldFBhcmFtc1xuICAgKiBAcGFyYW0gdXNlclllc1Rva2VuIC0gVXNlcidzIFlFUyB0b2tlbiBhY2NvdW50IChvcHRpb25hbCwgcGFzcyBudWxsIGlmIHVzZXIgaGFzIG5vIFlFUyB0b2tlbnMpXG4gICAqIEBwYXJhbSB1c2VyTm9Ub2tlbiAtIFVzZXIncyBOTyB0b2tlbiBhY2NvdW50IChvcHRpb25hbCwgcGFzcyBudWxsIGlmIHVzZXIgaGFzIG5vIE5PIHRva2VucylcbiAgICovXG4gIGFzeW5jIGNsYWltQnVybk1hcmtldChcbiAgICBwYXJhbXM6IENsYWltQnVybk1hcmtldFBhcmFtcyxcbiAgICB1c2VyWWVzVG9rZW46IFB1YmxpY0tleSB8IG51bGwsXG4gICAgdXNlck5vVG9rZW46IFB1YmxpY0tleSB8IG51bGxcbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluc3RydWN0aW9uPiB7XG4gICAgY29uc3QgeyB1c2VyLCBtYXJrZXQsIGJldHRpbmdUb2tlbiB9ID0gcGFyYW1zO1xuXG4gICAgLy8gRGVyaXZlIFBEQXNcbiAgICBjb25zdCB5ZXNNaW50ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oWUVTX01JTlRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuICAgIGNvbnN0IG5vTWludCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKE5PX01JTlRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuICAgIGNvbnN0IHZhdWx0ID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oVkFVTFRfU0VFRCksIG1hcmtldC50b0J1ZmZlcigpXSxcbiAgICAgIHRoaXMucHJvZ3JhbS5wcm9ncmFtSWRcbiAgICApWzBdO1xuXG4gICAgY29uc3QgdXNlckJldHRpbmdUb2tlbiA9IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3NTeW5jKGJldHRpbmdUb2tlbiwgdXNlcik7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLm1ldGhvZHNcbiAgICAgIC5jbGFpbUJ1cm5NYXJrZXQoKVxuICAgICAgLmFjY291bnRzUGFydGlhbCh7XG4gICAgICAgIG1hcmtldCxcbiAgICAgICAgeWVzTWludCxcbiAgICAgICAgbm9NaW50LFxuICAgICAgICB2YXVsdCxcbiAgICAgICAgdXNlclllc1Rva2VuOiB1c2VyWWVzVG9rZW4sXG4gICAgICAgIHVzZXJOb1Rva2VuOiB1c2VyTm9Ub2tlbixcbiAgICAgICAgdXNlckJldHRpbmdUb2tlbixcbiAgICAgICAgdXNlcixcbiAgICAgICAgdG9rZW5Qcm9ncmFtOiBUT0tFTl9QUk9HUkFNX0lELFxuICAgICAgICB0b2tlbjIwMjJQcm9ncmFtOiBUT0tFTl8yMDIyX1BST0dSQU1fSUQsXG4gICAgICB9KVxuICAgICAgLmluc3RydWN0aW9uKCk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNvbXBsZXRlIHRyYW5zYWN0aW9uIHRvIGNsYWltIHJld2FyZHMgKGlmIHdvbikgb3IgYnVybiB0b2tlbnMgKGlmIGxvc3QpXG4gICAqIEF1dG9tYXRpY2FsbHkgY3JlYXRlcyB1c2VyIG91dGNvbWUgdG9rZW4gYWNjb3VudHMgYmFzZWQgb24gdXNlcidzIGhvbGRpbmdzXG4gICAqL1xuICBhc3luYyBidWlsZENsYWltQnVybk1hcmtldFR4KHBhcmFtczogQ2xhaW1CdXJuTWFya2V0UGFyYW1zKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHsgdXNlciwgbWFya2V0IH0gPSBwYXJhbXM7XG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oKTtcblxuICAgIC8vIERlcml2ZSBQREFzXG4gICAgY29uc3QgeWVzTWludCA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFxuICAgICAgW0J1ZmZlci5mcm9tKFlFU19NSU5UX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcbiAgICBjb25zdCBub01pbnQgPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShOT19NSU5UX1NFRUQpLCBtYXJrZXQudG9CdWZmZXIoKV0sXG4gICAgICB0aGlzLnByb2dyYW0ucHJvZ3JhbUlkXG4gICAgKVswXTtcblxuICAgIC8vIEdldCB1c2VyIHRva2VuIGFjY291bnRzXG4gICAgY29uc3QgdXNlclllc1Rva2VuID0gZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzc1N5bmMoeWVzTWludCwgdXNlciwgZmFsc2UsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG4gICAgY29uc3QgdXNlck5vVG9rZW4gPSBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzU3luYyhub01pbnQsIHVzZXIsIGZhbHNlLCBUT0tFTl8yMDIyX1BST0dSQU1fSUQpO1xuXG4gICAgLy8gQ2hlY2sgd2hpY2ggYWNjb3VudHMgZXhpc3QgYW5kIGhhdmUgdG9rZW5zXG4gICAgbGV0IGhhc1llc1Rva2VucyA9IGZhbHNlO1xuICAgIGxldCBoYXNOb1Rva2VucyA9IGZhbHNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHllc0FjY291bnQgPSBhd2FpdCBnZXRBY2NvdW50KHRoaXMuY29ubmVjdGlvbiwgdXNlclllc1Rva2VuLCB1bmRlZmluZWQsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG4gICAgICBoYXNZZXNUb2tlbnMgPSB5ZXNBY2NvdW50LmFtb3VudCA+IDBuO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQWNjb3VudCBkb2Vzbid0IGV4aXN0XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG5vQWNjb3VudCA9IGF3YWl0IGdldEFjY291bnQodGhpcy5jb25uZWN0aW9uLCB1c2VyTm9Ub2tlbiwgdW5kZWZpbmVkLCBUT0tFTl8yMDIyX1BST0dSQU1fSUQpO1xuICAgICAgaGFzTm9Ub2tlbnMgPSBub0FjY291bnQuYW1vdW50ID4gMG47XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBBY2NvdW50IGRvZXNuJ3QgZXhpc3RcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBpbnN0cnVjdGlvbiB3aXRoIGFwcHJvcHJpYXRlIGFjY291bnRzXG4gICAgY29uc3QgaXggPSBhd2FpdCB0aGlzLmNsYWltQnVybk1hcmtldChcbiAgICAgIHBhcmFtcyxcbiAgICAgIGhhc1llc1Rva2VucyA/IHVzZXJZZXNUb2tlbiA6IG51bGwsXG4gICAgICBoYXNOb1Rva2VucyA/IHVzZXJOb1Rva2VuIDogbnVsbFxuICAgICk7XG4gICAgdHguYWRkKGl4KTtcblxuICAgIHJldHVybiB0eDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEZldGNoIGdsb2JhbCBjb25maWcgYWNjb3VudCBkYXRhXG4gICAqL1xuICBhc3luYyBnZXRHbG9iYWxDb25maWdBY2NvdW50KCkge1xuICAgIGNvbnN0IGdsb2JhbENvbmZpZyA9IGdldEdsb2JhbENvbmZpZ1BkYSh0aGlzLnByb2dyYW0ucHJvZ3JhbUlkKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLmFjY291bnQuZ2xvYmFsQ29uZmlnLmZldGNoKGdsb2JhbENvbmZpZyk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBGZXRjaCBtYXJrZXQgYWNjb3VudCBkYXRhXG4gICAqL1xuICBhc3luYyBnZXRNYXJrZXRBY2NvdW50KGFkbWluOiBQdWJsaWNLZXksIG1hcmtldElkOiBudW1iZXIgfCBCTikge1xuICAgIGNvbnN0IG1hcmtldElkQm4gPSBuZXcgQk4obWFya2V0SWQpO1xuICAgIGNvbnN0IG1hcmtldFBkYSA9IGdldE1hcmtldFBkYSh0aGlzLnByb2dyYW0ucHJvZ3JhbUlkLCBhZG1pbiwgbWFya2V0SWRCbik7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvZ3JhbS5hY2NvdW50Lm1hcmtldC5mZXRjaChtYXJrZXRQZGEpO1xuICB9XG5cbiAgYXN5bmMgZ2V0TWFya2V0SW5mbyhtYXJrZXRQZGE6IFB1YmxpY0tleSkge1xuICAgIGNvbnN0IG1hcmtldEFjY291bnQgPSBhd2FpdCB0aGlzLnByb2dyYW0uYWNjb3VudC5tYXJrZXQuZmV0Y2gobWFya2V0UGRhKTtcbiAgICByZXR1cm4gbWFya2V0QWNjb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCB2YXVsdCBhY2NvdW50IGRhdGFcbiAgICovXG4gIGFzeW5jIGdldFZhdWx0QWNjb3VudChtYXJrZXRQZGE6IFB1YmxpY0tleSkge1xuICAgIGNvbnN0IHZhdWx0UGRhID0gZ2V0VmF1bHRQZGEodGhpcy5wcm9ncmFtLnByb2dyYW1JZCwgbWFya2V0UGRhKTtcbiAgICByZXR1cm4gYXdhaXQgZ2V0QWNjb3VudCh0aGlzLmNvbm5lY3Rpb24sIHZhdWx0UGRhKTtcbiAgfVxufVxuIl19
|