diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..6a780c4
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,3 @@
+# Contribution Guidelines
+
+Please submit all issues and pull requests to the [laravel/framework](http://github.com/laravel/framework) repository!
diff --git a/README.md b/README.md
deleted file mode 100755
index 36e2ac3..0000000
--- a/README.md
+++ /dev/null
@@ -1,18 +0,0 @@
-## Seime.lt ##
-
-[Seime.lt](http://seime.lt) projekto posistemės PHP kodas, kuris surenka Lietuvos Respublikos Seimo narių
-Seimo posėdžių lankomumo ir balsavimų duomenisfrom iš [Seimo svetainės](http://lrs.lt).
-
-****
-
-PHP backend code of the [Seime.lt](http://seime.lt) project, which scrapes participation & voting data
-from the website of the [Lithuanian parliament](http://lrs.lt).
-
-### Vietoj įžangos / Overview ###
-
-PHP kodas nėra detaliai dokumentuotas, tad mes siūlome
-
-
-The code is not documented extensively, thus we suggest the following path for understanding it:
- - Take a look into our database docs (schema + description), available at
-
diff --git a/app/commands/.gitkeep b/app/commands/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/app/config/app.php b/app/config/app.php
new file mode 100644
index 0000000..ffdc27d
--- /dev/null
+++ b/app/config/app.php
@@ -0,0 +1,196 @@
+ false,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Application URL
+ |--------------------------------------------------------------------------
+ |
+ | This URL is used by the console to properly generate URLs when using
+ | the Artisan command line tool. You should set this to the root of
+ | your application so that it is used when running Artisan tasks.
+ |
+ */
+
+ 'url' => '',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Application Timezone
+ |--------------------------------------------------------------------------
+ |
+ | Here you may specify the default timezone for your application, which
+ | will be used by the PHP date and date-time functions. We have gone
+ | ahead and set this to a sensible default for you out of the box.
+ |
+ */
+
+ 'timezone' => 'Europe/Copenhagen',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Application Locale Configuration
+ |--------------------------------------------------------------------------
+ |
+ | The application locale determines the default locale that will be used
+ | by the translation service provider. You are free to set this value
+ | to any of the locales which will be supported by the application.
+ |
+ */
+
+ 'locale' => 'en',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Application Fallback Locale
+ |--------------------------------------------------------------------------
+ |
+ | The fallback locale determines the locale to use when the current one
+ | is not available. You may change the value to correspond to any of
+ | the language folders that are provided through your application.
+ |
+ */
+
+ 'fallback_locale' => 'en',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Encryption Key
+ |--------------------------------------------------------------------------
+ |
+ | This key is used by the Illuminate encrypter service and should be set
+ | to a random, 32 character string, otherwise these encrypted strings
+ | will not be safe. Please do this before deploying an application!
+ |
+ */
+
+ 'key' => 'YourKeyHere',
+
+ 'cipher' => MCRYPT_RIJNDAEL_128,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Autoloaded Service Providers
+ |--------------------------------------------------------------------------
+ |
+ | The service providers listed here will be automatically loaded on the
+ | request to your application. Feel free to add your own services to
+ | this array to grant expanded functionality to your applications.
+ |
+ */
+
+ 'providers' => array(
+
+ 'Illuminate\Foundation\Providers\ArtisanServiceProvider',
+ 'Illuminate\Auth\AuthServiceProvider',
+ 'Illuminate\Cache\CacheServiceProvider',
+ 'Illuminate\Session\CommandsServiceProvider',
+ 'Illuminate\Foundation\Providers\ConsoleSupportServiceProvider',
+ 'Illuminate\Routing\ControllerServiceProvider',
+ 'Illuminate\Cookie\CookieServiceProvider',
+ 'Illuminate\Database\DatabaseServiceProvider',
+ 'Illuminate\Encryption\EncryptionServiceProvider',
+ 'Illuminate\Filesystem\FilesystemServiceProvider',
+ 'Illuminate\Hashing\HashServiceProvider',
+ 'Illuminate\Html\HtmlServiceProvider',
+ 'Illuminate\Log\LogServiceProvider',
+ 'Illuminate\Mail\MailServiceProvider',
+ 'Illuminate\Database\MigrationServiceProvider',
+ 'Illuminate\Pagination\PaginationServiceProvider',
+ 'Illuminate\Queue\QueueServiceProvider',
+ 'Illuminate\Redis\RedisServiceProvider',
+ 'Illuminate\Remote\RemoteServiceProvider',
+ 'Illuminate\Auth\Reminders\ReminderServiceProvider',
+ 'Illuminate\Database\SeedServiceProvider',
+ 'Illuminate\Session\SessionServiceProvider',
+ 'Illuminate\Translation\TranslationServiceProvider',
+ 'Illuminate\Validation\ValidationServiceProvider',
+ 'Illuminate\View\ViewServiceProvider',
+ 'Illuminate\Workbench\WorkbenchServiceProvider',
+ 'Barryvdh\Debugbar\ServiceProvider',
+
+ ),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Service Provider Manifest
+ |--------------------------------------------------------------------------
+ |
+ | The service provider manifest is used by Laravel to lazy load service
+ | providers which are not needed for each request, as well to keep a
+ | list of all of the services. Here, you may set its storage spot.
+ |
+ */
+
+ 'manifest' => storage_path().'/meta',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Class Aliases
+ |--------------------------------------------------------------------------
+ |
+ | This array of class aliases will be registered when this application
+ | is started. However, feel free to register as many as you wish as
+ | the aliases are "lazy" loaded so they don't hinder performance.
+ |
+ */
+
+ 'aliases' => array(
+
+ 'App' => 'Illuminate\Support\Facades\App',
+ 'Artisan' => 'Illuminate\Support\Facades\Artisan',
+ 'Auth' => 'Illuminate\Support\Facades\Auth',
+ 'Blade' => 'Illuminate\Support\Facades\Blade',
+ 'Cache' => 'Illuminate\Support\Facades\Cache',
+ 'ClassLoader' => 'Illuminate\Support\ClassLoader',
+ 'Config' => 'Illuminate\Support\Facades\Config',
+ 'Controller' => 'Illuminate\Routing\Controller',
+ 'Cookie' => 'Illuminate\Support\Facades\Cookie',
+ 'Crypt' => 'Illuminate\Support\Facades\Crypt',
+ 'DB' => 'Illuminate\Support\Facades\DB',
+ 'Eloquent' => 'Illuminate\Database\Eloquent\Model',
+ 'Event' => 'Illuminate\Support\Facades\Event',
+ 'File' => 'Illuminate\Support\Facades\File',
+ 'Form' => 'Illuminate\Support\Facades\Form',
+ 'Hash' => 'Illuminate\Support\Facades\Hash',
+ 'HTML' => 'Illuminate\Support\Facades\HTML',
+ 'Input' => 'Illuminate\Support\Facades\Input',
+ 'Lang' => 'Illuminate\Support\Facades\Lang',
+ 'Log' => 'Illuminate\Support\Facades\Log',
+ 'Mail' => 'Illuminate\Support\Facades\Mail',
+ 'Paginator' => 'Illuminate\Support\Facades\Paginator',
+ 'Password' => 'Illuminate\Support\Facades\Password',
+ 'Queue' => 'Illuminate\Support\Facades\Queue',
+ 'Redirect' => 'Illuminate\Support\Facades\Redirect',
+ 'Redis' => 'Illuminate\Support\Facades\Redis',
+ 'Request' => 'Illuminate\Support\Facades\Request',
+ 'Response' => 'Illuminate\Support\Facades\Response',
+ 'Route' => 'Illuminate\Support\Facades\Route',
+ 'Schema' => 'Illuminate\Support\Facades\Schema',
+ 'Seeder' => 'Illuminate\Database\Seeder',
+ 'Session' => 'Illuminate\Support\Facades\Session',
+ 'SoftDeletingTrait' => 'Illuminate\Database\Eloquent\SoftDeletingTrait',
+ 'SSH' => 'Illuminate\Support\Facades\SSH',
+ 'Str' => 'Illuminate\Support\Str',
+ 'URL' => 'Illuminate\Support\Facades\URL',
+ 'Validator' => 'Illuminate\Support\Facades\Validator',
+ 'View' => 'Illuminate\Support\Facades\View',
+ 'Debugbar' => 'Barryvdh\Debugbar\Facade',
+
+ ),
+
+);
diff --git a/app/config/auth.php b/app/config/auth.php
new file mode 100644
index 0000000..eacbbfa
--- /dev/null
+++ b/app/config/auth.php
@@ -0,0 +1,71 @@
+ 'eloquent',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Authentication Model
+ |--------------------------------------------------------------------------
+ |
+ | When using the "Eloquent" authentication driver, we need to know which
+ | Eloquent model should be used to retrieve your users. Of course, it
+ | is often just the "User" model but you may use whatever you like.
+ |
+ */
+
+ 'model' => 'User',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Authentication Table
+ |--------------------------------------------------------------------------
+ |
+ | When using the "Database" authentication driver, we need to know which
+ | table should be used to retrieve your users. We have chosen a basic
+ | default value but you may easily change it to any table you like.
+ |
+ */
+
+ 'table' => 'users',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Password Reminder Settings
+ |--------------------------------------------------------------------------
+ |
+ | Here you may set the settings for password reminders, including a view
+ | that should be used as your password reminder e-mail. You will also
+ | be able to set the name of the table that holds the reset tokens.
+ |
+ | The "expire" time is the number of minutes that the reminder should be
+ | considered valid. This security feature keeps tokens short-lived so
+ | they have less time to be guessed. You may change this as needed.
+ |
+ */
+
+ 'reminder' => array(
+
+ 'email' => 'emails.auth.reminder',
+
+ 'table' => 'password_reminders',
+
+ 'expire' => 60,
+
+ ),
+
+);
diff --git a/app/config/cache.php b/app/config/cache.php
new file mode 100644
index 0000000..ce89842
--- /dev/null
+++ b/app/config/cache.php
@@ -0,0 +1,89 @@
+ 'file',
+
+ /*
+ |--------------------------------------------------------------------------
+ | File Cache Location
+ |--------------------------------------------------------------------------
+ |
+ | When using the "file" cache driver, we need a location where the cache
+ | files may be stored. A sensible default has been specified, but you
+ | are free to change it to any other place on disk that you desire.
+ |
+ */
+
+ 'path' => storage_path().'/cache',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Database Cache Connection
+ |--------------------------------------------------------------------------
+ |
+ | When using the "database" cache driver you may specify the connection
+ | that should be used to store the cached items. When this option is
+ | null the default database connection will be utilized for cache.
+ |
+ */
+
+ 'connection' => null,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Database Cache Table
+ |--------------------------------------------------------------------------
+ |
+ | When using the "database" cache driver we need to know the table that
+ | should be used to store the cached items. A default table name has
+ | been provided but you're free to change it however you deem fit.
+ |
+ */
+
+ 'table' => 'cache',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Memcached Servers
+ |--------------------------------------------------------------------------
+ |
+ | Now you may specify an array of your Memcached servers that should be
+ | used when utilizing the Memcached cache driver. All of the servers
+ | should contain a value for "host", "port", and "weight" options.
+ |
+ */
+
+ 'memcached' => array(
+
+ array('host' => '127.0.0.1', 'port' => 11211, 'weight' => 100),
+
+ ),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Cache Key Prefix
+ |--------------------------------------------------------------------------
+ |
+ | When utilizing a RAM based store such as APC or Memcached, there might
+ | be other applications utilizing the same cache. So, we'll specify a
+ | value to get prefixed to all our keys so we can avoid collisions.
+ |
+ */
+
+ 'prefix' => 'laravel',
+
+);
diff --git a/app/config/compile.php b/app/config/compile.php
new file mode 100644
index 0000000..d5e5518
--- /dev/null
+++ b/app/config/compile.php
@@ -0,0 +1,18 @@
+ PDO::FETCH_CLASS,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Default Database Connection Name
+ |--------------------------------------------------------------------------
+ |
+ | Here you may specify which of the database connections below you wish
+ | to use as your default connection for all database work. Of course
+ | you may use many connections at once using the Database library.
+ |
+ */
+
+ 'default' => 'mysql',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Database Connections
+ |--------------------------------------------------------------------------
+ |
+ | Here are each of the database connections setup for your application.
+ | Of course, examples of configuring each database platform that is
+ | supported by Laravel is shown below to make development simple.
+ |
+ |
+ | All database work in Laravel is done through the PHP PDO facilities
+ | so make sure you have the driver for your particular database of
+ | choice installed on your machine before you begin development.
+ |
+ */
+
+ 'connections' => array(
+
+ 'sqlite' => array(
+ 'driver' => 'sqlite',
+ 'database' => __DIR__.'/../database/production.sqlite',
+ 'prefix' => '',
+ ),
+
+ 'mysql' => array(
+ 'driver' => 'mysql',
+ 'host' => 'localhost',
+ 'database' => 'seimas',
+ 'username' => '',
+ 'password' => '',
+ 'charset' => 'utf8',
+ 'collation' => 'utf8_unicode_ci',
+ 'prefix' => '',
+ ),
+
+ 'pgsql' => array(
+ 'driver' => 'pgsql',
+ 'host' => 'localhost',
+ 'database' => 'forge',
+ 'username' => 'forge',
+ 'password' => '',
+ 'charset' => 'utf8',
+ 'prefix' => '',
+ 'schema' => 'public',
+ ),
+
+ 'sqlsrv' => array(
+ 'driver' => 'sqlsrv',
+ 'host' => 'localhost',
+ 'database' => 'database',
+ 'username' => 'root',
+ 'password' => '',
+ 'prefix' => '',
+ ),
+
+ ),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Migration Repository Table
+ |--------------------------------------------------------------------------
+ |
+ | This table keeps track of all the migrations that have already run for
+ | your application. Using this information, we can determine which of
+ | the migrations on disk haven't actually been run in the database.
+ |
+ */
+
+ 'migrations' => 'migrations',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Redis Databases
+ |--------------------------------------------------------------------------
+ |
+ | Redis is an open source, fast, and advanced key-value store that also
+ | provides a richer set of commands than a typical key-value systems
+ | such as APC or Memcached. Laravel makes it easy to dig right in.
+ |
+ */
+
+ 'redis' => array(
+
+ 'cluster' => false,
+
+ 'default' => array(
+ 'host' => '127.0.0.1',
+ 'port' => 6379,
+ 'database' => 0,
+ ),
+
+ ),
+
+);
diff --git a/app/config/live/.gitkeep b/app/config/live/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/app/config/mail.php b/app/config/mail.php
new file mode 100644
index 0000000..76fd9e4
--- /dev/null
+++ b/app/config/mail.php
@@ -0,0 +1,124 @@
+ 'smtp',
+
+ /*
+ |--------------------------------------------------------------------------
+ | SMTP Host Address
+ |--------------------------------------------------------------------------
+ |
+ | Here you may provide the host address of the SMTP server used by your
+ | applications. A default option is provided that is compatible with
+ | the Mailgun mail service which will provide reliable deliveries.
+ |
+ */
+
+ 'host' => 'smtp.mailgun.org',
+
+ /*
+ |--------------------------------------------------------------------------
+ | SMTP Host Port
+ |--------------------------------------------------------------------------
+ |
+ | This is the SMTP port used by your application to deliver e-mails to
+ | users of the application. Like the host we have set this value to
+ | stay compatible with the Mailgun e-mail application by default.
+ |
+ */
+
+ 'port' => 587,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Global "From" Address
+ |--------------------------------------------------------------------------
+ |
+ | You may wish for all e-mails sent by your application to be sent from
+ | the same address. Here, you may specify a name and address that is
+ | used globally for all e-mails that are sent by your application.
+ |
+ */
+
+ 'from' => array('address' => null, 'name' => null),
+
+ /*
+ |--------------------------------------------------------------------------
+ | E-Mail Encryption Protocol
+ |--------------------------------------------------------------------------
+ |
+ | Here you may specify the encryption protocol that should be used when
+ | the application send e-mail messages. A sensible default using the
+ | transport layer security protocol should provide great security.
+ |
+ */
+
+ 'encryption' => 'tls',
+
+ /*
+ |--------------------------------------------------------------------------
+ | SMTP Server Username
+ |--------------------------------------------------------------------------
+ |
+ | If your SMTP server requires a username for authentication, you should
+ | set it here. This will get used to authenticate with your server on
+ | connection. You may also set the "password" value below this one.
+ |
+ */
+
+ 'username' => null,
+
+ /*
+ |--------------------------------------------------------------------------
+ | SMTP Server Password
+ |--------------------------------------------------------------------------
+ |
+ | Here you may set the password required by your SMTP server to send out
+ | messages from your application. This will be given to the server on
+ | connection so that the application will be able to send messages.
+ |
+ */
+
+ 'password' => null,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Sendmail System Path
+ |--------------------------------------------------------------------------
+ |
+ | When using the "sendmail" driver to send e-mails, we will need to know
+ | the path to where Sendmail lives on this server. A default path has
+ | been provided here, which will work well on most of your systems.
+ |
+ */
+
+ 'sendmail' => '/usr/sbin/sendmail -bs',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Mail "Pretend"
+ |--------------------------------------------------------------------------
+ |
+ | When this option is enabled, e-mail will not actually be sent over the
+ | web and will instead be written to your application's logs files so
+ | you may inspect the message. This is great for local development.
+ |
+ */
+
+ 'pretend' => false,
+
+);
diff --git a/app/config/packages/.gitkeep b/app/config/packages/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/app/config/packages/barryvdh/laravel-debugbar/config.php b/app/config/packages/barryvdh/laravel-debugbar/config.php
new file mode 100644
index 0000000..6dc07e2
--- /dev/null
+++ b/app/config/packages/barryvdh/laravel-debugbar/config.php
@@ -0,0 +1,146 @@
+ Config::get('app.debug'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Storage settings
+ |--------------------------------------------------------------------------
+ |
+ | DebugBar stores data for session/ajax requests in a directory.
+ | You can disable this, so the debugbar stores data in headers/session,
+ | but this can cause problems with large data collectors.
+ |
+ */
+ 'storage' => array(
+ 'enabled' => true,
+ 'path' => storage_path() . '/debugbar',
+ ),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Vendors
+ |--------------------------------------------------------------------------
+ |
+ | Vendor files are included by default, but can be set to false.
+ | This can also be set to 'js' or 'css', to only include javascript or css vendor files.
+ | Vendor files are for css: font-awesome (including fonts) and highlight.js (css files)
+ | and for js: jquery and and highlight.js
+ | So if you want syntax highlighting, set it to true.
+ | jQuery is set to not conflict with existing jQuery scripts.
+ |
+ */
+
+ 'include_vendors' => true,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Capture Ajax Requests
+ |--------------------------------------------------------------------------
+ |
+ | The Debugbar can capture Ajax requests and display them. If you don't want this (ie. because of errors),
+ | you can use this option to disable sending the data through the headers.
+ |
+ */
+
+ 'capture_ajax' => true,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Capture Console Commands
+ |--------------------------------------------------------------------------
+ |
+ | The Debugbar can listen to Artisan commands. You can view them with the browse button in the Debugbar.
+ |
+ */
+
+ 'capture_console' => false,
+
+ /*
+ |--------------------------------------------------------------------------
+ | DataCollectors
+ |--------------------------------------------------------------------------
+ |
+ | Enable/disable DataCollectors
+ |
+ */
+
+ 'collectors' => array(
+ 'phpinfo' => true, // Php version
+ 'messages' => true, // Messages
+ 'time' => true, // Time Datalogger
+ 'memory' => true, // Memory usage
+ 'exceptions' => true, // Exception displayer
+ 'log' => true, // Logs from Monolog (merged in messages if enabled)
+ 'db' => true, // Show database (PDO) queries and bindings
+ 'views' => true, // Views with their data
+ 'route' => true, // Current route information
+ 'laravel' => false, // Laravel version and environment
+ 'events' => false, // All events fired
+ 'default_request' => false, // Regular or special Symfony request logger
+ 'symfony_request' => true, // Only one can be enabled..
+ 'mail' => true, // Catch mail messages
+ 'logs' => false, // Add the latest log messages
+ 'files' => false, // Show the included files
+ 'config' => false, // Display config settings
+ 'auth' => false, // Display Laravel authentication status
+ ),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Extra options
+ |--------------------------------------------------------------------------
+ |
+ | Configure some DataCollectors
+ |
+ */
+
+ 'options' => array(
+ 'auth' => array(
+ 'show_name' => false, // Also show the users name/email in the debugbar
+ ),
+ 'db' => array(
+ 'with_params' => true, // Render SQL with the parameters substituted
+ 'timeline' => false, // Add the queries to the timeline
+ ),
+ 'mail' => array(
+ 'full_log' => false
+ ),
+ 'views' => array(
+ 'data' => false, //Note: Can slow down the application, because the data can be quite large..
+ ),
+ 'route' => array(
+ 'label' => true // show complete route on bar
+ ),
+ 'logs' => array(
+ 'file' => null
+ ),
+ ),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Inject Debugbar in Response
+ |--------------------------------------------------------------------------
+ |
+ | Usually, the debugbar is added just before
, by listening to the
+ | Response after the App is done. If you disable this, you have to add them
+ | in your template yourself. See http://phpdebugbar.com/docs/rendering.html
+ |
+ */
+
+ 'inject' => true,
+
+);
diff --git a/app/config/queue.php b/app/config/queue.php
new file mode 100644
index 0000000..940a4cd
--- /dev/null
+++ b/app/config/queue.php
@@ -0,0 +1,85 @@
+ 'sync',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Queue Connections
+ |--------------------------------------------------------------------------
+ |
+ | Here you may configure the connection information for each server that
+ | is used by your application. A default configuration has been added
+ | for each back-end shipped with Laravel. You are free to add more.
+ |
+ */
+
+ 'connections' => array(
+
+ 'sync' => array(
+ 'driver' => 'sync',
+ ),
+
+ 'beanstalkd' => array(
+ 'driver' => 'beanstalkd',
+ 'host' => 'localhost',
+ 'queue' => 'default',
+ 'ttr' => 60,
+ ),
+
+ 'sqs' => array(
+ 'driver' => 'sqs',
+ 'key' => 'your-public-key',
+ 'secret' => 'your-secret-key',
+ 'queue' => 'your-queue-url',
+ 'region' => 'us-east-1',
+ ),
+
+ 'iron' => array(
+ 'driver' => 'iron',
+ 'host' => 'mq-aws-us-east-1.iron.io',
+ 'token' => 'your-token',
+ 'project' => 'your-project-id',
+ 'queue' => 'your-queue-name',
+ 'encrypt' => true,
+ ),
+
+ 'redis' => array(
+ 'driver' => 'redis',
+ 'queue' => 'default',
+ ),
+
+ ),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Failed Queue Jobs
+ |--------------------------------------------------------------------------
+ |
+ | These options configure the behavior of failed queue job logging so you
+ | can control which database and table are used to store the jobs that
+ | have failed. You may change them to any database / table you wish.
+ |
+ */
+
+ 'failed' => array(
+
+ 'database' => 'mysql', 'table' => 'failed_jobs',
+
+ ),
+
+);
diff --git a/app/config/remote.php b/app/config/remote.php
new file mode 100644
index 0000000..2169c43
--- /dev/null
+++ b/app/config/remote.php
@@ -0,0 +1,59 @@
+ 'production',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Remote Server Connections
+ |--------------------------------------------------------------------------
+ |
+ | These are the servers that will be accessible via the SSH task runner
+ | facilities of Laravel. This feature radically simplifies executing
+ | tasks on your servers, such as deploying out these applications.
+ |
+ */
+
+ 'connections' => array(
+
+ 'production' => array(
+ 'host' => '',
+ 'username' => '',
+ 'password' => '',
+ 'key' => '',
+ 'keyphrase' => '',
+ 'root' => '/var/www',
+ ),
+
+ ),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Remote Server Groups
+ |--------------------------------------------------------------------------
+ |
+ | Here you may list connections under a single group name, which allows
+ | you to easily access all of the servers at once using a short name
+ | that is extremely easy to remember, such as "web" or "database".
+ |
+ */
+
+ 'groups' => array(
+
+ 'web' => array('production')
+
+ ),
+
+);
diff --git a/app/config/services.php b/app/config/services.php
new file mode 100644
index 0000000..c8aba2a
--- /dev/null
+++ b/app/config/services.php
@@ -0,0 +1,31 @@
+ array(
+ 'domain' => '',
+ 'secret' => '',
+ ),
+
+ 'mandrill' => array(
+ 'secret' => '',
+ ),
+
+ 'stripe' => array(
+ 'model' => 'User',
+ 'secret' => '',
+ ),
+
+);
diff --git a/app/config/session.php b/app/config/session.php
new file mode 100644
index 0000000..ae34302
--- /dev/null
+++ b/app/config/session.php
@@ -0,0 +1,140 @@
+ 'file',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session Lifetime
+ |--------------------------------------------------------------------------
+ |
+ | Here you may specify the number of minutes that you wish the session
+ | to be allowed to remain idle before it expires. If you want them
+ | to immediately expire on the browser closing, set that option.
+ |
+ */
+
+ 'lifetime' => 120,
+
+ 'expire_on_close' => false,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session File Location
+ |--------------------------------------------------------------------------
+ |
+ | When using the native session driver, we need a location where session
+ | files may be stored. A default has been set for you but a different
+ | location may be specified. This is only needed for file sessions.
+ |
+ */
+
+ 'files' => storage_path().'/sessions',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session Database Connection
+ |--------------------------------------------------------------------------
+ |
+ | When using the "database" or "redis" session drivers, you may specify a
+ | connection that should be used to manage these sessions. This should
+ | correspond to a connection in your database configuration options.
+ |
+ */
+
+ 'connection' => null,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session Database Table
+ |--------------------------------------------------------------------------
+ |
+ | When using the "database" session driver, you may specify the table we
+ | should use to manage the sessions. Of course, a sensible default is
+ | provided for you; however, you are free to change this as needed.
+ |
+ */
+
+ 'table' => 'sessions',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session Sweeping Lottery
+ |--------------------------------------------------------------------------
+ |
+ | Some session drivers must manually sweep their storage location to get
+ | rid of old sessions from storage. Here are the chances that it will
+ | happen on a given request. By default, the odds are 2 out of 100.
+ |
+ */
+
+ 'lottery' => array(2, 100),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session Cookie Name
+ |--------------------------------------------------------------------------
+ |
+ | Here you may change the name of the cookie used to identify a session
+ | instance by ID. The name specified here will get used every time a
+ | new session cookie is created by the framework for every driver.
+ |
+ */
+
+ 'cookie' => 'laravel_session',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session Cookie Path
+ |--------------------------------------------------------------------------
+ |
+ | The session cookie path determines the path for which the cookie will
+ | be regarded as available. Typically, this will be the root path of
+ | your application but you are free to change this when necessary.
+ |
+ */
+
+ 'path' => '/',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session Cookie Domain
+ |--------------------------------------------------------------------------
+ |
+ | Here you may change the domain of the cookie used to identify a session
+ | in your application. This will determine which domains the cookie is
+ | available to in your application. A sensible default has been set.
+ |
+ */
+
+ 'domain' => null,
+
+ /*
+ |--------------------------------------------------------------------------
+ | HTTPS Only Cookies
+ |--------------------------------------------------------------------------
+ |
+ | By setting this option to true, session cookies will only be sent back
+ | to the server if the browser has a HTTPS connection. This will keep
+ | the cookie from being sent to you if it can not be done securely.
+ |
+ */
+
+ 'secure' => false,
+
+);
diff --git a/app/config/testing/cache.php b/app/config/testing/cache.php
new file mode 100644
index 0000000..66a8a39
--- /dev/null
+++ b/app/config/testing/cache.php
@@ -0,0 +1,20 @@
+ 'array',
+
+);
diff --git a/app/config/testing/session.php b/app/config/testing/session.php
new file mode 100644
index 0000000..0364b63
--- /dev/null
+++ b/app/config/testing/session.php
@@ -0,0 +1,21 @@
+ 'array',
+
+);
diff --git a/app/config/view.php b/app/config/view.php
new file mode 100644
index 0000000..34b8f38
--- /dev/null
+++ b/app/config/view.php
@@ -0,0 +1,31 @@
+ array(__DIR__.'/../views'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Pagination View
+ |--------------------------------------------------------------------------
+ |
+ | This view will be used to render the pagination link output, and can
+ | be easily customized here to show any view you like. A clean view
+ | compatible with Twitter's Bootstrap is given to you by default.
+ |
+ */
+
+ 'pagination' => 'pagination::slider-3',
+
+);
diff --git a/app/config/workbench.php b/app/config/workbench.php
new file mode 100644
index 0000000..87c5e38
--- /dev/null
+++ b/app/config/workbench.php
@@ -0,0 +1,31 @@
+ '',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Workbench Author E-Mail Address
+ |--------------------------------------------------------------------------
+ |
+ | Like the option above, your e-mail address is used when generating new
+ | workbench packages. The e-mail is placed in your composer.json file
+ | automatically after the package is created by the workbench tool.
+ |
+ */
+
+ 'email' => '',
+
+);
diff --git a/app/controllers/.gitkeep b/app/controllers/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/app/controllers/BaseController.php b/app/controllers/BaseController.php
new file mode 100644
index 0000000..2bee464
--- /dev/null
+++ b/app/controllers/BaseController.php
@@ -0,0 +1,18 @@
+layout))
+ {
+ $this->layout = View::make($this->layout);
+ }
+ }
+
+}
diff --git a/app/controllers/HomeController.php b/app/controllers/HomeController.php
new file mode 100644
index 0000000..37935c4
--- /dev/null
+++ b/app/controllers/HomeController.php
@@ -0,0 +1,23 @@
+increments('id');
+ $table->string('number', 20);
+ $table->time('start_time');
+ $table->time('end_time');
+ $table->char('type', 20);
+ $table->text('url')->index('url');
+ $table->boolean('total_participants');
+ $table->char('outcome', 20)->index('outcome');
+ $table->text('voting_topic');
+ $table->text('title');
+ $table->integer('questions_id')->index('questions_id');
+ $table->text('dom');
+ $table->unique(['number','questions_id'], 'number');
+ });
+ }
+
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::drop('actions');
+ }
+
+}
diff --git a/app/database/migrations/2014_08_14_223444_create_items_table.php b/app/database/migrations/2014_08_14_223444_create_items_table.php
new file mode 100644
index 0000000..472db68
--- /dev/null
+++ b/app/database/migrations/2014_08_14_223444_create_items_table.php
@@ -0,0 +1,38 @@
+integer('id', true);
+ $table->boolean('number');
+ $table->integer('questions_id')->index('questions_id');
+ $table->text('title');
+ $table->text('document_url');
+ $table->text('related_doc_url');
+ $table->unique(['number','questions_id'], 'number');
+ });
+ }
+
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::drop('items');
+ }
+
+}
diff --git a/app/database/migrations/2014_08_14_223444_create_members_notes_table.php b/app/database/migrations/2014_08_14_223444_create_members_notes_table.php
new file mode 100644
index 0000000..a5bd1a6
--- /dev/null
+++ b/app/database/migrations/2014_08_14_223444_create_members_notes_table.php
@@ -0,0 +1,36 @@
+integer('members_id');
+ $table->enum('sittings_cadency', array('2008-2012','2012-2016','1996-2000','2000-2004','2004-2008'));
+ $table->date('cadency_start')->nullable();
+ $table->date('cadency_end')->nullable();
+ $table->char('notes', 100);
+ });
+ }
+
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::drop('members_notes');
+ }
+
+}
diff --git a/app/database/migrations/2014_08_14_223444_create_members_table.php b/app/database/migrations/2014_08_14_223444_create_members_table.php
new file mode 100644
index 0000000..a9d0548
--- /dev/null
+++ b/app/database/migrations/2014_08_14_223444_create_members_table.php
@@ -0,0 +1,38 @@
+integer('id')->primary();
+ $table->char('fraction', 20);
+ $table->text('image_src');
+ $table->char('name', 100);
+ $table->date('cadency_start');
+ $table->date('cadency_end')->index('cadency_end');
+ $table->string('notes', 100);
+ });
+ }
+
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::drop('members');
+ }
+
+}
diff --git a/app/database/migrations/2014_08_14_223444_create_participation_data_table.php b/app/database/migrations/2014_08_14_223444_create_participation_data_table.php
new file mode 100644
index 0000000..944ff54
--- /dev/null
+++ b/app/database/migrations/2014_08_14_223444_create_participation_data_table.php
@@ -0,0 +1,38 @@
+bigInteger('id', true)->unsigned();
+ $table->integer('sittings_id')->index('sittings_id_2');
+ $table->integer('members_id')->index('members_id');
+ $table->float('hours_available', 10, 0);
+ $table->float('hours_present', 10, 0);
+ $table->boolean('official_presence')->index('official_presence');
+ $table->unique(['sittings_id','members_id'], 'sittings_id');
+ });
+ }
+
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::drop('participation_data');
+ }
+
+}
diff --git a/app/database/migrations/2014_08_14_223444_create_presenters_table.php b/app/database/migrations/2014_08_14_223444_create_presenters_table.php
new file mode 100644
index 0000000..07e7725
--- /dev/null
+++ b/app/database/migrations/2014_08_14_223444_create_presenters_table.php
@@ -0,0 +1,36 @@
+integer('id', true);
+ $table->boolean('number');
+ $table->integer('items_id')->index('items_id');
+ $table->text('presenter');
+ $table->unique(['number','items_id'], 'number');
+ });
+ }
+
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::drop('presenters');
+ }
+
+}
diff --git a/app/database/migrations/2014_08_14_223444_create_questions_table.php b/app/database/migrations/2014_08_14_223444_create_questions_table.php
new file mode 100644
index 0000000..1e5ab5c
--- /dev/null
+++ b/app/database/migrations/2014_08_14_223444_create_questions_table.php
@@ -0,0 +1,40 @@
+integer('id', true);
+ $table->dateTime('start_time');
+ $table->dateTime('end_time');
+ $table->text('url');
+ $table->text('title');
+ $table->integer('sittings_id')->index('sittings_id_2');
+ $table->time('effective_length');
+ $table->boolean('number');
+ $table->unique(['sittings_id','number'], 'sittings_id');
+ });
+ }
+
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::drop('questions');
+ }
+
+}
diff --git a/app/database/migrations/2014_08_14_223444_create_registrations_table.php b/app/database/migrations/2014_08_14_223444_create_registrations_table.php
new file mode 100644
index 0000000..b75a6fd
--- /dev/null
+++ b/app/database/migrations/2014_08_14_223444_create_registrations_table.php
@@ -0,0 +1,36 @@
+increments('id');
+ $table->integer('actions_id');
+ $table->integer('members_id');
+ $table->boolean('presence');
+ $table->unique(['actions_id','members_id'], 'actions_id');
+ });
+ }
+
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::drop('registrations');
+ }
+
+}
diff --git a/app/database/migrations/2014_08_14_223444_create_sessions_table.php b/app/database/migrations/2014_08_14_223444_create_sessions_table.php
new file mode 100644
index 0000000..2245308
--- /dev/null
+++ b/app/database/migrations/2014_08_14_223444_create_sessions_table.php
@@ -0,0 +1,39 @@
+boolean('id')->primary();
+ $table->text('url');
+ $table->char('type', 20);
+ $table->enum('kadencija', array('1996-2000','2000-2004','2004-2008','2008-2012','2012-2016'));
+ $table->boolean('number');
+ $table->date('start_date');
+ $table->date('end_date');
+ $table->time('effective_length');
+ });
+ }
+
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::drop('sessions');
+ }
+
+}
diff --git a/app/database/migrations/2014_08_14_223444_create_sitting_participation_table.php b/app/database/migrations/2014_08_14_223444_create_sitting_participation_table.php
new file mode 100644
index 0000000..31039a4
--- /dev/null
+++ b/app/database/migrations/2014_08_14_223444_create_sitting_participation_table.php
@@ -0,0 +1,36 @@
+increments('id');
+ $table->boolean('presence')->index('presence');
+ $table->integer('sittings_id')->index('sittings_id_2');
+ $table->integer('members_id')->index('members_id');
+ $table->unique(['sittings_id','members_id'], 'sittings_id');
+ });
+ }
+
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::drop('sitting_participation');
+ }
+
+}
diff --git a/app/database/migrations/2014_08_14_223444_create_sittings_table.php b/app/database/migrations/2014_08_14_223444_create_sittings_table.php
new file mode 100644
index 0000000..d4fb745
--- /dev/null
+++ b/app/database/migrations/2014_08_14_223444_create_sittings_table.php
@@ -0,0 +1,44 @@
+integer('id', true);
+ $table->boolean('number');
+ $table->text('type');
+ $table->text('transcript_url');
+ $table->text('recording_url');
+ $table->text('protocol_url');
+ $table->dateTime('start_time');
+ $table->time('effective_length');
+ $table->text('url');
+ $table->dateTime('end_time');
+ $table->text('participation_url');
+ $table->boolean('sessions_id');
+ $table->enum('cadency', array('2008-2012','2012-2016','2004-2008','1996-2000','2000-2004'))->default('2012-2016')->index('cadency');
+ });
+ }
+
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::drop('sittings');
+ }
+
+}
diff --git a/app/database/migrations/2014_08_14_223444_create_speakers_table.php b/app/database/migrations/2014_08_14_223444_create_speakers_table.php
new file mode 100644
index 0000000..00b42ce
--- /dev/null
+++ b/app/database/migrations/2014_08_14_223444_create_speakers_table.php
@@ -0,0 +1,35 @@
+increments('id');
+ $table->integer('members_id');
+ $table->integer('actions_id')->index('actions_id');
+ $table->unique(['members_id','actions_id'], 'members_id');
+ });
+ }
+
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::drop('speakers');
+ }
+
+}
diff --git a/app/database/migrations/2014_08_14_223444_create_subquestions_participation_table.php b/app/database/migrations/2014_08_14_223444_create_subquestions_participation_table.php
new file mode 100644
index 0000000..5277284
--- /dev/null
+++ b/app/database/migrations/2014_08_14_223444_create_subquestions_participation_table.php
@@ -0,0 +1,36 @@
+increments('id');
+ $table->integer('subquestions_id')->index('subquestions_id_2');
+ $table->integer('members_id')->index('members_id');
+ $table->boolean('presence');
+ $table->unique(['subquestions_id','members_id'], 'subquestions_id');
+ });
+ }
+
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::drop('subquestions_participation');
+ }
+
+}
diff --git a/app/database/migrations/2014_08_14_223444_create_subquestions_table.php b/app/database/migrations/2014_08_14_223444_create_subquestions_table.php
new file mode 100644
index 0000000..d8f1462
--- /dev/null
+++ b/app/database/migrations/2014_08_14_223444_create_subquestions_table.php
@@ -0,0 +1,37 @@
+increments('id');
+ $table->integer('questions_id')->index('questions_id_2');
+ $table->boolean('number')->index('number');
+ $table->dateTime('start_time');
+ $table->dateTime('end_time');
+ $table->unique(['questions_id','number'], 'questions_id');
+ });
+ }
+
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::drop('subquestions');
+ }
+
+}
diff --git a/app/database/migrations/2014_08_14_223444_create_votes_table.php b/app/database/migrations/2014_08_14_223444_create_votes_table.php
new file mode 100644
index 0000000..6f90f5d
--- /dev/null
+++ b/app/database/migrations/2014_08_14_223444_create_votes_table.php
@@ -0,0 +1,38 @@
+increments('id');
+ $table->integer('actions_id')->index('actions_id_2');
+ $table->integer('members_id')->index('members_id');
+ $table->char('fraction', 10);
+ $table->char('vote', 10)->index('vote');
+ $table->unique(['actions_id','members_id'], 'actions_id');
+ $table->index(['actions_id','vote'], 'actions_id_3');
+ });
+ }
+
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::drop('votes');
+ }
+
+}
diff --git a/app/database/migrations/2014_08_14_223444_create_voting_registration_table.php b/app/database/migrations/2014_08_14_223444_create_voting_registration_table.php
new file mode 100644
index 0000000..0e86ac9
--- /dev/null
+++ b/app/database/migrations/2014_08_14_223444_create_voting_registration_table.php
@@ -0,0 +1,34 @@
+increments('id');
+ $table->integer('registration_id');
+ $table->integer('voting_id')->unique('voting_id');
+ });
+ }
+
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::drop('voting_registration');
+ }
+
+}
diff --git a/app/database/seeds/.gitkeep b/app/database/seeds/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/app/database/seeds/DatabaseSeeder.php b/app/database/seeds/DatabaseSeeder.php
new file mode 100644
index 0000000..1989252
--- /dev/null
+++ b/app/database/seeds/DatabaseSeeder.php
@@ -0,0 +1,17 @@
+call('UserTableSeeder');
+ }
+
+}
diff --git a/app/filters.php b/app/filters.php
new file mode 100644
index 0000000..fd0b4bc
--- /dev/null
+++ b/app/filters.php
@@ -0,0 +1,90 @@
+ '« Previous',
+
+ 'next' => 'Next »',
+
+);
diff --git a/app/lang/en/reminders.php b/app/lang/en/reminders.php
new file mode 100644
index 0000000..e42148e
--- /dev/null
+++ b/app/lang/en/reminders.php
@@ -0,0 +1,24 @@
+ "Passwords must be at least six characters and match the confirmation.",
+
+ "user" => "We can't find a user with that e-mail address.",
+
+ "token" => "This password reset token is invalid.",
+
+ "sent" => "Password reminder sent!",
+
+);
diff --git a/app/lang/en/validation.php b/app/lang/en/validation.php
new file mode 100644
index 0000000..e621614
--- /dev/null
+++ b/app/lang/en/validation.php
@@ -0,0 +1,106 @@
+ "The :attribute must be accepted.",
+ "active_url" => "The :attribute is not a valid URL.",
+ "after" => "The :attribute must be a date after :date.",
+ "alpha" => "The :attribute may only contain letters.",
+ "alpha_dash" => "The :attribute may only contain letters, numbers, and dashes.",
+ "alpha_num" => "The :attribute may only contain letters and numbers.",
+ "array" => "The :attribute must be an array.",
+ "before" => "The :attribute must be a date before :date.",
+ "between" => array(
+ "numeric" => "The :attribute must be between :min and :max.",
+ "file" => "The :attribute must be between :min and :max kilobytes.",
+ "string" => "The :attribute must be between :min and :max characters.",
+ "array" => "The :attribute must have between :min and :max items.",
+ ),
+ "boolean" => "The :attribute field must be true or false",
+ "confirmed" => "The :attribute confirmation does not match.",
+ "date" => "The :attribute is not a valid date.",
+ "date_format" => "The :attribute does not match the format :format.",
+ "different" => "The :attribute and :other must be different.",
+ "digits" => "The :attribute must be :digits digits.",
+ "digits_between" => "The :attribute must be between :min and :max digits.",
+ "email" => "The :attribute must be a valid email address.",
+ "exists" => "The selected :attribute is invalid.",
+ "image" => "The :attribute must be an image.",
+ "in" => "The selected :attribute is invalid.",
+ "integer" => "The :attribute must be an integer.",
+ "ip" => "The :attribute must be a valid IP address.",
+ "max" => array(
+ "numeric" => "The :attribute may not be greater than :max.",
+ "file" => "The :attribute may not be greater than :max kilobytes.",
+ "string" => "The :attribute may not be greater than :max characters.",
+ "array" => "The :attribute may not have more than :max items.",
+ ),
+ "mimes" => "The :attribute must be a file of type: :values.",
+ "min" => array(
+ "numeric" => "The :attribute must be at least :min.",
+ "file" => "The :attribute must be at least :min kilobytes.",
+ "string" => "The :attribute must be at least :min characters.",
+ "array" => "The :attribute must have at least :min items.",
+ ),
+ "not_in" => "The selected :attribute is invalid.",
+ "numeric" => "The :attribute must be a number.",
+ "regex" => "The :attribute format is invalid.",
+ "required" => "The :attribute field is required.",
+ "required_if" => "The :attribute field is required when :other is :value.",
+ "required_with" => "The :attribute field is required when :values is present.",
+ "required_with_all" => "The :attribute field is required when :values is present.",
+ "required_without" => "The :attribute field is required when :values is not present.",
+ "required_without_all" => "The :attribute field is required when none of :values are present.",
+ "same" => "The :attribute and :other must match.",
+ "size" => array(
+ "numeric" => "The :attribute must be :size.",
+ "file" => "The :attribute must be :size kilobytes.",
+ "string" => "The :attribute must be :size characters.",
+ "array" => "The :attribute must contain :size items.",
+ ),
+ "unique" => "The :attribute has already been taken.",
+ "url" => "The :attribute format is invalid.",
+
+ /*
+ |--------------------------------------------------------------------------
+ | Custom Validation Language Lines
+ |--------------------------------------------------------------------------
+ |
+ | Here you may specify custom validation messages for attributes using the
+ | convention "attribute.rule" to name the lines. This makes it quick to
+ | specify a specific custom language line for a given attribute rule.
+ |
+ */
+
+ 'custom' => array(
+ 'attribute-name' => array(
+ 'rule-name' => 'custom-message',
+ ),
+ 'vote' => ['in' => 'Vote value needs to be one of ":values" ']
+ ),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Custom Validation Attributes
+ |--------------------------------------------------------------------------
+ |
+ | The following language lines are used to swap attribute place-holders
+ | with something more reader friendly such as E-Mail Address instead
+ | of "email". This simply helps us make messages a little cleaner.
+ |
+ */
+
+ 'attributes' => array(),
+
+);
diff --git a/app/models/Action.php b/app/models/Action.php
new file mode 100644
index 0000000..49a45c8
--- /dev/null
+++ b/app/models/Action.php
@@ -0,0 +1,23 @@
+belongsTo('Seimas\Question', 'questions_id', 'id');
+ }
+
+}
\ No newline at end of file
diff --git a/app/models/DefaultParameterTrait.php b/app/models/DefaultParameterTrait.php
new file mode 100644
index 0000000..7ed087f
--- /dev/null
+++ b/app/models/DefaultParameterTrait.php
@@ -0,0 +1,27 @@
+ $value], [$parameter => $validation]);
+ if ($value === null) {
+ return $pivotQuery;
+ } elseif (
+ ($validation === null) or
+ ($validator->passes())
+ ) {
+ return $pivotQuery->wherePivot($parameter, $value);
+ } else {
+ throw new \InvalidArgumentException($validator->messages()->first());
+ }
+ }
+
+}
diff --git a/app/models/Item.php b/app/models/Item.php
new file mode 100644
index 0000000..3a58213
--- /dev/null
+++ b/app/models/Item.php
@@ -0,0 +1,19 @@
+belongsTo('Seimas\Question', 'questions_id', $this->primaryKey);
+ }
+
+ public function presenters() {
+ return $this->hasMany('Seimas\Presenter', 'items_id', $this->primaryKey);
+ }
+
+}
\ No newline at end of file
diff --git a/app/models/Member.php b/app/models/Member.php
new file mode 100644
index 0000000..ac28e49
--- /dev/null
+++ b/app/models/Member.php
@@ -0,0 +1,73 @@
+defaultPivotParameter(
+ $this->belongsToMany('Seimas\Sitting', 'sitting_participation', 'members_id', 'sittings_id')
+ ->withPivot('presence'),
+ 'presence',
+ $participated,
+ 'boolean'
+ );
+ }
+
+ public function sittingsWithData($participated = null) {
+ return
+ $this->defaultPivotParameter(
+ $this->belongsToMany('Seimas\Sitting', 'participation_data', 'members_id', 'sittings_id')
+ ->withPivot('official_presence', 'hours_present', 'hours_available'),
+ 'official_presence',
+ $participated,
+ 'boolean'
+ );
+ }
+
+ public function speeches() {
+ return $this->belongsToMany('Seimas\Speech', 'speakers', 'members_id', 'actions_id');
+ }
+
+ public function votes($voteType = null) {
+ return
+ $this->defaultPivotParameter(
+ $this->belongsToMany('Seimas\Vote', 'votes', 'members_id', 'actions_id')
+ ->withPivot('fraction', 'vote'),
+ 'vote',
+ $voteType,
+ Vote::validVoteRule()
+ );
+ }
+
+ public function registrations($presence = null) {
+ return
+ $this->defaultPivotParameter(
+ $this->belongsToMany('Seimas\Registration', 'registrations', 'members_id', 'actions_id')
+ ->withPivot('presence'),
+ 'presence',
+ $presence,
+ 'boolean'
+ );
+ }
+
+ public function subquestions($participated = null) {
+ return
+ $this->defaultPivotParameter(
+ $this->belongsToMany('Seimas\Subquestion', 'subquestions_participation', 'members_id', 'subquestions_id')
+ ->withPivot('presence'),
+ 'presence',
+ $participated,
+ 'boolean'
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/app/models/Presenter.php b/app/models/Presenter.php
new file mode 100644
index 0000000..7cde4bf
--- /dev/null
+++ b/app/models/Presenter.php
@@ -0,0 +1,14 @@
+belongsTo('Seimas\Item', 'items_id', $this->primaryKey);
+ }
+}
\ No newline at end of file
diff --git a/app/models/Question.php b/app/models/Question.php
new file mode 100644
index 0000000..84f2fc0
--- /dev/null
+++ b/app/models/Question.php
@@ -0,0 +1,46 @@
+belongsTo('Seimas\Sitting', 'sittings_id', $this->primaryKey);
+ }
+
+ public function subquestions() {
+ return $this->hasMany('Seimas\Subquestion', 'questions_id', $this->primaryKey);
+ }
+
+ public function actions() {
+ return $this->hasMany('Seimas\Action', 'questions_id', $this->primaryKey);
+ }
+
+ public function registrations() {
+ return $this->hasMany('Seimas\Registration', 'questions_id', $this->primaryKey)
+ ->where('type', Action::REGISTRATION);
+ }
+
+ public function votes() {
+ return $this->hasMany('Seimas\Vote', 'questions_id', $this->primaryKey)
+ ->where('type', Action::VOTE);
+ }
+
+ public function speeches() {
+ return $this->hasMany('Seimas\Speech', 'questions_id', $this->primaryKey)
+ ->where('type', Action::SPEECH);
+ }
+
+ public function unanimousVotes() {
+ return $this->hasMany('Seimas\Vote', 'questions_id', $this->primaryKey)
+ ->where('type', Action::UNANIMOUS_VOTE);
+ }
+
+ public function items() {
+ return $this->hasMany('Seimas\Item', 'questions_id', $this->primaryKey);
+ }
+}
\ No newline at end of file
diff --git a/app/models/Registration.php b/app/models/Registration.php
new file mode 100644
index 0000000..77862a8
--- /dev/null
+++ b/app/models/Registration.php
@@ -0,0 +1,22 @@
+defaultPivotParameter(
+ $this->belongsToMany('Seimas\Member', 'registrations', 'actions_id', 'members_id')
+ ->withPivot('presence'),
+ 'presence',
+ $presence,
+ 'boolean'
+ );
+ }
+ public function votes() {
+ return $this->belongsToMany('Seimas\Vote', 'voting_registration', 'registration_id', 'voting_id');
+ }
+}
+
diff --git a/app/models/Session.php b/app/models/Session.php
new file mode 100644
index 0000000..28b32fb
--- /dev/null
+++ b/app/models/Session.php
@@ -0,0 +1,14 @@
+hasMany('Seimas\Sitting', 'sessions_id', $this->primaryKey);
+ }
+}
\ No newline at end of file
diff --git a/app/models/Sitting.php b/app/models/Sitting.php
new file mode 100644
index 0000000..77fea03
--- /dev/null
+++ b/app/models/Sitting.php
@@ -0,0 +1,42 @@
+belongsTo('Seimas\Session', 'sessions_id', 'id');
+ }
+
+ public function questions() {
+ return $this->hasMany('Seimas\Question', 'sittings_id', $this->primaryKey);
+ }
+
+ public function members($participated = null) {
+ return
+ $this->defaultPivotParameter(
+ $this->belongsToMany('Seimas\Member', 'sitting_participation', 'sittings_id', 'members_id')
+ ->withPivot('presence'),
+ 'presence',
+ $participated,
+ 'boolean'
+ );
+ }
+
+ public function membersWithData($participated = null) {
+ return
+ $this->defaultPivotParameter(
+ $this->belongsToMany('Seimas\Member', 'participation_data', 'sittings_id', 'members_id')
+ ->withPivot('official_presence', 'hours_available', 'hours_present'),
+ 'official_presence',
+ $participated,
+ 'boolean'
+ );
+ }
+}
\ No newline at end of file
diff --git a/app/models/Speech.php b/app/models/Speech.php
new file mode 100644
index 0000000..7d9623e
--- /dev/null
+++ b/app/models/Speech.php
@@ -0,0 +1,12 @@
+belongsToMany('Seimas\Member', 'speakers', 'actions_id', 'members_id')->first();
+ }
+}
+
diff --git a/app/models/Subquestion.php b/app/models/Subquestion.php
new file mode 100644
index 0000000..e71f4f0
--- /dev/null
+++ b/app/models/Subquestion.php
@@ -0,0 +1,29 @@
+belongsTo('Seimas\Question', 'questions_id', $this->primaryKey);
+ }
+
+ public function members($participated = null) {
+ return
+ $this->defaultPivotParameter(
+ $this->belongsToMany('Seimas\Member', 'subquestions_participation', 'subquestions_id', 'members_id')
+ ->withPivot('presence'),
+ 'presence',
+ $participated,
+ 'boolean'
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/app/models/User.php b/app/models/User.php
new file mode 100644
index 0000000..af00a49
--- /dev/null
+++ b/app/models/User.php
@@ -0,0 +1,26 @@
+defaultPivotParameter(
+ $this->belongsToMany('Seimas\Member', 'votes', 'actions_id', 'members_id')
+ ->withPivot('fraction', 'vote'),
+ 'vote',
+ $voteType,
+ self::validVoteRule()
+ );
+ }
+
+ public function registration() {
+ return $this->belongsToMany('Seimas\Registration', 'voting_registration', 'voting_id', 'registration_id')
+ ->first();
+ }
+}
\ No newline at end of file
diff --git a/app/routes.php b/app/routes.php
new file mode 100644
index 0000000..3e10dcf
--- /dev/null
+++ b/app/routes.php
@@ -0,0 +1,17 @@
+client->request('GET', '/');
+
+ $this->assertTrue($this->client->getResponse()->isOk());
+ }
+
+}
diff --git a/app/tests/TestCase.php b/app/tests/TestCase.php
new file mode 100644
index 0000000..d367fe5
--- /dev/null
+++ b/app/tests/TestCase.php
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+ Password Reset
+
+
+ To reset your password, complete this form: {{ URL::to('password/reset', array($token)) }}.
+ This link will expire in {{ Config::get('auth.reminder.expire', 60) }} minutes.
+
+
+
diff --git a/app/views/hello.php b/app/views/hello.php
new file mode 100644
index 0000000..6484242
--- /dev/null
+++ b/app/views/hello.php
@@ -0,0 +1,42 @@
+
+
+
+
+ Laravel PHP Framework
+
+
+
+
+
+
You have arrived.
+
+
+
diff --git a/artisan b/artisan
new file mode 100644
index 0000000..5c408ad
--- /dev/null
+++ b/artisan
@@ -0,0 +1,74 @@
+#!/usr/bin/env php
+setRequestForConsoleEnvironment();
+
+$artisan = Illuminate\Console\Application::start($app);
+
+/*
+|--------------------------------------------------------------------------
+| Run The Artisan Application
+|--------------------------------------------------------------------------
+|
+| When we run the console application, the current CLI command will be
+| executed in this console and the response sent back to a terminal
+| or another output device for the developers. Here goes nothing!
+|
+*/
+
+$status = $artisan->run();
+
+/*
+|--------------------------------------------------------------------------
+| Shutdown The Application
+|--------------------------------------------------------------------------
+|
+| Once Artisan has finished running. We will fire off the shutdown events
+| so that any final work may be done by the application before we shut
+| down the process. This is the last thing to happen to the request.
+|
+*/
+
+$app->shutdown();
+
+exit($status);
diff --git a/bootstrap/autoload.php b/bootstrap/autoload.php
new file mode 100644
index 0000000..6b32931
--- /dev/null
+++ b/bootstrap/autoload.php
@@ -0,0 +1,75 @@
+ __DIR__.'/../app',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Public Path
+ |--------------------------------------------------------------------------
+ |
+ | The public path contains the assets for your web application, such as
+ | your JavaScript and CSS files, and also contains the primary entry
+ | point for web requests into these applications from the outside.
+ |
+ */
+
+ 'public' => __DIR__.'/../public',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Base Path
+ |--------------------------------------------------------------------------
+ |
+ | The base path is the root of the Laravel installation. Most likely you
+ | will not need to change this value. But, if for some wild reason it
+ | is necessary you will do so here, just proceed with some caution.
+ |
+ */
+
+ 'base' => __DIR__.'/..',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Storage Path
+ |--------------------------------------------------------------------------
+ |
+ | The storage path is used by Laravel to store cached Blade views, logs
+ | and other pieces of information. You may modify the path here when
+ | you want to change the location of this directory for your apps.
+ |
+ */
+
+ 'storage' => __DIR__.'/../app/storage',
+
+);
diff --git a/bootstrap/start.php b/bootstrap/start.php
new file mode 100644
index 0000000..e8ce2f0
--- /dev/null
+++ b/bootstrap/start.php
@@ -0,0 +1,73 @@
+detectEnvironment(array(
+
+ 'local' => array('MUKASWARE'),
+
+));
+
+/*
+|--------------------------------------------------------------------------
+| Bind Paths
+|--------------------------------------------------------------------------
+|
+| Here we are binding the paths configured in paths.php to the app. You
+| should not be changing these here. If you need to change these you
+| may do so within the paths.php file and they will be bound here.
+|
+*/
+
+$app->bindInstallPaths(require __DIR__.'/paths.php');
+
+/*
+|--------------------------------------------------------------------------
+| Load The Application
+|--------------------------------------------------------------------------
+|
+| Here we will load this Illuminate application. We will keep this in a
+| separate location so we can isolate the creation of an application
+| from the actual running of the application with a given request.
+|
+*/
+
+$framework = $app['path.base'].
+ '/vendor/laravel/framework/src';
+
+require $framework.'/Illuminate/Foundation/start.php';
+
+/*
+|--------------------------------------------------------------------------
+| Return The Application
+|--------------------------------------------------------------------------
+|
+| This script returns the application instance. The instance is given to
+| the calling script so we can separate the building of the instances
+| from the actual running of the application and sending responses.
+|
+*/
+
+return $app;
diff --git a/classes/Action.php b/classes/Action.php
deleted file mode 100755
index d877a38..0000000
--- a/classes/Action.php
+++ /dev/null
@@ -1,428 +0,0 @@
-PDO) {
- if ($params['dom'] instanceof DOMElement) {
- $this->dom = $params['dom'];
- }
- else {
- throw new Exception('No valid DOM Element provided to the Action Object');
- }
- $this->number = $params['id'];
- $this->url = '';
- $this->questions_id = $this->getParentInfo('getId');
- }
- else {
- $this->dom = $this->unserialise($this->dom);
- }
- }
-
- protected function saveData() {
- $this->saveMainData();
- if (!empty($this->additional_data)) {
- $this->saveAdditionalData();
- }
- }
-
- public function saveMainData() {
- $array = get_object_vars($this);
- unset($array['PDO']);
- unset($array['Factory']);
- unset($array['parent']);
- unset($array['items']);
- unset($array['children']);
- unset($array['additional_data']);
- $array['dom'] = $this->serialise($this->dom);
- $id = $this->Factory->SaveObject('actions', $array, array('id', 'questions_id'));
- if ($id != 0) {
- $this->id = $id;
- }
- else {
- $this->id = $this->Factory->getVar('SELECT id FROM actions WHERE questions_id = ? and number = ?', array($this->questions_id, $this->number));
- if ($this->id == 0) echo 'blah!';
- }
- }
-
- protected function saveAdditionalData() {
- if (empty($this->id)) {
- $this->show();
- return;
- }
-
-
- switch($this->type) {
-
- /* speaker saving */
- case 'speech':
- if (isset($this->additional_data['speaker'])) {
- $data = array('members_id' => $this->additional_data['speaker'], 'actions_id' => $this->getId());
- $this->Factory->saveObject('speakers', $data, array('actions_id'));
- }
- break;
-
- /* registration data saving */
- case 'registration':
- $data = array();
- foreach ($this->additional_data['participation'] as $members_id => $presence) {
- $data[] = array('actions_id' => $this->getId(), 'members_id' => $members_id, 'presence' => $presence);
- }
- if (!empty($data)) {
- $this->Factory->saveObjects('registrations', $data, array('members_id', 'id', 'actions_id'));
- }
- break;
- /* voting data saving */
- case 'voting':
- $data = array();
- foreach ($this->additional_data['voting'] as $vote) {
- $data[] = array(
- 'actions_id' => $this->getId(),
- 'members_id' => $vote['id'],
- 'fraction' => $vote['fraction'],
- 'vote' => $vote['vote']);
- }
- if (!empty($data)) {
- $this->Factory->saveObjects('votes', $data, array('members_id', 'id', 'actions_id'));
- }
- break;
- }
- }
-
- protected function populateData() {
- if ($this->PDO) {
- $this->populateAdditionalData();
- if (!in_array($this->type, array('voting', 'registration'))) {
- //everything should be here, only load and save additional data
- return true;
- }
- elseif (empty($this->additional_data)) {
- echo 'here!';
- //no data present for registrations and voting - initial DB run
- return false;
- }
- else {
- //all data loaded - we are good to go
- return true;
- }
- }
- else {
- //not loaded via DB - need to parse additional data
- return false;
- }
- }
-
- protected function populateAdditionalData() {
-
- switch($this->type) {
-
- /* populate speaker data */
- case 'speech':
- $speakers = $this->Factory->getArray(self::$speaker_sql, array($this->getId()));
- if (is_array($speakers)) {
- foreach ($speakers as $speaker) {
- $this->additional_data['speaker'] = $speaker['members_id'];
- }
- }
- break;
-
- /* populate registration data */
- case 'registration':
- $registrations = $this->Factory->getArray(self::$registrations_sql, array($this->getId()));
- if (is_array($registrations)) {
- $this->additional_data['participation'] = array();
- foreach ($registrations as $registered) {
- $this->additional_data['participation'][$registered['members_id']] = $registered['presence'];
- }
- }
- break;
-
- /* populate voting data */
- case 'voting':
- $votes = $this->Factory->getArray(self::$votes_sql, array($this->getId()));
- if (is_array($votes)) {
- $this->additional_data['votes'] = array();
- foreach ($votes as $vote) {
- $array = array('id' => $vote['members_id'], 'fraction' => $vote['fraction'], 'vote' => $vote['vote']);
- $this->additional_data['votes'][$array['id']] = $array;
- }
- }
- break;
- }
- }
-
- public function initialiseChildren($recursive = false) {
- return;
- }
-
- protected function scrapeData($reload = FALSE) {
-
- /* parse additional urls */
- if (!empty($this->url)) {
- $function = "get" . ucfirst($this->type) . 'Data';
- $this->$function();
- }
- }
-
- public function parseData() {
- $tds = $this->dom->getElementsByTagName('td');
- if ($tds->length != 2) {
- log_f('parsing error: Action table td count', $this->getId());
- }
- else {
- /* Set start time */
- $this->start_time = $this->clean($tds->item(0)->nodeValue);
-
- /* set end time */
- try {
- $this->end_time = $this->getSiblingInfoByPosition($this->number, +1, 'getStartTime');
- }
- catch(Exception $e) {
- $this->end_time = $this->start_time;
- }
-
- /* determine action type & additional data */
-
- $this->title = $this->decode($tds->item(1)->nodeValue);
-
- if (stripos($this->title, 'Kalbėjo') !== false) { //action type - speech
- $this->type = 'speech';
- $this->additional_data['speaker'] = $this->getMemberId($tds->item(1));
- }
-
- elseif (stripos($this->title, 'bendru sutarimu') !== false) { //action type - voting (together)
- $this->type = 'u_voting';
- if (stripos($this->title, 'pritarta') !== false) {
- $this->outcome = 'accepted';
- }
- else {
- $this->outcome = 'rejected';
- }
- }
-
- elseif (stripos($this->title, 'Įvyko registracija') !== false) { //action type - registration
- $this->type = 'registration';
- $matches = array();
- preg_match('/užsiregistravo.\s*(\d+)/u', $this->title, $matches);
- if (isset($matches[1])) {
- $this->total_participants = $matches[1];
- }
-
- $reg_link = $tds->item(1)->getElementsByTagName('a')->item(0);
- if (!is_object($reg_link)) {
- log_f('parsing error: question - registration link', $this->getId());
- }
- else {
- $link = self::BASE_URL . $reg_link->getAttribute('href');
- $this->url = $link;
- }
- }
- elseif (stripos($this->title, 'Įvyko balsavimas') !== false) { //action type voting
- $this->type = 'voting';
-
- /* general outcome of voting */
- if (stripos($this->title, 'pritarta') !== false) {
- $this->outcome = 'accepted';
- }
- else {
- $this->outcome = 'rejected';
- }
-
- /* individual outcome of voting */
- $voting_link = $tds->item(1)->getElementsByTagName('a')->item(0);
- if (!is_object($voting_link)) {
- log_f('parsing error: question - voting link', $this->getId());
- }
- else {
- $link = self::BASE_URL . $voting_link->getAttribute('href');
- $this->url = $link;
- }
- }
- }
- }
-
- protected function getRegistrationData() {
- $reg_dom = $this->getHTMLDOM($this->url);
- $xpath = new DOMXPath($reg_dom);
- $members = $xpath->query("//table[contains(@cellpadding, '1')]//table[contains(@width, '100%')]/tr");
- $this->additional_data['participation'] = array();
- foreach ($members as $member_data) {
-
- $tds = $member_data->getElementsByTagName('td');
- if ($tds->length != 2) {
- log_f('parsing error: action lankomumo lentele - participation . ', $this->getId());
- }
- else {
- $member_id = $this->getMemberId($tds->item(1));
- if ($this->clean($tds->item(0)->nodeValue) == '') $participation = 0;
- else $participation = 1;
- $this->additional_data['participation'][$member_id] = $participation;
- }
- }
- unset($reg_dom);
- }
-
- protected function getVotingData() {
- $voting_dom = $this->getHTMLDOM($this->url);
-
- //get voting topic
- $inner_html = $this->decode(DOMinnerHTML($voting_dom->getElementsByTagName('body')->item(0)));
- preg_match("/Formuluot.+?\s+(.*?)<\/b>/msu", $inner_html, $matches);
- if (isset($matches[1])) {
- $this->voting_topic = $matches[1];
- }
-
- //get voting data
- $this->additional_data['voting'] = array();
- $xpath = new DOMXPath($voting_dom);
- $voting_dom = $xpath->query("//table[contains(@class, 'basic')]/tr[td]");
- foreach ($voting_dom as $member_data) {
- $member = array();
- $td2 = '';
- $td3 = '';
- $td4 = '';
- $tds = $member_data->getElementsByTagName('td');
- if ($tds->length != 5) {
- log_f('parsing error: voting data', $this->getId());
- }
- else {
- $member['id'] = $this->getMemberId($tds->item(0));
- $member['fraction'] = $this->clean($tds->item(1)->nodeValue);
- $member['vote'] = '';
- $td2 = $this->clean($tds->item(2)->nodeValue);
- $td3 = $this->clean($tds->item(3)->nodeValue);
- $td4 = $this->clean($tds->item(4)->nodeValue);
- if (!empty($td2)) {
- $member['vote'] = 'accept';
- }
- elseif (!empty($td3)) {
- $member['vote'] = 'reject';
- }
- elseif (!empty($td4)) {
- $member['vote'] = 'abstain';
- }
- else {
- $member['vote'] = 'not present';
- }
- $this->additional_data['voting'][$member['id']] = $member;
- }
- }
- unset($xpath);
- }
-
- public function getEndTime() {
- if (empty($this->end_time)){
- $this->parseData();
- }
- if ($this->end_time == $this->start_time) {
- $this->end_time = date('H:i:s', strtotime($this->end_time) + 60);
- /*
- It is possible to obtain the end time from next question, but there's an issue of breaks (not seen in statistics).
- Thus, for now we just assume that the last action took 60 seconds.
- try {
- $end = $this->parent->getSiblingInfoByPosition($this->parent->getId(), 1, 'getStartTime');
- $end_date = substr($end, 0, 10);
- if (strtotime($end) > strtotime($end_date . ' ' . $this->end_time)) $this->end_time = date('H:i:s', strtotime($end));
- else $this->end_time = date('H:i:s', strtotime($this->end_time) + 60);
- }
- catch(Exception $e) { $this->end_time = date('H:i:s', strtotime($this->end_time) + 60); }
- */
- }
- return $this->end_time;
- }
-
- public function getStartTime() {
- if (empty($this->start_time)){
- $this->parseData();
- }
- return $this->start_time;
- }
-
- public function getType() {
- return $this->type;
- }
-
- public function getNumber() {
- return $this->number;
- }
-
- public function getTitle() {
- return $this->title;
- }
-
- public function getParticipation() {
- if (isset($this->additional_data['participation'])) {
- return $this->additional_data['participation'];
- }
- else {
- return false;
- }
- }
-
- public function getVoting($type = 'present') {
- switch($type) {
- case 'accepted': return $this->Factory->getVar('SELECT count(id) FROM votes WHERE actions_id = ? AND vote = ?', array($this->getId(), 'accept'));
- case 'rejected': return $this->Factory->getVar('SELECT count(id) FROM votes WHERE actions_id = ? AND vote = ?', array($this->getId(), 'reject'));
- case 'abstain': return $this->Factory->getVar('SELECT count(id) FROM votes WHERE actions_id = ? AND vote = ?', array($this->getId(), 'abstain'));
- case 'not present': return $this->Factory->getVar('SELECT count(id) FROM votes WHERE actions_id = ? AND vote = ?', array($this->getId(), 'not presen'));
- case 'present': return $this->Factory->getVar('SELECT count(id) FROM votes WHERE actions_id = ? AND vote != ?', array($this->getId(), 'not presen'));
- }
- }
-
- public function getVotingTopic() {
- return $this->voting_topic;
- }
-
- public function getVotingOutcome() {
- return $this->outcome;
- }
-
- protected function serialise(DOMElement $dom) {
- $newDom = new DOMDocument('1.0', 'UTF-8');
- $root = $newDom->createElement('root');
- $root = $newDom->appendChild($root);
- $domNode = $newDom->importNode($dom, true);
- $root->appendChild($domNode);
- return $newDom->saveXML($root);
- }
-
- protected function unserialise($dom) {
- $newDom = new DOMDocument('1.0', 'UTF-8');
- $newDom->loadXML($dom);
- return $newDom->getElementsByTagName('tr')->item(0);
- }
-
-}
-
-?>
diff --git a/classes/DB.php b/classes/DB.php
deleted file mode 100755
index ea14e85..0000000
--- a/classes/DB.php
+++ /dev/null
@@ -1,139 +0,0 @@
-setFetchMode(PDO::FETCH_CLASS, $class_name, $construct_params);
- $q->execute($exec_params) or $this->throwError($q);
- $this->logQuery(func_get_args(), $start_time, microtime(true));
- return $q->fetch(PDO::FETCH_CLASS);
- }
-
- public function createObjects($sql_to_prepare, $exec_params, $class_name, $construct_params = array()) {
- $start_time = microtime(true);
- $q = parent::prepare($sql_to_prepare);
- $q->setFetchMode(PDO::FETCH_CLASS, $class_name, $construct_params);
- $q->execute($exec_params) or $this->throwError($q);
- $array = array();
- while ($object = $q->fetch(PDO::FETCH_CLASS)) {
- $array[$object->getId()] = clone $object;
- }
- $this->logQuery(func_get_args(), $start_time, microtime(true));
- return $array;
- }
-
-
- public function getArray($sql_to_prepare, $exec_params) {
- $start_time = microtime(true);
- $q = parent::prepare($sql_to_prepare);
- $q->execute($exec_params) or $this->throwError($q);
- $this->logQuery(func_get_args(), $start_time, microtime(true));
- return $q->fetchAll(PDO::FETCH_ASSOC);
- }
-
- public function getVar($sql_to_prepare, $exec_params) {
- $start_time = microtime(true);
- $q = parent::prepare($sql_to_prepare);
- $q->execute($exec_params) or $this->throwError($q);
- //$q->debugDumpParams();
- $this->logQuery(func_get_args(), $start_time, microtime(true));
- $a = $q->fetch();
- return $a[0];
- }
-
- protected function prepareInsert($table, $keys, $excluded_keys) {
- $update_fields = '';
- if (false !== $excluded_keys) {
- list($keys, $placeholders, $update_fields) = $this->getPlaceholders($keys, $excluded_keys);
- }
- else {
- list($keys, $placeholders) = $this->getPlaceholders($keys, $excluded_keys);
- }
- if (empty($update_fields)) $on_duplicate = '';
- else $on_duplicate = 'ON DUPLICATE KEY UPDATE ' . $update_fields;
- $sql = "INSERT INTO `$table` $keys VALUES $placeholders $on_duplicate";
- //print_f($sql);
- $q = parent::prepare($sql);
- return $q;
- }
-
- public function insertOne($table, $data, $excluded_keys = false) {
- $start_time = microtime(true);
- $q = $this->prepareInsert($table, array_keys($data), $excluded_keys);
- foreach ($data as $key => $value) {
- $q->bindValue(':' . $key, $value);
- }
- $q->execute() or $this->throwError($q);
- $this->logQuery(func_get_args(), $start_time, microtime(true));
- return $this->lastInsertId();
- }
-
- public function insertMany($table, $data, $excluded_keys = false) {
-
- if (!isset($data[0])) throw new Exception('empty data set provided!');
-
- $start_time = microtime(true);
- $q = $this->prepareInsert($table, array_keys($data[0]), $excluded_keys);
- foreach ($data as $row) {
- foreach ($row as $key => $value) {
- $q->bindValue(':' . $key, $value);
- }
- $q->execute() or $this->throwError($q);
- }
- $this->logQuery(func_get_args(), $start_time, microtime(true));
- }
-
- protected function throwError($handler) {
- $error = $handler->errorInfo();
- throw new Exception($error[2]);
- return true;
- }
-
- protected function getPlaceholders($keys, $excluded_keys) {
- $key_brackets = '(`' . implode('`, `', $keys) . '`)';
- $pl_brackets = '(:' . implode(', :', $keys) . ')';
- if (false === $excluded_keys) {
- return array($key_brackets, $pl_brackets);
- }
- else {
- $update_fields = array();
- foreach ($keys as $key) {
- if (!in_array($key, $excluded_keys)) {
- $update_fields[] = "`$key` = VALUES(`$key`)";
- }
- }
- $update_fields = implode(', ', $update_fields);
- return array($key_brackets, $pl_brackets, $update_fields);
- }
- }
-
- protected function logQuery($args, $start_time, $end_time) {
- $this->queries[] = array('length' => round(($end_time - $start_time) * 1000, 3) ,'args' => $args[0]);
- }
-
- public function showQueries() {
- print_f($this->queries);
- }
-
- public function exec($sql) {
- $a = parent::exec($sql);
- if (false === $a) {
- print_f($this->errorInfo());
- }
- }
-}
-?>
diff --git a/classes/Factory.php b/classes/Factory.php
deleted file mode 100755
index c100307..0000000
--- a/classes/Factory.php
+++ /dev/null
@@ -1,123 +0,0 @@
- 'Session', 'sitting' => 'Sitting', 'question' => 'Question', 'action' => 'Action');
- private $allowed_types;
- protected $DB = NULL;
-
- private function __construct($sql_params, $allowed_types) {
-
- /* populate known Object Types */
- $this->allowed_types = $allowed_types;
-
- /* initiate DB connection */
- try {
- list($dsn, $username, $password, $driver_options) = $sql_params;
- $this->DB = new DB($dsn, $username, $password, $driver_options);
- }
- catch (PDOException $e) {
- $this->DB = false;
- trigger_error('Connection to DB failed with ' . $e->getMessage(), E_USER_WARNING);
- }
- }
-
- static public function getInstance($sql_params, $allowed_types = array()) {
- if (empty($allowed_types)) $allowed_types = self::$default_allowed_types;
- if (empty(self::$instance)) {
- self::$instance = new Factory($sql_params, $allowed_types);
- }
- return self::$instance;
- }
-
- public function getObject($type, $url = NULL, $id = NULL, Seimas $parent = NULL, $parameters = array()) {
- if (isset($this->allowed_types[$type])) {
- $class_name = $this->allowed_types[$type];
-
- /* if url provided - initiate object without DB */
- if (false !== filter_var($url, FILTER_VALIDATE_URL)) {
- return new $class_name($url, $parent, $parameters, $this);
- }
- elseif (!empty($id)) {
- $class = new ReflectionClass($class_name);
- $sql = $class->getStaticPropertyValue('create_sql');
- $Object = $this->DB->createObject($sql, array($id), $class_name, array('', $parent, $parameters, $this));
- if ($Object instanceof Seimas) return $Object;
- else throw new Exception ('Object with the id provided was not found!');
- }
- else {
- throw new Exception('No object identifier (url / id) provided');
- }
- }
- else {
- throw new Exception('unknown object type to be initiated');
- }
- }
-
- public function getObjectChildren($class, $child_type, $id, $parent, $parameters = array()) {
- //get urls and IDs of all children
- $class_name = $this->allowed_types[$child_type];
- try {
- $class = new ReflectionClass($class);
- $sql = $class->getStaticPropertyValue('children_sql');
- $array = $this->DB->CreateObjects($sql, array($id), $class_name, array('', $parent, $parameters, $this));
- return $array;
- }
- catch (Exception $e) {
- echo $e->getMessage();
- }
- }
-
- public function saveObject($table, $data, $excluded_keys = false) {
-
- /* try saving 1 object */
- try {
- return $this->DB->insertOne($table, $data, $excluded_keys);
- }
- catch (Exception $e) {
- echo $e->getMessage() . ' ';
- }
- }
-
- public function saveObjects($table, $data, $excluded_keys = false) {
- /* try saving many objects */
- try {
- $this->DB->insertMany($table, $data, $excluded_keys);
- }
- catch (Exception $e) {
- echo $e->getMessage();
- }
- }
-
- public function getArray($sql, $exec_params) {
- try {
- return $this->DB->getArray($sql, $exec_params);
- }
- catch (Exception $e) {
- echo $e->getMessage();
- echo $sql;
- }
- }
-
- public function getVar($sql, $exec_params) {
- try {
- return $this->DB->getVar($sql, $exec_params);
- }
- catch (Exception $e) {
- echo $e->getMessage();
- }
- }
-
- public function showQueries() {
- $this->DB->showQueries();
- }
-
-}
-
-?>
\ No newline at end of file
diff --git a/classes/Klausimas_.php b/classes/Klausimas_.php
deleted file mode 100755
index 9739ce0..0000000
--- a/classes/Klausimas_.php
+++ /dev/null
@@ -1,390 +0,0 @@
-PDO) { //if object created not via DB
- $this->start_time = $params['start_time'];
- $this->title = $this->decode($this->clean($params['title']));
- $this->number = $params['number'];
- $this->sittings_id = $this->getParentInfo('getId');
- }
- $this->date = date('Y-m-d', strtotime($this->start_time));
- }
-
- protected function populateData() {
- if ($this->PDO) {
- //loaded via DB
- if (empty($this->end_time)) {
- //initial run - let's scrape additional data
- return false;
- }
- else {
- //all data loaded, only populate children / etc
- $this->PopulateChildren();
- $this->PopulateItems();
- return true;
- }
- }
- else {
- //not loaded via DB - scrape all data
- return false;
- }
- }
-
- protected function populateItems() {
- $items = $this->Factory->getArray(self::$items_sql, array($this->getId()));
- foreach ($items as $item) {
- $presenters = $this->Factory->getArray(self::$presenters_sql, array($item['id']));
- if (false != $presenters) {
- $item['presenters'] = $presenters;
- }
- else {
- $item['presenters'] = array();
- }
- $this->items[$item['number']] = $item;
- }
- }
-
- protected function saveData() {
- $array = get_object_vars($this);
- unset($array['PDO']);
- unset($array['Factory']);
- unset($array['parent']);
- unset($array['items']);
- unset($array['children']);
- unset($array['date']);
-
- $this->Factory->SaveObject('questions', $array, array('id'));
- $this->saveItems();
- $this->saveChildren();
- }
-
- protected function saveItems() {
- foreach ($this->items as $number => $item) {
- $presenters = $item['presenters'];
- unset($item['presenters']);
- $item['questions_id'] = $this->getId();
- $item['number'] = $number;
- $item_id = 0;
- $item_id = $this->Factory->saveObject('items', $item, array('id', 'questions_id'));
- if (0 == $item_id) {
- if (isset($item['id'])) { //some random anomaly of some items being here twice...
- $item_id = $item['id']; // if DB returns 0, the item was in DB before, thus ID attrib. should be present in array
- }
- }
- /* save presenters data */
- if (0 != $item_id ) {
- foreach ($presenters as $number => $presenter) {
- $this->Factory->saveObject('presenters', array('presenter' => $presenter, 'items_id' => $item_id, 'number' => $number), array('id', 'items_id'));
- }
- }
- }
- }
-
- protected function saveChildren() {
-
- }
-
- protected function scrapeData() {
- $dom = $this->getHTMLDOM($this->url);
- $this->getItems($dom);
- echo 'here!';
- $this->getActions($dom);
- }
-
- protected function getItems(DOMDocument $dom) {
- $xpath = new DOMXPath($dom);
- $questions_dom = $xpath->query("//li[preceding::h4 and following::h4]");
- if ($questions_dom->length > 0) { //if more than one inner question
- $i = 0;
- foreach ($questions_dom as $question_dom) {
- //get data for each inner question
- $this->items[$i++] = $this->getItemMetaData($question_dom);
- }
- }
- else {
- $questions_dom = $xpath->query("//node()[preceding::h4 and following::h4]");
- if ($questions_dom->length > 0) { //if one question only, need to create a new DOMElement (shame on you, XPATH!)
- $newDom = new DOMDocument('1.0', 'UTF-8');
- $root = $newDom->createElement('root');
- $root = $newDom->appendChild($root);
- $prev = '';
- foreach ($questions_dom as $question_dom) {
- if ($question_dom->nodeValue != $prev) {
- $domNode = $newDom->importNode($question_dom, true);
- $root->appendChild($domNode);
- }
- $prev = $question_dom->nodeValue;
- }
- $this->items[0] = $this->getItemMetaData($root);
- }
- else
- log_f('klausimo lentele: metadata not found', $this->getId());
- }
- unset($xpath);
- }
-
- protected function getItemMetaData(DOMElement $dom) {
-
- $data = array();
-
- //find document links
- $links = $dom->getElementsByTagName('a');
- foreach ($links as $link) {
- $db_field = $this->getLinkType($this->decode(str_replace(array(chr(160), chr(194)), ' ', $link->nodeValue)));
- $data[$db_field] = $link->getAttribute('href');
- }
-
- //find title of question
- $title = $dom->getElementsByTagName('b')->item(0);
- if (is_object($title))
- $data['title'] = $this->decode($title->nodeValue);
-
- //find speakers
- $decoded = $this->decode(DOMinnerHTML($dom));
- $data['presenters'] = array();
- $pos = stripos($decoded, 'Pranešėja');
- if ($pos !== false) {
- preg_match_all('/(.*?)<\/b>/u', substr($decoded, $pos + 9), $matches, PREG_SET_ORDER);
- foreach ($matches as $match) {
- if (isset($match[1]))
- $data['presenters'][] = $match[1];
- }
- }
- return $data;
- }
-
- protected function getLinkType($lithuanian_string) {
- switch($lithuanian_string) {
- case 'dokumento tekstas': return 'document_url';
- case 'susiję dokumentai': return 'related_doc_url';
- default: return 'other_url';
- }
- }
-
- protected function getActions($dom) {
-
- $xpath = new DOMXPath($dom);
- $actions_dom = $xpath->query("//table[contains(@class, 'basic')]/tr[td]");
- $i = 0;
- foreach ($actions_dom as $action_dom) {
- /* Action parsing */
- $tds = $action_dom->getElementsByTagName('td');
- if ($tds->length != 2)
- log_f('parsing error: Action table td count', $this->getId());
- else {
- $this->children[$i]['start_time'] = $this->clean($tds->item(0)->nodeValue);
- list($type, $meta) = $this->parseAction($tds->item(1));
- $this->children[$i]['type'] = $type;
- $this->children[$i]['meta'] = $meta;
- if ($i !== 0) {
- $this->children[$i - 1]['end_time'] = $this->children[$i]['start_time'];
- }
- else {
- $this->start_time = $this->date . ' ' . $this->children[$i]['start_time'];
- }
- $i++;
- }
- /* Action parsing end */
- }
- if ($i > 0) {
- /* If at least 1 action - set last action start time = end time & question end_time = action end time */
- $this->children[$i - 1]['end_time'] = $this->children[$i - 1]['start_time'];
- $this->end_time = $this->date . ' ' . $this->children[$i - 1]['end_time'];
- }
- else {
- /* if no actions - set end time as the start time of the next question */
- $this->end_time = $this->getSiblingInfoByPosition($this->getId(), +1, 'getStartTime');
- }
- unset($xpath);
- }
-
- protected function parseAction(DOMElement $element) {
- $meta = array();
- $type = 'other';
- //action type - speech
- if (strpos($element->nodeValue, 'Kalbėjo') !== false) {
- $type = 'speech';
- $meta['speaker'] = $this->getMemberId($element);
- }
- //action type - voting (together)
- elseif (strpos($element->nodeValue, 'bendru sutarimu') !== false) {
- $type = 'u_voting';
- $meta['text'] = $this->decode($element->nodeValue);
- if (strpos($element->nodeValue, 'pritarta') !== false) {
- $meta['outcome'] = 'accepted';
- }
- else {
- $meta['outcome'] = 'rejected';
- }
- }
- //action type - registration
- elseif (stripos($element->nodeValue, 'Įvyko registracija') !== false) {
- $type = 'registration';
- $matches = array();
- $total_participants = preg_match('/užsiregistravo.*?(\d+)/u', $element->nodeValue, $matches);
- if (isset($matches[1]))
- $meta['total_participants'] = $matches[1];
-
- $reg_link = $element->getElementsByTagName('a')->item(0);
- if (!is_object($reg_link))
- log_f('parsing error: question - registration link', $this->getId());
- else {
- $link = self::BASE_URL . $reg_link->getAttribute('href');
- $meta['link'] = $link;
- $query = parse_url($link, PHP_URL_QUERY);
- $variables = array();
- parse_str($query, $variables);
- if (isset($variables['p_reg_id']))
- $meta['id'] = -$variables['p_reg_id'];
- $meta['participation'] = $this->getRegistrationData($link);
- }
- }
- //action type voting
- elseif (stripos($element->nodeValue, 'Įvyko balsavimas') !== false) {
- $type = 'voting';
- /* general outcome of voting */
- if (strpos($element->nodeValue, 'pritarta') !== false) {
- $meta['outcome'] = 'accepted';
- }
- else {
- $meta['outcome'] = 'rejected';
- }
- /* individual outcome of voting */
- $voting_link = $element->getElementsByTagName('a')->item(0);
- if (!is_object($voting_link))
- log_f('parsing error: question - voting link', $this->getId());
- else {
- $link = self::BASE_URL . $voting_link->getAttribute('href');
- $meta['link'] = $link;
- $query = parse_url($link, PHP_URL_QUERY);
- $variables = array();
- parse_str($query, $variables);
- if (isset($variables['p_bals_id']))
- $meta['id'] = -$variables['p_bals_id'];
- list($meta['voting_topic'], $meta['individual_voting']) = $this->getVotingData($link);
- }
- }
- else {
- $meta['text'] = $element->nodeValue;
- }
-
- return array($type, $meta);
- }
-
- protected function getRegistrationData($url) {
- $lankomumas_dom = $this->getHTMLDOM($url);
- $xpath = new DOMXPath($lankomumas_dom);
- $nariai = array();
- $nariai_dom = $xpath->query("//table[contains(@cellpadding, '1')]//table[contains(@width, '100%')]/tr");
- //echo $nariai_dom->length;
- foreach ($nariai_dom as $nario_data) {
-
- $tds = $nario_data->getElementsByTagName('td');
- $participation = false;
- $person_id = false;
-
- $state = $tds->item(0);
- if (is_object($state)) {
- $value = $this->clean($state->nodeValue);
- if (empty($value))
- $participation = 0;
- else
- $participation = 1;
- }
- else
- log_f('parsing error: action lankomumo lentele - participation . ', $this->getId());
-
- $person_id = $this->getMemberId($tds->item(1));
-
- if (($participation !== false) && ($person_id !== false)) {
- $nariai[$person_id] = $participation;
- }
- }
- unset($lankomumas_dom);
- return $nariai;
- }
-
- protected function getVotingData($url) {
- $lankomumas_dom = $this->getHTMLDOM($url);
- $nariai = array();
- $formuluote = '';
-
- //get formuluote
- $inner_html = $this->decode(DOMinnerHTML($lankomumas_dom->getElementsByTagName('body')->item(0)));
- preg_match("/Formuluot.+?\s+(.*?)<\/b>/msu", $inner_html , $matches);
- if (isset($matches[1])) $formuluote = $matches[1];
-
- //get voting data
- $xpath = new DOMXPath($lankomumas_dom);
- $voting_dom = $xpath->query("//table[contains(@class, 'basic')]/tr[td]");
- foreach ($voting_dom as $member) {
- $narys = array();
- $td2 = '';
- $td3 = '';
- $td4 = '';
- $tds = $member->getElementsByTagName('td');
- if ($tds->length != 5) log_f('parsing error: voting data', $this->getId ());
- else {
- $narys['id'] = $this->getMemberId($tds->item(0));
- $narys['frakcija'] = $this->clean($tds->item(1)->nodeValue);
- $td2 = $this->clean($tds->item(2)->nodeValue);
- $td3 = $this->clean($tds->item(3)->nodeValue);
- $td4 = $this->clean($tds->item(4)->nodeValue);
- if (!empty($td2)) $narys['vote'] = 'accept';
- elseif (!empty($td3)) $narys['vote'] = 'reject';
- elseif (!empty($td4)) $narys['vote'] = 'abstain';
- else $narys['vote'] = 'missing';
- $nariai[$narys['id']] = $narys;
- }
- }
- unset($xpath);
- return array($formuluote, $nariai);
- }
-
- public function getStartTime() {
- return $this->start_time;
- }
-
- public function getEndTime() {
- if (empty($this->end_time)) {
- $this->initialise();
- }
- return $this->end_time;
- }
-}
-
-?>
diff --git a/classes/Posedis.php b/classes/Posedis.php
deleted file mode 100755
index 77f65eb..0000000
--- a/classes/Posedis.php
+++ /dev/null
@@ -1,208 +0,0 @@
-PDO) {
- //loaded via DB
- if (empty($this->number) || ($this->end_time == '0000-00-00 00:00:00')) {
- //initial run - let's scrape additional data
- return false;
- }
- else {
- //all data from DB present - let's only add children, participation & date
- $this->populateChildren();
- $this->populateParticipation();
- $this->date = date('Y-m-d', strtotime($this->end_time));
- return true;
- }
- }
- else {
- $this->sessions_id = $this->getParentInfo('getId');
- return false; //not loaded via DB - scrape everything
- }
- }
-
- protected function populateParticipation() {
- $participation = $this->Factory->getArray(self::$participation_sql, array($this->getId()));
- foreach ($participation as $pair) {
- $this->participation[$pair['members_id']] = $pair['presence'];
- }
- }
-
- protected function saveData() {
- //added check if the data is correct (e.g. end-time = 0000-00-00 00:00:00
- if ($this->end_time == '0000-00-00 00:00:00') {
- $this->clearCache($this->transcript_url);
- $this->clearCache($this->recording_url);
- $this->clearCache($this->protocol_url);
- $this->clearCache($this->participation_url);
- $this->clearCache($this->url);
- return;
- }
- else {
- $array = get_object_vars($this);
- unset($array['PDO']);
- unset($array['Factory']);
- unset($array['parent']);
- unset($array['date']);
-
- /* parse children data */
- $children_array = array();
- foreach ($array['children'] as $child) {
- $children_array[] = array('id' => $child->getId(), 'url' => $child->getUrl(), 'sittings_id' => $this->getId());
- }
- unset($array['children']);
-
- /* parse parcitipation data */
- $participation_array = array();
- foreach ($array['participation'] as $member_id => $presence) {
- $participation_array[] = array('members_id' => $member_id, 'presence' => $presence, 'sittings_id' => $this->getId());
- }
- unset($array['participation']);
- $this->Factory->SaveObject('sittings', $array, array('id'));
- $this->Factory->SaveObjects('questions', $children_array, array('sittings_id', 'id'));
-
- $this->Factory->SaveObjects('sitting_participation', $participation_array, array());
- }
- }
-
- protected function scrapeData($reload = FALSE) {
- $dom = $this->getHTMLDOM($this->url, $reload);
- $this->getMetaData($dom);
- $this->extractParticipation($dom);
- $this->extractQuestions($dom);
- }
-
- protected function getMetaData($dom) {
-
- /* title parsing */
- $title = $dom->getElementsByTagName('title')->item(0)->nodeValue;
- $matches = array();
- preg_match("/Seimo posėdis\s+Nr\.(\d+)\s+\((\d{4}-\d{2}-\d{2}), (.+)\)/u", $title, $matches);
- if (count($matches) < 4) {
- throw new Exception('Something wrong with Sitting parsing @' . $this->url);
- }
- $this->number = trim($matches[1]);
- $this->date = trim($matches[2]);
- $this->type = trim($matches[3]);
-
- /* finding links to content */
- $xpath = new DOMXPath($dom);
- $a_dom = $xpath->query("//a[.='Protokolas']")->item(0);
- if (is_object($a_dom)) $this->protocol_url = $a_dom->getAttribute('href');
- $a_dom = $xpath->query("//a[.='Stenograma']")->item(0);
- if (is_object($a_dom)) $this->transcript_url = $a_dom->getAttribute('href');
- $a_dom = $xpath->query("//a[.='Garso įrašas']")->item(0);
- if (is_object($a_dom)) $this->recording_url = $a_dom->getAttribute('href');
- unset($xpath);
-
- }
-
- protected function extractParticipation($dom) {
- $xpath = new DOMXPath($dom);
- $a_dom = $xpath->query("//a[.='Lankomumas']")->item(0);
- if (is_object($a_dom)) $this->participation_url = self::BASE_URL . $a_dom->getAttribute('href');
- unset($xpath);
- if (!empty($this->participation_url)) {
- $lankomumas_dom = $this->getHTMLDOM($this->participation_url);
- $xpath = new DOMXPath($lankomumas_dom);
- $nariai_dom = $xpath->query("//table[contains(@cellpadding, '1')]//table[contains(@width, '100%')]/tr");
- foreach ($nariai_dom as $nario_data) {
-
- $tds = $nario_data->getElementsByTagName('td');
- $participation = false;
- $person_id = false;
-
- $state = $tds->item(0);
- if (is_object($state)) {
- $value = $this->clean($state->nodeValue);
- if (empty($value)) $participation = 0;
- else $participation = 1;
- }
- else log_f('parsing error: lankomumo lentele - participation . ', $this->getId ());
- $person_id = $this->getMemberId($tds->item(1));
-
- if (($participation !== false) && ($person_id !== false)) {
- $this->participation[$person_id] = $participation;
- }
- }
- unset($lankomumas_dom);
- }
- }
-
- protected function extractQuestions($dom) {
- $xpath = new DOMXPath($dom);
- $table_dom = $xpath->query("//table[contains(@class,'basic')]/tr[td]");
- $i = 0;
- $klausimas = false;
- foreach ($table_dom as $row) {
- $data = array();
- $url = '';
- $klausimas = false;
- $tds = $row->getElementsbyTagName('td');
- if ($tds->length < 3) log_f('parsing error: darbotvarkes lentele', $this->getId());
- else {
- $data['start_time'] = $this->getDate() . ' ' . $this->clean($tds->item(0)->nodeValue);
- //$data['number'] = $this->clean($tds->item(1)->nodeValue); replaced with actual number in the list
- $data['number'] = $i;
- $data['title'] = $this->clean($tds->item(2)->nodeValue);
- $link_dom = $tds->item(2)->getElementsByTagName('a');
- if (is_object($link_dom->item(0))) {
- $url = self::BASE_URL . $link_dom->item(0)->getAttribute('href');
- }
- else log_f('parsing error: darbotvarkes lentele - klausimas a', $this->getId());
-
- if (!empty($url)) {
- $klausimas = $this->Factory->getObject(self::$child_class, $url, '', $this, $data);
- $this->children[$klausimas->getId()] = $klausimas;
- if ($i++ == 0) $this->start_time = $this->date . ' ' .$klausimas->getStartTime();
- }
- }
- }
- if (is_object($klausimas)) $this->end_time = $klausimas->getEndTime();
- unset($xpath);
- unset($table_dom);
- }
-
- public function getDate() {
- return $this->date;
- }
-
- public function getParticipation() {
- return $this->participation;
- }
-}
-
-?>
diff --git a/classes/Question.php b/classes/Question.php
deleted file mode 100755
index 1585af9..0000000
--- a/classes/Question.php
+++ /dev/null
@@ -1,263 +0,0 @@
-PDO) { //if object created not via DB
- $this->start_time = $params['start_time'];
- $this->title = $this->decode($this->clean($params['title']));
- $this->number = $params['number'];
- $this->sittings_id = $this->getParentInfo('getId');
- }
- $this->date = date('Y-m-d', strtotime($this->start_time));
- }
-
- protected function populateData() {
- if ($this->PDO) {
- //loaded via DB
- if (empty($this->end_time)) {
- //initial run - let's scrape additional data
- return false;
- }
- else {
- //all data loaded, only populate children / etc
- $this->PopulateChildren();
- $this->PopulateItems();
- return true;
- }
- }
- else {
- //not loaded via DB - scrape all data
- return false;
- }
- }
-
- //modified implementation of abstractions.php
- public function populateChildren($initialiseSearch = false) {
- $class = get_class($this);
- $class_ = new ReflectionClass($class);
- $token = $class_->getStaticPropertyValue('child_class');
- $children = $this->Factory->getObjectChildren($class, $token, $this->getId(), $this);
- foreach ($children as $child) {
- $this->children[$child->getNumber()] = $child;
- }
- if (empty($this->children) && ($initialiseSearch)) {
- $this->scrapeData();
- $this->saveData();
- }
- }
-
- protected function populateItems() {
- $class = get_class($this);
- $class_ = new ReflectionClass($class);
- $items_sql = $class_->getStaticPropertyValue('items_sql');
- $presenters_sql = $class_->getStaticPropertyValue('presenters_sql');
- $items = $this->Factory->getArray($items_sql, array($this->getId()));
- foreach ($items as $item) {
- $presenters = $this->Factory->getArray($presenters_sql, array($item['id']));
- if (false != $presenters) {
- $item['presenters'] = $presenters;
- }
- else {
- $item['presenters'] = array();
- }
- $this->items[$item['number']] = $item;
- }
- }
-
- protected function saveData() {
- $array = get_object_vars($this);
- unset($array['PDO']);
- unset($array['Factory']);
- unset($array['parent']);
- unset($array['items']);
- unset($array['children']);
- unset($array['date']);
-
- $this->Factory->SaveObject('questions', $array, array('id'));
- $this->saveItems();
-
- foreach ($this->children as $child) {
- $child->saveMainData();
- }
- }
-
- protected function saveItems() {
- foreach ($this->items as $number => $item) {
- $presenters = $item['presenters'];
- unset($item['presenters']);
- $item['questions_id'] = $this->getId();
- $item['number'] = $number;
- $item_id = 0;
- $item_id = $this->Factory->saveObject('items', $item, array('id', 'questions_id'));
- if (0 == $item_id) {
- if (isset($item['id'])) { //some random anomaly of some items being here twice...
- $item_id = $item['id']; // if DB returns 0, the item was in DB before, thus ID attrib. should be present in array
- }
- }
- /* save presenters data */
- if (0 != $item_id ) {
- foreach ($presenters as $number => $presenter) {
- $this->Factory->saveObject('presenters', array('presenter' => $presenter, 'items_id' => $item_id, 'number' => $number), array('id', 'items_id'));
- }
- }
- }
- }
-
- protected function scrapeData($reload = FALSE) {
- $dom = $this->getHTMLDOM($this->url, $reload);
- $this->getItems($dom);
- $this->getActions($dom);
- }
-
- protected function getItems(DOMDocument $dom) {
- $xpath = new DOMXPath($dom);
- $questions_dom = $xpath->query("//li[preceding::h4 and following::h4]");
- if ($questions_dom->length > 0) { //if more than one inner question
- $i = 0;
- foreach ($questions_dom as $question_dom) {
- //get data for each inner question
- $this->items[$i++] = $this->getItemMetaData($question_dom);
- }
- }
- else {
- $questions_dom = $xpath->query("//node()[preceding::h4 and following::h4]");
- if ($questions_dom->length > 0) { //if one question only, need to create a new DOMElement (shame on you, XPATH!)
- $newDom = new DOMDocument('1.0', 'UTF-8');
- $root = $newDom->createElement('root');
- $root = $newDom->appendChild($root);
- $prev = '';
- foreach ($questions_dom as $question_dom) {
- if ($question_dom->nodeValue != $prev) {
- $domNode = $newDom->importNode($question_dom, true);
- $root->appendChild($domNode);
- }
- $prev = $question_dom->nodeValue;
- }
- $this->items[0] = $this->getItemMetaData($root);
- }
- else
- log_f('klausimo lentele: metadata not found', $this->getId());
- }
- unset($xpath);
- }
-
- protected function getItemMetaData(DOMElement $dom) {
-
- $data = array();
-
- //find document links
- $links = $dom->getElementsByTagName('a');
- foreach ($links as $link) {
- $db_field = $this->getLinkType($this->decode(str_replace(array(chr(160), chr(194)), ' ', $link->nodeValue)));
- $data[$db_field] = $link->getAttribute('href');
- }
-
- //find title of question
- $title = $dom->getElementsByTagName('b')->item(0);
- if (is_object($title))
- $data['title'] = $this->decode($title->nodeValue);
-
- //find speakers
- $decoded = $this->decode(DOMinnerHTML($dom));
- $data['presenters'] = array();
- $pos = stripos($decoded, 'Pranešėja');
- if ($pos !== false) {
- $matches = array();
- preg_match_all('/(.*?)<\/b>/u', substr($decoded, $pos + 9), $matches, PREG_SET_ORDER);
- foreach ($matches as $match) {
- if (isset($match[1]))
- $data['presenters'][] = $match[1];
- }
- }
- return $data;
- }
-
- protected function getLinkType($lithuanian_string) {
- switch($lithuanian_string) {
- case 'dokumento tekstas': return 'document_url';
- case 'susiję dokumentai': return 'related_doc_url';
- default: return 'other_url';
- }
- }
-
- protected function getActions($dom) {
-
- $xpath = new DOMXPath($dom);
- $actions_dom = $xpath->query("//table[contains(@class, 'basic')]/tr[td]");
- $i = 0;
- foreach ($actions_dom as $action_dom) {
- /* Create Children Actions */
- // dirty hack for avoiding Factory exception of no ID & URL
- $this->children[$i] = $this->Factory->getObject(self::$child_class, 'http://fake-url.lt/', '', $this, array('dom' => $action_dom, 'id' => $i));
- $i++;
- }
- $this->initialiseChildrenParse();
- /* get end_time of a question */
- try {
- //try to get the start time of next question
- $this->end_time = $this->getSiblingInfoByPosition($this->getId(), +1, 'getStartTime');
- }
- catch(Exception $e) {
- //if no success - probably last question. Try end time of last children, if any
- if ($i > 0) {
- $this->end_time = $this->date . ' ' . $this->children[$i - 1]->getEndTime();
- }
- else {
- //if no actions - set end time as the start time of the next question
- $this->end_time = $this->start_time;
- }
- }
- unset($xpath);
- }
-
- protected function initialiseChildrenParse() {
- foreach ($this->children as $child) {
- $child->parseData();
- }
- }
-
- public function getStartTime() {
- return $this->start_time;
- }
-
- public function getEndTime() {
- if (empty($this->end_time)) {
- $this->initialise();
- }
- return $this->end_time;
- }
-
- public function getTitle() {
- return $this->title;
- }
-
-}
-
-?>
diff --git a/classes/Sesija.php b/classes/Sesija.php
deleted file mode 100755
index 67e7711..0000000
--- a/classes/Sesija.php
+++ /dev/null
@@ -1,82 +0,0 @@
-PDO) {
- $this->populateChildren();
- return true;
- }
- else return false;
- }
-
- public function saveData() {
- $array = get_object_vars($this);
- unset($array['PDO']);
- unset($array['Factory']);
- unset($array['parent']);
- unset($array['url_token']);
- $children_array = array();
- foreach ($array['children'] as $child) {
- $children_array[] = array('id' => $child->getId(), 'url' => $child->getUrl(), 'sessions_id' => $this->getId());
- }
- unset($array['children']);
- $this->Factory->SaveObject('sessions', $array, array('id'));
- $this->Factory->SaveObjects('sittings', $children_array, array('id', 'sessions_id'));
- }
-
- public function scrapeData($reload = FALSE) {
- $dom = $this->getHTMLDOM($this->url, $reload);
- $this->getMetaData($dom);
- $this->getSittings($dom);
- }
-
- private function getSittings(DOMDocument $dom) {
- $xpath = new DOMXPath($dom);
- $sittings = array();
- $sittings_dom = $xpath->query("//table[contains(@class, 'basic')]/tr/td[last()]/a[contains(@href, 'p_fakt_pos_id')]/@href");
- foreach ($sittings_dom as $link) {
- $sitting = $this->Factory->getObject(self::$child_class, self::BASE_URL . $link->nodeValue, '', $this);
- $sittings[$sitting->getId()] = $sitting;
- }
- $this->children = $sittings;
- unset($xpath);
- }
-
- private function getMetaData(DOMDocument $dom) {
- $title = $dom->getElementsByTagName('title')->item(0)->nodeValue;
- $matches = array();
- preg_match("/(\d) ((ne)?(eilinė)) Seimo sesija \((.*) - (.*)\)/u", $title, $matches);
- $this->number = $matches[1];
- $this->type = $matches[2];
- $this->start_date = trim($matches[5]);
- if ($matches[6] != '...') $this->end_date = trim($matches[6]);
- else $this->end_date = false;
- }
-
- public function getType() {
- return $this->type;
- }
-
- public function getNumber() {
- return $this->number;
- }
-}
-
-?>
diff --git a/classes/Updater.php b/classes/Updater.php
deleted file mode 100755
index a7c0b16..0000000
--- a/classes/Updater.php
+++ /dev/null
@@ -1,167 +0,0 @@
-session = $session;
- $this->last_time = microtime(true);
- $this->start_time = $this->last_time;
- }
-
- /* Surenkame sesijos posėdžių sąrašą ir viską išsaugome */
- /* Scrape the list of the sittings in the session and save */
- public function updateSittingList() {
- $this->session->scrapeData(true);
- $this->session->saveData();
- }
-
- /* Daugiausiai resursų reikalaujantis etapas: rekursiškai keliaujam per objektų medį,
- * renkame visus duomenis ir viską saugome */
- /* The heavylifting part:Do the recursive object-tree scraping and save all the obtained data */
- public function obtainData() {
- $this->session->initialise();
- $this->session->initialiseChildren(true);
- }
-
- /* Seime.lt skaičiavimai: klausimai skaldomi į dalis ir apskaičiuojamas tikslus lankomumas */
- /* Seime.lt estimations: Participation data is estimated precisely, at sub-question level */
- public function estimateParticipation() {
- foreach ($this->session->getChildren() as $sitting) {
- foreach ($sitting->getChildren() as $question) {
- if (false === $question->populateParticipation()) {
- $question->estimateParticipation();
- $question->saveParticipation();
- }
- }
- }
- }
-
- /* Nustatomi ryšiai tarp registracijų į balsavimus ir pačių balsavimų */
- /* Establish links between registrations for voting and voting themselves */
- public function linkRegistrations() {
- foreach ($this->session->getChildren() as $sitting) {
- foreach ($sitting->getChildren() as $question) {
- foreach ($question->getChildren() as $action)
- $action->InitialiseLink();
- }
- }
- }
-
- /* Pagalbinė funkcija, grąžinanti SQL užklausas iš aplanko 'sqls/'
- /* Helper function: returns SQL commands from files in 'sqls/' folder */
- public function getSQL($script) {
- $file = BASE_DIR . 'sqls/' . $script . '.sql';
- if (file_exists($file)) {
- return file_get_contents($file);
- }
- else throw new Exception('SQL file is unavailable: ' . $file);
- }
-
- /* Pagalbinė funkcija, spausdinanti žinutę ir laiką nuo paskutinės žinutės */
- /* Helper function: prints message and elapsed execution time since last message */
- public function announce($message) {
- $c_time = microtime(true);
- echo $message . ' for session #' . $this->session->getId() .
- ' in ' . round(($c_time - $this->last_time), 3) . 's' .
- ' (total time: ' . round(($c_time - $this->start_time), 3) . 's) ';
- $this->last_time = $c_time;
- flush();
- }
-
- /* Seimo narių duomenų atnaujinimas - surenkamas aprašymas, vardas, nuotrauka. Išsiunčiamas pranešimas apie naują informaciją */
- /* Updates member info - scrapes description, get name & picture. Notifies via email if new info is added */
- public function updateMember(array $member) {
- $url = 'http://www3.lrs.lt/pls/inter/w5_show?p_r=8801&p_k=1&p_a=5&p_asm_id=' . $member['id'] .'&p_kade_id=7';
- if($html = @file_get_contents($url)) {
- //clean the HTML
- $html = ScrapingUtilities::cleanHTML($html);
- //parse the HTML
- $dom = new DOMDocument('1.0', 'UTF-8');
- @$dom->loadHTML($html);
- //get the name
- $name = $dom->getElementsByTagName('title')->item(0)->nodeValue;
- $name = str_replace('-', ' - ', $name);
- $member['name'] = trim(mb_convert_case($name, MB_CASE_TITLE));
- //get the image src & send email with details
- $div = $dom->getElementById('divDesContent');
- $images = $div->getElementsByTagName('img')->item(0);
- if (is_object($images)) {
- $member['image_src'] = $images->getAttribute('src');
- $this->sendPictureEmail($member);
- }
- //return the updated data
- return $member;
- }
- else {
- throw new Exception('Remote file fetching failed');
- }
- }
-
- /* Išsiunčiamas el. laiškas apie naują Seimo narį - naudojama Seime.lt svetainėje */
- /* Sends an email about new member added - for Seime.lt purposes */
- public function sendPictureEmail(array $member) {
- $subject = '[seime.lt] - naujas narys: '. $member['name'];
- $headers = 'MIME-Version: 1.0' . "\r\n";
- $headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";
- $text = ' Pridėtas naujas seimo narys
- Nuotraukos URL: %1$s
- Full dydžio nuotrauka (180x135): /images/people/full/%2$s.jpg
- Thumb (60x45): /images/people/thumbs/%2$s.jpg
- Mekeke!';
- $text = sprintf($text, $member['image_src'], $member['id']);
- mail(NOTIF_EMAIL, $subject, wordwrap($text), $headers);
- }
-
- /* Pagalbinis updateMember metodas */
- /* Wrapper for updateMember method */
- public function updateMembers(array $members) {
- foreach($members as &$member) {
- try {
- $member = $this->updateMember($member);
- }
- catch(Exception $e) {
- $this->announce("Updating data failed for $member: " . $e->__toString());
- }
- }
- return $members;
- }
-
- /* Atnaujinama Seimo narių, kurie pradėjo kadenciją vėliau arba ją baigė per anksti, informacija */
- /* Update details on members who entered late of left early */
- public function getTermDetails() {
- $list = array();
- if ($html = @file_get_contents('http://www3.lrs.lt/pls/inter/w5_show?p_r=6113&p_k=1')) {
- //clean the HTML
- $html = ScrapingUtilities::cleanHTML($html);
- //parse the HTML
- $dom = new DOMDocument('1.0', 'UTF-8');
- @$dom->loadHTML($html);
- $xpath = new DOMXPath($dom);
- $r = $xpath->query('//td[a[contains(@href,"p_asm_id")] and (contains(., "iki") or contains(., "nuo"))]');
- if ($r instanceof DOMNodeList) {
- foreach ($r as $node) {
- preg_match('#p_asm_id=(\d+)#', DOMInnerHTML($node), $matches);
- $id = $matches[1];
- $start = '0000-00-00';
- $end = '0000-00-00';
- if (preg_match('#nuo (\d{4} \d{2} \d{2})#', DOMInnerHTML($node), $matches)) {
- $start = str_replace(' ', '-', $matches[1]);
- }
- if (preg_match('#iki (\d{4} \d{2} \d{2})#', DOMInnerHTML($node), $matches)) {
- $end = str_replace(' ', '-', $matches[1]);
- }
- $list[] = array('id' => $id, 'cadency_start' => $start, 'cadency_end' => $end);
- }
- return $list;
- }
- else {
- $this->announce('UPDATING TERM DETAILS FAILED - HTML not recognized!');
- }
- }
- }
-
-}
-
diff --git a/classes/Updater.php~ b/classes/Updater.php~
deleted file mode 100755
index 44472c7..0000000
--- a/classes/Updater.php~
+++ /dev/null
@@ -1,167 +0,0 @@
-session = $session;
- $this->last_time = microtime(true);
- $this->start_time = $this->last_time;
- }
-
- /* Surenkame sesijos posėdžių sąrašą ir viską išsaugome */
- /* Scrape the list of the sittings in the session and save */
- public function updateSittingList() {
- $this->session->scrapeData(true);
- $this->session->saveData();
- }
-
- /* Daugiausiai resursų reikalaujantis etapas: rekursiškai keliaujam per objektų medį,
- * renkame visus duomenis ir viską saugome */
- /* The heavylifting part:Do the recursive object-tree scraping and save all the obtained data */
- public function obtainData() {
- $this->session->initialise();
- $this->session->initialiseChildren(true);
- }
-
- /* Seime.lt skaičiavimai: klausimai skaldomi į dalis ir apskaičiuojamas tikslus lankomumas */
- /* Seime.lt estimations: Participation data is estimated precisely, at sub-question level */
- public function estimateParticipation() {
- foreach ($this->session->getChildren() as $sitting) {
- foreach ($sitting->getChildren() as $question) {
- if (false === $question->populateParticipation()) {
- $question->estimateParticipation();
- $question->saveParticipation();
- }
- }
- }
- }
-
- /* Nustatomi ryšiai tarp registracijų į balsavimus ir pačių balsavimų */
- /* Establish links between registrations for voting and voting themselves */
- public function linkRegistrations() {
- foreach ($this->session->getChildren() as $sitting) {
- foreach ($sitting->getChildren() as $question) {
- foreach ($question->getChildren() as $action)
- $action->InitialiseLink();
- }
- }
- }
-
- /* Pagalbinė funkcija, grąžinanti SQL užklausas iš aplanko 'sqls/'
- /* Helper function: returns SQL commands from files in 'sqls/' folder */
- public function getSQL($script) {
- $file = BASE_DIR . 'sqls/' . $script . '.sql';
- if (file_exists($file)) {
- return file_get_contents($file);
- }
- else throw new Exception('SQL file is unavailable: ' . $file);
- }
-
- /* Pagalbinė funkcija, spausdinanti žinutę ir laiką nuo paskutinės žinutės */
- /* Helper function: prints message and elapsed execution time since last message */
- public function announce($message) {
- $c_time = microtime(true);
- echo $message . ' for session #' . $this->session->getId() .
- ' in ' . round(($c_time - $this->last_time), 3) . 's' .
- ' (total time: ' . round(($c_time - $this->start_time), 3) . 's) ';
- $this->last_time = $c_time;
- flush();
- }
-
- /* Seimo narių duomenų atnaujinimas - surenkamas aprašymas, vardas, nuotrauka. Išsiunčiamas pranešimas apie naują informaciją */
- /* Updates member info - scrapes description, get name & picture. Notifies via email if new info is added */
- public function updateMember(array $member) {
- $url = 'http://www3.lrs.lt/pls/inter/w5_show?p_r=6113&p_k=1&p_a=5&p_asm_id=' . $member['id'] .'&p_kade_id=6';
- if($html = @file_get_contents($url)) {
- //clean the HTML
- $html = ScrapingUtilities::cleanHTML($html);
- //parse the HTML
- $dom = new DOMDocument('1.0', 'UTF-8');
- @$dom->loadHTML($html);
- //get the name
- $name = $dom->getElementsByTagName('title')->item(0)->nodeValue;
- $name = str_replace('-', ' - ', $name);
- $member['name'] = trim(mb_convert_case($name, MB_CASE_TITLE));
- //get the image src & send email with details
- $div = $dom->getElementById('divDesContent');
- $images = $div->getElementsByTagName('img')->item(0);
- if (is_object($images)) {
- $member['image_src'] = $images->getAttribute('src');
- $this->sendPictureEmail($member);
- }
- //return the updated data
- return $member;
- }
- else {
- throw new Exception('Remote file fetching failed');
- }
- }
-
- /* Išsiunčiamas el. laiškas apie naują Seimo narį - naudojama Seime.lt svetainėje */
- /* Sends an email about new member added - for Seime.lt purposes */
- public function sendPictureEmail(array $member) {
- $subject = '[seime.lt] - naujas narys: '. $member['name'];
- $headers = 'MIME-Version: 1.0' . "\r\n";
- $headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";
- $text = ' Pridėtas naujas seimo narys
- Nuotraukos URL: %1$s
- Full dydžio nuotrauka (180x135): /images/people/full/%2$s.jpg
- Thumb (60x45): /images/people/thumbs/%2$s.jpg
- Mekeke!';
- $text = sprintf($text, $member['image_src'], $member['id']);
- mail(NOTIF_EMAIL, $subject, wordwrap($text), $headers);
- }
-
- /* Pagalbinis updateMember metodas */
- /* Wrapper for updateMember method */
- public function updateMembers(array $members) {
- foreach($members as &$member) {
- try {
- $member = $this->updateMember($member);
- }
- catch(Exception $e) {
- $this->announce("Updating data failed for $member: " . $e->__toString());
- }
- }
- return $members;
- }
-
- /* Atnaujinama Seimo narių, kurie pradėjo kadenciją vėliau arba ją baigė per anksti, informacija */
- /* Update details on members who entered late of left early */
- public function getTermDetails() {
- $list = array();
- if ($html = @file_get_contents('http://www3.lrs.lt/pls/inter/w5_show?p_r=6113&p_k=1')) {
- //clean the HTML
- $html = ScrapingUtilities::cleanHTML($html);
- //parse the HTML
- $dom = new DOMDocument('1.0', 'UTF-8');
- @$dom->loadHTML($html);
- $xpath = new DOMXPath($dom);
- $r = $xpath->query('//td[a[contains(@href,"p_asm_id")] and (contains(., "iki") or contains(., "nuo"))]');
- if ($r instanceof DOMNodeList) {
- foreach ($r as $node) {
- preg_match('#p_asm_id=(\d+)#', DOMInnerHTML($node), $matches);
- $id = $matches[1];
- $start = '0000-00-00';
- $end = '0000-00-00';
- if (preg_match('#nuo (\d{4} \d{2} \d{2})#', DOMInnerHTML($node), $matches)) {
- $start = str_replace(' ', '-', $matches[1]);
- }
- if (preg_match('#iki (\d{4} \d{2} \d{2})#', DOMInnerHTML($node), $matches)) {
- $end = str_replace(' ', '-', $matches[1]);
- }
- $list[] = array('id' => $id, 'cadency_start' => $start, 'cadency_end' => $end);
- }
- return $list;
- }
- else {
- $this->announce('UPDATING TERM DETAILS FAILED - HTML not recognized!');
- }
- }
- }
-
-}
-
diff --git a/classes/abstractions.php b/classes/abstractions.php
deleted file mode 100755
index 3bc7f9c..0000000
--- a/classes/abstractions.php
+++ /dev/null
@@ -1,279 +0,0 @@
- true,
- 'output-xhtml' => true,
- 'wrap' => 200);
- $tidy->parseString($html, $config, 'UTF8');
- $tidy->cleanRepair();
- $dom = new DOMDocument('1.0', 'UTF-8');
- @$dom->loadHTML((string) $tidy);
- return $dom;
- }
-
- final protected function clean($string) {
- return trim(str_replace(array(' ', 'Â'), '', htmlentities($string, ENT_NOQUOTES, 'UTF-8')));
- }
-
- final protected function decode($string) {
- $string = html_entity_decode($string, ENT_QUOTES, 'UTF-8');
- return preg_replace('/\s+/', ' ', $string);
- }
-
- final protected function getMemberId(DOMElement $dom) {
- $variables = array();
- $a = $dom->getElementsByTagName('a')->item(0);
- if (is_object($a)) {
- $variables = array();
- $query = parse_url($a->getAttribute('href'), PHP_URL_QUERY);
- parse_str($query, $variables);
- if (isset($variables['p_asm_id'])) {
- return $variables['p_asm_id'];
- } else {
- $member_id = str_replace('a', '', $a->getAttribute('name'));
- if (!empty($member_id)) {
- return $member_id;
- } else {
- log_f('parsing error: lankomumo lentele - person a asm_id . ', $this->getId());
- }
- }
- }
- else
- log_f('parsing error: lankomumo lentele - person a . ', $this->getId());
- }
-
-}
-
-abstract class HTMLObject extends Utilities implements Seimas {
-
- protected $parent = NULL;
- protected $Factory = NULL;
- protected $children = array();
- protected $id = '';
- protected $url = '';
- protected $PDO = 0;
-
- public function __construct($url, Seimas $parent = NULL, $params = NULL, Factory $Factory = NULL) {
- /* Determine if not created via PDO */
- if (empty($this->PDO)) {
- $this->url = $url;
- $query = parse_url($url, PHP_URL_QUERY);
- $class_name = get_class($this);
- $class = new ReflectionClass($class_name);
- $token = $class->getStaticPropertyValue('url_token');
- $this->id = str_replace($token, '', $query);
- }
- /* Add reference to parent */
- $this->parent = $parent;
- /* Add reference to Factory */
- $this->Factory = $Factory;
- }
-
- final public function initialise() {
- if (false === $this->getId()) {
- throw new Exception('no URL defined!');
- }
- elseif (false === $this->populateData()) {
- try {
- $this->scrapeData();
- $this->saveData();
- }
- catch (Exception $e) {
- ' Unexpected conditions met! ' . $e->getMessage();
- }
- }
- }
-
- public function populateChildren($initialiseSearch = false) {
- $class = get_class($this);
- $class_ = new ReflectionClass($class);
- $child_class = $class_->getStaticPropertyValue('child_class');
- $this->children = $this->Factory->getObjectChildren($class, $child_class, $this->getId(), $this);
- if (empty($this->children) && ($initialiseSearch)) {
- $this->scrapeData();
- $this->saveData();
- }
- }
-
- public function initialiseChildren($recursive = false) {
- foreach ($this->children as $child) {
- if ($child instanceof Seimas) {
- $child->initialise();
- if ($recursive) {
- $child->initialiseChildren(true);
- }
- }
- else
- throw new Exception('child does not implement Seimas Interface');
- }
- }
-
- final protected function getParentInfo($function, $parameters = array()) {
- if (NULL === $this->parent) {
- throw new Exception('no parent available');
- } else {
- return call_user_func_array(array($this->parent, $function), $parameters);
- }
- }
-
- final protected function getSiblingInfoById($sibling_id, $function, $parameters = array()) {
- if (NULL === $this->parent) {
- throw new Exception('no parent available');
- } else {
- $sibling = $this->parent->getChild($sibling_id);
- if (false === $sibling) {
- throw new Exception('no sibling with such ID available');
- } else {
- return call_user_func_array(array($sibling, $function), $parameters);
- }
- }
- }
-
- final protected function getSiblingInfoByPosition($current_id, $sibling_position, $function, $parameters = array()) {
- if (NULL === $this->parent) {
- throw new Exception('no parent available');
- } else {
- $sibling = $this->parent->getChildByPosition($current_id, $sibling_position);
- if (false === $sibling) {
- throw new Exception('no sibling with such ID available');
- } else {
- return call_user_func_array(array($sibling, $function), $parameters);
- }
- }
- }
-
- final protected function getChild($child_id) {
- if (isset($this->children[$child_id]))
- return $this->children[$child_id];
- else
- return false;
- }
-
- final protected function getChildByPosition($child_id, $relative_sibling_position) {
- $children = array_keys($this->children);
- $child_position = array_search($child_id, $children);
- if (false === $child_position) {
- return false;
- } else {
- $sibling_position = $child_position + $relative_sibling_position;
- if (!isset($children[$sibling_position]))
- return false;
- else {
- $sibling_id = $children[$sibling_position];
- return $this->getChild($sibling_id);
- }
- }
- }
-
- final public function getChildren() {
- return $this->children;
- }
-
- public function getId() {
- return $this->id;
- }
-
- public function getUrl() {
- return $this->url;
- }
-
- public function show() {
- $a = false;
- if ($a = $this->__toString()) {
- echo "Class " . get_class($this) . ' ';
- print_f($a);
- }
- else
- print_f($this);
- }
-
- public function __toString() {
- $array = get_object_vars($this);
- unset($array['PDO']);
- unset($array['Factory']);
- unset($array['parent']);
- unset($array['url_token']);
- unset($array['additional_data']);
- if (is_array($array['children']))
- $array['children'] = $this->cleanChildren($array['children']);
- return $array;
- }
-
- protected function cleanChildren($children) {
- $array = array();
- foreach ($children as $id => $child) {
- if ($child instanceof Seimas) {
- $child->class_name = '' . get_class($child) . ' Object ';
- $array[$id] = $child->__toString();
- }
- }
- return $array;
- }
-
- abstract protected function populateData();
-
- abstract protected function saveData();
-
- abstract protected function scrapeData($reload = FALSE);
-}
-
-Interface Seimas {
-
- public function initialise();
-}
-
-?>
diff --git a/classes/utilities.php b/classes/utilities.php
deleted file mode 100755
index d7468a3..0000000
--- a/classes/utilities.php
+++ /dev/null
@@ -1,55 +0,0 @@
-childNodes;
- foreach ($children as $child)
- {
- $tmp_dom = new DOMDocument();
- $tmp_dom->appendChild($tmp_dom->importNode($child, true));
- $innerHTML.=trim($tmp_dom->saveHTML());
- }
- return $innerHTML;
- }
-
- function print_f($array) {
- echo '';
-
- if ($array instanceof DOMNodeList) {
- print_r($array->length);
- foreach ($array as $node) {
- echo $node->nodeValue;
- }
- }
- elseif ($array instanceof DOMNode) {
- echo $array->nodeValue;
- }
- else print_r($array);
- echo ' ';
- }
-
- function log_f($message, $object_id) {
- echo ' ' . $message . ' ';
- }
-
- class ScrapingUtilities {
- public static function cleanHTML($html) {
- $html = @iconv('windows-1257', 'UTF-8//IGNORE', $html);
- $html = str_replace('charset=windows-1257"', 'charset=UTF-8"', $html);
- $tidy = new tidy();
- $config = array('indent' => true, 'output-xhtml' => true, 'wrap' => 200);
- $tidy->parseString($html, $config, 'UTF8');
- $tidy->cleanRepair();
- return (string) $tidy;
- }
- }
-
- function __ending($number, $endings = array('narių', 'narys', 'nariai')) {
- $count = $number % 100;
- if (($count > 9) && ($count < 20)) return $endings[0];
- elseif ($count % 10 == 0) return $endings[0];
- elseif ($count % 10 == 1) return $endings[1];
- else return $endings[2];
- }
-
diff --git a/code-docs/code-summary-ENG.md b/code-docs/code-summary-ENG.md
deleted file mode 100755
index c68aa13..0000000
--- a/code-docs/code-summary-ENG.md
+++ /dev/null
@@ -1,54 +0,0 @@
-Seime.lt code is licenced under Creative Commons BY-NC-SA 3.0 licence:
-http://creativecommons.org/licenses/by-nc-sa/3.0/
-
-## DOCUMENTATION OF SEIME.LT CODE a.k.a BEWARE THERE BE DRAGONS ##
-
-Unfortunately, a full documentation of the code is not yet ready (and, to be honest,
-chances are it will not be for a long time). Thus, the navigation through the
-code will be mostly up to the reader. Nevertheless, we have a brief summary of what
-you can expect. You are always welcome to shoot us an email to info@seime.lt and
-we'll do our best to help you out!
-
-### STRUCTURE OF CODE ###
-
-- The core of the code is in the folder `classes/`. We note that it's the first
-project where we practically tried to apply OOP concepts, so you'll find a lot of
-high-coupling and low-cohesion examples. In any way, the following principles will
-largely hold:
-
- - Factory class is responsible for manipulating objects' data in the dabatse, creating objects from DB as well as traversing the main object tree.
- - Each of the Seimas work objects (session, sitting, question, action) has its own class.
- - Each of the Seimas work objects is a child of the HTMLObject class (abstractions.php), which contains common methods as well defines the overall structure of the way the objects are constructed.
- - utilities.php file contains various helper functions.
-
-- Folder `extensions/` contains classes that add extra functionality to the core object
-classes. That is, classes in the `classes/` folder use only the oficial data from the
-Lithuanian Seimas website, whereas `extensions/` classes add additional calculations
-(such as participation data estimation on sub-question level). You can define which
-classes are used in the tree on runtime, by passing parameters to Factory class.
-
-- Folder `cache/` contains all the HTML files downloaded from http://lrs.lt.
-The caching mechanism is implemented in the Utilities class (classes/abstractions.php).
-
-- Folder `sqls/` contains SQL queries, which are used to populate some of the
-SQL tables with additional data. They are used solely by `classes/Updater.php` class.
-
-### RUNNING THE CODE ###
-
-If you want to jump right away, all you need to do is create a session object
-(you can, actually, start at sitting / question level, too) and initialise it:
-```php
-getObject('session', SESSION_URL);
- //SESSION_URL looks like this: http://www3.lrs.lt/pls/inter/w5_sale.ses_pos?p_ses_id=91
- $s->scrapeData(true); // TRUE = force to redownload data
- $this->session->initialise(); //Initialise the session object (populate the fields from HTML)
- $this->session->initialiseChildren(true); //Recursively populate all children
- $s->saveData();
-?>
-```
-However, this will only collect and save to DB the main data. The additional calculations
-will not be present.
-
-For a full information collection / update example, see the file `update-ENG.php` &
-the Updater class located at `classes/Updater.php`.
diff --git a/code-docs/code-summary-LT.md b/code-docs/code-summary-LT.md
deleted file mode 100755
index 192a980..0000000
--- a/code-docs/code-summary-LT.md
+++ /dev/null
@@ -1,53 +0,0 @@
-Seime.lt kodas pateikiamas su Creative Commons BY-NC-SA 3.0 licencija:
-http://creativecommons.org/licenses/by-nc-sa/3.0/
-
-## SEIME.LT KODO DOKUMENTACIJA a.k.a BEWARE THERE BE DRAGONS ##
-
-Pilnos Seime.lt dokumentacijos vis dar neprisiruošėme parengti. Tad naršyti po
-kodą kol kas teks pusiau užrištomis akimis. Bet kokiu atveju, žemiau pateikiame
-trumpą kodo struktūros santrauką ir kodo pavyzdžių. Sėkmės, o jei iškiltų
-neišsprendžiamų klausimų - visada gali parašyti į info@seime.lt!
-
-### KODO STRUKTŪRA ###
-
-- Pagrindinis kodas laikomas aplanke `classes/`. Tai buvo pirmasis projektas,
-kuriame Seime.lt komanda realiai išbandė OOP, tad jame pilna high-coupling ir
-low-cohesion pavyzdžių. Pagrindiniai principai tokie:
-
- - `Factory` klasė atsakinga už objektų saugojimą / sukūrimą iš DB ir keliavimą objektų medžiu (sibling / parent / etc metodai).
- - Kiekvienas Seimo darbo objektas (sesija, posėdis ir t.t.) turi savo klasę.
- - Bendri Seimo darbo objektų metodai, veikimo struktūros griaučiai apibrėžti klasėje `HTMLObject (abstractions.php)`
- - `utilities.php` faile saugomos pagalbinės klasės ir funkcijos.
-
-- Aplanke `extensions/` laikomos klasės, kurios prideda papildomo funkcionalumo
-prie Seimo darbo klasių. T.y., `classes/` aplanke esančios klasės naudoja tik
-"oficialius" Seimo svetainėje pateikiamus duomenis. `Extensions` aplanke esančios
-klasės prideda papildomus skaičiavimus (kaip, pvz., sub-klausimų lygio dalyvavimo
-statistiką). Tai, kurios klasės naudojamos, nustatoma perduodant Factory klasei
-klasių pavadinimus, kaip antrą parametrą.
-
-- Aplanke `cache/` saugomi visi parsiųsti http://lrs.lt HTML dokumentai. Saugojimo
-mechanizmas įgyvendintas Utilities klasėje, `classes/abstractions.php` dokumente.
-
-- Aplanke `sqls/` saugomos SQL užklausos, kurių pagalba sugeneruojamos kai kurios
-SQL lentelės (papildomi duomenys). Jas naudoja `classes/Updater.php` klasė.
-
-### DARBAS SU KODU ###
-
-Praktiškai, norint susirinkti duomenis reikia susikurti sesijos objektą
-ir jį (bei sub-objektus) inicijuoti:
-```php
-getObject('session', SESIJOS_URL);
- //SESIJOS_URL pavyzdys: http://www3.lrs.lt/pls/inter/w5_sale.ses_pos?p_ses_id=91
- $s->scrapeData(true); // TRUE = iš naujo parsisiųsti HTML failą, net jei yra cache versija
- $this->session->initialise(); //Inicijuojamas sesijos objektas (užpildomi laukai pagal HTML informaciją)
- $this->session->initialiseChildren(true); //Rekursiškai inicijuojami visi sub-objektai.
- $s->saveData();
-?>
-```
-Tiesa, taip nebus užpildytos visos SQL lentelės, trūks kai kurios kitos informacijos.
-
-Pilnas informacijos surinkimo / atnaujinimo pavyzdys pateikiamas `update.php`
-Jis naudoja `Updater` klasę, esančią `classes/Updater.php`, kuri sukurta būtent duomenų
-surinkimui ar jų atnaujinimui.
diff --git a/composer.json b/composer.json
new file mode 100644
index 0000000..de43f00
--- /dev/null
+++ b/composer.json
@@ -0,0 +1,40 @@
+{
+ "name": "laravel/laravel",
+ "description": "The Laravel Framework.",
+ "keywords": ["framework", "laravel"],
+ "license": "MIT",
+ "require": {
+ "laravel/framework": "4.2.*",
+ "guzzlehttp/guzzle": "4.*",
+ "xethron/migrations-generator": "dev-master",
+ "barryvdh/laravel-debugbar": "1.x"
+ },
+ "autoload": {
+ "classmap": [
+ "app/commands",
+ "app/controllers",
+ "app/models",
+ "app/database/migrations",
+ "app/database/seeds",
+ "app/tests/TestCase.php"
+ ]
+ },
+ "scripts": {
+ "post-install-cmd": [
+ "php artisan clear-compiled",
+ "php artisan optimize"
+ ],
+ "post-update-cmd": [
+ "php artisan clear-compiled",
+ "php artisan optimize",
+ "php artisan debugbar:publish"
+ ],
+ "post-create-project-cmd": [
+ "php artisan key:generate"
+ ]
+ },
+ "config": {
+ "preferred-install": "dist"
+ },
+ "minimum-stability": "stable"
+}
diff --git a/composer.lock b/composer.lock
new file mode 100644
index 0000000..247b99a
--- /dev/null
+++ b/composer.lock
@@ -0,0 +1,2432 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+ "This file is @generated automatically"
+ ],
+ "hash": "439bd4c9b872a2915b577e7727414fbc",
+ "packages": [
+ {
+ "name": "barryvdh/laravel-debugbar",
+ "version": "v1.6.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/barryvdh/laravel-debugbar.git",
+ "reference": "ccf9ababfb2b5ddbf8c3ece2ca3fc9989b11ec0d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/ccf9ababfb2b5ddbf8c3ece2ca3fc9989b11ec0d",
+ "reference": "ccf9ababfb2b5ddbf8c3ece2ca3fc9989b11ec0d",
+ "shasum": ""
+ },
+ "require": {
+ "laravel/framework": "~4.0",
+ "maximebf/debugbar": "~1.9",
+ "php": ">=5.3.0",
+ "symfony/finder": "~2.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.6-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Barryvdh\\Debugbar": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Barry vd. Heuvel",
+ "email": "barryvdh@gmail.com"
+ }
+ ],
+ "description": "PHP Debugbar integration for Laravel",
+ "keywords": [
+ "debug",
+ "debugbar",
+ "laravel",
+ "profiler",
+ "webprofiler"
+ ],
+ "time": "2014-08-09 20:41:59"
+ },
+ {
+ "name": "classpreloader/classpreloader",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/mtdowling/ClassPreloader.git",
+ "reference": "2c9f3bcbab329570c57339895bd11b5dd3b00877"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/mtdowling/ClassPreloader/zipball/2c9f3bcbab329570c57339895bd11b5dd3b00877",
+ "reference": "2c9f3bcbab329570c57339895bd11b5dd3b00877",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "~0.9",
+ "php": ">=5.3.3",
+ "symfony/console": "~2.1",
+ "symfony/filesystem": "~2.1",
+ "symfony/finder": "~2.1"
+ },
+ "bin": [
+ "classpreloader.php"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "ClassPreloader": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Helps class loading performance by generating a single PHP file containing all of the autoloaded files for a specific use case",
+ "keywords": [
+ "autoload",
+ "class",
+ "preload"
+ ],
+ "time": "2014-03-12 00:05:31"
+ },
+ {
+ "name": "d11wtq/boris",
+ "version": "v1.0.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/d11wtq/boris.git",
+ "reference": "125dd4e5752639af7678a22ea597115646d89c6e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/d11wtq/boris/zipball/125dd4e5752639af7678a22ea597115646d89c6e",
+ "reference": "125dd4e5752639af7678a22ea597115646d89c6e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "suggest": {
+ "ext-pcntl": "*",
+ "ext-posix": "*",
+ "ext-readline": "*"
+ },
+ "bin": [
+ "bin/boris"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "Boris": "lib"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "time": "2014-01-17 12:21:18"
+ },
+ {
+ "name": "doctrine/annotations",
+ "version": "v1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/annotations.git",
+ "reference": "d9b1a37e9351ddde1f19f09a02e3d6ee92e82efd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/annotations/zipball/d9b1a37e9351ddde1f19f09a02e3d6ee92e82efd",
+ "reference": "d9b1a37e9351ddde1f19f09a02e3d6ee92e82efd",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/lexer": "1.*",
+ "php": ">=5.3.2"
+ },
+ "require-dev": {
+ "doctrine/cache": "1.*",
+ "phpunit/phpunit": "4.*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Doctrine\\Common\\Annotations\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com",
+ "homepage": "http://www.jwage.com/",
+ "role": "Creator"
+ },
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com",
+ "homepage": "http://www.instaclick.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com",
+ "homepage": "https://github.com/schmittjoh",
+ "role": "Developer of wrapped JMSSerializerBundle"
+ }
+ ],
+ "description": "Docblock Annotations Parser",
+ "homepage": "http://www.doctrine-project.org",
+ "keywords": [
+ "annotations",
+ "docblock",
+ "parser"
+ ],
+ "time": "2014-07-06 15:52:21"
+ },
+ {
+ "name": "doctrine/cache",
+ "version": "v1.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/cache.git",
+ "reference": "e16d7adf45664a50fa86f515b6d5e7f670130449"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/cache/zipball/e16d7adf45664a50fa86f515b6d5e7f670130449",
+ "reference": "e16d7adf45664a50fa86f515b6d5e7f670130449",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "conflict": {
+ "doctrine/common": ">2.2,<2.4"
+ },
+ "require-dev": {
+ "phpunit/phpunit": ">=3.7",
+ "satooshi/php-coveralls": "~0.6"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Doctrine\\Common\\Cache\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com",
+ "homepage": "http://www.jwage.com/",
+ "role": "Creator"
+ },
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com",
+ "homepage": "http://www.instaclick.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com",
+ "homepage": "https://github.com/schmittjoh",
+ "role": "Developer of wrapped JMSSerializerBundle"
+ }
+ ],
+ "description": "Caching library offering an object-oriented API for many cache backends",
+ "homepage": "http://www.doctrine-project.org",
+ "keywords": [
+ "cache",
+ "caching"
+ ],
+ "time": "2013-10-25 19:04:14"
+ },
+ {
+ "name": "doctrine/collections",
+ "version": "v1.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/collections.git",
+ "reference": "b99c5c46c87126201899afe88ec490a25eedd6a2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/collections/zipball/b99c5c46c87126201899afe88ec490a25eedd6a2",
+ "reference": "b99c5c46c87126201899afe88ec490a25eedd6a2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Doctrine\\Common\\Collections\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com",
+ "homepage": "http://www.jwage.com/",
+ "role": "Creator"
+ },
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com",
+ "homepage": "http://www.instaclick.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com",
+ "homepage": "https://github.com/schmittjoh",
+ "role": "Developer of wrapped JMSSerializerBundle"
+ }
+ ],
+ "description": "Collections Abstraction library",
+ "homepage": "http://www.doctrine-project.org",
+ "keywords": [
+ "array",
+ "collections",
+ "iterator"
+ ],
+ "time": "2014-02-03 23:07:43"
+ },
+ {
+ "name": "doctrine/common",
+ "version": "v2.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/common.git",
+ "reference": "5db6ab40e4c531f14dad4ca96a394dfce5d4255b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/common/zipball/5db6ab40e4c531f14dad4ca96a394dfce5d4255b",
+ "reference": "5db6ab40e4c531f14dad4ca96a394dfce5d4255b",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/annotations": "1.*",
+ "doctrine/cache": "1.*",
+ "doctrine/collections": "1.*",
+ "doctrine/inflector": "1.*",
+ "doctrine/lexer": "1.*",
+ "php": ">=5.3.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~3.7"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.4.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Doctrine\\Common\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com",
+ "homepage": "http://www.jwage.com/",
+ "role": "Creator"
+ },
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com",
+ "homepage": "http://www.instaclick.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com",
+ "homepage": "https://github.com/schmittjoh",
+ "role": "Developer of wrapped JMSSerializerBundle"
+ }
+ ],
+ "description": "Common Library for Doctrine projects",
+ "homepage": "http://www.doctrine-project.org",
+ "keywords": [
+ "annotations",
+ "collections",
+ "eventmanager",
+ "persistence",
+ "spl"
+ ],
+ "time": "2014-05-21 19:28:51"
+ },
+ {
+ "name": "doctrine/dbal",
+ "version": "v2.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/dbal.git",
+ "reference": "fec965d330c958e175c39e61c3f6751955af32d0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/dbal/zipball/fec965d330c958e175c39e61c3f6751955af32d0",
+ "reference": "fec965d330c958e175c39e61c3f6751955af32d0",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/common": "~2.4",
+ "php": ">=5.3.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "3.7.*",
+ "symfony/console": "~2.0"
+ },
+ "suggest": {
+ "symfony/console": "Allows use of the command line interface"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "Doctrine\\DBAL\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com",
+ "homepage": "http://www.jwage.com/",
+ "role": "Creator"
+ },
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com",
+ "homepage": "http://www.instaclick.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ }
+ ],
+ "description": "Database Abstraction Layer",
+ "homepage": "http://www.doctrine-project.org",
+ "keywords": [
+ "database",
+ "dbal",
+ "persistence",
+ "queryobject"
+ ],
+ "time": "2014-01-01 16:43:57"
+ },
+ {
+ "name": "doctrine/inflector",
+ "version": "v1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/inflector.git",
+ "reference": "54b8333d2a5682afdc690060c1cf384ba9f47f08"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/inflector/zipball/54b8333d2a5682afdc690060c1cf384ba9f47f08",
+ "reference": "54b8333d2a5682afdc690060c1cf384ba9f47f08",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "Doctrine\\Common\\Inflector\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com",
+ "homepage": "http://www.jwage.com/",
+ "role": "Creator"
+ },
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com",
+ "homepage": "http://www.instaclick.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com",
+ "homepage": "https://github.com/schmittjoh",
+ "role": "Developer of wrapped JMSSerializerBundle"
+ }
+ ],
+ "description": "Common String Manipulations with regard to casing and singular/plural rules.",
+ "homepage": "http://www.doctrine-project.org",
+ "keywords": [
+ "inflection",
+ "pluarlize",
+ "singuarlize",
+ "string"
+ ],
+ "time": "2013-01-10 21:49:15"
+ },
+ {
+ "name": "doctrine/lexer",
+ "version": "v1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/lexer.git",
+ "reference": "2f708a85bb3aab5d99dab8be435abd73e0b18acb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/lexer/zipball/2f708a85bb3aab5d99dab8be435abd73e0b18acb",
+ "reference": "2f708a85bb3aab5d99dab8be435abd73e0b18acb",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "Doctrine\\Common\\Lexer\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com",
+ "homepage": "http://www.instaclick.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com",
+ "homepage": "https://github.com/schmittjoh",
+ "role": "Developer of wrapped JMSSerializerBundle"
+ }
+ ],
+ "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.",
+ "homepage": "http://www.doctrine-project.org",
+ "keywords": [
+ "lexer",
+ "parser"
+ ],
+ "time": "2013-01-12 18:59:04"
+ },
+ {
+ "name": "filp/whoops",
+ "version": "1.1.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/filp/whoops.git",
+ "reference": "9f451fbc7b8cad5e71300672c340c28c6bec09ff"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/filp/whoops/zipball/9f451fbc7b8cad5e71300672c340c28c6bec09ff",
+ "reference": "9f451fbc7b8cad5e71300672c340c28c6bec09ff",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "0.9.*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Whoops": "src/"
+ },
+ "classmap": [
+ "src/deprecated"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Filipe Dobreira",
+ "homepage": "https://github.com/filp",
+ "role": "Developer"
+ }
+ ],
+ "description": "php error handling for cool kids",
+ "homepage": "https://github.com/filp/whoops",
+ "keywords": [
+ "error",
+ "exception",
+ "handling",
+ "library",
+ "silex-provider",
+ "whoops",
+ "zf2"
+ ],
+ "time": "2014-07-11 05:56:54"
+ },
+ {
+ "name": "guzzlehttp/guzzle",
+ "version": "4.1.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/guzzle.git",
+ "reference": "448f2c2076cf0fb756230611491c4f7ecb735a29"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/448f2c2076cf0fb756230611491c4f7ecb735a29",
+ "reference": "448f2c2076cf0fb756230611491c4f7ecb735a29",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "guzzlehttp/streams": "~1.4",
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "ext-curl": "*",
+ "phpunit/phpunit": "~4.0",
+ "psr/log": "~1.0"
+ },
+ "suggest": {
+ "ext-curl": "Guzzle will use specific adapters if cURL is present"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\": "src/"
+ },
+ "files": [
+ "src/functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "description": "Guzzle is a PHP HTTP client library and framework for building RESTful web service clients",
+ "homepage": "http://guzzlephp.org/",
+ "keywords": [
+ "client",
+ "curl",
+ "framework",
+ "http",
+ "http client",
+ "rest",
+ "web service"
+ ],
+ "time": "2014-08-08 01:30:43"
+ },
+ {
+ "name": "guzzlehttp/streams",
+ "version": "1.5.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/streams.git",
+ "reference": "fb0d1ee29987c2bdc59867bffaade6fc88c2675f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/streams/zipball/fb0d1ee29987c2bdc59867bffaade6fc88c2675f",
+ "reference": "fb0d1ee29987c2bdc59867bffaade6fc88c2675f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Stream\\": "src/"
+ },
+ "files": [
+ "src/functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "description": "Provides a simple abstraction over streams of data (Guzzle 4+)",
+ "homepage": "http://guzzlephp.org/",
+ "keywords": [
+ "Guzzle",
+ "stream"
+ ],
+ "time": "2014-08-10 23:57:01"
+ },
+ {
+ "name": "ircmaxell/password-compat",
+ "version": "1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ircmaxell/password_compat.git",
+ "reference": "1fc1521b5e9794ea77e4eca30717be9635f1d4f4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ircmaxell/password_compat/zipball/1fc1521b5e9794ea77e4eca30717be9635f1d4f4",
+ "reference": "1fc1521b5e9794ea77e4eca30717be9635f1d4f4",
+ "shasum": ""
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "lib/password.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Anthony Ferrara",
+ "email": "ircmaxell@ircmaxell.com",
+ "homepage": "http://blog.ircmaxell.com"
+ }
+ ],
+ "description": "A compatibility library for the proposed simplified password hashing algorithm: https://wiki.php.net/rfc/password_hash",
+ "homepage": "https://github.com/ircmaxell/password_compat",
+ "keywords": [
+ "hashing",
+ "password"
+ ],
+ "time": "2013-04-30 19:58:08"
+ },
+ {
+ "name": "jeremeamia/SuperClosure",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/jeremeamia/super_closure.git",
+ "reference": "d05400085f7d4ae6f20ba30d36550836c0d061e8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/jeremeamia/super_closure/zipball/d05400085f7d4ae6f20ba30d36550836c0d061e8",
+ "reference": "d05400085f7d4ae6f20ba30d36550836c0d061e8",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "~0.9",
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~3.7"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "Jeremeamia\\SuperClosure": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jeremy Lindblom"
+ }
+ ],
+ "description": "Doing interesting things with closures like serialization.",
+ "homepage": "https://github.com/jeremeamia/super_closure",
+ "keywords": [
+ "closure",
+ "function",
+ "parser",
+ "serializable",
+ "serialize",
+ "tokenizer"
+ ],
+ "time": "2013-10-09 04:20:00"
+ },
+ {
+ "name": "laravel/framework",
+ "version": "v4.2.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/framework.git",
+ "reference": "e60ea917ab862254a6db37fa9cb8933138c1e73c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/framework/zipball/e60ea917ab862254a6db37fa9cb8933138c1e73c",
+ "reference": "e60ea917ab862254a6db37fa9cb8933138c1e73c",
+ "shasum": ""
+ },
+ "require": {
+ "classpreloader/classpreloader": "~1.0",
+ "d11wtq/boris": "~1.0",
+ "filp/whoops": "1.1.*",
+ "ircmaxell/password-compat": "~1.0",
+ "jeremeamia/superclosure": "~1.0",
+ "monolog/monolog": "~1.6",
+ "nesbot/carbon": "~1.0",
+ "patchwork/utf8": "1.1.*",
+ "php": ">=5.4.0",
+ "phpseclib/phpseclib": "0.3.*",
+ "predis/predis": "0.8.*",
+ "stack/builder": "~1.0",
+ "swiftmailer/swiftmailer": "~5.1",
+ "symfony/browser-kit": "2.5.*",
+ "symfony/console": "2.5.*",
+ "symfony/css-selector": "2.5.*",
+ "symfony/debug": "2.5.*",
+ "symfony/dom-crawler": "2.5.*",
+ "symfony/finder": "2.5.*",
+ "symfony/http-foundation": "2.5.*",
+ "symfony/http-kernel": "2.5.*",
+ "symfony/process": "2.5.*",
+ "symfony/routing": "2.5.*",
+ "symfony/security-core": "2.5.*",
+ "symfony/translation": "2.5.*"
+ },
+ "replace": {
+ "illuminate/auth": "self.version",
+ "illuminate/cache": "self.version",
+ "illuminate/config": "self.version",
+ "illuminate/console": "self.version",
+ "illuminate/container": "self.version",
+ "illuminate/cookie": "self.version",
+ "illuminate/database": "self.version",
+ "illuminate/encryption": "self.version",
+ "illuminate/events": "self.version",
+ "illuminate/exception": "self.version",
+ "illuminate/filesystem": "self.version",
+ "illuminate/foundation": "self.version",
+ "illuminate/hashing": "self.version",
+ "illuminate/html": "self.version",
+ "illuminate/http": "self.version",
+ "illuminate/log": "self.version",
+ "illuminate/mail": "self.version",
+ "illuminate/pagination": "self.version",
+ "illuminate/queue": "self.version",
+ "illuminate/redis": "self.version",
+ "illuminate/remote": "self.version",
+ "illuminate/routing": "self.version",
+ "illuminate/session": "self.version",
+ "illuminate/support": "self.version",
+ "illuminate/translation": "self.version",
+ "illuminate/validation": "self.version",
+ "illuminate/view": "self.version",
+ "illuminate/workbench": "self.version"
+ },
+ "require-dev": {
+ "aws/aws-sdk-php": "~2.6",
+ "iron-io/iron_mq": "~1.5",
+ "mockery/mockery": "~0.9",
+ "pda/pheanstalk": "~2.1",
+ "phpunit/phpunit": "~4.0"
+ },
+ "suggest": {
+ "doctrine/dbal": "Allow renaming columns and dropping SQLite columns."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/Illuminate/Queue/IlluminateQueueClosure.php"
+ ],
+ "files": [
+ "src/Illuminate/Support/helpers.php"
+ ],
+ "psr-0": {
+ "Illuminate": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylorotwell@gmail.com"
+ }
+ ],
+ "description": "The Laravel Framework.",
+ "keywords": [
+ "framework",
+ "laravel"
+ ],
+ "time": "2014-08-05 19:52:17"
+ },
+ {
+ "name": "maximebf/debugbar",
+ "version": "1.9.14",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/maximebf/php-debugbar.git",
+ "reference": "ab02c692d2bdad1009639f6ba319576af590620c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/ab02c692d2bdad1009639f6ba319576af590620c",
+ "reference": "ab02c692d2bdad1009639f6ba319576af590620c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0",
+ "psr/log": "~1.0"
+ },
+ "require-dev": {
+ "php": ">=5.3.0"
+ },
+ "suggest": {
+ "kriswallsmith/assetic": "The best way to manage assets",
+ "monolog/monolog": "Log using Monolog",
+ "predis/predis": "Redis storage"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "DebugBar": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Maxime Bouroumeau-Fuseau",
+ "email": "maxime.bouroumeau@gmail.com",
+ "homepage": "http://maximebf.com"
+ }
+ ],
+ "description": "Debug bar in the browser for php application",
+ "homepage": "https://github.com/maximebf/php-debugbar",
+ "keywords": [
+ "debug"
+ ],
+ "time": "2014-04-25 16:30:40"
+ },
+ {
+ "name": "monolog/monolog",
+ "version": "1.10.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Seldaek/monolog.git",
+ "reference": "25b16e801979098cb2f120e697bfce454b18bf23"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Seldaek/monolog/zipball/25b16e801979098cb2f120e697bfce454b18bf23",
+ "reference": "25b16e801979098cb2f120e697bfce454b18bf23",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0",
+ "psr/log": "~1.0"
+ },
+ "require-dev": {
+ "aws/aws-sdk-php": "~2.4, >2.4.8",
+ "doctrine/couchdb": "~1.0@dev",
+ "graylog2/gelf-php": "~1.0",
+ "phpunit/phpunit": "~3.7.0",
+ "raven/raven": "~0.5",
+ "ruflin/elastica": "0.90.*"
+ },
+ "suggest": {
+ "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
+ "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
+ "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
+ "ext-mongo": "Allow sending log messages to a MongoDB server",
+ "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
+ "raven/raven": "Allow sending log messages to a Sentry server",
+ "rollbar/rollbar": "Allow sending log messages to Rollbar",
+ "ruflin/elastica": "Allow sending log messages to an Elastic Search server"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.10.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Monolog\\": "src/Monolog"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be",
+ "role": "Developer"
+ }
+ ],
+ "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
+ "homepage": "http://github.com/Seldaek/monolog",
+ "keywords": [
+ "log",
+ "logging",
+ "psr-3"
+ ],
+ "time": "2014-06-04 16:30:04"
+ },
+ {
+ "name": "nesbot/carbon",
+ "version": "1.10.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/briannesbitt/Carbon.git",
+ "reference": "9b42a1aec56011c2ac4d75c0ddad0794762344fc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/9b42a1aec56011c2ac4d75c0ddad0794762344fc",
+ "reference": "9b42a1aec56011c2ac4d75c0ddad0794762344fc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "Carbon": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Brian Nesbitt",
+ "email": "brian@nesbot.com",
+ "homepage": "http://nesbot.com"
+ }
+ ],
+ "description": "A simple API extension for DateTime.",
+ "homepage": "https://github.com/briannesbitt/Carbon",
+ "keywords": [
+ "date",
+ "datetime",
+ "time"
+ ],
+ "time": "2014-07-18 03:44:47"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v0.9.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "ef70767475434bdb3615b43c327e2cae17ef12eb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/ef70767475434bdb3615b43c327e2cae17ef12eb",
+ "reference": "ef70767475434bdb3615b43c327e2cae17ef12eb",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=5.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.9-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "PHPParser": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
+ ],
+ "time": "2014-07-23 18:24:17"
+ },
+ {
+ "name": "patchwork/utf8",
+ "version": "v1.1.25",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nicolas-grekas/Patchwork-UTF8.git",
+ "reference": "2d43bd047b120279511d45e76e61c5a9812d9a83"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nicolas-grekas/Patchwork-UTF8/zipball/2d43bd047b120279511d45e76e61c5a9812d9a83",
+ "reference": "2d43bd047b120279511d45e76e61c5a9812d9a83",
+ "shasum": ""
+ },
+ "require": {
+ "lib-pcre": ">=7.3",
+ "php": ">=5.3.0"
+ },
+ "suggest": {
+ "ext-iconv": "Use iconv for best performance",
+ "ext-intl": "Use Intl for best performance",
+ "ext-mbstring": "Use Mbstring for best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Patchwork": "class/",
+ "Normalizer": "class/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "(Apache-2.0 or GPL-2.0)"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "Extensive, portable and performant handling of UTF-8 and grapheme clusters for PHP",
+ "homepage": "https://github.com/nicolas-grekas/Patchwork-UTF8",
+ "keywords": [
+ "i18n",
+ "unicode",
+ "utf-8",
+ "utf8"
+ ],
+ "time": "2014-08-05 08:00:32"
+ },
+ {
+ "name": "phpseclib/phpseclib",
+ "version": "0.3.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpseclib/phpseclib.git",
+ "reference": "8b8c62f278e363b75ddcacaf5803710232fbd3e4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/8b8c62f278e363b75ddcacaf5803710232fbd3e4",
+ "reference": "8b8c62f278e363b75ddcacaf5803710232fbd3e4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.0.0"
+ },
+ "require-dev": {
+ "phing/phing": "2.7.*",
+ "phpunit/phpunit": "4.0.*",
+ "squizlabs/php_codesniffer": "1.*"
+ },
+ "suggest": {
+ "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.",
+ "ext-mcrypt": "Install the Mcrypt extension in order to speed up a wide variety of cryptographic operations.",
+ "pear-pear/PHP_Compat": "Install PHP_Compat to get phpseclib working on PHP < 4.3.3."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Crypt": "phpseclib/",
+ "File": "phpseclib/",
+ "Math": "phpseclib/",
+ "Net": "phpseclib/",
+ "System": "phpseclib/"
+ },
+ "files": [
+ "phpseclib/Crypt/Random.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "include-path": [
+ "phpseclib/"
+ ],
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jim Wigginton",
+ "email": "terrafrost@php.net",
+ "role": "Lead Developer"
+ },
+ {
+ "name": "Patrick Monnerat",
+ "email": "pm@datasphere.ch",
+ "role": "Developer"
+ },
+ {
+ "name": "Andreas Fischer",
+ "email": "bantu@phpbb.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Hans-Jürgen Petrich",
+ "email": "petrich@tronic-media.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.",
+ "homepage": "http://phpseclib.sourceforge.net",
+ "keywords": [
+ "BigInteger",
+ "aes",
+ "asn.1",
+ "asn1",
+ "blowfish",
+ "crypto",
+ "cryptography",
+ "encryption",
+ "rsa",
+ "security",
+ "sftp",
+ "signature",
+ "signing",
+ "ssh",
+ "twofish",
+ "x.509",
+ "x509"
+ ],
+ "time": "2014-07-05 16:36:21"
+ },
+ {
+ "name": "predis/predis",
+ "version": "v0.8.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nrk/predis.git",
+ "reference": "4123fcd85d61354c6c9900db76c9597dbd129bf6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nrk/predis/zipball/4123fcd85d61354c6c9900db76c9597dbd129bf6",
+ "reference": "4123fcd85d61354c6c9900db76c9597dbd129bf6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "suggest": {
+ "ext-curl": "Allows access to Webdis when paired with phpiredis",
+ "ext-phpiredis": "Allows faster serialization and deserialization of the Redis protocol"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "Predis": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Daniele Alessandri",
+ "email": "suppakilla@gmail.com",
+ "homepage": "http://clorophilla.net"
+ }
+ ],
+ "description": "Flexible and feature-complete PHP client library for Redis",
+ "homepage": "http://github.com/nrk/predis",
+ "keywords": [
+ "nosql",
+ "predis",
+ "redis"
+ ],
+ "time": "2014-08-01 09:43:10"
+ },
+ {
+ "name": "psr/log",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b",
+ "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b",
+ "shasum": ""
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "Psr\\Log\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ],
+ "time": "2012-12-21 11:40:51"
+ },
+ {
+ "name": "stack/builder",
+ "version": "v1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/stackphp/builder.git",
+ "reference": "b4af43e7b7f3f7fac919ff475b29f7c5dc7b23b7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/stackphp/builder/zipball/b4af43e7b7f3f7fac919ff475b29f7c5dc7b23b7",
+ "reference": "b4af43e7b7f3f7fac919ff475b29f7c5dc7b23b7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0",
+ "symfony/http-foundation": "~2.1",
+ "symfony/http-kernel": "~2.1"
+ },
+ "require-dev": {
+ "silex/silex": "~1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Stack": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Igor Wiedler",
+ "email": "igor@wiedler.ch",
+ "homepage": "http://wiedler.ch/igor/"
+ }
+ ],
+ "description": "Builder for stack middlewares based on HttpKernelInterface.",
+ "keywords": [
+ "stack"
+ ],
+ "time": "2014-01-28 19:42:24"
+ },
+ {
+ "name": "swiftmailer/swiftmailer",
+ "version": "v5.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/swiftmailer/swiftmailer.git",
+ "reference": "2b9af56cc676c338d52fca4c657e5bdff73bb7af"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/2b9af56cc676c338d52fca4c657e5bdff73bb7af",
+ "reference": "2b9af56cc676c338d52fca4c657e5bdff73bb7af",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.2.4"
+ },
+ "require-dev": {
+ "mockery/mockery": "~0.9.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.2-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "lib/swift_required.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com",
+ "homepage": "http://fabien.potencier.org",
+ "role": "Lead Developer"
+ },
+ {
+ "name": "Chris Corbyn"
+ }
+ ],
+ "description": "Swiftmailer, free feature-rich PHP mailer",
+ "homepage": "http://swiftmailer.org",
+ "keywords": [
+ "mail",
+ "mailer"
+ ],
+ "time": "2014-06-13 11:44:54"
+ },
+ {
+ "name": "symfony/browser-kit",
+ "version": "v2.5.3",
+ "target-dir": "Symfony/Component/BrowserKit",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/BrowserKit.git",
+ "reference": "ecb0e1ac56af2c3f93f4ac8ff2131872bc7db40c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/BrowserKit/zipball/ecb0e1ac56af2c3f93f4ac8ff2131872bc7db40c",
+ "reference": "ecb0e1ac56af2c3f93f4ac8ff2131872bc7db40c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "symfony/dom-crawler": "~2.0"
+ },
+ "require-dev": {
+ "symfony/css-selector": "~2.0",
+ "symfony/process": "~2.0"
+ },
+ "suggest": {
+ "symfony/process": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Symfony\\Component\\BrowserKit\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "http://symfony.com/contributors"
+ },
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ }
+ ],
+ "description": "Symfony BrowserKit Component",
+ "homepage": "http://symfony.com",
+ "time": "2014-08-06 06:44:37"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v2.5.3",
+ "target-dir": "Symfony/Component/Console",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/Console.git",
+ "reference": "cd2d1e4bac2206b337326b0140ff475fe9ad5f63"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/Console/zipball/cd2d1e4bac2206b337326b0140ff475fe9ad5f63",
+ "reference": "cd2d1e4bac2206b337326b0140ff475fe9ad5f63",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/event-dispatcher": "~2.1"
+ },
+ "suggest": {
+ "psr/log": "For using the console logger",
+ "symfony/event-dispatcher": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Symfony\\Component\\Console\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "http://symfony.com/contributors"
+ },
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ }
+ ],
+ "description": "Symfony Console Component",
+ "homepage": "http://symfony.com",
+ "time": "2014-08-05 09:00:40"
+ },
+ {
+ "name": "symfony/css-selector",
+ "version": "v2.5.3",
+ "target-dir": "Symfony/Component/CssSelector",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/CssSelector.git",
+ "reference": "e24b8215bf39a6a2ce0c262bc5b000724077afa9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/CssSelector/zipball/e24b8215bf39a6a2ce0c262bc5b000724077afa9",
+ "reference": "e24b8215bf39a6a2ce0c262bc5b000724077afa9",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Symfony\\Component\\CssSelector\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "http://symfony.com/contributors"
+ },
+ {
+ "name": "Jean-François Simon",
+ "email": "jeanfrancois.simon@sensiolabs.com"
+ },
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ }
+ ],
+ "description": "Symfony CssSelector Component",
+ "homepage": "http://symfony.com",
+ "time": "2014-07-09 09:05:48"
+ },
+ {
+ "name": "symfony/debug",
+ "version": "v2.5.3",
+ "target-dir": "Symfony/Component/Debug",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/Debug.git",
+ "reference": "189da713c1f8bb03f9184eb87b43ecbc732284ac"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/Debug/zipball/189da713c1f8bb03f9184eb87b43ecbc732284ac",
+ "reference": "189da713c1f8bb03f9184eb87b43ecbc732284ac",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "symfony/http-foundation": "~2.1",
+ "symfony/http-kernel": "~2.1"
+ },
+ "suggest": {
+ "symfony/http-foundation": "",
+ "symfony/http-kernel": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Symfony\\Component\\Debug\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "http://symfony.com/contributors"
+ },
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ }
+ ],
+ "description": "Symfony Debug Component",
+ "homepage": "http://symfony.com",
+ "time": "2014-07-09 09:05:48"
+ },
+ {
+ "name": "symfony/dom-crawler",
+ "version": "v2.5.3",
+ "target-dir": "Symfony/Component/DomCrawler",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/DomCrawler.git",
+ "reference": "9cb8aaea71fabae517ca007ca4b639e96f490c5e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/DomCrawler/zipball/9cb8aaea71fabae517ca007ca4b639e96f490c5e",
+ "reference": "9cb8aaea71fabae517ca007ca4b639e96f490c5e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "symfony/css-selector": "~2.0"
+ },
+ "suggest": {
+ "symfony/css-selector": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Symfony\\Component\\DomCrawler\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "http://symfony.com/contributors"
+ },
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ }
+ ],
+ "description": "Symfony DomCrawler Component",
+ "homepage": "http://symfony.com",
+ "time": "2014-08-05 09:00:40"
+ },
+ {
+ "name": "symfony/event-dispatcher",
+ "version": "v2.5.3",
+ "target-dir": "Symfony/Component/EventDispatcher",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/EventDispatcher.git",
+ "reference": "8faf5cc7e80fde74a650a36e60d32ce3c3e0457b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/8faf5cc7e80fde74a650a36e60d32ce3c3e0457b",
+ "reference": "8faf5cc7e80fde74a650a36e60d32ce3c3e0457b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "~2.0",
+ "symfony/dependency-injection": "~2.0",
+ "symfony/stopwatch": "~2.2"
+ },
+ "suggest": {
+ "symfony/dependency-injection": "",
+ "symfony/http-kernel": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Symfony\\Component\\EventDispatcher\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "http://symfony.com/contributors"
+ },
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ }
+ ],
+ "description": "Symfony EventDispatcher Component",
+ "homepage": "http://symfony.com",
+ "time": "2014-07-28 13:20:46"
+ },
+ {
+ "name": "symfony/filesystem",
+ "version": "v2.5.3",
+ "target-dir": "Symfony/Component/Filesystem",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/Filesystem.git",
+ "reference": "c1309b0ee195ad264a4314435bdaecdfacb8ae9c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/Filesystem/zipball/c1309b0ee195ad264a4314435bdaecdfacb8ae9c",
+ "reference": "c1309b0ee195ad264a4314435bdaecdfacb8ae9c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Symfony\\Component\\Filesystem\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "http://symfony.com/contributors"
+ },
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ }
+ ],
+ "description": "Symfony Filesystem Component",
+ "homepage": "http://symfony.com",
+ "time": "2014-07-09 09:05:48"
+ },
+ {
+ "name": "symfony/finder",
+ "version": "v2.5.3",
+ "target-dir": "Symfony/Component/Finder",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/Finder.git",
+ "reference": "090fe4eaff414d8f2171c7a4748ea868d530775f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/Finder/zipball/090fe4eaff414d8f2171c7a4748ea868d530775f",
+ "reference": "090fe4eaff414d8f2171c7a4748ea868d530775f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Symfony\\Component\\Finder\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "http://symfony.com/contributors"
+ },
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ }
+ ],
+ "description": "Symfony Finder Component",
+ "homepage": "http://symfony.com",
+ "time": "2014-07-28 13:20:46"
+ },
+ {
+ "name": "symfony/http-foundation",
+ "version": "v2.5.3",
+ "target-dir": "Symfony/Component/HttpFoundation",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/HttpFoundation.git",
+ "reference": "53296aa0794ebe1e3880e3f2c68fe10ddad6c3e3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/53296aa0794ebe1e3880e3f2c68fe10ddad6c3e3",
+ "reference": "53296aa0794ebe1e3880e3f2c68fe10ddad6c3e3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "symfony/expression-language": "~2.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Symfony\\Component\\HttpFoundation\\": ""
+ },
+ "classmap": [
+ "Symfony/Component/HttpFoundation/Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "http://symfony.com/contributors"
+ },
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ }
+ ],
+ "description": "Symfony HttpFoundation Component",
+ "homepage": "http://symfony.com",
+ "time": "2014-08-05 09:00:40"
+ },
+ {
+ "name": "symfony/http-kernel",
+ "version": "v2.5.3",
+ "target-dir": "Symfony/Component/HttpKernel",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/HttpKernel.git",
+ "reference": "d3e1fa28d23fe00f2b932ca9d1e4371f9053f05e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/d3e1fa28d23fe00f2b932ca9d1e4371f9053f05e",
+ "reference": "d3e1fa28d23fe00f2b932ca9d1e4371f9053f05e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "psr/log": "~1.0",
+ "symfony/debug": "~2.5",
+ "symfony/event-dispatcher": "~2.5",
+ "symfony/http-foundation": "~2.4"
+ },
+ "require-dev": {
+ "symfony/browser-kit": "~2.2",
+ "symfony/class-loader": "~2.1",
+ "symfony/config": "~2.0",
+ "symfony/console": "~2.2",
+ "symfony/dependency-injection": "~2.0",
+ "symfony/finder": "~2.0",
+ "symfony/process": "~2.0",
+ "symfony/routing": "~2.2",
+ "symfony/stopwatch": "~2.2",
+ "symfony/templating": "~2.2"
+ },
+ "suggest": {
+ "symfony/browser-kit": "",
+ "symfony/class-loader": "",
+ "symfony/config": "",
+ "symfony/console": "",
+ "symfony/dependency-injection": "",
+ "symfony/finder": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Symfony\\Component\\HttpKernel\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "http://symfony.com/contributors"
+ },
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ }
+ ],
+ "description": "Symfony HttpKernel Component",
+ "homepage": "http://symfony.com",
+ "time": "2014-08-06 07:03:01"
+ },
+ {
+ "name": "symfony/process",
+ "version": "v2.5.3",
+ "target-dir": "Symfony/Component/Process",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/Process.git",
+ "reference": "e0997d2a9a1a763484b34b989900b61322a9b056"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/Process/zipball/e0997d2a9a1a763484b34b989900b61322a9b056",
+ "reference": "e0997d2a9a1a763484b34b989900b61322a9b056",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Symfony\\Component\\Process\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "http://symfony.com/contributors"
+ },
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ }
+ ],
+ "description": "Symfony Process Component",
+ "homepage": "http://symfony.com",
+ "time": "2014-08-05 09:00:40"
+ },
+ {
+ "name": "symfony/routing",
+ "version": "v2.5.3",
+ "target-dir": "Symfony/Component/Routing",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/Routing.git",
+ "reference": "1c285e6fffaa026c8073a387f403b1052d61ed95"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/Routing/zipball/1c285e6fffaa026c8073a387f403b1052d61ed95",
+ "reference": "1c285e6fffaa026c8073a387f403b1052d61ed95",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "doctrine/annotations": "~1.0",
+ "psr/log": "~1.0",
+ "symfony/config": "~2.2",
+ "symfony/expression-language": "~2.4",
+ "symfony/yaml": "~2.0"
+ },
+ "suggest": {
+ "doctrine/annotations": "For using the annotation loader",
+ "symfony/config": "For using the all-in-one router or any loader",
+ "symfony/expression-language": "For using expression matching",
+ "symfony/yaml": "For using the YAML loader"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Symfony\\Component\\Routing\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "http://symfony.com/contributors"
+ },
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ }
+ ],
+ "description": "Symfony Routing Component",
+ "homepage": "http://symfony.com",
+ "keywords": [
+ "router",
+ "routing",
+ "uri",
+ "url"
+ ],
+ "time": "2014-07-28 13:20:46"
+ },
+ {
+ "name": "symfony/security-core",
+ "version": "v2.5.3",
+ "target-dir": "Symfony/Component/Security/Core",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/security-core.git",
+ "reference": "d6a8860f015e1f8e8e42c2141a4a88b1965c32ec"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/security-core/zipball/d6a8860f015e1f8e8e42c2141a4a88b1965c32ec",
+ "reference": "d6a8860f015e1f8e8e42c2141a4a88b1965c32ec",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "ircmaxell/password-compat": "1.0.*",
+ "psr/log": "~1.0",
+ "symfony/event-dispatcher": "~2.1",
+ "symfony/expression-language": "~2.4",
+ "symfony/http-foundation": "~2.4",
+ "symfony/validator": "~2.2"
+ },
+ "suggest": {
+ "ircmaxell/password-compat": "For using the BCrypt password encoder in PHP <5.5",
+ "symfony/event-dispatcher": "",
+ "symfony/expression-language": "For using the expression voter",
+ "symfony/http-foundation": "",
+ "symfony/validator": "For using the user password constraint"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Symfony\\Component\\Security\\Core\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "http://symfony.com/contributors"
+ },
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ }
+ ],
+ "description": "Symfony Security Component - Core Library",
+ "homepage": "http://symfony.com",
+ "time": "2014-08-05 09:00:40"
+ },
+ {
+ "name": "symfony/translation",
+ "version": "v2.5.3",
+ "target-dir": "Symfony/Component/Translation",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/Translation.git",
+ "reference": "ae573e45b099b1e2d332930ac626cd4270e09539"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/Translation/zipball/ae573e45b099b1e2d332930ac626cd4270e09539",
+ "reference": "ae573e45b099b1e2d332930ac626cd4270e09539",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "symfony/config": "~2.0",
+ "symfony/yaml": "~2.2"
+ },
+ "suggest": {
+ "symfony/config": "",
+ "symfony/yaml": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Symfony\\Component\\Translation\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "http://symfony.com/contributors"
+ },
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ }
+ ],
+ "description": "Symfony Translation Component",
+ "homepage": "http://symfony.com",
+ "time": "2014-07-28 13:20:46"
+ },
+ {
+ "name": "way/generators",
+ "version": "2.6.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/JeffreyWay/Laravel-4-Generators.git",
+ "reference": "484d379c6bc1d38c75e4f52f74efcbcd11f7dd2c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/JeffreyWay/Laravel-4-Generators/zipball/484d379c6bc1d38c75e4f52f74efcbcd11f7dd2c",
+ "reference": "484d379c6bc1d38c75e4f52f74efcbcd11f7dd2c",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/support": "~4.0",
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "behat/behat": "~2.5.1",
+ "behat/mink": "~1.5.0",
+ "behat/mink-extension": "~1.2.0",
+ "behat/mink-goutte-driver": "~1.0.9",
+ "behat/mink-selenium2-driver": "~1.1.1",
+ "phpspec/phpspec": "~2.0",
+ "phpunit/phpunit": "~3.7"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "Way\\Generators": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jeffrey Way",
+ "email": "jeffrey@jeffrey-way.com",
+ "homepage": "http://jeffrye-way.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "Rapidly generate resources, migrations, models, and much more.",
+ "time": "2014-05-27 14:21:26"
+ },
+ {
+ "name": "xethron/migrations-generator",
+ "version": "dev-master",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Xethron/migrations-generator.git",
+ "reference": "50114af1d10a6fd2dca0ee31114cbf6c553645db"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Xethron/migrations-generator/zipball/50114af1d10a6fd2dca0ee31114cbf6c553645db",
+ "reference": "50114af1d10a6fd2dca0ee31114cbf6c553645db",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/dbal": "~2.4",
+ "illuminate/support": "~4.1",
+ "php": ">=5.3.0",
+ "way/generators": "2.*"
+ },
+ "require-dev": {
+ "illuminate/cache": ">=4.1.0",
+ "illuminate/console": ">=4.1.0",
+ "mockery/mockery": ">=0.9.0",
+ "phpunit/phpunit": ">=4.0.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "Xethron\\MigrationsGenerator": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Breytenbach",
+ "email": "bernhard@coffeecode.co.za"
+ }
+ ],
+ "description": "Generates Laravel Migrations from an existing database",
+ "keywords": [
+ "artisan",
+ "generator",
+ "laravel",
+ "migration",
+ "migrations"
+ ],
+ "time": "2014-07-27 18:45:48"
+ }
+ ],
+ "packages-dev": [],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": {
+ "xethron/migrations-generator": 20
+ },
+ "prefer-stable": false,
+ "platform": [],
+ "platform-dev": []
+}
diff --git a/cron.php b/cron.php
deleted file mode 100755
index 3edd66c..0000000
--- a/cron.php
+++ /dev/null
@@ -1,42 +0,0 @@
- 'SET NAMES \'UTF8\''));
- list($dsn, $username, $password, $driver_options) = $sql_params;
- $db = new DB($dsn, $username, $password, $driver_options);
-
- $old_sittings = $db->getVar('SELECT COUNT(*) FROM sittings', array());
-
- $command = '/usr/local/bin/php -d safe_mode=Off -d open_basedir=/ -d display_errors=true /home/aurimas/domains/lplius.lt/public_html/seime.lt-backend/update.php';
- exec($command, $output, $code);
-
- $o = implode("\n", $output);
-
- $new_sittings = $db->getVar('SELECT COUNT(*) FROM sittings', array());
- $prefix = '[seime.lt] [' . date('Y-m-d') . '] ';
- if ($old_sittings == $new_sittings) $subject = $prefix . 'Nepridėta posėdžių';
- else {
- $subject = $prefix . 'Pridėta posėdžių: ' . ($new_sittings - $old_sittings);
- exec('find /home/aurimas/domains/seime.lt/public_html/cache/ -name "*.cache" -type f | xargs rm');
- }
-
- $headers = 'MIME-Version: 1.0' . "\r\n";
- $headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";
-
- echo '' . $subject . ' ';
- print_r($o);
-
- echo 'mail status:' . var_dump(mail('info@seime.lt', $subject, wordwrap($o), $headers));
-
- file_get_contents('http://seime.lt/balsavimas');
-
- $backup_command = 'mysqldump -u aurimas -pwindows1257 aurimas_seime | gzip -c > /home/aurimas/domains/seime.lt/public_html/downloads/seime.lt.gz';
- exec($backup_command);
-}
-else {
- echo 'Access denied';
-}
-
diff --git a/db-docs/README-LT.md b/db-docs/README-LT.md
deleted file mode 100755
index 11434eb..0000000
--- a/db-docs/README-LT.md
+++ /dev/null
@@ -1,117 +0,0 @@
-# SEIME.LT DUOMENŲ DOKUMENTACIJA #
-
-Šiame dokumente trumpai apibūdinsime Seime.lt SQL duomenų schemą. Tai nebus pilna
-ir tiksli dokumentacija, bet jos turėtų užtekti suprasti pagrindinius duomenų
-aspektus - visą kitą turėtų būti galima (gana) nesunkiai suprasti ir be tikslių
-aprašymų. Bet kuriuo atveju - visada galima parašyti į info@seime.lt ir paprašyti
-patikslinti vieną ar kitą detalę. Prieš pradedant skaityti šią dokumentaciją
-rekomenduojame susipažinti su duomenų schemos brėžiniu, kuris pateikiamas seime.lt.pdf.
-
-Šios dokumentacijos struktūra tokia:
-
-* aptariamas pagrindinis objektų (sesijų, posėdžių, klausimų, veiksmų) medis
-* aptariama įvairi oficiali informacija apie objektus
-* aptariami papildomi Seime.lt komandos apskaičiuoti duomenys
-
-Seime.lt duomenys pateikiami su Creative Commons BY-NC-SA licencija:
-http://creativecommons.org/licenses/by-nc-sa/3.0/
-
-## PAGRINDINIS OBJEKTŲ MEDIS ##
-
-Seimo darbas vyksta sesijomis - kiekvienais metais vyksta pavasario ir rudens
-sesijos, taip pat pagal poreikį organizuojamos neeilinės sesijos. Duomenys apie
-Seimo sesijas saugomi lentelėje `SESSIONS`.
-
-Kiekvienos sesijos metu antradieniais ir ketvirtadieniais vyksta eiliniai Seimo
-posėdžiai. Taip pat pagal poreikį organizuojami neeiliniai posėdžiai. Duomenys
-apie Seimo posėdžius saugomi lentelėje `SITTINGS`. Kiekvienas posėdis priklauso
-vienai iš sesijų ir yra susietas su ja ryšiu `SITTINGS.SESSIONS_ID = SESSIONS.ID`.
-
-Kiekvieno posėdžio metu yra nagrinėjami darbotvarkėje numatyti klausimai. Duomenys
-apie kiekvieną klausimą saugomi lentelėje `QUESTIONS`. Kiekvienas klausimas priklauso
-vienam iš posėdžių ir yra susietas su juo ryšiu `QUESTIONS.SITTINGS_ID = SITTINGS.ID`.
-
-Kiekvieno klausimo metu yra vykdomi "veiksmai" - Seimo narys pasisako, vyksta
-registracija į balsavimą, vyksta balsavimas ir t.t. Veiksmų tipai aptariami žemiau.
-Duomenys apie kiekvieną veiksmą saugomi lentelėje `ACTIONS`. Kiekvienas veiksmas
-priklauso vienam iš klausimų ir yra susietas ryšiu `ACTIONS.QUESTIONS_ID = QUESTIONS.ID`.
-
-## PAPILDOMA INFORMACIJA APIE POSĖDŽIUS ##
-
-Seimo Statuto numatyta tvarka yra nustatoma, ar Seimo narys dalyvavo posėdyje:
-
-> 11 straipsnis. Laikoma, kad Seimo narys dalyvavo Seimo posėdyje, jeigu jis
-> užsiregistravo daugiau kaip pusėje iš anksto numatytų ir numatytu laiku įvykusių
-> balsavimų dėl teisės akto priėmimo ir užsiregistravo visuose tos dienos Seimo
-> posėdžiuose. Laikoma, kad Seimo narys dalyvavo Seimo komiteto ar komisijos posėdyje,
-> jeigu jis užsiregistravo posėdžio protokolo priede pasirašytinai.
-
-Ši oficiali dalyvavimo statistika saugoma lentelėje `SITTING_PARTICIPATION` formatu
-`(MEMBERS_ID, SITTINGS_ID, PRESENCE)`, kur pirmieji du laukai yra nuorodos į `SITTINGS`
-ir `MEMBERS` lenteles, o `PRESENCE` turi reikšmę 0 (nedalyvavo) arba 1 (dalyvavo).
-
-## PAPILDOMA INFORMACIJA APIE KLAUSIMUS ##
-
-Kai kurie svarstomi klausimai turi su susijusius dokumentus (pvz., svarstomo įstatymo
-tekstas). Ši informacija saugoma lentelėje `ITEMS`, kuri susieta ryšiu
-`ITEMS.QUESTIONS_ID = QUESTIONS.ID`. Be to, kai kuriais atvejais šie dokumentai yra
-pristatomi pranešėjų. Ši informacija saugoma lentelėje `PRESENTERS`, kuri susieta ryšiu
-`PRESENTERS.ITEMS_ID` = `ITEMS.ID. PRESENTERS` lentelėje pranešėjų vardai saugomi tekstiniu
-formatu ir nėra susieti su `MEMBERS` lentele (nes pranešėjai ne visada yra Seimo nariai).
-Tačiau ryšys `PRESENTERS.PRESENTER` = `MEMBERS.NAME` dažniausiai veikia be klaidų.
-
-## PAPILDOMA INFORMACIJA APIE VEIKSMUS ##
-
-Išskiriami 5 veiksmų tipai:
-
-- Seimo narių pasisakymai (`ACTIONS.TYPE` = "speech"). Informacija apie tai, kuris
-Seimo narys pasisakė saugoma lentelėje `SPEAKERS` su ryšiais `SPEAKERS.ACTIONS_ID =
-ACTIONS.ID` ir `SPEAKERS.MEMBERS_ID = MEMBERS.ID`.
-
-- Registracijos į balsavimus (`ACTIONS.TYPE` = "registration"). Duomenys apie
-registracijas saugomi lentelėje `REGISTRATIONS` formatu `(MEMBERS_ID, ACTIONS_ID, presence)`,
-kur pirmieji du laukai yra nuorodos į `ACTIONS` ir `MEMBERS` lenteles, o `PRESENCE` turi
-reikšmę 0 (neužsiregistravo) arba 1 (užsiregistravo).
-- Balsavimai (`ACTIONS.TYPE` = "voting"). Duomenys apie balsavimus saugomi lentelėje
-`VOTES` formatu `(MEMBERS_ID, ACTIONS_ID, FRACTION, VOTE)`, kur pirmieji du laukai yra
-nuorodos į `ACTIONS` ir `MEMBERS` lenteles, `FRACTION` yra tekstinis laukas su Seimo nario
-frakcijos santrumpa ir `VOTE`, kuris įgauna reikšmes "abstain" (susilaikė), "accept"
-(balsavo už), "dissappeare" (užsiregistravo, bet nebalsavo), "not presen"
-(neužsiregistravo ir nebalsavo) ir "reject" (balsavo prieš). Visos reikšmės, išskyrus
-"dissappeare" yra oficialios. "Disappeare" reikšmės apskaičiavimas aprašome žemiau.
-- Vienbalsiški balsavimai (`ACTIONS.TYPE` = "u_voting"). Papildomos infomacijos nėra.
-- Kiti veiksmai (`ACTIONS.TYPE` = "other"). Visi kiti veiksmai. Tarp šių veiksmų yra
-ir alternatyvieji balsavimai (ne už/prieš , bet už A/už B tipo balsavimai), kurių
-balsavimo duomenys saugomi taip pat, kaip ir paprastų balsavimų.
-
-## SEIME.LT KOMANDOS APSKAIČIUOTI DUOMENYS ##
-
-Vienas pagrindinių Seime.lt projekto tikslų buvo apskaičiuoti tikslesnę nei oficiali
-Seimo narių lankomumo statistiką. Tai buvo nuspręsta padaryti suskaidant posėdžių laiką
-į mažas dalis tarp registracijų ir skaičiuoti buvimo laiką remiantis šiais intervalais.
-
-- Visų pirma, buvo identifikuoti laiko intervalai tarp registracijų kiekviename klausime,
-kurie saugomi lentelėje `SUBQUESTIONS`, kuri susieta su lentele `QUESTIONS` ryšiu
-`SUBQUESTIONS.QUESTIONS_ID = QUESTIONS.ID`.
-- Tada buvo rasta, ar Seimo narys dalyvavo posėdyje konkrečiame laiko intervale.
-Buvo laikoma, kad Seimo narys dalyvavo posėdžio dalyje tarp dviejų registracijų, jei
-užsiregistravo bent vienoje jų. Šie duomenys saugomi lentelėje `SUBQUESTIONS_PARTICIPATION`
-formatu `(MEMBERS_ID, SUBQUESTIONS_ID, PRESENCE)`, kur pirmieji du laukai yra nuorodos
-į `SUBQUESTIONS` ir `MEMBERS` lenteles, o `PRESENCE` turi reikšmę 0 (dalyvavo) arba 1 (nedalyvavo).
-- Visi šie duomenys suagreguojami posėdžių lygmenyje ir saugomi lentelėje `PARTICIPATION_DATA`
-formatu `(MEMBERS_ID, SITTINGS_ID, OFFICIAL_PRESENCE, HOURS_AVAILABLE, HOURS_PRESENT)`, kur:
- - `MEMBERS_ID` yra nuoroda į `MEMBERS` lentelę;
- - `SITTINGS_ID` yra nuoroda į `SITTINGS` lentelę;
- - `OFFICIAL_PRESENCE` yra oficiali informacija apie tai, ar Seimo narys dalyvavo
-posėdyje (žr. PAPILDOMA INFORMACIJA APIE POSĖDŽIUS aukščiau);
- - `HOURS_AVAILABLE` yra visa posėdžio trukmė valandomis;
- - `HOURS_PRESENT` yra Seimo nario buvimo posėdyje laikas, apskaičiuotas pagal
-`SUBQUESTIONS_PARTICIPATION` lentelės duomenis.
-
-Seime.lt komanda taip pat norėjo identifikuoti tuos atvejus, kai Seimo nariai
-užsiregistruoja į balsavimą, tačiau jame nesudalyvauja (nors jie beveik visada vyksta iš
-karto vienas po kito). Tai buvo padaryta identifikuojant pirmą registraciją prieš kiekvieną
-balsavimą. Šie registracijų ir balsavimų ryšiai saugomi lentelėje `VOTING_REGISTRATION`, kur
-`VOTE_ID` yra nuoroda į `VOTES.ID` lauką, o `REGISTRATION_ID` yra nuoroda į `REGISTRATIONS.ID` lauką.
-Taip pat remiantis šiais duomenimis buvo papildyta lentelę `VOTES`, kur laukui `VOTE` nustatyta
-reikšmė "dissapeare" tais atvejais, kai Seimo narys užsiregistravo, bet nedalyvavo balsavime.
diff --git a/db-docs/seime.lt.mwb b/db-docs/seime.lt.mwb
deleted file mode 100755
index 7517b8b..0000000
Binary files a/db-docs/seime.lt.mwb and /dev/null differ
diff --git a/db-docs/seime.lt.new.pdf b/db-docs/seime.lt.new.pdf
deleted file mode 100755
index 94dfdaa..0000000
Binary files a/db-docs/seime.lt.new.pdf and /dev/null differ
diff --git a/db-docs/seime.lt.pdf b/db-docs/seime.lt.pdf
deleted file mode 100755
index c211124..0000000
Binary files a/db-docs/seime.lt.pdf and /dev/null differ
diff --git a/db-docs/seime.new.lt.mwb b/db-docs/seime.new.lt.mwb
deleted file mode 100755
index 88e180f..0000000
Binary files a/db-docs/seime.new.lt.mwb and /dev/null differ
diff --git a/extensions/QuestionParticipation.php b/extensions/QuestionParticipation.php
deleted file mode 100755
index bbc9bd3..0000000
--- a/extensions/QuestionParticipation.php
+++ /dev/null
@@ -1,243 +0,0 @@
-cleanChildren($array['children']);
- }
- return $array;
- }
-
-
- /*
- * Wrapper function to be called from outside
- */
- public function estimateParticipation() {
- //try to get the participation from registration actions
- $participation = $this->extractParticipation();
- //if there were no registrations, call upon estimation based on siblings
- if (false === $participation) {
- $participation = $this->estimateParticipationBySiblings();
- }
- $this->participation = $participation;
- //$this->show();
- }
-
- /*
- * tries to estimate participation based on its own children
- * returns participation array or false, if not successful
- */
- protected function extractParticipation() {
- $start_time = $this->getStartTime();
- $participation = array();
- $i = 0;
- $last_position = false;
- //collect all registrations into array $participation
- foreach($this->children as $index => $child) {
- if ($child->getType() == 'registration') {
- $data = array(
- 'participation' => $child->getParticipation(),
- 'start_time' => $start_time,
- 'end_time' => date('Y-m-d', strtotime($start_time)) . ' ' . $child->getEndTime(), //end time in action is only time!
- 'number' => $i);
- $participation[$i] = $data;
- $i++;
- $start_time = $data['end_time'];
- $last_position = $index;
- }
- }
- //if no registrations found - return false
- if (false === $last_position) {
- return false;
- }
- //else - extend the last registration effect till the end of question
- else {
- $participation[$i - 1]['end_time'] = $this->getEndTime();
- return $participation;
- }
- }
-
- /*
- * tries to estimate participation based on sibling / parent data
- */
- protected function estimateParticipationBySiblings() {
-
- $participation = array();
- $preceeding_participation = false;
- $proceeding_participation = false;
-
- //first, try to get the question before with data
- $a = $this->getSiblingParticipation(-1);
- if (false !== $a) {
- $a = end($a);
- $preceeding_participation = $a['participation'];
- }
- //then, try to get the question after with data
- $a = $this->getSiblingParticipation(1);
- if (false !== $a) {
- $a = reset($a);
- $proceeding_participation = $a['participation'];
- }
-
- if ((false === $preceeding_participation) && (false === $proceeding_participation)) {
- //case when no questions had registrations - return Sitting participation data
- $participation = $this->getParentInfo('getParticipation');
- echo 'OMFG! it exists!';
- echo $this->getId();
- }
- elseif (false === $proceeding_participation) {
- //if no data going forward, assume same participation as in question before
- $participation = $preceeding_participation;
- }
- elseif (false === $preceeding_participation) {
- //if no data going back, assume same participation as in question afterwards
- $participation = $proceeding_participation;
- }
- else {
- //merge data from siblings. If member present in at least one of siblings - assume presence here, too.
- foreach ($preceeding_participation as $member => $presence) {
- $participation[$member] = $presence;
- }
- foreach ($proceeding_participation as $member => $presence) {
- if ($presence) {
- $participation[$member] = 1;
- }
- elseif (!isset($participation[$member])) {
- $participation[$member] = 0;
- }
- }
- }
-
- $data = array(
- 'participation' => $participation,
- 'start_time' => $this->getStartTime(),
- 'end_time' => $this->getEndTime(),
- 'number' => 0);
- return array($data);
- }
-
- /*
- * helper function for Question::estimateParticipationBySiblings()
- */
- protected function getSiblingParticipation($direction) {
- $i = 1;
- $found = false;
- while(!$found) {
- try {
- $sibling_participation = $this->getSiblingInfoByPosition($this->getId(), $i * $direction, 'getParticipation');
- if (false !== $sibling_participation) {
- //if found, return
- return $sibling_participation;
- }
- else {
- //else, keep searching
- $i++;
- }
- }
- catch(Exception $e) {
- return false; //no such sibling found at all
- }
- }
- }
-
- /*
- * public function, returns participation if already estimated before
- * OR
- * tries to estimate based on internal data only (calls extractParticipation)
- * else returns false;
- */
- public function getParticipation() {
- if (!empty($this->participation)) {
- //provide data, if available
- return $this->participation;
- }
- else {
- //else try to extract, but do not go into siblings to avoid recursion
- $participation = $this->extractParticipation();
- if (false === $participation) {
- //if unlucky, return false
- return false;
- }
- else {
- //else save it properly and return it
- $this->participation = $participation;
- return $participation;
- }
- }
- }
-
- public function saveParticipation() {
- if (empty($this->participation)) return;
- $id = NULL;
-
- foreach($this->participation as $subquestion) {
- $participation_data = $subquestion['participation'];
- $data = array();
- unset($subquestion['participation']);
-
- //saving of subquestion meta data
- if (!isset($subquestion['id'])) {
- $subquestion['questions_id'] = $this->getId();
- $id = $this->Factory->saveObject('subquestions', $subquestion, array('id', 'questions_id'));
- }
- else $id = $subquestion['id'];
-
- //saving of participation data
- if (!empty($id)) {
- foreach($participation_data as $member => $presence) {
- $data[] = array('subquestions_id' => $id, 'members_id' => $member, 'presence' => $presence);
- }
- $this->Factory->saveObjects('subquestions_participation', $data, array('id'));
- }
- else {
- echo 'error on saving - where is the ID?';
- }
- }
- }
-
- public function populateParticipation() {
-
- $subquestions = $this->Factory->getArray(self::$subquestions_sql, array($this->getId()));
- if (empty($subquestions)) {
- return false;
- }
- else {
- foreach ($subquestions as $subquestion) {
- $data = $subquestion;
- $participation = $this->Factory->getArray(self::$subquestions_participation_sql, array($subquestion['id']));
- if (!empty($participation)) {
- $data['participation'] = array();
- foreach ($participation as $row) {
- $data['participation'][$row['members_id']] = $row['presence'];
- }
- }
- $this->participation[$data['number']] = $data;
- }
- return true;
- }
- }
-
-}
-?>
diff --git a/extensions/QuestionStats.php b/extensions/QuestionStats.php
deleted file mode 100755
index 7bae11e..0000000
--- a/extensions/QuestionStats.php
+++ /dev/null
@@ -1,39 +0,0 @@
-items[0])) && (!empty($this->items[0]['presenters']))) {
- foreach($this->items[0]['presenters'] as $p) {
- $presenters[$p['presenter']] = $p['members_id'];
- }
- return $presenters;
- }
- }
-
- public function getSpeakers() {
- $members = array();
- foreach ($this->getChildren() as $action) {
- if ($action->getType() == 'speech') {
- $member = trim(mb_substr($action->getTitle(), 9));
- $length = strtotime($action->getEndTime()) - strtotime($action->getStartTime());
- (!array_key_exists($member, $members)) ? $members[$member] = $length : $members[$member] += $length;
- }
- }
- return $members;
- }
-
- public function getLastVoting() {
- $voting = null;
- foreach ($this->getChildren() as $action) {
- if ($action->getType() == 'voting') {
- $voting = $action;
- }
- }
- return $voting;
- }
-
- }
diff --git a/extensions/RegistrationLink.php b/extensions/RegistrationLink.php
deleted file mode 100755
index 1e27230..0000000
--- a/extensions/RegistrationLink.php
+++ /dev/null
@@ -1,62 +0,0 @@
-getType() != 'voting') return;
- if (false == $this->populateLink()) {
- $this->determineLink();
- $this->saveLink();
- }
- }
-
- protected function determineLink() {
- $i = 1;
- $found = false;
- $sibling_id = 0;
- //try to find a registration
- while(!$found) {
- try {
- $sibling_type = $this->getSiblingInfoByPosition($this->getNumber(), -$i, 'getType');
- if ($sibling_type == 'registration') {
- $found = true;
- $sibling_id = $this->getSiblingInfoByPosition($this->getNumber(), -$i, 'getId');
- }
- else {
- $i++;
- }
- }
- catch(Exception $e) {
- $found = true;
- }
- }
- $this->link = $sibling_id;
- }
-
- protected function saveLink() {
- $this->Factory->SaveObject('voting_registration', array('registration_id' => $this->link, 'voting_id' => $this->getId()), array('id'));
- }
-
- protected function populateLink() {
- $id = $this->Factory->getVar(self::$link_sql, array($this->getId()));
- if (NULL === $id) {
- return false;
- }
- else {
- $this->link = $id;
- return true;
- }
- }
-
-}
-
-?>
diff --git a/extensions/SittingStats.php b/extensions/SittingStats.php
deleted file mode 100755
index 4e3aa45..0000000
--- a/extensions/SittingStats.php
+++ /dev/null
@@ -1,274 +0,0 @@
- 0';
-
- protected $voting_results_sql = '
- SELECT outcome, count(actions.id) as count
- FROM questions
- JOIN actions ON actions.questions_id = questions.id
- WHERE questions.sittings_id = ? AND actions.type = "voting"
- GROUP BY outcome';
-
- public function __construct($url, Seimas $parent = NULL, $params = NULL, Factory $Factory = NULL) {
- parent::__construct($url, $parent, $params, $Factory);
- $this->initialise();
- $this->initialiseChildren(true);
- }
-
- public function getSpeakers($limit = 0) {
- if (empty($this->speakers)) {
- $members = array();
- foreach ($this->getChildren() as $child) {
- //echo $child->getTitle() . " ";
- foreach ($child->getChildren() as $action) {
- if ($action->getType() == 'speech') {
- $member = trim(mb_substr($action->getTitle(), 9));
- $length = strtotime($action->getEndTime()) - strtotime($action->getStartTime());
- (!array_key_exists($member, $members)) ? $members[$member] = $length : $members[$member] += $length;
- }
- }
- }
- arsort($members);
- $this->speakers = $members;
- }
- return ($limit == 0) ? $this->speakers : array_slice($this->speakers, 0, $limit);
- }
-
- /*
- public function getTopQuestions($limit = 3) {
- $questions = array();
- $lengths = array();
- foreach ($this->getChildren() as $child) {
- $questions[] = $child;
- $lengths[] = strtotime($child->getEndTime()) - strtotime($child->getStartTime());
- }
- arsort($lengths);
- foreach($lengths as $key => &$v) {
- $v = $questions[$key];
- }
- return array_slice($lengths, 0, $limit);
- } */
-
- public function getTopQuestions($limit = 3) {
- $sql = str_replace('{limit}', intval($limit), $this->topquestions_sql);
- $db = Initialisator::getDB();
- $result = $db->getArray($sql,array($this->getId()));
- $top = array();
- foreach($result as $row) {
- $q = $this->children[$row['id']];
- $q->effective_presence = $row['e_presence'];
- $top[] = $q;
- }
- return $top;
- }
-
- public function getTitle() {
- return implode(
- " ",
- array(
- strftime('%Y m. %B %e d.', strtotime($this->date)),
- $this->type,'posėdis')
- );
- }
-
- public function getPeriod() {
- return date('H:i', strtotime($this->getStartTime())) . ' - ' . date('H:i', strtotime($this->getEndTime()));
- }
-
- public function getLength() {
- $l = (strtotime($this->getEndTime()) - strtotime($this->getStartTime())) / 60;
- $h = floor($l / 60);
- $m = $l % 60;
- return sprintf('%1$s val. %2$s min', $h, $m);
- }
-
- public function getStartTime() {
- if (empty($this->start_time)) return $this->start_time;
- else {
- reset($this->children);
- $id = key($this->children);
- return $this->children["$id"]->getStartTime();
- }
- }
-
- public function getSessionID() {
- return $this->sessions_id;
- }
-
- public function getEndTime() {
- return $this->end_time;
- }
-
- public function getUrl($type = '') {
- switch ($type) {
- case '': return $this->url;
- case 'protocol': return $this->protocol_url;
- case 'transcript': return $this->transcript_url;
- case 'recording': return $this->recording_url;
- }
- }
-
- public function participation($type) {
- switch ($type) {
- case 'participated':
- return array_sum($this->participation);
- case 'total':
- return count($this->participation);
- case 'percentage':
- return round($this->participation('participated') / $this->participation('total') * 100, 0);
- case 'time-based':
- return $this->Factory->getVar($this->percentage_participation_sql, array($this->getId()));
- }
- }
-
- public function getMemberStats($type) {
- switch($type) {
- case 'full-attendance':
- $c = $this->Factory->getVar($this->full_attendance_sql, array($this->getId()));
- return (empty($c)) ? 0 : $c;
- case 'short-attendance':
- $c = $this->Factory->getVar($this->short_attendance_sql, array($this->getId()));
- return (empty($c)) ? 0 : $c;
- case 'speakers':
- return count($this->getSpeakers());
- }
- }
-
- public function getVotings($outcome) {
- if (empty($this->votingOutcomes)) {
- $this->votingOutcomes = array();
- foreach($this->Factory->getArray($this->voting_results_sql, array($this->getId())) as $row) { $this->votingOutcomes[$row['outcome']] = $row['count']; }
- }
- switch($outcome) {
- case 'all':
- return array_sum($this->votingOutcomes);
- case 'accepted':
- return $this->votingOutcomes['accepted'];
- case 'rejected':
- return $this->votingOutcomes['rejected'];
- }
- }
-
- public function getTopParticipants() {
- $sql = '
- SELECT members.id, members.name FROM participation_data
- JOIN members ON members_id = members.id
- WHERE cadency_end = "0000-00-00" AND sittings_id = ? AND hours_present = hours_available
- ORDER BY members.name ASC';
- $participants = array();
- $top = $this->Factory->getArray($sql, array($this->getId()));
- if (!empty($top)) {
- foreach ($top as $m) {
- $participants[] = '' . $m['name'] . ' ';
- }
- }
- return $participants;
- }
-
- public function getBottomParticipants() {
- $sql = '
- SELECT hours_present FROM participation_data
- JOIN members ON members_id = members.id
- WHERE cadency_end = "0000-00-00" AND sittings_id = ? AND hours_present > 0
- ORDER BY hours_present ASC LIMIT 4,1';
- $cutoff = $this->Factory->getVar($sql, array($this->getId()));
- $sql = '
- SELECT members.id, members.name, round(hours_present / hours_available * 100,0) as participation FROM participation_data
- JOIN members ON members_id = members.id
- WHERE cadency_end = "0000-00-00" AND sittings_id = ? AND hours_present <= ? AND hours_present > 0
- ORDER BY hours_present ASC, members.name ASC';
- $participants = array();
- $bottom = $this->Factory->getArray($sql, array($this->getId(), $cutoff));
- if (!empty($bottom)) {
- foreach ($bottom as $m) {
- $participants[] = '' . $m['name'] . ' (' . $m['participation'] . '%)';
- }
- }
- return $participants;
- }
-
- public function getTopSpeakers() {
- $sql = '
- SELECT members.id, members.name, members.notes
- FROM members
- WHERE name IN (?,?,?,?,?)
- ORDER BY FIELD(members.name, ?, ?, ?, ?, ?)';
-
- $speakers = $this->getSpeakers(5);
- $top = $this->Factory->getArray($sql, array_merge(array_keys($speakers),array_keys($speakers)));
- $members = array();
- foreach ($top as $member) {
- $members[] = '' . $member['name'] . ' (' . round($speakers[$member['name']] / 60, 0) . ' min)';
- }
- return $members;
- }
-
- public function TotalVotePie() {
- $total_data = $this->Factory->getArray('
- SELECT vote, count(vote) as count FROM votes
- JOIN actions ON actions.id = votes.actions_id
- JOIN questions ON actions.questions_id = questions.id
- WHERE vote != ? AND sittings_id = ? GROUP BY vote', array('not presen', $this->getId()));
- $totals = array();
- $total_count = 0;
- foreach ($total_data as $outcome) {
- $total_count += $outcome['count'];
- $totals[$outcome['vote']] = $outcome['count'];
- }
- $js_totals = array();
- foreach($totals as $name => $count) {
- $data = array('name' => niceVoteName($name), 'y' => $count / $total_count * 100);
- if ($name == 'disappeare') {
- $data['sliced'] = 1;
- $data['selected'] = 1;
- }
- $js_totals[] = $data;
- }
- usort($js_totals, array($this, 'sortPieChart'));
- return $js_totals;
- }
-
- protected function sortPieChart($a, $b) {
- if ($this->getPieOrder($a['name']) > $this->getPieOrder($b['name'])) return 1;
- elseif ($this->getPieOrder($a['name']) < $this->getPieOrder($b['name'])) return -1;
- else return 0;
- }
-
- protected function getPieOrder($name) {
- $v = 1;
- switch ($name) {
- case 'Balsavo UŽ': $v = 2; break;
- case 'Balsavo PRIEŠ': $v = 3; break;
- case 'Susilaikė': $v = 4; break;
- case 'Neužsiregistravo': $v = 1; break;
- case 'Užsiregistravo, tačiau nebalsavo': $v = 5; break;
- }
- return $v;
- }
-
- }
diff --git a/phpunit.xml b/phpunit.xml
new file mode 100644
index 0000000..c330420
--- /dev/null
+++ b/phpunit.xml
@@ -0,0 +1,18 @@
+
+
+
+
+ ./app/tests/
+
+
+
diff --git a/public/.htaccess b/public/.htaccess
new file mode 100644
index 0000000..77827ae
--- /dev/null
+++ b/public/.htaccess
@@ -0,0 +1,15 @@
+
+
+ Options -MultiViews
+
+
+ RewriteEngine On
+
+ # Redirect Trailing Slashes...
+ RewriteRule ^(.*)/$ /$1 [L,R=301]
+
+ # Handle Front Controller...
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteCond %{REQUEST_FILENAME} !-f
+ RewriteRule ^ index.php [L]
+
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000..e69de29
diff --git a/public/index.php b/public/index.php
new file mode 100644
index 0000000..f08822d
--- /dev/null
+++ b/public/index.php
@@ -0,0 +1,49 @@
+
+ */
+
+/*
+|--------------------------------------------------------------------------
+| Register The Auto Loader
+|--------------------------------------------------------------------------
+|
+| Composer provides a convenient, automatically generated class loader
+| for our application. We just need to utilize it! We'll require it
+| into the script here so that we do not have to worry about the
+| loading of any our classes "manually". Feels great to relax.
+|
+*/
+
+require __DIR__.'/../bootstrap/autoload.php';
+
+/*
+|--------------------------------------------------------------------------
+| Turn On The Lights
+|--------------------------------------------------------------------------
+|
+| We need to illuminate PHP development, so let's turn on the lights.
+| This bootstraps the framework and gets it ready for use, then it
+| will load up this application so that we can run it and send
+| the responses back to the browser and delight these users.
+|
+*/
+
+$app = require_once __DIR__.'/../bootstrap/start.php';
+
+/*
+|--------------------------------------------------------------------------
+| Run The Application
+|--------------------------------------------------------------------------
+|
+| Once we have the application, we can simply call the run method,
+| which will execute the request and send the response back to
+| the client's browser allowing them to enjoy the creative
+| and wonderful application we have whipped up for them.
+|
+*/
+
+$app->run();
diff --git a/public/packages/.gitkeep b/public/packages/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/public/packages/barryvdh/laravel-debugbar/laravel-debugbar.css b/public/packages/barryvdh/laravel-debugbar/laravel-debugbar.css
new file mode 100644
index 0000000..2dd6c8b
--- /dev/null
+++ b/public/packages/barryvdh/laravel-debugbar/laravel-debugbar.css
@@ -0,0 +1,65 @@
+div.phpdebugbar {
+ font-size: 13px;
+ font-family: "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Verdana, sans-serif;
+}
+
+div.phpdebugbar-header {
+ background: #efefef url(laravel-icon.png) no-repeat 4px 3px;
+ background-size: 20px;
+ line-height: 17px;
+}
+a.phpdebugbar-restore-btn {
+ background: #efefef url(laravel-icon.png) no-repeat 5px 3px;
+ background-size: 20px;
+ width: 16px;
+ border-right-color: #ccc;
+}
+
+div.phpdebugbar-header > div > * {
+ font-size: 13px;
+}
+
+div.phpdebugbar-header .phpdebugbar-tab {
+ padding: 5px 6px;
+}
+
+div.phpdebugbar .phpdebugbar-header select{
+ padding: 1px 0;
+}
+
+dl.phpdebugbar-widgets-kvlist dt{
+ width: 200px;
+}
+
+dl.phpdebugbar-widgets-kvlist dd {
+ margin-left: 210px;
+}
+
+ul.phpdebugbar-widgets-timeline li span.phpdebugbar-widgets-value {
+ height: 20px;
+ top: 0;
+ background-color: #f4645f;
+}
+
+ul.phpdebugbar-widgets-timeline li span.phpdebugbar-widgets-label {
+ top: 2px;
+}
+
+div.phpdebugbar-widgets-messages div.phpdebugbar-widgets-toolbar a.phpdebugbar-widgets-filter {
+ background-color: #f4645f;
+}
+
+a.phpdebugbar-tab.phpdebugbar-active {
+ background: #f4645f;
+ color: #fff;
+}
+
+a.phpdebugbar-tab.phpdebugbar-active span.phpdebugbar-badge {
+ background-color: white;
+ color: #f4645f;
+}
+
+a.phpdebugbar-tab span.phpdebugbar-badge {
+ background: #f4645f;
+ color: #fff;
+}
diff --git a/public/packages/barryvdh/laravel-debugbar/laravel-icon.png b/public/packages/barryvdh/laravel-debugbar/laravel-icon.png
new file mode 100644
index 0000000..2ec0353
Binary files /dev/null and b/public/packages/barryvdh/laravel-debugbar/laravel-icon.png differ
diff --git a/public/packages/maximebf/php-debugbar/debugbar.css b/public/packages/maximebf/php-debugbar/debugbar.css
new file mode 100644
index 0000000..1da6937
--- /dev/null
+++ b/public/packages/maximebf/php-debugbar/debugbar.css
@@ -0,0 +1,225 @@
+div.phpdebugbar {
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ border-top: 0;
+ font-family: arial, sans-serif;
+ background: #fff;
+ z-index: 10000;
+ font-size: 14px;
+ color: #000;
+ text-align: left;
+}
+
+div.phpdebugbar-closed {
+ width: auto;
+}
+
+div.phpdebugbar * {
+
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+}
+
+a.phpdebugbar-restore-btn {
+ float: left;
+ padding: 5px 8px;
+ font-size: 14px;
+ color: #555;
+ text-decoration: none;
+ border-right: 1px solid #ddd;
+}
+
+div.phpdebugbar-resize-handle {
+ display: none;
+ height: 4px;
+ margin-top: -4px;
+ width: 100%;
+ background: none;
+ border-bottom: 1px solid #ccc;
+ cursor: n-resize;
+}
+
+div.phpdebugbar-closed, div.phpdebugbar-minimized{
+ border-top: 1px solid #ccc;
+}
+
+/* -------------------------------------- */
+
+div.phpdebugbar-header {
+ background: #efefef url(php-icon.png) no-repeat 5px 4px;
+ padding-left: 29px;
+ min-height: 26px;
+ line-height: 16px;
+}
+div.phpdebugbar-header:before, div.phpdebugbar-header:after {
+ display: table;
+ line-height: 0;
+ content: "";
+}
+div.phpdebugbar-header:after {
+ clear: both;
+}
+div.phpdebugbar-header-left {
+ float: left;
+}
+div.phpdebugbar-header-right {
+ float: right;
+}
+div.phpdebugbar-header > div > * {
+ padding: 5px 8px;
+ font-size: 14px;
+ color: #555;
+ text-decoration: none;
+}
+div.phpdebugbar-header-left > * {
+ float: left;
+}
+div.phpdebugbar-header-right > * {
+ float: right;
+}
+div.phpdebugbar-header-right > select {
+ padding: 0;
+}
+
+/* -------------------------------------- */
+
+span.phpdebugbar-indicator,
+a.phpdebugbar-indicator,
+a.phpdebugbar-close-btn {
+ border-right: 1px solid #ddd;
+}
+
+a.phpdebugbar-tab.phpdebugbar-active {
+ background: #ccc;
+ color: #444;
+ background-image: linear-gradient(bottom, rgb(173,173,173) 41%, rgb(209,209,209) 71%);
+ background-image: -o-linear-gradient(bottom, rgb(173,173,173) 41%, rgb(209,209,209) 71%);
+ background-image: -moz-linear-gradient(bottom, rgb(173,173,173) 41%, rgb(209,209,209) 71%);
+ background-image: -webkit-linear-gradient(bottom, rgb(173,173,173) 41%, rgb(209,209,209) 71%);
+ background-image: -ms-linear-gradient(bottom, rgb(173,173,173) 41%, rgb(209,209,209) 71%);
+ background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0.41, rgb(173,173,173)), color-stop(0.71, rgb(209,209,209)));
+}
+ a.phpdebugbar-tab span.phpdebugbar-badge {
+ display: none;
+ margin-left: 5px;
+ font-size: 11px;
+ line-height: 14px;
+ padding: 0px 6px;
+ background: #ccc;
+ border-radius: 4px;
+ color: #555;
+ font-weight: normal;
+ text-shadow: none;
+ vertical-align: middle;
+ }
+ a.phpdebugbar-tab i {
+ display: none;
+ vertical-align: middle;
+ }
+ a.phpdebugbar-tab span.phpdebugbar-badge.phpdebugbar-important {
+ background: #ed6868;
+ color: white;
+ }
+
+a.phpdebugbar-close-btn {
+ background: url(icons.png) no-repeat 10px 7px;
+ width: 16px;
+ height: 16px;
+}
+
+a.phpdebugbar-open-btn {
+ background: url(icons.png) no-repeat -14px 8px;
+ width: 16px;
+ height: 16px;
+}
+
+a.phpdebugbar-restore-btn {
+ background: #efefef url(php-icon.png) no-repeat 5px 4px;
+ width: 16px;
+ height: 16px;
+}
+
+.phpdebugbar-indicator {
+ position: relative;
+ cursor: pointer;
+}
+ .phpdebugbar-indicator span.phpdebugbar-text {
+ margin-left: 5px;
+ }
+ .phpdebugbar-indicator span.phpdebugbar-tooltip {
+ display: none;
+ position: absolute;
+ top: -30px;
+ background: #efefef;
+ opacity: .7;
+ border: 1px solid #ccc;
+ color: #555;
+ font-size: 11px;
+ padding: 2px 3px;
+ z-index: 1000;
+ text-align: center;
+ width: 200%;
+ right: 0;
+ }
+ .phpdebugbar-indicator:hover span.phpdebugbar-tooltip:not(.phpdebugbar-disabled) {
+ display: block;
+ }
+
+select.phpdebugbar-datasets-switcher {
+ float: right;
+ display: none;
+ margin: 2px 0 0 7px;
+ max-width: 200px;
+ max-height: 23px;
+ padding: 0;
+}
+
+/* -------------------------------------- */
+
+div.phpdebugbar-body {
+ border-top: 1px solid #ccc;
+ display: none;
+ position: relative;
+ height: 300px;
+}
+
+/* -------------------------------------- */
+
+div.phpdebugbar-panel {
+ display: none;
+ height: 100%;
+ overflow: auto;
+ width: 100%;
+}
+div.phpdebugbar-panel.phpdebugbar-active {
+ display: block;
+}
+
+/* -------------------------------------- */
+
+div.phpdebugbar-mini-design a.phpdebugbar-tab {
+ position: relative;
+ border-right: 1px solid #ddd;
+}
+ div.phpdebugbar-mini-design a.phpdebugbar-tab span.phpdebugbar-text {
+ display: none;
+ }
+ div.phpdebugbar-mini-design a.phpdebugbar-tab:hover span.phpdebugbar-text {
+ display: block;
+ position: absolute;
+ top: -30px;
+ background: #efefef;
+ opacity: .7;
+ border: 1px solid #ccc;
+ color: #555;
+ font-size: 11px;
+ padding: 2px 3px;
+ z-index: 1000;
+ text-align: center;
+ right: 0;
+ }
+ div.phpdebugbar-mini-design a.phpdebugbar-tab i {
+ display:inline-block;
+ }
diff --git a/public/packages/maximebf/php-debugbar/debugbar.js b/public/packages/maximebf/php-debugbar/debugbar.js
new file mode 100644
index 0000000..23cf5ce
--- /dev/null
+++ b/public/packages/maximebf/php-debugbar/debugbar.js
@@ -0,0 +1,1080 @@
+if (typeof(PhpDebugBar) == 'undefined') {
+ // namespace
+ var PhpDebugBar = {};
+ PhpDebugBar.$ = jQuery;
+}
+
+(function($) {
+
+ if (typeof(localStorage) == 'undefined') {
+ // provide mock localStorage object for dumb browsers
+ localStorage = {
+ setItem: function(key, value) {},
+ getItem: function(key) { return null; }
+ };
+ }
+
+ if (typeof(PhpDebugBar.utils) == 'undefined') {
+ PhpDebugBar.utils = {};
+ }
+
+ /**
+ * Returns the value from an object property.
+ * Using dots in the key, it is possible to retrieve nested property values
+ *
+ * @param {Object} dict
+ * @param {String} key
+ * @param {Object} default_value
+ * @return {Object}
+ */
+ var getDictValue = PhpDebugBar.utils.getDictValue = function(dict, key, default_value) {
+ var d = dict, parts = key.split('.');
+ for (var i = 0; i < parts.length; i++) {
+ if (!d[parts[i]]) {
+ return default_value;
+ }
+ d = d[parts[i]];
+ }
+ return d;
+ }
+
+ /**
+ * Counts the number of properties in an object
+ *
+ * @param {Object} obj
+ * @return {Integer}
+ */
+ var getObjectSize = PhpDebugBar.utils.getObjectSize = function(obj) {
+ if (Object.keys) {
+ return Object.keys(obj).length;
+ }
+ var count = 0;
+ for (var k in obj) {
+ if (obj.hasOwnProperty(k)) {
+ count++;
+ }
+ }
+ return count;
+ }
+
+ /**
+ * Returns a prefixed css class name
+ *
+ * @param {String} cls
+ * @return {String}
+ */
+ PhpDebugBar.utils.csscls = function(cls, prefix) {
+ if (cls.indexOf(' ') > -1) {
+ var clss = cls.split(' '), out = [];
+ for (var i = 0, c = clss.length; i < c; i++) {
+ out.push(PhpDebugBar.utils.csscls(clss[i], prefix));
+ }
+ return out.join(' ');
+ }
+ if (cls.indexOf('.') === 0) {
+ return '.' + prefix + cls.substr(1);
+ }
+ return prefix + cls;
+ };
+
+ /**
+ * Creates a partial function of csscls where the second
+ * argument is already defined
+ *
+ * @param {string} prefix
+ * @return {Function}
+ */
+ PhpDebugBar.utils.makecsscls = function(prefix) {
+ var f = function(cls) {
+ return PhpDebugBar.utils.csscls(cls, prefix);
+ };
+ return f;
+ }
+
+ var csscls = PhpDebugBar.utils.makecsscls('phpdebugbar-');
+
+
+ // ------------------------------------------------------------------
+
+ /**
+ * Base class for all elements with a visual component
+ *
+ * @param {Object} options
+ * @constructor
+ */
+ var Widget = PhpDebugBar.Widget = function(options) {
+ this._attributes = $.extend({}, this.defaults);
+ this._boundAttributes = {};
+ this.$el = $('<' + this.tagName + ' />');
+ if (this.className) {
+ this.$el.addClass(this.className);
+ }
+ this.initialize.apply(this, [options || {}]);
+ this.render.apply(this);
+ };
+
+ $.extend(Widget.prototype, {
+
+ tagName: 'div',
+
+ className: null,
+
+ defaults: {},
+
+ /**
+ * Called after the constructor
+ *
+ * @param {Object} options
+ */
+ initialize: function(options) {
+ this.set(options);
+ },
+
+ /**
+ * Called after the constructor to render the element
+ */
+ render: function() {},
+
+ /**
+ * Sets the value of an attribute
+ *
+ * @param {String} attr Can also be an object to set multiple attributes at once
+ * @param {Object} value
+ */
+ set: function(attr, value) {
+ if (typeof(attr) != 'string') {
+ for (var k in attr) {
+ this.set(k, attr[k]);
+ }
+ return;
+ }
+
+ this._attributes[attr] = value;
+ if (typeof(this._boundAttributes[attr]) !== 'undefined') {
+ for (var i = 0, c = this._boundAttributes[attr].length; i < c; i++) {
+ this._boundAttributes[attr][i].apply(this, [value]);
+ }
+ }
+ },
+
+ /**
+ * Checks if an attribute exists and is not null
+ *
+ * @param {String} attr
+ * @return {[type]} [description]
+ */
+ has: function(attr) {
+ return typeof(this._attributes[attr]) !== 'undefined' && this._attributes[attr] !== null;
+ },
+
+ /**
+ * Returns the value of an attribute
+ *
+ * @param {String} attr
+ * @return {Object}
+ */
+ get: function(attr) {
+ return this._attributes[attr];
+ },
+
+ /**
+ * Registers a callback function that will be called whenever the value of the attribute changes
+ *
+ * If cb is a jQuery element, text() will be used to fill the element
+ *
+ * @param {String} attr
+ * @param {Function} cb
+ */
+ bindAttr: function(attr, cb) {
+ if ($.isArray(attr)) {
+ for (var i = 0, c = attr.length; i < c; i++) {
+ this.bindAttr(attr[i], cb);
+ }
+ return;
+ }
+
+ if (typeof(this._boundAttributes[attr]) == 'undefined') {
+ this._boundAttributes[attr] = [];
+ }
+ if (typeof(cb) == 'object') {
+ var el = cb;
+ cb = function(value) { el.text(value || ''); };
+ }
+ this._boundAttributes[attr].push(cb);
+ if (this.has(attr)) {
+ cb.apply(this, [this._attributes[attr]]);
+ }
+ }
+
+ });
+
+
+ /**
+ * Creates a subclass
+ *
+ * Code from Backbone.js
+ *
+ * @param {Array} props Prototype properties
+ * @return {Function}
+ */
+ Widget.extend = function(props) {
+ var parent = this;
+
+ var child = function() { return parent.apply(this, arguments); };
+ $.extend(child, parent);
+
+ var Surrogate = function(){ this.constructor = child; };
+ Surrogate.prototype = parent.prototype;
+ child.prototype = new Surrogate;
+ $.extend(child.prototype, props);
+
+ child.__super__ = parent.prototype;
+
+ return child;
+ };
+
+ // ------------------------------------------------------------------
+
+ /**
+ * Tab
+ *
+ * A tab is composed of a tab label which is always visible and
+ * a tab panel which is visible only when the tab is active.
+ *
+ * The panel must contain a widget. A widget is an object which has
+ * an element property containing something appendable to a jQuery object.
+ *
+ * Options:
+ * - title
+ * - badge
+ * - widget
+ * - data: forward data to widget data
+ */
+ var Tab = Widget.extend({
+
+ className: csscls('panel'),
+
+ render: function() {
+ this.$tab = $(' ').addClass(csscls('tab'));
+
+ this.$icon = $(' ').appendTo(this.$tab);
+ this.bindAttr('icon', function(icon) {
+ if (icon) {
+ this.$icon.attr('class', 'fa fa-' + icon);
+ } else {
+ this.$icon.attr('class', '');
+ }
+ });
+
+ this.bindAttr('title', $(' ').addClass(csscls('text')).appendTo(this.$tab));
+
+ this.$badge = $(' ').addClass(csscls('badge')).appendTo(this.$tab);
+ this.bindAttr('badge', function(value) {
+ if (value !== null) {
+ this.$badge.text(value);
+ this.$badge.show();
+ } else {
+ this.$badge.hide();
+ }
+ });
+
+ this.bindAttr('widget', function(widget) {
+ this.$el.empty().append(widget.$el);
+ });
+
+ this.bindAttr('data', function(data) {
+ if (this.has('widget')) {
+ this.get('widget').set('data', data);
+ }
+ })
+ }
+
+ });
+
+ // ------------------------------------------------------------------
+
+ /**
+ * Indicator
+ *
+ * An indicator is a text and an icon to display single value information
+ * right inside the always visible part of the debug bar
+ *
+ * Options:
+ * - icon
+ * - title
+ * - tooltip
+ * - data: alias of title
+ */
+ var Indicator = Widget.extend({
+
+ tagName: 'span',
+
+ className: csscls('indicator'),
+
+ render: function() {
+ this.$icon = $(' ').appendTo(this.$el);
+ this.bindAttr('icon', function(icon) {
+ if (icon) {
+ this.$icon.attr('class', 'fa fa-' + icon);
+ } else {
+ this.$icon.attr('class', '');
+ }
+ });
+
+ this.bindAttr(['title', 'data'], $(' ').addClass(csscls('text')).appendTo(this.$el));
+
+ this.$tooltip = $(' ').addClass(csscls('tooltip disabled')).appendTo(this.$el);
+ this.bindAttr('tooltip', function(tooltip) {
+ if (tooltip) {
+ this.$tooltip.text(tooltip).removeClass(csscls('disabled'));
+ } else {
+ this.$tooltip.addClass(csscls('disabled'));
+ }
+ });
+ }
+
+ });
+
+ // ------------------------------------------------------------------
+
+ /**
+ * Dataset title formater
+ *
+ * Formats the title of a dataset for the select box
+ */
+ var DatasetTitleFormater = PhpDebugBar.DatasetTitleFormater = function(debugbar) {
+ this.debugbar = debugbar;
+ };
+
+ $.extend(DatasetTitleFormater.prototype, {
+
+ /**
+ * Formats the title of a dataset
+ *
+ * @this {DatasetTitleFormater}
+ * @param {String} id
+ * @param {Object} data
+ * @param {String} suffix
+ * @return {String}
+ */
+ format: function(id, data, suffix) {
+ if (suffix) {
+ suffix = ' ' + suffix;
+ } else {
+ suffix = '';
+ }
+
+ var nb = getObjectSize(this.debugbar.datasets) + 1;
+
+ if (typeof(data['__meta']) === 'undefined') {
+ return "#" + nb + suffix;
+ }
+
+ var filename = data['__meta']['uri'].substr(data['__meta']['uri'].lastIndexOf('/') + 1);
+ var label = "#" + nb + " " + filename + suffix + ' (' + data['__meta']['datetime'].split(' ')[1] + ')';
+ return label;
+ }
+
+ });
+
+ // ------------------------------------------------------------------
+
+
+ /**
+ * DebugBar
+ *
+ * Creates a bar that appends itself to the body of your page
+ * and sticks to the bottom.
+ *
+ * The bar can be customized by adding tabs and indicators.
+ * A data map is used to fill those controls with data provided
+ * from datasets.
+ */
+ var DebugBar = PhpDebugBar.DebugBar = Widget.extend({
+
+ className: "phpdebugbar " + csscls('minimized'),
+
+ options: {
+ bodyPaddingBottom: true
+ },
+
+ initialize: function() {
+ this.controls = {};
+ this.dataMap = {};
+ this.datasets = {};
+ this.firstTabName = null;
+ this.activePanelName = null;
+ this.datesetTitleFormater = new DatasetTitleFormater(this);
+ this.registerResizeHandler();
+ },
+
+ /**
+ * Register resize event, for resize debugbar with reponsive css.
+ *
+ * @this {DebugBar}
+ */
+ registerResizeHandler: function() {
+ var f = this.resize.bind(this);
+ this.respCSSSize = 0;
+ $(window).resize(f);
+ setTimeout(f, 20);
+ },
+
+ /**
+ * Resizes the debugbar to fit the current browser window
+ */
+ resize: function() {
+ var contentSize = this.respCSSSize;
+ if (this.respCSSSize == 0) {
+ this.$header.find("> div > *:visible").each(function () {
+ contentSize += $(this).outerWidth();
+ });
+ }
+
+ var currentSize = this.$header.width();
+ var cssClass = "phpdebugbar-mini-design";
+ var bool = this.$header.hasClass(cssClass);
+
+ if (currentSize <= contentSize && !bool) {
+ this.respCSSSize = contentSize;
+ this.$header.addClass(cssClass);
+ } else if (contentSize < currentSize && bool) {
+ this.respCSSSize = 0;
+ this.$header.removeClass(cssClass);
+ }
+ },
+
+ /**
+ * Initialiazes the UI
+ *
+ * @this {DebugBar}
+ */
+ render: function() {
+ var self = this;
+ this.$el.appendTo('body');
+ this.$resizehdle = $('
').addClass(csscls('resize-handle')).appendTo(this.$el);
+ this.$header = $('
').addClass(csscls('header')).appendTo(this.$el);
+ this.$headerLeft = $('
').addClass(csscls('header-left')).appendTo(this.$header);
+ this.$headerRight = $('
').addClass(csscls('header-right')).appendTo(this.$header);
+ var $body = this.$body = $('
').addClass(csscls('body')).appendTo(this.$el);
+ this.recomputeBottomOffset();
+
+ // dragging of resize handle
+ var dragging = false;
+ this.$resizehdle.on('mousedown', function(e) {
+ var orig_h = $body.height(), pos_y = e.pageY;
+ dragging = true;
+
+ $body.parents().on('mousemove', function(e) {
+ if (dragging) {
+ var h = orig_h + (pos_y - e.pageY);
+ $body.css('height', h);
+ localStorage.setItem('phpdebugbar-height', h);
+ self.recomputeBottomOffset();
+ }
+ }).on('mouseup', function() {
+ dragging = false;
+ });
+
+ e.preventDefault();
+ });
+
+ // minimize button
+ this.$closebtn = $(' ').addClass(csscls('close-btn')).appendTo(this.$headerRight);
+ this.$closebtn.click(function() {
+ self.close();
+ });
+
+ // minimize button
+ this.$restorebtn = $(' ').addClass(csscls('restore-btn')).hide().appendTo(this.$el);
+ this.$restorebtn.click(function() {
+ self.restore();
+ });
+
+ // open button
+ this.$openbtn = $(' ').addClass(csscls('open-btn')).appendTo(this.$headerRight).hide();
+ this.$openbtn.click(function() {
+ self.openHandler.show(function(id, dataset) {
+ self.addDataSet(dataset, id, "(opened)");
+ self.showTab();
+ });
+ });
+
+ // select box for data sets
+ this.$datasets = $(' ').addClass(csscls('datasets-switcher')).appendTo(this.$headerRight);
+ this.$datasets.change(function() {
+ self.dataChangeHandler(self.datasets[this.value]);
+ self.showTab();
+ });
+ },
+
+ /**
+ * Restores the state of the DebugBar using localStorage
+ * This is not called by default in the constructor and
+ * needs to be called by subclasses in their init() method
+ *
+ * @this {DebugBar}
+ */
+ restoreState: function() {
+ // bar height
+ var height = localStorage.getItem('phpdebugbar-height');
+ if (height) {
+ this.$body.css('height', height);
+ } else {
+ localStorage.setItem('phpdebugbar-height', this.$body.height());
+ }
+
+ // bar visibility
+ var open = localStorage.getItem('phpdebugbar-open');
+ if (open && open == '0') {
+ this.close();
+ } else {
+ var visible = localStorage.getItem('phpdebugbar-visible');
+ if (visible && visible == '1') {
+ var tab = localStorage.getItem('phpdebugbar-tab');
+ if (this.isTab(tab)) {
+ this.showTab(tab);
+ }
+ }
+ }
+ },
+
+ /**
+ * Creates and adds a new tab
+ *
+ * @this {DebugBar}
+ * @param {String} name Internal name
+ * @param {Object} widget A widget object with an element property
+ * @param {String} title The text in the tab, if not specified, name will be used
+ * @return {Tab}
+ */
+ createTab: function(name, widget, title) {
+ var tab = new Tab({
+ title: title || (name.replace(/[_\-]/g, ' ').charAt(0).toUpperCase() + name.slice(1)),
+ widget: widget
+ });
+ return this.addTab(name, tab);
+ },
+
+ /**
+ * Adds a new tab
+ *
+ * @this {DebugBar}
+ * @param {String} name Internal name
+ * @param {Tab} tab Tab object
+ * @return {Tab}
+ */
+ addTab: function(name, tab) {
+ if (this.isControl(name)) {
+ throw new Error(name + ' already exists');
+ }
+
+ var self = this;
+ tab.$tab.appendTo(this.$headerLeft).click(function() {
+ if (!self.isMinimized() && self.activePanelName == name) {
+ self.minimize();
+ } else {
+ self.showTab(name);
+ }
+ });
+ tab.$el.appendTo(this.$body);
+
+ this.controls[name] = tab;
+ if (this.firstTabName == null) {
+ this.firstTabName = name;
+ }
+ return tab;
+ },
+
+ /**
+ * Creates and adds an indicator
+ *
+ * @this {DebugBar}
+ * @param {String} name Internal name
+ * @param {String} icon
+ * @param {String} tooltip
+ * @param {String} position "right" or "left", default is "right"
+ * @return {Indicator}
+ */
+ createIndicator: function(name, icon, tooltip, position) {
+ var indicator = new Indicator({
+ icon: icon,
+ tooltip: tooltip
+ });
+ return this.addIndicator(name, indicator, position);
+ },
+
+ /**
+ * Adds an indicator
+ *
+ * @this {DebugBar}
+ * @param {String} name Internal name
+ * @param {Indicator} indicator Indicator object
+ * @return {Indicator}
+ */
+ addIndicator: function(name, indicator, position) {
+ if (this.isControl(name)) {
+ throw new Error(name + ' already exists');
+ }
+
+ if (position == 'left') {
+ indicator.$el.insertBefore(this.$headerLeft.children().first());
+ } else {
+ indicator.$el.appendTo(this.$headerRight);
+ }
+
+ this.controls[name] = indicator;
+ return indicator;
+ },
+
+ /**
+ * Returns a control
+ *
+ * @param {String} name
+ * @return {Object}
+ */
+ getControl: function(name) {
+ if (this.isControl(name)) {
+ return this.controls[name];
+ }
+ },
+
+ /**
+ * Checks if there's a control under the specified name
+ *
+ * @this {DebugBar}
+ * @param {String} name
+ * @return {Boolean}
+ */
+ isControl: function(name) {
+ return typeof(this.controls[name]) != 'undefined';
+ },
+
+ /**
+ * Checks if a tab with the specified name exists
+ *
+ * @this {DebugBar}
+ * @param {String} name
+ * @return {Boolean}
+ */
+ isTab: function(name) {
+ return this.isControl(name) && this.controls[name] instanceof Tab;
+ },
+
+ /**
+ * Checks if an indicator with the specified name exists
+ *
+ * @this {DebugBar}
+ * @param {String} name
+ * @return {Boolean}
+ */
+ isIndicator: function(name) {
+ return this.isControl(name) && this.controls[name] instanceof Indicator;
+ },
+
+ /**
+ * Removes all tabs and indicators from the debug bar and hides it
+ *
+ * @this {DebugBar}
+ */
+ reset: function() {
+ this.minimize();
+ var self = this;
+ $.each(this.controls, function(name, control) {
+ if (self.isTab(name)) {
+ control.$tab.remove();
+ }
+ control.$el.remove();
+ });
+ this.controls = {};
+ },
+
+ /**
+ * Open the debug bar and display the specified tab
+ *
+ * @this {DebugBar}
+ * @param {String} name If not specified, display the first tab
+ */
+ showTab: function(name) {
+ if (!name) {
+ if (this.activePanelName) {
+ name = this.activePanelName;
+ } else {
+ name = this.firstTabName;
+ }
+ }
+
+ if (!this.isTab(name)) {
+ throw new Error("Unknown tab '" + name + "'");
+ }
+
+ this.$resizehdle.show();
+ this.$body.show();
+ this.recomputeBottomOffset();
+
+ $(this.$header).find('> div > .' + csscls('active')).removeClass(csscls('active'));
+ $(this.$body).find('> .' + csscls('active')).removeClass(csscls('active'));
+
+ this.controls[name].$tab.addClass(csscls('active'));
+ this.controls[name].$el.addClass(csscls('active'));
+ this.activePanelName = name;
+
+ this.$el.removeClass(csscls('minimized'));
+ localStorage.setItem('phpdebugbar-visible', '1');
+ localStorage.setItem('phpdebugbar-tab', name);
+ this.resize();
+ },
+
+ /**
+ * Hide panels and minimize the debug bar
+ *
+ * @this {DebugBar}
+ */
+ minimize: function() {
+ this.$header.find('> div > .' + csscls('active')).removeClass(csscls('active'));
+ this.$body.hide();
+ this.$resizehdle.hide();
+ this.recomputeBottomOffset();
+ localStorage.setItem('phpdebugbar-visible', '0');
+ this.$el.addClass(csscls('minimized'));
+ this.resize();
+ },
+
+ /**
+ * Checks if the panel is minimized
+ *
+ * @return {Boolean}
+ */
+ isMinimized: function() {
+ return this.$el.hasClass(csscls('minimized'));
+ },
+
+ /**
+ * Close the debug bar
+ *
+ * @this {DebugBar}
+ */
+ close: function() {
+ this.$resizehdle.hide();
+ this.$header.hide();
+ this.$body.hide();
+ this.$restorebtn.show();
+ localStorage.setItem('phpdebugbar-open', '0');
+ this.$el.addClass(csscls('closed'));
+ this.recomputeBottomOffset();
+ },
+
+ /**
+ * Restore the debug bar
+ *
+ * @this {DebugBar}
+ */
+ restore: function() {
+ this.$resizehdle.show();
+ this.$header.show();
+ this.$restorebtn.hide();
+ localStorage.setItem('phpdebugbar-open', '1');
+ var tab = localStorage.getItem('phpdebugbar-tab');
+ if (this.isTab(tab)) {
+ this.showTab(tab);
+ }
+ this.$el.removeClass(csscls('closed'));
+ this.resize();
+ },
+
+ /**
+ * Recomputes the padding-bottom css property of the body so
+ * that the debug bar never hides any content
+ */
+ recomputeBottomOffset: function() {
+ if (this.options.bodyPaddingBottom) {
+ $('body').css('padding-bottom', this.$el.height());
+ }
+ },
+
+ /**
+ * Sets the data map used by dataChangeHandler to populate
+ * indicators and widgets
+ *
+ * A data map is an object where properties are control names.
+ * The value of each property should be an array where the first
+ * item is the name of a property from the data object (nested properties
+ * can be specified) and the second item the default value.
+ *
+ * Example:
+ * {"memory": ["memory.peak_usage_str", "0B"]}
+ *
+ * @this {DebugBar}
+ * @param {Object} map
+ */
+ setDataMap: function(map) {
+ this.dataMap = map;
+ },
+
+ /**
+ * Same as setDataMap() but appends to the existing map
+ * rather than replacing it
+ *
+ * @this {DebugBar}
+ * @param {Object} map
+ */
+ addDataMap: function(map) {
+ $.extend(this.dataMap, map);
+ },
+
+ /**
+ * Resets datasets and add one set of data
+ *
+ * For this method to be usefull, you need to specify
+ * a dataMap using setDataMap()
+ *
+ * @this {DebugBar}
+ * @param {Object} data
+ * @return {String} Dataset's id
+ */
+ setData: function(data) {
+ this.datasets = {};
+ return this.addDataSet(data);
+ },
+
+ /**
+ * Adds a dataset
+ *
+ * If more than one dataset are added, the dataset selector
+ * will be displayed.
+ *
+ * For this method to be usefull, you need to specify
+ * a dataMap using setDataMap()
+ *
+ * @this {DebugBar}
+ * @param {Object} data
+ * @param {String} id The name of this set, optional
+ * @param {String} suffix
+ * @return {String} Dataset's id
+ */
+ addDataSet: function(data, id, suffix) {
+ var label = this.datesetTitleFormater.format(id, data, suffix);
+ id = id || (getObjectSize(this.datasets) + 1);
+ this.datasets[id] = data;
+
+ this.$datasets.append($('' + label + ' '));
+ if (this.$datasets.children().length > 1) {
+ this.$datasets.show();
+ }
+
+ this.showDataSet(id);
+ return id;
+ },
+
+ /**
+ * Loads a dataset using the open handler
+ *
+ * @param {String} id
+ */
+ loadDataSet: function(id, suffix, callback) {
+ if (!this.openHandler) {
+ throw new Error('loadDataSet() needs an open handler');
+ }
+ var self = this;
+ this.openHandler.load(id, function(data) {
+ self.addDataSet(data, id, suffix);
+ callback && callback(data);
+ });
+ },
+
+ /**
+ * Returns the data from a dataset
+ *
+ * @this {DebugBar}
+ * @param {String} id
+ * @return {Object}
+ */
+ getDataSet: function(id) {
+ return this.datasets[id];
+ },
+
+ /**
+ * Switch the currently displayed dataset
+ *
+ * @this {DebugBar}
+ * @param {String} id
+ */
+ showDataSet: function(id) {
+ this.dataChangeHandler(this.datasets[id]);
+ this.$datasets.val(id);
+ },
+
+ /**
+ * Called when the current dataset is modified.
+ *
+ * @this {DebugBar}
+ * @param {Object} data
+ */
+ dataChangeHandler: function(data) {
+ var self = this;
+ $.each(this.dataMap, function(key, def) {
+ var d = getDictValue(data, def[0], def[1]);
+ if (key.indexOf(':') != -1) {
+ key = key.split(':');
+ self.getControl(key[0]).set(key[1], d);
+ } else {
+ self.getControl(key).set('data', d);
+ }
+ });
+ },
+
+ /**
+ * Sets the handler to open past dataset
+ *
+ * @this {DebugBar}
+ * @param {object} handler
+ */
+ setOpenHandler: function(handler) {
+ this.openHandler = handler;
+ if (handler !== null) {
+ this.$openbtn.show();
+ } else {
+ this.$openbtn.hide();
+ }
+ },
+
+ /**
+ * Returns the handler to open past dataset
+ *
+ * @this {DebugBar}
+ * @return {object}
+ */
+ getOpenHandler: function() {
+ return this.openHandler;
+ }
+
+ });
+
+ DebugBar.Tab = Tab;
+ DebugBar.Indicator = Indicator;
+
+ // ------------------------------------------------------------------
+
+ /**
+ * AjaxHandler
+ *
+ * Extract data from headers of an XMLHttpRequest and adds a new dataset
+ */
+ var AjaxHandler = PhpDebugBar.AjaxHandler = function(debugbar, headerName) {
+ this.debugbar = debugbar;
+ this.headerName = headerName || 'phpdebugbar';
+ };
+
+ $.extend(AjaxHandler.prototype, {
+
+ /**
+ * Handles an XMLHttpRequest
+ *
+ * @this {AjaxHandler}
+ * @param {XMLHttpRequest} xhr
+ * @return {Bool}
+ */
+ handle: function(xhr) {
+ if (!this.loadFromId(xhr)) {
+ return this.loadFromData(xhr);
+ }
+ return true;
+ },
+
+ /**
+ * Checks if the HEADER-id exists and loads the dataset using the open handler
+ *
+ * @param {XMLHttpRequest} xhr
+ * @return {Bool}
+ */
+ loadFromId: function(xhr) {
+ var id = this.extractIdFromHeaders(xhr);
+ if (id && this.debugbar.openHandler) {
+ this.debugbar.loadDataSet(id, "(ajax)");
+ return true;
+ }
+ return false;
+ },
+
+ /**
+ * Extracts the id from the HEADER-id
+ *
+ * @param {XMLHttpRequest} xhr
+ * @return {String}
+ */
+ extractIdFromHeaders: function(xhr) {
+ return xhr.getResponseHeader(this.headerName + '-id');
+ },
+
+ /**
+ * Checks if the HEADER exists and loads the dataset
+ *
+ * @param {XMLHttpRequest} xhr
+ * @return {Bool}
+ */
+ loadFromData: function(xhr) {
+ var raw = this.extractDataFromHeaders(xhr);
+ if (!raw) {
+ return false;
+ }
+
+ var data = this.parseHeaders(raw);
+ if (data.error) {
+ throw new Error('Error loading debugbar data: ' + data.error);
+ } else if(data.data) {
+ this.debugbar.addDataSet(data.data, data.id, "(ajax)");
+ }
+ return true;
+ },
+
+ /**
+ * Extract the data as a string from headers of an XMLHttpRequest
+ *
+ * @this {AjaxHandler}
+ * @param {XMLHttpRequest} xhr
+ * @return {string}
+ */
+ extractDataFromHeaders: function(xhr) {
+ var data = xhr.getResponseHeader(this.headerName);
+ if (!data) {
+ return;
+ }
+ for (var i = 1;; i++) {
+ var header = xhr.getResponseHeader(this.headerName + '-' + i);
+ if (!header) {
+ break;
+ }
+ data += header;
+ }
+ return decodeURIComponent(data);
+ },
+
+ /**
+ * Parses the string data into an object
+ *
+ * @this {AjaxHandler}
+ * @param {string} data
+ * @return {string}
+ */
+ parseHeaders: function(data) {
+ return JSON.parse(data);
+ },
+
+ /**
+ * Attaches an event listener to jQuery.ajaxComplete()
+ *
+ * @this {AjaxHandler}
+ * @param {jQuery} jq Optional
+ */
+ bindToJquery: function(jq) {
+ var self = this;
+ jq(document).ajaxComplete(function(e, xhr, settings) {
+ if (!settings.ignoreDebugBarAjaxHandler) {
+ self.handle(xhr);
+ }
+ });
+ }
+
+ });
+
+})(PhpDebugBar.$);
diff --git a/public/packages/maximebf/php-debugbar/icons.png b/public/packages/maximebf/php-debugbar/icons.png
new file mode 100644
index 0000000..5dc6d9c
Binary files /dev/null and b/public/packages/maximebf/php-debugbar/icons.png differ
diff --git a/public/packages/maximebf/php-debugbar/openhandler.css b/public/packages/maximebf/php-debugbar/openhandler.css
new file mode 100644
index 0000000..77c6fad
--- /dev/null
+++ b/public/packages/maximebf/php-debugbar/openhandler.css
@@ -0,0 +1,60 @@
+div.phpdebugbar-openhandler-overlay {
+ position: fixed;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ background: #000;
+ opacity: .3;
+ z-index: 20000;
+}
+
+div.phpdebugbar-openhandler {
+ position: fixed;
+ margin: auto;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ width: 70%;
+ height: 70%;
+ background: #fff;
+ border: 2px solid #888;
+ overflow: auto;
+ z-index: 20001;
+ font-family: arial;
+ font-size: 14px;
+ padding-bottom: 10px;
+}
+ div.phpdebugbar-openhandler .phpdebugbar-openhandler-header {
+ background: #efefef url(php-icon.png) no-repeat 5px 4px;
+ padding-left: 29px;
+ min-height: 26px;
+ line-height: 25px;
+ color: #555;
+ margin-bottom: 10px;
+ }
+ div.phpdebugbar-openhandler .phpdebugbar-openhandler-header a {
+ font-size: 14px;
+ color: #555;
+ text-decoration: none;
+ float: right;
+ padding: 5px 8px;
+ }
+ div.phpdebugbar-openhandler table {
+ width: 100%;
+ font-size: 14px;
+ }
+ div.phpdebugbar-openhandler table td {
+ padding: 6px 3px;
+ text-align: center;
+ border-bottom: 1px solid #ddd;
+ }
+ div.phpdebugbar-openhandler .phpdebugbar-openhandler-actions {
+ text-align: center;
+ padding: 7px 0;
+ }
+ div.phpdebugbar-openhandler .phpdebugbar-openhandler-actions a {
+ margin: 0 10px;
+ color: #555;
+ }
diff --git a/public/packages/maximebf/php-debugbar/openhandler.js b/public/packages/maximebf/php-debugbar/openhandler.js
new file mode 100644
index 0000000..52eff30
--- /dev/null
+++ b/public/packages/maximebf/php-debugbar/openhandler.js
@@ -0,0 +1,191 @@
+if (typeof(PhpDebugBar) == 'undefined') {
+ // namespace
+ var PhpDebugBar = {};
+ PhpDebugBar.$ = jQuery;
+}
+
+(function($) {
+
+ var csscls = function(cls) {
+ return PhpDebugBar.utils.csscls(cls, 'phpdebugbar-openhandler-');
+ };
+
+ PhpDebugBar.OpenHandler = PhpDebugBar.Widget.extend({
+
+ className: 'phpdebugbar-openhandler',
+
+ defaults: {
+ items_per_page: 20
+ },
+
+ render: function() {
+ var self = this;
+
+ this.$el.appendTo('body').hide();
+ this.$closebtn = $(' ');
+ this.$table = $(' ');
+ $('PHP DebugBar | Open
').addClass(csscls('header')).append(this.$closebtn).appendTo(this.$el);
+ $('').append(this.$table).appendTo(this.$el);
+ this.$actions = $('
').addClass(csscls('actions')).appendTo(this.$el);
+
+ this.$closebtn.on('click', function() {
+ self.hide();
+ });
+
+ this.$loadmorebtn = $('Load more ')
+ .appendTo(this.$actions)
+ .on('click', function() {
+ self.find(self.last_find_request, self.last_find_request.offset + self.get('items_per_page'), self.handleFind.bind(self));
+ });
+
+ this.$showonlycurrentbtn = $('Show only current URL ')
+ .appendTo(this.$actions)
+ .on('click', function() {
+ self.$table.empty();
+ self.find({uri: window.location.pathname}, 0, self.handleFind.bind(self));
+ });
+
+ this.$showallbtn = $('Show all ')
+ .appendTo(this.$actions)
+ .on('click', function() {
+ self.refresh();
+ });
+
+ this.$clearbtn = $('Delete all ')
+ .appendTo(this.$actions)
+ .on('click', function() {
+ self.clear(function() {
+ self.hide();
+ });
+ });
+
+ this.addSearch();
+
+ this.$overlay = $('
').addClass(csscls('overlay')).hide().appendTo('body');
+ this.$overlay.on('click', function() {
+ self.hide();
+ });
+ },
+
+ refresh: function() {
+ this.$table.empty();
+ this.$loadmorebtn.show();
+ this.find({}, 0, this.handleFind.bind(this));
+ },
+
+ addSearch: function(){
+ var self = this;
+ var searchBtn = $(' ')
+ .text('Search')
+ .on('click', function(e) {
+ self.$table.empty();
+ var search = {};
+ var a = $(this).parent().serializeArray();
+ $.each(a, function() {
+ if(this.value){
+ search[this.name] = this.value;
+ }
+ });
+
+ self.find(search, 0, self.handleFind.bind(self));
+ e.preventDefault();
+ });
+
+ $('')
+ .append('Filter results ')
+ .append('Method: GET POST PUT DELETE ')
+ .append('Uri: ')
+ .append('IP: ')
+ .append(searchBtn)
+ .appendTo(this.$actions);
+ },
+
+ handleFind: function(data) {
+ var self = this;
+ $.each(data, function(i, meta) {
+ var a = $(' ')
+ .text('Load dataset')
+ .on('click', function(e) {
+ self.hide();
+ self.load(meta['id'], function(data) {
+ self.callback(meta['id'], data);
+ });
+ e.preventDefault();
+ });
+
+ var method = $(' ')
+ .text(meta['method'])
+ .on('click', function(e) {
+ self.$table.empty();
+ self.find({method: meta['method']}, 0, self.handleFind.bind(self));
+ e.preventDefault();
+ });
+
+ var uri = $(' ')
+ .text(meta['uri'])
+ .on('click', function(e) {
+ self.$table.empty();
+ self.find({uri: meta['uri']}, 0, self.handleFind.bind(self));
+ e.preventDefault();
+ });
+
+ var ip = $(' ')
+ .text(meta['ip'])
+ .on('click', function(e) {
+ self.$table.empty();
+ self.find({ip: meta['ip']}, 0, self.handleFind.bind(self));
+ e.preventDefault();
+ });
+
+ $(' ')
+ .append($(' ').append(a))
+ .append($(' ').append(method))
+ .append($(' ').append(uri))
+ .append('' + meta['datetime'] + ' ')
+ .append($(' ').append(ip))
+ .appendTo(self.$table);
+ });
+ if (data.length < this.get('items_per_page')) {
+ this.$loadmorebtn.hide();
+ }
+ },
+
+ show: function(callback) {
+ this.callback = callback;
+ this.$el.show();
+ this.$overlay.show();
+ this.refresh();
+ },
+
+ hide: function() {
+ this.$el.hide();
+ this.$overlay.hide();
+ },
+
+ find: function(filters, offset, callback) {
+ var data = $.extend({}, filters, {max: this.get('items_per_page'), offset: offset || 0});
+ this.last_find_request = data;
+ this.ajax(data, callback);
+ },
+
+ load: function(id, callback) {
+ this.ajax({op: "get", id: id}, callback);
+ },
+
+ clear: function(callback) {
+ this.ajax({op: "clear"}, callback);
+ },
+
+ ajax: function(data, callback) {
+ $.ajax({
+ dataType: 'json',
+ url: this.get('url'),
+ data: data,
+ success: callback,
+ ignoreDebugBarAjaxHandler: true
+ });
+ }
+
+ });
+
+})(PhpDebugBar.$);
diff --git a/public/packages/maximebf/php-debugbar/php-icon.png b/public/packages/maximebf/php-debugbar/php-icon.png
new file mode 100644
index 0000000..2cb46bf
Binary files /dev/null and b/public/packages/maximebf/php-debugbar/php-icon.png differ
diff --git a/public/packages/maximebf/php-debugbar/vendor/font-awesome/css/font-awesome.min.css b/public/packages/maximebf/php-debugbar/vendor/font-awesome/css/font-awesome.min.css
new file mode 100644
index 0000000..449d6ac
--- /dev/null
+++ b/public/packages/maximebf/php-debugbar/vendor/font-awesome/css/font-awesome.min.css
@@ -0,0 +1,4 @@
+/*!
+ * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.0.3');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.0.3') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.0.3') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.0.3') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.0.3#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.3333333333333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.2857142857142858em;text-align:center}.fa-ul{padding-left:0;margin-left:2.142857142857143em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.142857142857143em;width:2.142857142857143em;top:.14285714285714285em;text-align:center}.fa-li.fa-lg{left:-1.8571428571428572em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)}100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0,mirror=1);-webkit-transform:scale(-1,1);-moz-transform:scale(-1,1);-ms-transform:scale(-1,1);-o-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2,mirror=1);-webkit-transform:scale(1,-1);-moz-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-asc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-desc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-reply-all:before{content:"\f122"}.fa-mail-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}
\ No newline at end of file
diff --git a/public/packages/maximebf/php-debugbar/vendor/font-awesome/fonts/FontAwesome.otf b/public/packages/maximebf/php-debugbar/vendor/font-awesome/fonts/FontAwesome.otf
new file mode 100644
index 0000000..8b0f54e
Binary files /dev/null and b/public/packages/maximebf/php-debugbar/vendor/font-awesome/fonts/FontAwesome.otf differ
diff --git a/public/packages/maximebf/php-debugbar/vendor/font-awesome/fonts/fontawesome-webfont.eot b/public/packages/maximebf/php-debugbar/vendor/font-awesome/fonts/fontawesome-webfont.eot
new file mode 100644
index 0000000..7c79c6a
Binary files /dev/null and b/public/packages/maximebf/php-debugbar/vendor/font-awesome/fonts/fontawesome-webfont.eot differ
diff --git a/public/packages/maximebf/php-debugbar/vendor/font-awesome/fonts/fontawesome-webfont.svg b/public/packages/maximebf/php-debugbar/vendor/font-awesome/fonts/fontawesome-webfont.svg
new file mode 100644
index 0000000..45fdf33
--- /dev/null
+++ b/public/packages/maximebf/php-debugbar/vendor/font-awesome/fonts/fontawesome-webfont.svg
@@ -0,0 +1,414 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/packages/maximebf/php-debugbar/vendor/font-awesome/fonts/fontawesome-webfont.ttf b/public/packages/maximebf/php-debugbar/vendor/font-awesome/fonts/fontawesome-webfont.ttf
new file mode 100644
index 0000000..e89738d
Binary files /dev/null and b/public/packages/maximebf/php-debugbar/vendor/font-awesome/fonts/fontawesome-webfont.ttf differ
diff --git a/public/packages/maximebf/php-debugbar/vendor/font-awesome/fonts/fontawesome-webfont.woff b/public/packages/maximebf/php-debugbar/vendor/font-awesome/fonts/fontawesome-webfont.woff
new file mode 100644
index 0000000..8c1748a
Binary files /dev/null and b/public/packages/maximebf/php-debugbar/vendor/font-awesome/fonts/fontawesome-webfont.woff differ
diff --git a/public/packages/maximebf/php-debugbar/vendor/highlightjs/highlight.pack.js b/public/packages/maximebf/php-debugbar/vendor/highlightjs/highlight.pack.js
new file mode 100644
index 0000000..cf7215a
--- /dev/null
+++ b/public/packages/maximebf/php-debugbar/vendor/highlightjs/highlight.pack.js
@@ -0,0 +1 @@
+var hljs=new function(){function k(v){return v.replace(/&/gm,"&").replace(//gm,">")}function t(v){return v.nodeName.toLowerCase()}function i(w,x){var v=w&&w.exec(x);return v&&v.index==0}function d(v){return Array.prototype.map.call(v.childNodes,function(w){if(w.nodeType==3){return b.useBR?w.nodeValue.replace(/\n/g,""):w.nodeValue}if(t(w)=="br"){return"\n"}return d(w)}).join("")}function r(w){var v=(w.className+" "+(w.parentNode?w.parentNode.className:"")).split(/\s+/);v=v.map(function(x){return x.replace(/^language-/,"")});return v.filter(function(x){return j(x)||x=="no-highlight"})[0]}function o(x,y){var v={};for(var w in x){v[w]=x[w]}if(y){for(var w in y){v[w]=y[w]}}return v}function u(x){var v=[];(function w(y,z){for(var A=y.firstChild;A;A=A.nextSibling){if(A.nodeType==3){z+=A.nodeValue.length}else{if(t(A)=="br"){z+=1}else{if(A.nodeType==1){v.push({event:"start",offset:z,node:A});z=w(A,z);v.push({event:"stop",offset:z,node:A})}}}}return z})(x,0);return v}function q(w,y,C){var x=0;var F="";var z=[];function B(){if(!w.length||!y.length){return w.length?w:y}if(w[0].offset!=y[0].offset){return(w[0].offset"}function E(G){F+=""+t(G)+">"}function v(G){(G.event=="start"?A:E)(G.node)}while(w.length||y.length){var D=B();F+=k(C.substr(x,D[0].offset-x));x=D[0].offset;if(D==w){z.reverse().forEach(E);do{v(D.splice(0,1)[0]);D=B()}while(D==w&&D.length&&D[0].offset==x);z.reverse().forEach(A)}else{if(D[0].event=="start"){z.push(D[0].node)}else{z.pop()}v(D.splice(0,1)[0])}}return F+k(C.substr(x))}function m(y){function v(z){return(z&&z.source)||z}function w(A,z){return RegExp(v(A),"m"+(y.cI?"i":"")+(z?"g":""))}function x(D,C){if(D.compiled){return}D.compiled=true;D.k=D.k||D.bK;if(D.k){var z={};function E(G,F){if(y.cI){F=F.toLowerCase()}F.split(" ").forEach(function(H){var I=H.split("|");z[I[0]]=[G,I[1]?Number(I[1]):1]})}if(typeof D.k=="string"){E("keyword",D.k)}else{Object.keys(D.k).forEach(function(F){E(F,D.k[F])})}D.k=z}D.lR=w(D.l||/\b[A-Za-z0-9_]+\b/,true);if(C){if(D.bK){D.b=D.bK.split(" ").join("|")}if(!D.b){D.b=/\B|\b/}D.bR=w(D.b);if(!D.e&&!D.eW){D.e=/\B|\b/}if(D.e){D.eR=w(D.e)}D.tE=v(D.e)||"";if(D.eW&&C.tE){D.tE+=(D.e?"|":"")+C.tE}}if(D.i){D.iR=w(D.i)}if(D.r===undefined){D.r=1}if(!D.c){D.c=[]}var B=[];D.c.forEach(function(F){if(F.v){F.v.forEach(function(G){B.push(o(F,G))})}else{B.push(F=="self"?D:F)}});D.c=B;D.c.forEach(function(F){x(F,D)});if(D.starts){x(D.starts,C)}var A=D.c.map(function(F){return F.bK?"\\.?\\b("+F.b+")\\b\\.?":F.b}).concat([D.tE]).concat([D.i]).map(v).filter(Boolean);D.t=A.length?w(A.join("|"),true):{exec:function(F){return null}};D.continuation={}}x(y)}function c(S,L,J,R){function v(U,V){for(var T=0;T";U+=Z+'">';return U+X+Y}function N(){var U=k(C);if(!I.k){return U}var T="";var X=0;I.lR.lastIndex=0;var V=I.lR.exec(U);while(V){T+=U.substr(X,V.index-X);var W=E(I,V);if(W){H+=W[1];T+=w(W[0],V[0])}else{T+=V[0]}X=I.lR.lastIndex;V=I.lR.exec(U)}return T+U.substr(X)}function F(){if(I.sL&&!f[I.sL]){return k(C)}var T=I.sL?c(I.sL,C,true,I.continuation.top):g(C);if(I.r>0){H+=T.r}if(I.subLanguageMode=="continuous"){I.continuation.top=T.top}return w(T.language,T.value,false,true)}function Q(){return I.sL!==undefined?F():N()}function P(V,U){var T=V.cN?w(V.cN,"",true):"";if(V.rB){D+=T;C=""}else{if(V.eB){D+=k(U)+T;C=""}else{D+=T;C=U}}I=Object.create(V,{parent:{value:I}})}function G(T,X){C+=T;if(X===undefined){D+=Q();return 0}var V=v(X,I);if(V){D+=Q();P(V,X);return V.rB?0:X.length}var W=z(I,X);if(W){var U=I;if(!(U.rE||U.eE)){C+=X}D+=Q();do{if(I.cN){D+=""}H+=I.r;I=I.parent}while(I!=W.parent);if(U.eE){D+=k(X)}C="";if(W.starts){P(W.starts,"")}return U.rE?0:X.length}if(A(X,I)){throw new Error('Illegal lexeme "'+X+'" for mode "'+(I.cN||"")+'"')}C+=X;return X.length||1}var M=j(S);if(!M){throw new Error('Unknown language: "'+S+'"')}m(M);var I=R||M;var D="";for(var K=I;K!=M;K=K.parent){if(K.cN){D=w(K.cN,D,true)}}var C="";var H=0;try{var B,y,x=0;while(true){I.t.lastIndex=x;B=I.t.exec(L);if(!B){break}y=G(L.substr(x,B.index-x),B[0]);x=B.index+y}G(L.substr(x));for(var K=I;K.parent;K=K.parent){if(K.cN){D+=""}}return{r:H,value:D,language:S,top:I}}catch(O){if(O.message.indexOf("Illegal")!=-1){return{r:0,value:k(L)}}else{throw O}}}function g(y,x){x=x||b.languages||Object.keys(f);var v={r:0,value:k(y)};var w=v;x.forEach(function(z){if(!j(z)){return}var A=c(z,y,false);A.language=z;if(A.r>w.r){w=A}if(A.r>v.r){w=v;v=A}});if(w.language){v.second_best=w}return v}function h(v){if(b.tabReplace){v=v.replace(/^((<[^>]+>|\t)+)/gm,function(w,z,y,x){return z.replace(/\t/g,b.tabReplace)})}if(b.useBR){v=v.replace(/\n/g," ")}return v}function p(z){var y=d(z);var A=r(z);if(A=="no-highlight"){return}var v=A?c(A,y,true):g(y);var w=u(z);if(w.length){var x=document.createElementNS("http://www.w3.org/1999/xhtml","pre");x.innerHTML=v.value;v.value=q(w,u(x),y)}v.value=h(v.value);z.innerHTML=v.value;z.className+=" hljs "+(!A&&v.language||"");z.result={language:v.language,re:v.r};if(v.second_best){z.second_best={language:v.second_best.language,re:v.second_best.r}}}var b={classPrefix:"hljs-",tabReplace:null,useBR:false,languages:undefined};function s(v){b=o(b,v)}function l(){if(l.called){return}l.called=true;var v=document.querySelectorAll("pre code");Array.prototype.forEach.call(v,p)}function a(){addEventListener("DOMContentLoaded",l,false);addEventListener("load",l,false)}var f={};var n={};function e(v,x){var w=f[v]=x(this);if(w.aliases){w.aliases.forEach(function(y){n[y]=v})}}function j(v){return f[v]||f[n[v]]}this.highlight=c;this.highlightAuto=g;this.fixMarkup=h;this.highlightBlock=p;this.configure=s;this.initHighlighting=l;this.initHighlightingOnLoad=a;this.registerLanguage=e;this.getLanguage=j;this.inherit=o;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\[\\s\\S]",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE]};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE]};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.REGEXP_MODE={cN:"regexp",b:/\//,e:/\/[gim]*/,i:/\n/,c:[this.BE,{b:/\[/,e:/\]/,r:0,c:[this.BE]}]};this.TM={cN:"title",b:this.IR,r:0};this.UTM={cN:"title",b:this.UIR,r:0}}();hljs.registerLanguage("scilab",function(a){var b=[a.CNM,{cN:"string",b:"'|\"",e:"'|\"",c:[a.BE,{b:"''"}]}];return{k:{keyword:"abort break case clear catch continue do elseif else endfunction end for functionglobal if pause return resume select try then while%f %F %t %T %pi %eps %inf %nan %e %i %z %s",built_in:"abs and acos asin atan ceil cd chdir clearglobal cosh cos cumprod deff disp errorexec execstr exists exp eye gettext floor fprintf fread fsolve imag isdef isemptyisinfisnan isvector lasterror length load linspace list listfiles log10 log2 logmax min msprintf mclose mopen ones or pathconvert poly printf prod pwd rand realround sinh sin size gsort sprintf sqrt strcat strcmps tring sum system tanh tantype typename warning zeros matrix"},i:'("|#|/\\*|\\s+/\\w+)',c:[{cN:"function",bK:"function endfunction",e:"$",k:"function endfunction|10",c:[a.UTM,{cN:"params",b:"\\(",e:"\\)"},],},{cN:"transposed_variable",b:"[a-zA-Z_][a-zA-Z_0-9]*('+[\\.']*|[\\.']+)",e:"",r:0},{cN:"matrix",b:"\\[",e:"\\]'*[\\.']*",r:0,c:b},{cN:"comment",b:"//",e:"$"}].concat(b)}});hljs.registerLanguage("xml",function(a){var c="[A-Za-z0-9\\._:-]+";var d={b:/<\?(php)?(?!\w)/,e:/\?>/,sL:"php",subLanguageMode:"continuous"};var b={eW:true,i:/,r:0,c:[d,{cN:"attribute",b:c,r:0},{b:"=",r:0,c:[{cN:"value",v:[{b:/"/,e:/"/},{b:/'/,e:/'/},{b:/[^\s\/>]+/}]}]}]};return{aliases:["html"],cI:true,c:[{cN:"doctype",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"",rE:true,sL:"css"}},{cN:"tag",b:"