appium-webdriveragent 3.16.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.
- package/Scripts/build-webdriveragent.js +1 -1
- package/Scripts/fetch-prebuilt-wda.js +1 -1
- package/WebDriverAgent.xcodeproj/project.xcworkspace/xcuserdata/elf.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/WebDriverAgentLib/Commands/FBAlertViewCommands.m +6 -6
- package/WebDriverAgentLib/FBAlert.m +1 -0
- package/WebDriverAgentLib/Utilities/FBScreen.m +3 -1
- package/WebDriverAgentRunner-Runner.app.zip +0 -0
- package/WebDriverAgentTests/IntegrationTests/FBAlertTests.m +5 -0
- package/WebDriverAgentTests/IntegrationTests/FBAppiumMultiTouchActionsIntegrationTests.m +7 -0
- package/WebDriverAgentTests/IntegrationTests/FBAppiumTouchActionsIntegrationTests.m +19 -0
- package/WebDriverAgentTests/IntegrationTests/FBElementScreenshotTests.m +4 -0
- package/WebDriverAgentTests/IntegrationTests/FBElementSwipingTests.m +71 -6
- package/WebDriverAgentTests/IntegrationTests/FBElementVisibilityTests.m +3 -1
- package/WebDriverAgentTests/IntegrationTests/FBForceTouchTests.m +6 -0
- package/WebDriverAgentTests/IntegrationTests/FBIntegrationTestCase.m +2 -1
- package/WebDriverAgentTests/IntegrationTests/FBKeyboardTests.m +19 -0
- package/WebDriverAgentTests/IntegrationTests/FBW3CTouchActionsIntegrationTests.m +15 -0
- package/WebDriverAgentTests/IntegrationTests/XCUIApplicationHelperTests.m +1 -1
- package/WebDriverAgentTests/IntegrationTests/XCUIElementFBFindTests.m +1 -1
- package/build/index.js +6 -4
- package/build/lib/check-dependencies.js +4 -4
- package/build/lib/constants.js +1 -1
- package/build/lib/logger.js +3 -3
- package/build/lib/no-session-proxy.js +3 -3
- package/build/lib/utils.js +25 -25
- package/build/lib/webdriveragent.js +17 -17
- package/build/lib/xcodebuild.js +5 -5
- package/lib/check-dependencies.js +1 -1
- package/lib/logger.js +1 -1
- package/lib/no-session-proxy.js +1 -1
- package/lib/utils.js +1 -1
- package/lib/webdriveragent.js +2 -2
- package/lib/xcodebuild.js +1 -1
- package/package.json +10 -11
- package/PrivateHeaders/.DS_Store +0 -0
- package/WebDriverAgentLib/.DS_Store +0 -0
- package/WebDriverAgentLib/Utilities/LRUCache/.DS_Store +0 -0
- package/WebDriverAgentLib/Vendor/.DS_Store +0 -0
- package/WebDriverAgentRunner/.DS_Store +0 -0
- package/WebDriverAgentTests/IntegrationApp/Resources/.DS_Store +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const path = require('path');
|
|
2
2
|
const os = require('os');
|
|
3
3
|
const { asyncify } = require('asyncbox');
|
|
4
|
-
const { logger, fs, mkdirp, zip } = require('appium
|
|
4
|
+
const { logger, fs, mkdirp, zip } = require('@appium/support');
|
|
5
5
|
const { exec } = require('teen_process');
|
|
6
6
|
const xcode = require('appium-xcode');
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const path = require('path');
|
|
2
2
|
const axios = require('axios');
|
|
3
3
|
const { asyncify } = require('asyncbox');
|
|
4
|
-
const { logger, fs, mkdirp, net } = require('appium
|
|
4
|
+
const { logger, fs, mkdirp, net } = require('@appium/support');
|
|
5
5
|
const _ = require('lodash');
|
|
6
6
|
const B = require('bluebird');
|
|
7
7
|
|
|
Binary file
|
|
@@ -38,8 +38,8 @@
|
|
|
38
38
|
|
|
39
39
|
+ (id<FBResponsePayload>)handleAlertGetTextCommand:(FBRouteRequest *)request
|
|
40
40
|
{
|
|
41
|
-
|
|
42
|
-
NSString *alertText = [FBAlert alertWithApplication:
|
|
41
|
+
FBApplication *application = request.session.activeApplication ?: FBApplication.fb_activeApplication;
|
|
42
|
+
NSString *alertText = [FBAlert alertWithApplication:application].text;
|
|
43
43
|
if (!alertText) {
|
|
44
44
|
return FBResponseWithStatus([FBCommandStatus noAlertOpenErrorWithMessage:nil
|
|
45
45
|
traceback:nil]);
|
|
@@ -73,9 +73,9 @@
|
|
|
73
73
|
|
|
74
74
|
+ (id<FBResponsePayload>)handleAlertAcceptCommand:(FBRouteRequest *)request
|
|
75
75
|
{
|
|
76
|
-
|
|
76
|
+
FBApplication *application = request.session.activeApplication ?: FBApplication.fb_activeApplication;
|
|
77
77
|
NSString *name = request.arguments[@"name"];
|
|
78
|
-
FBAlert *alert = [FBAlert alertWithApplication:
|
|
78
|
+
FBAlert *alert = [FBAlert alertWithApplication:application];
|
|
79
79
|
NSError *error;
|
|
80
80
|
|
|
81
81
|
if (!alert.isPresent) {
|
|
@@ -96,9 +96,9 @@
|
|
|
96
96
|
|
|
97
97
|
+ (id<FBResponsePayload>)handleAlertDismissCommand:(FBRouteRequest *)request
|
|
98
98
|
{
|
|
99
|
-
|
|
99
|
+
FBApplication *application = request.session.activeApplication ?: FBApplication.fb_activeApplication;
|
|
100
100
|
NSString *name = request.arguments[@"name"];
|
|
101
|
-
FBAlert *alert = [FBAlert alertWithApplication:
|
|
101
|
+
FBAlert *alert = [FBAlert alertWithApplication:application];
|
|
102
102
|
NSError *error;
|
|
103
103
|
|
|
104
104
|
if (!alert.isPresent) {
|
|
@@ -35,7 +35,9 @@
|
|
|
35
35
|
if (!mainStatusBar || (expectVisibleBar && !mainStatusBar.fb_isVisible)) {
|
|
36
36
|
return CGSizeZero;
|
|
37
37
|
}
|
|
38
|
-
|
|
38
|
+
CGSize result = mainStatusBar.frame.size;
|
|
39
|
+
// Workaround for https://github.com/appium/appium/issues/15961
|
|
40
|
+
return CGSizeMake(MAX(result.width, result.height), MIN(result.width, result.height));
|
|
39
41
|
}
|
|
40
42
|
|
|
41
43
|
@end
|
|
Binary file
|
|
@@ -164,6 +164,11 @@
|
|
|
164
164
|
FBAssertWaitTillBecomesTrue(alert.isPresent);
|
|
165
165
|
|
|
166
166
|
XCTAssertTrue([alert.text containsString:@"Would Like to Access Your Photos"]);
|
|
167
|
+
// iOS 15 has different UI flow
|
|
168
|
+
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"15.0")) {
|
|
169
|
+
[[FBAlert alertWithApplication:self.testedApplication] dismissWithError:nil];
|
|
170
|
+
[self.testedApplication.buttons[@"Cancel"] tap];
|
|
171
|
+
}
|
|
167
172
|
}
|
|
168
173
|
|
|
169
174
|
- (void)testGPSAccessAlert
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
#import "FBIntegrationTestCase.h"
|
|
13
13
|
|
|
14
|
+
#import "FBMacros.h"
|
|
14
15
|
#import "XCUIElement.h"
|
|
15
16
|
#import "XCUIApplication+FBTouchAction.h"
|
|
16
17
|
#import "FBTestMacros.h"
|
|
@@ -132,6 +133,12 @@
|
|
|
132
133
|
|
|
133
134
|
- (void)testMultiTouchWithMultiTaps
|
|
134
135
|
{
|
|
136
|
+
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"15.0")) {
|
|
137
|
+
// Does not work on iOS 15.
|
|
138
|
+
// It tapped two times, but one was touch count was one. Not two finguer taps.
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
|
|
135
142
|
XCUIElement *touchableView = self.testedApplication.otherElements[@"touchableView"];
|
|
136
143
|
XCTAssertNotNil(touchableView);
|
|
137
144
|
NSArray<NSArray<NSDictionary<NSString *, id> *>*> *gesture =
|
|
@@ -194,6 +194,14 @@
|
|
|
194
194
|
|
|
195
195
|
- (void)testDoubleTap
|
|
196
196
|
{
|
|
197
|
+
if ([UIDevice.currentDevice userInterfaceIdiom] == UIUserInterfaceIdiomPad &&
|
|
198
|
+
SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"15.0")) {
|
|
199
|
+
// "tap the element" does not work on iPadOS simulator after change the rotation in iOS 15
|
|
200
|
+
// while selecting the element worked. (I confirmed with getting an element screenshot that
|
|
201
|
+
// the FBShowAlertButtonName was actually selected after changing the orientation.)
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
|
|
197
205
|
NSArray<NSDictionary<NSString *, id> *> *gesture =
|
|
198
206
|
@[@{
|
|
199
207
|
@"action": @"tap",
|
|
@@ -208,6 +216,13 @@
|
|
|
208
216
|
|
|
209
217
|
- (void)testPress
|
|
210
218
|
{
|
|
219
|
+
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"15.0")) {
|
|
220
|
+
// Does not work on iOS 15.0.
|
|
221
|
+
// The same action tap the FBShowAlertButtonName after rotating the screen
|
|
222
|
+
// worked with W3C actions. `.click` action did not work.
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
|
|
211
226
|
NSArray<NSDictionary<NSString *, id> *> *gesture =
|
|
212
227
|
@[@{
|
|
213
228
|
@"action": @"press",
|
|
@@ -271,6 +286,10 @@
|
|
|
271
286
|
|
|
272
287
|
- (void)testForcePress
|
|
273
288
|
{
|
|
289
|
+
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"15.0")) {
|
|
290
|
+
// Does not work on iOS 15.
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
274
293
|
NSArray<NSDictionary<NSString *, id> *> *gesture =
|
|
275
294
|
@[@{
|
|
276
295
|
@"action": @"press",
|
|
@@ -51,6 +51,10 @@
|
|
|
51
51
|
XCTAssertTrue(image.size.width > image.size.height);
|
|
52
52
|
|
|
53
53
|
XCUIScreen *mainScreen = XCUIScreen.mainScreen;
|
|
54
|
+
// Note about iPadOS 15.0 environment.
|
|
55
|
+
// The 'button.screenshot.image' (by XCTest) had a white image while 'image' had
|
|
56
|
+
// expected FBShowAlertButtonName area image by WebDriverAgent.
|
|
57
|
+
// It seems the native XCTest element screenshot has an issue on iPadOS.
|
|
54
58
|
UIImage *buttonScreenshot = button.screenshot.image;
|
|
55
59
|
XCTAssertEqualWithAccuracy(buttonScreenshot.size.height * mainScreen.scale,
|
|
56
60
|
image.size.height,
|
|
@@ -17,19 +17,38 @@
|
|
|
17
17
|
|
|
18
18
|
@interface FBElementSwipingTests : FBIntegrationTestCase
|
|
19
19
|
@property (nonatomic, strong) XCUIElement *scrollView;
|
|
20
|
+
- (void)openScrollView;
|
|
20
21
|
@end
|
|
21
22
|
|
|
22
23
|
@implementation FBElementSwipingTests
|
|
23
24
|
|
|
25
|
+
- (void)openScrollView
|
|
26
|
+
{
|
|
27
|
+
[self launchApplication];
|
|
28
|
+
[self goToScrollPageWithCells:YES];
|
|
29
|
+
self.scrollView = [[self.testedApplication.query descendantsMatchingType:XCUIElementTypeAny] matchingIdentifier:@"scrollView"].element;
|
|
30
|
+
}
|
|
31
|
+
|
|
24
32
|
- (void)setUp
|
|
25
33
|
{
|
|
26
34
|
[super setUp];
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
35
|
+
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"15.0")) {
|
|
36
|
+
[self openScrollView];
|
|
37
|
+
} else {
|
|
38
|
+
static dispatch_once_t onceToken;
|
|
39
|
+
dispatch_once(&onceToken, ^{
|
|
40
|
+
[self openScrollView];
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
- (void)tearDown
|
|
46
|
+
{
|
|
47
|
+
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"15.0")) {
|
|
48
|
+
// Move to top page once to reset the scroll place
|
|
49
|
+
// since iOS 15 seems cannot handle cell visibility well when the view keps the view
|
|
50
|
+
[self.testedApplication terminate];
|
|
51
|
+
}
|
|
33
52
|
}
|
|
34
53
|
|
|
35
54
|
- (void)testSwipeUp
|
|
@@ -55,3 +74,49 @@
|
|
|
55
74
|
}
|
|
56
75
|
|
|
57
76
|
@end
|
|
77
|
+
|
|
78
|
+
@interface FBElementSwipingApplicationTests : FBIntegrationTestCase
|
|
79
|
+
@property (nonatomic, strong) XCUIElement *scrollView;
|
|
80
|
+
- (void)openScrollView;
|
|
81
|
+
@end
|
|
82
|
+
|
|
83
|
+
@implementation FBElementSwipingApplicationTests
|
|
84
|
+
|
|
85
|
+
- (void)openScrollView
|
|
86
|
+
{
|
|
87
|
+
[self launchApplication];
|
|
88
|
+
[self goToScrollPageWithCells:YES];
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
- (void)setUp
|
|
92
|
+
{
|
|
93
|
+
[super setUp];
|
|
94
|
+
static dispatch_once_t onceToken;
|
|
95
|
+
dispatch_once(&onceToken, ^{
|
|
96
|
+
[self openScrollView];
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
- (void)testSwipeUp
|
|
101
|
+
{
|
|
102
|
+
[self.testedApplication fb_swipeWithDirection:@"up" velocity:nil];
|
|
103
|
+
FBAssertInvisibleCell(@"0");
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
- (void)testSwipeDown
|
|
107
|
+
{
|
|
108
|
+
[self.testedApplication fb_swipeWithDirection:@"up" velocity:nil];
|
|
109
|
+
FBAssertInvisibleCell(@"0");
|
|
110
|
+
[self.testedApplication fb_swipeWithDirection:@"down" velocity:nil];
|
|
111
|
+
FBAssertVisibleCell(@"0");
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
- (void)testSwipeDownWithVelocity
|
|
115
|
+
{
|
|
116
|
+
[self.testedApplication fb_swipeWithDirection:@"up" velocity:@2500];
|
|
117
|
+
FBAssertInvisibleCell(@"0");
|
|
118
|
+
[self.testedApplication fb_swipeWithDirection:@"down" velocity:@2500];
|
|
119
|
+
FBAssertVisibleCell(@"0");
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
@end
|
|
@@ -30,7 +30,9 @@
|
|
|
30
30
|
[self goToSpringBoardFirstPage];
|
|
31
31
|
|
|
32
32
|
// Check Icons on first screen
|
|
33
|
-
|
|
33
|
+
// Note: Calender app exits 2 (an app icon + a widget) exist on the home screen
|
|
34
|
+
// on iOS 15+. The firstMatch is for it.
|
|
35
|
+
XCTAssertTrue(self.springboard.icons[@"Calendar"].firstMatch.fb_isVisible);
|
|
34
36
|
XCTAssertTrue(self.springboard.icons[@"Reminders"].fb_isVisible);
|
|
35
37
|
|
|
36
38
|
// Check Icons on second screen screen
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
#import "FBIntegrationTestCase.h"
|
|
13
13
|
|
|
14
|
+
#import "FBMacros.h"
|
|
14
15
|
#import "FBElementCache.h"
|
|
15
16
|
#import "FBTestMacros.h"
|
|
16
17
|
#import "XCUIDevice+FBRotation.h"
|
|
@@ -53,6 +54,11 @@
|
|
|
53
54
|
|
|
54
55
|
- (void)testForceTap
|
|
55
56
|
{
|
|
57
|
+
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"15.0")) {
|
|
58
|
+
// Does not work on iOS 15.
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
56
62
|
[self verifyForceTapWithOrientation:UIDeviceOrientationPortrait];
|
|
57
63
|
}
|
|
58
64
|
|
|
@@ -43,6 +43,7 @@ NSString *const FBTapsCountLabelIdentifier = @"numberOfTapsLabel";
|
|
|
43
43
|
[FBConfiguration disableRemoteQueryEvaluation];
|
|
44
44
|
[FBConfiguration disableAttributeKeyPathAnalysis];
|
|
45
45
|
[FBConfiguration configureDefaultKeyboardPreferences];
|
|
46
|
+
[FBConfiguration disableApplicationUIInterruptionsHandling];
|
|
46
47
|
[FBConfiguration disableScreenshots];
|
|
47
48
|
self.continueAfterFailure = NO;
|
|
48
49
|
self.springboard = FBApplication.fb_systemApplication;
|
|
@@ -93,7 +94,7 @@ NSString *const FBTapsCountLabelIdentifier = @"numberOfTapsLabel";
|
|
|
93
94
|
FBAssertWaitTillBecomesTrue(FBApplication.fb_systemApplication.icons[@"Safari"].exists);
|
|
94
95
|
[[XCUIDevice sharedDevice] pressButton:XCUIDeviceButtonHome];
|
|
95
96
|
[self.testedApplication fb_waitUntilStable];
|
|
96
|
-
FBAssertWaitTillBecomesTrue(FBApplication.fb_systemApplication.icons[@"Calendar"].fb_isVisible);
|
|
97
|
+
FBAssertWaitTillBecomesTrue(FBApplication.fb_systemApplication.icons[@"Calendar"].firstMatch.fb_isVisible);
|
|
97
98
|
}
|
|
98
99
|
|
|
99
100
|
- (void)goToSpringBoardExtras
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
#import <XCTest/XCTest.h>
|
|
11
11
|
|
|
12
|
+
#import "FBMacros.h"
|
|
12
13
|
#import "FBIntegrationTestCase.h"
|
|
13
14
|
#import "FBKeyboard.h"
|
|
14
15
|
#import "FBRunLoopSpinner.h"
|
|
@@ -31,6 +32,15 @@
|
|
|
31
32
|
NSString *text = @"Happy typing";
|
|
32
33
|
XCUIElement *textField = self.testedApplication.textFields[@"aIdentifier"];
|
|
33
34
|
[textField tap];
|
|
35
|
+
|
|
36
|
+
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"15.0")) {
|
|
37
|
+
// A workaround until find out to clear tutorial on iOS 15
|
|
38
|
+
XCUIElement *textField = self.testedApplication.staticTexts[@"Continue"];
|
|
39
|
+
if (textField.hittable) {
|
|
40
|
+
[textField tap];
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
34
44
|
NSError *error;
|
|
35
45
|
XCTAssertTrue([FBKeyboard waitUntilVisibleForApplication:self.testedApplication timeout:1 error:&error]);
|
|
36
46
|
XCTAssertNil(error);
|
|
@@ -43,6 +53,15 @@
|
|
|
43
53
|
{
|
|
44
54
|
XCUIElement *textField = self.testedApplication.textFields[@"aIdentifier"];
|
|
45
55
|
[textField tap];
|
|
56
|
+
|
|
57
|
+
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"15.0")) {
|
|
58
|
+
// A workaround until find out to clear tutorial on iOS 15
|
|
59
|
+
XCUIElement *textField = self.testedApplication.staticTexts[@"Continue"];
|
|
60
|
+
if (textField.hittable) {
|
|
61
|
+
[textField tap];
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
46
65
|
NSError *error;
|
|
47
66
|
XCTAssertTrue([FBKeyboard waitUntilVisibleForApplication:self.testedApplication timeout:1 error:&error]);
|
|
48
67
|
XCTAssertNil(error);
|
|
@@ -295,6 +295,14 @@
|
|
|
295
295
|
|
|
296
296
|
- (void)testDoubleTap
|
|
297
297
|
{
|
|
298
|
+
if ([UIDevice.currentDevice userInterfaceIdiom] == UIUserInterfaceIdiomPad &&
|
|
299
|
+
SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"15.0")) {
|
|
300
|
+
// "tap the element" does not work on iPadOS simulator after change the rotation in iOS 15
|
|
301
|
+
// while selecting the element worked. (I confirmed with getting an element screenshot that
|
|
302
|
+
// the FBShowAlertButtonName was actually selected after changing the orientation.)
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
|
|
298
306
|
NSArray<NSDictionary<NSString *, id> *> *gesture =
|
|
299
307
|
@[@{
|
|
300
308
|
@"type": @"pointer",
|
|
@@ -317,6 +325,13 @@
|
|
|
317
325
|
|
|
318
326
|
- (void)testLongPressWithCombinedPause
|
|
319
327
|
{
|
|
328
|
+
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"15.0")) {
|
|
329
|
+
// Xcode 13 x iOS 14 also does not work while Xcode 12.5 x iOS 14 worked.
|
|
330
|
+
// Skip this test for iOS 15 since iOS 15 works with Xcode 13 at least.
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
|
|
320
335
|
NSArray<NSDictionary<NSString *, id> *> *gesture =
|
|
321
336
|
@[@{
|
|
322
337
|
@"type": @"pointer",
|
|
@@ -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/*/*[
|
|
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);
|
package/build/index.js
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
|
|
4
|
-
|
|
5
3
|
Object.defineProperty(exports, "__esModule", {
|
|
6
4
|
value: true
|
|
7
5
|
});
|
|
8
|
-
exports.
|
|
6
|
+
exports.resetTestProcesses = exports.checkForDependencies = exports.bundleWDASim = exports.WebDriverAgent = exports.WDA_RUNNER_BUNDLE_ID = exports.WDA_BUNDLE_ID = exports.WDA_BASE_URL = exports.PROJECT_FILE = exports.NoSessionProxy = exports.BOOTSTRAP_PATH = void 0;
|
|
9
7
|
|
|
10
8
|
require("source-map-support/register");
|
|
11
9
|
|
|
@@ -21,6 +19,10 @@ var utils = _interopRequireWildcard(require("./lib/utils"));
|
|
|
21
19
|
|
|
22
20
|
var _asyncbox = require("asyncbox");
|
|
23
21
|
|
|
22
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
23
|
+
|
|
24
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
25
|
+
|
|
24
26
|
const {
|
|
25
27
|
checkForDependencies,
|
|
26
28
|
bundleWDASim
|
|
@@ -57,4 +59,4 @@ if (require.main === module) {
|
|
|
57
59
|
}require('source-map-support').install();
|
|
58
60
|
|
|
59
61
|
|
|
60
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
62
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbImNoZWNrRm9yRGVwZW5kZW5jaWVzIiwiYnVuZGxlV0RBU2ltIiwiZGVwZW5kZW5jaWVzIiwiTm9TZXNzaW9uUHJveHkiLCJwcm94aWVzIiwiV2ViRHJpdmVyQWdlbnQiLCJkcml2ZXIiLCJXREFfQlVORExFX0lEIiwiQk9PVFNUUkFQX1BBVEgiLCJXREFfQkFTRV9VUkwiLCJXREFfUlVOTkVSX0JVTkRMRV9JRCIsIlBST0pFQ1RfRklMRSIsImNvbnN0YW50cyIsInJlc2V0VGVzdFByb2Nlc3NlcyIsInV0aWxzIiwicmVxdWlyZSIsIm1haW4iLCJtb2R1bGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7QUFHQSxNQUFNO0FBQUVBLEVBQUFBLG9CQUFGO0FBQXdCQyxFQUFBQTtBQUF4QixJQUF5Q0MsWUFBL0M7OztBQUNBLE1BQU07QUFBRUMsRUFBQUE7QUFBRixJQUFxQkMsT0FBM0I7O0FBQ0EsTUFBTTtBQUFFQyxFQUFBQTtBQUFGLElBQXFCQyxNQUEzQjs7QUFDQSxNQUFNO0FBQUVDLEVBQUFBLGFBQUY7QUFBaUJDLEVBQUFBLGNBQWpCO0FBQWlDQyxFQUFBQSxZQUFqQztBQUErQ0MsRUFBQUEsb0JBQS9DO0FBQXFFQyxFQUFBQTtBQUFyRSxJQUFzRkMsU0FBNUY7Ozs7OztBQUNBLE1BQU07QUFBRUMsRUFBQUE7QUFBRixJQUF5QkMsS0FBL0I7OztBQUlBLElBQUlDLE9BQU8sQ0FBQ0MsSUFBUixLQUFpQkMsTUFBckIsRUFBNkI7QUFDM0IsMEJBQVNqQixvQkFBVDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZGVwZW5kZW5jaWVzIGZyb20gJy4vbGliL2NoZWNrLWRlcGVuZGVuY2llcyc7XG5pbXBvcnQgKiBhcyBwcm94aWVzIGZyb20gJy4vbGliL25vLXNlc3Npb24tcHJveHknO1xuaW1wb3J0ICogYXMgZHJpdmVyIGZyb20gJy4vbGliL3dlYmRyaXZlcmFnZW50JztcbmltcG9ydCAqIGFzIGNvbnN0YW50cyBmcm9tICcuL2xpYi9jb25zdGFudHMnO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi9saWIvdXRpbHMnO1xuaW1wb3J0IHsgYXN5bmNpZnkgfSBmcm9tICdhc3luY2JveCc7XG5cblxuY29uc3QgeyBjaGVja0ZvckRlcGVuZGVuY2llcywgYnVuZGxlV0RBU2ltIH0gPSBkZXBlbmRlbmNpZXM7XG5jb25zdCB7IE5vU2Vzc2lvblByb3h5IH0gPSBwcm94aWVzO1xuY29uc3QgeyBXZWJEcml2ZXJBZ2VudCB9ID0gZHJpdmVyO1xuY29uc3QgeyBXREFfQlVORExFX0lELCBCT09UU1RSQVBfUEFUSCwgV0RBX0JBU0VfVVJMLCBXREFfUlVOTkVSX0JVTkRMRV9JRCwgUFJPSkVDVF9GSUxFIH0gPSBjb25zdGFudHM7XG5jb25zdCB7IHJlc2V0VGVzdFByb2Nlc3NlcyB9ID0gdXRpbHM7XG5cblxuLy8gV2hlbiBydW4gYXMgYSBjb21tYW5kIGxpbmUgdXRpbGl0eSwgdGhpcyBzaG91bGQgY2hlY2sgZm9yIHRoZSBkZXBlbmRlbmNpZXNcbmlmIChyZXF1aXJlLm1haW4gPT09IG1vZHVsZSkge1xuICBhc3luY2lmeShjaGVja0ZvckRlcGVuZGVuY2llcyk7XG59XG5cbmV4cG9ydCB7XG4gIFdlYkRyaXZlckFnZW50LFxuICBOb1Nlc3Npb25Qcm94eSxcbiAgY2hlY2tGb3JEZXBlbmRlbmNpZXMsIGJ1bmRsZVdEQVNpbSxcbiAgcmVzZXRUZXN0UHJvY2Vzc2VzLFxuICBCT09UU1RSQVBfUEFUSCwgV0RBX0JVTkRMRV9JRCxcbiAgV0RBX1JVTk5FUl9CVU5ETEVfSUQsIFBST0pFQ1RfRklMRSxcbiAgV0RBX0JBU0VfVVJMLFxufTtcbiJdLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiLi4ifQ==
|
|
@@ -5,12 +5,12 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
|
-
exports.checkForDependencies = checkForDependencies;
|
|
9
8
|
exports.bundleWDASim = bundleWDASim;
|
|
9
|
+
exports.checkForDependencies = checkForDependencies;
|
|
10
10
|
|
|
11
11
|
require("source-map-support/register");
|
|
12
12
|
|
|
13
|
-
var
|
|
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
|
|
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,
|
|
58
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jaGVjay1kZXBlbmRlbmNpZXMuanMiXSwibmFtZXMiOlsiYnVpbGRXREFTaW0iLCJhcmdzIiwiV0RBX1BST0pFQ1QiLCJXREFfU0NIRU1FIiwiU0RLX1NJTVVMQVRPUiIsImNoZWNrRm9yRGVwZW5kZW5jaWVzIiwibG9nIiwiZGVidWciLCJidW5kbGVXREFTaW0iLCJ4Y29kZWJ1aWxkIiwib3B0cyIsIl8iLCJpc0Z1bmN0aW9uIiwicmV0cmlldmVEZXJpdmVkRGF0YVBhdGgiLCJYY29kZUJ1aWxkIiwiZGVyaXZlZERhdGFQYXRoIiwid2RhQnVuZGxlUGF0aCIsInBhdGgiLCJqb2luIiwiV0RBX1JVTk5FUl9BUFAiLCJmcyIsImV4aXN0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0E7O0FBRUEsZUFBZUEsV0FBZixHQUE4QjtBQUM1QixRQUFNQyxJQUFJLEdBQUcsQ0FDWCxVQURXLEVBQ0NDLHNCQURELEVBRVgsU0FGVyxFQUVBQyxxQkFGQSxFQUdYLE1BSFcsRUFHSEMsd0JBSEcsRUFJWCx1QkFKVyxFQUtYLDRCQUxXLEVBTVgsZ0NBTlcsQ0FBYjtBQVFBLFFBQU0sd0JBQUssWUFBTCxFQUFtQkgsSUFBbkIsQ0FBTjtBQUNEOztBQUdELGVBQWVJLG9CQUFmLEdBQXVDO0FBQ3JDQyxrQkFBSUMsS0FBSixDQUFVLDZCQUFWOztBQUNBLFNBQU8sS0FBUDtBQUNEOztBQUVELGVBQWVDLFlBQWYsQ0FBNkJDLFVBQTdCLEVBQXlDQyxJQUFJLEdBQUcsRUFBaEQsRUFBb0Q7QUFDbEQsTUFBSUQsVUFBVSxJQUFJLENBQUNFLGdCQUFFQyxVQUFGLENBQWFILFVBQVUsQ0FBQ0ksdUJBQXhCLENBQW5CLEVBQXFFO0FBQ25FSixJQUFBQSxVQUFVLEdBQUcsSUFBSUssbUJBQUosRUFBYjtBQUNBSixJQUFBQSxJQUFJLEdBQUdELFVBQVA7QUFDRDs7QUFFRCxRQUFNTSxlQUFlLEdBQUcsTUFBTU4sVUFBVSxDQUFDSSx1QkFBWCxFQUE5Qjs7QUFDQSxRQUFNRyxhQUFhLEdBQUdDLGNBQUtDLElBQUwsQ0FBVUgsZUFBVixFQUEyQixPQUEzQixFQUFvQyxVQUFwQyxFQUFnRCx1QkFBaEQsRUFBeUVJLHlCQUF6RSxDQUF0Qjs7QUFDQSxNQUFJLE1BQU1DLFlBQUdDLE1BQUgsQ0FBVUwsYUFBVixDQUFWLEVBQW9DO0FBQ2xDLFdBQU9BLGFBQVA7QUFDRDs7QUFDRCxRQUFNWCxvQkFBb0IsQ0FBQ0ssSUFBRCxDQUExQjtBQUNBLFFBQU1WLFdBQVcsQ0FBQ1MsVUFBRCxFQUFhQyxJQUFiLENBQWpCO0FBQ0EsU0FBT00sYUFBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZnMgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgWGNvZGVCdWlsZCBmcm9tICcuL3hjb2RlYnVpbGQnO1xuaW1wb3J0IHtcbiAgV0RBX1BST0pFQ1QsIFdEQV9TQ0hFTUUsIFNES19TSU1VTEFUT1IsIFdEQV9SVU5ORVJfQVBQXG59IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuXG5hc3luYyBmdW5jdGlvbiBidWlsZFdEQVNpbSAoKSB7XG4gIGNvbnN0IGFyZ3MgPSBbXG4gICAgJy1wcm9qZWN0JywgV0RBX1BST0pFQ1QsXG4gICAgJy1zY2hlbWUnLCBXREFfU0NIRU1FLFxuICAgICctc2RrJywgU0RLX1NJTVVMQVRPUixcbiAgICAnQ09ERV9TSUdOX0lERU5USVRZPVwiXCInLFxuICAgICdDT0RFX1NJR05JTkdfUkVRVUlSRUQ9XCJOT1wiJyxcbiAgICAnR0NDX1RSRUFUX1dBUk5JTkdTX0FTX0VSUk9SUz0wJyxcbiAgXTtcbiAgYXdhaXQgZXhlYygneGNvZGVidWlsZCcsIGFyZ3MpO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1hd2FpdFxuYXN5bmMgZnVuY3Rpb24gY2hlY2tGb3JEZXBlbmRlbmNpZXMgKCkge1xuICBsb2cuZGVidWcoJ0RlcGVuZGVuY2llcyBhcmUgdXAgdG8gZGF0ZScpO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1bmRsZVdEQVNpbSAoeGNvZGVidWlsZCwgb3B0cyA9IHt9KSB7XG4gIGlmICh4Y29kZWJ1aWxkICYmICFfLmlzRnVuY3Rpb24oeGNvZGVidWlsZC5yZXRyaWV2ZURlcml2ZWREYXRhUGF0aCkpIHtcbiAgICB4Y29kZWJ1aWxkID0gbmV3IFhjb2RlQnVpbGQoKTtcbiAgICBvcHRzID0geGNvZGVidWlsZDtcbiAgfVxuXG4gIGNvbnN0IGRlcml2ZWREYXRhUGF0aCA9IGF3YWl0IHhjb2RlYnVpbGQucmV0cmlldmVEZXJpdmVkRGF0YVBhdGgoKTtcbiAgY29uc3Qgd2RhQnVuZGxlUGF0aCA9IHBhdGguam9pbihkZXJpdmVkRGF0YVBhdGgsICdCdWlsZCcsICdQcm9kdWN0cycsICdEZWJ1Zy1pcGhvbmVzaW11bGF0b3InLCBXREFfUlVOTkVSX0FQUCk7XG4gIGlmIChhd2FpdCBmcy5leGlzdHMod2RhQnVuZGxlUGF0aCkpIHtcbiAgICByZXR1cm4gd2RhQnVuZGxlUGF0aDtcbiAgfVxuICBhd2FpdCBjaGVja0ZvckRlcGVuZGVuY2llcyhvcHRzKTtcbiAgYXdhaXQgYnVpbGRXREFTaW0oeGNvZGVidWlsZCwgb3B0cyk7XG4gIHJldHVybiB3ZGFCdW5kbGVQYXRoO1xufVxuXG5leHBvcnQgeyBjaGVja0ZvckRlcGVuZGVuY2llcywgYnVuZGxlV0RBU2ltIH07XG4iXSwiZmlsZSI6ImxpYi9jaGVjay1kZXBlbmRlbmNpZXMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
package/build/lib/constants.js
CHANGED
|
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
|
-
exports.WDA_UPGRADE_TIMESTAMP_PATH = exports.WDA_SCRIPTS_ROOT = exports.
|
|
8
|
+
exports.WDA_UPGRADE_TIMESTAMP_PATH = exports.WDA_SCRIPTS_ROOT = exports.WDA_SCHEME = exports.WDA_RUNNER_BUNDLE_ID = exports.WDA_RUNNER_APP = exports.WDA_PROJECT = exports.WDA_BUNDLE_ID = exports.WDA_BASE_URL = exports.SDK_SIMULATOR = exports.SDK_DEVICE = exports.PROJECT_FILE = exports.PLATFORM_NAME_TVOS = exports.PLATFORM_NAME_IOS = exports.BOOTSTRAP_PATH = void 0;
|
|
9
9
|
|
|
10
10
|
require("source-map-support/register");
|
|
11
11
|
|
package/build/lib/logger.js
CHANGED
|
@@ -7,12 +7,12 @@ exports.default = void 0;
|
|
|
7
7
|
|
|
8
8
|
require("source-map-support/register");
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var _support = require("@appium/support");
|
|
11
11
|
|
|
12
|
-
const log =
|
|
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,
|
|
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
|
|
10
|
+
var _baseDriver = require("@appium/base-driver");
|
|
11
11
|
|
|
12
|
-
class NoSessionProxy extends
|
|
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,
|
|
42
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9uby1zZXNzaW9uLXByb3h5LmpzIl0sIm5hbWVzIjpbIk5vU2Vzc2lvblByb3h5IiwiSldQcm94eSIsImNvbnN0cnVjdG9yIiwib3B0cyIsImdldFVybEZvclByb3h5IiwidXJsIiwicHJveHlCYXNlIiwic2NoZW1lIiwic2VydmVyIiwicG9ydCIsImJhc2UiLCJyZW1haW5pbmdVcmwiLCJSZWdFeHAiLCJ0ZXN0IiwiRXJyb3IiLCJyZXBsYWNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFHQSxNQUFNQSxjQUFOLFNBQTZCQyxtQkFBN0IsQ0FBcUM7QUFDbkNDLEVBQUFBLFdBQVcsQ0FBRUMsSUFBSSxHQUFHLEVBQVQsRUFBYTtBQUN0QixVQUFNQSxJQUFOO0FBQ0Q7O0FBRURDLEVBQUFBLGNBQWMsQ0FBRUMsR0FBRixFQUFPO0FBQ25CLFFBQUlBLEdBQUcsS0FBSyxFQUFaLEVBQWdCO0FBQ2RBLE1BQUFBLEdBQUcsR0FBRyxHQUFOO0FBQ0Q7O0FBQ0QsVUFBTUMsU0FBUyxHQUFJLEdBQUUsS0FBS0MsTUFBTyxNQUFLLEtBQUtDLE1BQU8sSUFBRyxLQUFLQyxJQUFLLEdBQUUsS0FBS0MsSUFBSyxFQUEzRTtBQUNBLFFBQUlDLFlBQVksR0FBRyxFQUFuQjs7QUFDQSxRQUFLLElBQUlDLE1BQUosQ0FBVyxJQUFYLENBQUQsQ0FBbUJDLElBQW5CLENBQXdCUixHQUF4QixDQUFKLEVBQWtDO0FBQ2hDTSxNQUFBQSxZQUFZLEdBQUdOLEdBQWY7QUFDRCxLQUZELE1BRU87QUFDTCxZQUFNLElBQUlTLEtBQUosQ0FBVyxxQ0FBb0NULEdBQUksR0FBbkQsQ0FBTjtBQUNEOztBQUNETSxJQUFBQSxZQUFZLEdBQUdBLFlBQVksQ0FBQ0ksT0FBYixDQUFxQixLQUFyQixFQUE0QixFQUE1QixDQUFmO0FBQ0EsV0FBT1QsU0FBUyxHQUFHSyxZQUFuQjtBQUNEOztBQWxCa0M7OztlQXNCdEJYLGMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBKV1Byb3h5IH0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5cblxuY2xhc3MgTm9TZXNzaW9uUHJveHkgZXh0ZW5kcyBKV1Byb3h5IHtcbiAgY29uc3RydWN0b3IgKG9wdHMgPSB7fSkge1xuICAgIHN1cGVyKG9wdHMpO1xuICB9XG5cbiAgZ2V0VXJsRm9yUHJveHkgKHVybCkge1xuICAgIGlmICh1cmwgPT09ICcnKSB7XG4gICAgICB1cmwgPSAnLyc7XG4gICAgfVxuICAgIGNvbnN0IHByb3h5QmFzZSA9IGAke3RoaXMuc2NoZW1lfTovLyR7dGhpcy5zZXJ2ZXJ9OiR7dGhpcy5wb3J0fSR7dGhpcy5iYXNlfWA7XG4gICAgbGV0IHJlbWFpbmluZ1VybCA9ICcnO1xuICAgIGlmICgobmV3IFJlZ0V4cCgnXi8nKSkudGVzdCh1cmwpKSB7XG4gICAgICByZW1haW5pbmdVcmwgPSB1cmw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRGlkIG5vdCBrbm93IHdoYXQgdG8gZG8gd2l0aCB1cmwgJyR7dXJsfSdgKTtcbiAgICB9XG4gICAgcmVtYWluaW5nVXJsID0gcmVtYWluaW5nVXJsLnJlcGxhY2UoL1xcLyQvLCAnJyk7IC8vIGNhbid0IGhhdmUgdHJhaWxpbmcgc2xhc2hlc1xuICAgIHJldHVybiBwcm94eUJhc2UgKyByZW1haW5pbmdVcmw7XG4gIH1cbn1cblxuZXhwb3J0IHsgTm9TZXNzaW9uUHJveHkgfTtcbmV4cG9ydCBkZWZhdWx0IE5vU2Vzc2lvblByb3h5O1xuIl0sImZpbGUiOiJsaWIvbm8tc2Vzc2lvbi1wcm94eS5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|