@decaf-ts/db-decorators 0.6.8 → 0.6.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -500,273 +500,6 @@
500
500
  }
501
501
  }
502
502
 
503
- /**
504
- * @description Internal function to register operation handlers
505
- * @summary Registers an operation handler for a specific operation key on a target property
506
- * @param {OperationKeys} op - The operation key to handle
507
- * @param {OperationHandler<any, any, any, any, any>} handler - The handler function to register
508
- * @return {PropertyDecorator} A decorator that registers the handler
509
- * @function handle
510
- * @category Property Decorators
511
- */
512
- function handle(op, handler) {
513
- return (target, propertyKey) => {
514
- Operations.register(handler, op, target, propertyKey);
515
- };
516
- }
517
- /**
518
- * @description Decorator for handling create and update operations
519
- * @summary Defines a behavior to execute during both create and update operations
520
- * @template V - Type for metadata, defaults to object
521
- * @param {StandardOperationHandler<any, any, V, any, any> | UpdateOperationHandler<any, any, V, any, any>} handler - The method called upon the operation
522
- * @param {V} [data] - Optional metadata to pass to the handler
523
- * @return {PropertyDecorator} A decorator that can be applied to class properties
524
- * @function onCreateUpdate
525
- * @category Property Decorators
526
- */
527
- function onCreateUpdate(handler, data) {
528
- return on(DBOperations.CREATE_UPDATE, handler, data);
529
- }
530
- /**
531
- * @description Decorator for handling update operations
532
- * @summary Defines a behavior to execute during update operations
533
- * @template V - Type for metadata, defaults to object
534
- * @param {UpdateOperationHandler<any, any, V, any>} handler - The method called upon the operation
535
- * @param {V} [data] - Optional metadata to pass to the handler
536
- * @return {PropertyDecorator} A decorator that can be applied to class properties
537
- * @function onUpdate
538
- * @category Property Decorators
539
- */
540
- function onUpdate(handler, data) {
541
- return on(DBOperations.UPDATE, handler, data);
542
- }
543
- /**
544
- * @description Decorator for handling create operations
545
- * @summary Defines a behavior to execute during create operations
546
- * @template V - Type for metadata, defaults to object
547
- * @param {StandardOperationHandler<any, any, V, any, any>} handler - The method called upon the operation
548
- * @param {V} [data] - Optional metadata to pass to the handler
549
- * @return {PropertyDecorator} A decorator that can be applied to class properties
550
- * @function onCreate
551
- * @category Property Decorators
552
- */
553
- function onCreate(handler, data) {
554
- return on(DBOperations.CREATE, handler, data);
555
- }
556
- /**
557
- * @description Decorator for handling read operations
558
- * @summary Defines a behavior to execute during read operations
559
- * @template V - Type for metadata, defaults to object
560
- * @param {IdOperationHandler<any, any, V, any, any>} handler - The method called upon the operation
561
- * @param {V} [data] - Optional metadata to pass to the handler
562
- * @return {PropertyDecorator} A decorator that can be applied to class properties
563
- * @function onRead
564
- * @category Property Decorators
565
- */
566
- function onRead(handler, data) {
567
- return on(DBOperations.READ, handler, data);
568
- }
569
- /**
570
- * @description Decorator for handling delete operations
571
- * @summary Defines a behavior to execute during delete operations
572
- * @template V - Type for metadata, defaults to object
573
- * @param {OperationHandler<any, any, V, any, any>} handler - The method called upon the operation
574
- * @param {V} [data] - Optional metadata to pass to the handler
575
- * @return {PropertyDecorator} A decorator that can be applied to class properties
576
- * @function onDelete
577
- * @category Property Decorators
578
- */
579
- function onDelete(handler, data) {
580
- return on(DBOperations.DELETE, handler, data);
581
- }
582
- /**
583
- * @description Decorator for handling all operation types
584
- * @summary Defines a behavior to execute during any database operation
585
- * @template V - Type for metadata, defaults to object
586
- * @param {OperationHandler<any, any, V, any, any>} handler - The method called upon the operation
587
- * @param {V} [data] - Optional metadata to pass to the handler
588
- * @return {PropertyDecorator} A decorator that can be applied to class properties
589
- * @function onAny
590
- * @category Property Decorators
591
- */
592
- function onAny(handler, data) {
593
- return on(DBOperations.ALL, handler, data);
594
- }
595
- /**
596
- * @description Base decorator for handling database operations
597
- * @summary Defines a behavior to execute during specified database operations
598
- * @template V - Type for metadata, defaults to object
599
- * @param {OperationKeys[] | DBOperations} [op=DBOperations.ALL] - One or more operation types to handle
600
- * @param {OperationHandler<any, any, V, any, any>} handler - The method called upon the operation
601
- * @param {V} [data] - Optional metadata to pass to the handler
602
- * @return {PropertyDecorator} A decorator that can be applied to class properties
603
- * @function on
604
- * @category Property Decorators
605
- * @example
606
- * // Example usage:
607
- * class MyModel {
608
- * @on(DBOperations.CREATE, myHandler)
609
- * myProperty: string;
610
- * }
611
- */
612
- function on(op = DBOperations.ALL, handler, data) {
613
- return operation(exports.OperationKeys.ON, op, handler, data);
614
- }
615
- /**
616
- * @description Decorator for handling post-create and post-update operations
617
- * @summary Defines a behavior to execute after both create and update operations
618
- * @template V - Type for metadata, defaults to object
619
- * @param {StandardOperationHandler<any, any, V, any, any> | UpdateOperationHandler<any, any, V, any, any>} handler - The method called after the operation
620
- * @param {V} [data] - Optional metadata to pass to the handler
621
- * @return {PropertyDecorator} A decorator that can be applied to class properties
622
- * @function afterCreateUpdate
623
- * @category Property Decorators
624
- */
625
- function afterCreateUpdate(handler, data) {
626
- return after(DBOperations.CREATE_UPDATE, handler, data);
627
- }
628
- /**
629
- * @description Decorator for handling post-update operations
630
- * @summary Defines a behavior to execute after update operations
631
- * @template V - Type for metadata, defaults to object
632
- * @param {UpdateOperationHandler<any, any, V, any, any>} handler - The method called after the operation
633
- * @param {V} [data] - Optional metadata to pass to the handler
634
- * @return {PropertyDecorator} A decorator that can be applied to class properties
635
- * @function afterUpdate
636
- * @category Property Decorators
637
- */
638
- function afterUpdate(handler, data) {
639
- return after(DBOperations.UPDATE, handler, data);
640
- }
641
- /**
642
- * @description Decorator for handling post-create operations
643
- * @summary Defines a behavior to execute after create operations
644
- * @template V - Type for metadata, defaults to object
645
- * @param {StandardOperationHandler<any, any, V, any, any>} handler - The method called after the operation
646
- * @param {V} [data] - Optional metadata to pass to the handler
647
- * @return {PropertyDecorator} A decorator that can be applied to class properties
648
- * @function afterCreate
649
- * @category Property Decorators
650
- */
651
- function afterCreate(handler, data) {
652
- return after(DBOperations.CREATE, handler, data);
653
- }
654
- /**
655
- * @description Decorator for handling post-read operations
656
- * @summary Defines a behavior to execute after read operations
657
- * @template V - Type for metadata, defaults to object
658
- * @param {StandardOperationHandler<any, any, V, any, any>} handler - The method called after the operation
659
- * @param {V} [data] - Optional metadata to pass to the handler
660
- * @return {PropertyDecorator} A decorator that can be applied to class properties
661
- * @function afterRead
662
- * @category Property Decorators
663
- */
664
- function afterRead(handler, data) {
665
- return after(DBOperations.READ, handler, data);
666
- }
667
- /**
668
- * @description Decorator for handling post-delete operations
669
- * @summary Defines a behavior to execute after delete operations
670
- * @template V - Type for metadata, defaults to object
671
- * @param {StandardOperationHandler<any, any, V, any, any>} handler - The method called after the operation
672
- * @param {V} [data] - Optional metadata to pass to the handler
673
- * @return {PropertyDecorator} A decorator that can be applied to class properties
674
- * @function afterDelete
675
- * @category Property Decorators
676
- */
677
- function afterDelete(handler, data) {
678
- return after(DBOperations.DELETE, handler, data);
679
- }
680
- /**
681
- * @description Decorator for handling post-operation for all operation types
682
- * @summary Defines a behavior to execute after any database operation
683
- * @template V - Type for metadata, defaults to object
684
- * @param {StandardOperationHandler<any, any, V, any, any>} handler - The method called after the operation
685
- * @param {V} [data] - Optional metadata to pass to the handler
686
- * @return {PropertyDecorator} A decorator that can be applied to class properties
687
- * @function afterAny
688
- * @category Property Decorators
689
- */
690
- function afterAny(handler, data) {
691
- return after(DBOperations.ALL, handler, data);
692
- }
693
- /**
694
- * @description Base decorator for handling post-operation behaviors
695
- * @summary Defines a behavior to execute after specified database operations
696
- * @template V - Type for metadata, defaults to object
697
- * @param {OperationKeys[] | DBOperations} [op=DBOperations.ALL] - One or more operation types to handle
698
- * @param {OperationHandler<any, any, V, any, any>} handler - The method called after the operation
699
- * @param {V} [data] - Optional metadata to pass to the handler
700
- * @return {PropertyDecorator} A decorator that can be applied to class properties
701
- * @function after
702
- * @category Property Decorators
703
- * @example
704
- * // Example usage:
705
- * class MyModel {
706
- * @after(DBOperations.CREATE, myHandler)
707
- * myProperty: string;
708
- * }
709
- */
710
- function after(op = DBOperations.ALL, handler, data) {
711
- return operation(exports.OperationKeys.AFTER, op, handler, data);
712
- }
713
- /**
714
- * @description Core decorator factory for operation handlers
715
- * @summary Creates decorators that register handlers for database operations
716
- * @template V - Type for metadata, defaults to object
717
- * @param {OperationKeys.ON | OperationKeys.AFTER} baseOp - Whether the handler runs during or after the operation
718
- * @param {OperationKeys[]} [operation=DBOperations.ALL] - The specific operations to handle
719
- * @param {OperationHandler<any, any, V, any, any>} handler - The handler function to execute
720
- * @param {V} [dataToAdd] - Optional metadata to pass to the handler
721
- * @return {PropertyDecorator} A decorator that can be applied to class properties
722
- * @function operation
723
- * @category Property Decorators
724
- * @mermaid
725
- * sequenceDiagram
726
- * participant Client
727
- * participant Decorator as @operation
728
- * participant Operations as Operations Registry
729
- * participant Handler
730
- *
731
- * Client->>Decorator: Apply to property
732
- * Decorator->>Operations: Register handler
733
- * Decorator->>Decorator: Store metadata
734
- *
735
- * Note over Client,Handler: Later, during operation execution
736
- * Client->>Operations: Execute operation
737
- * Operations->>Handler: Call registered handler
738
- * Handler-->>Operations: Return result
739
- * Operations-->>Client: Return final result
740
- */
741
- function operation(baseOp, operation = DBOperations.ALL, handler, dataToAdd) {
742
- return (target, propertyKey) => {
743
- const name = target.constructor.name;
744
- const decorators = operation.reduce((accum, op) => {
745
- const compoundKey = baseOp + op;
746
- let data = Reflect.getMetadata(Operations.key(compoundKey), target, propertyKey);
747
- if (!data)
748
- data = {
749
- operation: op,
750
- handlers: {},
751
- };
752
- const handlerKey = Operations.getHandlerName(handler);
753
- if (!data.handlers[name] ||
754
- !data.handlers[name][propertyKey] ||
755
- !(handlerKey in data.handlers[name][propertyKey])) {
756
- data.handlers[name] = data.handlers[name] || {};
757
- data.handlers[name][propertyKey] =
758
- data.handlers[name][propertyKey] || {};
759
- data.handlers[name][propertyKey][handlerKey] = {
760
- data: dataToAdd,
761
- };
762
- accum.push(handle(compoundKey, handler), decoratorValidation.propMetadata(Operations.key(compoundKey), data));
763
- }
764
- return accum;
765
- }, []);
766
- return reflection.apply(...decorators)(target, propertyKey);
767
- };
768
- }
769
-
770
503
  /**
771
504
  * @description Base error class for the repository module
772
505
  * @summary Abstract base error class that all other error types extend from. Provides common error handling functionality and standardized HTTP code mapping.
@@ -949,37 +682,29 @@
949
682
  const decorators = getDbDecorators(model, operation, prefix);
950
683
  if (!decorators)
951
684
  return;
952
- for (const prop in decorators) {
953
- const decs = decorators[prop];
954
- for (const dec of decs) {
955
- const { key } = dec;
956
- const handlers = Operations.get(model, prop, prefix + key);
957
- if (!handlers || !handlers.length)
958
- throw new InternalError(`Could not find registered handler for the operation ${prefix + key} under property ${prop}`);
959
- const handlerArgs = getHandlerArgs(dec, prop, model);
960
- if (!handlerArgs || Object.values(handlerArgs).length !== handlers.length)
961
- throw new InternalError("Args and handlers length do not match");
962
- let handler;
963
- let data;
964
- for (let i = 0; i < handlers.length; i++) {
965
- handler = handlers[i];
966
- data = Object.values(handlerArgs)[i];
967
- const args = [context, data.data, prop, model];
968
- if (operation === exports.OperationKeys.UPDATE && prefix === exports.OperationKeys.ON) {
969
- if (!oldModel)
970
- throw new InternalError("Missing old model for update operation");
971
- args.push(oldModel);
972
- }
973
- try {
974
- await handler.apply(repo, args);
975
- }
976
- catch (e) {
977
- const msg = `Failed to execute handler ${handler.name} for ${prop} on ${model.constructor.name} due to error: ${e}`;
978
- if (context.get("breakOnHandlerError"))
979
- throw new InternalError(msg);
980
- console.log(msg);
981
- }
982
- }
685
+ const hanlersDecorators = getHandlersDecorators(model, decorators, prefix);
686
+ const groupedDecorators = groupDecorators(hanlersDecorators);
687
+ const sortedDecorators = sortDecorators(groupedDecorators);
688
+ for (const dec of sortedDecorators) {
689
+ const args = [
690
+ context,
691
+ dec.data.length > 1 ? dec.data : dec.data[0],
692
+ dec.prop.length > 1 ? dec.prop : dec.prop[0],
693
+ model,
694
+ ];
695
+ if (operation === exports.OperationKeys.UPDATE && prefix === exports.OperationKeys.ON) {
696
+ if (!oldModel)
697
+ throw new InternalError("Missing old model for update operation");
698
+ args.push(oldModel);
699
+ }
700
+ try {
701
+ await dec.handler.apply(repo, args);
702
+ }
703
+ catch (e) {
704
+ const msg = `Failed to execute handler ${dec.handler.name} for ${dec.prop} on ${model.constructor.name} due to error: ${e}`;
705
+ if (context.get("breakOnHandlerError"))
706
+ throw new InternalError(msg);
707
+ console.log(msg);
983
708
  }
984
709
  }
985
710
  }
@@ -1078,6 +803,383 @@
1078
803
  return getAllPropertyDecoratorsRecursive(proto, accumulator, ...prefixes);
1079
804
  };
1080
805
 
806
+ const defaultPriority = 50;
807
+ const DefaultGroupSort = { priority: defaultPriority };
808
+ /**
809
+ * @description Internal function to register operation handlers
810
+ * @summary Registers an operation handler for a specific operation key on a target property
811
+ * @param {OperationKeys} op - The operation key to handle
812
+ * @param {OperationHandler<any, any, any, any, any>} handler - The handler function to register
813
+ * @return {PropertyDecorator} A decorator that registers the handler
814
+ * @function handle
815
+ * @category Property Decorators
816
+ */
817
+ function handle(op, handler) {
818
+ return (target, propertyKey) => {
819
+ Operations.register(handler, op, target, propertyKey);
820
+ };
821
+ }
822
+ /**
823
+ * @description Retrieves decorator objects for handling database operations
824
+ * @summary Retrieves a list of decorator objects representing operation handlers for a given model and decorators
825
+ * @template M - Type for the model, defaults to Model<true | false>
826
+ * @template R - Type for the repository, defaults to IRepository<M, F, C>
827
+ * @template V - Type for metadata, defaults to object
828
+ * @template F - Type for repository flags, defaults to RepositoryFlags
829
+ * @template C - Type for context, defaults to Context<F>
830
+ * @param {Model} model - The model for which to retrieve decorator objects
831
+ * @param {Record<string, DecoratorMetadata[]>} decorators - The decorators associated with the model properties
832
+ * @param {string} prefix - The operation prefix (e.g., 'on', 'after')
833
+ * @return {DecoratorObject[]} An array of decorator objects representing operation handlers
834
+ * @function getHandlersDecorators
835
+ * @category Function
836
+ */
837
+ function getHandlersDecorators(model, decorators, prefix) {
838
+ const accum = [];
839
+ for (const prop in decorators) {
840
+ const decs = decorators[prop];
841
+ for (const dec of decs) {
842
+ const { key } = dec;
843
+ const handlers = Operations.get(model, prop, prefix + key);
844
+ if (!handlers || !handlers.length)
845
+ throw new InternalError(`Could not find registered handler for the operation ${prefix + key} under property ${prop}`);
846
+ const handlerArgs = getHandlerArgs(dec, prop, model);
847
+ if (!handlerArgs || Object.values(handlerArgs).length !== handlers.length)
848
+ throw new InternalError("Args and handlers length do not match");
849
+ for (let i = 0; i < handlers.length; i++) {
850
+ const data = handlerArgs[handlers[i].name]
851
+ .data;
852
+ accum.push({
853
+ handler: handlers[i],
854
+ data: [data],
855
+ prop: [prop],
856
+ });
857
+ }
858
+ }
859
+ }
860
+ return accum;
861
+ }
862
+ /**
863
+ * @description Groups decorators based on their group property
864
+ * @summary Groups decorator objects by their group property, combining data and properties within each group
865
+ * @param {DecoratorObject[]} decorators - The array of decorator objects to group
866
+ * @return {DecoratorObject[]} An array of grouped decorator objects
867
+ * @function groupDecorators
868
+ * @category Function
869
+ */
870
+ function groupDecorators(decorators) {
871
+ const grouped = decorators.reduce((acc, dec) => {
872
+ if (!dec || !dec.data || !dec.prop)
873
+ throw new InternalError("Missing decorator properties or data");
874
+ // If decorator have no group
875
+ if (!dec.data[0].group) {
876
+ acc.set(Symbol(), dec);
877
+ return acc;
878
+ }
879
+ const groupKey = dec.data[0].group;
880
+ if (!acc.has(groupKey)) {
881
+ // first handler is saved in the group
882
+ acc.set(groupKey, { ...dec });
883
+ }
884
+ else {
885
+ const existing = acc.get(groupKey);
886
+ acc.set(groupKey, {
887
+ handler: existing.handler,
888
+ data: [...existing.data, ...dec.data],
889
+ prop: [...existing.prop, ...dec.prop],
890
+ });
891
+ }
892
+ return acc;
893
+ }, new Map());
894
+ const groups = Array.from(grouped.values());
895
+ // Sort inside each group by priority
896
+ groups.forEach((group) => {
897
+ const combined = group.data.map((d, i) => ({
898
+ data: d,
899
+ prop: group.prop[i],
900
+ }));
901
+ combined.sort((a, b) => (a.data.groupPriority ?? 50) - (b.data.groupPriority ?? 50));
902
+ group.data = combined.map((c) => c.data);
903
+ group.prop = combined.map((c) => c.prop);
904
+ });
905
+ return groups;
906
+ }
907
+ /**
908
+ * @description Sorts decorator objects based on their priority
909
+ * @summary Sorts an array of decorator objects by the priority of their first data element
910
+ * @param {DecoratorObject[]} decorators - The array of decorator objects to sort
911
+ * @return {DecoratorObject[]} The sorted array of decorator objects
912
+ * @function sortDecorators
913
+ * @category Function
914
+ */
915
+ function sortDecorators(decorators) {
916
+ // Sort by groupPriority
917
+ decorators.sort((a, b) => {
918
+ const priorityA = a.data[0].priority ?? defaultPriority;
919
+ const priorityB = b.data[0].priority ?? defaultPriority;
920
+ return priorityA - priorityB; // lower number = higher priority
921
+ });
922
+ return decorators;
923
+ }
924
+ /**
925
+ * @description Decorator for handling create and update operations
926
+ * @summary Defines a behavior to execute during both create and update operations
927
+ * @template V - Type for metadata, defaults to object
928
+ * @param {GeneralOperationHandler<any, any, V, any, any> | GeneralUpdateOperationHandler<any, any, V, any, any>} handler - The method called upon the operation
929
+ * @param {V} [data] - Optional metadata to pass to the handler
930
+ * @return {PropertyDecorator} A decorator that can be applied to class properties
931
+ * @function onCreateUpdate
932
+ * @category Property Decorators
933
+ */
934
+ function onCreateUpdate(handler, data, groupsort) {
935
+ return on(DBOperations.CREATE_UPDATE, handler, data, groupsort);
936
+ }
937
+ /**
938
+ * @description Decorator for handling update operations
939
+ * @summary Defines a behavior to execute during update operations
940
+ * @template V - Type for metadata, defaults to object
941
+ * @param {UpdateOperationHandler<any, any, V, any>} handler - The method called upon the operation
942
+ * @param {V} [data] - Optional metadata to pass to the handler
943
+ * @return {PropertyDecorator} A decorator that can be applied to class properties
944
+ * @function onUpdate
945
+ * @category Property Decorators
946
+ */
947
+ function onUpdate(handler, data, groupsort) {
948
+ return on(DBOperations.UPDATE, handler, data, groupsort);
949
+ }
950
+ /**
951
+ * @description Decorator for handling create operations
952
+ * @summary Defines a behavior to execute during create operations
953
+ * @template V - Type for metadata, defaults to object
954
+ * @param {GeneralOperationHandler<any, any, V, any, any>} handler - The method called upon the operation
955
+ * @param {V} [data] - Optional metadata to pass to the handler
956
+ * @return {PropertyDecorator} A decorator that can be applied to class properties
957
+ * @function onCreate
958
+ * @category Property Decorators
959
+ */
960
+ function onCreate(handler, data, groupsort) {
961
+ return on(DBOperations.CREATE, handler, data, groupsort);
962
+ }
963
+ /**
964
+ * @description Decorator for handling read operations
965
+ * @summary Defines a behavior to execute during read operations
966
+ * @template V - Type for metadata, defaults to object
967
+ * @param {IdOperationHandler<any, any, V, any, any>} handler - The method called upon the operation
968
+ * @param {V} [data] - Optional metadata to pass to the handler
969
+ * @return {PropertyDecorator} A decorator that can be applied to class properties
970
+ * @function onRead
971
+ * @category Property Decorators
972
+ */
973
+ function onRead(handler, data, groupsort) {
974
+ return on(DBOperations.READ, handler, data, groupsort);
975
+ }
976
+ /**
977
+ * @description Decorator for handling delete operations
978
+ * @summary Defines a behavior to execute during delete operations
979
+ * @template V - Type for metadata, defaults to object
980
+ * @param {OperationHandler<any, any, V, any, any>} handler - The method called upon the operation
981
+ * @param {V} [data] - Optional metadata to pass to the handler
982
+ * @return {PropertyDecorator} A decorator that can be applied to class properties
983
+ * @function onDelete
984
+ * @category Property Decorators
985
+ */
986
+ function onDelete(handler, data, groupsort) {
987
+ return on(DBOperations.DELETE, handler, data, groupsort);
988
+ }
989
+ /**
990
+ * @description Decorator for handling all operation types
991
+ * @summary Defines a behavior to execute during any database operation
992
+ * @template V - Type for metadata, defaults to object
993
+ * @param {OperationHandler<any, any, V, any, any>} handler - The method called upon the operation
994
+ * @param {V} [data] - Optional metadata to pass to the handler
995
+ * @return {PropertyDecorator} A decorator that can be applied to class properties
996
+ * @function onAny
997
+ * @category Property Decorators
998
+ */
999
+ function onAny(handler, data, groupsort) {
1000
+ return on(DBOperations.ALL, handler, data, groupsort);
1001
+ }
1002
+ /**
1003
+ * @description Base decorator for handling database operations
1004
+ * @summary Defines a behavior to execute during specified database operations
1005
+ * @template V - Type for metadata, defaults to object
1006
+ * @param {OperationKeys[] | DBOperations} [op=DBOperations.ALL] - One or more operation types to handle
1007
+ * @param {OperationHandler<any, any, V, any, any>} handler - The method called upon the operation
1008
+ * @param {V} [data] - Optional metadata to pass to the handler
1009
+ * @return {PropertyDecorator} A decorator that can be applied to class properties
1010
+ * @function on
1011
+ * @category Property Decorators
1012
+ * @example
1013
+ * // Example usage:
1014
+ * class MyModel {
1015
+ * @on(DBOperations.CREATE, myHandler)
1016
+ * myProperty: string;
1017
+ * }
1018
+ */
1019
+ function on(op = DBOperations.ALL, handler, data, groupsort) {
1020
+ return operation(exports.OperationKeys.ON, op, handler, data, groupsort);
1021
+ }
1022
+ /**
1023
+ * @description Decorator for handling post-create and post-update operations
1024
+ * @summary Defines a behavior to execute after both create and update operations
1025
+ * @template V - Type for metadata, defaults to object
1026
+ * @param {StandardOperationHandler<any, any, V, any, any> | UpdateOperationHandler<any, any, V, any, any>} handler - The method called after the operation
1027
+ * @param {V} [data] - Optional metadata to pass to the handler
1028
+ * @return {PropertyDecorator} A decorator that can be applied to class properties
1029
+ * @function afterCreateUpdate
1030
+ * @category Property Decorators
1031
+ */
1032
+ function afterCreateUpdate(handler, data, groupsort) {
1033
+ return after(DBOperations.CREATE_UPDATE, handler, data, groupsort);
1034
+ }
1035
+ /**
1036
+ * @description Decorator for handling post-update operations
1037
+ * @summary Defines a behavior to execute after update operations
1038
+ * @template V - Type for metadata, defaults to object
1039
+ * @param {UpdateOperationHandler<any, any, V, any, any>} handler - The method called after the operation
1040
+ * @param {V} [data] - Optional metadata to pass to the handler
1041
+ * @return {PropertyDecorator} A decorator that can be applied to class properties
1042
+ * @function afterUpdate
1043
+ * @category Property Decorators
1044
+ */
1045
+ function afterUpdate(handler, data, groupsort) {
1046
+ return after(DBOperations.UPDATE, handler, data, groupsort);
1047
+ }
1048
+ /**
1049
+ * @description Decorator for handling post-create operations
1050
+ * @summary Defines a behavior to execute after create operations
1051
+ * @template V - Type for metadata, defaults to object
1052
+ * @param {StandardOperationHandler<any, any, V, any, any>} handler - The method called after the operation
1053
+ * @param {V} [data] - Optional metadata to pass to the handler
1054
+ * @return {PropertyDecorator} A decorator that can be applied to class properties
1055
+ * @function afterCreate
1056
+ * @category Property Decorators
1057
+ */
1058
+ function afterCreate(handler, data, groupsort) {
1059
+ return after(DBOperations.CREATE, handler, data, groupsort);
1060
+ }
1061
+ /**
1062
+ * @description Decorator for handling post-read operations
1063
+ * @summary Defines a behavior to execute after read operations
1064
+ * @template V - Type for metadata, defaults to object
1065
+ * @param {StandardOperationHandler<any, any, V, any, any>} handler - The method called after the operation
1066
+ * @param {V} [data] - Optional metadata to pass to the handler
1067
+ * @return {PropertyDecorator} A decorator that can be applied to class properties
1068
+ * @function afterRead
1069
+ * @category Property Decorators
1070
+ */
1071
+ function afterRead(handler, data, groupsort) {
1072
+ return after(DBOperations.READ, handler, data, groupsort);
1073
+ }
1074
+ /**
1075
+ * @description Decorator for handling post-delete operations
1076
+ * @summary Defines a behavior to execute after delete operations
1077
+ * @template V - Type for metadata, defaults to object
1078
+ * @param {StandardOperationHandler<any, any, V, any, any>} handler - The method called after the operation
1079
+ * @param {V} [data] - Optional metadata to pass to the handler
1080
+ * @return {PropertyDecorator} A decorator that can be applied to class properties
1081
+ * @function afterDelete
1082
+ * @category Property Decorators
1083
+ */
1084
+ function afterDelete(handler, data, groupsort) {
1085
+ return after(DBOperations.DELETE, handler, data, groupsort);
1086
+ }
1087
+ /**
1088
+ * @description Decorator for handling post-operation for all operation types
1089
+ * @summary Defines a behavior to execute after any database operation
1090
+ * @template V - Type for metadata, defaults to object
1091
+ * @param {StandardOperationHandler<any, any, V, any, any>} handler - The method called after the operation
1092
+ * @param {V} [data] - Optional metadata to pass to the handler
1093
+ * @return {PropertyDecorator} A decorator that can be applied to class properties
1094
+ * @function afterAny
1095
+ * @category Property Decorators
1096
+ */
1097
+ function afterAny(handler, data, groupsort) {
1098
+ return after(DBOperations.ALL, handler, data, groupsort);
1099
+ }
1100
+ /**
1101
+ * @description Base decorator for handling post-operation behaviors
1102
+ * @summary Defines a behavior to execute after specified database operations
1103
+ * @template V - Type for metadata, defaults to object
1104
+ * @param {OperationKeys[] | DBOperations} [op=DBOperations.ALL] - One or more operation types to handle
1105
+ * @param {OperationHandler<any, any, V, any, any>} handler - The method called after the operation
1106
+ * @param {V} [data] - Optional metadata to pass to the handler
1107
+ * @return {PropertyDecorator} A decorator that can be applied to class properties
1108
+ * @function after
1109
+ * @category Property Decorators
1110
+ * @example
1111
+ * // Example usage:
1112
+ * class MyModel {
1113
+ * @after(DBOperations.CREATE, myHandler)
1114
+ * myProperty: string;
1115
+ * }
1116
+ */
1117
+ function after(op = DBOperations.ALL, handler, data, groupsort) {
1118
+ return operation(exports.OperationKeys.AFTER, op, handler, data, groupsort);
1119
+ }
1120
+ /**
1121
+ * @description Core decorator factory for operation handlers
1122
+ * @summary Creates decorators that register handlers for database operations
1123
+ * @template V - Type for metadata, defaults to object
1124
+ * @param {OperationKeys.ON | OperationKeys.AFTER} baseOp - Whether the handler runs during or after the operation
1125
+ * @param {OperationKeys[]} [operation=DBOperations.ALL] - The specific operations to handle
1126
+ * @param {OperationHandler<any, any, V, any, any>} handler - The handler function to execute
1127
+ * @param {V} [dataToAdd] - Optional metadata to pass to the handler
1128
+ * @return {PropertyDecorator} A decorator that can be applied to class properties
1129
+ * @function operation
1130
+ * @category Property Decorators
1131
+ * @mermaid
1132
+ * sequenceDiagram
1133
+ * participant Client
1134
+ * participant Decorator as @operation
1135
+ * participant Operations as Operations Registry
1136
+ * participant Handler
1137
+ *
1138
+ * Client->>Decorator: Apply to property
1139
+ * Decorator->>Operations: Register handler
1140
+ * Decorator->>Decorator: Store metadata
1141
+ *
1142
+ * Note over Client,Handler: Later, during operation execution
1143
+ * Client->>Operations: Execute operation
1144
+ * Operations->>Handler: Call registered handler
1145
+ * Handler-->>Operations: Return result
1146
+ * Operations-->>Client: Return final result
1147
+ */
1148
+ function operation(baseOp, operation = DBOperations.ALL, handler, dataToAdd, groupsort = DefaultGroupSort) {
1149
+ return (target, propertyKey) => {
1150
+ const name = target.constructor.name;
1151
+ const decorators = operation.reduce((accum, op) => {
1152
+ const compoundKey = baseOp + op;
1153
+ let data = Reflect.getMetadata(Operations.key(compoundKey), target, propertyKey);
1154
+ if (!data)
1155
+ data = {
1156
+ operation: op,
1157
+ handlers: {},
1158
+ };
1159
+ const handlerKey = Operations.getHandlerName(handler);
1160
+ let mergeData = groupsort;
1161
+ if (dataToAdd) {
1162
+ if (Object.keys(dataToAdd).filter((key) => key in groupsort).length > 0)
1163
+ throw new InternalError(`Unable to merge groupSort into dataToAdd due to overlaping keys`);
1164
+ mergeData = { ...groupsort, ...dataToAdd };
1165
+ }
1166
+ if (!data.handlers[name] ||
1167
+ !data.handlers[name][propertyKey] ||
1168
+ !(handlerKey in data.handlers[name][propertyKey])) {
1169
+ data.handlers[name] = data.handlers[name] || {};
1170
+ data.handlers[name][propertyKey] =
1171
+ data.handlers[name][propertyKey] || {};
1172
+ data.handlers[name][propertyKey][handlerKey] = {
1173
+ data: mergeData,
1174
+ };
1175
+ accum.push(handle(compoundKey, handler), decoratorValidation.propMetadata(Operations.key(compoundKey), data));
1176
+ }
1177
+ return accum;
1178
+ }, []);
1179
+ return reflection.apply(...decorators)(target, propertyKey);
1180
+ };
1181
+ }
1182
+
1081
1183
  /**
1082
1184
  * @description Default configuration flags for repository operations.
1083
1185
  * @summary Provides default values for repository operation flags, excluding the timestamp property.
@@ -1195,6 +1297,8 @@
1195
1297
  }
1196
1298
  /**
1197
1299
  * @description Retrieves a value from the context by key.
1300
+ * @param {string} key
1301
+ * @return {any}
1198
1302
  */
1199
1303
  get(key) {
1200
1304
  try {
@@ -2565,11 +2669,12 @@
2565
2669
  * @param {"keys"|"values"} [type="values"] - Whether to use property keys or values
2566
2670
  * @param {string} [prefix=""] - Optional prefix to add to the composed value
2567
2671
  * @param {string} [suffix=""] - Optional suffix to add to the composed value
2672
+ * @param {GroupSort} groupsort - GroupSort configuration
2568
2673
  * @return {PropertyDecorator} A decorator that can be applied to class properties
2569
2674
  * @function composedFrom
2570
2675
  * @category PropertyDecorators
2571
2676
  */
2572
- function composedFrom(args, hashResult = false, separator = DefaultSeparator, type = "values", prefix = "", suffix = "") {
2677
+ function composedFrom(args, hashResult = false, separator = DefaultSeparator, type = "values", prefix = "", suffix = "", groupsort = { priority: 55 }) {
2573
2678
  const data = {
2574
2679
  args: args,
2575
2680
  hashResult: hashResult,
@@ -2579,7 +2684,7 @@
2579
2684
  suffix: suffix,
2580
2685
  };
2581
2686
  const decorators = [
2582
- onCreateUpdate(composedFromCreateUpdate, data),
2687
+ onCreateUpdate(composedFromCreateUpdate, data, groupsort),
2583
2688
  decoratorValidation.propMetadata(Repository.key(DBKeys.COMPOSED), data),
2584
2689
  ];
2585
2690
  if (hashResult)
@@ -2594,12 +2699,13 @@
2594
2699
  * @param {boolean} [hash=false] - Whether to hash the composed result
2595
2700
  * @param {string} [prefix=""] - Optional prefix to add to the composed value
2596
2701
  * @param {string} [suffix=""] - Optional suffix to add to the composed value
2702
+ * @param {GroupSort} groupsort - GroupSort configuration
2597
2703
  * @return {PropertyDecorator} A decorator that can be applied to class properties
2598
2704
  * @function composedFromKeys
2599
2705
  * @category PropertyDecorators
2600
2706
  */
2601
- function composedFromKeys(args, separator = DefaultSeparator, hash = false, prefix = "", suffix = "") {
2602
- return composedFrom(args, hash, separator, "keys", prefix, suffix);
2707
+ function composedFromKeys(args, separator = DefaultSeparator, hash = false, prefix = "", suffix = "", groupsort = { priority: 55 }) {
2708
+ return composedFrom(args, hash, separator, "keys", prefix, suffix, groupsort);
2603
2709
  }
2604
2710
  /**
2605
2711
  * @description Creates a decorator that composes a property value from property values
@@ -2609,12 +2715,13 @@
2609
2715
  * @param {boolean} [hash=false] - Whether to hash the composed result
2610
2716
  * @param {string} [prefix=""] - Optional prefix to add to the composed value
2611
2717
  * @param {string} [suffix=""] - Optional suffix to add to the composed value
2718
+ * @param {GroupSort} groupsort - GroupSort configuration
2612
2719
  * @return {PropertyDecorator} A decorator that can be applied to class properties
2613
2720
  * @function composed
2614
2721
  * @category PropertyDecorators
2615
2722
  */
2616
- function composed(args, separator = DefaultSeparator, hash = false, prefix = "", suffix = "") {
2617
- return composedFrom(args, hash, separator, "values", prefix, suffix);
2723
+ function composed(args, separator = DefaultSeparator, hash = false, prefix = "", suffix = "", groupsort = { priority: 55 }) {
2724
+ return composedFrom(args, hash, separator, "values", prefix, suffix, groupsort);
2618
2725
  }
2619
2726
  /**
2620
2727
  * @description Creates a function that updates a version property during operations
@@ -2805,7 +2912,7 @@
2805
2912
  * @const VERSION
2806
2913
  * @memberOf module:db-decorators
2807
2914
  */
2808
- const VERSION = "0.6.8";
2915
+ const VERSION = "0.6.9";
2809
2916
 
2810
2917
  exports.BadRequestError = BadRequestError;
2811
2918
  exports.BaseError = BaseError;
@@ -2845,7 +2952,9 @@
2845
2952
  exports.getAllPropertyDecoratorsRecursive = getAllPropertyDecoratorsRecursive;
2846
2953
  exports.getDbDecorators = getDbDecorators;
2847
2954
  exports.getHandlerArgs = getHandlerArgs;
2955
+ exports.getHandlersDecorators = getHandlersDecorators;
2848
2956
  exports.getValidatableUpdateProps = getValidatableUpdateProps;
2957
+ exports.groupDecorators = groupDecorators;
2849
2958
  exports.hash = hash;
2850
2959
  exports.hashOnCreateUpdate = hashOnCreateUpdate;
2851
2960
  exports.id = id;
@@ -2864,6 +2973,7 @@
2864
2973
  exports.serialize = serialize;
2865
2974
  exports.serializeAfterAll = serializeAfterAll;
2866
2975
  exports.serializeOnCreateUpdate = serializeOnCreateUpdate;
2976
+ exports.sortDecorators = sortDecorators;
2867
2977
  exports.suffixMethod = suffixMethod;
2868
2978
  exports.timestamp = timestamp;
2869
2979
  exports.timestampHandler = timestampHandler;
@@ -2876,4 +2986,4 @@
2876
2986
  exports.wrapMethodWithContext = wrapMethodWithContext;
2877
2987
 
2878
2988
  }));
2879
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGItZGVjb3JhdG9ycy5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9tb2RlbC9jb25zdGFudHMudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9jb25zdGFudHMudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi92YWxpZGF0b3JzL1JlYWRPbmx5VmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vdmFsaWRhdG9ycy9UaW1lc3RhbXBWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi92YWxpZGF0b3JzL1VwZGF0ZVZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL3ZhbGlkYXRpb24udHMiLCIuLi9zcmMvb3BlcmF0aW9ucy9jb25zdGFudHMudHMiLCIuLi9zcmMvb3BlcmF0aW9ucy9PcGVyYXRpb25zUmVnaXN0cnkudHMiLCIuLi9zcmMvb3BlcmF0aW9ucy9PcGVyYXRpb25zLnRzIiwiLi4vc3JjL29wZXJhdGlvbnMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9yZXBvc2l0b3J5L2Vycm9ycy50cyIsIi4uL3NyYy9yZXBvc2l0b3J5L3V0aWxzLnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvQ29udGV4dC50cyIsIi4uL3NyYy9yZXBvc2l0b3J5L3dyYXBwZXJzLnRzIiwiLi4vc3JjL2lkZW50aXR5L3V0aWxzLnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvQmFzZVJlcG9zaXRvcnkudHMiLCIuLi9zcmMvcmVwb3NpdG9yeS9SZXBvc2l0b3J5LnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9pZGVudGl0eS9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL21vZGVsL3ZhbGlkYXRpb24udHMiLCIuLi9zcmMvbW9kZWwvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9tb2RlbC9vdmVycmlkZXMudHMiLCIuLi9zcmMvbW9kZWwvdXRpbHMudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTW9kZWxLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEYXRhYmFzZSByZWZsZWN0aW9uIGtleXNcbiAqIEBzdW1tYXJ5IENvbGxlY3Rpb24gb2Yga2V5cyB1c2VkIGZvciByZWZsZWN0aW9uIG1ldGFkYXRhIGluIGRhdGFiYXNlIG9wZXJhdGlvbnNcbiAqIEBjb25zdCBEQktleXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgREJLZXlzID0ge1xuICBSRUZMRUNUOiBgJHtNb2RlbEtleXMuUkVGTEVDVH1wZXJzaXN0ZW5jZS5gLFxuICBSRVBPU0lUT1JZOiBcInJlcG9zaXRvcnlcIixcbiAgQ0xBU1M6IFwiX2NsYXNzXCIsXG4gIElEOiBcImlkXCIsXG4gIElOREVYOiBcImluZGV4XCIsXG4gIFVOSVFVRTogXCJ1bmlxdWVcIixcbiAgU0VSSUFMSVpFOiBcInNlcmlhbGl6ZVwiLFxuICBSRUFET05MWTogXCJyZWFkb25seVwiLFxuICBUSU1FU1RBTVA6IFwidGltZXN0YW1wXCIsXG4gIFRSQU5TSUVOVDogXCJ0cmFuc2llbnRcIixcbiAgSEFTSDogXCJoYXNoXCIsXG4gIENPTVBPU0VEOiBcImNvbXBvc2VkXCIsXG4gIFZFUlNJT046IFwidmVyc2lvblwiLFxuICBPUklHSU5BTDogXCJfX29yaWdpbmFsT2JqXCIsXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IHNlcGFyYXRvciBjaGFyYWN0ZXIgZm9yIGNvbXBvc2l0ZSBpbmRleGVzXG4gKiBAc3VtbWFyeSBUaGUgZGVmYXVsdCBzZXBhcmF0b3IgY2hhcmFjdGVyIHVzZWQgd2hlbiBjb25jYXRlbmF0aW5nIG11bHRpcGxlIGZpZWxkcyBpbnRvIGEgc2luZ2xlIGluZGV4XG4gKiBAY29uc3QgRGVmYXVsdFNlcGFyYXRvclxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0U2VwYXJhdG9yID0gXCJfXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgZm9ybWF0IGZvciB0aW1lc3RhbXAgZmllbGRzXG4gKiBAc3VtbWFyeSBTdGFuZGFyZCBkYXRlIGZvcm1hdCBzdHJpbmcgdXNlZCBmb3IgdGltZXN0YW1wIGZpZWxkcyBpbiBkYXRhYmFzZSBtb2RlbHNcbiAqIEBjb25zdCBERUZBVUxUX1RJTUVTVEFNUF9GT1JNQVRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9USU1FU1RBTVBfRk9STUFUID0gXCJkZC9NTS95eXl5IEhIOm1tOnNzOlNcIjtcbiIsImltcG9ydCB7IERCS2V5cyB9IGZyb20gXCIuLi9tb2RlbC9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29sbGVjdGlvbiBvZiBkZWZhdWx0IGVycm9yIG1lc3NhZ2VzIHVzZWQgYnkgdmFsaWRhdG9ycy5cbiAqIEBzdW1tYXJ5IEhvbGRzIHRoZSBkZWZhdWx0IGVycm9yIG1lc3NhZ2VzIGZvciB2YXJpb3VzIHZhbGlkYXRpb24gc2NlbmFyaW9zIGluY2x1ZGluZyBJRCB2YWxpZGF0aW9uLCByZWFkb25seSBwcm9wZXJ0aWVzLCBhbmQgdGltZXN0YW1wcy5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IEVycm9yTWVzc2FnZXNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBJRCAtIEVycm9yIG1lc3NhZ2VzIGZvciBJRCB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSUQuSU5WQUxJRCAtIEVycm9yIG1lc3NhZ2Ugd2hlbiBhbiBJRCBpcyBpbnZhbGlkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSUQuUkVRVUlSRUQgLSBFcnJvciBtZXNzYWdlIHdoZW4gYW4gSUQgaXMgbWlzc2luZ1xuICogQHByb3BlcnR5IHtPYmplY3R9IFJFQURPTkxZIC0gRXJyb3IgbWVzc2FnZXMgZm9yIHJlYWRvbmx5IHByb3BlcnRpZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRUFET05MWS5JTlZBTElEIC0gRXJyb3IgbWVzc2FnZSB3aGVuIGF0dGVtcHRpbmcgdG8gdXBkYXRlIGEgcmVhZG9ubHkgcHJvcGVydHlcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBUSU1FU1RBTVAgLSBFcnJvciBtZXNzYWdlcyBmb3IgdGltZXN0YW1wIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBUSU1FU1RBTVAuUkVRVUlSRUQgLSBFcnJvciBtZXNzYWdlIHdoZW4gYSB0aW1lc3RhbXAgaXMgbWlzc2luZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFRJTUVTVEFNUC5EQVRFIC0gRXJyb3IgbWVzc2FnZSB3aGVuIGEgdGltZXN0YW1wIGlzIG5vdCBhIHZhbGlkIGRhdGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBUSU1FU1RBTVAuSU5WQUxJRCAtIEVycm9yIG1lc3NhZ2Ugd2hlbiBhIHRpbWVzdGFtcCBpcyBub3QgaW5jcmVhc2luZ1xuICogQGNvbnN0IERFRkFVTFRfRVJST1JfTUVTU0FHRVNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dmFsaWRhdGlvblxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyA9IHtcbiAgSUQ6IHtcbiAgICBJTlZBTElEOiBcIlRoaXMgSWQgaXMgaW52YWxpZFwiLFxuICAgIFJFUVVJUkVEOiBcIlRoZSBJZCBpcyBtYW5kYXRvcnlcIixcbiAgfSxcbiAgUkVBRE9OTFk6IHtcbiAgICBJTlZBTElEOiBcIlRoaXMgY2Fubm90IGJlIHVwZGF0ZWRcIixcbiAgfSxcbiAgVElNRVNUQU1QOiB7XG4gICAgUkVRVUlSRUQ6IFwiVGltZXN0YW1wIGlzIE1hbmRhdG9yeVwiLFxuICAgIERBVEU6IFwiVGhlIFRpbWVzdGFtcCBtdXN0IHRoZSBhIHZhbGlkIGRhdGVcIixcbiAgICBJTlZBTElEOiBcIlRoaXMgdmFsdWUgbXVzdCBhbHdheXMgaW5jcmVhc2VcIixcbiAgfSxcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnN0YW50cyB1c2VkIGZvciByZWZsZWN0aW9uLWJhc2VkIHZhbGlkYXRpb24gZHVyaW5nIHVwZGF0ZSBvcGVyYXRpb25zLlxuICogQHN1bW1hcnkgS2V5cyB1c2VkIGZvciBzdG9yaW5nIGFuZCByZXRyaWV2aW5nIHZhbGlkYXRpb24gbWV0YWRhdGEgb24gbW9kZWwgcHJvcGVydGllcyBkdXJpbmcgdXBkYXRlIG9wZXJhdGlvbnMuXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBWYWxpZGF0aW9uS2V5c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFRkxFQ1QgLSBCYXNlIHJlZmxlY3Rpb24ga2V5IHByZWZpeCBmb3IgdXBkYXRlIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBUSU1FU1RBTVAgLSBLZXkgZm9yIHRpbWVzdGFtcCB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVBRE9OTFkgLSBLZXkgZm9yIHJlYWRvbmx5IHByb3BlcnR5IHZhbGlkYXRpb25cbiAqIEBjb25zdCBVcGRhdGVWYWxpZGF0aW9uS2V5c1xuICogQG1lbWJlck9mIG1vZHVsZTp2YWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBVcGRhdGVWYWxpZGF0aW9uS2V5cyA9IHtcbiAgUkVGTEVDVDogXCJkYi51cGRhdGUudmFsaWRhdGlvbi5cIixcbiAgVElNRVNUQU1QOiBEQktleXMuVElNRVNUQU1QLFxuICBSRUFET05MWTogREJLZXlzLlJFQURPTkxZLFxufTtcbiIsImltcG9ydCB7IHZhbGlkYXRvciwgVmFsaWRhdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVXBkYXRlVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBpc0VxdWFsIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgdmFsaWRhdG9yIHRoYXQgZW5zdXJlcyBwcm9wZXJ0aWVzIG1hcmtlZCBhcyByZWFkb25seSBjYW5ub3QgYmUgbW9kaWZpZWQgZHVyaW5nIHVwZGF0ZXMuXG4gKiBAc3VtbWFyeSBWYWxpZGF0b3IgZm9yIHRoZSB7QGxpbmsgcmVhZG9ubHl9IGRlY29yYXRvciB0aGF0IGNoZWNrcyBpZiBhIHZhbHVlIGhhcyBiZWVuIGNoYW5nZWQgZHVyaW5nIGFuIHVwZGF0ZSBvcGVyYXRpb24uIEl0IGNvbXBhcmVzIHRoZSBuZXcgdmFsdWUgd2l0aCB0aGUgb2xkIHZhbHVlIGFuZCByZXR1cm5zIGFuIGVycm9yIG1lc3NhZ2UgaWYgdGhleSBhcmUgbm90IGVxdWFsLlxuICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIHZhbGlkYXRlZFxuICogQHBhcmFtIHthbnl9IG9sZFZhbHVlIC0gVGhlIHByZXZpb3VzIHZhbHVlIHRvIGNvbXBhcmUgYWdhaW5zdFxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSAtIE9wdGlvbmFsIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gKiBAY2xhc3MgUmVhZE9ubHlWYWxpZGF0b3JcbiAqIEBleGFtcGxlXG4gKiAvLyBVc2luZyBSZWFkT25seVZhbGlkYXRvciB3aXRoIGEgcmVhZG9ubHkgcHJvcGVydHlcbiAqIGNsYXNzIFVzZXIge1xuICogICBAcmVhZG9ubHkoKVxuICogICBpZDogc3RyaW5nO1xuICogICBcbiAqICAgbmFtZTogc3RyaW5nO1xuICogICBcbiAqICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKSB7XG4gKiAgICAgdGhpcy5pZCA9IGlkO1xuICogICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gKiAgIH1cbiAqIH1cbiAqIFxuICogLy8gVGhpcyB3aWxsIHRyaWdnZXIgdmFsaWRhdGlvbiBlcnJvciB3aGVuIHRyeWluZyB0byB1cGRhdGVcbiAqIGNvbnN0IHVzZXIgPSBuZXcgVXNlcignMTIzJywgJ0pvaG4nKTtcbiAqIHVzZXIuaWQgPSAnNDU2JzsgLy8gV2lsbCBiZSBwcmV2ZW50ZWQgYnkgUmVhZE9ubHlWYWxpZGF0b3JcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVXBkYXRlVmFsaWRhdGlvbktleXMuUkVBRE9OTFkpXG5leHBvcnQgY2xhc3MgUmVhZE9ubHlWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihERUZBVUxUX0VSUk9SX01FU1NBR0VTLlJFQURPTkxZLklOVkFMSUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgYmFzZSB2YWxpZGF0b3IncyBoYXNFcnJvcnMgbWV0aG9kLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBpcyByZXF1aXJlZCBieSB0aGUgVmFsaWRhdG9yIGludGVyZmFjZSBidXQgbm90IHVzZWQgaW4gdGhpcyB2YWxpZGF0b3IgYXMgdmFsaWRhdGlvbiBvbmx5IGhhcHBlbnMgZHVyaW5nIHVwZGF0ZXMuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBBbHdheXMgcmV0dXJucyB1bmRlZmluZWQgYXMgdGhpcyB2YWxpZGF0b3Igb25seSB3b3JrcyBkdXJpbmcgdXBkYXRlc1xuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBoYXNFcnJvcnModmFsdWU6IGFueSwgLi4uYXJnczogYW55W10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIHZhbHVlIGhhcyBiZWVuIG1vZGlmaWVkIGR1cmluZyBhbiB1cGRhdGUgb3BlcmF0aW9uLlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgYSB2YWx1ZSBoYXMgbm90IGNoYW5nZWQgYnkgY29tcGFyaW5nIGl0IHdpdGggdGhlIHByZXZpb3VzIHZhbHVlIHVzaW5nIGRlZXAgZXF1YWxpdHkuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSBuZXcgdmFsdWUgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHthbnl9IG9sZFZhbHVlIC0gVGhlIG9yaWdpbmFsIHZhbHVlIHRvIGNvbXBhcmUgYWdhaW5zdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gT3B0aW9uYWwgY3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHRcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBBbiBlcnJvciBtZXNzYWdlIGlmIHZhbGlkYXRpb24gZmFpbHMsIHVuZGVmaW5lZCBvdGhlcndpc2VcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVIYXNFcnJvcnMoXG4gICAgdmFsdWU6IGFueSxcbiAgICBvbGRWYWx1ZTogYW55LFxuICAgIG1lc3NhZ2U/OiBzdHJpbmcsXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgIHJldHVybiBpc0VxdWFsKHZhbHVlLCBvbGRWYWx1ZSlcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IHRoaXMuZ2V0TWVzc2FnZShtZXNzYWdlIHx8IHRoaXMubWVzc2FnZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IHZhbGlkYXRvciwgVmFsaWRhdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVXBkYXRlVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgdmFsaWRhdG9yIHRoYXQgZW5zdXJlcyB0aW1lc3RhbXAgdmFsdWVzIGFyZSBvbmx5IHVwZGF0ZWQgd2l0aCBuZXdlciB0aW1lc3RhbXBzLlxuICogQHN1bW1hcnkgVmFsaWRhdGVzIHRoZSB1cGRhdGUgb2YgYSB0aW1lc3RhbXAgYnkgY29tcGFyaW5nIHRoZSBuZXcgdGltZXN0YW1wIHdpdGggdGhlIG9sZCBvbmUsIGVuc3VyaW5nIHRoZSBuZXcgdGltZXN0YW1wIGlzIG1vcmUgcmVjZW50LlxuICogQHBhcmFtIHtEYXRlfHN0cmluZ3xudW1iZXJ9IHZhbHVlIC0gVGhlIHRpbWVzdGFtcCB2YWx1ZSB0byB2YWxpZGF0ZVxuICogQHBhcmFtIHtEYXRlfHN0cmluZ3xudW1iZXJ9IG9sZFZhbHVlIC0gVGhlIHByZXZpb3VzIHRpbWVzdGFtcCB0byBjb21wYXJlIGFnYWluc3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBPcHRpb25hbCBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICogQGNsYXNzIFRpbWVzdGFtcFZhbGlkYXRvclxuICogQGV4YW1wbGVcbiAqIC8vIFVzaW5nIFRpbWVzdGFtcFZhbGlkYXRvciB3aXRoIGEgdGltZXN0YW1wIHByb3BlcnR5XG4gKiBjbGFzcyBEb2N1bWVudCB7XG4gKiAgIEB0aW1lc3RhbXAoKVxuICogICB1cGRhdGVkQXQ6IERhdGU7XG4gKiAgIFxuICogICB0aXRsZTogc3RyaW5nO1xuICogICBcbiAqICAgY29uc3RydWN0b3IodGl0bGU6IHN0cmluZykge1xuICogICAgIHRoaXMudGl0bGUgPSB0aXRsZTtcbiAqICAgICB0aGlzLnVwZGF0ZWRBdCA9IG5ldyBEYXRlKCk7XG4gKiAgIH1cbiAqIH1cbiAqIFxuICogLy8gVGhpcyB3aWxsIHRyaWdnZXIgdmFsaWRhdGlvbiBlcnJvciB3aGVuIHRyeWluZyB0byB1cGRhdGUgd2l0aCBhbiBvbGRlciB0aW1lc3RhbXBcbiAqIGNvbnN0IGRvYyA9IG5ldyBEb2N1bWVudCgnTXkgRG9jdW1lbnQnKTtcbiAqIGNvbnN0IG9sZERhdGUgPSBuZXcgRGF0ZSgyMDIwLCAwLCAxKTtcbiAqIGRvYy51cGRhdGVkQXQgPSBvbGREYXRlOyAvLyBXaWxsIGJlIHByZXZlbnRlZCBieSBUaW1lc3RhbXBWYWxpZGF0b3JcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVXBkYXRlVmFsaWRhdGlvbktleXMuVElNRVNUQU1QKVxuZXhwb3J0IGNsYXNzIFRpbWVzdGFtcFZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKERFRkFVTFRfRVJST1JfTUVTU0FHRVMuVElNRVNUQU1QLklOVkFMSUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgYmFzZSB2YWxpZGF0b3IncyBoYXNFcnJvcnMgbWV0aG9kLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBpcyByZXF1aXJlZCBieSB0aGUgVmFsaWRhdG9yIGludGVyZmFjZSBidXQgbm90IHVzZWQgaW4gdGhpcyB2YWxpZGF0b3IgYXMgdmFsaWRhdGlvbiBvbmx5IGhhcHBlbnMgZHVyaW5nIHVwZGF0ZXMuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSB0aW1lc3RhbXAgdmFsdWUgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gQWx3YXlzIHJldHVybnMgdW5kZWZpbmVkIGFzIHRoaXMgdmFsaWRhdG9yIG9ubHkgd29ya3MgZHVyaW5nIHVwZGF0ZXNcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgaGFzRXJyb3JzKHZhbHVlOiBhbnksIC4uLmFyZ3M6IGFueVtdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0ZXMgdGhhdCBhIHRpbWVzdGFtcCBpcyBuZXdlciB0aGFuIGl0cyBwcmV2aW91cyB2YWx1ZS5cbiAgICogQHN1bW1hcnkgQ2hlY2tzIGlmIGEgdGltZXN0YW1wIGhhcyBiZWVuIHVwZGF0ZWQgd2l0aCBhIG1vcmUgcmVjZW50IHZhbHVlIGJ5IGNvbnZlcnRpbmcgYm90aCB2YWx1ZXMgdG8gRGF0ZSBvYmplY3RzIGFuZCBjb21wYXJpbmcgdGhlbS5cbiAgICogQHBhcmFtIHtEYXRlfHN0cmluZ3xudW1iZXJ9IHZhbHVlIC0gVGhlIG5ldyB0aW1lc3RhbXAgdmFsdWUgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHtEYXRlfHN0cmluZ3xudW1iZXJ9IG9sZFZhbHVlIC0gVGhlIG9yaWdpbmFsIHRpbWVzdGFtcCB0byBjb21wYXJlIGFnYWluc3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSAtIE9wdGlvbmFsIGN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0XG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gQW4gZXJyb3IgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxzIChuZXcgdGltZXN0YW1wIGlzIG5vdCBuZXdlciksIHVuZGVmaW5lZCBvdGhlcndpc2VcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVIYXNFcnJvcnMoXG4gICAgdmFsdWU6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIsXG4gICAgb2xkVmFsdWU6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIsXG4gICAgbWVzc2FnZT86IHN0cmluZ1xuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICBtZXNzYWdlID0gbWVzc2FnZSB8fCB0aGlzLmdldE1lc3NhZ2UobWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhbHVlID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgb2xkVmFsdWUgPSBuZXcgRGF0ZShvbGRWYWx1ZSk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlIDw9IG9sZFZhbHVlID8gbWVzc2FnZSA6IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyBhcyBEZWNvcmF0b3JNZXNzYWdlcyxcbiAgVmFsaWRhdG9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHZhbGlkYXRvcnMgdGhhdCBjb21wYXJlIG5ldyB2YWx1ZXMgd2l0aCBvbGQgdmFsdWVzIGR1cmluZyB1cGRhdGVzLlxuICogQHN1bW1hcnkgQmFzZSBjbGFzcyBmb3IgYW4gVXBkYXRlIHZhbGlkYXRvciB0aGF0IHByb3ZpZGVzIGEgZnJhbWV3b3JrIGZvciBpbXBsZW1lbnRpbmcgdmFsaWRhdGlvbiBsb2dpYyB0aGF0IGNvbXBhcmVzIGEgbmV3IHZhbHVlIHdpdGggaXRzIHByZXZpb3VzIHN0YXRlLlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSAtIEVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBEZWNvcmF0b3JNZXNzYWdlcyNERUZBVUxUfVxuICogQHBhcmFtIHtzdHJpbmdbXX0gW2FjY2VwdGVkVHlwZXNdIC0gVGhlIGFjY2VwdGVkIHZhbHVlIHR5cGVzIGJ5IHRoZSBkZWNvcmF0b3JcbiAqIEBjbGFzcyBVcGRhdGVWYWxpZGF0b3JcbiAqIEBleGFtcGxlXG4gKiAvLyBFeHRlbmRpbmcgVXBkYXRlVmFsaWRhdG9yIHRvIGNyZWF0ZSBhIGN1c3RvbSB2YWxpZGF0b3JcbiAqIGNsYXNzIE15Q3VzdG9tVmFsaWRhdG9yIGV4dGVuZHMgVXBkYXRlVmFsaWRhdG9yIHtcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgc3VwZXIoXCJDdXN0b20gdmFsaWRhdGlvbiBmYWlsZWRcIik7XG4gKiAgIH1cbiAqICAgXG4gKiAgIHB1YmxpYyB1cGRhdGVIYXNFcnJvcnModmFsdWU6IGFueSwgb2xkVmFsdWU6IGFueSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gKiAgICAgLy8gQ3VzdG9tIHZhbGlkYXRpb24gbG9naWNcbiAqICAgICBpZiAodmFsdWUgPT09IG9sZFZhbHVlKSB7XG4gKiAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlO1xuICogICAgIH1cbiAqICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICogICB9XG4gKiAgIFxuICogICBoYXNFcnJvcnModmFsdWU6IGFueSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gKiAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gTm90IHVzZWQgZm9yIHVwZGF0ZSB2YWxpZGF0b3JzXG4gKiAgIH1cbiAqIH1cbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBVcGRhdGVWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3Ige1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nID0gRGVjb3JhdG9yTWVzc2FnZXMuREVGQVVMVCxcbiAgICAuLi5hY2NlcHRlZFR5cGVzOiBzdHJpbmdbXVxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCAuLi5hY2NlcHRlZFR5cGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWJzdHJhY3QgbWV0aG9kIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzIHRvIHBlcmZvcm0gdXBkYXRlIHZhbGlkYXRpb24uXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBhIHZhbHVlIGJ5IGNvbXBhcmluZyBpdCB0byBpdHMgb2xkIHZlcnNpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZSB1cGRhdGUgaXMgdmFsaWQuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSBuZXcgdmFsdWUgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHthbnl9IG9sZFZhbHVlIC0gVGhlIHByZXZpb3VzIHZhbHVlIHRvIGNvbXBhcmUgYWdhaW5zdFxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdGhhdCBtYXkgYmUgbmVlZGVkIGZvciB2YWxpZGF0aW9uXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gQW4gZXJyb3IgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxzLCB1bmRlZmluZWQgaWYgdmFsaWRhdGlvbiBwYXNzZXNcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCB1cGRhdGVIYXNFcnJvcnMoXG4gICAgdmFsdWU6IGFueSxcbiAgICBvbGRWYWx1ZTogYW55LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCB7XG4gIFZhbGlkYXRvcixcbiAgVmFsaWRhdGlvbixcbiAgVmFsaWRhdG9yRGVmaW5pdGlvbixcbiAgSVZhbGlkYXRvclJlZ2lzdHJ5LFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBVcGRhdGVWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBrZXkgZm9yIHVwZGF0ZSB2YWxpZGF0aW9uIG1ldGFkYXRhLlxuICogQHN1bW1hcnkgQnVpbGRzIHRoZSBrZXkgdG8gc3RvcmUgYXMgbWV0YWRhdGEgdW5kZXIgUmVmbGVjdGlvbnMgZm9yIHVwZGF0ZSB2YWxpZGF0aW9uIGJ5IHByZWZpeGluZyB0aGUgcHJvdmlkZWQga2V5IHdpdGggdGhlIHVwZGF0ZSB2YWxpZGF0aW9uIHByZWZpeC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgYmFzZSBrZXkgdG8gYmUgcHJlZml4ZWRcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGNvbXBsZXRlIG1ldGFkYXRhIGtleSBmb3IgdXBkYXRlIHZhbGlkYXRpb25cbiAqIEBmdW5jdGlvbiB1cGRhdGVLZXlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5WYWxpZGF0aW9uLnVwZGF0ZUtleSA9IGZ1bmN0aW9uIChrZXk6IHN0cmluZykge1xuICByZXR1cm4gVXBkYXRlVmFsaWRhdGlvbktleXMuUkVGTEVDVCArIGtleTtcbn07XG5cbmRlY2xhcmUgbW9kdWxlIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCIge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgZGVjbGFyZSBjbGFzcyBWYWxpZGF0aW9uIHtcbiAgICBwcml2YXRlIHN0YXRpYyBhY3RpbmdWYWxpZGF0b3JSZWdpc3RyeT87XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpO1xuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGFjdGluZyBWYWxpZGF0b3JSZWdpc3RyeVxuICAgICAqXG4gICAgICogQHBhcmFtIHtJVmFsaWRhdG9yUmVnaXN0cnl9IHZhbGlkYXRvclJlZ2lzdHJ5IHRoZSBuZXcgaW1wbGVtZW50YXRpb24gb2YgdGhlIHZhbGlkYXRvciBSZWdpc3RyeVxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oVmFsaWRhdG9yKTogVmFsaWRhdG9yfSBbbWlncmF0aW9uSGFuZGxlcl0gdGhlIG1ldGhvZCB0byBtYXAgdGhlIHZhbGlkYXRvciBpZiByZXF1aXJlZDtcbiAgICAgKi9cbiAgICBzdGF0aWMgc2V0UmVnaXN0cnkoXG4gICAgICB2YWxpZGF0b3JSZWdpc3RyeTogSVZhbGlkYXRvclJlZ2lzdHJ5PFZhbGlkYXRvcj4sXG4gICAgICBtaWdyYXRpb25IYW5kbGVyPzogKHZhbGlkYXRvcjogVmFsaWRhdG9yKSA9PiBWYWxpZGF0b3JcbiAgICApOiB2b2lkO1xuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIGN1cnJlbnQgVmFsaWRhdG9yUmVnaXN0cnlcbiAgICAgKlxuICAgICAqIEByZXR1cm4gSVZhbGlkYXRvclJlZ2lzdHJ5LCBkZWZhdWx0cyB0byB7QGxpbmsgVmFsaWRhdG9yUmVnaXN0cnl9XG4gICAgICovXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0UmVnaXN0cnk7XG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmVzIGEgdmFsaWRhdG9yXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsaWRhdG9yS2V5IG9uZSBvZiB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzfVxuICAgICAqIEByZXR1cm4ge1ZhbGlkYXRvciB8IHVuZGVmaW5lZH0gdGhlIHJlZ2lzdGVyZWQgVmFsaWRhdG9yIG9yIHVuZGVmaW5lZCBpZiB0aGVyZSBpcyBub25vIG1hdGNoaW5nIHRoZSBwcm92aWRlZCBrZXlcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0PFQgZXh0ZW5kcyBWYWxpZGF0b3I+KHZhbGlkYXRvcktleTogc3RyaW5nKTogVCB8IHVuZGVmaW5lZDtcbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBSZWdpc3RlcnMgdGhlIHByb3ZpZGVkIHZhbGlkYXRvcnMgb250byB0aGUgcmVnaXN0cnlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7VFtdIHwgVmFsaWRhdG9yRGVmaW5pdGlvbltdfSB2YWxpZGF0b3JcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVnaXN0ZXI8VCBleHRlbmRzIFZhbGlkYXRvcj4oXG4gICAgICAuLi52YWxpZGF0b3I6IChWYWxpZGF0b3JEZWZpbml0aW9uIHwgVClbXVxuICAgICk6IHZvaWQ7XG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkgQnVpbGRzIHRoZSBrZXkgdG8gc3RvcmUgYXMgTWV0YWRhdGEgdW5kZXIgUmVmbGVjdGlvbnNcbiAgICAgKiBAZGVzY3JpcHRpb24gY29uY2F0ZW5hdGVzIHtAbGluayBWYWxpZGF0aW9uS2V5cyNSRUZMRUNUfSB3aXRoIHRoZSBwcm92aWRlZCBrZXlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5KGtleTogc3RyaW5nKTogc3RyaW5nO1xuXG4gICAgc3RhdGljIHVwZGF0ZUtleShrZXk6IHN0cmluZyk6IHN0cmluZztcbiAgfVxufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gRGF0YWJhc2Ugb3BlcmF0aW9uIGtleSBjb25zdGFudHNcbiAqIEBzdW1tYXJ5IEVudW0gZGVmaW5pbmcgQ1JVRCBvcGVyYXRpb25zIGFuZCB0aGVpciBsaWZlY3ljbGUgcGhhc2VzXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGVudW0gT3BlcmF0aW9uS2V5cyB7XG4gIFJFRkxFQ1QgPSBcImRlY2FmLm1vZGVsLmRiLm9wZXJhdGlvbnMuXCIsXG4gIENSRUFURSA9IFwiY3JlYXRlXCIsXG4gIFJFQUQgPSBcInJlYWRcIixcbiAgVVBEQVRFID0gXCJ1cGRhdGVcIixcbiAgREVMRVRFID0gXCJkZWxldGVcIixcbiAgT04gPSBcIm9uLlwiLFxuICBBRlRFUiA9IFwiYWZ0ZXIuXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFR5cGUgZm9yIGJhc2ljIENSVUQgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgVW5pb24gdHlwZSBvZiB0aGUgZm91ciBiYXNpYyBkYXRhYmFzZSBvcGVyYXRpb25zOiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgZGVsZXRlXG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBDcnVkT3BlcmF0aW9uc1xuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCB0eXBlIENydWRPcGVyYXRpb25zID1cbiAgfCBPcGVyYXRpb25LZXlzLkNSRUFURVxuICB8IE9wZXJhdGlvbktleXMuUkVBRFxuICB8IE9wZXJhdGlvbktleXMuVVBEQVRFXG4gIHwgT3BlcmF0aW9uS2V5cy5ERUxFVEU7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEJ1bGsgZGF0YWJhc2Ugb3BlcmF0aW9uIGtleSBjb25zdGFudHNcbiAqIEBzdW1tYXJ5IEVudW0gZGVmaW5pbmcgYnVsayBDUlVEIG9wZXJhdGlvbnMgZm9yIGhhbmRsaW5nIG11bHRpcGxlIHJlY29yZHMgYXQgb25jZVxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBlbnVtIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB7XG4gIENSRUFURV9BTEwgPSBcImNyZWF0ZUFsbFwiLFxuICBSRUFEX0FMTCA9IFwicmVhZEFsbFwiLFxuICBVUERBVEVfQUxMID0gXCJ1cGRhdGVBbGxcIixcbiAgREVMRVRFX0FMTCA9IFwiZGVsZXRlQWxsXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFR5cGUgZm9yIGJ1bGsgQ1JVRCBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBVbmlvbiB0eXBlIG9mIHRoZSBmb3VyIGJ1bGsgZGF0YWJhc2Ugb3BlcmF0aW9ucyBmb3IgaGFuZGxpbmcgbXVsdGlwbGUgcmVjb3JkcyBhdCBvbmNlXG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBCdWxrQ3J1ZE9wZXJhdGlvbnNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBCdWxrQ3J1ZE9wZXJhdGlvbnMgPVxuICB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMXG4gIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzLlJFQURfQUxMXG4gIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTExcbiAgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuREVMRVRFX0FMTDtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR3JvdXBlZCBDUlVEIG9wZXJhdGlvbnMgZm9yIGRlY29yYXRvciBtYXBwaW5nXG4gKiBAc3VtbWFyeSBNYXBzIG91dCBncm91cHMgb2YgQ1JVRCBvcGVyYXRpb25zIGZvciBlYXNpZXIgbWFwcGluZyBvZiBkZWNvcmF0b3JzXG4gKiBAY29uc3QgREJPcGVyYXRpb25zXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IERCT3BlcmF0aW9uczogUmVjb3JkPHN0cmluZywgQ3J1ZE9wZXJhdGlvbnNbXT4gPSB7XG4gIENSRUFURTogW09wZXJhdGlvbktleXMuQ1JFQVRFXSxcbiAgUkVBRDogW09wZXJhdGlvbktleXMuUkVBRF0sXG4gIFVQREFURTogW09wZXJhdGlvbktleXMuVVBEQVRFXSxcbiAgREVMRVRFOiBbT3BlcmF0aW9uS2V5cy5ERUxFVEVdLFxuICBDUkVBVEVfVVBEQVRFOiBbT3BlcmF0aW9uS2V5cy5DUkVBVEUsIE9wZXJhdGlvbktleXMuVVBEQVRFXSxcbiAgUkVBRF9DUkVBVEU6IFtPcGVyYXRpb25LZXlzLlJFQUQsIE9wZXJhdGlvbktleXMuQ1JFQVRFXSxcbiAgQUxMOiBbXG4gICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICBdLFxufTtcbiIsImltcG9ydCB7IE9wZXJhdGlvbkhhbmRsZXIgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgSVJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9JUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgT3BlcmF0aW9ucyB9IGZyb20gXCIuL09wZXJhdGlvbnNcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCIuLi9yZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5RmxhZ3MgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWdpc3RyeSBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9uIGhhbmRsZXJzXG4gKiBAc3VtbWFyeSBNYW5hZ2VzIGFuZCBzdG9yZXMgb3BlcmF0aW9uIGhhbmRsZXJzIGZvciBkaWZmZXJlbnQgbW9kZWwgcHJvcGVydGllcyBhbmQgb3BlcmF0aW9uc1xuICogQGNsYXNzIE9wZXJhdGlvbnNSZWdpc3RyeVxuICogQHRlbXBsYXRlIE0gLSBNb2RlbCB0eXBlXG4gKiBAdGVtcGxhdGUgUiAtIFJlcG9zaXRvcnkgdHlwZVxuICogQHRlbXBsYXRlIFYgLSBNZXRhZGF0YSB0eXBlXG4gKiBAdGVtcGxhdGUgRiAtIFJlcG9zaXRvcnkgZmxhZ3NcbiAqIEB0ZW1wbGF0ZSBDIC0gQ29udGV4dCB0eXBlXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgcmVnaXN0cnkgYW5kIHJlZ2lzdGVyIGEgaGFuZGxlclxuICogY29uc3QgcmVnaXN0cnkgPSBuZXcgT3BlcmF0aW9uc1JlZ2lzdHJ5KCk7XG4gKiByZWdpc3RyeS5yZWdpc3RlcihteUhhbmRsZXIsIE9wZXJhdGlvbktleXMuQ1JFQVRFLCB0YXJnZXRNb2RlbCwgJ3Byb3BlcnR5TmFtZScpO1xuICpcbiAqIC8vIEdldCBoYW5kbGVycyBmb3IgYSBzcGVjaWZpYyBvcGVyYXRpb25cbiAqIGNvbnN0IGhhbmRsZXJzID0gcmVnaXN0cnkuZ2V0KHRhcmdldE1vZGVsLmNvbnN0cnVjdG9yLm5hbWUsICdwcm9wZXJ0eU5hbWUnLCAnb25DcmVhdGUnKTtcbiAqXG4gKiBAbWVybWFpZFxuICogY2xhc3NEaWFncmFtXG4gKiAgIGNsYXNzIE9wZXJhdGlvbnNSZWdpc3RyeSB7XG4gKiAgICAgLWNhY2hlOiBSZWNvcmR+c3RyaW5nLCBSZWNvcmR+c3RyaW5nfHN5bWJvbCwgUmVjb3JkfnN0cmluZywgUmVjb3JkfnN0cmluZywgT3BlcmF0aW9uSGFuZGxlcn5+fn5cbiAqICAgICArZ2V0KHRhcmdldCwgcHJvcEtleSwgb3BlcmF0aW9uLCBhY2N1bSlcbiAqICAgICArcmVnaXN0ZXIoaGFuZGxlciwgb3BlcmF0aW9uLCB0YXJnZXQsIHByb3BLZXkpXG4gKiAgIH1cbiAqL1xuZXhwb3J0IGNsYXNzIE9wZXJhdGlvbnNSZWdpc3RyeSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FjaGU6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgUmVjb3JkPFxuICAgICAgc3RyaW5nIHwgc3ltYm9sLFxuICAgICAgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgYW55LCBhbnksIGFueT4+PlxuICAgID5cbiAgPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG9wZXJhdGlvbiBoYW5kbGVycyBmb3IgYSBzcGVjaWZpYyB0YXJnZXQgYW5kIG9wZXJhdGlvblxuICAgKiBAc3VtbWFyeSBGaW5kcyBhbGwgcmVnaXN0ZXJlZCBoYW5kbGVycyBmb3IgYSBnaXZlbiB0YXJnZXQsIHByb3BlcnR5LCBhbmQgb3BlcmF0aW9uLCBpbmNsdWRpbmcgZnJvbSBwYXJlbnQgY2xhc3Nlc1xuICAgKiBAdGVtcGxhdGUgTSAtIE1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAqIEB0ZW1wbGF0ZSBSIC0gUmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBJUmVwb3NpdG9yeVxuICAgKiBAdGVtcGxhdGUgViAtIE1ldGFkYXRhIHR5cGVcbiAgICogQHRlbXBsYXRlIEYgLSBSZXBvc2l0b3J5IGZsYWdzIGV4dGVuZGluZyBSZXBvc2l0b3J5RmxhZ3NcbiAgICogQHRlbXBsYXRlIEMgLSBDb250ZXh0IHR5cGUgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+fSB0YXJnZXQgLSBUaGUgdGFyZ2V0IGNsYXNzIG5hbWUgb3Igb2JqZWN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wS2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byBnZXQgaGFuZGxlcnMgZm9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcGVyYXRpb24gLSBUaGUgb3BlcmF0aW9uIGtleSB0byBnZXQgaGFuZGxlcnMgZm9yXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uSGFuZGxlcltdfSBbYWNjdW1dIC0gQWNjdW11bGF0b3IgZm9yIHJlY3Vyc2l2ZSBjYWxsc1xuICAgKiBAcmV0dXJuIHtPcGVyYXRpb25IYW5kbGVyW10gfCB1bmRlZmluZWR9IEFycmF5IG9mIGhhbmRsZXJzIG9yIHVuZGVmaW5lZCBpZiBub25lIGZvdW5kXG4gICAqL1xuICBnZXQ8XG4gICAgTSBleHRlbmRzIE1vZGVsLFxuICAgIFIgZXh0ZW5kcyBJUmVwb3NpdG9yeTxNLCBGLCBDPixcbiAgICBWLFxuICAgIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gICAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4gID4oXG4gICAgdGFyZ2V0OiBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHByb3BLZXk6IHN0cmluZyxcbiAgICBvcGVyYXRpb246IHN0cmluZyxcbiAgICBhY2N1bT86IE9wZXJhdGlvbkhhbmRsZXI8TSwgUiwgViwgRiwgQz5bXVxuICApOiBPcGVyYXRpb25IYW5kbGVyPE0sIFIsIFYsIEYsIEM+W10gfCB1bmRlZmluZWQge1xuICAgIGFjY3VtID0gYWNjdW0gfHwgW107XG4gICAgbGV0IG5hbWU7XG4gICAgdHJ5IHtcbiAgICAgIG5hbWUgPSB0eXBlb2YgdGFyZ2V0ID09PSBcInN0cmluZ1wiID8gdGFyZ2V0IDogdGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICBhY2N1bS51bnNoaWZ0KFxuICAgICAgICAuLi5PYmplY3QudmFsdWVzKHRoaXMuY2FjaGVbbmFtZV1bcHJvcEtleV1bb3BlcmF0aW9uXSB8fCBbXSlcbiAgICAgICk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgdGFyZ2V0ID09PSBcInN0cmluZ1wiIHx8XG4gICAgICAgIHRhcmdldCA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fFxuICAgICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGFyZ2V0KSA9PT0gT2JqZWN0LnByb3RvdHlwZVxuICAgICAgKVxuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgfVxuXG4gICAgbGV0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRhcmdldCk7XG4gICAgaWYgKHByb3RvLmNvbnN0cnVjdG9yLm5hbWUgPT09IG5hbWUpIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcblxuICAgIHJldHVybiB0aGlzLmdldDxNLCBSLCBWLCBGLCBDPihwcm90bywgcHJvcEtleSwgb3BlcmF0aW9uLCBhY2N1bSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhbiBvcGVyYXRpb24gaGFuZGxlciBmb3IgYSBzcGVjaWZpYyB0YXJnZXQgYW5kIG9wZXJhdGlvblxuICAgKiBAc3VtbWFyeSBTdG9yZXMgYSBoYW5kbGVyIGluIHRoZSByZWdpc3RyeSBmb3IgYSBnaXZlbiB0YXJnZXQsIHByb3BlcnR5LCBhbmQgb3BlcmF0aW9uXG4gICAqIEB0ZW1wbGF0ZSBNIC0gTW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAgICogQHRlbXBsYXRlIFIgLSBSZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIElSZXBvc2l0b3J5XG4gICAqIEB0ZW1wbGF0ZSBWIC0gTWV0YWRhdGEgdHlwZVxuICAgKiBAdGVtcGxhdGUgRiAtIFJlcG9zaXRvcnkgZmxhZ3MgZXh0ZW5kaW5nIFJlcG9zaXRvcnlGbGFnc1xuICAgKiBAdGVtcGxhdGUgQyAtIENvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICAgKiBAcGFyYW0ge09wZXJhdGlvbkhhbmRsZXJ9IGhhbmRsZXIgLSBUaGUgaGFuZGxlciBmdW5jdGlvbiB0byByZWdpc3RlclxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN9IG9wZXJhdGlvbiAtIFRoZSBvcGVyYXRpb24ga2V5IHRvIHJlZ2lzdGVyIHRoZSBoYW5kbGVyIGZvclxuICAgKiBAcGFyYW0ge019IHRhcmdldCAtIFRoZSB0YXJnZXQgbW9kZWwgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBzeW1ib2x9IHByb3BLZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIHJlZ2lzdGVyIHRoZSBoYW5kbGVyIGZvclxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgcmVnaXN0ZXI8XG4gICAgTSBleHRlbmRzIE1vZGVsLFxuICAgIFIgZXh0ZW5kcyBJUmVwb3NpdG9yeTxNLCBGLCBDPixcbiAgICBWLFxuICAgIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gICAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4gID4oXG4gICAgaGFuZGxlcjogT3BlcmF0aW9uSGFuZGxlcjxNLCBSLCBWLCBGLCBDPixcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMsXG4gICAgdGFyZ2V0OiBNLFxuICAgIHByb3BLZXk6IHN0cmluZyB8IHN5bWJvbFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBuYW1lID0gdGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgY29uc3QgaGFuZGxlck5hbWUgPSBPcGVyYXRpb25zLmdldEhhbmRsZXJOYW1lKGhhbmRsZXIpO1xuXG4gICAgaWYgKCF0aGlzLmNhY2hlW25hbWVdKSB0aGlzLmNhY2hlW25hbWVdID0ge307XG4gICAgaWYgKCF0aGlzLmNhY2hlW25hbWVdW3Byb3BLZXldKSB0aGlzLmNhY2hlW25hbWVdW3Byb3BLZXldID0ge307XG4gICAgaWYgKCF0aGlzLmNhY2hlW25hbWVdW3Byb3BLZXldW29wZXJhdGlvbl0pXG4gICAgICB0aGlzLmNhY2hlW25hbWVdW3Byb3BLZXldW29wZXJhdGlvbl0gPSB7fTtcbiAgICBpZiAodGhpcy5jYWNoZVtuYW1lXVtwcm9wS2V5XVtvcGVyYXRpb25dW2hhbmRsZXJOYW1lXSkgcmV0dXJuO1xuICAgIHRoaXMuY2FjaGVbbmFtZV1bcHJvcEtleV1bb3BlcmF0aW9uXVtoYW5kbGVyTmFtZV0gPSBoYW5kbGVyO1xuICB9XG59XG4iLCJpbXBvcnQgeyBIYXNoaW5nLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IE9wZXJhdGlvbkhhbmRsZXIgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgT3BlcmF0aW9uc1JlZ2lzdHJ5IH0gZnJvbSBcIi4vT3BlcmF0aW9uc1JlZ2lzdHJ5XCI7XG5pbXBvcnQgeyBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBJUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnlGbGFncyB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0YXRpYyB1dGlsaXR5IGNsYXNzIGZvciBkYXRhYmFzZSBvcGVyYXRpb24gbWFuYWdlbWVudFxuICogQHN1bW1hcnkgUHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBmb3IgcmVnaXN0ZXJpbmcsIHJldHJpZXZpbmcsIGFuZCBtYW5hZ2luZyBkYXRhYmFzZSBvcGVyYXRpb24gaGFuZGxlcnNcbiAqIEBjbGFzcyBPcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgTSAtIE1vZGVsIHR5cGVcbiAqIEB0ZW1wbGF0ZSBSIC0gUmVwb3NpdG9yeSB0eXBlXG4gKiBAdGVtcGxhdGUgViAtIE1ldGFkYXRhIHR5cGVcbiAqIEB0ZW1wbGF0ZSBGIC0gUmVwb3NpdG9yeSBmbGFnc1xuICogQHRlbXBsYXRlIEMgLSBDb250ZXh0IHR5cGVcbiAqIEBleGFtcGxlXG4gKiAvLyBSZWdpc3RlciBhIGhhbmRsZXIgZm9yIGEgY3JlYXRlIG9wZXJhdGlvblxuICogT3BlcmF0aW9ucy5yZWdpc3RlcihteUhhbmRsZXIsIE9wZXJhdGlvbktleXMuQ1JFQVRFLCB0YXJnZXRNb2RlbCwgJ3Byb3BlcnR5TmFtZScpO1xuICogXG4gKiAvLyBHZXQgaGFuZGxlcnMgZm9yIGEgc3BlY2lmaWMgb3BlcmF0aW9uXG4gKiBjb25zdCBoYW5kbGVycyA9IE9wZXJhdGlvbnMuZ2V0KHRhcmdldE1vZGVsLmNvbnN0cnVjdG9yLm5hbWUsICdwcm9wZXJ0eU5hbWUnLCAnb25DcmVhdGUnKTtcbiAqIFxuICogQG1lcm1haWRcbiAqIGNsYXNzRGlhZ3JhbVxuICogICBjbGFzcyBPcGVyYXRpb25zIHtcbiAqICAgICAtcmVnaXN0cnk6IE9wZXJhdGlvbnNSZWdpc3RyeVxuICogICAgICtnZXRIYW5kbGVyTmFtZShoYW5kbGVyKVxuICogICAgICtrZXkoc3RyKVxuICogICAgICtnZXQodGFyZ2V0TmFtZSwgcHJvcEtleSwgb3BlcmF0aW9uKVxuICogICAgIC1nZXRPcFJlZ2lzdHJ5KClcbiAqICAgICArcmVnaXN0ZXIoaGFuZGxlciwgb3BlcmF0aW9uLCB0YXJnZXQsIHByb3BLZXkpXG4gKiAgIH1cbiAqICAgT3BlcmF0aW9ucyAtLT4gT3BlcmF0aW9uc1JlZ2lzdHJ5IDogdXNlc1xuICovXG5leHBvcnQgY2xhc3MgT3BlcmF0aW9ucyB7XG4gIHByaXZhdGUgc3RhdGljIHJlZ2lzdHJ5OiBPcGVyYXRpb25zUmVnaXN0cnk7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgdW5pcXVlIG5hbWUgZm9yIGFuIG9wZXJhdGlvbiBoYW5kbGVyXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIgZnVuY3Rpb24gb3IgZ2VuZXJhdGVzIGEgaGFzaCBpZiBuYW1lIGlzIG5vdCBhdmFpbGFibGVcbiAgICogQHBhcmFtIHtPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBhbnksIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBoYW5kbGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgbmFtZSBmb3JcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgaGFuZGxlciBvciBhIGdlbmVyYXRlZCBoYXNoXG4gICAqL1xuICBzdGF0aWMgZ2V0SGFuZGxlck5hbWUoaGFuZGxlcjogT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgYW55LCBhbnksIGFueT4pIHtcbiAgICBpZiAoaGFuZGxlci5uYW1lKSByZXR1cm4gaGFuZGxlci5uYW1lO1xuXG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJIYW5kbGVyIG5hbWUgbm90IGRlZmluZWQuIEEgbmFtZSB3aWxsIGJlIGdlbmVyYXRlZCwgYnV0IHRoaXMgaXMgbm90IGRlc2lyYWJsZS4gcGxlYXNlIGF2b2lkIHVzaW5nIGFub255bW91cyBmdW5jdGlvbnNcIlxuICAgICk7XG4gICAgcmV0dXJuIEhhc2hpbmcuaGFzaChoYW5kbGVyLnRvU3RyaW5nKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSByZWZsZWN0aW9uIG1ldGFkYXRhIGtleVxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgZnVsbHkgcXVhbGlmaWVkIG1ldGFkYXRhIGtleSBieSBwcmVmaXhpbmcgd2l0aCB0aGUgcmVmbGVjdGlvbiBuYW1lc3BhY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciAtIFRoZSBvcGVyYXRpb24ga2V5IHN0cmluZyB0byBwcmVmaXhcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgZnVsbHkgcXVhbGlmaWVkIG1ldGFkYXRhIGtleVxuICAgKi9cbiAgc3RhdGljIGtleShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBPcGVyYXRpb25LZXlzLlJFRkxFQ1QgKyBzdHI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBvcGVyYXRpb24gaGFuZGxlcnMgZm9yIGEgc3BlY2lmaWMgdGFyZ2V0IGFuZCBvcGVyYXRpb25cbiAgICogQHN1bW1hcnkgR2V0cyByZWdpc3RlcmVkIGhhbmRsZXJzIGZyb20gdGhlIG9wZXJhdGlvbnMgcmVnaXN0cnkgZm9yIGEgZ2l2ZW4gdGFyZ2V0LCBwcm9wZXJ0eSwgYW5kIG9wZXJhdGlvblxuICAgKiBAdGVtcGxhdGUgTSAtIE1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAqIEB0ZW1wbGF0ZSBSIC0gUmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBJUmVwb3NpdG9yeVxuICAgKiBAdGVtcGxhdGUgViAtIE1ldGFkYXRhIHR5cGUsIGRlZmF1bHRzIHRvIG9iamVjdFxuICAgKiBAdGVtcGxhdGUgRiAtIFJlcG9zaXRvcnkgZmxhZ3MgZXh0ZW5kaW5nIFJlcG9zaXRvcnlGbGFnc1xuICAgKiBAdGVtcGxhdGUgQyAtIENvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IFJlY29yZDxzdHJpbmcsIGFueT59IHRhcmdldE5hbWUgLSBUaGUgdGFyZ2V0IGNsYXNzIG5hbWUgb3Igb2JqZWN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wS2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byBnZXQgaGFuZGxlcnMgZm9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcGVyYXRpb24gLSBUaGUgb3BlcmF0aW9uIGtleSB0byBnZXQgaGFuZGxlcnMgZm9yXG4gICAqIEByZXR1cm4ge2FueX0gVGhlIHJlZ2lzdGVyZWQgaGFuZGxlcnMgZm9yIHRoZSBzcGVjaWZpZWQgdGFyZ2V0LCBwcm9wZXJ0eSwgYW5kIG9wZXJhdGlvblxuICAgKi9cbiAgc3RhdGljIGdldDxcbiAgICBNIGV4dGVuZHMgTW9kZWwsXG4gICAgUiBleHRlbmRzIElSZXBvc2l0b3J5PE0sIEYsIEM+LFxuICAgIFYgPSBvYmplY3QsXG4gICAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IFJlcG9zaXRvcnlGbGFncyxcbiAgICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4gID4oXG4gICAgdGFyZ2V0TmFtZTogc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBwcm9wS2V5OiBzdHJpbmcsXG4gICAgb3BlcmF0aW9uOiBzdHJpbmdcbiAgKSB7XG4gICAgcmV0dXJuIE9wZXJhdGlvbnMucmVnaXN0cnkuZ2V0PE0sIFIsIFYsIEYsIEM+KFxuICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgIHByb3BLZXksXG4gICAgICBvcGVyYXRpb25cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIG9yIGluaXRpYWxpemVzIHRoZSBvcGVyYXRpb25zIHJlZ2lzdHJ5XG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIGV4aXN0aW5nIHJlZ2lzdHJ5IG9yIGNyZWF0ZXMgYSBuZXcgb25lIGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICogQHJldHVybiB7T3BlcmF0aW9uc1JlZ2lzdHJ5fSBUaGUgb3BlcmF0aW9ucyByZWdpc3RyeSBpbnN0YW5jZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0T3BSZWdpc3RyeSgpIHtcbiAgICBpZiAoIU9wZXJhdGlvbnMucmVnaXN0cnkpIE9wZXJhdGlvbnMucmVnaXN0cnkgPSBuZXcgT3BlcmF0aW9uc1JlZ2lzdHJ5KCk7XG4gICAgcmV0dXJuIE9wZXJhdGlvbnMucmVnaXN0cnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhbiBvcGVyYXRpb24gaGFuZGxlciBmb3IgYSBzcGVjaWZpYyB0YXJnZXQgYW5kIG9wZXJhdGlvblxuICAgKiBAc3VtbWFyeSBBZGRzIGEgaGFuZGxlciB0byB0aGUgb3BlcmF0aW9ucyByZWdpc3RyeSBmb3IgYSBnaXZlbiB0YXJnZXQsIHByb3BlcnR5LCBhbmQgb3BlcmF0aW9uXG4gICAqIEB0ZW1wbGF0ZSBWIC0gTW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAgICogQHBhcmFtIHtPcGVyYXRpb25IYW5kbGVyPFYsIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBoYW5kbGVyIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c30gb3BlcmF0aW9uIC0gVGhlIG9wZXJhdGlvbiBrZXkgdG8gcmVnaXN0ZXIgdGhlIGhhbmRsZXIgZm9yXG4gICAqIEBwYXJhbSB7Vn0gdGFyZ2V0IC0gVGhlIHRhcmdldCBtb2RlbCBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHN5bWJvbH0gcHJvcEtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gcmVnaXN0ZXIgdGhlIGhhbmRsZXIgZm9yXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXI8ViBleHRlbmRzIE1vZGVsPihcbiAgICBoYW5kbGVyOiBPcGVyYXRpb25IYW5kbGVyPFYsIGFueSwgYW55PixcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMsXG4gICAgdGFyZ2V0OiBWLFxuICAgIHByb3BLZXk6IHN0cmluZyB8IHN5bWJvbFxuICApIHtcbiAgICBPcGVyYXRpb25zLmdldE9wUmVnaXN0cnkoKS5yZWdpc3RlcihcbiAgICAgIGhhbmRsZXIgYXMgYW55LFxuICAgICAgb3BlcmF0aW9uLFxuICAgICAgdGFyZ2V0LFxuICAgICAgcHJvcEtleVxuICAgICk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIElkT3BlcmF0aW9uSGFuZGxlcixcbiAgT3BlcmF0aW9uSGFuZGxlcixcbiAgU3RhbmRhcmRPcGVyYXRpb25IYW5kbGVyLFxuICBVcGRhdGVPcGVyYXRpb25IYW5kbGVyLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgREJPcGVyYXRpb25zLCBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBPcGVyYXRpb25zIH0gZnJvbSBcIi4vT3BlcmF0aW9uc1wiO1xuaW1wb3J0IHsgYXBwbHkgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IHByb3BNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSW50ZXJuYWwgZnVuY3Rpb24gdG8gcmVnaXN0ZXIgb3BlcmF0aW9uIGhhbmRsZXJzXG4gKiBAc3VtbWFyeSBSZWdpc3RlcnMgYW4gb3BlcmF0aW9uIGhhbmRsZXIgZm9yIGEgc3BlY2lmaWMgb3BlcmF0aW9uIGtleSBvbiBhIHRhcmdldCBwcm9wZXJ0eVxuICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfSBvcCAtIFRoZSBvcGVyYXRpb24ga2V5IHRvIGhhbmRsZVxuICogQHBhcmFtIHtPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBhbnksIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBoYW5kbGVyIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCByZWdpc3RlcnMgdGhlIGhhbmRsZXJcbiAqIEBmdW5jdGlvbiBoYW5kbGVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmZ1bmN0aW9uIGhhbmRsZShcbiAgb3A6IE9wZXJhdGlvbktleXMsXG4gIGhhbmRsZXI6IE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIGFueSwgYW55LCBhbnk+XG4pIHtcbiAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZykgPT4ge1xuICAgIE9wZXJhdGlvbnMucmVnaXN0ZXIoaGFuZGxlciwgb3AsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgZm9yIGhhbmRsaW5nIGNyZWF0ZSBhbmQgdXBkYXRlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBiZWhhdmlvciB0byBleGVjdXRlIGR1cmluZyBib3RoIGNyZWF0ZSBhbmQgdXBkYXRlIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGEsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHBhcmFtIHtTdGFuZGFyZE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PiB8IFVwZGF0ZU9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBtZXRob2QgY2FsbGVkIHVwb24gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBbZGF0YV0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gb25DcmVhdGVVcGRhdGVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkNyZWF0ZVVwZGF0ZTxWID0gb2JqZWN0PihcbiAgaGFuZGxlcjpcbiAgICB8IFN0YW5kYXJkT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+XG4gICAgfCBVcGRhdGVPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT4sXG4gIGRhdGE/OiBWXG4pIHtcbiAgcmV0dXJuIG9uKERCT3BlcmF0aW9ucy5DUkVBVEVfVVBEQVRFLCBoYW5kbGVyLCBkYXRhKTtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBmb3IgaGFuZGxpbmcgdXBkYXRlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBiZWhhdmlvciB0byBleGVjdXRlIGR1cmluZyB1cGRhdGUgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAcGFyYW0ge1VwZGF0ZU9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCB1cG9uIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gW2RhdGFdIC0gT3B0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIG9uVXBkYXRlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25VcGRhdGU8ViA9IG9iamVjdD4oXG4gIGhhbmRsZXI6IFVwZGF0ZU9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueT4sXG4gIGRhdGE/OiBWXG4pIHtcbiAgcmV0dXJuIG9uKERCT3BlcmF0aW9ucy5VUERBVEUsIGhhbmRsZXIsIGRhdGEpO1xufVxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIGZvciBoYW5kbGluZyBjcmVhdGUgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgRGVmaW5lcyBhIGJlaGF2aW9yIHRvIGV4ZWN1dGUgZHVyaW5nIGNyZWF0ZSBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhLCBkZWZhdWx0cyB0byBvYmplY3RcbiAqIEBwYXJhbSB7U3RhbmRhcmRPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCB1cG9uIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gW2RhdGFdIC0gT3B0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIG9uQ3JlYXRlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25DcmVhdGU8ViA9IG9iamVjdD4oXG4gIGhhbmRsZXI6IFN0YW5kYXJkT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhPzogVlxuKSB7XG4gIHJldHVybiBvbihEQk9wZXJhdGlvbnMuQ1JFQVRFLCBoYW5kbGVyLCBkYXRhKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIGZvciBoYW5kbGluZyByZWFkIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBiZWhhdmlvciB0byBleGVjdXRlIGR1cmluZyByZWFkIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGEsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHBhcmFtIHtJZE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBtZXRob2QgY2FsbGVkIHVwb24gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBbZGF0YV0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gb25SZWFkXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25SZWFkPFYgPSBvYmplY3Q+KFxuICBoYW5kbGVyOiBJZE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PixcbiAgZGF0YTogVlxuKSB7XG4gIHJldHVybiBvbihEQk9wZXJhdGlvbnMuUkVBRCwgaGFuZGxlciwgZGF0YSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBmb3IgaGFuZGxpbmcgZGVsZXRlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBiZWhhdmlvciB0byBleGVjdXRlIGR1cmluZyBkZWxldGUgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAcGFyYW0ge09wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBtZXRob2QgY2FsbGVkIHVwb24gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBbZGF0YV0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gb25EZWxldGVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkRlbGV0ZTxWID0gb2JqZWN0PihcbiAgaGFuZGxlcjogT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhOiBWXG4pIHtcbiAgcmV0dXJuIG9uKERCT3BlcmF0aW9ucy5ERUxFVEUsIGhhbmRsZXIsIGRhdGEpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgZm9yIGhhbmRsaW5nIGFsbCBvcGVyYXRpb24gdHlwZXNcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBiZWhhdmlvciB0byBleGVjdXRlIGR1cmluZyBhbnkgZGF0YWJhc2Ugb3BlcmF0aW9uXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhLCBkZWZhdWx0cyB0byBvYmplY3RcbiAqIEBwYXJhbSB7T3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+fSBoYW5kbGVyIC0gVGhlIG1ldGhvZCBjYWxsZWQgdXBvbiB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IFtkYXRhXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBvbkFueVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uQW55PFYgPSBvYmplY3Q+KFxuICBoYW5kbGVyOiBPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT4sXG4gIGRhdGE6IFZcbikge1xuICByZXR1cm4gb24oREJPcGVyYXRpb25zLkFMTCwgaGFuZGxlciwgZGF0YSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEJhc2UgZGVjb3JhdG9yIGZvciBoYW5kbGluZyBkYXRhYmFzZSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgYmVoYXZpb3IgdG8gZXhlY3V0ZSBkdXJpbmcgc3BlY2lmaWVkIGRhdGFiYXNlIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGEsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHBhcmFtIHtPcGVyYXRpb25LZXlzW10gfCBEQk9wZXJhdGlvbnN9IFtvcD1EQk9wZXJhdGlvbnMuQUxMXSAtIE9uZSBvciBtb3JlIG9wZXJhdGlvbiB0eXBlcyB0byBoYW5kbGVcbiAqIEBwYXJhbSB7T3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+fSBoYW5kbGVyIC0gVGhlIG1ldGhvZCBjYWxsZWQgdXBvbiB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IFtkYXRhXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBvblxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiAvLyBFeGFtcGxlIHVzYWdlOlxuICogY2xhc3MgTXlNb2RlbCB7XG4gKiAgIEBvbihEQk9wZXJhdGlvbnMuQ1JFQVRFLCBteUhhbmRsZXIpXG4gKiAgIG15UHJvcGVydHk6IHN0cmluZztcbiAqIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uPFYgPSBvYmplY3Q+KFxuICBvcDogT3BlcmF0aW9uS2V5c1tdID0gREJPcGVyYXRpb25zLkFMTCxcbiAgaGFuZGxlcjogT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhPzogVlxuKSB7XG4gIHJldHVybiBvcGVyYXRpb24oT3BlcmF0aW9uS2V5cy5PTiwgb3AsIGhhbmRsZXIsIGRhdGEpO1xufVxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIGZvciBoYW5kbGluZyBwb3N0LWNyZWF0ZSBhbmQgcG9zdC11cGRhdGUgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgRGVmaW5lcyBhIGJlaGF2aW9yIHRvIGV4ZWN1dGUgYWZ0ZXIgYm90aCBjcmVhdGUgYW5kIHVwZGF0ZSBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhLCBkZWZhdWx0cyB0byBvYmplY3RcbiAqIEBwYXJhbSB7U3RhbmRhcmRPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT4gfCBVcGRhdGVPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCBhZnRlciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IFtkYXRhXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBhZnRlckNyZWF0ZVVwZGF0ZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFmdGVyQ3JlYXRlVXBkYXRlPFYgPSBvYmplY3Q+KFxuICBoYW5kbGVyOlxuICAgIHwgU3RhbmRhcmRPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT5cbiAgICB8IFVwZGF0ZU9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PixcbiAgZGF0YTogVlxuKSB7XG4gIHJldHVybiBhZnRlcihEQk9wZXJhdGlvbnMuQ1JFQVRFX1VQREFURSwgaGFuZGxlciwgZGF0YSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBmb3IgaGFuZGxpbmcgcG9zdC11cGRhdGUgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgRGVmaW5lcyBhIGJlaGF2aW9yIHRvIGV4ZWN1dGUgYWZ0ZXIgdXBkYXRlIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGEsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHBhcmFtIHtVcGRhdGVPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCBhZnRlciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IFtkYXRhXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBhZnRlclVwZGF0ZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFmdGVyVXBkYXRlPFYgPSBvYmplY3Q+KFxuICBoYW5kbGVyOiBVcGRhdGVPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT4sXG4gIGRhdGE6IFZcbikge1xuICByZXR1cm4gYWZ0ZXIoREJPcGVyYXRpb25zLlVQREFURSwgaGFuZGxlciwgZGF0YSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBmb3IgaGFuZGxpbmcgcG9zdC1jcmVhdGUgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgRGVmaW5lcyBhIGJlaGF2aW9yIHRvIGV4ZWN1dGUgYWZ0ZXIgY3JlYXRlIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGEsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHBhcmFtIHtTdGFuZGFyZE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBtZXRob2QgY2FsbGVkIGFmdGVyIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gW2RhdGFdIC0gT3B0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIGFmdGVyQ3JlYXRlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYWZ0ZXJDcmVhdGU8ViA9IG9iamVjdD4oXG4gIGhhbmRsZXI6IFN0YW5kYXJkT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhOiBWXG4pIHtcbiAgcmV0dXJuIGFmdGVyKERCT3BlcmF0aW9ucy5DUkVBVEUsIGhhbmRsZXIsIGRhdGEpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgZm9yIGhhbmRsaW5nIHBvc3QtcmVhZCBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgYmVoYXZpb3IgdG8gZXhlY3V0ZSBhZnRlciByZWFkIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGEsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHBhcmFtIHtTdGFuZGFyZE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBtZXRob2QgY2FsbGVkIGFmdGVyIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gW2RhdGFdIC0gT3B0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIGFmdGVyUmVhZFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFmdGVyUmVhZDxWID0gb2JqZWN0PihcbiAgaGFuZGxlcjogU3RhbmRhcmRPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT4sXG4gIGRhdGE/OiBWXG4pIHtcbiAgcmV0dXJuIGFmdGVyKERCT3BlcmF0aW9ucy5SRUFELCBoYW5kbGVyLCBkYXRhKTtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBmb3IgaGFuZGxpbmcgcG9zdC1kZWxldGUgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgRGVmaW5lcyBhIGJlaGF2aW9yIHRvIGV4ZWN1dGUgYWZ0ZXIgZGVsZXRlIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGEsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHBhcmFtIHtTdGFuZGFyZE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBtZXRob2QgY2FsbGVkIGFmdGVyIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gW2RhdGFdIC0gT3B0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIGFmdGVyRGVsZXRlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYWZ0ZXJEZWxldGU8ViA9IG9iamVjdD4oXG4gIGhhbmRsZXI6IFN0YW5kYXJkT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhPzogVlxuKSB7XG4gIHJldHVybiBhZnRlcihEQk9wZXJhdGlvbnMuREVMRVRFLCBoYW5kbGVyLCBkYXRhKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIGZvciBoYW5kbGluZyBwb3N0LW9wZXJhdGlvbiBmb3IgYWxsIG9wZXJhdGlvbiB0eXBlc1xuICogQHN1bW1hcnkgRGVmaW5lcyBhIGJlaGF2aW9yIHRvIGV4ZWN1dGUgYWZ0ZXIgYW55IGRhdGFiYXNlIG9wZXJhdGlvblxuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAcGFyYW0ge1N0YW5kYXJkT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+fSBoYW5kbGVyIC0gVGhlIG1ldGhvZCBjYWxsZWQgYWZ0ZXIgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBbZGF0YV0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gYWZ0ZXJBbnlcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZnRlckFueTxWID0gb2JqZWN0PihcbiAgaGFuZGxlcjogU3RhbmRhcmRPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT4sXG4gIGRhdGE/OiBWXG4pIHtcbiAgcmV0dXJuIGFmdGVyKERCT3BlcmF0aW9ucy5BTEwsIGhhbmRsZXIsIGRhdGEpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBCYXNlIGRlY29yYXRvciBmb3IgaGFuZGxpbmcgcG9zdC1vcGVyYXRpb24gYmVoYXZpb3JzXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgYmVoYXZpb3IgdG8gZXhlY3V0ZSBhZnRlciBzcGVjaWZpZWQgZGF0YWJhc2Ugb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAcGFyYW0ge09wZXJhdGlvbktleXNbXSB8IERCT3BlcmF0aW9uc30gW29wPURCT3BlcmF0aW9ucy5BTExdIC0gT25lIG9yIG1vcmUgb3BlcmF0aW9uIHR5cGVzIHRvIGhhbmRsZVxuICogQHBhcmFtIHtPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCBhZnRlciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IFtkYXRhXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBhZnRlclxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiAvLyBFeGFtcGxlIHVzYWdlOlxuICogY2xhc3MgTXlNb2RlbCB7XG4gKiAgIEBhZnRlcihEQk9wZXJhdGlvbnMuQ1JFQVRFLCBteUhhbmRsZXIpXG4gKiAgIG15UHJvcGVydHk6IHN0cmluZztcbiAqIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFmdGVyPFYgPSBvYmplY3Q+KFxuICBvcDogT3BlcmF0aW9uS2V5c1tdID0gREJPcGVyYXRpb25zLkFMTCxcbiAgaGFuZGxlcjogT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhPzogVlxuKSB7XG4gIHJldHVybiBvcGVyYXRpb24oT3BlcmF0aW9uS2V5cy5BRlRFUiwgb3AsIGhhbmRsZXIsIGRhdGEpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb3JlIGRlY29yYXRvciBmYWN0b3J5IGZvciBvcGVyYXRpb24gaGFuZGxlcnNcbiAqIEBzdW1tYXJ5IENyZWF0ZXMgZGVjb3JhdG9ycyB0aGF0IHJlZ2lzdGVyIGhhbmRsZXJzIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhLCBkZWZhdWx0cyB0byBvYmplY3RcbiAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5cy5PTiB8IE9wZXJhdGlvbktleXMuQUZURVJ9IGJhc2VPcCAtIFdoZXRoZXIgdGhlIGhhbmRsZXIgcnVucyBkdXJpbmcgb3IgYWZ0ZXIgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtPcGVyYXRpb25LZXlzW119IFtvcGVyYXRpb249REJPcGVyYXRpb25zLkFMTF0gLSBUaGUgc3BlY2lmaWMgb3BlcmF0aW9ucyB0byBoYW5kbGVcbiAqIEBwYXJhbSB7T3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+fSBoYW5kbGVyIC0gVGhlIGhhbmRsZXIgZnVuY3Rpb24gdG8gZXhlY3V0ZVxuICogQHBhcmFtIHtWfSBbZGF0YVRvQWRkXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBvcGVyYXRpb25cbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBEZWNvcmF0b3IgYXMgQG9wZXJhdGlvblxuICogICBwYXJ0aWNpcGFudCBPcGVyYXRpb25zIGFzIE9wZXJhdGlvbnMgUmVnaXN0cnlcbiAqICAgcGFydGljaXBhbnQgSGFuZGxlclxuICpcbiAqICAgQ2xpZW50LT4+RGVjb3JhdG9yOiBBcHBseSB0byBwcm9wZXJ0eVxuICogICBEZWNvcmF0b3ItPj5PcGVyYXRpb25zOiBSZWdpc3RlciBoYW5kbGVyXG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogU3RvcmUgbWV0YWRhdGFcbiAqXG4gKiAgIE5vdGUgb3ZlciBDbGllbnQsSGFuZGxlcjogTGF0ZXIsIGR1cmluZyBvcGVyYXRpb24gZXhlY3V0aW9uXG4gKiAgIENsaWVudC0+Pk9wZXJhdGlvbnM6IEV4ZWN1dGUgb3BlcmF0aW9uXG4gKiAgIE9wZXJhdGlvbnMtPj5IYW5kbGVyOiBDYWxsIHJlZ2lzdGVyZWQgaGFuZGxlclxuICogICBIYW5kbGVyLS0+Pk9wZXJhdGlvbnM6IFJldHVybiByZXN1bHRcbiAqICAgT3BlcmF0aW9ucy0tPj5DbGllbnQ6IFJldHVybiBmaW5hbCByZXN1bHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wZXJhdGlvbjxWID0gb2JqZWN0PihcbiAgYmFzZU9wOiBPcGVyYXRpb25LZXlzLk9OIHwgT3BlcmF0aW9uS2V5cy5BRlRFUixcbiAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzW10gPSBEQk9wZXJhdGlvbnMuQUxMLFxuICBoYW5kbGVyOiBPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT4sXG4gIGRhdGFUb0FkZD86IFZcbikge1xuICByZXR1cm4gKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGNvbnN0IG5hbWUgPSB0YXJnZXQuY29uc3RydWN0b3IubmFtZTtcbiAgICBjb25zdCBkZWNvcmF0b3JzID0gb3BlcmF0aW9uLnJlZHVjZSgoYWNjdW06IGFueVtdLCBvcCkgPT4ge1xuICAgICAgY29uc3QgY29tcG91bmRLZXkgPSBiYXNlT3AgKyBvcDtcbiAgICAgIGxldCBkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgT3BlcmF0aW9ucy5rZXkoY29tcG91bmRLZXkpLFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHByb3BlcnR5S2V5XG4gICAgICApO1xuICAgICAgaWYgKCFkYXRhKVxuICAgICAgICBkYXRhID0ge1xuICAgICAgICAgIG9wZXJhdGlvbjogb3AsXG4gICAgICAgICAgaGFuZGxlcnM6IHt9LFxuICAgICAgICB9O1xuXG4gICAgICBjb25zdCBoYW5kbGVyS2V5ID0gT3BlcmF0aW9ucy5nZXRIYW5kbGVyTmFtZShoYW5kbGVyKTtcblxuICAgICAgaWYgKFxuICAgICAgICAhZGF0YS5oYW5kbGVyc1tuYW1lXSB8fFxuICAgICAgICAhZGF0YS5oYW5kbGVyc1tuYW1lXVtwcm9wZXJ0eUtleV0gfHxcbiAgICAgICAgIShoYW5kbGVyS2V5IGluIGRhdGEuaGFuZGxlcnNbbmFtZV1bcHJvcGVydHlLZXldKVxuICAgICAgKSB7XG4gICAgICAgIGRhdGEuaGFuZGxlcnNbbmFtZV0gPSBkYXRhLmhhbmRsZXJzW25hbWVdIHx8IHt9O1xuICAgICAgICBkYXRhLmhhbmRsZXJzW25hbWVdW3Byb3BlcnR5S2V5XSA9XG4gICAgICAgICAgZGF0YS5oYW5kbGVyc1tuYW1lXVtwcm9wZXJ0eUtleV0gfHwge307XG4gICAgICAgIGRhdGEuaGFuZGxlcnNbbmFtZV1bcHJvcGVydHlLZXldW2hhbmRsZXJLZXldID0ge1xuICAgICAgICAgIGRhdGE6IGRhdGFUb0FkZCxcbiAgICAgICAgfTtcblxuICAgICAgICBhY2N1bS5wdXNoKFxuICAgICAgICAgIGhhbmRsZShjb21wb3VuZEtleSBhcyBPcGVyYXRpb25LZXlzLCBoYW5kbGVyKSxcbiAgICAgICAgICBwcm9wTWV0YWRhdGEoT3BlcmF0aW9ucy5rZXkoY29tcG91bmRLZXkpLCBkYXRhKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIFtdKTtcbiAgICByZXR1cm4gYXBwbHkoLi4uZGVjb3JhdG9ycykodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gIH07XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBCYXNlIGVycm9yIGNsYXNzIGZvciB0aGUgcmVwb3NpdG9yeSBtb2R1bGVcbiAqIEBzdW1tYXJ5IEFic3RyYWN0IGJhc2UgZXJyb3IgY2xhc3MgdGhhdCBhbGwgb3RoZXIgZXJyb3IgdHlwZXMgZXh0ZW5kIGZyb20uIFByb3ZpZGVzIGNvbW1vbiBlcnJvciBoYW5kbGluZyBmdW5jdGlvbmFsaXR5IGFuZCBzdGFuZGFyZGl6ZWQgSFRUUCBjb2RlIG1hcHBpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBlcnJvclxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIEVycm9yIG9iamVjdCB0byB3cmFwXG4gKiBAcGFyYW0ge251bWJlcn0gY29kZSAtIFRoZSBIVFRQIHN0YXR1cyBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVycm9yXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIEJhc2VFcnJvclxuICogQGV4YW1wbGVcbiAqIC8vIFRoaXMgaXMgYW4gYWJzdHJhY3QgY2xhc3MgYW5kIHNob3VsZCBub3QgYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5XG4gKiAvLyBJbnN0ZWFkLCB1c2Ugb25lIG9mIHRoZSBjb25jcmV0ZSBlcnJvciBjbGFzc2VzOlxuICogdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcignSW52YWxpZCBkYXRhIHByb3ZpZGVkJyk7XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IEUgYXMgQmFzZUVycm9yXG4gKiAgIEMtPj5FOiBuZXcgQmFzZUVycm9yKG5hbWUsbXNnLGNvZGUpXG4gKiAgIEUtLT4+QzogRXJyb3IgaW5zdGFuY2Ugd2l0aCBtZXNzYWdlIGFuZCBjb2RlXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IGNvZGUhOiBudW1iZXI7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIG1zZzogc3RyaW5nIHwgRXJyb3IsIGNvZGU6IG51bWJlcikge1xuICAgIGlmIChtc2cgaW5zdGFuY2VvZiBCYXNlRXJyb3IpIHJldHVybiBtc2c7XG4gICAgY29uc3QgbWVzc2FnZSA9IGBbJHtuYW1lfV0gJHttc2cgaW5zdGFuY2VvZiBFcnJvciA/IG1zZy5tZXNzYWdlIDogbXNnfWA7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICBpZiAobXNnIGluc3RhbmNlb2YgRXJyb3IpIHRoaXMuc3RhY2sgPSBtc2cuc3RhY2s7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgKDQwKSB0aHJvd24gd2hlbiBhIGJhZCByZXF1ZXN0IGlzIHJlY2VpdmVkXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgZmFpbHVyZSBpbiB0aGUgaW5wdXQgZGF0YSwgdHlwaWNhbGx5IHRocm93biB3aGVuIGEgY2xpZW50IHNlbmRzIGludmFsaWQgb3IgaW5jb21wbGV0ZSBkYXRhXG4gKiBAcGFyYW0ge3N0cmluZ3xFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgRXJyb3Igb2JqZWN0XG4gKiBAcmV0dXJuIHtCYWRSZXF1ZXN0RXJyb3J9IEEgbmV3IEJhZFJlcXVlc3RFcnJvciBpbnN0YW5jZVxuICogQGNsYXNzIEJhZFJlcXVlc3RFcnJvclxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgQmFkUmVxdWVzdEVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvciwgbmFtZSA9IEJhZFJlcXVlc3RFcnJvci5uYW1lLCBjb2RlID0gNDAwKSB7XG4gICAgc3VwZXIobmFtZSwgbXNnLCBjb2RlKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciAoNDIyKSB0aHJvd24gd2hlbiB2YWxpZGF0aW9uIGZhaWxzXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgZmFpbHVyZSBpbiB0aGUgTW9kZWwgZGV0YWlscywgdHlwaWNhbGx5IHRocm93biB3aGVuIGRhdGEgdmFsaWRhdGlvbiBmYWlsc1xuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIEVycm9yIG9iamVjdFxuICogQHJldHVybiB7VmFsaWRhdGlvbkVycm9yfSBBIG5ldyBWYWxpZGF0aW9uRXJyb3IgaW5zdGFuY2VcbiAqIEBjbGFzcyBWYWxpZGF0aW9uRXJyb3JcbiAqIEBleGFtcGxlXG4gKiAvLyBUaHJvdyBhIHZhbGlkYXRpb24gZXJyb3Igd2hlbiBkYXRhIGlzIGludmFsaWRcbiAqIGlmICghaXNWYWxpZChkYXRhKSkge1xuICogICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdJbnZhbGlkIGRhdGEgZm9ybWF0Jyk7XG4gKiB9XG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKi9cbmV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBCYWRSZXF1ZXN0RXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBWYWxpZGF0aW9uRXJyb3IubmFtZSwgNDIyKTtcbiAgfVxufVxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgKDUwMCkgdGhyb3duIGZvciBpbnRlcm5hbCBzeXN0ZW0gZmFpbHVyZXNcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYW4gaW50ZXJuYWwgZmFpbHVyZSAoc2hvdWxkIG1lYW4gYW4gZXJyb3IgaW4gY29kZSkgd2l0aCBIVFRQIDUwMCBzdGF0dXMgY29kZVxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIEVycm9yIG9iamVjdFxuICogQHJldHVybiB7SW50ZXJuYWxFcnJvcn0gQSBuZXcgSW50ZXJuYWxFcnJvciBpbnN0YW5jZVxuICogQGNsYXNzIEludGVybmFsRXJyb3JcbiAqIEBleGFtcGxlXG4gKiAvLyBUaHJvdyBhbiBpbnRlcm5hbCBlcnJvciB3aGVuIGFuIHVuZXhwZWN0ZWQgY29uZGl0aW9uIG9jY3Vyc1xuICogdHJ5IHtcbiAqICAgLy8gU29tZSBvcGVyYXRpb25cbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKCdVbmV4cGVjdGVkIGludGVybmFsIGVycm9yIG9jY3VycmVkJyk7XG4gKiB9XG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlcm5hbEVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvciwgbmFtZSA9IEludGVybmFsRXJyb3IubmFtZSwgY29kZSA9IDUwMCkge1xuICAgIHN1cGVyKG5hbWUsIG1zZywgY29kZSk7XG4gIH1cbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yICg1MDApIHRocm93biB3aGVuIHNlcmlhbGl6YXRpb24gb3IgZGVzZXJpYWxpemF0aW9uIGZhaWxzXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgZmFpbHVyZSBpbiB0aGUgTW9kZWwgZGUvc2VyaWFsaXphdGlvbiwgdHlwaWNhbGx5IHdoZW4gY29udmVydGluZyBiZXR3ZWVuIGRhdGEgZm9ybWF0c1xuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIEVycm9yIG9iamVjdFxuICogQHJldHVybiB7U2VyaWFsaXphdGlvbkVycm9yfSBBIG5ldyBTZXJpYWxpemF0aW9uRXJyb3IgaW5zdGFuY2VcbiAqIEBjbGFzcyBTZXJpYWxpemF0aW9uRXJyb3JcbiAqIEBleGFtcGxlXG4gKiAvLyBUaHJvdyBhIHNlcmlhbGl6YXRpb24gZXJyb3Igd2hlbiBKU09OIHBhcnNpbmcgZmFpbHNcbiAqIHRyeSB7XG4gKiAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGludmFsaWRKc29uKTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSBKU09OIGRhdGEnKTtcbiAqIH1cbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIFNlcmlhbGl6YXRpb25FcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBTZXJpYWxpemF0aW9uRXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gd2hlbiBhIHJlcXVlc3RlZCByZXNvdXJjZSBpcyBub3QgZm91bmRcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIGluIGZpbmRpbmcgYSBtb2RlbCwgcmVzdWx0aW5nIGluIGEgNDA0IEhUVFAgc3RhdHVzIGNvZGVcbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3RcbiAqIEByZXR1cm4ge05vdEZvdW5kRXJyb3J9IEEgbmV3IE5vdEZvdW5kRXJyb3IgaW5zdGFuY2VcbiAqIEBjbGFzcyBOb3RGb3VuZEVycm9yXG4gKiBAZXhhbXBsZVxuICogLy8gVGhyb3cgYSBub3QgZm91bmQgZXJyb3Igd2hlbiBhIHJlY29yZCBkb2Vzbid0IGV4aXN0XG4gKiBjb25zdCB1c2VyID0gYXdhaXQgcmVwb3NpdG9yeS5maW5kQnlJZChpZCk7XG4gKiBpZiAoIXVzZXIpIHtcbiAqICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYFVzZXIgd2l0aCBJRCAke2lkfSBub3QgZm91bmRgKTtcbiAqIH1cbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIE5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBCYWRSZXF1ZXN0RXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBOb3RGb3VuZEVycm9yLm5hbWUsIDQwNCk7XG4gIH1cbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biB3aGVuIGEgY29uZmxpY3Qgb2NjdXJzIGluIHRoZSBzdG9yYWdlXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgY29uZmxpY3QgaW4gdGhlIHN0b3JhZ2UsIHR5cGljYWxseSB3aGVuIHRyeWluZyB0byBjcmVhdGUgYSBkdXBsaWNhdGUgcmVzb3VyY2VcbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3RcbiAqIEByZXR1cm4ge0NvbmZsaWN0RXJyb3J9IEEgbmV3IENvbmZsaWN0RXJyb3IgaW5zdGFuY2VcbiAqIEBjbGFzcyBDb25mbGljdEVycm9yXG4gKiBAZXhhbXBsZVxuICogLy8gVGhyb3cgYSBjb25mbGljdCBlcnJvciB3aGVuIHRyeWluZyB0byBjcmVhdGUgYSBkdXBsaWNhdGUgcmVjb3JkXG4gKiBjb25zdCBleGlzdGluZ1VzZXIgPSBhd2FpdCByZXBvc2l0b3J5LmZpbmRCeUVtYWlsKGVtYWlsKTtcbiAqIGlmIChleGlzdGluZ1VzZXIpIHtcbiAqICAgdGhyb3cgbmV3IENvbmZsaWN0RXJyb3IoYFVzZXIgd2l0aCBlbWFpbCAke2VtYWlsfSBhbHJlYWR5IGV4aXN0c2ApO1xuICogfVxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgQ29uZmxpY3RFcnJvciBleHRlbmRzIEJhZFJlcXVlc3RFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIENvbmZsaWN0RXJyb3IubmFtZSwgNDA5KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgT3BlcmF0aW9ucyB9IGZyb20gXCIuLi9vcGVyYXRpb25zL09wZXJhdGlvbnNcIjtcbmltcG9ydCB7IE9wZXJhdGlvbkhhbmRsZXIsIFVwZGF0ZU9wZXJhdGlvbkhhbmRsZXIgfSBmcm9tIFwiLi4vb3BlcmF0aW9ucy90eXBlc1wiO1xuaW1wb3J0IHsgSVJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9JUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCIuLi9vcGVyYXRpb25zL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRGVjb3JhdG9yTWV0YWRhdGEsIFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCwgTW9kZWxLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCIuL0NvbnRleHRcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnlGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnRleHQgYXJndW1lbnRzIGZvciByZXBvc2l0b3J5IG9wZXJhdGlvbnMuXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIHRoZSBjb250ZXh0IGFuZCBhcmd1bWVudHMgZm9yIHJlcG9zaXRvcnkgb3BlcmF0aW9ucy5cbiAqIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHBhc3MgY29udGV4dCBhbmQgYXJndW1lbnRzIGJldHdlZW4gcmVwb3NpdG9yeSBtZXRob2RzLlxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlLCBkZWZhdWx0cyB0byBSZXBvc2l0b3J5RmxhZ3NcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSwgZGVmYXVsdHMgdG8gQ29udGV4dDxGPlxuICogQHR5cGVkZWYge09iamVjdH0gQ29udGV4dEFyZ3NcbiAqIEBwcm9wZXJ0eSB7Q30gY29udGV4dCAtIFRoZSBvcGVyYXRpb24gY29udGV4dFxuICogQHByb3BlcnR5IHthbnlbXX0gYXJncyAtIFRoZSBvcGVyYXRpb24gYXJndW1lbnRzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IHR5cGUgQ29udGV4dEFyZ3M8XG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbj4gPSB7XG4gIGNvbnRleHQ6IEM7XG4gIGFyZ3M6IGFueVtdO1xufTtcblxuLyoqXG4gKiBAc3VtbWFyeSByZXRyaWV2ZXMgdGhlIGFyZ3VtZW50cyBmb3IgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSB7YW55fSBkZWMgdGhlIGRlY29yYXRvclxuICogQHBhcmFtIHtzdHJpbmd9IHByb3AgdGhlIHByb3BlcnR5IG5hbWVcbiAqIEBwYXJhbSB7e319IG0gdGhlIG1vZGVsXG4gKiBAcGFyYW0ge3t9fSBbYWNjdW1dIGFjY3VtdWxhdG9yIHVzZWQgZm9yIGludGVybmFsIHJlY3Vyc2l2ZW5lc3NcbiAqXG4gKiBAZnVuY3Rpb24gZ2V0SGFuZGxlckFyZ3NcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9ycy5SZXBvc2l0b3J5XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRIYW5kbGVyQXJncyA9IGZ1bmN0aW9uIChcbiAgZGVjOiBhbnksXG4gIHByb3A6IHN0cmluZyxcbiAgbTogQ29uc3RydWN0b3I8YW55PixcbiAgYWNjdW0/OiBSZWNvcmQ8c3RyaW5nLCB7IGFyZ3M6IHN0cmluZ1tdIH0+XG4pOiBSZWNvcmQ8c3RyaW5nLCB7IGFyZ3M6IHN0cmluZ1tdIH0+IHwgdm9pZCB7XG4gIGNvbnN0IG5hbWUgPSBtLmNvbnN0cnVjdG9yLm5hbWU7XG4gIGlmICghbmFtZSkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJDb3VsZCBub3QgZGV0ZXJtaW5lIG1vZGVsIGNsYXNzXCIpO1xuICBhY2N1bSA9IGFjY3VtIHx8IHt9O1xuXG4gIGlmIChkZWMucHJvcHMuaGFuZGxlcnNbbmFtZV0gJiYgZGVjLnByb3BzLmhhbmRsZXJzW25hbWVdW3Byb3BdKVxuICAgIGFjY3VtID0geyAuLi5kZWMucHJvcHMuaGFuZGxlcnNbbmFtZV1bcHJvcF0sIC4uLmFjY3VtIH07XG5cbiAgbGV0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG0pO1xuICBpZiAocHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUpIHJldHVybiBhY2N1bTtcbiAgaWYgKHByb3RvLmNvbnN0cnVjdG9yLm5hbWUgPT09IG5hbWUpIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcblxuICByZXR1cm4gZ2V0SGFuZGxlckFyZ3MoZGVjLCBwcm9wLCBwcm90bywgYWNjdW0pO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtJUmVwb3NpdG9yeTxUPn0gcmVwb1xuICogQHBhcmFtIGNvbnRleHRcbiAqIEBwYXJhbSB7VH0gbW9kZWxcbiAqIEBwYXJhbSBvcGVyYXRpb25cbiAqIEBwYXJhbSBwcmVmaXhcbiAqXG4gKiBAcGFyYW0gb2xkTW9kZWxcbiAqIEBmdW5jdGlvbiBlbmZvcmNlREJQcm9wZXJ0eURlY29yYXRvcnNBc3luY1xuICpcbiAqIEBtZW1iZXJPZiBkYi1kZWNvcmF0b3JzLnV0aWxzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmZvcmNlREJEZWNvcmF0b3JzPFxuICBNIGV4dGVuZHMgTW9kZWw8dHJ1ZSB8IGZhbHNlPixcbiAgUiBleHRlbmRzIElSZXBvc2l0b3J5PE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgb2JqZWN0ID0gb2JqZWN0LFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzID0gUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4+KFxuICByZXBvOiBSLFxuICBjb250ZXh0OiBDLFxuICBtb2RlbDogTSxcbiAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gIHByZWZpeDogc3RyaW5nLFxuICBvbGRNb2RlbD86IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkZWNvcmF0b3JzOiBSZWNvcmQ8c3RyaW5nLCBEZWNvcmF0b3JNZXRhZGF0YVtdPiB8IHVuZGVmaW5lZCA9XG4gICAgZ2V0RGJEZWNvcmF0b3JzKG1vZGVsLCBvcGVyYXRpb24sIHByZWZpeCk7XG5cbiAgaWYgKCFkZWNvcmF0b3JzKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBwcm9wIGluIGRlY29yYXRvcnMpIHtcbiAgICBjb25zdCBkZWNzOiBEZWNvcmF0b3JNZXRhZGF0YVtdID0gZGVjb3JhdG9yc1twcm9wXTtcbiAgICBmb3IgKGNvbnN0IGRlYyBvZiBkZWNzKSB7XG4gICAgICBjb25zdCB7IGtleSB9ID0gZGVjO1xuICAgICAgY29uc3QgaGFuZGxlcnM6IE9wZXJhdGlvbkhhbmRsZXI8TSwgUiwgViwgRiwgQz5bXSB8IHVuZGVmaW5lZCA9XG4gICAgICAgIE9wZXJhdGlvbnMuZ2V0PE0sIFIsIFYsIEYsIEM+KG1vZGVsLCBwcm9wLCBwcmVmaXggKyBrZXkpO1xuICAgICAgaWYgKCFoYW5kbGVycyB8fCAhaGFuZGxlcnMubGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgQ291bGQgbm90IGZpbmQgcmVnaXN0ZXJlZCBoYW5kbGVyIGZvciB0aGUgb3BlcmF0aW9uICR7cHJlZml4ICsga2V5fSB1bmRlciBwcm9wZXJ0eSAke3Byb3B9YFxuICAgICAgICApO1xuXG4gICAgICBjb25zdCBoYW5kbGVyQXJncyA9IGdldEhhbmRsZXJBcmdzKGRlYywgcHJvcCwgbW9kZWwgYXMgYW55KTtcblxuICAgICAgaWYgKCFoYW5kbGVyQXJncyB8fCBPYmplY3QudmFsdWVzKGhhbmRsZXJBcmdzKS5sZW5ndGggIT09IGhhbmRsZXJzLmxlbmd0aClcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJBcmdzIGFuZCBoYW5kbGVycyBsZW5ndGggZG8gbm90IG1hdGNoXCIpO1xuXG4gICAgICBsZXQgaGFuZGxlcjogT3BlcmF0aW9uSGFuZGxlcjxNLCBSLCBWLCBGLCBDPjtcbiAgICAgIGxldCBkYXRhOiBhbnk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGhhbmRsZXIgPSBoYW5kbGVyc1tpXTtcbiAgICAgICAgZGF0YSA9IE9iamVjdC52YWx1ZXMoaGFuZGxlckFyZ3MpW2ldO1xuXG4gICAgICAgIGNvbnN0IGFyZ3M6IGFueVtdID0gW2NvbnRleHQsIGRhdGEuZGF0YSwgcHJvcCwgbW9kZWxdO1xuXG4gICAgICAgIGlmIChvcGVyYXRpb24gPT09IE9wZXJhdGlvbktleXMuVVBEQVRFICYmIHByZWZpeCA9PT0gT3BlcmF0aW9uS2V5cy5PTikge1xuICAgICAgICAgIGlmICghb2xkTW9kZWwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc3Npbmcgb2xkIG1vZGVsIGZvciB1cGRhdGUgb3BlcmF0aW9uXCIpO1xuICAgICAgICAgIGFyZ3MucHVzaChvbGRNb2RlbCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCAoaGFuZGxlciBhcyBVcGRhdGVPcGVyYXRpb25IYW5kbGVyPE0sIFIsIFYsIEYsIEM+KS5hcHBseShcbiAgICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgICBhcmdzIGFzIFtDLCBWLCBrZXlvZiBNLCBNLCBNXVxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICBjb25zdCBtc2cgPSBgRmFpbGVkIHRvIGV4ZWN1dGUgaGFuZGxlciAke2hhbmRsZXIubmFtZX0gZm9yICR7cHJvcH0gb24gJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfSBkdWUgdG8gZXJyb3I6ICR7ZX1gO1xuICAgICAgICAgIGlmIChjb250ZXh0LmdldChcImJyZWFrT25IYW5kbGVyRXJyb3JcIikpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKG1zZyk7XG4gICAgICAgICAgY29uc29sZS5sb2cobXNnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNwZWNpZmljIGZvciBEQiBEZWNvcmF0b3JzXG4gKiBAcGFyYW0ge1R9IG1vZGVsXG4gKiBAcGFyYW0ge3N0cmluZ30gb3BlcmF0aW9uIENSVUQge0BsaW5rIE9wZXJhdGlvbktleXN9XG4gKiBAcGFyYW0ge3N0cmluZ30gW2V4dHJhUHJlZml4XVxuICpcbiAqIEBmdW5jdGlvbiBnZXREYlByb3BlcnR5RGVjb3JhdG9yc1xuICpcbiAqIEBtZW1iZXJPZiBkYi1kZWNvcmF0b3JzLnV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREYkRlY29yYXRvcnM8VCBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IFQsXG4gIG9wZXJhdGlvbjogc3RyaW5nLFxuICBleHRyYVByZWZpeD86IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgRGVjb3JhdG9yTWV0YWRhdGFbXT4gfCB1bmRlZmluZWQge1xuICBjb25zdCBkZWNvcmF0b3JzOiBSZWNvcmQ8c3RyaW5nLCBEZWNvcmF0b3JNZXRhZGF0YVtdPiB8IHVuZGVmaW5lZCA9XG4gICAgUmVmbGVjdGlvbi5nZXRBbGxQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICBtb2RlbCxcbiAgICAgIC8vIHVuZGVmaW5lZCxcbiAgICAgIE9wZXJhdGlvbktleXMuUkVGTEVDVCArIChleHRyYVByZWZpeCA/IGV4dHJhUHJlZml4IDogXCJcIilcbiAgICApO1xuICBpZiAoIWRlY29yYXRvcnMpIHJldHVybjtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGRlY29yYXRvcnMpLnJlZHVjZShcbiAgICAoYWNjdW06IFJlY29yZDxzdHJpbmcsIERlY29yYXRvck1ldGFkYXRhW10+IHwgdW5kZWZpbmVkLCBkZWNvcmF0b3IpID0+IHtcbiAgICAgIGNvbnN0IGRlYyA9IGRlY29yYXRvcnNbZGVjb3JhdG9yXS5maWx0ZXIoKGQpID0+IGQua2V5ID09PSBvcGVyYXRpb24pO1xuICAgICAgaWYgKGRlYyAmJiBkZWMubGVuZ3RoKSB7XG4gICAgICAgIGlmICghYWNjdW0pIGFjY3VtID0ge307XG4gICAgICAgIGFjY3VtW2RlY29yYXRvcl0gPSBkZWM7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSxcbiAgICB1bmRlZmluZWRcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIGRlY29yYXRvcnMgZm9yIGFuIG9iamVjdCdzIHByb3BlcnRpZXMgcHJlZml4ZWQgYnkge0BwYXJhbSBwcmVmaXhlc30gcmVjdXJzaXZlbHlcbiAqIEBwYXJhbSBtb2RlbFxuICogQHBhcmFtIGFjY3VtXG4gKiBAcGFyYW0gcHJlZml4ZXNcbiAqXG4gKiBAZnVuY3Rpb24gZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzUmVjdXJzaXZlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnMuUmVwb3NpdG9yeVxuICovXG5leHBvcnQgY29uc3QgZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzUmVjdXJzaXZlID0gZnVuY3Rpb24gPFQgZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBULFxuICBhY2N1bTogeyBbaW5kZXhlcjogc3RyaW5nXTogYW55W10gfSB8IHVuZGVmaW5lZCxcbiAgLi4ucHJlZml4ZXM6IHN0cmluZ1tdXG4pOiB7IFtpbmRleGVyOiBzdHJpbmddOiBhbnlbXSB9IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgYWNjdW11bGF0b3IgPSBhY2N1bSB8fCB7fTtcbiAgY29uc3QgbWVyZ2VEZWNvcmF0b3JzID0gZnVuY3Rpb24gKGRlY3M6IHsgW2luZGV4ZXI6IHN0cmluZ106IGFueVtdIH0pIHtcbiAgICBjb25zdCBwdXNoT3JTcXVhc2ggPSAoa2V5OiBzdHJpbmcsIC4uLnZhbHVlczogYW55W10pID0+IHtcbiAgICAgIHZhbHVlcy5mb3JFYWNoKCh2YWwpID0+IHtcbiAgICAgICAgbGV0IG1hdGNoOiBhbnk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhKG1hdGNoID0gYWNjdW11bGF0b3Jba2V5XS5maW5kKChlKSA9PiBlLmtleSA9PT0gdmFsLmtleSkpIHx8XG4gICAgICAgICAgbWF0Y2gucHJvcHMub3BlcmF0aW9uICE9PSB2YWwucHJvcHMub3BlcmF0aW9uXG4gICAgICAgICkge1xuICAgICAgICAgIGFjY3VtdWxhdG9yW2tleV0ucHVzaCh2YWwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWwua2V5ID09PSBNb2RlbEtleXMuVFlQRSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHsgaGFuZGxlcnMsIG9wZXJhdGlvbiB9ID0gdmFsLnByb3BzO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAhb3BlcmF0aW9uIHx8XG4gICAgICAgICAgIW9wZXJhdGlvbi5tYXRjaChcbiAgICAgICAgICAgIG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAgIGBeKDo/JHtPcGVyYXRpb25LZXlzLk9OfXwke09wZXJhdGlvbktleXMuQUZURVJ9KSg6PyR7T3BlcmF0aW9uS2V5cy5DUkVBVEV9fCR7T3BlcmF0aW9uS2V5cy5SRUFEfXwke09wZXJhdGlvbktleXMuVVBEQVRFfXwke09wZXJhdGlvbktleXMuREVMRVRFfSkkYFxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgYWNjdW11bGF0b3Jba2V5XS5wdXNoKHZhbCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWNjdW1IYW5kbGVycyA9IG1hdGNoLnByb3BzLmhhbmRsZXJzO1xuXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGhhbmRsZXJzKS5mb3JFYWNoKChbY2xhenosIGhhbmRsZXJEZWZdKSA9PiB7XG4gICAgICAgICAgaWYgKCEoY2xhenogaW4gYWNjdW1IYW5kbGVycykpIHtcbiAgICAgICAgICAgIGFjY3VtSGFuZGxlcnNbY2xhenpdID0gaGFuZGxlckRlZjtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBPYmplY3QuZW50cmllcyhoYW5kbGVyRGVmIGFzIG9iamVjdCkuZm9yRWFjaChcbiAgICAgICAgICAgIChbaGFuZGxlclByb3AsIGhhbmRsZXJdKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghKGhhbmRsZXJQcm9wIGluIGFjY3VtSGFuZGxlcnNbY2xhenpdKSkge1xuICAgICAgICAgICAgICAgIGFjY3VtSGFuZGxlcnNbY2xhenpdW2hhbmRsZXJQcm9wXSA9IGhhbmRsZXI7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoaGFuZGxlciBhcyBvYmplY3QpLmZvckVhY2goXG4gICAgICAgICAgICAgICAgKFtoYW5kbGVyS2V5LCBhcmdzT2JqXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKCEoaGFuZGxlcktleSBpbiBhY2N1bUhhbmRsZXJzW2NsYXp6XVtoYW5kbGVyUHJvcF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjY3VtSGFuZGxlcnNbY2xhenpdW2hhbmRsZXJQcm9wXVtoYW5kbGVyS2V5XSA9IGFyZ3NPYmo7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgICAgYFNraXBwaW5nIGhhbmRsZXIgcmVnaXN0cmF0aW9uIGZvciAke2NsYXp6fSB1bmRlciBwcm9wICR7aGFuZGxlclByb3B9IGJlY2F1c2UgaGFuZGxlciBpcyB0aGUgc2FtZWBcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIE9iamVjdC5lbnRyaWVzKGRlY3MpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgYWNjdW11bGF0b3Jba2V5XSA9IGFjY3VtdWxhdG9yW2tleV0gfHwgW107XG4gICAgICBwdXNoT3JTcXVhc2goa2V5LCAuLi52YWx1ZSk7XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgZGVjczogeyBbaW5kZXhlcjogc3RyaW5nXTogYW55W10gfSB8IHVuZGVmaW5lZCA9XG4gICAgUmVmbGVjdGlvbi5nZXRBbGxQcm9wZXJ0eURlY29yYXRvcnMobW9kZWwsIC4uLnByZWZpeGVzKTtcbiAgaWYgKGRlY3MpIG1lcmdlRGVjb3JhdG9ycyhkZWNzKTtcblxuICBpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKG1vZGVsKSA9PT0gT2JqZWN0LnByb3RvdHlwZSkgcmV0dXJuIGFjY3VtdWxhdG9yO1xuXG4gIC8vIGNvbnN0IG5hbWUgPSBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lO1xuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihtb2RlbCk7XG4gIGlmICghcHJvdG8pIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgLy8gaWYgKHByb3RvLmNvbnN0cnVjdG9yICYmIHByb3RvLmNvbnN0cnVjdG9yLm5hbWUgPT09IG5hbWUpXG4gIC8vICAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bylcbiAgcmV0dXJuIGdldEFsbFByb3BlcnR5RGVjb3JhdG9yc1JlY3Vyc2l2ZShwcm90bywgYWNjdW11bGF0b3IsIC4uLnByZWZpeGVzKTtcbn07XG4iLCJpbXBvcnQgeyBSZXBvc2l0b3J5RmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gZmxhZ3MgZm9yIHJlcG9zaXRvcnkgb3BlcmF0aW9ucy5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGRlZmF1bHQgdmFsdWVzIGZvciByZXBvc2l0b3J5IG9wZXJhdGlvbiBmbGFncywgZXhjbHVkaW5nIHRoZSB0aW1lc3RhbXAgcHJvcGVydHkuXG4gKiBUaGVzZSBmbGFncyBjb250cm9sIGJlaGF2aW9yIHN1Y2ggYXMgY29udGV4dCBoYW5kbGluZywgdmFsaWRhdGlvbiwgZXJyb3IgaGFuZGxpbmcsIGFuZCBtb3JlLlxuICogQGNvbnN0IERlZmF1bHRSZXBvc2l0b3J5RmxhZ3NcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgRGVmYXVsdFJlcG9zaXRvcnlGbGFnczogT21pdDxSZXBvc2l0b3J5RmxhZ3MsIFwidGltZXN0YW1wXCI+ID0ge1xuICBwYXJlbnRDb250ZXh0OiB1bmRlZmluZWQsXG4gIGNoaWxkQ29udGV4dHM6IFtdLFxuICBpZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXM6IFtdLFxuICBjYWxsQXJnczogW10sXG4gIHdyaXRlT3BlcmF0aW9uOiBmYWxzZSxcbiAgYWZmZWN0ZWRUYWJsZXM6IFtdLFxuICBvcGVyYXRpb246IHVuZGVmaW5lZCxcbiAgYnJlYWtPbkhhbmRsZXJFcnJvcjogdHJ1ZSxcbiAgcmVidWlsZFdpdGhUcmFuc2llbnQ6IHRydWUsXG59O1xuIiwiaW1wb3J0IHsgQ29udGV4dEFyZ3MgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgQ29udGV4dHVhbCB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL0NvbnRleHR1YWxcIjtcbmltcG9ydCB7IE9wZXJhdGlvbktleXMgfSBmcm9tIFwiLi4vb3BlcmF0aW9ucy9jb25zdGFudHNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IERlZmF1bHRSZXBvc2l0b3J5RmxhZ3MgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IE9iamVjdEFjY3VtdWxhdG9yIH0gZnJvbSBcInR5cGVkLW9iamVjdC1hY2N1bXVsYXRvclwiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeUZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRmFjdG9yeSB0eXBlIGZvciBjcmVhdGluZyBjb250ZXh0IGluc3RhbmNlcy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBmdW5jdGlvbiB0eXBlIHRoYXQgY3JlYXRlcyBjb250ZXh0IGluc3RhbmNlcyB3aXRoIHNwZWNpZmljIHJlcG9zaXRvcnkgZmxhZ3MuXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGUgZXh0ZW5kaW5nIFJlcG9zaXRvcnlGbGFnc1xuICogQHR5cGVkZWYge0Z1bmN0aW9ufSBDb250ZXh0RmFjdG9yeVxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRleHRGYWN0b3J5PEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3M+ID0gPEMgZXh0ZW5kcyBDb250ZXh0PEY+PihcbiAgYXJnOiBPbWl0PEYsIFwidGltZXN0YW1wXCI+XG4pID0+IEM7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgZmFjdG9yeSBmb3IgY3JlYXRpbmcgY29udGV4dCBpbnN0YW5jZXMuXG4gKiBAc3VtbWFyeSBBIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIG5ldyBDb250ZXh0IGluc3RhbmNlcyB3aXRoIHRoZSBwcm92aWRlZCByZXBvc2l0b3J5IGZsYWdzLlxuICogSXQgYXV0b21hdGljYWxseSBhZGRzIGEgdGltZXN0YW1wIHRvIHRoZSBjb250ZXh0IGFuZCByZXR1cm5zIGEgcHJvcGVybHkgdHlwZWQgY29udGV4dCBpbnN0YW5jZS5cbiAqIEBjb25zdCBEZWZhdWx0Q29udGV4dEZhY3RvcnlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgRGVmYXVsdENvbnRleHRGYWN0b3J5OiBDb250ZXh0RmFjdG9yeTxhbnk+ID0gPFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIGFyZzogT21pdDxGLCBcInRpbWVzdGFtcFwiPlxuKSA9PiB7XG4gIHJldHVybiBuZXcgQ29udGV4dDxGPigpLmFjY3VtdWxhdGUoXG4gICAgT2JqZWN0LmFzc2lnbih7fSwgYXJnLCB7IHRpbWVzdGFtcDogbmV3IERhdGUoKSB9KSBhcyBGXG4gICkgYXMgQztcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgY29udGV4dCBtYW5hZ2VtZW50IGNsYXNzIGZvciBoYW5kbGluZyByZXBvc2l0b3J5IG9wZXJhdGlvbnMuXG4gKiBAc3VtbWFyeSBUaGUgQ29udGV4dCBjbGFzcyBwcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgbWFuYWdpbmcgcmVwb3NpdG9yeSBvcGVyYXRpb25zIHdpdGggZmxhZ3MsXG4gKiBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwcywgYW5kIHN0YXRlIGFjY3VtdWxhdGlvbi4gSXQgYWxsb3dzIGZvciBoaWVyYXJjaGljYWwgY29udGV4dCBjaGFpbnNcbiAqIGFuZCBtYWludGFpbnMgb3BlcmF0aW9uLXNwZWNpZmljIGNvbmZpZ3VyYXRpb25zIHdoaWxlIHN1cHBvcnRpbmcgdHlwZSBzYWZldHkgdGhyb3VnaCBnZW5lcmljcy5cbiAqXG4gKiBAdGVtcGxhdGUgRiAtIFR5cGUgZXh0ZW5kaW5nIFJlcG9zaXRvcnlGbGFncyB0aGF0IGRlZmluZXMgdGhlIGNvbnRleHQgY29uZmlndXJhdGlvblxuICpcbiAqIEBwYXJhbSB7T2JqZWN0QWNjdW11bGF0b3I8Rj59IGNhY2hlIC0gVGhlIGludGVybmFsIGNhY2hlIHN0b3JpbmcgYWNjdW11bGF0ZWQgdmFsdWVzXG4gKlxuICogQGNsYXNzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0aW5nIGEgbmV3IGNvbnRleHQgd2l0aCByZXBvc2l0b3J5IGZsYWdzXG4gKiBjb25zdCBjb250ZXh0ID0gbmV3IENvbnRleHQ8UmVwb3NpdG9yeUZsYWdzPigpO1xuICpcbiAqIC8vIEFjY3VtdWxhdGluZyB2YWx1ZXNcbiAqIGNvbnN0IGVucmljaGVkQ29udGV4dCA9IGNvbnRleHQuYWNjdW11bGF0ZSh7XG4gKiAgIHdyaXRlT3BlcmF0aW9uOiB0cnVlLFxuICogICBhZmZlY3RlZFRhYmxlczogWyd1c2VycyddLFxuICogICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMuQ1JFQVRFXG4gKiB9KTtcbiAqXG4gKiAvLyBBY2Nlc3NpbmcgdmFsdWVzXG4gKiBjb25zdCBpc1dyaXRlID0gZW5yaWNoZWRDb250ZXh0LmdldCgnd3JpdGVPcGVyYXRpb24nKTsgLy8gdHJ1ZVxuICogY29uc3QgdGFibGVzID0gZW5yaWNoZWRDb250ZXh0LmdldCgnYWZmZWN0ZWRUYWJsZXMnKTsgLy8gWyd1c2VycyddXG4gKiBgYGBcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IEN0eCBhcyBDb250ZXh0XG4gKiAgIHBhcnRpY2lwYW50IENhY2hlIGFzIE9iamVjdEFjY3VtdWxhdG9yXG4gKlxuICogICBDLT4+Q3R4OiBuZXcgQ29udGV4dCgpXG4gKiAgIEN0eC0+PkNhY2hlOiBjcmVhdGUgY2FjaGVcbiAqXG4gKiAgIEMtPj5DdHg6IGFjY3VtdWxhdGUodmFsdWUpXG4gKiAgIEN0eC0+PkNhY2hlOiBhY2N1bXVsYXRlKHZhbHVlKVxuICogICBDYWNoZS0tPj5DdHg6IHVwZGF0ZWQgY2FjaGVcbiAqICAgQ3R4LS0+PkM6IHVwZGF0ZWQgY29udGV4dFxuICpcbiAqICAgQy0+PkN0eDogZ2V0KGtleSlcbiAqICAgQ3R4LT4+Q2FjaGU6IGdldChrZXkpXG4gKiAgIGFsdCBLZXkgZXhpc3RzIGluIGNhY2hlXG4gKiAgICAgQ2FjaGUtLT4+Q3R4OiB2YWx1ZVxuICogICBlbHNlIEtleSBub3QgZm91bmRcbiAqICAgICBDdHgtPj5DdHg6IGNoZWNrIHBhcmVudCBjb250ZXh0XG4gKiAgICAgYWx0IFBhcmVudCBleGlzdHNcbiAqICAgICAgIEN0eC0+PlBhcmVudDogZ2V0KGtleSlcbiAqICAgICAgIFBhcmVudC0tPj5DdHg6IHZhbHVlXG4gKiAgICAgZWxzZSBObyBwYXJlbnRcbiAqICAgICAgIEN0eC0tPj5DOiB0aHJvdyBlcnJvclxuICogICAgIGVuZFxuICogICBlbmRcbiAqICAgQ3R4LS0+PkM6IHJlcXVlc3RlZCB2YWx1ZVxuICovXG5leHBvcnQgY2xhc3MgQ29udGV4dDxGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImNhY2hlXCIsIHtcbiAgICAgIHZhbHVlOiBuZXcgT2JqZWN0QWNjdW11bGF0b3I8Rj4oKSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGZhY3Rvcnk6IENvbnRleHRGYWN0b3J5PGFueT4gPSBEZWZhdWx0Q29udGV4dEZhY3Rvcnk7XG5cbiAgcmVhZG9ubHkgY2FjaGU6IFJlcG9zaXRvcnlGbGFncyAmIE9iamVjdEFjY3VtdWxhdG9yPGFueT4gPVxuICAgIG5ldyBPYmplY3RBY2N1bXVsYXRvcigpIGFzIHVua25vd24gYXMgUmVwb3NpdG9yeUZsYWdzICZcbiAgICAgIE9iamVjdEFjY3VtdWxhdG9yPGFueT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBY2N1bXVsYXRlcyBuZXcgdmFsdWVzIGludG8gdGhlIGNvbnRleHQuXG4gICAqIEBzdW1tYXJ5IE1lcmdlcyB0aGUgcHJvdmlkZWQgdmFsdWUgb2JqZWN0IHdpdGggdGhlIGV4aXN0aW5nIGNvbnRleHQgc3RhdGUsXG4gICAqIGNyZWF0aW5nIGEgbmV3IGltbXV0YWJsZSBjYWNoZSBzdGF0ZS5cbiAgICovXG4gIGFjY3VtdWxhdGU8ViBleHRlbmRzIG9iamVjdD4odmFsdWU6IFYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJjYWNoZVwiLCB7XG4gICAgICB2YWx1ZTogKHRoaXMuY2FjaGUgYXMgT2JqZWN0QWNjdW11bGF0b3I8YW55PikuYWNjdW11bGF0ZSh2YWx1ZSksXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcyBhcyB1bmtub3duIGFzIENvbnRleHQ8RiAmIFY+O1xuICB9XG5cbiAgZ2V0IHRpbWVzdGFtcCgpIHtcbiAgICByZXR1cm4gKHRoaXMuY2FjaGUgYXMgYW55KS50aW1lc3RhbXAgYXMgRltcInRpbWVzdGFtcFwiXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgdmFsdWUgZnJvbSB0aGUgY29udGV4dCBieSBrZXkuXG4gICAqL1xuICBnZXQ8SyBleHRlbmRzIGtleW9mIEY+KGtleTogSyk6IEZbS10ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKHRoaXMuY2FjaGUgYXMgT2JqZWN0QWNjdW11bGF0b3I8YW55PikuZ2V0KFxuICAgICAgICBrZXkgYXMgdW5rbm93biBhcyBzdHJpbmdcbiAgICAgICkgYXMgRltLXTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSAodGhpcy5jYWNoZSBhcyBhbnkpLnBhcmVudENvbnRleHQgYXNcbiAgICAgICAgfCBDb250ZXh0PEY+XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHBhcmVudCkgcmV0dXJuIHBhcmVudC5nZXQoa2V5KTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgY2hpbGQgY29udGV4dCBmcm9tIGFub3RoZXIgY29udGV4dFxuICAgKi9cbiAgc3RhdGljIGNoaWxkRnJvbTxGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLCBDIGV4dGVuZHMgQ29udGV4dDxGPj4oXG4gICAgY29udGV4dDogQyxcbiAgICBvdmVycmlkZXM/OiBQYXJ0aWFsPEY+XG4gICk6IEMge1xuICAgIHJldHVybiBDb250ZXh0LmZhY3RvcnkoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCAoY29udGV4dCBhcyBhbnkpLmNhY2hlLCBvdmVycmlkZXMgfHwge30pXG4gICAgKSBhcyB1bmtub3duIGFzIEM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgY29udGV4dCBmcm9tIG9wZXJhdGlvbiBwYXJhbWV0ZXJzXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZnJvbTxcbiAgICBNIGV4dGVuZHMgTW9kZWwsXG4gICAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbiAgPihcbiAgICBvcGVyYXRpb246XG4gICAgICB8IE9wZXJhdGlvbktleXMuQ1JFQVRFXG4gICAgICB8IE9wZXJhdGlvbktleXMuUkVBRFxuICAgICAgfCBPcGVyYXRpb25LZXlzLlVQREFURVxuICAgICAgfCBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICBvdmVycmlkZXM6IFBhcnRpYWw8Rj4sXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEM+IHtcbiAgICByZXR1cm4gQ29udGV4dC5mYWN0b3J5KFxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgRGVmYXVsdFJlcG9zaXRvcnlGbGFncyBhcyBSZXBvc2l0b3J5RmxhZ3MsIG92ZXJyaWRlcywge1xuICAgICAgICBvcGVyYXRpb246IG9wZXJhdGlvbixcbiAgICAgICAgbW9kZWw6IG1vZGVsLFxuICAgICAgfSlcbiAgICApIGFzIEM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGFyZ3VtZW50cyBmb3IgY29udGV4dCBvcGVyYXRpb25zXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgYXJnczxcbiAgICBNIGV4dGVuZHMgTW9kZWw8YW55PixcbiAgICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbiAgICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICA+KFxuICAgIG9wZXJhdGlvbjpcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5DUkVBVEVcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5SRUFEXG4gICAgICB8IE9wZXJhdGlvbktleXMuVVBEQVRFXG4gICAgICB8IE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBhcmdzOiBhbnlbXSxcbiAgICBjb250ZXh0dWFsPzogQ29udGV4dHVhbDxGPixcbiAgICBvdmVycmlkZXM/OiBQYXJ0aWFsPEY+XG4gICk6IFByb21pc2U8Q29udGV4dEFyZ3M8RiwgQz4+IHtcbiAgICBjb25zdCBsYXN0ID0gYXJncy5wb3AoKTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIGdldENvbnRleHQoKSB7XG4gICAgICBpZiAoY29udGV4dHVhbClcbiAgICAgICAgcmV0dXJuIGNvbnRleHR1YWwuY29udGV4dChvcGVyYXRpb24sIG92ZXJyaWRlcyB8fCB7fSwgbW9kZWwsIC4uLmFyZ3MpO1xuICAgICAgcmV0dXJuIENvbnRleHQuZnJvbShvcGVyYXRpb24sIG92ZXJyaWRlcyB8fCB7fSwgbW9kZWwsIC4uLmFyZ3MpO1xuICAgIH1cblxuICAgIGxldCBjOiBDO1xuICAgIGlmIChsYXN0KSB7XG4gICAgICBpZiAobGFzdCBpbnN0YW5jZW9mIENvbnRleHQpIHtcbiAgICAgICAgYyA9IGxhc3QgYXMgQztcbiAgICAgICAgYXJncy5wdXNoKGxhc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXJncy5wdXNoKGxhc3QpO1xuICAgICAgICBjID0gKGF3YWl0IGdldENvbnRleHQoKSkgYXMgQztcbiAgICAgICAgYXJncy5wdXNoKGMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjID0gKGF3YWl0IGdldENvbnRleHQoKSkgYXMgQztcbiAgICAgIGFyZ3MucHVzaChjKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb250ZXh0OiBjLCBhcmdzOiBhcmdzIH07XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiLi9Db250ZXh0XCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgVXRpbCBtZXRob2QgdG8gY2hhbmdlIGEgbWV0aG9kIG9mIGFuIG9iamVjdCBwcmVmaXhpbmcgaXQgd2l0aCBhbm90aGVyXG4gKiBAcGFyYW0ge2FueX0gb2JqIFRoZSBCYXNlIE9iamVjdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gYWZ0ZXIgVGhlIG9yaWdpbmFsIG1ldGhvZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZml4IFRoZSBQcmVmaXggbWV0aG9kLiBUaGUgb3V0cHV0IHdpbGwgYmUgdXNlZCBhcyBhcmd1bWVudHMgaW4gdGhlIG9yaWdpbmFsIG1ldGhvZFxuICogQHBhcmFtIHtzdHJpbmd9IFthZnRlck5hbWVdIFdoZW4gdGhlIGFmdGVyIGZ1bmN0aW9uIGFubWUgY2Fubm90IGJlIGV4dHJhY3RlZCwgcGFzcyBpdCBoZXJlXG4gKlxuICogQGZ1bmN0aW9uIHByZWZpeE1ldGhvZFxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlZml4TWV0aG9kKFxuICBvYmo6IGFueSxcbiAgYWZ0ZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LFxuICBwcmVmaXg6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LFxuICBhZnRlck5hbWU/OiBzdHJpbmdcbikge1xuICBhc3luYyBmdW5jdGlvbiB3cmFwcGVyKHRoaXM6IGFueSwgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKHByZWZpeC5jYWxsKHRoaXMsIC4uLmFyZ3MpKTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFmdGVyLmFwcGx5KHRoaXMsIHJlc3VsdHMpKTtcbiAgfVxuICBjb25zdCB3cmFwcGVkID0gd3JhcHBlci5iaW5kKG9iaik7XG4gIGNvbnN0IG5hbWUgPSBhZnRlck5hbWUgPyBhZnRlck5hbWUgOiBhZnRlci5uYW1lO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkod3JhcHBlZCwgXCJuYW1lXCIsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgdmFsdWU6IG5hbWUsXG4gIH0pO1xuICBvYmpbbmFtZV0gPSB3cmFwcGVkO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFV0aWwgbWV0aG9kIHRvIGNoYW5nZSBhIG1ldGhvZCBvZiBhbiBvYmplY3Qgc3VmZml4aW5nIGl0IHdpdGggYW5vdGhlclxuICogQHBhcmFtIHthbnl9IG9iaiBUaGUgQmFzZSBPYmplY3RcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGJlZm9yZSBUaGUgb3JpZ2luYWwgbWV0aG9kXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdWZmaXggVGhlIFByZWZpeCBtZXRob2QuIFRoZSBvdXRwdXQgd2lsbCBiZSB1c2VkIGFzIGFyZ3VtZW50cyBpbiB0aGUgb3JpZ2luYWwgbWV0aG9kXG4gKiBAcGFyYW0ge3N0cmluZ30gW2JlZm9yZU5hbWVdIFdoZW4gdGhlIGFmdGVyIGZ1bmN0aW9uIGFubWUgY2Fubm90IGJlIGV4dHJhY3RlZCwgcGFzcyBpdCBoZXJlXG4gKlxuICogQGZ1bmN0aW9uIHN1ZmZpeE1ldGhvZFxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9ycy5SZXBvc2l0b3J5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWZmaXhNZXRob2QoXG4gIG9iajogYW55LFxuICBiZWZvcmU6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LFxuICBzdWZmaXg6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LFxuICBiZWZvcmVOYW1lPzogc3RyaW5nXG4pIHtcbiAgYXN5bmMgZnVuY3Rpb24gd3JhcHBlcih0aGlzOiBhbnksIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShiZWZvcmUuY2FsbCh0aGlzLCAuLi5hcmdzKSk7XG4gICAgcmV0dXJuIHN1ZmZpeC5jYWxsKHRoaXMsIC4uLnJlc3VsdHMpO1xuICB9XG4gIGNvbnN0IHdyYXBwZWQgPSB3cmFwcGVyLmJpbmQob2JqKTtcbiAgY29uc3QgbmFtZSA9IGJlZm9yZU5hbWUgPyBiZWZvcmVOYW1lIDogYmVmb3JlLm5hbWU7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3cmFwcGVkLCBcIm5hbWVcIiwge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogbmFtZSxcbiAgfSk7XG4gIG9ialtuYW1lXSA9IHdyYXBwZWQ7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgVXRpbCBtZXRob2QgdG8gd3JhcCBhIG1ldGhvZCBvZiBhbiBvYmplY3Qgd2l0aCBhZGRpdGlvbmFsIGxvZ2ljXG4gKlxuICogQHBhcmFtIHthbnl9IG9iaiBUaGUgQmFzZSBPYmplY3RcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGJlZm9yZSB0aGUgbWV0aG9kIHRvIGJlIHByZWZpeGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXRob2QgdGhlIG1ldGhvZCB0byBiZSB3cmFwcGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhZnRlciBUaGUgbWV0aG9kIHRvIGJlIHN1ZmZpeGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gW21ldGhvZE5hbWVdIFdoZW4gdGhlIGFmdGVyIGZ1bmN0aW9uIGFubWUgY2Fubm90IGJlIGV4dHJhY3RlZCwgcGFzcyBpdCBoZXJlXG4gKlxuICogQGZ1bmN0aW9uIHdyYXBNZXRob2RXaXRoQ29udGV4dFxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gd3JhcE1ldGhvZFdpdGhDb250ZXh0KFxuICBvYmo6IGFueSxcbiAgYmVmb3JlOiAoLi4uYXJnczogYW55W10pID0+IGFueSxcbiAgbWV0aG9kOiAoLi4uYXJnczogYW55W10pID0+IGFueSxcbiAgYWZ0ZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LFxuICBtZXRob2ROYW1lPzogc3RyaW5nXG4pIHtcbiAgY29uc3QgbmFtZSA9IG1ldGhvZE5hbWUgPyBtZXRob2ROYW1lIDogbWV0aG9kLm5hbWU7XG4gIG9ialtuYW1lXSA9IG5ldyBQcm94eShvYmpbbmFtZV0sIHtcbiAgICBhcHBseTogYXN5bmMgKHRhcmdldCwgdGhpc0FyZywgYXJnQXJyYXkpID0+IHtcbiAgICAgIGxldCB0cmFuc2Zvcm1lZEFyZ3MgPSBiZWZvcmUuY2FsbCh0aGlzQXJnLCAuLi5hcmdBcnJheSk7XG4gICAgICBpZiAodHJhbnNmb3JtZWRBcmdzIGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgdHJhbnNmb3JtZWRBcmdzID0gYXdhaXQgdHJhbnNmb3JtZWRBcmdzO1xuICAgICAgY29uc3QgY29udGV4dCA9IHRyYW5zZm9ybWVkQXJnc1t0cmFuc2Zvcm1lZEFyZ3MubGVuZ3RoIC0gMV0gYXMgYW55O1xuICAgICAgaWYgKCEoY29udGV4dCBpbnN0YW5jZW9mIENvbnRleHQpKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc3NpbmcgYSBjb250ZXh0XCIpO1xuICAgICAgbGV0IHJlc3VsdHMgPSBhd2FpdCB0YXJnZXQuY2FsbCh0aGlzQXJnLCAuLi50cmFuc2Zvcm1lZEFyZ3MpO1xuICAgICAgaWYgKHJlc3VsdHMgaW5zdGFuY2VvZiBQcm9taXNlKSByZXN1bHRzID0gYXdhaXQgcmVzdWx0cztcbiAgICAgIHJlc3VsdHMgPSBhZnRlci5jYWxsKHRoaXNBcmcsIHJlc3VsdHMsIGNvbnRleHQpO1xuICAgICAgaWYgKHJlc3VsdHMgaW5zdGFuY2VvZiBQcm9taXNlKSByZXN1bHRzID0gYXdhaXQgcmVzdWx0cztcbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH0sXG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgREJLZXlzIH0gZnJvbSBcIi4uL21vZGVsL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzUmVjdXJzaXZlIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvdXRpbHNcIjtcbmltcG9ydCB7IE1vZGVsLCBNb2RlbEtleXMsIHNmIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L2Vycm9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGaW5kcyB0aGUgcHJpbWFyeSBrZXkgYXR0cmlidXRlIGZvciBhIG1vZGVsXG4gKiBAc3VtbWFyeSBTZWFyY2hlcyBpbiBhbGwgdGhlIHByb3BlcnRpZXMgaW4gdGhlIG9iamVjdCBmb3IgYW4ge0BsaW5rIGlkfSBkZWNvcmF0ZWQgcHJvcGVydHkgYW5kIHJldHVybnMgdGhlIHByb3BlcnR5IGtleSBhbmQgbWV0YWRhdGFcbiAqIEBwYXJhbSB7TW9kZWx9IG1vZGVsIC0gVGhlIG1vZGVsIG9iamVjdCB0byBzZWFyY2ggZm9yIHByaW1hcnkga2V5XG4gKiBAcmV0dXJuIHtPYmplY3R9IEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBpZCBwcm9wZXJ0eSBuYW1lIGFuZCBpdHMgbWV0YWRhdGFcbiAqIEBmdW5jdGlvbiBmaW5kUHJpbWFyeUtleVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgZmluZFByaW1hcnlLZXlcbiAqICAgcGFydGljaXBhbnQgZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzUmVjdXJzaXZlXG4gKlxuICogICBDYWxsZXItPj5maW5kUHJpbWFyeUtleTogbW9kZWxcbiAqICAgZmluZFByaW1hcnlLZXktPj5nZXRBbGxQcm9wZXJ0eURlY29yYXRvcnNSZWN1cnNpdmU6IGdldCBkZWNvcmF0b3JzXG4gKiAgIGdldEFsbFByb3BlcnR5RGVjb3JhdG9yc1JlY3Vyc2l2ZS0tPj5maW5kUHJpbWFyeUtleTogZGVjb3JhdG9yc1xuICogICBmaW5kUHJpbWFyeUtleS0+PmZpbmRQcmltYXJ5S2V5OiBmaWx0ZXIgSUQgZGVjb3JhdG9yc1xuICogICBmaW5kUHJpbWFyeUtleS0+PmZpbmRQcmltYXJ5S2V5OiB2YWxpZGF0ZSBzaW5nbGUgSUQgcHJvcGVydHlcbiAqICAgZmluZFByaW1hcnlLZXktLT4+Q2FsbGVyOiB7aWQsIHByb3BzfVxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUHJpbWFyeUtleTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gIGNvbnN0IGRlY29yYXRvcnMgPSBnZXRBbGxQcm9wZXJ0eURlY29yYXRvcnNSZWN1cnNpdmUoXG4gICAgbW9kZWwsXG4gICAgdW5kZWZpbmVkLFxuICAgIERCS2V5cy5SRUZMRUNUICsgREJLZXlzLklEXG4gICk7XG4gIGNvbnN0IGlkRGVjb3JhdG9ycyA9IE9iamVjdC5lbnRyaWVzKGRlY29yYXRvcnMgYXMgb2JqZWN0KS5yZWR1Y2UoXG4gICAgKGFjY3VtOiB7IFtpbmRleGVyOiBzdHJpbmddOiBhbnlbXSB9LCBbcHJvcCwgZGVjc10pID0+IHtcbiAgICAgIGNvbnN0IGZpbHRlcmVkID0gKGRlY3MgYXMgeyBrZXk6IHN0cmluZyB9W10pLmZpbHRlcihcbiAgICAgICAgKGQpID0+IGQua2V5ICE9PSBNb2RlbEtleXMuVFlQRVxuICAgICAgKTtcbiAgICAgIGlmIChmaWx0ZXJlZCAmJiBmaWx0ZXJlZC5sZW5ndGgpIHtcbiAgICAgICAgYWNjdW1bcHJvcF0gPSBhY2N1bVtwcm9wXSB8fCBbXTtcbiAgICAgICAgYWNjdW1bcHJvcF0ucHVzaCguLi5maWx0ZXJlZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSxcbiAgICB7fVxuICApO1xuXG4gIGlmICghaWREZWNvcmF0b3JzIHx8ICFPYmplY3Qua2V5cyhpZERlY29yYXRvcnMpLmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIkNvdWxkIG5vdCBmaW5kIElEIGRlY29yYXRlZCBQcm9wZXJ0eVwiKTtcbiAgaWYgKE9iamVjdC5rZXlzKGlkRGVjb3JhdG9ycykubGVuZ3RoID4gMSlcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihzZihPYmplY3Qua2V5cyhpZERlY29yYXRvcnMpLmpvaW4oXCIsIFwiKSkpO1xuICBjb25zdCBpZFByb3AgPSBPYmplY3Qua2V5cyhpZERlY29yYXRvcnMpWzBdO1xuICBpZiAoIWlkUHJvcCkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJDb3VsZCBub3QgZmluZCBJRCBkZWNvcmF0ZWQgUHJvcGVydHlcIik7XG4gIHJldHVybiB7XG4gICAgaWQ6IGlkUHJvcCBhcyBrZXlvZiBNLFxuICAgIHByb3BzOiBpZERlY29yYXRvcnNbaWRQcm9wXVswXS5wcm9wcyxcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIHRoZSBwcmltYXJ5IGtleSB2YWx1ZSBmcm9tIGEgbW9kZWxcbiAqIEBzdW1tYXJ5IFNlYXJjaGVzIGZvciB0aGUgSUQtZGVjb3JhdGVkIHByb3BlcnR5IGluIHRoZSBtb2RlbCBhbmQgcmV0dXJucyBpdHMgdmFsdWVcbiAqIEBwYXJhbSB7TW9kZWx9IG1vZGVsIC0gVGhlIG1vZGVsIG9iamVjdCB0byBleHRyYWN0IHRoZSBJRCBmcm9tXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXR1cm5FbXB0eT1mYWxzZV0gLSBXaGV0aGVyIHRvIHJldHVybiB1bmRlZmluZWQgaWYgbm8gSUQgdmFsdWUgaXMgZm91bmRcbiAqIEByZXR1cm4ge3N0cmluZyB8IG51bWJlciB8IGJpZ2ludH0gVGhlIHByaW1hcnkga2V5IHZhbHVlXG4gKiBAZnVuY3Rpb24gZmluZE1vZGVsSWRcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IGZpbmRNb2RlbElkXG4gKiAgIHBhcnRpY2lwYW50IGZpbmRQcmltYXJ5S2V5XG4gKlxuICogICBDYWxsZXItPj5maW5kTW9kZWxJZDogbW9kZWwsIHJldHVybkVtcHR5XG4gKiAgIGZpbmRNb2RlbElkLT4+ZmluZFByaW1hcnlLZXk6IG1vZGVsXG4gKiAgIGZpbmRQcmltYXJ5S2V5LS0+PmZpbmRNb2RlbElkOiB7aWQsIHByb3BzfVxuICogICBmaW5kTW9kZWxJZC0+PmZpbmRNb2RlbElkOiBleHRyYWN0IG1vZGVsW2lkXVxuICogICBmaW5kTW9kZWxJZC0+PmZpbmRNb2RlbElkOiB2YWxpZGF0ZSBJRCBleGlzdHMgaWYgcmVxdWlyZWRcbiAqICAgZmluZE1vZGVsSWQtLT4+Q2FsbGVyOiBJRCB2YWx1ZVxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTW9kZWxJZDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSxcbiAgcmV0dXJuRW1wdHkgPSBmYWxzZVxuKTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50IHtcbiAgY29uc3QgaWRQcm9wID0gZmluZFByaW1hcnlLZXkobW9kZWwpLmlkO1xuICBjb25zdCBtb2RlbElkID0gbW9kZWxbaWRQcm9wXTtcbiAgaWYgKHR5cGVvZiBtb2RlbElkID09PSBcInVuZGVmaW5lZFwiICYmICFyZXR1cm5FbXB0eSlcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBObyB2YWx1ZSBmb3IgdGhlIElkIGlzIGRlZmluZWQgdW5kZXIgdGhlIHByb3BlcnR5ICR7aWRQcm9wIGFzIHN0cmluZ31gXG4gICAgKTtcbiAgcmV0dXJuIG1vZGVsSWQgYXMgc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50O1xufVxuIiwiaW1wb3J0IHsgSVJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9JUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgZW5mb3JjZURCRGVjb3JhdG9ycyB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIi4uL29wZXJhdGlvbnMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyB3cmFwTWV0aG9kV2l0aENvbnRleHQgfSBmcm9tIFwiLi93cmFwcGVyc1wiO1xuaW1wb3J0IHsgZmluZFByaW1hcnlLZXkgfSBmcm9tIFwiLi4vaWRlbnRpdHkvdXRpbHNcIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiLi9Db250ZXh0XCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5RmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBCYXNlIHJlcG9zaXRvcnkgaW1wbGVtZW50YXRpb24gcHJvdmlkaW5nIENSVUQgb3BlcmF0aW9ucyBmb3IgbW9kZWxzLlxuICogQHN1bW1hcnkgVGhlIEJhc2VSZXBvc2l0b3J5IGNsYXNzIHNlcnZlcyBhcyBhIGZvdW5kYXRpb24gZm9yIHJlcG9zaXRvcnkgaW1wbGVtZW50YXRpb25zLCBwcm92aWRpbmdcbiAqIGFic3RyYWN0IGFuZCBjb25jcmV0ZSBtZXRob2RzIGZvciBjcmVhdGluZywgcmVhZGluZywgdXBkYXRpbmcsIGFuZCBkZWxldGluZyBtb2RlbCBpbnN0YW5jZXMuXG4gKiBJdCBoYW5kbGVzIG9wZXJhdGlvbiBsaWZlY3ljbGVzIGluY2x1ZGluZyBwcmVmaXggYW5kIHN1ZmZpeCBvcGVyYXRpb25zLCBhbmQgZW5mb3JjZXMgZGVjb3JhdG9ycy5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGUsIGRlZmF1bHRzIHRvIFJlcG9zaXRvcnlGbGFnc1xuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlLCBkZWZhdWx0cyB0byBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiAtIFRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIG1vZGVsIGNsYXNzXG4gKiBAY2xhc3MgQmFzZVJlcG9zaXRvcnlcbiAqIEBleGFtcGxlXG4gKiBjbGFzcyBVc2VyTW9kZWwgZXh0ZW5kcyBNb2RlbCB7XG4gKiAgIEBpZCgpXG4gKiAgIGlkOiBzdHJpbmc7XG4gKlxuICogICBAcmVxdWlyZWQoKVxuICogICBuYW1lOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogY2xhc3MgVXNlclJlcG9zaXRvcnkgZXh0ZW5kcyBCYXNlUmVwb3NpdG9yeTxVc2VyTW9kZWw+IHtcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgc3VwZXIoVXNlck1vZGVsKTtcbiAqICAgfVxuICpcbiAqICAgYXN5bmMgY3JlYXRlKG1vZGVsOiBVc2VyTW9kZWwpOiBQcm9taXNlPFVzZXJNb2RlbD4ge1xuICogICAgIC8vIEltcGxlbWVudGF0aW9uXG4gKiAgICAgcmV0dXJuIG1vZGVsO1xuICogICB9XG4gKlxuICogICBhc3luYyByZWFkKGtleTogc3RyaW5nKTogUHJvbWlzZTxVc2VyTW9kZWw+IHtcbiAqICAgICAvLyBJbXBsZW1lbnRhdGlvblxuICogICAgIHJldHVybiBuZXcgVXNlck1vZGVsKHsgaWQ6IGtleSwgbmFtZTogJ1VzZXInIH0pO1xuICogICB9XG4gKlxuICogICBhc3luYyB1cGRhdGUobW9kZWw6IFVzZXJNb2RlbCk6IFByb21pc2U8VXNlck1vZGVsPiB7XG4gKiAgICAgLy8gSW1wbGVtZW50YXRpb25cbiAqICAgICByZXR1cm4gbW9kZWw7XG4gKiAgIH1cbiAqXG4gKiAgIGFzeW5jIGRlbGV0ZShrZXk6IHN0cmluZyk6IFByb21pc2U8VXNlck1vZGVsPiB7XG4gKiAgICAgLy8gSW1wbGVtZW50YXRpb25cbiAqICAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHRoaXMucmVhZChrZXkpO1xuICogICAgIHJldHVybiBtb2RlbDtcbiAqICAgfVxuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgUiBhcyBSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IFAgYXMgUHJlZml4IE1ldGhvZHNcbiAqICAgcGFydGljaXBhbnQgRCBhcyBEYXRhYmFzZVxuICogICBwYXJ0aWNpcGFudCBTIGFzIFN1ZmZpeCBNZXRob2RzXG4gKiAgIHBhcnRpY2lwYW50IFYgYXMgVmFsaWRhdG9ycy9EZWNvcmF0b3JzXG4gKlxuICogICBOb3RlIG92ZXIgQyxWOiBDcmVhdGUgT3BlcmF0aW9uXG4gKiAgIEMtPj5SOiBjcmVhdGUobW9kZWwpXG4gKiAgIFItPj5QOiBjcmVhdGVQcmVmaXgobW9kZWwpXG4gKiAgIFAtPj5WOiBlbmZvcmNlREJEZWNvcmF0b3JzKE9OKVxuICogICBQLT4+RDogRGF0YWJhc2Ugb3BlcmF0aW9uXG4gKiAgIEQtPj5TOiBjcmVhdGVTdWZmaXgobW9kZWwpXG4gKiAgIFMtPj5WOiBlbmZvcmNlREJEZWNvcmF0b3JzKEFGVEVSKVxuICogICBTLT4+QzogUmV0dXJuIG1vZGVsXG4gKlxuICogICBOb3RlIG92ZXIgQyxWOiBSZWFkIE9wZXJhdGlvblxuICogICBDLT4+UjogcmVhZChrZXkpXG4gKiAgIFItPj5QOiByZWFkUHJlZml4KGtleSlcbiAqICAgUC0+PlY6IGVuZm9yY2VEQkRlY29yYXRvcnMoT04pXG4gKiAgIFAtPj5EOiBEYXRhYmFzZSBvcGVyYXRpb25cbiAqICAgRC0+PlM6IHJlYWRTdWZmaXgobW9kZWwpXG4gKiAgIFMtPj5WOiBlbmZvcmNlREJEZWNvcmF0b3JzKEFGVEVSKVxuICogICBTLT4+QzogUmV0dXJuIG1vZGVsXG4gKlxuICogICBOb3RlIG92ZXIgQyxWOiBVcGRhdGUgT3BlcmF0aW9uXG4gKiAgIEMtPj5SOiB1cGRhdGUobW9kZWwpXG4gKiAgIFItPj5QOiB1cGRhdGVQcmVmaXgobW9kZWwpXG4gKiAgIFAtPj5WOiBlbmZvcmNlREJEZWNvcmF0b3JzKE9OKVxuICogICBQLT4+RDogRGF0YWJhc2Ugb3BlcmF0aW9uXG4gKiAgIEQtPj5TOiB1cGRhdGVTdWZmaXgobW9kZWwpXG4gKiAgIFMtPj5WOiBlbmZvcmNlREJEZWNvcmF0b3JzKEFGVEVSKVxuICogICBTLT4+QzogUmV0dXJuIG1vZGVsXG4gKlxuICogICBOb3RlIG92ZXIgQyxWOiBEZWxldGUgT3BlcmF0aW9uXG4gKiAgIEMtPj5SOiBkZWxldGUoa2V5KVxuICogICBSLT4+UDogZGVsZXRlUHJlZml4KGtleSlcbiAqICAgUC0+PlY6IGVuZm9yY2VEQkRlY29yYXRvcnMoT04pXG4gKiAgIFAtPj5EOiBEYXRhYmFzZSBvcGVyYXRpb25cbiAqICAgRC0+PlM6IGRlbGV0ZVN1ZmZpeChtb2RlbClcbiAqICAgUy0+PlY6IGVuZm9yY2VEQkRlY29yYXRvcnMoQUZURVIpXG4gKiAgIFMtPj5DOiBSZXR1cm4gbW9kZWxcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VSZXBvc2l0b3J5PFxuICBNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4sXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbj4gaW1wbGVtZW50cyBJUmVwb3NpdG9yeTxNLCBGLCBDPlxue1xuICBwcml2YXRlIHJlYWRvbmx5IF9jbGFzcyE6IENvbnN0cnVjdG9yPE0+O1xuICBwcml2YXRlIF9wayE6IGtleW9mIE07XG4gIHByaXZhdGUgX3BrUHJvcHMhOiBhbnk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBtb2RlbCBjbGFzcyBjb25zdHJ1Y3Rvci5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIG1vZGVsIGNsYXNzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcG9zaXRvcnkuXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiBubyBjbGFzcyBkZWZpbml0aW9uIGlzIGZvdW5kLlxuICAgKiBAcmV0dXJuIHtDb25zdHJ1Y3RvcjxNPn0gVGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgbW9kZWwgY2xhc3NcbiAgICovXG4gIGdldCBjbGFzcygpIHtcbiAgICBpZiAoIXRoaXMuX2NsYXNzKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIGNsYXNzIGRlZmluaXRpb24gZm91bmQgZm9yIHRoaXMgcmVwb3NpdG9yeWApO1xuICAgIHJldHVybiB0aGlzLl9jbGFzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgcHJpbWFyeSBrZXkgcHJvcGVydHkgbmFtZSBvZiB0aGUgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBzZXJ2ZXMgYXMgdGhlIHByaW1hcnkga2V5IGZvciB0aGUgbW9kZWwuXG4gICAqIElmIG5vdCBhbHJlYWR5IGRldGVybWluZWQsIGl0IGZpbmRzIHRoZSBwcmltYXJ5IGtleSB1c2luZyB0aGUgbW9kZWwncyBkZWNvcmF0b3JzLlxuICAgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBwcmltYXJ5IGtleSBwcm9wZXJ0eVxuICAgKi9cbiAgZ2V0IHBrKCk6IGtleW9mIE0ge1xuICAgIGlmICghdGhpcy5fcGspIHtcbiAgICAgIGNvbnN0IHsgaWQsIHByb3BzIH0gPSBmaW5kUHJpbWFyeUtleShuZXcgdGhpcy5jbGFzcygpKTtcbiAgICAgIHRoaXMuX3BrID0gaWQ7XG4gICAgICB0aGlzLl9wa1Byb3BzID0gcHJvcHM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9waztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgcHJpbWFyeSBrZXkgcHJvcGVydGllcy5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBwcm9wZXJ0aWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsLlxuICAgKiBJZiBub3QgYWxyZWFkeSBkZXRlcm1pbmVkLCBpdCB0cmlnZ2VycyB0aGUgcGsgZ2V0dGVyIHRvIGZpbmQgdGhlIHByaW1hcnkga2V5IHByb3BlcnRpZXMuXG4gICAqIEByZXR1cm4ge2FueX0gVGhlIHByb3BlcnRpZXMgb2YgdGhlIHByaW1hcnkga2V5XG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHBrUHJvcHMoKTogYW55IHtcbiAgICBpZiAoIXRoaXMuX3BrUHJvcHMpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIGNvbnN0IHBrID0gdGhpcy5waztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3BrUHJvcHM7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoY2xheno/OiBDb25zdHJ1Y3RvcjxNPikge1xuICAgIGlmIChjbGF6eikgdGhpcy5fY2xhc3MgPSBjbGF6ejtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBbdGhpcy5jcmVhdGUsIHRoaXMucmVhZCwgdGhpcy51cGRhdGUsIHRoaXMuZGVsZXRlXS5mb3JFYWNoKChtKSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gbS5uYW1lO1xuICAgICAgd3JhcE1ldGhvZFdpdGhDb250ZXh0KFxuICAgICAgICBzZWxmLFxuICAgICAgICAoc2VsZiBhcyBhbnkpW25hbWUgKyBcIlByZWZpeFwiXSxcbiAgICAgICAgbSxcbiAgICAgICAgKHNlbGYgYXMgYW55KVtuYW1lICsgXCJTdWZmaXhcIl1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgbW9kZWwgaW5zdGFuY2UgaW4gdGhlIHJlcG9zaXRvcnkuXG4gICAqIEBzdW1tYXJ5IFBlcnNpc3RzIGEgbmV3IG1vZGVsIGluc3RhbmNlIHRvIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RvcmUuXG4gICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgY29uY3JldGUgcmVwb3NpdG9yeSBjbGFzc2VzLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIGNyZWF0ZVxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHRoZSBjcmVhdGUgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjcmVhdGVkIG1vZGVsIGluc3RhbmNlXG4gICAqL1xuICBhYnN0cmFjdCBjcmVhdGUobW9kZWw6IE0sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgbXVsdGlwbGUgbW9kZWwgaW5zdGFuY2VzIGluIHRoZSByZXBvc2l0b3J5LlxuICAgKiBAc3VtbWFyeSBQZXJzaXN0cyBtdWx0aXBsZSBtb2RlbCBpbnN0YW5jZXMgdG8gdGhlIHVuZGVybHlpbmcgZGF0YSBzdG9yZSBieSBjYWxsaW5nXG4gICAqIHRoZSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG1vZGVsIGluIHRoZSBhcnJheS5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBhcnJheSBvZiBtb2RlbCBpbnN0YW5jZXMgdG8gY3JlYXRlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIGNyZWF0ZSBvcGVyYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiBjcmVhdGVkIG1vZGVsIGluc3RhbmNlc1xuICAgKi9cbiAgYXN5bmMgY3JlYXRlQWxsKG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKG1vZGVscy5tYXAoKG0pID0+IHRoaXMuY3JlYXRlKG0sIC4uLmFyZ3MpKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGEgbW9kZWwgZm9yIGNyZWF0aW9uIGFuZCBleGVjdXRlcyBwcmUtY3JlYXRpb24gb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIGEgbW9kZWwgYmVmb3JlIGl0IGlzIGNyZWF0ZWQgaW4gdGhlIGRhdGEgc3RvcmUuIFRoaXMgaW5jbHVkZXNcbiAgICogY3JlYXRpbmcgYSBjb250ZXh0LCBpbnN0YW50aWF0aW5nIGEgbmV3IG1vZGVsIGluc3RhbmNlLCBhbmQgZW5mb3JjaW5nIGFueSBkZWNvcmF0b3JzXG4gICAqIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgYmVmb3JlIGNyZWF0aW9uLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHByZXBhcmUgZm9yIGNyZWF0aW9uXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIGNyZWF0ZSBvcGVyYXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBjb250YWluaW5nIHRoZSBwcmVwYXJlZCBtb2RlbCBhbmQgY29udGV4dCBhcmd1bWVudHNcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVQcmVmaXgobW9kZWw6IE0sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3M8TSwgQywgRj4oXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzXG4gICAgKTtcbiAgICBtb2RlbCA9IG5ldyB0aGlzLmNsYXNzKG1vZGVsKTtcbiAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIHR5cGVvZiB0aGlzLCBhbnksIEYsIEM+KFxuICAgICAgdGhpcyxcbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICBtb2RlbCxcbiAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICk7XG4gICAgcmV0dXJuIFttb2RlbCwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBhIG1vZGVsIGFmdGVyIGNyZWF0aW9uIGFuZCBleGVjdXRlcyBwb3N0LWNyZWF0aW9uIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IEZpbmFsaXplcyBhIG1vZGVsIGFmdGVyIGl0IGhhcyBiZWVuIGNyZWF0ZWQgaW4gdGhlIGRhdGEgc3RvcmUuIFRoaXMgaW5jbHVkZXNcbiAgICogZW5mb3JjaW5nIGFueSBkZWNvcmF0b3JzIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgYWZ0ZXIgY3JlYXRpb24uXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdGhhdCB3YXMgY3JlYXRlZFxuICAgKiBAcGFyYW0ge0N9IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcHJvY2Vzc2VkIG1vZGVsIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlU3VmZml4KG1vZGVsOiBNLCBjb250ZXh0OiBDKSB7XG4gICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9yczxNLCB0eXBlb2YgdGhpcywgYW55LCBGLCBDPihcbiAgICAgIHRoaXMsXG4gICAgICBjb250ZXh0LFxuICAgICAgbW9kZWwsXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIE9wZXJhdGlvbktleXMuQUZURVJcbiAgICApO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgbXVsdGlwbGUgbW9kZWxzIGZvciBjcmVhdGlvbiBhbmQgZXhlY3V0ZXMgcHJlLWNyZWF0aW9uIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBtdWx0aXBsZSBtb2RlbHMgYmVmb3JlIHRoZXkgYXJlIGNyZWF0ZWQgaW4gdGhlIGRhdGEgc3RvcmUuIFRoaXMgaW5jbHVkZXNcbiAgICogY3JlYXRpbmcgYSBjb250ZXh0LCBpbnN0YW50aWF0aW5nIG5ldyBtb2RlbCBpbnN0YW5jZXMsIGFuZCBlbmZvcmNpbmcgYW55IGRlY29yYXRvcnNcbiAgICogdGhhdCBzaG91bGQgYmUgYXBwbGllZCBiZWZvcmUgY3JlYXRpb24gZm9yIGVhY2ggbW9kZWwuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgLSBUaGUgYXJyYXkgb2YgbW9kZWwgaW5zdGFuY2VzIHRvIHByZXBhcmUgZm9yIGNyZWF0aW9uXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIGNyZWF0ZSBvcGVyYXRpb25cbiAgICogQHJldHVybiAgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgcHJlcGFyZWQgbW9kZWxzIGFuZCBjb250ZXh0IGFyZ3VtZW50c1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZUFsbFByZWZpeChtb2RlbHM6IE1bXSwgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJnczxNLCBDLCBGPihcbiAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3NcbiAgICApO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcChhc3luYyAobSkgPT4ge1xuICAgICAgICBtID0gbmV3IHRoaXMuY2xhc3MobSk7XG4gICAgICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnM8TSwgdHlwZW9mIHRoaXMsIGFueSwgRiwgQz4oXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gW21vZGVscywgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBtdWx0aXBsZSBtb2RlbHMgYWZ0ZXIgY3JlYXRpb24gYW5kIGV4ZWN1dGVzIHBvc3QtY3JlYXRpb24gb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgRmluYWxpemVzIG11bHRpcGxlIG1vZGVscyBhZnRlciB0aGV5IGhhdmUgYmVlbiBjcmVhdGVkIGluIHRoZSBkYXRhIHN0b3JlLiBUaGlzIGluY2x1ZGVzXG4gICAqIGVuZm9yY2luZyBhbnkgZGVjb3JhdG9ycyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIGFmdGVyIGNyZWF0aW9uIGZvciBlYWNoIG1vZGVsLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIGFycmF5IG9mIG1vZGVsIGluc3RhbmNlcyB0aGF0IHdlcmUgY3JlYXRlZFxuICAgKiBAcGFyYW0ge0N9IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBhcnJheSBvZiBwcm9jZXNzZWQgbW9kZWwgaW5zdGFuY2VzXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlQWxsU3VmZml4KG1vZGVsczogTVtdLCBjb250ZXh0OiBDKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKChtKSA9PlxuICAgICAgICBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIHR5cGVvZiB0aGlzLCBhbnksIEYsIEM+KFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuQUZURVJcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIG1vZGVscztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgbW9kZWwgaW5zdGFuY2UgZnJvbSB0aGUgcmVwb3NpdG9yeSBieSBpdHMgcHJpbWFyeSBrZXkuXG4gICAqIEBzdW1tYXJ5IEZldGNoZXMgYSBtb2RlbCBpbnN0YW5jZSBmcm9tIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RvcmUgdXNpbmcgaXRzIHByaW1hcnkga2V5LlxuICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGNvbmNyZXRlIHJlcG9zaXRvcnkgY2xhc3Nlcy5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGtleSAtIFRoZSBwcmltYXJ5IGtleSBvZiB0aGUgbW9kZWwgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUgcmVhZCBvcGVyYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJldHJpZXZlZCBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgYWJzdHJhY3QgcmVhZChrZXk6IHN0cmluZyB8IG51bWJlciwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG11bHRpcGxlIG1vZGVsIGluc3RhbmNlcyBmcm9tIHRoZSByZXBvc2l0b3J5IGJ5IHRoZWlyIHByaW1hcnkga2V5cy5cbiAgICogQHN1bW1hcnkgRmV0Y2hlcyBtdWx0aXBsZSBtb2RlbCBpbnN0YW5jZXMgZnJvbSB0aGUgdW5kZXJseWluZyBkYXRhIHN0b3JlIHVzaW5nIHRoZWlyIHByaW1hcnkga2V5c1xuICAgKiBieSBjYWxsaW5nIHRoZSByZWFkIG1ldGhvZCBmb3IgZWFjaCBrZXkgaW4gdGhlIGFycmF5LlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgbnVtYmVyW119IGtleXMgLSBUaGUgYXJyYXkgb2YgcHJpbWFyeSBrZXlzIG9mIHRoZSBtb2RlbHMgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUgcmVhZCBvcGVyYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiByZXRyaWV2ZWQgbW9kZWwgaW5zdGFuY2VzXG4gICAqL1xuICBhc3luYyByZWFkQWxsKGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoa2V5cy5tYXAoKGlkKSA9PiB0aGlzLnJlYWQoaWQsIC4uLmFyZ3MpKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBhIG1vZGVsIGFmdGVyIHJldHJpZXZhbCBhbmQgZXhlY3V0ZXMgcG9zdC1yZWFkIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IEZpbmFsaXplcyBhIG1vZGVsIGFmdGVyIGl0IGhhcyBiZWVuIHJldHJpZXZlZCBmcm9tIHRoZSBkYXRhIHN0b3JlLiBUaGlzIGluY2x1ZGVzXG4gICAqIGVuZm9yY2luZyBhbnkgZGVjb3JhdG9ycyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIGFmdGVyIHJlYWRpbmcuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdGhhdCB3YXMgcmV0cmlldmVkXG4gICAqIEBwYXJhbSB7Q30gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBwcm9jZXNzZWQgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyByZWFkU3VmZml4KG1vZGVsOiBNLCBjb250ZXh0OiBDKSB7XG4gICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9yczxNLCB0eXBlb2YgdGhpcywgYW55LCBGLCBDPihcbiAgICAgIHRoaXMsXG4gICAgICBjb250ZXh0LFxuICAgICAgbW9kZWwsXG4gICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICBPcGVyYXRpb25LZXlzLkFGVEVSXG4gICAgKTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGZvciByZWFkaW5nIGEgbW9kZWwgYW5kIGV4ZWN1dGVzIHByZS1yZWFkIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBhIGtleSBiZWZvcmUgYSBtb2RlbCBpcyByZWFkIGZyb20gdGhlIGRhdGEgc3RvcmUuIFRoaXMgaW5jbHVkZXNcbiAgICogY3JlYXRpbmcgYSBjb250ZXh0LCBpbnN0YW50aWF0aW5nIGEgbmV3IG1vZGVsIGluc3RhbmNlIHdpdGggdGhlIGtleSwgYW5kIGVuZm9yY2luZyBhbnkgZGVjb3JhdG9yc1xuICAgKiB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIGJlZm9yZSByZWFkaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHByaW1hcnkga2V5IG9mIHRoZSBtb2RlbCB0byByZWFkXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIHJlYWQgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgY29udGFpbmluZyB0aGUga2V5IGFuZCBjb250ZXh0IGFyZ3VtZW50c1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHJlYWRQcmVmaXgoa2V5OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3M8TSwgQywgRj4oXG4gICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJnc1xuICAgICk7XG4gICAgY29uc3QgbW9kZWw6IE0gPSBuZXcgdGhpcy5jbGFzcygpO1xuICAgIG1vZGVsW3RoaXMucGtdID0ga2V5IGFzIGFueTtcbiAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIHR5cGVvZiB0aGlzLCBhbnksIEYsIEM+KFxuICAgICAgdGhpcyxcbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICBtb2RlbCxcbiAgICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICApO1xuICAgIHJldHVybiBba2V5LCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgZm9yIHJlYWRpbmcgbXVsdGlwbGUgbW9kZWxzIGFuZCBleGVjdXRlcyBwcmUtcmVhZCBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgbXVsdGlwbGUga2V5cyBiZWZvcmUgbW9kZWxzIGFyZSByZWFkIGZyb20gdGhlIGRhdGEgc3RvcmUuIFRoaXMgaW5jbHVkZXNcbiAgICogY3JlYXRpbmcgYSBjb250ZXh0LCBpbnN0YW50aWF0aW5nIG5ldyBtb2RlbCBpbnN0YW5jZXMgd2l0aCB0aGUga2V5cywgYW5kIGVuZm9yY2luZyBhbnkgZGVjb3JhdG9yc1xuICAgKiB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIGJlZm9yZSByZWFkaW5nIGZvciBlYWNoIGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmdbXSB8IG51bWJlcltdfSBrZXlzIC0gVGhlIGFycmF5IG9mIHByaW1hcnkga2V5cyBvZiB0aGUgbW9kZWxzIHRvIHJlYWRcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUgcmVhZCBvcGVyYXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBjb250YWluaW5nIHRoZSBrZXlzIGFuZCBjb250ZXh0IGFyZ3VtZW50c1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHJlYWRBbGxQcmVmaXgoa2V5czogc3RyaW5nW10gfCBudW1iZXJbXSwgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJnczxNLCBDLCBGPihcbiAgICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzXG4gICAgKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGtleXMubWFwKGFzeW5jIChrKSA9PiB7XG4gICAgICAgIGNvbnN0IG0gPSBuZXcgdGhpcy5jbGFzcygpO1xuICAgICAgICBtW3RoaXMucGtdID0gayBhcyBhbnk7XG4gICAgICAgIHJldHVybiBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIHR5cGVvZiB0aGlzLCBhbnksIEYsIEM+KFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIFtrZXlzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIG11bHRpcGxlIG1vZGVscyBhZnRlciByZXRyaWV2YWwgYW5kIGV4ZWN1dGVzIHBvc3QtcmVhZCBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBGaW5hbGl6ZXMgbXVsdGlwbGUgbW9kZWxzIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIHJldHJpZXZlZCBmcm9tIHRoZSBkYXRhIHN0b3JlLiBUaGlzIGluY2x1ZGVzXG4gICAqIGVuZm9yY2luZyBhbnkgZGVjb3JhdG9ycyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIGFmdGVyIHJlYWRpbmcgZm9yIGVhY2ggbW9kZWwuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgLSBUaGUgYXJyYXkgb2YgbW9kZWwgaW5zdGFuY2VzIHRoYXQgd2VyZSByZXRyaWV2ZWRcbiAgICogQHBhcmFtIHtDfSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgYXJyYXkgb2YgcHJvY2Vzc2VkIG1vZGVsIGluc3RhbmNlc1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHJlYWRBbGxTdWZmaXgobW9kZWxzOiBNW10sIGNvbnRleHQ6IEMpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoKG0pID0+XG4gICAgICAgIGVuZm9yY2VEQkRlY29yYXRvcnM8TSwgdHlwZW9mIHRoaXMsIGFueSwgRiwgQz4oXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuQUZURVJcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIG1vZGVscztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBhbiBleGlzdGluZyBtb2RlbCBpbnN0YW5jZSBpbiB0aGUgcmVwb3NpdG9yeS5cbiAgICogQHN1bW1hcnkgVXBkYXRlcyBhbiBleGlzdGluZyBtb2RlbCBpbnN0YW5jZSBpbiB0aGUgdW5kZXJseWluZyBkYXRhIHN0b3JlLlxuICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGNvbmNyZXRlIHJlcG9zaXRvcnkgY2xhc3Nlcy5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byB1cGRhdGVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUgdXBkYXRlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdXBkYXRlZCBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgYWJzdHJhY3QgdXBkYXRlKG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG11bHRpcGxlIG1vZGVsIGluc3RhbmNlcyBpbiB0aGUgcmVwb3NpdG9yeS5cbiAgICogQHN1bW1hcnkgVXBkYXRlcyBtdWx0aXBsZSBtb2RlbCBpbnN0YW5jZXMgaW4gdGhlIHVuZGVybHlpbmcgZGF0YSBzdG9yZSBieSBjYWxsaW5nXG4gICAqIHRoZSB1cGRhdGUgbWV0aG9kIGZvciBlYWNoIG1vZGVsIGluIHRoZSBhcnJheS5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBhcnJheSBvZiBtb2RlbCBpbnN0YW5jZXMgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIHVwZGF0ZSBvcGVyYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiB1cGRhdGVkIG1vZGVsIGluc3RhbmNlc1xuICAgKi9cbiAgYXN5bmMgdXBkYXRlQWxsKG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnkpOiBQcm9taXNlPE1bXT4ge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChtb2RlbHMubWFwKChtKSA9PiB0aGlzLnVwZGF0ZShtLCAuLi5hcmdzKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgYSBtb2RlbCBhZnRlciB1cGRhdGUgYW5kIGV4ZWN1dGVzIHBvc3QtdXBkYXRlIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IEZpbmFsaXplcyBhIG1vZGVsIGFmdGVyIGl0IGhhcyBiZWVuIHVwZGF0ZWQgaW4gdGhlIGRhdGEgc3RvcmUuIFRoaXMgaW5jbHVkZXNcbiAgICogZW5mb3JjaW5nIGFueSBkZWNvcmF0b3JzIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgYWZ0ZXIgdXBkYXRpbmcuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdGhhdCB3YXMgdXBkYXRlZFxuICAgKiBAcGFyYW0ge0N9IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcHJvY2Vzc2VkIG1vZGVsIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgdXBkYXRlU3VmZml4KG1vZGVsOiBNLCBjb250ZXh0OiBDKSB7XG4gICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9yczxNLCB0eXBlb2YgdGhpcywgYW55LCBGLCBDPihcbiAgICAgIHRoaXMsXG4gICAgICBjb250ZXh0LFxuICAgICAgbW9kZWwsXG4gICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgIE9wZXJhdGlvbktleXMuQUZURVJcbiAgICApO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBtb2RlbCBmb3IgdXBkYXRlIGFuZCBleGVjdXRlcyBwcmUtdXBkYXRlIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBhIG1vZGVsIGJlZm9yZSBpdCBpcyB1cGRhdGVkIGluIHRoZSBkYXRhIHN0b3JlLiBUaGlzIGluY2x1ZGVzXG4gICAqIGNyZWF0aW5nIGEgY29udGV4dCwgdmFsaWRhdGluZyB0aGUgcHJpbWFyeSBrZXksIHJldHJpZXZpbmcgdGhlIGV4aXN0aW5nIG1vZGVsLFxuICAgKiBhbmQgZW5mb3JjaW5nIGFueSBkZWNvcmF0b3JzIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgYmVmb3JlIHVwZGF0aW5nLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHByZXBhcmUgZm9yIHVwZGF0ZVxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHRoZSB1cGRhdGUgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgcHJlcGFyZWQgbW9kZWwgYW5kIGNvbnRleHQgYXJndW1lbnRzXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgdXBkYXRlUHJlZml4KG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzPE0sIEMsIEY+KFxuICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJnc1xuICAgICk7XG4gICAgY29uc3QgaWQgPSBtb2RlbFt0aGlzLnBrXTtcbiAgICBpZiAoIWlkKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBObyB2YWx1ZSBmb3IgdGhlIElkIGlzIGRlZmluZWQgdW5kZXIgdGhlIHByb3BlcnR5ICR7dGhpcy5wayBhcyBzdHJpbmd9YFxuICAgICAgKTtcbiAgICBjb25zdCBvbGRNb2RlbCA9IGF3YWl0IHRoaXMucmVhZChpZCBhcyBzdHJpbmcpO1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnM8TSwgdHlwZW9mIHRoaXMsIGFueSwgRiwgQz4oXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICBPcGVyYXRpb25LZXlzLk9OLFxuICAgICAgb2xkTW9kZWxcbiAgICApO1xuICAgIHJldHVybiBbbW9kZWwsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBtdWx0aXBsZSBtb2RlbHMgZm9yIHVwZGF0ZSBhbmQgZXhlY3V0ZXMgcHJlLXVwZGF0ZSBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgbXVsdGlwbGUgbW9kZWxzIGJlZm9yZSB0aGV5IGFyZSB1cGRhdGVkIGluIHRoZSBkYXRhIHN0b3JlLiBUaGlzIGluY2x1ZGVzXG4gICAqIGNyZWF0aW5nIGEgY29udGV4dCwgaW5zdGFudGlhdGluZyBuZXcgbW9kZWwgaW5zdGFuY2VzLCBhbmQgZW5mb3JjaW5nIGFueSBkZWNvcmF0b3JzXG4gICAqIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgYmVmb3JlIHVwZGF0aW5nIGZvciBlYWNoIG1vZGVsLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIGFycmF5IG9mIG1vZGVsIGluc3RhbmNlcyB0byBwcmVwYXJlIGZvciB1cGRhdGVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUgdXBkYXRlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHByZXBhcmVkIG1vZGVscyBhbmQgY29udGV4dCBhcmd1bWVudHNcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyB1cGRhdGVBbGxQcmVmaXgobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3M8TSwgQywgRj4oXG4gICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzXG4gICAgKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoKG0pID0+IHtcbiAgICAgICAgbSA9IG5ldyB0aGlzLmNsYXNzKG0pO1xuICAgICAgICBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIHR5cGVvZiB0aGlzLCBhbnksIEYsIEM+KFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIFttb2RlbHMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgbXVsdGlwbGUgbW9kZWxzIGFmdGVyIHVwZGF0ZSBhbmQgZXhlY3V0ZXMgcG9zdC11cGRhdGUgb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgRmluYWxpemVzIG11bHRpcGxlIG1vZGVscyBhZnRlciB0aGV5IGhhdmUgYmVlbiB1cGRhdGVkIGluIHRoZSBkYXRhIHN0b3JlLiBUaGlzIGluY2x1ZGVzXG4gICAqIGVuZm9yY2luZyBhbnkgZGVjb3JhdG9ycyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIGFmdGVyIHVwZGF0aW5nIGZvciBlYWNoIG1vZGVsLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIGFycmF5IG9mIG1vZGVsIGluc3RhbmNlcyB0aGF0IHdlcmUgdXBkYXRlZFxuICAgKiBAcGFyYW0ge0N9IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBhcnJheSBvZiBwcm9jZXNzZWQgbW9kZWwgaW5zdGFuY2VzXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgdXBkYXRlQWxsU3VmZml4KG1vZGVsczogTVtdLCBjb250ZXh0OiBDKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKChtKSA9PlxuICAgICAgICBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIHR5cGVvZiB0aGlzLCBhbnksIEYsIEM+KFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuQUZURVJcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIG1vZGVscztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIG1vZGVsIGluc3RhbmNlIGZyb20gdGhlIHJlcG9zaXRvcnkgYnkgaXRzIHByaW1hcnkga2V5LlxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgbW9kZWwgaW5zdGFuY2UgZnJvbSB0aGUgdW5kZXJseWluZyBkYXRhIHN0b3JlIHVzaW5nIGl0cyBwcmltYXJ5IGtleS5cbiAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBjb25jcmV0ZSByZXBvc2l0b3J5IGNsYXNzZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBrZXkgLSBUaGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsIHRvIGRlbGV0ZVxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHRoZSBkZWxldGUgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBkZWxldGVkIG1vZGVsIGluc3RhbmNlXG4gICAqL1xuICBhYnN0cmFjdCBkZWxldGUoa2V5OiBzdHJpbmcgfCBudW1iZXIsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgbXVsdGlwbGUgbW9kZWwgaW5zdGFuY2VzIGZyb20gdGhlIHJlcG9zaXRvcnkgYnkgdGhlaXIgcHJpbWFyeSBrZXlzLlxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIG11bHRpcGxlIG1vZGVsIGluc3RhbmNlcyBmcm9tIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RvcmUgdXNpbmcgdGhlaXIgcHJpbWFyeSBrZXlzXG4gICAqIGJ5IGNhbGxpbmcgdGhlIGRlbGV0ZSBtZXRob2QgZm9yIGVhY2gga2V5IGluIHRoZSBhcnJheS5cbiAgICogQHBhcmFtIHtzdHJpbmdbXSB8IG51bWJlcltdfSBrZXlzIC0gVGhlIGFycmF5IG9mIHByaW1hcnkga2V5cyBvZiB0aGUgbW9kZWxzIHRvIGRlbGV0ZVxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHRoZSBkZWxldGUgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgZGVsZXRlZCBtb2RlbCBpbnN0YW5jZXNcbiAgICovXG4gIGFzeW5jIGRlbGV0ZUFsbChrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKGtleXMubWFwKChrKSA9PiB0aGlzLmRlbGV0ZShrLCAuLi5hcmdzKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgYSBtb2RlbCBhZnRlciBkZWxldGlvbiBhbmQgZXhlY3V0ZXMgcG9zdC1kZWxldGUgb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgRmluYWxpemVzIGEgbW9kZWwgYWZ0ZXIgaXQgaGFzIGJlZW4gZGVsZXRlZCBmcm9tIHRoZSBkYXRhIHN0b3JlLiBUaGlzIGluY2x1ZGVzXG4gICAqIGVuZm9yY2luZyBhbnkgZGVjb3JhdG9ycyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIGFmdGVyIGRlbGV0aW9uLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRoYXQgd2FzIGRlbGV0ZWRcbiAgICogQHBhcmFtIHtDfSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHByb2Nlc3NlZCBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGRlbGV0ZVN1ZmZpeChtb2RlbDogTSwgY29udGV4dDogQykge1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnM8TSwgdHlwZW9mIHRoaXMsIGFueSwgRiwgQz4oXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICBPcGVyYXRpb25LZXlzLkFGVEVSXG4gICAgKTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGZvciBkZWxldGluZyBhIG1vZGVsIGFuZCBleGVjdXRlcyBwcmUtZGVsZXRlIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBhIGtleSBiZWZvcmUgYSBtb2RlbCBpcyBkZWxldGVkIGZyb20gdGhlIGRhdGEgc3RvcmUuIFRoaXMgaW5jbHVkZXNcbiAgICogY3JlYXRpbmcgYSBjb250ZXh0LCByZXRyaWV2aW5nIHRoZSBtb2RlbCB0byBiZSBkZWxldGVkLCBhbmQgZW5mb3JjaW5nIGFueSBkZWNvcmF0b3JzXG4gICAqIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgYmVmb3JlIGRlbGV0aW9uLlxuICAgKiBAcGFyYW0ge2FueX0ga2V5IC0gVGhlIHByaW1hcnkga2V5IG9mIHRoZSBtb2RlbCB0byBkZWxldGVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUgZGVsZXRlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGtleSBhbmQgY29udGV4dCBhcmd1bWVudHNcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBkZWxldGVQcmVmaXgoa2V5OiBhbnksIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3M8TSwgQywgRj4oXG4gICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzXG4gICAgKTtcbiAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHRoaXMucmVhZChrZXksIC4uLmNvbnRleHRBcmdzLmFyZ3MpO1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnM8TSwgdHlwZW9mIHRoaXMsIGFueSwgRiwgQz4oXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgKTtcbiAgICByZXR1cm4gW2tleSwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGZvciBkZWxldGluZyBtdWx0aXBsZSBtb2RlbHMgYW5kIGV4ZWN1dGVzIHByZS1kZWxldGUgb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIG11bHRpcGxlIGtleXMgYmVmb3JlIG1vZGVscyBhcmUgZGVsZXRlZCBmcm9tIHRoZSBkYXRhIHN0b3JlLiBUaGlzIGluY2x1ZGVzXG4gICAqIGNyZWF0aW5nIGEgY29udGV4dCwgcmV0cmlldmluZyB0aGUgbW9kZWxzIHRvIGJlIGRlbGV0ZWQsIGFuZCBlbmZvcmNpbmcgYW55IGRlY29yYXRvcnNcbiAgICogdGhhdCBzaG91bGQgYmUgYXBwbGllZCBiZWZvcmUgZGVsZXRpb24gZm9yIGVhY2ggbW9kZWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nW10gfCBudW1iZXJbXX0ga2V5cyAtIFRoZSBhcnJheSBvZiBwcmltYXJ5IGtleXMgb2YgdGhlIG1vZGVscyB0byBkZWxldGVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUgZGVsZXRlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGtleXMgYW5kIGNvbnRleHQgYXJndW1lbnRzXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgZGVsZXRlQWxsUHJlZml4KGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3M8TSwgQywgRj4oXG4gICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzXG4gICAgKTtcbiAgICBjb25zdCBtb2RlbHMgPSBhd2FpdCB0aGlzLnJlYWRBbGwoa2V5cywgLi4uY29udGV4dEFyZ3MuYXJncyk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKGFzeW5jIChtKSA9PiB7XG4gICAgICAgIHJldHVybiBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIHR5cGVvZiB0aGlzLCBhbnksIEYsIEM+KFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gW2tleXMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgbXVsdGlwbGUgbW9kZWxzIGFmdGVyIGRlbGV0aW9uIGFuZCBleGVjdXRlcyBwb3N0LWRlbGV0ZSBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBGaW5hbGl6ZXMgbXVsdGlwbGUgbW9kZWxzIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIGRlbGV0ZWQgZnJvbSB0aGUgZGF0YSBzdG9yZS4gVGhpcyBpbmNsdWRlc1xuICAgKiBlbmZvcmNpbmcgYW55IGRlY29yYXRvcnMgdGhhdCBzaG91bGQgYmUgYXBwbGllZCBhZnRlciBkZWxldGlvbiBmb3IgZWFjaCBtb2RlbC5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBhcnJheSBvZiBtb2RlbCBpbnN0YW5jZXMgdGhhdCB3ZXJlIGRlbGV0ZWRcbiAgICogQHBhcmFtIHtDfSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgYXJyYXkgb2YgcHJvY2Vzc2VkIG1vZGVsIGluc3RhbmNlc1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGRlbGV0ZUFsbFN1ZmZpeChtb2RlbHM6IE1bXSwgY29udGV4dDogQykge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcCgobSkgPT5cbiAgICAgICAgZW5mb3JjZURCRGVjb3JhdG9yczxNLCB0eXBlb2YgdGhpcywgYW55LCBGLCBDPihcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLkFGVEVSXG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuICAgIHJldHVybiBtb2RlbHM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE1lcmdlcyB0d28gbW9kZWwgaW5zdGFuY2VzIGludG8gYSBuZXcgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgbW9kZWwgaW5zdGFuY2UgYnkgY29tYmluaW5nIHByb3BlcnRpZXMgZnJvbSBhbiBvbGQgbW9kZWwgYW5kIGEgbmV3IG1vZGVsLlxuICAgKiBQcm9wZXJ0aWVzIGZyb20gdGhlIG5ldyBtb2RlbCBvdmVycmlkZSBwcm9wZXJ0aWVzIGZyb20gdGhlIG9sZCBtb2RlbCBpZiB0aGV5IGFyZSBkZWZpbmVkLlxuICAgKiBAcGFyYW0ge019IG9sZE1vZGVsIC0gVGhlIG9yaWdpbmFsIG1vZGVsIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbmV3IG1vZGVsIGluc3RhbmNlIHdpdGggdXBkYXRlZCBwcm9wZXJ0aWVzXG4gICAqIEByZXR1cm4ge019IEEgbmV3IG1vZGVsIGluc3RhbmNlIHdpdGggbWVyZ2VkIHByb3BlcnRpZXNcbiAgICovXG4gIHByb3RlY3RlZCBtZXJnZShvbGRNb2RlbDogTSwgbW9kZWw6IE0pOiBNIHtcbiAgICBjb25zdCBleHRyYWN0ID0gKG1vZGVsOiBNKSA9PlxuICAgICAgT2JqZWN0LmVudHJpZXMobW9kZWwpLnJlZHVjZSgoYWNjdW06IFJlY29yZDxzdHJpbmcsIGFueT4sIFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgIT09IFwidW5kZWZpbmVkXCIpIGFjY3VtW2tleV0gPSB2YWw7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIHt9KTtcblxuICAgIHJldHVybiBuZXcgdGhpcy5jbGFzcyhPYmplY3QuYXNzaWduKHt9LCBleHRyYWN0KG9sZE1vZGVsKSwgZXh0cmFjdChtb2RlbCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVwb3NpdG9yeS5cbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIHN0cmluZyB0aGF0IGlkZW50aWZpZXMgdGhpcyByZXBvc2l0b3J5IGJ5IHRoZSBuYW1lIG9mIGl0cyBtb2RlbCBjbGFzcy5cbiAgICogQHJldHVybiB7c3RyaW5nfSBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVwb3NpdG9yeVxuICAgKi9cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuY2xhc3MubmFtZX0gUmVwb3NpdG9yeWA7XG4gIH1cbn1cbiIsImltcG9ydCB7IGVuZm9yY2VEQkRlY29yYXRvcnMgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCIuLi9vcGVyYXRpb25zL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciwgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBCYXNlUmVwb3NpdG9yeSB9IGZyb20gXCIuL0Jhc2VSZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBEQktleXMgfSBmcm9tIFwiLi4vbW9kZWwvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIi4vQ29udGV4dFwiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeUZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29uY3JldGUgcmVwb3NpdG9yeSBpbXBsZW1lbnRhdGlvbiB3aXRoIHZhbGlkYXRpb24gc3VwcG9ydC5cbiAqIEBzdW1tYXJ5IFRoZSBSZXBvc2l0b3J5IGNsYXNzIGV4dGVuZHMgQmFzZVJlcG9zaXRvcnkgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIHZhbGlkYXRpb25cbiAqIGZ1bmN0aW9uYWxpdHkuIEl0IG92ZXJyaWRlcyBwcmVmaXggbWV0aG9kcyB0byBwZXJmb3JtIG1vZGVsIHZhbGlkYXRpb24gYmVmb3JlIGRhdGFiYXNlXG4gKiBvcGVyYXRpb25zIGFuZCB0aHJvd3MgVmFsaWRhdGlvbkVycm9yIHdoZW4gdmFsaWRhdGlvbiBmYWlscy5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGUsIGRlZmF1bHRzIHRvIFJlcG9zaXRvcnlGbGFnc1xuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlLCBkZWZhdWx0cyB0byBDb250ZXh0PEY+XG4gKiBAY2xhc3MgUmVwb3NpdG9yeVxuICogQGV4YW1wbGVcbiAqIGNsYXNzIFVzZXJNb2RlbCBleHRlbmRzIE1vZGVsIHtcbiAqICAgQGlkKClcbiAqICAgaWQ6IHN0cmluZztcbiAqXG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIEBtaW5MZW5ndGgoMylcbiAqICAgbmFtZTogc3RyaW5nO1xuICogfVxuICpcbiAqIGNsYXNzIFVzZXJSZXBvc2l0b3J5IGV4dGVuZHMgUmVwb3NpdG9yeTxVc2VyTW9kZWw+IHtcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgc3VwZXIoVXNlck1vZGVsKTtcbiAqICAgfVxuICpcbiAqICAgYXN5bmMgY3JlYXRlKG1vZGVsOiBVc2VyTW9kZWwpOiBQcm9taXNlPFVzZXJNb2RlbD4ge1xuICogICAgIC8vIEltcGxlbWVudGF0aW9uIHdpdGggYXV0b21hdGljIHZhbGlkYXRpb25cbiAqICAgICByZXR1cm4gbW9kZWw7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiAvLyBVc2luZyB0aGUgcmVwb3NpdG9yeVxuICogY29uc3QgcmVwbyA9IG5ldyBVc2VyUmVwb3NpdG9yeSgpO1xuICogdHJ5IHtcbiAqICAgY29uc3QgdXNlciA9IGF3YWl0IHJlcG8uY3JlYXRlKHsgbmFtZTogJ0pvJyB9KTsgLy8gV2lsbCB0aHJvdyBWYWxpZGF0aW9uRXJyb3JcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpOyAvLyBWYWxpZGF0aW9uRXJyb3I6IG5hbWUgbXVzdCBiZSBhdCBsZWFzdCAzIGNoYXJhY3RlcnNcbiAqIH1cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJlcG9zaXRvcnk8XG4gIE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPixcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBDb250ZXh0PEY+LFxuPiBleHRlbmRzIEJhc2VSZXBvc2l0b3J5PE0sIEYsIEM+IHtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGNsYXp6PzogQ29uc3RydWN0b3I8TT4pIHtcbiAgICBzdXBlcihjbGF6eik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGEgbW9kZWwgZm9yIGNyZWF0aW9uIHdpdGggdmFsaWRhdGlvbi5cbiAgICogQHN1bW1hcnkgT3ZlcnJpZGVzIHRoZSBiYXNlIGNyZWF0ZVByZWZpeCBtZXRob2QgdG8gYWRkIHZhbGlkYXRpb24gY2hlY2tzLlxuICAgKiBDcmVhdGVzIGEgY29udGV4dCwgaW5zdGFudGlhdGVzIGEgbmV3IG1vZGVsLCBlbmZvcmNlcyBkZWNvcmF0b3JzLCBhbmQgdmFsaWRhdGVzXG4gICAqIHRoZSBtb2RlbCBiZWZvcmUgYWxsb3dpbmcgY3JlYXRpb24gdG8gcHJvY2VlZC5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBwcmVwYXJlIGZvciBjcmVhdGlvblxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHRoZSBjcmVhdGUgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgdmFsaWRhdGVkIG1vZGVsIGFuZCBjb250ZXh0IGFyZ3VtZW50c1xuICAgKiBAdGhyb3dzIHtWYWxpZGF0aW9uRXJyb3J9IElmIHRoZSBtb2RlbCBmYWlscyB2YWxpZGF0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlUHJlZml4KFxuICAgIG1vZGVsOiBNLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8W00sIC4uLmFueVtdXT4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJnc1xuICAgICk7XG4gICAgbW9kZWwgPSBuZXcgdGhpcy5jbGFzcyhtb2RlbCk7XG4gICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgIHRoaXMsXG4gICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgbW9kZWwsXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICApO1xuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKG1vZGVsLmhhc0Vycm9ycygpKTtcbiAgICBpZiAoZXJyb3JzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycm9ycy50b1N0cmluZygpKTtcblxuICAgIHJldHVybiBbbW9kZWwsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBtdWx0aXBsZSBtb2RlbHMgZm9yIGNyZWF0aW9uIHdpdGggdmFsaWRhdGlvbi5cbiAgICogQHN1bW1hcnkgT3ZlcnJpZGVzIHRoZSBiYXNlIGNyZWF0ZUFsbFByZWZpeCBtZXRob2QgdG8gYWRkIHZhbGlkYXRpb24gY2hlY2tzIGZvciBtdWx0aXBsZSBtb2RlbHMuXG4gICAqIENyZWF0ZXMgYSBjb250ZXh0LCBpbnN0YW50aWF0ZXMgbmV3IG1vZGVscywgZW5mb3JjZXMgZGVjb3JhdG9ycywgYW5kIHZhbGlkYXRlc1xuICAgKiBlYWNoIG1vZGVsIGJlZm9yZSBhbGxvd2luZyBjcmVhdGlvbiB0byBwcm9jZWVkLiBDb2xsZWN0cyB2YWxpZGF0aW9uIGVycm9ycyBmcm9tIGFsbCBtb2RlbHMuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgLSBUaGUgYXJyYXkgb2YgbW9kZWwgaW5zdGFuY2VzIHRvIHByZXBhcmUgZm9yIGNyZWF0aW9uXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIGNyZWF0ZSBvcGVyYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnlbXT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHZhbGlkYXRlZCBtb2RlbHMgYW5kIGNvbnRleHQgYXJndW1lbnRzXG4gICAqIEB0aHJvd3Mge1ZhbGlkYXRpb25FcnJvcn0gSWYgYW55IG1vZGVsIGZhaWxzIHZhbGlkYXRpb24sIHdpdGggZGV0YWlscyBhYm91dCB3aGljaCBtb2RlbHMgZmFpbGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlQWxsUHJlZml4KFxuICAgIG1vZGVsczogTVtdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8YW55W10+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3NcbiAgICApO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcChhc3luYyAobSkgPT4ge1xuICAgICAgICBtID0gbmV3IHRoaXMuY2xhc3MobSk7XG4gICAgICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IG1vZGVsc1ZhbGlkYXRpb24gPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoKG0pID0+IFByb21pc2UucmVzb2x2ZShtLmhhc0Vycm9ycygpKSlcbiAgICApO1xuXG4gICAgY29uc3QgZXJyb3JzID0gbW9kZWxzVmFsaWRhdGlvbi5yZWR1Y2UoXG4gICAgICAoYWNjdW06IHN0cmluZyB8IHVuZGVmaW5lZCwgZSwgaSkgPT4ge1xuICAgICAgICBpZiAoZSlcbiAgICAgICAgICBhY2N1bSA9XG4gICAgICAgICAgICB0eXBlb2YgYWNjdW0gPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgPyBhY2N1bSArIGBcXG4gLSAke2l9OiAke2UudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICAgIDogYCAtICR7aX06ICR7ZS50b1N0cmluZygpfWA7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sXG4gICAgICB1bmRlZmluZWRcbiAgICApO1xuXG4gICAgaWYgKGVycm9ycykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvcnMpO1xuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBtb2RlbCBmb3IgdXBkYXRlIHdpdGggdmFsaWRhdGlvbi5cbiAgICogQHN1bW1hcnkgT3ZlcnJpZGVzIHRoZSBiYXNlIHVwZGF0ZVByZWZpeCBtZXRob2QgdG8gYWRkIHZhbGlkYXRpb24gY2hlY2tzLlxuICAgKiBDcmVhdGVzIGEgY29udGV4dCwgdmFsaWRhdGVzIHRoZSBwcmltYXJ5IGtleSwgcmV0cmlldmVzIHRoZSBleGlzdGluZyBtb2RlbCxcbiAgICogbWVyZ2VzIHRoZSBvbGQgYW5kIG5ldyBtb2RlbHMsIGVuZm9yY2VzIGRlY29yYXRvcnMsIGFuZCB2YWxpZGF0ZXMgdGhlIG1vZGVsXG4gICAqIGJlZm9yZSBhbGxvd2luZyB0aGUgdXBkYXRlIHRvIHByb2NlZWQuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gcHJlcGFyZSBmb3IgdXBkYXRlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIHVwZGF0ZSBvcGVyYXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBjb250YWluaW5nIHRoZSB2YWxpZGF0ZWQgbW9kZWwgYW5kIGNvbnRleHQgYXJndW1lbnRzXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZSBtb2RlbCBkb2Vzbid0IGhhdmUgYSBwcmltYXJ5IGtleSB2YWx1ZVxuICAgKiBAdGhyb3dzIHtWYWxpZGF0aW9uRXJyb3J9IElmIHRoZSBtb2RlbCBmYWlscyB2YWxpZGF0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlUHJlZml4KFxuICAgIG1vZGVsOiBNLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8W00sIC4uLmFyZ3M6IGFueVtdXT4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJnc1xuICAgICk7XG4gICAgY29uc3QgcGsgPSAobW9kZWwgYXMgYW55KVt0aGlzLnBrXTtcbiAgICBpZiAoIXBrKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBObyB2YWx1ZSBmb3IgdGhlIElkIGlzIGRlZmluZWQgdW5kZXIgdGhlIHByb3BlcnR5ICR7dGhpcy5wayBhcyBzdHJpbmd9YFxuICAgICAgKTtcblxuICAgIGNvbnN0IG9sZE1vZGVsOiBNID0gYXdhaXQgdGhpcy5yZWFkKHBrKTtcblxuICAgIG1vZGVsID0gdGhpcy5tZXJnZShvbGRNb2RlbCwgbW9kZWwpO1xuXG4gICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgIHRoaXMsXG4gICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgbW9kZWwsXG4gICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgIE9wZXJhdGlvbktleXMuT04sXG4gICAgICBvbGRNb2RlbFxuICAgICk7XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUobW9kZWwuaGFzRXJyb3JzKG9sZE1vZGVsIGFzIGFueSkpO1xuICAgIGlmIChlcnJvcnMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JzLnRvU3RyaW5nKCkpO1xuICAgIHJldHVybiBbbW9kZWwsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBtdWx0aXBsZSBtb2RlbHMgZm9yIHVwZGF0ZSB3aXRoIHZhbGlkYXRpb24uXG4gICAqIEBzdW1tYXJ5IE92ZXJyaWRlcyB0aGUgYmFzZSB1cGRhdGVBbGxQcmVmaXggbWV0aG9kIHRvIGFkZCB2YWxpZGF0aW9uIGNoZWNrcyBmb3IgbXVsdGlwbGUgbW9kZWxzLlxuICAgKiBDcmVhdGVzIGEgY29udGV4dCwgdmFsaWRhdGVzIHByaW1hcnkga2V5cywgcmV0cmlldmVzIGV4aXN0aW5nIG1vZGVscywgbWVyZ2VzIG9sZCBhbmQgbmV3IG1vZGVscyxcbiAgICogZW5mb3JjZXMgZGVjb3JhdG9ycywgYW5kIHZhbGlkYXRlcyBlYWNoIG1vZGVsIGJlZm9yZSBhbGxvd2luZyB1cGRhdGVzIHRvIHByb2NlZWQuXG4gICAqIENvbGxlY3RzIHZhbGlkYXRpb24gZXJyb3JzIGZyb20gYWxsIG1vZGVscy5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBhcnJheSBvZiBtb2RlbCBpbnN0YW5jZXMgdG8gcHJlcGFyZSBmb3IgdXBkYXRlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIHVwZGF0ZSBvcGVyYXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBjb250YWluaW5nIHRoZSB2YWxpZGF0ZWQgbW9kZWxzIGFuZCBjb250ZXh0IGFyZ3VtZW50c1xuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiBhbnkgbW9kZWwgZG9lc24ndCBoYXZlIGEgcHJpbWFyeSBrZXkgdmFsdWVcbiAgICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBJZiBhbnkgbW9kZWwgZmFpbHMgdmFsaWRhdGlvbiwgd2l0aCBkZXRhaWxzIGFib3V0IHdoaWNoIG1vZGVscyBmYWlsZWRcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyB1cGRhdGVBbGxQcmVmaXgobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzXG4gICAgKTtcbiAgICBjb25zdCBpZHMgPSBtb2RlbHMubWFwKChtKSA9PiB7XG4gICAgICBjb25zdCBpZCA9IG1bdGhpcy5wa107XG4gICAgICBpZiAodHlwZW9mIGlkID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgTm8gdmFsdWUgZm9yIHRoZSBJZCBpcyBkZWZpbmVkIHVuZGVyIHRoZSBwcm9wZXJ0eSAke3RoaXMucGsgYXMgc3RyaW5nfWBcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiBpZCBhcyBzdHJpbmc7XG4gICAgfSk7XG4gICAgY29uc3Qgb2xkTW9kZWxzOiBNW10gPSBhd2FpdCB0aGlzLnJlYWRBbGwoaWRzLCAuLi5jb250ZXh0QXJncy5hcmdzKTtcbiAgICBtb2RlbHMgPSBtb2RlbHMubWFwKChtLCBpKSA9PiB0aGlzLm1lcmdlKG9sZE1vZGVsc1tpXSwgbSkpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcCgobSwgaSkgPT5cbiAgICAgICAgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OLFxuICAgICAgICAgIG9sZE1vZGVsc1tpXVxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcblxuICAgIGNvbnN0IG1vZGVsc1ZhbGlkYXRpb24gPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoKG0sIGkpID0+IFByb21pc2UucmVzb2x2ZShtLmhhc0Vycm9ycyhvbGRNb2RlbHNbaV0gYXMgYW55KSkpXG4gICAgKTtcblxuICAgIGNvbnN0IGVycm9ycyA9IG1vZGVsc1ZhbGlkYXRpb24ucmVkdWNlKFxuICAgICAgKGFjY3VtOiBzdHJpbmcgfCB1bmRlZmluZWQsIGUsIGkpID0+IHtcbiAgICAgICAgaWYgKGUpXG4gICAgICAgICAgYWNjdW0gPVxuICAgICAgICAgICAgdHlwZW9mIGFjY3VtID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgID8gYWNjdW0gKyBgXFxuIC0gJHtpfTogJHtlLnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgICA6IGAgLSAke2l9OiAke2UudG9TdHJpbmcoKX1gO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LFxuICAgICAgdW5kZWZpbmVkXG4gICAgKTtcblxuICAgIGlmIChlcnJvcnMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JzKTtcbiAgICByZXR1cm4gW21vZGVscywgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSByZWZsZWN0aW9uIGtleSBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIGEga2V5IGZvciBzdG9yaW5nIG1ldGFkYXRhIGluIHRoZSByZWZsZWN0aW9uIHN5c3RlbSBieSBwcmVmaXhpbmdcbiAgICogdGhlIHByb3ZpZGVkIGtleSB3aXRoIHRoZSBkYXRhYmFzZSByZWZsZWN0aW9uIHByZWZpeC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBiYXNlIGtleSB0byBwcmVmaXhcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgcHJlZml4ZWQgcmVmbGVjdGlvbiBrZXlcbiAgICovXG4gIHN0YXRpYyBrZXkoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gREJLZXlzLlJFRkxFQ1QgKyBrZXk7XG4gIH1cbn1cbiIsImltcG9ydCBcIi4vdmFsaWRhdGlvblwiO1xuaW1wb3J0IHtcbiAgZGF0ZSxcbiAgRGVjb3JhdGlvbixcbiAgTW9kZWwsXG4gIHByb3BNZXRhZGF0YSxcbiAgcmVxdWlyZWQsXG4gIHR5cGUsXG4gIFZhbGlkYXRpb24sXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IERCS2V5cywgREVGQVVMVF9USU1FU1RBTVBfRk9STUFUIH0gZnJvbSBcIi4uL21vZGVsL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgREJPcGVyYXRpb25zLCBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIi4uL29wZXJhdGlvbnMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBhZnRlciwgb24sIG9uQ3JlYXRlVXBkYXRlIH0gZnJvbSBcIi4uL29wZXJhdGlvbnMvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgSVJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9JUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgU2VyaWFsaXphdGlvbkVycm9yIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvZXJyb3JzXCI7XG5pbXBvcnQgeyBhcHBseSwgbWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L0NvbnRleHRcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnlGbGFncyB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByZXZlbnRzIGEgcHJvcGVydHkgZnJvbSBiZWluZyBtb2RpZmllZCBhZnRlciBpbml0aWFsIGNyZWF0aW9uLlxuICogQHN1bW1hcnkgTWFya3MgdGhlIHByb3BlcnR5IGFzIHJlYWRvbmx5LCBjYXVzaW5nIHZhbGlkYXRpb24gZXJyb3JzIGlmIGF0dGVtcHRzIGFyZSBtYWRlIHRvIG1vZGlmeSBpdCBkdXJpbmcgdXBkYXRlcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBUaGUgZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gdmFsaWRhdGlvbiBmYWlscy4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMuUkVBRE9OTFkuSU5WQUxJRH1cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiByZWFkb25seVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRvbmx5KFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlJFQURPTkxZLklOVkFMSURcbikge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLnVwZGF0ZUtleShEQktleXMuUkVBRE9OTFkpO1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoXG4gICAgICBwcm9wTWV0YWRhdGEoa2V5LCB7XG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICB9KVxuICAgIClcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlciBmdW5jdGlvbiB0aGF0IHNldHMgYSB0aW1lc3RhbXAgcHJvcGVydHkgdG8gdGhlIGN1cnJlbnQgdGltZXN0YW1wLlxuICogQHN1bW1hcnkgVXBkYXRlcyBhIG1vZGVsIHByb3BlcnR5IHdpdGggdGhlIGN1cnJlbnQgdGltZXN0YW1wIGZyb20gdGhlIHJlcG9zaXRvcnkgY29udGV4dC5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIElSZXBvc2l0b3J5XG4gKiBAdGVtcGxhdGUgViAtIFRoZSBkYXRhIHR5cGUgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlXG4gKiBAcGFyYW0ge0N9IGNvbnRleHQgLSBUaGUgcmVwb3NpdG9yeSBjb250ZXh0IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgZGF0YSBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIHVwZGF0ZVxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBiZWluZyB1cGRhdGVkXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB0aW1lc3RhbXAgaGFzIGJlZW4gc2V0XG4gKiBAZnVuY3Rpb24gdGltZXN0YW1wSGFuZGxlclxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGltZXN0YW1wSGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgSVJlcG9zaXRvcnk8TSwgRiwgQz4sXG4gIFYsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbj4odGhpczogUiwgY29udGV4dDogQywgZGF0YTogViwga2V5OiBrZXlvZiBNLCBtb2RlbDogTSk6IFByb21pc2U8dm9pZD4ge1xuICAobW9kZWwgYXMgYW55KVtrZXldID0gY29udGV4dC50aW1lc3RhbXA7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEF1dG9tYXRpY2FsbHkgbWFuYWdlcyB0aW1lc3RhbXAgcHJvcGVydGllcyBmb3IgdHJhY2tpbmcgY3JlYXRpb24gYW5kIHVwZGF0ZSB0aW1lcy5cbiAqIEBzdW1tYXJ5IE1hcmtzIHRoZSBwcm9wZXJ0eSBhcyBhIHRpbWVzdGFtcCwgbWFraW5nIGl0IHJlcXVpcmVkIGFuZCBlbnN1cmluZyBpdCdzIGEgdmFsaWQgZGF0ZS4gVGhlIHByb3BlcnR5IHdpbGwgYmUgYXV0b21hdGljYWxseSB1cGRhdGVkIHdpdGggdGhlIGN1cnJlbnQgdGltZXN0YW1wIGR1cmluZyBzcGVjaWZpZWQgb3BlcmF0aW9ucy5cbiAqXG4gKiBEYXRlIEZvcm1hdDpcbiAqXG4gKiA8cHJlPlxuICogICAgICBVc2luZyBzaW1pbGFyIGZvcm1hdHRpbmcgYXMgTW9tZW50LmpzLCBDbGFzcyBEYXRlVGltZUZvcm1hdHRlciAoSmF2YSksIGFuZCBDbGFzcyBTaW1wbGVEYXRlRm9ybWF0IChKYXZhKSxcbiAqICAgICAgSSBpbXBsZW1lbnRlZCBhIGNvbXByZWhlbnNpdmUgc29sdXRpb24gZm9ybWF0RGF0ZShkYXRlLCBwYXR0ZXJuU3RyKSB3aGVyZSB0aGUgY29kZSBpcyBlYXN5IHRvIHJlYWQgYW5kIG1vZGlmeS5cbiAqICAgICAgWW91IGNhbiBkaXNwbGF5IGRhdGUsIHRpbWUsIEFNL1BNLCBldGMuXG4gKlxuICogICAgICBEYXRlIGFuZCBUaW1lIFBhdHRlcm5zXG4gKiAgICAgIHl5ID0gMi1kaWdpdCB5ZWFyOyB5eXl5ID0gZnVsbCB5ZWFyXG4gKiAgICAgIE0gPSBkaWdpdCBtb250aDsgTU0gPSAyLWRpZ2l0IG1vbnRoOyBNTU0gPSBzaG9ydCBtb250aCBuYW1lOyBNTU1NID0gZnVsbCBtb250aCBuYW1lXG4gKiAgICAgIEVFRUUgPSBmdWxsIHdlZWtkYXkgbmFtZTsgRUVFID0gc2hvcnQgd2Vla2RheSBuYW1lXG4gKiAgICAgIGQgPSBkaWdpdCBkYXk7IGRkID0gMi1kaWdpdCBkYXlcbiAqICAgICAgaCA9IGhvdXJzIGFtL3BtOyBoaCA9IDItZGlnaXQgaG91cnMgYW0vcG07IEggPSBob3VyczsgSEggPSAyLWRpZ2l0IGhvdXJzXG4gKiAgICAgIG0gPSBtaW51dGVzOyBtbSA9IDItZGlnaXQgbWludXRlczsgYWFhID0gQU0vUE1cbiAqICAgICAgcyA9IHNlY29uZHM7IHNzID0gMi1kaWdpdCBzZWNvbmRzXG4gKiAgICAgIFMgPSBtaWxpc2Vjb25kc1xuICogPC9wcmU+XG4gKlxuICogQHBhcmFtIHtPcGVyYXRpb25LZXlzW119IG9wZXJhdGlvbiAtIFRoZSBvcGVyYXRpb25zIHRvIGFjdCBvbi4gRGVmYXVsdHMgdG8ge0BsaW5rIERCT3BlcmF0aW9ucy5DUkVBVEVfVVBEQVRFfVxuICogQHBhcmFtIHtzdHJpbmd9IFtmb3JtYXRdIC0gVGhlIHRpbWVzdGFtcCBmb3JtYXQuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX1RJTUVTVEFNUF9GT1JNQVR9XG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gdGltZXN0YW1wXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICogICBwYXJ0aWNpcGFudCBNIGFzIE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IFQgYXMgVGltZXN0YW1wRGVjb3JhdG9yXG4gKiAgIHBhcnRpY2lwYW50IFYgYXMgVmFsaWRhdG9yXG4gKlxuICogICBDLT4+TTogQ3JlYXRlL1VwZGF0ZSBtb2RlbFxuICogICBNLT4+VDogUHJvY2VzcyB0aW1lc3RhbXAgcHJvcGVydHlcbiAqICAgVC0+Pk06IEFwcGx5IHJlcXVpcmVkIHZhbGlkYXRpb25cbiAqICAgVC0+Pk06IEFwcGx5IGRhdGUgZm9ybWF0IHZhbGlkYXRpb25cbiAqXG4gKiAgIGFsdCBVcGRhdGUgb3BlcmF0aW9uXG4gKiAgICAgVC0+PlY6IFJlZ2lzdGVyIHRpbWVzdGFtcCB2YWxpZGF0b3JcbiAqICAgICBWLT4+TTogVmFsaWRhdGUgdGltZXN0YW1wIGlzIG5ld2VyXG4gKiAgIGVuZFxuICpcbiAqICAgVC0+Pk06IFNldCBjdXJyZW50IHRpbWVzdGFtcFxuICogICBNLT4+QzogUmV0dXJuIHVwZGF0ZWQgbW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpbWVzdGFtcChcbiAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzW10gPSBEQk9wZXJhdGlvbnMuQ1JFQVRFX1VQREFURSBhcyB1bmtub3duIGFzIE9wZXJhdGlvbktleXNbXSxcbiAgZm9ybWF0OiBzdHJpbmcgPSBERUZBVUxUX1RJTUVTVEFNUF9GT1JNQVRcbikge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLnVwZGF0ZUtleShEQktleXMuVElNRVNUQU1QKTtcblxuICBmdW5jdGlvbiB0cyhvcGVyYXRpb246IE9wZXJhdGlvbktleXNbXSwgZm9ybWF0OiBzdHJpbmcpIHtcbiAgICBjb25zdCBkZWNvcmF0b3JzOiBhbnlbXSA9IFtcbiAgICAgIGRhdGUoZm9ybWF0LCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRJTUVTVEFNUC5EQVRFKSxcbiAgICAgIHJlcXVpcmVkKERFRkFVTFRfRVJST1JfTUVTU0FHRVMuVElNRVNUQU1QLlJFUVVJUkVEKSxcbiAgICAgIHByb3BNZXRhZGF0YShWYWxpZGF0aW9uLmtleShEQktleXMuVElNRVNUQU1QKSwge1xuICAgICAgICBvcGVyYXRpb246IG9wZXJhdGlvbixcbiAgICAgICAgZm9ybWF0OiBmb3JtYXQsXG4gICAgICB9KSxcbiAgICAgIG9uKG9wZXJhdGlvbiwgdGltZXN0YW1wSGFuZGxlciksXG4gICAgXTtcbiAgICBpZiAob3BlcmF0aW9uLmluZGV4T2YoT3BlcmF0aW9uS2V5cy5VUERBVEUpICE9PSAtMSlcbiAgICAgIGRlY29yYXRvcnMucHVzaChcbiAgICAgICAgcHJvcE1ldGFkYXRhKGtleSwge1xuICAgICAgICAgIG1lc3NhZ2U6IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuVElNRVNUQU1QLklOVkFMSUQsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIGVsc2UgZGVjb3JhdG9ycy5wdXNoKHJlYWRvbmx5KCkpO1xuICAgIHJldHVybiBhcHBseSguLi5kZWNvcmF0b3JzKTtcbiAgfVxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiB0cyxcbiAgICAgIGFyZ3M6IFtvcGVyYXRpb24sIGZvcm1hdF0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlciBmdW5jdGlvbiB0aGF0IHNlcmlhbGl6ZXMgYSBwcm9wZXJ0eSB0byBKU09OIHN0cmluZyBkdXJpbmcgY3JlYXRlIGFuZCB1cGRhdGUgb3BlcmF0aW9ucy5cbiAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgY29tcGxleCBvYmplY3QgcHJvcGVydHkgdG8gYSBKU09OIHN0cmluZyBiZWZvcmUgc3RvcmluZyBpdCBpbiB0aGUgZGF0YWJhc2UuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBJUmVwb3NpdG9yeVxuICogQHRlbXBsYXRlIFYgLSBUaGUgZGF0YSB0eXBlIGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZVxuICogQHBhcmFtIHtDfSBjb250ZXh0IC0gVGhlIHJlcG9zaXRvcnkgY29udGV4dFxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIGRhdGEgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byBzZXJpYWxpemVcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBwcm9wZXJ0eSBoYXMgYmVlbiBzZXJpYWxpemVkXG4gKiBAZnVuY3Rpb24gc2VyaWFsaXplT25DcmVhdGVVcGRhdGVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlcmlhbGl6ZU9uQ3JlYXRlVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBJUmVwb3NpdG9yeTxNLCBGLCBDPixcbiAgVixcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBDb250ZXh0PEY+LFxuPih0aGlzOiBSLCBjb250ZXh0OiBDLCBkYXRhOiBWLCBrZXk6IGtleW9mIE0sIG1vZGVsOiBNKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghbW9kZWxba2V5XSkgcmV0dXJuO1xuICB0cnkge1xuICAgIG1vZGVsW2tleV0gPSBKU09OLnN0cmluZ2lmeShtb2RlbFtrZXldKSBhcyBNW2tleW9mIE1dO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIHNlcmlhbGl6ZSAke2tleS50b1N0cmluZygpfSBwcm9wZXJ0eSBvZiBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9OiBlYFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlciBmdW5jdGlvbiB0aGF0IGRlc2VyaWFsaXplcyBhIHByb3BlcnR5IGZyb20gSlNPTiBzdHJpbmcgYWZ0ZXIgZGF0YWJhc2Ugb3BlcmF0aW9ucy5cbiAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgSlNPTiBzdHJpbmcgcHJvcGVydHkgYmFjayB0byBpdHMgb3JpZ2luYWwgY29tcGxleCBvYmplY3QgZm9ybSBhZnRlciByZXRyaWV2aW5nIGl0IGZyb20gdGhlIGRhdGFiYXNlLlxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgSVJlcG9zaXRvcnlcbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIGRhdGEgdHlwZSBmb3IgdGhlIG9wZXJhdGlvblxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGVcbiAqIEBwYXJhbSB7Q30gY29udGV4dCAtIFRoZSByZXBvc2l0b3J5IGNvbnRleHRcbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSBkYXRhIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gZGVzZXJpYWxpemVcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBwcm9wZXJ0eSBoYXMgYmVlbiBkZXNlcmlhbGl6ZWRcbiAqIEBmdW5jdGlvbiBzZXJpYWxpemVBZnRlckFsbFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VyaWFsaXplQWZ0ZXJBbGw8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIElSZXBvc2l0b3J5PE0sIEYsIEM+LFxuICBWLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzID0gUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4+KHRoaXM6IFIsIGNvbnRleHQ6IEMsIGRhdGE6IFYsIGtleToga2V5b2YgTSwgbW9kZWw6IE0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFtb2RlbFtrZXldKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbW9kZWxba2V5XSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuO1xuXG4gIHRyeSB7XG4gICAgbW9kZWxba2V5XSA9IEpTT04ucGFyc2UobW9kZWxba2V5XSk7XG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgYEZhaWxlZCB0byBkZXNlcmlhbGl6ZSAke2tleS50b1N0cmluZygpfSBwcm9wZXJ0eSBvZiBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9OiAke2V9YFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRW5hYmxlcyBhdXRvbWF0aWMgSlNPTiBzZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb24gZm9yIGNvbXBsZXggb2JqZWN0IHByb3BlcnRpZXMuXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBhdXRvbWF0aWNhbGx5IGNvbnZlcnRzIGNvbXBsZXggb2JqZWN0cyB0byBKU09OIHN0cmluZ3MgYmVmb3JlIHN0b3JpbmcgaW4gdGhlIGRhdGFiYXNlIGFuZCBiYWNrIHRvIG9iamVjdHMgd2hlbiByZXRyaWV2aW5nIHRoZW0uXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gc2VyaWFsaXplXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICogICBwYXJ0aWNpcGFudCBNIGFzIE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IFMgYXMgU2VyaWFsaXplRGVjb3JhdG9yXG4gKiAgIHBhcnRpY2lwYW50IERCIGFzIERhdGFiYXNlXG4gKlxuICogICBOb3RlIG92ZXIgQyxEQjogQ3JlYXRlL1VwZGF0ZSBGbG93XG4gKiAgIEMtPj5NOiBTZXQgY29tcGxleCBvYmplY3QgcHJvcGVydHlcbiAqICAgTS0+PlM6IFByb2Nlc3MgcHJvcGVydHkgKGNyZWF0ZS91cGRhdGUpXG4gKiAgIFMtPj5NOiBDb252ZXJ0IHRvIEpTT04gc3RyaW5nXG4gKiAgIE0tPj5EQjogU3RvcmUgc2VyaWFsaXplZCBkYXRhXG4gKlxuICogICBOb3RlIG92ZXIgQyxEQjogUmV0cmlldmFsIEZsb3dcbiAqICAgQy0+Pk06IFJlcXVlc3QgbW9kZWxcbiAqICAgTS0+PkRCOiBGZXRjaCBkYXRhXG4gKiAgIERCLT4+TTogUmV0dXJuIHdpdGggc2VyaWFsaXplZCBwcm9wZXJ0eVxuICogICBNLT4+UzogUHJvY2VzcyBwcm9wZXJ0eSAoYWZ0ZXIgYWxsIG9wcylcbiAqICAgUy0+Pk06IFBhcnNlIEpTT04gYmFjayB0byBvYmplY3RcbiAqICAgTS0+PkM6IFJldHVybiBtb2RlbCB3aXRoIGRlc2VyaWFsaXplZCBwcm9wZXJ0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplKCkge1xuICByZXR1cm4gYXBwbHkoXG4gICAgb25DcmVhdGVVcGRhdGUoc2VyaWFsaXplT25DcmVhdGVVcGRhdGUpLFxuICAgIGFmdGVyKERCT3BlcmF0aW9ucy5BTEwsIHNlcmlhbGl6ZUFmdGVyQWxsKSxcbiAgICB0eXBlKFtTdHJpbmcubmFtZSwgT2JqZWN0Lm5hbWVdKSxcbiAgICBtZXRhZGF0YShSZXBvc2l0b3J5LmtleShEQktleXMuU0VSSUFMSVpFKSwge30pXG4gICk7XG59XG4iLCJpbXBvcnQgeyBwcm9wTWV0YWRhdGEsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgcmVhZG9ubHkgfSBmcm9tIFwiLi4vdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgREJLZXlzIH0gZnJvbSBcIi4uL21vZGVsL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBhcHBseSB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIHByb3BlcnR5IGFzIGFuIElEIGZpZWxkXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgY29tcG9zaXRlIGRlY29yYXRvciB0aGF0IG1hcmtzIGEgcHJvcGVydHkgYXMgcmVxdWlyZWQsIHJlYWRvbmx5LCBhbmQgYXMgdGhlIElEIGZpZWxkIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gaWRcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpZCgpIHtcbiAgcmV0dXJuIGFwcGx5KFxuICAgIHJlcXVpcmVkKCksXG4gICAgcmVhZG9ubHkoKSxcbiAgICBwcm9wTWV0YWRhdGEoUmVwb3NpdG9yeS5rZXkoREJLZXlzLklEKSwge30pXG4gICk7XG59XG4iLCJpbXBvcnQge1xuICBDb25kaXRpb25hbEFzeW5jLFxuICBEZWNvcmF0b3JNZXRhZGF0YUFzeW5jLFxuICBnZXRWYWxpZGF0aW9uRGVjb3JhdG9ycyxcbiAgTW9kZWwsXG4gIE1vZGVsQ29uZGl0aW9uYWxBc3luYyxcbiAgTW9kZWxFcnJvckRlZmluaXRpb24sXG4gIE1vZGVsRXJyb3JzLFxuICBNb2RlbEtleXMsXG4gIHRvQ29uZGl0aW9uYWxQcm9taXNlLFxuICBWYWxpZGF0aW9uLFxuICBWYWxpZGF0aW9uS2V5cyxcbiAgVmFsaWRhdGlvblByb3BlcnR5RGVjb3JhdG9yRGVmaW5pdGlvbixcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUmVmbGVjdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgVXBkYXRlVmFsaWRhdGlvbktleXMsIFVwZGF0ZVZhbGlkYXRvciB9IGZyb20gXCIuLi92YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBmaW5kTW9kZWxJZCB9IGZyb20gXCIuLi9pZGVudGl0eVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0cmlldmVzIHZhbGlkYXRpb24gZGVjb3JhdG9yIGRlZmluaXRpb25zIGZyb20gYSBtb2RlbCBmb3IgdXBkYXRlIG9wZXJhdGlvbnMsIGluY2x1ZGluZ1xuICogc3VwcG9ydCBmb3Igc3BlY2lhbCBoYW5kbGluZyBvZiBsaXN0IGRlY29yYXRvcnMuXG4gKlxuICogQHN1bW1hcnlcbiAqIEl0ZXJhdGVzIG92ZXIgdGhlIG1vZGVsJ3Mgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyBhbmQgZmlsdGVycyBvdXQgdGhvc2Ugc3BlY2lmaWVkIGluIHRoZVxuICogYHByb3BzVG9JZ25vcmVgIGFycmF5LiBGb3IgZWFjaCByZW1haW5pbmcgcHJvcGVydHksIHJldHJpZXZlcyB2YWxpZGF0aW9uIGRlY29yYXRvcnMgc3BlY2lmaWNcbiAqIHRvIHVwZGF0ZSBvcGVyYXRpb25zIHVzaW5nIHRoZSBgVXBkYXRlVmFsaWRhdGlvbktleXMuUkVGTEVDVGAga2V5LiBBZGRpdGlvbmFsbHksIGl0IGV4cGxpY2l0bHlcbiAqIGNoZWNrcyBmb3IgYW5kIGFwcGVuZHMgYW55IGBMSVNUYCB0eXBlIGRlY29yYXRvcnMgdG8gZW5zdXJlIHByb3BlciB2YWxpZGF0aW9uIG9mIGNvbGxlY3Rpb24gdHlwZXMuXG4gKlxuICogQHRlbXBsYXRlIE0gLSBBIGdlbmVyaWMgcGFyYW1ldGVyIGV4dGVuZGluZyB0aGUgYE1vZGVsYCBjbGFzcywgcmVwcmVzZW50aW5nIHRoZSBtb2RlbCB0eXBlIGJlaW5nIGluc3BlY3RlZC5cbiAqXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHdob3NlIHByb3BlcnRpZXMgYXJlIGJlaW5nIGluc3BlY3RlZCBmb3IgdXBkYXRlLXJlbGF0ZWQgdmFsaWRhdGlvbnMuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBwcm9wc1RvSWdub3JlIC0gQSBsaXN0IG9mIHByb3BlcnR5IG5hbWVzIHRvIGV4Y2x1ZGUgZnJvbSB0aGUgdmFsaWRhdGlvbiBkZWNvcmF0b3IgcmV0cmlldmFsIHByb2Nlc3MuXG4gKlxuICogQHJldHVybiB7VmFsaWRhdGlvblByb3BlcnR5RGVjb3JhdG9yRGVmaW5pdGlvbltdfSBBbiBhcnJheSBvZiB2YWxpZGF0aW9uIGRlY29yYXRvciBkZWZpbml0aW9ucywgaW5jbHVkaW5nIGJvdGhcbiAqIHVwZGF0ZS1zcGVjaWZpYyBhbmQgbGlzdC10eXBlIGRlY29yYXRvcnMsIGV4Y2x1ZGluZyB0aG9zZSBmb3IgaWdub3JlZCBwcm9wZXJ0aWVzLlxuICpcbiAqIEBmdW5jdGlvbiBnZXRWYWxpZGF0YWJsZVVwZGF0ZVByb3BzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWxpZGF0YWJsZVVwZGF0ZVByb3BzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNLFxuICBwcm9wc1RvSWdub3JlOiBzdHJpbmdbXVxuKTogVmFsaWRhdGlvblByb3BlcnR5RGVjb3JhdG9yRGVmaW5pdGlvbltdIHtcbiAgY29uc3QgZGVjb3JhdGVkUHJvcGVydGllczogVmFsaWRhdGlvblByb3BlcnR5RGVjb3JhdG9yRGVmaW5pdGlvbltdID0gW107XG4gIGZvciAoY29uc3QgcHJvcCBpbiBtb2RlbCkge1xuICAgIGlmIChcbiAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2RlbCwgcHJvcCkgJiZcbiAgICAgICFwcm9wc1RvSWdub3JlLmluY2x1ZGVzKHByb3ApXG4gICAgKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uUHJvcGVydHlEZWZpbml0aW9uID0gZ2V0VmFsaWRhdGlvbkRlY29yYXRvcnMoXG4gICAgICAgIG1vZGVsLFxuICAgICAgICBwcm9wLFxuICAgICAgICBVcGRhdGVWYWxpZGF0aW9uS2V5cy5SRUZMRUNUXG4gICAgICApO1xuXG4gICAgICBjb25zdCBsaXN0RGVjb3JhdG9yID0gZ2V0VmFsaWRhdGlvbkRlY29yYXRvcnMoXG4gICAgICAgIG1vZGVsLFxuICAgICAgICBwcm9wXG4gICAgICApLmRlY29yYXRvcnMuZmluZCgoeyBrZXkgfSkgPT4ga2V5ID09PSBWYWxpZGF0aW9uS2V5cy5MSVNUKTtcblxuICAgICAgaWYgKGxpc3REZWNvcmF0b3IpXG4gICAgICAgIHZhbGlkYXRpb25Qcm9wZXJ0eURlZmluaXRpb24uZGVjb3JhdG9ycy5wdXNoKGxpc3REZWNvcmF0b3IpO1xuXG4gICAgICBkZWNvcmF0ZWRQcm9wZXJ0aWVzLnB1c2godmFsaWRhdGlvblByb3BlcnR5RGVmaW5pdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRlY29yYXRlZFByb3BlcnRpZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZURlY29yYXRvcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBBc3luYyBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4oXG4gIG5ld01vZGVsOiBNLFxuICBvbGRNb2RlbDogTSxcbiAgcHJvcDogc3RyaW5nLFxuICBkZWNvcmF0b3I6IERlY29yYXRvck1ldGFkYXRhQXN5bmMsXG4gIGFzeW5jPzogQXN5bmNcbik6IENvbmRpdGlvbmFsQXN5bmM8QXN5bmMsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCB2YWxpZGF0b3I6IFVwZGF0ZVZhbGlkYXRvciA9IFZhbGlkYXRpb24uZ2V0KFxuICAgIGRlY29yYXRvci5rZXlcbiAgKSBhcyBVcGRhdGVWYWxpZGF0b3I7XG5cbiAgaWYgKCF2YWxpZGF0b3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgdmFsaWRhdG9yIGZvciAke2RlY29yYXRvci5rZXl9YCk7XG4gIH1cblxuICAvLyBTa2lwIHZhbGlkYXRvcnMgdGhhdCBhcmVuJ3QgVXBkYXRlVmFsaWRhdG9yc1xuICBpZiAoIXZhbGlkYXRvci51cGRhdGVIYXNFcnJvcnMpIHJldHVybiB0b0NvbmRpdGlvbmFsUHJvbWlzZSh1bmRlZmluZWQsIGFzeW5jKTtcblxuICAvLyBza2lwIGFzeW5jIGRlY29yYXRvcnMgaWYgdmFsaWRhdGVEZWNvcmF0b3JzIGlzIGNhbGxlZCBzeW5jaHJvbm91c2x5IChhc3luYyA9IGZhbHNlKVxuICBpZiAoIWFzeW5jICYmIGRlY29yYXRvci5wcm9wcy5hc3luYylcbiAgICByZXR1cm4gdG9Db25kaXRpb25hbFByb21pc2UodW5kZWZpbmVkLCBhc3luYyk7XG5cbiAgY29uc3QgZGVjb3JhdG9yUHJvcHMgPSBPYmplY3QudmFsdWVzKGRlY29yYXRvci5wcm9wcykgfHwge307XG5cbiAgLy8gY29uc3QgY29udGV4dCA9IFBhdGhQcm94eUVuZ2luZS5jcmVhdGUob2JqLCB7XG4gIC8vICAgaWdub3JlVW5kZWZpbmVkOiB0cnVlLFxuICAvLyAgIGlnbm9yZU51bGw6IHRydWUsXG4gIC8vIH0pO1xuXG4gIGNvbnN0IG1heWJlRXJyb3IgPSB2YWxpZGF0b3IudXBkYXRlSGFzRXJyb3JzKFxuICAgIChuZXdNb2RlbCBhcyBhbnkpW3Byb3BdLFxuICAgIChvbGRNb2RlbCBhcyBhbnkpW3Byb3BdLFxuICAgIC4uLmRlY29yYXRvclByb3BzXG4gICk7XG5cbiAgcmV0dXJuIHRvQ29uZGl0aW9uYWxQcm9taXNlKG1heWJlRXJyb3IsIGFzeW5jKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRGVjb3JhdG9yczxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBBc3luYyBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4oXG4gIG5ld01vZGVsOiBNLFxuICBvbGRNb2RlbDogTSxcbiAgcHJvcDogc3RyaW5nLFxuICBkZWNvcmF0b3JzOiBEZWNvcmF0b3JNZXRhZGF0YUFzeW5jW10sXG4gIGFzeW5jPzogQXN5bmNcbik6IENvbmRpdGlvbmFsQXN5bmM8QXN5bmMsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4+ID0ge307XG5cbiAgZm9yIChjb25zdCBkZWNvcmF0b3Igb2YgZGVjb3JhdG9ycykge1xuICAgIC8vIHNraXAgYXN5bmMgZGVjb3JhdG9ycyBpZiB2YWxpZGF0ZURlY29yYXRvcnMgaXMgY2FsbGVkIHN5bmNocm9ub3VzbHkgKGFzeW5jID0gZmFsc2UpXG4gICAgaWYgKCFhc3luYyAmJiBkZWNvcmF0b3IucHJvcHMuYXN5bmMpIGNvbnRpbnVlO1xuXG4gICAgbGV0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0ZURlY29yYXRvcihcbiAgICAgIG5ld01vZGVsLFxuICAgICAgb2xkTW9kZWwsXG4gICAgICBwcm9wLFxuICAgICAgZGVjb3JhdG9yLFxuICAgICAgYXN5bmNcbiAgICApO1xuXG4gICAgLypcbiAgICBJZiB0aGUgZGVjb3JhdG9yIGlzIGEgbGlzdCwgZWFjaCBlbGVtZW50IG11c3QgYmUgY2hlY2tlZC5cbiAgICBXaGVuICdhc3luYycgaXMgdHJ1ZSwgdGhlICdlcnInIHdpbGwgYWx3YXlzIGJlIGEgcGVuZGluZyBwcm9taXNlIGluaXRpYWxseSxcbiAgICBzbyB0aGUgJyFlcnInIGNoZWNrIHdpbGwgZXZhbHVhdGUgdG8gZmFsc2UgKGV2ZW4gaWYgdGhlIHByb21pc2UgbGF0ZXIgcmVzb2x2ZXMgd2l0aCBubyBlcnJvcnMpXG4gICAgKi9cbiAgICBpZiAoZGVjb3JhdG9yLmtleSA9PT0gVmFsaWRhdGlvbktleXMuTElTVCAmJiAoIXZhbGlkYXRpb25FcnJvcnMgfHwgYXN5bmMpKSB7XG4gICAgICBjb25zdCBuZXdQcm9wVmFsdWUgPSAobmV3TW9kZWwgYXMgYW55KVtwcm9wXTtcbiAgICAgIGNvbnN0IG9sZFByb3BWYWx1ZSA9IChvbGRNb2RlbCBhcyBhbnkpW3Byb3BdO1xuXG4gICAgICBjb25zdCBuZXdWYWx1ZXMgPVxuICAgICAgICBuZXdQcm9wVmFsdWUgaW5zdGFuY2VvZiBTZXQgPyBbLi4ubmV3UHJvcFZhbHVlXSA6IG5ld1Byb3BWYWx1ZTtcbiAgICAgIGNvbnN0IG9sZFZhbHVlcyA9XG4gICAgICAgIG9sZFByb3BWYWx1ZSBpbnN0YW5jZW9mIFNldCA/IFsuLi5vbGRQcm9wVmFsdWVdIDogb2xkUHJvcFZhbHVlO1xuXG4gICAgICBpZiAobmV3VmFsdWVzICYmIG5ld1ZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHR5cGVzID1cbiAgICAgICAgICBkZWNvcmF0b3IucHJvcHMuY2xhc3MgfHxcbiAgICAgICAgICBkZWNvcmF0b3IucHJvcHMuY2xhenogfHxcbiAgICAgICAgICBkZWNvcmF0b3IucHJvcHMuY3VzdG9tVHlwZXM7XG5cbiAgICAgICAgY29uc3QgYWxsb3dlZFR5cGVzID0gW3R5cGVzXS5mbGF0KCkubWFwKCh0KSA9PiB7XG4gICAgICAgICAgdCA9IHR5cGVvZiB0ID09PSBcImZ1bmN0aW9uXCIgJiYgIXQubmFtZSA/IHQoKSA6IHQ7XG4gICAgICAgICAgdCA9ICh0IGFzIGFueSkubmFtZSA/ICh0IGFzIGFueSkubmFtZSA6IHQ7XG4gICAgICAgICAgcmV0dXJuIFN0cmluZyh0KS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBlcnJzID0gbmV3VmFsdWVzLm1hcCgoY2hpbGRWYWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgLy8gZmluZCBieSBpZCBzbyB0aGUgbGlzdCBlbGVtZW50cyBvcmRlciBkb2Vzbid0IG1hdHRlclxuICAgICAgICAgIGNvbnN0IGlkID0gZmluZE1vZGVsSWQoY2hpbGRWYWx1ZSBhcyBhbnksIHRydWUpO1xuICAgICAgICAgIGlmICghaWQpIHJldHVybiBcIkZhaWxlZCB0byBmaW5kIG1vZGVsIGlkXCI7XG5cbiAgICAgICAgICBjb25zdCBvbGRNb2RlbCA9IG9sZFZhbHVlcy5maW5kKFxuICAgICAgICAgICAgKGVsOiBhbnkpID0+IGlkID09PSBmaW5kTW9kZWxJZChlbCwgdHJ1ZSlcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKE1vZGVsLmlzTW9kZWwoY2hpbGRWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjaGlsZFZhbHVlLmhhc0Vycm9ycyhvbGRNb2RlbCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGFsbG93ZWRUeXBlcy5pbmNsdWRlcyh0eXBlb2YgY2hpbGRWYWx1ZSlcbiAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6IFwiVmFsdWUgaGFzIG5vIHZhbGlkYXRhYmxlIHR5cGVcIjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGFzeW5jKSB7XG4gICAgICAgICAgdmFsaWRhdGlvbkVycm9ycyA9IFByb21pc2UuYWxsKGVycnMpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWxsRW1wdHkgPSByZXN1bHQuZXZlcnkoKHIpID0+ICFyKTtcbiAgICAgICAgICAgIHJldHVybiBhbGxFbXB0eSA/IHVuZGVmaW5lZCA6IHJlc3VsdDtcbiAgICAgICAgICB9KSBhcyBhbnk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgYWxsRW1wdHkgPSBlcnJzLmV2ZXJ5KChyOiBzdHJpbmcgfCB1bmRlZmluZWQpID0+ICFyKTtcbiAgICAgICAgICB2YWxpZGF0aW9uRXJyb3JzID0gZXJycy5sZW5ndGggPiAwICYmICFhbGxFbXB0eSA/IGVycnMgOiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdGlvbkVycm9ycykgKHJlc3VsdCBhcyBhbnkpW2RlY29yYXRvci5rZXldID0gdmFsaWRhdGlvbkVycm9ycztcbiAgfVxuXG4gIGlmICghYXN5bmMpXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHJlc3VsdCkubGVuZ3RoID4gMCA/IChyZXN1bHQgYXMgYW55KSA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocmVzdWx0KTtcbiAgY29uc3QgcHJvbWlzZXMgPSBPYmplY3QudmFsdWVzKHJlc3VsdCkgYXMgUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+W107XG4gIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigocmVzb2x2ZWRWYWx1ZXMpID0+IHtcbiAgICBjb25zdCByZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc29sdmVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB2YWwgPSByZXNvbHZlZFZhbHVlc1tpXTtcbiAgICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXNba2V5c1tpXV0gPSB2YWw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhyZXMpLmxlbmd0aCA+IDAgPyByZXMgOiB1bmRlZmluZWQ7XG4gIH0pIGFzIGFueTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdGVzIGNoYW5nZXMgYmV0d2VlbiB0d28gbW9kZWwgdmVyc2lvbnNcbiAqIEBzdW1tYXJ5IENvbXBhcmVzIGFuIG9sZCBhbmQgbmV3IG1vZGVsIHZlcnNpb24gdG8gdmFsaWRhdGUgdXBkYXRlIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEBwYXJhbSB7TX0gb2xkTW9kZWwgLSBUaGUgb3JpZ2luYWwgbW9kZWwgdmVyc2lvblxuICogQHBhcmFtIHtNfSBuZXdNb2RlbCAtIFRoZSB1cGRhdGVkIG1vZGVsIHZlcnNpb25cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYXN5bmMgLSBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHZhbGlkYXRpb24gc2hvdWxkIGJlIGFzeW5jaHJvbm91cy5cbiAqIEBwYXJhbSB7Li4uc3RyaW5nW119IGV4Y2VwdGlvbnMgLSBQcm9wZXJ0aWVzIHRvIGV4Y2x1ZGUgZnJvbSB2YWxpZGF0aW9uXG4gKiBAcmV0dXJuIHtNb2RlbEVycm9yRGVmaW5pdGlvbnx1bmRlZmluZWR9IEVycm9yIGRlZmluaXRpb24gaWYgdmFsaWRhdGlvbiBmYWlscywgdW5kZWZpbmVkIG90aGVyd2lzZVxuICogQGZ1bmN0aW9uIHZhbGlkYXRlQ29tcGFyZVxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCB2YWxpZGF0ZUNvbXBhcmVcbiAqICAgcGFydGljaXBhbnQgUmVmbGVjdGlvblxuICogICBwYXJ0aWNpcGFudCBWYWxpZGF0aW9uXG4gKlxuICogICBDYWxsZXItPj52YWxpZGF0ZUNvbXBhcmU6IG9sZE1vZGVsLCBuZXdNb2RlbCwgZXhjZXB0aW9uc1xuICogICB2YWxpZGF0ZUNvbXBhcmUtPj5SZWZsZWN0aW9uOiBnZXQgZGVjb3JhdGVkIHByb3BlcnRpZXNcbiAqICAgUmVmbGVjdGlvbi0tPj52YWxpZGF0ZUNvbXBhcmU6IHByb3BlcnR5IGRlY29yYXRvcnNcbiAqICAgbG9vcCBGb3IgZWFjaCBkZWNvcmF0ZWQgcHJvcGVydHlcbiAqICAgICB2YWxpZGF0ZUNvbXBhcmUtPj5WYWxpZGF0aW9uOiBnZXQgdmFsaWRhdG9yXG4gKiAgICAgVmFsaWRhdGlvbi0tPj52YWxpZGF0ZUNvbXBhcmU6IHZhbGlkYXRvclxuICogICAgIHZhbGlkYXRlQ29tcGFyZS0+PnZhbGlkYXRlQ29tcGFyZTogdmFsaWRhdGUgcHJvcGVydHkgdXBkYXRlXG4gKiAgIGVuZFxuICogICBsb29wIEZvciBuZXN0ZWQgbW9kZWxzXG4gKiAgICAgdmFsaWRhdGVDb21wYXJlLT4+dmFsaWRhdGVDb21wYXJlOiB2YWxpZGF0ZSBuZXN0ZWQgbW9kZWxzXG4gKiAgIGVuZFxuICogICB2YWxpZGF0ZUNvbXBhcmUtLT4+Q2FsbGVyOiB2YWxpZGF0aW9uIGVycm9ycyBvciB1bmRlZmluZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQ29tcGFyZTxNIGV4dGVuZHMgTW9kZWw8YW55Pj4oXG4gIG9sZE1vZGVsOiBNLFxuICBuZXdNb2RlbDogTSxcbiAgYXN5bmM6IGJvb2xlYW4sXG4gIC4uLmV4Y2VwdGlvbnM6IHN0cmluZ1tdXG4pOiBNb2RlbENvbmRpdGlvbmFsQXN5bmM8TT4ge1xuICBjb25zdCBkZWNvcmF0ZWRQcm9wZXJ0aWVzOiBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uW10gPVxuICAgIGdldFZhbGlkYXRhYmxlVXBkYXRlUHJvcHMobmV3TW9kZWwsIGV4Y2VwdGlvbnMpO1xuXG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gIGNvbnN0IG5lc3RlZEVycm9yczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICBmb3IgKGNvbnN0IHsgcHJvcCwgZGVjb3JhdG9ycyB9IG9mIGRlY29yYXRlZFByb3BlcnRpZXMpIHtcbiAgICBjb25zdCBwcm9wS2V5ID0gU3RyaW5nKHByb3ApO1xuICAgIGxldCBwcm9wVmFsdWUgPSAobmV3TW9kZWwgYXMgYW55KVtwcm9wXTtcblxuICAgIGlmICghZGVjb3JhdG9ycz8ubGVuZ3RoKSBjb250aW51ZTtcblxuICAgIC8vIEdldCB0aGUgZGVmYXVsdCB0eXBlIHZhbGlkYXRvclxuICAgIGNvbnN0IGRlc2lnblR5cGVEZWMgPSBkZWNvcmF0b3JzLmZpbmQoKGQpID0+XG4gICAgICBbTW9kZWxLZXlzLlRZUEUsIFZhbGlkYXRpb25LZXlzLlRZUEVdLmluY2x1ZGVzKGQua2V5IGFzIGFueSlcbiAgICApO1xuICAgIGlmICghZGVzaWduVHlwZURlYykgY29udGludWU7XG5cbiAgICBjb25zdCBkZXNpZ25UeXBlID0gZGVzaWduVHlwZURlYy5wcm9wcy5uYW1lO1xuXG4gICAgLy8gSGFuZGxlIGFycmF5IG9yIFNldCB0eXBlcyBhbmQgZW5mb3JjZSB0aGUgcHJlc2VuY2Ugb2YgQGxpc3QgZGVjb3JhdG9yXG4gICAgaWYgKFtBcnJheS5uYW1lLCBTZXQubmFtZV0uaW5jbHVkZXMoZGVzaWduVHlwZSkpIHtcbiAgICAgIGNvbnN0IHsgZGVjb3JhdG9ycyB9ID0gUmVmbGVjdGlvbi5nZXRQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICAgIFZhbGlkYXRpb25LZXlzLlJFRkxFQ1QsXG4gICAgICAgIG5ld01vZGVsLFxuICAgICAgICBwcm9wS2V5XG4gICAgICApIGFzIHVua25vd24gYXMgVmFsaWRhdGlvblByb3BlcnR5RGVjb3JhdG9yRGVmaW5pdGlvbjtcblxuICAgICAgaWYgKCFkZWNvcmF0b3JzLnNvbWUoKGQpID0+IGQua2V5ID09PSBWYWxpZGF0aW9uS2V5cy5MSVNUKSkge1xuICAgICAgICByZXN1bHRbcHJvcEtleV0gPSB7XG4gICAgICAgICAgW1ZhbGlkYXRpb25LZXlzLlRZUEVdOiBgQXJyYXkgb3IgU2V0IHByb3BlcnR5ICcke3Byb3BLZXl9JyByZXF1aXJlcyBhIEBsaXN0IGRlY29yYXRvcmAsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHByb3BWYWx1ZSAmJlxuICAgICAgICAhKEFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSB8fCBwcm9wVmFsdWUgaW5zdGFuY2VvZiBTZXQpXG4gICAgICApIHtcbiAgICAgICAgcmVzdWx0W3Byb3BLZXldID0ge1xuICAgICAgICAgIFtWYWxpZGF0aW9uS2V5cy5UWVBFXTogYFByb3BlcnR5ICcke1N0cmluZyhwcm9wKX0nIG11c3QgYmUgZWl0aGVyIGFuIGFycmF5IG9yIGEgU2V0YCxcbiAgICAgICAgfTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSBkZXNpZ246dHlwZSBkZWNvcmF0b3IsIHNpbmNlIEBsaXN0IGRlY29yYXRvciBhbHJlYWR5IGVuc3VyZXMgdHlwZVxuICAgICAgZm9yIChsZXQgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgaWYgKGRlY29yYXRvcnNbaV0ua2V5ID09PSBNb2RlbEtleXMuVFlQRSkge1xuICAgICAgICAgIGRlY29yYXRvcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwcm9wVmFsdWUgPSBwcm9wVmFsdWUgaW5zdGFuY2VvZiBTZXQgPyBbLi4ucHJvcFZhbHVlXSA6IHByb3BWYWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wRXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID1cbiAgICAgIHZhbGlkYXRlRGVjb3JhdG9ycyhuZXdNb2RlbCwgb2xkTW9kZWwsIHByb3BLZXksIGRlY29yYXRvcnMsIGFzeW5jKSB8fCB7fTtcblxuICAgIC8vIENoZWNrIGZvciBuZXN0ZWQgcHJvcGVydGllcy5cbiAgICAvLyBUbyBwcmV2ZW50IHVubmVjZXNzYXJ5IHByb2Nlc3NpbmcsIFwicHJvcFZhbHVlXCIgbXVzdCBiZSBkZWZpbmVkIGFuZCB2YWxpZGF0YWJsZVxuICAgIGNvbnN0IGlzQ29uc3RyID0gTW9kZWwuaXNQcm9wZXJ0eU1vZGVsKG5ld01vZGVsLCBwcm9wS2V5KTtcbiAgICAvLyBpZiBwcm9wVmFsdWUgIT09IHVuZGVmaW5lZCwgbnVsbFxuICAgIGlmIChwcm9wVmFsdWUgJiYgaXNDb25zdHIpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlOiBNb2RlbCA9IHByb3BWYWx1ZTtcbiAgICAgIGNvbnN0IGlzSW52YWxpZE1vZGVsID1cbiAgICAgICAgdHlwZW9mIGluc3RhbmNlICE9PSBcIm9iamVjdFwiIHx8XG4gICAgICAgICFpbnN0YW5jZS5oYXNFcnJvcnMgfHxcbiAgICAgICAgdHlwZW9mIGluc3RhbmNlLmhhc0Vycm9ycyAhPT0gXCJmdW5jdGlvblwiO1xuXG4gICAgICBpZiAoaXNJbnZhbGlkTW9kZWwpIHtcbiAgICAgICAgLy8gcHJvcEVycm9yc1tWYWxpZGF0aW9uS2V5cy5UWVBFXSA9XG4gICAgICAgIC8vICAgXCJNb2RlbCBzaG91bGQgYmUgdmFsaWRhdGFibGUgYnV0IGl0J3Mgbm90LlwiO1xuICAgICAgICBjb25zb2xlLndhcm4oXCJNb2RlbCBzaG91bGQgYmUgdmFsaWRhdGFibGUgYnV0IGl0J3Mgbm90LlwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5lc3RlZEVycm9yc1twcm9wS2V5XSA9IGluc3RhbmNlLmhhc0Vycm9ycygob2xkTW9kZWwgYXMgYW55KVtwcm9wXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIHRvIHRoZSByZXN1bHQgaWYgd2UgaGF2ZSBhbnkgZXJyb3JzXG4gICAgLy8gQXN5bmMgbW9kZSByZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHVuZGVmaW5lZCB3aGVuIG5vIGVycm9ycyBleGlzdFxuICAgIGlmIChPYmplY3Qua2V5cyhwcm9wRXJyb3JzKS5sZW5ndGggPiAwIHx8IGFzeW5jKVxuICAgICAgcmVzdWx0W3Byb3BLZXldID0gcHJvcEVycm9ycztcblxuICAgIC8vIFRoZW4gbWVyZ2UgYW55IG5lc3RlZCBlcnJvcnNcbiAgICBpZiAoIWFzeW5jKSB7XG4gICAgICBPYmplY3QuZW50cmllcyhuZXN0ZWRFcnJvcnNbcHJvcEtleV0gfHwge30pLmZvckVhY2goKFtrZXksIGVycm9yXSkgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlc3VsdFtgJHtwcm9wS2V5fS4ke2tleX1gXSA9IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBTeW5jaHJvbm91cyByZXR1cm5cbiAgaWYgKCFhc3luYykge1xuICAgIHJldHVybiAoXG4gICAgICBPYmplY3Qua2V5cyhyZXN1bHQpLmxlbmd0aCA+IDBcbiAgICAgICAgPyBuZXcgTW9kZWxFcnJvckRlZmluaXRpb24ocmVzdWx0KVxuICAgICAgICA6IHVuZGVmaW5lZFxuICAgICkgYXMgYW55O1xuICB9XG5cbiAgY29uc3QgbWVyZ2VkOiBhbnkgPSByZXN1bHQ7IC8vIFRPRE86IGFwcGx5IGZpbHRlcmluZ1xuXG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhtZXJnZWQpO1xuICBjb25zdCBwcm9taXNlcyA9IE9iamVjdC52YWx1ZXMobWVyZ2VkKTtcbiAgcmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChwcm9taXNlcykudGhlbihhc3luYyAocmVzdWx0cykgPT4ge1xuICAgIGNvbnN0IHJlc3VsdDogTW9kZWxFcnJvcnMgPSB7fTtcblxuICAgIGZvciAoY29uc3QgW3BhcmVudFByb3AsIG5lc3RlZEVyclByb21pc2VdIG9mIE9iamVjdC5lbnRyaWVzKG5lc3RlZEVycm9ycykpIHtcbiAgICAgIGNvbnN0IG5lc3RlZFByb3BEZWNFcnJvcnMgPSAoYXdhaXQgbmVzdGVkRXJyUHJvbWlzZSkgYXMgUmVjb3JkPFxuICAgICAgICBzdHJpbmcsXG4gICAgICAgIGFueVxuICAgICAgPjtcblxuICAgICAgaWYgKG5lc3RlZFByb3BEZWNFcnJvcnMpXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKG5lc3RlZFByb3BEZWNFcnJvcnMpLmZvckVhY2goXG4gICAgICAgICAgKFtuZXN0ZWRQcm9wLCBuZXN0ZWRQcm9wRGVjRXJyb3JdKSA9PiB7XG4gICAgICAgICAgICBpZiAobmVzdGVkUHJvcERlY0Vycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgY29uc3QgbmVzdGVkS2V5ID0gW3BhcmVudFByb3AsIG5lc3RlZFByb3BdLmpvaW4oXCIuXCIpO1xuICAgICAgICAgICAgICByZXN1bHRbbmVzdGVkS2V5XSA9IG5lc3RlZFByb3BEZWNFcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgY29uc3QgcmVzID0gcmVzdWx0c1tpXTtcblxuICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IFwiZnVsZmlsbGVkXCIgJiYgcmVzLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgKHJlc3VsdCBhcyBhbnkpW2tleV0gPSByZXMudmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKHJlcy5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIikge1xuICAgICAgICAocmVzdWx0IGFzIGFueSlba2V5XSA9XG4gICAgICAgICAgcmVzLnJlYXNvbiBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICA/IHJlcy5yZWFzb24ubWVzc2FnZVxuICAgICAgICAgICAgOiBTdHJpbmcocmVzLnJlYXNvbiB8fCBcIlZhbGlkYXRpb24gZmFpbGVkXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhyZXN1bHQpLmxlbmd0aCA+IDBcbiAgICAgID8gbmV3IE1vZGVsRXJyb3JEZWZpbml0aW9uKHJlc3VsdClcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9KSBhcyBhbnk7XG59XG4iLCJpbXBvcnQgeyBEQktleXMsIERlZmF1bHRTZXBhcmF0b3IgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGFwcGx5IH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQge1xuICBEZWNvcmF0aW9uLFxuICBIYXNoaW5nLFxuICBNb2RlbCxcbiAgcHJvcE1ldGFkYXRhLFxuICB0eXBlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBvbkNyZWF0ZSwgb25DcmVhdGVVcGRhdGUsIG9uVXBkYXRlIH0gZnJvbSBcIi4uL29wZXJhdGlvbnMvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgSVJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9JUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L2Vycm9yc1wiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L1JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9Db250ZXh0XCI7XG5pbXBvcnQgeyBDcnVkT3BlcmF0aW9ucywgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCIuLi9vcGVyYXRpb25zXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5RmxhZ3MgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYXNoZXMgYSBwcm9wZXJ0eSB2YWx1ZSBkdXJpbmcgY3JlYXRlIG9yIHVwZGF0ZSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBDYWxsYmFjayBmdW5jdGlvbiB1c2VkIGJ5IHRoZSBoYXNoIGRlY29yYXRvciB0byBhcHBseSBoYXNoaW5nIHRvIGEgcHJvcGVydHkgdmFsdWVcbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVHlwZSBleHRlbmRpbmcgSVJlcG9zaXRvcnlcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVHlwZSBleHRlbmRpbmcgUmVwb3NpdG9yeUZsYWdzXG4gKiBAdGVtcGxhdGUgQyAtIFR5cGUgZXh0ZW5kaW5nIENvbnRleHRcbiAqIEBwYXJhbSB7Q30gY29udGV4dCAtIFRoZSBvcGVyYXRpb24gY29udGV4dFxuICogQHBhcmFtIHtWfSBkYXRhIC0gTWV0YWRhdGEgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIGhhc2hcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0ge019IFtvbGRNb2RlbF0gLSBUaGUgcHJldmlvdXMgbW9kZWwgc3RhdGUgKGZvciB1cGRhdGVzKVxuICogQHJldHVybiB7dm9pZH1cbiAqIEBmdW5jdGlvbiBoYXNoT25DcmVhdGVVcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaE9uQ3JlYXRlVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBJUmVwb3NpdG9yeTxNLCBGLCBDPixcbiAgViBleHRlbmRzIG9iamVjdCxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBDb250ZXh0PEY+LFxuPih0aGlzOiBSLCBjb250ZXh0OiBDLCBkYXRhOiBWLCBrZXk6IGtleW9mIE0sIG1vZGVsOiBNLCBvbGRNb2RlbD86IE0pOiB2b2lkIHtcbiAgaWYgKHR5cGVvZiBtb2RlbFtrZXldID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm47XG4gIGNvbnN0IGhhc2ggPSBIYXNoaW5nLmhhc2goKG1vZGVsIGFzIGFueSlba2V5XSk7XG4gIGlmIChvbGRNb2RlbCAmJiAobW9kZWwgYXMgYW55KVtrZXldID09PSBoYXNoKSByZXR1cm47XG4gIG1vZGVsW2tleV0gPSBoYXNoO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgZGVjb3JhdG9yIHRoYXQgaGFzaGVzIGEgcHJvcGVydHkgdmFsdWVcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IGF1dG9tYXRpY2FsbHkgaGFzaGVzIGEgcHJvcGVydHkgdmFsdWUgZHVyaW5nIGNyZWF0ZSBhbmQgdXBkYXRlIG9wZXJhdGlvbnNcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBoYXNoXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaCgpIHtcbiAgcmV0dXJuIGFwcGx5KFxuICAgIG9uQ3JlYXRlVXBkYXRlKGhhc2hPbkNyZWF0ZVVwZGF0ZSksXG4gICAgcHJvcE1ldGFkYXRhKFJlcG9zaXRvcnkua2V5KERCS2V5cy5IQVNIKSwge30pXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1ldGFkYXRhIGZvciBjb21wb3NlZCBwcm9wZXJ0eSBkZWNvcmF0b3JzXG4gKiBAc3VtbWFyeSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHByb3BlcnR5IGNvbXBvc2l0aW9uIGZyb20gb3RoZXIgcHJvcGVydGllc1xuICogQHR5cGVkZWYge09iamVjdH0gQ29tcG9zZWRGcm9tTWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGFyZ3MgLSBQcm9wZXJ0eSBuYW1lcyB0byBjb21wb3NlIGZyb21cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzZXBhcmF0b3IgLSBDaGFyYWN0ZXIgdXNlZCB0byBqb2luIHRoZSBjb21wb3NlZCB2YWx1ZXNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaGFzaFJlc3VsdCAtIFdoZXRoZXIgdG8gaGFzaCB0aGUgY29tcG9zZWQgcmVzdWx0XG4gKiBAcHJvcGVydHkge1wia2V5c1wifFwidmFsdWVzXCJ9IHR5cGUgLSBXaGV0aGVyIHRvIHVzZSBwcm9wZXJ0eSBrZXlzIG9yIHZhbHVlc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwcmVmaXhdIC0gT3B0aW9uYWwgcHJlZml4IHRvIGFkZCB0byB0aGUgY29tcG9zZWQgdmFsdWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc3VmZml4XSAtIE9wdGlvbmFsIHN1ZmZpeCB0byBhZGQgdG8gdGhlIGNvbXBvc2VkIHZhbHVlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IHR5cGUgQ29tcG9zZWRGcm9tTWV0YWRhdGEgPSB7XG4gIGFyZ3M6IHN0cmluZ1tdO1xuICBzZXBhcmF0b3I6IHN0cmluZztcbiAgaGFzaFJlc3VsdDogYm9vbGVhbjtcbiAgdHlwZTogXCJrZXlzXCIgfCBcInZhbHVlc1wiO1xuICBwcmVmaXg/OiBzdHJpbmc7XG4gIHN1ZmZpeD86IHN0cmluZztcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbXBvc2VzIGEgcHJvcGVydHkgdmFsdWUgZnJvbSBvdGhlciBwcm9wZXJ0aWVzIGR1cmluZyBjcmVhdGUgb3IgdXBkYXRlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IENhbGxiYWNrIGZ1bmN0aW9uIHVzZWQgYnkgY29tcG9zZWQgZGVjb3JhdG9ycyB0byBnZW5lcmF0ZSBhIHByb3BlcnR5IHZhbHVlIGZyb20gb3RoZXIgcHJvcGVydGllc1xuICogQHRlbXBsYXRlIE0gLSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUeXBlIGV4dGVuZGluZyBJUmVwb3NpdG9yeVxuICogQHRlbXBsYXRlIFYgLSBUeXBlIGV4dGVuZGluZyBDb21wb3NlZEZyb21NZXRhZGF0YVxuICogQHRlbXBsYXRlIEYgLSBUeXBlIGV4dGVuZGluZyBSZXBvc2l0b3J5RmxhZ3NcbiAqIEB0ZW1wbGF0ZSBDIC0gVHlwZSBleHRlbmRpbmcgQ29udGV4dFxuICogQHBhcmFtIHtDfSBjb250ZXh0IC0gVGhlIG9wZXJhdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBNZXRhZGF0YSBmb3IgdGhlIGNvbXBvc2l0aW9uXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byBzZXQgdGhlIGNvbXBvc2VkIHZhbHVlIG9uXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGJlaW5nIHByb2Nlc3NlZFxuICogQHJldHVybiB7dm9pZH1cbiAqIEBmdW5jdGlvbiBjb21wb3NlZEZyb21DcmVhdGVVcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZWRGcm9tQ3JlYXRlVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBJUmVwb3NpdG9yeTxNLCBGLCBDPixcbiAgViBleHRlbmRzIENvbXBvc2VkRnJvbU1ldGFkYXRhLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzID0gUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4+KHRoaXM6IFIsIGNvbnRleHQ6IEMsIGRhdGE6IFYsIGtleToga2V5b2YgTSwgbW9kZWw6IE0pIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB7IGFyZ3MsIHR5cGUsIHByZWZpeCwgc3VmZml4LCBzZXBhcmF0b3IgfSA9IGRhdGE7XG4gICAgY29uc3QgY29tcG9zZWQgPSBhcmdzLm1hcCgoYXJnOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghKGFyZyBpbiBtb2RlbCkpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBQcm9wZXJ0eSAke2FyZ30gbm90IGZvdW5kIHRvIGNvbXBvc2UgZnJvbWApO1xuICAgICAgaWYgKHR5cGUgPT09IFwia2V5c1wiKSByZXR1cm4gYXJnO1xuICAgICAgaWYgKHR5cGVvZiAobW9kZWwgYXMgYW55KVthcmddID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgUHJvcGVydHkgJHthcmdzfSBkb2VzIG5vdCBjb250YWluIGEgdmFsdWUgdG8gY29tcG9zZSBmcm9tYFxuICAgICAgICApO1xuICAgICAgcmV0dXJuICgobW9kZWwgYXMgYW55KVthcmddIGFzIGFueSkudG9TdHJpbmcoKTtcbiAgICB9KTtcblxuICAgIGlmIChwcmVmaXgpIGNvbXBvc2VkLnVuc2hpZnQocHJlZml4KTtcbiAgICBpZiAoc3VmZml4KSBjb21wb3NlZC5wdXNoKHN1ZmZpeCk7XG5cbiAgICAobW9kZWwgYXMgYW55KVtrZXldID0gY29tcG9zZWQuam9pbihzZXBhcmF0b3IpO1xuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgRmFpbGVkIHRvIGNvbXBvc2UgdmFsdWU6ICR7ZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgZGVjb3JhdG9yIHRoYXQgY29tcG9zZXMgYSBwcm9wZXJ0eSB2YWx1ZSBmcm9tIG90aGVyIHByb3BlcnRpZXNcbiAqIEBzdW1tYXJ5IEJhc2UgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIHByb3BlcnR5IGNvbXBvc2l0aW9uIGRlY29yYXRvcnNcbiAqIEBwYXJhbSB7c3RyaW5nW119IGFyZ3MgLSBQcm9wZXJ0eSBuYW1lcyB0byBjb21wb3NlIGZyb21cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2hhc2hSZXN1bHQ9ZmFsc2VdIC0gV2hldGhlciB0byBoYXNoIHRoZSBjb21wb3NlZCByZXN1bHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc2VwYXJhdG9yPURlZmF1bHRTZXBhcmF0b3JdIC0gQ2hhcmFjdGVyIHVzZWQgdG8gam9pbiB0aGUgY29tcG9zZWQgdmFsdWVzXG4gKiBAcGFyYW0ge1wia2V5c1wifFwidmFsdWVzXCJ9IFt0eXBlPVwidmFsdWVzXCJdIC0gV2hldGhlciB0byB1c2UgcHJvcGVydHkga2V5cyBvciB2YWx1ZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJlZml4PVwiXCJdIC0gT3B0aW9uYWwgcHJlZml4IHRvIGFkZCB0byB0aGUgY29tcG9zZWQgdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc3VmZml4PVwiXCJdIC0gT3B0aW9uYWwgc3VmZml4IHRvIGFkZCB0byB0aGUgY29tcG9zZWQgdmFsdWVcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBjb21wb3NlZEZyb21cbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eURlY29yYXRvcnNcbiAqL1xuZnVuY3Rpb24gY29tcG9zZWRGcm9tKFxuICBhcmdzOiBzdHJpbmdbXSxcbiAgaGFzaFJlc3VsdDogYm9vbGVhbiA9IGZhbHNlLFxuICBzZXBhcmF0b3I6IHN0cmluZyA9IERlZmF1bHRTZXBhcmF0b3IsXG4gIHR5cGU6IFwia2V5c1wiIHwgXCJ2YWx1ZXNcIiA9IFwidmFsdWVzXCIsXG4gIHByZWZpeCA9IFwiXCIsXG4gIHN1ZmZpeCA9IFwiXCJcbikge1xuICBjb25zdCBkYXRhOiBDb21wb3NlZEZyb21NZXRhZGF0YSA9IHtcbiAgICBhcmdzOiBhcmdzLFxuICAgIGhhc2hSZXN1bHQ6IGhhc2hSZXN1bHQsXG4gICAgc2VwYXJhdG9yOiBzZXBhcmF0b3IsXG4gICAgdHlwZTogdHlwZSxcbiAgICBwcmVmaXg6IHByZWZpeCxcbiAgICBzdWZmaXg6IHN1ZmZpeCxcbiAgfTtcblxuICBjb25zdCBkZWNvcmF0b3JzID0gW1xuICAgIG9uQ3JlYXRlVXBkYXRlKGNvbXBvc2VkRnJvbUNyZWF0ZVVwZGF0ZSwgZGF0YSksXG4gICAgcHJvcE1ldGFkYXRhKFJlcG9zaXRvcnkua2V5KERCS2V5cy5DT01QT1NFRCksIGRhdGEpLFxuICBdO1xuICBpZiAoaGFzaFJlc3VsdCkgZGVjb3JhdG9ycy5wdXNoKGhhc2goKSk7XG4gIHJldHVybiBhcHBseSguLi5kZWNvcmF0b3JzKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGRlY29yYXRvciB0aGF0IGNvbXBvc2VzIGEgcHJvcGVydHkgdmFsdWUgZnJvbSBwcm9wZXJ0eSBrZXlzXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBnZW5lcmF0ZXMgYSBwcm9wZXJ0eSB2YWx1ZSBieSBqb2luaW5nIHRoZSBuYW1lcyBvZiBvdGhlciBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzIC0gUHJvcGVydHkgbmFtZXMgdG8gY29tcG9zZSBmcm9tXG4gKiBAcGFyYW0ge3N0cmluZ30gW3NlcGFyYXRvcj1EZWZhdWx0U2VwYXJhdG9yXSAtIENoYXJhY3RlciB1c2VkIHRvIGpvaW4gdGhlIHByb3BlcnR5IG5hbWVzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtoYXNoPWZhbHNlXSAtIFdoZXRoZXIgdG8gaGFzaCB0aGUgY29tcG9zZWQgcmVzdWx0XG4gKiBAcGFyYW0ge3N0cmluZ30gW3ByZWZpeD1cIlwiXSAtIE9wdGlvbmFsIHByZWZpeCB0byBhZGQgdG8gdGhlIGNvbXBvc2VkIHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N1ZmZpeD1cIlwiXSAtIE9wdGlvbmFsIHN1ZmZpeCB0byBhZGQgdG8gdGhlIGNvbXBvc2VkIHZhbHVlXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gY29tcG9zZWRGcm9tS2V5c1xuICogQGNhdGVnb3J5IFByb3BlcnR5RGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZWRGcm9tS2V5cyhcbiAgYXJnczogc3RyaW5nW10sXG4gIHNlcGFyYXRvcjogc3RyaW5nID0gRGVmYXVsdFNlcGFyYXRvcixcbiAgaGFzaDogYm9vbGVhbiA9IGZhbHNlLFxuICBwcmVmaXggPSBcIlwiLFxuICBzdWZmaXggPSBcIlwiXG4pIHtcbiAgcmV0dXJuIGNvbXBvc2VkRnJvbShhcmdzLCBoYXNoLCBzZXBhcmF0b3IsIFwia2V5c1wiLCBwcmVmaXgsIHN1ZmZpeCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBkZWNvcmF0b3IgdGhhdCBjb21wb3NlcyBhIHByb3BlcnR5IHZhbHVlIGZyb20gcHJvcGVydHkgdmFsdWVzXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBnZW5lcmF0ZXMgYSBwcm9wZXJ0eSB2YWx1ZSBieSBqb2luaW5nIHRoZSB2YWx1ZXMgb2Ygb3RoZXIgcHJvcGVydGllc1xuICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncyAtIFByb3BlcnR5IG5hbWVzIHdob3NlIHZhbHVlcyB3aWxsIGJlIGNvbXBvc2VkXG4gKiBAcGFyYW0ge3N0cmluZ30gW3NlcGFyYXRvcj1EZWZhdWx0U2VwYXJhdG9yXSAtIENoYXJhY3RlciB1c2VkIHRvIGpvaW4gdGhlIHByb3BlcnR5IHZhbHVlc1xuICogQHBhcmFtIHtib29sZWFufSBbaGFzaD1mYWxzZV0gLSBXaGV0aGVyIHRvIGhhc2ggdGhlIGNvbXBvc2VkIHJlc3VsdFxuICogQHBhcmFtIHtzdHJpbmd9IFtwcmVmaXg9XCJcIl0gLSBPcHRpb25hbCBwcmVmaXggdG8gYWRkIHRvIHRoZSBjb21wb3NlZCB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IFtzdWZmaXg9XCJcIl0gLSBPcHRpb25hbCBzdWZmaXggdG8gYWRkIHRvIHRoZSBjb21wb3NlZCB2YWx1ZVxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIGNvbXBvc2VkXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHlEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb3NlZChcbiAgYXJnczogc3RyaW5nW10sXG4gIHNlcGFyYXRvcjogc3RyaW5nID0gRGVmYXVsdFNlcGFyYXRvcixcbiAgaGFzaDogYm9vbGVhbiA9IGZhbHNlLFxuICBwcmVmaXggPSBcIlwiLFxuICBzdWZmaXggPSBcIlwiXG4pIHtcbiAgcmV0dXJuIGNvbXBvc2VkRnJvbShhcmdzLCBoYXNoLCBzZXBhcmF0b3IsIFwidmFsdWVzXCIsIHByZWZpeCwgc3VmZml4KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgdXBkYXRlcyBhIHZlcnNpb24gcHJvcGVydHkgZHVyaW5nIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IEZhY3RvcnkgZnVuY3Rpb24gdGhhdCBnZW5lcmF0ZXMgYSBjYWxsYmFjayBmb3IgaW5jcmVtZW50aW5nIHZlcnNpb24gbnVtYmVyc1xuICogQHBhcmFtIHtDcnVkT3BlcmF0aW9uc30gb3BlcmF0aW9uIC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uIChDUkVBVEUgb3IgVVBEQVRFKVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB1cGRhdGVzIHRoZSB2ZXJzaW9uIHByb3BlcnR5XG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFR5cGUgZXh0ZW5kaW5nIElSZXBvc2l0b3J5XG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFR5cGUgZXh0ZW5kaW5nIFJlcG9zaXRvcnlGbGFnc1xuICogQHRlbXBsYXRlIEMgLSBUeXBlIGV4dGVuZGluZyBDb250ZXh0XG4gKiBAZnVuY3Rpb24gdmVyc2lvbkNyZWF0ZVVwZGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCB2ZXJzaW9uQ3JlYXRlVXBkYXRlXG4gKlxuICogICBDYWxsZXItPj52ZXJzaW9uQ3JlYXRlVXBkYXRlOiBvcGVyYXRpb25cbiAqICAgdmVyc2lvbkNyZWF0ZVVwZGF0ZS0tPj5DYWxsZXI6IGNhbGxiYWNrIGZ1bmN0aW9uXG4gKiAgIE5vdGUgb3ZlciBDYWxsZXIsdmVyc2lvbkNyZWF0ZVVwZGF0ZTogV2hlbiBjYWxsYmFjayBpcyBleGVjdXRlZDpcbiAqICAgQ2FsbGVyLT4+dmVyc2lvbkNyZWF0ZVVwZGF0ZTogY29udGV4dCwgZGF0YSwga2V5LCBtb2RlbFxuICogICBhbHQgb3BlcmF0aW9uIGlzIENSRUFURVxuICogICAgIHZlcnNpb25DcmVhdGVVcGRhdGUtPj52ZXJzaW9uQ3JlYXRlVXBkYXRlOiBzZXQgdmVyc2lvbiB0byAxXG4gKiAgIGVsc2Ugb3BlcmF0aW9uIGlzIFVQREFURVxuICogICAgIHZlcnNpb25DcmVhdGVVcGRhdGUtPj52ZXJzaW9uQ3JlYXRlVXBkYXRlOiBpbmNyZW1lbnQgdmVyc2lvblxuICogICBlbHNlIGludmFsaWQgb3BlcmF0aW9uXG4gKiAgICAgdmVyc2lvbkNyZWF0ZVVwZGF0ZS0+PnZlcnNpb25DcmVhdGVVcGRhdGU6IHRocm93IGVycm9yXG4gKiAgIGVuZFxuICogICB2ZXJzaW9uQ3JlYXRlVXBkYXRlLS0+PkNhbGxlcjogdm9pZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyc2lvbkNyZWF0ZVVwZGF0ZShvcGVyYXRpb246IENydWRPcGVyYXRpb25zKSB7XG4gIHJldHVybiBmdW5jdGlvbiB2ZXJzaW9uQ3JlYXRlVXBkYXRlPFxuICAgIE0gZXh0ZW5kcyBNb2RlbCxcbiAgICBSIGV4dGVuZHMgSVJlcG9zaXRvcnk8TSwgRiwgQz4sXG4gICAgViBleHRlbmRzIG9iamVjdCxcbiAgICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzID0gUmVwb3NpdG9yeUZsYWdzLFxuICAgIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbiAgPih0aGlzOiBSLCBjb250ZXh0OiBDLCBkYXRhOiBWLCBrZXk6IGtleW9mIE0sIG1vZGVsOiBNKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN3aXRjaCAob3BlcmF0aW9uKSB7XG4gICAgICAgIGNhc2UgT3BlcmF0aW9uS2V5cy5DUkVBVEU6XG4gICAgICAgICAgKG1vZGVsIGFzIGFueSlba2V5XSA9IDE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgT3BlcmF0aW9uS2V5cy5VUERBVEU6XG4gICAgICAgICAgKG1vZGVsIGFzIGFueSlba2V5XSsrO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBJbnZhbGlkIG9wZXJhdGlvbjogJHtvcGVyYXRpb259YCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byB1cGRhdGUgdmVyc2lvbjogJHtlfWApO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGRlY29yYXRvciBmb3IgdmVyc2lvbmluZyBhIHByb3BlcnR5IGluIGEgbW9kZWxcbiAqIEBzdW1tYXJ5IFRoaXMgZGVjb3JhdG9yIGFwcGxpZXMgbXVsdGlwbGUgc3ViLWRlY29yYXRvcnMgdG8gaGFuZGxlIHZlcnNpb24gbWFuYWdlbWVudCBkdXJpbmcgY3JlYXRlIGFuZCB1cGRhdGUgb3BlcmF0aW9uc1xuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgY29tcG9zaXRlIGRlY29yYXRvciB0aGF0IHNldHMgdGhlIHR5cGUgdG8gTnVtYmVyLCBtYW5hZ2VzIHZlcnNpb24gdXBkYXRlcywgYW5kIGFkZHMgdmVyc2lvbmluZyBtZXRhZGF0YVxuICogQGZ1bmN0aW9uIHZlcnNpb25cbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eURlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcnNpb24oKSB7XG4gIGNvbnN0IGtleSA9IFJlcG9zaXRvcnkua2V5KERCS2V5cy5WRVJTSU9OKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKFxuICAgICAgdHlwZShOdW1iZXIubmFtZSksXG4gICAgICBvbkNyZWF0ZSh2ZXJzaW9uQ3JlYXRlVXBkYXRlKE9wZXJhdGlvbktleXMuQ1JFQVRFKSksXG4gICAgICBvblVwZGF0ZSh2ZXJzaW9uQ3JlYXRlVXBkYXRlKE9wZXJhdGlvbktleXMuVVBEQVRFKSksXG4gICAgICBwcm9wTWV0YWRhdGEoa2V5LCB0cnVlKVxuICAgIClcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGRlY29yYXRvciB0aGF0IG1hcmtzIGEgcHJvcGVydHkgYXMgdHJhbnNpZW50XG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBpbmRpY2F0ZXMgYSBwcm9wZXJ0eSBzaG91bGQgbm90IGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2VcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiB0cmFuc2llbnRcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eURlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zaWVudCgpIHtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoREJLZXlzLlRSQU5TSUVOVCk7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZShmdW5jdGlvbiB0cmFuc2llbnQobW9kZWw6IGFueSwgYXR0cmlidXRlOiBhbnkpIHtcbiAgICAgIHByb3BNZXRhZGF0YShSZXBvc2l0b3J5LmtleShEQktleXMuVFJBTlNJRU5UKSwgdHJ1ZSkobW9kZWwsIGF0dHJpYnV0ZSk7XG4gICAgICBwcm9wTWV0YWRhdGEoUmVwb3NpdG9yeS5rZXkoREJLZXlzLlRSQU5TSUVOVCksIHRydWUpKG1vZGVsLmNvbnN0cnVjdG9yKTtcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuIiwiaW1wb3J0IHtcbiAgTW9kZWwsXG4gIE1vZGVsQ29uZGl0aW9uYWxBc3luYyxcbiAgdmFsaWRhdGUsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IHZhbGlkYXRlQ29tcGFyZSB9IGZyb20gXCIuL3ZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdGVzIHRoZSBtb2RlbCBhbmQgY2hlY2tzIGZvciBlcnJvcnNcbiAqIEBzdW1tYXJ5IFZhbGlkYXRlcyB0aGUgY3VycmVudCBtb2RlbCBzdGF0ZSBhbmQgb3B0aW9uYWxseSBjb21wYXJlcyB3aXRoIGEgcHJldmlvdXMgdmVyc2lvblxuICogQHRlbXBsYXRlIE0gLSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHBhcmFtIHtNfGFueX0gW3ByZXZpb3VzVmVyc2lvbl0gLSBPcHRpb25hbCBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoZSBtb2RlbCBmb3IgY29tcGFyaXNvblxuICogQHBhcmFtIHsuLi5hbnlbXX0gZXhjbHVzaW9ucyAtIFByb3BlcnRpZXMgdG8gZXhjbHVkZSBmcm9tIHZhbGlkYXRpb25cbiAqIEByZXR1cm4ge01vZGVsRXJyb3JEZWZpbml0aW9ufHVuZGVmaW5lZH0gRXJyb3IgZGVmaW5pdGlvbiBpZiB2YWxpZGF0aW9uIGZhaWxzLCB1bmRlZmluZWQgb3RoZXJ3aXNlXG4gKiBAZnVuY3Rpb24gaGFzRXJyb3JzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuTW9kZWwucHJvdG90eXBlLmhhc0Vycm9ycyA9IGZ1bmN0aW9uIDxNIGV4dGVuZHMgTW9kZWw8dHJ1ZSB8IGZhbHNlPj4oXG4gIHRoaXM6IE0sXG4gIHByZXZpb3VzVmVyc2lvbj86IE0gfCBhbnksXG4gIC4uLmV4Y2x1c2lvbnM6IGFueVtdXG4pOiBNb2RlbENvbmRpdGlvbmFsQXN5bmM8TT4ge1xuICBpZiAocHJldmlvdXNWZXJzaW9uICYmICEocHJldmlvdXNWZXJzaW9uIGluc3RhbmNlb2YgTW9kZWwpKSB7XG4gICAgZXhjbHVzaW9ucy51bnNoaWZ0KHByZXZpb3VzVmVyc2lvbik7XG4gICAgcHJldmlvdXNWZXJzaW9uID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgYXN5bmMgPSB0aGlzLmlzQXN5bmMoKTtcbiAgY29uc3QgZXJycyA9IHZhbGlkYXRlKHRoaXMsIGFzeW5jLCAuLi5leGNsdXNpb25zKTtcblxuICBpZiAoYXN5bmMpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGVycnMpLnRoZW4oKHJlc29sdmVkRXJycykgPT4ge1xuICAgICAgaWYgKHJlc29sdmVkRXJycyB8fCAhcHJldmlvdXNWZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlZEVycnM7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsaWRhdGVDb21wYXJlKHByZXZpb3VzVmVyc2lvbiwgdGhpcywgYXN5bmMsIC4uLmV4Y2x1c2lvbnMpO1xuICAgIH0pIGFzIGFueTtcbiAgfVxuXG4gIGlmIChlcnJzIHx8ICFwcmV2aW91c1ZlcnNpb24pIHJldHVybiBlcnJzIGFzIGFueTtcblxuICAvLyBAdHMtZXhwZWN0LWVycm9yIE92ZXJyaWRpbmcgTW9kZWwgcHJvdG90eXBlIG1ldGhvZCB3aXRoIGR5bmFtaWMgY29uZGl0aW9uYWwgcmV0dXJuIHR5cGUuXG4gIHJldHVybiB2YWxpZGF0ZUNvbXBhcmUocHJldmlvdXNWZXJzaW9uLCB0aGlzLCBhc3luYywgLi4uZXhjbHVzaW9ucyk7XG59O1xuIiwiaW1wb3J0IHtcbiAgZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzUmVjdXJzaXZlLFxuICBSZXBvc2l0b3J5LFxuICBTZXJpYWxpemF0aW9uRXJyb3IsXG59IGZyb20gXCIuLi9yZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IERCS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYSBtb2RlbCBpcyBtYXJrZWQgYXMgdHJhbnNpZW50XG4gKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHdoZXRoZXIgYSBtb2RlbCBjbGFzcyBoYXMgYmVlbiBkZWNvcmF0ZWQgd2l0aCB0aGUgdHJhbnNpZW50IGRlY29yYXRvclxuICogQHRlbXBsYXRlIE0gLSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBjaGVja1xuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgbW9kZWwgaXMgdHJhbnNpZW50LCBmYWxzZSBvdGhlcndpc2VcbiAqIEBmdW5jdGlvbiBpc1RyYW5zaWVudFxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RyYW5zaWVudDxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gIHJldHVybiAhIShcbiAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFJlcG9zaXRvcnkua2V5KERCS2V5cy5UUkFOU0lFTlQpLCBtb2RlbC5jb25zdHJ1Y3RvcikgfHxcbiAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgUmVwb3NpdG9yeS5rZXkoREJLZXlzLlRSQU5TSUVOVCksXG4gICAgICBNb2RlbC5nZXQobW9kZWwuY29uc3RydWN0b3IubmFtZSkgYXMgYW55XG4gICAgKVxuICApO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTZXBhcmF0ZXMgdHJhbnNpZW50IHByb3BlcnRpZXMgZnJvbSBhIG1vZGVsXG4gKiBAc3VtbWFyeSBFeHRyYWN0cyBwcm9wZXJ0aWVzIG1hcmtlZCBhcyB0cmFuc2llbnQgaW50byBhIHNlcGFyYXRlIG9iamVjdFxuICogQHRlbXBsYXRlIE0gLSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBwcm9jZXNzXG4gKiBAcmV0dXJuIHtPYmplY3R9IE9iamVjdCBjb250YWluaW5nIHRoZSBtb2RlbCB3aXRob3V0IHRyYW5zaWVudCBwcm9wZXJ0aWVzIGFuZCBhIHNlcGFyYXRlIHRyYW5zaWVudCBvYmplY3RcbiAqIEBwcm9wZXJ0eSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgd2l0aCB0cmFuc2llbnQgcHJvcGVydGllcyByZW1vdmVkXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGFueT59IFt0cmFuc2llbnRdIC0gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHRyYW5zaWVudCBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gbW9kZWxUb1RyYW5zaWVudFxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBtb2RlbFRvVHJhbnNpZW50XG4gKiAgIHBhcnRpY2lwYW50IGlzVHJhbnNpZW50XG4gKiAgIHBhcnRpY2lwYW50IGdldEFsbFByb3BlcnR5RGVjb3JhdG9yc1JlY3Vyc2l2ZVxuICpcbiAqICAgQ2FsbGVyLT4+bW9kZWxUb1RyYW5zaWVudDogbW9kZWxcbiAqICAgbW9kZWxUb1RyYW5zaWVudC0+PmlzVHJhbnNpZW50OiBjaGVjayBpZiBtb2RlbCBpcyB0cmFuc2llbnRcbiAqICAgaXNUcmFuc2llbnQtLT4+bW9kZWxUb1RyYW5zaWVudDogdHJhbnNpZW50IHN0YXR1c1xuICogICBhbHQgbW9kZWwgaXMgbm90IHRyYW5zaWVudFxuICogICAgIG1vZGVsVG9UcmFuc2llbnQtLT4+Q2FsbGVyOiB7bW9kZWx9XG4gKiAgIGVsc2UgbW9kZWwgaXMgdHJhbnNpZW50XG4gKiAgICAgbW9kZWxUb1RyYW5zaWVudC0+PmdldEFsbFByb3BlcnR5RGVjb3JhdG9yc1JlY3Vyc2l2ZTogZ2V0IHRyYW5zaWVudCBwcm9wZXJ0aWVzXG4gKiAgICAgZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzUmVjdXJzaXZlLS0+Pm1vZGVsVG9UcmFuc2llbnQ6IHByb3BlcnR5IGRlY29yYXRvcnNcbiAqICAgICBtb2RlbFRvVHJhbnNpZW50LT4+bW9kZWxUb1RyYW5zaWVudDogc2VwYXJhdGUgcHJvcGVydGllc1xuICogICAgIG1vZGVsVG9UcmFuc2llbnQtPj5Nb2RlbC5idWlsZDogcmVidWlsZCBtb2RlbCB3aXRob3V0IHRyYW5zaWVudCBwcm9wc1xuICogICAgIG1vZGVsVG9UcmFuc2llbnQtLT4+Q2FsbGVyOiB7bW9kZWwsIHRyYW5zaWVudH1cbiAqICAgZW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbFRvVHJhbnNpZW50PE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNXG4pOiB7IG1vZGVsOiBNOyB0cmFuc2llbnQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH0ge1xuICBpZiAoIWlzVHJhbnNpZW50KG1vZGVsKSkgcmV0dXJuIHsgbW9kZWw6IG1vZGVsIH07XG4gIGNvbnN0IGRlY3M6IFJlY29yZDxzdHJpbmcsIGFueVtdPiA9IGdldEFsbFByb3BlcnR5RGVjb3JhdG9yc1JlY3Vyc2l2ZShcbiAgICBtb2RlbCxcbiAgICB1bmRlZmluZWQsXG4gICAgUmVwb3NpdG9yeS5rZXkoREJLZXlzLlRSQU5TSUVOVClcbiAgKSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnlbXT47XG5cbiAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmVudHJpZXMoZGVjcykucmVkdWNlKFxuICAgIChcbiAgICAgIGFjY3VtOiB7IG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+OyB0cmFuc2llbnQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH0sXG4gICAgICBbaywgdmFsXVxuICAgICkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNpZW50ID0gdmFsLmZpbmQoKGVsKSA9PiBlbC5rZXkgPT09IFwiXCIpO1xuICAgICAgaWYgKHRyYW5zaWVudCkge1xuICAgICAgICBhY2N1bS50cmFuc2llbnQgPSBhY2N1bS50cmFuc2llbnQgfHwge307XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYWNjdW0udHJhbnNpZW50W2tdID0gbW9kZWxbayBhcyBrZXlvZiBNXTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHNlcmlhbGl6ZSB0cmFuc2llbnQgcHJvcGVydHkgJHtrfTogJHtlfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY2N1bS5tb2RlbCA9IGFjY3VtLm1vZGVsIHx8IHt9O1xuICAgICAgICBhY2N1bS5tb2RlbFtrXSA9IChtb2RlbCBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LFxuICAgIHt9IGFzIHsgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT47IHRyYW5zaWVudD86IFJlY29yZDxzdHJpbmcsIGFueT4gfVxuICApO1xuICByZXN1bHQubW9kZWwgPSBNb2RlbC5idWlsZChyZXN1bHQubW9kZWwsIG1vZGVsLmNvbnN0cnVjdG9yLm5hbWUpO1xuICByZXR1cm4gcmVzdWx0IGFzIHsgbW9kZWw6IE07IHRyYW5zaWVudD86IFJlY29yZDxzdHJpbmcsIGFueT4gfTtcbn1cbiIsImV4cG9ydCAqIGZyb20gXCIuL2lkZW50aXR5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tb2RlbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vb3BlcmF0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmVwb3NpdG9yeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEYXRhYmFzZSBkZWNvcmF0b3JzIGZvciBUeXBlU2NyaXB0IGFwcGxpY2F0aW9uc1xuICogQHN1bW1hcnkgQSBjb21wcmVoZW5zaXZlIGxpYnJhcnkgcHJvdmlkaW5nIGRlY29yYXRvcnMgYW5kIHV0aWxpdGllcyBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9ucywgbW9kZWwgZGVmaW5pdGlvbnMsIHZhbGlkYXRpb24sIGFuZCByZXBvc2l0b3J5IHBhdHRlcm5zIGluIFR5cGVTY3JpcHQgYXBwbGljYXRpb25zXG4gKiBAbW9kdWxlIGRiLWRlY29yYXRvcnNcbiAqL1xuXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgcmVmbGVjdGlvbiBwYWNrYWdlXG4gKiBAc3VtbWFyeSBTdG9yZXMgdGhlIHNlbWFudGljIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBwYWNrYWdlXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl0sIm5hbWVzIjpbIk1vZGVsS2V5cyIsIlJlYWRPbmx5VmFsaWRhdG9yIiwiVmFsaWRhdG9yIiwiaXNFcXVhbCIsIl9fZGVjb3JhdGUiLCJ2YWxpZGF0b3IiLCJUaW1lc3RhbXBWYWxpZGF0b3IiLCJEZWNvcmF0b3JNZXNzYWdlcyIsIlZhbGlkYXRpb24iLCJPcGVyYXRpb25LZXlzIiwiQnVsa0NydWRPcGVyYXRpb25LZXlzIiwiSGFzaGluZyIsInByb3BNZXRhZGF0YSIsImFwcGx5IiwiUmVmbGVjdGlvbiIsIk9iamVjdEFjY3VtdWxhdG9yIiwic2YiLCJEZWNvcmF0aW9uIiwiZGF0ZSIsInJlcXVpcmVkIiwidHlwZSIsIm1ldGFkYXRhIiwiZ2V0VmFsaWRhdGlvbkRlY29yYXRvcnMiLCJWYWxpZGF0aW9uS2V5cyIsInRvQ29uZGl0aW9uYWxQcm9taXNlIiwiTW9kZWwiLCJNb2RlbEVycm9yRGVmaW5pdGlvbiIsInZhbGlkYXRlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7SUFFQTs7Ozs7SUFLRztBQUNVLFVBQUEsTUFBTSxHQUFHO0lBQ3BCLElBQUEsT0FBTyxFQUFFLENBQUEsRUFBR0EsNkJBQVMsQ0FBQyxPQUFPLENBQWMsWUFBQSxDQUFBO0lBQzNDLElBQUEsVUFBVSxFQUFFLFlBQVk7SUFDeEIsSUFBQSxLQUFLLEVBQUUsUUFBUTtJQUNmLElBQUEsRUFBRSxFQUFFLElBQUk7SUFDUixJQUFBLEtBQUssRUFBRSxPQUFPO0lBQ2QsSUFBQSxNQUFNLEVBQUUsUUFBUTtJQUNoQixJQUFBLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLElBQUEsUUFBUSxFQUFFLFVBQVU7SUFDcEIsSUFBQSxTQUFTLEVBQUUsV0FBVztJQUN0QixJQUFBLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLElBQUEsSUFBSSxFQUFFLE1BQU07SUFDWixJQUFBLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLElBQUEsT0FBTyxFQUFFLFNBQVM7SUFDbEIsSUFBQSxRQUFRLEVBQUUsZUFBZTs7SUFHM0I7Ozs7O0lBS0c7QUFDSSxVQUFNLGdCQUFnQixHQUFHO0lBRWhDOzs7OztJQUtHO0FBQ0ksVUFBTSx3QkFBd0IsR0FBRzs7SUNyQ3hDOzs7Ozs7Ozs7Ozs7Ozs7SUFlRztBQUNVLFVB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
2989
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGItZGVjb3JhdG9ycy5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9tb2RlbC9jb25zdGFudHMudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9jb25zdGFudHMudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi92YWxpZGF0b3JzL1JlYWRPbmx5VmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vdmFsaWRhdG9ycy9UaW1lc3RhbXBWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi92YWxpZGF0b3JzL1VwZGF0ZVZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL3ZhbGlkYXRpb24udHMiLCIuLi9zcmMvb3BlcmF0aW9ucy9jb25zdGFudHMudHMiLCIuLi9zcmMvb3BlcmF0aW9ucy9PcGVyYXRpb25zUmVnaXN0cnkudHMiLCIuLi9zcmMvb3BlcmF0aW9ucy9PcGVyYXRpb25zLnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvZXJyb3JzLnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvdXRpbHMudHMiLCIuLi9zcmMvb3BlcmF0aW9ucy9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvQ29udGV4dC50cyIsIi4uL3NyYy9yZXBvc2l0b3J5L3dyYXBwZXJzLnRzIiwiLi4vc3JjL2lkZW50aXR5L3V0aWxzLnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvQmFzZVJlcG9zaXRvcnkudHMiLCIuLi9zcmMvcmVwb3NpdG9yeS9SZXBvc2l0b3J5LnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9pZGVudGl0eS9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL21vZGVsL3ZhbGlkYXRpb24udHMiLCIuLi9zcmMvbW9kZWwvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9tb2RlbC9vdmVycmlkZXMudHMiLCIuLi9zcmMvbW9kZWwvdXRpbHMudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTW9kZWxLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEYXRhYmFzZSByZWZsZWN0aW9uIGtleXNcbiAqIEBzdW1tYXJ5IENvbGxlY3Rpb24gb2Yga2V5cyB1c2VkIGZvciByZWZsZWN0aW9uIG1ldGFkYXRhIGluIGRhdGFiYXNlIG9wZXJhdGlvbnNcbiAqIEBjb25zdCBEQktleXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgREJLZXlzID0ge1xuICBSRUZMRUNUOiBgJHtNb2RlbEtleXMuUkVGTEVDVH1wZXJzaXN0ZW5jZS5gLFxuICBSRVBPU0lUT1JZOiBcInJlcG9zaXRvcnlcIixcbiAgQ0xBU1M6IFwiX2NsYXNzXCIsXG4gIElEOiBcImlkXCIsXG4gIElOREVYOiBcImluZGV4XCIsXG4gIFVOSVFVRTogXCJ1bmlxdWVcIixcbiAgU0VSSUFMSVpFOiBcInNlcmlhbGl6ZVwiLFxuICBSRUFET05MWTogXCJyZWFkb25seVwiLFxuICBUSU1FU1RBTVA6IFwidGltZXN0YW1wXCIsXG4gIFRSQU5TSUVOVDogXCJ0cmFuc2llbnRcIixcbiAgSEFTSDogXCJoYXNoXCIsXG4gIENPTVBPU0VEOiBcImNvbXBvc2VkXCIsXG4gIFZFUlNJT046IFwidmVyc2lvblwiLFxuICBPUklHSU5BTDogXCJfX29yaWdpbmFsT2JqXCIsXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IHNlcGFyYXRvciBjaGFyYWN0ZXIgZm9yIGNvbXBvc2l0ZSBpbmRleGVzXG4gKiBAc3VtbWFyeSBUaGUgZGVmYXVsdCBzZXBhcmF0b3IgY2hhcmFjdGVyIHVzZWQgd2hlbiBjb25jYXRlbmF0aW5nIG11bHRpcGxlIGZpZWxkcyBpbnRvIGEgc2luZ2xlIGluZGV4XG4gKiBAY29uc3QgRGVmYXVsdFNlcGFyYXRvclxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0U2VwYXJhdG9yID0gXCJfXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgZm9ybWF0IGZvciB0aW1lc3RhbXAgZmllbGRzXG4gKiBAc3VtbWFyeSBTdGFuZGFyZCBkYXRlIGZvcm1hdCBzdHJpbmcgdXNlZCBmb3IgdGltZXN0YW1wIGZpZWxkcyBpbiBkYXRhYmFzZSBtb2RlbHNcbiAqIEBjb25zdCBERUZBVUxUX1RJTUVTVEFNUF9GT1JNQVRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9USU1FU1RBTVBfRk9STUFUID0gXCJkZC9NTS95eXl5IEhIOm1tOnNzOlNcIjtcbiIsImltcG9ydCB7IERCS2V5cyB9IGZyb20gXCIuLi9tb2RlbC9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29sbGVjdGlvbiBvZiBkZWZhdWx0IGVycm9yIG1lc3NhZ2VzIHVzZWQgYnkgdmFsaWRhdG9ycy5cbiAqIEBzdW1tYXJ5IEhvbGRzIHRoZSBkZWZhdWx0IGVycm9yIG1lc3NhZ2VzIGZvciB2YXJpb3VzIHZhbGlkYXRpb24gc2NlbmFyaW9zIGluY2x1ZGluZyBJRCB2YWxpZGF0aW9uLCByZWFkb25seSBwcm9wZXJ0aWVzLCBhbmQgdGltZXN0YW1wcy5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IEVycm9yTWVzc2FnZXNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBJRCAtIEVycm9yIG1lc3NhZ2VzIGZvciBJRCB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSUQuSU5WQUxJRCAtIEVycm9yIG1lc3NhZ2Ugd2hlbiBhbiBJRCBpcyBpbnZhbGlkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSUQuUkVRVUlSRUQgLSBFcnJvciBtZXNzYWdlIHdoZW4gYW4gSUQgaXMgbWlzc2luZ1xuICogQHByb3BlcnR5IHtPYmplY3R9IFJFQURPTkxZIC0gRXJyb3IgbWVzc2FnZXMgZm9yIHJlYWRvbmx5IHByb3BlcnRpZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRUFET05MWS5JTlZBTElEIC0gRXJyb3IgbWVzc2FnZSB3aGVuIGF0dGVtcHRpbmcgdG8gdXBkYXRlIGEgcmVhZG9ubHkgcHJvcGVydHlcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBUSU1FU1RBTVAgLSBFcnJvciBtZXNzYWdlcyBmb3IgdGltZXN0YW1wIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBUSU1FU1RBTVAuUkVRVUlSRUQgLSBFcnJvciBtZXNzYWdlIHdoZW4gYSB0aW1lc3RhbXAgaXMgbWlzc2luZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFRJTUVTVEFNUC5EQVRFIC0gRXJyb3IgbWVzc2FnZSB3aGVuIGEgdGltZXN0YW1wIGlzIG5vdCBhIHZhbGlkIGRhdGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBUSU1FU1RBTVAuSU5WQUxJRCAtIEVycm9yIG1lc3NhZ2Ugd2hlbiBhIHRpbWVzdGFtcCBpcyBub3QgaW5jcmVhc2luZ1xuICogQGNvbnN0IERFRkFVTFRfRVJST1JfTUVTU0FHRVNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dmFsaWRhdGlvblxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyA9IHtcbiAgSUQ6IHtcbiAgICBJTlZBTElEOiBcIlRoaXMgSWQgaXMgaW52YWxpZFwiLFxuICAgIFJFUVVJUkVEOiBcIlRoZSBJZCBpcyBtYW5kYXRvcnlcIixcbiAgfSxcbiAgUkVBRE9OTFk6IHtcbiAgICBJTlZBTElEOiBcIlRoaXMgY2Fubm90IGJlIHVwZGF0ZWRcIixcbiAgfSxcbiAgVElNRVNUQU1QOiB7XG4gICAgUkVRVUlSRUQ6IFwiVGltZXN0YW1wIGlzIE1hbmRhdG9yeVwiLFxuICAgIERBVEU6IFwiVGhlIFRpbWVzdGFtcCBtdXN0IHRoZSBhIHZhbGlkIGRhdGVcIixcbiAgICBJTlZBTElEOiBcIlRoaXMgdmFsdWUgbXVzdCBhbHdheXMgaW5jcmVhc2VcIixcbiAgfSxcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnN0YW50cyB1c2VkIGZvciByZWZsZWN0aW9uLWJhc2VkIHZhbGlkYXRpb24gZHVyaW5nIHVwZGF0ZSBvcGVyYXRpb25zLlxuICogQHN1bW1hcnkgS2V5cyB1c2VkIGZvciBzdG9yaW5nIGFuZCByZXRyaWV2aW5nIHZhbGlkYXRpb24gbWV0YWRhdGEgb24gbW9kZWwgcHJvcGVydGllcyBkdXJpbmcgdXBkYXRlIG9wZXJhdGlvbnMuXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBWYWxpZGF0aW9uS2V5c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFRkxFQ1QgLSBCYXNlIHJlZmxlY3Rpb24ga2V5IHByZWZpeCBmb3IgdXBkYXRlIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBUSU1FU1RBTVAgLSBLZXkgZm9yIHRpbWVzdGFtcCB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVBRE9OTFkgLSBLZXkgZm9yIHJlYWRvbmx5IHByb3BlcnR5IHZhbGlkYXRpb25cbiAqIEBjb25zdCBVcGRhdGVWYWxpZGF0aW9uS2V5c1xuICogQG1lbWJlck9mIG1vZHVsZTp2YWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBVcGRhdGVWYWxpZGF0aW9uS2V5cyA9IHtcbiAgUkVGTEVDVDogXCJkYi51cGRhdGUudmFsaWRhdGlvbi5cIixcbiAgVElNRVNUQU1QOiBEQktleXMuVElNRVNUQU1QLFxuICBSRUFET05MWTogREJLZXlzLlJFQURPTkxZLFxufTtcbiIsImltcG9ydCB7IHZhbGlkYXRvciwgVmFsaWRhdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVXBkYXRlVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBpc0VxdWFsIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgdmFsaWRhdG9yIHRoYXQgZW5zdXJlcyBwcm9wZXJ0aWVzIG1hcmtlZCBhcyByZWFkb25seSBjYW5ub3QgYmUgbW9kaWZpZWQgZHVyaW5nIHVwZGF0ZXMuXG4gKiBAc3VtbWFyeSBWYWxpZGF0b3IgZm9yIHRoZSB7QGxpbmsgcmVhZG9ubHl9IGRlY29yYXRvciB0aGF0IGNoZWNrcyBpZiBhIHZhbHVlIGhhcyBiZWVuIGNoYW5nZWQgZHVyaW5nIGFuIHVwZGF0ZSBvcGVyYXRpb24uIEl0IGNvbXBhcmVzIHRoZSBuZXcgdmFsdWUgd2l0aCB0aGUgb2xkIHZhbHVlIGFuZCByZXR1cm5zIGFuIGVycm9yIG1lc3NhZ2UgaWYgdGhleSBhcmUgbm90IGVxdWFsLlxuICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIHZhbGlkYXRlZFxuICogQHBhcmFtIHthbnl9IG9sZFZhbHVlIC0gVGhlIHByZXZpb3VzIHZhbHVlIHRvIGNvbXBhcmUgYWdhaW5zdFxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSAtIE9wdGlvbmFsIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gKiBAY2xhc3MgUmVhZE9ubHlWYWxpZGF0b3JcbiAqIEBleGFtcGxlXG4gKiAvLyBVc2luZyBSZWFkT25seVZhbGlkYXRvciB3aXRoIGEgcmVhZG9ubHkgcHJvcGVydHlcbiAqIGNsYXNzIFVzZXIge1xuICogICBAcmVhZG9ubHkoKVxuICogICBpZDogc3RyaW5nO1xuICogICBcbiAqICAgbmFtZTogc3RyaW5nO1xuICogICBcbiAqICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKSB7XG4gKiAgICAgdGhpcy5pZCA9IGlkO1xuICogICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gKiAgIH1cbiAqIH1cbiAqIFxuICogLy8gVGhpcyB3aWxsIHRyaWdnZXIgdmFsaWRhdGlvbiBlcnJvciB3aGVuIHRyeWluZyB0byB1cGRhdGVcbiAqIGNvbnN0IHVzZXIgPSBuZXcgVXNlcignMTIzJywgJ0pvaG4nKTtcbiAqIHVzZXIuaWQgPSAnNDU2JzsgLy8gV2lsbCBiZSBwcmV2ZW50ZWQgYnkgUmVhZE9ubHlWYWxpZGF0b3JcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVXBkYXRlVmFsaWRhdGlvbktleXMuUkVBRE9OTFkpXG5leHBvcnQgY2xhc3MgUmVhZE9ubHlWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihERUZBVUxUX0VSUk9SX01FU1NBR0VTLlJFQURPTkxZLklOVkFMSUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgYmFzZSB2YWxpZGF0b3IncyBoYXNFcnJvcnMgbWV0aG9kLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBpcyByZXF1aXJlZCBieSB0aGUgVmFsaWRhdG9yIGludGVyZmFjZSBidXQgbm90IHVzZWQgaW4gdGhpcyB2YWxpZGF0b3IgYXMgdmFsaWRhdGlvbiBvbmx5IGhhcHBlbnMgZHVyaW5nIHVwZGF0ZXMuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBBbHdheXMgcmV0dXJucyB1bmRlZmluZWQgYXMgdGhpcyB2YWxpZGF0b3Igb25seSB3b3JrcyBkdXJpbmcgdXBkYXRlc1xuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBoYXNFcnJvcnModmFsdWU6IGFueSwgLi4uYXJnczogYW55W10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIHZhbHVlIGhhcyBiZWVuIG1vZGlmaWVkIGR1cmluZyBhbiB1cGRhdGUgb3BlcmF0aW9uLlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgYSB2YWx1ZSBoYXMgbm90IGNoYW5nZWQgYnkgY29tcGFyaW5nIGl0IHdpdGggdGhlIHByZXZpb3VzIHZhbHVlIHVzaW5nIGRlZXAgZXF1YWxpdHkuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSBuZXcgdmFsdWUgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHthbnl9IG9sZFZhbHVlIC0gVGhlIG9yaWdpbmFsIHZhbHVlIHRvIGNvbXBhcmUgYWdhaW5zdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gT3B0aW9uYWwgY3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHRcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBBbiBlcnJvciBtZXNzYWdlIGlmIHZhbGlkYXRpb24gZmFpbHMsIHVuZGVmaW5lZCBvdGhlcndpc2VcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVIYXNFcnJvcnMoXG4gICAgdmFsdWU6IGFueSxcbiAgICBvbGRWYWx1ZTogYW55LFxuICAgIG1lc3NhZ2U/OiBzdHJpbmcsXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgIHJldHVybiBpc0VxdWFsKHZhbHVlLCBvbGRWYWx1ZSlcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IHRoaXMuZ2V0TWVzc2FnZShtZXNzYWdlIHx8IHRoaXMubWVzc2FnZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IHZhbGlkYXRvciwgVmFsaWRhdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVXBkYXRlVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgdmFsaWRhdG9yIHRoYXQgZW5zdXJlcyB0aW1lc3RhbXAgdmFsdWVzIGFyZSBvbmx5IHVwZGF0ZWQgd2l0aCBuZXdlciB0aW1lc3RhbXBzLlxuICogQHN1bW1hcnkgVmFsaWRhdGVzIHRoZSB1cGRhdGUgb2YgYSB0aW1lc3RhbXAgYnkgY29tcGFyaW5nIHRoZSBuZXcgdGltZXN0YW1wIHdpdGggdGhlIG9sZCBvbmUsIGVuc3VyaW5nIHRoZSBuZXcgdGltZXN0YW1wIGlzIG1vcmUgcmVjZW50LlxuICogQHBhcmFtIHtEYXRlfHN0cmluZ3xudW1iZXJ9IHZhbHVlIC0gVGhlIHRpbWVzdGFtcCB2YWx1ZSB0byB2YWxpZGF0ZVxuICogQHBhcmFtIHtEYXRlfHN0cmluZ3xudW1iZXJ9IG9sZFZhbHVlIC0gVGhlIHByZXZpb3VzIHRpbWVzdGFtcCB0byBjb21wYXJlIGFnYWluc3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBPcHRpb25hbCBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICogQGNsYXNzIFRpbWVzdGFtcFZhbGlkYXRvclxuICogQGV4YW1wbGVcbiAqIC8vIFVzaW5nIFRpbWVzdGFtcFZhbGlkYXRvciB3aXRoIGEgdGltZXN0YW1wIHByb3BlcnR5XG4gKiBjbGFzcyBEb2N1bWVudCB7XG4gKiAgIEB0aW1lc3RhbXAoKVxuICogICB1cGRhdGVkQXQ6IERhdGU7XG4gKiAgIFxuICogICB0aXRsZTogc3RyaW5nO1xuICogICBcbiAqICAgY29uc3RydWN0b3IodGl0bGU6IHN0cmluZykge1xuICogICAgIHRoaXMudGl0bGUgPSB0aXRsZTtcbiAqICAgICB0aGlzLnVwZGF0ZWRBdCA9IG5ldyBEYXRlKCk7XG4gKiAgIH1cbiAqIH1cbiAqIFxuICogLy8gVGhpcyB3aWxsIHRyaWdnZXIgdmFsaWRhdGlvbiBlcnJvciB3aGVuIHRyeWluZyB0byB1cGRhdGUgd2l0aCBhbiBvbGRlciB0aW1lc3RhbXBcbiAqIGNvbnN0IGRvYyA9IG5ldyBEb2N1bWVudCgnTXkgRG9jdW1lbnQnKTtcbiAqIGNvbnN0IG9sZERhdGUgPSBuZXcgRGF0ZSgyMDIwLCAwLCAxKTtcbiAqIGRvYy51cGRhdGVkQXQgPSBvbGREYXRlOyAvLyBXaWxsIGJlIHByZXZlbnRlZCBieSBUaW1lc3RhbXBWYWxpZGF0b3JcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVXBkYXRlVmFsaWRhdGlvbktleXMuVElNRVNUQU1QKVxuZXhwb3J0IGNsYXNzIFRpbWVzdGFtcFZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKERFRkFVTFRfRVJST1JfTUVTU0FHRVMuVElNRVNUQU1QLklOVkFMSUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgYmFzZSB2YWxpZGF0b3IncyBoYXNFcnJvcnMgbWV0aG9kLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBpcyByZXF1aXJlZCBieSB0aGUgVmFsaWRhdG9yIGludGVyZmFjZSBidXQgbm90IHVzZWQgaW4gdGhpcyB2YWxpZGF0b3IgYXMgdmFsaWRhdGlvbiBvbmx5IGhhcHBlbnMgZHVyaW5nIHVwZGF0ZXMuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSB0aW1lc3RhbXAgdmFsdWUgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gQWx3YXlzIHJldHVybnMgdW5kZWZpbmVkIGFzIHRoaXMgdmFsaWRhdG9yIG9ubHkgd29ya3MgZHVyaW5nIHVwZGF0ZXNcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgaGFzRXJyb3JzKHZhbHVlOiBhbnksIC4uLmFyZ3M6IGFueVtdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0ZXMgdGhhdCBhIHRpbWVzdGFtcCBpcyBuZXdlciB0aGFuIGl0cyBwcmV2aW91cyB2YWx1ZS5cbiAgICogQHN1bW1hcnkgQ2hlY2tzIGlmIGEgdGltZXN0YW1wIGhhcyBiZWVuIHVwZGF0ZWQgd2l0aCBhIG1vcmUgcmVjZW50IHZhbHVlIGJ5IGNvbnZlcnRpbmcgYm90aCB2YWx1ZXMgdG8gRGF0ZSBvYmplY3RzIGFuZCBjb21wYXJpbmcgdGhlbS5cbiAgICogQHBhcmFtIHtEYXRlfHN0cmluZ3xudW1iZXJ9IHZhbHVlIC0gVGhlIG5ldyB0aW1lc3RhbXAgdmFsdWUgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHtEYXRlfHN0cmluZ3xudW1iZXJ9IG9sZFZhbHVlIC0gVGhlIG9yaWdpbmFsIHRpbWVzdGFtcCB0byBjb21wYXJlIGFnYWluc3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSAtIE9wdGlvbmFsIGN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0XG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gQW4gZXJyb3IgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxzIChuZXcgdGltZXN0YW1wIGlzIG5vdCBuZXdlciksIHVuZGVmaW5lZCBvdGhlcndpc2VcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVIYXNFcnJvcnMoXG4gICAgdmFsdWU6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIsXG4gICAgb2xkVmFsdWU6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIsXG4gICAgbWVzc2FnZT86IHN0cmluZ1xuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICBtZXNzYWdlID0gbWVzc2FnZSB8fCB0aGlzLmdldE1lc3NhZ2UobWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhbHVlID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgb2xkVmFsdWUgPSBuZXcgRGF0ZShvbGRWYWx1ZSk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlIDw9IG9sZFZhbHVlID8gbWVzc2FnZSA6IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyBhcyBEZWNvcmF0b3JNZXNzYWdlcyxcbiAgVmFsaWRhdG9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHZhbGlkYXRvcnMgdGhhdCBjb21wYXJlIG5ldyB2YWx1ZXMgd2l0aCBvbGQgdmFsdWVzIGR1cmluZyB1cGRhdGVzLlxuICogQHN1bW1hcnkgQmFzZSBjbGFzcyBmb3IgYW4gVXBkYXRlIHZhbGlkYXRvciB0aGF0IHByb3ZpZGVzIGEgZnJhbWV3b3JrIGZvciBpbXBsZW1lbnRpbmcgdmFsaWRhdGlvbiBsb2dpYyB0aGF0IGNvbXBhcmVzIGEgbmV3IHZhbHVlIHdpdGggaXRzIHByZXZpb3VzIHN0YXRlLlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSAtIEVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBEZWNvcmF0b3JNZXNzYWdlcyNERUZBVUxUfVxuICogQHBhcmFtIHtzdHJpbmdbXX0gW2FjY2VwdGVkVHlwZXNdIC0gVGhlIGFjY2VwdGVkIHZhbHVlIHR5cGVzIGJ5IHRoZSBkZWNvcmF0b3JcbiAqIEBjbGFzcyBVcGRhdGVWYWxpZGF0b3JcbiAqIEBleGFtcGxlXG4gKiAvLyBFeHRlbmRpbmcgVXBkYXRlVmFsaWRhdG9yIHRvIGNyZWF0ZSBhIGN1c3RvbSB2YWxpZGF0b3JcbiAqIGNsYXNzIE15Q3VzdG9tVmFsaWRhdG9yIGV4dGVuZHMgVXBkYXRlVmFsaWRhdG9yIHtcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgc3VwZXIoXCJDdXN0b20gdmFsaWRhdGlvbiBmYWlsZWRcIik7XG4gKiAgIH1cbiAqICAgXG4gKiAgIHB1YmxpYyB1cGRhdGVIYXNFcnJvcnModmFsdWU6IGFueSwgb2xkVmFsdWU6IGFueSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gKiAgICAgLy8gQ3VzdG9tIHZhbGlkYXRpb24gbG9naWNcbiAqICAgICBpZiAodmFsdWUgPT09IG9sZFZhbHVlKSB7XG4gKiAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlO1xuICogICAgIH1cbiAqICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICogICB9XG4gKiAgIFxuICogICBoYXNFcnJvcnModmFsdWU6IGFueSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gKiAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gTm90IHVzZWQgZm9yIHVwZGF0ZSB2YWxpZGF0b3JzXG4gKiAgIH1cbiAqIH1cbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBVcGRhdGVWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3Ige1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nID0gRGVjb3JhdG9yTWVzc2FnZXMuREVGQVVMVCxcbiAgICAuLi5hY2NlcHRlZFR5cGVzOiBzdHJpbmdbXVxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCAuLi5hY2NlcHRlZFR5cGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWJzdHJhY3QgbWV0aG9kIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzIHRvIHBlcmZvcm0gdXBkYXRlIHZhbGlkYXRpb24uXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBhIHZhbHVlIGJ5IGNvbXBhcmluZyBpdCB0byBpdHMgb2xkIHZlcnNpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZSB1cGRhdGUgaXMgdmFsaWQuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSBuZXcgdmFsdWUgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHthbnl9IG9sZFZhbHVlIC0gVGhlIHByZXZpb3VzIHZhbHVlIHRvIGNvbXBhcmUgYWdhaW5zdFxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdGhhdCBtYXkgYmUgbmVlZGVkIGZvciB2YWxpZGF0aW9uXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gQW4gZXJyb3IgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxzLCB1bmRlZmluZWQgaWYgdmFsaWRhdGlvbiBwYXNzZXNcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCB1cGRhdGVIYXNFcnJvcnMoXG4gICAgdmFsdWU6IGFueSxcbiAgICBvbGRWYWx1ZTogYW55LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCB7XG4gIFZhbGlkYXRvcixcbiAgVmFsaWRhdGlvbixcbiAgVmFsaWRhdG9yRGVmaW5pdGlvbixcbiAgSVZhbGlkYXRvclJlZ2lzdHJ5LFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBVcGRhdGVWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBrZXkgZm9yIHVwZGF0ZSB2YWxpZGF0aW9uIG1ldGFkYXRhLlxuICogQHN1bW1hcnkgQnVpbGRzIHRoZSBrZXkgdG8gc3RvcmUgYXMgbWV0YWRhdGEgdW5kZXIgUmVmbGVjdGlvbnMgZm9yIHVwZGF0ZSB2YWxpZGF0aW9uIGJ5IHByZWZpeGluZyB0aGUgcHJvdmlkZWQga2V5IHdpdGggdGhlIHVwZGF0ZSB2YWxpZGF0aW9uIHByZWZpeC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgYmFzZSBrZXkgdG8gYmUgcHJlZml4ZWRcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGNvbXBsZXRlIG1ldGFkYXRhIGtleSBmb3IgdXBkYXRlIHZhbGlkYXRpb25cbiAqIEBmdW5jdGlvbiB1cGRhdGVLZXlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5WYWxpZGF0aW9uLnVwZGF0ZUtleSA9IGZ1bmN0aW9uIChrZXk6IHN0cmluZykge1xuICByZXR1cm4gVXBkYXRlVmFsaWRhdGlvbktleXMuUkVGTEVDVCArIGtleTtcbn07XG5cbmRlY2xhcmUgbW9kdWxlIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCIge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgZGVjbGFyZSBjbGFzcyBWYWxpZGF0aW9uIHtcbiAgICBwcml2YXRlIHN0YXRpYyBhY3RpbmdWYWxpZGF0b3JSZWdpc3RyeT87XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpO1xuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGFjdGluZyBWYWxpZGF0b3JSZWdpc3RyeVxuICAgICAqXG4gICAgICogQHBhcmFtIHtJVmFsaWRhdG9yUmVnaXN0cnl9IHZhbGlkYXRvclJlZ2lzdHJ5IHRoZSBuZXcgaW1wbGVtZW50YXRpb24gb2YgdGhlIHZhbGlkYXRvciBSZWdpc3RyeVxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oVmFsaWRhdG9yKTogVmFsaWRhdG9yfSBbbWlncmF0aW9uSGFuZGxlcl0gdGhlIG1ldGhvZCB0byBtYXAgdGhlIHZhbGlkYXRvciBpZiByZXF1aXJlZDtcbiAgICAgKi9cbiAgICBzdGF0aWMgc2V0UmVnaXN0cnkoXG4gICAgICB2YWxpZGF0b3JSZWdpc3RyeTogSVZhbGlkYXRvclJlZ2lzdHJ5PFZhbGlkYXRvcj4sXG4gICAgICBtaWdyYXRpb25IYW5kbGVyPzogKHZhbGlkYXRvcjogVmFsaWRhdG9yKSA9PiBWYWxpZGF0b3JcbiAgICApOiB2b2lkO1xuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIGN1cnJlbnQgVmFsaWRhdG9yUmVnaXN0cnlcbiAgICAgKlxuICAgICAqIEByZXR1cm4gSVZhbGlkYXRvclJlZ2lzdHJ5LCBkZWZhdWx0cyB0byB7QGxpbmsgVmFsaWRhdG9yUmVnaXN0cnl9XG4gICAgICovXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0UmVnaXN0cnk7XG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmVzIGEgdmFsaWRhdG9yXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsaWRhdG9yS2V5IG9uZSBvZiB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzfVxuICAgICAqIEByZXR1cm4ge1ZhbGlkYXRvciB8IHVuZGVmaW5lZH0gdGhlIHJlZ2lzdGVyZWQgVmFsaWRhdG9yIG9yIHVuZGVmaW5lZCBpZiB0aGVyZSBpcyBub25vIG1hdGNoaW5nIHRoZSBwcm92aWRlZCBrZXlcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0PFQgZXh0ZW5kcyBWYWxpZGF0b3I+KHZhbGlkYXRvcktleTogc3RyaW5nKTogVCB8IHVuZGVmaW5lZDtcbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBSZWdpc3RlcnMgdGhlIHByb3ZpZGVkIHZhbGlkYXRvcnMgb250byB0aGUgcmVnaXN0cnlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7VFtdIHwgVmFsaWRhdG9yRGVmaW5pdGlvbltdfSB2YWxpZGF0b3JcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVnaXN0ZXI8VCBleHRlbmRzIFZhbGlkYXRvcj4oXG4gICAgICAuLi52YWxpZGF0b3I6IChWYWxpZGF0b3JEZWZpbml0aW9uIHwgVClbXVxuICAgICk6IHZvaWQ7XG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkgQnVpbGRzIHRoZSBrZXkgdG8gc3RvcmUgYXMgTWV0YWRhdGEgdW5kZXIgUmVmbGVjdGlvbnNcbiAgICAgKiBAZGVzY3JpcHRpb24gY29uY2F0ZW5hdGVzIHtAbGluayBWYWxpZGF0aW9uS2V5cyNSRUZMRUNUfSB3aXRoIHRoZSBwcm92aWRlZCBrZXlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKi9cbiAgICBzdGF0aWMga2V5KGtleTogc3RyaW5nKTogc3RyaW5nO1xuXG4gICAgc3RhdGljIHVwZGF0ZUtleShrZXk6IHN0cmluZyk6IHN0cmluZztcbiAgfVxufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gRGF0YWJhc2Ugb3BlcmF0aW9uIGtleSBjb25zdGFudHNcbiAqIEBzdW1tYXJ5IEVudW0gZGVmaW5pbmcgQ1JVRCBvcGVyYXRpb25zIGFuZCB0aGVpciBsaWZlY3ljbGUgcGhhc2VzXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGVudW0gT3BlcmF0aW9uS2V5cyB7XG4gIFJFRkxFQ1QgPSBcImRlY2FmLm1vZGVsLmRiLm9wZXJhdGlvbnMuXCIsXG4gIENSRUFURSA9IFwiY3JlYXRlXCIsXG4gIFJFQUQgPSBcInJlYWRcIixcbiAgVVBEQVRFID0gXCJ1cGRhdGVcIixcbiAgREVMRVRFID0gXCJkZWxldGVcIixcbiAgT04gPSBcIm9uLlwiLFxuICBBRlRFUiA9IFwiYWZ0ZXIuXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFR5cGUgZm9yIGJhc2ljIENSVUQgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgVW5pb24gdHlwZSBvZiB0aGUgZm91ciBiYXNpYyBkYXRhYmFzZSBvcGVyYXRpb25zOiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgZGVsZXRlXG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBDcnVkT3BlcmF0aW9uc1xuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCB0eXBlIENydWRPcGVyYXRpb25zID1cbiAgfCBPcGVyYXRpb25LZXlzLkNSRUFURVxuICB8IE9wZXJhdGlvbktleXMuUkVBRFxuICB8IE9wZXJhdGlvbktleXMuVVBEQVRFXG4gIHwgT3BlcmF0aW9uS2V5cy5ERUxFVEU7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEJ1bGsgZGF0YWJhc2Ugb3BlcmF0aW9uIGtleSBjb25zdGFudHNcbiAqIEBzdW1tYXJ5IEVudW0gZGVmaW5pbmcgYnVsayBDUlVEIG9wZXJhdGlvbnMgZm9yIGhhbmRsaW5nIG11bHRpcGxlIHJlY29yZHMgYXQgb25jZVxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBlbnVtIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB7XG4gIENSRUFURV9BTEwgPSBcImNyZWF0ZUFsbFwiLFxuICBSRUFEX0FMTCA9IFwicmVhZEFsbFwiLFxuICBVUERBVEVfQUxMID0gXCJ1cGRhdGVBbGxcIixcbiAgREVMRVRFX0FMTCA9IFwiZGVsZXRlQWxsXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFR5cGUgZm9yIGJ1bGsgQ1JVRCBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBVbmlvbiB0eXBlIG9mIHRoZSBmb3VyIGJ1bGsgZGF0YWJhc2Ugb3BlcmF0aW9ucyBmb3IgaGFuZGxpbmcgbXVsdGlwbGUgcmVjb3JkcyBhdCBvbmNlXG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBCdWxrQ3J1ZE9wZXJhdGlvbnNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBCdWxrQ3J1ZE9wZXJhdGlvbnMgPVxuICB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMXG4gIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzLlJFQURfQUxMXG4gIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTExcbiAgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuREVMRVRFX0FMTDtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR3JvdXBlZCBDUlVEIG9wZXJhdGlvbnMgZm9yIGRlY29yYXRvciBtYXBwaW5nXG4gKiBAc3VtbWFyeSBNYXBzIG91dCBncm91cHMgb2YgQ1JVRCBvcGVyYXRpb25zIGZvciBlYXNpZXIgbWFwcGluZyBvZiBkZWNvcmF0b3JzXG4gKiBAY29uc3QgREJPcGVyYXRpb25zXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IERCT3BlcmF0aW9uczogUmVjb3JkPHN0cmluZywgQ3J1ZE9wZXJhdGlvbnNbXT4gPSB7XG4gIENSRUFURTogW09wZXJhdGlvbktleXMuQ1JFQVRFXSxcbiAgUkVBRDogW09wZXJhdGlvbktleXMuUkVBRF0sXG4gIFVQREFURTogW09wZXJhdGlvbktleXMuVVBEQVRFXSxcbiAgREVMRVRFOiBbT3BlcmF0aW9uS2V5cy5ERUxFVEVdLFxuICBDUkVBVEVfVVBEQVRFOiBbT3BlcmF0aW9uS2V5cy5DUkVBVEUsIE9wZXJhdGlvbktleXMuVVBEQVRFXSxcbiAgUkVBRF9DUkVBVEU6IFtPcGVyYXRpb25LZXlzLlJFQUQsIE9wZXJhdGlvbktleXMuQ1JFQVRFXSxcbiAgQUxMOiBbXG4gICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICBdLFxufTtcbiIsImltcG9ydCB7IE9wZXJhdGlvbkhhbmRsZXIgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgSVJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9JUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgT3BlcmF0aW9ucyB9IGZyb20gXCIuL09wZXJhdGlvbnNcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCIuLi9yZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5RmxhZ3MgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWdpc3RyeSBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9uIGhhbmRsZXJzXG4gKiBAc3VtbWFyeSBNYW5hZ2VzIGFuZCBzdG9yZXMgb3BlcmF0aW9uIGhhbmRsZXJzIGZvciBkaWZmZXJlbnQgbW9kZWwgcHJvcGVydGllcyBhbmQgb3BlcmF0aW9uc1xuICogQGNsYXNzIE9wZXJhdGlvbnNSZWdpc3RyeVxuICogQHRlbXBsYXRlIE0gLSBNb2RlbCB0eXBlXG4gKiBAdGVtcGxhdGUgUiAtIFJlcG9zaXRvcnkgdHlwZVxuICogQHRlbXBsYXRlIFYgLSBNZXRhZGF0YSB0eXBlXG4gKiBAdGVtcGxhdGUgRiAtIFJlcG9zaXRvcnkgZmxhZ3NcbiAqIEB0ZW1wbGF0ZSBDIC0gQ29udGV4dCB0eXBlXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgcmVnaXN0cnkgYW5kIHJlZ2lzdGVyIGEgaGFuZGxlclxuICogY29uc3QgcmVnaXN0cnkgPSBuZXcgT3BlcmF0aW9uc1JlZ2lzdHJ5KCk7XG4gKiByZWdpc3RyeS5yZWdpc3RlcihteUhhbmRsZXIsIE9wZXJhdGlvbktleXMuQ1JFQVRFLCB0YXJnZXRNb2RlbCwgJ3Byb3BlcnR5TmFtZScpO1xuICpcbiAqIC8vIEdldCBoYW5kbGVycyBmb3IgYSBzcGVjaWZpYyBvcGVyYXRpb25cbiAqIGNvbnN0IGhhbmRsZXJzID0gcmVnaXN0cnkuZ2V0KHRhcmdldE1vZGVsLmNvbnN0cnVjdG9yLm5hbWUsICdwcm9wZXJ0eU5hbWUnLCAnb25DcmVhdGUnKTtcbiAqXG4gKiBAbWVybWFpZFxuICogY2xhc3NEaWFncmFtXG4gKiAgIGNsYXNzIE9wZXJhdGlvbnNSZWdpc3RyeSB7XG4gKiAgICAgLWNhY2hlOiBSZWNvcmR+c3RyaW5nLCBSZWNvcmR+c3RyaW5nfHN5bWJvbCwgUmVjb3JkfnN0cmluZywgUmVjb3JkfnN0cmluZywgT3BlcmF0aW9uSGFuZGxlcn5+fn5cbiAqICAgICArZ2V0KHRhcmdldCwgcHJvcEtleSwgb3BlcmF0aW9uLCBhY2N1bSlcbiAqICAgICArcmVnaXN0ZXIoaGFuZGxlciwgb3BlcmF0aW9uLCB0YXJnZXQsIHByb3BLZXkpXG4gKiAgIH1cbiAqL1xuZXhwb3J0IGNsYXNzIE9wZXJhdGlvbnNSZWdpc3RyeSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FjaGU6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgUmVjb3JkPFxuICAgICAgc3RyaW5nIHwgc3ltYm9sLFxuICAgICAgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgYW55LCBhbnksIGFueT4+PlxuICAgID5cbiAgPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG9wZXJhdGlvbiBoYW5kbGVycyBmb3IgYSBzcGVjaWZpYyB0YXJnZXQgYW5kIG9wZXJhdGlvblxuICAgKiBAc3VtbWFyeSBGaW5kcyBhbGwgcmVnaXN0ZXJlZCBoYW5kbGVycyBmb3IgYSBnaXZlbiB0YXJnZXQsIHByb3BlcnR5LCBhbmQgb3BlcmF0aW9uLCBpbmNsdWRpbmcgZnJvbSBwYXJlbnQgY2xhc3Nlc1xuICAgKiBAdGVtcGxhdGUgTSAtIE1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAqIEB0ZW1wbGF0ZSBSIC0gUmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBJUmVwb3NpdG9yeVxuICAgKiBAdGVtcGxhdGUgViAtIE1ldGFkYXRhIHR5cGVcbiAgICogQHRlbXBsYXRlIEYgLSBSZXBvc2l0b3J5IGZsYWdzIGV4dGVuZGluZyBSZXBvc2l0b3J5RmxhZ3NcbiAgICogQHRlbXBsYXRlIEMgLSBDb250ZXh0IHR5cGUgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+fSB0YXJnZXQgLSBUaGUgdGFyZ2V0IGNsYXNzIG5hbWUgb3Igb2JqZWN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wS2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byBnZXQgaGFuZGxlcnMgZm9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcGVyYXRpb24gLSBUaGUgb3BlcmF0aW9uIGtleSB0byBnZXQgaGFuZGxlcnMgZm9yXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uSGFuZGxlcltdfSBbYWNjdW1dIC0gQWNjdW11bGF0b3IgZm9yIHJlY3Vyc2l2ZSBjYWxsc1xuICAgKiBAcmV0dXJuIHtPcGVyYXRpb25IYW5kbGVyW10gfCB1bmRlZmluZWR9IEFycmF5IG9mIGhhbmRsZXJzIG9yIHVuZGVmaW5lZCBpZiBub25lIGZvdW5kXG4gICAqL1xuICBnZXQ8XG4gICAgTSBleHRlbmRzIE1vZGVsLFxuICAgIFIgZXh0ZW5kcyBJUmVwb3NpdG9yeTxNLCBGLCBDPixcbiAgICBWLFxuICAgIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gICAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4gID4oXG4gICAgdGFyZ2V0OiBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHByb3BLZXk6IHN0cmluZyxcbiAgICBvcGVyYXRpb246IHN0cmluZyxcbiAgICBhY2N1bT86IE9wZXJhdGlvbkhhbmRsZXI8TSwgUiwgViwgRiwgQz5bXVxuICApOiBPcGVyYXRpb25IYW5kbGVyPE0sIFIsIFYsIEYsIEM+W10gfCB1bmRlZmluZWQge1xuICAgIGFjY3VtID0gYWNjdW0gfHwgW107XG4gICAgbGV0IG5hbWU7XG4gICAgdHJ5IHtcbiAgICAgIG5hbWUgPSB0eXBlb2YgdGFyZ2V0ID09PSBcInN0cmluZ1wiID8gdGFyZ2V0IDogdGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICBhY2N1bS51bnNoaWZ0KFxuICAgICAgICAuLi5PYmplY3QudmFsdWVzKHRoaXMuY2FjaGVbbmFtZV1bcHJvcEtleV1bb3BlcmF0aW9uXSB8fCBbXSlcbiAgICAgICk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgdGFyZ2V0ID09PSBcInN0cmluZ1wiIHx8XG4gICAgICAgIHRhcmdldCA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fFxuICAgICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGFyZ2V0KSA9PT0gT2JqZWN0LnByb3RvdHlwZVxuICAgICAgKVxuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgfVxuXG4gICAgbGV0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRhcmdldCk7XG4gICAgaWYgKHByb3RvLmNvbnN0cnVjdG9yLm5hbWUgPT09IG5hbWUpIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcblxuICAgIHJldHVybiB0aGlzLmdldDxNLCBSLCBWLCBGLCBDPihwcm90bywgcHJvcEtleSwgb3BlcmF0aW9uLCBhY2N1bSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhbiBvcGVyYXRpb24gaGFuZGxlciBmb3IgYSBzcGVjaWZpYyB0YXJnZXQgYW5kIG9wZXJhdGlvblxuICAgKiBAc3VtbWFyeSBTdG9yZXMgYSBoYW5kbGVyIGluIHRoZSByZWdpc3RyeSBmb3IgYSBnaXZlbiB0YXJnZXQsIHByb3BlcnR5LCBhbmQgb3BlcmF0aW9uXG4gICAqIEB0ZW1wbGF0ZSBNIC0gTW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAgICogQHRlbXBsYXRlIFIgLSBSZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIElSZXBvc2l0b3J5XG4gICAqIEB0ZW1wbGF0ZSBWIC0gTWV0YWRhdGEgdHlwZVxuICAgKiBAdGVtcGxhdGUgRiAtIFJlcG9zaXRvcnkgZmxhZ3MgZXh0ZW5kaW5nIFJlcG9zaXRvcnlGbGFnc1xuICAgKiBAdGVtcGxhdGUgQyAtIENvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICAgKiBAcGFyYW0ge09wZXJhdGlvbkhhbmRsZXJ9IGhhbmRsZXIgLSBUaGUgaGFuZGxlciBmdW5jdGlvbiB0byByZWdpc3RlclxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN9IG9wZXJhdGlvbiAtIFRoZSBvcGVyYXRpb24ga2V5IHRvIHJlZ2lzdGVyIHRoZSBoYW5kbGVyIGZvclxuICAgKiBAcGFyYW0ge019IHRhcmdldCAtIFRoZSB0YXJnZXQgbW9kZWwgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBzeW1ib2x9IHByb3BLZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIHJlZ2lzdGVyIHRoZSBoYW5kbGVyIGZvclxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgcmVnaXN0ZXI8XG4gICAgTSBleHRlbmRzIE1vZGVsLFxuICAgIFIgZXh0ZW5kcyBJUmVwb3NpdG9yeTxNLCBGLCBDPixcbiAgICBWLFxuICAgIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gICAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4gID4oXG4gICAgaGFuZGxlcjogT3BlcmF0aW9uSGFuZGxlcjxNLCBSLCBWLCBGLCBDPixcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMsXG4gICAgdGFyZ2V0OiBNLFxuICAgIHByb3BLZXk6IHN0cmluZyB8IHN5bWJvbFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBuYW1lID0gdGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgY29uc3QgaGFuZGxlck5hbWUgPSBPcGVyYXRpb25zLmdldEhhbmRsZXJOYW1lKGhhbmRsZXIpO1xuXG4gICAgaWYgKCF0aGlzLmNhY2hlW25hbWVdKSB0aGlzLmNhY2hlW25hbWVdID0ge307XG4gICAgaWYgKCF0aGlzLmNhY2hlW25hbWVdW3Byb3BLZXldKSB0aGlzLmNhY2hlW25hbWVdW3Byb3BLZXldID0ge307XG4gICAgaWYgKCF0aGlzLmNhY2hlW25hbWVdW3Byb3BLZXldW29wZXJhdGlvbl0pXG4gICAgICB0aGlzLmNhY2hlW25hbWVdW3Byb3BLZXldW29wZXJhdGlvbl0gPSB7fTtcbiAgICBpZiAodGhpcy5jYWNoZVtuYW1lXVtwcm9wS2V5XVtvcGVyYXRpb25dW2hhbmRsZXJOYW1lXSkgcmV0dXJuO1xuICAgIHRoaXMuY2FjaGVbbmFtZV1bcHJvcEtleV1bb3BlcmF0aW9uXVtoYW5kbGVyTmFtZV0gPSBoYW5kbGVyO1xuICB9XG59XG4iLCJpbXBvcnQgeyBIYXNoaW5nLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IE9wZXJhdGlvbkhhbmRsZXIgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgT3BlcmF0aW9uc1JlZ2lzdHJ5IH0gZnJvbSBcIi4vT3BlcmF0aW9uc1JlZ2lzdHJ5XCI7XG5pbXBvcnQgeyBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBJUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnlGbGFncyB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0YXRpYyB1dGlsaXR5IGNsYXNzIGZvciBkYXRhYmFzZSBvcGVyYXRpb24gbWFuYWdlbWVudFxuICogQHN1bW1hcnkgUHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBmb3IgcmVnaXN0ZXJpbmcsIHJldHJpZXZpbmcsIGFuZCBtYW5hZ2luZyBkYXRhYmFzZSBvcGVyYXRpb24gaGFuZGxlcnNcbiAqIEBjbGFzcyBPcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgTSAtIE1vZGVsIHR5cGVcbiAqIEB0ZW1wbGF0ZSBSIC0gUmVwb3NpdG9yeSB0eXBlXG4gKiBAdGVtcGxhdGUgViAtIE1ldGFkYXRhIHR5cGVcbiAqIEB0ZW1wbGF0ZSBGIC0gUmVwb3NpdG9yeSBmbGFnc1xuICogQHRlbXBsYXRlIEMgLSBDb250ZXh0IHR5cGVcbiAqIEBleGFtcGxlXG4gKiAvLyBSZWdpc3RlciBhIGhhbmRsZXIgZm9yIGEgY3JlYXRlIG9wZXJhdGlvblxuICogT3BlcmF0aW9ucy5yZWdpc3RlcihteUhhbmRsZXIsIE9wZXJhdGlvbktleXMuQ1JFQVRFLCB0YXJnZXRNb2RlbCwgJ3Byb3BlcnR5TmFtZScpO1xuICogXG4gKiAvLyBHZXQgaGFuZGxlcnMgZm9yIGEgc3BlY2lmaWMgb3BlcmF0aW9uXG4gKiBjb25zdCBoYW5kbGVycyA9IE9wZXJhdGlvbnMuZ2V0KHRhcmdldE1vZGVsLmNvbnN0cnVjdG9yLm5hbWUsICdwcm9wZXJ0eU5hbWUnLCAnb25DcmVhdGUnKTtcbiAqIFxuICogQG1lcm1haWRcbiAqIGNsYXNzRGlhZ3JhbVxuICogICBjbGFzcyBPcGVyYXRpb25zIHtcbiAqICAgICAtcmVnaXN0cnk6IE9wZXJhdGlvbnNSZWdpc3RyeVxuICogICAgICtnZXRIYW5kbGVyTmFtZShoYW5kbGVyKVxuICogICAgICtrZXkoc3RyKVxuICogICAgICtnZXQodGFyZ2V0TmFtZSwgcHJvcEtleSwgb3BlcmF0aW9uKVxuICogICAgIC1nZXRPcFJlZ2lzdHJ5KClcbiAqICAgICArcmVnaXN0ZXIoaGFuZGxlciwgb3BlcmF0aW9uLCB0YXJnZXQsIHByb3BLZXkpXG4gKiAgIH1cbiAqICAgT3BlcmF0aW9ucyAtLT4gT3BlcmF0aW9uc1JlZ2lzdHJ5IDogdXNlc1xuICovXG5leHBvcnQgY2xhc3MgT3BlcmF0aW9ucyB7XG4gIHByaXZhdGUgc3RhdGljIHJlZ2lzdHJ5OiBPcGVyYXRpb25zUmVnaXN0cnk7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgdW5pcXVlIG5hbWUgZm9yIGFuIG9wZXJhdGlvbiBoYW5kbGVyXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIgZnVuY3Rpb24gb3IgZ2VuZXJhdGVzIGEgaGFzaCBpZiBuYW1lIGlzIG5vdCBhdmFpbGFibGVcbiAgICogQHBhcmFtIHtPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBhbnksIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBoYW5kbGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgbmFtZSBmb3JcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgaGFuZGxlciBvciBhIGdlbmVyYXRlZCBoYXNoXG4gICAqL1xuICBzdGF0aWMgZ2V0SGFuZGxlck5hbWUoaGFuZGxlcjogT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgYW55LCBhbnksIGFueT4pIHtcbiAgICBpZiAoaGFuZGxlci5uYW1lKSByZXR1cm4gaGFuZGxlci5uYW1lO1xuXG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJIYW5kbGVyIG5hbWUgbm90IGRlZmluZWQuIEEgbmFtZSB3aWxsIGJlIGdlbmVyYXRlZCwgYnV0IHRoaXMgaXMgbm90IGRlc2lyYWJsZS4gcGxlYXNlIGF2b2lkIHVzaW5nIGFub255bW91cyBmdW5jdGlvbnNcIlxuICAgICk7XG4gICAgcmV0dXJuIEhhc2hpbmcuaGFzaChoYW5kbGVyLnRvU3RyaW5nKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSByZWZsZWN0aW9uIG1ldGFkYXRhIGtleVxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgZnVsbHkgcXVhbGlmaWVkIG1ldGFkYXRhIGtleSBieSBwcmVmaXhpbmcgd2l0aCB0aGUgcmVmbGVjdGlvbiBuYW1lc3BhY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciAtIFRoZSBvcGVyYXRpb24ga2V5IHN0cmluZyB0byBwcmVmaXhcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgZnVsbHkgcXVhbGlmaWVkIG1ldGFkYXRhIGtleVxuICAgKi9cbiAgc3RhdGljIGtleShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBPcGVyYXRpb25LZXlzLlJFRkxFQ1QgKyBzdHI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBvcGVyYXRpb24gaGFuZGxlcnMgZm9yIGEgc3BlY2lmaWMgdGFyZ2V0IGFuZCBvcGVyYXRpb25cbiAgICogQHN1bW1hcnkgR2V0cyByZWdpc3RlcmVkIGhhbmRsZXJzIGZyb20gdGhlIG9wZXJhdGlvbnMgcmVnaXN0cnkgZm9yIGEgZ2l2ZW4gdGFyZ2V0LCBwcm9wZXJ0eSwgYW5kIG9wZXJhdGlvblxuICAgKiBAdGVtcGxhdGUgTSAtIE1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAqIEB0ZW1wbGF0ZSBSIC0gUmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBJUmVwb3NpdG9yeVxuICAgKiBAdGVtcGxhdGUgViAtIE1ldGFkYXRhIHR5cGUsIGRlZmF1bHRzIHRvIG9iamVjdFxuICAgKiBAdGVtcGxhdGUgRiAtIFJlcG9zaXRvcnkgZmxhZ3MgZXh0ZW5kaW5nIFJlcG9zaXRvcnlGbGFnc1xuICAgKiBAdGVtcGxhdGUgQyAtIENvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IFJlY29yZDxzdHJpbmcsIGFueT59IHRhcmdldE5hbWUgLSBUaGUgdGFyZ2V0IGNsYXNzIG5hbWUgb3Igb2JqZWN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wS2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byBnZXQgaGFuZGxlcnMgZm9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcGVyYXRpb24gLSBUaGUgb3BlcmF0aW9uIGtleSB0byBnZXQgaGFuZGxlcnMgZm9yXG4gICAqIEByZXR1cm4ge2FueX0gVGhlIHJlZ2lzdGVyZWQgaGFuZGxlcnMgZm9yIHRoZSBzcGVjaWZpZWQgdGFyZ2V0LCBwcm9wZXJ0eSwgYW5kIG9wZXJhdGlvblxuICAgKi9cbiAgc3RhdGljIGdldDxcbiAgICBNIGV4dGVuZHMgTW9kZWwsXG4gICAgUiBleHRlbmRzIElSZXBvc2l0b3J5PE0sIEYsIEM+LFxuICAgIFYgPSBvYmplY3QsXG4gICAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IFJlcG9zaXRvcnlGbGFncyxcbiAgICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4gID4oXG4gICAgdGFyZ2V0TmFtZTogc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBwcm9wS2V5OiBzdHJpbmcsXG4gICAgb3BlcmF0aW9uOiBzdHJpbmdcbiAgKSB7XG4gICAgcmV0dXJuIE9wZXJhdGlvbnMucmVnaXN0cnkuZ2V0PE0sIFIsIFYsIEYsIEM+KFxuICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgIHByb3BLZXksXG4gICAgICBvcGVyYXRpb25cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIG9yIGluaXRpYWxpemVzIHRoZSBvcGVyYXRpb25zIHJlZ2lzdHJ5XG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIGV4aXN0aW5nIHJlZ2lzdHJ5IG9yIGNyZWF0ZXMgYSBuZXcgb25lIGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICogQHJldHVybiB7T3BlcmF0aW9uc1JlZ2lzdHJ5fSBUaGUgb3BlcmF0aW9ucyByZWdpc3RyeSBpbnN0YW5jZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0T3BSZWdpc3RyeSgpIHtcbiAgICBpZiAoIU9wZXJhdGlvbnMucmVnaXN0cnkpIE9wZXJhdGlvbnMucmVnaXN0cnkgPSBuZXcgT3BlcmF0aW9uc1JlZ2lzdHJ5KCk7XG4gICAgcmV0dXJuIE9wZXJhdGlvbnMucmVnaXN0cnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhbiBvcGVyYXRpb24gaGFuZGxlciBmb3IgYSBzcGVjaWZpYyB0YXJnZXQgYW5kIG9wZXJhdGlvblxuICAgKiBAc3VtbWFyeSBBZGRzIGEgaGFuZGxlciB0byB0aGUgb3BlcmF0aW9ucyByZWdpc3RyeSBmb3IgYSBnaXZlbiB0YXJnZXQsIHByb3BlcnR5LCBhbmQgb3BlcmF0aW9uXG4gICAqIEB0ZW1wbGF0ZSBWIC0gTW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAgICogQHBhcmFtIHtPcGVyYXRpb25IYW5kbGVyPFYsIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBoYW5kbGVyIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c30gb3BlcmF0aW9uIC0gVGhlIG9wZXJhdGlvbiBrZXkgdG8gcmVnaXN0ZXIgdGhlIGhhbmRsZXIgZm9yXG4gICAqIEBwYXJhbSB7Vn0gdGFyZ2V0IC0gVGhlIHRhcmdldCBtb2RlbCBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHN5bWJvbH0gcHJvcEtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gcmVnaXN0ZXIgdGhlIGhhbmRsZXIgZm9yXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXI8ViBleHRlbmRzIE1vZGVsPihcbiAgICBoYW5kbGVyOiBPcGVyYXRpb25IYW5kbGVyPFYsIGFueSwgYW55PixcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMsXG4gICAgdGFyZ2V0OiBWLFxuICAgIHByb3BLZXk6IHN0cmluZyB8IHN5bWJvbFxuICApIHtcbiAgICBPcGVyYXRpb25zLmdldE9wUmVnaXN0cnkoKS5yZWdpc3RlcihcbiAgICAgIGhhbmRsZXIgYXMgYW55LFxuICAgICAgb3BlcmF0aW9uLFxuICAgICAgdGFyZ2V0LFxuICAgICAgcHJvcEtleVxuICAgICk7XG4gIH1cbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIEJhc2UgZXJyb3IgY2xhc3MgZm9yIHRoZSByZXBvc2l0b3J5IG1vZHVsZVxuICogQHN1bW1hcnkgQWJzdHJhY3QgYmFzZSBlcnJvciBjbGFzcyB0aGF0IGFsbCBvdGhlciBlcnJvciB0eXBlcyBleHRlbmQgZnJvbS4gUHJvdmlkZXMgY29tbW9uIGVycm9yIGhhbmRsaW5nIGZ1bmN0aW9uYWxpdHkgYW5kIHN0YW5kYXJkaXplZCBIVFRQIGNvZGUgbWFwcGluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGVycm9yXG4gKiBAcGFyYW0ge3N0cmluZ3xFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgRXJyb3Igb2JqZWN0IHRvIHdyYXBcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlIC0gVGhlIEhUVFAgc3RhdHVzIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXJyb3JcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgQmFzZUVycm9yXG4gKiBAZXhhbXBsZVxuICogLy8gVGhpcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgc2hvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHlcbiAqIC8vIEluc3RlYWQsIHVzZSBvbmUgb2YgdGhlIGNvbmNyZXRlIGVycm9yIGNsYXNzZXM6XG4gKiB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdJbnZhbGlkIGRhdGEgcHJvdmlkZWQnKTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgRSBhcyBCYXNlRXJyb3JcbiAqICAgQy0+PkU6IG5ldyBCYXNlRXJyb3IobmFtZSxtc2csY29kZSlcbiAqICAgRS0tPj5DOiBFcnJvciBpbnN0YW5jZSB3aXRoIG1lc3NhZ2UgYW5kIGNvZGVcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgY29kZSE6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgbXNnOiBzdHJpbmcgfCBFcnJvciwgY29kZTogbnVtYmVyKSB7XG4gICAgaWYgKG1zZyBpbnN0YW5jZW9mIEJhc2VFcnJvcikgcmV0dXJuIG1zZztcbiAgICBjb25zdCBtZXNzYWdlID0gYFske25hbWV9XSAke21zZyBpbnN0YW5jZW9mIEVycm9yID8gbXNnLm1lc3NhZ2UgOiBtc2d9YDtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICAgIGlmIChtc2cgaW5zdGFuY2VvZiBFcnJvcikgdGhpcy5zdGFjayA9IG1zZy5zdGFjaztcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciAoNDApIHRocm93biB3aGVuIGEgYmFkIHJlcXVlc3QgaXMgcmVjZWl2ZWRcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIGluIHRoZSBpbnB1dCBkYXRhLCB0eXBpY2FsbHkgdGhyb3duIHdoZW4gYSBjbGllbnQgc2VuZHMgaW52YWxpZCBvciBpbmNvbXBsZXRlIGRhdGFcbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3RcbiAqIEByZXR1cm4ge0JhZFJlcXVlc3RFcnJvcn0gQSBuZXcgQmFkUmVxdWVzdEVycm9yIGluc3RhbmNlXG4gKiBAY2xhc3MgQmFkUmVxdWVzdEVycm9yXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKi9cbmV4cG9ydCBjbGFzcyBCYWRSZXF1ZXN0RXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yLCBuYW1lID0gQmFkUmVxdWVzdEVycm9yLm5hbWUsIGNvZGUgPSA0MDApIHtcbiAgICBzdXBlcihuYW1lLCBtc2csIGNvZGUpO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yICg0MjIpIHRocm93biB3aGVuIHZhbGlkYXRpb24gZmFpbHNcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIGluIHRoZSBNb2RlbCBkZXRhaWxzLCB0eXBpY2FsbHkgdGhyb3duIHdoZW4gZGF0YSB2YWxpZGF0aW9uIGZhaWxzXG4gKiBAcGFyYW0ge3N0cmluZ3xFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgRXJyb3Igb2JqZWN0XG4gKiBAcmV0dXJuIHtWYWxpZGF0aW9uRXJyb3J9IEEgbmV3IFZhbGlkYXRpb25FcnJvciBpbnN0YW5jZVxuICogQGNsYXNzIFZhbGlkYXRpb25FcnJvclxuICogQGV4YW1wbGVcbiAqIC8vIFRocm93IGEgdmFsaWRhdGlvbiBlcnJvciB3aGVuIGRhdGEgaXMgaW52YWxpZFxuICogaWYgKCFpc1ZhbGlkKGRhdGEpKSB7XG4gKiAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoJ0ludmFsaWQgZGF0YSBmb3JtYXQnKTtcbiAqIH1cbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIFZhbGlkYXRpb25FcnJvciBleHRlbmRzIEJhZFJlcXVlc3RFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIFZhbGlkYXRpb25FcnJvci5uYW1lLCA0MjIpO1xuICB9XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciAoNTAwKSB0aHJvd24gZm9yIGludGVybmFsIHN5c3RlbSBmYWlsdXJlc1xuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhbiBpbnRlcm5hbCBmYWlsdXJlIChzaG91bGQgbWVhbiBhbiBlcnJvciBpbiBjb2RlKSB3aXRoIEhUVFAgNTAwIHN0YXR1cyBjb2RlXG4gKiBAcGFyYW0ge3N0cmluZ3xFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgRXJyb3Igb2JqZWN0XG4gKiBAcmV0dXJuIHtJbnRlcm5hbEVycm9yfSBBIG5ldyBJbnRlcm5hbEVycm9yIGluc3RhbmNlXG4gKiBAY2xhc3MgSW50ZXJuYWxFcnJvclxuICogQGV4YW1wbGVcbiAqIC8vIFRocm93IGFuIGludGVybmFsIGVycm9yIHdoZW4gYW4gdW5leHBlY3RlZCBjb25kaXRpb24gb2NjdXJzXG4gKiB0cnkge1xuICogICAvLyBTb21lIG9wZXJhdGlvblxuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoJ1VuZXhwZWN0ZWQgaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQnKTtcbiAqIH1cbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIEludGVybmFsRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yLCBuYW1lID0gSW50ZXJuYWxFcnJvci5uYW1lLCBjb2RlID0gNTAwKSB7XG4gICAgc3VwZXIobmFtZSwgbXNnLCBjb2RlKTtcbiAgfVxufVxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgKDUwMCkgdGhyb3duIHdoZW4gc2VyaWFsaXphdGlvbiBvciBkZXNlcmlhbGl6YXRpb24gZmFpbHNcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIGluIHRoZSBNb2RlbCBkZS9zZXJpYWxpemF0aW9uLCB0eXBpY2FsbHkgd2hlbiBjb252ZXJ0aW5nIGJldHdlZW4gZGF0YSBmb3JtYXRzXG4gKiBAcGFyYW0ge3N0cmluZ3xFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgRXJyb3Igb2JqZWN0XG4gKiBAcmV0dXJuIHtTZXJpYWxpemF0aW9uRXJyb3J9IEEgbmV3IFNlcmlhbGl6YXRpb25FcnJvciBpbnN0YW5jZVxuICogQGNsYXNzIFNlcmlhbGl6YXRpb25FcnJvclxuICogQGV4YW1wbGVcbiAqIC8vIFRocm93IGEgc2VyaWFsaXphdGlvbiBlcnJvciB3aGVuIEpTT04gcGFyc2luZyBmYWlsc1xuICogdHJ5IHtcbiAqICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoaW52YWxpZEpzb24pO1xuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcignRmFpbGVkIHRvIHBhcnNlIEpTT04gZGF0YScpO1xuICogfVxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgU2VyaWFsaXphdGlvbkVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIFNlcmlhbGl6YXRpb25FcnJvci5uYW1lLCA1MDApO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biB3aGVuIGEgcmVxdWVzdGVkIHJlc291cmNlIGlzIG5vdCBmb3VuZFxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhIGZhaWx1cmUgaW4gZmluZGluZyBhIG1vZGVsLCByZXN1bHRpbmcgaW4gYSA0MDQgSFRUUCBzdGF0dXMgY29kZVxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIEVycm9yIG9iamVjdFxuICogQHJldHVybiB7Tm90Rm91bmRFcnJvcn0gQSBuZXcgTm90Rm91bmRFcnJvciBpbnN0YW5jZVxuICogQGNsYXNzIE5vdEZvdW5kRXJyb3JcbiAqIEBleGFtcGxlXG4gKiAvLyBUaHJvdyBhIG5vdCBmb3VuZCBlcnJvciB3aGVuIGEgcmVjb3JkIGRvZXNuJ3QgZXhpc3RcbiAqIGNvbnN0IHVzZXIgPSBhd2FpdCByZXBvc2l0b3J5LmZpbmRCeUlkKGlkKTtcbiAqIGlmICghdXNlcikge1xuICogICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihgVXNlciB3aXRoIElEICR7aWR9IG5vdCBmb3VuZGApO1xuICogfVxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgTm90Rm91bmRFcnJvciBleHRlbmRzIEJhZFJlcXVlc3RFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIE5vdEZvdW5kRXJyb3IubmFtZSwgNDA0KTtcbiAgfVxufVxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIHdoZW4gYSBjb25mbGljdCBvY2N1cnMgaW4gdGhlIHN0b3JhZ2VcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBjb25mbGljdCBpbiB0aGUgc3RvcmFnZSwgdHlwaWNhbGx5IHdoZW4gdHJ5aW5nIHRvIGNyZWF0ZSBhIGR1cGxpY2F0ZSByZXNvdXJjZVxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIEVycm9yIG9iamVjdFxuICogQHJldHVybiB7Q29uZmxpY3RFcnJvcn0gQSBuZXcgQ29uZmxpY3RFcnJvciBpbnN0YW5jZVxuICogQGNsYXNzIENvbmZsaWN0RXJyb3JcbiAqIEBleGFtcGxlXG4gKiAvLyBUaHJvdyBhIGNvbmZsaWN0IGVycm9yIHdoZW4gdHJ5aW5nIHRvIGNyZWF0ZSBhIGR1cGxpY2F0ZSByZWNvcmRcbiAqIGNvbnN0IGV4aXN0aW5nVXNlciA9IGF3YWl0IHJlcG9zaXRvcnkuZmluZEJ5RW1haWwoZW1haWwpO1xuICogaWYgKGV4aXN0aW5nVXNlcikge1xuICogICB0aHJvdyBuZXcgQ29uZmxpY3RFcnJvcihgVXNlciB3aXRoIGVtYWlsICR7ZW1haWx9IGFscmVhZHkgZXhpc3RzYCk7XG4gKiB9XG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25mbGljdEVycm9yIGV4dGVuZHMgQmFkUmVxdWVzdEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgQ29uZmxpY3RFcnJvci5uYW1lLCA0MDkpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL0lSZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIi4uL29wZXJhdGlvbnMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBEZWNvcmF0b3JNZXRhZGF0YSwgUmVmbGVjdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsLCBNb2RlbEtleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIi4vQ29udGV4dFwiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeUZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGdldEhhbmRsZXJzRGVjb3JhdG9ycyxcbiAgZ3JvdXBEZWNvcmF0b3JzLFxuICBzb3J0RGVjb3JhdG9ycyxcbn0gZnJvbSBcIi4uL29wZXJhdGlvbnMvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgVXBkYXRlT3BlcmF0aW9uSGFuZGxlciB9IGZyb20gXCIuLi9vcGVyYXRpb25zL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnRleHQgYXJndW1lbnRzIGZvciByZXBvc2l0b3J5IG9wZXJhdGlvbnMuXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIHRoZSBjb250ZXh0IGFuZCBhcmd1bWVudHMgZm9yIHJlcG9zaXRvcnkgb3BlcmF0aW9ucy5cbiAqIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHBhc3MgY29udGV4dCBhbmQgYXJndW1lbnRzIGJldHdlZW4gcmVwb3NpdG9yeSBtZXRob2RzLlxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlLCBkZWZhdWx0cyB0byBSZXBvc2l0b3J5RmxhZ3NcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSwgZGVmYXVsdHMgdG8gQ29udGV4dDxGPlxuICogQHR5cGVkZWYge09iamVjdH0gQ29udGV4dEFyZ3NcbiAqIEBwcm9wZXJ0eSB7Q30gY29udGV4dCAtIFRoZSBvcGVyYXRpb24gY29udGV4dFxuICogQHByb3BlcnR5IHthbnlbXX0gYXJncyAtIFRoZSBvcGVyYXRpb24gYXJndW1lbnRzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IHR5cGUgQ29udGV4dEFyZ3M8XG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbj4gPSB7XG4gIGNvbnRleHQ6IEM7XG4gIGFyZ3M6IGFueVtdO1xufTtcblxuLyoqXG4gKiBAc3VtbWFyeSByZXRyaWV2ZXMgdGhlIGFyZ3VtZW50cyBmb3IgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSB7YW55fSBkZWMgdGhlIGRlY29yYXRvclxuICogQHBhcmFtIHtzdHJpbmd9IHByb3AgdGhlIHByb3BlcnR5IG5hbWVcbiAqIEBwYXJhbSB7e319IG0gdGhlIG1vZGVsXG4gKiBAcGFyYW0ge3t9fSBbYWNjdW1dIGFjY3VtdWxhdG9yIHVzZWQgZm9yIGludGVybmFsIHJlY3Vyc2l2ZW5lc3NcbiAqXG4gKiBAZnVuY3Rpb24gZ2V0SGFuZGxlckFyZ3NcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9ycy5SZXBvc2l0b3J5XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRIYW5kbGVyQXJncyA9IGZ1bmN0aW9uIChcbiAgZGVjOiBhbnksXG4gIHByb3A6IHN0cmluZyxcbiAgbTogQ29uc3RydWN0b3I8YW55PixcbiAgYWNjdW0/OiBSZWNvcmQ8c3RyaW5nLCB7IGFyZ3M6IHN0cmluZ1tdIH0+XG4pOiBSZWNvcmQ8c3RyaW5nLCB7IGFyZ3M6IHN0cmluZ1tdIH0+IHwgdm9pZCB7XG4gIGNvbnN0IG5hbWUgPSBtLmNvbnN0cnVjdG9yLm5hbWU7XG4gIGlmICghbmFtZSkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJDb3VsZCBub3QgZGV0ZXJtaW5lIG1vZGVsIGNsYXNzXCIpO1xuICBhY2N1bSA9IGFjY3VtIHx8IHt9O1xuXG4gIGlmIChkZWMucHJvcHMuaGFuZGxlcnNbbmFtZV0gJiYgZGVjLnByb3BzLmhhbmRsZXJzW25hbWVdW3Byb3BdKVxuICAgIGFjY3VtID0geyAuLi5kZWMucHJvcHMuaGFuZGxlcnNbbmFtZV1bcHJvcF0sIC4uLmFjY3VtIH07XG5cbiAgbGV0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG0pO1xuICBpZiAocHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUpIHJldHVybiBhY2N1bTtcbiAgaWYgKHByb3RvLmNvbnN0cnVjdG9yLm5hbWUgPT09IG5hbWUpIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcblxuICByZXR1cm4gZ2V0SGFuZGxlckFyZ3MoZGVjLCBwcm9wLCBwcm90bywgYWNjdW0pO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtJUmVwb3NpdG9yeTxUPn0gcmVwb1xuICogQHBhcmFtIGNvbnRleHRcbiAqIEBwYXJhbSB7VH0gbW9kZWxcbiAqIEBwYXJhbSBvcGVyYXRpb25cbiAqIEBwYXJhbSBwcmVmaXhcbiAqXG4gKiBAcGFyYW0gb2xkTW9kZWxcbiAqIEBmdW5jdGlvbiBlbmZvcmNlREJQcm9wZXJ0eURlY29yYXRvcnNBc3luY1xuICpcbiAqIEBtZW1iZXJPZiBkYi1kZWNvcmF0b3JzLnV0aWxzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmZvcmNlREJEZWNvcmF0b3JzPFxuICBNIGV4dGVuZHMgTW9kZWw8dHJ1ZSB8IGZhbHNlPixcbiAgUiBleHRlbmRzIElSZXBvc2l0b3J5PE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgb2JqZWN0ID0gb2JqZWN0LFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzID0gUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4+KFxuICByZXBvOiBSLFxuICBjb250ZXh0OiBDLFxuICBtb2RlbDogTSxcbiAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gIHByZWZpeDogc3RyaW5nLFxuICBvbGRNb2RlbD86IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkZWNvcmF0b3JzOiBSZWNvcmQ8c3RyaW5nLCBEZWNvcmF0b3JNZXRhZGF0YVtdPiB8IHVuZGVmaW5lZCA9XG4gICAgZ2V0RGJEZWNvcmF0b3JzKG1vZGVsLCBvcGVyYXRpb24sIHByZWZpeCk7XG5cbiAgaWYgKCFkZWNvcmF0b3JzKSByZXR1cm47XG5cbiAgY29uc3QgaGFubGVyc0RlY29yYXRvcnMgPSBnZXRIYW5kbGVyc0RlY29yYXRvcnMobW9kZWwsIGRlY29yYXRvcnMsIHByZWZpeCk7XG4gIGNvbnN0IGdyb3VwZWREZWNvcmF0b3JzID0gZ3JvdXBEZWNvcmF0b3JzKGhhbmxlcnNEZWNvcmF0b3JzKTtcbiAgY29uc3Qgc29ydGVkRGVjb3JhdG9ycyA9IHNvcnREZWNvcmF0b3JzKGdyb3VwZWREZWNvcmF0b3JzKTtcblxuICBmb3IgKGNvbnN0IGRlYyBvZiBzb3J0ZWREZWNvcmF0b3JzKSB7XG4gICAgY29uc3QgYXJnczogYW55W10gPSBbXG4gICAgICBjb250ZXh0LFxuICAgICAgZGVjLmRhdGEubGVuZ3RoID4gMSA/IGRlYy5kYXRhIDogZGVjLmRhdGFbMF0sXG4gICAgICBkZWMucHJvcC5sZW5ndGggPiAxID8gZGVjLnByb3AgOiBkZWMucHJvcFswXSxcbiAgICAgIG1vZGVsLFxuICAgIF07XG5cbiAgICBpZiAob3BlcmF0aW9uID09PSBPcGVyYXRpb25LZXlzLlVQREFURSAmJiBwcmVmaXggPT09IE9wZXJhdGlvbktleXMuT04pIHtcbiAgICAgIGlmICghb2xkTW9kZWwpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTWlzc2luZyBvbGQgbW9kZWwgZm9yIHVwZGF0ZSBvcGVyYXRpb25cIik7XG4gICAgICBhcmdzLnB1c2gob2xkTW9kZWwpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgKGRlYy5oYW5kbGVyIGFzIFVwZGF0ZU9wZXJhdGlvbkhhbmRsZXI8TSwgUiwgViwgRiwgQz4pLmFwcGx5KFxuICAgICAgICByZXBvLFxuICAgICAgICBhcmdzIGFzIFtDLCBWLCBrZXlvZiBNLCBNLCBNXVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBjb25zdCBtc2cgPSBgRmFpbGVkIHRvIGV4ZWN1dGUgaGFuZGxlciAke2RlYy5oYW5kbGVyLm5hbWV9IGZvciAke2RlYy5wcm9wfSBvbiAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9IGR1ZSB0byBlcnJvcjogJHtlfWA7XG4gICAgICBpZiAoY29udGV4dC5nZXQoXCJicmVha09uSGFuZGxlckVycm9yXCIpKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihtc2cpO1xuICAgICAgY29uc29sZS5sb2cobXNnKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTcGVjaWZpYyBmb3IgREIgRGVjb3JhdG9yc1xuICogQHBhcmFtIHtUfSBtb2RlbFxuICogQHBhcmFtIHtzdHJpbmd9IG9wZXJhdGlvbiBDUlVEIHtAbGluayBPcGVyYXRpb25LZXlzfVxuICogQHBhcmFtIHtzdHJpbmd9IFtleHRyYVByZWZpeF1cbiAqXG4gKiBAZnVuY3Rpb24gZ2V0RGJQcm9wZXJ0eURlY29yYXRvcnNcbiAqXG4gKiBAbWVtYmVyT2YgZGItZGVjb3JhdG9ycy51dGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGJEZWNvcmF0b3JzPFQgZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBULFxuICBvcGVyYXRpb246IHN0cmluZyxcbiAgZXh0cmFQcmVmaXg/OiBzdHJpbmdcbik6IFJlY29yZDxzdHJpbmcsIERlY29yYXRvck1ldGFkYXRhW10+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGVjb3JhdG9yczogUmVjb3JkPHN0cmluZywgRGVjb3JhdG9yTWV0YWRhdGFbXT4gfCB1bmRlZmluZWQgPVxuICAgIFJlZmxlY3Rpb24uZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgbW9kZWwsXG4gICAgICAvLyB1bmRlZmluZWQsXG4gICAgICBPcGVyYXRpb25LZXlzLlJFRkxFQ1QgKyAoZXh0cmFQcmVmaXggPyBleHRyYVByZWZpeCA6IFwiXCIpXG4gICAgKTtcbiAgaWYgKCFkZWNvcmF0b3JzKSByZXR1cm47XG4gIHJldHVybiBPYmplY3Qua2V5cyhkZWNvcmF0b3JzKS5yZWR1Y2UoXG4gICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBEZWNvcmF0b3JNZXRhZGF0YVtdPiB8IHVuZGVmaW5lZCwgZGVjb3JhdG9yKSA9PiB7XG4gICAgICBjb25zdCBkZWMgPSBkZWNvcmF0b3JzW2RlY29yYXRvcl0uZmlsdGVyKChkKSA9PiBkLmtleSA9PT0gb3BlcmF0aW9uKTtcbiAgICAgIGlmIChkZWMgJiYgZGVjLmxlbmd0aCkge1xuICAgICAgICBpZiAoIWFjY3VtKSBhY2N1bSA9IHt9O1xuICAgICAgICBhY2N1bVtkZWNvcmF0b3JdID0gZGVjO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sXG4gICAgdW5kZWZpbmVkXG4gICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBkZWNvcmF0b3JzIGZvciBhbiBvYmplY3QncyBwcm9wZXJ0aWVzIHByZWZpeGVkIGJ5IHtAcGFyYW0gcHJlZml4ZXN9IHJlY3Vyc2l2ZWx5XG4gKiBAcGFyYW0gbW9kZWxcbiAqIEBwYXJhbSBhY2N1bVxuICogQHBhcmFtIHByZWZpeGVzXG4gKlxuICogQGZ1bmN0aW9uIGdldEFsbFByb3BlcnR5RGVjb3JhdG9yc1JlY3Vyc2l2ZVxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzLlJlcG9zaXRvcnlcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEFsbFByb3BlcnR5RGVjb3JhdG9yc1JlY3Vyc2l2ZSA9IGZ1bmN0aW9uIDxUIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogVCxcbiAgYWNjdW06IHsgW2luZGV4ZXI6IHN0cmluZ106IGFueVtdIH0gfCB1bmRlZmluZWQsXG4gIC4uLnByZWZpeGVzOiBzdHJpbmdbXVxuKTogeyBbaW5kZXhlcjogc3RyaW5nXTogYW55W10gfSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGFjY3VtdWxhdG9yID0gYWNjdW0gfHwge307XG4gIGNvbnN0IG1lcmdlRGVjb3JhdG9ycyA9IGZ1bmN0aW9uIChkZWNzOiB7IFtpbmRleGVyOiBzdHJpbmddOiBhbnlbXSB9KSB7XG4gICAgY29uc3QgcHVzaE9yU3F1YXNoID0gKGtleTogc3RyaW5nLCAuLi52YWx1ZXM6IGFueVtdKSA9PiB7XG4gICAgICB2YWx1ZXMuZm9yRWFjaCgodmFsKSA9PiB7XG4gICAgICAgIGxldCBtYXRjaDogYW55O1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIShtYXRjaCA9IGFjY3VtdWxhdG9yW2tleV0uZmluZCgoZSkgPT4gZS5rZXkgPT09IHZhbC5rZXkpKSB8fFxuICAgICAgICAgIG1hdGNoLnByb3BzLm9wZXJhdGlvbiAhPT0gdmFsLnByb3BzLm9wZXJhdGlvblxuICAgICAgICApIHtcbiAgICAgICAgICBhY2N1bXVsYXRvcltrZXldLnB1c2godmFsKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsLmtleSA9PT0gTW9kZWxLZXlzLlRZUEUpIHJldHVybjtcblxuICAgICAgICBjb25zdCB7IGhhbmRsZXJzLCBvcGVyYXRpb24gfSA9IHZhbC5wcm9wcztcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgIW9wZXJhdGlvbiB8fFxuICAgICAgICAgICFvcGVyYXRpb24ubWF0Y2goXG4gICAgICAgICAgICBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgICBgXig6PyR7T3BlcmF0aW9uS2V5cy5PTn18JHtPcGVyYXRpb25LZXlzLkFGVEVSfSkoOj8ke09wZXJhdGlvbktleXMuQ1JFQVRFfXwke09wZXJhdGlvbktleXMuUkVBRH18JHtPcGVyYXRpb25LZXlzLlVQREFURX18JHtPcGVyYXRpb25LZXlzLkRFTEVURX0pJGBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIGFjY3VtdWxhdG9yW2tleV0ucHVzaCh2YWwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFjY3VtSGFuZGxlcnMgPSBtYXRjaC5wcm9wcy5oYW5kbGVycztcblxuICAgICAgICBPYmplY3QuZW50cmllcyhoYW5kbGVycykuZm9yRWFjaCgoW2NsYXp6LCBoYW5kbGVyRGVmXSkgPT4ge1xuICAgICAgICAgIGlmICghKGNsYXp6IGluIGFjY3VtSGFuZGxlcnMpKSB7XG4gICAgICAgICAgICBhY2N1bUhhbmRsZXJzW2NsYXp6XSA9IGhhbmRsZXJEZWY7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgT2JqZWN0LmVudHJpZXMoaGFuZGxlckRlZiBhcyBvYmplY3QpLmZvckVhY2goXG4gICAgICAgICAgICAoW2hhbmRsZXJQcm9wLCBoYW5kbGVyXSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIShoYW5kbGVyUHJvcCBpbiBhY2N1bUhhbmRsZXJzW2NsYXp6XSkpIHtcbiAgICAgICAgICAgICAgICBhY2N1bUhhbmRsZXJzW2NsYXp6XVtoYW5kbGVyUHJvcF0gPSBoYW5kbGVyO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGhhbmRsZXIgYXMgb2JqZWN0KS5mb3JFYWNoKFxuICAgICAgICAgICAgICAgIChbaGFuZGxlcktleSwgYXJnc09ial0pID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmICghKGhhbmRsZXJLZXkgaW4gYWNjdW1IYW5kbGVyc1tjbGF6el1baGFuZGxlclByb3BdKSkge1xuICAgICAgICAgICAgICAgICAgICBhY2N1bUhhbmRsZXJzW2NsYXp6XVtoYW5kbGVyUHJvcF1baGFuZGxlcktleV0gPSBhcmdzT2JqO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICAgIGBTa2lwcGluZyBoYW5kbGVyIHJlZ2lzdHJhdGlvbiBmb3IgJHtjbGF6en0gdW5kZXIgcHJvcCAke2hhbmRsZXJQcm9wfSBiZWNhdXNlIGhhbmRsZXIgaXMgdGhlIHNhbWVgXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBPYmplY3QuZW50cmllcyhkZWNzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGFjY3VtdWxhdG9yW2tleV0gPSBhY2N1bXVsYXRvcltrZXldIHx8IFtdO1xuICAgICAgcHVzaE9yU3F1YXNoKGtleSwgLi4udmFsdWUpO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGRlY3M6IHsgW2luZGV4ZXI6IHN0cmluZ106IGFueVtdIH0gfCB1bmRlZmluZWQgPVxuICAgIFJlZmxlY3Rpb24uZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzKG1vZGVsLCAuLi5wcmVmaXhlcyk7XG4gIGlmIChkZWNzKSBtZXJnZURlY29yYXRvcnMoZGVjcyk7XG5cbiAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZihtb2RlbCkgPT09IE9iamVjdC5wcm90b3R5cGUpIHJldHVybiBhY2N1bXVsYXRvcjtcblxuICAvLyBjb25zdCBuYW1lID0gbW9kZWwuY29uc3RydWN0b3IubmFtZTtcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YobW9kZWwpO1xuICBpZiAoIXByb3RvKSByZXR1cm4gYWNjdW11bGF0b3I7XG4gIC8vIGlmIChwcm90by5jb25zdHJ1Y3RvciAmJiBwcm90by5jb25zdHJ1Y3Rvci5uYW1lID09PSBuYW1lKVxuICAvLyAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pXG4gIHJldHVybiBnZXRBbGxQcm9wZXJ0eURlY29yYXRvcnNSZWN1cnNpdmUocHJvdG8sIGFjY3VtdWxhdG9yLCAuLi5wcmVmaXhlcyk7XG59O1xuIiwiaW1wb3J0IHtcbiAgR2VuZXJhbE9wZXJhdGlvbkhhbmRsZXIsXG4gIEdlbmVyYWxVcGRhdGVPcGVyYXRpb25IYW5kbGVyLFxuICBJZE9wZXJhdGlvbkhhbmRsZXIsXG4gIE9wZXJhdGlvbkhhbmRsZXIsXG4gIFN0YW5kYXJkT3BlcmF0aW9uSGFuZGxlcixcbiAgVXBkYXRlT3BlcmF0aW9uSGFuZGxlcixcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IERCT3BlcmF0aW9ucywgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgT3BlcmF0aW9ucyB9IGZyb20gXCIuL09wZXJhdGlvbnNcIjtcbmltcG9ydCB7IGFwcGx5IH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBNb2RlbCwgcHJvcE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSVJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeUZsYWdzIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvdHlwZXNcIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9Db250ZXh0XCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvZXJyb3JzXCI7XG5pbXBvcnQgeyBnZXRIYW5kbGVyQXJncyB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L3V0aWxzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgc29ydGluZyBwYXJhbWV0ZXJzIGZvciBncm91cGluZyBkZWNvcmF0b3JzXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgZm9yIHNwZWNpZnlpbmcgZ3JvdXAgc29ydGluZyBvcHRpb25zXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBHcm91cFNvcnRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBwcmlvcml0eSAtIFRoZSBwcmlvcml0eSBvZiB0aGUgc29ydGluZyBvcGVyYXRpb24sIGxvd2VyIG51bWJlcnMgcmVwcmVzZW50IGhpZ2hlciBwcmlvcml0eVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtncm91cF0gLSBPcHRpb25hbCBwcm9wZXJ0eSB0byBncm91cCBkZWNvcmF0b3JzLCB1c2VkIGZvciBncm91cGluZyByZWxhdGVkIG9wZXJhdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZ3JvdXBQcmlvcml0eV0gLSBPcHRpb25hbCBwcm9wZXJ0eSB0byBzcGVjaWZ5IHRoZSBwcmlvcml0eSB3aXRoaW4gYSBncm91cCwgbG93ZXIgbnVtYmVycyByZXByZXNlbnQgaGlnaGVyIHByaW9yaXR5IHdpdGhpbiB0aGUgZ3JvdXBcbiAqIEBjYXRlZ29yeSBUeXBlIERlZmluaXRpb25zXG4gKi9cbmV4cG9ydCB0eXBlIEdyb3VwU29ydCA9IHtcbiAgcHJpb3JpdHk6IG51bWJlcjtcbiAgZ3JvdXA/OiBzdHJpbmc7XG4gIGdyb3VwUHJpb3JpdHk/OiBudW1iZXI7XG59O1xuXG5jb25zdCBkZWZhdWx0UHJpb3JpdHkgPSA1MDtcblxuY29uc3QgRGVmYXVsdEdyb3VwU29ydDogR3JvdXBTb3J0ID0geyBwcmlvcml0eTogZGVmYXVsdFByaW9yaXR5IH07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvck9iamVjdCB0eXBlIGRlZmluaXRpb25cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHN0cnVjdHVyZSBvZiBhbiBvYmplY3QgdXNlZCB0byByZXByZXNlbnQgYSBkZWNvcmF0b3IgaW4gdGhlIGNvbnRleHQgb2YgZGF0YWJhc2Ugb3BlcmF0aW9ucy5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IERlY29yYXRvck9iamVjdFxuICogQHByb3BlcnR5IHtPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBhbnksIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBoYW5kbGVyIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGR1cmluZyB0aGUgb3BlcmF0aW9uXG4gKiBAcHJvcGVydHkge29iamVjdH0gZGF0YSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIGJlIHBhc3NlZCB0byB0aGUgaGFuZGxlciBmdW5jdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb3AgLSBUaGUgcHJvcGVydHkga2V5IHRvIHdoaWNoIHRoZSBkZWNvcmF0b3IgaXMgYXBwbGllZFxuICogQGNhdGVnb3J5IFR5cGUgRGVmaW5pdGlvbnNcbiAqL1xuZXhwb3J0IHR5cGUgRGVjb3JhdG9yT2JqZWN0ID0ge1xuICBoYW5kbGVyOiBPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBhbnksIGFueSwgYW55PjtcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgYW55PltdO1xuICBwcm9wOiBzdHJpbmdbXTtcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEludGVybmFsIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyIG9wZXJhdGlvbiBoYW5kbGVyc1xuICogQHN1bW1hcnkgUmVnaXN0ZXJzIGFuIG9wZXJhdGlvbiBoYW5kbGVyIGZvciBhIHNwZWNpZmljIG9wZXJhdGlvbiBrZXkgb24gYSB0YXJnZXQgcHJvcGVydHlcbiAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c30gb3AgLSBUaGUgb3BlcmF0aW9uIGtleSB0byBoYW5kbGVcbiAqIEBwYXJhbSB7T3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgYW55LCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgaGFuZGxlciBmdW5jdGlvbiB0byByZWdpc3RlclxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgcmVnaXN0ZXJzIHRoZSBoYW5kbGVyXG4gKiBAZnVuY3Rpb24gaGFuZGxlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5mdW5jdGlvbiBoYW5kbGUoXG4gIG9wOiBPcGVyYXRpb25LZXlzLFxuICBoYW5kbGVyOiBPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBhbnksIGFueSwgYW55PlxuKSB7XG4gIHJldHVybiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcbiAgICBPcGVyYXRpb25zLnJlZ2lzdGVyKGhhbmRsZXIsIG9wLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGRlY29yYXRvciBvYmplY3RzIGZvciBoYW5kbGluZyBkYXRhYmFzZSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSBsaXN0IG9mIGRlY29yYXRvciBvYmplY3RzIHJlcHJlc2VudGluZyBvcGVyYXRpb24gaGFuZGxlcnMgZm9yIGEgZ2l2ZW4gbW9kZWwgYW5kIGRlY29yYXRvcnNcbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBmb3IgdGhlIG1vZGVsLCBkZWZhdWx0cyB0byBNb2RlbDx0cnVlIHwgZmFsc2U+XG4gKiBAdGVtcGxhdGUgUiAtIFR5cGUgZm9yIHRoZSByZXBvc2l0b3J5LCBkZWZhdWx0cyB0byBJUmVwb3NpdG9yeTxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAdGVtcGxhdGUgRiAtIFR5cGUgZm9yIHJlcG9zaXRvcnkgZmxhZ3MsIGRlZmF1bHRzIHRvIFJlcG9zaXRvcnlGbGFnc1xuICogQHRlbXBsYXRlIEMgLSBUeXBlIGZvciBjb250ZXh0LCBkZWZhdWx0cyB0byBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge01vZGVsfSBtb2RlbCAtIFRoZSBtb2RlbCBmb3Igd2hpY2ggdG8gcmV0cmlldmUgZGVjb3JhdG9yIG9iamVjdHNcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgRGVjb3JhdG9yTWV0YWRhdGFbXT59IGRlY29yYXRvcnMgLSBUaGUgZGVjb3JhdG9ycyBhc3NvY2lhdGVkIHdpdGggdGhlIG1vZGVsIHByb3BlcnRpZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXggLSBUaGUgb3BlcmF0aW9uIHByZWZpeCAoZS5nLiwgJ29uJywgJ2FmdGVyJylcbiAqIEByZXR1cm4ge0RlY29yYXRvck9iamVjdFtdfSBBbiBhcnJheSBvZiBkZWNvcmF0b3Igb2JqZWN0cyByZXByZXNlbnRpbmcgb3BlcmF0aW9uIGhhbmRsZXJzXG4gKiBAZnVuY3Rpb24gZ2V0SGFuZGxlcnNEZWNvcmF0b3JzXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEhhbmRsZXJzRGVjb3JhdG9yczxcbiAgTSBleHRlbmRzIE1vZGVsPHRydWUgfCBmYWxzZT4sXG4gIFIgZXh0ZW5kcyBJUmVwb3NpdG9yeTxNLCBGLCBDPixcbiAgViBleHRlbmRzIG9iamVjdCA9IG9iamVjdCxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBDb250ZXh0PEY+LFxuPihcbiAgbW9kZWw6IE1vZGVsLFxuICBkZWNvcmF0b3JzOiBSZWNvcmQ8c3RyaW5nLCBEZWNvcmF0b3JNZXRhZGF0YVtdPixcbiAgcHJlZml4OiBzdHJpbmdcbik6IERlY29yYXRvck9iamVjdFtdIHtcbiAgY29uc3QgYWNjdW06IERlY29yYXRvck9iamVjdFtdID0gW107XG4gIGZvciAoY29uc3QgcHJvcCBpbiBkZWNvcmF0b3JzKSB7XG4gICAgY29uc3QgZGVjczogRGVjb3JhdG9yTWV0YWRhdGFbXSA9IGRlY29yYXRvcnNbcHJvcF07XG4gICAgZm9yIChjb25zdCBkZWMgb2YgZGVjcykge1xuICAgICAgY29uc3QgeyBrZXkgfSA9IGRlYyE7XG4gICAgICBjb25zdCBoYW5kbGVyczogT3BlcmF0aW9uSGFuZGxlcjxNLCBSLCBWLCBGLCBDPltdIHwgdW5kZWZpbmVkID1cbiAgICAgICAgT3BlcmF0aW9ucy5nZXQ8TSwgUiwgViwgRiwgQz4obW9kZWwsIHByb3AsIHByZWZpeCArIGtleSk7XG4gICAgICBpZiAoIWhhbmRsZXJzIHx8ICFoYW5kbGVycy5sZW5ndGgpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmluZCByZWdpc3RlcmVkIGhhbmRsZXIgZm9yIHRoZSBvcGVyYXRpb24gJHtwcmVmaXggKyBrZXl9IHVuZGVyIHByb3BlcnR5ICR7cHJvcH1gXG4gICAgICAgICk7XG5cbiAgICAgIGNvbnN0IGhhbmRsZXJBcmdzID0gZ2V0SGFuZGxlckFyZ3MoZGVjLCBwcm9wLCBtb2RlbCBhcyBhbnkpO1xuXG4gICAgICBpZiAoIWhhbmRsZXJBcmdzIHx8IE9iamVjdC52YWx1ZXMoaGFuZGxlckFyZ3MpLmxlbmd0aCAhPT0gaGFuZGxlcnMubGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIkFyZ3MgYW5kIGhhbmRsZXJzIGxlbmd0aCBkbyBub3QgbWF0Y2hcIik7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGFuZGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IChoYW5kbGVyQXJnc1toYW5kbGVyc1tpXS5uYW1lXSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVxuICAgICAgICAgIC5kYXRhO1xuICAgICAgICBhY2N1bS5wdXNoKHtcbiAgICAgICAgICBoYW5kbGVyOiBoYW5kbGVyc1tpXSxcbiAgICAgICAgICBkYXRhOiBbZGF0YV0sXG4gICAgICAgICAgcHJvcDogW3Byb3BdLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFjY3VtO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHcm91cHMgZGVjb3JhdG9ycyBiYXNlZCBvbiB0aGVpciBncm91cCBwcm9wZXJ0eVxuICogQHN1bW1hcnkgR3JvdXBzIGRlY29yYXRvciBvYmplY3RzIGJ5IHRoZWlyIGdyb3VwIHByb3BlcnR5LCBjb21iaW5pbmcgZGF0YSBhbmQgcHJvcGVydGllcyB3aXRoaW4gZWFjaCBncm91cFxuICogQHBhcmFtIHtEZWNvcmF0b3JPYmplY3RbXX0gZGVjb3JhdG9ycyAtIFRoZSBhcnJheSBvZiBkZWNvcmF0b3Igb2JqZWN0cyB0byBncm91cFxuICogQHJldHVybiB7RGVjb3JhdG9yT2JqZWN0W119IEFuIGFycmF5IG9mIGdyb3VwZWQgZGVjb3JhdG9yIG9iamVjdHNcbiAqIEBmdW5jdGlvbiBncm91cERlY29yYXRvcnNcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBEZWNvcmF0b3JzKFxuICBkZWNvcmF0b3JzOiBEZWNvcmF0b3JPYmplY3RbXVxuKTogRGVjb3JhdG9yT2JqZWN0W10ge1xuICBjb25zdCBncm91cGVkID0gZGVjb3JhdG9ycy5yZWR1Y2U8TWFwPHN0cmluZyB8IHN5bWJvbCwgRGVjb3JhdG9yT2JqZWN0Pj4oXG4gICAgKGFjYywgZGVjKSA9PiB7XG4gICAgICBpZiAoIWRlYyB8fCAhZGVjLmRhdGEgfHwgIWRlYy5wcm9wKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc3NpbmcgZGVjb3JhdG9yIHByb3BlcnRpZXMgb3IgZGF0YVwiKTtcblxuICAgICAgLy8gSWYgZGVjb3JhdG9yIGhhdmUgbm8gZ3JvdXBcbiAgICAgIGlmICghZGVjLmRhdGFbMF0uZ3JvdXApIHtcbiAgICAgICAgYWNjLnNldChTeW1ib2woKSwgZGVjKTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH1cblxuICAgICAgY29uc3QgZ3JvdXBLZXkgPSBkZWMuZGF0YVswXS5ncm91cDtcblxuICAgICAgaWYgKCFhY2MuaGFzKGdyb3VwS2V5KSkge1xuICAgICAgICAvLyBmaXJzdCBoYW5kbGVyIGlzIHNhdmVkIGluIHRoZSBncm91cFxuICAgICAgICBhY2Muc2V0KGdyb3VwS2V5LCB7IC4uLmRlYyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gYWNjLmdldChncm91cEtleSkhO1xuXG4gICAgICAgIGFjYy5zZXQoZ3JvdXBLZXksIHtcbiAgICAgICAgICBoYW5kbGVyOiBleGlzdGluZy5oYW5kbGVyLFxuICAgICAgICAgIGRhdGE6IFsuLi5leGlzdGluZy5kYXRhLCAuLi5kZWMuZGF0YV0sXG4gICAgICAgICAgcHJvcDogWy4uLmV4aXN0aW5nLnByb3AsIC4uLmRlYy5wcm9wXSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSxcbiAgICBuZXcgTWFwKClcbiAgKTtcblxuICBjb25zdCBncm91cHMgPSBBcnJheS5mcm9tKGdyb3VwZWQudmFsdWVzKCkpO1xuXG4gIC8vIFNvcnQgaW5zaWRlIGVhY2ggZ3JvdXAgYnkgcHJpb3JpdHlcbiAgZ3JvdXBzLmZvckVhY2goKGdyb3VwKSA9PiB7XG4gICAgY29uc3QgY29tYmluZWQgPSBncm91cC5kYXRhLm1hcCgoZCwgaSkgPT4gKHtcbiAgICAgIGRhdGE6IGQsXG4gICAgICBwcm9wOiBncm91cC5wcm9wW2ldLFxuICAgIH0pKTtcblxuICAgIGNvbWJpbmVkLnNvcnQoXG4gICAgICAoYSwgYikgPT4gKGEuZGF0YS5ncm91cFByaW9yaXR5ID8/IDUwKSAtIChiLmRhdGEuZ3JvdXBQcmlvcml0eSA/PyA1MClcbiAgICApO1xuXG4gICAgZ3JvdXAuZGF0YSA9IGNvbWJpbmVkLm1hcCgoYykgPT4gYy5kYXRhKTtcbiAgICBncm91cC5wcm9wID0gY29tYmluZWQubWFwKChjKSA9PiBjLnByb3ApO1xuICB9KTtcblxuICByZXR1cm4gZ3JvdXBzO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTb3J0cyBkZWNvcmF0b3Igb2JqZWN0cyBiYXNlZCBvbiB0aGVpciBwcmlvcml0eVxuICogQHN1bW1hcnkgU29ydHMgYW4gYXJyYXkgb2YgZGVjb3JhdG9yIG9iamVjdHMgYnkgdGhlIHByaW9yaXR5IG9mIHRoZWlyIGZpcnN0IGRhdGEgZWxlbWVudFxuICogQHBhcmFtIHtEZWNvcmF0b3JPYmplY3RbXX0gZGVjb3JhdG9ycyAtIFRoZSBhcnJheSBvZiBkZWNvcmF0b3Igb2JqZWN0cyB0byBzb3J0XG4gKiBAcmV0dXJuIHtEZWNvcmF0b3JPYmplY3RbXX0gVGhlIHNvcnRlZCBhcnJheSBvZiBkZWNvcmF0b3Igb2JqZWN0c1xuICogQGZ1bmN0aW9uIHNvcnREZWNvcmF0b3JzXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvcnREZWNvcmF0b3JzKFxuICBkZWNvcmF0b3JzOiBEZWNvcmF0b3JPYmplY3RbXVxuKTogRGVjb3JhdG9yT2JqZWN0W10ge1xuICAvLyBTb3J0IGJ5IGdyb3VwUHJpb3JpdHlcbiAgZGVjb3JhdG9ycy5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3QgcHJpb3JpdHlBID0gYS5kYXRhWzBdLnByaW9yaXR5ID8/IGRlZmF1bHRQcmlvcml0eTtcbiAgICBjb25zdCBwcmlvcml0eUIgPSBiLmRhdGFbMF0ucHJpb3JpdHkgPz8gZGVmYXVsdFByaW9yaXR5O1xuICAgIHJldHVybiBwcmlvcml0eUEgLSBwcmlvcml0eUI7IC8vIGxvd2VyIG51bWJlciA9IGhpZ2hlciBwcmlvcml0eVxuICB9KTtcblxuICByZXR1cm4gZGVjb3JhdG9ycztcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIGZvciBoYW5kbGluZyBjcmVhdGUgYW5kIHVwZGF0ZSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgYmVoYXZpb3IgdG8gZXhlY3V0ZSBkdXJpbmcgYm90aCBjcmVhdGUgYW5kIHVwZGF0ZSBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhLCBkZWZhdWx0cyB0byBvYmplY3RcbiAqIEBwYXJhbSB7R2VuZXJhbE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PiB8IEdlbmVyYWxVcGRhdGVPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCB1cG9uIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gW2RhdGFdIC0gT3B0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIG9uQ3JlYXRlVXBkYXRlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25DcmVhdGVVcGRhdGU8ViA9IG9iamVjdD4oXG4gIGhhbmRsZXI6XG4gICAgfCBHZW5lcmFsT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+XG4gICAgfCBHZW5lcmFsVXBkYXRlT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhPzogVixcbiAgZ3JvdXBzb3J0PzogR3JvdXBTb3J0XG4pIHtcbiAgcmV0dXJuIG9uKERCT3BlcmF0aW9ucy5DUkVBVEVfVVBEQVRFLCBoYW5kbGVyLCBkYXRhLCBncm91cHNvcnQpO1xufVxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIGZvciBoYW5kbGluZyB1cGRhdGUgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgRGVmaW5lcyBhIGJlaGF2aW9yIHRvIGV4ZWN1dGUgZHVyaW5nIHVwZGF0ZSBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhLCBkZWZhdWx0cyB0byBvYmplY3RcbiAqIEBwYXJhbSB7VXBkYXRlT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55Pn0gaGFuZGxlciAtIFRoZSBtZXRob2QgY2FsbGVkIHVwb24gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBbZGF0YV0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gb25VcGRhdGVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvblVwZGF0ZTxWID0gb2JqZWN0PihcbiAgaGFuZGxlcjogVXBkYXRlT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55PixcbiAgZGF0YT86IFYsXG4gIGdyb3Vwc29ydD86IEdyb3VwU29ydFxuKSB7XG4gIHJldHVybiBvbihEQk9wZXJhdGlvbnMuVVBEQVRFLCBoYW5kbGVyLCBkYXRhLCBncm91cHNvcnQpO1xufVxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIGZvciBoYW5kbGluZyBjcmVhdGUgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgRGVmaW5lcyBhIGJlaGF2aW9yIHRvIGV4ZWN1dGUgZHVyaW5nIGNyZWF0ZSBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhLCBkZWZhdWx0cyB0byBvYmplY3RcbiAqIEBwYXJhbSB7R2VuZXJhbE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBtZXRob2QgY2FsbGVkIHVwb24gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBbZGF0YV0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gb25DcmVhdGVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkNyZWF0ZTxWID0gb2JqZWN0PihcbiAgaGFuZGxlcjogR2VuZXJhbE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PixcbiAgZGF0YT86IFYsXG4gIGdyb3Vwc29ydD86IEdyb3VwU29ydFxuKSB7XG4gIHJldHVybiBvbihEQk9wZXJhdGlvbnMuQ1JFQVRFLCBoYW5kbGVyLCBkYXRhLCBncm91cHNvcnQpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgZm9yIGhhbmRsaW5nIHJlYWQgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgRGVmaW5lcyBhIGJlaGF2aW9yIHRvIGV4ZWN1dGUgZHVyaW5nIHJlYWQgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAcGFyYW0ge0lkT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+fSBoYW5kbGVyIC0gVGhlIG1ldGhvZCBjYWxsZWQgdXBvbiB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IFtkYXRhXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBvblJlYWRcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvblJlYWQ8ViA9IG9iamVjdD4oXG4gIGhhbmRsZXI6IElkT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhOiBWLFxuICBncm91cHNvcnQ/OiBHcm91cFNvcnRcbikge1xuICByZXR1cm4gb24oREJPcGVyYXRpb25zLlJFQUQsIGhhbmRsZXIsIGRhdGEsIGdyb3Vwc29ydCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBmb3IgaGFuZGxpbmcgZGVsZXRlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBiZWhhdmlvciB0byBleGVjdXRlIGR1cmluZyBkZWxldGUgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAcGFyYW0ge09wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBtZXRob2QgY2FsbGVkIHVwb24gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBbZGF0YV0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gb25EZWxldGVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkRlbGV0ZTxWID0gb2JqZWN0PihcbiAgaGFuZGxlcjogT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhOiBWLFxuICBncm91cHNvcnQ/OiBHcm91cFNvcnRcbikge1xuICByZXR1cm4gb24oREJPcGVyYXRpb25zLkRFTEVURSwgaGFuZGxlciwgZGF0YSwgZ3JvdXBzb3J0KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIGZvciBoYW5kbGluZyBhbGwgb3BlcmF0aW9uIHR5cGVzXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgYmVoYXZpb3IgdG8gZXhlY3V0ZSBkdXJpbmcgYW55IGRhdGFiYXNlIG9wZXJhdGlvblxuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAcGFyYW0ge09wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBtZXRob2QgY2FsbGVkIHVwb24gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBbZGF0YV0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gb25BbnlcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkFueTxWID0gb2JqZWN0PihcbiAgaGFuZGxlcjogT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhOiBWLFxuICBncm91cHNvcnQ/OiBHcm91cFNvcnRcbikge1xuICByZXR1cm4gb24oREJPcGVyYXRpb25zLkFMTCwgaGFuZGxlciwgZGF0YSwgZ3JvdXBzb3J0KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQmFzZSBkZWNvcmF0b3IgZm9yIGhhbmRsaW5nIGRhdGFiYXNlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBiZWhhdmlvciB0byBleGVjdXRlIGR1cmluZyBzcGVjaWZpZWQgZGF0YWJhc2Ugb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAcGFyYW0ge09wZXJhdGlvbktleXNbXSB8IERCT3BlcmF0aW9uc30gW29wPURCT3BlcmF0aW9ucy5BTExdIC0gT25lIG9yIG1vcmUgb3BlcmF0aW9uIHR5cGVzIHRvIGhhbmRsZVxuICogQHBhcmFtIHtPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCB1cG9uIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gW2RhdGFdIC0gT3B0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIG9uXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIC8vIEV4YW1wbGUgdXNhZ2U6XG4gKiBjbGFzcyBNeU1vZGVsIHtcbiAqICAgQG9uKERCT3BlcmF0aW9ucy5DUkVBVEUsIG15SGFuZGxlcilcbiAqICAgbXlQcm9wZXJ0eTogc3RyaW5nO1xuICogfVxuICovXG5leHBvcnQgZnVuY3Rpb24gb248ViA9IG9iamVjdD4oXG4gIG9wOiBPcGVyYXRpb25LZXlzW10gPSBEQk9wZXJhdGlvbnMuQUxMLFxuICBoYW5kbGVyOiBPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT4sXG4gIGRhdGE/OiBWLFxuICBncm91cHNvcnQ/OiBHcm91cFNvcnRcbikge1xuICByZXR1cm4gb3BlcmF0aW9uKE9wZXJhdGlvbktleXMuT04sIG9wLCBoYW5kbGVyLCBkYXRhLCBncm91cHNvcnQpO1xufVxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIGZvciBoYW5kbGluZyBwb3N0LWNyZWF0ZSBhbmQgcG9zdC11cGRhdGUgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgRGVmaW5lcyBhIGJlaGF2aW9yIHRvIGV4ZWN1dGUgYWZ0ZXIgYm90aCBjcmVhdGUgYW5kIHVwZGF0ZSBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhLCBkZWZhdWx0cyB0byBvYmplY3RcbiAqIEBwYXJhbSB7U3RhbmRhcmRPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT4gfCBVcGRhdGVPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCBhZnRlciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IFtkYXRhXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBhZnRlckNyZWF0ZVVwZGF0ZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFmdGVyQ3JlYXRlVXBkYXRlPFYgPSBvYmplY3Q+KFxuICBoYW5kbGVyOlxuICAgIHwgU3RhbmRhcmRPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT5cbiAgICB8IFVwZGF0ZU9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PixcbiAgZGF0YTogVixcbiAgZ3JvdXBzb3J0PzogR3JvdXBTb3J0XG4pIHtcbiAgcmV0dXJuIGFmdGVyKERCT3BlcmF0aW9ucy5DUkVBVEVfVVBEQVRFLCBoYW5kbGVyLCBkYXRhLCBncm91cHNvcnQpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgZm9yIGhhbmRsaW5nIHBvc3QtdXBkYXRlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBiZWhhdmlvciB0byBleGVjdXRlIGFmdGVyIHVwZGF0ZSBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhLCBkZWZhdWx0cyB0byBvYmplY3RcbiAqIEBwYXJhbSB7VXBkYXRlT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+fSBoYW5kbGVyIC0gVGhlIG1ldGhvZCBjYWxsZWQgYWZ0ZXIgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBbZGF0YV0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gYWZ0ZXJVcGRhdGVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZnRlclVwZGF0ZTxWID0gb2JqZWN0PihcbiAgaGFuZGxlcjogVXBkYXRlT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhOiBWLFxuICBncm91cHNvcnQ/OiBHcm91cFNvcnRcbikge1xuICByZXR1cm4gYWZ0ZXIoREJPcGVyYXRpb25zLlVQREFURSwgaGFuZGxlciwgZGF0YSwgZ3JvdXBzb3J0KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIGZvciBoYW5kbGluZyBwb3N0LWNyZWF0ZSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgYmVoYXZpb3IgdG8gZXhlY3V0ZSBhZnRlciBjcmVhdGUgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAcGFyYW0ge1N0YW5kYXJkT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+fSBoYW5kbGVyIC0gVGhlIG1ldGhvZCBjYWxsZWQgYWZ0ZXIgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBbZGF0YV0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gYWZ0ZXJDcmVhdGVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZnRlckNyZWF0ZTxWID0gb2JqZWN0PihcbiAgaGFuZGxlcjogU3RhbmRhcmRPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT4sXG4gIGRhdGE6IFYsXG4gIGdyb3Vwc29ydD86IEdyb3VwU29ydFxuKSB7XG4gIHJldHVybiBhZnRlcihEQk9wZXJhdGlvbnMuQ1JFQVRFLCBoYW5kbGVyLCBkYXRhLCBncm91cHNvcnQpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgZm9yIGhhbmRsaW5nIHBvc3QtcmVhZCBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgYmVoYXZpb3IgdG8gZXhlY3V0ZSBhZnRlciByZWFkIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGEsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHBhcmFtIHtTdGFuZGFyZE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBtZXRob2QgY2FsbGVkIGFmdGVyIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gW2RhdGFdIC0gT3B0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIGFmdGVyUmVhZFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFmdGVyUmVhZDxWID0gb2JqZWN0PihcbiAgaGFuZGxlcjogU3RhbmRhcmRPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT4sXG4gIGRhdGE/OiBWLFxuICBncm91cHNvcnQ/OiBHcm91cFNvcnRcbikge1xuICByZXR1cm4gYWZ0ZXIoREJPcGVyYXRpb25zLlJFQUQsIGhhbmRsZXIsIGRhdGEsIGdyb3Vwc29ydCk7XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgZm9yIGhhbmRsaW5nIHBvc3QtZGVsZXRlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBiZWhhdmlvciB0byBleGVjdXRlIGFmdGVyIGRlbGV0ZSBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhLCBkZWZhdWx0cyB0byBvYmplY3RcbiAqIEBwYXJhbSB7U3RhbmRhcmRPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCBhZnRlciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IFtkYXRhXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBhZnRlckRlbGV0ZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFmdGVyRGVsZXRlPFYgPSBvYmplY3Q+KFxuICBoYW5kbGVyOiBTdGFuZGFyZE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PixcbiAgZGF0YT86IFYsXG4gIGdyb3Vwc29ydD86IEdyb3VwU29ydFxuKSB7XG4gIHJldHVybiBhZnRlcihEQk9wZXJhdGlvbnMuREVMRVRFLCBoYW5kbGVyLCBkYXRhLCBncm91cHNvcnQpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgZm9yIGhhbmRsaW5nIHBvc3Qtb3BlcmF0aW9uIGZvciBhbGwgb3BlcmF0aW9uIHR5cGVzXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgYmVoYXZpb3IgdG8gZXhlY3V0ZSBhZnRlciBhbnkgZGF0YWJhc2Ugb3BlcmF0aW9uXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhLCBkZWZhdWx0cyB0byBvYmplY3RcbiAqIEBwYXJhbSB7U3RhbmRhcmRPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCBhZnRlciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IFtkYXRhXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBhZnRlckFueVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFmdGVyQW55PFYgPSBvYmplY3Q+KFxuICBoYW5kbGVyOiBTdGFuZGFyZE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PixcbiAgZGF0YT86IFYsXG4gIGdyb3Vwc29ydD86IEdyb3VwU29ydFxuKSB7XG4gIHJldHVybiBhZnRlcihEQk9wZXJhdGlvbnMuQUxMLCBoYW5kbGVyLCBkYXRhLCBncm91cHNvcnQpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBCYXNlIGRlY29yYXRvciBmb3IgaGFuZGxpbmcgcG9zdC1vcGVyYXRpb24gYmVoYXZpb3JzXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgYmVoYXZpb3IgdG8gZXhlY3V0ZSBhZnRlciBzcGVjaWZpZWQgZGF0YWJhc2Ugb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAcGFyYW0ge09wZXJhdGlvbktleXNbXSB8IERCT3BlcmF0aW9uc30gW29wPURCT3BlcmF0aW9ucy5BTExdIC0gT25lIG9yIG1vcmUgb3BlcmF0aW9uIHR5cGVzIHRvIGhhbmRsZVxuICogQHBhcmFtIHtPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCBhZnRlciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IFtkYXRhXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBhZnRlclxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiAvLyBFeGFtcGxlIHVzYWdlOlxuICogY2xhc3MgTXlNb2RlbCB7XG4gKiAgIEBhZnRlcihEQk9wZXJhdGlvbnMuQ1JFQVRFLCBteUhhbmRsZXIpXG4gKiAgIG15UHJvcGVydHk6IHN0cmluZztcbiAqIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFmdGVyPFYgPSBvYmplY3Q+KFxuICBvcDogT3BlcmF0aW9uS2V5c1tdID0gREJPcGVyYXRpb25zLkFMTCxcbiAgaGFuZGxlcjogT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhPzogVixcbiAgZ3JvdXBzb3J0PzogR3JvdXBTb3J0XG4pIHtcbiAgcmV0dXJuIG9wZXJhdGlvbihPcGVyYXRpb25LZXlzLkFGVEVSLCBvcCwgaGFuZGxlciwgZGF0YSwgZ3JvdXBzb3J0KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29yZSBkZWNvcmF0b3IgZmFjdG9yeSBmb3Igb3BlcmF0aW9uIGhhbmRsZXJzXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGRlY29yYXRvcnMgdGhhdCByZWdpc3RlciBoYW5kbGVycyBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAcGFyYW0ge09wZXJhdGlvbktleXMuT04gfCBPcGVyYXRpb25LZXlzLkFGVEVSfSBiYXNlT3AgLSBXaGV0aGVyIHRoZSBoYW5kbGVyIHJ1bnMgZHVyaW5nIG9yIGFmdGVyIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c1tdfSBbb3BlcmF0aW9uPURCT3BlcmF0aW9ucy5BTExdIC0gVGhlIHNwZWNpZmljIG9wZXJhdGlvbnMgdG8gaGFuZGxlXG4gKiBAcGFyYW0ge09wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBoYW5kbGVyIGZ1bmN0aW9uIHRvIGV4ZWN1dGVcbiAqIEBwYXJhbSB7Vn0gW2RhdGFUb0FkZF0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gb3BlcmF0aW9uXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRGVjb3JhdG9yIGFzIEBvcGVyYXRpb25cbiAqICAgcGFydGljaXBhbnQgT3BlcmF0aW9ucyBhcyBPcGVyYXRpb25zIFJlZ2lzdHJ5XG4gKiAgIHBhcnRpY2lwYW50IEhhbmRsZXJcbiAqXG4gKiAgIENsaWVudC0+PkRlY29yYXRvcjogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgRGVjb3JhdG9yLT4+T3BlcmF0aW9uczogUmVnaXN0ZXIgaGFuZGxlclxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IFN0b3JlIG1ldGFkYXRhXG4gKlxuICogICBOb3RlIG92ZXIgQ2xpZW50LEhhbmRsZXI6IExhdGVyLCBkdXJpbmcgb3BlcmF0aW9uIGV4ZWN1dGlvblxuICogICBDbGllbnQtPj5PcGVyYXRpb25zOiBFeGVjdXRlIG9wZXJhdGlvblxuICogICBPcGVyYXRpb25zLT4+SGFuZGxlcjogQ2FsbCByZWdpc3RlcmVkIGhhbmRsZXJcbiAqICAgSGFuZGxlci0tPj5PcGVyYXRpb25zOiBSZXR1cm4gcmVzdWx0XG4gKiAgIE9wZXJhdGlvbnMtLT4+Q2xpZW50OiBSZXR1cm4gZmluYWwgcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcGVyYXRpb248ViA9IG9iamVjdD4oXG4gIGJhc2VPcDogT3BlcmF0aW9uS2V5cy5PTiB8IE9wZXJhdGlvbktleXMuQUZURVIsXG4gIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5c1tdID0gREJPcGVyYXRpb25zLkFMTCxcbiAgaGFuZGxlcjogT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhVG9BZGQ/OiBWLFxuICBncm91cHNvcnQ6IEdyb3VwU29ydCA9IERlZmF1bHRHcm91cFNvcnRcbikge1xuICByZXR1cm4gKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGNvbnN0IG5hbWUgPSB0YXJnZXQuY29uc3RydWN0b3IubmFtZTtcbiAgICBjb25zdCBkZWNvcmF0b3JzID0gb3BlcmF0aW9uLnJlZHVjZSgoYWNjdW06IGFueVtdLCBvcCkgPT4ge1xuICAgICAgY29uc3QgY29tcG91bmRLZXkgPSBiYXNlT3AgKyBvcDtcbiAgICAgIGxldCBkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgT3BlcmF0aW9ucy5rZXkoY29tcG91bmRLZXkpLFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHByb3BlcnR5S2V5XG4gICAgICApO1xuICAgICAgaWYgKCFkYXRhKVxuICAgICAgICBkYXRhID0ge1xuICAgICAgICAgIG9wZXJhdGlvbjogb3AsXG4gICAgICAgICAgaGFuZGxlcnM6IHt9LFxuICAgICAgICB9O1xuXG4gICAgICBjb25zdCBoYW5kbGVyS2V5ID0gT3BlcmF0aW9ucy5nZXRIYW5kbGVyTmFtZShoYW5kbGVyKTtcblxuICAgICAgbGV0IG1lcmdlRGF0YSA9IGdyb3Vwc29ydDtcblxuICAgICAgaWYgKGRhdGFUb0FkZCkge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZGF0YVRvQWRkKS5maWx0ZXIoKGtleSkgPT4ga2V5IGluIGdyb3Vwc29ydCkubGVuZ3RoID4gMClcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgIGBVbmFibGUgdG8gbWVyZ2UgZ3JvdXBTb3J0IGludG8gZGF0YVRvQWRkIGR1ZSB0byBvdmVybGFwaW5nIGtleXNgXG4gICAgICAgICAgKTtcblxuICAgICAgICBtZXJnZURhdGEgPSB7IC4uLmdyb3Vwc29ydCwgLi4uZGF0YVRvQWRkIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgIWRhdGEuaGFuZGxlcnNbbmFtZV0gfHxcbiAgICAgICAgIWRhdGEuaGFuZGxlcnNbbmFtZV1bcHJvcGVydHlLZXldIHx8XG4gICAgICAgICEoaGFuZGxlcktleSBpbiBkYXRhLmhhbmRsZXJzW25hbWVdW3Byb3BlcnR5S2V5XSlcbiAgICAgICkge1xuICAgICAgICBkYXRhLmhhbmRsZXJzW25hbWVdID0gZGF0YS5oYW5kbGVyc1tuYW1lXSB8fCB7fTtcbiAgICAgICAgZGF0YS5oYW5kbGVyc1tuYW1lXVtwcm9wZXJ0eUtleV0gPVxuICAgICAgICAgIGRhdGEuaGFuZGxlcnNbbmFtZV1bcHJvcGVydHlLZXldIHx8IHt9O1xuICAgICAgICBkYXRhLmhhbmRsZXJzW25hbWVdW3Byb3BlcnR5S2V5XVtoYW5kbGVyS2V5XSA9IHtcbiAgICAgICAgICBkYXRhOiBtZXJnZURhdGEsXG4gICAgICAgIH07XG5cbiAgICAgICAgYWNjdW0ucHVzaChcbiAgICAgICAgICBoYW5kbGUoY29tcG91bmRLZXkgYXMgT3BlcmF0aW9uS2V5cywgaGFuZGxlciksXG4gICAgICAgICAgcHJvcE1ldGFkYXRhKE9wZXJhdGlvbnMua2V5KGNvbXBvdW5kS2V5KSwgZGF0YSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCBbXSk7XG4gICAgcmV0dXJuIGFwcGx5KC4uLmRlY29yYXRvcnMpKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgUmVwb3NpdG9yeUZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBjb25maWd1cmF0aW9uIGZsYWdzIGZvciByZXBvc2l0b3J5IG9wZXJhdGlvbnMuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBkZWZhdWx0IHZhbHVlcyBmb3IgcmVwb3NpdG9yeSBvcGVyYXRpb24gZmxhZ3MsIGV4Y2x1ZGluZyB0aGUgdGltZXN0YW1wIHByb3BlcnR5LlxuICogVGhlc2UgZmxhZ3MgY29udHJvbCBiZWhhdmlvciBzdWNoIGFzIGNvbnRleHQgaGFuZGxpbmcsIHZhbGlkYXRpb24sIGVycm9yIGhhbmRsaW5nLCBhbmQgbW9yZS5cbiAqIEBjb25zdCBEZWZhdWx0UmVwb3NpdG9yeUZsYWdzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRSZXBvc2l0b3J5RmxhZ3M6IE9taXQ8UmVwb3NpdG9yeUZsYWdzLCBcInRpbWVzdGFtcFwiPiA9IHtcbiAgcGFyZW50Q29udGV4dDogdW5kZWZpbmVkLFxuICBjaGlsZENvbnRleHRzOiBbXSxcbiAgaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzOiBbXSxcbiAgY2FsbEFyZ3M6IFtdLFxuICB3cml0ZU9wZXJhdGlvbjogZmFsc2UsXG4gIGFmZmVjdGVkVGFibGVzOiBbXSxcbiAgb3BlcmF0aW9uOiB1bmRlZmluZWQsXG4gIGJyZWFrT25IYW5kbGVyRXJyb3I6IHRydWUsXG4gIHJlYnVpbGRXaXRoVHJhbnNpZW50OiB0cnVlLFxufTtcbiIsImltcG9ydCB7IENvbnRleHRBcmdzIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IENvbnRleHR1YWwgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9Db250ZXh0dWFsXCI7XG5pbXBvcnQgeyBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIi4uL29wZXJhdGlvbnMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBEZWZhdWx0UmVwb3NpdG9yeUZsYWdzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBPYmplY3RBY2N1bXVsYXRvciB9IGZyb20gXCJ0eXBlZC1vYmplY3QtYWNjdW11bGF0b3JcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnlGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZhY3RvcnkgdHlwZSBmb3IgY3JlYXRpbmcgY29udGV4dCBpbnN0YW5jZXMuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgZnVuY3Rpb24gdHlwZSB0aGF0IGNyZWF0ZXMgY29udGV4dCBpbnN0YW5jZXMgd2l0aCBzcGVjaWZpYyByZXBvc2l0b3J5IGZsYWdzLlxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlIGV4dGVuZGluZyBSZXBvc2l0b3J5RmxhZ3NcbiAqIEB0eXBlZGVmIHtGdW5jdGlvbn0gQ29udGV4dEZhY3RvcnlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBDb250ZXh0RmFjdG9yeTxGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzPiA9IDxDIGV4dGVuZHMgQ29udGV4dDxGPj4oXG4gIGFyZzogT21pdDxGLCBcInRpbWVzdGFtcFwiPlxuKSA9PiBDO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IGZhY3RvcnkgZm9yIGNyZWF0aW5nIGNvbnRleHQgaW5zdGFuY2VzLlxuICogQHN1bW1hcnkgQSBmYWN0b3J5IGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBuZXcgQ29udGV4dCBpbnN0YW5jZXMgd2l0aCB0aGUgcHJvdmlkZWQgcmVwb3NpdG9yeSBmbGFncy5cbiAqIEl0IGF1dG9tYXRpY2FsbHkgYWRkcyBhIHRpbWVzdGFtcCB0byB0aGUgY29udGV4dCBhbmQgcmV0dXJucyBhIHByb3Blcmx5IHR5cGVkIGNvbnRleHQgaW5zdGFuY2UuXG4gKiBAY29uc3QgRGVmYXVsdENvbnRleHRGYWN0b3J5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRDb250ZXh0RmFjdG9yeTogQ29udGV4dEZhY3Rvcnk8YW55PiA9IDxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICBhcmc6IE9taXQ8RiwgXCJ0aW1lc3RhbXBcIj5cbikgPT4ge1xuICByZXR1cm4gbmV3IENvbnRleHQ8Rj4oKS5hY2N1bXVsYXRlKFxuICAgIE9iamVjdC5hc3NpZ24oe30sIGFyZywgeyB0aW1lc3RhbXA6IG5ldyBEYXRlKCkgfSkgYXMgRlxuICApIGFzIEM7XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIGNvbnRleHQgbWFuYWdlbWVudCBjbGFzcyBmb3IgaGFuZGxpbmcgcmVwb3NpdG9yeSBvcGVyYXRpb25zLlxuICogQHN1bW1hcnkgVGhlIENvbnRleHQgY2xhc3MgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIG1hbmFnaW5nIHJlcG9zaXRvcnkgb3BlcmF0aW9ucyB3aXRoIGZsYWdzLFxuICogcGFyZW50LWNoaWxkIHJlbGF0aW9uc2hpcHMsIGFuZCBzdGF0ZSBhY2N1bXVsYXRpb24uIEl0IGFsbG93cyBmb3IgaGllcmFyY2hpY2FsIGNvbnRleHQgY2hhaW5zXG4gKiBhbmQgbWFpbnRhaW5zIG9wZXJhdGlvbi1zcGVjaWZpYyBjb25maWd1cmF0aW9ucyB3aGlsZSBzdXBwb3J0aW5nIHR5cGUgc2FmZXR5IHRocm91Z2ggZ2VuZXJpY3MuXG4gKlxuICogQHRlbXBsYXRlIEYgLSBUeXBlIGV4dGVuZGluZyBSZXBvc2l0b3J5RmxhZ3MgdGhhdCBkZWZpbmVzIHRoZSBjb250ZXh0IGNvbmZpZ3VyYXRpb25cbiAqXG4gKiBAcGFyYW0ge09iamVjdEFjY3VtdWxhdG9yPEY+fSBjYWNoZSAtIFRoZSBpbnRlcm5hbCBjYWNoZSBzdG9yaW5nIGFjY3VtdWxhdGVkIHZhbHVlc1xuICpcbiAqIEBjbGFzc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGluZyBhIG5ldyBjb250ZXh0IHdpdGggcmVwb3NpdG9yeSBmbGFnc1xuICogY29uc3QgY29udGV4dCA9IG5ldyBDb250ZXh0PFJlcG9zaXRvcnlGbGFncz4oKTtcbiAqXG4gKiAvLyBBY2N1bXVsYXRpbmcgdmFsdWVzXG4gKiBjb25zdCBlbnJpY2hlZENvbnRleHQgPSBjb250ZXh0LmFjY3VtdWxhdGUoe1xuICogICB3cml0ZU9wZXJhdGlvbjogdHJ1ZSxcbiAqICAgYWZmZWN0ZWRUYWJsZXM6IFsndXNlcnMnXSxcbiAqICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzLkNSRUFURVxuICogfSk7XG4gKlxuICogLy8gQWNjZXNzaW5nIHZhbHVlc1xuICogY29uc3QgaXNXcml0ZSA9IGVucmljaGVkQ29udGV4dC5nZXQoJ3dyaXRlT3BlcmF0aW9uJyk7IC8vIHRydWVcbiAqIGNvbnN0IHRhYmxlcyA9IGVucmljaGVkQ29udGV4dC5nZXQoJ2FmZmVjdGVkVGFibGVzJyk7IC8vIFsndXNlcnMnXVxuICogYGBgXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICogICBwYXJ0aWNpcGFudCBDdHggYXMgQ29udGV4dFxuICogICBwYXJ0aWNpcGFudCBDYWNoZSBhcyBPYmplY3RBY2N1bXVsYXRvclxuICpcbiAqICAgQy0+PkN0eDogbmV3IENvbnRleHQoKVxuICogICBDdHgtPj5DYWNoZTogY3JlYXRlIGNhY2hlXG4gKlxuICogICBDLT4+Q3R4OiBhY2N1bXVsYXRlKHZhbHVlKVxuICogICBDdHgtPj5DYWNoZTogYWNjdW11bGF0ZSh2YWx1ZSlcbiAqICAgQ2FjaGUtLT4+Q3R4OiB1cGRhdGVkIGNhY2hlXG4gKiAgIEN0eC0tPj5DOiB1cGRhdGVkIGNvbnRleHRcbiAqXG4gKiAgIEMtPj5DdHg6IGdldChrZXkpXG4gKiAgIEN0eC0+PkNhY2hlOiBnZXQoa2V5KVxuICogICBhbHQgS2V5IGV4aXN0cyBpbiBjYWNoZVxuICogICAgIENhY2hlLS0+PkN0eDogdmFsdWVcbiAqICAgZWxzZSBLZXkgbm90IGZvdW5kXG4gKiAgICAgQ3R4LT4+Q3R4OiBjaGVjayBwYXJlbnQgY29udGV4dFxuICogICAgIGFsdCBQYXJlbnQgZXhpc3RzXG4gKiAgICAgICBDdHgtPj5QYXJlbnQ6IGdldChrZXkpXG4gKiAgICAgICBQYXJlbnQtLT4+Q3R4OiB2YWx1ZVxuICogICAgIGVsc2UgTm8gcGFyZW50XG4gKiAgICAgICBDdHgtLT4+QzogdGhyb3cgZXJyb3JcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKiAgIEN0eC0tPj5DOiByZXF1ZXN0ZWQgdmFsdWVcbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRleHQ8RiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncz4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJjYWNoZVwiLCB7XG4gICAgICB2YWx1ZTogbmV3IE9iamVjdEFjY3VtdWxhdG9yPEY+KCksXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBmYWN0b3J5OiBDb250ZXh0RmFjdG9yeTxhbnk+ID0gRGVmYXVsdENvbnRleHRGYWN0b3J5O1xuXG4gIHJlYWRvbmx5IGNhY2hlOiBSZXBvc2l0b3J5RmxhZ3MgJiBPYmplY3RBY2N1bXVsYXRvcjxhbnk+ID1cbiAgICBuZXcgT2JqZWN0QWNjdW11bGF0b3IoKSBhcyB1bmtub3duIGFzIFJlcG9zaXRvcnlGbGFncyAmXG4gICAgICBPYmplY3RBY2N1bXVsYXRvcjxhbnk+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWNjdW11bGF0ZXMgbmV3IHZhbHVlcyBpbnRvIHRoZSBjb250ZXh0LlxuICAgKiBAc3VtbWFyeSBNZXJnZXMgdGhlIHByb3ZpZGVkIHZhbHVlIG9iamVjdCB3aXRoIHRoZSBleGlzdGluZyBjb250ZXh0IHN0YXRlLFxuICAgKiBjcmVhdGluZyBhIG5ldyBpbW11dGFibGUgY2FjaGUgc3RhdGUuXG4gICAqL1xuICBhY2N1bXVsYXRlPFYgZXh0ZW5kcyBvYmplY3Q+KHZhbHVlOiBWKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwiY2FjaGVcIiwge1xuICAgICAgdmFsdWU6ICh0aGlzLmNhY2hlIGFzIE9iamVjdEFjY3VtdWxhdG9yPGFueT4pLmFjY3VtdWxhdGUodmFsdWUpLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMgYXMgdW5rbm93biBhcyBDb250ZXh0PEYgJiBWPjtcbiAgfVxuXG4gIGdldCB0aW1lc3RhbXAoKSB7XG4gICAgcmV0dXJuICh0aGlzLmNhY2hlIGFzIGFueSkudGltZXN0YW1wIGFzIEZbXCJ0aW1lc3RhbXBcIl07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHZhbHVlIGZyb20gdGhlIGNvbnRleHQgYnkga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEByZXR1cm4ge2FueX1cbiAgICovXG4gIGdldDxLIGV4dGVuZHMga2V5b2YgRj4oa2V5OiBLKTogRltLXSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAodGhpcy5jYWNoZSBhcyBPYmplY3RBY2N1bXVsYXRvcjxhbnk+KS5nZXQoXG4gICAgICAgIGtleSBhcyB1bmtub3duIGFzIHN0cmluZ1xuICAgICAgKSBhcyBGW0tdO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9ICh0aGlzLmNhY2hlIGFzIGFueSkucGFyZW50Q29udGV4dCBhc1xuICAgICAgICB8IENvbnRleHQ8Rj5cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAocGFyZW50KSByZXR1cm4gcGFyZW50LmdldChrZXkpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBjaGlsZCBjb250ZXh0IGZyb20gYW5vdGhlciBjb250ZXh0XG4gICAqL1xuICBzdGF0aWMgY2hpbGRGcm9tPEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsIEMgZXh0ZW5kcyBDb250ZXh0PEY+PihcbiAgICBjb250ZXh0OiBDLFxuICAgIG92ZXJyaWRlcz86IFBhcnRpYWw8Rj5cbiAgKTogQyB7XG4gICAgcmV0dXJuIENvbnRleHQuZmFjdG9yeShcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sIChjb250ZXh0IGFzIGFueSkuY2FjaGUsIG92ZXJyaWRlcyB8fCB7fSlcbiAgICApIGFzIHVua25vd24gYXMgQztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBjb250ZXh0IGZyb20gb3BlcmF0aW9uIHBhcmFtZXRlcnNcbiAgICovXG4gIHN0YXRpYyBhc3luYyBmcm9tPFxuICAgIE0gZXh0ZW5kcyBNb2RlbCxcbiAgICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICAgIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuICA+KFxuICAgIG9wZXJhdGlvbjpcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5DUkVBVEVcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5SRUFEXG4gICAgICB8IE9wZXJhdGlvbktleXMuVVBEQVRFXG4gICAgICB8IE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgIG92ZXJyaWRlczogUGFydGlhbDxGPixcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8Qz4ge1xuICAgIHJldHVybiBDb250ZXh0LmZhY3RvcnkoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCBEZWZhdWx0UmVwb3NpdG9yeUZsYWdzIGFzIFJlcG9zaXRvcnlGbGFncywgb3ZlcnJpZGVzLCB7XG4gICAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uLFxuICAgICAgICBtb2RlbDogbW9kZWwsXG4gICAgICB9KVxuICAgICkgYXMgQztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYXJndW1lbnRzIGZvciBjb250ZXh0IG9wZXJhdGlvbnNcbiAgICovXG4gIHN0YXRpYyBhc3luYyBhcmdzPFxuICAgIE0gZXh0ZW5kcyBNb2RlbDxhbnk+LFxuICAgIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuICAgIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gID4oXG4gICAgb3BlcmF0aW9uOlxuICAgICAgfCBPcGVyYXRpb25LZXlzLkNSRUFURVxuICAgICAgfCBPcGVyYXRpb25LZXlzLlJFQURcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5VUERBVEVcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIGFyZ3M6IGFueVtdLFxuICAgIGNvbnRleHR1YWw/OiBDb250ZXh0dWFsPEY+LFxuICAgIG92ZXJyaWRlcz86IFBhcnRpYWw8Rj5cbiAgKTogUHJvbWlzZTxDb250ZXh0QXJnczxGLCBDPj4ge1xuICAgIGNvbnN0IGxhc3QgPSBhcmdzLnBvcCgpO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gZ2V0Q29udGV4dCgpIHtcbiAgICAgIGlmIChjb250ZXh0dWFsKVxuICAgICAgICByZXR1cm4gY29udGV4dHVhbC5jb250ZXh0KG9wZXJhdGlvbiwgb3ZlcnJpZGVzIHx8IHt9LCBtb2RlbCwgLi4uYXJncyk7XG4gICAgICByZXR1cm4gQ29udGV4dC5mcm9tKG9wZXJhdGlvbiwgb3ZlcnJpZGVzIHx8IHt9LCBtb2RlbCwgLi4uYXJncyk7XG4gICAgfVxuXG4gICAgbGV0IGM6IEM7XG4gICAgaWYgKGxhc3QpIHtcbiAgICAgIGlmIChsYXN0IGluc3RhbmNlb2YgQ29udGV4dCkge1xuICAgICAgICBjID0gbGFzdCBhcyBDO1xuICAgICAgICBhcmdzLnB1c2gobGFzdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcmdzLnB1c2gobGFzdCk7XG4gICAgICAgIGMgPSAoYXdhaXQgZ2V0Q29udGV4dCgpKSBhcyBDO1xuICAgICAgICBhcmdzLnB1c2goYyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGMgPSAoYXdhaXQgZ2V0Q29udGV4dCgpKSBhcyBDO1xuICAgICAgYXJncy5wdXNoKGMpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvbnRleHQ6IGMsIGFyZ3M6IGFyZ3MgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCIuL0NvbnRleHRcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBVdGlsIG1ldGhvZCB0byBjaGFuZ2UgYSBtZXRob2Qgb2YgYW4gb2JqZWN0IHByZWZpeGluZyBpdCB3aXRoIGFub3RoZXJcbiAqIEBwYXJhbSB7YW55fSBvYmogVGhlIEJhc2UgT2JqZWN0XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhZnRlciBUaGUgb3JpZ2luYWwgbWV0aG9kXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVmaXggVGhlIFByZWZpeCBtZXRob2QuIFRoZSBvdXRwdXQgd2lsbCBiZSB1c2VkIGFzIGFyZ3VtZW50cyBpbiB0aGUgb3JpZ2luYWwgbWV0aG9kXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FmdGVyTmFtZV0gV2hlbiB0aGUgYWZ0ZXIgZnVuY3Rpb24gYW5tZSBjYW5ub3QgYmUgZXh0cmFjdGVkLCBwYXNzIGl0IGhlcmVcbiAqXG4gKiBAZnVuY3Rpb24gcHJlZml4TWV0aG9kXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVmaXhNZXRob2QoXG4gIG9iajogYW55LFxuICBhZnRlcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksXG4gIHByZWZpeDogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksXG4gIGFmdGVyTmFtZT86IHN0cmluZ1xuKSB7XG4gIGFzeW5jIGZ1bmN0aW9uIHdyYXBwZXIodGhpczogYW55LCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUocHJlZml4LmNhbGwodGhpcywgLi4uYXJncykpO1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYWZ0ZXIuYXBwbHkodGhpcywgcmVzdWx0cykpO1xuICB9XG4gIGNvbnN0IHdyYXBwZWQgPSB3cmFwcGVyLmJpbmQob2JqKTtcbiAgY29uc3QgbmFtZSA9IGFmdGVyTmFtZSA/IGFmdGVyTmFtZSA6IGFmdGVyLm5hbWU7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3cmFwcGVkLCBcIm5hbWVcIiwge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogbmFtZSxcbiAgfSk7XG4gIG9ialtuYW1lXSA9IHdyYXBwZWQ7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgVXRpbCBtZXRob2QgdG8gY2hhbmdlIGEgbWV0aG9kIG9mIGFuIG9iamVjdCBzdWZmaXhpbmcgaXQgd2l0aCBhbm90aGVyXG4gKiBAcGFyYW0ge2FueX0gb2JqIFRoZSBCYXNlIE9iamVjdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gYmVmb3JlIFRoZSBvcmlnaW5hbCBtZXRob2RcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN1ZmZpeCBUaGUgUHJlZml4IG1ldGhvZC4gVGhlIG91dHB1dCB3aWxsIGJlIHVzZWQgYXMgYXJndW1lbnRzIGluIHRoZSBvcmlnaW5hbCBtZXRob2RcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYmVmb3JlTmFtZV0gV2hlbiB0aGUgYWZ0ZXIgZnVuY3Rpb24gYW5tZSBjYW5ub3QgYmUgZXh0cmFjdGVkLCBwYXNzIGl0IGhlcmVcbiAqXG4gKiBAZnVuY3Rpb24gc3VmZml4TWV0aG9kXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzLlJlcG9zaXRvcnlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1ZmZpeE1ldGhvZChcbiAgb2JqOiBhbnksXG4gIGJlZm9yZTogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksXG4gIHN1ZmZpeDogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksXG4gIGJlZm9yZU5hbWU/OiBzdHJpbmdcbikge1xuICBhc3luYyBmdW5jdGlvbiB3cmFwcGVyKHRoaXM6IGFueSwgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKGJlZm9yZS5jYWxsKHRoaXMsIC4uLmFyZ3MpKTtcbiAgICByZXR1cm4gc3VmZml4LmNhbGwodGhpcywgLi4ucmVzdWx0cyk7XG4gIH1cbiAgY29uc3Qgd3JhcHBlZCA9IHdyYXBwZXIuYmluZChvYmopO1xuICBjb25zdCBuYW1lID0gYmVmb3JlTmFtZSA/IGJlZm9yZU5hbWUgOiBiZWZvcmUubmFtZTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdyYXBwZWQsIFwibmFtZVwiLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBuYW1lLFxuICB9KTtcbiAgb2JqW25hbWVdID0gd3JhcHBlZDtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBVdGlsIG1ldGhvZCB0byB3cmFwIGEgbWV0aG9kIG9mIGFuIG9iamVjdCB3aXRoIGFkZGl0aW9uYWwgbG9naWNcbiAqXG4gKiBAcGFyYW0ge2FueX0gb2JqIFRoZSBCYXNlIE9iamVjdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gYmVmb3JlIHRoZSBtZXRob2QgdG8gYmUgcHJlZml4ZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IG1ldGhvZCB0aGUgbWV0aG9kIHRvIGJlIHdyYXBwZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGFmdGVyIFRoZSBtZXRob2QgdG8gYmUgc3VmZml4ZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWV0aG9kTmFtZV0gV2hlbiB0aGUgYWZ0ZXIgZnVuY3Rpb24gYW5tZSBjYW5ub3QgYmUgZXh0cmFjdGVkLCBwYXNzIGl0IGhlcmVcbiAqXG4gKiBAZnVuY3Rpb24gd3JhcE1ldGhvZFdpdGhDb250ZXh0XG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwTWV0aG9kV2l0aENvbnRleHQoXG4gIG9iajogYW55LFxuICBiZWZvcmU6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LFxuICBtZXRob2Q6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LFxuICBhZnRlcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksXG4gIG1ldGhvZE5hbWU/OiBzdHJpbmdcbikge1xuICBjb25zdCBuYW1lID0gbWV0aG9kTmFtZSA/IG1ldGhvZE5hbWUgOiBtZXRob2QubmFtZTtcbiAgb2JqW25hbWVdID0gbmV3IFByb3h5KG9ialtuYW1lXSwge1xuICAgIGFwcGx5OiBhc3luYyAodGFyZ2V0LCB0aGlzQXJnLCBhcmdBcnJheSkgPT4ge1xuICAgICAgbGV0IHRyYW5zZm9ybWVkQXJncyA9IGJlZm9yZS5jYWxsKHRoaXNBcmcsIC4uLmFyZ0FycmF5KTtcbiAgICAgIGlmICh0cmFuc2Zvcm1lZEFyZ3MgaW5zdGFuY2VvZiBQcm9taXNlKVxuICAgICAgICB0cmFuc2Zvcm1lZEFyZ3MgPSBhd2FpdCB0cmFuc2Zvcm1lZEFyZ3M7XG4gICAgICBjb25zdCBjb250ZXh0ID0gdHJhbnNmb3JtZWRBcmdzW3RyYW5zZm9ybWVkQXJncy5sZW5ndGggLSAxXSBhcyBhbnk7XG4gICAgICBpZiAoIShjb250ZXh0IGluc3RhbmNlb2YgQ29udGV4dCkpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTWlzc2luZyBhIGNvbnRleHRcIik7XG4gICAgICBsZXQgcmVzdWx0cyA9IGF3YWl0IHRhcmdldC5jYWxsKHRoaXNBcmcsIC4uLnRyYW5zZm9ybWVkQXJncyk7XG4gICAgICBpZiAocmVzdWx0cyBpbnN0YW5jZW9mIFByb21pc2UpIHJlc3VsdHMgPSBhd2FpdCByZXN1bHRzO1xuICAgICAgcmVzdWx0cyA9IGFmdGVyLmNhbGwodGhpc0FyZywgcmVzdWx0cywgY29udGV4dCk7XG4gICAgICBpZiAocmVzdWx0cyBpbnN0YW5jZW9mIFByb21pc2UpIHJlc3VsdHMgPSBhd2FpdCByZXN1bHRzO1xuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfSxcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBEQktleXMgfSBmcm9tIFwiLi4vbW9kZWwvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBnZXRBbGxQcm9wZXJ0eURlY29yYXRvcnNSZWN1cnNpdmUgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS91dGlsc1wiO1xuaW1wb3J0IHsgTW9kZWwsIE1vZGVsS2V5cywgc2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvZXJyb3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZpbmRzIHRoZSBwcmltYXJ5IGtleSBhdHRyaWJ1dGUgZm9yIGEgbW9kZWxcbiAqIEBzdW1tYXJ5IFNlYXJjaGVzIGluIGFsbCB0aGUgcHJvcGVydGllcyBpbiB0aGUgb2JqZWN0IGZvciBhbiB7QGxpbmsgaWR9IGRlY29yYXRlZCBwcm9wZXJ0eSBhbmQgcmV0dXJucyB0aGUgcHJvcGVydHkga2V5IGFuZCBtZXRhZGF0YVxuICogQHBhcmFtIHtNb2RlbH0gbW9kZWwgLSBUaGUgbW9kZWwgb2JqZWN0IHRvIHNlYXJjaCBmb3IgcHJpbWFyeSBrZXlcbiAqIEByZXR1cm4ge09iamVjdH0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGlkIHByb3BlcnR5IG5hbWUgYW5kIGl0cyBtZXRhZGF0YVxuICogQGZ1bmN0aW9uIGZpbmRQcmltYXJ5S2V5XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBmaW5kUHJpbWFyeUtleVxuICogICBwYXJ0aWNpcGFudCBnZXRBbGxQcm9wZXJ0eURlY29yYXRvcnNSZWN1cnNpdmVcbiAqXG4gKiAgIENhbGxlci0+PmZpbmRQcmltYXJ5S2V5OiBtb2RlbFxuICogICBmaW5kUHJpbWFyeUtleS0+PmdldEFsbFByb3BlcnR5RGVjb3JhdG9yc1JlY3Vyc2l2ZTogZ2V0IGRlY29yYXRvcnNcbiAqICAgZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzUmVjdXJzaXZlLS0+PmZpbmRQcmltYXJ5S2V5OiBkZWNvcmF0b3JzXG4gKiAgIGZpbmRQcmltYXJ5S2V5LT4+ZmluZFByaW1hcnlLZXk6IGZpbHRlciBJRCBkZWNvcmF0b3JzXG4gKiAgIGZpbmRQcmltYXJ5S2V5LT4+ZmluZFByaW1hcnlLZXk6IHZhbGlkYXRlIHNpbmdsZSBJRCBwcm9wZXJ0eVxuICogICBmaW5kUHJpbWFyeUtleS0tPj5DYWxsZXI6IHtpZCwgcHJvcHN9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRQcmltYXJ5S2V5PE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pIHtcbiAgY29uc3QgZGVjb3JhdG9ycyA9IGdldEFsbFByb3BlcnR5RGVjb3JhdG9yc1JlY3Vyc2l2ZShcbiAgICBtb2RlbCxcbiAgICB1bmRlZmluZWQsXG4gICAgREJLZXlzLlJFRkxFQ1QgKyBEQktleXMuSURcbiAgKTtcbiAgY29uc3QgaWREZWNvcmF0b3JzID0gT2JqZWN0LmVudHJpZXMoZGVjb3JhdG9ycyBhcyBvYmplY3QpLnJlZHVjZShcbiAgICAoYWNjdW06IHsgW2luZGV4ZXI6IHN0cmluZ106IGFueVtdIH0sIFtwcm9wLCBkZWNzXSkgPT4ge1xuICAgICAgY29uc3QgZmlsdGVyZWQgPSAoZGVjcyBhcyB7IGtleTogc3RyaW5nIH1bXSkuZmlsdGVyKFxuICAgICAgICAoZCkgPT4gZC5rZXkgIT09IE1vZGVsS2V5cy5UWVBFXG4gICAgICApO1xuICAgICAgaWYgKGZpbHRlcmVkICYmIGZpbHRlcmVkLmxlbmd0aCkge1xuICAgICAgICBhY2N1bVtwcm9wXSA9IGFjY3VtW3Byb3BdIHx8IFtdO1xuICAgICAgICBhY2N1bVtwcm9wXS5wdXNoKC4uLmZpbHRlcmVkKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LFxuICAgIHt9XG4gICk7XG5cbiAgaWYgKCFpZERlY29yYXRvcnMgfHwgIU9iamVjdC5rZXlzKGlkRGVjb3JhdG9ycykubGVuZ3RoKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiQ291bGQgbm90IGZpbmQgSUQgZGVjb3JhdGVkIFByb3BlcnR5XCIpO1xuICBpZiAoT2JqZWN0LmtleXMoaWREZWNvcmF0b3JzKS5sZW5ndGggPiAxKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKHNmKE9iamVjdC5rZXlzKGlkRGVjb3JhdG9ycykuam9pbihcIiwgXCIpKSk7XG4gIGNvbnN0IGlkUHJvcCA9IE9iamVjdC5rZXlzKGlkRGVjb3JhdG9ycylbMF07XG4gIGlmICghaWRQcm9wKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIkNvdWxkIG5vdCBmaW5kIElEIGRlY29yYXRlZCBQcm9wZXJ0eVwiKTtcbiAgcmV0dXJuIHtcbiAgICBpZDogaWRQcm9wIGFzIGtleW9mIE0sXG4gICAgcHJvcHM6IGlkRGVjb3JhdG9yc1tpZFByb3BdWzBdLnByb3BzLFxuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgdGhlIHByaW1hcnkga2V5IHZhbHVlIGZyb20gYSBtb2RlbFxuICogQHN1bW1hcnkgU2VhcmNoZXMgZm9yIHRoZSBJRC1kZWNvcmF0ZWQgcHJvcGVydHkgaW4gdGhlIG1vZGVsIGFuZCByZXR1cm5zIGl0cyB2YWx1ZVxuICogQHBhcmFtIHtNb2RlbH0gbW9kZWwgLSBUaGUgbW9kZWwgb2JqZWN0IHRvIGV4dHJhY3QgdGhlIElEIGZyb21cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldHVybkVtcHR5PWZhbHNlXSAtIFdoZXRoZXIgdG8gcmV0dXJuIHVuZGVmaW5lZCBpZiBubyBJRCB2YWx1ZSBpcyBmb3VuZFxuICogQHJldHVybiB7c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50fSBUaGUgcHJpbWFyeSBrZXkgdmFsdWVcbiAqIEBmdW5jdGlvbiBmaW5kTW9kZWxJZFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgZmluZE1vZGVsSWRcbiAqICAgcGFydGljaXBhbnQgZmluZFByaW1hcnlLZXlcbiAqXG4gKiAgIENhbGxlci0+PmZpbmRNb2RlbElkOiBtb2RlbCwgcmV0dXJuRW1wdHlcbiAqICAgZmluZE1vZGVsSWQtPj5maW5kUHJpbWFyeUtleTogbW9kZWxcbiAqICAgZmluZFByaW1hcnlLZXktLT4+ZmluZE1vZGVsSWQ6IHtpZCwgcHJvcHN9XG4gKiAgIGZpbmRNb2RlbElkLT4+ZmluZE1vZGVsSWQ6IGV4dHJhY3QgbW9kZWxbaWRdXG4gKiAgIGZpbmRNb2RlbElkLT4+ZmluZE1vZGVsSWQ6IHZhbGlkYXRlIElEIGV4aXN0cyBpZiByZXF1aXJlZFxuICogICBmaW5kTW9kZWxJZC0tPj5DYWxsZXI6IElEIHZhbHVlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRNb2RlbElkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNLFxuICByZXR1cm5FbXB0eSA9IGZhbHNlXG4pOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQge1xuICBjb25zdCBpZFByb3AgPSBmaW5kUHJpbWFyeUtleShtb2RlbCkuaWQ7XG4gIGNvbnN0IG1vZGVsSWQgPSBtb2RlbFtpZFByb3BdO1xuICBpZiAodHlwZW9mIG1vZGVsSWQgPT09IFwidW5kZWZpbmVkXCIgJiYgIXJldHVybkVtcHR5KVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE5vIHZhbHVlIGZvciB0aGUgSWQgaXMgZGVmaW5lZCB1bmRlciB0aGUgcHJvcGVydHkgJHtpZFByb3AgYXMgc3RyaW5nfWBcbiAgICApO1xuICByZXR1cm4gbW9kZWxJZCBhcyBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ7XG59XG4iLCJpbXBvcnQgeyBJUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL0lSZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBlbmZvcmNlREJEZWNvcmF0b3JzIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IE9wZXJhdGlvbktleXMgfSBmcm9tIFwiLi4vb3BlcmF0aW9ucy9jb25zdGFudHNcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IHdyYXBNZXRob2RXaXRoQ29udGV4dCB9IGZyb20gXCIuL3dyYXBwZXJzXCI7XG5pbXBvcnQgeyBmaW5kUHJpbWFyeUtleSB9IGZyb20gXCIuLi9pZGVudGl0eS91dGlsc1wiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCIuL0NvbnRleHRcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnlGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEJhc2UgcmVwb3NpdG9yeSBpbXBsZW1lbnRhdGlvbiBwcm92aWRpbmcgQ1JVRCBvcGVyYXRpb25zIGZvciBtb2RlbHMuXG4gKiBAc3VtbWFyeSBUaGUgQmFzZVJlcG9zaXRvcnkgY2xhc3Mgc2VydmVzIGFzIGEgZm91bmRhdGlvbiBmb3IgcmVwb3NpdG9yeSBpbXBsZW1lbnRhdGlvbnMsIHByb3ZpZGluZ1xuICogYWJzdHJhY3QgYW5kIGNvbmNyZXRlIG1ldGhvZHMgZm9yIGNyZWF0aW5nLCByZWFkaW5nLCB1cGRhdGluZywgYW5kIGRlbGV0aW5nIG1vZGVsIGluc3RhbmNlcy5cbiAqIEl0IGhhbmRsZXMgb3BlcmF0aW9uIGxpZmVjeWNsZXMgaW5jbHVkaW5nIHByZWZpeCBhbmQgc3VmZml4IG9wZXJhdGlvbnMsIGFuZCBlbmZvcmNlcyBkZWNvcmF0b3JzLlxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZSwgZGVmYXVsdHMgdG8gUmVwb3NpdG9yeUZsYWdzXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUsIGRlZmF1bHRzIHRvIENvbnRleHQ8Rj5cbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IGNsYXp6IC0gVGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgbW9kZWwgY2xhc3NcbiAqIEBjbGFzcyBCYXNlUmVwb3NpdG9yeVxuICogQGV4YW1wbGVcbiAqIGNsYXNzIFVzZXJNb2RlbCBleHRlbmRzIE1vZGVsIHtcbiAqICAgQGlkKClcbiAqICAgaWQ6IHN0cmluZztcbiAqXG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIG5hbWU6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBjbGFzcyBVc2VyUmVwb3NpdG9yeSBleHRlbmRzIEJhc2VSZXBvc2l0b3J5PFVzZXJNb2RlbD4ge1xuICogICBjb25zdHJ1Y3RvcigpIHtcbiAqICAgICBzdXBlcihVc2VyTW9kZWwpO1xuICogICB9XG4gKlxuICogICBhc3luYyBjcmVhdGUobW9kZWw6IFVzZXJNb2RlbCk6IFByb21pc2U8VXNlck1vZGVsPiB7XG4gKiAgICAgLy8gSW1wbGVtZW50YXRpb25cbiAqICAgICByZXR1cm4gbW9kZWw7XG4gKiAgIH1cbiAqXG4gKiAgIGFzeW5jIHJlYWQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPFVzZXJNb2RlbD4ge1xuICogICAgIC8vIEltcGxlbWVudGF0aW9uXG4gKiAgICAgcmV0dXJuIG5ldyBVc2VyTW9kZWwoeyBpZDoga2V5LCBuYW1lOiAnVXNlcicgfSk7XG4gKiAgIH1cbiAqXG4gKiAgIGFzeW5jIHVwZGF0ZShtb2RlbDogVXNlck1vZGVsKTogUHJvbWlzZTxVc2VyTW9kZWw+IHtcbiAqICAgICAvLyBJbXBsZW1lbnRhdGlvblxuICogICAgIHJldHVybiBtb2RlbDtcbiAqICAgfVxuICpcbiAqICAgYXN5bmMgZGVsZXRlKGtleTogc3RyaW5nKTogUHJvbWlzZTxVc2VyTW9kZWw+IHtcbiAqICAgICAvLyBJbXBsZW1lbnRhdGlvblxuICogICAgIGNvbnN0IG1vZGVsID0gYXdhaXQgdGhpcy5yZWFkKGtleSk7XG4gKiAgICAgcmV0dXJuIG1vZGVsO1xuICogICB9XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICogICBwYXJ0aWNpcGFudCBSIGFzIFJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgUCBhcyBQcmVmaXggTWV0aG9kc1xuICogICBwYXJ0aWNpcGFudCBEIGFzIERhdGFiYXNlXG4gKiAgIHBhcnRpY2lwYW50IFMgYXMgU3VmZml4IE1ldGhvZHNcbiAqICAgcGFydGljaXBhbnQgViBhcyBWYWxpZGF0b3JzL0RlY29yYXRvcnNcbiAqXG4gKiAgIE5vdGUgb3ZlciBDLFY6IENyZWF0ZSBPcGVyYXRpb25cbiAqICAgQy0+PlI6IGNyZWF0ZShtb2RlbClcbiAqICAgUi0+PlA6IGNyZWF0ZVByZWZpeChtb2RlbClcbiAqICAgUC0+PlY6IGVuZm9yY2VEQkRlY29yYXRvcnMoT04pXG4gKiAgIFAtPj5EOiBEYXRhYmFzZSBvcGVyYXRpb25cbiAqICAgRC0+PlM6IGNyZWF0ZVN1ZmZpeChtb2RlbClcbiAqICAgUy0+PlY6IGVuZm9yY2VEQkRlY29yYXRvcnMoQUZURVIpXG4gKiAgIFMtPj5DOiBSZXR1cm4gbW9kZWxcbiAqXG4gKiAgIE5vdGUgb3ZlciBDLFY6IFJlYWQgT3BlcmF0aW9uXG4gKiAgIEMtPj5SOiByZWFkKGtleSlcbiAqICAgUi0+PlA6IHJlYWRQcmVmaXgoa2V5KVxuICogICBQLT4+VjogZW5mb3JjZURCRGVjb3JhdG9ycyhPTilcbiAqICAgUC0+PkQ6IERhdGFiYXNlIG9wZXJhdGlvblxuICogICBELT4+UzogcmVhZFN1ZmZpeChtb2RlbClcbiAqICAgUy0+PlY6IGVuZm9yY2VEQkRlY29yYXRvcnMoQUZURVIpXG4gKiAgIFMtPj5DOiBSZXR1cm4gbW9kZWxcbiAqXG4gKiAgIE5vdGUgb3ZlciBDLFY6IFVwZGF0ZSBPcGVyYXRpb25cbiAqICAgQy0+PlI6IHVwZGF0ZShtb2RlbClcbiAqICAgUi0+PlA6IHVwZGF0ZVByZWZpeChtb2RlbClcbiAqICAgUC0+PlY6IGVuZm9yY2VEQkRlY29yYXRvcnMoT04pXG4gKiAgIFAtPj5EOiBEYXRhYmFzZSBvcGVyYXRpb25cbiAqICAgRC0+PlM6IHVwZGF0ZVN1ZmZpeChtb2RlbClcbiAqICAgUy0+PlY6IGVuZm9yY2VEQkRlY29yYXRvcnMoQUZURVIpXG4gKiAgIFMtPj5DOiBSZXR1cm4gbW9kZWxcbiAqXG4gKiAgIE5vdGUgb3ZlciBDLFY6IERlbGV0ZSBPcGVyYXRpb25cbiAqICAgQy0+PlI6IGRlbGV0ZShrZXkpXG4gKiAgIFItPj5QOiBkZWxldGVQcmVmaXgoa2V5KVxuICogICBQLT4+VjogZW5mb3JjZURCRGVjb3JhdG9ycyhPTilcbiAqICAgUC0+PkQ6IERhdGFiYXNlIG9wZXJhdGlvblxuICogICBELT4+UzogZGVsZXRlU3VmZml4KG1vZGVsKVxuICogICBTLT4+VjogZW5mb3JjZURCRGVjb3JhdG9ycyhBRlRFUilcbiAqICAgUy0+PkM6IFJldHVybiBtb2RlbFxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVJlcG9zaXRvcnk8XG4gIE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPixcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBDb250ZXh0PEY+LFxuPiBpbXBsZW1lbnRzIElSZXBvc2l0b3J5PE0sIEYsIEM+XG57XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NsYXNzITogQ29uc3RydWN0b3I8TT47XG4gIHByaXZhdGUgX3BrIToga2V5b2YgTTtcbiAgcHJpdmF0ZSBfcGtQcm9wcyE6IGFueTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIG1vZGVsIGNsYXNzIGNvbnN0cnVjdG9yLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgbW9kZWwgY2xhc3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVwb3NpdG9yeS5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIG5vIGNsYXNzIGRlZmluaXRpb24gaXMgZm91bmQuXG4gICAqIEByZXR1cm4ge0NvbnN0cnVjdG9yPE0+fSBUaGUgY29uc3RydWN0b3IgZm9yIHRoZSBtb2RlbCBjbGFzc1xuICAgKi9cbiAgZ2V0IGNsYXNzKCkge1xuICAgIGlmICghdGhpcy5fY2xhc3MpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gY2xhc3MgZGVmaW5pdGlvbiBmb3VuZCBmb3IgdGhpcyByZXBvc2l0b3J5YCk7XG4gICAgcmV0dXJuIHRoaXMuX2NsYXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBwcmltYXJ5IGtleSBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IHNlcnZlcyBhcyB0aGUgcHJpbWFyeSBrZXkgZm9yIHRoZSBtb2RlbC5cbiAgICogSWYgbm90IGFscmVhZHkgZGV0ZXJtaW5lZCwgaXQgZmluZHMgdGhlIHByaW1hcnkga2V5IHVzaW5nIHRoZSBtb2RlbCdzIGRlY29yYXRvcnMuXG4gICAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIHByaW1hcnkga2V5IHByb3BlcnR5XG4gICAqL1xuICBnZXQgcGsoKToga2V5b2YgTSB7XG4gICAgaWYgKCF0aGlzLl9waykge1xuICAgICAgY29uc3QgeyBpZCwgcHJvcHMgfSA9IGZpbmRQcmltYXJ5S2V5KG5ldyB0aGlzLmNsYXNzKCkpO1xuICAgICAgdGhpcy5fcGsgPSBpZDtcbiAgICAgIHRoaXMuX3BrUHJvcHMgPSBwcm9wcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3BrO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBwcmltYXJ5IGtleSBwcm9wZXJ0aWVzLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIHByb3BlcnRpZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmltYXJ5IGtleSBvZiB0aGUgbW9kZWwuXG4gICAqIElmIG5vdCBhbHJlYWR5IGRldGVybWluZWQsIGl0IHRyaWdnZXJzIHRoZSBwayBnZXR0ZXIgdG8gZmluZCB0aGUgcHJpbWFyeSBrZXkgcHJvcGVydGllcy5cbiAgICogQHJldHVybiB7YW55fSBUaGUgcHJvcGVydGllcyBvZiB0aGUgcHJpbWFyeSBrZXlcbiAgICovXG4gIHByb3RlY3RlZCBnZXQgcGtQcm9wcygpOiBhbnkge1xuICAgIGlmICghdGhpcy5fcGtQcm9wcykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgY29uc3QgcGsgPSB0aGlzLnBrO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcGtQcm9wcztcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihjbGF6ej86IENvbnN0cnVjdG9yPE0+KSB7XG4gICAgaWYgKGNsYXp6KSB0aGlzLl9jbGFzcyA9IGNsYXp6O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIFt0aGlzLmNyZWF0ZSwgdGhpcy5yZWFkLCB0aGlzLnVwZGF0ZSwgdGhpcy5kZWxldGVdLmZvckVhY2goKG0pID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSBtLm5hbWU7XG4gICAgICB3cmFwTWV0aG9kV2l0aENvbnRleHQoXG4gICAgICAgIHNlbGYsXG4gICAgICAgIChzZWxmIGFzIGFueSlbbmFtZSArIFwiUHJlZml4XCJdLFxuICAgICAgICBtLFxuICAgICAgICAoc2VsZiBhcyBhbnkpW25hbWUgKyBcIlN1ZmZpeFwiXVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBtb2RlbCBpbnN0YW5jZSBpbiB0aGUgcmVwb3NpdG9yeS5cbiAgICogQHN1bW1hcnkgUGVyc2lzdHMgYSBuZXcgbW9kZWwgaW5zdGFuY2UgdG8gdGhlIHVuZGVybHlpbmcgZGF0YSBzdG9yZS5cbiAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBjb25jcmV0ZSByZXBvc2l0b3J5IGNsYXNzZXMuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gY3JlYXRlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIGNyZWF0ZSBvcGVyYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNyZWF0ZWQgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIGFic3RyYWN0IGNyZWF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBtdWx0aXBsZSBtb2RlbCBpbnN0YW5jZXMgaW4gdGhlIHJlcG9zaXRvcnkuXG4gICAqIEBzdW1tYXJ5IFBlcnNpc3RzIG11bHRpcGxlIG1vZGVsIGluc3RhbmNlcyB0byB0aGUgdW5kZXJseWluZyBkYXRhIHN0b3JlIGJ5IGNhbGxpbmdcbiAgICogdGhlIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbW9kZWwgaW4gdGhlIGFycmF5LlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIGFycmF5IG9mIG1vZGVsIGluc3RhbmNlcyB0byBjcmVhdGVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUgY3JlYXRlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIGNyZWF0ZWQgbW9kZWwgaW5zdGFuY2VzXG4gICAqL1xuICBhc3luYyBjcmVhdGVBbGwobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwobW9kZWxzLm1hcCgobSkgPT4gdGhpcy5jcmVhdGUobSwgLi4uYXJncykpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBtb2RlbCBmb3IgY3JlYXRpb24gYW5kIGV4ZWN1dGVzIHByZS1jcmVhdGlvbiBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgYSBtb2RlbCBiZWZvcmUgaXQgaXMgY3JlYXRlZCBpbiB0aGUgZGF0YSBzdG9yZS4gVGhpcyBpbmNsdWRlc1xuICAgKiBjcmVhdGluZyBhIGNvbnRleHQsIGluc3RhbnRpYXRpbmcgYSBuZXcgbW9kZWwgaW5zdGFuY2UsIGFuZCBlbmZvcmNpbmcgYW55IGRlY29yYXRvcnNcbiAgICogdGhhdCBzaG91bGQgYmUgYXBwbGllZCBiZWZvcmUgY3JlYXRpb24uXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gcHJlcGFyZSBmb3IgY3JlYXRpb25cbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUgY3JlYXRlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHByZXBhcmVkIG1vZGVsIGFuZCBjb250ZXh0IGFyZ3VtZW50c1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZVByZWZpeChtb2RlbDogTSwgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJnczxNLCBDLCBGPihcbiAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3NcbiAgICApO1xuICAgIG1vZGVsID0gbmV3IHRoaXMuY2xhc3MobW9kZWwpO1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnM8TSwgdHlwZW9mIHRoaXMsIGFueSwgRiwgQz4oXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgKTtcbiAgICByZXR1cm4gW21vZGVsLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIGEgbW9kZWwgYWZ0ZXIgY3JlYXRpb24gYW5kIGV4ZWN1dGVzIHBvc3QtY3JlYXRpb24gb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgRmluYWxpemVzIGEgbW9kZWwgYWZ0ZXIgaXQgaGFzIGJlZW4gY3JlYXRlZCBpbiB0aGUgZGF0YSBzdG9yZS4gVGhpcyBpbmNsdWRlc1xuICAgKiBlbmZvcmNpbmcgYW55IGRlY29yYXRvcnMgdGhhdCBzaG91bGQgYmUgYXBwbGllZCBhZnRlciBjcmVhdGlvbi5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0aGF0IHdhcyBjcmVhdGVkXG4gICAqIEBwYXJhbSB7Q30gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBwcm9jZXNzZWQgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVTdWZmaXgobW9kZWw6IE0sIGNvbnRleHQ6IEMpIHtcbiAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIHR5cGVvZiB0aGlzLCBhbnksIEYsIEM+KFxuICAgICAgdGhpcyxcbiAgICAgIGNvbnRleHQsXG4gICAgICBtb2RlbCxcbiAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgT3BlcmF0aW9uS2V5cy5BRlRFUlxuICAgICk7XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBtdWx0aXBsZSBtb2RlbHMgZm9yIGNyZWF0aW9uIGFuZCBleGVjdXRlcyBwcmUtY3JlYXRpb24gb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIG11bHRpcGxlIG1vZGVscyBiZWZvcmUgdGhleSBhcmUgY3JlYXRlZCBpbiB0aGUgZGF0YSBzdG9yZS4gVGhpcyBpbmNsdWRlc1xuICAgKiBjcmVhdGluZyBhIGNvbnRleHQsIGluc3RhbnRpYXRpbmcgbmV3IG1vZGVsIGluc3RhbmNlcywgYW5kIGVuZm9yY2luZyBhbnkgZGVjb3JhdG9yc1xuICAgKiB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIGJlZm9yZSBjcmVhdGlvbiBmb3IgZWFjaCBtb2RlbC5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBhcnJheSBvZiBtb2RlbCBpbnN0YW5jZXMgdG8gcHJlcGFyZSBmb3IgY3JlYXRpb25cbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUgY3JlYXRlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuICBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBjb250YWluaW5nIHRoZSBwcmVwYXJlZCBtb2RlbHMgYW5kIGNvbnRleHQgYXJndW1lbnRzXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlQWxsUHJlZml4KG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzPE0sIEMsIEY+KFxuICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJnc1xuICAgICk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKGFzeW5jIChtKSA9PiB7XG4gICAgICAgIG0gPSBuZXcgdGhpcy5jbGFzcyhtKTtcbiAgICAgICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9yczxNLCB0eXBlb2YgdGhpcywgYW55LCBGLCBDPihcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBtO1xuICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIG11bHRpcGxlIG1vZGVscyBhZnRlciBjcmVhdGlvbiBhbmQgZXhlY3V0ZXMgcG9zdC1jcmVhdGlvbiBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBGaW5hbGl6ZXMgbXVsdGlwbGUgbW9kZWxzIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIGNyZWF0ZWQgaW4gdGhlIGRhdGEgc3RvcmUuIFRoaXMgaW5jbHVkZXNcbiAgICogZW5mb3JjaW5nIGFueSBkZWNvcmF0b3JzIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgYWZ0ZXIgY3JlYXRpb24gZm9yIGVhY2ggbW9kZWwuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgLSBUaGUgYXJyYXkgb2YgbW9kZWwgaW5zdGFuY2VzIHRoYXQgd2VyZSBjcmVhdGVkXG4gICAqIEBwYXJhbSB7Q30gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGFycmF5IG9mIHByb2Nlc3NlZCBtb2RlbCBpbnN0YW5jZXNcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVBbGxTdWZmaXgobW9kZWxzOiBNW10sIGNvbnRleHQ6IEMpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoKG0pID0+XG4gICAgICAgIGVuZm9yY2VEQkRlY29yYXRvcnM8TSwgdHlwZW9mIHRoaXMsIGFueSwgRiwgQz4oXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5BRlRFUlxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcbiAgICByZXR1cm4gbW9kZWxzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSBtb2RlbCBpbnN0YW5jZSBmcm9tIHRoZSByZXBvc2l0b3J5IGJ5IGl0cyBwcmltYXJ5IGtleS5cbiAgICogQHN1bW1hcnkgRmV0Y2hlcyBhIG1vZGVsIGluc3RhbmNlIGZyb20gdGhlIHVuZGVybHlpbmcgZGF0YSBzdG9yZSB1c2luZyBpdHMgcHJpbWFyeSBrZXkuXG4gICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgY29uY3JldGUgcmVwb3NpdG9yeSBjbGFzc2VzLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0ga2V5IC0gVGhlIHByaW1hcnkga2V5IG9mIHRoZSBtb2RlbCB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHRoZSByZWFkIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmV0cmlldmVkIG1vZGVsIGluc3RhbmNlXG4gICAqL1xuICBhYnN0cmFjdCByZWFkKGtleTogc3RyaW5nIHwgbnVtYmVyLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgbXVsdGlwbGUgbW9kZWwgaW5zdGFuY2VzIGZyb20gdGhlIHJlcG9zaXRvcnkgYnkgdGhlaXIgcHJpbWFyeSBrZXlzLlxuICAgKiBAc3VtbWFyeSBGZXRjaGVzIG11bHRpcGxlIG1vZGVsIGluc3RhbmNlcyBmcm9tIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RvcmUgdXNpbmcgdGhlaXIgcHJpbWFyeSBrZXlzXG4gICAqIGJ5IGNhbGxpbmcgdGhlIHJlYWQgbWV0aG9kIGZvciBlYWNoIGtleSBpbiB0aGUgYXJyYXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nW10gfCBudW1iZXJbXX0ga2V5cyAtIFRoZSBhcnJheSBvZiBwcmltYXJ5IGtleXMgb2YgdGhlIG1vZGVscyB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHRoZSByZWFkIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIHJldHJpZXZlZCBtb2RlbCBpbnN0YW5jZXNcbiAgICovXG4gIGFzeW5jIHJlYWRBbGwoa2V5czogc3RyaW5nW10gfCBudW1iZXJbXSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE1bXT4ge1xuICAgIHJldHVybiBhd2FpdCBQcm9taXNlLmFsbChrZXlzLm1hcCgoaWQpID0+IHRoaXMucmVhZChpZCwgLi4uYXJncykpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIGEgbW9kZWwgYWZ0ZXIgcmV0cmlldmFsIGFuZCBleGVjdXRlcyBwb3N0LXJlYWQgb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgRmluYWxpemVzIGEgbW9kZWwgYWZ0ZXIgaXQgaGFzIGJlZW4gcmV0cmlldmVkIGZyb20gdGhlIGRhdGEgc3RvcmUuIFRoaXMgaW5jbHVkZXNcbiAgICogZW5mb3JjaW5nIGFueSBkZWNvcmF0b3JzIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgYWZ0ZXIgcmVhZGluZy5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0aGF0IHdhcyByZXRyaWV2ZWRcbiAgICogQHBhcmFtIHtDfSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHByb2Nlc3NlZCBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHJlYWRTdWZmaXgobW9kZWw6IE0sIGNvbnRleHQ6IEMpIHtcbiAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIHR5cGVvZiB0aGlzLCBhbnksIEYsIEM+KFxuICAgICAgdGhpcyxcbiAgICAgIGNvbnRleHQsXG4gICAgICBtb2RlbCxcbiAgICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgIE9wZXJhdGlvbktleXMuQUZURVJcbiAgICApO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgZm9yIHJlYWRpbmcgYSBtb2RlbCBhbmQgZXhlY3V0ZXMgcHJlLXJlYWQgb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIGEga2V5IGJlZm9yZSBhIG1vZGVsIGlzIHJlYWQgZnJvbSB0aGUgZGF0YSBzdG9yZS4gVGhpcyBpbmNsdWRlc1xuICAgKiBjcmVhdGluZyBhIGNvbnRleHQsIGluc3RhbnRpYXRpbmcgYSBuZXcgbW9kZWwgaW5zdGFuY2Ugd2l0aCB0aGUga2V5LCBhbmQgZW5mb3JjaW5nIGFueSBkZWNvcmF0b3JzXG4gICAqIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgYmVmb3JlIHJlYWRpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsIHRvIHJlYWRcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUgcmVhZCBvcGVyYXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBjb250YWluaW5nIHRoZSBrZXkgYW5kIGNvbnRleHQgYXJndW1lbnRzXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgcmVhZFByZWZpeChrZXk6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJnczxNLCBDLCBGPihcbiAgICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzXG4gICAgKTtcbiAgICBjb25zdCBtb2RlbDogTSA9IG5ldyB0aGlzLmNsYXNzKCk7XG4gICAgbW9kZWxbdGhpcy5wa10gPSBrZXkgYXMgYW55O1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnM8TSwgdHlwZW9mIHRoaXMsIGFueSwgRiwgQz4oXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICk7XG4gICAgcmV0dXJuIFtrZXksIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBmb3IgcmVhZGluZyBtdWx0aXBsZSBtb2RlbHMgYW5kIGV4ZWN1dGVzIHByZS1yZWFkIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBtdWx0aXBsZSBrZXlzIGJlZm9yZSBtb2RlbHMgYXJlIHJlYWQgZnJvbSB0aGUgZGF0YSBzdG9yZS4gVGhpcyBpbmNsdWRlc1xuICAgKiBjcmVhdGluZyBhIGNvbnRleHQsIGluc3RhbnRpYXRpbmcgbmV3IG1vZGVsIGluc3RhbmNlcyB3aXRoIHRoZSBrZXlzLCBhbmQgZW5mb3JjaW5nIGFueSBkZWNvcmF0b3JzXG4gICAqIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgYmVmb3JlIHJlYWRpbmcgZm9yIGVhY2gga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgbnVtYmVyW119IGtleXMgLSBUaGUgYXJyYXkgb2YgcHJpbWFyeSBrZXlzIG9mIHRoZSBtb2RlbHMgdG8gcmVhZFxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHRoZSByZWFkIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGtleXMgYW5kIGNvbnRleHQgYXJndW1lbnRzXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgcmVhZEFsbFByZWZpeChrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzPE0sIEMsIEY+KFxuICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3NcbiAgICApO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAga2V5cy5tYXAoYXN5bmMgKGspID0+IHtcbiAgICAgICAgY29uc3QgbSA9IG5ldyB0aGlzLmNsYXNzKCk7XG4gICAgICAgIG1bdGhpcy5wa10gPSBrIGFzIGFueTtcbiAgICAgICAgcmV0dXJuIGVuZm9yY2VEQkRlY29yYXRvcnM8TSwgdHlwZW9mIHRoaXMsIGFueSwgRiwgQz4oXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gW2tleXMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgbXVsdGlwbGUgbW9kZWxzIGFmdGVyIHJldHJpZXZhbCBhbmQgZXhlY3V0ZXMgcG9zdC1yZWFkIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IEZpbmFsaXplcyBtdWx0aXBsZSBtb2RlbHMgYWZ0ZXIgdGhleSBoYXZlIGJlZW4gcmV0cmlldmVkIGZyb20gdGhlIGRhdGEgc3RvcmUuIFRoaXMgaW5jbHVkZXNcbiAgICogZW5mb3JjaW5nIGFueSBkZWNvcmF0b3JzIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgYWZ0ZXIgcmVhZGluZyBmb3IgZWFjaCBtb2RlbC5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBhcnJheSBvZiBtb2RlbCBpbnN0YW5jZXMgdGhhdCB3ZXJlIHJldHJpZXZlZFxuICAgKiBAcGFyYW0ge0N9IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBhcnJheSBvZiBwcm9jZXNzZWQgbW9kZWwgaW5zdGFuY2VzXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgcmVhZEFsbFN1ZmZpeChtb2RlbHM6IE1bXSwgY29udGV4dDogQykge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcCgobSkgPT5cbiAgICAgICAgZW5mb3JjZURCRGVjb3JhdG9yczxNLCB0eXBlb2YgdGhpcywgYW55LCBGLCBDPihcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5BRlRFUlxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcbiAgICByZXR1cm4gbW9kZWxzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGFuIGV4aXN0aW5nIG1vZGVsIGluc3RhbmNlIGluIHRoZSByZXBvc2l0b3J5LlxuICAgKiBAc3VtbWFyeSBVcGRhdGVzIGFuIGV4aXN0aW5nIG1vZGVsIGluc3RhbmNlIGluIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RvcmUuXG4gICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgY29uY3JldGUgcmVwb3NpdG9yeSBjbGFzc2VzLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHRoZSB1cGRhdGUgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIG1vZGVsIGluc3RhbmNlXG4gICAqL1xuICBhYnN0cmFjdCB1cGRhdGUobW9kZWw6IE0sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgbXVsdGlwbGUgbW9kZWwgaW5zdGFuY2VzIGluIHRoZSByZXBvc2l0b3J5LlxuICAgKiBAc3VtbWFyeSBVcGRhdGVzIG11bHRpcGxlIG1vZGVsIGluc3RhbmNlcyBpbiB0aGUgdW5kZXJseWluZyBkYXRhIHN0b3JlIGJ5IGNhbGxpbmdcbiAgICogdGhlIHVwZGF0ZSBtZXRob2QgZm9yIGVhY2ggbW9kZWwgaW4gdGhlIGFycmF5LlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIGFycmF5IG9mIG1vZGVsIGluc3RhbmNlcyB0byB1cGRhdGVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUgdXBkYXRlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIHVwZGF0ZWQgbW9kZWwgaW5zdGFuY2VzXG4gICAqL1xuICBhc3luYyB1cGRhdGVBbGwobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueSk6IFByb21pc2U8TVtdPiB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKG1vZGVscy5tYXAoKG0pID0+IHRoaXMudXBkYXRlKG0sIC4uLmFyZ3MpKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBhIG1vZGVsIGFmdGVyIHVwZGF0ZSBhbmQgZXhlY3V0ZXMgcG9zdC11cGRhdGUgb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgRmluYWxpemVzIGEgbW9kZWwgYWZ0ZXIgaXQgaGFzIGJlZW4gdXBkYXRlZCBpbiB0aGUgZGF0YSBzdG9yZS4gVGhpcyBpbmNsdWRlc1xuICAgKiBlbmZvcmNpbmcgYW55IGRlY29yYXRvcnMgdGhhdCBzaG91bGQgYmUgYXBwbGllZCBhZnRlciB1cGRhdGluZy5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0aGF0IHdhcyB1cGRhdGVkXG4gICAqIEBwYXJhbSB7Q30gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBwcm9jZXNzZWQgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyB1cGRhdGVTdWZmaXgobW9kZWw6IE0sIGNvbnRleHQ6IEMpIHtcbiAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIHR5cGVvZiB0aGlzLCBhbnksIEYsIEM+KFxuICAgICAgdGhpcyxcbiAgICAgIGNvbnRleHQsXG4gICAgICBtb2RlbCxcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgT3BlcmF0aW9uS2V5cy5BRlRFUlxuICAgICk7XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBhIG1vZGVsIGZvciB1cGRhdGUgYW5kIGV4ZWN1dGVzIHByZS11cGRhdGUgb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIGEgbW9kZWwgYmVmb3JlIGl0IGlzIHVwZGF0ZWQgaW4gdGhlIGRhdGEgc3RvcmUuIFRoaXMgaW5jbHVkZXNcbiAgICogY3JlYXRpbmcgYSBjb250ZXh0LCB2YWxpZGF0aW5nIHRoZSBwcmltYXJ5IGtleSwgcmV0cmlldmluZyB0aGUgZXhpc3RpbmcgbW9kZWwsXG4gICAqIGFuZCBlbmZvcmNpbmcgYW55IGRlY29yYXRvcnMgdGhhdCBzaG91bGQgYmUgYXBwbGllZCBiZWZvcmUgdXBkYXRpbmcuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gcHJlcGFyZSBmb3IgdXBkYXRlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIHVwZGF0ZSBvcGVyYXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBjb250YWluaW5nIHRoZSBwcmVwYXJlZCBtb2RlbCBhbmQgY29udGV4dCBhcmd1bWVudHNcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyB1cGRhdGVQcmVmaXgobW9kZWw6IE0sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3M8TSwgQywgRj4oXG4gICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzXG4gICAgKTtcbiAgICBjb25zdCBpZCA9IG1vZGVsW3RoaXMucGtdO1xuICAgIGlmICghaWQpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHZhbHVlIGZvciB0aGUgSWQgaXMgZGVmaW5lZCB1bmRlciB0aGUgcHJvcGVydHkgJHt0aGlzLnBrIGFzIHN0cmluZ31gXG4gICAgICApO1xuICAgIGNvbnN0IG9sZE1vZGVsID0gYXdhaXQgdGhpcy5yZWFkKGlkIGFzIHN0cmluZyk7XG4gICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9yczxNLCB0eXBlb2YgdGhpcywgYW55LCBGLCBDPihcbiAgICAgIHRoaXMsXG4gICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgbW9kZWwsXG4gICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgIE9wZXJhdGlvbktleXMuT04sXG4gICAgICBvbGRNb2RlbFxuICAgICk7XG4gICAgcmV0dXJuIFttb2RlbCwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIG11bHRpcGxlIG1vZGVscyBmb3IgdXBkYXRlIGFuZCBleGVjdXRlcyBwcmUtdXBkYXRlIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBtdWx0aXBsZSBtb2RlbHMgYmVmb3JlIHRoZXkgYXJlIHVwZGF0ZWQgaW4gdGhlIGRhdGEgc3RvcmUuIFRoaXMgaW5jbHVkZXNcbiAgICogY3JlYXRpbmcgYSBjb250ZXh0LCBpbnN0YW50aWF0aW5nIG5ldyBtb2RlbCBpbnN0YW5jZXMsIGFuZCBlbmZvcmNpbmcgYW55IGRlY29yYXRvcnNcbiAgICogdGhhdCBzaG91bGQgYmUgYXBwbGllZCBiZWZvcmUgdXBkYXRpbmcgZm9yIGVhY2ggbW9kZWwuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgLSBUaGUgYXJyYXkgb2YgbW9kZWwgaW5zdGFuY2VzIHRvIHByZXBhcmUgZm9yIHVwZGF0ZVxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHRoZSB1cGRhdGUgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgcHJlcGFyZWQgbW9kZWxzIGFuZCBjb250ZXh0IGFyZ3VtZW50c1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHVwZGF0ZUFsbFByZWZpeChtb2RlbHM6IE1bXSwgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJnczxNLCBDLCBGPihcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3NcbiAgICApO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcCgobSkgPT4ge1xuICAgICAgICBtID0gbmV3IHRoaXMuY2xhc3MobSk7XG4gICAgICAgIGVuZm9yY2VEQkRlY29yYXRvcnM8TSwgdHlwZW9mIHRoaXMsIGFueSwgRiwgQz4oXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gW21vZGVscywgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBtdWx0aXBsZSBtb2RlbHMgYWZ0ZXIgdXBkYXRlIGFuZCBleGVjdXRlcyBwb3N0LXVwZGF0ZSBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBGaW5hbGl6ZXMgbXVsdGlwbGUgbW9kZWxzIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIHVwZGF0ZWQgaW4gdGhlIGRhdGEgc3RvcmUuIFRoaXMgaW5jbHVkZXNcbiAgICogZW5mb3JjaW5nIGFueSBkZWNvcmF0b3JzIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgYWZ0ZXIgdXBkYXRpbmcgZm9yIGVhY2ggbW9kZWwuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgLSBUaGUgYXJyYXkgb2YgbW9kZWwgaW5zdGFuY2VzIHRoYXQgd2VyZSB1cGRhdGVkXG4gICAqIEBwYXJhbSB7Q30gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGFycmF5IG9mIHByb2Nlc3NlZCBtb2RlbCBpbnN0YW5jZXNcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyB1cGRhdGVBbGxTdWZmaXgobW9kZWxzOiBNW10sIGNvbnRleHQ6IEMpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoKG0pID0+XG4gICAgICAgIGVuZm9yY2VEQkRlY29yYXRvcnM8TSwgdHlwZW9mIHRoaXMsIGFueSwgRiwgQz4oXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5BRlRFUlxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcbiAgICByZXR1cm4gbW9kZWxzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgbW9kZWwgaW5zdGFuY2UgZnJvbSB0aGUgcmVwb3NpdG9yeSBieSBpdHMgcHJpbWFyeSBrZXkuXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSBtb2RlbCBpbnN0YW5jZSBmcm9tIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RvcmUgdXNpbmcgaXRzIHByaW1hcnkga2V5LlxuICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGNvbmNyZXRlIHJlcG9zaXRvcnkgY2xhc3Nlcy5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGtleSAtIFRoZSBwcmltYXJ5IGtleSBvZiB0aGUgbW9kZWwgdG8gZGVsZXRlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIGRlbGV0ZSBvcGVyYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGRlbGV0ZWQgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIGFic3RyYWN0IGRlbGV0ZShrZXk6IHN0cmluZyB8IG51bWJlciwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBtdWx0aXBsZSBtb2RlbCBpbnN0YW5jZXMgZnJvbSB0aGUgcmVwb3NpdG9yeSBieSB0aGVpciBwcmltYXJ5IGtleXMuXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgbXVsdGlwbGUgbW9kZWwgaW5zdGFuY2VzIGZyb20gdGhlIHVuZGVybHlpbmcgZGF0YSBzdG9yZSB1c2luZyB0aGVpciBwcmltYXJ5IGtleXNcbiAgICogYnkgY2FsbGluZyB0aGUgZGVsZXRlIG1ldGhvZCBmb3IgZWFjaCBrZXkgaW4gdGhlIGFycmF5LlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgbnVtYmVyW119IGtleXMgLSBUaGUgYXJyYXkgb2YgcHJpbWFyeSBrZXlzIG9mIHRoZSBtb2RlbHMgdG8gZGVsZXRlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIGRlbGV0ZSBvcGVyYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiBkZWxldGVkIG1vZGVsIGluc3RhbmNlc1xuICAgKi9cbiAgYXN5bmMgZGVsZXRlQWxsKGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoa2V5cy5tYXAoKGspID0+IHRoaXMuZGVsZXRlKGssIC4uLmFyZ3MpKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBhIG1vZGVsIGFmdGVyIGRlbGV0aW9uIGFuZCBleGVjdXRlcyBwb3N0LWRlbGV0ZSBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBGaW5hbGl6ZXMgYSBtb2RlbCBhZnRlciBpdCBoYXMgYmVlbiBkZWxldGVkIGZyb20gdGhlIGRhdGEgc3RvcmUuIFRoaXMgaW5jbHVkZXNcbiAgICogZW5mb3JjaW5nIGFueSBkZWNvcmF0b3JzIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgYWZ0ZXIgZGVsZXRpb24uXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdGhhdCB3YXMgZGVsZXRlZFxuICAgKiBAcGFyYW0ge0N9IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcHJvY2Vzc2VkIG1vZGVsIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgZGVsZXRlU3VmZml4KG1vZGVsOiBNLCBjb250ZXh0OiBDKSB7XG4gICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9yczxNLCB0eXBlb2YgdGhpcywgYW55LCBGLCBDPihcbiAgICAgIHRoaXMsXG4gICAgICBjb250ZXh0LFxuICAgICAgbW9kZWwsXG4gICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgIE9wZXJhdGlvbktleXMuQUZURVJcbiAgICApO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgZm9yIGRlbGV0aW5nIGEgbW9kZWwgYW5kIGV4ZWN1dGVzIHByZS1kZWxldGUgb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIGEga2V5IGJlZm9yZSBhIG1vZGVsIGlzIGRlbGV0ZWQgZnJvbSB0aGUgZGF0YSBzdG9yZS4gVGhpcyBpbmNsdWRlc1xuICAgKiBjcmVhdGluZyBhIGNvbnRleHQsIHJldHJpZXZpbmcgdGhlIG1vZGVsIHRvIGJlIGRlbGV0ZWQsIGFuZCBlbmZvcmNpbmcgYW55IGRlY29yYXRvcnNcbiAgICogdGhhdCBzaG91bGQgYmUgYXBwbGllZCBiZWZvcmUgZGVsZXRpb24uXG4gICAqIEBwYXJhbSB7YW55fSBrZXkgLSBUaGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsIHRvIGRlbGV0ZVxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHRoZSBkZWxldGUgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgY29udGFpbmluZyB0aGUga2V5IGFuZCBjb250ZXh0IGFyZ3VtZW50c1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGRlbGV0ZVByZWZpeChrZXk6IGFueSwgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJnczxNLCBDLCBGPihcbiAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3NcbiAgICApO1xuICAgIGNvbnN0IG1vZGVsID0gYXdhaXQgdGhpcy5yZWFkKGtleSwgLi4uY29udGV4dEFyZ3MuYXJncyk7XG4gICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9yczxNLCB0eXBlb2YgdGhpcywgYW55LCBGLCBDPihcbiAgICAgIHRoaXMsXG4gICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgbW9kZWwsXG4gICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICApO1xuICAgIHJldHVybiBba2V5LCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgZm9yIGRlbGV0aW5nIG11bHRpcGxlIG1vZGVscyBhbmQgZXhlY3V0ZXMgcHJlLWRlbGV0ZSBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgbXVsdGlwbGUga2V5cyBiZWZvcmUgbW9kZWxzIGFyZSBkZWxldGVkIGZyb20gdGhlIGRhdGEgc3RvcmUuIFRoaXMgaW5jbHVkZXNcbiAgICogY3JlYXRpbmcgYSBjb250ZXh0LCByZXRyaWV2aW5nIHRoZSBtb2RlbHMgdG8gYmUgZGVsZXRlZCwgYW5kIGVuZm9yY2luZyBhbnkgZGVjb3JhdG9yc1xuICAgKiB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIGJlZm9yZSBkZWxldGlvbiBmb3IgZWFjaCBtb2RlbC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXSB8IG51bWJlcltdfSBrZXlzIC0gVGhlIGFycmF5IG9mIHByaW1hcnkga2V5cyBvZiB0aGUgbW9kZWxzIHRvIGRlbGV0ZVxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHRoZSBkZWxldGUgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgY29udGFpbmluZyB0aGUga2V5cyBhbmQgY29udGV4dCBhcmd1bWVudHNcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBkZWxldGVBbGxQcmVmaXgoa2V5czogc3RyaW5nW10gfCBudW1iZXJbXSwgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJnczxNLCBDLCBGPihcbiAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3NcbiAgICApO1xuICAgIGNvbnN0IG1vZGVscyA9IGF3YWl0IHRoaXMucmVhZEFsbChrZXlzLCAuLi5jb250ZXh0QXJncy5hcmdzKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoYXN5bmMgKG0pID0+IHtcbiAgICAgICAgcmV0dXJuIGVuZm9yY2VEQkRlY29yYXRvcnM8TSwgdHlwZW9mIHRoaXMsIGFueSwgRiwgQz4oXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiBba2V5cywgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBtdWx0aXBsZSBtb2RlbHMgYWZ0ZXIgZGVsZXRpb24gYW5kIGV4ZWN1dGVzIHBvc3QtZGVsZXRlIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IEZpbmFsaXplcyBtdWx0aXBsZSBtb2RlbHMgYWZ0ZXIgdGhleSBoYXZlIGJlZW4gZGVsZXRlZCBmcm9tIHRoZSBkYXRhIHN0b3JlLiBUaGlzIGluY2x1ZGVzXG4gICAqIGVuZm9yY2luZyBhbnkgZGVjb3JhdG9ycyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIGFmdGVyIGRlbGV0aW9uIGZvciBlYWNoIG1vZGVsLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIGFycmF5IG9mIG1vZGVsIGluc3RhbmNlcyB0aGF0IHdlcmUgZGVsZXRlZFxuICAgKiBAcGFyYW0ge0N9IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBhcnJheSBvZiBwcm9jZXNzZWQgbW9kZWwgaW5zdGFuY2VzXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgZGVsZXRlQWxsU3VmZml4KG1vZGVsczogTVtdLCBjb250ZXh0OiBDKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKChtKSA9PlxuICAgICAgICBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIHR5cGVvZiB0aGlzLCBhbnksIEYsIEM+KFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuQUZURVJcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIG1vZGVscztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTWVyZ2VzIHR3byBtb2RlbCBpbnN0YW5jZXMgaW50byBhIG5ldyBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBtb2RlbCBpbnN0YW5jZSBieSBjb21iaW5pbmcgcHJvcGVydGllcyBmcm9tIGFuIG9sZCBtb2RlbCBhbmQgYSBuZXcgbW9kZWwuXG4gICAqIFByb3BlcnRpZXMgZnJvbSB0aGUgbmV3IG1vZGVsIG92ZXJyaWRlIHByb3BlcnRpZXMgZnJvbSB0aGUgb2xkIG1vZGVsIGlmIHRoZXkgYXJlIGRlZmluZWQuXG4gICAqIEBwYXJhbSB7TX0gb2xkTW9kZWwgLSBUaGUgb3JpZ2luYWwgbW9kZWwgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBuZXcgbW9kZWwgaW5zdGFuY2Ugd2l0aCB1cGRhdGVkIHByb3BlcnRpZXNcbiAgICogQHJldHVybiB7TX0gQSBuZXcgbW9kZWwgaW5zdGFuY2Ugd2l0aCBtZXJnZWQgcHJvcGVydGllc1xuICAgKi9cbiAgcHJvdGVjdGVkIG1lcmdlKG9sZE1vZGVsOiBNLCBtb2RlbDogTSk6IE0ge1xuICAgIGNvbnN0IGV4dHJhY3QgPSAobW9kZWw6IE0pID0+XG4gICAgICBPYmplY3QuZW50cmllcyhtb2RlbCkucmVkdWNlKChhY2N1bTogUmVjb3JkPHN0cmluZywgYW55PiwgW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHZhbCAhPT0gXCJ1bmRlZmluZWRcIikgYWNjdW1ba2V5XSA9IHZhbDtcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSwge30pO1xuXG4gICAgcmV0dXJuIG5ldyB0aGlzLmNsYXNzKE9iamVjdC5hc3NpZ24oe30sIGV4dHJhY3Qob2xkTW9kZWwpLCBleHRyYWN0KG1vZGVsKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZXBvc2l0b3J5LlxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGlzIHJlcG9zaXRvcnkgYnkgdGhlIG5hbWUgb2YgaXRzIG1vZGVsIGNsYXNzLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZXBvc2l0b3J5XG4gICAqL1xuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5jbGFzcy5uYW1lfSBSZXBvc2l0b3J5YDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgZW5mb3JjZURCRGVjb3JhdG9ycyB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIi4uL29wZXJhdGlvbnMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yLCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IEJhc2VSZXBvc2l0b3J5IH0gZnJvbSBcIi4vQmFzZVJlcG9zaXRvcnlcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IERCS2V5cyB9IGZyb20gXCIuLi9tb2RlbC9jb25zdGFudHNcIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiLi9Db250ZXh0XCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5RmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25jcmV0ZSByZXBvc2l0b3J5IGltcGxlbWVudGF0aW9uIHdpdGggdmFsaWRhdGlvbiBzdXBwb3J0LlxuICogQHN1bW1hcnkgVGhlIFJlcG9zaXRvcnkgY2xhc3MgZXh0ZW5kcyBCYXNlUmVwb3NpdG9yeSB0byBwcm92aWRlIGFkZGl0aW9uYWwgdmFsaWRhdGlvblxuICogZnVuY3Rpb25hbGl0eS4gSXQgb3ZlcnJpZGVzIHByZWZpeCBtZXRob2RzIHRvIHBlcmZvcm0gbW9kZWwgdmFsaWRhdGlvbiBiZWZvcmUgZGF0YWJhc2VcbiAqIG9wZXJhdGlvbnMgYW5kIHRocm93cyBWYWxpZGF0aW9uRXJyb3Igd2hlbiB2YWxpZGF0aW9uIGZhaWxzLlxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZSwgZGVmYXVsdHMgdG8gUmVwb3NpdG9yeUZsYWdzXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUsIGRlZmF1bHRzIHRvIENvbnRleHQ8Rj5cbiAqIEBjbGFzcyBSZXBvc2l0b3J5XG4gKiBAZXhhbXBsZVxuICogY2xhc3MgVXNlck1vZGVsIGV4dGVuZHMgTW9kZWwge1xuICogICBAaWQoKVxuICogICBpZDogc3RyaW5nO1xuICpcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgQG1pbkxlbmd0aCgzKVxuICogICBuYW1lOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogY2xhc3MgVXNlclJlcG9zaXRvcnkgZXh0ZW5kcyBSZXBvc2l0b3J5PFVzZXJNb2RlbD4ge1xuICogICBjb25zdHJ1Y3RvcigpIHtcbiAqICAgICBzdXBlcihVc2VyTW9kZWwpO1xuICogICB9XG4gKlxuICogICBhc3luYyBjcmVhdGUobW9kZWw6IFVzZXJNb2RlbCk6IFByb21pc2U8VXNlck1vZGVsPiB7XG4gKiAgICAgLy8gSW1wbGVtZW50YXRpb24gd2l0aCBhdXRvbWF0aWMgdmFsaWRhdGlvblxuICogICAgIHJldHVybiBtb2RlbDtcbiAqICAgfVxuICogfVxuICpcbiAqIC8vIFVzaW5nIHRoZSByZXBvc2l0b3J5XG4gKiBjb25zdCByZXBvID0gbmV3IFVzZXJSZXBvc2l0b3J5KCk7XG4gKiB0cnkge1xuICogICBjb25zdCB1c2VyID0gYXdhaXQgcmVwby5jcmVhdGUoeyBuYW1lOiAnSm8nIH0pOyAvLyBXaWxsIHRocm93IFZhbGlkYXRpb25FcnJvclxuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgY29uc29sZS5lcnJvcihlcnJvcik7IC8vIFZhbGlkYXRpb25FcnJvcjogbmFtZSBtdXN0IGJlIGF0IGxlYXN0IDMgY2hhcmFjdGVyc1xuICogfVxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUmVwb3NpdG9yeTxcbiAgTSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+LFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzID0gUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4+IGV4dGVuZHMgQmFzZVJlcG9zaXRvcnk8TSwgRiwgQz4ge1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoY2xheno/OiBDb25zdHJ1Y3RvcjxNPikge1xuICAgIHN1cGVyKGNsYXp6KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBtb2RlbCBmb3IgY3JlYXRpb24gd2l0aCB2YWxpZGF0aW9uLlxuICAgKiBAc3VtbWFyeSBPdmVycmlkZXMgdGhlIGJhc2UgY3JlYXRlUHJlZml4IG1ldGhvZCB0byBhZGQgdmFsaWRhdGlvbiBjaGVja3MuXG4gICAqIENyZWF0ZXMgYSBjb250ZXh0LCBpbnN0YW50aWF0ZXMgYSBuZXcgbW9kZWwsIGVuZm9yY2VzIGRlY29yYXRvcnMsIGFuZCB2YWxpZGF0ZXNcbiAgICogdGhlIG1vZGVsIGJlZm9yZSBhbGxvd2luZyBjcmVhdGlvbiB0byBwcm9jZWVkLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHByZXBhcmUgZm9yIGNyZWF0aW9uXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIGNyZWF0ZSBvcGVyYXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBjb250YWluaW5nIHRoZSB2YWxpZGF0ZWQgbW9kZWwgYW5kIGNvbnRleHQgYXJndW1lbnRzXG4gICAqIEB0aHJvd3Mge1ZhbGlkYXRpb25FcnJvcn0gSWYgdGhlIG1vZGVsIGZhaWxzIHZhbGlkYXRpb25cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVQcmVmaXgoXG4gICAgbW9kZWw6IE0sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxbTSwgLi4uYW55W11dPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzXG4gICAgKTtcbiAgICBtb2RlbCA9IG5ldyB0aGlzLmNsYXNzKG1vZGVsKTtcbiAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgdGhpcyxcbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICBtb2RlbCxcbiAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICk7XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUobW9kZWwuaGFzRXJyb3JzKCkpO1xuICAgIGlmIChlcnJvcnMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JzLnRvU3RyaW5nKCkpO1xuXG4gICAgcmV0dXJuIFttb2RlbCwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIG11bHRpcGxlIG1vZGVscyBmb3IgY3JlYXRpb24gd2l0aCB2YWxpZGF0aW9uLlxuICAgKiBAc3VtbWFyeSBPdmVycmlkZXMgdGhlIGJhc2UgY3JlYXRlQWxsUHJlZml4IG1ldGhvZCB0byBhZGQgdmFsaWRhdGlvbiBjaGVja3MgZm9yIG11bHRpcGxlIG1vZGVscy5cbiAgICogQ3JlYXRlcyBhIGNvbnRleHQsIGluc3RhbnRpYXRlcyBuZXcgbW9kZWxzLCBlbmZvcmNlcyBkZWNvcmF0b3JzLCBhbmQgdmFsaWRhdGVzXG4gICAqIGVhY2ggbW9kZWwgYmVmb3JlIGFsbG93aW5nIGNyZWF0aW9uIHRvIHByb2NlZWQuIENvbGxlY3RzIHZhbGlkYXRpb24gZXJyb3JzIGZyb20gYWxsIG1vZGVscy5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBhcnJheSBvZiBtb2RlbCBpbnN0YW5jZXMgdG8gcHJlcGFyZSBmb3IgY3JlYXRpb25cbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUgY3JlYXRlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueVtdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgdmFsaWRhdGVkIG1vZGVscyBhbmQgY29udGV4dCBhcmd1bWVudHNcbiAgICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBJZiBhbnkgbW9kZWwgZmFpbHMgdmFsaWRhdGlvbiwgd2l0aCBkZXRhaWxzIGFib3V0IHdoaWNoIG1vZGVscyBmYWlsZWRcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGxQcmVmaXgoXG4gICAgbW9kZWxzOiBNW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxhbnlbXT4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJnc1xuICAgICk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKGFzeW5jIChtKSA9PiB7XG4gICAgICAgIG0gPSBuZXcgdGhpcy5jbGFzcyhtKTtcbiAgICAgICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBtO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgY29uc3QgbW9kZWxzVmFsaWRhdGlvbiA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcCgobSkgPT4gUHJvbWlzZS5yZXNvbHZlKG0uaGFzRXJyb3JzKCkpKVxuICAgICk7XG5cbiAgICBjb25zdCBlcnJvcnMgPSBtb2RlbHNWYWxpZGF0aW9uLnJlZHVjZShcbiAgICAgIChhY2N1bTogc3RyaW5nIHwgdW5kZWZpbmVkLCBlLCBpKSA9PiB7XG4gICAgICAgIGlmIChlKVxuICAgICAgICAgIGFjY3VtID1cbiAgICAgICAgICAgIHR5cGVvZiBhY2N1bSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICA/IGFjY3VtICsgYFxcbiAtICR7aX06ICR7ZS50b1N0cmluZygpfWBcbiAgICAgICAgICAgICAgOiBgIC0gJHtpfTogJHtlLnRvU3RyaW5nKCl9YDtcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSxcbiAgICAgIHVuZGVmaW5lZFxuICAgICk7XG5cbiAgICBpZiAoZXJyb3JzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycm9ycyk7XG4gICAgcmV0dXJuIFttb2RlbHMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBhIG1vZGVsIGZvciB1cGRhdGUgd2l0aCB2YWxpZGF0aW9uLlxuICAgKiBAc3VtbWFyeSBPdmVycmlkZXMgdGhlIGJhc2UgdXBkYXRlUHJlZml4IG1ldGhvZCB0byBhZGQgdmFsaWRhdGlvbiBjaGVja3MuXG4gICAqIENyZWF0ZXMgYSBjb250ZXh0LCB2YWxpZGF0ZXMgdGhlIHByaW1hcnkga2V5LCByZXRyaWV2ZXMgdGhlIGV4aXN0aW5nIG1vZGVsLFxuICAgKiBtZXJnZXMgdGhlIG9sZCBhbmQgbmV3IG1vZGVscywgZW5mb3JjZXMgZGVjb3JhdG9ycywgYW5kIHZhbGlkYXRlcyB0aGUgbW9kZWxcbiAgICogYmVmb3JlIGFsbG93aW5nIHRoZSB1cGRhdGUgdG8gcHJvY2VlZC5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBwcmVwYXJlIGZvciB1cGRhdGVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUgdXBkYXRlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHZhbGlkYXRlZCBtb2RlbCBhbmQgY29udGV4dCBhcmd1bWVudHNcbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlIG1vZGVsIGRvZXNuJ3QgaGF2ZSBhIHByaW1hcnkga2V5IHZhbHVlXG4gICAqIEB0aHJvd3Mge1ZhbGlkYXRpb25FcnJvcn0gSWYgdGhlIG1vZGVsIGZhaWxzIHZhbGlkYXRpb25cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyB1cGRhdGVQcmVmaXgoXG4gICAgbW9kZWw6IE0sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxbTSwgLi4uYXJnczogYW55W11dPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzXG4gICAgKTtcbiAgICBjb25zdCBwayA9IChtb2RlbCBhcyBhbnkpW3RoaXMucGtdO1xuICAgIGlmICghcGspXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHZhbHVlIGZvciB0aGUgSWQgaXMgZGVmaW5lZCB1bmRlciB0aGUgcHJvcGVydHkgJHt0aGlzLnBrIGFzIHN0cmluZ31gXG4gICAgICApO1xuXG4gICAgY29uc3Qgb2xkTW9kZWw6IE0gPSBhd2FpdCB0aGlzLnJlYWQocGspO1xuXG4gICAgbW9kZWwgPSB0aGlzLm1lcmdlKG9sZE1vZGVsLCBtb2RlbCk7XG5cbiAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgdGhpcyxcbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICBtb2RlbCxcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgT3BlcmF0aW9uS2V5cy5PTixcbiAgICAgIG9sZE1vZGVsXG4gICAgKTtcblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShtb2RlbC5oYXNFcnJvcnMob2xkTW9kZWwgYXMgYW55KSk7XG4gICAgaWYgKGVycm9ycykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvcnMudG9TdHJpbmcoKSk7XG4gICAgcmV0dXJuIFttb2RlbCwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIG11bHRpcGxlIG1vZGVscyBmb3IgdXBkYXRlIHdpdGggdmFsaWRhdGlvbi5cbiAgICogQHN1bW1hcnkgT3ZlcnJpZGVzIHRoZSBiYXNlIHVwZGF0ZUFsbFByZWZpeCBtZXRob2QgdG8gYWRkIHZhbGlkYXRpb24gY2hlY2tzIGZvciBtdWx0aXBsZSBtb2RlbHMuXG4gICAqIENyZWF0ZXMgYSBjb250ZXh0LCB2YWxpZGF0ZXMgcHJpbWFyeSBrZXlzLCByZXRyaWV2ZXMgZXhpc3RpbmcgbW9kZWxzLCBtZXJnZXMgb2xkIGFuZCBuZXcgbW9kZWxzLFxuICAgKiBlbmZvcmNlcyBkZWNvcmF0b3JzLCBhbmQgdmFsaWRhdGVzIGVhY2ggbW9kZWwgYmVmb3JlIGFsbG93aW5nIHVwZGF0ZXMgdG8gcHJvY2VlZC5cbiAgICogQ29sbGVjdHMgdmFsaWRhdGlvbiBlcnJvcnMgZnJvbSBhbGwgbW9kZWxzLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIGFycmF5IG9mIG1vZGVsIGluc3RhbmNlcyB0byBwcmVwYXJlIGZvciB1cGRhdGVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUgdXBkYXRlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHZhbGlkYXRlZCBtb2RlbHMgYW5kIGNvbnRleHQgYXJndW1lbnRzXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIGFueSBtb2RlbCBkb2Vzbid0IGhhdmUgYSBwcmltYXJ5IGtleSB2YWx1ZVxuICAgKiBAdGhyb3dzIHtWYWxpZGF0aW9uRXJyb3J9IElmIGFueSBtb2RlbCBmYWlscyB2YWxpZGF0aW9uLCB3aXRoIGRldGFpbHMgYWJvdXQgd2hpY2ggbW9kZWxzIGZhaWxlZFxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbFByZWZpeChtb2RlbHM6IE1bXSwgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3NcbiAgICApO1xuICAgIGNvbnN0IGlkcyA9IG1vZGVscy5tYXAoKG0pID0+IHtcbiAgICAgIGNvbnN0IGlkID0gbVt0aGlzLnBrXTtcbiAgICAgIGlmICh0eXBlb2YgaWQgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBObyB2YWx1ZSBmb3IgdGhlIElkIGlzIGRlZmluZWQgdW5kZXIgdGhlIHByb3BlcnR5ICR7dGhpcy5wayBhcyBzdHJpbmd9YFxuICAgICAgICApO1xuICAgICAgcmV0dXJuIGlkIGFzIHN0cmluZztcbiAgICB9KTtcbiAgICBjb25zdCBvbGRNb2RlbHM6IE1bXSA9IGF3YWl0IHRoaXMucmVhZEFsbChpZHMsIC4uLmNvbnRleHRBcmdzLmFyZ3MpO1xuICAgIG1vZGVscyA9IG1vZGVscy5tYXAoKG0sIGkpID0+IHRoaXMubWVyZ2Uob2xkTW9kZWxzW2ldLCBtKSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKChtLCBpKSA9PlxuICAgICAgICBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT04sXG4gICAgICAgICAgb2xkTW9kZWxzW2ldXG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuXG4gICAgY29uc3QgbW9kZWxzVmFsaWRhdGlvbiA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcCgobSwgaSkgPT4gUHJvbWlzZS5yZXNvbHZlKG0uaGFzRXJyb3JzKG9sZE1vZGVsc1tpXSBhcyBhbnkpKSlcbiAgICApO1xuXG4gICAgY29uc3QgZXJyb3JzID0gbW9kZWxzVmFsaWRhdGlvbi5yZWR1Y2UoXG4gICAgICAoYWNjdW06IHN0cmluZyB8IHVuZGVmaW5lZCwgZSwgaSkgPT4ge1xuICAgICAgICBpZiAoZSlcbiAgICAgICAgICBhY2N1bSA9XG4gICAgICAgICAgICB0eXBlb2YgYWNjdW0gPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgPyBhY2N1bSArIGBcXG4gLSAke2l9OiAke2UudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICAgIDogYCAtICR7aX06ICR7ZS50b1N0cmluZygpfWA7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sXG4gICAgICB1bmRlZmluZWRcbiAgICApO1xuXG4gICAgaWYgKGVycm9ycykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvcnMpO1xuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHJlZmxlY3Rpb24ga2V5IGZvciBkYXRhYmFzZSBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBHZW5lcmF0ZXMgYSBrZXkgZm9yIHN0b3JpbmcgbWV0YWRhdGEgaW4gdGhlIHJlZmxlY3Rpb24gc3lzdGVtIGJ5IHByZWZpeGluZ1xuICAgKiB0aGUgcHJvdmlkZWQga2V5IHdpdGggdGhlIGRhdGFiYXNlIHJlZmxlY3Rpb24gcHJlZml4LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGJhc2Uga2V5IHRvIHByZWZpeFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwcmVmaXhlZCByZWZsZWN0aW9uIGtleVxuICAgKi9cbiAgc3RhdGljIGtleShrZXk6IHN0cmluZykge1xuICAgIHJldHVybiBEQktleXMuUkVGTEVDVCArIGtleTtcbiAgfVxufVxuIiwiaW1wb3J0IFwiLi92YWxpZGF0aW9uXCI7XG5pbXBvcnQge1xuICBkYXRlLFxuICBEZWNvcmF0aW9uLFxuICBNb2RlbCxcbiAgcHJvcE1ldGFkYXRhLFxuICByZXF1aXJlZCxcbiAgdHlwZSxcbiAgVmFsaWRhdGlvbixcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgREJLZXlzLCBERUZBVUxUX1RJTUVTVEFNUF9GT1JNQVQgfSBmcm9tIFwiLi4vbW9kZWwvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBEQk9wZXJhdGlvbnMsIE9wZXJhdGlvbktleXMgfSBmcm9tIFwiLi4vb3BlcmF0aW9ucy9jb25zdGFudHNcIjtcbmltcG9ydCB7IGFmdGVyLCBvbiwgb25DcmVhdGVVcGRhdGUgfSBmcm9tIFwiLi4vb3BlcmF0aW9ucy9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBJUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL0lSZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9lcnJvcnNcIjtcbmltcG9ydCB7IGFwcGx5LCBtZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvQ29udGV4dFwiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeUZsYWdzIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJldmVudHMgYSBwcm9wZXJ0eSBmcm9tIGJlaW5nIG1vZGlmaWVkIGFmdGVyIGluaXRpYWwgY3JlYXRpb24uXG4gKiBAc3VtbWFyeSBNYXJrcyB0aGUgcHJvcGVydHkgYXMgcmVhZG9ubHksIGNhdXNpbmcgdmFsaWRhdGlvbiBlcnJvcnMgaWYgYXR0ZW1wdHMgYXJlIG1hZGUgdG8gbW9kaWZ5IGl0IGR1cmluZyB1cGRhdGVzLlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSAtIFRoZSBlcnJvciBtZXNzYWdlIHRvIGRpc3BsYXkgd2hlbiB2YWxpZGF0aW9uIGZhaWxzLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5SRUFET05MWS5JTlZBTElEfVxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIHJlYWRvbmx5XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZG9ubHkoXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuUkVBRE9OTFkuSU5WQUxJRFxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24udXBkYXRlS2V5KERCS2V5cy5SRUFET05MWSk7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZShcbiAgICAgIHByb3BNZXRhZGF0YShrZXksIHtcbiAgICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgIH0pXG4gICAgKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVyIGZ1bmN0aW9uIHRoYXQgc2V0cyBhIHRpbWVzdGFtcCBwcm9wZXJ0eSB0byB0aGUgY3VycmVudCB0aW1lc3RhbXAuXG4gKiBAc3VtbWFyeSBVcGRhdGVzIGEgbW9kZWwgcHJvcGVydHkgd2l0aCB0aGUgY3VycmVudCB0aW1lc3RhbXAgZnJvbSB0aGUgcmVwb3NpdG9yeSBjb250ZXh0LlxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgSVJlcG9zaXRvcnlcbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIGRhdGEgdHlwZSBmb3IgdGhlIG9wZXJhdGlvblxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGVcbiAqIEBwYXJhbSB7Q30gY29udGV4dCAtIFRoZSByZXBvc2l0b3J5IGNvbnRleHQgY29udGFpbmluZyB0aGUgY3VycmVudCB0aW1lc3RhbXBcbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSBkYXRhIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gdXBkYXRlXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIGJlaW5nIHVwZGF0ZWRcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHRpbWVzdGFtcCBoYXMgYmVlbiBzZXRcbiAqIEBmdW5jdGlvbiB0aW1lc3RhbXBIYW5kbGVyXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0aW1lc3RhbXBIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBJUmVwb3NpdG9yeTxNLCBGLCBDPixcbiAgVixcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBDb250ZXh0PEY+LFxuPih0aGlzOiBSLCBjb250ZXh0OiBDLCBkYXRhOiBWLCBrZXk6IGtleW9mIE0sIG1vZGVsOiBNKTogUHJvbWlzZTx2b2lkPiB7XG4gIChtb2RlbCBhcyBhbnkpW2tleV0gPSBjb250ZXh0LnRpbWVzdGFtcDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQXV0b21hdGljYWxseSBtYW5hZ2VzIHRpbWVzdGFtcCBwcm9wZXJ0aWVzIGZvciB0cmFja2luZyBjcmVhdGlvbiBhbmQgdXBkYXRlIHRpbWVzLlxuICogQHN1bW1hcnkgTWFya3MgdGhlIHByb3BlcnR5IGFzIGEgdGltZXN0YW1wLCBtYWtpbmcgaXQgcmVxdWlyZWQgYW5kIGVuc3VyaW5nIGl0J3MgYSB2YWxpZCBkYXRlLiBUaGUgcHJvcGVydHkgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgd2l0aCB0aGUgY3VycmVudCB0aW1lc3RhbXAgZHVyaW5nIHNwZWNpZmllZCBvcGVyYXRpb25zLlxuICpcbiAqIERhdGUgRm9ybWF0OlxuICpcbiAqIDxwcmU+XG4gKiAgICAgIFVzaW5nIHNpbWlsYXIgZm9ybWF0dGluZyBhcyBNb21lbnQuanMsIENsYXNzIERhdGVUaW1lRm9ybWF0dGVyIChKYXZhKSwgYW5kIENsYXNzIFNpbXBsZURhdGVGb3JtYXQgKEphdmEpLFxuICogICAgICBJIGltcGxlbWVudGVkIGEgY29tcHJlaGVuc2l2ZSBzb2x1dGlvbiBmb3JtYXREYXRlKGRhdGUsIHBhdHRlcm5TdHIpIHdoZXJlIHRoZSBjb2RlIGlzIGVhc3kgdG8gcmVhZCBhbmQgbW9kaWZ5LlxuICogICAgICBZb3UgY2FuIGRpc3BsYXkgZGF0ZSwgdGltZSwgQU0vUE0sIGV0Yy5cbiAqXG4gKiAgICAgIERhdGUgYW5kIFRpbWUgUGF0dGVybnNcbiAqICAgICAgeXkgPSAyLWRpZ2l0IHllYXI7IHl5eXkgPSBmdWxsIHllYXJcbiAqICAgICAgTSA9IGRpZ2l0IG1vbnRoOyBNTSA9IDItZGlnaXQgbW9udGg7IE1NTSA9IHNob3J0IG1vbnRoIG5hbWU7IE1NTU0gPSBmdWxsIG1vbnRoIG5hbWVcbiAqICAgICAgRUVFRSA9IGZ1bGwgd2Vla2RheSBuYW1lOyBFRUUgPSBzaG9ydCB3ZWVrZGF5IG5hbWVcbiAqICAgICAgZCA9IGRpZ2l0IGRheTsgZGQgPSAyLWRpZ2l0IGRheVxuICogICAgICBoID0gaG91cnMgYW0vcG07IGhoID0gMi1kaWdpdCBob3VycyBhbS9wbTsgSCA9IGhvdXJzOyBISCA9IDItZGlnaXQgaG91cnNcbiAqICAgICAgbSA9IG1pbnV0ZXM7IG1tID0gMi1kaWdpdCBtaW51dGVzOyBhYWEgPSBBTS9QTVxuICogICAgICBzID0gc2Vjb25kczsgc3MgPSAyLWRpZ2l0IHNlY29uZHNcbiAqICAgICAgUyA9IG1pbGlzZWNvbmRzXG4gKiA8L3ByZT5cbiAqXG4gKiBAcGFyYW0ge09wZXJhdGlvbktleXNbXX0gb3BlcmF0aW9uIC0gVGhlIG9wZXJhdGlvbnMgdG8gYWN0IG9uLiBEZWZhdWx0cyB0byB7QGxpbmsgREJPcGVyYXRpb25zLkNSRUFURV9VUERBVEV9XG4gKiBAcGFyYW0ge3N0cmluZ30gW2Zvcm1hdF0gLSBUaGUgdGltZXN0YW1wIGZvcm1hdC4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfVElNRVNUQU1QX0ZPUk1BVH1cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiB0aW1lc3RhbXBcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IE0gYXMgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgVCBhcyBUaW1lc3RhbXBEZWNvcmF0b3JcbiAqICAgcGFydGljaXBhbnQgViBhcyBWYWxpZGF0b3JcbiAqXG4gKiAgIEMtPj5NOiBDcmVhdGUvVXBkYXRlIG1vZGVsXG4gKiAgIE0tPj5UOiBQcm9jZXNzIHRpbWVzdGFtcCBwcm9wZXJ0eVxuICogICBULT4+TTogQXBwbHkgcmVxdWlyZWQgdmFsaWRhdGlvblxuICogICBULT4+TTogQXBwbHkgZGF0ZSBmb3JtYXQgdmFsaWRhdGlvblxuICpcbiAqICAgYWx0IFVwZGF0ZSBvcGVyYXRpb25cbiAqICAgICBULT4+VjogUmVnaXN0ZXIgdGltZXN0YW1wIHZhbGlkYXRvclxuICogICAgIFYtPj5NOiBWYWxpZGF0ZSB0aW1lc3RhbXAgaXMgbmV3ZXJcbiAqICAgZW5kXG4gKlxuICogICBULT4+TTogU2V0IGN1cnJlbnQgdGltZXN0YW1wXG4gKiAgIE0tPj5DOiBSZXR1cm4gdXBkYXRlZCBtb2RlbFxuICovXG5leHBvcnQgZnVuY3Rpb24gdGltZXN0YW1wKFxuICBvcGVyYXRpb246IE9wZXJhdGlvbktleXNbXSA9IERCT3BlcmF0aW9ucy5DUkVBVEVfVVBEQVRFIGFzIHVua25vd24gYXMgT3BlcmF0aW9uS2V5c1tdLFxuICBmb3JtYXQ6IHN0cmluZyA9IERFRkFVTFRfVElNRVNUQU1QX0ZPUk1BVFxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24udXBkYXRlS2V5KERCS2V5cy5USU1FU1RBTVApO1xuXG4gIGZ1bmN0aW9uIHRzKG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5c1tdLCBmb3JtYXQ6IHN0cmluZykge1xuICAgIGNvbnN0IGRlY29yYXRvcnM6IGFueVtdID0gW1xuICAgICAgZGF0ZShmb3JtYXQsIERFRkFVTFRfRVJST1JfTUVTU0FHRVMuVElNRVNUQU1QLkRBVEUpLFxuICAgICAgcmVxdWlyZWQoREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5USU1FU1RBTVAuUkVRVUlSRUQpLFxuICAgICAgcHJvcE1ldGFkYXRhKFZhbGlkYXRpb24ua2V5KERCS2V5cy5USU1FU1RBTVApLCB7XG4gICAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uLFxuICAgICAgICBmb3JtYXQ6IGZvcm1hdCxcbiAgICAgIH0pLFxuICAgICAgb24ob3BlcmF0aW9uLCB0aW1lc3RhbXBIYW5kbGVyKSxcbiAgICBdO1xuICAgIGlmIChvcGVyYXRpb24uaW5kZXhPZihPcGVyYXRpb25LZXlzLlVQREFURSkgIT09IC0xKVxuICAgICAgZGVjb3JhdG9ycy5wdXNoKFxuICAgICAgICBwcm9wTWV0YWRhdGEoa2V5LCB7XG4gICAgICAgICAgbWVzc2FnZTogREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5USU1FU1RBTVAuSU5WQUxJRCxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgZWxzZSBkZWNvcmF0b3JzLnB1c2gocmVhZG9ubHkoKSk7XG4gICAgcmV0dXJuIGFwcGx5KC4uLmRlY29yYXRvcnMpO1xuICB9XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHRzLFxuICAgICAgYXJnczogW29wZXJhdGlvbiwgZm9ybWF0XSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVyIGZ1bmN0aW9uIHRoYXQgc2VyaWFsaXplcyBhIHByb3BlcnR5IHRvIEpTT04gc3RyaW5nIGR1cmluZyBjcmVhdGUgYW5kIHVwZGF0ZSBvcGVyYXRpb25zLlxuICogQHN1bW1hcnkgQ29udmVydHMgYSBjb21wbGV4IG9iamVjdCBwcm9wZXJ0eSB0byBhIEpTT04gc3RyaW5nIGJlZm9yZSBzdG9yaW5nIGl0IGluIHRoZSBkYXRhYmFzZS5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIElSZXBvc2l0b3J5XG4gKiBAdGVtcGxhdGUgViAtIFRoZSBkYXRhIHR5cGUgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlXG4gKiBAcGFyYW0ge0N9IGNvbnRleHQgLSBUaGUgcmVwb3NpdG9yeSBjb250ZXh0XG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgZGF0YSBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIHNlcmlhbGl6ZVxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBiZWluZyBwcm9jZXNzZWRcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHByb3BlcnR5IGhhcyBiZWVuIHNlcmlhbGl6ZWRcbiAqIEBmdW5jdGlvbiBzZXJpYWxpemVPbkNyZWF0ZVVwZGF0ZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VyaWFsaXplT25DcmVhdGVVcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIElSZXBvc2l0b3J5PE0sIEYsIEM+LFxuICBWLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzID0gUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4+KHRoaXM6IFIsIGNvbnRleHQ6IEMsIGRhdGE6IFYsIGtleToga2V5b2YgTSwgbW9kZWw6IE0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFtb2RlbFtrZXldKSByZXR1cm47XG4gIHRyeSB7XG4gICAgbW9kZWxba2V5XSA9IEpTT04uc3RyaW5naWZ5KG1vZGVsW2tleV0pIGFzIE1ba2V5b2YgTV07XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gc2VyaWFsaXplICR7a2V5LnRvU3RyaW5nKCl9IHByb3BlcnR5IG9mIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX06IGVgXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVyIGZ1bmN0aW9uIHRoYXQgZGVzZXJpYWxpemVzIGEgcHJvcGVydHkgZnJvbSBKU09OIHN0cmluZyBhZnRlciBkYXRhYmFzZSBvcGVyYXRpb25zLlxuICogQHN1bW1hcnkgQ29udmVydHMgYSBKU09OIHN0cmluZyBwcm9wZXJ0eSBiYWNrIHRvIGl0cyBvcmlnaW5hbCBjb21wbGV4IG9iamVjdCBmb3JtIGFmdGVyIHJldHJpZXZpbmcgaXQgZnJvbSB0aGUgZGF0YWJhc2UuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBJUmVwb3NpdG9yeVxuICogQHRlbXBsYXRlIFYgLSBUaGUgZGF0YSB0eXBlIGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZVxuICogQHBhcmFtIHtDfSBjb250ZXh0IC0gVGhlIHJlcG9zaXRvcnkgY29udGV4dFxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIGRhdGEgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byBkZXNlcmlhbGl6ZVxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBiZWluZyBwcm9jZXNzZWRcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHByb3BlcnR5IGhhcyBiZWVuIGRlc2VyaWFsaXplZFxuICogQGZ1bmN0aW9uIHNlcmlhbGl6ZUFmdGVyQWxsXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXJpYWxpemVBZnRlckFsbDxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgSVJlcG9zaXRvcnk8TSwgRiwgQz4sXG4gIFYsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbj4odGhpczogUiwgY29udGV4dDogQywgZGF0YTogViwga2V5OiBrZXlvZiBNLCBtb2RlbDogTSk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIW1vZGVsW2tleV0pIHJldHVybjtcbiAgaWYgKHR5cGVvZiBtb2RlbFtrZXldICE9PSBcInN0cmluZ1wiKSByZXR1cm47XG5cbiAgdHJ5IHtcbiAgICBtb2RlbFtrZXldID0gSlNPTi5wYXJzZShtb2RlbFtrZXldKTtcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGRlc2VyaWFsaXplICR7a2V5LnRvU3RyaW5nKCl9IHByb3BlcnR5IG9mIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX06ICR7ZX1gXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFbmFibGVzIGF1dG9tYXRpYyBKU09OIHNlcmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvbiBmb3IgY29tcGxleCBvYmplY3QgcHJvcGVydGllcy5cbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IGF1dG9tYXRpY2FsbHkgY29udmVydHMgY29tcGxleCBvYmplY3RzIHRvIEpTT04gc3RyaW5ncyBiZWZvcmUgc3RvcmluZyBpbiB0aGUgZGF0YWJhc2UgYW5kIGJhY2sgdG8gb2JqZWN0cyB3aGVuIHJldHJpZXZpbmcgdGhlbS5cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBzZXJpYWxpemVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IE0gYXMgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgUyBhcyBTZXJpYWxpemVEZWNvcmF0b3JcbiAqICAgcGFydGljaXBhbnQgREIgYXMgRGF0YWJhc2VcbiAqXG4gKiAgIE5vdGUgb3ZlciBDLERCOiBDcmVhdGUvVXBkYXRlIEZsb3dcbiAqICAgQy0+Pk06IFNldCBjb21wbGV4IG9iamVjdCBwcm9wZXJ0eVxuICogICBNLT4+UzogUHJvY2VzcyBwcm9wZXJ0eSAoY3JlYXRlL3VwZGF0ZSlcbiAqICAgUy0+Pk06IENvbnZlcnQgdG8gSlNPTiBzdHJpbmdcbiAqICAgTS0+PkRCOiBTdG9yZSBzZXJpYWxpemVkIGRhdGFcbiAqXG4gKiAgIE5vdGUgb3ZlciBDLERCOiBSZXRyaWV2YWwgRmxvd1xuICogICBDLT4+TTogUmVxdWVzdCBtb2RlbFxuICogICBNLT4+REI6IEZldGNoIGRhdGFcbiAqICAgREItPj5NOiBSZXR1cm4gd2l0aCBzZXJpYWxpemVkIHByb3BlcnR5XG4gKiAgIE0tPj5TOiBQcm9jZXNzIHByb3BlcnR5IChhZnRlciBhbGwgb3BzKVxuICogICBTLT4+TTogUGFyc2UgSlNPTiBiYWNrIHRvIG9iamVjdFxuICogICBNLT4+QzogUmV0dXJuIG1vZGVsIHdpdGggZGVzZXJpYWxpemVkIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemUoKSB7XG4gIHJldHVybiBhcHBseShcbiAgICBvbkNyZWF0ZVVwZGF0ZShzZXJpYWxpemVPbkNyZWF0ZVVwZGF0ZSksXG4gICAgYWZ0ZXIoREJPcGVyYXRpb25zLkFMTCwgc2VyaWFsaXplQWZ0ZXJBbGwpLFxuICAgIHR5cGUoW1N0cmluZy5uYW1lLCBPYmplY3QubmFtZV0pLFxuICAgIG1ldGFkYXRhKFJlcG9zaXRvcnkua2V5KERCS2V5cy5TRVJJQUxJWkUpLCB7fSlcbiAgKTtcbn1cbiIsImltcG9ydCB7IHByb3BNZXRhZGF0YSwgcmVxdWlyZWQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyByZWFkb25seSB9IGZyb20gXCIuLi92YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBEQktleXMgfSBmcm9tIFwiLi4vbW9kZWwvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IGFwcGx5IH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IG1hcmtzIGEgcHJvcGVydHkgYXMgYW4gSUQgZmllbGRcbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBjb21wb3NpdGUgZGVjb3JhdG9yIHRoYXQgbWFya3MgYSBwcm9wZXJ0eSBhcyByZXF1aXJlZCwgcmVhZG9ubHksIGFuZCBhcyB0aGUgSUQgZmllbGQgZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnNcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBpZFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlkKCkge1xuICByZXR1cm4gYXBwbHkoXG4gICAgcmVxdWlyZWQoKSxcbiAgICByZWFkb25seSgpLFxuICAgIHByb3BNZXRhZGF0YShSZXBvc2l0b3J5LmtleShEQktleXMuSUQpLCB7fSlcbiAgKTtcbn1cbiIsImltcG9ydCB7XG4gIENvbmRpdGlvbmFsQXN5bmMsXG4gIERlY29yYXRvck1ldGFkYXRhQXN5bmMsXG4gIGdldFZhbGlkYXRpb25EZWNvcmF0b3JzLFxuICBNb2RlbCxcbiAgTW9kZWxDb25kaXRpb25hbEFzeW5jLFxuICBNb2RlbEVycm9yRGVmaW5pdGlvbixcbiAgTW9kZWxFcnJvcnMsXG4gIE1vZGVsS2V5cyxcbiAgdG9Db25kaXRpb25hbFByb21pc2UsXG4gIFZhbGlkYXRpb24sXG4gIFZhbGlkYXRpb25LZXlzLFxuICBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBVcGRhdGVWYWxpZGF0aW9uS2V5cywgVXBkYXRlVmFsaWRhdG9yIH0gZnJvbSBcIi4uL3ZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGZpbmRNb2RlbElkIH0gZnJvbSBcIi4uL2lkZW50aXR5XCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXRyaWV2ZXMgdmFsaWRhdGlvbiBkZWNvcmF0b3IgZGVmaW5pdGlvbnMgZnJvbSBhIG1vZGVsIGZvciB1cGRhdGUgb3BlcmF0aW9ucywgaW5jbHVkaW5nXG4gKiBzdXBwb3J0IGZvciBzcGVjaWFsIGhhbmRsaW5nIG9mIGxpc3QgZGVjb3JhdG9ycy5cbiAqXG4gKiBAc3VtbWFyeVxuICogSXRlcmF0ZXMgb3ZlciB0aGUgbW9kZWwncyBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIGFuZCBmaWx0ZXJzIG91dCB0aG9zZSBzcGVjaWZpZWQgaW4gdGhlXG4gKiBgcHJvcHNUb0lnbm9yZWAgYXJyYXkuIEZvciBlYWNoIHJlbWFpbmluZyBwcm9wZXJ0eSwgcmV0cmlldmVzIHZhbGlkYXRpb24gZGVjb3JhdG9ycyBzcGVjaWZpY1xuICogdG8gdXBkYXRlIG9wZXJhdGlvbnMgdXNpbmcgdGhlIGBVcGRhdGVWYWxpZGF0aW9uS2V5cy5SRUZMRUNUYCBrZXkuIEFkZGl0aW9uYWxseSwgaXQgZXhwbGljaXRseVxuICogY2hlY2tzIGZvciBhbmQgYXBwZW5kcyBhbnkgYExJU1RgIHR5cGUgZGVjb3JhdG9ycyB0byBlbnN1cmUgcHJvcGVyIHZhbGlkYXRpb24gb2YgY29sbGVjdGlvbiB0eXBlcy5cbiAqXG4gKiBAdGVtcGxhdGUgTSAtIEEgZ2VuZXJpYyBwYXJhbWV0ZXIgZXh0ZW5kaW5nIHRoZSBgTW9kZWxgIGNsYXNzLCByZXByZXNlbnRpbmcgdGhlIG1vZGVsIHR5cGUgYmVpbmcgaW5zcGVjdGVkLlxuICpcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2Ugd2hvc2UgcHJvcGVydGllcyBhcmUgYmVpbmcgaW5zcGVjdGVkIGZvciB1cGRhdGUtcmVsYXRlZCB2YWxpZGF0aW9ucy5cbiAqIEBwYXJhbSB7c3RyaW5nW119IHByb3BzVG9JZ25vcmUgLSBBIGxpc3Qgb2YgcHJvcGVydHkgbmFtZXMgdG8gZXhjbHVkZSBmcm9tIHRoZSB2YWxpZGF0aW9uIGRlY29yYXRvciByZXRyaWV2YWwgcHJvY2Vzcy5cbiAqXG4gKiBAcmV0dXJuIHtWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uW119IEFuIGFycmF5IG9mIHZhbGlkYXRpb24gZGVjb3JhdG9yIGRlZmluaXRpb25zLCBpbmNsdWRpbmcgYm90aFxuICogdXBkYXRlLXNwZWNpZmljIGFuZCBsaXN0LXR5cGUgZGVjb3JhdG9ycywgZXhjbHVkaW5nIHRob3NlIGZvciBpZ25vcmVkIHByb3BlcnRpZXMuXG4gKlxuICogQGZ1bmN0aW9uIGdldFZhbGlkYXRhYmxlVXBkYXRlUHJvcHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbGlkYXRhYmxlVXBkYXRlUHJvcHM8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0sXG4gIHByb3BzVG9JZ25vcmU6IHN0cmluZ1tdXG4pOiBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uW10ge1xuICBjb25zdCBkZWNvcmF0ZWRQcm9wZXJ0aWVzOiBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uW10gPSBbXTtcbiAgZm9yIChjb25zdCBwcm9wIGluIG1vZGVsKSB7XG4gICAgaWYgKFxuICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZGVsLCBwcm9wKSAmJlxuICAgICAgIXByb3BzVG9JZ25vcmUuaW5jbHVkZXMocHJvcClcbiAgICApIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25Qcm9wZXJ0eURlZmluaXRpb24gPSBnZXRWYWxpZGF0aW9uRGVjb3JhdG9ycyhcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIHByb3AsXG4gICAgICAgIFVwZGF0ZVZhbGlkYXRpb25LZXlzLlJFRkxFQ1RcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGxpc3REZWNvcmF0b3IgPSBnZXRWYWxpZGF0aW9uRGVjb3JhdG9ycyhcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIHByb3BcbiAgICAgICkuZGVjb3JhdG9ycy5maW5kKCh7IGtleSB9KSA9PiBrZXkgPT09IFZhbGlkYXRpb25LZXlzLkxJU1QpO1xuXG4gICAgICBpZiAobGlzdERlY29yYXRvcilcbiAgICAgICAgdmFsaWRhdGlvblByb3BlcnR5RGVmaW5pdGlvbi5kZWNvcmF0b3JzLnB1c2gobGlzdERlY29yYXRvcik7XG5cbiAgICAgIGRlY29yYXRlZFByb3BlcnRpZXMucHVzaCh2YWxpZGF0aW9uUHJvcGVydHlEZWZpbml0aW9uKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGVjb3JhdGVkUHJvcGVydGllcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRGVjb3JhdG9yPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIEFzeW5jIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuPihcbiAgbmV3TW9kZWw6IE0sXG4gIG9sZE1vZGVsOiBNLFxuICBwcm9wOiBzdHJpbmcsXG4gIGRlY29yYXRvcjogRGVjb3JhdG9yTWV0YWRhdGFBc3luYyxcbiAgYXN5bmM/OiBBc3luY1xuKTogQ29uZGl0aW9uYWxBc3luYzxBc3luYywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHZhbGlkYXRvcjogVXBkYXRlVmFsaWRhdG9yID0gVmFsaWRhdGlvbi5nZXQoXG4gICAgZGVjb3JhdG9yLmtleVxuICApIGFzIFVwZGF0ZVZhbGlkYXRvcjtcblxuICBpZiAoIXZhbGlkYXRvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyB2YWxpZGF0b3IgZm9yICR7ZGVjb3JhdG9yLmtleX1gKTtcbiAgfVxuXG4gIC8vIFNraXAgdmFsaWRhdG9ycyB0aGF0IGFyZW4ndCBVcGRhdGVWYWxpZGF0b3JzXG4gIGlmICghdmFsaWRhdG9yLnVwZGF0ZUhhc0Vycm9ycykgcmV0dXJuIHRvQ29uZGl0aW9uYWxQcm9taXNlKHVuZGVmaW5lZCwgYXN5bmMpO1xuXG4gIC8vIHNraXAgYXN5bmMgZGVjb3JhdG9ycyBpZiB2YWxpZGF0ZURlY29yYXRvcnMgaXMgY2FsbGVkIHN5bmNocm9ub3VzbHkgKGFzeW5jID0gZmFsc2UpXG4gIGlmICghYXN5bmMgJiYgZGVjb3JhdG9yLnByb3BzLmFzeW5jKVxuICAgIHJldHVybiB0b0NvbmRpdGlvbmFsUHJvbWlzZSh1bmRlZmluZWQsIGFzeW5jKTtcblxuICBjb25zdCBkZWNvcmF0b3JQcm9wcyA9IE9iamVjdC52YWx1ZXMoZGVjb3JhdG9yLnByb3BzKSB8fCB7fTtcblxuICAvLyBjb25zdCBjb250ZXh0ID0gUGF0aFByb3h5RW5naW5lLmNyZWF0ZShvYmosIHtcbiAgLy8gICBpZ25vcmVVbmRlZmluZWQ6IHRydWUsXG4gIC8vICAgaWdub3JlTnVsbDogdHJ1ZSxcbiAgLy8gfSk7XG5cbiAgY29uc3QgbWF5YmVFcnJvciA9IHZhbGlkYXRvci51cGRhdGVIYXNFcnJvcnMoXG4gICAgKG5ld01vZGVsIGFzIGFueSlbcHJvcF0sXG4gICAgKG9sZE1vZGVsIGFzIGFueSlbcHJvcF0sXG4gICAgLi4uZGVjb3JhdG9yUHJvcHNcbiAgKTtcblxuICByZXR1cm4gdG9Db25kaXRpb25hbFByb21pc2UobWF5YmVFcnJvciwgYXN5bmMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVEZWNvcmF0b3JzPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIEFzeW5jIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuPihcbiAgbmV3TW9kZWw6IE0sXG4gIG9sZE1vZGVsOiBNLFxuICBwcm9wOiBzdHJpbmcsXG4gIGRlY29yYXRvcnM6IERlY29yYXRvck1ldGFkYXRhQXN5bmNbXSxcbiAgYXN5bmM/OiBBc3luY1xuKTogQ29uZGl0aW9uYWxBc3luYzxBc3luYywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4gfCB1bmRlZmluZWQge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IFByb21pc2U8c3RyaW5nPj4gPSB7fTtcblxuICBmb3IgKGNvbnN0IGRlY29yYXRvciBvZiBkZWNvcmF0b3JzKSB7XG4gICAgLy8gc2tpcCBhc3luYyBkZWNvcmF0b3JzIGlmIHZhbGlkYXRlRGVjb3JhdG9ycyBpcyBjYWxsZWQgc3luY2hyb25vdXNseSAoYXN5bmMgPSBmYWxzZSlcbiAgICBpZiAoIWFzeW5jICYmIGRlY29yYXRvci5wcm9wcy5hc3luYykgY29udGludWU7XG5cbiAgICBsZXQgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRlRGVjb3JhdG9yKFxuICAgICAgbmV3TW9kZWwsXG4gICAgICBvbGRNb2RlbCxcbiAgICAgIHByb3AsXG4gICAgICBkZWNvcmF0b3IsXG4gICAgICBhc3luY1xuICAgICk7XG5cbiAgICAvKlxuICAgIElmIHRoZSBkZWNvcmF0b3IgaXMgYSBsaXN0LCBlYWNoIGVsZW1lbnQgbXVzdCBiZSBjaGVja2VkLlxuICAgIFdoZW4gJ2FzeW5jJyBpcyB0cnVlLCB0aGUgJ2Vycicgd2lsbCBhbHdheXMgYmUgYSBwZW5kaW5nIHByb21pc2UgaW5pdGlhbGx5LFxuICAgIHNvIHRoZSAnIWVycicgY2hlY2sgd2lsbCBldmFsdWF0ZSB0byBmYWxzZSAoZXZlbiBpZiB0aGUgcHJvbWlzZSBsYXRlciByZXNvbHZlcyB3aXRoIG5vIGVycm9ycylcbiAgICAqL1xuICAgIGlmIChkZWNvcmF0b3Iua2V5ID09PSBWYWxpZGF0aW9uS2V5cy5MSVNUICYmICghdmFsaWRhdGlvbkVycm9ycyB8fCBhc3luYykpIHtcbiAgICAgIGNvbnN0IG5ld1Byb3BWYWx1ZSA9IChuZXdNb2RlbCBhcyBhbnkpW3Byb3BdO1xuICAgICAgY29uc3Qgb2xkUHJvcFZhbHVlID0gKG9sZE1vZGVsIGFzIGFueSlbcHJvcF07XG5cbiAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9XG4gICAgICAgIG5ld1Byb3BWYWx1ZSBpbnN0YW5jZW9mIFNldCA/IFsuLi5uZXdQcm9wVmFsdWVdIDogbmV3UHJvcFZhbHVlO1xuICAgICAgY29uc3Qgb2xkVmFsdWVzID1cbiAgICAgICAgb2xkUHJvcFZhbHVlIGluc3RhbmNlb2YgU2V0ID8gWy4uLm9sZFByb3BWYWx1ZV0gOiBvbGRQcm9wVmFsdWU7XG5cbiAgICAgIGlmIChuZXdWYWx1ZXMgJiYgbmV3VmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdHlwZXMgPVxuICAgICAgICAgIGRlY29yYXRvci5wcm9wcy5jbGFzcyB8fFxuICAgICAgICAgIGRlY29yYXRvci5wcm9wcy5jbGF6eiB8fFxuICAgICAgICAgIGRlY29yYXRvci5wcm9wcy5jdXN0b21UeXBlcztcblxuICAgICAgICBjb25zdCBhbGxvd2VkVHlwZXMgPSBbdHlwZXNdLmZsYXQoKS5tYXAoKHQpID0+IHtcbiAgICAgICAgICB0ID0gdHlwZW9mIHQgPT09IFwiZnVuY3Rpb25cIiAmJiAhdC5uYW1lID8gdCgpIDogdDtcbiAgICAgICAgICB0ID0gKHQgYXMgYW55KS5uYW1lID8gKHQgYXMgYW55KS5uYW1lIDogdDtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKHQpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGVycnMgPSBuZXdWYWx1ZXMubWFwKChjaGlsZFZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICAvLyBmaW5kIGJ5IGlkIHNvIHRoZSBsaXN0IGVsZW1lbnRzIG9yZGVyIGRvZXNuJ3QgbWF0dGVyXG4gICAgICAgICAgY29uc3QgaWQgPSBmaW5kTW9kZWxJZChjaGlsZFZhbHVlIGFzIGFueSwgdHJ1ZSk7XG4gICAgICAgICAgaWYgKCFpZCkgcmV0dXJuIFwiRmFpbGVkIHRvIGZpbmQgbW9kZWwgaWRcIjtcblxuICAgICAgICAgIGNvbnN0IG9sZE1vZGVsID0gb2xkVmFsdWVzLmZpbmQoXG4gICAgICAgICAgICAoZWw6IGFueSkgPT4gaWQgPT09IGZpbmRNb2RlbElkKGVsLCB0cnVlKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoTW9kZWwuaXNNb2RlbChjaGlsZFZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNoaWxkVmFsdWUuaGFzRXJyb3JzKG9sZE1vZGVsKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gYWxsb3dlZFR5cGVzLmluY2x1ZGVzKHR5cGVvZiBjaGlsZFZhbHVlKVxuICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgIDogXCJWYWx1ZSBoYXMgbm8gdmFsaWRhdGFibGUgdHlwZVwiO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgICB2YWxpZGF0aW9uRXJyb3JzID0gUHJvbWlzZS5hbGwoZXJycykudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhbGxFbXB0eSA9IHJlc3VsdC5ldmVyeSgocikgPT4gIXIpO1xuICAgICAgICAgICAgcmV0dXJuIGFsbEVtcHR5ID8gdW5kZWZpbmVkIDogcmVzdWx0O1xuICAgICAgICAgIH0pIGFzIGFueTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBhbGxFbXB0eSA9IGVycnMuZXZlcnkoKHI6IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4gIXIpO1xuICAgICAgICAgIHZhbGlkYXRpb25FcnJvcnMgPSBlcnJzLmxlbmd0aCA+IDAgJiYgIWFsbEVtcHR5ID8gZXJycyA6IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2YWxpZGF0aW9uRXJyb3JzKSAocmVzdWx0IGFzIGFueSlbZGVjb3JhdG9yLmtleV0gPSB2YWxpZGF0aW9uRXJyb3JzO1xuICB9XG5cbiAgaWYgKCFhc3luYylcbiAgICByZXR1cm4gT2JqZWN0LmtleXMocmVzdWx0KS5sZW5ndGggPiAwID8gKHJlc3VsdCBhcyBhbnkpIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhyZXN1bHQpO1xuICBjb25zdCBwcm9taXNlcyA9IE9iamVjdC52YWx1ZXMocmVzdWx0KSBhcyBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD5bXTtcbiAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKChyZXNvbHZlZFZhbHVlcykgPT4ge1xuICAgIGNvbnN0IHJlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzb2x2ZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHZhbCA9IHJlc29sdmVkVmFsdWVzW2ldO1xuICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlc1trZXlzW2ldXSA9IHZhbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHJlcykubGVuZ3RoID4gMCA/IHJlcyA6IHVuZGVmaW5lZDtcbiAgfSkgYXMgYW55O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0ZXMgY2hhbmdlcyBiZXR3ZWVuIHR3byBtb2RlbCB2ZXJzaW9uc1xuICogQHN1bW1hcnkgQ29tcGFyZXMgYW4gb2xkIGFuZCBuZXcgbW9kZWwgdmVyc2lvbiB0byB2YWxpZGF0ZSB1cGRhdGUgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIE0gLSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHBhcmFtIHtNfSBvbGRNb2RlbCAtIFRoZSBvcmlnaW5hbCBtb2RlbCB2ZXJzaW9uXG4gKiBAcGFyYW0ge019IG5ld01vZGVsIC0gVGhlIHVwZGF0ZWQgbW9kZWwgdmVyc2lvblxuICogQHBhcmFtIHtib29sZWFufSBhc3luYyAtIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdmFsaWRhdGlvbiBzaG91bGQgYmUgYXN5bmNocm9ub3VzLlxuICogQHBhcmFtIHsuLi5zdHJpbmdbXX0gZXhjZXB0aW9ucyAtIFByb3BlcnRpZXMgdG8gZXhjbHVkZSBmcm9tIHZhbGlkYXRpb25cbiAqIEByZXR1cm4ge01vZGVsRXJyb3JEZWZpbml0aW9ufHVuZGVmaW5lZH0gRXJyb3IgZGVmaW5pdGlvbiBpZiB2YWxpZGF0aW9uIGZhaWxzLCB1bmRlZmluZWQgb3RoZXJ3aXNlXG4gKiBAZnVuY3Rpb24gdmFsaWRhdGVDb21wYXJlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IHZhbGlkYXRlQ29tcGFyZVxuICogICBwYXJ0aWNpcGFudCBSZWZsZWN0aW9uXG4gKiAgIHBhcnRpY2lwYW50IFZhbGlkYXRpb25cbiAqXG4gKiAgIENhbGxlci0+PnZhbGlkYXRlQ29tcGFyZTogb2xkTW9kZWwsIG5ld01vZGVsLCBleGNlcHRpb25zXG4gKiAgIHZhbGlkYXRlQ29tcGFyZS0+PlJlZmxlY3Rpb246IGdldCBkZWNvcmF0ZWQgcHJvcGVydGllc1xuICogICBSZWZsZWN0aW9uLS0+PnZhbGlkYXRlQ29tcGFyZTogcHJvcGVydHkgZGVjb3JhdG9yc1xuICogICBsb29wIEZvciBlYWNoIGRlY29yYXRlZCBwcm9wZXJ0eVxuICogICAgIHZhbGlkYXRlQ29tcGFyZS0+PlZhbGlkYXRpb246IGdldCB2YWxpZGF0b3JcbiAqICAgICBWYWxpZGF0aW9uLS0+PnZhbGlkYXRlQ29tcGFyZTogdmFsaWRhdG9yXG4gKiAgICAgdmFsaWRhdGVDb21wYXJlLT4+dmFsaWRhdGVDb21wYXJlOiB2YWxpZGF0ZSBwcm9wZXJ0eSB1cGRhdGVcbiAqICAgZW5kXG4gKiAgIGxvb3AgRm9yIG5lc3RlZCBtb2RlbHNcbiAqICAgICB2YWxpZGF0ZUNvbXBhcmUtPj52YWxpZGF0ZUNvbXBhcmU6IHZhbGlkYXRlIG5lc3RlZCBtb2RlbHNcbiAqICAgZW5kXG4gKiAgIHZhbGlkYXRlQ29tcGFyZS0tPj5DYWxsZXI6IHZhbGlkYXRpb24gZXJyb3JzIG9yIHVuZGVmaW5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVDb21wYXJlPE0gZXh0ZW5kcyBNb2RlbDxhbnk+PihcbiAgb2xkTW9kZWw6IE0sXG4gIG5ld01vZGVsOiBNLFxuICBhc3luYzogYm9vbGVhbixcbiAgLi4uZXhjZXB0aW9uczogc3RyaW5nW11cbik6IE1vZGVsQ29uZGl0aW9uYWxBc3luYzxNPiB7XG4gIGNvbnN0IGRlY29yYXRlZFByb3BlcnRpZXM6IFZhbGlkYXRpb25Qcm9wZXJ0eURlY29yYXRvckRlZmluaXRpb25bXSA9XG4gICAgZ2V0VmFsaWRhdGFibGVVcGRhdGVQcm9wcyhuZXdNb2RlbCwgZXhjZXB0aW9ucyk7XG5cbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cbiAgY29uc3QgbmVzdGVkRXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIGZvciAoY29uc3QgeyBwcm9wLCBkZWNvcmF0b3JzIH0gb2YgZGVjb3JhdGVkUHJvcGVydGllcykge1xuICAgIGNvbnN0IHByb3BLZXkgPSBTdHJpbmcocHJvcCk7XG4gICAgbGV0IHByb3BWYWx1ZSA9IChuZXdNb2RlbCBhcyBhbnkpW3Byb3BdO1xuXG4gICAgaWYgKCFkZWNvcmF0b3JzPy5sZW5ndGgpIGNvbnRpbnVlO1xuXG4gICAgLy8gR2V0IHRoZSBkZWZhdWx0IHR5cGUgdmFsaWRhdG9yXG4gICAgY29uc3QgZGVzaWduVHlwZURlYyA9IGRlY29yYXRvcnMuZmluZCgoZCkgPT5cbiAgICAgIFtNb2RlbEtleXMuVFlQRSwgVmFsaWRhdGlvbktleXMuVFlQRV0uaW5jbHVkZXMoZC5rZXkgYXMgYW55KVxuICAgICk7XG4gICAgaWYgKCFkZXNpZ25UeXBlRGVjKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGRlc2lnblR5cGUgPSBkZXNpZ25UeXBlRGVjLnByb3BzLm5hbWU7XG5cbiAgICAvLyBIYW5kbGUgYXJyYXkgb3IgU2V0IHR5cGVzIGFuZCBlbmZvcmNlIHRoZSBwcmVzZW5jZSBvZiBAbGlzdCBkZWNvcmF0b3JcbiAgICBpZiAoW0FycmF5Lm5hbWUsIFNldC5uYW1lXS5pbmNsdWRlcyhkZXNpZ25UeXBlKSkge1xuICAgICAgY29uc3QgeyBkZWNvcmF0b3JzIH0gPSBSZWZsZWN0aW9uLmdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgVmFsaWRhdGlvbktleXMuUkVGTEVDVCxcbiAgICAgICAgbmV3TW9kZWwsXG4gICAgICAgIHByb3BLZXlcbiAgICAgICkgYXMgdW5rbm93biBhcyBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uO1xuXG4gICAgICBpZiAoIWRlY29yYXRvcnMuc29tZSgoZCkgPT4gZC5rZXkgPT09IFZhbGlkYXRpb25LZXlzLkxJU1QpKSB7XG4gICAgICAgIHJlc3VsdFtwcm9wS2V5XSA9IHtcbiAgICAgICAgICBbVmFsaWRhdGlvbktleXMuVFlQRV06IGBBcnJheSBvciBTZXQgcHJvcGVydHkgJyR7cHJvcEtleX0nIHJlcXVpcmVzIGEgQGxpc3QgZGVjb3JhdG9yYCxcbiAgICAgICAgfTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgcHJvcFZhbHVlICYmXG4gICAgICAgICEoQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpIHx8IHByb3BWYWx1ZSBpbnN0YW5jZW9mIFNldClcbiAgICAgICkge1xuICAgICAgICByZXN1bHRbcHJvcEtleV0gPSB7XG4gICAgICAgICAgW1ZhbGlkYXRpb25LZXlzLlRZUEVdOiBgUHJvcGVydHkgJyR7U3RyaW5nKHByb3ApfScgbXVzdCBiZSBlaXRoZXIgYW4gYXJyYXkgb3IgYSBTZXRgLFxuICAgICAgICB9O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVtb3ZlIGRlc2lnbjp0eXBlIGRlY29yYXRvciwgc2luY2UgQGxpc3QgZGVjb3JhdG9yIGFscmVhZHkgZW5zdXJlcyB0eXBlXG4gICAgICBmb3IgKGxldCBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBpZiAoZGVjb3JhdG9yc1tpXS5rZXkgPT09IE1vZGVsS2V5cy5UWVBFKSB7XG4gICAgICAgICAgZGVjb3JhdG9ycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHByb3BWYWx1ZSA9IHByb3BWYWx1ZSBpbnN0YW5jZW9mIFNldCA/IFsuLi5wcm9wVmFsdWVdIDogcHJvcFZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IHByb3BFcnJvcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPVxuICAgICAgdmFsaWRhdGVEZWNvcmF0b3JzKG5ld01vZGVsLCBvbGRNb2RlbCwgcHJvcEtleSwgZGVjb3JhdG9ycywgYXN5bmMpIHx8IHt9O1xuXG4gICAgLy8gQ2hlY2sgZm9yIG5lc3RlZCBwcm9wZXJ0aWVzLlxuICAgIC8vIFRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcHJvY2Vzc2luZywgXCJwcm9wVmFsdWVcIiBtdXN0IGJlIGRlZmluZWQgYW5kIHZhbGlkYXRhYmxlXG4gICAgY29uc3QgaXNDb25zdHIgPSBNb2RlbC5pc1Byb3BlcnR5TW9kZWwobmV3TW9kZWwsIHByb3BLZXkpO1xuICAgIC8vIGlmIHByb3BWYWx1ZSAhPT0gdW5kZWZpbmVkLCBudWxsXG4gICAgaWYgKHByb3BWYWx1ZSAmJiBpc0NvbnN0cikge1xuICAgICAgY29uc3QgaW5zdGFuY2U6IE1vZGVsID0gcHJvcFZhbHVlO1xuICAgICAgY29uc3QgaXNJbnZhbGlkTW9kZWwgPVxuICAgICAgICB0eXBlb2YgaW5zdGFuY2UgIT09IFwib2JqZWN0XCIgfHxcbiAgICAgICAgIWluc3RhbmNlLmhhc0Vycm9ycyB8fFxuICAgICAgICB0eXBlb2YgaW5zdGFuY2UuaGFzRXJyb3JzICE9PSBcImZ1bmN0aW9uXCI7XG5cbiAgICAgIGlmIChpc0ludmFsaWRNb2RlbCkge1xuICAgICAgICAvLyBwcm9wRXJyb3JzW1ZhbGlkYXRpb25LZXlzLlRZUEVdID1cbiAgICAgICAgLy8gICBcIk1vZGVsIHNob3VsZCBiZSB2YWxpZGF0YWJsZSBidXQgaXQncyBub3QuXCI7XG4gICAgICAgIGNvbnNvbGUud2FybihcIk1vZGVsIHNob3VsZCBiZSB2YWxpZGF0YWJsZSBidXQgaXQncyBub3QuXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmVzdGVkRXJyb3JzW3Byb3BLZXldID0gaW5zdGFuY2UuaGFzRXJyb3JzKChvbGRNb2RlbCBhcyBhbnkpW3Byb3BdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgdG8gdGhlIHJlc3VsdCBpZiB3ZSBoYXZlIGFueSBlcnJvcnNcbiAgICAvLyBBc3luYyBtb2RlIHJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdW5kZWZpbmVkIHdoZW4gbm8gZXJyb3JzIGV4aXN0XG4gICAgaWYgKE9iamVjdC5rZXlzKHByb3BFcnJvcnMpLmxlbmd0aCA+IDAgfHwgYXN5bmMpXG4gICAgICByZXN1bHRbcHJvcEtleV0gPSBwcm9wRXJyb3JzO1xuXG4gICAgLy8gVGhlbiBtZXJnZSBhbnkgbmVzdGVkIGVycm9yc1xuICAgIGlmICghYXN5bmMpIHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKG5lc3RlZEVycm9yc1twcm9wS2V5XSB8fCB7fSkuZm9yRWFjaCgoW2tleSwgZXJyb3JdKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVzdWx0W2Ake3Byb3BLZXl9LiR7a2V5fWBdID0gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFN5bmNocm9ub3VzIHJldHVyblxuICBpZiAoIWFzeW5jKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIE9iamVjdC5rZXlzKHJlc3VsdCkubGVuZ3RoID4gMFxuICAgICAgICA/IG5ldyBNb2RlbEVycm9yRGVmaW5pdGlvbihyZXN1bHQpXG4gICAgICAgIDogdW5kZWZpbmVkXG4gICAgKSBhcyBhbnk7XG4gIH1cblxuICBjb25zdCBtZXJnZWQ6IGFueSA9IHJlc3VsdDsgLy8gVE9ETzogYXBwbHkgZmlsdGVyaW5nXG5cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG1lcmdlZCk7XG4gIGNvbnN0IHByb21pc2VzID0gT2JqZWN0LnZhbHVlcyhtZXJnZWQpO1xuICByZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKHByb21pc2VzKS50aGVuKGFzeW5jIChyZXN1bHRzKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0OiBNb2RlbEVycm9ycyA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBbcGFyZW50UHJvcCwgbmVzdGVkRXJyUHJvbWlzZV0gb2YgT2JqZWN0LmVudHJpZXMobmVzdGVkRXJyb3JzKSkge1xuICAgICAgY29uc3QgbmVzdGVkUHJvcERlY0Vycm9ycyA9IChhd2FpdCBuZXN0ZWRFcnJQcm9taXNlKSBhcyBSZWNvcmQ8XG4gICAgICAgIHN0cmluZyxcbiAgICAgICAgYW55XG4gICAgICA+O1xuXG4gICAgICBpZiAobmVzdGVkUHJvcERlY0Vycm9ycylcbiAgICAgICAgT2JqZWN0LmVudHJpZXMobmVzdGVkUHJvcERlY0Vycm9ycykuZm9yRWFjaChcbiAgICAgICAgICAoW25lc3RlZFByb3AsIG5lc3RlZFByb3BEZWNFcnJvcl0pID0+IHtcbiAgICAgICAgICAgIGlmIChuZXN0ZWRQcm9wRGVjRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRLZXkgPSBbcGFyZW50UHJvcCwgbmVzdGVkUHJvcF0uam9pbihcIi5cIik7XG4gICAgICAgICAgICAgIHJlc3VsdFtuZXN0ZWRLZXldID0gbmVzdGVkUHJvcERlY0Vycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICBjb25zdCByZXMgPSByZXN1bHRzW2ldO1xuXG4gICAgICBpZiAocmVzLnN0YXR1cyA9PT0gXCJmdWxmaWxsZWRcIiAmJiByZXMudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAocmVzdWx0IGFzIGFueSlba2V5XSA9IHJlcy52YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAocmVzLnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKSB7XG4gICAgICAgIChyZXN1bHQgYXMgYW55KVtrZXldID1cbiAgICAgICAgICByZXMucmVhc29uIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgID8gcmVzLnJlYXNvbi5tZXNzYWdlXG4gICAgICAgICAgICA6IFN0cmluZyhyZXMucmVhc29uIHx8IFwiVmFsaWRhdGlvbiBmYWlsZWRcIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHJlc3VsdCkubGVuZ3RoID4gMFxuICAgICAgPyBuZXcgTW9kZWxFcnJvckRlZmluaXRpb24ocmVzdWx0KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH0pIGFzIGFueTtcbn1cbiIsImltcG9ydCB7IERCS2V5cywgRGVmYXVsdFNlcGFyYXRvciB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgYXBwbHkgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7XG4gIERlY29yYXRpb24sXG4gIEhhc2hpbmcsXG4gIE1vZGVsLFxuICBwcm9wTWV0YWRhdGEsXG4gIHR5cGUsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IG9uQ3JlYXRlLCBvbkNyZWF0ZVVwZGF0ZSwgb25VcGRhdGUgfSBmcm9tIFwiLi4vb3BlcmF0aW9ucy9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBJUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL0lSZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvZXJyb3JzXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L0NvbnRleHRcIjtcbmltcG9ydCB7IENydWRPcGVyYXRpb25zLCBHcm91cFNvcnQsIE9wZXJhdGlvbktleXMgfSBmcm9tIFwiLi4vb3BlcmF0aW9uc1wiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeUZsYWdzIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFzaGVzIGEgcHJvcGVydHkgdmFsdWUgZHVyaW5nIGNyZWF0ZSBvciB1cGRhdGUgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgQ2FsbGJhY2sgZnVuY3Rpb24gdXNlZCBieSB0aGUgaGFzaCBkZWNvcmF0b3IgdG8gYXBwbHkgaGFzaGluZyB0byBhIHByb3BlcnR5IHZhbHVlXG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFR5cGUgZXh0ZW5kaW5nIElSZXBvc2l0b3J5XG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFR5cGUgZXh0ZW5kaW5nIFJlcG9zaXRvcnlGbGFnc1xuICogQHRlbXBsYXRlIEMgLSBUeXBlIGV4dGVuZGluZyBDb250ZXh0XG4gKiBAcGFyYW0ge0N9IGNvbnRleHQgLSBUaGUgb3BlcmF0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIE1ldGFkYXRhIGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byBoYXNoXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHtNfSBbb2xkTW9kZWxdIC0gVGhlIHByZXZpb3VzIG1vZGVsIHN0YXRlIChmb3IgdXBkYXRlcylcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAZnVuY3Rpb24gaGFzaE9uQ3JlYXRlVXBkYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2hPbkNyZWF0ZVVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgSVJlcG9zaXRvcnk8TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBvYmplY3QsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbj4odGhpczogUiwgY29udGV4dDogQywgZGF0YTogViwga2V5OiBrZXlvZiBNLCBtb2RlbDogTSwgb2xkTW9kZWw/OiBNKTogdm9pZCB7XG4gIGlmICh0eXBlb2YgbW9kZWxba2V5XSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xuICBjb25zdCBoYXNoID0gSGFzaGluZy5oYXNoKChtb2RlbCBhcyBhbnkpW2tleV0pO1xuICBpZiAob2xkTW9kZWwgJiYgKG1vZGVsIGFzIGFueSlba2V5XSA9PT0gaGFzaCkgcmV0dXJuO1xuICBtb2RlbFtrZXldID0gaGFzaDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGRlY29yYXRvciB0aGF0IGhhc2hlcyBhIHByb3BlcnR5IHZhbHVlXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBhdXRvbWF0aWNhbGx5IGhhc2hlcyBhIHByb3BlcnR5IHZhbHVlIGR1cmluZyBjcmVhdGUgYW5kIHVwZGF0ZSBvcGVyYXRpb25zXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gaGFzaFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2goKSB7XG4gIHJldHVybiBhcHBseShcbiAgICBvbkNyZWF0ZVVwZGF0ZShoYXNoT25DcmVhdGVVcGRhdGUpLFxuICAgIHByb3BNZXRhZGF0YShSZXBvc2l0b3J5LmtleShEQktleXMuSEFTSCksIHt9KVxuICApO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNZXRhZGF0YSBmb3IgY29tcG9zZWQgcHJvcGVydHkgZGVjb3JhdG9yc1xuICogQHN1bW1hcnkgQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBwcm9wZXJ0eSBjb21wb3NpdGlvbiBmcm9tIG90aGVyIHByb3BlcnRpZXNcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENvbXBvc2VkRnJvbU1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBhcmdzIC0gUHJvcGVydHkgbmFtZXMgdG8gY29tcG9zZSBmcm9tXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2VwYXJhdG9yIC0gQ2hhcmFjdGVyIHVzZWQgdG8gam9pbiB0aGUgY29tcG9zZWQgdmFsdWVzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGhhc2hSZXN1bHQgLSBXaGV0aGVyIHRvIGhhc2ggdGhlIGNvbXBvc2VkIHJlc3VsdFxuICogQHByb3BlcnR5IHtcImtleXNcInxcInZhbHVlc1wifSB0eXBlIC0gV2hldGhlciB0byB1c2UgcHJvcGVydHkga2V5cyBvciB2YWx1ZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcHJlZml4XSAtIE9wdGlvbmFsIHByZWZpeCB0byBhZGQgdG8gdGhlIGNvbXBvc2VkIHZhbHVlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N1ZmZpeF0gLSBPcHRpb25hbCBzdWZmaXggdG8gYWRkIHRvIHRoZSBjb21wb3NlZCB2YWx1ZVxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCB0eXBlIENvbXBvc2VkRnJvbU1ldGFkYXRhID0ge1xuICBhcmdzOiBzdHJpbmdbXTtcbiAgc2VwYXJhdG9yOiBzdHJpbmc7XG4gIGhhc2hSZXN1bHQ6IGJvb2xlYW47XG4gIHR5cGU6IFwia2V5c1wiIHwgXCJ2YWx1ZXNcIjtcbiAgcHJlZml4Pzogc3RyaW5nO1xuICBzdWZmaXg/OiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb21wb3NlcyBhIHByb3BlcnR5IHZhbHVlIGZyb20gb3RoZXIgcHJvcGVydGllcyBkdXJpbmcgY3JlYXRlIG9yIHVwZGF0ZSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBDYWxsYmFjayBmdW5jdGlvbiB1c2VkIGJ5IGNvbXBvc2VkIGRlY29yYXRvcnMgdG8gZ2VuZXJhdGUgYSBwcm9wZXJ0eSB2YWx1ZSBmcm9tIG90aGVyIHByb3BlcnRpZXNcbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVHlwZSBleHRlbmRpbmcgSVJlcG9zaXRvcnlcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBleHRlbmRpbmcgQ29tcG9zZWRGcm9tTWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVHlwZSBleHRlbmRpbmcgUmVwb3NpdG9yeUZsYWdzXG4gKiBAdGVtcGxhdGUgQyAtIFR5cGUgZXh0ZW5kaW5nIENvbnRleHRcbiAqIEBwYXJhbSB7Q30gY29udGV4dCAtIFRoZSBvcGVyYXRpb24gY29udGV4dFxuICogQHBhcmFtIHtWfSBkYXRhIC0gTWV0YWRhdGEgZm9yIHRoZSBjb21wb3NpdGlvblxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gc2V0IHRoZSBjb21wb3NlZCB2YWx1ZSBvblxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBiZWluZyBwcm9jZXNzZWRcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAZnVuY3Rpb24gY29tcG9zZWRGcm9tQ3JlYXRlVXBkYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2VkRnJvbUNyZWF0ZVVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgSVJlcG9zaXRvcnk8TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBDb21wb3NlZEZyb21NZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBDb250ZXh0PEY+LFxuPih0aGlzOiBSLCBjb250ZXh0OiBDLCBkYXRhOiBWLCBrZXk6IGtleW9mIE0sIG1vZGVsOiBNKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgeyBhcmdzLCB0eXBlLCBwcmVmaXgsIHN1ZmZpeCwgc2VwYXJhdG9yIH0gPSBkYXRhO1xuICAgIGNvbnN0IGNvbXBvc2VkID0gYXJncy5tYXAoKGFyZzogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoIShhcmcgaW4gbW9kZWwpKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgUHJvcGVydHkgJHthcmd9IG5vdCBmb3VuZCB0byBjb21wb3NlIGZyb21gKTtcbiAgICAgIGlmICh0eXBlID09PSBcImtleXNcIikgcmV0dXJuIGFyZztcbiAgICAgIGlmICh0eXBlb2YgKG1vZGVsIGFzIGFueSlbYXJnXSA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYFByb3BlcnR5ICR7YXJnc30gZG9lcyBub3QgY29udGFpbiBhIHZhbHVlIHRvIGNvbXBvc2UgZnJvbWBcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiAoKG1vZGVsIGFzIGFueSlbYXJnXSBhcyBhbnkpLnRvU3RyaW5nKCk7XG4gICAgfSk7XG5cbiAgICBpZiAocHJlZml4KSBjb21wb3NlZC51bnNoaWZ0KHByZWZpeCk7XG4gICAgaWYgKHN1ZmZpeCkgY29tcG9zZWQucHVzaChzdWZmaXgpO1xuXG4gICAgKG1vZGVsIGFzIGFueSlba2V5XSA9IGNvbXBvc2VkLmpvaW4oc2VwYXJhdG9yKTtcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byBjb21wb3NlIHZhbHVlOiAke2V9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGRlY29yYXRvciB0aGF0IGNvbXBvc2VzIGEgcHJvcGVydHkgdmFsdWUgZnJvbSBvdGhlciBwcm9wZXJ0aWVzXG4gKiBAc3VtbWFyeSBCYXNlIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBwcm9wZXJ0eSBjb21wb3NpdGlvbiBkZWNvcmF0b3JzXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzIC0gUHJvcGVydHkgbmFtZXMgdG8gY29tcG9zZSBmcm9tXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtoYXNoUmVzdWx0PWZhbHNlXSAtIFdoZXRoZXIgdG8gaGFzaCB0aGUgY29tcG9zZWQgcmVzdWx0XG4gKiBAcGFyYW0ge3N0cmluZ30gW3NlcGFyYXRvcj1EZWZhdWx0U2VwYXJhdG9yXSAtIENoYXJhY3RlciB1c2VkIHRvIGpvaW4gdGhlIGNvbXBvc2VkIHZhbHVlc1xuICogQHBhcmFtIHtcImtleXNcInxcInZhbHVlc1wifSBbdHlwZT1cInZhbHVlc1wiXSAtIFdoZXRoZXIgdG8gdXNlIHByb3BlcnR5IGtleXMgb3IgdmFsdWVzXG4gKiBAcGFyYW0ge3N0cmluZ30gW3ByZWZpeD1cIlwiXSAtIE9wdGlvbmFsIHByZWZpeCB0byBhZGQgdG8gdGhlIGNvbXBvc2VkIHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N1ZmZpeD1cIlwiXSAtIE9wdGlvbmFsIHN1ZmZpeCB0byBhZGQgdG8gdGhlIGNvbXBvc2VkIHZhbHVlXG4gKiBAcGFyYW0ge0dyb3VwU29ydH0gZ3JvdXBzb3J0IC0gR3JvdXBTb3J0IGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBjb21wb3NlZEZyb21cbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eURlY29yYXRvcnNcbiAqL1xuZnVuY3Rpb24gY29tcG9zZWRGcm9tKFxuICBhcmdzOiBzdHJpbmdbXSxcbiAgaGFzaFJlc3VsdDogYm9vbGVhbiA9IGZhbHNlLFxuICBzZXBhcmF0b3I6IHN0cmluZyA9IERlZmF1bHRTZXBhcmF0b3IsXG4gIHR5cGU6IFwia2V5c1wiIHwgXCJ2YWx1ZXNcIiA9IFwidmFsdWVzXCIsXG4gIHByZWZpeCA9IFwiXCIsXG4gIHN1ZmZpeCA9IFwiXCIsXG4gIGdyb3Vwc29ydDogR3JvdXBTb3J0ID0geyBwcmlvcml0eTogNTUgfVxuKSB7XG4gIGNvbnN0IGRhdGE6IENvbXBvc2VkRnJvbU1ldGFkYXRhID0ge1xuICAgIGFyZ3M6IGFyZ3MsXG4gICAgaGFzaFJlc3VsdDogaGFzaFJlc3VsdCxcbiAgICBzZXBhcmF0b3I6IHNlcGFyYXRvcixcbiAgICB0eXBlOiB0eXBlLFxuICAgIHByZWZpeDogcHJlZml4LFxuICAgIHN1ZmZpeDogc3VmZml4LFxuICB9O1xuXG4gIGNvbnN0IGRlY29yYXRvcnMgPSBbXG4gICAgb25DcmVhdGVVcGRhdGUoY29tcG9zZWRGcm9tQ3JlYXRlVXBkYXRlLCBkYXRhLCBncm91cHNvcnQpLFxuICAgIHByb3BNZXRhZGF0YShSZXBvc2l0b3J5LmtleShEQktleXMuQ09NUE9TRUQpLCBkYXRhKSxcbiAgXTtcbiAgaWYgKGhhc2hSZXN1bHQpIGRlY29yYXRvcnMucHVzaChoYXNoKCkpO1xuICByZXR1cm4gYXBwbHkoLi4uZGVjb3JhdG9ycyk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBkZWNvcmF0b3IgdGhhdCBjb21wb3NlcyBhIHByb3BlcnR5IHZhbHVlIGZyb20gcHJvcGVydHkga2V5c1xuICogQHN1bW1hcnkgRGVjb3JhdG9yIHRoYXQgZ2VuZXJhdGVzIGEgcHJvcGVydHkgdmFsdWUgYnkgam9pbmluZyB0aGUgbmFtZXMgb2Ygb3RoZXIgcHJvcGVydGllc1xuICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncyAtIFByb3BlcnR5IG5hbWVzIHRvIGNvbXBvc2UgZnJvbVxuICogQHBhcmFtIHtzdHJpbmd9IFtzZXBhcmF0b3I9RGVmYXVsdFNlcGFyYXRvcl0gLSBDaGFyYWN0ZXIgdXNlZCB0byBqb2luIHRoZSBwcm9wZXJ0eSBuYW1lc1xuICogQHBhcmFtIHtib29sZWFufSBbaGFzaD1mYWxzZV0gLSBXaGV0aGVyIHRvIGhhc2ggdGhlIGNvbXBvc2VkIHJlc3VsdFxuICogQHBhcmFtIHtzdHJpbmd9IFtwcmVmaXg9XCJcIl0gLSBPcHRpb25hbCBwcmVmaXggdG8gYWRkIHRvIHRoZSBjb21wb3NlZCB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IFtzdWZmaXg9XCJcIl0gLSBPcHRpb25hbCBzdWZmaXggdG8gYWRkIHRvIHRoZSBjb21wb3NlZCB2YWx1ZVxuICogQHBhcmFtIHtHcm91cFNvcnR9IGdyb3Vwc29ydCAtIEdyb3VwU29ydCBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gY29tcG9zZWRGcm9tS2V5c1xuICogQGNhdGVnb3J5IFByb3BlcnR5RGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZWRGcm9tS2V5cyhcbiAgYXJnczogc3RyaW5nW10sXG4gIHNlcGFyYXRvcjogc3RyaW5nID0gRGVmYXVsdFNlcGFyYXRvcixcbiAgaGFzaDogYm9vbGVhbiA9IGZhbHNlLFxuICBwcmVmaXggPSBcIlwiLFxuICBzdWZmaXggPSBcIlwiLFxuICBncm91cHNvcnQ6IEdyb3VwU29ydCA9IHsgcHJpb3JpdHk6IDU1IH1cbikge1xuICByZXR1cm4gY29tcG9zZWRGcm9tKGFyZ3MsIGhhc2gsIHNlcGFyYXRvciwgXCJrZXlzXCIsIHByZWZpeCwgc3VmZml4LCBncm91cHNvcnQpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgZGVjb3JhdG9yIHRoYXQgY29tcG9zZXMgYSBwcm9wZXJ0eSB2YWx1ZSBmcm9tIHByb3BlcnR5IHZhbHVlc1xuICogQHN1bW1hcnkgRGVjb3JhdG9yIHRoYXQgZ2VuZXJhdGVzIGEgcHJvcGVydHkgdmFsdWUgYnkgam9pbmluZyB0aGUgdmFsdWVzIG9mIG90aGVyIHByb3BlcnRpZXNcbiAqIEBwYXJhbSB7c3RyaW5nW119IGFyZ3MgLSBQcm9wZXJ0eSBuYW1lcyB3aG9zZSB2YWx1ZXMgd2lsbCBiZSBjb21wb3NlZFxuICogQHBhcmFtIHtzdHJpbmd9IFtzZXBhcmF0b3I9RGVmYXVsdFNlcGFyYXRvcl0gLSBDaGFyYWN0ZXIgdXNlZCB0byBqb2luIHRoZSBwcm9wZXJ0eSB2YWx1ZXNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2hhc2g9ZmFsc2VdIC0gV2hldGhlciB0byBoYXNoIHRoZSBjb21wb3NlZCByZXN1bHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJlZml4PVwiXCJdIC0gT3B0aW9uYWwgcHJlZml4IHRvIGFkZCB0byB0aGUgY29tcG9zZWQgdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc3VmZml4PVwiXCJdIC0gT3B0aW9uYWwgc3VmZml4IHRvIGFkZCB0byB0aGUgY29tcG9zZWQgdmFsdWVcbiAqIEBwYXJhbSB7R3JvdXBTb3J0fSBncm91cHNvcnQgLSBHcm91cFNvcnQgY29uZmlndXJhdGlvblxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIGNvbXBvc2VkXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHlEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb3NlZChcbiAgYXJnczogc3RyaW5nW10sXG4gIHNlcGFyYXRvcjogc3RyaW5nID0gRGVmYXVsdFNlcGFyYXRvcixcbiAgaGFzaDogYm9vbGVhbiA9IGZhbHNlLFxuICBwcmVmaXggPSBcIlwiLFxuICBzdWZmaXggPSBcIlwiLFxuICBncm91cHNvcnQ6IEdyb3VwU29ydCA9IHsgcHJpb3JpdHk6IDU1IH1cbikge1xuICByZXR1cm4gY29tcG9zZWRGcm9tKFxuICAgIGFyZ3MsXG4gICAgaGFzaCxcbiAgICBzZXBhcmF0b3IsXG4gICAgXCJ2YWx1ZXNcIixcbiAgICBwcmVmaXgsXG4gICAgc3VmZml4LFxuICAgIGdyb3Vwc29ydFxuICApO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB1cGRhdGVzIGEgdmVyc2lvbiBwcm9wZXJ0eSBkdXJpbmcgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgRmFjdG9yeSBmdW5jdGlvbiB0aGF0IGdlbmVyYXRlcyBhIGNhbGxiYWNrIGZvciBpbmNyZW1lbnRpbmcgdmVyc2lvbiBudW1iZXJzXG4gKiBAcGFyYW0ge0NydWRPcGVyYXRpb25zfSBvcGVyYXRpb24gLSBUaGUgdHlwZSBvZiBvcGVyYXRpb24gKENSRUFURSBvciBVUERBVEUpXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHVwZGF0ZXMgdGhlIHZlcnNpb24gcHJvcGVydHlcbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVHlwZSBleHRlbmRpbmcgSVJlcG9zaXRvcnlcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVHlwZSBleHRlbmRpbmcgUmVwb3NpdG9yeUZsYWdzXG4gKiBAdGVtcGxhdGUgQyAtIFR5cGUgZXh0ZW5kaW5nIENvbnRleHRcbiAqIEBmdW5jdGlvbiB2ZXJzaW9uQ3JlYXRlVXBkYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IHZlcnNpb25DcmVhdGVVcGRhdGVcbiAqXG4gKiAgIENhbGxlci0+PnZlcnNpb25DcmVhdGVVcGRhdGU6IG9wZXJhdGlvblxuICogICB2ZXJzaW9uQ3JlYXRlVXBkYXRlLS0+PkNhbGxlcjogY2FsbGJhY2sgZnVuY3Rpb25cbiAqICAgTm90ZSBvdmVyIENhbGxlcix2ZXJzaW9uQ3JlYXRlVXBkYXRlOiBXaGVuIGNhbGxiYWNrIGlzIGV4ZWN1dGVkOlxuICogICBDYWxsZXItPj52ZXJzaW9uQ3JlYXRlVXBkYXRlOiBjb250ZXh0LCBkYXRhLCBrZXksIG1vZGVsXG4gKiAgIGFsdCBvcGVyYXRpb24gaXMgQ1JFQVRFXG4gKiAgICAgdmVyc2lvbkNyZWF0ZVVwZGF0ZS0+PnZlcnNpb25DcmVhdGVVcGRhdGU6IHNldCB2ZXJzaW9uIHRvIDFcbiAqICAgZWxzZSBvcGVyYXRpb24gaXMgVVBEQVRFXG4gKiAgICAgdmVyc2lvbkNyZWF0ZVVwZGF0ZS0+PnZlcnNpb25DcmVhdGVVcGRhdGU6IGluY3JlbWVudCB2ZXJzaW9uXG4gKiAgIGVsc2UgaW52YWxpZCBvcGVyYXRpb25cbiAqICAgICB2ZXJzaW9uQ3JlYXRlVXBkYXRlLT4+dmVyc2lvbkNyZWF0ZVVwZGF0ZTogdGhyb3cgZXJyb3JcbiAqICAgZW5kXG4gKiAgIHZlcnNpb25DcmVhdGVVcGRhdGUtLT4+Q2FsbGVyOiB2b2lkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJzaW9uQ3JlYXRlVXBkYXRlKG9wZXJhdGlvbjogQ3J1ZE9wZXJhdGlvbnMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHZlcnNpb25DcmVhdGVVcGRhdGU8XG4gICAgTSBleHRlbmRzIE1vZGVsLFxuICAgIFIgZXh0ZW5kcyBJUmVwb3NpdG9yeTxNLCBGLCBDPixcbiAgICBWIGV4dGVuZHMgb2JqZWN0LFxuICAgIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gICAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBDb250ZXh0PEY+LFxuICA+KHRoaXM6IFIsIGNvbnRleHQ6IEMsIGRhdGE6IFYsIGtleToga2V5b2YgTSwgbW9kZWw6IE0pIHtcbiAgICB0cnkge1xuICAgICAgc3dpdGNoIChvcGVyYXRpb24pIHtcbiAgICAgICAgY2FzZSBPcGVyYXRpb25LZXlzLkNSRUFURTpcbiAgICAgICAgICAobW9kZWwgYXMgYW55KVtrZXldID0gMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBPcGVyYXRpb25LZXlzLlVQREFURTpcbiAgICAgICAgICAobW9kZWwgYXMgYW55KVtrZXldKys7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEludmFsaWQgb3BlcmF0aW9uOiAke29wZXJhdGlvbn1gKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgRmFpbGVkIHRvIHVwZGF0ZSB2ZXJzaW9uOiAke2V9YCk7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgZGVjb3JhdG9yIGZvciB2ZXJzaW9uaW5nIGEgcHJvcGVydHkgaW4gYSBtb2RlbFxuICogQHN1bW1hcnkgVGhpcyBkZWNvcmF0b3IgYXBwbGllcyBtdWx0aXBsZSBzdWItZGVjb3JhdG9ycyB0byBoYW5kbGUgdmVyc2lvbiBtYW5hZ2VtZW50IGR1cmluZyBjcmVhdGUgYW5kIHVwZGF0ZSBvcGVyYXRpb25zXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBjb21wb3NpdGUgZGVjb3JhdG9yIHRoYXQgc2V0cyB0aGUgdHlwZSB0byBOdW1iZXIsIG1hbmFnZXMgdmVyc2lvbiB1cGRhdGVzLCBhbmQgYWRkcyB2ZXJzaW9uaW5nIG1ldGFkYXRhXG4gKiBAZnVuY3Rpb24gdmVyc2lvblxuICogQGNhdGVnb3J5IFByb3BlcnR5RGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyc2lvbigpIHtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoREJLZXlzLlZFUlNJT04pO1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoXG4gICAgICB0eXBlKE51bWJlci5uYW1lKSxcbiAgICAgIG9uQ3JlYXRlKHZlcnNpb25DcmVhdGVVcGRhdGUoT3BlcmF0aW9uS2V5cy5DUkVBVEUpKSxcbiAgICAgIG9uVXBkYXRlKHZlcnNpb25DcmVhdGVVcGRhdGUoT3BlcmF0aW9uS2V5cy5VUERBVEUpKSxcbiAgICAgIHByb3BNZXRhZGF0YShrZXksIHRydWUpXG4gICAgKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgZGVjb3JhdG9yIHRoYXQgbWFya3MgYSBwcm9wZXJ0eSBhcyB0cmFuc2llbnRcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IGluZGljYXRlcyBhIHByb3BlcnR5IHNob3VsZCBub3QgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZVxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIHRyYW5zaWVudFxuICogQGNhdGVnb3J5IFByb3BlcnR5RGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNpZW50KCkge1xuICBjb25zdCBrZXkgPSBSZXBvc2l0b3J5LmtleShEQktleXMuVFJBTlNJRU5UKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKGZ1bmN0aW9uIHRyYW5zaWVudChtb2RlbDogYW55LCBhdHRyaWJ1dGU6IGFueSkge1xuICAgICAgcHJvcE1ldGFkYXRhKFJlcG9zaXRvcnkua2V5KERCS2V5cy5UUkFOU0lFTlQpLCB0cnVlKShtb2RlbCwgYXR0cmlidXRlKTtcbiAgICAgIHByb3BNZXRhZGF0YShSZXBvc2l0b3J5LmtleShEQktleXMuVFJBTlNJRU5UKSwgdHJ1ZSkobW9kZWwuY29uc3RydWN0b3IpO1xuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG4iLCJpbXBvcnQge1xuICBNb2RlbCxcbiAgTW9kZWxDb25kaXRpb25hbEFzeW5jLFxuICB2YWxpZGF0ZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgdmFsaWRhdGVDb21wYXJlIH0gZnJvbSBcIi4vdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0ZXMgdGhlIG1vZGVsIGFuZCBjaGVja3MgZm9yIGVycm9yc1xuICogQHN1bW1hcnkgVmFsaWRhdGVzIHRoZSBjdXJyZW50IG1vZGVsIHN0YXRlIGFuZCBvcHRpb25hbGx5IGNvbXBhcmVzIHdpdGggYSBwcmV2aW91cyB2ZXJzaW9uXG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAcGFyYW0ge018YW55fSBbcHJldmlvdXNWZXJzaW9uXSAtIE9wdGlvbmFsIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIG1vZGVsIGZvciBjb21wYXJpc29uXG4gKiBAcGFyYW0gey4uLmFueVtdfSBleGNsdXNpb25zIC0gUHJvcGVydGllcyB0byBleGNsdWRlIGZyb20gdmFsaWRhdGlvblxuICogQHJldHVybiB7TW9kZWxFcnJvckRlZmluaXRpb258dW5kZWZpbmVkfSBFcnJvciBkZWZpbml0aW9uIGlmIHZhbGlkYXRpb24gZmFpbHMsIHVuZGVmaW5lZCBvdGhlcndpc2VcbiAqIEBmdW5jdGlvbiBoYXNFcnJvcnNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5Nb2RlbC5wcm90b3R5cGUuaGFzRXJyb3JzID0gZnVuY3Rpb24gPE0gZXh0ZW5kcyBNb2RlbDx0cnVlIHwgZmFsc2U+PihcbiAgdGhpczogTSxcbiAgcHJldmlvdXNWZXJzaW9uPzogTSB8IGFueSxcbiAgLi4uZXhjbHVzaW9uczogYW55W11cbik6IE1vZGVsQ29uZGl0aW9uYWxBc3luYzxNPiB7XG4gIGlmIChwcmV2aW91c1ZlcnNpb24gJiYgIShwcmV2aW91c1ZlcnNpb24gaW5zdGFuY2VvZiBNb2RlbCkpIHtcbiAgICBleGNsdXNpb25zLnVuc2hpZnQocHJldmlvdXNWZXJzaW9uKTtcbiAgICBwcmV2aW91c1ZlcnNpb24gPSB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBhc3luYyA9IHRoaXMuaXNBc3luYygpO1xuICBjb25zdCBlcnJzID0gdmFsaWRhdGUodGhpcywgYXN5bmMsIC4uLmV4Y2x1c2lvbnMpO1xuXG4gIGlmIChhc3luYykge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZXJycykudGhlbigocmVzb2x2ZWRFcnJzKSA9PiB7XG4gICAgICBpZiAocmVzb2x2ZWRFcnJzIHx8ICFwcmV2aW91c1ZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVkRXJycztcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWxpZGF0ZUNvbXBhcmUocHJldmlvdXNWZXJzaW9uLCB0aGlzLCBhc3luYywgLi4uZXhjbHVzaW9ucyk7XG4gICAgfSkgYXMgYW55O1xuICB9XG5cbiAgaWYgKGVycnMgfHwgIXByZXZpb3VzVmVyc2lvbikgcmV0dXJuIGVycnMgYXMgYW55O1xuXG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgT3ZlcnJpZGluZyBNb2RlbCBwcm90b3R5cGUgbWV0aG9kIHdpdGggZHluYW1pYyBjb25kaXRpb25hbCByZXR1cm4gdHlwZS5cbiAgcmV0dXJuIHZhbGlkYXRlQ29tcGFyZShwcmV2aW91c1ZlcnNpb24sIHRoaXMsIGFzeW5jLCAuLi5leGNsdXNpb25zKTtcbn07XG4iLCJpbXBvcnQge1xuICBnZXRBbGxQcm9wZXJ0eURlY29yYXRvcnNSZWN1cnNpdmUsXG4gIFJlcG9zaXRvcnksXG4gIFNlcmlhbGl6YXRpb25FcnJvcixcbn0gZnJvbSBcIi4uL3JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgREJLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIG1vZGVsIGlzIG1hcmtlZCBhcyB0cmFuc2llbnRcbiAqIEBzdW1tYXJ5IERldGVybWluZXMgd2hldGhlciBhIG1vZGVsIGNsYXNzIGhhcyBiZWVuIGRlY29yYXRlZCB3aXRoIHRoZSB0cmFuc2llbnQgZGVjb3JhdG9yXG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIGNoZWNrXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBtb2RlbCBpcyB0cmFuc2llbnQsIGZhbHNlIG90aGVyd2lzZVxuICogQGZ1bmN0aW9uIGlzVHJhbnNpZW50XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVHJhbnNpZW50PE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pIHtcbiAgcmV0dXJuICEhKFxuICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoUmVwb3NpdG9yeS5rZXkoREJLZXlzLlRSQU5TSUVOVCksIG1vZGVsLmNvbnN0cnVjdG9yKSB8fFxuICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICBSZXBvc2l0b3J5LmtleShEQktleXMuVFJBTlNJRU5UKSxcbiAgICAgIE1vZGVsLmdldChtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lKSBhcyBhbnlcbiAgICApXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNlcGFyYXRlcyB0cmFuc2llbnQgcHJvcGVydGllcyBmcm9tIGEgbW9kZWxcbiAqIEBzdW1tYXJ5IEV4dHJhY3RzIHByb3BlcnRpZXMgbWFya2VkIGFzIHRyYW5zaWVudCBpbnRvIGEgc2VwYXJhdGUgb2JqZWN0XG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHByb2Nlc3NcbiAqIEByZXR1cm4ge09iamVjdH0gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIG1vZGVsIHdpdGhvdXQgdHJhbnNpZW50IHByb3BlcnRpZXMgYW5kIGEgc2VwYXJhdGUgdHJhbnNpZW50IG9iamVjdFxuICogQHByb3BlcnR5IHtNfSBtb2RlbCAtIFRoZSBtb2RlbCB3aXRoIHRyYW5zaWVudCBwcm9wZXJ0aWVzIHJlbW92ZWRcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3RyYW5zaWVudF0gLSBPYmplY3QgY29udGFpbmluZyB0aGUgdHJhbnNpZW50IHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBtb2RlbFRvVHJhbnNpZW50XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IG1vZGVsVG9UcmFuc2llbnRcbiAqICAgcGFydGljaXBhbnQgaXNUcmFuc2llbnRcbiAqICAgcGFydGljaXBhbnQgZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzUmVjdXJzaXZlXG4gKlxuICogICBDYWxsZXItPj5tb2RlbFRvVHJhbnNpZW50OiBtb2RlbFxuICogICBtb2RlbFRvVHJhbnNpZW50LT4+aXNUcmFuc2llbnQ6IGNoZWNrIGlmIG1vZGVsIGlzIHRyYW5zaWVudFxuICogICBpc1RyYW5zaWVudC0tPj5tb2RlbFRvVHJhbnNpZW50OiB0cmFuc2llbnQgc3RhdHVzXG4gKiAgIGFsdCBtb2RlbCBpcyBub3QgdHJhbnNpZW50XG4gKiAgICAgbW9kZWxUb1RyYW5zaWVudC0tPj5DYWxsZXI6IHttb2RlbH1cbiAqICAgZWxzZSBtb2RlbCBpcyB0cmFuc2llbnRcbiAqICAgICBtb2RlbFRvVHJhbnNpZW50LT4+Z2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzUmVjdXJzaXZlOiBnZXQgdHJhbnNpZW50IHByb3BlcnRpZXNcbiAqICAgICBnZXRBbGxQcm9wZXJ0eURlY29yYXRvcnNSZWN1cnNpdmUtLT4+bW9kZWxUb1RyYW5zaWVudDogcHJvcGVydHkgZGVjb3JhdG9yc1xuICogICAgIG1vZGVsVG9UcmFuc2llbnQtPj5tb2RlbFRvVHJhbnNpZW50OiBzZXBhcmF0ZSBwcm9wZXJ0aWVzXG4gKiAgICAgbW9kZWxUb1RyYW5zaWVudC0+Pk1vZGVsLmJ1aWxkOiByZWJ1aWxkIG1vZGVsIHdpdGhvdXQgdHJhbnNpZW50IHByb3BzXG4gKiAgICAgbW9kZWxUb1RyYW5zaWVudC0tPj5DYWxsZXI6IHttb2RlbCwgdHJhbnNpZW50fVxuICogICBlbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsVG9UcmFuc2llbnQ8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE1cbik6IHsgbW9kZWw6IE07IHRyYW5zaWVudD86IFJlY29yZDxzdHJpbmcsIGFueT4gfSB7XG4gIGlmICghaXNUcmFuc2llbnQobW9kZWwpKSByZXR1cm4geyBtb2RlbDogbW9kZWwgfTtcbiAgY29uc3QgZGVjczogUmVjb3JkPHN0cmluZywgYW55W10+ID0gZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzUmVjdXJzaXZlKFxuICAgIG1vZGVsLFxuICAgIHVuZGVmaW5lZCxcbiAgICBSZXBvc2l0b3J5LmtleShEQktleXMuVFJBTlNJRU5UKVxuICApIGFzIFJlY29yZDxzdHJpbmcsIGFueVtdPjtcblxuICBjb25zdCByZXN1bHQgPSBPYmplY3QuZW50cmllcyhkZWNzKS5yZWR1Y2UoXG4gICAgKFxuICAgICAgYWNjdW06IHsgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT47IHRyYW5zaWVudD86IFJlY29yZDxzdHJpbmcsIGFueT4gfSxcbiAgICAgIFtrLCB2YWxdXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2llbnQgPSB2YWwuZmluZCgoZWwpID0+IGVsLmtleSA9PT0gXCJcIik7XG4gICAgICBpZiAodHJhbnNpZW50KSB7XG4gICAgICAgIGFjY3VtLnRyYW5zaWVudCA9IGFjY3VtLnRyYW5zaWVudCB8fCB7fTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhY2N1bS50cmFuc2llbnRba10gPSBtb2RlbFtrIGFzIGtleW9mIE1dO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gc2VyaWFsaXplIHRyYW5zaWVudCBwcm9wZXJ0eSAke2t9OiAke2V9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjY3VtLm1vZGVsID0gYWNjdW0ubW9kZWwgfHwge307XG4gICAgICAgIGFjY3VtLm1vZGVsW2tdID0gKG1vZGVsIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW2tdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sXG4gICAge30gYXMgeyBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PjsgdHJhbnNpZW50PzogUmVjb3JkPHN0cmluZywgYW55PiB9XG4gICk7XG4gIHJlc3VsdC5tb2RlbCA9IE1vZGVsLmJ1aWxkKHJlc3VsdC5tb2RlbCwgbW9kZWwuY29uc3RydWN0b3IubmFtZSk7XG4gIHJldHVybiByZXN1bHQgYXMgeyBtb2RlbDogTTsgdHJhbnNpZW50PzogUmVjb3JkPHN0cmluZywgYW55PiB9O1xufVxuIiwiZXhwb3J0ICogZnJvbSBcIi4vaWRlbnRpdHlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ludGVyZmFjZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21vZGVsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9vcGVyYXRpb25zXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZXBvc2l0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi92YWxpZGF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERhdGFiYXNlIGRlY29yYXRvcnMgZm9yIFR5cGVTY3JpcHQgYXBwbGljYXRpb25zXG4gKiBAc3VtbWFyeSBBIGNvbXByZWhlbnNpdmUgbGlicmFyeSBwcm92aWRpbmcgZGVjb3JhdG9ycyBhbmQgdXRpbGl0aWVzIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zLCBtb2RlbCBkZWZpbml0aW9ucywgdmFsaWRhdGlvbiwgYW5kIHJlcG9zaXRvcnkgcGF0dGVybnMgaW4gVHlwZVNjcmlwdCBhcHBsaWNhdGlvbnNcbiAqIEBtb2R1bGUgZGItZGVjb3JhdG9yc1xuICovXG5cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3VycmVudCB2ZXJzaW9uIG9mIHRoZSByZWZsZWN0aW9uIHBhY2thZ2VcbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgc2VtYW50aWMgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHBhY2thZ2VcbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG4iXSwibmFtZXMiOlsiTW9kZWxLZXlzIiwiUmVhZE9ubHlWYWxpZGF0b3IiLCJWYWxpZGF0b3IiLCJpc0VxdWFsIiwiX19kZWNvcmF0ZSIsInZhbGlkYXRvciIsIlRpbWVzdGFtcFZhbGlkYXRvciIsIkRlY29yYXRvck1lc3NhZ2VzIiwiVmFsaWRhdGlvbiIsIk9wZXJhdGlvbktleXMiLCJCdWxrQ3J1ZE9wZXJhdGlvbktleXMiLCJIYXNoaW5nIiwiUmVmbGVjdGlvbiIsInByb3BNZXRhZGF0YSIsImFwcGx5IiwiT2JqZWN0QWNjdW11bGF0b3IiLCJzZiIsIkRlY29yYXRpb24iLCJkYXRlIiwicmVxdWlyZWQiLCJ0eXBlIiwibWV0YWRhdGEiLCJnZXRWYWxpZGF0aW9uRGVjb3JhdG9ycyIsIlZhbGlkYXRpb25LZXlzIiwidG9Db25kaXRpb25hbFByb21pc2UiLCJNb2RlbCIsIk1vZGVsRXJyb3JEZWZpbml0aW9uIiwidmFsaWRhdGUiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUVBOzs7OztJQUtHO0FBQ1UsVUFBQSxNQUFNLEdBQUc7SUFDcEIsSUFBQSxPQUFPLEVBQUUsQ0FBQSxFQUFHQSw2QkFBUyxDQUFDLE9BQU8sQ0FBYyxZQUFBLENBQUE7SUFDM0MsSUFBQSxVQUFVLEVBQUUsWUFBWTtJQUN4QixJQUFBLEtBQUssRUFBRSxRQUFRO0lBQ2YsSUFBQSxFQUFFLEVBQUUsSUFBSTtJQUNSLElBQUEsS0FBSyxFQUFFLE9BQU87SUFDZCxJQUFBLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLElBQUEsU0FBUyxFQUFFLFdBQVc7SUFDdEIsSUFBQSxRQUFRLEVBQUUsVUFBVTtJQUNwQixJQUFBLFNBQVMs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