appium-webdriveragent 3.14.0 → 4.0.0

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.
Files changed (56) hide show
  1. package/Scripts/build-webdriveragent.js +1 -1
  2. package/Scripts/fetch-prebuilt-wda.js +1 -1
  3. package/WebDriverAgent.xcodeproj/project.pbxproj +38 -2
  4. package/WebDriverAgent.xcodeproj/project.xcworkspace/xcuserdata/elf.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  5. package/WebDriverAgent.xcodeproj/xcuserdata/elf.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +91 -0
  6. package/WebDriverAgent.xcodeproj/xcuserdata/{kazuaki.xcuserdatad → elf.xcuserdatad}/xcschemes/xcschememanagement.plist +12 -35
  7. package/WebDriverAgentLib/Categories/XCUIApplication+FBHelpers.h +9 -6
  8. package/WebDriverAgentLib/Categories/XCUIApplication+FBHelpers.m +4 -6
  9. package/WebDriverAgentLib/Categories/XCUIApplication+FBUIInterruptions.h +23 -0
  10. package/WebDriverAgentLib/Categories/XCUIApplication+FBUIInterruptions.m +32 -0
  11. package/WebDriverAgentLib/Commands/FBAlertViewCommands.m +6 -6
  12. package/WebDriverAgentLib/Commands/FBDebugCommands.m +6 -3
  13. package/WebDriverAgentLib/FBAlert.m +1 -0
  14. package/WebDriverAgentLib/Utilities/FBConfiguration.h +5 -0
  15. package/WebDriverAgentLib/Utilities/FBConfiguration.m +6 -0
  16. package/WebDriverAgentLib/Utilities/FBReflectionUtils.h +24 -0
  17. package/WebDriverAgentLib/Utilities/FBReflectionUtils.m +32 -0
  18. package/WebDriverAgentLib/Utilities/FBScreen.m +3 -1
  19. package/WebDriverAgentLib/Utilities/FBXCAXClientProxy.m +5 -23
  20. package/WebDriverAgentLib/Utilities/FBXMLGenerationOptions.h +46 -0
  21. package/WebDriverAgentLib/Utilities/FBXMLGenerationOptions.m +26 -0
  22. package/WebDriverAgentLib/Utilities/FBXPath.h +4 -3
  23. package/WebDriverAgentLib/Utilities/FBXPath.m +65 -28
  24. package/WebDriverAgentRunner/UITestingUITests.m +1 -0
  25. package/WebDriverAgentRunner-Runner.app.zip +0 -0
  26. package/WebDriverAgentTests/IntegrationTests/FBAlertTests.m +6 -0
  27. package/WebDriverAgentTests/IntegrationTests/FBAppiumMultiTouchActionsIntegrationTests.m +7 -0
  28. package/WebDriverAgentTests/IntegrationTests/FBAppiumTouchActionsIntegrationTests.m +19 -0
  29. package/WebDriverAgentTests/IntegrationTests/FBElementScreenshotTests.m +4 -0
  30. package/WebDriverAgentTests/IntegrationTests/FBElementSwipingTests.m +71 -6
  31. package/WebDriverAgentTests/IntegrationTests/FBElementVisibilityTests.m +3 -1
  32. package/WebDriverAgentTests/IntegrationTests/FBForceTouchTests.m +6 -0
  33. package/WebDriverAgentTests/IntegrationTests/FBIntegrationTestCase.m +2 -1
  34. package/WebDriverAgentTests/IntegrationTests/FBKeyboardTests.m +19 -0
  35. package/WebDriverAgentTests/IntegrationTests/FBW3CTouchActionsIntegrationTests.m +15 -0
  36. package/WebDriverAgentTests/IntegrationTests/FBXPathIntegrationTests.m +16 -2
  37. package/WebDriverAgentTests/IntegrationTests/XCUIApplicationHelperTests.m +1 -1
  38. package/WebDriverAgentTests/IntegrationTests/XCUIElementFBFindTests.m +1 -1
  39. package/WebDriverAgentTests/UnitTests/FBXPathTests.m +28 -15
  40. package/build/lib/check-dependencies.js +3 -3
  41. package/build/lib/logger.js +3 -3
  42. package/build/lib/no-session-proxy.js +3 -3
  43. package/build/lib/utils.js +17 -17
  44. package/build/lib/webdriveragent.js +16 -16
  45. package/build/lib/xcodebuild.js +5 -5
  46. package/lib/check-dependencies.js +1 -1
  47. package/lib/logger.js +1 -1
  48. package/lib/no-session-proxy.js +1 -1
  49. package/lib/utils.js +3 -2
  50. package/lib/webdriveragent.js +2 -2
  51. package/lib/xcodebuild.js +1 -1
  52. package/package.json +10 -11
  53. package/WebDriverAgent.xcodeproj/project.xcworkspace/xcuserdata/kazuaki.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  54. package/WebDriverAgent.xcodeproj/project.xcworkspace/xcuserdata/kazuaki.xcuserdatad/WorkspaceSettings.xcsettings +0 -20
  55. package/WebDriverAgent.xcodeproj/xcuserdata/kazuaki.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +0 -1979
  56. package/WebDriverAgentLib/.DS_Store +0 -0
@@ -13,6 +13,7 @@
13
13
  #import "FBTestMacros.h"
14
14
  #import "FBXPath.h"
15
15
  #import "FBXCodeCompatibility.h"
16
+ #import "FBXMLGenerationOptions.h"
16
17
  #import "XCUIElement.h"
17
18
  #import "XCUIElement+FBFind.h"
18
19
  #import "XCUIElement+FBUtilities.h"
@@ -52,16 +53,29 @@
52
53
  - (void)testSingleDescendantXMLRepresentation
53
54
  {
54
55
  XCElementSnapshot *snapshot = self.destinationSnapshot;
55
- NSString *xmlStr = [FBXPath xmlStringWithRootElement:snapshot excludingAttributes:nil];
56
+ NSString *xmlStr = [FBXPath xmlStringWithRootElement:snapshot options:nil];
56
57
  XCTAssertNotNil(xmlStr);
57
58
  NSString *expectedXml = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<%@ type=\"%@\" name=\"%@\" label=\"%@\" enabled=\"%@\" visible=\"%@\" accessible=\"%@\" x=\"%@\" y=\"%@\" width=\"%@\" height=\"%@\" index=\"%lu\"/>\n", snapshot.wdType, snapshot.wdType, snapshot.wdName, snapshot.wdLabel, snapshot.wdEnabled ? @"true" : @"false", snapshot.wdVisible ? @"true" : @"false", snapshot.wdAccessible ? @"true" : @"false", [snapshot.wdRect[@"x"] stringValue], [snapshot.wdRect[@"y"] stringValue], [snapshot.wdRect[@"width"] stringValue], [snapshot.wdRect[@"height"] stringValue], snapshot.wdIndex];
58
59
  XCTAssertEqualObjects(xmlStr, expectedXml);
59
60
  }
60
61
 
62
+ - (void)testSingleDescendantXMLRepresentationWithScope
63
+ {
64
+ XCElementSnapshot *snapshot = self.destinationSnapshot;
65
+ NSString *scope = @"AppiumAUT";
66
+ FBXMLGenerationOptions *options = [[FBXMLGenerationOptions new] withScope:scope];
67
+ NSString *xmlStr = [FBXPath xmlStringWithRootElement:snapshot options:options];
68
+ XCTAssertNotNil(xmlStr);
69
+ NSString *expectedXml = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<%@>\n <%@ type=\"%@\" name=\"%@\" label=\"%@\" enabled=\"%@\" visible=\"%@\" accessible=\"%@\" x=\"%@\" y=\"%@\" width=\"%@\" height=\"%@\" index=\"%lu\"/>\n</%@>\n", scope, snapshot.wdType, snapshot.wdType, snapshot.wdName, snapshot.wdLabel, snapshot.wdEnabled ? @"true" : @"false", snapshot.wdVisible ? @"true" : @"false", snapshot.wdAccessible ? @"true" : @"false", [snapshot.wdRect[@"x"] stringValue], [snapshot.wdRect[@"y"] stringValue], [snapshot.wdRect[@"width"] stringValue], [snapshot.wdRect[@"height"] stringValue], snapshot.wdIndex, scope];
70
+ XCTAssertEqualObjects(xmlStr, expectedXml);
71
+ }
72
+
61
73
  - (void)testSingleDescendantXMLRepresentationWithoutAttributes
62
74
  {
63
75
  XCElementSnapshot *snapshot = self.destinationSnapshot;
64
- NSString *xmlStr = [FBXPath xmlStringWithRootElement:snapshot excludingAttributes:@[@"visible", @"enabled", @"index", @"blabla"]];
76
+ FBXMLGenerationOptions *options = [[FBXMLGenerationOptions new]
77
+ withExcludedAttributes:@[@"visible", @"enabled", @"index", @"blabla"]];
78
+ NSString *xmlStr = [FBXPath xmlStringWithRootElement:snapshot options:options];
65
79
  XCTAssertNotNil(xmlStr);
66
80
  NSString *expectedXml = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<%@ type=\"%@\" name=\"%@\" label=\"%@\" accessible=\"%@\" x=\"%@\" y=\"%@\" width=\"%@\" height=\"%@\"/>\n", snapshot.wdType, snapshot.wdType, snapshot.wdName, snapshot.wdLabel, snapshot.wdAccessible ? @"true" : @"false", [snapshot.wdRect[@"x"] stringValue], [snapshot.wdRect[@"y"] stringValue], [snapshot.wdRect[@"width"] stringValue], [snapshot.wdRect[@"height"] stringValue]];
67
81
  XCTAssertEqualObjects(xmlStr, expectedXml);
@@ -34,7 +34,7 @@
34
34
  {
35
35
  [self goToSpringBoardFirstPage];
36
36
  XCTAssertTrue(FBApplication.fb_systemApplication.icons[@"Safari"].exists);
37
- XCTAssertTrue(FBApplication.fb_systemApplication.icons[@"Calendar"].exists);
37
+ XCTAssertTrue(FBApplication.fb_systemApplication.icons[@"Calendar"].firstMatch.exists);
38
38
  }
39
39
 
40
40
  - (void)testApplicationTree
@@ -314,7 +314,7 @@
314
314
 
315
315
  - (void)testClassChainWithDescendantPredicate
316
316
  {
317
- NSArray<XCUIElement *> *simpleQueryMatches = [self.testedApplication fb_descendantsMatchingClassChain:@"XCUIElementTypeWindow/*/*[2]" shouldReturnAfterFirstMatch:NO];
317
+ NSArray<XCUIElement *> *simpleQueryMatches = [self.testedApplication fb_descendantsMatchingClassChain:@"XCUIElementTypeWindow/*/*[1]" shouldReturnAfterFirstMatch:NO];
318
318
  NSArray<XCUIElement *> *predicateQueryMatches = [self.testedApplication fb_descendantsMatchingClassChain:@"XCUIElementTypeWindow/*/*[$type == 'XCUIElementTypeButton' AND label BEGINSWITH 'A'$]" shouldReturnAfterFirstMatch:NO];
319
319
  XCTAssertEqual(simpleQueryMatches.count, predicateQueryMatches.count);
320
320
  XCTAssertEqual([simpleQueryMatches firstObject].elementType, [predicateQueryMatches firstObject].elementType);
@@ -28,18 +28,24 @@
28
28
  NSMutableDictionary *elementStore = [NSMutableDictionary dictionary];
29
29
  int buffersize;
30
30
  xmlChar *xmlbuff;
31
- int rc = [FBXPath xmlRepresentationWithRootElement:(XCElementSnapshot *)element
32
- writer:writer
33
- elementStore:elementStore
34
- query:query
35
- excludingAttributes:excludedAttributes];
36
- if (0 == rc) {
31
+ int rc = xmlTextWriterStartDocument(writer, NULL, "UTF-8", NULL);
32
+ if (rc >= 0) {
33
+ rc = [FBXPath xmlRepresentationWithRootElement:(XCElementSnapshot *)element
34
+ writer:writer
35
+ elementStore:elementStore
36
+ query:query
37
+ excludingAttributes:excludedAttributes];
38
+ if (rc >= 0) {
39
+ rc = xmlTextWriterEndDocument(writer);
40
+ }
41
+ }
42
+ if (rc >= 0) {
37
43
  xmlDocDumpFormatMemory(doc, &xmlbuff, &buffersize, 1);
38
44
  }
39
45
  xmlFreeTextWriter(writer);
40
46
  xmlFreeDoc(doc);
41
47
 
42
- XCTAssertEqual(rc, 0);
48
+ XCTAssertTrue(rc >= 0);
43
49
  XCTAssertEqual(1, [elementStore count]);
44
50
 
45
51
  NSString *result = [NSString stringWithCString:(const char *)xmlbuff encoding:NSUTF8StringEncoding];
@@ -72,12 +78,13 @@
72
78
  - (void)testXPathPresentationBasedOnQueryMatchingAllAttributes
73
79
  {
74
80
  XCUIElementDouble *element = [XCUIElementDouble new];
81
+ element.wdValue = @"йоло<>&\"";
75
82
  NSString *resultXml = [self xmlStringWithElement:element
76
83
  xpathQuery:[NSString stringWithFormat:@"//%@[@*]", element.wdType]
77
84
  excludingAttributes:@[@"visible"]];
78
85
  NSString *expectedXml = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<%@ type=\"%@\" value=\"%@\" name=\"%@\" label=\"%@\" enabled=\"%@\" visible=\"%@\" accessible=\"%@\" x=\"%@\" y=\"%@\" width=\"%@\" height=\"%@\" index=\"%lu\" private_indexPath=\"top\"/>\n",
79
- element.wdType, element.wdType, element.wdValue, element.wdName, element.wdLabel, element.wdEnabled ? @"true" : @"false", element.wdVisible ? @"true" : @"false", element.wdAccessible ? @"true" : @"false", element.wdRect[@"x"], element.wdRect[@"y"], element.wdRect[@"width"], element.wdRect[@"height"], element.wdIndex];
80
- XCTAssertTrue([resultXml isEqualToString: expectedXml]);
86
+ element.wdType, element.wdType, @"йоло&lt;&gt;&amp;&quot;", element.wdName, element.wdLabel, element.wdEnabled ? @"true" : @"false", element.wdVisible ? @"true" : @"false", element.wdAccessible ? @"true" : @"false", element.wdRect[@"x"], element.wdRect[@"y"], element.wdRect[@"width"], element.wdRect[@"height"], element.wdIndex];
87
+ XCTAssertTrue([resultXml isEqualToString:expectedXml]);
81
88
  }
82
89
 
83
90
  - (void)testXPathPresentationBasedOnQueryMatchingSomeAttributes
@@ -99,15 +106,21 @@
99
106
  NSMutableDictionary *elementStore = [NSMutableDictionary dictionary];
100
107
  XCUIElementDouble *root = [XCUIElementDouble new];
101
108
  NSString *query = [NSString stringWithFormat:@"//%@", root.wdType];
102
- int rc = [FBXPath xmlRepresentationWithRootElement:(XCElementSnapshot *)root
103
- writer:writer
104
- elementStore:elementStore
105
- query:query
106
- excludingAttributes:nil];
109
+ int rc = xmlTextWriterStartDocument(writer, NULL, "UTF-8", NULL);
110
+ if (rc >= 0) {
111
+ rc = [FBXPath xmlRepresentationWithRootElement:(XCElementSnapshot *)root
112
+ writer:writer
113
+ elementStore:elementStore
114
+ query:query
115
+ excludingAttributes:nil];
116
+ if (rc >= 0) {
117
+ rc = xmlTextWriterEndDocument(writer);
118
+ }
119
+ }
107
120
  if (rc < 0) {
108
121
  xmlFreeTextWriter(writer);
109
122
  xmlFreeDoc(doc);
110
- XCTAssertEqual(rc, 0);
123
+ XCTFail(@"Unable to create the source XML document");
111
124
  }
112
125
 
113
126
  xmlXPathObjectPtr queryResult = [FBXPath evaluate:query document:doc];
@@ -10,7 +10,7 @@ exports.checkForDependencies = checkForDependencies;
10
10
 
11
11
  require("source-map-support/register");
12
12
 
13
- var _appiumSupport = require("appium-support");
13
+ var _support = require("@appium/support");
14
14
 
15
15
  var _lodash = _interopRequireDefault(require("lodash"));
16
16
 
