initial commit

This commit is contained in:
Blue 2018-08-05 00:46:25 +03:00 committed by Юрий Губич
commit 4b60ece582
327 changed files with 28286 additions and 0 deletions

View file

@ -0,0 +1,10 @@
cmake_minimum_required(VERSION 2.8.12)
configure_file(music.js music.js)
configure_file(home.js home.js)
configure_file(test.js test.js)
configure_file(list.js list.js)
configure_file(tempPage.js tempPage.js)
configure_file(artist.js artist.js)
configure_file(album.js album.js)
configure_file(song.js song.js)

144
magnus/pages/album.js Normal file
View file

@ -0,0 +1,144 @@
"use strict";
var TempPage = require("./tempPage");
var String = require("../lib/wModel/string");
var ProxyCatModel = require("../lib/wModel/proxy/catalogue");
var PaneModel = require("../lib/wModel/proxy/pane");
var Image = require("../lib/wModel/image");
var Model = require("../lib/wModel/model");
var VCController = require("../lib/wController/vocabulary");
var Address = require("../lib/wType/address");
var Uint64 = require("../lib/wType/uint64");
var Vocabulary = require("../lib/wType/vocabulary");
var AlbumPage = TempPage.inherit({
"className": "AlbumPage",
"constructor": function(address, name, id, proxySocket) {
TempPage.fn.constructor.call(this, address, name);
this._remoteId = id;
this._proxySocket = proxySocket;
this._ctrls = Object.create(null);
this._image = new Image(this._address["+"](new Address(["image"])), new Uint64(0));
var imageOptions = new Vocabulary();
imageOptions.insert("minWidth", new Uint64(200));
imageOptions.insert("maxWidth", new Uint64(200));
imageOptions.insert("minHeight", new Uint64(200));
imageOptions.insert("maxHeight", new Uint64(200));
this.addItem(this._image, 0, 0, 2, 1, TempPage.Aligment.CenterCenter, new Uint64(TempPage.getModelTypeId(this._image)), imageOptions);
var header = this._header = new String(this._address["+"](new Address(["header"])), "");
header.addProperty("fontFamily", "casualFont");
this.addItem(header, 0, 1, 1, 1, TempPage.Aligment.LeftTop);
var artist = this._artist = new String(this._address["+"](new Address(["artist"])), "Artist name");
artist.addProperty("fontFamily", "casualFont");
this.addItem(artist, 1, 1, 1, 1, TempPage.Aligment.LeftTop);
var spacer = new Model(this._address["+"](new Address(["spacer"])));
this.addItem(spacer, 0, 2, 2, 1);
this._songs = new ProxyCatModel(
this._address["+"](new Address(["songs"])),
new Address(["songs"]),
{
sorting: {ascending: true, field: "name"},
filter: {album: id.clone()}
},
proxySocket
);
this._songs.className = "PanesList";
var PaneClass = PaneModel.Songs;
this._songs.setChildrenClass(PaneClass);
this.addItem(this._songs, 2, 0, 1, 3, TempPage.Aligment.CenterTop);
},
"destructor": function() {
this._clearCtrls();
TempPage.fn.destructor.call(this);
},
"_clearCtrls": function() {
for (var key in this._ctrls) {
this._ctrls[key].destructor();
}
this._ctrls = Object.create(null);
},
"_onAlbumNewElement": function(key, el) {
switch(key) {
case "name":
this._header.set(el);
break;
case "image":
this._image.set(el.clone());
break;
case "artist":
var arVC = new VCController(new Address(["artists", el.toString()]));
arVC.on("newElement", this._onArtistNewElement, this);
arVC.on("removeElement", this._onArtistRemoveElement, this);
this._ctrls.artist = arVC;
arVC.register(this._dp, this._proxySocket);
arVC.subscribe();
break;
}
},
"_onAlbumRemoveElement": function(key) {
switch(key) {
case "name":
this._header.set("");
break;
case "image":
this._image.set(new Uint64(0));
break;
case "artist":
this._artist.set("");
this._ctrls.artist.destructor();
delete this._ctrls.artist;
}
},
"_onArtistNewElement": function(key, el) {
switch(key) {
case "name":
this._artist.set(el);
break;
}
},
"_onArtistRemoveElement": function(key) {
switch(key) {
case "name":
this._artist.set("unknown");
}
},
"register": function(dp, server) {
TempPage.fn.register.call(this, dp, server);
for (var key in this._ctrls) {
this._ctrls[key].register(dp, this._proxySocket);
}
},
"setParentReporter": function(pr) {
TempPage.fn.setParentReporter.call(this, pr);
this._pr.registerParent(this._songs.getAddress(), this._songs.reporterHandler);
this._songs.subscribe();
var albumVC = new VCController(new Address(["albums", this._remoteId.toString()]));
albumVC.on("newElement", this._onAlbumNewElement, this);
albumVC.on("removeElement", this._onAlbumRemoveElement, this);
this._ctrls.album = albumVC;
albumVC.register(this._dp, this._proxySocket);
albumVC.subscribe();
},
"unsetParentReporter": function() {
this._pr.unregisterParent(this._songs.getAddress());
this._clearCtrls();
TempPage.fn.unsetParentReporter.call(this);
}
});
module.exports = AlbumPage;

