├── packages └── meteor-postgres │ ├── minisql │ ├── minisql_tests.js │ ├── minisql.js │ └── alasql.js.map │ ├── collection │ ├── collection_tests.js │ └── collection.js │ ├── README.md │ ├── package.js │ └── postgres │ ├── sqlserver_tests.js │ └── serversql.js ├── .gitignore ├── simple-todos.html ├── README.md ├── simple-todos.css ├── LICENSE └── simple-todos.js /packages/meteor-postgres/minisql/minisql_tests.js: -------------------------------------------------------------------------------- 1 | var MiniSqlStub = function(name) { 2 | var stub = miniSQL(); 3 | stub.table = name; 4 | stub.conString = 'postgres://postgres:1234@localhost/postgres'; 5 | stub.wrapSave = Meteor.wrapAsync(stub.save.bind(stub)); 6 | stub.wrapFetch = Meteor.wrapAsync(stub.fetch.bind(stub)); 7 | return stub; 8 | }; 9 | 10 | Tinytest.add('miniSQL - test - basic', function(test) { 11 | //TODO 12 | }); -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.*~ 2 | *.swp 3 | *.swo 4 | .build* 5 | .npm 6 | settings.json 7 | .DS_Store 8 | /.meteor 9 | *~ 10 | /dev_bundle 11 | /dev_bundle*.tar.gz 12 | /android_bundle 13 | /android_bundle*.tar.gz 14 | /node_*.tar.gz 15 | /mongo_*.tar.gz 16 | /dist 17 | \#*\# 18 | .\#* 19 | .idea 20 | *.iml 21 | *.sublime-project 22 | *.sublime-workspace 23 | TAGS 24 | *.log 25 | *.out 26 | npm-debug.log 27 | universe 28 | .floo 29 | .flooignore 30 | .gitconfig 31 | 'postgres://meteor:Meteor1234@191.238.146.165/meteor' -------------------------------------------------------------------------------- /packages/meteor-postgres/collection/collection_tests.js: -------------------------------------------------------------------------------- 1 | Tinytest.add( 2 | 'SQL.collection - SQL.Collection instantiation', 3 | function (test) { 4 | test.throws( 5 | function () { 6 | SQL.Collection(null); 7 | }, 8 | /Use new to construct a SQLCollection/ 9 | ); 10 | 11 | test.throws( 12 | function() { 13 | var test1 = new SQL.Collection(); 14 | }, 15 | /First argument to new SQLCollection must exist/ 16 | ); 17 | 18 | test.throws( 19 | function() { 20 | var test2 = new SQL.Collection(1234); 21 | }, 22 | /First argument to new SQLCollection must be a string or null/ 23 | ); 24 | 25 | } 26 | ); 27 | 28 | Tinytest.add('Livedata - server method - tests', function (test) { 29 | // var testCollection = new SQL.Collection('test'); 30 | //no event name error handle 31 | }); -------------------------------------------------------------------------------- /simple-todos.html: -------------------------------------------------------------------------------- 1 | 2 | Todo List 3 | 4 | 5 | 6 | 7 | 8 |
9 |
10 |

Todo List

11 |
12 | 13 | 15 |
16 |
17 | 18 | 25 |
26 |
27 | 28 | 33 |
34 | 35 | 36 | 37 | 46 | -------------------------------------------------------------------------------- /packages/meteor-postgres/README.md: -------------------------------------------------------------------------------- 1 | # [Meteor-Postgres](http://www.meteorpostgres.com/) 2 | 3 | 4 | ![Postgres](https://s3-us-west-1.amazonaws.com/treebookicons/postgresql_logo.jpg "Postgres")![Meteor](https://s3-us-west-1.amazonaws.com/treebookicons/meteor-logo.png "Meteor") 5 | 6 | ### Installation 7 | 8 | Run the following from a command line. 9 | 10 | meteor add meteorsteam:meteor-postgres 11 | 12 | If you had previously downloaded the unstable pre-release, please remove and re-add the package. 13 | 14 | ### Usage 15 | 16 | * [Getting Started](https://github.com/meteor-stream/meteor-postgres/wiki/Getting-Started) 17 | * [Full List of Database Methods](https://github.com/meteor-stream/meteor-postgres/wiki/Database-Methods) 18 | * [Demo Todo App](http://todopostgres.meteor.com/) 19 | * [Refactor from Mongo to PostgreSQL](https://www.youtube.com/watch?v=JwHfxJnD0Yc) 20 | 21 | ### Implementation 22 | 23 | We used [Node-Postgres](https://github.com/brianc/node-postgres) on the server and [AlaSQL](https://github.com/agershun/alasql) on the client. 24 | 25 | ### Contribution Guidelines 26 | 27 | Coming soon. 28 | 29 | If you want to make modifications to our package for your project, clone this repo and include the /packages/meteor-postgres folder in your /packages. You will need to add the package to your packages file in .meteor. 30 | 31 | ### License 32 | 33 | Released under the MIT license. See the LICENSE file for more info. 34 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### As Meteor has announced that they will be providing native SQL support in the future, we are no longer maintaining this repo. But you can find an maintained version [here](https://github.com/storeness/meteor-postgres). 2 | 3 | # [Meteor-Postgres](http://www.meteorpostgres.com/) 4 | 5 | 6 | ![Postgres](https://s3-us-west-1.amazonaws.com/treebookicons/postgresql_logo.jpg "Postgres")![Meteor](https://s3-us-west-1.amazonaws.com/treebookicons/meteor-logo.png "Meteor") 7 | 8 | ### Installation 9 | 10 | Run the following from a command line. 11 | 12 | meteor add meteorsteam:meteor-postgres 13 | 14 | If you had previously downloaded the unstable pre-release, please remove and re-add the package. 15 | 16 | ### Usage 17 | 18 | * [Getting Started](https://github.com/meteor-stream/meteor-postgres/wiki/Getting-Started) 19 | * [Full List of Database Methods](https://github.com/meteor-stream/meteor-postgres/wiki/Database-Methods) 20 | * [Refactor from Mongo to PostgreSQL](https://www.youtube.com/watch?v=JwHfxJnD0Yc) 21 | 22 | ### Implementation 23 | 24 | We used [Node-Postgres](https://github.com/brianc/node-postgres) on the server and [AlaSQL](https://github.com/agershun/alasql) on the client. 25 | 26 | ### Contribution Guidelines 27 | 28 | Coming soon. 29 | 30 | If you want to make modifications to our package for your project, clone this repo and include the /packages/meteor-postgres folder in your /packages. You will need to add the package to your packages file in .meteor. 31 | 32 | ### License 33 | 34 | Released under the MIT license. See the LICENSE file for more info. 35 | -------------------------------------------------------------------------------- /packages/meteor-postgres/package.js: -------------------------------------------------------------------------------- 1 | Package.describe({ 2 | name: 'meteorsteam:meteor-postgres', 3 | version: '0.1.4', 4 | // Brief, one-line summary of the package. 5 | summary: 'PostgreSQL support for Meteor', 6 | // URL to the Git repository containing the source code for this package. 7 | git: 'https://github.com/meteor-stream/meteor-postgres', 8 | // By default, Meteor will default to using README.md for documentation. 9 | // To avoid submitting documentation, set this field to null. 10 | documentation: 'README.md' 11 | }); 12 | 13 | Npm.depends({ 14 | 'pg': '4.3.0' 15 | }); 16 | 17 | Package.onUse(function (api) { 18 | // The order these files are imported is very important 19 | api.versionsFrom('1.1.0.1'); 20 | api.use('underscore'); 21 | api.use('tracker'); 22 | api.use('ddp'); 23 | 24 | // minisql 25 | api.addFiles(['minisql/alasql.js', 'minisql/alasql.js.map', 'minisql/minisql.js'], 'client'); 26 | api.export('miniSQL', 'client'); 27 | 28 | api.addFiles('postgres/serversql.js', 'server'); 29 | api.export('serverSQL', 'server'); 30 | 31 | api.addFiles('collection/collection.js'); 32 | api.export('SQL'); 33 | 34 | }); 35 | 36 | Package.onTest(function (api) { 37 | api.versionsFrom('1.1'); 38 | api.use(['spacebars', 'tinytest', 'test-helpers', 'underscore', 'tracker', 'ddp']); 39 | api.addFiles('postgres/serversql.js', 'server'); 40 | api.export('serverSQL', 'server'); 41 | api.addFiles('collection/collection.js', ['server', 'client']); 42 | api.export('SQL', ['server', 'client']); 43 | api.addFiles('collection/collection_tests.js'); 44 | api.addFiles('postgres/sqlserver_tests.js', 'server'); 45 | }); 46 | 47 | -------------------------------------------------------------------------------- /simple-todos.css: -------------------------------------------------------------------------------- 1 | /* CSS declarations go here */ 2 | body { 3 | font-family: sans-serif; 4 | background-color: #315481; 5 | background-image: linear-gradient(to bottom, #315481, #918e82 100%); 6 | background-attachment: fixed; 7 | 8 | position: absolute; 9 | top: 0; 10 | bottom: 0; 11 | left: 0; 12 | right: 0; 13 | 14 | padding: 0; 15 | margin: 0; 16 | 17 | font-size: 14px; 18 | } 19 | 20 | .container { 21 | max-width: 600px; 22 | margin: 0 auto; 23 | min-height: 100%; 24 | background: white; 25 | } 26 | 27 | header { 28 | background: #d2edf4; 29 | background-image: linear-gradient(to bottom, #d0edf5, #e1e5f0 100%); 30 | padding: 20px 15px 15px 15px; 31 | position: relative; 32 | } 33 | 34 | #login-buttons { 35 | display: block; 36 | } 37 | 38 | h1 { 39 | font-size: 1.5em; 40 | margin: 0; 41 | margin-bottom: 10px; 42 | display: inline-block; 43 | margin-right: 1em; 44 | } 45 | 46 | form { 47 | margin-top: 10px; 48 | margin-bottom: -10px; 49 | position: relative; 50 | } 51 | 52 | .new-user input { 53 | box-sizing: border-box; 54 | padding: 10px 0; 55 | background: transparent; 56 | border: none; 57 | width: 100%; 58 | padding-right: 80px; 59 | font-size: 1em; 60 | } 61 | 62 | .new-user input:focus{ 63 | outline: 0; 64 | } 65 | 66 | .new-task input { 67 | box-sizing: border-box; 68 | padding: 10px 0; 69 | background: transparent; 70 | border: none; 71 | width: 100%; 72 | padding-right: 80px; 73 | font-size: 1em; 74 | } 75 | 76 | .new-task input:focus{ 77 | outline: 0; 78 | } 79 | 80 | ul { 81 | margin: 0; 82 | padding: 0; 83 | background: white; 84 | } 85 | 86 | .delete { 87 | float: right; 88 | font-weight: bold; 89 | background: none; 90 | font-size: 1em; 91 | border: none; 92 | position: relative; 93 | } 94 | 95 | li { 96 | position: relative; 97 | list-style: none; 98 | padding: 15px; 99 | border-bottom: #eee solid 1px; 100 | } 101 | 102 | li .text { 103 | margin-left: 10px; 104 | } 105 | 106 | li.checked { 107 | color: #888; 108 | } 109 | 110 | li.checked .text { 111 | text-decoration: line-through; 112 | } 113 | 114 | li.private { 115 | background: #eee; 116 | border-color: #ddd; 117 | } 118 | 119 | header .hide-completed { 120 | float: right; 121 | } 122 | 123 | .toggle-private { 124 | margin-left: 5px; 125 | } 126 | 127 | @media (max-width: 600px) { 128 | li { 129 | padding: 12px 15px; 130 | } 131 | 132 | .search { 133 | width: 150px; 134 | clear: both; 135 | } 136 | 137 | .new-task input { 138 | padding-bottom: 5px; 139 | } 140 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014-2015 Andrey Gershun (agershun@gmail.com) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | The MIT License (MIT) 24 | 25 | Copyright (c) 2015 ben@latenightsketches.com 26 | 27 | Permission is hereby granted, free of charge, to any person obtaining a copy 28 | of this software and associated documentation files (the "Software"), to deal 29 | in the Software without restriction, including without limitation the rights 30 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 31 | copies of the Software, and to permit persons to whom the Software is 32 | furnished to do so, subject to the following conditions: 33 | 34 | The above copyright notice and this permission notice shall be included in all 35 | copies or substantial portions of the Software. 36 | 37 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 38 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 39 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 40 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 41 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 42 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 43 | SOFTWARE. 44 | 45 | The MIT License (MIT) 46 | 47 | Copyright (c) 2015 Space Elephant 48 | 49 | Permission is hereby granted, free of charge, to any person obtaining a copy 50 | of this software and associated documentation files (the "Software"), to deal 51 | in the Software without restriction, including without limitation the rights 52 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 53 | copies of the Software, and to permit persons to whom the Software is 54 | furnished to do so, subject to the following conditions: 55 | 56 | The above copyright notice and this permission notice shall be included in all 57 | copies or substantial portions of the Software. 58 | 59 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 60 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 61 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 62 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 63 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 64 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 65 | SOFTWARE. 66 | -------------------------------------------------------------------------------- /simple-todos.js: -------------------------------------------------------------------------------- 1 | // Defining 2 SQL collections. The additional paramater is the postgres connection string which will only run on the server 2 | tasks = new SQL.Collection('tasks'); 3 | username = new SQL.Collection('username'); 4 | 5 | if (Meteor.isClient) { 6 | var newUser = 'all'; 7 | var taskTable = { 8 | id: ['$number'], 9 | text: ['$string', '$notnull'], 10 | checked: ['$bool'], 11 | usernameid: ['$number'] 12 | }; 13 | 14 | tasks.createTable(taskTable); 15 | 16 | var usersTable = { 17 | id: ['$number'], 18 | name: ['$string', '$notnull'] 19 | }; 20 | username.createTable(usersTable); 21 | 22 | 23 | Template.body.helpers({ 24 | usernames: function () { 25 | return username.select() 26 | .fetch(); 27 | }, 28 | tasks: function () { 29 | if (newUser === 'all'){ 30 | return tasks.select('tasks.id', 'tasks.text', 'tasks.checked', 'tasks.createdat', 'username.name') 31 | .join(['OUTER JOIN'], ['usernameid'], [['username', ['id']]]) 32 | .fetch(); 33 | } 34 | else { 35 | return tasks.select('tasks.id', 'tasks.text', 'tasks.checked', 'tasks.createdat', 'username.name') 36 | .join(['OUTER JOIN'], ['usernameid'], [['username', ['id']]]) 37 | .where("name = ?", newUser) 38 | .fetch(); 39 | } 40 | } 41 | }); 42 | 43 | 44 | Template.body.events({ 45 | "submit .new-task": function (event) { 46 | if (event.target.category.value){ 47 | var user = username.select('id') 48 | .where("name = ?", event.target.category.value) 49 | .fetch(); 50 | user = user[0].id; 51 | var text = event.target.text.value; 52 | tasks.insert({ 53 | text:text, 54 | checked:false, 55 | usernameid: user 56 | }).save(); 57 | event.target.text.value = ""; 58 | } else{ 59 | alert("please add a user first"); 60 | } 61 | return false; 62 | }, 63 | "submit .new-user": function (event) { 64 | var text = event.target.text.value; 65 | username.insert({ 66 | name:text 67 | }).save(); 68 | event.target.text.value = ""; 69 | 70 | return false; 71 | }, 72 | "click .toggle-checked": function () { 73 | tasks.update({id: this.id, "checked": !this.checked}) 74 | .where("id = ?", this.id) 75 | .save(); 76 | }, 77 | "click .delete": function () { 78 | tasks.remove() 79 | .where("id = ?", this.id) 80 | .save(); 81 | }, 82 | "change .catselect": function(event){ 83 | newUser = event.target.value; 84 | tasks.reactiveData.changed(); 85 | } 86 | }); 87 | } 88 | 89 | if (Meteor.isServer) { 90 | //tasks.createTable({text: ['$string'], checked: ["$bool", {$default: false}]}).save(); 91 | //username.createTable({name: ['$string', '$unique']}).save(); 92 | //tasks.createRelationship('username', '$onetomany').save(); 93 | 94 | 95 | username.insert({name:'all'}).save(); 96 | // Publishing the collections 97 | tasks.publish('tasks', function(){ 98 | return tasks.select('tasks.id as id', 'tasks.text', 'tasks.checked', 'tasks.createdat', 'username.id as usernameid', 'username.name') 99 | .join(['INNER JOIN'], ["usernameid"], [["username", 'id']]) 100 | .order('createdat DESC') 101 | .limit(100); 102 | }); 103 | 104 | username.publish('username', function(){ 105 | return username.select('id', 'name') 106 | .order('createdat DESC') 107 | .limit(100); 108 | }); 109 | } 110 | -------------------------------------------------------------------------------- /packages/meteor-postgres/collection/collection.js: -------------------------------------------------------------------------------- 1 | 2 | var buffer = []; 3 | /** 4 | * @summary Namespace for SQL-related items 5 | * @namespace 6 | */ 7 | SQL = {}; 8 | 9 | SQL.Collection = function(connection) { 10 | var self = this; 11 | this.unvalidated = false; 12 | this.reactiveData = new Tracker.Dependency; 13 | this.tableName = connection; 14 | this.saveMethod = this.tableName + 'save'; 15 | this.fetchMethod = this.tableName + 'fetch'; 16 | 17 | if (!(self instanceof SQL.Collection)) { 18 | throw new Error('Use new to construct a SQLCollection'); 19 | } 20 | 21 | // boolean to keep track of whether the local DB has an unvalidated entry 22 | self._events = []; 23 | 24 | if (!this.tableName) { 25 | throw new Error('First argument to new SQLCollection must exist'); 26 | } 27 | 28 | if (this.tableName !== null && typeof this.tableName !== "string") { 29 | throw new Error('First argument to new SQLCollection must be a string or null'); 30 | } 31 | 32 | if (Meteor.isClient) { 33 | // Sets certain properties used for miniSQL 34 | miniSQL(this); 35 | } 36 | 37 | if (Meteor.isServer){ 38 | // Sets certain properties used for serverSQL 39 | serverSQL(this); 40 | } 41 | 42 | // initialize class 43 | this.table = connection; 44 | 45 | if (Meteor.isClient) { 46 | // Added will only be triggered on the initial population of the database client side. 47 | // Data added to any client while the page is already loaded will trigger a 'changed event' 48 | this.addEventListener('added', function(index, msg, name) { 49 | this.remove().save('client'); 50 | for (var x = msg.results.length - 1; x >= 0; x--) { 51 | this.insert(msg.results[x]).save('client'); 52 | } 53 | // Triggering Meteor's reactive data to allow for full stack reactivity 54 | }); 55 | // Changed will be triggered whenever the server database changed while the client has the page open. 56 | // This could happen from an addition, an update, or a removal, from that specific client, or another client 57 | this.addEventListener('changed', function(index, msg, name) { 58 | // Checking to see if event is a removal from the DB 59 | if (msg.removed) { 60 | var tableId = msg.tableId; 61 | // For the client that triggered the removal event, the data will have 62 | // already been removed and this is redundant, but it would be inefficient to fix. 63 | this.remove().where("id = ?", tableId).save('client'); 64 | } 65 | // Checking to see if event is a modification of the DB 66 | else if (msg.modified) { 67 | // For the client that triggered the removal event, the data will have 68 | // already been removed and this is redundant. 69 | this.update(msg.results).where("id = ?", msg.results.id).save('client'); 70 | } 71 | else { 72 | // The message is a new insertion of a message 73 | // If the message was submitted by this client then the insert message triggered 74 | // by the server should be an update rather than an insert 75 | // We use the unvalidated boolean variabe to keep track of this 76 | if (this.unvalidated) { 77 | this.update(msg.results).where("id = ?", -1).save('client'); 78 | this.unvalidated = false; 79 | } 80 | else { 81 | // The data was added by another client so just a regular insert 82 | this.insert(msg.results).save('client'); 83 | } 84 | } 85 | }); 86 | } 87 | // setting up the connection between server and client 88 | var selfConnection; 89 | var subscribeArgs; 90 | if (typeof connection === 'string') { 91 | // Using default connection 92 | subscribeArgs = Array.prototype.slice.call(arguments, 0); 93 | name = connection; 94 | if (Meteor.isClient) { 95 | connection = Meteor.connection; 96 | } else if (Meteor.isServer) { 97 | if (!selfConnection) { 98 | selfConnection = DDP.connect(Meteor.absoluteUrl()); 99 | } 100 | connection = selfConnection; 101 | } 102 | } else { 103 | // SQLCollection arguments does not use the first argument (the connection) 104 | subscribeArgs = Array.prototype.slice.call(arguments, 1); 105 | } 106 | 107 | var subsBefore = _.keys(connection._subscriptions); 108 | _.extend(self, connection.subscribe.apply(connection, subscribeArgs)); 109 | var subsNew = _.difference(_.keys(connection._subscriptions), subsBefore); 110 | if (subsNew.length !== 1) throw new Error('Subscription failed!'); 111 | self.subscriptionId = subsNew[0]; 112 | 113 | buffer.push({ 114 | connection: connection, 115 | name: name, 116 | subscriptionId: self.subscriptionId, 117 | instance: self 118 | }); 119 | 120 | // If first store for this subscription name, register it! 121 | if (_.filter(buffer, function(sub) { 122 | return sub.name === name && sub.connection === connection; 123 | }).length === 1) { 124 | registerStore(connection, name); 125 | } 126 | }; 127 | 128 | //The code below is originally from Numtel's meteor-mysql but adapted for the purposes of this project (https://github.com/numtel/meteor-mysql/blob/8d7ce8458892f6b255618d884fcde0ec4d04039b/lib/MysqlSubscription.js) 129 | var registerStore = function(connection, name) { 130 | connection.registerStore(name, { 131 | beginUpdate: function(batchSize, reset) { 132 | }, 133 | update: function(msg) { 134 | var idSplit = msg.id.split(':'); 135 | var sub = _.filter(buffer, function(sub) { 136 | return sub.subscriptionId === idSplit[0]; 137 | })[0].instance; 138 | if (idSplit.length === 1 && msg.msg === 'added' && 139 | msg.fields && msg.fields.reset === true) { 140 | // This message indicates a reset of a result set 141 | sub.dispatchEvent('reset', msg); 142 | sub.splice(0, sub.length); 143 | } else { 144 | var index = parseInt(idSplit[1], 10); 145 | var oldRow; 146 | sub.dispatchEvent('update', index, msg); 147 | switch (msg.msg) { 148 | case 'added': 149 | sub.splice(index, 0, msg.fields); 150 | sub.dispatchEvent(msg.msg, index, msg.fields, msg.collection); 151 | break; 152 | case 'changed': 153 | sub.splice(index, 0, msg.fields); 154 | sub.dispatchEvent(msg.msg, index, msg.fields, msg.collection); 155 | break; 156 | } 157 | } 158 | sub.changed(); 159 | }, 160 | endUpdate: function() { 161 | }, 162 | saveOriginals: function() { 163 | }, 164 | retrieveOriginals: function() { 165 | } 166 | }); 167 | }; 168 | 169 | // Inherit from Array and Tracker.Dependency 170 | SQL.Collection.prototype = new Array; 171 | _.extend(SQL.Collection.prototype, Tracker.Dependency.prototype); 172 | if (Meteor.isClient) { 173 | // extends the proto with miniSQL Methods 174 | _.extend(SQL.Collection.prototype, miniSQL.prototype); 175 | } 176 | 177 | if (Meteor.isServer){ 178 | // extends the proto with serverSQL Methods 179 | _.extend(SQL.Collection.prototype, serverSQL.prototype); 180 | } 181 | 182 | SQL.Collection.prototype.publish = function(collname, pubFunc) { 183 | var methodObj = {}; 184 | var context = this; 185 | methodObj[this.saveMethod] = function(input, dataArray) { 186 | context.save(input, dataArray); 187 | } 188 | methodObj[this.fetchMethod] = function(input, dataArray) { 189 | context.fetch(input, dataArray); 190 | } 191 | Meteor.methods(methodObj); 192 | Meteor.publish(collname, function () { 193 | // For this implementation to work you must call getCursor and provide a callback with the select 194 | // statement that needs to be reactive. The 'caboose' on the chain of calls must be autoSelect 195 | // and it must be passed the param 'sub' which is defining in the anon function. 196 | // This is a limitation of our implementation and will be fixed in later versions 197 | return { 198 | _publishCursor: function(sub){ 199 | return pubFunc().autoSelect(sub); 200 | } 201 | } 202 | }); 203 | }; 204 | 205 | SQL.Collection.prototype._eventRoot = function(eventName) { 206 | return eventName.split('.')[0]; 207 | }; 208 | 209 | SQL.Collection.prototype._selectEvents = function(eventName, invert) { 210 | var self = this; 211 | var eventRoot, testKey, testVal; 212 | if (!(eventName instanceof RegExp)) { 213 | eventRoot = self._eventRoot(eventName); 214 | if (eventName === eventRoot) { 215 | testKey = 'root'; 216 | testVal = eventRoot; 217 | } else { 218 | testKey = 'name'; 219 | testVal = eventName; 220 | } 221 | } 222 | return _.filter(self._events, function(event) { 223 | var pass; 224 | if (eventName instanceof RegExp) { 225 | pass = event.name.match(eventName); 226 | } else { 227 | pass = event[testKey] === testVal; 228 | } 229 | return invert ? !pass : pass; 230 | }); 231 | }; 232 | 233 | SQL.Collection.prototype.addEventListener = function(eventName, listener) { 234 | var self = this; 235 | if (typeof listener !== 'function') 236 | throw new Error('invalid-listener'); 237 | self._events.push({ 238 | name: eventName, 239 | root: self._eventRoot(eventName), 240 | listener: listener 241 | }); 242 | }; 243 | 244 | SQL.Collection.prototype.initialValue = function(eventName, listener) { 245 | return Postgres.select(this.tableName); 246 | }; 247 | 248 | // @param {string} eventName - Remove events of this name, pass without suffix 249 | // to remove all events matching root. 250 | SQL.Collection.prototype.removeEventListener = function(eventName) { 251 | var self = this; 252 | self._events = self._selectEvents(eventName, true); 253 | }; 254 | 255 | SQL.Collection.prototype.dispatchEvent = function(eventName /* arguments */) { 256 | var self = this; 257 | var listenerArgs = Array.prototype.slice.call(arguments, 1); 258 | var listeners = self._selectEvents(eventName); 259 | // Newest to oldest 260 | for (var i = listeners.length - 1; i >= 0; i--) { 261 | // Return false to stop further handling 262 | if (listeners[i].listener.apply(self, listenerArgs) === false) return false; 263 | } 264 | return true; 265 | }; 266 | 267 | SQL.Collection.prototype.reactive = function() { 268 | var self = this; 269 | self.depend(); 270 | return self; 271 | }; 272 | -------------------------------------------------------------------------------- /packages/meteor-postgres/postgres/sqlserver_tests.js: -------------------------------------------------------------------------------- 1 | // Currently all the tests based on ActiveRecord are running synchronously 2 | // Making test Stub using decorator 3 | var ActiveRecordStub = function(name) { 4 | var stub = serverSQL(); 5 | stub.table = name; 6 | stub.wrapSave = Meteor.wrapAsync(stub.save.bind(stub)); 7 | stub.wrapFetch = Meteor.wrapAsync(stub.fetch.bind(stub)); 8 | return stub; 9 | }; 10 | 11 | /** 12 | * Simple table test 13 | */ 14 | var testTasksTable = { 15 | text: ['$string', '$notnull'] 16 | }; 17 | 18 | var testUserTable = { 19 | username: ['$string', '$notnull'], 20 | age: ['$number'] 21 | }; 22 | 23 | if (Meteor.isServer) { 24 | var testTasks = ActiveRecordStub('testTasks'); 25 | testTasks.dropTable().wrapSave(null, null); 26 | testTasks.createTable(testTasksTable).wrapSave(null, null); 27 | testTasks.insert({ text: 'testing1' }).wrapSave(null, null); 28 | testTasks.insert({ text: 'testing2' }).wrapSave(null, null); 29 | testTasks.insert({ text: 'testing3' }).wrapSave(null, null); 30 | for (var i = 0; i < 5; i++) { 31 | testTasks.insert({ text: 'testing1' }).wrapSave(null, null); 32 | } 33 | 34 | var testUser = ActiveRecordStub('testUser'); 35 | testUser.dropTable().wrapSave(null, null); 36 | testUser.createTable(testUserTable).wrapSave(null, null); 37 | for (var i = 0; i < 3; i++) { 38 | testUser.insert({ username: 'eddie' + i, age: 2 * i }).wrapSave(null, null); 39 | testUser.insert({ username: 'paulo', age: 27}).wrapSave(null, null); 40 | } 41 | 42 | //Should test the operation defined in the serverSQL and return result successfully 43 | Tinytest.addAsync('activerecord - basic - success', function(test, onComplete) { 44 | var findOneResult1 = testTasks.findOne().wrapFetch(null, null); 45 | var findOneResult2 = testTasks.findOne(1).wrapFetch(null, null); 46 | test.equal(typeof findOneResult1.rows[0], 'object'); 47 | test.equal(findOneResult1.rows.length, 1); 48 | test.equal(findOneResult1.rows[0].text, 'testing1'); 49 | test.equal(typeof findOneResult2.rows[0], 'object'); 50 | test.equal(findOneResult2.rows.length, 1); 51 | test.equal(findOneResult2.rows[0].text, 'testing1'); 52 | 53 | //select 54 | var result = testTasks.select().where('text = ?', 'testing1').wrapFetch(null, null); 55 | //select + limit 56 | var result2 = testTasks.select().where('text = ?', 'testing1').limit(3).wrapFetch(null, null); 57 | //select + limit + offset 58 | var result3 = testTasks.select().where('text = ?', 'testing1').limit(3).offset(2).wrapFetch(null, null); 59 | //select + offset 60 | var result4 = testTasks.select().where('text = ?', 'testing1').offset(2).wrapFetch(null, null); 61 | var result5 = testTasks.select().where('text = ?', 'testing1').offset(6).wrapFetch(null, null); 62 | var result6 = testTasks.select().where('text = ?', 'testing1').offset(8).wrapFetch(null, null); 63 | //order default and DESC/ASC 64 | var result7 = testTasks.select().order('text').wrapFetch(null, null); 65 | var result8 = testTasks.select().order('text ASC').wrapFetch(null, null); 66 | var result9 = testTasks.select().order('text DESC').wrapFetch(null, null); 67 | //chaining order 68 | var result10 = testTasks.select().where('text = ?', 'testing1').order('id DESC').offset(2).limit(3).wrapFetch(null, null); 69 | var result11 = testTasks.select().where('text = ?', 'testing1').offset(2).order('id DESC').limit(3).wrapFetch(null, null); 70 | 71 | test.equal(typeof result.rows, 'object'); 72 | test.equal(result.rows.length, 6); 73 | _.each(result.rows, function(item) { 74 | test.equal(item.text, 'testing1'); 75 | }); 76 | test.equal(result2.rows.length, 3); 77 | _.each(result2.rows, function(item) { 78 | test.equal(item.text, 'testing1'); 79 | }); 80 | test.equal(result3.rows.length, 3); 81 | _.each(result3.rows, function(item) { 82 | test.equal(item.text, 'testing1'); 83 | }); 84 | test.equal(result4.rows.length, 4); 85 | _.each(result4.rows, function(item) { 86 | test.equal(item.text, 'testing1'); 87 | }); 88 | test.equal(result5.rows.length, 0); 89 | test.equal(result6.rows.length, 0); 90 | test.equal(result7.rows, result8.rows); 91 | test.equal(result7.rows[7], result9.rows[0]); 92 | test.equal(result10.rows, result11.rows); 93 | 94 | var result12 = testTasks.select().where('text = ?', ['testing1', 'testing2']).wrapFetch(null, null); 95 | var result13 = testTasks.select().where('text = ?', ['testing1']).wrapFetch(null, null); 96 | var result14 = testTasks.select().where('id = ? AND text = ?', 2, 'testing1').wrapFetch(null, null); 97 | var result15 = testTasks.select().where('id = ? AND text = ?', [1, 2, 3], ['testing1', 'testing2']).wrapFetch(null, null); 98 | test.equal(result12.rows.length, 7); 99 | test.equal(result12.rows[1].text, 'testing2'); 100 | test.equal(result13.rows, result.rows); 101 | test.equal(result14.rows.length, 0); 102 | test.equal(result15.rows.length, 2); 103 | test.equal(result15.rows[0].id, 1); 104 | test.equal(result15.rows[1].id, 2); 105 | test.equal(result15.rows[0].text, 'testing1'); 106 | test.equal(result15.rows[1].text, 'testing2'); 107 | // Non-overreiden first, last, take 108 | var result1 = testTasks.select().offset(2).where('text = ?', 'testing1').order('id DESC').limit(3).first().wrapFetch(null, null); 109 | var result2 = testTasks.select().first(2).wrapFetch(null, null); 110 | var result3 = testTasks.select().last(4).wrapFetch(null, null); 111 | var result4 = testTasks.select().offset(2).where('text = ?', 'testing1').order('id DESC').limit(3).last().wrapFetch(null, null); 112 | var result5 = testTasks.select().offset(2).order('id DESC').limit(3).take().wrapFetch(null, null); 113 | var result6 = testTasks.select().take().wrapSave(null, null); 114 | //should consider chainging order for first, last, take? 115 | test.equal(result1.rows[0], result2.rows[0]); 116 | test.equal(result3.rows[0], result4.rows[0]); 117 | test.equal(result3.rows[1].id, 7); 118 | test.equal(result5.rows, result6.rows); 119 | 120 | //update and remove 121 | // update coverage should take another args, currently just 1 arg 122 | // should better add the rule that forbid changes in id? 123 | var origin = testTasks.select().where('text = ?', 'testing1').wrapSave(null, null); 124 | testTasks.update({ text: 'testing1' }).where('text = ?', 'testing2').wrapSave(null, null); 125 | var result1 = testTasks.select().where('text = ?', 'testing1').wrapFetch(null, null); 126 | test.equal(origin.rows.length + 1, result1.rows.length); 127 | testTasks.update( {text: 'testing3'} ).wrapSave(null, null); 128 | var result2 = testTasks.select().where('text = ?', 'testing1').wrapFetch(null, null); 129 | var result3 = testTasks.select().where('text = ?', 'testing3').wrapFetch(null, null); 130 | test.equal(result2.rows.length, 0); 131 | test.equal(result3.rows.length, 8); 132 | 133 | testTasks.where('id = ?', '2').remove().wrapSave(null, null); 134 | var result1 = testTasks.select().wrapFetch(null, null); 135 | test.equal(result1.rows.length, 7); 136 | testTasks.remove().wrapSave(null, null); 137 | var result2 = testTasks.select().wrapFetch(null, null); 138 | test.equal(result2.rows.length, 0); 139 | 140 | // branch coverage TODO 141 | // select args not empty branch 142 | // not empty and no distinct 143 | // var result1 = testUser.select('testUser.username', 'testUser.age'). 144 | // not empty and has distinct 145 | 146 | // update args > 1 branch 147 | testUser.update({username: 'PaulOS', age: 100}).where('username = ?', 'notexist').wrapSave(null, null); 148 | var result1 = testUser.select().where('username = ?', 'PaulOS').wrapFetch(null, null); 149 | test.equal(result1.rows.length, 0); 150 | 151 | testUser.update({username: 'PaulOS', age: 100}).where('username = ?', 'paulo').wrapSave(null, null); 152 | var result2 = testUser.select().where('username = ?', 'PaulOS').wrapFetch(null, null); 153 | test.equal(result2.rows.length, 3); 154 | _.each(result2.rows, function(item) { 155 | test.equal(item.username, 'PaulOS'); 156 | test.equal(item.age, 100); 157 | }); 158 | 159 | onComplete(); 160 | }); 161 | 162 | //Should throw error for the test failed case 163 | Tinytest.addAsync('activerecord - basic - failure', function(test, onComplete) { 164 | // create already existed throw error 165 | test.throws(function() { 166 | testTasks.createTable(testTasks).wrapSave(null, null); 167 | }); 168 | // throw error is schema different 169 | test.throws(function() { 170 | testTasks.insert({ text: 'failure', username: 'eric'}).wrapSave(null, null); 171 | }); 172 | //update error 173 | test.throws(function() { 174 | testTasks.update( {username: 'kate'} ).where('text = ?', 'testing3').wrapSave(null, null); 175 | }); 176 | 177 | // How should update behavior for non-existed where? 178 | // test.throws(function() { 179 | // testTasks.update( {text: 'testing2'} ).where('text = ?', 'testing2').wrapSave(null, null); 180 | // }); 181 | // Should not throw error if drop an unexisted table 182 | 183 | try { 184 | var expectedError; 185 | testTasks.dropTable('notExistedTable').wrapSave(null, null); 186 | } catch(error) { 187 | expectedError = error; 188 | } 189 | test.isTrue(!expectedError); 190 | //findOne can only find id 191 | test.throws(function() { 192 | testTasks.findOne('testing1').wrapFetch(null, null); 193 | }); 194 | 195 | //Clear the table after use 196 | testTasks.dropTable().wrapSave(null, null); 197 | testUser.dropTable().wrapSave(null, null); 198 | onComplete(); 199 | }); 200 | 201 | //Complex table 202 | // Todo: createRelationShip 203 | // Join table test 204 | var testTree = ActiveRecordStub('testTree'); 205 | var testLocation = ActiveRecordStub('testLocation'); 206 | var testSpecies = ActiveRecordStub('testSpecies'); 207 | 208 | var testTreeTable = { 209 | id: ['$number', '$notnull'], 210 | treename: ['$string', '$notnull'], 211 | locationid: ['$number', '$notnull'], 212 | speciesid: ['$number', '$notnull'] 213 | }; 214 | 215 | var testLocationTable = { 216 | id: ['$number', '$notnull'], 217 | longitude: ['$float', '$notnull'], 218 | latitude: ['$float', '$notnull'] 219 | }; 220 | 221 | var testSpeciesTable = { 222 | id: ['$number', '$notnull'], 223 | species: ['$string', '$notnull'] 224 | }; 225 | 226 | testTree.dropTable().wrapSave(null, null); 227 | testLocation.dropTable().wrapSave(null, null); 228 | testSpecies.dropTable().wrapSave(null, null); 229 | 230 | var testTree = ActiveRecordStub('testTree'); 231 | var testLocation = ActiveRecordStub('testLocationTable'); 232 | var testSpecies = ActiveRecordStub('testSpeciesTable'); 233 | 234 | Tinytest.addAsync('activerecord - advanced - success', function(test, onComplete) { 235 | testTree.dropTable().wrapSave(null, null); 236 | testLocation.dropTable().wrapSave(null, null); 237 | testSpecies.dropTable().wrapSave(null, null); 238 | onComplete(); 239 | }); 240 | } 241 | 242 | // Connection test, should be added after the default connect string removed 243 | Meteor.isServer && Tinytest.add('activerecord - connection failure', 244 | function(test) { 245 | 246 | } 247 | ); 248 | 249 | -------------------------------------------------------------------------------- /packages/meteor-postgres/minisql/minisql.js: -------------------------------------------------------------------------------- 1 | miniSQL = function(Collection){ 2 | 3 | Collection = Collection || Object.create(miniSQL.prototype); 4 | Collection.table = Collection.tableName; 5 | 6 | // inputString used by queries, overrides other strings 7 | // includes: create table, create relationship, drop table, insert 8 | Collection.inputString = ''; 9 | Collection.inputString2 = ''; 10 | Collection.autoSelectData = ''; 11 | Collection.autoSelectInput = ''; 12 | Collection.tableElements = {}; 13 | 14 | // statement starters 15 | Collection.selectString = ''; 16 | Collection.updateString = ''; 17 | Collection.deleteString = ''; 18 | 19 | // chaining statements 20 | Collection.joinString = ''; 21 | Collection.whereString = ''; 22 | Collection.clientWhereString = ''; 23 | Collection.serverWhereString = ''; 24 | 25 | // caboose statements 26 | Collection.orderString = ''; 27 | Collection.limitString = ''; 28 | Collection.offsetString = ''; 29 | Collection.groupString = ''; 30 | Collection.havingString = ''; 31 | 32 | Collection.dataArray = []; 33 | Collection.dataArray2 = []; 34 | Collection.server = null; 35 | 36 | // error logging 37 | Collection.prevFunc = ''; 38 | return Collection; 39 | }; 40 | 41 | miniSQL.prototype.createTable = function(tableObj) { 42 | var _DataTypes = { 43 | $number: 'integer', 44 | $string: 'varchar(255)', 45 | $json: 'json', 46 | $datetime: 'date', 47 | $float: 'decimal', 48 | $seq: 'serial', 49 | $bool: 'boolean' 50 | }; 51 | 52 | var _TableConstraints = { 53 | $unique: 'unique', 54 | $check: 'check ', // value 55 | $exclude: 'exclude', 56 | $notnull: 'not null', 57 | $default: 'default ', // value 58 | $primary: 'primary key' 59 | }; 60 | 61 | alasql.fn.Date = Date; 62 | 63 | var startString = 'CREATE TABLE ' + this.table + ' ('; 64 | var item, subKey, valOperator, inputString = ''; 65 | 66 | for (var key in tableObj) { 67 | this.tableElements[key] = key; 68 | inputString += key + ' '; 69 | inputString += _DataTypes[tableObj[key][0]]; 70 | if (Array.isArray(tableObj[key]) && tableObj[key].length > 1) { 71 | for (var i = 1, count = tableObj[key].length; i < count; i++) { 72 | item = tableObj[key][i]; 73 | if (typeof item === 'object') { 74 | subKey = Object.keys(item); 75 | valOperator = _TableConstraints[subKey]; 76 | inputString += ' ' + valOperator + item[subKey]; 77 | } else { 78 | inputString += ' ' + _TableConstraints[item]; 79 | } 80 | } 81 | } 82 | inputString += ', '; 83 | } 84 | // check to see if id already provided 85 | if (inputString.indexOf('id') === -1) { 86 | startString += 'id serial primary key,'; 87 | } 88 | 89 | this.inputString = startString + inputString + " createdat Date); "; 90 | this.prevFunc = 'CREATE TABLE'; 91 | alasql(this.inputString); 92 | this.clearAll(); 93 | return this; 94 | }; 95 | 96 | miniSQL.prototype.dropTable = function() { 97 | this.inputString = 'DROP TABLE IF EXISTS ' + this.table + ' CASCADE;'; 98 | this.prevFunc = 'DROP TABLE'; 99 | return this; 100 | }; 101 | 102 | miniSQL.prototype.insert = function(serverInserts, clientInserts) { 103 | // server 104 | if(serverInserts['id'] === undefined){ 105 | serverInserts['id'] = -1; 106 | } 107 | // client 108 | this.dataArray2 = []; 109 | var insertString2 = 'INSERT INTO ' + this.table + ' ('; 110 | var valueString2 = ') VALUES ('; 111 | for (var key2 in clientInserts) { 112 | insertString2 += key2 + ', '; 113 | this.dataArray2.push(clientInserts[key2]); 114 | valueString2 += '?, '; 115 | } 116 | for (var key3 in serverInserts) { 117 | insertString2 += key3 + ', '; 118 | this.dataArray2.push(serverInserts[key3]); 119 | valueString2 += '?, '; 120 | } 121 | this.server = true; 122 | this.inputString2 = insertString2.substring(0, insertString2.length - 2) + valueString2.substring(0, valueString2.length - 2) + ');'; 123 | 124 | 125 | this.dataArray = []; 126 | if (serverInserts['id'] === -1){ 127 | delete serverInserts['id']; 128 | } 129 | var insertString = 'INSERT INTO ' + this.table + ' ('; 130 | var valueString = ') VALUES (', j = 1; 131 | for (var key in serverInserts) { 132 | insertString += key + ', '; // field 133 | this.dataArray.push(serverInserts[key]); // data 134 | valueString += '$' + j++ + ', '; // $1, $2, etc 135 | } 136 | 137 | this.inputString = insertString.substring(0, insertString.length - 2) + valueString.substring(0, valueString.length - 2) + ');'; 138 | 139 | 140 | 141 | this.prevFunc = 'INSERT'; 142 | return this; 143 | }; 144 | 145 | miniSQL.prototype.update = function(updates) { 146 | this.updateString = 'UPDATE ' + this.table + ' SET '; 147 | for (var key in updates) { 148 | if (typeof updates[key] === 'number' && !isNaN(updates[key]) || typeof(updates[key]) === "boolean"){ 149 | this.updateString += key + ' = ' + updates[key] + ', '; 150 | } 151 | else { 152 | this.updateString += key + ' = "' + updates[key] + '", '; 153 | } 154 | } 155 | this.updateString = this.updateString.substring(0,this.updateString.length-2); 156 | this.prevFunc = 'UPDATE'; 157 | return this; 158 | }; 159 | 160 | miniSQL.prototype.remove = function() { 161 | this.deleteString = 'DELETE FROM ' + this.table; 162 | this.prevFunc = 'DELETE'; 163 | return this; 164 | }; 165 | 166 | miniSQL.prototype.select = function(/*arguments*/) { 167 | var args = ''; 168 | if (arguments.length >= 1) { 169 | for (var i = 0; i < arguments.length; i++) { 170 | if (arguments[i] === 'distinct') { 171 | args += 'DISTINCT '; 172 | } else { 173 | args += arguments[i] + ', '; 174 | } 175 | } 176 | args = args.substring(0, args.length - 2); 177 | } else { 178 | args += '*'; 179 | } 180 | this.selectString = 'SELECT ' + args + ' FROM ' + this.table + " "; 181 | this.prevFunc = 'SELECT'; 182 | return this; 183 | }; 184 | 185 | miniSQL.prototype.findOne = function(/*arguments*/) { 186 | if (arguments.length === 2) { 187 | this.inputString = 'SELECT * FROM ' + this.table + ' WHERE ' + this.table + '.id = ' + args + ' LIMIT 1;'; 188 | } else { 189 | this.inputString = 'SELECT * FROM ' + this.table + ' LIMIT 1'; 190 | } 191 | this.prevFunc = 'FIND ONE'; 192 | return this; 193 | }; 194 | 195 | miniSQL.prototype.join = function(joinType, fields, joinTable) { 196 | if (Array.isArray(joinType)) { 197 | for (var x = 0, count = fields.length; x < count; x++) { 198 | this.joinString = " " + joinType[x] + " " + joinTable[x][0] + " ON " + this.table + "." + fields[x] + " = " + joinTable[x][0] + "." + joinTable[x][1]; 199 | } 200 | } else { 201 | this.joinString = " " + joinType + " " + joinTable + " ON " + this.table + "." + fields + " = " + joinTable + "." + joinTable; 202 | } 203 | this.prevFunc = "JOIN"; 204 | return this; 205 | }; 206 | 207 | miniSQL.prototype.where = function(/*Arguments*/) { 208 | 209 | this.dataArray = []; 210 | this.dataArray2 = []; 211 | var where = '', redux, substring1, substring2; 212 | 213 | where += arguments[0]; 214 | // replace ? with rest of array 215 | for (var i = 1, count = arguments.length; i < count; i++) { 216 | if (Array.isArray(arguments[i])) { 217 | if (arguments[i].length === 0) { 218 | throw new Error('Invalid input: array is empty'); 219 | } 220 | redux = where.indexOf('?'); 221 | substring1 = where.substring(0, redux); 222 | substring2 = where.substring(redux + 1, where.length); 223 | where = substring1 + 'ANY($' + i + ')'+ substring2; 224 | this.dataArray.push(arguments[i]); 225 | } else { 226 | redux = where.indexOf('?'); 227 | substring1 = where.substring(0, redux); 228 | substring2 = where.substring(redux + 1, where.length); 229 | where = substring1 + '$' + i + substring2; 230 | this.dataArray.push(arguments[i]); 231 | } 232 | } 233 | this.serverWhereString = ' WHERE ' + where; 234 | 235 | where = ''; 236 | where += arguments[0]; 237 | for (var i = 1, count = arguments.length; i < count; i++) { 238 | if (Array.isArray(arguments[i])) { 239 | redux = where.indexOf('?'); 240 | substring1 = where.substring(0, redux); 241 | substring2 = where.substring(redux + 1, where.length); 242 | where = substring1 + 'IN (' + arguments[i].join(',') + ')' + substring2; 243 | } else { 244 | this.dataArray2.push(arguments[i]); 245 | } 246 | } 247 | this.clientWhereString = ' WHERE ' + where; 248 | 249 | return this; 250 | }; 251 | 252 | miniSQL.prototype.order = function(/*arguments*/) { 253 | 254 | var args = ''; 255 | if (arguments.length > 1) { 256 | for (var i = 0; i < arguments.length; i++) { 257 | args += arguments[i] + ', '; 258 | } 259 | args = args.substring(0, args.length - 2); 260 | } else { 261 | args = arguments[0]; 262 | } 263 | this.orderString = ' ORDER BY ' + args; 264 | return this; 265 | }; 266 | 267 | miniSQL.prototype.limit = function(limit) { 268 | this.limitString = ' LIMIT ' + limit; 269 | return this; 270 | }; 271 | 272 | miniSQL.prototype.offset = function(offset) { 273 | this.offsetString = ' OFFSET ' + offset; 274 | return this; 275 | }; 276 | 277 | miniSQL.prototype.group = function(group) { 278 | this.groupString = 'GROUP BY ' + group; 279 | return this; 280 | }; 281 | 282 | miniSQL.prototype.first = function(limit) { 283 | limit = limit || 1; 284 | this.inputString += 'SELECT * FROM ' + this.table + ' ORDER BY ' + this.table + '.id ASC LIMIT ' + limit + ';'; 285 | this.prevFunc = 'FIRST'; 286 | return this; 287 | }; 288 | 289 | miniSQL.prototype.last = function(limit) { 290 | limit = limit || 1; 291 | this.inputString += 'SELECT * FROM ' + this.table + ' ORDER BY ' + this.table + '.id DESC LIMIT ' + limit + ';'; 292 | this.prevFunc = 'LAST'; 293 | return this; 294 | }; 295 | 296 | miniSQL.prototype.take = function(limit) { 297 | limit = limit || 1; 298 | this.inputString += 'SELECT * FROM ' + this.table + ' LIMIT ' + limit + ';'; 299 | this.prevFunc = 'TAKE'; 300 | return this; 301 | }; 302 | 303 | miniSQL.prototype.clearAll = function() { 304 | this.inputString = ''; 305 | this.inputString2 = ''; 306 | this.autoSelectData = ''; 307 | this.autoSelectInput = ''; 308 | 309 | // statement starters 310 | this.selectString = ''; 311 | this.updateString = ''; 312 | this.deleteString = ''; 313 | 314 | // chaining statements 315 | this.joinString = ''; 316 | this.whereString = ''; 317 | this.clientWhereString = ''; 318 | this.serverWhereString = ''; 319 | 320 | // caboose statements 321 | this.orderString = ''; 322 | this.limitString = ''; 323 | this.offsetString = ''; 324 | this.groupString = ''; 325 | this.havingString = ''; 326 | 327 | this.dataArray = []; 328 | this.dataArray2 = []; 329 | this.server = null; 330 | 331 | // error logging 332 | this.prevFunc = ''; 333 | }; 334 | 335 | miniSQL.prototype.fetch = function(server) { 336 | 337 | this.reactiveData.depend(); 338 | 339 | var dataArray = this.dataArray; 340 | var starter = this.updateString || this.deleteString || this.selectString; 341 | 342 | var input = this.inputString.length > 0 ? this.inputString : starter + this.joinString + this.clientWhereString + this.orderString + this.limitString + 343 | this.offsetString + this.groupString + this.havingString + ';'; 344 | 345 | 346 | var result = alasql(input, dataArray); 347 | 348 | var name = this.table + 'fetch'; 349 | if (server === "server") { 350 | input = this.inputString.length > 0 ? this.inputString : starter + this.joinString + this.serverWhereString + this.orderString + this.limitString + 351 | this.offsetString + this.groupString + this.havingString + ';'; 352 | Meteor.call(this.fetchMethod, input, dataArray); 353 | } 354 | this.clearAll(); 355 | return result; 356 | }; 357 | 358 | miniSQL.prototype.save = function(client) { 359 | 360 | var dataArray = this.dataArray; 361 | var dataArray2 = this.dataArray2; 362 | var starter = this.updateString || this.deleteString || this.selectString; 363 | var input = this.inputString2.length > 0 ? this.inputString2 : starter + this.joinString + this.clientWhereString + ';'; 364 | 365 | var result = alasql(input, dataArray2); 366 | // postgres 367 | var name = this.table + 'save'; 368 | if (client !== "client") { 369 | input = this.inputString.length > 0 ? this.inputString : starter + this.joinString + this.serverWhereString + ';'; 370 | this.unvalidated = true; 371 | Meteor.call(this.saveMethod, input, dataArray); 372 | } 373 | this.reactiveData.changed(); 374 | 375 | this.clearAll(); 376 | return result; 377 | }; -------------------------------------------------------------------------------- /packages/meteor-postgres/postgres/serversql.js: -------------------------------------------------------------------------------- 1 | pg = Npm.require('pg'); // Node-Postgres 2 | var clientHolder = {}; 3 | 4 | function removeListeningConnections(){ 5 | for (var key in clientHolder) { 6 | clientHolder[key].end(); 7 | } 8 | } 9 | 10 | process.on('exit', removeListeningConnections); 11 | _.each(['SIGINT', 'SIGHUP', 'SIGTERM'], function (sig) { 12 | process.once(sig, function () { 13 | removeListeningConnections(); 14 | process.kill(process.pid, sig); 15 | }); 16 | }); 17 | 18 | /** 19 | * @param Collection 20 | * @constructor 21 | */ 22 | serverSQL = function (Collection) { 23 | 24 | Collection = Collection || Object.create(serverSQL.prototype); 25 | Collection.table = Collection.tableName; 26 | 27 | Collection.conString = process.env.MP_POSTGRES || process.env.DATABASE_URL; 28 | // inputString used by queries, overrides other strings 29 | // includes: create table, create relationship, drop table, insert 30 | Collection.inputString = ''; 31 | Collection.autoSelectData = ''; 32 | Collection.autoSelectInput = ''; 33 | 34 | // statement starters 35 | Collection.selectString = ''; 36 | Collection.updateString = ''; 37 | Collection.deleteString = ''; 38 | 39 | // chaining statements 40 | Collection.joinString = ''; 41 | Collection.whereString = ''; 42 | 43 | // caboose statements 44 | Collection.orderString = ''; 45 | Collection.limitString = ''; 46 | Collection.offsetString = ''; 47 | Collection.groupString = ''; 48 | Collection.havingString = ''; 49 | 50 | Collection.dataArray = []; 51 | 52 | // error logging 53 | Collection.prevFunc = ''; 54 | return Collection; 55 | }; 56 | 57 | /** 58 | * Data Types 59 | * @type {{$number: string, $string: string, $json: string, $datetime: string, $float: string, $seq: string, $bool: string}} 60 | * @private 61 | */ 62 | serverSQL.prototype._DataTypes = { 63 | $number: 'integer', 64 | $string: 'varchar(255)', 65 | $json: 'json', 66 | $datetime: 'date', 67 | $float: 'decimal', 68 | $seq: 'serial', 69 | $bool: 'boolean' 70 | }; 71 | 72 | /** 73 | * Table Constraints 74 | * @type {{$unique: string, $check: string, $exclude: string, $notnull: string, $default: string, $primary: string}} 75 | * @private 76 | */ 77 | serverSQL.prototype._TableConstraints = { 78 | $unique: 'unique', 79 | $check: 'check ', // value 80 | $exclude: 'exclude', 81 | $notnull: 'not null', 82 | $default: 'default ', // value 83 | $primary: 'primary key' 84 | }; 85 | 86 | /** 87 | * SQL: CREATE TABLE field data_type constraint 88 | * Notes: Required for all SQL Collections, must use prescribed data types and table constraints 89 | * Type: Query 90 | * @param tableObj 91 | */ 92 | serverSQL.prototype.createTable = function (tableObj) { 93 | 94 | var startString = 'CREATE TABLE ' + this.table + ' ('; 95 | var item, subKey, valOperator, inputString = ''; 96 | 97 | for (var key in tableObj) { 98 | inputString += key + ' '; 99 | inputString += this._DataTypes[tableObj[key][0]]; 100 | if (Array.isArray(tableObj[key]) && tableObj[key].length > 1) { 101 | for (var i = 1, count = tableObj[key].length; i < count; i++) { 102 | item = tableObj[key][i]; 103 | if (typeof item === 'object') { 104 | subKey = Object.keys(item); 105 | valOperator = this._TableConstraints[subKey]; 106 | inputString += ' ' + valOperator + item[subKey]; 107 | } else { 108 | inputString += ' ' + this._TableConstraints[item]; 109 | } 110 | } 111 | } 112 | inputString += ', '; 113 | } 114 | // check to see if id already provided 115 | if (inputString.indexOf('id') === -1) { 116 | startString += 'id serial primary key,'; 117 | } 118 | 119 | this.inputString = startString + inputString + " createdat TIMESTAMP default now()); " + 120 | "CREATE OR REPLACE FUNCTION notify_trigger_" + this.table + "() RETURNS trigger AS $$" + 121 | "BEGIN" + 122 | " IF (TG_OP = 'DELETE') THEN " + 123 | "PERFORM pg_notify('notify_trigger_" + this.table + "', '[{' || TG_TABLE_NAME || ':' || OLD.id || '}, { operation: " + 124 | "\"' || TG_OP || '\"}]');" + 125 | "RETURN old;" + 126 | "ELSIF (TG_OP = 'INSERT') THEN " + 127 | "PERFORM pg_notify('notify_trigger_" + this.table + "', '[{' || TG_TABLE_NAME || ':' || NEW.id || '}, { operation: " + 128 | "\"' || TG_OP || '\"}]');" + 129 | "RETURN new; " + 130 | "ELSIF (TG_OP = 'UPDATE') THEN " + 131 | "PERFORM pg_notify('notify_trigger_" + this.table + "', '[{' || TG_TABLE_NAME || ':' || NEW.id || '}, { operation: " + 132 | "\"' || TG_OP || '\"}]');" + 133 | "RETURN new; " + 134 | "END IF; " + 135 | "END; " + 136 | "$$ LANGUAGE plpgsql; " + 137 | "CREATE TRIGGER watched_table_trigger AFTER INSERT OR DELETE OR UPDATE ON " + this.table + 138 | " FOR EACH ROW EXECUTE PROCEDURE notify_trigger_" + this.table + "();"; 139 | 140 | this.prevFunc = 'CREATE TABLE'; 141 | return this; 142 | }; 143 | 144 | /** 145 | * Notes: Deletes cascade 146 | * SQL: DROP TABLE 147 | */ 148 | serverSQL.prototype.dropTable = function () { 149 | this.inputString = 'DROP TABLE IF EXISTS ' + this.table + ' CASCADE; DROP FUNCTION IF EXISTS notify_trigger_' + this.table + '() CASCADE;'; 150 | this.prevFunc = 'DROP TABLE'; 151 | return this; 152 | }; 153 | 154 | /** 155 | * SQL: INSERT INTO
() VALUES () 156 | * Type: Query 157 | * @param insertObj 158 | */ 159 | serverSQL.prototype.insert = function (insertObj) { 160 | var valueString = ') VALUES (', keys = Object.keys(insertObj); 161 | var insertString = 'INSERT INTO ' + this.table + ' ('; 162 | this.dataArray = []; 163 | // iterate through array arguments to populate input string parts 164 | for (var i = 0, count = keys.length; i < count;) { 165 | insertString += keys[i] + ', '; 166 | this.dataArray.push(insertObj[keys[i]]); 167 | valueString += '$' + (++i) + ', '; 168 | } 169 | this.inputString = insertString.substring(0, insertString.length - 2) + valueString.substring(0, valueString.length - 2) + ');'; 170 | this.prevFunc = 'INSERT'; 171 | return this; 172 | }; 173 | 174 | /** 175 | * SQL: UPDATE
SET () = () 176 | * Type: Statement Starter 177 | * @param {object} updatesObj 178 | * @param {string} updatesObj Key (Field) 179 | * @param {string} updatesObj Value (Data) 180 | */ 181 | serverSQL.prototype.update = function (updatesObj) { 182 | var updateField = '(', updateValue = '(', keys = Object.keys(updatesObj); 183 | if (keys.length > 1) { 184 | for (var i = 0, count = keys.length - 1; i < count; i++) { 185 | updateField += keys[i] + ', '; 186 | updateValue += "'" + updatesObj[keys[i]] + "', "; 187 | } 188 | updateField += keys[keys.length - 1]; 189 | updateValue += "'" + updatesObj[keys[keys.length - 1]] + "'"; 190 | } else { 191 | updateField += keys[0]; 192 | updateValue += "'" + updatesObj[keys[0]] + "'"; 193 | } 194 | this.updateString = 'UPDATE ' + this.table + ' SET ' + updateField + ') = ' + updateValue + ')'; 195 | this.prevFunc = 'UPDATE'; 196 | return this; 197 | }; 198 | 199 | /** 200 | * SQL: DELETE FROM table 201 | * Type: Statement Starter 202 | * Notes: If not chained with where it will remove all rows 203 | */ 204 | serverSQL.prototype.remove = function () { 205 | this.deleteString = 'DELETE FROM ' + this.table; 206 | this.prevFunc = 'DELETE'; 207 | return this; 208 | }; 209 | 210 | // Parameters: fields (arguments, optional) 211 | // SQL: SELECT fields FROM table, SELECT * FROM table 212 | // Special: May pass table, distinct, field to obtain a single record per unique value 213 | // STATEMENT STARTER/SELECT STRING 214 | /** 215 | * SQL: SELECT fields FROM table, SELECT * FROM table 216 | * Type: Statement Starter 217 | * Notes: May pass distinct, field (two separate arguments) to obtain a single record per unique value 218 | * @param {string} [arguments] 219 | * fields to select 220 | */ 221 | serverSQL.prototype.select = function (/*arguments*/) { 222 | var args = ''; 223 | if (arguments.length >= 1) { 224 | for (var i = 0; i < arguments.length; i++) { 225 | if (arguments[i] === 'distinct') { 226 | args += 'DISTINCT '; 227 | } else { 228 | args += arguments[i] + ', '; 229 | } 230 | } 231 | args = args.substring(0, args.length - 2); 232 | } else { 233 | args += '*'; 234 | } 235 | this.selectString = 'SELECT ' + args + ' FROM ' + this.table + " "; 236 | this.prevFunc = 'SELECT'; 237 | return this; 238 | }; 239 | 240 | /** 241 | * SQL: SELECT * FROM table WHERE table.id = id LIMIT 1; SELECT * FROM table LIMIT 1; 242 | * Notes: If no id is passed will return random 243 | * Type: Query 244 | * @param {number} [id] 245 | */ 246 | serverSQL.prototype.findOne = function (/*arguments*/) { 247 | if (arguments.length === 1) { 248 | var args = arguments[0]; 249 | this.inputString = 'SELECT * FROM ' + this.table + ' WHERE ' + this.table + '.id = ' + args + ' LIMIT 1;'; 250 | } else { 251 | this.inputString = 'SELECT * FROM ' + this.table + ' LIMIT 1'; 252 | } 253 | this.prevFunc = 'FIND ONE'; 254 | return this; 255 | }; 256 | 257 | /** 258 | * SQL: JOIN joinTable ON field = field 259 | * Type: Statement 260 | * Notes: Parameters can also be all arrays 261 | * @param {String} joinType 262 | * @param {String} fields 263 | * @param {String} joinTable 264 | */ 265 | serverSQL.prototype.join = function (joinType, fields, joinTable) { 266 | if (Array.isArray(joinType)) { 267 | for (var x = 0, count = fields.length; x < count; x++){ 268 | this.joinString = " " + joinType[x] + " " + joinTable[x][0] + " ON " + this.table + "." + fields[x] + " = " + joinTable[x][0] + "." + joinTable[x][1]; 269 | } 270 | } else { 271 | this.joinString = " " + joinType + " " + joinTable + " ON " + this.table + "." + fields + " = " + joinTable + "." + joinTable; 272 | } 273 | this.prevFunc = "JOIN"; 274 | return this; 275 | }; 276 | 277 | /** 278 | * SQL: WHERE field operator comparator, WHERE field1 operator1 comparator1 AND/OR field2 operator2 comparator2, WHERE field IN (x, y) 279 | * Type: Statement 280 | * Notes: 281 | * @param {string} directions 282 | * condition with ?'s for values 283 | * @param {string} values 284 | * values to be used 285 | */ 286 | serverSQL.prototype.where = function (/*Arguments*/) { 287 | this.dataArray = []; 288 | var where = '', redux, substring1, substring2; 289 | where += arguments[0]; 290 | for (var i = 1, count = arguments.length; i < count; i++) { 291 | if (Array.isArray(arguments[i])) { 292 | if (arguments[i].length === 0) { 293 | throw new Error('Invalid input: array is empty'); 294 | } 295 | redux = where.indexOf('?'); 296 | substring1 = where.substring(0, redux); 297 | substring2 = where.substring(redux + 1, where.length); 298 | where = substring1 + 'ANY($' + i + ')'+ substring2; 299 | this.dataArray.push(arguments[i]); 300 | } else { 301 | redux = where.indexOf('?'); 302 | substring1 = where.substring(0, redux); 303 | substring2 = where.substring(redux + 1, where.length); 304 | where = substring1 + '$' + i + substring2; 305 | this.dataArray.push(arguments[i]); 306 | } 307 | } 308 | this.whereString = ' WHERE ' + where; 309 | return this; 310 | }; 311 | 312 | /** 313 | * SQL: ORDER BY fields 314 | * Notes: ASC is default, add DESC after the field name to reverse 315 | * Type: Caboose 316 | * @param {string} fields 317 | */ 318 | serverSQL.prototype.order = function (/*arguments*/) { 319 | var args = ''; 320 | if (arguments.length > 1) { 321 | for (var i = 0; i < arguments.length; i++) { 322 | args += arguments[i] + ', '; 323 | } 324 | args = args.substring(0, args.length - 2); 325 | } else { 326 | args = arguments[0]; 327 | } 328 | this.orderString = ' ORDER BY ' + args; 329 | return this; 330 | }; 331 | 332 | /** 333 | * SQL: LIMIT number 334 | * Type: Caboose 335 | * @param {number} limit 336 | */ 337 | serverSQL.prototype.limit = function (limit) { 338 | this.limitString = ' LIMIT ' + limit; 339 | return this; 340 | }; 341 | 342 | /** 343 | * SQL: OFFSET number 344 | * Type: Caboose 345 | * @param {number} offset 346 | */ 347 | serverSQL.prototype.offset = function (offset) { 348 | this.offsetString = ' OFFSET ' + offset; 349 | return this; 350 | }; 351 | 352 | /** 353 | * SQL: GROUP BY field 354 | * Type: Caboose 355 | * @param {string} group 356 | */ 357 | serverSQL.prototype.group = function (group) { 358 | this.groupString = 'GROUP BY ' + group; 359 | return this; 360 | }; 361 | 362 | // TODO: HAVING 363 | 364 | /** 365 | * SQL: SELECT * FROM table ORDER BY table.id ASC LIMIT 1, SELECT * FROM table ORDER BY table.id ASC LIMIT limit 366 | * Type: Query 367 | * @param limit 368 | */ 369 | serverSQL.prototype.first = function (limit) { 370 | limit = limit || 1; 371 | this.clearAll(); 372 | this.inputString += 'SELECT * FROM ' + this.table + ' ORDER BY ' + this.table + '.id ASC LIMIT ' + limit + ';'; 373 | this.prevFunc = 'FIRST'; 374 | return this; 375 | }; 376 | 377 | /** 378 | * SQL: SELECT * FROM table ORDER BY table.id DESC LIMIT 1, SELECT * FROM table ORDER BY table.id DESC LIMIT limit 379 | * Type: Query 380 | * @param {number} limit 381 | */ 382 | serverSQL.prototype.last = function (limit) { 383 | limit = limit || 1; 384 | this.clearAll(); 385 | this.inputString += 'SELECT * FROM ' + this.table + ' ORDER BY ' + this.table + '.id DESC LIMIT ' + limit + ';'; 386 | this.prevFunc = 'LAST'; 387 | return this; 388 | }; 389 | 390 | /** 391 | * SQL: SELECT * FROM table LIMIT 1, SELECT * FROM table LIMIT limit 392 | * Type: Query 393 | * @param {number} limit 394 | * Defaults to 1 395 | */ 396 | serverSQL.prototype.take = function (limit) { 397 | limit = limit || 1; 398 | this.clearAll(); 399 | this.inputString += 'SELECT * FROM ' + this.table + ' LIMIT ' + limit + ';'; 400 | this.prevFunc = 'TAKE'; 401 | return this; 402 | }; 403 | 404 | /** 405 | * Type: Data method 406 | * @param {string} input 407 | * @param {array} data 408 | * @param {function} cb 409 | */ 410 | serverSQL.prototype.fetch = function (input, data, cb) { 411 | var table = this.table; 412 | var dataArray = data || this.dataArray; 413 | var prevFunc = this.prevFunc; 414 | 415 | var starter = this.updateString || this.deleteString || this.selectString; 416 | 417 | if (!input) { 418 | input = this.inputString.length > 0 ? this.inputString : starter + this.joinString + this.whereString + this.orderString + this.limitString + 419 | this.offsetString + this.groupString + this.havingString + ';'; 420 | } 421 | 422 | //cb = cb || function(prevFunc, table, results) {return console.log("results in " + prevFunc + ' ' + table, results.rows)}; 423 | pg.connect(this.conString, function (err, client, done) { 424 | if (err) { 425 | console.log(err, "in " + prevFunc + ' ' + table); 426 | console.log('Input Statement: ', input); 427 | } 428 | client.query(input, dataArray, function (error, results) { 429 | if (cb) { cb(error, results); } 430 | done(); 431 | }); 432 | }); 433 | this.clearAll(); 434 | }; 435 | 436 | /** 437 | * Type: Data method 438 | * @param {string} input 439 | * @param {array} data 440 | * @param {function} cb 441 | */ 442 | serverSQL.prototype.save = function (input, data, cb) { 443 | 444 | var table = this.table; 445 | var dataArray = data || this.dataArray; 446 | var prevFunc = this.prevFunc; 447 | 448 | var starter = this.updateString || this.deleteString || this.selectString; 449 | 450 | if (!input) { 451 | input = this.inputString.length > 0 ? this.inputString : starter + this.joinString + this.whereString + ';'; 452 | } 453 | 454 | pg.connect(this.conString, function (err, client, done) { 455 | if (err) { 456 | console.log(err, "in " + prevFunc + ' ' + table); 457 | console.log('Input Statement: ', input); 458 | } 459 | client.query(input, dataArray, function (error, results) { 460 | if (cb) { cb(error, results); } 461 | }); 462 | done(); 463 | }); 464 | this.clearAll(); 465 | }; 466 | 467 | /** 468 | * Type: Maintenance 469 | */ 470 | serverSQL.prototype.clearAll = function() { 471 | this.inputString = ''; 472 | this.autoSelectData = ''; 473 | this.autoSelectInput = ''; 474 | 475 | // statement starters 476 | this.selectString = ''; 477 | this.updateString = ''; 478 | this.deleteString = ''; 479 | 480 | // chaining statements 481 | this.joinString = ''; 482 | this.whereString = ''; 483 | 484 | // caboose statements 485 | this.orderString = ''; 486 | this.limitString = ''; 487 | this.offsetString = ''; 488 | this.groupString = ''; 489 | this.havingString = ''; 490 | 491 | this.dataArray = []; 492 | 493 | // error logging 494 | this.prevFunc = ''; 495 | }; 496 | 497 | /** 498 | * Type: Query 499 | * @param {string} relTable 500 | * @param {string} relationship 501 | */ 502 | serverSQL.prototype.createRelationship = function(relTable, relationship){ 503 | if (relationship === "$onetomany"){ 504 | this.inputString = "ALTER TABLE " + this.table + " ADD " + relTable + 505 | "id INTEGER references " + relTable + "(id) ON DELETE CASCADE;"; 506 | } 507 | else { 508 | this.inputString = "CREATE TABLE IF NOT EXISTS" + 509 | this.table + relTable + " (" + this.table + "id integer references " + this.table + "(id) ON DELETE CASCADE, " + 510 | relTable + "id integer references " + relTable + "(id) ON DELETE CASCADE, " + 511 | "PRIMARY KEY(" + this.table + "id, " + relTable + "id)); "; 512 | } 513 | return this; 514 | }; 515 | 516 | /** 517 | * 518 | * @returns {string|*|string} input string 519 | */ 520 | serverSQL.prototype.returnSql = function(){ 521 | var table = this.table; 522 | var dataArray = this.dataArray; 523 | var prevFunc = this.prevFunc; 524 | 525 | var starter = this.updateString || this.deleteString || this.selectString; 526 | 527 | var input = this.inputString.length > 0 ? this.inputString : starter + this.joinString + this.whereString + this.orderString + this.limitString + 528 | this.offsetString + this.groupString + this.havingString + ';'; 529 | 530 | return input; 531 | }; 532 | 533 | /** 534 | * 535 | * @param sub 536 | */ 537 | serverSQL.prototype.autoSelect = function(sub) { 538 | 539 | // We need a dedicated client to watch for changes on each table. We store these clients in 540 | // our clientHolder and only create a new one if one does not already exist 541 | var table = this.table; 542 | var prevFunc = this.prevFunc; 543 | var newWhere = this.whereString; 544 | var newSelect = newSelect || this.selectString; 545 | var newJoin = newJoin || this.joinString; 546 | 547 | this.autoSelectInput = this.autoSelectInput !== "" ? this.autoSelectInput : this.selectString + this.joinString + newWhere + this.orderString + this.limitString + ';'; 548 | this.autoSelectData = this.autoSelectData !== "" ? this.autoSelectData : this.dataArray; 549 | var value = this.autoSelectInput; 550 | this.clearAll(); 551 | 552 | 553 | var loadAutoSelectClient = function(name, cb){ 554 | // Function to load a new client, store it, and then send it to the function to add the watcher 555 | var context = this; 556 | var client = new pg.Client(process.env.MP_POSTGRES); 557 | client.connect(); 558 | clientHolder[name] = client; 559 | cb(client); 560 | }; 561 | 562 | var autoSelectHelper = function(client1){ 563 | // Selecting all from the table 564 | client1.query(value, function(error, results) { 565 | if (error) { 566 | console.log(error, "in autoSelect top") 567 | } else { 568 | sub._session.send({ 569 | msg: 'added', 570 | collection: sub._name, 571 | id: sub._subscriptionId, 572 | fields: { 573 | reset: false, 574 | results: results.rows 575 | } 576 | }); 577 | } 578 | }); 579 | // Adding notification triggers 580 | var query = client1.query("LISTEN notify_trigger_" + table); 581 | client1.on('notification', function(msg) { 582 | var returnMsg = eval("(" + msg.payload + ")"); 583 | var k = sub._name; 584 | if (returnMsg[1].operation === "DELETE") { 585 | var tableId = parseInt(returnMsg[0][k]); 586 | sub._session.send({ 587 | msg: 'changed', 588 | collection: sub._name, 589 | id: sub._subscriptionId, 590 | index: tableId, 591 | fields: { 592 | removed: true, 593 | reset: false, 594 | tableId:tableId 595 | } 596 | }); 597 | } 598 | else if (returnMsg[1].operation === "UPDATE") { 599 | var selectString = newSelect + newJoin + " WHERE " + table + ".id = " + returnMsg[0][table]; 600 | pg.connect(process.env.MP_POSTGRES, function (err, client, done) { 601 | if (err) { 602 | console.log(err, "in " + prevFunc + ' ' + table); 603 | } 604 | client.query(selectString, this.autoSelectData, function(error, results) { 605 | if (error) { 606 | console.log(error, "in autoSelect update"); 607 | } else { 608 | done(); 609 | sub._session.send({ 610 | msg: 'changed', 611 | collection: sub._name, 612 | id: sub._subscriptionId, 613 | index: tableId, 614 | fields: { 615 | modified: true, 616 | removed: false, 617 | reset: false, 618 | results: results.rows[0] 619 | } 620 | }); 621 | } 622 | }); 623 | }); 624 | } 625 | else if (returnMsg[1].operation === "INSERT") { 626 | var selectString = newSelect + newJoin + " WHERE " + table + ".id = " + returnMsg[0][table]; 627 | pg.connect(process.env.MP_POSTGRES, function (err, client, done) { 628 | if (err) { 629 | console.log(err, "in " + prevFunc + ' ' + table); 630 | } 631 | client.query(selectString, this.autoSelectData, function(error, results) { 632 | if (error) { 633 | } else { 634 | done(); 635 | sub._session.send({ 636 | msg: 'changed', 637 | collection: sub._name, 638 | id: sub._subscriptionId, 639 | fields: { 640 | removed: false, 641 | reset: false, 642 | results: results.rows[0] 643 | } 644 | }); 645 | } 646 | }); 647 | }); 648 | } 649 | }); 650 | }; 651 | 652 | // Checking to see if this table already has a dedicated client before adding the listener 653 | if(clientHolder[table]){ 654 | autoSelectHelper(clientHolder[table]); 655 | } else{ 656 | loadAutoSelectClient(table, autoSelectHelper); 657 | } 658 | 659 | }; 660 | -------------------------------------------------------------------------------- /packages/meteor-postgres/minisql/alasql.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "file": "alasql.js", 4 | "sources": [ 5 | "src/10start.js", 6 | "src/alasqlparser.js", 7 | "src/12pretty.js", 8 | "src/15utility.js", 9 | "src/16comments.js", 10 | "src/17alasql.js", 11 | "src/20database.js", 12 | "src/21transaction.js", 13 | "src/23table.js", 14 | "src/24view.js", 15 | "src/25queryclass.js", 16 | "src/28yy.js", 17 | "src/30statements.js", 18 | "src/38query.js", 19 | "src/39dojoin.js", 20 | "src/40select.js", 21 | "src/41exists.js", 22 | "src/420from.js", 23 | "src/421join.js", 24 | "src/422where.js", 25 | "src/423groupby.js", 26 | "src/424select.js", 27 | "src/425having.js", 28 | "src/426orderby.js", 29 | "src/43rollup.js", 30 | "src/44defcols.js", 31 | "src/45union.js", 32 | "src/46apply.js", 33 | "src/47over.js", 34 | "src/50expression.js", 35 | "src/52linq.js", 36 | "src/55functions.js", 37 | "src/56datetime.js", 38 | "src/57case.js", 39 | "src/58json.js", 40 | "src/59convert.js", 41 | "src/60createtable.js", 42 | "src/61date.js", 43 | "src/62droptable.js", 44 | "src/64altertable.js", 45 | "src/65createindex.js", 46 | "src/66dropindex.js", 47 | "src/67withselect.js", 48 | "src/68if.js", 49 | "src/69while.js", 50 | "src/70insert.js", 51 | "src/72delete.js", 52 | "src/74update.js", 53 | "src/75merge.js", 54 | "src/76usedatabase.js", 55 | "src/77declare.js", 56 | "src/78show.js", 57 | "src/79set.js", 58 | "src/80console.js", 59 | "src/81commit.js", 60 | "src/83into.js", 61 | "src/84from.js", 62 | "src/85help.js", 63 | "src/86print.js", 64 | "src/87source.js", 65 | "src/88require.js", 66 | "src/89assert.js", 67 | "src/90websql.js", 68 | "src/91indexeddb.js", 69 | "src/92localstorage.js", 70 | "src/93sqlite.js", 71 | "src/94filestorage.js", 72 | "src/97saveas.js", 73 | "src/FileSaver.js", 74 | "src/98finish.js", 75 | "src/99worker.js" 76 | ], 77 | "names": [], 78 | "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrmEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1sBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3YA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3YA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5pBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9KA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3XA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpSA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA" 79 | } --------------------------------------------------------------------------------