@@ -45,7 +45,7 @@ async function bundleWDASim(xcodebuild, opts = {}) {
45
45
 
46
46
  const wdaBundlePath = _path.default.join(derivedDataPath, 'Build', 'Products', 'Debug-iphonesimulator', _constants.WDA_RUNNER_APP);
47
47
 
48
- if (await _appiumSupport.fs.exists(wdaBundlePath)) {
48
+ if (await _support.fs.exists(wdaBundlePath)) {
49
49
  return wdaBundlePath;
50
50
  }
51
51
 
@@ -55,4 +55,4 @@ async function bundleWDASim(xcodebuild, opts = {}) {
55
55
  }require('source-map-support').install();
56
56
 
57
57
 
58
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jaGVjay1kZXBlbmRlbmNpZXMuanMiXSwibmFtZXMiOlsiYnVpbGRXREFTaW0iLCJhcmdzIiwiV0RBX1BST0pFQ1QiLCJXREFfU0NIRU1FIiwiU0RLX1NJTVVMQVRPUiIsImNoZWNrRm9yRGVwZW5kZW5jaWVzIiwibG9nIiwiZGVidWciLCJidW5kbGVXREFTaW0iLCJ4Y29kZWJ1aWxkIiwib3B0cyIsIl8iLCJpc0Z1bmN0aW9uIiwicmV0cmlldmVEZXJpdmVkRGF0YVBhdGgiLCJYY29kZUJ1aWxkIiwiZGVyaXZlZERhdGFQYXRoIiwid2RhQnVuZGxlUGF0aCIsInBhdGgiLCJqb2luIiwiV0RBX1JVTk5FUl9BUFAiLCJmcyIsImV4aXN0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0E7O0FBRUEsZUFBZUEsV0FBZixHQUE4QjtBQUM1QixRQUFNQyxJQUFJLEdBQUcsQ0FDWCxVQURXLEVBQ0NDLHNCQURELEVBRVgsU0FGVyxFQUVBQyxxQkFGQSxFQUdYLE1BSFcsRUFHSEMsd0JBSEcsRUFJWCx1QkFKVyxFQUtYLDRCQUxXLEVBTVgsZ0NBTlcsQ0FBYjtBQVFBLFFBQU0sd0JBQUssWUFBTCxFQUFtQkgsSUFBbkIsQ0FBTjtBQUNEOztBQUdELGVBQWVJLG9CQUFmLEdBQXVDO0FBQ3JDQyxrQkFBSUMsS0FBSixDQUFVLDZCQUFWOztBQUNBLFNBQU8sS0FBUDtBQUNEOztBQUVELGVBQWVDLFlBQWYsQ0FBNkJDLFVBQTdCLEVBQXlDQyxJQUFJLEdBQUcsRUFBaEQsRUFBb0Q7QUFDbEQsTUFBSUQsVUFBVSxJQUFJLENBQUNFLGdCQUFFQyxVQUFGLENBQWFILFVBQVUsQ0FBQ0ksdUJBQXhCLENBQW5CLEVBQXFFO0FBQ25FSixJQUFBQSxVQUFVLEdBQUcsSUFBSUssbUJBQUosRUFBYjtBQUNBSixJQUFBQSxJQUFJLEdBQUdELFVBQVA7QUFDRDs7QUFFRCxRQUFNTSxlQUFlLEdBQUcsTUFBTU4sVUFBVSxDQUFDSSx1QkFBWCxFQUE5Qjs7QUFDQSxRQUFNRyxhQUFhLEdBQUdDLGNBQUtDLElBQUwsQ0FBVUgsZUFBVixFQUEyQixPQUEzQixFQUFvQyxVQUFwQyxFQUFnRCx1QkFBaEQsRUFBeUVJLHlCQUF6RSxDQUF0Qjs7QUFDQSxNQUFJLE1BQU1DLGtCQUFHQyxNQUFILENBQVVMLGFBQVYsQ0FBVixFQUFvQztBQUNsQyxXQUFPQSxhQUFQO0FBQ0Q7O0FBQ0QsUUFBTVgsb0JBQW9CLENBQUNLLElBQUQsQ0FBMUI7QUFDQSxRQUFNVixXQUFXLENBQUNTLFVBQUQsRUFBYUMsSUFBYixDQUFqQjtBQUNBLFNBQU9NLGFBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZzIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgWGNvZGVCdWlsZCBmcm9tICcuL3hjb2RlYnVpbGQnO1xuaW1wb3J0IHtcbiAgV0RBX1BST0pFQ1QsIFdEQV9TQ0hFTUUsIFNES19TSU1VTEFUT1IsIFdEQV9SVU5ORVJfQVBQXG59IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuXG5hc3luYyBmdW5jdGlvbiBidWlsZFdEQVNpbSAoKSB7XG4gIGNvbnN0IGFyZ3MgPSBbXG4gICAgJy1wcm9qZWN0JywgV0RBX1BST0pFQ1QsXG4gICAgJy1zY2hlbWUnLCBXREFfU0NIRU1FLFxuICAgICctc2RrJywgU0RLX1NJTVVMQVRPUixcbiAgICAnQ09ERV9TSUdOX0lERU5USVRZPVwiXCInLFxuICAgICdDT0RFX1NJR05JTkdfUkVRVUlSRUQ9XCJOT1wiJyxcbiAgICAnR0NDX1RSRUFUX1dBUk5JTkdTX0FTX0VSUk9SUz0wJyxcbiAgXTtcbiAgYXdhaXQgZXhlYygneGNvZGVidWlsZCcsIGFyZ3MpO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1hd2FpdFxuYXN5bmMgZnVuY3Rpb24gY2hlY2tGb3JEZXBlbmRlbmNpZXMgKCkge1xuICBsb2cuZGVidWcoJ0RlcGVuZGVuY2llcyBhcmUgdXAgdG8gZGF0ZScpO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1bmRsZVdEQVNpbSAoeGNvZGVidWlsZCwgb3B0cyA9IHt9KSB7XG4gIGlmICh4Y29kZWJ1aWxkICYmICFfLmlzRnVuY3Rpb24oeGNvZGVidWlsZC5yZXRyaWV2ZURlcml2ZWREYXRhUGF0aCkpIHtcbiAgICB4Y29kZWJ1aWxkID0gbmV3IFhjb2RlQnVpbGQoKTtcbiAgICBvcHRzID0geGNvZGVidWlsZDtcbiAgfVxuXG4gIGNvbnN0IGRlcml2ZWREYXRhUGF0aCA9IGF3YWl0IHhjb2RlYnVpbGQucmV0cmlldmVEZXJpdmVkRGF0YVBhdGgoKTtcbiAgY29uc3Qgd2RhQnVuZGxlUGF0aCA9IHBhdGguam9pbihkZXJpdmVkRGF0YVBhdGgsICdCdWlsZCcsICdQcm9kdWN0cycsICdEZWJ1Zy1pcGhvbmVzaW11bGF0b3InLCBXREFfUlVOTkVSX0FQUCk7XG4gIGlmIChhd2FpdCBmcy5leGlzdHMod2RhQnVuZGxlUGF0aCkpIHtcbiAgICByZXR1cm4gd2RhQnVuZGxlUGF0aDtcbiAgfVxuICBhd2FpdCBjaGVja0ZvckRlcGVuZGVuY2llcyhvcHRzKTtcbiAgYXdhaXQgYnVpbGRXREFTaW0oeGNvZGVidWlsZCwgb3B0cyk7XG4gIHJldHVybiB3ZGFCdW5kbGVQYXRoO1xufVxuXG5leHBvcnQgeyBjaGVja0ZvckRlcGVuZGVuY2llcywgYnVuZGxlV0RBU2ltIH07XG4iXSwiZmlsZSI6ImxpYi9jaGVjay1kZXBlbmRlbmNpZXMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
58
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jaGVjay1kZXBlbmRlbmNpZXMuanMiXSwibmFtZXMiOlsiYnVpbGRXREFTaW0iLCJhcmdzIiwiV0RBX1BST0pFQ1QiLCJXREFfU0NIRU1FIiwiU0RLX1NJTVVMQVRPUiIsImNoZWNrRm9yRGVwZW5kZW5jaWVzIiwibG9nIiwiZGVidWciLCJidW5kbGVXREFTaW0iLCJ4Y29kZWJ1aWxkIiwib3B0cyIsIl8iLCJpc0Z1bmN0aW9uIiwicmV0cmlldmVEZXJpdmVkRGF0YVBhdGgiLCJYY29kZUJ1aWxkIiwiZGVyaXZlZERhdGFQYXRoIiwid2RhQnVuZGxlUGF0aCIsInBhdGgiLCJqb2luIiwiV0RBX1JVTk5FUl9BUFAiLCJmcyIsImV4aXN0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0E7O0FBRUEsZUFBZUEsV0FBZixHQUE4QjtBQUM1QixRQUFNQyxJQUFJLEdBQUcsQ0FDWCxVQURXLEVBQ0NDLHNCQURELEVBRVgsU0FGVyxFQUVBQyxxQkFGQSxFQUdYLE1BSFcsRUFHSEMsd0JBSEcsRUFJWCx1QkFKVyxFQUtYLDRCQUxXLEVBTVgsZ0NBTlcsQ0FBYjtBQVFBLFFBQU0sd0JBQUssWUFBTCxFQUFtQkgsSUFBbkIsQ0FBTjtBQUNEOztBQUdELGVBQWVJLG9CQUFmLEdBQXVDO0FBQ3JDQyxrQkFBSUMsS0FBSixDQUFVLDZCQUFWOztBQUNBLFNBQU8sS0FBUDtBQUNEOztBQUVELGVBQWVDLFlBQWYsQ0FBNkJDLFVBQTdCLEVBQXlDQyxJQUFJLEdBQUcsRUFBaEQsRUFBb0Q7QUFDbEQsTUFBSUQsVUFBVSxJQUFJLENBQUNFLGdCQUFFQyxVQUFGLENBQWFILFVBQVUsQ0FBQ0ksdUJBQXhCLENBQW5CLEVBQXFFO0FBQ25FSixJQUFBQSxVQUFVLEdBQUcsSUFBSUssbUJBQUosRUFBYjtBQUNBSixJQUFBQSxJQUFJLEdBQUdELFVBQVA7QUFDRDs7QUFFRCxRQUFNTSxlQUFlLEdBQUcsTUFBTU4sVUFBVSxDQUFDSSx1QkFBWCxFQUE5Qjs7QUFDQSxRQUFNRyxhQUFhLEdBQUdDLGNBQUtDLElBQUwsQ0FBVUgsZUFBVixFQUEyQixPQUEzQixFQUFvQyxVQUFwQyxFQUFnRCx1QkFBaEQsRUFBeUVJLHlCQUF6RSxDQUF0Qjs7QUFDQSxNQUFJLE1BQU1DLFlBQUdDLE1BQUgsQ0FBVUwsYUFBVixDQUFWLEVBQW9DO0FBQ2xDLFdBQU9BLGFBQVA7QUFDRDs7QUFDRCxRQUFNWCxvQkFBb0IsQ0FBQ0ssSUFBRCxDQUExQjtBQUNBLFFBQU1WLFdBQVcsQ0FBQ1MsVUFBRCxFQUFhQyxJQUFiLENBQWpCO0FBQ0EsU0FBT00sYUFBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZnMgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgWGNvZGVCdWlsZCBmcm9tICcuL3hjb2RlYnVpbGQnO1xuaW1wb3J0IHtcbiAgV0RBX1BST0pFQ1QsIFdEQV9TQ0hFTUUsIFNES19TSU1VTEFUT1IsIFdEQV9SVU5ORVJfQVBQXG59IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuXG5hc3luYyBmdW5jdGlvbiBidWlsZFdEQVNpbSAoKSB7XG4gIGNvbnN0IGFyZ3MgPSBbXG4gICAgJy1wcm9qZWN0JywgV0RBX1BST0pFQ1QsXG4gICAgJy1zY2hlbWUnLCBXREFfU0NIRU1FLFxuICAgICctc2RrJywgU0RLX1NJTVVMQVRPUixcbiAgICAnQ09ERV9TSUdOX0lERU5USVRZPVwiXCInLFxuICAgICdDT0RFX1NJR05JTkdfUkVRVUlSRUQ9XCJOT1wiJyxcbiAgICAnR0NDX1RSRUFUX1dBUk5JTkdTX0FTX0VSUk9SUz0wJyxcbiAgXTtcbiAgYXdhaXQgZXhlYygneGNvZGVidWlsZCcsIGFyZ3MpO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1hd2FpdFxuYXN5bmMgZnVuY3Rpb24gY2hlY2tGb3JEZXBlbmRlbmNpZXMgKCkge1xuICBsb2cuZGVidWcoJ0RlcGVuZGVuY2llcyBhcmUgdXAgdG8gZGF0ZScpO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1bmRsZVdEQVNpbSAoeGNvZGVidWlsZCwgb3B0cyA9IHt9KSB7XG4gIGlmICh4Y29kZWJ1aWxkICYmICFfLmlzRnVuY3Rpb24oeGNvZGVidWlsZC5yZXRyaWV2ZURlcml2ZWREYXRhUGF0aCkpIHtcbiAgICB4Y29kZWJ1aWxkID0gbmV3IFhjb2RlQnVpbGQoKTtcbiAgICBvcHRzID0geGNvZGVidWlsZDtcbiAgfVxuXG4gIGNvbnN0IGRlcml2ZWREYXRhUGF0aCA9IGF3YWl0IHhjb2RlYnVpbGQucmV0cmlldmVEZXJpdmVkRGF0YVBhdGgoKTtcbiAgY29uc3Qgd2RhQnVuZGxlUGF0aCA9IHBhdGguam9pbihkZXJpdmVkRGF0YVBhdGgsICdCdWlsZCcsICdQcm9kdWN0cycsICdEZWJ1Zy1pcGhvbmVzaW11bGF0b3InLCBXREFfUlVOTkVSX0FQUCk7XG4gIGlmIChhd2FpdCBmcy5leGlzdHMod2RhQnVuZGxlUGF0aCkpIHtcbiAgICByZXR1cm4gd2RhQnVuZGxlUGF0aDtcbiAgfVxuICBhd2FpdCBjaGVja0ZvckRlcGVuZGVuY2llcyhvcHRzKTtcbiAgYXdhaXQgYnVpbGRXREFTaW0oeGNvZGVidWlsZCwgb3B0cyk7XG4gIHJldHVybiB3ZGFCdW5kbGVQYXRoO1xufVxuXG5leHBvcnQgeyBjaGVja0ZvckRlcGVuZGVuY2llcywgYnVuZGxlV0RBU2ltIH07XG4iXSwiZmlsZSI6ImxpYi9jaGVjay1kZXBlbmRlbmNpZXMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
@@ -7,12 +7,12 @@ exports.default = void 0;
7
7
 
8
8
  require("source-map-support/register");
9
9
 
10
- var _appiumSupport = require("appium-support");
10
+ var _support = require("@appium/support");
11
11
 
12
- const log = _appiumSupport.logger.getLogger('WebDriverAgent');
12
+ const log = _support.logger.getLogger('WebDriverAgent');
13
13
 
14
14
  var _default = log;
15
15
  exports.default = _default;require('source-map-support').install();
16
16
 
17
17
 
18
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9sb2dnZXIuanMiXSwibmFtZXMiOlsibG9nIiwibG9nZ2VyIiwiZ2V0TG9nZ2VyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFFQSxNQUFNQSxHQUFHLEdBQUdDLHNCQUFPQyxTQUFQLENBQWlCLGdCQUFqQixDQUFaOztlQUVlRixHIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuXG5jb25zdCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdXZWJEcml2ZXJBZ2VudCcpO1xuXG5leHBvcnQgZGVmYXVsdCBsb2c7XG4iXSwiZmlsZSI6ImxpYi9sb2dnZXIuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
18
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9sb2dnZXIuanMiXSwibmFtZXMiOlsibG9nIiwibG9nZ2VyIiwiZ2V0TG9nZ2VyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFFQSxNQUFNQSxHQUFHLEdBQUdDLGdCQUFPQyxTQUFQLENBQWlCLGdCQUFqQixDQUFaOztlQUVlRixHIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcblxuY29uc3QgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignV2ViRHJpdmVyQWdlbnQnKTtcblxuZXhwb3J0IGRlZmF1bHQgbG9nO1xuIl0sImZpbGUiOiJsaWIvbG9nZ2VyLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
@@ -7,9 +7,9 @@ exports.default = exports.NoSessionProxy = void 0;
7
7
 
8
8
  require("source-map-support/register");
9
9
 
10
- var _appiumBaseDriver = require("appium-base-driver");
10
+ var _baseDriver = require("@appium/base-driver");
11
11
 
12
- class NoSessionProxy extends _appiumBaseDriver.JWProxy {
12
+ class NoSessionProxy extends _baseDriver.JWProxy {
13
13
  constructor(opts = {}) {
14
14
  super(opts);
15
15
  }
@@ -39,4 +39,4 @@ var _default = NoSessionProxy;
39
39
  exports.default = _default;require('source-map-support').install();
40
40
 
41
41
 
42
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9uby1zZXNzaW9uLXByb3h5LmpzIl0sIm5hbWVzIjpbIk5vU2Vzc2lvblByb3h5IiwiSldQcm94eSIsImNvbnN0cnVjdG9yIiwib3B0cyIsImdldFVybEZvclByb3h5IiwidXJsIiwicHJveHlCYXNlIiwic2NoZW1lIiwic2VydmVyIiwicG9ydCIsImJhc2UiLCJyZW1haW5pbmdVcmwiLCJSZWdFeHAiLCJ0ZXN0IiwiRXJyb3IiLCJyZXBsYWNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFHQSxNQUFNQSxjQUFOLFNBQTZCQyx5QkFBN0IsQ0FBcUM7QUFDbkNDLEVBQUFBLFdBQVcsQ0FBRUMsSUFBSSxHQUFHLEVBQVQsRUFBYTtBQUN0QixVQUFNQSxJQUFOO0FBQ0Q7O0FBRURDLEVBQUFBLGNBQWMsQ0FBRUMsR0FBRixFQUFPO0FBQ25CLFFBQUlBLEdBQUcsS0FBSyxFQUFaLEVBQWdCO0FBQ2RBLE1BQUFBLEdBQUcsR0FBRyxHQUFOO0FBQ0Q7O0FBQ0QsVUFBTUMsU0FBUyxHQUFJLEdBQUUsS0FBS0MsTUFBTyxNQUFLLEtBQUtDLE1BQU8sSUFBRyxLQUFLQyxJQUFLLEdBQUUsS0FBS0MsSUFBSyxFQUEzRTtBQUNBLFFBQUlDLFlBQVksR0FBRyxFQUFuQjs7QUFDQSxRQUFLLElBQUlDLE1BQUosQ0FBVyxJQUFYLENBQUQsQ0FBbUJDLElBQW5CLENBQXdCUixHQUF4QixDQUFKLEVBQWtDO0FBQ2hDTSxNQUFBQSxZQUFZLEdBQUdOLEdBQWY7QUFDRCxLQUZELE1BRU87QUFDTCxZQUFNLElBQUlTLEtBQUosQ0FBVyxxQ0FBb0NULEdBQUksR0FBbkQsQ0FBTjtBQUNEOztBQUNETSxJQUFBQSxZQUFZLEdBQUdBLFlBQVksQ0FBQ0ksT0FBYixDQUFxQixLQUFyQixFQUE0QixFQUE1QixDQUFmO0FBQ0EsV0FBT1QsU0FBUyxHQUFHSyxZQUFuQjtBQUNEOztBQWxCa0M7OztlQXNCdEJYLGMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBKV1Byb3h5IH0gZnJvbSAnYXBwaXVtLWJhc2UtZHJpdmVyJztcblxuXG5jbGFzcyBOb1Nlc3Npb25Qcm94eSBleHRlbmRzIEpXUHJveHkge1xuICBjb25zdHJ1Y3RvciAob3B0cyA9IHt9KSB7XG4gICAgc3VwZXIob3B0cyk7XG4gIH1cblxuICBnZXRVcmxGb3JQcm94eSAodXJsKSB7XG4gICAgaWYgKHVybCA9PT0gJycpIHtcbiAgICAgIHVybCA9ICcvJztcbiAgICB9XG4gICAgY29uc3QgcHJveHlCYXNlID0gYCR7dGhpcy5zY2hlbWV9Oi8vJHt0aGlzLnNlcnZlcn06JHt0aGlzLnBvcnR9JHt0aGlzLmJhc2V9YDtcbiAgICBsZXQgcmVtYWluaW5nVXJsID0gJyc7XG4gICAgaWYgKChuZXcgUmVnRXhwKCdeLycpKS50ZXN0KHVybCkpIHtcbiAgICAgIHJlbWFpbmluZ1VybCA9IHVybDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBEaWQgbm90IGtub3cgd2hhdCB0byBkbyB3aXRoIHVybCAnJHt1cmx9J2ApO1xuICAgIH1cbiAgICByZW1haW5pbmdVcmwgPSByZW1haW5pbmdVcmwucmVwbGFjZSgvXFwvJC8sICcnKTsgLy8gY2FuJ3QgaGF2ZSB0cmFpbGluZyBzbGFzaGVzXG4gICAgcmV0dXJuIHByb3h5QmFzZSArIHJlbWFpbmluZ1VybDtcbiAgfVxufVxuXG5leHBvcnQgeyBOb1Nlc3Npb25Qcm94eSB9O1xuZXhwb3J0IGRlZmF1bHQgTm9TZXNzaW9uUHJveHk7XG4iXSwiZmlsZSI6ImxpYi9uby1zZXNzaW9uLXByb3h5LmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
42
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9uby1zZXNzaW9uLXByb3h5LmpzIl0sIm5hbWVzIjpbIk5vU2Vzc2lvblByb3h5IiwiSldQcm94eSIsImNvbnN0cnVjdG9yIiwib3B0cyIsImdldFVybEZvclByb3h5IiwidXJsIiwicHJveHlCYXNlIiwic2NoZW1lIiwic2VydmVyIiwicG9ydCIsImJhc2UiLCJyZW1haW5pbmdVcmwiLCJSZWdFeHAiLCJ0ZXN0IiwiRXJyb3IiLCJyZXBsYWNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFHQSxNQUFNQSxjQUFOLFNBQTZCQyxtQkFBN0IsQ0FBcUM7QUFDbkNDLEVBQUFBLFdBQVcsQ0FBRUMsSUFBSSxHQUFHLEVBQVQsRUFBYTtBQUN0QixVQUFNQSxJQUFOO0FBQ0Q7O0FBRURDLEVBQUFBLGNBQWMsQ0FBRUMsR0FBRixFQUFPO0FBQ25CLFFBQUlBLEdBQUcsS0FBSyxFQUFaLEVBQWdCO0FBQ2RBLE1BQUFBLEdBQUcsR0FBRyxHQUFOO0FBQ0Q7O0FBQ0QsVUFBTUMsU0FBUyxHQUFJLEdBQUUsS0FBS0MsTUFBTyxNQUFLLEtBQUtDLE1BQU8sSUFBRyxLQUFLQyxJQUFLLEdBQUUsS0FBS0MsSUFBSyxFQUEzRTtBQUNBLFFBQUlDLFlBQVksR0FBRyxFQUFuQjs7QUFDQSxRQUFLLElBQUlDLE1BQUosQ0FBVyxJQUFYLENBQUQsQ0FBbUJDLElBQW5CLENBQXdCUixHQUF4QixDQUFKLEVBQWtDO0FBQ2hDTSxNQUFBQSxZQUFZLEdBQUdOLEdBQWY7QUFDRCxLQUZELE1BRU87QUFDTCxZQUFNLElBQUlTLEtBQUosQ0FBVyxxQ0FBb0NULEdBQUksR0FBbkQsQ0FBTjtBQUNEOztBQUNETSxJQUFBQSxZQUFZLEdBQUdBLFlBQVksQ0FBQ0ksT0FBYixDQUFxQixLQUFyQixFQUE0QixFQUE1QixDQUFmO0FBQ0EsV0FBT1QsU0FBUyxHQUFHSyxZQUFuQjtBQUNEOztBQWxCa0M7OztlQXNCdEJYLGMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBKV1Byb3h5IH0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5cblxuY2xhc3MgTm9TZXNzaW9uUHJveHkgZXh0ZW5kcyBKV1Byb3h5IHtcbiAgY29uc3RydWN0b3IgKG9wdHMgPSB7fSkge1xuICAgIHN1cGVyKG9wdHMpO1xuICB9XG5cbiAgZ2V0VXJsRm9yUHJveHkgKHVybCkge1xuICAgIGlmICh1cmwgPT09ICcnKSB7XG4gICAgICB1cmwgPSAnLyc7XG4gICAgfVxuICAgIGNvbnN0IHByb3h5QmFzZSA9IGAke3RoaXMuc2NoZW1lfTovLyR7dGhpcy5zZXJ2ZXJ9OiR7dGhpcy5wb3J0fSR7dGhpcy5iYXNlfWA7XG4gICAgbGV0IHJlbWFpbmluZ1VybCA9ICcnO1xuICAgIGlmICgobmV3IFJlZ0V4cCgnXi8nKSkudGVzdCh1cmwpKSB7XG4gICAgICByZW1haW5pbmdVcmwgPSB1cmw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRGlkIG5vdCBrbm93IHdoYXQgdG8gZG8gd2l0aCB1cmwgJyR7dXJsfSdgKTtcbiAgICB9XG4gICAgcmVtYWluaW5nVXJsID0gcmVtYWluaW5nVXJsLnJlcGxhY2UoL1xcLyQvLCAnJyk7IC8vIGNhbid0IGhhdmUgdHJhaWxpbmcgc2xhc2hlc1xuICAgIHJldHVybiBwcm94eUJhc2UgKyByZW1haW5pbmdVcmw7XG4gIH1cbn1cblxuZXhwb3J0IHsgTm9TZXNzaW9uUHJveHkgfTtcbmV4cG9ydCBkZWZhdWx0IE5vU2Vzc2lvblByb3h5O1xuIl0sImZpbGUiOiJsaWIvbm8tc2Vzc2lvbi1wcm94eS5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
@@ -23,7 +23,7 @@ exports.updateProjectFile = updateProjectFile;
23
23
 
24
24
  require("source-map-support/register");
25
25
 
26
- var _appiumSupport = require("appium-support");
26
+ var _support = require("@appium/support");
27
27
 
28
28
  var _teen_process = require("teen_process");
29
29
 
@@ -97,11 +97,11 @@ function isTvOS(platformName) {
97
97
  }
98
98
 
99
99
  async function replaceInFile(file, find, replace) {
100
- let contents = await _appiumSupport.fs.readFile(file, 'utf8');
100
+ let contents = await _support.fs.readFile(file, 'utf8');
101
101
  let newContents = contents.replace(find, replace);
102
102
 
103
103
  if (newContents !== contents) {
104
- await _appiumSupport.fs.writeFile(file, newContents, 'utf8');
104
+ await _support.fs.writeFile(file, newContents, 'utf8');
105
105
  }
106
106
  }
107
107
 
@@ -109,7 +109,7 @@ async function updateProjectFile(agentPath, newBundleId) {
109
109
  let projectFilePath = _path.default.resolve(agentPath, PROJECT_FILE);
110
110
 
111
111
  try {
112
- await _appiumSupport.fs.copyFile(projectFilePath, `${projectFilePath}.old`);
112
+ await _support.fs.copyFile(projectFilePath, `${projectFilePath}.old`);
113
113
  await replaceInFile(projectFilePath, new RegExp(_lodash.default.escapeRegExp(_constants.WDA_RUNNER_BUNDLE_ID), 'g'), newBundleId);
114
114
 
115
115
  _logger.default.debug(`Successfully updated '${projectFilePath}' with bundle id '${newBundleId}'`);
@@ -124,11 +124,11 @@ async function resetProjectFile(agentPath) {
124
124
  const projectFilePath = _path.default.join(agentPath, PROJECT_FILE);
125
125
 
126
126
  try {
127
- if (!(await _appiumSupport.fs.exists(`${projectFilePath}.old`))) {
127
+ if (!(await _support.fs.exists(`${projectFilePath}.old`))) {
128
128
  return;
129
129
  }
130
130
 
131
- await _appiumSupport.fs.mv(`${projectFilePath}.old`, projectFilePath);
131
+ await _support.fs.mv(`${projectFilePath}.old`, projectFilePath);
132
132
 
133
133
  _logger.default.debug(`Successfully reset '${projectFilePath}' with bundle id '${_constants.WDA_RUNNER_BUNDLE_ID}'`);
134
134
  } catch (err) {
@@ -152,22 +152,22 @@ async function generateXcodeConfigFile(orgId, signingId) {
152
152
  const contents = `DEVELOPMENT_TEAM = ${orgId}
153
153
  CODE_SIGN_IDENTITY = ${signingId}
154
154
  `;
155
- const xcconfigPath = await _appiumSupport.tempDir.path('appium-temp.xcconfig');
155
+ const xcconfigPath = await _support.tempDir.path('appium-temp.xcconfig');
156
156
 
157
157
  _logger.default.debug(`Writing xcode config file to ${xcconfigPath}`);
158
158
 
159
- await _appiumSupport.fs.writeFile(xcconfigPath, contents, 'utf8');
159
+ await _support.fs.writeFile(xcconfigPath, contents, 'utf8');
160
160
  return xcconfigPath;
161
161
  }
162
162
 
163
163
  async function setXctestrunFile(deviceInfo, sdkVersion, bootstrapPath, wdaRemotePort) {
164
164
  const xctestrunFilePath = await getXctestrunFilePath(deviceInfo, sdkVersion, bootstrapPath);
165
- const xctestRunContent = await _appiumSupport.plist.parsePlistFile(xctestrunFilePath);
165
+ const xctestRunContent = await _support.plist.parsePlistFile(xctestrunFilePath);
166
166
  const updateWDAPort = getAdditionalRunContent(deviceInfo.platformName, wdaRemotePort);
167
167
 
168
168
  const newXctestRunContent = _lodash.default.merge(xctestRunContent, updateWDAPort);
169
169
 
170
- await _appiumSupport.plist.updatePlistFile(xctestrunFilePath, newXctestRunContent, true);
170
+ await _support.plist.updatePlistFile(xctestrunFilePath, newXctestRunContent, true);
171
171
  return xctestrunFilePath;
172
172
  }
173
173
 
@@ -176,7 +176,7 @@ function getAdditionalRunContent(platformName, wdaRemotePort) {
176
176
  return {
177
177
  [runner]: {
178
178
  EnvironmentVariables: {
179
- USE_PORT: wdaRemotePort
179
+ USE_PORT: `${wdaRemotePort}`
180
180
  }
181
181
  }
182
182
  };
@@ -187,7 +187,7 @@ async function getXctestrunFilePath(deviceInfo, sdkVersion, bootstrapPath) {
187
187
  const platformBased = [_path.default.resolve(bootstrapPath, `${deviceInfo.udid}_${deviceInfo.platformVersion}.xctestrun`), deviceInfo.platformVersion];
188
188
 
189
189
  for (const [filePath, version] of [sdkBased, platformBased]) {
190
- if (await _appiumSupport.fs.exists(filePath)) {
190
+ if (await _support.fs.exists(filePath)) {
191
191
  _logger.default.info(`Using '${filePath}' as xctestrun file`);
192
192
 
193
193
  return filePath;
@@ -195,8 +195,8 @@ async function getXctestrunFilePath(deviceInfo, sdkVersion, bootstrapPath) {
195
195
 
196
196
  const originalXctestrunFile = _path.default.resolve(bootstrapPath, getXctestrunFileName(deviceInfo, version));
197
197
 
198
- if (await _appiumSupport.fs.exists(originalXctestrunFile)) {
199
- await _appiumSupport.fs.copyFile(originalXctestrunFile, filePath);
198
+ if (await _support.fs.exists(originalXctestrunFile)) {
199
+ await _support.fs.copyFile(originalXctestrunFile, filePath);
200
200
 
201
201
  _logger.default.info(`Using '${filePath}' as xctestrun file copied by '${originalXctestrunFile}'`);
202
202
 
@@ -251,13 +251,13 @@ function randomInt(low, high) {
251
251
  async function getWDAUpgradeTimestamp() {
252
252
  const packageManifest = _path.default.resolve(ROOT_DIR, 'package.json');
253
253
 
254
- if (!(await _appiumSupport.fs.exists(packageManifest))) {
254
+ if (!(await _support.fs.exists(packageManifest))) {
255
255
  return null;
256
256
  }
257
257
 
258
258
  const {
259
259
  mtime
260
- } = await _appiumSupport.fs.stat(packageManifest);
260
+ } = await _support.fs.stat(packageManifest);
261
261
  return mtime.getTime();
262
262
  }
263
263
 
@@ -314,4 +314,4 @@ async function getPIDsListeningOnPort(port, filteringFunc = null) {
314
314
  }require('source-map-support').install();
315
315
 
316
316
 
317
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91dGlscy5qcyJdLCJuYW1lcyI6WyJST09UX0RJUiIsInBhdGgiLCJiYXNlbmFtZSIsIl9fZGlybmFtZSIsInJlc29sdmUiLCJwcm9jZXNzIiwiZW52IiwiTk9fUFJFQ09NUElMRSIsIlBST0pFQ1RfRklMRSIsImdldFBJRHNVc2luZ1BhdHRlcm4iLCJwYXR0ZXJuIiwiYXJncyIsInN0ZG91dCIsInNwbGl0IiwibWFwIiwieCIsInBhcnNlSW50IiwiZmlsdGVyIiwiXyIsImlzSW50ZWdlciIsImVyciIsImxvZyIsImRlYnVnIiwiam9pbiIsImNvZGUiLCJraWxsQXBwVXNpbmdQYXR0ZXJuIiwicGdyZXBQYXR0ZXJuIiwic2lnbmFscyIsInNpZ25hbCIsIm1hdGNoZWRQaWRzIiwiaXNFbXB0eSIsIm1lc3NhZ2UiLCJsYXN0IiwicGlkQ2hlY2tQcm9taXNlcyIsInBpZCIsInRoZW4iLCJjYXRjaCIsIkIiLCJhbGwiLCJldmVyeSIsIndhaXRNcyIsImludGVydmFsTXMiLCJpZ24iLCJpc1R2T1MiLCJwbGF0Zm9ybU5hbWUiLCJ0b0xvd2VyIiwiUExBVEZPUk1fTkFNRV9UVk9TIiwicmVwbGFjZUluRmlsZSIsImZpbGUiLCJmaW5kIiwicmVwbGFjZSIsImNvbnRlbnRzIiwiZnMiLCJyZWFkRmlsZSIsIm5ld0NvbnRlbnRzIiwid3JpdGVGaWxlIiwidXBkYXRlUHJvamVjdEZpbGUiLCJhZ2VudFBhdGgiLCJuZXdCdW5kbGVJZCIsInByb2plY3RGaWxlUGF0aCIsImNvcHlGaWxlIiwiUmVnRXhwIiwiZXNjYXBlUmVnRXhwIiwiV0RBX1JVTk5FUl9CVU5ETEVfSUQiLCJ3YXJuIiwicmVzZXRQcm9qZWN0RmlsZSIsImV4aXN0cyIsIm12Iiwic2V0UmVhbERldmljZVNlY3VyaXR5Iiwia2V5Y2hhaW5QYXRoIiwia2V5Y2hhaW5QYXNzd29yZCIsImdlbmVyYXRlWGNvZGVDb25maWdGaWxlIiwib3JnSWQiLCJzaWduaW5nSWQiLCJ4Y2NvbmZpZ1BhdGgiLCJ0ZW1wRGlyIiwic2V0WGN0ZXN0cnVuRmlsZSIsImRldmljZUluZm8iLCJzZGtWZXJzaW9uIiwiYm9vdHN0cmFwUGF0aCIsIndkYVJlbW90ZVBvcnQiLCJ4Y3Rlc3RydW5GaWxlUGF0aCIsImdldFhjdGVzdHJ1bkZpbGVQYXRoIiwieGN0ZXN0UnVuQ29udGVudCIsInBsaXN0IiwicGFyc2VQbGlzdEZpbGUiLCJ1cGRhdGVXREFQb3J0IiwiZ2V0QWRkaXRpb25hbFJ1bkNvbnRlbnQiLCJuZXdYY3Rlc3RSdW5Db250ZW50IiwibWVyZ2UiLCJ1cGRhdGVQbGlzdEZpbGUiLCJydW5uZXIiLCJFbnZpcm9ubWVudFZhcmlhYmxlcyIsIlVTRV9QT1JUIiwic2RrQmFzZWQiLCJ1ZGlkIiwicGxhdGZvcm1CYXNlZCIsInBsYXRmb3JtVmVyc2lvbiIsImZpbGVQYXRoIiwidmVyc2lvbiIsImluZm8iLCJvcmlnaW5hbFhjdGVzdHJ1bkZpbGUiLCJnZXRYY3Rlc3RydW5GaWxlTmFtZSIsImVycm9yQW5kVGhyb3ciLCJpc1JlYWxEZXZpY2UiLCJraWxsUHJvY2VzcyIsIm5hbWUiLCJwcm9jIiwiaXNSdW5uaW5nIiwic3RvcCIsImluY2x1ZGVzIiwicmFuZG9tSW50IiwibG93IiwiaGlnaCIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSIsImdldFdEQVVwZ3JhZGVUaW1lc3RhbXAiLCJwYWNrYWdlTWFuaWZlc3QiLCJtdGltZSIsInN0YXQiLCJnZXRUaW1lIiwicmVzZXRUZXN0UHJvY2Vzc2VzIiwiaXNTaW11bGF0b3IiLCJwcm9jZXNzUGF0dGVybnMiLCJwdXNoIiwiZ2V0UElEc0xpc3RlbmluZ09uUG9ydCIsInBvcnQiLCJmaWx0ZXJpbmdGdW5jIiwicmVzdWx0IiwidHJpbSIsImUiLCJzdGRlcnIiLCJpc0Z1bmN0aW9uIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsUUFBUSxHQUFHQyxjQUFLQyxR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QSxDQUFDLENBQUMzRyxJQUFGLEtBQVcsQ0FBZixFQUFrQjtBQUVoQixlQUFPLEtBQVA7QUFDRDs7QUFDRCxZQUFNMkcsQ0FBTjtBQUNEOztBQUNELFdBQU8sTUFBTUgsYUFBYSxDQUFDcEgsTUFBRCxDQUExQjtBQUNELEdBWlksQ0FBYjtBQWFEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZnMsIHRlbXBEaXIsIHBsaXN0IH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IFdEQV9SVU5ORVJfQlVORExFX0lELCBQTEFURk9STV9OQU1FX1RWT1MgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuXG5jb25zdCBST09UX0RJUiA9IHBhdGguYmFzZW5hbWUoX19kaXJuYW1lKSA9PT0gJ2xpYidcbiAgPyBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCBwcm9jZXNzLmVudi5OT19QUkVDT01QSUxFID8gJy4uJyA6ICcuLi8uLicpXG4gIDogX19kaXJuYW1lO1xuY29uc3QgUFJPSkVDVF9GSUxFID0gJ3Byb2plY3QucGJ4cHJvaic7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFBJRHNVc2luZ1BhdHRlcm4gKHBhdHRlcm4pIHtcbiAgY29uc3QgYXJncyA9IFtcbiAgICAnLWlmJywgLy8gY2FzZSBpbnNlbnNpdGl2ZSwgZnVsbCBjbWRsaW5lIG1hdGNoXG4gICAgcGF0dGVybixcbiAgXTtcbiAgdHJ5IHtcbiAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoJ3BncmVwJywgYXJncyk7XG4gICAgcmV0dXJuIHN0ZG91dC5zcGxpdCgvXFxzKy8pXG4gICAgICAubWFwKCh4KSA9PiBwYXJzZUludCh4LCAxMCkpXG4gICAgICAuZmlsdGVyKF8uaXNJbnRlZ2VyKVxuICAgICAgLm1hcCgoeCkgPT4gYCR7eH1gKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmRlYnVnKGAncGdyZXAgJHthcmdzLmpvaW4oJyAnKX0nIGRpZG4ndCBkZXRlY3QgYW55IG1hdGNoaW5nIHByb2Nlc3Nlcy4gUmV0dXJuIGNvZGU6ICR7ZXJyLmNvZGV9YCk7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGtpbGxBcHBVc2luZ1BhdHRlcm4gKHBncmVwUGF0dGVybikge1xuICBjb25zdCBzaWduYWxzID0gWzIsIDE1LCA5XTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2Ygc2lnbmFscykge1xuICAgIGNvbnN0IG1hdGNoZWRQaWRzID0gYXdhaXQgZ2V0UElEc1VzaW5nUGF0dGVybihwZ3JlcFBhdHRlcm4pO1xuICAgIGlmIChfLmlzRW1wdHkobWF0Y2hlZFBpZHMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGFyZ3MgPSBbYC0ke3NpZ25hbH1gLCAuLi5tYXRjaGVkUGlkc107XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWMoJ2tpbGwnLCBhcmdzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy5kZWJ1Zyhga2lsbCAke2FyZ3Muam9pbignICcpfSAtPiAke2Vyci5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBpZiAoc2lnbmFsID09PSBfLmxhc3Qoc2lnbmFscykpIHtcbiAgICAgIC8vIHRoZXJlIGlzIG5vIG5lZWQgdG8gd2FpdCBhZnRlciBTSUdLSUxMXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcGlkQ2hlY2tQcm9taXNlcyA9IG1hdGNoZWRQaWRzXG4gICAgICAgICAgLm1hcCgocGlkKSA9PiBleGVjKCdraWxsJywgWyctMCcsIHBpZF0pXG4gICAgICAgICAgICAvLyB0aGUgcHJvY2VzcyBpcyBzdGlsbCBhbGl2ZVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gZmFsc2UpXG4gICAgICAgICAgICAvLyB0aGUgcHJvY2VzcyBpcyBkZWFkXG4gICAgICAgICAgICAuY2F0Y2goKCkgPT4gdHJ1ZSlcbiAgICAgICAgICApO1xuICAgICAgICByZXR1cm4gKGF3YWl0IEIuYWxsKHBpZENoZWNrUHJvbWlzZXMpKVxuICAgICAgICAgIC5ldmVyeSgoeCkgPT4geCA9PT0gdHJ1ZSk7XG4gICAgICB9LCB7XG4gICAgICAgIHdhaXRNczogMTAwMCxcbiAgICAgICAgaW50ZXJ2YWxNczogMTAwLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfSBjYXRjaCAoaWduKSB7XG4gICAgICAvLyB0cnkgdGhlIG5leHQgc2lnbmFsXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtTmFtZSBpcyB0dk9TXG4gKiBAcGFyYW0ge3N0cmluZ30gcGxhdGZvcm1OYW1lIFRoZSBuYW1lIG9mIHRoZSBwbGF0b3JtXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtTmFtZSBpcyB0dk9TXG4gKi9cbmZ1bmN0aW9uIGlzVHZPUyAocGxhdGZvcm1OYW1lKSB7XG4gIHJldHVybiBfLnRvTG93ZXIocGxhdGZvcm1OYW1lKSA9PT0gXy50b0xvd2VyKFBMQVRGT1JNX05BTUVfVFZPUyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcGxhY2VJbkZpbGUgKGZpbGUsIGZpbmQsIHJlcGxhY2UpIHtcbiAgbGV0IGNvbnRlbnRzID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZSwgJ3V0ZjgnKTtcblxuICBsZXQgbmV3Q29udGVudHMgPSBjb250ZW50cy5yZXBsYWNlKGZpbmQsIHJlcGxhY2UpO1xuICBpZiAobmV3Q29udGVudHMgIT09IGNvbnRlbnRzKSB7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGZpbGUsIG5ld0NvbnRlbnRzLCAndXRmOCcpO1xuICB9XG59XG5cbi8qKlxuICogVXBkYXRlIFdlYkRyaXZlckFnZW50UnVubmVyIHByb2plY3QgYnVuZGxlIElEIHdpdGggbmV3QnVuZGxlSWQuXG4gKiBUaGlzIG1ldGhvZCBhc3N1bWVzIHByb2plY3QgZmlsZSBpcyBpbiB0aGUgY29ycmVjdCBzdGF0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhZ2VudFBhdGggLSBQYXRoIHRvIHRoZSAueGNvZGVwcm9qIGRpcmVjdG9yeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuZXdCdW5kbGVJZCB0aGUgbmV3IGJ1bmRsZSBJRCB1c2VkIHRvIHVwZGF0ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdXBkYXRlUHJvamVjdEZpbGUgKGFnZW50UGF0aCwgbmV3QnVuZGxlSWQpIHtcbiAgbGV0IHByb2plY3RGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShhZ2VudFBhdGgsIFBST0pFQ1RfRklMRSk7XG4gIHRyeSB7XG4gICAgLy8gQXNzdW1pbmcgcHJvamVjdEZpbGVQYXRoIGlzIGluIHRoZSBjb3JyZWN0IHN0YXRlLCBjcmVhdGUgLm9sZCBmcm9tIHByb2plY3RGaWxlUGF0aFxuICAgIGF3YWl0IGZzLmNvcHlGaWxlKHByb2plY3RGaWxlUGF0aCwgYCR7cHJvamVjdEZpbGVQYXRofS5vbGRgKTtcbiAgICBhd2FpdCByZXBsYWNlSW5GaWxlKHByb2plY3RGaWxlUGF0aCwgbmV3IFJlZ0V4cChfLmVzY2FwZVJlZ0V4cChXREFfUlVOTkVSX0JVTkRMRV9JRCksICdnJyksIG5ld0J1bmRsZUlkKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuICAgIGxvZy5kZWJ1ZyhgU3VjY2Vzc2Z1bGx5IHVwZGF0ZWQgJyR7cHJvamVjdEZpbGVQYXRofScgd2l0aCBidW5kbGUgaWQgJyR7bmV3QnVuZGxlSWR9J2ApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZGVidWcoYEVycm9yIHVwZGF0aW5nIHByb2plY3QgZmlsZTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICBsb2cud2FybihgVW5hYmxlIHRvIHVwZGF0ZSBwcm9qZWN0IGZpbGUgJyR7cHJvamVjdEZpbGVQYXRofScgd2l0aCBgICtcbiAgICAgIGBidW5kbGUgaWQgJyR7bmV3QnVuZGxlSWR9Jy4gV2ViRHJpdmVyQWdlbnQgbWF5IG5vdCBzdGFydGApO1xuICB9XG59XG5cbi8qKlxuICogUmVzZXQgV2ViRHJpdmVyQWdlbnRSdW5uZXIgcHJvamVjdCBidW5kbGUgSUQgdG8gY29ycmVjdCBzdGF0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhZ2VudFBhdGggLSBQYXRoIHRvIHRoZSAueGNvZGVwcm9qIGRpcmVjdG9yeS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzZXRQcm9qZWN0RmlsZSAoYWdlbnRQYXRoKSB7XG4gIGNvbnN0IHByb2plY3RGaWxlUGF0aCA9IHBhdGguam9pbihhZ2VudFBhdGgsIFBST0pFQ1RfRklMRSk7XG4gIHRyeSB7XG4gICAgLy8gcmVzdG9yZSBwcm9qZWN0RmlsZVBhdGggZnJvbSAub2xkIGZpbGVcbiAgICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhgJHtwcm9qZWN0RmlsZVBhdGh9Lm9sZGApKSB7XG4gICAgICByZXR1cm47IC8vIG5vIG5lZWQgdG8gcmVzZXRcbiAgICB9XG4gICAgYXdhaXQgZnMubXYoYCR7cHJvamVjdEZpbGVQYXRofS5vbGRgLCBwcm9qZWN0RmlsZVBhdGgpO1xuICAgIGxvZy5kZWJ1ZyhgU3VjY2Vzc2Z1bGx5IHJlc2V0ICcke3Byb2plY3RGaWxlUGF0aH0nIHdpdGggYnVuZGxlIGlkICcke1dEQV9SVU5ORVJfQlVORExFX0lEfSdgKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmRlYnVnKGBFcnJvciByZXNldHRpbmcgcHJvamVjdCBmaWxlOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIGxvZy53YXJuKGBVbmFibGUgdG8gcmVzZXQgcHJvamVjdCBmaWxlICcke3Byb2plY3RGaWxlUGF0aH0nIHdpdGggYCArXG4gICAgICBgYnVuZGxlIGlkICcke1dEQV9SVU5ORVJfQlVORExFX0lEfScuIFdlYkRyaXZlckFnZW50IGhhcyBiZWVuIGAgK1xuICAgICAgYG1vZGlmaWVkIGFuZCBub3QgcmV0dXJuZWQgdG8gdGhlIG9yaWdpbmFsIHN0YXRlLmApO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldFJlYWxEZXZpY2VTZWN1cml0eSAoa2V5Y2hhaW5QYXRoLCBrZXljaGFpblBhc3N3b3JkKSB7XG4gIGxvZy5kZWJ1ZygnU2V0dGluZyBzZWN1cml0eSBmb3IgaU9TIGRldmljZScpO1xuICBhd2FpdCBleGVjKCdzZWN1cml0eScsIFsnLXYnLCAnbGlzdC1rZXljaGFpbnMnLCAnLXMnLCBrZXljaGFpblBhdGhdKTtcbiAgYXdhaXQgZXhlYygnc2VjdXJpdHknLCBbJy12JywgJ3VubG9jay1rZXljaGFpbicsICctcCcsIGtleWNoYWluUGFzc3dvcmQsIGtleWNoYWluUGF0aF0pO1xuICBhd2FpdCBleGVjKCdzZWN1cml0eScsIFsnc2V0LWtleWNoYWluLXNldHRpbmdzJywgJy10JywgJzM2MDAnLCAnLWwnLCBrZXljaGFpblBhdGhdKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVYY29kZUNvbmZpZ0ZpbGUgKG9yZ0lkLCBzaWduaW5nSWQpIHtcbiAgbG9nLmRlYnVnKGBHZW5lcmF0aW5nIHhjb2RlIGNvbmZpZyBmaWxlIGZvciBvcmdJZCAnJHtvcmdJZH0nIGFuZCBzaWduaW5nSWQgYCArXG4gICAgICAgICAgICBgJyR7c2lnbmluZ0lkfSdgKTtcbiAgY29uc3QgY29udGVudHMgPSBgREVWRUxPUE1FTlRfVEVBTSA9ICR7b3JnSWR9XG5DT0RFX1NJR05fSURFTlRJVFkgPSAke3NpZ25pbmdJZH1cbmA7XG4gIGNvbnN0IHhjY29uZmlnUGF0aCA9IGF3YWl0IHRlbXBEaXIucGF0aCgnYXBwaXVtLXRlbXAueGNjb25maWcnKTtcbiAgbG9nLmRlYnVnKGBXcml0aW5nIHhjb2RlIGNvbmZpZyBmaWxlIHRvICR7eGNjb25maWdQYXRofWApO1xuICBhd2FpdCBmcy53cml0ZUZpbGUoeGNjb25maWdQYXRoLCBjb250ZW50cywgJ3V0ZjgnKTtcbiAgcmV0dXJuIHhjY29uZmlnUGF0aDtcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3RcbiAqIEB0eXBlZGVmIHtPYmplY3R9IERldmljZUluZm9cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpc1JlYWxEZXZpY2UgLSBFcXVhbHMgdG8gdHJ1ZSBpZiB0aGUgY3VycmVudCBkZXZpY2UgaXMgYSByZWFsIGRldmljZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHVkaWQgLSBUaGUgZGV2aWNlIFVESUQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGxhdGZvcm1WZXJzaW9uIC0gVGhlIHBsYXRmb3JtIHZlcnNpb24gb2YgT1MuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGxhdGZvcm1OYW1lIC0gVGhlIHBsYXRmb3JtIG5hbWUgb2YgaU9TLCB0dk9TXG4qL1xuLyoqXG4gKiBDcmVhdGVzIHhjdGVzdHJ1biBmaWxlIHBlciBkZXZpY2UgJiBwbGF0Zm9ybSB2ZXJzaW9uLlxuICogV2UgZXhwZWN0cyB0byBoYXZlIFdlYkRyaXZlckFnZW50UnVubmVyX2lwaG9uZW9zJHtzZGtWZXJzaW9ufHBsYXRmb3JtVmVyc2lvbn0tYXJtNjQueGN0ZXN0cnVuIGZvciByZWFsIGRldmljZVxuICogYW5kIFdlYkRyaXZlckFnZW50UnVubmVyX2lwaG9uZXNpbXVsYXRvciR7c2RrVmVyc2lvbnxwbGF0Zm9ybVZlcnNpb259LXg4Nl82NC54Y3Rlc3RydW4gZm9yIHNpbXVsYXRvciBsb2NhdGVkIEBib290c3RyYXBQYXRoXG4gKiBOZXdlciBYY29kZSAoWGNvZGUgMTAuMCBhdCBsZWFzdCkgZ2VuZXJhdGUgeGN0ZXN0cnVuIGZpbGUgZm9sbG93aW5nIHNka1ZlcnNpb24uXG4gKiBlLmcuIFhjb2RlIHdoaWNoIGhhcyBpT1MgU0RLIFZlcnNpb24gMTIuMiBnZW5lcmF0ZSBXZWJEcml2ZXJBZ2VudFJ1bm5lcl9pcGhvbmVzaW11bGF0b3IuMi14ODZfNjQueGN0ZXN0cnVuXG4gKiAgICAgIGV2ZW4gaWYgdGhlIGNhcCBoYXMgcGxhdGZvcm0gdmVyc2lvbiAxMS40XG4gKlxuICogQHBhcmFtIHtEZXZpY2VJbmZvfSBkZXZpY2VJbmZvXG4gKiBAcGFyYW0ge3N0cmluZ30gc2RrVmVyc2lvbiAtIFRoZSBYY29kZSBTREsgdmVyc2lvbiBvZiBPUy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBib290c3RyYXBQYXRoIC0gVGhlIGZvbGRlciBwYXRoIGNvbnRhaW5pbmcgeGN0ZXN0cnVuIGZpbGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gd2RhUmVtb3RlUG9ydCAtIFRoZSByZW1vdGUgcG9ydCBXREEgaXMgbGlzdGVuaW5nIG9uLlxuICogQHJldHVybiB7c3RyaW5nfSByZXR1cm5zIHhjdGVzdHJ1bkZpbGVQYXRoIGZvciBnaXZlbiBkZXZpY2VcbiAqIEB0aHJvd3MgaWYgV2ViRHJpdmVyQWdlbnRSdW5uZXJfaXBob25lb3Mke3Nka1ZlcnNpb258cGxhdGZvcm1WZXJzaW9ufS1hcm02NC54Y3Rlc3RydW4gZm9yIHJlYWwgZGV2aWNlXG4gKiBvciBXZWJEcml2ZXJBZ2VudFJ1bm5lcl9pcGhvbmVzaW11bGF0b3Ike3Nka1ZlcnNpb258cGxhdGZvcm1WZXJzaW9ufS14ODZfNjQueGN0ZXN0cnVuIGZvciBzaW11bGF0b3IgaXMgbm90IGZvdW5kIEBib290c3RyYXBQYXRoLFxuICogdGhlbiBpdCB3aWxsIHRocm93IGZpbGUgbm90IGZvdW5kIGV4Y2VwdGlvblxuICovXG5hc3luYyBmdW5jdGlvbiBzZXRYY3Rlc3RydW5GaWxlIChkZXZpY2VJbmZvLCBzZGtWZXJzaW9uLCBib290c3RyYXBQYXRoLCB3ZGFSZW1vdGVQb3J0KSB7XG4gIGNvbnN0IHhjdGVzdHJ1bkZpbGVQYXRoID0gYXdhaXQgZ2V0WGN0ZXN0cnVuRmlsZVBhdGgoZGV2aWNlSW5mbywgc2RrVmVyc2lvbiwgYm9vdHN0cmFwUGF0aCk7XG4gIGNvbnN0IHhjdGVzdFJ1bkNvbnRlbnQgPSBhd2FpdCBwbGlzdC5wYXJzZVBsaXN0RmlsZSh4Y3Rlc3RydW5GaWxlUGF0aCk7XG4gIGNvbnN0IHVwZGF0ZVdEQVBvcnQgPSBnZXRBZGRpdGlvbmFsUnVuQ29udGVudChkZXZpY2VJbmZvLnBsYXRmb3JtTmFtZSwgd2RhUmVtb3RlUG9ydCk7XG4gIGNvbnN0IG5ld1hjdGVzdFJ1bkNvbnRlbnQgPSBfLm1lcmdlKHhjdGVzdFJ1bkNvbnRlbnQsIHVwZGF0ZVdEQVBvcnQpO1xuICBhd2FpdCBwbGlzdC51cGRhdGVQbGlzdEZpbGUoeGN0ZXN0cnVuRmlsZVBhdGgsIG5ld1hjdGVzdFJ1bkNvbnRlbnQsIHRydWUpO1xuXG4gIHJldHVybiB4Y3Rlc3RydW5GaWxlUGF0aDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIFdEQSBvYmplY3Qgd2hpY2ggYXBwZW5kcyBleGlzdGluZyB4Y3Rlc3QgcnVubmVyIGNvbnRlbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwbGF0Zm9ybU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcGxhdGZvcm1cbiAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIC0gVGhlIFhjb2RlIFNESyB2ZXJzaW9uIG9mIE9TLlxuICogQHJldHVybiB7b2JqZWN0fSByZXR1cm5zIGEgcnVubmVyIG9iamVjdCB3aGljaCBoYXMgVVNFX1BPUlRcbiAqL1xuZnVuY3Rpb24gZ2V0QWRkaXRpb25hbFJ1bkNvbnRlbnQgKHBsYXRmb3JtTmFtZSwgd2RhUmVtb3RlUG9ydCkge1xuICBjb25zdCBydW5uZXIgPSBgV2ViRHJpdmVyQWdlbnRSdW5uZXIke2lzVHZPUyhwbGF0Zm9ybU5hbWUpID8gJ190dk9TJyA6ICcnfWA7XG5cbiAgcmV0dXJuIHtcbiAgICBbcnVubmVyXToge1xuICAgICAgRW52aXJvbm1lbnRWYXJpYWJsZXM6IHtcbiAgICAgICAgVVNFX1BPUlQ6IHdkYVJlbW90ZVBvcnRcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBwYXRoIG9mIHhjdGVzdHJ1biBpZiBpdCBleGlzdHNcbiAqIEBwYXJhbSB7RGV2aWNlSW5mb30gZGV2aWNlSW5mb1xuICogQHBhcmFtIHtzdHJpbmd9IHNka1ZlcnNpb24gLSBUaGUgWGNvZGUgU0RLIHZlcnNpb24gb2YgT1MuXG4gKiBAcGFyYW0ge3N0cmluZ30gYm9vdHN0cmFwUGF0aCAtIFRoZSBmb2xkZXIgcGF0aCBjb250YWluaW5nIHhjdGVzdHJ1biBmaWxlLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRYY3Rlc3RydW5GaWxlUGF0aCAoZGV2aWNlSW5mbywgc2RrVmVyc2lvbiwgYm9vdHN0cmFwUGF0aCkge1xuICAvLyBGaXJzdCB0cnkgdGhlIFNESyBwYXRoLCBmb3IgWGNvZGUgMTAgKGF0IGxlYXN0KVxuICBjb25zdCBzZGtCYXNlZCA9IFtcbiAgICBwYXRoLnJlc29sdmUoYm9vdHN0cmFwUGF0aCwgYCR7ZGV2aWNlSW5mby51ZGlkfV8ke3Nka1ZlcnNpb259LnhjdGVzdHJ1bmApLFxuICAgIHNka1ZlcnNpb24sXG4gIF07XG4gIC8vIE5leHQgdHJ5IFBsYXRmb3JtIHBhdGgsIGZvciBlYXJsaWVyIFhjb2RlIHZlcnNpb25zXG4gIGNvbnN0IHBsYXRmb3JtQmFzZWQgPSBbXG4gICAgcGF0aC5yZXNvbHZlKGJvb3RzdHJhcFBhdGgsIGAke2RldmljZUluZm8udWRpZH1fJHtkZXZpY2VJbmZvLnBsYXRmb3JtVmVyc2lvbn0ueGN0ZXN0cnVuYCksXG4gICAgZGV2aWNlSW5mby5wbGF0Zm9ybVZlcnNpb24sXG4gIF07XG5cbiAgZm9yIChjb25zdCBbZmlsZVBhdGgsIHZlcnNpb25dIG9mIFtzZGtCYXNlZCwgcGxhdGZvcm1CYXNlZF0pIHtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKGZpbGVQYXRoKSkge1xuICAgICAgbG9nLmluZm8oYFVzaW5nICcke2ZpbGVQYXRofScgYXMgeGN0ZXN0cnVuIGZpbGVgKTtcbiAgICAgIHJldHVybiBmaWxlUGF0aDtcbiAgICB9XG4gICAgY29uc3Qgb3JpZ2luYWxYY3Rlc3RydW5GaWxlID0gcGF0aC5yZXNvbHZlKGJvb3RzdHJhcFBhdGgsIGdldFhjdGVzdHJ1bkZpbGVOYW1lKGRldmljZUluZm8sIHZlcnNpb24pKTtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKG9yaWdpbmFsWGN0ZXN0cnVuRmlsZSkpIHtcbiAgICAgIC8vIElmIHRoaXMgaXMgZmlyc3QgdGltZSBydW4gZm9yIGdpdmVuIGRldmljZSwgdGhlbiBmaXJzdCBnZW5lcmF0ZSB4Y3Rlc3RydW4gZmlsZSBmb3IgZGV2aWNlLlxuICAgICAgLy8gV2UgbmVlZCB0byBoYXZlIGEgeGN0ZXN0cnVuIGZpbGUgKipwZXIgZGV2aWNlKiogYmVjYXVzZSB3ZSBjYW50IG5vdCBoYXZlIHNhbWUgd2RhIHBvcnQgZm9yIGFsbCBkZXZpY2VzLlxuICAgICAgYXdhaXQgZnMuY29weUZpbGUob3JpZ2luYWxYY3Rlc3RydW5GaWxlLCBmaWxlUGF0aCk7XG4gICAgICBsb2cuaW5mbyhgVXNpbmcgJyR7ZmlsZVBhdGh9JyBhcyB4Y3Rlc3RydW4gZmlsZSBjb3BpZWQgYnkgJyR7b3JpZ2luYWxYY3Rlc3RydW5GaWxlfSdgKTtcbiAgICAgIHJldHVybiBmaWxlUGF0aDtcbiAgICB9XG4gIH1cblxuICBsb2cuZXJyb3JBbmRUaHJvdyhgSWYgeW91IGFyZSB1c2luZyAndXNlWGN0ZXN0cnVuRmlsZScgY2FwYWJpbGl0eSB0aGVuIHlvdSBgICtcbiAgICBgbmVlZCB0byBoYXZlIGEgeGN0ZXN0cnVuIGZpbGUgKGV4cGVjdGVkOiBgICtcbiAgICBgJyR7cGF0aC5yZXNvbHZlKGJvb3RzdHJhcFBhdGgsIGdldFhjdGVzdHJ1bkZpbGVOYW1lKGRldmljZUluZm8sIHNka1ZlcnNpb24pKX0nKWApO1xufVxuXG5cbi8qKlxuICogUmV0dXJuIHRoZSBuYW1lIG9mIHhjdGVzdHJ1biBmaWxlXG4gKiBAcGFyYW0ge0RldmljZUluZm99IGRldmljZUluZm9cbiAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIC0gVGhlIFhjb2RlIFNESyB2ZXJzaW9uIG9mIE9TLlxuICogQHJldHVybiB7c3RyaW5nfSByZXR1cm5zIHhjdGVzdHJ1bkZpbGVQYXRoIGZvciBnaXZlbiBkZXZpY2VcbiAqL1xuZnVuY3Rpb24gZ2V0WGN0ZXN0cnVuRmlsZU5hbWUgKGRldmljZUluZm8sIHZlcnNpb24pIHtcbiAgcmV0dXJuIGlzVHZPUyhkZXZpY2VJbmZvLnBsYXRmb3JtTmFtZSlcbiAgICA/IGBXZWJEcml2ZXJBZ2VudFJ1bm5lcl90dk9TX2FwcGxldHYke2RldmljZUluZm8uaXNSZWFsRGV2aWNlID8gYG9zJHt2ZXJzaW9ufS1hcm02NGAgOiBgc2ltdWxhdG9yJHt2ZXJzaW9ufS14ODZfNjRgfS54Y3Rlc3RydW5gXG4gICAgOiBgV2ViRHJpdmVyQWdlbnRSdW5uZXJfaXBob25lJHtkZXZpY2VJbmZvLmlzUmVhbERldmljZSA/IGBvcyR7dmVyc2lvbn0tYXJtNjRgIDogYHNpbXVsYXRvciR7dmVyc2lvbn0teDg2XzY0YH0ueGN0ZXN0cnVuYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24ga2lsbFByb2Nlc3MgKG5hbWUsIHByb2MpIHtcbiAgaWYgKCFwcm9jIHx8ICFwcm9jLmlzUnVubmluZykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxvZy5pbmZvKGBTaHV0dGluZyBkb3duICcke25hbWV9JyBwcm9jZXNzIChwaWQgJyR7cHJvYy5wcm9jLnBpZH0nKWApO1xuXG4gIGxvZy5pbmZvKGBTZW5kaW5nICdTSUdURVJNJy4uLmApO1xuICB0cnkge1xuICAgIGF3YWl0IHByb2Muc3RvcCgnU0lHVEVSTScsIDEwMDApO1xuICAgIHJldHVybjtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKCFlcnIubWVzc2FnZS5pbmNsdWRlcyhgUHJvY2VzcyBkaWRuJ3QgZW5kIGFmdGVyYCkpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgbG9nLmRlYnVnKGAke25hbWV9IHByb2Nlc3MgZGlkIG5vdCBlbmQgaW4gYSB0aW1lbHkgZmFzaGlvbjogJyR7ZXJyLm1lc3NhZ2V9Jy5gKTtcbiAgfVxuXG4gIGxvZy5pbmZvKGBTZW5kaW5nICdTSUdLSUxMJy4uLmApO1xuICB0cnkge1xuICAgIGF3YWl0IHByb2Muc3RvcCgnU0lHS0lMTCcpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyLm1lc3NhZ2UuaW5jbHVkZXMoJ25vdCBjdXJyZW50bHkgcnVubmluZycpKSB7XG4gICAgICAvLyB0aGUgcHJvY2VzcyBlbmRlZCBidXQgZm9yIHNvbWUgcmVhc29uIHdlIHdlcmUgbm90IGluZm9ybWVkXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgcmFuZG9tIGludGVnZXIuXG4gKlxuICogQHJldHVybiB7bnVtYmVyfSBBIHJhbmRvbSBpbnRlZ2VyIG51bWJlciBpbiByYW5nZSBbbG93LCBoaWdodCkuIGBsb3dgYCBpcyBpbmNsdXNpdmUgYW5kIGBoaWdoYCBpcyBleGNsdXNpdmUuXG4gKi9cbmZ1bmN0aW9uIHJhbmRvbUludCAobG93LCBoaWdoKSB7XG4gIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoaGlnaCAtIGxvdykgKyBsb3cpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBXREEgdXBncmFkZSB0aW1lc3RhbXBcbiAqXG4gKiBAcmV0dXJuIHs/bnVtYmVyfSBUaGUgVU5JWCB0aW1lc3RhbXAgb2YgdGhlIHBhY2thZ2UgbWFuaWZlc3QuIFRoZSBtYW5pZmVzdCBvbmx5IGdldHMgbW9kaWZpZWQgb25cbiAqIHBhY2thZ2UgdXBncmFkZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCAoKSB7XG4gIGNvbnN0IHBhY2thZ2VNYW5pZmVzdCA9IHBhdGgucmVzb2x2ZShST09UX0RJUiwgJ3BhY2thZ2UuanNvbicpO1xuICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhwYWNrYWdlTWFuaWZlc3QpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3Qge210aW1lfSA9IGF3YWl0IGZzLnN0YXQocGFja2FnZU1hbmlmZXN0KTtcbiAgcmV0dXJuIG10aW1lLmdldFRpbWUoKTtcbn1cblxuLyoqXG4gKiBLaWxscyBydW5uaW5nIFhDVGVzdCBwcm9jZXNzZXMgZm9yIHRoZSBwYXJ0aWN1bGFyIGRldmljZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdWRpZCAtIFRoZSBkZXZpY2UgVURJRC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNTaW11bGF0b3IgLSBFcXVhbHMgdG8gdHJ1ZSBpZiB0aGUgY3VycmVudCBkZXZpY2UgaXMgYSBTaW11bGF0b3JcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzZXRUZXN0UHJvY2Vzc2VzICh1ZGlkLCBpc1NpbXVsYXRvcikge1xuICBjb25zdCBwcm9jZXNzUGF0dGVybnMgPSBbYHhjb2RlYnVpbGQuKiR7dWRpZH1gXTtcbiAgaWYgKGlzU2ltdWxhdG9yKSB7XG4gICAgcHJvY2Vzc1BhdHRlcm5zLnB1c2goYCR7dWRpZH0uKlhDVFJ1bm5lcmApO1xuICAgIC8vIFRoZSBwYXR0ZXJuIHRvIGZpbmQgaW4gY2FzZSBpZGIgd2FzIHVzZWRcbiAgICBwcm9jZXNzUGF0dGVybnMucHVzaChgeGN0ZXN0Lioke3VkaWR9YCk7XG4gIH1cbiAgbG9nLmRlYnVnKGBLaWxsaW5nIHJ1bm5pbmcgcHJvY2Vzc2VzICcke3Byb2Nlc3NQYXR0ZXJucy5qb2luKCcsICcpfScgZm9yIHRoZSBkZXZpY2UgJHt1ZGlkfS4uLmApO1xuICBhd2FpdCBCLmFsbChwcm9jZXNzUGF0dGVybnMubWFwKGtpbGxBcHBVc2luZ1BhdHRlcm4pKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIElEcyBvZiBwcm9jZXNzZXMgbGlzdGVuaW5nIG9uIHRoZSBwYXJ0aWN1bGFyIHN5c3RlbSBwb3J0LlxuICogSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBhcHBseSBhZGRpdGlvbmFsIGZpbHRlcmluZyBiYXNlZCBvbiB0aGVcbiAqIHByb2Nlc3MgY29tbWFuZCBsaW5lLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gcG9ydCAtIFRoZSBwb3J0IG51bWJlci5cbiAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBmaWx0ZXJpbmdGdW5jIC0gT3B0aW9uYWwgbGFtYmRhIGZ1bmN0aW9uLCB3aGljaFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlcyBjb21tYW5kIGxpbmUgc3RyaW5nIG9mIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3NcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuaW5nIG9uIGdpdmVuIHBvcnQsIGFuZCBpcyBleHBlY3RlZCB0byByZXR1cm5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWl0aGVyIHRydWUgb3IgZmFsc2UgdG8gaW5jbHVkZS9leGNsdWRlIHRoZSBjb3JyZXNwb25kaW5nIFBJRFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSByZXN1bHRpbmcgYXJyYXkuXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gLSB0aGUgbGlzdCBvZiBtYXRjaGVkIHByb2Nlc3MgaWRzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRQSURzTGlzdGVuaW5nT25Qb3J0IChwb3J0LCBmaWx0ZXJpbmdGdW5jID0gbnVsbCkge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgdHJ5IHtcbiAgICAvLyBUaGlzIG9ubHkgd29ya3Mgc2luY2UgTWFjIE9TIFggRWwgQ2FwaXRhblxuICAgIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYygnbHNvZicsIFsnLXRpJywgYHRjcDoke3BvcnR9YF0pO1xuICAgIHJlc3VsdC5wdXNoKC4uLihzdGRvdXQudHJpbSgpLnNwbGl0KC9cXG4rLykpKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChlLmNvZGUgIT09IDEpIHtcbiAgICAgIC8vIGNvZGUgMSBtZWFucyBubyBwcm9jZXNzZXMuIE90aGVyIGVycm9ycyBuZWVkIHJlcG9ydGluZ1xuICAgICAgbG9nLmRlYnVnKGBFcnJvciBnZXR0aW5nIHByb2Nlc3NlcyBsaXN0ZW5pbmcgb24gcG9ydCAnJHtwb3J0fSc6ICR7ZS5zdGRlcnIgfHwgZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaWYgKCFfLmlzRnVuY3Rpb24oZmlsdGVyaW5nRnVuYykpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHJldHVybiBhd2FpdCBCLmZpbHRlcihyZXN1bHQsIGFzeW5jIChwaWQpID0+IHtcbiAgICBsZXQgc3Rkb3V0O1xuICAgIHRyeSB7XG4gICAgICAoe3N0ZG91dH0gPSBhd2FpdCBleGVjKCdwcycsIFsnLXAnLCBwaWQsICctbycsICdjb21tYW5kJ10pKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5jb2RlID09PSAxKSB7XG4gICAgICAgIC8vIFRoZSBwcm9jZXNzIGRvZXMgbm90IGV4aXN0IGFueW1vcmUsIHRoZXJlJ3Mgbm90aGluZyB0byBmaWx0ZXJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGZpbHRlcmluZ0Z1bmMoc3Rkb3V0KTtcbiAgfSk7XG59XG5cbmV4cG9ydCB7IHVwZGF0ZVByb2plY3RGaWxlLCByZXNldFByb2plY3RGaWxlLCBzZXRSZWFsRGV2aWNlU2VjdXJpdHksXG4gIGdldEFkZGl0aW9uYWxSdW5Db250ZW50LCBnZXRYY3Rlc3RydW5GaWxlTmFtZSwgZ2VuZXJhdGVYY29kZUNvbmZpZ0ZpbGUsXG4gIHNldFhjdGVzdHJ1bkZpbGUsIGdldFhjdGVzdHJ1bkZpbGVQYXRoLCBraWxsUHJvY2VzcywgcmFuZG9tSW50LFxuICBnZXRXREFVcGdyYWRlVGltZXN0YW1wLCByZXNldFRlc3RQcm9jZXNzZXMsXG4gIGdldFBJRHNMaXN0ZW5pbmdPblBvcnQsIGtpbGxBcHBVc2luZ1BhdHRlcm4sIGlzVHZPUyxcbn07XG4iXSwiZmlsZSI6ImxpYi91dGlscy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
317
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91dGlscy5qcyJdLCJuYW1lcyI6WyJST09UX0RJUiIsInBhdGgiLCJiYXNlbmFtZSIsIl9fZGlybmFtZSIsInJlc29sdmUiLCJwcm9jZXNzIiwiZW52IiwiTk9fUFJFQ09NUElMRSIsIlBST0pFQ1RfRklMRSIsImdldFBJRHNVc2luZ1BhdHRlcm4iLCJwYXR0ZXJuIiwiYXJncyIsInN0ZG91dCIsInNwbGl0IiwibWFwIiwieCIsInBhcnNlSW50IiwiZmlsdGVyIiwiXyIsImlzSW50ZWdlciIsImVyciIsImxvZyIsImRlYnVnIiwiam9pbiIsImNvZGUiLCJraWxsQXBwVXNpbmdQYXR0ZXJuIiwicGdyZXBQYXR0ZXJuIiwic2lnbmFscyIsInNpZ25hbCIsIm1hdGNoZWRQaWRzIiwiaXNFbXB0eSIsIm1lc3NhZ2UiLCJsYXN0IiwicGlkQ2hlY2tQcm9taXNlcyIsInBpZCIsInRoZW4iLCJjYXRjaCIsIkIiLCJhbGwiLCJldmVyeSIsIndhaXRNcyIsImludGVydmFsTXMiLCJpZ24iLCJpc1R2T1MiLCJwbGF0Zm9ybU5hbWUiLCJ0b0xvd2VyIiwiUExBVEZPUk1fTkFNRV9UVk9TIiwicmVwbGFjZUluRmlsZSIsImZpbGUiLCJmaW5kIiwicmVwbGFjZSIsImNvbnRlbnRzIiwiZnMiLCJyZWFkRmlsZSIsIm5ld0NvbnRlbnRzIiwid3JpdGVGaWxlIiwidXBkYXRlUHJvamVjdEZpbGUiLCJhZ2VudFBhdGgiLCJuZXdCdW5kbGVJZCIsInByb2plY3RGaWxlUGF0aCIsImNvcHlGaWxlIiwiUmVnRXhwIiwiZXNjYXBlUmVnRXhwIiwiV0RBX1JVTk5FUl9CVU5ETEVfSUQiLCJ3YXJuIiwicmVzZXRQcm9qZWN0RmlsZSIsImV4aXN0cyIsIm12Iiwic2V0UmVhbERldmljZVNlY3VyaXR5Iiwia2V5Y2hhaW5QYXRoIiwia2V5Y2hhaW5QYXNzd29yZCIsImdlbmVyYXRlWGNvZGVDb25maWdGaWxlIiwib3JnSWQiLCJzaWduaW5nSWQiLCJ4Y2NvbmZpZ1BhdGgiLCJ0ZW1wRGlyIiwic2V0WGN0ZXN0cnVuRmlsZSIsImRldmljZUluZm8iLCJzZGtWZXJzaW9uIiwiYm9vdHN0cmFwUGF0aCIsIndkYVJlbW90ZVBvcnQiLCJ4Y3Rlc3RydW5GaWxlUGF0aCIsImdldFhjdGVzdHJ1bkZpbGVQYXRoIiwieGN0ZXN0UnVuQ29udGVudCIsInBsaXN0IiwicGFyc2VQbGlzdEZpbGUiLCJ1cGRhdGVXREFQb3J0IiwiZ2V0QWRkaXRpb25hbFJ1bkNvbnRlbnQiLCJuZXdYY3Rlc3RSdW5Db250ZW50IiwibWVyZ2UiLCJ1cGRhdGVQbGlzdEZpbGUiLCJydW5uZXIiLCJFbnZpcm9ubWVudFZhcmlhYmxlcyIsIlVTRV9QT1JUIiwic2RrQmFzZWQiLCJ1ZGlkIiwicGxhdGZvcm1CYXNlZCIsInBsYXRmb3JtVmVyc2lvbiIsImZpbGVQYXRoIiwidmVyc2lvbiIsImluZm8iLCJvcmlnaW5hbFhjdGVzdHJ1bkZpbGUiLCJnZXRYY3Rlc3RydW5GaWxlTmFtZSIsImVycm9yQW5kVGhyb3ciLCJpc1JlYWxEZXZpY2UiLCJraWxsUHJvY2VzcyIsIm5hbWUiLCJwcm9jIiwiaXNSdW5uaW5nIiwic3RvcCIsImluY2x1ZGVzIiwicmFuZG9tSW50IiwibG93IiwiaGlnaCIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSIsImdldFdEQVVwZ3JhZGVUaW1lc3RhbXAiLCJwYWNrYWdlTWFuaWZlc3QiLCJtdGltZSIsInN0YXQiLCJnZXRUaW1lIiwicmVzZXRUZXN0UHJvY2Vzc2VzIiwiaXNTaW11bGF0b3IiLCJwcm9jZXNzUGF0dGVybnMiLCJwdXNoIiwiZ2V0UElEc0xpc3RlbmluZ09uUG9ydCIsInBvcnQiLCJmaWx0ZXJpbmdGdW5jIiwicmVzdWx0IiwidHJpbSIsImUiLCJzdGRlcnIiLCJpc0Z1bmN0aW9uIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsUUFBUSxHQUFHQyxjQUFLQyxR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QUFDLENBQUMzRyxJQUFGLEtBQVcsQ0FBZixFQUFrQjtBQUVoQixlQUFPLEtBQVA7QUFDRDs7QUFDRCxZQUFNMkcsQ0FBTjtBQUNEOztBQUNELFdBQU8sTUFBTUgsYUFBYSxDQUFDcEgsTUFBRCxDQUExQjtBQUNELEdBWlksQ0FBYjtBQWFEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZnMsIHRlbXBEaXIsIHBsaXN0IH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBXREFfUlVOTkVSX0JVTkRMRV9JRCwgUExBVEZPUk1fTkFNRV9UVk9TIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcblxuY29uc3QgUk9PVF9ESVIgPSBwYXRoLmJhc2VuYW1lKF9fZGlybmFtZSkgPT09ICdsaWInXG4gID8gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgcHJvY2Vzcy5lbnYuTk9fUFJFQ09NUElMRSA/ICcuLicgOiAnLi4vLi4nKVxuICA6IF9fZGlybmFtZTtcbmNvbnN0IFBST0pFQ1RfRklMRSA9ICdwcm9qZWN0LnBieHByb2onO1xuXG5hc3luYyBmdW5jdGlvbiBnZXRQSURzVXNpbmdQYXR0ZXJuIChwYXR0ZXJuKSB7XG4gIGNvbnN0IGFyZ3MgPSBbXG4gICAgJy1pZicsIC8vIGNhc2UgaW5zZW5zaXRpdmUsIGZ1bGwgY21kbGluZSBtYXRjaFxuICAgIHBhdHRlcm4sXG4gIF07XG4gIHRyeSB7XG4gICAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBleGVjKCdwZ3JlcCcsIGFyZ3MpO1xuICAgIHJldHVybiBzdGRvdXQuc3BsaXQoL1xccysvKVxuICAgICAgLm1hcCgoeCkgPT4gcGFyc2VJbnQoeCwgMTApKVxuICAgICAgLmZpbHRlcihfLmlzSW50ZWdlcilcbiAgICAgIC5tYXAoKHgpID0+IGAke3h9YCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5kZWJ1ZyhgJ3BncmVwICR7YXJncy5qb2luKCcgJyl9JyBkaWRuJ3QgZGV0ZWN0IGFueSBtYXRjaGluZyBwcm9jZXNzZXMuIFJldHVybiBjb2RlOiAke2Vyci5jb2RlfWApO1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBraWxsQXBwVXNpbmdQYXR0ZXJuIChwZ3JlcFBhdHRlcm4pIHtcbiAgY29uc3Qgc2lnbmFscyA9IFsyLCAxNSwgOV07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIHNpZ25hbHMpIHtcbiAgICBjb25zdCBtYXRjaGVkUGlkcyA9IGF3YWl0IGdldFBJRHNVc2luZ1BhdHRlcm4ocGdyZXBQYXR0ZXJuKTtcbiAgICBpZiAoXy5pc0VtcHR5KG1hdGNoZWRQaWRzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhcmdzID0gW2AtJHtzaWduYWx9YCwgLi4ubWF0Y2hlZFBpZHNdO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKCdraWxsJywgYXJncyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2cuZGVidWcoYGtpbGwgJHthcmdzLmpvaW4oJyAnKX0gLT4gJHtlcnIubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgaWYgKHNpZ25hbCA9PT0gXy5sYXN0KHNpZ25hbHMpKSB7XG4gICAgICAvLyB0aGVyZSBpcyBubyBuZWVkIHRvIHdhaXQgYWZ0ZXIgU0lHS0lMTFxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBpZENoZWNrUHJvbWlzZXMgPSBtYXRjaGVkUGlkc1xuICAgICAgICAgIC5tYXAoKHBpZCkgPT4gZXhlYygna2lsbCcsIFsnLTAnLCBwaWRdKVxuICAgICAgICAgICAgLy8gdGhlIHByb2Nlc3MgaXMgc3RpbGwgYWxpdmVcbiAgICAgICAgICAgIC50aGVuKCgpID0+IGZhbHNlKVxuICAgICAgICAgICAgLy8gdGhlIHByb2Nlc3MgaXMgZGVhZFxuICAgICAgICAgICAgLmNhdGNoKCgpID0+IHRydWUpXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIChhd2FpdCBCLmFsbChwaWRDaGVja1Byb21pc2VzKSlcbiAgICAgICAgICAuZXZlcnkoKHgpID0+IHggPT09IHRydWUpO1xuICAgICAgfSwge1xuICAgICAgICB3YWl0TXM6IDEwMDAsXG4gICAgICAgIGludGVydmFsTXM6IDEwMCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2ggKGlnbikge1xuICAgICAgLy8gdHJ5IHRoZSBuZXh0IHNpZ25hbFxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJldHVybiB0cnVlIGlmIHRoZSBwbGF0Zm9ybU5hbWUgaXMgdHZPU1xuICogQHBhcmFtIHtzdHJpbmd9IHBsYXRmb3JtTmFtZSBUaGUgbmFtZSBvZiB0aGUgcGxhdG9ybVxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybiB0cnVlIGlmIHRoZSBwbGF0Zm9ybU5hbWUgaXMgdHZPU1xuICovXG5mdW5jdGlvbiBpc1R2T1MgKHBsYXRmb3JtTmFtZSkge1xuICByZXR1cm4gXy50b0xvd2VyKHBsYXRmb3JtTmFtZSkgPT09IF8udG9Mb3dlcihQTEFURk9STV9OQU1FX1RWT1MpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXBsYWNlSW5GaWxlIChmaWxlLCBmaW5kLCByZXBsYWNlKSB7XG4gIGxldCBjb250ZW50cyA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGUsICd1dGY4Jyk7XG5cbiAgbGV0IG5ld0NvbnRlbnRzID0gY29udGVudHMucmVwbGFjZShmaW5kLCByZXBsYWNlKTtcbiAgaWYgKG5ld0NvbnRlbnRzICE9PSBjb250ZW50cykge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlLCBuZXdDb250ZW50cywgJ3V0ZjgnKTtcbiAgfVxufVxuXG4vKipcbiAqIFVwZGF0ZSBXZWJEcml2ZXJBZ2VudFJ1bm5lciBwcm9qZWN0IGJ1bmRsZSBJRCB3aXRoIG5ld0J1bmRsZUlkLlxuICogVGhpcyBtZXRob2QgYXNzdW1lcyBwcm9qZWN0IGZpbGUgaXMgaW4gdGhlIGNvcnJlY3Qgc3RhdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYWdlbnRQYXRoIC0gUGF0aCB0byB0aGUgLnhjb2RlcHJvaiBkaXJlY3RvcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmV3QnVuZGxlSWQgdGhlIG5ldyBidW5kbGUgSUQgdXNlZCB0byB1cGRhdGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVByb2plY3RGaWxlIChhZ2VudFBhdGgsIG5ld0J1bmRsZUlkKSB7XG4gIGxldCBwcm9qZWN0RmlsZVBhdGggPSBwYXRoLnJlc29sdmUoYWdlbnRQYXRoLCBQUk9KRUNUX0ZJTEUpO1xuICB0cnkge1xuICAgIC8vIEFzc3VtaW5nIHByb2plY3RGaWxlUGF0aCBpcyBpbiB0aGUgY29ycmVjdCBzdGF0ZSwgY3JlYXRlIC5vbGQgZnJvbSBwcm9qZWN0RmlsZVBhdGhcbiAgICBhd2FpdCBmcy5jb3B5RmlsZShwcm9qZWN0RmlsZVBhdGgsIGAke3Byb2plY3RGaWxlUGF0aH0ub2xkYCk7XG4gICAgYXdhaXQgcmVwbGFjZUluRmlsZShwcm9qZWN0RmlsZVBhdGgsIG5ldyBSZWdFeHAoXy5lc2NhcGVSZWdFeHAoV0RBX1JVTk5FUl9CVU5ETEVfSUQpLCAnZycpLCBuZXdCdW5kbGVJZCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcbiAgICBsb2cuZGVidWcoYFN1Y2Nlc3NmdWxseSB1cGRhdGVkICcke3Byb2plY3RGaWxlUGF0aH0nIHdpdGggYnVuZGxlIGlkICcke25ld0J1bmRsZUlkfSdgKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmRlYnVnKGBFcnJvciB1cGRhdGluZyBwcm9qZWN0IGZpbGU6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgbG9nLndhcm4oYFVuYWJsZSB0byB1cGRhdGUgcHJvamVjdCBmaWxlICcke3Byb2plY3RGaWxlUGF0aH0nIHdpdGggYCArXG4gICAgICBgYnVuZGxlIGlkICcke25ld0J1bmRsZUlkfScuIFdlYkRyaXZlckFnZW50IG1heSBub3Qgc3RhcnRgKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc2V0IFdlYkRyaXZlckFnZW50UnVubmVyIHByb2plY3QgYnVuZGxlIElEIHRvIGNvcnJlY3Qgc3RhdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYWdlbnRQYXRoIC0gUGF0aCB0byB0aGUgLnhjb2RlcHJvaiBkaXJlY3RvcnkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc2V0UHJvamVjdEZpbGUgKGFnZW50UGF0aCkge1xuICBjb25zdCBwcm9qZWN0RmlsZVBhdGggPSBwYXRoLmpvaW4oYWdlbnRQYXRoLCBQUk9KRUNUX0ZJTEUpO1xuICB0cnkge1xuICAgIC8vIHJlc3RvcmUgcHJvamVjdEZpbGVQYXRoIGZyb20gLm9sZCBmaWxlXG4gICAgaWYgKCFhd2FpdCBmcy5leGlzdHMoYCR7cHJvamVjdEZpbGVQYXRofS5vbGRgKSkge1xuICAgICAgcmV0dXJuOyAvLyBubyBuZWVkIHRvIHJlc2V0XG4gICAgfVxuICAgIGF3YWl0IGZzLm12KGAke3Byb2plY3RGaWxlUGF0aH0ub2xkYCwgcHJvamVjdEZpbGVQYXRoKTtcbiAgICBsb2cuZGVidWcoYFN1Y2Nlc3NmdWxseSByZXNldCAnJHtwcm9qZWN0RmlsZVBhdGh9JyB3aXRoIGJ1bmRsZSBpZCAnJHtXREFfUlVOTkVSX0JVTkRMRV9JRH0nYCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5kZWJ1ZyhgRXJyb3IgcmVzZXR0aW5nIHByb2plY3QgZmlsZTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICBsb2cud2FybihgVW5hYmxlIHRvIHJlc2V0IHByb2plY3QgZmlsZSAnJHtwcm9qZWN0RmlsZVBhdGh9JyB3aXRoIGAgK1xuICAgICAgYGJ1bmRsZSBpZCAnJHtXREFfUlVOTkVSX0JVTkRMRV9JRH0nLiBXZWJEcml2ZXJBZ2VudCBoYXMgYmVlbiBgICtcbiAgICAgIGBtb2RpZmllZCBhbmQgbm90IHJldHVybmVkIHRvIHRoZSBvcmlnaW5hbCBzdGF0ZS5gKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzZXRSZWFsRGV2aWNlU2VjdXJpdHkgKGtleWNoYWluUGF0aCwga2V5Y2hhaW5QYXNzd29yZCkge1xuICBsb2cuZGVidWcoJ1NldHRpbmcgc2VjdXJpdHkgZm9yIGlPUyBkZXZpY2UnKTtcbiAgYXdhaXQgZXhlYygnc2VjdXJpdHknLCBbJy12JywgJ2xpc3Qta2V5Y2hhaW5zJywgJy1zJywga2V5Y2hhaW5QYXRoXSk7XG4gIGF3YWl0IGV4ZWMoJ3NlY3VyaXR5JywgWyctdicsICd1bmxvY2sta2V5Y2hhaW4nLCAnLXAnLCBrZXljaGFpblBhc3N3b3JkLCBrZXljaGFpblBhdGhdKTtcbiAgYXdhaXQgZXhlYygnc2VjdXJpdHknLCBbJ3NldC1rZXljaGFpbi1zZXR0aW5ncycsICctdCcsICczNjAwJywgJy1sJywga2V5Y2hhaW5QYXRoXSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlWGNvZGVDb25maWdGaWxlIChvcmdJZCwgc2lnbmluZ0lkKSB7XG4gIGxvZy5kZWJ1ZyhgR2VuZXJhdGluZyB4Y29kZSBjb25maWcgZmlsZSBmb3Igb3JnSWQgJyR7b3JnSWR9JyBhbmQgc2lnbmluZ0lkIGAgK1xuICAgICAgICAgICAgYCcke3NpZ25pbmdJZH0nYCk7XG4gIGNvbnN0IGNvbnRlbnRzID0gYERFVkVMT1BNRU5UX1RFQU0gPSAke29yZ0lkfVxuQ09ERV9TSUdOX0lERU5USVRZID0gJHtzaWduaW5nSWR9XG5gO1xuICBjb25zdCB4Y2NvbmZpZ1BhdGggPSBhd2FpdCB0ZW1wRGlyLnBhdGgoJ2FwcGl1bS10ZW1wLnhjY29uZmlnJyk7XG4gIGxvZy5kZWJ1ZyhgV3JpdGluZyB4Y29kZSBjb25maWcgZmlsZSB0byAke3hjY29uZmlnUGF0aH1gKTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKHhjY29uZmlnUGF0aCwgY29udGVudHMsICd1dGY4Jyk7XG4gIHJldHVybiB4Y2NvbmZpZ1BhdGg7XG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEZXZpY2VJbmZvXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaXNSZWFsRGV2aWNlIC0gRXF1YWxzIHRvIHRydWUgaWYgdGhlIGN1cnJlbnQgZGV2aWNlIGlzIGEgcmVhbCBkZXZpY2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1ZGlkIC0gVGhlIGRldmljZSBVRElELlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBsYXRmb3JtVmVyc2lvbiAtIFRoZSBwbGF0Zm9ybSB2ZXJzaW9uIG9mIE9TLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBsYXRmb3JtTmFtZSAtIFRoZSBwbGF0Zm9ybSBuYW1lIG9mIGlPUywgdHZPU1xuKi9cbi8qKlxuICogQ3JlYXRlcyB4Y3Rlc3RydW4gZmlsZSBwZXIgZGV2aWNlICYgcGxhdGZvcm0gdmVyc2lvbi5cbiAqIFdlIGV4cGVjdHMgdG8gaGF2ZSBXZWJEcml2ZXJBZ2VudFJ1bm5lcl9pcGhvbmVvcyR7c2RrVmVyc2lvbnxwbGF0Zm9ybVZlcnNpb259LWFybTY0LnhjdGVzdHJ1biBmb3IgcmVhbCBkZXZpY2VcbiAqIGFuZCBXZWJEcml2ZXJBZ2VudFJ1bm5lcl9pcGhvbmVzaW11bGF0b3Ike3Nka1ZlcnNpb258cGxhdGZvcm1WZXJzaW9ufS14ODZfNjQueGN0ZXN0cnVuIGZvciBzaW11bGF0b3IgbG9jYXRlZCBAYm9vdHN0cmFwUGF0aFxuICogTmV3ZXIgWGNvZGUgKFhjb2RlIDEwLjAgYXQgbGVhc3QpIGdlbmVyYXRlIHhjdGVzdHJ1biBmaWxlIGZvbGxvd2luZyBzZGtWZXJzaW9uLlxuICogZS5nLiBYY29kZSB3aGljaCBoYXMgaU9TIFNESyBWZXJzaW9uIDEyLjIgZ2VuZXJhdGUgV2ViRHJpdmVyQWdlbnRSdW5uZXJfaXBob25lc2ltdWxhdG9yLjIteDg2XzY0LnhjdGVzdHJ1blxuICogICAgICBldmVuIGlmIHRoZSBjYXAgaGFzIHBsYXRmb3JtIHZlcnNpb24gMTEuNFxuICpcbiAqIEBwYXJhbSB7RGV2aWNlSW5mb30gZGV2aWNlSW5mb1xuICogQHBhcmFtIHtzdHJpbmd9IHNka1ZlcnNpb24gLSBUaGUgWGNvZGUgU0RLIHZlcnNpb24gb2YgT1MuXG4gKiBAcGFyYW0ge3N0cmluZ30gYm9vdHN0cmFwUGF0aCAtIFRoZSBmb2xkZXIgcGF0aCBjb250YWluaW5nIHhjdGVzdHJ1biBmaWxlLlxuICogQHBhcmFtIHtzdHJpbmd9IHdkYVJlbW90ZVBvcnQgLSBUaGUgcmVtb3RlIHBvcnQgV0RBIGlzIGxpc3RlbmluZyBvbi5cbiAqIEByZXR1cm4ge3N0cmluZ30gcmV0dXJucyB4Y3Rlc3RydW5GaWxlUGF0aCBmb3IgZ2l2ZW4gZGV2aWNlXG4gKiBAdGhyb3dzIGlmIFdlYkRyaXZlckFnZW50UnVubmVyX2lwaG9uZW9zJHtzZGtWZXJzaW9ufHBsYXRmb3JtVmVyc2lvbn0tYXJtNjQueGN0ZXN0cnVuIGZvciByZWFsIGRldmljZVxuICogb3IgV2ViRHJpdmVyQWdlbnRSdW5uZXJfaXBob25lc2ltdWxhdG9yJHtzZGtWZXJzaW9ufHBsYXRmb3JtVmVyc2lvbn0teDg2XzY0LnhjdGVzdHJ1biBmb3Igc2ltdWxhdG9yIGlzIG5vdCBmb3VuZCBAYm9vdHN0cmFwUGF0aCxcbiAqIHRoZW4gaXQgd2lsbCB0aHJvdyBmaWxlIG5vdCBmb3VuZCBleGNlcHRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2V0WGN0ZXN0cnVuRmlsZSAoZGV2aWNlSW5mbywgc2RrVmVyc2lvbiwgYm9vdHN0cmFwUGF0aCwgd2RhUmVtb3RlUG9ydCkge1xuICBjb25zdCB4Y3Rlc3RydW5GaWxlUGF0aCA9IGF3YWl0IGdldFhjdGVzdHJ1bkZpbGVQYXRoKGRldmljZUluZm8sIHNka1ZlcnNpb24sIGJvb3RzdHJhcFBhdGgpO1xuICBjb25zdCB4Y3Rlc3RSdW5Db250ZW50ID0gYXdhaXQgcGxpc3QucGFyc2VQbGlzdEZpbGUoeGN0ZXN0cnVuRmlsZVBhdGgpO1xuICBjb25zdCB1cGRhdGVXREFQb3J0ID0gZ2V0QWRkaXRpb25hbFJ1bkNvbnRlbnQoZGV2aWNlSW5mby5wbGF0Zm9ybU5hbWUsIHdkYVJlbW90ZVBvcnQpO1xuICBjb25zdCBuZXdYY3Rlc3RSdW5Db250ZW50ID0gXy5tZXJnZSh4Y3Rlc3RSdW5Db250ZW50LCB1cGRhdGVXREFQb3J0KTtcbiAgYXdhaXQgcGxpc3QudXBkYXRlUGxpc3RGaWxlKHhjdGVzdHJ1bkZpbGVQYXRoLCBuZXdYY3Rlc3RSdW5Db250ZW50LCB0cnVlKTtcblxuICByZXR1cm4geGN0ZXN0cnVuRmlsZVBhdGg7XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBXREEgb2JqZWN0IHdoaWNoIGFwcGVuZHMgZXhpc3RpbmcgeGN0ZXN0IHJ1bm5lciBjb250ZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gcGxhdGZvcm1OYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHBsYXRmb3JtXG4gKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIFRoZSBYY29kZSBTREsgdmVyc2lvbiBvZiBPUy5cbiAqIEByZXR1cm4ge29iamVjdH0gcmV0dXJucyBhIHJ1bm5lciBvYmplY3Qgd2hpY2ggaGFzIFVTRV9QT1JUXG4gKi9cbmZ1bmN0aW9uIGdldEFkZGl0aW9uYWxSdW5Db250ZW50IChwbGF0Zm9ybU5hbWUsIHdkYVJlbW90ZVBvcnQpIHtcbiAgY29uc3QgcnVubmVyID0gYFdlYkRyaXZlckFnZW50UnVubmVyJHtpc1R2T1MocGxhdGZvcm1OYW1lKSA/ICdfdHZPUycgOiAnJ31gO1xuXG4gIHJldHVybiB7XG4gICAgW3J1bm5lcl06IHtcbiAgICAgIEVudmlyb25tZW50VmFyaWFibGVzOiB7XG4gICAgICAgIC8vIFVTRV9QT1JUIG11c3QgYmUgJ3N0cmluZydcbiAgICAgICAgVVNFX1BPUlQ6IGAke3dkYVJlbW90ZVBvcnR9YFxuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIHBhdGggb2YgeGN0ZXN0cnVuIGlmIGl0IGV4aXN0c1xuICogQHBhcmFtIHtEZXZpY2VJbmZvfSBkZXZpY2VJbmZvXG4gKiBAcGFyYW0ge3N0cmluZ30gc2RrVmVyc2lvbiAtIFRoZSBYY29kZSBTREsgdmVyc2lvbiBvZiBPUy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBib290c3RyYXBQYXRoIC0gVGhlIGZvbGRlciBwYXRoIGNvbnRhaW5pbmcgeGN0ZXN0cnVuIGZpbGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFhjdGVzdHJ1bkZpbGVQYXRoIChkZXZpY2VJbmZvLCBzZGtWZXJzaW9uLCBib290c3RyYXBQYXRoKSB7XG4gIC8vIEZpcnN0IHRyeSB0aGUgU0RLIHBhdGgsIGZvciBYY29kZSAxMCAoYXQgbGVhc3QpXG4gIGNvbnN0IHNka0Jhc2VkID0gW1xuICAgIHBhdGgucmVzb2x2ZShib290c3RyYXBQYXRoLCBgJHtkZXZpY2VJbmZvLnVkaWR9XyR7c2RrVmVyc2lvbn0ueGN0ZXN0cnVuYCksXG4gICAgc2RrVmVyc2lvbixcbiAgXTtcbiAgLy8gTmV4dCB0cnkgUGxhdGZvcm0gcGF0aCwgZm9yIGVhcmxpZXIgWGNvZGUgdmVyc2lvbnNcbiAgY29uc3QgcGxhdGZvcm1CYXNlZCA9IFtcbiAgICBwYXRoLnJlc29sdmUoYm9vdHN0cmFwUGF0aCwgYCR7ZGV2aWNlSW5mby51ZGlkfV8ke2RldmljZUluZm8ucGxhdGZvcm1WZXJzaW9ufS54Y3Rlc3RydW5gKSxcbiAgICBkZXZpY2VJbmZvLnBsYXRmb3JtVmVyc2lvbixcbiAgXTtcblxuICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgdmVyc2lvbl0gb2YgW3Nka0Jhc2VkLCBwbGF0Zm9ybUJhc2VkXSkge1xuICAgIGlmIChhd2FpdCBmcy5leGlzdHMoZmlsZVBhdGgpKSB7XG4gICAgICBsb2cuaW5mbyhgVXNpbmcgJyR7ZmlsZVBhdGh9JyBhcyB4Y3Rlc3RydW4gZmlsZWApO1xuICAgICAgcmV0dXJuIGZpbGVQYXRoO1xuICAgIH1cbiAgICBjb25zdCBvcmlnaW5hbFhjdGVzdHJ1bkZpbGUgPSBwYXRoLnJlc29sdmUoYm9vdHN0cmFwUGF0aCwgZ2V0WGN0ZXN0cnVuRmlsZU5hbWUoZGV2aWNlSW5mbywgdmVyc2lvbikpO1xuICAgIGlmIChhd2FpdCBmcy5leGlzdHMob3JpZ2luYWxYY3Rlc3RydW5GaWxlKSkge1xuICAgICAgLy8gSWYgdGhpcyBpcyBmaXJzdCB0aW1lIHJ1biBmb3IgZ2l2ZW4gZGV2aWNlLCB0aGVuIGZpcnN0IGdlbmVyYXRlIHhjdGVzdHJ1biBmaWxlIGZvciBkZXZpY2UuXG4gICAgICAvLyBXZSBuZWVkIHRvIGhhdmUgYSB4Y3Rlc3RydW4gZmlsZSAqKnBlciBkZXZpY2UqKiBiZWNhdXNlIHdlIGNhbnQgbm90IGhhdmUgc2FtZSB3ZGEgcG9ydCBmb3IgYWxsIGRldmljZXMuXG4gICAgICBhd2FpdCBmcy5jb3B5RmlsZShvcmlnaW5hbFhjdGVzdHJ1bkZpbGUsIGZpbGVQYXRoKTtcbiAgICAgIGxvZy5pbmZvKGBVc2luZyAnJHtmaWxlUGF0aH0nIGFzIHhjdGVzdHJ1biBmaWxlIGNvcGllZCBieSAnJHtvcmlnaW5hbFhjdGVzdHJ1bkZpbGV9J2ApO1xuICAgICAgcmV0dXJuIGZpbGVQYXRoO1xuICAgIH1cbiAgfVxuXG4gIGxvZy5lcnJvckFuZFRocm93KGBJZiB5b3UgYXJlIHVzaW5nICd1c2VYY3Rlc3RydW5GaWxlJyBjYXBhYmlsaXR5IHRoZW4geW91IGAgK1xuICAgIGBuZWVkIHRvIGhhdmUgYSB4Y3Rlc3RydW4gZmlsZSAoZXhwZWN0ZWQ6IGAgK1xuICAgIGAnJHtwYXRoLnJlc29sdmUoYm9vdHN0cmFwUGF0aCwgZ2V0WGN0ZXN0cnVuRmlsZU5hbWUoZGV2aWNlSW5mbywgc2RrVmVyc2lvbikpfScpYCk7XG59XG5cblxuLyoqXG4gKiBSZXR1cm4gdGhlIG5hbWUgb2YgeGN0ZXN0cnVuIGZpbGVcbiAqIEBwYXJhbSB7RGV2aWNlSW5mb30gZGV2aWNlSW5mb1xuICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSBUaGUgWGNvZGUgU0RLIHZlcnNpb24gb2YgT1MuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHJldHVybnMgeGN0ZXN0cnVuRmlsZVBhdGggZm9yIGdpdmVuIGRldmljZVxuICovXG5mdW5jdGlvbiBnZXRYY3Rlc3RydW5GaWxlTmFtZSAoZGV2aWNlSW5mbywgdmVyc2lvbikge1xuICByZXR1cm4gaXNUdk9TKGRldmljZUluZm8ucGxhdGZvcm1OYW1lKVxuICAgID8gYFdlYkRyaXZlckFnZW50UnVubmVyX3R2T1NfYXBwbGV0diR7ZGV2aWNlSW5mby5pc1JlYWxEZXZpY2UgPyBgb3Mke3ZlcnNpb259LWFybTY0YCA6IGBzaW11bGF0b3Ike3ZlcnNpb259LXg4Nl82NGB9LnhjdGVzdHJ1bmBcbiAgICA6IGBXZWJEcml2ZXJBZ2VudFJ1bm5lcl9pcGhvbmUke2RldmljZUluZm8uaXNSZWFsRGV2aWNlID8gYG9zJHt2ZXJzaW9ufS1hcm02NGAgOiBgc2ltdWxhdG9yJHt2ZXJzaW9ufS14ODZfNjRgfS54Y3Rlc3RydW5gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBraWxsUHJvY2VzcyAobmFtZSwgcHJvYykge1xuICBpZiAoIXByb2MgfHwgIXByb2MuaXNSdW5uaW5nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbG9nLmluZm8oYFNodXR0aW5nIGRvd24gJyR7bmFtZX0nIHByb2Nlc3MgKHBpZCAnJHtwcm9jLnByb2MucGlkfScpYCk7XG5cbiAgbG9nLmluZm8oYFNlbmRpbmcgJ1NJR1RFUk0nLi4uYCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgcHJvYy5zdG9wKCdTSUdURVJNJywgMTAwMCk7XG4gICAgcmV0dXJuO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoIWVyci5tZXNzYWdlLmluY2x1ZGVzKGBQcm9jZXNzIGRpZG4ndCBlbmQgYWZ0ZXJgKSkge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYCR7bmFtZX0gcHJvY2VzcyBkaWQgbm90IGVuZCBpbiBhIHRpbWVseSBmYXNoaW9uOiAnJHtlcnIubWVzc2FnZX0nLmApO1xuICB9XG5cbiAgbG9nLmluZm8oYFNlbmRpbmcgJ1NJR0tJTEwnLi4uYCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgcHJvYy5zdG9wKCdTSUdLSUxMJyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIubWVzc2FnZS5pbmNsdWRlcygnbm90IGN1cnJlbnRseSBydW5uaW5nJykpIHtcbiAgICAgIC8vIHRoZSBwcm9jZXNzIGVuZGVkIGJ1dCBmb3Igc29tZSByZWFzb24gd2Ugd2VyZSBub3QgaW5mb3JtZWRcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSByYW5kb20gaW50ZWdlci5cbiAqXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEEgcmFuZG9tIGludGVnZXIgbnVtYmVyIGluIHJhbmdlIFtsb3csIGhpZ2h0KS4gYGxvd2BgIGlzIGluY2x1c2l2ZSBhbmQgYGhpZ2hgIGlzIGV4Y2x1c2l2ZS5cbiAqL1xuZnVuY3Rpb24gcmFuZG9tSW50IChsb3csIGhpZ2gpIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChoaWdoIC0gbG93KSArIGxvdyk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIFdEQSB1cGdyYWRlIHRpbWVzdGFtcFxuICpcbiAqIEByZXR1cm4gez9udW1iZXJ9IFRoZSBVTklYIHRpbWVzdGFtcCBvZiB0aGUgcGFja2FnZSBtYW5pZmVzdC4gVGhlIG1hbmlmZXN0IG9ubHkgZ2V0cyBtb2RpZmllZCBvblxuICogcGFja2FnZSB1cGdyYWRlLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRXREFVcGdyYWRlVGltZXN0YW1wICgpIHtcbiAgY29uc3QgcGFja2FnZU1hbmlmZXN0ID0gcGF0aC5yZXNvbHZlKFJPT1RfRElSLCAncGFja2FnZS5qc29uJyk7XG4gIGlmICghYXdhaXQgZnMuZXhpc3RzKHBhY2thZ2VNYW5pZmVzdCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCB7bXRpbWV9ID0gYXdhaXQgZnMuc3RhdChwYWNrYWdlTWFuaWZlc3QpO1xuICByZXR1cm4gbXRpbWUuZ2V0VGltZSgpO1xufVxuXG4vKipcbiAqIEtpbGxzIHJ1bm5pbmcgWENUZXN0IHByb2Nlc3NlcyBmb3IgdGhlIHBhcnRpY3VsYXIgZGV2aWNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1ZGlkIC0gVGhlIGRldmljZSBVRElELlxuICogQHBhcmFtIHtib29sZWFufSBpc1NpbXVsYXRvciAtIEVxdWFscyB0byB0cnVlIGlmIHRoZSBjdXJyZW50IGRldmljZSBpcyBhIFNpbXVsYXRvclxuICovXG5hc3luYyBmdW5jdGlvbiByZXNldFRlc3RQcm9jZXNzZXMgKHVkaWQsIGlzU2ltdWxhdG9yKSB7XG4gIGNvbnN0IHByb2Nlc3NQYXR0ZXJucyA9IFtgeGNvZGVidWlsZC4qJHt1ZGlkfWBdO1xuICBpZiAoaXNTaW11bGF0b3IpIHtcbiAgICBwcm9jZXNzUGF0dGVybnMucHVzaChgJHt1ZGlkfS4qWENUUnVubmVyYCk7XG4gICAgLy8gVGhlIHBhdHRlcm4gdG8gZmluZCBpbiBjYXNlIGlkYiB3YXMgdXNlZFxuICAgIHByb2Nlc3NQYXR0ZXJucy5wdXNoKGB4Y3Rlc3QuKiR7dWRpZH1gKTtcbiAgfVxuICBsb2cuZGVidWcoYEtpbGxpbmcgcnVubmluZyBwcm9jZXNzZXMgJyR7cHJvY2Vzc1BhdHRlcm5zLmpvaW4oJywgJyl9JyBmb3IgdGhlIGRldmljZSAke3VkaWR9Li4uYCk7XG4gIGF3YWl0IEIuYWxsKHByb2Nlc3NQYXR0ZXJucy5tYXAoa2lsbEFwcFVzaW5nUGF0dGVybikpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgSURzIG9mIHByb2Nlc3NlcyBsaXN0ZW5pbmcgb24gdGhlIHBhcnRpY3VsYXIgc3lzdGVtIHBvcnQuXG4gKiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGFwcGx5IGFkZGl0aW9uYWwgZmlsdGVyaW5nIGJhc2VkIG9uIHRoZVxuICogcHJvY2VzcyBjb21tYW5kIGxpbmUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBwb3J0IC0gVGhlIHBvcnQgbnVtYmVyLlxuICogQHBhcmFtIHs/RnVuY3Rpb259IGZpbHRlcmluZ0Z1bmMgLSBPcHRpb25hbCBsYW1iZGEgZnVuY3Rpb24sIHdoaWNoXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVzIGNvbW1hbmQgbGluZSBzdHJpbmcgb2YgdGhlIHBhcnRpY3VsYXIgcHJvY2Vzc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5pbmcgb24gZ2l2ZW4gcG9ydCwgYW5kIGlzIGV4cGVjdGVkIHRvIHJldHVyblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlaXRoZXIgdHJ1ZSBvciBmYWxzZSB0byBpbmNsdWRlL2V4Y2x1ZGUgdGhlIGNvcnJlc3BvbmRpbmcgUElEXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIHJlc3VsdGluZyBhcnJheS5cbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSAtIHRoZSBsaXN0IG9mIG1hdGNoZWQgcHJvY2VzcyBpZHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFBJRHNMaXN0ZW5pbmdPblBvcnQgKHBvcnQsIGZpbHRlcmluZ0Z1bmMgPSBudWxsKSB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICB0cnkge1xuICAgIC8vIFRoaXMgb25seSB3b3JrcyBzaW5jZSBNYWMgT1MgWCBFbCBDYXBpdGFuXG4gICAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBleGVjKCdsc29mJywgWyctdGknLCBgdGNwOiR7cG9ydH1gXSk7XG4gICAgcmVzdWx0LnB1c2goLi4uKHN0ZG91dC50cmltKCkuc3BsaXQoL1xcbisvKSkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGUuY29kZSAhPT0gMSkge1xuICAgICAgLy8gY29kZSAxIG1lYW5zIG5vIHByb2Nlc3Nlcy4gT3RoZXIgZXJyb3JzIG5lZWQgcmVwb3J0aW5nXG4gICAgICBsb2cuZGVidWcoYEVycm9yIGdldHRpbmcgcHJvY2Vzc2VzIGxpc3RlbmluZyBvbiBwb3J0ICcke3BvcnR9JzogJHtlLnN0ZGVyciB8fCBlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBpZiAoIV8uaXNGdW5jdGlvbihmaWx0ZXJpbmdGdW5jKSkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IEIuZmlsdGVyKHJlc3VsdCwgYXN5bmMgKHBpZCkgPT4ge1xuICAgIGxldCBzdGRvdXQ7XG4gICAgdHJ5IHtcbiAgICAgICh7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoJ3BzJywgWyctcCcsIHBpZCwgJy1vJywgJ2NvbW1hbmQnXSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlLmNvZGUgPT09IDEpIHtcbiAgICAgICAgLy8gVGhlIHByb2Nlc3MgZG9lcyBub3QgZXhpc3QgYW55bW9yZSwgdGhlcmUncyBub3RoaW5nIHRvIGZpbHRlclxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZmlsdGVyaW5nRnVuYyhzdGRvdXQpO1xuICB9KTtcbn1cblxuZXhwb3J0IHsgdXBkYXRlUHJvamVjdEZpbGUsIHJlc2V0UHJvamVjdEZpbGUsIHNldFJlYWxEZXZpY2VTZWN1cml0eSxcbiAgZ2V0QWRkaXRpb25hbFJ1bkNvbnRlbnQsIGdldFhjdGVzdHJ1bkZpbGVOYW1lLCBnZW5lcmF0ZVhjb2RlQ29uZmlnRmlsZSxcbiAgc2V0WGN0ZXN0cnVuRmlsZSwgZ2V0WGN0ZXN0cnVuRmlsZVBhdGgsIGtpbGxQcm9jZXNzLCByYW5kb21JbnQsXG4gIGdldFdEQVVwZ3JhZGVUaW1lc3RhbXAsIHJlc2V0VGVzdFByb2Nlc3NlcyxcbiAgZ2V0UElEc0xpc3RlbmluZ09uUG9ydCwga2lsbEFwcFVzaW5nUGF0dGVybiwgaXNUdk9TLFxufTtcbiJdLCJmaWxlIjoibGliL3V0aWxzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=