112
magnus/pages/artist.js Normal file
View file

@ -0,0 +1,112 @@
"use strict";
var TempPage = require("./tempPage");
var String = require("../lib/wModel/string");
var ProxyCatModel = require("../lib/wModel/proxy/catalogue");
var PaneModel = require("../lib/wModel/proxy/pane");
var VCController = require("../lib/wController/vocabulary");
var Address = require("../lib/wType/address");
var ArtistPage = TempPage.inherit({
"className": "ArtistPage",
"constructor": function(address, name, id, proxySocket) {
TempPage.fn.constructor.call(this, address, name);
this._remoteId = id;
this._proxySocket = proxySocket;
this._ctrls = Object.create(null);
var header = this._header = new String(this._address["+"](new Address(["header"])), "");
header.addProperty("fontFamily", "casualFont");
this.addItem(header, 0, 0, 1, 1, TempPage.Aligment.CenterTop);
this._albums = new ProxyCatModel(
this._address["+"](new Address(["albums"])),
new Address(["albums"]),
{
sorting: {ascending: true, field: "name"},
filter: {artist: id.clone()}
},
proxySocket
);
this._albums.className = "PanesList";
var PaneClass = PaneModel.Albums;
this._albums.setChildrenClass(PaneClass);
this.addItem(this._albums, 1, 0, 1, 1, TempPage.Aligment.CenterTop);
this._songs = new ProxyCatModel(
this._address["+"](new Address(["songs"])),
new Address(["songs"]),
{
sorting: {ascending: true, field: "name"},
filter: {artist: id.clone()}
},
proxySocket
);
this._songs.className = "PanesList";
var PaneClass = PaneModel.Songs;
this._songs.setChildrenClass(PaneClass);
this.addItem(this._songs, 2, 0, 1, 1, TempPage.Aligment.CenterTop);
},
"destructor": function() {
this._clearCtrls();
TempPage.fn.destructor.call(this);
},
"_clearCtrls": function() {
for (var key in this._ctrls) {
this._ctrls[key].destructor();
}
this._ctrls = Object.create(null);
},
"_onArtistNewElement": function(key, el) {
switch(key) {
case "name":
this._header.set(el);
break;
}
},
"_onArtistRemoveElement": function(key) {
switch(key) {
case "name":
this._header.set("");
break;
}
},
"register": function(dp, server) {
TempPage.fn.register.call(this, dp, server);
for (var key in this._ctrls) {
this._ctrls[key].register(dp, this._proxySocket);
}
},
"setParentReporter": function(pr) {
TempPage.fn.setParentReporter.call(this, pr);
this._pr.registerParent(this._albums.getAddress(), this._albums.reporterHandler);
this._pr.registerParent(this._songs.getAddress(), this._songs.reporterHandler);
this._albums.subscribe()
this._songs.subscribe();
var artistVC = new VCController(new Address(["artists", this._remoteId.toString()]));
artistVC.on("newElement", this._onArtistNewElement, this);
artistVC.on("removeElement", this._onArtistRemoveElement, this);
this._ctrls.artist = artistVC;
artistVC.register(this._dp, this._proxySocket);
artistVC.subscribe();
},
"unsetParentReporter": function() {
this._pr.unregisterParent(this._albums.getAddress());
this._pr.unregisterParent(this._songs.getAddress());
this._clearCtrls();
TempPage.fn.unsetParentReporter.call(this);
}
});
module.exports = ArtistPage;

