@rljson/io 0.0.61 → 0.0.62

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/index.d.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  export * from './io-db-name-mapping.ts';
2
2
  export * from './io-mem.ts';
3
+ export * from './io-multi.ts';
4
+ export * from './io-peer.ts';
3
5
  export * from './io-test-setup.ts';
4
6
  export * from './io-tools.ts';
5
7
  export * from './io.ts';
@@ -0,0 +1,116 @@
1
+ import { JsonValue } from '@rljson/json';
2
+ import { ContentType, Rljson, TableCfg, TableKey } from '@rljson/rljson';
3
+ import { Io } from './io.ts';
4
+ /**
5
+ * Type representing an Io instance along with its capabilities and priority.
6
+ */
7
+ export type IoMultiIo = {
8
+ io: Io;
9
+ priority: number;
10
+ read: boolean;
11
+ write: boolean;
12
+ dump: boolean;
13
+ };
14
+ /**
15
+ * Multi Io implementation that combines multiple underlying Io instances
16
+ * with different capabilities (read, write, dump) and priorities.
17
+ */
18
+ export declare class IoMulti implements Io {
19
+ private _ios;
20
+ isOpen: boolean;
21
+ constructor(_ios: Array<IoMultiIo>);
22
+ /**
23
+ *
24
+ * Initializes all underlying Io instances.
25
+ * @returns
26
+ */
27
+ init(): Promise<void>;
28
+ /**
29
+ * Closes all underlying Io instances.
30
+ * @returns
31
+ */
32
+ close(): Promise<void>;
33
+ /**
34
+ * Returns a promise that resolves once all underlying Io instances are ready.
35
+ * @returns
36
+ */
37
+ isReady(): Promise<void>;
38
+ /**
39
+ * Dumps the entire database content by merging dumps from all dumpable underlying Io instances.
40
+ * @returns
41
+ */
42
+ dump(): Promise<Rljson>;
43
+ /**
44
+ * Dumps a specific table by merging dumps from all dumpable underlying Io instances that contain the table.
45
+ * @param request An object containing the table name to dump.
46
+ * @returns A promise that resolves to the dumped table data.
47
+ */
48
+ dumpTable(request: {
49
+ table: string;
50
+ }): Promise<Rljson>;
51
+ /**
52
+ * Retrieves the content type of a specific table from the first underlying readable Io instance that contains the table.
53
+ * @param request An object containing the table name.
54
+ * @returns A promise that resolves to the content type of the table.
55
+ */
56
+ contentType(request: {
57
+ table: string;
58
+ }): Promise<ContentType>;
59
+ /**
60
+ * Checks if a specific table exists in any of the underlying readable Io instances.
61
+ * @param tableKey The key of the table to check.
62
+ * @returns A promise that resolves to true if the table exists in any readable Io, false otherwise.
63
+ */
64
+ tableExists(tableKey: TableKey): Promise<boolean>;
65
+ /**
66
+ * Creates or extends a table in all underlying writable Io instances.
67
+ * @param request An object containing the table configuration.
68
+ * @returns A promise that resolves once the table has been created or extended in all writable Io instances.
69
+ */
70
+ createOrExtendTable(request: {
71
+ tableCfg: TableCfg;
72
+ }): Promise<void>;
73
+ /**
74
+ * Retrieves the raw table configurations from the highest priority underlying readable Io instance.
75
+ * @returns A promise that resolves to an array of table configurations.
76
+ */
77
+ rawTableCfgs(): Promise<TableCfg[]>;
78
+ /**
79
+ * Writes data to all underlying writable Io instances.
80
+ * @param request - An object containing the data to write.
81
+ * @returns A promise that resolves once the data has been written to all writable Io instances.
82
+ */
83
+ write(request: {
84
+ data: Rljson;
85
+ }): Promise<void>;
86
+ /**
87
+ * Reads rows from the first underlying readable Io instance that contains the requested table and has matching rows.
88
+ * @param request An object containing the table name and where clause.
89
+ * @returns A promise that resolves to the read rows.
90
+ */
91
+ readRows(request: {
92
+ table: string;
93
+ where: {
94
+ [column: string]: JsonValue | null;
95
+ };
96
+ }): Promise<Rljson>;
97
+ /**
98
+ * Retrieves the row count of a specific table by aggregating row counts from all dumpable underlying Io instances.
99
+ * @param table The name of the table.
100
+ * @returns A promise that resolves to the row count of the table.
101
+ */
102
+ rowCount(table: string): Promise<number>;
103
+ /**
104
+ * Gets the list of underlying readable Io instances, sorted by priority.
105
+ */
106
+ get readables(): Array<Io>;
107
+ /**
108
+ * Gets the list of underlying writable Io instances, sorted by priority.
109
+ */
110
+ get writables(): Array<Io>;
111
+ /**
112
+ * Gets the list of underlying dumpable Io instances, sorted by priority.
113
+ */
114
+ get dumpables(): Array<Io>;
115
+ static example: () => Promise<IoMulti>;
116
+ }
package/dist/io.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { hip, hsh } from "@rljson/hash";
2
2
  import { IsReady } from "@rljson/is-ready";
3
- import { copy, equals } from "@rljson/json";
3
+ import { copy, equals, merge } from "@rljson/json";
4
4
  import { iterateTables, throwOnInvalidTableCfg, validateRljsonAgainstTableCfg, iterateTablesSync } from "@rljson/rljson";
5
5
  class IoDbNameMapping {
6
6
  // The primary key column is always named '_hash'
@@ -600,20 +600,6 @@ class IoMem {
600
600
  });
601
601
  }
602
602
  }
