@appium/images-plugin 1.2.4 → 1.3.1
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/LICENSE +2 -2
- package/README.md +2 -0
- package/build/lib/compare.d.ts +28 -0
- package/build/lib/compare.d.ts.map +1 -0
- package/build/lib/compare.js +59 -70
- package/build/lib/finder.d.ts +163 -0
- package/build/lib/finder.d.ts.map +1 -0
- package/build/lib/finder.js +323 -358
- package/build/lib/image-element.d.ts +108 -0
- package/build/lib/image-element.d.ts.map +1 -0
- package/build/lib/image-element.js +193 -224
- package/build/lib/logger.d.ts +3 -0
- package/build/lib/logger.d.ts.map +1 -0
- package/build/lib/logger.js +15 -5
- package/build/lib/plugin.d.ts +25 -0
- package/build/lib/plugin.d.ts.map +1 -0
- package/build/lib/plugin.js +88 -67
- package/build/tsconfig.tsbuildinfo +1 -1
- package/index.js +1 -3
- package/lib/compare.js +26 -11
- package/lib/finder.js +141 -83
- package/lib/image-element.js +69 -65
- package/lib/logger.js +3 -1
- package/lib/plugin.js +14 -15
- package/package.json +34 -24
- package/build/index.js +0 -27
- package/build/test/e2e/plugin-e2e-specs.js +0 -62
- package/build/test/fixtures/appstore.png +0 -0
- package/build/test/fixtures/img1.png +0 -0
- package/build/test/fixtures/img2.png +0 -0
- package/build/test/fixtures/img2_part.png +0 -0
- package/build/test/fixtures/index.js +0 -24
- package/build/test/unit/finder-specs.js +0 -334
- package/build/test/unit/image-element-specs.js +0 -275
- package/build/test/unit/plugin-specs.js +0 -149
|
@@ -1,275 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
-
}) : (function(o, m, k, k2) {
|
|
6
|
-
if (k2 === undefined) k2 = k;
|
|
7
|
-
o[k2] = m[k];
|
|
8
|
-
}));
|
|
9
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
-
}) : function(o, v) {
|
|
12
|
-
o["default"] = v;
|
|
13
|
-
});
|
|
14
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
-
if (mod && mod.__esModule) return mod;
|
|
16
|
-
var result = {};
|
|
17
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
-
__setModuleDefault(result, mod);
|
|
19
|
-
return result;
|
|
20
|
-
};
|
|
21
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
|
-
};
|
|
24
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
-
const lodash_1 = __importDefault(require("lodash"));
|
|
26
|
-
const chai_1 = __importDefault(require("chai"));
|
|
27
|
-
const chai_as_promised_1 = __importDefault(require("chai-as-promised"));
|
|
28
|
-
const base_driver_1 = __importDefault(require("@appium/base-driver"));
|
|
29
|
-
const finder_1 = __importDefault(require("../../lib/finder"));
|
|
30
|
-
const plugin_1 = require("../../lib/plugin");
|
|
31
|
-
const image_element_1 = __importStar(require("../../lib/image-element"));
|
|
32
|
-
const sinon_1 = __importDefault(require("sinon"));
|
|
33
|
-
chai_1.default.should();
|
|
34
|
-
chai_1.default.use(chai_as_promised_1.default);
|
|
35
|
-
const defRect = { x: 100, y: 110, width: 50, height: 25 };
|
|
36
|
-
const defTemplate = 'iVBORasdf';
|
|
37
|
-
describe('ImageElement', function () {
|
|
38
|
-
const driver = new base_driver_1.default();
|
|
39
|
-
describe('.size', function () {
|
|
40
|
-
it('should return the width and height of the image el', function () {
|
|
41
|
-
const el = new image_element_1.default(defTemplate, defRect);
|
|
42
|
-
el.size.should.eql({ width: defRect.width, height: defRect.height });
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
describe('.location', function () {
|
|
46
|
-
it('should return the location of the image el', function () {
|
|
47
|
-
const el = new image_element_1.default(defTemplate, defRect);
|
|
48
|
-
el.location.should.eql({ x: defRect.x, y: defRect.y });
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
describe('.center', function () {
|
|
52
|
-
it('should return the center location of the image el', function () {
|
|
53
|
-
const el = new image_element_1.default(defTemplate, defRect);
|
|
54
|
-
el.center.should.eql({
|
|
55
|
-
x: defRect.x + defRect.width / 2,
|
|
56
|
-
y: defRect.y + defRect.height / 2
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
describe('.asElement', function () {
|
|
61
|
-
it('should get the webdriver object representation of the element', function () {
|
|
62
|
-
const el = new image_element_1.default(defTemplate, defRect);
|
|
63
|
-
el.asElement('ELEMENT').ELEMENT.should.match(/^appium-image-el/);
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
describe('.equals', function () {
|
|
67
|
-
it('should say two image elements with same rect are equal', function () {
|
|
68
|
-
const el1 = new image_element_1.default('foo', defRect);
|
|
69
|
-
const el2 = new image_element_1.default('bar', defRect);
|
|
70
|
-
el1.equals(el2).should.be.true;
|
|
71
|
-
el2.equals(el1).should.be.true;
|
|
72
|
-
});
|
|
73
|
-
it('should say two image elements with different rect are not equal', function () {
|
|
74
|
-
const el1 = new image_element_1.default(defTemplate, { ...defRect, x: 0 });
|
|
75
|
-
const el2 = new image_element_1.default(defTemplate, defRect);
|
|
76
|
-
el1.equals(el2).should.be.false;
|
|
77
|
-
el2.equals(el1).should.be.false;
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
describe('.click', function () {
|
|
81
|
-
it('should reject an invalid tap strategy', async function () {
|
|
82
|
-
const d = new base_driver_1.default();
|
|
83
|
-
const el = new image_element_1.default(defTemplate, defRect);
|
|
84
|
-
await d.settings.update({ imageElementTapStrategy: 'bad' });
|
|
85
|
-
await el.click(d).should.eventually.be.rejectedWith(/Incorrect imageElementTapStrategy/);
|
|
86
|
-
});
|
|
87
|
-
it('should try to check for image element staleness, and throw if stale', async function () {
|
|
88
|
-
const d = new base_driver_1.default();
|
|
89
|
-
const f = new finder_1.default(d);
|
|
90
|
-
sinon_1.default.stub(f, 'findByImage').throws();
|
|
91
|
-
const el = new image_element_1.default(defTemplate, defRect, null, null, f);
|
|
92
|
-
// we need to check for staleness if explicitly requested to do so
|
|
93
|
-
await d.settings.update({
|
|
94
|
-
checkForImageElementStaleness: true,
|
|
95
|
-
autoUpdateImageElementPosition: false
|
|
96
|
-
});
|
|
97
|
-
await el.click(d).should.eventually.be.rejectedWith(/no longer attached/);
|
|
98
|
-
// and also if we are updating the element position
|
|
99
|
-
await d.settings.update({
|
|
100
|
-
checkForImageElementStaleness: false,
|
|
101
|
-
autoUpdateImageElementPosition: true
|
|
102
|
-
});
|
|
103
|
-
await el.click(d).should.eventually.be.rejectedWith(/no longer attached/);
|
|
104
|
-
});
|
|
105
|
-
it('should auto-update element position if requested', async function () {
|
|
106
|
-
const d = new base_driver_1.default();
|
|
107
|
-
d.performActions = lodash_1.default.noop;
|
|
108
|
-
sinon_1.default.stub(d, 'performActions');
|
|
109
|
-
const f = new finder_1.default(d);
|
|
110
|
-
const el = new image_element_1.default(defTemplate, defRect, null, null, f);
|
|
111
|
-
const newRect = { ...defRect, x: defRect.x + 10, y: defRect.y + 5 };
|
|
112
|
-
const elPos2 = new image_element_1.default(defTemplate, newRect, null, null, f);
|
|
113
|
-
sinon_1.default.stub(f, 'findByImage').returns(elPos2);
|
|
114
|
-
await d.settings.update({
|
|
115
|
-
autoUpdateImageElementPosition: true,
|
|
116
|
-
});
|
|
117
|
-
el.rect.should.not.eql(newRect);
|
|
118
|
-
await el.click(d);
|
|
119
|
-
el.rect.should.eql(newRect);
|
|
120
|
-
});
|
|
121
|
-
it('should tap the center of an element using w3c actions by default', async function () {
|
|
122
|
-
const d = new base_driver_1.default();
|
|
123
|
-
d.performActions = lodash_1.default.noop;
|
|
124
|
-
const actionStub = sinon_1.default.stub(d, 'performActions');
|
|
125
|
-
const el = new image_element_1.default(defTemplate, defRect);
|
|
126
|
-
// skip the staleness check for this test
|
|
127
|
-
await d.settings.update({
|
|
128
|
-
checkForImageElementStaleness: false,
|
|
129
|
-
});
|
|
130
|
-
await el.click(d);
|
|
131
|
-
const pointerMoveAction = actionStub.args[0][0][0].actions[0];
|
|
132
|
-
pointerMoveAction.x.should.equal(el.center.x);
|
|
133
|
-
pointerMoveAction.y.should.equal(el.center.y);
|
|
134
|
-
});
|
|
135
|
-
it('should fall back to touchactions if w3c actions do not exist on driver', async function () {
|
|
136
|
-
const d = new base_driver_1.default();
|
|
137
|
-
d.performTouch = lodash_1.default.noop;
|
|
138
|
-
const actionStub = sinon_1.default.stub(d, 'performTouch');
|
|
139
|
-
const el = new image_element_1.default(defTemplate, defRect);
|
|
140
|
-
// skip the staleness check for this test
|
|
141
|
-
await d.settings.update({
|
|
142
|
-
checkForImageElementStaleness: false,
|
|
143
|
-
});
|
|
144
|
-
await el.click(d);
|
|
145
|
-
const action = actionStub.args[0][0][0].options;
|
|
146
|
-
action.x.should.equal(el.center.x);
|
|
147
|
-
action.y.should.equal(el.center.y);
|
|
148
|
-
});
|
|
149
|
-
it('should use touchactions if requested', async function () {
|
|
150
|
-
const d = new base_driver_1.default();
|
|
151
|
-
d.performActions = lodash_1.default.noop;
|
|
152
|
-
const w3cStub = sinon_1.default.stub(d, 'performActions');
|
|
153
|
-
d.performTouch = lodash_1.default.noop;
|
|
154
|
-
const touchStub = sinon_1.default.stub(d, 'performTouch');
|
|
155
|
-
const el = new image_element_1.default(defTemplate, defRect);
|
|
156
|
-
// skip the staleness check for this test
|
|
157
|
-
await d.settings.update({
|
|
158
|
-
checkForImageElementStaleness: false,
|
|
159
|
-
imageElementTapStrategy: 'touchActions',
|
|
160
|
-
});
|
|
161
|
-
await el.click(d);
|
|
162
|
-
const action = touchStub.args[0][0][0].options;
|
|
163
|
-
action.x.should.equal(el.center.x);
|
|
164
|
-
action.y.should.equal(el.center.y);
|
|
165
|
-
w3cStub.callCount.should.eql(0);
|
|
166
|
-
});
|
|
167
|
-
it('should throw if driver does not implement any type of action', async function () {
|
|
168
|
-
const d = new base_driver_1.default();
|
|
169
|
-
const el = new image_element_1.default(defTemplate, defRect);
|
|
170
|
-
// skip the staleness check for this test
|
|
171
|
-
await d.settings.update({
|
|
172
|
-
checkForImageElementStaleness: false,
|
|
173
|
-
});
|
|
174
|
-
await el.click(d).should.eventually.be.rejectedWith(/did not implement/);
|
|
175
|
-
});
|
|
176
|
-
});
|
|
177
|
-
describe('#execute', function () {
|
|
178
|
-
// aGFwcHkgdGVzdGluZw== is 'happy testing'
|
|
179
|
-
const f = new finder_1.default(driver);
|
|
180
|
-
const imgEl = new image_element_1.default(defTemplate, defRect, 0, 'aGFwcHkgdGVzdGluZw==', f);
|
|
181
|
-
const clickStub = sinon_1.default.stub(imgEl, 'click');
|
|
182
|
-
before(function () {
|
|
183
|
-
f.imgElCache.set(imgEl.id, imgEl);
|
|
184
|
-
clickStub.returns(true);
|
|
185
|
-
});
|
|
186
|
-
after(function () {
|
|
187
|
-
f.imgElCache.reset();
|
|
188
|
-
clickStub.restore();
|
|
189
|
-
});
|
|
190
|
-
it('should reject executions for unsupported commands', async function () {
|
|
191
|
-
await image_element_1.default.execute(driver, imgEl, 'foobar')
|
|
192
|
-
.should.eventually.be.rejectedWith(/not yet been implemented/);
|
|
193
|
-
});
|
|
194
|
-
it('should get displayed status of element', async function () {
|
|
195
|
-
await image_element_1.default.execute(driver, imgEl, 'elementDisplayed')
|
|
196
|
-
.should.eventually.be.true;
|
|
197
|
-
});
|
|
198
|
-
it('should get size of element', async function () {
|
|
199
|
-
await image_element_1.default.execute(driver, imgEl, 'getSize')
|
|
200
|
-
.should.eventually.eql({ width: defRect.width, height: defRect.height });
|
|
201
|
-
});
|
|
202
|
-
it('should get location of element', async function () {
|
|
203
|
-
await image_element_1.default.execute(driver, imgEl, 'getLocation')
|
|
204
|
-
.should.eventually.eql({ x: defRect.x, y: defRect.y });
|
|
205
|
-
});
|
|
206
|
-
it('should get location in view of element', async function () {
|
|
207
|
-
await image_element_1.default.execute(driver, imgEl, 'getLocation')
|
|
208
|
-
.should.eventually.eql({ x: defRect.x, y: defRect.y });
|
|
209
|
-
});
|
|
210
|
-
it('should get rect of element', async function () {
|
|
211
|
-
await image_element_1.default.execute(driver, imgEl, 'getElementRect')
|
|
212
|
-
.should.eventually.eql(defRect);
|
|
213
|
-
});
|
|
214
|
-
it('should get score of element', async function () {
|
|
215
|
-
await image_element_1.default.execute(driver, imgEl, 'getAttribute', 'score')
|
|
216
|
-
.should.eventually.eql(0);
|
|
217
|
-
});
|
|
218
|
-
it('should get visual of element', async function () {
|
|
219
|
-
await image_element_1.default.execute(driver, imgEl, 'getAttribute', 'visual')
|
|
220
|
-
.should.eventually.eql('aGFwcHkgdGVzdGluZw==');
|
|
221
|
-
});
|
|
222
|
-
it('should get null as visual of element by default', async function () {
|
|
223
|
-
const imgElement = new image_element_1.default(defTemplate, defRect);
|
|
224
|
-
await image_element_1.default.execute(driver, imgElement, 'getAttribute', 'visual')
|
|
225
|
-
.should.eventually.eql(null);
|
|
226
|
-
});
|
|
227
|
-
it('should not get other attribute', async function () {
|
|
228
|
-
await image_element_1.default.execute(driver, imgEl, 'getAttribute', 'content-desc')
|
|
229
|
-
.should.eventually.rejectedWith('Method has not yet been implemented');
|
|
230
|
-
});
|
|
231
|
-
it('should click element', async function () {
|
|
232
|
-
await image_element_1.default.execute(driver, imgEl, 'click')
|
|
233
|
-
.should.eventually.be.true;
|
|
234
|
-
});
|
|
235
|
-
});
|
|
236
|
-
});
|
|
237
|
-
describe('image element LRU cache', function () {
|
|
238
|
-
it('should accept and cache image elements', function () {
|
|
239
|
-
const el1 = new image_element_1.default(defTemplate, defRect);
|
|
240
|
-
const el2 = new image_element_1.default(defTemplate, defRect);
|
|
241
|
-
const cache = (new finder_1.default()).imgElCache;
|
|
242
|
-
cache.set(el1.id, el1);
|
|
243
|
-
el1.equals(cache.get(el1.id)).should.be.true;
|
|
244
|
-
lodash_1.default.isUndefined(cache.get(el2.id)).should.be.true;
|
|
245
|
-
cache.has(el1.id).should.be.true;
|
|
246
|
-
cache.has(el2.id).should.be.false;
|
|
247
|
-
});
|
|
248
|
-
it('once cache reaches max size, should eject image elements', function () {
|
|
249
|
-
const el1 = new image_element_1.default(defTemplate, defRect);
|
|
250
|
-
const el2 = new image_element_1.default(defTemplate, defRect);
|
|
251
|
-
const cache = (new finder_1.default(null, defTemplate.length + 1)).imgElCache;
|
|
252
|
-
cache.set(el1.id, el1);
|
|
253
|
-
cache.has(el1.id).should.be.true;
|
|
254
|
-
cache.set(el2.id, el2);
|
|
255
|
-
cache.has(el2.id).should.be.true;
|
|
256
|
-
cache.has(el1.id).should.be.false;
|
|
257
|
-
});
|
|
258
|
-
});
|
|
259
|
-
describe('getImgElFromArgs', function () {
|
|
260
|
-
it('should return the image element id from json obj in args', function () {
|
|
261
|
-
const imgEl = `${image_element_1.IMAGE_ELEMENT_PREFIX}foo`;
|
|
262
|
-
const args = [1, 'foo', imgEl];
|
|
263
|
-
(0, plugin_1.getImgElFromArgs)(args).should.eql(imgEl);
|
|
264
|
-
});
|
|
265
|
-
it('should not return anything if image element id not in args', function () {
|
|
266
|
-
const args = [1, 'foo'];
|
|
267
|
-
lodash_1.default.isUndefined((0, plugin_1.getImgElFromArgs)(args)).should.be.true;
|
|
268
|
-
});
|
|
269
|
-
it('should not find image element id in anything but prefix', function () {
|
|
270
|
-
const notImgEl = `foo${image_element_1.IMAGE_ELEMENT_PREFIX}`;
|
|
271
|
-
const args = [1, 'foo', notImgEl];
|
|
272
|
-
lodash_1.default.isUndefined((0, plugin_1.getImgElFromArgs)(args)).should.be.true;
|
|
273
|
-
});
|
|
274
|
-
});
|
|
275
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtZWxlbWVudC1zcGVjcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC9pbWFnZS1lbGVtZW50LXNwZWNzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUF1QjtBQUN2QixnREFBd0I7QUFDeEIsd0VBQThDO0FBQzlDLHNFQUE2QztBQUM3Qyw4REFBa0Q7QUFDbEQsNkNBQW9EO0FBQ3BELHlFQUE2RTtBQUM3RSxrREFBMEI7QUFHMUIsY0FBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ2QsY0FBSSxDQUFDLEdBQUcsQ0FBQywwQkFBYyxDQUFDLENBQUM7QUFHekIsTUFBTSxPQUFPLEdBQUcsRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFDLENBQUM7QUFDeEQsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDO0FBRWhDLFFBQVEsQ0FBQyxjQUFjLEVBQUU7SUFDdkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxxQkFBVSxFQUFFLENBQUM7SUFFaEMsUUFBUSxDQUFDLE9BQU8sRUFBRTtRQUNoQixFQUFFLENBQUMsb0RBQW9ELEVBQUU7WUFDdkQsTUFBTSxFQUFFLEdBQUcsSUFBSSx1QkFBWSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNsRCxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBQyxDQUFDLENBQUM7UUFDckUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxXQUFXLEVBQUU7UUFDcEIsRUFBRSxDQUFDLDRDQUE0QyxFQUFFO1lBQy9DLE1BQU0sRUFBRSxHQUFH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
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
-
}) : (function(o, m, k, k2) {
|
|
6
|
-
if (k2 === undefined) k2 = k;
|
|
7
|
-
o[k2] = m[k];
|
|
8
|
-
}));
|
|
9
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
-
}) : function(o, v) {
|
|
12
|
-
o["default"] = v;
|
|
13
|
-
});
|
|
14
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
-
if (mod && mod.__esModule) return mod;
|
|
16
|
-
var result = {};
|
|
17
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
-
__setModuleDefault(result, mod);
|
|
19
|
-
return result;
|
|
20
|
-
};
|
|
21
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
|
-
};
|
|
24
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
-
const chai_1 = __importDefault(require("chai"));
|
|
26
|
-
const chai_as_promised_1 = __importDefault(require("chai-as-promised"));
|
|
27
|
-
const index_1 = __importStar(require("../../index"));
|
|
28
|
-
const compare_1 = require("../../lib/compare");
|
|
29
|
-
const base_driver_1 = __importDefault(require("@appium/base-driver"));
|
|
30
|
-
const finder_1 = require("../../lib/finder");
|
|
31
|
-
const fixtures_1 = require("../fixtures");
|
|
32
|
-
chai_1.default.use(chai_as_promised_1.default);
|
|
33
|
-
chai_1.default.should();
|
|
34
|
-
describe('ImageElementPlugin#handle', function () {
|
|
35
|
-
const next = () => { };
|
|
36
|
-
const driver = new base_driver_1.default();
|
|
37
|
-
const p = new index_1.default();
|
|
38
|
-
describe('compareImages', function () {
|
|
39
|
-
this.timeout(6000);
|
|
40
|
-
it('should compare images via match features mode', async function () {
|
|
41
|
-
const res = await p.compareImages(next, driver, compare_1.MATCH_FEATURES_MODE, fixtures_1.TEST_IMG_1_B64, fixtures_1.TEST_IMG_2_B64, {});
|
|
42
|
-
res.count.should.eql(0);
|
|
43
|
-
});
|
|
44
|
-
it('should compare images via get similarity mode', async function () {
|
|
45
|
-
const res = await p.compareImages(next, driver, compare_1.GET_SIMILARITY_MODE, fixtures_1.TEST_IMG_1_B64, fixtures_1.TEST_IMG_2_B64, {});
|
|
46
|
-
res.score.should.be.above(0.2);
|
|
47
|
-
});
|
|
48
|
-
it('should compare images via match template mode', async function () {
|
|
49
|
-
const res = await p.compareImages(next, driver, compare_1.MATCH_TEMPLATE_MODE, fixtures_1.TEST_IMG_1_B64, fixtures_1.TEST_IMG_2_B64, {});
|
|
50
|
-
res.rect.height.should.be.above(0);
|
|
51
|
-
res.rect.width.should.be.above(0);
|
|
52
|
-
res.score.should.be.above(0.2);
|
|
53
|
-
});
|
|
54
|
-
it('should throw an error if comparison mode is not supported', async function () {
|
|
55
|
-
await p.compareImages(next, driver, 'some mode', '', '')
|
|
56
|
-
.should.eventually.be.rejectedWith(/comparison mode is unknown/);
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
|
-
describe('findElement(s)', function () {
|
|
60
|
-
driver.settings = { getSettings: () => ({}) };
|
|
61
|
-
driver.isW3CProtocol = () => true;
|
|
62
|
-
driver.getScreenshot = () => fixtures_1.TEST_IMG_2_B64;
|
|
63
|
-
driver.getWindowSize = () => ({ width: 64, height: 64 });
|
|
64
|
-
it('should defer execution to regular command if not a find command', async function () {
|
|
65
|
-
const next = () => true;
|
|
66
|
-
await p.handle(next, driver, 'sendKeys').should.eventually.become(true);
|
|
67
|
-
});
|
|
68
|
-
it('should defer execution to regular command if it is a find command but a different strategy', async function () {
|
|
69
|
-
const next = () => true;
|
|
70
|
-
await p.findElement(next, driver, 'xpath', '//foo/bar').should.eventually.become(true);
|
|
71
|
-
await p.findElements(next, driver, 'xpath', '//foo/bar').should.eventually.become(true);
|
|
72
|
-
});
|
|
73
|
-
it('should find an image element inside a screenshot', async function () {
|
|
74
|
-
const el = await p.findElement(next, driver, index_1.IMAGE_STRATEGY, fixtures_1.TEST_IMG_2_PART_B64);
|
|
75
|
-
el[finder_1.W3C_ELEMENT_KEY].should.include('appium-image-element');
|
|
76
|
-
});
|
|
77
|
-
it('should find image elements inside a screenshot', async function () {
|
|
78
|
-
const els = await p.findElements(next, driver, index_1.IMAGE_STRATEGY, fixtures_1.TEST_IMG_2_PART_B64);
|
|
79
|
-
els.should.have.length(1);
|
|
80
|
-
els[0][finder_1.W3C_ELEMENT_KEY].should.include('appium-image-element');
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
describe('Element interactions', function () {
|
|
84
|
-
let elId;
|
|
85
|
-
before(async function () {
|
|
86
|
-
driver.settings = { getSettings: () => ({}) };
|
|
87
|
-
driver.isW3CProtocol = () => true;
|
|
88
|
-
driver.getScreenshot = () => fixtures_1.TEST_IMG_2_B64;
|
|
89
|
-
driver.getWindowSize = () => ({ width: 64, height: 64 });
|
|
90
|
-
const el = await p.findElement(next, driver, index_1.IMAGE_STRATEGY, fixtures_1.TEST_IMG_2_PART_B64);
|
|
91
|
-
elId = el[finder_1.W3C_ELEMENT_KEY];
|
|
92
|
-
});
|
|
93
|
-
it('should click on the screen coords of the middle of the element', async function () {
|
|
94
|
-
let action = null;
|
|
95
|
-
driver.performActions = (a) => { action = a; };
|
|
96
|
-
await p.handle(next, driver, 'click', elId);
|
|
97
|
-
action.should.eql([{
|
|
98
|
-
type: 'pointer',
|
|
99
|
-
id: 'mouse',
|
|
100
|
-
parameters: { pointerType: 'touch' },
|
|
101
|
-
actions: [
|
|
102
|
-
{ type: 'pointerMove', x: 24, y: 40, duration: 0 },
|
|
103
|
-
{ type: 'pointerDown', button: 0 },
|
|
104
|
-
{ type: 'pause', duration: 125 },
|
|
105
|
-
{ type: 'pointerUp', button: 0 },
|
|
106
|
-
]
|
|
107
|
-
}]);
|
|
108
|
-
});
|
|
109
|
-
it('should always say the element is displayed', async function () {
|
|
110
|
-
await p.handle(next, driver, 'elementDisplayed', elId).should.eventually.be.true;
|
|
111
|
-
});
|
|
112
|
-
it('should return the matched region size', async function () {
|
|
113
|
-
await p.handle(next, driver, 'getSize', elId).should.eventually.eql({
|
|
114
|
-
width: 48,
|
|
115
|
-
height: 48,
|
|
116
|
-
});
|
|
117
|
-
});
|
|
118
|
-
it('should return the matched region location', async function () {
|
|
119
|
-
await p.handle(next, driver, 'getLocation', elId).should.eventually.eql({
|
|
120
|
-
x: 0,
|
|
121
|
-
y: 16,
|
|
122
|
-
});
|
|
123
|
-
});
|
|
124
|
-
it('should return the region rect', async function () {
|
|
125
|
-
await p.handle(next, driver, 'getElementRect', elId).should.eventually.eql({
|
|
126
|
-
x: 0,
|
|
127
|
-
y: 16,
|
|
128
|
-
height: 48,
|
|
129
|
-
width: 48,
|
|
130
|
-
});
|
|
131
|
-
});
|
|
132
|
-
it('should return the match score as the score attr', async function () {
|
|
133
|
-
await p.handle(next, driver, 'getAttribute', 'score', elId).should.eventually.be.above(0.7);
|
|
134
|
-
});
|
|
135
|
-
it('should return the match visualization as the visual attr', async function () {
|
|
136
|
-
driver.settings = { getSettings: () => ({
|
|
137
|
-
getMatchedImageResult: true,
|
|
138
|
-
}) };
|
|
139
|
-
const el = await p.findElement(next, driver, index_1.IMAGE_STRATEGY, fixtures_1.TEST_IMG_2_PART_B64);
|
|
140
|
-
elId = el[finder_1.W3C_ELEMENT_KEY];
|
|
141
|
-
await p.handle(next, driver, 'getAttribute', 'visual', elId).should.eventually.include('iVBOR');
|
|
142
|
-
});
|
|
143
|
-
it('should not allow any other attrs', async function () {
|
|
144
|
-
await p.handle(next, driver, 'getAttribute', 'rando', elId).should.eventually.be
|
|
145
|
-
.rejectedWith(/not yet/i);
|
|
146
|
-
});
|
|
147
|
-
});
|
|
148
|
-
});
|
|
149
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXNwZWNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3BsdWdpbi1zcGVjcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxnREFBd0I7QUFDeEIsd0VBQThDO0FBQzlDLHFEQUFpRTtBQUNqRSwrQ0FBa0c7QUFDbEcsc0VBQTZDO0FBQzdDLDZDQUFtRDtBQUNuRCwwQ0FBa0Y7QUFFbEYsY0FBSSxDQUFDLEdBQUcsQ0FBQywwQkFBYyxDQUFDLENBQUM7QUFDekIsY0FBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBRWQsUUFBUSxDQUFDLDJCQUEyQixFQUFFO0lBQ3BDLE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztJQUN0QixNQUFNLE1BQU0sR0FBRyxJQUFJLHFCQUFVLEVBQUUsQ0FBQztJQUNoQyxNQUFNLENBQUMsR0FBRyxJQUFJLGVBQWtCLEVBQUUsQ0FBQztJQUNuQyxRQUFRLENBQUMsZUFBZSxFQUFFO1FBQ3hCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkIsRUFBRSxDQUFDLCtDQUErQyxFQUFFLEtBQUs7WUFDdkQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsNkJBQW1CLEVBQUUseUJBQWMsRUFBRSx5QkFBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3pHLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQywrQ0FBK0MsRUFBRSxLQUFLO1lBQ3ZELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLDZCQUFtQixFQUFFLHlCQUFjLEVBQUUseUJBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN6RyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLCtDQUErQyxFQUFFLEtBQUs7WUFDdkQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsNkJBQW1CLEVBQUUseUJBQWMsRUFBRSx5QkFBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3pHLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25DLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsMkRBQTJELEVBQUUsS0FBSztZQUNuRSxNQUFNLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztpQkFDckQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDckUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRTtRQUN6QixNQUFNLENBQUMsUUFBUSxHQUFHLEVBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUMsQ0FBQztRQUM1QyxNQUFNLENBQUMsYUFBYSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztRQUNsQyxNQUFNLENBQUMsYUFBYSxHQUFHLEdBQUcsRUFBRSxDQUFDLHlCQUFjLENBQUM7UUFDNUMsTUFBTSxDQUFDLGFBQWEsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFDLENBQUMsQ0FBQztRQUN2RCxFQUFFLENBQUMsaUVBQWlFLEVBQUUsS0FBSztZQUN6RSxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDeEIsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsNEZBQTRGLEVBQUUsS0FBSztZQUNwRyxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDeEIsTUFBTSxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZGLE1BQU0sQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRixDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyxrREFBa0QsRUFBRSxLQUFLO1lBQzFELE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLHNCQUFjLEVBQUUsOEJBQW1CLENBQUMsQ0FBQztZQUNsRixFQUFFLENBQUMsd0JBQWUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUM3RCxDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyxnREFBZ0QsRUFBRSxLQUFLO1lBQ3hELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLHNCQUFjLEVBQUUsOEJBQW1CLENBQUMsQ0FBQztZQUNwRixHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLHdCQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxzQkFBc0IsRUFBRTtRQUMvQixJQUFJLElBQUksQ0FBQztRQUNULE1BQU0sQ0FBQyxLQUFLO1lBQ1YsTUFBTSxDQUFDLFFBQVEsR0FBRyxFQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFDLENBQUM7WUFDNUMsTUFBTSxDQUFDLGFBQWEsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDbEMsTUFBTSxDQUFDLGFBQWEsR0FBRyxHQUFHLEVBQUUsQ0FBQyx5QkFBYyxDQUFDO1lBQzVDLE1BQU0sQ0FBQyxhQUFhLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBQyxDQUFDLENBQUM7WUFDdkQsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsc0JBQWMsRUFBRSw4QkFBbUIsQ0FBQyxDQUFDO1lBQ2xGLElBQUksR0FBRyxFQUFFLENBQUMsd0JBQWUsQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLGdFQUFnRSxFQUFFLEtBQUs7WUFDeEUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLE1BQU0sQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0MsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzVDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2pCLElBQUksRUFBRSxTQUFTO29CQUNmLEVBQUUsRUFBRSxPQUFPO29CQUNYLFVBQVUsRUFBRSxFQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUM7b0JBQ2xDLE9BQU8sRUFBRTt3QkFDUCxFQUFDLElBQUksRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUM7d0JBQ2hELEVBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFDO3dCQUNoQyxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBQzt3QkFDOUIsRUFBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUM7cUJBQy9CO2lCQUNGLENBQUMsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsNENBQTRDLEVBQUUsS0FBSztZQUNwRCxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7UUFDbkYsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsdUNBQXVDLEVBQUUsS0FBSztZQUMvQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7Z0JBQ2xFLEtBQUssRUFBRSxFQUFFO2dCQUNULE1BQU0sRUFBRSxFQUFFO2FBQ1gsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsMkNBQTJDLEVBQUUsS0FBSztZQUNuRCxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7Z0JBQ3RFLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2FBQ04sQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsK0JBQStCLEVBQUUsS0FBSztZQUN2QyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztnQkFDekUsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsTUFBTSxFQUFFLEVBQUU7Z0JBQ1YsS0FBSyxFQUFFLEVBQUU7YUFDVixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyxpREFBaUQsRUFBRSxLQUFLO1lBQ3pELE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlGLENBQUMsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLDBEQUEwRCxFQUFFLEtBQUs7WUFDbEUsTUFBTSxDQUFDLFFBQVEsR0FBRyxFQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO29CQUNyQyxxQkFBcUIsRUFBRSxJQUFJO2lCQUM1QixDQUFDLEVBQUMsQ0FBQztZQUNKLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLHNCQUFjLEVBQUUsOEJBQW1CLENBQUMsQ0FBQztZQUNsRixJQUFJLEdBQUcsRUFBRSxDQUFDLHdCQUFlLENBQUMsQ0FBQztZQUMzQixNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xHLENBQUMsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLGtDQUFrQyxFQUFFLEtBQUs7WUFDMUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUU7aUJBQzdFLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMifQ==
|