19
magnus/pages/home.js Normal file
View file

@ -0,0 +1,19 @@
"use strict";
var Page = require("../lib/wModel/page");
var String = require("../lib/wModel/string");
var Address = require("../lib/wType/address");
var HomePage = Page.inherit({
"className": "HomePage",
"constructor": function(address, name) {
Page.fn.constructor.call(this, address, name);
var header = new String(this._address["+"](new Address(["message"])), "This is the root page");
header.addProperty("fontFamily", "casualFont");
this.addItem(header, 0, 0, 1, 1, Page.Aligment.CenterTop);
}
});
module.exports = HomePage;

115
magnus/pages/list.js Normal file
View file

@ -0,0 +1,115 @@
"use strict";
var Page = require("../lib/wModel/page");
var String = require("../lib/wModel/string");
var ProxyCatModel = require("../lib/wModel/proxy/catalogue");
var PaneModel = require("../lib/wModel/proxy/pane");
var Address = require("../lib/wType/address");
var Uint64 = require("../lib/wType/uint64");
var Handler = require("../lib/wDispatcher/handler");
var List = Page.inherit({
"className": "ListPage",
"constructor": function(address, name, remoteAddress, socket, ChildClass) {
Page.fn.constructor.call(this, address, name);
this._proxySocket = socket;
this._ChildClass = ChildClass;
var header = new String(this._address["+"](new Address(["header"])), name);
header.addProperty("fontFamily", "casualFont");
this.addItem(header, 0, 0, 1, 1, Page.Aligment.CenterTop);
this._list = new ProxyCatModel(
this._address["+"](new Address(["list"])),
remoteAddress,
{
sorting: {ascending: true, field: "name"}
},
socket
);
this._list.className = "PanesList";
var PaneClass = PaneModel[name];
if (!PaneClass) {
PaneClass = PaneModel.inherit({});
PaneClass.pageAddress = address;
}
this._list.setChildrenClass(PaneClass);
this.addItem(this._list, 1, 0, 1, 1, Page.Aligment.CenterTop);
this._reporterHandler = new Handler(this._address["+"](new Address(["subscribeMember"])), this, this._h_subscribeMember);
},
"destructor": function() {
this._reporterHandler.destructor();
this.removeItem(this._list);
this._list.destructor();
Page.fn.destructor.call(this);
},
"_createChildPage": function(id) {
var childName = id.toString();
var postfix = new Address([childName]);
var childAddr = this._address["+"](postfix);
var child = new this._ChildClass(childAddr, childName, id.clone(), this._proxySocket);
this.addPage(child);
child.on("destroyMe", this._destroyChild.bind(this, child)); //to remove model if it has no subscribers
child.checkSubscribersAndDestroy();
return child;
},
"_destroyChild": function(child) {
this.removePage(child);
child.destructor();
},
"getChildPage": function(name) {
var child = this._childPages[name];
if (child === undefined) {
var int = parseInt(name);
if (int == name) {
var id = new Uint64(int);
var itr = this._list.controller.data.find(id);
if (!itr["=="](this._list.controller.data.end())) {
child = this._createChildPage(id);
}
}
}
return child;
},
"_h_subscribeMember": function(ev) {
var dest = ev.getDestination();
var lastHops = dest["<<"](this._address.length());
if (lastHops.length() === 2) {
var command = lastHops.back().toString();
var numId = parseInt(lastHops.front().toString());
if ((command === "subscribe" || command === "get" || command === "ping") && numId === numId) {
var id = new Uint64(numId);
var child = this._createChildPage(id);
child["_h_" + command](ev);
} else {
this.trigger("serviceMessage", "ListPage model got a strange event: " + ev.toString(), 1);
}
} else {
this.trigger("serviceMessage", "ListPage model got a strange event: " + ev.toString(), 1);
}
},
"setParentReporter": function(pr) {
Page.fn.setParentReporter.call(this, pr);
this._pr.registerParent(this._list.getAddress(), this._list.reporterHandler);
this._pr.registerParent(this.getAddress(), this._reporterHandler);
this._list.subscribe();
},
"unsetParentReporter": function() {
this._pr.unregisterParent(this.getAddress());
this._pr.unregisterParent(this._list.getAddress());
Page.fn.unsetParentReporter.call(this);
}
});
module.exports = List;