603
- const exampleTestSetup = () => {
604
- return {
605
- io: new IoMem(),
606
- beforeAll: async () => {
607
- },
608
- beforeEach: async () => {
609
- },
610
- afterEach: async () => {
611
- },
612
- afterAll: async () => {
613
- }
614
- };
615
- };
616
- const exampleIo = "Checkout @rljson/io-mem for an example implementation";
617
603
  class PeerSocketMock {
618
604
  constructor(_io) {
619
605
  this._io = _io;
@@ -684,6 +670,442 @@ class PeerSocketMock {
684
670
  return true;
685
671
  }
686
672
  }
673
+ class IoPeer {
674
+ constructor(_socket) {
675
+ this._socket = _socket;
676
+ }
677
+ isOpen = false;
678
+ // ...........................................................................
679
+ /**
680
+ *
681
+ * Initializes the Peer connection.
682
+ * @returns
683
+ */
684
+ async init() {
685
+ this._socket.on("connect", () => {
686
+ this.isOpen = true;
687
+ });
688
+ this._socket.on("disconnect", () => {
689
+ this.isOpen = false;
690
+ });
691
+ this._socket.connect();
692
+ return;
693
+ }
694
+ // ...........................................................................
695
+ /**
696
+ * Closes the Peer connection.
697
+ * @returns
698
+ */
699
+ async close() {
700
+ if (!this._socket.connected) return;
701
+ this._socket.disconnect();
702
+ return;
703
+ }
704
+ // ...........................................................................
705
+ /**
706
+ * Returns a promise that resolves once the Peer connection is ready.
707
+ * @returns
708
+ */
709
+ async isReady() {
710
+ return this._socket.connected ? Promise.resolve() : Promise.reject();
711
+ }
712
+ // ...........................................................................
713
+ /**
714
+ * Dumps the entire database content.
715
+ * @returns A promise that resolves to the dumped database content.
716
+ */
717
+ async dump() {
718
+ return new Promise((resolve) => {
719
+ this._socket.emit("dump", (data) => {
720
+ resolve(data);
721
+ });
722
+ });
723
+ }
724
+ // ...........................................................................
725
+ /**
726
+ * Dumps a specific table from the database.
727
+ * @param request An object containing the table name to dump.
728
+ * @returns A promise that resolves to the dumped table data.
729
+ */
730
+ dumpTable(request) {
731
+ return new Promise((resolve, reject) => {
732
+ this._socket.emit("dumpTable", request, (data, error) => {
733
+ if (error) reject(error);
734
+ resolve(data);
735
+ });
736
+ });
737
+ }
738
+ // ...........................................................................
739
+ /**
740
+ * Gets the content type of a specific table.
741
+ * @param request An object containing the table name to get the content type for.
742
+ * @returns A promise that resolves to the content type of the specified table.
743
+ */
744
+ contentType(request) {
745
+ return new Promise((resolve, reject) => {
746
+ this._socket.emit(
747
+ "contentType",
748
+ request,
749
+ (data, error) => {
750
+ if (error) reject(error);
751
+ resolve(data);
752
+ }
753
+ );
754
+ });
755
+ }
756
+ // ...........................................................................
757
+ /**
758
+ * Checks if a specific table exists in the database.
759
+ * @param tableKey The key of the table to check for existence.
760
+ * @returns A promise that resolves to true if the table exists, false otherwise.
761
+ */
762
+ tableExists(tableKey) {
763
+ return new Promise((resolve) => {
764
+ this._socket.emit("tableExists", tableKey, (exists) => {
765
+ resolve(exists);
766
+ });
767
+ });
768
+ }
769
+ // ...........................................................................
770
+ /**
771
+ * Creates or extends a table with the given configuration.
772
+ * @param request An object containing the table configuration.
773
+ * @returns A promise that resolves once the table is created or extended.
774
+ */
775
+ createOrExtendTable(request) {
776
+ return new Promise((resolve, reject) => {
777
+ this._socket.emit(
778
+ "createOrExtendTable",
779
+ request,
780
+ (_, error) => {
781
+ if (error) reject(error);
782
+ resolve();
783
+ }
784
+ );
785
+ });
786
+ }
787
+ // ...........................................................................
788
+ /**
789
+ * Retrieves the raw table configurations from the database.
790
+ * @returns A promise that resolves to an array of table configurations.
791
+ */
792
+ rawTableCfgs() {
793
+ return new Promise((resolve) => {
794
+ this._socket.emit("rawTableCfgs", (data) => {
795
+ resolve(data);
796
+ });
797
+ });
798
+ }
799
+ // ...........................................................................
800
+ /**
801
+ * Writes data to the database.
802
+ * @param request An object containing the data to write.
803
+ * @returns A promise that resolves once the data is written.
804
+ */
805
+ write(request) {
806
+ return new Promise((resolve, reject) => {
807
+ this._socket.emit("write", request, (_, error) => {
808
+ if (error) reject(error);
809
+ resolve();
810
+ });
811
+ });
812
+ }
813
+ // ...........................................................................
814
+ /**
815
+ * Reads rows from a specific table that match the given criteria.
816
+ * @param request An object containing the table name and the criteria for selecting rows.
817
+ * @returns A promise that resolves to the selected rows.
818
+ */
819
+ readRows(request) {
820
+ return new Promise((resolve, reject) => {
821
+ this._socket.emit(
822
+ "readRows",
823
+ request,
824
+ (result, error) => {
825
+ if (error) reject(error);
826
+ resolve(result);
827
+ }
828
+ );
829
+ });
830
+ }
831
+ // ...........................................................................
832
+ /**
833
+ * Retrieves the number of rows in a specific table.
834
+ * @param table The name of the table to count rows in.
835
+ * @returns A promise that resolves to the number of rows in the specified table.
836
+ */
837
+ rowCount(table) {
838
+ return new Promise((resolve, reject) => {
839
+ this._socket.emit("rowCount", table, (count, error) => {
840
+ if (error) reject(error);
841
+ resolve(count);
842
+ });
843
+ });
844
+ }
845
+ // ...........................................................................
846
+ static example = async () => {
847
+ const ioMem = await IoMem.example();
848
+ const socket = new PeerSocketMock(ioMem);
849
+ const io = new IoPeer(socket);
850
+ await io.init();
851
+ return io;
852
+ };
853
+ }
854
+ class IoMulti {
855
+ constructor(_ios) {
856
+ this._ios = _ios;
857
+ }
858
+ isOpen = false;
859
+ // ...........................................................................
860
+ /**
861
+ *
862
+ * Initializes all underlying Io instances.
863
+ * @returns
864
+ */
865
+ async init() {
866
+ for (const ioMultiIo of this._ios) {
867
+ if (!ioMultiIo.io.isOpen) {
868
+ throw new Error(
869
+ "All underlying Io instances must be initialized before initializing IoMulti"
870
+ );
871
+ }
872
+ }
873
+ this.isOpen = true;
874
+ return Promise.resolve();
875
+ }
876
+ // ...........................................................................
877
+ /**
878
+ * Closes all underlying Io instances.
879
+ * @returns
880
+ */
881
+ async close() {
882
+ await Promise.all(this._ios.map((ioMultiIo) => ioMultiIo.io.close()));
883
+ this.isOpen = false;
884
+ return Promise.resolve();
885
+ }
886
+ // ...........................................................................
887
+ /**
888
+ * Returns a promise that resolves once all underlying Io instances are ready.
889
+ * @returns
890
+ */
891
+ isReady() {
892
+ return Promise.all(
893
+ this._ios.map((ioMultiIo) => ioMultiIo.io.isReady())
894
+ ).then(() => Promise.resolve());
895
+ }
896
+ // ...........................................................................
897
+ /**
898
+ * Dumps the entire database content by merging dumps from all dumpable underlying Io instances.
899
+ * @returns
900
+ */
901
+ async dump() {
902
+ if (this.dumpables.length === 0) {
903
+ return Promise.reject(new Error("No dumpable Io available"));
904
+ }
905
+ const dumps = await Promise.all(
906
+ this.dumpables.map((dumpable) => dumpable.dump())
907
+ );
908
+ return merge(...dumps);
909
+ }
910
+ // ...........................................................................
911
+ /**
912
+ * Dumps a specific table by merging dumps from all dumpable underlying Io instances that contain the table.
913
+ * @param request An object containing the table name to dump.
914
+ * @returns A promise that resolves to the dumped table data.
915
+ */
916
+ async dumpTable(request) {
917
+ if (this.dumpables.length === 0) {
918
+ return Promise.reject(new Error("No dumpable Io available"));
919
+ }
920
+ const dumps = [];
921
+ for (const dumpable of this.dumpables) {
922
+ const tableExists = await dumpable.tableExists(request.table);
923
+ if (tableExists) {
924
+ const dump = await dumpable.dumpTable(request);
925
+ dumps.push(dump);
926
+ }
927
+ }
928
+ if (dumps.length > 0) {
929
+ return merge(...dumps);
930
+ } else {
931
+ return Promise.reject(new Error(`Table "${request.table}" not found`));
932
+ }
933
+ }
934
+ // ...........................................................................
935
+ /**
936
+ * Retrieves the content type of a specific table from the first underlying readable Io instance that contains the table.
937
+ * @param request An object containing the table name.
938
+ * @returns A promise that resolves to the content type of the table.
939
+ */
940
+ async contentType(request) {
941
+ if (this.readables.length === 0) {
942
+ return Promise.reject(new Error("No readable Io available"));
943
+ }
944
+ for (const readable of this.readables) {
945
+ const tableExists = await readable.tableExists(request.table);
946
+ if (tableExists) {
947
+ return readable.contentType(request);
948
+ }
949
+ }
950
+ return Promise.reject(new Error(`Table "${request.table}" not found`));
951
+ }
952
+ // ...........................................................................
953
+ /**
954
+ * Checks if a specific table exists in any of the underlying readable Io instances.
955
+ * @param tableKey The key of the table to check.
956
+ * @returns A promise that resolves to true if the table exists in any readable Io, false otherwise.
957
+ */
958
+ async tableExists(tableKey) {
959
+ if (this.readables.length === 0) {
960
+ return Promise.reject(new Error("No readable Io available"));
961
+ }
962
+ for (const readable of this.readables) {
963
+ const exists = await readable.tableExists(tableKey);
964
+ if (exists) {
965
+ return true;
966
+ }
967
+ }
968
+ return false;
969
+ }
970
+ // ...........................................................................
971
+ /**
972
+ * Creates or extends a table in all underlying writable Io instances.
973
+ * @param request An object containing the table configuration.
974
+ * @returns A promise that resolves once the table has been created or extended in all writable Io instances.
975
+ */
976
+ createOrExtendTable(request) {
977
+ if (this.writables.length === 0) {
978
+ return Promise.reject(new Error("No writable Io available"));
979
+ }
980
+ const creations = this.writables.map(
981
+ (writable) => writable.createOrExtendTable(request)
982
+ );
983
+ return Promise.all(creations).then(() => Promise.resolve());
984
+ }
985
+ // ...........................................................................
986
+ /**
987
+ * Retrieves the raw table configurations from the highest priority underlying readable Io instance.
988
+ * @returns A promise that resolves to an array of table configurations.
989
+ */
990
+ rawTableCfgs() {
991
+ if (this.readables.length === 0) {
992
+ return Promise.reject(new Error("No readable Io available"));
993
+ }
994
+ const readable = this.readables[0];
995
+ return readable.rawTableCfgs();
996
+ }
997
+ // ...........................................................................
998
+ /**
999
+ * Writes data to all underlying writable Io instances.
1000
+ * @param request - An object containing the data to write.
1001
+ * @returns A promise that resolves once the data has been written to all writable Io instances.
1002
+ */
1003
+ write(request) {
1004
+ if (this.writables.length === 0) {
1005
+ return Promise.reject(new Error("No writable Io available"));
1006
+ }
1007
+ const writes = this.writables.map((writable) => writable.write(request));
1008
+ return Promise.all(writes).then(() => Promise.resolve());
1009
+ }
1010
+ // ...........................................................................
1011
+ /**
1012
+ * Reads rows from the first underlying readable Io instance that contains the requested table and has matching rows.
1013
+ * @param request An object containing the table name and where clause.
1014
+ * @returns A promise that resolves to the read rows.
1015
+ */
1016
+ async readRows(request) {
1017
+ if (this.readables.length === 0) {
1018
+ return Promise.reject(new Error("No readable Io available"));
1019
+ }
1020
+ let tableExistsAny = false;
1021
+ const rows = [];
1022
+ for (const readable of this.readables) {
1023
+ const tableExists = await readable.tableExists(request.table);
1024
+ tableExistsAny = tableExistsAny || tableExists;
1025
+ if (tableExists) {
1026
+ const readRows = await readable.readRows(request);
1027
+ const tableData = readRows[request.table];
1028
+ if (tableData) {
1029
+ rows.push(readRows);
1030
+ }
1031
+ }
1032
+ }
1033
+ if (!tableExistsAny) {
1034
+ return Promise.reject(new Error(`Table "${request.table}" not found`));
1035
+ } else {
1036
+ return merge(...rows);
1037
+ }
1038
+ }
1039
+ // ...........................................................................
1040
+ /**
1041
+ * Retrieves the row count of a specific table by aggregating row counts from all dumpable underlying Io instances.
1042
+ * @param table The name of the table.
1043
+ * @returns A promise that resolves to the row count of the table.
1044
+ */
1045
+ async rowCount(table) {
1046
+ if (this.dumpables.length === 0) {
1047
+ return Promise.reject(new Error("No dumpable Io available"));
1048
+ }
1049
+ const dumpTable = await this.dumpTable({ table });
1050
+ const tableData = dumpTable[table];
1051
+ if (!tableData) {
1052
+ return Promise.reject(new Error(`Table "${table}" not found`));
1053
+ }
1054
+ return Promise.resolve(tableData._data.length);
1055
+ }
1056
+ // ...........................................................................
1057
+ /**
1058
+ * Gets the list of underlying readable Io instances, sorted by priority.
1059
+ */
1060
+ get readables() {
1061
+ return this._ios.filter((ioMultiIo) => ioMultiIo.read).sort((a, b) => a.priority - b.priority).map((ioMultiIo) => ioMultiIo.io);
1062
+ }
1063
+ // ...........................................................................
1064
+ /**
1065
+ * Gets the list of underlying writable Io instances, sorted by priority.
1066
+ */
1067
+ get writables() {
1068
+ return this._ios.filter((ioMultiIo) => ioMultiIo.write).sort((a, b) => a.priority - b.priority).map((ioMultiIo) => ioMultiIo.io);
1069
+ }
1070
+ // ...........................................................................
1071
+ /**
1072
+ * Gets the list of underlying dumpable Io instances, sorted by priority.
1073
+ */
1074
+ get dumpables() {
1075
+ return this._ios.filter((ioMultiIo) => ioMultiIo.dump).sort((a, b) => a.priority - b.priority).map((ioMultiIo) => ioMultiIo.io);
1076
+ }
1077
+ // ...........................................................................
1078
+ static example = async () => {
1079
+ const ioPeerMem = await IoMem.example();
1080
+ await ioPeerMem.init();
1081
+ const ioPeerSocket = new PeerSocketMock(ioPeerMem);
1082
+ const ioPeer = new IoPeer(ioPeerSocket);
1083
+ await ioPeer.init();
1084
+ const ioMem = await IoMem.example();
1085
+ await ioMem.init();
1086
+ const ios = [
1087
+ { io: ioPeer, priority: 1, read: true, write: false, dump: false },
1088
+ { io: ioMem, priority: 0, read: true, write: true, dump: true }
1089
+ ];
1090
+ const ioMulti = new IoMulti(ios);
1091
+ await ioMulti.init();
1092
+ return ioMulti;
1093
+ };
1094
+ }
1095
+ const exampleTestSetup = () => {
1096
+ return {
1097
+ io: new IoMem(),
1098
+ beforeAll: async () => {
1099
+ },
1100
+ beforeEach: async () => {
1101
+ },
1102
+ afterEach: async () => {
1103
+ },
1104
+ afterAll: async () => {
1105
+ }
1106
+ };
1107
+ };
1108
+ const exampleIo = "Checkout @rljson/io-mem for an example implementation";
687
1109
  const calcReverseRefs = (rljson) => {
688
1110
  const result = {};
689
1111
  iterateTablesSync(rljson, (childTableKey, table) => {
@@ -945,6 +1367,8 @@ const socketExample = () => ({
945
1367
  export {
946
1368
  IoDbNameMapping,
947
1369
  IoMem,
1370
+ IoMulti,
1371
+ IoPeer,
948
1372
  IoTools,
949
1373
  PeerSocketMock,
950
1374
  SocketMock,
@@ -953,4 +1377,4 @@ export {
953
1377
  exampleTestSetup,
954
1378
  socketExample
955
1379
  };
956
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW8uanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9pby1kYi1uYW1lLW1hcHBpbmcudHMiLCIuLi9zcmMvaW8tdG9vbHMudHMiLCIuLi9zcmMvaW8tbWVtLnRzIiwiLi4vc3JjL2lvLXRlc3Qtc2V0dXAudHMiLCIuLi9zcmMvaW8udHMiLCIuLi9zcmMvcGVlci1zb2NrZXQtbW9jay50cyIsIi4uL3NyYy9yZXZlcnNlLXJlZi50cyIsIi4uL3NyYy9zb2NrZXQtbW9jay50cyIsIi4uL3NyYy9zb2NrZXQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQGxpY2Vuc2Vcbi8vIENvcHlyaWdodCAoYykgMjAyNSBSbGpzb25cbi8vXG4vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0ZXJtcyB0aGF0IGNhbiBiZVxuLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHBhY2thZ2UuXG5cbmV4cG9ydCBjbGFzcyBJb0RiTmFtZU1hcHBpbmcge1xuICAvLyBUaGUgcHJpbWFyeSBrZXkgY29sdW1uIGlzIGFsd2F5cyBuYW1lZCAnX2hhc2gnXG4gIHB1YmxpYyBwcmltYXJ5S2V5Q29sdW1uOiBzdHJpbmcgPSAnX2hhc2gnO1xuICBwdWJsaWMgZGF0YVNlY3Rpb246IHN0cmluZyA9ICdfZGF0YSc7XG4gIHB1YmxpYyB0eXBlQ29sdW1uOiBzdHJpbmcgPSAndHlwZSc7XG4gIHB1YmxpYyBrZXlDb2x1bW46IHN0cmluZyA9ICdrZXknO1xuXG4gIC8vIE5hbWVzIGZvciB0aGUgbWFpbiB0YWJsZXMgaW4gdGhlIGRhdGFiYXNlXG4gIHB1YmxpYyB0YWJsZU5hbWVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgIG1haW46ICd0YWJsZUNmZ3MnLFxuICAgIHJldmlzaW9uOiAncmV2aXNpb25zJyxcbiAgfTtcblxuICAvLy8gU3VmZml4IGhhbmRsaW5nIGZvciB0aGUgZGF0YWJhc2VcbiAgcHJpdmF0ZSBfc3VmZml4OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgIGNvbDogJ19jb2wnLFxuICAgIHRibDogJ190YmwnLFxuICAgIHRtcDogJ190bXAnLFxuICB9O1xuXG4gIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIC8vIGFkZCBhbmQgcmVtb3ZlIHN1ZmZpeGVzIGZvciB1c2UgaW4gU1FMIHN0YXRlbWVudHNcbiAgcHJpdmF0ZSBfYWRkRml4KG5hbWU6IHN0cmluZywgZml4OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBuYW1lLmVuZHNXaXRoKGZpeCkgPyBuYW1lIDogbmFtZSArIGZpeDtcbiAgfVxuXG4gIHB1YmxpYyBhZGRUYWJsZVN1ZmZpeChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hZGRGaXgobmFtZSwgdGhpcy5fc3VmZml4LnRibCk7XG4gIH1cblxuICBwdWJsaWMgYWRkQ29sdW1uU3VmZml4KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZEZpeChuYW1lLCB0aGlzLl9zdWZmaXguY29sKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRUbXBTdWZmaXgobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkRml4KG5hbWUsIHRoaXMuX3N1ZmZpeC50bXApO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVtb3ZlRml4KG5hbWU6IHN0cmluZywgZml4OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBuYW1lLmVuZHNXaXRoKGZpeCkgPyBuYW1lLnNsaWNlKDAsIC1maXgubGVuZ3RoKSA6IG5hbWU7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlVGFibGVTdWZmaXgobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcmVtb3ZlRml4KG5hbWUsIHRoaXMuX3N1ZmZpeC50YmwpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUNvbHVtblN1ZmZpeChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9yZW1vdmVGaXgobmFtZSwgdGhpcy5fc3VmZml4LmNvbCk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlVG1wU3VmZml4KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3JlbW92ZUZpeChuYW1lLCB0aGlzLl9zdWZmaXgudG1wKTtcbiAgfVxufVxuIiwiLy8gQGxpY2Vuc2Vcbi8vIENvcHlyaWdodCAoYykgMjAyNSBSbGpzb25cbi8vXG4vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0ZXJtcyB0aGF0IGNhbiBiZVxuLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHBhY2thZ2UuXG5cbmltcG9ydCB7IGhpcCB9IGZyb20gJ0BybGpzb24vaGFzaCc7XG5pbXBvcnQge1xuICBpdGVyYXRlVGFibGVzLFxuICBSbGpzb24sXG4gIFRhYmxlQ2ZnLFxuICBUYWJsZUtleSxcbiAgVGFibGVUeXBlLFxuICB0aHJvd09uSW52YWxpZFRhYmxlQ2ZnLFxuICB2YWxpZGF0ZVJsanNvbkFnYWluc3RUYWJsZUNmZyxcbn0gZnJvbSAnQHJsanNvbi9ybGpzb24nO1xuXG5pbXBvcnQgeyBJb01lbSB9IGZyb20gJy4vaW8tbWVtLnRzJztcbmltcG9ydCB7IElvIH0gZnJvbSAnLi9pby50cyc7XG5cbmV4cG9ydCB0eXBlIElvT2JzZXJ2ZXIgPSAoZGF0YTogUmxqc29uKSA9PiB2b2lkO1xuXG4vKipcbiAqIFByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciB0aGUgSW8gaW50ZXJmYWNlLlxuICovXG5leHBvcnQgY2xhc3MgSW9Ub29scyB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gaW8gVGhlIElvIGludGVyZmFjZSB0byB1c2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBpbzogSW8pIHt9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRhYmxlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHRhYmxlQ2ZncyB0YWJsZS5cbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVDZmdzVGFibGVDZmcoKSB7XG4gICAgY29uc3QgdGFibGVDZmcgPSBoaXA8VGFibGVDZmc+KHtcbiAgICAgIF9oYXNoOiAnJyxcbiAgICAgIGtleTogJ3RhYmxlQ2ZncycsXG4gICAgICB0eXBlOiAndGFibGVDZmdzJyxcbiAgICAgIGlzSGVhZDogZmFsc2UsXG4gICAgICBpc1Jvb3Q6IGZhbHNlLFxuICAgICAgaXNTaGFyZWQ6IHRydWUsXG4gICAgICBwcmV2aW91czogJycsXG5cbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGtleTogJ19oYXNoJyxcbiAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICB0aXRsZVNob3J0OiAnSGFzaCcsXG4gICAgICAgICAgdGl0bGVMb25nOiAnUm93IEhhc2gnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAga2V5OiAna2V5JyxcbiAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICB0aXRsZVNob3J0OiAnS2V5JyxcbiAgICAgICAgICB0aXRsZUxvbmc6ICdUYWJsZSBLZXknLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAga2V5OiAndHlwZScsXG4gICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgdGl0bGVTaG9ydDogJ1R5cGUnLFxuICAgICAgICAgIHRpdGxlTG9uZzogJ0NvbnRlbnQgVHlwZScsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBrZXk6ICdpc0hlYWQnLFxuICAgICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgICB0aXRsZVNob3J0OiAnSXMgSGVhZCcsXG4gICAgICAgICAgdGl0bGVMb25nOiAnSXMgSGVhZCBUYWJsZScsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBrZXk6ICdpc1Jvb3QnLFxuICAgICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgICB0aXRsZVNob3J0OiAnSXMgUm9vdCcsXG4gICAgICAgICAgdGl0bGVMb25nOiAnSXMgUm9vdCBUYWJsZScsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBrZXk6ICdpc1NoYXJlZCcsXG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgIHRpdGxlU2hvcnQ6ICdJcyBTaGFyZWQnLFxuICAgICAgICAgIHRpdGxlTG9uZzogJ0lzIFNoYXJlZCBUYWJsZScsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBrZXk6ICdwcmV2aW91cycsXG4gICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgdGl0bGVTaG9ydDogJ1ByZXZpb3VzJyxcbiAgICAgICAgICB0aXRsZUxvbmc6ICdQcmV2aW91cyBUYWJsZSBDb25maWd1cmF0aW9uIEhhc2gnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAga2V5OiAnY29sdW1ucycsXG4gICAgICAgICAgdHlwZTogJ2pzb25BcnJheScsXG4gICAgICAgICAgdGl0bGVTaG9ydDogJ0NvbHVtbnMnLFxuICAgICAgICAgIHRpdGxlTG9uZzogJ0NvbHVtbiBDb25maWd1cmF0aW9ucycsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRhYmxlQ2ZnO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSByZXZpc2lvbnMgdGFibGUuXG4gICAqL1xuICBpbml0UmV2aXNpb25zVGFibGUgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGVDZmc6IFRhYmxlQ2ZnID0ge1xuICAgICAga2V5OiAncmV2aXNpb25zJyxcbiAgICAgIHR5cGU6ICdyZXZpc2lvbnMnLFxuICAgICAgaXNIZWFkOiB0cnVlLFxuICAgICAgaXNSb290OiB0cnVlLFxuICAgICAgaXNTaGFyZWQ6IGZhbHNlLFxuXG4gICAgICBjb2x1bW5zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBrZXk6ICdfaGFzaCcsXG4gICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgdGl0bGVTaG9ydDogJ0hhc2gnLFxuICAgICAgICAgIHRpdGxlTG9uZzogJ1JvdyBIYXNoJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGtleTogJ3RhYmxlJyxcbiAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICB0aXRsZVNob3J0OiAnVGFibGUnLFxuICAgICAgICAgIHRpdGxlTG9uZzogJ1RhYmxlIEtleScsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBrZXk6ICdwcmVkZWNlc3NvcicsXG4gICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgdGl0bGVTaG9ydDogJ1ByZWRlY2Vzc29yJyxcbiAgICAgICAgICB0aXRsZUxvbmc6ICdQcmVkZWNlc3NvciBSZXZpc2lvbiBIYXNoJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGtleTogJ3N1Y2Nlc3NvcicsXG4gICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgdGl0bGVTaG9ydDogJ1N1Y2Nlc3NvcicsXG4gICAgICAgICAgdGl0bGVMb25nOiAnU3VjY2Vzc29yIFJldmlzaW9uIEhhc2gnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAga2V5OiAndGltZXN0YW1wJyxcbiAgICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgICB0aXRsZVNob3J0OiAnVGltZXN0YW1wJyxcbiAgICAgICAgICB0aXRsZUxvbmc6ICdSZXZpc2lvbiBUaW1lc3RhbXAnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAga2V5OiAnaWQnLFxuICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgIHRpdGxlU2hvcnQ6ICdJRCcsXG4gICAgICAgICAgdGl0bGVMb25nOiAnUmV2aXNpb24gSUQnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuXG4gICAgYXdhaXQgdGhpcy5pby5jcmVhdGVPckV4dGVuZFRhYmxlKHsgdGFibGVDZmcgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEV4YW1wbGUgb2JqZWN0IGZvciB0ZXN0IHB1cnBvc2VzXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIGlvIHRvb2xzXG4gICAqL1xuICBzdGF0aWMgZXhhbXBsZSA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbyA9IGF3YWl0IElvTWVtLmV4YW1wbGUoKTtcbiAgICBhd2FpdCBpby5pbml0KCk7XG4gICAgYXdhaXQgaW8uaXNSZWFkeSgpO1xuICAgIHJldHVybiBuZXcgSW9Ub29scyhpbyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFRocm93cyBpZiB0aGUgdGFibGUgZG9lcyBub3QgZXhpc3RcbiAgICovXG4gIGFzeW5jIHRocm93V2hlblRhYmxlRG9lc05vdEV4aXN0KHRhYmxlOiBUYWJsZUtleSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGV4aXN0cyA9IGF3YWl0IHRoaXMuaW8udGFibGVFeGlzdHModGFibGUpO1xuICAgIGlmICghZXhpc3RzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlIFwiJHt0YWJsZX1cIiBub3QgZm91bmRgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGlmIGFueSBvZiB0aGUgdGFibGVzIGluIHJsanNvbiBkbyBub3QgZXhpc3RcbiAgICogQHBhcmFtIHJsanNvbiAtIFRoZSBSbGpzb24gb2JqZWN0IHRvIGNoZWNrXG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5UYWJsZXNEb05vdEV4aXN0KHJsanNvbjogUmxqc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGl0ZXJhdGVUYWJsZXMocmxqc29uLCBhc3luYyAodGFibGVLZXkpID0+IHtcbiAgICAgICAgY29uc3QgZXhpc3RzID0gYXdhaXQgdGhpcy5pby50YWJsZUV4aXN0cyh0YWJsZUtleSk7XG4gICAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBcIiR7dGFibGVLZXl9XCIgbm90IGZvdW5kYCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnN0IG1pc3NpbmdUYWJsZXMgPSAoZSBhcyBBcnJheTxhbnk+KS5tYXAoKGUpID0+IGUudGFibGVLZXkpO1xuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgZm9sbG93aW5nIHRhYmxlcyBkbyBub3QgZXhpc3Q6ICR7bWlzc2luZ1RhYmxlcy5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHRhYmxlIGNmZ3Mgb2YgYWxsIHRhYmxlc1xuICAgKiBAcmV0dXJucyBUaGUgdGFibGUgY29uZmlndXJhdGlvbiBvZiBhbGwgdGFibGVzXG4gICAqL1xuICBhc3luYyB0YWJsZUNmZ3MoKTogUHJvbWlzZTxUYWJsZUNmZ1tdPiB7XG4gICAgY29uc3QgdGFibGVzID0gYXdhaXQgdGhpcy5pby5yYXdUYWJsZUNmZ3MoKTtcblxuICAgIC8vIFRha2UgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGVhY2ggdHlwZSBrZXlcbiAgICBjb25zdCBuZXdlc3RWZXJzaW9uOiBSZWNvcmQ8VGFibGVLZXksIFRhYmxlQ2ZnPiA9IHt9O1xuICAgIGZvciAobGV0IGkgPSB0YWJsZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IHRhYmxlID0gdGFibGVzW2ldO1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBuZXdlc3RWZXJzaW9uW3RhYmxlLmtleV07XG4gICAgICBpZiAoIWV4aXN0aW5nIHx8IGV4aXN0aW5nLmNvbHVtbnMubGVuZ3RoIDwgdGFibGUuY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgbmV3ZXN0VmVyc2lvblt0YWJsZS5rZXldID0gdGFibGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU29ydCB0aGUgdGFibGVzIGJ5IGtleVxuICAgIC8qIHY4IGlnbm9yZSBuZXh0IC0tIEBwcmVzZXJ2ZSAqL1xuICAgIGNvbnN0IHJlc3VsdERhdGEgPSBPYmplY3QudmFsdWVzKG5ld2VzdFZlcnNpb24pLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGlmIChhLmtleSA8IGIua2V5KSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIGlmIChhLmtleSA+IGIua2V5KSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0RGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCB3aXRoIGFsbCB0YWJsZSBuYW1lc1xuICAgKi9cbiAgYXN5bmMgYWxsVGFibGVLZXlzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgdGhpcy50YWJsZUNmZ3MoKSkubWFwKChlKSA9PiBlLmtleSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgZ2l2ZW4gdGFibGVcbiAgICovXG4gIGFzeW5jIHRhYmxlQ2ZnKHRhYmxlOiBUYWJsZUtleSk6IFByb21pc2U8VGFibGVDZmc+IHtcbiAgICBjb25zdCB0YWJsZUNmZyA9IGF3YWl0IHRoaXMudGFibGVDZmdPck51bGwodGFibGUpO1xuICAgIGlmICghdGFibGVDZmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgXCIke3RhYmxlfVwiIG5vdCBmb3VuZGApO1xuICAgIH1cblxuICAgIHJldHVybiB0YWJsZUNmZyE7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBvZiBhIGdpdmVuIHRhYmxlIG9yIG51bGwgaWYgaXQgZG9lcyBub3QgZXhpc3QuXG5cbiAgICovXG4gIGFzeW5jIHRhYmxlQ2ZnT3JOdWxsKHRhYmxlOiBUYWJsZUtleSk6IFByb21pc2U8VGFibGVDZmcgfCBudWxsPiB7XG4gICAgY29uc3QgdGFibGVDZmdzID0gYXdhaXQgdGhpcy50YWJsZUNmZ3MoKTtcbiAgICBjb25zdCB0YWJsZUNmZyA9IHRhYmxlQ2Zncy5maW5kKChlKSA9PiBlLmtleSA9PT0gdGFibGUpO1xuICAgIHJldHVybiB0YWJsZUNmZyA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBjb2x1bW4gbmFtZXMgb2YgYSBnaXZlbiB0YWJsZVxuICAgKi9cbiAgYXN5bmMgYWxsQ29sdW1uS2V5cyh0YWJsZTogVGFibGVLZXkpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgdGFibGVDZmcgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZnKHRhYmxlKTtcbiAgICBjb25zdCByZXN1bHQgPSB0YWJsZUNmZy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ua2V5KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyB3aGVuIGEgY29sdW1uIGRvZXMgbm90IGV4aXN0IGluIGEgZ2l2ZW4gdGFibGVcbiAgICogQHBhcmFtIHRhYmxlIC0gVGhlIHRhYmxlIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBjb2x1bW5zIC0gVGhlIGNvbHVtbiB0byBjaGVja1xuICAgKi9cbiAgYXN5bmMgdGhyb3dXaGVuQ29sdW1uRG9lc05vdEV4aXN0KFxuICAgIHRhYmxlOiBUYWJsZUtleSxcbiAgICBjb2x1bW5zOiBzdHJpbmdbXSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGFibGVDZmcgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZnKHRhYmxlKTtcbiAgICBjb25zdCBjb2x1bW5LZXlzID0gdGFibGVDZmcuY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLmtleSk7XG4gICAgY29uc3QgbWlzc2luZ0NvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcihcbiAgICAgIChjb2x1bW4pID0+ICFjb2x1bW5LZXlzLmluY2x1ZGVzKGNvbHVtbiksXG4gICAgKTtcbiAgICBpZiAobWlzc2luZ0NvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIGZvbGxvd2luZyBjb2x1bW5zIGRvIG5vdCBleGlzdCBpbiB0YWJsZSBcIiR7dGFibGV9XCI6ICR7bWlzc2luZ0NvbHVtbnMuam9pbihcbiAgICAgICAgICAnLCAnLFxuICAgICAgICApfS5gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIHdoZW4gYSB0YWJsZSB1cGRhdGUgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCB0YWJsZVxuICAgKiBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgYXN5bmMgdGhyb3dXaGVuVGFibGVJc05vdENvbXBhdGlibGUodXBkYXRlOiBUYWJsZUNmZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHByZWZpeCA9IGBJbnZhbGlkIHVwZGF0ZSBvZiB0YWJsZSBhYmxlIFwiJHt1cGRhdGUua2V5fVwiYDtcblxuICAgIHRocm93T25JbnZhbGlkVGFibGVDZmcodXBkYXRlKTtcblxuICAgIC8vIENoZWNrIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyB0YWJsZVxuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy50YWJsZUNmZ09yTnVsbCh1cGRhdGUua2V5KTtcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIC8vIEhhdmUgY29sdW1ucyBiZWVuIGRlbGV0ZWQ/XG4gICAgICBpZiAoZXhpc3RpbmcuY29sdW1ucy5sZW5ndGggPiB1cGRhdGUuY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZGVsZXRlZENvbHVtbktleXMgPSBleGlzdGluZy5jb2x1bW5zXG4gICAgICAgICAgLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ua2V5KVxuICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAoa2V5KSA9PiAhdXBkYXRlLmNvbHVtbnMuc29tZSgoY29sdW1uKSA9PiBjb2x1bW4ua2V5ID09PSBrZXkpLFxuICAgICAgICAgICk7XG4gICAgICAgIC8qIHY4IGlnbm9yZSBuZXh0IC0tIEBwcmVzZXJ2ZSAqL1xuICAgICAgICBpZiAoZGVsZXRlZENvbHVtbktleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGRlbGV0ZWRDb2x1bW5zID0gZGVsZXRlZENvbHVtbktleXMuam9pbignLCAnKTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgJHtwcmVmaXh9OiBDb2x1bW5zIG11c3Qgbm90IGJlIGRlbGV0ZWQuIGAgK1xuICAgICAgICAgICAgICBgRGVsZXRlZCBjb2x1bW5zOiAke2RlbGV0ZWRDb2x1bW5zfX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSGF2ZSBjb2x1bW4ga2V5cyBjaGFuZ2VkP1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleGlzdGluZy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGJlZm9yZSA9IGV4aXN0aW5nLmNvbHVtbnNbaV0ua2V5O1xuICAgICAgICBjb25zdCBhZnRlciA9IHVwZGF0ZS5jb2x1bW5zW2ldLmtleTtcbiAgICAgICAgaWYgKGJlZm9yZSAhPT0gYWZ0ZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgJHtwcmVmaXh9OiBgICtcbiAgICAgICAgICAgICAgYENvbHVtbiBrZXlzIG11c3Qgbm90IGNoYW5nZSEgYCArXG4gICAgICAgICAgICAgIGBDb2x1bW4gXCIke2JlZm9yZX1cIiB3YXMgcmVuYW1lZCBpbnRvIFwiJHthZnRlcn1cIi5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSGF2ZSBjb2x1bW4gdHlwZXMgY2hhbmdlZD9cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhpc3RpbmcuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSBleGlzdGluZy5jb2x1bW5zW2ldLmtleTtcbiAgICAgICAgY29uc3QgYmVmb3JlID0gZXhpc3RpbmcuY29sdW1uc1tpXS50eXBlO1xuICAgICAgICBjb25zdCBhZnRlciA9IHVwZGF0ZS5jb2x1bW5zW2ldLnR5cGU7XG4gICAgICAgIGlmIChiZWZvcmUgIT09IGFmdGVyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYCR7cHJlZml4fTogYCArXG4gICAgICAgICAgICAgIGBDb2x1bW4gdHlwZXMgbXVzdCBub3QgY2hhbmdlISBgICtcbiAgICAgICAgICAgICAgYFR5cGUgb2YgY29sdW1uIFwiJHtjb2x1bW59XCIgd2FzIGNoYW5nZWQgZnJvbSBcIiR7YmVmb3JlfVwiIHRvICR7YWZ0ZXJ9LmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgaWYgdGhlIGRhdGEgaW4gdGhlIHRhYmxlIGRvIG5vdCBtYXRjaCB0aGUgdGFibGUgY29uZmlndXJhdGlvblxuICAgKi9cbiAgYXN5bmMgdGhyb3dXaGVuVGFibGVEYXRhRG9lc05vdE1hdGNoQ2ZnKGRhdGE6IFJsanNvbikge1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgIGF3YWl0IGl0ZXJhdGVUYWJsZXMoZGF0YSwgYXN5bmMgKHRhYmxlS2V5KSA9PiB7XG4gICAgICBjb25zdCB0YWJsZUNmZyA9IGF3YWl0IHRoaXMudGFibGVDZmcodGFibGVLZXkpO1xuICAgICAgY29uc3QgdGFibGUgPSBkYXRhW3RhYmxlS2V5XTtcblxuICAgICAgLy8gSWdub3JlIHRhYmxlQ2ZncyB0YWJsZVxuICAgICAgLyogdjggaWdub3JlIG5leHQgLS0gQHByZXNlcnZlICovXG4gICAgICBpZiAodGFibGUuX3R5cGUgPT09ICd0YWJsZUNmZ3MnKSByZXR1cm47XG5cbiAgICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlUmxqc29uQWdhaW5zdFRhYmxlQ2ZnKHRhYmxlLl9kYXRhLCB0YWJsZUNmZykpO1xuICAgIH0pO1xuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUYWJsZSBkYXRhIGRvZXMgbm90IG1hdGNoIHRoZSBjb25maWd1cmF0aW9uLlxcblxcbkVycm9yczpcXG4ke2Vycm9yc1xuICAgICAgICAgIC5tYXAoKGUpID0+IGAtICR7ZX1gKVxuICAgICAgICAgIC5qb2luKCdcXG4nKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU29ydHMgdGhlIGRhdGEgb2YgYSB0YWJsZSBieSB0aGUgaGFzaCBhbmQgdXBkYXRlcyB0aGUgdGFibGUgaGFzaCBpbiBwbGFjZVxuICAgKi9cbiAgc29ydFRhYmxlRGF0YUFuZFVwZGF0ZUhhc2godGFibGU6IFRhYmxlVHlwZSk6IHZvaWQge1xuICAgIHRhYmxlLl9kYXRhLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGhhc2hBID0gYS5faGFzaCBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBoYXNoQiA9IGIuX2hhc2ggYXMgc3RyaW5nO1xuICAgICAgLyogdjggaWdub3JlIG5leHQgLS0gQHByZXNlcnZlICovXG4gICAgICBpZiAoaGFzaEEgPCBoYXNoQikge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICAvKiB2OCBpZ25vcmUgbmV4dCAtLSBAcHJlc2VydmUgKi9cbiAgICAgIGlmIChoYXNoQSA+IGhhc2hCKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuXG4gICAgICAvKiB2OCBpZ25vcmUgbmV4dCAtLSBAcHJlc2VydmUgKi9cbiAgICAgIHJldHVybiAwO1xuICAgIH0pO1xuXG4gICAgdGFibGUuX2hhc2ggPSAnJztcbiAgICBoaXAodGFibGUsIHtcbiAgICAgIHVwZGF0ZUV4aXN0aW5nSGFzaGVzOiBmYWxzZSxcbiAgICAgIHRocm93T25Xcm9uZ0hhc2hlczogZmFsc2UsXG4gICAgfSk7XG4gIH1cbn1cbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG5pbXBvcnQgeyBoaXAsIGhzaCB9IGZyb20gJ0BybGpzb24vaGFzaCc7XG5pbXBvcnQgeyBJc1JlYWR5IH0gZnJvbSAnQHJsanNvbi9pcy1yZWFkeSc7XG5pbXBvcnQgeyBjb3B5LCBlcXVhbHMsIEpzb25WYWx1ZSB9IGZyb20gJ0BybGpzb24vanNvbic7XG5pbXBvcnQge1xuICBDb250ZW50VHlwZSxcbiAgaXRlcmF0ZVRhYmxlc1N5bmMsXG4gIFJsanNvbixcbiAgVGFibGVDZmcsXG4gIFRhYmxlS2V5LFxuICBUYWJsZVR5cGUsXG59IGZyb20gJ0BybGpzb24vcmxqc29uJztcblxuaW1wb3J0IHsgSW9Ub29scyB9IGZyb20gJy4vaW8tdG9vbHMudHMnO1xuaW1wb3J0IHsgSW8gfSBmcm9tICcuL2lvLnRzJztcblxuLyoqXG4gKiBJbi1NZW1vcnkgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJsanNvbiBJbyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBJb01lbSBpbXBsZW1lbnRzIElvIHtcbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIENvbnN0cnVjdG9yICYgZXhhbXBsZVxuXG4gIGluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5faXNPcGVuID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5faW5pdCgpO1xuICB9XG5cbiAgY2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5faXNPcGVuID0gZmFsc2U7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgZ2V0IGlzT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNPcGVuO1xuICB9XG5cbiAgc3RhdGljIGV4YW1wbGUgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaW8gPSBuZXcgSW9NZW0oKTtcbiAgICBhd2FpdCBpby5pbml0KCk7XG4gICAgcmV0dXJuIGlvO1xuICB9O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBHZW5lcmFsXG4gIGlzUmVhZHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzUmVhZHkucHJvbWlzZTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBEdW1wXG5cbiAgZHVtcCgpOiBQcm9taXNlPFJsanNvbj4ge1xuICAgIHJldHVybiB0aGlzLl9kdW1wKCk7XG4gIH1cblxuICBhc3luYyBkdW1wVGFibGUocmVxdWVzdDogeyB0YWJsZTogc3RyaW5nIH0pOiBQcm9taXNlPFJsanNvbj4ge1xuICAgIHJldHVybiB0aGlzLl9kdW1wVGFibGUocmVxdWVzdCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gTWV0YSBEYXRhXG5cbiAgYXN5bmMgY29udGVudFR5cGUocmVxdWVzdDogeyB0YWJsZTogc3RyaW5nIH0pOiBQcm9taXNlPENvbnRlbnRUeXBlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRlbnRUeXBlKHJlcXVlc3QpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFJvd3NcblxuICByZWFkUm93cyhyZXF1ZXN0OiB7XG4gICAgdGFibGU6IHN0cmluZztcbiAgICB3aGVyZTogeyBbY29sdW1uOiBzdHJpbmddOiBKc29uVmFsdWUgfTtcbiAgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRSb3dzKHJlcXVlc3QpO1xuICB9XG5cbiAgYXN5bmMgcm93Q291bnQodGFibGU6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgdGFibGVEYXRhID0gdGhpcy5fbWVtW3RhYmxlXSBhcyBUYWJsZVR5cGU7XG4gICAgaWYgKCF0YWJsZURhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgXCIke3RhYmxlfVwiIG5vdCBmb3VuZGApO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRhYmxlRGF0YS5fZGF0YS5sZW5ndGgpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFdyaXRlXG5cbiAgd3JpdGUocmVxdWVzdDogeyBkYXRhOiBSbGpzb24gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93cml0ZShyZXF1ZXN0KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBUYWJsZSBtYW5hZ2VtZW50XG4gIGFzeW5jIHRhYmxlRXhpc3RzKHRhYmxlS2V5OiBUYWJsZUtleSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fbWVtW3RhYmxlS2V5XSBhcyBUYWJsZVR5cGU7XG4gICAgcmV0dXJuIHRhYmxlID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG5cbiAgY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0OiB7IHRhYmxlQ2ZnOiBUYWJsZUNmZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZU9yRXh0ZW5kVGFibGUocmVxdWVzdCk7XG4gIH1cblxuICBhc3luYyByYXdUYWJsZUNmZ3MoKTogUHJvbWlzZTxUYWJsZUNmZ1tdPiB7XG4gICAgY29uc3QgdGFibGVzID0gdGhpcy5fbWVtLnRhYmxlQ2Zncy5fZGF0YSBhcyBUYWJsZUNmZ1tdO1xuICAgIHJldHVybiB0YWJsZXM7XG4gIH1cblxuICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4gIC8vIFByaXZhdGVcbiAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG4gIHByaXZhdGUgX2lvVG9vbHMhOiBJb1Rvb2xzO1xuXG4gIHByaXZhdGUgX2lzUmVhZHkgPSBuZXcgSXNSZWFkeSgpO1xuICBwcml2YXRlIF9pc09wZW4gPSBmYWxzZTtcblxuICBwcml2YXRlIF9tZW06IFJsanNvbiA9IGhpcCh7fSBhcyBSbGpzb24pO1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIGFzeW5jIF9pbml0KCkge1xuICAgIHRoaXMuX2lvVG9vbHMgPSBuZXcgSW9Ub29scyh0aGlzKTtcbiAgICB0aGlzLl9pbml0VGFibGVDZmdzKCk7XG4gICAgdGhpcy5fdXBkYXRlR2xvYmFsSGFzaCgpO1xuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMuaW5pdFJldmlzaW9uc1RhYmxlKCk7XG4gICAgaHNoKHRoaXMuX21lbSk7XG5cbiAgICB0aGlzLl9pc1JlYWR5LnJlc29sdmUoKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF9pbml0VGFibGVDZmdzID0gKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlQ2ZnID0gSW9Ub29scy50YWJsZUNmZ3NUYWJsZUNmZztcblxuICAgIHRoaXMuX21lbS50YWJsZUNmZ3MgPSBoaXAoe1xuICAgICAgX3R5cGU6ICd0YWJsZUNmZ3MnLFxuICAgICAgX2RhdGE6IFt0YWJsZUNmZ10sXG4gICAgICBfdGFibGVDZmc6IHRhYmxlQ2ZnLl9oYXNoIGFzIHN0cmluZyxcbiAgICB9KTtcbiAgfTtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBfdXBkYXRlR2xvYmFsSGFzaCgpIHtcbiAgICAodGhpcy5fbWVtIGFzIGFueSkuX2hhc2ggPSAnJztcbiAgICBoaXAodGhpcy5fbWVtLCB7XG4gICAgICB1cGRhdGVFeGlzdGluZ0hhc2hlczogZmFsc2UsXG4gICAgfSk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBfdXBkYXRlVGFibGVIYXNoKHRhYmxlS2V5OiBUYWJsZUtleSkge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fbWVtW3RhYmxlS2V5XSBhcyBUYWJsZVR5cGU7XG4gICAgdGFibGUuX2hhc2ggPSAnJztcbiAgICBoaXAodGFibGUsIHsgdXBkYXRlRXhpc3RpbmdIYXNoZXM6IGZhbHNlIH0pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX2NyZWF0ZU9yRXh0ZW5kVGFibGUocmVxdWVzdDoge1xuICAgIHRhYmxlQ2ZnOiBUYWJsZUNmZztcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSB0YWJsZSBjb25maWcgaXMgY29tcGF0aWJsZVxuICAgIC8vIHdpdGggYW4gcG90ZW50aWFsIGV4aXN0aW5nIHRhYmxlXG4gICAgY29uc3QgdGFibGVDZmcgPSByZXF1ZXN0LnRhYmxlQ2ZnO1xuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMudGhyb3dXaGVuVGFibGVJc05vdENvbXBhdGlibGUodGFibGVDZmcpO1xuXG4gICAgY29uc3QgeyBrZXkgfSA9IHRhYmxlQ2ZnO1xuXG4gICAgLy8gUmVjcmVhdGUgaGFzaGVzIGluIHRoZSBjYXNlIHRoZSBleGlzdGluZyBoYXNoZXMgYXJlIHdyb25nXG4gICAgY29uc3QgbmV3Q29uZmlnID0gaHNoKHRhYmxlQ2ZnKTtcblxuICAgIC8vIEZpbmQgYW4gZXhpc3RpbmcgdGFibGUgY29uZmlnIHdpdGggdGhlIHNhbWUgaGFzaFxuICAgIGNvbnN0IGV4aXN0aW5nQ29uZmlnID0gYXdhaXQgdGhpcy5faW9Ub29scy50YWJsZUNmZ09yTnVsbChrZXkpO1xuXG4gICAgLy8gV3JpdGUgdGhlIG5ldyBjb25maWcgaW50byB0aGUgZGF0YWJhc2VcbiAgICBpZiAoIWV4aXN0aW5nQ29uZmlnKSB7XG4gICAgICB0aGlzLl9jcmVhdGVUYWJsZShuZXdDb25maWcsIGtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2V4dGVuZFRhYmxlKGV4aXN0aW5nQ29uZmlnLCBuZXdDb25maWcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF9jcmVhdGVUYWJsZShuZXdDb25maWc6IFRhYmxlQ2ZnLCB0YWJsZUtleTogVGFibGVLZXkpIHtcbiAgICAvLyBXcml0ZSB0aGUgdGFibGUgY29uZmlnIGludG8gdGhlIGRhdGFiYXNlXG4gICAgbmV3Q29uZmlnID0gaHNoKG5ld0NvbmZpZyk7XG4gICAgdGhpcy5fbWVtLnRhYmxlQ2Zncy5fZGF0YS5wdXNoKG5ld0NvbmZpZyk7XG4gICAgdGhpcy5faW9Ub29scy5zb3J0VGFibGVEYXRhQW5kVXBkYXRlSGFzaCh0aGlzLl9tZW0udGFibGVDZmdzKTtcblxuICAgIC8vIENyZWF0ZSBhIHRhYmxlIGFuZCB3cml0ZSBpdCBpbnRvIHRoZSBkYXRhYmFzZVxuICAgIGNvbnN0IHRhYmxlOiBUYWJsZVR5cGUgPSB7XG4gICAgICBfdHlwZTogbmV3Q29uZmlnLnR5cGUsXG4gICAgICBfZGF0YTogW10sXG4gICAgICBfdGFibGVDZmc6IG5ld0NvbmZpZy5faGFzaCBhcyBzdHJpbmcsXG4gICAgfTtcblxuICAgIHRoaXMuX21lbVt0YWJsZUtleV0gPz89IGhpcCh0YWJsZSk7XG5cbiAgICAvLyBVcGRhdGUgaGFzaGVzXG4gICAgdGhpcy5fdXBkYXRlVGFibGVIYXNoKHRhYmxlS2V5KTtcbiAgICB0aGlzLl91cGRhdGVHbG9iYWxIYXNoKCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBfZXh0ZW5kVGFibGUoZXhpc3RpbmdDb25maWc6IFRhYmxlQ2ZnLCBuZXdDb25maWc6IFRhYmxlQ2ZnKSB7XG4gICAgLy8gTm8gY29sdW1ucyBhZGRlZD8gUmV0dXJuLlxuICAgIGlmIChleGlzdGluZ0NvbmZpZy5jb2x1bW5zLmxlbmd0aCA9PT0gbmV3Q29uZmlnLmNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gV3JpdGUgdGhlIG5ldyB0YWJsZSBjb25maWcgaW50byB0aGUgZGF0YWJhc2VcbiAgICBuZXdDb25maWcgPSBoc2gobmV3Q29uZmlnKTtcbiAgICB0aGlzLl9tZW0udGFibGVDZmdzLl9kYXRhLnB1c2gobmV3Q29uZmlnKTtcbiAgICB0aGlzLl9pb1Rvb2xzLnNvcnRUYWJsZURhdGFBbmRVcGRhdGVIYXNoKHRoaXMuX21lbS50YWJsZUNmZ3MpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBjb25maWcgb2YgdGhlIGV4aXN0aW5nIHRhYmxlXG4gICAgY29uc3QgdGFibGUgPSB0aGlzLl9tZW1bbmV3Q29uZmlnLmtleV0gYXMgVGFibGVUeXBlO1xuICAgIHRhYmxlLl90YWJsZUNmZyA9IG5ld0NvbmZpZy5faGFzaCBhcyBzdHJpbmc7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGhhc2hlc1xuICAgIHRoaXMuX3VwZGF0ZVRhYmxlSGFzaChuZXdDb25maWcua2V5KTtcbiAgICB0aGlzLl91cGRhdGVHbG9iYWxIYXNoKCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cblxuICBwcml2YXRlIGFzeW5jIF9kdW1wKCk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgcmV0dXJuIGNvcHkodGhpcy5fbWVtKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIGFzeW5jIF9kdW1wVGFibGUocmVxdWVzdDogeyB0YWJsZTogc3RyaW5nIH0pOiBQcm9taXNlPFJsanNvbj4ge1xuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMudGhyb3dXaGVuVGFibGVEb2VzTm90RXhpc3QocmVxdWVzdC50YWJsZSk7XG5cbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuX21lbVtyZXF1ZXN0LnRhYmxlXSBhcyBUYWJsZVR5cGU7XG5cbiAgICByZXR1cm4ge1xuICAgICAgW3JlcXVlc3QudGFibGVdOiBjb3B5KHRhYmxlKSxcbiAgICB9O1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX2NvbnRlbnRUeXBlKHJlcXVlc3Q6IHsgdGFibGU6IHN0cmluZyB9KTogUHJvbWlzZTxDb250ZW50VHlwZT4ge1xuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMudGhyb3dXaGVuVGFibGVEb2VzTm90RXhpc3QocmVxdWVzdC50YWJsZSk7XG5cbiAgICByZXR1cm4gKHRoaXMuX21lbVtyZXF1ZXN0LnRhYmxlXSBhcyBUYWJsZVR5cGUpLl90eXBlO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX3dyaXRlKHJlcXVlc3Q6IHsgZGF0YTogUmxqc29uIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhZGRlZERhdGEgPSBoc2gocmVxdWVzdC5kYXRhKTtcbiAgICB0aGlzLl9yZW1vdmVOdWxsVmFsdWVzKGFkZGVkRGF0YSk7XG4gICAgY29uc3QgdGFibGVzID0gT2JqZWN0LmtleXMoYWRkZWREYXRhKTtcbiAgICBoc2goYWRkZWREYXRhKTtcblxuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMudGhyb3dXaGVuVGFibGVzRG9Ob3RFeGlzdChyZXF1ZXN0LmRhdGEpO1xuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMudGhyb3dXaGVuVGFibGVEYXRhRG9lc05vdE1hdGNoQ2ZnKHJlcXVlc3QuZGF0YSk7XG5cbiAgICBmb3IgKGNvbnN0IHRhYmxlIG9mIHRhYmxlcykge1xuICAgICAgaWYgKHRhYmxlLnN0YXJ0c1dpdGgoJ18nKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb2xkVGFibGUgPSB0aGlzLl9tZW1bdGFibGVdIGFzIFRhYmxlVHlwZTtcbiAgICAgIGNvbnN0IG5ld1RhYmxlID0gYWRkZWREYXRhW3RhYmxlXSBhcyBUYWJsZVR5cGU7XG5cbiAgICAgIC8vIFRhYmxlIGV4aXN0cy4gTWVyZ2UgZGF0YVxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG5ld1RhYmxlLl9kYXRhKSB7XG4gICAgICAgIGNvbnN0IGhhc2ggPSBpdGVtLl9oYXNoO1xuICAgICAgICBjb25zdCBleGlzdHMgPSBvbGRUYWJsZS5fZGF0YS5maW5kKChpKSA9PiBpLl9oYXNoID09PSBoYXNoKTtcbiAgICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICBvbGRUYWJsZS5fZGF0YS5wdXNoKGl0ZW0gYXMgYW55KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9pb1Rvb2xzLnNvcnRUYWJsZURhdGFBbmRVcGRhdGVIYXNoKG9sZFRhYmxlKTtcbiAgICB9XG5cbiAgICAvLyBSZWNhbGMgbWFpbiBoYXNoZXNcbiAgICB0aGlzLl91cGRhdGVHbG9iYWxIYXNoKCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBhc3luYyBfcmVhZFJvd3MocmVxdWVzdDoge1xuICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgd2hlcmU6IHsgW2NvbHVtbjogc3RyaW5nXTogSnNvblZhbHVlIH07XG4gIH0pOiBQcm9taXNlPFJsanNvbj4ge1xuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMudGhyb3dXaGVuVGFibGVEb2VzTm90RXhpc3QocmVxdWVzdC50YWJsZSk7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5Db2x1bW5Eb2VzTm90RXhpc3QoXG4gICAgICByZXF1ZXN0LnRhYmxlLFxuICAgICAgT2JqZWN0LmtleXMocmVxdWVzdC53aGVyZSksXG4gICAgKTtcblxuICAgIC8vIFJlYWQgdGFibGUgZnJvbSBkYXRhXG4gICAgY29uc3QgdGFibGUgPSB0aGlzLl9tZW1bcmVxdWVzdC50YWJsZV0gYXMgVGFibGVUeXBlO1xuXG4gICAgLy8gRmlsdGVyIHRhYmxlIGRhdGFcbiAgICBjb25zdCB0YWJsZURhdGFGaWx0ZXJlZCA9IHRhYmxlLl9kYXRhLmZpbHRlcigocm93KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGNvbHVtbiBpbiByZXF1ZXN0LndoZXJlKSB7XG4gICAgICAgIGNvbnN0IGEgPSByb3dbY29sdW1uXTtcbiAgICAgICAgY29uc3QgYiA9IHJlcXVlc3Qud2hlcmVbY29sdW1uXTtcbiAgICAgICAgaWYgKGIgPT09IG51bGwgJiYgYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWVxdWFscyhhLCBiKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgYW4gdGFibGVcbiAgICBjb25zdCB0YWJsZUZpbHRlcmVkOiBUYWJsZVR5cGUgPSB7XG4gICAgICBfdHlwZTogdGFibGUuX3R5cGUsXG4gICAgICBfZGF0YTogdGFibGVEYXRhRmlsdGVyZWQsXG4gICAgfTtcblxuICAgIHRoaXMuX2lvVG9vbHMuc29ydFRhYmxlRGF0YUFuZFVwZGF0ZUhhc2godGFibGVGaWx0ZXJlZCk7XG5cbiAgICBjb25zdCByZXN1bHQ6IFJsanNvbiA9IHtcbiAgICAgIFtyZXF1ZXN0LnRhYmxlXTogdGFibGVGaWx0ZXJlZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIF9yZW1vdmVOdWxsVmFsdWVzKHJsanNvbjogUmxqc29uKSB7XG4gICAgaXRlcmF0ZVRhYmxlc1N5bmMocmxqc29uLCAodGFibGUpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBybGpzb25bdGFibGVdLl9kYXRhO1xuXG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiBkYXRhKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHJvdykge1xuICAgICAgICAgIGlmIChyb3dba2V5XSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgZGVsZXRlIHJvd1trZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgSW8sIElvTWVtIH0gZnJvbSAnLi9pbmRleC50cyc7XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4vKipcbiAqIElvIGltcGxlbWVudGF0aW9uIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHRvIGJlIHVzZWQgaW5cbiAqIGNvbmZvcm1hbmNlIHRlc3RzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElvVGVzdFNldHVwIHtcbiAgLyoqIHNldHVwIGJlZm9yZSB0aGUgc2luZ2xlIHNldHVwcyAqL1xuICBiZWZvcmVBbGw6ICgpID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBpbyBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHJldHVybnMgVGhlIGlvIGltcGxlbWVudGF0aW9uLlxuICAgKi9cbiAgYmVmb3JlRWFjaDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVGVhcnMgZG93biB0aGUgaW8gaW1wbGVtZW50YXRpb24uXG4gICAqIEByZXR1cm5zIFRoZSBpbyBpbXBsZW1lbnRhdGlvbi5cbiAgICovXG4gIGFmdGVyRWFjaDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKiogY2xlYW51cCBhZnRlciBhbGwgdGVzdHMgKi9cbiAgYWZ0ZXJBbGw6ICgpID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFRoZSBpbyBpbXBsZW1lbnRhdGlvbiB0byBiZSB1c2VkIGluIHRoZSBjb25mb3JtYW5jZSB0ZXN0cy5cbiAgICovXG4gIGlvOiBJbztcbn1cblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8vIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIElvVGVzdFNldHVwIGludGVyZmFjZVxuZXhwb3J0IGNvbnN0IGV4YW1wbGVUZXN0U2V0dXAgPSAoKTogSW9UZXN0U2V0dXAgPT4ge1xuICByZXR1cm4ge1xuICAgIGlvOiBuZXcgSW9NZW0oKSxcbiAgICBiZWZvcmVBbGw6IGFzeW5jICgpID0+IHtcbiAgICAgIC8vIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGZvciBhbnkgYWRkaXRpb25hbCBzZXR1cCByZXF1aXJlZCBiZWZvcmUgaW5pdC5cbiAgICAgIC8vIEN1cnJlbnRseSwgaXQgZG9lcyBub3RoaW5nLlxuICAgIH0sXG5cbiAgICBiZWZvcmVFYWNoOiBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBJbml0aWFsaXplIHRoZSBpbyBpbXBsZW1lbnRhdGlvblxuICAgIH0sXG4gICAgYWZ0ZXJFYWNoOiBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBUZWFyIGRvd24gdGhlIGlvIGltcGxlbWVudGF0aW9uXG4gICAgfSxcblxuICAgIGFmdGVyQWxsOiBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCBmb3IgYW55IGFkZGl0aW9uYWwgY2xlYW51cCBhZnRlciB0ZWFyRG93bi5cbiAgICB9LFxuICB9O1xufTtcbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG5pbXBvcnQgeyBKc29uVmFsdWUgfSBmcm9tICdAcmxqc29uL2pzb24nO1xuaW1wb3J0IHsgQ29udGVudFR5cGUsIFJsanNvbiwgVGFibGVDZmcsIFRhYmxlS2V5IH0gZnJvbSAnQHJsanNvbi9ybGpzb24nO1xuXG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5leHBvcnQgaW50ZXJmYWNlIElvIHtcbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIEdlbmVyYWxcblxuICAvKiogU3RhcnRzIHRoZSBpbml0aWFsaXphdGlvbiAqL1xuICBpbml0KCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqIENsb3NlcyB0aGUgaW8gKi9cbiAgY2xvc2UoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKiogUmV0dXJucyB0cnVlIGlmIGlvIGlzIG9wZW5lZCAqL1xuICBpc09wZW46IGJvb2xlYW47XG5cbiAgLyoqIEEgcHJvbWlzZSByZXNvbHZpbmcgb25jZSB0aGUgSW8gaW50ZXJmYWNlIGlzIHJlYWR5XG4gICAqXG4gICAqIPCfkqEgVXNlIEBybGpzb24vaXMtcmVhZHlcbiAgICovXG4gIGlzUmVhZHkoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gRHVtcFxuXG4gIC8qKiBSZXR1cm5zIHRoZSBjb21wbGV0ZSBkYiBjb250ZW50IGFzIFJsanNvbiAqL1xuICBkdW1wKCk6IFByb21pc2U8Umxqc29uPjtcblxuICAvKiogUmV0dXJucyB0aGUgZHVtcCBvZiBhIGNvbXBsZXRlIHRhYmxlICovXG4gIGR1bXBUYWJsZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Umxqc29uPjtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gTWV0YSBEYXRhXG4gIGNvbnRlbnRUeXBlKHJlcXVlc3Q6IHsgdGFibGU6IHN0cmluZyB9KTogUHJvbWlzZTxDb250ZW50VHlwZT47XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFRhYmxlc1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRhYmxlIGV4aXN0c1xuICAgKi9cbiAgdGFibGVFeGlzdHModGFibGVLZXk6IFRhYmxlS2V5KTogUHJvbWlzZTxib29sZWFuPjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHRhYmxlIHdpdGggYSBnaXZlbiBjb25maWcuXG4gICAqIElmIHRoZSB0YWJsZSBhbHJlYWR5IGV4aXN0cywgbmV3IGNvbHVtbnMgYXJlIGFkZGVkIHRvIHRoZSBleGlzdGluZyB0YWJsZS5cbiAgICogSWYgdGhlIHRhYmxlIGRvZXMgbm90IGV4aXN0LCBpdCBpcyBjcmVhdGVkIHdpdGggdGhlIGdpdmVuIGNvbmZpZy5cbiAgICogSWYgdGhlIHRhYmxlIGV4aXN0cyBhbmQgY29sdW1ucyBhcmUgcmVtb3ZlZCwgYW4gZXJyb3IgaXMgdGhyb3duLlxuICAgKiBJZiB0aGUgdGFibGUgZXhpc3RzIGFuZCB0aGUgY29sdW1uIHR5cGUgaXMgY2hhbmdlZCwgYW4gZXJyb3IgaXMgdGhyb3duLlxuICAgKi9cbiAgY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0OiB7IHRhYmxlQ2ZnOiBUYWJsZUNmZyB9KTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogUmV0dXJucyBhIGpzb24gc3RydWN0dXJlIHJldHVybmluZyBjdXJyZW50IHRhYmxlIGNvbmZpZ3VyYXRpb25zXG4gICAqL1xuICByYXdUYWJsZUNmZ3MoKTogUHJvbWlzZTxUYWJsZUNmZ1tdPjtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gV3JpdGVcblxuICAvKiogV3JpdGVzIFJsanNvbiBkYXRhIGludG8gdGhlIGRhdGFiYXNlICovXG4gIHdyaXRlKHJlcXVlc3Q6IHsgZGF0YTogUmxqc29uIH0pOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBSZWFkIHJvd3NcblxuICAvKiogUXVlcmllcyBhIGxpc3Qgb2Ygcm93cyAqL1xuICByZWFkUm93cyhyZXF1ZXN0OiB7XG4gICAgdGFibGU6IHN0cmluZztcbiAgICB3aGVyZTogeyBbY29sdW1uOiBzdHJpbmddOiBKc29uVmFsdWUgfCBudWxsIH07XG4gIH0pOiBQcm9taXNlPFJsanNvbj47XG5cbiAgLyoqIFJldHVybnMgdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBnaXZlbiB0YWJsZSAqL1xuICByb3dDb3VudCh0YWJsZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+O1xufVxuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuZXhwb3J0IGNvbnN0IGV4YW1wbGVJbyA9XG4gICdDaGVja291dCBAcmxqc29uL2lvLW1lbSBmb3IgYW4gZXhhbXBsZSBpbXBsZW1lbnRhdGlvbic7XG4iLCIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgSW8gfSBmcm9tICcuL2lvLnRzJztcbmltcG9ydCB7IFNvY2tldCB9IGZyb20gJy4vc29ja2V0LnRzJztcblxuXG5leHBvcnQgY2xhc3MgUGVlclNvY2tldE1vY2sgaW1wbGVtZW50cyBTb2NrZXQge1xuICBwcml2YXRlIF9saXN0ZW5lcnNNYXA6IE1hcDxzdHJpbmcgfCBzeW1ib2wsIEFycmF5PCguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZD4+ID1cbiAgICBuZXcgTWFwKCk7XG5cbiAgY29ubmVjdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIGRpc2Nvbm5lY3RlZDogYm9vbGVhbiA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfaW86IElvKSB7fVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhbiBldmVudCBsaXN0ZW5lciBmb3IgdGhlIHNwZWNpZmllZCBldmVudC5cbiAgICogQHBhcmFtIGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byBsaXN0ZW4gZm9yLlxuICAgKiBAcGFyYW0gbGlzdGVuZXIgLSBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gaW52b2tlIHdoZW4gdGhlIGV2ZW50IGlzIGVtaXR0ZWQuXG4gICAqIEByZXR1cm5zIFRoZSBQZWVyU29ja2V0TW9jayBpbnN0YW5jZSBmb3IgY2hhaW5pbmcuXG4gICAqL1xuICBvbihldmVudE5hbWU6IHN0cmluZyB8IHN5bWJvbCwgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCk6IHRoaXMge1xuICAgIGlmICghdGhpcy5fbGlzdGVuZXJzTWFwLmhhcyhldmVudE5hbWUpKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnNNYXAuc2V0KGV2ZW50TmFtZSwgW10pO1xuICAgIH1cbiAgICB0aGlzLl9saXN0ZW5lcnNNYXAuZ2V0KGV2ZW50TmFtZSkhLnB1c2gobGlzdGVuZXIpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8qKlxuICAgKiBTaW11bGF0ZXMgYSBjb25uZWN0aW9uIGV2ZW50LlxuICAgKlxuICAgKiBFbWl0cyB0aGUgJ2Nvbm5lY3QnIGV2ZW50IHRvIGFsbCByZWdpc3RlcmVkIGxpc3RlbmVycy5cbiAgICovXG4gIGNvbm5lY3QoKTogdm9pZCB7XG4gICAgdGhpcy5jb25uZWN0ZWQgPSB0cnVlO1xuICAgIHRoaXMuZGlzY29ubmVjdGVkID0gZmFsc2U7XG5cbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnNNYXAuZ2V0KCdjb25uZWN0JykgfHwgW107XG4gICAgZm9yIChjb25zdCBjYiBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgIGNiKHt9KTtcbiAgICB9XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLyoqXG4gICAqIFNpbXVsYXRlcyBhIGRpc2Nvbm5lY3Rpb24gZXZlbnQuXG4gICAqXG4gICAqIEVtaXRzIHRoZSAnZGlzY29ubmVjdCcgZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLlxuICAgKi9cbiAgZGlzY29ubmVjdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgIHRoaXMuZGlzY29ubmVjdGVkID0gdHJ1ZTtcblxuICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyc01hcC5nZXQoJ2Rpc2Nvbm5lY3QnKSB8fCBbXTtcbiAgICBmb3IgKGNvbnN0IGNiIG9mIGxpc3RlbmVycykge1xuICAgICAgY2Ioe30pO1xuICAgIH1cbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLyoqXG4gICAqIEVtaXRzIGFuIGV2ZW50LCBpbnZva2luZyB0aGUgY29ycmVzcG9uZGluZyBtZXRob2Qgb24gdGhlIElvIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gZXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIGVtaXQuXG4gICAqIEBwYXJhbSBhcmdzIC0gVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lci5cbiAgICogQHJldHVybnNcbiAgICovXG4gIGVtaXQoZXZlbnROYW1lOiBzdHJpbmcgfCBzeW1ib2wsIC4uLmFyZ3M6IGFueVtdKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZm4gPSAodGhpcy5faW8gYXMgYW55KVtldmVudE5hbWVdIGFzICguLi5hcmdzOiBhbnlbXSkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXZlbnQgJHtldmVudE5hbWUudG9TdHJpbmcoKX0gbm90IHN1cHBvcnRlZGApO1xuICAgIH1cbiAgICBjb25zdCBjYiA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgICBmbi5hcHBseSh0aGlzLl9pbywgYXJncy5zbGljZSgwLCAtMSkpXG4gICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgIGNiKHJlc3VsdCwgbnVsbCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgY2IobnVsbCwgZXJyKTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbiIsIi8qIHY4IGlnbm9yZSBmaWxlIC0tIEBwcmVzZXJ2ZSAqL1xuLy8gQGxpY2Vuc2Vcbi8vIENvcHlyaWdodCAoYykgMjAyNSBSbGpzb25cbi8vXG4vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0ZXJtcyB0aGF0IGNhbiBiZVxuLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHBhY2thZ2UuXG5cbmltcG9ydCB7IEpzb24gfSBmcm9tICdAcmxqc29uL2pzb24nO1xuaW1wb3J0IHtcbiAgQnVmZmV0LFxuICBDYWtlLFxuICBpdGVyYXRlVGFibGVzU3luYyxcbiAgTGF5ZXIsXG4gIFJlZixcbiAgUmxqc29uLFxuICBUYWJsZUtleSxcbn0gZnJvbSAnQHJsanNvbi9ybGpzb24nO1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuLyoqXG4gKiBEZXNjcmliZXMgYSByb3cgdGhhdCByZWZlcmVuY2VzIGEgY2hpbGQgdGFibGUgcm93XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyZW50UmVmIHtcbiAgLyoqXG4gICAqIFRoZSBwYXJlbnQgdGFibGUgdGhhdCByZWZlcmVuY2VzIHRoZSBjaGlsZCB0YWJsZVxuICAgKi9cbiAgW3BhcmVudFRhYmxlOiBUYWJsZUtleV06IHtcbiAgICAvKipcbiAgICAgKiBUaGUgcGFyZW50IHJvdyB0aGF0IHJlZmVyZW5jZXMgdGhlIGNoaWxkIHJvd1xuICAgICAqL1xuICAgIFtwYXJlbnRSb3c6IFJlZl06IHtcbiAgICAgIC8qKlxuICAgICAgICogRGV0YWlscyBhYm91dCB0aGUgcmVmZXJlbmNlLCBlLmcuIGFuIGFycmF5IGluZGV4IGV0Yy5cbiAgICAgICAqL1xuICAgICAgZGV0YWlscz86IEpzb247XG4gICAgfTtcbiAgfTtcbn1cblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBwYXJlbnQgdGFibGUgcm93cyByZWZlcmVuY2luZyBhIGNoaWxkIHRhYmxlIHJvd1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJldmVyc2VSZWZzIHtcbiAgLyoqXG4gICAqIFRoZSBjaGlsZCB0YWJsZSB3ZSBuZWVkIHRoZSByZWZlcmVuY2luZyByb3dzIGZvclxuICAgKi9cbiAgW2NoaWxkVGFibGU6IFRhYmxlS2V5XToge1xuICAgIC8qKlxuICAgICAqIFRoZSByb3cgaGFzaHdlIG5lZWQgdGhlIHJlZmVyZW5jaW5nIHJvd3MgZm9yXG4gICAgICovXG4gICAgW2NoaWxkUm93OiBSZWZdOiBQYXJlbnRSZWY7XG4gIH07XG59XG5cbi8qIHY4IGlnbm9yZSBzdGFydCAqL1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSByZXZlcnNlIHJlZmVyZW5jZXMgZm9yIGEgZ2l2ZW4gcmxqc29uIG9iamVjdFxuICovXG5leHBvcnQgY29uc3QgY2FsY1JldmVyc2VSZWZzID0gKHJsanNvbjogUmxqc29uKTogUmV2ZXJzZVJlZnMgPT4ge1xuICBjb25zdCByZXN1bHQ6IFJldmVyc2VSZWZzID0ge307XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBQcmVwYXJlIGRhdGEgc3RydWN0dXJlXG4gIGl0ZXJhdGVUYWJsZXNTeW5jKHJsanNvbiwgKGNoaWxkVGFibGVLZXksIHRhYmxlKSA9PiB7XG4gICAgY29uc3QgY2hpbGRUYWJsZTogeyBbY2hpbGRSb3dIYXNoOiBzdHJpbmddOiBQYXJlbnRSZWYgfSA9IHt9O1xuICAgIHJlc3VsdFtjaGlsZFRhYmxlS2V5XSA9IGNoaWxkVGFibGU7XG4gICAgZm9yIChjb25zdCBjaGlsZFJvdyBvZiB0YWJsZS5fZGF0YSkge1xuICAgICAgY2hpbGRUYWJsZVtjaGlsZFJvdy5faGFzaF0gPSB7fTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gR2VuZXJhdGUgcmV2ZXJzZSByZWZlcmVuY2VzXG4gIGl0ZXJhdGVUYWJsZXNTeW5jKHJsanNvbiwgKHBhcmVudFRhYmxlS2V5LCBwYXJlbnRUYWJsZSkgPT4ge1xuICAgIC8vIEl0ZXJhdGUgYWxsIHJvd3Mgb2YgZWFjaCB0YWJsZVxuICAgIGZvciAoY29uc3QgcGFyZW50VGFibGVSb3cgb2YgcGFyZW50VGFibGUuX2RhdGEpIHtcbiAgICAgIC8vIEZpbmQgb3V0IHdoZSBvdGhlciB0YWJsZXMgJiByb3dzIGFyZSByZWZlcmVuY2VkIGJ5IHRoaXMgcm93XG4gICAgICAvLyBXcml0ZSB0aGVzZSBpbmZvcm1hdGlvbiBpbnR0byByZXN1bHRcbiAgICAgIHN3aXRjaCAocGFyZW50VGFibGUuX3R5cGUpIHtcbiAgICAgICAgY2FzZSAnY29tcG9uZW50cyc6XG4gICAgICAgICAgX3dyaXRlQ29tcG9uZW50UmVmcyhwYXJlbnRUYWJsZUtleSwgcGFyZW50VGFibGVSb3csIHJlc3VsdCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnbGF5ZXJzJzoge1xuICAgICAgICAgIF93cml0ZUxheWVyUmVmcyhwYXJlbnRUYWJsZUtleSwgcGFyZW50VGFibGVSb3csIHJlc3VsdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdzbGljZUlkcyc6IHtcbiAgICAgICAgICAvLyBTbGljZSBpZHMgZG8gbm90IHJlZmVyZW5jZSBvdGhlciB0YWJsZXNcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ2Nha2VzJzoge1xuICAgICAgICAgIF93cml0ZUNha2VSZWZzKHBhcmVudFRhYmxlS2V5LCBwYXJlbnRUYWJsZVJvdywgcmVzdWx0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ2J1ZmZldHMnOiB7XG4gICAgICAgICAgX3dyaXRlQnVmZmV0UmVmcyhwYXJlbnRUYWJsZUtleSwgcGFyZW50VGFibGVSb3csIHJlc3VsdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKiB2OCBpZ25vcmUgZW5kICovXG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5jb25zdCBfd3JpdGVDb21wb25lbnRSZWZzID0gKFxuICBwYXJlbnRUYWJsZU5hbWU6IFRhYmxlS2V5LFxuICBwYXJlbnRSb3c6IEpzb24sXG4gIHJlc3VsdDogUmV2ZXJzZVJlZnMsXG4pID0+IHtcbiAgY29uc3QgcGFyZW50Um93SGFzaCA9IHBhcmVudFJvdy5faGFzaCBhcyBzdHJpbmc7XG5cbiAgZm9yIChjb25zdCBwYXJlbnRDb2x1bW5OYW1lIGluIHBhcmVudFJvdykge1xuICAgIGlmIChwYXJlbnRDb2x1bW5OYW1lLnN0YXJ0c1dpdGgoJ18nKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJlbnRDb2x1bW5OYW1lLmVuZHNXaXRoKCdSZWYnKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGRUYWJsZU5hbWUgPSBwYXJlbnRDb2x1bW5OYW1lLnNsaWNlKDAsIC0zKTtcbiAgICBjb25zdCBjaGlsZFJvd0hhc2ggPSBwYXJlbnRSb3dbcGFyZW50Q29sdW1uTmFtZV0gYXMgc3RyaW5nO1xuXG4gICAgX3dyaXRlKFxuICAgICAgcmVzdWx0LFxuICAgICAgY2hpbGRUYWJsZU5hbWUsXG4gICAgICBjaGlsZFJvd0hhc2gsXG4gICAgICBwYXJlbnRUYWJsZU5hbWUsXG4gICAgICBwYXJlbnRSb3dIYXNoLFxuICAgICk7XG4gIH1cbn07XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5jb25zdCBfd3JpdGVMYXllclJlZnMgPSAoXG4gIHBhcmVudFRhYmxlTmFtZTogVGFibGVLZXksXG4gIHBhcmVudFJvdzogTGF5ZXIsXG4gIHJlc3VsdDogUmV2ZXJzZVJlZnMsXG4pID0+IHtcbiAgY29uc3QgY2hpbGRUYWJsZU5hbWUgPSBwYXJlbnRSb3cuY29tcG9uZW50c1RhYmxlO1xuICBjb25zdCBwYXJlbnRSb3dIYXNoID0gcGFyZW50Um93Ll9oYXNoIGFzIHN0cmluZztcblxuICBmb3IgKGNvbnN0IHNsaWNlSWQgaW4gcGFyZW50Um93LmFkZCkge1xuICAgIGlmIChzbGljZUlkLnN0YXJ0c1dpdGgoJ18nKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgc2xpY2VIYXNoID0gcGFyZW50Um93LmFkZFtzbGljZUlkXSBhcyBzdHJpbmc7XG5cbiAgICBfd3JpdGUocmVzdWx0LCBjaGlsZFRhYmxlTmFtZSwgc2xpY2VIYXNoLCBwYXJlbnRUYWJsZU5hbWUsIHBhcmVudFJvd0hhc2gpO1xuICB9XG59O1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuY29uc3QgX3dyaXRlQ2FrZVJlZnMgPSAoXG4gIHBhcmVudFRhYmxlTmFtZTogVGFibGVLZXksXG4gIHBhcmVudFJvdzogQ2FrZSxcbiAgcmVzdWx0OiBSZXZlcnNlUmVmcyxcbikgPT4ge1xuICBjb25zdCBwYXJlbnRSb3dIYXNoID0gcGFyZW50Um93Ll9oYXNoIGFzIHN0cmluZztcblxuICBmb3IgKGNvbnN0IGxheWVyIGluIHBhcmVudFJvdy5sYXllcnMpIHtcbiAgICBjb25zdCBjaGlsZFRhYmxlTmFtZSA9IGxheWVyO1xuICAgIGNvbnN0IGNoaWxkUm93SGFzaCA9IHBhcmVudFJvdy5sYXllcnNbbGF5ZXJdIGFzIHN0cmluZztcbiAgICBfd3JpdGUoXG4gICAgICByZXN1bHQsXG4gICAgICBjaGlsZFRhYmxlTmFtZSxcbiAgICAgIGNoaWxkUm93SGFzaCxcbiAgICAgIHBhcmVudFRhYmxlTmFtZSxcbiAgICAgIHBhcmVudFJvd0hhc2gsXG4gICAgKTtcbiAgfVxufTtcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbmNvbnN0IF93cml0ZUJ1ZmZldFJlZnMgPSAoXG4gIHBhcmVudFRhYmxlTmFtZTogVGFibGVLZXksXG4gIHBhcmVudFJvdzogQnVmZmV0LFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuKSA9PiB7XG4gIGNvbnN0IHBhcmVudFJvd0hhc2ggPSBwYXJlbnRSb3cuX2hhc2ggYXMgc3RyaW5nO1xuXG4gIGZvciAoY29uc3QgaXRlbSBvZiBwYXJlbnRSb3cuaXRlbXMpIHtcbiAgICBjb25zdCBjaGlsZFRhYmxlTmFtZSA9IGl0ZW0udGFibGU7XG4gICAgY29uc3QgY2hpbGRSb3dIYXNoID0gaXRlbS5yZWY7XG4gICAgX3dyaXRlKFxuICAgICAgcmVzdWx0LFxuICAgICAgY2hpbGRUYWJsZU5hbWUsXG4gICAgICBjaGlsZFJvd0hhc2gsXG4gICAgICBwYXJlbnRUYWJsZU5hbWUsXG4gICAgICBwYXJlbnRSb3dIYXNoLFxuICAgICk7XG4gIH1cbn07XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5jb25zdCBfd3JpdGUgPSAoXG4gIHJlc3VsdDogUmV2ZXJzZVJlZnMsXG4gIGNoaWxkVGFibGVOYW1lOiBzdHJpbmcsXG4gIGNoaWxkUm93SGFzaDogc3RyaW5nLFxuICBwYXJlbnRUYWJsZU5hbWU6IHN0cmluZyxcbiAgcGFyZW50Um93SGFzaDogc3RyaW5nLFxuKSA9PiB7XG4gIGNvbnN0IHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlID0gKHJlc3VsdFtjaGlsZFRhYmxlTmFtZV0gPz89IHt9KTtcbiAgY29uc3QgcmVmZXJlbmNlc0ZvckNoaWxkVGFibGVSb3cgPSAocmVmZXJlbmNlc0ZvckNoaWxkVGFibGVbY2hpbGRSb3dIYXNoXSA/Pz1cbiAgICB7fSk7XG5cbiAgcmVmZXJlbmNlc0ZvckNoaWxkVGFibGVSb3dbcGFyZW50VGFibGVOYW1lXSA/Pz0ge307XG4gIHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlUm93W3BhcmVudFRhYmxlTmFtZV1bcGFyZW50Um93SGFzaF0gPz89IHt9O1xufTtcbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuLyogdjggaWdub3JlIGZpbGUgLS0gQHByZXNlcnZlICovXG5pbXBvcnQgeyBTb2NrZXQgfSBmcm9tICcuL3NvY2tldC50cyc7XG5cbmV4cG9ydCBjbGFzcyBTb2NrZXRNb2NrIGltcGxlbWVudHMgU29ja2V0IHtcbiAgcHVibGljIGNvbm5lY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgZGlzY29ubmVjdGVkOiBib29sZWFuID0gdHJ1ZTtcblxuICBwcml2YXRlIF9saXN0ZW5lcnM6IE1hcDxzdHJpbmcgfCBzeW1ib2wsIEFycmF5PCguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZD4+ID1cbiAgICBuZXcgTWFwKCk7XG4gIHByaXZhdGUgX29uY2VMaXN0ZW5lcnM6IE1hcDxcbiAgICBzdHJpbmcgfCBzeW1ib2wsXG4gICAgQXJyYXk8KC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPlxuICA+ID0gbmV3IE1hcCgpO1xuXG4gIGNvbm5lY3QoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbm5lY3RlZCkge1xuICAgICAgdGhpcy5jb25uZWN0ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5kaXNjb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuZW1pdCgnY29ubmVjdCcpO1xuICAgIH1cbiAgfVxuXG4gIGRpc2Nvbm5lY3QoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29ubmVjdGVkKSB7XG4gICAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5kaXNjb25uZWN0ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5lbWl0KCdkaXNjb25uZWN0Jyk7XG4gICAgfVxuICB9XG5cbiAgb24oZXZlbnROYW1lOiBzdHJpbmcgfCBzeW1ib2wsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiB0aGlzIHtcbiAgICBpZiAoIXRoaXMuX2xpc3RlbmVycy5oYXMoZXZlbnROYW1lKSkge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLnNldChldmVudE5hbWUsIFtdKTtcbiAgICB9XG4gICAgdGhpcy5fbGlzdGVuZXJzLmdldChldmVudE5hbWUpIS5wdXNoKGxpc3RlbmVyKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG9uY2UoZXZlbnROYW1lOiBzdHJpbmcgfCBzeW1ib2wsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiB0aGlzIHtcbiAgICBpZiAoIXRoaXMuX29uY2VMaXN0ZW5lcnMuaGFzKGV2ZW50TmFtZSkpIHtcbiAgICAgIHRoaXMuX29uY2VMaXN0ZW5lcnMuc2V0KGV2ZW50TmFtZSwgW10pO1xuICAgIH1cbiAgICB0aGlzLl9vbmNlTGlzdGVuZXJzLmdldChldmVudE5hbWUpIS5wdXNoKGxpc3RlbmVyKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG9mZihldmVudE5hbWU6IHN0cmluZyB8IHN5bWJvbCwgbGlzdGVuZXI/OiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiB0aGlzIHtcbiAgICBpZiAobGlzdGVuZXIpIHtcbiAgICAgIC8vIFJlbW92ZSBzcGVjaWZpYyBsaXN0ZW5lclxuICAgICAgY29uc3QgcmVndWxhckxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycy5nZXQoZXZlbnROYW1lKTtcbiAgICAgIGlmIChyZWd1bGFyTGlzdGVuZXJzKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gcmVndWxhckxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICByZWd1bGFyTGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgb25jZUxpc3RlbmVycyA9IHRoaXMuX29uY2VMaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgICBpZiAob25jZUxpc3RlbmVycykge1xuICAgICAgICBjb25zdCBpbmRleCA9IG9uY2VMaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgb25jZUxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlbW92ZSBhbGwgbGlzdGVuZXJzIGZvciB0aGUgZXZlbnRcbiAgICAgIHRoaXMuX2xpc3RlbmVycy5kZWxldGUoZXZlbnROYW1lKTtcbiAgICAgIHRoaXMuX29uY2VMaXN0ZW5lcnMuZGVsZXRlKGV2ZW50TmFtZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZW1pdChldmVudE5hbWU6IHN0cmluZyB8IHN5bWJvbCwgLi4uYXJnczogYW55W10pOiBib29sZWFuIHtcbiAgICBsZXQgaGFzTGlzdGVuZXJzID0gZmFsc2U7XG5cbiAgICAvLyBFbWl0IHRvIHJlZ3VsYXIgbGlzdGVuZXJzXG4gICAgY29uc3QgcmVndWxhckxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycy5nZXQoZXZlbnROYW1lKTtcbiAgICBpZiAocmVndWxhckxpc3RlbmVycyAmJiByZWd1bGFyTGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGhhc0xpc3RlbmVycyA9IHRydWU7XG4gICAgICAvLyBDcmVhdGUgYSBjb3B5IHRvIGF2b2lkIGlzc3VlcyBpZiBsaXN0ZW5lcnMgYXJlIHJlbW92ZWQgZHVyaW5nIGVtaXNzaW9uXG4gICAgICBbLi4ucmVndWxhckxpc3RlbmVyc10uZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsaXN0ZW5lciguLi5hcmdzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBJbiBhIHJlYWwgRXZlbnRFbWl0dGVyLCB0aGlzIHdvdWxkIGJlIGhhbmRsZWQgZGlmZmVyZW50bHlcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYEVycm9yIGluIGxpc3RlbmVyIGZvciBldmVudCAke1N0cmluZyhldmVudE5hbWUpfTpgLFxuICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRW1pdCB0byBvbmNlIGxpc3RlbmVycyBhbmQgcmVtb3ZlIHRoZW1cbiAgICBjb25zdCBvbmNlTGlzdGVuZXJzID0gdGhpcy5fb25jZUxpc3RlbmVycy5nZXQoZXZlbnROYW1lKTtcbiAgICBpZiAob25jZUxpc3RlbmVycyAmJiBvbmNlTGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGhhc0xpc3RlbmVycyA9IHRydWU7XG4gICAgICAvLyBDcmVhdGUgYSBjb3B5IGFuZCBjbGVhciB0aGUgb3JpZ2luYWwgYXJyYXlcbiAgICAgIGNvbnN0IGxpc3RlbmVyc1RvQ2FsbCA9IFsuLi5vbmNlTGlzdGVuZXJzXTtcbiAgICAgIHRoaXMuX29uY2VMaXN0ZW5lcnMuZGVsZXRlKGV2ZW50TmFtZSk7XG5cbiAgICAgIGxpc3RlbmVyc1RvQ2FsbC5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxpc3RlbmVyKC4uLmFyZ3MpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBgRXJyb3IgaW4gb25jZSBsaXN0ZW5lciBmb3IgZXZlbnQgJHtTdHJpbmcoZXZlbnROYW1lKX06YCxcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBoYXNMaXN0ZW5lcnM7XG4gIH1cblxuICByZW1vdmVBbGxMaXN0ZW5lcnMoZXZlbnROYW1lPzogc3RyaW5nIHwgc3ltYm9sKTogdGhpcyB7XG4gICAgaWYgKGV2ZW50TmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMuZGVsZXRlKGV2ZW50TmFtZSk7XG4gICAgICB0aGlzLl9vbmNlTGlzdGVuZXJzLmRlbGV0ZShldmVudE5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMuY2xlYXIoKTtcbiAgICAgIHRoaXMuX29uY2VMaXN0ZW5lcnMuY2xlYXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBsaXN0ZW5lckNvdW50KGV2ZW50TmFtZTogc3RyaW5nIHwgc3ltYm9sKTogbnVtYmVyIHtcbiAgICBjb25zdCByZWd1bGFyQ291bnQgPSB0aGlzLl9saXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk/Lmxlbmd0aCB8fCAwO1xuICAgIGNvbnN0IG9uY2VDb3VudCA9IHRoaXMuX29uY2VMaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk/Lmxlbmd0aCB8fCAwO1xuICAgIHJldHVybiByZWd1bGFyQ291bnQgKyBvbmNlQ291bnQ7XG4gIH1cblxuICBsaXN0ZW5lcnMoZXZlbnROYW1lOiBzdHJpbmcgfCBzeW1ib2wpOiBBcnJheTwoLi4uYXJnczogYW55W10pID0+IHZvaWQ+IHtcbiAgICBjb25zdCByZWd1bGFyTGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzLmdldChldmVudE5hbWUpIHx8IFtdO1xuICAgIGNvbnN0IG9uY2VMaXN0ZW5lcnMgPSB0aGlzLl9vbmNlTGlzdGVuZXJzLmdldChldmVudE5hbWUpIHx8IFtdO1xuICAgIHJldHVybiBbLi4ucmVndWxhckxpc3RlbmVycywgLi4ub25jZUxpc3RlbmVyc107XG4gIH1cblxuICBldmVudE5hbWVzKCk6IEFycmF5PHN0cmluZyB8IHN5bWJvbD4ge1xuICAgIGNvbnN0IGFsbEV2ZW50cyA9IG5ldyBTZXQoW1xuICAgICAgLi4udGhpcy5fbGlzdGVuZXJzLmtleXMoKSxcbiAgICAgIC4uLnRoaXMuX29uY2VMaXN0ZW5lcnMua2V5cygpLFxuICAgIF0pO1xuICAgIHJldHVybiBBcnJheS5mcm9tKGFsbEV2ZW50cyk7XG4gIH1cblxuICAvLyBUZXN0IGhlbHBlciBtZXRob2RzXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgdGhpcy5kaXNjb25uZWN0ZWQgPSB0cnVlO1xuICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gIH1cblxuICBzaW11bGF0ZUVycm9yKGVycm9yOiBFcnJvcik6IHZvaWQge1xuICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnJvcik7XG4gIH1cblxuICBzaW11bGF0ZU1lc3NhZ2UobWVzc2FnZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5lbWl0KCdtZXNzYWdlJywgbWVzc2FnZSk7XG4gIH1cblxuICAvLyBHZXQgaW50ZXJuYWwgc3RhdGUgZm9yIHRlc3RpbmdcbiAgZ2V0TGlzdGVuZXJzKCk6IE1hcDxzdHJpbmcgfCBzeW1ib2wsIEFycmF5PCguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZD4+IHtcbiAgICByZXR1cm4gbmV3IE1hcCh0aGlzLl9saXN0ZW5lcnMpO1xuICB9XG5cbiAgZ2V0T25jZUxpc3RlbmVycygpOiBNYXA8c3RyaW5nIHwgc3ltYm9sLCBBcnJheTwoLi4uYXJnczogYW55W10pID0+IHZvaWQ+PiB7XG4gICAgcmV0dXJuIG5ldyBNYXAodGhpcy5fb25jZUxpc3RlbmVycyk7XG4gIH1cbn1cblxuLy8gLi4uZXhpc3RpbmcgY29kZS4uLlxuIiwiLy8gQGxpY2Vuc2Vcbi8vIENvcHlyaWdodCAoYykgMjAyNSBSbGpzb25cbi8vXG4vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0ZXJtcyB0aGF0IGNhbiBiZVxuLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHBhY2thZ2UuXG5cbi8vSW50ZXJmYWNlIGZvciBhIGdlbmVyaWMgU29ja2V0LCBzaW1pbGFyIHRvIE5vZGUuanMgRXZlbnRFbWl0dGVyXG4vL1RoaXMgaXMgYSBzaW1wbGlmaWVkIHZlcnNpb24gYW5kIG1heSBub3QgY292ZXIgYWxsIGZlYXR1cmVzIG9mIGEgZnVsbCBFdmVudEVtaXR0ZXJcbmV4cG9ydCBpbnRlcmZhY2UgU29ja2V0IHtcbiAgY29ubmVjdGVkOiBib29sZWFuO1xuICBkaXNjb25uZWN0ZWQ6IGJvb2xlYW47XG4gIGNvbm5lY3QoKTogdm9pZDtcbiAgZGlzY29ubmVjdCgpOiB2b2lkO1xuICBvbihldmVudE5hbWU6IHN0cmluZyB8IHN5bWJvbCwgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCk6IHRoaXM7XG4gIGVtaXQoZXZlbnROYW1lOiBzdHJpbmcgfCBzeW1ib2wsIC4uLmFyZ3M6IGFueVtdKTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IHNvY2tldEV4YW1wbGUgPSAoKTogU29ja2V0ID0+ICh7XG4gIGNvbm5lY3RlZDogZmFsc2UsXG4gIGRpc2Nvbm5lY3RlZDogdHJ1ZSxcbiAgY29ubmVjdCgpIHtcbiAgICB0aGlzLmNvbm5lY3RlZCA9IHRydWU7XG4gICAgdGhpcy5kaXNjb25uZWN0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnKTtcbiAgfSxcbiAgZGlzY29ubmVjdCgpIHtcbiAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgIHRoaXMuZGlzY29ubmVjdGVkID0gdHJ1ZTtcbiAgICB0aGlzLmVtaXQoJ2Rpc2Nvbm5lY3QnKTtcbiAgfSxcbiAgLyogdjggaWdub3JlIG5leHQgLS0gQHByZXNlcnZlICovXG4gIG9uKCkge1xuICAgIC8vIEltcGxlbWVudGF0aW9uIG9mIGV2ZW50IGxpc3RlbmVyIHJlZ2lzdHJhdGlvblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICAvKiB2OCBpZ25vcmUgbmV4dCAtLSBAcHJlc2VydmUgKi9cbiAgZW1pdCgpIHtcbiAgICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBldmVudCBlbWlzc2lvblxuICAgIHJldHVybiB0cnVlO1xuICB9LFxufSk7XG4iXSwibmFtZXMiOlsiZSJdLCJtYXBwaW5ncyI6Ijs7OztBQU1PLE1BQU0sZ0JBQWdCO0FBQUE7QUFBQSxFQUVwQixtQkFBMkI7QUFBQSxFQUMzQixjQUFzQjtBQUFBLEVBQ3RCLGFBQXFCO0FBQUEsRUFDckIsWUFBb0I7QUFBQTtBQUFBLEVBR3BCLGFBQXdDO0FBQUEsSUFDN0MsTUFBTTtBQUFBLElBQ04sVUFBVTtBQUFBLEVBQUE7QUFBQTtBQUFBLEVBSUosVUFBcUM7QUFBQSxJQUMzQyxLQUFLO0FBQUEsSUFDTCxLQUFLO0FBQUEsSUFDTCxLQUFLO0FBQUEsRUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtDLFFBQVEsTUFBYyxLQUFxQjtBQUNqRCxXQUFPLEtBQUssU0FBUyxHQUFHLElBQUksT0FB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
1380
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW8uanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9pby1kYi1uYW1lLW1hcHBpbmcudHMiLCIuLi9zcmMvaW8tdG9vbHMudHMiLCIuLi9zcmMvaW8tbWVtLnRzIiwiLi4vc3JjL3BlZXItc29ja2V0LW1vY2sudHMiLCIuLi9zcmMvaW8tcGVlci50cyIsIi4uL3NyYy9pby1tdWx0aS50cyIsIi4uL3NyYy9pby10ZXN0LXNldHVwLnRzIiwiLi4vc3JjL2lvLnRzIiwiLi4vc3JjL3JldmVyc2UtcmVmLnRzIiwiLi4vc3JjL3NvY2tldC1tb2NrLnRzIiwiLi4vc3JjL3NvY2tldC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuZXhwb3J0IGNsYXNzIElvRGJOYW1lTWFwcGluZyB7XG4gIC8vIFRoZSBwcmltYXJ5IGtleSBjb2x1bW4gaXMgYWx3YXlzIG5hbWVkICdfaGFzaCdcbiAgcHVibGljIHByaW1hcnlLZXlDb2x1bW46IHN0cmluZyA9ICdfaGFzaCc7XG4gIHB1YmxpYyBkYXRhU2VjdGlvbjogc3RyaW5nID0gJ19kYXRhJztcbiAgcHVibGljIHR5cGVDb2x1bW46IHN0cmluZyA9ICd0eXBlJztcbiAgcHVibGljIGtleUNvbHVtbjogc3RyaW5nID0gJ2tleSc7XG5cbiAgLy8gTmFtZXMgZm9yIHRoZSBtYWluIHRhYmxlcyBpbiB0aGUgZGF0YWJhc2VcbiAgcHVibGljIHRhYmxlTmFtZXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgbWFpbjogJ3RhYmxlQ2ZncycsXG4gICAgcmV2aXNpb246ICdyZXZpc2lvbnMnLFxuICB9O1xuXG4gIC8vLyBTdWZmaXggaGFuZGxpbmcgZm9yIHRoZSBkYXRhYmFzZVxuICBwcml2YXRlIF9zdWZmaXg6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgY29sOiAnX2NvbCcsXG4gICAgdGJsOiAnX3RibCcsXG4gICAgdG1wOiAnX3RtcCcsXG4gIH07XG5cbiAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgLy8gYWRkIGFuZCByZW1vdmUgc3VmZml4ZXMgZm9yIHVzZSBpbiBTUUwgc3RhdGVtZW50c1xuICBwcml2YXRlIF9hZGRGaXgobmFtZTogc3RyaW5nLCBmaXg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5hbWUuZW5kc1dpdGgoZml4KSA/IG5hbWUgOiBuYW1lICsgZml4O1xuICB9XG5cbiAgcHVibGljIGFkZFRhYmxlU3VmZml4KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZEZpeChuYW1lLCB0aGlzLl9zdWZmaXgudGJsKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRDb2x1bW5TdWZmaXgobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkRml4KG5hbWUsIHRoaXMuX3N1ZmZpeC5jb2wpO1xuICB9XG5cbiAgcHVibGljIGFkZFRtcFN1ZmZpeChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hZGRGaXgobmFtZSwgdGhpcy5fc3VmZml4LnRtcCk7XG4gIH1cblxuICBwcml2YXRlIF9yZW1vdmVGaXgobmFtZTogc3RyaW5nLCBmaXg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5hbWUuZW5kc1dpdGgoZml4KSA/IG5hbWUuc2xpY2UoMCwgLWZpeC5sZW5ndGgpIDogbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVUYWJsZVN1ZmZpeChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9yZW1vdmVGaXgobmFtZSwgdGhpcy5fc3VmZml4LnRibCk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlQ29sdW1uU3VmZml4KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3JlbW92ZUZpeChuYW1lLCB0aGlzLl9zdWZmaXguY29sKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVUbXBTdWZmaXgobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcmVtb3ZlRml4KG5hbWUsIHRoaXMuX3N1ZmZpeC50bXApO1xuICB9XG59XG4iLCIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgaGlwIH0gZnJvbSAnQHJsanNvbi9oYXNoJztcbmltcG9ydCB7XG4gIGl0ZXJhdGVUYWJsZXMsXG4gIFJsanNvbixcbiAgVGFibGVDZmcsXG4gIFRhYmxlS2V5LFxuICBUYWJsZVR5cGUsXG4gIHRocm93T25JbnZhbGlkVGFibGVDZmcsXG4gIHZhbGlkYXRlUmxqc29uQWdhaW5zdFRhYmxlQ2ZnLFxufSBmcm9tICdAcmxqc29uL3JsanNvbic7XG5cbmltcG9ydCB7IElvTWVtIH0gZnJvbSAnLi9pby1tZW0udHMnO1xuaW1wb3J0IHsgSW8gfSBmcm9tICcuL2lvLnRzJztcblxuZXhwb3J0IHR5cGUgSW9PYnNlcnZlciA9IChkYXRhOiBSbGpzb24pID0+IHZvaWQ7XG5cbi8qKlxuICogUHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHRoZSBJbyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBJb1Rvb2xzIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSBpbyBUaGUgSW8gaW50ZXJmYWNlIHRvIHVzZVxuICAgKi9cbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGlvOiBJbykge31cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGFibGUgY29uZmlndXJhdGlvbiBvZiB0aGUgdGFibGVDZmdzIHRhYmxlLlxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZUNmZ3NUYWJsZUNmZygpIHtcbiAgICBjb25zdCB0YWJsZUNmZyA9IGhpcDxUYWJsZUNmZz4oe1xuICAgICAgX2hhc2g6ICcnLFxuICAgICAga2V5OiAndGFibGVDZmdzJyxcbiAgICAgIHR5cGU6ICd0YWJsZUNmZ3MnLFxuICAgICAgaXNIZWFkOiBmYWxzZSxcbiAgICAgIGlzUm9vdDogZmFsc2UsXG4gICAgICBpc1NoYXJlZDogdHJ1ZSxcbiAgICAgIHByZXZpb3VzOiAnJyxcblxuICAgICAgY29sdW1uczogW1xuICAgICAgICB7XG4gICAgICAgICAga2V5OiAnX2hhc2gnLFxuICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgIHRpdGxlU2hvcnQ6ICdIYXNoJyxcbiAgICAgICAgICB0aXRsZUxvbmc6ICdSb3cgSGFzaCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBrZXk6ICdrZXknLFxuICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgIHRpdGxlU2hvcnQ6ICdLZXknLFxuICAgICAgICAgIHRpdGxlTG9uZzogJ1RhYmxlIEtleScsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBrZXk6ICd0eXBlJyxcbiAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICB0aXRsZVNob3J0OiAnVHlwZScsXG4gICAgICAgICAgdGl0bGVMb25nOiAnQ29udGVudCBUeXBlJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGtleTogJ2lzSGVhZCcsXG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgIHRpdGxlU2hvcnQ6ICdJcyBIZWFkJyxcbiAgICAgICAgICB0aXRsZUxvbmc6ICdJcyBIZWFkIFRhYmxlJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGtleTogJ2lzUm9vdCcsXG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgIHRpdGxlU2hvcnQ6ICdJcyBSb290JyxcbiAgICAgICAgICB0aXRsZUxvbmc6ICdJcyBSb290IFRhYmxlJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGtleTogJ2lzU2hhcmVkJyxcbiAgICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgICAgdGl0bGVTaG9ydDogJ0lzIFNoYXJlZCcsXG4gICAgICAgICAgdGl0bGVMb25nOiAnSXMgU2hhcmVkIFRhYmxlJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGtleTogJ3ByZXZpb3VzJyxcbiAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICB0aXRsZVNob3J0OiAnUHJldmlvdXMnLFxuICAgICAgICAgIHRpdGxlTG9uZzogJ1ByZXZpb3VzIFRhYmxlIENvbmZpZ3VyYXRpb24gSGFzaCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBrZXk6ICdjb2x1bW5zJyxcbiAgICAgICAgICB0eXBlOiAnanNvbkFycmF5JyxcbiAgICAgICAgICB0aXRsZVNob3J0OiAnQ29sdW1ucycsXG4gICAgICAgICAgdGl0bGVMb25nOiAnQ29sdW1uIENvbmZpZ3VyYXRpb25zJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGFibGVDZmc7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIHJldmlzaW9ucyB0YWJsZS5cbiAgICovXG4gIGluaXRSZXZpc2lvbnNUYWJsZSA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZUNmZzogVGFibGVDZmcgPSB7XG4gICAgICBrZXk6ICdyZXZpc2lvbnMnLFxuICAgICAgdHlwZTogJ3JldmlzaW9ucycsXG4gICAgICBpc0hlYWQ6IHRydWUsXG4gICAgICBpc1Jvb3Q6IHRydWUsXG4gICAgICBpc1NoYXJlZDogZmFsc2UsXG5cbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGtleTogJ19oYXNoJyxcbiAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICB0aXRsZVNob3J0OiAnSGFzaCcsXG4gICAgICAgICAgdGl0bGVMb25nOiAnUm93IEhhc2gnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAga2V5OiAndGFibGUnLFxuICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgIHRpdGxlU2hvcnQ6ICdUYWJsZScsXG4gICAgICAgICAgdGl0bGVMb25nOiAnVGFibGUgS2V5JyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGtleTogJ3ByZWRlY2Vzc29yJyxcbiAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICB0aXRsZVNob3J0OiAnUHJlZGVjZXNzb3InLFxuICAgICAgICAgIHRpdGxlTG9uZzogJ1ByZWRlY2Vzc29yIFJldmlzaW9uIEhhc2gnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAga2V5OiAnc3VjY2Vzc29yJyxcbiAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICB0aXRsZVNob3J0OiAnU3VjY2Vzc29yJyxcbiAgICAgICAgICB0aXRsZUxvbmc6ICdTdWNjZXNzb3IgUmV2aXNpb24gSGFzaCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBrZXk6ICd0aW1lc3RhbXAnLFxuICAgICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICAgIHRpdGxlU2hvcnQ6ICdUaW1lc3RhbXAnLFxuICAgICAgICAgIHRpdGxlTG9uZzogJ1JldmlzaW9uIFRpbWVzdGFtcCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBrZXk6ICdpZCcsXG4gICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgdGl0bGVTaG9ydDogJ0lEJyxcbiAgICAgICAgICB0aXRsZUxvbmc6ICdSZXZpc2lvbiBJRCcsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG5cbiAgICBhd2FpdCB0aGlzLmlvLmNyZWF0ZU9yRXh0ZW5kVGFibGUoeyB0YWJsZUNmZyB9KTtcbiAgfTtcblxuICAvKipcbiAgICogRXhhbXBsZSBvYmplY3QgZm9yIHRlc3QgcHVycG9zZXNcbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgaW8gdG9vbHNcbiAgICovXG4gIHN0YXRpYyBleGFtcGxlID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGlvID0gYXdhaXQgSW9NZW0uZXhhbXBsZSgpO1xuICAgIGF3YWl0IGlvLmluaXQoKTtcbiAgICBhd2FpdCBpby5pc1JlYWR5KCk7XG4gICAgcmV0dXJuIG5ldyBJb1Rvb2xzKGlvKTtcbiAgfTtcblxuICAvKipcbiAgICogVGhyb3dzIGlmIHRoZSB0YWJsZSBkb2VzIG5vdCBleGlzdFxuICAgKi9cbiAgYXN5bmMgdGhyb3dXaGVuVGFibGVEb2VzTm90RXhpc3QodGFibGU6IFRhYmxlS2V5KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZXhpc3RzID0gYXdhaXQgdGhpcy5pby50YWJsZUV4aXN0cyh0YWJsZSk7XG4gICAgaWYgKCFleGlzdHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgXCIke3RhYmxlfVwiIG5vdCBmb3VuZGApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgaWYgYW55IG9mIHRoZSB0YWJsZXMgaW4gcmxqc29uIGRvIG5vdCBleGlzdFxuICAgKiBAcGFyYW0gcmxqc29uIC0gVGhlIFJsanNvbiBvYmplY3QgdG8gY2hlY2tcbiAgICovXG4gIGFzeW5jIHRocm93V2hlblRhYmxlc0RvTm90RXhpc3Qocmxqc29uOiBSbGpzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgaXRlcmF0ZVRhYmxlcyhybGpzb24sIGFzeW5jICh0YWJsZUtleSkgPT4ge1xuICAgICAgICBjb25zdCBleGlzdHMgPSBhd2FpdCB0aGlzLmlvLnRhYmxlRXhpc3RzKHRhYmxlS2V5KTtcbiAgICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlIFwiJHt0YWJsZUtleX1cIiBub3QgZm91bmRgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgbWlzc2luZ1RhYmxlcyA9IChlIGFzIEFycmF5PGFueT4pLm1hcCgoZSkgPT4gZS50YWJsZUtleSk7XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBmb2xsb3dpbmcgdGFibGVzIGRvIG5vdCBleGlzdDogJHttaXNzaW5nVGFibGVzLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdGFibGUgY2ZncyBvZiBhbGwgdGFibGVzXG4gICAqIEByZXR1cm5zIFRoZSB0YWJsZSBjb25maWd1cmF0aW9uIG9mIGFsbCB0YWJsZXNcbiAgICovXG4gIGFzeW5jIHRhYmxlQ2ZncygpOiBQcm9taXNlPFRhYmxlQ2ZnW10+IHtcbiAgICBjb25zdCB0YWJsZXMgPSBhd2FpdCB0aGlzLmlvLnJhd1RhYmxlQ2ZncygpO1xuXG4gICAgLy8gVGFrZSB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgZWFjaCB0eXBlIGtleVxuICAgIGNvbnN0IG5ld2VzdFZlcnNpb246IFJlY29yZDxUYWJsZUtleSwgVGFibGVDZmc+ID0ge307XG4gICAgZm9yIChsZXQgaSA9IHRhYmxlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgdGFibGUgPSB0YWJsZXNbaV07XG4gICAgICBjb25zdCBleGlzdGluZyA9IG5ld2VzdFZlcnNpb25bdGFibGUua2V5XTtcbiAgICAgIGlmICghZXhpc3RpbmcgfHwgZXhpc3RpbmcuY29sdW1ucy5sZW5ndGggPCB0YWJsZS5jb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICBuZXdlc3RWZXJzaW9uW3RhYmxlLmtleV0gPSB0YWJsZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTb3J0IHRoZSB0YWJsZXMgYnkga2V5XG4gICAgLyogdjggaWdub3JlIG5leHQgLS0gQHByZXNlcnZlICovXG4gICAgY29uc3QgcmVzdWx0RGF0YSA9IE9iamVjdC52YWx1ZXMobmV3ZXN0VmVyc2lvbikuc29ydCgoYSwgYikgPT4ge1xuICAgICAgaWYgKGEua2V5IDwgYi5rZXkpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgaWYgKGEua2V5ID4gYi5rZXkpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAwO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHREYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IHdpdGggYWxsIHRhYmxlIG5hbWVzXG4gICAqL1xuICBhc3luYyBhbGxUYWJsZUtleXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IChhd2FpdCB0aGlzLnRhYmxlQ2ZncygpKS5tYXAoKGUpID0+IGUua2V5KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBnaXZlbiB0YWJsZVxuICAgKi9cbiAgYXN5bmMgdGFibGVDZmcodGFibGU6IFRhYmxlS2V5KTogUHJvbWlzZTxUYWJsZUNmZz4ge1xuICAgIGNvbnN0IHRhYmxlQ2ZnID0gYXdhaXQgdGhpcy50YWJsZUNmZ09yTnVsbCh0YWJsZSk7XG4gICAgaWYgKCF0YWJsZUNmZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBcIiR7dGFibGV9XCIgbm90IGZvdW5kYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhYmxlQ2ZnITtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgZ2l2ZW4gdGFibGUgb3IgbnVsbCBpZiBpdCBkb2VzIG5vdCBleGlzdC5cblxuICAgKi9cbiAgYXN5bmMgdGFibGVDZmdPck51bGwodGFibGU6IFRhYmxlS2V5KTogUHJvbWlzZTxUYWJsZUNmZyB8IG51bGw+IHtcbiAgICBjb25zdCB0YWJsZUNmZ3MgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZncygpO1xuICAgIGNvbnN0IHRhYmxlQ2ZnID0gdGFibGVDZmdzLmZpbmQoKGUpID0+IGUua2V5ID09PSB0YWJsZSk7XG4gICAgcmV0dXJuIHRhYmxlQ2ZnID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIGNvbHVtbiBuYW1lcyBvZiBhIGdpdmVuIHRhYmxlXG4gICAqL1xuICBhc3luYyBhbGxDb2x1bW5LZXlzKHRhYmxlOiBUYWJsZUtleSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCB0YWJsZUNmZyA9IGF3YWl0IHRoaXMudGFibGVDZmcodGFibGUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRhYmxlQ2ZnLmNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5rZXkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIHdoZW4gYSBjb2x1bW4gZG9lcyBub3QgZXhpc3QgaW4gYSBnaXZlbiB0YWJsZVxuICAgKiBAcGFyYW0gdGFibGUgLSBUaGUgdGFibGUgdG8gY2hlY2tcbiAgICogQHBhcmFtIGNvbHVtbnMgLSBUaGUgY29sdW1uIHRvIGNoZWNrXG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5Db2x1bW5Eb2VzTm90RXhpc3QoXG4gICAgdGFibGU6IFRhYmxlS2V5LFxuICAgIGNvbHVtbnM6IHN0cmluZ1tdLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0YWJsZUNmZyA9IGF3YWl0IHRoaXMudGFibGVDZmcodGFibGUpO1xuICAgIGNvbnN0IGNvbHVtbktleXMgPSB0YWJsZUNmZy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ua2V5KTtcbiAgICBjb25zdCBtaXNzaW5nQ29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKFxuICAgICAgKGNvbHVtbikgPT4gIWNvbHVtbktleXMuaW5jbHVkZXMoY29sdW1uKSxcbiAgICApO1xuICAgIGlmIChtaXNzaW5nQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgZm9sbG93aW5nIGNvbHVtbnMgZG8gbm90IGV4aXN0IGluIHRhYmxlIFwiJHt0YWJsZX1cIjogJHttaXNzaW5nQ29sdW1ucy5qb2luKFxuICAgICAgICAgICcsICcsXG4gICAgICAgICl9LmAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3Mgd2hlbiBhIHRhYmxlIHVwZGF0ZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHRhYmxlXG4gICAqIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5UYWJsZUlzTm90Q29tcGF0aWJsZSh1cGRhdGU6IFRhYmxlQ2ZnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJlZml4ID0gYEludmFsaWQgdXBkYXRlIG9mIHRhYmxlIGFibGUgXCIke3VwZGF0ZS5rZXl9XCJgO1xuXG4gICAgdGhyb3dPbkludmFsaWRUYWJsZUNmZyh1cGRhdGUpO1xuXG4gICAgLy8gQ2hlY2sgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIHRhYmxlXG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZnT3JOdWxsKHVwZGF0ZS5rZXkpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgLy8gSGF2ZSBjb2x1bW5zIGJlZW4gZGVsZXRlZD9cbiAgICAgIGlmIChleGlzdGluZy5jb2x1bW5zLmxlbmd0aCA+IHVwZGF0ZS5jb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBkZWxldGVkQ29sdW1uS2V5cyA9IGV4aXN0aW5nLmNvbHVtbnNcbiAgICAgICAgICAubWFwKChjb2x1bW4pID0+IGNvbHVtbi5rZXkpXG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIChrZXkpID0+ICF1cGRhdGUuY29sdW1ucy5zb21lKChjb2x1bW4pID0+IGNvbHVtbi5rZXkgPT09IGtleSksXG4gICAgICAgICAgKTtcbiAgICAgICAgLyogdjggaWdub3JlIG5leHQgLS0gQHByZXNlcnZlICovXG4gICAgICAgIGlmIChkZWxldGVkQ29sdW1uS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgZGVsZXRlZENvbHVtbnMgPSBkZWxldGVkQ29sdW1uS2V5cy5qb2luKCcsICcpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGAke3ByZWZpeH06IENvbHVtbnMgbXVzdCBub3QgYmUgZGVsZXRlZC4gYCArXG4gICAgICAgICAgICAgIGBEZWxldGVkIGNvbHVtbnM6ICR7ZGVsZXRlZENvbHVtbnN9fWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIYXZlIGNvbHVtbiBrZXlzIGNoYW5nZWQ/XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4aXN0aW5nLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYmVmb3JlID0gZXhpc3RpbmcuY29sdW1uc1tpXS5rZXk7XG4gICAgICAgIGNvbnN0IGFmdGVyID0gdXBkYXRlLmNvbHVtbnNbaV0ua2V5O1xuICAgICAgICBpZiAoYmVmb3JlICE9PSBhZnRlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGAke3ByZWZpeH06IGAgK1xuICAgICAgICAgICAgICBgQ29sdW1uIGtleXMgbXVzdCBub3QgY2hhbmdlISBgICtcbiAgICAgICAgICAgICAgYENvbHVtbiBcIiR7YmVmb3JlfVwiIHdhcyByZW5hbWVkIGludG8gXCIke2FmdGVyfVwiLmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIYXZlIGNvbHVtbiB0eXBlcyBjaGFuZ2VkP1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleGlzdGluZy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IGV4aXN0aW5nLmNvbHVtbnNbaV0ua2V5O1xuICAgICAgICBjb25zdCBiZWZvcmUgPSBleGlzdGluZy5jb2x1bW5zW2ldLnR5cGU7XG4gICAgICAgIGNvbnN0IGFmdGVyID0gdXBkYXRlLmNvbHVtbnNbaV0udHlwZTtcbiAgICAgICAgaWYgKGJlZm9yZSAhPT0gYWZ0ZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgJHtwcmVmaXh9OiBgICtcbiAgICAgICAgICAgICAgYENvbHVtbiB0eXBlcyBtdXN0IG5vdCBjaGFuZ2UhIGAgK1xuICAgICAgICAgICAgICBgVHlwZSBvZiBjb2x1bW4gXCIke2NvbHVtbn1cIiB3YXMgY2hhbmdlZCBmcm9tIFwiJHtiZWZvcmV9XCIgdG8gJHthZnRlcn0uYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBpZiB0aGUgZGF0YSBpbiB0aGUgdGFibGUgZG8gbm90IG1hdGNoIHRoZSB0YWJsZSBjb25maWd1cmF0aW9uXG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5UYWJsZURhdGFEb2VzTm90TWF0Y2hDZmcoZGF0YTogUmxqc29uKSB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgYXdhaXQgaXRlcmF0ZVRhYmxlcyhkYXRhLCBhc3luYyAodGFibGVLZXkpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlQ2ZnID0gYXdhaXQgdGhpcy50YWJsZUNmZyh0YWJsZUtleSk7XG4gICAgICBjb25zdCB0YWJsZSA9IGRhdGFbdGFibGVLZXldO1xuXG4gICAgICAvLyBJZ25vcmUgdGFibGVDZmdzIHRhYmxlXG4gICAgICAvKiB2OCBpZ25vcmUgbmV4dCAtLSBAcHJlc2VydmUgKi9cbiAgICAgIGlmICh0YWJsZS5fdHlwZSA9PT0gJ3RhYmxlQ2ZncycpIHJldHVybjtcblxuICAgICAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVSbGpzb25BZ2FpbnN0VGFibGVDZmcodGFibGUuX2RhdGEsIHRhYmxlQ2ZnKSk7XG4gICAgfSk7XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRhYmxlIGRhdGEgZG9lcyBub3QgbWF0Y2ggdGhlIGNvbmZpZ3VyYXRpb24uXFxuXFxuRXJyb3JzOlxcbiR7ZXJyb3JzXG4gICAgICAgICAgLm1hcCgoZSkgPT4gYC0gJHtlfWApXG4gICAgICAgICAgLmpvaW4oJ1xcbicpfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTb3J0cyB0aGUgZGF0YSBvZiBhIHRhYmxlIGJ5IHRoZSBoYXNoIGFuZCB1cGRhdGVzIHRoZSB0YWJsZSBoYXNoIGluIHBsYWNlXG4gICAqL1xuICBzb3J0VGFibGVEYXRhQW5kVXBkYXRlSGFzaCh0YWJsZTogVGFibGVUeXBlKTogdm9pZCB7XG4gICAgdGFibGUuX2RhdGEuc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgaGFzaEEgPSBhLl9oYXNoIGFzIHN0cmluZztcbiAgICAgIGNvbnN0IGhhc2hCID0gYi5faGFzaCBhcyBzdHJpbmc7XG4gICAgICAvKiB2OCBpZ25vcmUgbmV4dCAtLSBAcHJlc2VydmUgKi9cbiAgICAgIGlmIChoYXNoQSA8IGhhc2hCKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIC8qIHY4IGlnbm9yZSBuZXh0IC0tIEBwcmVzZXJ2ZSAqL1xuICAgICAgaWYgKGhhc2hBID4gaGFzaEIpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG5cbiAgICAgIC8qIHY4IGlnbm9yZSBuZXh0IC0tIEBwcmVzZXJ2ZSAqL1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSk7XG5cbiAgICB0YWJsZS5faGFzaCA9ICcnO1xuICAgIGhpcCh0YWJsZSwge1xuICAgICAgdXBkYXRlRXhpc3RpbmdIYXNoZXM6IGZhbHNlLFxuICAgICAgdGhyb3dPbldyb25nSGFzaGVzOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxufVxuIiwiLy8gQGxpY2Vuc2Vcbi8vIENvcHlyaWdodCAoYykgMjAyNSBSbGpzb25cbi8vXG4vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0ZXJtcyB0aGF0IGNhbiBiZVxuLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHBhY2thZ2UuXG5cbmltcG9ydCB7IGhpcCwgaHNoIH0gZnJvbSAnQHJsanNvbi9oYXNoJztcbmltcG9ydCB7IElzUmVhZHkgfSBmcm9tICdAcmxqc29uL2lzLXJlYWR5JztcbmltcG9ydCB7IGNvcHksIGVxdWFscywgSnNvblZhbHVlIH0gZnJvbSAnQHJsanNvbi9qc29uJztcbmltcG9ydCB7XG4gIENvbnRlbnRUeXBlLFxuICBpdGVyYXRlVGFibGVzU3luYyxcbiAgUmxqc29uLFxuICBUYWJsZUNmZyxcbiAgVGFibGVLZXksXG4gIFRhYmxlVHlwZSxcbn0gZnJvbSAnQHJsanNvbi9ybGpzb24nO1xuXG5pbXBvcnQgeyBJb1Rvb2xzIH0gZnJvbSAnLi9pby10b29scy50cyc7XG5pbXBvcnQgeyBJbyB9IGZyb20gJy4vaW8udHMnO1xuXG4vKipcbiAqIEluLU1lbW9yeSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUmxqc29uIElvIGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIElvTWVtIGltcGxlbWVudHMgSW8ge1xuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gQ29uc3RydWN0b3IgJiBleGFtcGxlXG5cbiAgaW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLl9pc09wZW4gPSB0cnVlO1xuICAgIHJldHVybiB0aGlzLl9pbml0KCk7XG4gIH1cblxuICBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLl9pc09wZW4gPSBmYWxzZTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc09wZW47XG4gIH1cblxuICBzdGF0aWMgZXhhbXBsZSA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbyA9IG5ldyBJb01lbSgpO1xuICAgIGF3YWl0IGlvLmluaXQoKTtcbiAgICByZXR1cm4gaW87XG4gIH07XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIEdlbmVyYWxcbiAgaXNSZWFkeSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNSZWFkeS5wcm9taXNlO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIER1bXBcblxuICBkdW1wKCk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgcmV0dXJuIHRoaXMuX2R1bXAoKTtcbiAgfVxuXG4gIGFzeW5jIGR1bXBUYWJsZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgcmV0dXJuIHRoaXMuX2R1bXBUYWJsZShyZXF1ZXN0KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBNZXRhIERhdGFcblxuICBhc3luYyBjb250ZW50VHlwZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Q29udGVudFR5cGU+IHtcbiAgICByZXR1cm4gdGhpcy5fY29udGVudFR5cGUocmVxdWVzdCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gUm93c1xuXG4gIHJlYWRSb3dzKHJlcXVlc3Q6IHtcbiAgICB0YWJsZTogc3RyaW5nO1xuICAgIHdoZXJlOiB7IFtjb2x1bW46IHN0cmluZ106IEpzb25WYWx1ZSB9O1xuICB9KTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZFJvd3MocmVxdWVzdCk7XG4gIH1cblxuICBhc3luYyByb3dDb3VudCh0YWJsZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB0YWJsZURhdGEgPSB0aGlzLl9tZW1bdGFibGVdIGFzIFRhYmxlVHlwZTtcbiAgICBpZiAoIXRhYmxlRGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBcIiR7dGFibGV9XCIgbm90IGZvdW5kYCk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGFibGVEYXRhLl9kYXRhLmxlbmd0aCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gV3JpdGVcblxuICB3cml0ZShyZXF1ZXN0OiB7IGRhdGE6IFJsanNvbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRlKHJlcXVlc3QpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFRhYmxlIG1hbmFnZW1lbnRcbiAgYXN5bmMgdGFibGVFeGlzdHModGFibGVLZXk6IFRhYmxlS2V5KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLl9tZW1bdGFibGVLZXldIGFzIFRhYmxlVHlwZTtcbiAgICByZXR1cm4gdGFibGUgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICBjcmVhdGVPckV4dGVuZFRhYmxlKHJlcXVlc3Q6IHsgdGFibGVDZmc6IFRhYmxlQ2ZnIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0KTtcbiAgfVxuXG4gIGFzeW5jIHJhd1RhYmxlQ2ZncygpOiBQcm9taXNlPFRhYmxlQ2ZnW10+IHtcbiAgICBjb25zdCB0YWJsZXMgPSB0aGlzLl9tZW0udGFibGVDZmdzLl9kYXRhIGFzIFRhYmxlQ2ZnW107XG4gICAgcmV0dXJuIHRhYmxlcztcbiAgfVxuXG4gIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiAgLy8gUHJpdmF0ZVxuICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cbiAgcHJpdmF0ZSBfaW9Ub29scyE6IElvVG9vbHM7XG5cbiAgcHJpdmF0ZSBfaXNSZWFkeSA9IG5ldyBJc1JlYWR5KCk7XG4gIHByaXZhdGUgX2lzT3BlbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX21lbTogUmxqc29uID0gaGlwKHt9IGFzIFJsanNvbik7XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX2luaXQoKSB7XG4gICAgdGhpcy5faW9Ub29scyA9IG5ldyBJb1Rvb2xzKHRoaXMpO1xuICAgIHRoaXMuX2luaXRUYWJsZUNmZ3MoKTtcbiAgICB0aGlzLl91cGRhdGVHbG9iYWxIYXNoKCk7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy5pbml0UmV2aXNpb25zVGFibGUoKTtcbiAgICBoc2godGhpcy5fbWVtKTtcblxuICAgIHRoaXMuX2lzUmVhZHkucmVzb2x2ZSgpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgX2luaXRUYWJsZUNmZ3MgPSAoKSA9PiB7XG4gICAgY29uc3QgdGFibGVDZmcgPSBJb1Rvb2xzLnRhYmxlQ2Znc1RhYmxlQ2ZnO1xuXG4gICAgdGhpcy5fbWVtLnRhYmxlQ2ZncyA9IGhpcCh7XG4gICAgICBfdHlwZTogJ3RhYmxlQ2ZncycsXG4gICAgICBfZGF0YTogW3RhYmxlQ2ZnXSxcbiAgICAgIF90YWJsZUNmZzogdGFibGVDZmcuX2hhc2ggYXMgc3RyaW5nLFxuICAgIH0pO1xuICB9O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF91cGRhdGVHbG9iYWxIYXNoKCkge1xuICAgICh0aGlzLl9tZW0gYXMgYW55KS5faGFzaCA9ICcnO1xuICAgIGhpcCh0aGlzLl9tZW0sIHtcbiAgICAgIHVwZGF0ZUV4aXN0aW5nSGFzaGVzOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF91cGRhdGVUYWJsZUhhc2godGFibGVLZXk6IFRhYmxlS2V5KSB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLl9tZW1bdGFibGVLZXldIGFzIFRhYmxlVHlwZTtcbiAgICB0YWJsZS5faGFzaCA9ICcnO1xuICAgIGhpcCh0YWJsZSwgeyB1cGRhdGVFeGlzdGluZ0hhc2hlczogZmFsc2UgfSk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBhc3luYyBfY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0OiB7XG4gICAgdGFibGVDZmc6IFRhYmxlQ2ZnO1xuICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHRhYmxlIGNvbmZpZyBpcyBjb21wYXRpYmxlXG4gICAgLy8gd2l0aCBhbiBwb3RlbnRpYWwgZXhpc3RpbmcgdGFibGVcbiAgICBjb25zdCB0YWJsZUNmZyA9IHJlcXVlc3QudGFibGVDZmc7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZUlzTm90Q29tcGF0aWJsZSh0YWJsZUNmZyk7XG5cbiAgICBjb25zdCB7IGtleSB9ID0gdGFibGVDZmc7XG5cbiAgICAvLyBSZWNyZWF0ZSBoYXNoZXMgaW4gdGhlIGNhc2UgdGhlIGV4aXN0aW5nIGhhc2hlcyBhcmUgd3JvbmdcbiAgICBjb25zdCBuZXdDb25maWcgPSBoc2godGFibGVDZmcpO1xuXG4gICAgLy8gRmluZCBhbiBleGlzdGluZyB0YWJsZSBjb25maWcgd2l0aCB0aGUgc2FtZSBoYXNoXG4gICAgY29uc3QgZXhpc3RpbmdDb25maWcgPSBhd2FpdCB0aGlzLl9pb1Rvb2xzLnRhYmxlQ2ZnT3JOdWxsKGtleSk7XG5cbiAgICAvLyBXcml0ZSB0aGUgbmV3IGNvbmZpZyBpbnRvIHRoZSBkYXRhYmFzZVxuICAgIGlmICghZXhpc3RpbmdDb25maWcpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVRhYmxlKG5ld0NvbmZpZywga2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZXh0ZW5kVGFibGUoZXhpc3RpbmdDb25maWcsIG5ld0NvbmZpZyk7XG4gICAgfVxuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgX2NyZWF0ZVRhYmxlKG5ld0NvbmZpZzogVGFibGVDZmcsIHRhYmxlS2V5OiBUYWJsZUtleSkge1xuICAgIC8vIFdyaXRlIHRoZSB0YWJsZSBjb25maWcgaW50byB0aGUgZGF0YWJhc2VcbiAgICBuZXdDb25maWcgPSBoc2gobmV3Q29uZmlnKTtcbiAgICB0aGlzLl9tZW0udGFibGVDZmdzLl9kYXRhLnB1c2gobmV3Q29uZmlnKTtcbiAgICB0aGlzLl9pb1Rvb2xzLnNvcnRUYWJsZURhdGFBbmRVcGRhdGVIYXNoKHRoaXMuX21lbS50YWJsZUNmZ3MpO1xuXG4gICAgLy8gQ3JlYXRlIGEgdGFibGUgYW5kIHdyaXRlIGl0IGludG8gdGhlIGRhdGFiYXNlXG4gICAgY29uc3QgdGFibGU6IFRhYmxlVHlwZSA9IHtcbiAgICAgIF90eXBlOiBuZXdDb25maWcudHlwZSxcbiAgICAgIF9kYXRhOiBbXSxcbiAgICAgIF90YWJsZUNmZzogbmV3Q29uZmlnLl9oYXNoIGFzIHN0cmluZyxcbiAgICB9O1xuXG4gICAgdGhpcy5fbWVtW3RhYmxlS2V5XSA/Pz0gaGlwKHRhYmxlKTtcblxuICAgIC8vIFVwZGF0ZSBoYXNoZXNcbiAgICB0aGlzLl91cGRhdGVUYWJsZUhhc2godGFibGVLZXkpO1xuICAgIHRoaXMuX3VwZGF0ZUdsb2JhbEhhc2goKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF9leHRlbmRUYWJsZShleGlzdGluZ0NvbmZpZzogVGFibGVDZmcsIG5ld0NvbmZpZzogVGFibGVDZmcpIHtcbiAgICAvLyBObyBjb2x1bW5zIGFkZGVkPyBSZXR1cm4uXG4gICAgaWYgKGV4aXN0aW5nQ29uZmlnLmNvbHVtbnMubGVuZ3RoID09PSBuZXdDb25maWcuY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBXcml0ZSB0aGUgbmV3IHRhYmxlIGNvbmZpZyBpbnRvIHRoZSBkYXRhYmFzZVxuICAgIG5ld0NvbmZpZyA9IGhzaChuZXdDb25maWcpO1xuICAgIHRoaXMuX21lbS50YWJsZUNmZ3MuX2RhdGEucHVzaChuZXdDb25maWcpO1xuICAgIHRoaXMuX2lvVG9vbHMuc29ydFRhYmxlRGF0YUFuZFVwZGF0ZUhhc2godGhpcy5fbWVtLnRhYmxlQ2Zncyk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGNvbmZpZyBvZiB0aGUgZXhpc3RpbmcgdGFibGVcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuX21lbVtuZXdDb25maWcua2V5XSBhcyBUYWJsZVR5cGU7XG4gICAgdGFibGUuX3RhYmxlQ2ZnID0gbmV3Q29uZmlnLl9oYXNoIGFzIHN0cmluZztcblxuICAgIC8vIFVwZGF0ZSB0aGUgaGFzaGVzXG4gICAgdGhpcy5fdXBkYXRlVGFibGVIYXNoKG5ld0NvbmZpZy5rZXkpO1xuICAgIHRoaXMuX3VwZGF0ZUdsb2JhbEhhc2goKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuXG4gIHByaXZhdGUgYXN5bmMgX2R1bXAoKTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICByZXR1cm4gY29weSh0aGlzLl9tZW0pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX2R1bXBUYWJsZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURvZXNOb3RFeGlzdChyZXF1ZXN0LnRhYmxlKTtcblxuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fbWVtW3JlcXVlc3QudGFibGVdIGFzIFRhYmxlVHlwZTtcblxuICAgIHJldHVybiB7XG4gICAgICBbcmVxdWVzdC50YWJsZV06IGNvcHkodGFibGUpLFxuICAgIH07XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBhc3luYyBfY29udGVudFR5cGUocmVxdWVzdDogeyB0YWJsZTogc3RyaW5nIH0pOiBQcm9taXNlPENvbnRlbnRUeXBlPiB7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURvZXNOb3RFeGlzdChyZXF1ZXN0LnRhYmxlKTtcblxuICAgIHJldHVybiAodGhpcy5fbWVtW3JlcXVlc3QudGFibGVdIGFzIFRhYmxlVHlwZSkuX3R5cGU7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBhc3luYyBfd3JpdGUocmVxdWVzdDogeyBkYXRhOiBSbGpzb24gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFkZGVkRGF0YSA9IGhzaChyZXF1ZXN0LmRhdGEpO1xuICAgIHRoaXMuX3JlbW92ZU51bGxWYWx1ZXMoYWRkZWREYXRhKTtcbiAgICBjb25zdCB0YWJsZXMgPSBPYmplY3Qua2V5cyhhZGRlZERhdGEpO1xuICAgIGhzaChhZGRlZERhdGEpO1xuXG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZXNEb05vdEV4aXN0KHJlcXVlc3QuZGF0YSk7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURhdGFEb2VzTm90TWF0Y2hDZmcocmVxdWVzdC5kYXRhKTtcblxuICAgIGZvciAoY29uc3QgdGFibGUgb2YgdGFibGVzKSB7XG4gICAgICBpZiAodGFibGUuc3RhcnRzV2l0aCgnXycpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvbGRUYWJsZSA9IHRoaXMuX21lbVt0YWJsZV0gYXMgVGFibGVUeXBlO1xuICAgICAgY29uc3QgbmV3VGFibGUgPSBhZGRlZERhdGFbdGFibGVdIGFzIFRhYmxlVHlwZTtcblxuICAgICAgLy8gVGFibGUgZXhpc3RzLiBNZXJnZSBkYXRhXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbmV3VGFibGUuX2RhdGEpIHtcbiAgICAgICAgY29uc3QgaGFzaCA9IGl0ZW0uX2hhc2g7XG4gICAgICAgIGNvbnN0IGV4aXN0cyA9IG9sZFRhYmxlLl9kYXRhLmZpbmQoKGkpID0+IGkuX2hhc2ggPT09IGhhc2gpO1xuICAgICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAgIG9sZFRhYmxlLl9kYXRhLnB1c2goaXRlbSBhcyBhbnkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2lvVG9vbHMuc29ydFRhYmxlRGF0YUFuZFVwZGF0ZUhhc2gob2xkVGFibGUpO1xuICAgIH1cblxuICAgIC8vIFJlY2FsYyBtYWluIGhhc2hlc1xuICAgIHRoaXMuX3VwZGF0ZUdsb2JhbEhhc2goKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIGFzeW5jIF9yZWFkUm93cyhyZXF1ZXN0OiB7XG4gICAgdGFibGU6IHN0cmluZztcbiAgICB3aGVyZTogeyBbY29sdW1uOiBzdHJpbmddOiBKc29uVmFsdWUgfTtcbiAgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURvZXNOb3RFeGlzdChyZXF1ZXN0LnRhYmxlKTtcbiAgICBhd2FpdCB0aGlzLl9pb1Rvb2xzLnRocm93V2hlbkNvbHVtbkRvZXNOb3RFeGlzdChcbiAgICAgIHJlcXVlc3QudGFibGUsXG4gICAgICBPYmplY3Qua2V5cyhyZXF1ZXN0LndoZXJlKSxcbiAgICApO1xuXG4gICAgLy8gUmVhZCB0YWJsZSBmcm9tIGRhdGFcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuX21lbVtyZXF1ZXN0LnRhYmxlXSBhcyBUYWJsZVR5cGU7XG5cbiAgICAvLyBGaWx0ZXIgdGFibGUgZGF0YVxuICAgIGNvbnN0IHRhYmxlRGF0YUZpbHRlcmVkID0gdGFibGUuX2RhdGEuZmlsdGVyKChyb3cpID0+IHtcbiAgICAgIGZvciAoY29uc3QgY29sdW1uIGluIHJlcXVlc3Qud2hlcmUpIHtcbiAgICAgICAgY29uc3QgYSA9IHJvd1tjb2x1bW5dO1xuICAgICAgICBjb25zdCBiID0gcmVxdWVzdC53aGVyZVtjb2x1bW5dO1xuICAgICAgICBpZiAoYiA9PT0gbnVsbCAmJiBhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZXF1YWxzKGEsIGIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBhbiB0YWJsZVxuICAgIGNvbnN0IHRhYmxlRmlsdGVyZWQ6IFRhYmxlVHlwZSA9IHtcbiAgICAgIF90eXBlOiB0YWJsZS5fdHlwZSxcbiAgICAgIF9kYXRhOiB0YWJsZURhdGFGaWx0ZXJlZCxcbiAgICB9O1xuXG4gICAgdGhpcy5faW9Ub29scy5zb3J0VGFibGVEYXRhQW5kVXBkYXRlSGFzaCh0YWJsZUZpbHRlcmVkKTtcblxuICAgIGNvbnN0IHJlc3VsdDogUmxqc29uID0ge1xuICAgICAgW3JlcXVlc3QudGFibGVdOiB0YWJsZUZpbHRlcmVkLFxuICAgIH07XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgX3JlbW92ZU51bGxWYWx1ZXMocmxqc29uOiBSbGpzb24pIHtcbiAgICBpdGVyYXRlVGFibGVzU3luYyhybGpzb24sICh0YWJsZSkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IHJsanNvblt0YWJsZV0uX2RhdGE7XG5cbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIGRhdGEpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcm93KSB7XG4gICAgICAgICAgaWYgKHJvd1trZXldID09PSBudWxsKSB7XG4gICAgICAgICAgICBkZWxldGUgcm93W2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG5pbXBvcnQgeyBJbyB9IGZyb20gJy4vaW8udHMnO1xuaW1wb3J0IHsgU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQudHMnO1xuXG5cbmV4cG9ydCBjbGFzcyBQZWVyU29ja2V0TW9jayBpbXBsZW1lbnRzIFNvY2tldCB7XG4gIHByaXZhdGUgX2xpc3RlbmVyc01hcDogTWFwPHN0cmluZyB8IHN5bWJvbCwgQXJyYXk8KC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPj4gPVxuICAgIG5ldyBNYXAoKTtcblxuICBjb25uZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZGlzY29ubmVjdGVkOiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9pbzogSW8pIHt9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogUmVnaXN0ZXJzIGFuIGV2ZW50IGxpc3RlbmVyIGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICAgKiBAcGFyYW0gZXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIGxpc3RlbiBmb3IuXG4gICAqIEBwYXJhbSBsaXN0ZW5lciAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBpbnZva2Ugd2hlbiB0aGUgZXZlbnQgaXMgZW1pdHRlZC5cbiAgICogQHJldHVybnMgVGhlIFBlZXJTb2NrZXRNb2NrIGluc3RhbmNlIGZvciBjaGFpbmluZy5cbiAgICovXG4gIG9uKGV2ZW50TmFtZTogc3RyaW5nIHwgc3ltYm9sLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdGhpcyB7XG4gICAgaWYgKCF0aGlzLl9saXN0ZW5lcnNNYXAuaGFzKGV2ZW50TmFtZSkpIHtcbiAgICAgIHRoaXMuX2xpc3RlbmVyc01hcC5zZXQoZXZlbnROYW1lLCBbXSk7XG4gICAgfVxuICAgIHRoaXMuX2xpc3RlbmVyc01hcC5nZXQoZXZlbnROYW1lKSEucHVzaChsaXN0ZW5lcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLyoqXG4gICAqIFNpbXVsYXRlcyBhIGNvbm5lY3Rpb24gZXZlbnQuXG4gICAqXG4gICAqIEVtaXRzIHRoZSAnY29ubmVjdCcgZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLlxuICAgKi9cbiAgY29ubmVjdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbm5lY3RlZCA9IHRydWU7XG4gICAgdGhpcy5kaXNjb25uZWN0ZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyc01hcC5nZXQoJ2Nvbm5lY3QnKSB8fCBbXTtcbiAgICBmb3IgKGNvbnN0IGNiIG9mIGxpc3RlbmVycykge1xuICAgICAgY2Ioe30pO1xuICAgIH1cbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogU2ltdWxhdGVzIGEgZGlzY29ubmVjdGlvbiBldmVudC5cbiAgICpcbiAgICogRW1pdHMgdGhlICdkaXNjb25uZWN0JyBldmVudCB0byBhbGwgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuXG4gICAqL1xuICBkaXNjb25uZWN0KCk6IHZvaWQge1xuICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgdGhpcy5kaXNjb25uZWN0ZWQgPSB0cnVlO1xuXG4gICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzTWFwLmdldCgnZGlzY29ubmVjdCcpIHx8IFtdO1xuICAgIGZvciAoY29uc3QgY2Igb2YgbGlzdGVuZXJzKSB7XG4gICAgICBjYih7fSk7XG4gICAgfVxuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogRW1pdHMgYW4gZXZlbnQsIGludm9raW5nIHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZCBvbiB0aGUgSW8gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gZW1pdC5cbiAgICogQHBhcmFtIGFyZ3MgLSBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZW1pdChldmVudE5hbWU6IHN0cmluZyB8IHN5bWJvbCwgLi4uYXJnczogYW55W10pOiBib29sZWFuIHtcbiAgICBjb25zdCBmbiA9ICh0aGlzLl9pbyBhcyBhbnkpW2V2ZW50TmFtZV0gYXMgKC4uLmFyZ3M6IGFueVtdKSA9PiBQcm9taXNlPGFueT47XG4gICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFdmVudCAke2V2ZW50TmFtZS50b1N0cmluZygpfSBub3Qgc3VwcG9ydGVkYCk7XG4gICAgfVxuICAgIGNvbnN0IGNiID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdO1xuICAgIGZuLmFwcGx5KHRoaXMuX2lvLCBhcmdzLnNsaWNlKDAsIC0xKSlcbiAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgY2IocmVzdWx0LCBudWxsKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBjYihudWxsLCBlcnIpO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIiwiLy8gQGxpY2Vuc2Vcbi8vIENvcHlyaWdodCAoYykgMjAyNSBSbGpzb25cbi8vXG4vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0ZXJtcyB0aGF0IGNhbiBiZVxuLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHBhY2thZ2UuXG5cbmltcG9ydCB7IEpzb25WYWx1ZSB9IGZyb20gJ0BybGpzb24vanNvbic7XG5pbXBvcnQgeyBDb250ZW50VHlwZSwgUmxqc29uLCBUYWJsZUNmZywgVGFibGVLZXkgfSBmcm9tICdAcmxqc29uL3JsanNvbic7XG5cbmltcG9ydCB7IElvTWVtIH0gZnJvbSAnLi9pby1tZW0udHMnO1xuaW1wb3J0IHsgSW8gfSBmcm9tICcuL2lvLnRzJztcbmltcG9ydCB7IFBlZXJTb2NrZXRNb2NrIH0gZnJvbSAnLi9wZWVyLXNvY2tldC1tb2NrLnRzJztcbmltcG9ydCB7IFNvY2tldCB9IGZyb20gJy4vc29ja2V0LnRzJztcblxuZXhwb3J0IGNsYXNzIElvUGVlciBpbXBsZW1lbnRzIElvIHtcbiAgaXNPcGVuOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfc29ja2V0OiBTb2NrZXQpIHt9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8qKlxuICAgKlxuICAgKiBJbml0aWFsaXplcyB0aGUgUGVlciBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgYXN5bmMgaW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBVcGRhdGUgaXNPcGVuIG9uIGNvbm5lY3QvZGlzY29ubmVjdFxuICAgIHRoaXMuX3NvY2tldC5vbignY29ubmVjdCcsICgpID0+IHtcbiAgICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICB9KTtcbiAgICB0aGlzLl9zb2NrZXQub24oJ2Rpc2Nvbm5lY3QnLCAoKSA9PiB7XG4gICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgIH0pO1xuXG4gICAgLy8gQ29ubmVjdCB0aGUgc29ja2V0XG4gICAgdGhpcy5fc29ja2V0LmNvbm5lY3QoKTtcblxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBQZWVyIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zXG4gICAqL1xuXG4gIGFzeW5jIGNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIERpc2Nvbm5lY3QgdGhlIHNvY2tldFxuICAgIGlmICghdGhpcy5fc29ja2V0LmNvbm5lY3RlZCkgcmV0dXJuO1xuICAgIHRoaXMuX3NvY2tldC5kaXNjb25uZWN0KCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIFBlZXIgY29ubmVjdGlvbiBpcyByZWFkeS5cbiAgICogQHJldHVybnNcbiAgICovXG4gIGFzeW5jIGlzUmVhZHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3NvY2tldC5jb25uZWN0ZWQgPyBQcm9taXNlLnJlc29sdmUoKSA6IFByb21pc2UucmVqZWN0KCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLyoqXG4gICAqIER1bXBzIHRoZSBlbnRpcmUgZGF0YWJhc2UgY29udGVudC5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGR1bXBlZCBkYXRhYmFzZSBjb250ZW50LlxuICAgKi9cbiAgYXN5bmMgZHVtcCgpOiBQcm9taXNlPFJsanNvbj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgLy8gUmVxdWVzdCBkdW1wLCByZXNvbHZlIG9uY2UgdGhlIGRhdGEgaXMgcmVjZWl2ZWQgKGFjaylcbiAgICAgIHRoaXMuX3NvY2tldC5lbWl0KCdkdW1wJywgKGRhdGE6IFJsanNvbikgPT4ge1xuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLyoqXG4gICAqIER1bXBzIGEgc3BlY2lmaWMgdGFibGUgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0IEFuIG9iamVjdCBjb250YWluaW5nIHRoZSB0YWJsZSBuYW1lIHRvIGR1bXAuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBkdW1wZWQgdGFibGUgZGF0YS5cbiAgICovXG4gIGR1bXBUYWJsZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIFJlcXVlc3QgZHVtcFRhYmxlLCByZXNvbHZlIG9uY2UgdGhlIGRhdGEgaXMgcmVjZWl2ZWQgKGFjaylcbiAgICAgIHRoaXMuX3NvY2tldC5lbWl0KCdkdW1wVGFibGUnLCByZXF1ZXN0LCAoZGF0YTogUmxqc29uLCBlcnJvcj86IEVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjb250ZW50IHR5cGUgb2YgYSBzcGVjaWZpYyB0YWJsZS5cbiAgICogQHBhcmFtIHJlcXVlc3QgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHRhYmxlIG5hbWUgdG8gZ2V0IHRoZSBjb250ZW50IHR5cGUgZm9yLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY29udGVudCB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgdGFibGUuXG4gICAqL1xuICBjb250ZW50VHlwZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Q29udGVudFR5cGU+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gUmVxdWVzdCBjb250ZW50VHlwZSwgcmVzb2x2ZSBvbmNlIHRoZSBkYXRhIGlzIHJlY2VpdmVkIChhY2spXG4gICAgICB0aGlzLl9zb2NrZXQuZW1pdChcbiAgICAgICAgJ2NvbnRlbnRUeXBlJyxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgKGRhdGE6IENvbnRlbnRUeXBlLCBlcnJvcj86IEVycm9yKSA9PiB7XG4gICAgICAgICAgLyogdjggaWdub3JlIG5leHQgLS0gQHByZXNlcnZlICovXG4gICAgICAgICAgaWYgKGVycm9yKSByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBzcGVjaWZpYyB0YWJsZSBleGlzdHMgaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0gdGFibGVLZXkgVGhlIGtleSBvZiB0aGUgdGFibGUgdG8gY2hlY2sgZm9yIGV4aXN0ZW5jZS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgdGFibGUgZXhpc3RzLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICB0YWJsZUV4aXN0cyh0YWJsZUtleTogVGFibGVLZXkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIC8vIFJlcXVlc3QgdGFibGVFeGlzdHMsIHJlc29sdmUgb25jZSB0aGUgZGF0YSBpcyByZWNlaXZlZCAoYWNrKVxuICAgICAgdGhpcy5fc29ja2V0LmVtaXQoJ3RhYmxlRXhpc3RzJywgdGFibGVLZXksIChleGlzdHM6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgcmVzb2x2ZShleGlzdHMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLyoqXG4gICAqIENyZWF0ZXMgb3IgZXh0ZW5kcyBhIHRhYmxlIHdpdGggdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSByZXF1ZXN0IEFuIG9iamVjdCBjb250YWluaW5nIHRoZSB0YWJsZSBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBvbmNlIHRoZSB0YWJsZSBpcyBjcmVhdGVkIG9yIGV4dGVuZGVkLlxuICAgKi9cbiAgY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0OiB7IHRhYmxlQ2ZnOiBUYWJsZUNmZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIFJlcXVlc3QgY3JlYXRlT3JFeHRlbmRUYWJsZSwgcmVzb2x2ZSBvbmNlIHRoZSBkYXRhIGlzIHJlY2VpdmVkIChhY2spXG4gICAgICB0aGlzLl9zb2NrZXQuZW1pdChcbiAgICAgICAgJ2NyZWF0ZU9yRXh0ZW5kVGFibGUnLFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICAoXz86IGJvb2xlYW4sIGVycm9yPzogRXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSByYXcgdGFibGUgY29uZmlndXJhdGlvbnMgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIHRhYmxlIGNvbmZpZ3VyYXRpb25zLlxuICAgKi9cbiAgcmF3VGFibGVDZmdzKCk6IFByb21pc2U8VGFibGVDZmdbXT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgLy8gUmVxdWVzdCByYXdUYWJsZUNmZ3MsIHJlc29sdmUgb25jZSB0aGUgZGF0YSBpcyByZWNlaXZlZCAoYWNrKVxuICAgICAgdGhpcy5fc29ja2V0LmVtaXQoJ3Jhd1RhYmxlQ2ZncycsIChkYXRhOiBUYWJsZUNmZ1tdKSA9PiB7XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogV3JpdGVzIGRhdGEgdG8gdGhlIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0gcmVxdWVzdCBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgZGF0YSB0byB3cml0ZS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgZGF0YSBpcyB3cml0dGVuLlxuICAgKi9cbiAgd3JpdGUocmVxdWVzdDogeyBkYXRhOiBSbGpzb24gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBSZXF1ZXN0IHdyaXRlLCByZXNvbHZlIG9uY2UgdGhlIGRhdGEgaXMgcmVjZWl2ZWQgKGFjaylcbiAgICAgIHRoaXMuX3NvY2tldC5lbWl0KCd3cml0ZScsIHJlcXVlc3QsIChfPzogYm9vbGVhbiwgZXJyb3I/OiBFcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IpIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8qKlxuICAgKiBSZWFkcyByb3dzIGZyb20gYSBzcGVjaWZpYyB0YWJsZSB0aGF0IG1hdGNoIHRoZSBnaXZlbiBjcml0ZXJpYS5cbiAgICogQHBhcmFtIHJlcXVlc3QgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHRhYmxlIG5hbWUgYW5kIHRoZSBjcml0ZXJpYSBmb3Igc2VsZWN0aW5nIHJvd3MuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBzZWxlY3RlZCByb3dzLlxuICAgKi9cbiAgcmVhZFJvd3MocmVxdWVzdDoge1xuICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgd2hlcmU6IHsgW2NvbHVtbjogc3RyaW5nXTogSnNvblZhbHVlIHwgbnVsbCB9O1xuICB9KTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gUmVxdWVzdCByZWFkUm93cywgcmVzb2x2ZSBvbmNlIHRoZSBkYXRhIGlzIHJlY2VpdmVkIChhY2spXG4gICAgICB0aGlzLl9zb2NrZXQuZW1pdChcbiAgICAgICAgJ3JlYWRSb3dzJyxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgKHJlc3VsdD86IFJsanNvbiwgZXJyb3I/OiBFcnJvcikgPT4ge1xuICAgICAgICAgIGlmIChlcnJvcikgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCEpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBudW1iZXIgb2Ygcm93cyBpbiBhIHNwZWNpZmljIHRhYmxlLlxuICAgKiBAcGFyYW0gdGFibGUgVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIGNvdW50IHJvd3MgaW4uXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgc3BlY2lmaWVkIHRhYmxlLlxuICAgKi9cbiAgcm93Q291bnQodGFibGU6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIFJlcXVlc3Qgcm93Q291bnQsIHJlc29sdmUgb25jZSB0aGUgZGF0YSBpcyByZWNlaXZlZCAoYWNrKVxuICAgICAgdGhpcy5fc29ja2V0LmVtaXQoJ3Jvd0NvdW50JywgdGFibGUsIChjb3VudD86IG51bWJlciwgZXJyb3I/OiBFcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IpIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJlc29sdmUoY291bnQhKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHN0YXRpYyBleGFtcGxlID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGlvTWVtID0gYXdhaXQgSW9NZW0uZXhhbXBsZSgpO1xuICAgIGNvbnN0IHNvY2tldCA9IG5ldyBQZWVyU29ja2V0TW9jayhpb01lbSk7XG4gICAgY29uc3QgaW8gPSBuZXcgSW9QZWVyKHNvY2tldCk7XG4gICAgYXdhaXQgaW8uaW5pdCgpO1xuICAgIHJldHVybiBpbztcbiAgfTtcbn1cbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG5pbXBvcnQgeyBKc29uVmFsdWUsIG1lcmdlIH0gZnJvbSAnQHJsanNvbi9qc29uJztcbmltcG9ydCB7XG4gIENvbnRlbnRUeXBlLFxuICBSbGpzb24sXG4gIFRhYmxlQ2ZnLFxuICBUYWJsZUtleSxcbiAgVGFibGVUeXBlLFxufSBmcm9tICdAcmxqc29uL3JsanNvbic7XG5cbmltcG9ydCB7IElvTWVtIH0gZnJvbSAnLi9pby1tZW0udHMnO1xuaW1wb3J0IHsgSW9QZWVyIH0gZnJvbSAnLi9pby1wZWVyLnRzJztcbmltcG9ydCB7IElvIH0gZnJvbSAnLi9pby50cyc7XG5pbXBvcnQgeyBQZWVyU29ja2V0TW9jayB9IGZyb20gJy4vcGVlci1zb2NrZXQtbW9jay50cyc7XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuLyoqXG4gKiBUeXBlIHJlcHJlc2VudGluZyBhbiBJbyBpbnN0YW5jZSBhbG9uZyB3aXRoIGl0cyBjYXBhYmlsaXRpZXMgYW5kIHByaW9yaXR5LlxuICovXG5leHBvcnQgdHlwZSBJb011bHRpSW8gPSB7XG4gIGlvOiBJbztcbiAgcHJpb3JpdHk6IG51bWJlcjtcbiAgcmVhZDogYm9vbGVhbjtcbiAgd3JpdGU6IGJvb2xlYW47XG4gIGR1bXA6IGJvb2xlYW47XG59O1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8qKlxuICogTXVsdGkgSW8gaW1wbGVtZW50YXRpb24gdGhhdCBjb21iaW5lcyBtdWx0aXBsZSB1bmRlcmx5aW5nIElvIGluc3RhbmNlc1xuICogd2l0aCBkaWZmZXJlbnQgY2FwYWJpbGl0aWVzIChyZWFkLCB3cml0ZSwgZHVtcCkgYW5kIHByaW9yaXRpZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBJb011bHRpIGltcGxlbWVudHMgSW8ge1xuICBpc09wZW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9pb3M6IEFycmF5PElvTXVsdGlJbz4pIHt9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8qKlxuICAgKlxuICAgKiBJbml0aWFsaXplcyBhbGwgdW5kZXJseWluZyBJbyBpbnN0YW5jZXMuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhc3luYyBpbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgaW9NdWx0aUlvIG9mIHRoaXMuX2lvcykge1xuICAgICAgaWYgKCFpb011bHRpSW8uaW8uaXNPcGVuKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnQWxsIHVuZGVybHlpbmcgSW8gaW5zdGFuY2VzIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGluaXRpYWxpemluZyBJb011bHRpJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmlzT3BlbiA9IHRydWU7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8qKlxuICAgKiBDbG9zZXMgYWxsIHVuZGVybHlpbmcgSW8gaW5zdGFuY2VzLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgYXN5bmMgY2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5faW9zLm1hcCgoaW9NdWx0aUlvKSA9PiBpb011bHRpSW8uaW8uY2xvc2UoKSkpO1xuXG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBvbmNlIGFsbCB1bmRlcmx5aW5nIElvIGluc3RhbmNlcyBhcmUgcmVhZHkuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBpc1JlYWR5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIHRoaXMuX2lvcy5tYXAoKGlvTXVsdGlJbykgPT4gaW9NdWx0aUlvLmlvLmlzUmVhZHkoKSksXG4gICAgKS50aGVuKCgpID0+IFByb21pc2UucmVzb2x2ZSgpKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogRHVtcHMgdGhlIGVudGlyZSBkYXRhYmFzZSBjb250ZW50IGJ5IG1lcmdpbmcgZHVtcHMgZnJvbSBhbGwgZHVtcGFibGUgdW5kZXJseWluZyBJbyBpbnN0YW5jZXMuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhc3luYyBkdW1wKCk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgLyogdjggaWdub3JlIG5leHQgLS0gQHByZXNlcnZlICovXG4gICAgaWYgKHRoaXMuZHVtcGFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignTm8gZHVtcGFibGUgSW8gYXZhaWxhYmxlJykpO1xuICAgIH1cblxuICAgIGNvbnN0IGR1bXBzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICB0aGlzLmR1bXBhYmxlcy5tYXAoKGR1bXBhYmxlKSA9PiBkdW1wYWJsZS5kdW1wKCkpLFxuICAgICk7XG5cbiAgICByZXR1cm4gbWVyZ2UoLi4uZHVtcHMpIGFzIFJsanNvbjtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogRHVtcHMgYSBzcGVjaWZpYyB0YWJsZSBieSBtZXJnaW5nIGR1bXBzIGZyb20gYWxsIGR1bXBhYmxlIHVuZGVybHlpbmcgSW8gaW5zdGFuY2VzIHRoYXQgY29udGFpbiB0aGUgdGFibGUuXG4gICAqIEBwYXJhbSByZXF1ZXN0IEFuIG9iamVjdCBjb250YWluaW5nIHRoZSB0YWJsZSBuYW1lIHRvIGR1bXAuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBkdW1wZWQgdGFibGUgZGF0YS5cbiAgICovXG4gIGFzeW5jIGR1bXBUYWJsZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgLyogdjggaWdub3JlIG5leHQgLS0gQHByZXNlcnZlICovXG4gICAgaWYgKHRoaXMuZHVtcGFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignTm8gZHVtcGFibGUgSW8gYXZhaWxhYmxlJykpO1xuICAgIH1cblxuICAgIGNvbnN0IGR1bXBzOiBSbGpzb25bXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBkdW1wYWJsZSBvZiB0aGlzLmR1bXBhYmxlcykge1xuICAgICAgY29uc3QgdGFibGVFeGlzdHMgPSBhd2FpdCBkdW1wYWJsZS50YWJsZUV4aXN0cyhyZXF1ZXN0LnRhYmxlKTtcbiAgICAgIGlmICh0YWJsZUV4aXN0cykge1xuICAgICAgICBjb25zdCBkdW1wID0gYXdhaXQgZHVtcGFibGUuZHVtcFRhYmxlKHJlcXVlc3QpO1xuICAgICAgICBkdW1wcy5wdXNoKGR1bXApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkdW1wcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gbWVyZ2UoLi4uZHVtcHMpIGFzIFJsanNvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVGFibGUgXCIke3JlcXVlc3QudGFibGV9XCIgbm90IGZvdW5kYCkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBjb250ZW50IHR5cGUgb2YgYSBzcGVjaWZpYyB0YWJsZSBmcm9tIHRoZSBmaXJzdCB1bmRlcmx5aW5nIHJlYWRhYmxlIElvIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIHRhYmxlLlxuICAgKiBAcGFyYW0gcmVxdWVzdCBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgdGFibGUgbmFtZS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgdGFibGUuXG4gICAqL1xuICBhc3luYyBjb250ZW50VHlwZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Q29udGVudFR5cGU+IHtcbiAgICAvKiB2OCBpZ25vcmUgbmV4dCAtLSBAcHJlc2VydmUgKi9cbiAgICBpZiAodGhpcy5yZWFkYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyByZWFkYWJsZSBJbyBhdmFpbGFibGUnKSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByZWFkYWJsZSBvZiB0aGlzLnJlYWRhYmxlcykge1xuICAgICAgY29uc3QgdGFibGVFeGlzdHMgPSBhd2FpdCByZWFkYWJsZS50YWJsZUV4aXN0cyhyZXF1ZXN0LnRhYmxlKTtcbiAgICAgIC8qIHY4IGlnbm9yZSBlbHNlIC0tIEBwcmVzZXJ2ZSAqL1xuICAgICAgaWYgKHRhYmxlRXhpc3RzKSB7XG4gICAgICAgIHJldHVybiByZWFkYWJsZS5jb250ZW50VHlwZShyZXF1ZXN0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVGFibGUgXCIke3JlcXVlc3QudGFibGV9XCIgbm90IGZvdW5kYCkpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBzcGVjaWZpYyB0YWJsZSBleGlzdHMgaW4gYW55IG9mIHRoZSB1bmRlcmx5aW5nIHJlYWRhYmxlIElvIGluc3RhbmNlcy5cbiAgICogQHBhcmFtIHRhYmxlS2V5IFRoZSBrZXkgb2YgdGhlIHRhYmxlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIHRoZSB0YWJsZSBleGlzdHMgaW4gYW55IHJlYWRhYmxlIElvLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBhc3luYyB0YWJsZUV4aXN0cyh0YWJsZUtleTogVGFibGVLZXkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvKiB2OCBpZ25vcmUgbmV4dCAtLSBAcHJlc2VydmUgKi9cbiAgICBpZiAodGhpcy5yZWFkYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyByZWFkYWJsZSBJbyBhdmFpbGFibGUnKSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByZWFkYWJsZSBvZiB0aGlzLnJlYWRhYmxlcykge1xuICAgICAgY29uc3QgZXhpc3RzID0gYXdhaXQgcmVhZGFibGUudGFibGVFeGlzdHModGFibGVLZXkpO1xuICAgICAgaWYgKGV4aXN0cykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8qKlxuICAgKiBDcmVhdGVzIG9yIGV4dGVuZHMgYSB0YWJsZSBpbiBhbGwgdW5kZXJseWluZyB3cml0YWJsZSBJbyBpbnN0YW5jZXMuXG4gICAqIEBwYXJhbSByZXF1ZXN0IEFuIG9iamVjdCBjb250YWluaW5nIHRoZSB0YWJsZSBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBvbmNlIHRoZSB0YWJsZSBoYXMgYmVlbiBjcmVhdGVkIG9yIGV4dGVuZGVkIGluIGFsbCB3cml0YWJsZSBJbyBpbnN0YW5jZXMuXG4gICAqL1xuICBjcmVhdGVPckV4dGVuZFRhYmxlKHJlcXVlc3Q6IHsgdGFibGVDZmc6IFRhYmxlQ2ZnIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvKiB2OCBpZ25vcmUgbmV4dCAtLSBAcHJlc2VydmUgKi9cbiAgICBpZiAodGhpcy53cml0YWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyB3cml0YWJsZSBJbyBhdmFpbGFibGUnKSk7XG4gICAgfVxuICAgIC8vQ3JlYXRlIG9yIGV4dGVuZCB0YWJsZSBpbiBhbGwgd3JpdGFibGVzIGluIHBhcmFsbGVsIGFuZCByZXNvbHZlIHdoZW4gYWxsIGhhdmUgY29tcGxldGVkXG4gICAgY29uc3QgY3JlYXRpb25zID0gdGhpcy53cml0YWJsZXMubWFwKCh3cml0YWJsZSkgPT5cbiAgICAgIHdyaXRhYmxlLmNyZWF0ZU9yRXh0ZW5kVGFibGUocmVxdWVzdCksXG4gICAgKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoY3JlYXRpb25zKS50aGVuKCgpID0+IFByb21pc2UucmVzb2x2ZSgpKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSByYXcgdGFibGUgY29uZmlndXJhdGlvbnMgZnJvbSB0aGUgaGlnaGVzdCBwcmlvcml0eSB1bmRlcmx5aW5nIHJlYWRhYmxlIElvIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiB0YWJsZSBjb25maWd1cmF0aW9ucy5cbiAgICovXG4gIHJhd1RhYmxlQ2ZncygpOiBQcm9taXNlPFRhYmxlQ2ZnW10+IHtcbiAgICAvKiB2OCBpZ25vcmUgbmV4dCAtLSBAcHJlc2VydmUgKi9cbiAgICBpZiAodGhpcy5yZWFkYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyByZWFkYWJsZSBJbyBhdmFpbGFibGUnKSk7XG4gICAgfVxuXG4gICAgLy9TaW1wbGUgc3RyYXRlZ3k6IHVzZSB0aGUgaGlnaGVzdCBwcmlvcml0eSByZWFkYWJsZSBJb1xuICAgIGNvbnN0IHJlYWRhYmxlID0gdGhpcy5yZWFkYWJsZXNbMF07XG5cbiAgICByZXR1cm4gcmVhZGFibGUucmF3VGFibGVDZmdzKCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLyoqXG4gICAqIFdyaXRlcyBkYXRhIHRvIGFsbCB1bmRlcmx5aW5nIHdyaXRhYmxlIElvIGluc3RhbmNlcy5cbiAgICogQHBhcmFtIHJlcXVlc3QgLSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgZGF0YSB0byB3cml0ZS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgZGF0YSBoYXMgYmVlbiB3cml0dGVuIHRvIGFsbCB3cml0YWJsZSBJbyBpbnN0YW5jZXMuXG4gICAqL1xuICB3cml0ZShyZXF1ZXN0OiB7IGRhdGE6IFJsanNvbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLyogdjggaWdub3JlIG5leHQgLS0gQHByZXNlcnZlICovXG4gICAgaWYgKHRoaXMud3JpdGFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignTm8gd3JpdGFibGUgSW8gYXZhaWxhYmxlJykpO1xuICAgIH1cblxuICAgIC8vIFdyaXRlIHRvIGFsbCB3cml0YWJsZXMgaW4gcGFyYWxsZWwgYW5kIHJlc29sdmUgd2hlbiBhbGwgaGF2ZSBjb21wbGV0ZWRcbiAgICBjb25zdCB3cml0ZXMgPSB0aGlzLndyaXRhYmxlcy5tYXAoKHdyaXRhYmxlKSA9PiB3cml0YWJsZS53cml0ZShyZXF1ZXN0KSk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHdyaXRlcykudGhlbigoKSA9PiBQcm9taXNlLnJlc29sdmUoKSk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLyoqXG4gICAqIFJlYWRzIHJvd3MgZnJvbSB0aGUgZmlyc3QgdW5kZXJseWluZyByZWFkYWJsZSBJbyBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSByZXF1ZXN0ZWQgdGFibGUgYW5kIGhhcyBtYXRjaGluZyByb3dzLlxuICAgKiBAcGFyYW0gcmVxdWVzdCBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgdGFibGUgbmFtZSBhbmQgd2hlcmUgY2xhdXNlLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmVhZCByb3dzLlxuICAgKi9cbiAgYXN5bmMgcmVhZFJvd3MocmVxdWVzdDoge1xuICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgd2hlcmU6IHsgW2NvbHVtbjogc3RyaW5nXTogSnNvblZhbHVlIHwgbnVsbCB9O1xuICB9KTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICAvKiB2OCBpZ25vcmUgbmV4dCAtLSBAcHJlc2VydmUgKi9cbiAgICBpZiAodGhpcy5yZWFkYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyByZWFkYWJsZSBJbyBhdmFpbGFibGUnKSk7XG4gICAgfVxuXG4gICAgbGV0IHRhYmxlRXhpc3RzQW55ID0gZmFsc2U7XG4gICAgY29uc3Qgcm93czogUmxqc29uW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHJlYWRhYmxlIG9mIHRoaXMucmVhZGFibGVzKSB7XG4gICAgICAvLyBDaGVjayBpZiB0YWJsZSBleGlzdHMgaW4gdGhpcyByZWFkYWJsZSBJb1xuICAgICAgY29uc3QgdGFibGVFeGlzdHMgPSBhd2FpdCByZWFkYWJsZS50YWJsZUV4aXN0cyhyZXF1ZXN0LnRhYmxlKTtcbiAgICAgIHRhYmxlRXhpc3RzQW55ID0gdGFibGVFeGlzdHNBbnkgfHwgdGFibGVFeGlzdHM7XG5cbiAgICAgIGlmICh0YWJsZUV4aXN0cykge1xuICAgICAgICAvLyBSZWFkIHJvd3MgZnJvbSB0aGlzIHJlYWRhYmxlIElvXG4gICAgICAgIGNvbnN0IHJlYWRSb3dzID0gYXdhaXQgcmVhZGFibGUucmVhZFJvd3MocmVxdWVzdCk7XG4gICAgICAgIGNvbnN0IHRhYmxlRGF0YTogVGFibGVUeXBlID0gcmVhZFJvd3NbcmVxdWVzdC50YWJsZV07XG4gICAgICAgIC8qIHY4IGlnbm9yZSBlbHNlIC0tIEBwcmVzZXJ2ZSAqL1xuICAgICAgICBpZiAodGFibGVEYXRhKSB7XG4gICAgICAgICAgcm93cy5wdXNoKHJlYWRSb3dzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGFibGVFeGlzdHNBbnkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFRhYmxlIFwiJHtyZXF1ZXN0LnRhYmxlfVwiIG5vdCBmb3VuZGApKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1lcmdlKC4uLnJvd3MpIGFzIFJsanNvbjtcbiAgICB9XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgcm93IGNvdW50IG9mIGEgc3BlY2lmaWMgdGFibGUgYnkgYWdncmVnYXRpbmcgcm93IGNvdW50cyBmcm9tIGFsbCBkdW1wYWJsZSB1bmRlcmx5aW5nIElvIGluc3RhbmNlcy5cbiAgICogQHBhcmFtIHRhYmxlIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJvdyBjb3VudCBvZiB0aGUgdGFibGUuXG4gICAqL1xuICBhc3luYyByb3dDb3VudCh0YWJsZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAvKiB2OCBpZ25vcmUgbmV4dCAtLSBAcHJlc2VydmUgKi9cbiAgICBpZiAodGhpcy5kdW1wYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyBkdW1wYWJsZSBJbyBhdmFpbGFibGUnKSk7XG4gICAgfVxuXG4gICAgY29uc3QgZHVtcFRhYmxlID0gYXdhaXQgdGhpcy5kdW1wVGFibGUoeyB0YWJsZSB9KTtcbiAgICBjb25zdCB0YWJsZURhdGE6IFRhYmxlVHlwZSA9IGR1bXBUYWJsZVt0YWJsZV07XG4gICAgLyogdjggaWdub3JlIG5leHQgLS0gQHByZXNlcnZlICovXG4gICAgaWYgKCF0YWJsZURhdGEpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFRhYmxlIFwiJHt0YWJsZX1cIiBub3QgZm91bmRgKSk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGFibGVEYXRhLl9kYXRhLmxlbmd0aCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2YgdW5kZXJseWluZyByZWFkYWJsZSBJbyBpbnN0YW5jZXMsIHNvcnRlZCBieSBwcmlvcml0eS5cbiAgICovXG4gIGdldCByZWFkYWJsZXMoKTogQXJyYXk8SW8+IHtcbiAgICByZXR1cm4gdGhpcy5faW9zXG4gICAgICAuZmlsdGVyKChpb011bHRpSW8pID0+IGlvTXVsdGlJby5yZWFkKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEucHJpb3JpdHkgLSBiLnByaW9yaXR5KVxuICAgICAgLm1hcCgoaW9NdWx0aUlvKSA9PiBpb011bHRpSW8uaW8pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIHVuZGVybHlpbmcgd3JpdGFibGUgSW8gaW5zdGFuY2VzLCBzb3J0ZWQgYnkgcHJpb3JpdHkuXG4gICAqL1xuICBnZXQgd3JpdGFibGVzKCk6IEFycmF5PElvPiB7XG4gICAgcmV0dXJuIHRoaXMuX2lvc1xuICAgICAgLmZpbHRlcigoaW9NdWx0aUlvKSA9PiBpb011bHRpSW8ud3JpdGUpXG4gICAgICAuc29ydCgoYSwgYikgPT4gYS5wcmlvcml0eSAtIGIucHJpb3JpdHkpXG4gICAgICAubWFwKChpb011bHRpSW8pID0+IGlvTXVsdGlJby5pbyk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2YgdW5kZXJseWluZyBkdW1wYWJsZSBJbyBpbnN0YW5jZXMsIHNvcnRlZCBieSBwcmlvcml0eS5cbiAgICovXG4gIGdldCBkdW1wYWJsZXMoKTogQXJyYXk8SW8+IHtcbiAgICByZXR1cm4gdGhpcy5faW9zXG4gICAgICAuZmlsdGVyKChpb011bHRpSW8pID0+IGlvTXVsdGlJby5kdW1wKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEucHJpb3JpdHkgLSBiLnByaW9yaXR5KVxuICAgICAgLm1hcCgoaW9NdWx0aUlvKSA9PiBpb011bHRpSW8uaW8pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHN0YXRpYyBleGFtcGxlID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGlvUGVlck1lbSA9IGF3YWl0IElvTWVtLmV4YW1wbGUoKTtcbiAgICBhd2FpdCBpb1BlZXJNZW0uaW5pdCgpO1xuXG4gICAgY29uc3QgaW9QZWVyU29ja2V0ID0gbmV3IFBlZXJTb2NrZXRNb2NrKGlvUGVlck1lbSk7XG4gICAgY29uc3QgaW9QZWVyID0gbmV3IElvUGVlcihpb1BlZXJTb2NrZXQpO1xuICAgIGF3YWl0IGlvUGVlci5pbml0KCk7XG5cbiAgICBjb25zdCBpb01lbSA9IGF3YWl0IElvTWVtLmV4YW1wbGUoKTtcbiAgICBhd2FpdCBpb01lbS5pbml0KCk7XG5cbiAgICBjb25zdCBpb3M6IEFycmF5PElvTXVsdGlJbz4gPSBbXG4gICAgICB7IGlvOiBpb1BlZXIsIHByaW9yaXR5OiAxLCByZWFkOiB0cnVlLCB3cml0ZTogZmFsc2UsIGR1bXA6IGZhbHNlIH0sXG4gICAgICB7IGlvOiBpb01lbSwgcHJpb3JpdHk6IDAsIHJlYWQ6IHRydWUsIHdyaXRlOiB0cnVlLCBkdW1wOiB0cnVlIH0sXG4gICAgXTtcblxuICAgIGNvbnN0IGlvTXVsdGkgPSBuZXcgSW9NdWx0aShpb3MpO1xuICAgIGF3YWl0IGlvTXVsdGkuaW5pdCgpO1xuXG4gICAgcmV0dXJuIGlvTXVsdGk7XG4gIH07XG59XG4iLCIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgSW8sIElvTWVtIH0gZnJvbSAnLi9pbmRleC50cyc7XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4vKipcbiAqIElvIGltcGxlbWVudGF0aW9uIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHRvIGJlIHVzZWQgaW5cbiAqIGNvbmZvcm1hbmNlIHRlc3RzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElvVGVzdFNldHVwIHtcbiAgLyoqIHNldHVwIGJlZm9yZSB0aGUgc2luZ2xlIHNldHVwcyAqL1xuICBiZWZvcmVBbGw6ICgpID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBpbyBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHJldHVybnMgVGhlIGlvIGltcGxlbWVudGF0aW9uLlxuICAgKi9cbiAgYmVmb3JlRWFjaDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVGVhcnMgZG93biB0aGUgaW8gaW1wbGVtZW50YXRpb24uXG4gICAqIEByZXR1cm5zIFRoZSBpbyBpbXBsZW1lbnRhdGlvbi5cbiAgICovXG4gIGFmdGVyRWFjaDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKiogY2xlYW51cCBhZnRlciBhbGwgdGVzdHMgKi9cbiAgYWZ0ZXJBbGw6ICgpID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFRoZSBpbyBpbXBsZW1lbnRhdGlvbiB0byBiZSB1c2VkIGluIHRoZSBjb25mb3JtYW5jZSB0ZXN0cy5cbiAgICovXG4gIGlvOiBJbztcbn1cblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8vIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIElvVGVzdFNldHVwIGludGVyZmFjZVxuZXhwb3J0IGNvbnN0IGV4YW1wbGVUZXN0U2V0dXAgPSAoKTogSW9UZXN0U2V0dXAgPT4ge1xuICByZXR1cm4ge1xuICAgIGlvOiBuZXcgSW9NZW0oKSxcbiAgICBiZWZvcmVBbGw6IGFzeW5jICgpID0+IHtcbiAgICAgIC8vIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGZvciBhbnkgYWRkaXRpb25hbCBzZXR1cCByZXF1aXJlZCBiZWZvcmUgaW5pdC5cbiAgICAgIC8vIEN1cnJlbnRseSwgaXQgZG9lcyBub3RoaW5nLlxuICAgIH0sXG5cbiAgICBiZWZvcmVFYWNoOiBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBJbml0aWFsaXplIHRoZSBpbyBpbXBsZW1lbnRhdGlvblxuICAgIH0sXG4gICAgYWZ0ZXJFYWNoOiBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBUZWFyIGRvd24gdGhlIGlvIGltcGxlbWVudGF0aW9uXG4gICAgfSxcblxuICAgIGFmdGVyQWxsOiBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCBmb3IgYW55IGFkZGl0aW9uYWwgY2xlYW51cCBhZnRlciB0ZWFyRG93bi5cbiAgICB9LFxuICB9O1xufTtcbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG5pbXBvcnQgeyBKc29uVmFsdWUgfSBmcm9tICdAcmxqc29uL2pzb24nO1xuaW1wb3J0IHsgQ29udGVudFR5cGUsIFJsanNvbiwgVGFibGVDZmcsIFRhYmxlS2V5IH0gZnJvbSAnQHJsanNvbi9ybGpzb24nO1xuXG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5leHBvcnQgaW50ZXJmYWNlIElvIHtcbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIEdlbmVyYWxcblxuICAvKiogU3RhcnRzIHRoZSBpbml0aWFsaXphdGlvbiAqL1xuICBpbml0KCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqIENsb3NlcyB0aGUgaW8gKi9cbiAgY2xvc2UoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKiogUmV0dXJucyB0cnVlIGlmIGlvIGlzIG9wZW5lZCAqL1xuICBpc09wZW46IGJvb2xlYW47XG5cbiAgLyoqIEEgcHJvbWlzZSByZXNvbHZpbmcgb25jZSB0aGUgSW8gaW50ZXJmYWNlIGlzIHJlYWR5XG4gICAqXG4gICAqIPCfkqEgVXNlIEBybGpzb24vaXMtcmVhZHlcbiAgICovXG4gIGlzUmVhZHkoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gRHVtcFxuXG4gIC8qKiBSZXR1cm5zIHRoZSBjb21wbGV0ZSBkYiBjb250ZW50IGFzIFJsanNvbiAqL1xuICBkdW1wKCk6IFByb21pc2U8Umxqc29uPjtcblxuICAvKiogUmV0dXJucyB0aGUgZHVtcCBvZiBhIGNvbXBsZXRlIHRhYmxlICovXG4gIGR1bXBUYWJsZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Umxqc29uPjtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gTWV0YSBEYXRhXG4gIGNvbnRlbnRUeXBlKHJlcXVlc3Q6IHsgdGFibGU6IHN0cmluZyB9KTogUHJvbWlzZTxDb250ZW50VHlwZT47XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFRhYmxlc1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRhYmxlIGV4aXN0c1xuICAgKi9cbiAgdGFibGVFeGlzdHModGFibGVLZXk6IFRhYmxlS2V5KTogUHJvbWlzZTxib29sZWFuPjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHRhYmxlIHdpdGggYSBnaXZlbiBjb25maWcuXG4gICAqIElmIHRoZSB0YWJsZSBhbHJlYWR5IGV4aXN0cywgbmV3IGNvbHVtbnMgYXJlIGFkZGVkIHRvIHRoZSBleGlzdGluZyB0YWJsZS5cbiAgICogSWYgdGhlIHRhYmxlIGRvZXMgbm90IGV4aXN0LCBpdCBpcyBjcmVhdGVkIHdpdGggdGhlIGdpdmVuIGNvbmZpZy5cbiAgICogSWYgdGhlIHRhYmxlIGV4aXN0cyBhbmQgY29sdW1ucyBhcmUgcmVtb3ZlZCwgYW4gZXJyb3IgaXMgdGhyb3duLlxuICAgKiBJZiB0aGUgdGFibGUgZXhpc3RzIGFuZCB0aGUgY29sdW1uIHR5cGUgaXMgY2hhbmdlZCwgYW4gZXJyb3IgaXMgdGhyb3duLlxuICAgKi9cbiAgY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0OiB7IHRhYmxlQ2ZnOiBUYWJsZUNmZyB9KTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogUmV0dXJucyBhIGpzb24gc3RydWN0dXJlIHJldHVybmluZyBjdXJyZW50IHRhYmxlIGNvbmZpZ3VyYXRpb25zXG4gICAqL1xuICByYXdUYWJsZUNmZ3MoKTogUHJvbWlzZTxUYWJsZUNmZ1tdPjtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gV3JpdGVcblxuICAvKiogV3JpdGVzIFJsanNvbiBkYXRhIGludG8gdGhlIGRhdGFiYXNlICovXG4gIHdyaXRlKHJlcXVlc3Q6IHsgZGF0YTogUmxqc29uIH0pOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBSZWFkIHJvd3NcblxuICAvKiogUXVlcmllcyBhIGxpc3Qgb2Ygcm93cyAqL1xuICByZWFkUm93cyhyZXF1ZXN0OiB7XG4gICAgdGFibGU6IHN0cmluZztcbiAgICB3aGVyZTogeyBbY29sdW1uOiBzdHJpbmddOiBKc29uVmFsdWUgfCBudWxsIH07XG4gIH0pOiBQcm9taXNlPFJsanNvbj47XG5cbiAgLyoqIFJldHVybnMgdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBnaXZlbiB0YWJsZSAqL1xuICByb3dDb3VudCh0YWJsZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+O1xufVxuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuZXhwb3J0IGNvbnN0IGV4YW1wbGVJbyA9XG4gICdDaGVja291dCBAcmxqc29uL2lvLW1lbSBmb3IgYW4gZXhhbXBsZSBpbXBsZW1lbnRhdGlvbic7XG4iLCIvKiB2OCBpZ25vcmUgZmlsZSAtLSBAcHJlc2VydmUgKi9cbi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG5pbXBvcnQgeyBKc29uIH0gZnJvbSAnQHJsanNvbi9qc29uJztcbmltcG9ydCB7XG4gIEJ1ZmZldCxcbiAgQ2FrZSxcbiAgaXRlcmF0ZVRhYmxlc1N5bmMsXG4gIExheWVyLFxuICBSZWYsXG4gIFJsanNvbixcbiAgVGFibGVLZXksXG59IGZyb20gJ0BybGpzb24vcmxqc29uJztcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8qKlxuICogRGVzY3JpYmVzIGEgcm93IHRoYXQgcmVmZXJlbmNlcyBhIGNoaWxkIHRhYmxlIHJvd1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcmVudFJlZiB7XG4gIC8qKlxuICAgKiBUaGUgcGFyZW50IHRhYmxlIHRoYXQgcmVmZXJlbmNlcyB0aGUgY2hpbGQgdGFibGVcbiAgICovXG4gIFtwYXJlbnRUYWJsZTogVGFibGVLZXldOiB7XG4gICAgLyoqXG4gICAgICogVGhlIHBhcmVudCByb3cgdGhhdCByZWZlcmVuY2VzIHRoZSBjaGlsZCByb3dcbiAgICAgKi9cbiAgICBbcGFyZW50Um93OiBSZWZdOiB7XG4gICAgICAvKipcbiAgICAgICAqIERldGFpbHMgYWJvdXQgdGhlIHJlZmVyZW5jZSwgZS5nLiBhbiBhcnJheSBpbmRleCBldGMuXG4gICAgICAgKi9cbiAgICAgIGRldGFpbHM/OiBKc29uO1xuICAgIH07XG4gIH07XG59XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4vKipcbiAqIERlc2NyaWJlcyB0aGUgcGFyZW50IHRhYmxlIHJvd3MgcmVmZXJlbmNpbmcgYSBjaGlsZCB0YWJsZSByb3dcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXZlcnNlUmVmcyB7XG4gIC8qKlxuICAgKiBUaGUgY2hpbGQgdGFibGUgd2UgbmVlZCB0aGUgcmVmZXJlbmNpbmcgcm93cyBmb3JcbiAgICovXG4gIFtjaGlsZFRhYmxlOiBUYWJsZUtleV06IHtcbiAgICAvKipcbiAgICAgKiBUaGUgcm93IGhhc2h3ZSBuZWVkIHRoZSByZWZlcmVuY2luZyByb3dzIGZvclxuICAgICAqL1xuICAgIFtjaGlsZFJvdzogUmVmXTogUGFyZW50UmVmO1xuICB9O1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgKi9cblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgcmV2ZXJzZSByZWZlcmVuY2VzIGZvciBhIGdpdmVuIHJsanNvbiBvYmplY3RcbiAqL1xuZXhwb3J0IGNvbnN0IGNhbGNSZXZlcnNlUmVmcyA9IChybGpzb246IFJsanNvbik6IFJldmVyc2VSZWZzID0+IHtcbiAgY29uc3QgcmVzdWx0OiBSZXZlcnNlUmVmcyA9IHt9O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gUHJlcGFyZSBkYXRhIHN0cnVjdHVyZVxuICBpdGVyYXRlVGFibGVzU3luYyhybGpzb24sIChjaGlsZFRhYmxlS2V5LCB0YWJsZSkgPT4ge1xuICAgIGNvbnN0IGNoaWxkVGFibGU6IHsgW2NoaWxkUm93SGFzaDogc3RyaW5nXTogUGFyZW50UmVmIH0gPSB7fTtcbiAgICByZXN1bHRbY2hpbGRUYWJsZUtleV0gPSBjaGlsZFRhYmxlO1xuICAgIGZvciAoY29uc3QgY2hpbGRSb3cgb2YgdGFibGUuX2RhdGEpIHtcbiAgICAgIGNoaWxkVGFibGVbY2hpbGRSb3cuX2hhc2hdID0ge307XG4gICAgfVxuICB9KTtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIEdlbmVyYXRlIHJldmVyc2UgcmVmZXJlbmNlc1xuICBpdGVyYXRlVGFibGVzU3luYyhybGpzb24sIChwYXJlbnRUYWJsZUtleSwgcGFyZW50VGFibGUpID0+IHtcbiAgICAvLyBJdGVyYXRlIGFsbCByb3dzIG9mIGVhY2ggdGFibGVcbiAgICBmb3IgKGNvbnN0IHBhcmVudFRhYmxlUm93IG9mIHBhcmVudFRhYmxlLl9kYXRhKSB7XG4gICAgICAvLyBGaW5kIG91dCB3aGUgb3RoZXIgdGFibGVzICYgcm93cyBhcmUgcmVmZXJlbmNlZCBieSB0aGlzIHJvd1xuICAgICAgLy8gV3JpdGUgdGhlc2UgaW5mb3JtYXRpb24gaW50dG8gcmVzdWx0XG4gICAgICBzd2l0Y2ggKHBhcmVudFRhYmxlLl90eXBlKSB7XG4gICAgICAgIGNhc2UgJ2NvbXBvbmVudHMnOlxuICAgICAgICAgIF93cml0ZUNvbXBvbmVudFJlZnMocGFyZW50VGFibGVLZXksIHBhcmVudFRhYmxlUm93LCByZXN1bHQpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2xheWVycyc6IHtcbiAgICAgICAgICBfd3JpdGVMYXllclJlZnMocGFyZW50VGFibGVLZXksIHBhcmVudFRhYmxlUm93LCByZXN1bHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnc2xpY2VJZHMnOiB7XG4gICAgICAgICAgLy8gU2xpY2UgaWRzIGRvIG5vdCByZWZlcmVuY2Ugb3RoZXIgdGFibGVzXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdjYWtlcyc6IHtcbiAgICAgICAgICBfd3JpdGVDYWtlUmVmcyhwYXJlbnRUYWJsZUtleSwgcGFyZW50VGFibGVSb3csIHJlc3VsdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdidWZmZXRzJzoge1xuICAgICAgICAgIF93cml0ZUJ1ZmZldFJlZnMocGFyZW50VGFibGVLZXksIHBhcmVudFRhYmxlUm93LCByZXN1bHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyogdjggaWdub3JlIGVuZCAqL1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuY29uc3QgX3dyaXRlQ29tcG9uZW50UmVmcyA9IChcbiAgcGFyZW50VGFibGVOYW1lOiBUYWJsZUtleSxcbiAgcGFyZW50Um93OiBKc29uLFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuKSA9PiB7XG4gIGNvbnN0IHBhcmVudFJvd0hhc2ggPSBwYXJlbnRSb3cuX2hhc2ggYXMgc3RyaW5nO1xuXG4gIGZvciAoY29uc3QgcGFyZW50Q29sdW1uTmFtZSBpbiBwYXJlbnRSb3cpIHtcbiAgICBpZiAocGFyZW50Q29sdW1uTmFtZS5zdGFydHNXaXRoKCdfJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghcGFyZW50Q29sdW1uTmFtZS5lbmRzV2l0aCgnUmVmJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkVGFibGVOYW1lID0gcGFyZW50Q29sdW1uTmFtZS5zbGljZSgwLCAtMyk7XG4gICAgY29uc3QgY2hpbGRSb3dIYXNoID0gcGFyZW50Um93W3BhcmVudENvbHVtbk5hbWVdIGFzIHN0cmluZztcblxuICAgIF93cml0ZShcbiAgICAgIHJlc3VsdCxcbiAgICAgIGNoaWxkVGFibGVOYW1lLFxuICAgICAgY2hpbGRSb3dIYXNoLFxuICAgICAgcGFyZW50VGFibGVOYW1lLFxuICAgICAgcGFyZW50Um93SGFzaCxcbiAgICApO1xuICB9XG59O1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuY29uc3QgX3dyaXRlTGF5ZXJSZWZzID0gKFxuICBwYXJlbnRUYWJsZU5hbWU6IFRhYmxlS2V5LFxuICBwYXJlbnRSb3c6IExheWVyLFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuKSA9PiB7XG4gIGNvbnN0IGNoaWxkVGFibGVOYW1lID0gcGFyZW50Um93LmNvbXBvbmVudHNUYWJsZTtcbiAgY29uc3QgcGFyZW50Um93SGFzaCA9IHBhcmVudFJvdy5faGFzaCBhcyBzdHJpbmc7XG5cbiAgZm9yIChjb25zdCBzbGljZUlkIGluIHBhcmVudFJvdy5hZGQpIHtcbiAgICBpZiAoc2xpY2VJZC5zdGFydHNXaXRoKCdfJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHNsaWNlSGFzaCA9IHBhcmVudFJvdy5hZGRbc2xpY2VJZF0gYXMgc3RyaW5nO1xuXG4gICAgX3dyaXRlKHJlc3VsdCwgY2hpbGRUYWJsZU5hbWUsIHNsaWNlSGFzaCwgcGFyZW50VGFibGVOYW1lLCBwYXJlbnRSb3dIYXNoKTtcbiAgfVxufTtcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbmNvbnN0IF93cml0ZUNha2VSZWZzID0gKFxuICBwYXJlbnRUYWJsZU5hbWU6IFRhYmxlS2V5LFxuICBwYXJlbnRSb3c6IENha2UsXG4gIHJlc3VsdDogUmV2ZXJzZVJlZnMsXG4pID0+IHtcbiAgY29uc3QgcGFyZW50Um93SGFzaCA9IHBhcmVudFJvdy5faGFzaCBhcyBzdHJpbmc7XG5cbiAgZm9yIChjb25zdCBsYXllciBpbiBwYXJlbnRSb3cubGF5ZXJzKSB7XG4gICAgY29uc3QgY2hpbGRUYWJsZU5hbWUgPSBsYXllcjtcbiAgICBjb25zdCBjaGlsZFJvd0hhc2ggPSBwYXJlbnRSb3cubGF5ZXJzW2xheWVyXSBhcyBzdHJpbmc7XG4gICAgX3dyaXRlKFxuICAgICAgcmVzdWx0LFxuICAgICAgY2hpbGRUYWJsZU5hbWUsXG4gICAgICBjaGlsZFJvd0hhc2gsXG4gICAgICBwYXJlbnRUYWJsZU5hbWUsXG4gICAgICBwYXJlbnRSb3dIYXNoLFxuICAgICk7XG4gIH1cbn07XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5jb25zdCBfd3JpdGVCdWZmZXRSZWZzID0gKFxuICBwYXJlbnRUYWJsZU5hbWU6IFRhYmxlS2V5LFxuICBwYXJlbnRSb3c6IEJ1ZmZldCxcbiAgcmVzdWx0OiBSZXZlcnNlUmVmcyxcbikgPT4ge1xuICBjb25zdCBwYXJlbnRSb3dIYXNoID0gcGFyZW50Um93Ll9oYXNoIGFzIHN0cmluZztcblxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGFyZW50Um93Lml0ZW1zKSB7XG4gICAgY29uc3QgY2hpbGRUYWJsZU5hbWUgPSBpdGVtLnRhYmxlO1xuICAgIGNvbnN0IGNoaWxkUm93SGFzaCA9IGl0ZW0ucmVmO1xuICAgIF93cml0ZShcbiAgICAgIHJlc3VsdCxcbiAgICAgIGNoaWxkVGFibGVOYW1lLFxuICAgICAgY2hpbGRSb3dIYXNoLFxuICAgICAgcGFyZW50VGFibGVOYW1lLFxuICAgICAgcGFyZW50Um93SGFzaCxcbiAgICApO1xuICB9XG59O1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuY29uc3QgX3dyaXRlID0gKFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuICBjaGlsZFRhYmxlTmFtZTogc3RyaW5nLFxuICBjaGlsZFJvd0hhc2g6IHN0cmluZyxcbiAgcGFyZW50VGFibGVOYW1lOiBzdHJpbmcsXG4gIHBhcmVudFJvd0hhc2g6IHN0cmluZyxcbikgPT4ge1xuICBjb25zdCByZWZlcmVuY2VzRm9yQ2hpbGRUYWJsZSA9IChyZXN1bHRbY2hpbGRUYWJsZU5hbWVdID8/PSB7fSk7XG4gIGNvbnN0IHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlUm93ID0gKHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlW2NoaWxkUm93SGFzaF0gPz89XG4gICAge30pO1xuXG4gIHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlUm93W3BhcmVudFRhYmxlTmFtZV0gPz89IHt9O1xuICByZWZlcmVuY2VzRm9yQ2hpbGRUYWJsZVJvd1twYXJlbnRUYWJsZU5hbWVdW3BhcmVudFJvd0hhc2hdID8/PSB7fTtcbn07XG4iLCIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cbi8qIHY4IGlnbm9yZSBmaWxlIC0tIEBwcmVzZXJ2ZSAqL1xuaW1wb3J0IHsgU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQudHMnO1xuXG5leHBvcnQgY2xhc3MgU29ja2V0TW9jayBpbXBsZW1lbnRzIFNvY2tldCB7XG4gIHB1YmxpYyBjb25uZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGRpc2Nvbm5lY3RlZDogYm9vbGVhbiA9IHRydWU7XG5cbiAgcHJpdmF0ZSBfbGlzdGVuZXJzOiBNYXA8c3RyaW5nIHwgc3ltYm9sLCBBcnJheTwoLi4uYXJnczogYW55W10pID0+IHZvaWQ+PiA9XG4gICAgbmV3IE1hcCgpO1xuICBwcml2YXRlIF9vbmNlTGlzdGVuZXJzOiBNYXA8XG4gICAgc3RyaW5nIHwgc3ltYm9sLFxuICAgIEFycmF5PCguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZD5cbiAgPiA9IG5ldyBNYXAoKTtcblxuICBjb25uZWN0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25uZWN0ZWQpIHtcbiAgICAgIHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuZGlzY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnKTtcbiAgICB9XG4gIH1cblxuICBkaXNjb25uZWN0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbm5lY3RlZCkge1xuICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGlzY29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuZW1pdCgnZGlzY29ubmVjdCcpO1xuICAgIH1cbiAgfVxuXG4gIG9uKGV2ZW50TmFtZTogc3RyaW5nIHwgc3ltYm9sLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdGhpcyB7XG4gICAgaWYgKCF0aGlzLl9saXN0ZW5lcnMuaGFzKGV2ZW50TmFtZSkpIHtcbiAgICAgIHRoaXMuX2xpc3RlbmVycy5zZXQoZXZlbnROYW1lLCBbXSk7XG4gICAgfVxuICAgIHRoaXMuX2xpc3RlbmVycy5nZXQoZXZlbnROYW1lKSEucHVzaChsaXN0ZW5lcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvbmNlKGV2ZW50TmFtZTogc3RyaW5nIHwgc3ltYm9sLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdGhpcyB7XG4gICAgaWYgKCF0aGlzLl9vbmNlTGlzdGVuZXJzLmhhcyhldmVudE5hbWUpKSB7XG4gICAgICB0aGlzLl9vbmNlTGlzdGVuZXJzLnNldChldmVudE5hbWUsIFtdKTtcbiAgICB9XG4gICAgdGhpcy5fb25jZUxpc3RlbmVycy5nZXQoZXZlbnROYW1lKSEucHVzaChsaXN0ZW5lcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvZmYoZXZlbnROYW1lOiBzdHJpbmcgfCBzeW1ib2wsIGxpc3RlbmVyPzogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdGhpcyB7XG4gICAgaWYgKGxpc3RlbmVyKSB7XG4gICAgICAvLyBSZW1vdmUgc3BlY2lmaWMgbGlzdGVuZXJcbiAgICAgIGNvbnN0IHJlZ3VsYXJMaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgICBpZiAocmVndWxhckxpc3RlbmVycykge1xuICAgICAgICBjb25zdCBpbmRleCA9IHJlZ3VsYXJMaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgcmVndWxhckxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9uY2VMaXN0ZW5lcnMgPSB0aGlzLl9vbmNlTGlzdGVuZXJzLmdldChldmVudE5hbWUpO1xuICAgICAgaWYgKG9uY2VMaXN0ZW5lcnMpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBvbmNlTGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgIG9uY2VMaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZW1vdmUgYWxsIGxpc3RlbmVycyBmb3IgdGhlIGV2ZW50XG4gICAgICB0aGlzLl9saXN0ZW5lcnMuZGVsZXRlKGV2ZW50TmFtZSk7XG4gICAgICB0aGlzLl9vbmNlTGlzdGVuZXJzLmRlbGV0ZShldmVudE5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGVtaXQoZXZlbnROYW1lOiBzdHJpbmcgfCBzeW1ib2wsIC4uLmFyZ3M6IGFueVtdKTogYm9vbGVhbiB7XG4gICAgbGV0IGhhc0xpc3RlbmVycyA9IGZhbHNlO1xuXG4gICAgLy8gRW1pdCB0byByZWd1bGFyIGxpc3RlbmVyc1xuICAgIGNvbnN0IHJlZ3VsYXJMaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgaWYgKHJlZ3VsYXJMaXN0ZW5lcnMgJiYgcmVndWxhckxpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgICBoYXNMaXN0ZW5lcnMgPSB0cnVlO1xuICAgICAgLy8gQ3JlYXRlIGEgY29weSB0byBhdm9pZCBpc3N1ZXMgaWYgbGlzdGVuZXJzIGFyZSByZW1vdmVkIGR1cmluZyBlbWlzc2lvblxuICAgICAgWy4uLnJlZ3VsYXJMaXN0ZW5lcnNdLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGlzdGVuZXIoLi4uYXJncyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gSW4gYSByZWFsIEV2ZW50RW1pdHRlciwgdGhpcyB3b3VsZCBiZSBoYW5kbGVkIGRpZmZlcmVudGx5XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIGBFcnJvciBpbiBsaXN0ZW5lciBmb3IgZXZlbnQgJHtTdHJpbmcoZXZlbnROYW1lKX06YCxcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEVtaXQgdG8gb25jZSBsaXN0ZW5lcnMgYW5kIHJlbW92ZSB0aGVtXG4gICAgY29uc3Qgb25jZUxpc3RlbmVycyA9IHRoaXMuX29uY2VMaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgaWYgKG9uY2VMaXN0ZW5lcnMgJiYgb25jZUxpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgICBoYXNMaXN0ZW5lcnMgPSB0cnVlO1xuICAgICAgLy8gQ3JlYXRlIGEgY29weSBhbmQgY2xlYXIgdGhlIG9yaWdpbmFsIGFycmF5XG4gICAgICBjb25zdCBsaXN0ZW5lcnNUb0NhbGwgPSBbLi4ub25jZUxpc3RlbmVyc107XG4gICAgICB0aGlzLl9vbmNlTGlzdGVuZXJzLmRlbGV0ZShldmVudE5hbWUpO1xuXG4gICAgICBsaXN0ZW5lcnNUb0NhbGwuZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsaXN0ZW5lciguLi5hcmdzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYEVycm9yIGluIG9uY2UgbGlzdGVuZXIgZm9yIGV2ZW50ICR7U3RyaW5nKGV2ZW50TmFtZSl9OmAsXG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gaGFzTGlzdGVuZXJzO1xuICB9XG5cbiAgcmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50TmFtZT86IHN0cmluZyB8IHN5bWJvbCk6IHRoaXMge1xuICAgIGlmIChldmVudE5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLmRlbGV0ZShldmVudE5hbWUpO1xuICAgICAgdGhpcy5fb25jZUxpc3RlbmVycy5kZWxldGUoZXZlbnROYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLmNsZWFyKCk7XG4gICAgICB0aGlzLl9vbmNlTGlzdGVuZXJzLmNsZWFyKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbGlzdGVuZXJDb3VudChldmVudE5hbWU6IHN0cmluZyB8IHN5bWJvbCk6IG51bWJlciB7XG4gICAgY29uc3QgcmVndWxhckNvdW50ID0gdGhpcy5fbGlzdGVuZXJzLmdldChldmVudE5hbWUpPy5sZW5ndGggfHwgMDtcbiAgICBjb25zdCBvbmNlQ291bnQgPSB0aGlzLl9vbmNlTGlzdGVuZXJzLmdldChldmVudE5hbWUpPy5sZW5ndGggfHwgMDtcbiAgICByZXR1cm4gcmVndWxhckNvdW50ICsgb25jZUNvdW50O1xuICB9XG5cbiAgbGlzdGVuZXJzKGV2ZW50TmFtZTogc3RyaW5nIHwgc3ltYm9sKTogQXJyYXk8KC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPiB7XG4gICAgY29uc3QgcmVndWxhckxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycy5nZXQoZXZlbnROYW1lKSB8fCBbXTtcbiAgICBjb25zdCBvbmNlTGlzdGVuZXJzID0gdGhpcy5fb25jZUxpc3RlbmVycy5nZXQoZXZlbnROYW1lKSB8fCBbXTtcbiAgICByZXR1cm4gWy4uLnJlZ3VsYXJMaXN0ZW5lcnMsIC4uLm9uY2VMaXN0ZW5lcnNdO1xuICB9XG5cbiAgZXZlbnROYW1lcygpOiBBcnJheTxzdHJpbmcgfCBzeW1ib2w+IHtcbiAgICBjb25zdCBhbGxFdmVudHMgPSBuZXcgU2V0KFtcbiAgICAgIC4uLnRoaXMuX2xpc3RlbmVycy5rZXlzKCksXG4gICAgICAuLi50aGlzLl9vbmNlTGlzdGVuZXJzLmtleXMoKSxcbiAgICBdKTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShhbGxFdmVudHMpO1xuICB9XG5cbiAgLy8gVGVzdCBoZWxwZXIgbWV0aG9kc1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgIHRoaXMuZGlzY29ubmVjdGVkID0gdHJ1ZTtcbiAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICB9XG5cbiAgc2ltdWxhdGVFcnJvcihlcnJvcjogRXJyb3IpOiB2b2lkIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IpO1xuICB9XG5cbiAgc2ltdWxhdGVNZXNzYWdlKG1lc3NhZ2U6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuZW1pdCgnbWVzc2FnZScsIG1lc3NhZ2UpO1xuICB9XG5cbiAgLy8gR2V0IGludGVybmFsIHN0YXRlIGZvciB0ZXN0aW5nXG4gIGdldExpc3RlbmVycygpOiBNYXA8c3RyaW5nIHwgc3ltYm9sLCBBcnJheTwoLi4uYXJnczogYW55W10pID0+IHZvaWQ+PiB7XG4gICAgcmV0dXJuIG5ldyBNYXAodGhpcy5fbGlzdGVuZXJzKTtcbiAgfVxuXG4gIGdldE9uY2VMaXN0ZW5lcnMoKTogTWFwPHN0cmluZyB8IHN5bWJvbCwgQXJyYXk8KC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPj4ge1xuICAgIHJldHVybiBuZXcgTWFwKHRoaXMuX29uY2VMaXN0ZW5lcnMpO1xuICB9XG59XG5cbi8vIC4uLmV4aXN0aW5nIGNvZGUuLi5cbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG4vL0ludGVyZmFjZSBmb3IgYSBnZW5lcmljIFNvY2tldCwgc2ltaWxhciB0byBOb2RlLmpzIEV2ZW50RW1pdHRlclxuLy9UaGlzIGlzIGEgc2ltcGxpZmllZCB2ZXJzaW9uIGFuZCBtYXkgbm90IGNvdmVyIGFsbCBmZWF0dXJlcyBvZiBhIGZ1bGwgRXZlbnRFbWl0dGVyXG5leHBvcnQgaW50ZXJmYWNlIFNvY2tldCB7XG4gIGNvbm5lY3RlZDogYm9vbGVhbjtcbiAgZGlzY29ubmVjdGVkOiBib29sZWFuO1xuICBjb25uZWN0KCk6IHZvaWQ7XG4gIGRpc2Nvbm5lY3QoKTogdm9pZDtcbiAgb24oZXZlbnROYW1lOiBzdHJpbmcgfCBzeW1ib2wsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiB0aGlzO1xuICBlbWl0KGV2ZW50TmFtZTogc3RyaW5nIHwgc3ltYm9sLCAuLi5hcmdzOiBhbnlbXSk6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBzb2NrZXRFeGFtcGxlID0gKCk6IFNvY2tldCA9PiAoe1xuICBjb25uZWN0ZWQ6IGZhbHNlLFxuICBkaXNjb25uZWN0ZWQ6IHRydWUsXG4gIGNvbm5lY3QoKSB7XG4gICAgdGhpcy5jb25uZWN0ZWQgPSB0cnVlO1xuICAgIHRoaXMuZGlzY29ubmVjdGVkID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0KCdjb25uZWN0Jyk7XG4gIH0sXG4gIGRpc2Nvbm5lY3QoKSB7XG4gICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmRpc2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgdGhpcy5lbWl0KCdkaXNjb25uZWN0Jyk7XG4gIH0sXG4gIC8qIHY4IGlnbm9yZSBuZXh0IC0tIEBwcmVzZXJ2ZSAqL1xuICBvbigpIHtcbiAgICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBldmVudCBsaXN0ZW5lciByZWdpc3RyYXRpb25cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgLyogdjggaWdub3JlIG5leHQgLS0gQHByZXNlcnZlICovXG4gIGVtaXQoKSB7XG4gICAgLy8gSW1wbGVtZW50YXRpb24gb2YgZXZlbnQgZW1pc3Npb25cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbn0pO1xuIl0sIm5hbWVzIjpbImUiXSwibWFwcGluZ3MiOiI7Ozs7QUFNTyxNQUFNLGdCQUFnQjtBQUFBO0FBQUEsRUFFcEIsbUJBQTJCO0FBQUEsRUFDM0IsY0FBc0I7QUFBQSxFQUN0QixhQUFxQjtBQUFBLEVBQ3JCLFlBQW9CO0FBQUE7QUFBQSxFQUdwQixhQUF3QztBQUFBLElBQzdDLE1BQU07QUFBQSxJQUNOLFVBQVU7QUFBQSxFQUFBO0FBQUE7QUFBQSxFQUlKLFVBQXFDO0FBQUEsSUFDM0MsS0FBSztBQUFBLElBQ0wsS0FBSztBQUFBLElBQ0wsS0FBSztBQUFBLEVBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQyxRQUFRLE1BQWMsS0FBcUI7QUFDakQsV0FBTyxLQUFLLFNBQVMsR0FBRyxJQUFJLE9BQU8sT0FBTztBQUFBLEVBQzVDO0FBQUEsRUFFTyxlQUFlLE1BQXNCO0FBQzFDLFdBQU8sS0FBSyxRQUFRLE1BQU0sS0FBSyxRQUFRLEdBQUc7QUFBQSxFQUM1QztBQUFBLEVBRU8sZ0JBQWdCLE1BQXNCO0FBQzNDLFdBQU8sS0FBSyxRQUFRLE1BQU0sS0FBSyxRQUFRLEdBQUc7QUFBQSxFQUM1QztBQUFBLEVBRU8sYUFBYSxNQUFzQjtBQUN4QyxXQUFPLEtBQUssUUFBUSxNQUFNLEtBQUssUUFBUSxHQUFHO0FBQUEsRUFDNUM7QUFBQSxFQUVRLFdBQVcsTUFBYyxLQUFxQjtBQUNwRCxXQUFPLEtBQUssU0FBUyxHQUFHLElBQUksS0FBSyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE1BQU0sSUFBSTtBQUFBLEVBQzNEO0FBQUEsRUFFTyxr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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rljson/io",
3
- "version": "0.0.61",
3
+ "version": "0.0.62",
4
4
  "description": "Low level interface for reading and writing RLJSON data",
5
5
  "homepage": "https://github.com/rljson/io",
6
6
  "bugs": "https://github.com/rljson/io/issues",
@@ -20,9 +20,9 @@
20
20
  ],
21
21
  "type": "module",
22
22
  "devDependencies": {
23
- "@types/node": "^24.10.1",
24
- "@typescript-eslint/eslint-plugin": "^8.48.1",
25
- "@typescript-eslint/parser": "^8.48.1",
23
+ "@types/node": "^24.10.2",
24
+ "@typescript-eslint/eslint-plugin": "^8.49.0",
25
+ "@typescript-eslint/parser": "^8.49.0",
26
26
  "@vitest/coverage-v8": "^4.0.15",
27
27
  "cross-env": "^10.1.0",
28
28
  "eslint": "^9.39.1",
@@ -32,7 +32,7 @@
32
32
  "jsdoc": "^4.0.5",
33
33
  "read-pkg": "^10.0.0",
34
34
  "typescript": "~5.9.3",
35
- "typescript-eslint": "^8.48.1",
35
+ "typescript-eslint": "^8.49.0",
36
36
  "vite": "^7.2.7",
37
37
  "vite-node": "^5.2.0",
38
38
  "vite-plugin-dts": "^4.5.4",