198
magnus/pages/music.js Normal file
View file

@ -0,0 +1,198 @@
"use strict";
var Page = require("../lib/wModel/page");
var String = require("../lib/wModel/string");
var PanesList = require("../lib/wModel/panesList");
var Address = require("../lib/wType/address");
var Vocabulary = require("../lib/wType/vocabulary");
var Boolean = require("../lib/wType/boolean");
var Link = require("../lib/wModel/link");
var List = require("./list");
var Artist = require("./artist");
var Album = require("./album");
var Song = require("./song");
var PaneModel = require("../lib/wModel/proxy/pane");
var MusicPage = Page.inherit({
"className": "MusicPage",
"constructor": function(address, name) {
Page.fn.constructor.call(this, address, name);
this._dbConnected = false;
this._addresses = Object.create(null);
this._createAddresses();
var header = new String(this._address["+"](new Address(["header"])), "Music");
header.addProperty("fontFamily", "casualFont");
//var hvo = new Vocabulary();
this.addItem(header, 0, 0, 1, 1, Page.Aligment.CenterTop);
this._errMessage = new String(this._address["+"](new Address(["message"])), "Database is not connected");
this._errMessage.addProperty("fontFamily", "largeFont");
this._errMessage.addProperty("fontSize", "largeFontSize");
this.addItem(this._errMessage, 1, 0, 1, 1, Page.Aligment.CenterTop);
},
"destructor": function() {
if (this._dbConnected && this._hasParentReporter) {
this._destroyLists();
} else {
this.removeItem(this._errMessage);
}
this._errMessage.destructor();
for (var tag in this._addresses) {
var group = this._addresses[tag];
for (var name in group) {
group[name].destructor();
}
}
Page.fn.destructor.call(this);
},
"_createAddresses": function() {
var ra = new Address(["artists"]);
var ral = new Address(["albums"]);
var rs = new Address(["songs"]);
var artists = Object.create(null);
var albums = Object.create(null);
var songs = Object.create(null);
artists.remote = ra.clone();
artists.local = this._address["+"](ra);
albums.remote = ral.clone();
albums.local = this._address["+"](ral);
songs.remote = rs.clone();
songs.local = this._address["+"](rs);
this._addresses.artists = artists;
this._addresses.albums = albums;
this._addresses.songs = songs;
var PaneArtist = PaneModel.Artists;
if (!PaneArtist) {
PaneArtist = PaneModel.inherit({});
PaneModel.Artists = PaneArtist;
} else {
PaneArtist.pageAddress.destructor()
}
PaneArtist.pageAddress = artists.local.clone();
var PaneAlbum = PaneModel.Albums;
if (!PaneAlbum) {
PaneAlbum = PaneModel.inherit({});
PaneModel.Albums = PaneAlbum;
} else {
PaneAlbum.pageAddress.destructor()
}
PaneAlbum.pageAddress = albums.local.clone();
var PaneSongs = PaneModel.Songs;
if (!PaneSongs) {
PaneSongs = PaneModel.inherit({});
PaneModel.Songs = PaneSongs;
} else {
PaneSongs.pageAddress.destructor()
}
PaneSongs.pageAddress = songs.local.clone();
ra.destructor();
ral.destructor();
rs.destructor();
},
"_createLists": function(socket) {
this._artists = new List(
this._addresses.artists.local.clone(),
"Artists",
this._addresses.artists.remote.clone(),
socket,
Artist
);
this._artistsLink = new Link(this._address["+"](new Address(["artistsLink"])), "Artists", this._addresses.artists.local.clone());
this._artistsLink.label.addProperty("fontSize", "largeFontSize");
this._artistsLink.label.addProperty("fontFamily", "largeFont");
this._artistsLink.label.addProperty("color", "primaryFontColor");
this._artistsLink.addProperty("backgroundColor", "primaryColor");
this._albums = new List(
this._addresses.albums.local.clone(),
"Albums",
this._addresses.albums.remote.clone(),
socket,
Album
);
this._albumsLink = new Link(this._address["+"](new Address(["albumsLink"])), "Albums", this._addresses.albums.local.clone());
this._albumsLink.label.addProperty("fontSize", "largeFontSize");
this._albumsLink.label.addProperty("fontFamily", "largeFont");
this._albumsLink.label.addProperty("color", "primaryFontColor");
this._albumsLink.addProperty("backgroundColor", "primaryColor");
this._songs = new List(
this._addresses.songs.local.clone(),
"Songs",
this._addresses.songs.remote.clone(),
socket,
Song
);
this._songsLink = new Link(this._address["+"](new Address(["songsLink"])), "Songs", this._addresses.songs.local.clone());
this._songsLink.label.addProperty("fontSize", "largeFontSize");
this._songsLink.label.addProperty("fontFamily", "largeFont");
this._songsLink.label.addProperty("color", "primaryFontColor");
this._songsLink.addProperty("backgroundColor", "primaryColor");
this.addItem(this._artistsLink, 1, 0, 1, 1);
this.addItem(this._albumsLink, 2, 0, 1, 1);
this.addItem(this._songsLink, 3, 0, 1, 1);
this.addPage(this._artists);
this.addPage(this._albums);
this.addPage(this._songs);
},
"_destroyLists": function() {
this.removePage(this._artists);
this.removePage(this._albums);
this.removePage(this._songs);
this.removeItem(this._artistsLink);
this.removeItem(this._albumsLink);
this.removeItem(this._songsLink);
this._artists.destructor();
this._albums.destructor();
this._songs.destructor();
this._artistsLink.destructor();
this._albumsLink.destructor();
this._songsLink.destructor();
},
"showError": function() {
if (this._dbConnected) {
if (!this._hasParentReporter) {
throw new Error("Parent reporter is required in music page");
}
this._destroyLists()
this.addItem(this._errMessage, 1, 0, 1, 1, Page.Aligment.CenterTop);
this._dbConnected = false;
}
},
"showBandList": function(perturaboSocket) {
if (!this._hasParentReporter) {
throw new Error("Parent reporter is required in music page");
}
if (!this._dbConnected) {
this.removeItem(this._errMessage);
this._createLists(perturaboSocket);
this._dbConnected = true;
}
}
});
module.exports = MusicPage;

151
magnus/pages/song.js Normal file
View file

@ -0,0 +1,151 @@
"use strict";
var TempPage = require("./tempPage");
var String = require("../lib/wModel/string");
var Image = require("../lib/wModel/image");
var VCController = require("../lib/wController/vocabulary");
var Address = require("../lib/wType/address");
var Uint64 = require("../lib/wType/uint64");
var SongPage = TempPage.inherit({
"className": "SongPage",
"constructor": function(address, name, id, proxySocket) {
TempPage.fn.constructor.call(this, address, name);
this._remoteId = id;
this._proxySocket = proxySocket;
this._ctrls = Object.create(null);
var header = this._header = new String(this._address["+"](new Address(["header"])), "");
header.addProperty("fontFamily", "casualFont");
this.addItem(header, 0, 1, 1, 1, TempPage.Aligment.CenterTop);
var album = this._album = new String(this._address["+"](new Address(["album"])), "Album name");
album.addProperty("fontFamily", "casualFont");
this.addItem(album, 1, 1, 1, 1, TempPage.Aligment.CenterTop);
var artist = this._artist = new String(this._address["+"](new Address(["artist"])), "Artist name");
artist.addProperty("fontFamily", "casualFont");
this.addItem(artist, 2, 1, 1, 1, TempPage.Aligment.CenterTop);
var image = this._image = new Image(this._address["+"](new Address(["image"])), new Uint64(0));
this.addItem(image, 0, 0, 3, 1, TempPage.Aligment.CenterCenter);
},
"destructor": function() {
this._clearCtrls();
TempPage.fn.destructor.call(this);
},
"_clearCtrls": function() {
for (var key in this._ctrls) {
this._ctrls[key].destructor();
}
this._ctrls = Object.create(null);
},
"_onAlbumNewElement": function(key, el) {
switch(key) {
case "name":
this._album.set(el);
break;
case "image":
this._image.set(el.clone());
break;
}
},
"_onAlbumRemoveElement": function(key) {
switch(key) {
case "name":
this._album.set("unknown");
case "image":
this._image.set(new Uint64(0));
break;
}
},
"_onArtistNewElement": function(key, el) {
switch(key) {
case "name":
this._artist.set(el);
break;
}
},
"_onArtistRemoveElement": function(key) {
switch(key) {
case "name":
this._artist.set("unknown");
}
},
"_onSongNewElement": function(key, el) {
switch(key) {
case "name":
this._header.set(el);
break;
case "album":
if (this._ctrls.album) {
this.trigger("serviceMessage", "an album controller reinitializes in song page, not suppose to happen!", 1);
this._ctrls.album.destructor();
}
var aVC = new VCController(new Address(["albums", el.toString()]));
aVC.on("newElement", this._onAlbumNewElement, this);
aVC.on("removeElement", this._onAlbumRemoveElement, this);
this._ctrls.album = aVC;
aVC.register(this._dp, this._proxySocket);
aVC.subscribe();
break;
case "artist":
if (this._ctrls.artist) {
this.trigger("serviceMessage", "an artist controller reinitializes in song page, not suppose to happen!", 1);
this._ctrls.artist.destructor();
}
var arVC = new VCController(new Address(["artists", el.toString()]));
arVC.on("newElement", this._onArtistNewElement, this);
arVC.on("removeElement", this._onArtistRemoveElement, this);
this._ctrls.artist = arVC;
arVC.register(this._dp, this._proxySocket);
arVC.subscribe();
break;
}
},
"_onSongRemoveElement": function(key) {
switch(key) {
case "name":
this._header.set("");
break;
case "album":
this._album.set("");
this._ctrls.album.destructor();
delete this._ctrls.album;
case "artist":
this._artist.set("");
this._ctrls.artist.destructor();
delete this._ctrls.artist;
}
},
"register": function(dp, server) {
TempPage.fn.register.call(this, dp, server);
for (var key in this._ctrls) {
this._ctrls[key].register(dp, this._proxySocket);
}
},
"setParentReporter": function(pr) {
TempPage.fn.setParentReporter.call(this, pr);
var songVC = new VCController(new Address(["songs", this._remoteId.toString()]));
songVC.on("newElement", this._onSongNewElement, this);
songVC.on("removeElement", this._onSongRemoveElement, this);
this._ctrls.song = songVC;
songVC.register(this._dp, this._proxySocket);
songVC.subscribe();
},
"unsetParentReporter": function() {
this._clearCtrls();
TempPage.fn.unsetParentReporter.call(this);
}
});
module.exports = SongPage;

46
magnus/pages/tempPage.js Normal file
View file

@ -0,0 +1,46 @@
"use strict";
var Page = require("../lib/wModel/page");
var config = require("../config/config.json");
var TempPage = Page.inherit({
"className": "TempPage",
"constructor": function(address, name) {
Page.fn.constructor.call(this, address, name);
this._destructionTimeout = undefined;
},
"destructor": function() {
if (this._destructionTimeout) {
clearTimeout(this._destructionTimeout);
}
Page.fn.destructor.call(this);
},
"checkSubscribersAndDestroy": function() {
if (this._subscribersCount === 0 && this._destructionTimeout === undefined) {
this.trigger("serviceMessage", this._address.toString() + " has no more subscribers, destroying page");
this._destructionTimeout = setTimeout(this.trigger.bind(this, "destroyMe"), config.modelDestructionTimeout);
}
},
"_h_subscribe": function(ev) {
Page.fn._h_subscribe.call(this, ev);
if (this._destructionTimeout !== undefined) {
clearTimeout(this._destructionTimeout);
this._destructionTimeout = undefined;
}
},
"_h_unsubscribe": function(ev) {
Page.fn._h_unsubscribe.call(this, ev);
this.checkSubscribersAndDestroy();
},
"_onSocketDisconnected": function(ev, socket) {
Page.fn._onSocketDisconnected.call(this, ev, socket);
this.checkSubscribersAndDestroy();
}
});
module.exports = TempPage;

19
magnus/pages/test.js Normal file
View file

@ -0,0 +1,19 @@
"use strict";
var Page = require("../lib/wModel/page");
var String = require("../lib/wModel/string");
var Address = require("../lib/wType/address");
var TestPage = Page.inherit({
"className": "TestPage",
"constructor": function(address, name) {
Page.fn.constructor.call(this, address, name);
var header = new String(this._address["+"](new Address(["message"])), "This is a test page");
header.addProperty("fontFamily", "casualFont");
this.addItem(header, 0, 0, 1, 1, Page.Aligment.CenterTop);
}
});
module.exports = TestPage;